リニューアルのおしらせ

これまで、年に数回という更新頻度ではありましたが、自分としてはいちおうここがメインのブログという認識でした。
ですが、このたび自分もチームの一員として関わったライブドアブログの新CMSがリリースされましたので、
[リニューアル速報 PART7] 新管理画面、今日から使えます!|ライブドアブログ 公式ブログ
これを機に、これまでほとんど放置状態だったあちらのブログをメインと位置付けることにしました。


で、メインのブログの名前をどうしよう、と考え始めたところ、ここで使ってた『Hack Forever』(これも元々はシャレでつけた) がかなり気に入ってたので、やっぱりメインはこれにしたい!ということであちらで『Hack Forever』の名称を使用することにしました。
Hack Forever


で、ここの今後についてですが、いちおう少ないながらもブクマしてくれてる人がいたり、フィードを読んでくれてる人もいるので、ここはこのまま残して、これまでにも書いてきたようなちょっとしたコードの断片みたいのはこちらに書くようにしようと思ってます。
まあ、更新頻度は今までよりさらに落ちるかもしれませんが、、、これからもよろしくお願いします。


ちなみに『Hack Forever』の元ネタはこちら

FUCK FOREVER-JAPAN ONLY ミニ・アルバム

FUCK FOREVER-JAPAN ONLY ミニ・アルバム

mixi OpenIDでなんか作った

とりあえず雰囲気つかむ感じで、このまえの週末に作ってみました。→mopit

mixi OpenIDでログインしてテキストが書けるだけの簡単なプログラムです。いちおうマイミク認証もあります。さくらインターネットのスタンダードで動かしたかったので普通(?)にCGIです。
ソースはこちら http://coderepos.org/share/browser/websites/mopit/trunk

今回はとにかくてきとうにパーっと作るつもりで始めたので、フレームワークどころかO/Rマッパーすら使ってません (ややSledge風味ですが)。本当はこういう単純なやつでも、Catalystとかでちゃちゃーっとやっつけちゃったほうがスマートなのかもですが。まあ、とりあえずなにかの参考にしてもらうにはこういうのもいいんではないかと思いまして。
あと、肝心のOpenIDの仕様については、正しく理解している自信があまりないので、ひょっとすると間違いがあるかもしれません。(nicknameを取るとことかはこんなんでいいの?)

ちなみに、mopitは "mixi OpenID test" の略です

複数のPDFを一つのファイルに

またまた小ネタですいません。
いや、週末はYAPCのまとめとか書くつもりだったんですが、なんだかんだいろいろと脱線しまくってたところで、嫁が「ウチは新聞とってないから区報を読もうと思ったらどっかでもらってこないと」と言いだしたので、区報なんて区のサイトに掲載されてたりするんじゃないの?と思って見てみると、練馬区の場合、ちゃんとPDFデータが公開されてるんだけど、1ページ1ファイルになっててそれが毎号8ページ分、っていう形式だったので、これはめんどくさいということで、全部ダウンロードしてくっつけてしまえ、というスクリプトを書いてみました。
もっとネタ的に面白くなるかと思ったんだけど、CPANを漁ってCAM::PDFというモジュールを見つけたら、あとはこんな簡単にできちゃってもうネタにもなりませんね。CPAN万歳!

#!/usr/bin/env perl
use strict;
use CAM::PDF;
use LWP::UserAgent;

my $date = shift || do {
    my ( $y, $m, $d ) = ( localtime() )[ 5, 4, 3 ];
    sprintf "%d%02d%02d", $y + 1900, $m + 1, $d;
};

my $base_url = 'http://www.city.nerima.tokyo.jp/kuho/' . $date;
my $output   = './' . $date . '.pdf';

my $ua = LWP::UserAgent->new( keep_alive => 1 );

my $get_pdf = sub {
    my $url = sprintf "%s/page%d.pdf", $base_url, $_[0];
    my $response = $ua->get($url);
    die $response->status_line unless $response->is_success;
    return CAM::PDF->new( $response->content );
};

my $pdf = $get_pdf->(1);
$pdf->appendPDF( $get_pdf->($_) ) for ( 2 .. 8 );
$pdf->cleanoutput($output);

__END__

