Lundi 24 mai 1 24 /05 /Mai 23:06

forcément vers un nouveau blog. Mais pas que puisque le but de coolkeums est de pouvoir créer un moteur de gestion de contenu orienté recherche afin de garder la main sur mes sacro saintes informations personnelles sur internet.

Rendez vous la bas pour de nouvelles aventures geek.

Par greg - Publié dans : geekblog
Ecrire un commentaire - Voir les 1 commentaires
Mardi 15 décembre 2 15 /12 /Déc 18:27
Bonjour à toutes et tous,

Allez, je fais suite à mon précédent article pour vous révéler les quelques nouveautés qui m'occupent en cette fin d'année. Et bien voila, après 3 ans, des milliers de kilomètres, plus d'une cinquantaine de formations symfony, j'ai quitté Sensio. Il y a évidemment plein de bonnes et mauvaises motivations derrière cela, je préfère regarder vers l'avenir. L'expérience Sensio m'a associé à la fantastique aventure de symfony (hé oui, j'ai signé à la version 0.6.3) et m'a permis de rencontrer des gens extraordinaires (au sens premier du terme) qui sont encore (ou pas) chez Sensio.

Cela étant dit, je suis maintenant (presque) consultant en freelance. Comme c'est un peu moche de vous annoncer cela sur over-blog, je devrais poster bientôt un troisième article «quoi de neuf»

Pour finir, comme j'ai rendu mon portable mon insigne et mon flingue avant de partir, j'ai du investir dans une nouvelle machine. Il s'agit d'un EEE PC HA1001 de chez Asus (300€). J'ai installé une Ubuntu Netbook remix 9.10 et je dois avouer que je suis assez agréablement surpris de l'interface graphique développée par les gars de Canonical (et de cette distri en générale). Pour le coup on est très loin de Compiz que j'ai utilisé pendant 3 ans mais on utilise pas un 8.9" pareil qu'un 14". Je vais attendre un peu avant de vous faire un retour la dessus basé sur plus de pratique intensive (recompiler le noyau pour avoir le wifi a quand même été galère...)

Voila voila
Par greg
Ecrire un commentaire - Voir les 4 commentaires
Mardi 20 octobre 2 20 /10 /Oct 20:50
Well, you might want to see where it all started : here. For those who do not want to jump, here is a short story board : since symfony 1.3, it is possible to configure symfony to generate URLs for the file names in the exception screens.  I, of course, wanted to do the same thing N1ko does but in Vim and Linux.

In the settings.yml of your application, you can add the following setting for the dev environment :

file_link_format:       "vim://%f:%l"

It will make symfony's exceptions like this :


You see, firefox now displays URLs beginning with vim:// Things become more complicated when you want to configure something somewhere to launch vim when you click on this link.

The first thing is : I am (fortunately) not running MacOS with aqua, nor (sadely) KDE but GNOME ... how the hell can I tell GNOME to do this ? This is still mystery to me. I know it is probably a joke for experienced KDE guys where every ressource is available via an URL but here ... not a clue.

Second thing : firefox. I can tell firefox to launch an editor when I click on the link ! Easy task. Open the about:config in the URL bar and add the 2 following values :

network.protocol-handler.external.vim         boolean      true network.protocol

      handler.app.vim                                                 string          ~/bin/ff_vim


and create the ff_vim script to launch gvim with the according file. But we can do better ! Vim support client server mode so it is possible to open this file in a remote vim session. Usually this is the session you are currentely using to develop on your project. Let's have an example : you want to work on your project, just lunch a Vim session with the --servername option to create a server session :

vim --servername VIM

You can add an exception somewhere to make our application to fail and display the famous exception screen. Edit the ff_vim script like the following :
#!/bin/bash

args=$*;

if [ -z "${args[*]}" ];
then
  echo "no URL given"
  exit 1
fi
# strip the vim://
url=${args[*]:6};

# grab the left part of the :
file=$(echo $url | awk -F':' '{print $1}')

# there might be a servername separated with @
servername=$(echo $file | awk -F'@' '{print $2}')

# if not, the session name is VIM
servername=${servername:="VIM"}
servername="--servername $servername"

# grab the file
file=$(echo $file | awk -F'@' '{print $1}')

# grab the line number and set the option if any
line=$(echo $url | awk -F':' '{print $2}')
line=${line:+"+${line}"}

