こんな生々しいサンタは嫌だな。渡すときニコニコじゃなくてなんかニヤニヤしてそう。
話は変わりますが、うちの会社は今日が給料日でした。あれ?これなんてクリスマスプレゼント…?
この歳なら好きな物を自分で買えよ、ってプレゼントも悪くないが、子供の場合は金を渡しても使えない(使う場所がない)気がするなあ。せいぜい菓子を山のように買って、食いきれなくなって飽きるという自滅パターンが関の山のように思います。
僕らが小学生の頃はカードダスとかビックリマンチョコが全盛期だったけど、今の子らは何を買っているのだろうか?
ビックリマンシールって現在も続編が出ているんですね。調べてびっくりですよ。ビックリマンチョコ2000が出てたくらいまでは覚えてたんだけど、今はビックリマンひかり伝というシリーズに変わったようです。まだまだ20代だから、なんて構えていたら、一瞬でジェネレーション・ギャップが開くんだな。
同期の友達とWiiで遊びました。寮のシアタールームとか言うでかいテレビのある部屋を借りて、リモコンを振り回してました。これはけっこー面白い。
ゲーム中にWiiリモコンが急に反応しなくなるから、あせるのなんのって。恐らく検出器と離れすぎていたか、装置を置く場所がそもそも良くなかったかでしょうか。
大人数でWiiで遊ぶとしたらある程度広い部屋の方が絶対楽しい(というか、狭い部屋だと危ない)です。それなのに検出器からあまり離れると検知してくれないってのはジレンマだな。両面テープを使わないと薄型テレビの上に検出器が置けないってのも悲しいよ。他人のテレビでゲームなんかやってないで、テレビくらい買いなさいよ…ってお達しですか。
小学生に聞かれて困る算数の質問No.1は「分数の割り算はなぜ、ひっくり返して掛けるんですか?」でしょうか。以前考えてみたのですが、小学生が納得できる答えは用意できないなあ…と、降参しました。
今回改めて考えてみたものの、A/B÷C/D = E = A/B×D/Cの説明は、やはり難しいです。
単純に、割り算はA/BにC/Dがいくつ(E個)入るかを求めること、もしくはA/BからC/Dを何回(E回)引くと0になるか求めること、という説明から導く方法を考えました。しかし分数の割り算の多くは割り切れず(答えが自然数にならない)逆に混乱します。
理解を妨げる要因は1÷1/A = Aの式であることはわかるんですが…その説明がどうも難しい。小学校ではどう教えているのだろうか?
小学生は気にしないけれど、大学生にとって難しいのは1 + 1 = 2でしょう。1や2ってなんなのか、+ ってどういう意味か、答えられますか?
私は学部2年の頃に数学科の集合論という科目を取って、やっと答えがぼんやりわかりました。数自体の定義なんて考えたこともなかったので、非常に新鮮な授業でしたねえ。悲しむべくは、ここで説明できるほど理解できなかったことかな…うん。
なんで自然数や足し算に集合が関係するの?って思った人は近くの数学者を捕まえて聞いてみましょう。たかが数字とあなどるなかれ。深い意味に感動しますよ。
自己紹介ページを復活させたついでに、情報を更新してデザインをこちらの日記と合わせました。以前はXHTMLで書いていたのですがHTML 4.01に戻しました。スラッシュを書くのがうっとおしくてねえ。
当サイトは筆者が所属している(していた)組織、大学、会社などは一切関係ありません。日記の内容に関する苦情などは私個人にお送り下さるよう、よろしくお願い致します。
あとは上記の文言を付け足しておいたくらいでしょうか。今更といえば今更ですけどね。
世は忘年会シーズンです。夜になれば電車には赤い顔のサラリーマンがたくさんいます。
同期の人達と飲もうとしたのですが、高槻付近の飲み屋が全部一杯だったのには驚きました。このシーズンでなければ大抵なんとかなっていましたが、年末の飲み会に予約なしで突っ込むのは無理があった。
結局、ラーメン屋でラーメンを食べてから飲み会に行くというちょっと変わったプランになりました。食べ過ぎ、飲み過ぎ防止としては、これはこれで良いかもしれない…。
ScreenではCtrl+a Sで二画面分割ができ、Ctrl+a [Tab] で画面のフォーカスを切り替えることができます。画面の破棄はCtrl+a Xです。Shift押し忘れたり、Ctrlを押しっぱなしにしてxを押すと、画面のロックになるのでうっとおしいです。気になる人はキーバインドを変えましょう。
一方EmacsではCtrl+x 2で二画面に分割でき、Ctrl+x oで画面のフォーカスを切り替えられます。Ctrl+x 1で他の画面を全部閉じて、一つの画面になります。
両者を同時に使いだすと、段々Emacsの画面なのかScreenの画面なのかがわからなくなって、フォーカスを切り替えるときに難儀します。…え?自分だけですか…そうですか。
サイトを作り直したときにすっかり忘れさってしまってた旧サイトのページ。自己紹介ページだけ残すことにしました。右のメニューに追加してあります。内容はそのうち直します。
出てねーぞ?って人は強制リロード(Ctrl+F5だっけ?)をすると見えます。よろしくお願いします。
以前作って(2007年10月21日の日記参照)ほったらかしだったユーザエージェントのパーサですが、たかだか1000件の解析に3秒もかかるもんだから、遅くて使えずじまいでした。
正直に1文字ずつ見ていくプログラムにしたので、当然ながら文字数分だけ関数呼び出しが発生します。効率悪いです。さらにうまくないことにPHPは関数呼び出しが苦手なようで、関数呼び出しを連発すると異常なほどスローダウンします(´д`;)
というわけで一番良く通るループをチューンしたところ、0.5秒まで縮まりました。それでもたいがい遅いけど、あまりチューンするとコードがいじりづらくなるし、仕方なかろう…。
うちのATOKは「ってひとは」を変換すると「ッt絵人は」になります。ぽつんと残されたアルファベットがCoooooool!! ですね。
推し量るにATOKの辞書には「ってひとは」という単語がなく、一致する部分を探した結果、後ろの「ehitoha -> えひとは」に最長一致したのでしょう。そのためあぶれてしまった "tt" を素直に解釈した結果(tt -> っt)、上記のCoooool!! な結果となったのでしょう。たぶんね…。
初めは子音の補足/削除機能(※)が働いたのかと思いましたが、良く見ると母音も子音も数が変わっていません。恐らく違うと思われます。
どういう力が働いたのか知りませんが、今回のように文字を切ってしまうような例は珍しいかもねえ?
(※)足りない子音の補足(例:「nen -> ねn -> 年(ねん)」)や、余計な母音/子音の削除(例:「shiiinn -> しいいん -> 死因(しいん)」)などを行う機能です。
ドラクエIVをクリアしまして、ファミコン版にはなかった第6章もクリアしました。王道のゲームだけあって、システム、操作性も慣れたもんです。
以下、ネタバレ注意。といってもみんな知ってるでしょうけど。
楽しく暮らしていた故郷をピサロ御一行に襲われ、親友のシンシアが自分(勇者)の身代わりに殺される。復讐心に燃え旅立つ主人公。長い旅路の中、ピサロもまた愛するものを奪われた復讐者なのだと…、勇者はそれに気づきながらも、ピサロとの戦いを選ぶ。死闘の末にデスピサロ(ピサロ)を打ち倒し、世界に平和が訪れた。
エンディングでは勇者が仲間をそれぞれの故郷に送り届け、最後に一人自身の故郷に戻る。廃墟となった故郷の恐らくシンシアが倒れただろう広場で、俺(or私)の故郷は返ってこない、この旅は一体何だったのか…と。勇者は立ち尽くします。
これだとまぎれもないバッドエンドに見えますから、最後にシンシアが奇跡の復活を遂げてハッピーエンドとなります。しかし育ての両親や村のおっちゃん達は誰一人帰ってきません。勇者は幸せなのかと、考えてしまう話です。
ところがDS版では6章が追加されて、ロザリーがゾンビよろしく蘇るわ、ピサロ様が改心して仲間になるわで、もう何でもありです。しまいには
Ω <全てはエビルプリーストの陰謀だったんだ!
ΩΩΩ <な、なん(略
と来たもんだ。こういう展開でも別に悪かないけどさ。ドラクエIVでやってしまうと、かつての雰囲気がぶち壊しです。ちょっと残念だったなあ。
ドラクエIVは敵の息系の攻撃が、ありえんダメージになっています。タフなキャラでも最大HP 400が良いところに対して、全員に200なんてのもありますよ。耐性防具(息系ダメージ1/4軽減か、固定ダメージ軽減が多い)とフバーハ(息系ダメージ1/2軽減)がないと凌げません。
後半は1ターンで仲間全員が100以上くらって回復が全く追いつかないため、ベホマズンを連射することになります。ベホマズンの使い手たる勇者は、回復役に回ることになるでしょう。他のドラクエシリーズではベホマズンなんて滅多に使わないだけに、非常に新鮮です。
一方でスカラ系が強力無比です。スクルトを2回かければ、ほとんどの敵は被ダメが1 orミスになります。ドラクエIVでは防御力無視の打撃はほとんどないので、スクルトで打撃がほぼ無効化できます。これで息系とおあいこってとこでしょうか。
スクルト一発で防御力が200以上上がるんで、特にボス戦においては10や20の防御力差は無意味です。雑魚戦なら毎回スクルトかけるわけにはいかないからまだしも、ボス戦に挑むなら防御力より息系攻撃への耐性がある防具を探した方が強いです。
部署の忘年会がありました。二次会の後は大先輩の方に連れられ、サシで朝までダラダラ飲んでました。気を遣うなよと何回か言われましたが、さすがに20年以上上の方に気を遣うなってのは無理です!
その大先輩は部署内でとにかくすごいと噂に聞く方です。今回は少ししか話聞けませんでしたが、すごさの片鱗を感じたエピソードもちらほら。例えば、昔のCPUは音でプログラムがどこ走ってるかわかった、今のCPUは可聴域越えたねえ、とか。真似できませんね…。
後は道を歩きながら、役立つ仕事術とか、最初の4〜5年は嫌なことでも全力でやれ、ミスっても周りがサポートできるのは今だけ、と色々教えていただきました。
会社入って思ったのは、ちゃんと調べてここがわからんって聞けば皆さん親切に教えてくれるってことです。さすがにろくに調べもせず変な質問したら時間の無駄!!って怒られるでしょうけどね…。自分が右も左もわからない新人君だからってのもあるな、きっと。皆さんが親切なうちに吸収できるもんはしたいね。
目次: Linux
たまにLinux kernelをコンパイルしていると 'func' is deprecated. と言われることがあります。自分が見かけたのは、kernel/intermodule.cというファイルのinter_module_registerという関数でした。(昔の2.6系には残っていましたが、最新版(2.6.23.8)では存在しません)
見てみると関数の宣言に __deprecatedと書いてあり、define部分を探すとinclude/linux/compiler.hに書いてあります。しかし宣言の中身は空、というのもgccだけがdeprecated警告をするので、include/linux/compiler-gcc.hの方に書いてあるんですね。
#define __deprecated __attribute__((deprecated))
こんな定義です。関数プロトタイプに対して __attribute__((deprecated)) と書いておくと、その関数を使った人に対して冒頭で述べたような警告がでます。
これはコードの作者あるいは古いコードをいつまでも使っている人への警告でしょうね。もう使われない(deprecated)関数をお使いのようですけど、いずれなくなってあなたのコードは動かなくなりますよ!それまでには直してくれよ、ヨロシクね!ってことです。
他にcompiler.hで面白いなと思うのは、likelyとunlikelyマクロでしょうか。以下のようなマクロです。
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
キーワード __builtin_expectはコンパイラに対して、第一引数の結果が第二引数の結果になるときに高速動作するコードを出力しなさい、とコンパイラにヒントを与えます。ヒントが正しければプログラムが高速に動作するはずです。
具体的には likelyマクロは引数xが真であるとき、unlikelyは逆にxが偽であるときに高速動作せよと、コンパイラに指示しています。ではlikelyとunlikelyの効果を以下の実験コードで確かめてみましょう。
int func_likely();
int func_unlikely();
volatile int i;
int main(int argc, char *argv[])
{
func_likely();
func_unlikely();
return 0;
}
int func_likely()
{
int c = 0;
while (likely(i)) {
c++;
}
return c;
}
int func_unlikely()
{
int c = 0;
while (unlikely(i)) {
c++;
}
return c;
}
注目点はfunc_likelyとfunc_unlikelyです。ループの条件に付けたlikelyマクロとunlikelyマクロ以外に違いがないことを確認していただけると思います。これをgccでコンパイルしてみましょう。2.95でも対応していたと思いますが、3.xくらいのgccなら確実だと思います。
あとコンパイル時に -O2を付けることを忘れずに。
$ emacs a.c $ gcc --version gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) $ gcc -O2 -S a.c $ cat a.s (コードは一部抜粋です) (func_likelyの説明) カウント文と分岐文が連続している。条件は真の可能性が高いと信じて いるから、「カウント分」「条件判定」「分岐」という一連の命令を連 続して並べる。これにはキャッシュに乗りやすい、プリフェッチしやす いなど様々な理由があると思う。 一方、リターン文は遠くに配置される。これはコンパイラにとって、ルー プの条件が成立しないのは、稀なケースであって滅多に実行しないと信 じているから。 func_likely: jmp .L8 ;(条件判定へ) .p2align 4,,7 .L9: incl %edx ;(カウント文) .L8: movl i, %eax testl %eax, %eax ;(i != 0の条件チェック) jne .L9 ;(分岐文、真だったらループの先頭へ) popl %ebp movl %edx, %eax ret ;(リターン文) (func_unlikelyの説明) カウント文とリターン文が連続している。 分岐文もあるが真じゃない可能性が高いと信じているので、条件は成立 せずに即座に終了するはずである。 逆に、条件が成立するときは遠くに置いた判定文へ飛ぶ。これはコンパ イラにとって、条件が成立することが稀なケースであって、滅多に実行 しないと信じているから。 func_unlikely: .L2: movl i, %eax testl %eax, %eax ;(i != 0の条件チェック) jne .L3 ;(分岐文、真だったらカウント文へ) popl %ebp movl %edx, %eax ret ;(リターン文) .L3: incl %edx ;(カウント文) jmp .L2 ;(条件判定へ)
ヒントがどういう効果をおよぼすか、ご理解いただけたかと思います。このくらいの小さい関数では効率が変わらないので、例としてはあまり良くないかも…。
最後に !!(x) と引数を二重否定している理由ですが、1ではないけど真(5とか10とか -1とか)である値を1に正規化するためです。以下の例を見ていただくとわかるかと思います。
x = 5 //真だけど1ではない !(x) => 0 //偽 !!(x) => 1 //真で1である
お前の説明じゃまったくわからんぞ!!って人はGoogle先生にも聞きましょう。有名なマクロなので、他のサイトでも紹介されています。
< | 2007 | > | ||||
<< | < | 12 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | - | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | - | - | - | - | - |
合計:
本日: