Playing games with outthentic dsl

Playing games with outthentic dsl

Outthentic - is language to parse unstructured text. It was grown as supporter for web application test tool named swat. Web application is where text often comes in unstructured and unordered way, even though there is json and xml, there are a lot of applications when it is not the case.

Then a generic test tool named outthentic was created as solution for any text parsing/testing tasks. This tool is based on outthentic dsl as well.

Creation a new consumers of outthentic language is way too easy, with API exposed and explained at outthentic documentation.

What I try to do in this short post is to highlight some randomly picked features to let readers to have a sense what is outthentic way to analyze and verify text output, which of course could be used wide in daily testing tasks.

If ( after reading this post ) you feel like to know more - an official outthentic documentation is here and ( less formal ) - here

Ranges

It's CPAN Day 2016-0.5!

It's halfway to CPAN Day 2016, so I'm going to be celebrating it as a mini-CPAN Day and using it as an opportunity to get some small releases out that otherwise might not justify a release on their own, like updating the distribution tooling or making documentation tweaks.

Come join me in celebrating CPAN Day 2016-0.5!

Perl 5 Porters Mailing List Summary: February 8th-14th

Hey everyone,

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

Perl 5 Optimizing Compiler, Part 18: RPerl v1.6 Released, Happy Valentine's Day!

Greetings Fellow Perlites,

For St. Valentine's Day, we have released RPerl v1.6, with support for a number of new features:

- Two Dimensional Arrays
- Logical Ops
- Uncompile Mode
- Mandelbrot app via MathPerl

As always, the latest official release may be found on CPAN:

https://metacpan.org/release/RPerl

Thanks to our first grant from The Perl Foundation, we have released the first partial draft of the new book Learning RPerl, available on either CPAN or directly on the RPerl website:

http://rperl.org/learning_rperl.html

NOW A CALL TO ACTION!

Please take a moment to click the following link and leave a comment, this counts as your vote for RPerl to receive the next round of funding from The Perl Foundation:

http://news.perlfoundation.org/2016/02/grant-proposal-rperl-user-docu-1.html

The deadline is only 2 days from now, Weds Feb 17, thanks so much for your support!

Perling,
~ Will the Chill

Apropos proto: Perl6.c multi thoughts

Multi routines are pretty neat, but seem incomplete to me. Some background- one can compute factorials this way:
multi fac(0) { 1 }
multi fac(Int $n where 1..Inf) { $n * fac( $n-1 ) }
say fac(4); # 24

Now what if we want to pass our recursive-multi-sub "fac" as a callback?

given &fac -> $some_fun { say "some_fun(4)=",$some_fun(4) }

Now... what about defining an anonymous multi-sub?

Test your Git wrapper against 500 versions of Git

Ever since I wrote Git::Repository, I've paid attention to supporting as many Git versions as possible.

This is possible because it is a really thin wrapper around Git, that expects only a few sub-commands to exist. Therefore the burden of making sure the Git they're using supports all the features they need is put on the user (the various version comparison methods are meant help working that out).

From Regular Expressions to Grammars (in Perl 6) Part II

Part 2 of my Regular Expressions to Grammars tutorial is now up at The Perl Fisher. The previous part covered the basic metacharacters, this fills out the set and demonstrates how to use regular expressions inside Perl 6 code.

Perl6 module namespace

I'm going to talk about that which I know very little, but looking at the Perl6 Module Directory, I see a namespace that's already storing up pain. Why are there so many modules in the top level namespace that make no sense for a language that has designs on world domination? I can believe that in the early days of development there's an intoxicating freedom to give your module a snappy name, but didn't we learn these lessons 20 years ago? What happened to Noun::Adjective::Adjective as the guiding principle?

If you're determined to re-invent the wheel, at least try to invent a better one. - Camel Book, 2nd ed. p277. footnote on False Impatience.

Simplest way of serving local files over HTTP?

I've always admired Python's way of serving local files by simply doing:

$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

And I've been wondering if there's a way to achieve the same in Perl without requiring lots of dependencies from CPAN. This morning I just came out with this:

$ perl -Mojo -E 'a->static->paths(["."]);a->start' daemon
Server available at http://127.0.0.1:3000

It shows the file content, though it doesn't show the directory listing.

Is there any simpler way?

Text, Grammar, Tree- the 3

I think of text, grammars that parse the text, and the syntax trees (data) generated by a parser as a triangle. Most of the time in computerland, people doing something with this triangle are interested in converting a text into a tree using a parser.

Every once in a while I need to write a parser. My first serious parser was in the late 90's, for a radio station that needed each week to convert a large plain-text weekly email to tables of venues and shows. For that, I used a version of Bison (yacc) that allowed me to write actions in Perl.

These days, I'm excited to get my hands dirty in Perl6 grammars. Writing a correct parser is never easy, so a clean, well-thought-out "featureful" parser language means less effort spent on fighting the tool, more on attacking the problem.

Drones at MadMongers

Tonight we’re meeting at The Bodgery where Timm will show us all the crazy cool stuff he’s been doing with Perl and Quadcopters.

