Skip to content

Commit 5d361e7

Browse files
committed
Code highlighting.
1 parent 7a67954 commit 5d361e7

File tree

3 files changed

+132
-126
lines changed

3 files changed

+132
-126
lines changed

_posts/2011-04-19-mix-it-un-depart-sur-les-chapeaux-de-roues.markdown

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -35,49 +35,53 @@ Je retiendrais juste une phrase qui m'a fait beaucoup rire : "Le client est roi
3535

3636
Mlle Mathilde Lemee (JDuchess) nous a cueillis de bon matin avec un grand bol de code. Et c'était bien :)
3737

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].
3939
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"
4040

4141
Exemple:
4242

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 %}
5456

5557
Normalement, cela se passe de commentaire : le code est autodocumenté.
5658
C'est du groovy et ça utilise les labels (Ahhh, le grand retour du goto).
5759
L'idée est de faire du code de test ultra lisible, à partir des spécifications, et qui sera facilement maintenable.
5860

5961
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).
6062

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 %}
7377

7478

7579
Affaire à suivre !!
7680

7781
## Session 2 : Les outils de l'ergonome Agile
7882

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+
8185
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.
8286

8387
Tout tient en quelques mots :
@@ -91,11 +95,9 @@ Florent, l'ergonome, en profite pour passer quelques messages toujours bons à r
9195
* "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.
9296
* Trop de fonctionnel nuit : il faut focaliser l'utilisateur sur l'essentiel.
9397

94-
95-
9698
## Session 3 : Introduction a Clojure
9799

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.
99101

100102
Clojure a été inventé par Rich Hikey avec 4 objectifs :
101103

@@ -109,7 +111,9 @@ C'est aussi un langage de la famille de [Lisp][7].
109111

110112
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.
111113

112-
(map fn[it] (+ it 2) [1 2 3])
114+
{% highlight clojure %}
115+
(map fn[it] (+ it 2) [1 2 3])
116+
{% endhighlight %}
113117

114118
Et la console interactive affichera \[3 4 5\]
115119

@@ -135,12 +139,10 @@ Je ne vous le fait pas dire, c'est illisible lorsqu'on a pas l'habitude. Ca fait
135139
* 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.
136140
* Outillée. On utilise un plugin Eclipse pour éditer le code, et on rassemble tout au sein du même IDE.
137141

138-
139-
140142
## Session 4 : Intelligence collective avec apache Mahout
141143

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.
144146

145147
L'idée est donc d'exploiter les informations dispatchées dans nos SI et d'en extraire des choses remarquables.
146148
[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").

_posts/2011-04-19-web-socket-are-you-plugged.markdown

Lines changed: 92 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -26,64 +26,65 @@ Il y a quelques serveurs Java qui implémentent le protocole : jWebSocket, Kaazi
2626
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).
2727

2828
{% highlight java %}
29-
public class WebSocketDummyServlet extends WebSocketServlet{
30-
31-
/**
32-
* Invoked by Jetty during the handshake: Return a WebSocket object to allow
33-
* the connection establishement.
34-
*
35-
* <em>@param request</em> Http upgrade request
36-
* <em>@return</em> The WebSocket Channel.
37-
*/
38-
protected WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
39-
return new DummyWebSocket();
40-
}
41-
42-
/**
43-
* Websocket channel dummy implementation.
44-
*/
45-
implements WebSocket {
46-
47-
/**
48-
* Object that sends message to the connected client with method
49-
* sendMessage(String message).
50-
*
51-
*/
52-
Outbound _outbound;
53-
54-
/**
55-
* Channel connexion.
56-
*/
57-
public void onConnect(Outbound outbound) {
58-
_outbound=outbound;
59-
}
60-
61-
/**
62-
* Invoked when the client sends a message.
63-
* <em>@param</em> <em>data </em>The sent data
64-
*/
65-
public void onMessage(byte frame, String data){}
66-
67-
/**
68-
* Channel disconnexion.
69-
*/
70-
public void onDisconnect(){}
71-
}
72-
}
29+
public class WebSocketDummyServlet extends WebSocketServlet {
30+
31+
/**
32+
* Invoked by Jetty during the handshake: Return a WebSocket object to allow
33+
* the connection establishement.
34+
*
35+
* <em>@param request</em> Http upgrade request
36+
* <em>@return</em> The WebSocket Channel.
37+
*/
38+
protected WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
39+
return new DummyWebSocket();
40+
}
41+
42+
/**
43+
* Websocket channel dummy implementation.
44+
*/
45+
implements WebSocket {
46+
47+
/**
48+
* Object that sends message to the connected client with method
49+
* sendMessage(String message).
50+
*
51+
*/
52+
Outbound _outbound;
53+
54+
/**
55+
* Channel connexion.
56+
*/
57+
public void onConnect(Outbound outbound) {
58+
_outbound=outbound;
59+
}
60+
61+
/**
62+
* Invoked when the client sends a message.
63+
* <em>@param</em> <em>data </em>The sent data
64+
*/
65+
public void onMessage(byte frame, String data){}
66+
67+
/**
68+
* Channel disconnexion.
69+
*/
70+
public void onDisconnect(){}
71+
}
72+
}
7373
{% endhighlight %}
7474

