タグ

ブックマーク / blog.tojiru.net (15)

  • PHP5.4時代のprivateメソッドテスト手法 #php5_4

    PHP5.4 Advent Calendar 2011の7日目です。昨日は@madapajaさんの「PHP5.4+ で開発が行われている BEAR.Sunday フレームワークを動かしてみる」でした。 さてさて皆さん、ユニットテストしてますか? PHPもテストのライブラリが充実してきており、カバレッジ100%に情熱を燃やしている方も多いことでしょう。 ユニットテストで困るのが、private/protectedメソッドです。外から呼べないので、普通の方法ではテストできません。(protectedは適当なダミーのサブクラスを作ってそこからテストできますが、ちょっと面倒です。) まあ当然です。外から呼べないようにprivateにしているので、簡単に呼べたら逆に困るわけです。しかしながら、privateメソッドも外から呼んでテストできた方が開発ははかどるでしょう。この記事ではPHPでprivat

    PHP5.4時代のprivateメソッドテスト手法 #php5_4
  • PHPのDIで動的にオブジェクトを確保する考察

    Dependency InjectionがPHPでも流行っているそうです。が、未だによくわからないので、わからないところを自分なりに考察してみます。 ※DIコンテナではなくデザインパターンとしてのDIを考えます。 Dependency Injectionとは Dependency Injectionはデザインパターンの一種です。日語なら依存性の注入と訳されます。「Inversion of Control コンテナと Dependency Injection パターン」が原典でしょうか。 ざっくり要約すると「クラスの中でnewしてはいけない。必要なインスタンスは外から突っ込むべし」というところかな。 class Y { private $x; function __construct() { $this->x = new X; } //...$xを使ったコード色々... } 上記のYクラス

    PHPのDIで動的にオブジェクトを確保する考察
  • GitHub markdown APIで遊ぶよ

    markdownといえば各種言語に実装されていますが、GitHubがWeb API形式で変換ツールを出しているようなので遊んでみました。このAPIを通すと、markdownテキストがHTMLに変換されます。 JSONPで使える奴と、RESTっぽくmarkdownなテキスト自体をPOSTするとHTMLの断片が返ってくるraw APIの2つがあります。 利用上限は一時間あたり5000回と太っ腹。 とりあえず、PHP版:http://tojiru.net/markdown.php <?php if (isset($_POST['markdown'])) { $origin = $_POST['markdown']; $ch = curl_init('https://api.github.com/markdown/raw'); curl_setopt($ch, CURLOPT_RETURNTRAN

    GitHub markdown APIで遊ぶよ
  • DAOの悪夢 - PHPでデータベースを扱う(1)

    最近、昔の自分が書いたコードをメンテしているのですが、何というか、「ええい、誰じゃこのコードを書いたのは!!」と叫んでは「…4年前の俺でした…」とセルフツッコミを繰り返しています。すごく読みにくいコードで、ストレスたまりまくりです。そのため、「今ならどう書くか」をよく考えました。ちょっと長くなるかもしれませんが、アンチパターンとして解説したいと思います。 DAOパターンについて 私が々としてメンテしているコードですが、データベースとのやり取りを行うためのクラスです。当時意識していませんでしたが、改めて見ているとDAOパターンを再現しているものでした。 DAO(Data Access Object)とはデザインパターンの一種で、データベースへのアクセスロジックを集約したクラスのことです。有名なGang of Fourによる23種の基デザインパターンには直接含まれていませんが、Facade

    DAOの悪夢 - PHPでデータベースを扱う(1)
  • finallyな書き方、デストラクタな書き方

    前回の記事の補足。微妙にコード例がわかりにくい気がしたので、同じようなコードをfinallyで書いた場合とデストラクタで書いた場合の比較をしてみます。 題材 やっぱりファイル操作しか思いつかなかったので、ファイルを追記モードで開いて書きこむだけのlogger()関数を実装することを考えました。かなり適当な作りですので、実用性は微妙です。 logger(file, message, time=null) string file: 書き込むファイル名。もし書き込めないファイルを指定した場合はdefault.logに書き込む。default.logは必ず書き込めるものとしてよい。 string message: 書き込む文字列。 string time: ログに出す時間を指定する。省略した場合は現在時刻が書き込まれる。 fileに書き込めないファイルパスを突っ込んだ場合、timeにパースできない

    finallyな書き方、デストラクタな書き方
  • JavaScriptにおける演算子の前置と後置 - セミコロンの自動挿入を理解して前置派を擁護してみる

    JavaScriptに限った話ではありませんが、式の途中で改行するとき、演算子の後で改行する書き方と、演算子の前で改行する書き方があります。 var a = 1 + 2 + 3 + 4 ; var a = 1 + 2 + 3 + 4 ; 最後のセミコロンの位置にも流派があるかもしれませんが、ひとまず、便宜的に演算子後置スタイル、演算子前置スタイルとそれぞれ呼ぶことにします。 いや、別にどちらのスタイルで書いてもいいのですよ。ここで宗教論争をする気はありません。しかし個人的に昔、前置スタイルの書き方に抵抗があった時期がありまして、「前置は怖くない、使っても大丈夫なんだ」ということを説明してみます。 前置恐怖症 初心者向けの解説でも、「JavaScriptは文末のセミコロンを省略できる」ということが大抵は書いてあります。が、それしか書いてないことが多いのです。 昔の私は、これだけを読んで「Ja

    JavaScriptにおける演算子の前置と後置 - セミコロンの自動挿入を理解して前置派を擁護してみる
  • JavaScript:unescapeHTMLの妥当な実装

    JavaScriptにはHTMLを実体参照化する関数、PHPで言うところのhtmlspecialchars()にあたる関数が存在しません。 正式な理由はよく知りませんが、教科書的な回答としては、「DOMを使えばエスケープなんて気にしなくていいよ」が挙げられるでしょう。うだうだ言わず黙ってDOMを使うべし。 …まあでも、必要なケースもあるでしょう。特にinnerHTMLの高速性は魅力的です。T.jsを作ったときにベンチマークを取ったのですが、エスケープ関数をはさんでもinnerHTMLの方が高速に動作することが確かにありました。 そんなわけで、世の中にはHTMLをエスケープする自前実装の関数があふれています。さんざん語り尽くされている気もしますが、prototype.jsの実装を見ていて少し気になったので取り上げてみます。 escapeHTMLの場合 escapeHTML 文字列中の特定の文

    JavaScript:unescapeHTMLの妥当な実装
  • JavaScriptのテンプレートエンジン「T.js」を公開しました

    結構前に公開していたんですが、きちんとした紹介を書いてなかったので改めて。Githubにて、T.jsという名前のJavaScript用テンプレートエンジンを公開しています。 T.js - DOMBuilder-like template engine for JavaScript T.jsとは JavaScriptHTMLを書くためのライブラリ(一種のテンプレートエンジン)です。 T.table("#addressbook")({style:{borderCollapse:"collapse"},border:"5"}, T.thead( T.tr( T.th("name"), T.th("address"))), T.tbody( T.tr(".odd")( T.td("alice"), T.td("a street")), T.tr( T.td("bob"), T.td("b str

    JavaScriptのテンプレートエンジン「T.js」を公開しました
  • DOM Builder系のjsテンプレートエンジンまとめ

    前回、どちらかと言えばinnerHTMLよりはDOMを使いましょうと書きました。しかしDOMをちょっと使えば、その余りの煩雑さに閉口することでしょう。では可読性を保持しつつ、XSSも考慮して書くにはどうすればいいでしょうか。 ちょっとしたものであれば、HTML中にdisplay:noneで構造を書き出しておき、それをJavaScriptから使う、というアプローチでもカバーできるでしょう。しかし大規模になると限界が見えてきます。描画に必要ない要素を書き出しすぎると、パフォーマンスの問題も発生します。 そこで、JavaScriptでもテンプレートエンジンを使うことになります。 テンプレートエンジンには二大勢力がある E4Xみたいな変態拡張やJadeなどの独自文法系を除くと、Scriptlet系とDOM Builder系の二種類に大きく分けることができそうです。(系統の名前は適当に決めました。正

    DOM Builder系のjsテンプレートエンジンまとめ
  • DOM APIとinnerHTMLは等価ではない

    最近、徳丸をじわじわ読んでいるのですが、DOM based XSSの話が書いてあったので、少し言及しておこうと思います。 徳丸から引用 DOM based XSSと呼ばれるXSSがあります。これは、JavaScriptによりクライアント側で表示処理する箇所があり、そこに脆弱性がある場合のXSSです。 サンプル書いてみました。 <script> document.write(unescape(location.href)); </script> こいつを適当なファイル名で保存して、domxss.html#<script>alert("hello")<script>などのURLでアクセスするとalertが表示されるはずです。任意のスクリプトが実行可能な状態ってことですね。任意のスクリプトが実行可能ってことは、セッションクッキー盗み放題で、他人に成り済まして買い物できちゃったりするレベルです

    DOM APIとinnerHTMLは等価ではない
  • JavaScript:undefined値の判定

    JavaScriptでは初期化されていない変数には全て「undefined」という値が入っています。 var a; alert(a); //undefinedが入っている これを利用して、変数が定義済みかどうかを判別することが可能です。…が、やり方がいろいろあるみたいなので、まとめてみることにします。 undefinedと比較する if (a === undefined) { alert("aは未定義"); } グローバル変数として、そのまんまundefinedという名前の変数が用意されているので、それと比較するやり方。一番素直な方法ですが、JavaScriptにおいては良くない書き方とされています。 undefinedは予約語ではなく、単なる変数です。だから上書きすることができるし、関数スコープ内で同名のローカル変数を作ることもできます。(ただし最近の処理系ではconst扱いになって上書

    JavaScript:undefined値の判定
  • newを封印するべき4つの理由

    ちょっと勢いに任せて書いちゃったので攻撃的な文章になってます。。 すごくわかりやすい解説記事を頂いたので、こちらも必読です。 new を不当に貶める陰謀と JavaScript におけるクラスの継承構造の話 - vivid memo (追記:2011/5/15) 前の記事「newを封印して、JavaScriptでオブジェクト指向する」が思いのほか反響が大きかったので、調子に乗って補足を書いてみますよ。 ブコメへの返信 「無用な複雑化に見える。」「俺俺オブジェクト指向な気がする。」といったご意見もいただいたんですが、普通たった10行の関数でオレオレオブジェクト指向なんて作れないですよ…。JavaScriptの内部機構をほとんどそのまま使っているからこそ、この行数で済むのです。 それに、このプロトタイプ的継承の考え方をDouglas Crockfordが編み出したのは、もう5年も前の話です。E

    newを封印するべき4つの理由
  • newを封印して、JavaScriptでオブジェクト指向する(2)

    前回の続きです。サンプルコードは前回から続いていると思ってください。 privateは諦めましょう 親のメソッドを呼ぶ コンストラクタ instanceofに対応する ダックタイピングのススメ 今回もobject関数を使うので再掲載。 /* * object - オブジェクトを作る * Object object(BaseObj [, mixinObj1 [, mixinObj2...]]) */ function object(o) { var f = object.f, i, len, n, prop; f.prototype = o; n = new f; for (i=1, len=arguments.length; i<len; ++i) for (prop in arguments[i]) n[prop] = arguments[i][prop]; return n; } ob

    newを封印して、JavaScriptでオブジェクト指向する(2)
  • newを封印して、JavaScriptでオブジェクト指向する(1)

    以下はプロトタイプ的継承だけで一通りの機能を実現できる、という一つの例です。もちろん他にも書き方はありますし、newを使うのがよくないと主張しているわけではないです。 (誤解を生みそうな文体が混じっているようなので追記: 2011/5/14) 春ですし、少し初心者向けの記事を書きます。タイトル通り、JavaScriptのオブジェクト指向について。ちょっと長くなるので目次です。 クラス(に相当するオブジェクト)を作る オブジェクトからオブジェクトを作る(インスタンス化) 単一継承 多重継承 privateは諦めましょう 親のメソッドを呼ぶ コンストラクタ instanceofに対応する ダックタイピングのススメ JavaScript標準のオブジェクト指向といえばnewやらprototypeやらを書く必要がありますが、これらは書くのが面倒臭い上に気をつけないといけない点がたくさんあります。Ja

    newを封印して、JavaScriptでオブジェクト指向する(1)
  • 即時関数(function(){ ... })()の別の書き方いろいろ - 泥のように

    JavaScriptでよく使われるコード片に即時関数というものがあります。無名関数を宣言して即実行することで、ブロックスコープの存在しないJavaScriptにおいて擬似的にブロックスコープを再現します。 var a = "global"; (function(){ var a = "local"; alert(a); //local })(); alert(a); //global 一番有名なのはこの(function(){ ... })()の形式なのですが、なぜfunctionの外側にカッコが必要なのか不思議に思ったことはないでしょうか? ためしにfunction(){ ... }()と書いてみると、Syntax Errorが発生します。 なぜfunction(){ ... }()はSyntax Errorなのか JavaScriptにはfunction文とfunction式があって、

    即時関数(function(){ ... })()の別の書き方いろいろ - 泥のように
  • 1