Niigata.pm 決起集会がありました

Niigata.pm 決起集会

Niigata.pm が正式にpm.orgに登録されたので、何かやろうということでLT大会と飲み会です。(また写真撮ってない...)

LTのメモ (初参加ではない方の自己紹介は割愛)

  • mazhulin さん
    • 質問たくさんしてくれました
    • 僕的に丁寧な回答出来なかったのでなんかすみません
  • john_____ さん
    • COBOLのコードをperlで書きなおしたとか
  • ishiduca
    • psgiアプリのストリーミングパターン
    • インストール済みのnode.js モジュールの READMEとコードを読むやつ
  • RiceCurryNodle さん
    • 長岡技大生 && これからPerl ということなので、寝る間を惜しんでコード書いて欲しい
  • hayajyo さん
    • iPad手書きプレゼン
    • Fluentdはキュー
    • terminalでじゃんけん?
    • 隠れて面白ことしてる
  • Takashi Yukawa さん
    • Perl3の頃から
    • Perlのガチガチじゃないオブジェクト指向とローレベルを意識させる所が好き
    • 最近は学生にPerlを教えるのに tohoho さんのサイト見て学べという方針らしい
      • このあたりをNiigatapmでフォローできるといいんだけど...
  • neko_gata_s さん
    • YAPCのトーク申請
    • リアルタイム通知の概要
      • むかし、XMLHttpRequest等によるクライアントからのリクエストとレスポンス
        • リクエストとレスポンスは一続き
        • 頻繁におこる通信のコスト
        • リアルタイムではない
      • さいきん、longpollingとかwebsocketとか
        • push型
        • 「リクエストとレスポンス」という関係じゃない(場合がある)
        • 複雑な構造
        • ユーザの個別は簡単じゃない
      • neko_gata_s 式リアルタイム通信の実装
        • YAPCで話したい(ので投票してね)
    • 委譲について
    • LTじゃなかった
  • バラエティに富んだ人たちが来たなー という印象

自分のLTネタ

psgiアプリのストリーミングパターン

既出のネタだけど、Dancer を使った場合のストリーミングでいい方法がわかんなかったのでいいかなと

use strict;
use warnings;
use Plack::Builder;

# 基本
my $app0 = sub {
    my $env = shift;
    [ 200
    , [ 'Content-Type' => 'text/plain' ]
    , [ "Hello PSGI\n" ]
    ];
};

# ストリーミングの基本的なやつ
my $app2 = sub {
    my $env = shift;
    sub {
        my $respond = shift;
        my $writer  = $respond->([ 200, ['Content-Type' => 'text/plain']]);
        for (1..3) {
            sleep 1;
            $writer->write("$_\n");
        }
        $writer->close();
    };
};

# sleepによるプロセスのブロッキングを回避するのに AnyEventを使うやつ
use AnyEvent;
my $app3 = sub {
    my $env = shift;
    unless ($env->{'psgi.streaming'}) {
        return [ 500,
                 ['Content-Type' => 'text/plain'],
                 [ "this app can not streaming" ]
        ];
    }

    sub {
        my $respond = shift;
        my $writer  = $respond->([ 200, ['Content-Type' => 'text/plain']]);
        my $c       = 1;
        my $t; $t   = AE::timer 1, 1, sub {
            if ($c > 3) {
                undef $t;
                $writer->close();
            }
            eval { # こうしないと broken pipe とかなる
                $writer->write("$c\n");
                $c++;
            }
        };
    };
};

# Dancer つかってみた
use Dancer;
get '/' => sub {
    my $data = "";
    send_file \$data,
        streaming => 1,
        callbacks => {
            override => sub {
                my($respond, $dancer_resp) = @_;
                my $writer = $respond->([ 200, ['Content-Type' => 'text/plain']]);
                for (1..3) {
                    sleep 1;
                    $writer->write("$_\n");
                }
        },
    };
};

builder {
    mount "/hello"  => $app0;
    mount "/sleep"  => $app2;
    mount "/timer"  => $app3;
    mount "/dancer" => dance;
};

Dancerでのstreamingの最適解あったら教えて欲しい

インストール済みのnode.js モジュールの READMEとコードを読むやつ

node.jsのコード書いてて、関数の使い方を調べるのに perldoc みたいなのあったらいいなという動機で

  • Perlのようなドキュメントから ReadMe.md があったら、読めるようにする
    • `nodedoc module_name`
  • (ReadMe.md がなくても)コードをよめるようにする
    • `nodedoc -m module_name`
  • インストール済みのモジュールの一覧を出す(`npm ls` 相当の事をやる)
    • `nodedoc -ls`
  • モジュールのパスを表示する
    • `nodedoc -l module_name`

ようなのを書いてお茶濁した。機能追加したらそれなりに使えるかもしれないので todo としては

  • 依存モジュールは未対応なので依存モジュールも扱えるようにする
  • "./lib" 以下の jsファイルのコードを読めるようにする
  • package.json とか gyp の内容を表示できるようにする
  • シンタックスハイライトを使えるようにする


「あっという間」というには短すぎた二時間でした


次回のテーマは「データ」です。