/dev/blah

things i want to remember, things i want to share

quand mv et rename ne suffisent pas... python

written by tshirtman, on 11/28/11 5:49 PM.

Ayant pris une trentaine de screenshots, pour avoir un backup de mes slides pour une présentation (ce soir à la cantine, à paris, pour parler de kivy oui je prévient vachement à l’avance). j’étais un peu embété par le format de nommage par défaut de gnome, indiquant “Capture du … xx:xx:xx.png”.

J’ai réfléchis à une utilisation de rename, mais à part retirer la partie commune, je n’avançais pas beaucoup, car bien sur, je voulais en conserver l’ordre. Du coup, python à la rescousse!

# chopper toutes les images dans une variable
a = filter(lambda x: x.endswith('.png'), os.listdir('.'))
# s'assurer qu'elles sont bien dans l'ordre alphabétique (contenant l'heure, et donc, dans le bon ordre)
a.sort()
import shutil
for i, nom in enumerate(a):
    shutil.move(nom, str(i)+'.png')

 

Et voilà, les images ont un nom tout propre, et sont toujours dans l’ordre.

À propos de la "percée" de Mint, par rapport à Ubuntu.

written by tshirtman, on 11/25/11 2:26 PM.

Je reprends ici un commentaire que j’ai laissé sur le blog de Cyrill Borne, puisqu’il était long comme un billet de blog, autant le publier ici aussi.

Le classement distrowatch est indicateur très peu fiable, et le fait que mint soit passé devant ne veux pas dire grand chose.

Mais je ne suis pas d’accord sur unity, sur lequel on crache beaucoup sans chercher à le comprendre, et par pur rejet réactionnaire, ce n’est pas parfait, certes, mais c’est une ergonomie bien complete et qui marche, excepté quelques cas de bords. On peut tout à fait être très productif avec, et même si elle est pensé pour le future (tablettes & co) elle n’y a pas sacrifié l’efficacité, et n’est pour l’instant qu’une transition vers ce paradygme (et ne serait pas utilisable sur de telles interfaces). Il reste des bugs, oui, il peut manquer des choses, oui, mais l’ergonomie n’est pas “en bois”, elle marche et permet vraiment de bosser, bien mieux qu’avec gnome-panel.

Et en effet, gnome-shell ne reçoit guère meilleur accueil, les gens veulent ce qu’ils ont, et pleurent surtout par ce qu’ils ne sont pas capables d’évoluer, ce que je trouve assez affolant pour des gens qui avaient pourtant franchis le pas une fois, en passant de windows à linux, le changement qu’on leur propose est pourtant bien moindre!

Et oui, pas besoin de faire un fork pour proposer des choses, sauf quand les changements proposés sont refusés par le projet parent, les gens font des forks pour un peu tout est n’importe quoi de nos jours. Ubuntu n’a été un fork de Debian qu’après que mark ait échoué a financer des développements internes à Debian. Unity n’a été forké de Gnome-shell, qu’après que la collaboration de canonical avec le projet gnome se soit révélé impossible, pour différence de vision.

Le changement apporté par mint à l’origine, était une intégration de codecs et pilotes proprios d’origine, quelque chose d’illégale, mais alléchant pour le débutant, bien sur, ils attirent maintenant les nostalgiques de gnome-panel, par un travail pas inintéressant, mais essentiellement axée sur le passé, pas sur l’innovation. Je ne leurs reproche pas, c’est leur droit, mais que les utilisateurs crachent sur ubuntu, et se ruent sur mint, qui n’est qu’une dérivé tournée vers le non respect des licences, et le contraire du progrès ergonomique, ça à de quoi déprimer le libriste tourné vers l’innovation.

zine img_upload

written by tshirtman, on 10/24/11 9:20 AM.

Un autre petit plugin zine, tout simple, mais qui simplifie la vie, pour envoyer des images sur le blog pendant qu’on écrit un article.

Le fonctionnement est simple, un bouton javascript “click to upload image” est ajouté entre le formulaire de titre et de texte:

cliquer sur ce lien permet de choisir un fichier sur son disque, une fois validé, le lien vers l’image apparait en dessous du bouton javascript, y’a plus qu’a copier/coller :). Si une image du même nom existait, des caractères aléatoires sont ajoutés avant l’extension jusqu’à trouver un nom disponible, afin de ne pas écraser les images existantes.


