Jensen_Interceptor_III

NOTE(2020/09/03): この記事は2013年に書かれており、古い内容になっています。現在のGroovyの実装と異なる場合があります。

いつも、PHPのことを話している人と思っているだろう。
実は、現在の大半のお仕事は Groovy によって行われているのだよ。

ブログでは初の Groovy ネタです。1年ほど、Groovy を触っているのですが、
私のような PHPer でも (一応、Javaの経験は昔にある) すんなり触ることができる
素晴らしい言語です。

大体のことは、プログラミングGroovy で学べました。
良い本です。

今回は、Groovy の Interception についてメモです。

NOTE (2020/09/03): Groovyをホスティングしていた、Codehaus が2015年にサービス終了してしまったために、リンク切れとなっていました。現在のGroovyドキュメントに当該の記述が見つからなかったため、参考リンクとして以下を貼ります。
Internet Archive へのリンク
Interceptor のテストコード
API Doc (Interceptor)

Interception と言えば、Spring Framework なんかにある、特定のメソッドの
実行前と、実行後に何らかのロジックを仕込むアイツです。
PHP で言えば、BEAR.Sunday が、この機構を見事に持ってます。

AOP 的には、本質 (実際のロジック) でない横断的な関心事 (実行時間計測・ロギング)
は、本質とは別に実装せよ。とのことらしいです。

というわけで、実際のコードを確認。

まずは、こんなコードを用意して、GroovyConsole あたりで実行してみましょう。

class Hello {
  def name
  Hello(def name) {
    this.name = name
  }
  void sayHello() {
    println "Hello, ${name}."
  }
}

def h = new Hello("bucyou")
h.sayHello() // Hello, bucyou.

この、クラスに対して、Interceptor を差し込みます。

class Hello {
  def name
  Hello(def name) {
    this.name = name
  }
  void sayHello() {
    println "Hello, ${name}."
  }
}

class MyInterceptor implements Interceptor {
  // 前処理
  Object beforeInvoke(Object object, String methodName, Object[] argments) {
    println "beforeInvoke ${methodName}"

    null
  }

  // 自動的にメソッドを invoke する場合は true
  boolean doInvoke() { true }

  // 後処理 メソッド実行の結果を result で改変できる
  Object afterInvoke(Object object, String methodName, Object[] argments, Object result) {
    println "afterInvoke ${methodName}"

    result
  }
}

def proxy = ProxyMetaClass.getInstance(Hello);
proxy.interceptor = new MyInterceptor();

// ここは interceptor による割り込みはない
def h1 = new Hello("bucyou");
h1.sayHello();

// use を使った部分だけ interceptor により割り込み有り
proxy.use {
    def h2 = new Hello("bucyou2");
    h2.sayHello() // Hello, bucyou.
}

そうすると、出力結果としては

Hello, bucyou.
beforeInvoke ctor
afterInvoke ctor
beforeInvoke sayHello
beforeInvoke println
Hello, bucyou2.
afterInvoke println
afterInvoke sayHello

となります。メソッド名で振り分けているわけではないので、コンストラクタや
println() でも、beforeInvoke, afterInvoke が走っています。
Advisor 的なものを作れば、Groovy 単体で、十分に機能する Interceptor
実装が出来るかもしれません。

こんにちは

本日は、PHPMatsuri2013 で作った compsoer-proxy.jp
について、説明したいと思います。

http://composer-proxy.jp

解説Slide

Github
https://github.com/kawahara/composer-proxy

composer-proxy.jp は、リクエストされたパッケージ情報 (*.json) を
キャッシュしていく、プロキシサーバです。
見ての通り、アプリは大変シンプルなものになります。

サーバの中では、1時間に1回、利用頻度の高そうなもの
(Symfony Standard, Silex, Behat 周り) を、定期的にキャッシュするようにしています。
したがって、上記のプロジェクトに関しては、そこそこ快適にファイルの取得が
できる。はずです。

とは言え、まだ課題はあります。遅い原因のもう一つが、パッケージそのものの取得です。
satis では、パッケージを
キャッシュする機能があるため更に高速に動きます。(Github から zip ファイルを先に取得しローカルに配置)

そこで、この機能を composer-proxy にも実装する予定でおります。
さくらのクラウドのストレージをいっぱい使いそうな機能ですが、なんとかなるはずw
問題は、パッケージ情報ファイルのハッシュ値が変わってしまうため、そこを変換して
なんとかする機能が必要そうです。

また、ダウンロード数の通知や、検索機能などは実装しておりません。
めんどくさかったからです。

個人的には、ダウンロード通知なんかは、別に多少遅れてもいいので、
React で Queue System をつくって対処するつもりです。

