yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2018/01 の記事
[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]

yamicha.com's Blog
 諸事情により、現在更新休止中。ご了承ください。もし今後ブログを再開することがあるとすれば、その際にはこのブログスクリプトではなく、新しく開発したものによるかもしれません。
 当ブログ管理者についてはこちらをご参照。
開発魔法(737)
社会問題(733)
お知らせ(11)
質問・バトン回答(15)
ゲスト出演(8)
経済・知的財産(150)
ゲーム開発(182)
[Ada] 勝手に補足
- Note
- 金配りの次の一手


- Endless Ultimate Diary
- 銃世界

漢字バトン
- うるる雑記帳
- 漢字接力棒

ツキアイゲノムバトン
- ブログ@うにうに画像倉庫
- あぶ内閣

縺イ縺セ縺、縺カ縺励ヰ繝医Φ
- 月夜のボヤキ
- 騎士サーラバトン
パスワードを使う
名無し (2012/02/27)


開発者解放裁判
yamicha.com (2010/03/14)
Winnyに関しては、私も「純白」とまでは考えておりませんし、使用し..

開発者解放裁判
通りすがり (2010/03/08)
winnyに関しては「ダウンロードソフト板」なんてところを拠点に開発..

新型インフルエンザの恐怖
いげ太 (2009/11/03)
> C#などの「int Some(int , int)」は、F#では「(int * int) ->..

時効に関する思考
yamicha.com (2009/08/31)
>いげ太さんコメントありがとうございます。手元にドキュメントが少..
Homepage
Blog Top
Normal View
List View
Search
Calendar
Comment List
Trackback List
Blog RSS
Send Trackback
Phone Mode
Administrator
yamicha.com
Blog
るううるる。
Source
法令データ提供システム
FindLaw
Development
Java2 Platform SE 6
Java EE 6 API
MySQL Developer Zone
PHP Reference
MSDN Library
Ada Reference Manual
Objective Caml
Python Documentation
Erlang
Prolog Documents
カテゴリ表示
 カテゴリ ゲーム開発 に当てはまるもののみを表示します。

 存在する記事 182 件の中から 21-25 件を表示しています。
学校給食時間差殺人トリック
2005/12/21(Wed)18:28:30
 ServletもTomcatで考えうる限りの機能は使ってみましたし、PHPにしてもファイル転送からデータベースまで一通り終えてしまいましたし、PerlにしてもDBIでBLOBへのファイル出入力までやってしまいました。MySQLはトリガやストアド、外部キーまで終わってしまった始末。JavaScriptのAjaxではリアルタイムチャットまで作ってしまい、さて次は何を片付けましょうか。
 というわけで、Tactical Revolutionの新アビリティ実験用の新ステージを作成し、コードを大幅調整していました。見た感じはそれほど変わりませんが、かなり色々変わっています。具体的には、リザレクトライフなどを特殊な方法で実装していたのを、ダメージ処理メソッド内に処理を記述することで、できるだけ他の「普通の」アビリティとの整合性を持たせてあります。今回から成功しないかもしれないリザレクトライフなども作れます(絶対不評ですが)。
 ついでに、きたる日の質問を回避するため、新ステージについても触れておきます。イリアスさんに大量の新アビリティを搭載した新ステージなのですが、これにはいくつかの謎解き要素があり、上手くやらなければクリアすらままなりません。どれもこれも、すべては新アビリティの使い方にかかっています。
 まず1つ目の関門ですが、勝利条件が「敵を全滅」にもかかわらず、どういうわけか敵は全員壁の向こうです。壁はアビリティの範囲すらさえぎりますから、このままでは相手を攻撃することすらできません(その代わり相手も攻撃してきませんが)。ある方法で戦えるようになってからが本当の勝負ということです。なお、この「ある方法」は時間やターンの経過で得られるものではなく、ユーザーの操作が介在する必要があります。
 さて、こうして首尾よく壁の向こうの敵を殲滅することができても、まだ問題が1つ。敵には1人だけアンデッドが混ざっています。これを倒さなければ、勝利することはできません。といっても、アンデッドはLAを0以下にしても消失しませんから、これではいつまで経っても勝利できません。どうすれば良いのでしょう。
 ここで登場するのが、例によって「とある方法」です。この方法を用いて敵を倒せば、アンデッドであれ何であれ関係なく撃破することができます(少々根気が必要ですが)。そのためにヘビーアーマーをアンデッドに設定したのです。これが「ウィングナイト」や「デュアルナイト」や「革命魔道士」だったりすれば、恐ろしくストレスがたまること間違いありません。
 それでは、リリース後には各自クリア方法を探してみてください。サーラさんの勇士を拝むのもお忘れなく。イベント中で「蒼流希虹剣」を使ってくれます。

 オリンピックのフィギュアでモメごとが起こっている模様。何でも「魔道士イリアスはフィギュアスケートに出られない」ということらしいです。浅田選手が本来なら出られる状況にもかかわらず、年齢制限に3ヶ月足りずに出られないとか。それで議論が起こっており、小泉総理も「おかしいよな」とのことです。
 が、悲しいかな、私はスポーツは完全に話題の範囲外です。日本が金メダルを取るより、「大剣」のアビリティが相手に的中した時の方が何倍も喜びが大きいのが私という人間です。オリンピックなど見もしませんから、出場・不出場問題にも関係ありません。本人や関係者にとっては、そういうわけにはいかないのでしょうが。
 では、なぜあえてこの話題を取り上げたのか。原因は読売新聞です。
 「15歳の可能性が「次でいい」と言わせるのだろう。未来がまだ無限にも見える青春の入り口、それがうらやましくもある」(よみうり寸評 12/20)
 これに無性に腹が立って仕方がありません。オリンピックは本人にとっては晴れ舞台であって、出られないことを喜ぶ選手などそうそういるものではありません。本人は悔しさを「次」という言葉で表現したのでしょうが、それに対して「15歳の可能性が次でいいと言わせる」とは。報道関係者の無神経さ、ここに極まれり。私が選手なら、こんな記事を書かれては、とりあえず3日は怒り狂います。
 「他人を慮る気持ちが少しでも残っているようでは論説委員にはなれない」ということなのでしょうか。悲しい世の中です。

 本題に参ります。米国牛が輸入されることになりましたが、確かにスーパーの肉屋で売られている肉については、産地偽装さえされていなければ米国産をつかまされることはありません。ただ、米国牛の売れ行きが予想以上に芳しくなく、店が在庫を抱えるようなことになったり、または利益を上げようとすれば、産地偽装は十分あり得ます。
 和牛を200円で入れて210円で売るより、米国牛を100円で入れて210円で売る方が、利益は何倍にもなりますから。そういう不届きな店が出るのは時間の問題でしょう。さらに、仮に産地偽装が明らかになったとしても、見つかるのは氷山の一角です。
 しかも、産地偽装がなされなくても、CJDは移植や輸血で感染する恐れがあります。さらに、再三主張している通り、恐ろしいのは何といっても外食や加工食品です。大豆食品などは原材料名に「大豆(遺伝子組換えでない)」などと書かれていたりしますが、加工ハンバーグなどに「牛肉(米国産牛肉でない)」などと書かれるでしょうか。外食についても、政府は産地表示を要請していますが、所詮は自主規制です。自主規制がどれほど頼りないものかは、「マスコミの報道姿勢とスクラムへの自主的取り組み」を見ての通りです。
 そもそも外食の材料というのはかなりアバウトであり、例えばマクドナルドなどは、以前までは包み紙に堂々と「国産ビーフ100%」と書いてありながら、日本でBSEが出るや否や「当店の牛肉はオーストラリア産100%だから安心です」。よっぽどしっかりしている店でもない限り、何を食わされても文句は言えませんし、規制法も肉屋に比べれば非常にゆるいです。
 ここまでは今までにも書いたことがありましたが、私は今まで重要なものを1つ見落としていました。そう、給食に米国牛が使われない保証はないのです。今はまだ騒ぎが大きいということで、使用率はいくらか低いかもしれませんが、これからBSE問題が風化してくれば、米国牛を採用する給食も増えてくることでしょう。
 これから5年10年と経つうちに、米国牛があちこちの給食で使われ始め、それから何年も経ったころにようやく、米国牛輸入再開直後(つまり今)に早速米国産の牛肉を食べた、もしくは外食などで知らずに摂取してしまった層にCJDの症例がポツポツ現れ始める。最初は「原因不明の奇病」とされるものの、究明作業によって米国牛が原因の可能性が高いと分かる。というルートをたどることを想像してみてください。
 その時にあわてても後の祭りです。すでにたくさんの子どもが米国牛を摂取してしまっていることになりますから、子どもたち、もしくは給食で輸入再開後の牛肉を食べて育った世代の大人たちは、いつどこでCJDが発症してもおかしくないのです。さらに、これが母子感染などしようものなら、それこそとんでもないことになります。
 その時点で牛肉の輸入を停止したところで、そこから数十年は発病予備軍が存在することになりますし、輸血など他の方法で感染するのであれば、特効薬が作られでもしない限り、永久にCJDの影におびえることになります。ついこの前までは「異常プリオン」なる存在を唱えることすら異端者の行いであり、その存在が認められたのも最近のことです。感染経路や方法など、まだ何も分かっていないと言っても過言ではありません。それをやすやすと輸入するなど、神経を疑います。
 何となくBSE問題の未来も見えます。私の予想もあわせて書き記しておきましょう。今から10年、20年と経った後、米国牛が原因と見られるCJD疑い例発症。政府は頑なに「CJDとは限らない」「米国牛が原因という証拠はない」を繰り返すも、症例が次々と発覚し、共通項が米国牛であることが分かると「米国牛が原因だった」と初めて認めるも、CJD患者や遺族に対しては「CJDである証拠は?」「米国牛を食べた証拠は?」「そもそもリスクを知っていて食べたのだろう?」(米国牛と知っていて食べたのか、外食や給食で知らずに食べたのかを知るすべはない)などとムチャクチャを言って全く補償を行わない。
 結果、裁判が行われては部分的に責任を認めて賠償、のお決まりのパターンを繰り返すも、当時の主要な輸入再開関係者の首謀者はほとんど死亡。生き残った老いぼれに対しては「CJDの可能性は予見できなかった」として無罪判決。らい予防法を賞賛した新聞社が、今になってその過ちを認めたのと同じく、今から50年も経って「あの時に我々はCJDの輸入に手を貸した。反省せねばならない」。
 以上、歴史は繰り返されます。これを避けるには、米国が日本並みに厳しい検査を導入するまで、とにかく米国牛を1口たりとも食べず、外食でも米国牛を使っていないことを公言している飲食店のみを利用して、米国牛を間接的に叩くしかないのですが、リスクを覚悟して牛丼なり米国牛なりを食べるならまだしも、米国牛のリスクを理解もできずに食べるのが低IQ層。大変なことになりかねません。

 さて、例によってSQLですが、小手先で面白そうな記述がいくつかあったので、記述しておきます。例によってごく簡単ですが。例えば、現状で次のようなテーブルが存在します。
