2009年05月31日
ソフトウェアRAIDが死んだので復旧メモ
LinuxサーバのソフトウェアRAIDが死んだので復旧メモ。
古いマシンなので、リプレイスしてもいいんだけど、ひとまず片肺状態は不安なので復旧しておきました。
そのときの作業内容をメモしておくことにします。
1.壊れたHDDを交換した。どちらが壊れたかを特定するにはシリアルNoを見るとよい。
# hdparm -I /dev/hda
2. ディスクのパーティーションを確認
動いている側のディスクがどのようになっているか確認。
# fdisk -l /dev/hda
Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
デバイス ブート 始点 終点 ブロック ID システム
/dev/hda1 * 1 261 2096451 fd Linux raid 自動検出
/dev/hda2 262 9399 73400985 fd Linux raid 自動検出
/dev/hda3 9400 9530 1052257+ fd Linux raid 自動検出
2. 片肺で起動。
# cat /proc/mdstat
で片肺で動いていることを確認。
3. fdiskで切り直す。
参考:http://www.linuxmania.jp/soft_raid_recovery.html
Command (m for help): n (を入力)
Command action
e extended
p primary partition(1-4)
p (を入力)
Partition number(1-4): 1(を入力)
First Cylinder (1-1566, default 1): 1 (を入力)
Last Cylinder or +size or +sizeM or +sizeK (1-1566, default 1566): 13 (を入力)
のようにして進める。
Command (m for help): t
Partition number(1-4): 1
Hex code (type L to list codes): fd
Changed System type of partition 1 to fd (Linux raid autodetect)
として「fd Linux raid 自動検出」のフォーマットにするのがポイント。
Command (m for help): a
Partition number(1-4): 1
として起動可能にするのも忘れずに。
pで設定を見れるので確認して、wで書き込み。
# cat /proc/mdstatで確認しつつ、
全てのパーティーションに対しRAIDを復旧。
md1 : active raid1 hda2[0]
73400896 blocks [2/1] [U_]
こうなってたら、
# /sbin/raidhotadd /dev/md1 /dev/hdc2
でRAIDを復旧。(時間がかかる)
最後に両方のHDDにMBRを書き直して終了
# grub
grub> root (hd0,0)
grub> setup (hd0)
grub> root (hd1,0)
grub> setup (hd1)
grub> quit
参考:
http://d.hatena.ne.jp/pyopyopyo/20061117/p1
http://www.linuxmania.jp/soft_raid_recovery.html
2009年05月03日
CentOSから「smbmount」コマンドが無くなったので「mount.cifs」で代用するメモ
GWだけど仕事関連の技術メモ。
CentOSから「smbmount」コマンドが無くなったらしいので「mount.cifs」で代用する。
root以外でmountするには権限が足りないと言われるので、その場合は
# chmod u+s /sbin/mount.cifs
# chmod u+s /sbin/umount.cifs
してやるしかないらしい。
$ /sbin/mount.cifs //192.168.0.152/matsui /home/matsui/mnt/ -o username=matsui,uid=matsui,gid=matsui,filemode=0664,dir_mode=0775
でマウント。
$ /sbin/umount /home/matsui/mnt
でアンマウント。
マウントしたファイルのパーミッションがおかしくなってしまう場合は、「CIFS Unix extensions」を事前に切る必要がある。
# echo 0 > /proc/fs/cifs/LinuxExtensionsEnabled
2007年10月15日
SenderIDを設定せざるを得ない
ドコモさんのせいで、全管理ドメインにSenderIDを設定せざるを得ない。
世間のプロバイダは、これに対応するんだろうか?
独自ドメインを持っている人は注意してください。
http://www.nttdocomo.co.jp/service/mail/imode_mail/sender_id/index.html
オレ仕事もプライベートも含めると、全部で何ドメインくらい管理してるんだろう?
20くらい?
参考:
@IT:Sender ID:送信者側の設定作業
http://www.atmarkit.co.jp/fsecurity/special/82senderid/sender101.html
SPF Setup Wizard
http://old.openspf.org/wizard.html
2007年10月12日
複数のNICが刺さってるマシンで送信元アドレスを固定する
技術メモ
複数のNICが刺さってるマシンで送信元アドレスを固定したい場合、iptablesを使うとよい。
例: メールは「192.168.1.1」から送信
# iptables -t nat -A POSTROUTING -p tcp --dport 25 -j SNAT --to-source 192.168.1.1
2007年09月09日
携帯端末全スペック一覧を作成しました
今までに国内で発売されたほぼ全て(Web端末のみですが)の携帯電話のスペック表を作成してみました。
このリストが非常に有用なのはわかっているんだけど、
メンテナンスするのが非常に大変なので、有志の皆さんがうまく集まって、
更新が機能してくれるといいなぁ。
2007年07月03日
Delphi For PHP
Delphi For PHP
どうなんすかねー。
基本マウスのドラッグ&ドロップで開発できるらしいですが。。。
近いうちトライアル版でも試してみようと思います。
使ったことある人いたら教えてください。
2007年06月23日
EM-ONEセットアップ
EM-ONEをセットアップ中。
PDAはいつの時代もセットアップに手間がかかる。(マニア向け商品だから?)
・ActiveSyncの設定
・2chビューアインストール
・画像ビューアインストール
・ムービープレイヤーインストール
・ファイラーインストール
・SSHクライアントインストール
・エディタインストール
・メール設定
・無線LAN設定
・USB経由でのインターネット接続設定
・Bluetooth経由でのインターネット接続設定
とりあえずこんな感じ。
PC<>Bluetooth経由での接続はとても便利。
これは楽だ。でも気になるのは電池の持ち。
カメラもまあまあ。
回線が早いので即メールで自分に送れるのが便利。
全体的にW-ZERO3よりは良くなってるなあ。
2007年06月03日
薄型/小型PC
インテルの薄型PC。
うんカッコイイ。
http://www.gizmodo.jp/2007/05/post_1567.html
こちらはPalmのラップトップ Palm Foleo。
コンセプトはPalmらしくて好き。
日本でも同じくらいの価格設定($499)で、起動の速度がPalm並に速ければ枕元用としてマジで買うかもしれん。
http://slashdot.jp/mobile/article.pl?sid=07/05/31/0844250&threshold=-1
まあ普通の人はこっちを買うか?
http://www.wince.ne.jp/snap/cnBoard.asp?PID=2463
2007年03月16日
NTTの障害でサーバが落ちてました
http://www.flets.com/const/nw_t_hokkaido_07037.html
本日上記原因により一時的にサーバに繋がらない状況となっていました。
関係者の皆様ご迷惑をおかけしました。
この辺りはフレッツサーバだとどうしようもないからなー。。。
やはりデータセンターに入れるか。
2007年03月04日
リアルタイム位置測定のケータイ版を作ってみました
先日作ったW-ZERO3を使ったリアルタイム位置測定のケータイ版を作ってみました。
GoogleMapにはケータイ用のAPIがないのでMapFanを利用してます。
これで待ち合わせも便利になるかなー?
※仕事じゃないのでまたまた無駄に凝って3キャリア動的対応です。
http://www.ninnin.net/~matsui/ichi2/m/
2007年03月03日
W-ZERO3の位置情報取得とGoogleMapでプライバシーゼロへ
以前もこんなのを作ったことがあったんですが、
W-ZERO3の位置情報取得機能とGoogleマップを合わせてパワーアップ版を作ってみました。
アドレスはこちら → http://www.ninnin.net/~matsui/ichi2/
W-ZERO3が定期的(今のところ1時間に1回)に位置をサーバに知らせて、
それをデータベースに保存します。
過去の日時も指定できるので、私がどういう行動を取ったのかは全て筒抜けです。
もう悪いことできない。
SPOTとかで立ち読みなんかしてた日にはバレバレですw
バックエンドのPHP+DB(SQLite)との連携もフルAjaxだったりします。
座標から住所を割り出したり(逆ジオコーディング)もしてみました。
仕事じゃないので無駄に凝ってたりして。
試しに近所を散歩してみました。
そのときのログがこれ。
1.http://www.ninnin.net/~matsui/ichi2/?d=200703021930
2.http://www.ninnin.net/~matsui/ichi2/?d=200703021940
ズームして確認するとフードセンターで買い物していることがわかります。
誤差は150mくらいでしょうか。結構良い感じに取れてます。
明日は車で出かけてみるつもりです。お楽しみに。
2007.03.04追記
ケータイ版作りました
http://www.ninnin.net/~matsui/ichi2/m/
2007年02月17日
SQLインジェクションを前提としたDB設計
最近技術的な話題を書いていないので、たまにはちゃんとしたものを書いてみようと思う。
今回はWebプログラミングとDB設計の話。
仕事柄他の人が書いたプログラムを目にすることが多いのだが、
当たり前と思われるDBの設計が行われていないので、これでいいのかなぁと思うことが良くある。
ユーザと権限の設定が全く行われていないのである。
ステートメントを使ってSQLインジェクションを防ぐのは最早当たり前だが、
環境によってはそれが使えない場合もあるし、多人数で行うコーディングにミスは付きものだ。
適切にユーザと権限を設定することによって、SQLインジェクションでの情報漏洩や被害を最小限にすべきだ。
シンプルな例をあげると次のような感じである。
管理画面のDB接続ユーザ: shop_admin
一般顧客画面のDB接続ユーザ: shop_user
・customer_tblに対し次のように設定
GRANT SELECT, INSERT, UPDATE, DELETE ON customer_tbl TO shop_admin;
→ shop_adminは、SELECT, INSERT, UPDATE, DELETEが行える
GRANT INSERT ON customer_tbl TO shop_user;
shop_userはINSERTのみ行える
このように設定しておけば、万が一ユーザ側の画面にSQLインジェクションの脆弱性があったとしても被害は最小限で済む。
管理画面側は関係者しか利用しないだろうし、パスワードによる認証をかけているのが一般的なので、被害にあうケースは少ないだろう。
基本的にユーザ数を増やして、権限を細かく分けるほど安全度は上がるのだが、
あまり細かく分けすぎると管理しきれなくなりミスを誘発するので、まあほどほどに。
さて、上記の例だとshop_userはcustomer_tblに対しINSERTしかできないのだが、これだと困る場合が出てくることもある。
例えば、「会員番号は乱数で生成しているが、同一の会員番号がないかチェックしてから登録したい」などといった場合である。
SELECTする権限がないため、同一の番号があるかをチェックできないのだ。
UNIQ属性をつけて、INSERT時にエラーになるかどうかでチェックすることもできるが、より条件が複雑になった場合には対処しきれないこともあるだろう。
こういう場合はどうすればよいかというと、情報量を最小限にしたVIEWを作ればよいのだ。
今回の例でいうと次のような感じである。
customer_tbl
id,
name,
address,
tel
のようなテーブルだとして
↓↓↓
CREATE VIEW customer_view AS SELECT id FROM customer_view;
GRANT SELECT ON customer_view TO shop_user;
このようにしておけば、最悪SQLインジェクション脆弱性があったとしても、参照されるのはidの羅列だけで済む。(住所・名前・電話番号は見れない)
この記事を見て、postgresとかrootとかでDB接続しているシステムが減るといいなぁ。(結構あるんだよ、これが)
2007年01月03日
PEARで他DBからOracleに切り替える時のメモ
PEARはDBに依存しないというが、まあそんなの嘘っぱちで結構手を入れなくてはならない箇所が多い。
ある程度予想はしていたが、思ったよりうまく動かない箇所が多くて痛い目にあったのでメモしておく。
1.OracleのDATE型には時刻も入る。なのでTIMESTAMP型(PostgreSQL)≒DATA型(Oracle)な感じ。
そのままではPostgreSQLで時刻が00:00:00になってしまうので、
TO_CHAR(date1, 'yyyy-mm-dd hh24:mi:ss')
TO_DATE(str, 'yyyy-mm-dd hh24:mi:ss')
といった感じで明示的に変換して使う。
2.PostgreSQLでは通る暗黙的なキャストもOracleではやってくれないのでしっかり記述する。
例: WHERE TO_DATE(date1, 'yyyy-mm-dd') = '2007-01-01'
3.OracleではDBフィールドを全て大文字で指定しなくてはならない、また取得した行数を得るnumRows()関数が使えない。
これを回避するためにconnect時にDB_PORTABILITY_ALLを指定してやる必要がある。
4.内部ポインタの関係からかnumRows()が一度しか使えないので、ループで使う場合などはすぐ別の変数に格納する。
5.INSERT時にシーケンスの値を自動で入れてくれたりはしないので、nextIdで値を入れるようにする。
6.text型はないのでLOB型などを使うことになるが、その際はそのままでは比較などができないので、「DBMS_LOB.SUBSTR(lob_fld)」のように関数で変換して使用してやる必要がある。
2006年11月05日
PHPでFlashグラフ生成(PHP/SWF Chartsを使って)
GIGAZINEのリンクから見つけた、「PHP/SWF Charts」というのがなかなかよさげ。
サンプルはこちら。
http://www.ninnin.net/~matsui/charts/sample.php
http://www.maani.us/charts/index.php?menu=Gallery
使い方は簡単で、表示用の定型PHPとプロット用のPHPの2つを用意してやればよい。
データのプロットはこんな感じ。
$chart [ 'chart_data' ] =
array (
array ( "", "2001", "2002", "2003", "2004" ),
array ( "Region A", 5, 10, 30, 63 ),
array ( "Region B", 100, 20, 65, 55 ),
array ( "Region C", 56, 21, 5, 90 )
);
配列での指定が少し面倒だけど、結果配列になればいいので、1つプログラムを挟めばYAMLとかで書くこともできそう。
最大の欠点としては日本語が通らないこと。
グラフ上はAとかBとかでごまかして、詳細は欄外に書くほかなさそうだ。
ライセンスはFreeとあるから、商用でも使えるのかなぁ。
ただ無料ライセンスのものだと、Flashをクリックすると本家のサイトに移動してしまう。
お金を払わないと馴染みのお客さん以外のところで使うのは難しいかな?
2006年10月22日
マインドマップを使ったテスト技法
マインドマップを使ったテストケース作成技法というのを試してみた。
(参考:ソフトウェアテストPRESS vol.3)
結論から書くと非常に良くて、ぜひみなさんにもオススメしたい。
サンプルを見ると一目瞭然だと思うので、まずそちらを見て欲しい。
従来はエクセルシートに、だだだっと並べて書いていくのが一般的だったと思うが、この方式は中央から枝葉をつけるようにテストケースを並べていく。
良い点、悪い点は次の通り。
○良い点
・早くて楽!!エクセルタイプより作成にかかる時間が少なくてすむ。
・マインドマップの特色でもあるのだが、連想でテストケースを考えていくため、感覚的に分かりやすく項目の漏れが少ない(よって初心者向けでもある)。
・エクスポート形式が豊富、PNGやJPGはもちろん、XML形式でも書き出せるので、マインドマップ形式で作成したものをエクセルで清書するという形もアリ。
○悪い点
・テストケースの備考的なメモ書き、テスト終了日やバグトラッキングIDを書く場所がない(アイコンをつけた時間が自動で記憶されたり、マウスオーバーでメモ書きを記入できるがそれではテスト成果物としては使えない)
・大きくなると印刷ができない
・会社によってはテスト納品物として通用しない場合も。
ちなみにマインドマップ作成に使ったソフトはFrreMindというJavaでできたオープンソースソフト。
日本語にも対応しているので安心。
http://freemind.sourceforge.net/wiki/index.php/Main_Page
エンタープライズ的な要素として使うにはまだ少し課題があるけれども、今まで体系づいたテストをしていなかったような小さなプロジェクトで使ってみるにはぴったりだと思う。
※FreeMind以外にも良いマインドマップ作成ソフトがあったら教えてください。
2006年08月31日
subversion導入
今まではCVSをそれほど不満なく使っていたのだが、先日のプロジェクトで大量リネームが発生していよいよイヤになった。
というわけで、リネーム処理が可能なsubversionに移行することにした。
まずはインストール。
本家(http://subversion.tigris.org/)に行くと、RH9用のバイナリがあったのでそれを使用する。
# rpm -ivh subversion-1.3.2-1.rh90.i386.rpm apr-0.9.5-0.2.i386.rpm apr-util-0.9.5-0.1.i386.rpm neon-0.24.7-1.i386.rpm
インストールは以上。
DAVを使ってのapacheとの連携も可能らしいが、2系を使ってないのでパス。
こちらもさすがにそろそろ移行時期か。
普通にローカルファイルとSSHで使うことにする。
使い方はCVSとほぼ同じで困ることはなかった。
・レポジトリの作成
$ svnadmin create /home/hoge/svn/reps
・プロジェクトの作成
$ svn import testproject file:///home/hoge/svn/reps/testproject
ただし、$Id$などのキーワードの置き換えは明示しないと行われないようだ。
・キーワードの置換指定
$ svn -R propset svn:keywords "Id" *
・コミット
$ svn commit
addし忘れているファイルなどの一覧は、
$ svn status
で表示されるようだ
CVSを使ってれば違和感がないし、普通に使いやすい。
細かい使い方はまた後日。
参考サイト:
http://subversion.bluegate.org/doc/book.html
http://www.fuga.jp/~densuke/hiki/?subversion
2006年08月11日
テストツールSeleniumについて
「テスト革命」や、「次世代テストツール」と言われ、最近評判のSeleniumを使ってみた。
Seleniumについての概略はこの辺を、もうちょっと詳しい内容についてはこの辺を見るといいだろう。
本家はこちら。日本語版リファレンスはこちら。
要はマクロのようにブラウザの動作をJavaScriptとして録画(?)できて、それを色々なブラウザから再生できるというものだ。
(これは本来はSeleniumIDEの機能なのだが、IDEはもう無くてはならないものだし、面倒なので一緒にして語ってしまうことにする)
Googleで検索すると色々なレポートが出てくるが、プログラマの意見は多いが、テストを生業としている人のレポートはほとんど無い。
(おそらくテスト自体をメインの仕事としている人自体がとても少ないのだろう)
今回は、実務としてのテストに耐えうるかという観点からSeleniumを評価してみたいと思う。

Google上で「test」という値で検索を行うというテストの例
・Seleniumのポイント
Selenium最大のポイントは、「テストに再現性がある」ということだ。
一度テストケースを作ってしまえば再生ボタンを押すだけでテストが行える。
欠点としてはテストケースを作るのにはある程度手間がかかる、全てのテストをSeleniumだけで行えるわけではないということだ。
Seleniumで行えるのは単体テストと結合テストの中の一部だけである。
・テスト仕様書の代わりとしてのSelenium
テスト作業を外部に出すと、テスト結果がNGなのにOKを付けて返ってくるケースが良くある。
時間が無い、テスト内容を理解していない、面倒くさいなどの理由でこういうことが起きるのだろうが、Seleniumを使うことでこれを防ぐことができる。
何しろ納品物を再生するだけでテストが自動で行うことができ、検収が数分あれば行えるので、言い逃れができないのだ。
Seleniumのテスト項目自体がいい加減な場合はどうしようもないが、どちらにせよ従来のテスト仕様書でもレビューという工程は外すことができないため、同じようなものだ。
しかしながら、レビューに要する時間はSeleniumの方がかかってしまうかもしれない。
またテスト仕様書を作成する手間も(十分慣れるまでは少なくとも)Seleniumの方が大きいだろう。
ただしテストフェーズにかかる時間が大幅に短縮できるので、全体としては工数の削減が見込める。
またSeleniumの作成・レビュー性が決して低いわけではない、HTMLのテーブル形式で作成されるため、扱いやすい。
専用ツールなどを自作すれば更に便利だろう。
またテストを業務で行うとエビデンス(根拠)というものの提出を求められることがある。
これは実際にテストを行ったかどうか、その結果が妥当だったかどうかを検証するために証拠のようなものだ。
通常、各テスト項目毎にログや画面ハードコピー、DBダンプなどの提出を行う。
Seleniumを使えば、それ自体がエビデンスの役割を果たしているため、いちいち証拠を記録・保存するという面倒な作業をしなくても良い。
これはテスト工数の削減に大きな効果がある。
・実際どの程度使い物になるのか
「値を自動で入力させる → ベリファイ」
という流れがメインになるため、フォームの値チェックが正確に動作しているかなどに使うのが一般的だろう。
業務WebアプリケーションによくあるようなDBへの値の書き込みなどは、値を表示するテスト専用ページを作成してチェックする必要が出てくるため、「プログラムのテストを行うために新たなプログラムを作成する」という本末転倒な事態が起きてしまうためにあまり向いていないと思われる。
肝心の使い勝手はというと、現状それほど良くはない。
ちょっと込み入ったことを行おうとすると前述したようにプログラムの作成・修正が必要になる。
具体的にどこがどう良くないか、どう改善すべきかなどについては、もう少し使い込んでみて後日また改めて報告する。
・動作確認用途としてのSelenium
個人的にはSelenium売りはココだと思われる。
ソフトウェアのバージョンを変更する際や、サーバ移行など環境を変更する際の動作確認に使うのだ。
通常、サーバ保守者とプログラム開発者は別々の場合が多い。
またサーバ保守者はアプリケーションの中身など理解していない。
PHPなんかはバージョンを上げるとプログラムが動かなくなることは多々あるので、バージョンアップをし一見動いているが、一部機能が死んでいたなんてことは良くある話だ。
その都度、開発者を呼んでくるのはコストがかかるし、無理な場合も多い。
開発時にSeleniumのテストケースを作成させ、一通り納品させておけば、運用側はこれらのリスクを回避できる。
これは大きい。
・まとめ
1.Seleniumはテストを自動化し、ごく簡単にテストの再現ができる
2.テストケースを作ったりレビューするのには、(慣れの問題もあるが)従来の形よりやや手間がかかる。が、テストフェーズにかかる時間はごく僅か
3.全てのテストに使えるわけではない、行えるのは単体・結合テストの一部分でしかない
4.環境変更時の動作確認用途としては、Seleniumはとても有用。長期運用を考えているならプログラムと一緒にテストケースを作成させ、納品させておくべき
2006年07月27日
OP25B
今更なんですが、「Outbound Port 25 Blocking」のせいで問い合わせが。
http://www.plala.or.jp/access/community/mailplus/smtp_auth.html
これを見る限り、587ポート+SMTP Authであってもぷららのメールアドレス以外は送信させて貰えないように見えるが、Fromのアドレスはチェックしてるんだろうか?
だとしたらplalaで独自ドメイン利用している人はどうしてるんだろうか。
とりあえず今後いろんなプロバイダに波及することを想定して、自分のサーバでも587ポートの開放とSMTP-Authを実装しておくか。
qmailからもそろそろ移行かな。
2006年06月25日
RSSを出力するクラスを作ってみた
PHPからRSS(RSS1.0, RSS2.0, ATOM1.0)を一斉出力するクラスを作ってみた。
http://www.kanzaki.com/docs/sw/rss.html
http://hail2u.net/documents/rss20notes.html
この当たりを参考に見よう見まねで作ったため、正しいのかよくわからないけれど、
http://www.w3.org/RDF/Validator/
http://feedvalidator.org/
この辺のチェックサイトでは全てOKが出るので、多分大丈夫なのだろう。
近いうちにke-tai.orgで公開する予定。
(携帯とは全く関係ないんだけどさ)
手持ちの仲間うち掲示板もRSS対応にしたいなぁ。
2006年06月13日
お国がNTPサーバを開設
http://slashdot.jp/article.pl?sid=06/06/12/2111252
イイヨイイヨー
これで福岡大学も救われるんじゃね。
もう少し安定度を見て、徐々に手持ちのサーバをここに依存するようにしていこう。
大した額でもないだろうし、こういうことになら多少税金を使ってもらってもいいです。
※いや実は大した額なのか??
2006年04月06日
Smarty原理主義
Smarty原理主義 【すまーてぃ げんりしゅぎ】
Smarty様を愛し、Smarty様にできることは何でもやっていただく、それがSmarty原理主義です。
あなたもSmarty原理主義者になりませんか?
仲間に加われば著しい開発スピードの向上に繋がることでしょう。
Smarty原理主義は次のようなポリシーでプログラミングを行います。
・一度作成したPHPプログラムは基本的に改編しない。
・処理によって複数のPHPを作り分けるようなことはしない。
・PHPでもSmartyでもどちらでもできるような処理の場合はSmartyで処理する。
・処理時間、メモリの使用量は気にせず、開発工数の削減のみに注力する。
具体的なプログラミング例を書きましょう。
1. escape処理はSmaty様にやっていただきます。
$smarty->default_modifiers = array('escape:html');
2. メソッドからの値の取得などもSmarty様の仕事です。
予約変数$smartyを活用しましょう。
環境変数についても同様です。
{$smarty.post.hoge}
{$smarty.env.puge}
3. DBの値はSELECT * で、常に全件をセットします。
男たるものフルタイム・フルパワーです。レコードが1万件あれば1万件セットしましょう。
結合できるテーブルがある場合は、最大まで結合した状態でSmarty様に捧げましょう。
※処理は省略 $DB[テーブルのフィールド名][キー値]の形で、全テーブル情報をセット
このようなassignを行うPHPプログラムを書いておけば、もう2度とPHPを修正する必要はありません。
Smarty様の采配で全ての動作を変える事ができるのです。
つまり、
「1万件のレコードを一覧表示する」ページも、
「その中の1件だけを表示する」ページも、
1つのPHPプログラムを用意するだけでいいのです。
{if}を使って1件だけ表示させ、あとはグルグルまわしておけばいいのです。
うわぁSmarty様は偉大だ。
たかだかWhere文で条件を1つ追加するぐらい簡単だろうって?
画面が違うということは、PHPプログラムを修正した後に、どうせテンプレートもいじくるのです。
ならばテンプレートの変更のみで対応した方が楽では無いですか!
処理に時間がかかるだろう?
無駄にメモリを食うだろう?
Smarty様に資源が食われるならCPUもメモリも本望というものじゃないですか!
大体レコードの数を数えてください!テーブルサイズを見てみてください!
あなたの受けた数万円レベルの案件にそんなにデータが入っていますか?
アクセス数だって30件/日がいいところでしょう?
そしてアクセスが多いサイトだってSmartyキャッシュ様をうまく使うことで大体は解決できるのです。バンザイ。
Smartyなんて使わなくても<?=$hoge?>でいいだろうって?
ああ、そんな恐ろしいことは考えてはいけません。
あなたはきっと来世で不幸になります。
だいたい腐れPHPなんかでロジックを書くより、Smarty様のエレガントな書式(例:section)で書いたほうが幸せになれます。
そんなSmarty様も実はPHPで書かれたりしていて、自己矛盾を抱えたお姿が僕ら人間に疑問を与えてくれます。
ああ、生きるってなんなんだろう。
こんなSmarty原理主義を使ってCRUDアプリケーションを作ってみました。
サンプルは近日公開予定です。お楽しみに。
※このエントリーには多分に冗談が含まれています。真に受けないで下さい。
しかしながら工数削減に関しては本気です。
2006年03月09日
qmailadminに致命的なセキュリティホール
http://www.netsecurity.ne.jp/1_6148.htmlより
▽ QmailAdmin--------------------------------------------------------
QmailAdminは、細工されたリクエストをPATH_INFO環境に送信されることが原因でバッファオーバーフローを引き起こされるセキュリティホールが存在する。この問題が悪用されると、リモートの攻撃者にシステム上で任意のコードを実行される可能性がある。
2006/03/08 登録
危険度:高
影響を受けるバージョン:1.2.10
影響を受ける環境:UNIX、Linux
回避策:1.2.10以降へのバージョンアップ
qmailadminはsetuidされてるのでまさに危険度「高」。
1.2.10以降のバージョンはまだリリースされてないぽいなぁ。
qmailadminは停止か、BASIC認証付きで信頼できるユーザのみ対象ってことで。
2006年03月06日
Oracle無償版
とうとう出たみたいですね。日本語も通るらしい。
http://slashdot.jp/developers/article.pl?sid=06/03/06/0053237&threshold=-1
さて、政局を一変させるであろうこのソフト。
出来はどうなんだろう。
2006年02月02日
W-ZERO3で位置情報取得
W-ZERO3の位置情報取得関連。
以前作ったプログラムでは動かないらしい。
http://blog.livedoor.jp/hayasuda/archives/50305369.html
http://www.memn0ck.com/log20060115.html
http://d.hatena.ne.jp/borbis/20051218
何かと結構便利だったので、時間ができたら作り直してみます。
2006年02月01日
ケータイフレームワークKEMPβリリース
PHPで作られたケータイ向けフレームワーク「KEMP」というものを作ってみました。
http://ke-tai.org/index.php?KEMP

主に3キャリア対応のページ作成の省力化に役立ちます。
最近のフレームワークにあるような、多種多様な機能は実装されていません。
あくまでケータイ向けシステム開発を省力化するために必要な最低限の機能を盛り込みました。
KEMPの主な機能は次の通りです。
* 3キャリア自動対応
o 絵文字の自動変換
o 画像フォーマットの自動変換(自動でキャッシュに対応画像を生成)
o 入力モード設定(漢、a、1)の自動変換
o iモード絵文字の自動色付け
* 携帯向け開発補助
o 画面移動
o QVGA, 非QVGAによる画像サイズの振り分け
o 端末IDを使った認証
o ブラウザの「戻る」機能を使った不正の抑止
o 全角→半角自動変換(カナ、英数、記号)
o HDML専用機の排除
* その他
o エラー抑止
o ログ出力
大規模運用には向きませんが、なかなか便利なものができたと思います。
まだまだ汚い部分があるので、徐々に開発を続けていこうと思います。
※次回の札幌IT勉強会のネタはこれで決まり?
2005年11月05日
PHPセキュリティホール問題のまとめ
「PHPに“最悪”のセキュリティ・ホール,全ユーザーは今すぐ対処を」
http://itpro.nikkeibp.co.jp/article/NEWS/20051102/223939/
こんな見出しでエンジニアを驚かせた今回のPHPのセキュリティホール問題。
落ち着いてきたので、ここらで一度まとめようと思います。
php.gr.jpからもリンクを貼られている信頼できる情報元はこれです。
http://blog.ohgaki.net/index.php/yohgaki/2005/11/03/phpa_rc_fei_a_oa_oa_fa_sa_le_acsa_oe_afp_1
要約すると次のとおりです。
今回のセキュリティホールまとめ
1. register_globals = Off であれば問題ない
2. Offの場合でもparse_str関数を正しく使っていないと問題があることがある
3. import_request_variables等を使って変数を展開していると、結局Onと同じになってしまうので問題あり
4. PHP4.4.1および5.0.6(現時点では未リリース)では問題なし
仕組みを考えるとfile_upload = Offでも防げそうな気がしますが、OffでもPHPはとりあえず受け取ってしまうようで、どうやらそれではダメなようです。
またregister_globals = OffでもPEAR.phpで$GLOBALSを使っているためアウトという情報もちらほら出てきていますが、どうやら問題は無いように思います。
(両者とも未確認情報ですが)
さて、過去の遺産などを使っているため、register_globalsをOffにできない人も多いでしょう。
(OSCommerceを使っている人は今頃泣いているでしょう)
そんな人は4.4.1にアップデートしないといけませんが、次のような問題があるようです。
4.4.1にアップデートする場合の注意点
1. 仕様変更により定数の使われ方が変更になった
2. mb_send_mailの第五引数が無視されるという問題があるようだ
http://ns1.php.gr.jp/pipermail/php-users/2005-November/027873.html
3. mb_encode_mimeheader()が正常に動作しないようだ
http://ns1.php.gr.jp/pipermail/php-dev/2005-July/001159.html
1の例としては下記のとおり(引用)
> 引数に参照を期待している関数に対して、変数以外が渡せなくなった。
>
> 例えばこんなコード。
> PHP4.3.10 では正常に動作し、3 と表示される。
> PHP4.4.x ではエラーになる。
> echo array_pop(explode('-', '1-2-3'));
>
> こう書けばどちらでも正常に動作する。
> $work = explode('-', '1-2-3')
> echo array_pop($work);
2はsendmailを使ったメール送信時にtオプションでのエンベローブFromを指定できないことを意味します。
回避方法はmb_send_mailを使わず、文字コード変換のコードを追記しsend_mail関数を使うか、fopenで直接sendmailを利用するかしかないでしょう。
3は他の方法でエンコードを行うか、
例: $str = "=?ISO-2022-JP?B?" . base64_encode($str) . "?=";
文字列が固定の場合は、あらかじめエンコードした文字列を入力しておくという方法で回避するといいと思います。
旧: $subject = "テスト";
新: $subject = "=?ISO-2022-JP?B?GyRCJUYlOSVIGyhC?=";
なお上記のMLに対策パッチも公開されています。
現時点では4.3.11 + patch というのが現実的な解かもしれないです。
(パッチは未検証だそうです)
またややこしい話ですが、4.3.11にはmb_detect_encoding, mb_convert_encodingに関するバグもあるようです。
こちらはさほどクリティカルな問題ではないように思えます。
こちらも対処する場合は、4.3.11 + patch + patchという形になりますね。
[PHP-users 25298]
http://ns1.php.gr.jp/pipermail/php-users/2005-April/025814.html
そのパッチ
http://cvs.php.net/diff.php/php-src/ext/mbstring/libmbfl/mbfl/mbfilter.c?r1=1.1.2.6&r2=1.1.2.7&ty=u
別のアプローチとしては、mod_rewriteを使った方法も出ていました。
RewriteEngine On
RewriteCond %{REQUEST_METHOD} "^POST$"
RewriteCond %{HTTP:Content-Type} "^multipart/form-data"
RewriteRule ^/path/to/php/scripts/ - [F]
で、multipart/form-data自体をApache側で弾いてしまうやり方です。
検証はしていませんが、効果ありではないでしょうか。
2005年10月19日
携帯版を作りました
Blogの携帯版を作りました。
http://ninnin.net/mblog/
MT4iというプログラムを使いました。
http://www.hazama.nu/pukiwiki/index.php?MT4i
設置ファイル名とかが変更できなくて不便だなぁ。
ちょっとだけ改良させてもらうべか。
ついでに携帯から更新できる仕掛けも作りました。
こちらには「post2blog」を使用。
設置はこの辺りを参考に。比較的簡単。
http://yokku.com/notes/2005/09/moblog.html
2005年10月10日
CFのLANカードを買ってみた
CFサイズのLANカード「LPC-CF-CLT」を買ってみた。
ビックカメラで3549円の18%還元。
早速ザウルスに装着してテスト。ドライバ類は必要ないようだ。

うーん、すごい出っ張り具合だ。邪魔くさい。
でも128kのbitwarpよりは全然早い。
ザウルス標準ブラウザのNetFrontだと、動作が遅いのでイマイチだけど、Operaを使うとPCと同じ感じでブラウジングできる。
あとはOperaが日本語のインライン入力に対応してくれたらなぁ。。。
2chブラウザのq2chはあまり変わらず、有線のメリット無し。
テキストデータだけだと、128kで十分だね。
っていうわけで、家で使う場合でもCFスロットは再びbitwarpが占拠しました。
使っていないジョルナダにでも装着してみるか。。。
2005年10月05日
/usr/sbin/sendmailからのメール送信
以前Perlで作った携帯向けのメール送信プログラム。
Vodafoneのごく一部の機種でおかしなメールが送られるという。
届かなかったり文字化けするわけではなくメールの一部が欠損するという。
んなアホな。
いろいろテストしてみて確認したところ、メールヘッダとボディとの間に入る改行コードを\n(LF)としていたことが原因だった。
はいはい、調べてみたところ確かに正しくはCR+LFのようですね。
このサイトを参考に作ったのだが。。。間違ってるじゃん。
http://www.stackasterisk.jp/tech/program/perl03_03.jsp
検索してみた限り、他のサイトも間違いまくり。
いやいや人にせいにしてはいけないよね。
勝手に参考にさせてもらってるだけで、むしろ感謝しなくちゃなりません。
つーか、nkfでJISコードに変換して送ってるけど、JISとISO-2022-JPって微妙に違うものだよなぁ。。。
なんだか全てが心配になってきた。
今のところ問題は起きていないようだからまあいいか。
次からは自分で書かずモジュールを使うようにしよう。
しかし他のキャリア、端末だとなんともないんだけどなぁ。
Vodafoneシビアすぎ。さすが世界規格。
2005年09月08日
PEAR本が出るようです
PEAR本が出るらしいです。
目次はここに載っているようです。
http://www.wings.msn.to/index.php/-/A-03/4-7981-0959-2/
うーん。
HTML_QuickFormなんかはこのページ数だけでは絶対に足りないと思うけど、使ったことがないものも多く掲載されているし、とりあえずは買いかな。
ちなみにPHPプログラマーズマガジンにも「PEAR徹底解説」というコーナーがあります。
オススメ。(でも高いんだよなぁ、せめて今の半額が適切)
http://www.asial.co.jp/magazine/backnumbers.php
2005年08月13日
FirefoxのonErrorで自動リロードがかかる
IEでは普通に動くのにFirefoxだけおかしな動きをするという事態に陥った。
しばらく原因がつかめずにいたがapacheのaccess_logを見るとPHPのGETが複数回行われていることに気がついた。
画像アップロード機能を作っていたので、壊れた画像等の理由で表示できない場合、JavaScriptのonErrorでNoImageという画像を表示させていた。
その際、ブラウザが画像の他にもページ自体をGETしなおしているらしい。
その結果、せっかく設定した値がDBからの読み込み値で上書きされ、おかしな動きをしていたらしい。
うーん、ブラウザによって結構動きが違うもんだね。
あまり遭遇しないケースだとは思うけど、onErrorを使う場合は注意が必要かと。
2005年08月12日
HTML_QUICKFORMでHTMLタグの入力を許可する
HTML_QUICKFORMを使用してフォームを作った場合、入力画面でHTMLのタグを入力しても、確認画面(Freeze状態)ではエスケープされた状態で表示されてしまう。
HTML_QuickForm::freeze()のマニュアルを見ても
Freezes the elements: elements' values will be displayed without HTML input tags.
とあるので意図的にやっているのだろう。
grepをかけて調べて見た限りでは代わりの関数も無さそうだ。
幸いなことにレンダラーにはSmartyを使っている。
そこで苦肉の策としてSmartyの修飾子で強引に逆変換することにした。
具体的にはこんな感じ
通常
{$form.hoge.html}
逆変換
{$form.hoge.html|replace:'<':'<'|replace:'>':'>'
|replace:'&':'&'|replace:'"e;':'"'}
replace修飾子を使って強引に置換し直しているだけ(笑)
きっと動作は遅いが良しとする。
逆変換するのは、Freeze後の画面だけで良いのに、これだとFreezeしてない状態のフォームにも影響を及ぼしてしまうので、更に次のような仕掛けを付ける。
$smarty->assign('isFrozen', $fm->isFrozen());
のようにFreeze状態をSmarty変数に記録しておき、
{if $isFrozen}
{$form.hoge.html|replace:'<':'<'|replace:'>':'>'
|replace:'&':'&'|replace:'"e;':'"'}
{else}
{$form.hoge.html}
{/if}
のように書いてやればOK。
これでHTMLの入力が可能になる。
Smartyの「register_modifier」を使ってやればもっとスマートに書けるのだろうが、私の環境だと文字化けを起こしたので止めた。(テンプレートがSJISだから?)
2005年07月08日
カカク関連で興味深い記事が
地味に忙しい。
今月だけで締切り2つで、今日さらに1個追加で合計3個。
暇なときは暇なくせに、入ってくるときは同時に来るんだよなぁ。
SQLインジェクション攻撃に気づかない企業は山のようにある
http://itpro.nikkeibp.co.jp/free/NPC/NEWS/20050706/164102/
SQLインジェクションにはWebサーバのアクセスログ分析が有効と。
なるほど、興味深い。
結局はツールによるアタックが多いってことか。
他人が作るプログラムまで全てチェックできる訳でもないし、自分にすらミスが無い保証なんてないしね。
業務系ページでも毎日アクセスログ分析&チェックしとけってことだね。
そろそろmod_securityでも試してみるか。。。
2005年06月24日
CやJavaでcrypt()を使う
最近Linux上でC言語やらJavaやらの仕事がちょこちょこ入ってきて、よく分からないながらもいじったりしている。
Javaはいいとして、Cはホントによく分からん。とりあえず動いてはいるようだけど。。。
プラットフォームによっては輸出規制の関係でunixcryptとは名ばかりで、中身はmd5だったりするらしい。
試してみたところ、下の2つとperl, PHP標準のcrypt関数で同じ結果が取得できた。
gccならそのままcrypt()が使えるようだ。詳しくはman cryptかinfo cryptを参照。
#define _XOPEN_SOURCE
#include <unistd.h>
・
・
・
print crypt(key, "st");
1.4系なら関数が用意されているらしいが、1.3系の場合は存在しない。
http://www.cryptix.org/ から「Cryptix V3 3.2.0」をダウンロードして、中に入っているcryptix32.jarを読み込むようにする。
eclipseを使用している場合はビルドパスとクラスパスに加えてやることで使えるようになる。
コマンドラインからjavacしている場合は、コンパイル時のクラスパスと、実行時のクラスパスに加えてやれば良い。
import cryptix.tools.*;
・
・
・
UnixCrypt objCrypt = new UnixCrypt("st");
System.out.println(objCrypt.crypt("key"));
なお、postgres.orgのJDBC用のjarにも似たようなクラスがあるようだが、まだ試していない。
※key:暗号化の元になるキー、st:Salt
2005年06月06日
HTML_QUICKFORMのメールチェック機能でVodafoneのメールが通らない
HTML_QUICKFORMのチェックタイプ「email」だとVodafoneのメールが正常にチェックできない。
詳しく言うと、J-Phone時代には「?」が許可されていたが(今は使えない)、そのまま引き継いだアドレスだと、不正なメールアドレスとして判断される。
まあ開発者も、まさか極東の小国で?がアカウント名に使われてるとは思うまい。
ちなみに「/」は大丈夫でした。
ユーザチェック型が定義できるので、仕事で使うなら作り直さなきゃだめだなぁ。
こんな感じかな
/^[a-zA-Z0-9\._\/\?\+-]+\@+[a-zA-Z0-9\._-]+\.+[A-Za-z]{2,3}$/
PHPのpg_escape_string関数をSJISで使うと不具合が発生するケースがある
PHPのpg_escape_string関数(SQLのエスケープを行う関数)をSJISで使うと不具合が起こるケースがあるようだ。
SJISで使用してもほとんどの場合、不具合は起こらないように見えるが、例えば「能」で終わる文字列をpg_escape_string関数にかけると、
Warning: pg_query(): Query failed: ERROR: unterminated quoted string at or near xx
というエラーが発生する。
「能」という文字が含まれているだけだったり、EUC-JPだとエラーは起こらない。
古いWindows98等のブラウザ(バージョンアップしてない)だと、EUC-JPで不条理な文字化けなどが起こることも多いので、私は最近、Postgresのclient_encoding機能を使って、ALL-SJISでの開発を行うことが多い。
SJISをご利用の皆さんは注意。
2005年04月23日
FTPアクセスのみのレンタルサーバでSQLiteを使う
仕事の規模的に、どうしてもレンタルサーバを使うことが多い。
むろん専用サーバは高くて使えない。
自前サーバに相乗りしても良いのだが、最近のレンタルサーバは月500円〜1500程度で十分なものが借りられ、自前サーバに比べればセキュリティ的にも安心感がある。
MySQLやPostgreSQLが使えるレンタルサーバも増えてきたが、オプション料金がかかることが多い。
現在利用しているFTP操作のみのプロバイダで強引にSQLiteを動かしてみることにした。
SQLiteを利用する理由はプロセスが上がらないタイプのDBであること、DB内容はファイルに落ちるので、FTPのみでも管理しやすいことなどである。
まずは下準備を行う。
書き込み可能(777)のディレクトリを用意、ここではworkという名前にする。
<?php
system("/bin/pwd");
?>
でフルパス確認。
<?
system("/usr/bin/which hoge");
?>
でコマンドのパスを確かめながら作業を行う。
http://pecl.php.net/package/SQLiteから.soのソースをダウンロード。現在の最新版は1.0.3なのでそれを使う。
ローカルで解凍してwork以下にFTPでアップ。
コンパイル時にファイルが色々と生成されるので、アップしたディレクトリ(この場合は「SQLite-1.0.3」と、「SQLite-1.0.3/libsqlite/src/」)のパーミッションは777に変更する。
<?php
system("cd /home/hoge/public_html/work/SQLite-1.0.3;/usr/local/bin/phpize 2>&1");
?>
を実行。(パスは環境によって違うので上記のpwdとwhichで調べること)
Configuring for: PHP Api Version: 20020918 Zend Module Api No: 20020429 Zend Extension Api No: 20021010
のように表示されれば成功。
<?php
system("cd /home/hoge/public_html/work/SQLite-1.0.3;./configure 2>&1");
?>
を実行。成功するとダラダラと英文字が表示され、creating ./config.status config.status: creating config.hで止まるはず。
no such hogehogeというエラーが出る場合はパーミッションを再度確認。
php-configというエラーが出る場合は--with-php-config=/usr/local/bin/php-configといった感じでオプションをつけてやると良いだろう。
<?php
system("cd /home/hoge/public_html/work/SQLite-1.0.3;/usr/bin/make 2>&1");
?>
を実行。
makeが最後まで実行されると「SQLite-1.0.3/modules」以下に「sqlite.so」ができるはずなので、これをどこかにコピーしてキープ。
残りはもう要らないので「SQLite-1.0.3」ディレクトリごと削除。
パーミッションがアップしたFTPユーザのものとmakeやconfigureでWWWユーザのものがごちゃ混ぜになってるので、FTPソフトで丹念に消した上で、「system("/bin/rm -rf /home/hoge/public_html/work/SQLite-1.0.3");」のようにすれば良いだろう。
一歩間違えると、WWWユーザが消せる全てのファイルを消してしまいかねないので、十分注意すること。
最後に動作確認。PHPファイルとライブラリを同じディレクトリに置き、
<?php
if (!extension_loaded("sqlite")) {
dl("sqlite.so");
}
?>
でエラーが出なければOK。あとは普通にSQLiteが使えるはず。
なお、上記の方法は自己責任で試して欲しい。
環境によってはできないだろうし(管理者のポリシーによってはmakeを入れていないであろう)、場合によってはサーバ管理者に怒られることもあるかも知れない。
参考:
http://ns1.php.gr.jp/pipermail/php-users/2004-September/023772.html
2005年04月22日
バグ管理システム「影舞」を使ってみる
バグトラッキングシステムの影舞を使ってみた。
(UNIX USER 2005年2月号が参考になる)
今まではPHPBugTrackerを使ってたんだけど、色々不満があったので、他のBTSを探していた。
PukiWikiのバグトラックは使ってみたけどさすがにシンプルすぎるし、Bugzillaは使ったことが無いがどうも大げさすぎるようなので、小規模向けに開発された影舞はぴったりだと思い試してみることにした。
BTSは使ったことがない人も多いと思うが、3人以上(開発者だけでなくテスターや進捗管理者も含む)で作業する際は、あるとぐっと便利になる。
一人で作業する場合も、変更履歴を追いやすいので忘れっぽい人にはかなりの効果があるだろう。
http://www.daifukuya.com/kagemai/からソースをダウンロードしてインストール。
kagemaiユーザを作ってインストールする方式と、FTPなどで直接public_html下にインストールする方式が選べるが、手軽な後者を選択した。
DBにはPostgreSQLやSQLServerも選択できるが、管理が楽なテキスト形式(XML)とした。
基本的にはtgzを解凍してhtml/*.cgiにパーミッションを与え、kagemai.confおよびkagemai.conf~とprojectディレクトリにWeb権限からの書き込みを許すだけ。
cgi-bin以下でないとプログラムが動かない設定になっている場合は、.htaccessに「Options +ExecCGI」と書いておいてやれば動くようになる。
使い方は簡単で当然日本語なので、実際に使ってみればすぐわかる。
個人的感想としてはう〜んな感じ。
ユーザ個別にアカウントがないのが気になる。
admin, user, guestの3つしか権限が無く、それぞれBASIC認証などで制限をかける仕掛けらしい。
もちろんユーザリストは作成できるのだが、個別ログインという概念がない。
BTSのキモは、自分に割り当てられた担当バグを一目でわかるところだと思うのだが。。。
他は良い感じなので、もう少し使ってみることにする。
2005年04月11日
PHSの位置情報取得サービスで遊んでみる
てなわけで作ってみました。
プライバシーゼロの「matsui」はココだ!ページ
http://ninnin.net/~matsui/ichi/
私が今どこにいるかがわかります。誤差は約150mです。
携帯対応です。
待ち合わせなんかに使うと便利かも。
ドコモの携帯で作れば、iアプリと連動してもっとスマートにできたんだろうけど、パケ代の壁が・・・。
いつか定額制を導入したら作ろう。
ソースは近々ke-tai.org上で公開しておきます。
しかし、ウィルコムの公式技術情報ページってどこにあるんだろう?
見つからないので結局Googleで調べて作ったよ。
【追記】
発見しました。
http://www.willcom-inc.com/p_s/products/airh_phone/homepage.html
2005年03月31日
Smartyで静的htmlを生成する
HPを作成する際に、管理画面からDBやテキストファイルに情報を記録して、それを読み出して表示する、
というのは良くある手法だが、アクセスがあるたびにデータソースにアクセスすることになるので、負荷が高くなりやすい。
そこでデータソースの更新時にHTMLファイルを生成し、普段はそれをincludeするという方法を試してみた。
やり方は幾つか考えられ、当初はSmartyのoutputfilterを利用し、出力前のデータを取得する、
という方法をとっていたが、PHPのアウトバッファーを利用した方が簡単のようなので、その方法をとることにした。
下記のそのサンプルを掲載する。
(Smartyクラスの生成等は省いたコア部分のみのソース)
# 出力サンプルPHP
ob_start(); //アウトバッファーSTART
$smarty->display('[テンプレートHTMLファイル]');
// 出力を取得しファイルに出力
$fp = fopen("[出力HTMLファイル]", "w"); //書き込みモードでファイルをオープン
if (!(empty($fp))) {
flock($fp, LOCK_EX);
fputs($fp, ob_get_contents()); //データの書き出し
flock($fp, LOCK_UN);
fclose($fp);
}
ob_end_clean(); //アウトバッファーをクリア
2004年11月26日
SmartyでSJISを使う
SmartyではSJIS(Shift_JIS)はそのままでは使えない。
なぜならば、Smartyの標準のデリミタである「{」(0x007b)と「}」(0x007d)をSJIS文字列が含んでしまっていることがあるからだ。
(つまり必ずしもエラーにはならないので注意)
エラーが起こった場合は次のようなメッセージが表示される。
Fatal error: Smarty error: [in path/to/tpl.html line 10]: syntax error: unrecognized tag: ‹ (Smarty_Compiler.class.php, line 439) in /path/to/Smarty/Smarty.class.php on line 1095
これを回避するには、主に次の2つの方法がある。
1.デリミタを変更する
波カッコが問題なのであれば、それを変更してしまえばよい。
次のようにしてデリミタを変更することができる。
$smarty->left_delimiter = '{{';
$smarty->right_delimiter = '}}';
当然のことながらデリミタを変更したのだから、テンプレート内のSmartyタグを変更しなくてはならない。
例:
修正前 : {$smarty.server.SCRIPT_NAME}
修正後 : {{$smarty.server.SCRIPT_NAME}}
プリフィルタとポストフィルタを設定することで、Smartyでテンプレートが処理される際に、テンプレートがEUC-JPとして処理され、その後再びSJISとなって出力される。
※この方法を使った場合にはドコモの絵文字が文字化けしてしまうので注意が必要。
絵文字を使いたい場合はSJIS方式ではなく、&#xxxx;方式で書く必要がある。
$smarty->register_prefilter("convert_encoding_to_eucjp"); $smarty->register_postfilter("convert_encoding_to_sjis");
//--------------------------------
// Smarty SJIS対応用関数1
//--------------------------------
function convert_encoding_to_eucjp($template_source) {
if (function_exists("mb_convert_encoding")) {
//文字コードを変換する
return mb_convert_encoding($template_source, "EUC-JP", "SJIS");
}
return $template_source;
}
//--------------------------------
// Smarty SJIS対応用関数2
//--------------------------------
function convert_encoding_to_sjis($template_source) {
if (function_exists("mb_convert_encoding")) {
//文字コードを変換する
return mb_convert_encoding($template_source, "SJIS", "EUC-JP");
}
return $template_source;
}
検証
検証は文字コードの中に「{」と「}」を含んでいる文字を書いてやればよい。
(例:「閲」「厭」「宮」「急」「鶏」「迎」など)
例えば「鶏を迎え討つ」などとSJISテンプレートに記載し、表示されればOKということだ。
※情報を追記しました。(2007/2/21)
2004年07月17日
PHP:httpsでCSVをダウンロードできない
http://ns1.php.gr.jp/pipermail/php-users/2003-October/019140.html
お客さんからhttpsでアクセスするとCSVがダウンロードできないと言われた。
調べてみたらIEのバグらしい。
PHPスクリプトの先頭に
session_cache_limiter('public');
と書けば問題は解決する。
ふつう原因わからないよなコレ。
同じことで悩んでいる人がいて良かった。
httpsでCSVをダウンロードさせるのは良くあるシチュエーションなのでみんなも注意。
2004年05月20日
5/20の日記(2)
iモードなどのケータイでは
<form type="image" ・・・ が使えないことを今日知ってショック!!
一部の機種は独自対応してるらしい。
ちなみにP504iSは使える模様。
FOMAN901iは駄目っぽい。
不便だな。。。おとなしくAタグ使えってか?
2004年03月10日
au及びツーカー端末からのメールアドレス取得について
通常メールアドレスは、
hoge@hogehoge.net <ほげほげ>
のようにアドレスと送信名は"<"で区切られている。
しかし一部のau及びツーカー端末*では、
hoge@ezweb.ne.jp (ほげほげ)
のように"("で区切られている場合があるので、
メールアドレスを取得するスクリプトを作成する場合は注意が必要になる。
また一部PC用メーラでも"("区切りを使用している場合がある。
* KCT7, KC12, MAT3, SY11, HI12, TS12 等
2003年12月05日
VIA EPIA-C800 をファンレスにしてみた
ウェブを見てたら、こんなページを見つけたので、マネしてみることにした。
VIA EPIA-C800はVIAのオールインワン省電力マザーボードだ。
1年くらい前に1台譲り受け、ファイルサーバとして愛用している。
しかしこいつの欠点はファンがうるさいことだ。
クロックを落とせばファンレスでも動作するが、動作は速いに越したことがない。
取り替えるヒートシンクは、ノースブリッジクーラー のZM-NB47Jというもので、
本来CPUに使うモノではないが、EPIA-C800はマザーの穴を使ってヒートシンクを固定するタイプなので、
このような形状のものでないと取り付けはできない。
先日ビッグカメラで¥1080で購入した。
まずはノーマルのヒートシンクで温度を測定した。
------------
:top
cls
echo test
goto top
------------
というバッチファイルを作成し実行。CPU稼働率を100%にして計測した。
計測はクロックを400,600,800と切り替えながら3回行った。
800の全開でも問題なく動作しているが気づかないことにした。。。
今、冬だし。もうヒートシンク買っちゃったし。
続いて旧ヒートシンクを引きはがす。
無理矢理引きはがすと、銀色のC3が見えてくる。
ふと気づくと手に小さな部品が付着していた。
気づかぬうちにどこかの電子部品をもぎ取ってしまったらしい。
取れてしまったものは仕方がない。
とりあえず組み上げることにしよう。
きっと動くでしょ。
完成。
以前に比べてだいぶ背が高くなった。
MINI-ATX用ケースには入らないかもしれない。
とりあえず動作確認。
おお、動いた。
とりあえずWindowsは正常に起動するっぽい。
それでは改めてもう一度温度測定を行う。
測定によると800Mhzで動作させてもノーマルの600MHz程度の発熱で押さえられることがわかった。
よほど熱のこもるケース以外なら、これでファンレス動作できるだろう。
あらためて取れてしまった部品を眺める。
xxCとか書いてあるので、コンデンサだろうか。
もしかしたら整流にしか使ってないかも、影響は小さいかもしれない。
いやきっとそうだ。そうに違いない。
近日中にこのWebサーバとメールサーバを、現在のセレロン400マシンから、
このC800に切り替える予定だ。
切り替えたら24時間365日運用になる。
・・・・・・・ホントに燃えたりしない?
2003年10月28日
携帯電話のユーザ判定あれこれ
携帯電話からアクセスされた場合、(公式サイトは別として)、
個人を特定する手段はIDやパスワードの発行くらいしかないと思いこんでいたが、
今日とあるリンクから偶然見つけた。
実は結構以前の機種から可能だったようだ。簡単ながら集めた情報をまとめておく。
NTTDoCoMoの場合:
<html><body><form action="./test.phtml" method="get" utn>
<input type="submit" name="submit">
</form></body></html>
のようなフォームを作成する。
formタグの最後の"utn"がポイント
するとユーザエージェントに次のような文字列が入る。apacheのログを見てみよう。
○通常のアクセス
210.136.161.236 - - [28/Oct/2003:20:25:52 +0900]
"GET /test.html HTTP/1.0" 200 127 "-" "DoCoMo/1.0/P504iS/c10/TB"
○utnを入れた場合のアクセス
210.136.161.233 - - [28/Oct/2003:20:26:00 +0900]
"GET /test.html?submit=%91%97%90M
HTTP/1.0" 200 127 "-" "DoCoMo/1.0/P504iS/c10/TB/serxxxxxxxxxxx"
このように"/serxxxxxxxxxxx"が追加されるので、ここから個人を特定すると良い。
なお携帯電話側にはアクセス時に「携帯電話情報を送信しますか?」というダイアログが出る。
503i以降の機種から実装されているらしい。
参考:http://www.zdnet.co.jp/mobile/0102/13/id.html
J-phone(vodafone)の場合:
web設定の画面から「ユーザID通知設定」をオンにしてもらうと、
「J-PHONE/4.0/J-P51/SNJMAAxxXXXXX」のようにユーザエージェントに付加される。
幾つかの機種ではデフォルトでオンらしい
参考:http://www.dp.j-phone.com/dp/tool_dl/web/useragent.php
http://d.hatena.ne.jp/HiromitsuTakagi/20030710#p1
auの場合:
subscriber IDを環境変数X-Up-Subnoで判別可能
参考:http://slashdot.jp/article.pl?sid=02/08/07/0022205
http://memo.st.ryukoku.ac.jp/archive/200208.month/4717.html