スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[PHP] fopen() "r+" "w+" どちらも「読み込み/書き込み共用です」 どない違うねんという話

テキストファイルに書かれた数値を読み込んで1プラスして再書き込み。
カウンタとか、なにかのユニークな数値を管理するためによくやる手法かと思います。

で、同時アクセスされたときに読み書きの間で処理が前後すると同じ値が採番されてしまったりするので、だいたいは下記のような手順で進みますよね。(詳細なソースは省きます)

fopen() でファイルオープン

flock() で排他ロック

fread() で読み込み

加算した値を計算

rewind() とか fseek() とかでファイルポインタを先頭に移動

fwrite() とかで書き込み

flock() でロック解除

fclose() でファイルを閉じる


 ありふれた処理ではあるのですが、そういった処理はたいていDB処理することが最近多かったので、はて fopen() では読み書き両方したいときにはどんな感じで読み込めばよかったかいなとリファレンスを読み直したりすると、

"r+" ... 読み込み/書き出し用にオープンします。
"w+" ... 読み込み/書き出し用にオープンします。



 そんなのはわかっとるわ! となるわけです。
 もうちょっと親切ならこう書いてあります。

"r+" ... 読み込み/書き出し用にオープンします。ファイルポインタをファイルの先頭に置きます。
"w+" ... 読み込み/書き出し用にオープンします。ファイルポインタをファイルの先頭に置き、 ファイルサイズをゼロにします。ファイルが存在しない場合には、 作成を試みます。



 "r" と "w" の違いで、「ファイルが存在しない場合には、 作成を試みます。」はわかります。
 "r" はファイルが存在することが前提で動くので、ファイルがないことが想定されるときには"w"を使おうと。
 じゃあ、「ファイルサイズをゼロにします。」とは何なのか。

 わからんので、まあ "w+" で組んでみようと。そうして動かしてみると奇怪な現象になります。
 ファイルから書き込まれているはずの値が読めなかった場合は異常な処理として「1」を採番して、それを書き込むといった処理をした場合、常に1が書き込まれカウントアップされないといった動作になります。

 はてこれは奇怪な、あなたは「読み書き両方」できるんだろう? と思ったものの、これが「ファイルサイズをゼロにします。」の落とし穴。読んでそのままなのですが、"w+" で fopen() されたときは、その時点でファイルサイズがゼロになり、中身が空の、のっぺらぼうになります。
 すなわち、その前にファイルに何か書き込まれていても意味がないということ。確かに読み書き両方できるけれど、いったんファイルの内容は失われるということです。

 というわけで、「fopen() する前のファイルの内容を読んで書き戻す」という今回のような用途には "r+" を使わなければなりません。そういえば C言語を学び始めたときに同じような話を聞いたような気もするがもう10年以上も前の話だものなあ。

 で、こういった処理のときにもうひとつ落とし穴というか見事に困ったのでこうやってメモ書きをしているわけですが、カウンターのように常に値が増えていくものなら問題ありません。
 しかし、これが fopen() する前のファイルサイズより短いものを書き込む場合にちょっと気をつけなければいけない点があります。

 たとえば、先に "1234" と書かれていて、ここに "1" を書き込んだとします。
 ファイルには "1" と書かれていることを期待しますが、処理後にファイルを確認すると "1234" になっています。書き込みに失敗したのか、というとそうでもありません。では、と "2" を書き込むと、 "2234"となります。

 すなわち、「ファイルポインタを先頭に戻して1文字だけ書き込んだ」ので、それ以降の文字は残っているわけです。"w+" では「ファイルサイズをゼロに」されるのでこういうことはありませんが、逆に "r+" で内容を残すことにするとこういうことになるわけです。

 なら、"r" で読んで、"w" で書けば理屈としてはいいわけですが、ロックが外れる瞬間が発生してうまくありません。やはり "r+" を使わねばなりません。なら、「ファイルサイズをゼロに」できればいいのではないか。そのとおり、 ftruncate() というものがございます。

ftruncate -- ファイルを指定した長さに丸める
http://manual.xwd.jp/function.ftruncate.html

ftruncate( $fp, 0 );

 として、書き込む前にファイルの内容をクリアしてしまいましょう。これで "w" / "w+" でオープンしたようにファイルサイズがゼロになるので、いままでの内容がどうであったかを意識せずに、書き込んだもののみがファイルに残ります。

 こんなことで半日悩んだりするので、経験がどれだけあってもメモ書きは大事だなあと思うしだい。

more...

スポンサーサイト

[Web] Ajax で ブラウザが IE の場合 XMLHttpRequest がうまく取れない件

たまに忘れてやらかすのでうまくいったスクリプトをメモ。
ようは IE は new XMLHttpRequest(); で取れないので振り分けた上で適切なオブジェクトを使ってやらないといけないとのこと。

これで xmlhttp として取得できるので、あとはブラウザの差で問題はないはず。
(もちろんオブジェクト自体が違うので、サポートしてないメソッドやらプロパティは意識する必要はあるけれど)

