2010年2月14日日曜日

解析メモ学第一

どうも、家に転がってるものがスペース的な意味で極めてやばくなってきたこと山の如しのQです、こんちには。


この土日はroombaハッキングにいそしんでいたのですが、悲惨な感じ。メモるほどのことではないかもしれないが、例のRoomba hackingではProcessingという言語(ていうかJavaの開発環境?)を使います。それはいいのですが、ちょっと気になるバグ。

roombaの状態を追うことが出来るサンプルプログラムがあるのですが、そこでスライドバーが使われています。が、スライドバーのゲージは表示されるのですがツマミが表示されません。しかしマウスでカチコチすると値はちゃんと変わっていて、どうもGUIあたりにバグがあるみたいです。

Processingのホームページでバグに関する情報があり、「最新(1.09)のバージョンは一部のGUIが、特定の状況下でおかしくなるバグがある」とのこと。マジで!?しかも使われてるMyGUIていうlibraryも2006年からupdateされておらず、processingも古いバージョンは配布しないとのこと。

マジプギャー。
そうだよな、普通に動くことが確認されているサンプルでも上記のバグが発生したからなぁ…。Processingの古いバージョンを探すか、まあ操作上問題があるわけではないので無視してもまあ良いのか。なんかjavaのバージョンと相性問題があったりするらしく、ちょっとメンドクサイ。

Processingの使えるようになることは全く目的ではないのでとりあえずスルー。どうしようも無くなったら手段を考えるか。





悲惨だが
ソースを追うのも
作業です

2010年2月11日木曜日

メモ工学特論第一

どうも、買ったけどまだ読んでいない本の数が山の如しのQです、こんちには。

明らかに読む速度が追い付いていない(笑)全部読もうと思うと年単位の時間は必要なんじゃないだろうか?しかし、いつ開くことになるか分からないから捨てるに捨てられないんだよなぁ。逆に一度読んだ本も書き込みまくったり,変に愛着が湧いて捨てられない。結果凄いことになる。


1.Drawing through
X windowにおいて、gcの設定でIncludeInferiorsというのが合った。サブウィンドウを透過的に扱う、的な意味なのだがこの辺のマニュアルでdrawing throughというフレーズが出てきた。最初よく意味が分からなかったのだが、どうも「透明なものを描く」的な意味らしい。
マニュアルの中では、単に「・・・を透過的に描く」って感じだが、上記の意味もあるらしい。へー勉強になった。




2.other than、besides
othar than hogehoge、と書いてあったら「hogehoge以外の」というニュアンス。
besides hogehoge,と書いてあったら「hogehogeの他に」というニュアンス。




3.lookahead,staging
先読みをlookaheadと言うらしい。
staging areaと書くと足場となる領域的な意味になる。



4.c,java,unsigned,2の補数
とあることでjavaのソースを読んでいた。
てかjavaの勉強なんてしたことないに等しいのだがpython?か何かのおかげで読めるようになっていたのは驚いた。今さらjavaを書く気はしないのだが、膨大なサンプルソース、プラットホームを選ばない特性から読むことは往々にしてある。

で、javaってunsignedの概念無いのね・・・。Cから入ってマイコンしてた僕としては非常にわかり難い。あと、googleで調べても何が正しいのかよくわからない感じ。

とりあえずまず2の補数の考え方
(二進数 = 十進数)
00000000 = 0
00000001 = 1
11111111 = -1
11111110 = -2
01111111 = 127
10000000 = -128
覚え方はいくつかあると思うのだが、要するに
00000001 = 1に(-1)を足したら当然
00000000 = 0になる。
従って-1に相当する表現は
11111111 = -1
でしょ?ていうだけの話と僕は理解している。
1 + (-1) = 0
00000001 + 11111111 = 00000000
実は加算器で減算を表現できるとか、1の補数だと0の表現が二個できて厄介とかその辺の話が分かってないと悲惨。

C言語だとプラットホームの影響を受けて怪しくなることがあるようだが、javaでもcでも多分僕のような素人が普通に使うレベルだとまず上記に従ってると思って大丈夫かと思っている(盲信は危険だが)。

問題はunsinged。
C言語ではビット操作を扱うのがわりに簡単に出来る。それはunsignedがきちんと定義出来るから。例えば

char c = 0xff;
short s;
s = (short)c;
printf("%d",s);

