「PHP」に関する日記(10)

<前

クッキーにまでバックスラッシュつけなくてもいいのに

プロフィールの基本機能がひとまず出来上がりました。
まず、スパム対策のためフォームはname属性をスクランブルした上、フォームの並び順そのものもシャッフルして、コンピュータから見てほとんど意味のわからない、しかしそれでいて人間から見ればあまり違和感のないインターフェースにすることができました。
しかもこのスクランブル&シャッフルはフォームの構成をパラメータとして渡せば掲示板などにも応用できる優れものです。
しかも、色やアイコンを選ぶフォームは設定から自動的に内容を調べてきて適切な表示ができるように、ことにアイコンについてはJavaScriptを利用して項目を切り替えるたびにアイコンのプレビューが出るようにしました。
で、それで、いよいよプロフィール書き込みを作ろうかと思って作ったところ、記録されるには記録されたようなのですが、画面に反映されないんですよね。
どうにも特定のIDのときにクッキーに保存したデータが読み出せなかったみたいなんですね。
暗号化が悪かったのか、復号処理に問題があったのか、それともシリアライズがおかしかったのか、見当もつかなかったんですよ。
それで、とりあえず全ての元凶を暗号・復号処理だと決め付けて、それらの処理を取っ払ってみたところ、やっぱりうまくいかなかったんですね。
でも暗号化されていない分、記録されたデータは丸見えだからクッキーの内容を記録した変数を見ればわかるだろうと思ったんですよ。
すると、データ中には不自然な「\"」があったというわけです。
どうやらPHPはクッキーのデータに対しても特殊文字をバックスラッシュでエスケープする機能がついていたらしく、暗号化されたら暗号化されたで暗号化された結果が特殊文字だったり、しなかったらしなかったでデータ中に元々あった特殊文字がエスケープされ、うまく動かなかったというわけです。
そんなわけで、めでたく動くようになったはずなのでよろしければ試してみてください~。

メタルを逃がせ!

ドラクエ8やってました。
ちょっとした発見です。
おどかして追い払った敵からは経験値はもらえないがアイテムはもらえる、というのはよく知られたことですが、メタル系の敵はおどかし損ねたときに自らの意思で逃げることはしないのです。
つまり、普通に戦えばアイテムごと逃げられて得られなかったアイテムも、おどかして逃がせば手に入る可能性が高くなるのです。
だから、経験値よりもアイテムがほしい場合なんかは、下手に戦うよりもおどかしたほうが確実ということになるのです。
もっとも、レベルも上げたいので普通に戦いましたが。

PHPのarray_merge関数、仕様上重複する配列の要素が配列だった場合、古い配列は新しい配列でそっくり置き換えられて古い配列は残らなくなりますが、その点を改善して重複する配列の要素が配列だった場合、更にその配列同士をmergeする、mixed_mergeを作ってみました。
添字が数値だった場合array_mergeと全く異なる挙動を示すのが少し問題ですが、まあ、そっちのほうがTGscriptには合っているので。

微妙な拒絶感

浮き沈みリンク集を改良してみました。
タグがリンクの入れ替わりに応じてくるくる入れ替わってしまってタグをつけても探すのが面倒ということになってしまっていたので、リンクは従来通りスコア順の表示にして、タグはそれとは関係なく五十音順で表示するようにしました。
ただ、前のバージョンのほうがいいという場合もあるかもしれないので、一応これはオプションにしていて、何も設定していない場合は従来の方法で表示するようにしています。

バナーを追加しました。
コネコベーダーを使った白黒の極小バナーで、うちの画像にしては珍しくGIF形式です。
ついでにバナーのアドレスを変更しました。
まずリンク集にある各サイトのバナーの置き場を/links/banners/から/banner/に、それに伴ってうちのバナーもその中に入れて/banner/tgws01.pngと/banner/tgws02.gifです。
この名前の変更は管理上の理由もありますが、うちにリンクしてくれるという人がバナーをダウンロードしたときファイル名に困らないようにするという意味も持っていたりします。

