<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://fashion.hosmoz.net/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Digital Fashion - bidouille</title>
  <link>http://fashion.hosmoz.net/</link>
  <atom:link href="http://fashion.hosmoz.net/feed/tag/bidouille/rss2" rel="self" type="application/rss+xml"/>
  <description>Rien de grand ne se fit jamais sans enthousiasme.</description>
  <language>en</language>
  <pubDate>Thu, 04 Sep 2008 09:38:29 +0200</pubDate>
  <copyright>2003-2007 &amp;copy; Geoffrey Bachelet</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Relayer un stream audio avec icecast2</title>
    <link>http://fashion.hosmoz.net/post/2006/10/20/Relayer-un-stream-audio-avec-icecast2</link>
    <guid isPermaLink="false">urn:md5:0df1adaf1cd213b3a277c6eb891f838d</guid>
    <pubDate>Fri, 20 Oct 2006 22:05:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Geekeries</category>
        <category>bidouille</category><category>configuration</category><category>doc</category><category>howto</category><category>optimisation</category><category>rigolo</category><category>ubuntu</category><category>unix</category><category>way of life</category><category>work</category>    
    <description>    &lt;p&gt;Pour économiser la bande passante au boulot, j'ai décidé de relayer le stream &lt;em&gt;Club !&lt;/em&gt; de &lt;a href=&quot;http://1.fm/&quot;&gt;1.fm&lt;/a&gt; sur le &lt;acronym&gt;LAN&lt;/acronym&gt;. Après avoir vainement tenté d'utiliser streamripper (on verra plus tard pourquoi vainement), j'ai sorti l'artillerie lourde: &lt;a href=&quot;http://www.icecast.org/&quot;&gt;icecast2&lt;/a&gt;:&lt;/p&gt;


&lt;pre&gt;sudo apt-get install icecast2&lt;/pre&gt;


