lundi 6 juin 2011

Introduction à Haml

Introduction à Haml


Bonjour Rubyistes,

ça faisait un moment que je vous ai pas écrit et je vous demande pardon. Ce n'est pas évident de travailler toute la semaine, organiser des événements les weekend, préparer des talks et pouvoir se mettre devant mon clavier et partager avec vous :)

Et pour la reprise, nous allons faire de belles choses. Nous allons voir ensemble comment écrire des applications WEB Mobiles en utilisant  HamljQTouch et Sinatra.

Le but de cette série d'articles est de nous permettre d'écrire des applications WEB Mobiles pour rendre "nos" applications WEB plus à la portée de nos visiteurs, clients et collaborateurs.
L'avantage des applications WEB mobiles par rapport aux applications WEB "simples" est qu'elles ont un look d'applications natives. De ce fait, le visiteur se sent déjà "chez lui".

D'où me vient l'idée de cet article ?


Je travaille pour une entreprise en tant que développeur d'applications WEB (mobile et standard). Et sur la demande de nos collaborateurs, nous devrions avoir une application mobile pour chaque plateforme ( Android, Iphone, BlackBerry, Windows Mobile, Symbian et Palm Os ). Oui c'est beaucoup d'applications qui sont toutes identiques ! La solution que nous avons finalement adoptée c'est avoir une seule et unique application utilisable sur toutes ces plateformes : une application WEB mobile.


Et après une comparaison des différents outils permettant le développement d'applications WEB mobiles, mon choix ( justifié ) s'est porté sur jQTouch (jQuery mobile ). L'application a été développée en Python ( Django ).


Après avoir découvert certaines belles choses, j'ai pensé à vous :) 




Now vous savez pourquoi j'ai écrit cet article. Mais vous savez toujours pas pourquoi j'ai choisi HAML ???


HAML est un langage de templating ( pour créer ou générer des pages HTML ) tout comme le ERB, Slim et autres langages de templating. Son avantage par rapport aux autres c'est le DRY ! ( Don't Repeat Yourself ), la structation qu'il vous impose et sa Rubyesque syntaxe.


Installation de HAML

Haml est une GEM qui s'installe comme toutes les autres !

> gem install haml

haml : Basics

Haml vous permet de gérer les contenus statique et dynamique de vos pages HTML en mettant à votre disposition des "méthodes" d'accès aux éléments du document HTML.


Sur cette image on a les différentes "méthodes" d'accès et d'utilisation des tag et blocks du document HTML. 
Toutes les balises HTML sont précédées d'un %, les class CSS par un "." et les ID par un "#". C'est toutce qu'il faut savoir sur les parties statiques de votre HTML.

haml : Syntaxe

Exemple : index.haml

!!! Strict
%html
  %head
  %body
    %h1
       Bonjour tout le monde

On "compile" tout ça :

> haml index.haml 

Et le résultat est :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>
  <head></head>
  <body>
    <h1>
      Bonjour tout le monde
    </h1>
  </body>
</html>

très simple et super cool ! Pour ceux qui aiment avoir des widgets sur leurs pages web, Haml est vraiment le truc qu'il faut.
Et maintenant ajoutons un peu de contenu dynamique !

- @text = "Ruby is awesome"
!!! Strict
%html
  %head
  %body
    %h1
       Bonjour tout le monde !
       - if 1 < 2
         =@text

Et le résultat est :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>
  <head></head>
  <body>
    <h1>
      Bonjour tout le monde !
      Ruby is awesome
    </h1>
  </body>
</html>

Un essai avec les div !

- @maclasse = "rouge rounded"
- @text = "c'est super ça "

!!! Strict
%html
  %head
  %body
    %h1
       Bonjour tout le monde !
       %div{ :class => @maclasse }
         =@text


à vous de me dire à quoi ressemblera le résultat HTML.

Haml est très simple, intuitif et amusant. Dans le prochain article, nous allons utiliser Haml dans une application Sinatra. D'ici là amusez vous bien avec Haml et n'hésitez pas à poser vos questions et/ou faire part de vos critiques/suggestions.

