読者です 読者をやめる 読者になる 読者になる

北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

YAPC::ASIA Tokyo 2009 2日目 実況メモ

いよいよ最終日です。

今日も、gihyo.jpさんの特集の方と両方に書きます。

今日は、質問をするとDNAボールペンがもらえる(i.e.賄賂)らしいです!!

José Castroさん「How regular expressions work internally」

  • "Hello World" =~ /World/ の例
    • 1文字ずつ、判定箇所を左にずらしていく
  • "Hello World" =~ /Words/
    • Worまでマッチするが、だめ
    • その後も、orld、rld、... と判定する
  • "abaabbaaabbb" =~ /aa+b+/
  • "aabb" =~ /a+?b+/;
    • +? は、最短マッチ
    • abb にマッチしないのが重要
  • "it's 42" =~ /(.*\d+)/
    • "it's 4"が.*にマッチする
    • "it's 42" =~ /(.*)(\d+)/ とすると、ほとんどが.*に食われる
    • "it's 42" =~ /(.*?)(\d+)/ とするといい
  • "aaaaaaaa" =~ /a+a+a+a+a+a+b/
    • バックトラックしまくる例
    • 6,27seconds
  • 質疑応答
    • Q. $をつけると、速くなるのではないか
    • A. 条件が複雑になるだけなので、速くならないでしょう

その後質疑応答が続いたのですが、全然聞き取れませんでした。実務でこのようなパフォーマンスの問題あるの? 電話番号のマッチであった、みたいなやりとりだった気がします。

Jonathan Worthingtonさん「The Way To Rakudo *」

  • Perl6とは?
    • 再設計、後方非互換、Perlっぽい新機能
    • 言語仕様(ドキュメント + テストシート)
    • Perl6はwhirlpool(うずまき)開発
    • フィードバック重視
    • Pugsは開発停止中
  • Rakudo
    • Perl6実装、ターゲットはParrot
    • アプリやモジュールが少ない ← 開発版だと、使ってくれる人が少ない
    • 2010年第2四半期にメジャーリリースする
    • Perl6の機能の大半を実装
  • 現在実装されているもの
    • 変数、制御構造などカバー
    • OOPの機能をカバー
    • 多重ディスパッチ (シグネチャによって呼び先を変える)
    • ジャンクション
  • TODO
    • 標準文法を使う(今のRakudoのパースが標準文法でない??)
      • パースの性能も改善
    • シグネチャのハンドリングの改善(今は遅い、不完全)
    • 遅延評価(Rakudoでは未サポート)
    • モジュールのインストール(CPAN的なものはない)
    • Perl5との統合(基本的なPerl5コードが動くように)
      • デモ: :lang<perl5>でevalして、CGI.pmを動かす
  • 対応しないもの
    • 速度改善: 仕様を満たすのが優先
    • 並行性のサポートは、後日
    • 他、compact structures, user defined array indexing, PDL など
  • 未対応になる理由
    • リソース不足
    • フィードバックを得てから
  • Rakudo *は、利用者を増やし、フィードバックを得るプロセスとなる
  • 参加者募集中。spec test suite はwww.perl6.orgにある。

Kenichi Ishigakiさん「Practical Bug Reporting / もしもバグを見つけたら」

