Categories
Web

Encore une astuce GitHub

Si vous souhaitez récupérer un nom d’utilisateur (ou d’organisation) GitHub, sachez que c’est possible! Il suffit d’envoyer un gentil email pour demander si le compte en question est inactif. J’ai réalisé une telle demande il y a quelque temps pour JARR. J’ai dû attendre un peu, mais maintenant c’est bon. Je remercie GitHub et l’ancien propriétaire du compte !

Categories
Photography Web

Trovebox, c’est fini

Je me disais bien que ce manque d’activité sur le compte GitHub était mauvais signe. J’ai reçu hier soir un email annonçant l’arrêt du service Trovebox. L’annonce est assez vague, surtout la partie: «…We believe the best is yet to come. Some of the team will be joining another much larger company to pursue our original goal of preserving digital memories. It’s an idea that we’re excited about and have incubated for most of 2014. Consider it a “fork” of the Trovebox you know today…» que je trouve aussi un peu trop optimiste. Les commentaires sur Twitter sont plus lucides.

C’est vraiment dommage. Mais tant qu’on n’a pas essayé de lancer une startup on ne peut pas critiquer. Dans ce cas, la source du problème semble être principalement le manque d’argent. Je trouve que le logiciel est très bien. La communauté certainement trop petite. Peu de développeurs, je pense deux ou trois acteurs principaux.

Malheureusement pour moi, je crois que je ne parviendrai jamais à trouver un service Web pour mes photos. Entre 2005 et 2011 j’utilisais le service Zooomr, qui me convenait parfaitement. Pour le moment j’ai déja récupéré le code de Trovebox et mis à jour l’adresse du dépôt Git distant de mon instance.

Une alternative pour moi serait de développer mon propre outil. Un peu comme j’ai fais avec pyAggr3g470r qui a bientôt 5 ans et commence enfin à devenir intéressant pour d’autres personnes que moi. Ceci en grande partie grâce à un contributeur.

Évidemment, l’interface de ma solution ne serait jamais comparable à Trovebox. Ce n’est pas si grave, car finalement l’interface doit surtout faire place aux photos. Pour pyAggr3g470r je ne me suis jamais soucié de savoir si une décision, tant au niveau fonctionnel qu’au niveau graphique, serait intéressante pour les autres personnes. C’était un outil pour moi. Aussi, je sais maintenant que je peux maintenir mes petits développements dans le temps. Et moi je fais ça en partie pour le fun, pas pour l’argent.

Si vous souhaitez utiliser ce que je pourrai proposer, rendez-vous en 2020.

Categories
Web

Scripter vos personnalisations de Firefox

La page about:config est une chose que j’aime beaucoup. Surtout depuis que je sais comment modifier les valeurs avec un script.

user_pref("browser.urlbar.trimURLs", false);
user_pref("browser.urlbar.formatting.enabled", false);
user_pref("browser.search.suggest.enabled", false);
user_pref("browser.search.showOneOffButtons", false);
user_pref("geo.enabled", false);
user_pref("javascript.enabled", false);
user_pref("loop.throttled", false);
user_pref("network.http.sendRefererHeader", 0);
Categories
Web

OpenData

L’OpenData c’est vraiment bien parce qu’on peut faire des choses fun comme ça. Et ce soir j’ai appris qu’il est possible d’obtenir des données de la Poste. Génial! Mais après avoir vu l’aspect du fichier mis à disposition, j’ai presque pleuré. Alors j’ai décidé de faire un petit script qui me sera utile.

#! /usr/bin/env python
#-*- coding: utf-8 -*-
 
import sys
import csv
import urllib2
from contextlib import contextmanager
 
POSTAL_CODES = "https://www.data.gouv.fr/s/resources/base-officielle-des-codes-postaux/20141106-120608/code_postaux_v201410.csv"
 
@contextmanager
def open_url(url):
    try:
        f = urllib2.urlopen(url)
    except IOError as err:
        yield None, err
    else:
        try:
            yield f, None
        finally:
            f.close()
 
def usage():
    print "This script takes one argument."
    print "Usage:"
    print "\tpcodes.py city"
    exit(1)
 
