<?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</title>
	<atom:link href="https://blog.developpez.com/adjanakis/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>[Linux] OpenSuse 11.1 est arrivé</title>
		<link>https://blog.developpez.com/adjanakis/p6968/linux/linux_opensuse_11_1_est_arrive</link>
		<comments>https://blog.developpez.com/adjanakis/p6968/linux/linux_opensuse_11_1_est_arrive#comments</comments>
		<pubDate>Fri, 19 Dec 2008 00:33:00 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le 18 décembre aura marqué la fin du compte-à-rebours. L&#8217;attente des utilisateurs a été comblée par l&#8217;arrivée le jour J de la nouvelle mouture de la distribution chère à Novell. Afin de partir à la découverte de ce No[u]vel[l] Opus voici quelques liens : Téléchargement Listes des composants majeurs Découverte de morceaux choisis Site Officiel]]></description>
				<content:encoded><![CDATA[<p><img src="http://image.spreadshirt.net/image-server/image/design/4324763/type/png/width/190/height/190" alt="OpenSuse" title="OpenSuse" align="right" />Le 18 décembre aura marqué la fin du compte-à-rebours. L&rsquo;attente des utilisateurs a été comblée par l&rsquo;arrivée le jour J de la nouvelle mouture de la distribution chère à Novell. Afin de partir à la découverte de ce No[u]vel[l] Opus voici quelques liens :</p>
<ul>
<li><a href="http://software.opensuse.org/">Téléchargement</a></li>
<li><a href="http://en.opensuse.org/Featurelist_11.1">Listes des composants majeurs</a></li>
<li><a href="http://news.opensuse.org/">Découverte de morceaux choisis</a></li>
<li><a href="http://www.opensuse.org">Site Officiel</a></li>
</ul>
]]></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>Talend Open Profiler</title>
		<link>https://blog.developpez.com/adjanakis/p5955/software/talend_open_profiler</link>
		<comments>https://blog.developpez.com/adjanakis/p5955/software/talend_open_profiler#comments</comments>
		<pubDate>Mon, 23 Jun 2008 20:20:58 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Les développeurs aiment le Talend et Talend le leur rend bien. Oui, j&#8217;ose le dire ! Amateur de la manipulation de données, j&#8217;ai découvert Talend pour la première fois au salon Solutions Linux 2006. J&#8217;ai attendu avec intérêt la première release sortie pour l&#8217;été suivant, puis pris goût à cet environnement Eclipse familier, à cette architecture relativement simple à maitriser et ensuite à ces premiers pas si excitants qui ont été appuyés de belle manière [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Les développeurs aiment le Talend et Talend le leur rend bien. Oui, j&rsquo;ose le dire ! Amateur de la manipulation de données, j&rsquo;ai découvert Talend pour la première fois au salon Solutions Linux 2006. J&rsquo;ai attendu avec intérêt la première release sortie pour l&rsquo;été suivant, puis pris goût à cet environnement Eclipse familier, à cette architecture relativement simple à maitriser et ensuite à ces premiers pas si excitants qui ont été appuyés de belle manière par des tuto assez sympa.</p>
