Doctrine 2: Effectuer une requete SQL pure

Il est parfois nécessaire lorsque l’on utilise Doctrine 2 d’effectuer une requête SQL et non une requête DQL. Pour cela nous pouvons utiliser la méthode createNativeQuery dans laquelle nous pouvons utiliser le langage SQL.

// La requête SQL
$sql = "SELECT u.address FROM user u WHERE u.sex = 'M' ";
// Construction de l'objet ResultSetMapping
$rsm = new \Doctrine\ORM\Query\ResultSetMapping;
// On définie quel champs doit être retourné dans la réponse
$rsm->addScalarResult('address', 'address');
// On récupère les résultats
$addresss = $this->getEntityManager()
->createNativeQuery($sql, $rsm)
->getScalarResult()
;

Plus d’information sur la doc officielle: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/native-sql.html

Debian: Passage d’un système 32bits en 64bits

Je me suis récemment posé la question suivante puisque j’allais changé le processeur de mon ordinateur portable: Y a t-il des opérations a effectuer sur son système lors d’un changement d’architecture processeur. La rétrocompatibilité des processeur 64bits vers le jeux d’instructions 32bits est totale. Pas d’inquiétude a avoir de coté la donc.

Cependant pour une question d’optimisation il peut être intéressant de mettre a jour les paquets présent sur le système de façon a remplacer les paquet disponible en 64bits actuellement présent sur le système en version 32bits. Pour cela, grâce a l’incroyable puissance du gestionnaire de paquet vous pouvez effectuer cette opération en trois ligne de commande:

dpkg --get-selections > packets.txt
dpkg --set-selections < packets.txt
apt-get dselect-upgrade

Ces actions aurons pour effet de lister les paquets installés sur le système, puis de demander leur installation. Seul les paquets disponible dans une nouvelle version (comme en 64b après un changement d’architecture processeur) seront réinstallés. Pour les windowsiens qui lirais cet article: Pas de soucis de configuration liés a la réinstallation de ces paquets car seul les binaires sont affecté. Pas les fichiers de configuration.

Free the Network – Motherboard – vice

Un document fort intéressant est disponible sur le site de vice. Il y est question de la décentralisation et donc la libéralisation du réseau (entre autre internet). Je le conseille vivement a toute personne qui utilise internet (en principe si vous lisez cet article vous êtes concerné ^^). Si vous êtes étrangers au débat sachez déjà ceci: Internet est un réseau fonctionnant (non physiquement) sur des protocoles totalement libre (vous pouvez recréer un « internet » dans votre village, vallée, pays aussi et planète tant qu’a faire). Seuls les infrastructures physiques (câbles, machines qui mettes en relation les usagers) appartiennent a des structures privés. Avec de l’équipement « internet » est donc tout a fait créable a son échelle.

Je me permet une citation qui en dit long sur la question:

Si cet internet est centralisé au point que les dictateurs arabes peuvent l’éteindre avec un simple bouton et que Joe Lieberman peut appeler Amazon et Paypal pour leur dire « Arrêtez de financer Wikileaks », alors nous voulons un internet qui ne peut pas être stoppé, un internet impossible a censurer.

Réflexion qui prend son importance quand on sais qu’internet est le système de communication le plus efficace a ce jour.

Le reportage prend place durant Occupy Wall Street et suit principalement la fondation « The Free Network Fondation » qui a participé au mouvement.

Merci a korben pour l’info.

jConfirmAction: Quelques modifications

J’utilise pour un de mes projets le plugin jQuery jConfirmAction sous licence GPL version 2. J’y est effectué quelques modifications et les redistribuent donc sous cette même licence.

Le script, téléchargeable ici: jconfirmaction.jquery. Les différences avec le script de Hidayat Sagita sont les suivantes:

Exécution de fonctions

A l’origine le click sur « Oui » n’avait pour effet que de faire suivre le lien d’origine. L’ajout des trois paramètres « onYes », « onOpen » et « onClose » auxquels on transmet des fonctions nous permet de faire un peu plus de choses.

  • onYes est appelé lorsque le bouton « Oui » est cliqué.
  • onOpen est appelé lorsque la boite de confirmation apparaît.
  • onClose est appelé lorsque l’utilisateur

Ces fonctions reçoivent toujours comme argument le lien d’origine (sur lequel a été appliqué jConfirmAction).

$('a.remove').jConfirmAction({
  question : "Supprimer ?",
  yesAnswer : "Oui",
  cancelAnswer : "non",
  onYes: function(link){
    // [...]
    return false;
  },
  onOpen: function(link){
    // [...]
    return false;
  },
  onClose: function(link){
    // [...]
    return false;
  }
});

