2008年01月13日のニュースとネタをお届けします
名前のない部屋さん経由産経ニュースの記事によると先月発売されたDS版FFIVに発生したら『購入者が自分で解決することは難しい』バグが発見されたのだとか。新聞の記事をそのままもってきたページであるためか詳しい情報が一切書かれていないため、ネットで検索してみたところ出てくるのは GBA版FFIVのバグ情報ページばかり。3度目の過ちだったのか(PS版FF4でもやらかしていれば4度目、WS版でも以下略5度目)!
探してみたところlivedoorニュースの記事が情報源として良さそうだったので取り上げておきます。
なおこのテの情報は積極的に転載したほうが良いと考えていますので、重要と思しき部分を全文引用します。なおlivedoorによる記事も公式サイトのソースよりの転載が主ですので二重転載ですがそこはまぁ。
「未来へのプロローグ」を閲覧するとエンディングで画面が停止する
でぶチョコボに話しかけると表示される「イベントシアター」メニュー内の「未来へのプロローグ」を閲覧した状態でエンディングを迎えると、本来キャラクターが操作できないシーンで、操作が可能になり、画面が停止するというものです。対処法としては「未来へのプロローグ」は閲覧しない、もしくは閲覧後はセーブせずにゲームを終了する、ということが挙げられています(「未来へのプロローグ」は2週目以降で登場します)。
解決法はなく、予防法があるのみ 。そしてそれも『せっかく用意されたごほうび。だが見るな!!』という酷なもの。
飛空艇が使えなくなる
(1)飛空艇を地底に配置する (2)その状態でDSの電源を切らず、メニューから「タイトルへ」を選択する、もしくは、バトルで全滅してタイトル画面に戻りニューゲームを開始する、以上を満たす場合、バロン城での飛空艇入手イベント後に飛空艇のグラフィックが表示されなくなります。また、現象発生後に陸地など飛空艇が直地可能な場所でBボタンを押すと、それ以降飛空艇が使用できなくなります。
こちらも解決法はありません。FFVIIIのオーディン入手イベントの不具合を思い出します。
『未来へのプロローグ』バグのほうは“未来へのプロローグを一度でも見た”というフラグが他のフラグに影響を与えてしまったようです。書き込む場所を間違えたのか、書き込む情報が大きすぎたのか DQIVの『逃走に8回失敗できてしまうとかいしんのいちげきフラグオン』のバグを思い出します。
どちらのバグも比較的起こりやすそうなものであるだけに注意が必要です。まぁどちらも一度やってしまったらもう回避できそうにありませんから 心当たりがある時点で即スクエニのサポートセンターに連絡することをオススメします。そういえば僕もスターオーシャン3の初回版のときは郵送対応してもらったなぁ 。
公式サイトの不具合情報はコチラ。これでまたひとつFFの不具合黒歴史が1ページ。嫌な事件でしたね 。
[ 関連キーワード : (キーワードは登録されていません) ]
最近カウンターの数字がリセットされることが多く、そのたびに過去ログから手動復旧する手間に追われています。リセットの原因は おそらくカウンターの数値ファイルの破損。同じ瞬間(たぶん数マイクロ秒間)に複数のアクセスがあって同じ瞬間にカウンターの数値ファイルが書き換えられたシチュエーション において壊れたのでしょう。
通常のwebプログラムならファイルのデータを書き換える際には『排他ロック』を働かせファイルを保護するためこのようなことはあまりおこりません(排他ロックとはファイルを書き換えている作業をしている間はそのファイルにアクセスできないよう保護するという機能です)。
しかし僕の場合は既存のカウンタープログラムが重ったるいのに辟易して自作のものを利用しているため『排他ロック』を利用することを忘れがちになります。今使っているサーバーがPHP5に対応しているため安易にfile_put_contentsという関数を利用しているのが主たる要因。perlだったりPHP4以下だったりの言語ではファイルにデータを書き込む際長々と関数を書いていかなければならなかったのを、これ1つの関数のみで行えるという、夢のような関数です。
しかしこのfile_put_contents、デフォルトの状態では排他ロックを利用する設定になっておらず結構危険。カウンターのように毎秒何回ものアクセスが起こりうるプログラムに使うには危険が多すぎます。まぁ僕のいま使っているカウンターはお手軽版にもほどがあるよ、と。
PHPの公式マニュアルによるとfile_put_contentsでは排他ロックをできないことがわかったので、自作するほかありません。排他ロックを働かせる関数flockを使うにはファイルポインタを利用した関数でそろえなければならないのでfile_get_contentsも使えません。そこでfile_get_contentsとfile_put_contentsの両方をセットで使うことを想定した関数を作りました。
// ファイルを読み込んで内容とファイルポインタリソースを返す関数
function my_file_get_contents($FileName,$GetFlag="r+"){
if($fp = @fopen($FileName,$GetFlag)){
set_file_buffer($fp,0);
flock($fp,LOCK_EX);
rewind($fp);
return array(fgets($fp,1024),$fp);
}else{
return FALSE;
}
}
// 排他ロックをかけながらファイルにデータを書き込む関数
function my_file_put_contents($fp,$PutData){
rewind($fp);
fputs($fp,$PutData);
flock($fp,LOCK_UN);
fclose($fp);
return TRUE;
}
// 排他ロックが処理中ずっとかかっているので安心なカウンターの作例
function UltraEasyCounter(){
list($TotalCount,$fp) = my_file_get_contents([カウンタのファイル]);
$TotalCount++;
if(my_file_put_contents($fp,$TotalCount)){
return $TotalCount;
}else{
return 0;
}
}
/* 実際は加算処理の前にCookieでアクセス重複を判別したりだとか
アクセスログのデータベースを照会したりだとか、
いろいろやるべきことはありますが原理上これでカウンターが完成しています。 */
ファイルを読み込んで内容とファイルポインタリソースを返す関数『my_file_get_contents』という関数について説明します。第一引数に読み込むファイルの場所(URL)、第二引数に読み込みモードを指定します。つまりはfopenとまったく同じ書式です。マニュアルに沿って仕様を書くなら“resource my_file_get_contents ( string $filename , string $mode)”てなところでしょうか。ただし返り値は配列要素で、[0]が読み込まれたファイルの1行目の文字列(あくまでカウンタ用途なので)、[1]がファイルポインタのリソースとなっています。このあたりが自作関数ならではの汚い感じ。
set_file_buffer($fp,0)とrewind($fp)についてはおまじないの域を出ない気がしますが、実のところどうなんでしょうか。このあたりがC言語や機械いじりをやっていないツケというか。まぁさておき、このmy_file_get_contentsはfopenをfsockopen()に置き換えてstream_set_timeoutを併用すればそのまま外部サイトからのソース参照プログラムになるので思わぬところで便利になるかもしれません。重いファイルを読み込む場合にも1行1行読み出せるファイルポインタ系の関数は有効です。有効です、というかファイルにアクセスしている時点で負荷は変わらないのではと思いますが、コンピュータの深いところをまったく知らないので受け売りでしかモノを語れません。
さてそれでは排他ロックをかけながらファイルにデータを書き込む関数・『my_file_put_contents』という関数についても。第一引数に読み込むファイルポインタ情報、第二引数に書き込むデータを指定します。“int my_file_put_contents ( resource $handle , string $string)”といったかんじです。まぁそのままfputs(fwrite)関数ということですね。この関数内で行われている処理はすべてTRUEでなければいけないので4つの処理すべてで“失敗したらreturn FALSE”しなければならないのですが、まぁ、面倒なので。
さてこれを実際に動かしたところ、期待通り、きちんと動きました。目に見えて動作が遅くなったわけでもなし(試行を重ねてきちんと検証すべきなのか!?)、おそらくは排他ロックもできているのでもうファイルが壊れる心配もないでしょう 。
それにしてもこれだけニーズの高そうな排他ロックの機能がサポートされていないのはおかしい。もしくは既に有名な問題であってネット上で優れた勝手関数が公開されているのか。と、思い検索にかけてみました。しかしそれらしい関数はほとんど出てきません。ここで ある可能性に気づき、別の検索語で検索してみます。
『site:www.php.net "file_put_contents"』
すると 驚愕の事実が判明しました。なんと問題視していた公式サポート関数・file_put_contentsに、既に排他ロック機能がついていました!
変更履歴5.0.0 コンテキストがサポートされるようになりました。
5.1.0 LOCK_EX のサポートが追加され、 data パラメータにストリームリソースを指定することが可能になりました。
6.0.0 FILE_TEXT および FILE_BINARY がサポートされるようになりました。
とのこと。
要するに僕が見ていたマニュアルが旧い版のものだったため、その時点のfile_put_contentsでは排他ロック(LOCK_EX)の機能がサポートされていなかったと 。というかオンラインマニュアルなのに更新が3年前なんて、更新しないんならそんなもの置くなよ(PHPのマニュアルがネット上にうようよあることの弊害)!
というわけで、今回の長々とした関数は利用価値がほぼなくなりました。かわりにfile_put_contents($FileName,$PutData,LOCK_EX)とでも書けばこれ1行で大丈夫。世の中便利になりましたね!
ただPHP4を利用している人や何らかの事情でファイルポインタのリソースを使いたいという人にはまぁ有用であると思いますのでココに記事として残しておきますね。はームダ骨ムダ骨(だがそれがいい)。
[ 関連キーワード : (キーワードは登録されていません) ]
| 記事タイトル | ||
|---|---|---|
|
2008年01月14日 0時更新 人気記事ランキング |
||
| 1 | ハヤテ新EDテーマ「木の芽風」を歌うIKUはAKIなのか(I've SOUND) | 118 |
| 2 | テイルズオブヴェスペリアはXbox360で発売決定? | 96 |
| 3 | テイルズオブ新作『テイルズ オブ ヴェスペリア』のまとめと推察 | 92 |
| 4 | DS版FFIVにゲーム進行が不可能になる不具合 | 91 |
| 5 | PSP版スターオーシャン1のプレイ雑感と感想 | 62 |
| 6 | DS版DQ5に“新たなる人生の選択”が追加されるよう | 55 |
| 7 | FFT-A2のクリア後レビューと感想(ネタバレなし) | 39 |
| 8 | コミケ73「I've MANIA Tracks Vol.I」 収録曲が公開 | 35 |
| 9 | PS3のソフトがPS2で出たりPS2互換型PS3が出なくなったりの怪 | 25 |
| 10 | file_put_contentsに排他ロック機能をつけてみた(PHP) | 24 |
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| « 12月 | - | 02月 » | ||||
| 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 | ||
