トップ «前の日(12-17) 最新 次の日(12-19)» 追記

本 日 の h o g e

hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。

更新情報の取得には rdflirs を使ってもらえると嬉しいです.


12/18/2002 おいおい

tDiary 55日目

おいおい

何かGentooがトロイ仕掛けられたみたいなことになってるぞ。portageをアップデートしたら、gccが変なスクリプトに変わってやがった。ちなみにこんな感じ。

#!/bin/sh
gcc "$@"

これじゃ無限ループするだろよ。なんちゅうことよ。コレのせいでシステムがイカレポンチになっちまった。何か本家gentooのメーリングリスト覗いてみたら、ccやcppまでおかしくなってたみたい。うーむ、危険すぎる。

…というわけでGentooユーザの皆さん、ほとぼりが冷めるまでemerge rsync && emerge -u worldはしない方が懸命です。やっちゃった人は、とりあえずお近くの同系列アーキテクチャのマシンからgccをコピーしてきて、念のためgccをemergeし直しましょう。お近くに同系列アーキテクチャのマシンがない時は、インストールCDやibiblio.orgからstage1のtar玉を持って来て、

# tar jxpf stage1*.tbz2 ./usr/bin/gcc

と打てばgccバイナリが手に入りますね。

と思ったら

むぅ、emerge rsyncしたらまたportageがmaskされたみたい。これで安心してemerge -u worldできる。

しかし一回例のportageをアップデートしてしまったらどーにもならん。gccの再コンパイルは免れん。はぁ。

linux-2.5.52

なんとなくLinuxカーネル2.5.52を入れてみた。が、正常に動作しません。depmodやmodprobeあたりでコケます。モジュールファイルの拡張子が.koって一体何? 何か色々変わりまくってて楽しいぞ。うーん、しばらくはこれで遊べそうな予感。

とりあえずモジュールの組み込み方法がさっぱり分からんので(組み込もうとするとnot implementedとかいうエラーで終わる)全部カーネル組み込み。あと、/etc/init.d/modulesのスタートができずに死亡する。どうも/sbin/update-modulesの中の最後の方に書いてあるdepmod -aがエラー吐いてるくさいので、カーネルのmodules_installでやってるのと同じように

depmod -ae -F System.map 2.5.52

と書き換えてみる*1。起動時には/usrがマウントされてないので、System.mapはルート以下の適当な場所に置いてそれを読ませる。

とりあえずはうまく行ってる。つーかめちゃめちゃ快適なんですけど。しかしまぁ、これからどうなるかが問題だけどね。

かと思いきや

コンソールでのキーマップが中途半端に腐ってたことが判明。| が出せないためパイプができない。痛すぎる。でもX上では大丈夫みたい。うーむ、何か昔もこの症状で悩んだ記憶が…。さてどーしたもんか。つーかまずはキーコードを調べねば。どうもxevで出る値とは違うみたいなのでちと謎だなぁ…。

今日のBGM

Royal Hunt - Moving Target より "Step by Step"

追記

まぁ俺も東下りしてここまで来ちゃったクチですが。むしろ東下りというより北上しちゃってますな。まぁ某「地域と生活」で、ご都合主義な教員が「東とは岩手のことだ」とかほざいてた気がするけど。地元密着な人って、どーしてこう都合良く物事を持って行きたがるんでしょ。そんなに地元の名を売りたいかねぇ?

…とまぁこんなこと言っとるから単位を見事に落としたわけですが。捨てた科目以外で単位落としたのはこの科目だけだなぁ、よく考えると。地元民でもなく地域に全く興味もない人間がこんな科目受けてる時点で間違ってますか。嗚呼必修科目の罠。

*1 実際には前のカーネルでも使えるように工夫して書いたけど。


12/18/2003 がー

tDiary 420日目

[日記] がー

ネットワーク不安定すぎ.ブツブツ切れんな.つか Google につながらん.

[Gentoo][alpha] sys-apps/groff fails with emerge on alpha arch

Any version of sys-apps/groff in current Portage tree fails with emerge on alpha arch, with -Os CFLAGS. (${S}/src/roff/groff/groff brings about Segfault.)

I think this ebuild should remove -Os flag from CFLAGS using filter-flags or strip-flags.

But it seems that compilation succeeds with -O3 flag and so on, so I suggest this ebuild should use filter-flags.

  • Hardware: Alpha
  • Component: Core system
  • Severity: normal

