Corbeau-Web

Aller au contenu | Aller au menu | Aller à la recherche

samedi 21 janvier 2012

Ne faites jamais confiance aux Macros

On ne le répète jamais assez, faites attention quand vous utilisez des macros dans vos programmes. Voici un exemple parfait de se qu'il ne faut jamais faire ! Comme ça vous allez me dire que le résultat affiché sera 6... Et ben moi je vous dis que vous avez tout faux! Dans cet exemple, la post-incrémentation casse tout puisqu'au moment du parsing des preprocesseurs, le compilateur va croire que la variable a de la macro est ++x et non pas x incrémente de 1.

#include <stdio.h>
#include <stdlib.h>
 
#define         max(a,b) ((a) > (b) ? (a) : (b))
 
int     main(void)
{
  int   x = 5;
  int   y = 3;
 
  printf("res: %d\n", max(++x, y));
 
  return (0);
}

Avec GCC, vous pouvez utilisez le flag -E pour voir ce qui sera réellement compilé :

#> gcc -E fail.c
...
int main(void)
{
  int x = 5;
  int y = 3;
 
  printf("res: %d\n", ((++x) > (y) ? (++x) : (y)));
 
  return (0);
}

Allez, vous avez de la chance, il est possible de corriger se cas épineux juste en réécrivant la macro correctement. Mais attention, le langage C ne propose pas de de standard pour ce genre de chose, pr conséquent le code qui suit ne fonctionne que sur les compilateurs prenant en compte les extensions GNU.

#include <stdio.h>
#include <stdlib.h>
 
#define min(X, Y)                \
  ({ typeof (X) x_ = (X);        \
    typeof (Y) y_ = (Y);         \
    (x_ > y_) ? x_ : y_; })
 
int     main(void)
{
  int   y = 5;
  int   x = 3;
 
  printf("res: %d\n", ++y, x);
  return (1);
}

jeudi 24 novembre 2011

La face cachée de printf

Même après 6 ans d’utilisation de printf, cette fonction continue à m’impressionner. J’ai découvert récemment qu’il était possible d’ajouter des nouveaux « specifier » à la commande de base sans avoir à la recoder entièrement. Il faut avouer que le petit fichier printf.h dans /usr/include/ m’a un peu mis la puce à l’oreille, mais au final il s’avère que cette mini API est relativement simple d’utilisation et efficace !

La fonction en question est la suivante :

int register_printf_specifier (int __spec, printf_function __func, printf_arginfo_size_function __arginfo);

Si vous voyez des programme qui utilise une autre fonction comme par exemple register_printf_modifier(...), vous pouvez soufler dans les bronches du developeur car celle-ci est deprecated depuis un bon moment.

Maintenant qu'on a vu le prototype de cette magnifique fonction, voyons un peu ce que ça donne en pratique.

#include <stdio.h>
#include <stdlib.h>
#include <printf.h>
 
static unsigned int     buffer_size(unsigned int n)
{
}
 
 
static int      my_binary(FILE *stream, const struct printf_info *info, const void *const *args)
{
}
 
 
static int      my_binary_info(const struct printf_info* info __attribute__ ((unused)), size_t n, int* argtype, int* size __attribute__ ((unused)))
{
}
 
int             main(void)
{
  register_printf_specifier('b', my_binary, my_binary_info);
  printf("binary: %ld -> %b\n", 65536, 65536);
  printf("binary: %ld -> %b\n", 42, 42);
  printf("binary: %ld -> %b\n", 2, 2);
  return (0);
}

Il est grand temps de tester ce petit programme. Passons un coup de moulin sur notre fichier .c

0xbaadf00d@corbeau-web ~/programmation $ cc printf_binary.c -ansi -pedantic
0xbaadf00d@corbeau-web ~/programmation $ ./a.out
  binary: 65536 -> 0010000000000000000
  binary: 42 -> 0101010
  binary: 2 -> 010
0xbaadf00d@corbeau-web ~/programmation $

Et voila, notre printf gère maintenant le %b. Bien entendu il ne gère pas toute les joyeuseté du printf comme par exemple %.8b, mais l'API a tout prevu, il vous suffira de jeter un coup d'oeil sur la structure printf_info.

mercredi 23 novembre 2011

Installer PHP-HipHop

0x01 - Introduction

Beaucoup de développeurs ont déjà évoqué le fait de vouloir compiler du code issu d'un langage interprété. Bien souvent, ceux qui voulaient le faire avec des langages initialement prévus pour le web sont vite devenus le sujet principal de diverses boutades… Mais sachez qu’aujourd’hui, compiler du code PHP est maintenant une réalité ! Et finalement ce n’était pas une idée si saugrenu que ça.

Le projet fut développé par Facebook qui trouvait que le code PHP était trop lent et consommait trop de mémoire. L’idée principale était d’utiliser beaucoup moins de mémoire et d’ajouter la possibilité d’effectuer des opérations en parallèle à l’aide de la librairie TBB (Intel Threading Building Blocks). Hip-Hop était annoncé au grand public le 2 février 2010. Mais suite à des soucis majeurs, il ne fut accessible que le 20 février.

