jeudi 9 juillet 2015

la désillusion du loto

Un petit site pour essayer de nous faire comprendre pourquoi on ne gagnera probablement jamais au loto:
http://chronoloto.com/index.php

Comme disait mon prof de math au lycée, pendant le cours de probabilités: avec une chance sur plusieurs millions, on paie un impot volontaire pour rêver un peu.
Il aimait bien rêver!

Le retour de la vengeance des robots compagnons: buddy

Buddy: le nouveau projet de robot compagnon à financement participatif (français!)
https://www.indiegogo.com/projects/buddy-your-family-s-companion-robot#/story

Ca comprend:
- une tablette 8 pouces (20.3 cm, système métrique, bordel de merde!!) qui peut tourner sur 2 axes 
- une petite base mobile qui comprend des capteurs d'obstacles
- connectivité wifi et bluetooth pour éventuellement commander ton bordel à la maison
- en option, un bras incluant un pico projecteur

Il rejoint la course des robots, relativement abordables, qui se veulent utiles dans la maison, et qui comprend quelques poids lourds dont:

Je suis curieux de voir ce que vont donner tout ces robots à l'utilisation. J'ai peur que la compréhension du langage soit un gros frein à leur adoption en masse.
Avec Siri ou Google Now, il faut régulièrement se répéter pour qu'un ordre soit compris correctement, et du coup, je m'en passe complètement. 
Dans une maison avec du bruit autour, si t'es pas juste à côté du robot, ca risque d'être encore pire.

vendredi 22 mai 2015

un ordinateur à 9$

plus fort que le raspberry pi ou arduino!
..en tout cas, moins cher et qui fait plein de trucs:
https://www.kickstarter.com/projects/1598272670/chip-the-worlds-first-9-computer

CHIP comprend: CPU, GPU, RAM, disque dur, wifi, bluetooth 4.0, micro USB, sortie composite video, entrée micro, sortie headphone, entrees/sorties analogiques et numeriques.
Et tout ça tourne sur une debian, à peu près, de base avec interface graphique.
ideal pour un ordi pour enfant ou une multitude de projets robotiques ou IoT (Internet of Things)

