2012年2月27日月曜日

Pandaboard ESを買ってみた(入れたのは、Ubuntu11.10)

Pandaboard ESを買ってみました。
前から興味あったのですが、お金の問題で買えなかったのを、問題解決していないのに衝動買い。

購入先は、みんな大好きDigi-Keyです。
2月15日辺りに注文を入れたのですが、在庫が無く待つことになりました。
2月24日に無事アメリカから出荷したぜ!っていうメールを受け取り以下のような感じで自宅に届きました。
2/23 UPSがDigikeyから受け取り
2/25 成田空港着
土日の為、27日の午前に家へヤマト運輸が届けてくれた


次に簡単なセットアップのメモを残しておきます。

まず物理的に必要なモノ
Pandaboard ESは、本当に本体しか入っていません。
電源: 2.1mmプラグの5V ACアダプタ (私は3Aタイプ買いました。秋月で750円。友達がバイトしてた。)(追記4Aに変えました。安定しなかった・・・)
HDMI-DVIコネクタ:1680円(九十九電機。めんどくさくて多少高くても良いから九十九で買っちゃった。)
SDカード:4G以上必要らしいです。16G購入(KINGMAX CLASS10で1500円ぐらい。)(追記 KINGMAXから東芝8Gに変えました。これまた安定しなかった・・・)
SDカードリーダ:あきばおー400円 42種類書き込めるらしい。SD以外用ない。
USBキーボード、マウスは家にあったのを使った。
画面:床に転がっていたのを使った。

次にOSの書き込み
Ubuntu走らすか、Android 4.0走らすか悩んだのですが、とりあえずUbuntuの環境が欲しかったので、Ubuntuを走らせて見ることにしました。

ここを読むとPandaboardのテストとか出来るらしいですが、めんどくさいのでパス。
壊れていても、泣かない!

OSは、ARM(OMAP4)対応のものを落としてきます。

1. PandaBoard Prebuilt Ubuntu binaries
2. Ubuntu 11.10 Release の Texas Instruments OMAP4 preinstall desktop image

どちらか好きな方で・・・。

私はMacにてVM ware Fusionを使い、その上で走らせたUbuntu上で書き込みました。
パソコンにSDカードリーダを挿し込み、SDカードを挿入。
オートマウントされると思うので、
ターミナルよりdfと打ち込む。
現在マウントされている奴一覧が出てくると思います。(dmesgでも良いかも)

/dev/sde1     ******   ********  1%  *******とか出てくると思うので。*は数字でsdeとかは環境により違う。

SDカードだと思うものをアンマウントします。

sudo umount /dev/sde1

ダウンロードしたファイル(ubuntu-11.10-preinstalled-desktop-armel+omap4.img.gz)が置かれている箇所にて、

gzip -d -c ubuntu-11.10-preinstalled-desktop-armel+omap4.img.gz | sudo dd bs=4M of=/dev/sde
展開してSDの箇所に突っ込みます。なので、/dev/sdeは環境により変化します。

早ければ5分ぐらいで終わると思います。

ここでパソコンの出番は終わりです。

PandaboardにSDカードを差す。
キーボードやらディスプレイやらマウスやらを全部つける。
そして5Vのプラグを挿すと起動します。

しばらくすると、私の環境ではペンギンが二匹出てきて、Ubuntu起動、領域作成、チェック、ウィザード起動とプロセスが進んで行きました。
放置で大丈夫です・・・。


一度、書き込んだイメージが壊れていたらしく、領域作成の段階でエラーを吐きました。
PCに差してフォーマットかけてみたら、70MBの空き容量のSDカードが登場して焦った。
このような自体に陥った際は、SDカードに作られたパーテーションを壊してください。Macでしたら、ディスクユーティリティから消せます。
二度フォーマットかけて再挑戦しています。
手順は毎回同じなので、何が原因かは良くわかりません・・・。

とりあえず、上手く行ったので遊びたいと思います。


