J'utilise beaucoup twitter, principalement pour suivre l'actualité, et
converser avec quelques amis. Mon compte est privé, c'est à dire que mes
tweets ne sont pas publiques, car ils n'intéressent potentiellement que
mes amis.
Étant quelque peu "parano" vis-à-vis des réseaux sociaux, je n'aime pas
laisser trainer des informations derrière moi. C'est pourquoi d'ailleurs
je n'utilise plus Facebook et que j'avais à l'époque supprimé un à un
tout ce que j'avais posté.
Dans cette optique, je cherchais une méthode pour supprimer
automatiquement mes tweets anciens, car de toute façon plus personne ne
les lira. Potentiellement, ils ne serviront donc qu'à une utilisation
détournée (publicitaires, statistiques, etc...), d'où mon souhait de
faire le ménage.
Une solution radicale est de supprimer mon compte, puis de le recréer.
Mais ce n'est pas envisageable car il faudrait à chaque fois se
ré-abonner à tous les comptes qu'on souhaite suivre. Un autre idée est
de le faire à la main, en cliquant un à un sur les messages à supprimer.
Or, j'ai presque atteint les 1000 tweets, ce qui peut être assez
rébarbatif...
Le but de cet article est donc de vous présenter une manière plus propre
de faire le ménage, en utilisant l'API twitter. En fait, je ne vais pas
utiliser directement l'API twitter, mais un bibliothèque python pour
l'utiliser : python-twitter, que vous pouvez trouver sur le Google Code
du projet. Pour l'installer sur MacOS avec Macports, tapez :
$ sudo port install py-twitter
Une remarque importante est que cette bibliothèque fonctionne avec la
version 2.4 de python. N'étant pas un grand expert de python, je ne sais
pas si c'est possible ni comment utiliser cette bibliothèque avec une
version supérieure. Mais pour ce qu'on souhaite faire, je ne sais pas si
ça a une grande importance...
Python-twitter est simple d'utilisation, et après une lecture de la
documentation, on arrive vite à se connecter à l'API, récupérer ses
followers, ou envoyer des tweets. Un exemple simple, ici pour envoyer un
tweet :
api = twitter.Api(username='Votre_Username', password='azerty') status = api.PostUpdate("Ceci est un test !") print status.text
Le résultat est immédiatement visible sur ma timeline :
Bon, venons-en maintenant au cœur du problème. Nous allons
faire un petit script dont le principe est le suivant :
- On récupère notre timeline (en fait, ce sont seulement nos 20
derniers tweets)
- On supprime les 20-x derniers tweets, où x est le nombre des
tweets les plus récents que l'on souhaite garder
- On recommence, jusqu'à ce que tous les tweets soient supprimés.
L'inconvénient est que lors de la mise en place de ce script, on a
généralement beaucoup de tweets, et donc il faut exécuter beaucoup de
fois cette boucle. Le problème, c'est que twitter n'autorise qu'une
fréquence limitée d'accès à son API, à savoir 150 requêtes par heure.
Qu'à cela ne tienne on n'exécute la boucle qu'un petit nombre de fois,
et un petit cron exécuté régulièrement finira par purger la timeline !
Voici le script que j'ai écrit rapidement :
import twitter
n = 10 # Nombre de tweets a garder dans sa timeline
api = twitter.Api(username='Votre_Username', password='azerty') tl = api.GetUserTimeline(since_id=0) print('Nombre de tweets recuperes : %d' % len(tl)) print ('Supression des %d derniers tweets :' % (len(tl)-n) )
for i in range(n,len(tl)) : status = tl[i] print('Status #%d' % status.id) api.DestroyStatus(status.id)
Et le résultat :
Pour mettre en place le cron, on édite le fichier utilisateur :
Puis on ajoute la ligne suivante, par exemple pour exécuter le cron
toute les 10 minutes :
*/10 * * * * python2.4 /chemin/vers/le/script/clean_timeline.py >> /chemin/vers/le/log/clean.log
A terme, une fois ma timeline vidée, je remettrai le cron une fois par
jour, ce qui sera largement suffisant compte tenu de ma fréquence de
gazouillage.
Dernières remarques :
- Le mot de passe est stocké en clair dans le script, ce qui n'est pas
super...
- Le script tel quel ne marche pas si vous souhaitez garder vos 50
derniers tweets par exemple.
- Les données récupérées par l'API ont par défaut un cache de 60
secondes. Il est donc normal qu'un deuxième appel au script juste
après ne fasse rien !
Maintenant, à vous de jouer pour adapter le script, par exemple pour
sauvegarder vos tweets avant de les supprimer !
Ce week-end, j'ai participé pour ma troisième année consécutive à la
Coupe de France de robotique. Pour cette édition 2010, le robot
devait récolter des tomates, maïs et oranges et les emmener dans un
panier.
Cette coupe a été en quelque sorte la consécration du travail fournit
avec mon équipe du Club Robot de Centrale Nantes. En effet, depuis
deux ans nous avons refait presque tout le robot (base motrice, carte
moteur, communication entre les cartes et architecture du code haut
niveau) suite à l'échec de la coupe 2008 où nous n'avions pas pu nous
homologuer.
Cette année, le robot a été relativement performant, puisque nous nous
sommes homologués, et nous avons joué 5 matchs (2 victoires, 2 nuls et
une défaite). Nous terminons finalement 41ème sur environ 160 équipes
participantes.
Je vous invite à aller lire l'article plus détaillé sur le site du
club (avec d'autres photos, ainsi que des vidéos).
Parfois, il m'arrive de taper une ou deux lettre dans mon shell, puis de
regarder les résultats de l'autocomplétion. De cette façon, je découvre
souvent des programmes plus ou moins utiles.
Ma dernière découverte est le programme say, qui permet tout
simplement de faire parler le Mac. Comment ? say utilise la synthèse
vocale qui est présente sur MacOS. Un exemple :
$ say Win the yes, need the no to win, against the no !
Et oui, say permet de prononcer correctement des phrases en anglais,
mais en anglais seulement. Car Apple n'a toujours pas fait de
synthétiseur vocal dans une autre langue, alors que la firme a
introduit son premier synthétiseur en 1984 dans le célèbre Macintosh
128K.
En lisant le manuel, on peut trouver des options, comme l'enregistrement
de l'audio en AIFF, ou alors le choix de la voix de synthèse :
$ say -v Junior -o lecture.aiff Oh hi! I can has cheeseburger ?
Ce programme n'est pas très utile en soit, mais je pense que ça peut
être pratique dans un script automatisé pour donner des informations ou
des alertes.
Le Finder de MacOS (10.5, je ne sais pas ce qu'il en est pour la 10.6)
ne permet pas d'ouvrir directement une session sftp, ce qui a le don de
faire doucement rigoler mes amis linuxiens.
Il existe certe des logiciels qui permettent de se monter un disque par
ssh tels que Cyberduck, mais ils ne permettent pas de naviguer avec
le Finder. J'ai donc cherché une solution, et j'ai trouvé un petit
logiciel gratuit très pratique : Macfusion.
Après avoir téléchargé et installé Macfusion, il faut le lancer. Une
interface très minimaliste s'ouvre. Il faut alors ajouter un nouveau
serveur sur lequel on souaite se connecter, soit par ftp, soit par ssh
(ce qui est mon cas) :
Ensuite, il faut remplir les informations de connexion au serveur (le
mot de passe est retenu dans le trousseau de MacOS) :
Il est important de bien remplir "Path:" qui est le chemin où
on souhaite arriver à la connexion. Si on le laisse par défaut,
Macfusion indiquera l'erreur "Could not mount filesystem:
Authentication has failed." (même si l'erreur n'a aucun lien avc un
problème d'identification).
Après avoir rempli ces informations, on valide et on monte le volume. Un
nouveau lecteur apparaît alors dans /Volumes/ ainsi que sur le
bureau et dans la barre latérale :
On peut maintenant accéder et travailler sur les fichiers en
toute transparence depuis le Finder :
Remarque : une fois le volume monté, on peut fermer Macfusion sans
problèmes, le volume restera monté.
Il faudra quand même que je regarde pour une solution plus "simple",
c'est à dire en passant par le shell. Si vous avez des pistes, merci de
me le dire !
Récemment, j'ai voulu envoyer un pdf constitué d'images scannées d'un
manuel à quelqu'un. Mais ce pdf était beaucoup trop lourd pour passer
par un boîte mail. J'ai donc cherché une solution pour réduire la
qualité de pdf, mais sans succès (pas possible avec Aperçu, ni Adobe
Acrobat, et recherche sur Macports infructueuse).
J'ai donc voulu contourner le problème : je souhaitais extraire les
images du pdf pour pouvoir changer la qualité puis les assembler de
nouveau pour faire un pdf.
J'ai donc tapé au petit bonheur la chance "pdf2png" sur Google, et je
suis tombé sur ce lien. Il s'agit d'un petit programme en Objective C
qui va automatiquement convertir les pages de fichiers pdf en images png
de haute qualité.
Voici les étapes pour compiler et installer le programme (sur Mac OS
seulement) :
$ gcc --std=c99 -Wall -g -o pdf2png pdf2png.m -framework Cocoa $ sudo mv pdf2png /usr/bin/
Et voilà ! Il n'y a plus qu'à utiliser le programme sur mon fichier
pdf de 33 pages :
$ pdf2png manuel_vox.pdf
$ ls
manuel_vox-p01.png manuel_vox-p10.png manuel_vox-p19.png manuel_vox-p28.png manuel_vox-p02.png manuel_vox-p11.png manuel_vox-p20.png manuel_vox-p29.png manuel_vox-p03.png manuel_vox-p12.png manuel_vox-p21.png manuel_vox-p30.png manuel_vox-p04.png manuel_vox-p13.png manuel_vox-p22.png manuel_vox-p31.png manuel_vox-p05.png manuel_vox-p14.png manuel_vox-p23.png manuel_vox-p32.png manuel_vox-p06.png manuel_vox-p15.png manuel_vox-p24.png manuel_vox-p33.png manuel_vox-p07.png manuel_vox-p16.png manuel_vox-p25.png manuel_vox.pdf manuel_vox-p08.png manuel_vox-p17.png manuel_vox-p26.png manuel_vox-p09.png manuel_vox-p18.png manuel_vox-p27.png
Enfin, j'ai inséré toutes ces images dans un document Pages, puis
Exporter > PDF où j'ai choisit la qualité la plus faible qui est appelée
"Bonne" (en pensant à mettre toutes les marges à 0 pour conserver les
dimensions originales).
Cette méthode est un peu fastidieuse, mais à défaut d'avoir trouvé autre
chose, elle fonctionne bien. Mon fichier de départ faisait 26,2 Mo, et
il fait maintenant 10,3 Mo, ce qui est plus facile pour diffuser le
fichier (la qualité n'étant pas ma priorité).