arc の日記

はてなダイアリーから引っ越してきました。さらに新しい記事は https://junkato.jp/ja/blog/ で書いています。

DokuWikiのユーザ管理をMySQLに差し替え

オープンソースプロジェクトMaterealでは、ドキュメント管理・情報共有にWikiを使っています。Wikiエンジンは様々なものがありますが、日本語、英語など多言語で自由に記事を作れて、それなりにユーザ管理などの仕組みもあり、積極的に開発が続けられている…という条件で選ぶと意外と少なく、現在のところDokuWikiに落ち着いています。

DokuWikiは初期状態で全てのデータをプレーンテキストで保持するようになっており、登録ユーザ一覧についても同様です。 dokuwiki/conf/users.auth.php に以下のような生データが置いてあります。

# users.auth.php
# <?php exit()?>
# Don't modify the lines above
#
# Userfile
#
# Format:
#
# user:MD5password:Real Name:email:groups,comma,seperated

admin:$1$hogefuga:arc@dmz:arc@example.com:admin,user

とある事情で認証に使われるデータベースをMySQLに差し替えたので、記録を残しておきます。なお、公式サイトのWiki内に必要最低限の情報が載っているんですが、ちょっと分かりづらいです。「移行」でなく「差し替え」と書いているのは、元のユーザとグループの数が少なく実データについては手動で移行したためです。

MySQLデータベースを準備する

認証情報を格納するためのテーブルを作ります。

-- ユーザ情報を格納する dw_users
CREATE TABLE IF NOT EXISTS `dw_users` (
  `uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `login` varchar(20) NOT NULL DEFAULT '',
  `pass` varchar(60) NOT NULL DEFAULT '',
  `name` varchar(255) NOT NULL DEFAULT '',
  `email` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`uid`),
  UNIQUE KEY `login` (`login`)
);

-- グループ情報を格納するdw_groups
CREATE TABLE IF NOT EXISTS `dw_groups` (
  `gid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `gname` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`gid`),
  UNIQUE KEY `name` (`gname`)
);
-- userグループ、adminグループを作成
INSERT INTO `dw_groups` (`gid`, `gname`) VALUES (1, 'user'), (2, 'admin');

-- ユーザとグループの包含関係を格納するdw_usergroup
CREATE TABLE IF NOT EXISTS `dw_usergroup` (
  `uid` int(10) unsigned NOT NULL DEFAULT '0',
  `gid` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`uid`,`gid`)
);

ユーザ情報を移行したいなら次のようにすればOKです。

-- ユーザ登録
INSERT INTO `dw_users` (`uid`, `login`, `pass`, `name`, `email`) VALUES
(1, 'admin', '$1$hogefuga', 'arc@dmz', 'arc@example.com');

-- 登録したユーザをuser,adminグループに入れる
INSERT INTO `dw_usergroup` (`uid`, `gid`) VALUES (1, 1), (1, 2);

MySQL用の設定ファイルを作る

まず dokuwiki/conf/mysql.conf.php を作ります。 dokuwiki/conf/mysql.conf.php.example というのがありますが、これを書き換えるのは面倒でしょうから以下書き換えたあとの内容を転載します。

<?php
$conf['auth']['mysql']['server']   = 'mysql.example.com';
$conf['auth']['mysql']['user']     = 'mysqlusr';
$conf['auth']['mysql']['password'] = 'mysqlpwd';
$conf['auth']['mysql']['database'] = 'mysqldb';

/* MySQLのデバッグメッセージ出力。OFF。 */
$conf['auth']['mysql']['debug'] = 0;
/* パスワードはPHP側で暗号化してからMySQLに送るので平文パスは送らない。 */
$conf['auth']['mysql']['forwardClearPass'] = 0;
/* 操作時にロックするテーブル一覧 */
$conf['auth']['mysql']['TablesToLock']= array("dw_users", "dw_users AS u","dw_groups", "dw_groups AS g", "dw_usergroup", "dw_usergroup AS ug");