もともと ActiveX オブジェクトとして実装されたために云々というややこしい話はあるようだけど、細かいことは置いてこれで Firefox、IE6以降、Opera については確認できたのでいいことにする。細けえことはいいんだよ。いや、よくないんだけど。

あと、必要なのかはわからないけれど、出力されて受け取るべき XML についてはちゃんと ヘッダを打って Contents-Type やら Charaset を指定しておかないと文字化けしたりXMLとして認識してくれないかもしれないので、おかしいなと思ったら合わせて確認下さい。

function getXmlHttpObject() {

var xmlhttp;

//Win InternetExplorer 用
if(window.ActiveXObject){
try {
//Msxml2.XMLHTTP
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
//Microsoft.XMLHTTP
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
return false;
}
}
} else if(window.XMLHttpRequest){
//XMLHttpRequest
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = false;
}
return xmlhttp;
}



<参考>
クラスブラウザで利用できるようにする - Ajaxを用いたHTTP通信 - Ajax入門
http://www.ajaxtower.jp/ini/http/index6.html

XMLHttpRequestオブジェクトを取得するには? | Diaspar Journal
http://diaspar.jp/node/50

IE7用のAjaxはIE6で動かない? - IE7対策は万全ですか--アプリで動作トラブルの不安:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20070710/277219/

[Web] Flash で綺麗なグラフを表示できる amCharts がなんか使い勝手よさげ

某サービスで使われていたグラフが非常に面白げなので触ってみました。

amCharts.com
http://www.amcharts.com/

公式はこちら↑。
こういうものを画像とHTMLで表現するのは不可能ではありませんが面倒なものです。

こういうグラフを、特にプログラミングすることなく設置・表示することが可能です。
設置のためにすることとしては、

・ダウンロード、設置
・表示したいデータを用意する
・グラフの表示をカスタマイズする設定ファイルを適切に編集する
・そのグラフを呼び出すHTMLを用意する

たったこれだけ。データと表示設定を CGI で動的に変更することができればグラフも動的に変更できてやれることの幅が広がりますが、静的なデータとHTMLでもグラフィカルで少しインタラクティブなグラフを表示できます。

使い方については本家サイトが英語なのですが、ダウンロードしたものにサンプルはついていますし、断片的には日本語のサイトでもいろいろ情報が拾えます。基本的にXMLの内容をいじるだけなので、手探りながらでも素敵グラフが作れるかと思います。


<参考>
Flashできれいな円グラフを作る「amCharts」で折れ線グラフや面グラフが可能に
http://gigazine.net/index.php?/news/comments/20070315_amcharts_linearea/

amCharts HTMLで、FLASH Graph フラッシュグラフ
http://www.linkclub.or.jp/~ma3ki/webutil/amcharts/amcharts_howtograph.html

タグ : amCharts

[雑記] 「児童ポルノ」と判定されるであろうリスクについて考えてみた

児童ポルノ判定リスク図

↑クリックすると少し大きくなります

現在(2009/07/09)は、自民党と民主党で法案内容のすりあわせ中らしいですが、関わりそうな業界の方々はこれからどうなっていくのかを不安に感じていられるかと思います。

法案の中に実在の少女・少年をあつかわない作品に関して具体的文言が加えられるのか、そもそも法案が決定になるのかというところではありますが、私は決まったとしてもおそらくは、具体的に何が対象となるのかよくわからんままのものになるかと思っています。

その場合、何が問題となって何が問題とならないのか、についてちょっと考えてみました。
あくまで法的解釈ではなく、「なんとなく具体的例が示されないまま法が施行されたときに業界および消費者がぼんやりともつであろう線引き」を考慮しています。

すなわち何が「児童ポルノ」とみなされるのか、ですが、

・「児童」であるか
・「猥褻」であるか

の二軸で考えられるのではないかと思います。「児童ポルノ」の言葉を分解しただけといえばそうなのですが。

・「児童」であるか

 については、年齢もそうですが、実在の人間でない場合はそれが「児童」とみなされるかどうかの確度を考えます。すなわち創作作品であればそのキャラクターの年齢がどこかで示されているか、年齢を示唆する描写があるか、見た目はどうか(絵のタッチ、衣装)、というところです。

・「猥褻」であるか

 これもただ単に性交の描写があるかに加えて、「一般的」で「良識的」な(あくまでもカッコつきですよ)人々にとって嫌悪感をもよおさせるかどうか、犯罪的であるか、を含むかと思います。

 こんなことはもっと前か論議され整理されていることなのかもしれませんが、少なくとも私個人が考えてみても線引きが難しいことを示すだけでも、本件が抱えている難しい点や問題が浮き出てくるのではないかと思います。

「きれいな線引きなんかできるわけねーよ」というナンセンスなものなので、そのつもりで鼻で笑って眺めていただければと思います。プロットした具体的な作品例は私の気分で位置を決めています。この位置決め自体が個人的主観なのでナンセンスなんですよね。例が偏っているのは無視してください。


#洒落でアストロ球団を極地に置きましたけど、全裸で懸垂やってる人とかいましたね……もうちょっと猥褻よりかもしれません。