このセッションに関しては、gihyo.jpさんで参加レポートを書かせていただきました。gihyo.jpさんの特集記事も合わせてご利用下さい。

  • CPANの品質保証
    • 5067318 テストレポート(4255953がPASS)
    • CPAN Testersがテストしている
    • 25万〜30万/月のテスト結果
    • テストツールも、500以上ある
    • CPANのすごさは、テストにある
  • バグを見つけたら
    • 見ざる、言わざる、聞かざる・・・はNG
    • パッチもだめ
    • ほう・れん・そう すること
  • テストレポートの送り方
    • CPAN::Reporter(cpanpについては省略)
      • cpanで、 o conf init test_report
    • マイナーな環境がある人ほど、参加して欲しい
  • 注意
    • 全ての人がテストをおくるわけでない
    • テストのカバレッジは100%じゃない
    • テストの失敗を気にしない作者も居る
    • インストール後に依存性が変わって壊れることもある
  • perldoc perlbugを事前に読む
    • perl -V、モジュールのバージョン
    • 仕様じゃないか、既知の問題じゃないかチェック
    • 自分の環境のバグじゃないか
    • 再現できるテストを書くこと
      • テストを書くと、そのバグの検証をCPAN Testersに任せられる
  • レポートは英語で書くのが大変?
    • サブジェクトは重視
    • 後はコードで書いたり、翻訳ツールでなんとかなる
  • バグトラック
    • RTが標準だがTracとか使ってる作者も居る。Meta.yamlに書いていることがある
    • 同じレポートを送らないように、中身を確認
    • リポジトリを探す (CPAN見たりググる)→trunkやbagブランチで直ってるかも
    • MLのアーカイブにも情報があるかも
  • RTレポートする
    • bug-<名前>@rt.cpan.org、パッチとかテストは添付ファイルで
    • WEBでの登録も
    • OpenIDやPAUSE IDが必要
    • 重要度は、要望のときは入れてもよい
    • 登録するとメンテナに連絡がいく。解決されたりrejectされると、別のタブのリストへ移る
  • 複数のバグレポートを混ぜないこと
    • 混ざってるとリジェクトされる
  • 急いでるとき
    • 作者に直接連絡する
    • IRC or YAPC(!)
    • 欠点
      • バグトラックできない
      • 英語の壁、IRCなどの独自ルール
  • ベストなのは、コミッタになること
    • 許容されやすい
  • 作者の探し方
  • 作者が完全に行方不明でメンテも止まってたら、自前のモジュールを作る
  • バグレポートをblogに書いたら、fixされたら必ず直す
    • miyagawaさんに怒られる
  • 質疑応答
    • Q. バグレポートをリジェクトしたいとき、傷つけずに断るには?
    • A. 歴の長いdankogaiさんの方が詳しいでしょう
    • A. 仕様に由来するバグは、大変
    • Q. 1つのバグの分け方は? 例えば、複数箇所で同じミスの場合は?
    • A. 1つのレポートでいいでしょう。ただ、ついでにpod修正とかついでにあのバグとか、混ぜると困る

Kazutake Hiramatsuさん「OpenGL Programming with Perl

このセッションに関しては、gihyo.jpさんで参加レポートを書かせていただきました。gihyo.jpさんの特集記事も合わせてご利用下さい。

質問したので、DNAボールペンをゲットしました!!

(以下はメモ書きになります。翌日までにブラッシュアップします)。

  • perlで3Dプログラミングはできる? → 当然できる
  • perlで3Dグラフィックスの処理が出来るモジュールなんてある?
  • OSはMac OS X Leopard
  • POGLの最新版はLeopardデフォルトのOpenGLでは動かない
    • POGLの古い0.56なら動く
  • GLUTとは?
    • OpenGLのラップしたライブラリ。UI系
    • glutDisplayFunc(sub {}); に、描画処理
  • glClearColorで塗りつぶし処理
  • プリミティブ: 点、線分、三角形
    • glEnableClientState、glVertexPointer、glDrawArrays、glFlush
    • iPhoneもこの方法。Perlでプロトタイプを書いてもいいかもしれない
  • ビューポート指定
    • glViewPort
  • 各Matrixの解説 (モデリング, プロジェクション)
  • 座標は右手系
  • モデリング変換
    • モデル側の変換
    • 平行移動、回転
  • プロジェクション
    • 投影の方法
    • gluPerspectiveの紹介
  • テクスチャマッピング
    • オブジェクトに画像のはりつけ
    • OpenGL::Image (gifとかもImageMagickと連携して利用可能)
    • オブジェクトの頂点と画像の頂点の対応を指定
  • まとめ
    • POGLを使うと、3Dプログラムが簡単になる
  • デモ: 画像の表示など
  • 質疑応答:
    • Q. キー入力等はできる?
    • A. できる。GLUTを使う。キーイベント、マウスイベント。
    • Q. ゲーム的なもので、判定はできる?
    • A. 3Dの判定なので、難しくなる
    • Q. 動的なものを作ったときのパフォーマンスは?
    • A. インストール時のパフォーマンステストを見て欲しい。
    • Q. カバーフローのデモは、どのようにやっているのか
    • A. 1枚の画像を、平行移動、回転させている

Tokuhiro Matsunoさん「Concurrent DB Access with Perl

