Home-made name badge pcb with scrolling messages on led display

For people at FOSDEM 2012 (great event by the way!), you’ve surely seen my name badge around. For others, here is a picture :

As promised to some people there, here are all the details :

I used an MSP430F5171 16-bit ultra low power microcontroller (mcu), and my own arduino port for that platform (that supports nearly all the msp430G, MSP430F2xxxx and msp430F5xxx by the way, with all their ports, and pwm on all the ports if needed).

However, to save some room on the board and to limit the bill of materials, I haven’t used any resistors, playing on the multiplexing effect and praying that the mcu would handle that current (very bad practice for production designs, but for an experimental name badge… ;)).

Enough chatting, here is the schematic :

And pictures of the badge being built :

If you wonder how I made the pcb, I used the toner transfer method (cheap store catalog paper and laminator), with traces as small as 6 mil, so it works perfectly once you’ve tried all the methods on the web and found the one that is ok for you. I hand soldered all the components using a regular iron.

And, finally, of course,a video of it scrolling :

As you may see, there is a final row on the right that doesn’t light up, that’s because I tried to put high intensity blue smd leds, that took too much current from the mcu pin, another reason why it’s a bad practice to do what I did without resistors there was just a badly soldered via, now fixed :)

If I had to to do it again, I’d probably use real led drivers, but trying to find some that are low power (it’s a name badge after all and it runs on battery) and maybe use a bigger resolution, as reading it with a 5×3 font was a bit hard.

If people are interested, I can publish the code here if needed, and I’ll of course post a full version of my arduino lib for msp430 as open source soon don’t worry :)

Have any question ? Use the comments :)

Electroménager sur internet : galère assurée (Mondial Relay & Discounteo)

Edit du 24/10: titre changé, voir la fin du post pour la mise à jour.

Revenons il y a un mois. je me dis que je peux refaire ma cuisine : Je me prépare donc à acheter mon électroménager (four, plaques, lave vaisselle…).

Or, j’avais entendu parler d’un site appelé Discounteo, que j’avais déjà utilisé pour faire un achat.

Hop, commande passée pour le tout sur ce site début Octobre (“pourquoi passer par plusieurs vendeurs, la livraison sera plus simple si je fais tout sur le même site”). Grand mal m’en a pris.

Je m’explique, pour une partie de la commande (assez lourde), je dois aller en point relais mondial relay. Ce que j’ai fait : c’était lourd à porter mais soit.

Pour l’autre, moyennant finance (80 euros tout de même), ils me le livrent chez moi; Premier rendez-vous fixé pour la livraison 2 semaines après la commande (un peu tard, mais bon, ça peut arriver). Les livreurs arrivent et ne me livrent que de la moitié, l’autre étant pas complète dans l’entrepôt.

J’appelle le service Mondial Relay (le transporteur) pour comprendre, et on m’explique que le reste de ma commande est perdue dans des entrepôts : ils ne savent pas où et vont mener une enquête mais pas avant le lendemain. Le lendemain arrive, je rappelle (une nouvelle fois 40 minutes d’attente pour avoir quelqu’un), et ils ont retrouvé un colis sur deux mais refusent de livrer partiellement.

Quelques jours plus tard, le 18 Octobre (ils arrivent enfin à retrouver les colis), ils acceptent de fixer un rendez-vous le Jeudi 20 Octobre (le Mercredi étant “complet), je prend donc ma journée de congés pour recevoir le transporteur. Le transporteur ne passera pas. La raison ? Ils auraient “oubliés” mes colis au dépôt… Avec les excuses de Mondial Relay, nouveau rdv pris pour le samedi 22 Octobre entre 8h et 13h, cette fois ci “promis juré vous aurez vos colis”…. Ah.

Et Aujourd’hui, 14h30, ais-je reçu mes colis ? Non. Transporteur aux abonnés absents, et numéro de téléphone injoignable…

