Hatena::ブログ(Diary)

ヤルキデナイズドだった

Yarukidenized

2011-03-07

[]ハッシュの代入式を返り値にしたときのバグっぽいもの 21:43 ハッシュの代入式を返り値にしたときのバグっぽいものを含むブックマーク

use 5.010;
use strict;
use warnings;
use Data::Dumper;

sub merge_hash {
    my %a = (X => 1, Y => 2);
    my %b = (Y => 3);
    my %c = (%a, %b);
}

my %ret = merge_hash();
print Dumper \%ret; # --> {'Y' => undef}

関数の返り値がハッシュ変数への代入式の値で、かつ左辺に重複するキーが含まれているとき返り値が壊れるっぽい。

環境は This is perl 5, version 12, subversion 1 (v5.12.1) built for darwin-2level

追記

perl 5.13.10 では問題ない({'X' => 1, 'Y' => 3} が返る)ことを確認しました。

[][]Web::Scraper の覚書 20:57 Web::Scraper の覚書を含むブックマーク

use Web::Scraper;

my $scraper = scraper {
    #       CSS sel. or XPath | name   -> scalar   | 'TEXT' 'HTML' '@attr'
    #                         | name[] -> arrayref | { } sub{ }
    process 'foo>bar>baz.spam', 'item'            => 'TEXT';

    process 'img', 'images[]' => {
        'src' => '@src',
        'alt' => '@alt',
        'size' => sub {
            my $elem = shift; # isa HTML::Element
            $elem->attr('width') * $elem->('height');
        },
    };

    process 'ul', 'ul' => scraper {
        process 'li', 'li[]' => 'TEXT';
        result 'li'; # makes the scraper result [TEXT, ...]
                     # instead of {li => [TEXT, ...]}
    };
};

# custom UA
use LWP::UserAgent;
my $ua = LWP::UserAgent->new(agent => 'Mozilla blahblah');
$scraper->user_agent($ua);

# something to be scraped
use File::Slurp qw(slurp);
use URI;
my $content = slurp('example.html');
my $uri = URI->new('http://example.com/');

# do it
my $result;
$result = $scraper->scrape($content);
$result = $scraper->scrape($uri);
$result = $scraper->scrape($content, $uri); # as base URI

[]フリープランでも GitHub にプライベートリポジトリを作れる裏ワザ 15:12 フリープランでも GitHub にプライベートリポジトリを作れる裏ワザを含むブックマーク

まえおき

GitHub のフリープランはパブリックリポジトリを無制限に作れますが、プライベートリポジトリを作ることはできません。 BitBucket ならどっちも無制限なのに! なんとかして自分専用のリポジトリを作りたい! タダで!

というわけでそんな方法を見つけました。

tl;dr

gist.github.com で プライベート gist を作れ! master 以外のブランチを使え!

解説

gist.github.com はいわゆる pastebin で、適当なコード片を貼り付けることができます。各コード片(gist)は git リポジトリになっていて普通に clone することができます。

Web インターフェースから行えるのはファイルの作成と編集、削除だけですが、リポジトリをローカルに clone してしまえば普段通りの作業ができるわけです。

しかし、このリポジトリにサブディレクトリを作って push すると次のような警告が表示されてしまいます。

f:id:uasi:20110304195225p:image

メインの GitHub リポジトリと差別化するためか、 gist リポジトリにサブディレクトリを作ることを禁じているようです。 ${repo}/hara/ 以下に置いた peko.txt は ${repo}/foo.txt と同列に表示されています。

ただし。 Web インターフェースに表示されるのは master ブランチの内容だけです。 master 以外のブランチに何が入っていようが文句は言われません。

つまり、適当なファイルを置いた master ブランチを隠れ蓑にすれば、他のブランチを自由に勝手に無尽蔵に使うことができるのです。

まとめ

  • gist.github.com でプライベート gist を作る
  • master には適当なファイルを置いておく
  • master 以外のブランチで気ままに開発!

免責

gist のリポジトリのサイズに上限があるかどうかは確かめていません。こういう使い方をして怒られても僕は知りません。何も知りません。

[]一発で App::FatPacker するスクリプトを(だいぶ前に)書いた 14:56 一発で App::FatPacker するスクリプトを(だいぶ前に)書いたを含むブックマーク

のを Twitter でちょろっと言って放置してたんだけど、たまーに参照されてるみたいなのでちゃんと書いとくことにしました。

https://gist.github.com/385661

$ fatpack trace myscript.pl
$ fatpack packlists-for `cat fatpacker.trace` >packlists
$ fatpack tree `cat packlists`
$ (fatpack file; cat myscript.pl) >myscript.packed.pl

ごちゃごちゃーっとしたのが

$ fastpack myscript.pl > myscript.packed.pl

こうなります。ピャッとね。

追記

こういう感じで依存モジュールをまとめて pack すれば便利かも。

gfxgfx 2011/03/08 01:31 5.13.xだと修正されてますね。

uasiuasi 2011/03/10 20:30 確認しました。ご指摘ありがとうございます。