Nexus7 使って Androidアプリ開発

環境構築になかなか手間取りました。

ダウンロードとインストール

Android SDKより 「Download the SDK ADT Bundle for Windows」からSDKをダウンロード。
Eclipseやツールが既に入っているバンドル版で便利。
ダウンロードしたものをCドライブ直下とか短いパスのところで解凍。

解凍した中に入っているEclipseを立ち上げようとするも、JDKが入っていなくてエラー。
仕方なく、OracleのところからJDKをダウンロードして、インストール。
これでEclipseが無事に立ち上がった。

エミュレータで実行

適当に新規作成からAndroidアプリケーションのプロジェクトを作る。
アプリケーション名とかパッケージ名は適当で、どんどん進める。完了すると、Hello Worldな画面が出来上がる。
画面左上の方に「Android仮想デバイスマネージャー」というのがあるので、そこでエミューレータ用の仮想端末を作る。
「新規」ボタンを押して、AVD名は適当につけて、装置はNexus7を選択。
ここでメモリー・オプションを512ぐらいにしておかないと起動しない。
「OK」ボタンを押して、今作った仮想デバイスを選択し、「開始」を押すとエミュレータが起動する。かっこいい

Eclipseの実行ボタンから「Androidアプリケーション」を選択すれば、エミュレータ上に Hello World されるはず。

実機で実行

Nexus7の「設定」→「タブレット情報」から「ビルド番号」と書かれた項目をタッチしまくる。しまくると開発者モードが解禁される。どんな仕様だ。
一つ前の画面に戻ると、「{}開発者向けオプション」が表示されている。
その中の「USBデバッグ」をONにする。

「設定」→「セキュリティ」→「提供元不明のアプリ」をONにする

Windowsに戻り、Android仮想デバイスマネージャーのボタンの隣にある「Android SDKマネージャー」を選択する。
一番下のExtrasに「Google USB Driver」があるのでそれをダウンロード。
ここまできたらUSBケーブルでNexus7とパソコンをつなぐ。USBドライバがちゃんとインストールされないので、デバイスマネージャから解決する。
ドライバはSDKをインストールしたフォルダの中の「sdk\extras\google」にあるのでそれを指定。

接続確認

ここでちゃんと、端末とPCが接続できているか確認したい。adbなるものを使う。
「sdk\platform-tools」にadbはある。パスを通すか、このフォルダに行く。
コマンドプロンプトから「adb devices」と打つ。
「List of devices attached」の次の行に何かしら表示されればOK。そして、それはoffline となっているのではないだろうか。
「adb start-server」と打つとonline になる。
これでエミュレータのときと同様にAndroidアプリケーションを実行すれば、端末の方で起動されるはずだ。

日本語版 WordNet から辞書を作成する

前からフリーの英和辞書のデータが欲しいと思っていて、探していたのだが、WordNetというのがあるらしい。
wordnetは「ライセンスを保持していただければ、基本的に日本語ワードネットは無償で使用、複写、改変、頒布していただけます」らしい。
うれしい情報であるのだが、データ形式がsqlite3のデータベース形式なのである。しかも単純な形式じゃなく、いろいろと構造がややこしい。

出力結果はこんな感じ。
179 abase 凹ます,凹ませる,卑しめる
180 abasement 屈辱,恥,恥辱,汚辱
181 abash まごつかせる,困らせる
182 abashment 内気,羞恥
183 abate 和らぐ,弛む,弱まる,消和,緩む,衰える,鎮まる,静まる
184 abatement 中断,中止,軽減
185 abatis 逆茂木

ちなみにSQLを逆にすれば和英も作れることに気づいた
4464 ほどなく before long,presently,shortly,soon
4465 ほど近い nearby
4466 ほのか dim,faint,shadowy,vague,weak,wispy
4467 ほのぼの darkly,faintly
4468 ほのめかし glimmer,glimmering,inkling,intimation
4469 ほのめかす adumbrate,insinuate,intimate
4470 ほの暗い dim,subdued

