2007/03/09(金)窓の杜

ここのところカウンタがよく回っていますか、実は、


某プログラムが窓の杜に載ったおかげだったりします。

リンク先をよくみると分かりますが、アップデート情報に載って記事にならないという謎な載り方をしました。窓の杜のアップデート情報に載るソフトって基本的に窓の杜で一度記事として紹介されたものなんですが……。なんだこのイレギュラー(笑)

あと知らなかったのですが、窓の杜はWindowsソフト以外も紹介してくれるらしいです。

2007/03/05(月)攻撃されるcgiと止まるサーバ

SPAMの激しい攻撃

どうもサーバがやけに重たいなぁーと思っていろいろ調べてみたら、とあるところに設置されている cgi が大量の攻撃を受けていた。

設置者が放置している掲示板で「まあ実害はないだろう」と思ってそのままにしておいたのですが*1、気付いたらそのcgiのおかげで1GBぐらいあるハズのサーバメモリが食いつぶされて、さらにswapまで食いつぶされていた(汗)

どれくらいSPAM投稿があったかと言うと、1分間に

[Tue Mar 06 03:03:03 2007] [client 84.19.176.62]
[Tue Mar 06 03:03:11 2007] [client 221.208.14.248]
[Tue Mar 06 03:03:22 2007] [client 222.33.65.154]
[Tue Mar 06 03:03:29 2007] [client 220.212.135.69]
[Tue Mar 06 03:03:32 2007] [client 82.141.146.20]
[Tue Mar 06 03:03:46 2007] [client 165.228.131.12]
[Tue Mar 06 03:03:46 2007] [client 220.212.135.69]
[Tue Mar 06 03:03:47 2007] [client 72.232.229.118]
[Tue Mar 06 03:03:58 2007] [client 72.232.206.66]

だけのアクセス。これがずーーーーっと続くわけで(以下略)。cgiの実行権限を外しました。

*1 : 利用者のユーザー領域に設置されているものですから、勝手にどうにかするのはあまりよろしくない

Ruby cgiが攻撃をうけている?

top でプロセス監視していると、たまに立ち上がる ruby プロセス(www権限)が 500MB ほど食っている模様。犯人はどこの cgi だ……(汗)

……これまた放置された tDiary でした。各記事に2000件ほどのSPAMが付いてまして、ここに対して書き込み動作をしたときのメモリ消費が次のとおりです。

USERNAME  SIZE   RES STATE  C  TIME   WCPU COMMAND
www       644M  583M kserel 0  0:07 20.14% ruby

放置されたcgiほど恐ろしいものはないと身にしみました(汗)*2

*2 : たかだか30MBのログを処理するのにこれだけメモリを食うtDiaryもどうかと思いますが……

cgi使用可能メモリの制限

ユーザーが設置するcgiをいちいち監視してられない上、この状況は恐ろしすぎるので cgi で利用可能なメモリをApache 側で制限することにしました

# cgi limit is 64MB 
RLimitMEM 67108864 67108864

2007/03/04(日)Pen3 800 から Celeron 1.4AG (Tualatin)へ乗り換え

Socket370って……

メインマシンはずっと Pentium3 800MHz を使っていたのですが、ゲームとかしてると重たいことがあったのり*1、画像のリサンプリングとかでも重たかったので、ハードオフで入手してもらった Celeron 1.4G に載せ替えてみました。

FSBが133MHzから100MHzにクロックダウン、実クロックが1.75倍、キャッシュサイズ256KB変わらずという状況で、試しに Super PI をやってみましたが、そのまま2分50秒が2分20秒に30秒ぐらい早くなっただけ。2日ほど使ってみた感想としては、ちっとも速くなったように感じがしません。

やっぱりメモリアクセス速度25%ダウンが痛いですね。Socket370はCPU自体の作りはそんなに悪くないのですが、いかんせんバスの遅さが致命的で*2、キャッシュ増えない、FSB減るでわで、クロック高くなっても消費電力が数ワット増えただけという感じが……(汗)*3

ちなみに、Pentium3 800MHz(SL52P)は 1.43V 駆動で、Celeron 1.4AG は 1.18V駆動*4で問題なく動きました。もともと電源ファンしか回ってなかったのですが、その回転数さげたらHDD(5400rpm)の音が気になるように……。

*1 : 絶対ゲームのプログラマが以下略だと思うのだけども

*2 : 理論最高速度で533MB/sですからねぇ……そんな出るわけないし

*3 : Pentium3-Sが欲しいですねぇ。未だ高いんで普通に買いたくはないけど

*4 : 0.02V下がるのはマザーボードの特性です

しかしまぁ

Socket370もいかんせん時代遅れですねぇ……。Athlon64(VTあり) あたりに乗り換えたいなぁ。おかねないけど。

2007/02/19(月)物事を理解する法

今日はちょっと古い記事のサルベージです。

理解と暗記の違い

受験とかの試験社会(記憶力主義)の弊害なんだけども、理解することと丸暗記することを区別できていない、その違いがわからない人がとても多い。受験の点数だけを考えれば、概念を理解するよりも記憶力さえある程度長けていれば意味も理解せずに暗記してしまった方が楽だし何より効率がいい。でもそれは社会(や大学以上)では通用しないどころか、理解の本質を知らないことで損をすることだらけだったりします。

