<?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>AbriCoCotier.fr &#187; Programmation</title>
	<atom:link href="http://www.abricocotier.fr/tag/programmation/feed" rel="self" type="application/rss+xml" />
	<link>http://www.abricocotier.fr</link>
	<description>Analyses et anticipations sur le web et les nouvelles technologies de demain.</description>
	<lastBuildDate>Tue, 07 Feb 2012 21:17:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>SoundCloud : en quel langage est codé le service ?</title>
		<link>http://www.abricocotier.fr/17534-soundcloud-en-quel-langage-est-code-le-service</link>
		<comments>http://www.abricocotier.fr/17534-soundcloud-en-quel-langage-est-code-le-service#comments</comments>
		<pubDate>Mon, 06 Feb 2012 21:11:58 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[SoundCloud]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=17534</guid>
		<description><![CDATA[Rapide billet pour dire que je me demandais en quel langage était codé SoundCloud, et que j&#8217;ai cherché via les structures d&#8217;URL à le savoir, mais je n&#8217;ai pas réussi à trouver via ce biais. Les URL sont très propres, &#8230; <a href="http://www.abricocotier.fr/17534-soundcloud-en-quel-langage-est-code-le-service">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Rapide billet pour dire que je me demandais en quel langage était codé SoundCloud, et que j&#8217;ai cherché via les structures d&#8217;URL à le savoir, mais je n&#8217;ai pas réussi à trouver via ce biais. Les URL sont très propres, en terme de serveur utilisé, on est sur du Varnish+Nginx en front, mais c&#8217;est la seule chose que l&#8217;on peut voir. J&#8217;ai donc cherché dans les offres d&#8217;emploi disponibles sur le site (<a href="http://soundcloud.com/jobs/2010-08-31-back-end-developer-berlin-germany">ici</a> et <a href="http://soundcloud.com/jobs/2011-08-19-software-architect-berlin-germany">ici</a> par exemple). Et s&#8217;il y a un langage qui revient souvent, c&#8217;est bien le Ruby (ils disent d&#8217;ailleurs dans leurs offres d&#8217;emploi &laquo;&nbsp;SoundCloud Rails-based platform&nbsp;&raquo;). Donc on peut très bien imaginer que SoundCloud tourne sur un mod Phusion Passenger (mais habituellement on le voit dans les header, hors ici je n&#8217;en vois pas trace, donc c&#8217;est bizarre.). <span id="more-17534"></span></p>
<p><img class="aligncenter wp-image-17537" title="soundcloud1" src="http://www.abricocotier.fr/wp-content/uploads/2012/02/soundcloud1.jpg" alt="" width="512" /></p>
<p>On y voit aussi les combo Nginx/Thin/MySQL. Ne sachant pas ce qu&#8217;était <a href="http://code.macournoyer.com/thin/">Thin</a>, j&#8217;ai cherché et j&#8217;ai vu que c&#8217;était un serveur web pour Ruby. il y a donc des chance s qu&#8217;ils ne se servent pas du tout de Phusion Passenger mais qu&#8217;ils utilisent plutôt Thin, leur stack étant alors tout simplement celle qu&#8217;ils énoncent sur leur site : Varnish/Nginx en front, puis Thin+Ruby et enfin une base MySQL.</p>
<p>On voit aussi trace de RabbitMQ, qui est un système de message/queue (un peu comme JMS d&#8217;après ce que j&#8217;ai compris). J&#8217;imagine qu&#8217;ils utilisent ce système pour traiter les morceaux uploadés par leurs utilisateurs.</p>
<p>Parmi les autres technologies, j&#8217;ai vu :</p>
<ul>
<li>du Git (qu&#8217;ils utilisent certainement pour leur versionning de code)</li>
<li><a href="http://haproxy.1wt.eu/">HaProxy</a>, dont j&#8217;ai vu sur le web que c&#8217;était un load balancer</li>
<li>Memcached, un système de cache de base de données</li>
<li>Graphite, Ganglia, Nagios, New Relic, Hoptoad pour les systèmes de monitoring (très honnêtement, j&#8217;y connais pas grand chose)</li>
<li>ActionScript3 pour tout ce qui doit être players de musique ou système d&#8217;upload</li>
<li>JQuery pour  le framework JS</li>
</ul>
<div><span style="font-size: small;"><span style="line-height: 20px;">Voilà pour ce que j&#8217;ai pu voir. Si vous constatez d&#8217;autres technologies utilisées et non listées, sachez que je suis preneur <img src='http://www.abricocotier.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </span></span></div>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2012. |
<a href="http://www.abricocotier.fr/17534-soundcloud-en-quel-langage-est-code-le-service">Permalien</a> |
<a href="http://www.abricocotier.fr/17534-soundcloud-en-quel-langage-est-code-le-service#comments">2 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a>, <a href="http://www.abricocotier.fr/tag/soundcloud" rel="tag">SoundCloud</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/17534-soundcloud-en-quel-langage-est-code-le-service/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Une pénurie de développeurs ? Et si on arrêtait de prendre les gens pour des cons ?</title>
		<link>http://www.abricocotier.fr/17353-une-penurie-de-developpeurs-quelles-sont-les-vraies-raisons</link>
		<comments>http://www.abricocotier.fr/17353-une-penurie-de-developpeurs-quelles-sont-les-vraies-raisons#comments</comments>
		<pubDate>Tue, 24 Jan 2012 19:17:37 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=17353</guid>
		<description><![CDATA[Je reviens maintenant sur un article paru le 19 décembre dernier et qui avait eu le mérite de me faire enrager (c&#8217;est assez rare). Cet article parle de la pénurie de développeur en France, c&#8217;est à dire que les développeurs &#8230; <a href="http://www.abricocotier.fr/17353-une-penurie-de-developpeurs-quelles-sont-les-vraies-raisons">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Je reviens maintenant sur un article <a href="http://www.altaide.com/blog/la-penurie-de-developpeurs-va-til-amener-les-cabinets-de-recrutement-a-jeter-leponge/">paru</a> le 19 décembre dernier et qui avait eu le mérite de me faire enrager (c&#8217;est assez rare). Cet article parle de la pénurie de développeur en France, c&#8217;est à dire que les développeurs sont soi-disant de plus en plus difficiles à trouver pour les recruteurs. Cela touche les cabinets de recrutements qui vivent de ce besoin (ils sont payés pour trouver des développeurs). Je vais essayer d&#8217;exprimer ici mon point de vue sur les thèses données dans cet article, sans m&#8217;énerver (ça ne va pas être évident), et tout en essayant d&#8217;être clair.    <span id="more-17353"></span></p>
<p><img src="http://www.abricocotier.fr/wp-content/uploads/2012/01/Thomas-Suarez.jpg" alt="" title="Thomas-Suarez" width="580" /><br />
<em>Thomas Suarez, développeur iPhone de 10 ans.</em></p>
<p>Avant toute chose, sachez que j&#8217;ai sur ce sujet un point de vue très libéral.</p>
<p>Je vais commenter certaines phrases.</p>
<blockquote><p>Trouver des développeurs PHP, Java, .Net, IOS, Androïd ou RoR, pour ne citer que ces technos les plus demandées, c’est une débauche de moyens et d’énergies énorme. </p></blockquote>
<p>Ce genre de phrase m&#8217;étonne. Elle sous-entend que quasiment tous les développeurs sont embauchés et ne veulent pas quitter leur job, donc c&#8217;est de plus en plus difficile d&#8217;en trouver pour les débaucher. Ou alors qu&#8217;il y a de moins en moins de personnes qui savent coder (ce à quoi je ne crois pas du tout : il y a chaque année des cohortes de développeurs qui sortent des écoles d&#8217;ingénieurs, des IUT, des BTS, et parmi ceux-ci, il y a beaucoup de très bons).</p>
<blockquote><p>Sur ces profils, le marché est pénurique, je le clame haut et fort. Récemment je m’en suis ouvert à Gilles Babinet, Président du Conseil national du Numérique, qui me disait commencer à mener des actions de lobbying. En effet sans action forte de l’État et des grandes entreprises pour créer des formations adaptées et inciter les jeunes générations à aller vers ces secteurs forts en emploi, nous courrons vers une économie du numérique handicapée.</p></blockquote>
<p>Je deviens rouge. Quand on voit le nombre de gens formés au développement informatique, qui sciemment recherchent du boulot ailleurs, on se dit que ce n&#8217;est pas l&#8217;offre qui manque, mais peut-être que le problème vient d&#8217;ailleurs. Au hasard, je dirais que le problème vient de la demande.</p>
<blockquote><p>nos ingénieurs sont les meilleurs ! : la Silicon Valley en est truffée, l’iPhone a été conçu à Paris, Google et Microsoft créent des centres de développement en France… Seul bémol : il n’y en a plus assez qui sortent des écoles pour travailler en France !</p></blockquote>
<p>Tiens donc, il n&#8217;y en a pas assez qui sortent de nos école pour <strong>travailler en France</strong>. Pourquoi ne veulent-ils pas travailler en France ? On dirait le même problème que quand on se plaint que tous les chercheurs Français se barrent à l&#8217;étranger. Bizarre, non ?</p>
<p>Bon, je m&#8217;arrête là car je pense que la démonstration est faite. On se plaint qu&#8217;il n&#8217;y a pas assez de développeurs. Pourtant, ceux qui étaient là il y a 10 ans ne sont pas morts. Et ceux qui sont arrivés sur le marché l&#8217;année suivante, puis les années suivantes jusqu&#8217;à aujourd&#8217;hui, auraient dû combler ce vide depuis longtemps. Mais non. BIZARRE !!!</p>
<p>Vraiment, beaucoup de bizarreries. Mais j&#8217;ai l&#8217;impression qu&#8217;on ne se pose pas la bonne question.</p>
<p>Voyez plutôt : vous sortez de l&#8217;école. On vous propose un job de développeur entre 28 et 35K€. Vous le prenez, car vous ne pouvez rien faire de mieux payé. Au bout de 5 ans d&#8217;expérience, soit vous finissez par faire du management pour passer au dessus des 40K€ (ce qui implique que vous ne développerez plus), soit vous continuez en tant que développeur, avec votre expérience qui grimpe, qui grimpe&#8230; mais pas votre salaire. Voilà la solution en France.</p>
<p>Effectivement, quand on voit Loic Le Meur qui dit qu&#8217;un développeur d&#8217;appli iPhone est payé 180K$ par an aux USA (dans la Silicon Valley) (source : à retrouver, mais je crois que c&#8217;était lors de son passage dans #DCDC), on comprend pourquoi EUX, DES DEVELOPPEURS, ILS EN TROUVENT. Mais nous, bizarrement, en leur proposant 35K€ maximum, personne ne se bouscule au portillon. Y&#8217;A PAS QUELQU&#8217;UN QUI PEUT REFLECHIR, DEUX MINUTES ?</p>
<p>Donc je pense que pour trouver des développeurs, il faut d&#8217;abord arrêter de les faire partir en courant : payez les mieux, et comme par hasard, ils resteront développeurs. Ou proposez leurs des offres d&#8217;emploi bien payé, et comme par hasard, vous en trouverez qui seront intéressés. C&#8217;est l&#8217;offre et la demande : pour une demande avec un salaire pourri, pas d&#8217;offre. Vous augmentez le salaire, et là, vous verrez, l&#8217;offre apparaîtra (comme par magie).</p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2012. |
<a href="http://www.abricocotier.fr/17353-une-penurie-de-developpeurs-quelles-sont-les-vraies-raisons">Permalien</a> |
<a href="http://www.abricocotier.fr/17353-une-penurie-de-developpeurs-quelles-sont-les-vraies-raisons#comments">109 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/17353-une-penurie-de-developpeurs-quelles-sont-les-vraies-raisons/feed</wfw:commentRss>
		<slash:comments>109</slash:comments>
		</item>
		<item>
		<title>Les produits de Google codés en GWT</title>
		<link>http://www.abricocotier.fr/16789-les-produits-de-google-codes-en-gwt</link>
		<comments>http://www.abricocotier.fr/16789-les-produits-de-google-codes-en-gwt#comments</comments>
		<pubDate>Mon, 12 Dec 2011 15:34:24 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Java - J2EE]]></category>
		<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=16789</guid>
		<description><![CDATA[J&#8217;ai pu découvrir ce week-end via Twitter (qui m&#8217;emmenait sur Google Plus, pour être honnête) une liste des produits de Google codés en GWT. Cette liste était fournie par Ray Cromwell, qui travaillerait chez Google sur le développement du framework &#8230; <a href="http://www.abricocotier.fr/16789-les-produits-de-google-codes-en-gwt">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai pu découvrir ce week-end via Twitter (qui m&#8217;emmenait sur Google Plus, pour être honnête) une liste des produits de Google codés en GWT. Cette liste était fournie par Ray Cromwell, qui travaillerait chez Google sur le développement du framework GWT, d&#8217;après <a href="https://plus.google.com/u/0/110412141990454266397/about">son profil</a>.   <span id="more-16789"></span></p>
<p><img src="http://www.abricocotier.fr/wp-content/uploads/2011/12/gwt5.jpg" alt="" title="gwt5" width="497" /></p>
<blockquote><ul>
<li>AdWords <a href="http://google.com/adwords">http://google.com/adwords</a>
</li>
<li>AdSense <a href="http://google.com/adsense">http://google.com/adsense</a>
</li>
<li>Flights <a href="http://flights.google.com/">http://flights.google.com</a>
</li>
<li>Hotel Finder <a href="http://www.google.com/hotelfinder">http://www.google.com/hotelfinder</a>
</li>
<li>Offers <a href="https://www.google.com/offers">https://www.google.com/offers</a>
</li>
<li>Wallet <a href="http://wallet.google.com/">http://wallet.google.com</a>
</li>
<li>The New Blogger <a href="http://www.blogger.com/">http://www.blogger.com/</a>
</li>
<li>Chrome Webstore <a href="https://chrome.google.com/webstore">https://chrome.google.com/webstore</a>
</li>
<li>Product Search <a href="http://www.google.com/prdhp?hl=en&amp;tab=mf">http://www.google.com/prdhp?hl=en&amp;tab=mf</a>
</li>
<li>Public Data <a href="http://www.google.com/publicdata/home">http://www.google.com/publicdata/home</a>
</li>
<li>New Google Groups <a href="http://groups.google.com/">http://groups.google.com</a>
</li>
<li>Orkut <a href="http://www.orkut.com/">http://www.orkut.com</a>
</li>
<li>Google Takeout <a href="https://www.google.com/takeout/#custom">https://www.google.com/takeout/#custom</a>
</li>
<li>Google Pagespeed <a href="https://developers.google.com/pagespeed/">https://developers.google.com/pagespeed/</a>
</li>
<li>Google WebFonts <a href="http://www.google.com/webfonts">http://www.google.com/webfonts</a>
</li>
<li>Google Tables <a href="https://www.google.com/fusiontables/DataSource?dsrcid=2049253">https://www.google.com/fusiontables/DataSource?dsrcid=2049253</a>
</li>
<li>Google Health (discontinued)</li>
<li>Google Wave (discontinued)</li>
<li>PlayN (basis of Angry Birds)</li>
</ul>
</blockquote>
<p>Au passage, cela montre que ni Gmail, ni Google Documents ne sont codés en GWT (alors que très honnêtement, cela ne m&#8217;aurait pas étonné).</p>
<p><a href="https://plus.google.com/u/0/110412141990454266397/posts/ivVepvxCu3g">Source</a></p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2011. |
<a href="http://www.abricocotier.fr/16789-les-produits-de-google-codes-en-gwt">Permalien</a> |
<a href="http://www.abricocotier.fr/16789-les-produits-de-google-codes-en-gwt#comments">1 commentaire</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/google" rel="tag">Google</a>, <a href="http://www.abricocotier.fr/tag/gwt" rel="tag">GWT</a>, <a href="http://www.abricocotier.fr/tag/java-j2ee" rel="tag">Java - J2EE</a>, <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/16789-les-produits-de-google-codes-en-gwt/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Faire des Threads en Java-JEE</title>
		<link>http://www.abricocotier.fr/16633-faire-des-threads-en-java-jee</link>
		<comments>http://www.abricocotier.fr/16633-faire-des-threads-en-java-jee#comments</comments>
		<pubDate>Sun, 20 Nov 2011 01:35:01 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=16633</guid>
		<description><![CDATA[L&#8217;idée de faire des threads sur une application web vient du fait que les processeurs des serveurs sous souvent sous-utilisés (je dirais en moyenne 20%), et donc on pourrait gagner en rapidité des applications en mettant davantage de threads, plutôt &#8230; <a href="http://www.abricocotier.fr/16633-faire-des-threads-en-java-jee">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>L&#8217;idée de faire des threads sur une application web vient du fait que les processeurs des serveurs sous souvent sous-utilisés (je dirais en moyenne 20%), et donc on pourrait gagner en rapidité des applications en mettant davantage de threads, plutôt qu&#8217;en augmentant les capacités des processeurs. Voilà donc rapidement comment faire des threads en Java.    <span id="more-16633"></span></p>
<p>D&#8217;abord on va isoler le code à threader. Pour cela, on créera une classe java, comme celle-ci par exemple :</p>
<pre class="brush: java; title: ; notranslate">
public class LongCompute extends Thread{

	private Long monLong;

    LongCompute (Long monLong){
    	this.monLong = monLong;
    }

    public void run() {
       monLong++;
    }
}
</pre>
<p>L&#8217;idée est ici réellement d&#8217;avoir un code seulement dépendant du contexte qui lui aura été passé. Notez que cette classe doit étendre de la classe Thread.</p>
<p>Ensuite, on va appeler ce code depuis une méthode, présente dans une autre classe :</p>
<pre class="brush: java; title: ; notranslate">
for (Long monLong : collectionLong) {

       	Thread th = new LongCompute(monLong);
      	threadList.add(th);
      	th.start();
}

for(Thread th : threadList)
      try {th.join();} catch(Exception e) {}
}
</pre>
<p>Sachant que la technique ci-dessus les démarre tous à la suite, et les joints tous à la fin. Compliqué et risqué si le traitement de chaque thread est coûteux en temps et en mémoire !</p>
<p>D&#8217;où une autre méthode pour limiter le nombre de threads démarrés en parallèle.</p>
<pre class="brush: java; title: ; notranslate">
for (Long monLong : collectionLong) {
       	Thread th = new LongCompute(monLong);
      	threadList.add(th);
}

Iterator&lt;Thread&gt; it = threadList.iterator();
asyncMethod(it);
</pre>
<p>Avec une méthode asyncMethod qui ressemblera à ceci :</p>
<pre class="brush: java; title: ; notranslate">
private void asyncMethod(Iterator&lt;Thread&gt; it) {
	int i = 0;
       int MAX = 200;
       List&lt;Thread&gt; listTh =new ArrayList&lt;Thread&gt;();
        while (it.hasNext() &amp;&amp; i &lt;= MAX) {
       	Thread th = it.next();
       	listTh.add(th);
       	th.start();
       	i++;
	}

    try {
		for (Thread thh : listTh) {
	    	thh.join();
	    }
       } catch (InterruptedException exception) {}
       if (it.hasNext()) {
       	asyncMethod(it);
    }
}
</pre>
<p>Et voilà ! Pour les crédits : remerciements à Anthony L. pour le code de la asyncMethod. Le reste a <a href="http://viennet.developpez.com/cours/java/thread/">été trouvé là</a>.</p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2011. |
<a href="http://www.abricocotier.fr/16633-faire-des-threads-en-java-jee">Permalien</a> |
<a href="http://www.abricocotier.fr/16633-faire-des-threads-en-java-jee#comments">Ajoutez un commentaire !</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/java" rel="tag">Java</a>, <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/16633-faire-des-threads-en-java-jee/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Empêcher le copier-coller dans un champs input HTML</title>
		<link>http://www.abricocotier.fr/16065-empecher-le-copier-coller-dans-un-champs-input-html</link>
		<comments>http://www.abricocotier.fr/16065-empecher-le-copier-coller-dans-un-champs-input-html#comments</comments>
		<pubDate>Fri, 28 Oct 2011 16:26:20 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=16065</guid>
		<description><![CDATA[J&#8217;ai eu à trouver un moyen d&#8217;empêcher le copier-coller dans un champs input HTML, et donc je partage ici les résultats de mes recherches. C&#8217;est intéressant à plusieurs titres. Sachez qu&#8217;il existe un évènement onPaste sur les champs input (et &#8230; <a href="http://www.abricocotier.fr/16065-empecher-le-copier-coller-dans-un-champs-input-html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai eu à trouver un moyen d&#8217;empêcher le copier-coller dans un champs input HTML, et donc je partage ici les résultats de mes recherches. C&#8217;est intéressant à plusieurs titres. Sachez qu&#8217;il existe un évènement onPaste sur les champs input (et textarea, sans doute), supporté par la large majorité des navigateurs récents (mais pas Opéra). Au passage cet évènement ne semble pas prévu par le W3C (sur la page des <a href="http://en.wikipedia.org/wiki/DOM_events">DOM Events</a>, Wikipedia liste cet événement comme IE only&#8230;).    <span id="more-16065"></span></p>
<p><img src="http://www.abricocotier.fr/wp-content/uploads/2011/10/copier-coller.jpg" alt="" title="copier-coller" width="580" /></p>
<p>Mais bref, pour être sûr et certain, on va utiliser plusieurs méthodes qui s&#8217;assurent que ça fonctionne bien sous tous les navigateurs.</p>
<h2>Bloquer onPaste avec JQuery</h2>
<p>Une solution est <a href="http://www.4guysfromrolla.com/articles/060910-1.aspx">fournie là</a> (et la même est <a href="http://stackoverflow.com/questions/5510129/how-to-disable-ctrlv-paste-with-jquery">redonnée là</a>). J&#8217;ai testé, ça fonctionne niquel : que ce soit le Ctrl+V, le clic droit + coller, bref, ça bloque tout. J&#8217;ai retenu cette solution.</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
   $(document).ready(function () {
      $('#id_of_textbox').bind('paste', function (e) {
         e.preventDefault();
      });
   });
&lt;/script&gt;
</pre>
<p>Sachant que si on veut bloquer le Copier/Couper, on peut rajouter <em>cut </em>et <em>copy </em>dans le <em>bind(&#8216;paste&#8217;</em>, ce qui donnera <em>bind(&#8216;cut copy paste&#8217;</em></p>
<h2>Bloquer le onPaste sans JQuery</h2>
<p>J&#8217;ai trouvé sur le web deux solutions pour rajouter manuellement le onPaste dans le navigateur, et ce sans utiliser JQuery.</p>
<p>La première solution, <a href="http://stackoverflow.com/questions/1226574/disable-copy-paste-into-html-form-using-javascript ">trouvée sur StackOverflow</a> :</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
// Register onpaste on inputs and textareas in browsers that don't
// natively support it.
(function () {
    var onload = window.onload;

    window.onload = function () {
        if (typeof onload == &quot;function&quot;) {
            onload.apply(this, arguments);
        }

        var fields = [];
        var inputs = document.getElementsByTagName(&quot;input&quot;);
        var textareas = document.getElementsByTagName(&quot;textarea&quot;);

        for (var i = 0; i &lt; inputs.length; i++) {
            fields.push(inputs[i]);
        }

        for (var i = 0; i &lt; textareas.length; i++) {
            fields.push(textareas[i]);
        }

        for (var i = 0; i &lt; fields.length; i++) {
            var field = fields[i];

            if (typeof field.onpaste != &quot;function&quot; &amp;&amp; !!field.getAttribute(&quot;onpaste&quot;)) {
                field.onpaste = eval(&quot;(function () { &quot; + field.getAttribute(&quot;onpaste&quot;) + &quot; })&quot;);
            }

            if (typeof field.onpaste == &quot;function&quot;) {
                var oninput = field.oninput;

                field.oninput = function () {
                    if (typeof oninput == &quot;function&quot;) {
                        oninput.apply(this, arguments);
                    }

                    if (typeof this.previousValue == &quot;undefined&quot;) {
                        this.previousValue = this.value;
                    }

                    var pasted = (Math.abs(this.previousValue.length - this.value.length) &gt; 1 &amp;&amp; this.value != &quot;&quot;);

                    if (pasted &amp;&amp; !this.onpaste.apply(this, arguments)) {
                        this.value = this.previousValue;
                    }

                    this.previousValue = this.value;
                };

                if (field.addEventListener) {
                    field.addEventListener(&quot;input&quot;, field.oninput, false);
                } else if (field.attachEvent) {
                    field.attachEvent(&quot;oninput&quot;, field.oninput);
                }
            }
        }
    }
})();
&lt;/script&gt;
</pre>
<h2>En utilisant directement le onPaste</h2>
<p>On peut de toute façon utiliser le <em>onPaste</em>, en oubliant les utilisateurs sous Opera, en utilisant ça, tout simplement :</p>
<pre class="brush: xml; title: ; notranslate">
&lt;input type=&quot;text&quot; onpaste=&quot;return false;&quot; /&gt;
</pre>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2011. |
<a href="http://www.abricocotier.fr/16065-empecher-le-copier-coller-dans-un-champs-input-html">Permalien</a> |
<a href="http://www.abricocotier.fr/16065-empecher-le-copier-coller-dans-un-champs-input-html#comments">2 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/javascript" rel="tag">JavaScript</a>, <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a>, <a href="http://www.abricocotier.fr/tag/tutoriel" rel="tag">Tutoriel</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/16065-empecher-le-copier-coller-dans-un-champs-input-html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Erreur Java FileNotFoundException sur le site de la BNP</title>
		<link>http://www.abricocotier.fr/15718-erreur-java-filenotfoundexception-sur-le-site-bnp</link>
		<comments>http://www.abricocotier.fr/15718-erreur-java-filenotfoundexception-sur-le-site-bnp#comments</comments>
		<pubDate>Sat, 24 Sep 2011 07:44:46 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[BNP]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=15718</guid>
		<description><![CDATA[Héhé, rien de tel pour s&#8217;amuser dès le matin. Alors, si vous voulez tenter de reproduire cette erreur, voilà comment faire : vous allez sur cette page, et vous cliquez ensuite sur le picto BNP en haut à gauche de &#8230; <a href="http://www.abricocotier.fr/15718-erreur-java-filenotfoundexception-sur-le-site-bnp">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Héhé, rien de tel pour s&#8217;amuser dès le matin. Alors, si vous voulez tenter de reproduire cette erreur, voilà comment faire : vous allez sur cette <a href="https://www.secure.bnpparibas.net/banque/portail/particulier/Fiche?type=category&#038;identifiant=Toutes_les_agences_et_leur_region_20021219170639&#038;codeGroupe=01871&#038;ville=Saint+Maur+des+Fosses">page</a>, et vous cliquez ensuite sur le picto BNP en haut à gauche de la petite carte indiquant les différentes agences à Saint-Maur des Fossés. Notez qu&#8217;en retentant plusieurs fois, je n&#8217;ai pas réussi à réafficher cette page&#8230;  <span id="more-15718"></span></p>
<p><a href="http://www.abricocotier.fr/wp-content/uploads/2011/09/BNP_erreur_java.jpg"><img src="http://www.abricocotier.fr/wp-content/uploads/2011/09/BNP_erreur_java-1024x655.jpg" alt="" title="BNP_erreur_java" width="580" /></a></p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2011. |
<a href="http://www.abricocotier.fr/15718-erreur-java-filenotfoundexception-sur-le-site-bnp">Permalien</a> |
<a href="http://www.abricocotier.fr/15718-erreur-java-filenotfoundexception-sur-le-site-bnp#comments">Ajoutez un commentaire !</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/bnp" rel="tag">BNP</a>, <a href="http://www.abricocotier.fr/tag/java" rel="tag">Java</a>, <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/15718-erreur-java-filenotfoundexception-sur-le-site-bnp/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Site encore down hier, la faute à un espace disque rempli</title>
		<link>http://www.abricocotier.fr/13047-site-encore-down-hier-la-faute-a-un-espace-disque-rempli</link>
		<comments>http://www.abricocotier.fr/13047-site-encore-down-hier-la-faute-a-un-espace-disque-rempli#comments</comments>
		<pubDate>Wed, 06 Oct 2010 20:58:38 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Serveur]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=13047</guid>
		<description><![CDATA[Hier encore, abricocotier était down. PLus exactement, le serveur est tombé vers 12h29 et est remonté vers 12h59 (d&#8217;après les dates données par Mon.itor.us, mais en fait il a été down un peu moins de temps). Déjà le matin, en &#8230; <a href="http://www.abricocotier.fr/13047-site-encore-down-hier-la-faute-a-un-espace-disque-rempli">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hier <a href="http://www.abricocotier.fr/13020-hier-le-blog-etait-down-pendant-une-heure-et-demi">encore</a>, abricocotier était down. <strong>PLus exactement, le serveur est tombé vers 12h29 et est remonté vers 12h59 </strong>(d&#8217;après les dates données par <a href="http://mon.itor.us/">Mon.itor.us</a>, mais en fait il a été down un peu moins de temps). Déjà le matin, en publiant un <a href="http://www.abricocotier.fr/13022-test-de-windows-phone-7-et-de-la-creation-dune-application-via-followmyfeed">billet sur le Windows Phone 7</a>, j&#8217;avais eu la désagréable surprise de <strong>ne pas pouvoir uploader mes images</strong> correctement. Je me disais que c&#8217;était peut-être parce qu&#8217;après la tombée du serveur la veille, PHP n&#8217;avait peut-être pas été redémarré dans les même conditions que précédemment, et les fonctions de PHP permettant de recevoir les fichiers et de les redimensionner n&#8217;étaient peut-être pas utilisables. En fait, pas du tout.    <span id="more-13047"></span></p>
<p style="text-align: center;"><img src="http://www.abricocotier.fr/wp-content/uploads/2010/10/redemarrer_serveur_1and1.jpg" alt="" title="redemarrer_serveur_1and1" width="580" /></p>
<p>Il se trouve simplement que <strong>j&#8217;étais arrivé à la limite haute de la capacité de mémoire sur la partition où est stocké mon blog</strong> sur le serveur où il est, partition qui contient également les logs Nginx/Apache du serveur. Oui, je sais, c&#8217;est pas bien. Mais c&#8217;est le genre de détail qui est peu important avant qu&#8217;on ne se prenne le mur, d&#8217;autant que j&#8217;aurais parié que les logs ne prendraient pas plus de place que de raison, grâce à <a href="http://www.linuxconfig.org/Logrotate">logrotate</a> que je croyais fonctionnel (logrotate s&#8217;assure que le total des logs d&#8217;un dossier reste à un certain niveau de place en mémoire).</p>
<p>Donc<strong> j&#8217;étais arrivé à la limite de mon disque, soit&#8230; 4,7 Go</strong> (sur cette partition, hein, en fait j&#8217;en avais une à côté qui était vide et qui faisait&#8230; 80Go). En fait je ne savais pas du tout que les dossiers accessibles à la racine étaient chacun dans une partition compartimentée, donc je croyais bénéficier d&#8217;une taille de stockage totale/cumulée de 100Go, comme le prévoyais l&#8217;offre de serveur à laquelle j&#8217;ai souscrite.</p>
<p>Au passage, pour connaitre la répartition du stockage et sa charge, voilà <a href="http://www.abricocotier.fr/10807-administration-dun-serveur-quelques-commandes">la commande</a> :</p>
<blockquote><p>df -h</p></blockquote>
<p>Ce qui donne chez moi (après avoir réglé le problème) :</p>
<blockquote>
<div id="_mcePaste">$ df -h</div>
<div id="_mcePaste">Filesystem            Size  Used Avail Use% Mounted on</div>
<div id="_mcePaste">/dev/hda1             950M  343M  559M  38% /</div>
<div id="_mcePaste">varrun               1000M   72K 1000M   1% /var/run</div>
<div id="_mcePaste">varlock              1000M     0 1000M   0% /var/lock</div>
<div id="_mcePaste">udev                 1000M   36K 1000M   1% /dev</div>
<div id="_mcePaste">devshm               1000M     0 1000M   0% /dev/shm</div>
<div id="_mcePaste">/dev/hda5             4.7G  1.5G  3.2G  32% /mondossier3</div>
<div id="_mcePaste">/dev/hda6             4.7G  1.4G  3.4G  29% /mondossier2</div>
<div id="_mcePaste">/dev/hda7              81G  661M   81G   1% /mondossier1</div>
<div id="_mcePaste">none                 1000M     0 1000M   0% /tmp</div>
</blockquote>
<p>Donc, pour revenir à nos moutons, le matin, pas de possibilité d&#8217;uploader correctement mes images.</p>
<p>Et à midi, le site qui ne répond plus.</p>
<p>En confiance après le redémarrage correct de la veille, je demande un redémarrage du serveur sur l&#8217;admin de 1and1, ce qui se passe correctement, mais de ce que je constatais à ce moment là, Nginx/Apache fonctionnaient, mais sur abricocotier.Fr, il n&#8217;y avait plus de connexion MySQL. A l&#8217;inverse, il semblait que microblog.abricocotier.fr ait une connexion MySQL&#8230; Donc j&#8217;ai d&#8217;abord pensé à un hack du site (des petits malins qui auraient été s&#8217;amuser avec le install.php de WordPress), ou auraient réussi à virer le config.php&#8230;</p>
<p>Le soir, en ayant ENFIN accès à un PuTTy, j&#8217;ai pu constater qu&#8217;il n&#8217;en était rien, et que le site avait l&#8217;air d&#8217;être intact, en tout cas en ce qui concernait les fichiers. Par contre, MySQL m&#8217;affichait l&#8217;erreur suivante :</p>
<pre class="brush: plain; title: ; notranslate">
Warning: session_write_close() [function.session-write-close]: write failed: No space left on device (28) in /usr/share/phpmyadmin/libraries/common.lib.php on line 648

Warning: session_write_close() [function.session-write-close]: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php5) in /usr/share/phpmyadmin/libraries/common.lib.php on line 648

#0  PMA_sendHeaderLocation(http://localhost/phpmyadmin/index.php?lang=fr-utf-8&amp;amp;convcharset=iso-8859-1&amp;amp;collation_connection=utf8_unicode_ci&amp;amp;token=ec462f0246b8932e5b46ee9417dd491f) called at [/usr/share/phpmyadmin/libraries/auth/cookie.auth.lib.php:543]
#1  PMA_auth_set_user() called at [/usr/share/phpmyadmin/libraries/common.inc.php:758]
#2  require_once(/usr/share/phpmyadmin/libraries/common.inc.php) called at [/usr/share/phpmyadmin/index.php:34]

Fatal error: PMA_sendHeaderLocation called when headers are already sent! in /usr/share/phpmyadmin/libraries/common.lib.php on line 655
</pre>
<p>Après une recherche sur le <a href="http://forum.ubuntu-fr.org/viewtopic.php?pid=3770574">forum Ubuntu-fr</a>, j&#8217;ai pu constater qu&#8217;il pourrait s&#8217;agir d&#8217;un problème de taille disponible sur le disque&#8230; Ce qui m&#8217;a amené à supprimer mes logs Nginx, &laquo;&nbsp;pour voir&nbsp;&raquo;&#8230; Et quand j&#8217;ai vu que je supprimais 3Go de logs, j&#8217;ai compris qu&#8217;il y avait peut-être là quelque chose de louche.</p>
<p>Après avoir exécuté les commandes suivantes :</p>
<blockquote><p>cd /mondossierdelog/nginx</p>
<p>rm *.gz</p>
<p>rm *.1</p></blockquote>
<p><em>(rien qu&#8217;avec ces trois commandes, j&#8217;ai gagné 3Go)</em></p>
<p>MySQL ne voulait toujours pas fonctionner&#8230; Je me suis donc dis que c&#8217;était peut-être à cause du mauvais démarrage de celui-ci, et donc j&#8217;ai demandé (pour la troisième fois) un redémarrage du serveur.</p>
<p>Et là&#8230; c&#8217;état la quille ! Tout à refonctionné instantanément.</p>
<h3><strong>Bilan : </strong></h3>
<ul>
<li>Mettre les dossiers de ses sites sur la plus grosse des partition</li>
<li>Mettre ses logs sur la plus grosse des partition et/ou s&#8217;assurer que logrotate fonctionne correctement !</li>
</ul>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/13047-site-encore-down-hier-la-faute-a-un-espace-disque-rempli">Permalien</a> |
<a href="http://www.abricocotier.fr/13047-site-encore-down-hier-la-faute-a-un-espace-disque-rempli#comments">Ajoutez un commentaire !</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a>, <a href="http://www.abricocotier.fr/tag/serveur" rel="tag">Serveur</a>, <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/13047-site-encore-down-hier-la-faute-a-un-espace-disque-rempli/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Une procédure PL/SQL pour supprimer toutes les procédures existantes dans Oracle</title>
		<link>http://www.abricocotier.fr/13111-une-procedure-plsql-pour-supprimer-toutes-les-procedures-existantes-dans-oracle</link>
		<comments>http://www.abricocotier.fr/13111-une-procedure-plsql-pour-supprimer-toutes-les-procedures-existantes-dans-oracle#comments</comments>
		<pubDate>Tue, 05 Oct 2010 21:43:53 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Astuces]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=13111</guid>
		<description><![CDATA[Un rapide billet pour vous donner une procédure PL/SQL permettant de supprimer toutes les autres procédures stockées dans Oracle. Sachant que j&#8217;utilise actuellement Oracle SQL Developer au boulot, et qu&#8217;il n&#8217;est pas possible de sélectionner plusieurs procédures pour les supprimer &#8230; <a href="http://www.abricocotier.fr/13111-une-procedure-plsql-pour-supprimer-toutes-les-procedures-existantes-dans-oracle">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Un rapide billet pour vous donner une procédure PL/SQL permettant de supprimer toutes les autres procédures stockées dans Oracle. Sachant que j&#8217;utilise actuellement Oracle SQL Developer au boulot, et qu&#8217;il n&#8217;est pas possible de sélectionner plusieurs procédures pour les supprimer toutes en même temps, j&#8217;ai cherché un peu sur le web et trouver 2-3 bouts pour construire cette méthode, permettant de supprimer toutes les procédures dont le nom commence par XYZ (XYZ est une chaine de caractère désignant par quoi commence les procédures stockées à supprimer).    <span id="more-13111"></span></p>
<p>Attention, on voit dans la requête de création qu&#8217;on filtre les procédures par l&#8217;attribut <em>objet_type</em>. Pour faire la même chose sur les fonctions, il suffit de remplacer <em>object_type = &#8216;PROCEDURE&#8217;</em> par <em>object_type = &#8216;FUNCTION&#8217;</em> .</p>
<pre class="brush: sql; title: ; notranslate">
create or replace procedure abcdefghi (debut_nomproc in varchar2)
is
  stmt_str VARCHAR2(18000);
cursor combi
          is select object_name from user_objects u_o where u_o.object_type = 'PROCEDURE' and u_o.object_name like debut_nomproc||'%';
begin
   FOR r in combi
    LOOP
            stmt_str := 'DROP PROCEDURE '||r.object_name||' '  ;
            EXECUTE IMMEDIATE stmt_str;
            COMMIT WORK;
    END LOOP;
end;
/

execute abcdefghi('T');
</pre>
<h3>Recompiler toutes les procédures stockées</h3>
<p>Il arrive que Oracle présente les procédures stockées comme non valide. Il suffit alors de les recompiler une par une pour les voir  &laquo;&nbsp;compilées&nbsp;&raquo;. D&#8217;où une procédure, basée sur le code ci-dessus, pour les recompiler toutes.</p>
<pre class="brush: sql; title: ; notranslate">

create or replace procedure APROC_RECOMPILE_TOUS (debut_nomproc in varchar2)
is
  stmt_str VARCHAR2(18000);
cursor combi
          is select object_name from user_objects u_o where u_o.object_type = 'PROCEDURE' and u_o.object_name like debut_nomproc||'%';
begin
   FOR r in combi
    LOOP
            stmt_str := 'ALTER PROCEDURE '||r.object_name||' COMPILE'  ;
            EXECUTE IMMEDIATE stmt_str;
            COMMIT WORK;
    END LOOP;
end;
/

execute APROC_RECOMPILE_TOUS('%');
</pre>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/13111-une-procedure-plsql-pour-supprimer-toutes-les-procedures-existantes-dans-oracle">Permalien</a> |
<a href="http://www.abricocotier.fr/13111-une-procedure-plsql-pour-supprimer-toutes-les-procedures-existantes-dans-oracle#comments">Ajoutez un commentaire !</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/astuces" rel="tag">Astuces</a>, <a href="http://www.abricocotier.fr/tag/oracle" rel="tag">Oracle</a>, <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a>, <a href="http://www.abricocotier.fr/tag/sql" rel="tag">SQL</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/13111-une-procedure-plsql-pour-supprimer-toutes-les-procedures-existantes-dans-oracle/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment refaire Google Instant et Scribe soit-même avec de l&#8217;AJAX et MySQL</title>
		<link>http://www.abricocotier.fr/12651-comment-refaire-google-instant-et-scribe-soit-meme-avec-du-javascript</link>
		<comments>http://www.abricocotier.fr/12651-comment-refaire-google-instant-et-scribe-soit-meme-avec-du-javascript#comments</comments>
		<pubDate>Tue, 14 Sep 2010 08:00:43 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=12651</guid>
		<description><![CDATA[Script.aculo.us est un petit script dont je n&#8217;avais jamais parlé ici pour la simple raison que je n&#8217;ai pas eu l&#8217;occasion de le tester moi-même (j&#8217;ai honte). Pourtant, ce script est utilisé un peu partout sur le web quand il &#8230; <a href="http://www.abricocotier.fr/12651-comment-refaire-google-instant-et-scribe-soit-meme-avec-du-javascript">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Script.aculo.us est un petit script dont je n&#8217;avais jamais parlé ici pour la simple raison que je n&#8217;ai pas eu l&#8217;occasion de le tester moi-même (j&#8217;ai honte). Pourtant, ce script est utilisé un peu partout sur le web quand il s&#8217;agit notamment de créer une auto-complétion dans les barres de recherche. <strong>En fait, <a href="http://script.aculo.us/">Script.aculo.us</a> est un addon de la librairie Javascript Prototype, et permet entre-autres de créer de l&#8217;auto-complétion</strong>. L&#8217;auto-complétion consiste en l&#8217;affichage d&#8217;un box de résultats &laquo;&nbsp;suggérés&nbsp;&raquo; en temps réel pendant que vous tapez.     <span id="more-12651"></span></p>
<p style="text-align: center;"><img src="http://www.abricocotier.fr/wp-content/uploads/2010/09/google_scribe_instant_search.jpg" alt="" title="google_scribe_instant_search" width="580" /></p>
<p>Plus précisément, vous intégrez Script.Aculo.us à votre page avec Prototype ; puis vous créez une barre de recherche, et enfin, vous mettez en face un serveur (ci-dessous, en PHP) capable de répondre à vos différentes requètes qui seront faites en AJAX. Un tutoriel très bien fait est <a href="http://www.wiseguysonly.com/2008/03/09/autocompletion-with-scriptaculous-and-ajax/">disponible ici</a>.</p>
<p>Pour revenir à nos moutons, il suffirait pour recréer un Google Instant, de placer dans une iframe en dessous de sa barre de recherche un page de résultat Google (par exemple avec Google Custom Search, qui permet de n&#8217;avoir que les résultats (et les pubs si vous choisissez d&#8217;en laisser), avec au dessus, dans la barre de recherche, une adaptation du script.aculo.us qui non seulement affiche une pré-box de résultats (reste à savoir où la trouver, cette pré-box&#8230; par exemple avec <a href="http://www.zorgloob.com/2010/09/07/google-scribe/">Scribe</a>, mais ce serait de la triche car cela ne nécessiterait plus le script JS).</p>
<h2><strong>Refaire Google Scribe / Google Instant soit-même : spécification </strong></h2>
<p><em>Refaire Google Scribe ne me semble pas complètement horrible techniquement, et c&#8217;est la raison pour laquelle j&#8217;ai passé quelques minutes à écrire une petite spécification fonctionnelle (et un peu technique) pour cette application, avec, comme pré-requis en terme d&#8217;outil, un tout petit peu d&#8217;AJAX et une base MySQL.</em></p>
<p><strong>Besoin </strong>: fournir des listes de 10 éléments, dont chaque élément est un ensemble de terme commençants par le terme déjà écrit dans la barre de recherche.</p>
<p>Il faut donc constituer une base de données de phrases (de 3, 4 ou 5 termes), que l&#8217;on pourrait créer par exemple à partir de l&#8217;aspiration de blogs ou de journaux en ligne, en ne retenant que le contenu &laquo;&nbsp;utile&nbsp;&raquo; (le contenu de chaque billet, pas les méta-infos, commentaires ou autres liens sur la page).</p>
<p>Sur ces gros volumes, on extrait des textes (par exemple en utilisant en python <a href="http://www.aaronsw.com/2002/html2text/">HTML2TEXT</a> sur certaines parties de page web, ce qui aura pour effet d&#8217;enlever déjà toutes les balises HTML), puis enlevertous les signes de type ,:/\!?.</p>
<p>Enfin, faire un split sur ce ces textes, d&#8217;abord par &#8216;.&#8217;, puis ensuite par espace. Enfin, ajouter en base de données des groupes de 4 termes successifs, si ils sont non-existants, et sinon, incrémenter leur champ &laquo;&nbsp;fréquence&nbsp;&raquo; associé.</p>
<p>Par exemple via cette requète :</p>
<blockquote><p>INSERT INTO table_lettre_a (phrase, freq) VALUES (&#8216;mot1 mot2 mot3 mot4&#8242;, 1) ON DUPLICATE KEY UPDATE freq = freq + 1;</p></blockquote>
<p>Je rajoute que pour stocker ces gros volumes, il aura fallu créer une base de donnée composée de (26+10) tables (une table par première lettre/chiffre de phrase), et ces tables seront composées d&#8217;un index, d&#8217;une colonne contenant la phrase, et d&#8217;une seconde contenant la fréquence.</p>
<p>En terme d&#8217;utilisation de l&#8217;application :</p>
<p>A chaque fois que l&#8217;utilisateur tape une lettre, via un événement javascript onKeyUp on envoie une requète au serveur lui demandant les 10 phrases les plus fréquentes qui commencent par les lettres frappées.</p>
<p>La liste des 10 premières requètes est générée par une requète SQ sur la base associée à la première lettre :</p>
<blockquote><p>SELECT phrase WHERE phrase LIKE &laquo;&nbsp;phrase_source%&nbsp;&raquo; ORDER BY freq DESC LIMIT 10;</p></blockquote>
<p>A chaque nouvelle réponse du serveur, on rafrachit l&#8217;iframe sous la barre de recherche contenant les résultats (par exemple via Google Custom Search) avec la requète majoritaire (celle qui vient en premier dans la liste des résultats probables).</p>
<p>On écrit également dans la barre de recherche la fin de la requète (en prenant cette qui est la plus fréquente) et mettant en gras la partie déjà écrite.</p>
<p>Dès que l&#8217;utilisateur sort de la page, on met un +1 à la fréquence de la requète prise en compte (si les résultats affichés l&#8217;étaient en fonction d&#8217;une requète déjà présente en base) ou bien on insère une nouvelle entrée en base si la requète était différente de celles déjà existantes.</p>
<p><em>C&#8217;est tout, dans un premier temps. Si j&#8217;ai un peu plus de temps disponible à mon boulot, je tenterais d&#8217;en faire une petite application sur AppEngine.</em></p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/12651-comment-refaire-google-instant-et-scribe-soit-meme-avec-du-javascript">Permalien</a> |
<a href="http://www.abricocotier.fr/12651-comment-refaire-google-instant-et-scribe-soit-meme-avec-du-javascript#comments">1 commentaire</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/google" rel="tag">Google</a>, <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/12651-comment-refaire-google-instant-et-scribe-soit-meme-avec-du-javascript/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Notions de Java et de développement</title>
		<link>http://www.abricocotier.fr/12635-notions-de-java-et-de-developpement</link>
		<comments>http://www.abricocotier.fr/12635-notions-de-java-et-de-developpement#comments</comments>
		<pubDate>Wed, 25 Aug 2010 20:57:37 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Java - J2EE]]></category>
		<category><![CDATA[Programmation]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=12635</guid>
		<description><![CDATA[Ce billet est pour moi, mais je sais que je fixe les notions beaucoup mieux quand je les écris sur ce blog. VOilà quelques notions que je ne connaissais pas au moment où on me les a deandé, et il &#8230; <a href="http://www.abricocotier.fr/12635-notions-de-java-et-de-developpement">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ce billet est pour moi, mais je sais que je fixe les notions beaucoup mieux quand je les écris sur ce blog. VOilà quelques notions que je ne connaissais pas au moment où on me les a deandé, et il va sans dire que je me suis sentit complètement idiot. Deuxièmement idiot quand j&#8217;ai compris à quoi elles renvoyaient, puisque ces notions sont assez basiques en terme de développement.</p>
<p>Bref, je recopie ici ces notions, afin de contribuer à ne pas me faire avoir une seconde fois.   <span id="more-12635"></span></p>
<h2><strong>Polymorphisme</strong></h2>
<blockquote><p>[<a href="http://fr.wikipedia.org/wiki/Polymorphisme_(informatique)">Wikipedia</a>] En informatique, le polymorphisme est l&#8217;idée d&#8217;autoriser le même code à être utilisé avec différents types, ce qui permet des implémentations plus abstraites et générales.</p>
<h3>Intérêt du Polymorphisme</h3>
<p>En proposant d&#8217;utiliser un même nom de méthode pour plusieurs types d&#8217;objets différents, le polymorphisme permet une programmation beaucoup plus générique. Le développeur n&#8217;a pas à savoir, lorsqu&#8217;il programme une <a title="Méthode (informatique)" href="http://fr.wikipedia.org/wiki/M%C3%A9thode_(informatique)">méthode</a>, le type précis de l&#8217;objet sur lequel la méthode va s&#8217;appliquer. Il lui suffit de savoir que cet objet implémentera la méthode.</p>
<p>Ainsi, un logiciel de calcul d&#8217;intérêt pour des comptes bancaires se présenterait de la façon suivante en programmation classique (pseudo code):</p>
<pre>case MonCompteBancaire
 PEA : MonCompteBancaire.calculeInteretPEA
 PEL : MonCompteBancaire.calculeInteretPEL
 LivretA : MonCompteBancaire.calculeInteretLivretA
end case</pre>
<p>Si un nouveau type de compte bancaire PERP apparait (et avec lui un nouveau calcul), il sera nécessaire d&#8217;une part d&#8217;écrire la nouvelle méthode calculeInteretPERP, mais aussi de modifier tous les appels du calcul ci-dessus. Dans le meilleur des cas, celui-ci sera isolé et mutualisé de sorte qu&#8217;une seule modification sera nécessaire. Dans le pire des cas, il peut y avoir des centaines d&#8217;appels à modifier.</p>
<p>Avec le polymorphisme, toutes les méthodes porteront le même nom &laquo;&nbsp;calculInteret&nbsp;&raquo; mais auront des codes différents (un par type de compte). L&#8217;appel sera de la forme :</p>
<pre>MonCompteBancaire.calculeInteret</pre>
<p>Lors de l&#8217;arrivée du nouveau compte, aucune modification de ce code ne sera nécessaire. Le choix de la méthode réelle à utiliser sera fait automatiquement à l&#8217;exécution par le langage, alors que dans le cas précédent c&#8217;est le développeur qui devait programmer ce choix.</p></blockquote>
<h2><strong>Encapsulation</strong></h2>
<blockquote><p>[<a href="http://fr.wikipedia.org/wiki/Encapsulation_(programmation)">Wikipédia</a>]</p>
<p>En <a title="Programmation orientée objet" href="http://fr.wikipedia.org/wiki/Programmation_orient%C3%A9e_objet">programmation orientée objet</a>, l’<strong>encapsulation</strong> est l&#8217;idée de protéger l&#8217;information contenue dans un objet et de ne proposer que des <a title="Méthode (informatique)" href="http://fr.wikipedia.org/wiki/M%C3%A9thode_(informatique)">méthodes</a> de manipulation de cet objet. Ainsi, les propriétés et <a title="Axiome" href="http://fr.wikipedia.org/wiki/Axiome">axiomes</a> associés aux informations contenues dans l&#8217;objet seront assurés/validés par les méthodes de l&#8217;objet et ne seront plus de la responsabilité de l&#8217;utilisateur extérieur. L&#8217;utilisateur extérieur ne pourra pas modifier directement l&#8217;information et risquer de mettre en péril les axiomes et les propriétés comportementales de l&#8217;objet.</p>
<p>L&#8217;objet est ainsi vu de l&#8217;extérieur comme une <strong>boîte noire</strong> ayant certaines propriétés et ayant un comportement spécifié. La manière dont ces propriétés ont été implémentées est alors cachée aux utilisateurs de la classe. On peut changer cette implémentation sans changer le comportement extérieur de l&#8217;objet. Cela permet donc de séparer la spécification du comportement d&#8217;un objet, de l&#8217;implémentation pratique de ces spécifications.</p>
<p>En principe, l&#8217;encapsulation permet à l&#8217;<a title="Instance (programmation)" href="http://fr.wikipedia.org/wiki/Instance_(programmation)">instance</a> d&#8217;une <a title="Classe (informatique)" href="http://fr.wikipedia.org/wiki/Classe_(informatique)">classe</a> d&#8217;accéder aux attributs d&#8217;une <a title="Super-classe (page inexistante)" href="http://fr.wikipedia.org/w/index.php?title=Super-classe&amp;action=edit&amp;redlink=1">super-classe</a>. Par contre deux instances d&#8217;une même classe ne peuvent accéder à leurs états.</p>
<h3>L&#8217;encapsulation dans les langages</h3>
<p>Les principes de l&#8217;encapsulation sont appliqués de manières très diverses suivant les langages. Mais on peut quand même trouver deux courants principaux.</p>
<p>Premièrement une application relativement stricte des principes dans les langages objet <em>purs</em> (pour autant que ce terme ait un sens) comme dans <a title="SmallTalk" href="http://fr.wikipedia.org/wiki/SmallTalk">SmallTalk</a> ou <a title="Eiffel (langage)" href="http://fr.wikipedia.org/wiki/Eiffel_(langage)">Eiffel</a>. Dans ce cadre les attributs ne sont souvent disponibles qu&#8217;en lecture en général dans le programme et en écriture aussi depuis l&#8217;intérieur de la classe d&#8217;objet. On trouve ensuite différents moyens pour adapter ce cadre à des classes <em>amies</em> ou à des catégories et des hiérarchies d&#8217;objets.<br />
Deuxièmement les langages tels que <a title="C plus plus" href="http://fr.wikipedia.org/wiki/C_plus_plus">C++</a>, <a title="Java (langage)" href="http://fr.wikipedia.org/wiki/Java_(langage)">Java</a>, <a title="Ruby" href="http://fr.wikipedia.org/wiki/Ruby">Ruby</a> ou <a title="Python (langage)" href="http://fr.wikipedia.org/wiki/Python_(langage)">Python</a> et plus généralement tous les langages influencés par la syntaxe du <a title="C plus plus" href="http://fr.wikipedia.org/wiki/C_plus_plus">C++</a> qui a proposé trois niveaux de visibilité :</p>
<ul>
<li>public : les attributs dits publics sont accessibles à tous,</li>
<li>protégé : les attributs dits protégés sont accessibles seulement aux classes dérivées,</li>
<li>privé : les attributs privés sont accessibles seulement par l&#8217;objet lui-même.</li>
</ul>
<p>Ce type d&#8217;encapsulation propose en fait une autre approche de l&#8217;encapsulation qui ne fait pas la distinction entre la lecture et l&#8217;écriture d&#8217;un attribut. Dans ce cadre on utilise en plus des méthodes d&#8217;accès et de modifications définies dans une des trois catégories suivant l&#8217;effet que l&#8217;on souhaite obtenir. Souvent ces deux types de méthodes sont définies en plus de l&#8217;attribut qui contient réellement la donnée.</p>
<p>De plus, dans ces langages, l&#8217;instance d&#8217;une classe a un accès complet à l&#8217;état d&#8217;une autre instance de la même classe. Des contraintes peuvent limiter l&#8217;accès des instances d&#8217;une classe aux attributs d&#8217;une super-classe. Enfin, des moyens autorisent certaines instances et fonctions à avoir un accès public total à d&#8217;autres instances même si elles ne sont pas de la même classe, comme c&#8217;est le cas avec les instances <em>friend</em> sous C++.</p></blockquote>
<h2><strong>Process/Threads</strong></h2>
<blockquote><p>[<a href="http://fr.wikipedia.org/wiki/Processus_(informatique)">Wikipédia</a>] La plupart des systèmes offrent la distinction entre processus « lourd » (tels que nous les avons décrits), qui sont a priori complètement isolés les uns des autres, et « <a title="Processus léger" href="http://fr.wikipedia.org/wiki/Processus_l%C3%A9ger">processus légers</a> » (<em>threads</em> en anglais), qui ont un espace mémoire (et d&#8217;autres ressources) en commun.</p></blockquote>
<blockquote><p><strong>Edit</strong> : Un billet très intéresant à ce niveau également. <a href="http://www.geek-directeur-technique.com/post/2010/09/15/Les-connaissances-informatiques-de-base">Les connaissances informatiques de base</a></p></blockquote>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/12635-notions-de-java-et-de-developpement">Permalien</a> |
<a href="http://www.abricocotier.fr/12635-notions-de-java-et-de-developpement#comments">2 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/java-j2ee" rel="tag">Java - J2EE</a>, <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/12635-notions-de-java-et-de-developpement/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

