スクリプトとタスクスケジューラで時報を作ろうとする


 マビで、毎日リアル七時にあるミニゲーム的な物がありましてな。俺的には例の、勝っても嬉しくなく負けるとイラつくゲームの典型なんだけど、タイトルとか景品とかあるんで、入手までは我慢しようと。
 で、よく参加を忘れるんだ。あまり忘れると損になる仕様なので、時報が欲しいなー、と。
 ソフトをわざわざ入れるのも何かアレなんで、タスクスケジューラから何とかなんねーかなー、と思ったんだけど、「プログラムの開始」「電子メールの送信」「メッセージの表示」という選択肢しか無い。出来れば音を鳴らしたいのだが。

 という訳で、WSHでちょろっと書けないものかと。
 XPまでのWindowsではSNDREC32.exeに放り込むのが定番だったみたいだけど、Windows 7には無い。SoundRecorder.exeになってしまっている。調べてみると、再生させるだけのモードみたいなのも無くなったとのこと。安心のMS品質。
 それじゃー、とさらに検索すると、PowerShellで.NET Framework叩け、って話に辿り着く。えー。嫌だからJScriptで試そう(笑)。えーと、

new ActiveXObject("System.Media.SoundPlayer")

でまずオブジェクト作れるか確認。駄目だ、弾かれる。面倒なことになりそうだから即諦めよう(笑)。正しいやり方あったら教えてください。
 んじゃーPowerShellで、と。

PS > (New-Object Media.SoundPlayer("C:/foo/bar.wav")).PlaySync()

こんなんかな。シェルで実行してみたらちゃんと鳴ったし。それじゃps1ファイルを作って、と。
 ああ、デフォだとローカルでも署名が要るのか…。それじゃ、

PS > Set-ExecutionPolicy RemoteSigned

こうかな。エラーですな。管理者としてPowerShell.exeを実行し直して、と。そろそろ糞面倒くせえ。
 よしよし、行けた。あとは

> PowerShell.exe foo.ps1

で行けるな。行けるけどさ。

 めんどくっさー。

 タスクスケジューラも分かりにくいUIでイラッと来たけど、まあ登録は簡単だ。簡単だけど、窓を非表示で実行とかのオプションは無いんか。

> PowerShell -WindowStyle Hidden

でも一瞬窓が出るし。使えねーオプションだなー。ショートカット置いても本体を勝手に登録するし。MSめー。
 この辺で、もういっそのことC#とか使えばいいじゃん俺、とか思い始める。C++/CLIなんてのもあるよ!
 いや、やるなら素直にC#っすけどね。

 あ、最後に

PS > Set-ExecutionPolicy Restricted

に戻しておいた。

追記:
 cmd.exe /c echo ^Gって手もあったなあ…。


GoogleドキュメントでLOOKUP関数を使ったり


 Excelから取り込んだGoogleドキュメントのスプレッドシードで、LOOKUP関数が動いてないなー、と。どうやら非対応とのことで。ふーむ。何で外したんだろ。
 どうにかならないかなー、と思って調べてみると、Google Apps Scriptを書けばそのままLOOKUP関数とか使えるようになるぜー、とのこと。ほほー。早速そのサンプルを入れてみよう。うむ。動かん。
 数行のソースなんで読んでみると、何か全然違う処理をしていた。配列形式って奴なのかなあ。ベクトル形式が欲しいんだけどなあ。まあ書くか。

function LOOKUP(lookup_value, lookup_vector, result_vector) {
  result = null;
  for (var i = 0; i < lookup_vector.length; i++) {
    if (lookup_vector[i] > lookup_value) {
      break;
    }
    result = result_vector[i]
  }
  return result;
}

こんな感じ?
 まあ、間違ってたら突っ込みをよろしくお願いしたく。あと改善ネタとかもあれば。result_vector無しでも動くようにするとか、むしろ配列形式と両対応にするとか。


さくらのVPSにNSのサービスが今更付いたぞー


 わーい。さくらのVPS使いには朗報ですね。さくらのNSも使えるようになったそうで。
 むしろ何でレンタルサーバとかで使えてVPSで使えないのか理解不能でしたが。

 つーわけで、Osukini LTの使い道が一つ減らせるな。今は、セカンダリNSと、MySQLのレプリケーションと、身内データのバックアップ用途か。ふむ。NSはいつでも潰せるし、バックアップはS3に直接流してもいい気がするけど、MySQLのスレーブが無くなるのは寂しいかもなあ…。月500円かー。別に残しててもいいんじゃねーかー。とか。
 まあ、自宅鯖とか活用する手もあるかもしれませんが。Dynamic DNSとか欲しくなるけど、って待てよ、もしかしてスレーブのIPアドレスって動的でも問題無いのかな。試してもいいかもなあ。でも自宅鯖で24時間稼動してる奴はストレージ狭いんだよなあ。それにバックアップをS3に流す実験もせんと。めんどくせーなー。どーすっかなー。


