"2003年12月" archive
12 28, 2003
電撃萌王買った
『週刊わたしのおにいちゃん プレビュー版フィギュア』付きの電撃萌王を、秋葉原にてget。今日が発売日だったのだが、夕方頃になると早くも品薄気味で、クレバリーのフィギュア館では1,000yenで買い取る旨の掲示がなされているという始末である(雑誌本体の価値はゼロってことか???)
欲しい人はいますぐ確保に急ぐこと。ヤフオクで高い金を払うことのないように。
12 27, 2003
キャプチャボードが動かぬ
CATV導入記念に購入したCanopusのキャプチャボード『MTV 1200FX』。さっそく我がPCに取り付けたはいいが、この野郎、うんともすんとも言わない。動かす以前に認識すらされていない様子で、デバイスの競合を疑ってほかのPCIボードを外したり指したりしてみるがまったく反応なし。で、Canopusのサイトを見ると、「ALi MAGiK1では動作しないよん」との記述を発見。わけのわからんマザーを買った付けを今頃になって払うことになる也。ジャンク箱で見つけたときは掘り出し物だと思ったんだけどね……。いちおうASUSだし。
さて、明日は秋葉原だ。
12 25, 2003
その4 ~実装、そしてより優れたシステムにするために~ ">文章要約プログラムを書いてみよう!
その4 ~実装、そしてより優れたシステムにするために~
TF-IDFとChasen、この2つがあればなにも問題はない。好きな環境と好きな言語を選んで、レッツ・トライ。最後に、あなたの作る文章要約プログラムをより優れたものにするためのアイディアを箇条書きにして紹介し、僕の書いたコードを恥ずかしながら公開して、この文章を終わりにする。
・より優れたコーパスを使う(難易度C)
その2で書いたように、僕の作ったプログラムでは、『Yahoo! ニュース』に存在するHTMLをスパイダーでかき集め、コーパスとして使用した。正直、コーパスとしてのクオリティは高いとは言えない。
まず、コーパスとしては文章の総量が小さい。HTMLで50MB、日本語の文章を抜き出すと10MBあるかないかというところ。それに加えて、単語の偏りも大きい。たった一つのサイトから引っ張ってきた文章であることが問題なのはもちろんだが、さらに、ある時点での写像になってしまっているのがまずい。たとえば、「フセイン」が全体の8%もの文章に登場している。明らかに多すぎる。
もっと優れたコーパスを蒐集し、それをIDFの算出に使うことができれば、文章要約の精度を向上させることができる。というわけで、その気があるなら、がんばってHTMLをかき集めて、でかくて偏りのないコーパスを作ってみましょう。ちなみに、こんなレポートごときに使うことはあり得ないけど、お金を出してナイスなコーパスをゲットすることもできます。別にコードを書いたり頭を使ったりすることじゃないので、難易度はC。
・HTMLパーサを組み込む、または作る(難易度B)
コードを見てもらえばわかるのだが、ぼくの作ったプログラムでは、単語の出現頻度表をつくるときに、HTMLファイルをそのままChasenに喰わせている。そのため、できあがった出現頻度表では、数字("0"~"9")やら、「カスタマイズ」「ヘルプ」やらがほぼすべての文章に登場している。また、明らかに広告のものと分かる単語の出現頻度も高い。
HTMLをちゃんとパースし、日本語の文章部分のみを抜き出してやるのが望ましい。外部プログラムやライブラリを使っても良いし、自分で実装してもOK。また、非HTMLなコーパスを使うことによってもこの問題は回避できる。難易度はB。
・センテンス間の関連性を評価する(難易度S)
単純に個々のセンテンスを独立したものとして扱ってしまうと、要約された文章に不自然な箇所が発生することがある。たとえば、次のような。
a.代名詞が正しくつながっていない
b.「」のような記号の対応が正しくとれていない
c.接続詞の用法がおかしい
要約された文章のクオリティを上げるためには、センテンス間の関連性を評価することがどうしても必要になってくる。「この代名詞は何を指しているのか?」。「この接続詞の意味は?」。……でも、これをやるのはとっても難しい。セマンティックな領域に踏み込んでいなかくちゃならないからね。興味のあるひとはチャレンジしてみようって感じ。難易度はもちろんS。ちなみに、僕の書いたプログラムではこの部分はまったく考慮されていない。
・粒度を小さくする(難易度S)
僕の実装したプログラムでは、要約の単位をセンテンス(文)としている。これよりも粒度を小さくすると、つまり、センテンスのレベルで要約を行おうとすると、難易度は飛躍的にアップする。文法の領域に踏み込んで行かなくちゃならない。まあ、これもやってやろうと思う人は触ってみてもいいんじゃない、という感じ。これも難易度はS。
んで、僕の書いたコードは以下。言語はc#、開発環境はVS.NET2003。
開発環境を持っててC#が分かるひと、という時点で相当限定されてしまうが。
http://windy.ac/dat/SummaryMaker.lzh
Post a comment to '文章要約プログラムを書いてみよう!
その4 ~実装、そしてより優れたシステムにするために~ '
12 21, 2003
ヤフオクの閉鎖性に幻滅
『Yahoo! オークション』に会員登録をした。有料化されたのを機にしばらく離れていたんだが、ヤフオクでしか出回らないたぐいの欲しいモノがあったので、久しぶりに使ってみるかな、と。
住所氏名やクレジットカードの番号をフォームに書き込んで、ヤフオクに参加するための「Yahoo! プレミアム会員」なる偉そうな名前の権利をゲット。そして、さっそく目当てのブツに入札。これが昨夜。
明けて今日。高値更新された旨のメールが届いていたので、上乗せするためにブツのページにアクセス。入札フォームに金額とパスワードを入力して入札しようとするが、リジェクトされる。そして次のメッセージが。
>入札する権限がありません。
どういう意味か調べてみると、何でも僕のIDが出品者のブラックリストに登録されたらしい。もちろん、何も悪いことをした覚えはない。Q&A;欄でどうしてブラックリストに入れたのかを聞いてみようとしたのだが、「出品者があなたをブラックリストに載せているため、このオークションでは質問ができません。 」との仰せ。どうしろというんだ。
普通に入札した以外のことは何もしていないので、推察するに、ブラックリストに入れられたのは、僕のIDが新規だったからだとおもう。たしかに昔からヤフオクにはこういう閉鎖性があったけど、昔ならいきなりこういうやり方をすることはなかったとおもうのだが。
有料化以前の頃に比べると、業者や転売屋がかなり増えているようだし、「入札者の評価制限」の機能があるように、初心者に対して排他的になっていると感じる。売り手と買い手が分離する傾向と、初心者と上級者の間に敷居のあることから、元々フリーマーケット的なものであったはずなのに、今ではニッチなマーケットとしての色彩が強いのではないかとおもう。僕はヤフオクにはオープンで商売っ気のないまたーり路線であって欲しいと考えるので、現在のあり方は嫌いです。嫌悪感を感じます。
結局、ブツを競り落とすのは知己に代理入札をしてもらうという形で完結。「Yahoo! プレミアム会員」はさっさと解約。日割りで請求してくれるような気配りはないだろうから、たった一日のために280yenを払うことになるのか。まあいいけど。
12 20, 2003
その3 ~Chasen~ ">文章要約プログラムを書いてみよう!
その3 ~Chasen~
その2では、単語の重要度を教えてくれる「TF-IDF」というとっても素敵なアルゴリズムを紹介した。「なるほど、これを使えば文章を要約するプログラムなんて簡単に書けるぜ!」って、思った? だけど、TF-IDFを使うには、日本語の文章を単語に分割する必要がある。日本語は英語のように分かち書きされてないので、単語に分割するだけの処理をするのも容易じゃない。文法的な知識と辞書を用意して、膨大な規則をコーディングして行かなくてはならない……というわけで、この部分を自力で実装するのは現実的でない。与えられた文を構成要素に分割する処理のことを、「形態素解析」という。すばらしいことに、これをやってくれるいかしたツールがいくつか公開されている。今回書いたプログラムでは、『Chasen(茶筌)』という形態素解析ツールを使っている。
試しにやってみよう。次のような文をChasenに喰わせる。
| NTT基礎研究所を経て, 2000年より電気通信大学電気通信学部情報工学科教授(大学院情報工学専攻 教授兼任). |
すると、たとえば次のようなアウトプットを得られる。
N 記号-アルファベット
T 記号-アルファベット
T 記号-アルファベット
基礎 名詞-一般
研究所 名詞-一般
を 助詞-格助詞-一般
経 動詞-自立
て 助詞-接続助詞
, 未知語
2 名詞-数
0 名詞-数
0 名詞-数
0 名詞-数
年 名詞-接尾-助数詞
より 助詞-格助詞-一般
電気通信大学 名詞-固有名詞-組織
電気 名詞-一般
通信 名詞-サ変接続
学部 名詞-一般
情報 名詞-一般
工学科 名詞-一般
教授 名詞-一般
( 未知語
大学院 名詞-一般
情報 名詞-一般
工学 名詞-一般
専攻 名詞-サ変接続
記号-空白
教授 名詞-一般
兼任 名詞-サ変接続
) 未知語
. 未知語
EOS |
便利至極。この例だと、単語(形態素)とその分類とが、タブで区切って出力される。"EOS"ってのはEnd Of Sentenceの略で、文の終わりをあらわす。所望するならもっと詳細な情報を得ることもできる。
では、どうやってChasenをプログラムに組み込んだらよいのか。いくつかの方法がある。
・Chasenの実行ファイルを呼びだす
Chasenの実行ファイルをプログラム内から直接叩く。パイプを使うか、ファイルを経由するかして、input&output;を行う。僕が作ったプログラムではこの方法を使っている。
実装はもっとも容易だが、処理速度は劣るし、Windowsで書くとコマンドプロンプトのウィンドウがぽんぽん出てきて非常に鬱陶しい。実装としては、ライブラリをリンクするほうが望ましい。vectorにある古いバージョンのChasenのアーカイブには、旧VB(Visual Basic6)で作成されたサンプルコードが添付されている。旧VBのコードが読めるなら、これを参考にすると手っ取り早く使い方を習得できるとおもう。
・ライブラリ(Windowsなら.dll、Linuxなら.so & .a)をリンクする
手間を惜しまないならおすすめ。ライブラリの使い方はマニュアルに記載されている。
・Chasen.pmを使う。ただしperlのみ
マニュアルに記載がある。perlで書こうという人は使えるかも。
Chasenのマニュアルはインストールされたディレクトリの./docにある。一通りのことは書いてあるので、困ったらマニュアルを見よう。
目で見て分かるピラミッド構造
Webアクセスは一極集中である……限られた一部のサイトがほとんどのアクセスを独占し、その陰に無数のマイナーなサイトが存在する。感覚的に了解されている(?)この事実をデータを元に検証してるURLを見つけた。とっても面白いので、ご紹介。 ReadMe!Japan、日記猿人という2つのアクセスランキングサイトをネタにして、アクセスが上位サイトに集中している様子を分析している。
http://www.hirax.net/dekirukana2/websize/
>すなわち、100位より下のWEBのアクセス(本WEBへのアクセスも含めて)は誤差みたいなものなのだ
……誤差ですか、先生。
12 19, 2003
その2 ~TF/IDFといっしょ!~ ">文章要約プログラムを書いてみよう!
その2 ~TF/IDFといっしょ!~
さてさて、それでは前回の続きを。
僕が書いた文章要約プログラム(前回しめしたこいつのことね)、この中核を担っているのが『TF/IDF』というアルゴリズムだ。今回はこれについて解説して行こう。こやつは名前こそ偉そうでなんだか小難しそうだと思ってしまうが、実際には簡潔で扱いやすくそのうえ直感的という、とっても素敵なアルゴリズムだ。数式を書くのが面倒なので、そこんところはURLをこぴぺしてお茶を濁させていただく。このあたりをちぇき。新しいウィンドウで開くとかして適宜参照してください。
TF/IDFは、文章から重要単語を選択する手法として、情報検索の分野でよく知られているアルゴリズム。まず、その意義を理解しておこう。TF/IDFを使うと、「ある単語の、その文章における相対的な重要性」を算出することができる。……イメージしづらいかしら。TF/IDFにある文章を喰わせて、その文章のなかに登場する単語の一つを指定し、「この単語の重要度はどれくらい?」って訪ねると、「その単語の重要度はこれくらいだよ」ってことを教えてくれるわけ。文章を要約するっていうのは、その文章の中でどこが重要な箇所であるかを判断するということだ。だから、文章要約という目的にTF/IDFはもってこいだといえる。
このTF/IDF、簡略して式を書くとこんなふうになる。
TF/IDF = TF × IDF
TF。その文章のなかでのその単語の出現率。その文章のなかで、その単語がいっぱい出てくれば出てくるほど大きな値になる。たくさん出てくる単語がその文章を特徴付ける(=重要な)単語である、という考え方に基づいている。
IDF。その単語がどれだけレアかを表す指標。その単語がたくさんの文書に登場すれば小さな値になり、逆に特定の文章に限定して現れれば大きな値となる。事象の確率が低いほど大きい情報とする、情報量の考え方に基づいている。
この2つの積を取ったものがTF/IDFとなる。上に貼ったリンクを見てもらえれば分かるとおり、簡潔な式になっているので、実装は容易だとおもう。
とりあえず、TF/IDFそれ自体についてはこれでお仕舞い。しかし、ここで扱うべき事柄がもう一つある。IDFを算出するには、「すべての文章のなかで、その単語が登場する文章の数」が明らかになっている必要がある。じゃあ、すべての文章っていうのはいったい何なんだろう、という疑問が当然でてくる。それをどうやって定義するのか。それに、定義したとして、実際にそれを蒐集することができなくちゃ意味がない。さて、いったいどうしたら良いんでしょう。
この、「すべての文章」に、当たるモノをコーパスと言います。今回のプログラムでいうなら、世界に存在するすべての日本語の文章を蒐集し、それを解析、データを作るっていうのがベスト・ソリューション。でも、そんなことは当然できないわけで、一定量の、それも電子化されたデータを蒐集し、それを使うというのが現実的な線になる。このデータがコーパス。適当なコーパスを古郡先生が提供してくれたって良いと思うんだけど、残念ながらそうしてはくれなかったので、自力で蒐集しなくちゃいけません。面倒くさいけど。
で。その使途にも依るけど、コーパスには求められる条件がある。一般に、おおむね次の2点。
・十分な量
・ドメインに(できるだけ)非依存であること
まず、統計的なデータを引っ張り出したいわけなので、統計的なゆらぎが無視できるほど小さくなるだけの総量が必要になる。加えて、ただ量が大きいだけではなく、ドメインに依存しないことが望ましい(たとえばだけど、2chから引っ張ってきた文章をコーパスとして使うことを考えてみましょう。最高に偏ったデータが得られることは想像に難くないでしょう)。
幸いにして、僕らにはWebがあり、Webからデータをゲットするための便利なツール(スパイダーなどと呼ばれる、自動的にリンクを辿ってデータをダウンロードしてくれるいかしたソフト)がある。適当なスパイダーを入手して、適当なサイトからHTMLをぶっこ抜いてコーパスとするのが手間の掛からないやり方だろう。僕の場合、「Yahoo! ニュース」をコーパスとして使った。また、スパイダーとしては、「インターネットNinja2001 for Windows」の体験版を使った。
最後に、僕が使ったコーパスと、それを解析して作った単語の出現頻度表を置いておく。自分でコーパスを集めたり、解析したりするのが面倒なひとはこれを使えば楽ができる。
・コーパス
http://www.seman.cs.uec.ac.jp/~shin/blog/corpus.lzh (14.5MB)
2003/12/06午前5時ごろの「Yahoo! ニュース」のデータ。
http://headlines.yahoo.co.jp/hl以下に存在するHTMLをすべてダウンロードしたもの。
・単語の出現頻度表
http://www.seman.cs.uec.ac.jp/~shin/blog/corpus.txt (228KB)
上のコーパスを解析したもの。
1行目に文章数。2行目以下は出現数、タブ、単語。
#なんだか、いまいちこなれてない説明になってしまった。なるべく数式や記号を使わないようにしてみたんだけど、そのせいで「ある文章」「その単語」みたいな言葉を多用することになり、逆に分かりにくくなっているという。使うべきところでは記号を使って説明したほうがわかりやすくなるんだなー、ということを学習しましたです。次からはそうします。
12 18, 2003
『日本ブレイク工業 社歌』 オリコンデイリー初登場7位おめでとう
http://www.oricon.co.jp/ranking/cd_single.asp?c=1≻=1&term;=0
心からおめでとう。明日からのチャートアクションに注目させていただきます。
ところで日本ブレイク工業社歌のメロディ・ラインって『デビルマンのうた』にちょっとだけ似てるかもということに気付いた。「♪耐久年数過ぎてゆく コンクリートが落ちてゆく」ってところと「♪デビルチョップはパンチ力 デビルキックは破壊力」ってところ。似てる?
12 17, 2003
今日は研究室に出現したわたくし
久しぶりに研究室に来て、いまこれを自分の机で書いている。
思い出してみると、先月28日から今日までの20日間で、研究室に来たのはたったの3日である。しかもそのうちの1日は飲み会、1日はゼミであるからして、まともに顔を出したのは今日だけと言っていい。自分のことながら困ったものです。
7,500yenをどぶに捨てた話
ずっと前にamazon.co.jpでiPodを買ったのだが、そのときにクーポン券を貰ったのだ。……だが。
Amazon.co.jp エレクトロニクスストアをご利用いただき誠にありがと ******* Amazonギフト券 ******* |
>有効期限:2003年11月30日
>有効期限:2003年11月30日
>有効期限:2003年11月30日
・・・・・・・・・・・。
しまった、使い損ねたぽ。
もったいなくて死にそうです。
その1 ~はじまり、はじまり~ ">文章要約プログラムを書いてみよう!
その1 ~はじまり、はじまり~
今期受講している「自然言語処理論」で、文章を要約するプログラムを書け、という課題が出た。出たのは良いのだが、まず課題自体の難易度がわりあい高いことと、講義では文章要約とはほとんど関連のないことを扱っており、前提となる知識が与えられていないこと、加えてなにより古郡先生が講義のなかでまったくこの課題について指針を示していないことから、これを容易にこなせるひとはあまりいないと思われる。幸いにして僕は尾内研のゼミで文章要約の基礎的な話題を扱っていたため、とりあえず最低限のものをすんなり書くことができた。そこで、何をどうして良いかまったく目星がつかないというひとのために、簡単な解説を書いておこうと思ったわけ。訳の分からない課題を与えられて途方に暮れているひとの目にこれが止まればいいなーと思いつつ、それでは始めましょう。
まず、今回、僕が実際に書いたプログラムをお見せするのが良いとおもう。元々のプログラムはC#で書かれているのだが、それをASP.NETに移したものがこれ。ブラウザ上で動かすことができるので、試してみてもらいたい。
テキストボックスが2つある。上に要約したい文章を貼り付けて、"Make Summary"ボタンを押すと、下に要約された文章が出力される。デフォルトでスポーツ新聞社のWebサイトから拾ってきた記事が貼ってあるので、そのままボタンを押せば動作を見られるようになっている。要約の精度はともかくとして、とりあえずそれっぽい動作ができているということがわかるとおもう。
このプログラムが文章の要約にどんなアルゴリズムを使っているのか。これを書くのにどんな作業が必要なのか。流れをおおざっぱに書き出すと、以下のようになる。
1. コーパスを集める
2. コーパスを形態素解析して、名詞の出現頻度データを作る
3. 要約したい文章を形態素解析し、名詞のリストとその登場回数を得る
4. TF/IDFっていうアルゴリズムに通して、名詞ごとの重要度を得る
5. 4の結果からセンテンスごとに重要度を設定し、上位n%を抜き出して要約とする
こうやって書かれてみても、予備知識がないと、「なにを言ってるのか意味不明」って感じでしょうか。次節から、個々の事柄について、詳しく説明をしていきます。一通り読み終えれば、とりあえずレポートになるだけのプログラムは書けるようになっているはず……たぶん。乞うご期待。
『週刊わたしのおにいちゃん』の予約が通ってなかったことが判明
欲しい本があって、ひさしぶりにamazon.co.jpへアクセス。所望のモノを発見し、注文を確定しようと「ショッピングカード」を覗くと、全5号を3冊ずつ予約してあったはずの『週刊わたしのおにいちゃん』の欄に見慣れぬメッセージが。
「価格が不明です。商品を発送する前に価格をEメールでお知らせしますので、そのときに商品の注文を確定してください。 」
ん、なんだそれは。しかもステータスが「絶版」になっている。どういうことだろう……と推察するに、どうやら「ショッピングカート」に入れておいただけでは、予約されたという扱いにはならないらしい。amazon.co.jpで予約をするのはこれがはじめてゆえ、そんなこととは知らなかった。大嶋優木のエロリフィギュアを崇拝する僕としては、『週刊わたしのおにいちゃん』を取り逃すことはゆるされない。いまからでも予約が通るところは無いかと探してみると、受付を終了しているところが多いなかで、3つほど見つかった。
とらのあなはシステムがわかりづらいのでパス。雄峰堂は聞いたことない名前だからこれもパス、というわけで、es! BOOKSにて無事予約を済ませることができた。これで一安心だ。品切れ続出の『くまうた』が余裕で置いてあるamazon.co.jpなのに、『週刊わたしのおにいちゃん』が予約できないっつーのも面白い。一時期ランキングのトップを『週刊わたしのおにいちゃん』が独占するという状況にもなっていたし、客層の偏り具合はすさまじいものがあるな……。
12 16, 2003
またしても研究室にいかなかったわたくし
やばい。これはいい加減にやばい。あした研究室に顔を出したら僕の机は片付けられていて「君、誰?」ってのもあながち冗談ではなくなってきたのではないか。決めた。明日こそは研究室に行きます。講義があるからどっちにしろ学校に行かなくちゃいけないわけだし。そしてなるべく早く起きようともおもう。おそくても2時には起きよう。そうしよう。
12 15, 2003
今日も研究室に行かなかったわたくし
ぐうたらでごめんなさい。顔を出してないだけならともかく卒研の進行状況も前回のゼミからまったく進展がないという状態で本当にどうしようもないです。夜起きて昼寝るという生活の壊れっぷりもひどい。食事もまともに摂ってねーし。倦怠感を感じる。いったん正常なサイクルに戻さないとやばいぽ。
海外のコスプレ事情:美形編 (小鳥 (a little bird))
http://coolsummer.typepad.com/kotori/2003/12/post_10.html
くまうたをPCで愉しむ
くまがプレイヤーのために珍妙な演歌をいくらでも作ってくれることでおなじみのPS2ソフト『くまうた』。ゲーム自体を持っていなくても、PCでくまの作ったうたを聴けるツールがあるっつーことを知り、さっそく試してみた。
1.『くまうたビューアー』をインストールする
2.アップローダで演歌データを拾ってきて、『くまうたびゅーあー』で再生してみる
売れまくりで入手困難になるだけのことはあって面白いっす。妙な衣装、安っぽいセット、ちょっと不自然な合成音声、歌詞、くま、それらが渾然一体となって独自の世界観というか味というか、そんなものが醸し出されているのがすばらしい。『くまうたびゅーあー』だと静止画がぱらぱら切り替わるだけだけど、PS2の『くまうた』だとくまがうねうね動きながら歌うらしい。うーん、見てみたい。
『くまうたびゅーあー』で適当にひとさまのデータを再生してるだけでもこれだけ楽しいということは、実際に言葉を教えたりくまのつくった歌詞を添削したりするのはもっと楽しいに違いない。なんせゲーム性の核はそこにあるわけだし。卒研が終わったらPS2買おうかな。安くなったことだし。
12 13, 2003
NTFSに対応してなかったなんて
最近なんだかOSが不安定な気がする。加えて雑多なソフトウェアをどんどんインストールするものだから動作がめっぽう重い。なのでおまじないのようなものではあるが、OSの再セットアップをした。そして、ついでにファイルシステムをFAT32からNTFSに変換した。すると、起動時に『SystemCommander2000』がエラーを出すようになった。
『SystemCommander2000』は商用のマルチOSローダで、MBR導入型だ。OSの再セットアップとFAT32からNTFSへの変換をしたときに、ブートセクタを書き換えられてしまったのだろうか。……などと考えていると、発売元のWebサイトで重大な事実が発覚。
>■インストール先のファイルシステムとして、従来のFAT16/FAT32に加えてNTFSに対応!
僕の使ってる『SystemCommander2000』はこれのひとつ前のバージョン。つまり、NTFSなパーティションにインストールされているとうまく動かないらしい。やられた。しかも、以前に作成してあった『SystemCommander2000 起動ディスク』からPCを立ち上げたところ、変換したばかりのNTFSパーティションを勝手に潰して、FAT32パーティションを新しく作り直してくれる罠。おいおい、なんだそりゃ。その動作はいくらなんでも無いと思うんだが。NTFSパーティションを何にも使われていない領域だと判断してしまったのかな。そんなわけないか。
……というわけで、余計なことをしてくれやがった『SystemCommander2000』をきれいにアンインストールして、パーティションを切りなおし、Windows2000をインストールしたところ。結果としてシステム領域に当てていたパーティションをクリアされてしまったので、一から環境を作り直さなくてはならない。システム領域とデータ領域でパーティションを分けているので、重要なデータが消えるということはなかったのは幸いでした。ブラウザのブックマークと『Becky!』のデータが消えたのは残念だけど、卒研で書いてるプログラムが消えることの恐ろしさに比べたらさほどのダメージじゃない。
それにしても、まっさらなwindows2000の軽さは感動的。
12 11, 2003
『関心空間』その2
いくつかレスも貰えて、キーワードへのリンクも張られて(相手の方が張ってくれたのかしら。多謝なり)、とりあえずはシステムを一通り体験できたというところ。
前にも書いたとおり、コミュニケーションツールとしてはいまいち弱いと感じる。個々人の興味対象を表現するという箇所に重点が置かれすぎている。なんというか、内向的な感じがするんである。
前に書いたのをキーワードとして投げてみた。さて、どんな感想が来るのだろうか。
12 9, 2003
はじめてのトラックバック
blog作成時、「コメントは分かるとして、トラックバックって何だろう」と思っていた。その後、googleさんに聞いたりしてその意味を知り、いつか使ってやろうとその機会を伺っていたのである。そして、ついにトラックバックを実行することができました。これで一人前のbloggerに成れたように感じられ、なかなか感慨深い。
それにしてもこのトラックバックってのは面白い。blog最高。トラックバック先はここ。
ところで、エントリーの新規作成時に、「Ping を受けいれる」というチェックボックスにチェックを入れていないとトラックバックを受けられないらしいということを知る。そんなこととはつゆ知らずである。これからはちゃんとチェックするようにしようとおもいました。
先生、『関心空間』でレスがもらえません!
先輩のblogで知った『関心空間』。ものは試しというわけで、ユーザ登録をして、いくつかキーワードを登録してみた。……みたのは良いのだが、誰もレスをしてくれず、何だかおもしろくないぞ、こんなんで良いのか、なんて思っているところ。……いや、そもそもユーザ数も少ないし、アクセスもそんなにないみたいで、2chのごとき感覚で反応を期待するのが間違ってるのかな。
『関心空間』ってのは、「自分と他人の関心事を共有し、その違いや共通点を見つけ、新しい情報や価値観との出会いを楽しむことを目的にしたサイト」。で、自分の関心の対象を『キーワード』という単位で登録して、それを他人のキーワードとリンクしたりとか何とかできるっていうシステムになっている。
そして、この『関心空間』のもっとも大きな特徴は、「キーワードでつながる」こと。まあ、それは良いとします。コンセプト自体は良いです。文句の付けようも御座いません。だけど、「つながる」という部分がちょっと弱い。ちょっとどころかかなり弱いという気がする。
たとえば、いま、貴方が関心空間に興味あるモノ/コトをキーワードとして登録したとして、それに対してどんなレスポンスがあるかというと。
1.同種のキーワードへのリンクが張られる。これはシステムが勝手にやってくれる……のかと思いきや、どうも手動でやるみたいだ。
2.誰かから、感想の書き込みがある(かもしれない)。
このあたりは具体例を見たほうが分かりやすい。たとえばここなんかにアクセスして、実際にどんなふうになるのかをチェキ。
で、まず1.だ。これはどう考えたってシステムが担当すべき部分だろう。サイトに一通り目を通したが、これを自動的にやってくれる、という記述はどこにもなかったので、おそらく完全にユーザが手動でやるようになっていると思われる。
キーワードを追加するたびに、それと似たようなキーワードが既に登録されていないかをチェックして、見つかればリンクを張る。そんな作業をいちいちやってくれるユーザは少ないんじゃないか。実際、ぼくはそんなこと面倒なことはやってない。キーワードをリンクする機能こそが『関心空間』の一番のセールスポイントになるはずで、リンクの総数がなるべく増えることが望ましいはず。手動というのはなんとかならねーかなと思う。
次に2.だ。これに付いて言えば、その数がとっても少ない。なんせ、書き込みが一つもないキーワードのほうが多いんじゃないかというくらい。で、どうしてそんなに少ないのかというと、サイトのアクセス数の問題もあるだろうが、それよりも書き込みが分散してしまうことが大きい。現在、『関心空間』に登録されたキーワードは11万超。個々のキーワードがBBSを持つという体裁になるから、つまりキーワードと同じ数のBBSが存在するというわけ。
たとえば「iPod」で検索すると、山のようにキーワードが出てくる(なんと633件)。で、それぞれについて、せいぜい10個くらいの書き込みがある。一つも付いていないものも多い。これを一つにまとめたらかなりの数になる。現状だとあまりにも分散してしまっていて、どうしても会話が広がって行かないのだ。
加えて、BBSとしての機能も低い。一昔前のチャットという印象である。
結論として、これらのため、せっかくの「キーワードでつながる」というコンセプトがあまり実現されていないと思う。コンセプトを生かし切れておらず、少し勿体ないという印象を受ける。
このサイトがいったい何なのかっていうことを考えると、出てくるのは2つあるとおもう。一つは、「雑多な物事について、皆で共有の辞書を作るサイト」。もう一つは「個々人が自己の興味対象を表現するサイト」。
このいずれの立場を取るのかが、曖昧になっていると感じる。運営側が「このサイトはこういうサイトなのです」っていうことを、もっと積極的に表明したほうが良いのではないかしら。そして、それに合わせてサイトのシステムをチューンナップして行ければベスト。
ところで、僕が現状を見るに、おそらくだが、運用側としては後者を指向しているのだと思う。でも、私見では、これは良い方向性とは言えないんじゃないかな。ユーザがこのサイトを使って、自分の興味のある事柄を登録するのは何故か。ほとんどのユーザは、「自分の興味のある事柄をネタにして、コミュニケートしたいから」って答えると思う。(そりゃ、中には、「自分の興味関心をカタログ化して眺めたい」っていう、ナルシスティックなひとも居るんだろうけど)
で、そういった欲求に対して、現状の『関心空間』のシステムは十分にコミットできているとは言い難い。まあ、じゃあどうすればいいんだって言われると答えるのは難しいのだけど。
12 1, 2003
Googleさんに訊いてみよう!
たわむれに『今日の井原』を検索してみる。……おお、トップに居るではないか。うむうむ。余は満足であるぞ。
研究室の皆のblogも検索してみる。『今日の筒石』、『ぶろぐ(仮名)』はトップ。『サイトウ』は一般的すぎるから見つからないのは仕方ない。んで、問題は『今日の渋沢』だけが2つ目になってるってことだ。うーん。「井原」「筒石」「渋沢」で何が違うんだろう。Search Engine Optimizeなファクターが何かしらあるのか?
blogのような更新頻度の高いサイトに対しては、googleはちょっと弱いなーとあらためておもふ。キャッシュにあるのは二週間前の『今日の井原』だ。今日までに、もっと面白い書き込みが沢山追加されてるのにな。勿体ないなー。
第二話のおまけ">その存在意義に疑問を抱きながらmanaged C++を弄る
第二話のおまけ
閑話休題。
タイトルに「その存在意義に疑問を抱きながら」と入っているように、実際には、こんなものを書いている僕自身、managed C++にどれほどの有用性があるかは疑問を感じています。
僕が卒研で作るシステムにmanaged C++を使っているもっとも大きな理由は、これを使うことによってC#とC++のシームレスな連携が可能になるからです。たしかにこれはmanaged C++の大きな利点ではあるのですが、実際には、わざわざC#、あるいはVB.NETやJ#.NETとC++を併用することが検討されるプログラムなんて数少ないでしょう。今回managed C++を使うに至った流れはここにある通りなのですが、現在の情勢だと、僕のような立場であればMFCを使うのが自然な選択です。わざわざC# & .NET frameworkを使おうとするのは僕の個人的な趣味によるところが大きく、この組み合わせでシステムを書くというのは他人に勧められるものではありません。
事実、その普及の度合いを見れば、managed C++が世のプログラマたちに受け入れられていないのは明らかです。googleのヒット数も少ないし、BBSでもちっとも話題になっていない。日本のプログラマにとっては、日本語で読める本が一冊もないというのが痛いです(部分的に章を割いて触れられている本ならいくつかあるのですが)。
何故managed C++は使われないのでしょう。まず、言語仕様が非常に入り組み、分かりにくいものになってしまっていることがあります。managed C++はC++に対してオブジェクト試行的な拡張(抽象クラス、インターフェース、イベントetcのサポート)と.NET対応のための拡張(.NET framework、ガベージコレクタ、ボクシングetcのサポート)とを施した言語ですが、C++との整合性の維持のためか、複雑で扱いづらい言語になっていると感じます。まだ僕自身がmanaged C++の言語仕様をあまり理解できていないということもあり、コンパイル時に思いも寄らない箇所でエラーが出て、その意味が分からずに悩まされることが多々あります。
また、わざわざ拡張したにもかかわらず、.NETへの親和性はC#、VB.NETに比べて低いと言わざるを得ません。特にフォームデザイナを使えないのが致命的で、コードレベルでGUIを作る煩雑さを考えるだけで使う気が起きないという人は多いとおもいます。.NETを新しく勉強しようとするときに、言語にmanaged C++を選択するひとがほとんど居ないのもやむを得ないというところでしょう。反面、C#はJavaを模倣してMicrosoftが新しく作った言語で、過去の余計な遺産を引きずることもなく、.NETとの高い親和性を持っていますから。
加えて、C#やVB.NETに比べてオフィシャル・アンオフィシャルの両面でドキュメントの数が少ないことや、言語自体の将来が正直あやしい(VisualJ++のようになるのではないか?)こともあるでしょう。
結局、少なくとも現状では、managed C++を使う理由は、
・既存のC/C++で書かれたコードを.NETに移植したい
・Win32APIとの親和性の高さを活かしたい
といった限定的なものになってしまうというのが結論です。ただ、個人的には面白い言語だと思うし、現在のような位置に居るのは残念だと感じます。
#それにしても、ですます調は書きにくくて疲れる。それに、ですます調はより読者の存在を意識した文体で、こんなほとんど読まれない文章に使うことはないという感じ。次回からは元に戻そうっと。
第二話 ~(unmanaged)C++なクラスを.NETに組み込んでみよう!~">その存在意義に疑問を抱きながらmanaged C++を弄る
第二話 ~(unmanaged)C++なクラスを.NETに組み込んでみよう!~
さて、和書の一冊も発刊されず、2chのスレッドは完全に寂れ、いまや当のMicrosoftですらその存在を覚えているのかが疑われる不遇な言語、managed C++のお時間です。
今回は、managed C++を使う一例として、また、C++なコードとC#なコードを連携させるケーススタディとして、C++で書かれた既存のクラスを、.NETな環境に移植するっていうのをやってみましょう。
C++なコードをシームレスにC#から呼び出せるさまには、おそらく貴方も感動を覚えるはずです……たぶん。また、VS.NET、そしてC#やmanaged C++をまったく使ったことがなくても、コードを追っていけば、何をやっているのかは余裕で分かると思います。(でも、その有り難みや面白さはいまいち伝わらないかも知れませんが)
それでは始めましょう。先ず、C++で書かれたクラスを用意します。これはC++でのコンパイルが通るものなら何でもOK。今回は、テスト用に書いた小さなクラスを使いました。メッセージボックスを表示するだけの関数をたった一つ持つという、わざわざクラス化する意味もない簡潔なクラスです。
#include <windows.h> class CTestClass { public: CTestClass() {}; ~CTestClass() {}; void DoSomething() { MessageBox(NULL, "ほげほげ", "", MB_OK); } }; |
次に、VS.NETを開いてソリューションを作成し、その下にmanaged C++のプロジェクトを作ります。[新しいプロジェクト]ダイアログを開き、[Visual C++プロジェクト]の中の[Managed C++クラスライブラリ]を選択してください。作成できたら、C++で書かれたクラスをプロジェクトに追加しましょう。
続いて、追加したC++クラスのwrapperを、managed C++で書きます。VS.NETによって、プロジェクトと同名のヘッダファイルが自動的に作られているので、簡便のため、今回はこれを編集します。自動的に作成された時点でのヘッダファイルは以下のようになっています。
#pragma once using namespace System; namespace My { public __gc class Class1 { // TODO: このクラスの、ユーザーのメソッドをここに追加してください。 }; } |
こいつをちょちょいといじくって、CTestClassクラスのwrapperをmanaged C++で書いてやります。
CTestClassクラスをプリプロセッサでincludeしてやり、namespaceの中にクラスを書きましょう。ここでは、"using"や"__gc"の意味を知る必要はありません。さらっと流してしまってOKです。興味がある人はwebやVS.NETのリファレンスでしらべてみてください。
書き換えたヘッダファイルは以下のようになります。
#pragma once #include "TestClass.h" using namespace System; namespace Testspace { public __gc class TestClass { private: CTestClass *tc; public: TestClass() { tc = new CTestClass(); } ~TestClass() { delete tc; } void DoSomething() { tc->DoSomething(); } }; } |
それでは、プロジェクトをビルドしてください。見事通れば(たぶん通るはずです)、managed C++側のコーディングはこれでおしまい。ひとまず、クラスライブラリの完成です。では、これを実際にC#から呼び出してみましょう。
ソリューションにC#なプロジェクトを追加します。[ファイル]->[プロジェクトの追加]->[新しいプロジェクト]からダイアログを呼び出し、プロジェクトを追加してください。テンプレートは[Windowsアプリケーション]あたりがよろしいでしょう。
追加されたプロジェクトに、managed C++で作成したクラスライブラリへの参照を設定します。ソリューションエクスプローラで、C#プロジェクトの中の[参照設定]からホップアップメニューを呼び出し、[参照の追加]を選択してください。ダイアログが表示されますので、[プロジェクト]タブを選択し、リストボックスのなかのmanaged C++なプロジェクトをダブルクリックしましょう。以下のようになったら、OKボタンをクリック。これで、managed C++で作成したクラスライブラリを、C#から利用できるようになります。
プロジェクトエクスプローラで、参照設定に新しく参照が追加されたことを確認してください。
では、さっそくC#から作成したクラスライブラリを呼び出して見ましょう。フォームデザイナを使って、自動的に追加されたフォームにボタンを配置し、Clickイベントにコードを追加してみました。
private void button1_Click(object sender, System.EventArgs e) { Testspace.TestClass tc = new Testspace.TestClass(); tc.DoSomething(); } |
これをビルドし、実行してみます。結果はご覧の通り。
C++で書かれたコードを、C#から呼び出し、実行できていることが分かります。それがどうした、と言われてしまいそうですが、これは実はとてもハイパーで素敵なことなのです。C++とC#とを、一つのプログラム(VS.NETの言葉で言うとソリューション)のなかで同時に扱うことができているという点に注目してください。そもそも、C++はネイティブコードに、C#はVMの中間言語にコンパイルされます。しかし、いままでの手順を見ても分かるとおり、そんな差異をプログラマはまったく意識することなく、実装をおこなうことができます。
DLLやCOMのような面倒な手続きを必要とせずに、C#とC++とを連携させることができることには大きな利点があります。C#とC++とを併用することによって、ひいてはC#から.NET Frameworkを呼び出し、C++からWin32APIを呼び出すというようなライブラリの使い分けをすることによって、各々の適正に応じた処理の切り分けをすることができます。managed C++を仲立ちとすることで、C#とC++をスムースに統合した開発が可能になるということは、非常に興味深く、また検討に値するソリューションであると言えるでしょう。
というわけで、第二話はこれでお仕舞い。次回、第三話では、managed C++の言語仕様を概観してみようと思います。オブジェクト指向的に進化した言語仕様や、追加された沢山の予約語について、サンプルコードを挙げながら解説します。さらには.NETの中でのその位置付けについて考察をしてみましょう。
=========================================
追記(2004/06/08)
VisualStudio.NETなら上のやり方で大丈夫なのですが、VisualStudio.NET2003ではビルドに失敗するとおもいます。これはVS.NETがバージョンアップした際に、「C++クラスライブラリ」プロジェクトのデフォルト状態で"msvcrt.lib"および"msvcrtd.lib"をリンクしないようになったためです。これらのlibはC言語の標準ライブラリで、managed C++だけを使う限りではリンクする必要がないため、リンクしないような設定に変更されたのだとおもわれます。
VisualStudio.NET2003でビルドを通すには、プロジェクトの設定で上の2つのlibをリンクするようにするか、プリプロセッサとして次の2行をソースコードに追加してください。
#pragma comment(lib, "msvcrt.lib") #pragma comment(lib, "msvcrtd.lib") |
Post a comment to 'その存在意義に疑問を抱きながらmanaged C++を弄る
第二話 ~(unmanaged)C++なクラスを.NETに組み込んでみよう!~'
いまさら君をどうしろと言うのさ
今日、部屋を掃除していたら、隅っこからDuron650MHzが出てきた。
ずっと前にPCをアップグレードしたときに、その辺にうっちゃってそのままだったらしい。
押し入れの棚には、MII300MHzとか、440BXマザーとか、AT電源のケースとか、もう使わないパーツが雑多に積んであるわけなんだが、端金にしかならなくても良いから不要になった時点でソフマップとかに持っていくべきなんだよなー、死蔵するよりも誰か他の人に使われたほうが絶対良いもんなーと思いました。