そして、こちらの作品は、皆様のご支持をいただきまして、PHPMatsuri2013の
LT大会で3位に入賞出来ました。ありがとうございます!!
あとで「景品のネオジオXで遊ぶ」という記事を書く予定です!

Posted in PHP.

こんにちは。PHPMatsuri2013 in Sapporo を忘れないうちに、振り返ってみます。

1. ゲスト講演 Mitchell Hashimoto さんの “Vagrant – Living in the Future”

Vagrant の紹介でした。Vagrant については、日本でも急速に広がりつつ有り、
弊社でも「つかっているよ」 なんていう噂を所々で聞きます。
そんな、Vagrant は、現在 EC2 や Azure でも up コマンド一つで
VMを立てることができるようだ。これは、まだまだ修行不足で知らなかった。

2. ゲスト公演 Graham Weldon さんの “High availability PHP and building scalable PHP systems”

前半は、HA について。後半は、楽天社内の PaaS システム (もちろん、特にPHP部分について)
についてでした。弊社の話なので、社内の利用ユーザとして、復習がてらに聞いた感じでしたw
Nginx + PHP-FPM 構成そして、OpCache の利用などなど。

何人かが、Clustrix ってなんだっていうのを質問していたので、詳しく補足すると、
Clustrix は、スケールすることや、高速なことをウリにした、データベース製品で、MySQL のインターフェイスと互換性があります。
互換性があるというのは、お持ちの MySQL Driver さえあれば大体は同じように動いてくれるものです。仕組みはこんなん。

3. スポンサーセッションで気になったことメモ

  • CodeIQ ではトリッキーなコードより、読みやすく業務に使えるようなコードのほうが採用されるそうだ。そりゃそだーw でも、PHPMatsuri の問題ではお遊びでヤバイコードを書く人もちらほら
  • さくらのクラウドのAPIが便利そうだ。APIを叩きまくってもサーバが作られているっぽく動く(実際には作られていない) Sandbox モードが欲しいなぁと思った。

4. 闇

やばかった。とても、やばかった。

5. 大LT大会

毎年恒例となっている、大LT大会です。今年は53の発表が、それぞれ3分の持ち時間で
行われました。

連続王者となっている、PHPMatsuri強豪 Fusic を打ち破る物は現れるのか。
(開発部、一同やってくるなんかすごい福岡のすごい会社です。すごい。)

どれも素晴らしかったのですが、特に気になったもの (発表順)

  • Sacloud さわってみたお – Vagrant Sacloud を作ってみているよ!というお話。今回、さくらのクラウドで作品を作ったので、ぜひとも欲しい一品。
  • プログラミング言語バージョンチェッカー – これパクって php-nabe に突っ込みたい。コードどこ? 【追記】コメントでいただきました!
  • LT大会システムの中身のお話 – このLT大会システムは素晴らしいと思った。来年に向けてもっと改善されたり、他のLT大会でも使えるオープンなシステムだといいと思った。
    例えば、投票してなかったら、通知しまくったり、現在発表中・前回発表者の投票画面が WebSocket とかつかって自動的に変わって行ったり。
    (ソースコード公開するから、お前がやれよ!とか言われそうだ…)
    あと、発表の休憩時間の間に、ひとページあたりの数とかが変わったりとか、お疲れ様でしたとしか言い様がない。お疲れ様でした。【追記】すでソースコードは公開されているようです。https://twitter.com/cakephper/status/357157049353773057
  • この発表の99%は皆さまの優しさでできています。 – PHPmatsuri に新しい歴史が刻まれた瞬間だったと思う。僕はすごく感動した。感動したよ。そして優勝。そして Fusic。。またお前らか。
  • DebugKitiTunesPanelPlugin – 一言で言えば謎の技術。詳細をwktkして待つ。
  • Phagrant – PHP愛が素晴らしいとおもった。これぞ PHPmatsuri

6. 私の発表

あとで一個ブログ書く。待たれよ。

7. まとめ

私は結果として、3位に入賞しました!!
PHPMatsuri皆勤賞で、はじめて上位入賞ということで、嬉しく思います。

スタッフのレベルも上がっているためか、参加者が訓練されてきているためか、
発表会のレベルや、うまく流すのがすごくうまくなっている気がする。
とにかく、全般を通してスタッフの皆様に感謝です。

「お面」や「浴衣」も登場して「祭」っぽくなってきたので、次回はいっその事
出店と称して各スポンサーが遊びの屋台 (射的とか、型抜きとか = 当たるとサービスn円分とか)
を出してみたり、数々の闇プロジェクトの魂を沈めるための盆踊りなどをやってみるのもいいかもしれない。
(夜は太鼓の達人で遊ぶとか。)

Posted in PHP.