Filed under: Programmation

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 :) .

Leave a Comment February 20, 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 :)

Leave a Comment January 21, 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 :

	// Is it a broken browser?
	var msg string;
	switch agent := req.UserAgent; {
	case strings.Index(agent, "MSIE") >= 0:
		msg = "Internet Explorer"
	case strings.Index(agent, "Chrome/") >= 0:
		msg = "Chrome"
	default:
		return
	}

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 17, 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.

package main

import (
	"fmt";
	"net";
	"strings";
);

func handler(c *net.TCPConn) {
	c.Write(strings.Bytes("Hello, World !\n"));
	c.Close();
}

func main() {
	addr, err := net.ResolveTCPAddr("127.0.0.1:5896");
	l, err := net.ListenTCP("tcp4", addr);

	if l == nil {
		fmt.Println("Could not listen : ", err);
	}

	for {
		a, err := l.AcceptTCP();
		if a == nil {
			fmt.Println("Could not accept : ", err);
		}
		go handler(a);
	}
}

Leave a Comment November 15, 2009

Chaîne aléatoire en PHP

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

function randStr($len, $alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") {
	$as = strlen($alphabet) - 1;
	$str = "";

	for($i = 0; $i < $len; $i++) {
		$str .= $alphabet[rand(0, $as)];
	}

	return $str;
}

Leave a Comment November 15, 2009

Go : VIM et Makefile

Me voici en train de faire mumuse avec le Go, nouveau langage fraîchement annoncé par Google (j’sais pas si le projet est bien porté à cœur par Google même quand on voit la tronche de leurs t-shirts et de leur site, sans compter l’annonce lors d’un simple tech talk). Même si leur mascotte ressemble largement trop à Glenda, j’ai donc quand même décidé de leur porter un peu d’attention. Dans ce but, j’ai suivi leur tuto d’installation, mais pour le compléter j’ai écris un Makefile pour compiler un seul fichier (la flemme de faire la compilation “à la main”) :

GOARCHPREF=6
GOCOMPILE=$(GOARCHPREF)g
GOLINK=$(GOARCHPREF)l

%: %.$(GOARCHPREF)
	$(GOLINK) -o $@ $<

%.$(GOARCHPREF): %.go
	$(GOCOMPILE) $<

Mettons que je veuille compiler truc.go :

make truc

On récupère à la sortie un fichier truc exécutable.

Ça c’est le Makefile pour amd64. Si vous êtes sous x86, mettez le GOARCHPREF à 8, et si vous êtes sous ARM mettez le à 5.

Ah et j’oubliez, comment coder sans coloration syntaxique dans Vim ? Ils sont gentil, ils donnent les règles de coloration syntaxique pour Vim (et d’autres éditeurs sans importance) dans le répertoire $GOROOT/misc/vim. Pour l’installer, il faut le copier (au moins sous Debian) dans /usr/share/vim/vim72/syntax/, puis ajouter la ligne

au BufNewFile,BufRead *.go setf go

Au fichier /usr/share/vim/vim72/filetype.vim

Et ça sera tout pour aujourd’hui :) Moi j’men vais coder un serveur quelconque en Go :)

EDIT : ouais non définitivement, ce projet Google s’en tape en fait. Par exemple, le site du langage ne parle nulle part de “Google”…

4 Comments November 12, 2009

Compiler Aegisub sous Debian (et Ubuntu ?)

Voulant faire du sous titre en ASS, le meilleur logiciel que j’ai pu trouver dans ce but est “Aegisub“. Il a pas mal de fonctions, par contre pour le compiler c’est un peu la misère totale.

Sous Debian Sid, j’ai réussi avec la méthode que je vais détailler plus loin, mais c’est pas garanti que ça fonctionne avec toutes les cartes graphiques… Sous Ubuntu, ça devrait être à peu près pareil aussi.

Trève de bavardage, une fois les sources téléchargées (je vous laisse vous amuser à les trouver…), il faut se rendre dans le dossier, puis taper les commandes :

sudo aptitude install build-essential libglu1-mesa-dev libfreetype6-dev libfontconfig1-dev libwxgtk2.8-dev libwxbase2.8-dev intltool libhunspell-dev libopenal-dev libasound2-dev libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libpostproc-dev liblua5.1-0-dev libxext-dev
LUA_CFLAGS=-I/usr/include/lua5.1 LUA_LDFLAGS=-llua5.1 ./configure
make -j3
sudo make install

Je garanti pas du tout que ça fonctionne, mais au moins y’a de bonnes pistes (par exemple, pour savoir comment avoir le support de Lua…)

Note : les dernières versions de Aegisub semblent demander WX Widget 2.9, et ce n’est toujours pas packagé dans Debian. Personellement je n’ai pas encore la force mentale pour arriver à compiler cette horreur, donc j’vais rester sur ma vieille revision tant pis…

Leave a Comment September 23, 2009

The Button

Sur Karibou, Naouak a eu l’idée d’un jeu totalement débile, nommé “Le Bouton”. Ayant depuis peu un compte sur la Wave Sandbox, je me suis amusé à reproduire le jeu en gadget Wave.

