Abonnez-vous aux 
Articles
Commentaires

tip pour Emacs

Pour avoir un thème de couleur vert reposant les yeux dans emacs il suffit de mettre ceci dans un fichier .Xresources puis relancer sa session X :

emacs*Background: DarkSlateGray
emacs*Foreground: Wheat
emacs*pointerColor: Orchid
emacs*cursorColor: Orchid
emacs*bitmapIcon: on
#emacs*font: -adobe-helvetica-*-r-*-*-14-*-*-*-*-*-*-*
emacs*font: -*-fixed-bold-r-*-*-15-*-*-*-*-*-*-*
emacs.geometry: 125x40

Capture-emacs

Juick

Après avoir lu l’article de Nÿco sur Juick j’ai couru tester ce surprenant service de blogging (et non pas micro). Et là surprise c’est exactement ce que j’avais imaginé comme alternative à Twitter. En effet pas de stupide limitation à 140 caractères, Juick peut donc faire office de blog. Support des photos intégré et non pas via un autre site (twitterpic). Et surtout support complet du service par Jabber : inscription et post.

Pour compléter l’article de Nÿco je trouve qu’il manque juste une passerelle vers les salons Jabber. Cela serait tout simplement énorme qu’un salon jabber puisse être associé à un groupe Juick. On aurait ainsi tout l’historique du salon sur le groupe. Par contre il manque pour gérer cela, le support des groupes dans Juick et le fait de pouvoir poster via l’interface web. J’avais pensé à ce type de fonctionnalité pour Noumba, mais le profil des utilisateurs ne permettait pas de l’envisager. Le site est très jeune mais comme il est complètement pensé autour de Jabber cela serait stupide de ne pas implémenter les salons.

Autre surprise, le business model. Enfin un site qui ne se base pas sur la pub ! Il est nécessaire de payer 9.95$ afin de pouvoir poster plus d’une image par 24 heures. On espère le support de la vidéo bien sûr. Comme l’indique Nÿco il suffit d’envoyer l’image au bot Juick depuis son client Jabber. Par contre les proxy de transfert par défaut dans Gajim ne fonctionnent pas et j’ai du ajouter celui de jabberfr (proxy.jabberfr.org). Une fonctionnalité qui permet de remplacer imageshack !

A propos de Jabber on peut constater que cela va limiter le service aux connaisseurs. Pour y remédier il faudrait a mon avis pouvoir poster via l’interface web et ouvrir une API (UPDATE : l’API existe bien ici décrite en Russe :p , et on me signale l’existence d’un client Juick , il n’utilise pas une API mais parse simplement un XML des derniers messages, ). Quant aux tags appelés hash tags sur Twitter, ils servent à compenser l’absence flagrante des groupes. J’y vois personnellement l’intérêt que sur des termes génériques. Exemple un groupe juick au lieu d’un simple tag, par contre un tag pour définir une humeur ou décrire un média. De plus sur un groupe ou un salon à la jabber on peut y définir des droits d’accès et de multiples propriétés qu’on ne peut envisager avec un simple tag. De la même manière dans un blog les tags et les catégories sont complémentaires.

D’après Nÿco, Juick est écrit en Perl/C++ et cela se ressent à la réactivité immédiate du bot et du site. Certes le nombre d’inscrit est encore très faible, cela sera à confirmer. Je regrette juste l’aspect propriétaire du site.

Pour résumer, voilà donc un site très prometteur où l’on sent que l’auteur a un peu plus de 2 de QI, car il faut vraiment être stupide pour avoir laissé des services tiers compléter les manques flagrants de Twitter… Pour l’avenir de ce type de service, je me demande juste si Google Wave ne mettra pas tout le monde d’accord, car outre des fonctionnalités étonnantes, il sera OpenSource et permettra à chacun d’utiliser son propre serveur à la manière de Jabber.

Le big switch 2

