コンピュータやソフトウェアのあれこれ@道民(&元道民)
レポート
[レポート][PRML][math]今日はPRML復々習レーン kick-off meetingの日です
5月 19th
1年前に挫折したわけですが、一応もう一回来てみました。適当にメモします(キックオフなので打ち合わせ中心だと思いますが)。
ご挨拶 / @naoya_t さん
- 今日はエクストリームリーディングします
- 自己紹介タイム
- 今後は幹事役を分散したい
- 会場安いとことか募集
- 全員に発表してもらいたい → 発表しないと身に付かない
- グループ分けして1章〜2章をエクストリームリーディングしましょう
- 暇な人は演習問題を(答え有り)
- 休憩
1章の黙読
各自15分程度目を通す。
- 1.66の導出はベイズの定理から形式的に出てくる?
- 暗にグラフィカルモデルを考える必要がある?(以降の章で出てくる)
- ここでαとβはハイパーパラメーターで確率変数ではない(独立性の問題)
- 適宜、常識的な範囲で独立性を補わなければ出ないのではないか
機械形式的に1.66を出せる人は教えて下さい!
- 1.6の情報量は何に使うの?
- EMアルゴリズムで
- ロジスティック回帰でもちらっと
- 1.68は解析的に解ける? 最終的に求まる分散1.70と1.71はよく使う式?
- 宿題。実際はgnuplotとかが勝手にやってくれる。導出の仕方を覚えておくことはよい。
2章1節の黙読
各自10分程度目を通す。
- 共役性の定義は?
- パラメータを置き換えれば一致する、程度で
2章2節の黙読
- 機械学習などで事前分布に共役な分布を選ぶ理由は?
- 悩まない、ということは1つの手
- 自然言語処理だと頻度分布とかを選んだ方が精度が高いんじゃないか → αを非対称にすればOK
- 計算の都合だけど、絶対そうしなければいけないという理由はない
- 過学習と関係ある? → 事前分布のご利益としては。ただ、他の分布でも一緒。
- 十分等計量のありがたさは?
- 後で出てくるので割愛
- ベータ分布のμのハイパーパラメータ
- 4〜5個のサンプルで初めて、いいところを探している
- 極所解に落ち入らない?
- 過学習は気をつけているけど、ベストかは不明
- データが多くなると、パラメータチューニングで苦労するという印象はある
- β分布やディリクレ分布は事前分布以外に使い道があるのか。μを使ってるのが気持ち悪い
- 後でxを使ってるので。
- 知ってる範囲では使ってるところは見たことがない
- P.76 の有効観測数は α_k - 1 では?
- 恐らくそうでしょう
- となると、α_k が 0.1 の場合に有効観測数が負になる。これはどう解釈すべき?
2章はしっかりやりたいので、次回以降に持ち越して担当決めて腰据えてやりましょう。
来月は2.3のガウス分布から2章最後まで。3章頭もやるかも。
発表スライドであらすじ、質疑を中心で。
発表時間は5分程度でも、重要と思った箇所は長い時間でも。読んでること前提でOK。
本レーンは1枠1時間程度(今回は本レーンよりだいぶ細かく切ってる)。
来月分の割当を完了。
[レポート][scala]今日は Akasaka.scala 36 の日です
4月 12th
Akasaka.scala 36に途中から参加してます。タグは#akskscalaです。
Scala言語仕様読書会8 / @seratch さん
6章の後半。
- 前置、中置、後置演算
- :が右結合なのはなぜ? → ::のため
- 代入演算子
play2.0について / @seratch さん
- play コマンド
- sbtのラッパー (sh/bat)
- play new hello-play → 1 - Create a simple Scala application を選ぶ
- play run → 9000ポート
- 参考資料
- 公式ドキュメント
- Play20/samples/scala
- Google Groups の [2.0] つきのスレッド
- StackOverFlow の playframework-2.0
- #playframework, #play_ja
[レポート][scala]今日は Akasaka.scala 35 の日です
3月 22nd
Akasaka.scala 35に参加してます。タグは#akskscalaです。ustreamはこちら。
一度でも参加者したことがある方はgithubのOrganizationに入っているので、適当にcommitして下さいとのこと。
Scala言語仕様読書会8 / @seratch さん
今日は6章です。
- 6.1 → Expression Typing、スコーレム化
- 6.2 → リテラルの型付け
- 6.3 → scala.Null型
- 6.4 → Designaters
- 宿題: 安定型を要求するコンテキストの1〜4はどういう意味?
- 6.5 → superとthis。super[T]のようにTraitを指定できる
- 6.6 → 関数適用。メソッド型。#apply()。名前付き引数。名前呼び出し。シーケンス引数
- 6.7 → メソッド値(η変換)
- 6.8 → 型適用
Squeryl を使った DB アクセスをいろいろ試してみましょう
サンプルコードを読みましょう。
- 読み方は → スクイレルでは?
- case class? → updateを考えるとミュータブルな方が
- type safe なのが利点。でも、動くまでがトライアンドエラー?
- PrimitiveTypeMode を見ると色々なメソッドがある
- test の MusicDb.scala を見ると様々なコードが入ってる
[レポート][scala]今日は Akasaka.scala 34 の日です
3月 8th
Akasaka.scala 34に参加してます。タグは#akskscalaです。
Scala言語仕様読書会7 / @seratch さん
詳細はこちら。
- 前回の復習
- メンバーマッチング
- 事前定義
- 修飾子
- 2回出てはいけない
- (a, b)のような定義に先行する場合は両方に
- private → コンパニオンからもアクセスできる。 class-private
- 限定修飾 private[C] → object-private
- protected
- override → 親クラスの具象メンバをオーバーライドするときは必須
- abstract → traitには不要
- abstract override → traitで使える。AIPっぽくなる
- final → abstractやsealedとは使えない
- sealed → 同じファイル内のみ継承できる。サブクラスは継承できる
- lazy val → 無限ループするかも
lazy val y:Int = x
lazy val x:Int = y
println(x)
[RESULT]
% scala /tmp/hoge.scala 2>&1 | head
java.lang.StackOverflowError
at Main$$anon$1.x(hoge.scala:7)
at Main$$anon$1.y(hoge.scala:6)
at Main$$anon$1.x(hoge.scala:7)
at Main$$anon$1.y(hoge.scala:6)
at Main$$anon$1.x(hoge.scala:7)
at Main$$anon$1.y(hoge.scala:6)
at Main$$anon$1.x(hoge.scala:7)
at Main$$anon$1.y(hoge.scala:6)
at Main$$anon$1.x(hoge.scala:7)
- 用語:valは「値」
- クラス定義
- private, protected でコンストラクタのアクセス修飾
- アノテーション、カリー化された引数の並び
- valだとゲッター、varだとセッターも
- 補助コンストラクタは基本コンストラクタを必ず呼ぶ
- ケースクラス
- 2.9.xから?パラメータリストなしではwarningが出る
- コンパニオンオブジェクトと、copy, equals, hashCode, toString などが追加される
- Trait
- コンストラクタパラメータは定義できない
- オブジェクト定義
- object 宣言は lazy val = new ... とほぼ同じ振る舞い
- 次回は6章
g8 テンプレートをつくってみよう(ハンズオン) / @tototoshi さん
- giter8とは
- github上のプロジェクトをテンプレにできるツール
- csコマンドでインストール
- g8コマンドでテンプレが作られる
- カレントに展開されるので注意
- src/main/g8 の中にテンプレ化したいものを突っ込む
- テストはgiter8-pluginを使う
- Exceptionが出てもビビらない
- 作者のn8hanさんは色々書いているけど、ソースに癖がある
- xsbti.AppMain → sbtから
- カレントに展開されるのは名前を指定してないから
# apply.scala parameters.get("name").map(normalize).getOrElse(".")
- giter8 使ってみるといいのでは
- seratch さんのanorm を使うサンプル
[レポート][perl]今日は Hokkaido.pm#6 の日です
12月 10th
実家に帰るついでにふらっと立ち寄りました(2)。次はHokkaido.pmです。
Carton使ってみた / @aloelight さん
- carton → RubyのBundler を Perlに移植したもの
- carton install
- local::lib にインストールされる
- 依存情報はcarton.lock に書き込まれる
- バージョン指定が可能 → インストール済みのもののアップデートにも必要
- carton.lock から依存情報を取り出してインストール
- carton uninstall
- carton exec
- pluckup などのコマンドの実行
- PATH にlocal/bin も追加
- バージョン的には ALPHA なので自己責任
- 利用例(1) Tweet::ToDelicious
- Makefile.PLでは12個指定していたが、実際は53個のモジュールに依存
- 移行も簡単だった
- 利用例(2) JSON RPC Server
- Makefileでは39個、依存を入れて131個
- OrePANを使うなら、PERL_CARTON_MIRRORを使う (ドキュメントにはまだないかも。内部でPERL_CPANM_OPT は無効にされるのでこっち)
- Carton があまりに簡単すぎて話すことがない・・・!!
- おまけ:プロジェクト環境の構築
- perlbrew install-cpanm, install, create, switch
- cpanm install Carton
- carton install
- OrePANにない外部モジュールに依存しているとうまくいかない → mirror_only をパッチ当てて切ってる
- Q. Macで開発してFreeBSDにアップ?
- A. はい
- 5.14 はいいので、使おう
botのつくりかた / @akiym さん
- botとは
- 自動で色々やってくれる
- cpanm AnySan
- 今回はAdvent Calendarの記事を参考
- Twitter の bot → #hokkaidopm を拾ってRTするbot
- 高校生はIRCをあまり使わない → Skype
- AnySan は Skype に対応してない
- AnySan::Provider:: を作った
- SkypeAPI、Win32::Skype, Net::DBus::Skype
- 全て環境依存 → Skype::Any を作成した
- SkypeでURLの内容を表示するデモ
- まとめ
- AnySan で 簡単に bot を書こう
- Skype::Any 作りたいけどMac対応が・・・
- Q. AnyEvent 対応は?
- A. むずかしそう
Clutch - distributed job system / @nekokak さん
- Job Queue → Q4M、TheSchwartz、Gearman、Qudo、Jonk、ZeroMQ、RabbitMQ
- 「使ってる人?」 → ほとんどなし
- Job Queue と Message Queueの違い → 結果を受けるか否か
- 作ってる人はあまり気にしてないのであまりきにしなくていい
- どういう風なフローで作っているかを紹介する
- きっかけ : daemontools の情報をWEBで見たい
- sudo専用のプロセスを作って、webからはそこにジョブを投げる
- 不満から始まる
- gearmandを立ち上げるのは大げさすぎる
- ZeroMQは仕様が変わるかも・・・
- クライアントが直接listen するのがいい
- 「とにかく考える」
- 仕事で忙しいときなど、風呂などのちょっとした時間に考える
- インタフェースをさっくり書いてみる → インタフェースをベースに開発を進める
- 初期実装にかかった時間 → 電車の帰りの時間
- 設計、実装の仕方は人によって違う → 他人と比べるとわかる
- Clutch
- 簡単なプロトコル
- Data::MessagePack によるシリアライズ
- Storable はPerlのバージョンによる互換性がないことがあるので危険
- 自前でSocketを操作する部分を隠して簡単に
- 中間daemonがいらない。Data::WeightedRoundRobin
- Data::WeightedRoundRobin
- 重み付けをしてラウンドロビンできる
- デモ・・・は、保存場所を忘れたのでなしで
- 分散(distributed)
- 多くのdaemon を借りするためadmin daemon も一応ある(workerのIPを管理する)
- Clutch のデモ
- admin を使った場合のデモ (workerとclient が自IPの代わりにadminをIPを指定)
- やりたいこと
- Adminで死活管理をしたい
- Clientでmulticast リクエスト
- Clientでレスポンスを待たずにジョブキュー的な振る舞い
- Job Queue を作る上で気をつけること
- 保護が必要なジョブか
- RDBMS使うか、lock周り、qps
- 重要なこと → 様々なモジュールを知っていること。できることの幅が広がる
まもなくgithubへ上げて下さるそうです。
mod_perl hacks PHP / @xtetsuji さん
- mod_perlの振り返り
- ApacheモジュールでできることをPerlで書けるようにした
- mod_perl2 のみのお話
- PHP : 非常に色々なところで使われているソフト
- PHP製の成果物が社内にあって、触れないことがある
- PHPに手を加えず、Perlで機能追加したい
- mod_perl でPHP実行の前後に処理を突っ込む
- 処理フェーズ。WEBアプリは PerlResponseHandler
- 今回はPHPに限ったお話
- PHPはレスポンスフェーズ以外では何もしていない(らしい)ので
- 例: PHPのセッション処理を使わずに自前で認証をつける
- Access, Authen, AuthzのHandlerでCookieを読み書きする
- Apache2::AuthCookie 割とメンテされてる
- Output Filter Hacksの使い道
- PHPから独自マークアップを残しておき、Perlで最後に置換する
- i-mode絵文字周りなど
- $f->ctx でフィルタのチェーンの最初化がわかる → Content-Lengthを除く
- チャンク読み
- mod_filter → パイプ処理で置換できる。遅い
- まとめ : PHPは処理が控えめなので、mod_perl で色々突っ込める
- mod_perlの情報がWEBに少なすぎる。
- 日本mod_perl改造計画をしたい。ポータルサイトを作りたい
- 文献: mod_perl2 User's Guide
- PukiWiki にフィルタを噛ませて文字を置換するデモ
循環参照のはなし / @hirataraさん
後でスライドを上げておきます。スライド。
YAPC::Asia Hokkaido 実現に向けて / @onagatani さん
- YAPC Asia Hokkaido をやりたい
- 札幌で開催
- 100人以上参加して欲しい
- 7月前後
- 運営委員を集めて定例会議
- 来月札幌にてキックオフを開催
- @hokkaidopm アカウントにて詳細をアナウンス
- JPA がお金の管理。運営委託。
- 100人はできる? → 北海道他の言語の開発者を呼び込む
- 課題 → 運営事務局、スタッフ、マーケティング
- まとめ: スタッフ募集中! 参加社増の施策!
LT
たのしい記号Perlプログラミング / @sugyan さん
北海道へ雪駄で登場したすぎゃーんさんのLTです。
- Perlでチケットをゲットした!
- 北海道の形の記号プログラム
- 7 symbols program
- 拡張正規表現に文字列を食わせればよい
- 文字は7つの記号から排他的論理和を使って作れる
- Acme::HeptaSymbolize
- 画像から、自動でプログラムの形を作れように拡張
- かわいいアイコンでデモ
困ったときのAcme::* / @koji_magi さん
- Acmeモジュールでお祝い Acme::Omedetou
- おめでとうが画面上に表示される気合い系のAcme::*
- Advent Calendar の Acme Trackに参加しましょう
- まとめ: Hokkaido.pm に参加して嫁を作ろう
GUIアプリに必要な3つのこと - ツール編 / @techno_neko さん
- 人見知りの人こそ、スピーカーになって話しかけてもらう
- 感想、アドバイス、知り合い
- 3位 単純明快
- 2位 キャンセルできる
- 適用せずにキャンセル。長い処理の中断。
- 戻す、やり直す
- 1位 痒いところに手が届く
- ユーザーは成長する → UIを使いこなすと、改善を要求する
- 微調整ができること
- まとめ: 触りたくなるUI、痒い所に手が届く、他にも色々ある
Object::Container::Exporter - lazy programming / @nekokak さん
- Object::Container → シングルトンでオブジェクトを管理してくれる
- Object::Container::Exporter
- import に渡した引数、さらに渡した引数を名前空間にしてnewを呼んでくれる
- use 文が少なくてすむ。
- ここで Data::WeightedRoundRobin のデモが見つかったのでデモ
YAPC::Asia Hokkaido 実現に向けてへの補足(仮) / @charsbar さん
- 海外で色々あるよ
- 7月はOSCON
- 6月はYAPC::NA
- 8月はYAPC::Europe
- 4月はOSDC.TW
[レポート][math]今日は 関数型都市忘年会 の日です
12月 10th
実家に帰るついでにふらっと立ち寄ります。
ってことで、札幌に向かっています。午前中は関数型都市忘年会に出席します。途中で退席予定です。
Arrows in Perl / @hiratara
後でスライド貼っときます。スライド。
はじめての函数型プログラミング / @tadsan さん
- 関数とは f(x) = 3x + 2
- あるxに対して対応する値を返す
- このセッションでの表記は「函数」で統一
- 手続き型の例
- Cの for文 → 条件式が必要
- Pythonのfor文 → イテレータ的
- 言語によって設計思考が違う
- Pythonは 手続き型+オブジェクト指向+函数型
- Haskell は純粋関数型言語
- 静的片付けの仲間は実行速度が速い
- 函数型言語とは、λ計算の概念を論理的基盤
- 函数をお手軽に
- 再帰処理
- 函数型言語 → LISP、ML、
- 手続き型の中の函数型
- Ruby, Python, JavaScript → 反復操作、函数の定義
- JavaScript => function, Ruby => lambda
- python => def と lambda と リスト内包表記
- lambda計算について → (λx. x + 2) 3 みたいなの
- Python でlambda計算
- チャーチ数の例
- RubyやPythonで函数型の考えに触れると、函数型言語に入りやすくなる
- Q. 関数型言語で好きなものはなんですか?
- A. F# と Haskell
- Q. Pythonでmap関数を避けたのはなぜ?
- A. Pythonの作者が使いたがってない。LISP的にしたくない。
- Q. どの函数型言語でもラムダ計算がベース?
- A. はい
- Q. 圏論はどうすればわかるの?
- A. 層圏トポスと清水本の圏論の章が日本語で平易
- Q. 末尾最適化がないと再帰はきつい
- A. はい。関数型言語なら大丈夫
最近書いた、関数型言語と関連する?C++プログラムの紹介/ @h_hiro_ さん
- Ubuntu 11 だとgcc4.5が入る。普通だとgcc4.3しか入らない
- 「与えられた文字列に対して、どの単語が何番目にあるかを示す連想配列を作る」
- 関数型言語では、メモリや実行速度より処理の実現方法を気にする
- C++ではメモリ使用量は重要 → メモリを節約しつつ、関数型言語的な記法
- Boost::split → 記法は簡単になるがコピーしているから却下
- 「fundoshi」"他人のふんどしでスモウをとる"
- fundoshi::string → コピーをせずに部分文字列を表現
- 長さの取り出し、文字列比較、ポインタの取得、など
- 自分で必要な部分のみ
- Ruby に慣れるとC++ はエレガントではない
- 記法にこだわりたい
- boostは頑張ってるっぽい。勉強したい
- 記法に拘るネタ(2)
- ファイルから最小の数値を見つけたい場合、int minimumのような変数を用意する
- 一番小さいものをキープするクラスを作った
- 補則「istream_iterator を使うと、cin をイテレータに変えられる」
ここで退室しました。運営の皆さん、ありがとうございました!
[レポート]今日は 第5回 スタートHaskell の日です
12月 3rd
生憎の雨ですが、大森ベルポートのニフティさんに来てます。途中退室の予定ですが、居る間に聞いた内容をメモ。
第10章:クラスとインスタンスの宣言 / @ruicc さん
- OOからHaskellの型・型クラスの理解をする
- 型クラスと型インスタンスがOOのクラスである
- 型クラスはメソッド、型はフィールド
- 状態 = 大いなるバグの母
- 直積構造(タプルみたいなもの)、直和構造(orみたいなもの)、再帰構造(リスト、木)
- data IntOrSome a = MkInt Int | MkA a
- IntOrSome : 型構成子
- MkInt, Mka : 値構成子
- type IntOrStr = IntOrSome String
- 値構成子がない
- 直積構造 → OOではフィールド、Haskellでは型構成子
- 直和 → OOはステートパターンや状態をフラグで管理。Haskellでは | で直接表現
- 再帰構造 → OOは自分の型をフィールドにもつ(コンポジット、ビジターパターン)。Haskell は書き下せる
- OOだと意図が
- Haskellではprivateがない
- Haskellは状態がないので、そもそも要らない
- パフォーマンスを改善する場合にはモジュール単位で隠す(where, module単位)
- OOでは列挙型が欲しくなる → 直和型がないから
- 継承とはなんだったのか
- メソッドの、型の継承+実装の継承
- 型の継承 → フィールド非依存
- 実装の継承 → フィールド依存
- Haskellの型クラス同士の継承はフィールド非依存、型はフィールド依存
- OOはオーバーライドが複数回行われる。Haskellは一回
- 型クラスは多重継承が可能
- C++やPythonでも多重継承できる?
- うまくはできない。マクロやコードジェネレータで差が出る
- 型クラスはScala のTraitと似てる → Scalarzにそんなのがある
- class Eq a where (==), (/=) :: a -> a -> Bool
- 型クラスEq, 型パラメータa、 型クラスのメソッド==, /=
- instance Eq MyType where x == y = ...
- 型クラス Eq、インスタンスにする型 MyType
- クラスの継承 class (Eq a) => Ord a where ...
- => で指定
- 特定のクラスのインスタンス化が簡単になるようにしている
- deriving (Eq, Ord, Show, Read, ...)
- 仕組みはwww.haskell.org でググって
- 型クラスは2種類
- instance Eq (Maybe Int)
- instance Monad Maybe → 型パラメータを1つとる型の宣言
- モナドなどに関するヒント
- Monad, Functor, Applicative
- 要素はコンテナと中身しかない。
- 質疑応答
- 「Q. 10.6のevalとexecって?」
- 「A. 評価順を明確にするために2つの関数に分けている」
- 「Q. 型クラスはOOのクラスでなく、総称関数のインタフェースってことでいい? 実装を与えるのがインスタンス?」
- 「A. はい。クラスって名前は忘れた方がいい。同じ名前の関数を持つグループ。」
- 「Q. C#とJavaのインタフェースと同じ?」
- 「A. はい。ただしHaskellはデフォルト実装を持てる」
- Haskellでは、既存のインスタンスを自分のクラスにしたりできる
切符番号選び(11章) / @dekosuke さん
- Twitterの数字遊び
- 4つの数字が出て、10にする
- 演算が決まってない。ルールがあいまいで面白い
- 切符番号選び
- 四則演算のみ、好きな数字を選んでよい、0になっては駄目
- data Op = Add | Sub | Mul | Div → 四則演算
- valid, apply : 正当かどうか。演算結果はどうか
- 分けなくてもMaybe でいいんじゃん?
- data Expr = Val Int | App Op Expr Expr
- eval : 式を評価。List型だが実質Maybe
- subs : 冪集合を求める
- perms : 並び替え
- choices : perms + subs
- solution : Exprが答えになっているか調べる (未使用)
- solutions : 全ての回答を探す
- combine : 二つの演算に四則演算を総当たりで適用したリスト
- ops : 四則演算のリスト
- exprs : 与えた数値を使った式を全て返す
- このプログラムは遅い(4分かかる)
- validでない式を落としてない (最後にevalしているため)
- 高速化
- type Result = (Expr, Int)
- combine' : Result へ四則演算を総当たりする
- results : 数値を使った式を全て作って評価
- solutions' : 速い版。数十秒。
- さらに工夫
- 可換な演算は片方でよい、x×1 は自明なので略す
- 組み合わせ爆発の時は、小さな工夫も指数的に効く
モナモナ言わないモナド入門 / @kazu_yamamoto さん
- モナドは名前が悪い。抽象的だからわかりにくい
- 物理学の統一理論、大統一理論と同じ
- 状態系(IO, State)、失敗系(List, Maybe)の共通点を見つけ、コンテナを見つける
- ParserとIOの共通点を探す
- データ定義が似ている
- ラップする関数がある
- 合成する関数がある
- 抽象化オタクなら抽象化したくなるはず → class Stateful m where swrap, sbind
- 抽象化すると何が嬉しい? → do記法
- Stateful の中身は関数なので、走らせなければならない
- 関数を取り出し、runParserやrunIOする
- IOは公開されてないため、runIOできない → ランタイムが実行
- Maybe → 複数回関数適用すると、場合分けが指数関数的に増える
- 失敗をいい感じで合成する関数 → mbind
- data List a = Nil | Cons a (List a)
- MaybeとListを抽象化 → class Failable m where fwrap, fbind
- searchによって抽象化の恩恵を受ける例
- Philip Wadler → StatefulとFailableを統一、Programmable
- Failable でもdo が使える
- 力の弱いものを使う(再帰よりmap)
- コンテナの力の階層 強) >>= 、<*>、<$> (弱
- チューリング完全
- 構造化定理 : 逐次、分岐、反復
- Mappable (<$> (fmap))
- <*> (ap)
- 心眼で<$>と<*>を消すと、(+) (Just 1) (Just 2) に見える
- <*>はdoを書き換えられるので、逐次。再帰しているので反復もできる
-->>= が分岐を表現する
- なぜモナド? → モナドはチューリング完全だから
- モナドの嬉しさ
- do、差し替え可能な文脈、差し替え可能な実装、モナド変換子
- IOモナドとかMaybeモナドとか、「モナド」とつけて呼ぶのは犯罪
- IOもMaybeも特別なものでない
- 糖衣構文 do がモナドを特殊にしている
- 本来はFunctor → Applicative → Monad だけど、そうなってない
- 内包表記は、doの別表記
- scalar のfor も同じ
- 1990年にでき、1997年にモナド内包表記へ一般化されたが、1999年に戻された
- モナド内包表記 のエラーメッセージがわかりにくかった(糖衣構文のため)
- また戻った(SQLも表現できるっぽい)
- 表記
- Parser はApplicative
- IO はdo
- Maybe は>>=
- List は内包表記
- 質疑応答
- Q. Functor, Applicative, Monad の力の強弱
- A. FunctorとApplicativeは似たようなもの。Monadは分岐
- Q. typeは合うけど、monadが限定されるということはあるのか
- A. forM_ とかはIO を期待している
- Applicativeの良さ
- data KV = KV String Int でパーサを書くとき、持ち上げができる
ここで退室しました。関係者のみなさん、おつかれさまでした!
[レポート][perl][perl+web][yapcasia]今日はYAPC::Asia Tokyo 2011の2日目です
10月 15th
あいにくの雨ですが、今日も時間通り会場に到着しています。
本日もgihyo.jpさんの特集のレポーターをやってます。参加されているみなさんと一緒に楽しみながらレポートしようと思っています。
Kazuho Okuさん「Unix Programming with Perl 2」
- 昨年のトークでは、エラーやファイルハンドル、シグナルについて話した
- 今年はプロセス間通信と、シグナル周りのレースコンディション
- IPC::Open3 : open3がロックする場合がある。いつ?
- A). STDIN を読むコードの場合、$cinを待ち続けるのでロック
- close $cin する
- B). 子プロセスがSTDOUTとSTDERRに大量にデータを吐いた場合、バッファがいっぱいとなる
- 試すと、16384byte (16KB)でブロックする。これがバッファサイズ。OSによって異なる--close $cout, close $cerr では解決しない → エラーにより戻り値が変わる
- while (<$cout>) + while (<$cerr>) では? → <$cerr> の読み込みに処理が移らないので駄目
- 答え: $cerrにundefを渡し、while (<$cout>)する。
- ADVICE). パイプを使わずに、tempファイルを使うとよい
- |- cmd > tmp とかじゃだめ? → shell の解釈が入る分遅くなる。また危険にもなる
- open3を使うとよい
- レースコンディションについて : while して signal するプログラムで、間にSIGHUPが割り込むと想定通りに受信できないことがある
- POSIX::pselect を使うといいはず・・・しかし、この実装に不具合のあるケースがある
- evalとdieでsigprocmaskをしても問題は解決できない
- シグナルにsyswriteを呼ぶとよい
- まとめ
- バッファーサイズは有限なのでデッドロックに注意
- shellの呼び出しには問題があるので、@argsやIPC::Open3を利用
- シグナルのレースコンディションには注意する
- 質疑応答
- Q. UNIXの仕組みでなくAnyEventで何か違う考え方ができる?
- A. ラップされてるはず。なので、これらは問題にならない
masahiro naganoさん「運用しやすいWebアプリケーションの構築方法」
- 旧職での経験 : 1億PVから10億PVへの増加、2000台のサーバ、数十のサービス
- 運用しやすい = 「障害を起こさない」「早く復旧する」「スケーラビリティ」
- ログ → アプリケーションからの情報発信
- 障害発生の際に最初に見る
- ログがないと調査に時間がかかる
- straceしたり、アクセスログやバイナリログを見たり
- 結果、椅子が飛ぶ
- Log::* はたくさんある。どれを選ぶべきなのか
- ログが含むべき情報
- 時間、ログレベル、環境、caller、メッセージ(主語+目的語、述語)
- Log::Dispatch は機能不足ではないか
- ログレベル
- DEBUG、INFO、WARN、CRITICAL
- Log::Minimal
- ログレベルごとにXXXXfとXXXXff が用意されている
- fとffの違いはスタックとレースの有無
- LM_DEBUG を環境変数を指定すると、debugレベルが表示される
- $Log::Minimal::PRINT を上書きすると、出力方法を変えられる
- $Log::Minimal::COLOR を有効にすると、カラーリングできる
- Log::Minimalの設計思想
- WAFともModelとも粗結合。環境の情報はPSGIのMiddlewareで行う
- Plack::Middleware::Log::Minimal はREQUEST_URI情報をログへ付け足す
- worker の中では、$Log::Minimal::PRINTを上書きして負荷情報を足せばよい
- DBが重いとき
- show processlist、slow_log、などを確認
- アプリケーションのコードからなんのクエリか確認。killしていいのか?
- チューニングで解決できるのか
- → ORM大っ嫌い
- SQLとコードがマッチしない → grepで該当箇所が見つからない
- ORMを使うときの注意
- SQLの生成個所が散らばらないようにする → 特にViewで生成しない
- クエリコメントを加える
- DBIx::Sunny → DBIのサブクラス。caller情報をSQLコメントへ埋め込む
- 他、select_oneやselect_rowなど、便利なショートカット
- SQL::Makerとの組み合わせなど
- DBIの接続をキャッシュすると、接続時間が長くなる
- 最大接続数に達しやすくなる
- DNSの書き換えが浸透しなくなる(メンテしにくい)
- SHOW INNODB STATUS が見れなくなる (欲しい情報が末尾にあるので)
- Scope::Container でDB接続管理をする
- local と似たような機能。処理単位で接続を切るようにする
- Scope::Container::DBI
- Scope::Container + DBI を楽に実現
- 他、DBIのクラスを変更できたり、slaveのランダム接続など
- Plack::Middleware::Scope::Container
- コントローラとモデルにまたがる処理単位を、まとめる
- memcachedの課題
- 永続化されない
- 特定のキャッシュへアクセスが集中すると、特定のサーバ負荷が高くなる
- キャッシュが切れるタイミングで、DB負荷が一気に上がる
- Cache::Memcached::IronPlate (CPANにない)
- memcachedのラッパー
- cacheを複数に保存する。過半数が生きていれば有効と見なす
- Cache::Isolator
- graceful expire → expire 時間の違うキャッシュを二つ作成し、9:1の割合で分岐
- concurrency controled get_or_set → 同期をとってDBへの同時アクセス数を制御
- Plack::Middleware::ServerStatus::Lite
- Apacheのmod_statusに相当
- Parallel::Scoreboard
- update->('.')、update->('A') などで、ジョブのワーカーなどから状態通知させる
nekokakuさん「watch your log」
- 使ってないモジュールのトークばっかじゃん→今日のアプリは業務で使ってます
- DevOps → DevとOpsは仲良くすべき
- Opsのことを考えられるDev
- Opsの人が1次対応をする → Opsの人へ情報を送る
- 運用したことがないミドルウェアの情報をDevでも調べて共有
- 新機能のリリースはOpsへ伝達
- Devに依頼ができるOps
- アーキテクチャ、対応すべき問題を理解する。
- 必要な情報はDevに提出させる
- DevとOpsのコミュニケーションに関して作ったモジュールのお話
- 監視
- 死活監視、リソース監視、ログ監視
- ログ監視のソリューションでいいソリューションがないのではないか
- DevとOpsは、ログの出力方法を取り決めるべき
- Opsの一時対応が早くなる → WEB+DBのkazeburoさんの記事を参考
- 監視すべきログ
- access_log, error_log, application log(syslog), mysql slow log
- access_logやerror_logは外部からのリクエストへのレスポンス
- 500系 → アプリのバグ
- 404 → HTMLの記述の不具合
- error_log はゴミが多かったりする
- error_logのundef のwarning などは緊急性が低いので、1日に一回見ればよさげ
- application logはDevとOpsの取り決めが生きる
- ビジネス的な深刻度をログに吐き、対応フローを決めておくとよい
- mysql slow log : ほとんどの場合、DBがボトルネック
- 数十GB溜まっていたりする・・・
- ログファイルのローテーション
- mysql slow log は日単位でローテーション → 圧縮したり
- ログの収集方法 → Komainu
- accesslog, applicatio log, slow log の集計を設定により集計
- fork model で動く。fork数は制御される。結果はDBへ
- 親プロセスはDBから収集する
- DBにいれるメリット
- 過去のデータと比較できる
- グラフ化しやすい
- 子プロセスと親プロセスのやりとりが楽
- 最低でも5分に1回サーバを巡回して結果通知したい
- 時間でgrep × ステータスでgrep して集計
- 実行は、昨日のpfperlにて各サーバで
- Application LogはDevとOpsで決めた文言をgrepするだけ
- deployすると、時間が自動的に記録される
- mysqlで実行に時間がかかっているものをリアルタイムであれrつぃたい
- show full processlist でしきい値を見れば
- 自動でKILLかは微妙
- 実際の監視対象
- 100台以上。access_log ベースで億単位。
- fork modelで2.5分で処理完了
- 監視用の専用サーバも必要
- 重要なこと → サービスのクオリティーの維持
- 利用者からの問い合わせで障害に気がつくのは情けない
- ログ情報を通知し、以外にエラーが出てることに向き合う
- Shut the fuck up and write some code
- DevもOpsもエンジニア。行動すべき
- コードの善し悪しは二の次。問題意識を持った人が行動することが重要
- まとめ
- DevとOpsは密なコミュニケーションが必要
- 監視を軸にコミュニケーションを深められる
- 監視を仕様化する
- ログも監視しよう
- 質疑応答
- Q. syslogサーバは何台? ストレージの容量は?
- A. 2台とか。ディスクも特別ではない。貯めるよりも、出たことに気がつくこと。過去の記録が残ればいいだけで、全てを残す必要はない。
- Q. アクセスログ1時間で何GB?
- A. 結構なサイズ。forkも何もしないと、5分では収まらない
- Q. daemontools のマルチログをうまく使うには?
- A. 使いにくいので副次的に使う程度でいいのでは。
hiratara「Monads in Perl」
こちらはgihyo.jpさんの特集へ掲載しています。
SKYARC System presents 招待 LT
papixさん「Cコンパイラ用テストスイート自動生成システム」
- testgen2 は Perlで書かれている
- テスト生成、出力の解析などをPerlで解析
- Cコンパイラ用のテストスイートの自動生成
- K&RとC89コンパイラ開発の初期。9000本。テンプレの追加。開発進行中
- コンパイラ作ってる方に知らせて下さい
hkataokaさん「僕とPerlとYAPCAsia」
- 2002年正月Perlと出会った
- モダンPerl入門、Perl CPANモジュールガイド が方向性を教えてくれた
- 2005年12月YAPCを知った
- スカイアークシステムさんのお陰で5年越しでこれた
- 臨場感や熱気が違う。他のPerl Mongerとのコミュニケーション
- miyagawaさんからPlack::Middleware::ExceptionNotice のアドバイスを頂いた
- YAPCは東京でやっていて、すごい
- 地元も、メンバーを増やせばすごいはず
- 地元からもすごい人が出るかも
shinpei_cmykさん「プレNiigata.pm活動報告」
- ゆのっちはunicodeで書ける - YUNOCODE と呼ぶべk(すべった
- Hachioji.pmに出席していた
- Niigata.pmをやりたい
- Perlをメインで使っている会社内
- めっちゃ少ない。学生も居ない。
- Perl = CGIと思われている
- NDS、技大LT
- Perlの宣伝をして、新潟にPerlの仲間を増やしたい
- 勉強会とかがない人は、やるといい
- 司会「Twitterで白眼鏡が公表でした」
lapis_twさん「Perl meets C++」
- Sapporo.cppのコアメンバ
- libperl++が動かない
- perlembed : C言語からPerlを呼び出す方法
- XS使用モジュールを呼ぶのは大変
- perl_parse 周りのグルーコードが必要
- xs_init
- C++11のVariadicTemplatesやBoost.MPL、Boost.Preprocessor, Boost.CallTraits などが使える
1VQ9さん「Plack::Middleware::Auth::SAML2」
- 蜘蛛の遺伝子の解析をPerlでしている
- システム全体ではRubyとPerlが半々
- SingleSignOn → SAML
- pingIdentity, oneloginなど
- Perlのモジュールがなかったので、作った
- Plack::Middleware::Auth::SAML2
- SSOにのみ対応。SLOに未対応
- デモ
Eikichi Gotohさん「仙台で1年間 PM をやってみた」
- YAPC::Asia 2010 PMディスカッションに触発された
- YAPC::Asia の出席は5回目
- 東北の人にあったことがない
- Twitterでも東北のperlの人を見てない
- Sendai.pm #1 → 7名。
- 震災で町の半分がなくなった
- デベロッパーによって、様々なサービスが立ち上がった
- こんなときこそPM → id:naoyaさんやid:typesterさんの応援
- Sendai.pm #2 → 10名。
- pm.org登録
- Perlの話ができる場
- 牛タン食べたいPerl Hackerはメンションを
- 喜久福 → 仙台でしか食べれない
- *.pmの作り方
- charsbarさんの解説がよい
- 英文が必要なのはサーバとメーリングリストどうするかだけ
- 頑張って英文で問い合わせたら、ネイティブOops!をもらえた!
akiyamaさん「なぜ、高校生がPerlを使うのか?」
- 高校生
- Perlメイン、たまにPythonとJS
- Hokkaido.pmの支援で出席している
- 小学生のとき趣味でHTMLをいじっていた
- レンタル掲示板を設置した
- 学校の先生にも教えた
- 広告が小学生に相応しくない! → 閉鎖 → 自分で作りたい
- Kent Webに出会った
- 気に入らない。自分で作りたい
- プログラミングPerlをamazonで買った(内容見ずに)
- 厚さに仰天して読なかった → Perlに数年間触れなかった
- 中学生になってyusukebeさんのサイトをみて衝撃を受けた
- 大量に画像をダウンロードしてくるスクリプト
- 楽しそう、「夢」がある
- CPANモジュールに出会った
- なんでもそろっている、ドキュメントがしっかりしている、SYNOPSISがいい
- CPANの問題 → モジュールが多すぎてモジュールを選ぶのが難しい
- CPANモジュールを読むようになった → のめり込んだ
- Hokkaido.pm を見つける
- 懇親会に参加するとみんなやさしい → モチベーションが上がる
- 空気読まずに行くことが大切
- Hokkaido.pm #5 でLT
- Twitter での反応が嬉しい
- @nekokakuさんから誘われてYAPCに来た
- 単純な理由 = 行動力がある
- なぜPerlを使うのか
- Perlに出会ってそのまま使い続けている
- PythonやRubyもあるのに?
- 理由1. 手軽さ
- Plackの登場、たくさんのWebフレームワーク、plackupするだけで動く
- 複雑なことをしなくても、先人のお陰で単純にできる
- 理由2. コミュニティ
- CPAN Authorへのあこがれ → 互いに支え合っているのがすごい
- 理由3. 書きたいから
- すべてが奇麗である必要はない。書きたくなる気持ちが大事
- Perlハッカーへの憧れ、コミュニティへ貢献したい気持ち
- Perlが好き
- 質疑応答
- Q. 小学生が買うとは非常に驚いた(らくだ本の訳者さんより*1 )
- A. お世話になってます
- Q. 今夢中になっているプログラミングは? (yusukebeさんより)
- A. ニコ動のダウンロードページ。他、あるサイトの動画のダウンロード。
sartakさん「DTrace: printf debugging for seventh-level wizards」
- 「来年日本語で話してくれるので期待!」
- DTrace
- コーンピュータが何をしているか知る
- iotopで使われている
- OS XやSolaris、Linuxで使える
- プロファイラ、デバッガ、カーネルモジュール
- XcodeのプロファイラもDTrace
- dtruss → 全システムコールの表示
- iotop, opensnoop, iosnoop
- コーディングも可能 → corpusというプログラムの例
- mod_perlのテストを失敗してた → 日本語設定していたので、「公開鍵が見つかりません」がマッチしなかった
- DTraceの言語にはifがないので注意
- Perlの5.14.1 以降で、DTraceで拾える項目が増えている
Kazuhiro Osawaさん「Perl Hackers Hub の舞台裏」
- Web+DB Press の連載周りで起こったことの話
- 伝えたいこと
- 苦労した話は皆聞きたい
- 読みたいと思うネタは読みたいと思っている
- 雑誌で記事を書く、スピーカーをする、なんて特別な人ではない
- 連載での立ち位置 → 企画を思うついて、人を見つけてやってもらう
- Twitter でWeb+DBに記事載せたい → 決まった
- 今は亡きCodeRepos → まだあります!
- 元々のコンセプト
- 機構経験がないけど面白い人を持ち上げる
- 自分が読みたい人の原稿
- Perl Hackers Hubはバトン企画
- AdventCalendarが面白かった
- JPAの代表理事によるハンドリング (金銭面でトラブるので)
- 【会場を歩き回りながらしゃべる】
- 【ここで想定内のBコースのスライドへ】
- 【執筆陣を片っ端から壇上へ呼び出してしゃべらせる。】
- @inaoさん「Yappoさんが主催者です」
- @xaicronさん「ひどいプレゼンですね」
- @dankogaiさん「昔のYAPCは宿だったし大変だった。今のYAPCは余裕があって、iPhone4Sも変えた」
- @nekokakさん「いい経験をした。発売されてるので見て下さい」
- 全員別会社にする予定が、次々とDeNAとなってしまった
- そろそろ後1分なのでm「まだkazeburoさんが!」
- @kazeburoさん「22日発売なのでお願いします。mixiの頃1年連載して久々だった」
- (登壇者へ拍手っ)
- 技術系の原稿書いてみたい人は?
- 特別なことではないので、参加してみて下さい
- AdventCalendarにも
Lightning Talks
kiwanamiさん「Perl, Emacs and Async」
- Rubyを書く人
- Emacsで絵を書く
- マルチプレイヤーFPSまで
- ぼくのかんがえたさいきょうのてきすとえでぃた
- バックエンドは苦手
- Perl → どこでも入っている、非同期に強い
- Perl側はAnyEvent, Emacs側はdeferred.el
- デモ動かず・・・
- セッション中にデバグするのはよくあること
- 復旧
- echo、足し算
- SQLの実行
深町英太郎さん「Perl → Common Lisp → Perl」
- clackup を作った
- Perlは駱駝、Common Lisp はカオス
- マクロによってコンパイル時に変換
- 例えば、Plack::Builder はマクロで書くのが自然
- PerlはCommon Lispに比べると十分小さい
- 困ったこと
- コアで入っていないと、積極的に使わない
- Modern Perl → "最新のModern Perl"
- おうのが大変
- 時間があるので京都の話
- 住みやすい
- (ゴーン、時間切れ)
株式会社ガイアックスさん「Sponcered Session」
- 福岡のお国自慢の話
- 日本の西海岸
- 「祭」
- 電車が混んでない → Perl Hackerはラッシュを避けるから関係ない
- 家賃が安い
- 以外と都会
- 車で30分行けば海も山も
- 世界で住みやすい都市14位
- Fukuoka.pmは開催数が多い
- エンジニアにとって最高の町
- 現在は東京だけど、福岡に開発拠点を作りたい
- 立ち上げてくれる人募集
azuma kuniyukiさん「bounceHammerその後、導入、これから」
- bounceHammerとは
- Perlで書かれている
- 戻ってくるメールの解析のみ行うツール
- 去年のYAPCで発表する予定だった
- ケーブルを忘れた
- 猫神様に救っていただいた
- 今年はJPA会長のPCを借りた
- SMTPのSはSimpletonのS
- ケーススタディ : @type。40万通/日。「私の年収低すぎ」で有名
- 来月、新バージョンをリリース
- (ここでマイク交換)
- 将来 : Coro使ったりPlack対応したり
- 続きは大阪で話します。関西オープンソース2011
株式会社ライブドアさん「ロケタッチ」
- 半分以上の人がYAPC::Asia 2011へタッチしているようだ
- タッチするとシールがもらえる
- ロケタッチ
- Perlで書かれたアプリ
- チェックインができるアプリ
- カジュアルに使えるライフログツール
- ロケタッチAPI
- ロケタッチ Developers
- OAuth2で認証
- 基本機能をほぼ網羅
- サンプルコードも公開予定
- 大カテゴリ、小カテゴリによる分類
- API Explorer を使って、色々ブラウザから試せる
- わからないことはfacebookで質問
- MASHUP AWARDSにもAPIを提供している
Yappoさん「folkatdevs」
- 昨日のIkachanの詳しい人ははてなの人に聞いて下さい
- 開発環境の整え方
- IRCに片っ端から入って情報収集
- gyazoサーバはあったけど、専用Macクライアントがない
- Win版を作った
- ikachanをベースに通知ツールの整備
- ちょっとしたツールで、大きな改善
- 非エンジニア向けの改修など
- 小さなツールを作る
Naoki Tomitaさん「This session is funny modules」
- CPAN毎日チェックしている人は暇な人
- Tomitaさんは毎日見ている
- akefile → -Makefile=PL できるように
- AAAAAAAAA
- クロアチア語として認識される
- rate5がついている
- Moose → Mouse → Moo → Mo → M
- 何もしてない
- Sakai::Nakamura → SakaiのNakamuraバージョン
- Devel::Comments
- 熊 全熊に捧ぐ
tokuhiromさん「File::Zglob」
- lib/**/*.pm
- File::Find がめんどくさい
- File::Find::Rule perldoc みないと書けない
- File::Zglob
- zglob('lib/**/*.pm') と書ける
- 時間があるのでmore 20 modules
- FCGI::Client
- php-fcgiをPlackの上で動かせる
- DBIx::Inspector → DBIのものより使いやすい
- Daiku → Rake for Perl
- App::watcher → アップデートされたらなんか実行する
- autobox::Encode → "ほげ"->encode("cp932")
- cpan-outdated → とにかく新しいモジュールを使う。cpanmに渡せる
- Cache::KyotoTycoon → クライアント
- Furl → 去年のLTのせいか物。モバゲーで使われている。
- ・・・(ゴーン、時間切れ)
ミクシィさん「たんぽぽチームリーダー」
- 静的解析
- コードレビュー自動化、ソフトウェアの検査
- 技術的夫妻の防止
- 計測できない者は改善できない
- 分岐、ループなど関数をグラフ構造として捉えて、その複雑さを測定
- 差分が極端に多いモジュールを調べる → 王様モジュール
- より多くと依存されているコンポーネント
- inspect-package → 解析を行う
- 働きたい人が居たら、話しかけて下さい
Kenichi Ishigakiさん「Top Ten 2011」
- cpants.perl.org → いろいろあってとまってる
- cpants.charsbar.orgをたてた
- DBIC のwarningsが
- アンオフィシャルな記録で
- 全日本最強CPANAuthor選手権2011
- 10位 KAZEBURO さん
- 9位 LUSHE さん
- 8位 Takeshi Miki さん
- 7位 TYPESTER さん
- 6位 CHIBA さん
- 5位 TOMITA さん
- 4位 SATOH さん
- 3位 MORIYA さん
- 2位 BAYASHI さん
- 1位 XAICRON さん
- acme.cpanauthors.org → 様々な角度で分析
- 日本が多い
- モジュール率だとイギリス
- 1年間で40個以上モジュール更新されている方もいる
kamipoさん「MySQLでMessagePackの中身を検索」
- msgpackはjsonよりちょっと速い
- 空間効率も良い
- 人間が読めない
- MySQLに突っ込むと検索しにくい
- MySQL上でのjsonの検索はkazuhoさんが作った
- messagePack用のmsgpack_getを作った → デモ
YUSUKEBEさん「ぼくのかんがえたさいきょうのえろさいとの舞台裏」
- 一時はてブのトップに乗ったエロサイト
- ver1 → 12万PV
- 負荷軽減 → staticファイルをAppserverでサーブしていた
- Front-endへ
- キャッシュ
- ver2 → UI刷新、埋め込み再生、関連動画表示
- 複数サイトに対応
- 関連辞書をモジュール化 → Acme::Porn::JP
- 15PV/1user
- ver3 → Mojolicious + DBIx::Skinny
- とにかくキャッシュする構成 → 3倍速くなった
- 20PV/1user
TAKESAKOさん「Perlで無理ゲー攻略2」
- Acme::MineChan
- マインスイーパーを自動で解く
- デモ→高速でマインスイーパーが解かれた!
makamakaさんによる割込
カードゲーム6セットの抽選!
Hideo Kimura「Managing A Band Of Hackers」
- POSIX timeで計算できる
- ISP → 独立 → Server hosting → DeNA
- マネージャーとして、将来の姿のお話
- マネージャーが必要なのは?
- 規模の限界がある → 集団でWEBサービスを作るのはすごいこと
- 集団の場合は、指揮者が必要
- 1+1を2より大きくする (Aristotleの言葉より)
- Perlは歴史が長いので、マネージャーをやっている人は増えている
- マネージャーの仕事 → プロジェクトマネージメント、人事、その他
- プロダクトマネージメント → ライフサイクルの維持
- 期間やリソースを確認する
- 進捗を管理
- システムを健全に動かす
- タスクを見積もる必要がある
- 人事
- 面接、評価 → エンジニアの能力を見抜く必要がある。
- その他 ≒ 事務
- 稟議などはしんどい。最近ヘルプチームはできて楽になった
- 会議 → 必要。メールや電話会議では話が伝わりにくい。ホワイトボードを前にすると数分で終わる
- 無駄な会議はある
- プロジェクトマネージメントや人事には、エンジニアの経験が必要
- 始めは1人、今のチームは20人
- 6人CPANAuthor → CPAN Author率が一番高い
- DeNAでYAPCに登壇した9人中、7人がこのチームのメンバー
- ハッカーのマネージャーは、少し特殊
- 一人だと寂しくて死んでしまう → 声を上げても1人だと声が弱い
- 飽きっぽい。運用を誰かに押し付ける → 餌を与え続ける「変えていいよ」
- 優先度<興味 → さらにレベルが高いと、興味があるものをやりたいがために今のことを早く終わらせるので、大丈夫
- 朝遅く夜遅い → 相談したいときにいつ来るかわからない
- KY → 仕事には影響しないから、まあいい
- どうマネージメントするか
- 「任せる」 → 10人以上のチームになったところで、コードを書くのをやめた
- サービスの作成に専念できる
- 人が成長する
- 任せると丸投げは違う。失敗をリカバリするプランまで見越しておく
- 悪いニュースは、先に
- TMTOWTDI → 多様性を許容する
- 「Being Geek」O REILLY' → マネージャーになる上でいい本
- マネージャーは優秀なエンジニアがなるべき
- 選択肢として、マネージャーを考えて欲しい
- マネージャーが少ない会社は少ない
- I ♡ PERL
- エンジニアとして成長できる
- マネージャーとなれば人脈と鳴る
- 若い人には、積極的にコミュニティに参加して欲しい
- (テキーラで〆)
牧さん「Closing」
- 結果発表!
- 3位 徳丸 浩さん「Webアプリでパスワード保護はどこまでやればいいか」
- (未カウント)闇のEmail伝説、Carton、Perl 5.16 and beyond
- 2位 TAKESAKOさん「Perlで無理ゲーム攻略」
- 1位 FUJIWARA Shunichiroさん「Perlで構築された中規模サイトのDC引っ越し記録」
- 抽選 → 1369
- 記録破りのYAPC
- 30社 (前は20社最高)
- スタッフ42人 (前は30人以下)
- トーク71 (前は40~50)
- 個人スポンサー91名
- 672(去年は518)
- 今年のテーマは進化
- よかった偶然
- スペシャルゲストが揃った
- 941さん
- スタッフ
- 来年はどうする? → 来年はどうなるのか不明
- やってみたい人は連絡を
- ブログを書くまでがYAPCです!
- See you next time!
[レポート][perl][perl+web][yapcasia]今日はYAPC::Asia Tokyo 2011の1日目です
10月 14th
YAPC::Asiaの季節がやってまいりました。昨日は寝込んでいましたが、今日は朝から出席します。場所は東京工業大学大岡山キャンパスです。
なお、今年もgihyo.jpさんの特集のレポーターをやってます。会場の熱気を伝えられるよう、頑張ります。
なお、機材トラブルの影響で、開始時間は10:40となる見込みです。
(追記: なんか今日は英語のセッションばっか聞いてたので、メモの内容はあんま正確じゃないです。もしも内容をあてにしている方がいらしたら、ごめんなさい!)
941さん「Opening」
- 会場の照明がLED電球になった!
- プロジェクタ12万で手配したけど無駄になった→機材トラブルで使うことになった
- 新たな試み
- 遠方からの参加者支援 → SKYARC Systemさんに拍手
- 個人スポンサー → 90名
- スイーツエリア → 交流の場
- Jesse Vincent さんの旅費は、個人スポンサーでまかなわれている
- 例年の1.5倍のトーク応募数 → 濃密なトーク満載
- スポンサーの方は「talk to me!」と書かれたシールを貼っている → 人事権とかある人なので話しかけてね
- Sweets Areaのコーヒーはエクセルシオールのコーヒー
- 投票は → 2票/日。商品は椅子。
- タグは#yapcasia
- 会場が1日目と2日目で変更するので注意
- 懇親会無料! mixiさんとDeNAさん
Jesse Vincentさん「Perl 5.16 and beyond」
- Perl5のPumpking
- Pumpkingとは?
- 決断をする人
- 仕事を依頼する人
- 文書を書く人
- メンター
- Perlを実際に作るのは、他の皆さん。"You make Perl"
- PerlのRule
- 1: Larry が全て正しい
- 2: Larry が考えを変えても
- Larryだけではない
- 1. Perlはいつでも正しい
- 2. Perl が考えを変えても・・・?
- Perl5の今後は?
- 正規表現はよりcrazyになった
- スマートマッチはサイコマッチと呼ぶべき
- 以前のPerl5は、ビジョンはあってもリリースできなかった
- 今の最新版は5.14.2
- リリースの準備は昔は3週間かかったが、今は1日以下
- リリースエンジニアがいる(新しいコミッタが担当)
- リリースが簡単になったことで、ビジョンを話せるようになった
- 既存のソフトウェアはなるべく動くようにすべき
- しかし、成長をとめてはいけない
- 成長過程では誤ることもある
- 肥大化したランタイムを小さくしたい
- Perl5はPerl5で書けるようになるべき
- use v5.14 → 「5.14.0 より新しいPerlならなんでもいいです」
- use v5.16 → 「5.16 のように動いて下さい」
- 5.16より新しい機能は動かないようにする
- 機能の廃止のサイクル
- 5.16.0 で警告が出たら、5.18.0で除かれる → 1年単位
- 短すぎる。
- モジュールについても同じ
- コアにしか依存しないモジュールを書いている人が困る
- Perlは多きい言語 → 管理が大変
- 言語習得のコストも大きい
- Perlを小さくするには?
- CPANのコミュニティーはすごい
- 言語レベルで提供する必要がないものがある
- Socket, Unix user/group, network, format, smartmatch など
- Perl 5.18, Perl 5.20 でも、5.16のコードは壊れないようにする
- 新機能については慎重になる
- 内部的、意味論的におかしい部分を正す
- use v5.12 をすると、use strict になる → 今後はuse warningsも
- 1,2引数のopen はなくす
- 「'」というパッケージ区切りもなくす
- utf8のデフォルトか、オブジェクトシステムの導入
- Perlを単純なものにする
- ユーザにとって嬉しい
- 実装者にとって嬉しい
- Perlはどこでも動く
- ハード、OSだけでなく、VM、ブラウザ、Phone
- 仕様がないので、他のプラットフォームで作れない
- Perl5 を解釈できるのはPerlだけ
- Perl5 の再実装ができるようにしておく必要がある
- 「個人スポンサーの皆さんに感謝します」
- 言語の名前はPerl5で、Perl6は妹
- Perl5を別の名前にしたかったら、テストケースが通る提案を送ってね!
Tatsuhiko Miyagawaさん「Carton: CPAN dependencies manager」
- Managing CPAN Dependencies
- ケーススタディ : CPANアプリを使ったWEBアプリを作る
- 開発して動いた! → デプロイする(エラーが出るので、CPANモジュールは手でいれる)--数週間後、WEBサーバを追加
- フレームワークのバージョンが変わっていて動かない
- Backpanから落とさなければならない。他の依存も合わないかも
- 問題点
- 依存するモジュールが明記されてない
- Perlのバージョンも違うかも
- 解決方法 → MyCPAN, DPAN, CPAN::Mini::Inject, OrePAN, Shipwright
- 気に入らなかったので自分で書いた
- Ruby の Bundler にインスパイアを受けたもの
- ローカルのPerlライブラリ環境を使う
- 安全、高速
- 依存ツリーの分析
- 全モジュールのバージョンを固定できる → 簡単に再配備できる
- 1つのjsonファイルに登録 → バージョン管理システムと相性がよい
- デモ
- Dancerでアプリを作る
- git initしておく
- carton install → local という名前のディレクトリへインストールされる
- carton.lock へ情報を記録
- carton list → モジュールの一覧を表示
- carton tree → モジュールの依存を表示
- carton exec perl ... → local のライブラリのみでperlを実行する
- carton check → Makefile.PL の記述を調べてくれる
- carton install --deployment → デプロイ先で構成を復元する
- 注意: まだ1.0
- エッヂケースでCarton側だけで解決できない問題がある
- 途中のモジュールだけのアップロードがまだ
- ロックファイルの仕様も変える予定
- 質疑応答
- Q. CPANから消えてたらどうするの?
- A. BackPAN を見ている。tarボールを保存するようにもしたい
Naoya Itoさん「Perlプログラマのためのスマートフォン開発ガイド」
- 最近facebookとスマートフォンサイトとスマートフォンアプリの構造が近づいている
- WebViewを使っているため
- HTML5をネイティブで補う or ネイティブをWEB技術で補う
- PhoneGap
- HTML + JS でアプリを作る
- UIKit の制御はキックできない
- UIWebViewは遅いので注意が必要
- TitaniumMobile
- CoffeeScript や CommonJS を使える
- JSでネイティブアプリを書く
- ネイティブの速度にはかなわない
- SL4A
- use Android
- JavaアプリのAPIとJSON-RPCで通信するもの
- おもちゃ
- まとめ:Perlでクライアントサイドは、さすがにきつい
- Perl VS Node.js
- サーバもクライアントサイドもJSという流れは止められない
- Node.js → シングルプロセスでイベントドリブン
- Perlでできないことをやるわけではない
- 手軽
- search.npmjs.org
- require 'underscore'
- WAF → Express
- テスト → vows
- 他, xml2js, aws-lib
- Socket.IO → WebSocket-like の API を提供する
- pocketio → Plackのアプリ
- Perlの莫大な資産を生かしつつ、JSと共存させたい
Marc Lehmannさん「AnyEvent, Coro, IO::AIO」
- アニメのダウンロードサイト
- Apache, boa, thttpd を試したが、満足できなかった
- myhttpd を作った
- Event, Coro, IO::AIO, AnyEvent + EV
- readaheadがボトルネック
- なぜCoroが必要か
- Inversion of Control のため (ネストが深くなるのを防ぐ)
- rouse_cb と rouse_wait
- Coro::Channel によるスレッドプール
- Coro::Debug によるデバグ
- 「Coro はPerlの唯一のスレッド」
- ithreadはオーバーヘッドが大きく、スケールしない
- スレッドは1CPUのために設計されている
- 自動的に同期がとられるし、スケールする
- スクリプト言語でのスレッドとは?
- 資源全てを共有するということは、資源全てにロックが必要だということ
- この問題は解決されていない。RubyもPythonも並列ではない
- IO::AIO → POSIX のラッパー。現在はさらに複雑なものも実装している
- Coro::AIO → IO::AIをCoroで使えるようにする
- AE → タイピング量を減らした
- AE_DEBUG_WRAP、AE_DEBUG_SHELL によるデバッグ
Kang-min Liuさん「perlbrew」
- perlをアップグレードすると@INCはドンドン長くなる
- 後方互換があるので、たいていはアップグレードしても動く
- XSはコンパイルが必要
- cpanでアップグレードすると最新のバージョンになる
- エラーはruntimeに起きる
- Perlを先にupdateする必要があり、トラブっても戻すのは難しい
- perlbrew
- Rubyのrvmみたいなの
- perlbrew install, use, switch, off
- perlbrew lib → CPANモジュールだけが違うものが作れる
- bin, site_lib, local::lib が導入される。
- @INCは各perlで独立する
- メリット
- 古いバージョンのモジュールを試せる
- 新しいバージョンのPerlを試せる
- モジュールを様々なバージョンのperlでテストできる
- perlのコンパイルオプションを変えてテストできる
- 今後の展望
- External perlへのuse/switchをやめる
- コミュニティーを発展させる
- シンプルにする
Ricardo Signesさん「Perl 5.14 For Pragmatists」
- 5.10はEndOfLife → セキュリティfixの保証は3年
- 5.14 は後方互換。新しい振る舞いが追加されている。
- 一部はfeature.pmで提供されるが、5.14ではない
- 5.12でDeprecatedとなっていたモジュールは、削除された → CPANから入れてね
- Class::ISA、Pod::Plainer、Switch
- Deprecatedとなるもの
- Devel::DProf、bigrat.pl, ftp.pl, Perl4CoreLibsなど
- s///r → 置換結果をreturnする
- /l → ローカルルールでのマッチ、/u → Unicodeルールでのマッチ、/a → Unicode ルールなんだけどASCIIのみ、/aa → さらにnon-asciiにマッチしない、/d → デフォルトルール
- use re '/aa'
- 「もっともっとUTF-8のことを学ぼう」
- PerlはUnicodeをとてもよく扱えている
- eachがarray-refに使える → 配列にeachは使わないこと
- package ブロック
- IO::Fileをuseしなくてよくなった
- $@の評価順が変わった
- IPv6サポート
Marc Lehmannさん「App::staticperl」
- staticperl → モジュールを1つのバイナリに詰める
- staticperl instcpan EV
- staticperl mkperl -MEV -MAnyEvent → バイナリができる
- --usepacklists で依存モジュールも含まれる
- バイナリ1つを配るだけで動くので配布が楽
- mkapp にて、スクリプトをひとつのバイナリにできる
- CDブートでperlを走らせることもできる
- need_perl() → perlが初期化されてなければ初期化をして、XSを呼べる状態にする
- 今のとこWindowsでは動かない → 不可能ではないはず
- PPIはホワイトスペースの削除のために入っている
- XSを静的リンクするにはPerlのバイナリを作り直す必要がある → 1回ずつ作り直すのをコツコツ続ける
- 色々パッチをあてて作り直す
Lightning Talks
makamakaさん「Perl同人活動」
- 「Acme大全2011」 → 2011/7/7 時点の全てのAcmeモジュール
- 用語集が詳しくなった
- 逆引き時点もついた
- さあ、どうでしょう ≒ 3rd edition
- 売れないと印刷代が・・・
- 「ぱあるもじゅるの失笑目録(読んでクスッ)」
- ボクと握メ
- 「Perl Mongerなりきりカードゲーム」
- 「ぱあるPlackの超散弾銃(ショットガン)」
tokuhiromさん「Amon2 3.0」
- Amon2 とは
- WEBアプリケーションフレームワーク
- ぼくのかんがえたさいきょうのふれーむわーく
- flavorが大きく変わった
- ブートストラップの時間を短くする
- 仕事にはLargeFlavorがちょうどよい
- MobileJPフレーバーで日本のモバイル対応
- ::Auth
- SNSに対応した認証 Facebook, Twitter, github, ロケタッチ
- すごくイイカンジになっているので使って下さい!
hakobeさん「Enhance Anime wathing with programing」
- アニメをTwitterで実況したい
- しょぼいカレンダー
- アニメの完璧な情報
- 豊富なAPI
- リクエストとパースの回数が多くめんどうくさい
- WebService::SyoboiCalendar
- syoboirepl
- アニメを見ている人は、ターミナルを開きながら見ているはず
- デモ:現在放送中のアニメ。キャストまで見れる
- 関東と関西の最速アニメの比較
株式会社カヤックさん
- 元PHP、Perlに入門、今JS
- 「クイズ好きですか?」「平日にYAPCに来るくらいですから」
- ランキングがあると燃える
- ISCON優勝者もいる
- Perlのクイズを作ってランキングをすると燃えますよね
- 「Perl道場」を先ほどリリース
- perldojo.org
- サイトから問題に挑戦できる
- github経由で問題を出題できる
Yappoさん「App::Ikachan」
- 優秀なエンジニアならIRCを使っているはず
- ikachan
- AnyEventベースのIRCボットフレームワーク
- ikachan -S サーバ名
- WEB API経由で、IRCの操作ができる
- 明日のLTに続く(ゴーン、時間切れ)
Kenichi Ishigakiさん「Let's play games」
- Games::Dice
- Games::Sokoban (Lehmannさん)
- パーサ。ゲームはできない
- 倉庫番ゲームを作った
- Games::Sokoban を使い、WEB上に落ちているデータを利用できる
Eikichi Gotohさん「仙台で1年間PMをやってみた」
- Sendai.pm が登録されました
- 昨年のPMグループディスカッションに触発された
- Sendai.pm #1 → 7名
- id:naoyaさん公認、id:typesterさん公認、@sugyanさんおすすめ
- Sendai.pm #2 → 10名
- コンセプト「仙台でperlの話を思いっきりできる場所」
SKYARC Systemsさん「北海道のIT勉強会事情の紹介」
- 北海道に転職しても大丈夫だよという話
- スカイアークシステム
- MTでの開発。帯広、東京、札幌に拠点。
- 遠方の参加支援
- スイーツエリアにうまい棒を設置
- ゴールドスポンサー
- 北海道でもIT勉強会はある
- 土曜日が多い
- 言語はほとんどある
- ただし、札幌開催がほとんど
- 北海道でミニYAPCを開催したい
issmさん「ようやく始まりましたNagoya.pm」
- Nagoya.pm #1
- 県外からも参加者がいた
- Perlを使っている会社が見当たらない
- 名古屋はミソだけではないので、Nagoya.pm #2には安心してお越し下さい
Mayumi Takahashiさん「Perlが決めるwebの未来」
- Movable Typeは10/8で10歳
- スポンサー企業ですが、個人で来てます(社長にも言ってない)
- Perlは先週から始めた
- iPhone4S にはジョブズ氏の魂が宿っている(by 虚構新聞)
- Perlで実装したiSteaveのデモ
- 音声での質問に答える
- Twitterとの連携機能をライブコーディング
- コードはgithubに上がっている(YAPCが終わり次第削除予定)
karupaneruraさん「アクセサについての考察」
- アクセサの利点
- typoしたらわかる、readonlyにできる、型制約できる
- アクセサの問題
- 速度
- 直接キーを触られたら意味がない
- Class::VirtualAccessor
- キーへのアクセス時に、制約をかける
- githubで解説中
- オチは(ゴーン、時間切れ)
turuginaさん「日常業務にperlを使おう」
- 日常業務をperlを使ってなんとかしたい
- 勤怠管理をPerlでなんとかしたい
- lwp-request で、勤怠管理システムへGETリクエストを投げる
- さらにPOSTでリクエストを投げる
- Basic認証を超える
- WWW::Mechanize でフォームからログイン
- FlashとかをWin32::GuiTestで
株式会社 リクルートさん「Mashup Awards 7」
- 今年で7回目。日本最大級の開発コンテスト
- 協賛63社
- 賞は80以上 → 1人7作品応募すれば、多分受賞できる
- MUP48 のメンバー募集(現在30名)
- 現在90作品。男性比率99.7%。Perlは6人。
- 締め切り直前の36時間耐久ハッカソンもやるので応募してね!
岡部恵一さん「登録題5314384号商標 厳密というより分かりやすく解説」
- dankogaiさんが召還されたのが始まり
- TPFに連絡した
- MatzさんがRubyは異議申し立てすることを表明
- Perlは商標がとれていないし、とれないと思っていたが取れた人が出たってことが判明
- 異議申し立ての話は、公共の場で話すことはできなかったので、今日が初公開
- (ゴーン、時間切れ)「無視!」
- JPAはプロジェクト、コミュニティ、ビジネスのサポートをするところ。今後も邪魔をする勢力は実力で排除する
keroyonn_さん「Perlで次世代ゲーム開発」
- 最近、スマフォのゲーム開発がすごいことになっている
- Games::ByLike::EightBeat
- CUIゲーム、ファミコンに立ち戻る
- デモ
- Putty から起動
- 「Pelerdius」
- セガサターンのコントローラーで操作
- (ゴーン、時間切れ)
Kosuke Arisawaさん「ぼくたちのPerl Module管理」
- RPMで管理していた
- いろんなプロダクトがあるのでバージョンを挙げにくい
- perlbrew + darkpan + Orepan
- pfperl というラッパーを作っている
- モジュールの管理や、スクリプトの起動など
nekokakさん「not ORM - for @kamipo」
- DBIx::Skinny
- 北海道の人には公表
- @kamipoさんには会う度にDISられる
- row object、relation manager は不要
- DBIx::TransactionManager, DBIx::Handler, SQL::Object
- DBIには便利なAPIが多い
- SQL::Object → プレースフォルダやinの管理
- 普通の環境ではDBIx::SkinnyやTengが有用なので、ケースバイケースで
tagomorisさん「ISUCONやった話 by livedoor」
- ISUCONとは?
- Webアプリケーションの高速化コンテスト。基本的に何でもあり
- 10時間で満員御礼
- Perl、Ruby、Node.js の3種を用意した
- しかし、全チームPerlを利用
- 優勝はfujiwara組。10 req/sec → 1,500 req/sec
- コードやデータはlivedoor のtechblogにある
- ISUCON2は・・・?
- 準備が大変なので・・・
- (会場から拍手)
[レポート]函数プログラミングで集いに来ました
9月 17th
函数プログラミングの集い 2011 in Tokyo に来てます。途中退出しますが、居る間内容を適当にメモります。会場はIIJさんです。毎度のことながらすばらしい会場。
この会は、神田でICFPという大きな国際的な学会が日本で行われるのにちなんでいるそうです。普段は「この言語は糞だ」みたいなことを言っている方も今日は休戦でお願いしますとのこと。
ハッシュタグは#fpm2011 です。ustream はこちら。
関数プログラミングの道しるべ / @kazu_yamamoto さん
- 今日は時間が短いので、今日の内容を理解してもらえるとは微塵も思ってない
- 入り口で引き返さずに、山へ登ってみて欲しいという思い
- Twitter での市場調査 → 関数 = 数学 = 怖い。関数 = アカデミック = 役に立たない
- Functional の訳を「実用的」とすべき。Functional Programing = 実用的プログラミング
- 「関数型」の定義はあいまい。みんなが色んな要素のサブセットを勝手に関数型と呼んでいる
- 議論の前には擦り合わせをしないと喧嘩になるよ
- プログラミングHaskell での定義
- 関数を適用することを主眼とする
- 関数型の手法を提供するだけでなく「奨励」
- パラダイムの違い
- 関数適用、状態はない、破壊的代入をしない
- 永続データを使ったプログラミング
- 例: [10, 20, 30, 40, 50] のリストをn番目はn倍して加える
- 命令型のパラダイムでは、for を使う
- 関数型だとMapReduce → zip, map, foldl。データを変形して行く。データーフローモデルと呼ばれる
- 昔for を愛していた。for で1時間は語れる → 「非対称範囲(n <= x < m)を使え」など
- 関数プログラミングではバグの入り込まないような小さな部品を使う
- リストの三種の神器
- car, cdr, cons (Haskell では head, tail, :)
- LISPの本では、これらの重要な意味が語られていないため、つまらないのではないか
- 配列は永続データではない。リストは永続データとして使える
- リストの先頭にデータを追加しても、データを永続させつつ再利用できる
- パターンマッチがあるHaskellでは、[] と x:xs を使うことが多い
- リストを連結(++)すると、左側はコピーされる(永続化のため)
- ++ はなるべく使わない
- ++ を使うなら右結合で使う (右結合だとO(N)、左結合だとO(N^2))
- 関数プログラミングはリストプログラミング。ここはつまらないけど乗り越えて
- 再帰 → 基底部で終了、再帰部で仕事をさせる
- 「1つ前ができていたら、次はどうする?」を考えれば書ける
- なぜ再帰がいいのか → 再帰は式なので、型検査の恩恵を受けられる
- コンパイル時にたくさん誤りが見つかる
- リストの生成 : 末尾でない再帰で書く
- 遅延評価と相性がよい。正格評価の言語はdelayとforceを使う
- 数値の生成 : 末尾再帰で書く
- sum (x:xs) = (+) x (sum xs) は末尾再帰でない(右辺の一番最後の関数は(+) )
- sum' r (y:ys) = sum' (y+r) ys は末尾再帰 (rは蓄積変数)
- 末尾再帰はgotoになるのでスタックは溢れない
- Q. for ループだとなんで型チェックの恩恵を受けられない?
- A. スタートHaskell の議論を参照!
- Q. Haskell の sum のデフォルトの実装が末尾再帰してないのはなぜ?
- A. 知らない。foldl'を使うといいんだけど、なぜか使ってない
- foldr と foldl
- foldr は末尾再気にならない。リストを生成する関数と相性がよい
- foldl は末尾再帰。数値を生成する関数と相性がよい
- map、filter は再帰でも foldr でも書ける
- 自由度 : 再帰>畳み込み>単純な高階関数
- なるべく自由度の弱い物を使う
- 例: sumEven は再帰より map + filter を使った方がわかりやすい
- 「(再帰で)考えるな! (MapReduceを)感じろ!」
- Q. 効率を考えても自由度が弱い物がよいの?
- A. YES
- 文字列 → 文字のリスト
- メールヘッダのパーサ → Haskellのbreak, dropWhile, foldr を使うと書ける
- 最長重複文字列を探す → suffixリスト
- suffix リストは全要素で文字列を共有するため、効率がよく非常に相性がよい
- 複雑な文字列操作にはパーサを書く。正規表現は忘れよう
- 二分木 → なんでもリストで解決しようとしない
- 永続化により、効率的に共有できる
- 10000ノードの気に要素を追加する場合、約13ノードの追加で済む
- 走査も再帰と(++)で簡単に書ける → (++) 使わずにも書ける
- 用途 → 探索木(八種テーブルの代わり)、集合、キュー、巨大な文字列走査(O(log n)でできる)
- 永続データプログラミングの弱点
- 配列と相性が悪く、O(1)の連想配列がない
- 簡約λカ娘参照
- コンビネータとは、「すてきな内部DSL」
- まずデータ型を定義
- データを返す小さな関数を作る
- 上項を組み合わせる関数を書く (これをコンビネータと呼ぶ)
- 例: パーサーコンビネータでJSONパーサーを定義
- パーサコンビネータは"その言語のコードそのもの"で記述するので、型システム・コンパイラの恩恵を受けられる
- コンビネータ : パサー、プリティプリンタ、ハードウェア記述、金融商品記述
- さらに勉強するための書籍・記事の紹介
- 7つの言語7つの世界
- Scheme 手習い
- Scala スケーラブルプログラミング
- プログラミングの基礎
- Purely Functional Data Structure
- 右も左もわかる再帰
- Haskellの文法
- なぜ関数プログラミングは重要か
- 質疑応答
- Q. Lazyな言語にCLEANもあります
- Q. ループを再帰にする方針はありますか?
- A. ループで書けるならループでいいんじゃない? 何も考えずには無理では? 自転車に乗るのと一緒で、少し修行が必要。パターンは少ないのですぐ覚えられる
- Q. ループは末尾再帰に単純にできるのでは?
- A. はい。
モナドについて / @tanakh さん
- モナドとは何か?
- 非常に難しい質問。数多くの人が答えているが、全然違う主張をしている
- 例 : Monads are Elephants
- 例 : モナドはメタファーではない
- 例 : プログラマブル・コンテナ
- 例 : モナドのすべて 「コンベアのアナロジー」
- ゼノブレイドをやると理解できる
- モナドへの疑問
- なに? 役に立つ? なぜモナド(他じゃ駄目?)?
- モナドはパラダイム
- 手続き型の中の「モナディック」という1パラダイムではないか
- Programmable semicolon
- 構造化定理 : 順次、反復、分岐によって全てのプログラムが書ける → モナドにマッピングされる
- 何が嬉しい? → 順次、反復、分岐 のセマンティクスの書き換え
- ; に意味を持たせたのが >>
- continuation の一般化とも考えられる
- 普通のプログラムが、「非決定計算」「エラーハンドリング」「暗黙の状態を含む処理」に変わる → コンテキストが変わる
- それぞれのコンテキストにあうプログラムを書けばいいんじゃない?
- 抽象化したい。コード偏の共通化
- 例: N-クイーン問題
- Int を受け取り、「解」を返す
- 解を表すモナドを m で書くことで、解の実装を抽象化できる
- なぜモナドなのか? → 構造化定理に必要な要素を自然に記述できる。簡潔。
- 「関数レベルでメタプログラミングするためのもの」
- Haskell でのモナド (>>=) と return
- モナド則 → 単位元と結合則。ただし、プログラマが保証しないと処理系は何もしてくれない
- (a >> b) >> c と a >> (b >> c) が同じになるために必要
- do記法 → 糖衣構文。あたかも手続き型のように見える
- 組み込みのモナド → リスト、Maybe、Eigher、IO
- リストモナド → 非決定計算のコンテクスト
- Maybeモナド → 失敗するかもしれない計算
- IOモナド → モナドはIOのためにあるのではない。コンテキストの一種。
- モナド変換子
- 例: 失敗するかもしれないIO計算
- 例: エラーハンドリングできるパーザー
- MTL → Monad Transformer Library。モナド変換子を含む
- Monad.Cont, Reader, Writer, State, List, Error
- 例: StateT s IO a → IOモナドの走査とStateモナドの操作が両方できる
- liftIO をしてIO 操作をする
- moge = liftIO $ print "HOGE=" にたいして、どんな型をつけると一般的に使えるの?
- MonadIOクラスを使う。liftIOを抽象化したもの
- そして、StateT s IO を MonadIO のインスタンスにすればよい
- 一般の持ち上げにはMonadTrans で、liftを定義できる。内側のモナドから外側への持ち上げ
- monad-control : liftの逆をする物が欲しい
- IOモナドだけでなく、MonadIOにたいしても例外ハンドルしたい。catch はIO専用
- MonadControllIO : liftControlIO が定義されている。
- IOしかとらないインタフェースの関数に、任意のliftしたものが渡せる
- 様々なモナディックライブラリ
- MonadPar : 並列計算。par、seq の代わりに pval と get
- いろいろなパーザー
- WebApp : WAI, Yesod, Snap, CGI
- Interpreter : hint, BASIC
- モナドを作るときには慎重に設計する
- 使いにくくなる。使いにくいライブラリも多い
- 検討すべきこと
- 既存のモナドが利用できない? mtl にあるモナドの張り合わせで実現すべき
- モナド変換子版を必ず用意する : XxxxT という名前
- 非モナド変換子版は、Identity モナドを適用したものにする
- MonadIO のインスタンスにする → 全ての場所でIOができるようになる
- MonadControlIOのインスタンスにする → bracket による正しい後処理
- MonadTrans のインスタンスにする → 他のモナドから多段持ち上げのため
- Functor, Applicative のインスタンスにする → Monadと親子関係になってないのは、歴史的理由ではないか
- エラーハンドリングするならMonadError、失敗への代替はAlternative
- IOモナドはHaskell において外すことのできないモナド
- まともなプログラムを書くとほとんどの関数の方がIOになる → 「IOモナドは感染する」
- MonadIO によって解決できる。IOが必要なコンテキストだけMonadoIOを要求すればよい(PureなコードとIOのコードのオーバーロード)
- Alternative クラス → <|>なる演算子。失敗すると次の結果を使う
- Parsec から来ている。many, some, optional
- -XGenericNewtypeDeriving → newtype のモナドは、deriving で済ませられる
- 質疑応答
- Q. MonadPlus は使わないの?
- A. Alternative と被っている。guard を使いたいときはMonadPlus が必要なので、インスタンスにする方がいいだろう
- Q. コンテキスト変数をhaskellはうまく実装している
- A. そう思う。Haskellの型クラスがうまくいく理由では
- Q. モナドはクロージャーの連鎖になるのでは。実装が大変では
- A. オーバヘッドは大きそう。ghcではインライン化を頑張っているが、モナド変換子が重なるとインライン化しきれなくなる。最近Yesod のパフォーマンスが出なかったのもそれが原因
- Q. モナドはセミコロンの抽象化ってことは、手続き型言語でもできるのでは。いいことは?
- A. 手続き型言語でも同等なことができるだろう。同じコードで違うコンテキストが与えられるのはいいことでは
- A. Haskell に限って言えば、do 構文。また、モナド変換子によって組み込まれて価値が出る
ITプランニングにおける関数プログラミング / @yoshihiro503 さん
- 静的型付関数型言語でのお仕事
- 案件1: FXチャート
- サーバサイドがOCaml
- ロウソク生成 : グラフ内の長方形のこと。1分足、5分足、・・・月足、がある
- ニューヨーク時間を使う。サマータイムの考慮等が必要
- OCamlのよいところ
- 実行時エラーがおきにくい(nullがない、型が強力)
- 型チェックによる拡張
- 副作用がなく見通しがよい
- パフォーマンスがよい (少ないサーバで安定かどう)
- OCamlの悪いところ
- SQL Server や Oracleとの連携のライブラリ不足 → 自作した
- Oracle は現在はあるっぽい
- 遅延リストにより、メモリを大量消費せず多くのデータを順次処理できる
- 派生案件 → Javaアプレット、iアプリ、ocamljsのスマフォアプリ、iPhone+Androidアプリ
- 案件2: 名古屋大ネットワーク管理システム
- Ruby になりそうなところを、静的型付関数型言語がいいですよ!とScala にした
- 他社との協業
- Scalaのよいところ
- 型チェックにより、複数人での開発につよい
- パーサーのコードの見通しがよい
- Scalaの悪いとこ
- (特に他社の)学習コスト。ドキュメント不足。
- 「JavaができるならScalaできるだろ」
- 案件3 iZE Smart Desktop
- モバイル端末にUSBを挿して端末化
- サーバサイドとクライアント再度
- GAEを使いたいという要求 → 自動的に COBOL
- サーバサイドはScala
- モナドにより、失敗するかもしれない処理を簡潔に書く (Optional??)
- Scala では ?~ によるアノテーション(?)でエラー情報をつけられる
- クライアントサイドは haXe + OCaml + Coq
- haXe はActionScript に似ているけど、関数型。パターンマッチとかある
- 静的型付関数型言語の環境はたくさんある
- 中古車相場分析 → haXe + OCaml
- 金属工場の生産受注管理 → F#
- Androidアプリ → Scala
- Coqの改造 → OCaml
- 静的型付関数型言語 でよかったこと
- DBやHTTP周りと、ビジネスロジックを分離できる → 単体テストしたい。証明したい
- 実行時エラーがなく、強固なサーバーが書ける。メンテや複数人で開発しても
- 短く簡潔な記述 → 高階関数、パターンマッチ、型推論、モナド
- 静的型付関数型言語 での苦労
- ドキュメント不足 (エラーメッセージが不明)
- (枯れた)ライブラリが少ない
- 開発環境・・・は今のとこ困ってないEmacsでいいのでは?
- 関数型言語を使うには
- お客さんの信頼を得る
- 開発言語・環境の提案
- 関数型言語を使う
- いいものができる (最初に戻る)
- 具体的にどうアクションをするか
- まずは社内の小さなプロジェクトから使う
- 同僚を巻き込む
- 社内社外勉強会で裾野を広げる
- 「ボクと契約して関数プログラマになってよ!」と言う
- 質疑応答
- Q. エラー文字列をつけるのはMaybe では無理では? 文字列以外をつけるには
- A. Optional 型。拡張すれば可能でしょう
- Q. JavaアプレットはOCaml?
- A. サーバサイド
- Q. OCaml で例外をキャッチせずに終了する問題はどう対応する?
- A. Exception は使わない。Option型等を使う。
- Q. 関数型が狙えるような分野ってありますか?
- A. 仕事でプログラムを書くのに、実行時エラーがあって許されるわけがない。どんな分野でも使うべき。
- Q. 静的型付関数型言語 を使いたいから、って理由で断ったことは?
- A. ある。PHPを使ってやって欲しい、という仕事で他の仕事が多かったため断ったことがある。(ただし、仕事がなければなんでもやるという主義だそう)
COBOL meets Haskell 〜 Haskellを用いたCOBOLのリバースエンジニアリングツールの開発事例 / @georgenano さん
- このタイトルを見て疑問が浮かぶだろう
- なんでCOBOLとHaskellが出会ってしまったのだ
- なぜSIer がリバースエンジニアリングを?
- あなた誰?
- お客さんのIT化できる部分で残っている部分は限られている
- 機能追加等がメインの仕事
- コストの削減が求められる
- しかし、更改は難易度が高い → 予算が少ない。現行仕様のドキュメントはメンテされてない。
- 仕様が必要 → コストが高い
- ソースを人が読む : 人手によるミス
- ヒアリングし直す : 品質が低い
- リバースエンジニアが必要
- 求められるリバースエンジニアリング
- 他言語の解析 : メインフレーム + COBOL + ADABAS のシステムは多い
- 多様な設計書を作成 : 内部設計、CRUD図、ジョブネット図、クラス図
- 実用的な時間で解析 : ファイル数1万、ステップ数5M とかは普通
- Haskell を選択した理由
- パターンマッチが強力
- Strafunski という構文解析ツール
- 単機能のフィルタを組み合わせやすい
- 副作用がないので、機能の入れ替えがしやすい
- 副作用がないので、並列処理がしやすい
- 2年間で15人で300ファイル、36k行のツールが開発された → 実案件でも利用
- チームは役割ごとに分けられている
- 処理の流れ
- 前処理 : コメントの削除など。COBOLのコメントは構文解析しにくい文法(xx~yy列がコメント、など)
- sglr : 構文解析。解析する言語ごとのSDFファイルを作る。ここではATermと呼ばれるデータ
- Strafunski : Haskell で扱えるようなデータにする。ただし、ここではまだ言語依存
- 抽象構文木変換 : 言語非依存の木にする
- 解析変換 : 成果物の形にする
- 解析変換では構文木をルールで変換
- 変数名を日本語台帳で日本語にする。
- 記述順から処理順に変換する
- 論理式や算術式を簡約にする
- 日本語となったデータを、「Excel」で出力。お客様はExcel以外は許さない
- VBAで字下げ等を反映させる
- Strafunski にて探索を行う
- 探索方法 : トップダウンなど
- マッチしたデータ型に対する処理を記述
- 簡単に記述できる
- 企業でHaskell を使ったときの問題
- Haskell の技術者が少ない
- 教育コストが高い → インドにはHaskell が書ける人がたくさんいるらしい
- 教育用問題集の作成
- Eclipse のようなコード補完、GUIがない
- vim が使える人は少ない
- 他言語の開発手法、比較値が使えない (ホワイトボックステストや生産性の指標、工数見積もり値などの統計を持ってない)
- Haskell でリバースエンジニアリングする方募集だそうです!
- 質疑応答
- Q. 15人のうち何人がインド人? さっきカレーを食べたので気になりました
- A. 2人。これから人数を増やす予定
- Q. Haskell を使わないと教育コストは高いが、Javaなどを使うとその分生産性が下がってマイナスになるのでは?
- A. その通りだと思う。Haskell の生産性の高さは、教育コストの高さより見返りが大きい。Java などで作ると、保守性が低かったりカスタマイズしにくかったりする。
言語アップデート
Scala編 / @kmizu さん
- Scala が何かはググって
- Twitter、LinkedIn, Foursquare, amazon.com, VMWare, Remember the Mile などで使っている
- Twitter が凄い。github みるとわかる
- 2.9 の新機能について
- 並列コレクション
- map とか勝手に並列化。 .par を呼ぶと変換してくれる
- コア振り分けを自動でする
- コア数に比例はしない : オーバヘッドや同期のため
- 4コアで1.5倍くらい早くなる。記述は楽なのでこんなもん
- 不変コレクションで副作用がないものが前提。そうじゃないものは注意
- foldLeft など。前の要素の処理結果を使っての処理するので並列化できない
- プロセスの呼び出しライブラリ (I/O周りの改善)
- scala.sys.process "ls" run とか "ls" #> とか "ls #| っとか
- !!や lines など
- Scala dynamic
- Ruby のmethod_missing → 型システムを部分的に破壊できてしまう
- -Xexperimental をつけたときのみ有効
- ある種のDSLには有効。
- Dynamic で化粧したもののみ型システムが破壊される。乱用はしないこと
- Typesafe社
- Scala の商用サポート
- Scala IDE for Eclipse
- オールインワンパッケージを作りたい (現状は Scala + Akka + α)
- 8/29 2.9.1 final
- REPLの立ち上げの高速化 7秒→1秒
- コンパイルの高速化 1.5倍
- 2.9.0 との倍なり互換
- 9/13 Scala for Eclipse 2.0.0 beta 10
- ビルドマネージャがsbtベースになった
- セミコロン推論を表示(省略したセミコロンを表示してくれる)
- 昔は要らないツールだったが、今は普通に使えるので試してもいいのでは(2.0.0 の最新)
- IntelliJ IDEA のScala プラグインの方が凄い
- Java - Scala の横断リファクタリング。Import 補完など
- RESTful HTTPサービスライブラリの流行 (WAFではなく)
- PartialFunction の活用
- Unfiltered, BlueEyes
- NOT MVC。View がない
- 型クラスの流行
- 昔は活用されていなかった。2.8で入った型
- Scalaz 型クラスライブラリ。Category 周り。IOモナドとかも。sjson。
- More Functional
- 昔よりも手続き型ではなく関数型的に書くことが多い
- 副作用の排除、関数合成、永続データ構造
- sbt 0.10系, Specs2 Scalaz, Unfiltered, BlueEyes
- 宣伝
- Scala スケーラブルプログラミング の第2版が出る
- Scala 2.8 対応。おまけの2.9記事
- Scala 実践プログラミング / Cakeパターン、CONCEPTパターン、限定継続
- Scala スケーラブルプログラミング の第2版が出る
- 質疑応答
- Q. Partial function ってなに?
- A. 定義域を調べる isDefinedAt が使える。
- Q. Nothing と Just を返すアプローチと比べると?
- A. 実行しなければわからない。isDefinedAt は本体は実行しない。
Clojureの今 / @tnoborio さん
- 「ノマドなClojureでアジャイル開発する会社」
- Clojure 1.3
- 9/13 にRC0 がリリース
- 直接ダウンロードするか、Leiningen (別リポジトリの指定)を使うか
- プリミティブ型のパフォーマンスの改善。竹内関数で4倍差
- defrecord の改良 → mapで利用できる。シリアライズできる。キーを返せる
- docとdinf-doc は clojure.repl に入った
- Leiningen の進化
- lein retest : 失敗したテストのみ実行
- lein daemon : デーモン化
- lein ring : ring サーバの起動
- ClojureScript
- JavaScript へ書き出されるClojure (CoffeeScript と同じアプローチ)
- Google Closure と連携する
- JS => ブラウザ、Titanium/PhoneGap、Node(連携する機能がClojureScriptにある)
- Clojure on Heroku
- Ruby, Node, Clojure, Java の順にサポートされた
- https://gist.github.com/1130459
- MongoDB も利用可能 (congomongo)
- コミュニティ
- Clojure ハッカソンやるよ!
- Tokyo.clj (clojure-ja)
- 質疑応答
- Q. Clojure の関数型らしさの方向性は?
- A. 破壊的代入はできない。シーケンシャルに、流れるように書く。
Erlang update / @kuenishi さん
- Clojure以下、CommonLisp 以上のメジャーな言語
- Erlang/OTP はプログラミング言語?
- Javaはすごくないけど、Eclipse はすごい → 言語には売りとなる何かがついてるはず
- 高可用サーバープログラミングフレームワークと思った方がよい
- ATM, RADIUS, DNSなど
- Erlangの得意分野
- 計量プロセス/ネイティブスレッドとリクエストの対応
- タイムアウト処理
- 複数イベントの待ち合わせ
- 高速なGC
- ホットコードアップグレード → 末尾再帰をうまく利用して切り替えている
- LET IT DIE - Error処理をきれいに書く
- 開発環境
- Emacs の erlang-mode + distel
- rebar : 同梱できるビルドツール (Python の waf)
- git
- eunit or ct : テストツール
- cover
- DISられる問題の解決策
- 動的型付 → Dialyzer
- 型推論しない → Typer
- Tidier / リファクタリング
- Erjang → JVMに倍とコンパイルする
- LFE → LISPっぽいErlang
- R15が12/14にでる 新機能
- スタックとレースに行番号が出るようになる
- make -j がようやく通るようになる
最近のHaskellマップ @ma0e さん
- GHC 7.0.x
- Haskell 2010 対応
- 新しいI/Oマネージャ (epollベース)
- GHC7.2.x(先月)
- GHC plugins (Core(中間言語) → Core の操作。正格な言語にしたり)
- モナド内包表記
- Safe haskell (unsafeXXX を制限)
- 未来のGHC
- 型レベル GHC Kind level
- データコンストラクタを型レベル、型コンストラクタを種レベルに
- 型レベル GHC Kind level
- Hugsは亡くなった。使わないで。
- コミュニティ「Hackage」 - 3386パッケージ、929 開発者
- Iteratee-based I/O
- 遅延 I/O の問題を解決 → enumerator が現在の主流のパッケージ。
- attoparsec
- Parsec は遅い(モナド変換子、エラーメッセージ)
- CPS変換で8倍速い
- blaze-builder → データをシリアライズ。差分リスト
- text → 高速なUnicode テキスト処理。
- Web界隈 : Yesod vs. Snap
- QuasiQuotes + フルスタック (DBアクセスまで)
- Snap : コンビネータ + シンプル
- 並行、並列 → Parallel GHC Project
- Haskell For Kids プロジェクト → ソースを書くとアニメーションが出るサービス
- 日本の勉強会 → スタートHaskell 180人。
- 今年中に終わる。大量のHaskellerを排出
- Haskellの課題
- GUIライブラリ不足、遅延評価難しい
- 言語もコミュニティも成長過程。これから参加しても遅くない。
- 質疑応答
ここまでで退出しました。大変面白かったです。