Recommend Me


Mercredi 30 janvier 2008

bivouac 0.1.3

Classé dans : Camping, Projets, Ruby, bivouac — greg @ 20:09

La version 0.1.3 de bivouac est disponible. Au programme, peu de choses. Quelques bugs corrigés, l’ajout du script console et la génération d’un Rakefile permettant de faire les migrations de la base et de purger la table des sessions.

$ rake db:migrate
(in /Users/greg/temp/toto)
– create_table(:sessions, {:force=>true})
   -> 0.2465s
– create_table("toto_schema_infos")
   -> 0.0023s
==  Toto::Models::CreateUser: migrating =======================================
– create_table(:toto_users)
   -> 0.0022s
==  Toto::Models::CreateUser: migrated (0.0024s) ==============================

$ ruby script/console
>> u = User.new( :fname => "Gregoire", :lname => "Lejeune" )
=> #<Toto::Models::User id: nil, fname: "Gregoire", lname: "Lejeune">
>> u.save
=> true
>> u = User.new( :fname => "Arthur", :lname => "Lejeune" )
=> #<Toto::Models::User id: nil, fname: "Arthur", lname: "Lejeune">
>> u.save
=> true
>> User.find( :all ).each do |u|
?>   puts "#{u.fname} #{u.lname} is user ##{u.id}"
>> end
Gregoire Lejeune is user #1
Arthur Lejeune is user #2
=> [#<Toto::Models::User id: 1, fname: "Gregoire", lname: "Lejeune">, #<Toto::Models::User id: 2, fname: "Arthur", lname: "Lejeune">]
>>

• • •

Faites parler Mail

Classé dans : Apple, Applescript — greg @ 19:41

source : Mac OSX Hints

using terms from application "Mail"
  on perform mail action with messages newMessages
    repeat with newMessage in newMessages
      tell application "Mail"
        set senderName to (extract name from sender of newMessage)
        say "You’ve just received an email from " & senderName
      end tell
    end repeat
  end perform mail action with messages
end using terms from
• • •

Samedi 26 janvier 2008

VIDAL sur iPhone

Classé dans : Apple, Projets, RoR, Ruby, Web — greg @ 0:23

L’information ayant été publiée, je peux en parler : le VIDAL est disponible sur iPhone et iPod Touch.

Pourquoi en parler ? Simplement pour vous dire que cette application est développée avec Rails 2.0.2 et utilise les travaux de Joe Hewitt pour la partie interface.

Cette version du VIDAL pour iPhone est numérotée 1.0.1 β. En effet, il y a déjà eu une version 1.0.0 qui n’a pas été rendue publique. Il s’agissait en fait d’une maquette basée sur bivouac. Nous travaillons déjà sur des améliorations afin d’utiliser pleinement iui. Quant à savoir si nous allons rester sur Rails ou revenir à bivouac, la question se pose sachant que j’ai, pour d’autres projets, un plugin iui pour bivouac en cours de finalisation.

• • •

Vendredi 18 janvier 2008

Je recherche une bonne couturière

Classé dans : Apple, MacOSX, Tout et rien — greg @ 20:07

osx_pillow_dock.jpg

• • •

Mercredi 16 janvier 2008

Mon Nabaztag a des chaussures !

Classé dans : Ruby, Shoes — greg @ 20:27
require ‘cgi’
require ‘iconv’
require ‘open-uri’
require ‘rexml/document’

NAB_URI = "http://api.nabaztag.com/vl/FR/api.jsp?"

def n_say( s, t, m )
  REXML::XPath.match(
    REXML::Document.new(
      open( NAB_URI +
        "sn=#{s}&token=#{t}&tts=" +
        CGI.escape(
          Iconv.iconv(‘iso-8859-1′, ‘utf-8′, m)[0] )
        ) { |io| io.read }
    ), ‘/rsp/comment’
  ).map{ |n| n.text }
end

Shoes.app :width => 320, :height => 350 do
  background "static/nabaztag.png"

  stack :margin => 40 do
    stack :margin => 10 do
      para "Serial"
      @serial = edit_line
    end
    stack :margin => 10 do
      para "Token"
      @token = edit_line
    end
    stack :margin => 10 do
      para "Message"
      @message = edit_line
    end
    stack :margin => 10 do
      button "Go" do
        @answer.replace n_say( @serial.text, @token.text, @message.text )
      end
    end
   
    stack :margin => 10 do
      @answer = para "Hello!"
    end
  end
end

nabaztag-shoes.png

Pour faire fonctionner cette application, vous aurez besoin de cette image.

• • •

Jeudi 10 janvier 2008

Spellify & Bivouac

Classé dans : Projets, Ruby, Web — greg @ 20:42

Spellify est un correcteur orthographique pour vos formulaires Web présentant l’immense avantage de fonctionner avec pas mal de langues, dont le français. Si vous téléchargez les sources, vous constaterez qu’il s’agit en fait d’un simple Javascript (utilisant Script.aculo.us), de quelques images et d’un fichier PHP. Il y a du PHP car Spellify utilise Google pour faire la correction.

Je vous propose de voir comment utiliser Spellify dans une application bivouac.

Avant tout, il faut remplacer le PHP par du Ruby. Si vous éditez le fichier PHP, vous remarquerez qu’il utilise la Google Toolbar Spell Check API. Dans le principe il s’agit simplement de faire une requête de type POST à l’adresse https://www.google.com/tbproxy/spell en passant en paramètre la langue et dans le corps de la requête un morceau de XML de la forme suivante :

<?xml version="1.0" encoding="utf-8" ?>
<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">
    <text>WORD</text>
</spellrequest>

Remplacez le WORD par le mot à corriger et admirez. En retour vous recevrez un bout de XML contenant les corrections proposées par Google.

Dans le principe, quand nous saisissons un texte dans un formulaire, le texte est capturé et envoyé, via la méthode makeRequest de spellify.js au script PHP qui renvoie le XML à Google. La réponse reçue via le PHP est ensuite récupérée via la méthode GetResponse de spellify.js qui se charge d’afficher les orthographes possibles et de faire la substitution dans le texte saisi :

Spellify

Question ! Pourquoi donc passer par le PHP ? Tout simplement parce que XMLHttpRequest ne permet pas d’envoyer des requêtes sur un autre serveur que celui de la page sur laquelle se trouve l’utilisateur.

La première chose que nous allons donc faire est d’écrire le code permettant d’invoquer le correcteur Google. Remplacer le PHP en fait.

  1. require ‘net/https’
  2. require ‘uri’
  3.  
  4. module Demo::Controllers
  5.   class Spell < R ‘/spell’
  6.     def get
  7.       render :spell
  8.     end
  9.    
  10.     def post
  11.       word = input["<?xml version"].gsub( /.*<text>([^<]*)<\/text>.*/, \1 )
  12.       lang = input["lang"]
  13.      
  14.       results = nil
  15.       word = word.downcase
  16.       word = word.gsub("&", "&#38;")
  17.       word = word.gsub("<", "<")
  18.       word = word.gsub(">", "&#62;")
  19.       words = ‘<spellrequest textalreadyclipped="0" ignoredups="1" ignoredigits="1" ignoreallcaps="0"><text>’ + word + ‘</text></spellrequest>’
  20.  
  21.       http = Net::HTTP.new(‘www.google.com’, 443)
  22.       http.use_ssl = true
  23.       http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  24.       response =  http.start {|net|
  25.         net.request_post("/tbproxy/spell?lang=#{lang}", words) {|response|
  26.           results = response.body
  27.         }
  28.       }
  29.       @r = results
  30.      
  31.       render :spell_r
  32.     end
  33.   end
  34. end

Nous n’avons ni plus ni moins qu’un controlleur classique. Les requêtes de type GET afficheront la page via la vue spell et les requêtes de types POST (provenant de spellify.js) se chargerons de faire la requête Google et de renvoyer le résultat via la vue spell_r.

La seule chose remarquable dans le code ci-dessus est cette ligne :

  1. word = input["<?xml version"].gsub( /.*<text>([^<]*)<\/text>.*/, ‘\1)

En effet, je l’ai signalé plus haut, mais spellify fait une requête de type post en passant le contenu XML à envoyer à Google dans le corps de la requête. Malheureusement, ce cas est mal géré (pour le moment) par camping. Et nous recevons cela comme un paramètre. En fait la chaîne XML

<?xml version="1.0" encoding="utf-8" ?>
<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">
    <text>WORD</text>
</spellrequest>

est reçu comme cela :

input[‘<?xml version’]
  # => "\"1.0\" encoding=\"utf-8\" ?> <spellrequest textalreadyclipped=\"0\" ignoredups=\"0\" ignoredigits=\"1\" ignoreallcaps=\"1\"><text>WORD</text></spellrequest>"

Ile ne reste plus qu’a mettre en place les vues. Pour spell_r, nous allons renvoyer directement le contenu de la réponse stocké dans @r :

module Demo::Views
  def spell_r
    text @r
  end
end

Pour la vue spell nous allons mettre en place un formulaire avec trois champs :

module Demo::Views
  def spell
    html do
      head do
        title "Test Spellify with Bivouac"
        stylesheet_link_tag "spellify"
        javascript_include_tag "prototype", "scriptaculous", "spellify"
      end
     
      body do
        div do
          h1 "Spellify Demo"; br
          form( :name => "demo", :id => "demo", :method => "post", :action => "" ) do
            span "Text Field"; br
            input :type => "text", :name => "textfield1", :id => "textfield1"
            br; br; br
           
            span "Text Area"; br
            textarea( :name => "textarea1", :id => "textarea1", :cols => "50", :rows => "4" ) {}
            br; br; br; br; br; br
           
            span "Text Field (ignored)"; br
            input :type => "text", :name => "textfieldignore", :id => "textfieldignore", :class => "spellify_ignore"
          end
        end
       
        #<!– Spellify BEGIN –>
        div( :id => "spellify" ) do
          div( :id => "correctionsContainer", :style => "position: absolute; z-index: 1000; display: none; background-color: transparent;" ) do
            ul do
              li( :id => "arrowItem" ) { span( :id => "arrow" ) { image_tag "arrw.png", :width => "12", :height => "6", :alt => "" } }
              li { div( :id => "correctionsBody" ) {} }
              li {
                div( :id => "correctionsFooter" ) {
                  link_to( image_tag( "tagline.png", :alt => "Spellify - www.spellify.com", :title => "Spellify - www.spellify.com", :width => "45", :height => "15" ), "http://www.spellify.com", :popup => true )
                }
              }
            end
          end
          div( :id => "loaderDiv", :style => "position: absolute; z-index: 1000; display: none;" ) do
            image_tag "ldr.gif", :alt => ""
          end
        end
      end
    end
  end
end

Les deux premiers champs sont respectivement de type text et textarea, le dernier, de type text, sera ignoré par le correcteur. Ceci est fait en lui appliquant la classe CSS spellify_ignore.

Pour terminer il faut placer le script spellify.js dans le répertoire public/javascript de l’application et les fichiers images (arrw.png, ldr.gif et tagline.png) dans public/images. L’ensemble de ces fichiers se trouve dans les sources de spellify.

Puisque Spellify utilise par défaut le script PHP spellify.php, il faut modifier le fichier spellify.js de la façon suivante :

  1. var optionalLeftOffset = 35;    //optional left position offset for loader div
  2. var optionalTopOffset = 0;     //optional top position offset for corrections div
  3. /**************DO NOT CHANGE BELOW*******************/
  4. var defUrl  = ’spellify/spellify.php’;
  5. var ignoreClassName = ’spellify_ignore’
  6. var http_request;
  7. var http_response;

Malgré le DO NOT CHANGE BELOW il faut modifier la ligne 47 de la façon suivante :

  1. var defUrl  = ‘/spell’;

That’s all folks !

• • •

Mercredi 9 janvier 2008

bivouac 0.1.1… heu non… 0.1.2 !

Classé dans : Projets, Ruby — greg @ 19:20

Je viens de mettre en ligne coup sur coup les versions 0.1.1 et 0.1.2 de bivouac.

Pourquoi ce très court laps de temps entre les deux versions ? Tout simplement parce que je n’avais pas vu le message d’Evan Weaver :

De : Evan Weaver
Répondre à: camping-list@rubyforge.org
À: Campers
Date : 1 janv. 2008 11:51
Objet : mongrel 1.1.3 breaks camping; use 1.1.2 instead

Mongrel 1.1.3 breaks camping; use 1.1.2 instead.

Sorry.

I’ll fix it in the next release.

Evan

Donc la version 0.1.1 corrige un bug lié au passage à Rails 2 ; la version 0.1.2 vous permet de lancer votre application en forçant l’utilisation de WEBrick en attendant la correction :

ruby script/server webrick -d start
• • •

Dimanche 6 janvier 2008

Rubik’s cube

Classé dans : Tout et rien — greg @ 20:01

• • •
Powered by: WordPress • Template adapted from the Simple Green' Wench theme - RSS