Nokia Secret Codes

Un truc cool avec les téléphones Nokia, c’est leurs codes secrets. Si on fait le tour du net et du code source de Symbian, on peut trouver les codes suivants (pour info j’ai un N97 mini) :

*#06# Imei Code
Affiche le code IMEI du téléphone.

*#0000# Sw Version
Affiche des infos sur le firmware : version, date, nombre de langues, modèle, date de mise à jour, …

**04* Bad Pin Change
Pas d’infos, quand testé aucune action.

**042* Bad Pin2 Change
Pas d’infos, quand testé aucune action.

**05* Bad Pin Unblock
Pas d’infos, quand testé aucune action.

**052* Bad Pin2 Unblock
Pas d’infos, quand testé aucune action.

*#7780# Activate Rfs Normal
“Reset Factory Settings”, remise à zero “soft”.

*#7370# Activate Rfs Deep
“Reset Factory Settings”, remise à zero “hard”.

*#2820# Bt Adress
Affiche l’adresse MAC du Bluetooth (en théorie, car sur le miens n’affiche que “Bluetooth address:”, sans l’adresse elle même).

*#92702689# Life Timer
Affiche la durée de vie. Sur le N97 mini, est affiché le temps total passé en conversation.

*#9990# RF Loopback
Manifestement, active un mode de test du Bluetooth. J’ai un message “Bluetooth test mode” qui s’affiche, mais rien de plus ne se passe.

*#62209526# WLAN MAC
Affiche l’adresse MAC de la carte wifi.

*#2873# Bt Debug Mode
Je présume qu’il s’agit d’un mode de test du bluetooth, cependant sur mon téléphone cela n’entraîne aucune action.

Et on ajoute à ça les astuces habituelles :

  • Appuyer 3 secondes sur la touche du menu fait apparaître la liste des applications ouvertes.
  • Appuyer 3 secondes sur “0″ fait apparaître le navigateur web.
  • Appuyer 3 secondes sur “#” passe en mode sliencieux (ou retourne en mode général).

Add comment March 9th, 2010

Mise à jour d’Apache dans Sid…

Certains scripts PHP (par exemple Symfony) dépendent lourdement du fait que si on demande la page http://truc/machin.php/bidule/chose, et que http://truc/machin.php est un fichier PHP, alors c’est ce fichier qui est appellé. Le souci, c’est que dans lors de la dernière mise à jour d’Apache dans Sid, ça ne marche plus…

En fait ce comportement est lié à une directive de configuration AcceptPathInfo, qu’il faut placer à On.

Add comment February 27th, 2010

But It’s Not Google

J’hésite encore, Bing veut-il dire “But It’s Not Google”, ou est-ce le bruit que ça fait quand on tape dessus ? J’aimais déjà pas Bing, mais là où on se rend compte que c’est vraiment de la merde, c’est que cet abruti a réussi à indexer localhost… Mais quel con ce Bing !

Autre détail intéressant, Bing a réussi à indexer 1250 pages sur ce blog… Contrairement à 165 pour Google. On se demande lequel des deux va fournir les résultats les plus pertinents…

Add comment February 25th, 2010

Putain de clavier

J’avais jusque peu un combo clavier/souris sans fil d’une sous marque chinoise qui me plaisait tout à fait, sauf que après 3 ans de bons et loyaux services, les deux se sont mis à ne plus trop marcher comme il fallait. Alors j’me suis mis en quête d’une nouvelle paire de clavier/souris.

Pour la souris ça a été vite vu, pour Noël on m’a offert une grosse souris de PGM avec radiateur intégré, ça c’était nickel. Par contre, pour le clavier… Quelle horreur !

Déjà, impossible de trouver un magasin où on peut essayer un clavier. Le seul endroit où j’ai trouvé suffisament de claviers libre à l’essai, c’était Boulanger. Alors me voilà parti pour tester tous les clavier du magasin. On remarque que :

  • Ces connards de Logitech ont planqué la touche Inser pour que la touche Suppr fasse 2 touches de haut. Comment vous voulez utiliser vim avec ça ?
  • Peu importe la gamme, le toucher est horrible, le retour des touches est naze, … Même un clavier haut de gamme à 250€ ne vaut pas grand chose sur ce plan là.
  • Les dispositions de clavier deviennent n’importe quoi. Entre les constructeurs qui prennent des dispositions de clavier d’ordinateur portable (c’est débile, on achète pas un clavier de bureau pour qu’il soit condensé et pas pratique…), et les constructeurs qui nous font des concepts bizarre du style un pavé numérique détachable sans fil…