このセッションに関しては、gihyo.jpさんで参加レポートを書かせていただきました。gihyo.jpさんの特集記事も合わせてご利用下さい。

  • 重いクエリを複数投げる
    • 直列して投げると、レスポンスが悪化
    • 並列すればよい
  • Pgにおいて、AnyEventによる並列処理
    • socketをO_NONBLOCKで投げる。readableになるのを待つ
    • use DBD::Pg ':async'; use AE; によって利用
    • prepare時に、pg_async => PG_ASYNC する
    • pg_ready になるまで、待つ。
    • readyになったら、pg_result。undefする
    • recvをして、sendが全て終わるのを待つ
  • デモ: 実際にPgへクエリを複数流す例。
  • MySQLの場合
    • libmysqlclient は non-blocking I/Oに対応してない
    • libdrizzle は対応している → 作者によるとlibmysqlclientより早いと言う噂
  • Net::Drizzle
    • tokuhiromさん作。1664行のxs
    • バッファリングの指定までできる
    • DBI上で動かない
  • DBD::drizzle
    • non-blocking I/O には未対応
  • デモ: Coro + Net::Drizzle による非同期クエリ
  • ユーザ情報、ブログ情報を同時にとりたければ、非同期クエリでレスポンスが改善できる
  • DBD::drizzleへ移植し、動くようにしたい
  • 質疑応答
    • Q. SQLiteは?
    • A. sqliteの非同期化パッチがある。DBD::sqliteにパッチを入れるのは、先になりそう

Chia-liang Kaoさん「"Lego programming" with Lorzy」

英語だったので、聞き取れたとこだけ。

  • Just In Time Software
  • 例: RTを使いやすく
  • Lorzy
    • Lazy, Lispy, Orz
    • Schemeライクなインタプリタ
    • Mooseオブジェクトに対応
    • S式
    • (Str.Eq (RT::Model::Queue.name (...)) "Foo") みたいな文法
    • 型対応
  • "戻り値の型" ♨ "引数の型"
  • Language-MzScheme-0.09(Audreyさん)は、CUI
  • Lorzyは、GUI(ドラッグ&ドロップ)
  • andは、Bool♨ArrayRef[Bool]
  • 関数型への対応(a -> Bool)
  • デモ
    • 型にあうものを補完できる
    • 型が違うとTYPE MISMATCH
  • githubにて開発中

makoto kuwataさん「Basic Mechanism of Object-Oriented Programming Language」

このセッションに関しては、gihyo.jpさんで参加レポートを書かせていただきました。gihyo.jpさんの特集記事も合わせてご利用下さい。

  • OOPLの概要
    • インスタンスオブジェクト
    • クラスオブジェクト
      • 親クラスへのポインタ
    • メソッドテーブル
    • 関数ポインタ
    • ラインタイムがメソッドを探す
      • 見つからないと、ランタイムエラーとなる
  • インスタンスオブジェクト
    • 通常は構造体かハッシュテーブルで表現
    • is-a pointer : クラスオブジェクト(what I am?)
  • クラスオブジェクト
    • 親クラスへのポインタ
    • メソッドテーブルへのポインタ
  • インスタンス変数はインスタンスオブジェクトに、メソッドはクラスオブジェクトに属する
  • メソッド検索テーブル
  • メソッド関数
  • メソッドと関数の違い
    • インスタンスオブジェクトが、第一引数として渡ってくる
    • メソッドは動的、関数は静的か
  • メソッドシグネチャ
    • メソッド名+引数型+戻り値型
      • Javaの場合、引数がクラスの時は、「Lクラス名;」で表す
    • 動的言語では、メソッド名のみ
  • メソッドオーバロード
  • メソッドオーバライド
    • 親クラスのメソッドテーブルにエントリがあるってだけ
  • オーバロードとオーバライドは違うので注意
  • superキーワード
    • メソッドの探索を親から始める
  • Polymorphism
    • 格納する変数の型ではなく、格納されている型による
    • 呼び出しは、実際の型ではなく指定した型のシグネチャ
  • Objectクラス と Classクラス
    • a instance is-a Foo
    • Foo is-a Class
    • Object is-a Class
    • Class is-a Class
    • これが典型的なモデルでしょう
  • Rubyソースコードの例
    • klass: is-a, *iv_tbl: インスタンス変数, *m_tbl:メソッド探索テーブル, super: 親ポインタ
  • Perlの場合
    • blessが、is-aポインタを作る働き
    • 最初の引数が、インスタンスオブジェクト
    • @ISAの名前がちょっとおかしい
      • 普通is-aというのは、インスタンスとクラスの関係をいう
      • たぶんPerlの実装の際の間違い
  • Python
    • 最初の引数が見えている
    • 関数をメソッドとしている (Rubyと逆)
  • Java
    • 親クラスの関数ポインタも、メソッドテーブルにコピーされる
      • パフォーマンスのため
  • JavaScript
    • プロトタイプなので違うが、メカニズムは似ている

