最近は、NHKロボコン用のプログラムばかり書いていて、若干食傷気味・・・。
他のことをやりたいけど、時間が取れないというより、取ってないだけだから仕方がないよな。。。
先週の水曜日ごろから春休みに入りました。他の大学より、かなり遅いです。
現状でわかっている、春休みの予定については、以下のとおりです。
11日 〜 15日:大阪・奈良
16日、17日:東京
24日 〜 29日:実家
あと、これの合間にNHKロボコンの作業が入ってくるので、ほとんど時間はないです。
特に、4月の第1週が山場な予感。週末には2次審査の資料を提出しないといけないためです。
とりあえず、明日の夜から大阪に行くので、その準備をしないとな。
時刻表を調べてなければ、必要な物資も買ってきていない状態です。
金曜日の夕方頃から悩んでいた問題が何と解決(?)。
いや、解決したというか、結局、無理でした。
問題はというと、マイコン(SH/Tiny、SH7125)用のプログラムをHEWから新規に作成して、
SCI(Serial Communication Interface)とCMT(Compare Match Timer)を
同時に使用するとどっちかがおかしくなるというもの。
おそらく、SCIの方は問題はなくて、CMTの方が何かしらの問題を起こしていると思う。
具体的な状態としては、以下の2通りの状態が発生した。
1、SCIで出力の途中にCPUが停止する(よって、CMTは動作しない)。
2、ずっと無効な文字列をSCIで送信する(この時は、一応、CMTは動作する。ただ、Timerがおかしい)。
おそらく、最終的な原因はわからなかったが、
理由は以下のとおりだと推測している。
1、割り込みがかかったときの関数アドレスが間違っていて、無効なアドレスに飛んでしまったためCPUが停止した。
(ただ、例外発生時の割り込みにLED表示だけの処理書いても、
アドレスエラーを検出していなかったので何とも言えないところがある)
2、これもおそらく同様の問題。何らかの表紙にSCIの入出力を行っているFIFOのアドレスがおかしくなったため、
延々と無効な文字列を送っていると考えられる。
ただ、最終的な理由ははっきりとしない。
金曜日の日記を書いた後、その晩は、できたように思えたけど、
翌日動作させたら結局動いていなかった(これも日記に書いたとおり)。
サークル部屋に行って、デバッガを製作することにした。
ただ、作成している途中に気づいていたんだけど、実は、今使っているボードが
デバッガを接続するように設計されていなくて、SCIのポートとデバッガのポートが重なっていた。
(まぁ、プログラムを書く気が起きなかったので、そんなことは無視して、
デバッガ用のポートを接続したが。。。)
デバッガを作成しても、もちろん動かず。というか、XrossFinderの使い方がわからん。
単純なプログラムならデバッグできそうな感じはするので、また今度確かめよう。
話は戻って、午後からは再度問題解決を試みた。
他の先輩とかにも聞いてみたけど、結局、理由はわからず。
日曜日の夕方5時ごろに諦めました。
諦めてそのまま。。。だとどうにもならない(ここが重要なため)ので、
つくばロボットコンテストの時のプログラムを引っ張ってきて、
それのいらない部分を削除することにした。
(じゃあ、その時はどうしたのか?、という話になるが、ベース部分は
他の人からもらったものなので全部をはじめから作ったわけではない)
削除してもすぐには動かなくて、数時間悩んだ挙句、先ほど完成しましたとさ。
まぁ、この時間まで起きてたわけではなく、12時ごろに寝てしまって、
4時半ごろに目が覚めただけです。
少し寝てからやったら、30分で終わったので、寝ることは重要ですね。
ちなみに、4時半ごろのときに修正した部分は、一部のファイルでヘッダが
includeされていなかったため、それを適切に設定したら動作するようになった。
やっぱり、SH2のコンパイラ(特にリンカ)の関数アドレスの設定の仕方がおかしいんじゃないかな。
HEWを使用するときの注意点として、必ずヘッダファイルはincludeする必要がある。
Windows用のプログラムの場合、ヘッダなんて適当で良いと思うんだけど、
HEWの場合、中身がおかしいのか、それとも仕様なのか、往々にしてヘッダが
includeされていないことに起因するエラーが多すぎる。
さらに、初心者の人は何が起きているかわかんなくて、動作させるまでが大変・・・。
サークル内で、このことに関して言っている人はいなかったけど、先輩に聞いてみたら
やはり、このことには気づいている感じだった。
そもそも、(純粋な)C言語のコンパイラってヘッダチェックがかなり厳密だったりする?
仮に厳密だったとして、HEWがエラーを出さないのはまた別の問題だが。
そんなこんなで、1日半かかった問題がやっと解決しました。正直、1日分が丸つぶれ・・・。
まぁ、HEWが自動生成するプログラムが何をやっているか、何となく理解できたのでよしとしよう。
大体、割り込みテーブルをずっと眺めていた関係で、テーブルの
割り当てとかも頭の中に記憶し始めてるしね。。。
ある意味、怪我の功名ですかね。
さて、必要なメールを書いて、2度寝しよう。
昨晩、2時ごろやっと想定したとおりの動作をして、やっと寝れる・・・と思って寝た。
しかし、何故か、起きてちょっといじったら動かなくなったぞ・・・。
あ、あれ、、、なんで、、、?
あと2時間・・・。何とかするか。。。
というか、頭の中では既に発狂していますが。。。
SH/TinyのCompare Match Timerが正常に動作しない!
どうも見ている感じでは、割り込み先のアドレスが間違っている気がするんだけど、
開始後、数msでCPU自体の動作が停止するため、シリアル経由で
デバッグしているときの状態も取り出せないという。。。
ぁ、そうか、CMTの実行時間を遅延させて本当にCMTの割り込みで
落ちているか確かめればいいのか。
はい、CMTの実行開始時間を変更したらCPUが停止するまでの時間が延びました orz
割り込みテーブルに入っているアドレスが間違っているような気がするんだけど、
コンパイラが原因な気がしないでも。。。
半分自嘲気味に、SH/Tinyのデバッガでも購入してやろうか、
とか思って調べていたら、実はデバッガを持っているわな。
以前に使ったアルファプロジェクトの奴がデバッガとして使えるのを忘れていた。
しかし、これ結線しないと使えないな・・・明日まで粘ってダメだったら、
半田付けして結線するか。。。
諸般の事情(前の日記参照)により、急遽東京に行ってきました。
9時40分に父親から電話があって、東京駅についたのは11時20分。
宿舎から1時間半で東京駅までいけるのは、時間だけ見ると近いようにも感じる。
まぁ、別にどうということもなく、普通に昼飯を東京駅の近くで食べて、
まだ時間があるということだったので、東京駅から20分ぐらいの
東京国立近代美術館へ行ってきた。
東京国立近代美術館は、筑波大学の学生だと入場料が安くなるので良い。
(あと、東京駅周辺で暇になったら無難に時間を潰せる)
現在行われている常設展 + 企画展のチケットが一般だと850円で、
学生証を見せることで250円になる。
美術館を見終えて、2時半ごろに東京駅に戻って、父親は新幹線で帰りました。
ちなみに、何で昼間の時間帯に東京駅にいるか聞いてみたら、
午前7時から会議あってそれの帰りだそうで・・・。お疲れさまです。。。
帰りがけに秋葉原によって、必要なものを買って帰ってきた。
青春18切符はつくばのJTBで買おうと思ってたけど、結局、みどりの窓口が
秋葉原にあるのでそこで購入してきた。
みどりの窓口外の券売機でも購入できるんだけど、乗車日を聞かれて、
よくわからなかったから中の窓口で購入。
あと、ヨドバシに行って目覚まし時計を購入した。
以前に使っていた目覚まし時計が10ヶ月近く前に壊れて、それ以降、
ずっと携帯の目覚ましを使用していた。
それでも良いとは思うんだけど、携帯だと間違えてボタンを押して
発信しそうなのでできれば避けたい(実際に、一回だけ発信したことがある)。
ということで、以下の目覚ましを購入した。
カシオ DQD-80J-8JF [温度計付き電波時計]:ヨドバシ・ドット・コム
http://www.yodobashi.com/ec/product/100000001000841142/index.html
温度計付き電波時計で980円。Amazonだと倍以上するんだけど、ヨドバシだと安く買える。
機能としては、一通りのものがそろっていて良い感じ。
あと、ヨドバシでWillcomのWX340Kが電源入った状態で置かれていたので、実際に使ってみた。
画面が大きくなっているのは良い感じ。中身のソフトウェアは、ほとんど変わらないかな。
ただ、メニュー画面が変更されていたのだけど、あれ、処理が追いついてないんじゃないか・・・w
メニューとかが選択されると跳ねるというか、沈むような感じになるんだけど、
バネで4方から固定されているものに上から力をかけたような動きをする。
それの演算に処理が追いついていないような感じを受けた。
(別に、キー操作は普通にできるので何とも言えないが。
ただ、キーの割り込みの優先度あげればねぇ。。。)
他には、以下の点が変わっていた。製品仕様を見ればわかるようなものは省略。
・画面が大きくなった
・カメラにライトがつくようになった
・ボタンの形状が変わった
・WX320Kのボタンのうち、上部の方にあるPageボタンがなかった
・待ち受け画面で動画みたいなものが表示できるようになっていた
・待ち受け画面にガジェットが表示できるようになっていた
自分としては、NetFrontがどのような感じか調べたかったんだけど、
案の定、ネットにつながっていなくて確かめることはできなかった。
それで、実際に購入するかどうかって問題だけど、結局、やめることにした。
2万円も払うほどのものではないし、壊れたら変えれば良いと思った。
そんなこんなで、5時半に宿舎に戻ってきました。
まぁ、たまにはこういうのも良いね。
今日から定額給付金の支給が始まりましたね。
asahi.com(朝日新聞社):定額給付金支給、さっそく2村 青森では村長が手渡し - 政治
http://www.asahi.com/politics/update/0305/TKY200903050085.html
ちなみに、つくば市では、以下のとおりだそうです。
つくば市│給付申請のお知らせ
http://www.city.tsukuba.ibaraki.jp/266/4156/004584.html
上記より引用。
----- 引用開始 ------
つくば市定額給付金給付事業では平成21年2月1日につくば市に住民登録・外国人登録をしている方を対象に1万2千円(18歳以下及び65歳以上の方には8千円を加算)の定額給付金を給付する予定です。給付の申請には,つくば市から届く申請書に必要事項をご記入の上,つくば市定額給付金室までご提出願います。申請書の発送は3月下旬を予定しております。
----- 引用終了 ------
以下のブログによると3月20日ごろに発送する予定とのこと。
小野やすひろ@活動報告 : つくば市定額給付金の動き
http://blog.livedoor.jp/ono_tsukuba/archives/51575435.html
支給の時期については、ニュースにあるとおり、市によってかなり対応が異なるみたい。
実際、実家の市で定額給付金に関する情報を調べてみたら、全く情報が出てこない。
さらに、Googleとかで検索すると、鳥インフルエンザの話題が出てくるという状態・・・。
(どうでもいいけど、たぶん通っていた高校が数百メートルしか離れていないはず)
ただ、定額給付金の是非について考えてみると、正直何とも言えないところがある。
自分自身は、こういうのも悪くないんじゃないかなぁ、と思った。
だけど、実際の運用例に近いものとして昔の地域新興券があり、
その時の結果を調べてみるとそうとも言い切れない。
地域振興券 - Wikipedia
http://ja.wikipedia.org/wiki/%E5%9C%B0%E5%9F%9F%E6%8C%AF%E8%88%88%E5%88%B8
Wikipediaの情報を見て判断するのは適切ではないと思うけど、ちょっと時間がないので。。。
これを見ていると、地域振興券ですらこういう状況なのに、今回、給付金を
支給しても貯蓄に回るだけだ、という意見も頷ける。
そうはいっても、給付されることは決定されたので、もらったら全部使ってしまおうと思う。
できれば、地元の辺りにお金が入るような形で使えるといいかなぁ。。。
(まぁ、単純に地元で使えばいいだけの気もするが)
何故か、父親から「今から東京に向かうから昼飯をでもどうか?」と15分ぐらい前に電話がかかってきた。
ということで、今から東京へ行ってくる。
しかし、東京にいるのはわかるが、なぜこの時間帯。。。
ヘッドマウントディスプレイを使って、見ている画面から英単語を抽出して、
その単語の意味を表示するためのソフトウェアを開発した。
例えば、英語の文章をヘッドマウントディスプレイを通して読んで、
意味がわからない単語があったら、それを選択して
ヘッドマウントディスプレイ上に表示するというもの。
これを使うことで、英語の文章が読みやすくなる、かも。
まぁ、現実的な話をすると、5万程度の個人用途のヘッドマウントディスプレイの
レベルだとそんな理想的な話は難しいです。
どうも、視点調整がうまくいかなかったり、画面がぼやける感じがする。
(ただ、これは調整が悪いのかもしれないが。。。)
ちなみに、アイディア自体は昨晩思いついて、今日の16時ごろから22時半ごろまでで作った。
話を聞いているだけだと、どうやって作ったのかと思うかもしれないけど、実際はそんなに難しい話ではない。
言語は、C#を使って書いた。
処理としては、以下のような処理を行えば簡単に開発できる。
1,カメラから画像を取ってくる
2,画像を解析して、英単語を抽出する
3,英単語を英和辞典で変換する
4,画面の表示する
これを、それぞれ次のように考える。
1,DirectShow.NETを使ってカメラから画像を取得する
2,OCR用のライブラリ(今回は、GoogleのTesseractをC#から使えるようにしたライブラリを使用)を使って、英単語を抽出する
3,フリーの英和辞典の辞書ファイルがあるので、それを使って英語から日本語に変換する
4,画面に表示する
これだけで完成。
このうちの、2と3は面倒そうに思えて、意外と簡単。
2は、4行あれば解析までできる。
3は、HashTableに放り込んで適当に値を取ってこればすぐに終わる。
意外と面倒なのが、1。あくまでも、DirectShowのためのライブラリであって、
カメラからの画像をキャプチャすることが主体のライブラリではない。
なので、DirectShowのフィルタをごちゃごちゃといじったりしないといけない。。。
サンプルコードを流用しようかと思ったけど、IVideoWindowが接続されていて、
自分が使いたいものとは違ったので、結局全部書き直し。
途中でいろいろとつまづいたので、ここだけで4時間はかかった。
ちなみに、全体のコード行数は400行ほどなのですごく小さい。
全体的にライブラリを結合したようなものなので、当たり前といえば当たり前。
OCRの部分は、最初は、英単語だったら画像認識でもいいかもなぁ、と思ったけど、
ふと、GoogleのOCRのライブラリを公開していたことを思い出してこうすることにした。
ただ、現状では色々と問題があって、例えば、以下のような問題がある。
・2,3千円のウェブカメラでは、ピントの自動調整がなかったり、そもそも画素数が少ないので文字がはっきりと出ない
(今は、130万画素程度のデジタルビデオカメラを使用してやっているが、
これだと、ヘッドマウントディスプレイにカメラが取り付けられない)
・UIがあまり良くない
(こういうものだと、最終的に中身のシステムがどうこうという話より、使いやすさの勝負になってくるので
UIが良くないとあまり意味をなさなくなってくる)
・英和変換のときに-edとか-ingを変換できていない
(すぐに終わる。明日にでも実装する)
・OCRの読み取り速度が遅い
(Pentium4の2.8GHzのマシンで試したから、単にマシンスペックをあげれば解決するかもしれない。
ただ、UIを工夫することで読み取り速度が無視できるかもしれない)
詳しくは、明日くらいに画像付きで紹介したいと思います。
以下のようなエラーが出た。
System.InvalidCastException: 型 'DirectShowLib.SampleGrabber' の COM オブジェクトをインターフェイス型 'DirectShowLib.ISampleGrabber' にキャストできません。IID '{6B652FFF-11FE-4FCE-92AD-0266B5D7C78F}' が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません (HRESULT からの例外: 0x80004002 (E_NOINTERFACE))。
場所 DirectShowLib.ISampleGrabber.SetCallback(ISampleGrabberCB pCallback, Int32 WhichMethodToCallback)
SampleGrabberからキャプチャするためにコールバック関数が呼び出されて、その中でSampleGrabberを参照すると上のようなエラーが出た。
おそらく、マルチスレッド周りが原因だろうなぁ、と思ったら、かなり予想外なところに原因があった。
C#でフォーム用のプロジェクトを作成すると、Main関数が以下のように生成される。
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace hmd_autotranslate
{
static class Program
{
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
この中の、「[STAThread]」を「[MTAThread]」に変更すれば問題なく動くようになる。
なんか、今までまったく目を触れてなくて、言われれば「そんなところあったねー」程度でしか考えてなかったけど、
こういう形でつまずくとは・・・。
詳しい意味については、後から調べてみようと思う。
2^32 = 4294967296
例えば、これだけのパターンがあったとして、1秒に1個解析できたとする。
それでは、これを解析し終わるにはどれだけ時間がかかるか?
4294967296 / 60(秒) = 71582788(分)
71582788 / 60(分) = 1193046(時間)
1193046 / 24(時間) = 4971(日)
4971 / 365(日) = 14(年)
計算してみれば当たり前なんだけど、これだけの時間がかかる。
まぁ、2^32ならピンとこないかも。ただ、考え方をかえてみよう。
65536^2 = ?
256^4 = ?
16^8 = ?
どれも、答えは、4294967296となる。
例えば、最後のものなら、16個のものがあってそれを8ヶ所に並べた時の並べ方と同じだ。
身の回りのものを16個持ってきて、とりあえず、8個選んで右から左へと並べてみよう。
さて、それを全部入れ替えて、入れ替え方を観察したらどうなるだろうか。
答えは、14年後のお楽しみである。
よく、分散コンピューティングで薬に関する計算を行うものがあるけど、
どうして、膨大な時間がかかるのか、やっとわかった気がする。
例えば、ベンゼン環にいくつもの官能基が結合すると考える。これだけでも、相当な数になる。
もし、さらにベンゼン環が結合したら? p-フェニルアゾフェノールに官能基が結合したら?
どんどん、計算量が増加していく。
実際には、理論的に結合できないものもあるだろうが、高校レベルの化学の知識でも
大量のパターンがあることがわかる。
だからこそ、マシンパワーを必要とし、分散コンピューティングとかが必要とされるんだろうな。
当たり前のことだけど、ふと思ったので書いてみた。
というか、テスト勉強中にこんなことをふと思いついて、
考え始めたらテスト勉強が手につかなくなったので、書かざるを得なかった。
今に始まった話ではないので、いつものことといえばいつものこと。
さて、テスト勉強に戻るとしますか。。。
(おそらく、いつも通り、どっかで計算ミスをしている気がするので、指摘があれば遠慮なくどうぞ)
今週1週間は、3学期最後の期末テスト。
今回は、テストが2教科だけなので、今までに比べるとかなり楽になった。
その2教科はというと、火曜日のCG基礎と水曜日のシステム制御概論だけなので、
それが終わったらやっと春休み。
とはいっても、先週の火曜日から前期試験休みで、頭の中はほとんど春休み気分だけど。
とりあえず、今日と明日はテスト勉強をがんばろう。1日、十数時間勉強すれば何とかなるでしょう。
ということで、おやすみ。