今年は税金をあまり払わずに済みそうなので(苦笑)、そういう心配をしなくて済みそうなのですが(A^^;;
8/20 8/25の2本あったりします(同じ出版社)。えぇ分かってますよ。分かってますって。お盆にやればいいんでしょー(苦笑)。ご先祖様孝行できてないなぁ。今年は田舎に帰ってお墓の朝参りに参加したかったなー(8/13金にマノリートのライブがある時点で既に不可能なんだが)。
ペアのサルサを踊るとき、皆はどこを見てるんだろう?もちろん、即答で「相手を見てるに決まってるじゃない」と答えられる人はかっこいい。僕は相手の女性を見てるとどうも照れる。だからずっとは見ていられない。トメるとき、タメるとき、そんなときに踊っていただいている女性と目があって、わずか0.1秒の、時間が瞬間止まったような感覚、亜空間にワープした感覚をもらえるときがある(アルコールの力を借りるとなおさら)。けれど、その7-8カウントの瞬間が過ぎ、次の1のカウントがやってくると、また体がエルココのフロアに戻ってきてついつい照れてしまうから左に目をそらしてしまう。僕は左を見る癖があるみたい。サルサはクロスボディーで女性を左にリードする動きが多いので、左の行き先にスペースがあるか常に気にしている。だから、左に目をそらしてしまう癖がついてしまってるのかもしれないな。
ひょっとしたら、男性は相手への視線には気を配らないのかもしれないけれど、女性は本当に視線に気を配っているね。初心者のうちは無理だけど、少し踊れるようになった女性達は、スタイリングよりも先に男性に視線をくれるようになる。あ、とあるサル友の女性が言っていたのを思い出した。
男性のサルセーロは、女性たちほど視線や笑顔に気を配れるのだろうか?いやいや、故意に気を配るのは逆にかっこ悪いしcoolではないかもしれないけど、ワザに走らないラティーノ達は、ずっと相手を見て踊っているよな。視線で口説く日本人男性もいるけど(笑)僕はキャラクター的にそういうのがニガテというか"無理"なので、ついつい笑いに走ってしまいそうになる。けれど、そっぽを向いているよりか、何か二人の空間が作れるような、そんなダンスを作って行きたいと思ってみたりした。まだまだ精進が必要なようだ。
ひっそりとえびwiki開設。wikiに慣れると、もうホームページ作成ソフトで書いてFTPアップロードなんて使う気がしなくなってきた。自分のホームページっくらいwikiとcssのカスタマイズで十分。
とある組み込み系のお仕事で xfree86-4.2をいじっている。xc/config/cf/host.def をいじってmake Worldの繰り返し。クロスだとコンパイラがまだ怪しいのでセルフでコンパイルしているがやっぱり時間がかかるもんですね。実機で4時間くらいかな。
先月から燃え尽き症候群。。。になりかけてた。ここ数週間いろいろ考えてみたり、人と話をしていて少し気が楽になってきた。燃え尽きからも脱出できそうだ。意外とトンネルは短かったかもしれない(笑)。
俺は自分の踊りには全く満足できていない。嫌になるくらい。やっぱり何か中途半端で欠けている。何が欠けているか、それがわからないからあせり、未達成感で楽しみが失せ、サルサを楽しめなくなっていた。自分の立ち居振る舞いが嫌いで、踊ること全体が楽しくなくなってきていた。エルココ行かなきゃという義務感すら前面に出ていた。
何を満足していないのだろう。何を目指しているんだろう。カッコよく踊りたいのか?本当は違うんだ。俺はカッコよく踊りたいなんて思っていなかった。酒場としてエルココを愛し、楽しくすごすことが目的だったんだ。過去の自分日記を読んでも分かるけど、音楽と酒と会話を楽しむことが第一だったはずだ。それがいつの間にか、上達することに意地になり((その理由は複雑だ))上達できず満足できないイライラにつながってしまっていた。
自分はカッコよく踊るキャラじゃないし、カッコよく踊ったからといって格好いいわけじゃない。ちなみに、もとから格好いい人はカッコよく踊らなくても格好いいというのは事実だ。『俺はダンスはうまくないよ』とか言っているのがカッコいいと思うんだがな。でもそういう人にはなれないから(A^^;;置いといて、俺は格好よくなりたいから、カッコよく踊れるよう上達を目指し、格好よくなりたいとか思ってしまっていた。う〜ん。
そして全然満足できない。『馬鹿げている』『滑稽なやつだ』『アホくさい』と考えることで逃げ道を作った。はっきりいって逃げだ。たいして努力もしていないクセに上達できない自分に対する失望感から、いろいろなことのせいにしてしまっていた。「これ以上は才能がないから無理だよ」「努力することがカッコ悪いだけじゃん」と逃げ道を作り、あげくに「つまんないな」と投げやりな気持ちになって、楽な道に逃げていたんだと思う。
「何を目指しているの?」と人に聞かれて自答してから、以前の自分に戻ってきた。ペアダンスというのはね、相手とのダンスを楽しむものじゃないか。自分一人で努力してカッコよく踊れるようになったとしたって、それで満足してたらナルシストじゃないかと。そしていい意味で諦めてしまって発想を変えることが何より大事だ。『急には無理だよ』と。
これからも上達を目指そう。でもサルサは競技ダンスとは違う。見た目カッコよく踊ることは重要じゃない。大切なのは相手との踊りを楽しむこと。十人十通り。それから初心者からすげ〜ダンサーまで、いろいろな人と踊れるようになることだったはずじゃんか。努力の方向を、とにかく楽しむという方向に変えていって、相手とのダンスを楽しむために何を学ぶべきかなという発想に変えてみようと思う。そうしたら、なんだか楽しくなってきて、ふさいでいた気持ちも明るくなってきた。((まぁほとんどは、俺に『何いってんのアホちゃう』とガツンと言ってくれた人と、気分転換のきっかけを作ってくれた人のおかげだけど。thankyou))
あと、ダンスパートナーということについて意見を求められましたが、そのうちにおいら的な考えを書くかも。
crw-rw-rw- 1 root root 2, 0 Aug 11 04:26 ptyp0 crw-r--r-- 1 root root 2, 1 Aug 11 04:26 ptyp1 crw-r--r-- 1 root root 2, 2 Aug 11 04:26 ptyp2 crw-r--r-- 1 root root 2, 3 Aug 11 04:26 ptyp3 crw-r--r-- 1 root root 2, 4 Aug 11 04:26 ptyp4を作って解決。
/bin/sh: line 1: /home/root/build/qt-copy-3.0.3-20020329/bin/qmake: cannot execute binary fileあえなく玉砕(qmakeがクロスターゲットバイナリーなので)
kernel/qapplication_x11.cpp:95: GL/glx.h: No such file or directory kernel/qapplication_x11.cpp: In function `void qt_init_internal(int *, char **, _XDisplay *, long unsigned in t, long unsigned int)': kernel/qapplication_x11.cpp:1688: `GLX_USE_GL' undeclared (first use this function) kernel/qapplication_x11.cpp:1688: (Each undeclared identifier is reported only once kernel/qapplication_x11.cpp:1688: for each function it appears in.) kernel/qapplication_x11.cpp:1688: implicit declaration of function `int glXGetConfig(...)' make[2]: *** [.obj/release-mt/qapplication_x11.o] Error 1 make[2]: Leaving directory `/boss/home/ebihara/project/nrlinux/build/qt-copy-3.0.3-20020329/src' make[1]: *** [sub-src] Error 2 make[1]: Leaving directory `/boss/home/ebihara/project/nrlinux/build/qt-copy-3.0.3-20020329' make: *** [thread-stamp] Error 2 real 124m30.386s user 83m28.720s sys 38m31.700s2時間まってこれか。がっかりだ。つまらんミスなので速攻修正し、再度処理をかける。さて帰って寝ようっと。
割り込みルーチンが受信データを受信バッファに格納し、 ユーザープロセスが受信バッファからデータを取り出す。という流れとします。まず先日の話を読んでください。
割り込みルーチンの記述は略しますがユーザープロセスの流れは以下のようになります。ドライバのread()メソッドの中で
if( input_point == output_point){ // もしバッファにデータが無ければ // here is クリティカルセッション interruptible_sleep_on(&Q); // データ到着まで待ち列Qでsleep } read_from_buffer(&buf); // データをバッファから取り出す。プロセスはデータが無ければデータの到着までsleepに入るのが普通です。割り込みルーチンはデータをバッファに格納してwakeupします。ちなみにuITRON4のwup_tskと違ってLinuxのwakeupは、sleepしていなかった場合は空振りするだけです。ですからなにも考えずに常にwakeupを記述して問題ありません。
さて先日お話しましたように 『here is クリティカルセッション』の箇所がレースコンディションになります。
if文でデータが無い事を確認し { カッコの中に進んだところでデータが到着し、割り込み処理を行ったとします。そこでのwakeupは空振りに終わります。そして既にデータは到着しているにもかかわらず sleep に入ってしまい、起こされなくなります。下手をするとデッドロックが起きます。通常は次のデータの到着で割り込みが入り、sleepから起きますが、例えばキーボードデバイスだったとするなら、ユーザーがAと押したときに無反応で、あれ?と思ってBを押したときに連続してABと2文字入力されるといった不具合が発生します。よくないですね。
これの対応ですが、一番簡単に思いつくのは割り込みをとめてしまうことしょう。
cli(); // 割り込み禁止 if( input_point == output_point){ // もしバッファにデータが無ければ sti(); // 割り込み許可 // here is クリティカルセッション interruptible_sleep_on(&Q); // データ到着まで待ち列Qでsleep }else{ sti(); // 割り込み許可 } read_from_buffer(&buf); // データをバッファから取り出す。しかしこれでは対策したことになりません。sti()によって割り込み許可されたときに、保留されていた割り込みが実行されるので最初の例と比べて何の対策にもなっていません。それにドライバでcli()割禁を使うのはお行儀がよくありません。
ではsti()をとったら何が起こるでしょうか?つまり割り込み禁止(cpuロック状態)で sleep に入ってみます。常識的に考えると、cpuロックの状態でsleepに入ったら起してくれる人が居ないのでデッドロックになりますよね。で、
cli(); // 割り込み禁止 if( input_point == output_point){ // もしバッファにデータが無ければ interruptible_sleep_on(&Q); // cpuロックのままsleepしてみる } read_from_buffer(&buf); // データをバッファから取り出す。先ほどこれを実験してみましたが、意外なことに?今のバージョンのlinuxでは特に問題が起きませんでした。将来はどうなるかわかりませんし、cpuロック状態でsleepするなんて、OS的にお行儀がよくないに変わりありませんが、意外なことに大丈夫でした。じゃ、どーしてかなということで、linux-2.4.24のinterruptible_sleep_on()関数のソースを見てみます。実際には多数のマクロが組み合わさっていますが読みやすいように展開しました。
void interruptible_sleep_on(qwait_queue_head_t *q) { unsigned long flags; wait_queue_t wait; init_waitqueue_entry(&wait, current); current->state = TASK_INTERRUPTIBLE; //タスク状態をsleepということにする //寝に入るつもりだが実際にはまだ寝てない __add_wait_queue(q, &wait); //自プロセスをウェイトキューにつなぐ schedule(); //スケジューラを呼び出してsleepする __remove_wait_queue(q, &wait); //自プロセスをウェイトキューから外す }説明はほとんどコメントに書きました。
ではさらに奥の schedule() 関数を 割り込み禁止状態で呼び出したとして、見ていきます。
asmlinkage void schedule(void) { struct schedule_data * sched_data; struct task_struct *prev, *next, *p; struct list_head *tmp; int this_cpu, c; prev = current; this_cpu = prev->processor; if (unlikely(in_interrupt())) { printk("Scheduling in interrupt\n"); BUG(); } release_kernel_lock(prev, this_cpu);release_kernel_lock()関数は、以下のようなマクロです。
#define release_kernel_lock(task, cpu) \ do { \ if (task->lock_depth >= 0) \ spin_unlock(&kernel_flag); \ release_irqlock(cpu); \ __sti(); \ } while (0)おや、ここで sti()が実行されました。すなわち、schedule() 関数はそこまでの割り込みモードがどうなっているかに関係なく、割り込み許可モードに移行するのだということが分かります。(そりゃーディスパッチャですしね)これでデッドロックが起こらない理由は分かりました。
さて、このsti()が実行されたタイミングで保留されていた割り込みが実行されたらどうなるか考えて見ます。思い出してください。自プロセスはまだ実行中ですが current->state = TASK_INTERRUPTIBLE すなわち sleep になっていますし、しかも自プロセスをウェイトキュー(待ち列)につなぐ処理までは完了しています。ここで割り込みルーチンが呼ばれて wakeup が実行されます。wakeupは待つ列ににつながっているプロセスを全て TASK_RUNNNINGの状態に戻します(待ち列からは外しません)。ということで割り込みルーチンが終わって戻ってきたときには TASK_RUNNINGの状態になっています。そして schedule()関数のさらに先へと進みます。schedule()関数内部では、他のプロセスへのディスパッチが起こるかもしれませんが、自プロセスはTASK_RUNNINGですから他のランニングプロセスを一周して自分のところにも帰ってきます。そして schedule()関数を抜けます。続いての処理は見てのとおりで待ち列から自分を外し、復帰します。問題となる点は見当たりませんでした。
以上のポイントを整理すると、
1. if文で寝るか寝ないかの条件判断 ↓ 2. TASK_INTERRUPTIBLEにする ↓ 3. 待ち列につなぐ ↓ 4. schedule()を呼び出すこの区間がクリティカルセッションということになり、割り込みルーチンに割り込まれたら困る区間ということになります。今回の例のようにcli()で割り込み禁止にしてしまうのも方法でしょう。しかしcli()つまりcpuロックはOSにとってお行儀がよくありません。cpuロックはプリエンプションを阻害し、タスクディスパッチのレイテンシが増してしまう結果になります。といっても実際には現状のlinux-2.4カーネルは、カーネル空間走行中は非プリエンプティブですけどね。これは逆説的ですが、ドライバでcli()〜sti()。正しくは save_and_cli()〜restore_flags()で割り込み制御をしているドライバがあまりに多くて、linuxをリアルタイム化するのにウンザリしてしまったりするのです。
cli()を使っていれば、最初の使っていない例よりはだいぶプロっぽい書き方です。『分かっている人』に見えますし、ガツンとcpuロックするなんて
1. TASK_INTERRUPTIBLEにする (寝るつもり。という事ね) ↓ 2. 待ち列につなぐ ↓ 3. if文で寝るか寝ないかの条件判断 ↓ 4. 寝るならschedule()を呼ぶ。他のプロセスに処理が回りsleepということになる 5. 待ち列から外す ↓ 6. TASK_RUNNINGにするとしてみるとどうなるでしょう?実はこれで問題が解決します。任意の時点で割り込みルーチンに割り込まれても大丈夫です。よーくみてください。
実際にはlinuxには上記の動作を行うためのマクロが用意されています。以下のように使います。
wait_event_interruptible(待ち列Q, 条件);「条件が真になるまで」寝て待ちます。言い換えれば「偽のあいだ」寝て待ちます。最初のプログラムを書き換えると次のようになります。
wait_event_interruptible(Q,(input_point != output_point)); // (input_point != output_point)になるまで寝る read_from_buffer(&buf); // データをバッファから取り出す。この辺は結構高度な話題で上記の説明だけでは理解が難しいかもしれませんが、ドライバを書くことになりましたらプロセスの動きは頭のなかでイメージをもっていなければなりませんね。興味をもたれた方は 08/27(金)に東京CQ出版社でセミナーをやりますので、図付き・デモ付き・踊り付き?で解説しますので来てくださいね。お一人様\13,000です(宣伝)。と書こうしましたら満席でした。あらら。SH-Linuxのセミナーもやります。
real 1591m55.643s user 1409m33.860s sys 148m44.480slibqt3のビルドに1591分かかりました。26時間31分55秒です。
$ word &でワードが立ち上がる(^-^)いちいちSTARTメニューから【ワード】なんて探したくないし、word と打つなら0.3秒だ。やっぱり男はコンソールだぜぇ。それにしてもこれでクロスコンパイラまで導入できたらLinux機が要らなくなる(汗
というわけで、Cygwin上でSH3クロスコンパイル環境を整えるというページを書きました。
toppersのコンパイルができなくなった。おかしい。昔は通ったのに環境が変わってしまったか。。。。SH CPUのハードウェアの実験をするのに必要なんだけど。。。他の方法を考えよう。
void sub(){ } int test(){ sub(); }を普通にコンパイルすると
00000000 <sub>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 5d pop %ebp 4: c3 ret 5: 8d 76 00 lea 0x0(%esi),%esi 00000008 <test>: 8: 55 push %ebp 9: 89 e5 mov %esp,%ebp b: 83 ec 08 sub $0x8,%esp e: c9 leave f: e9 fc ff ff ff jmp 10 <test+0x8>オプション -fleading-underscore をつけるとアンダースコア付きになる。古いアセンブラーソースとのリンクをするときに使う。-fleading-underscore をつけてコンパイルした結果
00000000 <_sub>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 5d pop %ebp 4: c3 ret 5: 8d 76 00 lea 0x0(%esi),%esi 00000008 <_test>: 8: 55 push %ebp 9: 89 e5 mov %esp,%ebp b: 83 ec 08 sub $0x8,%esp e: c9 leave f: e9 fc ff ff ff jmp 10 <_test+0x8>
先週の土曜日は仕事が気になってか『サルサ魂』に火がつかず人の踊りを楽しく見ていた。学生の人たちが沢山来ていて、普段みかけない彼ら彼女らの踊りを見ていた。音楽を楽しみ、酒を楽しみ、カウンターからダンサー達の踊りを見ているのはとても楽しい。踊らなくとも、フロアを・空間を・時間を共有している感覚が楽しい。自分があまり踊らなかったからこそ、彼ら彼女らが楽しく踊っている様子を見ることができて、幸せな気持ちになれた。俺が踊る気満々だったら混んでるなぁくらいに思ったかもしれない。だから、タイミングがちょうど良かったのだろう。踊らなくてもelcocoは楽しいなぁ。
てな感じで最終ちょい前ののぞみに飛び乗って上京。恐れていたがやっぱり名駅の売店は店じまいモードで弁当げっとできず(-x-)ビール一本でひもじい思いをしながら東京に着き、宿に着いたら0時頃だった。荷物を置いて新幹線車中で書き溜めたメールを送信してから神田界隈のラーメン屋に繰り出す。いっつも寄っている店があるので顔を出しておく。六本木のcaribeは平日でも盛り上がってるかなとか思いつつ、今回の出張はsalsaは無しだな。
NHK BS1を流していたら、オリンピックのKEIRINをやっていた。「30歳以上の方はご存知かと思いますが、昔ローラーボールという映画がありました。あの映画もこんな感じでしたねぇ」と話をしていた。いいのかNHK!! ローラーボール見たことない人が 見てみよ〜 とか思ったらどーすんねん。(苦笑)
SH-Linuxセミナー講師。あまり笑いが取れなかった。まだまだ精進が足りない。(違)
振り返りざまに目の前に差し出された携帯電話
!!!!!!!
いやぁ楽しかった。みんなパワフルだ〜とエネルギーをもらいました。おいらの1bitエンターテイメントもやっと人に見せれたし、皆さんのネタも充実していたし。六本木にsalsa踊りにいくよか充実した夜でした。地方で地味にやっていると落ち込んだりモチベーションが下がったりしますが、今夜は良い刺激を受けました。(若い人たち・・・の集まりじゃないんですけど不思議と若さを感じました。)
また次回もやりたいです。半年くらいでネタ仕込んどきます。
東京に来るといつもいちょうが目に付く。
人工の太陽が、夏の夜もさんさんと降り注ぐ。そうか、東京の木はいちょうだったっけ。
色つく季節にはきっと黄金色の美しい並木道になるに違いない。酔い覚ましをしたせいで、体がアルコール不足を訴えてきた。アルコールを給油しながら明日の仕事に備えよう。明日は明日で盛りだくさんなはずだ。
ベルギーGP。ラストの10周見ごたえがあったぁぁ。ライコネン・シューマッハ・モントーヤ・バリチェロ。去年の秋の優勝争いの再燃のようだった。もう今年のワールドチャンピオンはレース前から決まったようなものだけど、ベルギー・スパサーキットで一番早い男は誰なのかを決める戦いだ。久しぶりに面白いGPだった。
強いシルバーアローが久しぶりに復活。クリエンもいかしてたなぁ。ゾンタは可哀想だった(;_;)。上位陣はともかくザウバーが3,4位(間違いでした。4位5位)というのもナイス。すごいねぇ。
sh3-linux-objcopy -S -R .data -R .stack -R .bss -R .comment \ -O srec sh-stub.exe sh-stub.motとやってみて出力されるのは
S00E000073682D737475622E6D6F74AD S3158000000018D0026D18D119D002210FD00B400900EB : S315800076340000000000004743433A2028474E55295E S30C8000764420332E302E3300A7 S705800000007Aなので、S0,S3,S7に対応させれば良さそう。(追加。パターンによってはS2の場合もあった)
S0 bb aaaa 73616D706C652020202020 cc S2 bb aaaaaa xxxxxxxxxxxxxxxxxxxxxx cc S3 bb aaaaaaaa xxxxxxxxxxxxxxxxxxxxxx cc S7 05 aaaaaaaa cc bbはバイトカウント。aaaaaaaaはアドレス。ccはチェックサムzImageのサイズが895,212バイトで、これを
objcopy -O srec -I binary --adjust-vma=0x20000 zImage zImage.motとしたら2,573,784byteになった。約2.8倍。115200bpsで送信すると3分43秒。.motにするのは無駄かなぁ。まぁそんなもんかなぁ。rootfs.imgをmotにすると16,203,842byte。115200bpsで送信すると 23分26秒。待てない範囲ではないか。。。
台風16号が日本海を進んでいる。とんでもない強風だ。ぐぉぉぉという風の音が、空から聞こえてくる。