J’ai acheté un Dell Inspiron Mini 10v

23 06 2009

Je passe vite fait, je me suis acheté un petit netbook. Il est petit, léger, ultra bien conçu, vraiment de bonne qualité, totalement silencieux (pas de ventilo grâce au Z530), et un écran de 10″ avec une résolution native de 1366×768.

Pour le reste : wifi b/g (normal), une sortie HDMI, une batterie 6 cellules, 3 ports USB, un lecteur SD/MS/MMC. Il embarque 1Go de ram, 160Go de disque dur.

A part ça, il fait tourner sans aucun problème l’XP pré-installé, mais par exemple, il a du mal à lire une vidéo SD (sous VLC)…

Bref, j’en suis très content, et je pourrai blogger plus…



Mon avancement d’app Facebook

28 02 2009

Je ne compte toujours pas dévoiler publiquement de quoi il s’agit exactement, mais je peux dire en passant que je viens d’implémenter un système de recherche sur Amazon. J’ai dû recopier une bonne partie du code, mais si la doc était plus facile a trouver, j’aurais pu faire exactement pareil sans ça…

Trop facile en fait :D



Le serveur parfait pour PS3!

10 02 2009

J’ai trouvé un serveur uPNP dédicacé à la PS3. Il permet ainsi de lire via le réseau — wifi ou RJ45 — les vidéos qui se trouvent sur votre PC. Le gros avantage est qu’il est le premier à permettre le transcodage sans avoir besoin de configurer quoi que ce soit. On installe, on définit quels répertoires servir, et c’est tout ce qu’il y a à faire!

Pour ceux qui ne connaissent pas le terme « transcodage» , il s’agit simplement de convertir des vidéos vers un format qui est supporté par la Playstation 3.

Les avantages sont nombreux: PS3 Media server est gratuit, il tourne sous Windows, Linux et MacOS, et il est entièrement configurable.

Le seul soucis que j’aie eu repose sur une protection réseau offerte par défaut par Windows qui empèchait la PS3 et le serveur de se trouver mutuellement. Mais le wiki sur Google Code explique comment désactiver cette option.

Bref, rendez-vous d’urgence sur le site officiel de PS3 Media Server pour le télécharger!



Facebook app + Ajax + Google Analytics

28 01 2009

Depuis que je développe mon application Facebook, j’essaie de rendre tout le contenu dynamique, et j’utilise Ajax autant que possible (là où c’est utile). Le problème, c’est que dans un morceau de code Ajax, il n’y a pas de scriptage automatique et pas à proprement parler de « navigation» . Donc si une application Facebook est entièrement codée en Ajax, sur Google Analytics, on ne voit pas du tout ce qui se passe.

Sauf si on est malin!

L’utilisation de la balise FBML <fb:google-analytics>, en plus d’inclure le code de tracking, expose également la méthode FBJS Facebook.urchinTracker()

Ainsi, on peut facilement traquer les appels Ajax exécutés par votre app, vu que l’appel Ajax est en soi du FBJS.

Assez parlé, voyons un exemple du code qui nous permettra de voir les appels Ajax…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function searchArtist(query) {
    var ajax = new Ajax();
    Facebook.urchinTracker('/ajax/artist-search/'+query);
    ajax.requireLogin = "true";
    ajax.responseType = Ajax.JSON;
    ajax.onerror = function() {
        new Dialog().showMessage('Error', 'Unable to find this artist');
    }
    ajax.ondone = function(data) {
        if(data.artistFound)
            new Dialog().showMessage('Artist found!', data.artistName);
        else
            new Dialog().showMessage('Artist not found :(','Unable to find an artist named ' + query);
    }
    ajax.post('http://facebook.example.com/ajax/search_artist.php?query=' + query);
}

La ligne importante est bien-entendu celle qui contient Facebook.urchinTracker();

Notez que ce code est un copier-coller de mon code qui a été ensuite édité pour remplacer les URL véritables et les noms de certaines variables. Je pourrais y avoir oublié un guillemet ou un point-virgule…



Blogueur ou bloggeur ?

20 01 2009

C’est une question à la con, mais elle m’a sauté aux yeux tout à l’heure en lisant… un blog. Pour moi, la réponse est sans conteste bloggeur. Simplement parce que si blogueur est sémantiquement correct en français, c’est une variation d’un mot qui n’est PAS français. Pour moi, c’est un peu comme surfeur. Dans la langue de tous les jours, surfeur se prononce « seurfeur»  mais il s’écrit surfeur… ça n’a pas de sens!

Bref. Pour moi, le plus logique est bloggeur. C’est juste une françisation de blogger, plus proche de son étymologie qu’une barbarie telle que « blogueur» .

