プログラミング言語Raku(旧:Perl6)のオンリーカンファレンスが開催されるらしい

インターネット見ていたら発見してしまったのですが、ついにプログラミング言語Raku(旧 Perl6)のオンリーカンファレンスが開催されるようです。

conf.raku.org

今までのRakuはPerlのカンファレンスであるYAPCやPerlConでPerl5とセットで話される機会がほとんどでしたが、ついに初めて単独カンファレンスとなります。 今のところはトークはLTしか応募されていないようですので、みなさん応募しましょう!!(??)

Online, August 7, 2021

とのことです。 以前のThe Perl and Raku Conference 2020 cloudの際はEDTでスケジュールされていたので、日本からリアルタイムでみる場合は夜になるかと思います。


参加チケットは無料ですが、個人で寄付をすることが可能です。

面白いのはTシャツを発送することができないので、Tシャツの素材が配布されており、各自でプリントアウトしてくれ!!!という新スタイルで運用しています。僕もTシャツほしい。

f:id:anatofuz:20210516191406p:plain

ちなみに The Perl and Raku Conference 2021 cloudもやるっぽい。

git commitしたら別のブランチに自動でcherry-pickするPerlスクリプトかいた

今は開発環境でM1 macを使っているのだけれど、色々あってプルリクを送りたいブランチと自分の手元のブランチが異なっているケースがある。ようはM1専用のcommitを積んでいるが、これをプルリクに含めたくないケース。

最近はgit慣れてないのもあって、commitする度にcheckoutしてcherry-pickしていたのだけど、めんどうなのでスクリプトを書いた。 自分が今作業しているブランチをhoge_m1という命名規則にして、プルリクを出すブランチをhogeにするみたいな運用。suffixで分類する。

#!/usr/bin/env perl
use strict;
use warnings;

my $git_branches = `git branch`;

die "$git_branches\n" if ($git_branches =~ /fatal: not/);

my $current_git_branch = `git branch --show-current`;
chomp $current_git_branch;

my $target_branch;
if ($current_git_branch =~ /(.*)_m1$/) {
    $target_branch = $1;
    die "not found $target_branch branch" unless ($git_branches =~ /$target_branch/);
}

system("git","commit");

system("git", "checkout", $target_branch);
system("git", "cherry-pick", $current_git_branch);

system("git", "checkout", $target_branch);

オチ

git rebase勉強した方が早かった気がする

サブルーチンのエイリアスを型グロブで作る

知らなかったのでメモ。

#!/usr/bin/env perl
use strict;
use warnings;

sub hoge {
  print "hello\n";
}

*foo = \&hoge;

foo();

この例題を実行すると元気にhelloと表示される。 これは型グロブを使ってhogeサブルーチンのエイリアス的にfooを登録している。 代入しているのはサブルーチンリファレンスなので参照している実態は同じとなる。

また代入先も変数そのものではなくて型グロブに対してなので、呼び出しが$foo->()ではない。

世間で使われているものだとSmart::Argsに使われていた。

metacpan.org

よくみたら公式ドキュメントにそれっぽい記述があった。 これができるのも面白いけどuse strict環境で普通に実行できたのがびっくり。。。。

hg webを開くコマンドのlinux対応

ubutu引っ越しシリーズ。 個人的に使っていたツール周りをlinuxに移植している。

anatofuz.hatenablog.com

このエントリで紹介していた個人ツールのhg-browselinuxに対応させた。 といっても、macOSopenコマンドをxdg-openに書き換えればいいだけなので割と簡単。

実際に書き換えた結果はこんな感じ。

#!/usr/bin/env perl
use strict;
use warnings;

# hg config経由でhgrcにかかれているpush先を確認する
my $push_path = `hg config paths.default`;

if ($?){
    print "[eror] failed exec hg config paths.default";
    exit 1;
}

my $open_cmd = $^O eq 'darwin' ? "open" : "xdg-open"; #linux open cmd is xdg-open

# 無かったら特に何もしない
exit 1 unless ($push_path);


# yomitanはパスで開けないので別枠
my $url;

