sept 28 2009

[Symfony] Doctrine : « onDelete: SET NULL »

Catégorie(s): InformatiqueSébastien @ 20:28

Avec Symfony vous pouvez, en utilisant Doctrine, vous servir de l’option « onDelete » sur les clés étrangères (CASCADE, SET NULL, and RESTRICT). SET NULL m’a cependant posé quelques soucis en me déclenchant l’erreur suivante :

SQLSTATE[HY000]: General error: 1005 Can't create table 'sf.#sql-abc_a7' (errno: 150). Failing Query: ALTER TABLE gallery ADD FOREIGN KEY (category_id) REFERENCES gallery_category(id) ON DELETE SET NULL

Si vous aussi vous rencontrez cette erreur, nous allons voir quelques éléments à vérifier. Pour cela, on va utiliser deux tables basiques :

Category:
  - id : entier
  - nom : chaine

Gallery:
  - id : entier
  - category_id : entier
  - nom : chaine


1. Champs identiques

La première chose à vérifier est que vos deux champs soient identiques au niveau du type, de la longueur, des options, etc. Lorsque vous laissez Symfony et Doctrine s’occuper tout seuls des champs ‘ID’ (qui s’appellera toujours id), il faut que votre champs category_id soit tout simplement du type integer et pas integer(X). Le champs id sera en effet généré en tant que BIGINT(20) dans la base de données. Si vous mettez une autre longueur, ça fera planter la création de la clé étrangère.

Incorrect

Category:
  columns:
    nom: { type: string(255), notnull: true }

Gallery:
  columns:
    category_id: { type: integer(10) }
    nom: { type: string(255), notnull: true }
  relations:
    Category: { onDelete: SET NULL, local: category_id, foreign: id }


Correct

Category:
  columns:
    nom: { type: string(255), notnull: true }

Gallery:
  columns:
    category_id: { type: integer }
    nom: { type: string(255), notnull: true }
  relations:
    Category: { onDelete: SET NULL, local: category_id, foreign: id }


2. PAS de notnull true

L’autre élément à faire attention c’est à ce que votre champs local puisse être null. Cette remarque s’appliquent surtout à ceux qui passent d’un onDelete: CASCADE à un onDelete: SET NULL en ne modifiant que cette valeur. Il faut aussi penser à supprimer l’option notnull: true de votre champs local.

Incorrect

Category:
  columns:
    nom: { type: string(255), notnull: true }

Gallery:
  columns:
    category_id: { type: integer, notnull: true }
    nom: { type: string(255), notnull: true }
  relations:
    Category: { onDelete: SET NULL, local: category_id, foreign: id }


Correct

Category:
  columns:
    nom: { type: string(255), notnull: true }

Gallery:
  columns:
    category_id: { type: integer }
    nom: { type: string(255), notnull: true }
  relations:
    Category: { onDelete: SET NULL, local: category_id, foreign: id }


3. Index manquant

Si vous souhaitez faire une clé étrangère sur un champs autre que la clé primaire, comme par exemple le nom, il faut que ce champs possède un index. En théorie, il est crée automatiquement. Si ce n’est pas le cas, il suffit de le créer soit même :

Category:
  indexes:
    MonIndex:
      fields:
        nom: []
  columns:
    nom: { type: string(255), notnull: true }

Gallery:
  columns:
    category_id: { type: integer }
    category_name: { type: integer }
    nom: { type: string(255), notnull: true }
  relations:
    Category: { onDelete: SET NULL, local: category_name, foreign: name }


Conclusion

Rien qu’avec ces trois vérifications, vous devriez ne plus rencontrer d’erreur. Dans le cas contraire, allez faire un tour du coté du forum de Symfony. ;) Notez également que les vérifications 1 et 3 sont aussi utiles quand vous utilisez un onDelete: CASCADE ou RESTRICT.


sept 23 2009

[PDI] Récupérer la valeur du noeud XML que l’on parcourt

Catégorie(s): InformatiqueSébastien @ 21:42

Dans le genre Je bloque sur des trucs trop cons, voilà l’exemple du jour. Comment extraire les données du fichier XML suivant avec Pentaho Data Integration et le composant Extraction de données XML ?

<?xml version="1.0" encoding="UTF-8"?>
<response>
	<resData>
		<list>
			<name>name1</name>
			<name>name2</name>
			<name>name3</name>
			<name>name4</name>
			<name>name5</name>
			<name>name6</name>
			<name>name7</name>
			<name>name8</name>
			<name>name9</name>
			<name>name10</name>
		</list>
	</resData>
</response>

La première chose que j’ai tenté fût de parcourir le noeud /response/resData/list. Après récupération automatique des champs, je vois bien :
- Nom : name
- XPath à parcourir : name
- Elément : Node

C’est parfait ! Testons ça en prévisualisant. Le résultat est simple : une seule ligne est affichée (valeur name1). C’est pas bon.

Il faut donc parcourir /response/resData/list/name. Oui mais quand on récupère les champs, il ne nous ajoute rien. Par contre lorsque l’on prévisualise, on a bien les 10 lignes qui apparaissent mais vide. Il faut donc créer manuellement le champs nécessaire. Autant le nom c’est plutôt simple, autant le reste c’est un peu plus subtil. Dans XPath à parcourir, il suffit de mettre un « . » (point seulement) et dans Elément il faut choisir Node. Et là magie (ou pas), on a bien nos dix noms qui apparaissent.


sept 15 2009

Basse&Bouffe 2009

Catégorie(s): 3615 My Life, MusiqueSébastien @ 22:37