とすると-1と表示される。2の補数の概念が適用されて0xff = -1と解釈されるからだ。
一方、

unsigned char c = 0xff;
short s;
s = (short)c;
printf("%d",s);

とすると255と表示される。2の補数の概念が適用されず、0xff = 255と解釈されるからだ。僕はこの型を厳密に決めるところが結構気に入っている。
ところがjavaではこのunsingedが使えない。つまり、前者のパターンでしか計算できないことになる。これが実は結構危険。早い話、
high_byte = 0xff
low_byte = 0xff
とすると、cならunsingedが使えるのでhigh_byteやlow_byteをunsignedで宣言しておけば、
uint = ((unsigned int)high_byte * 256) |
    (unsigned int)low_byte;
で棲むが、javaの場合、high_byteが-1と解釈されてしまって、high_byte * 256の処理が悲惨なことになってしまうぽい。
回避する手段としてこんなメンドクサイことをする。
uint = ((high_byte & 0xff) * 256) |
    (low_byte & 0xff);
要するに、演算をする前の状態をビット演算で等価的に維持する、という感じになる。他の型に変換される際に、実際には「signedの数値として扱われる」が、ビット演算によって「元の型におけるビットの状態のみを保存する」って言えばいいのかな。

cから入った身としては非常にややこしい。でもこれが分かってないと・・・まあ色々とね。

あとついでに。
C言語でもある変数の内容がsignedの変数に代入されたり、unsignedの変数に代入されたりするような実装はダメかも。つまりsignedとunsignedの型の間でキャストが生じるようなプログラムは構成を考え直した方が良い。





javaよりも
cとpython
使います
//やはり覚えることが少ない言語に限るぜ・・・

2010年2月10日水曜日

メモ概論第一

どうも、第一印象があまり良くないと言われること山の如しのQです、こんちには。

英語が使えると10億人とコミュニケーションできるそうですが、コミュニケーションあんまりしたくない僕はどうしたらいいんですかね?(笑)
どっちかっていうと技術文書とかマニュアルとかの方が・・・

まあつまり最近日常言語、特に読むのが殆ど英語になりつつある。


1.XSetWindowAttributes
当然だがウィンドウには様々な属性がある。そこで、その属性を設定・変更したりするのに使うのがこの構造体。なんか凄い一杯あるが、とりあえず今回使ったのがウィンドウマネージャによる介入の防止。
上記構造体のメンバに
bool override_redirect
というのがあり、デフォルトはFalseだが、Trueにするとwindowをmapするときにウィンドウマネージャがデコレーションや位置のコントロールを行わなくなる。
例えば、

XSetWindowAttributes a;
a.override_redirect = True;
XChangeWindowAttributes(Display,
            Window,
            CWOverrideRedirect,
            &a);

こうするとWindowのoverride_redirectに関する属性のみ、&aに設定した内容に変更される。CWOverrideRedirectは変更対象の属性を示すマスク。複数種存在しそれらのORによるマスクにより複数の属性を一度に変更することも出来る。




2.XCopyAreaとPixmap
XCopyAreaという関数で、あるdrawableの内容を別のdrawableの内容にコピーする。
XCopyArea(display,
     src,
     dest,
     gc,
     src_x,
     src_y,
     width,
     height,
     dest_x,
     dest_y)
大体、名前見るとどういうことか分かるが、要するに、幅width,高さheight、左上の角の座標が(src_x,src_y)の長方形で囲まれたsrcのdrawableの内容を、destのdrawable上で左上の角を座標(dest_x,dest_y)とした同じ大きさの長方形で囲まれた領域にコピーする。この時この二つのdrawableは同じrootとdepthを持っていなければならない。
drawableにPixmapというものを使うこともできる。イメージとしてはviewableでないwindow、表示されることはない生のwindowって感じ。バッファに使えるので、あるwindowの内容を一時保存したり、影でこそこそ計算・描画しておいて一定のタイミングでのみ本当に表示するwindowにコピーとかに使うっぽい。





春がくる
出会いと別れ
引き連れて

2010年2月9日火曜日

樹海の入口にメモを書く

どうも、会社の先輩に結婚しないなんて人生損するよ?と言われること山の如しのQです、こんちには。


すいませんが先輩、あんまり幸せそうじゃないっす(笑)

