<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>smash</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/" />
    <link rel="self" type="application/atom+xml" href="http://blogs.perl.org/users/smash/atom.xml" />
    <id>tag:blogs.perl.org,2009-11-03:/users/smash//249</id>
    <updated>2012-07-30T12:59:57Z</updated>
    <subtitle>A blog about the Perl programming language</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.38</generator>

<entry>
    <title>Portuguese Perl Workshop 2012</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2012/07/portuguese-perl-workshop-2012.html" />
    <id>tag:blogs.perl.org,2012:/users/smash//249.3633</id>

    <published>2012-07-30T12:57:37Z</published>
    <updated>2012-07-30T12:59:57Z</updated>

    <summary>The Portuguese Perl Workshop is back, the event will be held on September 28th in Braga, Portugal. Check the workshop website for more information....</summary>
    <author>
        <name>smash</name>
        
    </author>
    
    <category term="ptpwworkshop" label="ptpw workshop" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p>The Portuguese Perl Workshop is back, the event will be held on September 28th in Braga, Portugal.</p>

<p>Check the workshop <a href="http://workshop.perl.pt/ptpw2012">website</a> for more information.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Portuguese Perl Workshop 2011</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2011/07/portuguese-perl-workshop-2011.html" />
    <id>tag:blogs.perl.org,2011:/users/smash//249.2001</id>

    <published>2011-07-22T10:17:32Z</published>
    <updated>2011-07-22T10:19:39Z</updated>

    <summary>The Portuguese Perl Workshop is back. This year&apos;s event will be held in the 22nd and 23rd of September in sunny Lisbon, where the grass is green and the girls are pretty. Check the official site for details....</summary>
    <author>
        <name>smash</name>
        
    </author>
    
    <category term="ptpw2011" label="ptpw2011" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p>The Portuguese Perl Workshop is back. This year's event will be held in the 22nd and 23rd of September in sunny Lisbon, where the <em>grass is green and the girls are pretty</em>.</p>

<p>Check the official <a href="http://workshop.perl.pt">site</a> for details.</p>]]>
        
    </content>
</entry>

<entry>
    <title>OpenCert 2010</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2010/09/opencert-2010.html" />
    <id>tag:blogs.perl.org,2010:/users/smash//249.1032</id>

    <published>2010-09-20T18:57:34Z</published>
    <updated>2010-09-20T19:10:42Z</updated>

    <summary>This weekend I gave a presentation at OpenCert 2010 about the Perl testing ecosystem, this was an article I wrote with ambs++ and jjoao++. The article can be found on the conference site here....</summary>
    <author>
        <name>smash</name>
        
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="opencertperltesting" label="opencert perl testing" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p>This weekend I gave a presentation at OpenCert 2010 about the Perl testing ecosystem, this was an article I wrote with <a href="http://search.cpan.org/~ambs/">ambs++</a> and <a href="http://search.cpan.org/~jjoao/">jjoao++</a>. The article can be found on the conference site <a href="http://opencert.iist.unu.edu/Papers/2010-paper-8-A.pdf">here</a>.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Begin at the BEGIN and go on till you come to the END: then stop.</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2010/08/begin-at-the-begin-and-go-on-till-you-come-to-the-end-then-stop.html" />
    <id>tag:blogs.perl.org,2010:/users/smash//249.900</id>

    <published>2010-08-15T09:58:08Z</published>
    <updated>2010-08-15T12:35:11Z</updated>

    <summary>In Perl we can run user defined code blocks at different stages when running a program. BEGIN blocks are run as soon as Perl finds them. If there is more than one block they get executed in the order they...</summary>
    <author>
        <name>smash</name>
        
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p>In Perl we can run user defined code blocks at different stages when running a program.</p>

<ol>
<li><strong>BEGIN</strong> blocks are run as soon as Perl finds them. If there is more than one block they get executed in the order they are found.</li>
<li><strong>CHECK</strong> blocks are run as soon as Perl finishes compiling. If there is more than one CHECK block they get executed in the reverse order they are found.</li>
<li><strong>INIT</strong> blocks are executed after CHECK blocks, and if more than one exists they get executed in the order they appear.</li>
<li><strong>END</strong> blocks get executed before the program finishs running, and no errors where found. If more than one END block is found they are executed in the reverse order they appear.</li>
</ol>