Python3.2で動作確認。 2.x だとエンコードの問題があるっぽく、面倒なので3で動かした。
動かすには日本語WordNetのサイトにあるダウンロードから「Japanese Wordnet and English WordNet in an sqlite3 database」を入手する必要がある。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# coding: UTF-8
import sqlite3,pprint
mode = 0; #モード指定 0:英和 1:和英
#ダウンロードした wnjpn.dbのパスを指定
conn = sqlite3.connect("./wnjpn.db")
cur = conn.cursor()
print("running")
if mode == 0: #英和用SQL
cur.execute( "\
SELECT DISTINCT word_en.wordid, word_en.lemma, word_ja.lemma\
FROM sense sense_A, sense sense_B , word word_en , word word_ja \
WHERE word_en.wordid = sense_A.wordid\
and sense_A.lang = 'eng'\
and sense_B.lang = 'jpn'\
and sense_A.synset = sense_B.synset\
and sense_B.wordid = word_ja.wordid\
ORDER BY word_en.lemma"\
)
else : #和英用SQL
cur.execute( "\
SELECT DISTINCT word_ja.wordid, word_ja.lemma, word_en.lemma\
FROM sense sense_A, sense sense_B , word word_en , word word_ja \
WHERE word_ja.wordid = sense_A.wordid\
and sense_A.lang = 'jpn'\
and sense_B.lang = 'eng'\
and sense_A.synset = sense_B.synset\
and sense_B.wordid = word_en.wordid\
ORDER BY word_ja.lemma ASC"\
)
#ワードIDを整理しつつ、結果を一度配列に詰める。
#英単語に含まれるアンダーバーはスペースであるべきなので置換する(ハイフンはハイフンのままで良い)。
before = -1
word_list = []
i = -1
for row in cur:
if before != row[0]:
i = i + 1
word_list.append( [row[1].replace("_"," "),row[2].replace("_"," ")])
before = row[0]
else :
word_list[i][1] += ',' + row[2].replace("_"," ")
#タブ区切りでファイルに出力
f = open('./output.txt', 'w')
i = 1
for word in word_list:
f.write(str(i) + "\t" + word[0] +"\t" + word[1] +"\n")
i += 1
f.close()
print("done")
cur.close()
conn.close()

Visual C++ 実行時にコマンドプロンプトを消えないようにする

勝手に消えるウィンドウ

僕はVisual C++ Express 2010 を使っている。
コンソールでデバッグ開始(F5)を実行すると、実行完了時に勝手にコマンドプロンプトが消えてしまう。
それを防ぐためにプログラムの最後にwhile(1)とかscanf()とかを書いたりする方法もあるが、途中でexit()した場合、効果ないので不便だ。

そこで、「デバッグなしで開始(CTRL+F5)」を使うと便利。これなら実行完了時に勝手にコマンドプロンプトが消えないで済む。

デバッグなしで開始を表示

デフォルトで「デバッグなしで開始」は表示されていない。
「ツール」→「設定」→「上級者用の設定」をクリックしたら「デバッグ」のところに表示される。

やけにメニューにコマンドが少ないなと思っていたが、こういう設定があるようで。

追記

普通は上記に加えて、以下の操作が必要なようだ。
メニューからプロジェクトのプロパティを選択し、構成プロパティのリンカーのシステムを選択。 サブシステムのリストからコンソール (/SUBSYSTEM:CONSOLE)を選択。

文字認識 方向線素特徴量

方向線素特徴量が文字認識でかなり使われている方法のようで。

文字認識に使われる特徴量に方向線素特徴量というものがある。これは文字の線が縦,横,斜め上,斜め下の4方向のどの方向であるかを調べる方法である。例えば、下図のように64×64ドットの画像を16×16 ドットのマス目に分けて,それを8 ドットずつずらしながら,その16×16の領域内にある方向線素の数を調べる。この方法で調べると,7×7の領域を調べることになり,その領域で4方向の線素の数を調べるので,7×7×4の196次元の特徴量を抽出することになる。
文字例

補足として、方向線素の数を調べるとは2×2ドットの領域のドットの形から判断する。以下が例。
4ドットがすべて黒の場合は全ての方向を持つとする(でいいのかな)。この各方向の数をカウントすればよい。
方向線素

結果的に特徴量として、領域ごとに以下のような196次元のベクトルが取得できる。
[ 縦の数 横の数 斜下の数 斜上の数 縦の数 横の数 斜下の数 斜上の数・・・・]

コヒーレンシプロトコル

最近、コヒーレンシプロトコルについて調べていたのでまとめる。

MSI、MESI、MOSI、MOESIはマイナビジャーナルの記事がとても参考になるので、そっちを参照することとする。「マイナビ MESI」とかで検索すれば出る。

各プロトコルの内容を理解した後、ひとつ疑問が出る。L2キャッシュなど多階層のキャッシュの場合はどうするのだ。特に、最近のプロセッサは最下位層のL2かL3をコア共通で持っていることがある。そういう場合はどうするのか。
調べてもL1キャッシュしかない場合のことしか想定していないのが多い。
いろいろ調べた結果、「Cache Coherence Techniques Silvia Lametti」というpdfがコヒーレンシのことについてよく書かれていて参考になった。

前提として、インクルーシブキャッシュを用いる。これにより最下位の共有キャッシュを見るだけで、上位層のデータの存在を確かめられる。
また、MOSI、MOESIプロトコルではキャッシュ同士でデータを転送し合うということを行っていたけれど、共有キャッシュの場合、L1 キャッシュでキャッシュミスが発生した場合,共有キャッシュにアクセスされる。だから、L1キャッシュ間での転送を行えないと思う。
大事な点は、Modified-But-Stale という状態を共有キャッシュに追加する必要がある点だ(stale とは古いとか無効の意味)。

インテルのNehalemだとMESIFらしい。 FはForward。

coherency