Du nouveau sur geoquity

Je vous ai déjà parlé de mon projet personnel geoquity. Je viens d’ajouter un petit « mashup » qui utilise Google Maps API, et tout un tas d’API geolocalisé:

  • wikipedia (via geonames.org)
  • twitter
  • facebook
  • flickr
  • google places
  • yelp
    • plus compliqué à appeler, mais facile une fois qu’on trouve les exemples de yelp sur github
  • youtube
  • lastfm

J’ai aussi utilisé pour récupérer certaines statistiques sur Google Analytics la librairie ga:pi, que j’affiche sur cette page en utilisant le bundle SaadTaziGChartBundle.

Toujours du Symfony2 (parfait), du backbone (parfait aussi).

Je sais, la carte est trop chargée, trop d’icones… C’est un peu « brut » encore…

Des questions, remarques, commentaires? N’hésitez pas à poster un commentaire.

23. octobre 2011 par Saad Tazi
Catégories: Projet, Symfony | Laisser un commentaire

Projet: SaadTaziOEmbedBundle

J’ai rendu disponible sur github le bundle SaadTaziOEmbedBundle pour Symfony2 qui permet de récupérer des données oembed, pour aller chercher des informations sur des images, vidéos… lorsque celles-ci sont diffusées par un fournisseur (provider) qui met à disposition les données oembed, comme youtube.com, vimeo.com, flickr.com (la longue liste des fournisseurs est disponible ici)…

Une utilisation possible: aller chercher le thumbnail de vidéos youtube ou vimeo (sans avoir à utiliser les différentes apis des différents fournisseurs…)

Pour en savoir plus sur oembed, lisez la spécification ici.

J’ai en fait créé une librairie simple-oembed qui est indépendante de Symfony2 (php 5.3+ et curl nécessaires). Le bundle ne fait qu’exposer le service oembed grâce au DIC de Symfony2. Vous pouvez bien entendu utiliser cette librairie sans utiliser le bundle.

La documentation est dans le README github. Si vous avez des questions/bugs/commentaires, n’hésitez pas (via ce blog ou github).

En espérant que cela serve à quelqu’un…

05. octobre 2011 par Saad Tazi
Catégories: Projet, Symfony | Tags: bundle, oembed, symfony2 | Laisser un commentaire

Projet: Geoquity

Je viens de lancer un nouveau projet personnel, geoquity, qui utilise différentes méthodes de géolocalisation, et les compare (bientôt).
Ce projet est dans la lignée d’un autre projet que j’avais lancé il y a 2 ans et demi geo.fruitsoftware.com/. Mais chaque utilisateur est invité à soumettre les données récupérées par les différentes méthodes de géolocalisations, afin de pouvoir comparer les résultats (js geolocation api est super performant pour moi, et pour vous?…).
Toutes les statistiques collectées restent anonymes bien sûr!

Ça a été pour moi l’occasion d’essayer Symfony 2 et de tester plus en détail backbone. Voici un résumé de mon expérience:

Symfony

J’ai beaucoup aimé l’expérience. Le framework nous force à être organisé, et de plus facilement faire des bundles réutilisables.

Assetic a été très facile d’utilisation: j’ai mis en place les filtres lesscss et yui compressors très rapidement, mais j’ai perdu un peu de temps sur le serveur de production, car j’avais oublié d’exécuter:

php  app/console assetic:dump --env=prod

Au niveau de Doctrine (ORM), là aussi, assez simple et facile à mettre en place.

Par contre, du côté des formulaires, j’ai eu un peu plus de difficulté pour sauvegarder des entités avec une relation one-to-many… Mais une fois fini, on se rend compte que c’était « évident », et que ‘ »il suffisait de le savoir »…

Une note par rapport aux namespaces et à l’autoloading: Attention au nom des fichiers et des classes PHP: ils doivent être identiques, et la casse doit être la même. Disons que si j’avais été plus vigilant, j’aurais sauvé une couple de minutes… J’aime mon Mac Book Pro, mais disons que si le filesystem était « case-sensitive », la vie serait plus simple…

