Derniers snippets latest snippets

[Symfony] Effacer partiellement le cache d'une application

Toujours utile depuis un contexte d'application différent de celui visé :

sfToolkit::clearGlob(sfConfig::get('sf_cache_dir').'/frontend/*/all/*/templates/toto.cache');
by Nicolas Perriault on 2008-05-26, tagged cache  php  symfony 

Gestion des tags en SQL

Un schema classique de gestion de tags :

CREATE TABLE Project ( 
  project_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
  name VARCHAR(50) NOT NULL, 
  url TEXT NOT NULL, 
  PRIMARY KEY (project_id) 
) ENGINE=MyISAM;
 
CREATE TABLE Tags ( 
  tag_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
  tag_text VARCHAR(50) NOT NULL, 
  PRIMARY KEY (tag_id), 
  INDEX (tag_text) 
) ENGINE=MyISAM; 
 
CREATE TABLE Tag2Project ( 
  tag INT UNSIGNED NOT NULL, 
  project INT UNSIGNED NOT NULL, 
  PRIMARY KEY (tag, project), 
  INDEX rv_primary (project, tag) 
) ENGINE=MyISAM;

Pour récupérer tous les projets taggué php ou mysql :

SELECT p.name 
FROM Project p 
  INNER JOIN Tag2Project t2p 
    ON p.project_id = t2p.project 
  INNER JOIN Tag t 
    ON t2p.tag = t.tag_id 
WHERE t.tag_text IN ('mysql', 'php');

Pour récupérer tous les projets taggué php et mysql :

SELECT p.name 
FROM Project p 
  CROSS JOIN Tag t1 
  CROSS JOIN Tag t2 
  INNER JOIN Tag2Project t2p 
    ON p.project_id = t2p.project 
      AND t2p.tag = t1.tag_id 
  INNER JOIN Tag2Project t2p2 
    ON t2p.project = t2p2.project 
      AND t2p2.tag = t2.tag_id 
WHERE t1.tag_text = "php" 
  AND t2.tag_text = "mysql";

Tiré et adapté de la présentation Join-fu de Jay Pipes

by Nicolas Perriault on 2008-05-15, tagged join  mysql  sql  tags 
(1 comment)

Cross apps url helper for symfony 1.0

Here's a helper that allow to generate cross apps urls in symfony 1.0

/**
 * Generates cross-apps urls in symfony 1.0
 *
 * @param  string  the app we want to go to
 * @param  string  the route in the app. Must be valid
 * @param  array   the arguments required by the route. Optional
 * @return string
 */
function cross_app_url($app, $route, $args = null)
{
  $host = sfContext::getInstance()->getRequest()->getHost() ;
  $env = sfConfig::get('sf_environment');
  $appRoutingFile = SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.$app.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'routing.yml' ;
  $route = substr($route, 1, strlen($route)) ;
  if (file_exists($appRoutingFile))
  {
    $yml = sfYaml::load($appRoutingFile) ;
    $routeUrl = $yml[$route]['url'] ;
    if ($args)
    {
      foreach ($args as $k => $v)
      {
        $routeUrl = str_replace(':' . $k, $v, $routeUrl) ;
      }
    }
    if (strrpos($routeUrl, '*') == strlen($routeUrl) - 1)
    {
      $routeUrl = substr($routeUrl, 0, strlen($routeUrl) - 2) ;
    }
  }
  return sprintf('http://%s/%s/%s',
                 $host,
                 ($env == 'dev' ? $app . '_dev.php' : ($app != $main_app) ? $app : ''),
                 $routeUrl);
}

Adapted from here

by Nicolas Perriault on 2008-05-15, tagged link  routing  symfony  url 
(2 comments)

Passer outre le "allow_url_fopen et allow_url_include" a Off

Qui n'a jamais eu un Warning de type : "filegetcontents() function.file-get-contents: URL file-access is disabled in the server configuration in % on line %" sur un hebergement mutualisé ?

la solution et d'utiliser lynx en ligne de commande pour attaquer une url, on utilisera la fonction exec(), exemple avec l'api GoogleMaps

<?php
 
define('GOOGLE_API_KEY', 'your_google_api_key_here');
$wsurl = 'http://maps.google.com/maps/geo?q=%s&output=csv&key=%s';
$location = 'Paris, France';
 
$data = explode(',', exec('lynx --dump \''.sprintf($wsurl, urlencode($location), GOOGLE_API_KEY).'\''));
/*** Au lieu de ***/
$data = explode(',', file_get_contents(sprintf($wsurl, urlencode($location), GOOGLE_API_KEY)));
 
 
$coord = 200 === (int)$data[0] ? array((float)$data[2], (float)$data[3]) : null;
var_dump($coord);
?>
by EL BROUDI ALI on 2008-05-13, tagged allowurlfopen  filegetcontents  googlemap  php 

Logger compatible Firebug et Opera Console

Une petite fonction qui permet de logguer dans la console de Firebug ou d'Opera, sans déclencher d'erreur si ces derniers sont indisponibles.

function log() {
  try {
    console.log.apply(console, arguments);
  } catch(e) {
    try {
      opera.postError.apply(opera, arguments);
    } catch(e) {
    }
  }
}
 
log("Voici un objet: %o", {toto: "tata", coucou: true});
by Nicolas Perriault on 2008-05-10, tagged debug  firebug  firefox  javascript  opera 

Extraire toutes les chaînes d'un fichier binaire

En fait, c'est tout bête (mais qu'est ce que ça peut être utilie !) :

$ strings /usr/bin/iconv 
Written by %s.
char
UCS-4
conversion from %s unsupported
conversion to %s unsupported
conversion from %s to %s unsupported
try '%s -l' to get the list of supported encodings
[...]
by Nicolas Perriault on 2008-04-23, tagged cli  extract  linux  string 

Convertir un timestamp unix en ligne de commande

C'est bête mais ça peut toujours servir.

$ date -r 1204748227
Wed Mar  5 12:17:07 PST 2008
by Nicolas Perriault on 2008-04-18, tagged cli  date  time 

Créer un patch SVN et l'appliquer

Pour mémoire, voici la méthode pour créer un patch depuis un dépôt subversion et l'appliquer sur un autre checkout de ce même dépôt :

$ cd /path/to/instance/1
$ svn diff /tmp/diff.patch
$ cd /path/to/instance/2
$ patch -p0 -i /tmp/diff.patch
by Nicolas Perriault on 2008-04-11, tagged cli  diff  patch  subversion  svn 

Supprimer les espaces des noms de fichier

Pour supprimer tous les espaces des noms de fichier récursivement :

$ find . -type f -regex ".*\ .*" \
       -exec bash -c 'echo "$1";mv "$1" "${1// /-}"' '{}' '{}'  \;

(via maboite.org)

by Nicolas Perriault on 2008-04-08, tagged bash  cli  find 

Déplacement récursif SVN avec xargs

Pour déplacer n fichiers php d'un dépôt subversion :

$ find . -name *.php | xargs -I % svn mv "%" trunk/

On notera qu'on peut appliquer le principe pour toute commande dont l'ordre des arguments est exotique.

by Nicolas Perriault on 2008-04-07, tagged cli  svn  xargs