Petit check avec Discounteo sur leur site et remboursement impossible. En attenant j’ai une arrivée d’eau ouverte et ne peux pas ouvrir les robinets. Merci Discounteo :)

Hop, donc pour résumer, si vous voyez Mondial Relay sur un site pour la livraison, fuyez. Et si les prix de Discounteo vous attirent, fuyez aussi.

Je vous tiens au courant sur la façon dont les choses évoluent. Si vous avez une idée sur les démarches que je peux entreprendre, je suis tout ouïe.

ps: il semblerait que je ne sois pas le seul, et @dansuncoin sur twitter a eu des déboires du meme genre avec Mondial Relay.

Addendum du 24/10:

J’ai reçu ma commande plus tard dans l’après midi de Samedi, après les horaires de livraison. Manque de chance, l’article restant a reçu un coup pendant le transport invalidant ainsi je pense (j’espère que non, mais bon) la garantie ainsi que l’extension de garantie que j’ai payé.

Pour faire une réclamation il faut que j’envoie une lettre recommandée confirmant mes réserves émises au transporteur car elles ont été barrées (cool le transporteur d’ailleurs…). J’abandonne, j’aurai un appareil à plus de 300 euros ayant un coup, mais plus de commande en ligne sur ce site ni par ce transporteur à l’avenir pour moi.

Je clos cet épisode ici, et désolé pour cet interlude personnel :) Je reviens avec des actualités plus intéressantes bientôt, promis !

ps: j’ai été contacté par des personnes de Discounteo sur twitter suite à ce post et je les remercie de leur réactivité.

Addendum du 25/10:

J’ai été recontacté par Discounteo qui a voulu que j’envoie le bon de livraison avec mes réserves par email, ce que j’ai fait.

Après m’avoir proposé un geste commercial si le transporteur l’acceptait, ils m’ont recontacté en me disant que ce n’était pas possible, mais que ma garantie s’appliquerait même avec un produit ayant reçu un coup, et que si je voulais ils pouvaient renvoyer le transporteur chercher le produit pour m’en livrer un autre par la suite. N’étant pas masochiste, j’ai refusé : fin de l’histoire, et tous les acteurs ont campé sur leurs positions sans aucune évolution.

Je confirme mon avis, évitez ces deux acteurs du e-commerce pour vos achats en ligne.

La programmation en flux, c’est facile avec PyF 2.0

Comme vous le savez peut-être, je participe beaucoup à un framework (boîte à outil applicative) de programmation en flux appellé PyF.

Nous venons de sortir la version 2.0, et j’ai pensé que ce serait une bonne occasion de le présenter ici (j’ai utilisé le très bon article de Mathieu comme base pour cette présentation).

PyF est un framework Python permettant d’écrire des application de traitement, analyse et modification de données de façon très légère et pouvant gérer de très gros volumes simplement. PyF est un logiciel libre et gratuit sous licence MIT.

PyF est bâti autour du concept de programmation en flux:
À la place de traiter « une certaine quantité de données » tout à la fois, on traite un flux de données de façon à n’avoir qu’un seul objet en mémoire qui passe à travers toutes les étapes du graphe, puis on passe à la suivante. Par exemple, traiter toute votre énorme base de clients et générer des rapports ne va pas mettre votre serveur à genoux, mais au contraire paraîtra une tâche tout à fait anodine.

Pour arriver à la programmation en flux, PyF utilise les générateurs Python (sans avoir besoin d’extensions de python comme stackless pour ceux qui connaissent):
Chaque étape de la chaine de traitement prend un générateur en entrée et renvoie les items dès qu’il les a traités (ou un objet tous les n items, ou en rendant simplement la main pour envoyer un rapport d’aggregat à la fin sans troubler les autres branches). PyF peut même gérer un flux de données ininterrompu, en continuant à traiter les données dès qu’elles arrivent, en les renvoyant dans la foulée.