gvim $servername --remote-tab-silent $line $file

What happens here ? We do grab the file and the optional line number and session name from the URL and launch gvim with the «remote» option. This means if you have a Vim session running in a terminal it will open a new tab with the file at the given location, otherwise this will pop up a gvim window with the file at the right place.

 

Note that you can do the same thing for x-debug error messages ! This awsome trick is well explained here.

Par greg
Ecrire un commentaire - Voir les 1 commentaires
Samedi 10 octobre 6 10 /10 /Oct 11:56
Hi,

Every PHP developper who had one day to deal with a LDAP tree realized sadly there was no ready to use library to do all the dirty work. That always meant back the the PHP doc and re invent the wheel over and over again.
As it is more often people ask me about symfony and LDAP, I decided to implement an abstration layer for LDAP to make queries as simple as it is today with ORMs like Propel or Doctrine : slapOrm.

It is still in early stage of development : it can generate model class from a schema file, perform complex queries but can write to the LDAP nor generate forms from schema yet. Ultimately I wish it could handle relations between LDAP objects but I do want to develop it slowly, ensuring everthing is well designed and rock solid before moving on complex features. As I am far away from being a LDAP expert, I want this tool to be a convenient way to deal with LDAP without hassle. Every feedback will be welcome.

Installing slapOrmPlugin

Grab the archive on GitHub and extract it in you project's plugin directory. Clear the cache and here you go !

The documentation is available here
Par greg - Publié dans : symfony - Communauté : symfony
Ecrire un commentaire - Voir les 0 commentaires
Mercredi 30 septembre 3 30 /09 /Sep 12:26
Petit mot rapide pour vous dire qu'un first jeudi (donc le premier demain) est organisé à Nantes au clou qui r'ssort 5 rue st Léonard à partir de 19h. Si vous êtes dans le coin, passez donc prendre une planchette !

/function^MVj%zfj
Par greg
Ecrire un commentaire - Voir les 0 commentaires
Dimanche 27 septembre 7 27 /09 /Sep 23:00
C'est une des questions que je me pose en ce moment ... je ne vous cache pas que ce blog est au point mort avec les quelques projets qui m'occupaient. Il est donc moment de mettre un terme à cette partie de mon existence de geek pour muer en autre chose. Fin 2009, il n'y aura donc que du neuf !!

Un vrai blog ailleurs, le projet de livre Vim accessible en ligne en tant que projet colaboratif ainsi qu'en PDF. Le neuf a déjà un peu pris forme : un petit projet de couche d'abstraction LDAP qui s'appelle slapOrm (toujours à l'état expérimental pour l'instant).

Puisque ce blog n'est rien sans un petit tip vim : pour afficher l'ensemble des signatures de fonctions et attributs publics d'une classe (ou d'un fichier) avec leur numéro de ligne : «:g:public»
Par greg
Ecrire un commentaire - Voir les 0 commentaires
Vendredi 12 juin 5 12 /06 /Juin 23:45
Pour tous les symfonistes (et quelques autres), manipuler des fichiers yml d'une bonne centaine de lignes minimum est une activité normale et quotidienne, indispensable pour se mettre de bonne humeur au réveil. Pour ceux qui ne connaitraient pas le parser Yaml, il s'agit d'un animal susceptible, ne tolérant que les indentations de 2 espaces et haïssant les tabulations au point de refuser de parcourir un fichier en contenant (même une petite). Il est assez facile de configurer Vim une bonne fois pour toute afin de proposer les options suivantes :

- indentation par défaut : 2 espaces
- transforme les tabulations en 2 espaces
- affiche les caractères de fin de ligne, les tabulations et espaces entre le dernier caractère et la fin de la ligne

set tabstop=2

      set shiftwidth=2

      set expandtab

      set listchars=eol:¤,trail:-


Les listchars ne seront affichés que si vous le demandez avec un «set list» pour le désactiver : «set nolist»

Cela évite les problèmes les plus courants. Par contre, dès que vos Yml deviennent consistants, il devient délicat de repérer les niveaux d'imbrication des blocs. Il est pour cela possible de surligner la ligne et la colonne courante pendant le mode édition. Vim vous permet en effet de modifier sa conf suite à un évènement. Demandez le surlignage lors du passage en mode édition et seulement pour les fichiers Yml pour les colonnes :

