アニリール セルカンに東京大学が本格的に引導を渡した件

できればセルカンネタはもう少し間を置いて書きたい。が、なんだか「アニリール セルカン」でのキーワード検索を経由したアクセスが昨日からえらい勢いになっていて何事かと思ったら、4月2日に大学が公式に引導を渡したらしい。 アニリール・セルカン 東京大学 助教、3月の博士号剥奪に続き、懲戒解雇処分である。

卒業証明書の偽造とか、もうね、死ねと。

総括がわりにリンク集でも残しとくか。

  1. アニリール・セルカン (本人のブログ。日本語。語学力だけは本物らしい)
  2. トゥルキスタン夜話 | 嘘つきな海亀は、嘘が嫌いだ! (2006/7 かなり初期の段階で気づいた人)
  3. SERKAN College 2009年から始まったセルカン主催の私塾。6回の講義で6万円也。セルカンの「体調不良」により途中で延期。
  4. さるさる日記 - Parrot Diary (2009/10- セルカンカレッジ潜入捜査員)
  5. いま何が起きているのか (セルカン氏への疑惑とは?) (シンプルにまとまっているまとめサイト)
  6. アニリール・セルカン(Serkan ANILIR)氏の経歴詐称、業績捏造の追求blog (2009/9 -)
  7. (2ch/理系全般)アニリール・セルカン2スレ781からのお知らせブログ (2010/10-)
  8. On the career of Dr. Serkan ANILIR (nakres氏による英語サイト)
  9. ご冗談でしょう、セルカンさん(業績捏造?) - 生駒日記 (2009/10)
  10. トゥルキスタン夜話 | セルカン・アニリール (2009/10)
  11. アニリール セルカン事件。ウソで塗り固めた人生はともかく個人的にはその周囲の善意の人のほうに同情する。 (2009/10)
  12. アニリール セルカン氏 本人とその取り巻きによる想定どおりの反応。一方、日経は容赦なく発進。 (2009/11)
  13. asahi.com(朝日新聞社):宇宙飛行士候補名乗る東大助教、トルコ政府が根拠否定 - 社会 (2009/11)
  14. 東大助教、トルコ人初の宇宙飛行士候補のアニリール・セルカン氏の宇宙服の写真は偽物 | その他 | sorae.jp (2009/11)
  15. 「未確認宇宙飛行士セルカン」映画化決定か?(sorae.jpの中の人、溜飲が下がって本当によかったね。) (2009/11)
  16. トゥルキスタン夜話 | 月にかわっておしおきよ(古)! (2009/11) (注:ここでいう公文書偽造とは、卒業証明書の偽造のことではなく、「この人はわが国の宇宙飛行士候補ですというトルコ運輸省の文書」の偽造のことを指しています)
  17. 東大助教アニリール・セルカン氏、「宇宙飛行士候補ではない」を自認 | その他 | sorae.jp (2009/11)
  18. 類はカモを呼ぶ - セルカンカレッジ静岡に集まった人々とは (2009/11)
  19. 主観だけで生きる社会人による残念な発言 (2009/11)
  20. 建築ジャーナル 2010年2月号 東大建築学科は大丈夫か?―アカデミズム再考― 定価900円/No.1163 (2010/2)
  21. お気に入り セルカン追求の2スレ781 vs セルカンカレッジ大阪第6回ゲスト川崎先生 (トゥギャッターまとめ 2010/2)
  22. アニリール セルカンvsグッドデザイン賞審査委員長(元)の同門対決がwktk! (2010/3)
  23. 博士の学位授与の取消しについて 東京大学 広報 2010/3/5
  24. アタチュルクのブログ (2010/3) セルカンカレッジの受講生。6万円返せと。
  25. 未確認宇宙飛行士セルカンの兄弟子が今すぐただちにツイッターするべきたった一言 (2010/3)
  26. 2sure781 vs drkazuo Round 2 (トゥギャッターまとめ 2010/3)
  27. なんにもわかってないセルカンの兄弟子がもうどうにもとまらない (2010/3)
  28. 懲戒処分相当の公表について 東京大学 広報 2010/4/2

常駐プロセス(デーモン)として動くアプリを自作する(PHPとPEAR:: System_Daemon編)

