2011年5月11日水曜日

bot_n_vengioの使い方

先日、新宿ロフトプラスワンに見に行ったイベント。『飯野賢治とヨシナガの「気になること。7」』にて、ヨシナガさんが「ブランド力測定」という面白いネタを披露されていた。

そもそも、ものの名前に「ヴ」が入っていたら、なんかカッコイイぞ、という思いつきから始まった試みらしい(例:ヴンコヴォン、ヴェンジョ)。

ヨシナガさんは海外の主要ブランド、及び109に出店しているすべてのブランドの名前を検証し、各文字がどのくらいブランド名に用いられているかを抽出。例えば、「イ」という文字は、今回対象としたブランド名に41回登場するらしい。

これをブランドのポイントとし、合計値を文字数で平均する(平均しないと長い名前が有利になるので)、という方式でものの名前におけるブランド力を測定するというのだ。

ブルガリならば、(ブ:12 + ル:45 + ガ:13 + リ:29) ÷ 4(文字) = 24.75 がブランド力だ!

大変面白い試みなので、これをシステム化したいと思い、このロジックを組み込んだTwitter botを作ってみた。

それがこちら。
bot_n_vengjo
http://twitter.com/#!/bot_n_vengio

このロジックを使ったシステムを何か作ろうと悩んでいたときに、どうしても「ヴンコヴォン」や「ヴェンジョ」というキーワードを使いたかった。そこでいろいろ考えていると、Twitter bot… ん? ボット!? ボット・ン・ヴェンジョ? …!!?

我、天啓を得たり!

というノリでTwitter botに決定し、実装してみた。

実装したあと、ヨシナガさんがイベントで使ってらしたデータが欲しいな、と思い、Twitterでお願いしてみた。


すると…。


ヨシナガさんからDM キタ━━━━(゚∀゚)━━━━ッ!!

と、いうことで見事いただいたデータを反映し、完成!!

使い方は以下のとおり。

まず、@bot_n_vengio宛にMentionする。
(※イインジとは、「イイノケンジ」をよりブランド力が高くなるように操作した名前)


すると3分に一回動くbotがMentionを検知し、ブランド力をつぶやく。


と、いう簡単なもの。

みなさんも是非、お試しくだされ。


ちなみにソースコードはこちらに公開してます。
https://github.com/daiksy/bot_n_vengio/blob/master/DaiksyBotServlet.java

急いで作ったのと、github使うの初めてなもので、データの持ち方がブサイクだったり、文字化けしてたりでかなり恥ずかしい事になっているが、まぁご愛嬌ということで。

ちなみにカタカナしか数値化できません。その他の文字を送っても、すべて0ポイントとして計測されます。
ひらがな対応は面倒くさい忙しくてそこまで手が回らなくて…。

追記:
僕秩でも紹介していただきました。
http://www.dfnt.net/t/photo/column/brand.shtml

2011年5月8日日曜日

僕が置いてきたものがすべてそこにあった〜飯野賢治とヨシナガの「気になること。7」



新宿ロフトプラスワンに行ってきた。

目的はこれ

生の飯野賢治さんに会える!? と思ってはるばる大阪から東京まで行ってきた。

飯野賢治さんは、僕の人格形成に多大な影響を与えてくれた人だと思う。元々はゲームクリエイターで、『Dの食卓』とか、『エネミー・ゼロ』を作った人。

ソニー・コンピュータエンタテインメントのイベントで、『エネミー・ゼロ』のプラットフォームをプレイステーションからセガサターンに移す、という発表をしてしまうというぶっ飛んだ人で、そういう感覚が高校生の僕にとって最高にクールだった。

当時は彼の名前がつくものはすべて目を通した。

雑誌のインタビュー、著作、そしてもちろんゲーム。たぶん、あの頃に世の中に出ていた飯野さん関連の物は、ほとんど押さえていたんじゃないかな。むさぼるように読んだり、遊んだりした。