Il existe également d’autres compilateurs PHP tels que « phpc » ou encore « Roadsend PHP Compiler » mais ils ne sont pas correctement adapté pour une utilisation web.

0x02 - Procédure d'installation de Hip-Hop PHP

Avant de commencer quoi que ce soit, il est important de préciser que Hip-Hop ne fonctionne correctement que sur une architecture 64bits. De plus le logiciel comporte un nombre important de dépendances à satisfaire dont certaines nécessite l'application de correctifs (fournis avec Hip-Hop)

Dépendances de base

Suivant votre distribution Unix/Linux, vous pouvez utiliser votre gestionnaire de paquets préféré ou alors compiler les sources vous-même pour les dépendances suivantes :

• cmake (2.6.4 minimum) • g++/gcc (4.3 minimum) • Boost (1.39 minimum) • flex • bison • re2c (0.13.0 minimum) • libmysql • libxml2 • libmcrypt • libicu (4.2 minimum) • openssl • binutils and binutils-dev • libcap • gd • zlib • tbb Intel’s Thread Building Blocks (2.2 minimum) • libmbfl • Oniguruma • libpcre3 • libexpat • libmemcached (0.39 minimum) • libc-client2007e-dev • libbz2-dev • libreadline-dev • openldap-dev

Dépendances nécessitants un correctif

