TIL in this Month's Perl 6 Bug SQUASHathon

Read this article on zakame.net/blog

A bit overdue post, but I attended this months's Perl 6 Community Bug Squashathon last weekend and it was fun! I had a great time learning some more Perl 6 while making contributions at the same time. Definitely looking forward to next month's!

Here are a few little bits of Things I've Learned...

Resolving conflicts of interests (CP part III)

After explaining the kinds of prototypes that are used in complete Programming and the way code moves between them, it is time the explain the other motivation behind this concepts, before we see the big picture (project planning) next time.

Enlightened Perl Organisation sponsors Strawberry Perl

I am pleased to announce that Enlightened Perl Organisation (EPO) has kindly extended the support of Strawberry Perl project by sponsoring our build server for another 12 months. I would like to thank Mark Keating for arranging the funding.

If you are also considering supporting Strawberry Perl project you can do it indirectly by becoming EPO member or via donating EPO.


https://metacpan.org/pod/Data::Edit::Xml provides a Perl centric means of editing data held in Xml format. Thus: my $a = Data::Edit::Xml::new(" "); say STDERR -p $a; gives: To cut out c under b but not under d : $a x= sub {--$_ if $_ <= [qw(c b a)]}; say STDERR -p $a; gives:

Perl 5 Porters Mailing List Summary: August 29th - September 4th

Hey everyone,

Following is the p5p (Perl 5 Porters) mailing list summary for the past week.


Barcelona Perl Mongers Meetup!

I had the honor to give a talk at Barcelona.pm Meetup. Perl community rocks as everybody knows; my new friends welcomed me and my family. We felt home, learned new things, enjoyed the nice dinner and it became the most memorable night in Barcelona.

I can't wait to visit Barcelona Perl Workshop.

Slides will be posted once I clean them up.


SPVM Language Specification. I start to write it Today.

I start to write SPVM Language Specification.

SPVM Language Specification(Beta before 1.0)

SPVM array operation is 6x faster than Perl 5.26 now. If JIT is implemented, array operation maybe 20x faster than Perl 5.26. This is planed in one year.

SPVM provide you,

-You can write Fast culculation without XS
-You can bind C library without XS
-You can write C language inline without Inline::C

XS is very complex and difficult. SPVM improve usability of C binding and inline significantly.

SPVM communicate with Perl. You can call SPVM subroutine from Perl. SPVM is not single lauguage. You can call SPVM subroutine from Perl very easy.

Rakudo.js update - passes 56%+ of roast tests

Rakudo.js now passes roughly of 56%+ roast test files.
I'm currently working on fixing up the remaining ones.
Getting some of them to work is requiring fairly deep changes.
For example native values need to be passed specially and maybe boxed in the called sub/method rather than boxed on the side of the callers. As that causes wide spread changes it can cause some rather annoying debugging when something is not exactly right and compiling the setting explodes :)
I had a talk at TPC::EU (link to slides).
As part of an electron+react demo for the talk I started working on a JSX slang for Perl 6 (https://github.com/pmurias/p6-jsx/blob/master/01-basic.t).
BTW. slangs already work on rakudo.js :)
In other news the --source-map option in rakudo.js and nqp.js now puts in line and file numbers in our backtraces.

prototypes vs branches (CP part II)

As previously mentioned, one principle of Complete Programming is the separation of concerns you normally handle simultaneously. In part two I discuss some further consequences of that and how we use version control in CP.

"inf" doesn't work everywhere, apparently

I've just got this CPAN Testers report which says that my module Compress::Huffman had an error due to $minkey not being set to any value on line 176. Tracing this back, it seems to be due to the use of the word 'inf' on line 166, then this being not converted to infinity but to zero for some reason, and $minkey never getting set.

I don't remember where I got the idea to use 'inf' for infinity, but I'm switching over to the method given here of using 9**9**9 instead.

Incidentally, for those interested in the Huffman algorithm, $minkey here is the least probable key, and its probability is $min, which is set to the value of infinity at the start so that every key will have a lower value than it.

the core idea behind Complete Programming (tm)(c)

During my last post I mentioned the method of Complete Programming, which started as my knee jerk reaction to the insanities of waterfall and XP. I'm not really big on manifestos but writing down things helps to think clearly and so you might also benefit from thinking about one important principle in CP.

Perl6 - NativeCall, using the native trait correctly

I saw a lot of confusion with what should be passed to the native trait when working on binding a C function from a library using NativeCall.

One important thing to remember is Perl 6 trait are solved at compile time. This is important because every value passed to a trait take their compile time value.

use NativeCall;
my $foo = "a";
sub foo is native($foo) {*}

This will fail to compile since native does not take Any has a valid type. Even if $foo can be checked as being a Str, its compile time type is Any. Easy to check with a BEGIN block.

<Skarsnik> m: use NativeCall; my $foo = "a"; say $foo.^name
<evalable6> Skarsnik, rakudo-moar 79604a880: OUTPUT: «Str»
<Skarsnik> m: use NativeCall; my $foo = "a"; BEGIN {say $foo.^name};
<evalable6> Skarsnik, rakudo-moar 79604a880: OUTPUT: «Any»

It's actually explained in NativeCall documentation

On Troll Hugging, Hole Digging, and Improving Open Source Communities

Read this article on Rakudo.Party

While observing a recent split in a large open source community, I did some self-reflection and thought about the state of the Rakudo community that I am a part of. It involved learning of its huggable past; thinking of its undulating present; as well as looking for its brighter future.

