Si vous comptez venir à l'édition 2012 du Forum PHP et que vous voulez le faire savoir, n’hésitez pas à utiliser le code HTML suivant :
<a href="http://afup.org/pages/forumphp2012/">
<img src="http://afup.org/templates/forumphp2012/images/bandeau-forum-php-2012-fr-small.jpg" alt="Forum PHP 2012, j'y serai !" />
</a>
Ce qui donne le résultat suivant :
Ce bandeau est aussi disponible en plus grande taille et en anglais :
Et si vous n'avez pas encore réservé vos places, foncez sur la billetterie ! Le programme est très riche, et promet un cru 2012 très intéressant.
]]>The overall conference was very well organized, in a luxurious place and with all the things a speaker or an attendee can expect from a great conference. There were about 15-20 talks in two days, and I have to say that most of them were of a very high level. I particularly enjoyed the talks of Rick Blalock, about "Controlling memory leaks", Jacob Waller about "Webifying Titanium Development" and the "Titanium Studio Deep Dive" driven by Ingo Muschenetz.
Well, it is a bit unfair to list my favorite talks, because a lot of other talks were great and would deserve a distinction. I just regret not to have been able to watch Kevin's "Write Better JavaScript" talk, but there will hopefully be a video edit soon on Codestrong's website.
I won't say much more about the event itself, except that I am really really happy to have been part of it. You can feel that there's a strong and good community behind Titanium, not only Appcelerator, and I have met a lot of interesting people. That was for sure the right way to have a first contact with the community :-)
That was the topic of my conference, and it went really well. I had time enough in the plane to build a small demo application - the source code is available on GitHub - which shows how to use joli.js and a new library that I published during the conference, joli.api.js. joli.api.js allows to transparently synchronize a local database with REST-style web services, thus helping the developer to focus on the app features and not on the synchronization, which is a technical part of the application.
I like to underline it: I did not start to code the application before the plane took off. The demo address book was built in less than four hours (hey, I also add to develop the REST web service man, and symfony's sfDoctrineRestGeneratorPlugin was really helpful!). Someone fluent with Titanium can build value-added mobile applications in a few hour, while an Objective-C or Java developer would have required days.
Basically, joli.js is to Titanium what Doctrine is to Symfony: it is an Object Relational Mapper, a tool which binds "objects" called "records" to the lines in the database, and eases their manipulation. This is a very short explanation, the complete one is available in the slides:
(Some slides are messed up on Slideshare, so if you want to download the presentation, I have put a pdf version online). Sorry, no poneys inside!
Even if the trip was almost as short as a splash-and-dash, I found some time to visit some parts of San Francisco, walking (huh, hiking even!) the streets. That was really enjoying, impressive, large, intense, noisy sometimes, and contrasted! San Francisco seems to be a very nice place to live in, from the "beach in the city" at Fisherman's Wharf or at the Embarcadero, to the wonderful city views from Telegraph or Nob Hill. I have put some pictures of my trip, for the curious ones.
]]>La première édition du PHP Tour, le nouveau cycle de conférence de l’AFUP approche à grands pas.
Pour les deux du fond qui ne suivent pas, il s’agit d’un évènement similaire au désormais traditionnel Forum PHP, mais qui a la particularité de se dérouler en région et de changer chaque année de ville. Le PHP Tour ne se substitue pas au Forum PHP, qui lui se tiendra désormais à la fin du printemps et toujours à Paris.
Si vous comptez venir à cette première édition du PHP Tour à Lille et que vous voulez le faire savoir, n’hésitez pas à utiliser le code HTML suivant :
<a href="http://afup.org/pages/phptourlille2011/">
<img src="http://afup.org/templates/phptourlille2011/images/php_tour_lille_2011_jyserai.png" alt="PHP Tour Lille 2011, j'y serai !" />
</a>
Ce qui donne le résultat suivant :
]]>La suite de l'année s'annonce aussi bien remplie que son début - et tant mieux !
]]>In lots of projects, you must build rock-solid and performant web services bound to some of your models. sfDoctrineRestGeneratorPlugin is just aimed at building that type of webservice more easily, faster, and in a better way.
I particularly love two things about the plugin:
The plugin is used by one very large french company, and therefore has already been rather deeply tested in terms of performance and capabilities. Please ask for new features or help on how to use the plugin on Symfony's users mailing list. You can also send me a mail directly. Happy REST!
]]>I started with a freshly installed Ubuntu 9.10 Server, and directly added several packages:
# apt-get install apache2 php5 php5-cli php-apc php5-xdebug php5-memcache php5-mcrypt php5-imagick php5-gd php5-xsl subversion imagemagick unzip htop memcached
In order to check if the extensions have been well configured, type the command "php -m
" in the terminal, and they should display in the list.
Go to Oracle website, and download these two things:
Put both of these files in /tmp
. Then (yes, I know, it's the command horror show):
cd /tmp/
unzip oracle-instantclient-basic-10.2.0.4-1.i386.zip
mv instantclient_10_2 /opt/
unzip oracle-instantclient-devel-10.2.0.4-1.i386.zip
mv instantclient_10_2/sdk /opt/instantclient_10_2/
export ORACLE_HOME=/opt/instantclient_10_2/
ln -s /opt/instantclient_10_2/libclntsh.so.10.1 /opt/instantclient_10_2//libclntsh.so
ln -s /opt/instantclient_10_2/libocci.so.10.1 /opt/instantclient_10_2//libocci.so
ln -s /opt/instantclient_10_2/ /opt/instantclient_10_2/lib
The default PECL install does not work straight out of the box. You must download and build manually the packages:
pecl download pdo PDO_OCI OCI8
tar xzvf PDO-1.0.3.tgz
tar xzvf oci8-1.3.5.tgz
tar xzvf PDO_OCI-1.0.tgz
cd PDO-1.0.3
phpize
./configure
make
sudo make install
cd ../oci8-1.3.5
phpize
./configure --with-oci8=instantclient,/opt/instantclient_10_2/
make
sudo make install
cd ../PDO_OCI-1.0
cp /opt/instantclient_10_2/sdk/include/*.h .
phpize
./configure
make
sudo make install
At that point, the libraries have been built but are not used by PHP. In this extent, you must add it at the bottom of php.ini files, /etc/php5/cli/php.ini
and /etc/php5/apache2/php.ini
:
extension = pdo.so
extension = pdo_oci.so
extension = oci8.so
As a sidenote, if you want to install PDO_OCI or OCI8 on Mac OSX, you'll have to declare a DYLD_LIBRARY_PATH
shell variable, with the path to the Orale instant client install. Both OCI8 and PDO_OCI require extra configuration directives:
./configure --with-pdo-oci=instantclient,/path/to/instantclient,10.2.0.4
You should have been able to connect to a Oracle server and use it from within PHP. However I have a better advice: don't use Oracle. It has not been thought to work with PHP, nor has PHP been thought to work with it. Stick to a "classical" platform, or at least try more modern solutions. And that will be fine.
]]>Le panda roux oscille entre 25 et 35% de parts de marché, et l'objectif affiché à l'époque relancer l'innovation Web
, est en passe d'être pleinement rempli. Plus important encore, de nombreuses alternatives viables ont vu le jour ou ont consolidé leur position : Opéra, toujours présent, mais également Safari et sa déclinaison sauce Google, Chrome, sont des plateformes modernes, participant à l'effort d'innovation sur le Web initié par Mozilla, et grâce auquel on parle aujourd'hui de navigateurs mobiles (Opéra Mobile, Mozilla Fennec et Safari Mobile), de mode offline, de compilation à la volée du code javascript, de HTML5, du support de SMIL et de canvas, des CSS3 fonts, de milliers d'extensions aux navigateurs - dont même certaines inutiles - et d'outils pour les développeurs. Et c'est en partie grâce à ces outils que les développeurs Web peuvent proposer des sites plus aboutis, plus riches en fonctionnalités, plus rapides et plus efficaces.
Je serai présent à la soirée d'anniversaire des 5 ans de Firefox, organisée le 9 novembre prochain par le Conseil général d'Île de France et Mozilla Europe, afin de partager avec d'autres amateurs de Firefox le plaisir de voir avancer un Web plus ouvert, plus riche, plus libre !
]]>La série de conférences a été l'occasion de nombreuses rencontres intéressantes. Je ne citerai pas toutes les personnes avec qui j'ai discuté, par peur d'en oublier, mais ça a été un réel plaisir d'échanger avec vous !
Ma première présentation a lancé le bal de Symfony Live. Le jeudi matin, à peine réveillé, j'ai ainsi fait le tour de l'approche du développement d'un réseau social avec Symfony :
Les slides de cette conférence sont disponibles.
Après avoir fait un rapide tour des solutions existantes, j'ai présenté vendredi un nouveau plugin, que je vais publier prochainement (lire : vers la fin mois), permettant de manipuler aisément une grande variété de types de médias.
En vrac, voici les caractéristiques de cette solution :
J'ai eu la bonne surprise de constater que ma présentation a suscité de nombreuses réactions positives. Plusieurs idées d'améliorations m'ont été soumises. Voici déjà celles qui sont envisagées :
La chose la plus importante, à mes yeux, est le nombre de réactions qu'a générées cette présentation. Le framework en lui-même est une excellente solution technique, et je pense qu'il est temps de donner plus de consistance à la communauté Symfony en créant des projets annexes, éventuellement sous la forme de groupes de travail en charge du développement de fonctionnalités plus riches. C'est une vraie demande de la communauté, qui outre l'apport de composants fonctionnels efficaces et fiables, permettrait également de promouvoir le choix de Symfony dans un cadre professionnel, face à d'autres solutions à "l'effet démo" plus percutant (et oui, même de grosses bouses techniques passent parfois le premier round des sélections alors que Symfony est recalé).
Les prochaines étapes vont donc être les suivantes :
En attendant, si vous avez une idée de nom approprié pour ce projet, n'hésitez pas à me twitter ! Et pour télécharger les slides de la conférence, les voici : Symfony pour gérer des médias !
Et, comme la demande est forte, je ne résiste pas à l'envie de conclure sur l'image révélation de cette première édition de Symfony Live :
]]>Amazon a développé au cours des dernières années une série de services de cloud computing, regroupés sous l'appellation "Amazon Web Services", qui permettent de déployer rapidement des architectures extensibles, sans les désagréments de la logistique matérielle. Pour le web, les services d'Amazon répondent principalement à trois problématiques :
Premier service à avoir été lancé par Amazon, il y a trois ans, S3 est une solution de stockage de données en ligne. Une fois son compte créé, l'utilisateur peut envoyer des fichiers - appelés des "objets" dans le jargon Amazon - dans des dépôts distants (des "buckets"), en identifiant chaque fichier par une clé unique (une "key").
Comme la majorité des services proposés par Amazon, S3 est accessible par le biais d'une API REST, à laquelle s'interfacent de nombreuses applications : l'extension S3Fox pour Mozilla Firefox, CloudBerry Explorer, etc., mais également des solutions de sauvegarde automatisée comme Jungledisk, Vembu StoreGrid ou encore s3backup.... Les données étant stockées de manière redondante sur les serveurs d'Amazon, une politique de sauvegarde s'appuyant sur S3 est donc plus sûre qu'une simple copie sur CD ou DVD ré-inscriptible, même s'il convient toujours de conserver par sécurité une copie locale de ces données. Au final, S3 est donc à la fois une solution de stockage de données en ligne, de sauvegarde automatisée d'entreprise, voire même de sauvegarde de tout un site web.
S3Fox, une extension Firefox permettant de gérer les contenus présents dans S3
La facturation du service par Amazon est faite sur la base du volume de données transférées et entreposées sur les serveurs d'Amazon.
Les services offerts par Amazon vont plus loin que le simple stockage en ligne de fichiers. Avec EC2, une offre lancée en août 2006, Amazon propose une solution de virtualisation à grande échelle. EC2 permet de déployer en quelques clics des images virtuelles, nommées des AMIs sur des serveurs virtualisés hébergés par Amazon, appelés des "instances".
Amazon fournit un outil permettant de créer ses propres instances (en réalité, des installations complètes du système d'exploitation), mais propose également un annuaire d'images virtuelles comprenant plus de 300 références, vierges (Windows Server, Ubuntu Linux, CentOS, OpenSolaris, Oracle Enterprise Linux, openSUSE, Debian, Fedora, etc...) ou spécialiées (MySQL Enterprise, Oracle 11g, Ruby On Rails, Drupal, IIS/Asp.Net, LAMP, Windows Media Server, ...). Le déploiement d'une instance vierge se fait donc en quelques minutes, directement depuis l'interface web d'AWS.
En plus de cette puissance de calcul virtualisé, EC2 fournit quelques outils supplémentaires :
Dernier "gros" service fourni par Amazon, Cloudfront est un réseau de distribution de contenu. Le principe d'un CDN est simple : lorsqu'un utilisateur, situé au Japon, tente d'accéder à un contenu hébergé en France, il doit généralement faire face à une latence importante, en raison de la durée d'acheminement de ce contenu. Afin d'accélérer la "livraison" de ce contenu, Amazon propose avec Cloudfront un réseau comportant de très nombreux serveurs, répartis aux quatre coins de la planète, situés près des utilisateurs, et donc aptes à servir le contenu plus rapidement en en gardant une copie dans un cache local. Cloudfront est exclusivement capable de servir du contenu stocké sur S3, que l'utilisateur peut rendre disponible en créant des "distributions".
La mise en place d'un CDN nécessite que les médias servis par le CDN (les images, les feuilles de style, les fichiers javascript, les vidéos volumineuses, etc.) soient placés sur un sous-domaine différent du domaine principal. Par exemple, pour le site web http://www.clever-age.com/, une idée de sous-domaine adéquat serait http://medias.clever-age.com/ (ne cherchez pas, ça n'existe pas... pour l'instant !). Dans le cas d'Amazon, ce sous-domaine est personnalisable client par client (le nom "Amazon" n'apparait pas dans l'url des contenus hébergés), et est un CNAME vers un sous-domaine de la forme http://hadopivomi.cloudfront.net/.
Les critères permettant d'évaluer quel est le serveur du CDN à partir duquel l'utilisateur télécharge un contenu peuvent varier : proximité géographique, nombre de nœuds réseau à parcourir, coût potentiel de l'acheminement, etc. C'est à la mise en place du CDN qu'est décidée la stratégie de redirection du trafic. Dans le cas spécifique d'Amazon Cloudfront, c'est la proximité réseau qui est prise en compte. Lorsqu'un utilisateur tente donc d'accéder au contenu http://media.lacot.org/cs/styles.css, les serveur DNS de Cloudfront (ns-01.cloudfront.net et ns-02.cloudfront.net) renvoient une liste d'adresses IP convenables pour l'utilisateur. Les serveurs situés à ces adresses IP, situés au sein du réseau d'Amazon, rapatrient alors le contenu depuis le bucket S3 où le contenu est stocké, en font une copie locale qu'ils servent alors à l'utilisateur.
Voici un schéma global, montrant une architecture tirant partie des services offerts par AWS :
Un exemple d'architecture tirant partie des services d'Amazon
Si les solutions offertes par Amazon sont encore en béta, elles permettent dés maintenant de mettre en place des architectures évolutives, performantes et maîtrisées, ce que peu d'hébergements peuvent prétendre. Néanmoins, les services d'Amazon souffrent de certaines limitations, ou sont en tout cas sujets à certaines questions :
*/*
since long, it indeed never supported application/xhtml+xml
, the recommended mime-type for xhtml pages. When trying to display pages with this mime-type in IE8 or previous editions, Internet Explorer just proposes to download the page - needless to say that it will prevent some of your visitors to see the wonderful content of your pages.
Therefore, in order to get displayed in these browsers, web standards compliant websites must use the more common text/html
mime-type. Indeed, the best what a developer can do is to serve the pages as application/xhtml+xml
in all browsers except in those that don't accept it. Here is a simple filter for achieving this job in Symfony applications:
<?php
class nonApplicationXhtmlXmlCapableBrowsersFilter extends sfFilter
{
public function execute($filterChain)
{
// execute next filter
$filterChain->execute();
// execute this filter only once
if ($this->isFirstCall())
{
$content_type = sfContext::getInstance()->getResponse()->getContentType();
if ((false !== stripos($content_type, 'application/xhtml+xml'))
&& (false === stripos($_SERVER["HTTP_ACCEPT"], 'application/xhtml+xml')))
{
sfContext::getInstance()->getResponse()->setContentType('text/html; charset='.sfConfig::get('sf_charset'));
}
}
}
}
Put the code somewhere in your project, clear the cache and just activate the filter in the apps/APPLICATION_NAME/config/filters.yml
:
rendering: ~
security: ~
# insert your own filters here
nonApplicationXhtmlXmlCapableBrowsersFilter:
class: nonApplicationXhtmlXmlCapableBrowsersFilter
cache: ~
common: ~
execution: ~
In conclusion :