Naoya Itoさん「はてなブックマークのシステムについて」

このセッションに関しては、gihyo.jpさんで参加レポートを書かせていただきました。gihyo.jpさんの特集記事も合わせてご利用下さい。

  • 2005年2月β版、2008年11月リニューアル
  • 規模
    • 30万ユーザ、400万セッション/月、1,600万URL / 4,700万ブックマーク
    • count(*)結果が、351,277,311(3億)
    • エントリー3GB、ブックマーク5.5GB、タグ4.8GB、HTMLは200GB(zlib)
    • httpd,mysqlが各 20〜30台、 その他もいれて70台
    • コードは10万行。WAF抜くと45,000行
    • .pmファイルが1,200(はてブの分は600個)
  • 開発体制: 8名(エンジニア6、デザイナ2)
  • 構成
    • LAMP(Xen), Apache, MySQL, Perl
    • サブシステムが増えている(XXXサーバ系がたくさん)
    • Perl 5.8 (mod_perl)
    • WAFはRidge(自社開発) → 仕様変更を押さえたい
    • O/Rマッパ / DBIx::MoCo
    • JS: Ten.js(自社開発)
    • C++: 速度要件がきつい部分
    • Thrift: PerlC++をつなぐRPC。Facebookが開発
  • 本文の抽出方法
    • 検索やカテゴライズの精度に大きく影響するため、重要
  • HTML::ExtractContent (学生さんが作ったもの。CPANにあり)
    • 中谷さんのRuby実装を移植したもの
    • JS実装も作成中
    • ヒューリスティクスで「本文らしさの判定」
    • スコアリングによる。句読点があるか、リンクだけ並んだりしてないか、などで増減。
    • 高いスコアが連続していれば繋げる。低いスコアの部分が区切り
    • 先頭はスコアが高い
    • 精度は、8〜9割程度 → これはユーザ的には、低い精度
  • HTML::LayeredExtractor
    • 確実な方法があれば、別を使う
      • <!-- google_ad_section_start --> など
      • WEB APIRSSを経由したり、特化したXPathを使ったり
    • 複数の方法を試し、長いものを採用する
    • 課題: 2chまとめサイト(コメントの羅列が実はコンテンツなので)
  • 全文検索機能
    • 2種類のシステムがある。性質が違い、統一はしにくい
    • 全登録文書から: PFIのSedue
    • 自分のブックマークから(有料オプション): 自社開発のPerl
  • Sedue
    • 圧縮Suffix Arrays (転置インデックスより高度)
    • ブックマークしてから数分で検索可能(TheSchwartz)
  • マイブックマーク全文検索
  • 転置インデックス
    • 単語 => 文書IDと単語の位置 (perl => [10:2,199,108, ...])
    • インデックスは二つ(N-gram形態素解析)
    • N-gram→ タイトル、コメント、タグ
    • 形態素解析→ 本文(N-gramだと精度が高過ぎてノイズが乗る)
    • VB符号化で圧縮(50%程度) / Array::Gap
  • 転置インデックスの保存
    • Lux::IO Lux IO(キーバリューストア)のPerlバインディング
    • ユーザにファイルが1つなので、KVSが最適
  • スコアリングの手法
  • 検索エンジンは、WEB API(JSON-RPC)でアクセス可能(一般にも公開)
  • スペルミス修正・・・に関しては、昔やったので省略
  • 関連エントリ機能
    • PFIのレコメンドエンジン(タグを使うと、精度が高かった)
    • ThriftでC++Perlをつないでいる
  • カテゴライズ
    • BDog (C++で実装)
  • ベイジアンフィルタ(Complement Naive Bayes) を利用
    • 基準値を逆転させて利用
    • (アニメ・ゲームに)偏りがあるときに、Naive Bayesよりよい
    • 動的に学習できる
  • TheSchwartzにより、各処理を非同期化
  • Web+DBシステムの一歩外(検索、レコメンド、Firefox拡張)
    • 楽しい
    • エンドユーザーに新しい体験を提供
  • パフォーマンスの話は、時間がないので全部省略
    • ハイパフォーマンスWebサイトの方法とかを真面目にやってるそう
  • WEB+DB PRESS Vol.49 にも出てるので参照
  • まとめ
    • RDBMSでは難しい(面倒な)問題の解決が、今後のテーマ
  • 質疑応答
    • Q. はてな毎日重いんですがなんとかなりませんか。
    • A. 頑張ります。

