Hatena::Groupperl

local $PERL_MEMO;

May 05, 2010

[][]YouTube Downloader アップデート はてなブックマーク - YouTube Downloader アップデート - local $PERL_MEMO; YouTube Downloader アップデート - local $PERL_MEMO; のブックマークコメント

id:ishiducaさんの記事WWW::YouTube::Downloadがいいらしいと知ったので、以前作ったYouTube Downloaderをこのモジュール使って作りなおしてみました。

ダウンロード

Download Sourcってところか、yt.pl ってファイルをクリックしてクリップボードにコピーしたり raw ファイル落としたりしてください。

使い方

yt.pl <video_id> か、 yt.pl <url>で。プレイリストのURL指定すると一括で落とせます。

日記

1年ぶりのアップデート。たぶん動かなかった。

今回のアップデートできちんと動作するようになったけど、そのかわりフォーマットが指定できないとか保存フォルダの指定不可(カレントディレクトリのみ)とか断片化防止のアイデアが使えないとか、機能は減りました。ねむい。

April 20, 2010

[]net-irc入れ直しメモ はてなブックマーク - net-irc入れ直しメモ - local $PERL_MEMO; net-irc入れ直しメモ - local $PERL_MEMO; のブックマークコメント

かくとこないのでここにかくよ。

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

[][][]Win環境でモジュールの配布パッケージを作ってみる(草稿) はてなブックマーク - Win環境でモジュールの配布パッケージを作ってみる(草稿) - local $PERL_MEMO; Win環境でモジュールの配布パッケージを作ってみる(草稿) - local $PERL_MEMO; のブックマークコメント

日を置くと情熱も記憶も失われるもので、もう何書こうとしてたか思い出せません。ですので、自分の環境で配布パッケージ作る時に引っかかった所を断片的に記録しておきます。

環境

モジュール作成からパッケージまでの10の手順

  1. このへん読む
  2. Module::Starter/Module::Starter::PBPインストール
  3. $ perl -MModule::Starter::PBP=setup
  4. 出来たテンプレートフォルダ(%HOME%/.module_starter/PBP)をC:\Perl\PBPに移動
  5. configのテンプレートページのとこC:\Perl\PBPに書き換え
  6. $ module-starter --module=Hoge
  7. Hoge/lib/Hoge.pm 書く
  8. $ PATH C:\Perl\bin;C:\Program Files\Microsoft Visual Studio 9.0\VC\bin
  9. $ perl Makefile.pl
  10. $ make dist

ツマルの詰まったとこ

  • Win 2000/XP特有?の問題として、%HOME%がだいたいDocuments and Settings/fugaとか、パスに空白が入ってるせいでmodule-starterがテンプレートページのパスが分からないとかのエラー吐く
    • スペースはいってないパスにPBPディレクトリを移動して解決
  • CygwinのせいなのかMakefileしてつくったmakeが"multiple target patterns. Stop"とかでエラー
    • コマンドPATHで一時的にperlvc(とあと%System%とか/binとかあったかもしれない)の最小構成にする。そのあいだにperl Makefile.pl etc
    • PATHはコマンドプロンプトが開いてる間、渡されたパスを覚えてるだけなので「環境変数書き変わるかも…」とか心配しなくていい。別のプロンプト起動すればいつもどおりである

おしまい

こんな感じで案外あっさり出来てしまいました。それでもそれなりに環境整えてやらないと出来るものもできないんだなぁというのが今回の感想です。あ、これ草稿のまま終わりそう。夜。

cf.

AddyAddy2011/06/05 09:30Hey, that post leaves me feeilng foolish. Kudos to you!

pzhmlhalpzhmlhal2011/06/05 17:55TpHTVq <a href="http://fjlidowwjrli.com/">fjlidowwjrli</a>

