<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2titles.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemtitles.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Internet and programming stuff</title>
	
	<link>http://blog.monkeyz.eu</link>
	<description>Quelques notes à propos d'Internet, linux, de la programmation et d'autres choses...</description>
	<lastBuildDate>Sun, 03 Jul 2011 10:36:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/InternetProgrammingStuff" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="internetprogrammingstuff" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/InternetProgrammingStuff" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FInternetProgrammingStuff" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>Quelques liens en vrac…</title>
		<link>http://blog.monkeyz.eu/2011/06/30/quelques-liens-en-vrac/</link>
		<comments>http://blog.monkeyz.eu/2011/06/30/quelques-liens-en-vrac/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 10:35:24 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[En vrac]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[mongdb]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[screen]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://blog.monkeyz.eu/?p=346</guid>
		<description><![CDATA[Une petite sélection de liens pour le mois de Juin: Not doing Code Reviews? What’s your excuse? Getting started with android development What are your favorite Vim tricks? GNU Screen: Working with the Scrollback Buffer C++ clear winner in Google &#8230;<p class="read-more"><a href="http://blog.monkeyz.eu/2011/06/30/quelques-liens-en-vrac/">Lire la suite &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Une petite sélection de liens pour le mois de Juin:</p>
<p><a href="http://www.javacodegeeks.com/2011/06/not-doing-code-reviews-whats-your.html">Not doing Code Reviews? What’s your excuse?</a><br />
<a href="http://www.jeanhsu.com/2011/05/03/getting-started-with-android-development/">Getting started with android development</a><br />
<a href="http://stackoverflow.com/questions/95072/what-are-your-favorite-vim-tricks">What are your favorite Vim tricks?</a><br />
<a href="http://www.samsarin.com/blog/2007/03/11/gnu-screen-working-with-the-scrollback-buffer/">GNU Screen: Working with the Scrollback Buffer</a><br />
<a href="http://www.computing.co.uk/ctg/news/2076322/-winner-google-language-tests">C++ clear winner in Google language tests</a><br />
<a href="http://news.ycombinator.com/item?id=2684423">Scaling with MongoDB (or how Urban Airship abandoned it for PostgreSQL)</a><br />
<a href="http://point-at-infinity.org/seccure/">SECCURE Elliptic Curve Crypto Utility for Reliable Encryption</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.monkeyz.eu/2011/06/30/quelques-liens-en-vrac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP, Reflection et Annotations</title>
		<link>http://blog.monkeyz.eu/2011/05/29/php-reflection-et-annotations/</link>
		<comments>http://blog.monkeyz.eu/2011/05/29/php-reflection-et-annotations/#comments</comments>
		<pubDate>Sun, 29 May 2011 10:38:57 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[annotation]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[reflection]]></category>

		<guid isPermaLink="false">http://blog.monkeyz.eu/?p=339</guid>
		<description><![CDATA[J&#8217;ai récemment eu à coder à mon taf des jeux de tests pour valider le comportement de mon serveur de pub, et pour ça, j&#8217;ai codé des petits scripts tout bête pour créer/modifier les données dans une base postgresql. J&#8217;aurai &#8230;<p class="read-more"><a href="http://blog.monkeyz.eu/2011/05/29/php-reflection-et-annotations/">Lire la suite &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai récemment eu à coder à mon taf des jeux de tests pour valider le comportement de mon serveur de pub, et pour ça, j&#8217;ai codé des petits scripts tout bête pour créer/modifier les données dans une base postgresql. J&#8217;aurai pu prendre un ORM tout fait (propel, doctrine&#8230;), mais j&#8217;ai juste codé mes classes tout bêtement et le plus simplement du monde. Un exemple:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> Voiture<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$id</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$marque</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$couleur</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></div></div>
<p>Pour les requêtes d&#8217;insert, au lieu d&#8217;avoir des méthodes spécialisées dans chaque classe, j&#8217;ai codé juste une fonction save() qui prend l&#8217;objet à sauver, et qui parse grâce aux fonctions get_class_* ses propriétés pour générer les requêtes d&#8217;INSERT ou d&#8217;UPDATE. Cette fonction ressembait dans un premier temps à:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">function</span> save<span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$class_name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">get_class</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$class_vars</span> <span style="color: #339933;">=</span> <span style="color: #990000;">get_class_vars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$class_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000088;">$fields_names</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$fields_values</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000088;">$fields_count</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$class_vars</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$var_name</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$var_value</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$var_name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$fields_names</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$var_name</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">', '</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">is_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$var_name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$fields_values</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'\''</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$var_name</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'\', '</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$fields_values</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$var_name</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">', '</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$fields_count</span> <span style="color: #339933;">++;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$fields_count</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Remove trailing ', ';</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$fields_names</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fields_names</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fields_names</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$fields_values</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fields_values</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fields_values</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">&quot;INSERT INTO &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$class_name</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;(&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$fields_names</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;) VALUES (&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$fields_values</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;);&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Ca me contentait dans pas mal de cas simples, mais très rapidement, cela à montré ses limites. J&#8217;avais besoin de connaître plus précisement les types des champs dans la base. Et la solution a été d&#8217;utiliser les <a href="http://fr.wikipedia.org/wiki/Annotation_(Java)">annotations</a>, pour ne pas avoir de longues et lourdes modifications à faire dans toutes mes classes d&#8217;objet. PHP ne propose pas out of the box un système complet d&#8217;annotation, mais incorpore les outils pour développer un comportement analogue: les classes <a href="http://php.net/manual/fr/book.reflection.php">Reflection</a>.</p>
<p>Ces classes permettent de faire du &laquo;&nbsp;reverse engineering&nbsp;&raquo; sur les classes, les interfaces etc pour retrouver les différentes composantes de ces objets, qu&#8217;ils soient instanciés ou non. Et de plus, elles permettent de récupérer les commentaires des classes, des méthodes et des propriétés s&#8217;ils existent. Il n&#8217;y a qu&#8217;à les mettre en application:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Commentaire classe voiture<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">class</span> Voiture<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #009933; font-style: italic;">/**<br />
&nbsp; &nbsp; &nbsp;* Commentaire propriete id<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$id</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000088;">$voiture</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Voiture<span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$reflection</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ReflectionClass<span style="color: #009900;">&#40;</span><span style="color: #000088;">$voiture</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Classe:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$reflection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getDocComment</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$reflection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getProperties</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$property</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$property</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$property</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getDocComment</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Ce qui donne:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ php test_2.php <br />
<span style="color: #000000; font-weight: bold;">/**</span><br />
&nbsp;<span style="color: #000000; font-weight: bold;">*</span> Commentaire classe voiture<br />
&nbsp;<span style="color: #000000; font-weight: bold;">*/</span><br />
id:<br />
<span style="color: #000000; font-weight: bold;">/**</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">*</span> Commentaire propriete <span style="color: #c20cb9; font-weight: bold;">id</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">*/</span><br />
$</div></div>
<p>Il ne resterait plus maintenant qu&#8217;à définir ses keywords, parser les commentaires propement pis à coder son propre mini-orm sans modifier les objets finaux.</p>
<p>Et voilà un début:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> DbObject<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> save<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$schema</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">buildSchema</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/* Ici y a du code */</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> buildSchema<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$class_name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">get_class</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$class_vars</span> <span style="color: #339933;">=</span> <span style="color: #990000;">get_class_vars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$class_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$class_reflection</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ReflectionClass<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$class_reflection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getDocComment</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$schema</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$class_vars</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$var_name</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$var_value</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$prop_reflection</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$class_reflection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getProperty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$comment</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$prop_reflection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getDocComment</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$comment</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">',\/\*\*(.*)\*\/,'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'$1'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$comment</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$comments</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_split</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">',\n,'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$comment</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$val</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$schema</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$var_name</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$comments</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$comment_line</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">',@(.*?): (.*),i'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$comment_line</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$val</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$schema</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$var_name</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$schema</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$schema</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> Voiture <span style="color: #000000; font-weight: bold;">extends</span> DbObject<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #009933; font-style: italic;">/**-<br />
&nbsp; &nbsp; &nbsp;* @DbType: integer<br />
&nbsp; &nbsp; &nbsp;* @DbValue: 0<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$id</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #009933; font-style: italic;">/** @DbType: string<br />
&nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp;* Blabla.<br />
&nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$marque</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #009933; font-style: italic;">/** @DbType: string */</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$couleur</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$voiture</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Voiture<span style="color: #339933;">;</span><br />
<span style="color: #000088;">$voiture</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$voiture</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">marque</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'renault'</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$voiture</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">couleur</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'bleu'</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$voiture</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>buildSchema retournera dans cet exemple:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ php test_annotations.php <br />
array<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">&quot;id&quot;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; array<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">&quot;DbType&quot;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; string<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">7</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #ff0000;">&quot;integer&quot;</span><br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">&quot;DbValue&quot;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; string<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #ff0000;">&quot;0&quot;</span><br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">&quot;marque&quot;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; array<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">&quot;DbType&quot;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; string<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">6</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #ff0000;">&quot;string&quot;</span><br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">&quot;couleur&quot;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; array<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">&quot;DbType&quot;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; string<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">6</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #ff0000;">&quot;string&quot;</span><br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span></div></div>
<p>Pour finir, quelques petites références sur le sujet:</p>
<ul>
<li><a href="http://www.php.net/manual/fr/book.reflection.php">http://www.php.net/manual/fr/book.reflection.php</a></li>
<li><a href="http://sebastian-bergmann.de/archives/488-Annotations-in-PHP.html">http://sebastian-bergmann.de/archives/488-Annotations-in-PHP.html</a></li>
</ul>
<p>Et au final, au lieu de réinventer une roue bien vieille, je suis parti utiliser <a href="http://code.google.com/p/addendum/">Addendum</a>:</p>
<ul>
<li><a href="http://www.clochix.net/post/2009/05/04/Utiliser-des-annotations-en-PHP-avec-addendum">http://www.clochix.net/post/2009/05/04/Utiliser-des-annotations-en-PHP-avec-addendum</a>
</li>
<li><a href="http://blog.fedecarg.com/2008/07/19/using-annotations-in-php/">http://blog.fedecarg.com/2008/07/19/using-annotations-in-php/</a>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.monkeyz.eu/2011/05/29/php-reflection-et-annotations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Controler les core dump</title>
		<link>http://blog.monkeyz.eu/2011/04/03/controler-les-core-dump/</link>
		<comments>http://blog.monkeyz.eu/2011/04/03/controler-les-core-dump/#comments</comments>
		<pubDate>Sun, 03 Apr 2011 07:23:40 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[core]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[pattern]]></category>

		<guid isPermaLink="false">http://blog.monkeyz.eu/?p=331</guid>
		<description><![CDATA[La génération des fichier core contiennent l&#8217;état de la mémoire d&#8217;un process, et a lieu généralement suite au crash de ce process. Sous Linux, le core dump est provoqué suite à la réception par le process de signaux spécifiques documentés &#8230;<p class="read-more"><a href="http://blog.monkeyz.eu/2011/04/03/controler-les-core-dump/">Lire la suite &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>La génération des fichier <em>core</em> contiennent l&#8217;état de la mémoire d&#8217;un process, et a lieu généralement suite au crash de ce process. Sous Linux, le core dump est provoqué suite à la réception par le process de signaux spécifiques documentés dans le <em>man 7 signal</em>:</p>
<pre>       Signal     Value     Action   Comment
       ----------------------------------------------------------------------

       SIGQUIT       3       Core    Quit from keyboard
       SIGILL        4       Core    Illegal Instruction
       SIGABRT       6       Core    Abort signal from abort(3)
       SIGFPE        8       Core    Floating point exception
       SIGSEGV      11       Core    Invalid memory reference

       SIGBUS      10,7,10     Core    Bus error (bad memory access)
       SIGSYS      12,31,12    Core    Bad argument to routine (SVr4)
       SIGTRAP        5        Core    Trace/breakpoint trap
       SIGXCPU     24,24,30    Core    CPU time limit exceeded (4.2BSD)
       SIGXFSZ     25,25,31    Core    File size limit exceeded (4.2BSD)</pre>
<p>Avant toute chose, il faut vérifier que le système est capable de générer ces fichiers. En effet, sous Ubuntu par exemple, la user limit (<em>ulimit</em>) pour la taille des fichiers core est nulle. Il faut donc permettre au système d&#8217;écrire des fichiers de taille illimité:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$ </span><span style="color: #7a0874; font-weight: bold;">ulimit</span> <span style="color: #660033;">-c</span> unlimited</div></div>
<p>On peut trivialement vérifier que les fichiers <em>core</em> sont générés. On lance un shell, et on envoie un signal SIGSEGV qui va faire crasher ce nouveau process ($$) pour générer le core:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #c20cb9; font-weight: bold;">bash</span><br />
$ <span style="color: #c20cb9; font-weight: bold;">kill</span> <span style="color: #660033;">-SEGV</span> <span style="color: #007800;">$$</span><br />
Segmentation fault <span style="color: #7a0874; font-weight: bold;">&#40;</span>core dumped<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> core<br />
<span style="color: #660033;">-rw-------</span> <span style="color: #000000;">1</span> mycroft mycroft <span style="color: #000000;">3784704</span> <span style="color: #000000;">2011</span>-04-02 <span style="color: #000000;">13</span>:02 core</div></div>
<p>Cependant, parfois, on veut pouvoir controler un peu plus ce fichier, en particulier son nom et sa destination. Les noyaux Linux 2.6 permettent cela grace à la variable système <em>kernel.core_pattern</em> (ou <em>/proc/sys/kernel/core_pattern</em>) qui sert de template pour le nom de fichier et qui a comme valeur par défaut &laquo;&nbsp;core&nbsp;&raquo;. Ce template accepte un chemin absolu et les modificateurs de format suivant:</p>
<ul>
<li>%p &#8211; pid</li>
<li>%u &#8211; uid</li>
<li>%g &#8211; gid</li>
<li>%s &#8211; numéro de signal</li>
<li>%t &#8211; temps UNIX / timestamp</li>
<li>%h &#8211; hostname</li>
<li>%e &#8211; nom de fichier executable</li>
<li>%% &#8211; &laquo;&nbsp;%&nbsp;&raquo;</li>
</ul>
<p>On décide donc de placer nos fichiers core dans <em>/tmp/core</em>, et qu&#8217;ils aient le format &laquo;&nbsp;timestamp.nom-executable.pid.uid:gid&nbsp;&raquo;. Pour cela, on modifie /proc/sys/kernel/core_pattern avec le format de notre choix:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># mkdir /tmp/core/</span><br />
<span style="color: #666666; font-style: italic;"># echo &quot;/tmp/core/%t.%e.%p.%u:%g&quot; &gt; /proc/sys/kernel/core_pattern</span></div></div>
<p>Et on teste:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #7a0874; font-weight: bold;">ulimit</span> <span style="color: #660033;">-c</span> unlimited<br />
$ <span style="color: #c20cb9; font-weight: bold;">bash</span><br />
$ <span style="color: #c20cb9; font-weight: bold;">kill</span> <span style="color: #660033;">-SEGV</span> <span style="color: #007800;">$$</span><br />
Segmentation fault <span style="color: #7a0874; font-weight: bold;">&#40;</span>core dumped<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>core<br />
total <span style="color: #000000;">3584</span><br />
<span style="color: #660033;">-rw-------</span> <span style="color: #000000;">1</span> mycroft mycroft <span style="color: #000000;">3784704</span> <span style="color: #000000;">2011</span>-04-02 <span style="color: #000000;">13</span>:<span style="color: #000000;">16</span> <span style="color: #000000;">1301778979</span>.bash.19366.1000:<span style="color: #000000;">1000</span></div></div>
<p>Il ne reste plus qu&#8217;à le configurer de manière à toujours reproduire ce comportement, en particulier après un reboot dy système. Pour cela, il n&#8217;y a qu&#8217;à ajouter la ligne suivante dans le fichier /etc/sysctl.conf:</p>
<div class="codecolorer-container ini default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">kernel.core_pattern<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/tmp/core/%t.%e.%p.%u:%g</span></div></div>
<p>De plus, pour conserver la valeur de ulimit, il faudra modifier <em>/etc/security/limits.conf</em> et affecter la valeur &laquo;&nbsp;unlimited&nbsp;&raquo; à l&#8217;item &laquo;&nbsp;core&nbsp;&raquo;:</p>
<pre>#&lt;domain&gt;      &lt;type&gt;  &lt;item&gt;         &lt;value&gt;
*              soft    core           unlimited</pre>
<p>A noter que cette modification prendra effet au prochain log-in et non à l&#8217;ouverture d&#8217;une nouvelle console dans X.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.monkeyz.eu/2011/04/03/controler-les-core-dump/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Se connecter proprement à ssh via un proxy web</title>
		<link>http://blog.monkeyz.eu/2011/04/02/se-connecter-proprement-a-ssh-via-un-proxy-web/</link>
		<comments>http://blog.monkeyz.eu/2011/04/02/se-connecter-proprement-a-ssh-via-un-proxy-web/#comments</comments>
		<pubDate>Sat, 02 Apr 2011 11:07:24 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mod_proxy]]></category>
		<category><![CDATA[privoxy]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[stunnel]]></category>

		<guid isPermaLink="false">http://blog.monkeyz.eu/?p=322</guid>
		<description><![CDATA[Cet article est issu d&#8217;une précédente version de mon weblog, mais perdu dans l&#8217;oubli. Il remonte à Avril 2008. Je le remets ici à jour. Un problème au taf, si ce n’est le prix du café au distributeur, est la &#8230;<p class="read-more"><a href="http://blog.monkeyz.eu/2011/04/02/se-connecter-proprement-a-ssh-via-un-proxy-web/">Lire la suite &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Cet article est issu d&#8217;une précédente version de mon weblog, mais perdu dans l&#8217;oubli. Il remonte à Avril 2008. Je le remets ici à jour.</p>
<p>Un problème au taf, si ce n’est le prix du café au distributeur, est la non possibilité de se connecter sur sa box avec son ssh. Et bien, <a href="http://dag.wieers.com/">Dag Wiers</a> propose une <a href="http://dag.wieers.com/howto/ssh-http-tunneling/">solution propre</a> (qui n’oblige pas à installer son sshd sur le 443 et d’utiliser corkcrew), mais d’utiliser <a href="http://proxytunnel.sourceforge.net/">proxytunnel</a> qui marche plutot bien.</p>
<p>Pour résumer la chose, cela implique d’avoir un serveur avec un apache où on a la main dessus, <a href="http://httpd.apache.org/docs/2.0/mod/mod_proxy.html">mod_proxy</a>/mod_proxy_connect et mod_proxy_http d’installés, possiblement mod_ssl (mais ça crée <a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=29744">un petit problème de taille à cause d’une non-feature d’apache2</a>), et un peu de configuration.</p>
<p>N’ayant pas la main sur mon serveur au taf, c’est pas facile pour tester. J’ai donc aussi installé <a href="http://www.privoxy.org/">privoxy</a> en local pour faire mes tests. Par contre, après utilisation, j’ai pas réussi à faire passer un CONNECT sur un port de destination 80, <em>privoxy</em> ne voulait pas, et le limit-connect semblait pas vouloir être changé. En même temps il était 5h du mat, j’ai peut être oublié un truc.</p>
<p>Alors, voilà la conf que j’ai faite sur ma debian (serveur ssh):</p>
<p>Server ssh sur le 22 et 2222;<br />
Apache2 de base installé (bon, avec php mais là on s’en fiche);</p>
<p>On configure le bouzin:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">remote# </span>a2enmod ssl<br />
<span style="color: #666666;">remote# </span>a2enmod proxy<br />
<span style="color: #666666;">remote# </span>a2enmod proxy_connect</div></div>
<p>Il faut générer un certificat (.pem) pour notre nouveau serveur https. Pour çà, y a un super outil dans debian, et c’est make-ssl-cert:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">remote# </span>make-ssl-cert <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>ssl-cert<span style="color: #000000; font-weight: bold;">/</span>ssleay.cnf <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>apache2<span style="color: #000000; font-weight: bold;">/</span>ssl<span style="color: #000000; font-weight: bold;">/</span>apache.pem<br />
<span style="color: #666666;">remote# </span><span style="color: #c20cb9; font-weight: bold;">chmod</span> a+r <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>apache2<span style="color: #000000; font-weight: bold;">/</span>ssl<span style="color: #000000; font-weight: bold;">/</span>apache.pem</div></div>
<p>Et un virtualhost sur le 443, qui inclue directement les directives pour <em>mod_ssl</em> et <em>mod_proxy</em>:</p>
<div class="codecolorer-container apache default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="apache codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;<span style="color: #000000; font-weight:bold;">VirtualHost</span> spine.minithins.net:<span style="color: #ff0000;">443</span>&gt;<br />
&nbsp; <span style="color: #00007f;">SSLEngine</span> <span style="color: #0000ff;">On</span><br />
&nbsp; <span style="color: #00007f;">SSLCertificateFile</span> /etc/apache2/ssl/apache.pem<br />
<br />
&nbsp; <span style="color: #00007f;">ServerAdmin</span> mycroft@minithins.net<br />
&nbsp; <span style="color: #00007f;">DocumentRoot</span> /home/web/minithins.net<br />
&nbsp; <span style="color: #00007f;">ServerName</span> cns.minithins.net<br />
<br />
&nbsp; <span style="color: #00007f;">HostnameLookups</span> <span style="color: #0000ff;">On</span><br />
<br />
&nbsp; <span style="color: #00007f;">ProxyRequests</span> <span style="color: #0000ff;">on</span><br />
&nbsp; <span style="color: #00007f;">AllowCONNECT</span> <span style="color: #ff0000;">2222</span><br />
&nbsp; <span style="color: #00007f;">ProxyVia</span> <span style="color: #0000ff;">on</span><br />
<br />
&nbsp; &lt;<span style="color: #000000; font-weight:bold;">proxy</span> *&gt;<br />
&nbsp; &nbsp; <span style="color: #00007f;">Order</span> <span style="color: #00007f;">deny</span>,<span style="color: #00007f;">allow</span><br />
&nbsp; &nbsp; <span style="color: #00007f;">Deny</span> from <span style="color: #0000ff;">all</span><br />
&nbsp; &nbsp; <span style="color: #00007f;">Allow</span> from client.monkeyz.eu<br />
&nbsp; &lt;/<span style="color: #000000; font-weight:bold;">proxy</span>&gt;<br />
&lt;/<span style="color: #000000; font-weight:bold;">VirtualHost</span>&gt;</div></div>
<p>Un redémarrage d&#8217;apache, et on va tester avec <em>stunnel</em>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">remote# </span>service apache2 restart<br />
Restarting web server: apache2 ... waiting .</div></div>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">client# </span><span style="color: #c20cb9; font-weight: bold;">apt-get install</span> stunnel<br />
...<br />
<span style="color: #666666;">client# </span>stunnel <span style="color: #660033;">-f</span> <span style="color: #660033;">-c</span> <span style="color: #660033;">-d</span> <span style="color: #000000;">12345</span> <span style="color: #660033;">-r</span> spine.minithins.net:<span style="color: #000000;">443</span><br />
2011.04.02 <span style="color: #000000;">12</span>:<span style="color: #000000;">22</span>:<span style="color: #000000;">22</span> LOG5<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">11844</span>:<span style="color: #000000;">140613013587712</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: stunnel <span style="color: #000000;">4.29</span> on x86_64-pc-linux-gnu with OpenSSL 0.9.8o 01 Jun <span style="color: #000000;">2010</span><br />
2011.04.02 <span style="color: #000000;">12</span>:<span style="color: #000000;">22</span>:<span style="color: #000000;">22</span> LOG5<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">11844</span>:<span style="color: #000000;">140613013587712</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: Threading:PTHREAD SSL:ENGINE Sockets:POLL,IPv6 Auth:LIBWRAP<br />
2011.04.02 <span style="color: #000000;">12</span>:<span style="color: #000000;">22</span>:<span style="color: #000000;">22</span> LOG5<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">11844</span>:<span style="color: #000000;">140613013587712</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #000000;">500</span> clients allowed<br />
...</div></div>
<p>Sur une autre console:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">client# </span>telnet localhost <span style="color: #000000;">12345</span><br />
Trying 127.0.0.1...<br />
Connected to localhost.<br />
Escape character is <span style="color: #ff0000;">'^]'</span>.<br />
CONNECT spine.minithins.net:<span style="color: #000000;">2222</span> HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span><br />
<br />
Connection closed by foreign host.</div></div>
<p>Hum. Ca ne fonctionne pas.</p>
<p>Un peu de recherche (ou de triche, car <a href="http://dag.wieers.com/howto/ssh-http-tunneling/">Dag Wieers donne la réponse</a>), Apache, ou plus précisement le mod_proxy_connect est buggé. Mais un patch existe. Il faut appliquer un des patchs proposés (surement le dernier en date, dans mon exemple celui pour 2.2.16), et lancer un coup de rebuild des packages apache via les scripts debian:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">remote# </span><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<br />
<span style="color: #666666;">remote# </span><span style="color: #c20cb9; font-weight: bold;">apt-get install</span> devscripts fakeroot <span style="color: #c20cb9; font-weight: bold;">gcc</span> <span style="color: #c20cb9; font-weight: bold;">bzip2</span> dpkg-dev<br />
...<br />
<span style="color: #666666;">remote# </span><span style="color: #c20cb9; font-weight: bold;">apt-get build-dep</span> apache2.2-common<br />
...<br />
<span style="color: #666666;">remote# </span><span style="color: #c20cb9; font-weight: bold;">apt-get <span style="color: #7a0874; font-weight: bold;">source</span></span> apache2.2-common<br />
...<br />
<span style="color: #666666;">remote# </span><span style="color: #7a0874; font-weight: bold;">cd</span> apache2-2.2.16<span style="color: #000000; font-weight: bold;">/</span>modules<span style="color: #000000; font-weight: bold;">/</span>proxy<br />
<span style="color: #666666;">remote# </span><span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-O</span> mod_proxy_connect.diff <span style="color: #ff0000;">&quot;https://issues.apache.org/bugzilla/attachment.cgi?id=26225&quot;</span><br />
<span style="color: #666666;">remote# </span><span style="color: #c20cb9; font-weight: bold;">patch</span> <span style="color: #660033;">-p0</span> <span style="color: #000000; font-weight: bold;">&lt;</span> mod_proxy_connect.diff</div></div>
<p>&#8230; et c&#8217;est parti pour tout rebuilder: &#8230;</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">remote# </span>debuild <span style="color: #660033;">-us</span> <span style="color: #660033;">-uc</span><br />
<span style="color: #666666;">remote# </span><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>apache2-2.2.16<br />
... <span style="color: #7a0874; font-weight: bold;">&#40;</span>long<span style="color: #7a0874; font-weight: bold;">&#41;</span> ...</div></div>
<p>&#8230; et finalement on met à jour le package apache2.2-bin:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">remote# </span><span style="color: #c20cb9; font-weight: bold;">dpkg</span> <span style="color: #660033;">-i</span> ..<span style="color: #000000; font-weight: bold;">/</span>apache2.2-bin_2.2.16-<span style="color: #000000;">6</span>+squeeze1_amd64.deb<br />
<span style="color: #7a0874; font-weight: bold;">&#40;</span>Reading database ... <span style="color: #000000;">48179</span> files and directories currently installed.<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
Preparing to replace apache2.2-bin 2.2.16-<span style="color: #000000;">6</span>+squeeze1 <span style="color: #7a0874; font-weight: bold;">&#40;</span>using ...<span style="color: #000000; font-weight: bold;">/</span>apache2.2-bin_2.2.16-<span style="color: #000000;">6</span>+squeeze1_amd64.deb<span style="color: #7a0874; font-weight: bold;">&#41;</span> ...<br />
Unpacking replacement apache2.2-bin ...<br />
Setting up apache2.2-bin <span style="color: #7a0874; font-weight: bold;">&#40;</span>2.2.16-<span style="color: #000000;">6</span>+squeeze1<span style="color: #7a0874; font-weight: bold;">&#41;</span> ...<br />
Processing triggers <span style="color: #000000; font-weight: bold;">for</span> man-db ...<br />
remote <span style="color: #666666; font-style: italic;"># service apache2 restart</span><br />
Restarting web server: apache2 ... waiting .</div></div>
<p>On reteste avec <em>stunnel</em>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">client# </span>telnet localhost <span style="color: #000000;">12345</span><br />
Trying 127.0.0.1...<br />
Connected to localhost.<br />
Escape character is <span style="color: #ff0000;">'^]'</span>.<br />
CONNECT spine.minithins.net:<span style="color: #000000;">2222</span> HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span><br />
<br />
HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> Connection Established<br />
Proxy-agent: Apache<span style="color: #000000; font-weight: bold;">/</span>2.2.16 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Debian<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
<br />
SSH-<span style="color: #000000;">2.0</span>-OpenSSH_5.5p1 Debian-<span style="color: #000000;">6</span></div></div>
<p>Yay ! First step donne. Plus qu&#8217;à tester via un proxy http et utiliser le client ssh.</p>
<p>Pour tester, j&#8217;installe en local un <em>privoxy</em>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">client# </span><span style="color: #c20cb9; font-weight: bold;">apt-get install</span> privoxy</div></div>
<p>On pourra modifier l&#8217;adresse d&#8217;écoute de <em>privoxy</em> (localhost:8118), et le modifier (par exemple, 127.0.0.1:8080 pour éviter qu&#8217;il prenne l&#8217;adresse ipv6 au lieu de la v4).</p>
<p>On crée un profil ssh en accord, dans <em>~/.ssh/config</em>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Host spine-proxy<br />
&nbsp; &nbsp; DynamicForward <span style="color: #000000;">1080</span><br />
&nbsp; &nbsp; ServerAliveInterval <span style="color: #000000;">30</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># proxy.dev pointe vers localhost car mon proxy est sur localhost.</span><br />
&nbsp; &nbsp; ProxyCommand proxytunnel <span style="color: #660033;">-v</span> <span style="color: #660033;">-X</span> <span style="color: #660033;">-p</span> proxy.dev:<span style="color: #000000;">8118</span> <span style="color: #660033;">-r</span> spine.minithins.net:<span style="color: #000000;">443</span> <span style="color: #660033;">-d</span> <span style="color: #000000; font-weight: bold;">%</span>h:<span style="color: #000000; font-weight: bold;">%</span>p <span style="color: #660033;">-H</span> <span style="color: #ff0000;">&quot;User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span></div></div>
<p>On notera dans mon exemple que j&#8217;utilise le flag -X. Il permet de préciser que j&#8217;utilise une connection sécurisée ssl entre les deux proxy (entre mon proxy et le mod_proxy de mon apache). Il est possible que le proxy que vous utiliserez ne l&#8217;aime pas. Dans ce cas, n&#8217;hésitez pas à joeur avec -X, -e et -E).</p>
<p>Et si on restestait:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">client# </span><span style="color: #c20cb9; font-weight: bold;">ssh</span> spine-proxy<br />
...<br />
Tunneling to spine-proxy:<span style="color: #000000;">2222</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>destination<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
Communication with remote proxy:<br />
&nbsp;-<span style="color: #000000; font-weight: bold;">&gt;</span> CONNECT spine-proxy:<span style="color: #000000;">2222</span> HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span><br />
&nbsp;-<span style="color: #000000; font-weight: bold;">&gt;</span> Proxy-Connection: Keep-Alive<br />
&nbsp;-<span style="color: #000000; font-weight: bold;">&gt;</span> User-Agent: Mozilla<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">4.0</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>compatible; MSIE <span style="color: #000000;">6.0</span>; Win32<span style="color: #7a0874; font-weight: bold;">&#41;</span>\n<br />
&nbsp;<span style="color: #000000; font-weight: bold;">&lt;</span>- HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.1</span> <span style="color: #000000;">502</span> Proxy Error<br />
HTTP <span style="color: #7a0874; font-weight: bold;">return</span> code: <span style="color: #000000;">502</span> Proxy Error<br />
...</div></div>
<p>What ?!<br />
Dans les logs, on voit:</p>
<div class="codecolorer-container apache default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="apache codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[error] [client 78.229.134.1] proxy: DNS lookup failure for: spine-proxy returned by spine-proxy:<span style="color: #ff0000;">2222</span></div></div>
<p>Il n&#8217;aime pas trop que j&#8217;utilise &laquo;&nbsp;spine-proxy&nbsp;&raquo; comme alias. Solution, retirer le -d %h:%p (et le remplacer par le vrai host de la machine), ou changer l&#8217;alias. Après correction:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">client# </span><span style="color: #c20cb9; font-weight: bold;">ssh</span> <span style="color: #660033;">-v</span> spine<br />
OpenSSH_5.5p1 Debian-4ubuntu5, OpenSSL 0.9.8o 01 Jun <span style="color: #000000;">2010</span><br />
...<br />
debug1: Executing proxy command: <span style="color: #7a0874; font-weight: bold;">exec</span> proxytunnel <span style="color: #660033;">-v</span> <span style="color: #660033;">-X</span> <span style="color: #660033;">-p</span> proxy.dev:<span style="color: #000000;">8118</span> <span style="color: #660033;">-r</span> spine.minithins.net:<span style="color: #000000;">443</span> <span style="color: #660033;">-d</span> spine:<span style="color: #000000;">2222</span> <span style="color: #660033;">-H</span> <span style="color: #ff0000;">&quot;User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)\<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
...<br />
SSL <span style="color: #7a0874; font-weight: bold;">local</span> to remote proxy enabled<br />
Local proxy proxy.dev resolves to 127.0.0.1<br />
Connected to proxy.dev:<span style="color: #000000;">8118</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">local</span> proxy<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
<br />
Tunneling to spine.minithins.net:<span style="color: #000000;">443</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>remote proxy<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
Communication with <span style="color: #7a0874; font-weight: bold;">local</span> proxy:<br />
&nbsp;-<span style="color: #000000; font-weight: bold;">&gt;</span> CONNECT spine.minithins.net:<span style="color: #000000;">443</span> HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span><br />
&nbsp;-<span style="color: #000000; font-weight: bold;">&gt;</span> Proxy-Connection: Keep-Alive<br />
&nbsp;-<span style="color: #000000; font-weight: bold;">&gt;</span> User-Agent: Mozilla<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">4.0</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>compatible; MSIE <span style="color: #000000;">6.0</span>; Win32<span style="color: #7a0874; font-weight: bold;">&#41;</span>\n<br />
&nbsp;<span style="color: #000000; font-weight: bold;">&lt;</span>- HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> Connection established<br />
&nbsp;<span style="color: #000000; font-weight: bold;">&lt;</span>- Proxy-Agent: Privoxy<span style="color: #000000; font-weight: bold;">/</span>3.0.16<br />
<br />
<br />
Tunneling to spine:<span style="color: #000000;">2222</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>destination<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
Communication with remote proxy:<br />
&nbsp;-<span style="color: #000000; font-weight: bold;">&gt;</span> CONNECT spine:<span style="color: #000000;">2222</span> HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span><br />
&nbsp;-<span style="color: #000000; font-weight: bold;">&gt;</span> Proxy-Connection: Keep-Alive<br />
&nbsp;-<span style="color: #000000; font-weight: bold;">&gt;</span> User-Agent: Mozilla<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">4.0</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>compatible; MSIE <span style="color: #000000;">6.0</span>; Win32<span style="color: #7a0874; font-weight: bold;">&#41;</span>\n<br />
&nbsp;<span style="color: #000000; font-weight: bold;">&lt;</span>- HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> Connection Established<br />
&nbsp;<span style="color: #000000; font-weight: bold;">&lt;</span>- Proxy-agent: Apache<span style="color: #000000; font-weight: bold;">/</span>2.2.16 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Debian<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
<br />
Tunnel established.<br />
debug1: Remote protocol version <span style="color: #000000;">2.0</span>, remote software version OpenSSH_5.5p1 Debian-<span style="color: #000000;">6</span><br />
...<br />
<span style="color: #666666;">remote#</span></div></div>
<p>Et ça marche ! Rock&#8217;n'Roll ! :°)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.monkeyz.eu/2011/04/02/se-connecter-proprement-a-ssh-via-un-proxy-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python: Chargement de fichiers sources en live</title>
		<link>http://blog.monkeyz.eu/2011/03/26/python-chargement-de-fichiers-sources-en-live/</link>
		<comments>http://blog.monkeyz.eu/2011/03/26/python-chargement-de-fichiers-sources-en-live/#comments</comments>
		<pubDate>Sat, 26 Mar 2011 13:52:57 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[imp]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.monkeyz.eu/?p=317</guid>
		<description><![CDATA[Pour BUTT j&#8217;ai voulu un mini système de plugins/modules afin de rajouter ou modifier du code sans redémarrer mon process. Et Python propose nativement cela grâce au module imp. On va utiliser spécifiquement la procédure load_source qui permet de charger &#8230;<p class="read-more"><a href="http://blog.monkeyz.eu/2011/03/26/python-chargement-de-fichiers-sources-en-live/">Lire la suite &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Pour <a href="https://github.com/mycroft/Butt">BUTT</a> j&#8217;ai voulu un mini système de plugins/modules afin de rajouter ou modifier du code sans redémarrer mon process. Et Python propose nativement cela grâce au <a href="http://docs.python.org/library/imp.html">module imp</a>. On va utiliser spécifiquement la procédure <em>load_source</em> qui permet de charger un fichier source, de le parser, et de retourner son objet Module.</p>
<p><strong>Illustrons</strong>. Voici le code du très simple module à importer:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> TestModule:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">pass</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> myfunction<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Calling myfunction&quot;</span></div></div>
<p><strong>Procédure de chargement du module:</strong></p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">shutil</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">imp</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> load_module<span style="color: black;">&#40;</span>module_name<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Loading module %s&quot;</span> % module_name<br />
<br />
&nbsp; &nbsp; modfile <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">getcwd</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> module_name + <span style="color: #483d8b;">'.py'</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; module <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">imp</span>.<span style="color: black;">load_source</span><span style="color: black;">&#40;</span>module_name<span style="color: #66cc66;">,</span> modfile<span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> module<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Returns &lt;module 'test' from '/home/mycroft/imp/test.pyc'&gt;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">dir</span><span style="color: black;">&#40;</span>module<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Permet de lister les differents attributs de l'objet importé.</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Returns ['TestModule', '__builtins__', '__doc__', '__file__', '__name__', '__package__']</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> objname <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">dir</span><span style="color: black;">&#40;</span>module<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Je veux specifiquement les modules suffixés &quot;Module&quot;:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> objname.<span style="color: black;">endswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Module'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; modclass <span style="color: #66cc66;">=</span> <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span>module<span style="color: #66cc66;">,</span> objname<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> modclass<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Returns test.TestModule</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">dir</span><span style="color: black;">&#40;</span>modlass<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Returns ['__doc__', '__init__', '__module__', 'myfunction']</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> modclass<br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span></div></div>
<p>Il ne reste plus qu&#8217;à montrer par l&#8217;exemple le fonctionnement et le <strong>reload</strong> d&#8217;un module dans le main:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">if</span> __name__ <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'__main__'</span>:<br />
<br />
&nbsp; &nbsp; modclass <span style="color: #66cc66;">=</span> load_module<span style="color: black;">&#40;</span><span style="color: #483d8b;">'test'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; instance <span style="color: #66cc66;">=</span> modclass<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; instance.<span style="color: black;">myfunction</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># We move away test.py, and copy test_new.py to test.py.</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span><br />
<br />
&nbsp; &nbsp; <span style="color: #dc143c;">shutil</span>.<span style="color: black;">move</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'test.py'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'test_old.py'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #dc143c;">shutil</span>.<span style="color: black;">move</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'test_new.py'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'test.py'</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; modclass <span style="color: #66cc66;">=</span> load_module<span style="color: black;">&#40;</span><span style="color: #483d8b;">'test'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; instance <span style="color: #66cc66;">=</span> modclass<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; instance.<span style="color: black;">myfunction</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #dc143c;">shutil</span>.<span style="color: black;">move</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'test.py'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'test_new.py'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #dc143c;">shutil</span>.<span style="color: black;">move</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'test_old.py'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'test.py'</span><span style="color: black;">&#41;</span></div></div>
<p>Qui nous donnera:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ .<span style="color: #000000; font-weight: bold;">/</span>modules.py <br />
Loading module <span style="color: #7a0874; font-weight: bold;">test</span><br />
<span style="color: #000000; font-weight: bold;">&lt;</span>module <span style="color: #ff0000;">'test'</span> from <span style="color: #ff0000;">'/home/mycroft/imp/test.py'</span><span style="color: #000000; font-weight: bold;">&gt;</span><br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'TestModule'</span>, <span style="color: #ff0000;">'__builtins__'</span>, <span style="color: #ff0000;">'__doc__'</span>, <span style="color: #ff0000;">'__file__'</span>, <span style="color: #ff0000;">'__name__'</span>, <span style="color: #ff0000;">'__package__'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
test.TestModule<br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'__doc__'</span>, <span style="color: #ff0000;">'__init__'</span>, <span style="color: #ff0000;">'__module__'</span>, <span style="color: #ff0000;">'myfunction'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
Calling myfunction<br />
<br />
Loading module <span style="color: #7a0874; font-weight: bold;">test</span><br />
<span style="color: #000000; font-weight: bold;">&lt;</span>module <span style="color: #ff0000;">'test'</span> from <span style="color: #ff0000;">'/home/mycroft/imp/test.py'</span><span style="color: #000000; font-weight: bold;">&gt;</span><br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'TestModule'</span>, <span style="color: #ff0000;">'__builtins__'</span>, <span style="color: #ff0000;">'__doc__'</span>, <span style="color: #ff0000;">'__file__'</span>, <span style="color: #ff0000;">'__name__'</span>, <span style="color: #ff0000;">'__package__'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
test.TestModule<br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'__doc__'</span>, <span style="color: #ff0000;">'__init__'</span>, <span style="color: #ff0000;">'__module__'</span>, <span style="color: #ff0000;">'myfunction'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
Calling <span style="color: #7a0874; font-weight: bold;">&#40;</span>new<span style="color: #7a0874; font-weight: bold;">&#41;</span> myfunction</div></div>
<p>Le code modifié (ici test.py a été remplacé par test_new.py, qui contient du code modifié) a bien été relu par python et est à présent utilisé.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.monkeyz.eu/2011/03/26/python-chargement-de-fichiers-sources-en-live/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ecrire un bot IRC grâce à Python et Twisted</title>
		<link>http://blog.monkeyz.eu/2011/03/25/ecrire-un-bot-irc-grace-a-python-et-twisted/</link>
		<comments>http://blog.monkeyz.eu/2011/03/25/ecrire-un-bot-irc-grace-a-python-et-twisted/#comments</comments>
		<pubDate>Fri, 25 Mar 2011 08:51:40 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[twisted]]></category>

		<guid isPermaLink="false">http://blog.monkeyz.eu/?p=310</guid>
		<description><![CDATA[Quand il faut écrire une application réseau, les développeurs Python n&#8217;ont qu&#8217;un mot à la bouche: Twisted. Il s&#8217;agit d&#8217;un moteur réseau &#171;&#160;event-driven&#160;&#187;, et comprend un grand nombre de protocoles de niveau 3 (TCP, UDP, socket unix) et 7 (HTTP, &#8230;<p class="read-more"><a href="http://blog.monkeyz.eu/2011/03/25/ecrire-un-bot-irc-grace-a-python-et-twisted/">Lire la suite &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Quand il faut écrire une application réseau, les développeurs Python n&#8217;ont qu&#8217;un mot à la bouche: <a href="http://twistedmatrix.com/trac/">Twisted</a>. Il s&#8217;agit d&#8217;un moteur réseau &laquo;&nbsp;event-driven&nbsp;&raquo;, et comprend un grand nombre de protocoles de niveau 3 (TCP, UDP, socket unix) et 7 (HTTP, SSH, IMAP, IRC&#8230;).</p>
<p>On va donc simplement voir ici comment coder un bot irc (quasi) complet. On prend la doc &laquo;&nbsp;<a href="http://twistedmatrix.com/documents/10.2.0/core/howto/clients.html">Writing Clients</a>&nbsp;&raquo; et celle de la classe <a href="http://twistedmatrix.com/documents/8.2.0/api/twisted.words.protocols.irc.IRCClient.html">irc.IRCClient</a>.</p>
<p>On a donc besoin d&#8217;écrire une classe de base pour le bot, et sa factory utilisable dans le <a href="http://twistedmatrix.com/documents/10.2.0/core/howto/reactor-basics.html">reactor</a> de twisted.</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">words</span>.<span style="color: black;">protocols</span> <span style="color: #ff7700;font-weight:bold;">import</span> irc<br />
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> protocol<br />
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor<br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> QuickBot<span style="color: black;">&#40;</span>irc.<span style="color: black;">IRCClient</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> _get_nickname<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">nickname</span><br />
&nbsp; &nbsp; nickname <span style="color: #66cc66;">=</span> <span style="color: #008000;">property</span><span style="color: black;">&#40;</span>_get_nickname<span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> signedOn<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">channel</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">pass</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> privmsg<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">user</span><span style="color: #66cc66;">,</span> channel<span style="color: #66cc66;">,</span> msg<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">pass</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> QuickBotFactory<span style="color: black;">&#40;</span>protocol.<span style="color: black;">ClientFactory</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; protocol <span style="color: #66cc66;">=</span> QuickBot<br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> channel<span style="color: #66cc66;">,</span> nickname<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">channel</span> <span style="color: #66cc66;">=</span> channel<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">nickname</span> <span style="color: #66cc66;">=</span> nickname<br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> clientConnectionLost<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> connector<span style="color: #66cc66;">,</span> reason<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; connector.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> clientConnectionFailed<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> connector<span style="color: #66cc66;">,</span> reason<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; connector.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>Et le point d&#8217;entrée:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">if</span> __name__ <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">&quot;__main__&quot;</span>:<br />
&nbsp; &nbsp; reactor.<span style="color: black;">connectTCP</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'localhost'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff4500;">6667</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;QuickBotFactory<span style="color: black;">&#40;</span><span style="color: #483d8b;">'#bot'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'quicky'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; reactor.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>Et du coup, j&#8217;ai un peu étendu le truc et j&#8217;ai créé Another Python <strong>B</strong>ot <strong>U</strong>sing <strong>T</strong>he <strong>T</strong>wisted Framework, aka Butt, avec un système de modules chargeables dynamiquement (avec <a href="http://docs.python.org/library/imp.html">imp</a>) et l&#8217;utilisation de <a href="http://pyyaml.org/">python-yaml</a> pour les fichiers de conf. Un bon exemple pour commencer un bot IRC ! Les sources sont disponibles sur le projet <a href="https://github.com/mycroft/Butt">Butt</a> sur <a href="https://github.com/mycroft">mon compte Github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.monkeyz.eu/2011/03/25/ecrire-un-bot-irc-grace-a-python-et-twisted/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mise en commun d’un serveur git via ssh et mise à disposition à tous</title>
		<link>http://blog.monkeyz.eu/2011/03/19/mise-en-commun-dun-serveur-git-via-ssh-et-mise-a-disposition-a-tous/</link>
		<comments>http://blog.monkeyz.eu/2011/03/19/mise-en-commun-dun-serveur-git-via-ssh-et-mise-a-disposition-a-tous/#comments</comments>
		<pubDate>Sat, 19 Mar 2011 11:45:36 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[git-daemon]]></category>
		<category><![CDATA[sygit]]></category>

		<guid isPermaLink="false">http://blog.monkeyz.eu/?p=307</guid>
		<description><![CDATA[Je suis en train de développer sygit, une interface web light pour naviguer dans un dépôt git. J&#8217;ai alors décidé de mettre au clair mes dépots et de monter ma propre architecture d&#8217;hosting git, sous debian. Emplacement des dépôts Les &#8230;<p class="read-more"><a href="http://blog.monkeyz.eu/2011/03/19/mise-en-commun-dun-serveur-git-via-ssh-et-mise-a-disposition-a-tous/">Lire la suite &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Je suis en train de développer <a href="https://github.com/mycroft/sygit">sygit</a>, une interface web light pour naviguer dans un dépôt <a href="http://git-scm.com/">git</a>. J&#8217;ai alors décidé de mettre au clair mes dépots et de monter ma propre architecture d&#8217;hosting git, sous debian.</p>
<p><strong>Emplacement des dépôts</strong></p>
<p>Les dépôts vont être accessible via ssh (lecture+écriture) et via git-daemon (par dessus d&#8217;inetd, en lecture seule). On décide de créer un groupe &laquo;&nbsp;git-users&nbsp;&raquo; pour ceux qui auront accès aux dépots. On édite donc <em>/etc/group</em>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">git-users:x:<span style="color: #000000;">199</span>:mycroft,patrick</div></div>
<p>Le dépôt sera physiquement dans /git. On le crée (et on n&#8217;oublie pas le &#8211;bare !):</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># mkdir -p /git/newproject</span><br />
<span style="color: #666666; font-style: italic;"># cd !-1:2</span><br />
<span style="color: #666666; font-style: italic;"># git --bare init</span><br />
Initialized empty Git repository <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>newproject<span style="color: #000000; font-weight: bold;">/</span></div></div>
<p>On pourra également réutiliser un projet déjà existant dont on créerait un dépôt bare:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /git</span><br />
<span style="color: #666666; font-style: italic;"># git clone --bare git://github.com/mycroft/sygit.git</span><br />
Cloning into bare repository sygit.git...<br />
remote: Counting objects: <span style="color: #000000;">48</span>, done.<br />
remote: Compressing objects: <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">47</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">47</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, done.<br />
remote: Total <span style="color: #000000;">48</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>delta <span style="color: #000000;">21</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, reused <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>delta <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
Receiving objects: <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">48</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">48</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, <span style="color: #000000;">8.77</span> KiB, done.<br />
Resolving deltas: <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">21</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">21</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, done.</div></div>
<p>Pour ces projets, il faudra changer la configuration et leur indiquer qu&#8217;il s&#8217;agit d&#8217;un dépôt partagé sur la base du groupe. Pour cela, il faut modifier la propriété <em>core.sharedRepository</em>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd sygit.git</span><br />
<span style="color: #666666; font-style: italic;"># git repo-config core.sharedRepository group</span></div></div>
<p>On n&#8217;a plus qu&#8217;à fixer les permissions manuellement:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># chgrp -R git-users /git/sygit.git</span><br />
<span style="color: #666666; font-style: italic;"># find /git/sygit.git -type d -exec chmod g+ws {} \;</span></div></div>
<p><strong>Mise en place de git-daemon</strong></p>
<p>On utilise inetd pour partager les dépôts. On édite donc <em>/etc/inetd.conf</em> &#8230;</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">git</span> stream tcp nowait nobody <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">git</span> <span style="color: #c20cb9; font-weight: bold;">git daemon</span> <span style="color: #660033;">--inetd</span> <span style="color: #660033;">--verbose</span> <span style="color: #660033;">--export-all</span> <span style="color: #660033;">--base-path</span>=<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">git</span> <span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">git</span></div></div>
<p>&#8230; et on redémarre le daemon:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>openbsd-inetd restart</div></div>
<p>Testons !</p>
<p>Sur ma machine de travail, on clone le dépôt en read-only:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #c20cb9; font-weight: bold;">git clone</span> git:<span style="color: #000000; font-weight: bold;">//</span>mkz.me<span style="color: #000000; font-weight: bold;">/</span>sygit.git<br />
Initialized empty Git repository <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>testgit<span style="color: #000000; font-weight: bold;">/</span>sygit<span style="color: #000000; font-weight: bold;">/</span>.git<span style="color: #000000; font-weight: bold;">/</span><br />
remote: Counting objects: <span style="color: #000000;">48</span>, done.<br />
remote: Compressing objects: <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">26</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">26</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, done.<br />
remote: Total <span style="color: #000000;">48</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>delta <span style="color: #000000;">21</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, reused <span style="color: #000000;">48</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>delta <span style="color: #000000;">21</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
Receiving objects: <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">48</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">48</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, <span style="color: #000000;">8.77</span> KiB, done.<br />
Resolving deltas: <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">21</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">21</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, done.<br />
<br />
$ <span style="color: #7a0874; font-weight: bold;">cd</span> sygit<br />
$ <span style="color: #c20cb9; font-weight: bold;">git remote</span> <span style="color: #660033;">-v</span><br />
origin &nbsp;git:<span style="color: #000000; font-weight: bold;">//</span>mkz.me<span style="color: #000000; font-weight: bold;">/</span>sygit.git <span style="color: #7a0874; font-weight: bold;">&#40;</span>fetch<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
origin &nbsp;git:<span style="color: #000000; font-weight: bold;">//</span>mkz.me<span style="color: #000000; font-weight: bold;">/</span>sygit.git <span style="color: #7a0874; font-weight: bold;">&#40;</span>push<span style="color: #7a0874; font-weight: bold;">&#41;</span></div></div>
<p>Pour le moment, le seul remote configuré est le serveur git. Celui là étant en read-only, il va faloir le modifier pour pouvoir push:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #c20cb9; font-weight: bold;">git remote</span> <span style="color: #c20cb9; font-weight: bold;">rm</span> origin<br />
$ <span style="color: #c20cb9; font-weight: bold;">git remote</span> add origin mycroft<span style="color: #000000; font-weight: bold;">@</span>mkz.me:<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>sygit.git<br />
$ <span style="color: #c20cb9; font-weight: bold;">git remote</span> <span style="color: #660033;">-v</span><br />
origin &nbsp;mycroft<span style="color: #000000; font-weight: bold;">@</span>mkz.me:<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>sygit.git <span style="color: #7a0874; font-weight: bold;">&#40;</span>fetch<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
origin &nbsp;mycroft<span style="color: #000000; font-weight: bold;">@</span>mkz.me:<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>sygit.git <span style="color: #7a0874; font-weight: bold;">&#40;</span>push<span style="color: #7a0874; font-weight: bold;">&#41;</span></div></div>
<p>Il ne reste plus qu&#8217;à modifier un fichier, le commiter et le pusher:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #c20cb9; font-weight: bold;">vim</span> README <br />
$ <span style="color: #c20cb9; font-weight: bold;">git add</span> README<br />
$ <span style="color: #c20cb9; font-weight: bold;">git commit</span> <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Update README&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span>master 2d98128<span style="color: #7a0874; font-weight: bold;">&#93;</span> Update README<br />
&nbsp;<span style="color: #000000;">1</span> files changed, <span style="color: #000000;">6</span> insertions<span style="color: #7a0874; font-weight: bold;">&#40;</span>+<span style="color: #7a0874; font-weight: bold;">&#41;</span>, <span style="color: #000000;">0</span> deletions<span style="color: #7a0874; font-weight: bold;">&#40;</span>-<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
$ <span style="color: #c20cb9; font-weight: bold;">git push</span> origin master<br />
Counting objects: <span style="color: #000000;">5</span>, done.<br />
Delta compression using up to <span style="color: #000000;">2</span> threads.<br />
Compressing objects: <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, done.<br />
Writing objects: <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, <span style="color: #000000;">375</span> bytes, done.<br />
Total <span style="color: #000000;">3</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>delta <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, reused <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>delta <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
To mycroft<span style="color: #000000; font-weight: bold;">@</span>mkz.me:<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>sygit.git<br />
&nbsp; &nbsp;826d9b0..2d98128 &nbsp;master -<span style="color: #000000; font-weight: bold;">&gt;</span> master</div></div>
<p>Et voilà !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.monkeyz.eu/2011/03/19/mise-en-commun-dun-serveur-git-via-ssh-et-mise-a-disposition-a-tous/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache: Lire et découper le corps d’une requête POST dans un module Apache</title>
		<link>http://blog.monkeyz.eu/2011/03/14/apache-lire-et-decouper-le-corps-dune-requete-post-dans-un-module-apache/</link>
		<comments>http://blog.monkeyz.eu/2011/03/14/apache-lire-et-decouper-le-corps-dune-requete-post-dans-un-module-apache/#comments</comments>
		<pubDate>Mon, 14 Mar 2011 15:08:39 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[random]]></category>

		<guid isPermaLink="false">http://blog.monkeyz.eu/?p=297</guid>
		<description><![CDATA[Le code est très inspiré du chapitre &#171;&#160;Reading the Request body&#160;&#187; du livre Writing Apache Modules with Perl and C. Pour expérimenter un peu les modules Apache (suite à un nouvel entretien d&#8217;embauche), je me suis mis en tête de &#8230;<p class="read-more"><a href="http://blog.monkeyz.eu/2011/03/14/apache-lire-et-decouper-le-corps-dune-requete-post-dans-un-module-apache/">Lire la suite &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Le code est très inspiré du chapitre &laquo;&nbsp;Reading the Request body&nbsp;&raquo; du livre <a href="http://www.amazon.fr/Writing-Apache-Modules-Perl-anglais/dp/156592567X/ref=sr_1_1?ie=UTF8&#038;s=english-books&#038;qid=1300113718&#038;sr=8-1">Writing Apache Modules with Perl and C</a>.</p>
<p>Pour expérimenter un peu les modules Apache (suite à un nouvel entretien d&#8217;embauche), je me suis mis en tête de coder un mini service via un module pour générer des nombres aléatoire.</p>
<p>Le service devra être très simple et sera exécuté lors de l&#8217;appel de l&#8217;url <em>http://localhost/randomint</em>, et l&#8217;on pourra l&#8217;appeler en POST en donnant, par exemple, l&#8217;argument <em>count</em> pour préciser le nombre d&#8217;entiers aléatoires que l&#8217;on désire.</p>
<p>Et finalement, l&#8217;étape la plus complexe aura été de reconstruire le body envoyé lors de la requête POST, et de le parser pour en sortir un tableau associatif (key/value).</p>
<p><strong>Reconstruction du body</strong></p>
<p>Cette fonction attend l&#8217;envoie du body par le client et reconstruit en un seul block toutes les données envoyées.</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333;">static</span> <span style="color: #993333;">int</span> chunk_reader<span style="color: #009900;">&#40;</span>request_rec <span style="color: #339933;">*</span>r<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>rbuf<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">int</span> ret<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>OK <span style="color: #339933;">!=</span> <span style="color: #009900;">&#40;</span>ret <span style="color: #339933;">=</span> ap_setup_client_block<span style="color: #009900;">&#40;</span>r<span style="color: #339933;">,</span> REQUEST_CHUNKED_ERROR<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> ret<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ap_should_client_block<span style="color: #009900;">&#40;</span>r<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333;">char</span> argsbuffer<span style="color: #009900;">&#91;</span>HUGE_STRING_LEN<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333;">int</span> rsize<span style="color: #339933;">,</span> len_read<span style="color: #339933;">,</span> rpos<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333;">long</span> length <span style="color: #339933;">=</span> r<span style="color: #339933;">-&gt;</span>remaining<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">*</span>rbuf <span style="color: #339933;">=</span> apr_pcalloc<span style="color: #009900;">&#40;</span>r<span style="color: #339933;">-&gt;</span>pool<span style="color: #339933;">,</span> length <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span> <span style="color: #339933;">&lt;</span> <span style="color: #009900;">&#40;</span>len_read <span style="color: #339933;">=</span> ap_get_client_block<span style="color: #009900;">&#40;</span>r<span style="color: #339933;">,</span> argsbuffer<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>argsbuffer<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>rpos <span style="color: #339933;">+</span> len_read<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> length<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rsize <span style="color: #339933;">=</span> length <span style="color: #339933;">-</span> rpos<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rsize <span style="color: #339933;">=</span> len_read<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">memcpy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>rbuf <span style="color: #339933;">+</span> rpos<span style="color: #339933;">,</span> argsbuffer<span style="color: #339933;">,</span> rsize<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rpos <span style="color: #339933;">+=</span> rsize<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> ret<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p><strong>Création du tableau associatif</strong></p>
<p>Avec le block recomposé, on fait ensuite appel aux fonctions ap_getword ap_getword et aux fonctions apr_tables de apr afin de découper et stocker les différentes valeurs envoyées:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333;">static</span> <span style="color: #993333;">int</span> read_post<span style="color: #009900;">&#40;</span>request_rec <span style="color: #339933;">*</span>r<span style="color: #339933;">,</span> apr_table_t <span style="color: #339933;">**</span>tab<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>data<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>key<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>val<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>type<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">int</span> ret <span style="color: #339933;">=</span> OK<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>r<span style="color: #339933;">-&gt;</span>method_number <span style="color: #339933;">!=</span> M_POST<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> ret<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// On verifie que le content type soit bien application/x-www-form-urlencoded</span><br />
&nbsp; &nbsp; type <span style="color: #339933;">=</span> apr_table_get<span style="color: #009900;">&#40;</span>r<span style="color: #339933;">-&gt;</span>headers_in<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Content-Type&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>strcasecmp<span style="color: #009900;">&#40;</span>type<span style="color: #339933;">,</span> DEFAULT_ENCTYPE<span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> DECLINED<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ret <span style="color: #339933;">=</span> chunk_reader<span style="color: #009900;">&#40;</span>r<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>data<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> OK<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #b1b100;">return</span> ret<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Creation ou RAZ de la apr_table_t</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>tab<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; apr_table_clear<span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>tab<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">*</span>tab <span style="color: #339933;">=</span> apr_table_make<span style="color: #009900;">&#40;</span>r<span style="color: #339933;">-&gt;</span>pool<span style="color: #339933;">,</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Tant qu'il y a des datas...</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>data <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>val <span style="color: #339933;">=</span> ap_getword<span style="color: #009900;">&#40;</span>r<span style="color: #339933;">-&gt;</span>pool<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>data<span style="color: #339933;">,</span> <span style="color: #ff0000;">'&amp;'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; key <span style="color: #339933;">=</span> ap_getword<span style="color: #009900;">&#40;</span>r<span style="color: #339933;">-&gt;</span>pool<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>val<span style="color: #339933;">,</span> <span style="color: #ff0000;">'='</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ap_unescape_url<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ap_unescape_url<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>val<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; apr_table_merge<span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>tab<span style="color: #339933;">,</span> key<span style="color: #339933;">,</span> val<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> OK<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p><strong>Récupérer la bonne valeur</strong></p>
<p>Une fois qu&#8217;on a le tableau associatif, il nous faut une fonction pour récupérer la valeur voulue:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333;">int</span> get_value<span style="color: #009900;">&#40;</span>request_rec <span style="color: #339933;">*</span>r<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>name<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; apr_table_t <span style="color: #339933;">*</span>post_values <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; apr_array_header_t <span style="color: #339933;">*</span>arr<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; apr_table_entry_t <span style="color: #339933;">*</span>elt<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> ret<span style="color: #339933;">,</span> value<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>OK <span style="color: #339933;">!=</span> <span style="color: #009900;">&#40;</span>ret <span style="color: #339933;">=</span> read_post<span style="color: #009900;">&#40;</span>r<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>post_values<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>NULL <span style="color: #339933;">==</span> post_values<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; arr <span style="color: #339933;">=</span> apr_table_elts<span style="color: #009900;">&#40;</span>post_values<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; elt <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>apr_table_entry_t<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>arr<span style="color: #339933;">-&gt;</span>elts<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> arr<span style="color: #339933;">-&gt;</span>nelts<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066;">strcmp</span><span style="color: #009900;">&#40;</span>elt<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">key</span><span style="color: #339933;">,</span> name<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">&amp;&amp;</span> LONG_MIN <span style="color: #339933;">!=</span> <span style="color: #009900;">&#40;</span>value <span style="color: #339933;">=</span> <span style="color: #000066;">strtol</span><span style="color: #009900;">&#40;</span>elt<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">val</span><span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> value<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p><strong>Revenons au code du module lui-même&#8230;</strong></p>
<p>Il ne reste plus qu&#8217;à coder le handler de génération, et rajouter les structures nécessaires pour le module:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333;">static</span> <span style="color: #993333;">int</span> mod_randomint_method_handler <span style="color: #009900;">&#40;</span>request_rec <span style="color: #339933;">*</span>r<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">int</span> ret <span style="color: #339933;">=</span> OK<span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> count <span style="color: #339933;">=</span> <span style="color: #0000dd;">8</span><span style="color: #339933;">,</span> new_count<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> random_value<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; new_count <span style="color: #339933;">=</span> get_value<span style="color: #009900;">&#40;</span>r<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>new_count <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">&amp;&amp;</span> new_count <span style="color: #339933;">&lt;</span> MAX_COUNT<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; count <span style="color: #339933;">=</span> new_count<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; ap_set_content_type<span style="color: #009900;">&#40;</span>r<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;text/plain&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #993333;">int</span> random_fd <span style="color: #339933;">=</span> open<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;/dev/urandom&quot;</span><span style="color: #339933;">,</span> O_RDONLY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> count<span style="color: #339933;">;</span> i <span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; read<span style="color: #009900;">&#40;</span>random_fd<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>random_value<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>random_value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ap_rprintf<span style="color: #009900;">&#40;</span>r<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%u<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> random_value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; close<span style="color: #009900;">&#40;</span>random_fd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// fprintf(stderr, &quot;Count: %d\n&quot;, count);</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// fflush(stderr);</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> ret<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #993333;">static</span> <span style="color: #993333;">void</span> mod_randomint_register_hooks <span style="color: #009900;">&#40;</span>apr_pool_t <span style="color: #339933;">*</span>p<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; ap_hook_handler<span style="color: #009900;">&#40;</span>mod_randomint_method_handler<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span>APR_HOOK_LAST<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
module AP_MODULE_DECLARE_DATA randomint_module <span style="color: #339933;">=</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; STANDARD20_MODULE_STUFF<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; NULL<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; NULL<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; NULL<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; NULL<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; NULL<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; mod_randomint_register_hooks<span style="color: #339933;">,</span> &nbsp; &nbsp;<span style="color: #808080; font-style: italic;">/* callback for registering hooks */</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Il ne reste plus qu&#8217;à compiler le code &#8230;:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">apxs2</span> <span style="color: #660033;">-c</span> <span style="color: #660033;">-a</span> <span style="color: #660033;">-i</span> mod_randomint.c</div></div>
<p>&#8230; et le configurer dans httpd.conf:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">LoadModule randomint_module /usr/lib/apache2/modules/mod_randomint.so<br />
<br />
&nbsp; &nbsp; &lt;Location /randomint&gt;<br />
&nbsp; &nbsp; &nbsp; SetHandler randomint-handler<br />
&nbsp; &nbsp; &lt;/Location&gt;</div></div>
<p>Et après un redémarrage d&#8217;apache:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ curl http:<span style="color: #000000; font-weight: bold;">//</span>localhost<span style="color: #000000; font-weight: bold;">/</span>randomint<br />
&nbsp; &nbsp; <span style="color: #000000;">4162010288</span><br />
&nbsp; &nbsp; <span style="color: #000000;">1220025110</span><br />
&nbsp; &nbsp; <span style="color: #000000;">2641785880</span></div></div>
<p>On pourra voir le résultat dans mes <a href="http://www.monkeyz.eu/snippets/8">snippets</a> et le télécharger dans <a href="http://www.monkeyz.eu/projects/mod_randomint.tar.gz">mes projets</a> directement.</p>
<p><strong>Mise à jour:</strong></p>
<p>J&#8217;ai oublié de filtrer par handler dans le code. On incluera donc dans <em>mod_randomint_method_handler</em>:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066;">strcmp</span><span style="color: #009900;">&#40;</span>r<span style="color: #339933;">-&gt;</span>handler<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;randomint-handler&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> DECLINED<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.monkeyz.eu/2011/03/14/apache-lire-et-decouper-le-corps-dune-requete-post-dans-un-module-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Intégrer le single sign-on Twitter avec Yapl4twitter dans symfony</title>
		<link>http://blog.monkeyz.eu/2011/03/07/integrer-le-single-sign-on-twitter-avec-yapl4twitter-dans-symfony/</link>
		<comments>http://blog.monkeyz.eu/2011/03/07/integrer-le-single-sign-on-twitter-avec-yapl4twitter-dans-symfony/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 08:53:17 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[yapl4twitter]]></category>

		<guid isPermaLink="false">http://blog.monkeyz.eu/?p=286</guid>
		<description><![CDATA[Le but de ce mini tutorial est d&#8217;implémenter la fonctionnalité single sign-on de Twitter sur un site construit autour de Symfony. Pour ce faire, j&#8217;ai utilisé la bibliothèque Yapl4twitter (que j&#8217;ai développé). On n&#8217;oubliera pas de consulter Sign in with &#8230;<p class="read-more"><a href="http://blog.monkeyz.eu/2011/03/07/integrer-le-single-sign-on-twitter-avec-yapl4twitter-dans-symfony/">Lire la suite &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Le but de ce mini tutorial est d&#8217;implémenter la fonctionnalité single sign-on de Twitter sur un site construit autour de Symfony. Pour ce faire, j&#8217;ai utilisé la bibliothèque <a href="https://github.com/mycroft/yapl4twitter">Yapl4twitter</a> (que j&#8217;ai développé).</p>
<p>On n&#8217;oubliera pas de consulter <a href="http://dev.twitter.com/pages/sign_in_with_twitter">Sign in with twitter</a> afin de mieux comprendre comment fonctionne cette fonctionnalité.</p>
<p>Un article où il y a plus de code que de texte, mais je pense que c&#8217;est assez clair. ;-)</p>
<p><strong>Installer Yapl4twitter et le configurer</strong></p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #7a0874; font-weight: bold;">cd</span> lib<span style="color: #000000; font-weight: bold;">/</span>vendor<br />
$ <span style="color: #c20cb9; font-weight: bold;">git clone</span> git:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>mycroft<span style="color: #000000; font-weight: bold;">/</span>yapl4twitter.git<br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span>...<span style="color: #7a0874; font-weight: bold;">&#93;</span></div></div>
<p>On le rajoute dans config/autoload.yml pour que les classes soient préloadées:</p>
<div class="codecolorer-container yaml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="yaml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007F45;">autoload</span>:<span style="color: #007F45;"><br />
&nbsp; &nbsp; twitter</span>:<span style="color: green;"><br />
&nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="font-weight: bold; color: brown;">: </span>twitter<span style="color: green;"><br />
&nbsp; &nbsp; &nbsp; &nbsp; path</span><span style="font-weight: bold; color: brown;">: </span><span style="font-weight: bold; color: red;">%SF_LIB_DIR%/vendor/yapl4twitter</span><span style="color: green;"><br />
&nbsp; &nbsp; &nbsp; &nbsp; recursive</span><span style="font-weight: bold; color: brown;">: </span>off</div></div>
<p>On va ensuite avoir besoin de clefs valide d&#8217;une application. On prendra donc soin d&#8217;en créer une sur https://dev.twitter.com/apps et de créer le config/app.yml adéquat:</p>
<div class="codecolorer-container yaml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="yaml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007F45;">all</span>:<span style="color: green;"><br />
&nbsp; &nbsp; base_url</span><span style="font-weight: bold; color: brown;">: </span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;http://mysite.com<br />
<span style="color: #007F45;"><br />
&nbsp; &nbsp; twitter</span>:<span style="color: green;"><br />
&nbsp; &nbsp; &nbsp; &nbsp; consumer_key</span><span style="font-weight: bold; color: brown;">: </span> &nbsp; &nbsp; &nbsp;&lt;Consumer key&gt;<span style="color: green;"><br />
&nbsp; &nbsp; &nbsp; &nbsp; consumer_secret</span><span style="font-weight: bold; color: brown;">: </span> &nbsp; &lt;Consumer secret<span style="font-weight: bold; color: brown;">&gt;<br />
</span><span style="color: green;"><br />
&nbsp; &nbsp; &nbsp; &nbsp; request_token_url</span><span style="font-weight: bold; color: brown;">: </span> https://api.twitter.com/oauth/request_token<span style="color: green;"><br />
&nbsp; &nbsp; &nbsp; &nbsp; access_token_url</span><span style="font-weight: bold; color: brown;">: </span> &nbsp;https://api.twitter.com/oauth/access_token<span style="color: green;"><br />
&nbsp; &nbsp; &nbsp; &nbsp; authorize_url</span><span style="font-weight: bold; color: brown;">: </span> &nbsp; &nbsp; https://api.twitter.com/oauth/authorize<span style="color: green;"><br />
&nbsp; &nbsp; &nbsp; &nbsp; authenticate_url</span><span style="font-weight: bold; color: brown;">: </span> &nbsp;https://api.twitter.com/oauth/authenticate</div></div>
<p><strong>Le module et ses actions dans symfony</strong></p>
<p>On crée un module spécifique au login/logout. Mon application s&#8217;appelle &laquo;&nbsp;frontend&nbsp;&raquo;, tout simplement:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$ </span>php symfony generate:module frontend twitter</div></div>
<p>On aura dans ce module deux actions: login et logout. On n&#8217;oubliera pas d&#8217;en créer les routes dans apps/frontend/config/routing.yml:</p>
<div class="codecolorer-container yaml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="yaml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007F45;">login</span>:<span style="color: green;"><br />
&nbsp; url</span><span style="font-weight: bold; color: brown;">: </span> /login<span style="color: green;"><br />
&nbsp; param</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> module<span style="font-weight: bold; color: brown;">: </span>twitter, action<span style="font-weight: bold; color: brown;">: </span>login <span class="br0">&#125;</span><br />
<span style="color: #007F45;"><br />
logout</span>:<span style="color: green;"><br />
&nbsp; url</span><span style="font-weight: bold; color: brown;">: </span> /logout<span style="color: green;"><br />
&nbsp; param</span><span style="font-weight: bold; color: brown;">: </span><span class="br0">&#123;</span> module<span style="font-weight: bold; color: brown;">: </span>twitter, action<span style="font-weight: bold; color: brown;">: </span>logout <span class="br0">&#125;</span></div></div>
<p>Il ne reste plus qu&#8217;à implémenter les deux actions:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeLogin<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$oa</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> OAuth<span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'app_twitter_consumer_key'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'app_twitter_consumer_secret'</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Premiere etape: Pas de parametre oauth_token: On ne vient pas de twitter.com</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// On fait donc la demande d'un request token et on redirige l'utilisateur vers</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// twitter.com.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'oauth_token'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$request_token_url</span> <span style="color: #339933;">=</span> sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'app_twitter_request_token_url'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$callback_url</span> <span style="color: #339933;">=</span> sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'app_base_url'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$callback_url</span><span style="color: #339933;">.=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getController</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">genUrl</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'@login'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$request_token</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oa</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRequestToken</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request_token_url</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$callback_url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// On redirige vers l'authenticate_url qui permet de ne pas avoir</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// a accepter l'application une nouvelle fois.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$next_url</span> <span style="color: #339933;">=</span> sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'app_twitter_authenticate_url'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$next_url</span><span style="color: #339933;">.=</span> <span style="color: #0000ff;">'?oauth_token='</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$request_token</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'oauth_token'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$next_url</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Seconde etape: On a un parametre oauth_token. On vient donc de twitter.com</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// On va recuperer a partir du oauth_token et oauth_verifier l'oauth_token_secret.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$oauth_token</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'oauth_token'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$oauth_verifier</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'oauth_verifier'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$access_token</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oa</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAccessToken</span><span style="color: #009900;">&#40;</span>sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'app_twitter_access_token_url'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$oauth_token</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$oauth_verifier</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// On a le token, on enregistre dans la session le screen_name et </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUser</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'screen_name'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$access_token</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'screen_name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUser</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'oauth_token'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$access_token</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'oauth_token'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUser</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'oauth_token_secret'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$access_token</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'oauth_token_secret'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUser</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAuthenticated</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// On pourrait avoir une table ou l'on stocke ces informations pour plus tard:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// $account = AccountTable::getInstance()-&gt;findOneByScreenName($access_token['screen_name']);</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// if( ! $account )</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// {</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// &nbsp; &nbsp; $account = new Account();</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// &nbsp; &nbsp; $account-&gt;screen_name = $access_token['screen_name'];</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// &nbsp; &nbsp; $account-&gt;user_id = $access_token['user_id'];</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// &nbsp; &nbsp; $account-&gt;oauth_token = $access_token['oauth_token'];</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// &nbsp; &nbsp; $account-&gt;oauth_token_secret = $access_token['oauth_token_secret'];</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// &nbsp; &nbsp; $account-&gt;save();</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// }</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// $this-&gt;getUser()-&gt;setAttribute('account_id', $account-&gt;id);</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// On est loggue, on retourne sur la page principale:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'@homepage'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> sfView<span style="color: #339933;">::</span><span style="color: #004000;">NONE</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// logout: On invalide tout.</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeLogout<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUser</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'screen_name'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUser</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'oauth_token'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUser</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'oauth_token_secret'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUser</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAuthenticated</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'@homepage'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.monkeyz.eu/2011/03/07/integrer-le-single-sign-on-twitter-avec-yapl4twitter-dans-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mplayer/mencoder: Convertir un fichier .mkv (Matroska) en .avi (divx)</title>
		<link>http://blog.monkeyz.eu/2011/03/06/mplayermencoder-convertir-un-fichier-mkv-matroska-en-avi-divx/</link>
		<comments>http://blog.monkeyz.eu/2011/03/06/mplayermencoder-convertir-un-fichier-mkv-matroska-en-avi-divx/#comments</comments>
		<pubDate>Sun, 06 Mar 2011 16:57:50 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[divx]]></category>
		<category><![CDATA[matroska]]></category>
		<category><![CDATA[mencoder]]></category>
		<category><![CDATA[mplayer]]></category>

		<guid isPermaLink="false">http://blog.monkeyz.eu/?p=280</guid>
		<description><![CDATA[Il est de plus en plus courant d&#8217;avoir à faire à des fichiers mkv (Matroska). L&#8217;avantage de ces fichiers, c&#8217;est qu&#8217;il peuvent être composés de plusieurs pistes videos/audios/sous titres, et donc de permettre des vidéos multilingues. Le point négatif, est &#8230;<p class="read-more"><a href="http://blog.monkeyz.eu/2011/03/06/mplayermencoder-convertir-un-fichier-mkv-matroska-en-avi-divx/">Lire la suite &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Il est de plus en plus courant d&#8217;avoir à faire à des fichiers mkv (<a href="http://fr.wikipedia.org/wiki/Matroska">Matroska</a>). L&#8217;avantage de ces fichiers, c&#8217;est qu&#8217;il peuvent être composés de plusieurs pistes videos/audios/sous titres, et donc de permettre des vidéos multilingues. Le point négatif, est que les lecteurs de divx de salon ou bien encore la freebox ne les gèrent pas complètement (certains codecs manquant). Il est donc indispensable de convertir ces videos en divx/xvid avec en plus un bon codec sonore.</p>
<p>Pour cela, je vais faire appel aux packages <a href="http://www.bunkus.org/videotools/mkvtoolnix/">mkvtoolnix</a>, <a href="http://www.mplayerhq.hu/">mplayer et mencoder</a> sous gnu/linux.</p>
<p><strong>Description des fichiers mkv</strong></p>
<p>Les mkv sont capables d&#8217;être composés de flux vidéos et sonores encodés par différents types de codecs. Une première étape est de déterminer à quels codecs l&#8217;on a à faire. La commande mkvinfo permet cela:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ mkvinfo <span style="color: #ff0000;">&quot;Morning Musume - Pepper Keibu.mkv&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-E</span> <span style="color: #ff0000;">&quot;Codec ID: (V_|A_)&quot;</span><br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp;+ Codec ID: V_MPEG4<span style="color: #000000; font-weight: bold;">/</span>ISO<span style="color: #000000; font-weight: bold;">/</span>AVC<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp;+ Codec ID: A_AAC</div></div>
<p>Ce fichier, par exemple, contient une vidéo en mpeg4 et la piste audio est de l&#8217;AAC.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ mkvinfo MyMovie.mkv <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-E</span> <span style="color: #ff0000;">&quot;(Codec ID: (V_|A_|S_)|Language)&quot;</span><br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp;+ Codec ID: V_MS<span style="color: #000000; font-weight: bold;">/</span>VFW<span style="color: #000000; font-weight: bold;">/</span>FOURCC<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp;+ Language: und<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp;+ Codec ID: A_AAC<span style="color: #000000; font-weight: bold;">/</span>MPEG2<span style="color: #000000; font-weight: bold;">/</span>LC<span style="color: #000000; font-weight: bold;">/</span>SBR<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp;+ Language: jpn<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp;+ Codec ID: A_AAC<span style="color: #000000; font-weight: bold;">/</span>MPEG2<span style="color: #000000; font-weight: bold;">/</span>LC<span style="color: #000000; font-weight: bold;">/</span>SBR<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp;+ Language: eng<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp;+ Codec ID: S_TEXT<span style="color: #000000; font-weight: bold;">/</span>ASS<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp;+ Language: eng</div></div>
<p>Ce fichier ci, par contre, contient une piste vidéo (le codec est préfixé par V_), deux pistes audios (une japonaise et une anglais), et une piste de sous titres anglaise. La liste complète des codecs supportés par Matroska est disponible sur cette page.</p>
<p><strong>Lecture d&#8217;un mkv avec mplayer</strong></p>
<p>Il est facilement possible de lire avec mplayer un tel fichier, en utilisant les bonnes options pour avoir la bonne piste audio/vidéo/sous-titres.</p>
<p>Par exemple, si l&#8217;on reprend le fichier précédent et que l&#8217;on veuille lire la version originale japonaise sous titrée anglais:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">mplayer</span> <span style="color: #660033;">-alang</span> jpn <span style="color: #660033;">-slang</span> <span style="color: #000000;">0</span> MyMovie.mkv</div></div>
<p>(ou encore: &laquo;&nbsp;mplayer -vid 0 -aid 0 -sid 0 MyMovie.mkv&nbsp;&raquo; pour sélectionner manuellement les pistes.)</p>
<p>mplayer donne de toutes façons plus d&#8217;informations au démarrage de la lecture sur les pistes:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Playing MyMovie.mkv.<br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span>mkv<span style="color: #7a0874; font-weight: bold;">&#93;</span> Track ID <span style="color: #000000;">1</span>: video <span style="color: #7a0874; font-weight: bold;">&#40;</span>V_MS<span style="color: #000000; font-weight: bold;">/</span>VFW<span style="color: #000000; font-weight: bold;">/</span>FOURCC<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #ff0000;">&quot;MyMovie&quot;</span>, <span style="color: #660033;">-vid</span> <span style="color: #000000;">0</span><br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span>mkv<span style="color: #7a0874; font-weight: bold;">&#93;</span> Track ID <span style="color: #000000;">2</span>: audio <span style="color: #7a0874; font-weight: bold;">&#40;</span>A_AAC<span style="color: #000000; font-weight: bold;">/</span>MPEG2<span style="color: #000000; font-weight: bold;">/</span>LC<span style="color: #000000; font-weight: bold;">/</span>SBR<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #ff0000;">&quot;Dolby 5.1 Japanese&quot;</span>, <span style="color: #660033;">-aid</span> <span style="color: #000000;">0</span>, <span style="color: #660033;">-alang</span> jpn<br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span>mkv<span style="color: #7a0874; font-weight: bold;">&#93;</span> Track ID <span style="color: #000000;">3</span>: audio <span style="color: #7a0874; font-weight: bold;">&#40;</span>A_AAC<span style="color: #000000; font-weight: bold;">/</span>MPEG2<span style="color: #000000; font-weight: bold;">/</span>LC<span style="color: #000000; font-weight: bold;">/</span>SBR<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #ff0000;">&quot;Dolby 5.1 English&quot;</span>, <span style="color: #660033;">-aid</span> <span style="color: #000000;">1</span>, <span style="color: #660033;">-alang</span> eng<br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span>mkv<span style="color: #7a0874; font-weight: bold;">&#93;</span> Track ID <span style="color: #000000;">4</span>: subtitles <span style="color: #7a0874; font-weight: bold;">&#40;</span>S_TEXT<span style="color: #000000; font-weight: bold;">/</span>ASS<span style="color: #7a0874; font-weight: bold;">&#41;</span>, <span style="color: #660033;">-sid</span> <span style="color: #000000;">0</span>, <span style="color: #660033;">-slang</span> eng<br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span>mkv<span style="color: #7a0874; font-weight: bold;">&#93;</span> Will play video track <span style="color: #000000;">1</span>.</div></div>
<p><strong>Conversion d&#8217;un fichier mkv en fichier avi</strong></p>
<p>Quand on a de la chance, le fichier mkv contient un flux vidéo xvid. Dans ce cas là, on peut facilement faire un fichier AVI en utilisant le flux vidéo existant. Pour la piste audio, on opte pour une simple conversion en PCM (passe partout).</p>
<p>La commande est:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mencoder nom_du_fichier.mkv <span style="color: #660033;">-ovc</span> copy <span style="color: #660033;">-oac</span> pcm <span style="color: #660033;">-o</span> nom_du_fichier.avi</div></div>
<p>Le paramètre -ovc donne le codec avec lequel on va encoder le flux video. Ici, `copy&#8217; signifie qu&#8217;on ne réencode pas, on copie juste le flux. Le paramètre -oac permet de donner le codec audio utilisé. Ici, pcm.</p>
<p>Quand on n&#8217;a pas de chance, il faut réencoder le flux vidéo en xvid et le flux sonore en mp3. Et en prime, on veut vouloir sélectionner la piste audio (jpn), et inclure les sous titres.</p>
<p>Alons-y:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mencoder <span style="color: #660033;">-vid</span> <span style="color: #000000;">0</span> <span style="color: #660033;">-alang</span> jpn <span style="color: #660033;">-slang</span> eng \<br />
&nbsp; &nbsp; <span style="color: #660033;">-oac</span> mp3lame <span style="color: #660033;">-lameopts</span> <span style="color: #007800;">cbr</span>=<span style="color: #000000;">128</span> \<br />
&nbsp; &nbsp; <span style="color: #660033;">-ovc</span> xvid <span style="color: #660033;">-xvidencopts</span> <span style="color: #007800;">bitrate</span>=<span style="color: #000000;">900</span> \<br />
&nbsp; &nbsp; nom_du_fichier.mkv <span style="color: #660033;">-o</span> nom_du_fichier_final.avi</div></div>
<p>Et voilà !<br />
On jouera avec les options d&#8217;encodage selon nos besoins (man mencoder est votre ami à partir de maintenant) pour avoir des fichiers plus petits ou une meilleure qualité.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.monkeyz.eu/2011/03/06/mplayermencoder-convertir-un-fichier-mkv-matroska-en-avi-divx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 10.715 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-02-07 12:06:45 --><!-- Compression = gzip -->