ちなみに、練馬区の区報は毎月1日11日21日の3回発行です。これを発行日に自動で実行するようにしといてメールで送りつけるとかもありですね。
あ、あとでYAPCのまとめもちゃんと書きますよ(のつもり)。

そろそろnipotan niteについて一言いっておくか

僕がnipotanもしくはハヘロロハムーさんのことを知ったのは、島男ネタのあたりからだったと思う。
この頃はまだ、自分にとってのライブドアという会社のイメージも、当時の一般的な人々と大差なく、まあなんというか、とりあえずかつてのオン・ザ・エッヂとはだいぶかけ離れちゃったのかなあ、とか思っていた。

そうしたイメージを覆してくれたのもまたnipotanのこのエントリーだった。
これを読んで、なんだかんだいってもコアのところは何も変わってない、今でも充分トンがった会社だということがわかって、なんだか嬉しく思ったりした。

そうこうしているうちに、例の事件が起きたわけだが、その時もまたnipotanのこのエントリーを読んで、自分は何もできないながらも心の中でエールを送るとともに、これを書いたnipotan自身にも、ある種の尊敬の念のようなものを抱くようになっていったのだった。

(中略)

そうして、晴れて採用の通知を受け取ることとなったのだった。

が、その喜びからほんの数日後、近くnipotanが米国へ赴任することになったらしいということを知ることになる。そして、nipotanを激励しつつ送り出すための会『nipotan nite』が開催されるという。参加者枠には、ライブドア関係者のみならず、Perl関連というのがあったので、とにもかくにも参加することにする。

とはいえ、まだライブドア入社は公にできない微妙なタイミング。「nipotanと一緒に仕事がしたくてわざわざ転職までしたのにー!キーッ!」とかいうネタ(?)も使えない。おまけに当日は仕事のほうでハマってしまい、遅れること1時間、ようやく会場に到着するも、オープニングのイリュージョンとか水室にぽ介ライブとかはことごとく見逃して乗り遅れ感満点の中、会場のみなさんはすでにそれなりに出来あがっていい調子になっちゃってるし、料理はもう残り物が少々って感じだし、そもそも業界内にお友達がそんなに多いわけではない自分としては、最初のうちはどうふるまってよいのか途方に暮れていたのだった。

が、やがて数少ない顔見知りな人にも会えてお話したり、ライブドア社内で自分の入社を知っている一部の人にご挨拶したりと、徐々に場に馴染めるようになっていった。(id:clouderさんにいたっては、彼のほうから声をかけてくださり、社内の話とかいろいろ聞かせていただきました。ありがとうございました!)

そうして最後、もう会もお開きという頃になって、nipotanに直接ご挨拶する機会を得た。「一緒にお仕事できると思ってたんですが〜TT」という恨み言に対して、「他にも優秀なエンジニアがいっぱいいますので、がんばってください」という温かい言葉をいただき、僕もnipotanの向こうでの活躍をお祈りしてます、といってお別れしたのだった。

というわけで、5月1日付けで株式会社ライブドアに入社しました。よろしくお願いいたします。

複数のCSSをまとめるApacheのハンドラ

ふと思いたって適当に書いてみました。
小さく分割されたバラバラなcssファイルを、1つのファイルに連結して出力します。更新日時を見て、分割ファイルのいずれかが更新されてたら、連結ファイルを書き換えます。(ついでにminifyもカマしてみてますがこれはどうかな?)
もちろん開発環境向けなわけですが、本番環境にはそのまま連結ファイルを上げればいいってことで。
今のとこ、configでディレクトリを指定してその下のcssファイルを全部読むって感じになってるんだけど、これだと結局1種類しかできないので素敵じゃないかもと思うので、どうしようか考え中です。

package Apache::ConcatCSS;
use strict;
use Apache::Constants qw(:common);
use Apache::Log ();
use CSS::Squish;
use CSS::Minifier qw(minify);

