関西オープンソース2009(関西Ruby会議02・関西コミュニティ大決戦)に参加してきました

http://k-of.jp/2009/index.html
金・土の二日間、標記のイベントへ行ってきました。聴講したセッションについて記録を。
間違いがあったらごめんなさい… まだ満足に扱えないEmacsでのメモ取りは大変だ。早く慣れないと

1日目

セミナー室に机が無くて、この日はパソコン開くの自重してた上に、紙のノートも持って行ってなかったのであまり記録が残っていません…すみません

ソフトウェア技術者が知っておくべきこと by 坂下さん

  • 新人プログラマとの間の知識ギャップについて
  • 「新人がこんなことも知らなかった」な例がいろいろと
  • 採用の時にどのくらいを要求したか、どのくらいで妥協したか、という問題のような
  • 現実的なところでは、そんな何でも知っている人ばかりを採用できるわけはないので、最初から同じ常識を持っていると思わない方がよいですよね。本当に問題なのは、知らないことではなくて知ろうとしないこと

セキュアコーディングノススメ by 久保さん

  • JPCERTでセキュリティのための取り組みをやっています
  • C言語の思想:「プログラマは言語仕様を完璧に把握しており、自分がやろうとしていることを正確に表現できるはず」プログラマを信頼する言語
  • しかし現実は…
    • いつもセミナーで出している、整数型変換などなどの言語仕様クイズ→全部正解できる人は1%未満
    • 言語仕様の難しさ:100を超す「未定義の動作」「処理系定義の動作」
    • ツールも万能ではない:ツールの指摘を鵜呑みにして修正したらデグレードで大問題になった実例あり
  • プログラマが正しい知識を持たないといけないし、そのためのサポートが必要
  • 望ましいコーディングスタイルをwikiでまとめてある(C/C++/Java
  • セミナーもやってますよ

続・現場で役立つRuby on Railsパターン by 大場さん

  • Railsは、Webアプリケーションについて何もわかっていなかった頃(そもそもHTTPさえ知らなかった!)にチュートリアルをやっただけ…
  • なので具体的な内容はほとんどわからないものの、どんな話題があるのかを耳に入れておく程度のつもりで出席
  • 意外と把握できた
  • Railsもう一度動かしてみようかなぁ

Rubyでソフトウェア作りをアジャイルにするということについて by 角谷さん

http://kakutani.com/20091106.html

  • 「パターン・Wiki・XP」「nature of order」秩序の源泉とは?
  • ソフトウェアは放っておいたらその辺から自然に生えてくる。Rubyもそうやってできてきた
  • Rubyは楽しい。それでいいじゃないか
  • プログラマは大きな力を持っている。その分だけの責任も伴う
  • 「PG」言うな

2日目

Hacking parse.y by ujihisaさん

  • 会場でRubyの処理系を触ったことのある人→4割くらい!
    • 今回の発表はあまり触ったことのない人が対象ですよ
  • parse.yがRubyのパーサ。これに新しいシンタクスを追加して改造することで理解していきましょう
  • Matz「Rubyの汚いところ二つはparse.yとeval.c」
  • evel.c(評価器)はRuby1.9からYARVに書き換えられた
  • parse.yが現在のRubyMRI)の中で一番大きいファイル(自動生成されたファイル除く:10000行超)

デモ

  • 例1:「:-)」というハッシュ関連づけリテラルを定義してみましょう
    • Lexerがコロンをハンドリングしているところの先頭に、追加するリテラルのための処理を追加する
  • 例2:Lisp風のシンボル定義:「'」でシンボルを定義できるようにしてみましょう
    • 「'」が二つ続くと文字列として解釈されるが、回避方法が見つからなかったのであきらめ
    • 1024文字以内に次の「'」が出てきた場合は文字列とする(きめうち)
  • 例3:前置インクリメントの追加
    • succを使って定義する。 ++i := i = i.succ
    • Lexerに新しいトークンを追加、パーサも「+」をハンドリングしているあたりを書き換える
  • 例4:「#」によるインスタンスメソッド定義
    • クラスメソッドの定義は def A.b なのにインスタンスメソッド定義がclass A内で def b だから非対称。def A#b と書きたい

そのほか

  • ほかにもいろいろと好きな演算子を定義できます。既存のコードが動かなくなるかもしれないけど。「(::)」(cucumber operator)とか「<3」(love operator)とか作っている人がいた
  • Rubyのビルドを何回もやってると、ログが流れるのを見ながらいつごろビルドが終わるか予測できるようになる!
  • 調べる際には、Ruby Hacking GuideのHTML版を参考にしました
  • Rubyのパーサについて調べ始めたのは、リスト内包表記がRubyで使えたら便利じゃないか? という動機から
  • 後置インクリメントは、戻り値を保持しておくための一時変数が必要だがparse.y内で一時変数に代入しておく方法が見つからなかったのでやらなかった
    • succの逆演算があれば一時変数使わなくても簡単に実現できるが
  • このあたりのことは勉強し始めて3ヶ月くらい
    • ただし、朝から晩まで勉強しての3ヶ月
  • termtterについて

