Category Archives: dev

Git Server on Debian

After testing GIT, and without hesitation, I decided to abandon SVN/Subversion. I won’t write here one more article comparing them but I wrote (and update regularly) a wiki page explaining how to install it on Debian and give access via HTTP, SSH and HTML.

http://wiki.gonzofamily.com/a/Install_GIT_as_public_repository_on_Debian

I also noted how I transfered my existing local XCode repositories to this server, but I will improve this doc soon:

http://wiki.gonzofamily.com/a/GIT_and_XCode

Retrieve local IPv4/IPv6 on Wifi/Cellular on iPhone

On iOS, you want to know your local IP (for example, when an application opens a webpage on the wifi interface) but the iOS SDK provides no simple way to get the IP Address for the wifi connection.

I found an interesting Method in Objective-C which retrieve the IPv4 address of the wifi connexion as a NSString on Zach Waugh’s blog.

Sadly it doesn’t work with IPv6. So I modified it and here is the code:

http://wiki.gonzofamily.com/a/Retrieve_local_IPv4/IPv6_on_Wifi/Cellular

Lovely Charts

image-41

Grâce à Fahed j’ai pu découvrir Lovely Charts . Il faut s’inscrire, mais c’est gratuit.

Il permet de créer des diagrammes en ligne. Comme le permet Visio sur votre PC.
Mais là s’arrête le point commun entre ces 2 outils car Lovely Charts est d’une simplicité d’utilisation déconcertante quand on n’a connu que visio.

A présent il n’est donc plus nécessaire de perdre des heures sur visio pour :

  • dessiner des schémas pour un réseau informatique
  • réaliser des diagrammes de toutes sortes
  • dessiner des formulaires web (tous les types sont déjà pret, checkbox et select par exemple)

J’ai même pu faire un schéma pour une base de données en un temps record.

Les schemas que j’ai réalisé sont confidentiels… il va falloir aller tester vous même, c’est si bien fait qu’on a même pas besoin de période d’apprentissage : http://my.lovelycharts.com/

voici l’interface :

image-81

Lorsque l’on veut lier des objets, finalement il suffit juste de changer de mode en cliquant sur le 2e boutons ci-dessous, puis on repasse dans le mode normal en cliquant sur le premier bouton :

image-61

Installer Apache, MySQL et PHP sur Mac OS 10.5 avec MacPorts

image-3

On me demande souvent comment installer Apache/Mysql/Php sur Mac. Il faut avouer que les versions déjà présentes dans Mac OS X sont dépassées.

Ce blog nous décrit précisement une solution bien efficace avec MacPorts : Installer Apache, MySQL et PHP sur Mac OS 10.5 avec MacPorts

Il y fait allusion rapidement à MAMP, mais ce logiciel ne nous avait pas convaincu car il oblige à laisser tourner un logiciel et nous n’avions pas pu ajouter les modules que nous souhaitions. MacPorts fonctionnera  plutôt comme un daemon.

MAMP conviendra à quelqu’un qui code “tous les 36 du mois” certainement.

Voici un copier/coller pour le cas où la page ne serait plus joignable :

J’en ai déjà parlé, la version de PHP fournie avec Mac OS X Leopard est assez… épurée : pas de GD ou de PEAR par exemple et la compilation d’extensions ne marchent pas (cf. mon billet sur Runkit). Pour une utilisation (très?) basique de PHP cela suffira mais si vous voulez, par exemple, manipuler des images il faudra utiliser une autre solution…

Parmi les autres solutions possibles, j’ai choisi d’utiliser MacPorts et de compiler “moi-même” PHP. Certains auraient peut-être choisi MAMP qui est une solution plus simple et plus “rapide” mais peut-on compiler des extensions avec ? A priori oui mais je n’en suis pas sûr. L’objectif est aussi de pouvoir installer d’autres packages que le trio Apache-MySQL-PHP et de mettre à jour ces packages très simplement (une ligne de commande).

