PHPの新しいテンプレートエンジン「Twig」を使った

Smarty3がついに正式版になったときいて公式サイトに行くとなんと日本語ドキュメントもできてますよ!って書いてた。
それで読み始めたものの・・・こんなに機能いらなくね?と思ってしまったのである。
更に行っちゃうとまだphp4っぽさが残ってるところが気になって気になって夜も眠れない。

php テンプレートエンジンでぐぐった結果、Twigというものがヒット

名前もシンプルでこれはいいんじゃないか!?これを触ってみよう!
xampp起動俺のターン!LinuxではなくWindowsで絶賛開発中だが気にしない!
ピーエッチピー!リクワイワンス!ツウィッグオートローダーレジスタァ!

<?php
require_once '/Twig/AutoLoader.php';
Twig_Autoloader::register();

つまり・このTwigはPHPの新しめの機能spl_AutoLoadを使っている・・
これはオブジェクト信仰の自分にはよさそうですな。もう一つずつrequire_onceするのは許せませんな、うん。
時代は自動ロードですよねーー(でもphp以外で自動ロードみたことなかった・・悔しい)

Twigは機能が最小限におさえられてる!

うん、こういうのでいいんだよこういうので。
とりあえずテンプレートファイルを読み込んで表示するなら以下のクラスだけ押さえておけばいい!

  • Twig_Loader_FileSystem(テンプレートが置いてあるフォルダパス)

ファイルからテンプレートを読み込む。ファイル以外のどこから読むんだよ!?って思ったんだけど・・
テスト用に文字列をそのままテンプレートとして解釈できるTwig_Loader_Stringというのがあるみたいだ。
駄菓子菓子、普通にファイルとして分離したほうが見やすいし書きやすいと思うな。FileSystem以外使おうと思わない。

environment・・環境。環境設定か。これで揃ったのはテンプレートを読み込むローダーと環境設定?
本体はどこへ?いいえこれが本体です。ややこしい名前しやがって・・・もちろん環境設定もこの中に含まれるんだけど。
この本体に「キャッシュフォルダはここだ」とかそういうのを教えればOKのようだ。

呼び出し側(index.php)

フォルダ構造は以下のとおり。とにかく使ってみたかったので全部おいちゃえモード。

<?php
require_once '/Twig/AutoLoader.php';
Twig_Autoloader::register();

$loader = new Twig_Loader_Filesystem(__DIR__);
$twig = new Twig_Environment($loader, array('cache' => __DIR__, 'debug' => false));

$template = $twig->loadTemplate('index.html');
$context = array();
$context['test'] = 'サザエのギャルゲーでございま〜す!';
$template->display($context);

見ればだいたい意味は分かる感じだね。
cacheというのはキャッシュを保存するフォルダ。Twigの構文解析をキャッシュするのであって、
Smartyのような完全ファイルキャッシュとは違う
みたいだ。
debugというのはデバッグであるかどうか?というオプション。頻繁にテンプレートをいじるときは必ずtrueに!
じゃないと、テンプレートを更新しても無視してキャッシュを取りに行っちゃう。

そしてテンプレートもオブジェクト!Twig本体にindex.htmlを読み込ませる。
(この時点でキャッシュは作られる)

contextというのは、テンプレートに割り当てる変数。Smartyだとassignでやってたやつか。
最後にテンプレートをdisplay(表示する)!だけ!

テンプレート(index.html)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    {{ test }}
  </body>
</html>

はい。テキトーです。これで十分だ・・

これでひとまずサザエのギャルゲーでございま〜す!と表示された。
まだ基本的なループや条件分岐やらフィルタ書きたいんだけど・・もう眠いので1回目はこれでおしまい。

2010年まとめ(※画像多すぎて重いので注意)

一言で言うとプログラム充!!!!