さてさて、Xwindowという樹海に紛れ込みそうになっているので、とにかくメモを書いておきます。基本的な概念・構成は今から20年以上前に出来ていたわけで、当然ながらちょー巨大・カオスなプログラム、ライブラリと化しているわけです。
とんでもないところに足を踏み入れたもんだ・・・


1.Atom
サーバーとクライアント間の通信に使われる、識別子、らしい。Atom自体は単なる32bitの整数型でしかないが、これに
atom = XInternAtom(d,*name,only_if_exist)
とすることで、*nameの関連付けをすることが出来る.
dはDisplay、*nameは要するにAtomにつける名前、only_if_existはbool型で、よくわからんがとりあえずTrueの時は*nameのAtomが存在するときに値を返す、Falseの時は*nameのAtomが存在しないときに新しく生成してくれるらしい。

とりあえず、これを使えばクライアント-サーバ間やクライアントークライアント間通信を実現できるのだが、実際にはwindowのプロパティとかEventとかの設定をしなければいけない。ぶっちゃけ使うだけならなんとかなるのだが、この辺の深い内容は一度腰を据えてきちんと理解しないとカオスになりそうなので、今はここで留めておこう。




2.xで色を使う。
Colormap = DefaultColormap(Display,0)
デフォルトで用意されているカラーマップのIDを手に入れる。

XAllocNamedColor(Display,
Colormap,
(char*)color_name,
XColor *screen_def_return
XColor *exact_def_return)
Colormapを放りこんで、color_nameを指定すれと、exact_def_returnには本来指定されるべき色のデータ、screen_def_returnには使いたい色が使えなかった場合に近い色のデータが返される。要するにscreen_def_returnに代入される値を使う.




3.Linuxで文字のエンコードを変える。
システム的に変えるには
/etc/sysconfig/i18n
の内容をいじり、再起動。

その場で文字コードを変換するには
nkfというコマンドが使える。
echo hogehoge | nkf -e
とやるとEUCになる。
kccも似たようなことができるようなのだが、僕のPCではうまくいきません。
まあnkfが動くからいいけど。




4.古いRoomba
やっぱりROIが使えなかった。鬱。





なんてこと
これじゃあ只の
掃除機じゃん

2010年2月2日火曜日

というわけでメモ

どうも、いつも題名のネタ考えて若干時間浪費気味のQです、こんちには。

というわけでたまにはひねりの無い題名。


Roombaを制御するためのプログラムを落とすことが出来る。
http://hackingroomba.com

Javaで書いてあるようなので動作するOSは選ばないようだが、ダウンロードして動かそうとしても動かない。てかREADMEをちゃんと読まない自分が悪いんだが。

Windows用のREADMEが用意されていて、それによると
rxtxSerial.dll
なるファイルを「コマンドプロンプトでjava -versionのコマンドを入力したとき、応答するJavaに相当するjava.exeが置いてあるフォルダ」に置け、とある。updateしたり、複数のversionのJavaを入れているとどうもここではまるようで、自分はupdateされていたので若干はまった。

ちなみに本当にどのversionのjavaに相当するかを確認するには、コマンドプロンプトで明示的にパスを入れて逐一確認しろ、とある。


で、このREADMEファイルにはrunit COMxのコマンドで簡単なテストが出来るてきなことが書いてあるのだが何だかよく分からんし、しかも動かん。意味が分からんのでとりあえず、makedocとかbuild-jarとかbuild-processing-libraryとかとりあえず起動して、RoombaCommTestを動かしたら動いた。これで普通に実験できたので、よく分からんがOKぽい。

ラジコンもどきの動きをしてくれてます。まだ有線ですが(笑)

ちなみにbuild-jarとかbuild-processing-libraryとかいうのは本来は、プログラム内部のソースコードに手を加えた場合に起動するものらしい。

しかし、RoombaCommTestを動かすと先のdllのversionが合わんとか文句つけてくる。同じパッケージに入ってるのに(笑)まあ作者も、若干適当に作っちゃった、みたいな事書いてるからしょうがない。



どういうコマンドを送れば良いかは分かったので、とりあえず最低限のロボットフレームワークは手に入れたと言って良さそうだ。xにしろRoombaにしろ基本的に英語の文献が頼りなので、TOEICの点数が駄目な意味で半端じゃない僕にとってはかなり辛い…まあ、この辺は修行だと思って我慢。