<p>Aujourd&rsquo;hui, en scrutant le net, je m&rsquo;aperçois que je ne suis pas le seul à porter Talend Open Studio dans ma barre de lancement rapide(Mode Geek ON). Les communautés se battissent peu à peu, rendant la solution d&rsquo;intégration de données de plus en plus accessible. </p>
<p>Les développeurs aiment le Talend et Talend le leur rend bien. Toujours orienté vers la qualité de nos données, l&rsquo;éditeur sort maintenant un nouvel outil a expérimenter sans modération. Connaissant l&rsquo;historique, c&rsquo;est les yeux fermé que je vous invite à découvrir <a href="http://www.talend.com/blog/2008/06/23/talend-open-profiler-the-first-open-source-data-profiling-solution/trackback/">Talend Open Profiler</a>. </p>
<p>Ps: A l&rsquo;occasion, passez voir <a href="http://www.talend.com/blog/2008/06/20/parallel-online-communities-are-growing/trackback/">cet article</a> :).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ingres &#8211; Webinaire Haute Disponibilité</title>
		<link>https://blog.developpez.com/adjanakis/p5377/breves/ingres_webinaire_haute_disponibilite</link>
		<comments>https://blog.developpez.com/adjanakis/p5377/breves/ingres_webinaire_haute_disponibilite#comments</comments>
		<pubDate>Wed, 26 Mar 2008 22:28:41 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Autres SGBD]]></category>
		<category><![CDATA[Brèves]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[La haute disponibilité est un terme à la mode qui est actuellement un fer de lance pour la promotion de beaucoup de solutions matérielles ou logicielles. En matière de SGBD, chacun des grands acteurs du domaine y va de sa technique(ou plutôt ses techniques) pour assurer une Haute Disponibilité. Ingres fait parti de ces produits permettant d&#8217;obtenir une indisponibilité réduite et pour nous en convaincre, ingres-france propose un webinaire le jeudi 3 avril à partir [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>La haute disponibilité est un terme à la mode qui est actuellement un fer de lance pour la promotion de beaucoup de solutions matérielles ou logicielles. En matière de SGBD, chacun des grands acteurs du domaine y va de sa technique(ou plutôt ses techniques) pour assurer une Haute Disponibilité.</p>
<p>Ingres fait parti de ces produits permettant d&rsquo;obtenir une indisponibilité réduite et pour nous en convaincre, ingres-france propose un webinaire le jeudi 3 avril à partir de 15h00. Pour y participer, il vous suffit de suivre ce lien : <a href="https://ingres.webex.com/ingres/onstage/g.php?d=809515101&amp;t=a">Ingres &#8211; Haute Disponibilité</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haute Disponibilité et MySQL</title>
		<link>https://blog.developpez.com/adjanakis/p4995/sgbd/mysql/haute_disponibilite_et_mysql</link>
		<comments>https://blog.developpez.com/adjanakis/p4995/sgbd/mysql/haute_disponibilite_et_mysql#comments</comments>
		<pubDate>Tue, 29 Jan 2008 22:05:07 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[C&#8217;est dans l&#8217;air du temps, présent dans la plupart des applications critiques, le souci de la haute disponibilité taraude dans l&#8217;esprit des DBA. Personnellement, bien que ne faisant pas parti de l&#8217;ordre des administrateurs, je ne peux que remarquer l&#8217;intérêt croissant pour ce sujet qui arrive jusqu&#8217;en première page de notre cher magazine électronique developpez.com n°13. Je ne peux donc m&#8217;empêcher de ramener cela à MySQL. En effet, j&#8217;ai lu dernièrement un petit livre blanc [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C&rsquo;est dans l&rsquo;air du temps, présent dans la plupart des applications critiques, le souci de la haute disponibilité taraude dans l&rsquo;esprit des DBA. Personnellement, bien que ne faisant pas parti de l&rsquo;ordre des administrateurs, je ne peux que remarquer l&rsquo;intérêt croissant pour ce sujet qui arrive jusqu&rsquo;en première page de notre cher <a href="http://magazine.developpez.com/">magazine électronique developpez.com n°13</a>. </p>
<p>Je ne peux donc m&rsquo;empêcher de ramener cela à MySQL. En effet, j&rsquo;ai lu dernièrement un petit livre blanc relativement technique, dans lequel était proposé une solution de haute disponibilité basée sur MySQL, Linux Heartbeat et DRBD. Pour la découvrir, c&rsquo;est <a href="http://www.mysql.fr/why-mysql/white-papers/mysql_wp_drbd.php.fr">ICI</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Une année sans fumée</title>
		<link>https://blog.developpez.com/adjanakis/p4745/divers/quotidien/une_annee_sans_fumee</link>
		<comments>https://blog.developpez.com/adjanakis/p4745/divers/quotidien/une_annee_sans_fumee#comments</comments>
		<pubDate>Sun, 06 Jan 2008 22:22:24 +0000</pubDate>
		<dc:creator><![CDATA[Adjanakis]]></dc:creator>
				<category><![CDATA[Quotidien]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je ne résiste pas au plaisir de souhaiter à chacun de vous une belle et heureuse année 2008. Que cette année soit pleine de bonheur et de bonne santé. Sur ce dernier point, il faut croire que c&#8217;est bien parti ! En effet, avec l&#8217;interdiction de fumée dans les lieux publics, c&#8217;est les poumons qui peuvent enfin respirer. Alors oui, je sais, c&#8217;est un peu dur pour certains. J&#8217;ai donc décidé de rechercher un peu [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Je ne résiste pas au plaisir de souhaiter à chacun de vous une belle et heureuse année 2008. Que cette année soit pleine de bonheur et de bonne santé. Sur ce dernier point, il faut croire que c&rsquo;est bien parti ! En effet, avec l&rsquo;interdiction de fumée dans les lieux publics, c&rsquo;est les poumons qui peuvent enfin respirer. Alors oui, je sais, c&rsquo;est un peu dur pour certains. J&rsquo;ai donc décidé de rechercher un peu ce qui pourrait remplacer le plaisir de la nicotine pour un fumeur un peu Geek. Je vous invite alors à découvrir la <a href="http://www.pcinpact.com/actu/news/36336-ecigarette-Goldendragon-tabagisme-fumer-nico.htm">e-cigarette</a> qui accompagne qui le veut bien vers les sentiers de l&rsquo;arrêt du tabagisme. D&rsquo;accord, c&rsquo;est pas la solution ultime, mais c&rsquo;est l&rsquo;une des plus Geek ! Bon courage <img src="https://blog.developpez.com/adjanakis/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