PHPとAS3は以前からやっていたが、オブジェクト指向Linux.NET(C#)JavascriptApacheXampp・・分厚い本まで買っちゃった。
と、とにかく開発していじり倒した!さらにDropboxEvernoteSugarsyncなどのクラウドストレージも利用開始。
その分ゲーム・アニメはあまり時間とれていなかった感がある。まぁいいか。
以下スクリーンショットで語る簡易的な履歴。

  • -


2010年1月ごろラテール。ExtendAshのギルドでわーわーやってた。ギルドのみんな元気かな!

  • -


同じく1月ごろにはアメリカにラテールのエミュ鯖ができたというので行って遊んでた。
死にまくっているだけでレベルがすごい勢いで上がっていくという謎のバグがあって、200レベルキャラを体験!
(あとからバグが修正されて、それ以来行ってない)

  • -


ああ素晴らしきマウスジェスチャアート・・・これも1月だったか
暇人すぎるだろこれ・・

  • -


二日ほどはまったネトゲドラゴニカ
UIの綺麗さは今までやった中で一番だった!!が、忙しいのですぐにやめてしまった。
3Dグラフィックだけど、移動は横だけでパッドでも安心安心なゲーム。

  • -


有名フリーゲーム洞窟物語。アクションゲームへたくそでどうもドクター(だっけ?)に勝てなかったので諦めた。

  • -


そして4月に手を出したのがネットワークRPGキャラバン。
ふーんこのゲーム10年ぐらい前に流行ったよね・・10年ぐらい前に見たわ〜
あ、でも今やってもブラックエッグが開く日のワクワク感があってよかった

  • -


ボーカロイドの曲をネットで協力タイピングできるゲーム、Typenist
部活の人とよく協力プレイしてた。お気に入り曲はワールズエンド・ダンスホールとか、ネトゲ廃人シュプレヒコールとか。

  • -


6月に部活でパソコン検定を受けた。エクセル・ワード・パワーポイントに苦労しながらもなんとか2級に合格。

  • -


友達がC++で自作したゲームをやらせてもらったり。初リリースからネット対戦付きという豪華さ。

  • -


ルーターcoregaからNECにかえて光回線の調子が良くなった!7月・・

  • -


ときは飛んで11月・・ラテールの服シミュレーターをつくろうと必死になってた。
本当にこのときは起きてプログラム食ってプログラム風呂入ってプログラム塾行ってる時はアーキテクチャの妄想だった。

  • -

2010年見たアニメ(途中で切ったのも含む)



この作品なしでは2010年は語れないだろう・・(いろいろな意味で)
放送前は新聞にでかい広告を出したり、Keyの新作だってことで大騒ぎして、
実際に見たらアレ・・・?TK最高じゃね?つまりどういうことだってばよ!?というオーラが見えそうになって
最終話が終わったあとは・・ん・・?こんなもんか。最終話の音無パントマイムワロタ。
あ、Crow Songは良かったよ!

  • -



serial experiments lain.
1990年代に放送されたネットの怖さを教えてくれるアニメ。
ネットどころじゃなくて、普通に怖いんですけど?!
OP曲は英語で何言ってるかわからないけどいい曲だった。雰囲気アニメというやつか。

  • -


荒川★アンダーザブリッジ!!
★!!☆彡!!!星よ!!!おお星よ!!!おまえよくみると☆彡だな!!

  • -


仁義と書いて・・だったっけあまり覚えてない・・・・
なぜなら2話しか見てないから・・

  • -



東のエデン。これは面白かったぞ!!劇場版もあるし!いきなり主人公が脱いでるし!
ED曲よかったです!フューチャリスティックイマジネーション!!

  • -


これもOP曲が最高!!話は・・まぁまぁだったかな・・!

  • -


ロリコンじゃない。ミニコンなんだ。みじんこなのかー(だんだんコメントが適当になってきたな・・・
OP曲は明るくて好き!!!さっきから曲のことばかりいってるな。

  • -


1話→2話の展開がすごいというので見てみたら本当にすごかった。
簡単に言うとねーよwwwwwwwwww・・かな。最初の奴が主人公のほうが面白いんじゃなイカ
やはりOP曲のパラダイスロストが素晴らしい。ここは裏切りのティル・ナ・ノーグ!!!

  • -


神のみぞ知るセカイ
ちょっと見た程度なんだが・・現実オンラインってたしかにクソゲーだよね。いいこと言うね。
あとOP曲が(以下同様

  • -


ヨwスwガwノwソwラw
ハwカwタwノwシwオw
これはアニメ漫画規制された後も伝説として語り継がれるレベルやでぇ…
でもこれもOP曲はイカ同様

FileTransferを使ってファイルを転送したら予想以上に速かった

Skypeでファイルを相手に送ったりファイルを受け取ったりすることはよくあるんだけど、速度が出る時と出ない時がある。
そこでこれはSkype側の問題なのかな?って話題になってじゃあ違う転送ソフト使ってみようかと話が出て
FileTransfer1.2iこんなソフトを見つけた。

なんとわかり易い名前だろう!File transfer ファイル転送ツールである・・
早速起動して、まずはSettingsを開く。

  • Incoming Connection Settings(自分が受信側のときの設定)
    • 今回は速度を求めているのでDirect connection(直接接続)で。ポート開放も必要みたい。
  • Outgoing Connection Settings(自分が送信側の時の設定)
    • IPとportに相手のFileTransferサーバーのIPとポート番号を入れたらいい。Serverというのは分からない、なんだろう?
    • UDPを使った接続を使用するにはどこかのdllが必要だとか。

ファイルを受信する

メイン画面一番左上の[Start Server]ボタンを押すとサーバーが起動する。そのあと送信側に自分のグローバルIPとポート番号を教えたらいつでも受信できます。

ファイルを送信する

Settingsで送信先のIPとポートを指定しておく。
2つ方法があって最初はちょっと戸惑ったけど、やりやすかったのはメインウィンドウにファイルを直接ドラッグドロップして、
ウィンドウ上部の[Send File]を押すと送信するやり方。

で、実際の速度は

安定して10MB/秒!Skypeでは最高が3MB/秒ほどだったのだが、こんなに出るとは!
10GBを超えたファイルでも高速に送られてきた〜!これはすごいよ!直接接続ってこんなもんなのか!
ただ、同じISPの人との転送だったから速かっただけかもしれないな・・

実用的かどうかというと・・

UIが英語だし、IP指定ポート指定という面倒くささがあり俺HAEEEEEE!!!をしたらもう用なしになりそうだハハッ

Win32APIで画像を表示しようとしたんだ

前はネットゲームをよくやっていて、どんなふうに動いてるのか妄想していたら突然C++がやりたくなって、
昨日Visual Studio Express C++をいれた。ネットゲームはもちろんDirectXを使っているだろうけど、
まっ最初はWindows本来の機能で画像表示やってみよう。ということでWin32APIで画像表示をぐぐってみた。

えっデバイスコンテキストが2つ・・?
ビットマップインスタンスが2つ・・?
セレクトオブジェクト・・?
Win32APIではウィンドウに何かを描画するのにデバイスコンテキストが必要なのは知っていたが、
もう1個メモリデバイスコンテキストを作る必要があるらしい。なるほどなるほど。

しかし・・ビットマップインスタンスを2つ用意しないといけないのはなぜだろう?
メモリデバイスコンテキストは初期状態では1x1の2色だからどうとか書いてるけど・・それをSelectObjectを使ってビットマップの中身への
参照に変換してその変換したものを2つ目のビットマップとしているのか。ややこしいなおい。

結局わからない部分を残しながらとにかく画像を表示させた。が・・CPU使用率が大変なことに!!
ネット上のサンプルそのままコピペでもCPU使いまくりということに。なぜだ!?なぜなんだーー!?
ウィンドウに画像一枚載せるのに1コアフルに使ってるってどういうことなの。

素直にDirectXを使ったほうがいいね。

とはいえDirectXの中身を見たことないが・・
Windows限定になっちゃうけど、.NETにするのもいいかもね。あまり複雑なゲームは作れそうにないけど、2DならC#でも十分なんじゃなイカ

良いブログはないものか

やっぱりここのブログも放置状態になってしまって、相変わらずだなー。
それで今またブログが書きたくなったんだけど、はてなダイアリーってなんだか表示が遅くない?っって感じたので
他に良いブログないかって探したところGoogle先生Bloggerを思い出したのでBloggerにブログを設置してみた結果、
「いつも考えていることを書くならソースコードなんかよく使いそう」と気づいてしまった。
はてなダイアリーの記法はやっぱり便利だ。ソースコード表示以外にもはてな記法は様々なものを設置することができる。
あとからBloggerにもシンタックスハイライト表示できるものがあるって知ったがもっと良いものがあるはずと願ってブログ探しの旅に。

WordPress

PHPは一番慣れている言語なので好き放題にカスタマイズできる設置型にすれば解決じゃね?
で、WordPressのコードの一部を見てみる。こレは駄目っ!!なんというPHP4っ・・・!
WordPress3.0.2?からPHP5に移行するとCodexには書いてあったがなんだか美しくない(というオブジェクト信仰が激しすぎた)
WPにはたくさんのプラグイン、テーマがあってドキュメントも一番充実しているだろうから、あれ、WP最強伝説か。

自作

そんなにオブジェクト信仰激しいならphp5で自作すればいいじゃなイカ
勉強にもなるし、いいとおもう。ただし途中出なかったことになるに違いない・・なんてこった!
前から認証システムやタグ管理ベースのCMSは作りたかったので、、これは一番いい選択ではないか・・?
自作CMS最強か?

はてなダイアリー

はてな記法便利杉ワロタ。これ自作でどうにかしようとしたら大変だろうな。
あと、簡単な図を描いたりしたい。これにはてなダイアリーの「おえかき」機能はすごく使える気がする。
あれ、はてな最強か?

Blogger

信頼のグーグル先生だけど、特にこれっていう機能がない。書きたいだけならこれで十分なのだが、
色々拡張したい。動画をすぐに張れるのはすごいとおもい実際にアップロードしてみたらYoutubeに強制240pでアップロードされてやんの!
ブログからお手軽投稿だから仕方ないだろうけど、画質悪すぎ。JW Media Playerを設置できるようなのないかな?

最強候補だらけじゃないか、それでここからスパムコメントの対策機能を考えるとWordPressのAkismetがすごいんだった。
やっぱりWordPress/・というわけにはいかない。どこのサーバーに置くんだよって話。
無料サーバーでWPは無理がある。COREBLOG借りるような金はない・・。やはりはてなダイアリーか・・
今この記事を書いているのもはてなダイアリーだからね。はてなすごいね。でもGoogleの検索結果にブックマークやらキーワード出さないでください。はてなさん。

855 名前: 社員(アラバマ州)[sage] 投稿日:2010/07/20(火) 22:51:22.63 id:kRsdSUV1
ハエトリグモ wikipedia より

マウスポインタ
PCのモニタ画面上にいるハエトリグモの周囲でマウスポインタを動かすと、画面のマウスポインタを餌と誤認して狩猟体制に入る。マウスポインタを移動させて遊ぶことが出来る。

ww
編集したの誰だよw

http://tsushima.2ch.net/test/read.cgi/news/1279612779/

これやってみたいわ!!w

スクリーンショットフォルダの一括リネームをPythonで。

昔からスクリーンショットを残しておくのが好きで、今まで5000枚ほどの画像がたまっている。
それで1年前の今日はこんなことしてたな〜なんて懐古するのが楽しい。

しかし1年前の今日という検索をするにはファイルの更新日時をしっかり残していないとだめだ。
画像のサイズを下げるために一括最適化をかけたりしたら、更新日時が全て上書きされてしまう・・なんてことも実際にあった。

ファイル名を更新日時にすればいい!

この方法を思いついた。これなら、更新日時が書き換わってしまっても、いつ撮ったものなのかすぐに分かる。
その上ファイル名なら、Everythingなどの高速検索ソフトで簡単に取り出せる。

まさか、5000枚余りの画像の名前変更を手動で?

そんなことできるわけないので、こういう繰り返し作業に強いプログラムにやってもらうことに。

次に何の言語を使おうということになる

自分はPHPActionScriptぐらいしかできない。この2つはファイル操作があまり楽ではない。
そこで調べてみるとPythonというのが楽らしい!

Pythonで実際に書いた結果

やはり初めてのコードというのはぐちゃぐちゃになりがちだが、なんとか動いた。
python.exe rename.py C:\ss\ という風に使うと、C:\ss\以下のサブフォルダも含む全てのpng, bmp, jpgファイルが
2010_07_11_23_16_46.png(その画像の更新日時)といった名前に変わる。

import os, sys, time
# config ========================================================================================
class Config:
    exts = [".png", ".bmp", ".jpg"]
# def ========================================================================================
def getmtime(path): return(time.localtime(os.path.getmtime(path)))

def rename(dir):
    for root, dirs, files in os.walk(dir):
        cnt = 2
        print("----%s----" %root)
        for i in files:
            path = os.path.join(root,i)
            ext = os.path.splitext(path)[1]
            if (ext.lower() in Config.exts) == False: continue
            t = getmtime(path)
            result = "%04d_%02d_%02d_%02d_%02d_%02d" %(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)
            if i == result+ext: print(i+" <<<skip>>>"); continue
            if os.path.exists(root+result+ext): result += "(%d)" %cnt; cnt += 1
            if root[-1] != "\\": root += "\\"
            print(i+" -> "+result+ext)
            try:
                os.rename(path, root+result+ext)
            except:
                print("Rename Error!!("+path+" -> "+root+result+ext+")")
            else:
                global successCount
                successCount += 1;
# main ========================================================================================
successCount = 0
targetDir = sys.argv[1]
if os.path.isdir(targetDir) == False: print(targetDir + " is invalid dir path"); sys.exit()
if targetDir[-1] != "\\": targetDir += "\\"
rename(targetDir)
print(str(successCount)+" file(s) are succeed!")

Python面白いのでまた今度他のスクリプトも作りたいと思った。