<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://le-gall.net/pierrick/en/blog/index.php?feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Pierrick Le Gall - talend</title>
  <link>http://le-gall.net/pierrick/en/blog/index.php?</link>
  <description></description>
  <language>en</language>
  <pubDate>Sat, 10 Jul 2010 14:44:10 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Talend Exchange, the new Ecosystem</title>
    <link>http://le-gall.net/pierrick/en/blog/index.php?post/2009/02/18/Talend-Exchange-the-new-Ecosystem</link>
    <guid isPermaLink="false">urn:md5:cc6a2879941009448527f2a560350654</guid>
    <pubDate>Thu, 19 Feb 2009 00:14:00 +0100</pubDate>
    <dc:creator>Pierrick Le Gall</dc:creator>
        <category>Talend</category>
        <category>talend</category>    
    <description>&lt;p&gt;&lt;a href=&quot;http://le-gall.net/pierrick/en/blog/public/post_121/talend_exchange.png&quot;&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_121/.talend_exchange_s.jpg&quot; alt=&quot;talend_exchange.png&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;I'm happy to announce that Talend Ecosystem has moved to Talend Exchange. It's a new name. &quot;Ecosystem&quot; was also used to describe the business partners and it was confusing for Talend customers. But the name is obviously not the only change. &lt;a href=&quot;http://talendforge.org/exchange&quot; hreflang=&quot;en&quot;&gt;visit Talend Exchange&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;While the Ecosystem was limited to share Talend Open Studio, Talend Exchange is available for Talend Open Studio and Talend Open Profiler.&lt;/p&gt;


&lt;p&gt;Concerning Talend Open Studio, while the Ecosystem was limited to components, Talend Exchange is also available for Job Designs, routines and SQL templates. The categories available are {perl, java, component, job, template, routine} and you can combine categories to filter available extensions:&lt;/p&gt;

&lt;pre&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&quot;component&quot; : list all components whatever the language&lt;/li&gt;
&lt;li&gt;&quot;perl+component&quot; : get only the Perl components&lt;/li&gt;
&lt;li&gt;&quot;java&quot; : get components, jobs and routines for Java&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The new comer is Talend Open Profiler. In Talend Exchange for Talend Open Profiler, you can share your patterns, regular expressions and SQL.&lt;/p&gt;


&lt;p&gt;Talend Exchange homepage give many statistics: number of extensions, number of revisions, number of contributors, number of downloads, most active contributors, for each categories (component/job/routine and TOP) the list of most recent extensions, most popular extensions, most active extensions.&lt;/p&gt;</description>
    
    
    
          <comments>http://le-gall.net/pierrick/en/blog/index.php?post/2009/02/18/Talend-Exchange-the-new-Ecosystem#comment-form</comments>
      <wfw:comment>http://le-gall.net/pierrick/en/blog/index.php?post/2009/02/18/Talend-Exchange-the-new-Ecosystem#comment-form</wfw:comment>
      <wfw:commentRss>http://le-gall.net/pierrick/en/blog/index.php?feed/rss2/comments/121</wfw:commentRss>
      </item>
    
  <item>
    <title>When memory matters, multiple keys hash</title>
    <link>http://le-gall.net/pierrick/en/blog/index.php?post/2008/10/17/When-memory-matters-multiple-keys-hash</link>
    <guid isPermaLink="false">urn:md5:1fb5fee93e2ebfcb65cd899332e57d5d</guid>
    <pubDate>Fri, 17 Oct 2008 00:41:00 +0200</pubDate>
    <dc:creator>Pierrick Le Gall</dc:creator>
        <category>Perl</category>
        <category>performance</category><category>perl</category><category>talend</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_120/corsaire_memory.jpg&quot; alt=&quot;corsaire_memory.jpg&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;One more time I need to load a huge number of data in memory with a Perl hash. See previous post about this in &lt;a href=&quot;http://le-gall.net/pierrick/en/blog/index.php?post/2008/07/16/When-memory-matters&quot; hreflang=&quot;en&quot;&gt;When memory matters&lt;/a&gt;. This time the hash key is made of several values. The value corresponding to each key is an array of scalar data. I have 6 string values for the key and 10 numeric float values for the corresponding value.&lt;/p&gt;    &lt;p&gt;My data looks like this:&lt;/p&gt;

&lt;pre&gt;
x5;7Sm;aI8w;2bNuW;lcDogi;pBTAdSKxha;2.73718;6.86649;0.49441;6.97707;2.62658;0.29478;3.97692;1.76468;4.86533;7.82656
sR;Ndu;PvlX;k3IJu;ZTwnAN;jTmtvmlqru;3.03941;1.84579;3.66076;7.14519;8.18409;5.87612;0.56569;1.49385;8.77644;6.98281
jm;cQL;ZXul;J0NIC;UwBz4S;O9VfAA74ao;6.20567;0.16487;3.02578;9.16104;0.14110;8.24097;8.23658;3.53050;7.11429;8.31212
3s;gId;wjXk;jJ3X2;7C833a;tzlTSHet4Y;8.08147;2.62935;9.00534;9.98493;5.17147;4.15576;8.60537;0.41931;9.79758;6.75664
&lt;/pre&gt;


&lt;p&gt;Here comes my basic script. The hash key is made of 6 first columns, the values are the next 10 columns. In the next examples, only code between mark 1 and mark 2 will change.&lt;/p&gt;

&lt;pre&gt;
#!/usr/bin/perl

use strict;
use warnings;

use Time::HiRes qw(gettimeofday tv_interval);
use Sys::Statistics::Linux::Processes;

my $lxs = Sys::Statistics::Linux::Processes-&amp;gt;new;
$lxs-&amp;gt;init;

my $start = [gettimeofday];
my %cache = ();

open(my $ifh, '&amp;lt;'.$ARGV[0])
    or die 'cannot open input file';

