perl6 port of HTTP::Tinyish

HTTP::Tinyish (https://github.com/miyagawa/HTTP-Tinyish) is a perl5 http client wrappers, which is "embeddable" or "fatpackable", written by miyagawa san.

I ported it to perl6 (only curl backend). github.com

It passed a basic test, and I think it may be useful some situation.

But there is a problem! Perl6 @*INC does not allow code refs or objects, so we cannot create App::FatPacker!

Let's make CompUnitRepo more hackable!

perl6のminimal authoring toolを作った

github.com

perl6を知るにはとにかくモジュールを書いてみることで、それには簡単なやつでいいのでauthoring toolがあったほうがいいので作った。1ヶ月後には全く違ったperl6が書けるようになっていることを祈る。

使い方

new, build, test コマンドがあり minil と同じ感覚で使える(はず。)

> mi6 new Foo::Bar

> find Foo-Bar -type f -not -iwholename '*.git*'
Foo-Bar/.travis.yml
Foo-Bar/lib/Foo/Bar.pm6
Foo-Bar/LICENSE
Foo-Bar/META.info
Foo-Bar/README.md
Foo-Bar/t/01-basic.t

> cd Foo-Bar
> mi6 build  # regenerate README.md
> mi6 test   # run tests

なお release はない。

インストール方法

> panda install git://github.com/shoichikaji/mi6.git

結論

perl6を書く準備は万全である。

perl6 replを使うときLinenoiseを入れとくべき

from http://rjbs.manxome.org/rubric/entry/2081

perl6は perl6 を実行すれば repl ができる。素晴らしい。

$ perl6
> my $foo = -> $name { say "Hey, $name!" }
-> ($name) { #`(Block|140410221851264) ... }
> $foo("you")
Hey, you!

しかし、ctrl keyのショートカットが使えなかったり、十字キー[[A^[[B^[[B^[[D^[[C となったりするので、

$ panda install Linenoise

で Linenoiseを入れとくべき。

perl6で外部プログラムの出力を操作する

perl6でperl5のあれどうやるの1回目。

perlをshell++なものとして使うことはよくある。例えば、外部プログラムを実行しそのstdoutに時刻をつけていくには

use strict;
use warnings;
use POSIX qw(strftime);

my @cmd = ('perl', '-E', '$|++; for (1..10) { say $_; sleep 1 }');
open my $fh, "-|", @cmd or die;
while (<$fh>) {
    printf "[%s] %s", strftime("%F %T", localtime), $_;
}
close $fh;

みたいにすると思う。

> perl test.pl
[2015-09-05 16:25:03] 1
[2015-09-05 16:25:04] 2
[2015-09-05 16:25:05] 3
...

これをperl6でやろうとするとこんな感じか。

use v6;

my @cmd = 'perl', '-E', '$|++; for (1..10) { say $_; sleep 1 }';
my $proc = Proc::Async.new(|@cmd);
$proc.stdout.tap(-> $str {
    printf "[%s] %s", DateTime.now, $str;
});
my $promise = $proc.start;
await $promise;

さらにperl6では何も考えずに外部プログラムを増やせる。いい!

use v6;

my @promise = do for 1..2 {
    my @cmd = 'perl', '-E', '$|++; for (1..10) { say $_; sleep 1 }';
    my $proc = Proc::Async.new(|@cmd);
    $proc.stdout.tap(-> $str {
        printf "[%s] %s", DateTime.now, $str;
    });
    $proc.start;
}
await |@promise;

(ときどき意味不明なエラー出るけど)

vimでperl6のsyntax check

vimでperl5を書くときは、PERL HACKSに載っている

:Wでファイルを保存する前にperl -wcを実行しコンパイルが通るかチェックする」

というのを利用している。これはとても便利で、もしvimでperl5を書いていて知らない人がいるなら是非入れとくべきだ。

などから入手可能である。

さて、perl6でも同じことをやりたくてちょっと調べたところなかったので作った。

これをインストールすれば、:Wでファイルを保存しようとしてsyntaxエラーがある場合

f:id:ks0608:20150830234840p:plain

Errorが出て保存できないようになる。(:W!で強制的に保存することは可能)

perl6を書く準備は万全である。

YAPC::Asia Tokyo 2015

YAPC::Asia Tokyo 2015に行ってきたのでその感想を書く。

  • もっともよかったトークはJonathan WorthingtonさんのParallelism, Concurrency, and Asynchrony in Perl 6。Perl5の最大の欠点はthreadが使えないことだと思っていて、Perl6でそれが解決されるのかと期待していた。実際のところ、それどころじゃなくすべてぶっこみまくっている感じで最高だった。Perl6使おう。
  • hitodeさんのトークで、Perlでプログラミングとはなんたるか、まで考えて作っているサービスがあるんだな、とちょっと衝撃を受けた。そういう環境にあこがれる。
  • 今回のYAPCに行った目的の99%はmiyagawaさんとcpanmについて話すことだった。最後にそれが叶い、とても嬉しかった。cpanm並列化してスピードアップはもしかしたら本体に入るかもしれない。
  • 1日目にLTをさせていただいた。これを通して、cpanm, carton などは一見完成されたソフトに見えるかもしれないけど、まだまだやるべきこと、やれることはたくさんあって、とりあえず何かやろう、と伝えたかった。

speakerdeck.com

YAPC非常に楽しかったです!