vmenumsdhqvmenumsdhq2011/06/06 22:29YduFNj , [url=http://atmticemgxor.com/]atmticemgxor[/url], [link=http://lgdhqdabbown.com/]lgdhqdabbown[/link], http://pfnsyxtchlrl.com/

ohljogoohljogo2011/06/07 17:55NtmO91 <a href="http://eubvdbyyziyx.com/">eubvdbyyziyx</a>

gldecnzogldecnzo2011/06/09 19:286zOWRa , [url=http://vajhjtqiwcpz.com/]vajhjtqiwcpz[/url], [link=http://adsgrcuxunqi.com/]adsgrcuxunqi[/link], http://cjtppvomotap.com/

March 07, 2010

[][]\(hoge) -> ? はてなブックマーク - \(hoge) -> ? - local $PERL_MEMO; \(hoge) -> ? - local $PERL_MEMO; のブックマークコメント

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]});

こっちのほうがスマートですね。

[][][]配列をshuffle(ランダムに並べ替えたい)/take potluck(ランダムに抜き出したい) - 爆速編 はてなブックマーク - 配列をshuffle(ランダムに並べ替えたい)/take potluck(ランダムに抜き出したい) - 爆速編 - local $PERL_MEMO; 配列をshuffle(ランダムに並べ替えたい)/take potluck(ランダムに抜き出したい) - 爆速編 - local $PERL_MEMO; のブックマークコメント

前回の更新ではベンチ取らないでやってたので今回は高速化に挑戦。

まずはベンチマーク

使ったコードはこちら。

#!perl
use Benchmark qw(timethese cmpthese);
use List::Util;
my @a = &#39;Aa&#39;..&#39;Zz&#39;; # 0 .. 675

cmpthese(timethese(10000, {
  &#39;L::U::shuffle&#39; => 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(&#39;Aa&#39;..&#39;Zz&#39;))[0..rand(676)]

とかすれば爆速間違いなし。XSにはどう頑張っても勝てんわ。

cf.

March 05, 2010

[][]Encode::Entity::NCR v0.0.1 Release! はてなブックマーク - Encode::Entity::NCR v0.0.1 Release! - local $PERL_MEMO; Encode::Entity::NCR v0.0.1 Release! - local $PERL_MEMO; のブックマークコメント

  • XML::RSSが日本語を数値実体参照で返しやがるのに適当なデコーダがHTML::Entitiesくらいしか見つからない
  • Encode.pmはエンコードできるけどデコードの仕方が分からない
  • 毎回replaceかくのだるいし出来ればEncode.pmでなんとかしてほしい

ので作った!

ダウンロード

Download Sourceってところから落とせます。

使い方

use Encode;
use Encode::Entity::NCR;
$ncr  = encode(&#39;Entity-NCR&#39;, $utf8);
$utf8 = decode(&#39;Entity-NCR&#39;, $ncr);

あとはpod見て。

Encode.pmだけでやる

use Encode qw(encode decode :fallbacks);
$dec_ncr = encode(&#39;ascii&#39;, $str, FB_HTMLCREF); # 10進数
$hex_ncr = encode(&#39;ascii&#39;, $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 で上書きしちゃったのもいい経験。いろいろ気付いたことがあったので今度はモジュールの作り方を記事にしよう。

FrenchieFrenchie2011/06/05 15:59Walking in the presence of giants here. Cool thinking all arunod!

xfimugfxhxfimugfxh2011/06/05 18:14ZQWGoL <a href="http://wcvmdvwbmwfs.com/">wcvmdvwbmwfs</a>

DollDoll2011/06/05 21:09Good to see a tanlet at work. I can’t match that.

bhgexmbhgexm2011/06/06 23:23RcdD4s , [url=http://vrwahvyypoaq.com/]vrwahvyypoaq[/url], [link=http://weomrireqfxh.com/]weomrireqfxh[/link], http://qistkodzangp.com/

tlmchwtlmchw2011/06/07 18:359cvKCK <a href="http://ympguridusyx.com/">ympguridusyx</a>

rmctzrcrmctzrc2011/06/09 19:082WmlOV , [url=http://oteehvbukvqk.com/]oteehvbukvqk[/url], [link=http://inijznmksduz.com/]inijznmksduz[/link], http://yxxtutwvudaw.com/