<pre>END { print "Twelve\n"; }
BEGIN { print "One\n"; }
CHECK { print "Six\n"; }
INIT { print "Seven\n"; }
BEGIN { print "Two\n"; }
END { print "Eleven\n"; }
CHECK { print "Five\n"; }
INIT { print "Eight\n"; }
BEGIN { print "Three\n"; }
INIT { print "Nine\n"; }
CHECK { print "Four\n"; }
END { print "Ten\n"; }</pre>

<p><br />
When we run the script it prints someting like:</p>

<pre>$ perl blocks.pl
One
Two
Three
Four
Five
Six
Seven
Eight
Nine
Ten
Eleven
Twelve</pre>]]>
        
    </content>
</entry>

<entry>
    <title>Perl6 modules in Rakudo baby-steps, part 1</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2010/08/perl6-modules-in-rakudo-baby-steps-part-1.html" />
    <id>tag:blogs.perl.org,2010:/users/smash//249.833</id>

    <published>2010-08-05T11:16:37Z</published>
    <updated>2010-08-05T11:23:52Z</updated>

    <summary>Here is an example of what a module can look like. In this case it only has a simple method that greets the user: class Greeter; method greet($name = &apos;world&apos;) { say &quot;hello $name&quot;; } Now to use the module...</summary>
    <author>
        <name>smash</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p>Here is an example of what a module can look like. In this case it only has a simple method that greets the user:</p>

<pre>class Greeter;

<p>method greet($name = 'world') {<br />
   say "hello $name";<br />
}</pre></p>

<p><br />
Now to use the module we can write something like:</p>

<pre>BEGIN { @*INC.push('Greeter/lib') }

<p>use Greeter;<br />
my $x = Greeter.new;<br />
$x.greet('rakudo');</pre></p>

<p><br />
The only tricky part is actually the push in the BEGIN block, to add your lib directory. Of course running this is as simple as:</p>

<pre>$ ./perl6 greeter.p6 
hello rakudo</pre>]]>
        
    </content>
</entry>

<entry>
    <title>fork&apos;ing your world</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2010/07/forking-your-world.html" />
    <id>tag:blogs.perl.org,2010:/users/smash//249.804</id>

    <published>2010-07-28T21:45:59Z</published>
    <updated>2010-07-28T22:47:13Z</updated>

    <summary>The fork function is a very powerful tool used among many languages. Unfortunately It&apos;s not that common among Perl scripts, maybe because most scripts don&apos;t really have a need for it. But it&apos;s a handy trick to keep inside your...</summary>
    <author>
        <name>smash</name>
        
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perlfork" label="perl fork" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p>The fork function is a very powerful tool used among many languages. Unfortunately It's not that common among Perl scripts, maybe because most scripts don't really have a need for it. But it's a handy trick to keep inside your hat.</p>

<p>Fork creates a new process running the same program, usually the process that calls the fork is named the parent process, and the created process is named the child process. The fork function returns 0 to the child process, and the newly created process pid to the parent. Using fork can be as simple as:</p>

<pre>print "($$) hello\n";
my $pid = fork;
if ($pid == 0) {
   print "($$) I r child!\n";
}
else {
   print "($$) I r parent!\n";
}</pre>

<p><br />
A possible output for running this script can be:</p>

<pre>$ perl fork.pl 
(27121) hello
(27121) I r parent!
(27123) I r child!</pre>

<p><br />
We can see the different pid for the child process, which is different from the running script pid (the parent). We now have two distinct processes that are running simultaneously, and this can be used to process some tasks that can consume long periods of time, or complex operations that can be divided in smaller operations that can run in parallel. Let's look at a more academic example, the echo server:</p>

<pre>use IO::Socket::INET;
my $listener = IO::Socket::INET->new(
                        LocalPort => 9999,
                        Listen => 5,
                        Reuse => 1);

<p>while(my $client = $listener->accept) {<br />
   my $pid = fork;<br />
   if ($pid == 0) {<br />
      handle_client($client);<br />
   }<br />
   else {<br />
      print STDERR "New client, fork'ing (child $pid)\n";<br />
   }<br />
}</p>

<p>sub handle_client {<br />
   my $client = shift;</p>

<p>   $client->send("Hello client, this is an echo server!\n> ");<br />
   while(1) {<br />
      my $msg;<br />
      $client->recv($msg, 100);<br />
      $client->send("ECHO from $$! $msg> ");<br />
   }<br />
}</pre></p>

