最近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さんがめっちゃくちゃプルリクだしてますね...。今は収まったみたいすが一時期の勢いは過ごそうでした。