Pour ceux que cela intéresse, voici la procédure pour installer et configurer Apache-MySQL-PHP avec MacPorts sur Leopard. A noter que je suppose que vous avez déjà installé les “Developper Tools” d’Apple.

Installation de MacPorts

  1. Téléchargez MacPorts sur le site officiel : http://www.macports.org/
  2. Ouvrez l’image disque (.dmg)
  3. Lancez le .pkg et suivez les instructions.
  4. Une fois l’installation terminée, allez dans le terminal et lancez la commande :
    sudo port selfupdate

Installation d’Apache 2.2

  1. Installez Apache 2.2 en exécutant la commande qui suit dans le terminal :
    sudo port install apache2
  2. Une fois l’installation terminée, lancez Apache :
    sudo /opt/local/apache2/bin/apachectl start
  3. Si vous allez à l’adresse http://localhost vous devriez voir “It works!” à l’écran.
  4. Si vous souhaitez qu’Apache soit lancé au démarrage de votre ordinateur, lancez la commande ci-dessous :
    sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist

Configuration d’Apache 2

Maintenant qu’Apache 2 est installé, nous allons le configurer pour qu’il fonctionne comme la version d’Apache fournie avec Mac OS X Leopard.

  1. Ouvrez le fichier /opt/local/apache2/conf/httpd.conf avec votre éditeur préféré.
  2. Recherchez la ligne
    #Include conf/extra/httpd-userdir.conf

    et enlevez le caractère # au début.

  3. Editez le fichier /opt/local/apache2/conf/extra/httpd-userdir.conf et ajoutez à la fin les lignes ci-dessous :
    #
    # Include user configurations
    #
    Include /etc/apache2/users/*.conf
  4. Si vous souhaitez accéder au manuel d’Apache à l’adresse http://localhost/manual/ :
    1. Editez le fichier /opt/local/apache2/conf/httpd.conf
    2. Recherchez la ligne ci-dessous et enlevez le # au début.
      #Include conf/extra/httpd-manual.conf
  5. Si vous souhaitez afficher la liste des éléments d’un dossier lorsqu’il n’y a pas de fichier index dedans :
    1. Editez le fichier /opt/local/apache2/conf/httpd.conf
    2. Recherchez la ligne la ligne ci-dessous et enlevez le # au début.
      #Include conf/extra/httpd-autoindex.conf
  6. Relancez Apache :
    /opt/local/apache2/bin/apachectl restart

Installation et configuration de Mysql 5

  1. Dans le terminal, lancez la commande suivante :
    sudo port install mysql5 +server
  2. Une fois l’installation terminée, exécutez la commande :
    sudo -u mysql mysql_install_db5
  3. Démarrez le serveur MySQL :
    sudo /opt/local/bin/mysqld_safe5 &
  4. Sécurisez votre installation de MySQL :
    sudo /opt/local/bin/mysql_secure_installation5
  5. Si vous voulez que MySQL soit automatiquement lancé au démarrage, lancez la commande suivante :
    sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist

Installation de PHP 5

  1. Lancez l’installation de php5 :
    sudo port install php5 +apache2 +mysql5 +sqlite +pear
  2. Une fois l’installation terminée, créez un fichier de configuration pour php (le php.ini) :
    sudo cp /opt/local/etc/php.ini-dist /opt/local/etc/php.ini
  3. Installez le module php pour Apache :
    cd /opt/local/apache2/modules
    sudo /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so
  4. Editez le fichier /opt/local/apache2/conf/httpd.conf, recherchez
    DirectoryIndex index.html

    et remplacez par

    DirectoryIndex index.html index.php
  5. Editez le fichier /opt/local/apache2/conf/httpd.conf et ajoutez à la fin les lignes suivantes :
    # Load the PHP module
    LoadModule php5_module modules/libphp5.so
    
    #
    # Include PHP configurations
    #
    Include conf/extras-conf/mod_php.conf
  6. Relancez Apache : /opt/local/apache2/bin/apachectl -k restart
  7. Vous pouvez maintenant créer dans votre dossier Sites (/Users/votrePseudo/Sites/) un fichier phpinfo.php

Voilà, votre environnement de développement AMP est installé et prêt à acceuillir vos scripts et applications ! Pour aller un peu plus loin, vous pouvez installer phpmyadmin et xdebug, avec MacPorts bien sûr.

Concernant MacPorts, je l’utilise depuis maintenant plusieurs mois et j’en suis très content. J’ai pu installer tous les packages dont j’avais besoin très simplement et sans problème. Je regrette juste de ne pas l’avoir découvert plus tôt…

Mysql 1114 The table is full

Si vous ne pouvez plus insérer d’enregistrement dans une base sous MySQL qui vous dit :

#1114 – The table ‘*****’ is full

Et que vous êtes en innoDB et que vous n’avez pas de problème d’espace disque après vérification, c’est sans doute qu’une limitation explicite dans le fichier de configuration de mySQM : /etc/mysql/my.cnf

Il faut donc ajouter plus de place à la base de donnée (parametre en rouge dans l’exemple suivant) :

# you may wish to change this size to be more suitable for your system
# the max is there to avoid run-away growth on your machine
innodb_data_file_path = ibdata1:10M:autoextend:max:256M
Là on a mis 256MO (117MO réels) au lieu de 128MO
C’est vraiment évident non ?

Vincent

Surveillance SNMP sur les Imprimantes

Toutes nos imprimantes ont la possibilité d’être surveillées en SNMP. Il devient intéressant d’avoir une vue d’ensemble sur une page web.

Au départ j’ai utilisé le PHP pour récupérer les numéros MIB utiles à la configuration de Nagios pour ajouter les imprimantes à notre monitoring. Puis il s’est avéré plus utile de garder la page PHP lorsque Canon nous appelait pour savoir si telle ou telle imprimante fonctionnait bien (ils sont capables de recevoir des messages pour le début de pannes, mais pas pour leur fin… vive le 21e siècle chez Canon).

Donc j’utilise la commande suivante sous linux

snmpwalk -Oa -v1 -c public x.x.x.x mib-2.43.18.1.1.8

x.x.x.x étant l’adresse IP ou le nom DNS de l’imprimante.

Cela m’a donné un code PHP ressemblant à ceci (bien sûr c’est un code écrit rapidement que j’améliorerais à l’usage) :

$printers = array(
“impr-irc2880-01”,
“impr-irc2880-02”,
“impr-irc2880-03”,
“impr-irc2880-04”,
“impr-irc2880-05”,
“impr-c1-01”,
“impr-c1-02”,
“impr-tech-01”);

$html = “”;

//recupération des messages dans un tableau $printers_tab
foreach($printers as $printer){

//on echape d’éventuelles commandes shell
$printer = escapeshellcmd($printer);

//-Oa permet d’éviter d’avoir des messages en Hexa
//mib-2.43.18.1.1.8 semble dans notre cas rassembler tous les messages d’erreurs
$cmd = “snmpwalk -Oa -v1 -c public $printer mib-2.43.18.1.1.8”;

//$output n’est pas correctement vidé à chaque usage de exec
unset($output);
exec($cmd,$output,$retourne);

//si la commande Shell a retourné une erreur on l’affiche (parfois juste une erreur dans l’adresse)
if($retourne != 0)
$printers_tab[$printer][0] = “erreur({$retourne})<br/>\n”;

//sinon, s’il n’y a aucun message on place un message indiquant que tout est “OK”
else{
$nbmsg = count($output);
if($nbmsg == 0) $printers_tab[$printer][0] = “OK”;
//et sinon on récupère tous les messages
else
for($i=0; $i < $nbmsg; $i++)
$printers_tab[$printer][$i] = $output[$i];
}
}

/****************************************************************************
* $printers_tab[“nom_imprimante”][0-n] contient tous les messages à afficher par imprimante
***************************************************************************/