Par contre, ca n'est livré que l'année prochaine (...si ca n'est pas juste un beau rêve qui ne se réalisera pas)

vendredi 24 avril 2015

bande annonce ICRA 2015

La plus grosse conférence internationale en robotique aura lieu le mois prochain a Seattle, USA.
THE rendez-vous incontournable pour tous les chercheurs en robotique afin de se tenir au courant des dernières avancées dans les différentes branches!
Pour décider les indécis, allecher les participants et partager quelques infos aux absents, cette année, il y a un trailer sur youtube, et en francais, en plus!
Alors, ça manque un peu de joie de vivre et d'entrain dans la narration, et, bien sur, il manque tous les travaux qui ne sont pas livrés avec vidéo... mais ça reste intéressant! J'espère qu'ils pousseront l'idée un peu plus loin d'année en année.

jeudi 23 avril 2015

Technique de log .NET C#: TraceSource et FileLogTraceListener

.NET possède un système pas trop mal pour logger différents types d'infos dans des fichiers de façon relativement simple. En fait, plusieurs façons de le faire existent mais je ne détaille que la méthode retenue qui correspond à ce que je cherche en ce moment: TraceSource et FileLogTraceListener.

La classe TraceSource nous donne accès à quelques méthodes et constantes pour enregistrer plusieurs types d'informations de côté. Ces informations peuvent être filtrées et récupérées par des Listener qui peuvent les afficher dans des consoles ou les enregistrer dans des fichiers.

FileLogTraceListener range les infos qu'on lui dis de récupérer dans un ou plusieurs fichiers en fonction de la date ou divers autres paramètres.

Dans mon code source .cs:

using System.Diagnostics;
using Microsoft.VisualBasic.Logging;
...
class Program{
    // défini un TraceSource avec un nom spécifique   
    static TraceSource tracer = new TraceSource( "mesTraces" );
   
static void Main( string[] args )    {       
    int idTrace = Process.GetCurrentProcess().Id;
    // change le nom de base du fichier de log utilisé pour les traces       
    var ecouteurs = tracer.Listeners;   // récupère la liste des listeners liés à mon TraceSource          
    for( int i=0; i<ecouteurs.Count; i++ ) {
        try{
            var ecout = (FileLogTraceListener)ecouteurs[i];
            ecout.BaseFileName = "TestTraces-"+ args[1];   // le nom du fichier log généré sera du type TestTraces-<nom donné en argument d'entrée>-<date du jour>
            break;
        }catch( Exception e ){}       
    }
    ...

    tracer.TraceEvent( TraceEventType.Information, idTrace, "infos blabla" );
    ...
    tracer.TraceEvent( TraceEventType.Warning, idTrace, "Attention!" );
    ...
    tracer.TraceEvent( TraceEventType.Error, idTrace, "Gros Problème!" );
    ...
    tracer.Close();
}
}


Bref, pas trop de trucs compliqués à gérer dans le code!
- on ajoute les using qui correspondent
- on définit et initialise un TraceSource
- optionnellement, on peut modifier le nom de base du fichier crée par les listeners lié au TraceSource
- on logge les infomations que l'on veut avec la fonction TraceEvent qui nous permet d'indiquer le type d'informations (voir les Trace Event Type), un entier que l'on peut utiliser comme on veut, et notre message
- on ferme le Tracer quand on en a plus besoin

La gestion des infos loggées peut se faire dans le code source directement, mais j'ai préféré mettre tout ca dans le fichier de configuration de façon à pouvoir modifier le comportement sans avoir à tout recompiler.

Dans mon app.config:

<system.diagnostics>
    <!-- switchValue= Off, Error, Warning, Info, Verbose -->
    <sources>
      <source name="mesTraces" switchType="System.Diagnostics.SourceSwitch" switchValue="Verbose">
        <listeners>
          <add name="ecouteurFileLog"                type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
               Location="ExecutableDirectory"
               logFileCreationSchedule="Daily"
               baseFileName="ListingPrint"
               traceOutputOptions="Timestamp" />
          <remove name="Default" />
        </listeners>
      </source>
    </sources>
</system.diagnostics>


La, c'est un peu plus verbeux..
- dans la définition de la source, on indique le nom du TraceSource à regarder = le nom donné à ton TraceSource dans le code source.
- switchValue permet de dire quelles informations vont être sauvegardées dans le fichier. Off: on ne met rien, Verbose: on met tout, ...
- on peut ajouter plusieurs listeners par source pour avoir plusieurs fichiers de log différents ou pour afficher aussi les logs à l'écran...
- mon FileLogTraceListener a un type qui est long à définir.. mais il faut tout ca sinon on a des problèmes à l'exécution!
- quelques paramètres à donner au listener (voir la page MSDN pour plus de détails). A noter que les dates et heures récupérées avec les options traceOutputOptions DateTime et Timestamp sont UTC, pas locales! ...et ca ne se configure pas..
- de base, FileLogTraceListener ajoute la date du jour au nom de fichier de log généré!

Bon, ca n'est pas parfait:
- les infos rajoutées à chaque ligne du fichier log sont dans un ordre défini:
    nom du traceSource, id, type de message, message, traceOutputOptions
si tu veux mettre la date au début ou virer le nom du traceSource, tant pis!

- les dates/heures du traceOutputOptions sont en UTC! Donc vive le calcul mental, ou alors tu laisses tomber le traceOutputOptions et tu intègres la date locale dans chacun de tes messages (surcharges des fonctions traceEvent, ...)

Après, rien ne nous empêche de créer notre propre listener selon nos envies.

Premier pas en robotique pour les tout petits


 
J'entends parler seulement maintenant de kinder lab robotics qui propose des kits jouets robotique pour les tout petits.
Ils proposent des sets de pièces en bois/plastique/électronique qui s'emboitent facilement pour créer un robot mobile (ou pas).

Le comportement du robot se programme en assemblant des gros cubes: pas besoin de savoir lire pour créer le programme!

Les tout petits peuvent s'initier avec ce kit et, en grandissant, continuer la programmation avec Scratch, ou la robotique avec Lego Mindstorms.

mardi 18 novembre 2014

langage D et SDL

Comment utiliser la librairie SDL dans son programme en langage D?
Ca m'a pris des efforts et de la sueur donc je sauvegarde les etapes, de l'installation des outils jusqu'a la compilation d'un exemple, pour des futures references.
Pour ce projet, j'utilise Debian 6 sur un eeepc 901.

A voir:
- le langage D : http://dlang.org/download.html
- la librairie SDL : http://www.libsdl.org/
- le 'package' Derelict : http://dblog.aldacron.net/derelict-help/using-derelict/

Les etapes:

1 - creer le repertoire ou on range tout (dans mon cas: /home/user/tetorea/DerelictOrg):
    cd
    mkdir DerelictOrg
    cd DerelictOrg

2 - installer le compilateur D
voir la page http://dlang.org/download.html pour les details
Dans mon cas, Debian sur eeepc 901, il a suffit de telecharger et lancer le fichier dmd_2.066.1-0_i386.deb avec:
         sudo dpkg -i dmd_2.066.1-0_i386.deb

3 - installer SDL2
telecharger le code source : http://www.libsdl.org/download-2.0.php
dans mon cas : http://www.libsdl.org/release/SDL2-2.0.3.zip
decompresser dans le repertoire DerelictOrg
compiler et installer
    cd SDL2-2.0.3
    ./configure
    make
    sudo make install

4 - installer dub
on en a besoin pour compiler les packages suivants!
j'ai recupere sur cette page http://code.dlang.org/download, le fichier :
    http://code.dlang.org/files/dub-0.9.22-linux-x86.tar.gz
decompresse et copie dans le repertoire /usr/bin

5 - installer DerelictSDL2
DerelictSDL2 fait partie de la repository DerelictOrg sur Github. On a egalement besoin de DerelictUtil pour installer DerelictSDL2!
Pour installer tout ca, on a besoin de recuperer les sources en passant par git (pour installer git: sudo apt-get install git).
Dans le repertoire DerelictOrg:
    git clone https://github.com/DerelictOrg/DerelictUtil.git
    git clone https://github.com/DerelictOrg/DerelictSDL2.git
    cd DerelictUtil
    dub build
    cd ../DerelictSDL2
    dub build
   
6 - on peut programmer en D avec SDL2 !

Copier le texte suivant dans un fichier test.d, dans le repertoire DerelictOrg :
--------------------------------------
import std.stdio;
import std.conv;

import derelict.sdl2.sdl;

void main()
{
    DerelictSDL2.load();

    if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
        writeln( "SDL could not initialize! SDL_Error: "~ to!string( SDL_GetError() ) );
        return;
    }
   
    SDL_Window *sdlWindow;
    SDL_Renderer *sdlRenderer;
    SDL_CreateWindowAndRenderer( 0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP, &sdlWindow, &sdlRenderer );

    SDL_SetRenderDrawColor( sdlRenderer, 0, 100, 0, 255 );
    SDL_RenderClear( sdlRenderer );
    SDL_RenderPresent( sdlRenderer );

    SDL_Delay( 2000 );

    SDL_DestroyWindow( sdlWindow );
    SDL_Quit();   
}
--------------------------------------
Ca se contente d'afficher un ecran vert pendant 2 secondes avant de quitter.


Copier le texte suivant dans un fichier Makefile, dans le repertoire DerelictOrg :
--------------------------------------
test: test.d
    dmd test.d -IDerelictSDL2/source/ -IDerelictUtil/source/ -LDerelictSDL2/lib/libDerelictSDL2.a -LDerelictUtil/lib/libDerelictUtil.a -L-ldl
--------------------------------------

et on tape:
     make
     ./test

Il n'y a plus qu'a jouer avec SDL et D...

jeudi 25 septembre 2014

recherche anti-cancer open-source et au financement collaboratif

Le projet Marilyn tente de recolter des fonds pour relancer la recherche sur une molecule prometteuse contre certaines formes de cancer (peau, sein, rein).

Les fonds seront utilises pour tester la molecule sur des souris de laboratoire, premiere etape obligatoire avant des tests sur humains.

C'est l'occasion de s'acheter des objets, bijoux et/ou vetement "science-style" tout en particiapant a la recherche scientifique.

X-Prize spécial apprentissage global

X-prize, la fondation(?) qui lance des grandes compétitions façon DARPA mais sans but militaire, s'attaque au problème de l'éducation pour tous:

http://learning.xprize.org/