while (&amp;lt;$ifh&amp;gt;) {
    chomp;
    my @fields = split ';', $_;

    # mark 1
    $cache{$fields[0]}{$fields[1]}{$fields[2]}{$fields[3]}{$fields[4]}{$fields[5]}{operation1}{sum} = $fields[6];
    $cache{$fields[0]}{$fields[1]}{$fields[2]}{$fields[3]}{$fields[4]}{$fields[5]}{operation1}{sum} = $fields[7];
    $cache{$fields[0]}{$fields[1]}{$fields[2]}{$fields[3]}{$fields[4]}{$fields[5]}{operation1}{sum} = $fields[8];
    $cache{$fields[0]}{$fields[1]}{$fields[2]}{$fields[3]}{$fields[4]}{$fields[5]}{operation1}{sum} = $fields[9];
    $cache{$fields[0]}{$fields[1]}{$fields[2]}{$fields[3]}{$fields[4]}{$fields[5]}{operation1}{sum} = $fields[10];
    $cache{$fields[0]}{$fields[1]}{$fields[2]}{$fields[3]}{$fields[4]}{$fields[5]}{operation1}{sum} = $fields[11];
    $cache{$fields[0]}{$fields[1]}{$fields[2]}{$fields[3]}{$fields[4]}{$fields[5]}{operation1}{sum} = $fields[12];
    $cache{$fields[0]}{$fields[1]}{$fields[2]}{$fields[3]}{$fields[4]}{$fields[5]}{operation1}{sum} = $fields[13];
    $cache{$fields[0]}{$fields[1]}{$fields[2]}{$fields[3]}{$fields[4]}{$fields[5]}{operation1}{sum} = $fields[14];
    $cache{$fields[0]}{$fields[1]}{$fields[2]}{$fields[3]}{$fields[4]}{$fields[5]}{operation1}{sum} = $fields[15];
    # mark 2
}

# use Data::Dumper;
# print Dumper(\%cache);

close($ifh);

my $stop = [gettimeofday];
my $stat = $lxs-&amp;gt;get;

printf(
    &amp;quot;time: %.1f seconds, memory : %uM\n&amp;quot;,
    tv_interval($start, $stop),
    $stat-&amp;gt;{$$}{vsize} / (1024 * 1024)
);
&lt;/pre&gt;


&lt;p&gt;It corresponds to the way Talend Open Studio currently stores the aggregation hash, so you may understand what &quot;operation1&quot; and &quot;sum&quot; mean :-). Here comes a second way to do it:&lt;/p&gt;

&lt;pre&gt;
    # mark 1
    $cache{$fields[0]}{$fields[1]}{$fields[2]}{$fields[3]}{$fields[4]}{$fields[5]} = [
        $fields[6],
        $fields[7],
        $fields[8],
        $fields[9],
        $fields[10],
        $fields[11],
        $fields[12],
        $fields[13],
        $fields[14],
        $fields[15],
    ];
    # mark 2
&lt;/pre&gt;


&lt;p&gt;and a third one, very compact:&lt;/p&gt;

&lt;pre&gt;
    # mark 1
    $cache{join($;, @fields[0..5])} = join($;, @fields[6..15]);
    # mark 2
&lt;/pre&gt;


&lt;p&gt;I've performed the test on a 1 million lines file :&lt;/p&gt;
&lt;pre&gt;
$ perl hash_memory1.pl /tmp/agg.in; perl hash_memory2.pl /tmp/agg.in; perl hash_memory3.pl /tmp/agg.in
time: 35.4 seconds, memory : 991M
time: 22.1 seconds, memory : 1205M
time: 15.7 seconds, memory : 197M
&lt;/pre&gt;


&lt;p&gt;As hash_memory1.pl is the current &quot;way to do it&quot; in Talend Open Studio, I take it as the reference. The second method is 1.6 times faster, but 1.2 times more memory consuming. Third method is 2.25 times faster and 5 times less memory consuming. Huge improvement, really!&lt;/p&gt;


&lt;p&gt;According to the limit of 3GB per process on a Linux x86 32bits architecture, it means that before we could have 3 millions keys and with this improvement we can have 15 million lines in memory.&lt;/p&gt;</description>
    
    
    
          <comments>http://le-gall.net/pierrick/en/blog/index.php?post/2008/10/17/When-memory-matters-multiple-keys-hash#comment-form</comments>
      <wfw:comment>http://le-gall.net/pierrick/en/blog/index.php?post/2008/10/17/When-memory-matters-multiple-keys-hash#comment-form</wfw:comment>
      <wfw:commentRss>http://le-gall.net/pierrick/en/blog/index.php?feed/rss2/comments/120</wfw:commentRss>
      </item>
    
  <item>
    <title>When memory matters</title>
    <link>http://le-gall.net/pierrick/en/blog/index.php?post/2008/07/16/When-memory-matters</link>
    <guid isPermaLink="false">urn:md5:6cccde7062cfda80661ad1e19a54e1e9</guid>
    <pubDate>Wed, 16 Jul 2008 00:31:00 +0200</pubDate>
    <dc:creator>Pierrick Le Gall</dc:creator>
        <category>Perl</category>
        <category>performance</category><category>perl</category><category>talend</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_118/memory.jpg&quot; alt=&quot;memory.jpg&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; /&gt; I need to load a huge number of data in memory with a Perl hash. The value corresponding to each key is an array of scalar data. The key is most of the time created with a single field of my array, but it can be made of several fields. The number of fields in the array may vary a lot, but most of the time it will be around 5 scalar values.&lt;/p&gt;    &lt;p&gt;My goal is to load as many keys as possible with a limited memory size. Perl interpreter only takes 5MB at the beginning of the process, as &lt;a href=&quot;http://search.cpan.org/perldoc?Sys::Statistics::Linux::Processes&quot; hreflang=&quot;en&quot;&gt;Sys::Statistics::Linux::Processes&lt;/a&gt; tells me with the virtual size (which is the same as the real size for Perl scripts).&lt;/p&gt;


