SlideShare a Scribd company logo
1 of 54
BEAR.Sunday Note
      rev 08
DIフレームワーク
Ray.Di オブジェクトの生成と取得
Ray.Aop 横断的利用                          コンポーネント構成図




BEAR.Resource
        サービスレイヤー
        オブジェクトのリソース化          Monolog Guzzle        Doctorine
   オブジェクトフレームワーク              Aura.Router    Aura.Web    Aura.Cli
                              Twig    Smarty3 Haanga
 BEAR.Framework
  アプリケーションコントローラー             zf2           Symfony2    PEAR

   リソースフレームワーク                                /vendor




                    BEAR.Sunday
Apache Tapestry

                                              Apache Click

                                                  CMS


    PUSH            Framework Architecture      PULL
  Ruby On Rails

     Django

Symfony / CakePHP
PUSH

処理を要求するアクションを実行し、次に結果を出力
するためにデータを表示のレイヤに“プッシュ”する。
Web Client
                                                          Clinet Side


                                                          Server Side
          Dispatcher & Router
                           OPTION

                                     ページは自身を構
                                     成し、それが表現

Resource Client                      になりクライアン
                                     トに返ります。
  サーバー内クライアント




                               RES
                                       Resource A

    Page Resource              RES     Resource B   RES


                                                    RES
  Representation (View)
                               RES
                                       Resource C   RES




                          リソース内に
                          ビューを持ち、リ
                          ソースは状態から
                          表現に変わりま
                                                            PUSH
Web                  CLI                       API                Service                               Clinet Side
                                            Socket   HTTP         Another App


             GET   PUT    POST   DELETE      HEAD    OPTIONS
                             HTTP Verb                                                                  Server Side
          Dispatcher & Router                                      リソースは自身を
                                 OPTION                            構成するために必
                                                                   要あれば他のリ
                                                                                                             App Resource
                                                                   ソースをリクエス
                                                                   トします。
Resource Client                                                                 GET app://self/user/friend?user_id=1
  サーバー内クライアント


           GET page://self/user?id=1                               App Resource
             GET   PUT    POST   DELETE

                                                                                    GET app://self/user/profile?user_id=1
                                              GET app://self/user?id=1
                                                                                リソースはHTTP
                                                                                動詞とURIで繋が
                                     RES                                                                     App Resource
                                                                                れています
    Page Resource                     RES

  Representation (View)               RES                   GET
                                               POST
                                                        PUT         HTTP Resource       X Resource
                                                                               FIle Resource

                                   OPTION                          Another App A Resource

                                                                   Another App B Resource
                                                                                                           PUSH
表示レイヤから処理を開始し、必要に応じて複数のコ
ントローラからの処理の結果を“プル”する


      Framework Architecture

             PULL
Web Client
                                                             Clinet Side


                                                             Server Side
             Dispatcher & Router
                               OPTION     Resource A
                                          Resource B   RES


                                                       RES
                                          Resource C   RES
                         RES

           View
                       RES
           RES

HTML       PHP      Doc DB


Viewにはリソース
のプレースフォル
ダだけがありま
す。
       それをトリガーに
       リソースがPULLリ
       クエストされま
       す。                    CMSやRIA、JS
                             MVC等と親和性が
                             高いのではないで
                             しょうか。
                                                                PULL
Resource
Resource Client


                              GET app://self/user?id=1

                     USER                                “User” Resource


           User Page
                             GET app://self/friend?user_id=1

                    FRIEND                            “Friend” Resource


このユーザーペー                     リソースは単数また
ジは2つのアプリ                     は複数のリソースで
ケーションリソー                     構成されますが、ク
スで構成されてい                     ライアントには構成
ます。                          がわかりません                 リソースの関係はリ
                             Resource Client         クエストで表す事が
           それぞれのリクエ
                                  ????               できます。
           ストは自身のス
           ロットに格納され
           ました。
            USER   FRIEND
Resource Client


                            GET app://self/user?id=1




          User Page                                     User Resource
                   USER

                          [‘name’=>‘koriym’, ‘status’=>’OK’]


ユーザーページはリ
ソースクライアントか                   ユーザーリソースは状
らみたらサービスです                                                     Representation State
                             態を持ち、その状態を
が、ユーザーリソース                                                     リソース表現状態の移動
                             表現にしてリクエスト
に対してはクライアン                   もとに移動(返)され                                         Transfer
トです                                                            これが
                             ます。
          ユーザーページが
          ユーザーリソースを                                            REpresentation State Transfer
          利用する関係は 固定                                           RESTです。
          されリクエストに関
          わらず不変です。
USER1    GET app://self/user?id=1


        User Page         or
               USER2 [‘name’=>‘koriym’, ‘status’=>’OK’]



                                                   observe

外部へのリクエストは
自身のスロットに格納
します。方法は2つあ   リクエスト、あるいは               リクエストハンドラー
ります。         リクエスト結果です。               は、ページが仕事を終
                                      える(自身を構成す
                                      る)のを持ってます。
                                                             Req Handler
                                     次は彼の出番だからで
                                     す。
CQRS
         NEWS     GET app://self/news/top             実行

         LOGIN    GET app://self/login/current/user        ACL適用しなくては

             AD   GET app://self/ad/weekly/rotation        これはキャッシュあるはず
  Top Page
                  POST app://self/footprint/counter?inc=1   これはページ表示後でいいや

                  PUT app://self/log/user/ua                これはキューにいれる

                  POST app://self/ntry/new                  GET用のビューを今すぐつくる



ページは自身を構成                                                   リクエストハンドラー
することだけに専念                                                   はURIやコンテキスト
します。                                                        でそのリクエストをど
                                                            ういう風に実行するか
                                                            を判断しながらページ
まず、ページは他のリ                Req Handler                       をインスタンス(実
ソースリクエストを
                                                            体)にします。
持った構造=リソース                           with
グラフです。                      Injectable URI Router

                                   Test ? Stage ?
NEWS    インスタンス(実体)

              LOGIN   インスタンス(実体)
                AD    リクエスト
       Top Page


                                                       後は単純な出力スク
                               出現するかしないか               リプトがテンプレート
                               テンプレートが決める              にまとめてアサインし
リクエストハンドラは
                               からまだ分からないの              て出力するだけです。
必要な仕事をして、ほ
             一部残っているのは         です。
とんどのリクエストが
             ビューに出現したタイ
結果(インスタンス)
             ミングでリクエストを
に変わりました。                             if (! 有料ユーザー) {
             行うLazy Requestリ
                                      {$ad}
             ソースでしょう。
                                     }


                                     こういうテンプレート
                                     かもしれません。
Script File




              http://www.grrinninbear.com.au/vet/vsb_cartoons/0403_02Cartoons.html
スクリプトファイル


• 最上位の構成をスクリプトで記述
• 大きな粒度のスクリプト
• 素のPHPを参考に
• グローバル変数使用
Native PHP Script
                                             10年前のPHPを思い出そう

                           スクリプトとは読み込
                           んだだけで実行される
                           台本(Script)      ページの構成をスクリ
                                           プトファイルで構成し
                           簡易な記述で手順がか      ていました。
                           いてあります。