justOneAtTime

Le paramètre justOneAtTime (par défaut sur vrai) permet de détruire les autre boites de confirmations lorsqu’une s’ouvre. Cela permet donc simplement de d’en n’avoir qu’une a la fois.

Utilisation de ‘live’

J’ai préféré remplacer l’utilisation de bind par live. Décision prise par rapport a ce dont je parlais dans cet article.

Les modification apportés sont essentiellement pour rendre l’utilisation de ce plugin plus souple en particulier dans un contexte ou vous utilisez l’ajax.

Enjoy ;)

Bunker city

Un reportages diffusé sur arte récemment traite des écarts sociaux de notre société se caractérisant par des murs. Le reportage commence avec une voie off et des paroles bien tournées:

Et si demain les plus aisés d’entre nous se retranchais dans des villas, derrière des enceintes sécurisés? [...] Les murs forment un bouclier précaire face a la menace des miséreux. [...] Murs politiques, murs religieux mais surtout murs sociaux. Les murs évitent d’avoir a réparer les injustices.

Une bonne chose dans ce reportage est la vision a grande échelle du problème. On passera donc par les résidences privés de Toulouse non loin des cités. Des résidences privés et luxueuses faces aux favelas de Rio mais aussi par les murs érigés a Bagdad pour séparer et faire régner l’ordre dans des quartiers qui ont abrités de violents combats.

Le reportage est disponible en sur le site d’arte vod: http://www.artevod.com/bunker_cities

Sécurité informatique: Vous jouez peut-être un rôle

Je suis tombé tout a fait par hasard sur ce très bon article de Chris Heilmann traduit par Frédéric de Villamil a propos du rôle que nous, acteurs du web, avons a propos de la sécurité informatique. Je vous conseil vivement de le lire si il vous arrive d’administrer des système, d’écrire des logiciels web ou même d’administrer votre propre blog.

http://t37.net/la-securite-du-web-passera-t-elle-par-vous.html

Articles de la semaine

Quelques articles qui valent leurs lecture:

 

Symfony2: Testing: Le gestionnaire d’entité « perd » un objet

Lors de la rédaction de test fonctionnels sous symfony2 je suis souvent confronté a une erreur du gestionnaire d’entités. Alors que tout ce passe correctement en développement et en production, pendant le test fonctionnel je me retrouve parfois avec cette erreur:

A new entity was found through the relationship ‘Muzich\CoreBundle\Entity\Element#owner’ that was not configured to cascade persist operations for entity: bux. Explicitly persist the new entity or configure cascading persist operations on the relationship. If you cannot find out which entity causes the problem implement ‘Muzich\CoreBundle\Entity\User#__toString()’ to get a clue.

Le problème se résout en récupérant la dite entité par le biais de doctrine dans la même fonction que la ou se situe le ->persist().

if ($this->container->getParameter('env') == 'test')
{
  $user = $this->getDoctrine()->getRepository('MuzichCoreBundle:User')->findOneById(
    $this->container->get('security.context')->getToken()->getUser()->getId(),
    array()
  )->getSingleResult();
}

$em = $this->getDoctrine()->getEntityManager();
[...] // $user intervient dans une entité persistante
$em->flush();

Ici le paramètre ‘env’ est un paramètre personnalisé en fonction de l’environnement (config_dev.yml, config_test.yml …).

Symfony2 Tests fonctionnels: obtenir le token pour une requête ajax

J’ai eu énormément de mal a trouver un moyen de connaître le token CSRF de mon formulaire pour effectuer (lors de tests fonctionnels) une requête ‘ajax’.

$crawler = $this->client->request(
 'POST',
 $url,
 array(
   'element_add' => array(
      '_token' => '?????',
      'name'   => 'bla bla'
   ),
    array(),
    array('HTTP_X-Requested-With' => 'XMLHttpRequest')
  );

En effet dans ce code il nous manque le token de protection CSRF. Dans le soucis de ne pas modifier le code du logiciel pour permettre l’exécution du test j’ai cherché un moyen de connaître ce token dans mon test.

Ce ne fut pas une mince affaire. Après avoir cherché une méthode ou un moyen de récupérer ce token d’une manière prévu a cet effet, un utilisateur (Beryllium, merci encore) sur le chat de symfony (freenode, #symfony) m’a conseillé de regarder du coté du crawler.

Au bout du compte j’ai tout simplement récupérer le token .. dans la réponse de la première requête car le formulaire en question s’y trouve, et donc le token aussi.

$extract = $this->crawler->filter('input[name="element_add[_token]"]')
   ->extract(array('value'));
$csrf_token = $extract[0];