/* 以下ユーザ認証などで使うSQL文 */
$conf['auth']['mysql']['checkPass']   = "SELECT pass
                                         FROM dw_usergroup AS ug
                                         JOIN dw_users AS u ON u.uid=ug.uid
                                         JOIN dw_groups AS g ON g.gid=ug.gid
                                         WHERE login='%{user}'
                                         AND gname='%{dgroup}'";
$conf['auth']['mysql']['getUserInfo'] = "SELECT pass, name, email AS mail
                                         FROM dw_users
                                         WHERE login='%{user}'";
$conf['auth']['mysql']['getGroups']   = "SELECT gname as `group`
                                         FROM dw_groups g, dw_users u, dw_usergroup ug
                                         WHERE u.uid = ug.uid
                                         AND g.gid = ug.gid
                                         AND u.login='%{user}'";
$conf['auth']['mysql']['getUsers']    = "SELECT DISTINCT login AS user
                                         FROM dw_users AS u
                                         LEFT JOIN dw_usergroup AS ug ON u.uid=ug.uid
                                         LEFT JOIN dw_groups AS g ON ug.gid=g.gid";
$conf['auth']['mysql']['FilterLogin'] = "login LIKE '%{user}'";
$conf['auth']['mysql']['FilterName']  = "name LIKE '%{name}'";
$conf['auth']['mysql']['FilterEmail'] = "email LIKE '%{email}'";
$conf['auth']['mysql']['FilterGroup'] = "gname LIKE '%{group}'";
$conf['auth']['mysql']['SortOrder']   = "ORDER BY login";
$conf['auth']['mysql']['addUser']     = "INSERT INTO dw_users
                                         (login, pass, email, name)
                                         VALUES ('%{user}', '%{pass}', '%{email}',
                                         '%{name}')";
$conf['auth']['mysql']['addGroup']    = "INSERT INTO dw_groups (gname)
                                         VALUES ('%{group}')";
$conf['auth']['mysql']['addUserGroup']= "INSERT INTO dw_usergroup (uid, gid)
                                         VALUES ('%{uid}', '%{gid}')";
$conf['auth']['mysql']['delGroup']    = "DELETE FROM dw_groups
                                         WHERE gid='%{gid}'";
$conf['auth']['mysql']['getUserID']   = "SELECT uid AS id
                                         FROM dw_users
                                         WHERE login='%{user}'";
$conf['auth']['mysql']['delUser']     = "DELETE FROM dw_users
                                         WHERE uid='%{uid}'";
$conf['auth']['mysql']['delUserRefs'] = "DELETE FROM dw_usergroup
                                         WHERE uid='%{uid}'";
$conf['auth']['mysql']['updateUser']  = "UPDATE dw_users SET";
$conf['auth']['mysql']['UpdateLogin'] = "login='%{user}'";
$conf['auth']['mysql']['UpdatePass']  = "pass='%{pass}'";
$conf['auth']['mysql']['UpdateEmail'] = "email='%{email}'";
$conf['auth']['mysql']['UpdateName']  = "name='%{name}'";
$conf['auth']['mysql']['UpdateTarget']= "WHERE uid=%{uid}";
$conf['auth']['mysql']['delUserGroup']= "DELETE FROM dw_usergroup
                                         WHERE uid='%{uid}'
                                         AND gid='%{gid}'";
$conf['auth']['mysql']['getGroupID']  = "SELECT gid AS id
                                         FROM dw_groups
                                         WHERE gname='%{group}'";

最後に、このスクリプトDokuWikiから読まれるように、 dokuwiki/conf/local.protected.php に次の行を足します。このファイルがない場合は作成してください。

<?php
    require_once('mysql.conf.php');
?>

認証方法をMySQLに変える

Webから、 dokuwiki/?do=admin&page=config の認証のセクションで、認証方法(ACL)をplainからmysqlに変え、デフォルトグループ(ACL)をuserからadminに変えます。

前段で管理者のユーザ情報を移行してあれば何事もなくログインできますが、そうでなければ新たに管理者にしたいユーザ名で新規登録して、そのユーザでログインします。デフォルトグループがadminになっているので管理者ユーザとしてログインできるはずです。

