Tuesday, January 31, 2006

Laboratory::Prep - 下調べの重要さ

研究という物を始めて、早一年が経とうとしています。私は現在大学4年生 ですので、そろそろ卒業研究の発表が控えています。

そんな最中、最近研究内容が変わってきました。といいましても、一応広い目で見れば研究内容は同じですが、細かい点を見るとやっていることは全然違います。

私は"文章から感情を読み取る"ためのソフトウェアを作る研究をしています。感情を理解するプログラムを作りたい、と思うようになったのは、人工無能に触れてからです。現在MINAとKaguyaを私のサイトで公開していますが、KaguyaはMINAの後継であり、MINAはARISAを元に作成したプログラムです。これらの人工無能は辞書式といいますか、あらかじめ登録されている内容に応答するしか能のないプログラムであります。

それだけの能で、感情を理解できるかどうかは、検証していませんから100%出来ないとは言いたくないですが。ともかく現在研究では全く違ったアプローチをとっています。自然言語処理のツールはもちろん使いますし、他の必要と思われるリソース作成も行います。

リソース作成はいいのですが、感情を推定するために必要な規定といいますか、ルールのようなものが必要となってきます。例えば感情の種類。現在も研究室内で議論されています(私は私なりの考えで感情の種類は絞り込んでいますが)。種類を決めるにはどうするか?主観的に絞り込んだとしても、明確な理由がなければ、後々その種類では過不足が発生すること必至です。では理由付けを行うために心理学を勉強すればよいのでしょうか?おそらく良いと思います。が、我々は心理学というフィールドで研究しているのではなく、情報処理というフィールドで研究しているわけです。心理学を用いた感情の分類が、情報処理分野で一概に通用するとは限りません。ここでまた”通用するのだ”、という理由、根拠が必要となってきます。

研究室内の議論を見聞きしていて思うのですが、この理由、根拠がいまいち主張されておらず、にも関わらず、教授らはとりあえずやってみようというノリが見られます。時折深く追求する物の。対象としているジャンルがジャンルですから、深く追求しにくいのだと思います。専門は情報処理であるのに、研究の内容に心理学や言語が絡んでくると、どうしても手探りになってしまいがちなのでしょう。

私も手探りに研究を行ってしまいがちです。言い訳しますと、研究をするという姿勢はまだまだ身に付いているとは思っていません。去年の4月から、初めて研究という物をしているわけですから。何かと行き当たりばったりなところも有りつつ、先生や先輩の助言を受けつつ、という感じです。

そうこうしている間に卒業研究も終了しなければならない時期にさしかかってきました。研究の成果物はどれほどのものかというと、秋頃から大して変わっていません。しかし一応成果物があるならそれを発表すればいいのではと思ったりもしましたが、夏から秋にかけて行った研究は全く納得のいく物ではないため、むしろ発表したくありません。

なぜに秋頃から研究の成果が大して変わっていないのか、ということを考えますと、半分以上C++の勉強に費やしているところがあったような気もします。プログラミング言語の勉強に時間を費やしてしまったということを考えると、システムを作るためのプログラミング言語の選択を誤ってしまったのかと思ってしまいます。

代わりに、C++の力が付いたと思って辛抱するしかありません。プログラミング言語を使う力は付けようと思ってもなかなか付けられないですし。何かを作ろうと思わない限り、私の場合は勉強するモチベーションが出ませんから。

研究の成果が大して変わっていない理由として、他に下調べが足らなかったことが考えられます。先の心理学の話もありますが、研究の対象が対象ですから、専門分野以外もそれなりに把握、マスターしておく必要があります。それを見くびってたつけが回ってきた、とでも言うべきでしょうか。最近になって私は日本語を勉強しました。…なんだそりゃ、と思うかも知れません。何を勉強するんだと思うかも知れませんが、具体的には日本語の文法を勉強しました。自然言語処理のツールを使い、つまり形態素解析の結果を用いて、様々な処理を行うわけですが、どうも日本語の文法に関する知識が乏しく、自分の知識にのみ頼っていたため、研究がなかなか進まなかったように思います。同様に、心理学も勉強しなければならないでしょうが(これは以前多少なりと勉強しています)。

日本語の文法を勉強したおかげで、ここ数日で一気に研究が進みました。今行っている研究で、どんな知識が必要で、何を勉強する必要があるのかをきちんと理解、整理できる能力。これは大事だなと最近感じます。

Programming::C++::ExplicitSpecialization - if文のごとく

templateを使って、あたかもif文のような真似が出来ます。ただし通常のif文はランタイムフェーズでの条件分岐なのに対し、tepmlateを使った場合はコンパイルフェーズの条件分岐になってしまいます。どういうことかといいますと、例えば次のコードがあるとします。

struct E {
 enum EnumList {
  hoge,
  foo,
 };
};

template<E::EnumList V> struct Hoge;

template<>
struct Hoge<E::hoge>
{
 void operator()() const { std::cout << "hogeだ!" << std::endl; }
}

template<>
struct Hoge<E::foo>
{
 void operator()() const { std::cout << "fooだ!" << std::endl; }
}

