<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <entry>
    <title>A Final TPF Parrot Embed/Extend Grant Update</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2011/07/a-final-tpf-parrot-embedextend-grant-update.html"/>
    <id>tag:leto.net,2011:/dukeleto.pl//9.252</id>

    <published>2011-07-10T06:11:24Z</published>
    <updated>2011-07-11T02:14:24Z</updated>

    <summary>Really TLDR: The Parrot has landed. It brings me great joy to announce that I have completed all milestones for my TPF grant regarding the Parrot Embed/Extend subsystems! Not only that, but all of my grant work was included in...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="grant" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="grant" label="grant" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="parrot" label="parrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="tpf" label="tpf" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[<h2>Really TLDR: The Parrot has landed.</h2>

<p>It brings me great joy to announce that I have completed all milestones for my
<a href="http://perlfoundation.org">TPF</a> grant regarding the Parrot <a href="http://news.perlfoundation.org/2010/11/2010q4-grant-proposal-improve.html">Embed/Extend subsystems</a>!
Not only that, but all of my grant work was included in the most recent release of
Parrot, <a href="http://parrot.org/news/2011/Parrot-3.5.0">3.5.0 "Menelaus"</a>.</p>

<p>The actual TLDR of this update is "many tests were written, code coverage is
above <a href="http://tapir2.ro.vutbr.cz/cover/latest-c_cover/src-embed-api-c.html">95%</a>
<a href="http://tapir2.ro.vutbr.cz/cover/latest-c_cover/src-extend-c.html">for all</a>
<a href="http://tapir2.ro.vutbr.cz/cover/latest-c_cover/src-extend_vtable-c.html">systems described</a>
in the grant, docs were improved, many
Parrot Trac tickets were created and <a href="http://leto.net/dukeleto.pl/2010/12/parrot-embed-grant-update-1.html">many</a> <a href="http://leto.net/dukeleto.pl/2011/01/parrot-embed-grant-update-2.html">a</a> <a href="http://leto.net/dukeleto.pl/2011/02/parrot-embed-grant-update-3-now-with-dragons.html">blarg</a> <a href="http://leto.net/perl/2011/04/parrot-embed-grant-update-4-the-journey-continues.html">toast</a> <a href="http://leto.net/dukeleto.pl/2011/04/parrot-embed-grant-update-5-zen-pebbles.html">was</a> <a href="http://leto.net/dukeleto.pl/2011/05/parrot-embed-grant-update-6-still-hackin-less-slackin.html">cooked</a>.</p>

<p>For those of you that have a thirst for knowledge unquenched (I know who you are),
you are welcome to pondiferously peruse the Impending Technical Details.</p>

<h2>The Deets</h2>

<p>The last portion of this grant definitiely challenged me to think in new ways
about testing and I am now only beginning to reap the benefits. I was charged
with adding code coverage a few rarely-if-ever-used C functions in Parrot's
embed/exted subsystem, which allows you embed Parrot into other applications
and other funky stuff.</p>

<p><a href="http://whiteknight.blogspot.com">Whiteknight++</a> greatly helped me write a test for <a href="https://github.com/parrot/parrot/blob/master/src/extend.c#L700">Parrot_sub_new_from_c_func</a> which
takes a C function and a string that describes the function signature of the C
function and returns a <a href="https://github.com/parrot/parrot/blob/master/src/pmc/nci.pmc">NCI PMC</a>, which can be invoked.</p>

<p>I also learned many lessons about code coverage during the final stage of this
grant, even though I thought I was at such a level of expertness that it would
be hard to learn drastically new and important perspectives on testing. This
pattern of thinking is always wrong.</p>

<h3>Lesson 1</h3>

<p>Sometimes you are the underdog and you have to interpret the rules in a new way
in order to have a chance at winning. You need to be Ender Wiggins from <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Ender's_Game">Ender's
Game</a>: continually inventing new tactics to keep a winning edge over the
competition.</p>

<p>I noticed that a large portion (about 80%) of the uncovered code in one file
was a macro that was copy-and-pasted into two places. I refactored this into a
single macro called <a href="https://github.com/parrot/parrot/blob/master/src/extend.c#L331">POP_CONTEXT</a>, which reduced the total number of lines in the file by
roughly 10, while simultaneously decreased the number of uncoverd lines in the
file by ~20 lines, which had a combined effect of pushing the code coverage
over the necessary 95% mark.</p>

<p>This change definitely increases the maintainability and modularity of the
code, but it feels a bit like gaming the system. Nonetheless, it saved the day.</p>

<h3>Lesson 2</h3>

<p>The simplest useful test that you are avoiding is the most valuable next test to
write, because it has the best ROI (Return on Investment, where investment is the
time it takes to write the test, and the return is having an automated way of
verifying that the feature works.</p>

<h3>Lesson 3</h3>

<p>Software developers are very optimistic about time estimates. We forget about all
the possible things that could go wrong and often quote estimates on something
approaching "base case scenario". As a rule of thumb, I think all software developers
should think long and hard about a time estimate for a given project, write down
the estimate, then multiply that time estimate by pi for a REAL estimate.</p>

<p>I theorize that pi is the factor of time it takes to debug and write tests for
behavior of hard-to-recreate edge cases.</p>

<p>I originally thought my grant would take about 3 months, but it ended up taking about
9 or ten. QED.</p>

<p>Finally, I would like to thank my grant manager Makoto Nozaki for providing
lots of feedback, support and encouragement, as well as everyone else at the
The Perl Foundation for funding this grant.</p>
]]>
        
    </content>
</entry>
  <entry>
    <title>What is M0 ?</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2011/05/what-is-m0.html"/>
    <id>tag:leto.net,2011:/dukeleto.pl//9.250</id>

    <published>2011-05-31T05:09:06Z</published>
    <updated>2011-06-02T17:10:54Z</updated>

    <summary> I met with fellow Parrot hackers allison++, cotto++ and chromatic++ recently in Portland, OR (it was jokingly called YAPC::OR on IRC) to talk about what we call M0. M0 stands for "magic level 0" and it is a refactoring...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="m0" label="m0" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="parrot" label="parrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[
<p>I met with fellow <a href="http://parrot.org">Parrot</a> hackers
<a href="http://allisonrandal.com">allison++</a>, <a href="http://reparrot.blogspot.com">cotto++</a>
and <a href="http://www.wgz.org/~chromatic/">chromatic++</a> recently in Portland, OR (it was jokingly called YAPC::OR on
IRC) to talk about what we call
<a href="https://github.com/parrot/parrot/blob/m0-spec/docs/pdds/draft/pdd32_m0.pod">M0</a>.
M0 stands for "magic level 0" and it is a refactoring of Parrot internals in a
fundamental way.</p>

<p>cotto++ and I have been hacking on a detailed spec (over 35 pages now!) and a
<a href="https://github.com/parrot/parrot/compare/master...m0-prototype">"final prototype"</a>
in Perl 5 in the last few weeks. M0 is as "magic level 0",
which means it consists of the most basic building blocks of a virtual machine,
which the rest of the VM can be built with. The term "magic" means high-level
constructs and conveniences, such as objects, lexical variables, classes and
their associated syntax sugar. M0 is not meant to be written by humans, except
during bootstrapping. In the future, M0 will be probably be generated from
Parrot Intermediate Representation (PIR), Not Quite Perl 6 (NQP) or other High Level Languages (HLLs).</p>

<p>The most important reason for M0 is to correct the fact that too much of Parrot
internals are written in C. Parrot internals is constantly switching between
code written in PIR, other HLL's such as NQP and C. Many types of optimizations
go right out the window when you cross a language boundary. It is best for a
virtual machine to minimize crossing language boundaries if an efficient 
<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Just-in-time_compilation">JIT compiler</a>
is wanted, which we definitely desire. Since many hotpaths in Parrot
internals cross between PIR and C, they can't be inlined or optimized as much
as we would like.</p>

<p>A few years back, Parrot had a JIT compiler, from which many lessons were
learned.  I am sure some people were frustrated when we removed it in 1.7.0 but
sometimes, it is best to start from a clean slate with many more lessons
learned under your belt. Our old JIT did support multiple architectures but
required maintaining a "JIT version" of every opcode on each architecture
supported.  Clearly, this method was not going to scale or be maintainable.</p>

<p>I will venture to say that M0 is the culmination of the lessons learned from
our failed JIT. I should note that "failure" does not have a negative
connotation in my mind. Indeed, only through failure are we truly learning. If
you do something absolutely perfectly, you aren't learning.</p>

<p>We are at an exciting time in Parrot's history, in that for a long time, we
wanted an elegant JIT, using all the latest spiffy techniques, but it was
always an abstract idea, "just over there", but not enough to grab a-hold of. A
new JIT that meets these goals absolutely requires something like M0, and is
the driving force for its design.  M0 will pave the way for an efficient JIT to
be implemented on Parrot.</p>

<p>M0 currently consists of under 40 opcodes from which (we wager) all the rest of
Parrot can be built upon. This is radically different from how Parrot currently
works, where all of the deepest internals of Parrot are written in heavily
macroized ANSI 89 C.</p>

<p>M0 has a source code, i.e. textual form and a bytecode form. chromatic++
brought up a good point at the beginning of the meeting about the bytecode file
containing a cryptographic hash of the bytecode. This will allow one to
distribute bytecode which can then be cryptographically verified by whoever
eventually runs the bytecode. This is a very "fun" application of cryptography
that I will be looking into further.</p>

<p>allison++ brought up some good questions about how merging bytecode files would
be done. We hadn't really thought about that, so it lead to some fruitful
conversation about how Parrot Bytecode (PBC) is currently merged, what it does
wrong, and how M0 can do it less wronger.</p>

<p>We then talked about what exactly a "Continuation" in M0 means, and tried to clear
up some definitions between what is actually meant by Context, State and Continuation.</p>

<p>chromatic++ also mentioned that an optional optimization for the garbage
collector (GC) would be for it to create a memory pool solely to store
Continuations, since they will be heavily used and many of them will be
short-lived and reference each other, so having them in a small confined memory
region will reduce cache misses. We are filing this under "good to know and we
will do that when we get there."</p>

<p>Next we turned to concurrency, including how we would emulate the various
concurrency models of the languages we want to support, such as Python's <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Global_Interpreter_Lock">Global
Interpreter Lock (GIL)</a>.
We decided that M0 will totally ignorant of
concurrency concepts, since it is a "magical" concept that will be implemented
at a higher level. We have started to refer to the level above M0 as M1 and
everything above M0 as M1+.</p>

<p>allison++ also mentioned that many innovations and optimizations are possible in
storing isolated register sets for each Continuation (a.k.a call frame). This
area of Parrot may yield some interesting surprises and perhaps some
publishable findings.</p>

<p>We all agreed that M0 should be as ignorant about the GC as possible, but the
GC will most likely learn about M0 as optimizations are implemented. The
pluggability of our GC's were also talked about. allison++ raised the question
"Are pluggable GC's easier to maintain/implement if they are only pluggable at
compile-time?" Indeed, they probably are, but then we run into the issue that
our current "make fulltest" runs our test suite under different GC's, which
would require multiple compiles for a single test suite run. chromatic++ made a
suggestion that we could instead make GC's pluggable at link-time (which would
require a decent amount of reorganization) which would still allow developers to
easily test different GC's without recompiling all of Parrot.  chromatic++'s
estimate is that removing runtime pluggability of GC's would result in an
across the board speed improvement of 5%.</p>

<p>This conversation then turned toward the fact that M0 bytecode might depend on
what GC was used when it was generated, i.e. the same M0 source code run under
two different GC's would generate two different bytecode representations. This
would happen if the M0 alloc() opcode assumes C calling conventions. This was
generally deemed distasteful, so our alloc() opcode will not "bake in C
assumptions", which is a good general principle, as well. This will be a fun
test to write.</p>

<p>allison++ brought up the fact that we may need a way to tell the GC "this is
allocated but uninitialized memory", a.k.a solve the "infant mortality"
problem.  chromatic++ suggested that we could add some kind of lifespan flag to
our alloc opcode (which currently has an arbitrary/unused argument, since all
M0 opcodes take 3 arguments for symmetry and performance reasons). This could
be as simple as hints that a variable is local or global, or a more detailed
delineation using bit flags.</p>

<p>It was also decided that we didn't need an invoke opcode and that invoke properly
belongs as a VTABLE method on invokables.</p>

<p>We also talked about the fact that register machines greatly benefit from
concentrating VM operations on either the caller or the callee side. Looking
for more references about this. It seems that the callee side seems to be
what we will try for, but I am not quite sure why.</p>

<p>We finally talked about calling conventions and decided that goto_chunk should
roughly be equivalent to a jmp (assembly unconditional jump to address) and
the invoke VTABLE would setup a return continuation (i.e. make a copy of the
program counter), do a goto_chunk, and let the callee handle the rest, such
as looking up a return continuation and invoking it.</p>

<p>After the main M0 meeting, cotto++, allison++ and I sat down at a coffee shop
and came up with a list of next actions for M0:</p>

<ul>
<li>Write a recursive version of 'calculate the n-th Fibonacci number' in M0</li>
<li>Write a simple checksum algorithm in M0 (suggestions?)</li>
<li>Create a working PMC in M0</li>
<li>M0 disassembler</li>
<li>Create a "glossary brochure for <a href="https://github.com">Github</a> cruisers"</li>
<li>Implement function calls and returns</li>
<li>Make sure each M0 opcode is tested via <a href="http://search.cpan.org/dist/Devel-Cover/">Devel::Cover</a></li>
<li>Convert the <a href="https://github.com/parrot/parrot/blob/m0-prototype/src/m0/m0_assembler.pl">M0 assembler</a> to C</li>
<li>Convert the <a href="https://github.com/parrot/parrot/blob/m0-prototype/src/m0/m0_interp.pl">M0 interpreter</a> to C</li>
<li>Link M0 into libparrot (no-op integration)</li>
</ul>

<p>I have been talking to cotto++ on IRC while typing up these notes and we have
come to the conclusion that a <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Java_Virtual_Machine#Bytecode_verifier">"bytecode verifier"</a>
should also be put on that
list. A verifier is a utility that detects invalid bytecode and prevent attacks
via malicious bytecode. This is something that happens at runtime, where as a
bytecode checksum happens <em>before</em> runtime, or at the end of compile time.
They provide different kinds of insurance. The bytecode checksum feature will
be an instrinsic feature that is not optional, since it prevents Parrot from
running known-bad bytecode. But a bytecode verifier adds a significant amount
of overhead. This overhead is reasonable if you are running untrusted code, but
it is unreasonable when your are running trusted bytecode (i.e. bytecode that
you created), so the verifier will have an option to be turned off.</p>

<p>We obviously have a lot of fun stuff to work on, so if any of it sounds fun,
come ask cotto++ or me (dukeleto) on #parrot on irc://irc.parrot.org for some M0
stuff to do. We especially need help with writing tests and documentation.</p>

<p>There will be a Parrot hackathon at <a href="http://www.yapc2011.us/yn2011/">YAPC::NA</a>
this year, where I am sure some M0-related hacking will be happening. If you
have never been to a hackathon before, I highly recommend them as a way to join
a project and/or community.  Meatspace is still the best medium for some things
:)</p>

<p>(UPDATE: Some factual errors about our old JIT were pointed out by rafl++ and
corrected)</p>
]]>
        
    </content>
</entry>
  <entry>
    <title>Parrot Embed Grant Update #6 : Still Hackin', Less Slackin'</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2011/05/parrot-embed-grant-update-6-still-hackin-less-slackin.html"/>
    <id>tag:leto.net,2011:/dukeleto.pl//9.251</id>

    <published>2011-06-01T06:51:45Z</published>
    <updated>2011-06-01T06:58:49Z</updated>

    <summary>I am excited to announce that I have completed my next grant milestone! I recently increased test coverage of extend_vtable.c to over 95% ( 95.5% to be exact), achieving the milestone with a half percent buffer. It definitely wasn't easy,...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="grant" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="testing" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="embed" label="embed" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="extend" label="extend" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="parrot" label="parrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="tests" label="tests" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="vtable" label="vtable" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[<p>I am excited to announce that I have completed my next grant milestone!  I
recently increased test coverage of extend_vtable.c to over 95% (
<a href="http://tapir2.ro.vutbr.cz/cover/latest-c_cover/src-extend_vtable-c.html">95.5%</a> to be
exact), achieving the milestone with a half percent buffer. It definitely
wasn't easy, but I changed the way I was approaching writing tests and it
resulted in a <a href="https://github.com/parrot/parrot/compare/5dd8c543ab...8c04cc3e66">huge burst of
productivity</a>.</p>

<p>I went through a test coverage report and wrote down, on an actual piece of
<em>paper</em>, every function that had no test coverage. This allowed me to circle
the functions that I thought would be easiest to write tests for, and quickly
got those out of the way. I then went for uncovered functions that were similar
to already covered functions, and then finally I got to the hard functions.</p>