管理者としてログインしたらデフォルトグループ(ACL)をadminからuserに戻します。

以上です。

特許出願に必要な新規性について

昨日の記事特許法の概要を書きましたが、本来の課題レポートはもっと実用的なものでした。発明が特許として認められるためには「新規性」「進歩性」の両方が必要とされています。そのうち、「新規性」という条件がいかなる原則で判断されるかを(研究者へのアドバイスのようなかたちで)まとめろ、というものでした。せっかくなのでこれも転載します。

長々書きましたが、結論から言うと「内容が固まったらすぐさま特許出願せよ」という一言に尽きます。

発明の新規性

概要で説明したように、特許制度の趣旨は発明の公開の代償として独占権を付与するものです。したがって、特許法は二十九条一項で新規の発明であること(新規性)を特許出願の条件として課しています。なお、特許庁特許の審査基準を公開しており、新規性についても判例とともに基準を紹介しています(第2章 新規性・進歩性)。以降の記述もこの基準を下敷きにしています。続く各号の規定は、新規性を有しない(したがって、出願できない)発明を三つに分類しています。全ての号に「特許出願前に日本国内又は外国において」という但し書きが付いていますが、これは官公庁の営業日などと無関係に、時分まで考慮し、外国の場合は日本国内の時刻に換算して特許出願の前後を判断するという意味です。

さて、第一号は「公然知られた発明」です。公然知られた(=公知)とは、不特定の人に秘密でない内容として知られていることを指します。知っている人が特定されており、しかも内容が秘密として守られていれば公知になりません。このように守秘義務を課すためには、商慣習上、暗黙の合意が認められることもありますが、内容を署名付きで文書化しておくことが望ましいでしょう。なお、守秘義務を負う人が秘密でないものとして発明の内容を他の者に教えた場合は公知となるため、特許出願ができなくなります。また、学会誌などの原稿の場合は、原稿の内容が公表されるまでの間は査読者など限られた人にしか知られないため、公知とはなりません。まとめると、特許申請したい研究内容は、共同発明者となる人か、秘密を守ってくれそうな相手にのみ相談しましょう。査読者を信用するなら、学会用に論文を投稿するだけでは公知とならないため依然として特許申請可能ですが、なるべく早くするに越したことはないです。

次に、第二号は「公然実施された発明」です。これは、発明の内容が「公然知られる状況」または「公然知られるおそれのある状況」で実施されたことを指します。実際に誰かに知られた事実は必要ありません。「公然知られる状況」とは、例えば工場であるものの製造状況を不特定の者に見学させた場合に、当業者が発明内容を容易に知ることができるような状況です。また、「公然知られるおそれのある」とは、装置の外面を見学するだけでは発明内容を知ることができなくても、装置の内部を見ること、または内部について説明してもらうことができるような状況です。まとめると、特許申請したい内容を含むシステムはなるべく不特定の人に見学させないようにしましょう。また、やむにやまれず見学させる場合は、自分だけで引率するか、特許申請する内容まで踏み込んで知らない、あるいは知っているが話さないと信頼のおける人に見学の引率を頼みましょう。いずれにせよ見られたくないところを絶対に見せない工夫が必要です。

最後に、第三号は頒布された刊行物に記載されるか、またはインターネットを通して公衆に利用可能となった発明を指しています。「刊行物」とは公衆に対し頒布により公開することを目的として複製された文書、図面その他これに類する情報伝達媒体のことで、マイクロフィルムやCD-ROMなども含まれます。これが不特定の者に見うる状態におかれることが「頒布」で、頒布のタイミングは、刊行物に記載された時期などから推定することになっています。インターネットの場合は、リンクや検索エンジンによってアクセス可能だったり、アドレスが新聞や雑誌などに載ったりしていることで不特定の者が見うるような状態におかれたタイミングで「公衆に利用可能となった」と判断されます。なお、第二号と同様に、現実に誰かが刊行物やインターネット上のデータを見た事実は必要ありません。まとめると、特許申請したい研究内容は学会のWebサイトで公開されたり予稿集や論文誌などで刊行される前に出願手続きを終えましょう。

