Categorie Technologie

Poste par Cedric Sadai, le 14/12/10 - Technologie

Freebox v6Sans vouloir rentrer dans une description précise de l’ensemble des fonctionnalités de la Freebox v6 (une description succinte ici, et le communiqué de presse officiel en PDF ), il est déja certain que Free vient de remettre à sa concurrence l’avance qu’elle avait perdu au fil des années, par le fruit des consolidations multiples et des investissements en R&D colossaux sur ce marché.

C’est une bonne chose à bien des égards. Déja, pour les utilisateurs. Hotline gratuite, appels vers les mobiles gratuits, partage de fichier via le network, mediacenter contrôlable par mobile.. Free va faire économiser plusieurs centaines d’euros annuels à chaque foyer en équipement et en communications. Et quand la technologie et l’intelligence stratégique permettent cela, cela mérite d’être salué.

Mais là où cette annonce me réjouit le plus, c’est que cela replace la France à un niveau décent sur la scène technologique mondiale. En effet, malgré quelques belles réussites, la France n’a jamais fait figure de référence du numérique, excepté celui des télécoms. Hier, avec le Minitel, aujourd’hui avec OVH et enfin Free, qui va devenir désormais une référence induscutable en la matière.

Nous avons l’ADSL le moins cher du monde, un des plus performants, et maintenant le plus technologiquement avancé. Il faut vraiment mesurer le poids et la portée des annonces faites, elles représentes des millions d’euros d’investissement et des années de travail, et font à mon avis toutes mouche quant à leur portée stratégique. Je n’imagine pas le buzz mondial si Apple avait annoncé le tiers de ces fonctionnalités lors d’un keynote.

C’est en tout cas une bien belle publicité pour l’ingéniérie numérique française, et une nouvelle validation du modèle de l’entreprise souple, agile, et innovante.

Poste par Cedric Sadai, le 14/12/10 - Technologie

Développer un blog avec Symfony est une très belle initiative. Cela permet de se familiariser très rapidement avec tous les concepts classiques rencontrés dans la vaste majorité des projets. C’est même l’application idéale quand on découvre un nouveau langage ou une nouvelle version d’un framework, car c’est assez petit pour être réalisable (2 jours de travail pour mon blog), et vous obtenez un vrai produit fini destiné à être mis en ligne (ce qui vous permet de traiter l’ensemble de la chaîne de construction web, y compris la partie déploiement).

Cependant, bâtir un blog ex-nihilo sur un framework comme Symfony en (bientôt) 2011 est mauvais à long terme. Et c’est même inscrit dans la logique même des framework, puisqu’on nous conseille de ne pas se répéter. Or, pour une application ultra classique comme un blog, tout ce que vous ferez avec un blog custom est d’éternellement vous répéter. Vous répéter et perdre du temps, le tout pour une efficacité moindre, car votre intelligence d’atteindra jamais la somme de l’intelligence collective.

Pour ceux qui voudraient switcher d’un blog développé sous Symfony à un WordPress plus facile à gérer, je vous livre les petits scripts qui m’ont permis très rapidement (après intégration xHTML/CSS du thème, évidemment), de récupérer mes articles et mes commentaires en quelques secondes via l’outil d’import de WP.

Voici la structure de DB de mon ancien blog:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> show tables;
+---------------------------+
| Tables_in_sadai_blog      |
+---------------------------+
| blog_category             |
| blog_comment              |
| blog_post                 |
| blog_post_images          |
| sf_guard_group            |
| sf_guard_group_permission |
| sf_guard_permission       |
| sf_guard_remember_key     |
| sf_guard_user             |
| sf_guard_user_group       |
| sf_guard_user_permission  |
| sf_tag                    |
| sf_tagging                |
+---------------------------+
13 rows in set (0.00 sec)

 

Voici la description de la table “blog_post”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> show columns from blog_post;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| user_id        | int(11)      | YES  | MUL | NULL    |                |
| category_id    | int(11)      | YES  | MUL | NULL    |                |
| title          | varchar(255) | YES  |     | NULL    |                |
| main_pic       | varchar(100) | YES  |     | NULL    |                |
| slug           | varchar(255) | YES  |     | NULL    |                |
| content        | text         | YES  |     | NULL    |                |
| is_published   | int(11)      | YES  |     | NULL    |                |
| allow_comments | int(11)      | YES  |     | NULL    |                |
| created_at     | datetime     | YES  |     | NULL    |                |
| published_at   | date         | YES  |     | NULL    |                |
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
+----------------+--------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)

L’image titre, quand elle est présente, va automatiquement s’ajouter au début du contenu de l’article. Ce mécanisme est repris dans le script d’import.