This article is the outcome. It contains notes to myself on how to be a better human, but I hope they'll have wider appeal and can improve communities I am a part of.

Part I: Digging a Hole

A lot of organizational metaphors involve the act of climbing. You start at the base of a hill or a ladder and you start climbing. The higher you get, the more knowledge, power, and resources you attain. There's a problem with that metaphor: you're facing the backs of the people who came before you and they're not really paying attention to you.

C comments and regular expressions

C comments and regular expressions

The C programming language has two kinds of comments, ones with a start and end marker of the form /* comment */, and another one which starts off with two slashes, //, and goes to the end of the line, like Perl comments. The /* */ kind are the original kind, and the // kind were borrowed from C++.[1]

Let's suppose you need to match the original kind of C comments. A simple regex might look something like this:


Here we've escaped the asterisks in the comment with a backslash, \, and used exclamation marks, !, to demark the start and end of the regex, so that we don't have to escape / with a backslash.

However, C comments have the feature that they can extend over multiple lines:


which means that the above regex doesn't work. The problem is that the dot, ., doesn't match new lines. If we add the s flag to the end of the regex, the match succeeds:


The s flag alters . so that it matches newlines.

Check compression in web page

This module offers a way to check your web pages for correct gzip compression. It not only checks that your web page is compressed properly when required, but also checks that the web page is not accidentally compressed when not required, and that the compression actually does something useful in terms of reducing the page size. I wrote it because I couldn't find anything to do that on CPAN.

It's compatible with Test::More if you want to run the compression checks automatically.

Picking a better Markdown library for bad input

I was handling some bad Markdown input using Text::Markdown, when I saw it generate broken HTML.

I started with (bad) Markdown input " 1. z\n >" and got back HTML <p><ol>\n<li>z</p>\n\n<blockquote>\n <p></li>\n </ol></p>\n</blockquote>.

(See the incorrectly nested HTML tags, <p><ol><li></p>?)

So I tried feeding this bad Markdown to four different Perl Markdown libraries: Text::Markdown, Text::MultiMarkdown, Text::Markdown::Discount, and Markdent, to see which one would give me valid HTML.

The results?

  • Text::Markdown — invalid HTML <p><ol>\n<li>z</p>\n\n<blockquote>\n <p></li>\n </ol></p>\n</blockquote>\n

  • Text::MultiMarkdown — invalid HTML <p><ol>\n<li>z</p>\n\n<blockquote>\n <p></li>\n </ol></p>\n</blockquote>\n

  • Text::Markdown::Discount — valid HTML! <ol>\n<li> z\n\n<blockquote></blockquote></li>\n</ol>\n\n

  • Markdent — valid HTML, but doesn't generate a simple HTML fragment <!DOCTYPE html>\n<html><head><title></title></head><body><ol><li>z\n &gt;\n</li></ol></body></html>

The solution? Switch from Text::Markdown to Text::Markdown::Discount.

How to pass arguments for Mojolicious filter

Sometimes we are required to check incoming IDs not only for format, but also for existence in DB.

But different IDs we should check through different models.

This pull request tries to add this functionality. If it will be appiled you can do next:

$v->required( 'invoice_id', [ data_exists => 'Invoice' ] );
$v->required( 'order_id', [data_exists => 'Order' ] );

And the fileter:

$v->add_filter( data_exists => sub { data_exists( $app, @_ ) } );

sub data_exists {
    my( $app, $v, $name, $value, $model ) =  @_;

    my $obj =  $app->rows( $model )->find( $value )
       or return ();

    return $obj;

If you want your model do advanced decision about its data accessible or not you may pass current context:

$v->required( 'invoice_id', [ data_exists => $c, 'Invoice' ] );

The filter:

sub data_exists {
    my( $v, $name, $value, $c, $model ) =  @_;

    my $obj =  $c->rows( $model )->find( $value )
       or return ();

    return $obj;

And somewhere in the model:

sub rows {
    my( $c, $table_name ) = @_;
    $c->db->relation_ship( $table_name )->search({ user_id => $c->uid });

So after validation you are guarantied to have objects which are allowed to access only for current user.

And there is no way to access other objects the user do not own

Perl 5 Porters Mailing List Summary: August 22nd-28th

Hey everyone,

Following is the p5p (Perl 5 Porters) mailing list summary for the past week.


Swiss Perl Workshop 2017 - Videos

We have uploaded videos from this year's workshop to YouTube: Swiss Perl Workshop on YouTube.

Note that we didn't record all talks as some were given at TPC and will be of much better quality from them. Also we didn't record the workshops, nor the lightning talks. Still, we have some exclusive content, so have a look.

You're invited: Community Bug SQUASHathon

Rakudo and other repositories in perl6 GitHub org have plenty of open bug tickets. We decided it would be neat to give them an extra push with concentrated effort, which is why we'd like to organize a monthly, 1-day virtual event where we pick a repository and everyone works on open tickets in that repository.

The day will be first Saturday of every month. This month we'll be hacking on the Issues of github.com/perl6/doc repository.

Whether you're a seasoned Rakudo developer or just starting out, join us this Saturday in #perl6 on irc.freenode.net chat channel (no specific time) and contribute! If you'd like to simply hang out, you're welcome too, we love company!

See also: our SQUASHathon Wiki or talk to a human about this.

About blogs.perl.org

blogs.perl.org is a common blogging platform for the Perl community. Written in Perl and offering the modern features you’ve come to expect in blog platforms, the site is hosted by Dave Cross and Aaron Crane, with a design donated by Six Apart, Ltd.