Un panneau de configuration simple est disponible, pour configurer les deux paramètres essentiels:

  • Le dossier ou stocker les images, ce dossier dois exister, il n’y a pas de gestion d’erreurs pour l’instant, si c’est mal configuré, vous ne verrez juste pas de lien apparaitre :).
  • L’url pour accéder à ce dossier pour les clients, soit vous configurez votre hébergement pour avoir un dossier pour les fichiers statiques, soit vous vous débrouillez pour poser ce dossier dans la partie statique de zine, et vous donnez l’url correspondante.

Le code est dispo sur github: https://github.com/tshirtman/zine_upload_images.

comment faire un mirroir de copwatchnord-idf.org

written by tshirtman, on 10/16/11 11:51 AM.

La justice ayant rendu sa décision, et celle ci étant de demander aux FAI de bloquer l’adresse copwatchnord-idf.org, j’ai décidé de faire une copie du site utilisable, au cas ou, comme ce n’est pas simple, je vais essayer de décrire les différentes étapes que j’ai réalisé pour avoir un site utilisable ici

  1. aspiration du site
    wget -r -np http://copwatchnord-idf.org
  2. aller dans le dossier du site:
    cd copwatchnord-idf.org
  3. mettre en forme les noms de fichiers
    rename 's/index.html\?q\=//' *
    rename 's/$/.html/' *
    mv sites.html sites
    mkdir node
    mv node*.html node
    cd node
    rename 's/node\%2F//'
    cd .. 
    mkdir taxonomy
    mv taxonomy*.html taxonomy
    cd taxonomy
    mkdir 10 11 12 14 15 16 17 20 21 22 23 26 9
    oui, je sais, peu mieux faire, mais c’était pas insurmontable à taper non plus ^^
    find -type d -exec mv {}%2Ffeed.html {}/feed.html \;
    bon, ma méthode était plus laborieuse pour ça, mais je viens d’y penser et ça semble bien marcher, malgré les erreurs affichées.
  4. corriger les liens (se placer dans le dossier racine si vous n’y êtes pas, tous les fichiers du site doivent être impactés).
    find -type f -exec sed -i 's/\?q\=//' {} \;
    
  5. il vous faut maintenant configurer un serveur web de façon à ce que ce dossier soit servis à la racine d’un domaine ou sous domaine: pour apache, créez un fichier dans /etc/apache2/sites-available/ avec ce contenu (remplacez les éléments nécessaires ;)):
    <VirtualHost *:80>
            ServerAdmin un_mail
            ServerName votre_nom_de_domaine
    
            DocumentRoot dossier_contenant_tout_notre_mirroir
            <Directory dossier_contenant_tout_notre_mirroir>
                    Options Indexes FollowSymLinks MultiViews
                    AllowOverride None
                    Order allow,deny
                    allow from all
            </Directory>
    
            ErrorLog /var/log/apache2/error.log
    
            # Possible values include: debug, info, notice, warn, error, crit,
            # alert, emerg.
            LogLevel warn
    
            CustomLog /var/log/apache2/access.log combined
    
    </VirtualHost>
    
    
    puis:
    sudo a2ensite le_nom_du_fichier
    sudo apache2ctl graceful
  6. voilà, je vois explique pas comment configurer votre nom de domaine, n’oubliez pas qu’on peut en prendre des gratuits (même si moche) sur noip.com ou dydns.com, assurez vous que ça pointe bien vers votre serveur.

Je ne donne pas l’adresse de mon mirroir pour l’instant, mais je la donnerait quand le blocage demandé par la justice française sera effectif, ainsi qu’une archive contenant tout ça.

l'eeepad tranformer, comme plateforme de dev.

written by tshirtman, on 9/13/11 11:09 AM.

Qu’est ce que c’est?