&lt;p&gt;My data to load looks like this (500k lines, 5 columns):&lt;/p&gt;

&lt;pre&gt;
1,1948-10-26,1951-12-08,8TBhXzkOvc,l0YO0ghDND
2,1920-04-16,1959-06-10,eyCFd4IjRo,41YTEnB7Qh
3,1978-12-28,2005-06-23,9LeBBiR2sw,qk30zZdftW
4,2004-01-05,1997-03-25,66K6gvdd5D,bmL3LpuLKT
5,2019-05-11,1995-08-27,rGRtJHioa7,qF7bhwfGeE
&lt;/pre&gt;


&lt;p&gt;Here comes my basic script. The hash key is made of only one column, the first field in the line. In the next examples, only code between mark 1 and mark 2 will change.&lt;/p&gt;

&lt;pre&gt;
#!/usr/bin/perl

use strict;
use warnings;

use Time::HiRes qw(gettimeofday tv_interval);
use Sys::Statistics::Linux::Processes;

my $lxs = Sys::Statistics::Linux::Processes-&amp;gt;new;
$lxs-&amp;gt;init;

my $start = [gettimeofday];
my %cache = ();

open(my $ifh, '&amp;lt;'.$ARGV[0])
    or die 'cannot open input file';

while (&amp;lt;$ifh&amp;gt;) {
    chomp;
    my @fields = split ',', $_;

    # mark 1
    $cache{$fields[0]} = \@fields;
    # mark 2
}

close($ifh);

my $stop = [gettimeofday];
my $stat = $lxs-&amp;gt;get;

printf(
    &amp;quot;time: %.1f seconds, memory : %uM\n&amp;quot;,
    tv_interval($start, $stop),
    $stat-&amp;gt;{$$}{vsize} / (1024 * 1024)
);
&lt;/pre&gt;


&lt;p&gt;We can use less memory if we store a string instead of an array reference:&lt;/p&gt;

&lt;pre&gt;
# mark 1
$cache{$fields[0]} = join $;, @fields;
# mark 2
&lt;/pre&gt;

&lt;pre&gt;
plegall@miro:~/bench/hash$ perl load-01.pl in_5c_500kl.csv; perl load-02.pl in_5c_500kl.csv
time: 2.1 seconds, memory : 173M
time: 2.3 seconds, memory : 70M
&lt;/pre&gt;


&lt;p&gt;This is of course a major improvement for me! 2.5 times less memory used and a really low extra time. Let's verify the memory usage is linear, let's have a data file with only the half of lines:&lt;/p&gt;

&lt;pre&gt;
plegall@miro:~/bench/hash$ head -250000 in_5c_500kl.csv  &amp;gt; in_5c_250kl.csv

plegall@miro:~/bench/hash$ perl load-01.pl in_5c_250kl.csv; perl load-02.pl in_5c_250kl.csv
time: 1.0 seconds, memory : 89M
time: 1.1 seconds, memory : 37M
&lt;/pre&gt;


&lt;p&gt;It confirms the memory usage is linear : half the data size, half the memory usage. On a unix-like operating system like Linux, a single process can consume up to 3GB of memory. According to this limit, it would mean that a hash can have nearly 22 millions records at once.&lt;/p&gt;


&lt;p&gt;In Talend Open Studio, the tMap has one main link and several lookup links as input. Each lookup link corresponds to a data join. The data joined are stored in memory, thanks to hashes. So I have opened a &lt;a href=&quot;http://www.talendforge.org/bugs/view.php?id=4488&quot; hreflang=&quot;en&quot;&gt;feature request to implement this improvement&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://le-gall.net/pierrick/en/blog/index.php?post/2008/07/16/When-memory-matters#comment-form</comments>
      <wfw:comment>http://le-gall.net/pierrick/en/blog/index.php?post/2008/07/16/When-memory-matters#comment-form</wfw:comment>
      <wfw:commentRss>http://le-gall.net/pierrick/en/blog/index.php?feed/rss2/comments/118</wfw:commentRss>
      </item>
    
  <item>
    <title>Install ecosystem components directly from Talend Open Studio</title>
    <link>http://le-gall.net/pierrick/en/blog/index.php?post/2008/06/18/Install-ecosystem-components-directly-from-Talend-Open-Studio</link>
    <guid isPermaLink="false">urn:md5:99df561c2a56f6c4453e9fa53e907151</guid>
    <pubDate>Wed, 18 Jun 2008 00:21:00 +0200</pubDate>
    <dc:creator>Pierrick Le Gall</dc:creator>
        <category>Talend</category>
        <category>community</category><category>talend</category>    
    <description>&lt;p&gt;Another new feature in Talend Open Studio 2.4.0 : the ability to install &lt;a href=&quot;http://talendforge.org/ext&quot; hreflang=&quot;en&quot;&gt;ecosytem&lt;/a&gt; components directly from your installed Talend Open Studio. No need to browse the web application ecosytem to find the component that fit your need.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_117/post_117-01.png&quot; alt=&quot;post_117-01.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;    &lt;ol&gt;
