Multiplicité des préférences

S’il y a bien une chose commune aux différents systèmes d’exploitation que j’utilise, c’est entre autres mon navigateur: Firefox. Lorsque l’on passe d’un OS à un autre, d’un PC à autre, les marques pages, eux par contre changent. Pas énormément, chacune de mes instances de navigateur possèdant les sites incontournables que je consulte régulièrement. Seulement plus le temps passe, plus les différences apparaissent… Le site consulté la veille en plein déplacement, n’est pas présent dans les marque-pages du PC de bureau qui vous attends chez vous.

Il arrive donc un moment où le besoin de synchronisation se fait sentir. Firefox possède en outre un système pour retrouver ses marque-pages depuis n’importe quel navigateur Firefox, mais cela implique de stocker ses données dans le cloud, les nuages. Je fais évidemment davantage confiance à Mozilla qu’aux autres pour la gestion des données personnelles, mais tout de même… Une partie de moi reste réticente à cette idée. Dans ce cas, pourquoi ne pas gérer le système de synchronisation soi-même?

La solution est relativement simple, installer son propre serveur de synchronisation de marque-pages. Par chance, Mozilla met à disposition les sources de son serveur de synchronisation ainsi qu’une documentation relativement complète. Les prérequis sont clairement identifiés et l’installation s’effectue aisément. Reste ensuite à effectuer la configuration minimale nécessaire au bon fonctionnement du service.

Le point qui m’a posé le plus de problème fut le paramètre:

[nodes]
fallback_node = http://localhost:5000/

La mauvaise configuration de celui-ci empêchait le service de fonctionner correctement. Après quelques recherches et plusieurs semaines à m’occuper d’autres choses, j’ai fini par trouver le paramètre correct dans ma situation. Ainsi, pour fonctionner normalement, ce paramètre doit absolument correspondre à l’adresse publique de votre service. Adresse que vous allez utiliser dans la configuration du service au niveau de Firefox. Une valeur correcte peut donc être http://www.nomdedomaine.fr:5000 par exemple, ou dans notre cas: http://www.unicoda.com:5000. Ajouter à cela un petit script pour démarrer automatiquement le serveur Sync au démarrage et le tour est joué.

 

Voir aussi:

http://www.docgreen.fr/2011/12/06/installer-son-propre-serveur-mozilla-sync-pour-firefox-saison-03-episode-final/

mt-daapd on Arch Linux

I’ve first discovered mt-daapd on an Ubuntu OS. Installation was really easy, same for configuration and I was able to stream my music to my Rhythmbox player. It was fine. But recently, I changed the OS and the server is now running Arch Linux. So I tried to reconfigure mt-daapd.

On Arch, mt-daapd can be found in the Arch User Repository (AUR). First we need to install it using yaourt:

yaourt -S mt-daapd

If everything goes right, mt-daapd should now be installed. I then created /etc/avahi/services/mt-daapd.service (maybe not needed, haven’t tried without):

<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">

<service-group>

<name replace-wildcards="yes">%h</name>

<service>
<type>_daap._tcp</type>
<port>3689</port>
<txt-record>txtvers=1 iTShVersion=131073 Version=196610</txt-record>
</service>

<service>
<type>_rsp._tcp</type>
<port>3689</port>
<txt-record>txtvers=1 iTShVersion=131073 Version=196610</txt-record>
</service>

</service-group>

Restart avahi daemon:

systemctl restart avahi-daemon

Edit mt-daapd configuration file:

# $Id: mt-daapd.conf.templ 1660 2007-09-12 13:08:04Z rpedde $
#
# This is the mt-daapd config file.

<...>

#
# admin_pw (required)
#
# This is the password to the administrative pages
#

admin_pw = mt-daapd

<...>

#
# mp3_dir (required)
#
# Location of the mp3 files to share. Note that because the
# files are stored in the database by inode, these must be
# in the same physical filesystem.
#

mp3_dir = /path/to/music

#
# servername (required)
#
# This is both the name of the server as advertised
# via rendezvous, and the name of the database
# exported via DAAP. Also know as "What shows up in iTunes".
#

servername = MyServerName

<...>

Finally start mt-daapd:

systemctl start mt-daapd

And enable auto start:

systemctl enable mt-daapd

Web interface is now available at http://yourServerNameOrIp:3689.

Configuration réseau (Bis)

Réédition d’un article concernant la configuration réseau sous GNU/Linux; pratique notamment pour la configuration d’une ip statique sur une machine. Le fichier /etc/network/interfaces permet de configurer les cartes réseau de manière permanente.

Par exemple :

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
  address 192.168.1.2
  netmask 255.255.255.0
  gateway 192.168.1.1

Pour configurer l’adresse des serveurs DNS, on modifie le fichier /etc/resolv.conf en y ajoutant par exemple nameserver 8.8.8.8 pour les DNS de google.

[Préface] L’Ethique des Hackers – Steven Levy