<p>This was a fruitful exercise, because it was decided by Parrot developers that
some VTABLE functions escaped accidentally and that they should be removed from the public API.
Whiteknight++ <a href="https://github.com/parrot/parrot/commit/cbfc76e64acf9f0a526b5f7da0e4c6c4ec0d1189">removed Parrot_PMC_destroy (extra points for humor)</a>, which I was using incorrectly in the
extend_vtable tests and which was actually coredumping Parrot, but only on certain
platforms. I then removed <a href="https://github.com/parrot/parrot/commit/cd1edef38c9f7d4af8ec3229fa166e4fe92d21f6">Parrot_PMC_mark</a> and <a href="https://github.com/parrot/parrot/commit/44a9634f2764ccccfd7a5cbad1552159fc73bff8">Parrot_PMC_invoke</a>, the first being
an implementation detail of the garbage collector, and Parrot_PMC_invoke because
it was the only function that returned a '''Parrot_Opcode_t*''' and basically
not fit for public consumption.</p>

<p>I also <a href="http://trac.parrot.org/parrot/ticket/2126">created a ticket (TT#2126)</a>
for a bug in the Parrot_PMC_morph function, which
has some possibly buggy but definitely unspecified behavior.</p>

<p>The remaining, untested functions in extend_vtable are clone_pmc, cmp_pmc,
get_pointer_keyed_int, get_pointer_keyed_str, remove_vtable_override,
set_pointer_keyed and set_pointer_keyed_str. I leave the testing of these
functions as an exercise to the interested reader :)</p>

<h2><strong><big>Grant Refactoring</big></strong></h2>

<p>This reminds me of a saying, I can't remember it exactly, but it is something
about the best laid plans of camels and butterflies often taste like onions.
Anyway, since I wrote my grant, the Parrot Embed API was deprecated and replaced
with a shinier and better documented system. After talking with cotto++ and
whiteknight++ on IRC, it was decided that working on test coverage for the new
embed API was a better use of resources than writing tests for the old embed
API that my original grant referred to, which will most likely be removed from
Parrot soon.</p>

<p>The new embed API is called <a href="https://github.com/parrot/parrot/blob/master/src/embed/api.c">src/embed/api.c</a>
and the plan is to replace my grant milestone of 95% coverage of embed.c with 95% coverage
of embed/api.c, which is currently at <a href="http://tapir2.ro.vutbr.cz/cover/latest-c_cover/src-embed-api-c.html">72%</a> coverage.</p>

<p>To summarize, I have two grant milestones left, increasing extend.c (currently
at <a href="http://tapir2.ro.vutbr.cz/cover/latest-c_cover/src-extend-c.html">61%</a> )
and embed/api.c to 95% coverage.</p>

<p>Given the lessons learned from testing extend_vtable and based on the fact that
I have already <a href="https://github.com/parrot/parrot/commit/b59b869c9dd6f51109aa41e495082e09844ba348">made some
headway</a>,
my new estimate for these milestones is three weeks each. To make this more
definite, I plan to be done with this grant work by July 15th.</p>

<p>This is the home stretch! I can feel it in my bones.</p>
]]>
        
    </content>
</entry>
  <entry>
    <title>Parrot Embed Grant Update #5 : Zen Pebbles</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2011/04/parrot-embed-grant-update-5-zen-pebbles.html"/>
    <id>tag:leto.net,2011:/dukeleto.pl//9.245</id>

    <published>2011-04-28T05:46:31Z</published>
    <updated>2011-04-28T05:51:04Z</updated>

    <summary> I am still on the path of increasing test coverage in src/extend_vtable.c. It is much like a zen study, where you methodically concentrate on many tiny little pebbles, one at a time, moving them in the sand, to just...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="grant" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="embed" label="embed" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="extend" label="extend" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="parrot" label="parrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="testing" label="testing" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="tpf" label="tpf" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[<p>
I am still on the path of increasing
<a href="https://github.com/parrot/parrot/blob/master/t/src/extend_vtable.t">test coverage in
src/extend_vtable.c</a>. It is much like a zen study, where you methodically concentrate on
many tiny little pebbles, one at a time, moving them in the sand, to just the right place.
According to the latest code coverage statistics, we are now at <a href="http://tapir2.ro.vutbr.cz/cover/latest-c_cover/src-extend_vtable-c.html">72% code coverage</a>, which is an increase of about 8% since my last report.
</p>


<p>
Many, many more tests involving
<a href="http://docs.parrot.org/parrot/devel/html/src/pmc/key.pmc.html">Key PMCs</a> were added. For an intro to what
they are, take a look at my <a href="http://leto.net/dukeleto.pl/2011/04/parrot-embed-grant-update-4-the-journey-continues.html">previous grant update</a>. Many of the tests are clusters of related tests,
because most VTABLEs have many similar forms which take integer, string or PMC-flavored keys. I ran into some platform-specific
bugs which only manifest on Darwin machines, which were reported by <a href="http://trac.parrot.org/parrot/ticket/2098">Jim Keenan in TT# 2098</a>
and which I then fixed by querying with a non-empty Key, which is more prudent.
</p>

<p>
I also ran into some actual bugs which I reported as Trac Tickets. First is that the cmp_pmc VTABLE does
not seem to be working correctly from extend_vtable, which was reported in <a href="http://trac.parrot.org/parrot/ticket/2103">TT #2103</a>.
Then I fell into a "hole" in the VTABLE API, where ResizablePMCArray does not respond to defined_keyed(), which it should. This is described
in <a href="http://trac.parrot.org/parrot/ticket/2094">TT #2094</a>.
</p>

<p>
In retrospect, this was one of the most productive periods of my grant work. I estimate that I will be very close to the 95% milestone by my next grant
update at this pace, which is very exciting.
</p>

]]>
        
    </content>
</entry>
  <entry>
    <title>Parrot Embed Grant Update #4 : The Journey Continues</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2011/04/parrot-embed-grant-update-4-the-journey-continues.html"/>
    <id>tag:leto.net,2011:/dukeleto.pl//9.242</id>

    <published>2011-04-05T05:47:28Z</published>
    <updated>2011-04-06T05:49:34Z</updated>

    <summary> This wayward son is still on his treacherous journey to increase test coverage in src/extend_vtable.c. When we last left off our traveler, he explained what the mythical VTABLE beast looked like, and we shall continue with the study of...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="grant" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="tpfgrantparrot" label="tpf grant parrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[<p>
This wayward son is still on his treacherous journey to increase 
<a href="https://github.com/parrot/parrot/blob/master/t/src/extend_vtable.t">test coverage in
src/extend_vtable.c</a>. When we last left off our traveler, he explained what the mythical
VTABLE beast looked like, and we shall continue with the study of this chimerical
fauna.
</p>
<p>
According to the latest code coverage statistics, we are now at <a href="http://tapir2.ro.vutbr.cz/cover/latest-c_cover/src-extend_vtable-c.html">64% code coverage</a>, which is an increase of about 10% since my last report.

Most of this grant work concentrated on vtables that required 
<a href="http://docs.parrot.org/parrot/devel/html/src/pmc/key.pmc.html">Key PMCs</a>. A Key PMC is
an object that can be used to look something up in a <a href="http://docs.parrot.org/parrot/devel/html/src/pmc/hash.pmc.html">Hash PMC</a> or other aggregated object
that supports "keyed access". It is very much similar to a "hash key" that can be used
to look up the appropriate value.
</p>
<p>
One of the lessons that I have learned in working on these tests is that it is very
easy to write tests that pass on gcc, but which <a href="http://trac.parrot.org/parrot/ticket/2084">absolutely explode with g++</a>. This
has to do with gcc not being as strict when some questionable type casting is done.
I have learned my lesson and I promise not to break the test suite anymore. I will
use g++ in my testing from now on, promise!
</p>
<p>
My productivity was definitely hampered by moving to a new house and having a two week
business trip in the last month, but my new home office is finally set up, so I expect
productivity to approach previous levels of adding a few dozen tests per week.
</p>]]>
        
    </content>
</entry>
  <entry>
    <title>Parrot Embed Grant Update #3 : Now with Dragons</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2011/02/parrot-embed-grant-update-3-now-with-dragons.html"/>
    <id>tag:leto.net,2011:/dukeleto.pl//9.241</id>

    <published>2011-02-28T06:44:25Z</published>
    <updated>2011-03-01T21:37:16Z</updated>

    <summary> The quest to improve test coverage for src/extend_vtable.c has continued. Some dragons were slayed, a few trolls were paid tolls to cross creaky bridges of abstraction and many siren calls to hack on other code were dutifully ignored (mostly)....</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="embed" label="embed" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="parrot" label="parrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="tpf" label="tpf" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[<p>
The quest to improve test coverage for src/extend_vtable.c has continued. Some dragons
were slayed, a few trolls were paid tolls to cross creaky bridges of abstraction and
many siren calls to hack on other code were dutifully ignored (mostly).

</p>
<p>
This <a href="http://perlfoundation.org">TPF</a> grant has forced me to become very familiar with Parrot vtables (virtual tables),
which is basically an API for talking to Parrot <a href="https://github.com/parrot/parrot/blob/master/docs/pdds/pdd17_pmc.pod">PMCs</a> 
(really just objects with a funny
name). PMC can stand for Parrot Magic Cookie or PolyMorphic Container. Take your pick.

</p>
<p>
Firstly, vtable is already slang for "vtable function", which expands to "virtual table function."
What the junk is a "virtual table function" ? I find that the simplest way to think about
it is that every PMC has <i>slots</i> or <i>buckets</i> with standardized names such as
<b>get_bool</b> (get Boolean value) or <b>elements</b> (how many elements does this PMC have?)

</p>
<p>
All PMCs inherit sensible defaults for most vtables, but they are allowed to
override them. Why would you want to override them? As a simple example, let us assume there is a vtable called <b>length</b> (there isn't actually, but it makes an easy example to explain these concepts). Our <b>length</b> vtable will act just like <b>elements</b> and tell us how many elements a PMC has.

If we had a complex number PMC that was really just an <a href="https://github.com/parrot/parrot/blob/master/src/pmc/fixedfloatarray.pmc">FixedFloatArray PMC</a> 
of two
numbers underneath, the <b>length</b> would always return 2 for every complex
number. Not very useful.

</p>
<p>
A much more useful <b>length</b> vtable would use the coefficients <b>a</b> and
<b>b</b> from <b>a + b*i</b> and compute the Euclidean distance (length from
the origin) <b>sqrt(a^2 + b^2)</b>. Hopefully you now have a taste for what
what vtables are about. Parrot PMCs have over 100 vtables that can be
overridden to provide custom functionality.

</p>
<p>
I recently ran across the <b>hashvalue</b> vtable and couldn't find any tests
for it in Parrot core (outside of the test that I had written for it in
extend_vtable.t) or any use of it in <a href="http://rakudo.org">Rakudo Perl 6</a>. Oh noes! It seemed like an
unused/untested feature, so I created a <a href="http://trac.parrot.org/parrot/ticket/2027">Trac Ticket</a> to mark it as deprecated so it could
be removed in a future release.

</p>
<p>
The discussion about the ticket was fierce. <a href="https://github.com/NotFound">NotFound++</a> explained why the vtable
was important and the mighty coding robot known as <a href="https://github.com/bacek">bacek++</a> manifested tests quickly.
</p>

<p>
Yet another case of this grant work having a positive impact on the Parrot codebase,
even outside the embed/extend interface. I also <a href="https://github.com/parrot/parrot/commit/612ec787dc975c4d570fb9b95d5f9fbd2993e92a">improved an error message in the PMCProxy PMC</a>,
which arises when something goes bad during a partial re-compile. Yay for improved debuggability!
</p>
<p>
According to the current <a href="http://tapir2.ro.vutbr.cz/cover/latest-c_cover/src-extend_vtable-c.html">code coverage statistics</a>,
extend_vtable.c is up to 54% coverage from 43%,
which is not quite where I predicted from my last update. No doubt this has something to
do with me packing and preparing to move to a new house this month. My velocity didn't
decrease so much as the amount of time that I had to work on this grant.
</p>
<p>
I am greatly enjoying working on this grant and even if it is going a bit slower than I had planned, I am very confident that it will be completed in the next few months and hopefully sooner.
</p>
]]>
        
    </content>
</entry>
  <entry>
    <title>Parrot Embed Grant Update #2</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2011/01/parrot-embed-grant-update-2.html"/>
    <id>tag:leto.net,2011:/dukeleto.pl//9.239</id>

    <published>2011-01-24T08:53:30Z</published>
    <updated>2011-01-24T20:28:34Z</updated>

    <summary> I have slowly but surely been increasing test coverage of src/extend_vtable.c, which when I started my grant was at 5% and is now sitting at 43%. I estimated that it would take about two weeks to get it to...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="grant" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="testing" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="testing" label="testing" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[<p>
I have slowly but surely been increasing test coverage of src/extend_vtable.c, which
when I started my grant was at 5% and is now sitting at 43%. I estimated that it would
take about two weeks to get it to 50% and then another two weeks to get to 95%, but
this was a bit optimistic. When I look back, giving myself a month for each would
have been appropriate.
</p>

<p>
I do believe that my development velocity has increased recently, because I wrote
a convenience funciton called extend_vtable_output_is(), which greatly reduces
the number of lines of code that each extend_vtable test requires. The function
is basically a wrapper around already existing functions that automates the process
of compiling C source code use the Parrot C API, but it removes the need for roughly
40 lines of boilerplate stuff, such as including the proper header files, defining
convenience functions that do basic error checking and data structure creation.
</p>

<p>
The whole reason this subsystem is undertested is because no function like
extend_vtable_output_is() existed.  Now each of my extend_vtable tests is
around 10 lines, instead of 50. I've only had the new function for about
half the time of the grant, so tests are now getting written much faster.
</p>

<p>
I have added about 700 lines of lines of tests since this grant started (using
the spiffy new extend_vtable_output_is() function), and that has caused a 38%
increase in test coverage. With the power of mathematics, we can figure out
that (.38)*N = 700, which means N = 700/.38 = ~1842, where N is the number of
lines of tests needed to cover 100% of the file (roughly).
</p>

<p>
My new estimate for getting to 95% coverage of extend_vtable is one month
from now, Feb 24th, and then another two months for the rest of the grant.
</p>

<p>
The reason I say two months is that I am actually trying to hit a
<a href="http://tapir2.ro.vutbr.cz/cover/latest-c_cover/">moving target</a>,
and the code coverage of extend.c and embed.c have actually *gone down* since
I started the grant. Currently extend.c is about 6% lower and embed.c is about 14%
lower. This means my grant is actually getting harder to complete.
</p>

<p> I also learned about a very useful yet undocument environment variable
called POSTMORTEM which makes Parrot test functions leave various intermediate
files around for debugging purposes if it is set to true, which greatly helps
in developing these tests. I plan to add documentation about this to the Parrot
developer documentation.  </p>

<p>
Given the new test function and the new coverage numbers, I estimate that I will
be able to complete this grant by late April 2011.
</p>
]]>
        
    </content>
</entry>
  <entry>
    <title>Parrot Embed Grant Update #1</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2010/12/parrot-embed-grant-update-1.html"/>
    <id>tag:leto.net,2010:/dukeleto.pl//9.237</id>

    <published>2010-12-24T20:48:43Z</published>
    <updated>2010-12-24T21:15:38Z</updated>

    <summary> My work on a TPF grant to improve documentation and test coverage of the Parrot Embedd API is going well. I have added extensive examples of Parrot function and type signatures, as well beginning to increase test coverage of...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="embed" label="embed" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="parrot" label="parrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[
<p>
My work on a <a href="http://perlfoundation.org">TPF</a> grant to <a href="http://news.perlfoundation.org/2010/11/2010q4-grant-proposal-improve.html">improve documentation and test coverage of the Parrot Embedd API</a>
is going well. I have added extensive examples of Parrot function and type signatures, as
well beginning to increase test coverage of this subsystem.
</p>

<p>
I am working in the <a href="https://github.com/parrot/parrot/commits/leto%2Fembed_grant">leto/embed_grant</a>
 branch on <a href="http://github.com">Github</a>, which has already been merged to master
just before the release of Parrot 2.11.0.
</p>

<p>
My first merge of this topic branch included about 15 commits, which are about 2/3rds
documentation and 1/3rd tests. I clarified some points about edge cases of Parrot function
signatures, such as void input and void output, which is the emtpy string concatenated
to both sides of an arrow <b>-></b>, and gave an expanded description of what <b>Pi</b> means (PMC, invocant).
Many examples of diverse kinds of function signatures were also added.
</p>

<p>
I gave the first user-visible documentation for many constants in the Embed subsystem,
such as debug flags when creating interpreter objects and inline descriptions of different
runcores that can be used with interpreter objects.
</p>

<p>
The tests that I added include the first coverage of returning Float PMCs and numeric
constants from our embedding subsytem, as well as additional coverage for returning a ResizablePMCArray
consisting of Numeric PMCs. I also added tests for creating multiple interpreter objects and
added a TODO test for <a href="http://trac.parrot.org/parrot/ticket/1880">Trac Ticket 1880</a>.
</p>

<p>
I also fixed a bug in the Parrot test suite, where tests in t/src were not skipped properly if
src/parrot_config.o did not exist.
</p>

<p>
Most of this work was done between Thanksgiving and holiday travel, so I expect that development
pace will pick up in the next few days. Currently, one of four inchstones has been achieved, and I will
concentrate on raising the code coverage of extend_vtable.c in the next two weeks.
</p>

<p>
I would like to thank The Perl Foundation, and Karen Pauley in particular, for funding this
very important grant to the Parrot and Rakudo Perl 6 communities.
</p>
<p>
]]>
        
    </content>