Les tags, eux, sont simplement des tags, il n’y a pas de version libre et de version normalisée. Enfin, les commentaires se décrivent ainsi:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> show columns from blog_comment;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| post_id      | int(11)      | YES  | MUL | NULL    |                |
| author_name  | varchar(200) | YES  |     | NULL    |                |
| author_email | varchar(255) | YES  |     | NULL    |                |
| author_url   | varchar(255) | YES  |     | NULL    |                |
| ip           | varchar(100) | YES  |     | NULL    |                |
| content      | text         | YES  |     | NULL    |                |
| is_active    | int(11)      | YES  |     | NULL    |                |
| created_at   | datetime     | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)

Nous allons donc générer un XML d’export au format WordPress, qui va nous permettre d’importer l’ensemble de notre blog (articles, tags, commentaires, catégories) en une seule commande.

Côté action, il nous faut donc récupérer l’ensemble des catégories, tags, et articles contenus en DB (on récupérera les commentaires via un accesseur sur le modèle Post). Une execution très simple (sous… Propel! Eh oui, ce blog est vieux) ;)

 

1
2
3
4
5
6
7
8
public function executeExport()
{
  $c = new Criteria();
  $this->blogCats = CategoryPeer::doSelect($c);
  $this->blogTags = TagPeer::doSelect($c);
  $this->posts = PostPeer::doSelect($c);
  $this->setLayout(false);
}

Puis,du côté du template, on effectue toutes les transformations nécessaires afin de satisfaire au format d’export WordPress. Pour en savoir plsu sur ce format, fouillez tout simplement le script d’export de WordPress, et parcourez cette ressource.

Voici la copie exacte du template exportSuccess.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your blog. -->
<!-- It contains information about your blog's posts, comments, and categories. -->
<!-- You may use this file to transfer that content from one site to another. -->
<!-- This file is not intended to serve as a complete backup of your blog. -->

<!-- To import this information into a WordPress blog follow these steps. -->
<!-- 1. Log into that blog as an administrator. -->
<!-- 2. Go to Manage: Import in the blog's admin panels. -->
<!-- 3. Choose "WordPress" from the list. -->
<!-- 4. Upload this file using the form provided on that page. -->
<!-- 5. You will first be asked to map the authors in this export file to users -->
<!--    on the blog.  For each author, you may choose to map to an -->
<!--    existing user on the blog or to create a new user -->
<!-- 6. WordPress will then import each of the posts, comments, and categories -->
<!--    contained in this file into your blog -->

<!-- generator="WordPress/MU" created="2008-05-16 22:49"-->
<rss version="2.0"
        xmlns:content="http://purl.org/rss/1.0/modules/content/"
        xmlns:wfw="http://wellformedweb.org/CommentAPI/"
        xmlns:dc="http://purl.org/dc/elements/1.1/"
        xmlns:wp="http://wordpress.org/export/1.0/"