&lt;li&gt;Window &amp;gt; Show View &amp;gt; Talend &amp;gt; Ecosystem&lt;/li&gt;
&lt;li&gt;Refresh component list with the dedicated button. A webservice on talendforge.org ecosystem is called. Talend Open Studio asks &lt;em&gt;&quot;what are the available components compatible with this specific Talend Open Studio release&quot;&lt;/em&gt;. The webservice returns a list of component, the last revision compatible with the Talend Open Studio release.&lt;/li&gt;
&lt;li&gt;Clic on the component line to select it.&lt;/li&gt;
&lt;li&gt;Clic on the &quot;Download Selected components&quot; button (green arrow). The zip file corresponding to the component revision is downloaded, extracted and indexed in the ecosystem components. The download component is immediately available in the palette, you don't have to relaunch Talend Open Studio.&lt;/li&gt;
&lt;li&gt;Use your new component.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_117/before_after.png&quot; alt=&quot;before_after.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Related links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://talendforge.org/ext&quot; hreflang=&quot;en&quot;&gt;Talendforge Ecosystem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Implementation details in &lt;a href=&quot;http://le-gall.net/pierrick/en/blog/index.php?post/2008/06/18/Add a view to display / install components from Ecosystem&quot; hreflang=&quot;en&quot;&gt;Add a view to display / install components from Ecosystem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://le-gall.net/pierrick/en/blog/index.php?post/2007/05/10/99-pem&quot; hreflang=&quot;en&quot;&gt;Talendforge ecosystem is based on PEM, details on my blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://talendforge.org/forum/viewforum.php?id=10&quot; hreflang=&quot;en&quot;&gt;Component creation&lt;/a&gt; section on talendforge.org forum&lt;/li&gt;
&lt;li&gt;PEM &lt;a href=&quot;https://gna.org/bugs/?10705&quot; hreflang=&quot;en&quot;&gt;bug #10705: fetch a revision list with a webservice&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://le-gall.net/pierrick/en/blog/index.php?post/2008/06/18/Install-ecosystem-components-directly-from-Talend-Open-Studio#comment-form</comments>
      <wfw:comment>http://le-gall.net/pierrick/en/blog/index.php?post/2008/06/18/Install-ecosystem-components-directly-from-Talend-Open-Studio#comment-form</wfw:comment>
      <wfw:commentRss>http://le-gall.net/pierrick/en/blog/index.php?feed/rss2/comments/117</wfw:commentRss>
      </item>
    
  <item>
    <title>Parallel executions on iterate links</title>
    <link>http://le-gall.net/pierrick/en/blog/index.php?post/2008/06/13/Parallel-executions-on-iterate-links</link>
    <guid isPermaLink="false">urn:md5:9e0c433bc4a98892713dfd1fa9572091</guid>
    <pubDate>Fri, 13 Jun 2008 00:49:00 +0200</pubDate>
    <dc:creator>Pierrick Le Gall</dc:creator>
        <category>Talend</category>
        <category>feature</category><category>parallelism</category><category>talend</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_116/iterate_parallel-1.png&quot; alt=&quot;iterate_parallel-1.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;New feature in Talend Open Studio 2.4, the &lt;a href=&quot;http://talendforge.org/bugs/view.php?id=3606&quot; hreflang=&quot;en&quot;&gt;ability to run iterations in parallel&lt;/a&gt;. After a tLoop or a tFileList you can set the &lt;em&gt;&quot;number of parallel executions&quot;&lt;/em&gt; on the iterate link. If you're running on a quad core computer, it might be interesting to ask for 4 executions in parallel. 4 executions in parallel means that 4 &quot;iterations&quot; will be executed in parallel as long as some iterations are remaining. If your tFileList finds 1,000 files, you won't have 1,000 parallel executions, but 4, theoretically reducing the total execution time by 4.&lt;/p&gt;    &lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_116/iterate_parallel-2.png&quot; alt=&quot;iterate_parallel-2.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;
&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_116/iterate_parallel-3.png&quot; alt=&quot;iterate_parallel-3.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;With iterate parallel, my whole job takes 42 seconds...&lt;/p&gt;

&lt;pre&gt;
Starting job iterate_parallel at 00:44 13/06/2008.
[tLoop_1][20080613 00:44:27] parallel execution #1 running
[tLoop_1][20080613 00:44:27] parallel execution #2 running
[tLoop_1][20080613 00:44:35] parallel execution #3 running
[tLoop_1][20080613 00:44:35] parallel execution #4 running
[tLoop_1][20080613 00:44:43] parallel execution #5 running
[tLoop_1][20080613 00:44:43] parallel execution #6 running
[tLoop_1][20080613 00:44:51] parallel execution #7 running
[tLoop_1][20080613 00:44:52] parallel execution #8 running
[tLoop_1][20080613 00:44:59] parallel execution #9 running
[tLoop_1][20080613 00:45:00] parallel execution #10 running
===
execution time: 42186 milliseconds
===
Job iterate_parallel ended at 00:45 13/06/2008. [exit code=0]
&lt;/pre&gt;


&lt;p&gt;while it take 79 seconds without! nearly twice as fast.&lt;/p&gt;