</entry>
  <entry>
    <title>Google Code-In brings fresh blood to the Perl and Parrot communities</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2010/11/parrot-foundation-the-perl-foundation-google-code-in.html"/>
    <id>tag:leto.net,2010:/dukeleto.pl//9.234</id>

    <published>2010-11-15T14:06:50Z</published>
    <updated>2010-11-15T08:00:09Z</updated>

    <summary>I'm excited to announce that Parrot Foundation and 
The Perl Foundation
have been accepted as organizations in Google Code-In 2010!</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="gci" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="gsoc" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="gci" label="gci" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="gsoc" label="gsoc" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="parrot" label="parrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="tpf" label="tpf" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[<!--
<h1>Google Code-In brings fresh blood to the Perl and Parrot communities</h1>
-->

<p>
I'm excited to announce that <a href="http://parrot.org">Parrot Foundation</a> and 
<a href="http://perlfoundation.org">The Perl Foundation</a>
have been accepted as <a href="http://socghop.appspot.com/gci/org/show/google/gci2010/parrot_perl_foundations">organizations in Google Code-In 2010</a>!
</p>

<p>
<a href="http://socghop.appspot.com/gci/program/home/google/gci2010">Google Code-In</a> is a contest, similar to <a href="http://socghop.appspot.com/gsoc/program/home/google/gsoc2010">Google Summer of Code</a>, where Google
pays students aged 13-18 to do tasks designed by open source
communities, while learning about open source. Google pays for the
work to be done, and we get new members to our communities, while students
learn useful skills. It is a big win for everyone.
</p>

<p>
In 2010, Google Summer of Code was a great success for Perl and Parrot.
We got <a href="http://google-opensource.blogspot.com/2010/10/perl-and-parrot-spread-open-source-love.html">amazing new features in Parrot, Perl 5 and Perl 6 </a>.
In 2009, we had <a href="http://google-opensource.blogspot.com/2009/10/perls-of-wisdom-perl-foundation-parrots.html">similarly spectacular results</a>.
</p>

<p>
For the students, the benefits are huge. They get mentored by some
of the best minds in open source and get "street cred" in the
community. This contest also acts as a stepping stone for Google
Summer of Code, so students that excel at Code-In will most likely be
sought after for future Google Summer of Code involvement.
It's also fantastic experience to put on a r&eacute;sum&eacute;.
I see many Google Summer of Code students get snapped up by respected
companies, or accepted to prestigious academic institutions.
</p>

<p>
The more well-documented tasks we have before that, the more students we will
have the potential to attract. I can attest that these kind of contests
attract some of the smartest students in the world, so the Perl and Parrot communities
have much to gain by being involved.
</p>

<p>
I expect great results for Code-In as well, but we need your help. The Google
Code-In contest opens up for students on:
</p>

<ul>
<li>
    <b>November 22, 2010 at 12:00 AM Pacific Time / 08:00 UTC</b>.
</li>
</ul>


<h2>How Can You Get Involved?</h2>

<ul>
<li>
<b>Add a task to our <a href="http://trac.parrot.org/parrot/wiki/GoogleCodeIn2010Tasks">task list</a></b> There is a template
that you can copy and paste, as well as many examples. Any task related to Perl 5, Perl 6 or Parrot is fair game.
</li>

<li>
<b>Improve the description of an existing task</b>. The more specific a task and
the more documentation and links you provide, the easier it is for a student
to choose and complete a task.
</li>

<li>
<b>Volunteer to mentor a student on a task</b>. You apply to be a mentor
<a href="http://socghop.appspot.com/gci/org/apply_mentor/google/gci2010">here</a>. Please join the
<a href="https://groups.google.com/group/tpf-gsoc-students">tpf-gsoc-students</a>
mailing list and introduce yourself. Provide a brief description of why you are interested when you sign up, so we know you aren't a bot :)
Please also join the <b>#gci</b> channel on <a href="http://www.irc.perl.org/">irc.perl.org</a>.
</li>

<li>
<b>Tell potential students about Google Code-In and how we are involved.</b> Here is a link
to the <a href="http://socghop.appspot.com/document/show/gci_program/google/gci2010/faqs#actual_timeline">timeline</a>
and <a href="http://socghop.appspot.com/document/show/gci_program/google/gci2010/faqs">FAQ</a> that you can send them, as well as 
<a href="http://code.google.com/p/google-code-in/downloads/list">flyers</a> to post.
</li>

]]>
        
    </content>
</entry>
  <entry>
    <title>GSoC 2010 Mentor Summit and Git Together Wrap Up</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2010/10/gsoc-2010-mentor-summit-and-git-together-wrap-up.html"/>
    <id>tag:leto.net,2010:/dukeleto.pl//9.233</id>

    <published>2010-10-27T18:30:39Z</published>
    <updated>2010-10-27T19:54:05Z</updated>

    <summary> So many amazing things happened at the Google Summer of Code Mentor summit 2010! I will try to jot a few of them down, before they leave for warmer climates. For those that just want to read all the...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="git" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="gsoc" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="rtems" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="gsoc" label="gsoc" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="gsoc2010" label="gsoc2010" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="parrot" label="parrot" 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://leto.net/dukeleto.pl/">
        <![CDATA[<p>
So many amazing things happened at the <a href="http://code.google.com/soc">Google Summer of Code</a> Mentor summit
2010! I will try to jot a few of them down, before they leave for warmer
climates. For those that just want to read all the session notes, you can
find them <a href="http://gsoc-wiki.osuosl.org/index.php/Session_Notes_2010">here.</a>
Also, if you haven't yet read about how <a href="http://perlfoundation.org">The Perl Foundation</a> and 
<a href="http://parrot.org">Parrot Foundation</a>
fared this summer, you can read about it on the 
<a href="http://google-opensource.blogspot.com/2010/10/perl-and-parrot-spread-open-source-love.html">Google Open Source Blog</a>.
</p>

<p>
It began by arriving a bit early to work with <a
href="http://www.flickr.com/photos/selenamarie/5112086494/in/set-72157625233172162/">some
awesome people</a> on improving the <a href="http://yfrog.com/m9h61rj">GSoC
Mentor Manual</a> by adding a chapter for Organization Admins (there is
actually documentation now!) and writing a GSoC Student Manual. This "book
sprint" was facilitated by Adam Hyde of <a
href="http://flossmanuals.net">FLOSSManuals</a>, and they were written with a
completely open source software stack, as well as being released under a
Creative Commons license. They are free for anyone to read online and are
easily exportable to many formats. Read the 
<a href="http://www.booki.cc/gsocstudentguide/">Student Manual</a> or the
<a href="http://www.booki.cc/gsoc-mentoring/">Mentor+Org Admin Manual</a> online now!  We even <a
href="http://blog.booki.cc/?p=588">bound 60 copies of the books</a> and handed
them out to mentors attending the summit.
</p>

<p>
<a href="http://parrot.org">Parrot</a> on <a href="http://rtems.com">RTEMS</a>
hacking with Chris Johns and Ralf from RTEMS.  We used Centos 5 RPMS on Ubuntu
10.04 with rpm2cpio piped to cpio, which was a trick to get around the fact
that RTEMS does not have debian packages. It worked remarkably well.  I had a
cross-compilation environment setup after a few minutes. I think they will be
adding these intructions to their wiki. Now that I have the RTEMS toolchain on
my netbook, I will be much more productive with regard to Parrot on RTEMS.
</p>

<p>
Chromatic, Chris Johns and I sat in a room and talked shop about how Parrot and
RTEMS can play nicely together. There are still some feature voids on the
Parrot side to fill: Parrot calls exit() in various places, which reboots RTEMS
    i.e. a syntax error reboots the OS. Not Fun. Parrot also needs a C probe to detect RTEMS, which already has a 
   ticket in our bug tracker.
A real-time garbage collector will be needed for long-running processes,
but for short-lived applications, disabling the GC with the -G command
line argument to Parrot will work.
</p>

<p>
I gave <a href="http://twitpic.com/30j8k5">a</a>
<a href="http://twitgoo.com/1pytme">session</a> with <a href="http://www.chesnok.com/daily/">Selena Deckelmann</a> 
and <a href="http://bart-massey.com/">Bart Massey</a> introducing <a
href="http://twitter.com/trolluni">Troll University</a>, which aims to educate
organizations, corporations and open source communities about what motivations
and principles trolls use and how to protect against them. We are working
on some Trollcasts, so stay tuned!
</p>

<p>
I also gave a session called <a
href="http://openetherpad.org/dynlanginterop">Dynamic Language
Interoperability</a>, which has been held for the last few years, to my
knowledge. The consensus seemed to be that every dynamic language has the same
interop problems, and Parrot VM seems to be the only project working hard to
solve these complex issues in a general manner. This gives me a lot of hope
that people will soon realize that Parrot is full of WIN.
</p>

<p>
It also <a href="http://twitter.com/#!/dukeleto/status/28729519750">came to my attention during the conference</a> that 
<a href="http://github.com">Github</a> hired the student
that mentored under them this year to work on <a href="http://libgit2.github.com/">libgit2</a>. This is one example
of the amazing opportunities that students have after completing a Google Summer of Code. The sky really is the limit.
And just in case you think this is an isolated incident, <a href="http://bergie.iki.fi/blog/summer_of_code_works/">it isn't</a>.
</p>

<p>
As if writing some books and going the Mentor Summit wasn't enough to totally
drain me, I am currently attending the last day of the GIT Together 2010, which
is the yearly Git developer and user meetup/unconferencey thing. I have learned
so much that I can't even begin to describe it, but if you want to look at
session notes, you can find them <a href="https://git.wiki.kernel.org/index.php/GitTogether10">here</a>.
</p>
]]>
        
    </content>
</entry>
  <entry>
    <title>Google Summer of Code 2010 Final Summary</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2010/09/google-summer-of-code-2010-final-summary.html"/>
    <id>tag:leto.net,2010:/dukeleto.pl//9.228</id>

    <published>2010-09-09T00:00:25Z</published>
    <updated>2010-09-09T23:18:06Z</updated>

    <summary> Google Summer of Code is a global program that offers student developers summer stipends to write code for various open source software projects. Google Summer of Code 2010 went by quickly, and much was accomplished. The Perl Foundation and...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="gsoc" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="rakudo" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="gsoc" label="gsoc" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="gsoc2010" label="gsoc2010" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="parrot" label="parrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="rakudo" label="rakudo" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[<p>
<a href="http://code.google.com/soc">Google Summer of Code</a> is a 
<a href="http://2.bp.blogspot.com/_p15UnEJyA1c/S-n9fLTuNOI/AAAAAAAAAXs/UK7gBt5sxak/s1600/graph.png">global</a>
program that offers student developers
summer stipends to write code for various open source software projects.
Google Summer of Code 2010 went by quickly, and much was accomplished.
<a href="http://perlfoundation.org">The Perl Foundation</a> and
<a href="http://parrot.org/foundation">Parrot Foundation</a> took part this year, and we
were lucky to get proposals from very bright and capable students.
We started the summer with 10 students and had 8 students pass their
final evaluations. The passing projects include:
</p>

<pre>
Ryan Jendoubi -- Ctypes for Perl
Mentor: Reini Urban
Blog: <a href="http://blogs.perl.org/users/doubi/">http://blogs.perl.org/users/doubi/</a>
Repo: <a href="http://gitorious.org/perl-ctypes/perl-ctypes">http://gitorious.org/perl-ctypes/perl-ctypes
</pre></a>

<p>
This project is <a href="http://twitter.com/kraih/status/23046432913">exciting</a>
<a href="http://www.modernperlbooks.com/mt/2010/09/less-xsmore-ctypes.html">many</a>
Perl developers, because it would minimize
the need to use <a href="http://en.wikipedia.org/wiki/XS_%28Perl%29">XS</a>, which will make many more pure-Perl modules possible. This
improves portability, becaue XS-based modules are notorious for being fragile
across operating systems and compiler versions. This adds up to a whole lot of WIN.
</p>

<pre>
Nat Tuck -- Hybrid Threads for Parrot
Mentor: Andrew Whitworth
Blog: <a href="http://parrot.org/blog/836">http://parrot.org/blog/836</a>
Repo: <a href="http://github.com/parrot/parrot/tree/gsoc_threads">http://github.com/parrot/parrot/tree/gsoc_threads</a>
</pre>

<p>
Threads allow a single program to use more than one CPU, which is becoming
increasingly important these days. Even mobile phones are multicore! This work
aimed at adding threading support to Parrot Virtual Machine. Much was
accomplished, but this effort is still on-going. So-called "green threads" were
implemented, which is a necessary step to get Hybrid threads working.
</p>

<pre>
Tyler Curtis -- A PAST Optimization Framework for Parrot
Mentor: chromatic
Blog: <a href="http://parrot.org/blog/839">http://parrot.org/blog/839</a>
Repo: <a href="http://github.com/ekiru/tree-optimization">http://github.com/ekiru/tree-optimization</a>
</pre>

<p>
This project is about providing a framework for optimizing 
<a href="http://docs.parrot.org/parrot/devel/html/docs/pdds/pdd26_ast.pod.html">PASTs (Parrot
Abstract Syntax Trees)</a>.  This will be used by language implementors when
optimizing their HLLs (High Level Languages).  This framework allows all
languages on Parrot to benefit from optimizations that are written once,
instead of each language implementor writing their own optimizations.
</p>

<pre>
Daniel Arbelo Arrocha -- NFG and single-representation strings for Parrot
Mentor: Allison Randal
Blog: <a href="https://www.parrot.org/darbelo">https://www.parrot.org/darbelo</a>
Repo: <a href="http://github.com/parrot/parrot/tree/gsoc_nfg">http://github.com/parrot/parrot/tree/gsoc_nfg</a>
</pre>

<p>
NFG stands for Normal Form Grapheme, and basically means having a standard
internal representation of Unicode strings, so that very expensive
conversions do not have to repeatedly take place. This makes string-heavy
computations much faster and unifies a lot of code.
</p>

<pre>
Carl Masak -- Add support for binary data in Rakudo
Mentor: Jonathan Worthington
Blog: <a href="http://use.perl.org/~masak/journal/">http://use.perl.org/~masak/journal/</a>
Repo: <a href="http://github.com/rakudo/rakudo">http://github.com/rakudo/rakudo</a>
</pre>

<p>
<a href="http://rakudo.org">Rakudo Perl 6</a> now supports various binary data
formats that were implemented as part of this project. Many relevant tests were
also added to the <a href="http://github.com/perl6/roast">Perl 6 Spec Test
Suite</a> as well as improvements and clarifications to the
<a href="http://github.com/perl6/specs">Perl 6 Specification</a>.
</p>

<pre>
Muhd Khairul Syamil Hashim -- Instrumentation Tool for Parrot
Mentor: Christoph Otto
Blog: <a href="http://www.parrot.org/blog/841">http://www.parrot.org/blog/841</a>
Repo: <a href="http://github.com/khairulsyamil/parrot-instrument">http://github.com/khairulsyamil/parrot-instrument</a>
</pre>

<p>
This instrumentation tool for Parrot allows one to dynamically peek into the
execution of Parrot op-codes. This allows for writing profiling tools that
can answer questions like "who calls functions X" and "how many Objects of type X
were created."
</p>

<pre>
John Harrison -- Improvements to NCI/LLVM Stack Frame Builder for Parrot
Mentor: Peter Lobsinger
Blog: <a href="http://www.parrot.org/ash">http://www.parrot.org/ash</a>
Repo: <a href="http://github.com/ashgti/parrot">http://github.com/ashgti/parrot</a>
</pre>

<p>
This project is a prerequisite for a 
<a href="http://en.wikipedia.org/wiki/Just-in-time_compilation">JIT (Just In Time compilation)</a> framework, which
is an important goal for the Parrot community, since Parrot decided that our
old JIT subsystem was broken beyond repair and removed it. Parrot has
decided to use the very popular <a href="http://llvm.org">LLVM</a> project in our rewrite of our JIT,
and this project brings us a step closer on our journey.
</p>

<pre>
Pawel Murias -- Mildew and SMOP on CPAN
Mentor: Daniel Ruoso
Repo: <a href="http://github.com/perl6/mu">http://github.com/perl6/mu</a>
</pre>

<p>
This project involved working on Mildew and SMOP. Mildew is a <a href="http://perl6.org">Perl 6</a>
implementation, and SMOP is the library Mildew uses for meta-object
programming. You can think of Mildew as a sister to Rakudo Perl 6. Having many
implemenations of Perl 6 helps to better define the Perl 6 specification.
Updated versions of <a href="http://search.cpan.org/dist/SMOP/">SMOP</a> and
<a href="http://search.cpan.org/dist/Mildew/">Mildew</a> are now available on 
<a href="http://cpan.org">CPAN</a>.
</p>

<p>
The failing projects were:
</p>

<pre>
Justin Hunter -- Rework Catalyst framework instance initialization code
Mentor: Florian Ragwitz

Mirko Westermeier -- Bulletproofing the Mojolicious test suite
Mentor: Marcus Ramberg 
</pre>
<p>
Both of these projects passed their midterms, but due to circumstances
outside of the program, these students were not able to complete their
goals for their final evaluation. Sometimes Real Life throws you a curve
ball, like starting a new job, moving to a new city, having a baby
and similar things. We wish these students the best of luck, and hope
that they complete their projects outside the structure of GSoC.
</p>
<p>
I am very proud and humbled by all the students and mentors that I worked with
this year. I am constantly reminded that there are very intelligent developers
that are very young, and The Perl Foundation and Parrot Foundation is very
lucky to attract them and have them in our communities. I firmly believe that
the passing GSoC 2010 projects have made a large positive impact on our
codebases and many people will benefit from them for years to come.
</p>
<p>
Rock on and keep spreading the Open Source love!
</p>]]>
        
    </content>