>
<?php $base = 'http://www.sadai.net';?>
<channel>
  <title>Marketing &amp; Technologies | Sadai.net</title>
  <link><?php echo $base;?></link>
  <description>Publicit&acute; digitale, Data, Science, Architectures.</description>
  <pubDate>Fri, 1 Jan 2008 22:46:22 +0000</pubDate>
  <generator>http://wordpress.org/?v=MU</generator>
  <language>fr</language>
  <wp:wxr_version>1.0</wp:wxr_version>
  <wp:base_site_url><?php echo $base;?></wp:base_site_url>
  <wp:base_blog_url><?php echo $base;?></wp:base_blog_url>

  <?php foreach ($blogCats as $blogCat):?>
  <wp:category>
    <wp:category_nicename><?php echo $blogCat->getSlug();?></wp:category_nicename>
    <wp:category_parent></wp:category_parent>
    <wp:cat_name><![CDATA[<?php echo $blogCat->getName()?>]]></wp:cat_name>
  </wp:category>
  <?php endforeach;?>

  <?php foreach ($blogTags as $blogTag):?>
    <wp:tag><wp:tag_slug><?php echo $blogTag->getName();?></wp:tag_slug><wp:tag_name><![CDATA[<?php echo $blogTag->getName();?>]]></wp:tag_name></wp:tag>
  <?php endforeach;?>


  <?php foreach ($posts as $post):?>
    <?php $content = $post->getContent()?>

    <?php if ($post->hasPic()):?>
      <?php $content = '<p>' . '<img src="'.$post->getPicUrl().'" border="0" align="left" style="padding-right:7px" />' . substr($content, 3);?>
    <?php endif;?>
    <item>
    <title><![CDATA[<?php echo $post->getTitle(); ?>]]></title>
    <link><?php $base . '/' . $post->getSlug(); ?></link>
    <pubDate><?php echo date( 'D, d M Y H:i:s +0000', strToTime($post->getCreatedAt())); ?></pubDate>
    <dc:creator><![CDATA[Cedric Sadai]]></dc:creator>

    <category><![CDATA[<?php echo $post->getCategory()->getName()?>]]></category>
    <category domain="category" nicename="<?php echo $post->getCategory()->getSlug()?>"><![CDATA[<?php echo $post->getCategory()->getName()?>]]></category>

    <?php foreach ($post->getTags() as $tag):?>
    <category domain="tag"><![CDATA[<?php echo $tag;?>]]></category>
    <category domain="tag" nicename="<?php echo $tag;?>"><![CDATA[<?php echo $tag;?>]]></category>
    <?php endforeach;?>

    <guid isPermaLink="false"><?php echo $base . '/' .$post->getSlug(); ?></guid>
    <description></description>
    <content:encoded><![CDATA[<?php echo preg_replace('/\/uploads\/assets\//i', '/wp-content/uploads/assets/', $content);?>]]></content:encoded>
    <wp:post_date><?php echo $post->getCreatedAt(); ?></wp:post_date>
    <wp:post_date_gmt><?php echo $post->getCreatedAt(); ?></wp:post_date_gmt>
    <wp:comment_status>open</wp:comment_status>
    <wp:ping_status>open</wp:ping_status>
    <wp:post_name><?php echo $post->getSlug(); ?></wp:post_name>
    <wp:status>publish</wp:status>
    <wp:post_type>post</wp:post_type>
    <wp:post_password></wp:post_password>
    <wp:is_sticky>0</wp:is_sticky>

    <?php foreach ($post->getAllComments() as $comment):?>
    <wp:comment>
    <wp:comment_id><?php echo $comment->getId()?></wp:comment_id>
    <wp:comment_author><![CDATA[<?php echo $comment->getAuthorName()?>]]></wp:comment_author>
    <wp:comment_author_email><?php echo $comment->getAuthorEmail()?></wp:comment_author_email>
    <wp:comment_author_url><?php echo $comment->getAuthorUrl()?></wp:comment_author_url>
    <wp:comment_author_IP><?php echo $comment->getIp()?></wp:comment_author_IP>
    <wp:comment_date><?php echo date( 'D, d M Y H:i:s +0000', strToTime($comment->getCreatedAt())); ?></wp:comment_date>
    <wp:comment_author_IP><?php echo $comment->getIp()?></wp:comment_author_IP>
    <wp:comment_date><?php echo date( 'D, d M Y H:i:s +0000', strToTime($comment->getCreatedAt())); ?></wp:comment_date>
    <wp:comment_date_gmt><?php echo date( 'D, d M Y H:i:s +0000', strToTime($comment->getCreatedAt())); ?></wp:comment_date_gmt>
    <wp:comment_content><![CDATA[<?php echo $comment->getContent()?>]]></wp:comment_content>
    <wp:comment_approved>1</wp:comment_approved>
    <wp:comment_parent>0</wp:comment_parent>
    <wp:comment_user_id>0</wp:comment_user_id>
    <wp:comment_type></wp:comment_type>
    </wp:comment>
    <?php endforeach;?>
  </item>
  <?php endforeach;?>
</channel>
</rss>

Pas de grosse difficulté ici, à part qu’il faut bien donner un ID à chaque commentaire, sous peine de les voir assimiler à des doublons. Il faut également bien leur passer le statut “approved” à 1, sinon il ne seront pas importés. Enfin, à la ligne 71, je remplace toutes les occurences de /uploads/assets par /wp-content/uploads/assets/, afin que toutes mes images soient conservées au terme d’un simple copier-coller de répertoire au bon endroit.

J’ai hâte à présent de reprendre une activité de blogging plus soutenue!

Poste par Cedric Sadai, le 19/10/10 - Technologie

La deuxième conférence Hadoop World s’est tenue Mardi dernier, 12 Octobre à New-York. Plus de 1000 participants y étaient réunis pour ce qui est devenu de fait l’événement majeur consacré à cette technologie open-source, de plus en plus utilisée, dans des industries de plus en plus variées.

Côté ambiance, le cadre classique et chic de l’hotel Hilton de la 6ème avenue, une organisation efficace et sans fioritures, et des thématiques variées et pertinentes. L’introduction était assurée par deux keynotes majeurs, sur lesquels je reviens dans cet article, puis une trentaine de sessions de 30mn se succedèrent pendant la journée, laissant au participant le choix de la séance la mieux appropriée parmi 4 ou 5 sessions, selon ses thèmes de prédilection.