sample(number INT , name VARCHAR(32));
 おなじみのsampleテーブルですが、これと全く同じテーブルを作るにはどうするべきか。以前にSELECTを組み合わせたCREATE TABLEも扱ってみましたが、実はMySQL 4.1以降では
CREATE TABLE newtable LIKE sample;
 で良いらしいのです。ただし、データはコピーされません。また、エンジンを指定することもできないようです。SELECT文の場合はコピーされないインデックスなども、この場合はしっかり持ち越されるとのことです。「同じ型のテーブルを作ってデータをコピーする」のと「同じテーブル構造のテーブルを作る」ことの違いと考えれば分かりやすいでしょうか。
 実際にやってみたところ、
// ベースのテーブル
CREATE TEMPORARY TABLE tbase(number LONG , INDEX(number)) ENGINE=heap;

// それぞれコピーテーブル
CREATE TEMPORARY TABLE tchild SELECT * FROM tbase;
CREATE TEMPORARY TABLE tcopy LIKE tbase;
 どちらも型などは同じになりますが、前者ではnumberのINDEX属性が外されており、さらにエンジンもInnoDBにされています。後者ではINDEXはそのまま、エンジンもheapのままです。前者の書き方の場合、型を厳密に指定することもできるそうなので、
CREATE TEMPORARY TABLE tchild
(number BIGINT , INDEX(number)) SELECT * FROM tbase;
 一応こういう技が使えます。とまあ、ここまでは4.1以降で使えるのですが、5.0以降では「ALTER DATABASE」なるものもサポートされているようです。ついでに英文MySQLドキュメントをナナメ読みしていると、「XA Transaction」なるものが。良く分かりませんが、少しばかりいじってみます。
CREATE TABLE st(number INT , name VARCHAR(32));
XA START 'yamicha';
INSERT INTO st VALUES(0 , 'Destruction') , (1 , 'Exclusion');
XA END 'yamicha';
XA PREPARE 'yamicha';

XA COMMIT 'yamicha';
// または XA ROLLBACK 'yamicha';
// COMMITにはPREPAREが必要だが、ROLLBACKは無条件で呼べる
 英文が読めないのでさっぱり分からないのですが、普通のトランザクションとどう違うのでしょう。別に2つトランザクションが持てるわけでもなさそうですし(エラーが出ます)。ドキュメントの日本語版が出たら検証してみたいところです。
カテゴリ [開発魔法][社会問題][ゲーム開発] [トラックバック 0][コメント 0]

まともな政府決定にサプライズ
2005/12/20(Tue)20:22:41
 気づけば技術者集会まであと10日ほどしかないではありませんか。出し物も更新しなければならないというのに。ということで、Tactical Revolutionに前から実装したかったアビリティをドカドカ実装しました。バトルシステムを根本からいじったりする実装ということで、今まで敬遠していたのですが。
 追加したアビリティをとりあえず列挙しておきますが、動作確認はまだ完全に終わってはいません。どうしようもないバグが見つかれば、公開版では削除されることになりますので、詳しい効果の説明は行いません。技術者集会までにいくつのアビリティが生き残るかは不明ですが、技術者集会の場で確かめてください。

1.エクスティンクト
 単語としては「消失」「絶滅」などの意味があります。本当はセットで「ディスティンクト」も作りたかったのですが。MySQLのSELECT文で「DISTINCT」を記述すると、重複するレコードをすべて消し去ってくれます(デフォルトの動作)。ちなみにこの機能を無効にするには「ALL」を用います。アビリティの方では、ダメージを与えるような魔法ではない、とだけ記しておきましょう。

2.デュプリケーション
 「2倍」「複写」などの意味があります。主要キーもしくはユニークの存在するテーブルにおけるINSERT文で「DUPLICATE」を記述すると、仮にデータが重複して登録することができなくても、代わりにDUPLICATEで指定したUPDATE文を実行してくれます。アビリティの方では、騎士には有効なのですが、魔道士にとってはどうにも、という魔法です。

3.デュアルナイト
 スペルは「Dual Night」、「2つの夜」や「多重の夜」といった意味合いです。ちなみに某最強騎士のクラスは「Dual Knight」。SQLではSELECT文でも普通の足し算などを行うことができ、具体的には「SELECT 1 + 1;」などと記述しますが、SQLによってはダミーテーブルとして「DUAL」を使わなければならないそうです。例としては「SELECT 1 + 1 FROM DUAL;」。MySQLではDUALを使っても使わなくても動きます。アビリティの方はなかなか優秀ですが、消費MRもまた素晴らしいです。

4.アトリビューション
 「性質」や「属性」の意味です。Servletの「setAttribute/getAttribute」を使うと、リクエストやセッションに属性をセットしたり取り出したりすることができます。それでは、このアビリティにはどういった効果があるのか。それはご想像にお任せします。こちらは魔道士にてきめんで騎士に厳しいアビリティ、とだけ申し上げておきましょう。

5.ディスパッチウィンド
 以前に扱ったのが「RequestDispatcher」クラス。リクエストをリダイレクトまたはインクルードするためのクラスでした。単語の意味は「(急いで)送る」など。これのためにインターフェイスを1つ用意するという、なかなか手のかかったアビリティです。ただ、リザレクトライフ並みに自由度の高いアビリティでもあります。

 その他、今までブログをしっかり見て下さった方ならプレイ済みであろうTactical Revolutionで初登場したアビリティとして、