追記、
電源とSDカードを変えました。よくファイルシステムがぶっ壊れて使い物にならなくなるので・・・。
公式ページを読んでいると、5V4A以上が推奨であり、また何となくSDカードを東芝製に変えました。
使っていて思ったのですが、日本語環境に直すと変になることが多い気がします。
英語でも別に支障ないので、英語で使うことにしていますが・・・。
また、よく壊れる原因として、SDカードに書きこむ際に失敗している事が多いみたいです。
何度もリブートを繰り返したり、インストール段階で先に進めないなどの場合は再度SDをフォーマットして最初からやり直すとうまく行きます。

2012年2月24日金曜日

GO FOR IT

目を疑った、エンジニアが話したいと思っている優秀者に自分の名前があった。
3問解いたが、1問目に関してはmozcのソースからBSDライセンスの文をパクった為に、
送った時点では製作者にgoogle inc.と入っていた。さらに、GO FOR ITでなくGOF FOR ITというGang of for for itという誤字のまま送ってしまった。また、徹夜明けにやったため文章は支離滅裂、UMLに関しても間違えている。(UMLとSysML組み合わせな感じになっちゃっているけど)
テストケースを書いて、いろいろバグが無いか試していたが提出直前にバグが見つかり応急処置で出したプログラムであった。

2問目に関しては、これは知っていたから数式をバラして書いた。何も悩まなかった。WolframalphaとGoogleで答えを確かめ終えた。

3問目に関しては、綺麗なコードって何だろうと思いながら、C++で下手に長いプログラムを書いた。急用が重なり提出まで時間がなかったため、普段は使わないSTLを組み合わせて課題を終わらせた。3問目に関して一番悩んだ事は、30万語が正しく展開されているかをメモ帳で確認すると横幅が足りない。秀丸でやっても足りない。何しているんだろうって思いながら確認していた。しかも、小問2で書いた高速化にいたっては、予想はしていたが最初の方が早いという何とも言えない感じになってしまった。

4、5問目に関しては、4は音楽のトラウマが蘇ったけど、5に関しては解きたかった。

このGO FOR ITを通じて、自分に色々と足りない所も分かった。それに他の優秀者のハンドルネームからブログをググってみると、python使って凄く短い尊敬できるプログラムを書いている方々が多く世の中の広さを知った。あと、自分がなぜ優秀者に名前があるのか分からないなと思った。電気工学出身で、プログラムはマイコン周りの知識の延長線という感じですし。
しかし、エンターテインメント系やら最近で言うとメディカル系にも手を出しているソニーのエンジニアと話せる機会が与えられた事はありがたいです。Smart ARをソニービルで公開していたときに話したエンジニア(デザイナ?)の人も知識と人生経験豊富で、ソニーのCVに関する歴史の話が凄く面白く、今でも参考になっています。(お名前も知らないのですが・・・)

こんな機会を設けて貰い、どうもありがとうございました。
エンジニアだけでなく、他の方々にも会える(?)ことを楽しみにしています。
あとプログラミングコンテストって面白いね!

2012年2月23日木曜日

C言語と動的ローディングのメモ

.soファイルの作り方をメモしておく。
時々忘れて、汚いファイル群から検索するはめになるので・・・。
環境は、Ubuntu 10.04、CMake、gccですよ。
.soはshared objectの略である。
pythonとC++の連携などで必要になるらしいので・・・。(私は、Pythonは趣味以下のレベル)

共有ライブラリファイル(.so)の作り方
適当にプログラムを書く

(sampleSo.c)
#include
void function1()
{
  printf("function1\n");
}
void function2(int i)
{
  printf("%d function2\n",i);
}

(CMakeLists.txt)

cmake_minimum_required (VERSION 2.6)
project (sampleSo)
add_library(sampleSo SHARED sampleSo.c)

重要なのはCMakeLists.txtだけですけど・・・。

ビルドのための簡単なコマンドは、
cmake .
make -f Makefile

これで、libsampleSo.soというファイルが生成されるはずです。
とりあえずは、ここまでで良いと思いますよ。

以降は、これをCで使う場合です。

(main.c)
#include //動的ローディングのためのヘッダ
int main()
{
  int tmpValue = 5;
  void* handle = dlopen("./libsampleSo.so",RTLD_NOW);
  void (*func)() = dlsym(handle,"function1");  //関数ポインタ
  void (*func2)(int) = dlsym(handle,"function2");  //引数あり
  (*func)();
  (*func2)(tmpValue);
  dlclose(handle);
  return 0;
}