Ruby Lightning Talks

立ち見多数。すごい人気。

  • Sixeight(西村)さん
    • RubyではじめるGTD
    • GTDはテスト駆動と似ている!
    • タスク管理ソフトのXMLを扱うEverythingというライブラリを書きました githubで公開してます
  • kyaraさん
    • visualizing and processing
    • プレゼン資料自体がVisualizing言語で書かれている rp5?
    • 日本地図のデモ
    • ひな形作って、サイズ変えたり画像読み込んだりといったコードが楽に書ける
  • 松本さん
    • lang-8におけるRubyの活用
    • Railsで二人で作っている
    • 一週間前にバックエンドを総入れ替えした
    • キャッシングがサイトの仕様上難しい
    • データ全部をKey-Value Storeに入れて全部のデータをmemcachedに乗せる
    • KVSを抽象化するSimpleResourceというライブラリを作った
    • すべてのデータをJSONスキーマレスで保存
    • MySQLBarracuda(Deflateで圧縮)を使うとDBサイズ半分に
    • CPU負荷は1/4に
    • Rubyだからできた!
  • ストヤンさん
    • Web3.0 on ruby
    • TwitterのせいでPollingでの情報取得ができなくなった
    • Pushがほしい、リアルタイム性
    • WebhooksではHTTPを使ってPushを実現している
    • そのあたりRubyで簡単に書けます
    • XMPPとかもある。Google Waveで使ってる
    • XMPPRubyで扱うライブラリ作りました→Rubyなら簡単に書けます!
  • 角谷さん
    • Rubyの会第6期の活動について
    • RubyKaigi2010開催決定。8月27日−29日に筑波で
    • RubyKaigi2010のWebサイトをLT中にデプロイ→時間ちょうどでアップロード完了 http://rubykaigi.org/2010/
  • サイロス誠さん
    • Miyako(ゲーム作成ライブラリ?)の新機能
    • 今度本が出ます
  • jugyoさん
    • Rubyで楽しく開発:自作ツールの紹介
    • ifchanged
      • ファイルの変更を監視して何かするツール
      • 監視指定ファイルとそいつが変更されたときに行う処理を指定する
      • gemでインストールできる
    • g
      • pみたいなもの
      • g object で Growlに出力
      • Growlだから別のマシンに送ることもできる
      • gemでインストールできます
  • yharaさん
    • 豪華二本立て
    • why Ruby
      • why the luchy stuff。Rubyのすごい人。→ 今年8月に失踪
      • whymirrorにミラーが残されている、新メンテナも決まっている。コードは受け継がれる
    • Ruby Stationの紹介
      • Rubyでデスクトップアプリを作りたい
      • ブラウザをGUIにしてしまおう
      • Sinatraでデスクトップアプリを作る

Googleオープンソース活動の紹介 by 山下さん(京都GTUG)

  • GoogleOSSを利用→コミュニティへの還元
  • Googleライセンス」というものはない、既存のオープンソースのライセンスが優れているものだから
    • 新しいライセンスを勉強してもらうのは開発者にとって大変なことで、利用の障壁になる
    • 基本Apache、それがやりづらい場合はBSDとか
  • Googleが公開しているプロジェクト(一部)

アプリケーションのアクセシビリティ by 持田さん

http://handsout.jp/slide/1856

  • ACRIという団体でアクセシビリティ普及のための活動をしている
  • PCがCUIからGUI中心になってアクセシビリティの確保が困難になった
    • CUIなら単純なスクリーンリーダでよかった。全部文字だし
    • GUIでは難しい。マルチウィンドウ・画像…
    • いまだにDOSを使い続ける人も
  • MSAAという解決策
    • COMオブジェクトのIAccessibleインターフェース
    • 各コントロールの名前、役割、状態を返すAPIを定義
    • スクリーンリーダーはこのAPIから返ってきた情報を使える
    • VisualStudioでコントロールに適切なプロパティを付けてやると設定できる
  • まだ残る問題:各ウィンドウ内に書かれるコンテンツの詳細は単純なMSAAでは解決できない