で、そして、ふにゃさんのステージセレクトの改良なんかもしたりしていました。
難しそうな気がしたもんでずっと先送り先送りにしていたのですが、改めてよく見てみると、ステージセレクトでのマップの表示処理はたった3行のコードで書かれていただけであり、結局ちょこっと手直ししただけで開始面を表示できるようになってしまいました(以前は何面まで進んでいても表示されるのは常に1面だった)。

そんでもって、今日は辛口イモ天カレーなんぞを食べてました。
何のことはない、レトルトの辛口カレーに昨夜の残りの芋の天ぷらを乗せただけのものです。
スパイシーな辛口カレーに芋の天ぷら油が微妙な拒絶感を醸し出していました。

浮き沈みリンク集

自分用リンク集PHPの削除機能ができて、ついでにパスワードで編集制限する機能もつけたので、これで事実上完成となり、もしかしたら人様のためにも使えるかもしれないと思ったので、明日アップしようと思います。
今回、いつものCGI・PHPとは異なる方法で作っていて、大きなプログラム本体を、小さな設定ファイルから呼び出す形式になっていて、普通のCGI・PHPとは異なるつくりになっています。
こうした理由は、プログラムひとつで設定ファイルだけを複数用意することで簡単に同じリンク集をいくつも作れるというのがあり、また、PHPを呼び出す前処理・後処理も自由に作れるようになるためというのもあります。
TGscriptもこの方式でいこうかなとも考えてます。
こちらも複数用意する必要性が出てくるかもしれないので。

3rdは使えない!?

yaneSDK.NETのことですが、セットアップが煩雑すぎるということで使わないことにしました。
コピーすべきファイルがソースファイルだけじゃないとか、初期設定が多いとか、ちょっとした事を色々試すにはあまりに面倒です。
同じような理由でyaneSDK3rdも使いません。
先にコンパイルしましょうとか、面倒すぎます。
まあ、3rdのほうは割と単体でも使いまわせそうなものが多いので、こちらは存在意義が.NETよりはありそうですが。

日記管理をPHPに移植中です。
現在は管理者の認証までできていて、これから管理者用の処理を書くところです。

リセットさん

今日は爆ボンのバトルステージのことでも書いてみようかと思ったのですが7割方書いたところで突然パソコンが再起動されてしまい、文章が消失してしまいました。
再起動後書き直そうとしてエディタを開いたのですがやる気が減退してしまい、結局何もせず終わりました。

メモちらしを少し改良しました。
どことも繋がっていない粒子が動いてしまうとどこにも繋げないうちにどこかへ飛んでいってしまうことがあったので、どことも繋がっていない粒子は動かさないようにしたのです。
ただ、現在位置の座標を更新しないだけでかかっている力やそれから算出される速度の値は時々刻々変化しているので、どこかに繋げた瞬間内部的に持っていた速度でいきなり動き出すのが問題ではあります。
だったら速度の値を0にすればいいとも考えられるのですが、前回の速度の値と現在の力の値などが多少複雑に結びついていたりするのでそう簡単に変えられないのですよ。
このあたりをきっちり書き直せばアップできそうではあります。

昨日の日記で日記プログラムはCGIとPHPに分かれていることを書きましたが、実は今このCGIで動いている部分がCGIでなければならない理由は全くなく、むしろ一部のPHPとの動作の違いで同じはずのアドレスが別物にされたりしてうまくブラウザのキャッシュが使えず表示に必要以上の時間がかかるという不都合だけがあるのです。
そういえば日記の削除機能が未実装だったので公開前にはその点も改善しなきゃいけませんね。

使いそうなクラス

はい。トップがPHPになっているのにお気づきでしょうか。
そんなもん知ったこっちゃありませんね。
以前はSSIからカウンタCGIを呼び出していたのでPerlとCGIの2つのファイルの呼び出しがあったのですが、PHPにしてひとつのファイルにまとめたためかなり軽くなっているはずです。