Tout simplement une tablette android, avec un clavier en station d’accueil, ce qui permet de s’en servir aussi bien comme une tablette tactile, que comme un netbook (10″, c’est grand pour ce dont j’ai l’habitude, mais ça reste un netbook). L’écran multitouch 10″, et l’autonomie de 16h (au bas mot, je pense avoir fait bien plus hier) étant des points très forts. Cependant, le système fournis à l’interieur est android, ce qui est assez agréable pour l’utilisation en tactile, mais beaucoup, beaucoup moins pour l’utilisation au clavier, surtout pour un fanatique du raccourcis clavier et de l’interface ligne de commande comme moi.

Adaptations

Rooter et installer un chroot linux

Sous linux, le script fournis ici permet de rooter le système en quelques minutes, j’ai regardé vite fait le code avant, et c’est assez simple et clean, bon outil :) (comme d’hab basé sur le très pratique “adb” fournis par le sdk google). Ensuite, il faut installer les paquets “busybox” et “linux installer” depuis le market, lancer le premier (sinon linux installer n’arrive à rien), et le second quand c’est terminé, j’ai du m’y reprendre à plusieurs fois, mais j’ai finit par avoir un chroot ubuntu tout à fait fonctionnel.
J’ai créé un utilisateur non root afin de pouvoir travailler sereinement, que j’ai ajouté au groupe “admin”. J’ai aussi ajouté la commande “login” dans /etc/init.android/rc_enter.sh, afin qu’il me demande mon nom d’utilisateur et mon mot de passe, au lieu de me connecter en root, dans une boucle.

while true
do
    login
done

Bien sur ce n’est pas une solution parfaite, et sécuriser un tel environnement m’apparait vraiment difficile, sachant que le root de la machine ne demande pas de mot de passe, juste de cliquer un bouton a l’écran. Mais bon, la machine en elle même a un mot de passe graphique assez complexe, et en mode invisible. L’intérêt est plus d’avoir un lancement de session standard.

 

Réseau

De base, notre utilisateur n’a pas accès au réseau, celui ci ne marche que pour root, il s’agit des effets des sécurité d’accès au réseau sous android, il faut donc créer un groupe spécifique dédié à ça, avec le bon gid (correspondant à celui équivalent sous android).

sudo addgroup --gid 3003 inet

et ajouter notre utilisateur au groupe

sudo addgroup $USER inet

Si il est manquant, penser à ajouter “localhost” à la fin des deux premières lignes dans /etc/hosts, et si les requêtes sur un host ne résolvent pas, il peut être une solution de remplacer le nameserver par un autre dns dans /etc/resolv.conf . Personellement j’ai mis ceux de google.

nameserver 8.8.8.8
nameserver 8.8.4.4

La modification peut être faite de façon plus définitive dans le script linuxchroot.sh de l’os hote.

 

Nous avons maintenant un réseau parfaitement fonctionnel! Ce qui va nous permettre d’utiliser apt :D.

Programmes Ubuntu

Le strict minimum pour bosser…

sudo apt-get install git vim byobu

Je conseil de configurer byobu pour se lancer à la connexion: ‘ctrl-q @’ pour voir les options, aller sur la dernière, valider, aller à droite, pour sauter sur exit, et valider.
Il semble que les raccourcis avec ctrl soient en qwerty… je ne sais pas si c’est un bug du terminal ou pas, je regarderais si possible, c’est vivable pour l’instant.

 

Terminal

Peu satisfait du fonctionnement clavier de connectbot, je suis resté un moment sur Android Terminal Emulator, mais une fois installé mes applications, j’ai vite constaté que l’utilisation de vim dans ce context était difficile, du fait du comportement de la touche back (qui est à la place d’échap sur le clavier), qui est de fermer le terminal… même si byobu (c’est gnu screen, mais avec une config sympa en fait), rends la chose moins douloureuse, c’est quand même un peu lourd). Bref, j’ai finit par forker Android Terminal Emulator sur github, pour me faire un patch pour ça (j’ai du commenter un bout de code pour ça compile, et c’est sans doute un peu moche, mais bon, le java et moi…) edit: ce n’est plus nécessaire, android terminal emulator propose maintenant une option pour la gestion de la touche échap :). J’ai aussi salement changé les couleurs disponibles, mais pas de patch pour ça, c’est vraiment trop moche, et c’est franchement pas sorcier, enfin, maintenant j’ai le mauve ubuntu en fond d’écran :P).