Les keynotes (de Mike Olson, puis Tim O’Reilly) étaient de grande qualité. L’élément principal qui en ressortait n’était pas tant l’importance d’Hadoop mais l’importance de la data. Voire la “big data“, celle qui se décline en pétabyte, exobyte, ou même zettabyte. La data est partout, et elle est un des éléments clé des innovations de fonds observées dans le web, mais également dans nombre d’industries “traditionnelles” (électricité, grande distirbution, banque, automobile..). Chaque année, le volume de données nouvellement créé est égal à la taille totale des données créées depuis l’invention de l’informatique. Plus rien ne se perd désormais: chaque interaction est stockée, permettant d’atteindre des mondes nouveaux en terme de profondeur d’analyse, et donc d’atteindre des stades nouveaux en matière d’intelligence business.

Tim Oreilly, Hadoop World 2010

Tim O’Reilly consacrera d’ailleurs son keynote à un exercice de prospective assez bluffant. En recoupant des articles et des tendances décelées depuis 2006 avec des projets de R&D récents, il démontra de fort belle manière que la data est partout, que ses applications sont multiples, que certaines sont effrayantes, mais qu’un nouvel élan technologique est en train de se passer, de manière fondamentale, de la même manière que l’avènement du mobile en matière d’usage, ou que la finalisation de l’HTML 5 dans la production d’applications web/mobile.

Smart grid, médecine personnalisée, et analyse prédictive

Un exemple parmi tant d’autres, choisi exprès en dehors du secteur Internet. Il concerne le Smart-Grid, soit cette nouvelle manière de distribuer l’électricité, en permettant un échange bi-directionnel de l’information. Là où les compagnies d’électricité se contentent de distribuer de l’énergie à la demande, la Smart-Grid récupère en même temps les informations sur la distribution. En se basant sur ce principe, une société (suédoise, de mémoire), prépare un projet de R&D consistant à analyser de manière précise l’ensemble des courbes de consommation, puis d’y associer les “fingerprints” de la consommation éléctrique de chaque objet au monde. En effet, chaque objet a une empreinte électrique propre, une courbe spécifique si vous préférez, qui permet ainsi d’identifier les objets présent dans une habitation sans même y rentrer, et donc de communiquer avec, sans les identifier préalablement par IP.

Le keynote a débordé d’exemples de ce type, de la médecine personnalisée (construction de modèles d’utilisateurs liés à leur génotype, permettant le calcul automatique de la composition médicamenteuse la plus efficace pour guérir une maladie), à l’avènement de l’informatique sans clavier, l’informatique des capteurs. Enfin, impossible de ne pas mentionner l’informatique prédictive, et l’exemple de cette société qui a collecté l’ensemble des données relatives aux heures de départ et d’arrivée des avions, et qui est désormais capable de prédire les horaires de n’importe quel vol d’une manière si précise, que de plus en plus de compagnies aériennes utilisent désormais leurs services.

Des clusters de 114TB à 60PB, 115TB par noeud en moyenne

Mike Olson fera lui un état des technologies Hadoop, et appuyera sur la maturité de ces technologies, qui ont fortement bénéficié de l’investissement de très nombreuses sociétés, parmi lesquelles il faut citer Yahoo!, Twitter, eBay, Facebook comme contributeurs significatifs. Hadoop n’est plus une simple technologie de stockage et computation distribuée, elle devient un véritable écosystème technologique. Ainsi, le CEO de Cloudera, société de services dédiée à Hadoop et développant le CDH, un package open-source prêt à installer (“yum install hadoop”) et composé de l’ensemble des outils de cet écosystème, listera les nombreuses sociétés à établir des partenariats techniques et commerciaux dans le but de rendre leurs produits ou services compatibles avec l’élephant jaune. Ainsi, des sociétés de business intelligence traditionnelles comme MicroStrategy ou Oracle ont développé, ou sont en train de développer, des connecteurs pour Hadoop, comme autant de signes que nous sommes bien là devant un logiciel couche basse destiné à devenir la norme du stockage et computation de grande ampleur.

Mike Olson, Hadoop 2010
Quelques chiffres à retenir sur Cloudera: les clusters de leurs clients vont de 114TB à 60PB, il y a 66 noeuds en moyenne sur ces clusters, et une moyenne de 115 TB par noeud. Enfin, une des phrases marquantes de son keynote “Hadoop is not about cheap hardware, it’s about analytical power“.

Peut être qu’une autre phrase, de Tim O’Reilly cette fois, illustre encore mieux le message que les deux conférenciers ont voulu faire passer, et dont la fréquentation, deux fois plus importante que l’an dernier, atteste: “hackers play, entrepreneurs build products, entreprises follow“. Il semble que nous sommes bel et bien passés à la troisième étape. Et la présence en nombre d’executifs de sociétés côtées à Wall Street comme JP Morgan, Bank of America, General Electric et comparses, corrobore de fait cette hypothèse.