・豪剣(大剣の強化版。命中率がよろしくない)
・ハーフブライト(LAを半分にする魔法。イマイチ使いづらい)
・リザレクトライフ(倒れた仲間を復活させるSLGの中でもレアなアビリティ。消費MRは実に100ですが、非常に便利)
・レジストデッド(倒れても復活するが、最大LAの1/4以上のマイナスなら復活不能。こんなのにMRを99も食われても。調整の可能性あり)
・手斧(POW依存のごく普通の攻撃アビリティ)
・ディメンジョン(回復も含め全アビリティを回避する)
・サクリファイス(自分の全LAとMRをささげて倒れた仲間を復活させ、LAとMRを完全回復)
・蒼流希虹剣(デストラクションに匹敵する最強剣技。しかも無属性。追加効果も文句なしで、使い道は多い。唯一の欠点は、使用後のスキが大きい点)
・命運大風車(いわゆるFortuneのカード。基礎威力は普通の騎士剣と大差ないが、やたらダメージがバラける)
・名称未定義剣(いい名前を募集しています。物理・火・水・雷・土・風の属性を持つ高威力の範囲剣技。反動が地味に困る)

 などがあります。特にリザレクトライフは革命的な魔法です。

 先の選挙以来、小泉内閣が何にも増して嫌いになった私。以前からの「サプライズ」にしても、劇場型選挙にしても、この程度のものにサプライズを感じるなど、日本人はよっぽど予想外のできごとに耐性がないのでしょう。こちらは予想外の原因不明バグがゴロゴロ出てきて困ったりするというのに、あの程度でサプライズとは能天気なものです。
 といっても、評価すべきところはしっかり評価するのが私のモットーです。今回の決定については、小泉サイドにエールを送りたいところです。
 以前から問題とされていた「被害者名の匿名発表」について、犯罪被害者等基本計画で「被害者が希望すれば実名発表、そうでなければ実名を発表しない」ことを決めたとのこと。紆余曲折もありましたが、最終的には私が主張していたのとほとんど同じ案になりました。これで犯罪被害者も少しは救済されるようになるでしょう。素晴らしいことです。
 何といっても、日本新聞協会及び民放連の再三の圧力に屈しなかったのは大きいです。最近は「節度のある取材を申し合わせ」しているそうですが、あんなもの所詮は「申し合わせたスクラム」に過ぎません。自主的取り組みで何とかなるのなら、そもそも匿名発表なる議論自体、発生する必要がありません。「節度ある取材」などのアリバイ作りはたくさんです。
 こちらも私が以前から主張していた点ですが、「被害者が希望すれば実名発表」とした点も評価します。日本の警察はFBI捜査官も認めるほどの実力を持っていますが、中には被害者の再三の訴えにも耳を貸さずストーカー殺人を生んだ挙句、文書を偽造してまで言い逃れを続けたり、Winnyの作者を逮捕したりと、「ださいたま県警」や「京都腐警」のようなのも残念ながら存在します。被害者が実名発表の有無を選べれば、これにもある程度対処できます。
 マスコミのスクラムの実態には目を覆うばかりですが、最近の例でいえば姉歯元建築士。確かにこの人は「加害者」です。建築士免許も取り消され、今後何らかの罰も下る可能性があります。しかし、相手が悪人だからと徹底的に叩き続ける報道をしていいという法律や倫理などありません。それで浅田農産の2人を殺しておいて、懲りない連中です。全く許せません。
 確かに、「真相究明はジャーナリズムの役目」というのは理解しますが、姉歯氏の周りに詰め掛けて自宅に入るのを妨害すると真相が究明されるとでも?私はジャーナリストを見くびっていました。どうやら彼らは「加害者や被害者宅の玄関先に詰め掛けたり、人の出入りを邪魔すれば、事件の真相が分かる」という超能力が使えるようです。繰り返しますが、相手が加害者だからといってスクラムしても構わないわけではありません
 加害者本人についてはある程度自業自得の部分があるとしても、加害者の周囲にスクラムする動きも目立ちます。加害者の文集や作文を引っ張り出してきたり、元同級生だの近所の人だのにマイクを向けたり、最後には家族などを追い立てる始末。日本では「あれは本人の問題。私達には関係ない」と正論を吐くだけで非国民扱いされることを知ってやっているのでしょう。
 このように、加害者サイドへのスクラムも深刻です。被害者でさえスクラムにはほとほと困り果てているというのに、加害者がそれを拒否しようものなら、世論には「開き直り」扱いされてしまうのです。浅田農産の例でも、仮に夫婦が死ぬ寸前まで追いやられたところで、マスコミに対して「取材を自粛して」と懇願していたとしたら、自殺せずに済んだでしょうか。マスコミは確実に「夫婦が取材拒否」のような報じ方をして、世論の圧力を誘導、結局は同じ道をたどることになっていたでしょう。政府には加害者サイドへのスクラム防止策も求めたいところです。
 私は今回の政府決定を高く評価します。これで少しは「被害者は2度死ぬ」状況を回避できれば、これほど良いことはありません。マスコミの行動については、私が再三新しい報道年表をつくる会及び新しい報道被害年表で申し上げている通りです。マスコミは政府に自分らの案が蹴られたということで、きっと今度は世論を扇動して味方につけようとしてくるでしょうが、だまされてはいけません。もちろんマスコミの側を支持するのも自由ですが、支持する前にしっかり上の年表をお読みになり、マスコミが隠蔽している「裏」を理解した上で、それでも支持できるのであれば支持してください。少なくとも「匿名発表に切り替えられても当然のようなことをしている」と、私は考えます。

 Wrapper、Listenerと来れば、やはりお次は「Filter」でしょう。TomcatのServletサンプルの中にフィルタのものもありましたので、それを見ながら作ってみることにします。
 フィルタを使う際にまず必要なものといえば、Filterインタフェースのインプリメントです。というわけで、今回は「FirstFilter」「SecondFilter」の2つのクラスを作って必要なメソッドを実装、フィルタなどが呼ばれたことが分かるように、例によってinit、doFilter、destroyなどの際にSQLにデータを登録するようにしました。
// テーブル構造
CREATE TABLE filterlog
(name VARCHAR(32) , message VARCHAR(32) , times DATETIME);
 次いで、XMLの配備記述子です。今回はリスナは使わないため、前に扱ったリスナの記述をコメントアウトし、その部分に以下の記述を行ってみました。なお、XMLには記述順があるため、決してservletタグの下に記述しないようにしましょう
<filter>
	<filter-name>First</filter-name>
	<filter-class>FirstFilter</filter-class>
</filter>

<filter>
	<filter-name>Second</filter-name>
	<filter-class>SecondFilter</filter-class>
</filter>
 サンプルの見よう見まねですが、とりあえずfilter-nameがフィルタの名前、filter-classがクラス名ということになっているのは分かります。正直、XMLはどうにもなじめないのですが。次世代の記述方式にしてはムダが多すぎますし。ともかく、これでXMLの準備は整いました。早速適当なServletを表示して、SQLのデータを取り出してみました。その結果、
init	First
init	Second
 とりあえずinitは呼ばれていますが、initは最初に1度だけ呼び出され、後は何度ページをリロードしてもコールされません。doFilterがどういうわけか呼ばれないのです。全く困ったものです。どうすれば良いのでしょうか。しばらくサンプルのXMLを読み込んだ末、上記の文の下に以下のような記述を行ってみました。
<filter-mapping>
	<filter-name>First</filter-name>
	<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
 filter-nameにはフィルタの名前、url-patternにはこのフィルタを適用するURLパターンを書くようです。結果、これで正解でした。しっかりフィルタが呼ばれます。
 さて、これでフィルタが呼べるようになったは良いのですが、FilterインタフェースではinitでのみFilterConfigのオブジェクトが渡され、doFilter()ではServletRequest及びServletResponse、FilterChainしか得られませんし、destroyにいたっては引数すらもらえません。FilterConfigにはフィルタの名前などが格納されているのですが、それではdoFilter()やdestroy()ではフィルタ名などFilterConfigの内容が得られないのでしょうか。
 1度Servletが呼ばれると、それが破棄されるまでFilterConfigの内容が変わることはないわけですから、以下のような手段が使えるようです。
FilterConfig config;
public void init(FilterConfig fc) throws ServletException{
	config = fc;
}
public void doFilter/*...*/{
	config.getFilterName();	// フィルタ名取得
}
public void destroy/*...*/{
	config.getServletContext();	// ServletContext取得
}
 ここまで分かれば色々やりたくなるのが人情というものです。フィルタにはXML側からパラメータが渡せるらしいので、少しばかり実験してみます。まずはXMLの<filter>〜</filter>の部分を以下のように改変し、
