blog.handlena.me

コード書いたりゲームしたり

  • モダンPHP勉強会 #2 に行ってきた

    昨日グリー株式会社であったモダンPHP勉強会でメモったことへのひとり突っ込み。 引用部分がそのときのメモ、その下が見返したときの感想です。 Twig by @cocoitiban ZyngaではPHP5.3は1年ほど案件で使ってる 特にトラブルなし[2010.12.19 9:10 追記] Zyngaさんの社名をタイポしていたので修正しました。 以降は細かい変更点に対応するのが大変そうですが、新規案件なら問題なさそうですね。 今のところCentOSではじめから入っているPHPは5.1.6なので(たしか)、どうせ5.2にアップグレードするなら5.3にしてしまってもいいのかもしれません。 クロージャ使いたい。 Smaryが高速なのはキャッシュしてAPCに載っけてるから 最近のPHPはテンプレートエンジン使ってない ->テンプレートエンジンはモダンじゃない? 議論が一周してテンプレートエンジンが使う傾向に 便利で早くて綺麗でなくてはならないプログラマーからすると素のPHPをテンプレートに使うのは何でもできてとても便利なんですが、逆に何でもできすぎて本来テンプレートに書くべきでない処理まで書いてしまうことがありますよね。 テンプレートエンジンを使えば強制的にViewとControlerが分離されるので、使った方がいいのかもです。 Twig by Fabien テンプレートの継承をサポート 動的に継承元を切り替えられる おととい(12月16日)0.9.10になった 相当活発に開発されてる 後方互換ののない変更もたくさん Changelogおもしろいよ!Changelogって、自分が使っているものがアップデートされたときにしか見てないです…。 確かに読んどくと制作者の意図が読み取れていいのかも。 今までのテンプレートエンジンはレイアウトとパーツの2階層 継承部分をフレームワーク側で制御していた Twigは多段継承ができる レイアウトのパターンをより細かく分けることができるViewの操作はViewで行うってことですね。 多段継承できると大きめのサイトをつくるときに便利そうです。 ダミーテンプレートで開発することができる デザイナーと完全分業できるこれはいい! デザイナーがちょこっとHTMLをいじってそれをサーバーに反映してまたちょっといじって…。なんて操作は時間の無駄きわまりないですからね。 デザイナー側で XAMPPとかで単純なPHPが動く環境を作ってテンプレートの動作環境だけ確保 → ダミーのテンプレートを動かしながらデザイン調整 という流れ…ですよね? 見た目はSmartyに似てる Smargyはかっこが一つなのでJSとかぶるJSとかぶるとどんな弊害があるんだろう…。エディタのシンタックスチェック…とか? テンプレート内に変更する部分をブロックとして記述する 継承先ではブロックないだけを書き換えるDreamweaverのテンプレートみたいな感じですね。 フィルタ {{hoge|escape}} タグ {% block %} どちらも自分で拡張できるフィルタを拡張できると日付のフォーマットを一括変更したりできていいですね。 エスケープされるタイミングは出力直前 symfonyなんかはテンプレートに渡す前に問答無用でエスケープされる エスケープするかどうかをテンプレート側で決められる 変数の型を見てテンプレートに渡す前にエスケープするかどうかを決めることもできる最後のはフィルタの拡張に関する部分で、受け取った値から判断して好きに形式を変えられるみたいです。 キャッシュのソースが綺麗 クラスとしてキャッシュされる インデントもちゃんとされてる テンプレートの何行目かがコメントで書いてある普通に読めるコードでした。 キャッシュをはき出す処理はどうなってるんだろ。symfony野はちょっと覗いたことあるんですが、読解は2分くらいであきらめました…。 Smarty3も結構いい キャッシュは読めん 過去のものを移行するならSmartyでいいかも 新規ならTwigの方がいい感じ「Smarty3いいっすよ」とのことでしたw Twig自体のコードは結構モダン くせがあるけどかっこいい既存フレームワークのソースはちょっとでもいいから読むようにしないとなーと。

    Read more…
  • Chrome からファイルをアップロードするとファイルのタイプがとれない

    Windows の Chrome からファイルをアップロードすると、ファイルタイプがとれないみたい。 Chrome のバージョンは8.0。 Chrome からファイルをアップロードしたものをPHPで受けて、 $_FILES を var_dump したらこんな風になる。 array 'file' => array 'name' => string 'hogehoge.zip' (length=12) 'type' => string '' (length=0) 'tmp_name' => string '/private/var/tmp/phpURHxui' (length=26) 'error' => int 0 'size' => int 1087323$_FILES['file']['type'] が空文字列になる。 ちなみにFirefoxの場合。 array 'file' => array 'name' => string 'hogehoge.zip' (length=12) 'type' => string 'application/zip' (length=15) 'tmp_name' => string '/private/var/tmp/phpURHxui' (length=26) 'error' => int 0 'size' => int 1087323type を見てアップロードされたファイルの種類を判別していると痛い目に遭う。

    Read more…
  • いまさらだけどsmartchr.elを入れてみた

    id:k1LoW さんの 空気のようなEmacs Lisp -2010 冬- - Emacs/Lisp/Drill - Emacsグループ を読んで、いまだに smartchr を使ってなかったことを思い出したので入れてみた。 全てのモードで有効にするのは逆に不便になるので("-"を使った箇条書きとか)、add-hook で必要なモードでだけ有効にするようにした。 ;; INSTALL ;; (install-elisp "https://github.com/imakado/emacs-smartchr/raw/master/smartchr.el") (require 'smartchr) (defun my-smartchr-setting () (local-set-key (kbd "=") (smartchr '(" = " " == " "="))) (local-set-key (kbd "+") (smartchr '(" + " "++" " += " "+"))) (local-set-key (kbd "-") (smartchr '(" - " "–" " -= " "-"))) (local-set-key (kbd "&quot;") (smartchr '("&quot;!!'\&quot;&quot;</span> <span class="synConstant">&quot;\&quot;&quot;</span><span class="synSpecial">)))</span> <span class="synSpecial">(</span>local-set-key <span class="synSpecial">(</span>kbd <span class="synConstant">&quot;'&quot;</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>smartchr <span class="synSpecial">'(</span><span class="synConstant">&quot;'!

    Read more…
  • org-modeでTODO管理

    Emacs Advent Calendar jp: 2010 : ATND の10日目です。 2011-01-02 タイポ修正 勢いで参加したものの、elispはさっぱりかけないので、 日々使っている機能を紹介する路線で行ってみようと思います。 org-mode でTODO管理をする方法を紹介します。 今回は素の org-mode で使える機能について触れてみます。 org-mode? 超高機能なアウトライン記述用メジャーモードです。 日付タグを入れたりファイルやWebページにリンクを張ったり表計算とかができたりします。 この辺参照。 OrgMode - Emacs上のアウトライナー なんでorg-mode? TODOの管理方法でいろいろ試して悩んだ結果、 結局 org-mode に落ち着きました。 理由は、 emacs(= メインの作業環境)上で操作が完結する 時間が計れる の2点です。 時間が計れる TODO 管理ツールやサービスはいくつか試したのですが、 いちいち emacs を離れて入力するのは面倒 → 入力しなくなる という流れで長続きしませんでした。 TODO管理機能の使い方 ここから本題! TODOの記述 *.orgというファイルをつくって。 ** TODO ブログを書く と書けばTODO項目として扱われます。 終了したTODOは、 ** DONE ブログを書く となります。 たとえばこんな感じに。 一覧表示 基本はorg-mode の形式で書いたファイルの内容を、

    Read more…
  • sjisのファイルを直接grepしたかったから練習がてらperlで書いてみた

    自分の要望として sjisのファイルをコマンドラインからgrepしたい 複数ファイルにまたがってgrepしたい 検索結果にファイル名と行番号を表示したい catでつないでnkf -wってすればできるけど、どのファイルかわからなくなる 練習のつもりでperlで書いてみたらすごい時間かかった。一行書くごとにググってた気がする。 ソース もとからあるコマンドを組合せればできるのかもだけど、きっとすぐ忘れるからperlでそんな処理を書いてみた。書きかたとしてあってるのかは知らない。 ~/bin/sgrep とかに実行権限付けて置いといて使ってる。 名前がgrepだけど、そんなだいそれた機能は無いです。 「検索っていったらgrepじゃない?」と思って安易に付けただけです。 使いかた? たとえば、 $ sgrep 'hoge' とすればhogeが含まれる行の一覧をカレントディレクトリ以下すべてのファイルを対象に正規表現で検索する。 第二引数にディレクトリ名を与えれば、そのディレクトリ以下のファイルを対象に検索する。 $ sgrep 'hoge' dirname キーワードをカンマでつなぐとAND検索される。 $ sgrep 'hoge,huga' # => hogeとhugaを含む行を表示 課題 コマンドのヘルプってどうやって書くの? エラー処理とかなくていいの? 処理速度とかどうなの? sjisじゃないファイルに使うときっと文字化けする 疑問 wantedの中でopenしたらうまくいかなかった。 サブルーチンにわけたらうまくいった。 なして? なんだか無駄そうなis_fileも同じ理由。 unlessのあとに直接-f $fileとしたら必ず偽になった。 なして? processの頭の@_と$_。 @_をprintするとカレントディレクトリからの相対パスが、 $_をprintするとファイル名のみが表示される。 @_の最初の要素が$_ってわけではない? やっぱりちゃんと基礎から勉強しないといけない気がする。

  • emacsのPATHって・・・?

    evernote-mode.elを使おうとするものの、なにをやっても Unknown error になってしまう。 どうやら emacs から呼び出そうとしている ruby が /usr/bin にあるものなのが原因らしい(使いたいのは macport で入れた ruby)。 M-x shell-command which ruby => /usr/bin/rubyPATH と exec-path には /opt/local/bin を追加済み。 (getenv "PATH") #=> ("/opt/local/bin", ...) exec-path #=> ("/opt/local/bin", ...) shell-command で PATH を見ると違う結果に。 M-x shell-command echo $PATH => /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:...setenv で PATH に空文字列を入れても shell-command から見た PATH は空にならない。 (setenv "PATH" "") (getenv "PATH") => "" M-x shell-command echo $PATH => /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/binどうやら getenv で得られる PATH の前に強制的に /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin がつく模様。

    Read more…
  • html-helper-mode 3.0系列の設定

    2.0系列から見て、デフォルトで色が付いたりキーバインドががらっと変わったりしている3.0系列が微妙に使いにくかったので、ちょっといじったメモ。 対象は html-helper-mode 3.0.4kilo。 タグは小文字にしたい テーブルタグとかスクリプトタグとかが大文字なのが気に入らないので中身を書き換えた。 いちいちタイプする毎になんか走って鬱陶しい html-helper-verbose を nil にすればいいみたい。 (setq html-helper-verbose nil) その他の設定 (autoload 'html-helper-mode "html-helper-mode" "Yay HTML" t) (setq auto-mode-alist (cons '("\\.html$" . html-helper-mode) auto-mode-alist)) (setq html-helper-basic-offset 0) (setq html-helper-item-continue-indent 0) (setq html-helper-never-indent t) (defvar html-helper-new-buffer-template '("<!DOCTYPE html>\n" "<html>\n" "\n" "<head>\n" "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">\n" "<title></title>\n" "</head>\n" "\n" "<body>\n" "\n" "\n" "\n" "</body>\n" "</html>\n") "*Template for new buffers, inserted by html-helper-insert-new-buffer-strings if html-helper-build-new-buffer is set to t")

    Read more…
  • limeのis_deeplyが使いにくいので自前で書いてみた

    limeのis_deeply。配列を比較できて便利だけど、いかんせん結果が見にくい。 と、いうわけで自前で書いてみた。 たとえばこんな配列を渡すと、 $a = array( 'hoge' => 'hogehog', 'huga' => 100, 'moga' => array( 'a' => 'aaa', 'b' => 'bbb', ), ); $b = array( ‘hoge’ => ‘hogehoge’, ‘huga’ => ‘100’, ‘moga’ => array( ‘a’ => ‘aaa’, ‘b’ => ‘bb’, ), ); $diffs = is_deeply($a, $b); こんな結果が帰ってくる。 Array ( [[hoge]] => Array ( [0] => hogehog (string) [1] => hogehoge (string) ) [[huga]] => Array ( [0] => 100 (integer) [1] => 100 (string) ) [[moga][b]] => Array ( [0] => bbb (string) [1] => bb (string) ) ) これをもっと見やすく整形してlimeを継承して使うようにすれば、だいぶテスト時のいらいらが軽減されるはず。

  • base64エンコードされた画像をデコードしてファイルに保存する

    MIME::Base64 を使用。 perl v5.12.1 use MIME::Base64; my $image_base64 = '<base64エンコードした画像'>; # base64形式からデコード my $image_bin = decode_base64($image_base64); # ファイルを開く open $fh, '+>', '/path/to/file' or die "Cannot open : $!"; # ファイルをバイナリモードに binmode $fh; # 書き込み print $fh $image_bin; # ファイルを閉じる close $fh;

  • Perlの配列とハッシュと参照

    さんざんこんがらがったのでメモ。 ()と[]と{}と\の使い方。 配列 my @var = ( 1, 2, 3 ); print @var[1]; # => 2 配列の参照 # 参照なのでスカラーで受ける my $var = [ 1, 2, 3 ]; # 参照なのでアローで読み出す print $var->[1]; # => 2 これはこの書き方と同じ # 配列を格納 my @var2 = ( 1, 2, 3 ); # 配列の参照を格納 my $var = \@var2; ハッシュ # 定義するときは"%" my %var = ( a => 1, b => 2, c => 3 ); # 読み出すときは"$"を使う print $var{b}; # => 2

    Read more…