tag:blogger.com,1999:blog-61987069088836647182024-03-19T13:32:58.232+01:00Only GeekUn blog de geek pour les geeks ;)Franck Jousseaumehttp://www.blogger.com/profile/11980702847785840524noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-6198706908883664718.post-49568432104707924742015-02-15T12:54:00.002+01:002015-02-16T10:17:14.553+01:00Sismo et composer sur serveur OVH mutualisé, même sans SSH<strong>Ceci n'est pas une documentation sur l'utilisation de Sismo et/ou composer mais uniquement un tutoriel sur comment faire tourner ces deux outils sur OVH.</strong>
<p>Pour mes besoins personnels, je me suis pris dernièrement un serveur web mutualisé chez OVH.
Et pourquoi pas en profiter pour y mettre un serveur d'intégration continue ?
Et là, il n'y a pas trop de choix. Pas moyen de mettre un Jenkins, il nous faut quelque chose en PHP. Et ce sera donc <a href='http://sismo.sensiolabs.org/'>Sismo</a> !</p>
<h2>Installation de Sismo</h2>
<p>Sismo est un petit serveur d'intégration continue écrit en PHP et développé par Sensio, les mêmes que ceux qui ont fait Symfony.
Normalement, pour l'installer il suffit de déposer le seul et unique fichier php qui le constitue sur notre serveur.</p>
<p>Une des choses à savoir, c'est que Sismo se configure par le biais de <strong>variables d'environnements</strong>.<br/>
La deuxième chose à savoir, c'est que OVH ne permet l'accès qu'aux variables d'environnement préfixées par <code>PHP_</code><br/>
Et comme vous vous en doutez, les variables d'environnement utilisées par Sismo ne commencent pas par ce préfixe !</p>
<p>Heureusement, en bons programmeurs, les développeurs de Sismo ont pensé à mettre une valeur par défaut.
Mais là aussi il y a un problème car elle est basée sur une autre variable d'environnement: <code>HOME</code></p>
<p>Là, pas de solution miracle, il faut modifier le code de Sismo.</p>
<p>Commençons par cloner le projet github :<br/>
<code>git clone https://github.com/FriendsOfPHP/Sismo.git sismo</code></p>
<p>Maintenant, il va falloir modifier le fichier <code>src/app.php</code>.
Sachant que vous adaptez Sismo pour vos uniques besoins, vous pourriez simplement mettre des valeurs en dur.
Mais avouez que ça manque quand même cruellement d'élégance !</p>
<p>Je vous propose de renommer les variables d'environnement pour ajouter le préfixe <code>PHP_</code> et de remplacer le chemin par défaut par <code>__DIR__</code> qui désigne le répertoire où est installé Sismo.<br/>
Avec ça, vous gardez la possibilité de configurer Sismo avec quelques <code>SetEnv</code> dans un fichier <code>.htaccess</code> et vous vous assurez d'avoir un chemin par défaut fonctionnel dans tous les cas.</p>
<p>Il suffit de remplacer ces lignes dans le fichier <code>src/app.php</code> (lignes 35 à 37):<br/>
<code><pre>
$app['data.path'] = getenv('SISMO_DATA_PATH') ?: getenv('HOME').'/.sismo/data';
$app['config.file'] = getenv('SISMO_CONFIG_PATH') ?: getenv('HOME').'/.sismo/config.php';
$app['config.storage.file'] = getenv('SISMO_STORAGE_PATH') ?: getenv('HOME').'/.sismo/storage.php';
</pre></code>
par celles-ci :<br/>
<code><pre>
$app['data.path'] = getenv('PHP_SISMO_DATA_PATH') ?: __DIR__.'/.sismo/data';
$app['config.file'] = getenv('PHP_SISMO_CONFIG_PATH') ?: __DIR__.'/.sismo/config.php';
$app['config.storage.file'] = getenv('PHP_SISMO_STORAGE_PATH') ?: __DIR__.'/.sismo/storage.php';
</pre></code></p>
<p><em style="color:navy">Idéalement, il faudrait vérifier la valeur de <code>safe_mode_allowed_env_vars</code> où est défini ce préfixe et l'ajouter en début de nom des variables d'environnement utilisées dans le code. Je ne me suis pas encore penché sur cette question, mais si quelqu'un souhaite contribuer à Sismo je serai ravi que vous me piquiez cette idée ;-)</em></p>
<p>Vous pouvez maintenant recompiler Sismo avec le script prévu à cet effet et déployer le fichier <code>build/sismo.php</code> sur votre serveur OVH.</p>
<h2>Installation et utilisation de Composer</h2>
<p>Maintenant que Sismo est installé, nous pouvons nous attaquer à <a href="https://getcomposer.org/">composer</a>.<br/>
Comme c'est un outil qui a régulièrement des mises à jour, et qu'il nous rappelle à l'ordre si on n’exécute pas un <code>self-update</code> de temps à autres, on ne vas pas se contenter de l'installer une fois pour toute.<br/>
Il serait donc pratique de pouvoir demander à Sismo, grâce à son fichier de configuration, d'installer et maintenir à jour composer.
Et c'est exactement ce que nous allons faire.</p>
<p>Mais il va y avoir quelques embûches à surmonter pour pouvoir travailler avec composer.</p>
<p>La première première difficulté, qui n'en est pas une tellement elle est simple à contourner, est qu'on ne peut pas appeler composer directement avec la commande <code>./composer.phar</code><br/>
Le shebang avec <code>/usr/bin/var php</code> ne fonctionne pas. Pas grave, me direz vous, il suffit de passer le script en paramètre à php avec une commande du type <code>php ./composer.phar</code><br/>
Effectivement il suffira de faire quelque chose dans ce genre. Mais à cause des autres problèmes qui suivent, on va très vite modifier cette commande.</p>
<p>La deuxième difficulté, c'est que la version cli de php utilisable par défaut sur OVH date d'une époque antédiluvienne.<br/>
Car oui, accrochez-vous bien, un petit <code>php -v</code> vous apprendra que c'est une version 4 qui se lance...<br/>
Ca serait tellement mieux d'avoir un petit php 5 ! Pour ça, on peut utiliser <code>php.ORIG.5</code> au lieu de <code>php</code>, mais ça reste une assez vieille version de php 5.<br/>
Mais ne pleurez pas, il y a d'autres versions d'installées et il suffit juste de savoir où chercher. Un petit <strong>php 5.6</strong> ça vous va ?</p>
<p>La dernière difficulté, c'est que composer aussi utilise des variables d'environnement qui ne sont pas préfixées par <code>PHP_</code><br/>
Et comme on a dit qu'on voulait faire des mises à jour régulières, pas question cette fois de bidouiller le code !<br/>
Donc c'est avec la configuration de php qu'on va jouer pour s'en sortir.<br/>
Grâce à la magie du -d pour virer la valeur du paramétrage <code>safe_mode_allowed_env_vars</code>, notre problème s'envole !</p>
<p>Maintenant que vous savez quelles difficultés se présentent, et plus ou moins comment les contourner, voila les détails du fichier de configuration :
<code><pre>
use Symfony\Component\Process\Process;
/*
* Paramétrage de composer
*/
$composer_filename = 'composer.phar'; // Nom à donner à l'executable de composer
$composer_installdir = __DIR__; // Dossier où installer composer
$composer_home = $composer_installdir.'/.composer'; // Dossier où composer a le droit de ranger ses petites affaires
/*
* Préparation des lignes de commandes
*/
$php5 = '/usr/local/php5.6/bin/php -d safe_mode_allowed_env_vars=';
$composer_phar = $composer_installdir.'/'.$composer_filename;
$composer = 'COMPOSER_HOME="'.$composer_home.'" '.$php5.' '.$composer_phar;
/*
* Installation ou mise à jour de composer
*/
if (!file_exists($composer_phar)) {
$process = new Process('curl -sS https://getcomposer.org/installer | '.$php5.' -- --install-dir='.$composer_installdir.' --filename='.$composer_filename);
$process->run();
}
else {
$process = new Process($composer.' selfupdate');
$process->run();
}
/* ... */
$projet->setCommand('date;'.$composer.' install && '.$php5.' ./vendor/bin/phpunit');
/* ... */
</pre></code></p>
<h2>Le mot de la fin</h2>
Si vous avez des questions, si vous avez une remarque ou si vous voulez me remercier (ou m'insulter ^^), n'hésitez pas à me laisser un commentaire.<br/>
Ah oui, ce tutoriel a été écrit vers les 5h du matin et je l'ai posté sans le relire. Il est donc potentiellement truffé de fautes de français. Mais si je trouve le courage de me relire, je corrigerai peut-être ça un jour !Franck Jousseaumehttp://www.blogger.com/profile/11980702847785840524noreply@blogger.com5tag:blogger.com,1999:blog-6198706908883664718.post-69411747813502364392012-12-06T11:59:00.000+01:002012-12-06T12:00:01.395+01:00Débloquer proprement Linux en cas de freeze<p>Une fonctionnalité du noyau Linux permet, par une combinaison de touches, de lancer des commandes de bas niveau. Pour cela, elle doit être activée à la compilation du noyau. Et c'est justement le cas, par défaut, sur la plupart des distributions actuelles.</p>
<p>La principale utilité de cette fonctionnalité, présentée dans cet article, est de pouvoir redémarrer un système bloqué sans corrompre le système de fichier. En effet, cela permet de démonter correctement les systèmes de fichiers, ce qui évite de risquer des corruptions de données et de devoir exécuter fsck au redémarrage. De plus les processus ont du temps pour enregistrer des sauvegardes d'urgence le cas échéant. C'est toujours mieux qu'un reboot sauvage !</p>
<p><strong>Sur architecture x86, on actionne cette fonctionnalité en maintenant simultanément les touches <kbd>Alt</kbd> et <kbd>Syst</kbd> tout en tappant la séquence <kbd>R</kbd><kbd>E</kbd><kbd>I</kbd><kbd>S</kbd><kbd>U</kbd><kbd>B</kbd>, en attendant au moins 2 secondes entre chaque lettre.</strong></p>
<p>Au delà de cette précieuse séquence à retenir, les raccourcis <kbd>Alt</kbd>+<kbd>Syst</kbd> peuvent servir à d'autres choses en fonction de la touche utilisée simultanément :</p>
<ul>
<li><strong><kbd>r</kbd></strong> : récupérer le clavier, monopolisé généralement par l'interface graphique.</li>
<li><strong><kbd>e</kbd></strong> : envoie le signal SIGTERM à tous les processus excepté init.</li>
<li><strong><kbd>i</kbd></strong> : envoie le signal SIGKILL à tous les processus excepté init.</li>
<li><strong><kbd>s</kbd></strong> : synchronise tous les systèmes de fichiers montés. Cette fonctionnalité peut être très utile si on doit faire un arrêt rapide de l'ordinateur, car elle permet de ne pas perdre les données en mémoire cache.</li>
<li><strong><kbd>u</kbd></strong> : passe tous les systèmes de fichiers montés en lecture seule.</li>
<li><strong><kbd>b</kbd></strong> : redémarrer immédiatement le système. Cette fonctionnalité peut provoquer des pertes de données car ce qui est en mémoire cache n'est pas écrit que les disques ; c'est beaucoup plus violent que le <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>Suppr</kbd> de Windows (ou de Linux, lorsque ce n'est pas désactivé comme sur Ubuntu).</li>
<li><kbd>k</kbd> : tue tous les processus de la console virtuelle active.</li>
<li><kbd>c</kbd> : redémarre le processus kexec et affiche le message du crash.</li>
<li><kbd>o</kbd> : arrête le système.</li>
<li><kbd>p</kbd> : affiche les registres courants et les flags dans la console.</li>
<li><kbd>t</kbd> : affiche la liste des différentes tâches actives ainsi que des informations pour chacune.</li>
<li><kbd>m</kbd> (sur clavier QWERTY et <kbd>,</kbd>(virgule) sur clavier AZERTY) : affiche les informations relatives à la mémoire dans la console.</li>
<li><kbd>f</kbd> : appelle la fonction oom_kill qui tue le processus qui consomme toute la mémoire disponnible.</li>
<li><kbd>l</kbd> : envoie le signal SIGKILL à tous les processus, y compris init.
de <kbd>0</kbd> à <kbd>9</kbd> : permet de définir le type de message du noyau qui s'affichent dans la console.</li>
</ul>Franck Jousseaumehttp://www.blogger.com/profile/11980702847785840524noreply@blogger.com0tag:blogger.com,1999:blog-6198706908883664718.post-87868999527488955642011-05-11T08:49:00.003+01:002011-05-11T09:12:42.397+01:00Coder en dotnet à moindre coût en entreprise<p>Dans la société où je travaille, d'habitude plutôt orientée Java, nous avons eu besoin de travailler sur une application dotnet. Seul problème, nous ne possédions pas de licence Visual Studio et le coût de celle-ci était complètement démesurée par rapport au projet sur lequel nous avions à travailler.</p><p>Plusieurs possibilités s'offraient donc à nous : utiliser un IDE alternatif, tel que SharpDevelop, ou utiliser une version Express Edition de Visual Studio.</p><p>Cependant, la légalité d'utiliser cette dernière pour un usage commercial ne paraissait pas évidente au premier abord. Et bien bonne nouvelle, c'est permis !<br />Voici ce qu'on a trouvé sur la FAQ de Microsoft :<br /><quote><strong>Can I use Express Editions for commercial use?</strong><br /><span style="font-style: italic;">Yes, there are no licensing restrictions for applications built using Visual Studio Express Editions.</span></quote></p><p>Il faut avouer que Microsoft nous a très agréablement surpris sur ce point là !</p>Franck Jousseaumehttp://www.blogger.com/profile/11980702847785840524noreply@blogger.com0tag:blogger.com,1999:blog-6198706908883664718.post-40980982653847110742009-12-28T20:15:00.004+01:002011-05-11T09:08:09.417+01:00Problème réseau sous Ubuntu 9.10M'étant acheté un nouvel ordinateur portable, un Acer aspire 7730G, j'ai eu envie de rompre avec mes habitudes pour essayer une nouvelle distribution. C'est ainsi que j'ai essayé Ubuntu.<br />Après un essai concluant du live CD de la version Jaunty Jackalope (9.04), j'ai récupéré un dvd de la toute nouvelle Karmic Koala (9.10) que je me suis empressé d'installer. Et là, mauvaise surprise : pas moyen d'activer ma carte WiFi. Pourtant cette dernière fonctionnait parfaitement avec Jaunty...<br /><br />Mais j'ai finalement trouvé la solution miracle pour faire fonctionner le chipset récalcitrant. Et puisqu'en cette fin d'année je suis généreux, je vais vous livrer en guise de cadeau de Noël.<br /><br />Le problème vient en fait de l'amorce de Grub ! Il faut donc modifier son fichier de configuration. Pour se faire, la marche à suivre est la suivante :<br /><ul><br /><li>executer la commande <kbd>sudo gedit /etc/grub.d/10_linux</kbd> (et taper votre mot de passe lorsqu'il vous sera demandé, comme toujours avec sudo)</li><br /><li>rechercher la ligne <code>save_default_entry</code>, un peu en dessous vous devriez trouver une ligne contenant :<br /><code style='display:block;font-size:10px;'>linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro $2</code><br />Rajoutez à la fin de cette ligne <kbd>pci=use_crs</kbd> afin qu'elle devienne<br /><code style='display:block;font-size:10px;'>linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro $2 pci=use_crs</code><br />Sauvegardez et fermez le fichier.</li><br /><li>La dernière étape consiste à mettre à jour le fichier <tt>/boot/grub/grub.cfg</tt> en executant la commande <kbd>update-grub</kbd> et de rebooter (normal de rebooter si on veut appliquer les modifications du gestionnaire de boot...)</li><br /></ul>Franck Jousseaumehttp://www.blogger.com/profile/11980702847785840524noreply@blogger.com0tag:blogger.com,1999:blog-6198706908883664718.post-34681570993950722392009-08-06T11:04:00.002+01:002009-08-06T11:19:50.034+01:00Eclipse Galileo + SVNLa nouvelle version d'Eclipse (Galileo) est sortie, et le support de SVN n'étant toujours pas intégré par défaut, voila la marche à suivre pour pouvoir l'intégrer manuellement.<br /><br />Comme pour tout ajout de plugin dans Eclipse, vous devez vous rendre dans le menu <span style="font-weight:bold;">"<span style="font-style:italic;">Help -> Install New Software...</span>"</span><br /><br />Vous devez chercher sur le site de Galileo (déjà inclus, heureusement ^^) et installer ce premier plugin :<br /><span style="font-weight:bold;">"<span style="font-style:italic;">Collaboration -> Subversive SVN Team Provider (incubation)</span>"</span><br /><br />Pour le deuxième plugin à ajouter, il faut tout d'abord ajouter le site suivant :<br /><span style="font-weight:bold;">http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/</span><br />Maintenant, vous pouvez tranquilement installer le plugin :<br /><span style="font-weight:bold;">"<span style="font-style:italic;">Subversive SVN Connectors -> SVNKit 1.3.0 Implementation</span>"</span>Franck Jousseaumehttp://www.blogger.com/profile/11980702847785840524noreply@blogger.com0tag:blogger.com,1999:blog-6198706908883664718.post-6854333193875128092008-12-05T01:19:00.012+01:002011-05-11T09:12:20.456+01:00Initialisation de collections en VBUne des nouveautés annoncées pour VB10 concerne l'initialisation des collections.<br /><br />Si nous prenons l'exemple d'une collection de type List(Of String) que nous remplissons avec les valeurs <kbd>tata</kbd>, <kbd>titi</kbd>, <kbd>tutu</kbd> et bien sûr le célèbre <kbd>toto</kbd>, <strong>jusqu'à maintenant</strong> nous devions écrire ce code:<br /><pre><code><br />Dim <var>maListe</var> As New List(Of String)<br /><var>maListe</var>.Add("tata")<br /><var>maListe</var>.Add("titi")<br /><var>maListe</var>.Add("tutu")<br /><var>maListe</var>.Add("toto")<br /></code></pre><br /><br />Mais <strong>à partir de VB10</strong>, une nouvelle syntaxe équivalente mais plus courte à écrire sera disponible :<br /><pre><code><br />Dim <var>maListe</var> As New List(Of String) From {<br /> "tata",<br /> "titi",<br /> "tutu",<br /> "toto"<br /> }<br /></code></pre><br />Et si on remplace notre collection List(Of String) par un Dictionnary(Of Int16, String), le code sera :<br /><pre><code><br />Dim <var>monDico</var> As New Dictionary(Of Int16, String) From {<br /> {1,"tata"},<br /> {2,"titi"},<br /> {3,"tutu"},<br /> {4,"toto"}<br /> }<br /></code></pre><br /><br />Note : Comme le montrent également ces deux exemples, les retours à la ligne ne seront plus obligatoirement marqués par des _Franck Jousseaumehttp://www.blogger.com/profile/11980702847785840524noreply@blogger.com0tag:blogger.com,1999:blog-6198706908883664718.post-1465692207831278042008-12-04T18:49:00.011+01:002011-05-11T09:13:16.494+01:00Enfin les propriétés automatiques en VBCette année lors de sa conférence <acronym lang='en' title="Professional Developers Conference">PDC</acronym>, Microsoft a annoncé bon nombre d'évolutions pour la prochaine version de ses deux principaux langages dotnet : VB et C#<br /><br />L'une de ces évolutions concerne l'intégration des propriétés automatiques (auto properties) dans Visual Basic 10.<br /><br /><strong>Jusqu'à maintenant</strong>, pour créer une propriété dans une classe en VB, il fallait écrire quelque chose de ce genre :<br /><pre><code><br /> Public Class Personne<br /><br /> Private m_Nom As String<br /> Public Property Nom() As String<br /> Get<br /> Return m_Nom<br /> End Get<br /> Set(ByVal value As String)<br /> m_Nom = value<br /> End Set<br /> End Property<br /><br /> Private m_Prenom As String<br /> Public Property Prenom() As String<br /> Get<br /> Return m_Prenom<br /> End Get<br /> Set(ByVal value As String)<br /> m_Prenom = value<br /> End Set<br /> End Property<br /><br /> End Class<br /></code></pre><br /><br />Mais <strong>à partir de VB10</strong>, grâce aux <strong>propriétés automatiques</strong>, il suffira d'écrire ceci :<br /><pre><code><br /> Public Class Personne<br /><br /> Public Property Nom As String<br /> Public Property Prenom As String<br /><br /> End Class<br /></code></pre><br /><br /><strong>Message personnel à mes étudiants</strong> (et aux autres !):<br />Notez que malgré la syntaxe plus courte, les commandes exécutées par le programme sont équivalentes : le compilateur rajoute pour vous le code que vous n'aviez pas tapé. Donc pour ceux qui pensent que raccourcir le code permet d'accélérer l'exécution du programme...... <strong>oubliez ce mythe</strong> !Franck Jousseaumehttp://www.blogger.com/profile/11980702847785840524noreply@blogger.com0tag:blogger.com,1999:blog-6198706908883664718.post-21971853706350571102007-02-17T13:35:00.001+01:002008-12-04T18:46:44.307+01:00Linux: init et affichageLors du démarrage de ma Fedora préférée, j'avais un petit bug d'affichage.<br />Je suppose d'ailleurs que dans les autres distrib c'est pareil<br /><br /><span style="font-weight:bold;">Le bug:</span><br />Lors de l'initialisation, il y a plein de lignes du genre<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBObiOIzVHbk2K8iKO53VbIY8ofe2lLuWgs58NrMTotCysMq164k0uLN_wWBagBJEYZDlqJaBX9v16JRA07M6dC10kxu-TDAtzDj6gk-TTq7QLAEcckx9V1CVEaTzVy7VDga-Jm2n81Z9Z/s1600-h/tmp.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBObiOIzVHbk2K8iKO53VbIY8ofe2lLuWgs58NrMTotCysMq164k0uLN_wWBagBJEYZDlqJaBX9v16JRA07M6dC10kxu-TDAtzDj6gk-TTq7QLAEcckx9V1CVEaTzVy7VDga-Jm2n81Z9Z/s320/tmp.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5032494710390873746" /></a><br />J'ai donc cherché à décaler tout ces [ OK ] pour les placer contre le bord droit de l'écran et éviter ainsi cet effet de chevauchement.<br /><br /><span style="font-weight:bold;">La solution:</span><br />il suffit d'ouvrir le fichier suivant: <span style="font-style:italic;">/etc/sysconfig/init</span><br />et de changer la valeur de RES_COL (moi j'avais 80 et j'ai remplacé par 73)<br /><br /><br />Après quelques essais de valeurs, vous devriez avoir le résultat tant espéré ;-)<br />Voilà !!!Franck Jousseaumehttp://www.blogger.com/profile/11980702847785840524noreply@blogger.com0