Pour entrer dans les détails, PyF est composé de plusieurs couches :

  • Dans les niveaux les plus bas, vous trouverez des fonctionnalités qui vous aideront à écrire des applications utilisant la programmation en flux
  • Au niveau intermédiaire, vous pouvez lancer des process dans votre application en utilisant tout l’écosystème de plugins (ou écrire les votres)
  • Au plus haut niveau vous trouverez en revanche une application web complète qui vous permettra de concevoir graphiquement vos chaines de traitement (nous les appelons les tubes) en insérant et liant les composants de traitement par simple glisser-déposer. Nous proposons plusieurs composants génériques qui peuvent être utilisés pour faire toutes sortes d’extraction, traitements, sorties et rapports et vous pouvez créer les votres très simplement (ou les prototyper en codant directement dans l’interface graphique avec un IDE intégré). Il y a même un scheduler avec lequel vous pouvez planifier le lancement de tâches.

Nous avons écrit un tutoriel pour l’installation de PyF, et une série de tutoriels pour faire vos premiers pas. (en anglais pour l’instant, mais si vous voulez aider à la traduction vous êtes les bienvenus !)

Il y a déjà de la documentation qui devrait être plus que suffisante pour commencer, même si nous travaillons actuellement à la rendre plus complète.

À propos des changements dans la version 2.0, un des plus importants est l’ajout du multiprocessing: vous pouvez envoyer les composants de votre choix dans des process séparés (pour utiliser tous les processeurs de votre machine) avec une simple case à cocher dans le designer.

Si vous avez une quelquonque question, vennez sur notre mailing-list ou notre salon irc:

Oh et bien sûr n’oubliez pas de visiter le site internet http://pyfproject.org/ et d’aller voir les captures d’écran du designer et de l’interface web.

Data-flow made easy: PyF 2.0

As you may know, I work a lot on a python flow-programming framework named PyF.

We just released its 2.0 version, and I thought it may be a good occasion to present it here (I used Mathieu’s article as a basis for this presentation):

PyF is a Python framework for writing highly scalable data processing, data mining applications, and more. PyF is Free software, distributed under the terms of the MIT license.

To achieve the scalability, PyF is based on flow programming: instead of processing « a certain quantity of data », we process a « flow » of data, so that at any point, we only ever have one object in memory, no matter how much data we will process in total. That’s right, mining your huge customer database and generating reports with PyF will not take your servers down to their knees.

To achieve this, we use Python generators (no need for python extensions like stackless):

Each unit of the whole processing chain takes a generator as input and yields values as soon as they were processed. We could even handle a never ending flow of input data and keep processing them, yielding each one after the other!

Now, down to the details, PyF is composed of several layers:

  • At the low level, you have only the basic subset of core functions that will help you write flow-based applications.
  • At the mid level, you can run your processes in your application, using a wide range of plugins (or writing your own)
  • At the highest level though, you will find a full-blown web application that allows you to graphically design your processing chain (we call it a tube) by dragging and dropping processing units (we call them components) and chaining them, output to input. We have several default generic components that can be used to do all sorts of processing and reporting already, and it is pretty easy to write your own if necessary (we will gladly help in any case). We even have a built-in scheduler so you can specify when to automatically launch your processes!

We wrote a simple tutorial to get PyF, and a series of tutorials to actually make your first steps.

We already have some documentation which should be more than enough to get you started, although we are working on making it more comprehensive.

About the new things in 2.0, one of the most exciting is the addition of multiprocessing: you can move any node in your tube to a separate process with a simple checkbox.

If you have any question, come hang out on our mailing-list or our IRC channel:

Oh, and of course, visit our website: http://pyfproject.org/

Les régions de France selon l’auto-completion Google Suggest

Comment est-ce que Google voit les régions de France, ou plutôt, qu’est-ce que nos recherches renvoient sur nos régions ?

