<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Josh ben Jore</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/josh_ben_jore/" />
    <link rel="self" type="application/atom+xml" href="http://blogs.perl.org/users/josh_ben_jore/atom.xml" />
    <id>tag:blogs.perl.org,2009-11-03:/users/josh_ben_jore//246</id>
    <updated>2010-10-04T18:07:23Z</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>Optimizing my freenode IRC</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/josh_ben_jore/2010/10/optimizing-my-freenode-irc.html" />
    <id>tag:blogs.perl.org,2010:/users/josh_ben_jore//246.1083</id>

    <published>2010-10-04T18:03:01Z</published>
    <updated>2010-10-04T18:07:23Z</updated>

    <summary>I wrote this obtuse little function to display six different IRC channels on freenode at once. (defun irc-java () (interactive) (delete-other-windows) (switch-to-buffer (get-buffer &quot;#perl&quot;)) (let* ( (p (frame-parameters)) (width (cdr (assoc &apos;width (frame-parameters)))) (height (cdr (assoc &apos;height (frame-parameters)))) ) (split-window-horizontally...</summary>
    <author>
        <name>Josh ben Jore</name>
        <uri>http://search.cpan.org/~jjore</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/josh_ben_jore/">
        <![CDATA[<p>I wrote this obtuse little function to display six different IRC channels on freenode at once.</p>

<pre><code>(defun irc-java ()
    (interactive)
    (delete-other-windows)
    (switch-to-buffer (get-buffer "#perl"))
    (let* (
              (p      (frame-parameters))
              (width  (cdr (assoc 'width  (frame-parameters))))
              (height (cdr (assoc 'height (frame-parameters))))
          )

        (split-window-horizontally nil)
        (split-window-vertically (/ height 3))
        (other-window 1)
        (switch-to-buffer (get-buffer "#perl6"))
        (split-window-vertically)
        (switch-to-buffer (get-buffer "#squeak"))
        (other-window 2)
        (switch-to-buffer (get-buffer "#glassfish"))
        (split-window-vertically (/ height 3))
        (other-window 1)
        (switch-to-buffer (get-buffer "#spring"))
        (split-window-vertically)
        (other-window 1)
        (switch-to-buffer (get-buffer "#java-talk"))
    )
)
</code></pre>
]]>
        

    </content>
</entry>

<entry>
    <title>Littlest uuencode</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/josh_ben_jore/2010/09/littlest-uuencode.html" />
    <id>tag:blogs.perl.org,2010:/users/josh_ben_jore//246.1064</id>

    <published>2010-09-30T21:12:54Z</published>
    <updated>2010-09-30T21:13:48Z</updated>

    <summary><![CDATA[Hi, For your amusement, here's a very small uuencode program. perl -0777 -e '$uue = pack u, &lt;&gt;; print "begin 0644 $ARGV\n${uue}end\n"' your-file.bin...]]></summary>
    <author>
        <name>Josh ben Jore</name>
        <uri>http://search.cpan.org/~jjore</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/josh_ben_jore/">
        <![CDATA[<p>Hi,
For your amusement, here's a very small uuencode program.</p>

<pre><code>perl -0777 -e '$uue = pack u, &lt;&gt;; print "begin 0644 $ARGV\n${uue}end\n"' your-file.bin
</code></pre>
]]>
        

    </content>
</entry>

<entry>
    <title>Avoid my keys() accident</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/josh_ben_jore/2010/08/avoid-my-keys-accident.html" />
    <id>tag:blogs.perl.org,2010:/users/josh_ben_jore//246.953</id>

    <published>2010-08-27T17:36:14Z</published>
    <updated>2010-08-27T17:49:54Z</updated>

    <summary>I broke $work yesterday when a change I&apos;d made that I thought was mundane was not in fact. I&apos;d changed some code from: if ( keys %$hash_ref ) { to if ( %$hash_ref ) { under the theory that we...</summary>
    <author>
        <name>Josh ben Jore</name>
        <uri>http://search.cpan.org/~jjore</uri>
    </author>
    
    <category term="mistakesoopsperl" label="mistakes oops perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/josh_ben_jore/">
        <![CDATA[<p>I broke $work yesterday when a change I'd made that I thought was mundane was not in fact. I'd changed some code from: <code>if ( keys %$hash_ref ) {</code> to <code>if ( %$hash_ref ) {</code> under the theory that we weren't supporting any perl less than our current production at perl-5.10.0.</p>

<p>What I'd completely missed was that <code>$hash_ref</code> might be <code>undef</code> and that <code>keys %$...</code> would auto-vivify the hash if necessary. Previously, the hash would be created as a side effect of dereferencing it. Afterward, I got an exception because the hash wasn't being automatically created just by looking at it.</p>

<p>The reason for this is <code>keys()</code> is actually an lvalue, something you can assign to. The meaning of <code>keys( %... ) = 8</code> is actually fairly obscure and not what you would guess if you haven't read the documentation for <code>keys()</code>. Because <code>keys()</code> is an lvalue, the dereference <code>%$...</code> will auto-vivify anything necessary because I <em>might</em> want to modify it.</p>

<p>When I dropped the usage of something strictly defined as an lvalue function, the dereference stopped auto-vivifying and now I had exceptions in production. Wheee!</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Ponies are the truth</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/josh_ben_jore/2010/08/ponies-are-the-truth.html" />
    <id>tag:blogs.perl.org,2010:/users/josh_ben_jore//246.939</id>

    <published>2010-08-24T23:18:14Z</published>
    <updated>2010-08-24T23:20:17Z</updated>

    <summary><![CDATA[Did you know you can modify perl's readonly constants for undef, true and false? Yep. &amp;Internals::SvREADONLY( \ !!1, 0 ); ${ \ !!1 } = 'ponies!'; &amp;Internals::SvREADONLY( \ !!1, 1 ); print !!1; # ponies! Same thing for \ undef...]]></summary>
    <author>
        <name>Josh ben Jore</name>
        <uri>http://search.cpan.org/~jjore</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/josh_ben_jore/">
        <![CDATA[<p>Did you know you can modify perl's readonly constants for undef, true and false? Yep.</p>

<pre><code>&amp;Internals::SvREADONLY( \ !!1, 0 );
${ \ !!1 } = 'ponies!';
&amp;Internals::SvREADONLY( \ !!1, 1 );

print !!1; # ponies!
</code></pre>

<p>Same thing for \ undef and \ !!0.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Benchmarking string trimming</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/josh_ben_jore/2010/08/benchmarking-string-trimming.html" />
    <id>tag:blogs.perl.org,2010:/users/josh_ben_jore//246.907</id>

    <published>2010-08-16T18:10:35Z</published>
    <updated>2010-08-16T18:23:00Z</updated>

    <summary>Clever Regexps vs Multiple Simple Regexps: In reading some code I ran across the expression s/^\s*|\s*$//g which is a trim function. It is not the optimal way to write this. The optimal way is two simpler expressions: s/^\s+//; s/\s+$//. Justification...</summary>
    <author>
        <name>Josh ben Jore</name>
        <uri>http://search.cpan.org/~jjore</uri>
    </author>
    
    <category term="benchmarkprofilingstringtrimmingregexp" label="benchmark profiling string trimming regexp" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/josh_ben_jore/">
        <![CDATA[<h1>Clever Regexps vs Multiple Simple Regexps:</h1>

<p>In reading some code I ran across the expression <code>s/^\s*|\s*$//g</code>
which is a trim function. It is not the optimal way to write this. The
optimal way is two simpler expressions: <code>s/^\s+//;
s/\s+$//</code>. Justification follows.</p>

<h2>Conclusion:</h2>

<ul>
<li><p>Use of <code>+</code> instead of <code>*</code> means regexps that will would do no
effective work will also fail to match. Failing to match when the
work would be useless yielded some 3x to 4x improvement.</p></li>
<li><p>Use of multiple simpler patterns like <code>s/^...//;s/...$//</code> instead of
compound patterns like <code>s/^...|...$//g</code> enabled boundary checking
optimizations.</p></li>
</ul>

<h2>Testing:</h2>

<h3>String length:</h3>

<pre><code>long:  +80 chars
short: -80 chars
</code></pre>

<h3>Pre/postfixes:</h3>

<pre><code>pre/post: "  string  "
pre:      "  string"
post:       "string  "
base:       "string"
</code></pre>

<h3>Coding styles:</h3>

<pre><code>g*: s/^\s*|\s*$//g
g+: s/^\s+|\s+$//g
2*: s/^\s*//
    s/\s*$//
2+: s/^\s+//
    s/\s+$//
</code></pre>

<h2>Calculated results:</h2>

<pre><code>&gt;&gt;  short pre 2+      1638810/s
&gt;&gt;  short base 2+     1622457/s
&gt;&gt;  short post 2+     1351812/s
&gt;&gt;  short pre/post 2+ 1152253/s
&gt;&gt;  long base 2+       564477/s
&gt;&gt;  long pre 2+        534890/s
    short base +g      532709/s
    short post +g      502626/s
&gt;&gt;  long post 2+       501015/s
    short pre +g       479683/s
    short pre/post +g  465137/s
&gt;&gt;  long pre/post 2+   463741/s
    short base 2*      462448/s
    short pre 2*       456719/s
    short pre/post 2*  450081/s
    short post 2*      449661/s
    short base *g      394226/s
    short pre *g       384360/s
    short post *g      367736/s
    short pre/post *g  367624/s
    long post 2*       114832/s
    long base 2*       113787/s
    long pre 2*        110305/s
    long pre/post 2*   110169/s
    long post +g       100847/s
    long base +g        99830/s
    long pre +g         98871/s
    long pre/post +g    98331/s
    long base *g        87066/s
    long post *g        86520/s
    long pre *g         84080/s
    long pre/post *g    81429/s
</code></pre>
]]>
        

    </content>
</entry>

<entry>
    <title>My gladiators are getting entangled</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/josh_ben_jore/2010/08/my-gladiators-are-getting-entangled.html" />
    <id>tag:blogs.perl.org,2010:/users/josh_ben_jore//246.866</id>

    <published>2010-08-09T20:32:45Z</published>
    <updated>2010-08-09T20:48:28Z</updated>

    <summary>Hi, I&apos;ve had a long-standing interesting in having a nice way to browse through perl&apos;s memory space. Here&apos;s today&apos;s attempt. It almost works great except that the two introspection modules Devel::FindRef and Devel::Gladiator don&apos;t know enough to stay hands-off from...</summary>
    <author>
        <name>Josh ben Jore</name>
        <uri>http://search.cpan.org/~jjore</uri>
    </author>
    
    <category term="perlmemorydebuggingdebugvisualizevariables" label="perl memory debugging debug visualize variables" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/josh_ben_jore/">
        <![CDATA[<p>Hi,
I've had a long-standing interesting in having a nice way to browse through perl's memory space. Here's today's attempt. It almost works great except that the two introspection modules Devel::FindRef and Devel::Gladiator don't know enough to stay hands-off from each other.</p>

<pre><code>require Data::Dumper;
# require Data::Dump::Streamer;
require Devel::Gladiator;
require Devel::FindRef;
require Scalar::Util;
require B;

my %SKIP_REF;
my $all;

$SKIP_REF{ Scalar::Util::refaddr( \ %SKIP_REF  ) } = undef;
$SKIP_REF{ Scalar::Util::refaddr( \ %seen      ) } = undef;

$all = Devel::Gladiator::walk_arena();
for ( @$all ) {
    Devel::Peek::SvREFCNT_inc( $_ );
    print STDERR Data::Dumper::Dumper($_);

    # Skip the local variables
    next if
        # Skip any variables local to this probe
        exists( $SKIP_REF{ Scalar::Util::refaddr( $_ ) } )

        # Skip the global shared hash
        || ( 'HASH' eq Scalar::Util::reftype( $_ )
             &amp;&amp; ! ( B::svref_2object( $_ )-&gt;FLAGS() &amp; 0x2000_0000 ) )
    ;

    print STDERR Devel::FindRef::track( $_ );
}
print STDERR "Decrementing refcnts\n";
Devel::Peek::SvREFCNT_dec($_) for @$all;
print STDERR "Done\n";
</code></pre>

<p>Here's a sample of the output before any attempts to make this less voluminous:</p>

<pre><code>$VAR_0x17b308f81 = \*B::RXf_PMf_EXTENDED;
GLOB(0x17b308f8) [refcount 5] is
+- referenced by REF(0x17b81148) [refcount 1], which is
|  the array element 1 of ARRAY(0x17b81118) [refcount 1], which is
|     referenced by REF(0x17b81178) [refcount 1], which is
|        the member '\{f8}\{08}\{b3}\{17}' of HASH(0x17b80e30) [refcount 1], which is
|           referenced by REF(0x17b80f20) [refcount 1], which is
|              the member 'seen' of Data::Dumper=HASH(0x17b80e60) [refcount 3], which is
|                 +- referenced by REF(0x17a3b6b8) [refcount 1], which is
|                 |  referenced by REF(0x17afe3f8) [refcount 1], which is
|                 |     the array element 5296 of ARRAY(0x17b16018) [refcount 2], which is
|                 |        referenced by REF(0x179f5730) [refcount 2], which is
|                 |              not referenced within the search depth.
|                 +- referenced by REF(0x17a306d8) [refcount 1], which is
|                 |  referenced by REF(0x17b59868) [refcount 1], which is
|                 |     the array element 5461 of ARRAY(0x17b16018) [refcount 2], which was seen before.
|                 +- referenced by REF(0x17a21f78) [refcount 1], which is
|                    referenced by REF(0x17b57360) [refcount 1], which is
|                       the array element 5856 of ARRAY(0x17b16018) [refcount 2], which was seen before.
+- referenced by REF(0x17b80db8) [refcount 1], which is
|  the array element 0 of ARRAY(0x17b80da0) [refcount 2], which is
|     +- referenced by REF(0x17b80f38) [refcount 1], which is
|     |  the member 'todump' of Data::Dumper=HASH(0x17b80e60) [refcount 3], which was seen before.
|     +- referenced by REF(0x17a21e70) [refcount 1], which is
|        referenced by REF(0x17b57468) [refcount 1], which is
|           the array element 5845 of ARRAY(0x17b16018) [refcount 2], which was seen before.
+- referenced by REF(0x17b80d70) [refcount 3], which is
|  +- the array element 0 of ARRAY(0x17b16018) [refcount 2], which was seen before.
|  +- the global $main::_.
+- referenced by REF(0x17a3b6e8) [refcount 1], which is
|  referenced by REF(0x17afe3c8) [refcount 1], which is
|     the array element 5298 of ARRAY(0x17b16018) [refcount 2], which was seen before.
+- the member 'RXf_PMf_EXTENDED' of HASH(0x179f5670) [refcount 3], which is
+- referenced by REF(0x17b54420) [refcount 1], which is
|  the array element 6360 of ARRAY(0x17b16018) [refcount 2], which was seen before.
+- the global %main::B::.
$VAR_0x17b309101 = sub () { 32768 };
CODE(0x17b30910) [refcount 2] is
+- referenced by REF(0x17b80d58) [refcount 3], which is
|  +- the array element 1 of ARRAY(0x17b16018) [refcount 2], which is
|  |  referenced by REF(0x179f5730) [refcount 2], which is
|  |     +- referenced by REF(0x17b54360) [refcount 1], which is
|  |     |  the array element 6368 of ARRAY(0x17b16018) [refcount 2], which was seen before.
|  |     +- the lexical '$all' in CODE(0x179d7530) [refcount 1], which is
|  |        the main body of the program.
|  +- the global $main::_.
+- the global &amp;B::RXf_PMf_EXTENDED.
</code></pre>
]]>
        

    </content>
</entry>

<entry>
    <title>The mod_perl debugger you&apos;ve always wanted</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/josh_ben_jore/2010/07/the-mod-perl-debugger-youve-always-wanted.html" />
    <id>tag:blogs.perl.org,2010:/users/josh_ben_jore//246.782</id>

    <published>2010-07-23T01:34:25Z</published>
    <updated>2010-07-23T04:06:20Z</updated>

    <summary>To use the nice mod_perl debugger you&apos;ve always wanted: get a terminal server http://bit.ly/drrYdS upgrade your debugger http://bit.ly/cMFiwZ connect the two pour the espresso onto the ice cream before serving To connect the two and start up your apache with...</summary>
    <author>
        <name>Josh ben Jore</name>
        <uri>http://search.cpan.org/~jjore</uri>
    </author>
    
    <category term="debuggermod_perlforkingterminalservertmuxscreenxtermenbugger" label="debugger mod_perl forking terminal server tmux screen xterm enbugger" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/josh_ben_jore/">
        <![CDATA[<p>To use the nice mod_perl debugger you've always wanted:</p>

<ul>
<li>get a terminal server <a href="http://bit.ly/drrYdS">http://bit.ly/drrYdS</a></li>
<li>upgrade your debugger <a href="http://bit.ly/cMFiwZ">http://bit.ly/cMFiwZ</a></li>
<li>connect the two</li>
<li>pour the espresso onto the ice cream before serving</li>
</ul>

<p>To connect the two and start up your apache with no fuss:</p>

<pre><code># httpd.conf
&lt;Perl&gt;
    use Enbugger;

    # Send the debugger to your waiting terminal server but disable readline
    # because I haven't figured that part out yet.
    $ENV{PERLDB_OPTS} = 'RemotePort=localhost:53505';
    $ENV{PERL_RL}     = 0;

    Enbugger-&gt;load_debugger;
&lt;/Perl&gt;
</code></pre>

<p>This is all flexible so you can have an ordinary forking mod_perl and don't need to start it any strange way. If you're adventurous, you could inject this right into your running mod_perl by using that snippet somewhere in your application. If you're desperate and have a problem in production and want a debugger there, check out <a href="http://bit.ly/bGqCOT">http://bit.ly/bGqCOT</a> to add it at runtime from the outside.</p>

<p>I'm still playing with the proper settings for $ENV{PERL_RL}. I used 'o=0' yesterday and it seemed ok but maybe ought to be 0 instead. Also, I think possibly the terminal servers want more work.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Unicode in Perl, FTW (Я очень рад, ведь я, наконец, возвращаюсь домой)</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/josh_ben_jore/2010/07/unicode-in-perl-ftw.html" />
    <id>tag:blogs.perl.org,2010:/users/josh_ben_jore//246.724</id>

    <published>2010-07-07T13:55:35Z</published>
    <updated>2010-07-07T13:59:42Z</updated>

    <summary>Found on my hard drive. I love that it&apos;s source code that&apos;s literally in UTF-8 and it all just looks &quot;right&quot; or whatever that Russian says. use utf8; use Encode &apos;encode&apos;; print encode(&quot;ascii&quot;, &apos;Я очень рад, ведь я, наконец, возвращаюсь...</summary>
    <author>
        <name>Josh ben Jore</name>
        <uri>http://search.cpan.org/~jjore</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/josh_ben_jore/">
        <![CDATA[<p>Found on my hard drive. I love that it's source code that's literally in UTF-8 and it all just looks "right" or whatever that Russian says.</p>

<pre>
use utf8;
use Encode 'encode';
print encode("ascii", 'Я очень рад, ведь я, наконец, возвращаюсь домой', sub{ sprintf "<U+%04X>", shift });;
</pre>

<p>BTW:</p>

<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/oavMtUWDBTM&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/oavMtUWDBTM&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>]]>
        
    </content>
</entry>

<entry>
    <title>Under the covers of perldoc</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/josh_ben_jore/2010/07/under-the-covers-of-perldoc.html" />
    <id>tag:blogs.perl.org,2010:/users/josh_ben_jore//246.723</id>

    <published>2010-07-07T13:36:32Z</published>
    <updated>2010-07-07T21:16:06Z</updated>

    <summary>Sometime last year I had to go find out what happens under the covers when a user types a command like &quot;perldoc strict.&quot; Here&apos;s the trace of which commands call which other commands. It&apos;s all in good fun. I&apos;d used...</summary>
    <author>
        <name>Josh ben Jore</name>
        <uri>http://search.cpan.org/~jjore</uri>
    </author>
    
    <category term="stracedebugginginstrumentationperldoc" label="strace debugging instrumentation perldoc" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/josh_ben_jore/">
        <![CDATA[<p>Sometime last year I had to go find out what happens under the covers when a user types a command like "perldoc strict." Here's the trace of which commands call which other commands. It's all in good fun.</p>

<p>I'd used <code>strace</code> to get a process-by-process trace of what happened to just the <code>execve</code> and <code>clone</code> syscalls.</p>

<pre><code>strace -e trace=clone,execve -ff perldoc strict
</code></pre>

<p>And the eventual picture resolved:</p>

<pre><code>/usr/bin/perldoc strict
    /home/josh/bin/stty -a
    /home/josh/src/git-utils/stty -a
    /home/josh/bin/stty -a
    /home/josh/src/git-utils/stty -a
    /usr/local/sbin/stty -a
    /usr/local/bin/stty -a
    /usr/sbin/stty -a
    /usr/bin/stty -a
    /sbin/stty -a
    /bin/stty -a
    /bin/sh -c "/usr/bin/pod2man --lax /usr/share/perl/5.10/strict.pod | nroff -man -rLL=229n"
        /usr/bin/pod2man --lax /usr/share/perl/5.10/strict.pod
        /usr/bin/nroff -man -rLL=229n
            /usr/bin/locale charmap
            /usr/bin/groff -mtty-char -Tutf8 -man -rLL=229n
                /usr/bin/troff -mtty-char -man -rLL=229n -Tutf8
                /usr/bin/grotty
    /bin/sh -c "/usr/bin/sensible-pager \"/tmp/eHhH5a9wPU\""
        /usr/bin/sensible-pager /tmp/eHhH5a9wPU
            /usr/bin/pager /tmp/eHhH5a9wPU
                /bin/sh -c "/bin/bash -c \\ /usr/bin/lesspipe\\ /tmp/eHhH5a9wPU"
                    /bin/bash -c " /usr/bin/lesspipe /tmp/eHhH5a9wPU"
                    /usr/bin/lesspipe /tmp/eHhH5a9wPU
                        /usr/bin/basename /usr/bin/lesspipe
                            /usr/bin/tr "[:upper:]" "[:lower:]"
</code></pre>
]]>
        

    </content>
</entry>

</feed>