[From my blog.]

Announcing the Perl QA Hackathon 2016

We're happy to announce that the 9th annual Perl QA Hackathon (QAH) will be held in Rugby in the United Kingdom. The event will run from Thursday 21st April to Sunday 24th April.

The QAH is a face-to-face gathering of the lead developers who work on the Perl toolchain that all Perl programmers rely on and build upon. The first QAH was held in Norway, in 2008, and so far it's always been in Europe. The QAH provides dedicated time over 4 days to work on the critical systems and tools, with all the right people in the same place.

Perl 5 Porters Mailing List Summary: February 2nd-7th

Hey everyone,

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

Feb. Sydney PM Next Week

Broadbean have offered to host us next month, thanks be to Peter H for setting the wheels in motion once again.

What: Sydney PM
Date: Tuesday, 16th Feb 2016
Time: 6-9:30pm
Where: Broadbean, Suite 8.03, 9 Hunter Street, Sydney

Lloyd speaking on Perl 6, John will speak about Perl and its natural-language features.

People, please join us via:

Facebook

Meetup.com

Memory savings with -fcow

B::C has now better support for copy-on-write (COW) strings with about 6% memory savings for 5.20 and 5.22.

The perl5.18 implementation for COW strings is totally broken as it uses the COW REFCNT field within the string. You cannot ever come to a true successful copy-on-write COW scheme. You cannot put the string into the .rodata segment as with static const char* pv = "foo"; it needs to be outlined as static char* pv = "foo\000\001";. The byte behind the NUL delimiter is used as REFCNT byte, which prohibits its use in multi-threading or embedded scenarios. In cperl I'm was working on moving this counter to an extra field, but the 2 authors made it impossible to write it in a maintainable way. I could easily seperate the refcnt flag but I couldn't make it COW yet.

IO::Glob for Perl 6

This is a module I wrote a while back, but I never announced. I am pretty happy with how this came out, so here's the announcement. Some JAPHs might be disappointed to learn that one feature of Perl 5 that did not make it to 6 is globbing. That is, doing something like this:

for my $file (glob "src/core/*.pm") { say $file }

With just Perl 6, you need to do something like this instead:

for "src/core".IO.dir(:test(/ .* ".pm" $/)) -> $file { say ~$file }

That's not too terrible, but I still miss the simplicity of globs. In that case, I can use IO::Glob:

use IO::Glob;
for glob("src/core/*.pm") -> $file { say ~$file }

That does the same thing as the Perl 5 code, more or less.

But, that's not all. I always wished that globs could be used for pattern matching. Sometimes, just matching a string against a glob is handy, but Perl 5's globs are narrow minded. IO::Glob is not:

use IO::Glob;
for <abc acc acdc>.grep(glob('ac*')) { .say }

Part 1 of a tutorial on Perl 6 Regular Expressions and Grammars

On my blog at The Perl Fisher - Part II coming next week, or whenever I get vectors and lists working in Inline::Scheme::Guile.

Last call for review of Test-Builder using Test2 (Formerly Test-Stream).

On October 29th, 2015, I released Test-Stream as stable. I did this because I felt it was ready, and because I was no longer receiving any feedback from perl-qa asking me to change things. Since that release, the feedback picked up substantially. It seems that declaring something done is the best way to find out ways in which it is not actually done.

Here are the big things people wanted:

  • Split the dist into multiple dists, making the internals and tools separate.
  • Abandon the loader system (use Test::Stream -/:/etc)
  • Loosen the tight coupling of Test::Steam to TAP
  • Make context() less magic (don’t use INTERNALS::SvREFCNT)
  • Use less import() magic
  • Better namespace structuring
  • Changes to how SKIP and TODO are implemented

We decided that the best way forward was to forget about compatibility with Test-Stream, which is still new enough that it is not seeing much use, and make a new name with everyone’s changes. That’s Test2.

After the split there are 3 distributions:

CPAN Weekly: one module per week, in your inbox

CPAN Weekly is a mailing list for Perl 5 programmers. Each week there will be one short message sent to the list, with a brief description of a CPAN module, and example usage.

The idea is not to provide a tutorial, but just to make you aware of the module, and show one basic use case. By planting seeds in your mental Perl toolbox, hopefully next time you have certain needs you will think "oh, I read about a module for that!", rather than "I'll just write a module for that".

You can sign up at cpan-weekly.org.

Stupid state trick

Occasionally I find myself writing a Perl subroutine that uses a module that no other part of the code needs. This subroutine may be called multiple times, or not at all. At some point I wondered if putting some logic around the require statement would be faster than just calling it every time. require() is idempotent, after all. You could do something like $counter++ or require Foo;, but the variable has to live somewhere outside the subroutine. Not neat.

It occurred to me that, given Perl 5.10 or greater, something like state $dummy = require Foo; might do the trick. I would be willing to bet this is a use of state that was not anticipated when it was designed. But does it actually do what I want, and is what I want worth doing?

The answer to the first question is "yes." A quick script with require overridden proved that the module was in fact loaded, and that require was called only once no matter how many times it was executed.

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.