Vim+ctagsでパッケージ名つき関数についてジャンプできるようにする

Perlを使うようになってからはコード書きにVimを使うようになったのだが、Eclipseと違ってコードを追いかけるのが大変。

そこでctagsを使ってタグファイルを生成してそれを読み込ませるようにしてみたところ、シンボル上でCtrl-]を押して定義にジャンプしたりCtrl-tを使って戻ったりできるようになり若干楽になったのだが、なぜか

    Hoe::Fuga::hehe(0);

のようなパッケージ名つき関数呼び出しなどではタグジャンプしてくれない。

生成されたタグファイルの中身を見てみるとそもそも「Hoe::Fuga::hehe」のエントリがないので、ctagsに素敵なオプションをつけることで生成してくれたりしないかななどとネットで情報を探してみたのだが、なぜか対策が見つからなかった。

これは個人的にはイタいのだが、みんな困ってないのかな?…それはさておき、次のようなスクリプトを書いて「Hoe::Fuga::hehe」のエントリを追加するようにしてみた。

fqmn:

#!/usr/bin/perl

use strict;

#MAIN
{
    die <<USAGE if scalar(@ARGV) != 2;
Usage: $0 TAG_FILE SOURCE_DIR
USAGE

    my $file = $ARGV[0];
    my $sourcedir = $ARGV[1];
    if ($sourcedir =~ m|/$|) {
        $sourcedir = $`; 
    }   

    open IN, $file or die "Can't open $file\n";
    my @lines;
    while (<IN>) {
        chomp;
        my $line = $_; 
        $line =~ /^([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)/;
        my ($word, $path, $pattern, $flag) = ($1, $2, $3, $4);

        if (defined($flag)) {
            if ($pattern =~ m|^/\^sub\s+|) {
                my $p = substr($path, length($sourcedir) + 1); 
                $p = $` if $p =~ /\.pm$/;
                $p =~ s|/|::|g;

                my $w = $p . "::" . $word;

                push(@lines, [$w, "$w\t$path\t$pattern\t$flag"]);
            }   
        }   

        push(@lines, [$word, $line]);

    }   
    close IN; 

    my @sorted = sort { $a->[0] cmp $b->[0] } @lines;

    for (@sorted) {
        print $_->[1], "\n";
    }   
}

これで、まず普通にタグファイルを生成して、

ctags -f tags.orig -R -h ".pm" /path/to/pm

次のようにして、

fqmn tags.orig /path/to/pm > tags

生成されたtagsを使うようにすればOK。これで快適になった。

DeNAに転職しました

6月13日付でDeNAに転職しました。

転職した理由はいくつかありますが、SIの旧来のビジネスモデルに限界を感じた
のが大きな理由の一つです。

前の会社ではいわゆるSIをしており、仕事の進め方はいわゆる
一括請負+ウォーターフォール型の開発が大半を占めていましたが、
このやり方にはいろいろ問題があると思っていました。

例えば、一括請負という契約形態は成果物が最初の段階でFIXしている場合には
有効に機能するかもしれませんが、ソフトウェア開発では大半のケースでは
成果物がFIXしていません。そのため成果物がFIXするまでの紆余曲折分を
バッファとして工数に積まないとリスクヘッジができませんが、コスト削減
したい顧客からはバッファ分を上乗せすることに難色を示されることが少なく
ありません。そうすると奇跡的にうまくいった場合でトントン、通常は赤字、
ということになってしまいます。

また、ウォーターフォール型の開発では要件定義・基本設計・詳細設計の
フェーズで成果物を定義しますが、ソフトウェアがどうあるべきかについては
実際に使ってみないと分からないことが多々あるため、完成物の顧客テスト等で
仕様変更による手戻りが多発するケースが多く、その分開発効率が低下して
しまいます。また一括請負の場合は手戻り分について顧客に追加費用を請求
することが現実的に難しいケースが少なくありません。

さらにSIの最大の問題は、仕事がコンスタントに発生するとは限らないことです。
大企業のお抱えのソフトベンダならいざしらず、独立系のベンダの場合は
毎回仕事を探してこないといけません。仕事が見つからない場合でも社員を
抱えている分の固定費は発生し続けますので、どうにかしようと単価の安い
案件に手を出したりリスクの高い案件に手を出したりするケースも出てきますが、
そうすると何も仕事をしなかった場合よりも多額の損失を出してしまうことも
少なくありません。

これらの問題をどうにかしない限り会社の先行きは明るくないと思っていたため、
どうするべきかずっと考えてきましたが、とりあえずの結論として
「SI以外でコンスタントな収益源を確立しつつ、SIでは契約面を含めて
アジャイルなアプローチでプロジェクトを進められるような案件を開拓する」
というところに辿り着きました。

そこで社内の上層部に働きかけたりしてこのようなビジネスを実現するため
いろいろ画策してみたのですが、残念ながら会社の方針などもあって
前の会社では僕の思うようなビジネスをすることは難しいことが分かりました。

もう一つ大きな理由として、ソフトウェア技術者でい続けたいという
ことがありました。