でいいのかな.あぁ英語力のなさが身にしみる….

まぁいいや

投稿しちまえ.

うぉ

Bug の投稿画面がいつもと違ってびびった.もしかしてキャッシュやクッキーが残ってるとこうなるのか?

風博士に乗り換えてからクリアしなくなったからなあ.

[Gentoo][メモ] emerge sync で実際やってること

/usr/bin/rsync -rlptDvz --progress --stats \
  --delete --delete-after --timeout=${RSYNC_TIMEOUT} \
  --exclude='distfiles/*' --exclude='local/*' \
  --exclude='packages/*' ${SYNC}/* ${PORTDIR}

[小ネタ] FF 性格診断

  • ヒーロー編

    診断結果…あなたはセッツァー79.2%です!
    細かいことは気にしない、大胆で行動力のあるあなたは、FFのキャラに例えるとセッツァータイプです。

    ☆セッツァー・ギャビアーニ(FF6)☆

    空飛ぶギャンブル場であり、世界中で唯一の飛空艇である 「ブラックジャック号」のオーナー。
    リターナーにも帝国にも興味が無く自分が面白いと思ったことにしか興味を示さないが、
    ひょんなことから反乱軍に手を貸すようになる…。
    端正な顔立ちの色男♪ ギャンブル好きで、好意をもった女性に対しては大胆に口説く。

  • ヒロイン編

    診断結果…あなたはリルム70%です!
    明るく無邪気。周りから可愛がられるタイプのあなたは、FFのキャラに例えるとリルムタイプです。

    ☆リルム・アローニィ(FF6)☆

    ストラゴスに育てられた、天才的な魔導の素質を持つ10歳の女の子。
    ストラゴスのラーニングを見よう見まねで使っているうちに、描いたモンスターに命を
    吹き込み戦わせる異色のスケッチ技をあみだした。
    ちょっと生意気なところがあり、口も悪い。でもなぜか許せてしまう可愛らしい性格♪

正反対のように見えるんだが…共通点は何も考えてなさそうなところか?

とりあえずどっちも知ってるキャラで良かった.

[日記] は?

何で 2ch の声優板 でさらされてるんだ?

最近アニメ/声優関係のページからのアクセスがやたら多いのはこれのせいか…?

本日のツッコミ(全1件) [ツッコミを入れる]

usata [む、たしかに -Os だとコンパイル通りませんね。全然違うところでこけてますが。 ]


12/18/2004 むう

tDiary 786日目

[日記] 飲み

疲れてたのもあってそこそこに.ちと今はあまり余裕かましてる状況ではないのでカラオケもパス.徹夜モードは次の日が一日使えなくなるのでそれは大いにまずい.

案の定というかなんというか「今日はおとなしいね」とか言われてたけども.

[Rubyx] うひ

rubyx の ML に grub splash を投稿してる人がいる.やっぱり「力」かよ!

[ソフト] Ruby でも TinyP2P

もう何がなんだか.

via Matzにっき

[Gentoo] ebuild-uploader バグ修正

また一つ.

というか,いい加減なんとかしないとな…….a5hr さんは新規に作り直す方が良いという意見だけども,作り直すにしてもとりあえず現行のをどうにかしてからやりたいところ.


12/18/2005 むう

tDiary 1151日目

[戯言] あー

虚しすぎる.情報を削る作業ってものすごく不毛じゃない?

[日記] 飯日記

何食ったか忘れた…….

本日のツッコミ(全3件) [ツッコミを入れる]

あろは [情報を削る,ではなく *濃縮する* と思ってみてはどうでしょうか ? (^-^; どんどん俺の論文を濃くしてやるぜ..]

usata [量より質勝負で。 ]

atzm [いやもちろん論文ならそうしますけど,発表ですから. ]


12/18/2006 むー

tDiary 1516日目

[日記] 飯日記

  • 08時頃:サンドイッチ
  • 12時頃:カレー
  • 23時頃:照り焼きチキン的な

[戯言] あー

何かもう C を書けない体になってる気がする.本気で勉強し直さないとまじやばい風味が漂ってきた.

本日のツッコミ(全2件) [ツッコミを入れる]

kou [Python -> CトランスレータをPythonで書けばいいと思います. ]

atzm [それなんて p2c (ry ]


12/18/2007 ふむ

tDiary 1881日目

[日記] 飯日記

  • 10時頃: おにぎり
  • 15時頃: おにぎり,サラダ
  • 21時頃: パンとかドリアとか

12/18/2008 むう

tDiary 2247日目

[Py] subprocess.Popen

って,何も考えずにテキトーに使うとデッドロックするのか... ってもしかして使い方間違ってる?

from subprocess import Popen, PIPE

p = Popen(['/bin/cat'], executable='/bin/cat',
          stdin=PIPE, stdout=PIPE)

p.stdin.write('a' * (65536 * 2))
p.stdin.write('\n')

これで再現. もちろん os.write を使っても一緒.

strace とかかましてみれば分かるけど, python も cat もパイプへの書き込みでブロック. まあ当然と言えば当然なんだけど.

しかしこれを回避するために自前で select とか, 何か subprocess のうまみが半減してる気がするよなあ... ってまあそれしか思いつかん以上やるしかないのだけれど.

いけてねー.

うーん

subprocess - Subprocess management - Python v2.6.1 documentation

Warning: Use communicate() rather than stdin.write(), stdout.read() or stderr.read() to avoid deadlocks due to any of the other OS pipe buffers filling up and blocking the child process.

そう言われてもねえ.

子プロセスに渡したいデータが断続的に発生するものだったらどうすんのさ. それがバッファできるほど小さくないデータだったらどうすんのさ.


12/18/2009 むー

tDiary 2612日目

[日記] うーむ

中二病こじらせて死にそう.

中二病こじらせた結果がこれだよ

昼過ぎからすいーっと上がって,39 ℃くらい熱.

時期的にアレなので↓な経験をしてしまい,また 1 つ初めてを失いました.

  • 人生で初めて自費でマスクを買う
  • 20 年くらいぶりにマスク着用
  • 定期健康診断や見舞いを除くと 10 年くらいぶりに病院へ

いつもならこの程度で病院になど行かないんだけど, インフルだったら色々出禁になるので会社は早退して検査へ.

医者に「A 型陽性出たらタミフル使います.いわゆるメンタルとか大丈夫?」とか言われた. なるほど I can fly されたら困っちゃうもんね.

陰性だったけどさ. まあそりゃだって原因は中二病だもの. 相手は死ぬ.


12/18/2012 むう

tDiary 3708日目

[JS][メモ] Node.js の cluster がどう動くのか

本家ドキュメント に書いてあるけれど,実際何をどうしてるのか気になったので. ドキュメントにも "This causes potentially surprising behavior" とある通りだいぶサプライジングだけど,確かに書いてある通りの挙動をする.

if (cluster.isMaster) {
    cluster.fork();
}
else {
    http.createServer(function(req, res) { ... }).listen(8080);
}

こんなコードを書いた時,一体何がどうなってマルチプロセシングになるのか.

まずは親側.cluster を見てみる.

cluster.fork = function(env) {
  ...
  return (new cluster.Worker(env));
};

Worker インスタンスを返しているだけ. じゃあ Worker のコンストラクタはどうなっているか.

function Worker(customEnv) {
  ...
  if (cluster.isMaster) {
    ...
    this.process = fork(settings.exec, settings.args, {
      'env': envCopy,
      'silent': settings.silent,
      'execArgv': settings.execArgv
    });
  } else {
  ...
}

Worker 内の fork は child_process.fork そのもの.

では子供の方はどうか.子供の方は cluster を呼ばず http を呼んでいるだけなので,ここが最大の謎. http のコードを見てみる.

util.inherits(Server, net.Server);

exports.Server = Server;

exports.createServer = function(requestListener) {
  return new Server(requestListener);
};

どうやら net を見れということらしい.listen がどうなっているのかを見る.

Server.prototype.listen = function() {
  ...
  } else if (typeof arguments[1] == 'undefined' ||
             typeof arguments[1] == 'function' ||
             typeof arguments[1] == 'number') {
    // The first argument is the port, no IP given.
    listen(self, '0.0.0.0', port, 4, backlog);
  ...
};

何か別の listen 関数を呼んでいる.これは何者か.

function listen(self, address, port, addressType, backlog, fd) {
  if (!cluster) cluster = require('cluster');

  if (cluster.isWorker) {
    cluster._getServer(self, address, port, addressType, fd, function(handle) {
      self._handle = handle;
      self._listen2(address, port, addressType, backlog, fd);
    });
  } else {
    self._listen2(address, port, addressType, backlog, fd);
  }
}

なんと net 内で cluster.isWorker を評価して振る舞いを変えている! なんだこれは!

子供なら cluster._getServer というものを呼んで self._handle を初期化するらしい. cluster._getServer ってなんじゃい.

cluster._getServer = function(tcpSelf, address, port, addressType, fd, cb) {
  ...
  // Request the fd handler from the master process
  var message = {
    cmd: 'queryServer',
    address: address,
    port: port,
    addressType: addressType,
    fd: fd
  };

  // The callback will be stored until the master has responded
  sendInternalMessage(cluster.worker, message, function(msg, handle) {
    cb(handle);
  });

};

sendInternalMessage という関数を呼んで,その callback の引数で self._handle を初期化するらしい. ここで起こしているのは 'queryServer' というメッセージ. sendInternalMessage は child.send() の wrapper のようなので割愛. 要はプロセス間通信を発生させていて,ここで親側とネゴるらしい.

では親の 'queryServer' のハンドラはどうなっているのかと言うと,

if (cluster.isMaster) {
  ...
  messageHandler.queryServer = function(message, worker, send) {

    // This sequence of information is unique to the connection
    // but not to the worker
    var args = [message.address,
                message.port,
                message.addressType,
                message.fd];
    var key = args.join(':');
    var handler;

    if (serverHandlers.hasOwnProperty(key)) {
      handler = serverHandlers[key];
    } else {
      handler = serverHandlers[key] = net._createServerHandle.apply(net, args);
    }

    // echo callback with the fd handler associated with it
    send({}, handler);
  };
...

要求に対応する handler がなければ作って,あればそれを子に返す. この send というのが何者かというと,先ほど出てきた sendInternalMessage の wrapper. つまり子に handler を送りつける.

子に戻り,net の listen をもう一度見てみると,_listen2 なるメソッドを呼んでいる.

Server.prototype._listen2 = function(address, port, addressType, backlog, fd) {
  ...
  if (!self._handle) {
    self._handle = createServerHandle(address, port, addressType, fd);
  ...

親から貰った handle で既に self._handle は初期化されているので,新しく handle を生成することなしに本来の処理を行うということのようだ.

さてこれを実際にシステムコールレベルで見てみると,こんな感じ.

$ strace -f -s 8192 -e sendmsg,recvmsg,write,read node hoge.js
...
[pid 17615] write(3, "{\"cmd\":\"NODE_CLUSTER_online\"}\n", 30) = 30
[pid 17613] recvmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{"{\"cmd\":\"NODE_CLUSTER_online\"}\n", 65536}], msg_controllen=0, msg_flags=0}, 0) = 30
[pid 17615] write(3, "{\"addressType\":4,\"port\":8080,\"address\":\"0.0.0.0\",\"cmd\":\"NODE_CLUSTER_queryServer\",\"_requestEcho\":\"1:1\"}\n", 104) = 104
[pid 17613] recvmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{"{\"addressType\":4,\"port\":8080,\"address\":\"0.0.0.0\",\"cmd\":\"NODE_CLUSTER_queryServer\",\"_requestEcho\":\"1:1\"}\n", 65536}], msg_controllen=0, msg_flags=0}, 0) = 104
[pid 17613] sendmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{"{\"cmd\":\"NODE_HANDLE\",\"type\":\"net.Native\",\"msg\":{\"cmd\":\"NODE_CLUSTER_\",\"_queryEcho\":\"1:1\"}}\n", 91}], msg_controllen=20, {cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, {8}}, msg_flags=0}, 0) = 91
[pid 17615] recvmsg(3, {msg_name(0)=NULL, msg_iov(1)=[{"{\"cmd\":\"NODE_HANDLE\",\"type\":\"net.Native\",\"msg\":{\"cmd\":\"NODE_CLUSTER_\",\"_queryEcho\":\"1:1\"}}\n", 65536}], msg_controllen=24, {cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, {8}}, msg_flags=0}, 0) = 91
[pid 17615] write(3, "{\"addressType\":4,\"port\":8080,\"address\":\"0.0.0.0\",\"cmd\":\"NODE_CLUSTER_listening\"}\n", 81) = 81
[pid 17613] recvmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{"{\"addressType\":4,\"port\":8080,\"address\":\"0.0.0.0\",\"cmd\":\"NODE_CLUSTER_listening\"}\n", 65536}], msg_controllen=0, msg_flags=0}, 0) = 81

ここでは pid 17615 が子,pid 17613 が親となっている.