7575
Plutôt facile, non ? Cette servlet doit être déclarée dans le descripteur web.xml :
7676

77-
<servlet>
78-
</servlet-name>
79-
<servlet-class>org.dummy.WebSocketDummyServlet</servlet-class>
80-
<load-on-startup>1</load-on-startup>
81-
</servlet>
82-
<servlet-mapping>
83-
<servlet-name>wsServlet</servlet-name>
84-
<url-pattern>/*</url-pattern>
85-
</servlet-mapping>
86-
77+
{% highlight xml %}
78+
<servlet>
79+
</servlet-name>
80+
<servlet-class>org.dummy.WebSocketDummyServlet</servlet-class>
81+
<load-on-startup>1</load-on-startup>
82+
</servlet>
83+
<servlet-mapping>
84+
<servlet-name>wsServlet</servlet-name>
85+
<url-pattern>/*</url-pattern>
86+
</servlet-mapping>
87+
{% endhighlight %}
8788

8889
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().
8990

@@ -99,63 +100,65 @@ Une minute ! Google donne quelques résultats pour "STOMP Websocket Java". Notam
99100
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) :
100101

101102
**client X, client Y :**
102-
103-
CONNECT
104-
login: X <or> Y
105-
passcode: <passcode>
106103

107-
^@
104+
CONNECT
105+
login: X <or> Y
106+
passcode: <passcode>
107+
108+
^@
108109

109110
**client Y:**
110-
111-
SUBSCRIBE
112-
destination: /topic-1
113-
ack: client
114111

115-
^@
112+
SUBSCRIBE
113+
destination: /topic-1
114+
ack: client
115+
116+
^@
116117

117118
**client X:**
118-
119-
SEND
120-
destination: /topic-1
121119

122-
hello everyone !
123-
^@
120+
SEND
121+
destination: /topic-1
122+
123+
hello everyone !
124+
^@
124125

125126
**et le client Y reçoit:**
126-
127-
MESSAGE
128-
destination:/topic-1
129-
message-id: <message-identifier>
130127

131-
hello everyone !
132-
^@
128+
MESSAGE
129+
destination:/topic-1
130+
message-id: <message-identifier>
131+
132+
hello everyone !
133+
^@
133134

134135
## Et coté client justement ?
135136

136137
Le client en javascript est vraiment simple :
137138

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;
143145

144-
_onopen: function(){
145-
},
146+
_onopen: function(){
147+
},
146148

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 %}
150155

151-
_onmessage: function(message) {}
152-
153156
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+
155158
Juste un avertissement : nous l'avons testé à travers des proxies, et ça fonctionne très bien.
156159
Pas de déconnexion intempestives, pas de ralentissements.
157160
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+
159162
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.
160163

161164
## J'adore ! Où est le code ?

public/css/style.css

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -316,9 +316,10 @@ article h1 {
316316
}
317317

318318
article pre {
319-
font-family: monospace;
320-
background: #e6e6e6;
321-
color: #999;
319+
font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace;
320+
font-size: 12px;
321+
line-height: 1.4;
322+
background: #eee;
322323
padding: 1em;
323324
border: solid 1px #999;
324325
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy