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

FHIR REST API 導論與使用
FHIR REST API 導論與使用FHIR REST API 導論與使用
FHIR REST API 導論與使用Lorex L. Yang
 
Hybrid Azure AD Join 動作の仕組みを徹底解説
Hybrid Azure AD Join 動作の仕組みを徹底解説Hybrid Azure AD Join 動作の仕組みを徹底解説
Hybrid Azure AD Join 動作の仕組みを徹底解説Yusuke Kodama
 
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティElasticsearch
 
ISTIO Deep Dive
ISTIO Deep DiveISTIO Deep Dive
ISTIO Deep DiveYong Feng
 
Azureをフル活用したサーバーレスの潮流について
Azureをフル活用したサーバーレスの潮流についてAzureをフル活用したサーバーレスの潮流について
Azureをフル活用したサーバーレスの潮流について真吾 吉田
 
OAuth認証再考からのOpenID Connect #devlove
OAuth認証再考からのOpenID Connect #devloveOAuth認証再考からのOpenID Connect #devlove
OAuth認証再考からのOpenID Connect #devloveNov Matake
 
詳説!Azure AD 条件付きアクセス - 動作の仕組みを理解する編
詳説!Azure AD 条件付きアクセス - 動作の仕組みを理解する編詳説!Azure AD 条件付きアクセス - 動作の仕組みを理解する編
詳説!Azure AD 条件付きアクセス - 動作の仕組みを理解する編Yusuke Kodama
 
JAWS-UG初心者支部 リザーブドインスタンス買ってみた
JAWS-UG初心者支部 リザーブドインスタンス買ってみたJAWS-UG初心者支部 リザーブドインスタンス買ってみた
JAWS-UG初心者支部 リザーブドインスタンス買ってみた佐藤 雅樹
 
現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...
現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...
現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...Masayuki Ota
 
Getting Started with CMIS
Getting Started with CMISGetting Started with CMIS
Getting Started with CMISJeff Potts
 
OAuth認証について
OAuth認証についてOAuth認証について
OAuth認証についてYoshifumi Sato
 
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open APIRESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open APIKohei Saito
 
Apigee の FAPI & CIBA 対応を実現する「Authlete (オースリート)」
Apigee の FAPI & CIBA 対応を実現する「Authlete (オースリート)」Apigee の FAPI & CIBA 対応を実現する「Authlete (オースリート)」
Apigee の FAPI & CIBA 対応を実現する「Authlete (オースリート)」Tatsuo Kudo
 
Azure active directory によるデバイス管理の種類とトラブルシュート事例について
Azure active directory によるデバイス管理の種類とトラブルシュート事例についてAzure active directory によるデバイス管理の種類とトラブルシュート事例について
Azure active directory によるデバイス管理の種類とトラブルシュート事例についてShinya Yamaguchi
 
監視基盤 ~ZabbixとCloudWatch~
監視基盤 ~ZabbixとCloudWatch~監視基盤 ~ZabbixとCloudWatch~
監視基盤 ~ZabbixとCloudWatch~真乙 九龍
 

What's hot (20)

FHIR REST API 導論與使用
FHIR REST API 導論與使用FHIR REST API 導論與使用
FHIR REST API 導論與使用
 
Hybrid Azure AD Join 動作の仕組みを徹底解説
Hybrid Azure AD Join 動作の仕組みを徹底解説Hybrid Azure AD Join 動作の仕組みを徹底解説
Hybrid Azure AD Join 動作の仕組みを徹底解説
 
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
 
ISTIO Deep Dive
ISTIO Deep DiveISTIO Deep Dive
ISTIO Deep Dive
 
Azureをフル活用したサーバーレスの潮流について
Azureをフル活用したサーバーレスの潮流についてAzureをフル活用したサーバーレスの潮流について
Azureをフル活用したサーバーレスの潮流について
 
Argo CD Deep Dive
Argo CD Deep DiveArgo CD Deep Dive
Argo CD Deep Dive
 
OAuth認証再考からのOpenID Connect #devlove
OAuth認証再考からのOpenID Connect #devloveOAuth認証再考からのOpenID Connect #devlove
OAuth認証再考からのOpenID Connect #devlove
 
詳説!Azure AD 条件付きアクセス - 動作の仕組みを理解する編
詳説!Azure AD 条件付きアクセス - 動作の仕組みを理解する編詳説!Azure AD 条件付きアクセス - 動作の仕組みを理解する編
詳説!Azure AD 条件付きアクセス - 動作の仕組みを理解する編
 
JAWS-UG初心者支部 リザーブドインスタンス買ってみた
JAWS-UG初心者支部 リザーブドインスタンス買ってみたJAWS-UG初心者支部 リザーブドインスタンス買ってみた
JAWS-UG初心者支部 リザーブドインスタンス買ってみた
 
現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...
現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...
現場ではこう使った~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database,...
 
Keycloakの動向
Keycloakの動向Keycloakの動向
Keycloakの動向
 
Getting Started with CMIS
Getting Started with CMISGetting Started with CMIS
Getting Started with CMIS
 
Keycloakのステップアップ認証について
Keycloakのステップアップ認証についてKeycloakのステップアップ認証について
Keycloakのステップアップ認証について
 
OAuth認証について
OAuth認証についてOAuth認証について
OAuth認証について
 
Apache Solr 入門
Apache Solr 入門Apache Solr 入門
Apache Solr 入門
 
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open APIRESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
 
Apigee の FAPI & CIBA 対応を実現する「Authlete (オースリート)」
Apigee の FAPI & CIBA 対応を実現する「Authlete (オースリート)」Apigee の FAPI & CIBA 対応を実現する「Authlete (オースリート)」
Apigee の FAPI & CIBA 対応を実現する「Authlete (オースリート)」
 
Azure active directory によるデバイス管理の種類とトラブルシュート事例について
Azure active directory によるデバイス管理の種類とトラブルシュート事例についてAzure active directory によるデバイス管理の種類とトラブルシュート事例について
Azure active directory によるデバイス管理の種類とトラブルシュート事例について
 
監視基盤 ~ZabbixとCloudWatch~
監視基盤 ~ZabbixとCloudWatch~監視基盤 ~ZabbixとCloudWatch~
監視基盤 ~ZabbixとCloudWatch~
 
OAuth2介紹
OAuth2介紹OAuth2介紹
OAuth2介紹
 

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

ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521Satoshi Makita
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイントonozaty
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。iPride Co., Ltd.
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperleger Tokyo Meetup
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑Akihiro Kadohata
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdkokinagano2
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )iwashiira2ctf
 
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルCRI Japan, Inc.
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員Sadaomi Nishi
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose EstimationToru Tamaki
 
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfTakayuki Nakayama
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一瑛一 西口
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdfAyachika Kitazaki
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)keikoitakurag
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計atsushi061452
 
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用KLab Inc. / Tech
 

Recently uploaded (16)

ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
 

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