Buzzurlの中の人日記

最近Hadoopを使うために5~6年ぶりにJavaをいじっています。

そんで、ちょっとばかり耐えがたいわけです。

例えばありがちな例題を挙げると、

["google", "検索エンジン","開発"]のようなタグ(文字列)のリスト(でも配列でもなんでもいい)を受け取って

[
 {tag=>"google", enc=>"google"},
 {tag=>"検索エンジン", enc=>"%E6%A4%9C%E7%B4%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3"},
 {tag=>"開発", enc=>"%E9%96%8B%E7%99%BA"}
]

のようなハッシュテーブルのリストに変換しなさい。

ただしパーセントエンコーディングを行う関数(でもメソッドでもなんでもいい) uri_encodingは与えられているものとする。

こんなこと、Webアプリケーションではよくやるじゃないですか。

んで、実際Perlなんかでは結構簡単に書けて

my @tags;
#@tags : ("google", "検索エンジン","開発") はモデルとかから取得

my @ret = map{ { tag=>$_,enc=>uri_encoding($_) } } @tags;

まあこんな感じじゃないですか。

これをJavaで書くとこんなんなります。

List<String> tags;
//tags の中身はモデルとかから取得

List<Map<String,String>> result = new LinkedList<Map<String,String>>();
Iterator<String> i = tags.iterator();
while(i.hasNext()){
    String tag = i.next();
    Map<String,String> m = new HashMap<String,String>();
    m.put("tag", tag);
    m.put("enc", uri_encode(tag));
    result.add(m);
}

こんなにも・・!!こんなにも苦しいのならば型などいらぬ!!

とか暗黒面に落ちそうになってしまいました。


これ以外にもWebアプリケーションなんかだとクエリーが全部文字列で来るけど、妥当性検証のためにintに変換してintと比較とかするのもJavaだとクソ面倒です。(例えば今表示している0件目ページの次の100件を表示するためにoffset=100とかをGETパラメタで受け取るとかそういう場合。こういうのはフレームワークが吸収してくれるんでしょうか?)


そんで、Javaのリハビリとしてバリアント型を作ってみました。

どうせWebアプリケーションのコントローラとかHadoopでやるようなテキスト処理だと、使う型はせいぜい文字列、整数、日付、リスト、ハッシュおよびそれらの組み合わせと相互変換なわけです。

こういう簡単なことは簡単に書けるように、これらを全部つっこめるvarクラスを作って、例えばさっきの問題ならこんな風に書けるようにするのがゴールです。(lambdaはファンクタのための抽象クラス、$はhashとかmapとかの関数的なクラスメソッドを入れておくためのクラス。)

var tags = $.list("Google", "検索エンジン", "開発");
lambda tag2hash = new lambda(){var f(var tag){
  return $.hash( "tag", tag, "enc", uri_encode(tag) );
}};
var result = $.map(tag2hash, tags);

んで、書いたのがコレ(var.java)

1ファイルにまとめるために無理やりpublicじゃない内部クラスを大量に使ってますが気にしないでください。

varクラス(クラス名が大文字で始まらないけど勘弁してねw)にmainついてますが、もうJavaソースには見えませんw

JavaでhackするというよりJavaをFxxkしてる気分になりました。

public class var {
    public static void main(String[] args){
        lambda square = new lambda(){var f(var v){
            return new $(v.i() * v.i());
        }};
        lambda say = new lambda(){var f(var v){
            System.out.println(v.display());
            return var.NIL;
        }};

        //文字列
        var name = new $("James");
        say.apply(name);

        //文字列と数値の混合リスト
        var ls = $.list(1, "2", 3, 4, 5);
        //リストの各要素を2乗したリストを返す(数値は自動変換)
        say.apply($.map(square, ls));
        //cdr(笑)
        say.apply(ls.cdr());

        //入れ子のハッシュテーブル
        var hash = $.hash(
          "John", $.hash("sex", "male", "age", 20),
          "Eva",  $.hash("sex", "female", "age", "unknown"),
          "Abe",  $.hash("sex", "unknown", "age", "25")
          );
        say.apply(hash.get("John").get("sex"));
        say.apply(hash.get("Nobita").get("sex"));
        say.apply(hash.keys());
        say.apply(hash);
    }
}

このmainを実行するとこんな感じ。

$ java variant/var
"James"
(1 4 9 16 25)
("2" 3 4 5)
"male"
nil
("John" "Abe" "Eva")
(("John" => (("age" => 20)("sex" => "male")))("Abe" => (("age" => "25")("sex" => "unknown")))("Eva" => (("age" => "unknown")("sex" => "female"))))

会社に来るついでにHxH25巻を買って読んだ。

もちろんジャンプ本誌でも読んでる、どころか各週3回は読み直したのになんでこんなに面白いのか。

あまりに面白いのでなんか電車の中で涙ぐんでしまった。はたからみたらキモかったと思う。別にオチはないけどおまえらもっとHxHを読むといいと思いました。

HUNTER×HUNTER NO.25 (25) (ジャンプコミックス)

HUNTER×HUNTER NO.25 (25) (ジャンプコミックス)
価格 : ¥410 (税込)
メーカー : 集英社
→Amazonで詳細を見る
→ECナビリストで詳細を見る
おすすめ度 :
レビュー

powered by ECナビ リスト

ECナビリストていう昔作ったサービスがあって、全然ふるわないんですが、これをなんとかしようぜとかいうブレスト的なミーティングに出たけど、改めて使うとECナビリストめっちゃ素晴らしくてびびる。書いた人すげーよ。僕とunkだけど。

↓こんなん簡単につくれるんだぜ?全部僕のアフィリエイトリンク付きで。

動かないなーとおもったら改行を<br>に変えるオプションがついてて腐ってただけだった。

以前買ったSICPだけど、4、5章でつまづいていた。
ざーっと読んだけど、4,5章は演習問題をがっちりやらないと絶対理解できないと思って、そのうちやろうで放置してしまっていた。
なんとかするために社内で何人かに声をかけて社内でSICP読書会をすることにした。

第一回は1/16(水)

計算機プログラムの構造と解釈

計算機プログラムの構造と解釈
価格 : ¥4830 (税込)
メーカー : ピアソンエデュケーション
→Amazonで詳細を見る
おすすめ度 :

何年も前から言い続けてるけどいい加減引越ししよう。
会社から徒歩10分くらいのところに。
このロケーションだと猫飼うのはあきらめることになるけど・・・
HOME [1] [2] [3] [4] [5] [6] 次のページ >>
プロフィール
HN:
ajiyoshi
性別:
男性
自己紹介:
プログラマです。
ソーシャルブックマークサービス「Buzzurl」の開発者です。

はてなブックマークカウンタ


旧*「ふっかつのじゅもんがちがいます」カウンタ
Buzzurl

powered by Buzzurl

Twitter

カレンダー
08 2008/09 10
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
最新コメント
[09/08 かすが]
[09/03 セフレ]
[09/03 家出掲示板]
[08/25 出会い系]
[08/05 出会いせ]
最新トラックバック
バーコード
ブログ内検索
忍者ポイント
カウンター
アクセス解析
あわせて読みたい
あわせて読みたい
Powered by ニンジャブログ  Designed by ゆきぱんだ
Copyright c *「ふっかつのじゅもんがちがいます。」 All Rights Reserved
お買い得商品満載「楽市楽座」 / 忍者ブログ