Tag : Tutoriel

Installer dashing sur un Raspberry Pi

http://www.maraumax.fr/medias/tutoriels/dashing/thumb.pngCa fait un moment que j'utilise dashing au travail pour surveiller quelques services et prestataires. Voici un petit tutoriel pour installer sur un raspberry pi le dashboard Dashing.

Installer dashing sur un raspberry pi

Débugguer un coredump Apache/Php avec GDB

J'ai mis quelque temps avant de me lancer dans l'analyse des coredump remontés dans mes logs apaches. La méthode est assez complexe et longue, je vous propose donc un petit "how-to" pour analyser les dump de Apache / Php.

Voici un exemple de log dans apache2 :

# Log Apache error.log
[Wed Nov 19 10:07:56 2014] [notice] child pid 22204 exit signal Bus error (7), possible coredump in /etc/apache2
[Wed Nov 19 10:12:28 2014] [notice] child pid 22664 exit signal Bus error (7), possible coredump in /etc/apache2

Pas la peine de vous rendre dans /etc/apache2 car malgré ce qui est indiqué il n'y a aucune infos dans la dossier en question surement due aux droits du dossier.

Pour analyser le fichier généré nous allons devoir compliler apache2 et php avec les options de débug. Dans mon cas je travaille sur des instances EC2, je vous déconseille fortement de faire ces manipulations sur un serveur de prod. Si jamais vous n'avez pas d'autres serveur / machine sous la main, vous pouvez cependant relancer le second serveur apache sur un autre port en conservant votre version "prod".

Compilation de Apache2

Téléchargez dans les archives d'apache la version exactement de votre serveur. Pour connaitre votre version :

apache2 -v
Server version: Apache/2.2.22 (Ubuntu)
Server built:   Jul 22 2014 14:35:25

Les archives sont disponibles à cette adresse. J'ai donc téléchargé l'archive httpd-2.2.22.tar.gz.

# On se rend dans notre répertoire
cd
 
# On télécharge l'archive
wget http://archive.apache.org/dist/httpd/httpd-2.2.22.tar.gz
 
# On extrait l'archive et on rentre dans le dossier
tar xvzf httpd-2.2.22.tar.gz && cd httpd-2.2.22
 
# On définit les paramètres de compilation pour débugger
export CFLAGS="-DBIG_SECURITY_HOLE -g"
 
# On lance la configuration, j'ai ajouté les mods rewrite et ssl
./configure --enable-so \
  --enable-rewrite --enable-ssl --enable-mods-shared='rewrite ssl'
 
# On compile !
make && sudo make install

Apache2 est désormais installé dans la répertoire  /usr/local/apache2/ avec les différents dossiers comme bin, conf, logs...

Si jamais le module htaccess n'est pas chargé, on ajoute la ligne dans le httpd.conf

# Activation du module rewrite
echo "LoadModule rewrite_module modules/mod_rewrite.so" >> /usr/local/apache2/conf/httpd.conf

Vous pouvez désormais démarer / arrêter apache2 :

# Démarrage
sudo /usr/local/apache2/bin/httpd -k start
 
# Vérification
ps aux |grep apache2
root     27836  0.0  0.1 220232  8392 ?        Ss   Nov19   0:02 /usr/local/apache2/bin/httpd -k start
root     27838  0.0  0.8 275316 64452 ?        S    Nov19   0:38 /usr/local/apache2/bin/httpd -k start
root     27839  0.0  0.8 276164 65088 ?        S    Nov19   0:32 /usr/local/apache2/bin/httpd -k start
root     27840  0.0  0.1 222608 11728 ?        S    Nov19   0:37 /usr/local/apache2/bin/httpd -k start
 
# Arrêt
sudo /usr/local/apache2/bin/httpd -k start

Si vous n'avez pas d'erreurs c'est que cette première partie s'est bien passée.

Compilation de PHP

L'installation de PHP est semblable à apache2, il y a juste quelques configuration à faire dans le httpd.conf en plus.

Téléchargez votre version de PHP depuis le museum. J'utilise actuellement la version php-5.3.10.tar.gz. On passe ensuite à la compilation !

# Quelques paquets nécessaire
sudo apt-get install libbz2-dev libpng12-dev libmysqlclient15-dev
 
# Change de répertoire
cd
 
# Téléchargement de l'archive
wget http://museum.php.net/php5/php-5.3.10.tar.gz
 
# Extraction
tar xvzf php-5.3.10.tar.gz && cd php-5.3.10
 
# Configure
./configure \
--with-pear=/usr/share/php \
--with-bz2 \
--with-curl \
--with-gd \
--enable-calendar \
--enable-mbstring \
--enable-bcmath \
--enable-sockets \
--with-libxml-dir=/usr \
--with-mysqli \
--with-mysql \
--with-openssl=/usr \
--with-regex=php \
--with-zlib \
--enable-debug \
--with-gettext \
--with-libdir=/lib/x86_64-linux-gnu \
--with-apxs2=/usr/local/apache2/bin/apxs
 
# Compilation
make && sudo make install

PHP est désormais installé, il reste désormais quelques configuration à effectuer pour qu'il soit pris en compte !

 # Création du php.ini
cp php.ini-development /usr/local/lib/php.ini
 
# Chargement du module pour apache (vérifiez s'il n'est pas déjà chargé)
echo "LoadModule php5_module modules/libphp5.so" >> /usr/local/apache2/conf/httpd.conf

On ajoute ensuite les 3 lignes suivantes pour dire à apache d'interpréter le PHP :