ミディビ、更新しました。
プログラムには触れてませんけど、手がかりにはなるはずです。
やっぱ2ヶ月もあいてるんでそろそろ更新しとかないとなーということで。

新しい日記で御座います

で・・・できたのだ。
これが新しい日記なのだ。
最も閲覧数の多い最新ログはHTMLで高速表示、過去ログやジャンル別の日記はPHPで効率よく管理、そして書き込みにはCGIを利用するというとても素晴らしい日記システムなのだ・・・。
それでは、また明日。

再インストール完了

ブラウザを入れなおすためLunascapeのサイトに行ったらバージョン2があったのですが、プレビューリリースということで、今は導入しないほうがよさそうだし、だからといって旧バージョンをインストールしてもすぐにいらなくなりそうだったので、とりあえずしばらくはIEで我慢ということになりました。

1日に更新していたのですが、トップページの更新を忘れていました。

DirectX8.1SDKがなかったので仕方なく9SDKをインストール。
サンプル見てみたけど数は少ないし大して見た目変わんないのにピクセルシェーダなんか使ってコンマ数FPSまで重くなるし、利用者を舐めてんのかと言いたくなる内容。
実際に製品として組み込むときにはピクセルシェーダを使わない設定とか付けたりするんでしょうかね。
とりあえずこれで「パネルγ」をリビルドしてみたけど必要環境がDirectX9になってしまっていないか不安です。

CGI&PHPの動作確認環境も何とか復帰。
ついでに新日記もちょいと更新。

使い分け

全員に全く同じ内容のページを見せる場合で、特に更新よりも閲覧が圧倒的に多い場合はHTML。
それぞれに違うページを見せる場合、更新が多く閲覧が少ない場合で、ファイルへの書き込みを伴わない場合、あるいはデータベースを利用する場合はPHP。
ファイルへの書き込みを伴う場合はCGI。
で、どうだろう。
ファイル内容はCGIとPHPで共有できるし、CGIで生成したページをHTMLファイルとして記録し、閲覧の際はそれを見せるようにすれば負荷は減らせる。
だからといって何でもかんでもHTMLを作るようにしていたら見られもしないのにHTMLファイルばかりが増えるということも。
新日記の左側メニューは基本的に月一の更新であり、かつ最新の日記とほぼ同じ回数呼ばれることになるのでHTML。
右側の日記は、よく見る人は基本的に最新のものしか見ないので最新の日記のみHTML、他はPHPで、書き込み部分のみCGI。
掲示板はランダムメッセージを表示したりクッキーを使ったりするのでCGIかPHP。
リンク集はトップのHTMLページだけで大体用事が事足りている様子なので現状維持。
TScriptはCGIとPHPを組み合わせるつもり。
カウンターはファイルへの書き込みがあるけどPHPにするメリットのほうが大きそうなのでPHP。

ニ短調ト短調

決して多いわけではないんですけどサーバーのCPU使用率が上がってきてCGIの使い方とか見直したほうがいいかと思い、ちょっと考えてみました。
HTML-CPUパワーを基本的に使わない。更新が少なく全員同じ内容を見るページに適する。
CGI--最も重いがSuExecを導入しているのでファイル書き込み等はこれを使いたいところ。
PHP--データベースとの連携が強い。CGIよりは軽い。
というわけで、これを基準にいろいろ書き換えていくつもりです。

「ふにゃふにゃ」のBGMを調べてみたら、DmとGmの合わせ技だった。
本当は長調の曲のはずなんだけど、つくりが甘かったためかよく分からないうちに短調の曲に。
どっちかというとデータ上短調扱いしたほうがわかりやすかったということだけれども。
で、そう仮定するといくらか矛盾のある部分が出てきたので、いろいろ改良中。
一年以上もこれを放置してきたわけですが…

新日記作成日記