&lt;pre&gt;
Starting job iterate_parallel at 00:42 13/06/2008.
===
execution time: 78664 milliseconds
===
Job iterate_parallel ended at 00:43 13/06/2008. [exit code=0]
&lt;/pre&gt;</description>
    
    
    
          <comments>http://le-gall.net/pierrick/en/blog/index.php?post/2008/06/13/Parallel-executions-on-iterate-links#comment-form</comments>
      <wfw:comment>http://le-gall.net/pierrick/en/blog/index.php?post/2008/06/13/Parallel-executions-on-iterate-links#comment-form</wfw:comment>
      <wfw:commentRss>http://le-gall.net/pierrick/en/blog/index.php?feed/rss2/comments/116</wfw:commentRss>
      </item>
    
  <item>
    <title>TalendForge.org planet is on its orbit</title>
    <link>http://le-gall.net/pierrick/en/blog/index.php?post/2008/06/05/TalendForgeorg-planet-is-on-its-orbit</link>
    <guid isPermaLink="false">urn:md5:1e47f291b8611111697e0f4d9c69e7e6</guid>
    <pubDate>Thu, 05 Jun 2008 00:47:00 +0200</pubDate>
    <dc:creator>Pierrick Le Gall</dc:creator>
        <category>Talend</category>
        <category>community</category><category>talend</category>    
    <description>    &lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_115/planet_earth.jpg&quot; alt=&quot;planet earth&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;I am proud to introduce you to the &lt;a href=&quot;http://talendforge.org/planet&quot; hreflang=&quot;en&quot;&gt;TalendForge planet&lt;/a&gt;. A planet is an online aggregation of several blog feeds related to a common topic. Currently registered planet members are &lt;a href=&quot;http://stefeclipse.free.fr/blog&quot; hreflang=&quot;en&quot;&gt;Stéphane Mallet&lt;/a&gt; (Java developer at Talend), &lt;a href=&quot;http://scorreiait.wordpress.com/&quot; hreflang=&quot;en&quot;&gt;Sebastiao Correia&lt;/a&gt; (Java developer at Talend), &lt;a href=&quot;http://ocarbone.free.fr/blog&quot; hreflang=&quot;en&quot;&gt;Olivier Carbone&lt;/a&gt; (Training and Support manager at Talend) and &lt;a href=&quot;http://le-gall.net/pierrick/en/blog&quot; hreflang=&quot;en&quot;&gt;me&lt;/a&gt; (Community Manager, Perl developer at Talend).&lt;/p&gt;


&lt;p&gt;The purpose of this planet is to keep you informed about Talend Open Studio and related technologies/products, from the inside. This is not the &lt;a href=&quot;http://www.talend.com/blog&quot; hreflang=&quot;en&quot;&gt;Talend corporate blog&lt;/a&gt;, but a place where people who make Talend Open Studio give information to Talend Open Studio users.&lt;/p&gt;


&lt;p&gt;As far as I'm concerned, only my posts with the &quot;Talend&quot; tag will be visible in this planet. TalendForge.org planet was placed into orbit thanks to &lt;a href=&quot;http://www.planetplanet.org&quot; hreflang=&quot;en&quot;&gt;Planet Planet&lt;/a&gt;. This Python script refreshes the planet every one hour.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Image:The_Earth_seen_from_Apollo_17.jpg&quot; hreflang=&quot;en&quot;&gt;The planet earth picture&lt;/a&gt; comes from wikipedia commons.&lt;/em&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://le-gall.net/pierrick/en/blog/index.php?post/2008/06/05/TalendForgeorg-planet-is-on-its-orbit#comment-form</comments>
      <wfw:comment>http://le-gall.net/pierrick/en/blog/index.php?post/2008/06/05/TalendForgeorg-planet-is-on-its-orbit#comment-form</wfw:comment>
      <wfw:commentRss>http://le-gall.net/pierrick/en/blog/index.php?feed/rss2/comments/115</wfw:commentRss>
      </item>
    
  <item>
    <title>External command piped to Talend data flow</title>
    <link>http://le-gall.net/pierrick/en/blog/index.php?post/2008/05/22/External-command-piped-to-Talend-data-flow</link>
    <guid isPermaLink="false">urn:md5:261896398557a873e83fe2a17c0dd07e</guid>
    <pubDate>Thu, 22 May 2008 00:14:00 +0200</pubDate>
    <dc:creator>Pierrick Le Gall</dc:creator>
        <category>component</category><category>perl</category><category>talend</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_114/post_114-01.png&quot; alt=&quot;post_114-01.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;With Talend Open Studio 2.4 and a Perl project, component tPipeRow appears in the palette. tPipeRow sends each input row to an external command, fetch the returned line and send it to the next component. tPipeRow does not launch the external script as many times as there are input rows, but only once at the data flow initialization. It makes the whole thing very performant. For each STDIN line, the external script must  produce one STDOUT line, without buffering.&lt;/p&gt;


&lt;p&gt;On a technical point of view, it's very interesting to see 2 scripts running in parallel and communicating through file descriptors. tPipeRow code is very short (but was not that short to write) because it simply uses &lt;a href=&quot;http://search.cpan.org/perldoc?IPC::Open2&quot; hreflang=&quot;en&quot;&gt;IPC::Open2&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;As this component is not very simple to understand, an example might help. As input, we have a file with 3 lines and 5 comma separated fields on each line:&lt;/p&gt;

&lt;pre&gt;
1,2,3,4,5
a,b,c,d,e
➊,➋,➌,➍,➎
&lt;/pre&gt;


&lt;p&gt;Drag'n drop components from the palette to the designer, as described in the above screenshot (2 new components only in 2.4 : tPipeRow and tExtractDelimitedFields). tFileInputDelimited, tLogRow (1 and 2) and tExtractDelimitedFields have a 5 columns schema. tPipeRow is configured as follows:&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_114/post_114-02.png&quot; alt=&quot;post_114-02.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;shuffle.pl is a Perl script (what else?) that shuffle fields:&lt;/p&gt;

&lt;pre&gt;
#!/usr/bin/perl

use strict;
use warnings;

use List::Util qw/shuffle/;

# force flush
$|++;

while (&amp;lt;STDIN&amp;gt;) {
    chomp;
    print join(&amp;quot;,&amp;quot;, shuffle split /,/, $_), &amp;quot;\n&amp;quot;;
}
&lt;/pre&gt;


&lt;p&gt;The output of my job is:&lt;/p&gt;

&lt;pre&gt;
Starting job piperow at 00:18 22/05/2008.
[tLogRow_1] 1 2 3 4 5
[tLogRow_2] 3 2 4 1 5
[tLogRow_1] a b c d e
[tLogRow_2] c a e b d
[tLogRow_1] ➊ ➋ ➌ ➍ ➎
[tLogRow_2] ➋ ➍ ➊ ➎ ➌
===
execution time: 9 milliseconds
===
Job piperow ended at 00:18 22/05/2008. [exit code=0]
&lt;/pre&gt;


