<?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>L&#039;Univers D&#039;Adjanakis &#187; Développement</title>
	<atom:link href="https://blog.developpez.com/adjanakis/pcategory/developpement/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/adjanakis</link>
	<description></description>
	<lastBuildDate>Sun, 24 Nov 2013 00:46:48 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Codingame du 23 novembre 2013 : Rejouons la partition</title>
		<link>https://blog.developpez.com/adjanakis/p12358/developpement/java/codingame-du-23-novembre-2013-rejouons-la-partition</link>
		<comments>https://blog.developpez.com/adjanakis/p12358/developpement/java/codingame-du-23-novembre-2013-rejouons-la-partition#comments</comments>
		<pubDate>Sun, 24 Nov 2013 00:46:48 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[codingame who note musique]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/adjanakis/?p=149</guid>
		<description><![CDATA[C&#8217;est avec un grand regret que je n&#8217;ai pas pu finir à temps ma composition pour aider le Docteur Who à sortir d&#8217;un bien mauvais pas. J&#8217;ai pu constater avec plaisir qu&#8217;il avait pu s&#8217;en sortir grâce aux quelques algorithmes qui ont pu être livrés à temps. Mais pour ceux qui n&#8217;en peuvent plus d&#8217;attendre de lire un algo qui se rapprocherait de la solution, voici ce que j&#8217;aurais dû soumettre pendant le codingame si [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C&rsquo;est avec un grand regret que je n&rsquo;ai pas pu finir à temps ma composition pour aider le Docteur Who à sortir d&rsquo;un bien mauvais pas.  J&rsquo;ai pu constater avec plaisir qu&rsquo;il avait pu s&rsquo;en sortir grâce aux quelques algorithmes qui ont pu être livrés à temps. </p>
<p>Mais pour ceux qui n&rsquo;en peuvent plus d&rsquo;attendre de lire un algo qui se rapprocherait de la solution, voici ce que j&rsquo;aurais dû soumettre pendant le codingame si le manque de temps ne m&rsquo;avait pas finalement poussé vers une voie de mauvais garçon (à voir sur le site codingame :evil:). </p>
<p>Les constantes ne sont pas les bonnes pour les noires et les blanches et ce code n&rsquo;a été testé que sur un seul jeu de données(&laquo;&nbsp;Only 1 pixel wide &#8211; in10.txt&nbsp;&raquo;). Cependant, l&rsquo;idée qui y est présentée me semble bonne et ne devrait souffrir que de petits ajustements pour pouvoir passer l&rsquo;ensemble des tests.</p>
<p>En quelques mots, les étapes de la résolution sont indiquées dans la méthode main. Tout d&rsquo;abord, une lecture des données en entrée permet de récupérer dans un tableau à deux dimensions les pixels de l&rsquo;image. La difficulté est ici de devoir jouer avec les lignes du tableau indépendamment de la lecture du flux en entrée. Une lecture un peu plus complexe que dans la moyenne des codingame, une source de temps perdu, mais une difficulté surmontable.</p>
<p>Ensuite, on peut constater que dans <a href="http://files.codingame.com/pub/dw/dw2-allimages.html" title="Partitions de musique" target="_blank">toutes les partitions de musique</a>, les premiers pixels correspondent aux 5 lignes noires. Dans l&rsquo;algorithme choisi ici, la phase suivante consiste à repérer les coordonnées de ces lignes. Pour cela, la colonne sélectionnée sera la première de l&rsquo;image contenant des pixels noirs. Cette colonne aura été préalablement déterminée lors de la lecture de la partition. Une sixième ligne pouvant intervenir, on en calcule la position en admettant que toutes les lignes sont séparées par des intervalles réguliers.</p>
<p>La phase suivante est déterminante pour arriver au résultat désiré. Les lignes de la partition déterminent des zones auxquelles on affectera un flag. Pour chaque colonne, on calculera une empreinte qui correspondra à l&rsquo;ensemble des zones où apparaît un pixel noir, sans tenir compte des pixels des lignes de la portée. On comptabilise par contre le nombre de pixel noir de la colonne pour analyser plus tard la longueur des notes.</p>
<p>Une fois cette étape statistique réalisée, il ne reste plus qu&rsquo;à en tirer des conclusions. Les colonnes considérées comme ne possédant aucun pixel sont à ignorer. Celles correspondant à une queue de note sont également ignorées car les zones traversées ne correspondant pas à une empreinte de note valide. Lorsqu&rsquo;une empreinte est valide on conserve l&rsquo;information et on compare la quantité de pixel noir entre la première et la deuxième colonne où la note apparaît. En effet, les notes blanches ont davantage de pixels noirs sur les côtés, alors que les notes noirs en ont davantage ! En calculant l&rsquo;évolution de ce nombre, on connait la durée de la note.</p>
<p>Après ces quelques explications, j&rsquo;espère que vous comprendrez le code source qui suit.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">import java.io.File;<br />
import java.io.FileNotFoundException;<br />
import java.util.Arrays;<br />
import java.util.HashMap;<br />
import java.util.Map;<br />
import java.util.Scanner;<br />
<br />
class Solution {<br />
<br />
&nbsp; &nbsp; private static final int DOWN = 1;<br />
&nbsp; &nbsp; private static final int UP = 0;<br />
&nbsp; &nbsp; private static final String BLACK = &quot;B&quot;;<br />
&nbsp; &nbsp; private static final String WHITE = &quot;W&quot;;<br />
&nbsp; &nbsp; private static int width = 0;<br />
&nbsp; &nbsp; private static int height = 0;<br />
&nbsp; &nbsp; private static boolean[][] score = null;<br />
&nbsp; &nbsp; private static int blackFirstX = -1;<br />
&nbsp; &nbsp; private static int[][] lignes = new int[6][2];<br />
&nbsp; &nbsp; private static int betweenLines;<br />
&nbsp; &nbsp; private static int[] statZone;<br />
&nbsp; &nbsp; private static int[] statPond;<br />
<br />
&nbsp; &nbsp; public static void main(String args[]) throws FileNotFoundException {<br />
&nbsp; &nbsp; &nbsp; &nbsp; readScoreInput();<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; guessScoreLines();<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; retrieveStatistics();<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(buildResult());<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; private static void guessScoreLines() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; int line_number = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; boolean onLine = false;<br />
&nbsp; &nbsp; &nbsp; &nbsp; for (int y = 0; y &amp;lt; height; y++) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (score[y][blackFirstX]) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lignes[line_number][DOWN] = y;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!onLine) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; onLine = true;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lignes[line_number][UP] = y;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (onLine) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; line_number++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; onLine = false;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; betweenLines = lignes[1][UP] - lignes[0][UP];<br />
&nbsp; &nbsp; &nbsp; &nbsp; lignes[5][UP] = lignes[4][UP] + betweenLines;<br />
&nbsp; &nbsp; &nbsp; &nbsp; lignes[5][DOWN] = lignes[4][DOWN] + betweenLines;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; private static void retrieveStatistics() {<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; for (int w = 0; w &amp;lt; width; w++) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int currentZone = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int currentZoneFlag = 1 &amp;lt;&amp;lt; currentZone;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int nextLine = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int h = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (h &amp;lt; height) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (nextLine &amp;lt; lignes.length &amp;amp;&amp;amp; h == lignes[nextLine][UP]) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; h = lignes[nextLine][DOWN] + 1;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentZone++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nextLine++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentZoneFlag = 1 &amp;lt;&amp;lt; currentZone;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (score[h][w]) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; statZone[w] |= currentZoneFlag;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; statPond[w]++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; h++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; private static String buildResult() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; Map zoneMapping = new HashMap(13);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(1, &quot;G&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(3, &quot;F&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(2, &quot;E&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(6, &quot;D&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(4, &quot;C&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(12, &quot;B&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(8, &quot;A&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(24, &quot;G&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(16, &quot;F&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(48, &quot;E&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(32, &quot;D&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(96, &quot;C&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; zoneMapping.put(64, &quot;B&quot;);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; StringBuilder result = new StringBuilder();<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; int currentZone = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; int currentPond = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; boolean typeIsKnow = false;<br />
&nbsp; &nbsp; &nbsp; &nbsp; for (int w = 0; w = currentPond) ? BLACK : WHITE)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .append(&quot; &quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; typeIsKnow = true;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; return result.toString();<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; private static void readScoreInput() throws FileNotFoundException {<br />
&nbsp; &nbsp; &nbsp; &nbsp; Scanner in = new Scanner(new File(&quot;test.txt&quot;));<br />
&nbsp; &nbsp; &nbsp; &nbsp; width = in.nextInt();<br />
&nbsp; &nbsp; &nbsp; &nbsp; height = in.nextInt();<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; score = new boolean[height][width];<br />
&nbsp; &nbsp; &nbsp; &nbsp; statZone = new int[width];<br />
&nbsp; &nbsp; &nbsp; &nbsp; statPond = new int[width];<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; Arrays.fill(statZone, 0);<br />
&nbsp; &nbsp; &nbsp; &nbsp; Arrays.fill(statPond, 0);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; boolean scoreCompleted = false;<br />
&nbsp; &nbsp; &nbsp; &nbsp; int number, w = 0, h = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; String color;<br />
&nbsp; &nbsp; &nbsp; &nbsp; blackFirstX = width;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; while (!scoreCompleted) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color = in.next(&quot;\\s*[WB]\\s*&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; number = in.nextInt();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boolean colorBool = charToBoolean(color);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // tant que l'entrée n'est pas consommée<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (number &amp;gt; 0) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (blackFirstX &amp;gt; w &amp;amp;&amp;amp; color.trim().equals(&quot;B&quot;)) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blackFirstX = w;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (number &amp;gt; (width - w)) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Arrays.fill(score[h], w, width, colorBool);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; number = number - (width - w);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; w = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; h++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Arrays.fill(score[h], w, w + number, charToBoolean(color));<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; w = w + number;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; number = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scoreCompleted = (h == height - 1);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; in.close();<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; private static boolean charToBoolean(String color) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;B&quot;.equals(color.trim());<br />
&nbsp; &nbsp; }<br />
}</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Un répondeur vocal fait maison avec Twilio</title>
		<link>https://blog.developpez.com/adjanakis/p12183/breves/repondeur-twili</link>
		<comments>https://blog.developpez.com/adjanakis/p12183/breves/repondeur-twili#comments</comments>
		<pubDate>Tue, 20 Aug 2013 21:48:37 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Brèves]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[répondeur]]></category>
		<category><![CDATA[takeoffconf]]></category>
		<category><![CDATA[talend]]></category>
		<category><![CDATA[twilio]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/adjanakis/?p=77</guid>
		<description><![CDATA[Twilio est une société que j&#8217;ai connu un peu par hasard en assouvissant mon besoin de nouvelles découvertes il y a de cela presque 9 mois (Wow, déjà !). Le premier contact a eu lieu lors d&#8217;un webinar de la société talend. Au cours de cette présentation, twilio a été utilisé afin de fournir un point d&#8217;entrée vers Talend ESB. Concrètement, les utilisateurs peuvent voter par téléphone pour choisir le futur président des Etats-Unis d&#8217;Amérique. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Twilio est une société que j&rsquo;ai connu un peu par hasard en assouvissant mon besoin de nouvelles découvertes il y a de cela presque 9 mois (Wow, déjà !). Le premier contact a eu lieu lors d&rsquo;un <a href="http://fr.talend.com/resources/webinars/et-si-on-rejouait-les-elections-americaines-grace-a-talend-esb" title="Et si on rejouait les élections américaines" target="_blank">webinar de la société talend</a>. Au cours de cette présentation, twilio a été utilisé afin de fournir un point d&rsquo;entrée vers Talend ESB. Concrètement, les utilisateurs peuvent voter par téléphone pour choisir le futur président des Etats-Unis d&rsquo;Amérique. Twilio est l&rsquo;outil permettant de recevoir un appel vocal, et de guider l&rsquo;utilisateur grâce aux instructions qu&rsquo;il reçoit de la part du Système d&rsquo;informations mis en place par le présentateur. C&rsquo;est ainsi que cette startup a piqué une première fois ma curiosité au vif. J&rsquo;ai été séduit par la facilité avec laquelle il était possible de donner un accès vocal a un contenu Web.<br />
<a href="http://twilio.com"><img src="http://www.twilio.com/packages/company/img/logos_downloadable_round.png" width="150" alt="Twilio" class="alignright" align="right" /></a><br />
Ma deuxième confrontation avec ce sujet fut lors de la découverte de la <a href="http://takeoffconf.com/" title="TakeOff Conf" target="_blank">takeoffconf</a>, dont le premier opus a eu lieu à Lille en janvier 2013. J&rsquo;ai tout d&rsquo;abord été surpris, en scrollant dans la page d&rsquo;accueil, de voir apparaître le logo de la société parmi les sponsors. Ensuite, en descendant encore, j&rsquo;ai pu noter la présence d&rsquo;une session présentée par <a href="http://www.twilio.com/doers/Rob-Spectre" title="Rob Spectre twilio doers" target="_blank">Rob Spectre</a>. Lors de cette présentation sur les <a href="http://youtu.be/t_OFqZvtjf0" title="TakeOff 2013 - Product Oriented Architectures - Rob Spectre" target="_blank">Solutions orientées architecture</a>, il évoquera la stratégie produit de la startup qu&rsquo;il représente.</p>
<p>Cette seconde expérience a servi de piqûre de rappel. Il fallait que j&rsquo;aille plus loin dans cette découverte. C&rsquo;est ainsi qu&rsquo;il y a quelques mois, j&rsquo;ai décidé de me rendre sur le site de twilio afin de me forger une expérience utilisateur sur ce nouveau service. Celle-ci s&rsquo;est donc terminée par la mise en place d&rsquo;un répondeur vocale en commençant par une étape cruciale, <a href="https://www.twilio.com/try-twilio" title="Inscription sur twilio" target="_blank">l&rsquo;inscription</a>.</p>
<p><div id="attachment_103" style="width: 310px" class="wp-caption aligncenter"><a href="http://blog.developpez.com/adjanakis/files/2013/08/twilio-01-Inscription.png"><img src="http://blog.developpez.com/adjanakis/files/2013/08/twilio-01-Inscription-300x168.png" alt="Twilio - Inscription" width="300" height="168" class="size-medium wp-image-103" /></a><p class="wp-caption-text"><br />
Formulaire classique d&rsquo;Inscription</p></div><br />
Pas de fioriture pour s&rsquo;inscrire, c&rsquo;est simple et clair, ce qui permet de pouvoir commencer à s&rsquo;amuser assez rapidement.</p>
<p><div id="attachment_104" style="width: 310px" class="wp-caption aligncenter"><a href="http://blog.developpez.com/adjanakis/files/2013/08/twilio-01-Verification.png"><img src="http://blog.developpez.com/adjanakis/files/2013/08/twilio-01-Verification-300x168.png" alt="Vérification vocale au lieu d&#039;un captcha" width="300" height="168" class="size-medium wp-image-104" /></a><p class="wp-caption-text"><br />
Vérification vocale au lieu d&rsquo;un captcha</p></div><br />
Et oui, c&rsquo;est original de demander un numéro de téléphone pour contrôler que celui qui s&rsquo;inscrit n&rsquo;est pas un robot. Dans un premier temps, l&rsquo;utilisateur pourrait être choqué, mais après tout, c&rsquo;est du vocal que l&rsquo;on veut faire ici !</p>
<p><div id="attachment_105" style="width: 310px" class="wp-caption aligncenter"><a href="http://blog.developpez.com/adjanakis/files/2013/08/twilio-03-Number.png"><img src="http://blog.developpez.com/adjanakis/files/2013/08/twilio-03-Number-300x168.png" alt="Attribution du numéro de test" width="300" height="168" class="size-medium wp-image-105" /></a><p class="wp-caption-text"><br />
Attribution du numéro de test</p></div><br />
L&rsquo;attribution d&rsquo;un numéro de test est extrêmement rapide, on l&rsquo;obtient dans la foulée. Si vous ne comptez pas l&rsquo;utiliser tout de suite, twilio fournit dans son portail d&rsquo;administration la possibilité de rendre la ligne à nouveau disponible (release) pour d&rsquo;autres applications de test. J&rsquo;ai fait le test. Récupérer un nouveau numéro de test par la suite est tout aussi rapide que l&rsquo;obtention lors de l&rsquo;inscription. A noter également que si twilio n&rsquo;a rien de francophone, les numéros obtenus font bien partis de nos bons vieux numéros nationaux.</p>
<p><div id="attachment_106" style="width: 310px" class="wp-caption aligncenter"><a href="http://blog.developpez.com/adjanakis/files/2013/08/twilio-04-First-Step.png"><img src="http://blog.developpez.com/adjanakis/files/2013/08/twilio-04-First-Step-300x168.png" alt="Partir à la découverte de twilio" width="300" height="168" class="size-medium wp-image-106" /></a><p class="wp-caption-text">Partir à la découverte de twilio</p></div><br />
Ca y est, Vous avez obtenu le sésame, la bidouille récréative peut maintenant commencer en tentant de passer des appels et en se faisant appeler par l&rsquo;application mise en place par défaut pour votre compte.</p>
<p>Une fois ce premier contact réalisé, on peut se demander ce qui peut être fait maintenant. Si on a eu une première expérience du vocal, on peut par exemple commencer à chercher où l&rsquo;on doit mettre le lien pour accéder à notre application <a href="http://fr.wikipedia.org/wiki/VoiceXML" title="Qu'est-ce que VoiceXML" target="_blank">VoiceXML</a>. Ce serait faire fausse route. Twilio a pris le parti de ne pas utiliser un langage de communication standard afin, j&rsquo;imagine, de ne pas en subir les limites. A chaud et après un simple survol de la solution de twilio, je dirais que le TwiML possède les avantages suivants :</p>
<ul>
<li> Simplicité : Plus simple a prendre en main que le VoiceXML, il permet un apprentissage plus rapide pour un néophyte.</li>
<li> Directif : Je ne sais pas si c&rsquo;est le bon terme, mais ce qu&rsquo;il faut comprendre c&rsquo;est que la où le VoiceXML suppose la compréhension de l&rsquo;algorithme inhérent (<a href="http://www.w3.org/TR/voicexml20/#dml2.1.6" title="Form Interpretation Algorithm" target="_blank">FIA</a>), le TwiML permet d&rsquo;avoir le contrôle total de l&rsquo;application. Pour le débutant, là encore, c&rsquo;est plus simple et rassurant.</li>
<li> Modifiable : Des solutions existent avec le VoiceXML pour ouvrir le langage à de nouvelles fonctionnalités, mais Twilio a fait du SMS un cheval de bataille au même titre que la voix. Il aurait été peu évident de proposer quelque-chose de simple pour le vocal, mais plus complexe pour les messages écrits (ajout d&rsquo;objet spécifique pour le SMS alors que la voix est native en VoiceXML). Le TwiML est donc modifiable afin de le faire correspondre aux API que désire proposer twilio.</li>
</ul>
<p>Je vais m&rsquo;arrêter la pour ce qui est de la comparaison entre ces deux langages XML. La suite dans un prochain billet si cela intéresse du monde.</p>
<p>Les premiers pas avec twilio doivent se poursuivre, à mon humble avis, par la lecture de la documentation abondante présente sur le site, onglet &laquo;&nbsp;Docs&nbsp;&raquo;. C&rsquo;est en parcourant cette doc que vous apprendrez que connaître TwiML n&rsquo;est pas une obligation pour l&rsquo;élaboration d&rsquo;une application vocale, puisque des API existent pour le générer le code à partir des langages de développement les plus courants&#8230; et plus encore ! C&rsquo;est en écumant cette documentation que j&rsquo;ai notamment pu découvrir une <a href="https://www.twilio.com/docs/howto/voicemail" title="Voicemail" target="_blank">application de répondeur vocal</a> déjà créée en PHP et qu&rsquo;il suffisait d&rsquo;installer pour pouvoir la tester.</p>
<p><img src="http://www.twilio.com/packages/company/img/logos_downloadable_powerdby_large.png" width="540" height="192" align="center" alt="Powered by twilio" /> </p>
<p>Le tutorial correspondant (<a href="https://www.twilio.com/docs/howto/voicemail">https://www.twilio.com/docs/howto/voicemail</a>) étant bien détaillé, je ne vais pas revenir sur les étapes de la mise en place de ce répondeur vocal. Je peux juste témoigner que cela fonctionne pour peu que l&rsquo;on puisse mettre en place l&rsquo;application vocale sur un serveur PHP accessible depuis le net :). Le seul problème que j&rsquo;ai eu à déplorer était dû à la vétusté de mon hébergement chez OVH. Il faut un serveur PHP suffisamment récent, v5.3 minimum a priori. J&rsquo;ai donc simplement eu besoin d&rsquo;ajouter la ligne suivante dans mon fichier .htaccess.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SetEnv PHP_VER 5_4</div></div>
<p>Pour conclure, je vais donc tenter de répondre à une question qui se pose maintenant que l&rsquo;on sait qu&rsquo;un répondeur vocal perso peut être mis en place. A quoi ça sert ? La première réponse que je pourrais donner, c&rsquo;est que ça sert à mettre le pied à l&rsquo;étrier.Cette mise en bouche permet de mettre du vocal dans une application web. Vous trouverez par ailleurs dans les documentations de nombreux exemples permettant des interactions diverses avec des applications WEB. Drupal, par exemple, fait l&rsquo;objet d&rsquo;une API permettant émission et réception de SMS et d&rsquo;appel vocaux. Ces fonctionnalités s&rsquo;ouvrent à tout un chacun de façon relativement simple à mon goût.</p>
<p>Ma seconde réponse concernant l&rsquo;utilité de ce répondeur vocal, c&rsquo;est que c&rsquo;est tout à fait pertinent. Certes, nous sommes habitués à avoir un répondeur intégré à l&rsquo;offre de notre opérateur mobile, de notre fournisseur d&rsquo;accès à Internet ou encore, de notre combiné de téléphone. Mais pourquoi ne pas héberger soit même un répondeur unique et commun à tous nos téléphones ? Que ce soit sur mobile ou sur un compte de téléphonie SIP par exemple, c&rsquo;est tout à fait possible. On peut également travailler sur les fonctionnalités de l&rsquo;application. Et pourquoi ne pas aller plus loin en mettant en place un service à la sauce Google Voice ? Ce service n&rsquo;est pas encore disponible en France aux dernières nouvelles (elles datent un peu me concernant néanmoins), mais ce concept peut être pertinent ! </p>
<p><a href="http://youtu.be/cOZU7BOeQ58" title="Google Voice">Google Voice <img src="http://i1.ytimg.com/i/fBh8e6S55uXSQGIC50xPpw/mq1.jpg?v=88c219" alt="Google Voice" /></a></p>
<p>Voici donc ce que je pourrais dire de cette petite incursion dans le monde de twilio. Un moyen simple de création d&rsquo;application vocale. Un outil qui se conjugue parfaitement avec talend ESB, en tout cas d&rsquo;après le webinar plutôt bluffant auquel j&rsquo;ai pu assister. Néanmoins, ayant moi même travailler dans le domaine des applications vocales, en utilisant le standard VoiceXML, je ne peux pas dire que la solution de twilio s&rsquo;adapte à tout. En tout cas, je ne peux pas le dire après ce simple exemple. Pour moi, des questions restent ouvertes concernant l&rsquo;efficience des applications, leur maintenabilité et surtout, leur portage vers un éventuel prestataire concurrent. Après tout, OVH propose une offre alternative en VoiceXML plutôt bon marché&#8230; celle-ci fera peut-être l&rsquo;objet d&rsquo;un prochain article si j&rsquo;ai du temps à y consacrer.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mais où est JavaMake.jar ?</title>
		<link>https://blog.developpez.com/adjanakis/p7981/developpement/java/mais_ou_est_javamake_jar</link>
		<comments>https://blog.developpez.com/adjanakis/p7981/developpement/java/mais_ou_est_javamake_jar#comments</comments>
		<pubDate>Tue, 25 Aug 2009 11:32:01 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[C&#8217;est curieux comme parfois une recherche que l&#8217;on croyait simple peut finalement s&#8217;avérer compliquée. JavaMake, célèbre compilateur s&#8217;il en est se fait assez discret pour ce qui est de sa version packagée en jar, particulièrement pour ANT. Ainsi, lorsque l&#8217;on recherche sur le site officiel de ANT ou encore sur google, on arrive sur une l&#8217;URL du fameux outil de compilation en langage Java, mais sans être en mesure de pouvoir télécharger quoique ce soit&#8230; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C&rsquo;est curieux comme parfois une recherche que l&rsquo;on croyait simple peut finalement s&rsquo;avérer compliquée. JavaMake, célèbre compilateur s&rsquo;il en est se fait assez discret pour ce qui est de sa version packagée en jar, particulièrement pour ANT.</p>
<p>Ainsi, lorsque l&rsquo;on recherche sur le <a href="http://ant.apache.org/external.html">site officiel de ANT</a> ou encore sur google, on arrive sur une l&rsquo;URL du fameux <a href="http://www.experimentalstuff.com/Technologies/JavaMake/index.html">outil de compilation en langage Java</a>, mais sans être en mesure de pouvoir télécharger quoique ce soit&#8230;</p>
<p>Google est ton ami, mais ce n&rsquo;est qu&rsquo;après avoir compris que pleins d&rsquo;autres personnes ont la même requête mais que nul ne répond, que l&rsquo;on tombe enfin sur l&rsquo;URL qui sauve sa journée. J&rsquo;ouvre donc une nouvelle porte vers ce lien sacré :</p>
<p><strong><a href="https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_SMI-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=Ex-Java_Make_Tool-1.3.3-G-F@CDS-CDS_SMI">Téléchargement de javamake.jar et javamake-ant15.jar</a></strong></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Java] A la rencontre de JMF</title>
		<link>https://blog.developpez.com/adjanakis/p6330/developpement/java/java_a_la_rencontre_de_jmf</link>
		<comments>https://blog.developpez.com/adjanakis/p6330/developpement/java/java_a_la_rencontre_de_jmf#comments</comments>
		<pubDate>Sat, 06 Sep 2008 00:57:29 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Lors d&#8217;une recherche sur JMF, je me suis aperçu que les ressources francophones disponibles n&#8217;étaient pas particulièrement répandues sur la toile. En effet, si on trouve beaucoup des questions semées sur différents forums, on a finalement assez peu de réponses pertinentes. A cela s&#8217;ajoute la difficulté pour le débutant d&#8217;avoir une idée précise de ce qu&#8217;est JMF et de ce qu&#8217;il est possible d&#8217;en faire. Alors j&#8217;ai décidé d&#8217;apporter davantage de visibilité à un tutoriel [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Lors d&rsquo;une recherche sur JMF, je me suis aperçu que les ressources francophones disponibles n&rsquo;étaient pas particulièrement répandues sur la toile. En effet, si on trouve beaucoup des questions semées sur différents forums, on a finalement assez peu de réponses pertinentes. A cela s&rsquo;ajoute la difficulté pour le débutant d&rsquo;avoir une idée précise de ce qu&rsquo;est JMF et de ce qu&rsquo;il est possible d&rsquo;en faire. </p>
<p>Alors j&rsquo;ai décidé d&rsquo;apporter davantage de visibilité à un tutoriel qui me semble sympathique et dont je pense parcourir les pages au plus vite. Cette <a href="http://www.labo-sun.com/resource-fr-articles-998-1-java-j2se-jmf-java-media-framework.htm">Présentation de JMF</a> saura sans nul doute guider les novices dans la connaissance du framework.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Choco Solver</title>
		<link>https://blog.developpez.com/adjanakis/p6059/intelligence-artificielle/choco_solver</link>
		<comments>https://blog.developpez.com/adjanakis/p6059/intelligence-artificielle/choco_solver#comments</comments>
		<pubDate>Fri, 11 Jul 2008 22:20:22 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Intelligence Artificielle]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Choco est une librairie écrite en java permettant de faire ce que l&#8217;on appelle de la programmation par contraintes. Grossièrement, cela signifie que cette librairie permet de trouver pour chaque variable d&#8217;un problème, un ensemble de valeur satisfaisant des règles(contraintes) imposées. C&#8217;est le cas par exemple du problème du sudoku. Dans un tel contexte, les règles seront : Tous les nombres d&#8217;une ligne sont différents Tous les nombres d&#8217;une colonne sont différents Tous les nombres [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://choco.sourceforge.net/">Choco</a> est une librairie écrite en java permettant de faire ce que l&rsquo;on appelle de la programmation par contraintes. Grossièrement, cela signifie que cette librairie permet de trouver pour chaque variable d&rsquo;un problème, un ensemble de valeur satisfaisant des règles(contraintes) imposées. C&rsquo;est le cas par exemple du problème du sudoku. Dans un tel contexte, les règles seront :</p>
<ul>
<li> Tous les nombres d&rsquo;une ligne sont différents</li>
<li> Tous les nombres d&rsquo;une colonne sont différents</li>
<li> Tous les nombres des carrés de 3 cases de coté sont différents</li>
</ul>
<p>Le solveur permettra la résolution de la grille de sudoku en donnant des valeurs respectant les contraintes. L&rsquo;idée de cet article m&rsquo;est venu en fouillant dans de vieilles sources Java. Afin de démystifier le développement de programme pour la résolution d&rsquo;une grille de sudoku, voici quelques lignes de code qui pourraient presque prétendre les résoudre à coup sûr.</p>
<p><span id="more-44"></span></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/** <br />
&nbsp;* &nbsp;This program is free software; you can redistribute it and/or modify <br />
&nbsp;* &nbsp;it under the terms of the GNU General Public License as published by <br />
&nbsp;* &nbsp;the Free Software Foundation; either version 2 of the License, or <br />
&nbsp;* &nbsp;(at your option) any later version. <br />
&nbsp;* &nbsp; &nbsp; &nbsp;<br />
&nbsp;* &nbsp;This program is distributed in the hope that it will be useful, <br />
&nbsp;* &nbsp;but WITHOUT ANY WARRANTY; without even the implied warranty of <br />
&nbsp;* &nbsp;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. &nbsp;See the <br />
&nbsp;* &nbsp;GNU General Public License for more details. <br />
&nbsp;* &nbsp; <br />
&nbsp;* &nbsp;You should have received a copy of the GNU General Public License <br />
&nbsp;* &nbsp;along with this program; if not, write to the Free Software <br />
&nbsp;* &nbsp;Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA &nbsp;02110-1301 &nbsp;USA <br />
&nbsp;*/ <br />
package org.adjanakis.chokodoku; <br />
&nbsp;<br />
import choco.ContradictionException; <br />
import choco.Problem; <br />
import choco.integer.IntVar; <br />
&nbsp;<br />
/** <br />
&nbsp;* Chokodoku <br />
&nbsp;* &nbsp;<br />
&nbsp;* This program use to be an example of one usage of the choco-solver. This <br />
&nbsp;* application aims at easily solving any sudoku problem. All sudoku problem <br />
&nbsp;* hasn't been tested. If many solutions are possible, this program will not <br />
&nbsp;* be really accurate. <br />
&nbsp;* &nbsp;<br />
&nbsp;* Based on Choco 1.0b003 &nbsp;<br />
&nbsp;* &nbsp;<br />
&nbsp;* @author Adjanakis (http://code.adjanakis.org/) <br />
&nbsp;* @version 0.1.0 <br />
&nbsp;*/ <br />
public class Chokodoku { <br />
&nbsp;<br />
&nbsp; /** <br />
&nbsp; &nbsp;* Number of numbers on one side of the internal square. 3 is the usual value. <br />
&nbsp; &nbsp;*/ <br />
&nbsp; private static int CHOKODOKU_SIZE = 3; <br />
&nbsp;<br />
&nbsp; &nbsp; /** <br />
&nbsp; &nbsp; &nbsp;* Here is the description of the sudoku problem. Each number represents a value to <br />
&nbsp; &nbsp; &nbsp;* find or a value to get. The values to find are represented by a 0. &nbsp;<br />
&nbsp; &nbsp; &nbsp;*/ <br />
&nbsp; private static int[] pbDescr = new int[]{ <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 8,0,4,0,0,0,2,0,9, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0,0,9,0,0,0,1,0,0, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1,0,0,3,0,2,0,0,7, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0,5,0,1,0,4,0,8,0, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0,0,0,0,3,0,0,0,0, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0,1,0,7,0,9,0,2,0, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5,0,0,4,0,3,0,0,8, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0,0,3,0,0,0,4,0,0, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4,0,6,0,0,0,3,0,1 <br />
&nbsp; &nbsp; }; <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp;<br />
&nbsp; &nbsp; /** <br />
&nbsp; &nbsp; &nbsp;* The object used to represent the problem. It will store the constraint a the &nbsp;<br />
&nbsp; &nbsp; &nbsp;* possible value for each value of the sudoku. &nbsp;<br />
&nbsp; &nbsp; &nbsp;*/ <br />
&nbsp; private static Problem myPb = new Problem(); <br />
&nbsp; <br />
&nbsp; /** <br />
&nbsp; &nbsp;* Basic method to launch the program <br />
&nbsp; &nbsp;* @param args parameters are not used <br />
&nbsp; &nbsp;*/ <br />
&nbsp; public static void main(String[] args) { <br />
&nbsp; &nbsp; launch(); <br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; /** <br />
&nbsp; &nbsp;* Method used to resolve a sudoku problem. This problem is hard coded into this method. <br />
&nbsp; &nbsp;*/ <br />
&nbsp; public static void launch(){ <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; //The variables will be stored into a vector <br />
&nbsp; &nbsp; IntVar[] myPbVars = new IntVar[CHOKODOKU_SIZE*CHOKODOKU_SIZE*CHOKODOKU_SIZE*CHOKODOKU_SIZE]; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; //We attribute the possible value for each value of the problem into our vector. <br />
&nbsp; &nbsp; for( int i = 0; i &lt; CHOKODOKU_SIZE*CHOKODOKU_SIZE*CHOKODOKU_SIZE*CHOKODOKU_SIZE; i++ ){ <br />
&nbsp; &nbsp; &nbsp; if( pbDescr[i] != 0 ){ <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //The value defined by the problem <br />
&nbsp; &nbsp; &nbsp; &nbsp; myPbVars[i] = myPb.makeEnumIntVar(null,pbDescr[i],pbDescr[i]); <br />
&nbsp; &nbsp; &nbsp; } else { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //The value is undefined. It may be on from 1 to the max value <br />
&nbsp; &nbsp; &nbsp; &nbsp; myPbVars[i] = myPb.makeEnumIntVar(null,1,CHOKODOKU_SIZE*CHOKODOKU_SIZE); <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; //Creation of the sudoku constraint <br />
&nbsp; &nbsp; for( int i = 0; i &lt; 9; i++){ <br />
&nbsp; &nbsp; &nbsp; IntVar[] bufIntVarsRow &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= new IntVar[CHOKODOKU_SIZE*CHOKODOKU_SIZE]; <br />
&nbsp; &nbsp; &nbsp; IntVar[] bufIntVarsColumn &nbsp; &nbsp; &nbsp; &nbsp; = new IntVar[CHOKODOKU_SIZE*CHOKODOKU_SIZE]; <br />
&nbsp; &nbsp; &nbsp; IntVar[] bufIntVarsInternalSquare = new IntVar[CHOKODOKU_SIZE*CHOKODOKU_SIZE]; <br />
&nbsp; &nbsp; &nbsp; for( int j = 0; j &lt; 9; j++){ <br />
&nbsp; &nbsp; &nbsp; &nbsp; bufIntVarsRow[j] &nbsp; = myPbVars[ i*CHOKODOKU_SIZE*CHOKODOKU_SIZE + j ]; <br />
&nbsp; &nbsp; &nbsp; &nbsp; bufIntVarsColumn[j] = myPbVars[ j*CHOKODOKU_SIZE*CHOKODOKU_SIZE + i ]; <br />
&nbsp; &nbsp; &nbsp; &nbsp; bufIntVarsInternalSquare[j] &nbsp; = myPbVars[ (i%CHOKODOKU_SIZE)*CHOKODOKU_SIZE + <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j%CHOKODOKU_SIZE + <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (i/CHOKODOKU_SIZE)*CHOKODOKU_SIZE*CHOKODOKU_SIZE*CHOKODOKU_SIZE + <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (j/CHOKODOKU_SIZE)*CHOKODOKU_SIZE*CHOKODOKU_SIZE]; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; //All values of a line must be different <br />
&nbsp; &nbsp; &nbsp; myPb.post(myPb.allDifferent(bufIntVarsRow)); <br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; //All value of a column must be different <br />
&nbsp; &nbsp; &nbsp; myPb.post(myPb.allDifferent(bufIntVarsColumn)); <br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; //All value of an internal square must be different <br />
&nbsp; &nbsp; &nbsp; myPb.post(myPb.allDifferent(bufIntVarsInternalSquare)); <br />
&nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; try { <br />
&nbsp; &nbsp; &nbsp; &nbsp; //Have the unique solution of the problem if it exists, or an approximation <br />
&nbsp; &nbsp; &nbsp; myPb.propagate(); <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; catch (ContradictionException e) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; //Solving the problem is not possible <br />
&nbsp; &nbsp; &nbsp; System.err.println(&quot;This problem is over-constrained&quot;); <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; System.out.println(&quot;solve&quot;); <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; //Display the result found <br />
&nbsp; &nbsp; for( int i = 0; i &lt; 9; i++){ <br />
&nbsp; &nbsp; &nbsp; for( int j = 0; j &lt; 9; j++){ <br />
&nbsp; &nbsp; &nbsp; &nbsp; System.out.print(&quot; &quot; + myPbVars[i*9+j].getVal()); <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; System.out.println(); <br />
&nbsp; &nbsp; } <br />
&nbsp; } <br />
}</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CMS: Xoops</title>
		<link>https://blog.developpez.com/adjanakis/p2679/developpement/web/cms_xoops</link>
		<comments>https://blog.developpez.com/adjanakis/p2679/developpement/web/cms_xoops#comments</comments>
		<pubDate>Thu, 18 Jan 2007 23:05:00 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Système de gestion de contenu modulable et complet, xoops est un outil qui mérite d&#8217;être connu. La création d&#8217;un site web, personnelement, je n&#8217;en suis pas friand. Devoir faire tout le graphisme, créer des pages particulières par-ci par-là, bref&#8230; Ca ne rime à rien de tout commencer depuis le début à moins que ce ne soit à des fins éducatives. De nos jours, il est si simple d&#8217;aller chercher un script PHP tout fait qui [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Système de gestion de contenu modulable et complet, xoops est un outil qui mérite d&rsquo;être connu. La création d&rsquo;un site web, personnelement, je n&rsquo;en suis pas friand. Devoir faire tout le graphisme, créer des pages particulières par-ci par-là, bref&#8230; Ca ne rime à rien de tout commencer depuis le début à moins que ce ne soit à des fins éducatives. De nos jours, il est si simple d&rsquo;aller chercher un script PHP tout fait qui permette de gérer son contenu. </p>
<p>Parmi ces scripts tout fait, Xoops est celui qui retient mon suffrage. Si la première prise en main a été un peu compliquée à cause d&rsquo;un problème de conf indépendante du script, je ne jure maintenant que par cet outil pour la réalisation de sites web. Xoops contient des outils de bases très fournis: articles, gestion d&rsquo;utilisateur, sondage, etc. Xoops peut également être agrémenter le cas échéant par des produits supplémentaires pour des besoins plus spécifiques comme la gestion de photos, de ventes ou encore de clan. Avant la création d&rsquo;un site à ambition communautaire, n&rsquo;hésitez plus ! Passez jeter un coup d&rsquo;oeil <a href="http://www.frxoops.org">ici</a> :).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compter les points au tarot</title>
		<link>https://blog.developpez.com/adjanakis/p2677/developpement/java/compter_les_points_au_tarot</link>
		<comments>https://blog.developpez.com/adjanakis/p2677/developpement/java/compter_les_points_au_tarot#comments</comments>
		<pubDate>Thu, 18 Jan 2007 22:30:00 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce soir, je voulais parler d&#8217;une application que j&#8217;ai faite il y a bien longtemps maintenant et dont l&#8217;objectif est de compter les points au tarot. Malheureusement, suite à un problème technique, je ne peux pas diffuser le jar de l&#8217;application J2ME. Je ne peux donc pas offrir cette oeuvre(un bien grand mot) pour bêta test. Dommage ! J&#8217;aurai bien voulu avoir un petit retour sur l&#8217;ergonomie et sur les fonctionnalités. Je reviendrai donc un [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ce soir, je voulais parler d&rsquo;une application que j&rsquo;ai faite il y a bien longtemps maintenant et dont l&rsquo;objectif est de compter les points au tarot. Malheureusement, suite à un problème technique, je ne peux pas diffuser le jar de l&rsquo;application J2ME. Je ne peux donc pas offrir cette oeuvre(un bien grand mot) pour bêta test. Dommage ! J&rsquo;aurai bien voulu avoir un petit retour sur l&rsquo;ergonomie et sur les fonctionnalités. Je reviendrai donc un peu plus tard pour mettre à jour ce billet&#8230; enfin, si quelqu&rsquo;un, au moins, est interessé par une telle appli :o). Y a-t-il des fans de tarot dans la salle ?</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Faire son shoot&#8217;em up J2ME</title>
		<link>https://blog.developpez.com/adjanakis/p2678/developpement/java/faire_son_shoot_em_up_j2me</link>
		<comments>https://blog.developpez.com/adjanakis/p2678/developpement/java/faire_son_shoot_em_up_j2me#comments</comments>
		<pubDate>Tue, 16 Jan 2007 22:00:00 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Les développements mobiles sont une autres tendances de la mode. Lorsque j&#8217;ai commencé à y jeté un coup d&#8217;oeil il y a maintenant presqu&#8217;un an, j&#8217;ai été étonné de la simplicité d&#8217;utilisation de J2ME. Muni du SDK compatible avec mon mobile et d&#8217;un eclipse des familles, n&#8217;importe quel développeur Java peut trouver son bonheur. Je me souviens en particulier d&#8217;un exemple fournit dans le SDK qui montrait de la plus simple des manières comment faire [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Les développements mobiles sont une autres tendances de la mode. Lorsque j&rsquo;ai commencé à y jeté un coup d&rsquo;oeil il y a maintenant presqu&rsquo;un an, j&rsquo;ai été étonné de la simplicité d&rsquo;utilisation de J2ME. Muni du <a href="http://www.forum.nokia.com/main/platforms/s60/index.html">SDK</a> compatible avec mon mobile et d&rsquo;un <a href="http://www.eclipse.org/">eclipse</a> des familles, n&rsquo;importe quel développeur Java peut trouver son bonheur. Je me souviens en particulier d&rsquo;un exemple fournit dans le SDK qui montrait de la plus simple des manières comment faire évoluer un vaisseau spatial dans un monde virtuel. En modifiant ces sources, il était aisé d&rsquo;ajouter les fonctionnalités permettant de créer un véritable shoot&rsquo;em up.</p>
<p>Aujourd&rsquo;hui, je suis heureux de voir comment le développement J2ME a pu se démocratiser. On le vois notamment à travers toutes les applications gratuites disponibles sur <a href="http://www.s60.com/life">le site officiel de la série 60</a> de Nokia ou encore sur le site <a href="http://www.getjar.com/">getjar.com</a> qui ouvre en grand les portes aux développements amateurs. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Possibilité de Géolocalisation</title>
		<link>https://blog.developpez.com/adjanakis/p2675/developpement/java/possibilite_de_geolocalisation</link>
		<comments>https://blog.developpez.com/adjanakis/p2675/developpement/java/possibilite_de_geolocalisation#comments</comments>
		<pubDate>Mon, 15 Jan 2007 22:00:00 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Au cours d&#8217;un petit surf sur le net, j&#8217;ai trouvé un petit article qui suit parfaitement l&#8217;air du temps. J2ME et Géolocalisation, un si joli mariage n&#8217;est-il pas ? Dans un registre un peu plus technique, vous trouverez également ce lien. La géolocalisation est une actualité. Les téléphones portables permettent déjà sous certaines conditions d&#8217;être géolocalisé(accord de l&#8217;utilisateur) et les outils de géolocalisation se multiplient. Voyez par exemple ce blog. Bref, c&#8217;est un domaine en [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Au cours d&rsquo;un petit surf sur le net, j&rsquo;ai trouvé un petit <a href="http://www.lsis.org/~colonnafm/docs/PDF/Colonna-IHM05.pdf">article </a>qui suit parfaitement l&rsquo;air du temps. J2ME et Géolocalisation, un si joli mariage n&rsquo;est-il pas ? Dans un registre un peu plus technique, vous trouverez également <a href="http://reseau.echelon.free.fr/reseau.echelon/geolocalisation.htm">ce lien</a>. La géolocalisation est une actualité. Les téléphones portables permettent déjà sous certaines conditions d&rsquo;être géolocalisé(accord de l&rsquo;utilisateur) et les outils de géolocalisation se multiplient. Voyez par exemple <a href="http://blog.developpez.com/index.php?blog=2&amp;p=2719&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1#more2719">ce blog</a>. Bref, c&rsquo;est un domaine en plein boum et les nouvelles idées ne tarissent pas !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Challenge de programmation Java</title>
		<link>https://blog.developpez.com/adjanakis/p2214/breves/code_invaders</link>
		<comments>https://blog.developpez.com/adjanakis/p2214/breves/code_invaders#comments</comments>
		<pubDate>Fri, 14 Jul 2006 10:00:02 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Brèves]]></category>
		<category><![CDATA[Intelligence Artificielle]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le nouveau né des framework de programmation ludique d&#8217;IBM a officiellement vu le jour le 29 juin dernier et se prénomme : CodeInvaders Challenge ! Le but est cette fois-ci de programmer le comportement d&#8217;un vaisseau spatial avide d&#8217;énergie au point de détruire ses concurrents. Ce challenge est ouvert à tous et est accessible du programmeur débutant au plus chevronné d&#8217;entre nous. Alors pour les futurs participants, bonne chance et faites un petit coucou de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img src="http://www.alphaworks.ibm.com/awss.nsf/E7C77CE3E9D4ED5E8825719A006B7D44/$File/codeinvaders01-thumb.jpg" alt="CodeInvaders ScreenShot" title="Arène de CodeInvaders" align="left" /><br />
</p>
<p>Le nouveau né des framework de programmation ludique d&rsquo;IBM a officiellement vu le jour le 29 juin dernier et se prénomme : <a href="http://www.alphaworks.ibm.com/tech/codeinvaders?open&amp;S_TACT=105AGX59&amp;ca=dgr-GRTARGETcodeinvaders">CodeInvaders Challenge</a> !</p>
<p></p>
<p>Le but est cette fois-ci de programmer le comportement d&rsquo;un vaisseau spatial avide d&rsquo;énergie au point de détruire ses concurrents. Ce challenge est ouvert à tous et est accessible du programmeur débutant au plus chevronné d&rsquo;entre nous. Alors pour les futurs participants, bonne chance et faites un petit coucou de temps en temps par ici histoire d&rsquo;échanger des idées de stratégie ou des vaisseaux pour les tests :o).</p>
<p></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
