Practice of Programming

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

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

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

tcat という行頭に日時を付加するコマンドを作った

cat のように標準入力かファイルの中身を出力するものですが、先頭行に日時がつきます。 https://github.com/ktat/tcat にあります。なんで、こんなものが必要かというと、例えば、サーバの様子を top -b を記録して後からみたいなーとかいう時とかに... % t…

Go言語さわってみた

一年前(2014年5月末の作成日の.goなファイルがあった)くらいにGo Tourを途中までやったけど、ほとんど覚えてなかったです。 ディレクトリとか環境変数とかは、前若干コード書いたので、それっぽく残ってました。emacsのgo-modeも入ってた。 という状況から、…

翻訳 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…

SQL の Query Builder についてのとりとめのない話

誰か、ココが嫌だよQuery Builder的なエントリを書いてくれないかな。 使いどころ 動的に条件を組み立てるところ(whereに与えるカラムが変わったりする) 使わなかったら、複雑な条件を動的に組み立てる場合は、sprintfでSQLを組み立てるみたいなことになって…

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をっていうこ…

[Linux][vim] samba上のファイルをvimで編集する時のtimestampの問題を回避する設定

どうも、samba上でvimでファイルを編集していると、変更してないのに変更されていると文句を言ってくる。 WARNING: The file has been changed since reading it!!! 警告: 読込んだ後にファイルに変更がありました!!!こいつです。 ググってみたところ、samba…

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…