&lt;p&gt;Of course, this specific example could be done with a tPerlRow, but it would have been useless to demonstrate the power of tPipeRow with a more complex external script.&lt;/p&gt;


&lt;p&gt;Talend Open Studio 2.4.0RC1 is available since 2008-05-12 on &lt;a href=&quot;http://www.talend.com/download.php&quot; hreflang=&quot;en&quot;&gt;Talend download page&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://le-gall.net/pierrick/en/blog/index.php?post/2008/05/22/External-command-piped-to-Talend-data-flow#comment-form</comments>
      <wfw:comment>http://le-gall.net/pierrick/en/blog/index.php?post/2008/05/22/External-command-piped-to-Talend-data-flow#comment-form</wfw:comment>
      <wfw:commentRss>http://le-gall.net/pierrick/en/blog/index.php?feed/rss2/comments/114</wfw:commentRss>
      </item>
    
  <item>
    <title>Automated test results on talendforge.org</title>
    <link>http://le-gall.net/pierrick/en/blog/index.php?post/2008/04/12/Automated-test-results-on-talendforgeorg</link>
    <guid isPermaLink="false">urn:md5:1467881ab039a85f6aebbe098b122ad5</guid>
    <pubDate>Sat, 12 Apr 2008 00:15:00 +0200</pubDate>
    <dc:creator>Pierrick Le Gall</dc:creator>
        <category>Talend</category>
        <category>quality assurance</category><category>talend</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_113/colibri.png&quot; alt=&quot;colibri.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;After many months of work, Talend development team is proud to announce the public availability of our automated test results. You can &lt;a href=&quot;http://talendforge.org/colibri&quot; hreflang=&quot;en&quot;&gt;browse them on talendforge.org&lt;/a&gt;. As said on the &lt;a href=&quot;htp://talendforge.org/colibri/about.php&quot; hreflang=&quot;en&quot;&gt;about view&lt;/a&gt;: &lt;q&gt;It should allow our development team to: detect regressions, ensure backward compatibility, follow-up bug fixing&lt;/q&gt;&lt;/p&gt;    &lt;p&gt;The project started last summer with a defined data model for test results. Siwei Ding (engineer trainee) built the first version of what will later be called Colibri, the web interface. Siwei developped the &quot;search&quot; page.&lt;/p&gt;


&lt;p&gt;In parallel, we needed to fill the test results table. Our first problem was to generate each test job from Talend job format to generated code (Perl or Java) with the current Subversion revision of the code generator source code. Matthieu Helleboid (our &quot;Talend repository master&quot;) created the Talend command line to perform this task. The command line is able to import a job, generate the script and run it.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://stefeclipse.free.fr/blog/&quot; hreflang=&quot;en&quot;&gt;Stéphane Mallet&lt;/a&gt; took the lead on the project, he created the automated execution system. The system consists of Talend Open Studio jobs. In a simplified way, the automated system does:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Subversion update Talend Open Studio source code&lt;/li&gt;
&lt;li&gt;build the sources into a runnable application&lt;/li&gt;
&lt;li&gt;import and execute each test jobs&lt;/li&gt;
&lt;li&gt;compute statistics and charts about the global execution&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then it was time for me to enhance Colibri (PHP/MySQL based web application, something I know quite well...), with new views such as the execution view and the jobs view. I've added some filters to display the most important information by default.&lt;/p&gt;


&lt;p&gt;We've bought a computer (Core2 Quad 2.4GHz) and I installed Debian on it. This is our automated test machine. I've developped a Perl daemon to launch the execution scripts created by smallet.&lt;/p&gt;


&lt;p&gt;We then needed to create as many test jobs as possible. We call test jobs TUJ for Test Unit Job. We currently have 404 TUJs, 217 Perl TUJ and 187 Java TUJ. TUJ are available in Talend Open Studio Subversion repository, see &lt;a href=&quot;http://talendforge.org/trac/tos/browser/trunk/tuj&quot; hreflang=&quot;en&quot;&gt;tuj directory&lt;/a&gt;. The list of TUJ is growing everyday, as you can see on the executions view of Colibri. TUJ are added by component developpers, mainly. Basically, a TUJ
produces output data and compare it with the expected output data.&lt;/p&gt;


&lt;p&gt;Don't hesitate to give us your feedback. We've spend quite a lot of time on this automated system, it's very useful for us, we hope it will give interesting informations to Talend Open Studio users.&lt;/p&gt;</description>
    
    
    
          <comments>http://le-gall.net/pierrick/en/blog/index.php?post/2008/04/12/Automated-test-results-on-talendforgeorg#comment-form</comments>
      <wfw:comment>http://le-gall.net/pierrick/en/blog/index.php?post/2008/04/12/Automated-test-results-on-talendforgeorg#comment-form</wfw:comment>
      <wfw:commentRss>http://le-gall.net/pierrick/en/blog/index.php?feed/rss2/comments/113</wfw:commentRss>
      </item>
    
  <item>
    <title>multithreading for Perl jobs</title>
    <link>http://le-gall.net/pierrick/en/blog/index.php?post/2008/03/14/multithreading-for-Perl-jobs</link>
    <guid isPermaLink="false">urn:md5:0fe38a47abef9be2a363e8485a828e03</guid>
    <pubDate>Mon, 17 Mar 2008 00:50:00 +0100</pubDate>
    <dc:creator>Pierrick Le Gall</dc:creator>
        <category>Talend</category>
        <category>parallelism</category><category>perl</category><category>talend</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_112/feature3302_no_parallel.png&quot; alt=&quot;feature3302_no_parallel.png&quot; /&gt;
&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/post_112/feature3302_parallel.png&quot; alt=&quot;feature3302_parallel.png&quot; /&gt;&lt;/p&gt;