" Changement de configuration lors des transitions

       " mode commande & mode insertion

       autocmd insertLeave * set nocursorline

       autocmd insertEnter * set cursorline

       autocmd insertLeave *.yml set nocursorcolumn

       autocmd insertEnter *.yml set cursorcolumn

       "  Le choix des couleurs...

       highlight CursorLine                    cterm=none ctermbg=DarkBlue

       highlight CursorColumn                  cterm=none ctermbg=DarkRed



Et voila le travail, en mode insertion, les lignes sont surlignées en bleu et dans les fichiers Yml uniquement, la colonne courante est marquée en rouge pour permettre de voir rapidement le niveau d'indentation des blocs :


Par greg - Publié dans : vim
Ecrire un commentaire - Voir les 0 commentaires
Mardi 26 mai 2 26 /05 /Mai 14:45
Bonjour à toutes et tous,

Je sors de ma grotte pour dans un premier temps parler du symfony live qui aura lieu à Paris les 11 et 12 juin prochains. Ce sera l'occasion d'écouter plein de conférences qui tourneront autour des avantages que procure le framework coté technique d'une part et des retours d'expérience de grand comptes sur le sujet. Les confs techniques seront menées par quelques brillants Sensiomen et quelques personnes (non moins brillantes) de l'AFUP, de clever age etc etc. Pour le programme, c'est par ici et les inscriptions c'est par là.

Une fois ce coup de pub passé, peut être êtes vous curieux de savoir ce qui me tient loin de mon clavier ces derniers temps ...



C'est effectivement à mi chemin entre l'apprentissage du russe et l'histoire de la conquête spatiale : l'électronique des tubes. Le fer à souder à pris la place de la souris (quoique la souris avec Vim... ) enfin bref ... ça reviendra.

Dernier point pour ceux qui savent qu'il ne peut y avoir de post sur ce blog sans un Tips Vim, le bouquin sur Vim a dépassé ses 35 pages et j'envisage de le libérer sous une forme LaTeX ou Wiki pour le rendre participatif mais un gros travail de remaniement reste à faire...

Ah ... le Tips Vim : dans une fonction et/ou méthode, le curser sur une variable : «gd» vous permettra d'atteindre la définition de cette variable (ie première affectation ou déclaration) ... gd pour Goto Definition évidemment.

Par greg
Ecrire un commentaire - Voir les 2 commentaires
Jeudi 15 janvier 4 15 /01 /Jan 23:00
Bonsoir à tous,

D'abord la basherie

entre deux articles sur Doctrine, je profite de quelques minutes de répis pour vous soumettre (enfin) la basherie dont je me sers depuis quelques semaines maintenant : la récupération des arguments de la ligne de commande précédente.

Vous pouvez récupérer de façon simple à l'aide de l'opérateur !:n (ou n est un entier) le nième argument de la ligne de commande précédente. C'est très pratique car d'une commande à l'autre on se sert souvent deux fois de mêmes arguments, typiquement, bouger un fichier et faire un lien symbolique dessus :
shell$ mv frontend.php frontend_prod.php
shell$ ln -s frontend_dev.php !:1
ln -s frontend_dev.php frontend.php

Le shell est en plus assez sympa pour vous afficher l'expansion réalisée sous votre commande, on ne pourra pas dire que bash n'est pas user-friendly sur le coup.

Puis les bouts de Vim

Deux nouvelles choses sont venues agrémenter ma vie de Vimiste ces derniers mois. La première et pas des moindres dans mon travail de symfoniste est l'utilisation des marqueurs majuscules. Les marqueurs majuscules fonctionnent exactements comme leurs homonymes minuscules à part qu'ils ont la particularité d'être persistants et multi-fichiers ... je m'explique : une fois placés, à l'aide d'un «mX» ou X est le marqueur, les marqueurs suivants par exemple dans un projet symfony :

marqueur pseudo fichier
S Schéma /config/schema.yml
F Fixtures /data/fixtures/fixtures.yml
A Action /apps/appli_courante/modules/module_courant/actions/actions.class.php
R Routing /apps/appli_courante/config/routing.yml