A l’image de ce qui a été fait avec les carte des états unis selon google autocomplete, j’ai préparé cette petite infographie sous la forme d’une carte de France où les régions sont nommées selon les premières suggestions de recherche de google lorsque l’on tappe leur nom.

La France des régions par Google Suggest
Cliquez sur l’image pour la voir en taille réelle.

Pour info, lorsque le premier résultat est une adresse de site web (de la région par exemple), ce résultat n’est pas pris en compte et on passe au suivant. Lorsqu’un autre résultat pertinent lui aussi est juste après un résultat commun, il est également mis en “alias” sous le nom de la région (en italique).

Résultats d’autocompletion obtenus grâce à Google.

14

Programmation python en flux: PyF

22 Sep 2010 at 15:15

admin

Développement, Python

1 Comment

PyF est un framework très complet de programmation en flux en Python, avec un éditeur graphique, un système de plugin, un webservice, un scheduler, etc.

J’ai fait une présentation à PyCon FR à ce sujet il ya de cela quelques semaines et les vidéos ont été mises en lignes.

Plutot que de rentrer dans les détails dans cet article, je vous invite à regarder cette présentation :

Pour plus d’infos, rendez-vous sur pyfproject.org :-)

13

Créer des PDF en Python avec Genshi et RML: pyjon.reports

15 Jun 2010 at 20:35

admin

Développement, Python

4 Comments

Attention, cet article est technique… Si vous ne vous intéressez pas au développement en python, passez à l’article suivant :)

Vous voulez faire des rapports en pdf, envoyer des lettres ou une quelquonque autre action nécéssitant de la génération de PDF ?

Si vous êtes aguéris du monde python vous avez surement entendu parler de ReportLab.
Oui, mais l’ennui c’est que pour faire du reportlab, il faut faire du développementur et dur. Et lorsque l’on change sa template, il faut tout faire.

La solution, c’est RML, language xml permettant de génerer des pdf avec des feuilles de styles, en séparant en partie le contenu et le contenant (dans différentes parties du xml) fait par la société éditrice de reportlab.

Le hic ? le parseur de ce language est sous license propriétaire…
Heuresement, l’équipe de Z3C a fait z3c.rml, une implémentation libre de ce language.

Maintenant, on peut faire du RML à la main, mais pour générer des fichiers rml avec vos données, c’est plus dur. Les languages de templates me direz vous ? Oui, justement.

Votre serviteur a fait une librairie permettant d’automatiser ca en utilisant des templates genshi (language de templating xml particulièrement adapté à la tache), dans une classe gérant le tout.

Autre problème : reportlab monte en mémoire lorsque l’on a des pages chargées ou beaucoup de pages tout simplement.
Solution : pyjon.reports vous permet d’ajouter des sections petit à petit à votre document, et à la fin de générer un seul pdf avec toutes les sections (grâce à pypdf).

Pour les plus pressés, rendez-vous directement sur les exemples.

Cas concret : une table de données

D’abord initialisons une factory (classe permettant de rendre plusieurs documents en un) :

from pyjon.reports import ReportFactory
factory = ReportFactory()

Maintenant créons un fichier test.xml contenant notre template xml :

<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<!DOCTYPE document SYSTEM "rml_1_0.dtd">
<document xmlns:py="http://genshi.edgewall.org/">
<template pageSize="(595, 842)" leftMargin="72" showBoundary="0">
  <pageTemplate id="main">
    <frame id="first" x1="1in" y1="1in" width="6.27in" height="9.69in"/>
  </pageTemplate>