『エネミー・ゼロ』はゲームをやりながらガチで泣いた唯一のゲームだし、『リアルサウンド〜風のリグレット〜』は細かい部分はもう覚えてないけれど、あのゲームをプレイしていた頃の匂いとか、空気感とか、そういうものは消えずに残っている。

僕が世の中のいろいろなものに対して、格好いいとか、面白いと思うための物差しを形成するうえで、飯野さんの影響は相当受けていると思う。

飯野さんの作品を知らなければ、マイケル・ナイマンの来日コンサートにはたぶん行ってななかっただろうな。

もう一つ、新宿ロフトプラスワンの話。

高校生の頃、「誠のサイキック青年団」という深夜ラジオが大好きで、リスナー向けのイベントなんかにも良く行っていた。
その番組のパーソナリティに竹内義和さんという方がいて、この人のセンスとかも僕の物差しに凄い影響を与えてると思うんだけれど、彼が良く新宿ロフトプラスワンでイベントをやっていたわけよ。
で、そのイベントが面白そうで、ムチャクチャ行きたいんだけれど、当時高校生だった僕がそんなに気軽に東京まで行けるはずもなく、新宿ロフトプラスワンといえば物凄い憧れの場所だった。

で、今回。飯野さんのTwitterでこのイベントの存在を知ったのだけれど、「飯野賢治 + 新宿ロフトプラスワン」ってもう僕にとっては冷静さを保てなくなるほどの組み合わせだったわけだ。なんでこんなイベントを第7回に到るまで知らなかったのかと、後悔するほどに。

だから本当に前の晩は興奮して眠れなかった。

こんなに幸せな空間は、ここ数年でなかったもしれないと思うほどに幸せだった。

新宿ロフトプラスワンの壁には、歴代の出演者のポラロイド写真が貼ってあるのだけれど、休憩時間にそれを見てリアルに泣いたよ。

竹内義和さんとか、中島らもさんとか(らもさんは大阪人にとって特別な人だからね)、僕が好きだった人たちの写真がたくさんあるし、振り返れば檀上に飯野さんがいるし、そしてここは新宿ロフトプラスワンだし…。

青春の頃に、僕が大切にしていたもの、そして少しずつ忘れたり、手放していったものが、あの瞬間、全部そこにあったから。

イベントのレポートを書こうと思ったら、ただのつまらない自分語りになってしまったけれど、このイベントに携わった全ての人達に感謝したいです。

本当に、本当にありがとうございました。

今、このタイミングでこういう経験ができて良かった。

2011年5月5日木曜日

Scalaで書いたコードをdllにしてC#から呼んでみる。

最近、Scalaが楽しくていろいろ勉強しているのだが、そもそもC#erな僕はJavaをよく知らないため、この「Javaを知らない」というのはちょくちょく学習のハードルになったりする。

いろいろScalaについて調べてみたところ、JVMだけでなく、.netでも動くということらしいので、勝手知ったる.net上で勉強したら、やりやすいかもしれないぞ、と思った。

そこで、Scalaで書いたコードをdllにし、C#で呼び出してみる。

前提条件として、JDKとScala2.7.7がすでにインストールされていること。OSはWindows 7。
(Scala2.8.1だと、後述するscala-msilの実行時にエラーになった)

まずは、ScalaのコードをMSILという.net framework 用の中間言語化するための"scala-msil"をインストールする。
これはsbazを使って簡単にインストールできる。

コマンドラインプロンプトを管理者権限で実行し、以下のコマンドを叩けば良い。

>sbaz install scala-msil

これでインストールできているはずだ(2.8.1でもここまでは上手く行った)。

続いて、C#から呼び出されることになるプログラムをScalaで書く。

package CalcUtil {
    class Calc {
        def hoge(num:Int): Int = {
            num * 10
        }
    }
}

ファイル名は「CalcUtil.scala」とした。
検証していないが、パッケージ名とファイル名が大文字小文字含めて一致しないといけない、という記事をどこかで読んだので、注意する必要があるみたい。

さて。このソースをMSILにコンパイルしよう。

>scalac-net CalcUtil.scala

これでOK

ちなみに、scala-msilが入っていれば、