いわゆる「使えない奴」ということです。

使える使えないというのは、現実の問題に対して解決策を持てるかどうか、自分で考えることができるかどうかというものに大きく依存します。理解することの大切さは、やはり本人が自覚しないとどうしょうもないのですが、それが自覚できたとして、どの点に心がけたら理解できるのかというポイントを挙げてみます。

理解したという状態を知ること

そもそも理解したという状況はどういう状況を指すのでしょうか? 一言でいえば「他人に説明できる状態」が理解した状態です。質問されたとしても「曖昧に」「なんとなく」としか答えられない状況は(厳密には)理解したとはいえません。ひとつの物事を取り出せば、半分理解したということもあり得ず、「理解している」か「理解していない」かは完全に2分されます。

例えば「4×3はどうして12になるの?」と聞かれたとき、「4つのものが3つあるから12個になる」といった説明ができれば理解している状況です。しかし「4×-3はどうして-12になるの?」と聞かれたとき、「片方がマイナスのかけ算だから答えはマイナス」といった説明では、理解しているとは言えません。それは(計算法則の)事実として正しいのですが、マイナスという概念を理解してはいないからです。*1

他に例えば「インターネットはどうしてつながるの?」とか、「どうして太陽は東から登るの?」とか、「どうして酸素がないと生きていけないの?」とか、まあともかく、ある事柄に付いてのこの種の質問に答えれれるようになったとき、それを初めて理解したと言います。抽象的な感覚になってしまいますが、答えるときの気分としては心の中で浮かんでいるイメージを言葉としてもどかしいながら繋いで行くという感じになります。「何かで読んだな……たしか……」というのとは大きく違います。

*1 : 数学的厳密性を別としても、この概念を正確にとらえている人は限られますが、深入りはしません

理解するために必要なこと

これは言葉では実に簡単です。「調べる」だけです。とは言っても「太陽はなぜ東から登るのか」→「地球が北から見たとき左回転しているから」という記述を見付けたとして、「ああそうなんだ」で終わらせてはいけません。なぜ「地球が左回転していると太陽が東から登るのか」がわからなければ理解したことにはなりませんし、どうして「北から見たとき」という限定が付くのか、その意味もちゃんと知らなければなりません。

理解ということは、そのような自問自答の繰り返しです。新たに生まれた疑問点を、紙に書いて考えてみたり、再び調べてみたり、考えてもわからなかったら人に聞いてみたりします*2。そうやってすき間無く「分かった」と思うまで「調べたり」「考えたり」という行為をやめてはいけないのです。なれないうちは辛いですし、説明には、例えば「左回転しているので太陽が東から登る」と当り前のように書かれている内容を理解するのに、数日とか1週間とかかかってしまうこともありますが、慣れないうちはむしろそれぐらい時間がかかる方が普通です。人によっては、生涯一度もこのような訓練をしたことがないのですから、時間がかかっても別に落ち込む必要なんてこれっぽちもありません。

もちろん全部が全部そんなことをしていたら、到底身が身が持ちません。ですが、きちんと身に着けたいこと、身に着けなければならないこと、人に説明しなければならないこと、文章にまとめなければならないこと(レポートなど)は、やはり理解する必要があると思います。どうしても時間に迫られているというときでも、基本的には急がば回れです。

ただ、いきなり物事を理解するというのは大変なので、先に十分になれてしまうという方法も有効です。例えば「負数のかけ算」などは、本質を理解することも大切ですが、それよりも前に計算自体に十分に慣れてから本質の立ち返って考えてみる、どういう意味をもつのだろうと自分なりに当てはめてみるというのは、大変有効な手段です。

*2 : たまに勘違いしている人がいますが、自分でろくに調べも考えもせずに人に訊くのはタブーです。そのようなことをしても全く身につかないどころか、説明してくれた内容もすぐに忘れてしまいます。人に訊くときは、例えば「北から見たとき左回転ならば、たしかに(これこれこうで)東から登るのはわかったのだけど、なんで北じゃないといけないのか分からない」といった風に質問します。また「これから○○について勉強したいと思うのですが、どういう道筋で学んだらいいと思いますか?」とアドバイスを求めるのも大変良いと思います。

理解すると何が徳か?

自分の頭の中に、対象の物事の概念ができあがります。このことの効果は計り知れないものがあります。例えばプログラムならば、今まで上手く書けなかったものがすらすら書けるようになりますし、言語が変わってもさほど苦労しなくなります。例えば営業の人ならば、いわゆる営業のテクニックなどの本質を理解することで、その効果を発揮することができます。逆に言えば、理解しなければいくら「○○テクニック」とかを覚えても全く役に立ちません。TVでやるような人づきあいなどのテクニックも同じです。

他にも、色々な資料にかかれた記述やネットの無数の情報のうち、どれが本当で、どれが間違っているかなどを見極める力も付きます。鵜呑みにせず自分で考えるということは、そういう能力を養う練習になっているのです。

簡単に言えば、応用力や情報の判断力、いわゆる考える力が身につきます。はっきり言って、社会でこれほど役に立つものはありません。