<p><br />
First we create a simple socket listening on port 9999, and then start an infinite loop waiting for connections on this socket. Nothing special so far, the beautiful part comes into play when we accept a connection, instead of hanging the script there while we handle the client requests we create a new child process to handle this, and let our parent process continue waiting for new connections and spawning new child's as needed. Let's see it working, the script running:</p>

<pre>$ perl echo_server.pl 
New client, fork'ing (child 27379)
New client, fork'ing (child 27381)</pre>

<p><br />
And a couple of telnet clients:</p>

<pre>$ telnet localhost 9999
(...)
Escape character is '^]'.
Hello client, this is an echo server!
> hello echo server
ECHO from 27379! hello echo server

<p>$ telnet localhost 9999<br />
(...)<br />
Escape character is '^]'.<br />
Hello client, this is an echo server!<br />
> and another request<br />
ECHO from 27381! and another request</pre></p>

<p><br />
This is great because not only we can handle more than one client at the same time, since several child process can be working simultaneously but also we don't make the new clients wait for the previous client to finish processing. A client can be very slow, and have a huge amount of requests to process, but we are accepting new connections and processing more requests at the same time. </p>

<p>Hope I haven't bored anyone to death with this post. Happy fork'ing.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Watching directories for new files</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2010/07/watching-directories-for-new-files.html" />
    <id>tag:blogs.perl.org,2010:/users/smash//249.773</id>

    <published>2010-07-20T23:04:26Z</published>
    <updated>2010-07-21T09:56:17Z</updated>

    <summary><![CDATA[Linux::Inotify2 is great for detecting newly created files in a directory. You can watch a directory by simply using: use Linux::Inotify2; my $inotify = new Linux::Inotify2; $inotify->watch($dir, IN_CREATE, \&handle_new); sub watch_new { my $e = shift; print "New file or...]]></summary>
    <author>
        <name>smash</name>
        
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perllinuxinotify" label="perl linux inotify" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p><a href="http://search.cpan.org/perldoc?Linux::Inotify2">Linux::Inotify2</a> is great for detecting newly created files in a directory. You can watch a directory by simply using:</p>

<pre><code>use Linux::Inotify2;

<p>my $inotify = new Linux::Inotify2;</p>

<p>$inotify->watch($dir, IN_CREATE, \&handle_new);</p>

<p>sub watch_new {<br />
    my $e = shift;</p>

<p>    print "New file or dir: " . $e->fullname . "\n";<br />
}</code></pre></p>

<p>This will execute the callback function <em>hande_new</em> everytime a file is created in <em>$dir</em>. The function will simply print the new directory or file name created.</p>

<p>Two things interesting, there is no simple way to declare this watcher recursive, <strong>but</strong> you can add a watch for each directory in a list, for example:</p>

<pre><code>foreach (@dirs) {
    $inotify->watch($_, IN_CREATE, \&handle_new);
}</code></pre>

<p>Or even do something more magical, start by watching every subdirectory, for example:</p>

<pre><code>opendir(DIR, $dir);
while(readdir DIR) {
  -d $_ and $inotify->watch($_, IN_CREATE, \&handle_new);
}
close DIR;</code></pre>

<p>And do this recursively for every directory inside the top directory. Also add a little magic to the callback function:</p>

<pre><code>sub watch_new {
    my $e = shift;

<p>    print "New file or dir: " . $e->fullname . "\n";</p>

<p>    if (-d $e->fullname) {<br />
        $inotify->watch($e->fullname, IN_CREATE, \&handle_new);<br />
    }<br />
}</code></pre></p>

<p>This way you get a watcher for every directory in the top directory, and whenever a new directory is created a new watcher is created for the new directory. This is a simple way to make the watcher "recursive" in real time.</p>

<p>Another interesting tip, imagine that you are watching an upload directory, and people upload files that need to be processed after they are uploaded. Maybe the IN_CREATE event isn't the best one, because it is fired up as soon as the file is create, but in this case you want to wait for the file to finish copying before start processing it. For these situations look at the IN_CLOSE_WRITE event, which is fired up as soon as a file descriptor is closed -- when the file finishs copying.</p>]]>
        
    </content>
</entry>

<entry>
    <title>one liner history command counter</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2010/07/one-liner-history-command-counter.html" />
    <id>tag:blogs.perl.org,2010:/users/smash//249.748</id>

    <published>2010-07-13T16:15:53Z</published>
    <updated>2010-07-13T16:35:05Z</updated>

    <summary><![CDATA[Wondering what commands you use the most, try this one liner: $ history | perl -ne 'END { map {print ++$i.": $_\n";} splice(@{[sort {$h{$b}&lt;=>$h{$a}} (keys %h)]},0,5); } m/\s+\d+\s+(.*)/; $h{$1}++;' In one of the servers I use I got: 1: ls...]]></summary>
    <author>
        <name>smash</name>
        
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="oneliner" label="oneliner" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p>Wondering what commands you use the most, try this one liner:</p>

<p>$ history | perl -ne 'END { map {print ++$i.": $_\n";} splice(@{[sort {$h{$b}&lt;=>$h{$a}} (keys %h)]},0,5); } m/\s+\d+\s+(.*)/; $h{$1}++;'</p>

<p>In one of the servers I use I got:</p>

<pre>
1: ls
2: fg
3: cd ..
4: sudo tail -f /var/log/httpd/error_log
5: cd
</pre>

<p><br />
Well, I actually added:</p>

<pre>
alias j=jobs
alias vl='sudo tail -f /var/log/httpd/error_log'
</pre>

<p><br />
To my .bashrc after this.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Memcached to the rescue</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2010/07/memcached-to-the-rescue.html" />
    <id>tag:blogs.perl.org,2010:/users/smash//249.714</id>

    <published>2010-07-05T09:08:39Z</published>
    <updated>2010-07-05T12:08:25Z</updated>

    <summary>Everyday the Internet becomes faster, and everyday new and more complex content is provided via web applications. The problem is that sometimes (maybe most of the times) these rich and complex content applications aren&apos;t fast enough to answer big flows...</summary>
    <author>
        <name>smash</name>
        
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perlcachememcached" label="perl cache memcached" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p>Everyday the Internet becomes faster, and everyday new and more complex content is provided via web applications. The problem is that sometimes (maybe most of the times) these rich and complex content applications aren't fast enough to answer big flows of requests. One trick that is often used to improve throughput of slow applications is caching. Instead of always processing requests, that often require some data from one or more external sources, a possible solution is to cache the entire output to answer upcoming requests, or cache smaller components that can be used together to produce the final output.</p>

<p><a href="http://memcached.org/">Memcached</a> is one of the most famous cache engines on the web. It can be used to cache any arbitrary pair key/value, later on in the process you need to know the key to retrieve the stored value. This is one possible caching solution easily to use in Perl. To start using Memcached you can use the following <a href="http://search.cpan.org/perldoc?Cache::Memcached">module</a> for example:</p>

<pre>
    use Cache::Memcached;
</pre>

<p><br />
Next, a new connection needs to be established:</p>

<pre>
    my $cache = new Cache::Memcached {
            'servers' => [ "127.0.0.1:11211" ]
        };
</pre>

<p><br />
Now we can use $cache to perform operations. For example:</p>

<pre>
    # store in cache
    $cache->set($key, $value);

<p>    # retrieve from cache<br />
    my $value = $cache->get($key);<br />
</pre></p>

<p><br />
There are many ways to take advantage of the caching power itself, and imagination is the limit. You can use cache for your requests for data to the database, or cache entire webpages to be immediately served, or somewhere in the middle, you can cache several components in your website and put them together as needed to produce the final output.</p>

<p>A typical workflow using cache for entire web pages done in a dispatcher could look something like:</p>

<pre>
    # handle request and arguments

<p>    my $key = calculate_request_key();<br />
    my $content = $cache->get($key);<br />
    unless ($content) {<br />
        process_request();<br />
        $cache->store($key, $content);<br />
    }</p>

<p>    # return content to client<br />
</pre></p>

<p><br />
These techniques can greatly improve the number of requests a complex application can answer per second. Keep in mind that although we cache information it doesn't mean your site can't deploy completely dynamic content, since you can set expire time on cached information. Which means that information available in cache can be valid for like a minute for example, and you can also have other processes updating content, cron jobs for example, that are also able to talk to the cache engine and can update information. But instead of having the application processing the output for 10 requests per second, just process it once and immediately return the processed output for the same request in the next 30 seconds. Of course you can argue that your content is 30 or 60 seconds (whatever you cache life time is) late in time, and that is true, but the time spent for a slow application to process thousands of requests in those same 30 or 60 seconds could introduce a much bigger content delay, or even content not being served at all.</p>

<p>There are some hairy problems with these type of approaches, and some issues to be aware of, but there are also some simple solutions that can be introduced in your application to handle them. Some details on those in a post to come.</p>]]>
        
    </content>
</entry>

<entry>
    <title>grep is your friend</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2010/06/grep-is-your-friend.html" />
    <id>tag:blogs.perl.org,2010:/users/smash//249.683</id>

    <published>2010-06-29T08:59:05Z</published>
    <updated>2010-06-29T09:23:23Z</updated>

    <summary>Grep is another Perl&apos;s great built in function, one of the things I use it most is to check if I can find an element on a list. For example, instead of something like my $found = 0; foreach (@list)...</summary>
    <author>
        <name>smash</name>
        
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p>Grep is another Perl's great built in function, one of the things I use it most is to check if I can find an element on a list. For example, instead of something like</p>

<pre>
    my $found = 0;
    foreach (@list) {
        $search eq $_ and $found++;
    }
</pre>

<p><br />
I prefer to use something like:</p>

<pre>
    my $found = grep {$search eq $_} @list;
</pre>

<p><br />
Code is simpler and more elegant, there's no significant performance from using one or another, although grep seems to actually run faster if you want to squeeze all the crumbs:</p>

<pre>
find_with_for  28818/s             --            -5%
find_with_grep 30211/s             5%             --
</pre>

<p><br />
Grep can be used to filter lists on elements very nicely too, for example, imagine you have a list of users and want to filter the users that are older than 18, just:</p>

<pre>
    my @users_over_18 = grep { $_->{'age'} > 18 } @users;
</pre>

<p><br />
All and all, grep is great.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Perl shebang for different versions</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2010/06/perl-shebang-for-different-versions.html" />
    <id>tag:blogs.perl.org,2010:/users/smash//249.658</id>

    <published>2010-06-21T11:27:55Z</published>
    <updated>2010-06-21T12:02:28Z</updated>

    <summary>In a Perl script typically a shebang line is something like: #!/usr/bin/perl this works great if you want to use a wide, system based, Perl for your scripts. But what if you have several different installations of Perl and want...</summary>
    <author>
        <name>smash</name>
        
    </author>
    
    <category term="perllinux" label="perl linux" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p>In a Perl script typically a shebang line is something like:</p>

<pre>#!/usr/bin/perl</pre>

<p><br />
this works great if you want to use a wide, system based, Perl for your scripts. But what if you have several different installations of Perl and want to run the same script using different Perl versions without having to change the shebang line. Well, one possible and straightforward solution is to change it to something like:</p>

<pre>#!/usr/bin/env perl</pre>

<p><br />
and then push the version you want to use to your $PATH environment variable. This can even be easily done based on the user. For example, you can have a user named 'perl_5.10' and for that user have:</p>

<pre>PATH=/usr/local/perl_5.10/bin:$PATH</pre>

<p><br />
now, this user runs scripts (with the env version of the shebang line) using Perl 5.10.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Portuguese Perl Workshop 2010 Last Call</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2010/05/portuguese-perl-workshop-2010-last-call.html" />
    <id>tag:blogs.perl.org,2010:/users/smash//249.582</id>

    <published>2010-05-24T15:39:48Z</published>
    <updated>2010-05-24T15:42:28Z</updated>

    <summary>We are a few days away from the Portuguese Perl Workshop. We still have some spots left for the training sessions and are still accepting presentations submissions. Workshop official website here....</summary>
    <author>
        <name>smash</name>
        
    </author>
    
    <category term="ptpwworkshop" label="ptpw workshop" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p>We are a few days away from the Portuguese Perl Workshop. We still have some spots left for the training sessions and are still accepting presentations submissions. Workshop official website <a href="http://workshop.perl.pt/ptpw2010">here</a>.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Portuguese Perl Workshop 2010</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/smash/2010/02/portuguese-perl-workshop-2010.html" />
    <id>tag:blogs.perl.org,2010:/users/smash//249.281</id>

    <published>2010-02-17T12:22:33Z</published>
    <updated>2010-02-17T13:35:24Z</updated>

    <summary>The Portuguese Perl Workshop is back. This year&apos;s event will be held in the 4th and 5th of June in Porto. Check the official site for details....</summary>
    <author>
        <name>smash</name>
        
    </author>
    
    <category term="workshop" label="workshop" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/smash/">
        <![CDATA[<p>The Portuguese Perl Workshop is back. This year's event will be held in the 4th and 5th of June in Porto. Check the official <a href="http://workshop.perl.pt">site</a> for details.</p>]]>
        
    </content>
</entry>

</feed>
