Journal Réalisation d'un site de Paste web 2.0

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
12
6
juil.
2012

Haha, le web 2.0, ca attire toujours les foules, hein ?

Bienvenue ici, cher journal,

La semaine dernière, ou était-ce celle d'avant, je t'ai parlé de la détection de la syntaxe d'un langage informatique via un analyseur statistique naïf de type Bayésien, qui était mon article d'introduction sur mon pet-project actuel.

J'ai un peu avancé et j'ai désormais un prototype à te faire essayer, si tu veux. Autant dire que comme j'ai découvert que Github avait publié dans la lib linguist du code qui faisait exactement ce que je voulais faire, j'ai jeté mon prototype en Go pour me mettre à faire du ruby.

Evidemment, c'est un peu facile de pas coder soi-même et d'utiliser un truc que des gens ont fait avant, mais comme j'ai un réel objectif et que mon code donnait des résultats assez médiocre, j'ai préféré basculer sur la solution linguist:

  • Leur parseur bayesien utilise, tel que décrit dans les commentaires de ma précédente note, uniquement des "mot-clés" et c'est pas mal
  • Ca "juste marche" et ça ne consomme pas 200Mo de ram pour charger le parseur

Bon évidemment, c'est du ruby, donc ça consomme un peu de cpu, de la RAM et c'est pas spécialement rapide.

Le prototype est testable sur uu.zoy.org (appréciez le sombre jeu de mot).

Pour le moment, le code est tout pourrave et ne fait que faire la glue entre un petit site web en Sinatra et la lib Linguist. Le code source de ce truc est accessible sur github/ruby-clever-pastie. Vous pouvez coller tout ce que vous voulez dedans, c'est pas loggé, et ca ne paste pas encore. Par contre, ca essaye de deviner ce que vous avez collé. Vous verrez que de manière générale, c'est bien (mais pas top). Ca me suffit.