Dans un prochain article, je ferai le point sur les enseignements issus des différentes “breakout session”. En guise de teasing, je peux vous dire que la conférence de Facebook était très riche en informations.

Note: Si vous êtes dans le monde de la big data et rêvez de travailler sur un projet pleinement innovant, où Hadoop, HBase, Pig sont au coeur de l’écosystème technologique, le tout dans des conditions optimales, envoyez-moi un mail avec votre CV et le détail de votre expertise dans ces technologies. — cedric **at** sadai **point** net

credit photo: cloudera

Poste par Cedric Sadai, le 11/10/10 - Technologie

Ces cinq dernières années ont vu l’avènement de mastodontes d’un nouveau type. Les Facebook, Youtube, et autres Twitter se sont développés à une vitesse phénoménale, un avènement se caractérisant entre autres par une explosion du volume (et de l’importance) des données stockées sur Internet.

Ces acteurs, dont les applications étaient bâties initialement sur des technologies grand public, souvent Open-source, ont initié une vague successive d’innovations, ayant vocation à résoudre les problèmes concrets qui se posaient à eux.

Parmis ces problèmes, la gestion des grandes masses de données. Facebook représente ainsi plus de 300Tb de nouveaux logs quotidiens, et nécessite des milliers de traitements asynchrones par batch. Reposer sur les technologies traditionnelles pose donc très rapidement des problèmes insurmontables de performance, comme en témoignent les multiples downs de Facebook en 2008, à l’époque ou les données étaient encore stockées sur la base de données relationnelle et peu scalable MySQL.

La solution apportée en 2007 par les géants de l’industrie, Yahoo! en tête, se nomme Hadoop. Distribuée sous license Apache, cette solution, écrite en Java, permet de stocker des fichiers de manière distribuée, c’est à dire sur un cluster de serveurs, et non plus sur un seul disque dur, duquel étaient bricolées des réplications.  Cette architecture permet une scalabilité d’un nouveau type, puisqu’il “suffit” d’ajouter des serveurs au cluster pour démultiplier les possibilités de stockage et de calcul. En effet, Hadoop dispose également d’un framework “Map/Reduce“, méthode par laquelle il est possible d’appliquer des traitements par batch (du calcul) sur des milliards de données, le tout, également de manière distribuée. C’est l’avènement des “commodity hardware architecture”, modèle inventé et éprouvé par Google, selon lequel il vaut mieux bâtir une architecture serveur sur des machines à bas cout, en agrégeant leurs capacités de calcul, plutôt que de reposer sur des machines couteuses, sans capacité d’évolution, et au cout de maintenance énorme.

Le décor posé, on se rend compte alors des enjeux d’Hadoop. Technologie récente (2007), mais qui évolue rapidement grâce à la contribution multiple des principaux acteurs du monde des “BigData”, excepté Google, qui repose exclusivement sur des technologies propriétaires.

La conférence Hadoop World, organisée par Cloudera, se tient cette semaine à New-York, où je suis actuellement afin d’y assister. Cette conférence est l’occasion de faire un point sur les derniers développement d’Hadoop, mais également sur son écosystème, très riche et dynamique (Hive, Pig, Flume, Zookeeper, etc..).

Les géants s’y sont donnés rendez-vous, et les conférences vont se succéder toute la journée de demain, avec des sessions variées, techniques ou business, couvrant les différents champs d’application de la technologie: du stockage et analyse de clickstream, à la business intelligence, en passant par le machine learning.

Je posterai sur ce blog cette semaine une série d’articles relatant le contenu des différentes conférences. Je live-twitterai également la conférence sur mon compte Twitter @yeahscience. Stay tuned.

Poste par Cedric Sadai, le 29/10/09 - Technologie

Voilà plusieurs mois que Snow Leopard trainait sur mon bureau. Précommandé à la hâte dès le mois d’Août, en bonne victime du marketing de la marque à la pomme, je ne l’ai jamais ouvert depuis. Comme si je sentais que quelque chose clochait. Les articles très critiques dans les forums, les tweets d’utilisateurs déplorant les cassures de compatibilité, les alertes reçues pour les différents* logiciels dont je possède la license (*bon, ok, les deux logiciels dont je possède la license), pour me proposer des patchs correctifs à la hâte. Bref, ça ne présageait rien de bon, et mon état d’esprit était assez bien résumé dans un de mes tweets, il n’y a pas si longtemps: “This DVD smells like Vista“.

Disposant enfin d’un peu de temps libre ces derniers jours, j’ai tenté l’expérience. Et je suis malheureusement obligé de confirmer le pire commentaire que j’ai lu avant de franchir le pas: “It’s the most expensive downgrade I’ve ever seen”.