La première raison qui m’a conduit à écrire sur les hackers – ces concepteurs et ingénieurs pour qui l’informatique est la chose la plus importante au monde -, c’est l’admiration que j’éprouve pour eux. Si, dans cet univers, certains utilisent le terme hacker de manière péjorative, pour stigmatiser des nerds asociaux bricolant des codes tordus ou contrefaits, j’avais une opinion bien différente. S’ils ne payaient pas de mine, ils n’en étaient pas moins des aventuriers, des visionnaires, des casse-cou, des artistes… Et les seuls en mesure d’expliquer pourquoi un ordinateur est un outil révolutionnaire. Tous savaient, à des degrés divers, jusqu’où on peut aller quand on plonge au plus profond de l’esprit des hackers: jusqu’à l’infini. Chemin faisant, j’ai compris pourquoi cette étiquette de hackers, loin d’être péjorative, était pour eux un motif de fierté.

J’ai rencontré beaucoup de ces explorateurs, depuis ceux qui dans les années 1950 avaient côtoyé des machines valant des millions de dollars, jusqu’aux jeunes surdoués qui aujourd’hui réinventent l’informatique dans leur chambre de bonne. Ils partagent tous une même philosophie, une idée simple et élégante comme la logique qui gouverne l’informatique: l’ouverture, le partage, le refus de l’autorité, et la nécessité d’agir par soi-même, quoi qu’il en coûte, pour changer le monde. C’est ce que j’appelle l’Ethique des hackers. C’est un leg précieux qu’ils ont laissé même aux gens qui ne s’intéressent pas aux ordinateurs.

Cette éthique n’a guère produit de pesants manifestes; les hackers se sont contentés de la mettre en pratique des leur vie. J’aimerais, dans ce livre, présenter ces gens qui ont réellement vécu la magie des ordinateurs afin de la faire partager au plus grand nombre. Ils sont tous différents: les hackers du laboratoire d’intelligence artificielle au MIT dans les années 1950 et 1960, les bricoleurs plus pragmatiques des années 1970 en Californie, et les jeunes gamers qui se sont fait un nom dans les années 1980.

Il ne s’agit en aucun cas, pour moi, de retracer l’histoire officielle de l’informatique. Au contraire, vous rencontrerez ici des gens méconnus, mais qui ont compté dans cette aventure. Ce sont eux qui ont le mieux compris les immenses potentialités de ces machines et le bouleversement que tout cela impliquait. Ce sont eux, les nouveaux héros.

Des hackers comme Richard Greenblatt, Bill Gosper, Lee Felsenstein ou John Harris incarnent l’âme de l’informatique. Je crois que leur histoire – ou du moins celle de leurs expériences, de leur foi parfois naïve en un autre monde qui pourrait communiquer avec le nôtre – résume ce que fut véritablement la révolution informatique.

Steven Levy, Préface de L’Ethique des Hackers.

ElasticSearch and the Mystery of Auto-completion

Few months ago, I was looking for information concerning auto-completion with ElasticSearch as a source. I found many solutions, but none of them really fit my needs. Nevertheless, it helped me building my request.

What’s the situation Doc?

I needed to be able to extract values from an indexed field in ElasticSearch according to a group of letters (user input). In fact, my indexed document contains a field named map which is an array of string. The idea is the following: if the user is looking for the value « name » for instance, let’s say he will first type « na ». So here we must be able to suggest searches to the user. Furthermore, with this 2 letters, we must proposed existing fields like « name », « native » or « nature ».

I’m using Elastical to interact with ElasticSearch.
First, I’m building a regex which will be used later in the request.

var search = req.body.searched.toLowerCase(),
firstLetter = search.charAt(0),
rest = req.body.searched.slice(1),
reg = "^["+firstLetter+firstLetter.toUpperCase()+"]"+rest+".*";

The regex is build to match with both an upper case char or a lower case one in first position.

What about the request?

var request = {
  query: {
    query_string: {
      default_field: "map",
      default_operator: "AND",
      query: req.body.searched+"*"
    }
  },
  facets:{
    map:{
      terms:{
        field: "map.exact",
        regex: reg,
        size: 10
      }
    }
  }
}

First, I’m asking ElasticSearch to retrieve all documents which match req.body.searched+ »* » where req.body.searched contains the user input. I’ve change the default operator to « AND » rather than « OR » in order to be able to deal with fields like « Nom de la gare » or « Name of the dog ». By default, ElasticSearch uses the « OR » operator, so it will ask for « name » OR « of » OR « the » OR « dog »; which is not what I wanted.

Then, I’m using facets to retrieve values in the field map of found documents matching the given regex. I’m using map.exact for the same reason I must use the « AND » operator.

This request works great with on the tests I’ve made. Remains to be seen if it can handle big indexes.

I can now ask ElasticSearch with Elastical and build a clean response:

elastical.search(request, function (err, results, full) {
  var terms = [];
  async.forEach(full.facets.map.terms, function(data, callback) {
    terms.push(data.term);
    callback();
  }, function(err) {
    res.send(terms);
  });
});