Tout le monde peut s'inscrire pour tenter de développer le nec plus ultra des solutions logicielles open source qui va permettre à n'importe quel enfant d'apprendre à lire, écrire et compter tout seul au moyen d'une tablette!

En fouillant un peu dans le site, le programme semble viser d'abord l'enseignement de l'anglais MAIS il est dis qu'il doit quand même pouvoir s'adapter à l'enseignement d'une autre langue.

On peut participer en solo ou en groupe, il suffit de s'inscrire avant le 31/03/2015 en remplissant un formulaire et en payant les 500 $ de frais d'inscription.

vendredi 29 août 2014

Apprendre les réseaux de neurones et le "deep learning"

Un livre en ligne gratuit qui présente (très prochainement) les méthodes de base pour différents problèmes de reconnaissance automatique:
Les chapitres sont ajoutés au fur et à mesure.

A nous les secrets de la dernière technique à la mode dans toutes les grosses boîtes de la silicon valley!

Base de donnee Oracle et XML

Comment faire pour lire un fichier XML a partir d'une procedure stockee dans Oracle 9?

Comment creer un fichier XML?

..C'est pas trop complique, en fait, une fois qu'on a ecume internet.


1 - Un peu de preparation
(on considere que l'on range nos fichiers a lire et a ecrire dans le repertoire /home/user/xml)

- bien evidemment, il faut donner les droits de lecture et ecriture pour ce repertoire a l'utilisateur qui va lancer les procedures. Si on file les droits a tout le monde:
    sudo chmod 777 /home/user/xml

- il faut declarer a Oracle que l'on va utiliser un repertoire physique sur le disque du serveur. Pour se faire, on exécute une commande pl/sql:
    CREATE OR REPLACE DIRECTORY XMLREP AS '/home/user/xml';

- le package XML DB est bien installe dans Oracle?
lancer la requete:
    SELECT * FROM ALL_USERS;
et verifier que l'utilisateur XDB est bien dans la liste


2 - Lecture d'un fichier XML physique
exemple de script qui fait un peu de tout:

declare
  sch         varchar2(200);
  xt            xmltype;
  ordre_no varchar2(35);
  tst_sch    number;
begin
    -- un schema de base, il en faut au moins un pour la lecture des elements
    sch := 'xmlns:xs="http://www.w3.org/2001/XMLSchema"';

    -- enregistre dans Oracle le schema xsd utilise pour verifier les fichiers xml, si on en a un sous la main
    -- on donne le nom banal 'fichierxsd' a notre schema
    -- le schema est base sur le fichier 'monFichier.xsd' present dans le repertoire accessible par Oracle lie a XMLREP
    -- la, il y a une conversion de UTF-8 vers ascii car le ficdhier xsd est en UTF-8 et la base de donnees est en ascii
    DBMS_XMLSCHEMA.registerSchema( 'fichierxsd', convert( DBMS_XSLPROCESSOR.read2clob( 'XMLREP', 'monFichier.xsd'), 'US7ASCII', 'AL32UTF8' ), True, False, False, False );

    -- on lit le fichier physique 'monFichier.xml' qui doit etre present dans le repertoire lie a XMLREP.
    -- les donnees du fichier sont rangees dans un CLOB
    -- on convertit les donnees de UTF-8 (le format du fichier) vers ascii us (format des donnees de ma base de donnees) -> pas necessaire si la base de donnee utilise UTF-8 (..ce qui est mieux!)
    -- on cree un xmltype avec ces donnees
    xt := xmltype( convert( DBMS_XSLPROCESSOR.read2clob('XMLREP','monFichier.xml'), 'US7ASCII', 'AL32UTF8' ) );
    -- si le fichier n'existe pas, il y a une exception!

    -- si on veut tester les donnees XML par rapport a un XSD avec un element racine 'Noyau':
    tst_sch := xt.isSchemaValid( 'fichierxsd', 'Noyau' );
    IF tst_sch <> 1 THEN
        dbms_output.put_line( 'fichier xml ne correspond pas au schema voulu!' );
        return;
    END IF;

    -- test si il y a l'element voulu dans le fichier XML:
    IF xt.existsNode( '/Noyau/Ordre[1]' ) = 0 THEN
        dbms_output.put_line( 'xml ne contient pas ordre!' );
        return;
    END IF;
    
    -- recupere l'attribut No
    ordre_no := xt.extract( '/Noyau/Ordre[1]/@No', sch ).getStringVal();
end;


3 - Ecriture d'un fichier xml a partir de donnees de tables

declare
    xmlval  clob;
    tstXsd  number;
    xt      xmltype;
begin
    -- on cree une requete a base de xmlelement, xmlattributes et xmlagg
    -- xmlagg va ranger a la suite toutes les lignes renvoyees par la requete sql
    -- j'utilise des case when pour eviter d'afficher un element si aucun attribut de l'element n'est initialise
    SELECT XMLELEMENT("Noyau" 
                ,xmlattributes('02' as "XMLVersion" )
                ,XMLELEMENT("FileDate", xmlattributes( to_char( sysdate, 'YYYY') as "Y", to_char( sysdate, 'MM') as "M", to_char( sysdate, 'DD') as "D", to_char( sysdate, 'HH24:MI') as "T" ) )
                ,XMLELEMENT("ListDetails", xmlattributes( 'France' as "OriginID", 'Tahiti' as "DestinationID", ) )
                ,XMLAGG( 
                    XMLELEMENT( "Ordre", xmlattributes( osta.no as "No")
                        ,case when osta.state is not null then
                         XMLELEMENT( "Event", xmlattributes( osta.state as "StateCd" )
                            ,XMLELEMENT( "Date", xmlattributes( to_char( osta.evtlcldt, 'YYYY') as "Y", to_char( osta.evtlcldt, 'MM') as "M", to_char( osta.evtlcldt, 'DD') as "D", to_char( osta.evtlcldt, 'HH24:MI') as "T" ) )
                         ) end
                    )
            )).extract('/*').getclobVal()
    INTO xmlval
    FROM ORDER_STATUS osta;

    -- Ecriture du fichier physique
    dbms_xslprocessor.clob2file( xmlval, 'XMLREP', 'monFichier.xml', nls_charset_id('AL32UTF8') );

    -- verifier que le fichier a bien ete cree 
    -- et qu'il est valide par rapport au xsd
    xt := xmltype( convert( DBMS_XSLPROCESSOR.read2clob( 'XMLREP',  'monFichier.xml' ), 'US7ASCII', 'AL32UTF8' ) );
    tstXsd := xt.isSchemaValid( 'fichierxsd', 'Noyau' );
    IF tstXsd <> 1 THEN
        dbms_output.put_line( 'Erreur: fichier xml non valide!' );
        return;
    END IF;
end;


et voila!!

jeudi 28 août 2014

petite deception pour les voitures automatiques Google

MIT Review sort une mise au point sur les capacites et limitations des google car

Alors que je pensais qu'on etait bon pour se la couler douce en voiture dans les bouchons dans quelques annees, il reste plusieurs challenges a surmonter avant de pouvoir lacher le volant en tout quietude.
- Pour l'instant, les voitures gerent assez mal les routes inconnues: elles roulent surtout sur des routes prealablement mappees avec des indications claires concernant les panneaux, les feux et le marquage au sol.
- Il n'y a pas d'interpretations des objets autour: si un policier fait la circulation, il est evite mais ces indications sont ignorees.
- Un nid de poule ou un trou sur la route? Et bam, tes roues, amortisseurs, voire meme ta carrosserie!
- De la neige, de l'eau, ou une cargaison de noisettes eparpillee sur la route? Ca va serieusement fausser la detection des limites de la route et il reste a gerer la vitesse en fonction des conditions de la route.
...

Un commentateur precise, a juste titre, qu'une reelle automatisation complete de la conduite necessite une intelligence artificielle tres proche de l'humain afin de gerer de facon efficace tous les cas qui pourraient se presenter.
La, on explose les deadline..

Bref, il y a du boulot!
Rien qui ne soit pas surmontable par une equipe d'ingenieurs/chercheurs/techniciens/creatifs, mais ca va repousser de quelques annees leur sortie et leur adoption publique.
Le boss du projet chez Google se donne 5 ans, rendez vous dans 10!
...meme la, la voiture sera probablement encore au stade semi-automatique: interdiction de se regarder un film dans les bouchons!

vendredi 6 juillet 2012

Installer Windows XP sur un ordinateur sous Ubuntu

Comment installer Windows XP sur une partition de mon ordinateur sous Ubuntu (12.04) a partir d'un fichier .iso?

La solution vient de : http://superuser.com/questions/99478/make-a-bootable-usb-to-install-windows-xp-from-linux

1) on installe VirtualBox:
sudo apt-get install virtualbox
2) on donne l'acces au disque dur (sur ma machine, /dev/sda3) pour VirtualBox:
VBoxManage internalcommands createrawvmdk -filename ~/hdd.vmdk -rawdisk /dev/sda -partitions 3
En cas de message d'erreur, on ajoute les droits
sudo adduser `whoami` disk
[Edit] A mon 2eme essai, j'avais toujours une erreur pour l'acces, j'ai du modifier l'acces au disk sda
sudo chown 666 /dev/sda*
..on se delogge et relogge

