PHPの優秀なテンプレートエンジンとして名を馳せているらしい Smarty が、何かミリ秒に対応していないようでして。今日びミリ秒が扱えないって、「ウチのテレビはリモコンが無いんですのよ、オホホホホ」ってくらい迷惑ですよ。
事の発端は、Flash で日付データを取扱うために、サーバから現在時刻を取得しようと考えたところにある。ローカル時間だと不正が効くからね。普通なら、直接 Flash から CGI にリクエスト投げて終わりなんだけど、今回は好き勝手にプログラムを追加できない事情にさいなまれ、苦心。
ここからが長かった…。(ネズミの時間で1週間くらい)
「よーし、その Smarty ってヤツでサーバ時刻を flash に変数渡ししてやろうじゃねえか。へっへっへ、覚悟しな!」
Smarty では現在時刻を $smarty.now で取れるらしいと聞いたので、早速試してみた。んで、展開されたコードが以下。
コード:<param name="FlashVars" value="ctime={$smarty.now}" /> 展開後:<param name="FlashVars" value="ctime=1130580922" />
あのー、桁が足りないんですけど。
マニュアルを見てみると、「この時間にはエポックから経過した秒数が反映されます」
とのこと。誰に許可取ってミリ秒切り捨ててんだよ…。ミリ秒を笑う奴はミリ秒に泣くんだよ…。ミリ秒にも五分の魂なんだよ…。勢いで言っているよ…。ううう。
しかし、嘆いても仕様なのだから仕方がない。最大0.9秒の誤差はあれど、耐えがたきを耐え、忍びがきを忍び、1000とか掛けちゃう実験。
コード:<param name="FlashVars" value="ctime={$smarty.now*1000}" /> 展開後:<param name="FlashVars" value="ctime=1.130583281E+012" /> flash :ctime = NaN
…ぬるい、仕様がぬるすぎる。こんなぬるい味噌汁食えるかってんだ。コンチキショウ。分かったよ、分かった。flash側で1000掛けてやれば良いんですよね。ASは優秀だもんね。初めからそうすれば良かった。
_root.ctime *= 1000; trace(_root.ctime); //1130580922
よしよし…と思ったのも束の間。なんか数フレーム後で MovieClip から _root.ctime を参照したら、1000掛ける前の状態。あれ、FlashVars で渡した値とかって上書きできないのでつか。そうでつか。
いい加減、こんな小さいところでアレコレするの面倒になって、奥の手。
コード:<param name="FlashVars" value="ctime={$smarty.now}000" /> 展開後:<param name="FlashVars" value="ctime=1130580922000" /> flash :ctime = 1130580922000
超ズル。でもミッションクリティカル。正常動作を確認して、ほっと一息。こういう場合の一番スマートなやり方は何だろう。教えてエロイ人。