新規性喪失の例外

前項で説明したとおり、発明は様々なかたちで他人の知るところとなり、新規性を喪失する危険性があるため、特許として認可される可能性があるならなるべく早く特許出願を終えるべきです。ただし、特許庁の「発明の新規性喪失の例外規定を受けるための出願人の手引き(PDF)」の言葉を借りると「刊行物への論文発表等によって自らの発明を公開した後に、その発明について特許出願をしても一切特許を受けることができないとすることは、発明者にとって酷な場合もあり、また、産業の発達への寄与という特許法の趣旨にもそぐわないといえ」ます。そこで、特許法第三十条では、第一項〜三項で規定された条件下なら新規性の喪失を法律的になかったものとして扱う救済措置が規定されています。これら全ての項に、発明が公開された日から六カ月以内に特許出願する必要がある旨が書かれています。また、第四項では、救済措置を受けるためには、特許出願日から三十日以内に公表などの事実を証明する書面を提出する必要があることが規定されています。

まず第一項では、発明の試験を行ったり、刊行物やインターネットで発表したり、特許庁長官が指定した学会で文書をもって発表した結果として発明が初めて公知となり、新規性を喪失した場合を救済するとしています。なお、文書をもって発表とは、単なる口頭発表ではなく、文書に記載された内容に基づく発表を指します。関西TLOの「知的財産入門編 学会発表と特許出願の関係」によれば、文書にはスライドやOHPなども含まれるとされています。また、特許庁の「発明の新規性喪失の例外規定についてのQ&A集(PDF)」によれば、学会で発表された内容が新聞報道されるなど、二次的に公知となった場合でも、学会発表が一次ソースと認められる場合はこの救済措置を受けることができます。

また、第二項では、他者の守秘義務違反や脅迫、スパイ行為など特許を受ける権利を有する者の意に反して発明が初めて公知となり、新規性を喪失した場合を救済するとしています。公知となって六カ月以内に特許申請する必要があるため、六カ月以上監禁されると詰むのでは…?

最後に、第三項では特許庁長官が指定する博覧会への出展で発明が初めて公知となり、新規性を喪失した場合を救済するとしています。なぜ博覧会だけ第一項から分けたのかは謎です。学会は限られた人しか参加しないけど博覧会は誰でも参加できるから?

いずれにせよ第三十条で規定されているのはあくまで「例外」的な救済措置です。救済措置に頼らずに済むよう、また、煩雑な事務手続きを増やさなくて済むよう、繰り返しになりますが特許出願はなるべく早くすべきです。

特許法のさわりの部分だけ

知的所有権著作権という講義を取っていて、提出すべきレポート課題と違うところを文章にまとめてしまってむしゃくしゃしたので、その部分を転載します。特許法の全文は政府のWebサイトで読めますが、解説がないとその背景や意義は全然分かりませんね。いやはや面白いです。

ちなみに、これを読んでる人の中に専門家がいる気がするので、間違ってたら教えてください:)

特許法の目的

発明は情報であり、情報は非排他性を持っています。すなわち、コピーするのが容易で、いったんコピーされれば同時に複数人によって使用できます。したがって、発明者以外の他人にとっては、発明を知ることができた時点で(発明の活用法に関する技術的ノウハウは別にして)発明者と同等の立場に立てたことになり、発明の優位性が失われます。発明者は時間とお金、人手を使って試行錯誤を重ねた結果として発明に至るものですから、単にこの情報を他人に明け渡すだけでは報われません。一方、発明は利用されてこそ社会的な価値を持てるものです。発明者の利益が確保されることと同時に、発明が秘密にされることなく適正に利用されることが望ましいでしょう。

特許法は、このように、発明者の権利を保護して新たな創作へのインセンティブが損なわれないようにすること、また、発明の第三者による利用を認めて産業の発展を促進することを目指しています。(特許法第一条)

特許法が対象とする発明の定義とその分類

