<?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>Développement Web &#38; Talend (ETL) - WT dev</title>
	<atom:link href="http://www.wtdev.fr/feed" rel="self" type="application/rss+xml" />
	<link>http://www.wtdev.fr</link>
	<description>Développement Web &#38; Talend (ETL) - Lyon 69</description>
	<lastBuildDate>Wed, 23 Jan 2013 07:56:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Talend Encryption (fonctions JAVA et PHP)</title>
		<link>http://www.wtdev.fr/talend-encryption-fonctions-java-et-php</link>
		<comments>http://www.wtdev.fr/talend-encryption-fonctions-java-et-php#comments</comments>
		<pubDate>Sun, 06 May 2012 21:54:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP (Sans framework)]]></category>
		<category><![CDATA[Talend]]></category>

		<guid isPermaLink="false">http://www.wtdev.fr/?p=407</guid>
		<description><![CDATA[Si vous cherchez à crypter et décrypter des informations (ex: mot de passe) en utilisant les technologies JAVA et PHP alors bonne nouvelle! Vous êtes sur la bonne page! Il m&#8217;est arrivé plusieurs fois de devoir lire des mots de passe avec Talend (en JAVA) dans une base de données. Tout programmeur sait qu&#8217;on NE [...]]]></description>
			<content:encoded><![CDATA[<p>Si vous cherchez à crypter et décrypter des informations (ex: mot de passe) en utilisant les technologies JAVA et PHP alors bonne nouvelle! Vous êtes sur la bonne page!</p>
<p>Il m&#8217;est arrivé plusieurs fois de devoir lire des mots de passe avec Talend (en JAVA) dans une base de données. Tout programmeur sait qu&#8217;on <strong>NE STOCK JAMAIS un mot de passe en clair</strong> dans une base de données. En général on utilise un hash du mot de passe qui nous permet de comparer les mots de passes sans les connaitre. Ces algorithmes sont unidirectionnel et il est donc impossible de retrouver le mot original (<em>sauf si l&#8217;on essaye le brute force avec une table de hash, mais bon cela est très compliqué et n&#8217;a pas énormément de chance de succès</em>)</p>
<p>Dans mon cas le problème est qu&#8217;il s&#8217;agit de mot de passe que l&#8217;on doit pouvoir décrypter (ex: mot de passe SMTP, FTP, &#8230;), on parle bien de Cryptage et Décryptage et non pas de hachage.</p>
<p>Le tout étant géré par une <a title="Interface Homme Machine" href="http://fr.wikipedia.org/wiki/Interaction_homme-machine" target="_blank">IHM</a> en PHP, il faut que le PHP encrypt et que la fonction JAVA décrypte. L&#8217;algorithme que j&#8217;ai choisi pour cela est Blowfish.</p>
<p>&nbsp;</p>
<h1>1. Encryption coté PHP avec BlowFish</h1>
<p>Voici une classe statique permettant de crypter et de décrypter des données avec l&#8217;algorithme BlowFish. Les méthodes utilisent les librairies <a href="http://www.php.net/manual/fr/book.mcrypt.php" target="_blank">Mcrypt</a>, il vous faudra donc <a href="http://www.php.net/manual/fr/book.mcrypt.php" target="_blank">activer cette extension</a> si ce n&#8217;est pas déjà le cas (très rare dans une installation par défaut).</p>
<blockquote>
<pre>&lt;?php
/**
 * BlowFishEncrypter
 * @see: http://www.developpez.net/forums/d649031/java/general-java/apis/securite/blowfish-php-java/
 */
class BlowFishEncrypter {

  public static function encryptBlowfish($cleartext, $key = null)
  {
    $cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_CBC, '');
    $key = substr($key, 0, mcrypt_enc_get_key_size($cipher));
    $iv = '00000000';

    // ajout du Padding.
    $cleartext_length = strlen($cleartext) % 8;
    for ($i = $cleartext_length; $i &lt; 8; $i++)
    {
      $cleartext .= chr(8 - $cleartext_length);
    }

    $cipherText = '';
    // 128-bit blowfish encryption:
    if (mcrypt_generic_init($cipher, $key, $iv) != -1)
    {
      // PHP pads with NULL bytes if $cleartext is not a multiple of the block size..
      $cipherText = mcrypt_generic($cipher, $cleartext);
      mcrypt_generic_deinit($cipher);
    }

    return base64_encode($cipherText);
  }

  public static function decryptBlowfish($encrypted, $key = null)
  {

    $encrypted = base64_decode($encrypted);

    $cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_CBC, '');
    $key = substr($key, 0, mcrypt_enc_get_key_size($cipher));
    $iv = '00000000';

    // 128-bit blowfish encryption:
    if (mcrypt_generic_init($cipher, $key, $iv) != -1)
    {
      // PHP pads with NULL bytes if $cleartext is not a multiple of the block size..
      $cleartext = mdecrypt_generic($cipher, $encrypted);
      mcrypt_generic_deinit($cipher);
    }

    // suppression du padding.
    $pad = ord(substr($cleartext, strlen($cleartext) - 1));
    if ($pad &gt; 0 &amp; $pad &lt;= 8)
    {
      $cleartext = substr($cleartext, 0, strlen($cleartext) - $pad);
    }

    return $cleartext;
  }

}</pre>
</blockquote>
<p>&nbsp;</p>
<h1> 2. Encryption coté JAVA avec BlowFish</h1>
<p>Voici son homologue en java, une fonction qui cryte et décrypte en JAVA. Vous pouvez utiliser ces fonctions dans Talend par exemple afin de récupérer des mots de passe pour un composant (ex: tFTP, tSSH,&#8230;) que vous auriez stocké dans une base de données depuis une <a title="Interface Homme Machine" href="http://fr.wikipedia.org/wiki/Interaction_homme-machine" target="_blank">IMH</a> en PHP.</p>
<blockquote>
<pre>import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;</pre>
<pre>/**
 * BlowFishEncrypter
 * @see: http://www.developpez.net/forums/d649031/java/general-java/apis/securite/blowfish-php-java/
 */</pre>
<pre>public class BlowFishEncrypter {

	public static String encryptBlowfish(String data, String Key) {

		try {

			String iv = "00000000";
			IvParameterSpec ivs = new IvParameterSpec(iv.getBytes());
			SecretKey secretKey = new SecretKeySpec(Key.getBytes(), "Blowfish");

			Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
			cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivs);

			BASE64Encoder enc = new BASE64Encoder();

			byte[] encoded = cipher.doFinal(data.getBytes());
			return enc.encode(encoded);
		} catch (Exception e) {
			System.out.println(e);
		}
		return null;

	}

	public static String decryptBlowfish(String data, String Key) {

		try {

			BASE64Decoder dec = new BASE64Decoder();
			byte[] decoded = dec.decodeBuffer(data);

			String iv = "00000000";
			IvParameterSpec ivs = new IvParameterSpec(iv.getBytes());

			SecretKey secretKey = new SecretKeySpec(Key.getBytes(), "Blowfish");

			Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
			cipher.init(Cipher.DECRYPT_MODE, secretKey, ivs);
			return new String(cipher.doFinal(decoded), "UTF8");
		} catch (Exception e) {
			System.out.println(e);
		}
		return null;

	}
}</pre>
</blockquote>
<p>&nbsp;</p>
<p>Voila! Ces fonctions vont vous permettre de crypter et décrypter librement des deux cotés : Java et PHP, en transitant par une base de données par exemple.</p>
<p style="text-align: center;">__________________</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wtdev.fr/talend-encryption-fonctions-java-et-php/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Empecher WordPress d&#8217;ajouter des tags &#171;&#160;p&#160;&#187; et &#171;&#160;br&#160;&#187; au post</title>
		<link>http://www.wtdev.fr/empecher-wordpress-dajouter-des-tags-et-au-post</link>
		<comments>http://www.wtdev.fr/empecher-wordpress-dajouter-des-tags-et-au-post#comments</comments>
		<pubDate>Wed, 14 Mar 2012 14:55:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.wtdev.fr/?p=375</guid>
		<description><![CDATA[Vous souhaitez créer une page qui affiche du contenu brûte? Type XML par exemple? Voici la solution pour que wordpress arrete de décorer votre texte avec des balises &#60;p&#62; et &#60;br /&#62;. Le responsable est la fonction wpautop(). A lui s&#8217;ajoute wptexturize() qui lui convertit certaines entités texte en entités HTML Il suffit de désactiver [...]]]></description>
			<content:encoded><![CDATA[<p>Vous souhaitez créer une page qui affiche du contenu brûte? Type XML par exemple?</p>
<p>Voici la solution pour que wordpress arrete de décorer votre texte avec des balises &lt;p&gt; et &lt;br /&gt;.</p>
<p>Le responsable est la fonction <em><strong>wpautop()</strong></em>. A lui s&#8217;ajoute <strong>wptexturize()</strong> qui lui convertit certaines entités texte en entités HTML</p>
<p>Il suffit de désactiver ces deux filtres qui sont appliqués par défaut dans <strong><em>&laquo;&nbsp;wp-includes/default-filters.php&nbsp;&raquo;</em></strong>. Si vous souhaitez le désactiver uniquement dans un template utilisez ces fonctions :</p>
<blockquote><p>remove_filter( &#8216;the_content&#8217;, &#8216;wpautop&#8217;);</p>
<p>remove_filter( &#8216;the_content&#8217;, &#8216;wptexturize&#8217;);</p></blockquote>
<p>Il est important d&#8217;utiliser la fonction <strong>get_the_content()</strong> et <span style="text-decoration: underline;">pas <strong>the_content()</strong></span> car si votre XML utilise la balise <a title="Balise CDATA" href="http://www.w3schools.com/xml/xml_cdata.asp">CDATA</a> votre XML sera corrompu à cause de cette ligne qui se trouve dans la fonction <strong>the_content()</strong>:</p>
<blockquote><p>$content = str_replace(&#8216;]]&gt;&#8217;, &#8216;]]&amp;gt;&#8217;, $content);</p></blockquote>
<p>&nbsp;</p>
<p>Voici un exemple de template wordpress spécialement concu pour traiter le XML :</p>
<blockquote>
<pre>&lt;?php</pre>
<pre>&lt;?php

/**
 * @author samuel.mamet@gmail.com
 */

/*
  Template Name: XML Document
*/ 

// Suppression du filtre qui ajoute des &lt;p&gt; et &lt;br /&gt; intenpestif.
remove_filter( 'the_content', 'wpautop'); 

// Convertit certains caractères après certaines balises. ex : --&gt; devient &amp;#8211;&gt;
remove_filter( 'the_content', 'wptexturize'); 

header('Content-type: text/xml');

echo '&lt;?xml version="1.0" encoding="UTF-8"?&gt;' . "\n";
the_post();
echo get_the_content();
?&gt;</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.wtdev.fr/empecher-wordpress-dajouter-des-tags-et-au-post/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fonctions pratiques pour developpement PHP</title>
		<link>http://www.wtdev.fr/fonctions-pratiques-pour-developpement-php</link>
		<comments>http://www.wtdev.fr/fonctions-pratiques-pour-developpement-php#comments</comments>
		<pubDate>Wed, 29 Feb 2012 10:02:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP (Sans framework)]]></category>

		<guid isPermaLink="false">http://www.wtdev.fr/?p=367</guid>
		<description><![CDATA[1. Autoloader pour les classes PHP. A placer dans le script d&#8217;intialisation de votre application. dans ce code les classes doivent être dans un dossier &#171;&#160;class&#160;&#187; et le nom des fichiers correspondent à [nom classe].class.php. Cette fonction marche peut importe le dossier où elle se trouve tant que les conditions mentionnées précédemment sont respectés. Cela vous évite [...]]]></description>
			<content:encoded><![CDATA[<h1>1. Autoloader pour les classes PHP.</h1>
<p>A placer dans le script d&#8217;intialisation de votre application. dans ce code les classes doivent être dans un dossier &laquo;&nbsp;class&nbsp;&raquo; et le nom des fichiers correspondent à [nom classe].class.php. Cette fonction marche peut importe le dossier où elle se trouve tant que les conditions mentionnées précédemment sont respectés.</p>
<p>Cela vous évite d&#8217;utiliser une multitude d&#8217;include ou require.</p>
<blockquote>
<pre>function __autoload($class_name) {
    $class_path    = dirname(__FILE__).'/class/' . $class_name . '.class.php';
    if (file_exists($class_path))
      include_once $class_path;
}</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.wtdev.fr/fonctions-pratiques-pour-developpement-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment activer les logs talend avec tom</title>
		<link>http://www.wtdev.fr/activer-les-logs-talend</link>
		<comments>http://www.wtdev.fr/activer-les-logs-talend#comments</comments>
		<pubDate>Tue, 18 Oct 2011 21:46:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Talend]]></category>

		<guid isPermaLink="false">http://www.wtdev.fr/?p=193</guid>
		<description><![CDATA[Dans ce tuto vous apprendrez à activer les logs talend. Ces logs seront stockés dans la base de données tom_database_lite que vous trouverez sur cette page. 1. Dans un premier temps il vous faudra télécharger et désarchiver le dump de tom_database_lite. 2. Créez une nouvelle base de données MySQL CREATE DATABASE tom; 3. Puis injectez [...]]]></description>
			<content:encoded><![CDATA[<p><span class="Apple-style-span" style="font-size: 13px; font-weight: normal;">Dans ce tuto vous apprendrez à activer les logs talend. Ces logs seront stockés dans la base de données <strong><a title="Télécharger tom database lite pour les logs talend" href="http://www.wtdev.fr/tom_database_lite.sql.zip" target="_blank">tom_database_lite</a></strong> que vous trouverez sur <strong><span style="text-decoration: underline;"><a title="tom (‘nt)" href="http://www.wtdev.fr/tom-is-not-talend-open-monitor" target="_blank">cette page</a>.</span></strong></span></p>
<p><strong>1. Dans un premier temps il vous faudra télécharger et désarchiver le dump de tom_database_lite.</strong></p>
<p><strong>2. Créez une nouvelle base de données MySQL</strong></p>
<blockquote>
<pre>CREATE DATABASE tom;</pre>
</blockquote>
<p><strong>3. Puis injectez le SQL</strong></p>
<blockquote>
<pre>mysql -u root -p tom &lt; tom_database_lite.sql</pre>
<pre>mysql -u root -p tom</pre>
<pre>mysql&gt; show tables;
+-----------------------+
| Tables_in_tom         |
+-----------------------+
| tom_flow_meter        |
| tom_log_tech          |
| tom_stats             |
| tom_v_finished_jobs   |
| tom_v_unfinished_jobs |
+-----------------------+
5 rows in set (0.00 sec)</pre>
</blockquote>
<p><strong>4. Ouvrez talend puis sélectionnez votre projet.</strong></p>
<p><strong>5. Cliquez <em>Fichier</em> &#8211;&gt; <em>Editer les propriétés du projet</em></strong></p>
<pre><a href="http://www.wtdev.fr/wp-content/uploads/2011/10/screenshot1.png"><img class="size-full wp-image-211 alignnone" style="display: block;" title="Sélectionnez  Editer les propriétés du projet" src="http://www.wtdev.fr/wp-content/uploads/2011/10/screenshot1.png" alt="Sélectionnez  Editer les propriétés du projet" width="283" height="302" /></a></pre>
<pre></pre>
<p><strong>6. Allez à la section Job Settings, puis Stats &amp; Logs. Activez le tStatCatcher, tLogCacher et tFlowMeterCatcher</strong></p>
<pre><a href="http://www.wtdev.fr/wp-content/uploads/2011/10/screenshot2.png"><img class="size-full wp-image-216 aligncenter" title="Sélectionnez Base de données" src="http://www.wtdev.fr/wp-content/uploads/2011/10/screenshot2.png" alt="Sélectionnez Base de données" width="823" height="494" /></a></pre>
<pre></pre>
<p><strong>7. Cochez &laquo;&nbsp;Dans la base de données&nbsp;&raquo; pour la sortie. Choisissez le type de base de données MySQL et entrez vos paramètres afin que cela ressemble à l&#8217;exemple ci-dessous.</strong> <em>Afin de pouvoir déployer vos jobs sur d&#8217;autres serveurs (recette, preproduction, production par exemple), je vous conseille vivement d&#8217;utiliser des paramètres de contextes pour vos champs. Créez donc une base de données dans les métadonnées talend et exportez les paramètres en contexte.</em></p>
<p style="text-align: center;"><a href="http://www.wtdev.fr/wp-content/uploads/2011/10/screenshot3.png"><img class="aligncenter size-full wp-image-236" title="Exemple de configuration des logs talend" src="http://www.wtdev.fr/wp-content/uploads/2011/10/screenshot3.png" alt="Exemple de configuration des logs talend" width="783" height="469" /></a></p>
<p>Désormais toute exécution de job sera enregistré par défaut dans la base de données. Grace à ces informations vous pourrez :</p>
<ul>
<li>Visualiser l&#8217;historique d&#8217;exécution</li>
<li>Connaitre les temps d&#8217;exécutions de vos traitements</li>
<li type="_moz">Visualiser les flux monitorés</li>
</ul>
<div>Il ne nous reste plus qu&#8217;à vérifier que tout fonctionne correctement. Voici 2 petits jobs de test que j&#8217;ai utilisé pour la démonstration, vous pouvez exécuter n&#8217;importe quel job de votre projet.</div>
<div><strong><span style="text-decoration: underline;"><br />
</span></strong></div>
<div><strong><span style="text-decoration: underline;">Le  job <em>fill_tom_stats</em> :</span></strong></div>
<div style="text-align: left;"><a href="http://www.wtdev.fr/wp-content/uploads/2011/10/Capture-d’écran-2011-10-27-à-18.03.01.png"><img class="aligncenter size-full wp-image-288" title="Job de test des logs" src="http://www.wtdev.fr/wp-content/uploads/2011/10/Capture-d’écran-2011-10-27-à-18.03.01.png" alt="Job de test des logs" width="462" height="111" /></a></div>
<div style="text-align: left;"><span style="text-decoration: underline;"><strong>Le  job <em>fill_tom_stats_with_subjobs</em> :</strong></span> <a href="http://www.wtdev.fr/wp-content/uploads/2011/10/Capture-d’écran-2011-10-27-à-17.19.13.png"><img class="aligncenter" title="Job utilisant un job enfant" src="http://www.wtdev.fr/wp-content/uploads/2011/10/Capture-d’écran-2011-10-27-à-17.19.13.png" alt="Job utilisant un job enfant" width="353" height="117" /></a> Le <em>tLoop</em> exécute 10 fois de suite le job enfant (<em>fill_tom_stats</em>). <strong>Il y a donc 1 job enfant et 10 exécutions.</strong></div>
<div>Vous disposez de 2 vues vous donnant les informations importantes, elles agrègent les données de la table <em><strong>tom_stats</strong>. </em>Il s&#8217;agit de<strong><em> tom_v_finished_jobs </em></strong>et <em><strong>tom_v_unfinished_jobs</strong></em> correspondant respectivement à <strong>l&#8217;historique des jobs exécutés</strong>, et <strong>aux</strong> <strong>jobs en cours d&#8217;exécution</strong>.</div>
<div>La vue <strong><em>tom_tmp_v_finished_jobs_subjobs </em></strong>est utilisée comme table temporaire dans <strong><em><strong><em>tom_v_finished_jobs</em></strong></em></strong>. <strong><span style="text-decoration: underline;">Elle ne nous interesse pas.</span></strong></div>
<div>Désormais vous pouvez connaitre la liste des jobs exécutés sur votre serveur de cette manière :</div>
<p>&nbsp;</p>
<blockquote>
<pre>mysql&gt; select * from tom_v_finished_jobs;</pre>
<pre style="position: relative; left: -130px; background-color: #e6e6e6; width: 1024px;">+----+----------+------------+----------+-----------------------------+-------------+---------+----------+---------+---------+---------------+
| id | root_pid | date       | time     | job                         | job_version | context | duration | success | subjobs | subjobs_execs |
+----+----------+------------+----------+-----------------------------+-------------+---------+----------+---------+---------+---------------+
| 24 | AiTYGk   | 2011-10-27 | 17:19:52 | fill_tom_stats_with_subjobs | 0.1         | Default | 00:00:01 | success |       1 |            10 |
|  2 | HF4JNi   | 2011-10-18 | 23:32:05 | fill_tom_stats              | 0.1         | Default | 00:00:00 | success |       0 |             0 |
+----+----------+------------+----------+-----------------------------+-------------+---------+----------+---------+---------+---------------+
2 rows in set (0.01 sec)</pre>
</blockquote>
<p>Les champs <em><strong>subjobs</strong></em> et <em><strong>subjob_execs</strong></em> vous donnent des informations concernant les jobs enfants que vous utilisez. Le premier correspond au<strong> nombre de jobs enfants distincts présent dans le traitement</strong> et le deuxième correspond au<strong> nombre d&#8217;exécutions des jobs enfants</strong>.</p>
<p>&nbsp;</p>
<p>Pour conclure, vous disposez ici des informations les plus importantes pour superviser vos traitements. Cependant les tables de logs vous permettent d&#8217;avoir plus d&#8217;information, notamment concernant les flux monitorés ainsi que les erreurs d&#8217;exécutions. Le logiciel <a title="tom (‘nt)" href="http://www.wtdev.fr/tom-is-not-talend-open-monitor">tom(&#8216;nt)</a> affiche ces données. Je tacherai de faire des vues SQL permettant cela dès que le temps me le permet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wtdev.fr/activer-les-logs-talend/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les bonnes pratiques talend (Normes &amp; Conventions)</title>
		<link>http://www.wtdev.fr/bonnes-pratiques-talend</link>
		<comments>http://www.wtdev.fr/bonnes-pratiques-talend#comments</comments>
		<pubDate>Sun, 18 Sep 2011 18:34:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Talend]]></category>

		<guid isPermaLink="false">http://smamet-consulting.local/?p=69</guid>
		<description><![CDATA[Structure générale des jobs Voici les conventions officiels de talend que vous entendrez en formation: Les lignes de type flux de données vont de gauche a droite (horizontal) Les lignes de type itération vont de gauche à droite (horizontal) Les liens de type On subjob OK, Component OK et Reject vont de haut en bas (vertical) Dans [...]]]></description>
			<content:encoded><![CDATA[<h2>Structure générale des jobs</h2>
<p>Voici les conventions officiels de talend que vous entendrez en formation:</p>
<ul>
<li>Les lignes de type flux de données vont de gauche a droite (horizontal)</li>
<li>Les lignes de type itération vont de gauche à droite (horizontal)</li>
<li>Les liens de type On subjob OK, Component OK et Reject vont de haut en bas (vertical)</li>
<li>Dans un tMap les flux principaux sont toujours horizontaux et les flux de type lookup verticaux. Les lookups doivent se trouver en haut du tMap.</li>
<li>Les flux de type reject sont toujours en bas du composant.</li>
</ul>
<h2></h2>
<h2>Après la théorie, la pratique!</h2>
<div>Dans le job ci-dessous vous noterez que je n&#8217;ai pas respecté la convention au niveau de la déclaration des connexions, mais entre vous et moi, c&#8217;est beaucoup plus lisible sous cette forme.</div>
<div>
<div id="attachment_101" class="wp-caption aligncenter" style="width: 624px"><a href="http://www.wtdev.fr/wp-content/uploads/2011/09/talend-convensions-screenshot1.jpg"><img class="size-large wp-image-101  " title="Variante sur les onComponentOK pour rendre le job plus lisible" src="http://www.wtdev.fr/wp-content/uploads/2011/09/talend-convensions-screenshot1-1024x686.jpg" alt="Variante sur les onComponentOK pour rendre le job plus lisible" width="614" height="412" /></a><p class="wp-caption-text">Variante sur les onComponentOK pour rendre le job plus lisible</p></div>
</div>
<h2></h2>
<h2>Optimisation des traitements</h2>
<ul>
<li><strong>Utilisez</strong> <strong>une connexion pour l&#8217;input et une autre pour l&#8217;output</strong>. Ceci permet un gain de performance en évitant de créer et fermer des connexions MySQL inutilement.</li>
<li><strong>Préférez l&#8217;option &laquo;&nbsp;enable stream&nbsp;&raquo;</strong> <strong>dans les inputs</strong> qui traite de gros volumes afin de gagner du temps. Attention au multiples input (en cas d&#8217;itération sur un stream) : dans ce cas créer une autre connexion de type input.</li>
<li><strong>Utilisez des &laquo;&nbsp;extend insert&nbsp;&raquo;</strong> dans les outputs , voir des bulks insert en cas de grosse volumétrie.</li>
<li><strong>Préférez des INSERT</strong> en vous assurant qu&#8217;il n&#8217;y ait pas de doublons avec un tMap avant l&#8217;insertion <strong>plutot que des UPDATE OR INSERT</strong></li>
<li><strong>En règle générale, maximisez la charge sur le serveur MySQL plutôt que Talend</strong>. <span style="text-decoration: underline;">Attention</span> : S&#8217;il y a trop de jointures ceci peut au contraire ralentir le traitement. Cette règle n&#8217;est donc pas toujours vrai, mais l&#8217;est souvent.</li>
<li><strong>Ne pas utiliser de tUnPivot sur de gros volumes</strong>. Préférer une solution alternative (ex: tMap).</li>
<li><strong>Réduisez au maximum le nombre de colonnes dans les flux</strong>. Ne pas remonter 20 colonnes si vous utilisez que de 2 d&#8217;entre elles par exemple.</li>
<li><strong>Ne JAMAIS utiliser un &laquo;&nbsp;SELECT *&nbsp;&raquo; </strong>dans vos input de base de données (ex: tMySQLInput) car si vous changez l&#8217;ordre des colonnes vous vous retrouverez dans le meilleur des cas avec une erreur d&#8217;exécution du job et dans la majorité (et pire) des cas avec des données corrompu. Imaginez que vos traitements aient corrompu vos données pendant un mois sans que vous vous en soyez rendu compte! Bon courage pour tout réparer!</li>
</ul>
<h2></h2>
<h2>Contrôle qualité</h2>
<ul>
<li><strong>Monitorer les flux important</strong> pour permettre de détecter un problème éventuel.</li>
<li><strong>Utiliser le tWarn pour donner des informations</strong> sur l&#8217;état d&#8217;avancement du job. (Visible dans la supervision que je propose)</li>
<li><strong>Eviter les outputs dans la console</strong> pour les jobs qui sont croné. Cela pollue les logs du batch d&#8217;exécution.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.wtdev.fr/bonnes-pratiques-talend/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
