• Develop sensible coding habits on the path to true Laziness

    Whenever I walk in my front door, I walk straight to the kitchen, open the first drawer, put in my keys and wallet and cell phone, and close the drawer. Always, without fail, no matter how bad I might have to take a leak. It is no less convenient for me to do this than to drop my stuff any old place. It is a habit that I have maintained for close to 30 years now. And I never ever ever have to wonder where I put my keys, or my phone, or my wallet. Ever. Having to do so would be extremely inconvenient. In fact, it would be EXTRA brain cycles on my part to put them where they do not belong. When the phone rings, I know where it is. I don't run around wondering "Where's my phone?" trying to triangulate position. It's always there in the kitchen drawer. Always. I also always put on my seat belt in the car. I never wonder if it's "necessary". I just do. Thinking about if it is "necessary" is also inconvenient. It takes brain cycles that I don't need to spend. I also know that the one time I need my seat belt and I don't have it on, I'm screwed. Trying to decide to save three seconds by not buckling my seat belt is false laziness. And so is worrying about when you can leave out `warnings` and `strict` from your Perl programs. Yesterday in IRC, someone was lamenting that Perl 6 effectively has `warnings` and `strict` on by default. All variables must declared before use. This person was one of those programmers who tried for the premature optimization of saving some typing. He forgot that typing is the least of our concerns when programming. He forgot that programmer thinking time costs many orders of magnitude more than programmer typing time, and that the time spent debugging can dwarf the amount of time spent creating code. He also forgot that he's a human. Checks like `warnings` and `strict` are there because we are fallible humans. We type `$totl` instead of `$total`, and we want Perl to tell us that. We try to dereference scalars and since we're no longer using Perl 4, we want Perl to tell us about that, too. We want Perl, which is a program and doesn't get sloppy and forget things, to catch us when we are humans and get sloppy and forget things. Buy and read *The Pragmatic Programmer* and *Code Complete* and develop a solid set of programming habits from them. Sensible habits that are followed even when you might be able to get away without them are the true Laziness.
  • Think, for Perl's sake

    I'm no longer surprised when I read about verbal abuse of other humans in my community. It makes me sad, both for the person who would say that to someone else, and for the person who gets the abuse. Worse, it makes me sad that the abusers don't care about the effects on their fellow human beings, or on the projects that they are representing.

    Using technology in a community like ours is far more than just a choice of which code does more. Choosing to use a technology on a project is an investment. When you invest in a project, whether it's a language like Perl, or a module like DBIx::Class, you're not just investing in code. You're investing in the community that comes with it. There are at least two major Perl projects I will not invest any time in because of the communities that surround them. I'm not alone in my convictions and actions.

    The other day I ran across an acronym, THINK, that gives questions to ask about what you're about to communicate, before you actually say it.

    Is what I'm about to say:

    Thoughtful
    Honest
    Intelligent
    Necessary
    Kind

    Geeks in technical discussions are really good at the Intelligent, and usually Thoughtful. The Honest is just a given.

    It's with Necessary and, especially, Kind where some fail, with damaging results.

    I'd like to urge all of us to keep THINK in mind in all our interactions, whether in IRC, mailing lists or in person at user group meetings and conferences.

    As an aside, I've always moderated Perlbuzz comments, and will continue to do so. THINK crystallizes my criteria perfectly.

  • ack 1.94 released

    Version 1.94 of ack, my source code searcher designed for programmers, has been released. This is the first release in almost a year. You can install it as [App::Ack](http://search.cpan.org/dist/ack) from the CPAN shell, or you can use one of the installation methods described at [http://betterthangrep.com/](http://betterthangrep.com/) Here are the changes. ## Fixes --man and --version now return with an exit code of 0. They used to exit with a 1. Thanks to Bo Borgerson. Fixed ack misbehavior when using --match or not specifying a regex: ack --match Sue cat foo | ack --perl Fixed issue 74: analog to grep, 'ack --count regex file' now only outputs the number of found matches, if only one file is given. Fixed issue 76: Giving both --line and a regex (with --match) now leads to an error. The same is true for -f or -g in conjunction with --match. (Torsten Blix) Fixed issue 80: Piping into ack --count now works as expected. ack always returned 0 when piped into, no matter how many matches where found. (Torsten Blix) Fixed issue 81: .ackrc now ignores leading/trailing whitespace. (Torsten Blix) ## File type updates Added --verilog, --vhdl and --clojure. Files that match *.mk and *.mak as well as GNUmakefile are now included in the ack filetype 'make' (issue 88). Added RSpec's .spec type to the --ruby list. Added support for Go and Delphi. Ignores Monotone's _MTN directories. Added .xsl to the list of --xml files. ## Enhancements The --ignore-dir option now can ignore entire paths relative to your current directory. Thanks to Nick Hooey. For example: ack --ignore-dir=t/subsystem/test-data Added --invert-file-match switch to negate the sense of the -g/-G switches. Thanks, Lars Dieckow. Updated the README to Markdown format. Thanks to Mark Szymanski for the idea. Added docs for -r, -R, --recurse options. Added new switch --color-lineno and environment variable `ACK_COLOR_LINENO`, which allow setting the line number color. (Marq Schneider) Added option --show-types to output the types that ack considers a file to have. (Torsten Blix) `ack --count --no-filename regex` doesn't output a list of numbers but a sum of all occurences. This is NOT what grep does but is the more sensible behavior.
  • Google Code-In brings fresh blood to the Perl and Parrot communities

    By Jonathan Leto

    I'm excited to announce that Parrot Foundation and The Perl Foundation have been accepted as organizations in Google Code-In 2010!

    Google Code-In is a contest, similar to Google Summer of Code, 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.

    In 2010, Google Summer of Code was a great success for Perl and Parrot. We got amazing new features in Parrot, Perl 5 and Perl 6 . In 2009, we had similarly spectacular results.

    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ésumé. I see many Google Summer of Code students get snapped up by respected companies, or accepted to prestigious academic institutions.

    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.

    I expect great results for Code-In as well, but we need your help. The Google Code-In contest opens up for students on: November 22, 2010 at 12:00 AM Pacific Time / 08:00 UTC.

    How Can You Get Involved?

    • Add a task to our task list 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.
    • Improve the description of an existing task. 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.
    • Volunteer to mentor a student on a task. You apply to be a mentor here. Please join the tpf-gsoc-students 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 #gci channel on irc.perl.org.
    • Tell potential students about Google Code-In and how we are involved. Here is a link to the timeline and FAQ that you can send them, as well as flyers to post.

    Jonathan "Duke" Leto has been heavily involved in co-ordinating the Perl and Parrot projects in Google Summer of Code for the past three years. He's also a core contributor to the Parrot and Perl 6 projects, as well as the maintainer of many CPAN modules. You can find his Perl-related blog at http://leto.net/perl.

  • Progressing vs. leapfrogging

    In this blog post, ["Ugly Old Perl"](http://blog.laufeyjarson.com/2010/11/ugly-old-perl/), the author discusses how he(?) is still finding old Perl code like this: open(FH, "<<$runpath/log/output.log ") || die "Can't write output.log!" instead of the newer safer open( my $fh, '<<', "$runpath/log/output.log" ) || die "Can't write output.log!" He discusses how he's tried to introduce his co-workers to three-arg `open` calls, and they have no idea that such a thing exists. Perl 5 has become such a success, so ubiquitous, that people don't realize there have been improvements since they first learned it. I'm sure these people don't know any of the changes made to Perl regexes, too. They might still be using `study` as part of the belief that it magically makes regexes match faster. These are the users that will never use attributes, or Moose, or much of anything discussed in [Modern Perl](http://www.onyxneon.com/books/modern_perl/). I'm OK with that. These are the users who are going to stick with the Perl they know until they leapfrog to something else. That something else might be Ruby, or it might be Perl 6, but I know that they're never going to make a straight progression. If you're reading this blog, chances are you're a progresser. You follow each Perl release. You are interested in the incremental changes. You want to know about named captures in regexes and you find ways to use them in your existing code. But most of the users of Perl aren't. They're using Perl as a tool to get stuff done, and it's not a hobby. There's nothing wrong with that. They won't change their way of seeing Perl until there's something to leapfrog over. All we can do is make Perl 5.12 or Perl 6 a fantastic target to leap to, something to entice them to make the leap. (Aside: He also brings up the idea often trotted out that Perl 6 be named something other than Perl. It won't happen, so there's no point in discussing it.)
  • Passing of Randy Kobes

    Curtis “Ovid” Poe forwarded to me this announcement from the University of Winnipeg about the passing of Perl community member Randy Kobes. Most Perl people will know of Randy because of his kobesearch alternative CPAN search interface.

    It is with profound sadness that the University learned yesterday of the passing of Associate Dean of Science Randy Kobes. Dr. Kobes passed away after a recent battle with lung cancer. Randy was an excellent academic, physicist and educator of young people. He was fully dedicated to public engagement in science. His contributions to community learning at The University of Winnipeg went far beyond the classroom. Randy was a primary driver of the University’s Let’s Talk Science and was also keenly involved in the Eco-Kids programs, and numerous other outreach activities that involved inner-city children and youth. He was also the leader of numerous new degree programs in science, including Radiation Health and Safety; Science, Environment and Indigenous Knowledge; and pre-professional programs. Randy was truly dedicated to student success. Almost all of his work efforts were directed to encouraging student success in one way or another. Along with the many initiatives mentioned above, he volunteered his time in the summer with the CSI (Community School Investigators), an inner city summer learning enrichment program and was very involved in the homework club at the Wii Chiiwaakanak Learning Centre. He also personally drove students to Sisler High School, where the University had established an off-campus homework club. Randy obtained a B. Eng. degree in Engineering Physics from the University of Saskatchewan in 1978 and a Ph.D. in theoretical physics from the University of Alberta in 1983. He held postdoctoral fellowships at the University of British Columbia and at Memorial University of Newfoundland before joining the University of Winnipeg in 1987. His research interests included the application of quantum field theoretic methods to topics in theoretical particle physics and investigating non-linear effects using numerical techniques. He held an NSERC Discovery Grant since joining the University of Winnipeg, and most recently served as the University’s Associate Dean of Science. In June 2005 Randy was awarded the Marsha Hanen Award for Excellence in Creating Community Awareness. He founded the Manitoba chapter of Let’s Talk Science, which promotes scientific literacy by having University of Winnipeg volunteer scientists visit classrooms, present interactive experiments and raise awareness of science. In October 1999 he won the Erica and Arnold Rogers Award for Excellence in Research and Scholarship.

  • Run PHP tests in your Perl test suite

    Sometimes you've got a big codebase that isn't just Perl. Maybe you've got PHP mixed in with it, and you want to test the PHP along with all the Perl code, too. Perl's *prove* program doesn't care if the testing results it parses are from Perl, PHP or even static files, so long as they're in the [TAP](http://testanything.org/) format. However, actually getting *prove* to run those PHP programs takes a little doing. Fortunately, Test::Harness 3.xx has hooks for source handlers.

    Read on →

  • Vim 7.3 supports Perl 6, adds Perl 5 improvements

    Vim 7.3 has just been released today. From the announcement:

    This is a minor release of Vim. It consists of Vim 7.2 plus all patches, updated runtime files and some more, see below. It has been two years since the 7.2 release, thus it's not that "minor". But not "major" either. Something in between, don't know how to call that.

    The most notable additions since 7.2:

    • Persistent undo and undo for reload
    • Blowfish encryption, encryption of the swap file
    • Conceal text
    • Lua interface
    • Python 3 interface

    However, to the Perl programmer, this is a significant upgrade from 7.2, because of updates of all the Perl-related support files. Vim has language specific plugins for syntax highlighting, indenting and other filetype-related behaviors. Every one of these Perl-related support files has been updated. For example, syntax/perl.vim has not been updated since 2006. Now, Perl 5.10 keywords like given, when and state are properly highlighted.

    For the Perl 6 hackers out there working with Rakudo Star, Vim now includes support for Perl 6. Until now, if Perl 6 programmers wanted Vim to support Perl 6, they had to use a perl6.vim file that got passed around from person to person. Now, it comes installed automatically as part of Vim 7.3.

    Perl 6 detection is primitive, so you may have to explicitly add it to your modeline in your file, such as

    # vi: filetype=perl6:

    All of these changes are from the vim-perl project hosted on Github. In that project, I've aggregated syntax, indent and filetype plugins for the Perl and Perl 6 support files that get fed back to the Vim project. It's also got support for other filetypes like Template Toolkit that are not part of the vim distribution. I'm not making many changes to the Vim code directly. Like many of my other contributions to open source, my role is one of wrangler and coordinator and less of programmer and technologist.

    If you're interested in Vim support for Perl 5 and Perl 6, I encourage you to check out the vim-perl project and join the vim-perl mailing list. Now that Vim 7.3 is out, we have some room to stretch out and make Vim do incredible things for Perl in the next release.

  • Perl is not an acronym

    A reminder to those out there, especially HR folks, that the language Perl is always spelled “Perl” and never “PERL.” From the Perl FAQ:

    Read on →

  • Why roles in Perl are awesome

    by Chris Prather

    A question came up recently on a mailing list. I was talking about how Roles are a awesome win for Perl5 considering how few languages implement the concept1. Someone asked what the win was with Roles. I happen to have been thinking about this recently and dashed off a reply.

    When you use Inheritance, especially multiple inheritance, for behavioral re-use you run into several problems quickly.

    First Inheritance is an explicit modeling of a relationship that carries semantic meaning. Let's say you're developing a game for Biology students to explain to them taxonomy. In this game a Dog class is a subclass of Animal. That is, the Dog class inherits specific behaviors and attributes from the Animal class. This probably isn't even a direct relationship your Dog class may inherit from a Mammal class which inherits from a Vertebrate class which inherits from Animalia which itself inherits from Life. These kinds of hierarchies are common in Taxonomy as well as in Object Oriented programming. However when you need to express something that may cross cut concerns in, you run into issues.

    Say for example your marketing department has had trouble selling this product to schools and is attempting to market to parents directly. They have done studies and kids really like Pets2. So your boss comes to you because the company wants you to add the concept of Pet to your Taxonomy model.

    Pets don't fit into a Taxonomy, it's obvious that not all Animalias are Pets3 and some Pets may not be animals at all4. In many languages can use Multiple Inheritance to describe this new "I'm an Animalia and a Pet" relationship but often you run into issues there as well. Is a Pet a Life? That would mean our object model would look like:

    Life
    Animalia
    Vertebrae
    Canine    Pet
    Dog
    

    Pet stands out like a sore thumb. Obviously we've got issues with this new modeling. We talk to our boss and figure out that the rules for Pet are simple. Pet's are always domesticated versions of the Animalia, but not every class in Animalia is a pet. So for example Dogs are always Pets, Wolves are not. We can solve this with multiple inheritance now, but it's really not a clean way to express the relationship and it requires us to document the special relationship the Pet class would have with the rest off the Inheritance tree. Once you get beyond a few "special cases" like this it becomes hard to see the model for the exceptions.

    This is why some languages like to disallow multiple inheritance entirely. In Java for example, Pet could become an Interface.

    public interface Pet {
    Date getYearDomesticated;
    }
    

    This however means that every class that we want to be a pet needs to have the exact same piece of boiler plate code added to it.

    class Dog implements Pet {
    ...
    private Date yearDomesticated;
    public Date getYearDomesticated () { this.yearDomesticated }
    ...
    }
    

    If we instead have the concept of Roles then we can apply the concept of a Pet once at any level of the hierarchy we need. A example using a modern Perl5

    package Pet {
    use Moose::Role
    has year_domesticated => (
    is => 'ro',
    isa => 'DateTime',
    required => 1
    );
    }
    package Dog {
    use Moose;
    extends qw(Canine);
    with qw(Pet);
    }
    

    The Pet Role here implements everything we need for a default implementation, and doesn't require more boiler plate to our Dog class, that the bare minimum needed. It also avoids the ugly inheritance issues we saw with multiple inheritance by moving the behavior composition onto different tool. In my opinion, Roles aren't a win for every use of inheritance, nor for every time you want to re-use behavior, but they are an excellent tool to have in the box and one that the Moose crowd knows to reach for quite often.


    1. Off the top of my head I only know about Perl5, Perl6, Scala, Javascript, and Smalltalk. There may be other implementations out there. ↩

    2. The Marketing guy's daughter plays on WebKinz nightly. ↩

    3. Pet Shark's would be dangerous to say the least, and where would you keep a pet Blue Whale? ↩

    4. Who doesn't love their Pet Rock? ↩

    5. We're using the the inline package syntax that will be released in 5.14 ↩

    Chris Prather is an Owner at Tamarou LLC, a member of the Moose cabal, and responsible for Task::Kensho.

  • Low-tech high-speed OS X program launching

    I work in my OS X Terminal window all day long. When I want to run iCal or Address Book, I don't want to be bothered with clicking around to find the app, even though they live in my Dock. I could also use a program launcher like [Alfred](http://alfredapp.com/), which I like, but want it even faster. For me, the fastest way to open iCal while I'm in the shell is to run "ical" from the prompt, which launches the app. My ~/bin/ical program is simply #!/bin/sh open /Applications/iCal.app/ and my ~/bin/addr is #!/bin/sh open "/Applications/Address Book.app/" You might think that it's overkill to write a shell program for such a silly task, but it's all about optimizing my time at the keyboard for my common cases. Someone will note that I could have used a shell alias, and that's true, too. Either way, I want a super simple way to get the apps I use most often.
  • Fixing my #1 bash annoyance

    Ever open up a Terminal window and hit Tab and Bash sits for a few seconds until it finally comes back and asks Display all 2224 possibilities? (y or n) Because it went and compiled a list of EVERY executable you could possibly want to execute? Yeah, me, too, and I hate it. The fix is simple. Add this to your ~/.bashrc shopt -s no_empty_cmd_completion No more completion on nothing!
  • Artistic License 2.0 makes dual-license boilerplate unnecessary

    The dual-licensing in much module boilerplate these days is unnecessary. You can simplify your licensing by using only the [Artistic License 2.0](http://www.opensource.org/licenses/artistic-license-2.0.php). There are plenty of modules out there that license themselves "under the same terms as Perl itself", and [there are problems with that approach](http://perlbuzz.com/2008/04/the-problem-with-same-terms-as-perl-licensing.html). For the past year or so I've been using the approach of being explicit about "Artistic or GPL, your choice", but that's unnecessary, too. According to Allison Randal, one of the architects of Artistic License 2.0, "Artistic 2 allows for any GPL-like license, not just [GPL 2](http://www.opensource.org/licenses/gpl-2.0.php). Specifically, it allows for [GPL 3](http://opensource.org/licenses/gpl-3.0.html) or later, or a completely non-GPL copyleft license. So, the dual license is unnecessary." There's a page on the [Perl Foundation website](http://www.perlfoundation.org/) about [CPAN licensing guidelines](http://www.perlfoundation.org/cpan_licensing_guidelines) that explains more options in more detail. From here on out, my code is going to say: =head1 LICENSE Copyright (C) 2010, Andy Lester, This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose.
  • Allison Randal on how open source is more than code

    Allison Randal has some insights from her Twitter stream today about how open source is more than just a way to create and share code.

    Read on →

  • How to shuffle a list in Perl

    If you've got a list of things in Perl, and you want them in random order, don't try to make up a way to do it yourself. Use the shuffle function in the List::Util module. Say you want a list of files from a directory:
    use List::Util qw( shuffle );
    my @files = glob( '*' );
    @files = grep { -f } @files;
    @files = shuffle @files;
    
    Of course you can combine that into one expression:
    use List::Util qw( shuffle );
    my @files = shuffle grep { -f } glob( '*' );
    
    Or from the command line:
    perl -MList::Util=shuffle -le'print for shuffle grep {-f} glob("*")'
    
    Don't worry that List::Util is a module, because it's a core module that's been included with Perl since 5.7.3
    $ corelist List::Util
    List::Util was first released with perl 5.007003
    
    The shuffle function is extremely simple, and how here's a little [article that explains why it works](http://eli.thegreenplace.net/2010/05/28/the-intuition-behind-fisher-yates-shuffling/).
  • Handling multiple SSH keys in your SSH config

    I’ve been frustrated lately trying to juggle multiple SSH keys on various servers I’m on. If I’ve got one set up to the Subversion server at work, then I can’t authenticate with github. If I let github be the server that I have a private key for, then I’m entering a password whenever I do an svn up on the work server. I played with ssh-agent, but that seemed to require starting up a process every time I logged in, and I couldn’t get it running in my .bashrc, and it required manually adding keys. And then I stumbled across this article that introduced me to the IdentityFile argument. Now I have this in my ~/.ssh/config and all is well with the world.

    Read on →

  • To InformationWeek re: static code analysis

    Sent to editor of DrDobbs/InformationWeek

    Read on →

  • Perl 5.12 released; Perl 5 under new release process

    By Jesse Vincent, thanks to Eric Brine and Shlomi Fish for the markup. Please note the section about the new time-based release process below.

    'Please would you tell me,' said Alice, a little timidly, for she was not quite sure whether it was good manners for her to speak first, 'why your cat grins like that?'

    'It's a Cheshire cat,' said the Duchess, 'and that's why. Pig!'

    She said the last word with such sudden violence that Alice quite jumped; but she saw in another moment that it was addressed to the baby, and not to her, so she took courage, and went on again:--

    'I didn't know that Cheshire cats always grinned; in fact, I didn't know that cats COULD grin.'

    'They all can,' said the Duchess; 'and most of 'em do.'

    -- Lewis Carroll, Alice's Adventures in Wonderland

    On behalf of Perl's development team, It gives me great pleasure to announce the release of Perl 5.12.0.

    Perl 5.12.0 represents approximately two years of development since version 5.10.0 and contains over 750,000 lines of changes across over 3,000 files from over 200 authors and committers.

    SHA-1 signatures for this release:

    f533687077e2da113b48a6c5e578f4a206fbf173  perl-5.12.0.tar.bz2
    5341e60d099fdda71bc33b2a36e417fc0926518f  perl-5.12.0.tar.gz
    

    You can download this release from your nearest CPAN mirror or from:

    http://search.cpan.org/dist/perl-5.12.0/

    This release cycle marks a change to a time-based release process. Beginning with version 5.11.0, we make a new development release of Perl available on the 20th of each month. Each spring, we will release a new stable version of Perl. One month later, we will make a minor update to deal with any issues discovered after the initial ".0" release. Future releases in the stable series will follow quarterly. In contrast to releases of Perl, maintenance releases will contain fixes for issues discovered after the .0 release, but will not include new features or behavior.

    Notable changes in Perl 5.12 include:

    • Perl now conforms much more closely to the Unicode standard. Additionally, this release includes an upgrade to version 5.2 of the standard.

    • New experimental APIs allow developers to extend Perl with "pluggable" keywords and syntax.

    • Perl now has a better sense of time and will be able to keep accurate time well past the "Y2038" barrier.

    • New syntax allows developers to specify package version numbers directly in "package" statements

    • Perl now warns the user about the use of deprecated features by default.

    Perl 5.12.0 features numerous new features, optimizations and bugfixes. You can find a complete list of these changes on the web at:

    http://search.cpan.org/~jesse/perl-5.12.0/pod/perl5120delta.pod

    As specified in the licenses for Perl (see the files named Artistic or Copying in the Perl distribution), THIS PACKAGE IS PROVIDED WITH ABSOLUTELY NO WARRANTY.

    Based on extensive testing over the past 3 months, we believe that Perl 5.12.0 is ready for production deployments. However, you should never blindly trust any software vendor. It is imperative that you test new software before deploying it in production.

    While we have worked tirelessly to ensure that Perl 5.12.0 will be a solid platform for your software, it's possible that issues will be found after release day. You can find a current list of known issues with Perl 5.12.0 at http://dev.perl.org/perl5/errata.html

    Perl continues to flourish into its third decade thanks to a vibrant community of users and developers. The following people are known to have contributed the improvements that became Perl 5.12.0:

    Aaron Crane, Abe Timmerman, Abhijit Menon-Sen, Abigail, Adam Russell, Adriano Ferreira, Ævar Arnfjörð Bjarmason, Alan Grover, Alexandr Ciornii, Alex Davies, Alex Vandiver, Andreas Koenig, Andrei Yelistratov, Andrew Rodland, Andy Armstrong, Andy Dougherty, Jose Auguste-Etienne, Benjamin Smith, Ben Morrow, bharanee rathna, Bo Borgerson, Bo Lindbergh, Brad Gilbert, Bram, Brendan O'Dea, brian d foy, Charles Bailey, Chip Salzenberg, Chris 'BinGOs' Williams, Christoph Lamprecht, Chris Williams, chromatic, Claes Jakobsson, Craig A. Berry, Dan Dascalescu, Daniel Frederick Crisman, Daniel M. Quinlan, Dan Jacobson, Dan Kogai, Dave Rolsky, David Cantrell, David Dick, David Golden, David Mitchell, David M. Syzdek, David Nicol, David Wheeler, Dennis Kaarsemaker, Dintelmann, Peter, Dominic Dunlop, Dr.Ruud, Duke Leto, Enrico Sorcinelli, Eric Brine, Father Chrysostomos, Florian Ragwitz, Frank Wiegand, Gabor Szabo, Gene Sullivan, Geoffrey T. Dairiki, George Greer, Gerard Goossen, Gisle Aas, Goro Fuji, Graham Barr, Green, Paul, Hans Dieter Pearcey, Harmen, H. Merijn Brand, Hugo van der Sanden, Ian Goodacre, Igor Sutton, Ingo Weinhold, James Bence, James Mastros, Jan Dubois, Jari Aalto, Jarkko Hietaniemi, Jay Hannah, Jerry Hedden, Jesse Vincent, Jim Cromie, Jody Belka, John Malmberg, John Peacock, John P. Linderman, John Wright, Josh ben Jore, Jos I. Boumans, Karl Williamson, Kenichi Ishigaki, Ken Williams, Kevin Brintnall, Kevin Ryde, Kurt Starsinic, Leon Brocard, Lubomir Rintel, Luke Ross, Marcel Grünauer, Marcus Holland-Moritz, Mark Jason Dominus, Marko Asplund, Martin Hasch, Mashrab Kuvatov, Matt Kraai, Matt S Trout, Max Maischein, Michael Breen, Michael Cartmell, Michael G Schwern, Michael Witten, Mike Giroux, Milosz Tanski, Moritz Lenz, Nicholas Clark, Nick Cleaton, Niko Tyni, Offer Kaye, Osvaldo Villalon, Paul Fenwick, Paul Gaborit, Paul Green, Paul Johnson, Paul Marquess, Philip Hazel, Philippe Bruhat, Rafael Garcia-Suarez, Rainer Tammer, Rajesh Mandalemula, Reini Urban, Renée Bäcker, Ricardo Signes, Richard Foley, Rich Rauenzahn, Rick Delaney, Risto Kankkunen, Robert May, Roberto C. Sanchez, Robin Barker, Tomoyuki Sadahiro, Salvador Ortiz Garcia, Sam Vilain, Scott Lanning, Sébastien Aperghis-Tramoni, Sérgio Durigan Júnior, Shlomi Fish, Simon Schubert, Sisyphus, Slaven Rezic, Smylers, Steffen Müller, Steffen Ullrich, Stepan Kasal, Steve Hay, Steven Schubiger, Steve Peters, Tels, The Doctor, Tim Bunce, Tim Jenness, Todd Rinaldo, Tom Christiansen, Tom Hukins, Tom Wyant, Tony Cook, Torsten Schoenfeld, Tye McQueen, Vadim Konovalov, Vincent Pit, Hio Yamashina, Yasuhiro Matsumoto, Yitzchak Scott-Thoennes, Yuval Kogman, Yves Orton, Zefram and Zsban Ambrus.

    This list is woefully incomplete as it's automatically generated from version control history. In particular, it doesn't include the names of the (very much appreciated) contributors who reported issues in previous versions of Perl that helped make Perl 5.12.0 better. For a more complete list of all of Perl's historical contributors, please see the AUTHORS file in the Perl 5.12.0 distribution.

    Best,

    Jesse Vincent

  • What are you working on in Perl?

    My project list is a mile long, and I'm wondering what you're working on, too. Here's mine, in no order: * Internals of [Parrot](http://parrot.org/), trying to get the underlying C API handle to handle const STRING *. * Putting out [tidyp](http://tidyp.com/), my fork of libtidy, and HTML::Tidy which will rely on it. * Thinking about the plug-in API for [ack](http://betterthangrep.com/) 2.0. * Wanting to get more grep-like programs listed on [betterthangrep.com](http://betterthangrep.com/). * Gathering together info on Plack and PSGI for an article here * Getting [perl101.org](http://perl101.org/) to list both Perl 5 and Perl 6 syntax for how to do things. * Make an install mechanism for [vim-perl](http://github.com/petdance/vim-perl) so people don't have to wait for Bram to release a version of vim to get the updates. * Work on [Perl::Critic](http://perlcritic.org/) policies for [check_postgres.pl](http://github.com/bucardo/check_postgres). * Clean out the WWW::Mechanize bug queue, especially making the live tests not run by default. * Work on a talk on Perl 5.10 and 5.12 for [Chicago Uniforum](http://uniforumchicago.org/) in June. * Add more languages and more philosophy to [bobby-tables.com](http://bobby-tables.com). * Decide if I want to keep Perlbuzz in Movable Type and upgrade to the next version, or migrate to the Melody fork. What's on your plate? Tell us in the comments.
  • White House releases open source code

    I'm so happy that the [White House has fed back to the open source community](http://www.whitehouse.gov/tech) and, more importantly, advertised that fact. Remember how fifteen or twenty years ago you'd see mentions of the Internet in popular culture and think "This is really picking up"? That's how this announcement makes me feel.