On peut donc trouver le fichier XML du jeu à l’adresse http://old.hyperthese.net/wave-gadgets/the-button.xml. Le code source est bien entendu sous licence WTFPL. Il y a des morceaux de PHP qui croustillent dans les fichier, le code source est donc disponible ici.

Edit: et voilà comme demandé un petit screenshot. Au passage, j’en profite pour signaler que j’ai corrigé les problèmes de compatibilité avec Firefox 3.5 (il semblerait que Wave + Firefox 3.5 + Prototype ne soient pas copains…)

The Button

6 Comments August 6, 2009

Dates…

Histoire de m’amuser un peu, j’ai fait une jolie expression régulière qui détecte les dates au format YYYY-MM-DD en vérifiant que le mois existe et que le nombre de jours dans le mois est correct (par contre le 29 février n’est pas géré, il est toujours accepté quelle que soit l’année)

(\d{4})-((10|12|0?1|0?3|0?5|0?7|0?8)-(10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|0?1|0?2|0?3|0?4|0?5|0?6|0?7|0?8|0?9)|(11|0?2|0?4|0?6|0?9)-(10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|0?1|0?2|0?3|0?4|0?5|0?6|0?7|0?8|0?9)|(0?2)-(10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|0?1|0?2|0?3|0?4|0?5|0?6|0?7|0?8|0?9))(\s|$)

Et tant qu’on y est, la même pour gérer toutes les dates, à année positives ou négatives

(-?\d+)-((10|12|0?1|0?3|0?5|0?7|0?8)-(10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|0?1|0?2|0?3|0?4|0?5|0?6|0?7|0?8|0?9)|(11|0?2|0?4|0?6|0?9)-(10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|0?1|0?2|0?3|0?4|0?5|0?6|0?7|0?8|0?9)|(0?2)-(10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|0?1|0?2|0?3|0?4|0?5|0?6|0?7|0?8|0?9))(\s|$)

Et puis on va finir avec quelques liens : une pages qui liste des expressions régulières de détection de date et une autre page qui liste toutes les dates remarquables pour les systèmes informatiques jusqu’à ce que le nombre de particules dans l’univers soit trop faible pour qu’on puisse écrire la date…

2 Comments May 8, 2009

The Hitchhiker’s Guide to the Galaxy (H2G2)

Et oui je reviens à l’attaque avec H2G2 (ben j’suis en train de lire le bouquin alors forcément faut que j’en parle). Mais cette fois ci, c’est par ce que je recherchais la définition de l’amour donnée par le Guide, et comme j’avais la flemme de feuilleter le bouquin j’ai tapé dans un moteur de recherche (j’vais pas dire leur nom, ils ont suffisament de pub et d’utilisateurs comme ça) “Hitchhiker’s Guide to the Galaxy” histoire de voir ce que ça donnait. De là, j’ai eu deux résultats intéressants (en dehors des wikipedia et autres pages explicatives sur le bouquin) :

Le premier, c’était un guide fait par la BBC (pour rappel, c’est eux qui ont diffusé H2G2 dans un premier temps, autant la série radio que TV). On peut y trouver tout un tas d’articles sur plein de sujets différents, ça ressemble à une sorte de Wikipedia décalée…

Mais c’est pas ça le plus mieux :) Le plus mieux c’est un guide produit conjointement par les Industries Lourdes Vogones et les Éditions Megadodo. Il est moins complet que l’autre, mais si on regarde attentivement la première page on peut voir le petit dessin suivant :

Netscape 3.0

Attendez une seconde… Netscape 3.0 ? C’est moi ou on a un site qui est capable de lire du son, d’interragir dynamiquement avec l’utilisateur (vous avez vu la tête de l’interface ?), et même d’attraper ses exceptions et de les afficher dans une popup quand il plante qui a été codé pour Netscape 3.0 ?! Le site a quand même l’air de dater de 1997…
Petite leçon d’histoire : en 1995 on commence à voir les possibilités de web dynamique apparaître (naissance du PHP, invention du CGI, apparition de l’applet Java, et premières apparitions du Javascript dans Netscape). En 1997, on le HTML pointe à peine le bout de son nez (il a été publié en décembre), et le XML commence à être inventé. On commence à parler de Web 2.0 en 2004, d’Ajax en 2005…
Donc là on se situe en 1997, et on a déjà une application purement en javascript exécutable côté client (oui par ce que côté serveur il se passe rien, ils avaient pas de CGI ou de truc comme ça sur leur serveur apparament). Certes on peut pas vraiment dire qu’ils font de l’Ajax, puisqu’ils n’utilisent pas XMLHttpRequest, mais en même temps on peut pas leur en vouloir : ça n’existait pas encore :) . Ça les empêches pas d’avoir été vachement novateur je trouve… J’en reste assez impressionné !

Leave a Comment February 22, 2009

Previous page


Calendar

February 2012
M T W T F S S
« Oct    
 12345
6789101112
13141516171819
20212223242526
272829  

Archives

Categories