if ($push_path =~ /(yomitan)|(chatan)/){
    $url = yomitan($push_path);
} elsif ($push_path =~ /firefly/){
    $url = firefly($push_path);
} else {
  if ( $push_path =~ m[(https?|ssh)://(\w+@)?(.*)]){
      $url = "http://$3";
  }
  die 'invalid url';
}

`$open_cmd $url`;


sub yomitan {
    my $input  = shift;
    my $http_domain = 'https://ie.u-ryukyu.ac.jp/hg/';
    my $url;

    if ($input =~ m[.*//home/hg/y(\d+)(.+)]){
        $url = $http_domain . "y$1$2";
    }
    return $url;
}

sub firefly {
    my $input  = shift;
    my $http_domain = 'http://www.cr.ie.u-ryukyu.ac.jp/';
    my $url;
    if (($input =~ m[.*?firefly.cr.ie.u-ryukyu.ac.jp/(.*)] )||($input =~  m[.*firefly/(.*)])){
        $url = $http_domain.$1;
    }
    return $url;
}

まぁほとんど変化はないのだけど、今までIPC::Run3を使っていた箇所をPerlのバッククォート演算子(`)を使うように変更した。 これに伴ってコアモジュールだけで済むようになったので便利。

linuxの対応は、Perlの場合特殊変数$^OでOSの名前が取れるので、darwin(macOS)かそうでないかで処理を分けている。 まぁこれにwindows対応まで入れるとif-elsifを書かないといけなさそうだけど、まぁしばらくwindows上で生で動かす予定はないので良さそう

最近awesome-perlに追加されたモジュールを眺める

これはPerlアドベントカレンダー23日目の記事です。 昨日はnanto_viさんで「Perl の wantarray 関数で返り値の扱いを確認する」でした。

さて15日目の記事でmoznionさんの方で話があったawesome-perlですが、ここ数週間でかなりプルリクが飛んできていました。 その中で様々なモジュールがawsome-perlに加わっています。 ということで最近awesome-perlに追加されたモジュールの中からいくつか使って雰囲気を見てみます。

.......あ、ちょうどよかったので広告です! BigSureを使っている人はplenv関連のアップデートをお願いします!!!

anatofuz.hatenablog.com

HTML5::DOM

このプルリクエストで追加されました。 プルリクエストを送ってきたAzq2さんが作成したCPANモジュールの様です。

今回はcpanfileに書いてcpmでinstallしようと思います。

cpanfileはこんな感じです。

requires 'HTML5::DOM';

早速インストールします。

$ cpm install
FAIL install HTML5-DOM-1.18
FAIL install HTML5-DOM-1.18
0 distribution installed.

インストールしようとしたところFAILしました。悲しいですね。

2020-12-23T15:00:56,99566,HTML5-DOM-1.18| cc -c  -I/Users/anatofuz/.perl-cpm/work/1608703254.99547/HTML5-DOM-1.18/third_party/modest/include -std=c99 -fno-common -DPERL_DARWIN -mmacosx-version-min=10.15 -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -DPERL_USE_SAFE_PUTENV -O3   -DVERSION=\"1.18\" -DXS_VERSION=\"1.18\"  "-I/Users/anatofuz/.plenv/versions/5.32.0/lib/perl5/5.32.0/darwin-2level/CORE"   DOM.c
2020-12-23T15:00:57,99566,HTML5-DOM-1.18| DOM.xs:515:13: warning: 5 enumeration values not handled in switch: 'MyCSS_SELECTORS_TYPE_UNDEF', 'MyCSS_SELECTORS_TYPE_ATTRIBUTE', 'MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION'... [-Wswitch]
2020-12-23T15:00:57,99566,HTML5-DOM-1.18|                                 switch (entry->type) {
2020-12-23T15:00:57,99566,HTML5-DOM-1.18|                                         ^
2020-12-23T15:00:57,99566,HTML5-DOM-1.18| DOM.xs:515:13: note: add missing switch cases
2020-12-23T15:00:57,99566,HTML5-DOM-1.18|                                 switch (entry->type) {
2020-12-23T15:00:57,99566,HTML5-DOM-1.18|                                         ^
2020-12-23T15:00:59,99566,HTML5-DOM-1.18| 1 warning generated.
2020-12-23T15:00:59,99566,HTML5-DOM-1.18| cc -c  -I/Users/anatofuz/.perl-cpm/work/1608703254.99547/HTML5-DOM-1.18/third_party/modest/include -std=c99 -fno-common -DPERL_DARWIN -mmacosx-version-min=10.15 -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -DPERL_USE_SAFE_PUTENV -O3   -DVERSION=\"1.18\" -DXS_VERSION=\"1.18\"  "-I/Users/anatofuz/.plenv/versions/5.32.0/lib/perl5/5.32.0/darwin-2level/CORE"   utils.c
2020-12-23T15:00:59,99566,HTML5-DOM-1.18| utils.c:126:1: warning: non-void function does not return a value [-Wreturn-type]
2020-12-23T15:00:59,99566,HTML5-DOM-1.18| }
2020-12-23T15:00:59,99566,HTML5-DOM-1.18| ^
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| 1 warning generated.
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| cc -c  -I/Users/anatofuz/.perl-cpm/work/1608703254.99547/HTML5-DOM-1.18/third_party/modest/include -std=c99 -fno-common -DPERL_DARWIN -mmacosx-version-min=10.15 -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -DPERL_USE_SAFE_PUTENV -O3   -DVERSION=\"1.18\" -DXS_VERSION=\"1.18\"  "-I/Users/anatofuz/.plenv/versions/5.32.0/lib/perl5/5.32.0/darwin-2level/CORE"   modest_modest.c
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| In file included from modest_modest.c:5:
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| ./third_party/modest/source/modest/finder/pseudo_class.c:112:13: error: implicitly declaring library function 'snprintf' with type 'int (char *, unsigned long, const char *, ...)' [-Werror,-Wimplicit-function-declaration]
2020-12-23T15:01:00,99566,HTML5-DOM-1.18|             snprintf(new_data, length, "%s", str);
2020-12-23T15:01:00,99566,HTML5-DOM-1.18|             ^
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| ./third_party/modest/source/modest/finder/pseudo_class.c:112:13: note: include the header <stdio.h> or explicitly provide a declaration for 'snprintf'
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| 1 error generated.
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| make: *** [modest_modest.o] Error 1
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| ! Retrying (you can turn off this behavior by --no-retry)
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| Executing /usr/bin/make
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| "/Users/anatofuz/.plenv/versions/5.32.0/bin/perl5.32.0" -MExtUtils::Command::MM -e 'cp_nonempty' -- DOM.bs blib/arch/auto/HTML5/DOM/DOM.bs 644
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| cc -c  -I/Users/anatofuz/.perl-cpm/work/1608703254.99547/HTML5-DOM-1.18/third_party/modest/include -std=c99 -fno-common -DPERL_DARWIN -mmacosx-version-min=10.15 -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -DPERL_USE_SAFE_PUTENV -O3   -DVERSION=\"1.18\" -DXS_VERSION=\"1.18\"  "-I/Users/anatofuz/.plenv/versions/5.32.0/lib/perl5/5.32.0/darwin-2level/CORE"   modest_modest.c
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| In file included from modest_modest.c:5:
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| ./third_party/modest/source/modest/finder/pseudo_class.c:112:13: error: implicitly declaring library function 'snprintf' with type 'int (char *, unsigned long, const char *, ...)' [-Werror,-Wimplicit-function-declaration]
2020-12-23T15:01:00,99566,HTML5-DOM-1.18|             snprintf(new_data, length, "%s", str);
2020-12-23T15:01:00,99566,HTML5-DOM-1.18|             ^
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| ./third_party/modest/source/modest/finder/pseudo_class.c:112:13: note: include the header <stdio.h> or explicitly provide a declaration for 'snprintf'
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| 1 error generated.
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| make: *** [modest_modest.o] Error 1
2020-12-23T15:01:00,99566,HTML5-DOM-1.18| Failed to install distribution

見るとCCのエラーで死んでいます。CCが動いているのでXSかなと思ったのですが、これはsubmoduleのModestというプロジェクトのビルドに失敗している様です。

調べてみたところModestとはC言語で実装されたHTMLのrendererで、HTMLパーサーなどが実装されています。HTML5::Domはこのプロジェクトを呼び出してHTMLのパースを行うモジュールなので、高速ということの様です。

せっかくなのでubuntucpm installしてみました。

$ cpm install HTML5::DOM
DONE install HTML5-DOM-1.18
1 distribution installed.

無事通ったようです。

#!/usr/bin/env perl
use warnings;
use strict;
use HTML5::DOM;

my $parser = HTML5::DOM->new;

my $html = '<div>Hello world!</div>';

# parsing with custom options (extends options defined in HTML5::DOM->new)
my $tree = $parser->parse($html, {
    scripts     => 0,
});

print "$tree->body->text\n"; #Hello World!

$parser->parseを実行するとHTML5::DOM::Treeオブジェクトが返ってきます。

HTML5::DOM::Treeは様々なものを返しますが、今回の例題で<div>Hello World!</div>の中からHelloWorldを取り出すには、まずbodyメソッドを実行してHTML5::DOM::Nodeを返す必要があります。

Nodeも様々なAPIがありますが、中でtextを使うとtextの代入、及び取得が可能な様です。

Asm::X86

Asm::X86X86のインストラクションかどうかを判定することが出来るモジュールです。 また、AT&TアセンブラIntel形式に変換することも可能です。

このプルリクエストで追加されました。

#!/usr/bin/env perl
use strict;
use warnings;
use Asm::X86 qw(@instr is_instr);

print "mov YES\n" if is_instr ("MOV");
print "bic YES\n" if is_instr ("BIC");

例えば上のコードでは、movx86の命令ですのでis_instrはtrueを返しますが、bicはARMの命令なのでfalseを返します。

ELF::Writer

ELF::Writerは、 ELF形式のバイナリを生成することが出来るライブラリの様です。

リポジトリのテストには終了コード42で終わるELFのバイナリが置かれています

実際のテストコードはこのあたりを読んでみましょう。(なんとなく読んだけどAPIをちゃんと把握しないとだめそう)

Video::Generator

Video::GeneratorとはPerlでビデオ生成する!?モジュールです。 このプルリクエストで追加されました。

EXAMPLE2を参考にコードを書いてみます。今回はtempdirを使わずにvideoに書き込みに行きます。 なお予めvideoディレクトリを作っておく必要があります。

use strict;
use warnings;

use File::Path qw(rmtree);
use File::Spec::Functions qw(catfile);
use Video::Generator;

# Object.
my $obj = Video::Generator->new(
        'verbose' => 1,
);

# Create video.
my $video_file = catfile("video", 'foo.mpg');
$obj->create($video_file);

実行するとこんな感じのログが出ます。

$ carton exec -- perl hoge.pl
Video pattern generator created images for video in temporary directory.
Created video file.
Removed temporary directory.

確認するとvideoディレクトリにfoo.mpgが生成されています。

$ ls video
foo.mpg

驚くべきことにPerlで動画が作成されました。 動画はYoutubeにあげてみようと思いましたが、利用規約の関係で削除されてしまいました。

モジュール内部でFFmpeg::Commandが使われているので、話は単純でPerlからffmpeg/avconvを叩いて動画を作成している様です。

おわり

こうしてみるとBaseband-processorさんがめっちゃくちゃプルリクだしてますね...。今は収まったみたいすが一時期の勢いは過ごそうでした。

mac OS BigSurでplenvを使いたい俺たちは

TL;DR

$cd ~/.plenv/plugins/perl-build; git pull

PerlのBigSur問題

plenvはPerlソースコードをローカルに持ってきて、ビルドを行う仕組みになっています。 BigSur以前のmacOSでは正常にビルドができましたが、BigSurでは次のようなエラーが出てしまいビルド出来ないケースがあります。

Which of these apply, if any? [darwin]

*** Unexpected product version 11.0.
***
*** Try running sw_vers and see what its ProductVersion says.

Installation failure: sh Configure -Dprefix=/Users/anatofuz/.plenv/versions/debug-32 -de -Dversiononly -DDEBUGGING=-g -Doptimize=-O0 -A'eval:scriptdir=/Users/anatofuz/.plenv/versions/debug-32/bin' at /Users/anatofuz/.plenv/plugins/perl-build/bin/perl-build line 12763.
ABORT

この問題は、PerlのビルドスクリプトConfiguermacOSのバージョンが決め打ちされている為です。

ほどなくしてパッチが作成され、Perl5本体には取り込まれていますが、5.32などの過去のバージョンには当然取り込まれていません。

github.com

Devel::PatchPerl

過去のリリースにもパッチを当てたい場合、手動でやるのはめんどうなのでよしなにパッチを当ててくれるDevel::PatchPerlというライブラリがあります。

metacpan.org

Devel::PatchPerlはpatch_sourceというAPIが提供されていて、これを叩くとバージョンごとによしなにパッチを当ててくれます。

パッチを当てるPerlのバージョンと内容は、この様にハッシュリファレンスで、Perlのバージョンを正規表現で、あてるパッチをサブルーチンで指定します。

  {
    perl => [
              qr/^5\.004_05$/,
              qr/^5\.005(?:_0[1-4])?$/,
              qr/^5\.6\.[01]$/,
            ],
    subs => [
              [ \&_patch_configure ],
              [ \&_patch_makedepend_lc ],
            ],
  },

今回のBigsurの問題はhints/darwin.shファイルの問題なのですが、実は数日前のcommitで、すべてのバージョンに対してhintsのパッチを当てるようになっていました。

github.com

さらによく見てみると、hintsに関してはパッチ形式ではなく、hintsファイルをbase64Perlモジュールに直接埋め込んでおり、それに差し替えるという方法でした。(macOSのパッチ)

埋め込まれているこのhintsをbase64で戻したところ、上記のPerl5に取り込まれたパッチがあたっている状態でした。

この変更があるDevel::PatchPerlのバージョンは2.04です。

Perl-Build

plenvがデフォルトで呼び出す(であろう)PerlのビルドツールはPerl-Buildです。 Perl-Buildが内部的にConfigureとかを呼び出すようになっています。

実はデフォルトでPerl-BuildはDevel::PatchPerlを当てるようになっています

さらにPerl-Buildがデフォルトで使うDevel::PatchPerlのバージョンは、数日前のcommitで最新版に変更されています。

github.com

またPerl-Buildの中身をplenvはfatpack(Perlモジュールを1枚スクリプトに圧縮)したものを使うようになっています。 Devel::PatchPerlの内容も現在のPerl-Buildのfatpackされたperl-buildに含まれている為、pullして更新すると最新のDevel::PatchPerlを使うことになり、問題が解決されます。

ということで

plenvを使っている皆さんは今すぐ $cd ~/.plenv/plugins/perl-build; git pull しましょう!!!!!

WEB+DB PRESS vol.117 「Perl Hackers Hub」 第62回「Perl歴史散策」に寄稿しました

というわけで一度投稿してみたかったエントリです!!!

2020年6月24日(水)に発売される WEB+DB Press Vol.117Perl Hackers Hub に「Perl歴史散策」を書かせていただきました!!みんな買ってくれ!!!!!!

沖縄だと多分無いですが大手書店では6月16日からテスト販売があるそうです!!!自分の近所の書店が大手書店だと思われる人は買ってください!!!

ちなみに外出するのはな...という皆様のために電子書籍でも販売しています!!!

f:id:anatofuz:20200608185623j:plain

気になる内容

気になる内容ですが

  • Perl1.0から現在のPerl5.32に至るまでの代表的なバージョン(1,2,3,4,5)の解説
  • Perl6/Rakuの歴史と現在
  • 最新Perl5情報

...と、個人的な趣味MAXみたいな内容でお送りしています。(別に僕が書いたコードの話ではない^q^)

今からPerlを始めてみよう、 Perlってどんな言語なのかちょっと知りたいというPerlビギナーの方はもちろんのこと。 PerlがどのようにC言語で実装されているか気になる方まで、 Perlに興味がある方なら面白いかなと思う内容だと思います!

所感

Perl Hackers Hubは第一線のバリバリPerlエンジニアの方が多く執筆されており、業務で使っていない以前にそもそも業務をしていない学生だったので(!!!!????)となりましたが、せっかくチャンスを頂いたので書かせていただきました!

執筆はmarkdownベースの文法なファイルをガンガン書いていって、そのファイル上で校正をしていただける運用でした。こういう執筆作業でもgitみたいなバージョン管理使っているのか~!と驚きました。

実際に書籍の文章が我々の手元に届くまでにはかなりの労力がかかっている事を身を以て体験できました。徹底的に編集部の皆様に文章の校正をしていただいて、人々に伝わりやすい文章を作る難しさを痛感しました。今までと異なる目線で技術書などの書籍を見ることが出来るようになったと思います。

あとは犯罪以外で自分の名前が書かれた書籍が全国に頒布されるのは嬉しいですね。しかも憧れのWEB+DB PRESSなので感慨もひとしおです。

謝辞

お誘い頂いたid:papixさんや、 的確な指摘で文章のリファクタリングをしていただいた技術評論社の稲尾さん、 英語や技術的内容のレビューをしていただいた監修の牧さんを始めとする校正などに関わってくださった皆さんに御礼申し上げます。

もう一度

2020年6月24日(水)に発売される WEB+DB Press Vol.117Perl Hackers Hub に「Perl歴史散策」を書かせていただきました!!よろしくお願いします!!!!!!