Etc etc ... Cela veut dire que si je veux jeter un coup d'oeil ou modifier le routing, un coup de «'R» voila le fichier chargé dans mon éditeur. Imbattable et cela ne pose aucun problème avec l'utilisation de Project.

 Les admins système préfèreront sans doute mettre des marqueurs sur les fichiers de conf d'Apache ou Postgresql en choisissant judicieusement les marqueurs A et P par exemple ... Comme ces marqueurs sont persistants il est inutile de les remettre à chaque fois que vous lancez Vim.

Deuxième petite chose intéressante : la navigation entre les onglets grâce à «gt» et «gT» (Go Tab) qui facilite quand même grandement la vie.

@bientôt.
Par greg - Publié dans : vim
Ecrire un commentaire - Voir les 3 commentaires
Jeudi 8 janvier 4 08 /01 /Jan 20:02
Hello, this is time for the second article on Doctrine with symfony about inheritance this time. As I am used to Postgresql's inheritance mechanism, I was curious as Doctrine proposes 3 ways to create inheritance with your objects model :
  • simple inheritance
  • concrete inheritance
  • column aggregation inheritance
Let's (again) take an example: we want to create an application for a show that rents bikes, motorcycles and maybe more. We can say, our shop rents vehicules. All of the vehicules can be one of bike, motorcycle, car or whatever. We can easily understand a car is different from a bike and they do not have the same caracteristics.

The first step is to create 2 tables, one vehicle and one bicycle table:
config/doctrine/schema.yml:
Vehicle:
tableName: vehicle
actAs: [Timestampable]
columns:
ref: { type: char(6), primary: true }
brand: { type: varchar(255), notnull: true }
Bicycle:
inheritance: { type: simple, extends: Vehicle }
columns:
bike_type: { type: enum, values: [city, mountain, race], default: city, notnull: true }
gears: { type: integer(32), default: 1, notnull: true }
seats: { type: integer(4), default: 1, notnull: true }
checks:
gears_min: gears > 0
seats_min: seats >


We see here, we have defined a simple inheritance. So what did Doctrine ?
data/sql/schema.sql:
CREATE TABLE vehicle (
ref CHAR(6),
brand VARCHAR(255) NOT NULL,
bike_type VARCHAR(255) DEFAULT 'city' NOT NULL,
gears BIGINT DEFAULT 1 NOT NULL,
seats INT DEFAULT 1 NOT NULL,
created_at TIMESTAMP without time zone,
updated_at TIMESTAMP without time zone,
PRIMARY KEY(ref)
);
(Our check statements do no appear) It sounds rather limited but let's see what we can do with that, assuming we add 2 bikes in the database using fixtures:
./symfony doctrine:dql "SELECT * FROM Bicycle"
>> doctrine executing dql query
DQL: SELECT * FROM Bicycle
found 2 results
-
ref: BK0478
brand: peugeot
bike_type: city
gears: '4'
seats: 1
created_at: '2009-01-04 17:18:25'
updated_at: '2009-01-04 17:18:25'
-
ref: BK0734
brand: raleigh
bike_type: mountain
gears: '21'
seats: 1
created_at: '2009-01-04 17:18:25'
updated_at: '2009-01-04 17:18:25

This isn't really an inheritance mechanism because the children doesn't inherit from its parent. It is more like the parent get richer with every child classes. This may work with very simple cases because in this application, the motorcycle may have columns with «not null» attributes that bikes will never comply with. This isn't really what we are looking for.

Let's change our schema to use the concrete inhéritance :
config/doctrine/schema.yml:
Bicycle:
inheritance: { type: concrete, extends: Vehicle }
Launche the build-all-reload and see what we have:
data/sql/schema.sql:
CREATE TABLE vehicle (
ref CHAR(6),
brand VARCHAR(255) NOT NULL,
created_at TIMESTAMP without time zone,
updated_at TIMESTAMP without time zone,
PRIMARY KEY(ref)
);

CREATE TABLE bicycle (
ref CHAR(6),
brand VARCHAR(255) NOT NULL,
bike_type VARCHAR(255) DEFAULT 'city' NOT NULL,
gears BIGINT DEFAULT 1 NOT NULL,
seats INT DEFAULT 1 NOT NULL,
created_at TIMESTAMP without time zone,
updated_at TIMESTAMP without time zone,
PRIMARY KEY(ref),
CHECK (gears > 0),
CHECK (seats > 0)
);