sdcard dans le chroot

Afin de pouvoir éditer directement une applie android (écrite en kivy, donc c’est du python, donc je peux :)), j’ai partagé la carte sd interne avec le chroot ubuntu, avec ces commande, depuis le terminal chroot (a faire une seule fois):

sudo mkdir /sdcard
sudo addgroup sdcard_rw --gid 1015
sudo adduser $USER sdcard_rw

et depuis le shell android:

su
mount -o bind /mnt/sdcard /data/local/mnt/Linux/sdcard

 

Ce qu’il reste à faire…

 

  • Faire fonctionner la touche alt, qui serait utile pour certains programmes cli
  • Laisser la keymap en qwerty quand ctrl est appuyé.
  • avoir un meilleur accès au logs (j’ai bien trouvé une app, mais elle se met en mode portrait, même quand le clavier est branché, c’est malin…

 

image proxifier

written by tshirtman, on 9/11/11 4:42 PM.

Juste pour signaler un petit outil que j’ai réalisé pour dépanner une connaissance, celle ci ayant parfois “besoins” d’accéder as des images sur des domaines bloqués dans son entreprise, et qui donne l’occasion de montrer un peu de code flask. C’est ici, tout simple, ça ne marche que pour les contenus simples (image/vidéo), pas les pages complêtes, y’a sans doute moyen de faire mieux, mais c’était pour dépanner :).

zine_social

written by tshirtman, on 7/22/11 1:11 AM.

Juste pour annoncer un petit plugin zine que j’ai codé, permettant d’ajouter une barre de réseau sociaux en bas des posts de blogs, seuls google +1, le tweet this et le like de facebook sont géré pour l’instant, mais toute contribution est bienvenue, c’est vraiment juste ajouter le code du bouton avec la variable “url” à la bonne place, et zou…

Le code est dispo sur github, et vous pouvez normalement voir le résultat en dessous de ce post :)

usage de pylint

written by tshirtman, on 7/4/11 3:31 AM.

Pylint

J’ai utilisé pas mal pylint ces dernières semaines, pour me rendre compte de l’état général d’USF, et j’avoue, que c’était pas trop brillant, vu qu’il m’offrait une note généreuse de 2.5/10 environ… pour mes 11000 lignes de codes, ça promettait du boulot.

Et ben oui, d’où le “ces dernières semaines” mais je suis pas mécontent du résultat, beaucoup de namespaces ont été nettoyés, des logiques ont été simplifiées un peu partout, beaucoup de choses ont été documentés, et même certains refactoring conséquents ont été entrepris, et assez bien aboutis

Comment?

Et bien en lançant

pylint usf
à la racine du projet, bien sur (vu que le plus gros de mon code est dans le module usf), voir des cibles plus précises quand on sait qu’on a beaucoup de boulot sur un endroit.

Mais… il y a un mais, en effet, on peut, et on est en droit de ne pas être d’accord avec les opinions de pylint, sur ce qui est bon ou pas, si je suis d’accord sur le fait qu’il applique la pep8 aussi fortement que possible, le voir dénigrer map/filter/reduce, sous prétexte que Guido préfère écrire

[ x for x in S if P(x) ]
plutôt que
filter(P,S)
(parait que c’est “plus simple et plus lisible”…).
ou m’engueuler par ce que mon “i” dans
for i in items:
    i.update()
est une variable d’une lettre, je ne suis pas d’accord, il y a des endroit ou ça fais sens, et même
class Entity(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
Avoir des attributs d’une longueur de 1 caractère n’est pas un crime non plus…

Heureusement, pylint est fortement configurable, et on peut fortement influencer ses messages remontés, ainsi que sa note (héhé) en lui faisant utiliser une configuration alternative… le plus simple pour cela, est de lui faire cracher sa configuration actuelle, de la sauvegarder, et de la modifier:

pylint --generate-rcfile > pylintrc
vim pylintrc # oui, bon, le meilleur éditeur que vous avez sous la main quoi ;)
Le nommer ainsi permet à pylint de le détecter automatiquement s’il est dans le dossier courant, on peut aussi le placer dans son dossier ~/ et le nommer “.pylintrc” si on veux que ce soit le fichier de configuration par défaut.

Qu’est ce que je change (moi, vous c’est vous qui voyez à l’usage ;) ?

disable=W0201
(Warning 0201) Oui, ma classe n’est pas toujours complète au sortir du __init__, c’est notamment le cas pour toutes les classes d’un module, du fait de sa construction particulière, c’est vrai que plus d’utilisation de super() pourrait sans doute éviter ça… on verra si je réactive ce message un de ces 4, dans certains cas, cependant, c’est bien agréable de profiter du dynamisme de notre langage…
include-ids=yes
Je veux voir l’identifiant des erreurs remontées, pour pouvoir les black-lister si je ne suis pas d’accord ;) ou les comprendre en cherchant sur google, si le message n’est pas assez clair (ça n’arrive pas souvent :)).
attr-rgx=[a-z_][a-z0-9_]{0,30}$

