May 05, 2010
■ [perl][youtube]YouTube Downloader アップデート

id:ishiducaさんの記事でWWW::YouTube::Downloadがいいらしいと知ったので、以前作ったYouTube Downloaderをこのモジュール使って作りなおしてみました。
ダウンロード
のDownload Sourcってところか、yt.pl ってファイルをクリックしてクリップボードにコピーしたり raw ファイル落としたりしてください。
使い方
yt.pl <video_id> か、 yt.pl <url>で。プレイリストのURL指定すると一括で落とせます。
日記
1年ぶりのアップデート。たぶん動かなかった。
今回のアップデートできちんと動作するようになったけど、そのかわりフォーマットが指定できないとか保存フォルダの指定不可(カレントディレクトリのみ)とか断片化防止のアイデアが使えないとか、機能は減りました。ねむい。
April 20, 2010
■ [ruby]net-irc入れ直しメモ

かくとこないのでここにかくよ。
Rubyをインストールし直したのでこれのためだけにruby入れてると言っても過言ではないnet-ircもインストールし直すことになりました。その手順メモです。
Rubyのインストール
最近はよくできたインストーラがあります。ので、Ruby Installer for WindowsのRubyInstallerから都合のいいやつをダウンロードしてきてインストールします。だいたいは最新のバージョンのexeファイルで問題ないはず。
net-ircのインストール
$ gem install net-irc
ショートカットの作成
起動時にIRCゲートウェイ鯖が立ち上がってると便利なのでバックグラウンドで起動しスタートアップに簡単に登録できるようなVBスクリプトを書いておきます。
多少tig.rbの中身を変えて使ってるのでtig.rb等はC:\bin以下に置いてます。
Dim WShell Set WShell = WSCript.CreateObject("WScript.Shell") WShell.Run "ruby C:\bin\tig.rb -h 127.0.0.1", 0 WShell.Run "ruby C:\bin\hig.rb -h 127.0.0.1", 0 WShell.Run "ruby C:\bin\wig.rb -h 127.0.0.1", 0
-hオプションはお好みで。
上をirc_gateway.vbsという名前で保存して、これもC:\bin以下へ。C:\binにはパスを通しておきます。
スタートアップに登録
作成したirc_gateway.vbsのショートカットを作成して、スタートメニュー内のスタートアップに突っ込みます。これで起動と同時にtig.rbが動いている状態になりました。
おしまい
非常に簡単に導入できるようになったなー
March 12, 2010
■ [perl][memo][module]Win環境でモジュールの配布パッケージを作ってみる(草稿)