include   'header.php';                大きな粒度でスクリ
                                       プトを追加削除でき
include   'sub_header.php';            た。つまり ユーザー
include   'menu.php';                  は自由にページの構
include   'body.php';                  造を構成できまし

include   'footer.php';     問題はそれぞれのスク
                           リプト内の勝手なグ
                           ローバル化する変数
                                         ではその問題を解決し
                           や、ステート。共通の
                                         て、フレームワーク全
                           フレームを持たない
                                         体構造をスクリプトで
                           事。
                                         記述でき、ユーザーが
                                         構成できるようになれ
                                         ばどうでしょうか?
スクリプトファイル web
// Application
$app = App::factory($runMode, $useCache);    ページリソースをHTMLと
                                             して出力します
// Route
// Dispatch
list($method, $pagePath, $query) = (new Router)->match($globals);
// Request
try {
    $page = $app->resource->$method->uri('page://self/' .
$pagePath)->withQuery($query)->eager->request();
} catch (Exception $e) {
    $page = $app->exceptionHandler->handle($e);
}

// Transfer
$app->response->setResource($page)->render()->prepare()->send();
スクリプトファイル API
                                   このスクリプトはリ
                                   ソースをWeb APIとし
                                   て出力します。




try {
    list($method, $query) = (new Router)->getMethodQuery($globals);
    list($resource, $page) = (new Dispatcher($app))->getInstance($uri);
    // Request
    $page = $app->resource->$method->object($page)->withQuery($globals['_GET'])-
>eager->request();
} catch (Exception $e) {
    $page = $app->exceptionHandler->handle($e);
}
$app->response->setResource($page)->render()->prepare()->send();
Dependency Injection
DI

• インターフェイスに依存
• オブジェクトの取得は基本しない
• するならインジェクトされた専用ファ
 クトリで

• Google Guice スタイルのアノテー
 ションベースのインジェクション
Object


                                 DI                     dependency A
                                                                           Value

                                                                       dependency B




           $injector->getInstance(‘nametoservice’);
                                                              A
Injector                                                               B

 module
                   インジェクターはオブ
                   ジェクトを取得すると
                                                            Service
                   きに、そのオブジェク
                   トが必要(依存)なイ
                   ンスタンスがインジェ
                   クト(注入)します。
Object


                                    DI                     dependency A
                                                                                Value

                                                                            dependency B




              $injector->getInstance(‘nametoservice’);
                                                                 A
Injector                              A                      dependency A   B

 module

インジェクターに
セットされた「モ
                                      B                        Service
                                                             dependency B

ジュール」は、注入の
ルールを知っていま    最も単純で、最も使われ
す。           るルールは特定のイン
             ターフェイスが指定され
             たら、特定のクラスで生
             成したインスタンスを注
             入するというものですと
             いうものです。
Injectable Module
                  モジュールにはアプリ
                  ケーションの全ての依
                  存がセットされていま
                  す。



Injector
 module A         モジュールは交換可能です。




                    他のアプリのモジュールに
                    入れ替えると、他のアプリ
                    のリソースが利用できま
                    す。


                    つまり同じ/userリソースで
                    も違うDBの依存を用いま
       module B     す。複数のアプリケーショ
                    ンのリソースが同じインスタ
                    ンスで使えます。
DI @Inject
 インジェクトが欲しい
 ところに@Injectと
 マークします。




/**
  * @param Resource $resource Resource Client
  *
  * @Inject
  */