//affichage dans une liste
$html.= ”
<!– liste des imprimantes –>
<div id=’imprimantes’>
<ul id=’liste_imprimantes’>
“;

//pour chaque imprimante
foreach($printers_tab as $name=>$messages){

$html.= ”
<li ><a href=’http://$name/’ target=’_blank’>$name</a><ul>”;

//pour chaque message correspondant à l’imprimante $name
foreach($messages as $message){

$message = trim($message);

//les 30 premieres caractère correpondent à SNMPv2-SMI::mib-2.43.18.1.1.8.
//je garde les derniers numéros pour tenter d’en comprendre la logique
$afficher = substr($message, 30);
//moins de 30 caractères correspond à un message non attendu qu’on affichera
if(empty($afficher))
$afficher = $message;

$html.= ”
<li class=’message_impr’>$afficher</li>”;
}
$html.= ”
</ul></li>”;
}

$html.= ”
</ul><br style=’clear:both;’ />
<p>(Interrogation de SNMPv2-SMI::mib-2.43.18.1.1.8)
</p>
</div>
“;

J’obtiens un affichage de ce genre :

*           impr-irc2880-01
o             1.191 = STRING: “The M toner is low.”

*           impr-irc2880-02
o             OK

*           impr-irc2880-03
o             1.279 = STRING: “The M toner is low.”
o             1.280 = STRING: “Paper is out.”

