tag:blogger.com,1999:blog-32643924757309937442024-03-05T23:07:45.278-08:00l'acharné du clavierle bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.comBlogger35125tag:blogger.com,1999:blog-3264392475730993744.post-33521133058978634742023-10-04T09:19:00.002-07:002023-10-04T09:20:06.343-07:00notes d'installation de linux sur acer ES1-131-C10X<p>[Note de l'auteur : Ces notes datent de fin 2016. J'ai mis à jour un épilogue.]</p>
<h2>notes de novembre 2016</h2>
Mettre dans /etc/apt/sources.list :
<pre>
deb http://debian.proxad.net/debian/ jessie non-free
deb-src http://debian.proxad.net/debian/ jessie non-free
</pre>
et ensuite dans le shell :
<pre>
sudo aptitude update
sudo aptitude install firmware-realtek
</pre>
résultats :
<ul>
<li>
pour le wifi : ça marche aussi, du realtek mais sans ce module (je ne sais plus si j'ai fait qqe chose de spécial).
</li><li>
pour le bluetooth : pas encore testé
</li><li>
pour le pavé tactile : enlever le mode avancé dans le bios et ça marche tout seul
</li><li>
ethernet filaire : realtek 8111/8168 nécessitant le paquet firmware-realtek dans non-free.
</li>
</ul>
<p>
Seule distrib ok : debian stable multi arch à cause du bios 32 bit sous architecture 64 bit.
</p>
<h2>épilogue de septembre 2023</h2>
<p>
J'ai conservé cette machine.
</p><p>
À noter un argument nécessaire pour la séquence de démarrage : <code>edd=off</code> pour la commande <code>linux</code>. Sinon ça plante.
</p><p>
Elle est aujourd'hui sous linux debian 11 bullseye 64 bit (version de 2018-03-02).
</p><p>
Finalement, tout marche correctement mais le noyau le plus récent qu'elle peut supporter est le 4.9.0-6 car tous les autres la font planter totalement au chargement initial du ramdisk (il faut éteindre l'ordinateur complètement bloqué lors du boot). L'installation de debian 12 échoue pour la même raison de noyau trop récent.
</p><p>
Je n'ai pas réussi à la migrer sous un linux 32 bit plus récent. Je reste comme ça. Pas bien grave, cette machine ne me sert presque plus. Je l'ai remplacée par un Lenovo x230i avec 8Go de RAM et avec un SSD à la place du HDD d'origine.
</p>
le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-65942450914992667372023-10-04T06:23:00.003-07:002023-10-04T15:02:02.049-07:00Installation de linux debian 3.8 jessie sur Pipo x8<p>[Note de l'auteur : c'était un vieil article jamais publié. Il est toujours aussi vieux... mais il est désormais publié !]
</p><p>
J'ai acquis lors du Cyber Monday 2015 un Pipo X8 modèle 64Go d'espace de stockage interne. Livré avec Windows 8.1 (version bing, activée) et Android 5.1, mon but est de le mettre sous linux. J'utilise un autre PC sous linux Mint 17.3 pour ça, en architecture amd64.
</p>
<h3>Au niveau du boot</h3>
<p>
On peut avoir accès au setup avec la touche F2 au démarrage. Là, on va aller sur l'onglet boot. On ne peut booter qu'en UEFI, mais il faut désactiver le secure boot. On va aussi activer le boot menu, désactiver le fast boot et mettre plus de temps pour taper sur « F2 » ou « F7 » au démarrage. J'ai mis 10s.
</p><p>
À part ça, dans les options générales, on mettra le trackpad en mode standard afin qu'il soit utilisable sous linux. Il est possible semble-t-il d'avoir un mode étendu, mais même si c'est possible, on ne le fera que dans un effort ultérieur. Si on ne fait pas ce changement, le trackpad est inutilisable après une installation standard de debian 8.3. Surtout, surtout, prenez la version multiarch sinon ça ne marchera pas.
</p>
<h3>Préparation de la clé USB</h3>
<p>
Il faut prendre une clé SUB sur laquelle on va mettre un système de partition GPT en utilisant <code>gparted</code>. On y crée une partition unique de taille maximale en FAT32 qu'on formate. Le drapeau « msftdata » est positionné sur cette partition par défaut. On quitte gparted puis on débranche et rebranche la clé qui se monte alors automatiquement.
</p><p>
On lance alors <code>unetbootin</code> et on lui fait installer l'image iso de notre debian 8.3 multiarch sur la partition n°1 de cette clé usb. Oui, oui, avec unetbootin. Ça marche. Les autres méthodes recommandées par debian ne marchent pas avec le pipo.
</p><p>
Quand unetbootin a terminé son travail, on le quitte sans rebooter et on relance <code>gparted</code> pour cette fois positionner le drapeau « boot » sur l'unique partition de notre clé. Le drapeau « msftdata » disparaît automatiquement.
</p><p>
La clé est maintenant prête.
</p>
<h3>instalation avec la clé usb</h3>
<p>
Installer la clé à l'arrière du Pipo et une deuxième clé aussi, du'au moins 16Go. Cette clé servira de système hôte le temps de faire des sauvegardes. À l'allumage du pipo il faut appuyer sur la touche « F7 » une ou deux fois pour avoir le boot menu. Quand il apparaît, il faut impérativement sélectionner une installation 64 bit. Je préfère le mode texte. En mode graphique, il faut une souris car l'écran tactile n'est pas supporté.
</p><p>
Bonne nouvelle : la prise RJ45 fonctionne et on va pouvoir faire une installation avec le réseau. Cinnamon ne marche pas. Gnome et Mate fonctionnent. L'installation est longue mais se fait sans problème.
</p><p>
Pour redémarrer sous linux, il faudra passer par le boot menu grâce à la touche « F7 » et sélectionner votre clé USB où vous avez installé debian (vous aurez enlevé la clé d'installation pour plus de clarté).
</p><p>
Votre première tâche sera de faire une copie intégrale du disque eMMc vers un gros disque branché en usb avec la commande <code>dd</code>. Vous pourrez ensuite comprimer cette image sur un ordinateur plus puissant. Ça se comprime très bien avec xz en mode -9 (car ça fait plus de 32Go et que vous aurez au moins 4Go de RAM sur la machine qui fera le boulot).
</p>
<h3>Bilan brut d'installation</h3>
<h4>Ce qui marche</h4>
<ul>
<li>
le trackpad (ou pas s'il est resté en mode étendu au niveau du bios) ;
</li><li>
l'usb
</li>
</ul>
<h4>Ce qui ne marche pas</h4>
<ul>
<li>
le réseau ethernet RJ45
</li><li>
le wifi
</li><li>
le bluetooth
</li><li>
l'écran tactile
</li><li>l'écran est vertical.
</li>
</ul>
<p>
Pour l'écran, il faut aller dans les préférences d'écran et le faire pivoter. Mais ça ne marche pas pour l'étape de login graphique. Mais au moins une fois connecté, tout sera affiché normalement.
</p><p>
pour voir ce qu'il y a faites en root un <code>lsusb</code> puis un <code>lspci</code>. Un <code>lshw</code> au préalable est pas mal aussi.
</p>
<h3>Mise en route du réseau ethernet</h3>
<p>
Il faut télécharger <a href="http://www.davicom.com.tw/userfile/24247/lnx_dm9620(V2.45).rar">les sources en C du pilote davicom 9620 pour linux</a> puis décompresser le .rar avec unrar sur votre gros PC. Le nom du répertoire créé ne doit pas avoir de parenthèses car sinon le Makefile plantera. Donc, renommez le avant tout.
</p><p>
pour avoir internet, un téléphone relié en usb est la seule solution pour l'instant. si vous n'avez pas ça, il vous faudra installer avec <code>dpkg -i</code> le paquet debian .deb pour jessie de la commande <code>make</code> que vous recopierez sur une clé usb où vous mettrez les sources du pilote davicom de votre prise RJ45. Vous compilerez (pour amd64) sur votre autre PC avant de recopier le tout sur la clé usb car vous n'avez pas encore de compilateur sur le Pipo.
</p><p>
https://packages.debian.org/jessie/amd64/make/download
</p><p>
Allez dans le répertoire des sources comme root et faîtes <code>make install</code>. Rebootez quand c'est fait. Et là, votre prise RJ45 vous donnera automatiquement accès à internet !
</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-43179554450185339552020-08-27T11:00:00.001-07:002020-08-27T11:03:52.506-07:00<style>pre { background-color: beige; } </style>
<h2>Reading a File in Plain Javascript (not! in node.js)</h2>
<p>
Reading a file in node.js is fairly easy and code to do it is easy to get by on the web.
But doing it on the browser in a modern way, with async/await and returning
an actual result, is not so much. Most of the time, you get only a <tt>console.logout()</tt>
and that's it!
</p><p>
So I'm giving here a complete example of a readFile function that returns the contents
of a local file. I have not found a way to get a file other than through an input of type "file"
in the html page. It could have got some uses, but one must do without it!
</p><p>
It's also a nice and complete example of how to build a simple async function with a promise you build inside with something other than a timeout. All the best if it helps someone somewhere especially if this is you!
</p>
<pre><code>
// returns the content of a file as text
const readFile = async (file) => {
const prom = new Promise((resolve, reject) => {
const frd = new FileReader();
frd.onload = (evt) => {
resolve(frd.result);
}
frd.readAsText(file);
});
const text = await prom;
return text;
};
// and here is a simple demo, to put soewhere in your code
// somewhere in your html: <input type="file" id="file"/>
document.getElementById("file").addEventListener("change", see);
async function see(event) {
const file = event.target.files[0];
if (file) {
const contents = await readFile(file);
const escapeHTML = (str) => new Option(str).innerHTML;
const sanitized = escapeHTML(contents);
console.log("sanitized", sanitized);
event.target.insertAdjacentHTML('afterend',
`<hr><h4>{file.name}</h4><pre>${sanitized}</pre><hr>`
);
}
}
</code></pre>
<p><em><strong>And you can test it below!!!</strong></em><p>
<div>
Choose a File: <input type="file" id="file"/>
<script>
// returns the content of a file as text
const readFile = async (file) => {
const prom = new Promise((resolve, reject) => {
const frd = new FileReader();
frd.onload = (evt) => {
resolve(frd.result);
}
frd.readAsText(file);
});
const text = await prom;
return text;
};
document.getElementById("file").addEventListener("change", see);
async function see(event) {
const file = event.target.files[0];
if (file) {
console.log("file?", file);
console.log("target", event.target);
const contents = await readFile(file);
console.log("contents", contents);
const escapeHTML = (str) => new Option(str).innerHTML;
const sanitized = escapeHTML(contents);
console.log("sanitized", sanitized);
event.target.insertAdjacentHTML('afterend',
`<hr><h4>${file.name}</h4><pre>${sanitized}</pre><hr>`
);
}
}
</script>
</div>
le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-51012836973369299742017-11-03T08:46:00.001-07:002018-01-01T05:36:54.526-08:00installer une imprimante en ligne de commande<style>pre { background-color: beige; } </style>
<fieldset><legend>Mise à jour du 01/01/2018</legend>
Ajouté comment supprimer une imprimante et comment trouver une URI, en particulier pour une imprimantte usb.
</fieldset>
<br/>
<h2>AntiX</h2>
<p>
Je viens d'installer linux <strong><a href="https://antixlinux.com/">AntiX</a> 17</strong> (pour amd64) sur une de mes machines. AntiX est une distribution dérivée de debian <strong>sans systemd</strong> et c'est pourquoi j'ai voulu la tester. De nouveau, car un vieil essai précédent ne mm'avait pas tellement convaincu. Mais là je suis sous le charme !
</p><p>
D'abord, antiX connaît le clavier <strong>bépo</strong> au niveau de son CD d'installation. Celui-ci est un live CD, qui se charge <em>très vite</em> (j'utilise une clé USB 2.0 pour ce test). Je ne dirai rien pour le wifi et le bluetooth car ma machine en était dépourvue, mais les deux écrans sont gérés d'office dans leur meilleure résolution, et pas en mode cloné. Ce sont deux écrans physiquement identiques.
</p><p>
L'installation avec partitionnement manuel (mon choix -- toujours) est particulièrement rapide. Bon, ça n'installe pas de gros trucs comme gnome ou mate, alors ça aide. Pour installer mate, j'ai installé tasksel puis j'ai installé mate avec tasksel. Pas de gros problème. Faites attention au gestionnaire d'écran choisi pour la session la première fois, car celui sélectionné par défaut est un peu court (pas possible d'ouvrir un terminal -- je suis passé par l'édition d'un texte avec vi pour lancer bash depuis vi -- mais j'aurai dû choisir un autre gestionnaire de fenêtres).
</p><p>
Tout allait pour le mieux jusqu'à ce que je décide d'installer une imprimante.
</p>
<h2>installer une imprimante à la main</h2>
En effet, la boîte de dialogue de gestion des imprimantes n''apparaît pas (sous mate). Rien à faire. Je me suis donc hissé à un niveau de geekitude supérieur et j'ai utilisé <strong>lpadmin</strong>. Aucune difficulté de syntaxe particulière. Mais il ne faut pas se tromper avec l'URI de l'imprimante sinon la communication n'aura jamais lieu et une commande <tt>lpstat -p myprinter -R</tt> indiquera que la dite imprimante myprinter « <em>is not responding</em> » . Au fait, il faut aussi rendre l'imprimante disponible avec <tt>lpadmin -p myprinter -E</tt> et on peut en faire l'imprimante par défaut avec <tt>lpadmin -d myprinter</tt>. On peut combiner tout ça en une seule commande comme par exemple :
</p>
<pre><tt>sudo lpadmin -p myprinter -v socket://myprinter.chez.moi.com:9100 \
-P ~/drivers/modele-de-mon-imprimante.ppd -E -d myprinter
</tt></pre>
<p>
Pour l'URI d'une imprimante réseau, on peut donc avoir <tt>socket://...:9100</tt> et c'est le seul truc qui marchait pour moi. Sinon on peut aussi essayer <tt>ipp://.../ipp</tt> ou <tt>ipps://.../ipp</tt> entre autres.
</p><p>
Pour une imprimante usb, il faut trouver la bonne URI aussi. En ligne de commande, le plus simple est d'utiliser <tt>lpinfo
-v | grep usb:</tt>. Si lpinfo n'est pas reconnu, essayez <tt>/usr/sbin/lpinfo -v</tt>. Pensez à installer <em>cups-bsd</em> au besoin (voir un peu plus loin). Par exemple, pour mon imprimante Samsung M2026W j'obtiens :
<pre><tt>/usr/sbin/lpinfo -v | grep usb:
direct usb://Samsung/M2020%20Series?serial=08HYB8GG5E00H9Y
</tt></pre>
<p>Ici, l'URI à recopier est <tt>usb://Samsung/M2020%20Series?serial=08HYB8GG5E00H9Y</tt> tout simplement ;-)
</p><p>
Une autre possibilité est d'utiliser le frontal web de cups situé par défaut à <a href="http://localhost:631/"> http://localhost:631/</a> qui permet d'imprimer une page de test. Mais qui ne vous donnera pas le bon schéma d'URI à utiliser : là enccore, il faut deviner. Un petit truc sous cette interface : si votre imprimante y apparaît comme <em>raw printer</em> bien que vous ayez fourni un fichier ppd pour le pilote, il est à peu près certain que le l'URI utilisée n'est pas la bonne !
</p>
<h2>lpq</h2>
Si vous voulez utiliser lpq au lieu de lpstat en ligne de commande, ou encore lpinfo, il faut l'installer avec <tt>sudo apt-get install cups-bsd</tt> car c'est en effet une commande BSD. L'avantage de lpq, c''est qu'il suffit de taper <tt>lpq</tt> pour voir la file de l'imprimante par défaut. Et en prime on aura <tt>lprm</tt> qui peut aussi servir de temmps en temps. Surtout pour moi tant que je n'aurai pas récupéré l'interface graphique normale de gestion des imprimantes !
</p><p>
Pour supprimer une imprimante, utilisez <tt>lpadmin -x myprinter</tt>.le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-15404222144873411752016-10-14T07:38:00.001-07:002017-02-18T14:08:55.465-08:00Accéder à son serveur mysql distant en java<style>
figure,
code { font-weight: bold; color: maroon; }
figure,
pre { background-color: white; }
figcaption {
background-color: light-yellow; color: red; font-style: italic; font-size: smaller; text-align: center;
}
figcaption::after { content: ' :' }
</style>
<h2>Tout n'est pas cousu d'avance</h2>
<p>
Quand on veut accéder depuis une application écrite en java à un serveur mysql situé sur un autre ordinateur, il va falloir faire attention à quelques détails indispensables :
</p>
<ul>
<li>vérifier le pare feu de chaque machine !</li>
<li>autoriser la connexion du serveur java sur le serveur mysql dans /etc/hosts.allow</li>
<li>autoriser vos utilisateurs à se connecter sur le serveur mysql depuis la machine java dans la table mysql.user</li>
<li>si vous utilisez ssh pour cette connexion, configurez correctement votre serveur de clés d'authentification</li>
</ul>
<p>
Je ne décrirai pas le dernier point car c'est (encore) hors de ma compétence. Mais je vais détailler les autres points. Tout est à réaliser avec les droits <strong>root</strong> !
</p>
<h2>pare-feu</h2>
<figure>
<figcaption>configuration du pare-feu sur le serveur java</figcaption>
<pre>
iptables -A INPUT -s 192.168.0.42/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
iptables save
</pre>
</figure>
<h2>connexion tcp/ip</h2>
<p>Éventuellement, il faudra modifier <tt>/etc/hosts.allow</tt> sur le serveur mysql en ajoutant une ligne comme :
</p>
<figure>
<figcaption>ligne à ajouter dans <tt>/etc/hosts.allow</tt></figcaption>
mysqld: ALL : ACCEPT
</figure>
<p>
Ensuite il faut modifier <tt>/etc/mysql/my.cnf</tt> sur le serveur mysql pour autoriser la connexion depuis une autre machine. Pour cela il faut mettre en commentaire la directive <tt>skip-networking</tt>, mais dans un serveur récent, elle n'est plus utilisée. À la place on a <tt>bind-address = 127.0.0.1</tt> et en fait on va créer ou modifier <tt>bind-address</tt> pour y mettre l'adresse du serveur java (ici, <tt>192.168.0.42</tt>), ou bien <tt>0.0.0.0</tt> si on veut autoriser tous les serveurs :
</p>
<figure>
<figcaption>modification de <tt>bind-address</tt> dans <tt>/etc/mysql/my.cnf</tt></figcaption>
bind-address = 192.168.0.42
</figure>
<h2>utilisateurs mysql</h2>
<p>Créez ou modifiez votre utilisateur avec "<tt>%</tt>" dans le champ <tt>Host</tt> de la table <tt>user</tt> de la base de données nommée <tt>mysql</tt> . On peut réduire la portée en mettant <tt>192.168.0.%</tt> à la place de <tt>%</tt> par exemple, ou encore avec l'adresse IP du seul serveur depuis lequel la connexion est autorisée.
</p>
<h3>Attention avec phpmyadmin</h3>
<p>
Si vous avez mis une portée de <tt>Host</tt> comme <tt>192.168.0.%</tt> par exemple, alors vous ne pourrez plus vous connecter avec cet utilisateur avec phpmyadmin. Si ça vous ennuie, il faudra créer un autre profil de l'utilisateur avec <tt>localhost</tt> comme valorisation du champ <tt>Host</tt> et le doter des mêmes privilèges. Le code ci-après montre comment créer les deux pour un utilisateur <tt>connext</tt>.
</p>
<figure>
<figcaption>commandes sql pour avoir la connexion distante restreinte et la connexion mysql</figcaption>
<pre>
flush privileges;
create user 'connext'@'localhost' identified by 'password';
create user 'connext'@'192.168.0.%' identified by 'password';
grant create, drop, delete, insert, select, update, alter, index on *.* to 'connext'@'localhost';
grant create, drop, delete, insert, select, update, alter, index on *.* to 'connext'@'192.168.0.%';
flush privileges;
</pre>
</figure>
<p>
Avec une portée comme <tt>%</tt>, vous pouvez aussi vous connecter via phpmyadmin car <tt>%</tt> inclut <tt>localhost</tt>.
</p>
le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-92153972195742965422016-01-28T14:25:00.001-08:002016-01-28T14:25:49.854-08:00la trahison<cite>
<p>
« Oncques ne vit telle perfidie commise, ma foi, je vous le dis ! Hier, au soir quand était venu le temps de consigner par écrit les faits édifiants de la journée, notre serviteur fidèle, féal entre tous, nous laissa choir et nous fûmes fort dépourvus, abandonnés en rase campagne et sans moyen de communication !
</p><p>
Lors, nous fîmes écarteler le renégat pour en faire un exemple, et nous ordonnions de prélever les viscères les plus nobles, le cerveau, et les plus viles, l'estomac et les tripes, pour les faire porter au médecin qu'il s'en enquisse et nous pût dire ce qu'il en échoit. Cela faisait aussi un exemple et montrait à tous que la traîtrise était impitoyablement châtiée !
</p>
<figure class="separator" style="clear: both; text-align: center;"><a href="https://upload.wikimedia.org/wikipedia/commons/2/28/Dieric_Bouts_013.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" width="320px" src="https://upload.wikimedia.org/wikipedia/commons/2/28/Dieric_Bouts_013.jpg" alt="supplice de l'écartélement infligé à Saint Hippolyte (source wikiédia)" /></a></figure>
<p>
L'homme de l'art se mit prestement au labeur. Il s'enquit d'abord du cerveau. Il ne pouvait en percevoir le fonctionnement mais il savait comment y était sa mémoire des faits et gestes. Il la tourmenta fort et en toute extension possible, et son jugement tomba : cette mémoire là n'était point corrompue et témoignait assurément que les actes du triste sire n'était point de son plein gré. Une magie noire était à craindre !
</p><p>
Les viscères furent confiées à un chirurgien pour examen. Il se disait que l'homme faisait déterrer des cadavres pour les soumettre à son scalpel. C'était là racontars, mais ils avaient convaincu notre personne que ce quidam était celui qu'il nous fallait. Le praticien examina comme il convenait l'estomac et les organes associés en dehors de notre présence mais sa conclusion était formelle : ces organes-là étaient sains et nul esprit vicié n'y résidait, nulle lésion n'y était détectable et rien de suspect ne s'étaient présenté ni à ses yeux, ni à ses doigts, ni à son nez.
</p><p>
Le bougre semblait avoir été honnête ! Voilà qui était extraordinaire. La perspective d'une erreur judiciaire monumentale ne nous effraie guère d'habitude plus que de raison d’État mais cette fois-ci le sentiment de trahison vis à vis de son fidèle serviteur s'y mêlait, et nous ne pouvions pas nous en laver les mains comme cela.
</p><p>
Aussi fîmes nous mander nos alchimistes, car le remède à tout ceci semblait ne pouvoir procéder que de leurs talents. Il y avait même parmi eux certains qu'on disait nécromanciens. Ces docteurs réunis ne tardèrent pas à tenir colloque à huis clos. La conversation dût aller bon train. Ils nous demandèrent de faire mander notre barbier. L'homme a, me dirent-ils, toute ma confiance et et d'une habileté exceptionnelle. Il est rompu à la petite chirurgie réparatrice et sait assez satisfaire sa clientèle. Il diffère en cela des chirurgiens qui savent mieux découdre que recoudre, et qui ont une trop haute opinion d'eux-mêmes pour la besogne qu'ils lui réservent !
</p><p>
En effet, il nous fut affirmé que la résurrection de notre serviteur était tout à fait envisageable pourvu qu'on sache en réparer les chairs comme si jamais il n'avait été démembré et autrement mis en pièces. C'est là le miracle que l'on attendait de notre barbier ! Habile et tenace, habitué à recoudre les blessures, notre précieux auxiliaire fut affairé et zélé et en quelques heures, le pauvre serviteur fut reconstitué d'une façon admirable. Certes, les coutures étaient là, nombreuses, mais les chaires étaient aussi bien contiguës qu'il se pouvait rêver qu'elles le soient, et tout cela était diantrement prometteur.
</p><p>
Le chef des alchimiste fit récupérer le corps, et il faut procédé à la cérémonie secrète de nécromancie à laquelle nous n'avons point été invité et dont nous ne savons rien que le résultat qu'elle produisit. Mais quel résultat !
</p><p>
Non seulement notre fidèle homme de confiance était revenu d'entre les morts, mais il en était revenu sans aucune cicatrise ni aucune contusion ni rien d'autres de ce qu'on pouvait encore voir sur le corps que le barbier avait su reconstituer, comme si jamais rien de funeste ne lui était arrivé. Nous ne savons guère quelle magie a opéré, mais elle et trop prodigieuse pour que nous songions à chercher querelle religieuse aux hommes de l'Art capable d'une telle prouesse. Trop ravi, nous avons ordonné à notre ressuscité comme à l'accoutumé. Et pour notre conscience et l'expression de notre reconnaissance au-delà des espèces sonnantes et trébuchantes que nous avions déjà distribué aux acteurs de ce haut fait, nous avons fait donation à notre sainte mère l’Église pour que soit dite à perpétuité une messe quotidienne d'action de grâce en l'honneur de tous les Saints, car il est sûrement indéniable qu'ils faille tous les remercier de leur intercession auprès du Seigneur, car ces choses-là ne peuvent autrement s'expliquer. »
</p>
</cite>
<hr />
<p>
Voilà certes une bien étrange façon pour un homme du vingt et unième siècle de décrire comment son ordinateur si efficace et si docile depuis de nombreuses années l'a soudain accueilli par une incapacité à démarrer. Seulement l'écran avec le logo du constructeur, pas de chargement de grub le chargeur d'amorçage, pas de possibilité d'entrer dans le setup du bios ou dans l'écran de choix du périphérique de démarrage ou même de faire une remise à zéro avec le célèbre control-alt-del. Rien d'autre que ce logo. Et aussi pour dire que ce qui fut fait fut de démonter la machine, un nettop qui a dû perdre presque toutes ses vis pour donner accès aux seuls composants accessibles et impliqués ; la barrette de mémoire et le disque SSD. Car si eux étaient testés en état de marche, si en remontant la machine le diagnostic était confirmé, ce serait à coup sûr que la carte mère ou le processeur était en faute et il aurait fallu se procurer une autre machine en remplacement. Le test de la mémoire sur une tierce machine révéla une mémoire sans aucune erreur. Le disque SSD fut capable de lancer très correctement son linux sur un autre ordinateur. Il fut donc procédé au remontage, et là tout marcha du premier coup ! Sans doute la barrette de mémoire avait-elle était un peu déplacée de son emplacement, un faux contact aboutissant au diagnostic. Rien n'avait été fait d'autre et maintenant tout marchait comme avant. Juste un peu de temps de perdu et ce n'était pas bien grave en vérité.
</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com3tag:blogger.com,1999:blog-3264392475730993744.post-39090061942444355362016-01-25T13:44:00.001-08:002016-01-25T13:44:30.696-08:00trois machines, trois défis pour Linux<p>
Profitant des soldes et du Cyber Monday, je me suis récemmment équipé de trois nouvelles machines dont aucune n'est nativement sous linux :
un Pipo X8 64 Go (écran 7" + prise HDMI, double boot Anroid 5.1 et Windows 10) ;
un portable 11,6" Acer ES1 131 sous windows 10 ;
un boîtier pour télé Mini MX sous android 5.1 et ARM.
</p><p>
Le stockage se fait via de la mémoire EMMc (moins bien que le SSD mais plus économique).
</p><p>
Le défi est de faire tourner Linux dessus. Windows 10 étant un immense spywareu, je le jette aux orties, mais j'en veux une copie le temps de la garantie ou pour réparer une boulette énorme lors de l'installation (sauvegarde de tout l'espace de stockage). Je ne suis pas sûr d'arriver à mes fins.
</p><p>
<h2>le Pipo X8</h2>
Pour le pipo X8, j'ai oublié mon mot le passe windows :-( et aucun des trucs usuels ne semble marcher. Les utilitaires Windows ou Windows PE ne bootent pas. J'ai dû laissé activé le Fast boot dans Windows. Je l'ai pourtant désactivé au niveau du Bios. Sous un linux live, je ne suis pas arrivé à monter en écriture la partition système de Windows, signe sans doute que Windows a été éteint en fast boot. Je réessaierai une ultime fois si j'arrive à booter depuis un système normal installé sur une clé USB (par la clé d'installation). Sinon tant pis, j'installerrais linux à la place de Windows. J'aimerais bien conserver le dual boot mais avec linux et android. Ce genre d'exploit existe sur d'autres machines.
</p><p>
En tout cas, ce qui boote le mieux (fiable et sûr) c'est Debian multi-arch. Je l'ai installé sur une clé externe hier, mais ce matin j'ai constaté que c'était android qui botait, pas linux. Peut-être un problème avec Grub 2 (je l'ai peut-être mis sur la EMMc mais j'ai esaayé de booter sur la clé USB qui n'aura pas eu son Grub). Je réinvestigue tout ça dès que possible.
</p><p>
Le Pipo X8 permet de désactiver le fast boot et le secure boot mais il ne boote qu'en UEFI, pas de secure boot. L'accès au shell (U)EFI est possible, mais c'est un peu galère de trouver ce qu'il faut. De la doc existe. Avec Debian, j'espère ne pas avoir besoin de la creuser.
</p><p>
<h2>l'Acer ES1 131</h2>
Cet Acer est un gros netbook. Pas une super bête de course, mais il m'offre la possibilité de voir des vidéos HD que n'avaient aucun de mes netbooks de la génération eeePC 701 et suivante. En ce senns, je ne regrette pas de les avoir vendus pour finacer son achat (140€, plus 10€ pour une housse).
</p><p>
Cet appareil a un Bios très sympa : on peut désactiver le fast boot, le secure boot et l'UEFI au profit du Legagy boot. J'ai pu installer Linux Mint 17.3 dessus sans problème.
</p><p>
Mais ça ne bootait pas ! Une personne serviable du forum de linux mint m'a alors conseillé de ne pas omettre la partition de sap, ce que j'avais toujours fait avec un SSD. Oh miracle, ça a marché ! Je dois essayer de voir si après installation, je peux désactiver le flash, parce que là je n'ai que 32Go d'espace disque et que le swap en fait 4 !
</p><p>
Question vitesse, c'est un celeron 3050 et c'est honorable. Je suis content de mon achat et de ce modèle en particulier. C'est bien de voir les soldes se poursuivre et de constater qu'on ne regrette aucunement son achat fait dans les premiers jours.
</p><p>
<h2>le Mini MX</h2>
Je n'ai encore rien essayé concernant linux avec. L'android fourni avec tourne bien, mais on peut pas vraiment tout faire à la souris. Je n'ai pas essayé l'espèce de trackpad externe Logitech pour PC que j'ai (qui tourne sous Windows et qui est exploitable sous linux) voir si ça ferait mieux. En attendant, je jongle avec la télécommande et la souris quand je le teste.
</p><p>
Dedans il y a un processeur AMLogic S905, c'est à dire un processeur ARM 64 bit (compatible 32 bit). Je ne vois guère que Debian qui s'occupe de ce genre de bête. Il y a de de disponible une image Ubuntu pour les processeurs ARM 64 bit moderne à tester aussi. En premier lieu, car la solution purement Debian n'est pas présentée d'une façon très compréhensible. Il faut être plus chevelu que moi comme geek pour comprendre la marche à suivre à la première lecture et même aux suivantes. En tout cas, il faut essayer ce qui est proposé comme on lit car les manipulations exposées ne sont pas du tout faites dans le mond Intel.
</p><p>
En sus, cet appareil n'a que 1Go de RAM et une mémoire de stockage de 8Go. C'est vraiment peu, ça va plus être une façon de mettre le pied à l'étrier qu'un projet réllement productif.
</p><p>
<h2>à suivre</h2>
Dans un prochain article, j'exposerai la suite du défi. J'espère que cela finira par être utile à au moins un internaute francophone, car on ne trouve pas trop de détails pous ces trois quêtes. Je mettrais les détails techniques quand j'aurai fini mes investigations (échec ou succès) ou dès que j'aurais un succès réel.
</p><p>
Et je mettrai à jour cet article avec des photos dès que j'en aurais le temps. Déjà, je dois faire les photos requises !
</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-91965114365014710802015-12-08T07:54:00.002-08:002017-11-03T08:47:32.529-07:00trouver des paquets sous debian dans un script<style>pre { background-color: beige; } </style>
<p>
On a parfois besoin dans un script shell de trouver le nom exact d'un paquet disponible, ou en tout cas tous ceux qui pourraient convenir. Par exemple si on veut trouver les forth disponibles on peut utiliser :
</p><p><pre>
aptitude search 'forth' -F '%p'
</pre>
</p><p>
On peut trouver la <a href="http://algebraicthunk.net/~dburrows/projects/aptitude/doc/fr/ch02s04s01.html">liste des directives de format</a> dont %p est un exemple.
</p><p>
Si aptitude n'est pas installé, on peut utiliser dpkg, mais il faut plus de travail autour pour avoir un résultat similaire :
</p><p><pre>
dpkg -l '*forth*' | tail -n +6 | awk '{ print $2; }'
</pre>
</p><p>
Si on n'est intéressé que par les paquets installés, on peut utiliser dpkg-query :
</p><p><pre>
dpkg-query -f '${binary:Package}\n' -l '*forth*'
</pre>
</p><p>
Exemple concret : trouver le nom du paquet à installer pour installer libmagickwand et y procéder.
<p><p><pre>
lmw=$(aptitude search '~n^libmagickwand[0-9]' -F '%p' | head -1)
sudo aptitude install $lmw
</pre>
</p>
le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-10572526792721681142015-12-04T07:10:00.001-08:002015-12-04T07:21:57.893-08:00un peu d'historique et de tenue<style>pre { background-color:beige; }
</style>
<p>
À la suite de la lecture de <a href="http://www.pixelbeat.org/docs/power_of_the_default.html">cet article</a>, j'ai été amené à modifier mes fichiers .bashrc et .vimrc pour les rendre plus sympas. J'ai regardé un peu d'autres ressources et voilà finalement ce que j'ai ajouté à mon <strong>.bashrc</strong>
</p>
<code><pre>
# no duplicate in history
export HISTCONTROL=ignoreboth:erasedups
# do not make noise. Also visible can cause delays.
set bell-style none
# Don't echo ^C etc (new in bash 4.1)
# Note this only works for the command line itself,
# not if already running a command.
set echo-control-characters off
<style>code { ackground-color:beige; }</style>
# Enable coloring for tab completions with bash >= 4.3
set colored-stats on
# Note this must be done before the settings below
# Caveats:
# Broken on bash 3.2 (can't move cursor to EOL).
# ^L only works in command mode and when line is empty
set editing-mode vi
set -o vi
# By default up/down are bound to previous-history
# and next-history respectively. The following does the
# same but gives the extra functionality where if you
# type any text (or more accurately, if there is any text
# between the start of the line and the cursor),
# the subset of the history starting with that text
# is searched (like 4dos for e.g.).
# Note to get rid of a line just Ctrl-C
bind '"\e[B": history-search-forward'
bind '"\e[A": history-search-backward'
</pre></code>
<p>
Et voici les ajoûts de mon <strong>.vimrc</strong> :
</p>
<code><pre>
set bs=2
let g:is_posix=1
set listchars=tab:>-,trail:.,extends:>
</pre></code>
<p>
Les autres suggestions ne m'ont pas intéressé finalement. Pour vim, je n'ai pas vu grande différence pour l'instant, mais pour bash, c'est nettement mieux !
</p><p>
Mais pour vim j'ai aussi installé deux extensions assez chouettes :
<ol>
<li><a href="https://github.com/scrooloose/syntastic">syntastic</a> pour la coloration syntaxique ;</li>
<li><a href="https://github.com/bling/vim-airline">vim-airline</a> pour une belle ligne d'état (vim et gvim).</li>
</ol>
</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-58329796104638358642015-06-15T13:53:00.000-07:002015-06-15T13:53:15.571-07:00clavier Kensington keyfolio pro 2 pour IPad avec linux<p>
Je viens d'acheter un tel clavier d'occasion, quasimment neuf. C'est le modèle pour iPad 10" mais il fonctionne très bien avec Android ou linux. L'image ci-dessous est en QWERTY (elle provient de <a href="http://the-gadgeteer.com/2013/01/25/kensington-keyfolio-pro-2-removable-keyboard-case-and-stand-for-ipad-2-3rd-gen-and-4th-gen-ipad-review/">the-gadgeeteer.com</a>).
</p>
<figure class="separator" style="clear: both; text-align: center;"><a href="http://the-gadgeteer.com/wp-content/uploads/2013/01/kensington-keyfolio-keyboard-case-ipad-7-500x231.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://the-gadgeteer.com/wp-content/uploads/2013/01/kensington-keyfolio-keyboard-case-ipad-7-500x231.jpg" /></a></figure>
<p>
C'est un AZERTY de type Mac. Ceda signifie que l'équivalent dans le monde PC est un clavier belge. C'est presque pareil, la seule différence notable étant dans l'affectation de la touche à côté du chiffre 1 en haut. En belge, c'est le 2 et 3 en exposant. Très inutile pour presque tout le monde. En Mac, c'est <, > et \ qui sert tout le temps.
</p><p>
Sur un clavier belge à 105 touche, cette touche existe aussi : c'est celle à gauche du W en bas. Sauf qu'elle n'existe pas physiquement dans mon clavier Kensington ! Il faut y remédier !
</p><p>
La solution est de remettre la touche du haut déjà évoquée dans son usage Mac. Cela me donnera les symboles, en accord avec la gravure du clavier qui plus est !
</p><p>
Pour cela, il faut éditer le fichier /usr/share/X11/xkbd/symbols/be et voici la tranformation à y faire :
</p><p>
<pre>
<strong>avant :</strong>
key <TLDE> { [twosuperior, threesuperior, notsign, notsign ] };
<strong>après :</strong>
// key <TLDE> { [twosuperior, threesuperior, notsign, notsign ] };
key <TLDE> { [less, greater, backslash, backslash ] };
</pre>
<p>
(j'ai recopiée la ligne de <LSGT> un peu plus bas et changé LSGT en TLDE).
</p><p>
Bon, il faut ensuite mettre le clavier belge dans les claviers supportés. On peut changer de clavier à la souris, mais c'est pas mal aussi au clavier. Je me suis donc créé deux raccourcis dans les préférences claviers :
</p>
<dl>
<dt>clavier azerty</dt>
<dd>setxkbmap be</dd>
<dd>maj-F2</dd>
<dt>clavier bépo</dt>
<dd>setxkbmap fr bepo</dd>
<dd>maj-F1</dd>
</dl>
<p>
<strong>Attention !</strong> Le passage auclavier correspondant au clavier physique se fait toujours en tappant shift-F1 sur le clavier bépo ou le clavier Mac. C'est bizarre que ce ne soit pas identique. Attention encore, pour enregistrer la séquence de transition bépo vers azerty belge, il faut être en bépo et taper shift-F1 sur le clavier Mac. Et pour la séquence inverse azerty belge vers bépo il faut être en azerty et appuyer sur shift-F1 sur le clavier bépo (un typematrix 2030 dans mon cas). À noter que sur ce clavier typematrix, je peux faire shift-F2 pour passer en azerty quand je suis déjà en bépo. Je ne peux pas faire ça sur le clavier Kensington, assez logiquement (ce qui y serait la touche logique F1 est la touche escape donc pas de touche de <em>code</em> F1 sur ce clavier).
</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-11100218328998109082014-12-10T02:37:00.000-08:002017-11-03T08:48:01.580-07:00variables Bash : bye bye basename<style>
code { font-weight: bold; color: maroon; }
pre { background-color: white; }
</style>
<h2>édition rapide du contenu des variables sous bash et dash</h2>
<p>Bash a un mécanisme d'édition de variables intégré permettant d'en supprimer le début ou la fin. En prime, ça peut aussi compter la longueur du contenu.
</p><p>
Pour supprimer le début c'est avec #. Si on prononce # « dièse », ça commence par un D comme « début ».
</p><p>
Pour supprimer la fin c'est avec %. Bon, on peut se dire qu'un pourcentage s'écrit avec % à la fin pour s'en souvenir.
</p>
<h2>Exemples d'utilisation</h2>
<dl>
<dt>transformer un flac en ogg</dt>
<dd>
<code><pre>
sox $chanson ${chanson%.flac}.ogg
</pre></code>
</dd>
<dt>calculer la longueur d'un mot</dt>
<dd>
<code><pre>
echo $mot fait ${#mot} char. de long
</pre></code>
</dd>
<dt>afficher le début d'un texte</dt>
<dd>
<code><pre>
echo début du texte : ${texte:0:30}
</pre></code>
</dd>
<dt>évaluer le chemin du script exécuté</dt>
<dd>
<code><pre>
chemin=${0%/*}
</pre></code>
</dd>
<dt>évaluer le chemin du script exécuté, complété pour le cas des liens symboliques</dt>
<dd>
<code><pre>
this=$(readlink -e $0)
chemin=${this%/*}
</pre></code>
</dd>
<dt>afficher le seul nom du script exécuté</dt>
<dd>
<code><pre>
echo ${0##*/}
</pre></code>
</dd>
<dt>supprimer un éventuel / final à un nom de répertoire</-dt>
<dd>
<code><pre>
repertoire=${repertoire%/}
</pre></code>
</dd>
</dl>
<p>
Tout cela fonctionne aussi avec dash !
</p><p>
Une petite colle maintenant : si votre script est appelé par la commande point (.) alors $0 n'est pas le nom de votre script mais celui du shell appelant ou du script appelant. Comment récupérer le nom du script dans ce cas-là ? Je n'en sais rien !
</p>
<h2>un petit exemple concret</h2>
<p>
Le programme suivant permet d'éditer en mode comparaison tous les couples de fichiers de même nom dans deux répertoires différents, en se restreignant au seul cas où ils ont un contenu différent. C'est un script dash pour plus de radipité au lancement. L'éditeur utilisé est vim ou gvim (sous la forme vimdiff ou gvimdiff).
</p>
<code><pre>
#!/bin/sh
# édite les fichiers de même nom dans deux répertoires mais différents
usage() {
echo "usage: ${0##*/} [-g] dir01 dir02"
echo "Edit same files in both directories with different contents only."
echo "With -g use gvimdiff instead of vimdiff."
exit 1
}
editor=vimdiff
if [ "$1" = '-g' ] ; then
editor=gvimdiff
shift
fi
[ $# -eq 2 ] || usage
dir01="${1%/}"
dir02="${2%/}"
ndiff=0
ntotal=0
compare() {
if [ -f $2 ] ; then
ntotal=$((ntotal+1))
if ! cmp --quiet $1 $2 ; then
#echo '!=' DIFF $1 $2
$editor $1 $2
ndiff=$((ndiff+1))
fi
fi
}
files=$(find "$dir01" -maxdepth 1 -type f)
for f01 in $files ; do
f02=$dir02/${f01##*/}
compare $f01 $f02
done
echo "$ndiff couples of files were different out of $ntotal."
</pre></code>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-57131426822190463682014-11-27T02:20:00.001-08:002015-07-20T07:11:24.335-07:00Créer un sous-DBA sous mysql pour le dév<style>
code { font-weight: bold; color: maroon; }
pre { background-color: white; }
</style>
<p>
Il s'agit de créer un utilisateur <strong>dev</strong> qui a presque tous les droits sous mysql. On trouve de tels articles tout plein dans le web, mais celui-ci est taillé sur mesure pour mes besoins !
</p>
<p>
Avant de commencer, un petit truc pour phpmyadmin : on peut entièrement le reconfigurer, y compris si la base phpmyadmin a été abimée, avec :
<code><pre>
sudo dpkg-reconfigure phpmyadmin
</pre></code>
</p><p>
Il s'agit tout simplement de créer l'utilisateur dev et ensuite de lui donner ses pouvoirs. Rien de sorcier. 4 lignes de SQL suffisent :
<code><pre>
flush privileges;
create user 'dev'@'localhost' identified by 'password';
grant create, drop, delete, insert, select, update, alter, index on *.* to 'dev'@'localhost';
flush privileges;
</pre></code>
Le premier <code>flush privileges;</code> permet de recréer l'utilisateur dev si on vient de le supprimer. Le deuxième permet de s'en servir à coup sûr.
</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-39873999547210726972014-11-26T08:03:00.000-08:002014-11-27T01:57:57.750-08:00URL rewriting avec Apache pour Zend 1.x<style>
code, tt { font-weight: bold; color: maroon; }
p.log { background-color: #fff1ad; }
pre { background-color: white; }
</style>
<p>
J'ai eu beaucoup de mal à faire fonctionner le moindre exemple d'application avec Zend 1.x. Zend est un framework PHP qui ne marche qu'avec de l'URL rewriting et je n'en n'avais jamais fait. Mais j'avais déjà fait des configuration Apache avec VirtualHost aussi ai-je dès le départ mis en place un virtual host. Voir <a href="http://lacharne.blogspot.fr/2014/10/configuation-apache-avec-virtualhost.html">mon billet précédent sur la configuration d'Apache2 avec VirtualHost</a>.
</p><p>
J'ai donc une URL applicative sur ma machine qui se nomme <tt>guestbook.machine.chez.moi</tt> et à cette URL correspond le contrôleur <tt>IndexController</tt>. Un synonyme de cet URL est <tt>guestbook.machine.chez.moi/index</tt> puisqui <tt>index</tt> est le désignateur de ce contrôleur dans une URL Zend. Oui mais voilà, chez moi cette deuxième ne marchait pas et j'avais une erreur 404 générée par Apache. Idem avec <tt>guestbook.machine.chez.moi/bidon</tt>.
</p><p>
Je finis par découvrir qu'en fait c'était parce que le fichier <tt>.htaccess</tt> que Zend avait créé pour assurer l'URL rewriting n'était pas pris en comptes parce que dans mon fichier de configuration Apache de l'application <tt>/etc/apache2/sites-available/guestbook</tt> j'avais d'actif un <tt>Options none</tt> alors qu'il fallait y mettre un <code>FollowSymLinks</code>. Mais je me suis contenté, bêtement, de recopier le bout de config donné là où j'ai trouvé cette information, à savoir <code>Options Indexes MultiViews FollowSymLinks</code> sans remarquer le <code>MultiViews</code> dont j'ignorais le rôle. Mais ça ne marchait toujours pas mieux…
</p><p>
Le log d'Apache m'informe de son refus de collaborer avec une ligne telle que :
</p><p class="log"><tt>[Wed Nov 26 15:31:52.624341 2014] [negotiation:error] [pid 10160] [client 127.0.0.1:43836] AH00687: Negotiation: discovered file(s) matching request: /home/geek/workspace/guestbook/public/index (None could be negotiated).
</tt></p><p>
Mais je n'ai pas de fichier ou répertoire <tt>index</tt>, seulement un fichier <tt>index.php</tt> à la racine Apache du serveur. En gooolant le message d'erreur je trouve <a href="http://www.bennadel.com/blog/2218-negotiation-discovered-file-s-matching-request-none-could-be-negotiated.htm">la cause et la solution</a> : c'est ce <strike>foutu</strike> <code>Multiviews</code> qui fait coïncider <tt>index.php</tt> avec <tt>index</tt> et cela empêche l'URL rewriting conditionnel mis en place par Zend (pas d'URL rewriting si l'URL pointe sur un fichier existant). Il faut supprimer <code>Multiviews</code> et tout va pour le mieux. Voici donc ma configuration du VirtualHost avec les droits réduits au minimum :
<code><pre class="virtual">
<VirtualHost *:80>
ServerName guestbook.machine.chez.moi
DocumentRoot /home/geek/workspace/guestbook/public
DirectoryIndex index.php
<Directory />
Options none
AllowOverride None
Require all denied
</Directory>
<Directory /home/geek/workspace/guestbook/public>
Options FollowSymLinks SymLinksIfOwnerMatch
AllowOverride None
Require all granted
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
</Directory>
ErrorLog /var/log/apache2/guestbook.log
LogLevel warn
CustomLog /var/log/apache2/guestbook.log combined
</VirtualHost>
</<>;VirtualHost>></pre></code>
La directive <code>AcceptPathInfo</code> est inutile, mais je l'ai mise pour me rappeler que c'est finalement le mécanisme induit qui est utilisé par défaut dans ce cas. Comme je n'ai pas mis <code>FollowSymLinks</code> je pourrais aussi enlever <code>RewriteCond %{REQUEST_FILENAME} -l [OR]</code> qui devient un test inutile.
</p><p>
Si on utilise un fichier <tt>.htaccess</tt> alors son contenu est celui généré par Zend :
<code><pre class="htaccess">
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]</pre></code>
et le contenu de <tt>/etc/apache2/sites-available/guestbook</tt> est :
<code><pre class="virtual">
<VirtualHost *:80>
ServerName guestbook.machine.chez.moi
DocumentRoot /home/geek/workspace/guestbook/public
DirectoryIndex index.php
<Directory />
Options none
AllowOverride None
Require all denied
</Directory>
<Directory /home/geek/workspace/guestbook/public>
Options FollowSymLinks SymLinksIfOwnerMatch
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/apache2/guestbook.log
LogLevel warn
CustomLog /var/log/apache2/guestbook.log combined
</VirtualHost>
</<>;VirtualHost>></pre></code>
</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-90022680499841487402014-10-28T09:26:00.000-07:002014-11-27T01:56:46.669-08:00première version alpha de Blood and Blades<div class="separator" style="clear: both; text-align: center;">
<a href="http://farm4.static.flickr.com/3265/3236415581_46ba491003_m.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://farm4.static.flickr.com/3265/3236415581_46ba491003_m.jpg" /></a></div>
<br />
<br />
Eh non, ce ne sera pas encore aujourd'hui je vais vous parler de <b><i>Blood and Blades</i></b> ! C'est une règle de jeu d'histoire avec figurines de mon invention. Je me dois d'avouer tout de suite qu'elle doit beaucoup à <b>DBM</b>, <b>DBMM</b> et <b>Armati</b>, tout en visant une bataille de la taille et de la durée d'une partie d'<b>ADG</b>. Elle est en anglais pour ne pas rester franco-française. Mais surtout elle est sous licence libre <b>CC-BY-SA</b> tout en utilisant les listes d'armée DBMM ou DBM.<br />
<br />
Voici la règle <a href="http://meddurenos.free.fr/bab/blood-and-blades.master.html">Blood and Blades sous forme d'un wiki</a>. Enregistrez la cible de ce lien comme un fichier html et ouvrez-le. Il faut autoriser le javascript pour pouvoir lire la règle. Je sais devoir entreprendre la réalisation d'une version PDF.<br />
<br />
Tout retour est le bienvenu, sur le fond comme sur la forme. N'hésitez pas ! Et merci d'avance pour toute aide qui me parviendra !<br />
<br />
(crédit photo «cutter & blood» par gaelx <a href="http://www.flickr.com/photos/7574080@N08/3236415581">http://www.flickr.com/photos/7574080@N08/3236415581</a> CC-BY-SA)<br />
<br />
<b>mise à jour du 10/04/2013</b> : j'ai mis une version avec quelques changements que j'avais oublié de faire hier : <i>escape</i> --> <i>flee</i> et <i>cluster</i> --> <i>group</i> notamment.
</p><p>
<b>mise à jour du 28/10/2014</b> <: le lien sur la règle a été changé pour une version plus récente. Et voici les liens pour la <a href="http://meddurenos.free.fr/bab/blood-and-blades.epub">version epub</a> (avec graphismes vectoriels SVG) et la <a href="http://meddurenos.free.fr/bab/blood-and-blades_conv.pdf">version pdf A4</a>.
</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-30506179699298332282014-10-28T08:27:00.000-07:002014-10-28T08:30:18.749-07:00configuation Apache avec VirtualHost<p>Il va s'agir ici d'indiquer comment configurer Apache pour avoir plusieurs serveurs virtuels sur la même machine. C'est encore un exposé de plus, mais il expose ma façon de faire pour que je ne l'oublie plus et n'aie plus à potasser la doc de référence d'Apache pendant une demi-journée...
</p>
<p>Cette configuration concerne <strong>Apache 2.4</strong> ! Essayer une config Apache 2.0 ou 2.2 sur une Apache 2.4 mène le plus souvent à une erreur 403 (droits d'accès insuffiants -- parce que la syntaxe afférente a changé).
</p>
<p>Le système hôte est une debian ou un dérivé comme Ubuntu ou Linux Mint.
</p>
<p>Pour créer le serveur appli.chez.moi sur son serveur personnel il faut déjà permettre la résolution du nom appli.chez.moi et si on n'a pas de dns on va insérer dans <code>/etc/hosts</code> la ligne suivante (avec une tabulation avant l'adressi ip) :</p>
<p><code>
appli.chez.moi 127.0.0.1
</code></p>
<p>On peut mettre sa vraie adresse ip à la place de 127.0.0.1 si on veut mais ça ne change rien. Cela suffit pour être accessiblle à une machine externe à la condition qu'elle-même puisse modifier pareillement son fichier hosts, avec la vraie adresse ip de votre serveur toutefois (ce n'est pas possible sans avoir les droits administrateur sur la machine externe). Pour windows xp, il s'agit du fichier <code>C:\WINDOWS\system32\drivers\etc\hosts</code> qui a la même syntaxe que sous linux.
</p>
<p>Il faut maintenant créer le fichier <code>/etc/apache2/sites-available/appli</code> (on peut aussi le nommer <code>appli.chez.moi</code> et on peut ajouter une extension <code>.conf</code>). Recopiez y le contenu ci-dessous.
</>
<pre>
<VirtualHost *:80>
ServerName appli.chez.moi
DocumentRoot /mnt/servers/appli
DirectoryIndex index.php
<Directory />
Options none
AllowOverride None
Require all denied
</Directory>
<Directory /mnt/servers/appli>
Require all granted
</Directory>
ErrorLog /var/log/apache2/appli_error.log
LogLevel warn
CustomLog /var/log/apache2/appli_access.log combined
</VirtualHost>
</pre>
<p>Cette config est pour un serveur php basique sans framework. Avec un framework, il faut pointer sur un sous répertoire et le fichier par défaut n'est en général toujours <code>index.ph«/code>p aussi voyez ci-après ce que cela donnerait si, par exemple, <code>appli.chez.moi</code> était développée avec symphony 2.4.
</p>
<pre>
<VirtualHost *:80>
ServerName appli.chez.moi
DocumentRoot /mnt/servers/appli/web
DirectoryIndex app_dev.php
<Directory />
Options none
AllowOverride None
Require all denied
</Directory>
<Directory /mnt/servers/appli/web>
Require all granted
</Directory>
ErrorLog /var/log/apache2/appli_error.log
LogLevel warn
CustomLog /var/log/apache2/appli_access.log combined
</VirtualHost>
</pre>
<p>Et voici le même exemple avec CodeIgniter mais en plus une gestion avec subversion (on veut lancer la version du <em>trunk</em> qui est dans <code>/mnt/servers/appli/trunk</code>).
<pre>
<VirtualHost *:80>
ServerName appli.chez.moi
DocumentRoot /mnt/servers/appli/trunk/web
DirectoryIndex index.php
<Directory />
Options none
AllowOverride None
Require all denied
</Directory>
<Directory /mnt/servers/appli/trunk/web>
Require all granted
</Directory>
ErrorLog /var/log/apache2/appli_error.log
LogLevel warn
CustomLog /var/log/apache2/appli_access.log combined
</VirtualHost>
</pre>
</p>
<p>Bon, ces fichiers interdisent l'emploi de fichiers .htacess. On peut changer cela en ajoutant une ligne
<pre>
AllowOverride all
</pre>
dans <code><Directory /mnt/servers/appli/trunk/web></code> (ou quelque chose de moins ouvert que <em><code>all</code></em>).
</p>
<p>Ces configurations interdisent l'emploi de liens symboliques. Je n'ai pas réussi à avoir une configuration comme il est recommandé d'en avoir avec des liens symboliques. Bon, en fait, je me suis rendu compte que je pouvais m'en passer, alors je m'en passe. Et d'autant mieux que c'est ce qu'Apache recommande.
</p>
<p>Pour que le site soit disponible il faut maintenant lancer la commande
<pre>
sudo a2ensite appli
</pre>
(ou <code>appli.chez.moi</code> le cas échéant). Et enfin relancer apache :
<pre>
sudo service apache2 restart
</pre>
et alors on pourra voir sa page d'accueil en visitant la page http://appli.chez.moi avec son navigateur.
</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-46850310760471137332014-09-30T02:41:00.003-07:002014-10-28T08:29:57.199-07:00une stratégie pour git<p>Comme je viens de créer mon projet <a href="https://github.com/psiloi/tiddlybook">TiddlyBook</a> sur github, je me dois d'apprendre les bases de git et de ses bonnes pratiques. Vaste programme !
</p><p>
Je tombe heureusement sur un exposé en anglais qui indique clairement une manière efficace et simple, mais nullement simplifiée, d'utiliser git dans la vraie vie, aussi bien en entreprise qu'en projets personnels. Elle est là : <a href="http://nvie.com/posts/a-successful-git-branching-model">a successfull git branching model</a>.
</p><p>
L'intérêt de ce document, est aussi de donner clairement les commandes à exécuter. Il n'y a qu'un détail qui n'est pas donné, hélas, c'est où exécuter ces commandes dans l'arborescence. Sans doute car cela a paru trop trivial à l'auteur. Je mettrais à jour ce billet quand j'aurai élucidé ce point.
</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-82929802609278166212014-09-29T14:40:00.001-07:002014-10-28T08:30:50.759-07:00création du projet TiddlyBookÇa y est, je viens de créer le projet <a href="https://github.com/psiloi/tiddlybook">tiddlybook</a> sur github.com. J'y ai mis une version utilisable de mon outil pour générer, à partir d'un wiki <a href="http://classic.tiddlywiki.com/">tiddlywiki</a>tiddlywiki, un docbook et de là un ebook ou un pdf. Ça va me servir pour la publication de ma règle Blood and Blades.<br />
<br />
Il va falloir que je trouve un hébergeur et un nom de domaine pour cette dernière.le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-72771803947763871192013-10-29T14:30:00.003-07:002014-10-28T08:31:43.314-07:00ficher ses dépensesLe service en ligne LCL propose plusieurs années en arrière d'anciennes feuille de compte, mais uniquement sous format PDF. C'est assez ballot pour les exploiter avec un tableur ou une base de données.<br />
<br />
Ces pdf ne passent guère qu'avec acrobat reader (acroread sous linux) et pdf_to_text ne peut pas les exploiter. Aussi vais-je ici décrire comment j'ai faitt pour les traduire en fichiers directement importable par LibreOffice (données brutes séaprées par des tabulations, pas d'en-tête de colonne).<br />
<br />
<h4>
obtention des pdf</h4>
Il faut passer par chromium car ça ne marche pas avec firefox<br />
<br />
<h4>
du pdf au jpeg</h4>
Utiliser OCRFeeder. Y importer une à une les pdf de l'année civile à exploiter. Sauver le fichier sous le nom 458-2012 (par exemple). (attention : ne pas faire d'OCR avec OCRFeeder !!!). On obtient le fichier 458-2012.ocrf qui est en fait une archive zip.<br />
<br />
On l'exploite ainsi :<br />
<br />
unzip -j 458-2012.ocrf images/*.jpg<br />
<br />
<h4>
du jpeg au texte brute</h4>
Il faut transformer le jpeg en pbm avec converter qui fait partie d'imagemagick.<br />
<br />
for j in *.jpg;do echo $j;convert $j ${j%.jpg}.pbm; done<br />
<div>
<br /></div>
<div>
et maintenant on fait l'OCR (c'est très rapide avec ocrad) :</div>
<div>
<div>
<br /></div>
<div>
for j in *.pbm;do echo $j ; ocrad <$j >>458_2012.txt ; done</div>
</div>
<div>
<br /></div>
<h4>
obtention du texte final (.unl)</h4>
charger 458_2012.txt dans vim et exécuter la commande deux-points suivant (: omis)<br />
<br />
%s/^\(..\)\.\(..\) \(.*\) \(\d*\),\(\d*\)$/\1\/\2\/2012^I\3^I\4.\5/<br />
<div>
<br /></div>
<div>
(remplacer 2012 par l'année qui convient)</div>
<div>
<br /></div>
<div>
et sauver le fichier.</div>
<div>
<br /></div>
<div>
grep': grep "^..\." 458_2012.txt >458_2012.unl</div>
<div>
<br /></div>
<div>
Ouvrir 458_2012.unl dans LibrOffice avec tab comme séaparateur et pas de délimiteur. Il faut vérifier les colonnes des montants car les crédits sont pour l'instant au même niveau que les débits.</div>
<div>
<br /></div>
<br />le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-87406691085642398212013-04-19T14:15:00.000-07:002014-10-28T08:32:28.748-07:00le blues des hippos-gloutons<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz8rOSZ0QLx899X_dBusdga2krZMEgOHSomFpcthpJlAzRZ4ZaOdNv2Dt7bakLWWp8AWS4CH02nDTf3YwFGvE7PYXiGSAXAfRJP5jxkuOBTnEDi-UMmYFYZVh5_hqhmH1Qo5OhLNw_sNSz/s1600/hippo-aller.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="hippo-glouton en train de sortir sa tête" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz8rOSZ0QLx899X_dBusdga2krZMEgOHSomFpcthpJlAzRZ4ZaOdNv2Dt7bakLWWp8AWS4CH02nDTf3YwFGvE7PYXiGSAXAfRJP5jxkuOBTnEDi-UMmYFYZVh5_hqhmH1Qo5OhLNw_sNSz/s320/hippo-aller.jpeg" title="hippo-glouton en train de sortir sa tête" /></a></div>
J'ai récemment acheté un jeu d'hippo-glouton dans un vide-grenier pour faire plaisir à mes enfants mais malheureusement il s'est avéré ne pas fonctionner une fois de retour à la maison.<br />
<br />
Je n'avais plus qu'à essayer de voir si c'était réparable. La première chose est alors de savoir comment cela est censé marcher. C'est ce que nous allons voir ensemble.<br />
<br />
L'hippo-glouton a un long cou au bout duquel sa grosse tête peut pivoter. Comme elle dépasse en bas, elle est obligée de pivoter en l'air si le cou est mis à plat sur le sol. Inversement, si le cou est en l'air, la tête plonge en bas.<br />
<br />
Pour forcer la position haute ou basse du cou, ce dernier est muni d'un ergot allongé à droite et à gauche. Côté tête, l'ergot a un profil en biais avec la pointe en bas. Côté corps, le profil est inversé.<br />
<br />
À la base de l'hippo-glouton et au niveau du trou du cou, la piste présente elle aussi un ergot de chaque côté. L'ergot du cou va se trouver tantôt en-dessous, tantôt au-dessus, forçant ainsi la position tantôt basse, tantôt haute du cou. Les mouvements de la tête sont ainsi contrôlés.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5tPYGcVwoOeeTncfbb1i6hx94Uxd5ijcFbDWpBr212jGE7QRedSPumyfHtfIycuAHCoN0vEV9C9b-3lftDvPty-cr3Lr55sGmuY1l8wiHI-IiLI33rmzBrcH6MPLR-CiR7GjizCXKh1xP/s1600/hippo-ressort.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="le levier et le ressort de l'hippo-glouton" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5tPYGcVwoOeeTncfbb1i6hx94Uxd5ijcFbDWpBr212jGE7QRedSPumyfHtfIycuAHCoN0vEV9C9b-3lftDvPty-cr3Lr55sGmuY1l8wiHI-IiLI33rmzBrcH6MPLR-CiR7GjizCXKh1xP/s320/hippo-ressort.jpeg" title="le levier et le ressort de l'hippo-glouton" /></a>À l'aller, lorsqu'on appuie sur la gâchette de l'hippo-glouton, le profil en biais conjugué avec la force exercée de haut en bas sur le cou par le levier vont amener l'ergot du cou à passer sous l'ergot de la piste. En terminant d'actionner le mécanisme, la forme en L du levier va pousser le cou hors du corps de l'animal. La tête est donc amenée au loin en position haute, lui permettant d'avaler une bille qui passerait par là.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLylBysax54kB8Mm6TPR4lPJydr_hd7Me_Tugs87sz9UmAg97gv6U2PQ_PzTMcdofWCv7JiCR2b62CSATIlrdemAqHHG6coWue0-CbKMcAUcmJma0RybN55lzjaoej15UVvJq6l9XHW_1a/s1600/hippo-pleine-extension.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="hippo-glouton en pleine extension" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLylBysax54kB8Mm6TPR4lPJydr_hd7Me_Tugs87sz9UmAg97gv6U2PQ_PzTMcdofWCv7JiCR2b62CSATIlrdemAqHHG6coWue0-CbKMcAUcmJma0RybN55lzjaoej15UVvJq6l9XHW_1a/s320/hippo-pleine-extension.jpeg" title="hippo-glouton en pleine extension" /></a></div>
Mais l'ergot du cou n'est pas si long qu'à l'extension maximale du cou, il n'est plus là pour reposer sur l'ergot de la piste. Le cou retombe alors d'un coup sur la piste et entraîne la fermeture brutale de la gueule, emprisonnant ainsi une éventuelle bille.<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkueixjlksye9DQ3mimyXfNXS0VYywVisGEjcTO4Cv7fxn9x7Md9hmTUIPl4lGXVG7Ta7BHSAkAPderoeEeZNWf9-YtXSmcZt-qgAbgkRMs4mJsnFcUD4OyckHSXyIbBZm7RYPiAENNW7u/s1600/hippo-retour.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="position haute lors du retour du cou" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkueixjlksye9DQ3mimyXfNXS0VYywVisGEjcTO4Cv7fxn9x7Md9hmTUIPl4lGXVG7Ta7BHSAkAPderoeEeZNWf9-YtXSmcZt-qgAbgkRMs4mJsnFcUD4OyckHSXyIbBZm7RYPiAENNW7u/s1600/hippo-retour.jpeg" height="219" title="position haute lors du retour du cou" width="320" /></a><br />
<br />
<br />
<br />
<br />
<br />
<span style="text-align: center;">En relâchant le mécanisme, le ressort dans le corps de l'hippo-glouton va ramener le cou à sa position initiale, avec une force légèrement orientée de bas en haut. Couplée à la forme de l'ergot du cou côté corps, cela amène cet ergot à passer cette fois au-dessus de l'ergot de la piste. Le cou se rétracte donc en position basse et la tête en position basse, ce qui a pour effet de forcer une bille prisonnière à tomber dans la rigole située sous le cou. Quand le cou a fini de se rétracter, là encore l'ergot du cou n'est plus assez long et faute d'être porté, le cou retombe et la gueule s'entrouvre. On est de retour à la position initiale.</span><br />
<iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/UEp3pzmV5AE" width="420"></iframe><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5o9RUUSYwGqeYm5Ar882Ttvqokn0_0dbeuhH36VAxFLz0y0ogPm2o1mHBnSKQYeKNa9wB6FcPghAL4yjcJslzr2ndcTtuGjEMXlfquet3lJX1RufGfzLvVTw3gwcHQnK-a1bE-xAZdoOk/s1600/hippo-dessous-avec-hippo.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="sous la piste" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5o9RUUSYwGqeYm5Ar882Ttvqokn0_0dbeuhH36VAxFLz0y0ogPm2o1mHBnSKQYeKNa9wB6FcPghAL4yjcJslzr2ndcTtuGjEMXlfquet3lJX1RufGfzLvVTw3gwcHQnK-a1bE-xAZdoOk/s320/hippo-dessous-avec-hippo.jpeg" title="sous la piste" /></a><br />
<br />
Retournons la piste : chaque animal tient par 4 ergots. On voit aussi le rail chargé de guider le cou, avec là encore deux ergots pour prévenir tout déraillage.<br />
<br />
L'hippo-glouton s'enlève et se remet très facilement.<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ7ZdawP-bxyjTQ21uRQXWDthJ8lpsM0iuiKQSDKKQCaSaeeae9-FxrumQGvjV8fPNrQUJQhknFvAnvPOMjdo0av9TKvptncPKv1gKnPv_X5oasS3SuhWWbjNG0-0AOuoiiNpYV0e3_LBl/s1600/hippo-pivot.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="hippo-glouton de profil" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ7ZdawP-bxyjTQ21uRQXWDthJ8lpsM0iuiKQSDKKQCaSaeeae9-FxrumQGvjV8fPNrQUJQhknFvAnvPOMjdo0av9TKvptncPKv1gKnPv_X5oasS3SuhWWbjNG0-0AOuoiiNpYV0e3_LBl/s320/hippo-pivot.jpeg" title="hippo-glouton de profil" /></a><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEillMy6hhofAzn8Mt1fX2v65q8M3iSaTU7P7q4yyKS8ZtNQOuTk3QD7a5WBvcCq6nGB7PSDt0n5UAGDLrpWAYrlvSwNJWubj9E2O-k1Sajdf9w0i_kiqOzb1q-8AKvh1AIPOcsddtOS0lSF/s1600/hippo-en-creux.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="vue ventrale de l'hippo-glouton" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEillMy6hhofAzn8Mt1fX2v65q8M3iSaTU7P7q4yyKS8ZtNQOuTk3QD7a5WBvcCq6nGB7PSDt0n5UAGDLrpWAYrlvSwNJWubj9E2O-k1Sajdf9w0i_kiqOzb1q-8AKvh1AIPOcsddtOS0lSF/s320/hippo-en-creux.jpeg" height="179" title="vue ventrale de l'hippo-glouton" width="320" /></a><br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn0IOxj1FyFQIu0gr8ozDFyhw4eZt4CO66JCt3y0A8lQb_O4rUjGZeU5hnp63pZqicmmg7QNcYyxvgn3CievMPG4gDg9IyI0SYVBFTqGFXWRqMYObxIFUX9tHDREHUIpo4CcYKiVyGzlW8/s1600/hippo-demonte.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="le cou et le corps séparés" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn0IOxj1FyFQIu0gr8ozDFyhw4eZt4CO66JCt3y0A8lQb_O4rUjGZeU5hnp63pZqicmmg7QNcYyxvgn3CievMPG4gDg9IyI0SYVBFTqGFXWRqMYObxIFUX9tHDREHUIpo4CcYKiVyGzlW8/s320/hippo-demonte.jpeg" title="le cou et le corps séparés" /></a><br />
<br />
<br />
<br />
<br />
<br />
Sous 3 des 4 hippos-gloutons, la piste n'avait plus aucun ergot, rendant ainsi ces bestioles incapables d'ouvrir la gueule et donc d'attraper la moindre bille !<br />
<br />
Je me suis rapidement rendu à l'idée que c'était irréparable. À la poubelle le jeu cassé ! Il me reste ces images et cette vidéo comme souvenir. J'ai juste conservé les billes…<br />
<br />
(crédit photo et vidéo : ma pomme. licence CC-BY-SA)<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrUqzMHIQVmPOvjIz8Y6F5uoMdlVzJuoVzuyT1JceMbzGU_4woa1JbO4PT_FO2LVq38JBExeMnwQ5E1BO0KEpTQt8ShwcU7mERt-vyC83Br7k_eXZCR5ftPC2xXfzbmN9My1LQjpfBnzbw/s1600/hippo-articulation.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="les deux ergots du cou vus de dessus" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrUqzMHIQVmPOvjIz8Y6F5uoMdlVzJuoVzuyT1JceMbzGU_4woa1JbO4PT_FO2LVq38JBExeMnwQ5E1BO0KEpTQt8ShwcU7mERt-vyC83Br7k_eXZCR5ftPC2xXfzbmN9My1LQjpfBnzbw/s320/hippo-articulation.jpeg" title="les deux ergots du cou vus de dessus" /></a>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-24473020525886476632013-04-17T01:14:00.002-07:002014-10-28T08:33:00.823-07:00non aux DRM dans html5<div class="separator" style="clear: both; text-align: center;">
<a href="http://static.fsf.org/dbd/hollyweb.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://static.fsf.org/dbd/hollyweb.jpeg" height="320" width="293" /></a></div>
<br />
<br />
Je relaie ici le message et la pétition de l'<a href="https://www.eff.org/">EFF</a> contre l'inclusion de <a href="http://fr.wikipedia.org/wiki/Gestion_des_droits_num%C3%A9riques">DRM</a> dans la norme <a href="http://fr.wikipedia.org/wiki/HTML5">html5</a> par le <a href="http://www.w3c.fr/">w3c</a> :<br />
<br />
<a href="http://www.defectivebydesign.org/no-drm-in-html5">http://www.defectivebydesign.org/no-drm-in-html5</a><br />
<br />
Je l'ai signée.<br />
<br />
(crédit photo : campagne EFF contre <a href="https://twitter.com/search?q=%23hollyweb&src=hash">#hollyweb</a>)le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-63045014332586863262013-04-14T13:50:00.001-07:002014-10-28T08:34:18.713-07:002 nouveaux exemples de listes d'armées à Blood and Blades<div class="separator" style="clear: both; text-align: center;">
<a href="http://i572.photobucket.com/albums/ss166/sumer2500/Bronze%20Age/IMG_2012v2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="infanterie sumérienne" border="0" src="http://i572.photobucket.com/albums/ss166/sumer2500/Bronze%20Age/IMG_2012v2.jpg" height="118" title="infanterie sumérienne" width="320" /></a></div>
<br />
<br />
Je vais encore donner deux exemples de listes d'armée à <a href="https://docs.google.com/file/d/0B8pkrUmjVykaQXp6dUZucDFVRlU/edit?usp=sharing">Blood and Blades</a> pour éclaircir le problème des Pk(X) et celui des support de Ps obligatoires.<br />
<br />
<h3>
1.1 Early Sumerian 3000 BC - 2234 BC and c. 2250 BC</h3>
<h4>
only Kish afte5 2500 BC</h4>
C-in-C Reg Bd(F) or in 4-wheeled battle car Reg HCh(I) or straddle-car Reg LCh(I) or on foot Reg Pk(I) or Reg Pk(X) : 1<br />
Household Spearmen Reg Pk(I) or Reg Pk(X) : 9 - 24<br />
Archers levy skirmishers Irr Ps(O) : 0 - 6<br />
Javelinmen levy skirmishers Irr Ps(I) : 2 - 6<br />
Slingers levy skirmishers Irr Ps(O) : 2 - 12<br />
4-wheeled battle car Reg HCh(I) : 2 - 4<br />
Straddle car Reg LCh(I) : 0 - 1<br />
Scout riding equids Irr LH(I) : 0 - 1<br />
Re-arm household spearmen as axemen Reg Bd(F) : 2 - 5<br />
Household and milicia archers Reg Ps(O) : 2 - 3<br />
upgrade household and milicia archers 2 Ps to 1 Reg Bw (I) : any<br />
<br />
Pour les Pk(I), la liste DBM indique que jusqu'à la moitié peuvent être X. Comme à Blood and Blades un socle de Pk vaut deux rangs de Pk DBM, les Pk(X) y réprésentent déjà la combinaison Pk(X) + Pk(I) de DBM. L'upgrade en X peut donc concernes tous les Pk(I).<br />
<h3>
1.45 Neo-Assyrian Empire 745 BC - 681 BC</h3>
<h4>
only from 719 BC to 705 BC</h4>
C-in-C in 4-horse, 3-crew chariot Reg HCh(O) : 1<br />
Chariots - 4-horse, 3-crew Reg HCh(O) : 3 - 7<br />
Elite cavalry Reg Cv(O) : 1<br />
Other cavalry Reg Cv(O) : 2 - 5<br />
Mounted scouts Reg LH(I) : 1<br />
Arab levies Irr Cm(O) or Irr LH(I) : 0 - 2<br />
Kallapani, half Reg mtd Ax(S), half supporting Reg mtd Ps(O) : 2<br />
Footguards Reg Bd(F) or Reg Ax(O) : 0 - 2<br />
Footguard archers (support footguards) Reg Ps(O) : 0 - 1<br />
Infantry of the battle array, half Reg Ax(O), half supporting Reg Ps(O) : 4 - 6<br />
Upgrade above Ax(O) to elite units Reg Ax(S) : 0 - 2<br />
King's man infantry of the battle-array Irr Ax(O), half supporting Reg mtd Ps(O) : 4 - 8<br />
Reserves of the battle array, half Reg Ax(I), half supporting Reg Ps(O), or any/all of either type : *4 - 6<br />
Levied troops of the battle array Irr Hd(O) : **10-25<br />
King's man tribal levy with bow or sling Irr Ps(O) : 2 - 10<br />
King's man tribal levy with javelin and shield Irr Ps(S) : 0 - 2<br />
Elamaya, Elamite regiment Reg Bw(I) : 0 - 2<br />
<br />
(crédit photo : Cyrus, <a href="http://ozwargaming.com/viewtopic.php?f=6&t=4114">in a post</a> in <a href="http://ozwargaming.com/">ozwargaming.com</a>).le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-40786514240230345192013-04-13T13:18:00.000-07:002014-10-28T08:34:43.209-07:00exemples de listes d'armées à Blood and Blades<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivdN3bLFj4uNR93lZ6f-sMVdgJVM9H8sih0TdXyvleMwy01D3-4-And0yQOMgtH_3KIKuiqjWB2SVpMu-zr4nW6EcbaNmdN_t1F5wHRZNqDzkSCMPoRxUu5R97onkipT2LrRtxAeQKxIqC/s1600/bedouin-army.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="armée DBA 1.6 Early Bedouin" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivdN3bLFj4uNR93lZ6f-sMVdgJVM9H8sih0TdXyvleMwy01D3-4-And0yQOMgtH_3KIKuiqjWB2SVpMu-zr4nW6EcbaNmdN_t1F5wHRZNqDzkSCMPoRxUu5R97onkipT2LrRtxAeQKxIqC/s1600/bedouin-army.jpg" height="149" title="armée DBA 1.6 Early Bedouin" width="320" /></a></div>
<br />
<br />
J'ai pensé qu'il serait bon de montrer des listes d'armées DBM après adaptation pour la règle <a href="https://docs.google.com/file/d/0B8pkrUmjVykaQXp6dUZucDFVRlU/edit?usp=sharing">Blood and Blades</a>. Je vais le faire avec deux extraits temporels de 1.6 Early Bedouin et 1.7 Early Lybian, qui sont des exemples de blobs (armées à très gros effectifs). Mais qui surtout illustrent admirablement comment adapter les listes DBM.<br />
<br />
Je rappelle qu'il faut diviser les effectifs par 2 et encore par 2 pour les Bw, Pk, Sp et Wb (qui svalent 2 anciennes plaquettes par socle). Voyez la règle pour les explications et le budget (différent de DBM).<br />
<br />
<h3>
Early Bedouin 3000 BC to 312 BC</h3>
<h4>
<b>only from 1500 BC to 1000 BC</b></h4>
C-in-C Irr Ax(O5 or Irr Wb(F) or Irr Cm(O) : 1<br />
Javeliniers Irr Ax(I) or Irr Ax(O) (half - all) : 20 - 75<br />
Kkirmishers Irr Ps(I) : 2 - 20. upgrade 0-2 to Irr Ps (S)<br />
Slingers Irr Ps (O) : 2 -10<br />
Archers Irr Ps (O) : 2 - 10. upgrade any 2 Ps to 1 Irr Bw(I) : any. upgrade Irr Bw (I) to Irr Bw (O) : any<br />
Retainers Irr Wb (F) : 0-2<br />
<br />
<h3>
Early Lybian 3000 BC to 70 AD</h3>
<h4>
<b>only from 1250 BC to 1209 BC</b></h4>
C-in-C Irr LCh (O) : 1<br />
2-horse chariots Irr LCh (O) : 1 - 3<br />
Bodyguard Irr Wb (F) : 0-1<br />
Javelinmen Irr Ps (I) or Irr Ax (I) : 54 - 210<br />
Archers Irr Ps (O) : 0 - 10<br />
Replace Javelinmen with swordmen Irr Wb (F) : 0 - 1/3 (2 javelinmen for 1 swordmen)<br />
Replace Javelinmen with Archers Irr Ps (O) : 0 - 1/3. upgrade 2 of these Ps as 1 Irr Bw (I) : any<br />
Upgrade Irr Bw (I) with swords to Irr Bw (O) : 0 - 1/3<br />
<br />
Voilà ! Ce n'est pas très compliqué mais ça demande un peu d'attention, notamment pour les upgrades de Ps ou d'Ax vers Bw ou Wb.<br />
<br />
(crédit photo :<a href="http://ferrency.blogspot.fr/2010/05/dba-army-i6c-early-bedouins.html"> armée DBA 1.6 Early Bedouin d'Alan Ferrency</a>)le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-26961517085361361332013-04-13T10:05:00.001-07:002014-10-28T09:22:21.145-07:00sixième partie Hott à Sartrouville 2013<p>Ce billet a été <a href="http://tontongurine.blogspot.fr/2014/10/sixieme-partie-hott-sartrouville-2013.html">transféré ici</a> sur mon blog figurinistique <a href="http://tontongurine.blogspot.fr">tontongurine</a>.</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-78345443691317383602013-04-13T08:38:00.002-07:002014-10-28T09:21:40.479-07:00cinquième partie Hott à Sartrouville 2013<p>Ce billet a été <a href="http://tontongurine.blogspot.fr/2014/10/cinquieme-partie-hott-sartrouville-2013.html">transféré ici</a> sur mon blog figurinistique <a href="http://tontongurine.blogspot.fr">tontongurine</a>.</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0tag:blogger.com,1999:blog-3264392475730993744.post-80878592265140327762013-04-13T08:03:00.001-07:002014-10-28T09:21:13.661-07:00quatrième partie Hott à Sartrouville 2013<p>Ce billet a été <a href="http://tontongurine.blogspot.fr/2014/10/quatrieme-partie-hott-sartrouville-2013.html">transféré ici</a> sur mon blog figurinistique <a href="http://tontongurine.blogspot.fr">tontongurine</a>.</p>le bonnet rougehttp://www.blogger.com/profile/14623791168854948706noreply@blogger.com0