• libCurl : Rendez-vous sur le site internet de Curl (http://curl.haxx.se) et téléchargez les sources pour la version 7.20.0. Après avoir décompressé l’archive, appliquez le patch « libcurl.fb-changes.diff » que vous trouvez dans « hiphop-php/ src/third_party/ »

meyer_t@0xbaadf00d> cd libcurl-7.20
meyer_t@0xbaadf00d> cp ../hiphop-php/src/third_party/libcurl.fb-changes.diff .
meyer_t@0xbaadf00d> patch -p1 < libevent-1.4.13.fb-changes.diff
root@0xbaadf00d> ./configure && make && make install

• libEvent : Le principe est le même pour cette bibliothèque. Rendez-vous sur le site internet de libEvent (http://libevent.org) et téléchargez les sources pour la version 1.4.14. Après avoir décompressé l’archive, appliquez le patch « libevent-1.4.14.fb-changes.diff» que vous trouvez dans « hiphop-php/ src/third_party/ »

meyer_t@0xbaadf00d> cd libevent-1.4.14
meyer_t@0xbaadf00d> cp ../hiphop-php/src/third_party/ libevent-1.4.14.fb-changes.diff .
meyer_t@0xbaadf00d> patch -p1 < libevent-1.4.14.fb-changes.diff
root@0xbaadf00d> ./configure && make && make install

Récupérer et Compiler Hip-Hop Hip-Hop est un peu contraignant dans le sens où le répertoire que vous utiliserez pour compiler l’application devra forcement être le même que celui où le binaire et les bibliothèques devront se trouver…

root@0xbaadf00d> mkdir /hiphop-php
root@0xbaadf00d> cd /hiphop-php
root@0xbaadf00d> git clone git://github.com/facebook/hiphop-php.git
root@0xbaadf00d> git submodule init
root@0xbaadf00d> git submodule update
root@0xbaadf00d> export HPHP_HOME=`pwd`
root@0xbaadf00d> export HPHP_LIB=`pwd`/bin
root@0xbaadf00d> cmake .
root@0xbaadf00d> make && make install
root@0xbaadf00d> cp ./ src/hphp/hphp /usr/bin/

0x03 - Compilez et exécutez votre premier projet

La compilation est relativement simple à mettre en route. Le plus simple avant toute chose est de créer une liste des fichiers à compiler grâce à la commande « find ».

meyer_t@0xbaadf00d> find . -name "*.php" > files.list

Ici nous avons uniquement des fichiers .php, mais il est possible d’en inclure d’autres. Par exemple pour Drupal, il faudra également inclure les fichiers .inc, .engine, .install, .theme et .module dans votre files.list.

Nous allons lancer la compilation en indiquant a Hip-Hop qu’il doit utiliser files.list et que le répertoire de sortie des fichiers générés se trouve dans /tmp/my_project/.

meyer_t@0xbaadf00d> export HPHP_HOME=/hiphop-php/hiphop-php
meyer_t@0xbaadf00d> hphp --input-list="files.list" -k 1 --log=3 --include-path="." --force=1 --cluster-count=50 -o "/tmp/my_project/"
meyer_t@0xbaadf00d> ./program -m server -v "Server.SourceRoot=/home/0xbaadf00d/htdocs/www/" -v "Server.DefaultDocument=index.php" -p8080

vendredi 11 novembre 2011

Une alternative à l'interpréteur de commandes (CMD) sur Windows

Après avoir bien ragé sur l’interpréteur de commandes Windows, mieux connu sous le nom de CMD. J'ai effectué quelques recherches sur notre amis commun Google et j'ai trouvé une alternative, qui je dois bien l'avouer, est bien sympathique. L'application codée en C++ s'appelle Console2, vous pouvez la télécharger gratuitement sur le site officiel du développeur : http://sourceforge.net/projects/console.

Console2 - Windows

Parmis les avantages, les plus appréciables sont le fait de pouvoir redimensionner la fenêtre comme bon vous semble et la possibilité d'ajouter des onglets (comme gnome-terminal ou encore xfce4-terminal).

samedi 5 novembre 2011

Easter egg dans Spotify

Premier easter egg sympathique sur Spotify. Si vous écoutez une des pistes "Nyan Cat", le slider en bas de l'application se transforme en Nyan Cat !!



Spotify - Easter Egg

mercredi 14 septembre 2011

Windows 8 : la Developer Preview est sortie !

Depuis ce matin, la "Developer Preview" de Windows 8 est disponible en téléchargement. On sent très bien que Microsoft veut se tourner vers les plateforme 64 bit (Pas trop tôt) en voyant que seul la version 64 bit propose toutes les options disponibles :

   * Windows SDK for Metro style apps
   * Microsoft Visual Studio 11 Express for Windows Developer Preview
   * Microsoft Expression Blend 5 Developer Preview
   * 28 Metro style apps including the BUILD Conference app

cette préversion ne comprend pas les éléments présentés par Microsoft lors de ses présentations, comme les applications Windows Live (mail, calendrier, contacts) ou encore le Windows Store qui apparaitra plus tard.

Après l'installation de 40 minutes: Premier constat, l'implémentation du compte Hotmail est complète, elle permet même de créer un compte utilisateur. Apres la phase de configuration (Nom de la machine, utilisateur, ...) premier effet de "Woww, c'est quoi cette merde?" l'interface Metro est certes carrément agréable sur un Windows Phone, mais la, sur un ordinateur de bureau, il s'avère qu'elle est complètement inadapté. Apres 3 heures, je n'ai pas trouver d'option pour avoir un Menu démarrer classique (en gardant le thème graphique de Windows 8). En gros dans cette preview, quand l'utilisateur clique sur démarrer, l'interface Metro apparait.

Point de vue driver, il fallait s'y attendre, beaucoup ne sont pas compatible et le menu "Panneau de configuration" est super mal agencé. Par exemple, vous cliquer sur "Utilisateur" il vous ouvre une fenêtre classique comme sous Windows 7, mais vous cliquer sur "Changer votre mot de passe" (depuis la nouvelle fenêtre classique), il vous bascule sur une interface Metro. Bonjour la perte de temps entre chaque action pour un utilisateur de type développeur. Bref, pour conclure, cette preview m'a carrément refroidi pour ce prochain Windows qui s'annonce comme une surcouche graphique raté de Windows 7. Mais, pour ce qui est de l'IDE Visual Studio et de Blend 5, le constat est tout autre. Ces outils on su garder leur coter "Desktop" et conservent donc une ergonomie normale. Si vous aussi vous souhaitez vous faire une idée de ce Windows 8, vous pouvez également télécharger le disque d'installation au format .iso sur le site officiel de Microsoft : http://msdn.microsoft.com/en-us/windows/apps/br229516.

Windows 8 - Preview - 001 Windows 8 - Preview - 002 Windows 8 - Preview - 003 Windows 8 - Preview - 004 Windows 8 - Preview - 005 Windows 8 - Preview - 006 Windows 8 - Preview - 007 Windows 8 - Preview - 008 Windows 8 - Preview - 009

samedi 3 septembre 2011

N'ayez pas peur du void !

Un billet très court destiné à tous les développeurs C. L'utilisation du mot clef void est très souvent négligé dans les fonctions n'acceptant pas de paramètres. En effet depuis la C99, une fonction n'acceptant pas de paramètres sans utiliser le mot clef void est considéré comme deprecated !

Void is Good

jeudi 1 septembre 2011

[Malicious] Deadlands - Introduction au Root-kit sous Windows

Introduction

L'un de derniers projets de 4éme année à Epitech concerne un élément important de la sécurité informatique : les Root-Kit ! Durant ce projet, nous avons vu comment mettre en place un root-kit sous Windows affin que celui-ci masque la présence de processus dans l'arborescence des processus lancés (tasklist) en utilisant la méthode DKOM (Direct Kernel Object Manipulation). Pour ce faire, la première chose à réaliser est de télécharger les outils nécessaires WinDDK (http://msdn.microsoft.com/en-us/windows/hardware/gg487463) et un bon éditeur de texte pour coder. Maintenant que vous avez les outils adéquats, place à la théorie !

Squelette du driver

Au final notre root-kit sera un magnifique driver (fichier .sys) avec lequel on dialoguera viq IOCTL. Pourquoi un driver ? tous simplement car le driver n'est pas assujetti aux règles de sécurité une fois qu'il est exécuté : il pourra allez et venir comme il le souhaite dans des processus qui ne sont pas à lui. Bien, le template d'un tel projet et relativement simple, il est composé d'un fichier SOURCES (équivalent du Makefile Linux) et d'au moins 1 fichier .c.

Un fichier SOURCES minimaliste ressemble à cela (le fichier du projet à été tronqué car il était assez grand :-)

TARGETNAME=DEADLANDS
TARGETPATH=OBJ
TARGETTYPE=DRIVER
SOURCES=deadlands_driver.c	\
		deadlands_dkom.c

Pour ce qui est du point d'entré d'un driver, il suffit d'utiliser :

NTSTATUS	DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
return (STATUS_SUCCESS);
}

voila, maintenant, il reste plus qu'a définir quelques fonction de voter driver histoire qu'il soit "compliant" avec l'OS (si le driver implémente pas un minimum de fonctions (Major Function), il risque de crasher/freezer votre machine à son chargement). Parmi ces fonctions, on aura Read/Write/Open/Close.

Structures des processus dans la mémoire

En Kernel Land, il est possible d'obtenir la liste des processus lancés depuis n'importe qu'elle application (Ben oui, on a tous les droits xD). Donc autant le faire simple, on va demander son propre process avec la fonction :

PEPROCESS  IoGetCurrentProcess(void);

DKOM - Win Process

Comme le montre ce diagramme, il y a un élément nommé LIST_ENTRY qui sonne accès à une liste doublement chainées qui permet de se promener de processus en processus et donc de pouvoir rechercher le processus que l'on souhaite masquer. Pour effectuer se masquage, il suffit de le retirer de la liste doublement chainée.

Bonus

Maintenant que vous avez un projet fonctionnel, il faut penser aux Bonus, comme par exemple signer votre drivers, prendre en compte l'aspect multitâches de votre système d'exploitation, le loader (qui va charger votre driver sur la cible), le prise en compte multi-OS (XP, Vista, Seven | 32 ou 64 bits)...

Deadland_vista_signed

samedi 6 août 2011

Google Music Beta, le test !

Depuis ce matin je suis comme un petit fou sur le nouveau service en Bêta proposé par Google, je parle bien de "Google Music". L'interface est simple et claire, mais des le début, on nous force déjà à installer un logiciel sur son ordinateur (Google aurai pu penser a un système d'upload directement depuis le navigateur). Une fois celui-ci installée, il nous demande ou se trouve notre musique et si il doit l'uploader automatiquement ou non. Après quelques heures d'upload, allons voir ce que propose le service en ligne !

Le web service propose un système de playlist et de notation (star rating) , L'onglet "My Library" propose diverse vues comme l'affichage par Artistes, par Albums ou encore par Genres. L'agencement fait un peu penser a Windows Media Player 11 avec la pochette de l'album en haut à gauche et la liste des chansons sur la droite. En ce qui concerne la lecture, on reste dans le classique et ce n'est pas pour déplaire: nous avons donc une barre d'avancement avec l'indication durée actuelle / durée total, le bouton lecture, pause, suivant et précédant. Pour les options de lecture, on trouvera le mode Shuffle (Lecture aléatoire de la playlist), l'option "repeat" et le contrôle du volume!

Pour conclure, je dirais que Google nous montre encore une fois sont savoir faire dans les services Web avec un produit honorable et qui propose une bonne qualité d'écoute mais qui ne s'adressera pas à tous le monde! Fan de Deezer, Jiwa ou encore Spotify, je pense que vous allez passer votre chemin, mais a tous ceux qui possède moult quantités de musique et qui ne veulent plus s'embêter d'une pile de CD ou d'un disque dur, ce service est fait pour vous !

Google Music 001 Google Music 005 Google Music 002 Google Music 003 Google Music 004

samedi 23 avril 2011

Mettez en place un cluster de calcul à la maison

Aujourd'hui nous allons voir comment mettre en place un cluster sous LAM/MPI pour effectuer du calcul parallèle. LAM (Local Area Multicomputer) MPI (Message Passing Interface) est souvent considérer comme "cluster friendly". Il est est basé sur un démon qui contrôle les processus et s'occupe de la communication inter-nodes. MPI peut utiliser le protocole TCP/IP, la mémoire partagée, Myrinet (GM), ou Infiniband (mVAPI) pour le passage de messages.

La mise en place de LAM/MPI est extrêmement facile, nous allons voir les étapes à suivre sous Debian 6. Pour commencer, nous allons créer l'utilisateur "lammpi" sur toute les machines de votre cluster (car travailler en root c'est über mal, et de toute façon, LAM/MPI refusera de fonctionner en root).