PS : Haml vient avec son propre moteur de CSS appelé SASS ! Mais vous pouvez l'utiliser avec le CSS standard. On fera un tour sur le SASS. Promis :)

à Lundi prochain inchaallah.

mercredi 18 mai 2011

Connascence Of X


Voici quelques petites choses qui vous seront très utiles !

PS : si certains termes (ou expréssions) vous parraient "etranges", wikipedia vous aidera !

Coupling

Coupling or dependency is the degree to which each program module relies on each one of the other modules
  • Types
    No
    Modules do not communicate with each other
    Message
    Modules are not dependent instead they use a public interface to exchange parameter-less messages or events
    Data
    TODO: simple data/internal
    Stamp
    a modules share composite data structure but requires only part of it(through say field name structured data/internal
    Control
    a module controls logic of antother by passing it information on what to do(what-to-do flag)
    External
    modules share externally imposed data format( ie using mysql api instead wrapping it in db api) simple data/external
    Common
    modules share common data(ie global variable) structured data/external
    Content
    module relies/depends on implementation details of another module

Cohesion

Cohesion is a measure of how strongly-related or focused the responsibilities of a single module are
Types
Coincidental cohesion (worst)
grouped arbitrarily.. (e.g. a module of frequently used functions).
Logical cohesion
logically categorised to do the same thing, even if they are different by nature (e.g. grouping all I/O handling routines).
Temporal cohesion
during run-time (e.g. a function which is called after catching an exception which closes open files, creates an error log, and notifies the user).
Procedural cohesion
always follow a certain sequence of execution
Communicational cohesion
operate on the same data
Sequential cohesion
output from one part is the input to another part
Functional cohesion (best)
contribute to a single well-defined task of the module

Connascence

Two pieces of software share connascence (or relation) when a change in one requires a correspoiding change in the other Like coupling but in operational way instead just levels
Types
  • Static
    • Of Name
    • Of Type
    • Of Meaning
    • Of Algorithm
    • Of Position
  • Dynamic
    • Of Execution
    • Of Timing
    • Of Value
    • Of Identity
  • Contranascence
Rules
  • Locality: higher connascence for smaller scope
  • Degree: convert high degrees of connascence into weaker forms of connascence

Corelation To Other Principles

TODO:
Like:
  • DRY: CoA
  • Law of demeter: CoT
  • KISS:
  • Single responsibility



Modularity Ry Jim Weirich

Quelques pistes pour commencer

Hi,

Pendant le meetup que nous avons organisé à l'Ecole Supérieure Polytechnique ce samedi 14 mai 2011,
nous avons promis de partager avec vous certaines ressources :)

Alors voici quelques pistes pour commencer votre belle aventure avec Ruby :

un livre très intéressant pour démarrer : Apprendre à programmer en Ruby
un interpréteur Ruby en ligne http://tryruby.org
*
http://rubyinside.com
http://ruby-toolbox.com
http://rubygems.org

jeudi 7 avril 2011

les websockets ? solutions aux limites du protocole HTTP ?




Hi mon premier post sur ce blog....
Découvrons le ensemble
Quelques mois auparavant Hassane Moustapha vous a parlé de REST et notamment du protocole HTTP . Je ne reviendrais donc pas dessus, je m'en vais juste soulever une limite majeure du protocole HTTP , limite qui a en partie vu le jour avec l'évolution du Web ( notamment le Web .2.0 ).
Je m'explique, l'utilisation du protocole HTTP implique que le client ( disons notre navigateur web ) doit ouvrir une connexion avec le serveur, effectuer sa requête, attendre la réponse du serveur, avant de la fermer. Aussi à chaque nouvelle connexion c'est ce même processus qui se répéte. Nous notons deux points essentiels
  • le serveur doit attendre une requête du client pour pouvoir lui envoyer les données qui lui sont destinées
  • la bande passante en souffre :)
  • Ce temps de latence implique dans le cas de systèmes à temps réel ( prenons le cas des bourses ) des pertes possibles d'argent