</entry>
  <entry>
    <title>Rakudo Perl 6 in Your PostgreSQL Database!</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2010/06/rakudo-perl-6-in-your-postgresql-database.html"/>
    <id>tag:leto.net,2010:/dukeleto.pl//9.225</id>

    <published>2010-06-30T20:42:39Z</published>
    <updated>2010-07-01T01:27:34Z</updated>

    <summary> It has been a very exciting few weeks in the Perl 6 world with regard to database access. mberends++ just wrote a nice blog post about how Perl 6 support for DBI is ramping up with work on MiniDBI...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="postgres" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="rakudo" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="parrot" label="parrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="postgresql" label="postgresql" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="rakudo" label="rakudo" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[<p>
It has been a very exciting few weeks in the <a href="http://perl6.org/">Perl 6</a> world with regard to database access. 
<a href="http://blogs.perl.org/users/martin_berends/">mberends++</a> just wrote
a nice <a href="http://blogs.perl.org/users/martin_berends/2010/06/rakudo-perl-6-gets-into-databases.html">blog post</a> about how Perl 6 
support for DBI is ramping up with work on <a href="http://github.com/mberends/MiniDBI">MiniDBI</a> (formerly FakeDBI). Multiple developers recently made great progress
on <a href="http://postgresql.org">PostgreSQL</a> drivers and have been improving the <a href="http://parrot.org">Parrot</a> interface to 
<a href="http://www.postgresql.org/docs/8.4/static/libpq.html">libpq</a>, 
<a href="http://trac.parrot.org/parrot/browser/trunk/runtime/parrot/library/Pg.pir">Pg.pir</a> .
</p>

<p>
I have also been dutifully hacking on PL/Perl6, which embeds <a href="http://rakudo.org">Rakudo Perl 6</a> into
your PostgreSQL datbase via <a href="http://pl.parrot.org">PL/Parrot</a>, and just recently merged the plperl6
branch, which adds the first basic support for PL/Perl 6. Here is how it
currently works:
</p>

<ul>
<li>You must first install a recent version of Parrot and Rakudo Perl 6. I develop
with Parrot trunk and Rakudo master because I often need very recent changes/bugfixes</li>
<li>You will need a moderately recent version of PostgreSQL. PL/Parrot has been
known to work with versions as old as 8.3.8, but I mostly develop on the master branch,
so 9.x will probably work best</li>
<li>When you type "make install" for Rakudo Perl 6, you will see that it installs a file
called "perl6.pbc" into the lib/$version/languages/perl6 directory of the Parrot installation
that Rakudo was configured with. </li>
</ul>

<p>
To tell PL/Parrot that you would also like PL/Perl6, you
set the environment variable PERL6PBC to the full path of perl6.pbc like so:
</p>
<p>
<b>
export PERL6PBC=/Users/leto/git/rakudo/parrot_install/lib/2.5.0-devel/languages/perl6/perl6.pbc
</b>
</p>

<p>
A PBC file is <a href="http://docs.parrot.org/parrot/devel/html/docs/parrotbyte.pod.html">Parrot bytecode</a>,
and the perl6.pbc file basically bundles all of Rakudo Perl 6 into
a single file. You can play around with the Rakudo Perl 6 REPL by running:
</p>
<p>
<b>
$ parrot $PERL6PBC
</b>
</p>

<p>
which is pretty much the exact same thing as running the perl6 binary in your $PATH.
</p>

<p>
When you compile PL/Parrot with the $PERL6PBC environment variable set, it automatically creates
a separate Parrot interpreter with the perl6.pbc bytecode loaded, so that Perl 6 code can be executed.
</p>

<p>
To run PL/Parrot tests, you type "make test". You can also do this the
PostgreSQL way with "make installcheck", which will run the tests and verify
that the output matches a certain, known output. "make tests" just generates
the TAP output.
</p>

<p>
Currently PL/Perl 6 tests are not run by default, they have their own Makefile target:
<b>test_plperl6</b>
<a href="http://gist.github.com/459421">This</a> is what the output of "make test_plperl6" looks like currently, on
<a href="http://github.com/leto/plparrot/commit/44a985f123309783b43304bc4268cde93aba1ef3">commit 44a985f123</a> of the perl6_args
branch.
</p>

<p>
We run a total of 9 tests, 6 of which correctly run Perl 6 code and pass. You will notice that all the
failing tests are relating to passing arguments into Rakudo from PostgreSQL, which is what I am 
currently trying to get to work. Currently I am passing a 
<a href="http://docs.parrot.org/parrot/devel/html/src/pmc/resizablepmcarray.pmc.html">Parrot ResizablePMCArray</a> of the arguments
to a Rakudo function and executing it, but the function can't seem to see it. My guess is that 
Rakudo wants native datatypes and not Parrot datatypes. If you know how to create Rakudo datatypes
from <a href="http://en.wikipedia.org/wiki/Parrot_intermediate_representation">PIR</a>, please let me know :) I promise you will <a href="http://perlgeek.de/blog-en/perl-6/optimized-for-fun.html">-Ofun</a>.
</p>

<p>
What does PL/Perl 6 look like? Here is a nice example of a PL/Perl6 function which calculates the sum
of all <a href="http://en.wikipedia.org/wiki/Fibonacci_number">Fibonacci numbers</a> <= 100:
<p>
CREATE FUNCTION test_fibonacci_plperl6(integer) RETURNS int LANGUAGE plperl6 AS $$<br/>
[+] (1, 1, *+* ... 100)<br/>
$$;
</p>

You will notice three spiffy new Perl 6 operators in there, the summation
operator <b>[+]</b>, the new range operator <b>...</b> (which used to be <b>..</b> in Perl 5), and the <b>*+*</b> operator. What
exactly is the <b>*+*</b> operator? pmichaud++ jokingly referred to it as the
"cheerleading plus", but it is actually just a plain old infix "+" operator,
sandwiched by two "*" (a.k.a Whatever) operands. It basically takes the
previous two elements in a list, sums them together and returns the sum,
which is exactly how the Fibonacci sequence is defined.
</p>

<p>
If you are interested in hacking on PL/Perl 6, PL/Parrot or anything related, come
join us in #plparrot on freenode, join the
<a href="http://groups.google.com/group/plparrot/">mailing list</a> and fork us on 
<a href="http://github.com/leto/plparrot">github</a> !
</p>
]]>
        
    </content>
</entry>
  <entry>
    <title>C'Dent - An Acmeist Adventure</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2010/06/cdent-an-acmeist-adventure.html"/>
    <id>tag:leto.net,2010:/x//1.224</id>

    <published>2010-06-10T19:59:00Z</published>
    <updated>2010-06-10T20:37:13Z</updated>

    <summary>I saw Ingy talk at the Portland Perl Mongers last night, and he introduced his C'Dent "programming language". It is not actually a new language, since it defines no new syntax. It is actually the union of a subset of...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="acmeism" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="hackathon" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="acmeism" label="acmeism" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[I saw <a href="http://ingy.net/">Ingy</a> talk at the <a href="http://pdx.pm.org/kwiki/index.cgi?June2010Meeting">Portland Perl Mongers last night</a>, and he introduced his <a href="http://github.com/ingydotnet/cdent">C'Dent</a> "programming language". It is not actually a new language, since it defines no new syntax. It is actually the union of a subset of the input languages it supports (currently Python, Javascript, Perl 6 and YAML) plus a "data model" for how represent and convert between them.<br /><br />Given a module in the C'dent subset of a supported input language, it can export to one of the current output languages, which are the input languages, plus Perl 5, Python 3, Java, Ruby and PHP.<br /><br />There are obviously many issues that will be interesting to address, such as dealing with concurrency and differences in object models, but I think the philosophy of the project is awesome: <a href="http://acmeism.org/">Acmeism</a> :<br /><br /><i><strong>Acmeism</strong> is the belief that language naturally tends to 
divide people and ideas, but that technology can overcome this tendency.
 People who create technology that is not limited to a particular 
language are known as <strong>Acmeists</strong>.<br /></i><br />We have plans to add <a href="http://en.wikipedia.org/wiki/Parrot_intermediate_representation">Parrot Intermediate Representation (PIR)</a> as an output and maybe an input language at the <a href="http://calagator.org/events/1250458631">PDX Hackathon</a> tonight. Come on by! PDX Hackathon has always been an Acmeist gathering, and it has been said that "Beer is our Bytecode."<br />]]>
        
    </content>
</entry>
  <entry>
    <title>PL/Parrot Flies</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2010/04/plparrot-flies.html"/>
    <id>tag:leto.net,2010:/dukeleto.pl//9.218</id>

    <published>2010-04-20T01:32:40Z</published>
    <updated>2010-04-20T02:55:57Z</updated>

    <summary>PL/Parrot recently started passing all tests and marshalling three basic data types of integers, floats and strings, between PostgreSQL and Parrot Virtual Machine. One of the important next steps for PL/Parrot is to improve the security subsystem, which will require...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="postgres" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="rakudo" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="nqp" label="nqp" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="parrot" label="parrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="pgcon" label="pgcon" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="pir" label="pir" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="postgresql" label="postgresql" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="rakudo" label="rakudo" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[<a href="http://github.com/leto/plparrot">PL/Parrot</a> recently started passing all tests and marshalling three basic data types of integers, floats and strings, between<a href="http://www.postgresql.org/"> PostgreSQL</a> and <a href="http://parrot.org/">Parrot Virtual Machine</a>. <br /><br />One of the important next steps for PL/Parrot is to improve the security subsystem, which will require changes to Parrot core. Parrot has only a high-level <a href="http://docs.parrot.org/parrot/latest/html/docs/pdds/pdd18_security.pod.html">Parrot Developer Doc (PDD) that describes how security should work</a>, but still lacks an implementation. Thus, PL/Parrot finds itself in the situation of being able to drive the development of security features in Parrot. This is very exciting and I am researching various hardening solutions. Various ideas have been thrown around, but removing or replacing certain opcodes at the lowest level is the most secure solution. How to do this, properly at run-time, is the fun part.<br /><br />I will be talking about PL/Parrot at <a href="http://www.pgcon.org/2010/">PGCon 2010</a>, which will be very exciting. I am hoping to meet many people in the PostgreSQL community and show some PostgreSQL internals hackers why hacking on PL/Parrot is so fun and so important.<br /><br />PL/Parrot is so important because PL's are hard to write and maintain. My vision is that most of the hard work goes into PL/Parrot, and then languages built on top of Parrot (HLL's), will have a very simple time piggy-backing on top of that infrastructure. Currently, only PL/PIR exists. Stored procedures can be written in <a href="http://en.wikipedia.org/wiki/Parrot_intermediate_representation">PIR</a>. The next steps will be getting a HLL working on PL/Parrot, such as <a href="http://en.wikibooks.org/wiki/Parrot_Virtual_Machine/Not_Quite_Perl">NotQuitePerl (NQP)</a> or <a href="http://rakudo.org/">Rakudo Perl 6</a>. If you want to get your favorite HLL working on PL/Parrot, I surely won't stop you.<br /><br />There are also many benefits to writing stored procedures in PIR. PIR will have the closest possible speed to C than any HLL run on Parrot, so if speed is your main concern, you will want PL/PIR. Parrot has a garbage collector, so you don't have to do memory management in PL/PIR. This prevents crashing the server instance due to double-free errors and fun stuff like that. PIR is also platform-independent: no more need to figure out how to get your stored procedures written in C compiling on a new platform. <br /><br />If you have tuits or ideas for implementing PL/NQP or PL/Rakudo or any other comments about PL/Parrot, I would love to hear them. Feel free to<a href="http://github.com/leto/plparrot"> fork the github repo</a>, join us in #plparrot on irc.freenode.net or <a href="http://groups.google.com/group/plparrot">on our mailing list</a>. We also need a website and mascot. There are many ways to help, but patches are always welcome :)<br /> ]]>
        
    </content>