sub handler {
    my $r = shift;
    return DECLINED unless $r->content_type() eq 'text/css';

    my $log = $r->server->log;

    my $file  = $r->filename;
    my $dir   = $r->dir_config('CSSBaseDirectory');
    my @files = <$dir/*.css>;

    return DECLINED
        if ( -e $r->finfo && !if_modified( ( stat _ )[9], @files ) );

    my $squished = CSS::Squish->concatenate(@files);
    my $minified = minify( input => $squished );

    open my $out, '>', $file or return SERVER_ERROR;
    print $out $minified;
    close $out;

    $r->send_http_header();
    $r->print($minified);
    return OK;
}

sub if_modified {
    my $mtime = shift;
    for my $css (@_) {
        return 1 if $mtime < ( stat $css )[9];
    }
    return;
}

1;

__END__

=head1 NAME

Apache::ConcatCSS

=head1 SYNOPSIS

  # in httpd.conf
  <Location /css>
      SetHandler perl-script
      PerlHandler Apache::ConcatCSS
      PerlSetVar CSSBaseDirectory /path/to/css_directory
  </Location>

=head1 DESCRIPTION

=head1 METHODS

=head1 AUTHOR

Hiroaki Yoshida E<lt>yoshidaster at gmail.comE<gt>

=head1 SEE ALSO

L<CSS::Minifier>
L<CSS::Squish>

=cut

Mac OSXにNet::OpenID::Serverをインストール

とりあえず自分用メモです。たいしたことは書いてないのであしからず。

Net::OpenID::ServerはCrypt::DHに依存していて、これはMath::BigInt::GMP(もしくはMath::BigInt::Pari)が入ってないと遅くて使えないってことなんで、さっそくこっちを入れてみようとしたら、gmp.hがないっつって怒られました。Math::BigInt::GMP入れるにはあらかじめ自前でgmpを入れとかなきゃらしい。なんだか大変そうかも。

んで、弾さんのとこで、MacOSXgmp入れるにはワナがあるらしいってのを読んだんですが、
http://blog.livedoor.jp/dankogai/archives/50712932.html

最新の4.2.2ではこのへんは解決してる、ってことでいいのかな? (引用すべきとこはここじゃない?)

• New, rudimentary support for x86-apple-darwin and x86_64-apple-darwin. (Please see http://gmplib.org/macos.html for more information.)

New features of GMP 4.2.2

とりあえず普通に

$ ./configure
$ make
$ make check
$ sudo make install

ってやったらいけましたよ。
そんで、これさえ入ってれば、あとはツルっと

cpan> install Math::BigInt::GMP
cpan> install Net::OpenID::Server

なんだ、楽勝じゃん。メモるほどのことでもないなw。

今年のテーマ

どうもすっかりごぶさたです。今さらですがあけましておめでとうございます。
あらためて去年のココを振り返ってみると、4つしかエントリー書いてないという。。。全然ダメじゃん。。。まあとにかく、気持ちも新たに、今年はどんどんアウトプットしていくように心掛けたいと思います。

で、とりあえず今のところ思いつくかぎりで、今年のテーマみたいのを挙げてみました。

OpenID

とにかく今年はこれでしょう。もうここは押さえて当然というか、必須の項目になるのではないかと。

REST

なんとなくわかってるつもりではいるけど、AtomPubの仕様とか含め、正しくきっちりと理解しておきたい。

FUSE

個人的に今一番興味あるところ。何ができるのか、どんなところに応用したら楽しいのか、まだ模索中なんだけど、なんとなく面白いことができそうな予感。

Python

以前から、RubyPythonのどっちかに手を出してみようと思ってはいたところで、とりあえずPythonのほうに決めました。最近、Nokia携帯上でも動くってことを知ったので、そっちで何か面白いことできないかな、と企んでるとこ。

Flex (ActionScript)

こっちは今のところ、特にFlexで何か作りたいとかってよりも、ActionScript自体が面白そうだから、っていう要素が大きいかも。

Linux

普段から表面的には触ってはいるものの、カーネルがどうとかの深いところはさっぱりなので、今さらながら基本からきっちりと学びたいと思ってます。

とりあえずこんなところです。全部に手をつけるか、どれか一つにどっぷりハマるかはまだわかりませんが、このあたりでなんか成果を出したいところです。まあ、能書きはホドホドに、とにかく
"shut the fuck up and write some code"
を肝に銘じて、ガシガシとコードを書いて書いて書きまくる!が今年のテーマです。
(この言葉はネガティブなもんじゃなくて、コード書きにとっての合言葉だよね!)

というわけで、今年もどうぞよろしくお願いします。