11 jours après avoir migré mon blog de mon serveur Typo vers Blogger je viens à nouveau de switcher cette fois-ci vers WordPress.com ! Je parle bien d’un hébergement chez WordPress.com, il ne s’agit pas pour moi de revenir vers un auto-hébergement… Voici les différentes raisons :

  1. WordPress fait parti des blogs les plus avancés techniquement, et il dépasse de loin le service Blogger qui ne gère toujours pas les pages et le menu par onglet sans bricoler la CSS…
  2. Il est Opensource : WordPress.org
  3. L’hébergement chez WordPress.com me permet de m’affranchir de l’administration et des mises à jour.
  4. L’import (articles, commentaires et catégories) d’un blog Blogger en 2 clics.
  5. L’export XML.
  6. 3 Go d’espace disque gratuit.
  7. widgets.
  8. Statistiques de blog sans passer par un service tiers à la Google Analytics.
  9. Leurs services payant propose le Domain mapping pour un coût extrêmement modique (9.97$ /an ce qui revient à 7.27€ /an) ce qui me permet d’utiliser mon propre domaine.
  10. Le paiement via ce type de service est un excellent moyen de financer le libre. Ce dernier point est pour moi prioritaire car il est à mes yeux indispensable d’encourager les business modèles Opensource d’autant plus lorsqu’ils atteignent ce niveau de qualité technique.

Dans de précédent billets j’ai critiqué le fait que le Libre se focalisait sur le logiciel sans penser à fournir de services. J’avoue avoir sauté chez Google sans penser à regarder mon vieux compte WordPress. La faute est réparée.

Le big switch

Suite à un problème lors d’une manipulation sur mon serveur, mon blog en typo a refusé de repartir.
Ce qui me démangeais depuis un moment a été fait, j’ai donc migré mon blog sur la plateforme de Google, blogger.
J’assume complètement le fait de céder aux sirènes du Minitel 2.0, je n’ai plus l’énergie ni l’envie de maintenir mon blog comme avant, afin de mon concentrer exclusivement sur mes projets.

Blogger a 2 avantages qui compensent le fait d’être hébergé chez le “Mal absolu” :

  1. il permet d’exporter ses données au format XML
  2. il permet d’utiliser son propre nom de domaine

Je blogue depuis 2004 ce qui constitue 264 articles de valeur très inégale. Ayant eu la flemme de faire un script d’export vers Blogger j’ai réinjecté manuellement quelques articles, les autres suivront peut être.

Typo reste néanmoins un excellent blog opensource. Cependant les nouvelles plateformes de micro-blogging comme Twitter ou Identi.ca poussent à limiter l’usage des blogs et les rendent moins incontournable.

iMotion

Cela faisait un moment que je n’avais plus posté sur iMotion, en août dernier apparemment !

J’ai repris le code pour y ajouter le support des fichiers vidéos. Je butais depuis un moment sur un problème de fige de la vidéo lors du changement d’un effet pendant la lecture, problème que je n’ai pas avec la webcam. Cette technique de changement dynamique d’un élément lors de la lecture dans le pipeline est uniquement documenté ici : cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-block.txt#n112 mais je n’ai pas trouvé de soft qui l’implémente …

Premièrement j’avais oublié l’indication 8 :

8) make sure element4 is in the same state as the rest of the elements. The element should at least be PAUSED.

Mon pipeline est en statut PLAYING donc en passant l’élément effect dans ce statut le problème de fige de la vidéo a été résolu.

Deuxièmement le schéma de la documentation montre un pipeline de 3 éléments (plus un 4 ème qui remplace dynamiquement le 2ème). Or cela m’a induis en erreur car le mien en possède 6 :

  1. filesrc
  2. decodebin2
  3. ffmpegcolorspace
  4. videoscale
  5. effectv
  6. ximagesink

Lorsque la documentation indique de bloquer l’élément 1 il s’agit en fait de l’élément qui précède celui que l’on veut remplacer. Dans iMotion je souhaite changer dynamiquement d’effet donc c’est l’élément 4 qui doit être bloqué.

Pour ceux qui débutent avec GStreamer voici une excellente présentation : blog.nicolargo.com/2009/03/gstreamer-la-theorie.html

Voici une capture d’écran avec l’effet edgetv suivie de l’implémentation correcte du code :