J'espere que vous me suivez toujours car on va bientôt entrer dans le vif du sujet. En effet le souci principal pour nous développeurs avec ce protocole c'est le besoin d'avoir une connexion constamment ouverte entre le client et le serveur permettant un échange de données en full duplex.Certains me diront qu'il existe des alternatives telles que Comet ( Hassane nous fera surement la grâce d'un article dessus).
Nous parlerons donc des Websockets qui via le HTML 5 est supporté par les applications web actuelles.

Le Protocole WebSocket

Ce protocole permet d'ouvrir une connexion permanente directionnelle entre le client et le serveur.
Comment ça se passe ?
Bah tres simplement, considérons que votre application charge un script javascript qui nécessite une connexion permanente avec le serveur. Une requête de type "upgrade" est faite afin de proceder à une mise à jour de la connexion de type TCP/HTTP vers le mode webSocket. Ca ressemble à peu prés à ça :

GET /text HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: www.example.com
Origin: http://example.com
WebSocket-Protocol: sample
Sec-WebSocket-Version: 6


qui donne

HTTP/1.1 101 Websocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://example.com
WebSocket-Location: ws://example.com/demo
WebSocket-Protocol: sample

Et voila cet échange initial est appelé "handshake" ( poignée de mains pour les francophones :) ) et devinez quoi ? la connexion entre le serveur et le client est établie.
Le client et le serveur peuvent alors échanger librement des informations l'un l'autre via
ce protocole. Le serveur vient push (pousser ) des données vers le client et n'est plus obligé d'attendre qu'il en fasse la demande d'abord.


L'API WEBSOCKET

Elle se veut tres simple. Aussi pour créer une instance de web socket il suffit de fournir l'url du serveur . Elle commence par ws:// ou wss:// ( pour une connexion sécurisée ). Ensuite l'interface fournit un certain nombre d'attributs permettant de gérer les évenements associés :

onopen : ouverture d'un websocket
onmessage : reception d'un message
onerror : en cas d'erreurs
onclose : fermeture de websocket
Les données envoyés par le serveur sont notifiés par l'événement onmessage. Aussi les webSocket fournissent deux méthodes :
  • send(data_string) pour envoyer un message au serveur
  • close() pour fermer la webSocket
Hummm je commence à être long la. Aussi je vais terminer par son implementation côté
serveur.
Je ne vais pas finir sans préciser ceci, les websocket representent une évolution importante
dans la communication client-serveur, toutefois d'importantes failles de sécurité ont été notées dont le cache poisonning. Ce qui fait que les websocket restent encore à l'état de brouillon, mais son évolution est ineluctable so

Wait and see...

quelques liens




lundi 4 avril 2011

Ruby : quelques ressources !

Bonjour,

Pendant ma présentation du langage Ruby (lien) au CodeCamp le samedi 02 Avril 2011, j'avais promis de partager avec vous mes sources! Voici quelques liens qui vous seront très utiles :

http://www.ruby-lang.org/fr
- http://rubyflow.com
- http://rubyinside.com
- http://tryruby.org
http://screencasts.org/
- http://rubyusergroup.blogspot.com  
- http://railscasts.com
http://confreaks.net/events
http://teachmetocode.com/
http://rubycorner.com/blogs/lang/fr   (liste des blogs francophones )