日を置くと情熱も記憶も失われるもので、もう何書こうとしてたか思い出せません。ですので、自分の環境で配布パッケージ作る時に引っかかった所を断片的に記録しておきます。
環境
- Windows XP
- Active Perl
- Cygwin
- Visual C++
モジュール作成からパッケージまでの10の手順
- このへん読む
- Module::Starter/Module::Starter::PBPインストール
- $ perl -MModule::Starter::PBP=setup
- 出来たテンプレートフォルダ(%HOME%/.module_starter/PBP)をC:\Perl\PBPに移動
- configのテンプレートページのとこC:\Perl\PBPに書き換え
- $ module-starter --module=Hoge
- Hoge/lib/Hoge.pm 書く
- $ PATH C:\Perl\bin;C:\Program Files\Microsoft Visual Studio 9.0\VC\bin
- $ perl Makefile.pl
- $ make dist
ツマルの詰まったとこ
- Win 2000/XP特有?の問題として、%HOME%がだいたいDocuments and Settings/fugaとか、パスに空白が入ってるせいでmodule-starterがテンプレートページのパスが分からないとかのエラー吐く
- スペースはいってないパスにPBPディレクトリを移動して解決
- CygwinのせいなのかMakefileしてつくったmakeが"multiple target patterns. Stop"とかでエラー
おしまい
こんな感じで案外あっさり出来てしまいました。それでもそれなりに環境整えてやらないと出来るものもできないんだなぁというのが今回の感想です。あ、これ草稿のまま終わりそう。夜。
cf.
Addy2011/06/05 09:30Hey, that post leaves me feeilng foolish. Kudos to you!
pzhmlhal2011/06/05 17:55TpHTVq <a href="http://fjlidowwjrli.com/">fjlidowwjrli</a>
vmenumsdhq2011/06/06 22:29YduFNj , [url=http://atmticemgxor.com/]atmticemgxor[/url], [link=http://lgdhqdabbown.com/]lgdhqdabbown[/link], http://pfnsyxtchlrl.com/
ohljogo2011/06/07 17:55NtmO91 <a href="http://eubvdbyyziyx.com/">eubvdbyyziyx</a>
gldecnzo2011/06/09 19:286zOWRa , [url=http://vajhjtqiwcpz.com/]vajhjtqiwcpz[/url], [link=http://adsgrcuxunqi.com/]adsgrcuxunqi[/link], http://cjtppvomotap.com/
March 07, 2010
■ [perl][dark]\(hoge) -> ?

print \(a..z); # SCALAR(0x182fe2c)SCALAR(0x182fe38)...SCALAR(0x182ff4c)SCALAR(0x182ff58)
なにこのミラクル構文。リスト(配列じゃなくてリスト構文)のリファレンス取ろうとすると中身のリファレンスのリスト返すのか。すげー
追記
@a = 0..9; @b = A..Z; @c = a..z; print \(@a); # SCALAR(0x182fd8c)SCALAR(0x182fd98)...SCALAR(0x182fec4)SCALAR(0x182fed0) print \(@a,@b,@c); # ARRAY(0x182f984)ARRAY(0x182fb04)ARRAY(0x182fde0)
リストの中身が複数に分かれると、それぞれのリファレンスを返すみたい。
ちなみに、複数の配列のすべての中身のリファレンスが欲しい時は
print \(@_=(@a,@b,@c)); # SCALAR(0x2861ac)SCALAR(0x286284)...(many)...SCALAR(0x1830368)SCALAR(0x1830374)
のように、一つの配列に代入してやるといいみたい。いいシュガー発見した気がする。
追記2
print \(@{[@a,@b,@c]});
こっちのほうがスマートですね。
■ [perl][func][memo]配列をshuffle(ランダムに並べ替えたい)/take potluck(ランダムに抜き出したい) - 爆速編

前回の更新ではベンチ取らないでやってたので今回は高速化に挑戦。
まずはベンチマーク
使ったコードはこちら。
#!perl use Benchmark qw(timethese cmpthese); use List::Util; my @a = 'Aa'..'Zz'; # 0 .. 675 cmpthese(timethese(10000, { 'L::U::shuffle' => sub { List::Util::shuffle(@a) }, shuffle_simple => sub { shuffle_simple(@a) }, shuffle => sub { shuffle(@a) }, L_U_shuffle => sub { L_U_shuffle(@a) }, })); sub shuffle_simple { return sort { int(rand 3) -1 } @_ } sub shuffle { my @old = @_; local $_; my ($i, $new) = ($#old+1, 0); map { $_ = $old[$new = rand $i--]; $old[$new] = $old[$i]; $_; } 0 .. $#old } sub L_U_shuffle { my @old = \(@_); my $n; my $i = @_; map { (${$old[$n = rand $i--]}, $old[$n] = $old[$i])[0]; } @_ }
L_U_shuffleはList::Util::shuffleのpure perl版です。
で、結果が以下。
Rate shuffle L_U_shuffle L::U::shuffle shuffle_simple
shuffle 215/s -- -73% -97% -100%
L_U_shuffle 794/s 270% -- -90% -99%
L::U::shuffle 7622/s 3453% 859% -- -94%
shuffle_simple 125000/s 58171% 15635% 1540% --
…(shuffle_simpleはともかく)勝負にならんな!あとXSのshuffle速すぎ。
なんでこんなに差がつくかというと、L_U_shuffleは実体をコピーするのではなくさっきの記事の方法を使ってリファレンスのリストを作ってそいつを回しているのが原因だと思う。余計な代入も一切発生しない。あと僕の作ったshuffleはmap回すのに0..$#oldみたいないらん配列作ってるしさらに遅い。で、3倍近く差がつく。この点を改良して最速shuffle/take potluckを作ります。
並べ替え
sub shuffle_fast(@) { my @old = \(@_); my $n; my $i = @_; map { (${$old[$n = rand $i--]}, $old[$n] = $old[$i])[0]; } @_; }
ええパクリです。でも僕の環境だとpure perlのList::Util::shuffleの倍は出ます。何故か。mapの中を1行にしただけなのに。
参考ベンチ(試行回数1000)
Rate shuffle L_U_shuffle shuffle_fast
shuffle 216/s -- -46% -72%
L_U_shuffle 396/s 84% -- -49%
shuffle_fast 774/s 259% 95% --
適当に抜き出す
sub potluck_fast($;$) { my $i = my @a = \(@{+shift}); my $n = shift || int rand $i; $n = $i if $n > $i; map { (${$a[$n = rand $i--]}, $a[$n] = $a[$i])[0]; } 0 .. $n-1; } warn potluck_fast([0..9,A..Z,a..z],20); # XK7kgQq6Dn1RLVa8ozOW
ぱくぱく。使い方は前回同様、第1引数に配列のリファレンスを、第2引数に抜き出したい数を渡します。
参考ベンチ(試行回数1000)
Rate potluck potluck_fast
potluck 248/s -- -73%
potluck_fast 925/s 273% --
おしまい
爆速って程でもなかったかな。しかし既存のshuffleよりはずっと速くなったはず。そのへんのよりは3倍速い。
List::Util使えるんだったらshuffleはList::Util使いましょう。爆速です。potluckみたいなことしたいときも
(List::Util::shuffle('Aa'..'Zz'))[0..rand(676)]
とかすれば爆速間違いなし。XSにはどう頑張っても勝てんわ。
cf.
March 05, 2010
■ [perl][encode]Encode::Entity::NCR v0.0.1 Release!

- XML::RSSが日本語を数値実体参照で返しやがるのに適当なデコーダがHTML::Entitiesくらいしか見つからない
- Encode.pmはエンコードできるけどデコードの仕方が分からない
- 毎回replaceかくのだるいし出来ればEncode.pmでなんとかしてほしい
ので作った!
ダウンロード
のDownload Sourceってところから落とせます。
使い方
use Encode; use Encode::Entity::NCR; $ncr = encode('Entity-NCR', $utf8); $utf8 = decode('Entity-NCR', $ncr);
あとはpod見て。
Encode.pmだけでやる
use Encode qw(encode decode :fallbacks); $dec_ncr = encode('ascii', $str, FB_HTMLCREF); # 10進数 $hex_ncr = encode('ascii', $str, FB_XMLCREF); # 16進数 $dec_ncr =~ s/&#(\d+);/chr $1/eg; $hex_ncr =~ s/&#x([\da-f]+);/chr hex $1/eig; $ncr =~ s/&#(x)?([\da-f]+);/chr($1?hex $2:$2)/eig; # 両方いっぺんに
デコードがわかんないのでこれを毎回書くわけですけど、めんどい!エンコードのほうも :fallbacks とか覚えられない!
おしまい
何気にmakeするモジュール初めて作ったので楽しかった。一回うっかりして module-starter で上書きしちゃったのもいい経験。いろいろ気付いたことがあったので今度はモジュールの作り方を記事にしよう。
FrenchieWalking in the presence of giants here. Cool thinking all arunod!
xfimugfxhZQWGoL <a href="http://wcvmdvwbmwfs.com/">wcvmdvwbmwfs</a>
DollGood to see a tanlet at work. I cant match that.
bhgexmRcdD4s , [url=http://vrwahvyypoaq.com/]vrwahvyypoaq[/url], [link=http://weomrireqfxh.com/]weomrireqfxh[/link], http://qistkodzangp.com/
tlmchw9cvKCK <a href="http://ympguridusyx.com/">ympguridusyx</a>
rmctzrc2WmlOV , [url=http://oteehvbukvqk.com/]oteehvbukvqk[/url], [link=http://inijznmksduz.com/]inijznmksduz[/link], http://yxxtutwvudaw.com/