&lt;p&gt;Si on sait un peu lire, le script de post-configuration nous incite à aller fourrer notre nez dans &lt;code&gt;/etc/default/icecast2&lt;/code&gt;, où l'on apprend (vers la fin) que icecast est désactivé par défaut à cause de la directive &lt;code&gt;ENABLED=false&lt;/code&gt;. C'est en fait une feinte pour nous pousser à configurer le bousin (de toute façon si on le configure pas, il marchera pas). Direction &lt;code&gt;/etc/icecast2/icecast.xml&lt;/code&gt; donc, pour un brin de configuration (les explications qui suivent se basent sur le fichier par défaut d'une installation sur une ubuntu).&lt;/p&gt;


&lt;p&gt;La première partie qui nous interresse s'intitule &lt;code&gt;authentication&lt;/code&gt; (vers la ligne 23). Elle contient les informations d'authentification pour les clients qui se connectent en tant que source (&lt;code&gt;source-password&lt;/code&gt;), les serveurs qui se connectent en tant que slave (&lt;code&gt;relay-password&lt;/code&gt;, en fait je ne suis pas sur à 100%, c'est une déduction) et pour l'interface d'administration (&lt;code&gt;admin-user&lt;/code&gt; et &lt;code&gt;admin-password&lt;/code&gt;). Une fois ces informations modifiées, direction la directive &lt;code&gt;hostname&lt;/code&gt;, qu'on remplira avec au choix, le nom de la machine, son ip, etc. J'ai personellement mis l'ip privée de ma machine (&lt;code&gt;172.16.x.y&lt;/code&gt;), pour que ça correspondent à la prochaine directive qui nous interresse: &lt;code&gt;listen-socket&lt;/code&gt;. Ici on définit le port et l'ip sur laquelle icecast va écouter. En gros, si vous spécifier &lt;code&gt;127.0.0.1&lt;/code&gt;, votre serveur de streaming ne sera accessible qu'en local. On y met donc en général la même chose que dans &lt;code&gt;hostname&lt;/code&gt; (&lt;code&gt;172.16.x.y&lt;/code&gt; par exemple), avec un port qui va bien, libre de préférence (&lt;code&gt;8000&lt;/code&gt; par défaut).&lt;/p&gt;


&lt;p&gt;Maintenant on passe a la partie qui nous interresse vraiment, la section &lt;code&gt;relay&lt;/code&gt;. Rien de bien compliqué ici. Le stream que je souhaite relayer se trouve là: http://64.62.253.223:8060/, or icecast nous demande un &lt;code&gt;server&lt;/code&gt;, un &lt;code&gt;port&lt;/code&gt;, un &lt;em&gt;point de montage&lt;/em&gt; (&lt;code&gt;mount&lt;/code&gt;) et un &lt;em&gt;point de montage local&lt;/em&gt; (&lt;code&gt;local-mount&lt;/code&gt;). Vous avez déjà compris qu'on arrive a cette configuration:&lt;/p&gt;


&lt;pre&gt;   &amp;lt;relay&amp;gt;
       &amp;lt;server&amp;gt;64.62.253.223&amp;lt;/server&amp;gt;
       &amp;lt;port&amp;gt;8060&amp;lt;/port&amp;gt;
       &amp;lt;mount&amp;gt;/&amp;lt;/mount&amp;gt;
       &amp;lt;local-mount&amp;gt;/1.fm&amp;lt;/local-mount&amp;gt;
       &amp;lt;on-demand&amp;gt;0&amp;lt;/on-demand&amp;gt;
       &amp;lt;relay-shoutcast-metadata&amp;gt;1&amp;lt;/relay-shoutcast-metadata&amp;gt;
   &amp;lt;/relay&amp;gt;&lt;/pre&gt;


&lt;p&gt;Ainsi parés, il ne nous reste plus qu'a lancer modifier la directive &lt;code&gt;ENABLED=false&lt;/code&gt; en &lt;code&gt;ENABLED=true&lt;/code&gt; dans &lt;code&gt;/etc/default/icecast2&lt;/code&gt; et à lancer icecast:&lt;/p&gt;


&lt;pre&gt;sudo /etc/init.d/icecast2 start&lt;/pre&gt;


&lt;p&gt;Si vous avez bien tout fait, vous devriez pouvoir streamer depuis &lt;code&gt;http://172.16.x.y:8000/1.fm&lt;/code&gt;, et vos collègues également ! Vous pouvez avoir une vue d'ensemble du serveur ainsi que quelques options d'administration en vous rendant sur l'interface d'admin: http://172.16.x.y:8000/ et en utilisant &lt;code&gt;admin-user&lt;/code&gt; et &lt;code&gt;admin-password&lt;/code&gt; pour vous authentifier.&lt;/p&gt;


&lt;p&gt;A cela on peut ajouter un petit &lt;code&gt;streamripper&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;streamripper http://172.16.x.y:8000/1.fm -d ~/streamripped&lt;/pre&gt;


&lt;p&gt;Pour enregistrer. En parlant de streamripper, j'avais tenté au début de relayer avec &lt;code&gt;streamripper -r&lt;/code&gt;, mais malgrès les apparences du &lt;code&gt;netstat -pl&lt;/code&gt; (&lt;code&gt;*:8000 LISTEN&lt;/code&gt;), il ne bind qu'en local, donc impossible d'en faire profiter les collègues :-)&lt;/p&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/10/20/Relayer-un-stream-audio-avec-icecast2#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/10/20/Relayer-un-stream-audio-avec-icecast2#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/692</wfw:commentRss>
      </item>
    
  <item>
    <title>Polymorphisme et PHP</title>
    <link>http://fashion.hosmoz.net/post/2006/10/13/Polymorphisme-et-PHP</link>
    <guid isPermaLink="false">urn:md5:4166476543a0a189a5cea071a39df8fe</guid>
    <pubDate>Fri, 13 Oct 2006 12:51:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>bidouille</category><category>php</category><category>rigolo</category>    
    <description>&lt;p&gt;Ou presque ! Je vois déjà vos têtes ahuries devant un tel titre, et pourtant je ne suis pas fou non, j'ai juste décidé d'avoir un titre qui ment par ommission :-) Bref, pour ceux qui ne savent pas ce qu'est le polymorphisme, c'est tout simplement le fait d'avoir plusieurs fonctions qui portent le même nom, mais dont les arguments différent, et pour ceux qui ne comprennet pas pourquoi &lt;em&gt;Polymorphisme et PHP &lt;/em&gt; est un drole de titre, et bien sachez que le &lt;acronym&gt;PHP&lt;/acronym&gt; est un langage non typé (ou faiblement typé selon la personne a qui vous parlez), et qu'il n'est donc pas possible de faire usage du &lt;em&gt;Type Hinting&lt;/em&gt; dans la définition d'une fonction (pas sur les types de base en tout cas, mais PHP5.x introduit le &lt;em&gt;type hinting&lt;/em&gt; sur les objets, ce qui ne change rien a notre histoire), ce qui fait que &lt;acronym&gt;PHP&lt;/acronym&gt; ne peut pas gérer le polymorphisme brut.&lt;/p&gt;    &lt;p&gt;Cela dit, il est toujours possible de feinter, et on peut simuler le polymorphisme en &lt;acronym&gt;PHP&lt;/acronym&gt;. Sans plus attendre, voilà un exemple:&lt;/p&gt;


&lt;pre&gt;function doSomething($arg) {
	switch(gettype($arg)) {
		case 'integer':
			return _doSometing_Integer($arg);
		break;
		case 'array':
			return _doSomething_Array($arg);
		break;
		default:
			return _doSometing_String((string) $arg);
		break;
	}
}&lt;/pre&gt;


&lt;p&gt;Voilà. C'est très basique, mais l'idée est là. Un petit tour sur le manuel &lt;acronym&gt;PHP&lt;/acronym&gt; nous indique qu'utiliser &lt;code&gt;gettype&lt;/code&gt; n'est pas très recommandé, nous allons donc procéder autrement (et passer en objet par la même occasion):&lt;/p&gt;


&lt;pre&gt;class Polymorph {
	public function doSometing($arg) {
		switch(true) {
			case is_array($arg):
				return $this-&amp;gt;_doSomething_Array($arg);
			break;
		}
	}

	private function _doSomething_Array($arg) {

	}
}&lt;/pre&gt;


&lt;p&gt;On aurait également pu faire, pour plus de souplesse (mais avec &lt;code&gt;gettype&lt;/code&gt;):&lt;/p&gt;


&lt;pre&gt;class Polymorph {
	public function doSomething($arg) {
		$method = '_doSomething_.'.ucfirst(gettype($arg));
		if (method_exists($this, $method)) {
			call_user_func(array($this, $method), $arg);
		} else {
			// default comportement
		}
	}
}&lt;/pre&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/10/13/Polymorphisme-et-PHP#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/10/13/Polymorphisme-et-PHP#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/664</wfw:commentRss>
      </item>
    
  <item>
    <title>Submit par défaut dans un formulaire HTML</title>
    <link>http://fashion.hosmoz.net/post/2006/10/03/Submit-par-defaut-dans-un-formulaire-HTML</link>
    <guid isPermaLink="false">urn:md5:5cdb9892e63ca261f52aeca7885421b3</guid>
    <pubDate>Tue, 03 Oct 2006 02:08:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>bidouille</category><category>css</category><category>formulaires</category><category>interfaces utilisateurs</category><category>stupide</category>    
    <description>    &lt;p&gt;Qu'on se le dise, dans un formulaire comprenant plusieurs &lt;code&gt;input&lt;/code&gt; de type &lt;code&gt;submit&lt;/code&gt;, &lt;strong&gt;il n'est pas possible de spécifier le bouton à actionner quand on appuie sur la touche entrée&lt;/strong&gt;. Si l'on considère que les &lt;acronym title=&quot;Human Interface Guidelines&quot;&gt;HIG&lt;/acronym&gt; de &lt;a href=&quot;http://www.gnome.org/&quot;&gt;Gnome&lt;/a&gt; imposent d'avoir un bouton &lt;code&gt;ok&lt;/code&gt; à droite du bouton &lt;code&gt;annuler&lt;/code&gt;, on se retrouve avec une incompatibilité fondamentale, puisque l'action par défaut est rarement celle d'annuler la saisie que l'on vient de faire. Plusieurs solutions s'offrent dès lors à nous:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ignorer les &lt;acronym&gt;HIG&lt;/acronym&gt;, solution non acceptable dans mon cas (sous peine de lynchage généralisé)&lt;/li&gt;
&lt;li&gt;Supprimer purement et simplement les boutons &lt;code&gt;annuler&lt;/code&gt;, ce qui représente une perte de fonctionnalitées trop importante dans certains cas&lt;/li&gt;
&lt;li&gt;Utiliser du &lt;acronym&gt;JS&lt;/acronym&gt;, solution non acceptable vis à vis de mon challenge personnel (ne pas utiliser de &lt;acronym&gt;JS&lt;/acronym&gt; avant que l'appli ne soit complètement fonctionnelle)&lt;/li&gt;
&lt;li&gt;Tricher.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;J'ai donc opté pour la 4ème solution, j'ai triché. J'ai placé mes &lt;code&gt;input&lt;/code&gt; comme le souhaitait le navigateur (&lt;code&gt;ok&lt;/code&gt;, puis &lt;code&gt;cancel&lt;/code&gt;), et utilisé la directive &lt;acronym&gt;CSS&lt;/acronym&gt; &lt;code&gt;direction&lt;/code&gt; pour réorienter le tout, ce qui donne, pour le &lt;acronym&gt;HTML&lt;/acronym&gt;:&lt;/p&gt;


&lt;pre&gt;&amp;lt;fieldset class=&amp;quot;submit&amp;quot;&amp;gt;
	&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; id=&amp;quot;ok&amp;quot; value=&amp;quot;Ok&amp;quot; /&amp;gt;
	&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; id=&amp;quot;cancel&amp;quot; value=&amp;quot;Cancel&amp;quot; /&amp;gt;
&amp;lt;/fieldset&amp;gt;&lt;/pre&gt;


&lt;p&gt;Et pour la &lt;acronym&gt;CSS&lt;/acronym&gt;:&lt;/p&gt;


&lt;pre&gt;fieldset.submit {
	direction: rtl;
}&lt;/pre&gt;


&lt;p&gt;Et &lt;a href=&quot;http://fashion.hosmoz.net/public/screenshots/formsubmit.png&quot;&gt;le rendu final&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Problèmes connus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;del&gt;Impossible d'utiliser de ponctuation dans les boutons (un point d'exclamation à la fin d'un bouton par exemple se retrouvera au début)&lt;/del&gt; Un &lt;code&gt;fieldset.submit input { direction: ltr; }&lt;/code&gt; est nécessaire pour bénéficier des ponctuations au bon endroit (&lt;a href=&quot;http://fashion.hosmoz.net/blog/post/2006/10/03/Submit-par-defaut-dans-un-formulaire-HTML#c2036&quot;&gt;merci&lt;/a&gt; &lt;a href=&quot;http://www.mattlab.com/&quot;&gt;Matt.Rixx&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Surement d'autres conséquences facheuses qui ne me sont pas encore tombées dessus :-)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mais bon pour l'instant ça marche.&lt;/p&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/10/03/Submit-par-defaut-dans-un-formulaire-HTML#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/10/03/Submit-par-defaut-dans-un-formulaire-HTML#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/639</wfw:commentRss>
      </item>
    
</channel>
</rss>