特許法が対象にする発明は、

  1. 自然法則を利用した
  2. 技術的思想の
  3. 創作のうち
  4. 高度なもの

を指します。(同第二条)

例えば(1)に当たらないのは自然法則それ自体や自然法則と矛盾する永久機関など、また、自然法則を利用しない人為的取り決めです。(2)は一定の目的を達成するための客観的な手段であることを意味しており、個々人の技能や情報の単なる提示は該当しません。(3)は発明者が新しいものを創り出していることを指し、自然現象を発見することは当たりません。ただし、自然現象を手段として利用して特定の目的を達成できた場合は、そのプロセスの考案が創作として扱われます。(4)は実用新案との区別を示すための要件です。実用新案法第二条は実用新案の定義を示しており、特許法第二条による特許の定義と似ていますが「高度な」という文言がありません。ただ、実際に特許庁によって高度か否かの判断が行われることはありません。発明者は、特許法と実用新案法が規定する特許と実用新案の相違を踏まえて、自らの発明をどちらとして出願するか選択することになります。

発明は物の発明と方法の発明に大別されます。(同第二条三項)それぞれ社会に流通させる方法が異なるため、権力の効力の及ぶ範囲が別個に規定されています。物の発明の場合はその物を生産、使用したり、販売したりする行為が対象になり、方法の発明の場合は、その方法を使用する行為のほか、もしその方法によって物が生産される場合は、生産物に関する物の発明相当の行為が対象になります。

なお、実用新案と特許の相違の概略は以下の通りです。まず、実用新案は物の発明のみを扱い、方法の発明を対象としません。次に、権利の存続期間が10年であり、審査がありません。一方、特許は権利の存続期間が20年で、審査によって新規性や進歩性の要件を備えていることが判断され、保証されます。したがって実用新案は出願にかかる費用が比較的安価となり、また、権利を行使するためには別途評価書を請求して特許庁の判断を仰ぐ必要があります。

ワークショップ(WISS2010, 裏磐梯)

http://www.ustream.tv/recorded/11203237

昨年12月1-3日のことになりますが、裏磐梯で開かれた国内学会のワークショップで、修士課程を通して取り組んできた研究成果を発表しました。上の写真画像のリンク先は発表の様子を録画したものです。18分45秒くらいから喋っています。本件に関しては今年1月にシンポジウム(第51回プログラミング・シンポジウム, 箱根)でも経過を発表したのですが、当時は研究としての貢献がまとまっていなくてぼろぼろでした。今回は比較的綺麗にまとめられてよかったです。

この記事では、すごく大ざっぱに発表内容を紹介してから、学会自体の雰囲気についても触れてみたいと思います。

Matereal

発表では、僕が作ってきた「Matereal」というツールキット*1の概要と利用例を紹介しました。発表資料や関連するデモ動画などはWISS2010特設サイトに置いてあります。

Materealは、比較的安価なハードウェアセットアップを用いて、インタラクティブなロボットアプリケーションを開発しやすくするツールキットです。ロボットを用いた研究はお金がかかるのが普通で、研究プロジェクトが大規模になりがちなんですが、実際に使えるロボットを開発するうえで、もっと多くの人がアプリケーションをプロトタイピング*2できるようになったほうがいいのではないか、というのが根っこの問題意識です。

Human-Computer Interactionの研究ではコンピュータや携帯端末の新しい入出力デバイスをプロトタイピングするPhysical Computingという分野が盛り上がっていて、それを支えているのがPhidgetsに始まる様々なプロトタイピング用のツールキットです。僕は、実用ロボットの研究開発についても、このようなプロトタイピング用ツールキットが一定の役割を果たせることを期待しています。ロボット関係ではすでに様々なミドルウェアやツールキットが提案されているのですが、基礎技術の研究開発に使うためのものが多く、プロトタイピングを目的にしたものはありませんでした。…詳細な比較は論文本文や公式サイト内のWikiに譲ります:)

Materealの機能は大きく分けて三つあります。