</template>
<stylesheet>
  <blockTableStyle id="mynicetable" spaceBefore="12">
    <lineStyle kind="OUTLINE" colorName="black" thickness="0.5"/>
    <blockFont name="Times-Bold" size="6" leading="7" start="0,0" stop="-1,0"/>
    <blockBottomPadding length="1"/>
    <blockBackground colorName="0xD0D0D0" start="0,0" stop="-1,0"/>
    <lineStyle kind="LINEBELOW" colorName="black" start="0,0" stop="-1,0" thickness="0.5"/>
    <!--body section-->
    <blockFont name="Times-Roman" size="6" leading="7" start="0,1" stop="-1,-1"/>
    <blockTopPadding length="1" start="0,1" stop="-1,-1"/>
    <blockBackground colorsByRow="0xD0FFD0;None" start="0,1" stop="-1,-1"/>
    <blockAlignment value="right" start="1,1" stop="-1,-1"/>

    <!-- closing the table when restarting it on next page -->
    <lineStyle kind="LINEBELOW" colorName="black" start="0,splitlast" stop="-1,splitlast" thickness="0.5"/>
  </blockTableStyle>
</stylesheet>
<story>
  <h1>$title</h1>
  <blockTable repeatRows="1" style="mynicetable">
    <tr><td py:for="i in range(10)">Row ${i}</td></tr>
    <tr py:for="line in data"><td py:for="col in line" py:content="col" /></tr>
  </blockTable>
  <para py:content="dummy" />
</story>
</document>

Rergardons cette template de plus près :

Maintenant utilisons cela pour générer un fichier :

template = 'test.xml'
testdata = [range(10)] * 100

factory.render_template(
        template_file=template,
        title=u'THE TITLE',
        data=testdata,
        dummy='foo')

Ici, on a passé une jeu de données contenant les chiffres 1 à 9, 100 fois (100 listes).
On a aussi passé plusieurs variables utilisées dans la template.

On veut ajouter une autre section avec la même template ? Pas de problème !

factory.render_template(
        template_file=template,
        title=u'THE TITLE 2!',
        data=testdata,
        dummy='bar'
        )

Créons un seul fichier pdf contenant les deux parties, et finalisons l’objet :

factory.render_document('test.pdf')
factory.cleanup()

Et voilà, aussi simple que cela :)

Comment l’installer ?

Pour installer pyjon.reports, c’est simple : “easy_install pyjon.reports”, vous pourrez avoir des pdf dans vos applis en 5 minutes.

Si vous voulez regarder les sources ou contribuer, rendez-vous sur bitbucket : http://bitbucket.org/jon1012/pyjonreports

Pour plus d’infos :

9

Create PDF in Python using Genshi and RML with pyjon.reports

15 Jun 2010 at 20:35

admin

Development, Python

4 Comments

Warning, this article is technical… If you don’t care about python development, skip it :)

You want to create pdf reports, send letters or any other action needing pdf documents ?

If you are a python expert, you’ll have surely heard about ReportLab. Yeah, I know, to use it, you need to code it, and when you change your template you have to do everything again.

A solution to that, is to use RML, an xml language done by the company that created reportlab. RML permits to use stylesheets, and to have an xml document that generates the pdf (just like html).

There is a problem with RML. The reference handler, (Reportlab RML) isn’t free (neither as in beer nor as in speech)… But the fabulous guys at Z3C did an open source handler for RML, z3c.rml !

Just one problem : when you create big documents, the process will crawl, take all your ram and die badly. The solution to that aspect ? using PyPDF to join pdf files into one (one template per document part).

Now, here comes the real deal : we will template that xml, just like we would do for html, using an xml templating language : genshi.

To ease that task, I’ve made a little python lib that handles the templating, the merging of various documents into one and much more.

For the most impatient, head directly to the examples ! :)

How to use it ?

Example case : a data table

First, let’s initialize a factory (a class that allows to create various documents and join them in one pdf):

from pyjon.reports import ReportFactory
factory = ReportFactory()

Now let’s create a test.xml file containing our template:

<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<!DOCTYPE document SYSTEM "rml_1_0.dtd">
<document xmlns:py="http://genshi.edgewall.org/">
<template pageSize="(595, 842)" leftMargin="72" showBoundary="0">
  <pageTemplate id="main">
    <frame id="first" x1="1in" y1="1in" width="6.27in" height="9.69in"/>
  </pageTemplate>