voidVideoManager::switch_effect (Glib::ustring a_name){   m_effect_name = a_name;   bool res = false;   GstEvent *event;

   // replay pipeline if it paused

   gst_element_get_state(m_pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);   gst_element_set_state (m_pipeline, GST_STATE_PLAYING);

   // wait until pipeline playing   if (gst_element_get_state (m_pipeline, NULL, NULL, GST_CLOCK_TIME_NONE) == GST_STATE_CHANGE_FAILURE) {std::cout << "Failed to go into PLAYING state" << std::endl;exit(1);}

std::cout << "PLAYING state" << std::endl;

GstPad *videoscale_sink_pad = gst_element_get_static_pad (m_videoscale, "sink");GstPad *videoscale_src_pad = gst_element_get_static_pad (m_videoscale, "src");

if (videoscale_src_pad) {res = gst_pad_set_blocked_async (videoscale_src_pad, TRUE, (GstPadBlockCallback) block_callback, m_pipeline);std::cout << "blocked pad : " << res << std::endl;

if (!res) {std::cout << "can not block source pad : " << res << std::endl;exit (1);} else {std::cout << "blocked source pad : " << res << std::endl;}

}else {std::cout << "can not get source pad : " << res << std::endl;exit (1);}

if (m_effect){GstPad *effect_sink_pad = gst_element_get_static_pad (m_effect, "sink");GstPad *effect_src_pad = gst_element_get_static_pad (m_effect, "src");

// remove effect elementgst_element_get_state(m_effect, NULL, NULL, GST_CLOCK_TIME_NONE);gst_element_set_state (m_effect, GST_STATE_NULL);gst_element_get_state(m_effect, NULL, NULL, GST_CLOCK_TIME_NONE);

if (gst_element_get_state (m_effect, NULL, NULL, GST_CLOCK_TIME_NONE) == GST_STATE_CHANGE_FAILURE) {std::cout << "Failed to state null on m_effect" << std::endl;exit(1);}

gst_element_unlink_pads (m_videoscale,"src",m_effect,"sink");

std::cout << "UNLINK PAD" << std::endl;

/************ seems to not be usefull ************/gst_pad_add_event_probe (effect_src_pad, G_CALLBACK (source_pad_event_probe), effect_src_pad);event = gst_event_new_eos ();gst_pad_send_event (effect_sink_pad, event);gst_object_unref (effect_sink_pad);std::cout << "SEND EOS" << std::endl;/**************************************************/

gst_element_unlink_pads (m_effect,"src",m_sink,"sink");

std::cout << "UNLINK PAD 2" << std::endl;gst_element_get_state(m_effect, NULL, NULL, GST_CLOCK_TIME_NONE);

gst_bin_remove (GST_BIN (m_bin), m_effect);

std::cout << "GST BIN REMOVED" << std::endl;

}else{gst_element_unlink_pads (m_videoscale,"src",m_sink,"sink");}

if ( m_effect_name != "none"){m_effect = gst_element_factory_make (m_effect_name.c_str(), "effect");gst_bin_add (GST_BIN (m_bin), m_effect);gst_element_link_pads (m_videoscale,"src",m_effect,"sink");gst_element_link_pads (m_effect,"src",m_sink,"sink");

// Indication 8gst_element_set_state (m_effect, GST_STATE_PLAYING);       std::cout << "new effect and linked in" << std::endl;   }   else   {       gst_element_link_pads (m_videoscale,                              "src",                              m_sink,                              "sink");

       m_effect = 0;       std::cout << "no effect" << std::endl;

   }

   if (videoscale_src_pad) {       res = gst_pad_set_blocked_async (videoscale_src_pad, FALSE,(GstPadBlockCallback) block_callback, m_pipeline);       gst_object_unref (videoscale_src_pad);   }    std::cout << "unblocked source pad : " << res << std::endl;    std::cout << m_effect_name << std::endl;}

Avec ce titre pompeux je voulais depuis longtemps écrire un article sur ce thème. Je l’avais un peu abordé avec ce billet sur beanstalkd, cependant je désirais en parler de manière plus généraliste.

