mercredi 9 août 2017

IA selon Marvin Minsky

Je me suis replongé récemment dans des ouvrages relativement anciens liés aux théories d'intelligence artificielle, histoire de sortir un peu de la mode récente du deep learning.

Je rattrape surtout mon retard avec les travaux de Marvin Minsky, très célèbre chercheur au MIT. Si j'ai pu lire quelques uns de ses essais ou articles de recherche, je n'avais pas encore lu ses bouquins...

Les 2 plus importants sont actuellement disponibles gratuitement sur le net, même si ce ne sont pas forcément les versions finales:
- The Emotion Machine : voir les liens vers les drafts de chapitre donnés sur sa page personnelle https://web.media.mit.edu/~minsky/

Il n'y a pas de mathématiques complexes mais des phrases et schémas relativement clairs pour expliquer des concepts simples. Toutefois les concepts ne semblent pas suffisamment simples ou détaillés pour être traduits facilement en programmes.

La seule implémentation des concepts du livre que j'ai pu trouver est celle-là : 

Même maintenant, il semble que ces bouquins soient une bonne source d'inspiration!

DeepMind - Blizzard : IA pour Starcraft II

Les échecs, les jeux Atari, le jeu de Go... tout ça, c'était la partie facile de l'IA (...maintenant que c'est fini...)
DeepMind, la boite de recherche que possède Google (ou Alphabet?) se lance dans la recherche d'IA plus poussée en se confrontant au jeu Starcraft II, avec le support de Blizzard :
https://deepmind.com/blog/deepmind-and-blizzard-open-starcraft-ii-ai-research-environment/

Ils mettent à disposition l'API qui permet d'accéder aux informations et commandes du jeu, ainsi qu'une foule de données de jeu, pour que d'autres chercheurs (ou hobbyistes!!) puissent s'y mettre également (gratuitement) !

Tout ça est sur Github:

Ça promet des bonnes compétitions d'IA d'ici peu!

jeudi 28 avril 2016

Open AI sort ses premiers travaux

OpenAI, le groupe de recherche en IA formé, entre autres, par Elon Musk et composé de plein de gens reconnus en deep learning (..peut être d'autres technos aussi) sort sa première contribution à l'humanité sous forme d'un environnement de développement pour tester ses algorithmes en apprentissage par renforcement (reinforcment learning)
https://gym.openai.com/

Pour l'instant, il faut programmer en Python mais ils promettent d'étendre ça à plusieurs autres langages de programmation.

jeudi 17 décembre 2015

AGI: geometric intelligence

Le deep learning a le vent en poupe mais il se trouvent quelques uns pour rappeler que l'approche, aussi interessante et fructueuse soit elle, a quelques limites et inconvenients.
MIT technology review fait un article sur Gary Marcus et la boite qu'il vient de fonder, Geometric Intelligence.
Il prone une AI basee sur des algos plus proches du fonctionnement du cerveau humain. En particulier, une maniere d'acquerir des regles generales a partir d'un nombre reduit d'exemples.
En comparaison, un reseau de neurones type deep learning va avoir besoin d'entre quelques centaines a plusieurs millions d'exemples afin de decouvrir le fonctionnement qu'on lui demande d'atteindre.

Ca semble etre l'approche pronee aussi par bon nombre de chercheurs dans le domaine de l'AGI (Artificial General Intelligence). Certains presentent des architectures conceptuelles assez elaboree mais il manque les details pratiques de conception ainsi que des demonstrations des capacites reelles.

Geometric Intelligence a l'air d'avoir deja des resultats pratiques donc j'espere qu'ils sortiront des demonstrations de leur technologie bientot!

mardi 15 décembre 2015

Le deep learning pour tous

C'est la foire aux bonnes nouvelles pour tout ceux qui veulent se mettre au deep learning, des labos et grosses boites sortent leurs outils maison au grand jour, en version gratuite et open source!
Caffe, de l'univeriste de Berkeley, USA, etait deja la depuis un bout de temps
- Theano a egalement une bonne longueur d'avance
- il y a presque un an, Facebook filait un module deep learning pour le framework Torch
- Brainstorm, de l'institut IDSIA, Suisse, est arrive sur Github il y a quelques mois
- MxNet, du groupe DMLC, s'est pointe dans ces eaux la aussi, je crois...
- quelques semaines apres, Google file son TensorFlow
- il y a quelques jours, la creation d'OpenAI, une organisation dediee a la recherche et le partage (gratuit!) de travaux en IA (ils n'ont encore rien sorti mais elle contient deja pas mal d'experts dans le domaine apparemment)
- et maintenant, Facebook ouvre le design de Big Sur, son matos hardware specialise pour le deep learning

... et il me semble qu'il y avait encore d'autres annonces de ce style ces derniers mois...
C'est le moment de se remettre au Python et/ou de ressortir le C++! ...et de trouver une idee geniale d'application qui aille au dela des domaines usuels.

Pour s'initier au domaine, il y a quelques cours bien faits et gratuits sur le net, dont celui sur les reseaux de neurones sur Coursera, et puis les tutoriaux qui viennent avec certains de ces frameworks.

Pour l'instant, d'apres les echos du net, MxNet semble etre le plus interessant (et surtout, rapide!).

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