Attention

Le poste Tomahna est le serveur maître de la grappe que je possède.

root@tomahna ~ # useradd lammpi
root@tomahna ~ # mkdir /home/lammpi
root@tomahna ~ # chown lammpi:lammpi /home/lammpi
 
root@releeshahn ~ # useradd lammpi
root@releeshahn ~ # mkdir /home/lammpi
root@releeshahn ~ # chown lammpi:lammpi /home/lammpi
 
root@edanna ~ # useradd lammpi
root@edanna ~ # mkdir /home/lammpi
root@edanna ~ # chown lammpi:lammpi /home/lammpi

Une fois les comptes créés, nous allons configurer correctement l'authentification par clef pour ssh afin que vous ne soyez pas emmerdé toutes les 5 minutes par LAM/MPI. Sur le serveur maître, il suffit de générer une clef.

lammpi@tomahna ~ # ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/lammpi/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/lammpi/.ssh/id_rsa.
Your public key has been saved in /home/lammpi/.ssh/id_rsa.pub.
The key fingerprint is:
41:10:e8:9b:c8:52:0b:54:8a:75:32:2c:b6:be:dd:2f lammpi@tomahna

Ensuite, il suffit d'ajouter le contenu de "id_rsa.pub" dans le fichier /home/lammpi/.ssh/authorized_keys2 sur les autres serveurs de la grappe.

