これはPerlアドベントカレンダー23日目の記事です。
昨日はnanto_viさんで「Perl の wantarray 関数で返り値の扱いを確認する」でした。
さて15日目の記事でmoznionさんの方で話があったawesome-perlですが、ここ数週間でかなりプルリクが飛んできていました。
その中で様々なモジュールがawsome-perlに加わっています。
ということで最近awesome-perlに追加されたモジュールの中からいくつか使って雰囲気を見てみます。
.......あ、ちょうどよかったので広告です! BigSureを使っている人はplenv関連のアップデートをお願いします!!!
anatofuz.hatenablog.com
このプルリクエストで追加されました。
プルリクエストを送ってきた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のパースを行うモジュールなので、高速ということの様です。
せっかくなのでubuntuでcpm 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>';
my $tree = $parser->parse($html, {
scripts => 0,
});
print "$tree->body->text\n";
$parser->parse
を実行するとHTML5::DOM::Treeオブジェクトが返ってきます。
HTML5::DOM::Treeは様々なものを返しますが、今回の例題で<div>Hello World!</div>
の中からHelloWorldを取り出すには、まずbody
メソッドを実行してHTML5::DOM::Nodeを返す必要があります。
Nodeも様々なAPIがありますが、中でtextを使うとtextの代入、及び取得が可能な様です。
Asm::X86はX86のインストラクションかどうかを判定することが出来るモジュールです。
また、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");
例えば上のコードでは、mov
はx86の命令ですので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;
my $obj = Video::Generator->new(
'verbose' => 1,
);
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さんがめっちゃくちゃプルリクだしてますね...。今は収まったみたいすが一時期の勢いは過ごそうでした。