argument-rgx=[a-z_][a-z0-9_]{0,30}$

variable-rgx=[a-z_][a-z0-9_]{0,30}$
la regex qui valide les noms de variables locale, d’attribut ou d’argument passé à un callable, afin d’autoriser les noms d’une lettre, comme dit plus haut (à noter que connaître un peu les regexp, ça sert trèèèès souvent… ;))
bad-functions=apply,input,exec,eval
par ce que la prog fonctionnelle (filter/map/reduce) je ne vois pas de raisons de m’en priver…

Voilà, je change pas grand chose en fait, c’est plutôt bon signe :).

Conclusion?

ma note actuelle? ;)

[SNIP]


Report
======
3763 statements analysed.

Messages by category
--------------------

+-----------+-------+---------+-----------+
|type       |number |previous |difference |
+===========+=======+=========+===========+
|convention |103    |103      |=          |
+-----------+-------+---------+-----------+
|refactor   |55     |55       |=          |
+-----------+-------+---------+-----------+
|warning    |58     |58       |=          |
+-----------+-------+---------+-----------+
|error      |6      |6        |=          |
+-----------+-------+---------+-----------+

[SNIP]


Global evaluation
-----------------
Your code has been rated at 9.35/10 (previous run: 9.35/10)

[SNIP]
Et oui, il manque encore des docstrings, notamment en entête de fichiers, mais ça progresse…

usf 0.1.6

written by tshirtman, on 5/8/11 7:27 PM.

L’équipe de développement d’ultimate-smash-friends, a la joie et le bonheur d’annoncer une nouvelle version du projet, apportant son lot d’améliorations :), et enfin depuis longtemps, une nouvelle version synchronisé entre les différentes plateformes supportées (Linux/Windows/MacOsX).

Pour récapituler les changements depuis la dernière version, on pourras noter une sensible améliorations de l’intelligence artificielle (qui commence à me donner des difficulter pour gagner les parties, c’est bon signe :)), la correction d’un bug bloquant sous windows vista/seven (mauvaise placement du fichier de log), et un meilleur installeur pour windows (propose en option les installation de python/pygame/numpy, qui sont nécessaire pour jouer.

Sans plus attendre, les liens vers les différents packages!

Bien sur, les rapports de bugs sont toujours les bienvenues ici: https://bugs.launchpad.net/ultimate-smash-friends

Mise à jours: Correction du fichier tar.gz, correction de l’installeur windows, les raccourcis n’étaient pas fonctionnels.

zine_ad_sense

written by tshirtman, on 4/22/11 12:05 AM.

Juste par ce que je suis pas mécontent, je viens de coder un plugin ad_sense pour zine, et qu’il marche pas trop mal :) et ça ne m’a prit que la soirée, lol.
Donc c’est , et ça me rendra surement pas riche, mais ça peut pas franchement faire de mal :), et peut être que ça intéressera d’autres personnes

Pour installer, c’est facile, aller dans “parts/zine/lib/zine/plugins/” et

git clone git://github.com/tshirtman/zine_ad_sense.git
Relancer zine, vous devriez le trouver dans les plugins et pouvoir l’activer, ce qui fera apparaitre un onglet “Ad sense” dans la barre de menu des options, et vous permettra de donner les paramètres d’une bannière ad sense, précédemment créée, qui apparaitra alors sous environ 50% de vos postes (c’est aléatoire).