Backbone

Là encore, assez simple d’utilisation, et ce framework nous force à séparer les choses. Mais je crois que je verrai la puissance si j’utilisais un api RESTful et les collections.

Aussi, je trouve que la séparation Model et View est moins évidente en Javscript (pour moi en tout cas). Je suis pas mal certain que je ferai les choses différemment maintenant que j’en sais un peu plus sur backbone…

Autres affaires

html5 boilerplate

(vraiment rien à dire, dans le bon sens du terme…)

the semantic grid

The semantic grid est un beau projet, qui permet d’utiliser la puissance de lesscss pour réaliser des grids très flexibles sans avoir à utiliser des classes css obscures. Ça rend le html très propre.

Ce qu’il me reste à faire (un jour…)

  • Ajouter les statistiques et les rendre publiques
  • Configurer Jenkins (je débute en configuration de jenkins…) pour rouler les tests et d’autres outils d’asurance qualité, et faire le deploiement sur mon serveur webfaction.
  • Ajouter un mashup qui collecte des données de différentes API géolocalisées (foursquare, facebook…)

03. octobre 2011 par Saad Tazi
Catégories: Projet, Symfony | Tags: assetic, backbone, doctrine, lesscss, symfony2 | Laisser un commentaire

Passage à Webfaction

Oui, je l’avoue, je suis encore sur du shared hosting… Mais je viens de passer à du shared hosting amélioré…

Cela faisait quelques temps que je voulais migrer vers un nouveau « hosting », pour pouvoir facilement expérimenter des nouvelles technologies, sans devoir me poser la question: « est-ce que mon hosting supporte ça? »

Mon soucis: je ne voulais pas faire le saut à un VPS:

  • plus cher généralement,
  • plus de soucis à installer,
  • il faut constamment mettre à jour, mais pas forcément tout…

Je me suis donc pris du hosting chez webfaction.com, et voici mon retour sur l’expérience « à date ».

Création du compte

Cela leur a pris 50 minutes pour me donner accès à mon serveur (je pense qu’on est 2 dessus… pour l’instant…). Pas pire…

Tickets

Cela leur a pris 11 minutes pour répondre et donner une solution qui fonctionnent. Bon, je l’avoue, c’est probablement une question qu’ils doivent se faire poser souvent: version php 5.3 pour une symlink app…

Version php

Bon, ils supportent mieux php 5.2 que php 5.3, mais ils supportent les 2.

En créant une app php (qui créée un répertoire dans webapps), on peut choisir quelle version de php 5.2(.11) ou php 5.3(.5). Mais les choses se corsent avec les app « symbolic links » (voir plus bas).

Update: 

  1. Les symbolic links peuvent être soient 5.2 soient 5.3, donc pas besoin modification du .htaccess.
  2. Mmm, pas de apc ou autre accélérateurs php, à moins d’installer une version apache et php custom (« coûte » de l’application memory)

Structures