</entry>
  <entry>
    <title>Google Summer of Code 2010</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2010/03/google-summer-of-code-2010.html"/>
    <id>tag:leto.net,2010:/dukeleto.pl//9.207</id>

    <published>2010-03-09T06:47:41Z</published>
    <updated>2010-03-09T07:24:05Z</updated>

    <summary><![CDATA[I&nbsp;am working on the application for The Perl Foundation and ParrotFoundation to participate in Google Summer of Code 2010. GSoC is aprogram where Google funds eligible students to hack on open sourceprojects for a summer. It is a great opportunity...]]></summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="gsoc" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="gsoc" label="gsoc" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="gsoc2010" label="gsoc2010" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="parrot" label="parrot" 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://leto.net/dukeleto.pl/">
        <![CDATA[<meta charset="utf-8"><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: arial,sans-serif; font-size: 15px; border-collapse: collapse;">I&nbsp;am working on the application for <a href="http://perlfoundation.org/">The Perl Foundation</a> and <a href="http://parrot.org/">Parrot<br />Foundation</a> to participate in <a href="http://socghop.appspot.com/">Google Summer of Code 2010</a>. GSoC is a<br />program where Google funds eligible students to hack on open source<br />projects for a summer. It is a great opportunity for the students and<br />the communities that mentor them. You also may be interested in this<br />summary of our involvement<a href="http://google-opensource.blogspot.com/2009/10/perls-of-wisdom-perl-foundation-parrots.html"> last year</a> . Our application will be<br />submitted by the end of this week.<br /><br />Please join us in getting prepared for this year. There is a page for<br /><a href="http://www.perlfoundation.org/perl5/index.cgi?gsoc_mentors">possible mentors to volunteer</a> as well as a page for&nbsp;</span><div><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: arial,sans-serif; font-size: 15px; border-collapse: collapse;"><a href="http://www.perlfoundation.org/perl5/index.cgi?gsoc_2010_projects">project ideas</a> . If you would like to help with the wiki, our&nbsp;</span></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: arial,sans-serif; font-size: 15px; border-collapse: collapse;"><a href="http://www.perlfoundation.org/perl5/index.cgi?gsoc">main GSoC page</a> is the best place to start. You are also invited to join&nbsp;</span></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: arial,sans-serif; font-size: 15px; border-collapse: collapse;"><a href="http://groups.google.com/group/tpf-gsoc">our mailing&nbsp;list</a>&nbsp; and come ask questions in #soc-help on&nbsp;<a href="http://irc.perl.org/" target="_blank" style="color: rgb(0, 84, 136);">irc.perl.org</a>&nbsp;.</span><br /><br /> </div>]]>
        
    </content>
</entry>
  <entry>
    <title>Parrot In Your Database</title>
    <link rel="alternate" type="text/html" href="http://leto.net/dukeleto.pl/2009/11/parrot-in-your-database.html"/>
    <id>tag:leto.net,2009:/dukeleto.pl//9.204</id>

    <published>2009-11-14T07:38:52Z</published>
    <updated>2009-11-14T22:44:10Z</updated>

    <summary>Wouldn't it be awesome to write performance-critical stored procedures in a fast platform-independent language? That is the vision for PL/Parrot, a Postgres Language that will allow you to write stored procedures in PIR or NQP. Our current plan is to...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="parrot" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="postgres" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="parrot" label="parrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="plparrot" label="plparrot" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="postgres" label="postgres" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/dukeleto.pl/">
        <![CDATA[Wouldn't it be awesome to write performance-critical stored procedures in a fast platform-independent language? That is the vision for PL/Parrot, a <a href="http://www.postgresql.org/">Postgres</a> Language that will allow you to write stored procedures in <a href="http://en.wikipedia.org/wiki/Parrot_Intermediate_Representation">PIR</a> or <a href="http://en.wikibooks.org/wiki/Parrot_Virtual_Machine/Not_Quite_Perl">NQP</a>. Our current plan is to embed the <a href="http://parrot.org/">Parrot VM</a> inside each postgres backend. If you have a better idea, let us know!<br /><br />Come hang out on #plparrot on irc.freenode.net or checkout the <a href="http://github.com/leto/plparrot">github repo</a> if you want to help! You may also want to visit #parrot on irc.perl.org for Parrot-specific help. It is very much in a prototype stage right now, but we have lots of smart people interested in making this work, so I am confident that we will have something working very soon.<br /><br />If you are a Postgres internals hacker or you want to learn more about Parrot Virtual Machine, we would greatly appreciate your help! <br /><br /> ]]>
        
    </content>
</entry>
  <entry>
    <title>Sedtris - Tetris Written In Sed</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2009/06/sedtris-tetris-written-in-sed.html"/>
    <id>tag:leto.net,2009:/x//1.194</id>

    <published>2009-06-19T07:38:52Z</published>
    <updated>2009-06-19T07:45:46Z</updated>

    <summary>Need I say more? Sedtris....</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="osbridge" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="osb09" label="osb09" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="osbridge" label="osbridge" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[<br />Need I say more? <a href="http://uuner.doslash.org/forfun/sedtris.sed">Sedtris.</a><br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://uuner.doslash.org/forfun/sedtris.sed" onclick="window.open('http://leto.net/x/2009/pics/sedtris.html','popup','width=600,height=800,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://leto.net/x/2009/pics/sedtris-thumb-300x400.jpg" alt="sedtris.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="300" height="400" /></a></span><br />]]>
        
    </content>
</entry>
  <entry>
    <title>Math::GSL 0.18 on CPAN</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2009/03/mathgsl-018-on-cpan.html"/>
    <id>tag:leto.net,2009:/code/Math-GSL//2.182</id>

    <published>2009-03-27T07:11:10Z</published>
    <updated>2009-03-27T16:12:18Z</updated>

    <summary>Grab the latest Math::GSL to get these spiffy features and bugfixes:Made Math::GSL play nice with latest and greatest GSL 1.12Added swap() to Vector objects with tests and docsAdded p-norms to Vector objects via norm() and normalize()Added operator overloading so thatabs...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="release" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[Grab the latest Math::GSL to get these spiffy features and bugfixes:<br /><br /><ul><li>Made <a href="http://search.cpan.org/dist/Math-GSL/">Math::GSL</a> play nice with latest and greatest GSL <a href="http://www.gnu.org/software/gsl/NEWS">1.12</a></li><li>Added swap() to <a href="http://search.cpan.org/dist/Math-GSL/pod/Vector.pod">Vector</a> objects with tests and docs</li><li>Added p-<a href="http://en.wikipedia.org/wiki/Norm_%28mathematics%29">norms</a> to Vector objects via norm() and normalize()</li><li>Added operator overloading so that</li></ul><blockquote><blockquote><blockquote>abs $vector == $vector-&gt;norm <br /></blockquote></blockquote></blockquote><ul><li>Added as_vector() to <a href="http://search.cpan.org/dist/Math-GSL/pod/Matrix.pod">Matrix</a> and <a href="http://search.cpan.org/dist/Math-GSL/pod/MatrixComplex.pod">MatrixComplex </a>objects</li><li>Added inverse(), is_square(), det(),&nbsp; lndet(), zero() and identity() to Matrix objects</li><li>Added inverse(), is_square(), det(),&nbsp; lndet(), zero(), identity() and hermitian() to MatrixComplex objects</li><li>Added dot product to Matrix objects</li><li>Fixed various typos in documentation</li><li>Fixed warnings about overloaded operators in Matrix and <a href="http://search.cpan.org/dist/Math-GSL/pod/BLAS.pod">BLAS</a></li><li>Overloaded '==' and '!=' for MatrixComplex and Matrix objects</li><li>Fixed amd64 -fPIC compile failure</li><li>Added tests to Monte and refactored Sort tests</li><li>Refactored and improve error checking in callback interface</li><li>Fixed 'NaN' test failures (thanks CPANtesters!)<br /></li></ul>Enjoy!<br /> ]]>
        
    </content>
</entry>
  <entry>
    <title>Math::GSL 0.17_01 on CPAN</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2009/02/mathgsl-017-01-on-cpan.html"/>
    <id>tag:leto.net,2009:/code/Math-GSL//2.177</id>

    <published>2009-02-22T22:15:45Z</published>
    <updated>2009-02-22T22:29:41Z</updated>

    <summary>Math::GSL is still in active development and we have been working hard to make sure that it is compatible with the most recent GSL, which is 1.12 released on Dec 16 2008. This release is mostly for CPANTesters to see...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="release" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[Math::GSL is still in active development and we have been working hard to make sure that it is compatible with the most recent <a href="http://www.gnu.org/software/gsl/">GSL</a>, which is <a href="http://www.gnu.org/software/gsl/NEWS">1.12 </a>released on Dec 16 2008. This release is mostly for CPANTesters to see what bugs they can shake out of it, but it contains these tasty features:<br /><br /><ul><li>Make Math::GSL play nice with GSL 1.12<br /></li><li>Added swap() to Vector objects with tests and docs</li><li>Added p-norms to Vector objects via norm() and normalize()</li><li>Added operator overloading so that : abs $vector == $vector-&gt;norm</li><li>Added as_vector() to Matrix and MatrixComplex objects</li><li>Added inverse(), is_square(), det(),&nbsp; lndet(), zero() and identity() to Matrix objects</li><li>Added inverse(), is_square(), det(),&nbsp; lndet(), zero(), identity() and hermitian() to MatrixComplex objects</li><li>Added dot product to Matrix objects</li><li>Fixed various typos in documentation</li><li>Fixed warnings about overloaded operators in Matrix and BLAS</li></ul>Enjoy!<br /> ]]>
        
    </content>
</entry>
  <entry>
    <title>Find Files Who Have No Lines Matching a Regex</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2009/02/find-files-who-have-no-lines-matching-a-re.html"/>
    <id>tag:leto.net,2009:/x//1.175</id>

    <published>2009-02-17T08:39:28Z</published>
    <updated>2009-02-17T09:03:24Z</updated>

    <summary>I found myself in the situation of having a bunch of files and I needed to find out which one's did not include a certain header file. This turned out to be a great place for short-circuiting with grep. for...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="bash" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="timesaver" label="#timesaver" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[I found myself in the situation of having a bunch of files and I needed to find out which one's did not include a certain header file. This turned out to be a great place for short-circuiting with grep. <br /><br /><b>for i in files/*; do grep PATTERN $i &gt;&gt;/dev/null || echo $i; done</b><br /><br />Grep returns false when it cannot find a match, which triggers the echo of the filename to STDOUT. The PATTERN can be any valid regular expression for your system's flavor of grep. This can save tons of time if you have dozens/hundreds of files and only a few are missing something. To edit these files in vim, it is nothing more than:<br /><br /><b>vim `for i in files/*; do grep PATTERN $i &gt;&gt;/dev/null || echo $i; done</b>`<br /><br />Happy Hacking!<br /> ]]>
        
    </content>
</entry>
  <entry>
    <title>Primes, Primality and Pseudoprimes</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2009/01/primes-primality-and-psuedopri.html"/>
    <id>tag:leto.net,2009:/x//1.171</id>

    <published>2009-01-11T18:44:04Z</published>
    <updated>2009-01-11T23:33:02Z</updated>

    <summary>Primes are simple, right? A prime is a number that is divisible by only 1 and itself. The devil is in the details, though. What if your number is really big and someone else does not believe you that it...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="math" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="primes" label="primes" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[<a href="http://mathworld.wolfram.com/PrimeNumber.html">Primes </a>are simple, right? A <b>prime</b> is a number that is divisible by only 1 and itself. The devil is in the details, though. <br /><br />What if your number is really big and someone else does not believe you that it is prime? How do you <b>prove</b> it? It turns out to be really easy to prove something is <b>composite</b> ( the opposite of prime, a.k.a not prime ), all you have to do is show them a single factor of the number. <br /><br />If a shadowy figure emerges from a dark alley and shows you a strip of paper:<br /><br />$latex x =742376437546875526384762834762837468273648992$<br /><br />and says "I'll sell you this big fat prime for <b>only</b> five bucks" you can say "it is divisible by 2 and therefore composite. <a href="http://en.wikipedia.org/wiki/Q.E.D.">QED</a> and go away." <br /><br />But if you are trying to be an upstanding prime-number-selling business and therefore want to go the extra mile and prove that the numbers you sell are indeed prime, you will quickly go out of business. I guess that is why there are still sheisty guys selling primes in trench coats...<br /><br />The reason is that to prove that $latex x=N$ is a prime number, you are actually making a statement about $latex x=N$ as well as saying that all numbers $latex y$ such that $latex y &lt; N$ are <b>not</b> factors of $latex x$. This is a lot of information! <br /><br />Currently it takes at most a few seconds to prove that large numbers are composite, but to prove that a similarly-sized number is prime could take thousands of CPU-hours!!!&nbsp; For those that like specific numbers, it took 6 CPU-years to prove that&nbsp; the 20,562-digit <a href="http://en.wikipedia.org/wiki/Mills%27_prime" title="Mills' prime" class="mw-redirect">Mills' prime</a> was indeed prime.<br /><br />Even for numbers in the range of current cryptography systems (a few hundred digits), proving something is a prime is just too damn slow. Factoring integers is often a subalgorithm of many <a href="http://en.wikipedia.org/wiki/Number_theory">number theory</a> and cryptography algorithms, it has to be as fast as possible. When a software algorithm<a href="http://en.wikipedia.org/wiki/Integer_factorization"> factors a number,</a> it often does some kind of check that all of the numbers it is returning are indeed prime, but it cannot afford to <b>prove</b> it. This is where pseudoprimes and primality testing come in, stage left.<br /><br /><b>Primality testing</b> is mainly concerned with finding algorithms that are fast but have low probability to incorrectly declare that a composite number is prime. A <b>pseudoprime</b> is such a number that "fakes out" a primality test, also known as a false positive. Obviously, people developing cryptography software should be very concerned with how often they are going to produce pseudoprimes, more on this later.<br /><br />Modern primality testing started with <a href="http://en.wikipedia.org/wiki/Pierre_de_Fermat">Pierre de Fermat</a>, but Chinese mathematicians described the beginnings of these algorithms 2000 years before Fermat was on the scene. Numbers which "fake out" the <a href="http://en.wikipedia.org/wiki/Fermat_primality_test">Fermat Primality Test</a> are called <a href="http://en.wikipedia.org/wiki/Carmichael_number">Carmichael numbers</a>,&nbsp; and in 1994 a group of mathematicians proved that there are infinitely many of them, i.e. there is not only a few isolated numbers that "fake out" the test, the more your search for them, the more you find.<br /><br />Some software packages may still use the Fermat Primality test for some algorithms, but it has been mostly superceded by the <a href="http://en.wikipedia.org/wiki/Miller-Rabin_primality_test">Rabin-Miller primality test.</a> <br /><br />This test allows you to run $latex k$ repetitions of the algorithm and on average, the probability of it incorrectly concluding that a composite number is prime is $latex P = 4^{-k}$. For $latex k=20$ this is roughly a chance of one in a trillion (1000000000000, a 1 with 12 zeros) that it will be wrong. This ain't bad.<br /><br />But, as it turns out, there is a better way.<br /><br />The better way is called&nbsp; <a href="http://www.trnicely.net/misc/bpsw.html">The Baillie-PSW primality test</a> (BPSW) which is actually just four independent steps which can be parrallelized quite easily. The BPSW first checks that the number is not 1, 2 or an even number, then checks to see if it has any small prime divisors, where small is defined as $latex p &lt; 1000 $. It then performs a single Rabin-Miller primality test in base 2 and then a <a href="http://mathworld.wolfram.com/LucasPseudoprime.html">Lucas Primality test</a>, which is another primality test that I have not described that uses<a href="http://mathworld.wolfram.com/LucasNumber.html"> Lucas Numbers</a> (very closely related to <a href="http://mathworld.wolfram.com/FibonacciNumber.html">Fibonacci numbers</a>) as the basis for a test.<br /><br />According to MathWorld "the multiple Rabin-Miller test in bases 2
 and 3 combined with a Lucas pseudoprime test as the <a href="http://mathworld.wolfram.com/PrimalityTest.html" class="Hyperlink">primality test</a> have been used by the function <tt><a href="http://reference.wolfram.com/mathematica/ref/PrimeQ.html" class="Hyperlink">PrimeQ</a></tt>[<i>n</i>]" since Mathematica 2.2 . <br /><br />So why is the BPSW test so cool? For starters, people have looked hard and still cannot find one BPSW pseudoprime. According to recent findings, there are no BPSW pseudoprimes less than $latex N=10^{15} $. As for software that uses the Miller-Rabin test (for instance the <a href="http://gmplib.org/manual/Number-Theoretic-Functions.html#Number-Theoretic-Functions">mpz_probab_prime_p</a> function in <a href="http://gmplib.org/">GMP</a> ), <a href="http://www.trnicely.net/">Thomas R. Nicely</a> (of <a href="http://www.trnicely.net/pentbug/bugmail1.html">pentium fdiv bug fame</a>) has done extensive research and <a href="http://www.trnicely.net/misc/mpzspsp.html">discovered many pseudoprimes in GMP</a> as well as providing his data openly before publication, which is really cool! An example of <a href="http://pari.math.u-bordeaux.fr/dochtml/html.stable/Arithmetic_functions.html#isprime">GPL software that uses BPSW</a> is the <b>isprime() </b>function of GP/PARI, a number theory library originally written by<a href="http://www.math.u-bordeaux.fr/%7Ecohen/"> Henri Cohen</a> and other members of the <a href="http://www.math.u-bordeaux.fr/">University of Bordeaux Mathematics Department</a>.<br /><br />The problem with using software that use Miller-Rabin tests is such:&nbsp; the bases and number of repetitions used internally may change from one version of the software to the next, which means that different versions of your software may think the same number is either prime or composite. This is obviously Very Bad. If you always specify the bases and number of repetitions to use in the Miller-Rabin test then this will not occur, but that is not the case for most existing software.<br /><br />So it would almost seem that BPSW is the perfect primality test, it is pretty fast and perhaps there is no number can fake out all four steps of the test. All is not peaches and cream, though. <a href="http://math.dartmouth.edu/%7Ecarlp/">Carl Pomerance</a>, the P in BPSW and one of the mathematicians that proved there are infinitely many Carmichael numbers, <a href="http://leto.net/mt-static/html/www.pseudoprime.com/dopo.pdf">published a small article</a> in 1984 giving an informal proof that BPSW pseudoprimes <b>must exist</b>, even though no one has ever found one. He could not construct one then and no has been able to in last 25 years either, but that is why mathematicians prove stuff. To be sure. One day someone will find a BPSW pseudoprime, how long will it take?<br /><br />So what is the moral of the story? <b>Modern cryptography algorithms should be using some variant of the BPSW Primality Test for fast primality testing, always keeping a lookout for a pseudoprime and perhaps another step to add to the test to make it even better. <br /><br /><br /><br /></b><br />]]>
        
    </content>
</entry>
  <entry>
    <title>Matrix Eigenvalues in Perl Don't Get Much Easier</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/12/matrix-eigenvalues-in-perl-don.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.169</id>

    <published>2008-12-25T19:53:25Z</published>
    <updated>2008-12-25T20:16:09Z</updated>

    <summary>The Matrix subsystem has really grown up in the last few days since the 0.16 release, including easy-to-use methods to calculate Matrix eigenvalues. All kinds of other methods are now available, like my $det1 = $A-&gt;det; # determinant my $det2...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="linearalgebra" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="linearalgebra" label="linear algebra" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="math" label="math" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[The Matrix subsystem has really grown up in the last few days since the 0.16 release, including easy-to-use methods to calculate <a href="http://leto.net/gitweb/?p=Math-GSL.git;a=commitdiff;h=c10bd60fb06cc43fbb9e8d2f731381d8d7071991">Matrix eigenvalues</a>. All kinds of other methods are now available, like 
<pre>
my $det1 = $A->det;      # determinant
my $det2 = abs $A;       # determinant

my $inv = $A->inverse;  
my @eigs = $A->eigenvalues;

my ($eigenvalues, $eigenvectors) = $matrix->eigenpair;
my ($eig1,$eig2) = @$eigenvalues;
my ($u,$v)       = @$eigenvectors;
</pre>
Compare this <a href="http://leto.net/gitweb/?p=Math-GSL.git;a=blob;f=examples/matrix/nonsymmetric_eigen;h=83e1e26150f0dfa61798125b51f7afca51f6202a;hb=HEAD">new script</a> for calculating eigenvalues and eigenvectors of a nonsymmetric matrix to <a href="http://leto.net/gitweb/?p=Math-GSL.git;a=blob;f=examples/matrix/nonsymmetric_eigen_old;h=490c69663f944421532eaca8431cc34c55e78630;hb=HEAD">the old version</a>. Yes, quite an improvement and quite pleasing to the eye now.

Note that <b>$A->eigenvalues;</b> returns a list of <b><a href="http://search.cpan.org/~jhi/Math-Complex/lib/Math/Complex.pm">Math::Complex</a></b> objects because in general the eigenvalues of a real matrix can be complex. Only if your matrix is <a href="http://mathworld.wolfram.com/SymmetricMatrix.html">symmetric</a> are you guaranteed real eigenvalues.]]>
        
    </content>
</entry>
  <entry>
    <title>Math::GSL 0.16 - More features and more rigorous tests</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/12/mathgsl-016-more-features-and.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.164</id>

    <published>2008-12-15T00:26:06Z</published>
    <updated>2008-12-15T00:54:16Z</updated>

    <summary>I just pushed Math::GSL 0.16 to CPAN, it should be showing up here Real Soon Now, depending on how much traffic the dump trucks hit on the intertubes. Fixed RT#40947: configure_requires ExtUtils::PkgConfig bugOperator overloading for addition, multiplication and subtraction on Matrix...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="release" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[<div><div>I just pushed Math::GSL 0.16 to CPAN, it should be showing up <a href="http://search.cpan.org/~leto/Math-GSL/">here</a> Real Soon Now, depending on how much <a href="http://bp2.blogger.com/_C7Ojr4OIXWQ/R81GArKts2I/AAAAAAAAAIs/mxeUfWaaKDY/s1600-h/i-m-in-ur-internet-cloging-ur-tubes.jpg">traffic</a> the <a href="http://img.photobucket.com/albums/v323/trueneutral/InternetsTubes.jpg">dump trucks</a> hit on the <a href="http://themachineisus.files.wordpress.com/2008/07/the-internet-a-series-of-tubes.jpg">intertubes</a>. </div><div><br /></div><ul><li>Fixed <a href="http://rt.cpan.org/Public/Bug/Display.html?id=40947">RT#40947</a>: configure_requires ExtUtils::PkgConfig bug</li><li>Operator overloading for addition, multiplication and subtraction on Matrix objects (Thierry)</li><li>Fix an include bug in Histogram2D which caused the build to fail (Thierry)</li><li>Added reverse() and swap() methods to VectorComplex objects with tests and docs</li><li>as_list() and get() now work on VectorComplex objects</li><ul><li>as_list() returns a list of Math::Complex objects</li><li>get() returns a list of Math::GSL::Complex objects</li></ul><li>Math::GSL::Test::ok_status() now takes an optional message argument</li><li>Added <a href="http://leto.net/gitweb/?p=Math-GSL.git;a=blob;f=KNOWN_BUGS;h=4ba19b06357411cba0d7585a338964c47098e1d6;hb=9105f6a5e45e5708f3534f5f4ce6a0544462f0f5">KNOWN_BUGS</a></li><li>Added Math::GSL::Test::is_status_ok()</li><li>New subsytems: <a href="http://leto.net/gitweb/?p=Math-GSL.git;a=blob;f=pod/VectorComplex.pod;h=fc43d5b2b404f3089612b3b98c32fb9251361ecc;hb=9105f6a5e45e5708f3534f5f4ce6a0544462f0f5">VectorComplex</a> and <a href="http://leto.net/gitweb/?p=Math-GSL.git;a=blob;f=pod/MatrixComplex.pod;h=ec9662df10921e8d344f638e05b77b43a41fe550;hb=9105f6a5e45e5708f3534f5f4ce6a0544462f0f5">MatrixComplex</a></li><li>Operator overloading for addition and subtraction with vectors</li><li>Added example: <a href="http://leto.net/gitweb/?p=Math-GSL.git;a=blob;f=examples/matrix/nonsymmetric_eigen;h=490c69663f944421532eaca8431cc34c55e78630;hb=9105f6a5e45e5708f3534f5f4ce6a0544462f0f5">examples/matrix/nonsymmetric_eigen</a></li><ul><li>Shows how to find the eigenvalues of a nonsymmetric matrix</li></ul><li>Added copy() method to vectors</li><li>Improved Vector docs</li><li>Sped up vector dot products by 15x using BLAS function gsl_blas_ddot</li><ul><li>NOTE: using gsl_blas_ddot($x->raw,$y->raw) directly is still about 10 times faster than $x * $y due to error checking and function call overhead</li></ul><li>Separated POD and Perl code out of SWIG interface files, yay for proper syntax highlighting</li><li>Added stub test files for Heapsort, IEEEUtils, Multimin, Siman, Wavelet2D</li><li>All test files now keep track of how many tests should run</li></ul></div><div><br /></div> ]]>
        
    </content>
</entry>
  <entry>
    <title>Back on track</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/12/back-on-track.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.162</id>

    <published>2008-12-08T00:06:55Z</published>
    <updated>2008-12-08T00:21:59Z</updated>

    <summary>I haven't been able to add code to Math::GSL since about a month because of a tricky bug I had with the build process. Not only was it tricky, it was well hidden and pretty stupid to fix once I...</summary>
    <author>
        <name>Thierry Moisan</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[I haven't been able to add code to Math::GSL since about a month because of a tricky bug I had with the build process. Not only was it tricky, it was well hidden and <a href="http://leto.net/gitweb/?p=Math-GSL.git;a=commitdiff;h=1fdc43e5725e337e2dd0c2e7e0d2069335b62e29">pretty stupid to fix once I saw it</a>.<br /><br />Now that it's fixed I've been able to commit some code concerning <a href="http://leto.net/gitweb/?p=Math-GSL.git;a=commitdiff;h=2960b90d4686cb4c48d4a1001390c6d38900110b">overloading operators + and - in Math::GSL::Matrix</a>. It's been tested and documented but it could still enjoy more documentation. End term exams are coming pretty fast to me so I won't finish overloading multiplication of matrices before one or two weeks. <br /><br />Ho and Math::GSL 0.16 should be out soon, stay tuned!<br /> ]]>
        
    </content>
</entry>
  <entry>
    <title>CyborgCamp: Notes from Evolution of the Language of Technology</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2008/12/evolution-of-the-language-of-t.html"/>
    <id>tag:leto.net,2008:/x//1.158</id>

    <published>2008-12-06T18:49:02Z</published>
    <updated>2008-12-07T07:58:15Z</updated>

    <summary>Bill DeRouchey (@billder) was the opening presentation at CyborgCamp and was wonderfully entertaining and informative. Here are some quick notes I took:How did the "Play/Pause" button become univerally understood?Typewriters choose the winning "letter symbols"Symbols evolve.Are we losing some types/modes of literacy?...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="conference" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="language" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="cyborgcamp" label="cyborgcamp" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[<div><div><a href="http://www.pushclicktouch.com/" style="text-decoration: underline; ">Bill DeRouchey</a> (<a href="http://twitter.com/billder">@billder</a>) was the opening presentation at <a href="http://www.cyborgcamp.com">CyborgCamp</a> and was wonderfully entertaining and informative. Here are some quick notes I took:</div><div><br /></div><ul><li>How did the "Play/Pause" button become univerally understood?</li><li>Typewriters choose the winning "letter symbols"</li><li>Symbols evolve.</li><li>Are we losing some types/modes of literacy? Is that such a bad thing?</li><li>@ - commerce symbol "each at", then location, then identity</li><li># - means a group on twitter "context, topic"</li><li>Mouse pointer ~1984</li><li>Future directions in the evolution of tech languages?</li><li>Splintered groups of tech languages</li><li>Emotional bandwidth</li><li>Gatekeepers of knowledge, screening out less knowledgeable people</li></ul></div><div><div><br /></div><div><br /></div><div><br /></div><div><br /></div></div>]]>
        
    </content>
</entry>
  <entry>
    <title>Math::GSL 0.15_05</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/12/mathgsl-015-05.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.157</id>

    <published>2008-12-05T09:15:51Z</published>
    <updated>2008-12-05T09:26:12Z</updated>

    <summary>I just pushed Math::GSL 0.15_05 to CPAN, which includes these fixes since 0.15_04 :  Fixed RT#40947: configure_requires ExtUtils::PkgConfig bug  Added reverse() method to VectorComplex objects with tests and docs as_list() and get() now work on VectorComplex objects as_list() returns a list of...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="release" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[I just pushed Math::GSL 0.15_05 to <a href="http://search.cpan.org/~leto/Math-GSL/">CPAN</a>, which includes these fixes since 0.15_04 : 
 <div><br /></div><div><ul><li>Fixed<a href="http://rt.cpan.org/Ticket/Display.html?id=40947"> RT#40947</a>: configure_requires ExtUtils::PkgConfig bug     </li><li><a href="http://leto.net/gitweb/?p=Math-GSL.git;a=commitdiff;h=b10e5f96de88645a377eab70ea75e52d7e31b5ba">Added reverse()</a> method to VectorComplex objects with tests and docs </li><li>as_list() and get() now work on VectorComplex objects </li><ul><li>as_list() returns a list of Math::Complex objects </li><li>get() returns a list of Math::GSL::Complex objects</li></ul></ul><div><ul><li><a href="http://leto.net/gitweb/?p=Math-GSL.git;a=commitdiff;h=e266776f43e33c60cc06a5e750f800d9d0a8c7f8">Added Math::GSL::Test::is_status_ok()</a></li><li>Math::GSL::Test::ok_status() now takes an optional message argument </li></ul><div><br /></div><div>Enjoy!</div></div></div>]]>
        
    </content>
</entry>
  <entry>
    <title>5 Minute Math Lesson: What is a metric tensor and what is it good for?</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2008/12/5-min-math-metric-tensor.html"/>
    <id>tag:leto.net,2008:/x//1.132</id>

    <published>2008-12-03T05:39:31Z</published>
    <updated>2008-12-03T06:45:40Z</updated>

    <summary>A metric tensor $latex g_{mn} $ is used to measure distances based on a given coordinate system. In terms of the Jacobian, the metric tensor can be found from $latex g_{mn} = (J^T J)_{mn} $ where $latex J^T $ is...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="math" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[A <a href="http://mathworld.wolfram.com/MetricTensor.html">metric tensor</a> $latex g_{mn} $  is used to measure distances based on a given coordinate system. In terms of the <a href="http://leto.net/x/2008/11/5-minute-math-lesson-what-is-a.html">Jacobian</a>, the <a href="http://en.wikipedia.org/wiki/Metric_tensor">metric tensor</a> can be found from $latex g_{mn} = (J^T J)_{mn} $  where $latex J^T $  is the transpose of the <a href="http://en.wikipedia.org/wiki/Carl_Gustav_Jakob_Jacobi">Jacobian</a>. Since $latex J^T J$ is a symmetric matrix for any matrix $latex J$, the metric tensor is always symmetric. (In fancy-pants math lingo this is called a <a href="http://mathworld.wolfram.com/SymmetricBilinearForm.html">symmetric bilinear form</a>.) What is the real-life consequences of this? The distance from $latex a$ to $latex b$ is always the same as the distance from $latex b$ to $latex a$, no matter what kind of <a href="http://mathworld.wolfram.com/BipolarCoordinates.html">crazy coordinate system</a> you are living in! 
<br>
If we want to calculate the length of a parameterized curve  $latex x^r = x^r(u) $  where $latex u $  is a parameter with respect to some coordinate system, then we can write an infintesmal displacement element as $latex dx^r = p^r(u) du $ . The length of this displacement is
$latex ds = \sqrt{g_{mn} p^m p^n} du  $ and the length of the curve from $latex u=u_1 $  to $latex u=u_2 $  is $latex L =  \int_{u_1}^{u_2} ds = \int_{u_1}^{u_2} \sqrt{g_{mn} p^m p^n} du $  .
<br>
So we need the metric tensor to define distance along a curve when we are in non-cartesian coordinate systems, such as <a href="http://mathworld.wolfram.com/SphericalCoordinates.html">spherical</a> or <a href="http://mathworld.wolfram.com/ToroidalCoordinates.html">toroidal</a>. From the metric tensor one can then start to study the "curvature" of a coordinate system. More soon!]]>
        
    </content>
</entry>
  <entry>
    <title>5 Minute Math Lesson: What is a Jacobian and what is it good for?</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2008/11/5-minute-math-lesson-what-is-a.html"/>
    <id>tag:leto.net,2008:/x//1.130</id>

    <published>2008-12-01T03:02:56Z</published>
    <updated>2008-12-01T03:36:59Z</updated>

    <summary>In Tensor Calculus, a Jacobian is a matrix defined as$latex J_{mn} = \frac{dy^m}{dx^n} $ where the $latex y^i $ 's are a new coordinate system defined in terms of the original coordinate system, the $latex x^i $ 's. (Note that...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="math" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[In <a href="http://mathworld.wolfram.com/Tensor.html">Tensor</a> Calculus, a <a href="http://mathworld.wolfram.com/Jacobian.html">Jacobian</a> is a matrix defined as$latex J_{mn} = \frac{dy^m}{dx^n}  $ where the $latex y^i $ 's are a new coordinate system defined   in terms of the original coordinate system, the $latex x^i $ 's. (Note that we are using subscripts, $latex x^2 $  denotes the second element of the      $latex \mathbf{x} $  vector.) The determinant of this matrix $latex J=det([J_{mn}]) $  is important because this represents the constant of               proportionality between volumes in the old coordinates and in the new coordinates. As a simple example polar coordinates is the transformation  $latex  (x,y)= (r \cos {\theta} , r \sin {\theta} ) $ . When we want to perform an integration in cartesian coordinates by transforming into polar   coordinates, we write $latex \int f(x,y) dx dy = \int f(r,\theta) r dr d\theta  $ , the factor of $latex r $  is precisely the Jacobian. So in general, to convert an integral in the $latex x^i $  coordinate system to the $latex y^i $  coordinate system we have$latex  \int f(\mathbf{x}) d\mathbf{x} = \int    f(\mathbf{y}) J(\mathbf{y}) d\mathbf{y}  $  where $latex \mathbf{x}=(x^1,x^2,\cdots,x^n)  $ and $latex \mathbf{y}=(y^1,y^2,\cdots,y^n) $  .
<p>In differential equation theory, the Jacobian matrix plays a key role in defining the stability of solutions.  As a simple example, consider the matrix   ordinary differential equation $latex \dot{\mathbf{x}} = A \mathbf{x}  $  where $latex A = \left(\begin{array}{cc}a&b\\c&d\end{array} \right) $ . Because this is a linear system, the solution will always be a linear combination of exponentials $latex \mathbf{x} = \mathbf{v_1} e^{\lambda_1 t} + \mathbf{v_2} e^{\lambda_2 t } $   where $latex \mathbf{v_{1,2}} $  are the <a href="http://en.wikipedia.org/wiki/Eigenvalue">eigenvectors</a> and $latex \lambda_{1,2} $  are the <a href="http://en.wikipedia.org/wiki/Eigenvalue">eigenvalues</a>, and $latex t $  is time,      which is positive. Since$latex  t > 0 $ , we must have $latex  Re(\lambda_{1,2}) < 0 $  for the solution to decay to a steady state. If this is violated  for any$latex  \lambda_i $  then that exponential "blows up" as $latex t \rightarrow \infty $ , since it is an exponential with an ever-increasing        postive argument. Note that if the eigenvalues are complex then the imaginary part of the eigenvalue is related to the oscillatory part of the solution.

<p> A $latex  \lambda_i  $  would be called an unstable eigenvalue of the system and also forms part of the vector space called the  unstable manifold. Instability is defined as the tendency for a system to shoot away from a certain state when it is slightly disturbed (perturbed) from  that state. Stability is the feature of a system to come back to a certain state if it is slightly perturbed from that state. 
<p>
Stability has important consequences for applications, because it can determine if your chemical/combustion reaction will go out of control, of if the    species in your mathematical model go extinct, etc, depending on what the differential equations describe. Whatever your equations describe, knowing if   the solutions are stable is pretty important and usually the first step of an analysis. If you have stable solutions, then you can reasonably trust  numerics but if you are trying to numerically simulate an unstable solution of an equation, you must be much more careful. In these situations you want to use specialized integration algorithms that preserve certain properties of your solutions, like if it is <a href="http://en.wikipedia.org/wiki/Symplectic_integrator">symplectic</a>. More about this later!]]>
        
    </content>
</entry>
  <entry>
    <title>Updates and Promises</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/11/updates-and-promises.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.126</id>

    <published>2008-11-30T23:38:08Z</published>
    <updated>2008-12-01T00:25:08Z</updated>

    <summary>Yes, it has been quiet here but development on Math::GSL has steadily continued behind-the-scenes. I just pushed a dev release (0.15_04) to CPAN, it should be hitting a mirror near you soon. If the CPANTesters don't find anything horribly wrong...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="release" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="update" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[<div>Yes, it has been quiet here but development on Math::GSL has steadily continued behind-the-scenes. I just pushed a dev release (0.15_04) to CPAN, it should be hitting a mirror near you soon. If the <a href="http://testers.cpan.org">CPANTesters</a> don't find anything horribly wrong with it, it will probably become 0.16. Some new features of 0.16 will be:</div><div><br /></div><div><ul><li>New subsytems: <a href="http://leto.net/gitweb/?p=Math-GSL.git;a=blob_plain;f=swig/VectorComplex.i;hb=HEAD">VectorComplex</a> and <a href="http://leto.net/gitweb/?p=Math-GSL.git;a=blob_plain;f=swig/MatrixComplex.i;hb=HEAD">MatrixComplex</a></li><li>Operator overloading for addition and subtraction with vectors</li><li>Added example: examples/matrix/nonsymmetric_eigen</li></ul></div><div><div>        Shows how to find the eigenvalues of a nonsymmetric matrix</div></div><div><ul><li>Added copy() method to vectors</li><li> Improved Vector docs</li><li>Sped up vector dot products by 15x using BLAS function gsl_blas_ddot</li></ul></div><div>        NOTE: using gsl_blas_ddot($x->raw,$y->raw) directly is still about 10 times faster </div><div>              than $x * $y due to error checking and function call overhead</div><div><ul><li>Separated POD and Perl code out of SWIG interface files, yay for proper syntax highlighting</li></ul></div><div><ul><li>Added stub test files for Heapsort, IEEEUtils, Multimin, Siman, Wavelet2D</li><li>All test files now keep track of how many tests should run and other important infrastructure changes</li></ul></div><div><br /></div><div>Only a few of the changes are user-facing but they are important in terms of the long-term development and health of Math::GSL. </div><div><br /></div><div>While I have been making these back-end changes I have been prototyping a web-based interface to Math::GSL using <a href="http://jQuery.com">jQuery</a>. I have many functional parts but no coherent interface that I am willing to inflict on users. But I promise you that soon you will be able to use Math::GSL via your browser and bypass the whole "what-do-you-mean-i-have-to-compile-it" issue. </div><div><br /></div> ]]>
        
    </content>
</entry>
  <entry>
    <title>LaTeX finally works</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2008/11/testing-latex.html"/>
    <id>tag:leto.net,2008:/x//1.125</id>

    <published>2008-11-30T10:36:08Z</published>
    <updated>2008-11-30T22:58:51Z</updated>

    <summary>Yes, now I can write Euler's Identity properly: $latex e^{i \pi } + 1 = 0$. This required some heavy hacking on the MTLaTeX plugin, mostly in telling LaTeX where to find style files and fonts. I fixed some glaring security...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="movabletype" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[<div>Yes, now I can write <a href="http://en.wikipedia.org/wiki/Euler's_identity">Euler's Identity</a> properly: $latex e^{i \pi } + 1 = 0$. This required some heavy hacking on the <a href="http://www.raquo.net/fine-structure/latex/">MTLaTeX</a> plugin, mostly in telling LaTeX where to find style files and fonts. I fixed some glaring security bugs waiting to happen and improved error reporting. Once I started looking at the source, it was pretty apparent that it was translated from PHP <span class="Apple-style-span" style="font-weight: bold;">*wince*</span>. I started an overhaul, but it definitely needs a rewrite from the ground up. It would be nice to have config parameters viewable and changeable within MT. Thankfully MT has some pretty good <a href="http://www.movabletype.org/documentation/">documentation</a>.</div><div><br /></div><div>LaTeX makes math jokes so much more fun:</div><div><br /></div><div>$latex \int{ \frac{1}{cabin} } = \log{ cabin} + C$</div><div><br /></div><div>Don't forget the $latex + C $, it's important. </div><div><br /></div>]]>
        
    </content>
</entry>
  <entry>
    <title>Thesis Revisited</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2008/11/thesis-revisited.html"/>
    <id>tag:leto.net,2008:/x//1.124</id>

    <published>2008-11-28T09:01:47Z</published>
    <updated>2008-11-28T09:38:34Z</updated>

    <summary>Enough time has passed after the defense of my masters that I can stand looking at it again, so I did a git svn clone of my old svn thesis repo and put it on my gitweb. The scary-sounding title...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="git" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="math" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="svn" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="thesis" label="thesis" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[Enough time has passed after the defense of my masters that I can stand looking at it again, so I did a <span class="Apple-style-span" style="font-weight: bold;">git svn clone </span>of my old svn thesis repo and put it on my <a href="http://leto.net/gitweb/">gitweb</a>. The scary-sounding title of my thesis was: <a href="http://leto.net/x/2008/11/28/thesis.pdf">Solitary Wave Families In Two Non-Integrable Models Using Reversible Systems Theory</a>. It is 48 pages of gobbleygook unless you have some decent differential equations and linear algebra background. The <a href="http://leto.net/x/2008/11/28/thesis_presentation.pdf">presentation</a> that I gave during my defense is at least a tiny bit more digestible. It at least has a Sherlock Holmes quote and some pretty pictures. One sentence english translation of my thesis: <span class="Apple-style-span" style="text-decoration: underline;">I found some solutions to some equations that people hadn't found before</span>.<div><br /></div><div>One chapter of my thesis was accepted and published in <span class="Apple-style-span" style="border-collapse: collapse; color: rgb(43, 50, 68); font-family: verdana; font-size: 11px; "><a href="http://www.elsevier.com/wps/find/journaldescription.cws_home/622724/description#description">Communications in Nonlinear Science and Numerical Simulation</a><span class="Apple-style-span" style="border-collapse: separate; color: rgb(51, 51, 51); font-family: arial; font-size: 13px; "><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">.<span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; "> Here is the <a href="http://www.sciencedirect.com/science?_ob=ArticleURL&amp;_udi=B6X3D-4SFG4MB-1&amp;_user=10&amp;_coverDate=05%2F31%2F2009&amp;_rdoc=25&amp;_fmt=high&amp;_orig=browse&amp;_srch=doc-info(%23toc%237296%232009%23999859994%23703262%23FLA%23display%23Volume)&amp;_cdi=7296&amp;_sort=d&amp;_docanchor=&amp;_ct=76&amp;_acct=C000050221&amp;_version=1&amp;_urlVersion=0&amp;_userid=10&amp;md5=0785293922ab7d5140ab1c50972c026d">abstract</a>. The actual print publication date is <span class="Apple-style-span" style="color: rgb(0, 0, 0); font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><a href="http://www.sciencedirect.com/science?_ob=PublicationURL&amp;_tockey=%23TOC%237296%232009%23999859994%23703262%23FLA%23&amp;_cdi=7296&amp;_pubType=J&amp;view=c&amp;_auth=y&amp;_acct=C000050221&amp;_version=1&amp;_urlVersion=0&amp;_userid=10&amp;md5=21a9cb35827bae338a0e83fe7c162fbe" style="text-decoration: none; ">Volume 14, Issue 5</a>, May 2009, Pages 1999-2005, but it is "pre-published" online.</span></span></span></span></span></div><div><br /></div><div><span class="Apple-style-span" style="border-collapse: collapse; color: rgb(43, 50, 68); font-family: verdana; font-size: 11px; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(51, 51, 51); font-family: arial; font-size: 13px; "><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; ">Next on my list is to get LaTeX rendering to work in MovableType.</span></span></span></span></div>]]>
        
    </content>
</entry>
  <entry>
    <title>People Pay for Oracle?</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2008/11/people-pay-for-oracle.html"/>
    <id>tag:leto.net,2008:/x//1.123</id>

    <published>2008-11-27T04:53:13Z</published>
    <updated>2008-11-27T05:09:57Z</updated>

    <summary>I was utterly amazed when I had the pleasure of interacting with an Oracle database at work and realized that even the latest and greatest Oracle 10 command-line shell has no readline support.  Are we still in the days of vacuum...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="crapware" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[I was utterly amazed when I had the pleasure of interacting with an Oracle database at work and realized that even the latest and greatest Oracle 10 command-line shell has no <a href="http://en.wikipedia.org/wiki/GNU_readline">readline</a> support.  Are we still in the days of <a href="http://www.computersciencelab.com/ComputerHistory/HtmlHelp/Images2/eniac3.gif">vacuum tubes</a>? Seriously people! Thankfully there is a spiffy utility called <a href="http://utopia.knoware.nl/~hlub/uck/rlwrap/">rlwrap</a> which saves the day. It acts as a buffer between another interactive program and provides proper command completion and history. ]]>
        
    </content>
</entry>
  <entry>
    <title>GitX 0.5 has Gravatar Support!</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2008/11/gitx-05-has-gravatar-support.html"/>
    <id>tag:leto.net,2008:/x//1.122</id>

    <published>2008-11-22T03:14:17Z</published>
    <updated>2008-11-22T03:26:09Z</updated>

    <summary>GitX just auto-upgraded itself and the interface just keeps getting prettier and more functional! Check out the spiffy Gravatar and one-click gist creation:...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="git" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="osx" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="git" label="git" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[<a href="http://gitx.frim.nl/index.html">GitX</a> just auto-upgraded itself and the interface just keeps getting prettier and more functional! Check out the spiffy <a href="http://www.gravatar.com">Gravatar</a> and one-click <a href="https://gist.github.com/ce970fb0702d30768bb6">gist </a> creation:

<a href="http://www.flickr.com/photos/28801292@N05/3048703735/" title="gitx-gravatar by jaleto, on Flickr"><img src="http://farm4.static.flickr.com/3237/3048703735_c8e1a5c451.jpg" width="500" height="476" alt="gitx-gravatar" /></a>]]>
        
    </content>
</entry>
  <entry>
    <title>Complex Eigenvalues with Math::GSL</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/11/complex-eigenvalues-with-mathg.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.121</id>

    <published>2008-11-16T01:09:27Z</published>
    <updated>2008-11-16T01:36:31Z</updated>

    <summary>After a question arose recently about finding complex eigenvalues of non-symmetric matrices, I wrote this example to show how it can be done with Math::GSL. The current example is called examples/matrix/nonsymmetric_eigen in the Math::GSL source, which will be in the 0.16 Math::GSL...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="complex" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="linearalgebra" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[After a question arose recently about finding complex eigenvalues of non-<a href="http://mathworld.wolfram.com/SymmetricMatrix.html">symmetric matrices</a>, I wrote <a href="http://leto.net/gitweb/?p=Math-GSL.git;a=blob_plain;f=examples/matrix/nonsymmetric_eigen;hb=2b9e985f4bd69de0f772dfe8096c3cdc36dcb181">this example</a> to show how it can be done with Math::GSL. The current example is called <span class="Apple-style-span" style="font-weight: bold;">examples/matrix/nonsymmetric_eigen</span> in the Math::GSL source, which will be in the 0.16 Math::GSL release. It uses the <span class="Apple-style-span" style="font-weight: bold; ">gsl_eigen_nonsymmv()</span> function to do all the hard work, the rest is twiddling complex numbers. The documentation for this can be found with<span class="Apple-style-span" style="font-weight: bold; "> perldoc Math::GSL::Eigen</span> or <a href="http://search.cpan.org/~leto/Math-GSL-0.14/lib/Math/GSL/Eigen.pm">here</a>.(The HTML rendering of the POD needs some work...) You can read the original C documentation for this function <a href="http://www.gnu.org/software/gsl/manual/html_node/Real-Nonsymmetric-Matrices.html">here.</a><div><div><br /></div><div> It is a well known theorem of linear algebra that symmetric matrices can have only real eigenvalues. Thus it is much easier to find eigenvalues of symmetric matrices because there is no possibility of complex numbers arising. You can do this with <a href="http://search.cpan.org/dist/Math-MatrixReal/">Math::MatrixReal</a>, which is written in pure-Perl.</div><div><br /><div><div>The output of <span class="Apple-style-span" style="font-weight: bold;">examples/matrix/nonsymmetric_eigen</span> looks like:</div><div><br /></div><div><div>Finding eigenvalue/eigenvectors for</div><div>[ 0  -1 ]</div><div>[ 1   0 ]</div><div><br /></div><div>Eigenvectors:</div><div><br /></div><div>u = (0.707106781186547,-0.707106781186547i)</div><div>v = (0.707106781186547,0.707106781186547i)</div><div><br /></div><div>Eigenvalues:</div><div><br /></div><div>lambda_0 = i</div><div>lambda_1 = -i</div><div><br /></div><div><br /></div><div>By the way, sqrt(2)/2 = 0.707106...</div><div><br /></div><div>I am not quite happy with how long the program is, mainly because I have not written a Perlish interface around Complex Vectors and Matrices yet, so it is all in that script right now. The stringification could be built into the object and therefore reduce the length of that code dramatically.</div></div></div></div></div>]]>
        
    </content>
</entry>
  <entry>
    <title>Inside Look of Math::GSL</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/11/inside-look-of-mathgsl.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.120</id>

    <published>2008-11-14T21:49:48Z</published>
    <updated>2008-11-14T22:26:12Z</updated>

    <summary>SWIG saves the day.</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="swig" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="mathgsl" label="mathgsl" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="swig" label="swig" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[<div><div>Here is a breakdown of how many lines of code (roughly) are in different languages in the Math::GSL codebase:</div><div><span class="Apple-style-span" style="font-weight: bold;"><br /></span></div><ul><li><span class="Apple-style-span" style="font-weight: bold;">280889</span> lines - <a href="http://perldoc.perl.org/perlxs.html">XS</a> ( C-like Perl internals autogenerated by <a href="http://www.swig.org" style="text-decoration: underline; ">SWIG</a>)</li><li>60181 lines  - Total Perl (generated by <a href="http://www.swig.org" style="text-decoration: underline; ">SWIG</a>)</li><li> 22941  lines- Hand-written Perl </li><ul><li> 8617 lines - Tests</li></ul><ul><li>13731 lines - <a href="http://perldoc.perl.org/perlpod.html">POD</a> (this actually includes some Perl implementation, probably &lt;5%). Much of this was autogenerated from the <a href="http://www.gnu.org/software/gsl/manual/html_node/index.html">GSL C documentation</a> and reformatted, but it stills needs work, especially in making the POD render to HTML in a more pleasant way.</li></ul><li><span class="Apple-style-span" style="font-weight: bold;">1112</span>   lines - <a href="http://www.swig.org" style="text-decoration: underline; ">SWIG</a></li></ul></div><div><div>The reason why Math::GSL requires something like SWIG becomes very apparent. The SWIG interface files are roughly 1/280th the length of the raw XS source code. No reasonable  person would be hacking on Perl internals, but not even a reasonable Perl hacker wants to write all that error checking boilerplate cruft. Thanks <a href="http://www.swig.org">SWIG</a>!</div><div><br /></div><div>This was made possible by ripping all Perl code out of the SWIG interface files and putting them in the pod/ directory. It is not strictly POD but a simple naming scheme was key and the majority of the files do happen to be POD, so whatev. And now vim correctly syntax highlights the files! I think there is something to be said for sticking to one language per file. </div></div>]]>
        
    </content>
</entry>
  <entry>
    <title>Running a Factor Script</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2008/11/running-a-factor-script.html"/>
    <id>tag:leto.net,2008:/x//1.98</id>

    <published>2008-11-06T15:32:56Z</published>
    <updated>2008-11-06T16:18:33Z</updated>

    <summary>For those who are put off by the interactive UI part of Factor, you can run a script from the command-line like so#! /Users/leto/git/factor/factor  -scriptUSING: gsl gsl.sf.result gsl.sf.bessel gsl.sf.log kernel tools.test ;"gsl.sf" testNote the space after the ! is necessary...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="GSL" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="factor" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="factor" label="factor" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[For those who are put off by the interactive UI part of Factor, you can run a script from the command-line like so<div><br /></div><div><div><span class="Apple-style-span" style="font-weight: bold;">#! /Users/leto/git/factor/factor  -script</span></div><div><span class="Apple-style-span" style="font-weight: bold;"><br /></span></div><div><span class="Apple-style-span" style="font-weight: bold;">USING: gsl gsl.sf.result gsl.sf.bessel gsl.sf.log kernel tools.test ;</span></div><div><span class="Apple-style-span" style="font-weight: bold;"><br /></span></div><div><span class="Apple-style-span" style="font-weight: bold;">"gsl.sf" test</span></div><div><br /></div><div>Note the space after the ! is necessary because every "word" in Factor must be separated by a space. The practice of running factor as a non-interactive script is not encouraged, but in certain  situations it wins the day. The above script could be factored to take an argument of a subsystem to test and then I would make a key-binding in vim (or emacs or whatever) so that when I am editing a file and I type <span class="Apple-style-span" style="font-weight: bold;">,t </span>it shows me the results of that subsystems tests.</div><div><br /></div><div>All of this stuff can be done in the interactive UI, but I think people will fiddle with Factor more  if they can easily bolt it onto their current workflow. People tend not to even try things that require totally changing their current tool chain. For me, I am editing the source of the GSL bindings in VIM, so having that script is invaluable. I hack on the source and whenever I change anything important I run the tests by hitting <span class="Apple-style-span" style="font-weight: bold;">2 keys. </span>It is really important to make running and writing tests as easy as possible, or they won't get written at all. </div><div><br /></div><div>Today ...... is a good day to hack.</div><div><br /></div></div>]]>
        
    </content>
</entry>
  <entry>
    <title>New Factor Git repo</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2008/11/new-factor-git-repo.html"/>
    <id>tag:leto.net,2008:/x//1.97</id>

    <published>2008-11-06T07:41:36Z</published>
    <updated>2008-11-06T08:10:53Z</updated>

    <summary>You can view my new factor repo's gitweb. Or you can clone my repo withgit clone http://leto.net/code/factor.gitThis should start getting pulled upstream into the main factor repo sometime soon.The GSL bindings are now in "extra/gsl", which is the extra.gsl namespace...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="GSL" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="factor" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="git" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="factor" label="factor" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[You can view my new factor repo's <a href="http://leto.net/gitweb/?p=factor.git;a=summary">gitweb</a>. Or you can clone my repo with<div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-family: '-editor-proxy';">git clone http://leto.net/code/factor.git</span></span></blockquote><div><br /></div>This should start getting pulled upstream into the main factor repo sometime soon.<div><br /></div><div>The GSL bindings are now in "extra/gsl", which is the <span class="Apple-style-span" style="font-weight: bold;">extra.gsl</span> namespace in Factor. I have bindings to all of GSL's special functions, I am currently working on documenting the Bessel functions and writing tests for the functions which take/return gsl_sf_result structures. If you would like to see another subsystem, just ask and I will let you know if it is doable. There are almost 50 subsystems, so if you want to help: clone, hack, commit and push!<br /><div><br /></div></div>]]>
        
    </content>
</entry>
  <entry>
    <title>CouchDB talk at OpenSourcery</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2008/11/couchdb-talk-at-opensourcery.html"/>
    <id>tag:leto.net,2008:/x//1.96</id>

    <published>2008-11-06T02:21:51Z</published>
    <updated>2008-11-06T04:39:40Z</updated>

    <summary>I attended a presentation at OpenSourcery by Chris Anderson about CouchDB. He showed off  Futon, which is CouchDB's online web interface, which allows one to do normal CRUD, as well as set up replications, run tests and set configuration variables....</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="couchdb" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="presentation" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="erlangcouchdb" label="erlang couchdb" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[<div>I attended a presentation at <a href="http://www.opensourcery.com/">OpenSourcery</a> by <a href="http://jchris.mfdz.com/">Chris Anderson</a> about <a href="http://incubator.apache.org/couchdb/">CouchDB</a>. He showed off  <a href="http://wiki.apache.org/couchdb/Getting_started_with_Futon?action=show&amp;redirect=GettingStartedWithFuton">Futon</a>, which is CouchDB's online web interface, which allows one to do normal <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</a>, as well as set up replications, run tests and set configuration variables. It has some simple JavaScript functions which are basically map/reduce elements and it seems to be tightly integrated with <a href="http://jquery.com/">jQuery</a>. When I asked about <a href="http://www.prototypejs.org/">Prototype</a> I got the "Why are you still using Prototype?" spiel. Perhaps I should actually look into why people think jQuery is so much better.  Anyway, Here are my rough notes of the interesting features of CouchDB that caught my eye:</div><div><br /></div><div>HTTP server + JSON Doc DB (key/value pairs), RESTful</div><div><br /></div><div>Incremental Map reduce views</div><div><br /></div><div>peer-based replication</div><div><br /></div><div>multi-master  OR push all changes to one write-master and + read slaves</div><div><br /></div><div>concurrency over serial speed</div><div><br /></div><div>Ex: lotsofwords.com = 120GB database, 200ms response</div><div><br /></div><div>written in Erlang</div><div><br /></div><div>sharding via hash functions</div><div><br /></div><div>documents vs. relations</div><div><br /></div><div>each doc has a "revision"</div><div><br /></div><div>first in wins</div><div><br /></div><div>standalone apps via _external servers </div><div><br /></div><div>p2p replication - this is really cool and powerful</div><div><br /></div><div>_external servers - api to parse request as json, filter it and then return</div><div><br /></div><div>rollup = reduce </div><div><br /></div><div>re-reduce phase =~ aggregate</div><div><br /></div><div><br /></div><div><br /></div>]]>
        
    </content>
</entry>
  <entry>
    <title>Bessel Functions in Factor</title>
    <link rel="alternate" type="text/html" href="http://leto.net/x/2008/11/bessel-functions-in-factor.html"/>
    <id>tag:leto.net,2008:/x//1.95</id>

    <published>2008-11-02T05:08:41Z</published>
    <updated>2008-11-02T05:14:54Z</updated>

    <summary>View ScreenshotClick on the link above to see a screenshot of how to make plots of functions in Factor. I am showing off the Regular Bessel function J0(x) which is called gsl_sf_bessel_J0 in GSL. In the background I also have...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="factor" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="screenshot" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/x/">
        <![CDATA[<span class="Apple-style-span" style="color: rgb(85, 26, 139); text-decoration: underline;"><a href="http://leto.net/x/factor-gsl.html" onclick="window.open('http://leto.net/x/factor-gsl.html','popup','width=1440,height=900,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false">View Screenshot</a><br /></span><div><br /></div><div>Click on the link above to see a screenshot of how to make plots of functions in Factor. I am showing off the Regular Bessel function J0(x) which is called gsl_sf_bessel_J0 in GSL. In the background I also have the source of the documentation.</div>]]>
        
    </content>
</entry>
  <entry>
    <title>Post-Mentor-Summit Wrap Up</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/11/postmentorsummit-wrap-up.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.92</id>

    <published>2008-11-01T13:20:20Z</published>
    <updated>2008-11-01T13:56:12Z</updated>

    <summary>I took a bit of a break after releasing Math::GSL 0.14 and tried not to stare at a screen too much  during the GSOC08 conference, when I could be interacting with open source developers from around the world IRL. I...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="mentorsummit" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="update" scheme="http://www.sixapart.com/ns/types#category"/>
    
    <category term="mentorsummit" label="mentorsummit" scheme="http://www.sixapart.com/ns/types#tag"/>
    <category term="mentorsummit08" label="mentorsummit08" scheme="http://www.sixapart.com/ns/types#tag"/>
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[I took a bit of a break after releasing Math::GSL 0.14 and tried not to stare at a screen too much  during the GSOC08 conference, when I could be interacting with open source developers from around the world IRL. I met developers from <a href="http://git.or.cz">Git</a>, <a href="http://wiki.xmms2.xmms.se/wiki/Main_Page">Xmms2</a>, <a href="http://www.videolan.org">VLC</a>, <a href="http://www.php.net">PHP</a>, <a href="http://zikula.org/">Zikula</a>, <a href="http://www.openafs.org">OpenAFS</a>, <a href="http://www.boost.org/">Boost</a>, <a href="http://jikesrvm.org/">Jikes RVM</a>, <a href="http://www.squeak.org/">Squeak</a>, <a href="http://musicbrainz.org/">MusicBrainz</a>, <a href="http://www.worldforge.org/">Worldforge</a>, <a href="http://www.minix3.org/">Minix3</a>, the list goes on. People shared many ideas about making sustainable open source projects, getting and keeping members in your community and dealing with "troublesome" members.  Daniel Svensson from Xmms2 also showed me some git-fu relating to rebasing.<div><br /></div><div>But that doesn't mean that Math::GSL development has come to a halt! Since 0.14 Thierry added operator overloading for addition in Vector. This sparked my interest and I then did subtraction. The current code will vectorize operations that you learn "don't make sense" in grade school, such as:<span class="Apple-style-span" style="font-weight: bold;"> $</span><span class="Apple-style-span" style="font-family: '-editor-proxy';"><span class="Apple-style-span" style="font-weight: bold;">v - 5</span></span> , where <span class="Apple-style-span" style="font-weight: bold;">v</span> is a vector. Math::GSL will go ahead and subtract 5 from every element in $<span class="Apple-style-span" style="font-weight: bold; ">v</span>. You can also do <span class="Apple-style-span" style="font-weight: bold; ">2 + $v</span> and you will get a new vector where 2 has been added to each element of $<span class="Apple-style-span" style="font-weight: bold; ">v</span>.</div><div><br /></div><div><br /></div><div>Also, I reorganized the directory structure so that all SWIG interface files are now in the <span class="Apple-style-span" style="font-weight: bold;">swig/ </span>subdirectory, instead of clogging up the root directory. All SWIG-generated XS code and object files are thrown in there as well. This should make the Math::GSL codebase easier to navigate. </div><div><br /></div>]]>
        
    </content>
</entry>
  <entry>
    <title>Math::GSL 0.14</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/10/mathgsl-014.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.85</id>

    <published>2008-10-22T15:09:31Z</published>
    <updated>2008-10-23T03:04:24Z</updated>

    <summary>Get it here: http://search.cpan.org/~leto/Math-GSL-0.14/ Changes in 0.14:    - Chebyshev Series Approximation, with tests and docs    - Examples and new documentation in Statistics, as well as tests (Thierry)    - Bugfixes relating to compiling on 64bit Red Hat Linux, reported by Michael Roberge    -...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="release" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[Get it here: <a href="http://search.cpan.org/~leto/Math-GSL-0.14/">http://search.cpan.org/~leto/Math-GSL-0.14/ </a><div><br /></div><div>Changes in 0.14:</div><div><br /></div><div><div>    - Chebyshev Series Approximation, with tests and docs</div><div>    - Examples and new documentation in <a href="http://search.cpan.org/~leto/Math-GSL/lib/Math/GSL/Statistics.pm">Statistics</a>, as well as tests (Thierry)</div><div>    - Bugfixes relating to compiling on 64bit Red Hat Linux, reported by Michael Roberge</div><div>    - Improved <a href="http://search.cpan.org/~leto/Math-GSL/lib/Math/GSL/FFT.pm">FFT</a>, <a href="http://search.cpan.org/~leto/Math-GSL/lib/Math/GSL/Deriv.pm">Deriv</a>, <a href="http://search.cpan.org/~leto/Math-GSL/lib/Math/GSL/Integration.pm">Integration</a>, <a href="http://search.cpan.org/~leto/Math-GSL/lib/Math/GSL/Chebyshev.pm">Chebyshev</a>, <a href="http://search.cpan.org/~leto/Math-GSL/lib/Math/GSL/Combination.pm">Combination</a> and <a href="http://search.cpan.org/~leto/Math-GSL/lib/Math/GSL/Roots.pm">Roots</a> docs</div><div>    - Documentation for <a href="http://search.cpan.org/~leto/Math-GSL/lib/Math/GSL/Test.pm">Math::GSL::Test</a> </div><div>    - Improved introduction examples in <a href="http://search.cpan.org/~leto/Math-GSL/lib/Math/GSL.pm">Math::GSL</a></div><div>    - Improved <a href="http://search.cpan.org/~leto/Math-GSL/lib/Math/GSL/Min.pm">Minimization</a> subsystem tests, but it is not functional</div><div>    - Added <a href="http://github.com/leto/math--gsl/tree/master/examples/fft/forward_real">examples/fft/forward_real</a></div><div>    - Added <a href="http://github.com/leto/math--gsl/tree/master/examples/deriv/basic">examples/deriv/basic</a></div><div><br /></div><div>        This shows the simple fact that d/dx(sin(x)) = cos(x)</div><div><br /></div><div>    - Added <a href="http://github.com/leto/math--gsl/tree/master/examples/sf/erfc_check">examples/sf/erfc_check</a> (thanks to Keith Lofstrom)</div><div><br /></div><div>        Script which tests the erfc() special function against computing</div><div>        the integral definition with gsl_integration_qagiu()</div><div><br /></div><div>    - Added <a href="http://github.com/leto/math--gsl/tree/master/examples/vector/speed">examples/vector/speed </a></div><div>    </div><div>        This shows a considerable performance boost using <a href="http://search.cpan.org/~leto/Math-GSL/lib/Math/GSL/Vector.pm">Math::GSL::Vector</a>s</div><div>        instead of List::Util when searching for the min and max elements of</div><div>        large sets of random numbers.</div><div><br /></div><div>    - Fixed return signature of gsl_deriv_* functions to return a flat list</div><div>    - Fixed some failing tests relating to  -Duselongdouble (Sisyphus)</div><div>    - Fix location of shared objects (Sisyphus)</div><div>    - Added raw() method to <a href="http://search.cpan.org/~leto/Math-GSL/lib/Math/GSL/RNG.pm">RNG</a> objects</div><div><br /></div></div>]]>
        
    </content>
</entry>
  <entry>
    <title>Math::GSL on GitHub</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/10/mathgsl-on-github.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.83</id>

    <published>2008-10-22T04:30:32Z</published>
    <updated>2008-10-22T05:03:04Z</updated>

    <summary>I have created a GitHub mirror of the Math::GSL git repo, hopefully this will make it easier for developers to join the project and I will get to see why people like GitHub so much.Public Clone URL:git://github.com/leto/math--gsl.gitI like that it automatically creates...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="git" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[I have created a<a href="http://github.com/leto/math--gsl/tree/master"> GitHub</a> mirror of the Math::GSL git repo, hopefully this will make it easier for developers to join the project and I will get to see why people like GitHub so much.<div><br /></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: helvetica; line-height: 18px; "><table style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: inherit; line-height: 1.4em; float: left; max-width: 48em; "><tbody style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; "><tr style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; "><td class="label" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(136, 136, 136); padding-right: 0.25em; vertical-align: top; ">Public Clone URL:</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; "><a href="git://github.com/leto/math--gsl.git" class="git_url_facebox" rel="#git-clone" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(65, 131, 196); text-decoration: none; ">git://github.com/leto/math--gsl.git</a></td></tr></tbody></table><br /></span></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: helvetica; line-height: 18px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: helvetica; line-height: 18px;">I like that it automatically creates a "donate" link via <a href="http://pledgie.org/">Pledgie</a>. Please consider <a href="http://pledgie.org/campaigns/1884">donating to Math::GSL today</a> if you enjoy using it!</span></div>]]>
        
    </content>
</entry>
  <entry>
    <title>Math::GSL 0.13_03 - More stuff!</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/10/mathgsl-013-03-more-stuff.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.80</id>

    <published>2008-10-17T03:16:12Z</published>
    <updated>2008-10-18T17:03:45Z</updated>

    <summary>I've just sent another dev release off to CPAN, 0.13_03 to test the recent Build changes that were necessary to get AMD64 boxen to correctly compile. It turns out that they really need the "-fPIC" flag at compilation and link...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="release" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[<div>I've just sent another dev release off to CPAN, 0.13_03 to test the recent Build changes that were necessary to get AMD64 boxen to correctly compile. It turns out that they really need the "-fPIC" flag at compilation and link time or else stuff blows up:</div><div><br /></div><div><span class="Apple-style-span" style="border-collapse: collapse; color: rgb(80, 0, 80); ">usr/bin/ld: BLAS_wrap.o: relocation R_X86_64_32S against `a local<br /> symbol' can not be used when making a shared object; recompile with -fPIC<br /> BLAS_wrap.o: could not read symbols: Bad value<br />collect2: ld returned 1 exit status<br />error building blib/arch/auto/Math/GSL/BLAS/<wbr>BLAS.so file from<br /> 'BLAS_wrap.o' at inc/GSLBuilder.pm line 99.</span></div><div><br /></div><div><br /></div><div>This link with go active sometime tomorrow: </div><div><br /></div><div><a href="http://search.cpan.org/~leto/Math-GSL-0.13_03/">http://search.cpan.org/~leto/Math-GSL-0.13_03/</a></div><div><br /></div><div>New stuff since 0.13_02:</div><div><br /></div><ul><li>AMD64 Build fixes</li><li>Improved FFT docs</li><li>Improved Math::GSL::Test docs</li></ul><div><br /></div>]]>
        
    </content>
</entry>
  <entry>
    <title>Math::GSL Podcast from PDX.pm</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/10/mathgsl-podcast-from-pdxpm.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.81</id>

    <published>2008-10-18T16:47:05Z</published>
    <updated>2008-10-18T16:52:36Z</updated>

    <summary> Here you can find my Scientfic Computing with Math::GSL Podcast from PDX.pm.( Stream, Download) In the talk I compare PDL and Math::GSL, talk about the Google Summer of Code 2008, and show off some of the subsystems that are currently working....</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="pdx.pm" scheme="http://www.sixapart.com/ns/types#category"/>
    
        <category term="podcast" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[ <div>Here you can find my Scientfic Computing with Math::GSL <a href="http://pdxpm.podasp.com/archive.html?pname=meetings.xml" style="text-decoration: underline; ">Podcast</a> from PDX.pm.( <a href="http://podasp.com/episodes/P/PD/PDX.pm/2385/20080910__MathGSL_Scientific_Comp__2385.mp3">Stream</a>, <a href="http://podasp.com/episodes/P/PD/PDX.pm/2385/20080910__MathGSL_Scientific_Comp__2385.mp3">Download</a>) In the talk I compare PDL and Math::GSL, talk about the Google Summer of Code 2008, and show off some of the subsystems that are currently working. I field some questions from the audience about whether Math::GSL does symbolic computing or parrallelized/vectorized computing (it doesn't, at least yet) and how exactly I turn Perl subroutine references into C function pointers. If you look at the presentation slides <a href="http://leto.net/gitweb/?p=presentations.git;a=blob_plain;f=ScientificComputingWithPerlAndMathGSL/pres.pdf;hb=90f668796926415ebfb259740216af86a50ef642" style="text-decoration: underline; ">here </a>while you listen, it is almost like being there!</div>]]>
        
    </content>
</entry>
  <entry>
    <title>New Developer Release : Math::GSL 0.13_02</title>
    <link rel="alternate" type="text/html" href="http://leto.net/code/Math-GSL/2008/10/new-developer-release-mathgsl.html"/>
    <id>tag:leto.net,2008:/code/Math-GSL//2.77</id>

    <published>2008-10-12T20:54:08Z</published>
    <updated>2008-10-12T20:55:58Z</updated>

    <summary>Please test this out and let me know if anything goes *boom*:http://search.cpan.org/~leto/Math-GSL-0.13_02/Changes since 0.12:   - Chebyshev Series Approximation, with tests and docs   - Improved Deriv, Integration, Chebyshev, Combination and Roots docs   - Improved introduction examples in Math::GSL   - Improved Minimization...</summary>
    <author>
        <name>Jonathan Leto</name>
        
    </author>
    
        <category term="release" scheme="http://www.sixapart.com/ns/types#category"/>
    
    
    <content type="html" xml:lang="en" xml:base="http://leto.net/code/Math-GSL/">
        <![CDATA[<span class="Apple-style-span" style="border-collapse: collapse; color: rgb(0, 0, 0); ">Please test this out and let me know if anything goes *boom*:</span><div><span class="Apple-style-span" style="border-collapse: collapse; color: rgb(0, 0, 0); "><br /><a href="http://search.cpan.org/~leto/Math-GSL-0.13_02/" target="_blank" style="color: rgb(0, 0, 204); ">http://search.cpan.org/~leto/<wbr>Math-GSL-0.13_02/</a><br /><br /><br />Changes since 0.12:<br /><br />   - Chebyshev Series Approximation, with tests and docs<br />   - Improved Deriv, Integration, Chebyshev, Combination and Roots docs<br />   - Improved introduction examples in Math::GSL<br />   - Improved Minimization subsystem tests, but it is not functional<br />   - Added example/deriv/basic<br /><br />       This shows the simple fact that d/dx(sin(x)) = cos(x)<br /><br />   - Added example/sf/erfc_check (thanks to Keith Lofstrom)<br /><br />       Script which tests the erfc() special function against computing<br />       the integral definition with gsl_integration_qagiu()<br /><br />   - Added example/vector/speed<br /><br />       This shows a considerable performance boost using Math::GSL::Vectors<br />       instead of List::Util when searching for the min and max elements of<br />       large sets of random numbers.<br /><br />   - Fixed return signature of gsl_deriv_* functions to return a flat list<br />   - Fix location of shared objects (Sisyphus)<br />   - Added raw() method to RNG objects</span> </div>]]>
        
    </content>
</entry>
</feed>