&lt;p&gt;In Talend Open Studio, the &lt;em&gt;multithreading&lt;/em&gt; option makes possible to execute 2 subjobs in parallel. It was implemented in Java code generation last summer (&lt;a href=&quot;http://talendforge.org/bugs/view.php?id=1335&quot; hreflang=&quot;en&quot;&gt;see feature 1335&lt;/a&gt;) for TOS 2.1 and I implemented it for Perl code generation last monday (&lt;a href=&quot;http://talendforge.org/bugs/view.php?id=3302&quot; hreflang=&quot;en&quot;&gt;see feature 3302&lt;/a&gt;). Current &lt;em&gt;multithreading&lt;/em&gt; option was not implemented with threads in Perl, but with processes, I fork the parent process in children.&lt;/p&gt;    &lt;p&gt;As you can see in the example above, &lt;em&gt;multithreading&lt;/em&gt; makes things nearly twice as faster on this kind of job, on a Core2 duo processor.&lt;/p&gt;


&lt;p&gt;The current way to perform parallelism is very limited. For example, you can't design a &quot;execute subjob A and subjob B in parallel and once A and B are finished, execute subjob C&quot;. To achieve this, you have to use child jobs that will contain the parallel subjobs. But don't worry, a &lt;em&gt;synchronize&lt;/em&gt; component is expected before next big TOS release.&lt;/p&gt;


&lt;p&gt;This &lt;em&gt;multithreading&lt;/em&gt; option let users design &lt;a href=&quot;http://en.wikipedia.org/wiki/Task_parallelism&quot; hreflang=&quot;en&quot;&gt;task parallelism&lt;/a&gt;. I'm in charge of designing the next step in parallelism, ie &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_parallelism&quot; hreflang=&quot;en&quot;&gt;data parallelism&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://le-gall.net/pierrick/en/blog/index.php?post/2008/03/14/multithreading-for-Perl-jobs#comment-form</comments>
      <wfw:comment>http://le-gall.net/pierrick/en/blog/index.php?post/2008/03/14/multithreading-for-Perl-jobs#comment-form</wfw:comment>
      <wfw:commentRss>http://le-gall.net/pierrick/en/blog/index.php?feed/rss2/comments/112</wfw:commentRss>
      </item>
    
  <item>
    <title>Extract fields from a positionnal file with Perl</title>
    <link>http://le-gall.net/pierrick/en/blog/index.php?post/2008/02/20/Extract-fields-from-a-positionnal-file-with-Perl</link>
    <guid isPermaLink="false">urn:md5:816986b6c7d4be50d44a2d4a734a55cd</guid>
    <pubDate>Wed, 20 Feb 2008 23:13:00 +0100</pubDate>
    <dc:creator>Pierrick Le Gall</dc:creator>
        <category>Perl</category>
        <category>encoding</category><category>performance</category><category>perl</category><category>talend</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/perlpowered.png&quot; alt=&quot;perlpowered.png&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Here is a sample of a positional:&lt;/p&gt;

&lt;pre&gt;
Pierrick   LE GALL    026169
Erwann     LE GALL    002080
Larry      WALL       053174
&lt;/pre&gt;


&lt;p&gt;We have the firstname on 11 characters, lastname on 11 characters, age on 3 characters and size on 3 characters. We want to extract these fields into an array. I propose to use the unpack function.&lt;/p&gt;    &lt;pre&gt;
# in.pos is the positionnal file
open(my $fh, '&amp;lt;in.pos');
my $pattern = 'A11A11A3A3';
while (&amp;lt;$fh&amp;gt;) {
    chomp;
    @fields = unpack($pattern, $_);
}
&lt;/pre&gt;


&lt;p&gt;This was the way I did it until I read utf-8 file with non-ascii characters. The problem is that the character &quot;é&quot; in a utf-8 file is stored on 2 bytes. I didn't find the clean way to read it with unpack, so I've searched another way to do it. The very usual substr function can do the job and has no problem with utf-8 data.&lt;/p&gt;

&lt;pre&gt;
open(my $fh, '&amp;lt;in.pos');
while (&amp;lt;$fh&amp;gt;) {
    chomp;
    my @fields = (
        substr($_,  0, 11),
        substr($_, 11, 22),
        substr($_, 22,  3),
        substr($_,  25,  3),
    );
}
&lt;/pre&gt;


&lt;p&gt;Which can be rewritten in a more generic way:&lt;/p&gt;

&lt;pre&gt;
open(my $fh, '&amp;lt;in.pos');
my @lengths = qw/11 11 3 3/;
while (&amp;lt;$fh&amp;gt;) {
    chomp;
    my @fields = ();
    my $pos = 0;

    foreach my $len (@lengths) {
        push @fields, substr($_, $pos, $len);
        $pos+= $len;
    }
}
&lt;/pre&gt;


&lt;p&gt;What about performances? I've generated a 1 million line file, with 100 fields of 10 characters on each line (1000 characters on each line). unpack lasts 84.3 seconds versus 70.6 seconds for substr method (unpack is approximately 20% slower for this specific task).&lt;/p&gt;


&lt;p&gt;Conclusion: substr is my favorite choice for this task, it is faster and more compliant to utf-8 than unpack.&lt;/p&gt;</description>
    
    
    
          <comments>http://le-gall.net/pierrick/en/blog/index.php?post/2008/02/20/Extract-fields-from-a-positionnal-file-with-Perl#comment-form</comments>
      <wfw:comment>http://le-gall.net/pierrick/en/blog/index.php?post/2008/02/20/Extract-fields-from-a-positionnal-file-with-Perl#comment-form</wfw:comment>
      <wfw:commentRss>http://le-gall.net/pierrick/en/blog/index.php?feed/rss2/comments/110</wfw:commentRss>
      </item>
    
  <item>
    <title>PostgreSQL and case sensitivity</title>
    <link>http://le-gall.net/pierrick/en/blog/index.php?post/2006/12/01/90-postgresql-and-case-sensitivity</link>
    <guid isPermaLink="false">urn:md5:ebd945af1daac76a12acd7fff2ef4c13</guid>
    <pubDate>Fri, 01 Dec 2006 17:39:00 +0000</pubDate>
    <dc:creator>Pierrick Le Gall</dc:creator>
        <category>General</category>
        <category>perl</category><category>postgresql</category><category>talend</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://le-gall.net/pierrick/en/blog/public/elephant-64.png&quot; alt=&quot;PostgreSQL logo&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt;I've been working recently with PostgreSQL (see &lt;a href=&quot;http://talendforge.org/bugs/view.php?id=205&quot;&gt;Queries on error with PostgreSQL&lt;/a&gt; in Talend Open Studio) and I've discovered the way PostgreSQL handles case sensitivity.&lt;/p&gt;


&lt;p&gt;Column, table and schema names are case sensitive, ie you can have a column Id and ID in the same table. Not very usual (you can't do this in MySQL or Oracle). The problem is that PostgreSQL automaticaly lowercase schema/table/column names in the queries! Very funny, isn't it?&lt;/p&gt;    &lt;pre&gt;
db1=&amp;gt; create table blog_ticket (Id int, Title character varying(50));
CREATE TABLE
db1=&amp;gt; \d blog_ticket
           Table «public.blog_ticket»
 Column  |         Type          |
---------+-----------------------+
 id      | integer               |
 title   | character varying(50) |
&lt;/pre&gt;


&lt;p&gt;As you can see, my capitalized column names have been lowercased. This is not a real problem as long as you never try to have two column names differentiated only by case.&lt;/p&gt;


&lt;p&gt;If you really want to have ID and Id in the same table, you have to double quote column names.&lt;/p&gt;

&lt;pre&gt;
db1=&amp;gt; drop table blog_ticket;
DROP TABLE
db1=&amp;gt; create table blog_ticket (&amp;quot;Id&amp;quot; int, &amp;quot;ID&amp;quot; int, Title character varying(50));
CREATE TABLE
db1=&amp;gt; \d blog_ticket
           Table «public.blog_ticket»
 Column  |         Type          |
---------+-----------------------+
 Id      | integer               |
 ID      | integer               |
 title   | character varying(50) |
&lt;/pre&gt;


&lt;p&gt;Even with a good reason, don't do that, please.&lt;/p&gt;


&lt;p&gt;Now I want to retrieve all the tables of a given schema with a Perl script. The equivalent of :&lt;/p&gt;

&lt;pre&gt;
db1=&amp;gt; \dt public.*
             Relation list
 Schema |    Name     | Type  | Owner
--------+-------------+-------+-------
 public | Blog_Ticket | table | root
 public | blog_ticket | table | root
(2 lines)
&lt;/pre&gt;


&lt;p&gt;Here is the Perl script, I name it list_schema_tables.pl:&lt;/p&gt;

&lt;pre&gt;[perl]
#!/usr/bin/perl

use strict;
use warnings;

use Getopt::Long;
use DBI;

my %opt = ();
GetOptions(
    \%opt,
    qw/dbname=s dbuser=s dbpass=s dbhost=s dbport=i schema=s/
);

foreach my $option (qw/dbname dbuser dbpass/) {
    if (!exists($opt{$option})) {
        die 'Error: '.$option.' is a mandatory option'.&amp;quot;
&amp;quot;;
    }
}

$opt{schema} ||= 'public';
$opt{dbhost} ||= 'localhost';
$opt{dbport} ||= 5432;

my $dbh = DBI-&amp;gt;connect(
    sprintf(
        'DBI:Pg:dbname=%s;host=%s;port=%s;',
        $opt{dbname},
        $opt{dbhost},
        $opt{dbport},
    ),
    $opt{dbuser},
    $opt{dbpass},
)
    or die &amp;quot;can't connect to database&amp;quot;;

my $sth = $dbh-&amp;gt;table_info('%', $opt{schema});
my @tables = ();

while (my $entity = $sth-&amp;gt;fetchrow_hashref()) {
    if ($entity-&amp;gt;{TABLE_TYPE} eq 'TABLE') {
        push @tables, $entity-&amp;gt;{TABLE_NAME};
    }
}

print(
    join(
        &amp;quot;
&amp;quot;,
        @tables
    ),
    &amp;quot;
&amp;quot;
);
&lt;/pre&gt;


&lt;p&gt;This script, is used in the following way:&lt;/p&gt;

&lt;pre&gt;[bash]
$ ./list_schema_tables.pl --dbn=talend --dbu=root --dbpass=toor --schema=public
blog_ticket
&amp;quot;Blog_Ticket&amp;quot;
&lt;/pre&gt;


&lt;p&gt;What we see here is that table names mixing lower and upper case characters are double quoted. Very... unpredictable, isn't it? The funniest is that in the table_info function, I mustn't surround my schema with double quotes, even if it contains uppercased characters...&lt;/p&gt;


&lt;p&gt;As a conclusion, I would simply say: don't ever use explicit case mixing in column/table/schema names, whatever the database management system you use.&lt;/p&gt;</description>
    
    
    
          <comments>http://le-gall.net/pierrick/en/blog/index.php?post/2006/12/01/90-postgresql-and-case-sensitivity#comment-form</comments>
      <wfw:comment>http://le-gall.net/pierrick/en/blog/index.php?post/2006/12/01/90-postgresql-and-case-sensitivity#comment-form</wfw:comment>
      <wfw:commentRss>http://le-gall.net/pierrick/en/blog/index.php?feed/rss2/comments/90</wfw:commentRss>
      </item>
    
</channel>
</rss>