if __name__ == "__main__":
    # Point of entry in execution mode.
    if len(sys.argv) != 2:
        usage()
 
    city = sys.argv[1]
 
    with open_url(POSTAL_CODES) as (postal_codes, err):
        if err:
            print err
        else:
            dialect = csv.Sniffer().sniff(postal_codes.read(1024))
            rows = csv.reader(postal_codes, dialect)
            result = sorted([(row[1], row[2]) for row in rows
                                    if city.lower() in row[1].lower()],
                            key=lambda x: x[0])
            print "\n".join([value + " " + key for key, value in result])

Utilisation:

$ ./pcodes.py grosblie
57520 GROSBLIEDERSTROFF

J’avais trouvé d’autres scripts pour faire ça. Mais souvent au bout d’un certain temps, ils ne fonctionnent plus (disparation de la ressource Web, généralement). Espérons que celui-ci fonctionnera longtemps.

Categories
Privacy Web

Le Web et moi (partie 2)

You don't have any mail! Our servers are feeling unloved.

Cela me prends du temps mais je vais y parvenir. Comme vous devez le savoir je tends à limiter au maximum mon usage du Web social (en tout cas, tout ce qui ma fait perdre trop de temps). En ce moment je m’attaque à mon compte Google. J’y vais progressivement car je me suis trop reposé sur Gmail, que j’utilise de moins en moins. Heureusement pour moi, je n’ai jamais cessé d’utiliser parallèlement Kmail et ainsi je dispose de l’intégralité des emails sur le NAS.
J’ai pratiquement supprimé toutes mes photos de Google +, également supprimé mon profil Scholar (ainsi que les références), et pleins d’autres choses. Ce qui m’amuse un peu, c’est que les services Google qui me manqueraient le plus demain seraient Google+ et Google Maps. J’utilise aussi des paramètres beaucoup plus strict.
J’ai donné ma tablette et donc elle n’a plus d’accès à mon compte. Je pense que le smartphone n’en a plus pour longtemps. Je donnerai une chance à Mozilla ou Ubuntu.

Globalement la liste des services que j’utilise se fait de plus en plus courte et ce n’est pas terminé. Le but réel n’est pas de simplement la réduire, mais au moins d’utiliser les services qui me sont utiles et ne me donnent pas l’impression d’être uniquement un produit.

Categories
FLOSS Web

Encrypted Media Extensions

Mauvaise nouvelle. Il semble que nous y sommes presque. Des DRM (Digital Rights Management) pour HTML5.1.
Pour le moment la proposition concerne la vidéo. Pour le moment. Attendez-vous à une généralisation d’ici quelques années. Et pourquoi pas la photo, par exemple avec les comptes professionnels Flickr? L’entreprise Yahoo! est aussi membre du W3C.

Les éditeurs de la proposition sont employés de Google, Microsoft et Netflix.

Des lectures à ce sujet:

Categories
Internet Python Web

RFC 6901: Pointeur JSON

J’ai découvert ce RFC sur le blog de Stéphane Bortzmeyer. Un RFC plutôt intéressant qui spécifie une syntaxe afin d’accéder à un élément JSON depuis l’extérieur (une URI par exemple).

Ce que je veux surtout présenter c’est l’implémentation Python de ce RFC:

Python 3.1.3 (r313:86834, Nov 28 2010, 11:28:10) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more informati
>>> import json
>>> import jsonpointer
>>> import urllib.request
>>> request_answer = urllib.request.urlopen("http://api.traintimes.im/locations.json?location=WMOR&date=2013-04-14&startTime=1200").read()
>>> doc = json.loads(request_answer.decode())
>>> jsonpointer.resolve_pointer(doc,'/services/1/destination/description')
'Buxton'
>>> jsonpointer.resolve_pointer(doc,'/services/0/destination/description')
'Manchester Piccadilly'
>>> jsonpointer.resolve_pointer(doc,'/services/2/destination/description')
'Hazel Grove'

Voilà. Un RFC tout neuf. Un beau module Python qui va avec.

Categories
Google Web

Vous pouvez utiliser WebM tranquillement

Comme je l’expliquais ici, WebM est un conteneur généralement utilisé pour VP8 (la vidéo) et Vorbis (l’audio). Le problème jusqu’à aujourd’hui est qu’il restait quelques brevets de On2. Récemment Google a de nouveau ouvert le portefeuille et a conclu avec MPEG LA des accords pour une licence sur des techniques essentielles des technologies de compression vidéo VP8 et VPx. Les utilisateurs de VP8 bénéficient également de cet accord. Une bonne nouvelle.

