<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2527666923797847301</id><updated>2012-01-19T10:21:06.360+01:00</updated><category term='asterisk torture'/><category term='radio'/><category term='vote électronique politique'/><category term='sms'/><category term='cluster nfs'/><category term='erlang'/><category term='rant programmation scala entreprise'/><category term='nagios'/><category term='migration'/><category term='PolyLAN'/><category term='uftp'/><category term='Java'/><category term='shatag'/><category term='ipv6 vpn'/><category term='dwarf fortress'/><category term='clusters'/><category term='bastard'/><category term='haskell'/><category term='credit'/><category term='EPFL'/><category term='networking bridge openvz proxy-arp'/><category term='sunrise filtrage ssh'/><category term='ftp'/><category term='multicast'/><category term='cudoku'/><category term='clusters reboot'/><title type='text'>Ferdirand's Log</title><subtitle type='html'>La vie sans histoires d'un ingénieur IT en suisse</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>43</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-7081561890726340499</id><published>2012-01-19T01:24:00.001+01:00</published><updated>2012-01-19T10:21:06.367+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sunrise filtrage ssh'/><title type='text'>Sunrise bloquent-ils le SSH en sortie ?</title><content type='html'>&lt;b&gt;***UPDATE***&lt;/b&gt;: Le filtrage semble avoir disparu. La panne coïncidait avec une mise en maintenance de leur site web, y'avait-il un rapport ? Quoi qu'il en soit, merci Sunrise :)&lt;br /&gt;&lt;br /&gt;Ceci est un appel à témoins pour les clients Sunrise possédant des smartphones.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Depuis hier, mon téléphone est mystérieusement incapable de se connecter en SSH à mes serveurs habituels via la connexion mobile 3G:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;- Si je déplace le serveur SSH sur un port alternatif, ça marche&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp;- Si le téléphone est en wifi, ça marche &lt;/div&gt;&lt;div&gt;&amp;nbsp;- Le problème affecte 3 machines différentes, sur des réseaux complètement différents&lt;/div&gt;&lt;div&gt;&amp;nbsp;- Le problème n'apparait sur aucun de mes autres équipements clients&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Je crois qu'on peut conclure que le problème vient de leur réseau, délibéré ou pas.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si j'observe les tentatives de connexion avec tcpdump, je recois le premier syn, en revanche le synack en retour semble ne jamais atteindre mon téléphone. J'observe 3-4 tentatives de connexion, après quoi le client ssh sur le téléphone abandonne.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quelqu'un a-il observé un comportement similaire ? Je contacterai leur service technique demain pour savoir si c'est délibéré.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-7081561890726340499?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/7081561890726340499/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=7081561890726340499' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/7081561890726340499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/7081561890726340499'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2012/01/sunrise-bloquent-ils-le-ssh-en-sortie.html' title='Sunrise bloquent-ils le SSH en sortie ?'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-797675971147821593</id><published>2011-11-17T15:30:00.002+01:00</published><updated>2011-11-17T15:43:29.271+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vote électronique politique'/><title type='text'>Vote électronique: Critique, Réponses, Coïncidences</title><content type='html'>&lt;span style="font-size: large;"&gt;La Critique&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Le jeudi 20 octobre 2011, le journal 24 heures publiait en courrier des lecteurs (page 26) une lettre signée de "P. Santschi, ancien député au grand conseil et ancien directeur du centre de calcul de l'EPFL". M. Santschi y évoque un système de vote électronique développé au sein du canton de Genève, et mentionne l'absence de garantie cryptographique du secret de vote. Il fait également référence a l'affaire des chevaux de troie utilisés sans cadre légal précis par la police pour traquer la criminalité en ligne. Il évoque, mais sans les préciser, les dangers posés par la combinaison de ces deux technologies.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Ces dangers méritent un éclaircissement. L'opposition à l'utilisation des chevaux de troie ne se justifie pas, comme certains voudraient le faire croire, par un désir de préserver la vie privée. Elle provient d'une part de l'absence d'un cadre légal clair qui devrait être de mise, comme il en est pour les autres prérogatives des services de police; et d'autre de considérations purement techniques liés a la qualité douteuse des logiciels utilisés.&lt;br /&gt;&lt;br /&gt;Il a en effet été révélé que le cheval de troie utilisé par la police allemande, insuffisamment sécurisé, laissait les ordinateurs ouverts a l'abus de tous. Imaginez qu'un enquêteur de police, plutôt que de procéder a la fouille du domicile d'un suspect, fracture systématiquement toutes les serrures et les laisse en l'état, pour faciliter les fouilles ultérieures. Imaginez qu'un cambrioleur en profite pour entrer dans ce domicile, y voler tous les objets de valeur, et y cacher son stock de drogue. Y voyez-vous un problème ?&lt;br /&gt;&lt;br /&gt;L'observation de M. Santschi soulève donc un problème intéressant et souligne l'importance de la création de bases légales claires, et d'une assurance sur la qualité des outils utilisés par les enquêteurs.&lt;br /&gt;&lt;br /&gt;La remarque concernant le non respect du secret de vote est un problème à part, et qui mériterait un article en lui-même.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Les Réponse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Suite à cette lettre, le 24 heures publie, le 31 octobre 2011, toujours dans son courrier des lecteurs (page 27) trois réponses à la lettre de M. Santschi.&lt;br /&gt;&lt;br /&gt;Le site de 24 heures ne répond pas, mais les réponses sont encore dans le cache de google:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://webcache.googleusercontent.com/search?q=cache:KoOBKA6nVsoJ:archives.24heures.ch/VQ/LAUSANNE/-/article-2011-10-3706/a-propos-de-la-lettre-de-lecteur-de-m+claude+bonard+ours+vaudois&amp;amp;hl=fr&amp;amp;client=firefox-a&amp;amp;gl=ch&amp;amp;strip=1"&gt;http://webcache.googleusercontent.com/search?q=cache:KoOBKA6nVsoJ:archives.24heures.ch/VQ/LAUSANNE/-/article-2011-10-3706/a-propos-de-la-lettre-de-lecteur-de-m+claude+bonard+ours+vaudois&amp;amp;hl=fr&amp;amp;client=firefox-a&amp;amp;gl=ch&amp;amp;strip=1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La première, signée Sonia Lardi, de Genthod, titrée "Difficile de le prendre au sérieux", rejette la critique de M. Santschi sur l'absence de secret de vote. A juste titre, Mme Lardi rappelle que les méthodes de vote papier dépendent aussi de la confiance envers l'administration, et qu'il n'y a pas lieu de critiquer un vote électronique qui offre une sécurité aussi bonne que le vote traditionnel.&lt;br /&gt;&lt;br /&gt;Cet argument est incomplet, car il ne prend en considération que le risque d'une action malveillante de la part d'un agent de l'administration, sans considérer la portée de ce risque. Or en gestion du risque, il est nécessaire de quantifier ces deux aspects. La portée d'une action malveillante est beaucoup plus grande avec le vote électronique: si des scrutateurs entrent en collusion pendant le dépouillement pour modifier le compte des bulletins, ils pourront au pire falsifier les résultats d'une circonscription, sans compter le risque d'une recompte. Un informaticien malveillant ayant le contrôle total du système pourra, lui, aisément altérer le vote entier. Il est donc faux de comparer ainsi la sécurité du vote électronique et du vote traditionnel: il est normal d'exiger d'un vote électronique, dont les conséquences sont beaucoup plus graves en cas de faille, une réduction du risque d'attaque, tout comme on doit soumettre (en théorie) les centrales nucléaires à des controles techniques plus stricts que ceux d'une chaudière individuelle.&lt;br /&gt;&lt;br /&gt;Si Mme Lardi se fourvoie dans son raisonnement, elle a au moins le mérite d'apporter un argument concret a l'encontre de la lettre de M. Santschi. Ce n'est pas le cas des deux suivants. &lt;br /&gt;&lt;br /&gt;La deuxième lettre est signée Claude Bonard, de Vernier. Celle-ci met les griefs de M. Santschi envers le système de vote genevois sur le compte d'une rivalité entre cantons, sans plus argumenter.&lt;br /&gt;&lt;br /&gt;La troisième, signée Michel Chevallier, de Mies, intitulé "Quelle bêtise !", reproche à M. Santschi de décrédibiliser l'EPFL et le Conseil National en signant de ces titres ce que M. Chevallier considère comme, je cite, "une ânerie pareille", là encore sans argumenter,.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Les Coïncidences&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cette troisième lettre m'a interpellé parce que le nom de son auteur ne m'est pas inconnu. En effet, l'article du Flash Informatique de Juin 2011 &lt;a href="http://flashinformatique.epfl.ch/spip.php?article2314"&gt;(http://flashinformatique.epfl.ch/spip.php?article2314)&lt;/a&gt; qui décrit l'architecture du système de vote genevois, est signé du même nom. Coïncidence ?&lt;br /&gt;&lt;br /&gt;(Au passage, mon avis personnel, en tant qu'ingénieur diplômé EPF et candidat doctoral en cryptographie, est que ce design présente plusieurs erreurs grossières: transmission de la partie privée d'une clef asymétrique sur le réseau, création d'une table pour inverser un hash, utilisation redondante de chiffrement, et mixage inopérant) Espérons que les schémas présentés soient faux et ne soient pas le reflet du fonctionnement actuel du système.)&lt;br /&gt;&lt;br /&gt;Une recherche sur internet nous apprend qu'une Mme Sonia Lardi a travaillé auprès de la Chancellerie d'Etat. On apprend également qu'un Claude Bonard aurait occupé le poste de secrétaire général de la Chancellerie d'Etat de 2000 à 2010.&lt;br /&gt;&lt;br /&gt;Coïncidences ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-797675971147821593?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/797675971147821593/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=797675971147821593' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/797675971147821593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/797675971147821593'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2011/11/vote-electronique-critique-reponses.html' title='Vote électronique: Critique, Réponses, Coïncidences'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-8976320291160277261</id><published>2011-10-27T13:38:00.000+02:00</published><updated>2011-10-27T13:38:26.568+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='networking bridge openvz proxy-arp'/><title type='text'>Failover IP sur une VM en proxy-arp</title><content type='html'>Le proxy-arp est une technique intéressante qui permet de se passer d'un bridge lorsqu'on héberge des machines virtuelles. Elle empêche également l'admin de la VM de voler des addresses dans le subnet local comme c'est le cas avec un bridge. Cepandant, attention à cette intéraction néfaste avec le failover IP...&lt;br /&gt;&lt;br /&gt;Avec une VM bridgée classique, l'hôte établit un pont entre l'interface réseau physique et les interfaces réseau virtuelles. Les requêtes ARP sur le subnet local sont transmises à toutes les VM, et chaque VM décide ou non d'y répondre, sans contrôle de l'hôte (bien sur on peut utiliser ebtables pour filtrer)&lt;br /&gt;&lt;br /&gt;Au lieu d'utiliser des interfaces virtuelles de type ethernet, on peut également utiliser des liens point-à-point virtuels. Côté VM, l'interface a donc une addresse unique /32, et une addresse p2p fixe (typiquement 10.64.64.64) qui sert de passerelle par défaut. Côté hôte, pas de problème pour avoir une addresse unique sur plusieurs interfaces, parce que les interfaces sont point-à-point, il n'y a donc pas d'ambiguité sur la source. Mais dans cette configuration, comment le routeur du subnet local sait-il qu'il doit addresser les paquets a destination des VM sur l'addresse de l'hôte ?&lt;br /&gt;&lt;br /&gt;En activant le proxy-arp sur l'interface physique de l'hôte, l'hôte répondra en arp pour toutes les addresses qu'il est capable de router. Il suffit donc d'ajouter une route statique vers le bon tunnel point-a-point pour chaque VM. C'est ce que fait, d'ailleurs, le script fourni avec openvz pour la gestion des addresses des VMs.&lt;br /&gt;&lt;br /&gt;Mais que se passe-il si, par mégarde, une VM vient a déconfigurer une addresse qui lui a été allouée, sans en avertir l'hôte ?&lt;br /&gt;&lt;br /&gt;La route statique étant en place, l'hôte va continuer a router les paquets à destination de cette addresse vers le tunnel. Et si le guest a le forwarding activé, il va joyeusement transmettre les même paquets à sa passerelle par défaut, dans le même tunnel, dans l'autre sens.&lt;br /&gt;&lt;br /&gt;Chez moi, ça se traduit par un load average de 12, ksoftirqd qui prend 60% du cpu, et 5 secondes de latence entre chaque caractère tapé en ssh.&lt;br /&gt;&lt;br /&gt;En bridge, ça marche mieux...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-8976320291160277261?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/8976320291160277261/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=8976320291160277261' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/8976320291160277261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/8976320291160277261'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2011/10/failover-ip-sur-une-vm-en-proxy-arp.html' title='Failover IP sur une VM en proxy-arp'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-4855641127631746201</id><published>2011-10-08T19:56:00.002+02:00</published><updated>2011-10-09T20:16:55.540+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ipv6 vpn'/><title type='text'>Tutorial: un VPN ipv6 pour la maison, sous Gentoo</title><content type='html'>&lt;p&gt;Voici comment se fournir un bloc IPv6 &lt;em&gt;statique&lt;/em&gt; a domicile, a partir d'un serveur ayant une addresse v4 stable, avec 6to4 et OpenVPN.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Mes machines, toutes deux sous Gentoo:&lt;br /&gt;* Xolus: serveur housé avec une IP statique sur eth0&lt;br /&gt;* Glokrik: serveur de la maison, IP NAT sur eth0&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;6to4&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;La configuration de 6to4 est facile avec Gentoo. J'ajoute dans /etc/conf.d/net sur xolus:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;link_6to4="eth0"&lt;br /&gt;config_6to4="ip6to4"&lt;br /&gt;depend_6to4() { need net.eth0 }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Et je crée le service correspondant:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ln -s net.lo /etc/init.d/net.6to4&lt;br /&gt;rc-update add net.6to4 default&lt;br /&gt;rc&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Et on teste:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ping6 www.kame.net&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;OpenVPN&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;On emerge openvpn sur les deux machines, et on commence par créer les clefs cryptographiques nécessaires. Pour deux machines les clefs statiques sont plus simples, mais dans l'hypothèse d'un ajout ultérieur de machines je vais utiliser une PKI. Il y a des scripts d'aide dans &lt;code&gt;/usr/share/openssl/easy-rsa/&lt;/code&gt;. On copie ce répertoire vers un rep de travail.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;On y édite le fichier &lt;code&gt;vars&lt;/code&gt; et on ajuste les champs des dernières lignes. Puis on source ce fichier et on génère la CA et les clefs des serveurs:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;. ./vars&lt;br /&gt;./clean-all&lt;br /&gt;./build-ca&lt;br /&gt;./build-key-server xolus&lt;br /&gt;./build-key glokrik&lt;br /&gt;./build-dh&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;On viole techniquement un principe des PKI en générant les clefs client sur le serveur, mais bon ;)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Sur xolus, je copie &lt;code&gt;ca.crt&lt;/code&gt;, &lt;code&gt;dh1024.pem&lt;/code&gt;, &lt;code&gt;xolus.crt&lt;/code&gt; et &lt;code&gt;xolus.key&lt;/code&gt; dans &lt;code&gt;/etc/openvpn/&lt;/code&gt;. Je transfère ensuite &lt;code&gt;ca.crt&lt;/code&gt;, &lt;code&gt;glokrik.key&lt;/code&gt; et &lt;code&gt;glokrik.pem&lt;/code&gt; au meme endroit sur la machine glokrik.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Sur xolus, je crée la définition suivante dans &lt;code&gt;/etc/openvpn/openvpn.conf&lt;/code&gt;:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;port 1194&lt;br /&gt;proto udp&lt;br /&gt;dev openvpn&lt;br /&gt;dev-type tun&lt;br /&gt;tun-ipv6&lt;br /&gt;tls-server&lt;br /&gt;ca ca.crt&lt;br /&gt;cert xolus.crt&lt;br /&gt;key xolus.key&lt;br /&gt;dh dh1024.pem&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Sur glokrik, dans &lt;code&gt;/etc/openvpn/xolus.conf&lt;/code&gt;:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;port 1194&lt;br /&gt;proto udp&lt;br /&gt;remote 213.162.22.228&lt;br /&gt;dev xolus&lt;br /&gt;dev-type tun&lt;br /&gt;tun-ipv6&lt;br /&gt;tls-client&lt;br /&gt;ca ca.crt&lt;br /&gt;cert glokrik.crt&lt;br /&gt;key glokrik.key&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;On ajoute les services openvpn au démarrage. Les machines disposent maintenant chacune d'une interface réseau tunnel supplémentaire, qu'il faut maintenant configurer&lt;/p&gt;&lt;br /&gt;&lt;p&gt;On vérifie sur les deux machines, avec &lt;code&gt;ip link show&lt;/code&gt;, que les deux interfaces sont actives (flag LOWER_UP).&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;Tunnel IPv6&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;On commence par calculer le bloc 6to4 à disposition. L'IP fixe de ma machine est 213.162.22.228, mon bloc 6to4 est donc 2002:d5a2:16e4::/48. (Prefixe 2002, suivi de l'addresse v4 convertie en hexadécimal). Il y a ensuite 16 bits disponibles pour le subnet, je vais utiliser 00ff pour le VPN, et 0001 pour le subnet de ma maison. Dans le subnet vpn, l'addresse ::ff sera attribuée au serveur, et l'addresse ::xxxx au client responsable du subnet xxxx. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Sur xolus, dans /etc/conf.d/net:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;config_openvpn=( "2002:d5a2:16e4:ff::ff/64" )&lt;br /&gt;routes_openvpn=( "2002:d5a2:16e4:1::/64 via 2002:d5a2:16e4:ff::1" )&lt;br /&gt;depend_openvpn() {&lt;br /&gt;need openvpn&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Sur glokrik:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;config_xolus=( "2002:d5a2:16e4:ff::1/64" )&lt;br /&gt;routes_xolus=( "2000::/3 via 2002:d5a2:16e4:ff::ff" )&lt;br /&gt;depend_xolus() {&lt;br /&gt;need openvpn.xolus&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;On ajoute ces deux services au démarrage, on les lance, et on teste le fonctionnement du tunnel:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;glokrik # ping6 2002:d5a2:16e4:ff::ff&lt;br /&gt;PING gw.vpn.xolus.net(2002:d5a2:16e4:ff::ff) 56 data bytes&lt;br /&gt;64 bytes from 2002:d5a2:16e4:ff::ff: icmp&lt;em&gt;seq=1 ttl=64 time=8.54 ms&lt;br /&gt;64 bytes from 2002:d5a2:16e4:ff::ff: icmp&lt;/em&gt;seq=2 ttl=64 time=8.11 ms&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;On active ensuite le forwarding sur la passerelle:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;echo "net.ipv6.conf.all.forwarding = 1" &gt;&gt;/etc/sysctl.conf&lt;br /&gt;sysctl -p&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Glokrik peut maintenant pinguer des sites ipv6 publics:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;glokrik # ping6 www.kame.net&lt;br /&gt;PING www.kame.net(2001:200:dff:fff1:216:3eff:feb1:44d7) 56 data bytes&lt;br /&gt;64 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7: icmp_seq=1 ttl=58 time=340 ms&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;RADVD&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;Il faut maintenant fournir la connectivité ipv6 aux hôtes de la maison. Pour celà il suffit d'installer radvd sur glokrik, et d'y ajouter la conf qui va bien dans &lt;code&gt;/etc/radvd.conf&lt;/code&gt;_&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;interface eth0 {&lt;br /&gt;AdvSendAdvert on;&lt;br /&gt;prefix 2002:d5a2:16e4:1::1/64 {&lt;br /&gt;AdvOnLink on;&lt;br /&gt;AdvAutonomous on;&lt;br /&gt;};&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;On édite ensuite le script de démarrage &lt;code&gt;/etc/init.d/radvd&lt;/code&gt; pour changer la dépendance:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;depend() {&lt;br /&gt;need net.xolus&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ce qui empêche radvd de démarrer tant que le lien vpn n'est pas up.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Notez qu'il n'y a pas besoin d'activer le forwarding ipv6 sur glokrik, le script de démarrage de radvd s'en charge.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;radvd démarré, ma machine de bureau reçoit presque immédiatement une addrese v6, et je peux pinguer des sites publics. &lt;/p&gt;&lt;br /&gt;&lt;h4&gt;6to4reverse&lt;/h4&gt;&lt;br /&gt;Une fois la connexion 6to4 active, il suffit d'aller sur &lt;a href="https://6to4.nro.net"&gt;https://6to4.nro.net&lt;/a&gt; et d'enregistrer ses serveurs de noms pour disposer du reverse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-4855641127631746201?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/4855641127631746201/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=4855641127631746201' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/4855641127631746201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/4855641127631746201'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2011/10/tutorial-un-vpn-ipv6-pour-la-maison.html' title='Tutorial: un VPN ipv6 pour la maison, sous Gentoo'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-521907730710553574</id><published>2011-10-05T20:39:00.003+02:00</published><updated>2011-10-11T20:50:26.993+02:00</updated><title type='text'>Une conférence avec Michel Riguidel</title><content type='html'>&amp;nbsp; J'ai eu le plaisir, cet après-midi, d'assister à une conférence ayant pour thème les dangers et futurs enjeux de la guerre électronique. Parmi les invités, un certain Michel Riguidel, dont le nom m'est alors inconnu, cité comme "conseiller pour le gouvernement français" en matière de cybersécurité, et auteur de plusieurs&amp;nbsp; brevets liés a la sécurité.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Dès la première slide, bien remplie de texte, on comprend que la présentation sera technique et concrète, loin des généralités banales du conférencier précédent. Je m'en réjouis.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Pas pour longtemps, hélas.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Je vais immédiatement mentionner le SEUL point de son discours avec lequel je me trouve en accord: les géants comme Facebook présentent un danger significatif pour la vie privée (pour M. Riguidel, un tel pouvoir est une prérogative d'état.)&lt;br /&gt;&lt;br /&gt;M. Rigidel accumule dans son discours tellement de "WTF"s et d'apparentes inepties que je n'ai la présence d'esprit de tous les noter. Ce dont je me rappelle, en vrac:&lt;br /&gt;&lt;br /&gt;- TCP/IP est complètement obsolète (je suis d'accord pour TCP, mais avec LTE et les futurs réseaux téléphoniques tout IP, on peut se poser la question)&lt;br /&gt;&amp;nbsp;- la liberté sur Internet conduira au nivellement par le bas de la culture (LOL)&lt;br /&gt;&amp;nbsp;- PGP est une catastrope politique (LOL)&lt;br /&gt;&amp;nbsp;- Le chiffrement ne sert qu'aux entreprises désirant narguer le gouvernement en l'empêchant de surveiller ses flux (parce que le gouvernement est incapable d'obtenir une clef de chiffrement par des moyens non-techniques, le citoyen doit renoncer au chiffrement même si cela l'expose aux abus de son ISP ou d'un fournisseur de cloud)&lt;br /&gt;&amp;nbsp;- Cloud et P2P sont des technologies opposées, et populairs par effet de mode mais de nature éphémère.&lt;br /&gt;&amp;nbsp;- L'anonymat sur internet est une catastrophe, des personnalités (dont lui-même) se font diffamer sans aucun contrôle (Effet Streisand, il ne connaît pas ?)&lt;br /&gt;&amp;nbsp;- Les "hippies" soutenant le libre sont une minorité de hackers marginaux dont le travail n'est bénéfique que très occasionnellement (il ne doit pas être au courant de la représentation de Linux dans le top500, tiens).&lt;br /&gt;&amp;nbsp;- Internet est tellement centralisé qu'il se résume aujourd'hui a 300 serveurs&lt;br /&gt;&amp;nbsp;- Puisque la loi de Moore s'est arrêtée en 2008, et comme il est impossible de scaler un système a plus de 4 processeurs, l'arrêt brutal de la performance amènera un "crépuscule numérique". (Larrabee ça n'existe pas)&lt;br /&gt;&amp;nbsp;- L'informatique sera obsolète en 2100 et remplacée par la nanotechnologie.&lt;br /&gt;&amp;nbsp;- Le progrès cryptographique en occident est arrêté depuis 10 ans et les chinois sont largement en avance sur l'europe ou les états-unis.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Ces positions déraisonnables relèvent au mieux de l'incompétence, au pire d'une totale malhonnêteté intellectuelle. Je me demande si M. Riguidel croit vraiment à ce qu'il raconte, ou s'il déforme volontairement la réalité pour pousser un agenda politique.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Pour le dernier point de la liste, je me suis fendu d'une question simple: pourquoi, si la chine est tellement en avance en matière de crypto, les universités chinoises représentent moins de 20% des publications soumises à Asiacrypt 2011 ? réponse de M. Riguidel: "ah mais dans ces conférences le jury est pipé de toute façon." Ben voyons. Et d'étayer son raisonnement par le fait que Xiaoyun Wang, d'origine chinoise, est l'auteure de plusieurs papiers sur des collisions de hachage. Je n'ai pas eu le coeur de lui rappeler qui est a l'origine des collisions sur certificats x509, ou de la factorisation de RSA-768, ou des milliers d'autres problèmes actuels en crypto. Mais bon.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; J'ai pu ainsi me faire, par moi-même, une opinion assez claire du personnage. Mais je suis quand meme allé voir sur google, histoire de voir de quelle "diffamation" il parlait. Je constate que S. Bortzmeyer, personnage avec qui j'ai eu le plaisir de discuter occasionnellement sur IRC, et dont je respecte hautement les compétences techniques, le qualifie ni plus ni moins de &lt;a href="http://www.bortzmeyer.org/riguidel.html"&gt;"Bogdanoff du net"&lt;/a&gt;. Même son de cloche auprès de mes autres connaissances au sein du FrNOG.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Je suis ébahi que l'UNIL offre une telle tribune à ce personnage, qui se permet de prendre position avec une arrogance incroyable sur des sujets sur lesquels le consensus est quasi universel au sein de la communauté scientifique, et sans offrir aucune démonstration ou justification à ses propos. Ebahi et un peu dégoûté.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Dieu merci, les intervenants qui lui ont succédé ont fait preuve de raison et de pragmatisme, sans quoi je serais certainement parti avant la fin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-521907730710553574?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/521907730710553574/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=521907730710553574' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/521907730710553574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/521907730710553574'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2011/10/une-conference-avec-michel-riguidel.html' title='Une conférence avec Michel Riguidel'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-5666976826859476851</id><published>2011-10-04T22:10:00.000+02:00</published><updated>2011-10-04T22:10:40.201+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cluster nfs'/><title type='text'>Tuning NFS pour démarrer un cluster</title><content type='html'>&amp;nbsp; Le cluster AMD64 du LACAL comporte 90 noeuds, pour l'instant tous servis depuis un frontend unique qui héberge leurs racines NFS. En cas de coupure, si tous les noeuds redémarrent en même temps, le serveur NFS se retrouve légèrement surchargé, et plusieurs noeuds se retrouvent dans un état bloqué (kernel panic).&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Une partie des noeuds ne dispose ni de contrôleur IPMI ni de watchdog, ce qui rend les redémarrages un peu chaotiques. Mais la situation peut être grandement améliorée par trois règlages:&lt;br /&gt;&lt;br /&gt;1) Augmenter le nombre de processus pour le démon nfsd. Avec Gentoo ceci se règle par la variable OPTS_RPC_NFSD dans /etc/conf.d/nfsd&lt;br /&gt;&lt;br /&gt;2) Utiliser le port 627 pour le démon mountd (même fichier, variable OPTS_RPC_MOUNTD). C'est le port spécifié n dur dans le noyau au cas ou le portmapper serait trop lent a répondre.&lt;br /&gt;&lt;br /&gt;3) Augmenter la tolérance du client nfs, en passant l'option adéquate au noyau. Ici, dans la config pxelinux de chaque machine:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; append root=/dev/nfs nfsroot=10.1.0.2:/var/nfs/nodexx&lt;b&gt;,retrans=10,timeo=30&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-5666976826859476851?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/5666976826859476851/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=5666976826859476851' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5666976826859476851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5666976826859476851'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2011/10/tuning-nfs-pour-demarrer-un-cluster.html' title='Tuning NFS pour démarrer un cluster'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-84815267744862692</id><published>2011-09-26T17:05:00.000+02:00</published><updated>2011-09-26T17:05:46.802+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bastard'/><title type='text'>Software CPU Upgrade</title><content type='html'>Q: What to do when an annoying customer insists that he wants a CPU from a different brand on his Linux dedicated server ?&lt;br /&gt;A: This: &lt;a href="http://bitbucket.org/maugier/cpufake"&gt;http://bitbucket.org/maugier/cpufake&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-84815267744862692?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/84815267744862692/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=84815267744862692' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/84815267744862692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/84815267744862692'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2011/09/software-cpu-upgrade.html' title='Software CPU Upgrade'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-5027200050178209641</id><published>2011-09-26T17:00:00.000+02:00</published><updated>2011-09-26T17:00:32.043+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asterisk torture'/><title type='text'>Dégoûter les démarcheurs téléphoniques avec Asterisk</title><content type='html'>Les démarcheurs téléphoniques, c'est chiant. Débarassons-nous en avec Aterisk. Au menu: un menu vocal horripilant, et un raccrochage dans la face au bout de quelques minutes.&lt;br /&gt;&lt;br /&gt;D'abord, le matériel: un petit serveur de récup', déja allumé en permanence pour les diverses tâches de la maison. J'y ajoute une interface téléphonique analogique, une &lt;a href="http://www.openvox.cn/en/products/fxofxs-cards/a400p.html?page=shop.product_details&amp;amp;flypage=flypage.tpl&amp;amp;product_id=19&amp;amp;category_id=1"&gt;A400P&lt;/a&gt; de chez &lt;a href="http://www.openvox.cn/"&gt;OpenVox&lt;/a&gt;, avec un module FXO (pour y brancher la ligne téléphonique) et un module FXS (pour y brancher mon ancien téléphone). J'intercale donc mon PBX entre mon téléphone et ma ligne.&lt;br /&gt;&lt;br /&gt;Le serveur est sous Gentoo, j'y installe Asterisk 1.8 ainsi que le driver DAHDI. J'ajoute le module &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;wctdm&lt;/span&gt; dans &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/etc/modules.autoload.d/kernel-2.6&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Il faut ensuite générer la config du driver avec dahdi_genconf, vérifier que les modules FXO et FXS sont bien détectés. Voici le contenu auto-généré de &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/etc/asterisk/dahdi.channels.conf&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;;;; line="1 WCTDM/4/0 FXSKS"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;signalling=fxs_ks&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;callerid=asreceived&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;context=sunrise&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;channel =&amp;gt; 1&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;;;; line="2 WCTDM/4/1 FXOKS"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;signalling=fxo_ks&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;callerid="Maison" &amp;lt;1&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;context=maison&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;channel =&amp;gt; 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Notez que la terminologie est inversée pour le signaling: le module FXO, qui se comporte comme un téléphone, utilise le signaling FXS (car il cause avec la ligne FXS de mon fournisseur) alors que le module FXS, qui cause à mon téléphone, utilise le signaling FXO pour parler a mon téléphone FXO)&lt;br /&gt;&lt;br /&gt;A ce stade on peut lancer Asterisk avec le script système, et attacher la console avec&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;glokrik # asterisk -r&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;...&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=========================================================================&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Connected to Asterisk 1.8.5.0 currently running on glokrik (pid = 31554)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;glokrik*CLI&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On teste en passant un appel bidon, d'abord vers le téléphone (la ligne 2)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;glokrik*CLI&amp;gt; originate DAHDI/2 application sayphonetic ABCDEF&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le téléphone sonne, parle quand on décroche, puis raccroche, youpie.&lt;br /&gt;&lt;br /&gt;On teste un appel sur la ligne sortante:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;glokrik*CLI&amp;gt; originate DAHDI/1/076xxxxxxx application sayphonetic ABCDEF&lt;/div&gt;&lt;br /&gt;Cette fois-ci j'ai un petit bug, Asterisk ne détecte pas correctement le décrochage de la ligne et envoie le message immédiatement. A investiguer, mais sans conséquence pour ce que nous voulons faire.&lt;br /&gt;&lt;br /&gt;Premièrement, rendons le PBX transparent en lui permettant de passer des appels entrants et sortants vers et depuis le combiné de la ligne 2. J'ajoute dans &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/etc/asterisk/extensions.conf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[maison]&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; _X.,1,Dial(DAHDI/1/${EXTEN})&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; _X.,2,Hangup()&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[sunrise]&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s,1,Dial(DAHDI/2&amp;amp;SIP/monpc)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s,2,Hangup()&lt;/div&gt;&lt;br /&gt;Au passage, je fais un tour dans &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sip.conf&lt;/span&gt; et y ajoute un compte pour mon PC, que je nomme &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;monpc&lt;/span&gt;, dans le contexte &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;maison&lt;/span&gt;; mon PC peut maintenant passer des appels sortants. Notez la définition dans le contexte &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sunrise&lt;/span&gt; qui fait également sonner mon pc quand un appel entrant arrive (le premier qui décroche prend l'appel.)&lt;br /&gt;&lt;br /&gt;Maintenant, la partie rigolote: enregistrons un menu vocal idiot. J'utilise Asterisk pour me lancer des appels sur le pc et m'enregistrer:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;glokrik*CLI&amp;gt; originate SIP/monpc application record torture-main.gsm&lt;/div&gt;&lt;br /&gt;Je décroche, et récite trèèèèès lentement, en me pincant le nez, et de manière générale avec une voix stupide: "Bonjour, vous êtes bien chez XXXXXX, meeeerci de choisir une des options suivantes: si vous appelez dans le contexte de blablabla, appuuuuuyez sur 1,..."&lt;br /&gt;&lt;br /&gt;Asterisk enregistre ceci dans le fichier &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;torture-main.gsm&lt;/span&gt;. Je procède de la même manière pour enregistrer chaque message, avec &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;torture-submenu1.gsm&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;torture-submenu2.gsm&lt;/span&gt;, ..&lt;br /&gt;&lt;br /&gt;J'ajoute maintenant dans extensions.conf le contexte [torture] dans lequel je perds les indésirables:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[torture]&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s,1,Background(torture-main)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s,2,Goto(torture,s,1) &lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; 1,1,Goto(torture-submenu1)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; 2,1,Goto(torture-submenu2)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[torture-submenu1]&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s,1,Background(torture-submenu1)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s,2,Goto(torture,s,1)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; 1,1,Goto(torture-sub-sub1)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; 2,1,Goto(torture-sub-sub2)&lt;/div&gt;&lt;br /&gt;etc etc...&lt;br /&gt;&lt;br /&gt;Note le Goto(torture,s,1) à la fin de chaque s de chaque contexte; si l'utilisateur attend la fin du message, il retourne a la racine du menu. Oui, il faut être rapide !&lt;br /&gt;&lt;br /&gt;A la fin de la farce, en divers endroits, un Hangup() se débarasse purement et simplement de l'individu.&lt;br /&gt;&lt;br /&gt;Notre contexte &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;torture&lt;/span&gt; défini, reste à y envoyer les télémarketeurs. Commençons par une blacklist statique. On modifie le contexte de la ligne entrante:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[sunrise]&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s/_00494542801.,1,Goto(torture,s,1) &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s,1,Dial(DAHDI/2&amp;amp;SIP/monpc)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s,2,Hangup()&lt;/div&gt;&lt;br /&gt;Ce qui a pour effet d'envoyer tous les numéros commençant par le préfixe mentionné (qui appartient, je crois, à un institut de sondage) vers le menu insupportable.&lt;br /&gt;&lt;br /&gt;Ajoutons maintenant une redirection dynamique, pour ceci je vais utiliser une featuremap.&lt;br /&gt;Je modifie encore le contexte entrant:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[sunrise]&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s,1,Set(DYNAMIC_FEATURES=torture)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s/_00494542801.,2,Goto(torture,s,1)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s,2,Dial(DAHDI/2&amp;amp;SIP/monpc)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;exten =&amp;gt; s,3,Hangup()&lt;/div&gt;&lt;br /&gt;Et j'ajoute dans &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/etc/asterisk/features.conf&lt;/span&gt;, dans la section &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[applicationmap]&lt;/span&gt;, la ligne suivante:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;torture =&amp;gt; *,self/callee,ChannelRedirect(DAHDI/1-1,torture,s,1)&lt;/div&gt;&lt;br /&gt;Qui a pour effet de rediriger l'appel de la ligne extérieure, la ligne 1, vers le contexte cible. "callee" indique que seul le destinataire (donc mon téléphone local) peut utiliser la fonction.&lt;br /&gt;&lt;br /&gt;Et voila, il me suffit donc d'appuyer sur * pendant un appel, pour me débarasser du télémarketeur intempestif.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-5027200050178209641?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/5027200050178209641/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=5027200050178209641' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5027200050178209641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5027200050178209641'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2011/09/degouter-les-demarcheurs-telephoniques.html' title='Dégoûter les démarcheurs téléphoniques avec Asterisk'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-3388653390570935098</id><published>2010-11-15T14:00:00.004+01:00</published><updated>2010-11-16T18:26:39.793+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Things learned while writing an erlang driver</title><content type='html'>&amp;nbsp; I've spent a couple of days writing an &lt;a href="http://www.erlang.org/"&gt;erlang&lt;/a&gt; binding for &lt;a href="http://allmydata.org/trac/zfec"&gt;zfec&lt;/a&gt;. The binding takes the form of a driver, that is, a shared library written in C that communicates with erlang according to the defined interface.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; The reference doc was ambiguous for some points, which gets summarized here:&lt;br /&gt;&lt;br /&gt;Q: &lt;b&gt;How is the Command parameter of open_port() passed to the ErlDriverEntry .start callback ?&lt;/b&gt;&lt;br /&gt;A: The Command is a string, and the first word (whitespace-separated) must be the name of the driver. The whole string, &lt;b&gt;including the driver name&lt;/b&gt;, is passed to the callback.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Q: &lt;b&gt;If I send a list of binaries to the port, can I expect to get every one of them separately with the outputv callback ? How does the SysIOVec struct work ?&lt;/b&gt;&lt;br /&gt;A: NO. Small binaries, and presumably sub binaries spliced from a common one, may get merged in the resulting ErlIOVec. I've written &lt;a href="http://bitbucket.org/maugier/zfec-erlang/src/tip/iovec.c"&gt;this&lt;/a&gt; to iterate over an ErlIOVec. The doc defines:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;typedef struct {&lt;br /&gt;  int vsize;&lt;br /&gt;  int size;&lt;br /&gt;  SysIOVec* iov;&lt;br /&gt;  ErlDrvBinary** binv;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and does not define (because it is platform-dependant, but in this case we want Unix):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;typedef struct {&lt;br /&gt;    char *iov_base;&lt;br /&gt;    size_t iov_len;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;size&lt;/span&gt; is the total byte size of the whole ErlIOVec. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;vsize&lt;/span&gt; is the number of chunks (which may not match the number of binaries in the original iolist). &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;iov&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;binv&lt;/span&gt; both are arrays of size vsize.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;binv&lt;/span&gt; references the parent refc binaries (so the same binary can appear twice, and you may not be interested in all its data). Use this to manipulate the refcounter of the binary if you need to keep the data around.&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;iov&lt;/span&gt; is the chunks of data you are actually interested in. The two fields should be self-explanatory :)&lt;br /&gt;&lt;br /&gt;Q: &lt;b&gt;Is it OK to define the outputv callback and not output one ?&lt;/b&gt;&lt;br /&gt;A: yes, you will receive an IOVec with a single chunk &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Q: &lt;b&gt;Why does open_port seemingly randomly fail with "bad argument" ?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;A: It will if you try to open a driver that is not loaded. Now, erl_ddll is smart and remembers who loaded which driver, and will unload a driver when it is not needed anymore. If you are testing from the shell, getting an uncaught exception will terminate the shell process and start a new one, which may cause your driver to get unloaded.&lt;br /&gt;&lt;br /&gt;Q: &lt;b&gt;Why is erl_ddll:load/2 asking for a path ? What is a reasonable value to provide ? &lt;/b&gt;&lt;br /&gt;A: According to the OTP doc, the standard way is to use code:priv_dir(app_name)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-3388653390570935098?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/3388653390570935098/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=3388653390570935098' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/3388653390570935098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/3388653390570935098'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2010/11/things-learned-while-writing-erlang.html' title='Things learned while writing an erlang driver'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-6065681667429306400</id><published>2010-11-04T13:51:00.000+01:00</published><updated>2010-11-15T14:11:05.878+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Changement a chaud de la configuration d'ejabberd</title><content type='html'>Depuis le 1er novembre, mon serveur jabber (qui dessert aussi swisslinux.org) dispose du client web &lt;a href="http://www.jappix.com/"&gt;Jappix&lt;/a&gt;, qui nécessite un point de service&amp;nbsp;&lt;a href="http://xmpp.org/extensions/xep-0206.html"&gt;BOSH&lt;/a&gt;. BOSH est supporté nativement par ejabberd, mais il n'était pas activé dans la configuration .&lt;br /&gt;&lt;br /&gt;J'aurais pu redémarrer ejabberd, mais cela aurait provoqué quelques désagréments: déconnexion temporaire de tous les membres utilisant une addresse @swisslinux.org, et déconnexion de la chat-room officielle. Heureusement, il existe un moyen très simple d'ajouter le service à chaud.&lt;br /&gt;&lt;br /&gt;Dans la configuration de ejabberd, il existe un tuple appelé "listen", qui liste un certain nombre de "listeners". Chaque listener est responsable d'un port tcp. Par exemple, par défaut, on trouve le listener suivant:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; {5222, ejabberd_c2s, [{access, c2s}, {shaper, cs2_shaper}, starttls, {certfile, "/etc/ssl/jabber.pem"}]}&lt;/div&gt;&lt;br /&gt;Cela signifie qu'une instance du module ejabberd_c2s (le listener pour les connexions client) écoute sur le port 5222, avec une liste particulière d'options.&lt;br /&gt;&lt;br /&gt;Le listener requis pour BOSH, que j'avais désactivé parce que je n'utilise pas l'interface d'administration web, est le suivant:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; {5280, ejabberd_http, [http_bind]}&lt;/div&gt;&lt;br /&gt;Le listener web est un peu particulier, puisqu'il peut écouter sur un seul port et y fournir plusieurs services sur des chemins différents. L'option http_bind active le service BOSH sur l'addresse /http-bind.&lt;br /&gt;&lt;br /&gt;Pour ajouter ce listener à chaud, il suffit de se connecter au noeud erlang; sur ma distribution favorite, il suffit d'un simple&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;hostname # &lt;b&gt;ejabberdctl debug&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Qui nous donne un prompt erlang:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; (ejabberd@hostname)1&amp;gt;&lt;/div&gt;&lt;br /&gt;On démarre le listener supplémentaire:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; (ejabberd@hostname)1&amp;gt; &lt;b&gt;ejabberd_listener:start_listener(5280, ejabberd_http, [http_bind]).&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Et hop, ça fonctionne... plus qu'a quitter le shell erlang avec un double Ctrl-C !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-6065681667429306400?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/6065681667429306400/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=6065681667429306400' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/6065681667429306400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/6065681667429306400'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2010/11/changement-chaud-de-la-configuration.html' title='Changement a chaud de la configuration d&apos;ejabberd'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-9034630599528046902</id><published>2010-08-25T23:45:00.000+02:00</published><updated>2010-08-25T23:45:15.556+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shatag'/><title type='text'>shatag: un détecteur de doublons</title><content type='html'>Si vous êtes comme moi, il vous arrive fréquemment de déplacer à la main des fichiers volumineux d'un serveur à un autre. Vous n'utilisez pas encore partout un fs distribué, parce que la bande passante disponible ne le permet pas; vous avez des vieilles copies qui trainent dans les coins, et vous ne savez jamais quoi effacer lorsque vous faites le ménage, incapables de vous rappeler si vous avez déja téléchargé le fichier x ou y sur le serveur domestique.&lt;br /&gt;&lt;br /&gt;Voici shatag, un petit script python pour inventorier des fichiers efficacement, et détecter les doublons ou la présence de fichiers identiques sur un stockage distant: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://bitbucket.org/maugier/shatag/"&gt;http://bitbucket.org/maugier/shatag/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Le programme calcule une somme de contrôle SHA-256 pour chaque fichier, et la met en cache dans un attribut étendu POSIX. La somme reste ainsi en cache même si le fichier est déplacé ou renommé. Une modification du fichier invalide la somme, qui peut être recalculée de manière transparente.&lt;br /&gt;&lt;br /&gt;Un autre script permet ensuite de collecter ces sommes via ssh, et de les accumuler dans une base sqlite. Cette base peut ensuite être utilisée pour examiner le fs local, signaler les fichiers qui existent sur un serveur distant, a double ou pas !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-9034630599528046902?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/9034630599528046902/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=9034630599528046902' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/9034630599528046902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/9034630599528046902'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2010/08/shatag-un-detecteur-de-doublons.html' title='shatag: un détecteur de doublons'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-35369391318090665</id><published>2010-06-10T18:37:00.000+02:00</published><updated>2010-06-10T18:37:47.138+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Monoïdes, Flèches, et Pliables: un cas particulier</title><content type='html'>Voici un joli exemple de la puissance du polymorphisme en Haskell. Le contexte est similaire au problème dit de "stream fusion": il s'agit d'effectuer en une seule passe plusieurs calculs qui demandent d'itérer sur une structure de données. L'exemple classique consiste à calculer la moyenne d'une liste:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;average xs = sum xs / length xs&lt;/div&gt;&lt;br /&gt;Cette expression est inefficace, parce que le programme va traverser la liste deux fois: une fois pour calculer le &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sum&lt;/span&gt;, une fois pour le &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;length&lt;/span&gt;. Bien sur, on peut éviter le double passage en implémentant la récursion à la main:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;average = uncurry (/) . foldAverage (0,0) where&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foldAverage (sum,length) [] = (sum,length)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foldAverage (sum,length) (x:xs) = foldAverage (sum+x,length+1) xs&lt;/div&gt;&lt;br /&gt;Ce qui a le désavantage d'être plutôt moche; exprimons le plutôt avec un fold:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;average = uncurry (/) . foldl' (\(s,l) x -&amp;gt; (s+x,l+1)) (0,0)&lt;/div&gt;&lt;br /&gt;Mieux, sans être extraordinaire. Observons qu'encore une fois, les deux opérations qui nous intéressent (la longeur et la somme) son associatives et admettent un neutre: nous sommes donc en présence d'un Monoid.&lt;br /&gt;&lt;br /&gt;Coup de chance, ces deux notions qui nous intéressent sont déja dans la lib standard sous la forme du wrapper &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Sum&lt;/span&gt;, qui transfome n'importe quel &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Num&lt;/span&gt; en Monoid sous l'addition. Mieux: il existe une instance&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(Monoid a, Monoid b) =&amp;gt; Monoid (a,b)&lt;/div&gt;&lt;br /&gt;Qui fait ce que vous pensez: appliquer deux mappend ou mconcat en parallèle.&lt;br /&gt;&lt;br /&gt;Pour calculer notre moyenne, commençons par mapper chaque élément de la liste vers une paire de Monoids additifs, effectuons le concat, et il restera la division finale:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;average = (\(s,l) -&amp;gt; getSum s / getSum l) . mconcat . map (\x -&amp;gt; (Sum x, Sum 1))&lt;/div&gt;&lt;br /&gt;Encore un peu trop verbeux à mon goût: les lambdas peuvent être éliminés grâce aux combinateurs de flèches:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import Control.Arrow&lt;br /&gt;average = uncurry (/) . (getSum *** getSum) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . mconcat . map (Sum &amp;amp;&amp;amp;&amp;amp; (Sum.const 1))&lt;/div&gt;&lt;br /&gt;Cette fois-ci, nous sommes PointFree, un progrès apréciable. Mais nous pouvons encore améliorer les choses. Par exemple, et si nous généralisions la fonction à d'autres types de données (arbres, arrays, ...)&lt;br /&gt;&lt;br /&gt;Nous avons utilisé &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mconcat&lt;/span&gt;, qui n'est autre qu'un fold de mappend. Si nous disposons d'un fold générique pour une structure de données, nous pouvons généraliser. Il existe une classe à ce dessein, la classe &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Foldable&lt;/span&gt;. La définition minimale d'un type Foldable consiste en une seule fonction:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;instance Foldable t where&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foldMap :: (Monoid m) =&amp;gt; (a&amp;nbsp; -&amp;gt; m) -&amp;gt; t a -&amp;gt; m&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Qui applique une fonction (a-&amp;gt;m) au contenu de la structure pour obtenir un Monoid, sur lequel on appelle mappend. Passer par un Monoid garantit que l'opération est associative, ce qui permet dans certains cas d'explorer la structure très efficacement (sujet d'un prochain article).&lt;br /&gt;&lt;br /&gt;Evidemment, par défaut les Lists sont Foldable, et nous pouvons donc réécrire average en utilisant Foldable:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;average = uncurry (/) . (getSum *** getSum) . foldMap (Sum &amp;amp;&amp;amp;&amp;amp; (Sum.const 1)&lt;/div&gt;&lt;br /&gt;Pour la petite histoire: Il existe deux wrappers Bool, les Monoids And et Or, qui utilisent respectivement (&amp;amp;&amp;amp;) et (||) comme opération. Ceci permet d'écrire très simplement une fonction pour controler en une passe si un ensemble de Booléens ne contient que des True, que des False, ou un mix des deux:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;alltruefalse = (getAny *** getAll) . foldMap (Any &amp;amp;&amp;amp;&amp;amp; All)&lt;/div&gt;&lt;br /&gt;Cette expression est équivalente à&amp;nbsp; (or &amp;amp;&amp;amp;&amp;amp; and), avec l'avantage de calculer les deux folds en une seule passe....&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ... ou pas. Cette fonction est en réalité complètement stupide pour deux raisons:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;La définition du Monoid sur les tuples est trop stricte, et force l'itération de la liste jusqu'a la fin, même en présence de deux &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;fold&lt;/span&gt;s paresseux et court-circuités. Ce qui nous amène au point suivant,&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;or&lt;/span&gt; et &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;and &lt;/span&gt;sont court-circuités par défaut, et au moins un de ces deux terminera son évaluation immédiatement après le 1er élément (Si le premier élément est &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;True&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;or&lt;/span&gt; retourne &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;True&lt;/span&gt;, sinon &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;and&lt;/span&gt; retourne &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;False&lt;/span&gt;). La fusion des &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;fold&lt;/span&gt;s n'a donc aucun intérêt dans ce cas particulier !&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-35369391318090665?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/35369391318090665/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=35369391318090665' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/35369391318090665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/35369391318090665'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2010/06/monoides-fleches-et-pliables-un-cas.html' title='Monoïdes, Flèches, et Pliables: un cas particulier'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-1125902323611652073</id><published>2010-06-10T17:51:00.000+02:00</published><updated>2010-06-10T17:51:03.143+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Haskell, c'est concis !</title><content type='html'>Considérez le problème de la rotation d'une liste: On dispose d'une liste &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;xs&lt;/span&gt; de longueur inconnue, on souhaite effectuer une rotation de &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;n&lt;/span&gt; positions (déplacer n éléments du début à la fin.) Faisons une tentative d'implémentation en Haskell, tout a fait normale, en utilisant la récursion sur n:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;rotate 0 xs = xs&amp;nbsp; &lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;rotate n (x:xs) = rotate (n-1) (xs ++ [x])&lt;/div&gt;&lt;br /&gt;C'est bien connu, le ++[x] est très loin d'être efficace (Les listes sont simplement chainées, et immutables, ce qui implique une réallocation complète de l'argument à gauche, donc ici O(l*n) allocations).&lt;br /&gt;&lt;br /&gt;Sacrifions un peu de généralité pour une meilleure implémentation (mais qui n'accepte pas de n supérieur à la taille de la liste):&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;rotate n xs = (drop n xs) ++ (take n xs)&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;take&lt;/span&gt; est une fonction de la librairie standard qui retourne les n premiers éléments d'une liste, tandis que &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;drop&lt;/span&gt; retire ces mêmes n premiers éléments. &lt;br /&gt;&lt;br /&gt;Concis ? pas encore assez. Intéressons-nous à une classe souvent sous-estimée, le Monoid, dont voici la définition:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;class Monoid m where&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mzero :: m&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mappend :: m -&amp;gt; m -&amp;gt; m&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mconcat :: [m] -&amp;gt; m&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;nbsp; mconcat = foldr mappend mzero &lt;/div&gt;&lt;br /&gt;Rien d'extraordinaire ici, la classe Monoid regroupe les types pour lesquels il existe une opération naturelle associative, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mappend&lt;/span&gt;, et un élément neutre des deux côtés, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mzero&lt;/span&gt;.&amp;nbsp; Quant à &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mconcat&lt;/span&gt;, c'est une fonction de convenance dont la définition par défaut est donnée.&lt;br /&gt;&lt;br /&gt;Il existe beaucoup d'exemples de Monoids; on peut citer les nombres entiers dans deux contextes différents (addition et multiplication), le type &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Ordering&lt;/span&gt; (pour décrire un ordre hiérarchique), mais plus simplement: les listes !&lt;br /&gt;&lt;br /&gt;Dans le cas des listes, on à simplement&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;instance Monoid [a] where&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mzero = []&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mappend = (++)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mconcat = concat&lt;/div&gt;&lt;br /&gt;Comme les Monoids sont fort utiles, on peut généraliser le sens de (++) et de concat à tous les Monoids (c'est d'ailleurs le cas en Caleskell):&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import Prelude hiding ((++), concat)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import Data.Monoid&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(++) = mappend&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;concat = mconcat&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ceci nous permet donc d'utiliser &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(++)&lt;/span&gt; sur n'importe quel Monoid, et pas seulement sur les listes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Voyez-vous ou tout ceci nous mène ? Probablement pas encore, sauf si vous&lt;br /&gt;connaissez l'existence de l'instance suivante (dans la librairie standard):&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;instance Monoid a =&amp;gt; Monoid (t -&amp;gt; a)&lt;/div&gt;&amp;nbsp; &lt;br /&gt;dont l'implémentation est laissée comme un exercice au lecteur ;)&lt;br /&gt;&lt;br /&gt;Traduction: si les listes [a] forment un Monoid, les fonctions (t -&amp;gt; [a]) en forment également un ! ce qui me permet par exemple de remplacer la définition&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;f x = g x ++ h x&lt;/div&gt;&lt;br /&gt;par une plus concise:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;f = g ++ h&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A condition que x soit d'un type appartenant à la classe Monoid.&lt;br /&gt;&lt;br /&gt;Encore plus fort, notre instance est récursive ! en effet, on à&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;instance Monoid b =&amp;gt; Monoid (t' -&amp;gt; b) &lt;/div&gt;&lt;br /&gt;(on a juste renommé les variables de type).&lt;br /&gt;&lt;br /&gt;Posons b = (t -&amp;gt; a),&amp;nbsp; on a alors &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Monoid a =&amp;gt; Monoid b&lt;/span&gt;, qui se dérive en&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;instance Monoid a =&amp;gt; Monoid (t' -&amp;gt; (t -&amp;gt; a))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;C'est exact, le truc fonctionne également sur les fonctions à plus d'un argument ! Ce qui nous permet de simplifier immédiatement&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;rotate n xs = (drop n xs) ++ (take n xs)&lt;/div&gt;&lt;br /&gt;en&lt;br /&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;rotate = drop ++ take&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Si ça c'est pas de la concision...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-1125902323611652073?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/1125902323611652073/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=1125902323611652073' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/1125902323611652073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/1125902323611652073'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2010/06/haskell-cest-concis.html' title='Haskell, c&apos;est concis !'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-554882824892170015</id><published>2010-01-25T21:09:00.000+01:00</published><updated>2010-01-25T21:09:41.445+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dwarf fortress'/><title type='text'>Lîlarfikod, "Patternglazed"</title><content type='html'>Journal d'Ushat Olonkulal, Maire de Lîlarfikod - le 12e Hématite 214.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Une dizaine d'années se sont écoulées depuis le premier coup de pioche, porté dans le flanc de la montagne par l'un des septs vaillants nains fondateurs. Jadis hameau perdu au milieu des montagnes, Lîlarfikod est aujourd'hui une métropole florissante. le Duc Kandzudmeng en a fait sa capitale régionale, et une rumeur voudrait que la Reine Inod elle-même y considère l'installation de son palais d'hiver.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; La situation extérieure est au beau fixe; le commerce avec les humains est plus lucratif que jamais, et les kobolds se terrent dans les montagnes après le massacre de leurs troupes pendant le dernier siège. Même ces pleurnichards d'elfes nous sont reconnaissants d'avoir limité l'abattage des arbres. Bah. Comme si le bois présentait un quelconque intérêt face a la pierre. Mais je m'égare.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Non, décidément, c'est la forteresse elle-même qui nous cause le plus d'inquiétude. Il y a six mois, l'équipe de minage sud-est, creusant à la poursuite d'une veine d'argent natif, détectait un secteur de roche anormalement humide. Quelques mètres de plus, et les vaillants mineurs exposaient une immense rivière souterraine, à la présence jusque la totalement insoupçonnée. Voici donc l'origine des rumeurs de monstres aquatiques hantant les sous-sols de cette région !&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Suivant l'ouverture du tunnel, nous essuyâmes une attaque d'hommes-lézards armés jusqu'au dents. L'attaque couta la vie à deux de nos meilleurs soldats, noyés d'épuisement après avoir combattu a mains nues et étranglé une dizaine d'assaillants. Un brave maçon, au péril de sa vie, parvint à murer le dangereux orifice, scellant le péril hors du périmètre du fort.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Nos ingénieurs ayant estimé le tracé de la rivière, je démarrai immédiatement la construction de fortifications en différents points stratégique autour du cours d'eau, et y installai une troupe de nos meilleurs&lt;br /&gt;arbalétriers. La rivière rougit bientôt du sang de nos ennemis tombés !&lt;br /&gt;&lt;br /&gt;&amp;nbsp; L'humidité de la rivière souterraine fertilise nos tunnels, et mes nains me signalent que des champignons Chapeaux-de-Tours poussent un peu partout. Ces champignons, en vieillissant, acquièrent la dureté et la texture du bois. Nous allons creuser une immense ferme souterraine et les y cultiver; voila qui dispensera nos bûcherons de s'exposer au soleil, et devrait par la même calmer les humeurs des bouffeurs de baies des bois.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Cette rivière nous apporte un deuxième avantage, celui de nous débarasser bien plus facilement de nos ordures. J'ai fait creuser une cheminée d'accès, descendant des niveaux principaux jusqu'au gouffre souterrain dans lequel se jette la rivière. Nos concitoyens peuvent maintenant évacuer leurs déchets sans s'aventurer dans les dangereux territoires extérieurs !&lt;br /&gt;&lt;br /&gt;&amp;nbsp; En revanche, toujours rien d'intéressant du côté de l'équipe de minage ouest, chargée d'explorer les veines d'obsidienne à la recherche de magma. En dix ans, nous n'avons pas trouvé une seule veine de houille dans la région, et notre industrie métallurgique dépend entièrement du charbon de bois, ce qui n'est pas pour plaire aux clowns aux oreilles pointues. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; Les lubies du Duc nous causent également des ennuis. Ce fils de yack des montagnes a ordonné que la ville développe une industrie du verre, pour lui fournir de la vaisselle de luxe. Nous n'avons pas les ressources nécessaire pour en produire, et le temps que le message parviennent à nos voisins marchands, qui sait si le vieux fou n'aura pas perdu patience. La dernière fois que nous avons raté un délai (une commande fantaisiste de 12 armoires en electrum), il a condamné a mort l'artisan fautif, notre meilleur forgeron.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Notre meilleure chance reste de convaincre la Reine de venir s'installer dans notre forteresse, et prions qu'elle puisse modérer les excès d'autorité du Duc. Nous allons donc nous atteler à une tâche titanesque: percer la montagne de part en part, pour permettre aux caravanes de traverser en toute sécurité en évitant le dangereux col, propice aux embuscades gobelines. L'entrée du tunnel est terminée, mais nous devons terminer les fortifications intérieures avant de creuser le tunnel principal; sans quoi nos ennemis auront une voie royale pour contourner toutes nos défenses et nous envahir de l'intérieur.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Mais voila que la délégation diplomatique Elfe frappe à nos portes, et je me dois d'aller les acueillir. Encore une dure journée dans la vie d'un vieux bureaucrate nain...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-554882824892170015?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/554882824892170015/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=554882824892170015' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/554882824892170015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/554882824892170015'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2010/01/lilarfikod-patternglazed.html' title='Lîlarfikod, &quot;Patternglazed&quot;'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-371788466462430167</id><published>2009-10-26T16:18:00.000+01:00</published><updated>2011-09-26T16:21:06.361+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clusters reboot'/><title type='text'>Cluster Tricks: cycle reboot</title><content type='html'>Au LACAL, nous avons récemment reçu notre nouveau cluster équipé d'Infiniband, qu'il a fallu mettre en place. Pour des raisons de convenance, rien n'est installé sur les disques des noeuds (qui servent uniquement au swap et au stockage temporaire), et le boot se fait via le réseau.&lt;br /&gt;&lt;br /&gt;Problème 1: le BIOS est idiot - si le netboot échoue, la séquence de boot continue, puis s'arrête. Autrement dit, si un noeud tente de booter alors que le serveur est indisponible, il ne réessaie pas, il s'arrête. Ce qui serait absolument sans conséquence, s'il n'y avait le:&lt;br /&gt;&lt;br /&gt;Problème 2: suite a un glitch administratif, nos noeuds ne sont pas équipés d'IPMI.&lt;span style="font-style: italic;"&gt; &lt;/span&gt;Impossible donc de les redémarrer à distance.&lt;br /&gt;&lt;br /&gt;Solution sympathique: puisque le disque local n'est pas utilisé pour booter, installons-y un système qui va redémarrer la machine. Il ne reste alors plus qu'a ajouter le disque à la fin de la séquence de boot, et le redémarrage sera automatique. Mais comment ?&lt;br /&gt;&lt;br /&gt;Pour une opération aussi simple qu'un reboot, inutile de charger un système complet. On sait que, pour booter sur un disque, le BIOS vérifie d'abord la validité de la table de partitions, puis charge et exécute le code situé dans le MBR, soit le premier secteur du disque. Le code est exécuté en mode réel.&lt;br /&gt;&lt;br /&gt;Jetons un coup d'oeil rapide dans la documentation de Linux. Elle nous apprend l'existence d'une technique primitive de redémarrage, utilisée en dernier ressort: le Triple-Fault.&lt;br /&gt;&lt;br /&gt;Wikipedia contient une page à ce propos, et mentionne son utilisation par Linux. La technique consiste en "installer une table de vecteurs d'interruption vide, puis déclencher une interruption". Quelques recherches sur google indiquent que ceci se fait via l'instruction x86 LIDT. L'argument contient a la fois un pointeur vers la base de la table, et sa longeur; une valeur constante de 0 fonctionne pour créer une table vide.&lt;br /&gt;&lt;br /&gt;Je crée donc un fichier &lt;span style="font-family: courier new;"&gt;reboot.asm&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  lidt [0]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  int 3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Que j'assemble simplement avec nasm:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  max@node ~$ nasm reboot.asm&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  max@node ~$ hexdump reboot&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  0000000 010f 001e cd00 0003                    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  0000007&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Merveilleux. reste à écrire ce fragment dans le MBR de mon disque:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  max@node ~ $ sudo dd if=reboot count=1 conv=notrunc of=/dev/sda&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Presto !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-371788466462430167?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/371788466462430167/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=371788466462430167' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/371788466462430167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/371788466462430167'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2011/09/cluster-tricks-cycle-reboot.html' title='Cluster Tricks: cycle reboot'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-5781104844076492430</id><published>2009-10-01T17:27:00.005+02:00</published><updated>2011-09-26T16:20:14.220+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multicast'/><category scheme='http://www.blogger.com/atom/ns#' term='ftp'/><category scheme='http://www.blogger.com/atom/ns#' term='uftp'/><category scheme='http://www.blogger.com/atom/ns#' term='clusters'/><title type='text'>Cluster Tricks: copie en masse</title><content type='html'>Dans un cluster, la vitesse des disques ou du réseau peut être un facteur limitant critique pour la performance. Considérons le scénario suivant, qui a été rencontré en pratique au Lacal:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Une première phase de calcul est lancée sur chaque noeud, et produit plusieurs GB de données par noeud (stockées dans l'espace de travail sur le disque local)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Une deuxième phase de calcul est lancée, et elle a besoin de toutes les données précalculées sur tous les autres noeuds.&lt;/li&gt;&lt;/ol&gt;Les disques sont assez gros pour acueillir chacun une copie du dataset intermédiaire complet (quelques centaines de GB). Mais comment les distribuer efficacement ?&lt;br /&gt;&lt;br /&gt;Evidemment, un bête SCP ferait l'affaire, mais il serait impensable de le lancer a la main entre les différentes machines suivant un ordonnancement précis (ou alors, trop emmerdant, et pas assez réutilisable).&lt;br /&gt;&lt;br /&gt;Un bête scp de toutes les machines vers un noeud "principal", puis de ce noeud vers les autres, ferait aussi l'affaire. Mais terriblement lent.&lt;br /&gt;&lt;br /&gt;Au moment ou je suis intervenu sur le problème, la copie sur un noeud maître avait déja été faite, mais le scp séquenciel était hors de question (trop lent).&lt;br /&gt;&lt;br /&gt;Une première solution intéressante s'est révélée en Bittorrent. Les outils pour cela sont disponible dans portage (nous avons utilisé BitTornado, qui est un peu plus pratique que le client original "mainline" tout en étant très similaire d'utilisation). Une fois le hash initial accompli sur le noeud maitre (ce qui prend toutefois beaucoup de temps), la copie s'est faite relativement efficacement.&lt;br /&gt;&lt;br /&gt;Mais on est encore très en dessous du maximum théorique, ce qui m'a amené a découvrir la solution idéale pour le job: uftp (&lt;a href="http://www.tcnj.edu/%7Ebush/uftp.html"&gt;http://www.tcnj.edu/~bush/uftp.html&lt;/a&gt;), un système ftp-like over udp, supportant le multicast.&lt;br /&gt;&lt;br /&gt;Avec le multicast, chaque noeud peut envoyer un seul paquet de données au switch, le paquet sera répété sur toutes les interfaces (ou seulement sur les interfaces utiles si le switch gère le Multicast Snooping, ce qui n'était pas notre cas), et chaque machine pourra réceptionner le paquet simultanément, ce qui génère un gain très appréciable de vitesse (dans notre cas, vitesse de copie globale d'environ 400MB/s, au lieu des 6MB/s offerts par scp, et des 150MB/s offerts par bittorrent.)&lt;br /&gt;&lt;br /&gt;L'utilisation est très simple, même si manquant un peu de flexibilité. Le recepteur est un daemon tournant sur chaque machine, qui stockera tous les fichiers reçus dans un répertoire public sur le disque local. L'émetteur est un client lancé par un utilisateur, qui prendra simplement un nom de fichier en argument.&lt;br /&gt;&lt;br /&gt;Evidemment, ce système est totalement abusable et n'intègre absolument aucune sécurité. et ne doit être employé qu'a l'intérieur d'un réseau de confiance. L'ebuild est disponible ici (&lt;a href="https://xolus.net/%7Emax/uftp-ebuild.tar.gz"&gt;https://xolus.net/~max/uftp-ebuild.tar.gz&lt;/a&gt;) en attendant qu'elle fasse son chemin dans Sunrise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-5781104844076492430?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/5781104844076492430/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=5781104844076492430' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5781104844076492430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5781104844076492430'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2009/10/cluster-tricks-copie-en-masse.html' title='Cluster Tricks: copie en masse'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-5946880195297105012</id><published>2009-06-09T16:46:00.010+02:00</published><updated>2009-10-06T16:35:27.746+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='credit'/><category scheme='http://www.blogger.com/atom/ns#' term='sms'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Contrôler le crédit sur une carte SIM avec Nagios</title><content type='html'>Il est inutile de présenter &lt;a href="http://www.nagios.org/"&gt;Nagios&lt;/a&gt;, un système de monitoring très populaire et flexible.&lt;br /&gt;&lt;br /&gt;J'ai la chance d'avoir a disposition, depuis mon serveur Nagios, un modem GSM très pratique pour envoyer des SMS d'alerte en cas de problème sur un service quelconque. Pour l'envoi de SMS, j'utilise &lt;a href="http://smstools.meinemullemaus.de/"&gt;SMSTools&lt;/a&gt;, qui s'installe sous la forme d'un daemon prenant le contrôle&lt;br /&gt;du modem, et d'un répertoire de spooling (/var/spool/sms) dans lequel on dépose les messages sortants, au format adéquat.&lt;br /&gt;&lt;br /&gt;Pour rendre la chose plus facile, il existe également un script d'envoi simple (sendsms) qui a l'avantage d'éviter les problèmes classiques aux répertoires de spool (conditions de course, etc..). Nagios se configure très simplement pour envoyer des notifications:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;define command{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        command_name    notify-host-sms&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        command_line    /usr/local/sbin/sendsms $CONTACTPAGER$ "'Host $HOSTNAME$ is $HOSTSTATE$'"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;define command{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        command_name    notify-service-sms&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        command_line    /usr/local/sbin/sendsms $CONTACTPAGER$ "'Service $SERVICEDESC$ @ $HOSTALIAS$ is $SERVICESTATE$'"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;C'est parfait, tout va bien. Mais la carte SIM installée dans le modem est une carte prépayée. Comment faire si le crédit sur cette carte s'épuise ? nous allons justement utiliser Nagios pour surveiller le crédit sur la carte, et émettre un avertissement s'il tombe trop bas.&lt;br /&gt;&lt;br /&gt;Avec mon opérateur téléphonique, on peut contrôler son crédit restant depuis le téléphone, en entrant une commande de service au clavier: *130#. Le téléphone répond avec un message indiquant le crédit restant.&lt;br /&gt;&lt;br /&gt;Quelques recherches sur google indiquent que ce type de commandes s'envoie au modem au moyen de la commande AT CUSD. On teste immédiatement avec minicom:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;AT+CUSD=1,*130#,15&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;OK&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;+CUSD: 2,"Credit actuel: CHF -0,44; 25 SMS gratuits jusqu'au 01.10.2009",15&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Reste a interagir correctement avec le modem, ce qui n'est pas totalement trivial a cause de quelques détails pratiques. J'utilise pour piloter le terminal un obscur outil appelé comgt, un équivalent de "chat" (le système de script utilisé par ppp) mais en plus flexible. Voila le script (a mettre dans /etc/comgt/credit):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;set com 115200n81&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;set senddelay 0.05&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;send "AT+CUSD=1,*130#,15^m"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;waitfor 60 "+CUSD:"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;get 10 "^m" $s&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;print "Reply: ",$s,"\n"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On teste avec comgt:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;gate # comgt -d /dev/ttyS0 credit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;SIM ready&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Waiting for Registration..(120 sec max)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Registered on Home network: "Swisscom"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Signal Quality: 21,99&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Got: "  2,"Crdit actuel: CHF -0,44;  Xtra-liberty: 25 SMS gratuits jusqu'au 01.11.2009.",15&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Reste à traiter la sortie pour l'envoyer vers nagios (exercice pour le lecteur parce que je suis paresseux).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-5946880195297105012?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/5946880195297105012/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=5946880195297105012' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5946880195297105012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5946880195297105012'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2009/06/controler-le-credit-sur-une-carte-sim.html' title='Contrôler le crédit sur une carte SIM avec Nagios'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-2358950553953348820</id><published>2009-05-25T10:45:00.002+02:00</published><updated>2009-05-25T10:59:04.208+02:00</updated><title type='text'>Gare au Hadophishing !</title><content type='html'>J'ai discuté récemment avec un internaute français, téléchargeur occasionnel, qui était persuadé d'avoir reçu un mail d'avertissement Hadopi.&lt;br /&gt;&lt;br /&gt;  Le mail en question est arrivé sur la mailbox de son ISP, "contre-signé par la gendarmerie", et incluait des prétendues preuves sous la forme d'une liste de téléchargements avec dates et heures.&lt;br /&gt;&lt;br /&gt;  J'ai hésité un instant. Pour autant que je sache, l'infrastructure Hadopi est loin d'être opérationnelle, cet e-mail était donc selon toute vraisemblance une tentative de phishing.&lt;br /&gt;&lt;br /&gt;  Comment la liste de téléchargements a-elle été produite ? Etait-ce simplement une liste aléatoire de titres populaires ? Comment un phisher pourrait-il relier une liste de téléchargements à une mailbox d'ISP ? Il est sûrement assez facile de moissonner des adresses IP sur un réseau P2P public, mais le lien avec les mailboxes correspondantes ne devrait être connu de personne hormis l'ISP.&lt;br /&gt;&lt;br /&gt;  Faut-il donc voir une brèche de sécurité chez son ISP ? un employé mécontent aurait-il pu revendre ces informations à un phisher ? ou pire, l'attaque pourrait-elle directement émaner d'un insider ?&lt;br /&gt;&lt;br /&gt;  Tout ceci fait réfléchir aux implications du processus prévu par la loi Hadopi. Les mails de phishing de ce genre sont une deuxième attaque évidente contre ce processus (la première est l'envoi de plaintes arbitraires et invérifiables a l'encontre d'inconnus)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-2358950553953348820?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/2358950553953348820/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=2358950553953348820' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/2358950553953348820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/2358950553953348820'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2009/05/gare-au-hadophishing.html' title='Gare au Hadophishing !'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-33573526399132425</id><published>2008-04-10T23:18:00.003+02:00</published><updated>2008-04-10T23:25:56.943+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PolyLAN'/><title type='text'>Threads perl avec Gentoo - Beware !</title><content type='html'>Je viens de perdre deux bonnes heures avec un problème bien tordu.&lt;br /&gt;&lt;br /&gt;  A PolyLAN X, il semblerait que la cause du gros foirage de l'authentification soit dû non pas au dimensionnement du nombre de transactions autorisé, comme je l'ai d'abord pensé, mais au fait que l'interpréteur Perl n'était pas threadé, et que par conséquent un seul login simultané pouvait avoir lieu pour le serveur radius.&lt;br /&gt;&lt;br /&gt;  Après un "echo dev-lang/perl ithreads &gt;&gt;/etc/portage/package.use ; emerge perl", radiusd s'est retrouvé incapable de démarrer, se plaignant d'un symbole manquant dans le module rlm_perl.&lt;br /&gt;&lt;br /&gt;  Ré-emerger freeradius n'a bien entendu rien donné.&lt;br /&gt;&lt;br /&gt;  Le problème était qu'a la compilation, freeradius à utilisé les headers de perl pour compiler son module, mais au lancement, il se liait dynamiquement à la libperl. Sous Gentoo, l'interpréteur perl et la libperl sont deux packages séparés, et je n'avais pas réinstallé la libperl.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  De manière générale, plein de problèmes de linking sont apparus. Ces problèmes auraient du être résolus par perl-cleaner; malheureusement, si perl threadé et non threadé sont considérées comme des versions différentes, avec des répertoires séparés pour les libs, perl-cleaner les considère comme une seule et même version, et ne déclenche pas la reconstruction par défaut. Il fallait donc utiliser "perl-cleaner allmodules" plutot que "perl-cleaner modules".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-33573526399132425?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/33573526399132425/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=33573526399132425' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/33573526399132425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/33573526399132425'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2008/04/threads-perl-avec-gentoo-beware.html' title='Threads perl avec Gentoo - Beware !'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-4322197788246449324</id><published>2008-03-30T21:35:00.003+02:00</published><updated>2008-03-30T22:04:54.314+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PolyLAN'/><title type='text'>PolyLAN XI, Topologie Réseau</title><content type='html'>Voici le plan pour la topologie du réseau PolyLAN XI (en admettant que nous recevions bien le 6248 à temps)&lt;br /&gt;&lt;br /&gt;Places: 216&lt;br /&gt;&lt;br /&gt;Couche Physique :&lt;br /&gt;&lt;br /&gt;Au centre, le 6242 en haut du rack. Fifi, Riri, Loulou sur ports 1,2,3.&lt;br /&gt;ports 27-48 trunkés par paires, donc 11 trunks (9 zones joueurs, 2 zones admin)&lt;br /&gt;ports 4-26 pour serveurs de jeu.&lt;br /&gt;&lt;br /&gt;Couche Ethernet :&lt;br /&gt;&lt;br /&gt;Vlan 1: réseau de production. Vlan par défaut, untagged partout sauf ports 2 et 3&lt;br /&gt;Vlan 10: réseau administratif. Tagged sur tous les trunks et sur port 1 (fifi)&lt;br /&gt;Vlan 20: réseau passerelle vers internet. Untagged sur ports 2 et 3.&lt;br /&gt;&lt;br /&gt;Couche IP:&lt;br /&gt;&lt;br /&gt;Réseau administratif: 10.0.4.0/24 sur Vlan 10.&lt;br /&gt; Fifi: 10.0.4.10&lt;br /&gt;&lt;br /&gt;Réseau passerelle: 10.0.8.0/24 sur Vlan 20.&lt;br /&gt; Core: 10.0.8.1&lt;br /&gt; Adresse de routage flottante: 10.0.8.2&lt;br /&gt; Loulou (primaire): 10.0.8.3&lt;br /&gt; Riri (secours): 10.0.8.2&lt;br /&gt;&lt;br /&gt;Réseau production: 10.0.0.0/22 sur Vlan 1&lt;br /&gt; 10.0.0.0/24 : Services réseau&lt;br /&gt;   10.0.0.1: Core&lt;br /&gt;   10.0.0.2: Fifi&lt;br /&gt; 10.0.1.0/24 : Serveurs &amp;amp; Admins&lt;br /&gt; 10.0.2.0/23 : Joueurs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pfew.... un vrai jeu d'enfant, comparé à PolyLAN X :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-4322197788246449324?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/4322197788246449324/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=4322197788246449324' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/4322197788246449324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/4322197788246449324'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2008/03/polylan-xi-topologie-rseau.html' title='PolyLAN XI, Topologie Réseau'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-6371480050437341518</id><published>2008-03-30T13:51:00.001+02:00</published><updated>2008-03-30T13:54:57.428+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='radio'/><title type='text'>C'est pas demain que j'aurai ma license...</title><content type='html'>... Vu que la personne qui s'occupe de ça a l'OFCOM a pris des vacances. Du coup, va falloir attendre encore un peu... frustration frustration&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-6371480050437341518?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/6371480050437341518/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=6371480050437341518' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/6371480050437341518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/6371480050437341518'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2008/03/cest-pas-demain-que-jaurai-ma-license.html' title='C&apos;est pas demain que j&apos;aurai ma license...'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-7053804178006552630</id><published>2008-03-11T21:34:00.006+01:00</published><updated>2008-03-12T20:18:37.086+01:00</updated><title type='text'>Diplôme, HAM-Radio, LACAL, Polylan</title><content type='html'>Ca y est, je suis "Officiellement autorisé à porté le titre d'ingénieur en systèmes de communication", avec le petit papier qui va bien. Je ne suis donc plus un bon a rien d'étudiant, yesss !&lt;br /&gt;&lt;br /&gt; Petite geulante contre l'administration de l'EPFL: c'est bien d'avoir une gestion automatique des droits, avec un bel annuaire LDAP et tout. Mais quand le lendemain de la réception de la jolie enveloppe, on se retrouve avec tous les accès physiques et une bonne partie des accès éléctroniques coupés, ça fait un peu l'effet d'un bon coup de pied au cul... et c'est pas franchement pratique pour finaliser les projets encore en cours.&lt;br /&gt;&lt;br /&gt; Mercredi, j'ai passé l'examen de radio-amateur CEPT. J'attends de recevoir la concession. En attendant, j'ai fait l'acquisition d'un IC-271E en excellent état pour le 145MHz, et une antenne GP qui va avec. J'ai posé l'antenne sur le balcon du toit d'INJ en attendant de pouvoir faire mon premier QSO légal. J'ai aussi une superbe antenne magnétique pour la HF, qui venait avec un tuner automatique et SWR-mètre intégré. Malheureusement je n'ai pas (encore) de transceiver HF.&lt;br /&gt;&lt;br /&gt; Je suis sur le point d'être engagé par le LACAL avec pour mission officielle de mettre en place le cluster de playstations. Nous avons gardé le front-end que j'avais configuré il y a trois mois, mis au point un schéma d'allocation d'adresses et de noms. Dans un premier temps, il n'y aura pas de scheduler, les noeuds seront directement accessibles en SSH depuis le front-end. Nous allons probablement acheter une meilleure machine pour le front-end, et reconvertir l'ancien en station de gestion réseau. Aujourd'hui, Dag Arne a enfin obtenu les droits administratifs de resp. technique du labo, ce qui nous à permis d'obtenir une adresse fixe pour ce foutu front-end. L'objectif est de pouvoir lancer les premiers calculs à la fin de la semaine prochaine.&lt;br /&gt;&lt;br /&gt; PolyLAN XI aura lieu le w-end du 12-13 Avril, au hall du SG à l'EPFL. Ceci risque d'être ma dernière ou avant-dernière édition :( Grâce au soutien technique de Dell, nous allons pouvoir acquérir à prix préférentiel un superbe PC6248 tout neuf, ce qui couvrira nos besoins pour cette édition en terme d'interconnexions Gigabit. La performance niveau ARP devrait rester bonne puisque nous gardons un routeur matériel, et il n'y aura plus de trunk limitant au milieu qui coupe la salle en deux.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-7053804178006552630?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/7053804178006552630/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=7053804178006552630' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/7053804178006552630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/7053804178006552630'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2008/03/diplme-ham-radio-lacal-polylan.html' title='Diplôme, HAM-Radio, LACAL, Polylan'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-1806057985512697461</id><published>2008-02-01T13:41:00.000+01:00</published><updated>2008-02-01T13:45:04.609+01:00</updated><title type='text'>Yatta !</title><content type='html'>Ca y est, j'ai rendu mon mémoire de master !&lt;br /&gt;&lt;br /&gt;La défense aura lieu le 18 février. D'ici la, un peu de temps pour me reposer !&lt;br /&gt;&lt;br /&gt;Accessoirement, comme une bonne nouvelle ne vient jamais seule: le papier dont je suis co-auteur (Parity-regular Steinhaus graphs) a été accepté par l'AMS et sera publié dans leur prochaine édition ! (détails &lt;a href="http://www.ams.org/mcom/0000-000-00/S0025-5718-07-02063-7/home.html"&gt;ici&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-1806057985512697461?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/1806057985512697461/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=1806057985512697461' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/1806057985512697461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/1806057985512697461'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2008/02/yatta.html' title='Yatta !'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-1513774096656970096</id><published>2008-01-16T23:48:00.000+01:00</published><updated>2008-01-16T23:55:00.535+01:00</updated><title type='text'>EPFL::Restaurant</title><content type='html'>Voici mon dernier gadget Perl, le module &lt;a href="http://xolus.net/%7Emax/Restaurant.pm"&gt;EPFL::Restaurant&lt;/a&gt;. Il permet d'accéder directement aux menus hebdomadaires sur &lt;a href="http://restauration.epfl.ch"&gt;http://restauration.epfl.ch&lt;/a&gt;. La doc POD explique sommairement son utilisation.&lt;br /&gt;&lt;br /&gt;Dépendances: LWP, HTML::TableExtract&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-1513774096656970096?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/1513774096656970096/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=1513774096656970096' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/1513774096656970096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/1513774096656970096'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2008/01/epflrestaurant.html' title='EPFL::Restaurant'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-1023884103814861789</id><published>2008-01-11T11:04:00.000+01:00</published><updated>2008-01-11T19:45:05.769+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant programmation scala entreprise'/><title type='text'>Sus aux "programmeurs d'entreprise" !</title><content type='html'>Suivant une discussion plus ou moins aléatoire sur #scala/Freenode, j'ai suivi par hasard &lt;a href="http://stephan.reposita.org/archives/2008/01/09/qi4j-the-next-java-forget-scala/"&gt;ce rant&lt;/a&gt;, qui m'a conduit à &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=221903"&gt;cet autre rant&lt;/a&gt;, sans compter &lt;a href="http://creativekarma.com/ee.php/weblog/comments/my_verdict_on_the_scala_language/"&gt;celui-là&lt;/a&gt;. Amusant, suivant de près &lt;a href="http://www.stsc.hill.af.mil/CrossTalk/2008/01/0801DewarSchonberg.html"&gt;ce dernier&lt;/a&gt; lancé il y a peu de temps sur Slashdot.&lt;br /&gt;&lt;br /&gt; Je n'ai absolument aucune compétence en Scala, n'ayant jamais rien programmé d'utile avec. Je n'en ai pas encore eu l'opportunité. Je n'ai donc pas d'intérêts particuliers à défendre Scala.&lt;br /&gt;&lt;br /&gt; En revanche, je trouve absolument effarant et dramatique l'avis de ces prétendus programmeurs&lt;br /&gt;, et reste béat devant l'absurdité et l'incohérence de leur discours. Par ou commencer ?&lt;br /&gt;&lt;br /&gt; Le plus incroyable reste certainement celui qui prétend que les évolutions sophistiquées du langage Java le condamnent, que les génériques étaient une erreur monumentale, les casts étant un mécanisme bien plus naturel, et qu'il est hors de question d'y ajouter des fermetures, encore moins des horreurs fonctionnelles; que ces solutions sont bonnes uniquement pour des chercheurs isolés dans leur tour d'ivoire, mais que les "vrais programmeurs" qui travaillent sur des applications "business" n'en ont pas besoin.&lt;br /&gt;&lt;br /&gt; Mais quelle sorte de programmeur prendrait donc une telle position ?? Ces gens seraient nés quelques dizaines d'années plus tôt, ils auraient été du lot qui défendait fermement le COBOL contre tous ces langages modernes bizarres et sans intérêts comme le C ou le Pascal... la récursion ? la programmation structurée ? baaah, ca sert a rien, c'est inutile, et le Lisp on en parle même pas..&lt;br /&gt;&lt;br /&gt; Mon premier langage de programmation fut le Basic. Avec mes premiers pas d'autodidacte, j'ai produit quantité de code bancal et inélégant. Et au fur et a mesure que ce code expérimental boiteux s'accumulait, je commençais à identifier des problèmes récurrents.&lt;br /&gt;&lt;br /&gt;J'ai découvert le Pascal, et la programmation structurée. Me suis-je dit "beeeeh, c'est compliqué, les gosub ca suffit, et la récursion ca s'émule avec des boucles quoi qu'on dise" ? certes non! Enfin, l'assurance d'un scope restreint, la fin de l'erreur de typo a la ligne 1642 qui plante le programme à la ligne 492...&lt;br /&gt;&lt;br /&gt;J'ai découvert les pointeurs en C. Me suis-je dit: "beeeeh, c'est compliqué, c'est dur a comprendre, de toutes façons je peux tout faire avec des tableaux et des indices" ? certes non! enfin des noms cohérents pour des alternatives hétérogènes !&lt;br /&gt;&lt;br /&gt;J'ai découvert Perl, premier contact avec les fermetures. Je ne savais même pas ce qu'était une fermeture. Pourtant, c'est grâce aux fermetures qu'une bonne partie du code perl faisant appel à des subs anonymes fonctionne correctement après un premier jet...&lt;br /&gt;&lt;br /&gt;J'ai découvert Java. Après avoir travaillé sur plusieurs programmes relativement sophistiqués, j'ai mordu la poussière sur des erreurs de typage dynamique, je haïssais le système de types de Java et en particulier la technique hideuse du cast systèmatique pour utiliser une collection. Avec Java 5, j'ai découvert les génériques. Me suis-je dit: "beeeeh, les casts sont bien plus faciles, de toutes facons ces types sont juste un encombrement inutile ?" certes non ! les génériques me donnaient la garantie de l'absence d'erreurs de type dans mon programme, au prix de quelques modifications très intuitives.&lt;br /&gt;&lt;br /&gt;J'ai découvert Haskell, le premier langage fonctionnel que j'ai utilisé sérieusement. Me suis-je dit: "baaah, les fonctions d'ordre supérieur, c'est inutile, c'est un passe-temps d'académique inutile dans la vraie vie ?" certes non ! j'abusais déja des map, grep et sort en Perl, et quel plaisir de pouvoir utiliser des callbacks sans définir une centaine de classes internes de 3 lignes, comme il est nécessaire de faire en java !&lt;br /&gt;&lt;br /&gt; Que dire maintenant, des deux dirigeants d'AdaCore, qui se plaignent que l'enseignement de Java comme langage primaire dans les universités a été une terrible décision. Java "encouragerait les programmeurs a chercher des solutions toutes faites dans des librairies pré-existantes, plutôt que de développer ses propres routines plus performantes."&lt;br /&gt;&lt;br /&gt; HELLOOO ? il me semble que l'immense majorité de la communauté s'accorde à dire que la performance était le problème de la dernière décennie; la loi de Moore n'a de loin pas l'air de s'essoufler, et les évolutions récentes des langages de programmation se font toutes dans la même direction: améliorer la ré-usabilité du code. Quel idiot choisirait de pénaliser un programmeur qui préfère chercher une solution standard, éprouvée, répandue, et optimisée par sélection naturelle, plutôt que de réinventer une roue octogonale chaque fois que l'occasion le permet ?&lt;br /&gt;&lt;br /&gt;Ces gens m'énervent. ça m'énerve. Rhaaaah&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-1023884103814861789?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/1023884103814861789/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=1023884103814861789' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/1023884103814861789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/1023884103814861789'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2008/01/sus-aux-programmeurs-dentreprise.html' title='Sus aux &quot;programmeurs d&apos;entreprise&quot; !'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-3797489478671921813</id><published>2007-12-10T22:12:00.000+01:00</published><updated>2007-12-10T22:38:09.467+01:00</updated><title type='text'>Softs ham-radio</title><content type='html'>J'ai écrit quelques ebuilds pour des logiciels de radio-amateurisme qui ne sont pas dans portage:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://xolus.net/%7Emax/hamradio-ebuilds-pack.tar.gz"&gt;https://xolus.net/~max/hamradio-ebuilds-pack.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Contenu:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;xastir-1.9.2 - X Amateur Station Tracking and Information Reporting&lt;br /&gt;&lt;/li&gt;&lt;li&gt;fldigi-2.05 - Digital Modem&lt;br /&gt;&lt;/li&gt;&lt;li&gt;xlog-1.6 - QSO Logger&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;  Xastir permet de recevoir les données APRS (Automatic Position Reporting System), soit directement via un périphérique AX.25, soit via internet, a travers l'un des nombreux ponts publics (swiss.aprs2.net par exemple). Le traffic APRS non filtré représente un volume important. Spécifier un filtre (j'utilise a/53/-4/34/12, pour avoir uniquement la Suisse, la France, une bonne partie de l'Espagne, de l'Allemagne, et l'Italie du nord) permet de restreindre le traffic a un volume acceptable. Les données reçues incluent la position GPS des différentes stations (y compris voitures et autres stations portables), des relevés pour les stations météorologiques. Tout ça gratuitement... fun !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Fldigi est un modem software qui fonctionne avec une carte son ALSA ou OSS. Il permet de faire de l'analyse de fréquences, et module/démodule le morse, différents modes MFSK, BPSK et QPSK, RTTY, Olivia et Throb, entre autres. Pour le morse, j'arrive tout a fait a m'en servir en tenant ma radio devant le micro de mon portable.&lt;br /&gt;&lt;br /&gt;  Xlog est un logiciel pour tenir un journal de contacts radio. Je ne m'en suis pas encore servi pour l'instant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-3797489478671921813?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/3797489478671921813/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=3797489478671921813' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/3797489478671921813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/3797489478671921813'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/12/softs-ham-radio.html' title='Softs ham-radio'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-8210346678649852354</id><published>2007-11-19T16:12:00.000+01:00</published><updated>2007-11-19T17:35:53.170+01:00</updated><title type='text'>Bouton power sur un PowerMac G4 sous Gentoo</title><content type='html'>J'ai hérité d'un sympathique petit PowerMac G4, que j'utilise à la maison comme serveur de stockage. Il tourne sous Gentoo Linux PPC.&lt;br /&gt;&lt;br /&gt;  Dans la configuration par défaut, il y a un petit détail ennuyeux: le bouton Power ne fait rien par défaut. Utilisant mon serveur sans écran ni clavier, je devais me connecter avec SSH depuis mon portable pour l'éteindre, ce qui est peu pratique. Le petit truc suivant m'a permis de configurer le bouton Power pour éteindre la machine proprement:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Un coup de showkeys en root via ssh, et appuyer sur le bouton. Chez moi, showkeys indique que le bouton est reconnu comme touche de clavier standard (keycode 116).&lt;/li&gt;&lt;li&gt;Dumpkeys indique que la touche est reconnue comme touche de clavier "Do":&lt;/li&gt;&lt;br /&gt;&lt;pre&gt;dumpkeys |grep 116&lt;br /&gt;keycode 116 = Do&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;Ajoutons au script de boot (pour gentoo, /etc/conf.d/local.start fait l'affaire) un mapping qui associe le symbole KeyboardSignal à cette touche:&lt;/li&gt;&lt;br /&gt;&lt;pre&gt;loadkeys - &lt;&lt;&lt; 'keycode 116 = KeyboardSignal'&lt;/pre&gt;&lt;li&gt;Configurons init pour intercepter ce KeyboardSignal et éteindre la machine, en ajoutant cette ligne dans /etc/inittab:&lt;/li&gt;&lt;br /&gt;&lt;pre&gt;ha:12345:kbrequest:/sbin/shutdown -h now&lt;/pre&gt;&lt;br /&gt;&lt;/ol&gt;Voila :) Si j'ai le temps, je ferai une version sûre contre les extinctions accidentelles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-8210346678649852354?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/8210346678649852354/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=8210346678649852354' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/8210346678649852354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/8210346678649852354'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/11/bouton-power-sur-un-powermac-g4-sous.html' title='Bouton power sur un PowerMac G4 sous Gentoo'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-142673006751246581</id><published>2007-11-08T09:37:00.001+01:00</published><updated>2007-11-08T09:39:32.799+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PolyLAN'/><title type='text'>Screenshot PLT 0xA</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_is9Y35ir1Bg/RzLLBZMW-sI/AAAAAAAAAAU/litAxTLrbPc/s1600-h/plt-trunks.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_is9Y35ir1Bg/RzLLBZMW-sI/AAAAAAAAAAU/litAxTLrbPc/s320/plt-trunks.jpg" alt="" id="BLOGGER_PHOTO_ID_5130386150331448002" border="0" /&gt;&lt;/a&gt;Un petit screenshot du nouveau plan de réseau pour PolyLAN 0xA&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-142673006751246581?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/142673006751246581/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=142673006751246581' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/142673006751246581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/142673006751246581'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/11/screenshot-plt-0xa.html' title='Screenshot PLT 0xA'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_is9Y35ir1Bg/RzLLBZMW-sI/AAAAAAAAAAU/litAxTLrbPc/s72-c/plt-trunks.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-5704859987544056385</id><published>2007-11-08T04:28:00.000+01:00</published><updated>2007-11-08T05:05:46.530+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PolyLAN'/><title type='text'>En direct du local PolyLAN...</title><content type='html'>La configuration progresse à petits pas... Comme toujours, je perds mon temps en gadgets inutiles (ou pas). Dans la liste des fonctionnalités manquant à PLT, on peut maintenant barrer:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Des quittances pour les alertes sur l'état des trunks. Une touche dans le trunk monitor permet d'arrêter le clignotement, l'alarme est supprimée jusqu'a ce que le trunk récupère un état normal.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Un script wiring-map.pl permet d'obtenir une vue graphique de la configuration d'un switch donné dans la DB. Le script affiche la disposition des différents trunks et leurs destinations supposées, et les ports utilisateur déclarés.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Le code de gestion des traps SNMP a été largement réécrit pour être polymorphique, il est maintenant possible de traiter les traps en fonction du modèle de switch qui les envoie; il n'est plus nécessaie de maintenir de multiples entrées dans snmptrapd.conf, une seule entrée par défaut suffit.&lt;/li&gt;&lt;/ul&gt;Autrement, les backbones sont complètement configurés, et je vais commencer la configuration des 6 derniers switches 3424 (mise a jour firmware + configuration PolyLAN)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-5704859987544056385?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/5704859987544056385/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=5704859987544056385' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5704859987544056385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5704859987544056385'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/11/en-direct-du-local-polylan.html' title='En direct du local PolyLAN...'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-8537023070008908085</id><published>2007-11-05T21:24:00.000+01:00</published><updated>2007-11-05T21:29:41.530+01:00</updated><title type='text'>OIDs de versions sur Dell PowerConnect</title><content type='html'>SNMPv2-SMI::mib-2.47.1.1.1.1.9.67108992&lt;br /&gt;SNMPv2-SMI::mib-2.47.1.1.1.1.10.67108992&lt;br /&gt;SNMPv2-SMI::mib-2.47.1.1.1.1.8.67108992&lt;br /&gt;&lt;br /&gt;Ces OIDs permettent de récupérer les versions du bootcode, du firmware et du matériel des switches Dell PowerConnect. Confirmé sur 3424 et sur 5324.&lt;br /&gt;&lt;br /&gt;PLT inclut maintenant un script ./check-versions.pl qui affiche les versions des firmwares des équipements connectés.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-8537023070008908085?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/8537023070008908085/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=8537023070008908085' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/8537023070008908085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/8537023070008908085'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/11/oids-de-versions-sur-dell-powerconnect.html' title='OIDs de versions sur Dell PowerConnect'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-1949360818063949501</id><published>2007-11-02T12:42:00.000+01:00</published><updated>2007-11-02T12:46:53.997+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EPFL'/><title type='text'>CaveShooter 0.3</title><content type='html'>Ca-y-est, CaveShooter a atteint une version utilisable ! on peut se tirer dessus tout en discutant. Après quelques ajustements au gameplay, c'est devenu carrément amusant.&lt;br /&gt;&lt;br /&gt;  Reste a y intégrer quelques cheat codes... je verrai ça quand j'ai le temps :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-1949360818063949501?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/1949360818063949501/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=1949360818063949501' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/1949360818063949501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/1949360818063949501'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/11/caveshooter-03.html' title='CaveShooter 0.3'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-829784424380351280</id><published>2007-11-02T01:43:00.000+01:00</published><updated>2007-11-02T02:22:03.427+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cudoku'/><title type='text'>cudoku 0.2 !</title><content type='html'>Voila une nouvelle version de CuDoKu, mon solveur de sudoku en curses !&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Il est maintenant possible d'importer et de sauvegarder les grilles&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Pour les cas ou l'algorithme d'induction-déduction ne suffit pas, le solveur effectue une descente récursive&lt;/li&gt;&lt;/ul&gt;Pour rappel, cudoku est écrit en Perl pur, et utilise une interface Curses (nécessite le module Curses de perl).&lt;br /&gt;&lt;br /&gt;Vous pouvez obtenir la dernière version via mon serveur Mercurial tout neuf:&lt;br /&gt;&lt;pre&gt;hg clone https://xolus.net/hg/cudoku&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ou simplement le tarball:&lt;br /&gt;&lt;a href="http://xolus.net/%7Emax/cudoku-0.2.tar.gz"&gt;https://xolus.net/~max/cudoku-0.2.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;lancez simplement avec ./cudoku &lt;nom&gt;. La grille démarre vide si le fichier n'existe pas.&lt;br /&gt;&lt;br /&gt;Une grille enregistrée est composée de neuf lignes de neuf caractères, pouvant être les chiffres de 1 à 9 pour les valeurs connues, ou 0 si la case est inconnue. Le programme est souple et acceptera des caractères arbitraires entre les chiffres.&lt;br /&gt;&lt;br /&gt;N'hésitez pas à y apporter des améliorations et à me soumettre par mail des patches Mercurial:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(hack hack hack...)&lt;br /&gt;hg commit -m 'uber-cool changes'&lt;br /&gt;hg bundle mes-ameliorations.hg https://xolus.net/hg/cudoku&lt;br /&gt;(envoyer mes-ameliorations.hg par mail)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-829784424380351280?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/829784424380351280/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=829784424380351280' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/829784424380351280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/829784424380351280'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/11/cudoku-02.html' title='cudoku 0.2 !'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-7012297596693761936</id><published>2007-11-01T09:48:00.000+01:00</published><updated>2007-11-01T17:59:19.423+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EPFL'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Du bon usage de /finally/</title><content type='html'>Dans le cadre du cours de réseaux informatiques, nous constatons malheureusement quelques légères difficultés avec de la matière de première année... un point particulièrement problématique est celui du traitement des exceptions en Java.&lt;br /&gt;&lt;br /&gt;En particulier, la formation en première année (selon mes souvenirs) ne se concentre que sur l'aspect interception des exceptions, comme une nuisance mineure mais inévitable; la création d'exceptions propres au programme, et le report du traitement des erreurs, sont malheureusement mis de coté. Je ne crois pas avoir jamais fait d'exercice consistant a remonter une exception dans un cas concret.&lt;br /&gt;&lt;br /&gt;L'intérêt des exceptions est évidemment de pouvoir déférer le traitement d'erreurs a une couche plus élevée du code, la ou il est possible de prendre une décision pertinente quant au traitement de l'erreur, et ce sans saturer l'interface de la méthode.&lt;br /&gt;&lt;br /&gt;Exemple: voici une fonction sensée construire un objet 'blob' à partir d'un fichier:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Blob lire(String fichier) {&lt;br /&gt;   Blob b = ...&lt;br /&gt;   FileInputStream f = ...&lt;br /&gt;   ...&lt;br /&gt;   f.close();&lt;br /&gt;   return b;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Mais si le fichier ne peut être lu ? d'ailleurs, le code précédent ne compile même pas; il y a plein d'exceptions IOException non récupérées. Que faire ? j'ai vu beaucoup de gens tomber dans le travers suivant:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Blob lire(String fichier) {&lt;br /&gt;   try {&lt;br /&gt;       Blob b = ...&lt;br /&gt;       ...&lt;br /&gt;       return b;&lt;br /&gt;   } catch (Exception e) {&lt;br /&gt;       return null;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;FAUX !!!&lt;br /&gt;Non seulement le code appelant risque de se manger une NullPointerException à tout moment, mais en plus on perd complètement la traçe de l'erreur initiale. Et en plus, si un problème survient pendant la lecture (formatage, etc...) le fichier ne sera jamais fermé !&lt;br /&gt;&lt;br /&gt;On réessaie:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Blob lire(String fichier) {&lt;br /&gt;   try {&lt;br /&gt;       FileInputStream f = ...&lt;br /&gt;       //fichier bien ouvert, il faut le fermer&lt;br /&gt;       Blob b;&lt;br /&gt;       try {&lt;br /&gt;           ...&lt;br /&gt;       } catch (IOException e) {} //Erreur pendant lecture&lt;br /&gt;       f.close();&lt;br /&gt;       return b;&lt;br /&gt;   } catch (Exception e) {&lt;br /&gt;       return null;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ARCHI-FAUX !!!&lt;br /&gt;&lt;br /&gt;La encore, on retourne un b qui risque d'être incorrect si le parsing n'a pas marché. Sans compter la laideur... notez qu'on ne peut retourner le b avant le f.close(), puisque le return termine la fonction, forcément...&lt;br /&gt;&lt;br /&gt;On nous a enseigné que la syntaxe appropriée est:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;try {&lt;/b&gt; ... &lt;b&gt;}&lt;/b&gt; { &lt;b&gt;{ catch(&lt;/b&gt;&lt;i&gt;Type e&lt;/i&gt;&lt;b&gt;) {&lt;/b&gt; ... &lt;b&gt;}&lt;/b&gt; } &lt;b&gt;} finally {&lt;/b&gt; ... &lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;en première année, on se contente de dire que "le contenu du bloc finally est toujours exécuté après le contenu du bloc try, même si celui-ci a levé une exception.&lt;br /&gt;&lt;br /&gt;Naif étudiant en première que j'étais, je me suis posé la question: Mais quelle est donc la différence entre:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;try {&lt;br /&gt;   ... //throws MyException&lt;br /&gt;} catch (MyException e) {&lt;br /&gt;   ...&lt;br /&gt;} finally {&lt;br /&gt;   ... // blah blah&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;et&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;try {&lt;br /&gt;   ... //throws MyException&lt;br /&gt;} catch (MyException e) {&lt;br /&gt;   ...&lt;br /&gt;}&lt;br /&gt;// blah blah&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;? Dans les deux cas, si le contenu du bloc try lève une exception MyException, celle-ci est attrapée, et le code "blah blah" est exécuté. Alors pourquoi cette clause finally ?&lt;br /&gt;&lt;br /&gt;Ce qui n'a pas assez été répété, c'est que le code dans le "try" peut très bien lever une &lt;span style="font-style: italic;font-size:100%;" &gt;autre&lt;/span&gt;exception que celle de la clause catch (qui est d'ailleurs facultative). D'une part, le code peut lever une exception de type RuntimeException (dont l'interception n'est pas obligatoire, car de telles exceptions sont considérées imprévisibles), d'autre part, la méthode contenant le bloc try/finally peut très bien déclarer elle-même lever des exceptions. Enfin, sachez également qu'il est possible de faire un "return" a l'intérieur d'un bloc try/finally, et que la clause finally sera exécutée tout de même !&lt;br /&gt;&lt;br /&gt;Ce qui nous amène naturellement a la version légèrement plus correcte de l'exemple précédent:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Blob lire(String fichier) throws IOException {&lt;br /&gt;   FileInputStream f = ...&lt;br /&gt;   //fichier ouvert&lt;br /&gt;   try {&lt;br /&gt;       Blob b = ...&lt;br /&gt;       ...&lt;br /&gt;       return b;&lt;br /&gt;   } finally {&lt;br /&gt;       f.close();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Notez que nous n'avons utilisé qu'un seul try/catch, que nous n'avons pas besoin de prédéclarer b dans un autre bloc (ce qui est laid), que f.close() sera toujours appelé si le fichier a été correctement ouvert, que le b retourné sera toujours correct, que le programme appelant aura a sa disposition toute l'information nécessaire pour réagir correctement à l'erreur, et que le compilateur informera le programmeur si le code de traitement d'erreur est oublié.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-7012297596693761936?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/7012297596693761936/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=7012297596693761936' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/7012297596693761936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/7012297596693761936'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/11/du-bon-usage-de-finally.html' title='Du bon usage de /finally/'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-8267987319045853854</id><published>2007-10-29T22:37:00.000+01:00</published><updated>2007-10-29T22:56:30.265+01:00</updated><title type='text'>Tests de VCS distribués</title><content type='html'>Je suis depuis quelques temps à la recherche d'un nouveau VCS (Version Control System). J'utilise habituellement Subversion, qui a l'avantage d'être répandu. Mais le versionage centralisé commence à montrer ses limites. La goutte d'eau qui a fait déborder le vase a été le serveur SVN du LCA auquel je n'ai pu accéder a cause d'un glitch administratif, et qui nous a poussé à héberger l'arbre de CaveShooter sur un serveur à part, et la perte de temps qui s'en est suivie.&lt;br /&gt;&lt;br /&gt;  Quatre VCS distribués ont retenu mon attention pour l'instant: Bazaar, Darcs, Mercurial et Monotone.&lt;br /&gt;&lt;br /&gt;  J'ai eu tenté de migrer vers Arch (l'ancêtre de Bazaar) il y a quelque temps, mais j'ai trouvé l'interface rébarbative. Il semblerait que Bazaar aie porté le focus sur la facilité d'utilisation; c'est probablement une bonne chose.&lt;br /&gt;&lt;br /&gt;  Darcs prétend fournir des merges plus puissants, étant basé sur la "théorie des patches". L'interface est en revanche assez différente des VCS que je connais pour être déstabilisant.&lt;br /&gt;&lt;br /&gt;  Mercurial est très façile a prendre en main pour un utilisateur habitué à Subversion, la migration étant quasiment transparente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-8267987319045853854?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/8267987319045853854/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=8267987319045853854' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/8267987319045853854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/8267987319045853854'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/10/tests-de-vcs-distribus.html' title='Tests de VCS distribués'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-265455504576456541</id><published>2007-10-26T03:00:00.000+02:00</published><updated>2007-10-26T03:07:58.000+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EPFL'/><title type='text'>CaveShooter 0.2</title><content type='html'>La programmation de CaveShooter avance gentiment:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; La machine d'états TCP inclut maintenant le système de discussion et les join/part des divers participants.&lt;/li&gt;&lt;li&gt;Côté UDP, un nouveau trick de multithreading permet d'avoir des ticks un peu plus réguliers.&lt;/li&gt;&lt;li&gt;Les Magic Numbers manquants ont été corrigés&lt;br /&gt;&lt;/li&gt;&lt;li&gt;La logique de jeu a évolué, les objets sont maintenant capables de se déplacer, le tir devrait suivre sous peu.&lt;/li&gt;&lt;li&gt;La structure dans caveshooter.protocol.* a été revue et concerne maintenant la sérialisation/désérialisation des messages udp uniquement, le reste étant géré par les clients et serveurs respectifs&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-265455504576456541?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/265455504576456541/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=265455504576456541' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/265455504576456541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/265455504576456541'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/10/caveshooter-02.html' title='CaveShooter 0.2'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-3763577980489778508</id><published>2007-10-24T17:34:00.000+02:00</published><updated>2007-10-25T11:45:23.378+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PolyLAN'/><title type='text'>Configuration de l'équipement réseau</title><content type='html'>J'ai commencé à reconfigurer les équipements en accord avec le nouveau schéma d'allocation choisi.&lt;br /&gt;&lt;br /&gt; Il semblerait que le protocole de trunking utilisé par le Dell 6224 soit incompatible avec les autres équipements Dell que nous avons (5224 et 3424); sur les switches que nous avions, le vlan 1 est considéré comme le vlan par défaut, et ses paquets ne sont jamais taggés, mais toujours envoyés tels quels sans étiquette de vlan. C'est une mesure de compatibilité; un client qui ne comprend pas les vlans 802.1q et se retrouve accidentellement connecté à un port trunk sera vu comme appartenant au vlan 1.&lt;br /&gt;&lt;br /&gt; Sur le 6224, les paquets appartenant au vlan 1 sont taggés quand ils sortent par un port trunk. C'est probablement une mesure de sécurité, soit pour empêcher un client hostile du vlan 1 d'injecter des paquets a destination d'autres vlans à travers un port trunk.&lt;br /&gt;&lt;br /&gt;La différence entre ces deux modes de gestion empêche les paquets du vlan 1 de traverser les port trunk entre le 6224 et les autres modèles. Il faudrait passer les trunks entre les backbones en mode générique, pour forcer les paquets du vlan 1 à sortir en mode non-taggé, ou ne plus utiliser le vlan 1 du tout. Pour l'instant, je retiens la 2e solution, qui est plus simple à configurer, mais empêche un client mal configuré de fonctionner sur un port trunk (ce peut être un mal ou un bien, en fonction de la situation)&lt;br /&gt;&lt;br /&gt; Je pense également placer Loulou dans un micro-subnet à part, de manière a faire tout transiter par le 6224. Ca permettra à tous les autres équipements du réseau de n'avoir a configurer qu'une entrée de routage par défaut.&lt;br /&gt;&lt;br /&gt; Le système de génération des configurations a été mis a jour pour inclure le nouveau schéma de vlans, et mettre les ports utilisateurs dans le vlan 2 par défaut.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-3763577980489778508?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/3763577980489778508/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=3763577980489778508' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/3763577980489778508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/3763577980489778508'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/10/configuration-de-lquipement-rseau.html' title='Configuration de l&apos;équipement réseau'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-2866209618561464225</id><published>2007-10-23T23:37:00.000+02:00</published><updated>2007-10-24T17:47:19.916+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PolyLAN'/><title type='text'>La structure réseau se met en place</title><content type='html'>On commence gentiment à planifier la topologie du réseau pour PolyLAN X.&lt;br /&gt;&lt;br /&gt; Comme nous ne sommes pas certains de la performance qu'apportera la segmentation du réseau, nous allons prévoir quatre subnets pouvant accomoder ~ 500 machines chacun. Au début de la LAN, tous les participants seront dans un subnet unique, et nous couperons le réseau en 2 segments de 200, ou 4 segments de 100, si nécessaire.&lt;br /&gt;&lt;br /&gt; La classe d'allocation 10.0.4.0/24 sera gardée pour le vlan administratif de l'équipement réseau. Nous utiliserons 10.1.0.0/16 à 10.4.0.0/16 comme subnets opérationnels. Dans ces subnets, 10.x.0.0/24 sera réservé pour les serveurs multihomed, tandis que 10.x.2.0/23 sera une classe libre à allouer aux joueurs.&lt;br /&gt;&lt;br /&gt; Pour ce faire, nous abandonnons l'utilisation du proxy-arp. Premièrement, cette technique n'apporte qu'un faible avantage par rapport à des subnets distincts. Avec des subnets distincts, déplacer une machine de segment requiert de la déconnecter pour lui réallouer une adresse différente, tandis qu'avec le proxy-arp, même si l'adresse peut rester la même, il est quand même nécessaire de purger la table arp pour que le réseau fonctionne correctement, mais également de purger les entrées relatives a ce client sur toutes les autres machines. En pratique, on devra donc se baser sur le timeout arp pour faire expirer ces entrées, ce qui est peu pratique et exclut l'utilisation d'un timeout large. Or, nous comptons sur l'utilisation d'un timeout large pour réduire le traffic ARP.&lt;br /&gt;&lt;br /&gt; Deuxièmement, l'architecture en subnets permet aux applications de savoir qu'elles ne communiquent pas avec des machines locales. Le proxy-arp peut en théorie rendre impossible le fonctionnement de certaines applications, et nous manquons de temps pour tester.&lt;br /&gt;&lt;br /&gt; Pour permettre a tous les joueurs de voir tous les serveurs, les serveurs découvrables par broadcast (CS, BF ?) seront tous multi-homed; chaque serveur disposera d'une adresse dédiée pour chaque subnet différent.&lt;br /&gt;&lt;br /&gt; Pour réduire encore plus le traffic de broadcast, nous installerons un serveur WINS, et demanderons si nécessaire a nos joueurs de configurer leur machine en p-mode (pas de broadcasts netbios). J'essaierai de bricoler qqch pour envoyer des messages popups aux machines fonctionnant en b-mode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-2866209618561464225?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/2866209618561464225/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=2866209618561464225' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/2866209618561464225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/2866209618561464225'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/10/la-structure-rseau-se-met-en-place.html' title='La structure réseau se met en place'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-5231294946809052827</id><published>2007-10-19T18:55:00.000+02:00</published><updated>2007-10-19T19:02:27.891+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EPFL'/><title type='text'>SpaceShooter devient CaveShooter</title><content type='html'>Le projet du cours sc250 pour l'année 2007 s'appelle désormais CaveShooter. Plus question de vaisseaux spatiaux, mais des hommes des cavernes opérant des catapultes pour lancer des rochers.&lt;br /&gt;&lt;br /&gt; Côté implémentation, Aris a terminé les classes du modèle, et a attaqué la vue graphique; j'ai implémenté le serveur TCP, la machine d'états pour le prologue TCP, et le receveur UDP.&lt;br /&gt;&lt;br /&gt; Le code est versioné avec SVN sur Xolus, mais je me demande sérieusement si je ne vais pas migrer vers Bazaar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-5231294946809052827?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/5231294946809052827/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=5231294946809052827' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5231294946809052827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5231294946809052827'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/10/spaceshooter-devient-caveshooter.html' title='SpaceShooter devient CaveShooter'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-2344273261317817938</id><published>2007-10-17T16:53:00.000+02:00</published><updated>2007-10-18T09:25:30.560+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PolyLAN'/><title type='text'>Résolu les crashs sur Fifi, structure réseau finalisée</title><content type='html'>Le plantage systématique de Firefox sur Fifi a été résolu. Apparemment, il s'agit d'un bug dans le driver ATI de X.org, propre à un modèle de carte particulier (ATI Rage IIC). L'accélération 2D hardware a été désactivée (option NoAccel de X.org), le système ne plante plus.&lt;br /&gt;&lt;br /&gt; L'organisation réseau a été finalisée pour PolyLAN X. Nous aurons 3 subnets dans des VLANs séparés, respectivement 10.0.[1,2,3].*, pour les joueurs. 10.0.x.1 sera reservé pour le routeur Dell. 10.0.x.2 sera réservé également pour Fifi, qui aura besoin d'un accès a tous les domaines de broadcast pour le monitoring DHCP notamment.&lt;br /&gt;&lt;br /&gt; Chaque joueur se trouvera dans un VLAN correspondant initalement au tournoi correspondant (CSS, RTS, et Autres). Il sera possible de changer dynamiquement de VLAN via une interface web, mais chaque VLAN sera limité à 200 personnes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-2344273261317817938?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/2344273261317817938/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=2344273261317817938' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/2344273261317817938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/2344273261317817938'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/10/rsolu-les-crashs-sur-fifi-structure.html' title='Résolu les crashs sur Fifi, structure réseau finalisée'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-2141635769197384650</id><published>2007-10-16T11:12:00.000+02:00</published><updated>2007-10-16T11:13:07.325+02:00</updated><title type='text'>Ouf</title><content type='html'>Ma demande de déplacement pour mon service militaire a été acceptée. Je vais pouvoir finir mon PDM tranquille, j'aurai tout le temps nécessaire pour m'occuper du milliard de choses que j'ai a faire. Champagne !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-2141635769197384650?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/2141635769197384650/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=2141635769197384650' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/2141635769197384650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/2141635769197384650'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/10/ouf.html' title='Ouf'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-4684565633123757012</id><published>2007-10-16T09:57:00.000+02:00</published><updated>2007-10-17T16:48:27.540+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EPFL'/><title type='text'>SpaceShooter v2.0</title><content type='html'>Aujourd'hui, j'ai commencé a travailler sur SpaceShooter "v2.0", le projet qui sera proposé en cours de réseaux pour les 2e SSC/3e informatique. Je ne peux pas en dire beaucoup pour l'instant, mais tout est dans le nom... le jeu ressemblera à celui que nous avons utilisé en 2004, mais avec de nombreuses améliorations, et un protocole réseau largement différent.&lt;br /&gt;&lt;br /&gt;    Comme de juste, Aris s'occupera du client et moi du serveur. C'est toujours amusant de revenir sur du vieux code qu'on a écrit...&lt;br /&gt;&lt;br /&gt;  A la fin du projet, je pense qu'on pourra publier ici le petit jeu, histoire de s'amuser un peu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-4684565633123757012?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/4684565633123757012/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=4684565633123757012' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/4684565633123757012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/4684565633123757012'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/10/spaceshooter-v20.html' title='SpaceShooter v2.0'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-5357830079227159627</id><published>2007-10-15T15:47:00.000+02:00</published><updated>2007-10-17T16:48:59.404+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PolyLAN'/><title type='text'>Nouvelles de PolyLAN 0xA</title><content type='html'>PolyLAN X (0xA pour les intimes) approche à grand pas (10-11 novembre, pour les pas encore inscrits). Je travaille toujours sur PLT; cette version-ci va voir venir de nombreux changements clef.&lt;br /&gt;&lt;br /&gt; - LLDP est maintenant activé sur les ports tronc du réseau. Un module est en cours de développement, qui permettra de récupérer la topologie en live sur le réseau de production (fini les incohérences avec l'affichage des liens). Auparavant, le système pouvait seulement vérifier la cohérence a l'aide des tables de forwarding.&lt;br /&gt; - Beaucoup de paramètres codés en dur sont maintenant configurables depuis un endroit central (PolyLAN/Config.pm), ce qui facilitera l'installation du software sur un autre système.&lt;br /&gt; - Le système de quarantaine a été remis a niveau (il était abandonné depuis l'introduction de l'authentification par 802.1x), les vlans sont maintenant configurables depuis une position centrale; le mécanisme de configuration des switches y a été adapté&lt;br /&gt; - Les switches sont maintenant reconfigurables automatiquement également par tftp et plus seulement via le port série (si la configuration actuelle du switch le permet)&lt;br /&gt;&lt;br /&gt; Nous avons également reçu un routeur Dell 6224 qui sera le nouveau coeur de notre réseau. Nos 400 joueurs seront divisés en 3 vlans (correspondant par defaut au jeu qu'ils ont choisi). Chaque vlan sera un subnet séparé, pour réduire le traffic de broadcast. Il sera possible de changer en cours de LAN, nous n'avons pas encore décidé comment. (manuellement, interface web, semi-automatique ?)&lt;br /&gt;&lt;br /&gt; Il sera maintenant possible pour un joueur d'obtenir plusieurs adresses IP sans déclencher une alarme. Il n'y aura plus d'alarme lorsque un joueur change de carte réseau par exemple. En revanche, chaque adresse MAC se verra associer durablement une adresse unique, et le système gardera trace du propriétaire de chaque machine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-5357830079227159627?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/5357830079227159627/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=5357830079227159627' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5357830079227159627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/5357830079227159627'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/10/nouvelles-de-polylan-0xa.html' title='Nouvelles de PolyLAN 0xA'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2527666923797847301.post-152197656865193663</id><published>2007-10-15T15:05:00.000+02:00</published><updated>2007-10-15T15:47:44.449+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migration'/><title type='text'>Encore une migration</title><content type='html'>Voila, j'ai encore une fois migré de plateforme pour raconter ma vie. Ce blog fait suite à la défunte installation DotClear que je n'avais plus le courage de maintenir. Je vous encourage à mettre a jour vos bookmarks vers cette nouvelle addresse (http://blafh.blogspot.com).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2527666923797847301-152197656865193663?l=blafh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blafh.blogspot.com/feeds/152197656865193663/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2527666923797847301&amp;postID=152197656865193663' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/152197656865193663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2527666923797847301/posts/default/152197656865193663'/><link rel='alternate' type='text/html' href='http://blafh.blogspot.com/2007/10/test-message.html' title='Encore une migration'/><author><name>Maxime Augier</name><uri>http://www.blogger.com/profile/15622717038591082366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://xolus.net/~max/max.png'/></author><thr:total>0</thr:total></entry></feed>