新しい日記をPHPで作り始めました。
とりあえずは個人的に需要のある日記の過去ログを表示する部分を先に作り始めました。
というより過去ログを見るPHPそのものはできたんですが。
ログの変換作業が結構大変なのです。
まずHTML化されたログをPHPで読める形式に変換しなければなりません。
これについては単純な置換作業で済むのですが。
で、大変なのが日付の記録方式の変換。
なんせ西暦で表された日付と時刻を 1970/01/01(Thu) 09:00:00 からの経過秒数で表さなければならないんですから!
月によって日数が違ったり閏年があったりして変換作業を自動化できないのですが、逆に秒数から西暦をすぐに出力するCGIを作ってできるだけ速くなるようにはしました。
最後は簡易検索用キーワード。
開発日記等は今まで日記の中から関連する場所を抜き出して別のHTMLファイルを作っていて、ファイルサイズも入力の手間も膨大になりがちでしたが、これを、キーワードを与えて日記の過去ログから検索して表示するという方式に変えて、効率化を図ります。
これはこれで何の関連記事かとかそういうのを、内容をよく読んで判断しなければならないのですが、開発日記用にHTMLを作ることを考えれば楽なものです。
まだ中途半端な状態なのでアップしていません。

PHPクッキー設定フォーム

とりあえず練習のためクッキー設定フォームをPHPに移植しています。
明日は早いので今日はこの辺で。

PHPカウンター

新カウンターに移行するため、旧カウンターのほうを、新カウンターに対応するデータを吐き出すように改造しておりました。
新カウンターはPHPカウンターにするので、現在のSSI&CGIカウンターよりも軽くなります。

SSIの場合
リクエスト→SSI解釈→カウンターCGI呼び出し→Perl起動→CGI実行→結果を埋め込んで表示
PHPの場合
リクエスト→PHP解釈→カウンタースクリプト呼び出し→PHP解釈→結果を埋め込んで表示
で、Perl起動というのが案外重たい作業らしく、起動という作業をしないPHPの方が軽くなるというわけです。
ついでに、途中に他の人がアクセスしても、アクセス後1時間は同じ人に同じカウンターの値を見せるようにするようにしました。
これで、自分のアクセス後すぐに他の人がカウンターを動かしてキ番登録できなくなったという悲劇も起こらなく…もしかして最初から起こってない??

そうそう、「Bomber丸World」のシステムの詳細も一部公開しましたよ。

SQLやめ

どうもMySQLはPHPに最初っからくっついてたらしいけど、ざっと調べてみたところ、専用のソフトがどうたらとかサーバーがこうたらとかややこしそ~なことが書いてあって、右クリック→新規作成→適当なファイル→名前変更、でPHPから使える状態になるわけではなさそうで、となると、データベースの内容のアップロードやダウンロードもできなさそうな気がして、それだったら自宅サーバーで本格的に使う以外では使う理由はないかなと思って、まあそれでも、いつか使えたらいいなというかすかな期待も抱いて今後もちょくちょく調べたりしていこうと思うのですが、当面は使わないことにしました。

MusicPlayer3の、起動時クローズ中バグを直したのですが、その修正版をアップしたかどうかは記憶にございません。
起動時に何かが出たり出なかったりしても動作には支障はないし、特に新しい機能が増えたわけでもないので、修正版を改めてダウンロードしなおす必要はないと思います。

有題

PHP。
モジュールじゃなくてCGIとして、
つまり、
HTTPDとは切り離して実行するようにしたら、
エラーが起きなくなりました。

XP。
電源を自動で切るオプションを切ったら、
5時間ほど放置しても、
落ちなくなりました。

簡易アクセス解析。
アップしました。

ログ。
2日~13日の分を、
回収しました。

PHP

PHP入れてみました。
一応ローカルでは動くようにはなりました。
しかしSSIとは相容れない関係である模様。
いろいろありまして、アプリケーションエラー多発。
サーバーごと強制終了というのは辛い。
ところで、リファレンスを見ていたら.NET関数というものが。
Microsoft.NETと連携したプログラムも将来書けるようになるのでしょうか。
いずれにしても、現段階では全く動かないそうです。

<前