perl Mojolicious:6

2015.01.22 Thursday 07:31
0
    # コマンド実態
    sub run {
    # コマンドライン引数は@argsに格納されます
    my ($self, @args) = @_;

    # コマンドライン引数をパースします
    GetOptionsFromArray(¥@args, 'd|debug' => ¥(my $debug))
    or die $self->usage;




    Perlでフレームワークを使用するときはMojoliciousを使用することにしています。
    とはいってもあまりちゃんと使ったことがないので、悩む点がちょこちょこありました。
    Mojoliciousドキュメント 日本語訳をただ読んでみても理解が進まないので、とりあえず書いてみて確かめながら勉強中です。
    何がわからなかったのか?

    URLが多階層になった場合の記述がよくわかりませんでした。
    たとえば、
    http://localhost/test/
    とかの場合だと、
    Test.pm

    $r->get('/test')->to('test#test');

    で問題なく動きますし、
    Test.pm

    $r->get('/test/lowpage')->to('lowpage#test');

    でも動くのですが、lib内のアプリ本体直下のファイル数がやたら増えるので嫌だし、何でもかんでもプレースホルダー使って取得してしまうのも間違っていると思うし、ぐちゃぐちゃして嫌なのでした。
    もっと具体的に言えば、
    $r->get('/hoge') を Test::Hoge->hoge()
    $r->get('/hoge/piyo') を Test::Hoge->piyo()
    にしたい、って感じです。
    調べても全然出てこなくて。というか、文書を読んでも理解できなかっただけなんですけれど。
    結論

    試行錯誤の過程を書いても仕方がないので、結果を。

    $r->get('/foo')->to('foo#foo');
    $r->get('/foo/bar')->to('foo-bar#bar');
    $r->get('/baz/qux')->to('baz-qux_quux#foo_bar');

    と記述した場合、呼び出されるファイルは以下でした。

    $r->get('/foo')->to('foo#foo');
    コントローラ:lib/MyAPP/Foo.pm の sub foo
    テンプレート:template/foo/foo.html.ep

    $r->get('/foo/bar')->to('foo-bar#bar');
    コントローラ:lib/MyAPP/Foo/Bar.pm の sub bar
    テンプレート:template/foo/bar/bar.html.ep

    $r->get('/baz/qux')->to('baz-qux_quux#foo_bar');
    コントローラ:lib/MyAPP/Baz/QuxQuux.pm の sub foo_bar
    テンプレート:template/baz/qux_quux/foo_bar.html.ep


    category:perl | by:ittoocomments(0)trackbacks(0) | -

    perl Mojolicious:4

    2015.01.21 Wednesday 23:06
    0
      Mojolicious::Guides::Cheatsheet - リファレンス
      概観

      このドキュメントは簡潔で雑多なリファレンスを含んでいます。
      予約されているスタッシュの値

      「mojo.」で始まるすべてに加えて、ルートとレンダラのために予約されているスタッシュの値が少しあります。
      action

      $r->route('/welcome')->to(action => 'hello');

      ディスパッチ先のアクション
      app

      $r->route('/welcome')->to(app => MyApp->new);

      ディスパッチ先の埋め込まれたアプリケーション
      cb

      $r->route('/welcome')->to(cb => sub {...});

      ディスパッチ先のコールバック
      class

      $r->route('/welcome')->to(class => 'Greeting');

      controllerのキャメライズされた別名
      controller

      $r->route('/welcome')->to(controller => 'greetings');

      ディスパッチ先のコントローラ
      data

      $self->render(data => 'raw bytes');

      生のバイト列をレスポンスに返還
      extends

      $self->render(extends => 'template');

      拡張のためのテンプレート
      format

      $self->render(format => 'rss');

      描画のためのフォーマット
      handler

      $self->render(handler => 'ep');

      描画に使われるハンドラ
      inline

      $self->render(inline => '<%= 1 + 1%>');

      描画のためのインラインテンプレート
      json

      $self->render(json => {foo => 23});

      Perlデータ構造をJSONレスポンスに変換
      layout

      $self->render(layout => 'green');

      描画のためのレイアウト
      method

      $r->route('/welcome')->to(method => 'hello');

      actionの別名
      namespace

      $r->route('/welcome')->to(namespace => 'TestApp', method => 'lulz');

      ディスパッチ先の名前空間
      partial

      my $result = $self->render(partial => 1);

      レスポンスに変換する代わりに、描画の結果を返却
      path

      $r->route('/welcome')->to(path => '/test', app => MyApp->new);

      埋め込まれたアプリケーションへのディスパッチで利用されるベースパス
      status

      $self->render(status => 404);

      描画されるレスポンスのためのステータスコード
      template

      $self->render(template => 'bye');

      描画のためのテンプレート
      text

      $self->render(text => 'Hello World!');

      文字をレスポンスに変換
      環境変数

      Mojoliciousの多くの部分を環境変数で変更することができます。デバッグ環境変数は開発者だけが利用するので除外しています。
      MOJO_APP

      どのMojoliciousあるいはMojoアプリケーションが使われるかを決定する。MyAppのようなクラス名をいつも含んでいるべきです。デフォルトでMojo::HelloWorldになっています。

      MOJO_APP=MyApp

      MOJO_CA_FILE

      TLSのCAオーソリティファイルへのパス。いつでも「/etc/tls/cacerts.pem」のようなパスを含んでいるべきです。TLSサポートのためにはIO::Socket::SSLがインストールされている必要があります。

      MOJO_CA_FILE=/etc/tls/cacerts.pem

      MOJO_CERT_FILE

      TLS認証へのパス。いつでも/etc/tls/client.crtのようなパスを含んでいるべきです。 TLSサポートのためにはIO::Socket::SSLがインストールされている必要があることに注意してください。

      MOJO_CERT_FILE=/etc/tls/client.crt

      MOJO_CHUNK_SIZE

      IO処理のためのチャンクのバイトサイズ。大きなチャンクサイズを指定すれば、IO処理は多くのメモリを消費します。デフォルトは131072です。

      MOJO_CHUNK_SIZE=1024

      MOJO_CONFIG

      Mojolicious::Plugin::ConfigとMojolicious::Plugin::JsonConfigで利用されるコンフィグファイル。 試験でとても便利です。

      MOJO_CONFIG=myapp.conf

      MOJO_HOME

      Mojoliciousアプリケーションのためのホームディレクトリ。いつでも「/home/sri/myapp」のようなパスを含んでいるべきです。

      MOJO_HOME=/home/sri/myapp

      MOJO_IOWATCHER

      代わりに試そうとするMojo::IOWatcherの実装

      MOJO_IOWATCHER=Mojo::IOWatcher::EV

      MOJO_KEY_FILE

      TLSキーへのパス。いつでも/etc/tls/client.keyのようなパスを含んできるべきです。 TLSのサポートにはIO::Socket::SSLがインストールされていなければならないことに注意してください。

      MOJO_KEY_FILE=/etc/tls/client.key

      MOJO_LOG_LEVEL

      Mojoliciousアプリケーションのためのログレベル。debugやerrorのような適切なログレベルを含んでいるべきです。

      MOJO_LOG_LEVEL=debug
      MOJO_LOG_LEVEL=error

      MOJO_MAX_LEFTOVER_SIZE

      パイプライン化されたHTTPリクエストのための、バッファの最大バイトサイズ。 デフォルトは262144です。

      MOJO_MAX_LEFTOVER_SIZE=2048

      MOJO_MAX_LINE_SIZE

      HTTPメッセージのスタートラインとヘッダの最大のバイトサイズ。デフォルト10240です。

      MOJO_MAX_LINE_SIZE=2048

      MOJO_MAX_MEMORY_SIZE

      メモリに維持できるHTTPコンテントの最大バイトサイズ。この値より大きなコンテントは一時ファイルに書き込まれます。デフォルトで262144です。

      MOJO_MAX_MEMORY_SIZE=2048

      MOJO_MAX_MESSAGE_SIZE

      HTTPメッセージの最大バイトサイズ。デフォルトで5242880です。

      MOJO_MAX_MESSAGE_SIZE=1024

      MOJO_MAX_REDIRECTS

      Mojo::Clientが続けるリダイレクトの最大数。デフォルトは0。

      MOJO_MAX_REDIRECTS=3

      MOJO_MAX_WEBSOCKET_SIZE

      WebSocketメッセージの最大バイトサイズ。デフォルトは262144です。

      MOJO_MAX_WEBSOCKET_SIZE=1024

      MOJO_MODE

      Mojoliciousアプリケーションのランモード。developmentやproductionのような適切なモードを含んでいるべきです。

      MOJO_MODE=development
      MOJO_MODE=production

      MOJO_NO_BONJOUR

      Bonjourサポートを無効にします。BonjourサポートのためにはNet::Rendezvous::Publish がインストールされていなければなりません。

      MOJO_NO_BONJOUR=1

      MOJO_NO_DETECT

      Mojoliciousのデプロイメントのときの環境の検知を向こうにします。

      MOJO_NO_DETECT=1

      MOJO_NO_IPV6

      IPv6のサポートを無効にします。これにより、わずかに良いパフォーマンスと省メモリをもたらすかもしれません。IPv6のサポートにはIO::Socket::IPがインストールされていなければならないことに注意してください。

      MOJO_NO_IPV6=1

      MOJO_NO_TLS

      TLSのサポートを無効にします。これにより、わずかに良いパフォーマンスと省メモリをもたらすかもしれません。TLSのサポートにはIO::Socket::SSLがインストールされていなければならないことに注意してください。

      MOJO_NO_TLS=1

      MOJO_PROXY

      Mojo::Clientにおける自動的なHTTPとHTTPSのプロキシ検知を有効にします。セキュリティの理由のためにデフォルトでは無効になっています。

      MOJO_PROXY=1

      MOJO_REVERSE_PROXY

      Mojoliciousアプリケーションのためにリバースプロキシのサポートを有効にします。 これはMojoliciousが自動的にX-Forwarded-For, X-Forwarded-Host, X-Forwarded-HTTPSを検出することを可能にします。

      MOJO_REVERSE_PROXY=1

      MOJO_TMPDIR

      大きなアップロードのための一時ファイルのためのディレクトリ。デフォルトではランダムなプラットフォーム固有の一時ディレクトリが使用されます。

      MOJO_TMPDIR=/tmp/mojo
      category:perl | by:ittoocomments(0)trackbacks(0) | -

      perl Mojolicious:3 ユーザー認証

      2015.01.21 Wednesday 22:53
      0
        ひな形生成

        第三引数が生成されるプロジェクト名称でPerlの名前空間の先頭大文字である必要があります。

        $ mojo generate app LoginTest

        ルーティング処理

        secretは非推奨となっているのでsecretsを使います。
        ブリッジでまずアクセスをフックし、認証状態をチェックします。
        未認証状態なら後のコントローラーでindexへ飛ばす処理を書いています。
        lib/LoginTest.pm

        package LoginTest;
        use Mojo::Base 'Mojolicious';

        sub startup {
        my $self = shift;
        $self->secrets(['secretword']);

        my $r = $self->routes;

        # ブリッジでどこにアクセスするにも認証チェック
        $r = $r->bridge->to('root#login');

        # '/'は'index'に飛ぶようにする
        $r->any('/')->to('root#index')->name('index');

        # ログアウトはまぁそのまま
        $r->get('/logout')->to('root#logout');
        }

        1;

        コントローラー処理

        indexがトップページですが、ルーティング処理でまずはloginが呼ばれます。
        セッションの確認、もしくは認証パラメータで成功した場合は正を返し、レタリング処理は行いません。それ以外は認証画面を描画します。
        lib/LoginTest/Root.pm

        package LoginTest::Root;
        use Mojo::Base 'Mojolicious::Controller';

        sub index {
        my $self = shift;
        $self->render(template => 'root/index');
        }

        sub login {
        my $self = shift;
        my $user = $self->param('user') || '';
        my $pass = $self->param('pass') || '';

        $self->app->log->info("login check");

        # セッション確率済みなら認証通過(適当)
        if ($self->session('user')) {
        return 1;
        }

        # パスワードチェック(適当)
        $self->stash->{auth_failed} = 0;
        if ($user || $pass) {
        $self->app->log->info("pass check");
        if ($user eq "test" && $pass eq "test") {
        $self->session(user => $user);
        return 1;
        }
        $self->stash->{auth_failed} = 1;
        }

        # 認証画面を描画
        $self->render( template => 'root/auth');
        return undef;
        }

        sub logout {
        my $self = shift;
        # セッション削除
        $self->session(expires => 1);
        $self->redirect_to('index');
        }

        1;

        テンプレート

        認証画面で入力されたuser,passをpostします。postを書かないとURLに?user=xxxx&pass=xxxxのように出てしまいます。
        /templates/root/auth.html.ep

        % layout 'default';

        % if ($auth_failed) {
        wrong!

        % }

        %= form_for index => (method => 'post') => begin
        Name:

        %= text_field 'user'

        Password:

        %= text_field 'pass'
        %= submit_button 'Login'
        % end

        認証が通っていればこの画面がようやく表示されます。
        logoutをクリックするとセッションが削除されます。
        /templates/root/index.ep

        % layout 'default';

        Welcome <%= session 'user' %>.

        %= link_to Logout => 'logout'

         参考文献(コピペ元)

        bridgeを活用する
        Mojoliciousのセッションの話 2013年年末版
        Mojolicious最新版にしたら、Mojolicious::secretは非推奨というログが。
        Mojoliciousですべての処理の前に実行する処理をブリッジで記述する / Mojoliciousリファレンス
        category:perl | by:ittoocomments(0)trackbacks(0) | -

        perl Mojolicious:2

        2015.01.21 Wednesday 22:44
        0
          # コマンド実態
          sub run {
          # コマンドライン引数は@argsに格納されます
          my ($self, @args) = @_;

          # コマンドライン引数をパースします
          GetOptionsFromArray(¥@args, 'd|debug' => ¥(my $debug))
          or die $self->usage;




          Perlでフレームワークを使用するときはMojoliciousを使用することにしています。
          とはいってもあまりちゃんと使ったことがないので、悩む点がちょこちょこありました。
          Mojoliciousドキュメント 日本語訳をただ読んでみても理解が進まないので、とりあえず書いてみて確かめながら勉強中です。
          何がわからなかったのか?

          URLが多階層になった場合の記述がよくわかりませんでした。
          たとえば、
          http://localhost/test/
          とかの場合だと、
          Test.pm

          $r->get('/test')->to('test#test');

          で問題なく動きますし、
          Test.pm

          $r->get('/test/lowpage')->to('lowpage#test');

          でも動くのですが、lib内のアプリ本体直下のファイル数がやたら増えるので嫌だし、何でもかんでもプレースホルダー使って取得してしまうのも間違っていると思うし、ぐちゃぐちゃして嫌なのでした。
          もっと具体的に言えば、
          $r->get('/hoge') を Test::Hoge->hoge()
          $r->get('/hoge/piyo') を Test::Hoge->piyo()
          にしたい、って感じです。
          調べても全然出てこなくて。というか、文書を読んでも理解できなかっただけなんですけれど。
          結論

          試行錯誤の過程を書いても仕方がないので、結果を。

          $r->get('/foo')->to('foo#foo');
          $r->get('/foo/bar')->to('foo-bar#bar');
          $r->get('/baz/qux')->to('baz-qux_quux#foo_bar');

          と記述した場合、呼び出されるファイルは以下でした。

          $r->get('/foo')->to('foo#foo');
          コントローラ:lib/MyAPP/Foo.pm の sub foo
          テンプレート:template/foo/foo.html.ep

          $r->get('/foo/bar')->to('foo-bar#bar');
          コントローラ:lib/MyAPP/Foo/Bar.pm の sub bar
          テンプレート:template/foo/bar/bar.html.ep

          $r->get('/baz/qux')->to('baz-qux_quux#foo_bar');
          コントローラ:lib/MyAPP/Baz/QuxQuux.pm の sub foo_bar
          テンプレート:template/baz/qux_quux/foo_bar.html.ep


          category:perl | by:ittoocomments(0)trackbacks(0) | -

          perl Mojolicious:1

          2015.01.21 Wednesday 22:36
          0
            PerlのWeb Application Frameworkである Mojolicious でアプリをつくる場合に必要な基礎的な使用法を紹介します。1枚スクリプトから書けるMojolicious::Liteを前提としていますが大きなモノにも対応出来ます。



            インストールする

            cpanm コマンドでコアモジュール以外の依存関係無しで一発。

            $ cpanm Mojolicious

            雛形をつくる

            Mojoliciousディストリビューションに同封されている mojo コマンドを使ってアプリの雛形をつくりましょう。

            $ mojo generate lite_app myapp.pl

            立ち上げてみる

            myapp.pl 自身が実行可能なスクリプトになっているので

            $ ./myapp.pl daemon

            とすることで実行したホストの3000番ポートでアプリが立ち上がります。その他 plackupで立ち上げる方法など があります。
            ルーティング
            GET/POSTのメソッドで振り分ける

            Mojolicious::LiteだとDSLが提供されるのでその中の getメソッド と postメソッド 使いましょう。他にもPUTやDELETEもサポートされているのですが、まー最初はget/post知っとけばいいでしょう。

            get '/entry' => sub {
            my $self = shift;
            # ちなみに $self はMojolicious::Controllerを継承したインスタンス
            ...;
            };

            post '/entry' => sub {
            my $self = shift;
            ...;
            };

            URLの一部をキャプチャする - path の placeholder

            /entry/1 とか /entry/2 とか /entry/3 とかURLの一部、この場合だと /entry/{数字の部分} をキャプチャしてコントローラの中で使いたい時はこのようにします。

            get '/entry/:id' => [ id => qr/¥d+/ ] => sub {
            my $self = shift;
            my $id = $self->stash->{id};
            $self->render( text => "Entry ID is $id!" );
            };

            ちなみに $self->stash を使わずに $self->param(“id”) でも可能。
            コントローラ
            リクエストパラメータ値を取得する

            $self->req->param もしくはショートカットである $self->param を使います。

            post '/entry' => sub {
            my $self = shift;
            my $body = $self->req->param('body');
            ...;
            };

            デバグ用のログを出力する

            logディレクトリ があればそこにファイル出力、無ければ立ち上げているサーバの標準出力に印字されます。また debug ログだけではなくエラーログなどログレベルを指定することが出来て MOJO_MODE の環境変数等に決まるモードによってどのレベルのログが出力されるかが制御されます。

            get '/' => sub {
            my $self = shift;
            $self->app->log->debug('This is debug log!');
            ...;
            };

            テンプレートをレンダリングする

            後ほど説明するテンプレートファイルに値を渡しつつレンダリングする方法です。

            get '/' => sub {
            my $self = shift;
            my $self->stash->{message} = 'Hello Mojolicious';
            $self->render('index');
            };

            $self->stash にデータ構造を入れるとそれがそのままテンプレートで変数化します。また renderメソッド で対象のテンプレートファイルを指定します。
            JSONを出力する

            先ほどの render メソッドの呼び方をちょいと変えて、ハッシュリファレンスや配列リファレンスなどを与えます。

            get '/json' => sub {
            my $self = shift;
            my $result = { status => 'OK', message => 'I am Fine!' };
            $self->render( json => { result => $result } );
            };

            リダレイクトさせる

            redirect_to メソッドを使います。パスだけ書いて同じアプリケーション内へ、http:// からはじめてフルでURLを書くと外部サイトへ飛びます。

            get '/dummy' => sub {
            $self = shift;
            $self->redirect_to('/');
            };

            テンプレート
            変数の展開

            Perl-rish、つまり、Perlがそのまま書けてしまうMojo::Templateに習います。コントローラから渡ってきた変数の展開は基本このように書きます。

            Message : <%= $message %>



            <%= $value %> とすることで自動的にエスケープが走ります。どうしてもエスケープさせたくない場合は <%== $value %> を使いますがあんま機会はないでしょう。ちなみに今回「変数」と言ってますがオブジェクトをstashで渡してそのメソッドもそのまま実行出来ます。
            ループ

            Perlがそのまま書けるので for文で回しちゃいます。entries に配列リファレンスが入っているとして


              % for my $entry (@$entries) {
            • <%= $entry->{title} %>

            • % }


            でイケますね。
            レイアウトの適応

            テンプレート内でlayoutメソッドやcontentメソッドを利用するとヘッダーやフッターを含んだ「外枠」と「コンテンツ」を分けて記述することになります。

            @@ layouts/default.html.ep


            <%= content %>



            @@ index.html.ep
            % layout ‘default’;

            This is content section!



            その他
            セッションを使う

            Mojoliciousデフォルトのセッションを使う場合は必ず app->secret() メソッドでアプリケーション独自の秘密のパスワードみたいなのを設定してから使いましょう。

            use Mojolicious::Lite;

            app->secret('secret_password');

            get '/' => sub {
            my $self = shift;
            $self->session->{count}++;
            $self->render('index');
            };

            app->start();
            __DATA__

            @@ index.html.ep
            Count: <%= session 'count' %>

            User-Agent名を取得する

            リクエストオブジェクトが $self->req で取れるのでそこから辿ります。

            get 'ua' => sub {
            my $self = shift;
            my $ua = $self->req->headers->user_agent;
            $self->stash->{ua};
            $self->render();
            };



            Mojolicious::Lite - search.cpan.org
            Mojolicious::Lite - Real-time micro web framework - metacpan.org - Perl programming language

            category:perl | by:ittoocomments(0)trackbacks(0) | -

            ad
            Calender
                  1
            2345678
            9101112131415
            16171819202122
            23242526272829
            3031     
            << August 2020 >>
            Selected entry
            PR
            Category
            Archives
            Recent comment
            • パス指定 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-4: truncated ¥xXX escape
              久米隆文
            • 円マークが自動変換されてる
              aaaaaa
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              66hills
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              ssd
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              max
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              DOM
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              DOM
            • コンピュータ業界の根本的な変化
              cloud
            • コンピュータ業界の根本的な変化
              Dellの仮想化
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              えちごや
            Recent trackback
            • スマートフォンの法人活用例
              無線LANネットのブログ
            • Yahoo!オークションからのアフィリエイト収入が一気に70%減になってしまい涙目になってる話
              特選情報
            Recommend
            Link
            Profile
            Search
            Others
            Mobile
            qrcode
            Powered
            無料ブログ作成サービス JUGEM