template<E::EnumList V>
void func()
{
 ... // 何らかの処理をする
 Hoge<V>()();
 ...
}

これで関数funcにE::EnumList型の値を引数で与えることなく、func<E::hoge>()などと書けば、関数内でif文による分岐をしなくとも、構造体Hogeのどの特殊化された定義を使えばよいかがコンパイル時に決定できます。

funcに引数としてE::EnumList型の値を与えなくて良いので、関数呼び出し時のオーバーヘッドは多少減ります。またifブロックがなくなるので、ソースの可読性も上がります。

一方で、特殊化した構造体Hogeを定義しないといけないので、若干面倒です。そこらへんトレードオフな感じがします。

面倒ですが、C++っぽくて素敵!とか勝手に思ってるので、私はつかえる時はこの特殊化による分岐をつかっていくような気がします。

Cocktail::HaZakura - 葉桜

日本酒ベースのカクテルを作ろうと思い、チャレンジしてみました。日本酒ベースなので、変に洋風のリキュールを混ぜると大変なことになりそうです。ですので、緑茶リキュール、サクラリキュールを使って見ました。
    葉桜(Original)
  • 日本酒 4/3 oz
  • 緑茶リキュール 1/3 oz
  • サクラリキュール 1/3 oz
以上の材料をシェイクします。どれもぶつかり合うこともなく、良い口当たりのカクテルになりました。和な味がします。

Thursday, January 26, 2006

Anime::DragonBall - 海外版ドラゴンボール

家庭教師で教えている小学生の子が、ドラゴンボールにはまっており(カードを見る限り、特にZにはまっているのかも) 、それに影響されて、最近再びドラゴンボールを見たくなりました。私が確か、小学生の頃にZが、中学生の頃にGTだったかな?が放映されていたような気がします。小学生なので、ストーリーの詳細まで理解できているはずがなく、今みたら再びはまってしまいそうな気がします(ウィキペディアのドラゴンボールの項目を黙々と読んでしまいました)。