Finalement le Grand Ternet a encore une fois encouragé ma feignantise car j’ai trouvé cette suite de 3 petits excellents articles sur haute-disponibilite.net qui expliquent très bien ce domaine :

A compléter avec cet article très riche d’un co-fondateur de last.fm : Anti-RDBMS: A list of distributed key-value stores. Il faut ajouter à cette liste déjà imposante l’étonnant Tokyo cabinet ainsi que nanite basé sur RabbitMQ et cela démontrera aux plus incrédules l’importance d’un bon backend asynchrone et les énormes avantages que cela apporte en terme de réactivité pour l’utilisateur.

Cependant la tentation sera certainement de plus en plus grande d’utiliser les technologies clés en main de cloud computing offertes par Google et Amazon… A quand un service de cloud computing opensource à disposition uniquement, bien sûr, des sites opensource ? :)
Pour finir, à lire également l’excellent article de Greg, {key, value} qui comporte des détails techniques et des exemples (attention par contre sur la partie memcached, car memcachedb ou memcacheq seront plus pertinent pour cet usage).

RubyCamp

Le premier RubyCamp s’est bien déroulé ce samedi. Je remercie Damien Mathieu pour l’organisation et O2Sources pour avoir sponsorisé l’évènement avec des pizzas :) .

Quelques Suisses avaient fait le trajet, Jean-Michel Garnier un expatrié en Espagne que j’avais déjà vu à Paris on Rails présentait cucumber. Guillaume Cottenceau (ancien développeur de frozen bubble) a présenté Ruby/GTK+. Damien a présenté Ruby et Gaspard Bucher un impressionnant compilateur de template (zafu).

Pour un premier Barcamp à Lyon j’ai trouvé ça très réussi et on est tous d’accord pour remettre ça cette année. Toutes les infos sur le wiki RubyCampLyon.

Photos et photos

World of Goo

Suite à cet article sur le jeu World of Goo j’ai testé la démo et j’avoue avoir été bluffé. Outre l’usage très original d’un moteur physique le jeu possède une atmosphère très prenante, qui ressemble fortement au style de Tim Burton. De plus il est extrêmement bien traduit et le fin du fin propose un portage Linux natif.

Après avoir fini le premier niveau de la démo j’ai fini par l’acheter, pour 16€ ce jeu les vaut largement. A essayer.

Dans un autre genre j’ai essayé Celetania mais pour l’instant sans succès pour obtenir du son.

RubyCamp

Je n’avais pas posté depuis 2 mois, donc puisqu’on est encore en janvier jusqu’à ce soir, je vous souhaite une bonne année :)

Comme l’indique le titre il va y avoir un Barcamp à Lyon le 21 février consacré à Ruby. Je viens de m’y inscrire, et même si je n’ai aucune idée de ce que je pourrais présenter cela sera l’occasion de revoir ce bon vieux Guillaume Desrat ainsi que Lucas Bonnet :)

Avec de la chance j’aurais peut être avancé un peu sur mon projet perso en Rails, et aurais 2-3 trucs à dire… En tout cas ça serait bien que ce genre de réunion soit récurrente, car c’est très frustrant de voir régulièrement des actions à Paris et rien à Lyon.

before_filter :rails_party

Si vous suivez l’actualité RubyonRails, vous savez sans doute que l’édition 2008 de Paris on Rails a lieu le 1er décembre à la Cité des sciences. Par contre vous ne savez peut être pas qu’une Rails party est organisé la vieille ce dimanche 30 novembre. Toutes les infos ici : rails party 2008 et inscription ici. Ils ont bien de la chance ces parisiens ! Quand est-ce que Lyon sera à la hauteur de sa dimension … ?

Pour enchainer sur le thème Ruby, j’ai réalisé une nouvelle et sans doute dernière version de Geekast 0.1.3 afin de fixer ce bug. Peercast n’étant plus maintenu par son développeur la motivation n’y est plus et je suis de plus en apprentissage du C++ sur iMotion un autre projet perso. Quoi qu’il en soit je ne compte pas abandonner Ruby qui est un vrai plaisir à utiliser et complémentaire à un langage compilé.

Messages Plus Anciens »