Comment ça fonctionne: dans une interface d’admin web, on créée un domaine ou sous-domaine, une application (php, ruby, python…) et on créée finalement un site web qui lie un sous-domaine à une ou plusieurs apps (donc « monsite.com/ » peut rouler du php, « htpp://monsite.com/testnode » peut rouler nodejs…). Rien de neuf sous le soleil, mais facile et intuitif.

Mais comme il faut bien quelques irritants… Il faut créer une webapp dans leur panneau de contrôle pour pouvoir faire quelque chose. Donc comme la majorité des apps que j’ai sont en Symfony 1 ou 2 (mais le problème se poserait aussi pour cakePHP et Zend framework je pense), il ne faut qu’exposer un répertoire web/ (qui contient le front controller), et tout le reste du code se trouve au même niveau que web/ (app(s)/ ou lib/ ou src/…

En cherchant un peu, je trouve qu’il est possible de faire de « symbolic link » app: parfait! … mais il faut créer quand même une app (que j’ai appelé web_apps) pour déposer tout le code,  que je ne vais jamais linker à un site web pour pouvoir déposer mes apps qui ont besoin d’un répertoire web/.

Seul hic: les apps « symbolic link » ne sont possible (pour l’instant, d’après le support) qu’avec php 5.2… Le trick est d’ajouter la directive suivante dans le .htaccess (j’aime pas trop mais ça fonctionne…):

AddHandler php53-cgi .php

Pas top mais ça ne semble pas ralentir le site.

Ceci n’est plus nécessaire: 2 mode symbolic links maintenant.

Installation de node

Alors là, trop facile. 15 minutes et c’était fait… Une petite recherche sur google et … J’ai utilisé une méthode très similaire à celle décrite par Rob Flaherty sur son blog, sauf que:

  • j’ai mis les sources de node dans mon app web_apps pour la compilation
  • ce n’est qu’après que :
    • j’ai créée l’app custom (qui roule sur un port),
    • associer l’app à un site
    • et que je me suis loggé ssh créer le fichier app.js et pour l’exécuter

Avantage: les sources node ne pollue pas mon app node…

Configuration Google email (google apps)

Depuis l’interface d’admin my.webfaction.com, très facile: il suffit de créer les MX records…

Conclusion

Pour l’instant, je suis très satisfait.

J’espère juste qu’ils vont améliorer le support de php 5.3, notamment pour les « symbolic link apps ».

Autre point positif: beaucoup de documentation, même si l’ancien forum pollue parfois google…

03. juillet 2011 par Saad Tazi
Catégories: Non classé | Laisser un commentaire

GChart Bundle – un bundle Symfony pour utiliser Google Chart

Je viens de rendre disponible sur github.com GChartBundle, un bundle Symfony (Symfony2 donc…) qui « wrappe » le Google Chart Tool et quelques charts (mais surtout le QrCode) de Google Image Chart API.

Ce que j’ai appris en faisant ce bundle:

La puissance du DIC

La puissance du Dependency Injection Container… ou comment permettre à l’utilisateur de redéfinir des paramètres du Bundle, passer des services aux services que l’on créée…

La puissance des Twig Extensions

… ou comment définir ses propres fonctions Twig, qui elles-même peuvent appeler « render » sur un template.

J’ai passé un peu de temps à trouver comment faire, mais l’idée est d’utiliser la méthode initRunTime() pour garder une référence d’un Twig_Environment:

    //in Twig/TwigExtension.php
    public function initRuntime(\Twig_Environment $environment)
    {
        $this->environment = $environment;
    }

J’aurais pu aussi de la même manière utiliser un template php (en passant 2 resources dans le DIC par exemple…), mais un manque de motivation m’a gagné (je n’utilise pas les templates php de toute façon).

Cette partie (=le « rendering » d’un template dans l’extension Twig) pourrait être plus « propre aussi… Dans une version ultérieure peut-être?

Malheureusement, je n’ai pas de démo live. Mais voici tout de même un démo statique (copier coller du code html généré localement) de ce que génère l’action Demo.

En espérant que ça aide quelqu’un…

29. mai 2011 par Saad Tazi
Catégories: Projet, Symfony | Tags: bundle, chart, google, symfony, symfony2 | Laisser un commentaire

Symfony et l’AdminBundle – ça fonctionne!

« Ça ne marche pas, ça fonctionne » – JF

Excellente nouvelle, l’AdminBundle a été modifié pour fonctionner avec la version beta1 de Symfony.

Grâce à la documentation mise en ligne par Thomas Rabaix , j’ai assez facilement réussi à obtenir ça:

spacer

(oui, les datas ne sont pas très réaliste, car loadées rapidement avec DoctrineFixturesBundle)

Mon seul « soucis » a été de comprendre la configuration à insérer dans config.yml, ne sachant pas trop les préfixes « sonata » qu’il fallait garder. Donc voici ce que j’ai mis dans mon fichier:

services:
  sonata.blog.admin.post:
    class: SaadTazi\BlogBundle\Admin\PostAdmin
    tags:
      - { name: sonata.admin, manager_type: orm, group: saadtazi_blog, label: post }
    arguments: [null, SaadTazi\BlogBundle\Entity\Post, BlogBundle:PostAdmin]
  sonata.blog.admin.author:
    class: SaadTazi\BlogBundle\Admin\AuthorAdmin
    tags:
      - { name: sonata.admin, manager_type: orm, group: saadtazi_blog, label: author }
    arguments: [null, SaadTazi\BlogBundle\Entity\Author, BlogBundle:AuthorAdmin]

(oui, je sais, j’ai fait un mini système de blog, pas très original, et il existe déjà un NewsBundle… mais c’est assez simple comme objectif…)

À noter

  • La documentation: j’ai déjà donné le lien de la documentation, mais la revoici, juste au cas où vous n’avez pas compris que c’est ce qui m’a permis d’y arriver… rabaix.net/AdminBundle/html/index.html
  • La possibilité d’ajouter un enregistrement relié par une foreign key directement depuis (depuis une modal jQuery). Un exemple:

spacer

  • Par rapport à l’admin generator de symfony 1 (une ligne de commande et on avait un module), là il y a un plus de chose à faire pour le développeur: une classe Controller (super simple), une classe Admin, de la configuration dans config.yml (ou xml ou …)
  • Reste à trouver comment customiser les menus (xliff i18n?)…
  • Il m’a fallu appliquer ce patch afin de supprimer un problème de « invalid CSRF token » à chaque fois que je voulais sauvegarder quelque chose (pas encore accepté…). Donc ce n’est probablement pas super stable encore… Mais je pense que c’est une fonctionnalité essentielle pour l’adoption de Symfony par la communauté…

Merci, Merci, Merci, Merci!!!

Ça ressemble étrangement à django, vous ne trouvez pas spacer ? Bravo en tout cas en gens autours de sonata-project.

07. mai 2011 par Saad Tazi
Catégories: programmation, Symfony, tips | Tags: adminBundle | 4 commentaires

Symfony2 beta1 – Notes

Maintenant que Symfony 2 est disponible en beta 1, je n’ai pas pu résister, il fallait que je fasse quelques tests.
J’ai joué avec Doctrine2 ORM, les formulaires, les formats (_format json ou html), la gestions des erreurs (404, 500). J’ai aussi utilisé backbone.js (YESS!!! Me like!!!) et Aloha Editor, peut-être que j’En parlerai un jour…

La seule chose qui n’a pas fonctionnée (et il m’a fallu moins d’une minute pour trouver la solutions – merci Google!): la version courte du tag Twig « trans » n’est plus supportée.
Dans tous les cas, il faut garder un oeil sur la liste des updates qui brise la compatibilité: https://github.com/symfony/symfony/blob/master/UPDATE.md
Wow!

Notes intéressantes

Autoload et Bundle Registration

Plus de magie: il faut déclarer toutes les librairies que vous utiliser dans autoload.php. En espérant que la librairie que vous voulez utiliser utilise la convention PSR-0 ou PEAR (qui voudrait inclure une librairie non-PSR-0 anyway spacer ).

En fait, j’aime ça: on sait ce qui est utilisé dans le projet.

AdminBundle

Ça fait 2 fois que j’essaie d’installer ce Bundle (remplace l’admin-generator de symfony1), mais encore une fois sans succès… En espérant que maintenant que Symfony 2 est en beta, les développeurs vont updater ce Bundle (oui, je sais, j’aurais pu essayer de le fixer, au moins un peu… Pas le temps!)

Doctrine 2

Toute en douceur, même si je n’ai pas fait des choses intensives (2 tables simples simples simples…). J’ai aimé le fait que la classe du modèle soit uniquement responsable de ce qu’elle doit être responsable (au revoir active record, bonjour Data Mapper).

Par contre, les behaviours de Doctrine 2 étaient vraiment pratique. Même si il y a quelques plugins qui existent (pas eu le temps de les tester, comme ça), il va falloir attendre les traits (php 5.4?) pour avoir quelque chose de facile à utiliser. Ca va nous forcer à monter des solides hiérarchies de classes probablement (une bonne chose), ou à utiliser les events…

Ah, aussi, l’article sur les fixtures Doctrine dans le cookbook fonctionne bien. Du php pur, pas de yaml… Ok avec ça, sauf pour les gens de QA… Donc ca va être su deéveloppeur de se monter quelque chose… ou le Bundle pour les fixtures va être améliorer (mais problème de naming convention: avec les setters et getters des modèles vs les attributs  qui devraient normalement être private ou au moins protected si vous avez du « coeur », quoique le Form Component demande de suivre des « naming convention » – lorsqu’on passe un objet à un formulaire…).

Ajout par rapport à Doctrine (2011-05-07):

Après quelques tests un peu plus poussés (mais pas trop…), je me suis demandé s’il y  avait un mécanisme similaire aux classes XxxxTable.class.php de Doctrine 1.2. Et oui!! Cela existe heureusement, et cela s’appelle un Repository. Merci à Richard McIntyre pour son article. Voir aussi la documentation Doctrine officielle correspondante (un peu caché et un peu court, non?).

error template

- les templates 404 et 500 supporte les templates Twig (symfony 1 offrait la possibilité d’avoir une page 500 mais elle n’était pas prise en charge par le framework (ce qui se comprend bien… ) et peuvent hériter d’un autre template. Mais attention: trop de logique et de code peut générer une autre erreur. Et là, vous n’obtiendrai qu’une page toute blanche…

- c’est le même template (error.html.twig pour la version html) qui est utilisé pour les 404 et 500 – c’est au développeur de mettre en place une logique « switch » sur le status_code s’il veut avoir différentes pages 404 et 500. Mais peut-être qu’il y a une autre manière de gérer la page 404 dans le routing, à la Sinatra par exemple? Histoire à suivre… Update (probablement disponible en beta2): C’est maintenant possible: Il suffit d’avoir un template errorXXX.html.twig par exemple, ou XXX est le status code http (404, 500, 403…). Si ce template n’existe pas, alors error.html.twig sera utilisé.

« app.yml is gone »

Je n’ai pas trouvé de recommendation dans le « book » pour conserver les settings et paramètres d’une application, par environnement. J’imagine que « import » dans config.yml et le Yaml component permettent de faire ça très facilement.

Dans le même ordre d’idée, je n’ai pas trouvé de détails sur config.yml dans le profiler…

Conclusion

Bon, en un mot, j’ai bien hâte de l’utiliser sur un vrai projet! Je vous en reparlerai à ce moment-là… Histoire à suivre donc…

01. mai 2011 par Saad Tazi
Catégories: programmation, Symfony, tips | Laisser un commentaire

Symfony 2 et AsseticBundle – tips

Je suis vraiment impressionné par Assetic, la librairie PHP écrite par Kris Wallsmith.

Elle permet pour tout projet PHP de gérer les « assets » javascript et css, en utilisant des techniques modernes tel que: less, sass, coffeescript…

La documentation étant encore un peu sommaire, notamment pour l’Intégration avec Symfony 2, voici quelques notes afin de ne pas oublier comment faire (pour la prochaine fois hein…)

Less

Config.yml

# Assetic Configuration
assetic:
    debug:          %kernel.debug%
    use_controller: %kernel.debug%
    read_from:      %kernel.root_dir%/../web/bundles
    write_to:       %kernel.root_dir%/../web/assets
    filters:
        cssrewrite: ~
        less: ~
#...
parameters:
  assetic.node.bin: /usr/local/bin/node
  #ca m'a pris longtemps pour trouver la config
  #  pour loader les packages npm par exemple
  assetic.node.paths:
    - /usr/local/lib/node

Puis dans routing_dev.yml (nécessaire là où use_controller est true), j’ai ajouté la route:

_assetic:
    resource: .
    type: assetic

Puis il suffit d’inclure dans le template (Twig):

{% stylesheets
		filter='less'
		output='css/all.css'
		'@SaadTestBundle/Resources/public/less/main.less'
%}
<link class="{{asset_url}}" rel="stylesheet"/>
{% endstylesheets %}

Cela produira:

<link class="/app_dev.php/css/all_main1.css" rel="stylesheet"/>

24. avril 2011 par Saad Tazi
Catégories: programmation, Symfony | 6 commentaires

Node.js, express.js et autres découvertes

J’ai « commis » un mini-projet de test, afin de découvrir node.js et plus spécifiquement express (ou express.js), un mico-framework qui s’appuie sur node.js.

J’en ai profité pour jeter un coup d’oeil à mongoDB, et un ORM node.js de mongoDB qui s’appelle mongoose.

Voici le lien github.

J’aime

  • tout est évènement, rien n’est bloquant. Le language Javascript v8 est ultra-rapide, donc si on ajoute le fait que rien n’est bloquant, alors wooooww!!
  • Un seul language client-side et server-side, et des librairies qui parfois fonctionnent des 2 côtés (le même fichier!!!).

J’aime un peu moins

  • un léger bémol sur la documentation de express: la doc est là, mais j’ai du googler de nombreuses chose, ou pire, aller voir le source (non, je sais il n’y a rien de grave, au contraire…)
  • C’est une technologie (encore trop?) récente: les numéros de versions (de node.js, expess, …) évoluent rapidement, et les différents packages ne sont pas forcément compatible.
  • (lié au point précédent) Il y a des milliers de packages « qui font la même chose »: impossible de compter combien de « template engines » existent, ou de client mySQL (taper « nodejs mysql » dans google pour voir…)
  • Ça m’a fait réalisé que je ne maitrise pas toutes les subtilités du Javascript. Mais là, je ne peux blamer que moi-même.

J’aime pas

Rien, j’aime tout.

Pour conclure

J’adore! J’aime! … mais j’attends un peu encore pour l’utiliser en production. Quoique, pour utiliser les webSockets et Socket.io: trop fort!

Il est temps de se mettre sérieusement, très sérieusement au Javscript.

Très prometteur…

Update (2010-03-05)

mongodb

Attention, dans mon code, si le serveur mongodb (c’est à dire « mongob ») n’est pas démarré avant de démarrer le serveur node, aucune requête ne sera servie (loade à l’infini)… Vous êtes prévenus maintenant…

Lesscss

Pour ajouter le support de lesscss, il suffit d’ajouter la ligne suivante dans app.configure():

app.configure(function(){
    //...
    //activate less compiler
    app.use(express.compiler({ src: pub, enable: ['less'] }));
    //...
});

Ensuite, il vous suffit de mettre dans public/ vos fichiers less (exemple: main.less). Dans vos templates, il faut continuer à mettre des fichiers css (exemple: main.css), express (ou node) va les compiler automatiquement et créer une version statique css dans public/.

Par contre, il faut 2 requêtes avant que le fichier less soit compilé en css: la première retourne un 404, la 2ème est ok. Donc attention lors du développement.

27. février 2011 par Saad Tazi
Catégories: programmation | Tags: expressjs, framework, javascript, nodejs | 2 commentaires

Notes sur les frameworks Python

Il y a quelques semaines s’est tenue à Montréal un Hackathon Google, et j’ai eu envie d’explorer l’univers Python… Lire la suite →

04. février 2011 par Saad Tazi
Catégories: programmation | Tags: framework, notes, python | Laisser un commentaire

← Articles plus anciens

gipoco.com is neither affiliated with the authors of this page nor responsible for its contents. This is a safe-cache copy of the original web site.