Practice of Programming

プログラム とか Linuxとかの話題

Perl

GraphViz::DBI で ER図を吐き出す

この記事は, Perl Advent Calendar 2019 の20日目の記事です。 19日は、doikojiさんの、「WINI & cal: perlベースの新しい簡易マークアップ言語WINIで来年のカレンダーを作りましょう! 」でした。 この記事は、もともとWanoグループのAdvent Calendar に書…

翻訳 CPAN::Meta::Spec、Module::CPANFile、Minilla、Milla::Tutorial、cpanm、Carton、plenv、plenv-contrib

CPANまわりのツールたちの開発が活発なので、翻訳しようと前々から思ってたのですが、ようやく翻訳しました。 CPAN::Meta::Spec ... CPANメタデータ仕様 cpanfile ... PerlアプリケーションのためにCPANの依存性を記述するためのフォーマット cpanfile-faq .…

scalarコンテキストでのsortの振る舞いは未定義

何年も使ってるのに、基本的な関数知らないとか!とか、思った。同僚がはまっていたので知ったのですが、sort のスカラコンテキストでの振る舞いは未定義だそうです。実際問題、sort をスカラで受けるとか意味わからない。ちゃんと警告も出ます。 Useless use…

Teng::Plugin::SearchBySQLAbstractMore 0.10 と 0.11 をリリース

https://metacpan.org/module/Teng::Plugin::SearchBySQLAbstractMore0.10 は先日ご報告をうけた、search_by_sql_abstract_more メソッドの挙動が、search と違うよっていうバグの修正です(ちなみに、僕はこのバグに依存したコードを書いちゃってたので、修…

Teng::Plugin::SearchBySQLAbstractMore 0.09 リリース

https://metacpan.org/module/Teng::Plugin::SearchBySQLAbstractMore 変更点は、create_sql_by_sql_abstract_more ていうのを生やしたのと、Teng::Plugin::SearchBySQLAbstractMore::Pager::Countの改良。 create_sql_by_sql_abstract_more は、そのまま、T…

spork で作ったスライドをPDFにする

