You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: _posts/2011-04-19-mix-it-un-depart-sur-les-chapeaux-de-roues.markdown
+36-34Lines changed: 36 additions & 34 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -35,49 +35,53 @@ Je retiendrais juste une phrase qui m'a fait beaucoup rire : "Le client est roi
35
35
36
36
Mlle Mathilde Lemee (JDuchess) nous a cueillis de bon matin avec un grand bol de code. Et c'était bien :)
37
37
38
-
[Spock ][3]est un framework de B(ehaviour) D(riven) D(eveloppement) en [Groovy][4].
38
+
[Spock ][3]est un framework de B(ehaviour) D(riven) D(eveloppement) en [Groovy][4].
39
39
En clair, un framework de test compatible Java ou l'on décrit ses tests sous la forme "mon application doit XXX. Etant donné YYYY, lorsque ZZZ alors WWW"
40
40
41
41
Exemple:
42
42
43
-
def "liste should add new elem" () {
44
-
given:
45
-
def list = new ArrayList()
46
-
def elem = "push me"
47
-
when:
48
-
list .add(elem)
49
-
then:
50
-
!list .empty
51
-
list.size() == 1
52
-
list.[0] == elem
53
-
}
43
+
{% highlight groovy %}
44
+
def "liste should add new elem" () {
45
+
given:
46
+
def list = new ArrayList()
47
+
def elem = "push me"
48
+
when:
49
+
list .add(elem)
50
+
then:
51
+
!list .empty
52
+
list.size() == 1
53
+
list.[0] == elem
54
+
}
55
+
{% endhighlight %}
54
56
55
57
Normalement, cela se passe de commentaire : le code est autodocumenté.
56
58
C'est du groovy et ça utilise les labels (Ahhh, le grand retour du goto).
57
59
L'idée est de faire du code de test ultra lisible, à partir des spécifications, et qui sera facilement maintenable.
58
60
59
61
Je n'entre pas dans les détails, mais on peut très facilement, Mocker, Stubber, faire du D(ata)D(riven)D(eveloppment), et même du test d'IHM avec GED (surcouche à Selenium).
60
62
61
-
def "user should be well filed" () {
62
-
setup:
63
-
UserService service = new UserService()
64
-
expect:
65
-
User user = service.get(username)
66
-
user.firstName == firstName
67
-
user.id == userId
68
-
where:
69
-
username | firstname | userId
70
-
'user1' | 'a' | 1
71
-
'user2' | 'b' | 2
72
-
}
63
+
{% highlight groovy %}
64
+
def "user should be well filed" () {
65
+
setup:
66
+
UserService service = new UserService()
67
+
expect:
68
+
User user = service.get(username)
69
+
user.firstName == firstName
70
+
user.id == userId
71
+
where:
72
+
username | firstname | userId
73
+
'user1' | 'a' | 1
74
+
'user2' | 'b' | 2
75
+
}
76
+
{% endhighlight %}
73
77
74
78
75
79
Affaire à suivre !!
76
80
77
81
## Session 2 : Les outils de l'ergonome Agile
78
82
79
-
Session proposée par Cyrille Deruel (ergonome), Florent Chavanat ([chef de projet Agile][5]), tout deux de chez Micropole.
80
-
83
+
Session proposée par Cyrille Deruel (ergonome), Florent Chavanat ([chef de projet Agile][5]), tout deux de chez Micropole.
84
+
81
85
Après une petite introduction sur ce qu'est, et n'est pas l'ergonomie (ce n'est pas un ensemble de recettes, ni une composition de widgets graphiques), les speaker nous expliquent pourquoi ils estiment que les démarches d'un ergonome et celles d'un SCRUM master convergent.
82
86
83
87
Tout tient en quelques mots :
@@ -91,11 +95,9 @@ Florent, l'ergonome, en profite pour passer quelques messages toujours bons à r
91
95
* "le produit doit répond au besoin de l'utilisateur". C'est bête, mais souvent on répond au besoin du client. Notez la nuance.
92
96
* Trop de fonctionnel nuit : il faut focaliser l'utilisateur sur l'essentiel.
93
97
94
-
95
-
96
98
## Session 3 : Introduction a Clojure
97
99
98
-
[Clojure ][6]est un de ces "nouveaux langages de la JVM". Comprenez que c'est un langage avec sa syntaxe et son compilateur propre, mais qui produit du bytecode interprétable sur une JVM classique.
100
+
[Clojure ][6]est un de ces "nouveaux langages de la JVM". Comprenez que c'est un langage avec sa syntaxe et son compilateur propre, mais qui produit du bytecode interprétable sur une JVM classique.
99
101
100
102
Clojure a été inventé par Rich Hikey avec 4 objectifs :
101
103
@@ -109,7 +111,9 @@ C'est aussi un langage de la famille de [Lisp][7].
109
111
110
112
A quoi ça ressemble ? Accrochez-vous. Voila une ligne qui permet d'additionner 2 à 2 tous les éléments d'un tableau, et de renvoyer le tableau résultat.
111
113
112
-
(map fn[it] (+ it 2) [1 2 3])
114
+
{% highlight clojure %}
115
+
(map fn[it] (+ it 2) [1 2 3])
116
+
{% endhighlight %}
113
117
114
118
Et la console interactive affichera \[3 4 5\]
115
119
@@ -135,12 +139,10 @@ Je ne vous le fait pas dire, c'est illisible lorsqu'on a pas l'habitude. Ca fait
135
139
* Interopérable. Aucun problème pour remplacer la couche service de son service Web, et conserver la persistance avec Hibernate et la présentation avec Tapestry.
136
140
* Outillée. On utilise un plugin Eclipse pour éditer le code, et on rassemble tout au sein du même IDE.
137
141
138
-
139
-
140
142
## Session 4 : Intelligence collective avec apache Mahout
141
143
142
-
> -Pourquoi les généraux se baladent-ils toujours à cheval ?
143
-
> -Parce qu'il y a plus de choses dans deux têtes que dans une.
144
+
*Pourquoi les généraux se baladent-ils toujours à cheval ?
145
+
*Parce qu'il y a plus de choses dans deux têtes que dans une.
144
146
145
147
L'idée est donc d'exploiter les informations dispatchées dans nos SI et d'en extraire des choses remarquables.
146
148
[Michaël Figuière][9] (xebia) nous parle de "Machine Learning", de NoSQL, et de moteur de recherche (ce que les américains regroupent sous le vocable "BigData").
Copy file name to clipboardExpand all lines: _posts/2011-04-19-web-socket-are-you-plugged.markdown
+92-89Lines changed: 92 additions & 89 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -26,64 +26,65 @@ Il y a quelques serveurs Java qui implémentent le protocole : jWebSocket, Kaazi
26
26
Sans rentrer dans les détails, Jetty est un serveur Http+Servlet+WebSocket très puissant écrit en java, qui peut être utilisé en mode embarqué ou standalone. Il implémente le brouillon de la norme Websocket depuis un petit moment, et [plutôt simplement](http://blogs.webtide.com/gregw/entry/jetty_websocket_server).
27
27
28
28
{% highlight java %}
29
-
public class WebSocketDummyServlet extends WebSocketServlet{
30
-
31
-
/**
32
-
* Invoked by Jetty during the handshake: Return a WebSocket object to allow
Vous avez besoin d'envoyer des messages à tous les clients connectés ? Vous n'avez qu'à stocker les instances de DummyWebSocket créées, et ajouter une méthode qui utilisera \_outbound.sendMessage().
89
90
@@ -99,63 +100,65 @@ Une minute ! Google donne quelques résultats pour "STOMP Websocket Java". Notam
99
100
Alors j'ai implémenté le protocole STOMP (sans la gestion transactionnelle) et ça m'a pris deux jours. En fait, STOMP est vraiment très simple (tout est en texte, et les sauts de lignes sont significatifs) :
100
101
101
102
**client X, client Y :**
102
-
103
-
CONNECT
104
-
login: X <or> Y
105
-
passcode: <passcode>
106
103
107
-
^@
104
+
CONNECT
105
+
login: X <or> Y
106
+
passcode: <passcode>
107
+
108
+
^@
108
109
109
110
**client Y:**
110
-
111
-
SUBSCRIBE
112
-
destination: /topic-1
113
-
ack: client
114
111
115
-
^@
112
+
SUBSCRIBE
113
+
destination: /topic-1
114
+
ack: client
115
+
116
+
^@
116
117
117
118
**client X:**
118
-
119
-
SEND
120
-
destination: /topic-1
121
119
122
-
hello everyone !
123
-
^@
120
+
SEND
121
+
destination: /topic-1
122
+
123
+
hello everyone !
124
+
^@
124
125
125
126
**et le client Y reçoit:**
126
-
127
-
MESSAGE
128
-
destination:/topic-1
129
-
message-id: <message-identifier>
130
127
131
-
hello everyone !
132
-
^@
128
+
MESSAGE
129
+
destination:/topic-1
130
+
message-id: <message-identifier>
131
+
132
+
hello everyone !
133
+
^@
133
134
134
135
## Et coté client justement ?
135
136
136
137
Le client en javascript est vraiment simple :
137
138
138
-
var location = document.location.toString().replace('http:','ws:');
139
-
this._ws=new WebSocket(location);
140
-
this._ws.onopen=this._onopen;
141
-
this._ws.onmessage=this._onmessage;
142
-
this._ws.onclose=this._onclose;
139
+
{% highlight javascript %}
140
+
var location = document.location.toString().replace('http:','ws:');
141
+
this._ws=new WebSocket(location);
142
+
this._ws.onopen=this._onopen;
143
+
this._ws.onmessage=this._onmessage;
144
+
this._ws.onclose=this._onclose;
143
145
144
-
_onopen: function(){
145
-
},
146
+
_onopen: function(){
147
+
},
146
148
147
-
_send: function(message){
148
-
this._ws.send(message);
149
-
},
149
+
_send: function(message){
150
+
this._ws.send(message);
151
+
},
152
+
153
+
_onmessage: function(message) {}
154
+
{% endhighlight %}
150
155
151
-
_onmessage: function(message) {}
152
-
153
156
Je n'ai pas encore choisi d'implémentation STOMP coté client et dès que je l'aurai fait, je mettrai cet article à jour.
154
-
157
+
155
158
Juste un avertissement : nous l'avons testé à travers des proxies, et ça fonctionne très bien.
156
159
Pas de déconnexion intempestives, pas de ralentissements.
157
160
Mais cela nécessite que le client envoie un keep-alive à travers le socket. Le serveur n'a pas besoin de répondre.
158
-
161
+
159
162
Un message de keep-alive toutes les 10 secondes marche bien, mais j'imagine que cela dépend des configurations des proxies et firewall traversés.
0 commit comments