3) on lance VirtualBox

4) ajout d'un nouveau systeme.
Pour le disque dur, on selectionne le fichier ~/hdd.vmdk
Pour le cdrom, on indique le fichier .iso contenant l'image du DVD d'installation de Windows XP

5) Demarre la machine virtuelle sous VirtualBox: appui sur une touche pour lancer l'installation sur la premiere partition du premier disque dur.  Ca va ecraser tout ce qu'il y a dessus!!

6) croiser les doigts..

7) quitter VirtualBox

8) mettre a jour le "demarreur" pour pouvoir booter linux egalement (Si pas ecrase par Windows!):
sudo update-grub
sudo grub-install /dev/sda
9) redemarrer l'ordinateur

jeudi 5 janvier 2012

utiliser un clavier usb externe sur macbook pro

Les resultats de ma lutte pour arriver a utiliser un clavier francais usb logitech sur macbook pro avec OSX 10.6.
La reconnaissance guidee de macos ne me sort qu'un clavier ISO europeen standard dont les 3/4 des touches ne correspondent pas.

Pour s'en sortir, recuperer Ukelele, un logiciel qui permet de definir les caracteres relatifs aux touches (a part quelques touches systemes).
- Ouvrir le keyboard layout fourni "logitech french", verifier que toutes les touches sont correctement definies et sauvegarder le fichier layout (ou bundle).
- Placer le fichier sauvegarde dans Macintosh HD/Bibliotheque/Keyboard Layouts/ ou dans Macintosh HD/Systeme/Bibliotheque/Keyboard Layouts/
- Redemarrer la machine
- Dans l'application Preferences Systemes, aller dans "Langue et texte", onglet "Methodes de saisie", selectionner la methode "Logitech french" (ou le nom que vous lui avez donne) et activer l'option "afficher le menu Saisie dans la barre des menus".
- cliquer sur le petit clavier en haut a droite dans la barre des menus et selectionner le clavier a utiliser!

Verifie ton code C/C++ avec valgrind

Apres avoir cree son programme C et C++, on a beau etre super bon, les jours de fatigue, on risque d'avoir place inconsciemment quelques erreurs relatives a l'allocation ou l'acces memoire.
Heureusement, le petit utilitaire Valgrind est la pour nous sauver (sous Linux ou Mac)!

L'installation est simple:
- on recupere les dernieres soures ici
- on extrait les fichiers
- on va dans le repertoire cree
- depuis le terminal, on tape "./configure", puis "make", et enfin "sudo make install"

on verifie que tout marche bien en tapant un petit "valgrind ls -l"

Pour tester son programme, que l'on lance d'habitude comme ceci: "./mon_prog arg1 arg2"
il faut s'assurer que l'on a compile avec l'option -g, Ex: "gcc -o mon_prog -g mon_prog.c"

Le test se fait en lancant une commande du genre: "valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./mon_prog arg1 arg2"




Remarque: sous macos 10.6 au moins, un printf() (voire d'autres fonctions utilisant stout) dans le code va allouer une zone memoire qui ne sera pas liberee en sortie explicitement par le programme (Ca sera purge par l'OS normalement!).
On se retrouve avec un message sous Valgrind du style:
4,096 bytes in 1 blocks are still reachable in loss record 2 of 2
at 0x100012679: malloc (vg_replace_malloc.c:266)
by 0x10006FF4D: __smakebuf (in /usr/lib/libSystem.B.dylib)
by 0x10006FEB9: __swsetup (in /usr/lib/libSystem.B.dylib)
by 0x10002CC13: __vfprintf (in /usr/lib/libSystem.B.dylib)
by 0x10006FE0A: vfprintf_l (in /usr/lib/libSystem.B.dylib)
by 0x10009D482: printf (in /usr/lib/libSystem.B.dylib)
by 0x10000224C: main (mon_prog.c:547)