Quelques dyfonctionnements en vrac:

  • Les mouvements autrefois fluides, comme le passage de la souris dans un coin de l’écran pour activer Exposé sont désormais saccadés, passant de l’écran normal à Exposé, sans passer par le dégradé.

 

  • Quicktime X n’a plus de son.

 

  • VLC ferme inopinément, de même que Mail et Adium, ce qui me laisse croire que toutes les applications peuvent être concernées.

 

  • Lorsque vous avez sécurisé votre Mac par mot de passe, Leopard avait l’intelligence d’attendre 30 secondes environ après chaque période d’inactivité avant de vous redemander de confirmer votre accès. Snow Leopard le demande à la seconde près, ce qui vous oblige à bouger sans arrêt la souris pour vous assurer que l’écran ne va pas s’éteindre, et que vous n’allez pas taper votre p4$$w0rD pour la 12ème fois de la journée.
    EDIT: Ce point est un #fail, puisque cette option est finalement réglable dans les paramètres de sécurité.

 

  • Alors même que j’écris cet article sur mon éditeur de texte habituel, TextEdit, j’aperçois que la correction automatique d’orthographe est activée, et que chaque mot en anglais est transformé sans que je ne le demande dans un mot très étrange dans la langue de Molière. Pourquoi changer de réglages par défaut qu’on utilise depuis des années??

En bref, Snow Leopard introduit de l’instabilité dans ce qui marchait très bien, ce qui est une des pires expériences utilisateur qu’on puisse avoir. De plus, on doit ici souligner l’importance de la promesse non tenue. En effet, Apple nous a vendu cet OS comme “plus accompli, plus rapide, plus simple”. Ces trois affirmations sont fausses. En particulier le “plus rapide”. Je n’ai remarqué aucune amélioration de vitesse d’une manière générale (note: je dispose de 4GB de RAM), et je soupçonne les utilisateurs qui font part d’une amélioration à ce niveau là de s’en être eux-mêmes convaincus pour éviter de reconnaitre l’ampleur de ce qui convient quand même d’appeler une arnaque.

Quand on utilise autant le marketing en positionnement, distribution et communication, le tout avec autant d’assurance, voire d’arrogance, il faut vraiment être sur de son fait. Je doute qu’Apple puisse se permettre beaucoup de faux pas comme celui-là avant que la communauté ne se retourne, en particulier, la communauté des nerds qui sont venus à OSX pour Unix, et qui sont très volatiles.

La touche “anti-Spotify”

Mais il y a encore pire. La “fonctionnalité” qui m’a vraiment fait avaler de travers est la modification de la touche media “play/pause”. Cette touche a été modifiée pour lancer iTunes si celui ne l’est pas encore. Ne tournons pas autour du pot, cette touche vous empêche purement et simplement d’utiliser un autre lecteur media que iTunes! (en gros, la musique d’iTunes se déclenche lorsque vous voulez stopper la musique de votre logiciel favori) Le premier visé est évidemment Spotify, qui représente une menace énorme pour iTunes, via son abonnement premium, ses innovations et son service très performant. Pour une société qui a encore le culot de dénigrer Microsoft dans ses fameux spots publicitaires, voici un “cheap shot” anticoncurrentiel du niveau de la firme de Redmond.

Pour ne pas dresser un bilan uniquement négatif, je relève une légère amélioration de la vitesse lors de l’arrêt de l’ordinateur, et surtout une amélioration assez significative des performances de Mail, mon logiciel de messagerie de choix que j’avais abandonné il y a quelques mois car il mettait beaucoup trop de temps à s’ouvrir. En revanche, il souffre également de fermetures impromptues.

Je reste très largement enthousiaste vis-à-vis des produits Apple, mais reprendrai mon ancienne routine: aller essayer le produit qui m’intéresse à l’Apple Store, attendre une vague de reviews, puis prendre une décision. Mon premier achat impulsif Apple a définitivement été un échec.

Quelle a été votre expérience avec Snow Leopard? Aussi négative ou beaucoup plus contrastée, voire plaisante?

Note: J’en profite pour dire à nos amis parisiens que l’Apple Store de Paris au carousel du Louvre devrait ouvrir ses portes le 7 Novembre prochain.

Note2: Pour contourner l’affaire de la touche play/pause, je fais un “click droit” sur l’icone d’iTunes dans le Dock, et coche “couper le son”. Le problème est que la RAM attributée à iTunes est perdue, mais c’est déjà ça.

Poste par Cedric Sadai, le 20/10/09 - Technologie