Rubyによる Mac OS X デスクトップアプリケーション開発入門 by 高尾さん

  • MacRubyデモ
    • まずXCodeでプロジェクト作成
    • Rubyファイル追加 一つのクラスを実装するだけでアプリケーションになる
    • クラスにattr-accessorを定義することでGUI部品とつなぐインスタンス変数が定義できる
    • senderという引数一つを持ったインスタンスメソッドを定義する。これがボタンのアクションのイベントハンドラになる
    • 画面設計:アプリケーション起動時にアプリケーションクラスのインスタンスを一つだけインスタンス化する処理をGUIで定義できる
    • GUI部品貼り付け。もちろんGUI
    • 画面上のテキストフィールドにクラスのインスタンス変数を割り付ける。これもGUIで。Ctrl押しながらドラッグすると線がびよーんと出てつなげる
    • ボタンのアクションにインスタンスメソッドを割り付ける。上と同様にGUI
  • Macアプリの配布
    • Bodega:MacアプリのAppStore
    • 審査なさそう?
  • OS X 10.6で入った機能であるGCD(Grand Central Dispatch)について説明
    • おおざっぱに言って、並列処理のためのライブラリ
    • C言語の拡張+ランタイムAPI
    • MacRubyで利用できる(0.5以降)
    • GCDデモ:素数の数を数える あえて効率の悪いアルゴリズム
      • GCD使わない場合:23秒
      • GCD使った場合(ループを並行処理):11秒
      • 全部別のスレッドにした場合:12秒 ただしスレッドをたくさん起動すると落ちたりする。また、今回のサンプルコードでは問題にならなかったが、たくさんロックがかかる状況だと遅くなるはず
    • Dispatch:::Queue.concurrent を使う
    • GCDがグローバルディスパッチキューを用意、処理ブロックをそこに登録する。登録された処理はFIFOで実行される。その際にコア数などを考慮して自動で並列処理される
    • ロックをかける = プライベートディスパッチキューを使う
      • プライベートディスパッチキュー:処理を登録した順に一つずつ処理するキュー。好きなだけ作れるワーカスレッドはグローバルディスパッチキューと共通
    • スレッドを何個起動したらよいかを人が判断するのは難しい
    • ロック不要なのでデッドロックが発生しない
    • スレッドを直接使うと、うまく書けば効率のよいプログラムが書けるが、難しい

GC黄金時代 by nariさん

http://www.slideshare.net/authorNari/gc-2447192

  • Rubyコミッタ:「GCについて考える人」
  • RubyGCの話はニコ動にあげてあるからそっちを見てね → http://www.nicovideo.jp/watch/sm8362885
  • 会場内でGCが好きな人:5人 予想通り
  • 会場内でGCのコードを読み書きしたことがある人:10人くらい、そんなにいるとは
  • なぜGCが好きか?→よくわからない、運命ではないか
  • GCいろいろ
    • 参照カウント
      • PythonPerlで採用
      • リアルタイム性が高い・負荷が分散
      • カウンタの増減にある程度のプログラマの責任がかかる
      • 循環参照の問題
      • マークスイープGCと組み合わせるのが一般的
    • マークスイープ
    • コピー
      • 同じサイズのメモリ領域を二つ用意(From領域・To領域)
      • アロケートは片方だけで行う
      • いっぱいになったらもう一方にコピー、コピー時にマークスイープして生きているオブジェクトだけをコピー
      • トレースとコピーを同時にできるので速い
      • フラグメンテーションが起きない
      • メモリ領域が倍必要
      • 保守的GCとの相性が悪い
    • 保守的GC
      • ルート内でのオブジェクトのアドレス探索:どうやってオブジェクトのアドレスを見つけるか? 即値などがチェックをすり抜ける可能性
      • マークスイープGCの場合、怪しいものはすべてマークする→保守的GC
      • コピーGCの場合は、コピーの時にルート内のポインタのアドレスを書き換える必要がある
      • ルート内の即値を書き換えてしまう危険
    • 正確なGC
      • ポインタだけを正確に集める
    • RubyGCは保守的GCとマークスイープ。
      • コピーGCをやるには正確なGCを実装しないといけないので難しい
      • 保守的GCの実装は世の中にそんなにないので是非読んでみて
  • GC黄金時代
    • …はもう過ぎちゃった気がする、60〜80年代
    • GCアルゴリズムはたいていその時期に考案されたアルゴリズムの組み合わせ
    • GCの誕生:1960年 Lispにはメモリ解放用の関数があったが使うのが難しい→マークスイープ
    • 同年、マークスイープの効率の悪さから参照カウント考案
    • 1963年、Marvin Minsky コピーGC考案 二つ目のコピー領域は磁気テープ。時代だ
  • GCの未来
    • モダンな言語にGCは必須→これから多くのGCが実装されるだろう
    • ほとんどのGCは言語ごとの特性を反映したオーダーメイド
    • GCアルゴリズム的な黄金時代は過ぎたが、GCの実装の黄金時代はこれから
    • これは結局、まつもとさんが言っていた「プログラミング黄金時代」ということではないか
    • この先のGCに関連のありそうなトピック:SSD・並列性・ハードウェアでのGCサポート(実例あり)・機械学習の組み込み

Ruby関西懇親会

  • しゃぶしゃぶ。食べ放題飲み放題なのに3500円(学生は2000円)と、とても安かった
  • 知らない人たちだらけでそわそわ、そわそわ
  • いろいろな方に話しかけていただいてけっこう会話できました。ありがとうございます!

感想

こんなイベントが無料で開催されるとは一体どうなっておるのか。内容盛りだくさんであっという間の二日間でした。たまにこういう集まりに出向くのは本当によい刺激です。休み取って参加してよかったです。
しかしまぁ全体的に話について行けない・語れるものを持っていないというのはどうしたものか。きっと愛が足りない、つまり読み書き悩みの絶対量が足りない。
とはいえ何でもはやれないから、テーマを絞ってやらねばならん。そのフォーカスを絞るのに、どこかで発表する(ことを想像して)準備をする、というのは有効ではないかと思います。
というわけでshikoku.rbを想定してネタ拾いをしよう。