YAPC::Asiaお疲れ様でした! 牧さん、櫛井さん、スピーカーの皆様、来場者の方々、ありがとうございました。 今回は、スタッフとしてRoom 1(中教室)にずっといましたが、仕事してたり、perldoc.jp がバグってるのを見つけたり(deltaが表示できてなかった orz…

ループ回数が多いときにDateTime使うのはやめよう

ボトルネックを探していたら、5000回くらいのループでDateTimeを使っている場面だったという話。 簡単な例として、1分追加する処理でベンチマークとってみた。 Benchmark: running datetime, timepiece for at least 3 CPU seconds... datetime: 3 wallclock…

YAML::XS 0.35未満のメモリリーク

DBに大きめのYAMLが保存してあって、それを読み取る処理があったのですが、メモリがどんどん増えていくなーと思ったら、以下のものでした。 http://blogs.perl.org/users/brian_d_foy/2011/03/fixing-yamlxss-memory-leak.htmlChangesでは、 - version: 0.35…

AEとQudoを組み合わせる

別に書くほどのことは無いのですが。QudoをAEとの組み合わせで使ったので、work メソッドの中身をAE::timer に渡すことにしました。 my $qudo = Qudo->new(...); $w = AE::timer 0, $qudo->{work_delay}, sub { my $manager = $qudo->manager; unless ($mana…

Text::Parts 0.13 リリース

Text::Parts 0.13会社の隣の人に、write_filesが完全にバグってると指摘されたので、直しましたorz テストでサイズだけチェックしてたんですが、まぁ、サイズ分書き出してるんだから、意味ないよね… md5_hexでファイル内容をチェックするように変更しました…

Text::Parts 0.09 リリース

Text::Parts2000くらいファイル分割しようと思ったら、"Too many open files"と言われてしまったので。 no_open オプションを使って、write_files を使うのであれば、特に問題は無かったかと思いますが、split メソッドを使って、自分で write_file を使うと…

Teng::Plusing::SearchBySQLAbstractMore 0.07リリース

Teng::Plusing::SearchBySQLAbstractMoreTeng内で用意されている_executeメソッドを使うようにしましたので、エラーメッセージが改善されています。 というか、普通のTengが出すエラーメッセージになりました。# なんで、素のexecuteを使うようにしちゃって…

IO::Pty::Easy が簡単・便利

ちょっと遊んでいたら見つけたのですが、これ簡単ですね。 use IO::Pty::Easy; my $pty = IO::Pty::Easy->new; $pty->spawn("mysql -u root"); while ($pty->is_active) { while (my $o = $pty->read(1)) { print $o; } if (my $sql = <>) { $pty->write($sq…

Teng::Plugin::SearchBySQLAbstractMore リリース

ケースによりますが、最近のプロジェクトだと、searchメソッドじゃ足りないことが多かった(50%くらい)ので、SQL::Abstract::Moreをクエリービルダーに使えるようにしました。 Teng::Plugin::SearchBySQLAbstractMoreリリースしたらblog書こうと思ってたら、…

Text::Parts 0.08 をリリース

先日リリースしました。 https://metacpan.org/module/Text::Partswrite_files の性能がちょい上がってます。それだけ。Text::Parts::Partオブジェクトを作るときに、file open & seek しているのですが、write_filesの場合は、頭からファイルをreadして書き…

Text::Parts 0.07 をリリース

Text::Parts 0.07 0.06も上げたのですが、微妙なところがあって、すぐに0.07をリリースしてしまった。変わったところ。Text::Partsにwrite_filesメソッド追加。 $s->write_files('file%d.csv', num => 4); みたいな感じ。 # 0.06で追加したけど、0.07でイン…

SQLを組み立てるもの

最近、Tengを使っていますが、それほど複雑でもないSQLを組み立てるのに、searchメソッドは使いにくいと思う時が割と多い(group by出来ないとか、x = ? or y = ? とか書きにくいとか)。たぶん、方針として、シンプルなSQL以外は、search_by_sqlをっていうこ…

Hachioji.pm #10 に行ってきた

行きたいなぁーと思いつつ、遠いなーと思っていたのですが、行ってみることにしました。 僕は東京の東の方に住んでるので、会場までは、1時間20分くらいかかりました。交通費は780円。時間とお金で遠さを実感w 迷いやすい会場ということでしたが、方向音痴の…

YAPC Asia 2011行ってきた

とは言え、2日目のみの参加でした。1日目も出たかったなー。 個人スポンサーにもなってんだから、せめて懇親会くらい行きたいなーと思ってたんだけどね。夜に会議入っちゃったから、諦めた。 1日目後 Twitterで眺めてたら、PerlDojoとかいう面白いことをやっ…

Text::Parts てのを書いた

githubにおいてます。テキストファイルを複数のパーツに分けるものです(実際に分割するわけではなく、分けた部分を読むためのオブジェクトを返します)。 各パーツは、行頭から始まって行末で終わる感じになります。行の途中で分けられるということはありませ…

ログを監視して怪しげな文字列を見つけたら何かする

Parallel::ForkManagerを訳しました(nekokakさんの0.7.5の翻訳からの差分だけなので楽でした)。 で、複数のエラーログファイルがあって、そのログファイルを tail(File::Tailを使って)しつつ、Errorを見つけたら、何かするっていうスクリプト。 例として、そ…

Amon2を継承して自分のWAFを作る

2ヶ月くらい前からか、id:tokuhiromさん作成のAmon2を会社のFrameworkのベースにしています。 Amon2は拡張しやすい感じだし、Flavorをメンテするのは結構だるいし、会社なら共通させたほうがいいなーということで、継承して使ってます(Flavorも使っています…

巨大なファイルをgetする場合のLWP::UserAgentとFurlの場合

バッチ処理がやたらメモリくってると思ったら、なんかおっきいファイルをgetしてたせいでした orz 一旦ファイルに吐き出して、後でopenして使いたいような場合は、LWPでは、 my $ua = LWP::UserAgent->new(); $ua->get('http://example.com/big_file.gz', ':…

Perl で WebSocket クライアント(AnyEvent)&サーバ(psgi)

こんなんでいいかなぁ。その2。forkじゃアレなんで、AnyEventで書いてみた(https://gist.github.com/1000223)。 追記: 以下、to_stringですが、Protocol-WebSocket-0.00906 では、Protocol::WebSocket::Handshake は to_bytes に変わっているようです。 #!/u…

Perl で WebSocket クライアント

こんなんで良いかなぁ。 #!/usr/bin/perl use strict; use warnings; use POSIX ":sys_wait_h"; use Protocol::WebSocket::Handshake::Client; use Protocol::WebSocket::Frame; use IO::Socket; use open ':utf8'; use open ':std'; $| = 1; run(); sub run…

podの原文に=begin original =end originalを挿入する関数

perlのドキュメントを翻訳する際に原文残す場合は、該当部分を =begin original 〜 =end original で囲むことが推奨されています。以下みたいな感じ。 =begin original 原文 =end original 翻訳 手で書くのは面倒なので、以下のような関数作ってます。 (defu…

Util::All だいたい終わった

Util::Allですが、終わったというか、キリがないので、そろそろやめる。 CPANにあげようかと思ってるんですが。Allなんて厚かましいのはいいんだろうか。 現在、250以上の関数(まじめに数えてない)を集めました。一部は自分で新たに書いたものや、wrappingし…

select some sections from Module's POD

Pod::Section Usage: % podsection Catalyst SYNOPSIS # as text % podsection -u Catalyst SYNOPSIS # as plain pod % podsection Catalyst req # show pod of req methodExamle: %podsection Catalyst req res $c->req Returns the current Catalyst::Requ…

デモでパスワードが必要な時は

perl-casual #2 の ustream を聞いてると、makiさんが、Live Codingしているときに「パスワード見えちゃうなー」みたいなことを言っていたので。 たぶん、ご存知だとは思いますが、パスワードが必要なデモをする時は IO::Prompt 使うといいんじゃないでしょ…

Util::Any 0.20

In this version, 2 features are added. able to specify default kind of exports. able to define the kind which doesn't export anything, but executes code. default exports example: package Your::Utils; use Util::Any -Base; our $Utils = Clone…