次に新たにCMakeファイルを書く
(CMakeLists.txt)
cmake_minimum_required (VERSION 2.6)

project (main)
SET(CMAKE_C_FLAGS "-ldl")
add_executable(main main.c)

ビルドはおなじみ
cmake .
make

実行させてみると
function1
5 function2
と出ているはず。
とりあえず、こんな感じ。


2012年2月17日金曜日

Tortoise hgとMercurialでバージョントラブル

去年の記事でTortoise hgをubuntu10.04で使うとか書いてあったのですが,
パッケージ管理ppaだけだと,mercurialとtortoise hgでバージョンの違いから問題が発生するということが身の回りで起きていた.
つまりは,mercurialのバージョンを2.1に確かめずに上げると,tortoise hg 2.2はmecurial 1.9〜2.0までで動作するので動かずバグ報告を出してしまう.(tortoise hgは,当時は2.2だったため,2/17の時点でもppaには含まれていなかった)

自分も少し前に体験したので,解決策は知っていたけどメモっていなく迷ったから同じ間違いをしないようにメモ.

1)tortoise hgをソースからインストール
tortoise hg->Download http://tortoisehg.bitbucket.org/ja/download/index.htmlからソースを落とす.
フォルダを解凍し(tar xvzf ファイル名) pythonなので,
python setup.py build
sudo python setup.py install
これでパッケージ化されていない最新版が手に入ります.
tortoise hg 2.3はmercurial 2.1で動作可能です.

2)mercurialやらtortoise hgをバージョン指定してインストール
1の方が楽です.
apt-cache showpkg パッケージ名
バージョンがズラッと出てきます.
apt-get install パッケージ名=バージョン名
これで好きなバージョンが入れられます.
なるべく最新を使ったほうが良いと思うけど.

2012年2月13日月曜日

SONY GO FOR IT 3問目:暗号検索の高速化

1)問題文



文字列の中に現代の出来事が暗号化されているという、映画や書籍が話題になりました。この暗号は、文字列を特定のスキップ数ごとに改行を入れて折り返すと、関連のある文字列が近い距離に配置されるというものです。
たとえば、r=16、i=0を初期値として、下記を300000回繰り返して生成した、’a’から’z‘までの文字をランダムに含むアスキー文字列rand_str[]には、先頭208728文字目から4162文字スキップで"sony"の文字列が存在します。


r ← ( r * 1103515245 + 12345 ) & 0xFFFFFFFF
rand_str[i] ← 0x61 + ( 26 * ( r / 0x10000) ) / 0x10000
i ← i + 1


この文字列を4162文字ごとに改行を入れて折り返し、"sony"の文字列が中央付近に配置されるように、19桁10行の範囲を抜き出すと、下記のようなマトリクスが得られます。
--省略--

このマトリクスには、"alpha"の文字列が等距離スキップで存在し"sony"の文字列と近い距離にあります。この暗号では最小スキップの文字列が重要な意味をもち、2文字以上のキーワードがランダム文字列中のどこにあるかを最小スキップ順に高速に求めたいと思っています。


なお、高速実行可能であれば使用プログラミング言語や入出力仕様は問いません。たとえば、キーワードをコマンドラインで指定し、ランダム文字列を標準入力から得て、スキップ数と位置をカンマで区切ったものを改行し、標準出力するようなプログラムを作成してください。


・ スキップ数が短い順に出力してください。
・ スキップ数が同じ場合は、ランダム文字列先頭に近いものから出力してください。
・ キーワード文字列が逆順にマッチした場合も出力してください。


※ たとえば前述のランダム文字列から、"sony"の逆順の"ynos"を探す場合には、「4162,208728」が出力されるようにしてください。 


2)解き方
例えばSONYであれば、Sを見つけその位置を記録、次にOを見つける、そして2つの差分×2と3でNとYに辿りつけたら、それは等距離スキップということになる。
それをC++を用いて記した。
また、2つ目の解き方として、SONYならば、(S+Y)%3 = 0であるとき、(S+Y)/3 = 距離スキップ。これを用いて、S、S+等距離スキップ、S+等距離スキップ*2・・・・とやれば上記より早く出来るのではないかと考えた。結果として一つ目の方が早かったんだけどね。