It sounds like Doctrine has created two tables and wants to handle the inheritance by itself. Let's see what we have once the fixtures are loaded:
In our database:
dbtest=> \d
List of relations
Schema | Name | Type | Owner
--------+---------+-------+-------
public | bicycle | table | toto
public | vehicle | table | toto
(2 rows)

dbtest=> SELECT * FROM vehicle ;
ref | brand | created_at | updated_at
-----+-------+------------+------------
(0 rows)



dbtest=> SELECT * FROM bicycle ;
ref | brand | bike_type | gears | seats | created_at | updated_at
--------+---------+-----------+-------+-------+---------------------+---------------------
BK0478 | peugeot | city | 4 | 1 | 2009-01-04 17:25:26 | 2009-01-04 17:25:26
BK0734 | raleigh | mountain | 21 | 1 | 2009-01-04 17:25:26 | 2009-01-04 17:25:26
(2 rows)



We can see we have 2 bikes but it also appears we have no vehicules ! So Doctrine does not handle the inheritance by itself, if we want to have 2 bikes and also say we have 2 vehicles we have to overload the Bicycle definition. The other solution is to declare the Vehicle as an abstract class:
config/doctrine/schema.yml:
Vehicle:
tableName: vehicle
abstract: true

But this seems not to work (or I missunderstood the doc) because the table definition is still present in the SQL...

Anyway, I am now able to create a motorbike table adding the following to
config/doctrine/schema.yml:
Motorcycle:
inheritance: { type: concrete, extends: Vehicle }
columns:
type: { type: enum, values: [scooter, roadster, city], notnull: true, default: scooter }
cylinder: { type: integer, notnull: true }
plate: { type: string(11), notnull: true, unique: true }
checks:
cylinder_min: cylinder > 0
plate_format: plate ~ \'[0-9]{1,4}\\-[A-Z]{2,3}\\-[0-9]{1,2}\

So after adding some fixtures I have 2 tables with independant data:
dbtest=> SELECT * FROM motorcycle ;
ref | brand | type | cylinder | plate | created_at | updated_at
--------+--------+---------+----------+------------+---------------------+---------------------
MB1837 | vespa | scooter | 125 | 324-MA-92 | 2009-01-08 19:37:10 | 2009-01-08 19:37:10
MB6430 | yamaha | city | 750 | 2301-ZC-60 | 2009-01-08 19:37:10 | 2009-01-08 19:37:10
(2 rows)



dbtest=> SELECT * FROM bicycle ;

ref | brand | bike_type | gears | seats | created_at | updated_at
--------+---------+-----------+-------+-------+---------------------+---------------------
BK0478 | peugeot | city | 4 | 1 | 2009-01-08 19:37:10 | 2009-01-08 19:37:10
BK0734 | raleigh | mountain | 21 | 1 | 2009-01-08 19:37:10 | 2009-01-08 19:37:10
(2 rows)



dbtest=> SELECT * FROM vehicle ;
ref | brand | created_at | updated_at
-----+-------+------------+------------
(0 rows)



If I try to count the vehicles I have with a DQL query it would not be as simple as:
test$ ./symfony doctrine:dql "SELECT * FROM Vehicle"
>> doctrine executing dql query
DQL: SELECT * FROM Vehicle
>> doctrine no results found

Let's then try the last type of inheritance: the columns aggregation.

Bicycle:
inheritance: { type: column_aggregation, extends: Vehicle, keyField: type, keyValue: bicycle }
For the bicycles and
Motorcycle:
inheritance: { type: column_aggregation, extends: Vehicle, keyField: type, keyValue: motorbike }
for the motorbikes.

Then doctrine complains it cannot load the data because constraints. If I go and have a check at the database I see there is only one table with all the columns but with an extra column named type and none of my sql constraints:
dbtest=> SELECT * FROM vehicle ;
ref | brand | type | bike_type | gears | seats | cylinder | plate | created_at | updated_at
-----+-------+------+-----------+-------+-------+----------+-------+------------+------------
(0 rows)
At the end of this testing phase I am a bit confused about what these types of inheritance stand for. I am not sure I will ever use one of those. I was expecting Doctrine to have like a PHP implementation of what Postgresql's inheritance system is without the problems it has ... or maybe I am missing something :o)

Par greg - Publié dans : symfony
Ecrire un commentaire - Voir les 5 commentaires
 
Créer un blog gratuit sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus - Articles les plus commentés