2010年4月25日日曜日

メーモンの法則

どうも、色々やってましたがそろそろ新しいことをやってみたくなったQです、こんちには。

Q-starがお留守になってます。いや、頭の中の構想は進んでいるんですけどね。ここには出してないですが、色々こそこそ作ったり遊んだりしていて、いくつか布石になるものもやってます。少し前に作ったデスクトッププラネタリウムQsX(まだ作りかけですが)なんて、まあ明らかにコンソールを作ろうと言う意図があるわけで(笑)

まあ、関係ないことも沢山あります。とりあえず、メモ。

①UbuntuでCUI環境
サーバーを立てるんだったらCentOSの方が良いと思うのだが、UbuntuでCUI環境ってどう作るんだろうと思ってメモ。

一時的に作る場合
Ctrl+Alt+F1でCUI環境に移行。
sudo /etc/init.d/gdm stop

gdmはGnome Display Managerの略で、Ubuntu標準のディスプレイマネージャー。これを止めれば実質GUIに関するデーモンは止まったことになる。

再起動してもCUIのままにする場合
/etc/event.d/rc-default
の中身を変更する。



②一時的にランレベルを変更
telinit N
Nにランレベルを入れる。
各ランレベルの定義がなされるCentOSではあんまり頻繁に変更することはないと思うが、Ubuntuでは決まっているのはランレベル1,2のみ。3以上は自分で設定する。



そろそろ部屋が限界なので引越しを考え中。






桜色
気づけば緑
見もせずに

2010年4月18日日曜日

メモリトニアン演算子

どうも、最近倒立振子実験にちょっと成功したQです、こんちには。

倒立振子といっても20秒くらい立ててるのに成功しただけなんですけどね。しかし、そこから得られるものは沢山ある上に、制御論の一種登竜門なので前からやってみたかったわけです。

RoombaとかLinuxとかもっと身近になるといいなあと思いつつも、まだまだ先は長いなと等と。というわけでメモ。




①Linuxでファイルシステムの操作
パーティション切ったり、起動ディスクにしたり。
fdisk デバイス(/dev/sdbとか)
ディスクのフォーマット
mkfs -t フォーマット デバイス
(mkfs -t vfat /dev/sdbとか)

fat32は32GBまで、また一ファイル4GBの制限あり。




②USBメモリでバックアップ
持っていたUSBメモリがバックアップとして全く役に立たなかったので、容量の大きいUSBメモリを買った。
Transcend JF V30 16GB 2500円
です。Linuxで認識は問題なかったが…ファイルの保存が上手くいかない。FAT32でフォーマットすると、SVNのhotcopyがおかしくなる。一方、ext2とかLinux用のフォーマットにするとzipファイルの保存が上手くいかない。
多分、書き込みできない領域とか、デバイス固有のメモリのマッピング?とかがあって、それの影響でおかしくなってんじゃないかと想像してみる。windowsでフォーマットしてLinux(CentOS)で使って見たがdemsgで確認するとfatがパニクってた。駄目駄目。
とりあえず、今のところうまくいってるのが、

Linux、fdiskでfat32(LBA)にフォーマット
mkfs -t vfat /dev/sdb1
USBメモリを、基盤に直接取り付けられてるインタフェースに挿す。

なんか相性問題とか色々あるのかな。




③LinuxでBluetooth,SPP通信
僕にとってBluetoothとは無線シリアル通信用の道具なのだが、これをLinuxで使ってみようと思った。昔は色々あったようだが、今は殆ど自動で認識できるみたい。とりあえずplanexのminiEDRは上手くいった。

hciconfigで認識されている送信デバイスの情報を確認できる。
hcitool scanで通信できる受信デバイスとそのMACアドレスを発見する。
rfcomm bind 1 受信側デバイスのMACアドレス
rfcomm1というデバイスファイルが出来るので、それをcomポートとして使う。
minicomを設定して起動すればOK。

bind設定を切るときは
rfcomm relese 1

ubuntuでもCentOSでもいける。



④処理優先度の変更
root権限が必要だがniceというコマンドでプログラム処理の優先度を変更できる。
nice -n -20 プログラム
とすると最優先で実行。
nice -n 19 プログラム
とすると優先度が最も低い状態で実行。

なんで必要かというと、どうもシリアル通信などをするときのスケジューリングに関わってくるっぽい。通常のプログラム起動では、シリアル通信のインターバルが遅くなったり速くなったりして不安定なのだが、最優先で実行すればこの影響は少なくなる。

倒立振子の実験で何やってたかというと、ボール式マウスで角度を認識して、PCで必要な移動を計算、そしてPCからシリアルで命令を送るって感じなので、この送信タイミングがおかしくなられると辛い。






ブログにも
外部メモリの
役割が

