「あなたの背後にいるのは…メイドさんの格好をした…」
|「貴様、メイドさんって言っておけば何でも萌えになると思ったら大間違いだぞ。」
|「ひいっ。すいません…間違いました。あなたの後ろにいるのは、普段はツ…」
|「貴様、ツンデレって言っておけば何でも萌えになると思ったら大間違いだぞ。」
|「あひぃ。」
|================================================================================ * 2008-12-05 * 告知しろと言われたので(1ヶ月ほど前に) 最近 http://d.hatena.ne.jp/w_o/ こっちに書いてます あとこの日記ツールAtomのマシンにしてから初めて動かすのだけど、1.5年分の記録を日記にするのに44秒かかるとか酷い ================================================================================ * 2008-09-18 昔書いたコードが読めねー。 ================================================================================ * 2008-09-15 * つつついにやってしもうたよ 今日間違えて会社行った。照明付いてなかったときは何事かと思ったよ。僕としてはあまり一般人の枠から積極的にはみ出たいとは思っていないのでこれはショック。 生活するうえで祝日を知るしくみが無いので仕方ないとは言えるが。むしろ今まで間違えなかったのが奇跡ともいえる。 まあ、今月は今までと違ってちゃんとスケジュール決まってないうえにひとりのプロジェクトやってたから、というのが大きいだろうな。 今月はあと来週の火曜日が休みなので注意すること!!!!! * そういえばマザーボードかえた 三週間くらいまえ。なんとなく。LGA775初めて見て感動した。 適当に余ったパーツで実家のマシンでもつくるかと思ったがハードル高いな。具体的に言うとOffice。Officeパッケージ版買うとそれだけで安いPCと同じくらいだからなぁ… あと実家の人達は |
んで、スケジューラが計算ノードにrequestを投げて、しばらくするとreplyが返ってくるというような感じ。
実際にはこれは階層化されてるのだけど、階層化してるのはどう扱ったらいいか考えてないのでそれは保留で。
これだけだと、よく見かけるメッセージパッシングモデルのような気がしてつまらないので、もうちょっと手を加える。
計算ノードは、「request buffer」と「reply buffer」を持つ、というようにする。
requestやreplyは直接やりとりするのではなくて、このバッファを介してやりとりする。
request buffer と reply buffer は直接的なデータ構造ではないかもしれない。
例えば、CPUに対して命令を投げる場合を考えると、それはコンパイラ中にあるグラフ構造、ということになるし、人間に対して画面表示を出す場合を考えると、画面の状態がこの「request buffer」ということになる。(あと、音声も含まれるかもしれない)
で、request bufferとreply bufferは、「容量」という特性を持つ。
この「容量」は、そのまま、requestやreplyを入れておける数のことを示す。
全体図としてはこのくらいか。と、いうのも、図を描くのが面倒になってきたからだ。
さて、このようなモデルを考えると、「並列化したときの最適なスケジューリング」と、いうのは以下の制約をなるべく満たすようにしよう、という努力である、と見做すことができる
|
これは新記録。そして輝く延滞利息額の文字。
要因としては、
|
ふとん可哀想なのでどけるか…
================================================================================
* 2008-05-09
二日続けて早く起きた。これはかつてない快挙。
なんかゲーム感覚で早起きしてる気がするな。基本的に怠惰な生活を送ろうとすることに対して、どう対処するかというゲーム。
作業の効率化を名目としたゲームって結構あるような気がする。liifehack(w) とかもゲーム感覚的側面がありそうだし。
他にも食費減らすとか。
男のひとりぐらしで食費がボトルネックになることなんてまずありえなくて、節約したいのなら、もっと他の点から攻めるべき。具体的にいうと、PC何台も買うなよ…とか。
でも節約しようとすると、食費の削減から始めてしまうのは、それがゲーム感覚的に面白いから、というのがあるのでないかな。
* また
揺れすぎだろ…
* またまた
揺れすぎだろ…
================================================================================
* 2008-05-08
* 地震たん
\begin{verbatim}
「ね〜起きてよ〜」
ゆっさゆっさ
\end{verbatim}
================================================================================
* 2008-05-06
* なんか部屋の掃除するたびに模様替えしてるような
3,4ヶ月に一回くらいしか掃除しないからなんだが…
左からPS3、PC、ThinkPad…Mac入れるの忘れてた。
夏配置は布団とPCが隣あう必要が無いので配置の自由度が上がる
とりあえず30分ぐらい使ってわかったことは、寝ながら操作するのはしんどい。
こうかな…
================================================================================
* 2008-05-05
* ひどいな
何もしないで寝てるのか起きてるのかわからない状況を続けていたところ、休みあまりに何もしなかったので後悔の末に発狂する夢を見て起きた。
なんとかするか…
* とりあえず
部屋を片付けるなどした。
* こういうって文法どういう意図で作ってあるんだ
\begin{verbatim}
int func()
{
int;
}
\end{verbatim}
================================================================================
* 2008-05-02
休んだ。
* 久し振りにX11
http://tronche.com/gui/x/icccm/
http://standards.freedesktop.org/wm-spec/wm-spec-1.4.html
ちょっと見てたんだけど、よく考えたらWMIIの挙動はマイナーなんだから、それ用の仕様なんてないよな…
やりたかったのは、常に浮かんでるウィンドウにするというの。普通のWMだとそっちが標準だろ常考。
* memcpy
構造がmemcpyだけでコピーできるかどうか。
memcpyだけでコピーできると嬉しい点
|
================================================================================
* 2007-11-05
家賃を払ったのだった。
* [GAME] KENKO-SHINDAN
健康診断。採血したあと貧血起こしてくたばるのだった。
昔は姉が「採血したあと貧血する」とか言ったのを聞いて「どんだけ貧弱やねん」と言ってたものだが、まあ、人のこと言えない。ごめんなさ。い。
================================================================================
* 2007-11-04
アカンよ。
* 俺は今から一時間でArrowを理解するぞ!
結論 : 無理
13:18 無理かどうかはやってみないとわからないよ!
とりあえず最初にArrowという名前を見たのがここなのでここを入り口にする。なんかすごいらしい。
次ここんでここ(英語だけど図があるからわかるよ) (13:23 ほんとに3分しか読んでないよ!なんという流し読み!)
なんか書くか。とりあえず、MonadはMonadクラスにならないといけないけど、Arrowはただの関数が使える分簡単ではありそう。
\begin{verbatim}
import Control.Arrow
a::Int->Int
a x = x*2
b::Int->Int
b x = x*4
c = (arr a) >>> (arr b)
\end{verbatim}
\begin{verbatim}
Ambiguous type variable `a' in the constraint:
`Arrow a' arising from use of `>>>' at Arrow.hs:9:4-22
Possible cause: the monomorphism restriction applied to the following:
c :: a Int Int (bound at Arrow.hs:9:0)
Probable fix: give these definition(s) an explicit type signature
or use -fno-monomorphism-restriction
\end{verbatim}
e-.wakaran..(13:42)
よし、1%ぐらい理解した。(まだ書けないけど)
Monad <-> Arrowを行き来するのが Kelisli (Monad->Arrow), runKleisli(Arrow->Monad)。名前がわかりにくいよ。
よし飽きてきた。50分しか持続しなかったな!違う俺はインベーダーやるんじゃなかったのか!(14:07)
全然関係無いことしてた(14:17)
* 現代人はその目の前の仕事の忙しさのあまり本来やるべきだった仕事、やりたかった仕事を忘れてはいないだろうか
具体的にいうと家賃を払ってない
* tcc の -g
よくわからんな…そもそも全く動いてないような…そのうち。
* HTML書き間違えるなんて
アホだな…
あとFirefox殺してたらしいのを修正
================================================================================
* 2007-10-30
よよよ。二ヶ月にわたるスランプを脱出した気がする!気がするだけ!
* デスマ
終わった。白いほう。最後ボムごり押しなのは反省すべき。
大分良かった。初心者からスコアラー、メガネまで幅広くサポートという点においては素晴らしいとしか言いようがないな。
とりあえず打ち返しありクリアできるぐらいまでは頑張るか。
* Oblivion
これすごいな。PS3っぽいゲームをやろうということでやったんだがPCのほうをやるべきだった。
================================================================================
* 2007-10-25
ここのCAPTCHAはh_sakuraiさんを止めるためにあるのかもしれないな…
回答がわからないときは適当にリロードすると「J」のやつが出ます。多分。
ちょっと簡単なやつを一問追加しておいた。全部で3問。
*
昨日から四回くらいSKKのチュートリアルを起動してるよ…(C-x t)
最近ミスタイプ増えたかな…近くにTODあれば練習するのだけど
http://sega-pc.com/tod2/
ふむ…アーケードではないのか
================================================================================
* 2007-10-24
なんという素晴らしい継続力だろうか!
* 自作OSでリアルタイム性が重要である理由
反省して長めの文でも書く。OSが書きたくなったときはリアルタイム性について考えることによって罪悪感が薄れる、という話。
たまにOSが書きたくなる。
まだ一行も書いたことないけど。色々とやりたいことはあるのだけど、別に無くても困らないし…
まあ、とにかく、色々とやりたいネタがある。のだけど、しかし、結局のところどれもこれもわざわざOSとして作らなくてもSmalltalk的解決方法で、ほぎゃーっと既存のOSの上で閉じた環境作ればそれで十分な範囲のネタなんだよな。MMUとか欲しくなったとしても、kvmがあればどうにでもなるし。
わざわざOSスクラッチしてまでやらないといけないことってあんまり無いのだよな。
LinuxやWindows相当のものですら、QEMUやらVMWareなどのように既存のOSの上で動く閉じた環境として実装できるわけで、つまり、Linux相当のものを実装したくなった場合でさえ、それをOSとして実装するメリットは全く無いのである。
さて、で、OSを実装してるときに、「それってわざわざOSとして実装する必要あんの?」と聞かれたときに、どう答えるか、という問題である。
「新しいデバイスが欲しくなって」→「Linuxのドライバ書けば?」
「今のOSはメモリやCPUパワーを使いすぎだ!」→「新しいマシン買えば?Linuxで環境選べば?」
「ファイルシステムを革新したくて…」→「FUSE使えば?Smalltalk的解決で問題あるの?」
「黙れ!批判しかしないこの老害が!」→「何言ってんだゆとり世代が!」
そんなときのために、OSを自作するときは、常に常にリアルタイム性を意識し続けるのである。リアルタイム性というのは、一番下のレイヤから一番てっぺんのレイヤまで一貫して設計されないと実現されない性質である。もし、中間にひとつでもリアルタイム性を維持できないレイヤがあればそれで破綻してしまう。既存のOSの上で動くシステムでは決して実現できない性質である。
OSを作るときは常にリアルタイム性を意識しよう。「そのOSの長所は?」と聞かれたときは常に「リアルタイム処理を実現できます」と答えよう。これでありとあらゆる「既存のOSと何が違うの?」という質問に正々堂々胸を張って答えられるのである。
また、リアルタイム性を維持する方法を考えるのは、それなりにおもしろい話題であると思う。リアルタイム性が要求された瞬間に、既存の「1割の状況を切り捨てることによって9割の場合で大体うまくいく」ヌルい技術、よーするに、スワップ、GC、プリエンプションありのスケジューラ、などは全て滅びることになる。(そんなOSを一体誰が望んでいるというのか!)
バランスよくトレードオフを選択するなんていうことは許されない!状況を的確に分析し、必要な物、必要で無い物を選択し、常に最適な方法を選び続けなければならないのだ!
* リアルタイム性を維持するには
OK。さて、どうすれば一番低レベルなレイヤからてっぺんまで一貫してリアルタイム性を維持できるだろうか。
もちろんここで、「ドライバの仕様を一切決めないことによってリアルタイム性を維持する」というITRON的回答(よーするに全部お前らでなんとかしろということだ!)もあるが、まあ、それはおいといて、デスクトップOSのように、それなりに色んなデバイスも扱えることを前提としてリアルタイム性をどうやって維持するかについて考えよう。
もちろんここでそれを考えるのは僕の仕事ではなくここを読んでいるみんなの仕事だ!
(なお、以下では「リアルタイム実行が不可能であることを検出できる」「時間内に処理できなかった場合を時間内に検出できる」あたりが実現できてればリアルタイム性が維持できているものとしている。そういうのはリアルタイム性を維持できたとはいわない)
1. 基本
スワップもプリエンプションも無い世界というのも辛いので、そういうのを許す「非リアルタイムタスク」と、途中でプリエンプションしないが、制約の多い(デバイス、ファイルへアクセスできない、アクセスできるメモリ領域が小さいなど)「リアルタイムタスク」とに分ける。「非リアルタイムタスク」は既存OSのタスクと同じでよい。
2. リアルタイムタスク
リアルタイムタスクを作るときは、「開始から終了までの時間の予想最悪値」「いつまでに終わらせるべきか」「例外処理ハンドラ」「例外処理ハンドラの処理時間最悪値」「例外が発生してから終了までに許される時間」をパラメータとして渡す。
| err_t create_rt_task( program_t program, | time_t process_time, | time_t must_finish_before, | excpt_handler_t exp, | time_t exept_proc_time, | time_t except_finish_must_before )OSの状態的にどう見てもmust_finish_beforeまでに終わりそうにない場合はエラー返す。渡したタスクが予想時間内に終わらなかった場合このタスクを作ったタスクに例外が投げられる。 3. 割り込み マルチコアシステムだった場合は割り込み処理するのとリアルタイムタスクを処理するCPUを分ける。コア一個だった場合はどうしようか。 register_irq_handlerに、「割り込み処理に必要な時間最悪値」「割り込みが発生する間隔の最低値」「例外処理ハンドラ」「例外処理の時間最悪値」「ハンドラが登録されるまでに許される時間」を渡す。 |
register_irq_handler( handler_t hdl, | time_t proc_time, | time_t interval, | excpt_handler_t exp, | time_t exept_proc_time, | time_t except_finish_must_before, | time_t must_register_before )これに従って、「何ms処理すると何回割り込みが入って割り込み処理時間が最悪どのくらい」というのが取得できるAPIをつくる。 |
time_t calc_irq_handler_time( time_t process_time );「割り込み優先度」はタスクキューの状態と割り込みハンドラの登録状態をみてOSが動的に割り当てる。 こうすることで、他の行儀悪いタスクのせいでシステム全体のリアルタイム性が損なわれる、ということは無くなるはず。リアルタイム性もメモリ等と同様のシステムの資源のひとつとして、OSの管理下に置ける、というわけだ。 (もちろんそんなことはない。例えば、SMTなアーキテクチャで片スレッドがキャッシュを洗い続けたらどうなるか。) 別になんていうことはない、基本は、常に「自分がどのくらい処理時間がかかるか、どのぐらいまでに処理を終えたいか」を伝え続ける、というだけである。もちろん、そんな面倒なシステムは誰も使わないのだが。 というのは全体的に嘘で、リアルタイム性というのは、そんなに簡単に維持できるものでもなく、ハードウェアも含めたシステム全体で考えないとどうにもならないのである。例えば、本当にリアルタイム性が必要な場面ではHDDアクセスやネットワーク等I/Oも含めてリアルタイム性を実現しないといけないだろう(全然知らんが)。そうなってくると、…えーと、どうなるの? ================================================================================ * 2007-10-22 今週の目標:一日一行でもいいので書く。 うーん なんかすごいかっこいいな… しか(最近ネガティブ文書きすぎなので自粛)。 ================================================================================ * 2007-10-21 みなさんげんきですかわたしは元気です。 なんかもうあかんな… * デスマ やってきた。4回くらいやって多分ラスボスらへん。最初見たときは「これダメなんじゃないか」と思ったけど、そうでもないな。稼ぎかた理解してジャラジャラできるようになれば良いかも。 |
いただきます。
|
ボルのエンジニア、合体するPC研究中。
合体しなくても変形すれば許される気がする
|
ボルのエンジニア、ハードウェアエラーが起こるPC開発中。
「ええ、はい、それはですね、エラーチェック試験サポート機能でして、ええ、はい。」
|
ボルのエンジニア、代名詞が多いPC開発中。
「ええ、はい、それはですね、あれがそれなんです、ええ、はい、そう、それです。」
|
ボルのエンジニア、格闘に使えるPC開発中。
撲殺事件、PCとの関連か?各局でPCが登場するドラマ、ニュースを自粛へ。
================================================================================
* 2007-09-26
もげー。
Xbox360のVMXレジスタ128個ってどんな命令フォーマットになってんの?っていうのはかねてより(3時間くらい)の疑問だったのだけど、この資料を見てた。(こういうのってどうやって調べてんの?)
| | vandc128 | | これが6bit目 ||0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 0 1 0|a|1|VDh|VBh| | |これがA reg下位5bit | これが5bit目 |なんかやっぱりすごく無理してんだなー。Aレジスタを示すインデックスが三個所にある。これってハードウェア的にはどうなん? 固定長の既存の命令を拡張してレジスタ128本の命令セットが作れるのだったら、ARMとかレジスタ64本持っててもよさそうなもんだが? ================================================================================ * 2007-09-25 住んでるところのアパートらへんに猫がおって、たまに階段上がったところで寝てるんやけど、その猫が大変肝の座ったおかたで何をやっても反応しないという。 が、昨日はなんか、珍しく活動してて、玄関開けたら家に入ってきた。が、それだけ。しばらくしたら帰っていった。(オチなし) * Linuxを知らない俺達 PS3LinuxでLVMな環境で 20070817 のカーネルを入れる方法。最新のLVMはps3diskに対応してるので、最新のLVMを入れる。2.02.28だと動いた。(LVM2)。あと、Device-mapperも最新にしないといけないよう。(Device Mapper) ところでDevice Mapperて何?カーネルとlibdevmapperとlvmツールがどういう連携してるとか全くわかんないよな。 !これできみもliぬっくすますたーだ! |
いつも気になるんだけど、ああいうのを見て買う人っておるのんかな…
================================================================================
* 2007-07-22
先週のアレ。一応ソースだけ置いときます。注意:説明などは一切ありません。どうしても詳しく知りたい人はメールで…
--
prettyprinterおよび似たようなものに関する比較的どうでもよい考察。木構造のようなものを文字列にダンプするときに、reallocするのが嫌だという人も世の中にはおられることと思う。それをなんとかできないだろうかとかいうような。話。
\begin{verbatim}
#include <stdio.h>
#include <stdlib.h>
struct tree
{
struct tree * l;
struct tree * r;
char c;
};
struct string
{
char *buf;
int len;
int buflen;
};
void
dump_tree( struct string *s, struct tree *t )
{
if ( t->l )
dump_tree( s, t->l );
if ( s->buflen == s->len-1 ) {
s->buflen *= 2;
s->buf = realloc( s->buf, s->buflen );
}
s->buf[s->len] = t->c;
s->len++;
if ( t->r )
dump_tree( s, t->r );
}
struct tree *
make_tree( struct tree *l,
struct tree *r,
char c)
{
struct tree *n = malloc( sizeof(struct tree) );
n->l = l;
n->r = r;
n->c = c;
return n;
}
int main()
{
struct string str;
struct tree *t = make_tree( NULL, NULL, 'h' );
struct tree *t2 = make_tree( NULL, NULL, 'l' );
t = make_tree( t, t2, 'e' );
str.len = 0;
str.buflen = 17;
str.buf = malloc( 17 );
dump_tree( &str, t );
str.buf[str.len] = '\0';
puts( str.buf );
return 0;
}
\end{verbatim}
こういうrealloc。(最近こういうこと考える度に、「最近のマシンでは誤差なので放置したほうがいい」っていう考えになるので嫌だな…)
これは、realloc無しの形にできるのではないか、というのが、ここ3ヶ月くらいの僕の研究の中心だった。(最近あんまり更新してなかったのはそのせい。嘘です)あと、なんとかしてFirefoxのクリップボードとXのクリップボードが同期できないか、というのが、これから10年ぐらいの課題であることはいうまでもない。
…じゃなくて、
なんと、これを継続渡しモドキ(多分)にして、再帰的なアレにすることによって、realllocが消せるのである。
\begin{verbatim}
#include <stdio.h>
#include <stdlib.h>
struct tree
{
struct tree * l;
struct tree * r;
char c;
};
struct cont_node {
struct tree *node;
struct cont_node *chain;
};
struct str_node {
struct str_node *chain;
char c;
int len;
};
char *
dump_tree2( struct tree *t,
struct cont_node *cont_chain,
struct str_node *str_chain );
char *
dump_tree2_pass2( struct tree *t,
struct cont_node *cont_chain,
struct str_node *str_chain )
{
struct str_node s;
s.chain=str_chain;
s.c = t->c;
s.len = str_chain->len+1;
if ( t->r ) {
return dump_tree2( t->r, cont_chain, &s );
} else {
if ( cont_chain )
return dump_tree2_pass2( cont_chain->node, cont_chain->chain, &s );
else {
char *buf = malloc( s.len );
str_chain = &s;
buf[ s.len] = '\0';
while ( str_chain->len ) {
buf[ str_chain->len-1 ] = str_chain->c;
str_chain = str_chain->chain;
}
return buf;
}
}
}
char *
dump_tree2( struct tree *t,
struct cont_node *cont_chain,
struct str_node *str_chain )
{
if ( t->l ) {
struct cont_node cont;
cont.node = t;
cont.chain = cont_chain;
return dump_tree2( t->l, &cont, str_chain );
} else {
return dump_tree2_pass2( t, cont_chain, str_chain );
}
}
struct tree *
make_tree( struct tree *l,
struct tree *r,
char c)
{
struct tree *n = malloc( sizeof(struct tree) );
n->l = l;
n->r = r;
n->c = c;
return n;
}
int main()
{
struct str_node strchain;
struct tree *t = make_tree( NULL, NULL, 'h' );
struct tree *t2 = make_tree( NULL, NULL, 'l' );
t = make_tree( t, t2, 'e' );
strchain.len = 0;
puts(dump_tree2( t, NULL, &strchain ));
return 0;
}
\end{verbatim}
おかげさまでただのツリーをダンプするコードもこんなに大きくなりました!
まず、CPS変換をがんばって、dump_treeの中で最後の部分以外returnしないようにする。そうすると、そこまで辿ってきたノードを全てスタック上の変数に乗せることができるので、そこらへんをなんだかんだしてアレがソレ。
--
こうやってちゃんとした説明の部分をゴマカした文章ばっかり書いてるから仕事でも駄目な文章しか書けないのだよな…
よし、ちゃんと説明を書こう↓
(妖精さんが書いてくれます)
--
と思ったけど、これって最初にサイズ調べておくのとどう違うの?
--
まあ。なんとか。
================================================================================
* 2007-07-18
^へヘ∧人入λ。
================================================================================
* 2007-07-15
さてなんか作るか…ってもう20時だった。
--
妖夢見ててふと思ったのだけど、萌え霊能者というのはありかもしれないな。「あなたの背後にいるのは…〜…です。あなたの知らないあいだにドジっ娘イベントを発生させているようですね。」とかそういう感じで。
| 「あなたの背後にいるのは…メイドさんの格好をした…」
|「貴様、メイドさんって言っておけば何でも萌えになると思ったら大間違いだぞ。」
|「ひいっ。すいません…間違いました。あなたの後ろにいるのは、普段はツ…」
|「貴様、ツンデレって言っておけば何でも萌えになると思ったら大間違いだぞ。」
|「あひぃ。」
|