3)ライセンス
BSDライセンス


4)ソースファイル
1つ目・・・)main(ソース) 検索部分クラス(ヘッダソース) ランダム文字列作成クラス(ヘッダソース)
2つ目・・・)main(ソース) 検索部分クラス(ヘッダソース) ランダム文字列作成クラス(ヘッダソース)

2012年2月8日水曜日

SONY GO FOR IT 2問目:実数の階乗

1)問題文


ある検索サイトに5!と入力するとその計算結果である120が表示されます。
その検索サイトに2.5!と入力するとなんと3.32335097と表示されます。
さらにその検索サイトに(-1.9)!と入力すると-10.5705641と表示されます。
きっとそれらの仕組みはとても難しくて企業秘密に違いないので是非ともこれらを実行するプログラムを作ってほしい。
ただし、君のPCは古いのでネットワークや便利で高度な数学関数は入っていません。
入っている数学関数はsin,cos,tan,log,pow,floorなどの初歩的な関数のみです、残念ながら。
                                                                                                                              
i)入力された整数a(0<=a<=10)の階乗を求めるプログラムを作ってください。
ii)入力された実数a(0<=a<=10)の階乗を求めるプログラムを作ってください。
iii)入力された実数a(-1.9<=a<=-1.1)の階乗を求めるプログラムを作ってください。

2)解き方
ガンマ関数使います。上手く関数が動いているかの答え合わせはグーグルに聞くと良いでしょう。
-の時は(-1.6)!としないと私みたいに頭抱えます・・・。
ガンマ関数と、対数ガンマ関数を用いて計算を行います。
また、マイナスの際は、サイン関数とガンマ関数の関係式から変換をしてください。

3)疑問点
 特に無いです。カッコ付けずにグーグルに質問して焦っていたぐらいです。
ガンマ関数のいい勉強になりました。

4)苦労したところ
 式が汚い。カッコが多くなってしまって、何処が何処を優先しているか分かりづらくなってしまったが動いたから放置している。これはマズイと思う。

5)ライセンス
 BSDラインセンス

6)出力ファイル
1)入力された整数a(0<=a<=10)の階上
5を入力
120
2)入力された実数a(0<=a<=10)の階上
4.5を入力
52.3427777845535
3)入力された実数a(0<=a<=10)の階上
11.5を入力
範囲外
4)入力された実数a(-1.9<=a<=-1.1)の階上
-1.8を入力
-5.7385546399985
5)入力された実数a(-1.9<=a<=-1.1)の階上
-1.45を入力
-3.5913872638524

7)ソースファイル
今回は短いだろうってことで、一個のファイルにまとめた。
プログラム
ソースなんですが、return 0付け忘れています。
テストコードを消した際に一緒に消しちゃったっぽいですよん。

SONY GO FOR IT 1問目:人生の時計

問題文
1)人生の時計


あなたの一生を24時間にたとえると今日は何時何分何秒ですか?
ただしあなたはあなたの誕生日(a年b月c日)の0時ちょうどに生まれてn歳まで生きる(n歳のときは生きていてn+1歳にはなれない)とし、bとcは一般的な月日の範囲とします。
i) 1990<=a & a<=2000,n=80のとき、今日は何時何分何秒ですか?
ii)  1900<=a & a<=2000 ,n=200のとき、今日は何時何分何秒ですか?

2)解き方
C++を利用して解いた。
有名なヘッダファイルであるctimeは、Unix時間という制約がかかるため、tm構造体だけを利用した。
(死ぬ時間 - 生年月日) : (現在時刻 - 生年月日) = 24時間 (24*60*60秒) : x時間
であり、このx時間を求めれば良い。

3)疑問点
n歳まで生きる(n歳のときは生きていてn+1歳にはなれない)
これは、死ぬのが誕生日前日の23時59分59秒でいいのだろうか。
どこで区切れば良いのか分からなかった為に死ぬ日を設定出来るというメンバ関数を用意した。
ただし、本問題中では前日であると判断したので出力ファイルには書かれていない。

4)苦労した点
Unix時間のことを忘れていた。
i)しか見ていなかった為、問題無いだろうと判断してしまった。
この為、ソースが汚くなってしまった。
また、日付計算関数などを自分で用意するという事になってしまった。

