Refactoring Perl code

Gabor Szabo will be giving a talk at YAPC::NA 2012 described as:

Code refactoring is “disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior”. It is needed to ensure your code remains readable while growing in size and scope.

It is needed if you have some old code base that needs improvement and after every period of intense development when you “did not have the time to properly design your code”.

There are several patterns in refactoring, some of them you might already practice without knowing the name.

The most obvious is when you use a variable $x and suddenly you realize it could have a more descriptive name.

If you change all the occurances of $x to this better name, without changing anything else in the code, that’s already refactoring.

We will see several patterns for refactoring Perl code. We see examples doing them manually and we’ll try to automate them as well.

[From the YAPC::NA Blog.]

s/ZeroMQ.pm/ZMQ.pm/g

So I've been doing this and that with ZeroMQ.pm, the Perl binding to http://zero.mq, and a little while ago there was a request from the zmq community to align all the language binding names as "*zmq".

Well, since libzmq 3.1.x has many API incompatibilities, I thought it's a good timing for a rename. So there: topic/libzmq3 branch is now libzmq 3.1.x compatible, and the module namespace is now ZMQ instead of ZeroMQ.

I must say I haven't tested this code much, so if you're interested, please take it for a test, and file issues and/or send me pullreqs on github!

Perl is more viable for web development than ever!

Today on StackOverflow, an old thread popped up that prompted me to answer. That answer became a slightly longer compendium of recent developments in Perl and Perl-for-web.

I will copy the text here, but I am asking you to vote it up so that it will show for future viewers. So that I will not be getting undue points, I have made it community wiki (also means you can amend if you want).

Vote here: http://stackoverflow.com/a/8828209/468327

== Post Content ==

This is an old question, but I thought I should update the readers. I am happy to report that in my opinion Perl is more viable for web development than ever! Along with old friends Catalyst and (recently revamped) Mason, there are some great new entries Mojolicious (or visit mojolicio.us) and Dancer. I’m sure there are others too.

Perhaps the biggest improvement is PSGI/Plack (or visit http://plackperl.org/).

MetaCPAN Logo

very often, when I see a logo drawn by somebody else, I highly appreciate his or her work. Many logos are simple but very easy to remember and recognize. Graphics is not my business. Maybe I just made more than 1000 graphical mistakes. However, my father-in-law when he was some 80 years old always used to say 'I am young and still can learn'. Here is my first graphical try (click to enlarge):

wolfgang_kinkeldei_de-metacpan-16-120111.png

Improved version:

meta_cpan_kerned.png

I hope it is not too bad. Otherwise I will have to wait until I reach a reasonable age :-)

Introduction to writing Perl Documentation

Mark A. Stratman will give a talk at YAPC::NA 2012 described as:

This talk will help get you in the mindset necessary to write effective documentation.

We will briefly touch on POD (Plain Old Documentation) syntax, but due to its elegant simplicity we can quickly move on to examine the bigger picture, and explore the decisions we face when writing documentation.

Some key points will include:

- Conventions and expectations

- APIs, Tutorials, Manuals, and Cookbooks… and how and when to use them.

- Writing POD to take full advantage of formatters (e.g. Pod::LaTeX, Pod::HTML)

- Inviting community contributions

[From the YAPC::NA Blog.]

The Case of the Overloaded Curlys

When I entered our rooms in Paris after a day on the boulevards, I found C. Auguste Dupin at his desk contemplating a scrap of paper. "A problem?" I asked.

"A death. And a rather gruesome one, n'est-ce pas?" he replied, handing me the paper. On it I saw:

$ perl -e '%h = map { "-$_" => 1 } qw{ foo bar };'
Not enough arguments for map at -e line 1, near "} qw{ foo bar }"
syntax error at -e line 1, near "} qw{ foo bar }"
Execution of -e aborted due to compilation errors.

Well, a map takes either a block or an expression followed by a comma, and either must be followed by a list. The block was there, and so was the list. Clearly a neophite had been playing with bleadperl, and paid the price. With a rueful shake of my head, I silently passed the paper back to the detective.

"No, this was a production release of Perl, mon ami."

"But how --" I expostulated.

CPAN and undef versions (again)

Some time ago I complained that some modules that had a version ended doing it. The problem? I use a lot the 'r' command in the CPAN client to check for outdated modules. Now, I get a lot of failures that are not really failures:

Package namespace         installed    latest  in CPAN file
HTML::Mason::Apache::Request     undef         0  DROLSKY/HTML-Mason-1.47.tar.gz
JSON::PP::Boolean             undef   2.27200  MAKAMAKA/JSON-PP-2.27200.tar.gz
JSON::XS::Boolean             undef      2.32  MLEHMANN/JSON-XS-2.32.tar.gz
JSON::backportPP::Boolean     undef   2.27200  MAKAMAKA/JSON-2.53.tar.gz
Net::Stomp::Frame             undef         0  JTANG/Net-Stomp-0.44.tar.gz
SVN::Core                        ..    1.6.12  MSCHWERN/Alien-SVN-v1.6.12.1.tar.
Text::MicroTemplate::EncodedString     undef      0.18  KAZUHO/Text-MicroTemplate-0.18.tar.gz
So, what are my versions for these modules?

App::TimeTracker 2.016