前の会社では自分と同じかそれ以上の年齢になるとマネジメントが仕事の主体と
なることがほとんどで、実際自分も最近はマネジメントの役割を
担うことがほとんどでした。

しかしながら、これから先も技術を活かした仕事をしたいという思いが自分の中に
強くあり、それが会社を変えないままでで実現できるか考えたところ、
かなり困難そうだという結論に達しました。

DeNAはいわゆるSIの会社ではありませんが、主にソーシャルゲームによって
「コンスタントな収益源を確立」が実現できており、また実力さえあれば
年齢に依らず技術者でい続けるためのキャリアパスが存在する会社ということで
転職先として考えました。

40代で技術者志望となれば日本のソフトウェア業界では受け入れてくれる
会社はそう多くないと思われますが、「年齢は関係ありませんよ」と快く
受け入れてくれたDeNAに感謝しています。

DeNAで何をするのかはまだ決まっていませんが、優秀な方が多く在籍する
会社ですので、切磋琢磨して技術者として成長して行きたいと思っています。

ちなみに本業ではJavaを使った業務システムの開発をすることはおそらく
なくなりますが、YmirやKvasir/SoraやT2などのオープンソース活動は
続けて行きたいと思っています。

Ymir-1.0.7をリリースしました

Ymir-1.0.7をリリースしました。詳しくは以下のページをご参照下さい。

http://ymir.seasar.org/news/2011051001

調べてみると、今回のリリースは実に1年半ぶりだったことが分かりました。ご利用いただいている皆様にはご不便をおかけして申し訳ありませんでした。

言い訳しておきますと、最近は開発自体が止まっていたわけではなく単にリリース作業を先延ばしにしていたという感じです。(ホントすいません…)

いろいろな不具合修正や機能拡張が入っていますので現状の1.0.6で困っていた方はぜひバージョンを上げてみて下さい。pom.xmlの「1.0.6」という記述を「1.0.7」にするだけです。

また「1.0.7-SNAPSHOT使い続けているけれどSNAPSHOTなんて実案件でリリースできないだろゴルァ!」という方もぜひ乗り換えていただければと思います。pom.xmlから「-SNAPSHOT」を削除するだけです。

何かご不明な点や困ったことや要望当ありましたらぜひSeasar-userメーリングリストにご連絡下さい。

それではよろしくお願いします。

「Javaルールブック」の改訂版を書きました

数年前に発売された「Javaルールブック」という書籍の改訂のお話がありチームT2のメンバ(id:shot6,id:yone098,id:c9katayama,id:skirnir)で改訂作業を行なって来たのですが、ようやく作業が完了しましてこの度2/15に発売されることになりました。

この書籍の改訂にあたり、たくさんの方にレビューをして頂きました。また編集の方にも大変お世話になりました。皆様ありがとうございました。

旧版のJavaルールブックはオブジェクト倶楽部(現・オブラブ)のサイトに「Javaコーディング規約2004」としてPDF版が公開されており、プロジェクトに適用したりしたことのある方も多いと思います。しかしながら公開されてからかなりの年月が経過してしまったため、今となっては内容が古いものが含まれていたり、Java5で導入されたGenericsを始めとする言語仕様の大幅な拡張やConcurrent APIのような追加APIに対応できていなかったりしていました。今回の改訂はJava6をメインターゲットとしており、最新の開発プロジェクトに十分適用できる内容となっています。

また、最近ではEclipseのようなIDE統合開発環境)を利用した開発が主流となっていることを踏まえて、IDEの利用を想定したルールを追加したり、付録としてEclipseのショートカット集を載せたりもしています。

以前のJavaルールブックを読んだことがある人もない人も、ぜひご一読いただければ幸いです。本書が皆さんの開発プロジェクトを円滑に進める助けとなることを願っています。

特攻の島

漫画 on Webで公開されている佐​藤​秀​峰さん(「ブラックジャックによろしく」や「海猿」の作者)の「特​攻​の​島​」の1巻分+最新話が今なら無料!ということで読んでみた。

作品を読み進めていると、主人公の苦悩ってIT業界と似ているところがあるんじゃないの?と思いパロディを作ってみた。

で勝手に公開するのもマズいと思い、Twitterで佐藤さんに「公開の許可をいただくにはどうすればいいですか?」と尋ねたところ、なんと快諾していただいたのでここに公開します。佐藤さん、ありがとうございます!

続きを読む

ボタンを押した直後の矢印キーのイベント

ちょっとハマったのでメモ。

(調査に協力してくれたid:yone098に感謝)

画面上にボタンを1つ配置してアプリを起動し、ボタンを押してから例えば「↑」キーを押すと、1回押してもActivity#onKeyDown()が呼ばれなかった。(2回目以降はOK)

Activity#dispatchKeyEvent()は呼ばれたので、

dispatchKeyEvent() > キーのデフォルトの動作 > onKeyDown()

かと思ったのだが、よく調べてみるとdispatchKeyEvent()にもACTION_DOWNのイベントが来ていないことが分かった。

というわけで、ボタンを押してから「↑」を押すと1回目のACTION_DOWNイベントは発行されないのかもしれない。

でもなんでなんだろ?