lammpi@releeshahn ~ # cat id_rsa.pub >> /home/lammpi/.ssh/authorized_keys2
lammpi@edanna ~ # cat id_rsa.pub >> /home/lammpi/.ssh/authorized_keys2

Voila, maintenant, que le serveur maître (Tomahna) peut se connecter tranquillement aux nodes, nous allons installer LAM/MPI sur chacunes des machines. Un petit tour sur le site officiel de LAM/MPI (www.lam-mpi.org) s'impose, histoire de récupérer la dernière version du logiciel.

lammpi@tomahna ~ # wget http://www.lam-mpi.org/download/files/lam-7.1.4.tar.gz
lammpi@tomahna ~ # tar xf lam-7.1.4.tar.gz
lammpi@tomahna ~ # cd lam-7.1.4
lammpi@tomahna ~ # ./configure
lammpi@tomahna ~ # make
lammpi@tomahna ~ # make install
 
lammpi@releeshahn ~ # wget http://www.lam-mpi.org/download/files/lam-7.1.4.tar.gz
lammpi@releeshahn ~ # tar xf lam-7.1.4.tar.gz
lammpi@releeshahn ~ # cd lam-7.1.4
lammpi@releeshahn ~ # ./configure
lammpi@releeshahn ~ # make
lammpi@releeshahn ~ # make install
 
lammpi@edanna ~ # wget http://www.lam-mpi.org/download/files/lam-7.1.4.tar.gz
lammpi@edanna ~ # tar xf lam-7.1.4.tar.gz
lammpi@edanna ~ # cd lam-7.1.4
lammpi@edanna ~ # ./configure
lammpi@edanna ~ # make
lammpi@edanna ~ # make install

Et voila, pour la dernière étape, nous allons éditer le fichier de configuration sur le serveur maître, il se trouve à /usr/local/etc/lam-bhost.def. Voilà le contenu du mien :

root@tomahna ~ # cat /usr/local/etc/lam-bhost.def
tomahna cpu=1 user=lammpi
releeshahn cpu=1 user=lammpi
edanna cpu=1 user=lammpi

Pour mettre en route votre cluster, il suffit de lancer la commande lamboot sur le serveur maître.

lammpi@tomahna ~ # lamboot
 
LAM 7.1.4/MPI 2 C++/ROMIO - Indiana University

Et pour avoir des informations sur les nodes

lammpi@tomahna ~ # lamnodes
n0 tomahna:1:origin,this_node
n1 releeshahn:1:
n2 edanna:1:

Bien, maintenant, que votre cluster est prêt, il serait peut être temps de le tester non ? Ci-joint, le fichier mpi_pi.c permet de calculer le chiffre pi en utilisant le calcul parallèle. Il suffit d'utiliser "mpicc" pour le compiler et scp pour l'envoyer sur les différentes nodes.

lammpi@tomahna ~ # mpiccc mpi_pi.c -o test_pi.bin
scp test_pi.bin releeshahn:/home/lammpi/
scp test_pi.bin edanna:/home/lammpi/

Pour l’exécuter, la commande "mpirun" est de rigueur :

lammpi@tomahna ~ # mpirun C ./test_pi.bin

lammpi - pi

vendredi 15 avril 2011

[Secu] Honey Pipe

Encore un projet génial à réaliser en 1 mois. Il s'agit de mettre en place un MITM et d’écouter/modifier des communications qui s'effectuent via le protocole Netsoul. Pour commencer, il faut réaliser un "dissector" Netsoul pour que Wireshark puisse comprendre les données transitant via le port 4242. Il est possible de développer le dissector de plusieurs façons : en PIDL (qui servira ensuite à auto-générer les fichiers C), en C directement ou encore en LUA.

J'ai choisi de le développer uniquement en C et sous forme de module (il est également possible de le faire de façon statique, mais ça impose de recompiler Wireshark entièrement à chaque fois)