Plateforme street artCes dernières semaines, nous avons sorti un produit que nous préparons depuis pas mal de temps. Il s’agit de FatCap. Ce site, visible en francais sur www.fatcap.org, et initialement créé en 1998, est un des leaders mondiaux des magazines d’arts urbains en ligne. Pour cette nouvelle version, les objectifs à atteindre étaient multiples:

  • Bâtir une plateforme solide, basée sur le contenu des utilisateurs (photos, vidéos) ET sur le contenu produit par l’équipe éditoriale (vidéos maison, articles, interviews, reportages, mises en avant)
  • Rendre cette plateforme entièrement géolocalisée, afin de pouvoir suivre l’évolution de l’art dans une ville, dans un état américain, dans un pays, ou même dans un continent.
  • Tirer la plus grande valeur de chaque élément de contenu en créant une base intelligente et structurée censée représenter l’art urbain de manière exhaustive: Ainsi, chaque artiste devra avoir sa page, ainsi que chaque groupe d’artiste. De même, chaque photo pourra être multi-taggée avec une quinzaine de critères afin de répondre de manière complète à tout type de demande de la part des internautes.
  • L’ensemble de la plateforme devra être internationalisée, et mieux encore, localisée, c’est à dire que la couche éditoriale devra être différente sur les différents sites locaux. L’actualité de chaque version localisée étant adaptée au pays ciblé par la version, à l’inverse de sites internationalisés au contenu unique, traduit soit à la main soit par un traducteur automatique.

La conception

Nous sommes donc partis pour quatre mois de conception dès mi-2007, où il s’agissait d’abord de faire un état des lieux des technologies en présence. En effet, il fallait contourner par la technologie les problèmes suivants:

- Géolocalisation: Il était bien sûr hors de question de se baser sur des champs texte, qui laissent la part belle aux fautes en tout genre. Il fallait se baser sur une API (et donc sur des ID), et proposer un système souple et intelligent qui permettrait aux utilisateurs de renseigner les villes de manière intuitive. Côté API, elle devait être pérenne, et n’avoir aucun risque de cessation d’activité à court ou moyen terme. Nous avons opté pour les bases de Yahoo! Geoplanet (qui, hasard ou chance, sont sorties en plein milieu de notre phase de conception), car ce sont celles utilisées par Flickr et celles qui de loin présentent les fonctionnalités les plus puissantes et les meilleures garanties.

- Ce dernier point fut en outre à l’origine d’un problème plus global: ayant un contenu méta-taggée de manière très riche, il convenait d’adopter un système de tagging très simple à utiliser, très loin donc, des éléments de formulaires mis à notre disposition par le simple fruit de l’HTML (menu déroulants, boutons radio, etc..). Le JavaScript allait donc être intensivement utilisé sur certaines pages. En effet, plus vous rendez une information compliquée à rentrer, plus vous risquez d’avoir des informations lacunaires.

La solution à ces deux problèmes peuvent être illustrés au travers de l’exemple du tagging d’une ville. Voici à quoi ressemble le formulaire d’inscription, par exemple:

fig. 1

fig. 2

fig. 3

Comme vous le voyez sur le drapeau, on préselectionne automatiquement le pays dans lequel l’IP du visiteur se situe. S’il le souhaite, il peut évidemment changer ce pays. Cela nous permet de restreindre notre recherche de ville au pays sélectionné, évitant ainsi les multiples doublons constatés à l’échelle mondiale. Ensuite, la puissance de l’interactivité avec l’API se déploie lorsque la ville est inconnue en base (fig. 2). La, alors que l’utilisateur va taper entièrement le texte de sa ville, nous ne sommes pas encore en mesure de la relier à une ville issue de la base de données des villes Flickr, disponible à travers Yahoo! Geoplanet. Alors, une fois le texte rentré, nous effectuons par Ajax la bonne requete YQL, et sommes capables, s’il y a confusion, de proposer des options à sélectionner (fig. 3), ou, si nous avons un résultat unique, de simplement qualifier le texte tapé en une puce signalant la validation du contenu.

- Ensuite, il y a la spécificité d’un site au contenu localisé. Un tel site ne saurait abriter toutes ses différentes version sous un seul et même serveur. Au contraire, le contenu doit être servi au plus près des internautes, ce qui sous entend d’héberger chaque version dans le pays des visiteurs qu’il cible. Cela pose donc entre autres le problème de l’appel aux images, puisque des images sont chargées sur des serveurs distants de 7000 km, et que nous ne souhaitions pas utiliser de technologie de synchronisation des fichiers (même si unison a longuement été étudié), car technologie sujette aux lags, à la consommation frénétique de bande passante (qui n’est pas chère en France mais hors de prix aux Etats Unis), et sous-optimale en terme d’optimisation de l’espace disque.