LEAK SUMMARY:
definitely lost: 0 bytes in 0 blocks
indirectly lost: 0 bytes in 0 blocks
possibly lost: 0 bytes in 0 blocks
still reachable: 4,096 bytes in 1 blocks
Pas besoin de s'en occuper!
Si ca derange, on peut fermer a la main stdout avec un petit: fclose( stdout );
..en esperant qu'il n'y ait pas de fonction executee a la terminaison ( atexit() ) qui utilise stdout..

mercredi 2 février 2011

Google Art Project - Visite virtuelle de musee

Google met en ligne le "Google art project" qui permet de se ballader dans plusieurs musees et de voir les toiles avec un tres grand niveau de details.
La navigation se fait facon Google Street View donc ca n'est pas tres fluide mais on s'en fout un peu en fait.. du moment qu'on a l'apercu de la piece sous differents angles avec des gros plans des decors et peintures, ca nous permet de voir des details que l'on ne peut apercevoir en tant que simple visiteur.

Communication des neurones du cerveau par champs electro-magnetique faibles

Une equipe de Caltech a trouve un nouveau moyen de communication entre les differents neurones du cerveau humain.
Actuellement, la communication entre les neurones est principalement consideree comme etant effectuee en passant par les synapses (..il faut aussi garder a l'esprit le role des cellules gliales ou des communications chimiques hors synapses).
Costas Anastassiou et ses collegues montrent que les ondes electro-magnetiques engendrees par les neurones peuvent etre recues et utilisees par d'autres neurones pour s'activer.
Des champs d'1mV/mm semblent suffisant pour influencer un neurone.

Ca promet de remettre en question beaucoup de modele de traitement de l'information dans le cerveau!
Ca pose egalement la question de l'influence de champs exterieurs sur le cerveau.

Voir l'article "Ephaptic coupling of cortical neurons" dans Nature Neuroscience du 16 janvier.

mardi 25 janvier 2011

main robotique DLR

IEEE Spectrum sort un article bien fourni sur un nouveau bijou de technologie robotique avec une main particulierement resistante aux chocs.
Cette technologie provient de l'institut DLR, en Allemagne, qui produit un certain nombres de travaux impressionnants: Justin, locomotion bipede...
Les doigts sont articules par un systeme de tendons dont l'elasticite peut etre modifiee.

Cette nouvelle main semble surpasser la "shadow hand" de Shadow Robot Company. Les muscles pneumatiques sont moins facilement parametrisables que la main du DLR.

lundi 17 janvier 2011

Le boulot de google pour traduire la poesie

Petit article sur le travail en cours chez Google pour traduire des poemes en prenant en compte le rythme et les rimes.
Voir le blog post et le papier correspondant, presente a la conference EMNLP!

Voir aussi les autres boulots presentes par Google a cette conference.

Dans le domaine du traitement du langage naturel, il faut noter le systeme Watson de IBM qui est capable de jouer au Jeopardy!
Mise a jour: la video de sa performance est sortie!

jeudi 19 août 2010

commandes de survie linux

Quelques commandes que je dois utiliser de temps en temps mais que je n'arrive pas a garder en memoire:

- se connecter a un ordi distant:
   ssh -Y nom@ordi

- envoyer un fichier vers un autre ordi:
   scp fichier nom@machine:repertoire

- compiler un package avec autoconf..:
   aclocal, libtoolize -c, autoconf, automake -ac, mkdir build, cd build, ../configure , make, make install

- git:
   cloner une repo existante: git clone git+ssh://nom@machine/repertoire
  

A suivre..

mercredi 14 juillet 2010

Imagerie par Resonance Magnetique Functionnelle (fMRI en anglais)

Developing Intelligence fait le point sur les problemes inherents a l'utilisation de fMRI pour les etudes du cerveau:

1- Si 2 groupes different dans l'utilisation de leur cerveau pour une meme tache, cela peut provenir de differences de comportement des 2 groupes.
Ex: les moins ages peuvent requerir une activite dans plus de zones de leur cerveau pour effectuer une tache car ils n'ont pas encore appris a optimiser le processus pour la tache en question. Les zones du cerveau ont la meme fonction dans tous les groupes mais c'est seulement le processus pour realiser la tache qui n'utilise pas les memes ressources.

2- considerer l'influence du scanner sur le comportement des patients! Le fMRI est une grosse machine reduisant considerablement les mouvements (a eviter pour les claustrophobes) et faisant un bruit metallique sourd periodiquement.

3- comment trouver une reference commune a 2 groupes pour evaluer les differences dans l'execution d'une tache? Afin de pallier aux problemes precedents, on utilise une tache de base commune aux 2 groupes et verifie les differences d'activite entre la tache de base et la tache mesuree dans chaque groupe. Le probleme toutefois est de mesurer les differences dans l'execution de la tache de base entre les 2 groupes.

4- Le probleme de l'inhibition d'une zone qui est necessairee pour l'accomplissement d'une tache mais qui n'est pas prise en compte forcement dans les mesures d'activite.

algebre lineaire

Definitions simples, voire un peu d'intuition pour quelques termes d'algebre lineaire..

- eigenvalue, eigenvector, eigenspace (valeur propre, vecteur propre, espace? propre), d'apres Wikipedia:
Une matrice peut agir sur un vecteur en changeant sa longueur et direction. Toutefois pour certains vecteurs, la matrice ne changera que leur longueur. Ces vecteurs sont les vecteurs propres de la matrice.
Le facteur qui multiplie la longueur initiale du vecteur propre est appele la valeur propre associee.
Tous les vecteurs propres qui ont la meme valeur propre + le vecteur nul forment l'espace(?) propre.
matrice M, vecteur v, variable l  -->  Mv = lv

- trace d'une matrice:
somme des elements de la diagonale principale (haut gauche vers bas droite) de la matrice.

a suivre...

mercredi 7 juillet 2010

Changement de repere 3D

Voici les sources d'un petit programme pour calculer les coordonnees
d'un point 3D d'un systeme de coordonnee a un autre:

// a: double[3]: angles de rotation du 2eme repere par rapport au premier
// t: double[3]: translation du 2eme repere par rapport au premier
// p: double[3]: coordonnees du point
// repereMonde: repere dans lequel les coordonnees du point sont
exprimees = true -> repere monde, false -> 2eme repere
// np: double[3]: coordonnees calculees (output)


void ccs( double *a, double *t, double *p, bool repereMonde, double *np )
{
// calcul la matrice de transformation
double mat[16];
double cax = cos ( a[0] );
double cay = cos ( a[1] );
double caz = cos ( a[2] );
double sax = sin ( a[0] );
double say = sin ( a[1] );
double saz = sin ( a[2] );

// matrice est calculee facon OpenGL..
mat[0] = caz * cay;
mat[1] = saz * cay;
mat[2] = -say;
mat[3] = 0;

mat[4] = caz*say*sax-saz*cax;
mat[5] = saz*say*sax+caz*cax;
mat[6] = cay*sax;
mat[7] = 0;

mat[8] = caz*say*cax+saz*sax;
mat[9] = saz*say*cax-caz*sax;
mat[10] = cay * cax;
mat[11] = 0;

mat[12] = t[0];
mat[13] = t[1];
mat[14] = t[2];
mat[15] = 1;

if( repereMonde ) {
double tnp[3];
tnp[0] = p[0]-mat[12];
tnp[1] = p[1]-mat[13];
tnp[2] = p[2]-mat[14];
np[0] = mat[0]*tnp[0] + mat[1]*tnp[1] + mat[2]*tnp[2];
np[1] = mat[4]*tnp[0] + mat[5]*tnp[1] + mat[6]*tnp[2];
np[2] = mat[8]*tnp[0] + mat[9]*tnp[1] + mat[10]*tnp[2];
} else {
np[0] = mat[0]*p[0] + mat[4]*p[1] + mat[8]*p[2] + mat[12];
np[1] = mat[1]*p[0] + mat[5]*p[1] + mat[9]*p[2] + mat[13];
np[2] = mat[2]*p[0] + mat[6]*p[1] + mat[10]*p[2] + mat[14];
}
}

Je n'ai fait que quelques tests basiques donc il n'est pas impossible
qu'il y ait des erreurs planquees.

Attention: Il y a des problemes de precision donc il vaut mieux eviter
de faire beaucoup de transformations a la suite.

lundi 15 mars 2010

Problemes de compilation obscurs en C++

quand le compilateur me donne A, entre autres, le probleme vient de B (parfois! ..ca peut venir d'autres choses aussi) et se corrige par C

________________

A:
ios_base.h:782: error: ‘std::ios_base& std::ios_base::operator=(const std::ios_base&)’ is private

B:
std::stringstream a,b;
...
a = b;

C:
a.str( b.str() );
________________


mercredi 17 février 2010

mes premiers pas blender


mes premieres questions tres basiques resolues pour blender 2.49b:

- un clic droit sur une des separation entre les vues (ligne rouge) permet de rajouter une vue (split area) ou de les fusionner.

- l'icone entoure (cercle rouge) permet de selectionner la nature de la vue: vue 3D, proprietes de l'objet, timeline, etc.

- donner a la main la position et orientation d'un objet se fait en "object mode" apres l'avoir selectionne. menu "transform properties" egalement accessible par la touche N.
Position et orientation sont definies pour le point rose considere comme le centre de l'objet. Il est parfois decale donc on peut le remettre au centre de l'objet par le menu Object->Transform->Center new

- grouper les objets en un seul: selectionner tous les objets avec shift+click gauche dans le menu "outliner" (la colonne a gauche dans l'image) et faire Ctrl+J, confirmer. Attention: ca va merger les proprietes material si il y en a trop (>5, il me semble)!

- on peut grouper les objets selectionnes en faisant "make parent" (Ctrl+P) pour qu'ils apparaissent en un element dans l'outliner.
La, il n'y a pas de problemes de material merge mais les objets sont consideres independants. L'avantage, c'est qu'ils sont plus facile a selectionner en selectionnant le parent et en faisant (Shift+G,1) equivalent a Select->Grouped->children.

- on peut placer des objets selectionnes dans differents layers, ca influe sur leur visibilite.
selectionne un ou des objets, appuyer sur M, choisir l'un des 20 layer.
on peut voir les differents layer en appuyant sur les touches numerotees du clavier principal (..PAS le pave numerique!) pour les 10 premieres, ALT+numero pour les 10 suivantes.
En appuyant sur SHIFT+num, on peut voir plusieurs layers a la fois.

- La selection des objets peut se faire dans la vue de la scene en appuyant sur le bouton B et en dessinant un rectangle comprenant tous les objets a grouper.

- placer la camera a la position de vue actuelle: Ctrl+Alt+0 (..numpad!)

- renommer un objet dans la "outliner view": Ctrl+cliquer sur l'objet a renommer

- rendre un objet transparent: selectionner un objet, voir le menu "shading" (F5), ajouter un "material", mettre la valeur A inferieure a 1, aller sur le tab "mirror transp" et activer "ray transp"

mardi 26 janvier 2010

MDP

MDP : Markov Decision Process -> processus de decision markovien

formule le probleme de trouver de facon sequentielle la meilleure decision a prendre en fonction de l'etat actuel du systeme et les actions possibles.

Le MDP requiert un environnement completement observable: le systeme connait l'etat ou il est parfaitement!
Il y a une incertitude sur l'effet des actions.

Il est compose de:
- etat initial
- ensemble de transitions entre les etats. la valeur des transitions depend seulement de l'etat courant, pas de l'historique!
- une fonction recompense qui depend d'un etat.

Le but est de trouver quelles actions faire en fonction de l'etat courant, des actions possibles, des probabilites de resultats possibles et des gains possibles.

La decision de choisir l'action a faire en fonction de l'etat actuel est appele la politique.

C'est plutot adapte pour les systemes et environnements stables, c.a.d qui ne changent pas au cours du temps ou des interactions..

voir l'article Wikipedia.

lundi 18 janvier 2010

probleme LaTeX

Commencons par l'installation de LaTex:
     sudo apt-get install texlive-full

Un petit message pour repertorier tous les petits problemes fournis par LaTeX durant l'ecriture d'articles de recherche ou redaction de these (en utilisant ce template)..
1) message d'erreur:  
... can be used only in preamble.
solution: mettre la commande designee avant l'instruction \begin{document}
2) message d'erreur:  
... .File 'nomencl.sty' not found
solution: installer le package texlive-latex-extra -> sudo apt-get install texlive-latex-extra
( ..si texlive-full n'avait pas ete installe avant..)

lundi 4 janvier 2010

probleme Kile (Ubuntu 8.04 H)

probleme:
- lancement de kile 2
- une fenetre popup affichant une erreur en rapport avec dcopserver, le rectangle kile 2, puis un autre popup d'erreur "Malformed URL"
- puis l'application se ferme toute seule

solution trouvees qui n'ont pas marche pour moi:
- le changement des permissions du repertoire /home/$USER/.kde -> chown -R $USER:$USER /home/$USER/.kde
- reinstaller kile

Ce que j'ai fais:
- lancer dcopserver manuellement -> retire la premiere popup d'erreur mais pas la deuxieme!
- virer les fichiers de configurations relatifs a kile dans .kde -> une autre erreur est apparue quand on lance depuis le terminal "kile: ERROR: : couldn't create slave : Cannot talk to klauncher"

Ce qui a marche (apres avoir fait les 2 actions au dessus.. mais ca marche peut etre tout seul)
- lancer dans le terminal: dcopserver_shutdown
- puis: kdeinit

.. et kile redemarre! ..avec des messages d'erreur dans le terminal mais ca a l'air de marcher..

jeudi 28 mai 2009

des jeux pour stimuler le cerveau

un blog liste divers liens bien pour le cerveau: exercices mentaux, conseils pratiques, etc.

Siri, assistant virtuel intelligent

Physorg.com presente Siri, une application sur iPhone, censee etre une petite revolution en intelligence artificielle.
D'apres l'article, Siri est capable de comprendre une requete en language naturel et trouver les reponses sur internet: guider quelqu'un vers le magasin voulu, reserver les tickets pour un voyage, etc.
L'application devrait etre disponible en fin d'annee.

jeudi 2 avril 2009

l'algorithme qui decouvre des lois physiques

Un article publie dans le journal Science du 3 Avril 2009 presente un algorithme qui est capable de trouver les relations mathematiques entre des variables lorsqu'on lui presente les mesures d'experiences.
Le programme cree par Michael Schmidt and Hod Lipson, de la Cornell University, a pu trouver des lois de mouvement pour des systemes physiques dynamiques non lineaires.
Le plus interessant est qu'il peut ensuite utiliser ces lois de base pour tenter de trouver des lois plus complexes.

La NSF (National Science Foundation) a un article de presse avec plus de commentaires!

mercredi 1 avril 2009

A la surface d'un trou noir

NewScientist presente en video une simulation de ce qui est peut etre visible lorsque l'on s'approche d'un trou noir.
Bien evidemment, cela reste une supposition et ce qui se passe a l'interieur du trou noir est encore completement inconnu.

lundi 16 mars 2009

Humanoid Robotics Project

Le groupe HRG de l'institut de recherche national japonais AIST a enfin devoile hier (16 mars 2009) le dernier modele d'HRP: HRP-4C, le C etant pour Cybernetic ..il me semble.
Destine au marche du loisir, HRP-4C prend la forme, le visage et le poids d'une japonaise moyenne: 1m58 pour 43 kg.
La voici en premier plan sur la photo, a cote d'HRP-3 (blanc) et HRP-2 au fond.

"Elle" peut marcher de facon plus naturelle qu'HRP-2, peut bouger les bras, les levres, les paupieres et les yeux. Elle peut egalement parler et est dotee d'une reconnaissance vocale (..qui marche mieux quand il n'y a pas trop de bruit autour).

Le visage vient de la societe kokoro qui a deja produit plusieurs humanoides a forme humaine. Personnellement je trouve les visages fait par Hanson robotics un peu mieux faits mais ils sont peut etre plus compliques a animer..

Des videos de presentation sont accessibles sur le site de l'AIST.
Je n'arrive pas a les regarder depuis Ubuntu donc je me suis rabattu sur les quelques unes disponibles sur youtube.

dimanche 15 mars 2009

Illusions tactiles

NewScientist fait un article qui liste 7 illusions qui dejouent le bon fonctionnement de notre sens du toucher.

lundi 9 mars 2009

comprendre le langage naturel

Quelques projets existent qui visent a permettre a un logiciel de comprendre, a la maniere d'un humain, une phrase entree par un utilisateur (voir aussi la version orale.. toutefois je ne connais toujours pas les performances de ce systeme).

La plus part des programmes arrivent a compenser les erreurs d'orthographe sur les mots courants, les fautes de grammaire sont plus compliquees a gerer mais cela s'arrange egalement.
Par contre, le tres gros challenge qui reste a relever en Intelligence Artificielle est le fait qu'un mot peut avoir plusieurs sens suivant le contexte de la phrase, voire meme l'actualite.
C'est ce qui fait encore defaut aux traducteurs automatiques de nos jours.

Wolfram, createur du logiciel Mathematica et auteur du bouquin "A New Kind of Science" (disponible gratuitement sur le site), s'est apparemment lance dans ce creneau et projette dans 2 mois de sortir un moteur de "connaissance" sur internet: Wolfram|Alpha (..en attente).
Un serieux concurrent a Google!

J'espere que ca n'est pas que du marketing..
Si cela se revele efficace, ca ouvrirait peut etre une voie interessante vers une Intelligence Artificielle Generale (AGI en anglais) et vers la resolution du prix Loebner (..implementant le test de Turing).

Futura-sciences a fait un article un peu plus fourni!

Nova Spivack a pu jouer un peu avec le systeme et donne ses impressions.

A noter 2 acteurs jouant dans la meme cour, l'avenir dira qui a la meilleure technologie:
- START, provenant d'un labo du MIT
- True Knowledge, une boite anglaise

mardi 3 mars 2009

IA mathematicien

NewScientist fait un article sur Aaron Sloman, un professeur de philosophie et sciences cognitives a l'universite de Birmingham.
Celui-ci tente de creer un programme d'IA dont le but serait d'etre un bon mathematicien doue de creativite.
Pour y arriver, il mise sur les algorithmes evolutionnaires ( .. algos genetiques + .. quoi? .. ) et tente de comprendre comment les enfants en bas age acquierent leurs premieres notions de mathematiques.
Il espere qu'en fabricant une intelligence d'enfant capable d'evoluer, il obtiendra un mathematicien... facile a dire..

L'article mentionne aussi les travaux d'Alison Pease de l'universite d'Edinburgh qui travaille egalement sur des programmes mathematiciens dont HR.
Pour etre a peu pres complet, je me souviens d'une presentation de Marvin Minsky sur l'histoire de l'intelligence artificielle qui mentionnait un programme capable de resoudre des theoremes mathematiques et qui a rendu obsolete une branche des mathematiques.
Il ne manque plus que le lien vers la video.

jeudi 26 février 2009

placebo

Il est reconnu depuis longtemps que le mental a un effet sur le physique, meme chez les gens serieux non-adeptes des mouvements New age.
La manifestation la plus etonnante est l'effet placebo (ou nocebo) etudie en medecine.

Scientific American en donne un exemple extreme:
Un patient en phase terminale de cancer etait persuade qu'apres avoir recu tous les traitements conventionnels en vain un nouveau traitement, le krebiozen, lui permettrait de guerir.
Ce fut effectivement le cas meme si tous les autres patients ayant recu le meme traitement n'eurent aucune amelioration.
Toutefois dans les 2 mois suivants, ce patient fut trouble par les articles de presse remettant en cause ce traitement et le cancer refit surface. Ses docteurs deciderent de lui mentir en lui administrant un placebo mais en le presentant comme une version amelioree du krebiozen. Sa guerison arriva encore plus vite que precedemment.
2 mois apres, suivant la lecture d'articles montrant l'inutilite du krebiozen, il mourrut en quelques jours.

Plusieurs etudes (catalogue de liens interessants!!) tentent de comprendre cet effet placebo mais il semble etre l'effet d'un grand nombre de variables difficilement controlables: histoire du patient, ses croyances, relations avec les medecins, relations avec l'entourage, ...
Toutefois certains trucs semblent universels: augmenter le prix du placebo, avoir un meilleur dialogue entre patient et medecin, ..
Contrairement a ce que j'ai entendu plusieurs fois, il a ete observe aussi sur les nourrissons et, encore plus etonnant, sur les animaux.
Toujours plus fort, il est possible de voir sa condition s'ameliorer meme en sachant pertinemment que l'on prend un placebo.

De par sa composante psychologique, tout le monde n'y est pas forcement sensible de la meme facon et certaines conditions sont plus efficaces que d'autres. Par exemple, une emission de RadioLab mentionne (entre autres) des resultats ou une pilule sucree presentee comme un somnifere a plus d'effets si elle est bleue que si elle est rouge partout dans le monde sauf en Italie. Une explication possible serait que le bleu peut etre associe en premier au football en Italie alors que dans les autres pays, le bleu est plutot synonyme de tranquillite.

La conclusion: potentiellement beaucoup d'entre nous ont le moyen de s'auto-guerir de certains problemes physiques ou mentaux. Il suffit "juste" de savoir qui, quand, comment, pour quoi..

Mise-a-jour: Mind Hacks a sorti un message sur l'effet "anti-placebo". Dans une etude, des personnes ayant des problemes d'insomnie recoivent un placebo pour dormir. Pour une partie des gens, le placebo est presente comme un somnifere, pour l'autre partie, ils pensent recevoir de la cafeine.
Surprise: le groupe croyant recevoir de la cafeine dors mieux!

lundi 23 février 2009

ubuntu: problemes et solutions

Un petit post que je remettrais a jour en fonction des problemes rencontres..

Pour la version Ubuntu 8.04..

- le son dans VLC est saccade -> voir ces 3 solutions:
1- configurer VLC pour utiliser ALSA exclusivement (Settings->preferences->Audio->output modules->advanced options)
2- corriger le bug de PulseAudio
3- passer toute la gestion du son sous ubuntu vers ALSA et killer PulseAudio
Je n'ai teste que la version 1, ca marche bien!

sante

je tente une liste de choses a garder en tete pour rester en forme:

d'abord, voir les posts sur les habitudes alimentaires et booster le cerveau.

Ensuite:
- eviter de rester assis trop longtemps dans la journee!

lecteur de e-book

Ca fait quelques annees que je suis la technologie E-ink qui permet d'afficher les textes avec une qualite proche du vrai papier.
Je suivais de pres le premier lecteur utilisant cette technologie sorti par sony mais le systeme de DRM m'a refroidi completement. Le nouveau a l'air plus ouvert et a un ecran tactile mais semble avoir un logiciel bancal pour charger les documents.

Ils coutent toujours aussi chers mais les derniers modeles sont allechants, surtout le dernier en date qui devrait sortir fin 2009, celui de Plastic Logic: format proche du A4, ecran tactile, connexion sans fil au reseau et ecran plastique moins rigide que les lecteurs actuels.. il reste a voir le prix.

En plus traditionnel, celui d'Irex (cher!), l'Ez reader, ou encore le BeBook avaient l'air sympa aussi.

En plus cher, il y a le kindle d'Amazon mais au niveau design, le clavier prend de la place.. Ca apporte des fonctionnalites en plus, certes, mais un ecran tactile aurait eu plus de classe!

En couleur, utilisant une autre technologie derivee du LCD mais qui reste gentille pour les yeux ..et tres cher!! je viens de decouvrir le FLEPia de Fujitsu dont Technology Review a fait egalement un article.

Tant de livres m'attendent..
- In libro veritas
- project Gutenberg
- internet archive
- ..

Mise-a-jour: une nouvelle technologie d'E-papier semble tres prometteuse. La technologie exploitee par la startup Gamma Dynamics accrue principalement la lisibilite et la vitesse d'affichage par rapport aux solutions actuelles.
Maj2: Pixel Qi, deuxieme technologie qui change la donne. Une technique pas trop chere pour obtenir des ecrans couleurs qui peuvent changer de mode d'affichage et permettent la lecture de video ou l'affichage passif facon e-paper.

Nouvelle mise a jour (Mai 2010): la technologie Mirasol de Qualcomm! Enfin, un ecran couleur a affichage rapide avec un contraste equivalent a l'E-ink! Les premiers e-reader utilisant l'ecran sont annonces pour fin 2010. ..pas encore de prix..

Mise a jour (Juillet 2010): nemoptic -> rafraichissement rapide, possibilite de couleur, haut contraste. Leur ecran est prometteur mais il n'y a pas d'e-book reader annonce pour l'instant..