2010年4月11日日曜日

メモラーの法則

どうも、平日も土日もグウタラなQです、こんちには。

というわけでメモを書きたいわけです。まあ殆ど誰も見ることのないブログなので、メモはもはや私物としてのメモですな。
まあ特にLinux絡みなんかで会社で役に立ったりすることも有るので、書いといて損はしないなと思いました。

1.Linuxでシリアル
openでfile descriptorを手に入れる。
(/dev/ttyUSB0とか)

struct termios hogeを宣言し、それぞれ必要な設定を行う。
(重要なメンバはc_cflag、キャラクタサイズとか受信有効とか)

cfsetispeed:受信baud rate設定関数
cfsetospeed:送信baud rate設定関数
tcsetattr関数で設定を有効にする.

後はreadとかwrite関数とかでやりたい放題でっせ、だんな。



2.Linuxでシリアル通信に使うターミナルプログラムの名前
minicom
よく忘れる。



3.倒立振子
inverted pendulum



4.Xでポインタを移動
XWarpPointerで移動させることが出来るが、windowがポインタをgrabしてないと、関係ないwindow(大抵はターミナルプログラム)で移動してしまうので注意。



4.static記憶クラス
staticを付けると、最初に宣言されたときのみ初期化され(明示されてなければ0で初期化)、プログラム終了まで値が保持される。従って一旦ある関数から抜けて、また戻ってきたときに、前回抜けた時の値をそのまま使うことができる。



5.Linuxで時間を取得
time.hをinclude
秒単位の時間を得るとき
time_t zikan;
time(&zikan);
マイクロ秒単位が欲しい時
struct timeval zikan2;
gettimeofday(&zikan2,NULL);
zikan2.tv_secは秒単位
zikan2.tv_usecはマイクロ秒単位

必ず忘れるんだよな・・・。



しかし本当にメモだらけのブログだなこれ。そのつもりなんだけど。




メモ書いた
書いたことを
忘れてた

2010年4月6日火曜日

カオスメモ理論

どうも、最近制御論が面白いQです、こんちには。

前の日記はカオスだったが、要するにLinux用のプラネタリウムソフトを作ったのである。プラットホームはCとX window。
まだ改善点は大量にあるが、家の微妙なPCでもマウスでそこそこインタラクティブに視点変更ができるので、それなりに面白いものができたんじゃないかと思っている。もちろんメガモードも持ってます。最もメガモードだとそれなりに天の川とか映るけど、とてもインタラクティブとは言いがたい操作性。

まあちょっとマシンパワー当たりに手を加える必要があるかもしれない・・・。まだこういった機能付けたいといったものがあるので余裕をみて少しずつ改善していく予定です。将来的にはは実機のプラネタリウムと連携とかも考えてはいるのですが。

で、実装に完全にかまけていたのでメモ。まじカオス。

1.KDevelop
デバッグ環境が欲しかったので、KDevelop使ってみた。gdbとかで頑張るのもまあぶっちゃけ馬鹿馬鹿しいだけなので、この際一つ何か使えるようになっておこうかと。
普段Linuxではemacsでプログラム書いてるので、プログラム書くときにctrl-cとか押してしまうのに参った。というわけでショートカットボタンを変更。良く使うコマンドはemacs仕様に変更。setting->configureナンチャラとかで色々設定できる。

ちょっとハマッたのがプロジェクト管理。本家のQ&Aによると、画面の右側にAutomake Managerというのがあるので、ここで既存ファイルをプロジェクトに追加したり、特定のファイルをプロジェクトから外すことができる。



2.mallocとかcallocとか
Cの仕様として、保証される最大サイズは64KByte。これ以上確保する場合はエラーが発生する可能性がある。まあ今のPCのメモリは普通にGByte程度は有るので、よっぽどのことをやらない限り問題にはならない気がするけど。



3.feof()
現在ファイルポインタが指している文字がEOFかどうかを判定する。ただし、
12345\nEOF
見たいなファイルでfgets()を使っていると、ファイルポインタの中身?は\nで止まってしまうので、
while(feof(fp) == 0){
fgets(fp);
}
というコードを組んでいると、EOFを一行として余計に読み込んでしまう。
詳しい実装は知らんが、おそらくファイルポインタから読み込まれたストリームの最後の文字がEOFかどうかを調べているんだと思う。従ってEOF前の\nでストリームの最後の文字が止まるため、whileの判定文をすり抜けてしまう.



4.XWindowのディスプレイとスクリーンの意味。
スクリーンはいわゆるマルチディスプレイ環境におけるどのディスプレイか?を示す。デュアルディスプレイとか言うときのディスプレイの概念はこっちに当てはまる。一方ディスプレイは凄い怪しい説明が多いのだが、最も明解な説明は、「ユーザーに提供されるマウスやキーボード、モニタ等の、インターフェースのセット」。現代のPCのイメージだと想像し難いが、昔のハイスペックなPCを皆で共有していた時代の概念だと思う。インターフェースのセットなんて考え方は一人にPC一台の時代には不要な概念だし。