ほとんどのWebサイト(Webアプリ)は次の二つの動作でできている。

  1. 画面処理。つまり、webページ(URL)へのアクセスをきっかけ(トリガー)にして何らかの処理をすると同時に画面を表示して終わり。
  2. バッチ処理。つまり、手でコマンドを叩いたりcronで自動的に呼び出されたりすることをトリガーにして起動。数秒あるいは数時間をかけてなんらかの処理をして終わり。

小規模なサイトであれば、バッチ無しで画面アプリだけで済ませている場合も少なくはない。 しかし逆に、普通のつくりの画面やバッチ処理では不都合だったり実現できなかったりするような機能が必要になることがある。例えば誰かが不定期にファイルをアップロードしたらできるだけすぐになんらかのバッチ的な処理を走らせたい、とか。 cronで定時起動するバッチだと最短でも1分間隔でしか起動できないけど、もっと短い間隔で一定の処理をサイクルさせたい、とか。

常駐プログラムとか常駐プロセスとかデーモン(daemon)などと呼ばれるアプリはそういった用途のために開発される。別に珍しいものではなく、httpdだってhttp daemonなのでありmysqldだってやはりmysql daemonである。いつも世話になっているソフトの振る舞いをマネして自分で似たようなもの開発すると思えばそれほどハードルの高いことではない。JavaでもperlでもPHPでも、作り方は似たようなものだ。子プロセスをforkして自ら(親プロセス)は終了、あとは子プロセスで無限ループをつくり、中で目的の処理をする。外部からの制御はOSからのシグナル操作を待ち受けて...

むかーしの話、PHPでデーモンを一本つくるはめになってpnctl関数群をちまちま使ってこさえたときは、なんだかちょっと苦労した。Javaやperlのほうがまだ作りやすかったような。 しかし今は、PHPであってもPEARにSystem_Daemonという便利な拡張が用意されているので、これを使うとラクにデーモンスクリプトを自作できる。

なお、同じdaemonでもいわゆるネットワークサーバの類はNet_Serverのほうが向いているのだが、その話はまたの機会に。

また、ここから先の話はすべてPHPが--enable-pcntlオプション付きでコンパイルされているのが前提。供用レンタルサーバで提供されているPHPではたいてい無理。たくさんのユーザーに好き勝手に常駐プロセス走らされたらCPU負荷的にひどいことになりそうだから当然だ。できれば専用サーバを使いましょう

さて、--enable-pcntlしたPHPの実行環境にSystem_Daemonと、ついでにLog(これってデフォルトで入ってるんだっけ?pear listコマンドで確認可能)をインストールしたら、さっそくコードを書いてみよう。

require_once("Log.php");
require_once("System/Daemon.php");

// ログ出力用のオブジェクト。syslogのlocal4に吐く。レベルは7(デバッグ)つまり全部。
$logger = &Log::singleton('syslog', LOG_LOCAL4, "testtest", null, 7);

$options = array(
    "appName" => "testdaemon" // このデーモンの名前
    ,"appDescription" => "pear system daemon test" // 説明
    ,"appDir" => dirname(__FILE__) // デーモンが動作するときのカレントディレクトリ
    ,"authorName" => "neta.ywcafe.net" 
    ,"authorEmail" => "root@localhost"
    ,"sysMaxExecutionTime" => "0"
    ,"sysMaxInputTime" => "0"
//    ,"appRunAsUID" => 501 // このデーモンの実行ユーザーとグループ
//    ,"appRunAsGID" => 501 // ここではコメントアウトにしてるが必ず指定すべき
//    ,"appPidLocation" => "/tmp/foo/bar/testdaemon/testdaemon.pid" 
//  ↑指定しなければ/var/run/上でappNameというディレクトリと*.pidファイルをつくろうとする
    ,"usePEARLogInstance" => $logger // 下の説明参照。
);
System_Daemon::setOptions($options);

System_Daemon::start();
//DBに接続するならこのへんで。つまりstart()のあとで。
$loop = 0;
while ( ! System_Daemon::isDying()) {// デーモンが停止処理中でないかループのたびにチェック
    $loop++;
    //
    //このへんでなんでも好きな処理をする
    //

    // なんかログを吐いてみる。(system_daemon正式版)
    System_Daemon::debug("ほげほげ");

    // なんかログを吐いてみる。
    //(どうせPearLogのシングルトンなんだから$loggerを直接呼んでもいいじゃないか版)
    $logger->debug("hoge! ".date("r")); 

    if ($loop % 30 == 0) {
        $logger->info("現在のメモリ使用量: ".memory_get_usage());
    }

    System_Daemon::iterate(5); 
}
System_Daemon::stop();