5)ライセンス
BSDライセンス *最初の頃に載せていたソースにあったライセンスは、Google IncのMozcからコピーさせてもらったもので、Google Incとか書かれていたけど、何も関係ないです。ごめんなさい。

6)出力ファイル


i)1990<=a<=2000,n=80
Input
        Birth Day:1994/12/3
        Death Age:80<2075/12/2>
Output
        5:5:30
Input
        Birth Day:1995/1/1
        Death Age:80<2075/12/31>
Output
        5:4:5
Input
        Birth Day:1998/7/31
        Death Age:80<2079/7/30>
Output
        4:0:28


ii)1900<=a<=2000,n=200
Input
        Birth Day:1946/5/7
        Death Age:200<2147/5/6>
Output
        7:51:7
Input
        Birth Day:1979/7/1
        Death Age:200<2180/6/31>
Output
        3:53:37

1946年はソニー創業日らしい、1979年7月1日はウォークマンの日らしい、1994年12月3日はプレステの日らしい

7)ソースファイル
クラス(ヘッダソース)
メイン(ソース)


#追記 2/8バグ修正した

2012年2月5日日曜日

入力ソースからUSのチェックが外せない

容量も増えて凄く調子が良いMacbookですが、入力環境がデフォルトのことえりは使いづらく、ATOKはWindows版しか持っていません。
そこでUbuntuでもMozcでお世話になる、GoogleIMEの出番です。
しかし、Google IMEを入れたあとに何故か入力ソースのUSが消えないという状態になってしまった。(チェックボックスがUnenable状態で選択できない)

これはMacOSがGoogle IMEの存在を無視して、USを外すことによって一つも入力ソースが無い状態になってしまうという誤認識だったっぽい。
とりあえず、「ことえり」にチェックを入れる、また「ことえり」の設定であるカタカナや英数字にもチェックを入れておく。
すると、入力ソースに「ことえり」があると認識されるので、USのチェックが外せるようになる。
ここで、USとおさらばする。
その後、ことえりもチェック外すとGoogle IMEだけになった。

めでたしめでたし。

Macbook air SSD(2011 Mid)換装から再インストール

Macbook air(2011 Mid)を128GBのSSDで使っていたが、容量が足らなくなってきた。
そこで、Yahooオークションにて公式でも使われているサムスン製256GB SSDを21,500円で購入しました。
これはそのメモ。
まず裏を向けて、ネジを外す。ドライバはSSDセットについてきたが、五角形(ペンタローブ)用ドライバ、サイズ1.2を使う。
ヒンジ部分だけ長いネジが2本存在し、残りの短いネジと合わせて10本。無くしたら秋葉原で購入できるがメンドクサイので、ちゃんと管理をしておく。
初めて開ける際は固いですが、ヒンジの部分から上手いこと外してください。
自分の場合はパキッと言いましたが、平気でした。
開くと以下のような中身が見えます。


次に、電池類上部にあるSSDを抜き取ります。
T4のトルクスドライバでネジが外れました。
(他の解説ページ見ているとバッテリーとマザーボードの電源を抜かないと駄目らしい・・・)
SSDは、周りの素子を傷つけないように慎重に抜き取ってください。(東芝製だった)
交換後、同じ手順を踏んで元に戻してハードウェアに関しては終わりです。


次にOS X Lionを再インストールします。

起動と同時に、command+R 暫く待つと選択画面が現れます。
ディスクユーティリティを選択し、フォーマットかけましょう。
私の場合は、251GB APPLE SSD SM256C Mediaと認識されました。
これを選択し、消去
フォーマット:Mac OS拡張(ジャーナリング)
名前:Macintosh SSD (名前は何でもイイはず、あとからファイルの名前を変えるのと同じ要領で変えれます)

SSDのおかげか速攻でフォーマットが終わります。
ディスクユーティリティを終了し、画面右上の無線LANが繋がっているか確かめる(プロキシが必要な環境は、プロキシの設定できないので外部に出れずOSインストールできません)

そしてMac OS Xを再インストール
あとはウィザードに従ってノンビリ待つだけ。
途中バックアップしたOSのイメージとかがあればウィザードにしたがい復元できます。
これで終わります。