Read more about App::TimeTracker 2.016 and how Test::MockTime can help you testing stuff that depends on time (an inherent fluid "thing" that's rather annoying test) in the latest App::TimeTracker blog post

HTML forms with FormHandler

Gerda Shank will give a talk at YAPC::NA 2012 described as:

Using FormHandler forms from basic to complex. Organizing your form library. Different rendering options; rendering themes; rendering for Twitter Boostrap and similar frameworks. Automatic database integration; handling your own database updates. Customizing form behavior. Testing forms.

[From the YAPC::NA Blog.]

Exploit Git Hub tags!

If you put your Perl code on Git Hub, I'd like to encourage you to use a a feature that isn't (at all) intuitive: tags.

Basic tags in git are a human friendly label that point to a certain commit. Basic tags don't have a git object associated with them so they're mostly for use on your local repository.

It is also possible to create "annotated tags" which are first class git objects and point to a specific commit (as the top of a tree of commits.) Because annotated git tags are first class objects, it is possible to share them across repositories. It is these tags that I would encourage you to make if you use Git Hub.

Working on GraphViz2::Marpa

Hi Folks

I've started work on GraphViz2::Marpa, which will use Marpa::XS to parse GraphViz-style 'dot' files.

This is mainly to exercise my Marpa skills. However, I'm hopeful the result might/will lead to an on-line editor for dot files, with 2 panels, a dot editor in one and a result of the server rendering the output from dot (or whatever) in the other, all in Perl. We'll see.

More Marpa Madness

For the past year or so, I've been following the posts on Marpa with interest, but I never got around to writing anything with it, because honestly, the docs seemed a little bit opaque and incomplete to me.

Then, the other day, I saw Jeffrey's post about lexing with Marpa and I took it as a challenge. You see, I've never written a lexer. I've written grammars using "lexer-free" parser builders like Parse::RecDescent and [Regexp::Grammars](https://metacpan.org/module/Regexp::Grammars], and hand-written recursive-descent parsers with the help of Parser::MGC, but when it came to writing anything that required a lexer, I was paralyzed. It seemed to me that lexing was frequently ambiguous, and dealing with that ambiguity was a black art that I couldn't understand.

The Essential Perl Hacker's Toolkit

Stephen Scaffidi will give a talk at YAPC::NA 2012 described as:

CPAN Testers Summary - December 2011 - Blood on the Tracks

Happy New Year to all. Last year had its ups and downs, so here's hoping that 2012 sees a much more settled year :)

2011 ended on a rather sour note, with our previous hosting company, Hetzner, causing us no small amount of stress and infuriation last year. I could recount all the problems, but suffice to say I would never recommend them to anyone ever again.

Stepping Up


This week I became co-maintainer of a second module: Test::File.  I now have the privelege of being co-maintainer on modules by two of our most prolific Perl authors (i.e. schwern and brian d foy).  And, as you may have gathered from my blogs thus far, I’m certainly no one special.  What did I do to receive such honors?

Nothing, really.

Mojolicious workshop in Hamburg

The Hamburg perlmongers will be doing a Mojolicious workshop in Hamburg on Sathurday, 28th of January, 10:00 am.

No prior knowledge is necessary, Marcos Rebelo will give an introduction. And later we will hack in small groups on concrete projects.

Booking is now a YAPC::NA 2012 sponsor!  Booking.com is...



Booking is now a YAPC::NA 2012 sponsor! 

Booking.com is part of Priceline.com and is World’s #1 Online Hotel Reservations Company, offering over 200,000 hotels worldwide.

Due to the growth of our IT department we are now hiring Perl devs!

We use Perl, Apache, mod_perl, MySQL, Memcache, Mason, JavaScript, Git, Linux & more!

Our software development basis is SCRUM.

If you want to work in an international, result driven, fun & dynamic environment, join our team in Amsterdam, the Netherlands!

[From the YAPC::NA Blog.]

I love CPAN Testers!

What other language comes with a service like CPAN Testers?

I recently uploaded version 0.02 of Module::UseFrom and little did I know, but it had an odd bug. As hopefully you all know by now, since Perl 5.14 many functions that take hashes or arrays as arguments can now take references as well. This often makes for cleaner code, but I don’t use it (intentionally) on CPAN modules so that they are backwards compatible. However when you write keys $export but meant to write keys %$export and it works you never notice, the tests all pass for me. Release.

On most languages many users would attempt to install and would fail before a few would file bug reports. With CPAN testers however, an army of dedicated volunteers are out there keeping my back. So thanks guys! Bug caught, face saved, everyone wins.

Thank you CPAN Testers!!

I need your help with Perl and the Internet of Things at YAPC::NA


Physical Computing, Internet of Things it does not really matter what you call it. We are talking about controlling things. Maybe you just want a text message when your doorbell rings or maybe you want to print in 3D straight from Perl using a Makerbot. Maybe you just want more control over your Christmas lights, CheerLights. Maybe there are dirty words you want your TV to just mute.

Arduino, PWM, servo motors, stepper motors, wii controllers, the list goes on and on. Have you ever wondered what it all means and how to connect them all?

Many of you know I am working on getting the Perl community interested in the Internet of Things and in getting CPAN stuffed full of Internet of Things code. To do that I need more people interested and enable to hack in the Internet of Things space.

I know we can make Perl a choice language for scripting the physical world together.

Skipping Test::Class tests in abstract base classes

With the latest release of Test::Class::Most, I added the is_abstract feature. With this, you can declare a test class like this:

package TestsFor::TV::Episode::Broadcast;
use Test::Class::Most
  parent      => 'TestsFor::TV::Episode',
  is_abstract => 1;

is_abstract is a non-inherited property of a test class which says "I'm abstract" (no surprise there) and you can check it with:

Test::Class::Most->is_abstract($some_test_class);

The reason for that is simple. Imagine you have a TV::Episode class, but it's an abstract base class which should never be instantiated. You actually have a TV::Episode::Broadcast and TV::Episode::OnDemand classes which are the concrete implementations. You can make tests work in your test classes very cleanly with this.

About blogs.perl.org

blogs.perl.org is a common blogging platform for the Perl community. Written in Perl with a graphic design donated by Six Apart, Ltd.