起動方法: php コード名.php
停止方法: ps コマンドでプロセス番号を探してそれをkill。
下で述べる起動スクリプトを使うと sudo /etc/init.d/hogehoge start|stop とかでやれるようになる。

以下はコードのコメントでは書ききれなかったメモ。

動作状況は必ずログに吐くべし。いわゆるprintfデバッグもなるたけ避ける。

デーモンというものはバックグラウンドのプロセスなので何か起きてもそれを叫ぶ場がない。たとえば普通の画面処理ではないのでブラウザに何か表示されるわけでももちろんない。したがって、通常の動作結果や何らかの予期せぬ障害発生の報告はすべてログに吐かせる必要がる。System_Daemonの作者のサイトでも、「メインの無限ループ内部でechoすんな。本当にバックグラウンドで走ってるときにSTDOUTに吐くような動作(echoとか)をうっかりさせたらfatalエラーで死ぬよ」と解説しているとおりである。

なお、SYSTEM_DAEMON自体に独自にファイルにログを吐く仕組みが用意されているのだが、筆者はsyslogに吐くほうが好みであり、かつ他の画面やバッチのアプリのログ出力機構と共通化を図るためにも、単純にPear/Logとsyslogを組み合わせて使っている。このほうが何かと簡単かつ単純だ。

実行ユーザー/グループを設定する

これはデーモンに限らず言えることだが、このデーモンスクリプトはどの実行ユーザー/グループで動く(べき)のか、ということをきちんと検討したうえでそれをしかるべくコード上で表現しておいたほうがいい。余計な混乱を避けれる。設定しなければそれを叩いたユーザーの権限で動くだけだが、実運用ではデーモンはinitスクリプト等で自動起動されるケースが多い。それでほっとくroot権限で動くということになり、その状況はまったくおすすめできない。

このスクリプトのファイル自体をchmod 755しておかないと起動スクリプトを作ってくれない

ここに書いてあるように System_Daemon::writeAutoRun();とやると、 /etc/init.d/の配下に起動スクリプトを自動的に作ってくれるという気の利いた機能がついている。 ただし、そのデーモンのスクリプトのファイル自体に実行属性がついてることを前提としたつくりになっている。これも好みの問題かもしれないが、 「php スクリプト名.php」というふうに指定して実行するほうがいいと思うので、起動スクリプトができあがったらその「/usr/local/bin/php /パス/スクリプト名.php」といった風に書き直しておいたほうがいい。

ループ制御

デーモンというものは内部で無限ループすることでいわゆる「常駐」状態となる。 System_Daemon::isDying() の返す値でループを続けるか否かを判断することで、スクリプトが停止のシグナルを受けたときに処理状態が中途半端な状態で停止してしまうことをある程度防ぐことができる(らしい、ってとこまでしかコード読んでないんだけど)。

また、ループの最初または最後で必ず System_Daemon::iterate(秒数) する。このメソッドは内部で指定秒数だけsleepし、かつ、clearstatcacheを呼んで余計な内部キャッシュを掃除してくれる。秒数をゼロにするのはあまりおすすめできない。CPUを食いすぎる可能性が高まるからだ(そのデーモンに何をやらせるかにもよるけど)。

メモリ使用量

ループの内部でうっかり同じオブジェクトや配列に要素を追加し続けたりすると、当然ながらそのデーモンのプロセスが抱えこむメモリ使用量は増え続けてしまう。一種のリーク状態だ。作る側が気をつけるしかないが、手っ取り早い方法は、memory_get_usage()の結果を時々ログに吐いて観察してみること。

シグナルハンドラ

できればいろんなシグナルを受け取った時の動作をSignalHandlerとしてちゃんと書くのがベターなんだけど、ここでははごく簡単なサンプルということであしからずご了承ください。

その他もろもろの諸注意は System_Daemonの作者のサイトへ。

see also

Yahooもサイバーもメルマガ事業を終了、そしてまぐまぐの状況は?