>scalac -target:msil (以下略

でもできるみたい。

これで 「CalcUtil.msil」ができあがったはずである。

あとは、.net Frameworkのilasm.exeでdll化すれば良い。

コマンドは以下のような感じ。

>C:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe /DLL CalcUtil.msil

Microsoft (R) .NET Framework IL Assembler. Version 2.0.50727.5420
Copyright (c) Microsoft Corporation. All rights reserved.
Assembling 'CalcUtil.msil' to DLL --> 'CalcUtil.dll'
Source file is ANSI

Assembled method CalcUtil.Calc::.ctor
Assembled method CalcUtil.Calc::hoge
Assembled method CalcUtil.Calc::$tag
Creating PE file

Emitting classes:
Class 1: CalcUtil.Calc

Emitting fields and methods:
Global
Class 1 Methods: 3;

Emitting events and properties:
Global
Class 1
Writing PE file
Operation completed successfully

これで「CalcUtil.dll」が完成!! ヽ(´ー`)ノバンザーイ

さあ、あとはこれをC#から呼び出すだけだ。

VisualStudioを起動し、参照設定でCalcUtil.dllを読み込もう。


で、以下のコードを書く。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CalcUtil;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Calc c = new Calc();
            Console.WriteLine(c.hoge(99).ToString());
        }
    }
}

ここでビルドを実行すると、エラーが出た。


Scalaのオブジェクトを理解できないようだ。

scala-msilのインストールが無事に完了していれば、 %SCALA_HOME%¥libの配下にこれを解決するためのdllが入っているはずである。

predef.dll と scalaruntime.dllである。

これらを参照に追加しよう。


これで問題なくビルドが通るはずだ。

実行すると……。


キタ━━━━(゚∀゚)━━━━ッ!!

これでミッション完了!!

しかし、これだけの手間をかけてnet上でScala動かしてゴリゴリ勉強しようとは思わんなー。

素直にJVM上でInteliJなどのIDEのお世話になりながら勉強しようと思う。

ScalaのソースコードをInteliJで読めるようにしてみる

Scalaの勉強のため、いつでもScalaのコードを読める環境を作ってみた。

先日参加させてもらった『Scala本読書会』で、InteliJがいいよと教わったので、やってみる。

まずはInteliJのインストール。

ここからダウンロードしてInteliJをインストール。

InteliJが起動したら、[File]-[Settings]の[Plugins]を選択

右側にあるTabの[Available]を選択し、選択エリアに「Scala」と入力。

下の表示エリアに出てきた[Scala]を選択し、右クリックでインストール。


続いて、Scalaのソースコードをダウンロードしよう。

ここから scala-2.8.1.final-sources.tgz をダウンロードし、展開。


あとはInteliJで開くだけ。


…でいいのかな?

2011年4月17日日曜日

菱形継承問題をもう少し詳しく考えてみた。

以前に書いたエントリーで、Scalaにおける菱形継承問題を取り上げた。

Scalaでは、トレイトを用いて菱形継承関係を作った場合、クラス定義の際の記述の順番によって最終的な具象クラスの振る舞いが決まる、ということだった。

つまり、

"class MyPet extends DogTrait with CatTrait" と書けばMyPetはの振る舞いを優先し、
"class MyPet extends CatTrait with DogTrait" と書けばMyPetはの振る舞いを優先する。

ここで一つ問題が生じる。MyPetの状態によって、犬と猫の振る舞いを使い分けたい場合はどうすれば良いのか。

というか、そもそもそんなシチュエーションが存在するのだろうか。

これは、菱形継承の根本に関わるような気がしていて、いろいろ自分なりに考えた結果、こういう考えで良いのではないか、という結論に至ったのでちょっと書いてみたいと思う。

異論、反論は全然OKなので、「お前、そりゃ考えが足りんよ」などのご意見があれば是非いただきたい。

■新しいマジンガーを作ってみよう。

今回は概念のお話なので、具体的なコードは書かない。
そこで、今回の概念を表すクラス図をご覧いただこう。

僕はこれから新しいマジンガーを作りたい。

新しいマジンガーは、マジンガーZとグレートマジンガー、両方の性質を備えさせたいので、マジンガーZとグレートマジンガーを多重継承しようと思う。これら二つのクラスは、そもそもスーパーロボットからの派生である。

スーパーロボットといえば空を飛ばねばならない。しかし、ロボットによって飛び方は様々なので、スーパーロボットクラスにおける「空を飛ぶ」という振る舞いは抽象メソッドであり、それぞれの具象クラスで具体的に実装されている。

マジンガーZは、ジェットスクランダーという外部装置を使って空を飛ぶ。
グレートマジンガーは、内蔵されているスクランブルダッシュという装置を使って空を飛ぶ。

さて、ここで新しいマジンガーを見てみよう。

我らが新しいマジンガーは、「ブレストファイヤー」「サンダー・ブレイク」という二種類の必殺技を使うことができる。これぞ多重継承の醍醐味。その辺の悪役ロボットは一瞬にして倒せてしまいそうだ。独自の必殺技メソッドをさらに追加実装しても良いかもしれない。

さて、ここで皆さんお分かりのとおり、問題が生じる。

新しいマジンガーは、どうやって空を飛ぶのか。つまり、ジェットスクランダーを使うのか、スクランブルダッシュを使うのか、という問題だ。
これが菱形継承における曖昧さの問題である。

この曖昧さに対しては、以下のアプローチがあると思う。

・ジェットスクランダーを使って飛びたい。
→class 新しいマジンガー extends グレートマジンガー with マジンガーZと書け!

・スクランブルダッシュを使って飛びたい。
→class 新しいマジンガー extends マジンガーZ with グレートマジンガーと書け!

・新しい方式で飛びたい
→「空を飛ぶ」メソッドをオーバーライドしろ!

・状況に応じてジェットスクランダーとスクランブルダッシュを使い分けたい。
→そもそも、要求として「空を飛ぶ」という振る舞いが共通の意味を持たなくなっているのだから、マジンガーZとグレートマジンガー双方にて「ジェットスクランダーで飛ぶ」「スクランブルダッシュで飛ぶ」というようにメソッドをリファクタリングしろ!

こういう事で良いのではないだろうか?

ここでのポイントは、最後の「使い分けたい場合どうすれば良いか」という部分である。
使い分けたい、という要求が発生した時点で、「空を飛ぶ」というメソッドはそれぞれのクラスにおいて共通の意味を持たなくなっている。つまり、「どのように飛べば良いのか」、という新しい意味付けがメソッドに対して行われていることになる。
それはつまり、継承ではなくなっているという事だ。

ちなみに、我らが新しいマジンガーは、オーバーライドして反重力エンジンを用いた、翼の不要な飛び方を実装してみようと思う。

と、ここまで書いておいて一つ大きな問題に気づいた。

上記クラス図に、「歩く」というメソッドを追加したモデルで考えみよう。

新しいマジンガーに対して、「マジンガーZのように歩き、グレートマジンガーのように飛べ」という要求があった場合どうすれば良いのだろう……。

適切なモデリングが思い浮かばないので、ちょっと宿題とさせていただきたい…。

2011年4月15日金曜日

今、しんどいと思ってる人に伝えたい僕の話

僕が24歳のときに父親が亡くなった。

結婚する前の年になるのかな。

ちょうどその頃は仕事でも人生最大級のデスマーチ中で、夜中の病院で父親の臨終を迎えた瞬間に現場から電話が鳴るようなクソッタレな状況だった。


あの頃が今のところ人生で一番辛かったときかな。

転職とか、結婚とかいろいろと人生の転機について考えていた時期で、そのときにデスマーチと父親の死が重なって、心のなかはグチャグチャだった。


オレの人生なんなんだろうって思ったよ。やっと大人になって、お酒飲みながら父親と語り合いたいとか思ってたのに、そういう機会は結局無かったし、残業代もつかない安月給で何百時間も働かされて、顔とかアレルギーが出てひどかったし。


お葬式の日は本当にしんどかった。

息子を亡くしたおばあちゃんの気持ち、旦那を亡くした母親の気持ち、父親を亡くした僕と弟の気持ち。

そんな事を考えていると、気が狂いそうになった。

おそらく、家族皆が似たような気持ちだったかもしれない。

お葬式が終わって、最後に母親がお坊さんにこんな事を聞いた。

「お葬式が終わって、主人は安らかに目を閉じてますけど、わたしたちはちっとも救われていません。どうしたらいいんですか?」

するとお坊さんはこんな事を言う。

「はい。今、この瞬間に残された人が救われることはありません。でも、騙されたと思って、2年だけ我慢してください。大変長い2年間に思われるかもしれないけれど、その期間だけ我慢してください。人間の悲しみとか、そういうものを癒すのは時間だけなんです」

その時は、にわかに信じられなかった。

で、あれから8年経った。今でも時々父親の事を思い出して、少しだけ悲しかったり、寂しい気持ちになるけれど、あの日の気の狂いそうな辛さはもうすっかり無くなった。これが「癒された」というのかどうかは分からないけれど。
あの経験があったから、割とつらいことは乗り越えられるようになった。ちょっとの間我慢すれば、辛さは通り過ぎたり、気にならなくなったりするってわかったから。

最近、自分や、友人や、周りの人達がつらそうにしているのを見て、なんとなくそんなことを思い出したので書いてみた。

2011年4月14日木曜日

ちょっとだけ休んでまた歩く。

個人的に気持ちの整理をつけたくて、ちょっとつまらないエントリーを書いてみる。

この数日、社会人になってからあまり経験したことがないくらい落ち込んでいた。

人とあまり関わり合いになりたくなくて、TwitterとかFacebookにもログインしないようにしていたし、会社でも極力周りと会話しないようにしていた。とはいっても仕事をするうえで最低限やるべきことはやってたけど。

数ヶ月ほど、いろいろなことがあって、それは主に仕事上のことなんだけれど、それでどうしても気持ちが後ろを向いていた。

これではいかんな、と思って、前を向きたくて、踏ん張って、ちょっとしたチャレンジをしてみようと思った。

自分の中では、少し背伸びが必要なチャレンジ。

どのようなチャレンジなのかは、まだ詳細を書けるほど気持ちの整理ができてないから書かないけれど、今までの人生で自分が積み上げてきた色々な知識とか、経験とか、そういうリソースを結構めいっぱい使わなきゃいけないような、そんなチャレンジ。

思い切って、勇気を出して、「自重は悪だ」という信念を胸に、飛び込んでみた。

世の中には、自分でも信じられないくらい、自身のキャパシティを大きく超えた成果を手にする奇跡のようなこともあれば、反対に自分の全部をつぎ込んでもそれらがすべて無駄になるような残酷なこともある。

今回の結果は後者だった。まぁ、人生ってそんなものだ。

片思いの初恋がうまくいったなんていう話をあまり聞いたことがないように、憧れて、必死で手を伸ばして、努力しても得られないものはある。世界は残酷で、無慈悲だ。

「自分の思い通りにいかない事」なんて、30年以上も人生過ごしていれば何百回と経験してきたはずなのに、それでもやっぱりしんどい。単に自分の能力が無いだけのことなんだけれどね。

で、仕事から帰って、ヤケ酒飲んで、妻に心配されたりするんだ。

彼女の「何かあったの?」という言葉が余計に辛くて、ちょっと自分の機嫌が悪くなったりして、さらに自己嫌悪に陥るというありがちな負のパターンに堕落していく。


なんだコレ?

どんなにうずくまってても、お腹は空くし、眠くなるし、仕事に行かなきゃいけないし、そうやって生活は続くわけだ。

そうして続いていく日々を、僕はどれだけの時間、下を向いて過ごすのだろうか……。

前を向くための力が欲しい。空を見上げるための自信が欲しい。

ちょっとだけ休んで、また頑張るよ。

だって笑って生きていたいからね。