S’il existe un évènement que je ne veux pas rater, c’est bien le Basse&Bouffe. Le principe reste le même que celui de l’année dernière : un week-end entier dédié à la basse et à la cuisine diététique. Mais plus que ça, c’est avant tout une super occasion de retrouver des personnes que j’apprécie beaucoup et avec qui on se marre toujours autant.

D’une petite vingtaine l’année dernière, on est passé à une petite douzaine cette année. On en a profité pour perdre au passage les guitaristes et bordel, ça fait du bien. J’ai rien contre eux hein, mais pour une fois on a pas été obligé de pousser le volume comme des porcins pour s’entendre (et accessoirement, on a pu éviter Oasis). Mes oreilles apprécient. Le fait de ne pas être plus nombreux a aussi permis de pouvoir tourner et jouer un peu plus. Je trouve même que ce qu’on jouait était même largement plus construit que la dernière fois, moins chacun dans son coin en fait. Très agréable.

Au niveau du matos disponible, on avait du classique : des JP, la Warwick Corvette Proline, des F et du Markbass et du nouveau dont :
- Une Modulus Quantum 6 cordes : Superbe, manche hyper confortable et rapide, par contre son beaucoup trop moderne pour moi.
- Une Hemgé : Belle, plus que très bien finie alors qu’elle a été réalisée par Martin qui est luthier amateur et elle sonnait ! Dommage que je n’ai pas eu le temps de la tester celle là.
- Une Yamaha TRB John Patitucci qui avec ses 20mm au chevalet m’a convaincu que je ne suis définitivement plus à l’aise sur autre chose que du 18mm.
- Une F Alain Caron qui m’a permis de faire mumuse avec des piezzos. Plutôt marrant sur une fretless mais ça fait ressortir trop de sons parasites de mon jeu.
- Une Spector Euro, qui prouve que rien ne sert d’acheter du US finalement.
- Une Ibanez GW35, qui reste sans doute ma plus grosse surprise du week-end niveau basse tellement je l’ai trouvé confortable à jouer grâce à la rampe et aux repères sur la touche, sans compter le son vraiment à mon gout (ne pas craquer….).

J’ai également pu profiter des conseils de Paul pour le slap mais aussi de Will, Martin, Glen et ceux que j’oublie sur l’entretien d’une basse huilée. Car oui, pour le première fois depuis que je l’ai, la LKah Rémige vient de connaitre son premier vrai entretien à l’huile/cire Ken Smith qui va bien. Maintenant que j’ai vu comment faire, je n’ai plus peur de faire du mal à ma basse avec la laine d’acier 000.

En ce qui concerne les repas, on a eu le droit à des plats tous plus légers les uns que les autres : tourte à la tartiflette au maroilles à tomber, pâtés lorrains, ouiches lorraines, poulet à je-sais-plus-quoi, tarte au thon, ficelles picardes, tarte mimolette comté cumin, cake aux fromages, cake à la banane, etc. Le tout était accompagné de coca pour les plus sages, de rhum en provenance direct de Guyane, de Jack Daniels, du vin rouge et blanc, et de la bibine pour les autres. Note pour plus tard : ne plus attaquer au rhum dès le samedi midi et en ayant le ventre vide.

Pour conclure, je dirai simplement, et parce que c’est le plus important, que ça m’a fait super plaisir de vous revoir les gars (si vous passez par là) et je vous remercie pour cette super ambiance, ces barres de rires, ce gras, ces gaz, etc. Vivement l’année prochaine.

Pour les photos, c’est par ici : http://galeries.delistage.net/bb2009/.


sept 11 2009

Facebook Lite

Catégorie(s): On the netSébastien @ 18:27

Destinée aux pays émergents et aux petites connexions, Facebook vient de se voir offrir une version légère. Grâce à elle vous n’avez dès lors accès qu’aux status, photos et vidéos (en gros). Exit donc les fonctionnalités tellement indispensables pour certains que sont les applications et la barre moisie en bas (qui ne sont certe que masquées au final).

Bien que disponible uniquement pour les ricains et les indiens, n’importe qui peut y accéder en configurant la langue de son profil sur l’anglais US et en passant par cette URL : http://lite.facebook.com/.

Bizarre comme d’un coup le contenu est épuré et n’affiche que ce qui est « réellement » intéressant (toute proportion gardée, on parle de FB hein). ;)


sept 05 2009

Configuration de la démo de Batman Arkham Asylum

Catégorie(s): Geek ZoneSébastien @ 22:24

Dand mon article consacré au test de la démo de Batman Arkham Asylum, je me suis plains du fait qu’on ne puisse pas modifier les paramètres d’affichage. Il faut dire que normalement, dans la plus grosse majorité des jeux, ces réglages se font à tavers un menu dédié dans les options. Il semblerait que chez Eidos, on aime faire les choses différemment histoire de faire chier les gens.

C’est ainsi qu’en voulant désinstaller la démo, je suis tombé sur un raccourci « Configuration du jeu » qui ouvre une petite fenêtre dédié à cet effet. En plus des paramètres d’affichage, on a aussi le droit de régler les touches !

Batman Arkham Asylum - Config affichage Batman Arkham Asylum - Config déplacement
Batman Arkham Asylum - Config action

Alors bon, quand je règle un jeu et surtout les touches, j’aime bien pouvoir faire plusieurs essais. Là on va dire que devoir quitter le jeu pour le faire, c’est pas pratique… J’espère que ça sera disponible directement depuis le jeu dans la version finale.