|-- wireshark
|   `-- plugins
|       `-- netsoul
|            |-- Makefile
|            |-- Makefile.am
|            |-- Makefile.common
|            |-- moduleinfo.h
|            |-- packet-netsoul.c
|            `-- plugin.c

Netsoul - Dissector 1/2  Netsoul - Dissector 2/2


La deuxième partie du projet concerne le MITM et le "ARP cache poisoning" couplé à un petit logiciel de mon cru pour visualiser et modifier les données qui transitent par mon PC :-)

Netsoul - MITM - Proxy

mercredi 30 mars 2011

Installer VirtualBox sur une Kimsufi OVH

Vous êtes beaucoup à me demander de remettre ce billet en ligne. Alors pour vous faire plaisir, j'ai fouiller dans mes disques dur en quête d'un backup de mon ancien blog. Et bingo, il me restait effectivement une sauvegarde cachée tout au fond d'un vieux disque dur externe.

Si vous souhaitez installer VirtualBox sur un serveur dédié OVH vous vous heurterez à un problème de kernel, en effet, OVH fournit ses propres kernels sans les sources donc il impossible de le recompiler pour ajouter tout pleins de bonnes choses. Je vais vous expliquer étapes par étapes comment procéder si vous aussi vous souhaitez faire de même. Avant de commencer, je tiens à préciser que suis sur un hébergement kimsufi, mais le principe devrait s'appliquer a tout les dédiés OVH et que j'utilise Debian 5 ainsi que aptitude plutôt que apt-get.

Alors, pour commencer, il faut mettre à jour votre serveur en tapant les commandes suivantes :

root@corbeau-web> aptitude update
root@corbeau-web> aptitude dist-upgrade

Ensuite on va installer GRUB pour remplacer LILO (le bootloader des kimsufi est LILO), cette étape est très importante car sans-elle vous ne pourrez pas continuer votre aventure :-)

root@corbeau-web> aptitude install grub

Maintenant il faut indiquez à votre serveur ce qu'il devra faire au démarrage. Dans mon cas, je ne suis pas en IDE donc j'utiliserai /dev/sda1 pour qualifier le disque dur. Si jamais vous êtes en IDE préférez /dev/hd0.

root@corbeau-web> grub-install /dev/sda1
root@corbeau-web> update-grub

La dernière commande a générée les fichiers de configuration de GRUB, à présent, on va configurer ce bootloader, pour cela il faut entrer dans le programme GRUB:

root@corbeau-web> grub

Une fois dedans, tapez les commandes suivantes :

grub> root(hd0,0)
grub> setup(hd0,0);
grub> quit

Cette fois-ci que le bootloader est installé et configuré, nous pouvons installer le nouveau kernel. En premier lieu, regardons les kernels disponibles, pour ça, il faut faire :

root@corbeau-web> aptitude search linux-image

Dans mon cas, j'ai le kernel “linux-image-2.6-amd64” qui correspond le mieux. Nous allons donc installer celui-ci.

root@corbeau-web> aptitude install linux-image-2.6-amd64

refaites ensuite un petit coup de "update-grub" puis redémarrer votre dédié OVH.

root@corbeau-web> update-grub
root@corbeau-web> reboot

Une fois le système redémarré, il faut vérifier que vous êtes bien sur le bon kernel.

root@corbeau-web> uname -a
Linux corbeau-web 2.6.26-2-amd64 #1 SMP Thu Nov 5 02:23:12 UTC 2009 x86_64 GNU/Linux

Maintenant vous pouvez supprimer LILO (ou non, c'est comme vous le sentez) :

root@corbeau-web> aptitude remove -purge lilo

Je vous conseil également avant d'aller plus loin de mettre à jour votre kernel avec la toute dernière version disponible (2.6.38 à l'heure actuelle). Vous trouverez facilement les sources sur le site kernel.org.

Youhou, tout est prêt pour installer VirtualBox maintenant (site officiel). Rendez-vous sur le site officiel pour télécharger le package correspondant à votre distribution (ici Debian 5). Dans mon cas, il s'agira du package"virtualbox-4.0_4.0.4-70112lenny_amd64.deb" que je vais récupérer à grand coup de wget. et ensuite un coup de dpkg pour installer.

root@corbeau-web> dpkg -i virtualbox-4.0_4.0.4-70112~Debian~lenny_amd64.deb
root@corbeau-web> /etc/init.d/vboxdrv setup

Et voila, vous avez à présent VirtualBox d’installé sur votre dédié. Il ne vous reste plus qu’à commencer à créer des VM. Je vous recommande de bien lire la documentation sur les commande “VBoxManage” et “VBoxHeadless” sur le site de VirtualBox. Si vous avez des soucis pendant l'installation de VirtualBox, vérifiez que vous avez bien les sources kernel d'installés !

lundi 21 mars 2011

Maquiller Debian pour installer Oracle

Le premier problème avec Oracle, c'est que en plus de vendre leurs produits à des prix exorbitants, ils ont le culot de fournir un programme d'installation tout pourris qui refuse de s'exécuter si vous ne possédez pas RedHat 3, RedHat 4, Fedora Core 6, AsiaLinux 1 ou AsiaLinux 2. Enfin bref des antiquités ! Bien entendu, Oracle en lui-même fonctionne parfaitement sur des versions plus récentes de Linux. Dans ce billet, nous verrons comment faire croire au programme d'installation que notre Debian 6 (Squeeze) est une version acceptable !

Pour commencer, il va falloir installer un petit lot de programmes et de librairies :

apt-get install unzip rpm sudo gcc gcc-4.1-base gcc-4.3-base gcc-4.4-base libgcc1 gcc-4.1 gcc-4.3 gcc-4.4 cpp-4.1 cpp-4.3 cpp-4.4 cpp libstdc++5 libstdc++6 libstdc++6-4.4-dev lesstif2-dev lesstif2 libxt6 libxt-dev libao4 libao-dev libao-common libaio1 libaio-dev librpm1 librm-dev libdb-dev libdb4.6 libdb4.7 libdb4.8 libdb4.8-dev libneon27 libneon27-dev libneon27-gnutls libc6-dev libc6 libbeecrypt7 libbeecrypt-dev libssp0

Si certains packages n'existent pas dans votre dépôt, il suffira d'aller faire un petit tour sur le site : http://packages.debian.org

maintenant que tous est installés, nous allons simuler l'arborescence d'un serveur RedHat :

ln -s /usr/bin/awk /bin/awk
ln -s /usr/bin/rpm /bin/rpm
ln -s /usr/bin/basename /bin/basename
ln -s /etc /etc/rc.d
ln -s /lib/libgcc_s.so.1 /lib/libgcc_s.so

Debian n'est n'utilise pas les .rpm, mais il peut le faire. Avant toute chose il est nécessaire de reconstruire la structure du dépôt RPM :

mkdir /var/lib/rpm
rpm --initdb
rpm --rebuilddb

Pour finir, on va créer un nouveau fichier qui permettra au programme d'installation de détecter la bonne version !

echo "Red Hat Linux release 3.0 (drupal)" > /etc/redhat-release

Et voila : vous êtes fin prêt pour installer Oracle 10G sur votre Debian 6, have fun !

vendredi 18 mars 2011

Équivalent du preg_match PHP en Java

Il est toujours pratique d'isoler des éléments d'un texte et il n'y a rien de plus rageux que de devoir parser le texte à la main, surtout quand le pattern est toujours le même. En PHP il existe deux fonctions complètements géniales qui s'appelle preg_match et preg_match_all. Après en avoir eu besoin en Java, je me suis rendu compte que comme toujours dans ce langage, les choses existent mais elle ont changées de nom et la façon des les utiliser est différentes. Les fonctions preg_match et "preg_match_all" ne dérogent pas à cette règle :

Prenons par exemple un bout de page internet du site TDM :

<span class="small">						 Ecrit par Anonyme					</span>					&nbsp;&nbsp;				</td>			</tr>						<tr>				<td valign="top" colspan="2" class="createdate">					15-02-2011				</td>			</tr>					<tr>			<td valign="top" colspan="2">				<div align="justify">Aujourd&#39;hui, j&#39;ai d&eacute;couvert que mon CDM avait d&eacute;pos&eacute; un papier en lien avec mon sujet &agrave; une conf&eacute;rence &agrave; laquelle il trouve inutile que j&#39;aille... CDM </div>

En appliquant le code java suivant, nous pourrons alors isoler les parties suivantes :

  • L'auteur du billet
  • La date de création
  • Le texte du billet
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Pattern p = Pattern.compile("<span class=\"small\">(.*)</span>					&nbsp;&nbsp;				</td>			</tr>						<tr>				<td valign=\"top\" colspan=\"2\" class=\"createdate\">(.*)</td>			</tr>					<tr>			<td valign=\"top\" colspan=\"2\">				<div align=\"justify\">(.*)</div>");
            Matcher m = p.matcher(page);
            while (m.find() == true) {
                System.out.println(m.group(1).trim());
                System.out.println(m.group(2).trim());
                System.out.println(m.group(3).trim());
            }

Il est bon de souligner que l'appel à m.group(0) permet d'obtenir le pattern qui match en totalité !

lundi 14 mars 2011

Requêtes HTTP en POST sous Android

La mise en place d'une requête HTTP sous Android est relativement simple et utile si vous souhaitez par exemple mettre à jour des scores pour un classement ou encore vérifier l'existence d'une mise à jour de votre application. Avant toutes choses, il faut ajouter 3 entrées supplémentaires dans le manifest.xml de votre projet :

  • android.permission.ACCESS_WIFI_STATE : Permet de savoir si le Wifi est activé sur le terminal mobile.
  • android.permission.NETWORK : Utilisation des sockets.
  • android.permission.INTERNET : Utilisation d'internet en général.
HttpClient httpclient = new DefaultHttpClient();
            HttpPost post_data = new HttpPost("http://www.my_domain_name.com/api.php");
            try {
                List<NameValuePair> postValues = new ArrayList<NameValuePair>(1);
                postValues.add(new BasicNameValuePair("data", "my_data"));
                post_data.setEntity(new UrlEncodedFormEntity(postValues));
 
                String line;
                HttpResponse response = httpclient.execute(post_data);
                InputStream is = response.getEntity().getContent();
                BufferedReader rd = new BufferedReader(new InputStreamReader(is));
                while ((line = rd.readLine()) != null)
                {
                	mEditor.setText(mEditor.getText()+ line);
                }
            } catch (ClientProtocolException e) {
            	mEditor.setText(mEditor.getText()+ e.toString()); //host not found
            } catch (IOException e) {
            	mEditor.setText(mEditor.getText()+ e.toString());
            }

Transformer un .jar en exécutable Windows

Aujourd'hui nous allons voir une façon simple de transformer une application Java en .jar vers un exécutable Windows. Le but n'est pas de se passer de JRE mais de fournir une jolie application avec un manifeste et une icône qui se chargera de lancer le .jar inclus dedans et de vérifier que l'utilisateur possède bien la bonne version de Java. Pour accomplir cette transformation, nous allons utilisez l'application nommée "Launch4j". Elle est très simple à utiliser, il suffira de remplir quelques champs obligatoires comme par exemple l'emplacement où se trouve votre .jar, où se trouve le fichier Icone (.ico), la version minimum de Java requise par votre application et enfin où vous souhaitez que le .exe soit enregistré !

Launch4j - 001 Launch4j - 002 Launch4j - 003

Launch4j est téléchargeable gratuitement sur Sourceforge (http://sourceforge.net/projects/launch4j/)

samedi 12 mars 2011

[C#] Premier projet .net avec le MediaPlayer

MyWindowsMediaPlayer Alpha Ce projet tombe dans le cadre du module "M2 .net" à Epitech. Le but est très simple, il faut réaliser un clone de Windows Media Player (WMP) avec .net en utilisant la WPF (Windows Presentation Foundation). Le lecteur doit posséder, au minimum, des fonctionnalités suivantes :

  • Gestion d’une bibliothèque de médias (images, sons, vidéos).
  • Possibilité d’appliquer différentes filtres (albums, artistes, genre)
  • Possibilité de créer des playlists.

Jusque la rien de compliqué, ca peut se faire en une après-midi. Mais pour corser un peu le projet, on nous impose les contrainte suivante :

  • Utilisation du pattern MVVM obligatoire
  • Utilisation de LINQ pour le parsing d’un fichier XML (architecturé comme bon vous semble) pour la récupération des différentes données.
  • Utilisation du moteur de Binding.

La seul difficulté rencontrer avec le MVVM fut lors de la création d'un CommandsRelay pour séparer complètement les actions de l'interface. Il n'est pas toujours évident de travailler en séparant le code de l'interface, surtout quand il s'agit de récupérer des Events de partout qui doivent avoir accès à l'interface. Mais dans l'ensemble, ce projet c'est déroulé sans accrocs !

mardi 8 mars 2011

Construit ton monde dans Minecraft

Avez-vous toujours rêver de devenir le maitre du monde ? Aujourd'hui votre vœu va devenir réalité avec Minecraft ! Ce jeu qui est encore en phase de développement vous propose un monde brute qui à un peu près 9x la taille de la planète Terre. Le monde est composé de bloques carrés de différents types (Terre, Pierre, Gravier, Sable, charbon, Diamant, Acier, ...). Grâce aux bloques vous pourrez donner libre cours à votre imagination pour bâtir votre monde et confectionner des objets tels que des fours, des lits, du verre ou encore des épées...

Minecraft 001 Minecraft 001

Si vous aussi vous souhaitez rejoindre l'aventure, voici le site officiel du jeu : http://www.minecraft.net

samedi 26 février 2011

[Droit] Fin du module de droit M1

Et voila, le droit c'est terminé pour ce semestre :-) Après quelques heures de cours à étudier le droit d'entreprise à parler des contrats de travail, des délégués du personnel, délégué syndicaux et du Comité d'entreprise. On se retrouve devant un feuillet de 5 feuilles dont 2 réservées pour le sujet qui, cette fois, était un compte-rendu de 2 affaires devant les prud'hommes. Ensuite vient le QCM à 20 questions dont 5 qui ne sont pas basées sur le sujet, mais plus sur la culture générale du droit.

Ci-joint, vous trouverez un exemple type de sujet.

Les captures d'ecran sur le Steam Cloud !

Une nouveauté dans Steam qui s'aligne sur pas mal de jeu EA du moment : la possibilité de réaliser des captures d'écran in-game et de les partager en ligne. Steam nous propose un espace de stockage de 1 Gio avec la possibilité de choisir entre 3 options de sécurité (Public, Amis seulement, juste moi). Il est également possible de visionner les galeries publique des utilisateurs et de laisser des commentaires à la façon de FaceBook :-)

Pour réaliser une capture d'écran, rien de plus simple, il suffit d'appuyer sur la touche F12, ensuite une fenêtre apparaitra dans votre HUD Steam (Maj + Tab) pour vous demandez si vous souhaitez ou non publier cette image (qui sera de toute façon enregistrée sur votre disque dur).

SteamCloud - Screen 001 SteamCloud - Screen 002 SteamCloud - Screen 003

Après les sauvegardes, voici les images. Une nouvelle option qui s'annonce intéressante pour partager des moments épics avec ses amis et qui permet de centraliser les images de n'importe quels jeux au même endroit mais qui n'a rien d'innovante, dommage.

- page 1 de 2