Bref, les claviers c’est devenu de la merde. Le seul truc que j’ai trouvé de potable à Boulanger, c’était le Listo le plus bas de gamme possible, qui était le seul clavier à respecter la disposition standard des touches… En tout cas j’ai fini par aller sur le site de Dell pour acheter le clavier OEM qu’ils donnent avec leurs serveurs, car celui ci il est génial :) : un clavier 100% standard avec des touches aux bon emplacements, un toucher nickel et tout et tout. Bref, vive les clavier Dell, dernier survivants d’une ère révolue où les claviers étaient agréables…

Je sais que ça fait très post sponsorisé, mais j’vous promet que je gagne pas un centime, c’est juste que j’en ai vraiment marre des constructeurs qui font de la merde, et que j’me sentais de le crier sur tous les toits. D’ailleurs la prochaine fois, on parlera des imprimantes et de l’ethernet…

2 comments February 23rd, 2010

Statut de connexion dans PHP

Ces derniers je fais un peu de push en HTTP, donc une information importante pour moi est le statut de connexion. En théorie cette information m’est donnée par la fonction connection_status(). Mais il faut savoir comment PHP connait ce statut (je n’ai regardé que pour le mod_php5 de apache et le cgi, mais c’est probablement vrai dans les autres cas) : en fait, le serveur web n’envoit jamais de signal à PHP pour dire “hop c’est bon on n’a plus besoin de toi ta gueule” quand l’utilisateur ferme sa connexion. PHP ne se rend compte de la fermeture de la connexion uniquement quand il tente d’envoyer des données au serveur, car le serveur lui dit “non je peux pas écrire les données, la connexion est fermée”.

En d’autres termes, si vous attendez un évènement (grâce à une fonction bloquante par exemple), même si vous appellez régulièrement la fonction connection_status() le résultat sera faux car vous n’avez envoyé aucune donnée. Et encore plus grave, si vous attendez votre évènement avec une fonction bloquante, le processus passe en mode S (sleep), ce qui fait que le temps est stoppé, et que le max_execution_time n’est jamais atteint : le processus reste bloqué là éternellmement. Face à ça, pas beaucoup de solutions… Vous pouvez envoyer un espace chaque seconde (en n’obliant pas d’appeller ob_flush() et flush()), ou alors vous pouvez faire des timeouts et faire en sorte que le client refasse une requête juste après, ou autre hack du genre… Vous pouvez aussi vous passer de PHP, mais ça c’est une autre histoire :) .

Add comment February 20th, 2010

TeamSpeak Proxy

Si vous êtes un administrateur système, et que vous avez la gentillesse de bien vouloir laisser TeamSpeak passer sur votre firewall pour les pauvres étudiants de la résidence dont vous êtes l’administrateur qui ne pourraient sinon pas passer leur temps à jouer à WoW au lieu de travailler, alors vous avez probablement comme moi remarqué une chose : TeamSpeak n’a pas de port standard. Et c’est la merde ! Mon firewall se transforme peu à peu en gruyère…

Pour repousser la menace, j’ai donc décidé de coder un proxy pour TeamSpeak. Le principe est de l’installer sur une machine qui peut sortir sur tous les ports en UDP. Les clients utilisent un petit logiciel spécial pour ouvrir un canal temporaire le temps de l’utilisation de TS, et le proxy fait du port forwarding.

Pour l’instant

  • Le projet est hébergé sur Github, c’est aussi là que vous trouverez les tarballs, installeurs, …
  • Il y a un installeur pour le client sous Windows, pour les autres OS vous devez compiler le client à la main (c’est du C++).
  • Le serveur est codé en Python, et utilise Twisted. Il n’y pas de paquet Debian ou de truc du genre…
  • Pour le support de TeamSpeak 2, je suis à peu près sûr de moi, par contre ce qui est de TeamSpeak 3 c’est encore en version β, histoire de faire un peu moderne.

N’hésitez pas à me contacter si vous n’avez pas la moindre idée de comment ça fonctionne (ça se comprend, c’est moi qui ai codé…) mais que ça vous intéresse quand même :)