http://mr.digitalmuseum.jp/wp-content/uploads/2010/11/mr-equation.png

Localization
Webカメラと視覚マーカを用いて、ロボットと物体の床面上での二次元座標を取得できる。
Locomotion
二次元座標系上にベクトル場を定義することでロボットに対して高レベルな移動指示が出せる。とくに、指定した位置への移動や物体の運搬、他ロボットの追跡といったメジャーな移動指示を実現するベクトル場の定義はプリセットで用意されている。
Workflow management
複数のタスク*3を指定した順序(ワークフロー)で実行させられる。ワークフローを可視化してデバッグに活用することもできる。

これらを用いると、下に示したようなアプリケーションが作れます。なお、この二つ以外にも様々なアプリケーションのデモ動画へのリンクがWISS2010特設サイト下部「Materealの活用例」に掲載されています。

簡単な例。机の上で、チョコの箱を手元に持ってきてくれます。

凝っている例。杉浦さんの研究。指示したとおりの手順で料理をしてくれます。

Materealは、組み込みの機能だけでは、平面上で動きまわる小型ロボットを用いた比較的単純なタスクをこなすアプリケーションしか実装できません。それでも、Materealが提供する高レベルなAPIApplication Programming Interface)セットは、より複雑なタスクをこなせるロボットを用いたアプリケーションのプロトタイピングにも活用できる将来性があります。したがって、ロボットアプリケーションのプロトタイピング用ツールキットの研究に先鞭をつけることができたと考えています。

WISS

最後に、発表の場となったWISSについて紹介しておきます。

http://den.atsuage.net/blog/?p=1469

WISSはWorkshop on Interactive Systems and Softwareの略で、Human-Computer Interaction分野では国内最大規模のワークショップ≒学会です。写真は…僕は写ってないんですが、楽しげな雰囲気が伝わるかと思ってでんでんかむしさんのブログから借りてきました。

もともと「伝統的に革新的」と言われるだけあって大変面白いワークショップで、投稿論文をもとに著者が発表する昼のセッションでは、発表を聴講している参加者が発言できるチャットシステムなど議論が促進する仕掛けが充実しています。この仕掛けはWISS Challengeと呼ばれていて、有志によって毎年改善されており、今年はプレゼン資料の閲覧やTwitterとの連携といった機能が組み込まれた凝りに凝ったものでした。また、夜には、お酒を飲みながら会場の各所で半ばゲリラ的に始まる発表を聞いたり議論したりするナイトセッションが開かれます。泊まりがけのワークショップならではの取り組みですね。

今年は、とくに「三大改革」が実施されました。その一環で、論文に研究上の貢献とは別の気持ちを書ける「未来ビジョン」という欄が設けられ、発表でも、未来ビジョンを議論することが義務付けられました。僕の発表では未来ビジョンのところが一番盛り上がったので、改革の恩恵に与ることができたと言えます。既にある学会の論文の形式を公式に変えることは大変な労力を伴うと思うので、運営委員会の方々には心から敬意を表します。

なお、ツールキットMaterealの開発を通じて考えた未来ビジョンについては別に記事を書きます。

*1:ソフトウェア開発に使える「道具」のセット。GUIツールキットなどが有名。

*2:試作→改良のサイクルを短いスパンで何度も回すこと。

*3:前項の移動指示(Locomotion)と対をなすのはその場での操作(Manipulation)であり、これらをまとめてタスクと呼んでいる。

寒中見舞い

元々こんな輝度高くなかったんですが…今、手元に元データを編集できる環境がないのでとりあえずこれで。遅ればせながら、どうぞよろしく。

今年の年賀状(寒中見舞い)はCreative Commonsライセンスに基づいて作ってみました。TracksDeux RabbitsCC BY-NC 2.0に基づいてリミックスしています。というわけで、この画像の配布ライセンスもCC BY-NC 2.0に従います!

UIST2010後のラボ訪問(New York, NY & Boston, MA, USA)

10月にUIST2010という学会へ参加したあと夜のNYを堪能したり現地の研究室をいくつか訪問したのですが、その記録を書き損ねていたので年内にまとめておきます。時が経つのが早い!