マジ忙しいのにさくらのレンタルサーバで503


 つーか俺、Webサイト構築のお仕事とか専門外過ぎるから請けないんだけどさ。今回は「デザインしょぼくていいから業界のノリを理解出来る人に」みたいな条件だったんで例外的にやってますが。普段やらん仕事は勉強になりますね。
 しかし、あんまりアクセスねーだろーと油断してたら、さくらのレンタルサーバのスタンダードはだいぶ鰯なのか、普通に503がたまに。困るな。割とマジで。あ、いや、厳密には503じゃないかも。まあいい、似たようなもんだ。
 で、画像がちょくちょく表示されない。WordPressでガガッと編集操作を続けた時とかにも無反応とか503とか発生。ちょっと厳しいな。上位プランに行くのは構わないが、どのプランでどの程度マシになるのかほぼ全く不明で判断し辛すぎ。mod_phpなプランなら余裕だろうとは思うが、さくらだと高すぎるしな…。
 さてどうするか。編集時とか静的画像(口述するとエロい)とかで発生するんだから、キャッシュもあまり意味無さそうだけど。でも現状でこれじゃ将来は明らかに厳しいし、キャッシュを導入してる人も多いみたいだし、試してみるかー。W3 Total Cacheが人気っぽいな。行ってみよう。
 ふむふむ。条件でレンダリング結果を変えるプラグインとは激しく相性が悪い、と。それはそうか。Ktai StyleとかWPtouchとか最悪に合わなそうだな。対策はえーと、User-Agentで分岐かい…。濃厚な罠臭を感じるのだが。プラグイン同士で連携とかって無理なんかなー。
 まあいい、導入だ。PageとDBとObjectだけキャッシュしといて、と。
 で、効果はっつーと、どうなんだろう…。軽い時は軽いけど、キャッシュが期限切れになった頃だとむしろ遅いような。負荷のピークを抑える目的だからこれでもいいかなあ…。何かすっきりしないが。
 あと、表示されないとマジ困る画像は仕方なく外部に逃がした。さらに、アイコンみたいな絵の場合はとことん軽量化もした。減色したりPNGOUT使ったり、JPEGなイラスト素材にはXiDenoiserでNon Local Meansを掛けたり。ほとんど同じ見た目でファイルサイズ1/10くらいだーぜー。

 そうそう、パーマリンク設定がデフォのままだと、QUERY_STRINGの関係でキャッシュし辛いとのことで、何となくやらないでいたけど設定を変更してみた。どうやるかなーと思っていたが、なるほどmod_rewriteを併用か。これならNginxでも自力で同じ動作は可能かな。
 そして、mod_rewriteの最強っぷりを思い出したので、パスを移動したファイルを判別して301で飛ばすようにしたり色々設定を書いていく。いやー楽しい。興味の向いたことだけ一日中やって生きていけたらいいのにね!


マジ忙しいのにPythonで初歩的なミスにハマる


 忙しいです。締め切り二時間切ってようやく仕上がる感覚とか結構懐かしい。
 締め切り一時間くらい前にデバッグ打ち切りになって、バグ入り臭いマスターを等速で焼いてるチーフプログラマーを見てる感覚、とかと比べたら数段マシですがね!

 で。

 GAEでPythonを覚えてからは、テキスト処理もPythonなのだけれども、久々にしょーもないことで混乱した。最近C++とか全く触ってないせいもあるかもしれないが。
 Pythonの代入って、参照の代入だったり浅いコピーだったりバラバラなのだよな。ここ何とかならなかったのかな。いいけど。
 で、Pythonの辞書型、他の言語で言うところの連想配列とかunordered_mapとかハッシュとかいうアレだが、あいつを何故か深いコピーのつもりで代入していた。完全に無理じゃん。実際には参照の代入なので、データが訳分からないことになるわ、原因が絞りにくいわ、絞れても何箇所で間違ったか自信が無いわ。ははは。書き捨て気味のスクリプトだったから余計面倒だったし。

 まあ、今は晴れ晴れとした気分で。「本当にデータは大丈夫なのか?」という一抹の不安を抱えつつも。
 発売される前から「どうやっても埋まらないイベントCGがあった」とか発覚するのに比べたら痛くも何ともないですがね!