Je sais, ça mène à rien ce débat, mais ça m’amuse!



J’ai un nouveau job!

10 01 2009

Je reste dans la même société, mais dès ce lundi, je commencerai à travailler dans une nouvelle cellule, la cellule Training. Je serai chargé de la création de modules de formation pour tous les secteurs du Manufacturing, de donner ces formations aussi bien aux nouveaux engagés qu’aux anciens, et — à confirmer — d’évaluer le travail des gens sur le terrain, afin de voir qui pourrait avoir besoin d’être formé d’avantage…

Je quitte donc mon travail de terrain pour travailler dans un bureau la plupart de mon temps. Les critères qui m’ont permis d’être choisi pour ce poste sont que je suis « doué en informatique»  même si techniquement je me contenterai de faire des présentations Powerpoint et d’encoder des formations dans une base de données. Autre critère de sélection, ma connaissance pratique des postes de grade D (préparation de matières premières, sorties machine, prises d’échantillons, contrôles environnementaux), et une partie des secteurs de grade C (principalement la vérification et stérilisation de matériel, et la préparation et le lavage de ce matériel). Dans un avenir proche, je devrais être formés aux secteurs qui manquent à mes capacités, à savoir la formulation et le remplissage aseptique.
Lire la suite »



Redimensionner une image au vol

1 01 2009

Comme vous le savez, je développe en ce moment une application Facebook. Dans cette application, je devrai afficher des images un peu partout, issues d’une sorte de base de données. Pour ne pas révéler le contenu de mon application, supposons qu’il s’agisse de pochettes de CDs. Je dispose donc d’un répertoire dans lequel se trouvent des milliers d’images de pochettes, généralement en bonne qualité, assez grandes. Mais un peu comme sur last.fm, je devrais pouvoir afficher une série de pochettes de taille plus petite, disons 64 pixels de large.

Pour redimesionner ces images, j’ai deux possibilités:

  • Faire un traitement en batch avec un logiciel conçu pour des conversions en séries.
  • Convertir au vol ces images via GD ou ImageMagick

La première solution ne me convient pas, car de nouvelles pochettes seront ajoutées au fil du temps, et je ne veux pas être obligé de refaire une conversion de temps à autres. La seconde est gourmande en ressources, la conversion d’images prend un grand nombre de cycles processeur, et s’il y a ne serait-ce que 50 personnes qui veulent afficher une page contenant 20 de ces images, le serveur risque de planter.

L’idéal est un mélange entre ces deux solutions. Le redimensionnement de l’image par ImageMagick (ou GD) suivi de son stockage dans un autre répertoire. Mon script va donc faire cela. Cependant cela donne lieu à un problème technique. Comment savoir si l’image a déjà été convertie auparavant?

Ma solution à ce problème est tellement logique qu’elle ne saute pas aux yeux : ne lancer le script de redimensionnement que si l’image stockée n’existe pas.

En pseudo-code, cela donnerait ceci:

1
2
3
4
5
if(is_file($fichier_demandé)) {
  envoyer_le_fichier();
} else {
  generer_le_fichier_redimensionne();
}

Mais cela voudrait dire qu’on lance un script php et fait un accès au disque pour vérifier si le fichier existe ou pas. Il y a mieux à faire…

Au lieu de faire ce script qui vérifie si le fichier existe ou pas, ne lancer ce script qu’a condition que le fichier n’existe pas à l’endroit attendu. Et comment faire en sorte que cela soit automatisé, ou géré par le serveur lui-même?

ErrorDocument 404 404.php

Toutes mes images sont stockées dans le répertoire /i/ de ma racine de site web. Donc j’ai mis cette directive dans /i/.htaccess.

Mon script n’est ainsi appelé que si l’image n’existe pas. Et au lieu d’afficher le sempiternel message d’erreur, je corrige cette erreur en créant le fichier redimensionné. D’autant que vu qu’on appelle une image, afficher un « message d’erreur»  ne sert à rien…

Example:

1
<img src="/i/w=64/pochette/Aphex-Twin/Hangable-Auto-Bulb.jpg" />

Code source de 404.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
/* Initialisation des variables */
$requestedWidth = 0;    // Largeur demandée
$requestedHeight= 0;   // Hauteur demandée
$filename='';            // Nom du fichier original (avec chemin)
$requestedFilename = ''; // Nom de fichier redimensionné (avec chemin)
$basePath = '/var/foo/mon_site/';

/* Parcours de l'url demandée */
if(ereg("/w=([0-9]+)/", $_SERVER['REQUEST_URI'], $regs)) {
    $requestedWidth = (int)$regs[1];
}
unset($regs);
if(ereg('/h=([0-9]+)/', $_SERVER['REQUEST_URI'], $regs)) {
    $requestedHeight = (int)$regs[1];
}
unset($regs);