写真は撮ったもののうちごく一部しか載せていません。Picasa ウェブ アルバムにはColumbia UniversityUniversity of Massachusetts LowellMIT Media Labで撮った写真がもう少し多く載っています。

10月6日 学会終了

10月6日まではUISTに一緒に参加した先輩と同じ部屋に泊まっていたのですが、先輩が結婚式のため(おめでとうございます!)6日に帰国したので、6日の宿は一人でそれなりに安い値段で泊まれるところを探す必要がありました。一週間前くらいにネットで急ぎ探したところ、最初に見た日本人が経営している安宿が満杯だったので、一泊$45くらいのユースホステルHI New Yorkを予約しました。

写真左はユースホステルのベッド。他の人と相部屋で、一緒になったのはドイツ人カップルでした。なかなか気さくな人たちでよかった。ユースホステル初体験でどきどきしてたんですが、杞憂でした。真ん中はユースホステルの廊下。殺風景ですが必要十分といった感じ。シャワーはトイレと同じところに共用のがありました。右はユースホステル出たところの通りの写真。渡航中、おおむね天気がよくてよかったです。

なお、次の日訪問するColumbia Universityの研究室の博士課程学生は日本人でした。彼と事前に連絡を取っていたのですが、聞けばこの日の夜は偶然コロ大の日本人学生の集まりがあるとのこと。せっかくなのでお邪魔してきました。10人前後いたように思います。理論物理専攻の人以外はだいたい文系で、MBA取ろうとしてたり、政治家になろうとしてたり、官僚だったり…学生といっても色々でした。また、この会のあと夜のTimes Squareと近くの高級クラブに連れて行ってもらいました。

高級クラブといってもお酒を頼まなければお金はかからない良心的なところでした。プールがあったり、ビルの屋上でエンパイアステートビルが見えたり、なるほどさすがニューヨークぱねえと思いました。

クラブに行く前に腹ごしらえした日本食の萩。食べ終わりそうなときに撮ったので汚いです。日本の居酒屋メニューと大差ないものがでてきましたが、基本的に味が濃かったです。何でも醤油味というか。

10月7日 New York研究室訪問

Columbia UniversityのSteven Feiner研を訪問しました。Augmented Realityの始祖みたいな研究室です。前夜からお世話になっている博士課程の院生にキャンパス案内と研究紹介をしていただきました。また、僕の現在の研究テーマについて相談に乗ってもらいました。

この大学には同じ研究室の先輩である@etopirika5さんが留学しているので、その研究室も見てきました。左から、大学の建物、学生個々人に割り当てられる私書箱、先輩の机。どこを見てもリッチな匂いがしました。それもそのはず、学部生の年間授業料が500万円を下らないとか何とか…もちろん奨学金などの制度は整備されているようです。また、博士課程の学生は逆に給料をもらうのが普通とのこと。

同日駆け足でメトロポリタン美術館を訪問したりもしましたが、滞在時間30分未満…そのうちリベンジします。

この日の夜、夜行バスでBostonへ向かいました。なお、Bostonには学会中もお世話になった@etopirika5さんについてきていただきました。何から何までありがとうございます。海外一人旅はまだ慣れないのでとても心強かったです。

10月8日 Boston研究室訪問

早朝Bostonに着き、夜の宿泊先に荷物を預けたのち、州北部にあるUniversity of Massachusetts Lowellへ向かいました。Lowellは郊外なので、普通の地下鉄はなくCommuter rail(日本でいうところの通勤列車)を使いました。異様に空いてたんですけど経営大丈夫なんでしょうか。Lowell駅はのどかな田舎らしく、せわしない都会から離れた実感が湧いて少し安心できました。

この大学ではHuman-Robot Interactionで有名なHolly Yanco先生の研究室を訪問しました。先生は不在だったのですが、その場にいる学生にちょっと前に話題になったロボット操作用のマルチタッチインタフェースや古き良きボタンやジョイスティックでロボットを操作するデモを見せてもらいました。丁寧に解説してくれて助かりました。

