これはPerlアドベントカレンダー23日目の記事です。 昨日はnanto_viさんで「Perl の wantarray 関数で返り値の扱いを確認する」でした。
さて15日目の記事でmoznionさんの方で話があったawesome-perlですが、ここ数週間でかなりプルリクが飛んできていました。 その中で様々なモジュールがawsome-perlに加わっています。 ということで最近awesome-perlに追加されたモジュールの中からいくつか使って雰囲気を見てみます。
.......あ、ちょうどよかったので広告です! BigSureを使っている人はplenv関連のアップデートをお願いします!!!
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のパースを行うモジュールなので、高速ということの様です。
せっかくなので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>'; # 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::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; # 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さんがめっちゃくちゃプルリクだしてますね...。今は収まったみたいすが一時期の勢いは過ごそうでした。