メルマガ?そんなものもありました。

そういえば最近のまぐまぐのメルマガはどうなってるのかなと思って、メーラーのメルマガ用フォルダ(自動振り分け)を開けたら未読件数が万単位になってた。あなたのPCのメーラーも似たようなことになってませんか?(笑)。

メルマガ発行サービスの終了を宣言した各社はそろって「あとは、まぐまぐでも使ってね」と誘導しておりますが、ではいまのまぐまぐってどんな状況なのでしょうか。

広告お問い合わせ | 広告リストのご請求 | 株式会社 まぐまぐにあるとおり、無料発行されるメルマガに自動的に差し込む広告と、ほぼ強制的に購読登録したことになる「ウィークリーまぐまぐ」上の広告とが主な収入源。

ただ、ためしにメールのSubjectが「ウィまぐ」のものだけ抽出してざっと眺めると、定番の広告主が「ローン」「情報商材」「口臭が...」「投資情報(これも情報商材)」なんだなといった感じで浮き彫りにされます。 しょうがないので有料メルマガ、つまりホリエモンのブログじゃいえない話がどうとか、そういう方向に活路を見出そうとしているわけです。あれ?最近日経新聞のweb版も似たような方向性を打ち出してたっけ? まあだからどうだってことじゃないですごめんなさい。

それから、まぐまぐ 殿堂 site:sitecatcher.net - Google 検索 といった感じで検索するといい感じです。これもいわゆる市場経済だというだけのことなんですが。

じゃあメルマガはもう死んだのかっていうとそうでもないと思う。いわゆる「自社メルマガ」つまり既に自社サービス/製品を使ってくれているユーザーの方に定期的に流すメールを、こうしたいわゆる「メルマガスタンド」事業者を経由せずに配信しているケースは今後もごく普通に続けられることでしょう。

何度も言うけどオチは無い。すまない。

see also:

そのうち「トヨタのプリウスには大量破壊兵器が隠されている」とか言い出すんじゃないの?

アメリカ人のケンカの売り方はいつだって同じ。「それっぽい相手にそれっぽくいいがかりをつける」ところから始まる。

トヨタも、15億円ぽっちだと思って反論もせずに制裁金払ったりしてるとそのうちあなどられて「お前の車は大量破壊兵器だ」とか言われてケツの穴までむしられるんじゃないの?という冗談も冗談に思えない。

Javaのリフレクション

extends, extendsと継承が繰り返されているクラス群の最深部のAbstractなクラスのソース見たら、俺が使いたいメソッドがprotectedになっててくじけそうになった。別に悪さしやしないからpublicにしといてくれよパパ。大人の事情によりそのクラスはもう変更できない。しょうがないから継承関係の中間あたりにいるクラスをさらに継承するクラスをつくって目的のやつと同じメソッド名で自前でオーバーライドしてやろうかと思ったけど、そうするとクラス名が変わるわけで、それを使ってる他のクラスも少し書き変えなきゃならないかもしんない。いやだ。影響範囲を調べるほんの少しの気力が出ない。ああいやだ。しょうがないからリフレクションAPI使ってmethod.setAccessible(true)とかやって目的のメソッドに強引にアクセスしてオブジェクトを引きずりだしてみたら、同じクラスなんだけどインスタンス(実体)として別になっちゃってるらしくて中身が空に近い。あーもうリフレクションよくわかんないよ。Seasar2がHotDeployなせいかなと思ってCoolDeployにしてみたんだけど現象変わらず。seasar2のBeanDescとか使えばいいって話のか?ああもうよくわからん。リフレクションの使い方自体を微妙に間違えているのはわかっているよハニー。でも男には行かなきゃならない時もあるのさ。

とにかく、何を言ってるのかわからんと思うが俺もよくわからん。酒飲んで寝よう。おまえJavaわかってねーだろというツッコミは甘んじて受ける。なにより最新のAPIについていけてないオレって化石。

サンプラザ中野くんがホメオパシー バンザイな件

バ カ じゃ ね ぇ の ? → ホメオパシーが効いたのだそうだね。 - サンプラザ中野くんの株式ロックンロール/マネックス証券 - ネット証券