Blogs personnels 

  1. Aaron Quint – QuirkeyBlog
  2. Adam Keys – The Real Adam
  3. Adam Wiggins – A Tornado of RazorBlades
  4. Amanda & Michael Morin – Amanda and Michael’s Ruby Blog
  5. Amy Hoy – Slash7
  6. Antonio Cangiano – Zen and the Art of Programming
  7. Brian Dainto – The Budding Rubyist
  8. Brian Eng & Jeff Cohen – Softies on Rails
  9. Brian Marick – Exploration Through Example
  10. Bruce Williams – Codefluency
  11. Chad Fowler – Chad Fowler
  12. Charles Nutter – Headius
  13. Chris O’Sullivan – The Chris O Show
  14. Dave Thomas – PragDave
  15. David Heinemeier Hansson – Loud Thinking
  16. Derek Neighbors – Derek Neighbors
  17. Dr Nic Williams – Dr Nic
  18. Eric Hodel – Segment7
  19. Evan Phoenix – evan.musing
  20. Ezra Zygmuntowicz – Brainspl.at
  21. Eldon Alameda – Simplifies
  22. Eric Falcao – austin entrepreneur
  23. Fabio Akita – AkitaOnRails.com (Portuguese)
  24. Geoffrey Grosenbach – Nuby on Rails
  25. Giles Bowkett – Giles Bowkett
  26. Graeme Mathieson – Rubaidh
  27. Gregg Pollack & Jason Seifer – Rails Envy
  28. Ilya Grigorik – igvita.com
  29. Jade Meskill – iamruinous
  30. James Golick – James on Software
  31. Jamie van Dyke – FearOfFish
  32. Jamis Buck – the { buckblogs :here }
  33. Jay Fields – Jay Fields’ Thoughts
  34. Jay Phillips – Adhearsion Blog
  35. Jesse Newland – SoylentFoo
  36. Jim Weirich – { |one, step, back| }
  37. Joe O’Brien – 
    my not-so-barbaric yawlp
  38. John Lam – John Lam on Software
  39. John Nunemaker – RailsTips
  40. Josh Susser – has_many :through
  41. Lindsay Holmwood – auxesis’ musings
  42. Lyle Johnson – Lovable Lyle
  43. Manik Juneja – { :from => Delhi, :about => everything }
  44. Marc-Andre Cournoyer – macournoyer’s blog
  45. Matt Aimonetti – The Merbist
  46. Matt Todd – Paragon Adrift
  47. Michael Bleigh – Mister Bleigh
  48. Michael Ivey – Michael Ivey
  49. Michael Koziarski – The Rails Way
  50. Mike Gunderloy – A Fresh Cup
  51. Mike Perham – Mike Perham
  52. Mislav Marohnic – No strings attached
  53. Nick Plante – zerosum dirt(nap)
  54. Nick Quaranto – Litany Against Fear
  55. Obie Fernandez – Obie Fernandez
  56. Pat Eyler – On Ruby
  57. Peat Bakke – Peat Dot Org
  58. Peter Cooper – Peter Cooper’s Blog
  59. Peter Szinek – Ruby, Rails, Web2.0
  60. Pratik Naik – 
    has_many :bugs, :through => :rails
  61. PJ Hyett & Chris Wanstrath – Err The Blog
  62. Rick Olson – techno weenie
  63. Richard Roberts – RichText
  64. Ryan Bates – RailsCasts
  65. Ryan Daigle – Ryan’s Scraps
  66. Ryan Tomayko – Ryan Tomayko
  67. Sau Sheong Chang – saush.com
  68. Steve Sanderson – Steve Sanderson
  69. Sur – Expressica::Blog
  70. Tim Kadom – Skiptree
  71. Tom Preston-Werner – Tom Preston-Werner
  72. Tobias Lutke – Too-biased
  73. Yehuda Katz – Katz Got Your Tongue?
  74. Yukihiro Matsumoto (Matz) – Matz’s Blog (Japanese)
  75. Zed Shaw – Zed’s Technical Blog

Blogs gérés par des entreprises

  1. Altoros – Blog on the Business of Software Product Development
  2. Dynamic50 – The Blog of the Fifty Group
  3. ELC Technologies – ELC Technologies
  4. Engine Yard – Union Station
  5. FiveRuns – FiveRuns Blog
  6. Heroku – Heroku| Blog
  7. Highgroove Studios – The Napkin
  8. MorphLabs – Morph Labs Staff Blog
  9. New Bamboo – Bamboo Blog
  10. Relevance Inc. – Relevance Blog
  11. RubyLearning – RubyLearning Blog
  12. Taazza – Taazza newsroom
  13. TheWebFellas – TheWebFellas
  14. Thoughtbot – Giant Robots
  15. Unspace – Rethink

Autres

  1. DB2 on Rails – DB2 on Rails
  2. Odd Thesis – Odd Thesis
  3. Rails on the Run – Rails on the Run
  4. RailsOnWave.com – RailsOnWave.com
  5. Ruby Best Practices – Ruby Best Practices
  6. RubyInside – RubyInside