5.Xにおけるマウスのボタン。
右手系において、
左ボタン:Button1
ホイールをコチってする:Button2
右ボタン:Button3
ホイール前回転:Button4
ホイール後回転:Button5
に相当。



6.構造体を型として定義
typedef struct{
short suzuki;
long watanabe;
char *tsukishima;
int kobayashi;
double iwaki;
} zannen;
ど忘れした。こんな感じで定義する。



7.キーボードからの入力を受け取る
KeyPressMaskをイベントして許可する.
通常のウィンドウの場合、フォーカスが有ればキーボードの入力は普通に認識されるが、override_redirectが設定されてたりするとキーボードの入力が認識されない。認識されるようにすることをgrabとXでは表現しているようだが、キーボードの入力をgrabするためには、ウィンドウをmapした後に、
XGrabKeyboard
という関数を使う。
さらに入力された文字が何かを知るためには
XLookupString(
XKeyEvent*,
char*,
int,
KeySim*,
XComposeStatus*)
という関数を使う。最後の二個の引数はNULLで良い。char*にアスキーコードが返され、intに数が返される。



8.Pixmapのクリア
XClearWindowはWindowに対して定義されている関数で、Pixmapには使えない。代用として、drawableに対して使うことができるXFillRectanbleを用いた。



9.イベントのqueueingと圧縮
ExposeやMotionNotifyのイベントは大量に発生するので、逐次対応していたのでは描画に時間がかかったりして非効率である。そこで、同じ種類のイベントがあったら一つにまとめて対応することが良く行われ、これをイベントの圧縮という。
Bool XCheckMaskEvent(
display *,
long,
XEvent*)
Bool XCheckTypedEvent(
display *,
int,
XEvent *)
queueingされているイベントのうち、同種のイベントが有るかどうかをチェックし、有ればそのイベントをqueueから削除してXEvent構造体に格納、Trueをreturnする関数。



10.日周運動と緯度
diurnal motion
latitude
latitudeってD○LLのPCってイメージだが緯度って意味だったのね・・・。



11.マルチスレッドのプログラム
コンパイル時に-lpthreadを付ける。忘れてはまった。



12.意図的にイベントを起こす
マルチスレッドなんかやってると意図的にイベントを起こしたくなる。
XSendEventという関数を使う。
使いかたが意外と面倒なのだが、基本的にはXEvent型の変数を定義して、内部のメンバの値を色々偽装する。そして、XSendEvent関数で当該のDisplayのイベントqueueに送り込むことになる。Exposeイベントなんかでは使うことも有るのではないかと思う。
ちなみにExposeイベントとかのメンバにはcountというのがあって、本来は同様のイベントが少なくともあと何回くるか?を表す。イベントの圧縮の手法にこっちを使うことも有るようだが、XSendEventで送られたイベントはこの処理は行ってくれない。従って自分で調べて偽装するか、これに頼らない実装を採用することになる.



13.sprintf
printf関数の何が便利って%dとかだと思う。double-char変換を簡単に行う方法として、
sprintf(配列的なもの,"%f",double型の何か);
で代入できる。



しばらくメモをサボってただけ長文メモになってしまった・・・




眠いけど
いつかは見るさ
このメモも

2010年4月5日月曜日

室内製写真を観測写真と偽装

 室内産の天体写真を実際に観測した写真と偽り発表したのは景品表示法違反に当たるとして、文○省は4月4日、「Q-star」や「QsX」の名でプラネタリウム関連の発表をしている○県○市のプラネタリウム製造会社「Q-star研究所」に、再発防止を求める措置命令を出した。

 文○省によると、Q-star研究所は今年4月初頭、QsXを用いて自社工場で撮影した室内産の天体写真を、mixiやブログ等で発表。この際、紹介文や付帯情報に「観測写真」と記載したという。QsXは、200万個の星空のシミュレータソフトとして知られており、類似のフリーソフト等と比較して、操作の簡便さやインタラクティブ性に特化している。

 昨年4月、実際の天体写真観測用の手段が無くなり、社長が社長に偽装表示を指示。社長はmixiで「X windowを使えば実際の写真を撮りに行かなくても大丈夫だと思った」と説明しているという。

 ○○技研のプラネタリウム問題専門家、○○社長は「昨今の技術の進歩を考えれば、プラネタリウムを用いた天体写真の偽装は十分可能であり、早急な対策が必要」と述べた。

 以下問題となった写真





(Q-star広報)