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

<前 次>

無題

PHPには、余計なコメントや空白を除去したソースを出力するオプションがあります。
それを使えばコードが短くなってコンパイル時間も含めたPHP実行時間の削減に役立つかなーと思ったのですが、あまり効果はないようです。
コメントや空白の除去は元々短時間で終わる字句解析にしか影響が無いためでしょうね。
実測してみたところ、むしろ空白除去版の方が処理時間が長くなる傾向が見られました。
おそらく改行が無くなったことにより切りのいいところで処理を切れなくなったからだと思います。
実際の字句解析の仕様は知らないのであくまでも根拠のない予想ですが。
数百KB以上のソースファイルのほとんどがコメントと空白なんて状態でもなければ目に見えて速くなるなんてことはありませんでした。

無題

複雑な検索条件を構文解析するPHPプログラムを作成中です。
アンパンマンDBバージョン3用ですが、構文木まで作れればアンパンマンDBに限らずいろいろ応用が利きそうです。
PHPにはyaccとかlexみたいなのが見当たらないけど、少なくとも字句解析は正規表現でなんとかできそうです。
構文解析については、これも正規表現で頑張るか、昔頓挫した言語作成の延長線上でやるか、どちらかで頑張ることになりそうです。

無題

早速テンプレートをPHPコードに書き換え始めたわけですが、変数とか関数の扱いをあまり考えていませんでした。
テンプレートは関数を使って呼び出すことになるのでグローバル変数は使用不可。
テンプレートに変数を渡す方法を考える必要あり。
関数は常にグローバルスコープなので呼び出しに関しては何の問題もなし。
逆に、テンプレート用関数の定義をするときにどうするのかが問題。
このへんを充実させれば扱いやすくはなるかもしれないけど、今度は普通のテンプレートエンジンと何が違うのかってことになりかねない…。

無題

というわけでPerlのキ番登録フォームをPHPに書き換え中…。
Perlは省略記法が洗練されている一方、別の言語に翻訳するときは長くなっていけませんね。
実質新規に書く部分は数値の取得部分だけなのですが。

無題

microtimeの差分についてのページを更新しました。
呼び出し方による精度の違いなんかも出てなかなかいい感じの記事になりましたのです。

OpenOffice Baseのフォームの取り扱いのほうも分かってきたところです。
なんだかんだでAccessを使っていたときの経験は役に立っているようです。

データベース中継

さて、うちのデータベースはここのサイト以外の場所からのアクセスを禁止されていて、そのままではローカルテストができないので、データベース処理の中継用のスクリプトを書いてサーバーに置いてみました。
PHPのお節介仕様のおかげで多少問題はありましたが大方うまくいったようです。

アップロード掲示板

メテオンもどき、白文字に黒縁をつけることで背景画像を邪魔しないように文字を読みやすくできたのでアップしました。
これで、なければ困る機能は大方そろったと思うので、今まであまりやってこなかったことのほうに力を入れるようにして、メテオンもどきのほうはそろそろゆっくりの更新ペースに落としておこうかと思っています。
とりあえずBGM切り替えと同時に生存した場合に両方鳴りだしてしまうバグを解消してから…ね。
演出面やちょっと不便なところなどの更新はもう後回しにしようかと思っています。

今日はVistaに変えてから不安定だったAN HTTPDを調整して何とか勝手にエラー落ちしないようにしました。
問題はPHPのモジュールにあったらしく、モジュールとしての実行からCGIとしての実行に切り替えるとエラーが起こらなくなりました。
ということで、前々からやりたかった、TGBBSへのファイルアップロード機能の追加をやってみました。
メテオンもどきが宣伝効果となってダウンロードゲームのほうもやってくれる人が増えたようで、自作ステージのアップロードなどにも早く対応したくなったのですよ。

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

プロフィールの基本機能がひとまず出来上がりました。
まず、スパム対策のためフォームは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に移植しています。
明日は早いので今日はこの辺で。

<前 次>