サンプラザ中野だかエリカ様だかに限らず、芸能人か一般ピープルかにかかわらず、 ホメオパシーなるニセ科学スピリチュアル系ビジネスがシャレにならないレベルになっている。 そろそろ本気でどうにかしないとヤバイと思う。

「パターン」を与えた小指のツメほどの砂糖の塊を飲むと病気が治るんだそうで、 それなんてゾーン? そういえばセルカンネタのときもこんなビジネスがもぐりこんでたね。

何がどうヤバイのかって?まあそこは適当にググってほしい。 例えばの話、輸血拒否で我が子を危険にさらすエホバの証人とどっこいな事例とか、 ついうっかりお墨付きを与えちゃったがために単なるプラセボ効果に対して無駄な医療保険費が支払われちゃってそれを適用外にするまでに数十年間もかかっちゃったイギリスとか、そういうことになるんだよ。

というわけで、サンプラザ中野ハゲみたいなホメオパシックおバカさんが必ず口にする「イギリスでは保険が適用されるんだぜ」は既にウソになりつつあります。 他の国でも動向はほぼ同じ。

例えば実際のコードが100K行なら、自動テストのコードが何行?

これは興味深い。というか、すごいな。

SQLiteのテストコードは4567万8000行! 本体のコードは6万7000行 - Publickey

3月に公開された最新バージョンのSQLite 3.6.23。本体のソースコードは約6万7200行(67.2KSLOC、Kilo Source Lines of Code:空行やコメントを除いた行数)なのに対し、テストコードはなんと4567万8300行(45678.3KSLOC)だと紹介されているのです! これはテストコードが本体の約679倍もの大きさだということになります。

SQLを解するデータベースというソフトウェアの性質上、標準、ルール、規約、文法、要するに「動かざる仕様」が完全に整っているケースだからこその数字なのだとは思う。でないとここまで自動化はできないはずだ。とはいえ、見習いたい。俺もがんばろう。

ソースネクストのウィルスセキュリティゼロの不具合(2010年春)の件でいろいろ書いてる方々について

ソースネクストのまわし者ってわけじゃないですが、下書き状態のエントリが一本あったので。

今月の初めごろ、「「ウイルスセキュリティ」PCが起動できなくなる不具合、誤検知で (INTERNET Watch 2010/4/15)」っていうのがありました。ウィルス定義が自動更新されたら二度とPCが起動しなくなりました的な。

で、その反応なんですが、案の定な感じ。↓

いや、そりゃあね、突然PCが起動できなくなるんだから怒って当然。怒る気持はわかります。ご愁傷様です。

でも、だからといってソースネクスト以外のメーカーなら万全かっていうとそうでもないよと。

ほら、他のメーカーもほぼ同じことをやらかしてるじゃん。時期と地域が少々違うだけ。 ソースネクスト使えねえぜシマンテックにしとけ!とか、訳知り顔で友達にアドバイスしてる人、あとで気まずいことになるかもしれませんよ。それが1ヶ月後か1年後かはわからんけど。 「売り文句の「更新料0円」に、一般ユーザは踊らされてるんだろうなぁ。」とか言ってる人も、いや、あなたが今度は報道に踊らされてるのかも(ry

こうした状況に比べるとたとえば「この問題はソースネクストに限らず、すべてのウイルス対策ソフトにも可能性がありますので、他人事では無いのですよね。」といった、なんてことはないはずの冷静なコメントが逆によく光ります。はい。

あれって検出率から言うとフリーのアンチウイルスソフトにも負けるんですよね」とか言ってる方もいらっしゃいますが、たとえばの話ただのCookieをスパイウェアあつかいにするような暴挙に出ればそりゃあ検出率で他社と差別化もできるわけでありまして、どんだけ有意差あんのかと。えっ?ウィルスの話とスパイウェアの話をわざとらしくごっちゃにすんなって?いやあ、最近はもうごっちゃの話なんじゃなかろうか結局。

コンピュータウィルスとそのワクチンソフトという、使ってる技術や前提とする状況が似たようなもんなんだから当然の結果。 とにかくそれが今のソフトウェア技術とその産業の限界ですよってことで、いち技術屋として謝っとこう、ごめんなさい。ウィルスもワクチンもまるっきり専門外だけど。

see also:

追記:2005年のウィルスバスター事件の件を加筆しました。