</template>
<stylesheet>
  <blockTableStyle id="mynicetable" spaceBefore="12">
    <lineStyle kind="OUTLINE" colorName="black" thickness="0.5"/>
    <blockFont name="Times-Bold" size="6" leading="7" start="0,0" stop="-1,0"/>
    <blockBottomPadding length="1"/>
    <blockBackground colorName="0xD0D0D0" start="0,0" stop="-1,0"/>
    <lineStyle kind="LINEBELOW" colorName="black" start="0,0" stop="-1,0" thickness="0.5"/>
    <!--body section-->
    <blockFont name="Times-Roman" size="6" leading="7" start="0,1" stop="-1,-1"/>
    <blockTopPadding length="1" start="0,1" stop="-1,-1"/>
    <blockBackground colorsByRow="0xD0FFD0;None" start="0,1" stop="-1,-1"/>
    <blockAlignment value="right" start="1,1" stop="-1,-1"/>

    <!-- closing the table when restarting it on next page -->
    <lineStyle kind="LINEBELOW" colorName="black" start="0,splitlast" stop="-1,splitlast" thickness="0.5"/>
  </blockTableStyle>
</stylesheet>
<story>
  <h1>$title</h1>
  <blockTable repeatRows="1" style="mynicetable">
    <tr><td py:for="i in range(10)">Row ${i}</td></tr>
    <tr py:for="line in data"><td py:for="col in line" py:content="col" /></tr>
  </blockTable>
  <para py:content="dummy" />
</story>
</document>

Let’s have a look at this template:

Now let’s generate a document with this template:

template = 'test.xml'
testdata = [range(10)] * 100

factory.render_template(
        template_file=template,
        title=u'THE TITLE',
        data=testdata,
        dummy='foo')

We passed various variables and a data list (testdata) containing the numbers 0 to 9, 100 times: [[0, …, 9], …, [0, …, 9]].
Please note that all keyword arguments passed to the function (beside template_file or template_string) are passed to the genshi template, and accessible as root variables there.

Needing to add another secion in the document with the same template ? No problem !

factory.render_template(
        template_file=template,
        title=u'THE TITLE 2!',
        data=testdata,
        dummy='bar'
        )

Eventually, we will create a single pdf files, with all the content, finalising the factory (cleaning it):

factory.render_document('test.pdf')
factory.cleanup()

And voilà! It’s as simple as that.

How to install it ?

To install pyjon.reports it’s very simple: just type easy_install pyjon.reports in your console (in a virtual env or globally), and you’ll be able to generate pdf documents in your applications in less than 5 minutes.

If you want to see the source code or contribute, see the bitbucket page: http://bitbucket.org/jon1012/pyjonreports

For more info:

9

New blog…

14 Jun 2010 at 19:09

admin

Unclassified

7 Comments

Hi dear readers.

What you did know as JonDesign disappeared. But fear not, as instead comes my personnal blog, hopefully updated much more often!

I’ll blog about tech, development (python, css, javascript), design or otherwise interesting news and tutorials.

SmoothGallery continues to live at http://smoothgallery.jondesign.net/.

For all contact about professionnal activities, please use my company website (JMSI).

See you soon here !

18

Nouveau blog…

12 Jun 2010 at 18:39

admin

Non classé

2 Comments

Bonjour à tous, fidèles (ou moins fidèles) lecteurs.

Ce que vous connaissiez comme JonDesign disparait, et à sa place vient mon blog personnel, dans lequel je parlerais d’actualités technologiques, de développement python ou javascript, de design, etc…

La SmoothGallery continue à vivre, mais pour tout contact à propos de  mes activités professionnelles, il faudra me contacter sur le site de mon entreprise : JMSI.

N’hésitez pas à me faire part de votre avis sur la direction que devrait prendre le blog dans les commentaires.

J’espère que la nouvelle formule vous plaira, à bientôt !