*           impr-irc2880-04
o             1.206 = STRING: “Paper is out.”

*           impr-irc2880-05
o             OK

*           impr-c1-01
o             OK

*           impr-c1-02
o             OK

*           impr-tech-01
o             1.56 = STRING: “Powersave activ..”
(Interrogation de SNMPv2-SMI::mib-2.43.18.1.1.8)

Messagerie Vocale Orange sur votre site web

Orange met à disposition une API pour accéder à notre messagerie vocale.

Cela signifie que l’on peut créer des applications (donc des sites web) qui permettent d’accéder à notre messagerie vocale.

Cela permet par exemple :

  • d’avoir un répondeur où les auditeurs laissent des messages et de laisser tout le monde les écouter sur le net
  • de supprimer les messages une fois récupéré en mp3, changer l’annonce.
  • On peut enfin archiver définitivement tous ses messages sans limite.
  • récupérer ses messages par email (pratique à l’étranger !)
  • etc etc etc

Une annonce personnalisée enfin paramétrable par heure. On peut enfin informer tous les mardi soir que si on est injoignable c’est parce qu’on a piscine ! et. Il doit y avoir des applications plus pratiques comme empêcher de laisser des messages le week-end et la nuit.

C’est par là : http://www.orangepartner.com/site/frfr/access_orange_apis/voicemailapi/understand/p_voicemail_api_understand.jsp

Encodage des sujets des emails

Lorsqu’on envoi un email via nos applications “maison”, il arrive incroyablement souvent que l’encodage du sujet soit laissé de coté. CodeIgniter n’échappe pas à la règle.
Des antispam comme spamassassin pénalisent fortement ce genre de courrier.

La RFC 2047 indique comment doit être encodé un sujet d’email. C’est assez simple, ça utilise le même encodage que les url – en php la fonction urlencode() peut donc être utilisée – à l’exception des caractères = qui remplacent les caractères % habituels et des espaces qui n’ont pas à être remplacés par des +

Spamassassin pénalise également les emails qui contiennent plusieurs fois l’indication de l’encodage, bien que la rfc l’autorise. Nous allons donc indiquer une bonne fois pour toute en début et ne plus le mentionner. Donc le sujet doit commencer par =?UTF-8?Q?

Une fonction PHP qui fait tout cela est mb_encode_mimeheader() :

Et voila, nos emails seront beaucoup mieux notés par les messageries qui utilisent Spamassassin comme antispam et nous aurons la satisfaction de respecter les normes internet.