あとCNCのコントロールプログラムのライセンス買った。これで無限行まで実行できるぜ。







また一つ
今また一つ
雪の如くに

2010年2月1日月曜日

ヌーメモローン

どうも、メッケーモとかヌーメロローンとか分かる人には廃人全開にしか見えないであろうQです、こんちには。

人生は色々あるとは思いますが、時として色々賭けざるを得ない状況もあるような気がします。てか、まあどうも僕は何かを作ったり、熱中してないと死にたくなる人種だということは最近理解しました.

というわけでメモ。

1.DUB-9、シリアルポートの割り当て
PCのポートの場合、

1.CD:データキャリア検出
2.RD:データ受信
3.TD:データ送信
4.DTR:データ端末レディ、PC送信中
5.GND:信号のグラウンド
6.DSR:データセットレディ、周辺装置稼働中
7.RTS:PCからの送信要求
8.CTS:周辺装置の受信可能通知
9.RI:周辺装置から呼出信号検出の報告

マイコン的に重要なのは
RD <- 周辺装置TD
TD -> 周辺装置RD
GND -- 周辺装置GND
RTS -> CTS
DTR -> DSR

この辺の情報は調べると錯綜気味な内容が多いが、とりあえず自分の環境ではこれでいける。




2.イヤホン用ジャックの耐電流
調べるのが意外と大変。本気で調べようと思うと、JIS規格のPDFを購入する必要があるっぽい。まあとりあえず調べた限りでは、

3.5Φジャック 約1[A]
6.3Φジャック 約2[A]

と見積もれば大丈夫っぽい。まあ、このイヤホン用ジャックで耐電流を気にするような使い方は普通しないと思うけど、着脱性と入手性は良さはトップレベルかもしれない・・・。




3.incompatible implicit declaration of built-in function
built-in関数の不正な?暗黙の宣言。
要するに、適切な宣言が行われていない関数が存在する時に発生する警告。

自分はstrlen()を呼ぶときにstring.hがincludeされてなくて出た。本やホームページに書いてあるソースが常に信頼に値するわけではないことを学習した.




4.Xにおけるフォント関連
xlsfonts:Xで使えるフォントの一覧
xfd -fn hogefont:当該のフォントの中身を見る

フォントの読み込み
Font font = XLoadFont(d,"hogefont");
なおフォント名はX Logical Font Description Conventionsに従っている必要があり、?や*による正規表現が可能。

GCにフォントを設定
XSetFont(d,gc,font);

文字列を書く
XDrawString(d,w,gc,x,y,"hugahuga",length);
w:書きたいwindow
gc:この場合は設定したフォント
x,y:よく分からんが、windowの左上を原点として、文字列の最初の文字の左端、下から3分の1位の位置を指定する感じ。フォントによって違うかも。
length:文字列長さ




5.window回り
window内にwindowを作ることができ、これをsubwindowと呼ぶらしい。

sub_window = XCreateSimpleWindow(d,parent_window,,,,)
これでsub_windowはparent_windowのsubwindowになる。

また
XsetSubwindowMode(d,gc,subwindow_mode)
という関数があり、subwindow_modeには
ClipByChildren:親windowへの書き込みがsubwindow内に影響しない。
IncludeInferiors:親windowへの書き込みがsubwindow内に影響する。
この辺をクリッピングとか言うらしい。
defaultはClipByChildren。

XRaiseWindow(d,w)
wをwindow stackのtopに置く。要するに一番上に表示させる。またExposeイベントをキューイングする。

XMapWindow(d,w)
wを実際に表示させる。manualのancestorの意味がいまいち掴めんが、親windowの連なり、のことをいってるのかな?要するに親(とその親とその親の・・・)windowが全てmapされてなければ、表示される資格が与えられるのみで、表示はされない。

subwindowを全部表示するのがメンドクサイときは
XMapSubWindows(d,parent_window)
を使う。manualでも推奨されています。

XMapRaised(d,w)
Mapして最上位に表示。




6.ボタンを作るのに便利なイベント
イベントタイプがButtonPressのとき、
Event.xany.window
でどのwindowでButtonPressが発生したのかを拾うことができる。
subwindowに使うとボタンに相当する機能が実現できる.




7.wc
トイレのことではなく、行数や文字数を表示するコマンド。





ほげほげほげ
ほげほげほげほげ
げほっげほ!!