Categories
Cloud Web

Déploiement d’applications Web avec Heroku

Depuis quelques temps je m’intéresse au service PaaS offert par Heroku (équivalent de Google App Engine). Ce service permet de déployer des applications (entre autres: node.js, Ruby, Clojure, Python et Scala) sans se soucier de l’administration du serveur (et donc une partie des problèmes de sécurité). Et cela vraiment simplement et rapidement.

Pour preuve, voici ci-dessous les étapes afin d’avoir une première application Python basée sur Flask, juste après la création d’un compte.

debian:/home/cedric# wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh

cedric@debian:~$ git clone git://github.com/heroku/python-sample.git
Cloning into python-sample...
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 12 (delta 1), reused 11 (delta 0)
Receiving objects: 100% (12/12), done.
Resolving deltas: 100% (1/1), done.

cedric@debian:~$ cd python-sample/

cedric@debian:~/python-sample$ heroku create
Enter your Heroku credentials.
Email: kimble.mandel@gmail.com
Password (typing will be hidden):
Found existing public key: /home/cedric/.ssh/id_rsa.pub
Uploading SSH public key /home/cedric/.ssh/id_rsa.pub... done
Creating peaceful-refuge-5673... done, stack is cedar
http://peaceful-refuge-5673.herokuapp.com/ | git@heroku.com:peaceful-refuge-5673.git
Git remote heroku added

cedric@debian:~/python-sample$ git push heroku master
The authenticity of host 'heroku.com (50.19.85.156)' can't be established.
RSA key fingerprint is 8b:48:5e:67:0e:c9:16:47:32:f2:87:0c:1f:c8:60:ad.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'heroku.com,50.19.85.156' (RSA) to the list of known hosts.
Enter passphrase for key '/home/cedric/.ssh/id_rsa':
Counting objects: 12, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (12/12), 1.13 KiB, done.
Total 12 (delta 1), reused 12 (delta 1)

-----> Python app detected
-----> No runtime.txt provided; assuming python-2.7.3.
-----> Preparing Python runtime (python-2.7.3)
-----> Installing Distribute (0.6.34)
-----> Installing Pip (1.2.1)
-----> Installing dependencies using Pip (1.2.1
.
.
.
-- snip --
.
.
.
-----> Discovering process types
       Procfile declares types -> web

-----> Compiled slug size: 23.7MB
-----> Launching... done, v4
       http://peaceful-refuge-5673.herokuapp.com deployed to Heroku

To git@heroku.com:peaceful-refuge-5673.git
 * [new branch]      master -> master

Et voici le résultat. Il faut savoir qu’Heroku repose en fait sur le service IaaS EC2 d’Amazon (équivalent de Google Compute Engine). Vous êtes donc dépendant de la qualité de service d’Amazon.

Le service est élastique et de nombreuses configurations sont possibles. J’utilise un compte gratuit. Pour la persistance des données de votre application vous pouvez utiliser l’addon MongoHQ avec 512 Mo de stockage offert.

On va voir ce qu’on peut faire avec ça…

Categories
blog Privacy Web

Archive du blog Dive Into Mark

Dive Into Mark était un blog que j’aimais lire. Mark Pilgrim y publiait des billets intéressants et très bien écrits. Malheureusement depuis sa disparition du Web le 4 octobre 2011 il est assez compliqué de retrouver les articles de son blog publiés depuis 2002. Il est possible trouver quelques archives sur Github mais rien d’exhaustif à ma connaissance.

Aujourd’hui je suis assez content car j’ai pu récupérer dans ma base de nouvelles des articles du blog Dive Into Mark remontant au 18 octobre 2004. Les articles se trouvent à cette adresse, il y en a 321.

Vous pouvez également télécharger tous les articles au format JSON. J’ai utilisé la commande ci-dessous afin d’obtenir un résultat aisément exploitable programmatiquement.

$ mongoexport --db pyaggr3g470r --collection 39f95ebadcce51a9c14cacc9457c1f93fba28eb5 --fields article_date,article_title,article_content,article_link -o DiveIntoMark.json