Add comment January 21st, 2010

Radiateur…

J’aurai jamais pensé écrire un article là dessus, mais vu que j’ai eu du mal à trouver de l’aide sur internet… C’est dingue ce que la vie réelle nous ratrappe des fois :)

Donc depuis pas longtemps j’ai un appartement chauffé au gaz, ce qui fait que j’ai eu quelques manips à faire (pour info, ma chaudière est une Saunier Duval “Thema F 23″) :

  • La chaudière ne démarre que si la pression est suffisante (grosso modo 1,5 bar chez moi). Si la pression est trop faible, il y a des manettes sous la chaudière à tourner en même temps pour la remplir, ça fait augmenter la pression (de toute façon, ça c’est marqué sur l’étiquette).
  • Si la pression est trop importante, on peu la baisser en purgeant un radiateur : en haut du radiateur il y a un petit trou avec un truc à faire tourner par un tourenvis. Quand on tourne, ça ouvre le “robinet” et ça laisse sortir de l’eau, ce qui diminue la pression dans la chaudière. Attention à pas trop vider non plus…
  • Si le radiateur fait “glouglou” c’est que y’a de l’air. Si y’a de l’air, alors c’est de l’espace en moins occupé par l’eau chaude, et donc en plus de faire “glouglou” ça chauffe moins. La solution est simple : il faut purger. Au lieu d’avoir de l’eau qui sort, ça sera de l’air. Il faut purger jusqu’à ce que l’eau arrive… Attention conséquence du point précédent : ça baisse la pression. Attention donc à ne pas se retrouver avec une chaudière dépressurisée… (sinon, faut faire comme au premier point :) )

/me gagne +1 en compétence plomberie \o/

Add comment January 15th, 2010

La cohésion interne chez Google

Quand une boite devient un peu grosse, il peut arriver qu'elle choppe des tendance schizophréniques. Par exemple, si on fouille bien dans le code source de Go, on trouve ça :

C:
  1. // Is it a broken browser?
  2.     var msg string;
  3.     switch agent := req.UserAgent; {
  4.     case strings.Index(agent, "MSIE")>= 0:
  5.         msg = "Internet Explorer"
  6.     case strings.Index(agent, "Chrome/")>= 0:
  7.         msg = "Chrome"
  8.     default:
  9.         return
  10.     }

J'aime bien le principe d'un produit "Google" (le Go n'a pas l'air si Google que ça) qui en insulte un autre :)

(pour info, on trouve ça dans le fichier $GOROOT/src/pkg/http/server.go, vous aurez l'explication complète de pourquoi Chrome se fait traiter de broken en commentaire de la fonction :) )

2 comments November 17th, 2009

Go : un serveur TCP

Dans la catégorie je fais mumuse avec Go : je fais un serveur TCP qui répond invariablement "Hello, World !" à tous les clients qui se connectent.

C:
  1. package main
  2.  
  3. import (
  4.     "fmt";
  5.     "net";
  6.     "strings";
  7. );
  8.  
  9. func handler(c *net.TCPConn) {
  10.     c.Write(strings.Bytes("Hello, World !\n"));
  11.     c.Close();
  12. }
  13.  
  14. func main() {
  15.     addr, err := net.ResolveTCPAddr("127.0.0.1:5896");
  16.     l, err := net.ListenTCP("tcp4", addr);
  17.  
  18.     if l == nil {
  19.         fmt.Println("Could not listen : ", err);
  20.     }
  21.  
  22.     for {
  23.         a, err := l.AcceptTCP();
  24.         if a == nil {
  25.             fmt.Println("Could not accept : ", err);
  26.         }
  27.         go handler(a);
  28.     }
  29. }

Add comment November 15th, 2009

Chaîne aléatoire en PHP

Ça sert toujours, une fonction pour générer une chaîne aléatoire :

PHP:
  1. function randStr($len, $alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") {
  2.     $as = strlen($alphabet) - 1;
  3.     $str = "";
  4.  
  5.     for($i = 0; $i <$len; $i++) {
  6.         $str .= $alphabet[rand(0, $as)];
  7.     }
  8.  
  9.     return $str;
  10. }

Add comment November 15th, 2009

Previous Posts


Categories

Links

Feeds

Wikipedia Affiliate Button