Un peu de tout, un peu de rien...http://blog.lesite.us2020-12-26T16:08:02.925768VMWare fusion et la gestion du plein écran / fullscreen2020-08-24T12:00:00Valentin Brosseautag:http://blog.lesite.us,2020-08-24:vmware-fusion-et-la-gestion-du-plein-ecran-fullscreen.html<p>Un petit article rapide après des années de silence pour vous donner une astuce bien pratique. Cela fait maintenant quelques années, que j'utilise VMWare Fusion sous Mac pour gérer mes machines virtuelles, il fonctionne bien pas de problème.</p>
<p>Par contre, j'ai un souci le Dock ! En fullscreen celui-ci est « toujours affiché », enfin il est visible au survol. C'est pénible… Et très contreproductif surtout quand on essai de travailler dans la VM…</p>
<p>Je viens de découvrir que ça se change facilement via la commande suivante :</p>
<pre class="code bash literal-block">
$ sudo lsappinfo setinfo -app com.vmware.fusion <span class="nv">UIPresentationMode</span><span class="o">=</span>kLSUIPresentationModeContentHiddenValue
</pre>
<p>Attention par contre, c'est temporaire le comportement revient « par défaut » quand vous quittez le mode plein écran…</p>Tester simplement MacOS Mojave grace à APFS2018-06-22T22:02:00Valentin Brosseautag:http://blog.lesite.us,2018-06-22:tester-simplement-macos-mojave-grace-a-apfs.html<p>Comme beaucoup vous voulez tester la nouvelle version de MacOs... Mojave (ne me demandez pas comment on le prononce en bon Français je ne sais pas...) ! Précédemment je vous aurai dit de passer votre chemin ! Les bêtas de MacOs sont souvent très instables (les OS finaux parfois également... Mais ça c'est une autre histoire !).</p>
<p>Bref, précédemment installer une version bêta de MacOs nécessitait soit :</p>
<ul class="simple">
<li>D'updater votre système actuel.</li>
<li>Installer l'OS sur une seconde partition.</li>
</ul>
<p>Maintenant un troisième choix est possible « un volume APFS ». Un volume APFS c'est comme une partition, mais sans avoir à réserver de l'espace ou partitionner votre disque.</p>
<p>En termes d'utilisation c'est plutôt simple :</p>
<ul class="simple">
<li>Ouvrez « Utilitaire de Disque » dans Utilitaires.</li>
<li>Sélectionnez "Ajouter un volume APFS" depuis le menu Édition.</li>
<li>Nommez-le (par exemple Mojave).</li>
</ul>
<p>Et maintenant pour l'installation de Mojave vous pouvez sélectionner votre volume « Mojave » précédemment créé.</p>
<p>Bon test !</p>Configurer simplement Cordova sous MacOS2018-03-07T21:47:00Valentin Brosseautag:http://blog.lesite.us,2018-03-07:configurer-simplement-cordova-sous-macos.html<p>Salut ! Changement de boulôt changement d’ordinateur, donc reconfiguration des logiciels. Pour Cordova c’est plutôt « simple » il faut :</p>
<ul class="simple">
<li>NodeJS</li>
<li>Le SDK Android</li>
<li>Le JDK (Java Dev Kit)</li>
<li>Gradle</li>
</ul>
<p>Pour NodeJS et Gradle pas de choix le plus simple c’est de passer par Brew.sh :</p>
<pre class="code bash literal-block">
brew install nodejs
brew install gradle --ignore-dependencies
npm install -g cordova
</pre>
<p>Pourquoi --ignore-dependencies ? C’est simplement que l’on va utiliser le JDK fourni dans le SDK d’Android 😁.</p>
<p>Maintenant que la base est prête il vous suffit d’installer <a class="reference external" href="https://developer.android.com/studio/index.html">le SDK d’Android (celui avec Android Studio)</a>. Une fois installé (et lancé une première fois), éditer votre .zshrc (ou .bashrc) pour ajouter :</p>
<pre class="code bash literal-block">
<span class="nb">export</span> <span class="nv">ANDROID_HOME</span><span class="o">=</span><span class="nv">$HOME</span>/Library/Android/sdk/
<span class="nb">export</span> <span class="nv">JAVA_HOME</span><span class="o">=</span><span class="s2">"/Applications/Android Studio.app/Contents/jre/JDK/Contents/Home/"</span>
<span class="nb">export</span> <span class="nv">PATH</span><span class="o">=</span><span class="si">${</span><span class="nv">PATH</span><span class="si">}</span>:<span class="si">${</span><span class="nv">ANDROID_HOME</span><span class="si">}</span>/platform-tools:<span class="si">${</span><span class="nv">ANDROID_HOME</span><span class="si">}</span>/tools
</pre>
<p>Et voilà, vous avez maintenant dans votre terminal les outils (et le sdk) Android. Vous pouvez utiliser Cordova comme habituellement.</p>
<p>Bon dev à tous</p>Synology, veilles de disques et Gitea2018-02-09T20:00:00Valentin Brosseautag:http://blog.lesite.us,2018-02-09:synology-veilles-de-disques-et-gitea.html<p>Cet article est le dernier d’une série de 3 articles détaillant <a class="reference external" href="installer-gitea-ou-gogs-sur-un-nas-synology.html">l’installation</a> / <a class="reference external" href="activer-le-serveur-ssh-integre-a-gitea.html">la configuration</a> / <a class="reference external" href="synology-veilles-de-disques-et-gitea.html">l’optimisation de Gitea sur un Nas Synology</a>.</p>
<p>Les Nas Synology sont relativement très silencieux quand les disques sont arrêtés, j'aime l'idée d'avoir un Nas qui fonctionne en permanence, mais je ne veux pas que les disques fonctionnent en permanence (la conso, le bruit etc). Sur les systèmes Synology il est parfois difficile de garder le système en veille, c'est un vrai problème… chaque paquet en plus peut provoquer des soucis de mise en veille.</p>
<p>La configuration par défaut de Gitea empêche la mise en veille, j'ai cherché un moment pourquoi… Et la réponse est relativement simple c'est les logs ! Le démon Gitea ouvre les fichiers sur disques et les gardes ouverts en permanence ce qui bloque la mise en veille des disques. Pour remédier à cela il faut éditer le « custom/conf/app.ini » pour ajouter <strong>dans</strong> la section [log] la configuration suivante :</p>
<pre class="code ini literal-block">
<span class="k">[log]</span>
<span class="na">MODE</span> <span class="o">=</span> <span class="s">console</span>
<span class="na">LEVEL</span> <span class="o">=</span> <span class="s">Error</span>
</pre>
<p>Redémarrer Gitea, vos disques devraient maintenant passer en veille, attention tout de même après cette modification vous n’avez plus de logs sur disque.</p>
<p>Cet article fait parti d’une série de trois articles :</p>
<ul class="simple">
<li><a class="reference external" href="installer-gitea-ou-gogs-sur-un-nas-synology.html">Héberger Gitea sur un Nas Synology</a></li>
<li><a class="reference external" href="activer-le-serveur-ssh-integre-a-gitea.html">Activer le serveur SSH Intégré</a></li>
<li><a class="reference external" href="synology-veilles-de-disques-et-gitea.html">Retrouver la mise en veille des disques avec Gitea en service</a></li>
</ul>Activer le serveur SSH intégré à Gitea2018-02-08T20:00:00Valentin Brosseautag:http://blog.lesite.us,2018-02-08:activer-le-serveur-ssh-integre-a-gitea.html<p>Le gros avantage des solutions tout intégrées telles que Gitea (Gogs, ou GitLab, …) c'est la simplicité de mise en place. Un outil à lancer et hop ! C'est parti.</p>
<p>Dans cet article, je vais détailler l'activation du serveur SSH intégré à Gitea, une fois actifs c'est Gitea qui s'occupera de toutes les problématiques liées aux SSH pour pousser votre code sur votre serveur (échanges de clefs, port, etc).</p>
<p>L'ensemble de la configuration est dans le fichier « custom/conf/app.ini » qui est dans le même dossier que le binaire. De base il contient quelques éléments de la configuration, mais pas l'ensemble (c'est d'ailleurs bien dommage…). Il suffit d'ajouter dans la section [server] la configuration suivante :</p>
<pre class="code ini literal-block">
<span class="k">[server]</span>
<span class="k">[...]</span>
<span class="na">START_SSH_SERVER</span> <span class="o">=</span> <span class="s">true</span>
<span class="na">SSH_LISTEN_PORT</span> <span class="o">=</span> <span class="s">2222</span>
<span class="na">BUILTIN_SSH_SERVER_USER</span> <span class="o">=</span> <span class="s">"git"</span>
<span class="k">[...]</span>
</pre>
<p>Redémarrer Gitea, normalement votre serveur écoute maintenant les nouvelles connexions sur le port 2222. Pour l'utiliser il faut bien évidemment faire un échange de clefs SSH dans la configuration de votre compte sur l'interface Web de Gitea.</p>
<p>Cet article fait parti d’une série de trois articles :</p>
<ul class="simple">
<li><a class="reference external" href="installer-gitea-ou-gogs-sur-un-nas-synology.html">Héberger Gitea sur un Nas Synology</a></li>
<li><a class="reference external" href="activer-le-serveur-ssh-integre-a-gitea.html">Activer le serveur SSH Intégré</a></li>
<li><a class="reference external" href="synology-veilles-de-disques-et-gitea.html">Retrouver la mise en veille des disques avec Gitea en service</a></li>
</ul>Installer Gitea (ou Gogs) sur un NAS Synology2018-02-03T20:00:00Valentin Brosseautag:http://blog.lesite.us,2018-02-03:installer-gitea-ou-gogs-sur-un-nas-synology.html<p>On est tous d'accord le versioning c'est hyper important (oui même pour un projet perso). Le plus simple c’est d’utiliser les services dans le cloud type GitHub ou GitLab (ou autre d'ailleurs) mais si on a la chance d'avoir un « serveur » à la maison on peut faire mieux « héberger les sources à domiciles ».</p>
<p>Pour faire ça plusieurs solutions existent, installer un simple service SSH et faire du Git dessus, installer la machine de guerre GitLab à la maison, ou se tourner vers quelques choses de minimaliste j'ai nommé Gitea ( fork de Gogs). C'est donc un équivalent de GitHub (ou GitLab), mais beaucoup plus simple et surtout très léger au niveau des ressources système.</p>
<p>Ici on va s'intéresser à l'installation de Gogs ou Gitea sur un NAS Synology (DSM 6.2). Le système Synology embarque un système de paquet, mais pour une raison que j'ignore impossible de faire fonctionner correctement le paquet Gitea sur mon DS-216+II le paquet s'installe, mais ne se lance pas correctement… J'ai donc pris un peu de temps pour créer et configurer moi-même le service et au final ce n'est pas vraiment compliqué et pour ceux qui ont peurs de la ligne de commande on peut faire sans.</p>
<div class="section" id="le-binaire">
<h1>1. Le binaire</h1>
<p>La première étape c’est la récupération du binaire de Gitea qui correspond au processeur de votre NAS, par exemple :</p>
<ul class="simple">
<li>DS218+II : linux-amd64</li>
<li>DS217J : linux-arm-7</li>
</ul>
<p>Le binaires sont tous disponibles sur le <a class="reference external" href="https://github.com/go-gitea/gitea/releases">GitHub de Gitea</a>, télécharger celui qui correspond à votre processeur et garder le sur votre ordinateur.</p>
</div>
<div class="section" id="preparation-du-nas">
<h1>2. Préparation du NAS</h1>
<p>Sur le NAS deux options :</p>
<ul class="simple">
<li>Utiliser un compte existant.</li>
<li>Créer un nouveau compte.</li>
</ul>
<p>Vous avez le choix, dans tous les cas je vous conseille juste de ne pas lancer Gitea avec un compte administrateur… Juste au cas ou ! Moi dans mon cas j'ai pris l'exemple d'un compte nommé «gitea »</p>
</div>
<div class="section" id="installation-et-configuration">
<h1>3. « Installation » et configuration</h1>
<p>Pour installer Gitea il faut juste lancer le binaire avec le paramètre « Web », c’est donc vraiment très simple ! Le soucis par contre c’est que le programme garde la main (étrange je trouve pour ce genre de service…). Il faut donc un petit script qui se chargera de lancer Gitea et de le mettre en arrière plan.</p>
<p>J’ai donc fait un petit script qui va permettre de lancer (et d’arrêter Gitea), le script est <a class="reference external" href="https://raw.githubusercontent.com/c4software/dotfiles/master/gitea/startup_gitea.sh">téléchargeable ici</a> un fois téléchargé copiez le dans le même dossier que Gitea sur votre NAS.</p>
<p>Vous devez donc avoir quelques choses comme :</p>
<img alt="https://raw.githubusercontent.com/c4software/dotfiles/master/gitea/images/structure.png" loading="lazy" src="https://raw.githubusercontent.com/c4software/dotfiles/master/gitea/images/structure.png"/>
<p>Maintenant que tout est sur le NAS, nous allons éditer la configuration du script. Il faut donc remplacer les deux variables en haut du fichier par les valeurs correspondants à votre configuration. Dans mon cas :</p>
<pre class="code shell literal-block">
<span class="nv">GITEA_ROOT</span><span class="o">=</span><span class="s2">"/var/services/homes/gitea/gitea/"</span>
<span class="nv">GITEA_USER</span><span class="o">=</span><span class="s2">"gitea"</span>
</pre>
<p>️️⚠️ Vous pouvez avoir le chemin dans les propriétés de l’un des deux fichiers.</p>
<p>Voilà! Le script est maintenant prêt à être utilisé.</p>
</div>
<div class="section" id="demarrage-et-arret-automatique">
<h1>4. Démarrage et Arrêt automatique</h1>
<p>Maintenant que tout est prêt, nous allons mettre en place les deux « tâches » dans le « Planificateur de tâches » du NAS :</p>
<p>⚠️ Le script de démarrage doit être lancé en root.</p>
<img alt="https://raw.githubusercontent.com/c4software/dotfiles/master/gitea/images/creation.png" loading="lazy" src="https://raw.githubusercontent.com/c4software/dotfiles/master/gitea/images/creation.png"/>
<img alt="https://raw.githubusercontent.com/c4software/dotfiles/master/gitea/images/creation2.png" loading="lazy" src="https://raw.githubusercontent.com/c4software/dotfiles/master/gitea/images/creation2.png"/>
<img alt="https://raw.githubusercontent.com/c4software/dotfiles/master/gitea/images/creation3.png" loading="lazy" src="https://raw.githubusercontent.com/c4software/dotfiles/master/gitea/images/creation3.png"/>
</div>
<div class="section" id="demarrer-manuellement-le-service">
<h1>5. Démarrer manuellement le service</h1>
<p>Maintenant que tout est prêt nous pouvons lancer le service, une fois lancé vous allez pouvoir configurer votre instance Gitea en allant sur :</p>
<p><a class="reference external" href="http://ip.de.votre.nas:3000">http://ip.de.votre.nas:3000</a></p>
<p>À partir de maintenant vous êtes dans Gitea, personnellement je l’ai configuré en mode SQLite pour tester le service c’est bien.</p>
</div>
<div class="section" id="la-suite">
<h1>6. La suite…</h1>
<p>Voilà votre service Git est fonctionnel. Cependant, de base vous n’allez pas pouvoir cloner en SSH facilement. Dans un prochain article je vais détailler l’activation du serveur SSH intégré.</p>
<p>Cet article fait parti d’une série de trois articles :</p>
<ul class="simple">
<li><a class="reference external" href="installer-gitea-ou-gogs-sur-un-nas-synology.html">Héberger Gitea sur un Nas Synology</a></li>
<li><a class="reference external" href="activer-le-serveur-ssh-integre-a-gitea.html">Activer le serveur SSH Intégré</a></li>
<li><a class="reference external" href="synology-veilles-de-disques-et-gitea.html">Retrouver la mise en veille des disques avec Gitea en service</a></li>
</ul>
</div>Linux et les dispositions de clavier personnalisées2018-01-28T23:00:00Valentin Brosseautag:http://blog.lesite.us,2018-01-28:linux-et-les-dispositions-de-clavier-personnalisees.html<p>Salut,</p>
<p>Sous MacOs il est très simple de personnaliser une disposition clavier, il suffit en gros de déplacer un XML au bon endroit dans le système (root ou pas d'ailleurs) et votre disposition est disponible… Sous Linux c'est une autre pair de manche… Par défaut toutes les dispositions sont dans des fichiers « xkb » qui sont au niveau du système, donc ce sont des fichiers qui sont écrasés à chaque mise a jours.
Il n'est donc pas forcément simple de maintenir une disposition personnalisées dans un système qui se met a jours régulièrement (il existe des techniques à base de la commande « chatr », mais je ne suis pas fan de cette technique). Il est possible par contre de charger une disposition depuis un dossier (votre $HOME par exemple).</p>
<p>Sur ma distribution j'utilise Gnome-Shell, j'ai donc fait une « petite » extension qui se permet de charger une disposition personnalisées provenant du $HOME et surtout l'extension permet de restaurer la disposition après le déverrouillage du système (sinon de base votre disposition système est remise en place).</p>
<img alt="https://github.com/c4software/xkbswitcher/raw/master/screen.png" loading="lazy" src="https://github.com/c4software/xkbswitcher/raw/master/screen.png"/>
<p>Pour l'instant je ne l'ai pas publiée, elle est uniquement disponible sur mon compte GitHub. Je m'en sers maintenant depuis quelques temps sans soucis. Si vous aussi vous la voulez c'est <a class="reference external" href="https://github.com/c4software/xkbswitcher/">à télécharger ici</a>.</p>
<p>Pour déclarer une disposition personnalisées il faut juste :</p>
<pre class="code shell literal-block">
$ mkdir -p ~/.xkb/symbols/
$ cp bepoDev.xkb ~/.xkb/symbols/
</pre>
<p>À partir de maintenant vous allez pouvoir l’utiliser dans votre système. Avec l’extension ou directement avec la commande :</p>
<pre class="code shell literal-block">
$ setxkbmap -I ~/.xkb bepoDev -print <span class="p">|</span> xkbcomp -I<span class="nv">$HOME</span>/.xkb - <span class="nv">$DISPLAY</span>
</pre>
<p>Bonne bidouille !</p>SSL : Gitlab + LetsEncrypt (acme.sh) = <32018-01-26T23:00:00Valentin Brosseautag:http://blog.lesite.us,2018-01-26:ssl-gitlab-letsencrypt-acmesh-lt3.html<p>[Edit] Le support de LetsEncrypt est maintenant natif. <a class="reference external" href="https://about.gitlab.com/2018/02/22/gitlab-10-5-released/#instant-ssl-with-lets-encrypt-for-gitlab">Consulter l’article</a></p>
<p>GitLab c'est bien, mais Gitlab en SSL c'est mieux ! Un petit article rapide pour vous montrer la simplicité de mise en place des certificats SSL gratuit fourni par LetsEncrypt.</p>
<div class="section" id="la-premiere-etape-acme-sh">
<h1>La première étape acme.sh</h1>
<p>Le plus simple sous Linux pour générer des certificats LetsEncrypt c'est le client en bash Acme.sh :</p>
<pre class="code shell literal-block">
curl https://get.acme.sh <span class="p">|</span> sh
</pre>
<p>Ou via le sources :</p>
<pre class="code shell literal-block">
git clone https://github.com/Neilpang/acme.sh.git
<span class="nb">cd</span> ./acme.sh
./acme.sh --install
</pre>
<p>😎 Pas besoin d’être root.</p>
</div>
<div class="section" id="configurer-gitlab">
<h1>Configurer GitLab</h1>
<p>Maintenant que nous avons notre client « Acme LetsEncrypt », il faut configurer GitLab pour qu'il accepte la connexion entrante venant de LetsEncrypt et qui va valider que vous êtes le propriétaire du nom de domaine. Pour ça il va falloir modifier la configuration « par défaut » de GitLab.</p>
<p>Il faut éditer le fichier /etc/gitlab/gitlab.rb pour ajouter la configuration suivante :</p>
<pre class="code ruby literal-block">
<span class="n">nginx</span><span class="o">[</span><span class="s1">'custom_gitlab_server_config'</span><span class="o">]</span> <span class="o">=</span> <span class="s2">"location ^~ /.well-known { root /var/www/letsencrypt; }"</span>
<span class="n">mattermost_nginx</span><span class="o">[</span><span class="s1">'custom_gitlab_mattermost_server_config'</span><span class="o">]</span> <span class="o">=</span> <span class="s2">"location ^~ /.well-known { root /var/www/letsencrypt; }"</span>
</pre>
<p>⚠️ Dans mon cas je vais valider également un certificat pour le Mattermost inclus dans GitLab.</p>
<p>Maintenant que la configuration est modifiée il faut la faire prendre en compte par GitLab :</p>
<pre class="code shell literal-block">
$ gitlab-ctl reconfigure
</pre>
<p>On va également créer un dossier qui va recevoir le fichier .key et .crt.</p>
<pre class="code shell literal-block">
$ mkdir -p /etc/gitlab/ssl/
</pre>
</div>
<div class="section" id="demander-un-certificat">
<h1>Demander un certificat</h1>
<p>Pas grand-chose à faire, il suffit juste de taper la bonne commande :</p>
<pre class="code shell literal-block">
$ acme.sh --issue -d gitlab.votre_domaine.fr -d mattermost.votre_domaine.fr -w /var/www/letsencrypt --keypath /etc/gitlab/ssl/cert.key --certpath /etc/gitlab/ssl/cert.crt --fullchain-file /etc/gitlab/ssl/fullchain.crt
</pre>
<p>Et voilà, normalement les fichiers sont disponibles dans le dossier /etc/gitlab/ssl/</p>
</div>
<div class="section" id="activer-le-ssl-dans-gitlab">
<h1>Activer le SSL dans GitLab</h1>
<p>Maintenant que le certificat a été généré il faut activer réellement le SSL dans GitLab, pour ça retournons dans le fichier /etc/gitlab/gitlab.rb et ajouter la configuration suivante :</p>
<pre class="code ruby literal-block">
<span class="c1"># Permet d’indiquer l’emplacement des certificats SSL</span>
<span class="n">mattermost_nginx</span><span class="o">[</span><span class="s1">'ssl_certificate'</span><span class="o">]</span> <span class="o">=</span> <span class="s2">"/etc/gitlab/ssl/fullchain.crt"</span>
<span class="n">mattermost_nginx</span><span class="o">[</span><span class="s1">'ssl_certificate_key'</span><span class="o">]</span> <span class="o">=</span> <span class="s2">"/etc/gitlab/ssl/cert.key"</span>
<span class="n">nginx</span><span class="o">[</span><span class="s1">'ssl_certificate'</span><span class="o">]</span> <span class="o">=</span> <span class="s2">"/etc/gitlab/ssl/fullchain.crt"</span>
<span class="n">nginx</span><span class="o">[</span><span class="s1">'ssl_certificate_key'</span><span class="o">]</span> <span class="o">=</span> <span class="s2">"/etc/gitlab/ssl/cert.key"</span>
<span class="c1"># Permet la redirection du HTTP vers le HTTPS</span>
<span class="n">nginx</span><span class="o">[</span><span class="s1">'redirect_http_to_https'</span><span class="o">]</span> <span class="o">=</span> <span class="kp">true</span>
<span class="n">mattermost_nginx</span><span class="o">[</span><span class="s1">'redirect_http_to_https'</span><span class="o">]</span> <span class="o">=</span> <span class="kp">true</span>
</pre>
<p>Changer la configuration de vos URL dans le /etc/gitlab/gitlab.rb pour ajouter un <strong>s</strong> après http :</p>
<ul class="simple">
<li><a class="reference external" href="https://mattermost.votre_domaine.fr/">https://mattermost.votre_domaine.fr/</a></li>
<li><a class="reference external" href="https://gitlab.votre_domaine.fr/">https://gitlab.votre_domaine.fr/</a></li>
</ul>
<p>Finalisont en appliquant la configuration :</p>
<pre class="code shell literal-block">
$ gitlab-ctl reconfigure
</pre>
<p>Et voilà votre GitLab est maintenant configuré en SSL.</p>
</div>
<div class="section" id="renouvellement">
<h1>Renouvellement</h1>
<p>Les certificats LetsEncrypt ont une durée de validité de 90 jours, mais ils peuvent être renouvelés à l'infinies, avec acme.sh pas de soucis un cron a automatiquement été mis en place lors de l'installation du client acme. Normalement tous les 60 jours vos certificats seront automatiquement renouvelés. Dans mon cas :</p>
<pre class="code shell literal-block">
$ crontab -l
<span class="m">52</span> <span class="m">0</span> * * * <span class="s2">"/root/.acme.sh"</span>/acme.sh --cron --home <span class="s2">"/root/.acme.sh"</span> > /dev/null
</pre>
</div>SSH Agent Forwarding : Garder votre identité de serveurs en serveurs2018-01-25T21:00:00Valentin Brosseautag:http://blog.lesite.us,2018-01-25:ssh-agent-forwarding-garder-votre-identite-de-serveurs-en-serveurs.html<p>Une note rapide pour vous partager une « découverte » récente, jusqu'à pas si longtemps j'avais le réflexe de générer une clef depuis le serveur de « rebond ». Je ne m'étais jamais posé la question, mais avec l'usage de plus en plus important que je fais avec ma Yubikey j'ai un peu étudié la question et il est possible de « propager » son identité grâce au SSH Agent Forwarding.</p>
<p>Pour l’activer c’est simple, il suffit d’ajouter dans votre fichie ~/.ssh/config la directive suivante :</p>
<pre class="code shell literal-block">
vim ~/.ssh/config
ForwardAgent yes
</pre>
<p>Et voilà ! Vous pouvez vérifier que ça fonctionne en tappant ssh-add -L sur le serveur distant vous devriez voir votre clef publique.</p>Sauver une carte SD! Utiliser votre RaspberryPi en lecture seul (ReadOnly)2018-01-23T22:00:00Valentin Brosseautag:http://blog.lesite.us,2018-01-23:sauver-une-carte-sd-utiliser-votre-raspberrypi-en-lecture-seul-readonly.html<p>Avec mes Pi j'ai un soucis récurrent c'est l'usure des cartes SD… J'ai tenté pleins de choses (réduire les logs, changer le swap, etc…) mais sans jamais de grand succès au final la carte SD se corrompt et rebelotte…</p>
<p>J'ai donc décidé de changer carrément de méthode, à partir de maintenant pour les projets ou je n'ai pas besoin d'écrire sur la carte SD, et bien je monte carrément le système en lecture seule. Pour ça il suffit de changer un peu le « /etc/fstab » :</p>
<pre class="code linux-config literal-block">
proc /proc proc defaults <span class="mi">0</span> <span class="mi">0</span>
/dev/mmcblk0p1 /boot vfat defaults <span class="mi">0</span> <span class="mi">2</span>
/dev/mmcblk0p2 / ext4 ro <span class="mi">0</span> <span class="mi">1</span>
<span class="c1"># Valeur par defaut : /dev/mmcblk0p2 / ext4 defaults,noatime 0 1
</span>
tmpfs /tmp tmpfs defaults,noatime,mode=1777 <span class="mi">0</span> <span class="mi">0</span>
tmpfs /var/log tmpfs defaults,noatime,mode=0755 <span class="mi">0</span> <span class="mi">0</span>
tmpfs /var/lib/systemd tmpfs defaults,noatime,mode=0755 <span class="mi">0</span> <span class="mi">0</span>
</pre>
<p>À partir de maintenant si vous redémarrez le Pi votre système sera en lecture seule.</p>
<p>Donc c'est un bon début… Mais parfois c'est pratique de pouvoir modifier son système (mise à jour par exemple), j'ai donc trouvé un petit script qui permet de passer de lecture seule à lecture/écriture hyper simplement :</p>
<pre class="code shell literal-block">
<span class="ch">#!/bin/bash
</span>
<span class="k">case</span> <span class="s2">"</span><span class="si">${</span><span class="nv">1</span><span class="si">}</span><span class="s2">"</span> in
rw<span class="o">)</span>
sudo mount -o remount,rw /
<span class="nb">echo</span> <span class="s2">"Filesystem mounted in READ-WRITE mode"</span>
<span class="p">;;</span>
ro<span class="o">)</span>
sudo mount -o remount,ro /
<span class="nb">echo</span> <span class="s2">"Filesystem mounted in READ-ONLY mode"</span>
<span class="p">;;</span>
*<span class="o">)</span>
<span class="k">if</span> <span class="o">[</span> -n <span class="s2">"</span><span class="k">$(</span>mount <span class="p">|</span> grep mmcblk0p2 <span class="p">|</span> grep -o <span class="s1">'rw'</span><span class="k">)</span><span class="s2">"</span> <span class="o">]</span>
<span class="k">then</span>
<span class="nb">echo</span> <span class="s2">"Filesystem is mounted in READ-WRITE mode"</span>
<span class="k">else</span>
<span class="nb">echo</span> <span class="s2">"Filesystem is mounted in READ-ONLY mode"</span>
<span class="k">fi</span>
<span class="nb">echo</span> <span class="s2">"Usage </span><span class="si">${</span><span class="nv">0</span><span class="si">}</span><span class="s2"> [rw|ro]"</span>
<span class="p">;;</span>
<span class="k">esac</span>
</pre>
<p>Pour l’utiliser c’est simple :</p>
<ul class="simple">
<li>Repasser en lecture/écriture : ./mountfs.sh rw</li>
<li>Repasser en lecture seule : ./mountfs.sh ro</li>
</ul>
<p>En espérant que ça aide certains d’entre vous …</p>Installer Archlinux sur un Dell XPS 13 2017 (Remplacer Ubuntu)2018-01-21T21:00:00Valentin Brosseautag:http://blog.lesite.us,2018-01-21:installer-archlinux-sur-un-dell-xps-13-2017-remplacer-ubuntu.html<p>J'ai récemment eu une nouvelle machine (changement professionnel) cette machine est un <a class="reference external" href="http://www.dell.com/en-us/shop/dell-laptops/xps-13-laptop/spd/xps-13-9360-laptop">DELL XPS 13 9360 (de 2017) fourni avec Ubuntu</a> . C'est vraiment une superbe machine un 13 pouces dans un gabarit d'un 11… Bref génial !</p>
<p>La machine est livrée avec Ubuntu 16.04 LTS, ça fonctionne… mais je ne suis vraiment pas fan d'Ubuntu (exemple Out Of The Box unity plante régulièrement sans raison…) ! Donc migration sous Archlinux. Rien de bien particuliés pour l'installation, c'est une machine avec de l'UEFI j'ai donc décidé de faire un petit article récap pour lister les différentes étapes clef de l'installation :</p>
<ul class="simple">
<li><a class="reference external" href="https://www.archlinux.org/download/">Téléchargement de l’ISO.</a></li>
<li>Dans l’UEFI de la machine désactiver le secureboot (F12 au démarrage).</li>
<li>Choisir la clef USB sur laquelle l’ISO a été « copié ».</li>
</ul>
<p>⚠️ Archlinux n’est pas un OS pour débutant, si vous avez un doute… Passer votre tour.</p>
<p>Je vous conseille une fois booté de lancer le service SSH pour faire l'installation depuis une autre machine (ça permet de copier les commandes) :</p>
<pre class="code shell literal-block">
<span class="c1"># Clavier
</span>loadkeys fr-bepo
<span class="c1"># Pour autoriser la connexion le compte Root doit avoir un mot de passe.
</span>$ passwd
$ systemctl start sshd.service
<span class="c1"># Connexion au Wifi
</span>$ wifi-menu
<span class="c1"># Avoir votre IP
</span>$ ip addr
</pre>
<p>Pour la suite vous pouvez continuer depuis une autre machine</p>
<pre class="code shell literal-block">
$ ssh root@ip.de.votre.machine
</pre>
<p>Pour éviter de perdre la partition de recovery fourni par DELL j’ai décidé de ne pas toucher au partitionnement « de base », je part du principe que ça sera le cas vous aussi.</p>
<div class="section" id="la-base">
<h1>La base</h1>
<pre class="code shell literal-block">
<span class="c1"># Clavier
</span>loadkeys fr-bepo
<span class="c1"># Reglage de l’heure
</span>timedatectl set-ntp <span class="nb">true</span>
<span class="c1"># Éffacement des partitions
# Boot
</span>$ mkfs.fat -F32 /dev/nvme0n1p1
<span class="c1"># Système
</span>$ mkfs.ext4 /dev/nvme0n1p3
<span class="c1"># Montage des partitions
</span>$ mount /dev/nvme0n1p3 /mnt
$ mount /dev/nvme0n1p1 /mnt/boot
<span class="c1"># Installation du système de base et d’autres paquets nécéssaire en CLI
</span>$ pacstrap /mnt base base-devel dialog zsh git sudo vim dialog wpa_supplicant iw
<span class="c1"># Création du fstab
</span>$ genfstab -L /mnt >> /mnt/etc/fstab
<span class="c1"># Changer la partition ext4 pour passer de relatime to noatime (Ça réduit l’usure du SSD)
</span>$ vim /mint/etc/fstab
<span class="c1"># Activation du chroot
</span>$ arch-chroot /mnt
<span class="c1"># Reglage du temps
</span>$ ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime
$ hwclock --systohc
<span class="c1"># Réglage des locales
</span>$ vi /etc/locale.gen <span class="c1"># Décommenter par exemple "en_US.UTF-8", "fr_FR.UTF-8"
</span>$ locale-gen
<span class="c1"># Locale par défaut
</span>$ <span class="nb">echo</span> <span class="s1">'LANG=fr_FR.UTF-8'</span> > /etc/locale.conf
<span class="c1"># Disposition clavier par defaut
</span>$ <span class="nb">echo</span> <span class="s1">'KEYMAP=fr-bepo'</span> > /etc/vconsole.conf
<span class="c1"># Nom de la machine
</span><span class="nb">echo</span> <span class="s1">'vbrosseau-laptop'</span> > /etc/hostname
<span class="c1"># Définition des hosts de base
</span>$ <span class="nb">echo</span> <span class="s1">'127.0.0.1 localhost.localdomain localhost'</span> > /etc/hosts
$ <span class="nb">echo</span> <span class="s1">'::1 localhost.localdomain localhost'</span> >> /etc/hosts
$ <span class="nb">echo</span> <span class="s1">'127.0.1.1 vbrosseau-laptop.localdomain vbrosseau-laptop'</span> >> /etc/hosts
<span class="c1"># Définition du mot de passe root de votre machine
</span>$ passwd
<span class="c1"># Création de votre utilisateur
</span>$ useradd -m -g users -G wheel -s /bin/zsh vbrosseau
$ passwd vbrosseau
$ <span class="nb">echo</span> <span class="s1">'vbrosseau ALL=(ALL) ALL'</span> > /etc/sudoers.d/vbrosseau
<span class="c1"># Activation du modules ext4 (requis pour le boot)
</span>$ vim /etc/mkinitcpio.conf
<span class="c1"># Ajouter "ext4" dans MODULES
</span>
<span class="c1"># Génération de l’image initrd
</span>$ mkinitcpio -p linux
<span class="c1"># Installation des de la gestion des updates d’Intel
</span>$ pacman -S intel-ucode
<span class="c1"># Boot de la machine (c’est la partie la plus sensible)
</span>$ bootctl --path<span class="o">=</span>/boot install
<span class="c1"># Création des entrées dans le bootloader (bootctl)
</span>$ vim /boot/loader/entries/arch.conf
title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
options <span class="nv">root</span><span class="o">=</span>/dev/nvme0n1p3 rw
<span class="c1"># Mettre Archlinux comme boot par defaut
</span>$ vim /boot/loader/loader.conf
default arch
</pre>
<p>Voilà l’installation de base est faite. Avant de rédémarrer installons la suite (La partie graphique et dans mon cas Gnome-Shell)</p>
</div>
<div class="section" id="la-partie-graphique-audio-et-gnome-shell">
<h1>La partie Graphique, Audio et Gnome-Shell</h1>
<pre class="code shell literal-block">
<span class="c1"># L’audio
</span>$ pacman -S gst-plugins-<span class="o">{</span>base,good,bad,ugly<span class="o">}</span> gst-libav
<span class="c1"># Xorg
</span>$ pacman -S xorg-<span class="o">{</span>server,xinit<span class="o">}</span> xf86-input-libinput xdg-user-dirs
<span class="c1"># Le pilote graphique
</span>$ pacman -S xf86-video-intel
<span class="c1"># Les fonts
</span>$ pacman -S ttf-<span class="o">{</span>bitstream-vera,liberation,freefont,dejavu<span class="o">}</span>
<span class="c1"># Installation de Gnome-Shell
</span>$ pacman -S gnome gnome-extra system-config-printer unoconv pavucontrol pulseaudio pulseaudio-alsa
$ systemctl <span class="nb">enable</span> gdm
<span class="c1"># Extra
</span>$ pacman -S libreoffice-still-fr firefox-developer-edition-i18n-fr chromium
</pre>
</div>
<div class="section" id="aur-ou-arch-user-repository">
<h1>AUR ou Arch User Repository</h1>
<p>Ajouter à la fin du /etc/pacman.conf le Repository « Archlinux FR »</p>
<pre class="code shell literal-block">
<span class="c1"># Ajouter à la fin
</span>$ vim /etc/pacman.conf
<span class="o">[</span>archlinuxfr<span class="o">]</span>
<span class="nv">SigLevel</span> <span class="o">=</span> Never
<span class="nv">Server</span> <span class="o">=</span> http://repo.archlinux.fr/<span class="nv">$arch</span>
<span class="c1"># Installation de Yaourt
</span>$ pacman -Syy
$ pacman -S yaourt
</pre>
<p>Voilà, maintenant que tout est installé</p>
<pre class="code shell literal-block">
<span class="c1"># On quitte
</span>$ <span class="nb">exit</span>
<span class="c1"># On reboot
</span>$ reboot
</pre>
<p>Votre ordinateur devrais reboot sous Archlinux.</p>
</div>Utiliser une Yubikey comme Smartcard et Agent-SSH avec Archlinux2018-01-20T21:00:00Valentin Brosseautag:http://blog.lesite.us,2018-01-20:utiliser-une-yubikey-comme-smartcard-et-agentssh-avec-archlinux.html<p>J'ai récemment réinstallé un Archlinux (sur un Dell XPS 2017, le 9360) j'utilise depuis quelques mois une Yubikey comme Smartcard (et comme Agent-SSH). C'est bien pratique et cela évite d'avoir les clefs PGP et SSH physiquement sur la machine.</p>
<p>J'utilisais ma clé sur un Mac et sur Android, mais je ne l'avais pas branché sur une machine Archlinux… Donc ce qui nous intéresse la configuration. Pour que ça fonctionne il faut installer les paquets suivants :</p>
<pre class="code shell literal-block">
yaourt -S gnupg libu2f-host pcsc-tools ccid libusb-compat
</pre>
<p>Puis démarrer le service :</p>
<pre class="code shell literal-block">
systemctl <span class="nb">enable</span> pcscd.service
systemctl start pcscd.service
</pre>
<p>Et pour la configuration, c’est comme sur les autres systèmes :</p>
<pre class="code literal-block">
enable-ssh-support
default-cache-ttl 1800
max-cache-ttl 21600
pinentry-program /usr/bin/pinentry
</pre>
<p>Et voilà, normalement c’est bon! Votre Yubikey est utilisable.</p>Activer les emoji’s colorés sur Archlinux2018-01-19T21:00:00Valentin Brosseautag:http://blog.lesite.us,2018-01-19:activer-les-emojis-colores-sur-archlinux.html<p>Une note rapide, si comme moi vous voulez activer les emoji’s colorés (comme sur un mobile) sur Archlinux sans vous prendre la tête il suffit d’installer la bonne font et créer le bon fichier de configuration :</p>
<pre class="code shell literal-block">
yaourt -S noto-fonts-emoji
mkdir -p ~/.config/fontconfig/conf.d/
vim ~/.config/fontconfig/conf.d/01-emoji.conf
</pre>
<p>Dans le fichier 01-emoji.conf mettre le contenu suivant :</p>
<pre class="code xml literal-block">
<span class="cp"><?xml version="1.0"?></span>
<span class="cp"><!DOCTYPE fontconfig SYSTEM "fonts.dtd"></span>
<span class="nt"><fontconfig></span>
<span class="c"><!-- Use Google Emojis --></span>
<span class="nt"><match</span> <span class="na">target=</span><span class="s">"pattern"</span><span class="nt">></span>
<span class="nt"><test</span> <span class="na">qual=</span><span class="s">"any"</span> <span class="na">name=</span><span class="s">"family"</span><span class="nt">><string></span>Segoe UI Emoji<span class="nt"></string></test></span>
<span class="nt"><edit</span> <span class="na">name=</span><span class="s">"family"</span> <span class="na">mode=</span><span class="s">"assign"</span> <span class="na">binding=</span><span class="s">"same"</span><span class="nt">><string></span>Noto Color Emoji<span class="nt"></string></edit></span>
<span class="nt"></match></span>
<span class="nt"></fontconfig></span>
</pre>
<p>Et voilà ! À vous les emoji’s colorés dans votre navigateur (ou autre) 😉.</p>MacOS: Désactiver les .DS_Store sur le réseau2017-07-09T22:09:00Valentin Brosseautag:http://blog.lesite.us,2017-07-09:macos-desactiver-les-dsstore-sur-le-reseau.html<p>Rien de plus chiant sous MacOs que les fichiers « .DS_Store » à défaut de pouvoir les retirer complètement il est possible de désactiver l’écriture des fichiers sur les disques réseaux :</p>
<pre class="code bash literal-block">
sudo defaults write /Library/Preferences/com.apple.desktopservices DSDontWriteNetworkStores -string <span class="nb">true</span>
</pre>
<p>Pour la disparition complète des fichier il faudra attendre APFS et High Sierra (Enfin il me semble…)</p>Raspberry PI Zero W: SSH et Wifi headless.2017-07-09T12:00:00Valentin Brosseautag:http://blog.lesite.us,2017-07-09:raspberry-pi-zero-w-ssh-et-wifi-headless.html<p>[Edit] Ajout du country dans le « wpa_supplicant.conf »</p>
<p>J'ai acquis depuis quelques semaines un Raspberry Pi Zero W (la toute toute petite carte équipée du Wifi de la fondation Rasberry), la petite particularité de celle-ci c'est qu'elle n'est pas équipée d'un port HDMI habituel mais d'un mini HDMI dans mon cas ce n'est pas vraiment un soucis, car le Pi Zero va me servir comme « Mini serveur de relevés de températures ». Par contre le soucis c'est qu'il faut pouvoir activer l'accès SSH et le Wifi dès le premier boot et sans écran ni port ethernet.</p>
<p>Heureusement tout est déjà prévu (mais pas forcément bien documenté à mon goût). Donc comme d’habitude :</p>
<ul class="simple">
<li>Télécharger la Rasbian Lite.</li>
<li>« Flasher » la sur votre carte SD.</li>
</ul>
<div class="section" id="activation-du-ssh">
<h1>Activation du SSH :</h1>
<p>Dans la partition « boot » (sous Windows la seule que vous voyez), sous linux celle en FAT32 il suffit d’ajouter un fichier vide SSH</p>
<pre class="code bash literal-block">
$ touch SSH
</pre>
</div>
<div class="section" id="activation-de-wifi">
<h1>Activation de Wifi :</h1>
<p>Toujours dans la partition « boot» il faut créer le fichier « wpa_supplicant.conf » avec le contenu suivant :</p>
<pre class="code literal-block">
country=fr
update_config=1
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="YOUR_SSID"
psk="YOUR_PASSWORD"
key_mgmt=WPA-PSK
}
</pre>
<p>Et voilà vous pouvez maintenant éjecter votre carte SD et la brancher dans votre PI. Celui-ci devrait-être connecté dès le premier boot à votre réseau Wifi et autoriser l’accès SSH.</p>
</div>El Capitan : Personnaliser la disposition de clavier du « Login screen »2016-07-11T23:00:00Valentin Brosseautag:http://blog.lesite.us,2016-07-11:el-capitan-personnaliser-la-disposition-de-clavier-du-login-screen.html<p>Vu que maintenant je saisie au clavier exclusivement en bépo, je souhaite que celui-ci soit disponible dans l'intégralité de mon système.</p>
<p>Sous OSX cette intégration est presque parfaite, il est possible de mettre (sans bidouiller) une disposition de clavier complètement personnalisé dans le système. Cependant, pour une raison qui m'échappe, au niveau du « login screen » il est impossible de choisir une disposition de clavier autre que celle fourni de base par le système, mais par chance une parade existe :</p>
<p>Après avoir choisi sur votre utilisateur la disposition voulue il suffit de passer les commandes suivantes dans un terminal :</p>
<pre class="code bash literal-block">
sudo cp ~/Library/Preferences/com.apple.HIToolbox.plist /Library/Preferences/
sudo chmod <span class="m">644</span> /Library/Preferences/com.apple.HIToolbox.plist
</pre>
<p>Après un redémarrage ça devrait être OK!</p>Installer PHP sur OSX via Brew.sh2016-05-16T13:00:00Valentin Brosseautag:http://blog.lesite.us,2016-05-16:installer-php-sur-osx-via-brewsh.html<p>Vu que j'ai récemment « switché » sous osx pour des besoins pro, je suis actuellement en quête de tous les outils que j'utilisais au jour le jour sur ma Archlinux.</p>
<p>La combinaison de base que j'utilise quasi journalièrement c'est Apache et PHP. Pour Apache pas vraiment de problème c'est intégré dans OSX, attention, depuis la dernière version plus de menu pour le démarrer, mais un simple :</p>
<p>Démarrer Apache :</p>
<pre class="code bash literal-block">
$ sudo apachectl start
</pre>
<p>Stopper Apache :</p>
<pre class="code bash literal-block">
$ sudo apachectl stop
</pre>
<p>suffira à résoudre le problème.</p>
<p>Le point le plus embêtant c'est que de base la version de PHP n'est pas dutout à jour, et ça pour le coup c'est un problème impossible pour moi de coder en PHP sans avoir à minima la dernière version 5.6 (pour la 7 c'est également possible sans soucis). Pour installer PHP rien de plus simple il suffit d'activer quelques repo dans Brew et d'activer le module dans la conf de PHP (pour l'installation de <a class="reference external" href="http://www.brew.sh/">brew.sh</a> je vous laisse allez voir <a class="reference external" href="http://www.brew.sh/">le site officiel</a> c'est vraiment tout simple).</p>
<pre class="code bash literal-block">
$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/homebrew-php
$ brew install php56
</pre>
<p>Et voilà PHP 5.6 est installé sur votre machine, cependant pour l'instant votre Apache ne le connait pas... Pour ajouter le support du PHP il vous suffit d'éditer</p>
<pre class="code bash literal-block">
$ vim /etc/apache2/httpd.conf
</pre>
<p>et après le dernier LoadModule ajouter :</p>
<pre class="code bash literal-block">
LoadModule php5_module /usr/local/opt/php56/libexec/apache2/libphp5.so
</pre>
<p>et maintenant il faut activer le support du PHP pour les extensions de type .php pour ça trouvez la directive :</p>
<pre class="code bash literal-block">
<FilesMatch <span class="s2">"^\.([Hh][Tt]|[Dd][Ss]_[Ss])"</span>>
Require all denied
</FilesMatch>
</pre>
<p>et ajouter à la suite :</p>
<pre class="code bash literal-block">
<FilesMatch <span class="se">\.</span>php$>
SetHandler application/x-httpd-php
</FilesMatch>
</pre>
<p>Pour terminer la configuration il faut juste modifier le Directory Index pour ajouter le index.php comme page pouvant servir de page par default :</p>
<pre class="code bash literal-block">
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
</pre>
<p>Une fois terminé, vous pouvez quitter vim et faire un :</p>
<pre class="code bash literal-block">
$ sudo apachectl restart
</pre>
<p>Et voilà vous avez PHP sur votre Apache. Pour l'instant c'est pas mal, cependant pour plus de confort je vous conseille de faire les modifications suivantes dans le httpd.conf.</p>
<div class="section" id="apache">
<h1>Apache</h1>
<p>De base l'installation fait référence à un dossier dans le système, c'est pas des plus simple pour dev, moi personnellement je change le dossier pour un dossier htdocs à la racine de mon $HOME, pour cela il faut éditer le fichier /etc/apache2/httpd.conf et rechercher la ligne contenant :</p>
<pre class="code bash literal-block">
DocumentRoot <span class="s2">"/Library/WebServer/Documents"</span>
</pre>
<p>et la remplacer par :</p>
<pre class="code bash literal-block">
DocumentRoot <span class="s2">"/Users/valentinbrosseau/htdocs"</span>
</pre>
<p>Un peu plus bas il faut également remplacer le Directory par :</p>
<pre class="code bash literal-block">
<Directory <span class="s2">"/Users/valentinbrosseau/htdocs"</span>>
</pre>
<p>Dans le bloc directory en question il faut également changer l'instruction AllowOverride par :</p>
<pre class="code bash literal-block">
AllowOverride All
</pre>
<p>Pour ne pas avoir de soucis de droit il faut changer l'utilisateur et le groupe avec lequel fonctionne apache, pour ça toujours dans le fichier de conf trouver les lignes contenant :</p>
<pre class="code bash literal-block">
User _www
Group _www
</pre>
<p>à remplacer par (dans mon cas, pour vous l'utilisateur sera différent):</p>
<pre class="code bash literal-block">
User valentinbrosseau
Group staff
</pre>
<p>Et voilà après un restart d'apache vous avez une configuration fonctionnelle avec PHP.</p>
<p>Bon dev à vous.</p>
</div>Trackball Logitech Trackman Marble PS/2 : Ajouter la roulette et le clic central2016-05-16T12:00:00Valentin Brosseautag:http://blog.lesite.us,2016-05-16:trackball-logitech-trackman-marble-ps2-ajouter-la-roulette-et-le-clic-central.html<p>J'ai récemment fait l'acquisition d'une (un ?) trackball Logitech Trackman Marble, c'est un vieux
modèle au vu de la fiche Wikipedia il date de 1996, mais pour 2€ c'est vraiment une bonne affaire... Enfin l'inconvénient d'avoir une souris aussi âgée c'est qu'elle ne possède pas de roulette, mais trois boutons
comme sur cette image :</p>
<img alt="https://i.ebayimg.com/images/g/6YwAAOSwFyhZ~Kfc/s-l1600.jpg" loading="lazy" src="https://i.ebayimg.com/images/g/6YwAAOSwFyhZ~Kfc/s-l1600.jpg"/>
<p>Mais le gros avantage de Linux c'est que tout est configurable, donc aucun problème un petit fichier de configuration et ça roule.</p>
<p>Pour ajouter le support de la roulette et du clic central il vous suffit de créer le fichier
10-evdev.conf dans le bon dossier et c'est parti (pour Archlinux en tout cas, mais dans les autres distributions ça doit être sensiblement là même chose)</p>
<pre class="code bash literal-block">
$ cat /X11/xorg.conf.d/10-evdev.conf
Section <span class="s2">"InputClass"</span>
Identifier <span class="s2">"Logitech Trackball
MatchProduct "</span>PS/2 Logitech TrackMan<span class="s2">"
Option "</span>EmulateWheel<span class="s2">" "</span>true<span class="s2">"
Option "</span>EmulateWheelButton<span class="s2">" "</span><span class="m">2</span><span class="s2">"
Option "</span>Emulate3Buttons<span class="s2">" "</span>true<span class="s2">"
EndSection</span>
</pre>
<p>Un petit reboot (où en redémarrant X11 à vous de voir) et vous pourrez scroller en laissant le bouton central enfoncé et en tournant la jolie boule rouge de votre trackball.</p>Syncer, boostez vos transfert2015-09-20T12:00:00Valentin Brosseautag:http://blog.lesite.us,2015-09-20:syncer-boostez-vos-transfert.html<p>En voilà une bonne idée !</p>
<p>De plus en plus d'outils utilisent des techniques de synchro partielles pour sauvegarder vos fichiers (Dropbox, BitTorentSync, etc…) mais il était pourt l'instant plutôt dificile d'utiliser ce genre de technique avec vos propres transferts de fichiers.</p>
<p>C'est maintenant fini ! À vous aussi les joies de la copie rapide ! <a class="reference external" href="https://github.com/stargrave/syncer">Syncer</a> est un outil écrit en Go qui fonctionne sur le même principe que BitTorrent Sync (enfin je crois). Pour faire simple au lieu de simplement copier vos fichiers l'outils lors de la première copie calcul un hash de chaque block des fichiers que vous souhaitez copier.</p>
<p>Via :</p>
<pre class="code bash literal-block">
% ./syncer -src /dev/ada0 -dst /dev/da0 -state state.bin
<span class="o">[</span>%%%%%%<span class="o">]</span>
<span class="c1"># all blocks were transferred to da0</span>
</pre>
<p>Puis lors de la prochaine copie, au lieu de copier l'intégralité des fichiers le même processus sera utilisé, mais ce coup-ci au lieux de tout copier (et c'est là que c'est vraiment cool) uniquement les blocks modifiés seront copiés vers la destination :</p>
<pre class="code bash literal-block">
% ./syncer -src /dev/ada0 -dst /dev/da0 -state state.bin
<span class="o">[</span>....%.<span class="o">]</span>
<span class="c1"># only one block was transferred to da0</span>
</pre>
<p>C'est aussi simple que ça! Personelement je trouve le truc vraiment génial ! Ça ouvre vraiment de bonne perspective surtout vu les débits plutôt misérable que l'on peu avoir en ADSL montant…</p>
<p>L'outil est open source et est écrit en Go, pour le <a class="reference external" href="https://github.com/stargrave/syncer">télécharger c'est par ici</a></p>Ubuntu Touch : L'erreur ?2015-09-13T21:46:00Valentin Brosseautag:http://blog.lesite.us,2015-09-13:ubuntu-touch-lerreur.html<p>Sous ce titre un peu « troll » se cache une vraie réflexion, lors de l'annonce de Ubuntu Touch j'étais vraiment emballé (un peu comme à l'arrivée d'Android au début). Les possibilités était vraiment dingue, avoir un système libre installable sur son téléphone un peu comme sur un PC l'idée parfaite ! Enfin presque…</p>
<div class="section" id="un-debut-ideal">
<h1>Un début idéal</h1>
<p>Au début tout était bien, une annonce, un OS testable sur le Nexus 4. Bon c'était incomplet, relativement buggé, mais c'était le début. J'imaginais déjà l'OS envahir le parc de mobile existant dans les 2 ou 3 ans à venir.</p>
</div>
<div class="section" id="la-campagne-colaborative">
<h1>La campagne colaborative</h1>
<p>Au moment de la levée de fond, j'ai été emballé! Puis surpris, l'idée était très bonne, une ambition annoncée! Faire du haut de gamme oui, mais du haut de gamme libre. Bonne idée! Une petite pointe de déception quand je me rend compte que finalement l'idée d'un OS qui s’installe partout semble être du passé (ou mise de côté officiellement)… Malheureusement la campagne n'a pas abouti, mais pour être honnête vu la somme demandée de Canonical c'était plutôt logique… Bien tenté comme dirait l'autre…</p>
</div>
<div class="section" id="l-arrive-de-bq-et-autres">
<h1>L'arrivé de BQ et autres</h1>
<p>Plusieurs périphériques, mais plus de projet officiel de portage sur des mobiles éxistants. Oust l'idée d'être disponible en masse…
On laisse à la communauté la lourde tâche de rendre compatible l'OS sur du matériel éxistant (et vu les difficultés sur un mobile comme le Nexus 5, j'imagine l'ampleur de la tâche et les difficultés). Dommage !</p>
<p>On en est donc ici, de bonnes idées, une plateforme qui semble intéressante, mais qu'il faut l'avouer, est pour moi pour l'instant dans l'oeuf… Dans l'oeuf pour la simple et bonne raison (pour moi hein! Ne le prenez pas mal) que dans l'état actuel des choses de bonne base sont là, les concepts sont là aussi, des périphériques sont disponibles, mais peu d'utilisateurs et surtout peu de grand nom (car oui sans utilisateur pas de grand nom et pas d'utilisateurs si pas de grand nom)</p>
<p>Pour moi la solution est plutôt simple (en théorie), il faut que Canonical envoie un signal fort! Le signal que Ubuntu (touch) est dans la même optique que Ubuntu sur PC, un OS qui s’installe presque n'importe où, pour gagner des parts de marché simplement et devenir une vraie alternative (sans se ruiner) à l'éco-système actuel à savoir Android et Apple.</p>
<p>J'espère me tromper, même si j'ai très envie de voir Ubuntu Touch sur un périphérique officiel (Peut-être prochainement ? ) j'ai des doutes de la réussite de la plateforme sur le long terme si Canonical se limite au constructeur partenaire…</p>
<p>Je ne sais pas si vous allez partager mon avis, mais voilà c'est dit!</p>
</div>Bépo orienté dev2015-09-12T12:00:00Valentin Brosseautag:http://blog.lesite.us,2015-09-12:bepo-oriente-dev.html<p>Ça fait maintenant « quelques mois » que j'utilise le Bépo activement, comme beaucoup j'ai été sceptique sur certains aspects surtout sur l'utilisation dans le « Développement ». Je fais du dev toute la journée et certains « détails » de la disposition me semblaient pas parfait, j'ai donc décidé de modifier les éléments suivants pour améliorer mon usage du clavier :</p>
<ul class="simple">
<li>Passage en accès direct des touches < >.</li>
<li>Création des raccourcis Couper, Copier, Coller sur les touches équivalentes aux raccourcis azerty mais sur le layer Altgr (Linux seulement).</li>
<li>Déplacement de … pour ne pas les perdres suite au remapping.Remplacement de la touche Verr Maj. par Altgr.</li>
<li>Ajout j k l m sur le layer shift+Altgr.</li>
<li>Déplacement des symboles plus lié au dévoloppement ({}, (), []) en accès sur la main droite sur le layer Altgr.</li>
<li>Inversion du W et du Ç.</li>
</ul>
<p>Peu de modifications, mais dans mon cas un gain de confort incroyable. Pour les curieux voilà le rendu de ma disposition que j'ai appelé sans prétention « Bepo_developpeur » :</p>
<blockquote>
<img alt="https://github.com/c4software/bepo_developpeur/raw/master/bepoDev-simplifiee.png" loading="lazy" src="https://github.com/c4software/bepo_developpeur/raw/master/bepoDev-simplifiee.png"/>
</blockquote>
<p>Pour participer à mes recherches ou utiliser la disposition <a class="reference external" href="https://github.com/c4software/bepo_developpeur/">c'est ici (sur Github)</a></p>Le Bépo quelques mois plus tard2014-09-21T12:00:00Valentin Brosseautag:http://blog.lesite.us,2014-09-21:le-bepo-quelques-mois-plus-tard.html<p>Se mettre au bépo demande pas mal de motivation surtout au début quand on ne voit pas forcément le bout et que la tâche semble insurmontable. Mais c'est un exercice vraiment fun… J'espère que cet article va vous donner envie de continuer ou de vous mettre au bépo. Avant de voir mon ressenti sur tout ça, voilà un petit guide sur comment je me suis mis au bépo.</p>
<p>Pour débuter le bépo rien de plus simple un petit tour sur le site officiel <a class="reference external" href="http://bepo.fr/wiki/Accueil">http://bepo.fr/wiki/Accueil</a> prendre le driver qui correspond à votre plateforme, bonne nouvelle si vous utilisez Linux vous n'avez rien à télécharger le bépo est <em>inclus</em> dans votre système d'exploitation. La seconde étape « la plus importante » imprimer la carte de la disposition, elle est <a class="reference external" href="http://bepo.fr/wiki/Fichier:Fr-dvorak-bepo-1.0rc2-simplifiee.png">disponible ici</a></p>
<p>Et voilà vous avez maintenant les cartes (enfin la carte haha) en mains pour vous mettre au bépo. C'est maintenant l'étape la plus difficile, si vous avez de la motivation tout ira bien et en quelques semaines vous allez maitriser cette nouvelle disposition de clavier qui, vous le verrez ça vous changer la vie. Si en revanche vous voulez tester sans réel motivation ça va être difficile car il faut être honnête oublier plusieurs années d'azerty…</p>
<p>Mais comme rien est impossible voilà comment j'ai fait pour « migrer » de l'azerty au bépo.</p>
<div class="section" id="ne-surtout-rien-acheter">
<h1>Ne surtout rien acheter</h1>
<p>Et oui c'est tentant, premier réflexe essayer de trouver un clavier imprimé en bépo. Oui cela existe <a class="reference external" href="http://www.typematrix.com/">Typematrix</a> en propose, d'autre marque propose aussi des stickers à coller sur vos touches de clavier. MAIS SURTOUT NE PAS CRAQUER c'est vraiment un truc à ne pas faire si vous débutez l'apprentissage avec ce genre d'installation vous allez être tenté de regarder votre clavier et c'est complètement à l'opposer de la philosophie du bépo ou le plus important c'est aussi de gagner en confort en ne regardant plus votre clavier quand vous tapez.</p>
<p>Si vous souhaitez acheter quelques choses vous pouvez prendre un clavier sans aucune touche écrite, c'est radicale, mais au moins vous ne le regarderez plus du tout!</p>
</div>
<div class="section" id="voir-l-apprentissage-comme-un-jeu">
<h1>Voir l'apprentissage comme un jeu</h1>
<p>Apprendre une nouvelle disposition peut être un exercice frustrant surtout quand on passe de 60 mots par minutes (au plus) à seulement 2… Donc pour éviter de l'énervement et le risque le rejet, n'essayez pas du jour au lendemain de tout changer pour la disposition bépo à 100 %, la meilleure solution est certainement de voir le changement comme un jeu quelques minutes par jour le soir ou pendant votre pause déjeuner. Il existe plein de petits logiciels pour apprendre une nouvelle disposition :</p>
<ul class="simple">
<li><a class="reference external" href="http://klavaro.sourceforge.net/en/">Klavaro</a></li>
<li><a class="reference external" href="https://chrome.google.com/webstore/detail/dactylotest/enffehffcnldmfefglmifdngjjjpoolk">Dactylotest</a></li>
<li><a class="reference external" href="http://www.lecturel.com/">Lecturel</a></li>
<li>Il en existe plein d'autre, moi pour ma part, j'ai utilisé Dactylotest, il tourne sous Chrome ça me permet de m'entraîner partout.</li>
</ul>
<p>Pour la fréquence moi j'ai fait environ 30 minutes d'exercice tous les jours principalement le soir. En environ deux mois j'avais atteint la vitesse de frappe que j'avais en Azerty.</p>
</div>
<div class="section" id="l-utilisation">
<h1>L'utilisation</h1>
<p>L'autre point important c'est essayé de s'entrainer sur des textes qui vont correspondre à votre usage final, j'ai eu le malheur de m'entraîner uniquement avec des textes « littéraires » à tel point que j'ai eu un doute si le bépo était fait pour moi, je suis développeur et je me suis dit est-ce vraiment adapté pour taper du code ? Et bien la réponse est évidente oui. Mais pour ça je suis passé par une phase d'exercice en mode code taper du python du JavaScript du html etc…</p>
</div>
<div class="section" id="mon-retour-d-experience">
<h1>Mon retour d'expérience</h1>
<p>Il faut avouer ce n'est pas si simple surtout au bout de deux ou trois semaines c'est vraiment plus marrant les idées du début ne sont plus là et une sorte de lassitude se fait sentir et on a envie de tout abandonner. Mais c'est le moment le levier c'est à partir trois semaines que j'ai retrouvés quasiment (par pic) mon ancienne vitesse de frappe.</p>
<p>Au niveau des modifications du bépo, pour ma part je n'ai pas modifié grand-chose j'ai juste déplacé une seule touche le <em>altgr</em> elle sert énormément et je trouve que la position de base n'est pas vraiment satisfaisante. Donc vu que je ne me sers jamais de la touche caps-lock (verr maj.) j'ai déplacé la touche alt-gr dessus. Et vraiment la différence de confort est incomparable surtout pour faire du code, maintenant l'accès aux touches du niveau 3 (pipe, <, >, …) est vraiment simplifié.</p>
<p>Ça fait maintenant sept mois environ que j'ai commencé à faire du bépo, j'utilise mon PC portable uniquement en bépo et quand il m'arrive de repasser en azerty ça me confirme mon choix de vouloir rester en bépo. Par contre, professionnellement là ça coince je n'arrive pas à me dégager suffisamment de temps pour switcher. Mon idée est donc de découper ma migration pro en plusieurs morceaux :</p>
<ul class="simple">
<li>Passer en bépo pour les dialogues internes (mails, chat).</li>
<li>Passer en bépo pour écrire les spécifications.</li>
<li>Puis terminer la migration pour taper du code…</li>
</ul>
<p>Pour conclure c'est simple foncer vous ne le regretterez pas !</p>
</div>[TEST] Simulateur d'aube Philips HF3505/012014-01-03T12:00:00Valentin Brosseautag:http://blog.lesite.us,2014-01-03:test-simulateur-daube-philips-hf350501.html<p>Je ne sais pas pour vous, mais moi j'ai eu énormément de mal à trouver un radio réveil simple et efficace. J'en ai testé beaucoup du plus basic au plus complexe, mais sans vraiment de conviction... Il y avait toujours quelques choses qui n'allaient pas :</p>
<ul class="simple">
<li>Un son beaucoup trop fort et non réglable (Qui mais qui peut utiliser un truc qui hurle le matin ?).</li>
<li>Un afficheur ultra puissant et permanent.</li>
<li>Deux boutons pour régler 30 000 fonctions...</li>
<li>etc...</li>
</ul>
<p>Et le pire c'est que le prix n'a rien à voir avec la qualité…</p>
<p>Mais je crois que j'ai trouvé mon bonheur, le Radio Réveil simulateur d'aube (HH3505/01) de Philips. Il est très simple :</p>
<ul class="simple">
<li>Un grand afficheur.</li>
<li>Un réveil en douceur via un allumage progressif d'une auréol lumineuse autour de l'afficheur.</li>
<li>Autant de boutons que de fonction (MERCI Philips).</li>
<li>Des boutons sensitifs (un détail, mais un vrai plus vous verrez).</li>
<li>Une luminosité réglable de l'afficheur.</li>
<li>Une fonction réveil FM ou bruit de la nature.</li>
</ul>
<img alt="./static/HF3503-1.png" loading="lazy" src="./static/HF3503-1.png"/>
<div class="section" id="l-afficheur">
<h1>L'afficheur</h1>
<p>C'est pour moi le vrai gros plus de ce réveil, contrairement à beaucoup d'autres modèles celui-ci est clair ET réglable. Chaque fonction se retrouve directement accessible (éclairage, FM, etc) grâce aux différentes touches sensitives rétro-éclairée.</p>
<p>La chose vraiment bien sur cet afficheur c'est justement ces touches rétro-éclairée, car elles sont rétro-éclairé uniquement quand cela est nécessaire, au bout de quelques secondes le rétro-éclairage s'arrète pour ne laisser apparaître que l'heure, pour rendre les touches visibles à nouveau il suffit d'approcher le doigt et hop elles sont de nouveau visibles, simple mais vraiment génial.</p>
<p>Rien de plus à dire sur l'afficheur, ah si simplement que l'intensité lumineuse est réglable (4 niveaux) donc fini le spot orange/rouge qui éclaire votre chambre.</p>
</div>
<div class="section" id="simulation-d-aube">
<h1>Simulation d'aube</h1>
<p>Alors, là c'est plutôt mitigé… On va dire que ça dépend des goûts moi j'adore ce genre de choses. Le principe de la luminothérapie est simple au lieu d'avoir un réveil qui sonne à l'heure indiquée vous avez une lumière (à base de led visiblement) qui s'allume progressivement (en 30minutes) pour atteindre la luminosité maximum que vous avez réglé.</p>
</div>
<div class="section" id="une-petite-video-du-reveil">
<h1>Une petite vidéo du reveil :</h1>
<br/><center><iframe allowfullscreen="" frameborder="0" height="315" src="//www.youtube.com/embed/XAQLIyg3mWk" width="560"></iframe></center><br/><br/></div>
<div class="section" id="en-resume">
<h1>En résumé</h1>
<p>Pour résumer le réveil est vraiment de bonne facture, aucun soucis particulier une vraie réussite pour Philips.</p>
<p>Points positifs :</p>
<ul class="simple">
<li>Un réveil vraiment réglable.</li>
<li>Une radio FM avec un son correct (et réglable).</li>
<li>La luminothérapie.</li>
<li>Les touches sensitives.</li>
</ul>
<p>Points négatifs :</p>
<ul class="simple">
<li>Le prix</li>
<li>La durée d'allumage de l'aube visiblement non réglable.</li>
</ul>
</div>Android et les screencasts vidéo2013-12-10T21:40:00Valentin Brosseautag:http://blog.lesite.us,2013-12-10:android-et-les-screencasts-video.html<p>Vous l'avez peut-être vu passer sur Internet (<a class="reference external" href="http://www.frandroid.com/applications/183580_screencast-beta-play-store-android">ici</a> ou <a class="reference external" href="https://plus.google.com/110558071969009568835/posts/72Tc9e3ZFMA">là</a>) la Cyanogen Mod permet maintenant de faire des screencast (en beta pour le moment) c'est une super nouvelle démocratiser et surtout simplifier la prise de vue d'un téléphone est une super nouvelle surtout dans le monde de l'entreprise. Étant moi-même développeur j'ai remarqué que rien ne vaut une démonstration réel d'un site web. À défaut de pouvoir en faire simplement avec tout le monde, j'ai commencé à faire des vidéos (screencast) principalement depuis le mon PC, et pour simuler un mobile un petit tour dans les dev-tools de Chrome et hop.</p>
<p>Mais ce temps est révolu! Mais pas besoin d'une ROM Cyanogen ou de rooter votre mobile pour en profiter. Depuis Android 4.4 il est possible de faire un screencast de son mobile sans outils supplémentair (ok à part un câble USB - Quoi que -). Pour ça rien de plus simple il suffit de brancher son mobile à son PC et de lancer la commande :</p>
<pre class="code bash literal-block">
➜ ~ adb shell screenrecord /sdcard/exemple.mp4
</pre>
<p>La commande ne retourne aucune info ? C'est normal, l'enregistrement est parti. Pour l'arreter aucun soucis il suffit de faire « Ctrl+c ». Pour le rendu ça donne quelques chose de trés propre :</p>
<br/><iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/F_F7o86Pa0o" width="560"></iframe><br/><br/><p>PS: Il est aussi possible de lancer l'enregistrement depuis un terminal emulator directement depuis le mobile.</p>Quelques règles pour le web mobile2013-11-22T23:30:00Valentin Brosseautag:http://blog.lesite.us,2013-11-22:quelques-regles-pour-le-web-mobile.html<p>Dans une récente conférence qui c'est déroulé lors du <a class="reference external" href="http://developer.chrome.com/devsummit/schedule">Google Chrome Dev Summit</a> à Mountain View, +Paul Kinlan a présenté les règles de base (selon Google) pour une application web mobile de qualité, voilà un petit résumé de ce qui s'est dit :</p>
<div class="section" id="dans-un-premier-temps-les-erreurs">
<h1>Dans un premier temps les erreurs</h1>
<ul class="simple">
<li>Le mobile est en plein essor et les gens s'orientent vers des expériences mobiles.</li>
<li>53% des 1000 sites de Alexa n'ont pas de version mobile. Ce sont juste des versions réduite (De-zoomer). 25% de ces sites ne tiennent mêmes pas sur l'écran.</li>
<li>83% des sites ont une navigation difficile aux doigts, 60% ont des problèmes de lisibilité. 10% ont utilisé des plugins qui ne fonctionnent pas sur un mobile (Flash, Java, Silverlight).</li>
</ul>
</div>
<div class="section" id="une-des-solutions-pagespeed-insights-for-ux">
<h1>Une des solutions? <a class="reference external" href="https://developers.google.com/speed/">PageSpeed Insights for UX</a></h1>
<p>Google propose un outil (PageSpeed Insights for UX) qui permet de :</p>
<ul class="simple">
<li>Vérifier la bonne configuration de vos viewport</li>
<li>Vérifier que le texte est lisible</li>
<li>Que les éléments clickable sont suffisamment grand.</li>
</ul>
<p>Et après le test l'outil vous propose des pistes d'améliorations :</p>
<ul class="simple">
<li>Indique quels éléments agrandir pour simplifier le clique au doigt.</li>
<li>Quelle taille de police utiliser pour que votre site soit lisible.</li>
<li>Quels viewport utiliser.</li>
</ul>
<p>L'outil vous permet :</p>
<ul class="simple">
<li>D'avoir un aperçu du rendu de votre site sur un terminal mobile.</li>
<li>Affiche comment les utilisateurs peuvent interagir dans votre application.</li>
</ul>
</div>
<div class="section" id="quelques-regles-a-appliquer">
<h1>Quelques règles à appliquer</h1>
<ul class="simple">
<li>Toujours utiliser des viewport pour créer une vraie experience mobile.</li>
<li>Toujours définir une règle « device-width » pour être certain du rendu quel que soit le périphérique.</li>
<li>Le navigateur essayera toujours de compenser pour que le site soit lisible, agrandissement des polices, l'utilisation des viewport vous permettra de reprendre le contrôle de l'affichage.</li>
<li>TOUJOURS adapter le contenu de votre site pour qui l'utilisateur n'est pas à scroller dans des multiples directions (en utilisant les viewports donc).</li>
<li>Définisser via le « Media Queries » comment doit se comporter votre site en fonction de la taille d'écran.</li>
<li>Quel que soit la beauté de votre police, 12pt, 1em, 16px, est la taille minimum pour que votre texte soit lisible.</li>
<li>Un bon contraste ainsi qu'un « line-height » bien calculer améliorera grandement la lisibilité.</li>
<li>Limiter au maximum l'utilisation des Web Fonts (sur un mobile), si vous devez vraiment les utiliser, utiliser les pour les titres.</li>
<li>Un élément clickable doit faire 7mm de large et inclure 2mm de padding.</li>
<li>L'utilisation des labels, permet d'avoir 2x plus d'éléments clickables pour accéder à l'élément voulu.</li>
<li>L'utilisation des nouveaux types d'input HTML (number, email, etc…), vous permets d'adapter de clavier de l'utilisateur en fonction de la donnée saisie.</li>
<li>Essayer au maximum de proposer de l'auto-complétion (autoComplete api) pour réduire le nombre de caractère à taper pour l'utilisateur.</li>
<li>Quand vous renseignez un viewport le double tap pour zoomer n'est plus disponible (width=device-width, initial-scale=1, maximum-scale=1)</li>
</ul>
</div>Google Chrome, console.table()2013-11-17T10:50:00Valentin Brosseautag:http://blog.lesite.us,2013-11-17:google-chrome-consoletable.html<p>[Edit] Visiblement la console de Firefox fait la même chose! Bonne nouvelle :)</p>
<p>C'est indéniable la console de debug de Google Chrome est vraiment génial, je pense vraiment que celle-ci est loin devant la concurrence, même si celle de Firefox fait des progrès et rattrape petit à petit son « retard ». Une des super fonctionalitée c'est l'objet « console » celui-ci est effectivement disponible sur tous les navigateurs, mais vous ne connaissez peut-être pas ja methode « table »</p>
<p>La methode table est en faite une façon hyper simple de représenter dans votre console de debug un objet Javascript. Rien ne vaut une bonne demo :</p>
<pre class="code bash literal-block">
var <span class="nv">demo</span> <span class="o">=</span> <span class="o">[</span>
<span class="o">{</span> prenom: <span class="s2">"Valentin"</span>, nom: <span class="s2">"Brosseau"</span> <span class="o">}</span>,
<span class="o">{</span> prenom: <span class="s2">"John"</span>, nom: <span class="s2">"Doe"</span> <span class="o">}</span>,
<span class="o">{</span> prenom: <span class="s2">"Angelina"</span>, nom: <span class="s2">"Jolie"</span> <span class="o">}</span>
<span class="o">]</span><span class="p">;</span>
console.table<span class="o">(</span>demo<span class="o">)</span>
</pre>
<p>Et ça vous donne :</p>
<img alt="./static/console_chrome.png" loading="lazy" src="./static/console_chrome.png"/>
<p>C'est pas magique, mais en tout cas c'est super utile!</p>Tour: Gnome 3.10.12013-10-22T22:20:00Valentin Brosseautag:http://blog.lesite.us,2013-10-22:tour-gnome-3101.html<p>Un rapide tour de Gnome 3.10.1, pas de parole, juste une petite démo technique.</p>
<br/><iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/16tQZW-BPLI" width="560"></iframe><br/><br/><p>PS: Tant de changements depuis Gnome 2...</p>Le futur de Firefox2013-09-19T22:20:00Valentin Brosseautag:http://blog.lesite.us,2013-09-19:le-futur-de-firefox.html<p>En parallèle des versions habituelles les équipes de Firefox sont en train de développer la future interface de Firefox, cette interface est en cours de développement depuis un petit moment déjà elle est pour l'instant connu sous le nom de <a class="reference external" href="http://people.mozilla.org/~jwein/ux-nightly/">Firefox UX</a>.
Cette nouvelle présentation comporte énormément d'évolution dans l'interface, bien trop long détailler en texte mais facilement en vidéo :). Donc rien que pour vous une rapide vidéo :</p>
<br/><iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/HlHess1Ibmg" width="560"></iframe><br/><br/><p>Donc pas mal de changement qui sont vraiment pratique (dommage d'avoir autant copier Chrome dans l'apparence par contre...). Le tout est normalement prévu pour une mise à disposition publique dans la version 26 de firefox soit dans 6 semaines environ.</p>Activer la nouvelle page d'accueil de Google2013-09-19T22:00:00Valentin Brosseautag:http://blog.lesite.us,2013-09-19:activer-la-nouvelle-page-daccueil-de-google.html<p>Vous l'avez peut être vu sur Internet, <a class="reference external" href="https://www.google.com/ncr">Google</a> est entrain de tester chez certains un nouveau design pour la homepage de Google.com. Les modifications sont assez nombreuses (oui 3 modifications pour la homepage de Google c'est pas mal :D):</p>
<ul>
<li><p class="first">Nouveau Logo (très IOS7 je trouve).</p>
</li>
<li><p class="first">Nouveau Menu.</p>
</li>
<li><p class="first">Et une interface encore plus épuré</p>
<blockquote>
<img alt="http://c4software.another-team.com/google.png" loading="lazy" src="http://c4software.another-team.com/google.png"/>
</blockquote>
</li>
</ul>
<p>Donc pour tester rien de plus simple:</p>
<blockquote>
<pre class="doctest-block">
>>> Ouvrez votre navigateur et dans la console de celui-ci (exemple F12 sous Chrome) vous tapez ceci :
>>> document.cookie="PREF=ID=e66a207a51ceefd8:U=936bafc98b2a9121:FF=0:LD=en:NR=10:CR=2:TM=1378808351:LM=1379592992:SG=1:S=OXyq0fqClYB66VuV ; path=/; domain=google.com";window.location.reload();
</pre>
</blockquote>Un double écran, deux serveurs X différents2013-07-10T22:00:00Valentin Brosseautag:http://blog.lesite.us,2013-07-10:un-double-ecran-deux-serveurs-x-differents.html<p>L'avantage de Linux c'est que l'on peut faire vraiment (ou presque) n'importe quoi. Ma dernière bidouille c’est l’affichage d’un second serveur X sur mon deuxième écran. L’intérêt (pour moi en tout cas) c’est d'avoir les avantages de Gnome-Shell et en parallèle un i3 pour le tilling et surtout pour finaliser la configuration du i3 pour éventuellement migrer complètement.</p>
<blockquote>
<img alt="http://c4software.another-team.com/double.png" loading="lazy" src="http://c4software.another-team.com/double.png"/>
</blockquote>
<p>Pour faire simple la solution que j'ai utilisé c'est :</p>
<ul class="simple">
<li>Un lancement classique de Gnome-Shell via GDM.</li>
<li>Lancement de i3 via <a class="reference external" href="http://www.freedesktop.org/wiki/Software/Xephyr/">Xephyr</a></li>
<li>Suppresion des bordures de la fenêtre de Xephyr avec <a class="reference external" href="https://wiki.gnome.org/DevilsPie">Devilspie</a></li>
</ul>
<p><em>Bien évidement la configuration fait référence à la résolution de mes écrans (1680x1050), Dans mon cas i3 s'affichera sur l'écran de droite qui a une résolution de 1680x1050</em></p>
<div class="section" id="creation-du-fichier-de-parametrage-pour-devilspie">
<h1>Création du fichier de parametrage pour devilspie</h1>
<p>Fichier : ~/.devilspie/Xephyr.ds</p>
<pre class="code bash literal-block">
<span class="o">(</span><span class="k">if</span>
<span class="o">(</span>is <span class="o">(</span>window_class<span class="o">)</span> <span class="s2">"Xephyr"</span><span class="o">)</span>
<span class="o">(</span>begin
<span class="o">(</span>undecorate<span class="o">)</span>
<span class="o">(</span>geometry <span class="s2">"1680x1040+1680+0"</span><span class="o">)</span>
<span class="o">)</span>
<span class="o">)</span>
</pre>
<p><em>Vous devez éditer la partie geometry pour l'adapter à votre configuration</em></p>
</div>
<div class="section" id="script-de-lancement-de-la-totalite">
<h1>Script de lancement de la totalité</h1>
<p>Fichier : ~/start.sh</p>
<pre class="code bash literal-block">
<span class="ch">#!/bin/bash
</span>killall devilspie
devilspie ~/.devilspie/Xephyr.ds <span class="p">&</span>
startx -- /usr/bin/Xephyr :1 -screen 1680x1050 -host-cursor <span class="m">2</span>> /dev/null <span class="p">&</span>
</pre>
<p>Rien de bien révolutionnaire, mais j'ai mis pas mal de temps à trouver une solution stable et pratique pour avoir deux WM/DE en parallèle sur ma machine.</p>
</div>De la documentation oui! Mais offline...2013-05-22T20:09:00Valentin Brosseautag:http://blog.lesite.us,2013-05-22:de-la-documentation-oui-mais-offline.html<p>Même si aujourd'hui les périodes hors-ligne sont de moins en moins nombreuses il peut arriver pour une raison X ou Y de ne pas avoir Internet (Train, Camping, ...). Et dans c'est cas là plus de documentation plus rien... Pas très pratique, c'est donc par hasard (et en camping) que je suis tombé sur l'outil pydoc, c'est un peu le man des fonctions python.</p>
<p>Mais ce n'est pas tout si on lui passe le flag -g on ce retrouve avec une petite interface web ET une fonction de recherche dans la documentation installée sur la machine. génial quoi! Donc rien de plus simple</p>
<blockquote>
<pre class="doctest-block">
>>> pydoc -g
</pre>
</blockquote>
<p>ou pour les fans du terminal (par exemple la fonction print)</p>
<blockquote>
<pre class="doctest-block">
>>> pydoc print
</pre>
</blockquote>
<p>Donc plus d'excuse même sans Internet vous pourrez retrouver la doc des fonctions ;).</p>Activer les commentaires Google+ sur votre blog2013-04-21T18:31:00Valentin Brosseautag:http://blog.lesite.us,2013-04-21:activer-les-commentaires-google-sur-votre-blog.html<p>Visiblement Google est en train de tester l'intégration des commentaires Google+ dans autre chose que Google+, en début de semaine Google a annoncé que leur outil de blogging utiliserai maintenant Google+ comme support pour les commentaires. Et visiblement le système est plutot open car sans trop se casser la tête il est possible de l'intégrer sur son blog perso.</p>
<p>Certains ont déjà migré sur ce nouveau service de commentaires, pour ma part je suis plutôt réservé même si le service semble vraiment sympa, je me méfie de Google qui peut sans prévenir couper le tout... (Bha oui rien a été vraiment annoncé). Mais bon vu que vous êtes joueur (et moi aussi) voilà le code source à mettre dans vos pages web pour que celle-ci soit Google+ commentairisé ;).</p>
<pre class="code html literal-block">
<span class="p"><</span><span class="nt">iframe</span> <span class="na">id</span><span class="o">=</span><span class="s">"gcomments"</span> <span class="na">width</span><span class="o">=</span><span class="s">"70%"</span> <span class="na">height</span><span class="o">=</span><span class="s">"600"</span> <span class="na">src</span><span class="o">=</span><span class="s">""</span> <span class="na">frameborder</span><span class="o">=</span><span class="s">"0"</span> <span class="na">scrolling</span><span class="o">=</span><span class="s">"auto"</span> <span class="na">marginheight</span><span class="o">=</span><span class="s">"0"</span> <span class="na">marginwidth</span><span class="o">=</span><span class="s">"0"</span> <span class="p">></</span><span class="nt">iframe</span><span class="p">></span>
<span class="p"><</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">'text/javascript'</span><span class="p">></span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">"gcomments"</span><span class="p">).</span><span class="nx">src</span><span class="o">=</span><span class="s2">"https://plusone.google.com/_/widget/render/comments?bsv&href="</span><span class="o">+</span><span class="nb">document</span><span class="p">.</span><span class="nx">URL</span><span class="o">+</span><span class="s2">"&first_party_property=BLOGGER&view_type=FILTERED_POSTMOD"</span><span class="p">;</span>
<span class="p"></</span><span class="nt">script</span><span class="p">></span>
</pre>
<p>Rien de plus, et oui c'est vraiment super simple... Reste à voir combien de temps ça va fonctionner...</p>
<p><strong>Hop petite mise à jour, il est possible aussi de passer via une version, avec un peu plus de javascript (plus complexe) mais qui est peut-être un peu plus pérenne (En tout cas qui est je pense beaucoup plus propre):</strong></p>
<pre class="code html literal-block">
<span class="p"><</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">"text/javascript"</span> <span class="na">src</span><span class="o">=</span><span class="s">"https://apis.google.com/js/plusone.js"</span> <span class="na">gapi_processed</span><span class="o">=</span><span class="s">"true"</span><span class="p">></</span><span class="nt">script</span><span class="p">></span>
<span class="p"><</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">"plusonecomments"</span><span class="p">></</span><span class="nt">div</span><span class="p">></span>
<span class="p"><</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">'text/javascript'</span><span class="p">></span>
<span class="kd">var</span> <span class="nx">id</span> <span class="o">=</span> <span class="s1">'plusonecomments'</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">divWidth</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="nx">id</span><span class="p">).</span><span class="nx">offsetWidth</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">width</span> <span class="o">=</span> <span class="o">!!</span><span class="nx">divWidth</span> <span class="o">?</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="nx">divWidth</span><span class="p">,</span> <span class="mi">1351</span><span class="p">)</span> <span class="o">:</span> <span class="mi">600</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">URL</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">moderationUrl</span> <span class="o">=</span> <span class="s2">""</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">moderationMode</span> <span class="o">=</span> <span class="s2">"FILTERED_POSTMOD"</span><span class="p">;</span>
<span class="nx">gapi</span><span class="p">.</span><span class="nx">comments</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span> <span class="p">{</span> <span class="s1">'href'</span><span class="o">:</span> <span class="nx">url</span><span class="p">,</span> <span class="s1">'first_party_property'</span><span class="o">:</span> <span class="s1">'BLOGGER'</span><span class="p">,</span> <span class="s1">'legacy_comment_moderation_url'</span><span class="o">:</span> <span class="nx">moderationUrl</span><span class="p">,</span> <span class="s1">'view_type'</span><span class="o">:</span> <span class="nx">moderationMode</span><span class="p">,</span> <span class="s1">'width'</span><span class="o">:</span> <span class="nx">width</span> <span class="p">});</span>
<span class="p"></</span><span class="nt">script</span><span class="p">></span>
</pre>
<p>[<a class="reference external" href="http://www.geekeries.fr/google-plus-comments/">Source</a>]</p>
<script gapi_processed="true" src="https://apis.google.com/js/plusone.js" type="text/javascript"></script>
<div id="plusonecomments"></div>
<script type="text/javascript">
var id = 'plusonecomments';
var divWidth = document.getElementById(id).offsetWidth;
var width = !!divWidth ? Math.min(divWidth, 1351) : 600;
var url = document.URL;
var moderationUrl = "";
var moderationMode = "FILTERED_POSTMOD";
gapi.comments.render(id, { 'href': url, 'first_party_property': 'BLOGGER', 'legacy_comment_moderation_url': moderationUrl, 'view_type': moderationMode, 'width': width });
</script>Freebox, Synology : Activer le support des sous titres en UPNP2013-04-21T16:25:00Valentin Brosseautag:http://blog.lesite.us,2013-04-21:freebox-synology-activer-le-support-des-sous-titres-en-upnp.html<p>Vu que visiblement Free n'est pas décidé à activer le support d'un point de montage Samba dans la partie multimedia de la Freebox et que je me suis lassé d'avoir à convertir en MKV mes épisodes + mes sous-titres, je me suis décidé de vraiment me pencher sur le problème de sous-titrage en UPNP.</p>
<p>Depuis les derniers Firmware de la Freebox il est normalement possible de lire au travers de l'UPNP des sous-titres (avec le même nom blablabla), mais avec mon Synology et DSM 4.2 ça ne fonctionnait pas. Après bien des essais et bien des échecs, j'ai ENFIN réussi à faire lire à la Freebox les sous-titres sans avoir à transcoder chacune de mes vidéos, et pour ça rien de plus simple il suffit de changer le profil du Freebox Player dans le Synology et de faire passer votre Freebox Player en "LG Player"</p>
<img alt="https://pbs.twimg.com/media/BIXpnpxCIAEzJjE.png:large" loading="lazy" src="https://pbs.twimg.com/media/BIXpnpxCIAEzJjE.png:large"/>
<p>Bonne journée à tous :).</p>Remplacer google reader2013-03-25T20:25:00Valentin Brosseautag:http://blog.lesite.us,2013-03-25:remplacer-google-reader.html<p>Bon et bien voilà Google a sonné la fin de la récré Google Reader c'est bientôt fini... Dommage vraiment dommage, car l'outil était vraiment pratique en tout cas chez les personnes souhaitant faire de la veille, ou tout simplement pour toutes les personnes qui souhaitent centraliser à un seul endroit l'intégralité de leur lecture sur Internet (ce qui est mon cas).</p>
<p>Ça fait longtemps que je regardais les alternatives à Google reader, mais sans vraiment de succès. L'un des principales avantages de Google reader c'est la simplicité (ou l'austérité diront certains...), et surtout c'est raccourci clavier simple mais efficace (j et k par exemple).</p>
<p>Après avoir testé beaucoup d'alternative (trop complexe, trop lourde, trop simpliste ?) je suis tombé sur mon bonheur, <a class="reference external" href="http://selfoss.aditu.de/">SELFOSS</a>. Selfoss c'est plein d'avantages :</p>
<ul class="simple">
<li>Legé.</li>
<li>Une configuration simple.</li>
<li>Épuré.</li>
<li>Beau ? (bon ok c'est très suggestif)</li>
<li>Open source (les sources sont disponibles sur <a class="reference external" href="https://github.com/SSilence/selfoss/">Github</a>, et l'auteur est très actifs)</li>
</ul>
<p>Pour le look ça ressemble à :</p>
<img alt="http://selfoss.aditu.de/images/screenshot1.png" loading="lazy" src="http://selfoss.aditu.de/images/screenshot1.png"/>
<p>Que du plus, j'y suis déjà passé. Pourquoi pas vous ?</p>Zsh : Une fonction pour démarrer vos virtualenv2013-03-15T23:10:00Valentin Brosseautag:http://blog.lesite.us,2013-03-15:zsh-une-fonction-pour-demarrer-vos-virtualenv.html<p>Quand je fais du python j'utilise énormément de virtualenv (je pense que je ne suis pas le seul). Les virtualenv's c'est vraiment génial (oui oui vraiment) ça évite de polluer son système avec plein de dépendances diverses qui sont au final utile que dans un seul projet. Le seul "petit" soucis avec les virtualenv c'est qu'il faut utiliser la commande source pour les démarrer exemple :</p>
<pre class="code bash literal-block">
➜ ~ <span class="nb">source</span> python/mon_super_virtualenv/bin/activate
</pre>
<p>Ce n'est pas vraiment long, mais quand on multiplie par quatre ou cinq virtualenv par jour c'est plutôt pénible (même si avec l'historique des commandes -ctrl+r- c'est assez rapide). L'idée de départ c'est de simplifier l'activation du virtualenv avec une petite fonction sympathique dans mon <strong>.zshrc</strong>:</p>
<pre class="code bash literal-block">
<span class="k">function</span> workon<span class="o">()</span> <span class="o">{</span>
<span class="nb">source</span> ~/python/<span class="nv">$1</span>/bin/activate
<span class="o">}</span>
</pre>
<p>Après pour l'utilisation rien de plus simple :</p>
<pre class="code bash literal-block">
➜ ~ workon mon_super_virtualenv
<span class="o">(</span>mon_super_virtualenv<span class="o">)</span>➜ ~
</pre>
<p>[Edit] Et pour ceux qui souhaitent encore plus, <a class="reference external" href="https://twitter.com/FreakyNadley">FreakyNadley</a> m'a remonté l'existence de <a class="reference external" href="http://virtualenvwrapper.readthedocs.org/en/latest/">virtualenvwrapper</a> :)</p>Monitorer la fréquence et la température d'un Raspberry Pi2013-02-27T22:55:00Valentin Brosseautag:http://blog.lesite.us,2013-02-27:monitorer-la-frequence-et-la-temperature-dun-raspberry-pi.html<p>C'est toujours intéressant de pouvoir monitorer ou au moins consulter la fréquence et surtout la température du raspberry Pi. Je ne suis pas parano, mais quand j'ai un système complètement passif j'aime bien consulter la température de fonctionnement pour éviter d'avoir une mauvaise surprise (comme par exemple une carte ou un composant qui part en fumée). Donc le script est vraiment tout simple, mais il remplit son office :</p>
<pre class="code bash literal-block">
<span class="ch">#!/bin/bash
</span><span class="nv">GOV</span><span class="o">=</span><span class="sb">`</span>cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor<span class="sb">`</span>
<span class="nv">MIN</span><span class="o">=</span><span class="sb">`</span>cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq<span class="sb">`</span>
<span class="nv">MAX</span><span class="o">=</span><span class="sb">`</span>cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq<span class="sb">`</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$GOV</span><span class="s2"> </span><span class="nv">$MIN</span><span class="s2"> </span><span class="nv">$MAX</span><span class="s2">"</span> <span class="p">|</span> awk <span class="s1">'{ printf "Governor: %s\nMin Freq: %4dMhz\nMax Freq: %4dMhz\n\n", $1, $2/1000, $3/1000 }'</span>
<span class="nv">C</span><span class="o">=</span><span class="sb">`</span>cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq<span class="sb">`</span>
<span class="nv">T</span><span class="o">=</span><span class="sb">`</span>cat /sys/class/thermal/thermal_zone0/temp<span class="sb">`</span>
<span class="nb">echo</span> <span class="s2">"`date +%H:%M` </span><span class="nv">$C</span><span class="s2"> </span><span class="nv">$T</span><span class="s2">"</span> <span class="p">|</span> awk <span class="s1">'{ printf "%s: %4dMhz, %-.2fC\n",$1, $2/1000,$3/1000 }'</span>
</pre>
<p>La sortie :</p>
<pre class="code bash literal-block">
>>> ➜ ~ ./monitor.sh
Governor: ondemand
Min Freq: 700Mhz
Max Freq: 700Mhz
<span class="m">22</span>:17:41: 700Mhz, <span class="m">42</span>.24C
</pre>Paginer les résultats avec MySQL Cli2012-11-30T19:59:00Valentin Brosseautag:http://blog.lesite.us,2012-11-30:paginer-les-resultats-avec-mysql-cli.html<p>Je n'ai jamais vraiment trouvé très pratique l'utilisation du client Mysql (Control-C qui quitte le programme, la non-pagination des résultats, etc). Mais aujourd'hui j'ai trouvé sur le net une super astuce qui permet (entre autre) la pagination des résultats. Cette astuce c'est la variable <strong>pager</strong>.</p>
<p>Pour l'utilisation rien de plus simple, il suffit de se connecter à un serveur MySql avec le client shell et de taper :</p>
<blockquote>
<pre class="doctest-block">
>>> mysql> pager more
PAGER set to 'more'
</pre>
</blockquote>
<p>Et à partir de ce moment, si le nombre d'enregistrements dépasse le nombre affichable sur l'écran MySql utilisera la commande système more pour limiter le nombre d'éléments à afficher exemple :</p>
<blockquote>
<pre class="doctest-block">
>>> +-----+------------+---------+---------+-----+-------+-------+----------------+----------+
| id | date | produit | famille | qte | HT | motif | pour | secteur |
+-----+------------+---------+---------+-----+-------+-------+----------------+----------+
| 337 | 16-10-2012 | 89 | 9 | 15 | 0.28 | 2 | | fulgent |
| 336 | 16-10-2012 | 242 | 9 | 2 | 6.95 | 2 | | fulgent |
| 335 | 15-10-2012 | 241 | 12 | 3 | 2.56 | 2 | | herbiers |
--Plus--
</pre>
</blockquote>
<p>Mais la puissance du truc ne s'arrête pas là, si par exemple vous voulez sortir le résultat dans vim, rien de plus simple</p>
<blockquote>
<pre class="doctest-block">
>>> mysql> pager vim -
</pre>
</blockquote>
<p>ou alors faire un grep</p>
<blockquote>
<pre class="doctest-block">
>>> mysql> pager grep --color -v 89
</pre>
</blockquote>
<p>etc. etc. etc... C'était la bonne astuce de la soirée :).</p>[Ubuntu] Nettoyer le /boot2012-11-30T19:42:00Valentin Brosseautag:http://blog.lesite.us,2012-11-30:ubuntu-nettoyer-le-boot.html<p>J'ai depuis quelques temps un grand mystère (récurrent) sur ma Ubuntu Server... Le MANQUE DE PLACE sur la partition /boot. C'est l'installation par défaut de <a class="reference external" href="http://www.online.net">Online</a> certes.... Mais ce que je ne comprend pas c'est pourquoi le <strong>apt-get upgrade</strong>; j'ai chercher plein de solutions différentes, mais au bout d'un moment je me retrouve toujours avec le /boot plein.</p>
<p>Donc, après quelques recherches je suis tombé sur THE commande, une petite boucle sympatique qui supprime tous les Kernels qui ne sont plus utiles sur la machine :</p>
<blockquote>
<pre class="doctest-block">
>>> dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v "linux-image-$(uname -r)|linux-image-generic" |while read n;do apt-get -y remove $n;done
</pre>
</blockquote>
<p>Pour l'utiliser rien de plus simple il suffit de se mettre en root et de la lancer. :).</p>
<p><a class="reference external" href="http://ubuntuforums.org/showthread.php?t=1435818#5">Source</a></p>Firefox 17 - Intégration de la Social API2012-11-21T00:00:00Valentin Brosseautag:http://blog.lesite.us,2012-11-21:firefox-17-integration-de-la-social-api.html<p>Et voilà, il aura fallu du temps, mais Firefox y vient.... Firefox dispose maintenant "Nativement" d'une API pour intégrer des contenus sociaux dans l'interface du navigateur. Le premier réseau social à en profiter est <a class="reference external" href="http://www.facebook.com/valentin.brosseau">Facebook</a>.</p>
<p>Pour l'interface rien de nouveau elle reprend tout simplement celle du site à savoir une barre latérale sur la hauteur du navigateur, barre qui sera maintenant affichée sur toutes les pages que vous visitez (si vous choisissez d'installer le plugin).</p>
<p>Pour ceux qui sont intéressés pour l'installer il suffit de se rendre <a class="reference external" href="https://www.facebook.com/about/messenger-for-firefox">ici</a></p>Demain est un grand jour!2012-11-12T16:22:00Valentin Brosseautag:http://blog.lesite.us,2012-11-12:demain-est-un-grand-jour.html<p>Demain est un grand jour pour la Galaxy Android, en effet demain c'est le lancement de plusieurs petites choses de Google en France.</p>
<div class="section" id="les-equipements">
<h1>Les équipements</h1>
<blockquote>
<p>Pleins de nouveaux mobiles :</p>
<ul class="simple">
<li><a class="reference external" href="https://play.google.com/store/devices/details?id=nexus_4_8gb">Nexus 4</a> (8 et 16Gb).</li>
<li><a class="reference external" href="https://play.google.com/store/devices/details?id=nexus_7_32gb_hspa">Nexus 7</a> 32Gb + 3G.</li>
<li><a class="reference external" href="https://play.google.com/store/devices/details?id=nexus_10_16gb">Nexus 10</a> (16 et 32Gb).</li>
</ul>
</blockquote>
</div>
<div class="section" id="les-services">
<h1>Les services</h1>
<blockquote>
<p>Deux "nouveau" services vont être disponible depuis la France :</p>
<ul class="simple">
<li><a class="reference external" href="http://play.google.com/music/">Google Music</a>.</li>
<li>Le Play store section <a class="reference external" href="https://play.google.com/store/music/">Music</a>.</li>
</ul>
</blockquote>
</div>Un peu de musique2012-11-12T16:11:00Valentin Brosseautag:http://blog.lesite.us,2012-11-12:un-peu-de-musique.html<p>La bonne surprise de la journée c'est la version live de Rolling in the deep.</p>
<br/><iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/-fmCoUjOMXU" width="560"></iframe><br/><br/>[Freebox] Timeshifting freebox player éteinte2012-08-19T22:23:00Valentin Brosseautag:http://blog.lesite.us,2012-08-19:freebox-timeshifting-freebox-player-eteinte.html<p>Pour ceux qui ne le savent pas, avec la <a class="reference external" href="http://freebox-v6.fr">Freebox</a> V6 il est possible de réaliser des enregistrements à tous moment c'est très pratique pour enregistrer un programme que l'on souhaite regarder plus tard, on peut aussi faire pause sur une émission pour la reprendre avec un léger différé, mais dans ce mode impossible d'éteindre le player c'est bien dommage surtout quand on veut reprendre une émission une heure plus tard...</p>
<p>La solution c'est l'enregistrement, il est en effet possible avec la freebox de démarrer la visualisation d'un enregistrement avant même que celui-ci soit terminé. Avec cette petite astuce fini la box allumée juste pour un programme en pause le temps de finir un BBQ ;).</p>Modification importante du rc.conf sous Archlinux2012-08-12T12:35:00Valentin Brosseautag:http://blog.lesite.us,2012-08-12:modification-importante-du-rcconf-sous-archlinux.html<p><strong>[EDIT]</strong> La partie Network a aussi été déplacée dans /etc/conf.d/netcfg</p>
<p>Il y a en ce moment des gros changements dans la distribution Archlinux (abandons de Grub, migration vers systemd, modification de glibc, etc.). Et ce n'est pas fini l'autre grosse modification c'est celle concernant le <strong>rc.conf</strong>. On passe donc d'un fichier unique à 6 fichiers différents (voir plus)...</p>
<ul class="simple">
<li><strong>/etc/hostname</strong> (Nom de la machine sur le réseau)</li>
<li><strong>/etc/modules-load.d/*</strong> (Contient les modules à charger -Bonne nouvelle on peut découper en plusieurs fichier-)</li>
<li><strong>/etc/modprobe.d/blacklist.conf</strong> (Contient les modules blacklister)</li>
<li><strong>/etc/locale.conf</strong> (Langue pour le système)</li>
<li><strong>/etc/vconsole.conf</strong> (Langue du clavier)</li>
<li><strong>/etc/timezone</strong> (Fuseau horaire)</li>
<li><strong>/etc/conf.d/netcfg</strong> (Configuration des interfaces réseau)</li>
</ul>
<p>Et pour le rc.conf il est réduit à ça plus simple expression :</p>
<blockquote>
<pre class="doctest-block">
>>> [valentin@valentinpc output]$ cat /etc/rc.conf
#
# /etc/rc.conf - configuration file for initscripts
#
# Most of rc.conf has been replaced by various other configuration
# files. See archlinux(7) for details.
#
# For more details on rc.conf see rc.conf(5).
#
DAEMONS=(syslog-ng dbus @networkmanager @crond acpid cpufreq)
# Storage
#
# USEDMRAID="no"
# USELVM="no"
</pre>
</blockquote>
<p>Chez moi la nouvelle configuration donne :</p>
<blockquote>
<pre class="doctest-block">
>>> [valentin@valentinpc src]$ cat /etc/hostname
valentinpc
</pre>
<pre class="doctest-block">
>>> [valentin@valentinpc src]$ cat /etc/modules-load.d/modules
fuse
acpi_cpufreq
</pre>
<pre class="doctest-block">
>>> [valentin@valentinpc src]$ cat /etc/locale.conf
LOCALE=fr_FR.UTF-8
LC_COLLATE=C
</pre>
<pre class="doctest-block">
>>> [valentin@valentinpc src]$ cat /etc/vconsole.conf
KEYMAP="fr-pc"
FONT="lat9w-16"
FONT_MAP="8859-1_to_uni"
</pre>
<pre class="doctest-block">
>>> [valentin@valentinpc src]$ cat /etc/timezone
Europe/Paris
</pre>
<pre class="doctest-block">
>>> [valentin@valentinpc src]$ cat /etc/conf.d/netcfg
# interface=
# address=
# netmask=
# gateway=
</pre>
</blockquote>
<p>Donc rien de bien compliquer en soit, mais je sens que les prochaines installations de Archlinux seront vraiment, mais alors vraiment moins fun... (surtout avec dans le même temps l'abandon d'Aif :()</p>
<p>Merci à <a class="reference external" href="http://frederic.bezies.free.fr/blog/?p=8017">+Frederic Bezies</a> pour son super article :).</p>
<p>Un petit tableau récapitulatif est disponible dans le Wiki anglais : <a class="reference external" href="https://wiki.archlinux.org/index.php/Beginners%27_Guide#Configure_the_system">ICI</a></p>Google Plus bookmarklet2012-07-29T20:00:00Valentin Brosseautag:http://blog.lesite.us,2012-07-29:google-plus-bookmarklet.html<p>Je l'avais partagé il y a quelques temps sur les réseaux sociaux, mais jamais sur mon blog donc... Google+ j'aime bien, par contre ce que j'aime moins c'est que peu de site ont intégrés le bouton de partage. Donc pour palier à ça j'ai écrit rapidement un petit bookmarklet qui permet de partager n'importe quelle page sur Google+.</p>
<p>Pour ajouter le bookmarklet rien de plus simple, il suffit de glisser le lien ci-dessous dans votre barre de favoris :</p>
<blockquote>
<span class="raw-html"><a href="javascript:javascript:var b=document.body;z=document.createElement('script');void(z.src='https://apis.google.com/js/plusone.js');void(b.appendChild(z));elem=document.createElement('div');elem2=document.createElement('div');void(elem2.setAttribute('style','position: fixed; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(255, 255, 255);border-top:2px solid red;border-left:2px solid green;border-right:2px solid blue;border-bottom:2px solid yellow;padding:5px; top: 8px; right: 8px; z-index: 2147483647; background-position: initial initial; background-repeat: initial initial; '));void(elem.setAttribute('class','g-plusone'));void(elem2.appendChild(elem));void(b.appendChild(elem2));void(gapi.plusone.go());">Google Plus +1</a></span></blockquote>
<p>Et voilà le tour est joué, vous pouvez maintenant faire des +1 partout :).</p>
<p>PS: Pour twitter cela existe aussi (ce n'est pas de moi mais ça fonctionne bien) :</p>
<blockquote>
<span class="raw-html"><a href="javascript:(function(){window.twttr=window.twttr||{};var D=550,A=450,C=screen.height,B=screen.width,H=Math.round((B/2)-(D/2)),G=0,F=document,E;if(C>A){G=Math.round((C/2)-(A/2))}window.twttr.shareWin=window.open('http://twitter.com/share','','left='+H+',top='+G+',width='+D+',height='+A+',personalbar=0,toolbar=0,scrollbars=1,resizable=1');E=F.createElement('script');E.src='http://platform.twitter.com/bookmarklets/share.js?v=1';F.getElementsByTagName('head')[0].appendChild(E)}());">Partager sur Twitter</a></span></blockquote>Sitemap générator : Python webcrawler2012-07-29T18:00:00Valentin Brosseautag:http://blog.lesite.us,2012-07-29:sitemap-generator-python-webcrawler.html<p>[EDIT] Le projet avance maintenant sur Github : <a class="reference external" href="https://github.com/c4software/python-sitemap">ici</a></p>
<p>Dans le cadre de mon boulot j'ai eu à mettre en place une <a class="reference external" href="http://www.sitemaps.org/">sitemap</a> pour un site complètement dynamique (les pages sont créée via une administration et via un ensemble de pattern pour la partie dynamique du site) en gros il était très compliqué de générer efficacement une liste de l'ensemble des urls de façon automatique. Le plus simple a été de faire un petit crawler web qui navigue sur le site de façon périodique pour mettre à jour le fichier sitemap.xml.</p>
<p>Et vu que j'adore le python et bien... Vous avez deviné la suite ;). J'avais fait quelques recherches sur le web avant mais j'ai pas trouvé de script simple pour crawler un site web. Enfin si mais il y avait toujours plus de dépendance je voulais en avoir aucune (plus simple pour le déploiement en production). Le script utilise python3 (histoire d'être moderne ;)).</p>
<p>Pour utiliser le script rien de plus simple (en prenant en compte que <strong>python == python3</strong>):</p>
<blockquote>
<pre class="doctest-block">
>>> python main.py --domain http://blog.lesite.us --output sitemap.xml
</pre>
</blockquote>
<p>Si aucun output n'est spécifié le sitemap s'affichera sur la console.</p>
<p>Pour récupérer le script c'est par <a class="reference external" href="https://github.com/c4software/python-sitemap">ici</a></p>
<p>PS : N'oubliez pas que c'est une première version ;).</p>
<p><em>EDIT : J'avais oublié, j'ai ajouté la possibilité d'ignorer certaines extensions lors du "crawl" :</em></p>
<blockquote>
<pre class="doctest-block">
>>> python main.py --domain http://blog.lesite.us --output sitemap.xml --skipext pdf --skipext xml
</pre>
</blockquote>Activer la nouvelle interface de Youtube2012-06-17T00:00:00Valentin Brosseautag:http://blog.lesite.us,2012-06-17:activer-la-nouvelle-interface-de-youtube.html<p>Certains on peut être vu l'information passée sur les réseaux sociaux, <a class="reference external" href="http://www.youtube.com">YouTube</a> est <span class="strike">(encore)</span> en train de déployer une nouvelle interface... Mais comme d'habitude avec Google c'est uniquement disponible qu'à certaine personne! Enfin dans leur idée, car sur Internet quasi tout est possible alors pour ceux qui sont intéressés voilà comment faire pour accéder en avant première à la nouvelle version de <a class="reference external" href="http://www.youtube.com">YouTube</a> :</p>
<blockquote>
<pre class="doctest-block">
>>> Ouvrez votre navigateur et dans la console de celui-ci (exemple F12 sous Chrome) vous tapez ceci :
>>> document.cookie="VISITOR_INFO1_LIVE=nH7tBenIlCs;path=/;domain=.youtube.com";window.location.reload();
</pre>
</blockquote>
<p>Bon le changement ne semble pas radicale, mais c'est déjà mieux que la version précédente qui pour moi est une plaie avec de multiples abonnements...</p>Adb sur TCP/IP (Adb au travers du wifi)2012-06-12T00:00:00Valentin Brosseautag:http://blog.lesite.us,2012-06-12:adb-sur-tcpip-adb-au-travers-du-wifi.html<p>Si comme moi, vous utilisez une rom Cyanogen, vous avez "la chance" de pouvoir paramétrer votre téléphone pour accepter les connexions de type "ADB" au travers du réseau Wifi. Pour cela rien de plus simple :</p>
<p>Paramètres >> Options pour les développeurs >> ADB sur TCP/IP</p>
<p>Pour accéder à votre téléphone (en ligne de commande) depuis votre ordinateur rien de plus simple</p>
<blockquote>
<pre class="doctest-block">
>>> adb connect <ip_du_telephone>
connected to <ip_du_telephone>:5555
>>> adb shell
shell@android:/ $
</pre>
</blockquote>Mon .vimrc2012-06-10T00:00:00Valentin Brosseautag:http://blog.lesite.us,2012-06-10:mon-vimrc.html<p>Pour ceux que ça interesses j'ai partagé il n'y a pas longtemps une image de mon desktop sur <a class="reference external" href="https://plus.google.com/104883394321573041618/posts/RYiHafYfU7e">Google+</a>, dans l'image on pouvais y voir mon vim. J'ai mis longtemps avans de trouver une configuration vim qui me correspondait bien donc le voici mon fichier (vous l'avez tous attendu) <a class="reference external" href="https://www.dropbox.com/s/5pfgqvzs7qrpw2h/vimrc">.vimrc</a></p>
<dl class="docutils">
<dt>Le rendu de mon vim:</dt>
<dd><img alt="http://db.tt/AGzV4cYv" class="first last" loading="lazy" src="http://db.tt/AGzV4cYv"/>
</dd>
</dl>
<p>Pour info mon .vimrc utilise Vundle pour les plugins, vundle c'est simplement un gestionnaire de plugin pour vim, vous pourrez le trouver ici : <a class="reference external" href="https://github.com/gmarik/vundle">Vundle</a>.</p>
<dl class="docutils">
<dt>PS: Deux petit raccourci rapide:</dt>
<dd><ul class="first last simple">
<li>ctrl+f, pour faire apparaitre "Nerd Tree" qui permet de naviguer dans l'arborescence de fichier.</li>
<li>ctrl+o, pour faire apparaitre "Commande-T" qui permet de d'ouvrir rapidement un fichier (avec de la completion).</li>
</ul>
</dd>
</dl>Un petit serveur static en python (et en une seul ligne)2012-06-03T22:52:00Valentin Brosseautag:http://blog.lesite.us,2012-06-03:un-petit-serveur-static-en-python-et-en-une-seul-ligne.html<p>Si comme moi vous êtes ammené régulirement à partager rapidement (et temporairement) le contenu static (html, css, ou autre d'ailleurs...) d'un dossier de votre système vous serez surement content d'apprendre que vous avez la possibilité en python de faire cela très simplement.</p>
<p>En fonction de la version de python disponible sur votre machine ça va donner :</p>
<div class="section" id="python-2-x">
<h1>Python 2.x:</h1>
<blockquote>
<pre class="doctest-block">
>>> python -m SimpleHTTPServer
</pre>
</blockquote>
</div>
<div class="section" id="python-3-x">
<h1>Python 3.x:</h1>
<blockquote>
<pre class="doctest-block">
>>> python -m http.server 8000
</pre>
</blockquote>
<dl class="docutils">
<dt>Et le must du must c'est de faire un petit alias dans votre "~/.bashrc", un petit exemple en rajoutant l'alias à la main :</dt>
<dd><pre class="first last doctest-block">
>>> [valentin@valentinpc ~]$ alias serve="python -m http.server 8000"
>>> [valentin@valentinpc ~]$ serve
>>> Serving HTTP on 0.0.0.0 port 8000 ...
</pre>
</dd>
</dl>
<p>Enjoy!</p>
</div>Bot minimaliste avec SleekXMPP2012-05-27T18:16:00Valentin Brosseautag:http://blog.lesite.us,2012-05-27:bot-minimaliste-avec-sleekxmpp.html<p>C'est toujours rigolo de faire un bot jabber, j'ai découvert il y a peu un framework XMPP qui me semble sympathique <a class="reference external" href="http://sleekxmpp.com">SleekXMPP</a>.</p>
<p>L'installation du framework c'est comme d'habitude pour ma part :</p>
<ul>
<li><dl class="first docutils">
<dt>Création d'un virtualenv :</dt>
<dd><pre class="first last doctest-block">
>>> virtualenv sleekxmpp
>>> source sleekxmpp/bin/activate
</pre>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt>Installation de sleekxmpp :</dt>
<dd><pre class="first last doctest-block">
>>> easy_install sleekxmpp
</pre>
</dd>
</dl>
</li>
</ul>
<p>Le gros plus par rapport aux autres framework que j'avais déjà testé c'est qu'il ne possède quasi pas de dépendance. Donc pour tester je me suis amusé à faire un bot tout simple :</p>
<pre class="code python literal-block">
<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">from</span> <span class="nn">sleekxmpp</span> <span class="kn">import</span> <span class="n">ClientXMPP</span>
<span class="kn">from</span> <span class="nn">sleekxmpp.exceptions</span> <span class="kn">import</span> <span class="n">IqError</span><span class="p">,</span> <span class="n">IqTimeout</span>
<span class="k">class</span> <span class="nc">TimeTrackBot</span><span class="p">(</span><span class="n">ClientXMPP</span><span class="p">):</span>
<span class="n">my_jid</span> <span class="o">=</span> <span class="s2">""</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">jid</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span>
<span class="n">ClientXMPP</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">jid</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">my_jid</span> <span class="o">=</span> <span class="n">jid</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_event_handler</span><span class="p">(</span><span class="s2">"session_start"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_start</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_event_handler</span><span class="p">(</span><span class="s2">"message"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">session_start</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">send_presence</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">get_roster</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
<span class="k">if</span> <span class="n">msg</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'chat'</span><span class="p">,</span> <span class="s1">'normal'</span><span class="p">):</span>
<span class="n">commande</span> <span class="o">=</span> <span class="n">msg</span><span class="p">[</span><span class="s1">'body'</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">' '</span><span class="p">)</span>
<span class="n">msg</span><span class="p">[</span><span class="s1">'body'</span><span class="p">]</span> <span class="o">=</span> <span class="s2">" "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">commande</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">retour</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"cmd_"</span><span class="o">+</span><span class="n">commande</span><span class="p">[</span><span class="mi">0</span><span class="p">])(</span><span class="n">msg</span><span class="p">)</span>
<span class="n">msg</span><span class="o">.</span><span class="n">reply</span><span class="p">(</span><span class="n">retour</span><span class="p">)</span><span class="o">.</span><span class="n">send</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">not_found</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">not_found</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
<span class="n">msg</span><span class="o">.</span><span class="n">reply</span><span class="p">(</span><span class="s1">'Commande introuvable.'</span><span class="p">)</span><span class="o">.</span><span class="n">send</span><span class="p">()</span>
<span class="sd">"""
Commande utilisateur
"""</span>
<span class="k">def</span> <span class="nf">cmd_bonjour</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
<span class="n">username</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="s1">'from'</span><span class="p">])</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'@'</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">message</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="s1">'body'</span><span class="p">])</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"@"</span><span class="p">)</span> <span class="c1"># Juste pour info le message ce trouve ici</span>
<span class="k">return</span> <span class="s1">'Bonjour </span><span class="si">{0}</span><span class="s1">.format(username)</span>
<span class="k">def</span> <span class="nf">autrecmd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">"STUB"</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">,</span><span class="nb">format</span><span class="o">=</span><span class="s1">'</span><span class="si">%(levelname)-8s</span><span class="s1"> </span><span class="si">%(message)s</span><span class="s1">'</span><span class="p">)</span>
<span class="n">xmpp</span> <span class="o">=</span> <span class="n">TimeTrackBot</span><span class="p">(</span><span class="s1">'username@server'</span><span class="p">,</span> <span class="s1">'password'</span><span class="p">)</span>
<span class="n">xmpp</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
<span class="n">xmpp</span><span class="o">.</span><span class="n">process</span><span class="p">(</span><span class="n">block</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</pre>
<p>ça reste ultra minimaliste, mais si ça peu aider quelqu'un pour un petit bot ;).</p>Migration vers pélican2012-05-22T00:00:00Valentin Brosseautag:http://blog.lesite.us,2012-05-22:migration-vers-pelican.html<p>Bon un peu de nouveau sur ce blog.... même si personne qui passe réellement mise à part le robot Google (et encore ?) j'ai décidé de migrer celui-ci vers <a class="reference external" href="http://pelican.notmyidea.org">Pelican</a>.</p>
<p>Pelican contrairement à Worpress ne génère pas dynamique le contenu à chaque requête. Le blog est "compilé" ou plutôt généré une fois après la rédaction d'article. Le résultat de la génération c'est un ensemble de fichier HTML statique que l'on peut héberger vraiment n'importe où (Dropbox, Github, un micro vps, etc).</p>
<p>Pourquoi changer? Tout simplement pour m'amuser, utiliser des nouveaux trucs. L'inspiration première vient de <a class="reference external" href="http://phollow.fr">Phollow.fr</a>. qui a migré sont blog vers quelques chose de quasi similaire mais à base de ruby (mais comme ruby me file des boutons... j'ai pris un équivalent en Python ;))</p>Abandonner PHP2010-06-11T14:24:00Valentin Brosseautag:http://blog.lesite.us,2010-06-11:abandonner-php.html<p>Et bien pourquoi pas. J'hésite, je tests… Je ne pense pas qu'il soit possible dans mon cas d'abandonner PHP, car j'ai plusieurs projets personnels reposant sur ce langage, mais à l'avenir je me demande si je ne vais pas privilégier le python avec des frameworks comme <strong>PylonsHQ</strong> ou <strong>Django</strong>.</p>
<p>C'est sûr que c'est différents, qu'il me faudra un temps d'adaptation, mais j'y pense <span class="strike">(et puis j'oublie...)</span></p>
<p>Bon c'est pas le tout mais je doit debugger du PHP ;).</p>