Ce qui est chouette, c'est la liste de ce que je voudrais faire ensuite avec ! En vrac :

  • Permettre le paste de n'importe quoi avec une colorisation suivant le langage détecté/choisi
  • Sauver le couple (ou l'objet) paste-langage dans une base noSQL (possiblement sur le fs)
  • Permettre de changer le langage depuis un paste au cas ou le détecteur a faux (et sauver le changement sur le fs)
  • Rajouter une api qui permet d'uploader uniquement les tokens d'un "fichier" et qui retourne le langage detecté
  • Rajouter du javascript pour permettre de faire des paste cryptés dont la clef est stockée chez le client dans un # auquel le serveur n'a pas accès
  • Rajouter des critères d'expiration du paste
  • Ecrire un client OSX qui permet l'upload via un raccourci système (en fait, y a dejà github/cloudBoard que j'ai écris y a un bout de temps, mais il paste sur un site pas terrible).
  • Ecrire de quoi le rendre compatible avec Pastoob
  • Faire du SSL un jour (ou peut être une nuit)
  • # Détection

    Posté par  . Évalué à 3.

    It looks like this is Perl (or maybe PHP or even Python…).

    Presque. C'était du python.

    • [^] # Re: Détection

      Posté par  . Évalué à 3.

      def foo(x):
          return 42
      
      

      est détecté comme du Ruby (et comme du Python en seconde position). La bibliothèque utilisée retourne-t-elle un score évaluant la confiance en le résultat ? Cela permettrait de laisser le choix à l'utilisateur si le résultat est trop incertain ou si plusieurs résultats sont trop proches.

      • [^] # Re: Détection

        Posté par  (site web personnel) . Évalué à 1.

        Oui, elle retourne un score : j'affiche le premier, deuxième et troisième match dans la petite phrase. J'ai patché pour afficher ce que me retourne la lib. Mais c'est pas terrible…

      • [^] # Re: Détection

        Posté par  . Évalué à 0.

        Si ce sont les tokens: https://raw.github.com/github/linguist/master/lib/linguist/classifier.yml
        Alors à mon avis il manque ":\n" comme token pour python.
        En d'autre termes

        def foo(x):
        
        

        pourrait donner:

        ["def", "foo", "(", "x", ")", ":", ":\n"]
        
        
      • [^] # Re: Détection

        Posté par  . Évalué à 2. Dernière modification le 08 juillet 2012 à 01:30.

        Bizarre que ça donne Ruby : ya un : et il manque le end.

        « En fait, le monde du libre, c’est souvent un peu comme le parti socialiste en France » Troll

      • [^] # Re: Détection

        Posté par  . Évalué à 0.

        http://paste-antoineb.dotcloud.com/paste/

        J'ai appliqué ce que je dis plus bas, et ce code est bien détecté comme du python.
        L'ordre de sélection se trouve dans le select (regardez les requêtes ajax pour vous en convaincre).

    • [^] # Re: Détection

      Posté par  (site web personnel) . Évalué à 6.

      It looks like this is Diff (or maybe OpenEdge ABL or even Perl…).

      Brainfuck confondu avec du Perl. Je le savais….

      • [^] # Re: Détection

        Posté par  . Évalué à 5.

        select * from table;
        
        

        It looks like this is JavaScript (or maybe Objective-C or even PHP…).

        C'est dommage je pensais pas qu'il allait se planter là dessus.

        Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

        • [^] # Re: Détection

          Posté par  . Évalué à 1. Dernière modification le 06 juillet 2012 à 20:12.

          Même en majuscules d'ailleurs :/

          It looks like this is Objective-C (-44.95) (or maybe OpenEdge ABL, -45.07 or even JavaScript, -45.96…).

          edit : les scores

        • [^] # Re: Détection

          Posté par  (site web personnel) . Évalué à 2.

          Une table qui s'appelle table ? MySQL detected…. ;)

          • [^] # Re: Détection

            Posté par  . Évalué à 2.

            J'ai presque jamais utilisé mysql, c'est juste que je devais trouver un nom et que c'est le premier mot qui m'es venu (pas très créatif certes)

            Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

  • # Injection HTML

    Posté par  . Évalué à 3.

    J'ai testé avec un fichier PHP contenant beaucoup de HTML, et ça a détecté du HTML en disant que ça pouvait aussi être du PHP (score très proche).

    Par contre, je me suis retrouvé avec tout le code collé en dessous : tu devrais protéger le contenu du textarea.

    Envoyé depuis mon lapin.

    • [^] # Re: Injection HTML

      Posté par  (site web personnel) . Évalué à 3.

      Ha oui, alors pour le moment, c'est complètement pas protégé. Mais je vais me renseigner :-)

      • [^] # Re: Injection HTML

        Posté par  (site web personnel) . Évalué à 2.

        Effectivement, ce n'est pas protégé :)

        En tous cas, quand j'ai lancé avec le code suivant:

         </textarea></form></div>
         <p>eingousef?</p>
         <p>In fact, I'd say, with a sigma-5 probability, that <a href="http://www.youtube.com/watch?v=oHg5SJYRHA0">this link</a> will help you to understand why it's true.</p>
        
        

        J'ai eu droit à un message honnête…

  • # Ça marche pas mal !

    Posté par  . Évalué à 2.

    typedef unsigned char t;t*F="%c",l[]="|\\/=_ \n](.\0(),*(.(=(}*.)[[*.",N='\n',*
    r;typedef(*H)();extern H Ar;Q(a){return(a|-a)>>31;}H S(c,a){return(H)(a&~c|(int
    )Ar&c);}extern t*ist;V(t*u){*u^=*u&2^(*u>>7)*185;}Z(t*u,t n){*u-=n;}e(t c,H h){
    R(h,Q(*                                                                 r^c));}
    I(){r=l                                                                 +7-4*Q(
    getchar                                                                 ()^*l);
    }R(H h,                int                                              c){Ar=S
    (c,h);-                main()                                           ;}P(){r
    ++;}z()                {                                                O(&N);}
    O(t*c){                    printf(                                      F,+*c);
    }T(){r=                        "This is not a function\n"               ;}w(U){
    U=Z(r,8                    );                                           r-=~Q(*
    r/8-4);                    return 0;                                    }M(){r=
    ist-68;                }                                                h(){t G
    =r[1]-r                                                                 [2]^*r;
    G^=30;V                                                                 (&G);e(
    0,(O(&G                                                                 ),P(P(*
    r++)),z));}g(){M();R(h,0);}f(){P(O(r));e('f',g);}p(){P();e('a',f);}d(){P(O(r));
    e('n',p);}c(u){u=r[-2];T(Ar=d);R(f,Q(u^'"'));}n(){e(w(O(l+*r%8)),c);}a(){I();R(
    n,0);}main(){S(Q(Ar),a)();}H              Ar;t*ist="Rene Magritte"-(1898-1967);
    
    

    (J'ai piqué ça sur le site du IOCCC)

    Je pensais qu'il allait lamentablement se planter… et bien non :
    > It looks like this is C++ (-2172.86) (or maybe JavaScript, -2200.95 or even Perl, -2203.61…).

  • # Diff

    Posté par  (site web personnel) . Évalué à 3.

    Quand j'utilise ce genre d'outils, la plupart du temps c'est avec des patches (diff)

    Ce n'est pas vraiment un langage, mais ce serait bien de le reconnaître quand même.

  • # Et paf !

    Posté par  . Évalué à 3.

    (defun §-* (times &rest listval)
      (funcall *generate*
           (apply #'append 
              (loop repeat (eval times)
                collect listval))))
    
    

    It looks like this is JavaScript (-206.94) (or maybe Perl, -212.53 or even CoffeeScript, -212.81…).

    C'était pourtant facile…

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.