そういうわけでまたエロに冬の時代が訪れるのかなと思うのですが、以前の冬の時代は平成11年に「児童買春・児童ポルノ処罰法、児童ポルノ禁止法」が施行されたときです。

お菓子系とよばれる雑誌(→Wikipedia:お菓子系雑誌)にその影響は大きかったのですが、端的にいいますと、こういうものです。

Cream (クリーム) 2009年 06月号 [雑誌]Cream (クリーム) 2009年 06月号 [雑誌]
(2009/05/07)
不明

商品詳細を見る


最近またその冬の時代直前の状態に戻っているような感じがするのですが、まあこんな感じのものが法が施行されるとなって急に内容が変わったのですね。なんかAV女優さんのヌード写真とかに変わっていた気がします。
表紙に「○○XX子 13歳」とかいう表現も一気になくなりました。またいまは復活してるみたいですね。

その後なんやかんやあって、なんか結局法のボーダーを模索しつつ、元に近い状態に戻してきているような状態かと思います。今回も施行されたとして、またこの波のような動き(規制→自粛→摘発されない程度に戻す)に結局はなるのではないかなあ、と個人的には思っています。

これはモノが「児童ポルノ」とみなされるかについてぼんやりと考えてみたものですけど、「摘発の対象になるか」を図示しても興味深いかもしれませんね。(面白がっているわけではありませんが)

・「児童ポルノ」を明確な意思を持って購入した
・「児童ポルノ」をそうと知らず購入した、手に入れた
・「児童ポルノ」を法施行前から保持していた、存在は知らなかった
・見知らぬ他者から「児童ポルノ」を閲覧できるURLをメールで送られ、消さなかった
・「児童ポルノ」を自作し、公には出さなかった

追記:(2009/07/13)
コメントをいただいたのを機につらつらと思い返してみるに、「全裸で懸垂」をやっていたのは「野望の王国」だということに気がつきました。

野望の王国 1 完全版 (ニチブンコミックス)野望の王国 1 完全版 (ニチブンコミックス)
(2002/09/27)
雁屋 哲

商品詳細を見る


もっというと懸垂ではなく、つり輪だったような。
方向的にアストロ球団とそんなに離れてもいない気がするのでよしとします。

アストロ球団 (第1巻)アストロ球団 (第1巻)
(1999/03)
遠崎 史朗中島 徳博

商品詳細を見る


端的にいうと、人がいっぱい死ぬ野球漫画です。

テーマ : 児童買春・児童ポルノ処罰法
ジャンル : 政治・経済

タグ : 児童ポルノ

[Firefox] 勝手に変えられた UserAgent をリセットする

私は Webブラウザとして日ごろ Firefox を使っているわけですが、ここ最近困ったことになっておりましてですね。

現在使っているのは バージョン 3.0.11 なのです。
そのくせ、何かにつけて 「最新のバージョン3にしましょう」 と至るところでメッセージが出てふざけんなてめえの目は節穴かと思っていたのですが、冷静に考えてみれば何か原因があるのだろう、たぶんそれは UserAgent を見て判断しているのだろうと思い確認してみると、

(略) Gecko/2009060215 Firefox/2.0.0.11;MEGAUPLOAD 1.0 (.NET CLR 3.5.30729)

なんじゃこりゃ。

MEGAUPLOAD うんぬんは思い当たる節があります。ストレージサービスなのですが、そのツールバーを入れたときに勝手に書き換えたのでしょう。その後ツールバーは削除したものの、この記述が残っていると。

かなんなー。
というわけでこいつの消し方を調べたのでメモ。

Firefox のアドレス入力欄に about:config と入力して設定画面を開きます。
general.useragent.extra.firefox を探して、右クリック → リセット
しかるのちに Firefox を再起動。

Firefox の UserAgent のリセット方法

これですっきり。
その下にある general.useragent.extra.microsoftdotnet は Microsoft .NET Framework Assistant が勝手に書く値のよう。これは特にいまのところ実害がないので放ってますが、何かこれが問題と思われることが発生したら確認するほうがいいかも。


で、特に脈絡もなくリセットつながりでリセットマン(Wikipedia)なのですが、

リセットマン 1 (ヤングジャンプコミックス)リセットマン 1 (ヤングジャンプコミックス)
(2007/12)
栗原 正尚

商品詳細を見る


この人の代表作の「怨み屋本舗」シリーズとは真逆とはいえ、似たような話ばっかり描いてますね。面白いんだけれど。こないだ「怨み屋本舗 巣来間風介」が終わったから、ああ違うものを描くのかなと思ったら、「怨み屋本舗~REBOOT~」。いやいや。

「コータローまかりとおる!」→「新・コータローまかりとおる! 柔道編」→「コータローまかりとおる! L」かよ! と。蛭田先生コータローしか描いてないじゃん。病気療養中で休載中とのことですが、いつ続きが読めるのやら。
検索フォーム
リンク
最新記事
最新コメント
カテゴリ
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。