public function __construct(Resource $resource)
{                                    タイプヒントはクラス
     $this->resource = $resource;    名でなくインターフェ
                                   イスまたは抽象クラス
                                   を指定します。
DI Binding
                このModuleではイン
                                                       Moduleクラスは
                ターフェイスに対応す
                                                       configureという、た
                るクラスを設定してい
                                                       だ一つのメソッドを持
                ます。
                                                       ち、そこにバイディン
                                                       グDSLを書きます。



protected function configure()
{
    $this->bind('BEARResourceResource')->to('BEARResourceClient');
    $this->bind('BEARResourceInvokable')->to('BEARResourceInvoker');
    $this->bind('BEARResourceLinkable')->to('BEARResourceLinker');
}
                                          Google GuiceのBindingのサブセットが
                                          用意されています。


                                          詳しくはRay.Diのマニュアルを
                                          http://code.google.com/p/rayphp/
Life Cycle

 /**
                             初期化は
   * @PostConstruct          @PostConstructメ
   */                        ソッドで指定します。
 public function onInit()
 {
   ...

/**
   * @PreDestory
   */                       終了処理は@PreDestoroyメ
                            ソッドで指定します。
 public function onEnd()
 {                          http://en.wikipedia.org/
                            wiki/JSR_250
DI Injected Factory

        そのページで必要なコ       生成時のアノテーショ
    /** ンストラクションは全       ンやバインディング、
     * @param Resource
        てキャッシュされま        $resource Resource
                         インジェクトのコスト           Client
     * す。                がキャッシュ後はかか
                         りません。
      * @Inject
      */
    public function __construct(Resource $resource)
    {
         $this->resource = $resource;
         $this->greeting = $resource->newInstance('app://self/
greeting');
                                              オブジェクトの生成は
                                              リクエストよらず不変
                                              です。
Scope
                                         Scopeアノテーション
                                         でsingletonか毎回生
    /**                                  成されるprototypeを

     * Singleton Service                 指定することができま
                                         す。
     *
     * @Scope(“singleton”)
     */




$this->bind('RayDiMockDbInterface')
                                            モジュールでもシング
->to('RayDiMockDb')                      ルトン指定できます。
->in(Scope::SINGLETON);
オブジェクトは他のオ
ブジェクトを必要とし   ページリソースを1つ
ます。その他のオブ    取得したらすべてが連
ジェクトも違うオブ    鎖取得され巨大なオブ
ジェクトを必要としま   ジェクトグラフがつく
す。           られます
これは全てがインジェ
クト済みの
HelloWorldアプリで
す。



                 これをUnserializeす
                 るだけでこういうグラ
                 フが得られます。




                                   so far so goodです
                                   がまだまだ調べます。
Resource Request
Resource Request

• リソースにはURIがあります
• DSLでリクエスト
• 名前引き数で
• メソッドはHTTP準拠
• 様々なリクエスト方法
Message passing in PHP

Client                                               Service
                  $service->read(1, 2)


             インスタンスを指定
                                順番で引数を指定
普通のPHPでのメ
ソッド呼び出しです。
                     メソッド名を指定
                                           足りない引数があると...


                                           1) 宣言部のデフォルトが補完
                                           2) Service内で取得する


                                           クライアントで引数を      えるの
                                           が基本です。
Message passing in BEAR

Client                                               Service

  $resource
  ->get 制限されたリクエストメソッド
  ->uri(‘app://self/service’) URI
  ->withQuery([‘item’ => 1, 'quantity' =>2])   名前付クエリー
  ->eager ”すぐに”
  ->request(); EOR (end of request)
                                               webサービスをリクエ
                                               ストするようにリクエ
                                               ストします。
Eager Request
                               挨拶リソースにGETリ
                               クエストをしていま          その結果を自分自身の
                               す。                 greetingというスロッ
                                                  トに保存しています。
                               eagerではリクエスト
public function onGet($lang)   結果が得られます

{
  $this['greeting'] = $this->resource
  ->get
                                                 $this[ greeting ]は
  ->uri(‘app://self/greeting)                    $this->body[ greeting ]の
  ->withQuery(['lang' => $lang])                 ショートカットです。
  ->eager                         引き数は変数名で指定して
                                  います。
  ->request();
Lazy Request
                               eagerが無いとリクエ
                               スト結果だけではな
                               く、リクエストそのも        このリクエストはリク
                               のがスロットに入りま        エストハンドラーが行
                               す。                うか、ビューで出現し
                                                 たタイミングで行うか
                                                 はこのスクリプトでは
public function onGet($lang)                     指定しません。

{                                                             このリソースをキャッ
                                                              シュしてもリクエスト
  $this['greeting'] = $this->resource
                                                              先のリソースは正しく
  ->get                          greetingというスロッ               反映されるのに注目し
  ->uri(‘app://self/greeting)    トに挨拶リソースのリ                   てください。

  ->withQuery(['lang' => $lang]) クエストがセットされ
                                 ただけです。                       結果でなくリクエスト
  ->request();                                                方法をキャッシュする
                                                              からです。
                                       リクエストはGET
                                       app://self/greering?
                                       lang=$langという文
                                       字列表現ができます。
Query Provider
                                        クエリーの不足があれ
public function onGet($id)              ば、クエリープロバイ

{                                       ダーが活躍します。      日付の分からないカレ
                                                       ンダーリソースが
   $this['greeting'] = $this->resource
                                                       ビューに現れる →
   ->get                                               @Providesで日付リ
   ->uri(‘app://self/user)                             ソースに問い合わせ日
                                                       付を得て表示
   ->withQuery(['id' => $id])
                                この例ではユーザーid
   ->request();                                        この場合、ビューに最
                                が指定されないリクエ
}                               ストがあれば                 初に日付を用意する責
                                                       任がありません。プロ
/**                             provideIdメソッドが
                                その足りない引き数を             バイダで呼ばれる日付
  * @Provides("id")                                    リソースがその責任を
                                用意します。
  */                                       これはメソッドの呼
                                                       負います。

public function provideId()                び出しの反転が可能
                                                       引き数の注入です。制
{                                          になります。
                                                       御が反転しています。
   return $_SESSION['user_id'];
}
Injectable Resource


$schemeCollection = new SchemeCollection;
$schemeCollection
->scheme('app')         リソースのURIに応じて
                        呼び出される処理系
->host('self')          (リソースアダプ
                                            URIには実装の指定が
                                            なく「ユーザーの問題
->toAdapter(new App);   ター)は固定されてい
                                            空間の言語」というこ
                         ません。全てインジェ
                                            とができます。
                         クションされます。
$schemeCollection
->scheme('page')
->host('self')                                   app://self/userが実施にDB
->toAdapter(new Page);     元々固定された実装がない          なのかmysqlなのかクライア
                           ためモックオブジェクト相当         ントは区別しません。
                           の機能は容易に実現できま
                           す。
Return $this
                                  リクエストされたリ
                                  ソースは自身(リソー
                                  スオブジェクト)を構
                                  成した後、自身を返し
                                  ます。



public function onGet($lang)
{
    $this[‘greeting’] = $this->message[$lang];
    return $this;
}                            もしリソースオブジェ
                            クト以外がreturnされ   リソースクライアント
                            れば、その値をbody     はいつもリソースオブ
                            にしたリソースオブ       ジェクトが返る事が期
                            ジェクトが返ります。      待できます。
Sync Request
                          sync requestはリソー
                          スリクエストをまとめ         実際の処理はスキーマ
                          て扱う仕組みです。          によって変わります。


                                             HTTPリソースでは同

public function onGet($lang)                 時リクエストを行いま
                                             す。
{
    $response = $this->resource
    ->get->uri($uri1)->eager->sync->request()
    ->get->uri($uri2)->eager->sync->request()
    ->get->uri($uri3)->eager->sync->request()
    ->get->uri($uri4)->eager->eager->request();
}
Resource Link

• リソースはリンク可能です
• リソース間の関係をクライアントでは
 なくリソース側が持ちます

• Aタグのイメージです。関係性はカプセ
 ル化されクリックしただけで関連リ
 ソースにジャンプできます。
Resource LinkSelf

                                        リソースはリンクする
                                        ことができます。


                                        この例ではユーザーリ
public function onGet($lang)            ソースからプロファイ
{                                       ルリソースにリンクし

  $this['greeting'] = $this->resource   ています。

  ->get
                                linkSelfでリンクされ
  ->uri(‘app://self/user)       ているので元のリンク
  ->withQuery(['id' => $id])    は失われクライアント
                                                 HTMLのAタグで別の
  ->linkSelf(‘profile’)         はプロファイルリソー
                                                 ページに進んだイメー
                                スだけが取得されま
  ->request();                  す。
                                                 ジです。


                                                 <a target= _self >
Resource LinkNew

                                        linkNewのリンクは元
public function onGet($lang)            のリンクとリンク先の
                                        リソースを合成して取
{                                       得します。
  $this['greeting'] = $this->resource
  ->get
  ->uri(‘app://self/user)                     ブラウザで複数の
                                              windowを開くイメー
  ->withQuery(['id' => $id])                  ジです。
  ->linkNew(‘friend’)
  ->linkNew(‘profile’)                        <a target= _blank >

  ->request();
Resource LinkCrawl

                                        linkCrawlはbot(ク
                                        ローラー)のイメージ
public function onGet($lang)            です。

{
  $this['greeting'] = $this->resource
  ->get
  ->uri(‘app://self/entry)
  ->withQuery(['id' => $id])                1:nの関係のリソース
  ->linkCrawl(‘comment’)                    のリンクの順をたどり
                                            ツリー構造のリソース
  ->linkCrawl(‘review’)                     グラフを取得します。
  ->request();
Aspect Oriented Programing
アスペクト指向


• 横断的関心事 を扱います
• メソッドインターセプター
• アノテーションで指定
メソッドインターセ
                                                   プターはメソッドを
                                                   のっとり(インター
                                                   セプトして)他の付随
                                                   的な処理(ログやト      ログやトランザクショ
                                                   ランザクション)と合     ンなどクロスカッティ
                                                   わせて行います。       ングコンサーン(横断
     Timer Start                                                  的関心事)とコアコン
                                                                  サーン(本質的関心
                                                                  事)を分離します。
                   Validation

                    Transaction begin
Business Logic A                Business Logic B                Business Logic C

                    Commit ? Rollback ?

                   Log
              Post Filter
     Timer Stop
@Aspect
             アスペクト指向を適用
             するクラスに

/**          @Aspectとマークし
             ます
  *
  * @Aspect
  */
class Aop extends AbstractObject
{
     /**
       * @Log                       @Logはメソッドイン
       */                           ターセプターを指定し
     public function onGet($lang)   ています。

     {
       ...
MethodInterceptor
                                        Ray.AopはAOPアラ
/**                                     イアンスのインター
  * @Log Interceptor                    フェイスの一部を実装
                                        したアスペクト指向フ
  *                                     レームワークです。
  */
class Log implements MethodInterceptor
{
     public function invoke(MethodInvocation $invocation)
     {
         $result = $invocation->proceed(); オリジナルメソッド実行
         $class = get_class($invocation->getThis());
         $input = $invocation->getArguments();
         $input = json_encode($input);
         $result .= PHP_EOL . "[Log] target = $class, input =
$input, result = $result" . PHP_EOL; オリジナルメソッドの実行
         return $result;               結果を編集しています
     }
@Log
                                        Ray.AopはAOPアラ
                                        イアンスのインター
                                        フェイスの一部を実装
                                        したアスペクト指向フ
                                        レームワークです。




protected function configure()
{
   $interceptors =[new Log];       インターセプターを(複数)指定。

   $this->registerInterceptAnnotation('Log', $interceptors);
                                    @Logアノテーションとして
                                    登録しています。
Hypermedia as the Engine of Application State
HATEOAS


    • =Hypermedia as the Engine of
                        状態遷移

       Application State (状態マシンを
       ハイパーメディアで表現する)

    • 状態遷移がハイパーリンクで得られる
http://www.infoq.com/jp/articles/webber-rest-workflow
rel link
public function onGet($drink)     リソース間の関係をリ
{                                 ソース側が持っていま
                                                    注文を済まして、支払に
                                  す。
    $order = $this->resource                        状態が変わっています。

    ->post
    ->uri('app://self/RestBucks/Order')
    ->withQuery(['drink' => $drink])->eager->request();
    $paymentUri = $order->links['payment'];
    注文の結果、「支払のURI」がヘッダーから得られました。
    $payment = array('credit_card_number' => '123456789',
                                                    リソースは自己記述的
'name' => 'John Citizen', 'amount' => '4.00');      です。

    $this['payment'] = $this->resource
                                                    リソースはクライアン
    ->put                                           トを気にせず関係性を
    ->uri($paymentUri)                              変更できます。

    ->addQuery($payment)->request();
    つまり注文と支払の関係はリソースが持っていて
    クライアントにその知識は必要ありません。

More Related Content

What's hot

Pbijp758 #02 Power BI で Twitter分析する
Pbijp758 #02 Power BI で Twitter分析するPbijp758 #02 Power BI で Twitter分析する
Pbijp758 #02 Power BI で Twitter分析するTeruchika Yamada
 
大規模負荷試験時にやったこと
大規模負荷試験時にやったこと大規模負荷試験時にやったこと
大規模負荷試験時にやったことまべ☆てっく運営
 
フロー技術によるネットワーク管理
フロー技術によるネットワーク管理フロー技術によるネットワーク管理
フロー技術によるネットワーク管理Motonori Shindo
 
IT エンジニアのための 流し読み Windows - Microsoft Defender Exploit Guard
IT エンジニアのための 流し読み Windows - Microsoft Defender Exploit GuardIT エンジニアのための 流し読み Windows - Microsoft Defender Exploit Guard
IT エンジニアのための 流し読み Windows - Microsoft Defender Exploit GuardTAKUYA OHTA
 
Kubernetes で実践するクラウドネイティブ DevOps "監視とオブザーバビリティ"編 / Cloud Native DevOps with K...
Kubernetes で実践するクラウドネイティブ DevOps "監視とオブザーバビリティ"編 / Cloud Native DevOps with K...Kubernetes で実践するクラウドネイティブ DevOps "監視とオブザーバビリティ"編 / Cloud Native DevOps with K...
Kubernetes で実践するクラウドネイティブ DevOps "監視とオブザーバビリティ"編 / Cloud Native DevOps with K...Preferred Networks
 
画像ベース異常検知Amazon Lookout for Visionを使ってみよう
画像ベース異常検知Amazon Lookout for Visionを使ってみよう画像ベース異常検知Amazon Lookout for Visionを使ってみよう
画像ベース異常検知Amazon Lookout for Visionを使ってみようTakanoriTsutsui
 
WPSCanによるWordPressの脆弱性スキャン
WPSCanによるWordPressの脆弱性スキャンWPSCanによるWordPressの脆弱性スキャン
WPSCanによるWordPressの脆弱性スキャンOWASP Nagoya
 
10分でわかる Cilium と XDP / BPF
10分でわかる Cilium と XDP / BPF10分でわかる Cilium と XDP / BPF
10分でわかる Cilium と XDP / BPFShuji Yamada
 
俺の俺による俺のための App Service Environment
俺の俺による俺のための App Service Environment俺の俺による俺のための App Service Environment
俺の俺による俺のための App Service EnvironmentSunao Tomita
 
MySQLデータ暗号化と暗号鍵のローテーション
MySQLデータ暗号化と暗号鍵のローテーションMySQLデータ暗号化と暗号鍵のローテーション
MySQLデータ暗号化と暗号鍵のローテーションShinya Sugiyama
 
CSS Styling for Eclipse RCP 3.x and 4.x
CSS Styling for Eclipse RCP 3.x and 4.xCSS Styling for Eclipse RCP 3.x and 4.x
CSS Styling for Eclipse RCP 3.x and 4.xKai Tödter
 
3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal3分でわかるAzureでのService Principal
3分でわかるAzureでのService PrincipalToru Makabe
 
Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)
Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)
Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)NTT DATA Technology & Innovation
 
脆弱性スキャナVuls(入門編)
脆弱性スキャナVuls(入門編)脆弱性スキャナVuls(入門編)
脆弱性スキャナVuls(入門編)Takayuki Ushida
 
Windows10の展開手法
Windows10の展開手法Windows10の展開手法
Windows10の展開手法NAOKI ABE
 
C#で作ったプログラムのインストーラーをInnoSetupで作成(1)
C#で作ったプログラムのインストーラーをInnoSetupで作成(1)C#で作ったプログラムのインストーラーをInnoSetupで作成(1)
C#で作ったプログラムのインストーラーをInnoSetupで作成(1)Kenichi Yamada
 

What's hot (19)

Pbijp758 #02 Power BI で Twitter分析する
Pbijp758 #02 Power BI で Twitter分析するPbijp758 #02 Power BI で Twitter分析する
Pbijp758 #02 Power BI で Twitter分析する
 
大規模負荷試験時にやったこと
大規模負荷試験時にやったこと大規模負荷試験時にやったこと
大規模負荷試験時にやったこと
 
フロー技術によるネットワーク管理
フロー技術によるネットワーク管理フロー技術によるネットワーク管理
フロー技術によるネットワーク管理
 
DevOpsって何?
DevOpsって何?DevOpsって何?
DevOpsって何?
 
IT エンジニアのための 流し読み Windows - Microsoft Defender Exploit Guard
IT エンジニアのための 流し読み Windows - Microsoft Defender Exploit GuardIT エンジニアのための 流し読み Windows - Microsoft Defender Exploit Guard
IT エンジニアのための 流し読み Windows - Microsoft Defender Exploit Guard
 
Kubernetes で実践するクラウドネイティブ DevOps "監視とオブザーバビリティ"編 / Cloud Native DevOps with K...
Kubernetes で実践するクラウドネイティブ DevOps "監視とオブザーバビリティ"編 / Cloud Native DevOps with K...Kubernetes で実践するクラウドネイティブ DevOps "監視とオブザーバビリティ"編 / Cloud Native DevOps with K...
Kubernetes で実践するクラウドネイティブ DevOps "監視とオブザーバビリティ"編 / Cloud Native DevOps with K...
 
画像ベース異常検知Amazon Lookout for Visionを使ってみよう
画像ベース異常検知Amazon Lookout for Visionを使ってみよう画像ベース異常検知Amazon Lookout for Visionを使ってみよう
画像ベース異常検知Amazon Lookout for Visionを使ってみよう
 
WPSCanによるWordPressの脆弱性スキャン
WPSCanによるWordPressの脆弱性スキャンWPSCanによるWordPressの脆弱性スキャン
WPSCanによるWordPressの脆弱性スキャン
 
10分でわかる Cilium と XDP / BPF
10分でわかる Cilium と XDP / BPF10分でわかる Cilium と XDP / BPF
10分でわかる Cilium と XDP / BPF
 
俺の俺による俺のための App Service Environment
俺の俺による俺のための App Service Environment俺の俺による俺のための App Service Environment
俺の俺による俺のための App Service Environment
 
MySQLデータ暗号化と暗号鍵のローテーション
MySQLデータ暗号化と暗号鍵のローテーションMySQLデータ暗号化と暗号鍵のローテーション
MySQLデータ暗号化と暗号鍵のローテーション
 
CSS Styling for Eclipse RCP 3.x and 4.x
CSS Styling for Eclipse RCP 3.x and 4.xCSS Styling for Eclipse RCP 3.x and 4.x
CSS Styling for Eclipse RCP 3.x and 4.x
 
3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal
 
WebRTC研修
WebRTC研修WebRTC研修
WebRTC研修
 
Application Load Balancer
Application Load BalancerApplication Load Balancer
Application Load Balancer
 
Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)
Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)
Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)
 
脆弱性スキャナVuls(入門編)
脆弱性スキャナVuls(入門編)脆弱性スキャナVuls(入門編)
脆弱性スキャナVuls(入門編)
 
Windows10の展開手法
Windows10の展開手法Windows10の展開手法
Windows10の展開手法
 
C#で作ったプログラムのインストーラーをInnoSetupで作成(1)
C#で作ったプログラムのインストーラーをInnoSetupで作成(1)C#で作ったプログラムのインストーラーをInnoSetupで作成(1)
C#で作ったプログラムのインストーラーをInnoSetupで作成(1)
 

Similar to BEAR.Sunday Note

リソースフレームワークBEARのススメ(PHP勉強会#51)
リソースフレームワークBEARのススメ(PHP勉強会#51)リソースフレームワークBEARのススメ(PHP勉強会#51)
リソースフレームワークBEARのススメ(PHP勉強会#51)stellaqua
 
LaravelでAPI定義を管理する
LaravelでAPI定義を管理するLaravelでAPI定義を管理する
LaravelでAPI定義を管理するKenjiro Kubota
 
Garageを触ってみた
Garageを触ってみたGarageを触ってみた
Garageを触ってみたYoichi Toyota
 
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介Shotaro Suzuki
 
RIAのマルチスクリーン展開とFlash Platform
RIAのマルチスクリーン展開とFlash PlatformRIAのマルチスクリーン展開とFlash Platform
RIAのマルチスクリーン展開とFlash PlatformTeiichi Ota
 
Adobe RIA製品のご紹介 Flash PlatformとFlexフレームワーク
Adobe RIA製品のご紹介 Flash PlatformとFlexフレームワークAdobe RIA製品のご紹介 Flash PlatformとFlexフレームワーク
Adobe RIA製品のご紹介 Flash PlatformとFlexフレームワークTeiichi Ota
 
Ruby on Rails の規約
Ruby on Rails の規約Ruby on Rails の規約
Ruby on Rails の規約Shuhei Iitsuka
 

Similar to BEAR.Sunday Note (9)

BEAR.Sunday.meetup #0
BEAR.Sunday.meetup #0BEAR.Sunday.meetup #0
BEAR.Sunday.meetup #0
 
リソースフレームワークBEARのススメ(PHP勉強会#51)
リソースフレームワークBEARのススメ(PHP勉強会#51)リソースフレームワークBEARのススメ(PHP勉強会#51)
リソースフレームワークBEARのススメ(PHP勉強会#51)
 
LaravelでAPI定義を管理する
LaravelでAPI定義を管理するLaravelでAPI定義を管理する
LaravelでAPI定義を管理する
 
Garageを触ってみた
Garageを触ってみたGarageを触ってみた
Garageを触ってみた
 
勉強会資料①
勉強会資料①勉強会資料①
勉強会資料①
 
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
 
RIAのマルチスクリーン展開とFlash Platform
RIAのマルチスクリーン展開とFlash PlatformRIAのマルチスクリーン展開とFlash Platform
RIAのマルチスクリーン展開とFlash Platform
 
Adobe RIA製品のご紹介 Flash PlatformとFlexフレームワーク
Adobe RIA製品のご紹介 Flash PlatformとFlexフレームワークAdobe RIA製品のご紹介 Flash PlatformとFlexフレームワーク
Adobe RIA製品のご紹介 Flash PlatformとFlexフレームワーク
 
Ruby on Rails の規約
Ruby on Rails の規約Ruby on Rails の規約
Ruby on Rails の規約
 

More from Akihito Koriyama

PHPカンファレンス関西2014 「全てを結ぶ力」
PHPカンファレンス関西2014 「全てを結ぶ力」PHPカンファレンス関西2014 「全てを結ぶ力」
PHPカンファレンス関西2014 「全てを結ぶ力」Akihito Koriyama
 
A resource oriented framework using the DI/AOP/REST triangle
A resource oriented framework using the DI/AOP/REST triangleA resource oriented framework using the DI/AOP/REST triangle
A resource oriented framework using the DI/AOP/REST triangleAkihito Koriyama
 
An object graph visualizer for PHP - print_o
An object graph visualizer for PHP - print_oAn object graph visualizer for PHP - print_o
An object graph visualizer for PHP - print_oAkihito Koriyama
 
The new era of PHP web development.
The new era of PHP web development.The new era of PHP web development.
The new era of PHP web development.Akihito Koriyama
 

More from Akihito Koriyama (14)

PHPカンファレンス関西2014 「全てを結ぶ力」
PHPカンファレンス関西2014 「全てを結ぶ力」PHPカンファレンス関西2014 「全てを結ぶ力」
PHPカンファレンス関西2014 「全てを結ぶ力」
 
A resource oriented framework using the DI/AOP/REST triangle
A resource oriented framework using the DI/AOP/REST triangleA resource oriented framework using the DI/AOP/REST triangle
A resource oriented framework using the DI/AOP/REST triangle
 
PHP Coding in BEAR.Sunday
PHP Coding in BEAR.SundayPHP Coding in BEAR.Sunday
PHP Coding in BEAR.Sunday
 
BEAR.Sunday 1.X
BEAR.Sunday 1.XBEAR.Sunday 1.X
BEAR.Sunday 1.X
 
BEAR.Sunday $app
BEAR.Sunday $appBEAR.Sunday $app
BEAR.Sunday $app
 
BEAR.Sunday@phpcon2012
BEAR.Sunday@phpcon2012BEAR.Sunday@phpcon2012
BEAR.Sunday@phpcon2012
 
An object graph visualizer for PHP - print_o
An object graph visualizer for PHP - print_oAn object graph visualizer for PHP - print_o
An object graph visualizer for PHP - print_o
 
BEAR.Sunday Offline Talk
BEAR.Sunday Offline TalkBEAR.Sunday Offline Talk
BEAR.Sunday Offline Talk
 
PHP: Dis Is It
PHP: Dis Is ItPHP: Dis Is It
PHP: Dis Is It
 
The new era of PHP web development.
The new era of PHP web development.The new era of PHP web development.
The new era of PHP web development.
 
BEAR (Suday) design
BEAR (Suday) designBEAR (Suday) design
BEAR (Suday) design
 
BEAR DI
BEAR DIBEAR DI
BEAR DI
 
BEAR Architecture
BEAR ArchitectureBEAR Architecture
BEAR Architecture
 
BEAR v0.9 (Saturday)
BEAR v0.9 (Saturday)BEAR v0.9 (Saturday)
BEAR v0.9 (Saturday)
 

Recently uploaded

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 

Recently uploaded (9)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 

BEAR.Sunday Note

  • 2. DIフレームワーク Ray.Di オブジェクトの生成と取得 Ray.Aop 横断的利用 コンポーネント構成図 BEAR.Resource サービスレイヤー オブジェクトのリソース化 Monolog Guzzle Doctorine オブジェクトフレームワーク Aura.Router Aura.Web Aura.Cli Twig Smarty3 Haanga BEAR.Framework アプリケーションコントローラー zf2 Symfony2 PEAR リソースフレームワーク /vendor BEAR.Sunday
  • 3. Apache Tapestry Apache Click CMS PUSH Framework Architecture PULL Ruby On Rails Django Symfony / CakePHP
  • 5. Web Client Clinet Side Server Side Dispatcher & Router OPTION ページは自身を構 成し、それが表現 Resource Client になりクライアン トに返ります。 サーバー内クライアント RES Resource A Page Resource RES Resource B RES RES Representation (View) RES Resource C RES リソース内に ビューを持ち、リ ソースは状態から 表現に変わりま PUSH
  • 6. Web CLI API Service Clinet Side Socket HTTP Another App GET PUT POST DELETE HEAD OPTIONS HTTP Verb Server Side Dispatcher & Router リソースは自身を OPTION 構成するために必 要あれば他のリ App Resource ソースをリクエス トします。 Resource Client GET app://self/user/friend?user_id=1 サーバー内クライアント GET page://self/user?id=1 App Resource GET PUT POST DELETE GET app://self/user/profile?user_id=1 GET app://self/user?id=1 リソースはHTTP 動詞とURIで繋が RES App Resource れています Page Resource RES Representation (View) RES GET POST PUT HTTP Resource X Resource FIle Resource OPTION Another App A Resource Another App B Resource PUSH
  • 8. Web Client Clinet Side Server Side Dispatcher & Router OPTION Resource A Resource B RES RES Resource C RES RES View RES RES HTML PHP Doc DB Viewにはリソース のプレースフォル ダだけがありま す。 それをトリガーに リソースがPULLリ クエストされま す。 CMSやRIA、JS MVC等と親和性が 高いのではないで しょうか。 PULL
  • 10. Resource Client GET app://self/user?id=1 USER “User” Resource User Page GET app://self/friend?user_id=1 FRIEND “Friend” Resource このユーザーペー リソースは単数また ジは2つのアプリ は複数のリソースで ケーションリソー 構成されますが、ク スで構成されてい ライアントには構成 ます。 がわかりません リソースの関係はリ Resource Client クエストで表す事が それぞれのリクエ ???? できます。 ストは自身のス ロットに格納され ました。 USER FRIEND
  • 11. Resource Client GET app://self/user?id=1 User Page User Resource USER [‘name’=>‘koriym’, ‘status’=>’OK’] ユーザーページはリ ソースクライアントか ユーザーリソースは状 らみたらサービスです Representation State 態を持ち、その状態を が、ユーザーリソース リソース表現状態の移動 表現にしてリクエスト に対してはクライアン もとに移動(返)され Transfer トです これが ます。 ユーザーページが ユーザーリソースを REpresentation State Transfer 利用する関係は 固定 RESTです。 されリクエストに関 わらず不変です。
  • 12. USER1 GET app://self/user?id=1 User Page or USER2 [‘name’=>‘koriym’, ‘status’=>’OK’] observe 外部へのリクエストは 自身のスロットに格納 します。方法は2つあ リクエスト、あるいは リクエストハンドラー ります。 リクエスト結果です。 は、ページが仕事を終 える(自身を構成す る)のを持ってます。 Req Handler 次は彼の出番だからで す。
  • 13. CQRS NEWS GET app://self/news/top 実行 LOGIN GET app://self/login/current/user ACL適用しなくては AD GET app://self/ad/weekly/rotation これはキャッシュあるはず Top Page POST app://self/footprint/counter?inc=1 これはページ表示後でいいや PUT app://self/log/user/ua これはキューにいれる POST app://self/ntry/new GET用のビューを今すぐつくる ページは自身を構成 リクエストハンドラー することだけに専念 はURIやコンテキスト します。 でそのリクエストをど ういう風に実行するか を判断しながらページ まず、ページは他のリ Req Handler をインスタンス(実 ソースリクエストを 体)にします。 持った構造=リソース with グラフです。 Injectable URI Router Test ? Stage ?
  • 14. NEWS インスタンス(実体) LOGIN インスタンス(実体) AD リクエスト Top Page 後は単純な出力スク 出現するかしないか リプトがテンプレート テンプレートが決める にまとめてアサインし リクエストハンドラは からまだ分からないの て出力するだけです。 必要な仕事をして、ほ 一部残っているのは です。 とんどのリクエストが ビューに出現したタイ 結果(インスタンス) ミングでリクエストを に変わりました。 if (! 有料ユーザー) { 行うLazy Requestリ {$ad} ソースでしょう。 } こういうテンプレート かもしれません。
  • 15. Script File http://www.grrinninbear.com.au/vet/vsb_cartoons/0403_02Cartoons.html
  • 17. Native PHP Script 10年前のPHPを思い出そう スクリプトとは読み込 んだだけで実行される 台本(Script) ページの構成をスクリ プトファイルで構成し 簡易な記述で手順がか ていました。 いてあります。 include 'header.php'; 大きな粒度でスクリ プトを追加削除でき include 'sub_header.php'; た。つまり ユーザー include 'menu.php'; は自由にページの構 include 'body.php'; 造を構成できまし include 'footer.php'; 問題はそれぞれのスク リプト内の勝手なグ ローバル化する変数 ではその問題を解決し や、ステート。共通の て、フレームワーク全 フレームを持たない 体構造をスクリプトで 事。 記述でき、ユーザーが 構成できるようになれ ばどうでしょうか?
  • 18. スクリプトファイル web // Application $app = App::factory($runMode, $useCache); ページリソースをHTMLと して出力します // Route // Dispatch list($method, $pagePath, $query) = (new Router)->match($globals); // Request try { $page = $app->resource->$method->uri('page://self/' . $pagePath)->withQuery($query)->eager->request(); } catch (Exception $e) { $page = $app->exceptionHandler->handle($e); } // Transfer $app->response->setResource($page)->render()->prepare()->send();
  • 19. スクリプトファイル API このスクリプトはリ ソースをWeb APIとし て出力します。 try { list($method, $query) = (new Router)->getMethodQuery($globals); list($resource, $page) = (new Dispatcher($app))->getInstance($uri); // Request $page = $app->resource->$method->object($page)->withQuery($globals['_GET'])- >eager->request(); } catch (Exception $e) { $page = $app->exceptionHandler->handle($e); } $app->response->setResource($page)->render()->prepare()->send();
  • 21. DI • インターフェイスに依存 • オブジェクトの取得は基本しない • するならインジェクトされた専用ファ クトリで • Google Guice スタイルのアノテー ションベースのインジェクション
  • 22. Object DI dependency A Value dependency B $injector->getInstance(‘nametoservice’); A Injector B module インジェクターはオブ ジェクトを取得すると Service きに、そのオブジェク トが必要(依存)なイ ンスタンスがインジェ クト(注入)します。
  • 23. Object DI dependency A Value dependency B $injector->getInstance(‘nametoservice’); A Injector A dependency A B module インジェクターに セットされた「モ B Service dependency B ジュール」は、注入の ルールを知っていま 最も単純で、最も使われ す。 るルールは特定のイン ターフェイスが指定され たら、特定のクラスで生 成したインスタンスを注 入するというものですと いうものです。
  • 24. Injectable Module モジュールにはアプリ ケーションの全ての依 存がセットされていま す。 Injector module A モジュールは交換可能です。 他のアプリのモジュールに 入れ替えると、他のアプリ のリソースが利用できま す。 つまり同じ/userリソースで も違うDBの依存を用いま module B す。複数のアプリケーショ ンのリソースが同じインスタ ンスで使えます。
  • 25. DI @Inject インジェクトが欲しい ところに@Injectと マークします。 /** * @param Resource $resource Resource Client * * @Inject */ public function __construct(Resource $resource) { タイプヒントはクラス $this->resource = $resource; 名でなくインターフェ イスまたは抽象クラス を指定します。
  • 26. DI Binding このModuleではイン Moduleクラスは ターフェイスに対応す configureという、た るクラスを設定してい だ一つのメソッドを持 ます。 ち、そこにバイディン グDSLを書きます。 protected function configure() { $this->bind('BEARResourceResource')->to('BEARResourceClient'); $this->bind('BEARResourceInvokable')->to('BEARResourceInvoker'); $this->bind('BEARResourceLinkable')->to('BEARResourceLinker'); } Google GuiceのBindingのサブセットが 用意されています。 詳しくはRay.Diのマニュアルを http://code.google.com/p/rayphp/
  • 27. Life Cycle /** 初期化は * @PostConstruct @PostConstructメ */ ソッドで指定します。 public function onInit() { ... /** * @PreDestory */ 終了処理は@PreDestoroyメ ソッドで指定します。 public function onEnd() { http://en.wikipedia.org/ wiki/JSR_250
  • 28. DI Injected Factory そのページで必要なコ 生成時のアノテーショ /** ンストラクションは全 ンやバインディング、 * @param Resource てキャッシュされま $resource Resource インジェクトのコスト Client * す。 がキャッシュ後はかか りません。 * @Inject */ public function __construct(Resource $resource) { $this->resource = $resource; $this->greeting = $resource->newInstance('app://self/ greeting'); オブジェクトの生成は リクエストよらず不変 です。
  • 29. Scope Scopeアノテーション でsingletonか毎回生 /** 成されるprototypeを * Singleton Service 指定することができま す。 * * @Scope(“singleton”) */ $this->bind('RayDiMockDbInterface') モジュールでもシング ->to('RayDiMockDb') ルトン指定できます。 ->in(Scope::SINGLETON);
  • 30. オブジェクトは他のオ ブジェクトを必要とし ページリソースを1つ ます。その他のオブ 取得したらすべてが連 ジェクトも違うオブ 鎖取得され巨大なオブ ジェクトを必要としま ジェクトグラフがつく す。 られます
  • 31. これは全てがインジェ クト済みの HelloWorldアプリで す。 これをUnserializeす るだけでこういうグラ フが得られます。 so far so goodです がまだまだ調べます。
  • 33. Resource Request • リソースにはURIがあります • DSLでリクエスト • 名前引き数で • メソッドはHTTP準拠 • 様々なリクエスト方法
  • 34. Message passing in PHP Client Service $service->read(1, 2) インスタンスを指定 順番で引数を指定 普通のPHPでのメ ソッド呼び出しです。 メソッド名を指定 足りない引数があると... 1) 宣言部のデフォルトが補完 2) Service内で取得する クライアントで引数を えるの が基本です。
  • 35. Message passing in BEAR Client Service $resource ->get 制限されたリクエストメソッド ->uri(‘app://self/service’) URI ->withQuery([‘item’ => 1, 'quantity' =>2]) 名前付クエリー ->eager ”すぐに” ->request(); EOR (end of request) webサービスをリクエ ストするようにリクエ ストします。
  • 36. Eager Request 挨拶リソースにGETリ クエストをしていま その結果を自分自身の す。 greetingというスロッ トに保存しています。 eagerではリクエスト public function onGet($lang) 結果が得られます { $this['greeting'] = $this->resource ->get $this[ greeting ]は ->uri(‘app://self/greeting) $this->body[ greeting ]の ->withQuery(['lang' => $lang]) ショートカットです。 ->eager 引き数は変数名で指定して います。 ->request();
  • 37. Lazy Request eagerが無いとリクエ スト結果だけではな く、リクエストそのも このリクエストはリク のがスロットに入りま エストハンドラーが行 す。 うか、ビューで出現し たタイミングで行うか はこのスクリプトでは public function onGet($lang) 指定しません。 { このリソースをキャッ シュしてもリクエスト $this['greeting'] = $this->resource 先のリソースは正しく ->get greetingというスロッ 反映されるのに注目し ->uri(‘app://self/greeting) トに挨拶リソースのリ てください。 ->withQuery(['lang' => $lang]) クエストがセットされ ただけです。 結果でなくリクエスト ->request(); 方法をキャッシュする からです。 リクエストはGET app://self/greering? lang=$langという文 字列表現ができます。
  • 38. Query Provider クエリーの不足があれ public function onGet($id) ば、クエリープロバイ { ダーが活躍します。 日付の分からないカレ ンダーリソースが $this['greeting'] = $this->resource ビューに現れる → ->get @Providesで日付リ ->uri(‘app://self/user) ソースに問い合わせ日 付を得て表示 ->withQuery(['id' => $id]) この例ではユーザーid ->request(); この場合、ビューに最 が指定されないリクエ } ストがあれば 初に日付を用意する責 任がありません。プロ /** provideIdメソッドが その足りない引き数を バイダで呼ばれる日付 * @Provides("id") リソースがその責任を 用意します。 */ これはメソッドの呼 負います。 public function provideId() び出しの反転が可能 引き数の注入です。制 { になります。 御が反転しています。 return $_SESSION['user_id']; }
  • 39. Injectable Resource $schemeCollection = new SchemeCollection; $schemeCollection ->scheme('app') リソースのURIに応じて 呼び出される処理系 ->host('self') (リソースアダプ URIには実装の指定が なく「ユーザーの問題 ->toAdapter(new App); ター)は固定されてい 空間の言語」というこ ません。全てインジェ とができます。 クションされます。 $schemeCollection ->scheme('page') ->host('self') app://self/userが実施にDB ->toAdapter(new Page); 元々固定された実装がない なのかmysqlなのかクライア ためモックオブジェクト相当 ントは区別しません。 の機能は容易に実現できま す。
  • 40. Return $this リクエストされたリ ソースは自身(リソー スオブジェクト)を構 成した後、自身を返し ます。 public function onGet($lang) { $this[‘greeting’] = $this->message[$lang]; return $this; } もしリソースオブジェ クト以外がreturnされ リソースクライアント れば、その値をbody はいつもリソースオブ にしたリソースオブ ジェクトが返る事が期 ジェクトが返ります。 待できます。
  • 41. Sync Request sync requestはリソー スリクエストをまとめ 実際の処理はスキーマ て扱う仕組みです。 によって変わります。 HTTPリソースでは同 public function onGet($lang) 時リクエストを行いま す。 { $response = $this->resource ->get->uri($uri1)->eager->sync->request() ->get->uri($uri2)->eager->sync->request() ->get->uri($uri3)->eager->sync->request() ->get->uri($uri4)->eager->eager->request(); }
  • 42. Resource Link • リソースはリンク可能です • リソース間の関係をクライアントでは なくリソース側が持ちます • Aタグのイメージです。関係性はカプセ ル化されクリックしただけで関連リ ソースにジャンプできます。
  • 43. Resource LinkSelf リソースはリンクする ことができます。 この例ではユーザーリ public function onGet($lang) ソースからプロファイ { ルリソースにリンクし $this['greeting'] = $this->resource ています。 ->get linkSelfでリンクされ ->uri(‘app://self/user) ているので元のリンク ->withQuery(['id' => $id]) は失われクライアント HTMLのAタグで別の ->linkSelf(‘profile’) はプロファイルリソー ページに進んだイメー スだけが取得されま ->request(); す。 ジです。 <a target= _self >
  • 44. Resource LinkNew linkNewのリンクは元 public function onGet($lang) のリンクとリンク先の リソースを合成して取 { 得します。 $this['greeting'] = $this->resource ->get ->uri(‘app://self/user) ブラウザで複数の windowを開くイメー ->withQuery(['id' => $id]) ジです。 ->linkNew(‘friend’) ->linkNew(‘profile’) <a target= _blank > ->request();
  • 45. Resource LinkCrawl linkCrawlはbot(ク ローラー)のイメージ public function onGet($lang) です。 { $this['greeting'] = $this->resource ->get ->uri(‘app://self/entry) ->withQuery(['id' => $id]) 1:nの関係のリソース ->linkCrawl(‘comment’) のリンクの順をたどり ツリー構造のリソース ->linkCrawl(‘review’) グラフを取得します。 ->request();
  • 47. アスペクト指向 • 横断的関心事 を扱います • メソッドインターセプター • アノテーションで指定
  • 48. メソッドインターセ プターはメソッドを のっとり(インター セプトして)他の付随 的な処理(ログやト ログやトランザクショ ランザクション)と合 ンなどクロスカッティ わせて行います。 ングコンサーン(横断 Timer Start 的関心事)とコアコン サーン(本質的関心 事)を分離します。 Validation Transaction begin Business Logic A Business Logic B Business Logic C Commit ? Rollback ? Log Post Filter Timer Stop
  • 49. @Aspect アスペクト指向を適用 するクラスに /** @Aspectとマークし ます * * @Aspect */ class Aop extends AbstractObject { /** * @Log @Logはメソッドイン */ ターセプターを指定し public function onGet($lang) ています。 { ...
  • 50. MethodInterceptor Ray.AopはAOPアラ /** イアンスのインター * @Log Interceptor フェイスの一部を実装 したアスペクト指向フ * レームワークです。 */ class Log implements MethodInterceptor { public function invoke(MethodInvocation $invocation) { $result = $invocation->proceed(); オリジナルメソッド実行 $class = get_class($invocation->getThis()); $input = $invocation->getArguments(); $input = json_encode($input); $result .= PHP_EOL . "[Log] target = $class, input = $input, result = $result" . PHP_EOL; オリジナルメソッドの実行 return $result; 結果を編集しています }
  • 51. @Log Ray.AopはAOPアラ イアンスのインター フェイスの一部を実装 したアスペクト指向フ レームワークです。 protected function configure() { $interceptors =[new Log]; インターセプターを(複数)指定。 $this->registerInterceptAnnotation('Log', $interceptors); @Logアノテーションとして 登録しています。
  • 52. Hypermedia as the Engine of Application State
  • 53. HATEOAS • =Hypermedia as the Engine of 状態遷移 Application State (状態マシンを ハイパーメディアで表現する) • 状態遷移がハイパーリンクで得られる http://www.infoq.com/jp/articles/webber-rest-workflow
  • 54. rel link public function onGet($drink) リソース間の関係をリ { ソース側が持っていま 注文を済まして、支払に す。 $order = $this->resource 状態が変わっています。 ->post ->uri('app://self/RestBucks/Order') ->withQuery(['drink' => $drink])->eager->request(); $paymentUri = $order->links['payment']; 注文の結果、「支払のURI」がヘッダーから得られました。 $payment = array('credit_card_number' => '123456789', リソースは自己記述的 'name' => 'John Citizen', 'amount' => '4.00'); です。 $this['payment'] = $this->resource リソースはクライアン ->put トを気にせず関係性を ->uri($paymentUri) 変更できます。 ->addQuery($payment)->request(); つまり注文と支払の関係はリソースが持っていて クライアントにその知識は必要ありません。

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n