<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Fondation Erwin Mayer &#187; Programmation</title>
	<atom:link href="http://erwinmayer.com/category/informatique/programmation/feed/" rel="self" type="application/rss+xml" />
	<link>http://erwinmayer.com</link>
	<description>Much Ado About Many Things</description>
	<lastBuildDate>Mon, 23 Jan 2012 12:44:20 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Say hello to MySQL</title>
		<link>http://erwinmayer.com/2011/09/07/say-hello-to-mysql/</link>
		<comments>http://erwinmayer.com/2011/09/07/say-hello-to-mysql/#comments</comments>
		<pubDate>Wed, 07 Sep 2011 13:33:40 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Education]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Philosophie]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Société]]></category>
		<category><![CDATA[Hello world]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[Social behaviour]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=528</guid>
		<description><![CDATA[Why does software so often fail to understand basic social conventions?]]></description>
			<content:encoded><![CDATA[<p>Why does software so often fail to understand basic social conventions?</p>
<p><center><a href="http://erwinmayer.com/wp-content/uploads/2011/09/Hello-MySQL.png"><img src="http://erwinmayer.com/wp-content/uploads/2011/09/Hello-MySQL-300x144.png" alt="MySQL - Hello" title="MySQL - Hello" width="300" height="144" class="aligncenter size-medium wp-image-529" /></a></center></p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2011/09/07/say-hello-to-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A tip to improve the performance of your Bloomberg API application</title>
		<link>http://erwinmayer.com/2011/05/25/a-tip-to-improve-the-performance-of-your-bloomberg-api-application/</link>
		<comments>http://erwinmayer.com/2011/05/25/a-tip-to-improve-the-performance-of-your-bloomberg-api-application/#comments</comments>
		<pubDate>Wed, 25 May 2011 16:04:55 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Finance]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Bloomberg]]></category>
		<category><![CDATA[Bloomberg API]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=441</guid>
		<description><![CDATA[If you make a request for data which results in a lot of events generated by Bloomberg API (such as long historical intraday data request, or possibly real time subscriptions), do not use the pattern specified in the API documentation, as it may end up making your application very slow to retrieve all events. Basically, [...]]]></description>
			<content:encoded><![CDATA[<p>If you make a request for data which results in a lot of events generated by Bloomberg API (such as long historical intraday data request, or possibly real time subscriptions), do not use the pattern specified in the API documentation, as it may end up making your application very slow to retrieve all events. Basically, do not call NextEvent() on a Session object, use a dedicated EventQueue instead.</p>
<p>Instead of doing this:</p>
<pre class="brush: csharp; title: ; notranslate">var cID = new CorrelationID(1);
session.SendRequest(request, cID);
do {
   Event eventObj = session.NextEvent();
   ...
}
</pre>
<p>Do this:</p>
<pre class="brush: csharp; title: ; notranslate">var cID = new CorrelationID(1);
var eventQueue = new EventQueue();
session.SendRequest(request, eventQueue, cID);
do {
   Event eventObj = eventQueue.NextEvent();
   ...
}
</pre>
<p>This simple change may yield performance improvements by an order of magnitude (or not, as the API is known to not be particularly deterministic&#8230;).</p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2011/05/25/a-tip-to-improve-the-performance-of-your-bloomberg-api-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recursive algorithm to generate all combinations of elements in arrays</title>
		<link>http://erwinmayer.com/2010/12/14/recursive-algorithm-to-generate-all-combinations-of-elements-in-arrays/</link>
		<comments>http://erwinmayer.com/2010/12/14/recursive-algorithm-to-generate-all-combinations-of-elements-in-arrays/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 04:11:03 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Algorithmes]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[C#.NET]]></category>
		<category><![CDATA[combinations of arrays]]></category>
		<category><![CDATA[VB.NET]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=421</guid>
		<description><![CDATA[If you have a list of lists of objects implementing IEnumerable (such as Arrays or Lists), it may occasionally be useful to flatten them to generate all possible combinations. Here is my quick solution in VB and C#.NET (you may of course use the underlying pseudocode to translate it into other languages), with an overload [...]]]></description>
			<content:encoded><![CDATA[<p>If you have a list of lists of objects implementing IEnumerable (such as Arrays or Lists), it may occasionally be useful to flatten them to generate all possible combinations. Here is my quick solution in VB and C#.NET (you may of course use the underlying pseudocode to translate it into other languages), with an overload to facilitate the function call, and an example:</p>
<p>Code in VB.NET:</p>
<pre class="brush: vb; title: ; notranslate">Public Shared Function GetCombinationsFromIEnumerables(ByRef chain() As Object, ByRef IEnumerables As IEnumerable(Of IEnumerable(Of Object))) As List(Of Object())
    Dim Combinations As New List(Of Object())
    If IEnumerables.Any Then
        For Each v In IEnumerables.First
            Combinations.AddRange(GetCombinationsFromIEnumerables(chain.Concat(New Object() {v}).ToArray, IEnumerables.Skip(1)).ToArray)
        Next
    Else
        Combinations.Add(chain)
    End If
    Return Combinations
End Function

Public Shared Function GetCombinationsFromIEnumerables(ByVal ParamArray IEnumerables() As IEnumerable(Of Object)) As List(Of Object())
    Return GetCombinationsFromIEnumerables(chain:=New Object() {}, IEnumerables:=IEnumerables.AsEnumerable)
End Function</pre>
<p>Code in C#.NET:</p>
<pre class="brush: csharp; title: ; notranslate">public static List&lt;object[]&gt; GetCombinationsFromIEnumerables(ref object[] chain, ref IEnumerable&lt;IEnumerable&lt;object&gt;&gt; IEnumerables)
{
List&lt;object[]&gt; Combinations = new List&lt;object[]&gt;();
if (IEnumerables.Any) {
    foreach ( v in IEnumerables.First) {
        Combinations.AddRange(GetCombinationsFromIEnumerables(chain.Concat(new object[] { v }).ToArray, IEnumerables.Skip(1)).ToArray);
    }
} else {
    Combinations.Add(chain);
}
return Combinations;
}

public static List&lt;object[]&gt; GetCombinationsFromIEnumerables(params IEnumerable&lt;object&gt;[] IEnumerables)
{
return GetCombinationsFromIEnumerables(chain = new object[], IEnumerables = IEnumerables.AsEnumerable);
}</pre>
<p>Usage is simple:</p>
<pre class="brush: vb; title: ; notranslate">Dim list1 = New String() {&quot;hello&quot;, &quot;bonjour&quot;, &quot;hallo&quot;, &quot;hola&quot;}
Dim list2 = New String() {&quot;Erwin&quot;, &quot;Larry&quot;, &quot;Bill&quot;}
Dim list3 = New String() {&quot;!&quot;, &quot;..&quot;}
Dim result = MyLib.GetCombinationsFromIEnumerables(list1, list2, list3)
For Each r In result
    Debug.Print(String.Join(&quot; &quot;c, r))
Next</pre>
<p>or in C#:</p>
<pre class="brush: csharp; title: ; notranslate">object list1 = new string[] {&quot;hello&quot;,&quot;bonjour&quot;,&quot;hallo&quot;,&quot;hola&quot;};
object list2 = new string[] {&quot;Erwin&quot;, &quot;Larry&quot;, &quot;Bill&quot;};
object list3 = new string[] {&quot;!&quot;,&quot;..&quot;};
object result = MyLib.GetCombinationsFromIEnumerables(list1, list2, list3);
foreach (r in result) {
Debug.Print(string.Join(' ', r));
}</pre>
<p>As with any recursive function, memory usage can be exponential so make sure you know how much data is going to be processed.</p>
<p>To parallelize this function, we would have to embed the content of the for each loop into a lambda function using: </p>
<pre class="brush: vb; title: ; notranslate">IEnumerables.First.AsParallel().AsOrdered().ForEach</pre>
<p>if order is important, otherwise simply:</p>
<pre class="brush: vb; title: ; notranslate">IEnumerables.First.AsParallel().ForAll</pre>
<p>However, unless there is a fair amount of processing involved (which apparently is not the case here as we are just iterating over elements), it is not worth parallelizing.</p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2010/12/14/recursive-algorithm-to-generate-all-combinations-of-elements-in-arrays/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to replace Drupal core&#8217;s tracker module using views</title>
		<link>http://erwinmayer.com/2010/02/21/how-to-replace-drupal-cores-tracker-module-using-views/</link>
		<comments>http://erwinmayer.com/2010/02/21/how-to-replace-drupal-cores-tracker-module-using-views/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 04:12:19 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Tracker]]></category>
		<category><![CDATA[Views]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=306</guid>
		<description><![CDATA[This can be pretty handy, especially if you would like to customize it a bit more and add other tabs. Here is a simple step-by-step tutorial: Disable Drupal&#8217;s original core tracker module. Install views. Go to Site Building &#62; Views and enable the tracker view. In the tracker view, go to the Page item, and rename it for [...]]]></description>
			<content:encoded><![CDATA[<p>This can be pretty handy, especially if you would like to customize it a bit more and add other tabs. Here is a simple step-by-step tutorial:<br />
<a title="An Icelandic Horse in the Wild" href="http://flickr.com/photos/95572727@N00/394713395" target="_blank"><img class="alignright" src="http://farm1.static.flickr.com/126/394713395_7851d0c366_m.jpg" alt="" width="240" height="169" /></a></p>
<ol>
<li>Disable Drupal&#8217;s original core tracker module.</li>
<li>Install <a href="http://drupal.org/project/views">views</a>.</li>
<li>Go to Site Building &gt; Views and enable the <em>tracker</em> view.</li>
<li>In the tracker view, go to the <em>Page </em>item, and rename it for example as &laquo;&nbsp;Recent posts&nbsp;&raquo; in <em>Basic settings &gt; Name </em>and <em>Basic settings &gt; Title</em>.  Make sure you click on override before saving, so that you keep the original configuration in Defaults.</li>
<li>In the <em>Page settings </em>fieldset, set <em>Path</em> to tracker/all and the type to <em>Default menu tab</em>. Set <em>Title</em> to Recent posts and <em>Weight</em> to -10. Click on <em>update</em> and when asked for the <em>Parent menu item</em>, select <em>Normal menu item</em>, and once again type Recent posts as <em>Title</em>. Click on <em>update</em>. We are done with this page type that will display the latest nodes modifications by all users. You can now enjoy the power of views and tweak the display to precisely show what you have in mind.</li>
<li>In the left drop-down list, select <em>Page </em>and click<em> Add display</em>. Rename it for example as &laquo;&nbsp;My recent posts&nbsp;&raquo; in Basic settings &gt; Name and Basic settings &gt; Title.  Make sure you click on override before saving, so that you keep a version of the original values.</li>
<li>In the Page settings fieldset, set Path to tracker/my and the type to Menu tab. Set Title to My recent posts and Weight to 1. Click on update.</li>
<li>In the <em>Arguments </em>fieldset, click on <em>Node: User posted or commented</em> (if it doesn&#8217;t exist, add it), and as the <em>Action to take if argument is not present</em>, select P<em>rovide default argument</em> &gt; <em>User ID from logged in user</em>.</li>
<li>That&#8217;s it! The link to your new tracker view is mysite.com/tracker; two tabs will be displayed just like in the original core module. You may for example create a menu item that links to this page.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2010/02/21/how-to-replace-drupal-cores-tracker-module-using-views/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cloning objects with events in Visual Basic .NET</title>
		<link>http://erwinmayer.com/2009/10/18/cloning-object-with-events-in-visual-basic-net/</link>
		<comments>http://erwinmayer.com/2009/10/18/cloning-object-with-events-in-visual-basic-net/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 00:50:35 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Class]]></category>
		<category><![CDATA[Clone]]></category>
		<category><![CDATA[Cloning]]></category>
		<category><![CDATA[Deep copy]]></category>
		<category><![CDATA[Object copy]]></category>
		<category><![CDATA[Object-oriented programming]]></category>
		<category><![CDATA[Persistence]]></category>
		<category><![CDATA[Reflection]]></category>
		<category><![CDATA[Serialization]]></category>
		<category><![CDATA[Shallow copy]]></category>
		<category><![CDATA[Visual Basic.NET]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=289</guid>
		<description><![CDATA[The easiest way to clone an object (deep copy) in .NET is to use the serialization functions available: Though the performance is not very good, for occasional operations it will do the job perfectly. However, I was confronted to the following problem: what if there are events inside the class, to which other objects have [...]]]></description>
			<content:encoded><![CDATA[<p>The easiest way to clone an object (deep copy) in .NET is to use the serialization functions available:</p>
<pre class="brush: vb; title: ; notranslate">
    Public Shared Function CloneObject(ByVal obj As Object) As Object
        If Not obj Is Nothing Then
            Dim bf = New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
            Dim fs = New System.IO.MemoryStream()
            bf.Serialize(fs, obj)
            fs.Seek(0, System.IO.SeekOrigin.Begin)
            Dim copy = CType(bf.Deserialize(fs), Object)
            fs.Close()
            Return copy
        Else
            Return Nothing
        End If
    End Function
</pre>
<p>Though the performance is not very good, for occasional operations it will do the job perfectly. However, I was confronted to the following problem: what if there are events inside the class, to which other objects have subscribed? I found <a href="http://www.codeproject.com/KB/vb/serializevbclasses.aspx">several methods</a> (and functions <img src='http://erwinmayer.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ) on various places over the Internet; they basically were: </p>
<ul>
<li>Implement ISerializable yourself (meaning you have to update it each time you modify the class);</li>
<li>Disconnect from events (retrieved using Reflection), serialize the object, and then reconnect the events (I could not make this working properly);</li>
<li>Implement a serialization surrogate;</li>
<li>Implement your events in a separate class that is not serialized;</li>
<li>Implement your events in a C# base class.</li>
</ul>
<p>Plenty of potential solutions, but none of them was good enough for me. So I played around with Reflection and found something that nobody else might have done so far. For a cloning interface that does just a shallow copy, like what MemberwiseClone does, but without event, I wrote this:</p>
<pre class="brush: vb; title: ; notranslate">
    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim cl = New MyClassName(Me)
        'Here we don't capture events, only normal fields, including non public ones (private, protected...)
        Dim FldInfos() As Reflection.FieldInfo = Me.GetType.GetFields(Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic)
        For Each FldInfo As Reflection.FieldInfo In FldInfos
            FldInfo.SetValue(cl, FldInfo.GetValue(Me)) 'For serialization purpose we just need not to have events, so no need to perform a deep copy of the fields.
        Next
        Return cl
    End Function
</pre>
<p>Now if one of your class member is an object with events (or if you want to perform a deep copy), you should call its clone method (to be implemented the same way) when performing the FldInfo.SetValue, like this:</p>
<pre class="brush: vb; title: ; notranslate">
        For Each FldInfo As Reflection.FieldInfo In FldInfos
            If FldInfo.Name &lt;&gt; &quot;MyObjectWithEvents&quot; Then
                FldInfo.SetValue(cl, FldInfo.GetValue(Me)) 'It is not really necessary to clone a possible reference class member here for serialization purpose, we just need not to have events in the clone
            Else
                FldInfo.SetValue(cl, Me.MyObjectWithEvents.Clone())
            End If
        Next
</pre>
<p>If you have an object that is for example a dictionary of objects with events, you can call this:</p>
<pre class="brush: vb; title: ; notranslate">
        For Each FldInfo As Reflection.FieldInfo In FldInfos
            If FldInfo.Name &lt;&gt; &quot;MyObjectsWithEventsDictionary&quot; Then
                FldInfo.SetValue(cl, MyLib.CloneObject(FldInfo.GetValue(Me)))
            Else
                FldInfo.SetValue(cl, Me.MyObjectsWithEventsDictionary.ToDictionary(Of String, MyObjectWithEvent)(Function(entry) entry.Key, Function(entry) CType(entry.Value.Clone(), MyObjectWithEvent)))
            End If
        Next
</pre>
<p>Finally, if you intend to use the Clone interface to serialize objects, you should make sure you don&#8217;t include class members marked as NonSerialized():</p>
<pre class="brush: vb; title: ; notranslate">
        For Each FldInfo As Reflection.FieldInfo In FldInfos
            If Not FldInfo.IsNotSerialized Then
                FldInfo.SetValue(cl, FldInfo.GetValue(Me))
            End If
        Next
</pre>
<p>I hope this will give you an insight to build something more tailored to your needs. There are other optimizations I can already think of, such as implementing a recursive Clone function where you would just put your original object and a virgin instance of it as a reference, and get a perfect serializable deep copy, whatever the class members and sub class members are! This could become a universal Clone method&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2009/10/18/cloning-object-with-events-in-visual-basic-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to sort WordPress posts by modified date instead of published date?</title>
		<link>http://erwinmayer.com/2009/10/18/how-to-sort-wordpress-posts-by-modified-date-instead-of-published-date/</link>
		<comments>http://erwinmayer.com/2009/10/18/how-to-sort-wordpress-posts-by-modified-date-instead-of-published-date/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 00:05:30 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=287</guid>
		<description><![CDATA[Here is the simple solution. Simply use this: before where the Loop checks for posts: It basically adds a condition to the Loop. Enjoy!]]></description>
			<content:encoded><![CDATA[<p>Here is the simple solution. Simply use this:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php query_posts($query_string . '&amp;orderby=modified&amp;order=desc'); ?&gt;
</pre>
<p>before where <a href="http://codex.wordpress.org/The_Loop">the Loop</a> checks for posts:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php /* If there are any posts: */
if (have_posts()) ...
?&gt;
</pre>
<p>It basically adds a condition to the Loop. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2009/10/18/how-to-sort-wordpress-posts-by-modified-date-instead-of-published-date/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WPF or not WPF?</title>
		<link>http://erwinmayer.com/2009/08/21/wpf-or-not-wpf/</link>
		<comments>http://erwinmayer.com/2009/08/21/wpf-or-not-wpf/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 21:59:49 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[.NET framework]]></category>
		<category><![CDATA[good-looking applications]]></category>
		<category><![CDATA[Microsoft Windows]]></category>
		<category><![CDATA[Paradigm]]></category>
		<category><![CDATA[silverlight]]></category>
		<category><![CDATA[Technology/Internet]]></category>
		<category><![CDATA[vectorial application]]></category>
		<category><![CDATA[Windows Forms]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=251</guid>
		<description><![CDATA[I would not say it is a new paradigm, but the least we have to recognize is that Windows Presentation Foundation helps building more good-looking applications than our beloved Winforms&#8230;]]></description>
			<content:encoded><![CDATA[<p>I would not say it is a new paradigm, but the least we have to recognize is that <a href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation">Windows Presentation Foundation</a> helps building more good-looking applications than our beloved <a href="http://en.wikipedia.org/wiki/Windows_Forms">Winforms</a>&#8230;</p>
<p><center><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/MTfM5pmUrnU&#038;hl=fr&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/MTfM5pmUrnU&#038;hl=fr&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></center></p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2009/08/21/wpf-or-not-wpf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le primat du software</title>
		<link>http://erwinmayer.com/2009/03/01/le-primat-du-software/</link>
		<comments>http://erwinmayer.com/2009/03/01/le-primat-du-software/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 14:22:03 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Entrepreneuriat]]></category>
		<category><![CDATA[High tech]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Innovation]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[Bill Gates]]></category>
		<category><![CDATA[bluetooth]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Multitouch]]></category>
		<category><![CDATA[Révolution informatique]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Steve Jobs]]></category>
		<category><![CDATA[wifi]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=201</guid>
		<description><![CDATA[Walter Mossberg and Kara Swisher interview Steve Jobs and Bill Gates at &#8216;D5: All Things Digital&#8217; conference in Silicon Valley in 2007. Quotes made during the time of the photograph. Kara: &#171;&#160;What you think each has contributed to the computer and technology industry, starting with you, Steve, for Bill, and vice versa.&#160;&#187; Steve: &#171;&#160;Bill built [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Walter Mossberg and Kara Swisher interview Steve Jobs and Bill Gates at &#8216;D5: All Things Digital&#8217; conference in Silicon Valley in 2007. Quotes made during the time of the photograph.</p>
<p><strong>Kara: &laquo;&nbsp;What you think each has contributed to the computer and technology industry, starting with you, Steve, for Bill, and vice versa.&nbsp;&raquo;</strong></p>
<p>Steve: &laquo;&nbsp;Bill built the first software company in the industry and I think he built the first software company before anybody really in our industry knew what a software company was, except for these guys. And that was huge. That was really huge. And the business model that they ended up pursuing turned out to be the one that worked really well, you know, for the industry. I think the biggest thing was, Bill was really focused on software before almost anybody else had a clue that it was really the software.&nbsp;&raquo;</p>
<p><strong>Walt: &laquo;&nbsp;Bill, how about the contribution of Steve and Apple?&nbsp;&raquo;</strong></p>
<p>Bill: &laquo;&nbsp;Well, first, I want to clarify: I’m not Fake Steve Jobs. [Peals of laughter.] What Steve’s done is quite phenomenal, and if you look back to 1977, that Apple II computer, the idea that it would be a mass-market machine, you know, the bet that was made there by Apple uniquely—there were other people with products, but the idea that this could be an incredible empowering phenomenon, Apple pursued that dream. Then one of the most fun things we did was the Macintosh and that was so risky. People may not remember that Apple really bet the company. Lisa hadn’t done that well, and some people were saying that general approach wasn’t good, but the team that Steve built even within the company to pursue that, even some days it felt a little ahead of its time—I don’t know if you remember that Twiggy disk drive and…&nbsp;&raquo;</p></blockquote>
<p><center><a href="http://erwinmayer.com/wp-content/uploads/2009/03/steve-jobs-and-bill-gates-at-d5-all-things-digital.png"><img src="http://erwinmayer.com/wp-content/uploads/2009/03/steve-jobs-and-bill-gates-at-d5-all-things-digital-300x214.png" alt="Bill Gates and Steve Jobs at D5: all things digital" title="Bill Gates and Steve Jobs at D5: all things digital" /></a></center></p>
<p>Aujourd&#8217;hui encore, le software n&#8217;a pas perdu de sa superbe et de son importance. Plusieurs exemples sont là pour nous le rappeler.</p>
<p><a href="http://en.wikipedia.org/wiki/Synaptics">Synaptics</a> est le principal équipementier en pavés tactiles (touchpads) pour ordinateurs portables. Regardez dans la liste des drivers de votre machine, il y a de bonnes chances pour que ce nom apparaisse quelque part.<br />
En septembre dernier, ils ont sorti <a href="http://www.synaptics.com/solutions/technology/gestures">en grande pompe</a> plusieurs nouvelles <em>gestures</em> rappelant celles utilisables sur des écrans multitouch. On aurait pu saluer l&#8217;innovation et s&#8217;en arrêter là. Oui mais voilà, ces fonctionnalités auraient pu être implémentées depuis plus de 5 ans ! Le hardware, et même le firmware peuvent depuis bien longtemps différencier les doigts, capter leurs coordonnées absolues (comme une tablette graphique), et ce avec une résolution d&#8217;environ 640&#215;480 ! Pourtant, seuls <a href="http://www.synaptics.com/support/utilities">trois misérables logiciels de démonstration</a> étaient jusqu&#8217;alors disponibles sur le site de Synaptics. Quant au <a href="http://www.synaptics.com/sites/default/files/SynCOMAPIv1_0.zip">SDK</a>, il n&#8217;a pas été mis à jour depuis 2004. Si aujourd&#8217;hui le nouveau driver offre quelques <em>gestures</em> supplémentaires (et encore pas disponibles sur tous les firmware malgré la compatibilité matérielle), Il faut donc toujours passer par la pseudo API en C++ pour accéder à la matrice générée par le touchpad et créer un gestionnaire de fonctionnalités supplémentaires.</p>
<p>Théorie du complot ou non sur les raisons de ce bridage, on peut surtout retenir que le fabricant du hardware ne verse pas beaucoup dans le software, et c&#8217;est donc une inefficience qu&#8217;il faut combler ! On peut imaginer bon nombre d&#8217;applications qui pourraient profiter à plusieurs centaines de millions d&#8217;utilisateurs instantanément.</p>
<p>On ne se rend pas non plus compte à quel point les connectiques comme le bluetooth ou le Wifi ne sont utilisées que partiellement par le software qui les accompagne. <a href="http://www.spectrum.ieee.org/aug08/6463">Une start-up a d&#8217;ailleurs développé des drivers Wifi</a> voués à faire au moins aussi bien que le Bluetooth en termes de débit de données et consommation électrique pour des applications identiques (casque, clavier&#8230;). Voilà qui risque de faire un peu d&#8217;ombre au consortium Bluetooth.<br />
Je cherchais moi-même à faire quelque chose a priori très simple : lire simultanément de la musique sur mon ordinateur et celui de mon frère, lorsqu&#8217;on est physiquement peu éloigné. Les solutions trouvées ont été les suivantes :<br />
Développer un script AutoIT qui synchronise la lecture des morceaux via le réseau (avec une parfaite synchronisation d&#8217;horloge),<br />
Mettre en place un serveur de streaming temps réel (contrairement à Youtube ou à toutes les webradios, il s&#8217;agit de pouvoir écouter avec seulement quelques millisecondes d&#8217;écart le son qui est joué sur le serveur, il n&#8217;est donc pas possible d&#8217;avoir extensivement recours à la mémoire tampon),<br />
Utiliser un bon vieux câble audio reliant la prise casque d&#8217;un ordi à la prise <em>line in</em> de l&#8217;autre.</p>
<p>Chaque solution présente des inconvénients : la première suppose que les bibliothèques des deux ordis soient identiques ou très proches, la deuxième n&#8217;offre pas une qualité d&#8217;écoute suffisamment stable (distortions comme en VoIP), et la troisième vous fait réaliser qu&#8217;il n&#8217;est même pas possible sur un ordi portable de choisir de ne pas désactiver les hauts-parleurs lorsque quelque chose est branché sur la prise line out (seul mon ordinateur, un Asus F3JA, et la version courante de mon driver son, présente un dysfonctionnement qui permet d&#8217;avoir les 2 simultanément au sortir d&#8217;une mise en veille <img src='http://erwinmayer.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> , cela suppose donc d&#8217;utiliser un jack et des hauts parleurs externes au moins sur l&#8217;ordinateur émetteur.</p>
<p>Ne devrait-on pas pouvoir envoyer de l&#8217;analogique ou quasi analogique (pour éviter toute décompression complexe ou gestion des pertes) avec un protocole approprié sur un câble RJ45 ? Ce câble n&#8217;a pas moins de fonctionnalité qu&#8217;un câble audio classique. Mais soit, plutôt que d&#8217;inventer un nouveau protocole <em>from scratch</em>, pourquoi ne peut-on pas tout simplement activer le profil standardisé &laquo;&nbsp;Headset&nbsp;&raquo; ou &laquo;&nbsp;Generic Audio Video Distribution Profile&nbsp;&raquo; sur le PC de destination du signal ? Aujourd&#8217;hui, on ne peut pas par défaut utiliser un PC comme extension sonore d&#8217;un autre PC, sans raison valable vu que tout le hardware nécessaire est pourtant là. En allant plus loin, pourquoi est-il impossible d&#8217;utiliser les <a href="http://en.wikipedia.org/wiki/Bluetooth_profil">profils bluetooth standards </a> sur des réseaux Ethernet Wifi ou RJ45 ?</p>
<p>Si le hardware a atteint une certaine maturité, on voit donc que le software en est encore à ses balbutiements en terme de mise en valeur des périphériques sous-jacents. Espérons que les interfaces utilisateurs à venir basées sur le multitouch et les <a href="http://www.3dvsystems.com/">caméras 3D</a> s&#8217;accompagneront également d&#8217;une révolution en termes de software. On peut bien sûr compter sur les fabricants de hardware, mais je ne saurais que trop nous conseiller à nous tous, utilisateurs et développeurs, d&#8217;être à l&#8217;origine de cette refondation du rapport de l&#8217;homme à la machine. C&#8217;est ni plus ni moins ce qu&#8217;ont su faire en leur temps, dans une perspective business appropriée, Apple et Microsoft.</p>
<p>Du software, toujours du software !</p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2009/03/01/le-primat-du-software/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ASIN to EAN converter</title>
		<link>http://erwinmayer.com/2008/11/28/asin-to-ean-converter/</link>
		<comments>http://erwinmayer.com/2008/11/28/asin-to-ean-converter/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 00:06:47 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[e-business]]></category>
		<category><![CDATA[High tech]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Amazon web services]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[ASIN]]></category>
		<category><![CDATA[ASIN to EAN]]></category>
		<category><![CDATA[ASIN2EAN]]></category>
		<category><![CDATA[converter]]></category>
		<category><![CDATA[EAN]]></category>
		<category><![CDATA[Linkova]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/2008/03/31/asin-to-ean-converter/</guid>
		<description><![CDATA[Since I was needing such a product codes converter and I couldn&#8217;t find one on the web, I have decided to do it by myself&#8230; It&#8217;s always a challenge to learn a new API (here I used Amazon Web Services). But when it works fine, you are really API (thanks Youcef for the pun)! If [...]]]></description>
			<content:encoded><![CDATA[<p>Since I was needing such a product codes converter and I couldn&#8217;t find one on the web, I have decided to do it by myself&#8230; It&#8217;s always a challenge to learn a new API (here I used Amazon Web Services). But when it works fine, you are really API (thanks Youcef for the pun)!</p>
<p>If this tool was helpful for you, don&#8217;t hesitate to let me know by posting a comment. If you think you were lucky to find it, don&#8217;t forget to <a target="_blank" href="http://erwinmayer.com/kamashanti">thank Good</a>.</p>
<p>Please feel free to report any bug you might encounter, or suggest improvements. The source code is now available <a href="http://erwinmayer.com/2008/05/05/release-of-source-code-for-my-asin-to-ean-and-ean-to-asin-converter/">here</a>.</p>
<p>You can input several codes by separating them with &laquo;&nbsp;;&nbsp;&raquo; (semicolumn). The output will be one column with the original code and another with the converted code.</p>
<p><center><iframe height="375" width="400" border="1px" src="http://erwinmayer.com/labs/asin2ean/index.php" style="border-width: 1px; border-color: #222"></iframe></center></p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2008/11/28/asin-to-ean-converter/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Do you really know Tetris and the like?</title>
		<link>http://erwinmayer.com/2008/11/08/182/</link>
		<comments>http://erwinmayer.com/2008/11/08/182/#comments</comments>
		<pubDate>Sat, 08 Nov 2008 07:40:21 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Geek]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Insolite]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[fenêtres]]></category>
		<category><![CDATA[Finlande]]></category>
		<category><![CDATA[fun]]></category>
		<category><![CDATA[Tetris]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/2008/11/08/182/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><center><br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/g8yFFDOQJc4&#038;hl=fr&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/g8yFFDOQJc4&#038;hl=fr&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2008/11/08/182/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>De l&#8217;applicatif pour le multitouch, vite !</title>
		<link>http://erwinmayer.com/2008/11/06/180/</link>
		<comments>http://erwinmayer.com/2008/11/06/180/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 18:55:34 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[High tech]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Innovation]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[capteurs]]></category>
		<category><![CDATA[infrarouge]]></category>
		<category><![CDATA[microsoft surface]]></category>
		<category><![CDATA[Multitouch]]></category>
		<category><![CDATA[photos]]></category>
		<category><![CDATA[redimensionnement]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=180</guid>
		<description><![CDATA[Pas besoin de réinventer la roue pour innover. Cependant, on peut déplorer qu&#8217;ils n&#8217;aient toujours pas plus d&#8217;imagination que le redimensionnement de photos. Si ça n&#8217;avance pas du côté de l&#8217;applicatif, je vois mal le multitouch s&#8217;imposer. Inventeurs, à nos claviers !]]></description>
			<content:encoded><![CDATA[<p>Pas besoin de réinventer la roue pour innover.</p>
<p><center><embed src="http://services.brightcove.com/services/viewer/federated_f8/980795828" bgcolor="#FFFFFF" flashVars="videoId=1883505117&#038;playerId=980795828&#038;viewerSecureGatewayURL=https://console.brightcove.com/services/amfgateway&#038;servicesURL=http://services.brightcove.com/services&#038;cdnURL=http://admin.brightcove.com&#038;domain=embed&#038;autoStart=false&#038;" base="http://admin.brightcove.com" name="flashObj" width="486" height="412" seamlesstabbing="false" type="application/x-shockwave-flash" swLiveConnect="true" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></embed></center></p>
<p>Cependant, on peut déplorer qu&#8217;ils n&#8217;aient toujours pas plus d&#8217;imagination que le redimensionnement de photos. Si ça n&#8217;avance pas du côté de l&#8217;applicatif, je vois mal le multitouch s&#8217;imposer. Inventeurs, à nos claviers !</p>
<p><center><embed src="http://services.brightcove.com/services/viewer/federated_f8/980795828" bgcolor="#FFFFFF" flashVars="videoId=1886150713&#038;playerId=980795828&#038;viewerSecureGatewayURL=https://console.brightcove.com/services/amfgateway&#038;servicesURL=http://services.brightcove.com/services&#038;cdnURL=http://admin.brightcove.com&#038;domain=embed&#038;autoStart=false&#038;" base="http://admin.brightcove.com" name="flashObj" width="486" height="412" seamlesstabbing="false" type="application/x-shockwave-flash" swLiveConnect="true" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></embed></center></p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2008/11/06/180/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Créer une FAQ facile à mettre à jour en Javascript</title>
		<link>http://erwinmayer.com/2008/10/11/creer-une-faq-facile-a-mettre-a-jour-en-javascript/</link>
		<comments>http://erwinmayer.com/2008/10/11/creer-une-faq-facile-a-mettre-a-jour-en-javascript/#comments</comments>
		<pubDate>Sat, 11 Oct 2008 21:04:01 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[FAQ]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[tutoriel]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=172</guid>
		<description><![CDATA[Souhaitant implémenter une FAQ basique mais fonctionnelle sur un site, et n&#8217;ayant pas envie de réinventer la roue, j&#8217;ai cherché rapidement des codes tout faits, sans grand succès. Ce tutoriel (qui ne marchait pas chez moi) m&#8217;a donc inspiré et j&#8217;ai tout repris à zéro. Le résultat est relativement light (pas de librairie Ajax externe), malgré [...]]]></description>
			<content:encoded><![CDATA[<p>Souhaitant implémenter une FAQ basique mais fonctionnelle sur un site, et n&#8217;ayant pas envie de réinventer la roue, j&#8217;ai cherché rapidement des codes tout faits, sans grand succès. <a href="http://www.lepotlatch.org/index.php/2008/07/15/135-creez-une-faq-accessible-et-facile-a-mettre-a-jour-avec-jquery?cos=1&amp;cos=1">Ce tutoriel</a> (qui ne marchait pas chez moi) m&#8217;a donc inspiré et j&#8217;ai tout repris à zéro. Le résultat est relativement light (pas de librairie Ajax externe), malgré le workaround que j&#8217;ai dû trouver pour pallier la méthode setAttribute(&laquo;&nbsp;onclick&nbsp;&raquo;,&nbsp;&raquo;&#8230;&nbsp;&raquo;) qui ne marche pas sur IE7.</p>
<p>Le principe est simple, à chaque balise h4 correspond un seul et unique paragraphe p (pour sauter des lignes, utiliser &lt;br /&gt;). Il suffit d&#8217;ajouter des couples (h4,p) à la balise &laquo;&nbsp;faqs&nbsp;&raquo; pour que le javascript s&#8217;occupe du côté dynamique. L&#8217;intérêt est de ne pas avoir à recourir à une base de données pour ajouter des entrées (peu pratique lorsque les personnes chargées de la maintenance ne savent pas en gérer une), ni à surcharger chaque entrée de la faq de balises spécifiques. Ajoutons enfin que c&#8217;est navigateurement correct puisque ça permet un affichage même si javascript est désactivé.</p>
<p>Une application du code suivant est visible <a href="/labs/custom_faq/custom_faq.html">ici</a> ou <a href="http://www.suiclean.com/store/faq">là</a>.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;de&quot; lang=&quot;de&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;/head&gt;
&lt;body&gt;&lt;div style=&quot;margin: 5px 15px 0px 5px; text-align: justify;&quot; id=&quot;faqs&quot;&gt;
&lt;h1 align=&quot;center&quot;&gt;Questions fréquemment posées (FAQ)&lt;/h1&gt;

&lt;h3&gt;Courage&lt;/h3&gt;
&lt;h4&gt;&amp;amp;#9658; Pourquoi ne faut-il pas avoir peur ?&lt;/h4&gt;
&lt;p&gt;La peur est l'ennemie du Bien.&lt;br /&gt;&lt;br /&gt;
Pour que le Bien vous accompagne dans votre vie, &lt;a href=&quot;http://erwinmayer.com/kamashanti&quot;&gt;faites un don&lt;/a&gt;.
&lt;/p&gt;
&lt;br /&gt;

&lt;h4&gt;&amp;amp;#9658; Comment puis-je obtenir la rédemption ?&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://erwinmayer.com/kamashanti&quot;&gt;Faites un don&lt;/a&gt;. Remercier le Bien est la source de tout salut.&lt;/p&gt;
&lt;br /&gt;

&lt;h4&gt;&amp;amp;#9658; J'ai déjà donné, mais je n'ai pas l'impression que le Bien est avec moi, que puis-je faire ?&lt;/h4&gt;
&lt;p&gt;Il ne faut pas perdre la foi ! Peut-être votre générosité n'est pas à la hauteur du Bien que vous attendez. &lt;a href=&quot;http://erwinmayer.com/kamashanti&quot;&gt;Ouvrez votre coeur&lt;/a&gt;.&lt;/p&gt;
&lt;br /&gt;

&lt;h4&gt;&amp;amp;#9658; Je ne trouve pas réponse à ma question, que faire ?&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://erwinmayer.com/kamashanti&quot;&gt;Donner !&lt;/a&gt;. Les réponses sont transcendantes lorsque l'on est allégé des fardeaux de la vie.&lt;/p&gt;

&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;

&lt;center&gt;&lt;a href=&quot;#&quot; onClick=&quot;faq_toggle_all('block')&quot;&gt;&lt;small&gt;Tout afficher&lt;/small&gt;&lt;/a&gt; | &lt;a href=&quot;#&quot; onClick=&quot;faq_toggle_all('none')&quot;&gt;&lt;small&gt;Tout masquer&lt;/small&gt;&lt;/a&gt; &lt;/center&gt;

&lt;/body&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
function faq_toggle(pdiv) {
var action = (pdiv.style.display == &quot;block&quot;) ? &quot;none&quot; : &quot;block&quot;;
pdiv.style.display = action;
}
function faq_toggle_all(action) {
var faqs = document.getElementById('faqs');
var pfaqs = faqs.getElementsByTagName('p');
for(i=0;i&lt;pfaqs.length;i++) {
pfaqs[i].style.display=action;
}
}

var faqs = document.getElementById('faqs');
var pfaqs = faqs.getElementsByTagName('p');
var hfaqs = faqs.getElementsByTagName('h4');
for(i=0;i&lt;pfaqs.length;i++) {
//hfaqs[i].setAttribute(&quot;onclick&quot;,&quot;faq_toggle(pfaqs[&quot;+i+&quot;])&quot;); // Does not work in IE.
hfaqs[i].onclick = function(){
var faqs = document.getElementById('faqs');
var pfaqs = faqs.getElementsByTagName('p');
var hfaqs = faqs.getElementsByTagName('h4');
for(j=0;j&lt;hfaqs.length;j++) {
if(hfaqs[j] === this) {
faq_toggle(pfaqs[j]);
}
}
}
hfaqs[i].style.fontStyle=&quot;italic&quot;;
hfaqs[i].style.cursor=&quot;pointer&quot;;
hfaqs[i].style.color=&quot;#006699&quot;;
pfaqs[i].style.display=&quot;none&quot;;
}
&lt;/script&gt;
&lt;/html&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2008/10/11/creer-une-faq-facile-a-mettre-a-jour-en-javascript/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Recréer un utilisateur root absent dans Mysql</title>
		<link>http://erwinmayer.com/2008/10/02/recreer-un-utilisateur-root-absent-dans-mysql/</link>
		<comments>http://erwinmayer.com/2008/10/02/recreer-un-utilisateur-root-absent-dans-mysql/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 17:48:31 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Geek]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[commande]]></category>
		<category><![CDATA[hébergement dédié]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[virtualmin]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=169</guid>
		<description><![CDATA[Je me permets de partager la solution à un problème auquel je me suis heurté lors de la configuration d&#8217;un serveur dédié. Ce problème semble être lié à Debian (et donc Ubuntu). # mysql -u root m&#8217;affichait invariablement un message d&#8217;erreur de type ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO) En principe, [...]]]></description>
			<content:encoded><![CDATA[<p>Je me permets de partager la solution à un problème auquel je me suis heurté lors de la configuration d&#8217;un serveur dédié. Ce problème semble être lié à Debian (et donc Ubuntu).</p>
<p><code># mysql -u root </code></p>
<p>m&#8217;affichait invariablement un message d&#8217;erreur de type </p>
<p><code>ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO) </code></p>
<p>En principe, l&#8217;installation devrait créer un utilisateur root sans mot de passe, mais ça n&#8217;a pas été le cas. Pour vous en convaincre (si c&#8217;est aussi votre cas), il faut déjà trouver un moyen de se connecter à mysql. En dehors de la solution consistant à faire un skip-grant (je vous laisse le soin de trouver des informations à ce sujet), utile pour un changement de mot de passe root (à condition bien sûr que celui-ci existe), il est possible d&#8217;utiliser l&#8217;utilisateur fantôme debian-sys-maint propre à Debian dont les identifiants se trouvent dans :</p>
<p>/etc/mysql/debian.cnf </p>
<p>Avec ça, vous devriez pouvoir vous connecter via la commande suivante :</p>
<p><code># mysql -u root -pMOTDEPASSE </code></p>
<p>Attention à ne pas mettre d&#8217;espace entre le -p et le MOTDEPASSE.</p>
<p>Puis faire </p>
<p><code>> use mysql</code></p>
<p>Pour sélectionner la base principale contenant la configuration de mysql, enfin :</p>
<p><code>> select * from user</code></p>
<p>Et là surprise, seul l&#8217;utilisateur debian-sys-maint apparaît&#8230; On peut donc créer le root manquant en lançant les deux commandes suivantes :</p>
<p><code>> INSERT INTO user VALUES('localhost','root',PASSWORD('NOUVEAMOTDEPASSE'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',' ',' ',' ',' ','0','0','0','0');<br />
> FLUSH PRIVILEGES;</code></p>
<p>Si une erreur du nombre de colonne s&#8217;affiche, comptez le nombre de Y et N de l&#8217;utilisateur debian-sys-maint et mettez autant de Y dans la commande ci-dessus, le nombre de valeurs vides et de 0 reste le même en principe. Il y a d&#8217;autres méthodes pour recréer root mais celle-ci est la seule qui a fonctionné sur mon serveur.</p>
<p>Et voilà, si tout se passe bien, mysql répond </p>
<p><code>Query OK, 1 row affected (0.09 sec)</code></p>
<p>Puis </p>
<p><code>Query OK, 0 rows affected (0.03 sec)</code></p>
<p>Voilà ! Vous avez maintenant un utilisateur root en forme.</p>
<p>Au passage, j&#8217;ai cherché pendant pas mal de temps un équivalent gratuit (ou presque) au cPanel et à Plesk, et mon choix s&#8217;est porté sur <a href="http://www.virtualmin.com/">Virtualmin</a> qui a l&#8217;air très mature, avec une connexion SSL par défaut (ce qui n&#8217;est pas le cas de cPanel alors que les données qui transitent sont ô combien sensibles).</p>
<p>Il ne me reste plus qu&#8217;à trouver un serveur RDP digne de ce nom (pas un NXserver qui plante à tout bout de champ) et j&#8217;aurai mon Windows Server 2008 <img src='http://erwinmayer.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2008/10/02/recreer-un-utilisateur-root-absent-dans-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>L&#8217;avenir en Chrome selon Google</title>
		<link>http://erwinmayer.com/2008/09/02/google-chrome/</link>
		<comments>http://erwinmayer.com/2008/09/02/google-chrome/#comments</comments>
		<pubDate>Tue, 02 Sep 2008 22:45:29 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[High tech]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Innovation]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Acid2]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[avenir]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[machine virtuelle]]></category>
		<category><![CDATA[Service]]></category>
		<category><![CDATA[Web App]]></category>
		<category><![CDATA[Web OS]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=164</guid>
		<description><![CDATA[Google vient juste de révéler Google Chrome. C&#8217;est notamment au travers d&#8217;une bande dessinée, moyen pour le moins original et qui témoigne de la volonté didactique de la société, que l&#8217;on trouvera réponse à la plupart des questions que l&#8217;on est en droit de se poser. J&#8217;ai été très supris par cette annonce, j&#8217;avoue ne [...]]]></description>
			<content:encoded><![CDATA[<p>Google vient juste de révéler <a href="http://www.google.com/chrome/intl/fr/features.html">Google Chrome</a>. C&#8217;est notamment au travers d&#8217;une <a href="http://www.google.com/googlebooks/chrome/">bande dessinée</a>, moyen pour le moins original et qui témoigne de la volonté didactique de la société, que l&#8217;on trouvera réponse à la plupart des questions que l&#8217;on est en droit de se poser.</p>
<p><center><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/unJakhjF5cw&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/unJakhjF5cw&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object></center></p>
<p>J&#8217;ai été très supris par cette annonce, j&#8217;avoue ne pas m&#8217;être attendu à ce type d&#8217;innovation de la part de Google (je pensais tout d&#8217;abord qu&#8217;il s&#8217;agissait de la mise en ligne d&#8217;une charte graphique globale revue [Je pense en effet que parmi tous ces software engineers, l'embauche d'un talentueux web designer ne serait pas de trop ;-] !), bien qu&#8217;après réflexion cela me paraisse une initiative évidente qui ne représente pas moins un excellent mouvement, dont les bienfaits seront certainement conditionnés à l&#8217;adoption de ces nouvelles normes par les principaux concurrents Internet Explorer et Mozilla Firefox.</p>
<p>Une chose est sûre, l&#8217;approche <em>from scratch</em> a de puissante vertus, et je ne m&#8217;étonnerais pas de voir Chrome ravir la place à Firefox si celui-ci fait la sourde oreille, et si Chrome tient ses promesses (respect du test Acid2, fonctionnement des scripts, développement de web applications tirant profit de ce nouvel environnement de navigation&#8230;). Mais vu l&#8217;excellente capacité de Google à faire interagir ses différents services, je m&#8217;attends naturellement à ce que tous les futurs projets de Google (et aussi les &laquo;&nbsp;anciens&nbsp;&raquo;) soient étroitement optimisés pour Chrome, de sorte que l&#8217;image d&#8217;un web OS, où l&#8217;utilisateur &laquo;&nbsp;oublie le navigateur&nbsp;&raquo; prenne corps.</p>
<p><center><a href="http://www.google.com/googlebooks/chrome/images/small/24.jpg"><img src="http://www.google.com/googlebooks/chrome/images/small/24.jpg" width="400px" alt="Seamless web OS" /></a></center></p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2008/09/02/google-chrome/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google en ligne de commande</title>
		<link>http://erwinmayer.com/2008/06/09/google-en-ligne-de-commande/</link>
		<comments>http://erwinmayer.com/2008/06/09/google-en-ligne-de-commande/#comments</comments>
		<pubDate>Mon, 09 Jun 2008 15:24:42 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Geek]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Insolite]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Moteur de recherche]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[Stefan Grothkopp]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=140</guid>
		<description><![CDATA[Les API réservent parfois bien des surprises. Si le GUI du site est agréable, il ne reste plus qu&#8217;à tester aussi depuis un terminal classique pour voir si cela fonctionne (à part les images sans doute). Et il ne manque plus que quelques liens publicitaires dans les résultats de recherche. Tout bon geek qui se respecte [...]]]></description>
			<content:encoded><![CDATA[<p>Les API réservent parfois bien des surprises. Si le GUI du site est agréable, il ne reste plus qu&#8217;à tester aussi depuis un terminal classique pour voir si cela fonctionne (à part les images sans doute). Et il ne manque plus que quelques liens publicitaires dans les résultats de recherche.</p>
<blockquote><p>Tout bon <em>geek</em> qui se respecte devrait être intéressé, sinon amusé par le nouveau site <a href="http://goosh.org/" target="_blank">goosh.org,</a> mis en ligne par Stefan Grothkopp, un développeur allemand indépendant. Ce site permet en effet de taper des requêtes google en ligne de commande, comme on le ferait dans un terminal Unix ou dans une fenêtre MS-DOS, via un language de script.<br />
Ainsi pour faire une recherche sur le mot télécharger, au lieu d&#8217;utiliser le moteur de recherche Google, on peut désormais se rendre sur goosh.org et taper télécharger à l&#8217;invitation. Comme pour toutes les autres requêtes, goosh présente les quatre premiers résultats renvoyés par google.</p>
<p><strong>Aux « aficionados » de la ligne de commande</strong></p>
<p>Vous vous demandez à quoi cet outil peut-il bien servir ? Pas à grand chose sinon qu&#8217;il offre aux <em>aficionados</em> de la ligne de commande, un moyen sympathique d&#8217;accéder à Google.<br />
Il permet aussi d&#8217;accéder à l&#8217;ensemble des fonctions de Google à l&#8217;aide d&#8217;une seule fenêtre, moyennant la connaissance de quelques commandes. Si l&#8217;on tape « images roses », Goosh proposera les quatre premiers résultats renvoyés par Google Images. Si l&#8217;on tape « news Sarkozy », Goosh proposera les quatre premiers résultats renvoyés par Google Actualités sur Sarkozy et ainsi de suite. Pour avoir la liste des commandes, il suffira de taper « help » à l&#8217;invitation du prompt.<br />
A noter que la commande « wiki » suivie d&#8217;un mot clé permettra d&#8217;accéder aux résultats de Wikipédia concernant ce mot clé. Signalons aussi la présence de la commande « addengine » qui permet d&#8217;ajouter Goosh dans la liste des moteurs de la barre de recherche de Firefox.</p>
<p><strong>Le « shell Google » non officiel</strong></p>
<p>N&#8217;étant pas un produit développé par Google lui même, Goosh se présente comme le « shell Google non officiel ».<em>« Je n&#8217;ai fait qu&#8217;utiliser l&#8217;API que propose Google et je pense que je respecte leurs conditions d&#8217;utilisation mêmes si certaines sont un peu vagues. Je ne sais pas si Google est au courant mais cela ne devrait pas leur déplaire,</em> indique Stefan Grothkopp, <em>J&#8217;ai démarré ce projet au début pour des besoins personnels parce que j&#8217;aime utiliser les lignes de commande ».</em> <a href="http://www.01net.com/editorial/382145/goosh.org-met-google-en-ligne-de-commande/">01net.com</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2008/06/09/google-en-ligne-de-commande/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Release of source code for my ASIN to EAN, and EAN to ASIN converter!</title>
		<link>http://erwinmayer.com/2008/05/05/release-of-source-code-for-my-asin-to-ean-and-ean-to-asin-converter/</link>
		<comments>http://erwinmayer.com/2008/05/05/release-of-source-code-for-my-asin-to-ean-and-ean-to-asin-converter/#comments</comments>
		<pubDate>Mon, 05 May 2008 12:40:10 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[e-business]]></category>
		<category><![CDATA[Education]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[Amazon.ca]]></category>
		<category><![CDATA[Amazon.cn]]></category>
		<category><![CDATA[Amazon.co.jp]]></category>
		<category><![CDATA[Amazon.co.uk]]></category>
		<category><![CDATA[Amazon.com]]></category>
		<category><![CDATA[Amazon.de]]></category>
		<category><![CDATA[Amazon.es]]></category>
		<category><![CDATA[Amazon.fr]]></category>
		<category><![CDATA[Amazon.it]]></category>
		<category><![CDATA[ASIN to EAN]]></category>
		<category><![CDATA[ASIN2EAN]]></category>
		<category><![CDATA[Code barre]]></category>
		<category><![CDATA[code source]]></category>
		<category><![CDATA[Conversion]]></category>
		<category><![CDATA[EAN to ASIN]]></category>
		<category><![CDATA[European Article Number]]></category>
		<category><![CDATA[Linkova]]></category>
		<category><![CDATA[mass conversion]]></category>
		<category><![CDATA[Open source]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/?p=116</guid>
		<description><![CDATA[Following this post, you were many to ask me for the source code of my ASIN to EAN and EAN to ASIN converter, I have decided to make it publicly available. I only dare ask you to do the same if you improve it or add new functionalities, such as a mass conversion (which is [...]]]></description>
			<content:encoded><![CDATA[<p>Following <a href="http://erwinmayer.com/2008/03/31/asin-to-ean-converter/">this post</a>, you were many to ask me for the source code of my ASIN to EAN and EAN to ASIN converter, I have decided to make it publicly available. I only dare ask you to do the same if you improve it or add new functionalities, such as a mass conversion (which is still on my roadmap, but if you do it before I&#8217;ll be glad not having to do it).</p>
<p>There are basically 4 files that are doing the job: 1 for the processing (+1 to send the requests), 1 for the UI structure, and 1 for CSS styles.<br />
<span id="more-116"></span><br />
<strong>1. processing.php. There are two functions that make REST requests to Amazon&#8217;s servers. For this you&#8217;ll need to put your own KeyID (or subscription ID) and Secret Access Key at the beginning of this file.</strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
include(&quot;aws_signed_request.php&quot;);
/* CUSTOM VARIABLES */
define('AWS_ACCESS_KEY_ID','0KWABHXFYEKBE4692D02'); // Put your own KeyID (or Subscription ID) instead of &quot;MyKeyID&quot;. You need an Amazon developer account for that.
define('AWS_SECRET_ACCESS_KEY','YourSecretKeyHere');
/* END CUSTOM VARIABLES */

$tag_fr = &quot;fondation-21&quot;;
$tag_uk = &quot;key0c-21&quot;;
$tag_de = &quot;fondation01-21&quot;;
$tag_it = &quot;key21-21&quot;;
$tag_es = &quot;key06-21&quot;;
$tag_com = &quot;key0c-20&quot;;

extract($_POST);
$items = explode(&quot;;&quot;,$ItemId);
if (count((array) $items) &gt; 1) {
	echo &quot;&lt;em&gt;Batch request&lt;/em&gt;&lt;br /&gt;&quot;;
}
foreach ((array) $items as $key =&gt; $item) {
	if (count((array) $items) &gt; 1) echo $item . &quot;\t&quot;;
	switch($locale) {
		case 'fr':
			$assoc_tag = $tag_fr;
			break;
		case 'co.uk':
			$assoc_tag = $tag_uk;
			break;
		case 'de':
			$assoc_tag = $tag_de;
			break;
		case 'it':
			$assoc_tag = $tag_it;
			break;
		case 'com':
			$assoc_tag = $tag_com;
			break;
		case 'es':
			$assoc_tag = $tag_es;
			break;
		default:
			$assoc_tag = $tag_com;
			break;
	}
	switch ($mode) {
		case &quot;ASIN2EAN&quot;:
			ASINItemLookup($item, $locale, '', $assoc_tag);
			break;
		case &quot;EAN2ASIN&quot;:
			EANItemLookup($item, $locale, $SearchIndex, $assoc_tag);
			break;
	}
	if ($key &lt; count((array) $items)-1) {
		echo &quot;\n&lt;br /&gt;&quot;;
	}
	ob_flush();
	flush();
}

function ASINItemLookup($ItemId, $locale, $SearchIndex, $assoc_tag){
	$parsed_xml = aws_signed_request($locale, array(&quot;AssociateTag&quot;=&gt;$assoc_tag, &quot;Operation&quot;=&gt;&quot;ItemLookup&quot;, &quot;ItemId&quot;=&gt;$ItemId, &quot;IdType&quot;=&gt;&quot;ASIN&quot;, &quot;ResponseGroup&quot;=&gt;&quot;ItemAttributes&quot;), AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, $assoc_tag);
	if ($parsed_xml === False)
	{
		echo &quot;Did not work.\n&quot;;
	}
	else
	{
		if(isset($parsed_xml-&gt;Items-&gt;Request-&gt;Errors-&gt;Error-&gt;Code)) {
			echo &quot;&lt;em&gt;Warning&lt;/em&gt;&lt;br /&gt;&quot;;
			echo &quot;&lt;b&gt;Error code&lt;/b&gt;: &quot;.$parsed_xml-&gt;Items-&gt;Request-&gt;Errors-&gt;Error-&gt;Code.&quot;&lt;br /&gt;&quot;;
			echo &quot;&lt;b&gt;Description&lt;/b&gt;: &quot;.$parsed_xml-&gt;Items-&gt;Request-&gt;Errors-&gt;Error-&gt;Message;
		}
		else {
			print($parsed_xml-&gt;Items-&gt;Item-&gt;ItemAttributes-&gt;EAN);
		}
	}
}

function EANItemLookup($ItemId, $locale, $SearchIndex, $assoc_tag){
	$parsed_xml = aws_signed_request($locale, array(&quot;AssociateTag&quot;=&gt;$assoc_tag,&quot;Operation&quot;=&gt;&quot;ItemLookup&quot;,&quot;ItemId&quot;=&gt;$ItemId,&quot;IdType&quot;=&gt;&quot;EAN&quot;,&quot;ResponseGroup&quot;=&gt;&quot;ItemAttributes&quot;,&quot;SearchIndex&quot;=&gt;$SearchIndex), AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, $assoc_tag);
	if ($parsed_xml === False)
	{
		echo &quot;Did not work.\n&quot;;
	}
	else
	{
		if(isset($parsed_xml-&gt;Items-&gt;Request-&gt;Errors-&gt;Error-&gt;Code)) {
			echo &quot;&lt;em&gt;Warning&lt;/em&gt;&lt;br /&gt;&quot;;
			echo &quot;&lt;b&gt;Error code&lt;/b&gt;: &quot;.$parsed_xml-&gt;Items-&gt;Request-&gt;Errors-&gt;Error-&gt;Code.&quot;&lt;br /&gt;&quot;;
			echo &quot;&lt;b&gt;Description&lt;/b&gt;: &quot;.$parsed_xml-&gt;Items-&gt;Request-&gt;Errors-&gt;Error-&gt;Message;
		}
		else {
			print($parsed_xml-&gt;Items-&gt;Item-&gt;ASIN);
		}
	}
}

?&gt;
</pre>
<p><strong>2. Here is the content of the file aws_signed_request.php that is used to create and sign requests with the secret key, following Amazon requirements since the 15th of August 2009. The original version can also be found <a href="http://mierendo.com/software/aws_signed_query/#idc-ctools">here</a>.</strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
function aws_signed_request ( $locale, $params, $public_key, $private_key, $associate_tag ) {
    /*
    Copyright (c) 2009 Ulrich Mierendorff

    Permission is hereby granted, free of charge, to any person obtaining a
    copy of this software and associated documentation files (the &quot;Software&quot;),
    to deal in the Software without restriction, including without limitation
    the rights to use, copy, modify, merge, publish, distribute, sublicense,
    and/or sell copies of the Software, and to permit persons to whom the
    Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in
    all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
    THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
    DEALINGS IN THE SOFTWARE.
    */

    /*
    Parameters:
            $locale - the Amazon(r) locale (ca,com,co.uk,de,fr,jp)
            $params - an array of parameters, eg. array(&quot;Operation&quot;=&gt;&quot;ItemLookup&quot;,
                                        &quot;ItemId&quot;=&gt;&quot;B000X9FLKM&quot;, &quot;ResponseGroup&quot;=&gt;&quot;Small&quot;)
            $public_key - your &quot;Access Key ID&quot;
            $private_key - your &quot;Secret Access Key&quot;
            $associate_tag - your Associate Tag i.e. myamazontag-20
    */

    // Some paramters
    $method = 'GET';
    $host   = 'webservices.amazon.' . $locale;
    $uri    = '/onca/xml';

    // Additional parameters
    $params[ 'Service' ]        = 'AWSECommerceService';
    $params[ 'AWSAccessKeyId' ] = $public_key;
    // GMT timestamp
    $params[ 'Timestamp' ]      = gmdate( &quot;Y-m-d\TH:i:s\Z&quot; );
    // API version
    $params[ 'Version' ]        = '2011-08-01';
    $params[ 'AssociateTag' ]   = $associate_tag;
    $params[ 'XMLEscaping' ]    = 'Double';

    // Sort the parameters
    ksort( $params );

    // Create the canonicalized query
    $canonicalized_query = array();
    foreach ( $params as $param =&gt; $value ) {
        $param = str_replace( '%7E', '~', rawurlencode( $param ) );
        $value = str_replace( '%7E', '~', rawurlencode( $value ) );
        $canonicalized_query[] = $param . '=' . $value;
    }
    $canonicalized_query = implode( '&amp;', $canonicalized_query );

    // Create the string to sign
    $string_to_sign = $method . &quot;\n&quot; . $host . &quot;\n&quot; . $uri . &quot;\n&quot; . $canonicalized_query;

    // Calculate HMAC with SHA256 and base64-encoding
    $signature = base64_encode( hash_hmac( 'sha256', $string_to_sign, $private_key, TRUE ) );

    // Encode the signature for the request
    $signature = str_replace( '%7E', '~', rawurlencode( $signature ) );

    // Create request
    $request = 'http://' . $host . $uri . '?' . $canonicalized_query . '&amp;Signature=' . $signature;

    // Do request
	// Choose depending on availability of curl
    //$response = @file_get_contents($request);
    $response = file_get_content_curl($request);

    if ( FALSE === $response ) {
        return FALSE;
    } else {
        // Parse XML
        $xml = simplexml_load_string( $response );
        if ( FALSE === $xml )
            return FALSE; // no xml
        else
            return $xml;
    }
}

function file_get_content_curl($request)
{
	$session = curl_init($request);
	curl_setopt($session, CURLOPT_HEADER, false);
	curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
	$response = curl_exec($session);
	curl_close($session);
	return $response;
}
?&gt;
</pre>
<p><strong>2. Here is the index.php file with the UI using AJAX.</strong></p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
   &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;ASIN to EAN converter&lt;/title&gt;
&lt;link href=&quot;styles.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
var xhr_processing = null;
String.prototype.stripSpaces = function( ){
	//return this.replace( /\s/g, &quot;&quot; );
	return this.replace(/[^a-zA-Z0-9;]/g,'');
};

function createObject_xhr_processing() {
	if(window.XMLHttpRequest) // Firefox
		xhr_processing = new XMLHttpRequest();
	else if(window.ActiveXObject) // Internet Explorer
		xhr_processing = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);
	else { // XMLHttpRequest non support par le navigateur
		alert(&quot;Votre navigateur ne supporte pas les objets XMLHTTPRequest...&quot;);
	}
}
//B000PMGQTM
function convertFunction(mode) {
	xhr_processing.open(&quot;POST&quot;, &quot;processing.php&quot;, true);
	xhr_processing.setRequestHeader(&quot;Content-type&quot;, &quot;application/x-www-form-urlencoded&quot;);
	ItemId = encodeURIComponent(document.getElementById(&quot;ItemIdInput&quot;+mode).value.stripSpaces());
	locale = encodeURIComponent(document.getElementById(&quot;localeInput&quot;+mode).value);
	SearchIndex = encodeURIComponent(document.getElementById(&quot;SearchIndexInput&quot;).value);
	Datagram = &quot;ItemId=&quot;+ItemId+&quot;&amp;locale=&quot;+locale+&quot;&amp;SearchIndex=&quot;+SearchIndex+&quot;&amp;mode=&quot;+mode;
	xhr_processing.send(Datagram);
	document.getElementById(&quot;ItemIdOutput&quot;+mode).value = &quot;Please wait...&quot;
	xhr_processing.onreadystatechange = function() {
		if(xhr_processing.readyState == 4) {
			var RegExp1 = /.*Warning.*/;
			var RegExp2 = /.*Batch.*/;
			if (RegExp1.test(xhr_processing.responseText)) {
				document.getElementById(&quot;ItemIdOutput&quot;+mode).value = &quot;An error occurred.&quot;
				document.getElementById(&quot;debug&quot;+mode).innerHTML = xhr_processing.responseText;
			}
			else if (RegExp2.test(xhr_processing.responseText)) {
				document.getElementById(&quot;ItemIdOutput&quot;+mode).value = &quot;Batch request. Results below.&quot;
				document.getElementById(&quot;debug&quot;+mode).innerHTML = xhr_processing.responseText;
			}
			else {
			element = document.getElementById(&quot;ItemIdOutput&quot;+mode);
			element.value = xhr_processing.responseText;
			document.getElementById(&quot;debug&quot;+mode).innerHTML = &quot;&quot;;
			//Si DIV : element.innerHTML = xhr_processing.responseText;
			//innerHTML est compatible mais ne respecte pas les spécifications DOM
			}
		}
	}
}

function retournepressepapier() {
	return window.clipboardData.getData(&quot;Text&quot;).stripSpaces();
} 

function copiedanspressepapier(mode) {
	window.clipboardData.setData(&quot;Text&quot;,document.getElementById(&quot;ItemIdOutput&quot;+mode).value);
} 

function dispOnglet(onglet) {
	document.getElementById(onglet).style.display = &quot;block&quot;;
	if (onglet == &quot;ASIN2EAN&quot;) {
		document.getElementById(&quot;EAN2ASIN&quot;).style.display = &quot;none&quot;;
	}
	if (onglet == &quot;EAN2ASIN&quot;) {
		document.getElementById(&quot;ASIN2EAN&quot;).style.display = &quot;none&quot;;
	}
}

function changeSearchIndexes(locale) {
	document.getElementById(&quot;SearchIndexInput&quot;).options.length = 0;
	var SearchIndexes = new Array();
	switch (locale) {
		case &quot;cn&quot;:
			SearchIndexes = [&quot;All&quot;,&quot;Apparel&quot;,&quot;Appliance&quot;,&quot;Automotive&quot;,&quot;Baby&quot;,&quot;Beauty&quot;,&quot;Books&quot;,&quot;Electronics&quot;,&quot;Grocery&quot;,&quot;HealthPersonalCare&quot;,&quot;Home&quot;,&quot;HomeImprovement&quot;,&quot;Jewelry&quot;,&quot;Misc&quot;,&quot;Music&quot;,&quot;OfficeProducts&quot;,&quot;Photo&quot;,&quot;Shoes&quot;,&quot;Software&quot;,&quot;SportingGoods&quot;,&quot;Toys&quot;,&quot;Video&quot;,&quot;VideoGames&quot;,&quot;Watches&quot;];
			break;
		case &quot;fr&quot;:
			SearchIndexes = [&quot;All&quot;,&quot;Apparel&quot;,&quot;Baby&quot;,&quot;Beauty&quot;,&quot;Blended&quot;,&quot;Books&quot;,&quot;Classical&quot;,&quot;DVD&quot;,&quot;Electronics&quot;,&quot;ForeignBooks&quot;,&quot;HealthPersonalCare&quot;,&quot;Jewelry&quot;,&quot;Kitchen&quot;,&quot;Lighting&quot;,&quot;MP3Downloads&quot;,&quot;Music&quot;,&quot;MusicalInstruments&quot;,&quot;MusicTracks&quot;,&quot;OfficeProducts&quot;,&quot;Outlet&quot;,&quot;Shoes&quot;,&quot;Software&quot;,&quot;SoftwareVideoGames&quot;,&quot;VHS&quot;,&quot;Video&quot;,&quot;VideoGames&quot;,&quot;Watches&quot;];
			break;
		case &quot;de&quot;:
			SearchIndexes = [&quot;All&quot;,&quot;Apparel&quot;,&quot;Automotive&quot;,&quot;Baby&quot;,&quot;Blended&quot;,&quot;Beauty&quot;,&quot;Books&quot;,&quot;Classical&quot;,&quot;DVD&quot;,&quot;Electronics&quot;,&quot;ForeignBooks&quot;,&quot;Grocery&quot;,&quot;HealthPersonalCare&quot;,&quot;HomeGarden&quot;,&quot;Jewelry&quot;,&quot;KindleStore&quot;,&quot;Kitchen&quot;,&quot;Lighting&quot;,&quot;Magazines&quot;,&quot;MP3Downloads&quot;,&quot;Music&quot;,&quot;MusicalInstruments&quot;,&quot;MusicTracks&quot;,&quot;OfficeProducts&quot;,&quot;OutdoorLiving&quot;,&quot;Outlet&quot;,&quot;PCHardware&quot;,&quot;Photo&quot;,&quot;Software&quot;,&quot;SoftwareVideoGames&quot;,&quot;SportingGoods&quot;,&quot;Tools&quot;,&quot;Toys&quot;,&quot;VHS&quot;,&quot;Video&quot;,&quot;VideoGames&quot;,&quot;Watches&quot;];
			break;
		case &quot;co.uk&quot;:
			SearchIndexes = [&quot;All&quot;,&quot;Apparel&quot;,&quot;Automotive&quot;,&quot;Baby&quot;,&quot;Beauty&quot;,&quot;Blended&quot;,&quot;Books&quot;,&quot;Classical&quot;,&quot;DVD&quot;,&quot;Electronics&quot;,&quot;Grocery&quot;,&quot;HealthPersonalCare&quot;,&quot;HomeGarden&quot;,&quot;Jewelry&quot;,&quot;Kitchen&quot;,&quot;Lighting&quot;,&quot;MP3Downloads&quot;,&quot;Music&quot;,&quot;MusicalInstruments&quot;,&quot;MusicTracks&quot;,&quot;OfficeProducts&quot;,&quot;OutdoorLiving&quot;,&quot;Outlet&quot;,&quot;Shoes&quot;,&quot;Software&quot;,&quot;SoftwareVideoGames&quot;,&quot;Toys&quot;,&quot;VHS&quot;,&quot;Video&quot;,&quot;VideoGames&quot;,&quot;Watches&quot;];
			break;
		case &quot;ca&quot;:
			SearchIndexes = [&quot;All&quot;,&quot;Blended&quot;,&quot;Books&quot;,&quot;Classical&quot;,&quot;DVD&quot;,&quot;Electronics&quot;,&quot;ForeignBooks&quot;,&quot;Kitchen&quot;,&quot;Music&quot;,&quot;Software&quot;,&quot;SoftwareVideoGames&quot;,&quot;VHS&quot;,&quot;Video&quot;,&quot;VideoGames&quot;];
			break;
		case &quot;it&quot;:
			SearchIndexes = [&quot;All&quot;,&quot;Books&quot;,&quot;DVD&quot;,&quot;Electronics&quot;,&quot;ForeignBooks&quot;,&quot;Garden&quot;,&quot;Kitchen&quot;,&quot;Music&quot;,&quot;Shoes&quot;,&quot;Software&quot;,&quot;Toys&quot;,&quot;VideoGames&quot;,&quot;Watches&quot;];
			break;
		case &quot;co.jp&quot;:
			SearchIndexes = [&quot;All&quot;,&quot;Apparel&quot;,&quot;Automotive&quot;,&quot;Baby&quot;,&quot;Beauty&quot;,&quot;Blended&quot;,&quot;Books&quot;,&quot;Classical&quot;,&quot;DVD&quot;,&quot;Electronics&quot;,&quot;ForeignBooks&quot;,&quot;Grocery&quot;,&quot;HealthPersonalCare&quot;,&quot;Hobbies&quot;,&quot;HomeImprovement&quot;,&quot;Jewelry&quot;,&quot;Kitchen&quot;,&quot;MP3Downloads&quot;,&quot;Music&quot;,&quot;MusicalInstruments&quot;,&quot;MusicTracks&quot;,&quot;OfficeProducts&quot;,&quot;Shoes&quot;,&quot;Software&quot;,&quot;SportingGoods&quot;,&quot;Toys&quot;,&quot;VHS&quot;,&quot;Video&quot;,&quot;VideoGames&quot;,&quot;Watches&quot;];
			break;
		case &quot;com&quot;:
			SearchIndexes = [&quot;All&quot;,&quot;Apparel&quot;,&quot;Appliances&quot;,&quot;ArtsAndCrafts&quot;,&quot;Automotive&quot;,&quot;Baby&quot;,&quot;Beauty&quot;,&quot;Blended&quot;,&quot;Books&quot;,&quot;Classical&quot;,&quot;DigitalMusic&quot;,&quot;DVD&quot;,&quot;Electronics&quot;,&quot;HealthPersonalCare&quot;,&quot;HomeGarden&quot;,&quot;Industrial&quot;,&quot;Jewelry&quot;,&quot;KindleStore&quot;,&quot;Kitchen&quot;,&quot;Magazines&quot;,&quot;Merchants&quot;,&quot;Miscellaneous&quot;,&quot;MobileApps&quot;,&quot;Music&quot;,&quot;MusicalInstruments&quot;,&quot;MusicTracks&quot;,&quot;OfficeProducts&quot;,&quot;OutdoorLiving&quot;,&quot;PCHardware&quot;,&quot;PetSupplies&quot;,&quot;Photo&quot;,&quot;Shoes&quot;,&quot;Software&quot;,&quot;SportingGoods&quot;,&quot;Tools&quot;,&quot;Toys&quot;,&quot;UnboxVideo&quot;,&quot;VHS&quot;,&quot;Video&quot;,&quot;VideoGames&quot;,&quot;Watches&quot;,&quot;Wireless&quot;,&quot;WirelessAccessories&quot;];
			break;
		default:
			SearchIndexes = [&quot;All&quot;];
			break;
	}
	for (i=0; i&lt;SearchIndexes.length; i++) {
		document.getElementById('SearchIndexInput').options[i]=new Option(SearchIndexes[i],SearchIndexes[i]);
	}
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body onload='createObject_xhr_processing(); dispOnglet(&quot;ASIN2EAN&quot;); changeSearchIndexes(&quot;fr&quot;);'&gt;
	&lt;div class=&quot;ongletButton&quot; onMouseOver=&quot;this.style.background='#CCC'&quot; onMouseOut=&quot;this.style.background='#DDD'&quot; onClick='dispOnglet(&quot;ASIN2EAN&quot;);'&gt;&lt;a&gt;ASIN to EAN&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;ongletButton&quot; onMouseOver=&quot;this.style.background='#CCC'&quot; onMouseOut=&quot;this.style.background='#DDD'&quot; onClick='dispOnglet(&quot;EAN2ASIN&quot;);'&gt;&lt;a&gt;EAN to ASIN&lt;/a&gt;&lt;/div&gt;
	&lt;div class=&quot;onglet&quot; id=&quot;ASIN2EAN&quot;&gt;
		&lt;h1&gt;ASIN to EAN converter&lt;/h1&gt;
		&lt;form name='converterForm'&gt;
			&lt;b&gt;ASIN code&lt;/b&gt;&lt;br /&gt;
			&lt;input type='text' id='ItemIdInputASIN2EAN' size='40' onblur=&quot;this.value = this.value.stripSpaces()&quot;/&gt;&lt;input type=&quot;button&quot; value=&quot;Paste&quot; onclick=&quot;document.getElementById('ItemIdInputASIN2EAN').value = retournepressepapier();&quot;&gt;&lt;br /&gt;
			&lt;input type='button' name='convertButton' value='Convert to EAN' onclick='convertFunction(&quot;ASIN2EAN&quot;);' /&gt;
			&lt;select name='localeInput' id='localeInputASIN2EAN'&gt;
				&lt;option value='ca'&gt;Canada&lt;/option&gt;
				&lt;option value='cn'&gt;China&lt;/option&gt;
				&lt;option selected value='fr'&gt;France&lt;/option&gt;
				&lt;option value='de'&gt;Germany&lt;/option&gt;
				&lt;option value='it'&gt;Italy&lt;/option&gt;
				&lt;option value='co.jp'&gt;Japan&lt;/option&gt;
				&lt;option value='co.uk'&gt;United Kingdom&lt;/option&gt;
				&lt;option value='com'&gt;USA&lt;/option&gt;
			&lt;/select&gt;
			&lt;br /&gt;
			&lt;b&gt;EAN code&lt;/b&gt;&lt;br /&gt;
			&lt;input style=&quot;background-color:#DDD&quot; type='text' name='ItemIdOutput' id='ItemIdOutputASIN2EAN' size='40' onFocus=&quot;select()&quot; readonly /&gt;&lt;input type=&quot;button&quot; value=&quot;Copy&quot; onclick=&quot;copiedanspressepapier('ASIN2EAN');&quot;&gt;&lt;br /&gt;
		&lt;/form&gt;
		&lt;div id=&quot;debugASIN2EAN&quot; width=&quot;200px&quot;&gt;&lt;/div&gt;
	&lt;/div&gt;
	&lt;div class=&quot;onglet&quot; id=&quot;EAN2ASIN&quot; style=&quot;display:none;&quot;&gt;
		&lt;h1&gt;EAN to ASIN converter&lt;/h1&gt;
		&lt;form name='converterForm'&gt;
			&lt;b&gt;EAN code&lt;/b&gt;&lt;br /&gt;
			&lt;input type='text' id='ItemIdInputEAN2ASIN' size='40' onblur=&quot;this.value = this.value.stripSpaces()&quot;/&gt;&lt;input type=&quot;button&quot; value=&quot;Paste&quot; onclick=&quot;document.getElementById('ItemIdInputEAN2ASIN').value = retournepressepapier();&quot;&gt;&lt;br /&gt;
			&lt;input type='button' name='convertButton' value='Convert to ASIN' onclick='convertFunction(&quot;EAN2ASIN&quot;);' /&gt;
			&lt;select name='localeInput' id='localeInputEAN2ASIN' onChange=&quot;changeSearchIndexes(this.value)&quot;&gt;
				&lt;option value='ca'&gt;Canada&lt;/option&gt;
				&lt;option value='cn'&gt;China&lt;/option&gt;
				&lt;option selected value='fr'&gt;France&lt;/option&gt;
				&lt;option value='de'&gt;Germany&lt;/option&gt;
				&lt;option value='it'&gt;Italy&lt;/option&gt;
				&lt;option value='co.jp'&gt;Japan&lt;/option&gt;
				&lt;option value='co.uk'&gt;United Kingdom&lt;/option&gt;
				&lt;option value='com'&gt;USA&lt;/option&gt;
			&lt;/select&gt;
			&lt;br /&gt;
			&lt;select name='SearchIndexInput' id='SearchIndexInput' style=&quot;width: 150px;&quot;&gt;
			&lt;/select&gt;
			&lt;br /&gt;
			&lt;b&gt;ASIN code&lt;/b&gt;&lt;br /&gt;
			&lt;input style=&quot;background-color:#DDD&quot; type='text' name='ItemIdOutput' id='ItemIdOutputEAN2ASIN' size='40' onFocus=&quot;select()&quot; readonly /&gt;&lt;input type=&quot;button&quot; value=&quot;Copy&quot; onclick=&quot;copiedanspressepapier('EAN2ASIN');&quot;&gt;&lt;br /&gt;
		&lt;/form&gt;
		&lt;div id=&quot;debugEAN2ASIN&quot; width=&quot;200px&quot;&gt;&lt;/div&gt;
	&lt;/div&gt;
	&lt;a id=&quot;apigo&quot; href=&quot;http://www.amazon.fr/#?_encoding=UTF8&amp;tag=fondation-21&amp;linkCode=ur2&amp;camp=1642&amp;creative=19458&quot; style=&quot;color: #CCC; font-size: 8pt;&quot; target=&quot;_blank&quot;&gt;Go to Amazon&lt;/a&gt;
	&lt;div id=&quot;debugAll&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>3. And finally, our beloved styles.css:</strong></p>
<pre class="brush: css; title: ; notranslate">
/* standard elements */
html {min-height: 100%;}

* {
margin: 0;
padding: 0;
}

a {color: #048;}
a:hover {color: #06C;}

body {
background-color: #E7E7E2;
color: #444;
font: normal 62.5% Tahoma,sans-serif;
padding-top: 20px;
padding-left: 20px;
}

p,code,ul {padding-bottom: 1.2em;}

li {list-style: none;}

h1 {font: normal 1.8em Tahoma,sans-serif;}
h2 {font: bold 1.4em sans-serif;}
h3 {font: bold 1em Tahoma,sans-serif;}

form,input {margin: 0; padding: 0; display: inline;}

code {
background: #FFF;
border: 1px solid #EEE;
border-left: 6px solid #CCC;
color: #666;
display: block;
font: normal 1em Tahoma,sans-serif;
line-height: 1.6em;
margin-bottom: 12px;
padding: 8px 10px;
white-space: pre;
}

blockquote {
display: block;
font-weight: bold;
padding-left: 28px;
}

h1,h2,h3 {padding-top: 6px; color: #553; margin-bottom: 4px;}

/*Custom design */
.ongletButton {
width: 175px;
float: left;
border-top: 0px;
border-right: 1px;
border-bottom: 1px;
border-left: 0px;
border-color: #555;
border-style: solid;
/* display: inline; */
cursor: pointer;
text-align: center;
background-color: #DDD;
}
.ongletButton a {
color: black;
font-weight: bold;
}

.onglet {
width: 350px;
float:none;
clear: both;
}
</pre>
<p>Feel free to make any suggestions to improve it! Here again is the final output, brought to you by <a href="http://www.erwinmayer.com/labs">erwinmayer.com labs</a>:</p>
<p><strong>Update (21/09/2009):</strong> This code is now compliant with Amazon Web Services new signature requirements.<br />
<strong>Update (27/08/2011):</strong> This code has been updated to support IT (Italy) and CN (China) locales, and the version dated 2011-08-01 of the Amazon Product Advertising API.<br />
<strong>Update (02/10/2011):</strong> This code has been updated to support ES (Spain) locale.</p>
<p><center><iframe height="375" width="400" border="1px" src="http://www.erwinmayer.com/labs/asin2ean/index.php" style="border-width: 1px; border-color: #222; margin-top: 10px;"></iframe></center></p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2008/05/05/release-of-source-code-for-my-asin-to-ean-and-ean-to-asin-converter/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Petit relifting</title>
		<link>http://erwinmayer.com/2008/04/12/petit-relifting/</link>
		<comments>http://erwinmayer.com/2008/04/12/petit-relifting/#comments</comments>
		<pubDate>Sat, 12 Apr 2008 21:03:44 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[CSS guru]]></category>
		<category><![CDATA[relifting]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/2008/04/12/petit-relifting/</guid>
		<description><![CDATA[Travailler sur une CSS devient vite un calvaire pour un perfectionniste comme moi&#8230; margin-top par-ci, padding-bottom par-là, il manque toujours un pixel quelque part ! Quand ce n&#8217;est pas Firefox (ou IE) qui fait des siennes. J&#8217;espère que les petites modifications rendront la lecture plus agréable.]]></description>
			<content:encoded><![CDATA[<p>Travailler sur une CSS devient vite un calvaire pour un perfectionniste comme moi&#8230; margin-top par-ci, padding-bottom par-là, il manque toujours un pixel quelque part ! Quand ce n&#8217;est pas Firefox (ou IE) qui fait des siennes.</p>
<p>J&#8217;espère que les petites modifications rendront la lecture plus agréable.</p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2008/04/12/petit-relifting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un petit jeu sympa</title>
		<link>http://erwinmayer.com/2008/04/12/un-petit-jeu-sympa/</link>
		<comments>http://erwinmayer.com/2008/04/12/un-petit-jeu-sympa/#comments</comments>
		<pubDate>Sat, 12 Apr 2008 09:46:55 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Jeux]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Adobe Flex]]></category>
		<category><![CDATA[Air]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[gettheglass]]></category>
		<category><![CDATA[jeu]]></category>
		<category><![CDATA[Lait]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/2008/04/12/un-petit-jeu-sympa/</guid>
		<description><![CDATA[Je n&#8217;ai pas pu m&#8217;empêcher d&#8217;aller me chercher un verre de lait. http://www.gettheglass.com/ Pour ceux qui sont intéressés par la conception d&#8217;un tel jeu, Adobe en a fait une étude de cas ici.]]></description>
			<content:encoded><![CDATA[<p>Je n&#8217;ai pas pu m&#8217;empêcher d&#8217;aller me chercher un verre de lait.</p>
<p><a href="http://www.gettheglass.com/">http://www.gettheglass.com/</a></p>
<p>Pour ceux qui sont intéressés par la conception d&#8217;un tel jeu, Adobe en a fait une étude de cas <a target="_blank" href="http://www.adobe.com/cfusion/showcase/index.cfm?event=casestudydetail&amp;casestudyid=377948&amp;loc=en_us">ici</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2008/04/12/un-petit-jeu-sympa/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Guide des extensions indispensables pour Firefox</title>
		<link>http://erwinmayer.com/2008/03/30/guide-des-extensions-indispensables-pour-firefox/</link>
		<comments>http://erwinmayer.com/2008/03/30/guide-des-extensions-indispensables-pour-firefox/#comments</comments>
		<pubDate>Sun, 30 Mar 2008 15:11:09 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Geek]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Benoît Morgat]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Extensions]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[IE7]]></category>
		<category><![CDATA[LaTeX]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Navigateur]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/2008/03/30/guide-des-extensions-indispensables-pour-firefox/</guid>
		<description><![CDATA[Benoit Mortgat publie ce jour un excellent guide pour ceux qui souhaitent équiper décemment leur navigateur web Firefox. J&#8217;avoue pour ma part être de plus en plus tenté de franchir le pas, au vu des lacunes d&#8217;Internet Explorer 7 en la matière. Jusqu&#8217;à présent, je n&#8217;utilisais Firefox que pour vérifier l&#8217;affichage convenable des pages de mes [...]]]></description>
			<content:encoded><![CDATA[<p><a target="_blank" href="http://morceauxchoisis.free.fr/">Benoit Mortgat</a> publie ce jour <a target="_blank" href="http://morceauxchoisis.free.fr/Misc/Extensions.pdf">un excellent guide</a> pour ceux qui souhaitent équiper décemment leur navigateur web <a target="_blank" href="http://www.firefox.fr">Firefox</a>. J&#8217;avoue pour ma part être de plus en plus tenté de franchir le pas, au vu des lacunes d&#8217;Internet Explorer 7 en la matière. Jusqu&#8217;à présent, je n&#8217;utilisais Firefox que pour vérifier l&#8217;affichage convenable des pages de mes sites sur ce navigateur. Ardent défenseur de Microsoft, j&#8217;ai apprécié leurs progrès considérables d&#8217;IE6 à IE7, mais je remarque qu&#8217;ils souffrent d&#8217;un cruel manque de support de la part de la communauté, ce qui diminue le surplus global lors de l&#8217;utilisation de ce logiciel. Pour ne pas citer d&#8217;exemple, le débuggage de scripts ou de CSS est tout une aventure avec IE7, là où les extensions conseillées par Benoit dans <a target="_blank" href="http://morceauxchoisis.free.fr/Misc/Extensions.pdf">son élégant guide en LaTeX</a> vous donnent l&#8217;impression de vivre une nouvelle vie.</p>
<p>Je ne saurais que trop donc vous conseiller de vous en inspirer pour enrichir votre expérience utilisateur sur la toile.</p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2008/03/30/guide-des-extensions-indispensables-pour-firefox/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google étoffe son offre de web apps avec Google Sites</title>
		<link>http://erwinmayer.com/2008/03/22/google-etoffe-son-offre-de-web-apps-avec-google-sites/</link>
		<comments>http://erwinmayer.com/2008/03/22/google-etoffe-son-offre-de-web-apps-avec-google-sites/#comments</comments>
		<pubDate>Sat, 22 Mar 2008 00:15:35 +0000</pubDate>
		<dc:creator>Erwin</dc:creator>
				<category><![CDATA[Entrepreneuriat]]></category>
		<category><![CDATA[High tech]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Google Sites]]></category>
		<category><![CDATA[start-ups]]></category>
		<category><![CDATA[Web apps]]></category>
		<category><![CDATA[Web OS]]></category>

		<guid isPermaLink="false">http://erwinmayer.com/2008/03/22/google-etoffe-son-offre-de-web-apps-avec-google-sites/</guid>
		<description><![CDATA[Google Sites : voilà une initiative bien intéressante. L&#8217;on vient à se poser des questions sur la place de CMS comme Joomla ou Magento face à des applications web aussi intégrées, complètes, dynamiques et surtout collaboratives&#8230; L&#8217;articulation entre ces deux types de produits reste à déterminer. Il y a peut-être de quoi créer une start-up [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sites.google.com/">Google Sites</a> : voilà une initiative bien intéressante. L&#8217;on vient à se poser des questions sur la place de CMS comme Joomla ou Magento face à des applications web aussi intégrées, complètes, dynamiques et surtout collaboratives&#8230; L&#8217;articulation entre ces deux types de produits reste à déterminer. Il y a peut-être de quoi créer une start-up à quelques millions de dollars (rachetée par Google ?).</p>
<p><center><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/X_KnC2EIS5w"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/X_KnC2EIS5w" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object></center></p>
]]></content:encoded>
			<wfw:commentRss>http://erwinmayer.com/2008/03/22/google-etoffe-son-offre-de-web-apps-avec-google-sites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