Nous avons donc développé un système de gestion intelligent des assets, qui est capable de déterminer sur quel serveur du cluster une image a été chargée, et de l’afficher en conséquence, ainsi que de faire une copie permanente des assets sur le service de stockage tiers Amazon S3. Une fois une image répliquée (dans les 10mn de sa validation), c’est le chemin physique le plus court jusqu’au serveur qui est choisi, dans le but d’optimiser la vitesse et les couts.

Le design

Printemps – été 2008: Une fois les documents établis (specs fonctionnelles et techniques, wireframes détaillées, etc.), l’élaboration du design fut assez “simple”. Déja, parce que nous travaillions avec une des meilleures agences de Paris (CubeDesigners), mais aussi parce que nous avions une idée très claire de ce que nous souhaitions, facilitant les allers retours. Ainsi, élaborer une page clé complexe ne prenait pas plus d’une journée, sans que nous n’ayons, jusqu’au dernier jour, besoin d’y retoucher le moindre pixel.

Le défi ergonomique de ce design était de bâtir des listes filtrables, sur un système d’entonnoir. Ainsi, une liste de photo peut être celle d’un artiste, comme C215, mais aussi la liste des photos de Paris, celle de tous les “personnages” apparaissant dans une oeuvre, celle de France, de Californie, etc… C’est là la puissance du site: structurer à l’extrême un contenu par ailleurs désorganisé, rendu simple par une utilisation de repères identiques à travers la visite.

Un bon exemple de ce souci de facilitation du parcours de visite est la page de vue d’une photo. Sur cette page finale (rien après ce niveau de navigation), il convenait de proposer aux visiteurs d’autres contenus reliés. Etant donnés nos multiples niveaux de classification d’une photo, nous avons opté pour un coverflow, grâce auquel on peut continuer sa visite sur des frises, toutes classées selon un des critères clés choisis à travers le site (timeline, artiste, ville, type, style, support).

Le développement

Beaucoup de travail nous attendait chez SeedWeb. Nous avons passé l’été 2008 à concevoir le design, et l’automne fut l’occasion pour notre équipe d’intégrateurs HTML d’intégrer toutes ces maquettes en XHTML selons nos critères très stricts, dans le but d’améliorer le référencement naturel, et en parallèle pour notre équipe de développeurs front, de développer la couche Javascript (avec jQuery), en particulier les interfaces de tagging. Le développement lourd a donc commencé à l’hiver 2008-2009, ce qui concordait avec la sortie de Symfony 1.2, qui intégrait enfin Doctrine comme un ORM de choix, ce qui tombait bien car vue la complexité de certaines requêtes du site et la puissance du DQL, nous aurions difficilement pu nous en passer.

De cette base Symfony, nous avons presque tout étendu: les classes de base bien sûr, le moteur lui même, puisque nous lui avons adjoint la puissance des composants Zend Framework, notamment pour la gestion des services tiers (FatCap est un site ouvert, interfacé avec Twitter, Youtube, Dailymotion, Vimeo, Flickr, etc..), nous avons également étendu les actions de manière à ce qu’elles héritent d’une classe mère par application, qui hérite elle même d’une action commune à l’ensemble du projet, afin de factoriser au maximum le code. Idem pour les composants. Toute notre gestion des images (redimensionnement, intégration à notre système de réplication) est le fruit d’une nouvelle classe de traitement de l’upload des fichiers (qui étend sfValidatedFile), et qui se base sur des fichiers de configuration puissants afin de déterminer la liste des miniatures à effectuer, des emplacements de stockage, etc… L’ensemble des modèles de données est étendu grâce à des templates doctrine, comme par exemple le choix du serveur pour afficher une image, ou encore la réplication S3, le tout en minimisant les requêtes et le temps d’affichage, et en rendant toutes les actions longues asynchrones.

L’ensemble de cette belle machine est surveillée par des milliers de tests fonctionnels et unitaires, et servie par un cluster de serveurs répartis dans le monde, avec des systèmes de réplications de bases de données complets, une utilisation intensive de memcache, et un accent fort mis sur la sécurité. La base de données est constamment “purifiée” par une cinquantaine de démons qui tournent à longueur de journées et de nuits, et qui s’appuient sur un logging statistique étendu pour garder une base de données propre, qualifiée, et à jour (qui sert aussi à produire les différents graphiques sur le site).

En bref, un très long projet, et une belle prouesse technologique pour SeedWeb, qui synthétise l’ensemble de nos champs d’expertise, et qui correspond à notre positionnement ambitieux de s’employer à produire des sites de très haute qualité, facilement extensibles et utilisant un éventail de technologies matures et professionnelles, en utilisant notre expertise en marketing internet et en ergonomie pour maximiser l’expérience utilisateur, et diminuer les couts d’acquisition.