<filter-mapping>
	<filter-name>First</filter-name>
	<url-pattern>/servlet/*</url-pattern>
	<init-param>
		<param-name>param</param-name>
		<param-value>value</param-value>
	</init-param>
</filter-mapping>
 その後でFilterConfigから以下のように呼び出してやると、
public void init(FilterConfig fc) throws ServletException{
	String parameter = fc.getInitParameter("param");
}
 実際にはparameterの値をSQLに格納して調べてみたのですが、しっかり「value」が渡っていました。
 そういえば、doFilter()内では決まり文句のように「FilterChain.doFilter(...)」が使われていますが、これは「制御を次のフィルタに移す」記述です。そういうわけで、ここでServletRequestにsetAttributeで値をセットしてやれば、次のフィルタではその値を取得することができますし、Wrapperを使ってラップすることもできます。さらに、FilterChain.doFilter()を呼び出さなければその時点でリクエストが止まります。つまり、そのフィルタ以降のフィルタ処理やページの表示は行われません。
 XMLではそれぞれのフィルタに対するマッピングも決められるようですから、まず以下のようなマッピングをしてみました。
<!-- web.xml Mapping -->
<filter-mapping>
	<filter-name>Second</filter-name>
	<url-pattern>/servlet/HelloWorld/*</url-pattern>
</filter-mapping>
 これで、以前に作ったServletである「HelloWorld」を呼び出した場合にのみSecondフィルタが適用されるようになります。で、SecondFilterクラスのdoFilterでは
public void doFilter(ServletRequest request ,
	ServletResponse response , FilterChain chain)
	throws ServletException , IOException{
	if(response instanceof HttpServletResponse){
		((HttpServletResponse)response).sendRedirect
		("/examples/servlet/DataSample/sara.gif");
	}
}
 といった実装を行いました。この際、注意したいのがweb.xmlでのマッピングで、うっかりServletすべてにマップすると、リダイレクト先のDataSample/sara.gifに飛ばされた際にもdoFilterが呼ばれてしまい、永久にリダイレクトすることになります。「/servlet/*」ではそういう目にあいますから、今回は「/servlet/HelloWorld/*」をマップしました。
 後は「/examples/servlet/HelloWorld」にアクセスしてやると、doFilterでFilterChain.doFilterを呼び出していないため、そこでFilterChainのチェーンは寸断され、代わりに「DataSample/sara.gif」、すなわち以前に作ったMySQLのBLOBからデータを読み込むServletが実行され、MySQLの「sara.gif」のレコードにアクセスし、格納されたサーラさんの画像を引っ張ってきてくれるというわけです。
 はっきり言って、今回のように何かページを表示したいのにサーラさんの画像にリダイレクトされるというのは嫌がらせ以外の何者でもありませんが、例えば正しくないURLへのアクセス時にエラーページにリダイレクトしたり、エラーメッセージを出したり、ServletRequestのgetParameterを使ってパラメータの正当性をチェックしたり、URLによってページヘッダの内容を変えたりと、用途は多彩です。
 ただ、用途は多彩と言いながら、web.xmlは変更をリアルタイムに反映してくれないため、後からの拡張がやりづらく、できればあまり扱いたくないというのが本音ではあります。web.xmlまでオートアップデートしてくれれば非常に助かったのですが。
 FilterやListenerといった動作は隠蔽されていますから、適当なWebサイトで使われていても、ユーザーにその処理は見えません。これは長所ではあるのですが、隠蔽されているだけに、技術者集会の出し物にはできないのでありました。
カテゴリ [開発魔法][社会問題][ゲーム開発] [トラックバック 0][コメント 0]

越境ガッコウ
2005/12/19(Mon)20:06:55
 本日はSQLを用いて少々実験を。例えばMySQLで掲示板を作るような状況を考えた場合、BLOBを用意しておけばファイルまでテーブルに格納できてとても便利です(ファイルを取り出したりまとめて保存したりするのは少しアレですが)。画像を表示する場合、データベースから画像を取り出して出力するコードが必要ですが、Perlで数十個も画像を表示するとすさまじい起動回数が必要になり、サーバー負荷と待ち時間がバカになりません。永続的接続でも使わない限り、データベースコネクトのオーバーヘッドは回避できませんが、この場合はServletが最も無難です。
 さて、MySQLは単純にレコードを入れたり見たり消したりするだけならロックは不要(データベース側で処理)ですし、デッドロックフリーですが、問題はデータを読んでからそれを変更して登録したり、読んだデータによって分岐を変えたりするような場合です。前者の場合、状況次第ではUPDATE文にまとめることができますが、できない場合もあります。
 そういう時はロックをこちらでも実装してやらなければなりませんが、それではどのように実装するのか。以前に扱ったものとしては「トランザクション」と「ロック」がありましたが、ここではデータを取り出してそれを加算してINSERTするものをサンプルとしてみます。
// テーブルの概要
CREATE TABLE test(count INT);
INSERT INTO test VALUES(0);

// InnoDB
BEGIN;
SELECT count INTO @var FROM test ORDER BY count DESC LIMIT 1 FOR UPDATE;
INSERT INTO test VALUES(@var);
COMMIT;

// or MyISAM
LOCK TABLES test WRITE;
SELECT count INTO @var FROM test ORDER BY count DESC LIMIT 1;
INSERT INTO test VALUES(@var);
UNLOCK TABLES;
 とまあ、トランザクションセーフならそちらの方が楽ではあります。しかし、問題はここからです。JavaのSQLコネクタにはトランザクション機構がありますが、果たしてこれはDB側のトランザクションに干渉するのでしょうか。仮にしないのだとしたら、データを読んで更新する間に他のスレッドが割り込んでくる危険が大いにあります。
 そういうわけで準備したのがこのJSP。
// table
CREATE TABLE javacommit(number INT);

// JSP
// Connection : c
c.setAutoCommit(false);
Statement s = c.createStatement();
s.execute("SELECT number FROM javacommit FOR UPDATE");
s.execute("INSERT INTO javacommit VALUES(100)");

long time = new Date().getTime();
while(time + 30*1000 > new Date().getTime())
	;	// 30秒のウェイト

c.rollback();
s.close();
 で、まずMySQLのコンソールを起動しておいて、このプログラムを書いたJSPを適当なブラウザで読ませ、それから30秒以内にMySQLのコンソール側で
BEGIN;
INSERT INTO javacommit VALUES(0);
 など適当なSQL文を打ちます。30秒もあればこれだけ打つのは余裕でしょう。結果、しっかりウェイトがかかりました。どうやら内部的にトランザクションしているようです。ついでにMySQLのコンソール側で以下のように打って
ALTER TABLE javacommit ENGINE=MyISAM;
 再び同じJSPを実行してみたところ、ロックもされませんし、c.rollback()したはずなのにデータが登録されています。内部的にトランザクションを呼んでいること間違いなしです。
 本当はこのサイトのリンクとアクセス元スクリプトもMySQLに置き換えたいのですが、サーバー提供のMySQLが旧バージョンのため、どうにも手を出せないのが現状です。上位アクセス元を表示する際、現行のPerlでは集計を行ってソートしているのですが、これが「SELECT url , COUNT(url) AS 'counts' FROM tablename GROUP BY url ORDER BY counts DESC」一本で行えるのは非常に魅力的ではあります。

 この前はServletで、さらにこの前はPHPで作ってみたMySQLへのファイル登録/読み出しスクリプト。それならPerl DBIでもできないものかと試してみました。
 まずBLOBデータからの読み込みですが、これはこの上なく簡単でした。以前にサーラさんをDBに登録しましたので、それを読んでみます。
# datatable(name VARCHAR(255) , data MEDIUMBLOB ,
# PRIMARY KEY(name));

binmode(STDOUT);
$cmd = $db->prepare("SELECT data FROM datatable WHERE name = ? LIMIT 1");
$cmd->execute("sara.gif");
local(@data) = $cmd->fetchrow_array;
print $data[0];
$cmd->finish;
 読み出しているデータはGIFのはずですが、コンテンツタイプヘッダはtext/htmlでも動きました。ただ、指定しなければエラーになります。
 次にやってみたのがデータの登録です。cgi-lib.plを引っ張ってきてアップローダにしても良いのですが、今回は指定ファイルを取り込む形式にしました。しかし、これがまたPHPのようにはいかなかったのです。
# face_3.gif : Tactical Revolution ハードゥンのフェイス
open(LOAD , "face_3.gif") || exit;
binmode(LOAD);
local($data) = "";
foreach(){
	$data .= $_;
}
close(LOAD);

$cmd = $db->prepare("INSERT INTO datatable VALUES(? , ?)");
$cmd->execute("harden.gif" , $db->quote($data));
 手抜きですが、こんなところで。しかし、これが正しく動作しないのです。明らかにバイナリを無理やりテキストで開いた状態の、おかしな文字列が登録されてしまいます。で、解決策ですが、実は
$cmd->execute("harden.gif" , $data);
 これだけです。quoteはバイナリデータに対応しておらず、プレースホルダはバイナリデータを登録できるらしいのです。つまり、わざわざエスケープなど考えず、データを格納した変数を直書きすればよかったわけです。
 そういうわけで、do文ではバイナリデータを登録できません。説明するまでもありませんが、念のため。

 昨日は代理母、本日は学校選択制のお話。
 現行の学校選択制度の場合、いくつかの学校から好きな学校を選ぶことができるようになっていますが、どうも学校の側も児童を取られたくないわけですから、消極的です。結果として本人や保護者には何も通知されず、未だに決まった学校以外に行くには転居しかないと考えている人が多いありさま。
 今回、マンションの耐震偽装で住人が危険なマンションを追い出されてしまいましたが、そこで問題なのが学校です。近くに転居したわけですから、会社は転勤や転職、ということはないのでしょうが、学校はそうはいきません。5メートルもずれるだけで境界が変わり、全く別の校区領域になってしまったりします。
 そこで問題になっているのが、偽装マンションに住んでいた子どもの「越境通学か転校か」の選択です。この場合は特殊な事情ですから、越境も認められるのでしょうが、前の学校が遠いとなれば、難しいところではあります。ただ、越境については一般の人にはほとんど認められていないのが実情です。
 さて、以前から学校選択制に賛成していた私ですが、越境の許可にも強く賛成します。できれば越境も全面的に許可して、学校選択制に幅を持たせた上で、制度の周知を図るべきでしょう。学校を変えるのが当たり前のような社会になれば、多くの学校を渡り歩くことで、子どもは様々な友人と出会ったり、経験を深めることができます。
 越境については、私が小学校のころは電車通学で、しかも非義務の学校や会社は自分で選べますが、小学校には(特に当時は)選択権がありませんから、家が近い人とは極めて大きな落差があり、理不尽さに憤慨したものです。昔話はいいとして、同じ電車通学の中にも駅から遠い人はいたものです。
 当時はこれで良かったのでしょうが、今は子どもが夜道をたらたら歩いていたらあっという間に殺されます。しかも理不尽なことに、実はわざわざ電車で学校に行かなくても、そこから大人の足で5分程度の位置に学校があるのです(私の場合もその学校まで歩いて15分前後なのに電車通学で40分)。それが「市が違う」という理由で、延々電車通学というわけです。
 電車通学は登下校にも時間がかかる上、電車の時間によっては冬などは非常に暗くなり、大変危険です。しかも小学校は自転車も使えません。この現代社会に子どもに不必要な夜道を歩かせる必要などありません。この場合、理由も「通学による子どもの負担を軽減し、往復時の危険を防止する」と、極めて合理的です。越境は認められてしかるべきです。
 それに対して抵抗する関係者がいるから、いつまで経っても認められないのでしょうが、理解に苦しみます。昨日の繰り返しですが、こんな風だから少子化が改善しないのです。こういう細かいところからしっかり整備していかなければ、少子化は永久に改善しないでしょう。
 学校といえば、福岡のとある中学校で当時の召集令状のコピーを配布し、そのプリントの裏で「あなたは戦争に行きますか?」という問いに答えさせ、行くまたは行かない理由を書かせたとのこと。ここまでは授業の一環としてあり得る話です。
 ところが、ある生徒がこれに「行かない」、理由として「怖いし、人を殺したくない」と答えたところ、そのプリントに「非国民」とだけ書いて返却されたそうです。とんでもない話ではありませんか。このような問題が出されたら、私でも「行かない」と答えるでしょう(理由は「戦争で必死に戦っても、その分戦争が長引いて民間人ばかりが多く死に、指導者を延命させるだけだから」)。それを「非国民」とは。
 こういう時に「教師が不適格だ。近くの他地区学校に越境入学させて」というわけにはいかないものでしょうか。

 ブログを見ている方は得をする。Tactical Revolutionの新ステージについて、私がテストプレイを繰り返した限りで編み出した戦略を記しておきます。参加者の方は技術者集会で、そうでない方はリリース後(いつになることやら)にお試しください。技術者集会なり何なりで「勝てない」と苦情が来た時に、ポンとこの記事のURLを貼ればいい、という考えもありますが。
 まず敵のデュアルナイトですが、蒼流希虹剣が極めて厄介です。イリアスやサーラがLA満タンなら何とかなりますが、そうでない限り一発も受けるとほぼ即死です。幸い、デュアルナイトの行動順は最後であり、技のレンジも1-1ですから、他の敵に囲まれていれば使われることはありません。ただし、受けるとひたすら痛い上、タイミングが悪いと水脈の向こうへ左遷されるハメになります(このステージとは関係ありませんが、アンデッドのステージをテストプレイ中、最大LAが800台しかないハードゥンがこの技で1000オーバーのダメージを受けて即死、敗北しました)。
 これを回避する方法としては、使われづらい位置取りをするのは重要ではありますが、このデュアルナイトは「名称未定義剣」や「波動諷詠剣」のような厄介な技も持っています。ということで、こちらが水脈の向こうにお送りしてあげると2ターンほど時間稼ぎができます。この手はなかなかおすすめです。
 後は何といっても範囲が広い攻撃を使うことです。とにかく多くのキャラにダメージを与えれば、合計ダメージ量は激増します。「エクスクルージョン」「インクルージョン」ともに有効です。サーラさんの「名称未定義剣」も数値の面ではかなり優秀ではありますが、これははっきり言っておすすめできません。使うなら8ターン目や9ターン目など、倒されてもさほど支障のない時期にしましょう。
 その他、水中移動特性を持つキャラを水脈の向こうに退避させ、遠距離攻撃でチクチク削るのも時には効果的です。ただし、全員が逃げたところで改良したCPUは水脈を迂回して近づいてきますし、水中移動できないキャラをオトリに残すにしても、LAが0以下になると攻撃が回避できません。つまり、生存者を攻撃されるよりも総ダメージ数は多くなります。しかも生存者の場合はカウンターで埋め合わせができますが、LAが0以下ならカウンターもできません。オトリ作戦は状況を見てからにしましょう。
 アビリティの中では、獄死乱血剣や名称未定義剣は強力な反動があり、インクルージョンは仲間をも巻き込みます。反動などのダメージもポイントに加算されてしまうため、非効率的な使い方をしないようにしましょう。毒のダメージ、自然回復などはポイントに加算されません。回復の場合はポイントを少しだけ減らしてくれますが、本当に少しだけですから、回復する必要もないのに回復するなら、攻撃した方が合理的です。ただしLAが0以下になるようではただでさえ少ない戦力がさらに少なくなってしまうため、必要な回復は行いましょう。
 言うまでもなく、戦略はこれだけとは限りません。作者の私でも予想だにしないような戦略が出ることが、クリエイターの楽しみでもあります。
カテゴリ [開発魔法][社会問題][ゲーム開発] [トラックバック 0][コメント 0]

お上の領域
2005/12/18(Sun)20:41:17
 本日はTactical Revolution三昧です。といってもゲームを楽しんだわけではなく、ソースやコンソールとにらめっこです。バグがボロボロ出てくるのですから始末におえません。
 そんなこんなで、技術者集会用にさらに新ステージを作成しました。概要をざっと説明しますと、今回は敵味方全員がLAが0になっても消滅しません。つまり、全滅による勝利やゲームオーバーはありません。ではどのようにして勝敗を決めるのか。決められたターン以内により多くのダメージを与えた方が勝ちなのです。
 敵味方の規模としては、こちらは3人です。対する相手は(今のところ)11人です(しかもサラサーラ付属)。そんなのムチャだと言うなかれ、確かに11人を3人で相手にするのは到底有利とはいえませんが、今回の勝敗が「与えたダメージ数」であることを忘れてはいけません。魔法で3人に100ずつダメージを与えれば300ですが、11人に与えれば1100です。
 私の作るゲームだけに、難易度やゲームバランスはまずまずの辺りに設定してあります。例えばLAをゼロにされた場合、アンデッド属性を持っているため消えはしませんが、その分戦力が少なくなってしまう上、気絶者は回避率が0%になるため、大剣などの攻撃も避けることができなくなってしまいます。すなわちダメージを加算されやすくなります。特に魔道士イリアスのLAが0以下になったら最悪です。その後に復活してもMRは0になってしまいます。
 なお、今回はアンデッドの回復属性耐性を0に設定していませんので、敵も味方も回復魔法が有効です。例えばLAがマイナスになってしまっても、回復魔法でLAを0以上にすれば、そのターンこそ動くことはできませんが、相手のフェイズには攻撃を回避したり反撃をすることができます。このように、LA管理はかなり重要です。
 その代わり、アビリティには良いものをそろえました。例を挙げれば、

魔道士イリアス : ルイネッドワールド・ヘブンディサイジョン・インクルージョン・エクスクルージョン・デストラクション・ディメンジョン...
騎士サーラ : 蒼流希虹剣・名称未定義剣(仮)・波動諷詠剣・弓矢・カウンター...
剣聖ハードゥン : 獄死乱血剣・豪剣・連牙剣・飛襲連斬・カウンター...

 といったところです。今回はLAが0になっても消えないということで、復活魔法のリザレクトライフ、サクリファイス、レジストデッドは意味を成しません。それから、強力な技は代償も大きいですから、うっかり使って後で泣きを見ないようにしましょう。これらの中では最強剣技・蒼流希虹剣がイチオシです。うまく使えば厄介な敵を追い払うこともできます。騎士の花形であるサーラさんにぜひとも使わせてあげたいところです。
 新ステージ、新アビリティともに技術者集会で公開しますから、参加される方はそこで勝利を目指してみてください。

 JavaにはClassというクラスがあります。今まで使い方がさっぱり分からなかったのですが、そのためのAPIライブラリです。しばらく読み込み、早速使ってみました。
 その経緯ですが、Tactical RevolutionのDividedモードでは「SampleBattle? extends Battle」といった具合にクラス名を統一しており、?部分には一意の番号が入ります。今まではこれをswitchで処理してFieldDrawのオブジェクトに代入していたのですが、その結果、
// fd : FieldDraw Object
// SampleBattle? extends Battle extends FieldDraw
case 2:
	fd = new SampleBattle2();
	break;
case 3:
	fd = new SampleBattle3();
	break;
// ... 〜SampleBattle21
 延々とこれの繰り返しです。いい加減嫌になります。PerlやPHPならevalを用いればごく容易な作業なのですが、Javaではそうはいきません。そこで行き着いたのが、以前にMySQLのクラスロードで用いた「Class」クラスというわけです。使い方に確証は持てなかったのですが、とりあえず
// number : SampleBattle Stage
String name = "SampleBattle" + number;
fd = (FieldDraw)Class.forName(name).newInstance();
 としてみたところ、何と動作してしまいました。状況次第で使えそうです。
 次は、先日少しばかり触れてみた「ラッパー」についても扱ってみようと考えました。といっても、データは通常setAttributeで受け渡せますから、別にそこまで使う機会はなさそうですが、試せるものは試してみなければ。
 HttpServletRequestWrapper、HttpServletResponseWrapperともにすべてのメソッドをラッパーできます。それから、「Wrapperを経由せずにそのままリクエストやレスポンスを継承できないものか」と考えてもみましたが、あろうことか両者はインタフェースです。Wrapperを使わなくても実装はできるでしょうが、そのたびに全メソッドを実装して、さらに使わないメソッドに対してはデフォルトの処理を適用してやるのは、死ぬほど大変です。
 Wrapperの場合はクラスですから、使いたければこれらを拡張して、必要なものに関してのみオーバーライドするだけです。今回はテスト用にこのようなクラスを作ってみました。
class WrappedRequest extends HttpServletRequestWrapper{
	public WrappedRequest(HttpServletRequest req){
		super(req);
	}
	public String getPathInfo(){
		return "ラップされています";
	}
}
 これでgetPathInfo()が独自のものに作り変えられたわけですが、Wrapperには「リクエストにまたがって利用できる」特性があります。つまり、Wrapperを継承したクラスのオブジェクトをリダイレクトまたはインクルード先に渡した場合、受け取り側のSerlvetやJSPはラップされたHttpServletRequestまたはResponseを受け取ることになります。
java.io.PrintWriter os = response.getWriter();
os.println(request.getPathInfo());
if(request.getPathInfo() == null){
	String name = 自身(このサーブレット)のアドレス;
	RequestDispatcher rd = request.getRequestDispatcher(name);
	rd.include(new WrappedRequest(request) , response);
}
 この場合、拡張パス情報をつけずにServletを表示すると、まず「null」が表示され、その後に「ラップされています」が表示されます。ここでは自身をインクルードしていますが、インクルード先の自身のrequest.getPathInfo()では、インクルード元でラップしたメソッドがコールされ、結果として文字列が表示されることになります。
 これはJSPでのコードですが、変数名などを合わせれば普通のServletでも使えるでしょう。この実験までもをJSPで行う私も私ですが。
 さて、お次はweb.xmlを使うため、本当にServletを使うとしましょうか。別にJSPでもweb.xmlは使えなくもないようですが、JSP全体に適用されてしまうのでは非合理的ですから。
 今回の実験は「リスナ」です。Servletにはいくつかのリスナが存在しますが、その多くは「配備記述子」なるものをweb.xmlに登録しなければ使えないそうです。では配備記述子とは一体どういうもので、何を登録すれば動くのか。日米のGoogle及びSunやApache Jakartaのサイトなどを散々駆けずり回って調べた挙句、実はJava Servletのサンプルにあることが判明。灯台もと暗しとはこのことです。
 方法は意外とお手軽で、まずリスナのインタフェース(今回はServletContextListener , HttpSessionListenerを使用)をインプリメントしたクラスを作り、メソッド内で処理を記述します。今回はコンテナが作成・破棄された時にSQLのテーブル(CREATE TABLE contextlog(message VARCHAR(32) , context VARCHAR(32) , times DATATIME))にそれを表す文字列とサーブレット名のデータを登録、またセッションが作られたり破棄された時にはSQLに文字列とプロセスIDを登録するようにしておきました。
 今回はこれらの処理を実装した「ContextListenerClass」というクラスを作成しました。で、肝心の呼び出し方なのですが、web.xmlのweb-app内、servletタグの前の部分に
<listener>
<listener-class>ContextListenerClass</listener-class>
</listener>
 のように記述するだけです。今回のように2つ以上のリスナをインプリメントしたクラスも呼ぶことができますし、それぞれ別のクラスを呼びたい場合には、上の文字を繰り返し記述すればOKです。これらは単にlistener内に記述するだけでよく、「HttpSessionListenerの場合はこのクラス」のような指定はしなくて良いようです。何らかのディレクトリの下に当該クラスが置いてある場合には、「dirname.classname」と指定するようです。
 HttpSessionListenerは少々特殊らしく、とにかく新しいセッションが開始されたらsessionCreatedを呼び出すようになっているようで、クッキーを無効にして繰り返しリロードすると何度もコールされるのですが、invalidを実行してもTomcatを落としてもsessionDestroyedはコールされず、Tomcatを再起動してページを再読み込みしてみても、クッキーにセッションが記録されている状況ではsessionCreatedは呼ばれませんでした。
SELECT message , LEFT(context , 16) AS 'context' FROM contextlog;

Destroyed	Servlet Examples
SessionCreated	5516207BE120ABE5
SessionCreated	8ACC7A009CD08E45
SessionCreated	BEE860B4719A1167
Initialize	Servlet Examples
Destroyed	Servlet Examples
Initialize	Servlet Examples
SessionCreated 	E9D97A6D2F95F37D
 これが配備記述子及びリスナの使い方です。さて、どう使ったものでしょうか。

 以前に代理母裁判問題なども扱った当ブログですが、今回は産婦人科学会が「着床前診断をどうするか」ということでモメているご様子。今回は「習慣流産にこれを認めるか」ということで議論がなされているようですが、その他の事例についてもこれを認めるかどうか、それが難しいところです。「生命の選別につながる」というのが主な反対論です。
 実際のところ、世の中の倫理なるものは時代によって変わりますから、学者だけで議論せず国民的合意を取り付けるべきでしょう。極端な話、時代によって人殺しが善になったり悪になったりするのです。今では当たり前の人工授精さえ、倫理上の問題から眉をひそめられた時代もありました。こうした問題には国民の倫理観をそのまま適用すべきです。
 言うまでもなく、ボールを投げられた国民の側は「神の領域」などと称して逃げてはいけません。そもそも神など人間が作り出した概念であり、技術的にこうしたことが可能ということは人間はその「神の領域」とやらに達しているわけですから、賛成にしろ反対にしろ明確な理由付けが必要です。何でもかんでも「神の領域」で片付けている間に技術がどんどん先行し、研究者だけで新しいことがバンバン決められていく、といった状況の方が悪夢ではありませんか。
 さて、私は「習慣流産防止のための着床前診断」については支持に近いです。習慣流産の母体への莫大な負担を防止できますし、10回も生命が流産して消えてしまうのと、1回の着床前診断で無事に出産することをはかりにかければ、後者の方が重いと判断します。
 逆に私が最も気に入らないのは、自分は五体満足のくせに「どうして自分の遺伝子にこだわるんだか。養子でももらえばいい。反対だ」と称する輩です。同じ立場の人がそれを言うなら説得力がありますが、無関係な人間がこれを言うなど、先天的または後天的に腕がなかったり目が見えなかったりする人に「お前は腕がない(目が見えない)のだからひっこんでいろ」と怒鳴りつけるも同じです。学会は様々な意見を尊重すべきですが、こういう意見にだけは耳を貸す必要は全くありません。
 それでは、例えば障害の選別についてはどうか。ナチスが障害児の中絶を推奨していたり、ハンセン病患者の方が断種を受けた、といった話を聞くと、軽々しく賛成や反対とは言えませんが、こればかりは「親の側の意思に任せるべき」というのが私の答えです。
 例えば両親の片方が遺伝病のような場合、着床前診断を行わず、後で障害が分かって中絶する、といった経緯の方がよっぽど悲惨ですし、それが元で虐待死事件が起きた、のようなことになった方が着床前診断よりも何倍も不憫です。「障害があっても気にしない」という人が親の場合は診断の必要はありませんし、そうでない場合は診断を行った方が良い結果を生むでしょう。だから「本人の意思で判断すべき」なのです。
 代理母裁判についても、非嫡出子問題についても、日本がどれほどひどい国かをまざまざと知らされました。日本で代理母なりクローンなりを禁止するのは勝手ですが、それが実際に行われた時に子どもに不利益を与えるなど、とんでもない話です。親の行為が不適切であったとしても、司法が罪のない子どもにツケを負わせるなど、日本は「民主的な北朝鮮」なのでは。これだから少子化も改善しないのです。

 今年も色々ありましたが、今年ほど私の中で様々なものへの評価がくっきり分かれたことはありません。年鑑もかねて、少しばかり列挙しておきます。

今年の評価でプラスに分類されるもの

・JR
 人をバカにした休日ボウリング報道にもめげず、親切な対応を行う職員がほとんどです。

・毎日新聞
 奈良の女児殺害、広島の女児殺害などで報道被害を訴えているコメントの全文を掲載。

・Java Servlet
 使ってみると意外に便利。なかなかでした。

・ブログ
 この戦記もブログですし。相当便利です。使って分かるこの快適さ。周囲のブログ人口の増加を願います。トラックバックも積極的に使用して、または受けていきたいです。

・サイトのご来訪者様など私と関係のある皆々様
 説明は不要でしょう。アクセス自体はそう多いとはいえませんが、ゲームを「楽しい」と評価してくださる方もちらほら増えています。ありがたい限りです。

マイナスに分類されるもの

・ライブドア
 フジさん、本当にパックマン・ディフェンスを仕掛けてやった方が良かったのでは。どうしようもないです、特に社長が。「少し頭のいい人なら議員なんて絶対ならない」。まあ、なれなかったわけですが

・村上ファンド
 日本版ハゲタカファンド。

・毎日新聞
 2重ノミネートです。「報道の公益性」なる存在もしないものを主張し、自己保身を図る。おそらくこれを主張しているのは無能な論説委員どもなのでしょうが、そいつらが目立つせいで良いところ(報道批判のコメントも堂々と掲載したり、ただ1社だけ米国牛輸入に途中まで反対するなど)まで打ち消されてしまいます。

・自民党
 一連の低IQ層問題、そして人をバカにしたような刺客やマドンナ。正々堂々と選挙を行うのなら私は自民党を嫌う必要はありませんが、ああいうのは絶対に許せません。幻滅しました。私は今年で自民党が大嫌いになりました。

・ソニー
 米ソニーBMGが「違法コピー防止」と称してウィルス(ウィルス対策ソフトのベンダ公認)をバラまく。さらに再生クライアントの情報をインターネット経由でソニーの側に送信。しかもこれが明るみに出た後、あわてて提供したアンインストールツールには大きなセキュリティホールが。米国の話ですが、他人事ではありません。ソニーの音楽CDは絶対に買わないことを強く推奨します。

・エイベックス
 のまネコ騒動で。私は2chが嫌いですが、エイベックスはもっと嫌いです。

・食品安全委員会
 結局、米国牛の輸入再開は既定路線だった、ということです。こんな機関、別に存在しなくても良いのでは?

 以上、今年も色々ありました。
カテゴリ [開発魔法][社会問題][ゲーム開発] [トラックバック 0][コメント 0]

理想無(りそな)
2005/12/09(Fri)22:33:58
 何やらPHPでもセッションが使えるそうです。しかもクラスオブジェクトも格納できるとのこと。そんなこんなで、少しばかり実験してみます。まず、以下のようなPHPを用意しました。
class Counter{
	var $count;
	var $date;
	function __construct(){	// コンストラクタ
		$count = 0;
		$date = 0;
	}
	function next(){	// 数字を増加
		$this->count ++;
		$this->date = time();
	}
	function getcount(){	// カウントを得る
		return $this->count;
	}
	function getdate(){	// 最終更新日時を得る
		return date("Y/m/d H:i:s" , $this->date);
	}
}

session_start();	// セッション開始
if(!isset($_SESSION["count"]))
	$_SESSION["count"] = new Counter();
$_SESSION["count"]->next();	// カウントアップ

print $_SESSION["count"]->getcount() . "回目の表示です。<br>";
print "最終閲覧 " . $_SESSION["count"]->getdate() . " <br>";
print "<a href=\"?" . SID . "\">Next</a>";
 セッションについてはバージョンごとに使い方がてんでバラバラなのですが、最新のバージョンでは$_SESSION[]が推奨されているようです。以前はセッション名を登録する作業が必要になったようですが、$_SESSION変数を使用する限りその必要はありません。ただ保存が必要なら格納し、読み込みが必要なら取り出せばいいだけです。
 セッションの削除方法には複数通りあり、unset($_SESSION["name"])と打てばその名前のセッションが削除されるそうですが、unset($_SESSION)と全部消そうとするととんでもないことになるそうえす。session_unset()なる関数や、その他様々な制御関数が用意されていますから、こちらを使いましょう。PHPのマニュアルには中途半端な日本語版があるのがありがたいです。
 ちなみにSIDにはセッションのIDが格納されますが、この辺りの仕様はServletと似たり寄ったりで、クッキーが使えない(ユーザー側、もしくはPHPの設定でセッションにクッキーを使わないようにした)場合のみSIDにIDが格納されます。つまり、クッキーにセッション情報を保存できる状態なら、SIDは空になります。
 そういえば、以前に使えず困り果てたconstですが、使い方がかなり特殊なようです。具体的には、
class Sample{
	// 宣言
	const CONSTANT = "value";
}

// 呼び出し
print Self::CONSTANT	// 自分から
print Parent::CONSTANT	// 子クラスから
print Sample::CONSTANT	// どこからでも
 のように、自分のconstを呼び出す場合にもスコープ解決演算子(::)が必要です。それにしても、この辺りの仕様はC++風味ですが、C++の->演算子は「(*pointer).call」とカッコでくくるのが面倒(*より.の方が優先順位が高いためカッコが必要)だから->を使っていたはずなのですが、PHPでは->しか使えないのはどういうわけでしょう。
 その他、PHPはファイルアップロードが簡単にできるようです。Servletでは特殊ライブラリが必要とのことで断念し、Perlではcgi-lib.plをこわごわ扱った私でしたが、PHPの仕様なら簡単に作れそうです。そこで、たいして理由もなくアップロードPHPを作ろうと考えたのですが、単なるアップロードではサンプルコードを丸写しすればいいだけです。ここはMySQLとServletで以前に作った「datatable」テーブルに格納してみることにします。
 まずはフォームをこのような風味で準備して、
<form method="POST" enctype="multipart/form-data" action="?">
MySQLでの管理名 <input type="text" name="name" size="40">
ファイル名 <input type="file" name="file" size="40">
<input type="hidden" name="mode" value="upload">
<input type="submit" value="データを登録">
</form>
 PHP側でそれを受け取ります。別に何もしなくても、勝手に$_FILE配列に情報を格納し、テンポラリディレクトリにファイルを保存してくれているため、それを使って格納するだけです。まずは接続時にお決まりの記述を行って、
mysql_connect("localhost" , "yamicha" , "password");
mysql_select_db("yamicha");
mysql_query("SET NAMES sjis");
 アップロードされたファイルを読み込み、MySQLのBLOBに格納します。$_FILE配列は2次元連想配列になっており、それぞれ["name"]にはローカルでのファイル名、["type"]にはMIMEタイプ、["size"]がサイズ、["tmp_name"]がサーバー上でのテンポラリファイル名、["error"]でエラー番号を受けるそうです(実際にはエラー処理機構もつけていますが、以下では要点だけ)。
$name = $_FILES["file"]["tmp_name"];
$stream = fopen($name , "rb");
$file = fread($stream , $_FILES["file"]["size"]);
fclose($stream);

$name = addslashes($_POST["name"]);
$file = addslashes($file);
mysql_query("REPLACE INTO datatable VALUES('$name' , '$file')")
 ところが、これがどういうわけか動作しないのです。まさに原因不明のバグです。言うまでもなく、散々迷うハメに。しばらくあれこれ考えた挙句、「SET NAMES sjis」に気づきました。新しいバージョンのMySQL固有のこの記述、まさか悪さをしているのでは。ダメもとで
mysql_query("SET NAMES ascii");
mysql_query("REPLACE INTO datatable VALUES('$name' , '$file')")
 としたら、何と動作するではありませんか。何たることでしょう。ServletではOutputStreamでBLOBに書き込んでいたため、この落とし穴には気づかなかったのです。ともかく、これでファイルを転送することができました。
 後は、この前作ったMySQLのBLOBデータを読み出すServletを実行し、拡張パスとして「servlet/DataSample/name.ext」のように登録名を入力するだけです(実際にはこのPHPにデータ照会・削除機能を持たせ、当該ファイルの表示先としてServletのURLにリンクするようにしています。これならデータの表示も削除も簡単です)。
 これも技術者集会の出し物にでも。PHPのアップロードは本当に簡単なのです。

 その次、Tactical RevolutionのDividedモードでさらに1つステージを作ってみました。といっても、こちらはテストステージのようなもので、あまり面白くはありません。それでもこのステージをプレイすればCPUの奥深さが分かるはず。というのも、このステージは迷路になっているのです。
 その迷路に挑むサーラさん。迷路のゴールに当たる部分では、魔道士イリアスが偽サーラに倒されるのも時間の問題、早く助けに行かなければ、という状況です(それはもう、いくらイリアスさんでも、レベル18でレベル56のデュアルナイトを相手にしようというのは無理なわけで)。つまり、サーラさんが実験用マウスのごとく知能を試されるのですが、このサーラさんをCPUが操作するか、プレイヤーが操作するかを選ぶことができるのです。
 前者の場合、CPUの知性が試されます。といっても、このゲームのCPUはそこそこ作り込んであるため、壁越しにゴールを見つめて立ち止まるようなことはありません(世のCPUにはこういうタイプの思考が結構多いです)。しっかり回り道をしてゴールにたどり着きます。つまりCPUサーラは模範解答なのですが、この場合はプレイヤーが魔道士イリアスを操作します。といっても回復魔法を自分にかけることしかできませんが、1手でも間違うと倒されます。
 自分が最強騎士サーラを操作する場合、迷路を抜けなければなりませんが、例によって1手間違うと主君イリアスが倒されます。ここはあえて道を間違って、主君イリアスが倒されることで、CPUの奥深さを噛み締めてもらわなければ。ちなみに「主君」はCPUが操作しますが、プレイヤーが最短距離でゴールに向かっている限り、なんとか生き残るように行動してくれます。こちらもなかなかの思考です。
 それから、この1つ前の「魔道士イリアスの謎かけ」ステージ、背景が流れるエフェクトが存在するのですが、流れるパターンを4つ作りました。ステージに入るたびにランダムで変わります。きっと風向きが毎回違うのでしょう。その内訳は(ここでのベクトルは数学座標、つまり下部がY0であり、上に行くほどYが増えるものとします。スクリーン座標とはY座標の表現が逆転します)、

1.同じ方向(ベクトルはXマイナス、Yプラス方向)に同じスピードで流れる
2.スピードは変わらず、流れる方向が360度切り替わる(X,YともにCOS,SIN。真斜め方向に流れるスピードは、真横に流れるスピードの約0.707倍)
3.Xマイナス、Yプラスのベクトルに対して、COSの三角関数(縦軸がスピード、横軸が経過フレーム)で流れる(COSの三角関数はマイナスもあるため、その場合はベクトルがマイナスになり、逆方向に流れる)
4.固定(流れない)

 このような細かい部分にもご注目あれ。公開は技術者集会にて。

 りそな証券がジェイコム株を61万円で1株売るつもりが、1円で61万株売ってしまった問題。証券会社とはこれほど原始的なのでしょうか。担当者にしても、コンピュータにしても、通常なら

・ジェイコムの公開株式数は1万台。61万株売るなど到底不可能
・自分が持っている以上の株式を売却している
・東証には「ストップ安」の仕組みがあるため、1円で売るのは絶対に不可能

 などの理由により、普通のシステムなら警告を何重にも投げてくる上、担当者も気づかなければおかしいというのに。
 確かに、担当者にも慣れがあったのでしょう。ジェイコムの場合、売買単位は1株のようですが、1単位で61万というのでは投資家を集めづらいですから、株式分割で絶対数を増やして価格を下げて買い求めやすくする場合も多いようです。1株を100万円で売るより、1000株を1000円で売った方が買ってもらいやすくなるわけですから。
 そこで、例えば1株30円程度の株があったとして、これを1万株取引する、ということは現実にあるわけです。こうして大きい単位に見慣れると、こうした場合に気づきにくくなることは十分に考えられますが、それにしても。人為的ミスは完全に防げない以上、システムで防御するしかないはずなのですが。
 私は経済に関しては素人ですから何とも言えませんが、まずは「今の時代もこのようなバカげた間違いが起こる」ことに驚きました。りそなの損失は1千億とも言われていますが、その1社の介在で株式市場がこれほど乱れる、というのも恐ろしいことです。そもそも、株式とは会社の将来性に投資するものとされていたはずですが、ファンドが暗躍して短期間に何百億をかすめ取る現在の株式市場は妙です。といっても、これを究極に突き詰めるのが小泉改革の目的で、国民はそれを選んだわけですから、仕方ありませんが。
 それから、脆弱性といえば、東証がダウンした時のあの株式マヒ。あれにもあきれ果てます。東証がダウンすると同時に福証と札証もダウンとはいかがなものか。それでは、例えばシステムトラブル、テロ、大地震など災害、その他の理由で東証が壊滅したらどうするのでしょうか。
 米国では、様々な証券取引所が競い合っているといいますが、現在の東証は殿様商売です。他の証券取引所も等価に引き上げて、企業の上場先を分散化させるようにしなければ、首都直下型地震でも来れば一巻の終わりです。リスクが極めて大きいのです。リスク分散の第一人者であるはずの株式市場が、最もリスク分散できていない業界とは、お笑いにもなりません。
 ちなみに、「ジェイコム」には大阪本社の会社と通信業界の会社の登録商標名の2つがあり、社名と登録商標名が同じというだけで関係はないわけですが、後者の会社曰く「混同されないかが心配」とのことです。今回の誤発注のジェイコムは2462、4817のジャスダックのJCOM(ジュピターテレコム)とは全く違う会社とのこと。CATVなどをご利用の方の中には、もしかしたらJCOMのサービスなどを利用している方もいるかもしれませんから、念のために書いておきます。

 後は「インチキ占い師のテレビ番組での発言についてフジテレビが謝罪」のニュース。何でも「24時間光を当て続けて卵を3つも産ませている」そうな。ブログは信頼性と情報の速さでマスコミを上回るメディアなわけですが、いい加減な情報を発信すると大変です。こういうイカサマ占い師のようなことは書かないようにしなければ。
 「過ちを認めず繰り返すことが過ちである」といいますが、このインチキ占い師も、マスコミ連中も、りそな証券も、これに懲りてバカなことをやらないようになれば良いのですが。ついでにヒューザーなどから計600万もの献金を受け取っていた森派の方々、全額返金したとのことですが、オイシイ武部もセットでもうそろそろ懲りてください。
カテゴリ [開発魔法][社会問題][経済・知的財産][ゲーム開発] [トラックバック 0][コメント 0]

<-前のページ [1] [2] [3] [4] [5] [6] [7] [8] [9] 次のページ->
- Blog by yamicha.com -