Yuji Suzukiさん「お手軽・お気軽・お気楽な サーバー&クライアント」

  • POEIKC
    • POE::Component::IKC
    • デーモンの起動と、クライアントのコマンド
  • poeikcd start : サーバ側
  • poikc GetHoge::getpid : クライアント側
  • poikc -I /... でPATHを追加
  • poikc LWP::Simple::get とかも可能
  • 普通のPOEのSessionと組み合わせて使う
  • プラグインの仕組み
    • poikcd -Mオプションと--startupオプション
    • 読み込み、spawnする
  • 例: QueueとHTTPClient、monitorの組み合わせ
  • poeikcd -d : デバグ、 -f : フォアグラウンド、
  • poeikcd -U : 特殊コマンド
  • まとめ
    • サーバの土台があるので、サーバの機能の実装に集中できる

Yoshinori TAKESAKOさん「all your base32 are belong to us」

  • 色んな言語でHello!
  • クイズ: yapc.com コードは何で動く?
    • 答え: perl, ruby, js, COM すべてで動く
  • Polyglotプログラミング
    • 複数の言語で、実行できる
    • Rubyでは0はtrue
    • --$x はRubyにはない
    • q='''=print"Perl"#';print"Ruby"#''';print "Python"
  • Symbolicプログラミング
    • 使うのは記号32文字のみ(スペース、タブ、改行は使わない)
    • メリット
      • インデント、変数の命名に悩む必要ない
      • キーボードの記号の部分も使える!!
  • やり方: JS
    • /* */ でごっそり捨てる
    • - は 0や ~ は -1、-~[]は 1
    • (![] + '') で、 "false" という文字列が作れる
    • ( {} + '') から '[object Object]'。他、'undefined'とか利用
    • (0)["constructor"]["constructor"] でFunctionオブジェクトがとれる
  • やり方: Perl
    • #以下は捨てる
    • 正規表現は、 =~ '(?{})' とも書ける
    • \r をひいて、記号からbase32形式を作れる
  • やり型: Ruby
    • %# #が、Perlではコメントになるのを利用(Rubyではならない)
    • Ruby1.8でも1.9でも動かす
      • ??%?? == ?? が真なら、1.9
    • /_/ =~'>>>>>>>>>_' で数字を作る
    • 範囲演算子の隠れ機能(記号への適用)で文字を作る
    • 出力は$><<
  • やり型: com
    • 8086 自己書き換え
    • 使えるオペレーションが限られている
  • 帰って来たppencode 2009
    • PerlRuby、JSで動くバージョン
  • 質疑応答
    • Q. 何がtakesakoさんを動かしていくのか?
    • A. セキュリティの部分から。記号化していると、F/Wなどのチェック機能も抜けられる

ライトニングトーク

このセッションに関しては、gihyo.jpさんで参加レポートを書かせていただきました。gihyo.jpさんの特集記事も合わせてご利用下さい。

Kenichi Ishigakiさん「Top Tens Of 2008-2009」

なんとここで日本語変換がトラブりました・・・。あっという間に終了。

CPANに関する様々な数字でした。

Kazuhiro Osawaさん「hacking ngnix」
  • ネタ → メタル小僧、zigorouさんコスプレ → と思ったけど真面目に。
  • nginx のプラグインApacheに近い
  • メインのイベントループに、色々実装
  • httpサーバの中でmemchachedが動くデモ
  • Plack::Impl::Nginx
  • ゴーン!!(時間切れ)