/* Détermine le fichier à lire */
ereg('i/[wh]{1}=[0-9]*/([a-zA-Z0-9/-\.]*)', $_SERVER['REQUEST_URI'], $regs);
if(!is_file($basePath.'i/'.$regs[1])) {
    error_log("The path doesn't lead to a file: ".$basePath.$regs[1]);
}
if(!is_readable($basePath.'i/'.$regs[1])) {
    error_log('The file is not readable:'.$basePath.$regs[1]);
}
$filename = $basePath.'i/'.$regs[1];
unset($regs);

/* Détermine le fichier à créer */
ereg('(i/[wh]{1}=[0-9]*/[a-zA-Z0-9/-\.]*)', $_SERVER['REQUEST_URI'], $regs);
$requestedFilename = $basePath.$regs[1];
unset($regs);

$image = new Imagick();
$image->readImage($filename);
$image->resizeImage($requestedWidth, $requestedHeight, imagick::FILTER_LANCZOS, 1);
if(!is_dir(dirname($requestedFilename))) {
    mkdir(dirname($requestedFilename), 0777, true);
}
$image->writeImage($requestedFilename);

header('Content-Type: image/'.$image->getImageFormat());
echo $image;

?>

N’oubliez pas, si vous utilisez ce script, que sur mon serveur, toutes les images sont dans /var/foo/mon_site/i/. Aussi, vu que ce répertoire ne contient QUE des images, je ne vérifie pas si le visiteur demande une image ou une page web normale… Pensez donc à faire cette vérification si vous utilisez ce script en tant que page 404 sur tout le serveur, au lieu de limiter l’emploi de celle-ci à un répertoire donné via un .htaccess ou une directive dans votre .conf Apache…

Enfin, une demande vers l’image donnée en exemple créera un répertoire /var/foo/mon_site/i/w=64/pochette/……

Dernière considération: ce script ne peut gérer le redimensionnement que selon la largeur OU la hauteur, et redimensionne en conservant le rapport largeur/hauteur original.



Un GreaseMonkey pour Facebook

30 12 2008

Pour ceux qui ne connaissent pas GreaseMonkey, il s’agit d’un système qui permet de modifier la façon dont s’affichent les sites web selon vos désirs. Il se compose d’un plugin pour Firefox (ça existe peut-être pour IE aussi, mais j’en sais rien et j’ai pas envie de chercher) et d’un site web qui propose une tonne de scripts préconfiguré s pour les sites les plus communs. Certains scripts fonctionnent sur « tous les sites» .

Un script sur lequel je viens de tomber remplace le favicon de Facebook par l’icône utilisée par les différentes applications Facebook, permettant de retrouver le bon onglet plus vite. Pratique quand on a plusieurs onglets ouverts sur différentes applications.

Le script s’appelle Facebook App Faviconizer, et j’adore.



Je développe une application Facebook

21 12 2008

Ou au moins, j’essaie de le faire… L’api est asse puissante, plutôt compréhensible, et je pense que je vais bien m’amuser. Ceci étant, je ne suis pas certain que mon serveur tout pourri suffise à faire tourner la chose. Pas grave. M’en fiche. Si ca devient pratique, je ferai héberger ça sur un serveur digne de ce nom.

En tout cas, une chose est claire: la sécurité est assez poussée. Leur moteur réécrit tout le code javascript et les divers éléments DOM pour éviter qu’on puisse s’en servir pour piocher dans les informations privées des utilisateurs. Et leur serveur joue un rôle de proxy. Bien pensé.

Je vous donnerai des infos dès que j’aurai fait quelquechose d’un tant soit peu évolué et fonctionnel. Si vous avez envie de me filer un coup de main, et que vous aimez les jeux vidéos, n’hésitez pas à vous faire connaître!



Il faut que je m’y remette

13 12 2008

J’ai bossé dans l’industrie des sites web, ça a été mon premier job. Et j’ai beau me dire intérieurement que je sais programmer en PHP, la dernière ligne de code que j’ai écrite doit remonter à l’époque où la PS3 n’existait pas.

En soi, y’a rien de compliqué. Je ne pense pas avoir perdu mes aptitudes et mes connaissances. Je ne prétends pas être à même de concurrencer WordPress par exemple. Mais je dois être capable de monter un portail assez avancé sans trop de problèmes.

Ce qui me manque c’est sans doute la motivation. Et probablement une idée, aussi. Réinventer la roue n’est utile que si on a le moyen d’en faire une qui tourne mieux que les autres. Des idées, j’en ai. Mais aucune qui soit ou révolutionnaire, ou réalisable à mon échelle.