mercredi 8 septembre 2010

Où trouver une bonne réponse technique : #stackoverflow et #web_applications

Joel Spolsky tient un blog sur le développement qui fait référence dans ce domaine.

Avec son ami Jeff Atwood ils ont lancé avec succès le site de question/réponse : stackoverflow

L'idée directrice est la suivante: quand un développeur est face à un problème comment trouver la bonne solution. Le premier réflexe est de demander à google, mais en cas de réponse multiple, comment choisir la plus pertinente ?

Ainsi le site stackoverflow est une sorte de FAQ géante où il est possible de noter la justesse des réponses.

(copie d'écran du site)



L'auteur à lancé récemment un site analogue pour les applications web (lien ici).
Les sujets ouverts concernent facebook, youtube, google, google-aps etc.






Ces sites sont très utiles, le dernier né propose une charte graphique originale :



ou encore

mardi 7 septembre 2010

Moteurs de recherche #duckduckgo et #blekko

Des alternatives à Google commencent à se mettre en place. Je ne parlerai pas de bing , mais de deux autres moteurs DuckDuckGo et blekko

DuckDuckGO.

(lien ici).

Il met l'accent sur le respect de l'anonymat et sur la fourniture d'astuce pour des recherches plus rapides et plus pertinentes.




La combinaison du caractère '!' suivi d'un mot clé permet de spécifier le domaine de recherche:
!ruby class pour lancer une recherche sur une déclinaison (class) du sujet principal ( ruby) .
Ce moteur est en Perl , hébergé par des serveurs NGINX et du cache avec memcached.


blekko.

Lien ici.

c'est un nouveau moteur de recherche où une authentification est nécessaire (invitation sur demande) . Il permet d'utiliser des '/' slashtag pour affiner les recherches.
Ex : echec /jeux remontera les liens relatifs au jeu d'échec.

Chaque utilisateur maintient ses /shashtag (un peu comme dans twitter)

Mais le point extrèment interressant est la transparence appliquée au moteur de classement. L'algorithme est en opensource et pour mot donné , il sera possible de comprendre le classement des liens.

lundi 6 septembre 2010

#python , #ruby : c'est presque pareil

En relisant un tutorial python en francais , j'ai été frappé par la ressemblance entre Ruby et Python.


Exemple en Ruby


#!/usr/bin/ruby

def dupont
print "dupont\n"
end
def suite(v)
puts v
end
def encore(param1,param2)
puts param1,param2

end
# appel de la fonction
dupont

En Python :



#!/usr/bin/python

def
dupond() :
 print "dupond"

def suite(chaine) :
print chaine

def encore(param1,param2) :
print param1,param2

# appel de la fonction
dupond()



L'obligation d'utiliser les parenthèses dans l'appel d'une methode ou fonction Python a des conséquences étonnantes.

En Python , comme en 'c' , il est possible d'assigner une variable à une fonction
ex : data= suite # sans les parenthèses !

Et de demander data('exemple') pour appeler en coulisse la fonction suite avec le parametre 'exemple'.

La même chose en Ruby est plus compliquée à faire :

data= self.method(:suite)
data.call("coucou")

Ces mécanismes ne doivent pas être confondus avec le currying qui est un procédé qui permet de
transformer une fonction qui a plusieurs parametre en une fonction qui ne prend qu'un paramètre.

Exemple en Haskell :


module Main where
prod x y = x * y
double= prod 2
triple = prod 3


Prelude> :load currying.hs
[1 of 1] Compiling Main             ( currying.hs, interpreted )
Ok, modules loaded: Main.
*Main> double(6)
12
*Main> triple(4)
12

La signature de la fonction prod reflète ce phénomène
*Main> :t prod
prod :: (Num a) => a -> a -> a

(prod 2)4
Un appel à prod retourne une fonction lambda \y = 2 * y
Puis un deuxième appel finalise le calcul en remplacant y par 4 => 8

C'est un système extrêmement important en programmation fonctionnelle.




dimanche 5 septembre 2010

Sicile

Souvenirs de Sicile en 4 photos:


Le site:

dscn2100

Les granites:

dscn2187

Le volcan ETNA:

dscn2220

Un cube au soleil:

dscn2265

samedi 4 septembre 2010

jeux pc :audiosurf et pacman


Pendant que les jeunes passent des heures sur le nouveau jeu à la mode : audiosurf . Les vieux comme moi préfèrent un bon vieux PacMan sur plateau.
source (fluctuat.net)

Dioparama (Lien ici).

Le jeu audiosurf vous propose une course d'obstacle sur vos musiques. Ici la bande son ne sert pas qu'à rythmer ou à souligner l'action, elle est l'élément principal du jeu. Ce petit jeu à deux balles ( 9,9 dollars) connait un succès énorme et rivalise avec les poids lourds des éditeurs.
(Lien du jeu ici.)



mardi 31 août 2010

Modifications à chaud d'un serveur #NGINX


Il est possible d'agir à chaud sur un serveur NGINX :

Au niveau de la configuration

Il faut trouver le numéro de PID du process master de nginx. L'information se trouve soit en ouvrant le fichier PID du daemon

# pid of nginx master process
pid /var/run/nginx.pid;

Soit en lançant la commande ps combinée à la commande grep 'master'.

Puis envoyer au processus le signal HUP (kill -HUP num_de_pid )

Au niveau du binaire.

Il est aussi possible de recompiler nginx et de remplacer le binaire en cours d'exécution

Suivre les instructions suivantes:
  1. Copier le nouvel exécutable nginx à la place de l'ancien
  2. Trouver le numéro de PID (voir ci-dessus)
  3. Envoyer un signal USR2 au processus
  4. Envoyer un signal WINCH au processus
  5. Vérifier l'arrêt des processus worker de l'ancien daemon
  6. Envoyer un signal QUIT au processus.

Le service n'aura pas été interrompu

Deux signaux arrêtent le serveur : QUIT et TERM

QUIT arrête le serveur délicatement alors que TERM l'arrête brutalement

lundi 30 août 2010

#Ruby , #Erlang , #Haskell et les autres

J'ai profité de mes vacances pour lire l'ouvrage suivant:



Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages. (Lien vers l'editeur ici).

Les langages présentés sont :

IO : (lien ici) io est un langage orienté objet inspiré par smaltalk. Son originalité réside dans l'utilisation comme dans javascript d'objets basés sur les prototypes plutôt que sur des classes.
Un objet io (ou javascript) est un simple tableau associatif. Une clé du tableau peut contenir une donnée , une fonction ou une référence vers une fonction d'un prototype. L'instanciation d'un objet se fait par clonage et non pas à partir d'un modèle (template) comme dans le cas des langages basés sur les classes.

Ruby (le top du top)

Prolog.

Scala : (lien ici ) scala est un langage développé par les ingénieurs de twitter basé sur la JVM. Il permet d'utiliser les librairies Java. L'intérêt de scala est de fournir une ouverture vers les langages fonctionnels avec en plus la possibilité de mettre en place des traitements parallèles (concurrents)

Erlang. (lien ici) c'est le langage qui à mon sens permet de débuter avec les langages fonctionnels.


Clojure. (lien ici ) Ce langage est une implémentation de Lisp destinée à utiliser une JVM. Il se présente comme une évolution possible de java.

Haskell. (lien ici) Haskell est le langage fonctionnel par excellence, qui est le fruit d'un travail collectif d'un groupe de chercheurs et non pas une construction d'une personne isolée. Un bon livre de référence est

La lecture de ce livre est difficile, aussi il est possible de lire cet ouvrage collectivement sur le forum suivant: (lien ici )
Une version gratuite et commentée du livre est disponible ici.




Pour chacun de ces langages, l'auteur propose des points à approfondir sur une semaine. Et il interroge les concepteurs de ces langages sur leurs motivations et les perspectives d'évolutions. C'est un très bon livre.

Pour ceux qui sont passionnés de langage et qui veulent se lancer dans l'écriture d'un nouveau langage : le livre à avoir est :(lien ici)
Create Your Own Programming Language de Marc-André Cournoyer

A system to achieve every programmer’s dream.
Learn how to create a simple programming language in a few days with this easy step-by-step guide.