GTよりZの方が印象に残っており、逆にGTについて色々調べたくなってしまいました。すると、なんと海外版のドラゴンボールがあるらしく。セリフが英語とかそんな次元ではなく、海外オリジナルストーリーだそうです。その名もドラゴンボールAF(http://otoco.gooside.com/text/dragonballaf.htm)なにやらスーパーサイヤ人5のみならず6だの7だの10だの出てくる様子。しかも誰彼かまわずスーパーサイヤ人になってるじゃないですか。…やめてくれ…と切に願ってしまいました。もう何でもありかとか思いました、見てて笑ってしまいましたけどね。

ちなみにストーリーに関してはこちらで詳細に書いてありました。

Society::livedoor - 社長辞任

今度は堀江さん、社長を辞任するんですね。さらに傘下だった企業から損害賠償請求されるとかされないとか。踏んだり蹴ったりですね。

そういえば、堀江さんはちょくちょく、どこからが違法なのかきちんと検討しているとテレビで言っていましたが、実は捕まったときのこともきちんと検討してたりして…ふと思っただけですけどね。

Wednesday, January 25, 2006

Cocktail::FairyBerry - 彼女へのカクテル

実際に彼女が居るわけではないですが、甘い物好きの女の子に飲んでもらいたいカクテルを作るために買ったストロベリーリキュール。これを使ったカクテルを作ってみました。
    フェアリーベリー(Original)
  • ウォッカ 2/3 oz
  • クレーム・ド・カカオ(白) 1/2 oz
  • ストロベリーリキュール 1/6 oz
  • 生クリーム 2/3 oz
本当は、生クリームではなくポーションを使いました。そのおかげであまりしつこくない、程良い甘みのカクテルになりました。そういえば携帯がW32Hになって、久々のカメラ付きなので、カクテルの写真を撮れば良かったと少し後悔…

追記:ちなみに度数は20度近く。ウォッカの代わりにスピリタスを使うとアルコールの強さはスピリッツ系近くに。甘いカクテルなのにスピリッツ並のきつさを加えると変なことになりそう…?

Tuesday, January 24, 2006

Society::livedoor - ライブドアって何をしている企業?

社長逮捕となり、メディアでもわいわい騒いでおりますが。いつもいつも、ライブドアってメインの商売は何なんだろう?と疑問に思っていました。

(確か)5年前、私は インターネットの無料プロバイダとしてライブドアを選んだことがあります。非力なマシンに広告表示プログラムを走らせなければプロバイダへの接続が不可能という仕様でしたので、しばらくしてから別のプロバイダに切り替えましたが(InterLinkだったような)。

それ以来、ライブドアについてはずっとインターネット事業者であるというイメージがありました。しかし堀江さんがちょくちょくメディアに登場するようになり、毎回企業買収だの株がどうのという話ばかり。一体この企業は何を生産、提供している企業なんだろうと疑問に思うようになりました。プロバイダでしたら、インターネット接続サービスを提供することになります。企業買収ばっかりだったら、物作りをしているのは子会社であり、親会社は子会社から美味しい汁をもらうだけなんじゃなかろうか(いや、実際は経営の話とか小難しい話があるんでしょうけど)。

ライブドアの経営方針を見てみると、次のように書いてあります。

急成長の中で歪みがちなマネージメント・営業の体制を再構成しつつM&A戦略を進め…livedoor 会社案内 経営方針

M&Aというと、企業の買収や合併を駆使した戦略のようです(http://www.interlink-ma.co.jp/ma/sho/contents.html)。アメリカなど海外では別に珍しくもない、と、テレビでみかけます。

それはそれとして、中心的な役員が捕まり、子会社がライブドアから離れていっている様子。元々買収されたってだけで、つながりが薄かったらしいですね。っていうことは、ライブドアが転けても、周りの影響はあんまりないんじゃなかろうかと、個人的には思ってしまったりしました。

Motorcycle::Hornet - 初めて知ったホーネットのシリーズ

バイクの知識についてはまだまだの私ですが、サークルの 友人でバイク乗りが二人います。このうち一人は、バイクで事故を5回起こしたらしく、もう怖くて乗れないそうです。もう一人はバイクをリースしており、今度の3月で返品するそうです。

この二人、なんとHornet乗り。Hornetって微妙に紙面上などで見聞きするのですが、多分FZにFazerという名が付いているように、多分違う名前があるんだろうなという気はしていました。

そこでHornetについてきちんと調べてみるとHonda製。写真見てみると、なんかこれはこれでかっこいいですね~。リア周りの雰囲気なんか好きです。肉薄なのが少々あれですが。私の頭の中は、3月に大型自動二輪の免許をとることで一杯だったり。最近やはり大型車に乗りたいと思っているのです。

HornetのシリーズはCB。CB系なんですね。Hornetの250は、古くはジェイドCB250Fがルーツのようで(http://www.honda.co.jp/pressroom/library/motor/sports/cb_cbx/index6.html)。HondaといえばCB、YamahaといえばXJRとかいう勝手なイメージが出来てしまっていたりする私。バイクの歴史とか見てるだけでも楽しいですね。

GroupActivity::Present - ヒットな卒業祝い品

先日サークルの追いだしコンパがありました。私は4回生なので、追い出される側です。思えば2回生のときの追い出しコンパで 、サークルを去ろうと思っていたのに、その飲み会でサークルの副部長に指名されてしまったんですよね。ま、今思えばそれはそれで良かったのかも知れません。たくさんの後輩と親しくなれましたから。

さて、追い出しコンパで、卒業祝いとしてもらえる品が気になるところでしたが、まぁ大したものはもらえないだろうと勝手に思いこんでいました。適当にくじを引き、手渡されます。中身を確認してみると、なにやら和の香りを感じます。うーん、陶器か置物かなんかだろうか?と思ったら…なんと焼酎サーバーではありませんか。頂戴した焼酎サーバー何だかくじ引きにしては狙い澄ました感がある品だったので、思わず爆笑してしまいました。私は焼酎は飲まず、日本酒好きですので、代わりに日本酒を入れて楽しもうかと思います。

後で聞かせてくれた話なのですが、もともとくじ引きの振りをしていただけだったようです。すでに、誰に何を渡すかは決まっていたようですね。ま、それが無難っていえば無難ですよね。しかしながら、ほんと嬉しいものを頂戴しました。お酒を飲むぶんには手間が増えてしまう品ですが、雰囲気が楽しめますから、これからは日本酒を飲むときはこれに移して飲もうかと思います。

Network::Blog::Customize - テンプレート変更+カスタマイズ

そろそろ以前使っていたテンプレートにも 飽きてきたので、こちらから新たなテンプレートを拝借させて頂きました。K1というテンプレートです。フォントサイズやコメント数の表示などが気に入らなかったので、そこは頑張ってソースを解読してカスタマイズ。以前作ったカテゴリー機能もちゃっかり記述しておきます。

ところで、カスタマイズをする際に色々参考にさせていただいたサイトがあります。クリボウさんのBlogger Tipsです。タイトルからして色々Bloggerについて調べておられるようで、なかなか参考になります。これからちょくちょくチェックして、色々勉強したいと思いました。

Friday, January 20, 2006

Work::PartTimeWork - 子供らしいバイト仲間

最近コンピュータ資源の一つとして、研究で使う辞書データを作成していたのですが、あまりに急ピッチでやっていたために疲労が蓄積していたようで。パソコンの前に座って作業していると、軽く変な汗が出つつ、気持ちも落ち着かず。多少フラフラしていました。あげくうちの隣に住んでいる、おそらく学生だと思うのですが、夜中にゲームをしくさってくれちゃってうるさくて眠れず。3時間ほどの睡眠で朝からバイトでした。そんなこんなで今日の昼間はずーっと眠り続けてしまった一日でした…うー。

それはそれとして、バイト先で働いている人たちは主婦か学生がほとんどで、学生はほとんど私が行っている大学の学生です。さらに言うと夜間主の人たちが多く、なおかつ私より年下が多いです。

結構色んなタイプの人がいるもんだと思いますが、ここで働くときに初めて仕事を教えてくれた子がいます。一個下の女の子です。初めて入ったときは、完璧に、昼間は全員主婦しかいないと勝手に思いこんでいたので、この人の年はいくつぐらいなんだろう…?とずっと考えていました。思いっきり学生でしたけどね。

この子はしっかりしてる感じ(+彼氏持ち)なんですが、子供っぽさ全開な子でもあったりします。うっとおしくなく、むしろ見てて面白いぐらいの性格だと思っています。休憩時間や上がり際に時々話をしたりします。先日、「彼女できましたかー?」と聞かれ、私は「ふられましたっ」と答えました。実は去年の年末、実家に帰ったときに、地元の子に告白して思いっきり振られていました。ははっ。なんのアプローチもなしに突撃していったので、そんなもんだろうって気はしますけどね。久しぶりに思い切ってみた感じがし、今年は頑張って彼女作りしてみようかな、と思います。

…という細かいところまでは話しませんでしたが、振られたことを伝えると、「えーっ!ほんとにぃ!?いやーあたし泣きそう!」…何でアナタが泣くんですかぁ~。なんでですのみたいな感じで、ついつい笑ってしまいましたが、もし自分が今の彼に振られるか、告白したときに振られていたら(彼女から告白したそうです)泣いて立ち直れなかったと思う、とのこと。もし自分が私の立場だったら…ということを考えてくれたようですね。

なんとも一個下の子とは思えない子供っぽさ満開の子ですが、この子がなんだかすごく人の気持ちの分かる人なのかも…という気がしました。すごく純粋な子なのかもしれませんね(ちなむと、私は純粋じゃなくとも、ストレートな性格の子を彼女にしたいなとか思ったりしますケドネ)。

Thursday, January 19, 2006

Network::Blog::Categorize - bloggerに疑似カテゴリー機能を

以前はCGIBOYの日記帳を5、6年近く使い続けていました。現在のBloggerに乗り換えたのは、去年の7月のことです。初めは”はてな”にしてしまおうと考えたのですが、サーバが一杯一杯だったのか、ユーザ登録がなかなか進まず。レスポンスの遅さにしびれを切らし、はてなは止めてしまいました。

他に何かいい日記(Blog)サービスはないものかと考え、レンタルしているサーバに日記cgiを設置してみたりもしました。が、現在Bloggerに乗り換えたように、見栄えは劣っていました。それくらいどうにかなりそうなものですが、自分で設置するcgiはそのcgiのドキュメントを読み通す必要があります。おそらくこちらのほうが柔軟性はあるのでしょうけどね。namazuもつかえましたし。

結局、柔軟さもあり、Googleの傘下であるBloggerになにがしかの魅力を感じてしまい、現在に至ります。使い方もシンプル~ですしね。ただ、何もカスタマイズせずにいると、やはりはてななどのシステムに比べて機能が劣る印象があります。カスタマイズすれば、色々できるようですけどね。

中でも記事のカテゴライズは特にやりたいと考えていましたが、それに特化した機能は用意されていません。ですのでタイトルを見ただけでどんなカテゴリーに属した記事なのかが分かるよう、namespaceを思いながらタイトルを付けるようにしました(これは、記事が私が使用しているサーバへ保存することが可能なことから、namespaceのようなタイトル付けは、将来的になにがしかのプログラムで処理しやすくなるだろうという企みがあったりなかったりします)。

また、Googleの機能を利用してBlog内のみに対象を絞った検索バーが、Bloggerでは表示可能です。ふと、このblog検索を実行する際のクエリ文字に”Cocktail”や"Programming"など、タイトル文字の単語を与えたURLは、カテゴリー別記事表示機能につかえるのでは?と考えました。それで、早速blogの右サイドのサイドバー内にCategory項目を作ってやりました。

これはタイトルにnamespaceのような一定の書式に従った文字列を含ませていたことがよかったのでしょう。bloggerの柔軟性にちょっぴり感動してしまいました。

Wednesday, January 18, 2006

Programming::C++ - 二つのインクルードガード

C++だけでなく、当然ながらCでも使うインクルードガード。関数やクラスの定義を二回以上行われないようにするためのテクニックですね。例えば以下のようなコードでは関数が二回定義されてしまいますので、インクルードガードします。

// hoge.h

// ifndef, define, endifディレクティブでhogeが一回だけ定義されるようにする
#ifndef __INCLUDED_HOGE_H
#define __INCLUDED_HOGE_H

void hoge(int);

#endif // __INCLUDED_HOGE_H

// foo.h
#ifndef __INCLUDED_FOO_H
#define __INCLUDED_FOO_H

#include "hoge.h"
void foo(int); // 関数内でhoge()を呼び出す

#endif // __INCLUDED_FOO_H

// bar.c

#include "hoge.h"
#include "foo.h"

void bar();

void bar()
{
...
}

この手法の名前、正確には二重インクルードガードというのですね(http://www.02.246.ne.jp/~torutk/cxx/file/includeguard.html)。

ところで、大きなプログラムを作成しているとヘッダがモリモリ増えていきます。C++だとテンプレートを使ったクラスを作成しているとヘッダのサイズもバカになりません(さらに、doxygenでドキュメントを生成できるようにコメントを書いているので余計です)。二重インクルードガードだと複数回の定義は回避できますが、どのみちincludeディレクティブによりヘッダファイルの読み込みが発生します。この読み込みは明らかに冗長ですね。何せ必要ないヘッダを読み込んでいるわけですから。

この冗長なインクルードを回避するためには、上記コードを次のように改良します。


// hoge.h

#ifndef __INCLUDED_HOGE_H
#define __INCLUDED_HOGE_H

void hoge(int);

#endif // __INCLUDED_HOGE_H

// foo.h
#ifndef __INCLUDED_FOO_H
#define __INCLUDED_FOO_H

#ifndef __INCLUDED_HOGE_H // ここのifndefディレクティブを追加する
#include "hoge.h"
#endif // __INCLUDED_HOGE_H

void foo(int); // 関数内でhoge()を呼び出す

#endif // __INCLUDED_FOO_H

// bar.c

#include "hoge.h"
#include "foo.h"

void bar();

void bar()
{
...
}

この変更を行う前では、bar.cに置いてhoge.hが読み込まれ、foo.hが読み込まれ、さらにfoo.hの中でhoge.hをincludeしているため再びhoge.hが読み込まれます。二回hoge.hを読み込んでいますね。この変更により、hoge.h内の"__INCLUDE_HOGE_H"のおかげで、foo.h内の"#include "hoge.h""をスキップすることが出来ます。これを冗長インクルードガードというのですね。

冗長インクルードガードをしていなかったため、VCでのコンパイルでは時間が掛かって仕方有りませんでした。冗長インクルードガードを施すことで、コンパイル時間は改善されました。ちなみにgccはこの冗長インクルードガードの手法をこちらが使わなくても、勝手に同様のことをしてくれるようですね。

Thursday, January 12, 2006

Laboratory::Arrangement - 資料室整理

先日にも書いたとおり、私は部屋の整理整頓にはいつの間にかうるさくなっているわけですが(http://still-ai.net/blog/2006/01/lifemyroom.html)。今日は研究室の資料室の本棚が新調されるため、本や雑品整理をすることになっていました。整理をしなければならない一方、少しでも研究の時間を削りたくないという気持ちから、とっとと終わらしたい思いでした。かといって適当にやるわけではありません。時間を効率的に使いたいのです。

私はバイトでレストランのキッチンに入っていますので、1秒でも早くスタンバイを終わらせ、料理を作り、お客様に提供しなければいけません。ですので、普段から何事も効率的に動こうとする癖が着いてしまっています。

これらのことから、最初に資料室でどのような配置でいくかの方向性を話し合った上、後は黙々と作業を進め、さっさと終わらせたい、そう考えてしまいます。物を持ったまま突っ立っている友人を見ると、許し難いものがありますとも、ええ。口より手を動かしなさい、遊ぶんじゃありません。…そんなことは言いませんでしたが。ものすごい勢いで物を収納していきながら、横目で周りを見ていると…おせぇよテメェら~…と思いつつも。A型っぽいB型な性格だと自分自身考えています(http://still-ai.net/blog/2006/01/bloodgroupcharacter.html)が、うーん、やはりA型的な性格になりつつありますなこれは。いつの間にやら別に走らなくてもいい廊下まで小走っています。

一方、「A型だから…」といいながら、(おそらく)几帳面に並べていく友人。それはいいんですが遅いんですよね…綺麗に並べようとするのはいいです(私も綺麗に並べたいです)が、考えすぎて遅いのは、あんまりいただけないなぁと思いました。

Programming::C++ - やりすぎる一般化

C++を使っていて、最近いよいよtemplateが面白くなってきました。時々boostのソースなんか見てみたりして、templateに限らず、マクロのテクニックなどを垣間見て勉強したりします。

templateを使うことで、データ構造とアルゴリズムの分離が出きるのはいいのですが、templateで何でもかんでもオブジェクトをtemplate引数で宣言してしまうと抽象度が上がりすぎて頭がどっと疲れます。この、何でもかんでもやってしまうのが悪いんでしょうね…もっとスマートな方法があるんだろうな、と反省した一日でした。

Wednesday, January 11, 2006

Programming::C++ - ジェネリックな逆ポーランド記法

研究でC++プログラミングをやっている中で、次のようなLISPコードの演算と同じ内容のことをしたいとか思いました。

(+ 5 (+ (+ 1 2) (+ 3 4)))

単なる二項演算なのですが、これをジェネリックにしてしまいたいと考えました。つまり数字の箇所が全てオブジェクトにしてしまいたいのです。同じくLISPで書くと

(+ obj5 (+ (+ obj1 obj2) (+ obj3 obj4)))

ですね。LISPを詳細に知らないので、obj1~obj5に数値以外の物が何でも入るのかどうかはわかりませんが…

さらに演算子+も関数オブジェクトfを使って、C++では次のことをやりたいと思いました。

f(obj5, f(f(obj1, obj2), f(obj3, obj4)))

ジェネリックに上記の計算を実現したい(且つ演算対象となるオブジェクトの数も限定しないのですが、ここでは演算順序や演算対象オブジェクト数は上記で固定して話を進めます)となると、テンプレートを使ってモリモリ書いていけばいいでしょう。このような二項演算は、逆ポーランド記法の考えとスタックを使えば、プログラムしやすいです。

例えば話を最初に戻して、数値の二項演算がしたいとすると、最初に書いたLISPコードの式は逆ポーランド記法では次のように書けます。

5 1 2 + 3 4 + + +

演算対象の項が数値の場合、数値や演算子は全てアスキーコードで表現してやると、char型のスタックを用いれば計算しやすいです。C言語のアルゴリズムを解説した書籍とかでよく(?)見かけます。

ところが、数値ではなくオブジェクトだとどうでしょうか。同じくスタックを使って、演算対象が数値だったときのアルゴリズムと同様の手法を使おうとすると困ったことが出てきます。スタックに格納する物が、演算対象となるオブジェクトと関数オブジェクトとなってしまいます。型が異なるため、少々面倒です。演算対象となるオブジェクトと関数オブジェクトに、共通のスーパークラスを持たせて、スーパークラスのポインタが格納できるスタックを用意してやれば格納できます。

// 共通のスーパークラス
class X
{
...
};

// 演算対象のクラス
class Y
 : public X
{
...
};

// 演算を行うためのファンクタ
struct Z
 : public X
{
  Y operator() (const Y& a, const Y& b)
  {
   ...
  }
};

int main()
{
  // ここにYのインスタンスや,
  // オブジェクト間の演算を行うためのファンクタZの
  // インスタンスのアドレスを格納していく
  std::stack<X*>s;
  ...
}

取り出したときにdynamic_castを使えば関数オブジェクトかどうかなどの判断も出来ます。

X* obj = s.back();
s.pop_back();
if (dynamic_cast<Z*>(obj)) {
  // obj はファンクタ
}
else {
  // obj は演算対象のオブジェクト
}

が、どうにも汚いような気がします。

結局、boost::anyを使うことで、共通のスーパークラスを用意する手間を省いて解決することにしました(実際はファンクタに渡す演算対象のクラスは同時に二種類のケースがあったので、template関数が大活躍していましたが、簡単のため上記は一種類です)。Perlを使えばスカラーリファレンスとサブルーチンリファレンスを配列にぶち込んで、ref関数でサブルーチンかどうかを判定する。これをやる手間はそんなにかからないですし。C++コードへ部分的にPerlコードを埋め込んでやりたいとか、変な衝動に駆られちゃいました。

Life::CellularTelephone - W32Hのミュージックプレイヤー

私は大学で研究をしているときは十中八句音楽を聴いています。ちなみに超小音量。私にとっては調度良いぐらいだったのですが、先日先輩に突っ込まれてやたら小さい音量であることが判明。私はどうやら耳が良いのかも知れないとか思いました。

音楽のプレイヤーはパソコンを使うことなく、MP3プレイヤーを使っています。RiOの256MB、充電式です。もうRiOはMP3プレイヤーの開発をしなくなったのでしたっけ。USBメモリとしても利用できることから、もうかれこれ2年以上愛用しています。今256MBのメモリのプレイヤーを買おうとしたら1万前後で買えるんでしょうか。私の場合3万近くしましたけどね…

研究しているときは十中八句、ということなので、短くて3時間ほど、長くて8時間ほどプレイヤーは稼働しています。RiOのプレイヤーはUSBケーブルを使ってパソコンから電源供給できますので、バッテリーは大して気にしていませんでした。

ここで最近購入した携帯、au向けのW32H。HITACHI製ですね。パソコン向けサイトビューアやらお財布携帯FeliCa、デジカメ、FMラジオ、ミュージックプレイヤーなどなど機能満載で、ツーカーを使っていた頃に比べ随分リッチな気分です。このミュージックプレイヤーですが、miniSDカードを別途購入しない限り手持ちの音楽データを携帯で聞くことが出来ないのです。ですので、512MBのminiSDを購入してやりました。A-DATA製です。ついでにminiSDカードリーダライタであるサンワサプライのADR-MSDU2 も購入。USB接続できて、USBメモリ代わりにもなります。

早速miniSDへ転送するために、W32HをUSBでPCと接続します。聞いてみると、音質はOKですね。WMAやMP3をAACに変換しているようで、AACだと圧縮率も上がる上雑音除去やらの技術も使っている様子。AACの解説を斜め読みしただけですが、色々いい感じの効果が期待できるみたいです。

これでW32Hがパソコンから常時電源供給できればいいのに…と不満が多少残ります。音楽聞きすぎてバッテリー切れになると通話やメールが出来ませんからね。ということで、今日実際にどれくらいバッテリーが減るのかを調べてみることにしました。一昨日に充電して以来、通話はしていませんし、音楽を多少聴いただけです。16時から22時までぶっ通しで聞き続けてみました。すると3メモリある電源残量表示が一つも減っていませんじゃないですか。ま、5時間ほど聞いてバッテリーがなくなるようでは商品にならないと考えてもいいんですかね。やはりそれなりにバッテリーは持つようです。音量も最大限に絞ってますから、そのせいで消費電力が少なくなっているとも考えられるかも知れませんが(しかしこれでも私にとっては音量が少し大きいです)。

ストラップと一緒に付けたカードリーダライタ、容量たっぷりのminiSD、お財布携帯も活用できれば、本当に携帯が生活の必需品の一つになってきた実感が出てきそうです。ユビキタスの香りがしてきた…のかな?

Sunday, January 08, 2006

Computer::Storage - LinkStationへHD増設

現在外付けハードディスクとして、BUFFALOのHD-H120LANを使っているわけですが、これの空き容量がいよいよ危なくなってきました。ということで、もう一つ外付けハードディスクを購入します。購入したハードディスクはBUFFALOのHD-HB160U2。HD-H120LANみたく、ネットワークへの接続が可能であり、FTPサーバ機能などが付いているようなハードディスクは要らず、USB接続によるハードディスクの追加だけを目的とした結果、これを選択しました。

HD-HB160U2の接続先はHD-H120LAN、つまりLinkStation。LinkStationにUSBデバイスを接続すれば、そのデバイスを認識してくれ、かつそのデバイスがプリンタやハードディスクであればLinkStation経由でデバイスを利用できるわけです。BUFFALOは、簡単に増設可能とか謳っているので、特に設定をせずとも、LinkStationの共有フォルダと同じ階層に増設したハードディスクの共有フォルダが出現するんだろうな、それともLVMみたいなことになるんかな、と勝手な期待をしていました。

実際の所は、増設したハードディスクが同じネットワーク上のマシンとして出現するようで、LinkStationをLANのハブに二台接続したような感じになるようです。なるようです、と書いているのは、私の場合は増設したHD-HB160U2がネットワーク上のマシンとして認識されなかったのです。LinkStationのネットワークグループ名をデフォルトから変更しているせいか、はたまたLinkStationの増設可能なハードディスクのリストに載っていないハードディスクを使ったためか。多分後者が有力のような気もします。よく確認しておけば良かったと後悔するものの、これくらいではめげません。

以前このLinkStationをいじって、telnetによるログインを可能にしています(http://www.still-ai.net/cgi-bin/diary/?200501a#200501050)ので、LinkStationにログインし、増設したハードディスクがマウントされているディレクトリを探しに行きます。このディレクトリを、LinkStationの共有フォルダの中へシンボリックリンクを張るなり、Windowsからネットワークドライブとしてマウントすれば良い話ですから。

ログインして、mountコマンドでどのディレクトリにマウントされているか調べます。すると/mnt2/usbdisk1にマウントされていました。他にusbdisk2というディレクトリもあったので、もしかして二台接続することも可能なのか?と思いましたが、メーカー側は一台だけ接続できると言っています。実際の所どうなんでしょうか。無駄にディレクトリがあるだけ?

ともかくこれで増設したハードディスクがつかえるようになりました。ログイン出来なかったらLinkStationにハードディスクを増設することは出来なかったですね。

Saturday, January 07, 2006

Life::BedDryer - 乾燥させた布団の寝心地

先日布団乾燥機を購入しました。昨日の夜に届いたので、早速使ってみました。考えてみれば、現在の布団や枕っていつ乾燥機かけただろう?と疑問に思ってしまいます。干すということもしていなかったような…実家にいたときも現在の布団を使っていましたから、4年以上、ってことになります。

部屋自体はじめじめした環境というわけではないので、布団の状態は最悪、というわけではありません。部屋の日当たりもいいですし。ただ、いい加減ダニどもを死滅させてやらねば!と思い、布団乾燥機を購入しました。

最初はダニ殺しを目的に買ったのですが、乾燥機をかけている横で座りながらテレビを見ていると、なにやら横がやたら暖かい。乾燥させているので、暖かいのは当然なのですが…一時間ほど乾燥させ、布団に潜ってみます。すごく暖かく、ふとんもふかふかです。めちゃくちゃふかふかというわけではありませんが、少し気持ちのいい寝心地です。ただ、シーツ類はここしばらく洗っていないので、洗えばもっと気持ちいいんだろうなぁ…と思いました。おかげでぐっすり眠ることが出来、朝早くからのバイトもそれなりにがんばれました。正月のせいで夜型の体になってしまったせいか、最近朝のバイトがほんと辛いんですよね。寒いのは嫌いじゃないので、睡眠不足が原因でしょうし。なんで今まで買うことを考えなかったんだろうとか思いました(いや、単に布団乾燥機の存在を忘れていただけなのですが)。

Friday, January 06, 2006

BloodGroup::Character - 血液型的性格とのギャップ

私の血液型はB型です。少し前まで血液型ごとによる性格診断のようなものがはやり、私は典型的なB型だなと納得していたのを覚えています。本人はそう思っていても、周りから見ればそうでもないようなのです。

典型的なB型、というより、A型っぽいB型、と言った方がいいかもしれない、と思ったりもします。表面的には几帳面そうでも、奥の方を見てみればいい加減だったり自由奔放だったり。あくまで自己分析ですが。

考えてみれば、A型っぽく見られるようになったのは、部屋を綺麗に見せようと考え始めた頃からですね 。整理整頓を心がけるようになると、人の雰囲気も変わるもんなのだろうかとか思ってしまいます。

今日もバイト先であるレストランの店長に、料理の盛りつけ方で突っ込まれたわけです。ちまちまやりすぎ、と。ぱぱっとやってぱぱっと盛りつけられるようになれと言われました。確かに、盛りつけを綺麗にしようと心がけるようになってから、端から見たらクソ丁寧に盛っているのかもしれません。A型っぽい性格だから、というか、凝り性なだけなんですけどね。

他に、何かと集団行動があまり好きでなかったりするわけです。自分の思うように動いたらだめですからね。周りの人間に合わせなければならない。どちらかと言えば苦痛のような。

凝り性ゆえにA型っぽくみられ、一方で自由奔放。A型っぽいB型というか、凝り性+自由奔放ですから、やっぱり典型的なB型なのかな、と思います。

Thursday, January 05, 2006

Life::MyRoom - 部屋の模様替えを計算する

壁の露出が広くなった私の部屋の一部去年の末ぐらいから、部屋の模様替えをしたいしたいと思っていて、昨日思い切って実行に移しました。私は部屋の模様替えが好きです。去年なんて一年間の間に6回はやったような …やる目的というのは、もちろん気分を変えたいというのもあります。が、第一に部屋が狭いので、いかにして部屋を広くするか、これです。

最初こっちに越してきたときには、とりあえず家具を配置します。まあここが使いやすいだろう、ということで。実際数ヶ月、数年過ごしてみると、これがここにあると邪魔だとか、これはこっちにあった方が使いやすいということに気づいてきます。

ということで、ものが使いやすいように配置換えをするわけですが、同時に部屋が段々狭く感じられるようになってきました。ものを買えば置き場所に困ってくる=足の踏み場が無くなってくることになるので。

物が増え、押入に使わない物をしまい、さらに収納スペースがなくなり…私の部屋はゴミ屋敷予備軍になりかけましたが、サークルの後輩がよく家にくるようになってからというもの、部屋を掃除する癖が付くようになってきました。実を言うと、当時好きだった子も私の家に時々来ていたので、そのせいが大半でしたが。

人が大量に来ると、当然余計に部屋が狭く感じられ、もっと広い部屋だったらいいのに、と考えるようになりました。それからというもの、デッドスペースを意識し、徹底して無駄な空間を減らしていくようになりました。かつ、テレビとテーブルの位置を意識するようになりました。どうおけばたくさんの人が座れるか、など。

加えて、掃除しやすい配置を考慮し、去年の10月頃から私の部屋の配置は落ち着きました。どう考えても、これ以上広くできないし、掃除もし易い。ただ、寝る位置と押入の位置が遠く、しまうのが面倒となり、布団を出しっぱなしにしがち。

微妙に不満が残っていたので、去年の暮れに、模様替えの計画を頭の中で練り始めました。短いスパンで模様替えを繰り返し、家具の配置は練りに練ってきました。ここにきてもっと広い置き方をするとなると、相当難しいです。ロフトベッドの購入も考えましたが、縦長の部屋で、幅の短い辺の一方に玄関、一方に窓という構造です。ベッドを置くと確実に部屋が狭くなります。原則、部屋が狭くなるのは却下という方向で行きます。

あれこれ考えていく内に、家具の配置はどうすると部屋が広く見えるのか、を突き詰めて考えるようになりました。異なる高さの家具を一列に並べるにしても、その並べ方だけでずいぶんと広さの感じ方は変わってくるという点に気づきます。私の部屋のように縦長の部屋の場合、長い辺側の壁が狭くなると圧迫感が増え、狭く感じます。ただでさえ細長な部屋を、さらに細長にすると、当然狭く感じられるようになります。ふだんの生活で歩く順路において、縦と横の比率が近くなるように家具を配置し、且つ壁の露出面積を広くすれば、部屋は広く見える、という結論に達し、昨日模様替えをしたわけです。

高々部屋の模様替えごときで何もそこまで考え込まなくても…と思ったりもしますが、結局はパズルなわけですね。しかもどんな形になればどんな印象の部屋になるか、まで考えなければなりません。あれこれ計算して出来上がった模様替えですが、間接照明を組み合わせるとやたらに大人っぽい雰囲気の部屋になってしまいました。前の配置のときに比べて、家にある家具は変わっていないんですけどね。家具の配置だけで印象は随分変わることから、家具を配置する人の個性やら考え方が部屋の印象に現れるんじゃなかろうか、とか考えてしまいました。