# Dans votre httpd.conf
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

A ce stade vous devriez pouvoir démarer apache avec php ! Pour tester, créez un fichier /usr/local/apache2/htdocs/info.php :

<?php
 
phpinfo();

Vous devriez accèder aux infos de php via http://votreip/info.php !

Analyse du coredump

Avant d'analyser le coredump et faut configurer le système pour qu'il le crée.

Il faut dans un premier temps définir la taille maximum des fichiers core (par défaut à 0) :

# Ulimit
ulimit -c unlimited
 
# Vérification
ulimit -a |grep core
core file size          (blocks, -c) unlimited

Nous allons ensuite créer un répertoire pour recevoir les fichiers et indiquer à apache ou les créer :

# Création du dossier
mkdir /tmp/apache
 
# Droits
chmod 777 /tmp/apache
 
# Et on indique le répertoire à apache
echo "CoreDumpDirectory /tmp/apache" >> /usr/local/apache2/conf/httpd.conf
 
# On redémarre apache
sudo /usr/local/apache2/bin/httpd -k start
sudo /usr/local/apache2/bin/httpd -k stop

Il reste plus qu'a attendre le coredump !

# Wait and see
tail -f /usr/local/apache2/logs/error_log

Dés que vous avez l'erreur, vous pouvez arrêter apache. Rendez vous ensuite dans le répertoire /tmp/apache et vous devriez avoir le fichier "core".

Il nous reste à télécharger le fichier .gdbinit de PHP permettant de rendre "lisible" votre coredump ! Vous pouvez retrouver celui correspondant à votre version via le github. La version pour php 5.3.10 est disponible à cette adresse.

# Changement de répertoire
cd
 
# Téléchargement (prenez bien le format raw)
wget https://raw.githubusercontent.com/php/php-src/e4afa14812d10da7413096c742470fb0582ebc95/.gdbinit

Ensuite on install gdb :

# GDB
sudo apt-get install gdb

Et maintenant on peut enfin analyser le coredump :

# Répertoire
cd
 
# On exécute gdb avec le processus apache et le coredump
sudo gdb /usr/local/apache2/bin/httpd /tmp/apache/core

Vous allez ensuite obtenir la dernière étape de l'erreur :

Program terminated with signal 7, Bus error.
#0  0x00007f5b64bf8aab in lex_scan (zendlval=0x7fff2a324488) at Zend/zend_language_scanner.l:1797
1797            int bprefix = (yytext[0] != '\'') ? 1 : 0;

pour obtenir la pile vous pouvez utiliser la commande bt, le détail complet avec bt full. Pour analyser le coredump via php utilisez zbacktrace.

Dans mon cas j'ai obtenu l'erreur suivante :

(gdb) zbacktrace
[0x01a3ed28] load() /home/www/projet/includes/classes/Cache.class.php:58
[0x01a3eb98] load() /home/www/projet/includes/classes/Cache.class.php:28
[0x01a3d2b0] __construct() /home/www/projet/includes/common.php:63
[0x01a20e60] ??? /home/www/projet/includes/ajax.php:4

Il s'agissait d'un require sur un fichier cache qui était supprimé en cours de lecture a cause d'une mauvaise condition sur la date de mise à jour du cache.

En espérent avoir été utile, n'hésitez pas à consulter les liens suivants ou a poster un commentaire !
Compilation de apache2
Compilation de PHP

Créer des onglets personnalisés sur Android

http://www.maraumax.fr/medias/Billets/tutoriels/preview-onglets.pngVous souhaitez créer des onglets personnalisés dans votre application Android ? Je viens de créer un tutoriel permettant de modifier l'aspect par défaut des onglets afin de créer des onglets plus esthétiques et moins importants en taille.

Le tutoriel est assez simple et consiste à créer une vue à partir d'un fichier xml pour chaque onglet. Dans mon exemple j'ai simplement ajouté du texte dans cette vue, mais vous pouvez évidemment ajouter "ce que vous souhaitez" mais si c'est pour mettre un texte et une image autant ne pas vous embêter et utiliser le layout de base d'Android.

Vous pouvez télécharger les sources du tutoriel à la fin, n'hésitez pas à montrer le résultat de vos modifications et pourquoi les différents fichiers XML afin de donner des exemples pour les autres visiteurs.

Créer des onglets personnalisés sur Android

Tutoriel pour créer un widget Android

http://www.maraumax.fr/medias/Billets/android-widget-preview.jpgJ'ai récement mis en place un widget dans l'application Bonjour Android et j'ai été étonné de voir qu'il y avait peu de tutoriel complet pour créer cette fonctionnalité.

J'ai donc décidé de partager mon expérience afin de vous permettre de créer un widget de A à Z. Je n'explique les étapes de base du développement Android donc je vous conseille très forcement d'avoir installé tout le tralala (Eclipse, Avd...) et de connaitre le langage Java.

Plusieurs notions d'Android sont utilisés, libre à vous de consulter la documentation officielle qui est vraiment très bien détaillé pour avoir plus de détails. Vous avez peut-être remarqué que le widget n'est pas des plus jolis, je n'ai pas travaillé ce point mais si vous souhaitez me partager vos xml je modifirais le tutoriel avec plaisirs.

Il n'y a pas de système de commentaires à la suite de tutoriel, mais n'hésitez pas à poster sur ce billet en cas de question, remarque et pourquoi pas pour présenter votre application !

Voilà j'espère avoir tout dit, manque juste le lien pour consulter et en bas de page télécharger les sources...

Créer un widget sur Android