Kazuhiro Shibuyaさん「Mojo / Mojolicious hookout」
  • mojoはシンプルなので、欲しいものは作る必要がある
    • MojoX::Renderer::Text::MicroTemplate, MojoX::Session::Store::File
    • githubにある
  • Mojo::Server::Reversehttp
    • mojo + WEBHOOKS + PTTH
  • デモ: はてブでスターをつけると、PCにノティファイされる
  • B!hooks + Mojookout + Gtk2::Notify
Takeshi Mikiさん「Hoppyではじめよう リアルタイムweb」
  • 今日は虎のお面を脱いで来た
  • リアルタイムweb : Comet, Google Wave, XMPP, ReverseHTTP, PubSu....
  • Flash XMLSocket
    • Flashは普及率も高い
  • Hoppy
    • PerlのXMLSocket 実装
    • POEで拡張できる
    • Service(クライアントからのメソッド呼び出し) - Hoppy - Hook(PUSH的な内容(Timerなど利用))
  • rooゴーン!!(時間切れ)
Daisuke Muraseさん「perl hacks on emacs
  • デモが多いので、マイクのスペシャリストに依頼
  • emacsのTips
  • subのインデントがオカシイ問題のパッチ → imakadoさん
  • 新しい文法対応のパッチ → jrockwayさん
  • perl-completion.el
    • コマンド補完
    • メニューからソースを開いたり
  • anything.el
    • プロジェクトの中のファイルだけ探せる。絞り込みも
Tokuhiro Matsunoさん「args.pm - a brand new argument validator 」
  • Params::ValidateのTargs{name}が嫌
  • MooseX::Declare? ハック過ぎる
  • args.pm
    • PadWalker::var_name() : スタック一つ上の名前を見てる
    • これはハックとは言えないので安心!
Tatsuhiko Miyagawaさん「CPAN realtime feed」
  • モジュールをアップロードすると
    • 5s + 30s + 20s + 1hour + 1〜24hour + CPAN.pm(24hour)
    • アップロードしてから行き渡るまで、48時間かかる
  • App::CPAN::Fresh
    • friendfeedを利用
    • cpanf コマンドで、最新のものをすぐインストールできる
  • デモ
    • shipitしたものがすぐとれるか!
    • 無事成功
Yusuke Wadaさん「IRC HTTP Stream」

Jonathan Rockwayさん「Why I Stick With Perl?」

  • なぜPerlを使うのか
    • 書きやすさ
    • コミュニティ
  • なぜプログラミングをするのか
    • 問題がある、アイデアがある → 実装
    • 何かを片付ける
  • ライブラリが一番大事
  • UNIXの歴史 → Shell

ーShellはglue

  • Perlだと相互通信、コード、アルゴリズムが簡単
    • UNIXのいいとこどり
  • ライブラリの登場
    • CPANの誕生
    • 新しいことをすれば、他の人も新しいことができるようになる
  • みなが恩恵を受けている
    • 過去の知識の利用、大きなアプリの開発
    • コミュニティ同士の助け合い
  • 古いアイデアをリニューアル
    • オブジェクト指向: @ISA → Class::Accessor → Moose
    • 新しいやり方でも古いやり方でも動く
    • まだ改善を試みる → class記法
  • コミュニティがPerlを改善し続ける
    • 新しいライブラリを書くのがどんどん簡単に
  • 新しいアイデアが新しいモジュールのベース
  • Perlの開発グループ → 切磋琢磨、知り合いかは関係ない
  • グループへの参加方法
    • MooseX::* とか、みんなの役に立つ
  • コミュニティがサポートしているコードを使うのは正しい
    • ライブラリはすぐれたのはず
  • Mooseの型制約 → 型のテスト
    • MooseX::Types
    • MooseX::Attributes
  • ライブラリにより、悪いコード寄りいいコードを簡単に書けるようになる
  • 今後の展望
    • 過去から振り返ると・・・(CGIの例)
    • Catalyst: 自動と設定のバランスがいい
    • no more framework → ライブラリを
  • 例: HTTP::Engine
  • プログラミングがしたい
    • Perlを使うと、つまらないことはコミュニティが使ってくれる
    • なぜPerlを使うのか → みんながいろいろ助けてくれるから

閉会のあいさつ

動画が流れました。(途中でトラブって2回目...)

僧侶のごとき坊主をまとった者が、ビッグヒルマウンテンでPerlを清浄なものに導いたようです。