2010年6月23日水曜日

Fixtureのフォーマットって何がええのん

YAMLでもarrayでもない何か... CSV?

職場で、テスト用データを準備してちゃんと情報の漏洩とかしないかテストしないといけないとなって、まずはコードレベルで保障すべくユニットテストをするとなったわけだけど、CakePHPのFixtureのコードを見せて、これ書きたいですか?って聞いたら、「んー」という返答。やっぱりね!という感じです。確かに、EclipseやTextMateとかじゃ補完しにくい部分。テンプレートやスニペットを用意すればいいんだけど、コードが縦に長くなる。それで結局CSVでいくことになるわけだけど、CSVは横に長くなる。でも文字コードの問題を無視すればExcelとかでGUI的な編集もできる。でもでもでもでも、結局何がいいんだろ?

とりあえずDB設計上の問題から実行する順番をファイル名でルール付けして、CSVからINSERTしまくるようにはした。これでユニットテストとか、実際で操作してテストするためのテストデータの流し込みはできるようになった。Railsとかのmigrateじゃないけど、DBスキーマも一発で最新版に同期できるようにしてるので、これでしばらくは持ちこたえられそう。時間があったらYzwのサブパッケージ?に入れようと思います。

2010年6月16日水曜日

TextMateで行の最後にセミコロンを入れるコマンド

Control + ;でカレント行末にセミコロンを!

JavaScript、Scala、Rubyはそうでもないのですが、文末にセミコロンがいる言語は多い。そういった言語のほとんどが行末にセミコロンを書く事が多い。で、行末に行くにはTextMateだとControl+Eでいける、vimだとShift+$。それでカーソルを移動させてセミコロンを挿入するのもいいが、本来の目的は行末にセミコロンがない場合セミコロンを入れること。TextMateではデフォルトでCommand+Enterで行の途中でもその下に新しい行を追加しカーソルを新しい行の先頭に持ってきてくれる。わざわざControl+EしてEnterしなくてもいい。それに発想を得て、作ったのが以下のコード。

インストールの仕方

  1. ~/Library/Application Support/TextMate/Bundles/PHP/Commandsに移動するかディレクトリを作成して移動
  2. このgistを「Insert semicolon end of line.tmCommand」として保存

使い方

  • PHPファイルを開くか作成し、何かセミコロンで終わらない文を入力して「Control + ;」

2010年6月14日月曜日

wordpressでクリックしたカテゴリの小カテゴリだけ表示する方法

以下のようにCSSを変更or追加すれば実現できます

たぶんね!

.children { padding: 0; display:none; }
li.current-cat ul.children { display:block !important; }
li.current-cat-parent ul.children { display:block !important; }

カテゴリのリンクをクリックすると、そのカテゴリのli要素のcurrent-catがclass属性に付くようです。その上階層のリスト(親カテゴリ) にはcurrent-catがつくようなので、それを利用して、子カテゴリを一旦全部非表示にして、current-cat-parentが付いているカテゴリの下の小カテゴリを表示するように書いたつもりのCSSが上のものです。 読み込まれているCSS(たぶんstyle.css)に、適切に書き込んで下さいw

2010年6月7日月曜日

if __name__ == '__main__'をRuby PHP Python Perlで

直接実行された時とincludeされた時で挙動を変える

この方法を知っていると、再利用性を意識したプログラムを書く習慣を身につける為や、テストする時に役立つかもしれない!まずは言語の文化的によくやるPythonから

Python

if __name__ == '__main__':

Ruby

if __FILE__ == $0

Perl

if($0 eq __FILE__)

PHP

PHPはコマンドラインの場合、register_argc_argvが有効になっている必要があります。

// コマンドラインの場合
if (isset($argv[0]) && __FILE__ === realpath($argv[0]))

// Apacheモジュールの場合
if (basename(__FILE__) == basename($_SERVER['SCRIPT_NAME'])) 

インクルードされたら実行しないメリット

例えば関数やクラスの定義は普通にしておいて、そのテストを上記のプログラムの条件がtrueの時に行うようにできる。テストフレームワークを使わない時とか、日常よく行う処理を自動化して関数化した時のテストとか。同じviewを共有するけど、viewがindex.phpに直接書かれている場合に、ロジックだけ別にしときたい時とか(危険)。知ってて損のないものなので書いておきました。