ただ、ロボット操作用のマルチタッチインタフェースは僕が卒論と国際学会で似たようなものさらに進んだコンセプトのものを先行して発表しているのですが、言葉で紹介しても「ヘェ」というくらいで、のれんに腕押しで切なくなりました。動画見せてあげればよかったのかな。といいますか、訪問の少し前に発表された同研究室のサーベイ論文では僕の発表にリファレンスが飛んでたので知らないわけないんだけど…担当者不在ということだったのかな…もごもご。フルペーパーになっていれば少しは反応が違ったのかな、と悔しくもあり。精進します。

研究室訪問後、食堂でお昼ごはん。いかにもアメリカンな感じですが普通に美味しかったです。ケチャップやマスタードがタンクから出てくるのはやりすぎだと思うんだ。

その後、MIT Media LabのCamera Culture Lab(Ramesh Raskar教授)とLifelong Kindergarten(上田信客員教授)を訪ねました。それぞれ、光学をうまく使った技術と、教育用ツールキットのLEGOとの共同研究で著名な研究室です。前者は東工大からきている日本人留学生、後者は上田教授ご自身にご案内いただき、アメリカなのに日本語でのやり取りになりました。やっぱり日本語は楽ですね。

せっかくMedia Labに行ったのだから、と他の研究室の様子もアポ無しで覗いてきました。左はLifelong KindergartenのLEGOブロック棚。真ん中はPersonal Robots Groupの謎のオブジェ。右はTangible Media GroupのPingPongPlus。実動しているのは初めて見ました。アポ無しでもみんなけっこう気さくに質問に答えてくれて嬉しかったです。入学希望者だと思われたのかな?

ちなみに、途中NAISTの学生に会いました。自然言語処理の学会が云々と言っていたので、かの有名な(?)id:mamorukさんのお知り合いだと思うのですが、分かりません。

夜は、先輩の妹の友人宅(かなり遠い関係!)に泊めてもらって、9日の早朝日本に向けて発ちました。日本着は10日の午後でした。動いた距離や訪問先の数を考えるとけっこう強行日程でしたが、とても実りある訪問になりました。

  • 2011/1/14 追記; 写真がいくつかリンク切れになっているのを修正しました。あとMITで会った人たちは本当にmamorukさんの知り合いでした!なんか嬉しい。

NyARToolkitの二値化の閾値をスライダーで調整するツール

wonderfl build flash online | 面白法人カヤックJava版のようなものが、ソースコードのかたちではずっと前から手元にあったのですが、なかなかバイナリ形式で配布できずにいました。

最近このソースを含むオープンソースプロジェクト「matereal」を立ち上げたので、ついでにここでバイナリを公開します*1

このツールの使い道

NyARToolkitを用いて安定してマーカーを検出するためには、カメラの撮像を白黒に二値化する閾値(NyARToolkit 2.5.x系ではNyARRasterFilter_ARToolkitThreshold.setThreshold(int))をうまく指定してやる必要があります。このツールを使うと、閾値をスライダーでインタラクティブに調整しながら撮像を二値化した様子をリアルタイムに確認でき、現在の環境光で適切な閾値がどのくらいかを簡単に知ることができます。

マーカーを読み込む機能はなく、とりあえずARToolKitと同じやり方で正方形を見つけたらオレンジ色で囲むようになっています。

QPToolkitのようなツールと組み合わせると効果的だと思うのですが、作者がずぼらなのか閾値を指定する手だてがないので将来的に連携できたらいいですね。

このツールの使い方

使い方は、中に入っている実行ファイルを起動するだけです。PCに接続されているWebカメラの一覧が表示され、どれかを選ぶとその撮像が二値化されてウィンドウに表示されます。

このツールのソースコード

Google Codeのリポジトリ内に置いてあります。Javaなのでクロスプラットフォームです。materealのおかげでとてもシンプルなコードにまとまっているのがお分かりいただけると思います!

*1:小粒すぎて、本サイトのほうでは紹介しづらい…。