<?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>Blog d&#039;un développeur &#187; Développement</title>
	<atom:link href="https://blog.developpez.com/mgibert/pcategory/developpement/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/mgibert</link>
	<description></description>
	<lastBuildDate>Fri, 28 Oct 2011 20:09:12 +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>Trucs et astuces pour Talend Open Studio</title>
		<link>https://blog.developpez.com/mgibert/p10449/developpement/trucs_et_astuces_pour_talend_open_studio</link>
		<comments>https://blog.developpez.com/mgibert/p10449/developpement/trucs_et_astuces_pour_talend_open_studio#comments</comments>
		<pubDate>Fri, 28 Oct 2011 20:09:12 +0000</pubDate>
		<dc:creator><![CDATA[mikael.gibert]]></dc:creator>
				<category><![CDATA[Développement]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Talend Open Studio est un ETL Open Source puissant et facile d&#8217;accès. Il repose sur une communauté très active et se base sur le concept de composants. La richesse de sa panoplie de composants, tant Open Source que propriétaire en est l&#8217;un de ses points forts. Métadonnées Talend propose la notion de métadonnée pour éditer des schémas qui reviennent souvent. Les données à ajouter à ce niveau sont tous les schémas des données que vous [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Talend Open Studio est un ETL Open Source puissant et facile d&rsquo;accès. Il repose sur une communauté très active et se base sur le concept de composants. La richesse de sa panoplie de composants, tant Open Source que propriétaire en est l&rsquo;un de ses points forts.</p>
<p><strong>Métadonnées</strong><br />
Talend propose la notion de métadonnée pour éditer des schémas qui reviennent souvent. Les données à ajouter à ce niveau sont tous les schémas des données que vous utilisez : tables de base de données, fichiers, services web, &#8230;</p>
<p><strong>Contextes</strong><br />
Les éléments de contexte sont les éléments qui vont paramétrer vos jobs. Tout ce qui est variable doit donc être ajouté comme élément de contexte. On y retrouve en général les informations de connexion à une base de données, des noms de fichiers, des adresses de services web, &#8230;<br />
Ces paramètres pourront être fixés avant l&rsquo;export des jobs (autonomes, services web, &#8230;) ou passés en paramètres lors de leur appel.</p>
<p><strong>Performances</strong><br />
Un gros piège quand on débute avec Talend, c&rsquo;est son côté user friendly. Tout se fait intuitivement et on ne sait pas toujours ce qui se passe. Cela se traduit par des problèmes de performances ou des comportements inattendus.</p>
<ul>
<li><em>Réutilisez vos connexions</em><br />
  Avant d&rsquo;utiliser des éléments d&rsquo;I/O sur des SGBD (tMySQLInput, tOracleOutput, &#8230;), ajoutez un composant tXXXConnection et cochez la case &laquo;&nbsp;Utiliser une connexion existante&nbsp;&raquo; dans les paramètres de vos composants d&rsquo;I/O, sans quoi Talend rouvrira une connexion pour chaque élément.</li>
<li><em>Paramétrez vos tMap</em><br />
  Le composant tMap, puissant et simple d&rsquo;utilisation est un piège courant dans l&rsquo;utilisation de Talend. Son fonctionnement par défaut consiste à charger toutes les lignes du mapping en mémoire. Si vous manipulez des volumes importants, songez à utiliser un fichier de stockage temporaire. Les paramètres du tMap vous permettent d&rsquo;utiliser un tel fichier à partir d&rsquo;un nombre limite de lignes chargées.</li>
<li><em>Privilégiez le SQL</em><br />
  Les composants de Talend (tMap, tJoin, &#8230;) chargent tout en mémoire. Les filtres sur les composants en entrée, les jointures sont réalisées sur les données déjà chargées en mémoire. Par ailleurs, le comportement par défaut des tXXXInput consiste à faire un &laquo;&nbsp;select * from &#8230;&nbsp;&raquo;. Vous chargez donc l&rsquo;ensemble des tables en mémoire, puis filtrez/joignez sur ces données. Pour améliorer les performances : ne sélectionnez que les éléments donc vous avez besoin dans les tXXXInput, filtrez directement en SQL (ajoutez une clause WHERE dans les tXXXInput) plutôt que dans les tMap et en règle générale, limitez le nombre d&rsquo;éléments que vous remontez en mémoire.</li>
</ul>
<p><strong>Pièges</strong><br />
Une petite liste de pièges :</p>
<ul>
<li>Vous utilisez un composant tXXXConnection pour chaque I/O avec une source de données pourtant, les insertions ne se font pas. Pensez à ajouter un tXXXCommit sur réussite du sous job qui contient l&rsquo;insertion.</li>
<li>Vous utilisez un composant tXXXConnection pour chaque I/O avec une source de données. Tout se déroule bien quand vous exécutez le job depuis Talend, mais dès que vous l&rsquo;exportez vous obtenez un NullPointerException. Pensez à lier votre composant tXXXConnection à votre job avec un lien &laquo;&nbsp;OnComponentOK&nbsp;&raquo; ou &laquo;&nbsp;OnSubjobOK&nbsp;&raquo; (dans le cadre d&rsquo;un composant isolé comme une connexion, l&rsquo;effet est le même).</li>
<li>Votre job plante et finit par corrompre votre base de données. Ajoutez un composant tXXXRollback sur erreur du sous job. Attention, cela ne fonctionnera que pour les données qui n&rsquo;ont pas été committées pour la connexion que vous choisissez. C&rsquo;est à dire qu&rsquo;il faut absolument que tous les composants d&rsquo;I/O sur la source de données utilisent cette connexion.</li>
<li>Pour être sûr de faire le bon mapping dans un tMap, vous exécutez d&rsquo;abord une requête dans un client SQL quelconque. Une fois que ca fonctionne, vous la transposez au monde Talend en testant au fur et à mesure et surprise, ca ne fonctionne plus. Certains SGBD ne sont pas sensibles aux accents ou à la casse tandis que Talend l&rsquo;est. Une requête de comparaison entre deux chaînes peut fonctionner dans votre client et échouer dans Talend. Vous pouvez transformer un peu les chaînes chargées à l&rsquo;aide des routines Talend (TalendString et sa méthode removeAccents par exemple&#8230;) </li>
<li>Vous obtenez des messages indiquant des erreurs sur le type. Lorsqu&rsquo;il récupère des schémas à partir de sources de données, Talend a tendance à modifier les types des données. C&rsquo;est ainsi que, sur MySQL, les int deviennent des long par exemple. De même, il se peut que vous vouliez utiliser un wrapper java pour un type primitif (Integer au lieu de int&#8230;). Dans ce cas pensez à cocher l&rsquo;option &laquo;&nbsp;Nullable&nbsp;&raquo; lors de la définition du schéma.
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modularisation en Java et .NET</title>
		<link>https://blog.developpez.com/mgibert/p10367/developpement/title_208</link>
		<comments>https://blog.developpez.com/mgibert/p10367/developpement/title_208#comments</comments>
		<pubDate>Thu, 06 Oct 2011 14:57:16 +0000</pubDate>
		<dc:creator><![CDATA[mikael.gibert]]></dc:creator>
				<category><![CDATA[Développement]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[L&#8217;enfer de la distribution, un problème bien connu des développeurs de tous bords. Microsoft y a longtemps été confronté au travers de ce qu&#8217;on appelait alors le DLL Hell, l&#8217;écosystème Java s&#8217;y frotte encore avec son Jar Hell. DLL Hell : Problème survenant au fil des installations, mises à jour, et désinstallations de produit d&#8217;éditeurs multiples manipulant des DLLs communes, ce qui aboutit à la mise en place de versions incompatibles, de sorte qu&#8217;il n&#8217;est [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>L&rsquo;enfer de la distribution, un problème bien connu des développeurs de tous bords. Microsoft y a longtemps été confronté au travers de ce qu&rsquo;on appelait alors le DLL Hell, l&rsquo;écosystème Java s&rsquo;y frotte encore avec son Jar Hell. </p>
<p><strong>DLL Hell :</strong><br />
Problème survenant au fil des installations, mises à jour, et désinstallations de produit d&rsquo;éditeurs multiples manipulant des DLLs communes, ce qui aboutit à la mise en place de versions incompatibles, de sorte qu&rsquo;il n&rsquo;est pas rare que l&rsquo;installation d&rsquo;une application ou sa mise à jour cause la perte de fonctionnement d&rsquo;une autre application, notamment d&rsquo;un autre éditeur.</p>
<p><strong>Jar Hell :</strong><br />
Le format Jar est difficile à gérer, à packager et à distribuer. Des dépendances incompatibles, des versions en conflits sont autant de problèmes connus et identifiés dans le monde Java sous le nom de Jar Hell.</p>
<p><strong>Solutions</strong><br />
Avec .NET, Microsoft a pallié au problème du DLL Hell en refondant en profondeur les mécanismes des DLL. Le packaging et la distribution sont un des points forts de .NET : plusieurs modules peuvent cohabiter sous des versions différentes. La solution mise en oeuvre prend en compte  des métadonnées d&rsquo;assembly (numéro de version, clé publique, langue, &#8230;) pour créer un nom fort unique pour une DLL.</p>
<p>Java, de son côté, a commencé à parler de Java Module System en 2005 via la JSR 277 qui devrait permettre de modulariser Java et de résoudre le Jar Hell. Ainsi, plusieurs versions d&rsquo;un module pourront cohabiter et les dépendances à une version seront indiquées dans les métadonnées du module. On pourra ainsi dire que le module A utilise les version 3 et + du module B par exemple.</p>
<p><strong>Pour conclure&#8230;</strong><br />
Les technologies concurrentes Java et .NET ont dû faire face au problème du packaging et de la gestion des versions. Chacune à sa manière a dû trouver une solution. Je regrette seulement que la solution de Java ait été aussi longue à apparaitre sur la RoadMap alors que .NET a pris le problème à bras le corps assez tôt (2000).</p>
<p>Non pas de grande explication sur la façon dont sera implémenté Java Module System dans Java 8. Pour cela je vous invite à jeter un oeil sur le projet Jigsaw et à lire les excellents articles sur les blogs de <a href="http://blog.xebia.fr/2010/03/01/revue-de-presse-xebia-149/">Xebia</a> et <a href="http://blog.ippon.fr/2010/12/02/java-module-ou-la-disparition-du-classpath/">d&rsquo;Ippon Technology</a>. L&rsquo;article suivant explique la solution mise en oeuvre par Microsoft avec .NET : <a href="http://msdn.microsoft.com/fr-fr/library/ms973843.aspx">http://msdn.microsoft.com/fr-fr/library/ms973843.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lambda expressions</title>
		<link>https://blog.developpez.com/mgibert/p10366/developpement/lambda_expressions</link>
		<comments>https://blog.developpez.com/mgibert/p10366/developpement/lambda_expressions#comments</comments>
		<pubDate>Thu, 06 Oct 2011 13:12:04 +0000</pubDate>
		<dc:creator><![CDATA[mikael.gibert]]></dc:creator>
				<category><![CDATA[Développement]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Les lambda expression se font petit à petit une place dans le monde des langages orientés objets. C&#8217;est ainsi qu&#8217;on les retrouve dans le framework .NET à partir de la version 3 et dans le JDK dans sa future version 8. Définitions Une expression lambda est une fonction anonyme qui peut contenir des expressions et des instructions, et peut être utilisée pour créer des délégués ou des types d&#8217;arborescence d&#8217;expression (MSDN). Lambda expressions are anonymous [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Les lambda expression se font petit à petit une place dans le monde des langages orientés objets. C&rsquo;est ainsi qu&rsquo;on les retrouve dans le framework .NET à partir de la version 3 et dans le JDK dans sa future version 8. </p>
<p><strong>Définitions</strong></p>
<ul>
<li>Une expression lambda est une fonction anonyme qui peut contenir des expressions et des instructions, et peut être utilisée pour créer des délégués ou des types d&rsquo;arborescence d&rsquo;expression (MSDN).</li>
<li>Lambda expressions are anonymous functions, aimed at addressing the &laquo;&nbsp;vertical problem&nbsp;&raquo; by replacing the machinery of anonymous inner classes with a simpler mechanism (OpenJDK).
  </li>
<li>Une expression lambda est une fonction anonyme qui capture son environnement : &#955; xy.5+x capture x et y.</li>
</ul>
<p><strong>Un peu d&rsquo;histoire</strong><br />
Historiquement, les lambda expressions nous arrivent tout droit du lambda calcul.</p>
<p>Le lambda-calcul (ou &#955;-calcul) est un système formel inventé par Alonzo Church dans les années 1930, qui fonde les concepts de fonction et d&rsquo;application. Il a été le premier formalisme utilisé pour définir et caractériser les fonctions récursives et donc il a une grande importance dans la théorie de la calculabilité, à l&rsquo;égal des machines de Turing et du modèle de Herbrand-Gödel. </p>
<p>Le lambda calcul définit des entités syntaxiques que l&rsquo;on appelle des lambda-termes (ou parfois aussi des lambda expressions) et qui se rangent en trois catégories :</p>
<ul>
<li>les variables : x, y&#8230; sont des lambda-termes ;</li>
<li>les applications : u v est un lambda-terme si u et v sont des lambda-termes ;</li>
<li>les abstractions : &#955; x.v est un lambda-terme si x est une variable et v un lambda-terme.</li>
</ul>
<p>L’application peut être vue ainsi : si u est une fonction et si v est son argument, alors u v est le résultat de l&rsquo;application à v de la fonction u. L’abstraction &#955; x.v peut être interprétée comme la formalisation de la fonction qui, à x, associe v, où v contient en général des occurrences de x (wikipédia).</p>
<p>Le lambda-calcul est à l&rsquo;origine du paradigme fonctionnel qui s&rsquo;est illustré au début de l&rsquo;informatique par les langages suivants (entre autres) :</p>
<ul>
<li>Lisp (1959)</li>
<li>Scheme (1975)</li>
<li>ML (1897)</li>
<li>Erlang (1987)</li>
<li>Haskell (1990)</li>
</ul>
<p>Après avoir été délaissé au profit de langages orientés objets tels que C++, Java et C#, le paradigme fonctionnel revient sur le devant de la scène. C&rsquo;est ainsi que chacun de ces langages se dote à son tour de traits fonctionnels (closure pour Java 8, lambda pour .NET 3). </p>
<p><strong>Pourquoi ce retour ?</strong><br />
Si les langages les plus utilisés se dotent de traits fonctionnels, ce n&rsquo;est pas par hasard. Ceci est étroitement lié à la multiplication des nombres de processeurs dans les machines actuelles. </p>
<p>Le paradigme fonctionnel (pur) permet d&rsquo;écrire du code dénué d&rsquo;effets de bords, ce qui le rend sûr, prouvable mais surtout facile à paralléliser. L&rsquo;absence d&rsquo;effets de bords permet d&rsquo;éliminer une partie des problèmes inhérents à la programmation concurrente. C&rsquo;est ce qui fait le succès d&rsquo;Erlang (RabbitMQ, Riak, Zotonic, &#8230;).</p>
<p>Scénarios types des langages fonctionnels :</p>
<ul>
<li>Calcul formel</li>
<li>Compilation/Interprétation</li>
<li>Structures de données arborescentes</li>
</ul>
<p><strong>Conclusion</strong><br />
Je ne pense pas que les langages fonctionnels puissent vraiment revenir dans une industrie où C++, Java et .NET sont aussi présents. Nous assistons pour le moment à l&rsquo;arrivée de traits fonctionnels dans ces langages et cela s&rsquo;arrêtera probablement à la notion de fonction anonyme et de fermeture. En revanche, avec le niveau de sûreté nécessaire dans certains systèmes, le paradigme fonctionnel a encore de beaux jours devant lui.</p>
<p>Pour l&rsquo;anecdote de fin, le concept de map/reduce, utilisé dans les bases de données est une notion empruntée aux langages fonctionnels.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
