東京RubyKaigi03に行ってきました

  • 天気

雨。東京マラソンのため最寄駅が最短経路が塞がれてたり、
入り口が塞がれてたり、なかなか面倒な感じで。
 

  • 会場(青山のOracle)

外苑前駅から繋がってるらしいのだが、
大江戸線の青山一丁目から歩く。出口でたら建物見えてるし。
7〜8分くらいだったと思います。
となりにLexusの販売オフィスがあったりラグジュアリーな建物。
入り口はQRコードをゲートにかざして通り抜ける感じ。
#六本木ヒルズはゲストカードは警備員さんだったもんなぁ。
 

  • メタプログラミング入門(Yuguiさん)

スケールアウトという会社で広告配信のお仕事をJavaでやってる。
メタプログラム
 プログラムをプログラムする
 Rubyの場合は他の言語と比べて特徴がある。
  ⇒非S式/First class object/コンパイル無し
 文字列をとして出力してevalする時も、どこで落ちたのか分かりやすいように
 __FILE__, __LINE__+1なんてのを使うのが常套手段。
 コンパイルがないので、とんでもないコトがやろうと思えばできちゃう。
 マクロの否定⇒ブロックによってある程度補われている。ex. Rake, RSpec
 Rubyの構文は維持したくて、でもブロックでやらかいことも出来るように
  → バランス。
 クラス
  →特殊なオブジェyくとに過ぎない。Classクラスのインスタンス。
 特異クラス
  →クラス階層。BasicObject – Object – Module – Class
   クラスのクラスは特異クラス。途中からわけわからずw
 呼び出し可能オブジェクト
  →Proc, Method, UnboundMethod, Continuation
 eval族
  →eval, instance_eval, class_eval
   S式ではないので文字列としてRubyプログラムを出力して評価してもらう
 DSL
  Rspecでよく見るコードから。 should be baz ってどっから出てきたの?
  →トップレベルでは使えないけど、ブロックを評価する時だけ使える
 Prime(Ruby1.9のライブラリ)
  newしてインスタンスを生成してから使うものだったけど、、
 モジュール定義
 流し込み
  irbを使ってリモートデバッグ的な。ヒアドキュメントを使って
  メタプログラミングしてるっぽいけど、理解できずww
 

  • ハンズオンセッション Sinatra

Twitterのクローンを作る
dm-core, dm-timestamps, do_sqlite3 unicornが足りなかったので追加でインストール
unicorn – Rackに特化したhttpサーバー。ポートは8080。
ruby-debugが入ってないと怒られるのでgemでインストール
モデル(model.rb)
 include DataMapper::Resource
 ↑でpropertyとかhas 1とか使えるようになる。
 property の Serialってのでオートインクリメントしてくれるオブジェクト
 timestamps :at で勝手にtimestampもケツにくっつけてくれる。
 after :create do ← セッションの管理に今回は使ってる。
アプリ(app.rb)
 configure do ← サーバが起動する時に一回だけ。
 unicorn はマスタのプロセスが起動してそっからフォークされてく感じ。
 シナトラのセッションはcookieがデフォルト(セキュリティが危ないかも?)
 erb :index
 ↑viewsの下のindex.erbが勝手に呼ばれる
 DataMapperは日本語のドキュメントとかないけど、
 オフィシャルページ(http://datamapper.org/docs/)にサンプルとかも豊富なので〜、と。
 DataMapperのmigrateとかも秀逸。
heroku
 DataMapperのバージョンが古くて〜っていう背景。
その他
 Rackの層でHTTP周りのフィルタみたいのがあったり。
 モバイル用のでこんなのもある→http://github.com/take-yu/rack-ketai
 シナトラは1個のコントローラがでっかくなっちゃうから、
 チームとかでちゃんとしたモノ作ったりするのに向いてるわけではない。
 バックエンドのAPIにシナトラを使ってる←向いてるところ。
 

  • M17N

文字集合
 どのような文字を扱うか。
 アラビア数字、アルファベット大文字-6bit、アルファベット小文字-7bit、
 カタカナ-8bit、などなど-16bit, などなどなど21bit
 JISでは同じだがUnicodeでは別
  はしごだか、土の下が長い吉
 JISでもUnicodeでも同じコードポイント
  葛飾区 葛城市
エンコーディングとは
 →バイトを数字にして文字に戻すためのもの
  IANA Charset ISO2022-JPとかEUC-JPとかShift_JISとかWindows-31Jとか
用語の整理
 charset。用法としてはencodingと同じ
 文字コード。その文脈に応じて判断する必要がある。
 UCS-2。文字集合ではなくencoding
国際化
 internationalization→I18N
 multilingualization→M17N。ローカライズと国際化をセットにしたようなノリ
 Rubyに関してはEBCDICは忘れてるw
 ASCIIの拡張が沢山出てきた
  →Rubyはまだ少ない方。iconvとかだと500以上とか。
 Unicode
  →実はASCIIでさえも、トルコはiのuppercaseがまんまデカくなるだけだった、
   言語を指定しないと定義できてないっていう。
 CP932
  Windows版のシフトJIS。Windows-31Jのこと。
  JIS企画由来のShift_JISとは異なる。
  円記号問題「¥」
   puts “表”ってやるとエラーになる。末尾が。。
  波ダッシュ問題「〜」
 UCS
  内部では文字コードを統一。JavaとかPerlとか。
  入力はそのコードに変換。内部コードで処理。
  出力時に変換して。
 CSI
  Rubyはこっち。内部コードとか特にない。
Ruby1.9
 Stringが文字単位になった。特定の内部コードがない。
 Magic CommentでUTF-8とか指定しなきゃダメよ。
 KCODEは廃止。
Stringと言語
 可能かどうかは文字コードによる。
 UTF-8では出来ない。
 →見果てぬ夢なのではないか…
Unicodeユーティリティ
 文字幅どうする?とか。
コマンドラインからマジックコメントを入れることができる
 →とにかくマジックコメントで
 

  • open3 田中さん

おぉ。さっき松屋で目の前でメシ食ってた人だw
なぜプロセス起動したいか?
 →プリンタとか、ソートとか、、、
Rubyのプロセス起動の問題
 →system(), IO.popen()→細かい事出来ない
 →fork()→UNIXでしか動かない。。
 ⇒spawnで解決
プロセス
 →ID, メモリ空間, カレントディレクトリ
 ・カレントディレクトリ
   相対パス解釈の起点
 ・プロセスリミット
   coreファイルのサイズ
   CPU時間
   データサイズ
 ・ファイルディスクリプタ
   プロセスがファイル等にアクセスするための番号
   ファイルをオープンするとfdが割り当てられる
 ・標準入出力
   fdの0,1,2番は標準的な用途がある
   プロセスの外から与えられopen/close不要
    0:標準入力、1:標準出力、2:標準エラー出力
 ・リダイレクト
   プロセスの標準入出力をファイルにつなぎかえる
 ・パイプ
   プロセスとプロセスをつなぐ
 ・Unixのプロセス起動
   fork:forkを呼び出したプロセスの複製を作る
   exec:呼び出したプロセスを指定したコマンドで置き換え
   forkとexecの組み合わせてコマンド起動
 ・非Unixのプロセス起動
   forkとexecが分かれているのはUnixの特徴
Rubyでやりたい事
 →OSが提供しているプロセス起動機能を使いたい
  シェルで出来ることをRubyでもやりたい
 ・forkを非Unixでやるのは難しそう
 ・systemの返り値の意味も変わってきちゃうし
 ・IO.popenではパイプを作らない事を可能にするか?
OSには手入れられないので高位APIと低位APIに分割
 →高位API:open3, 低位API:spawn
高位API:open3
 →zcat ruby.1.gz | nroff -man | less くらいの事は簡単に
  標準入出力やパイプを扱える
低位API:spawn
 →起動したプロセスの属性を指定できる
  OS固有の機能も可能な限り指定できる
spawn
 コードは↓こんな感じ
 –
 pid = spawn(“make all”, :out=>”hoge.log”)
 Process.wait pid
 –
 fork+属性変更+execをひとまとめにした感じ。
  →posix_spawn。引数が多くて複雑な感じ。。
  →Rubyのspawn。やりたい事だけ書けばOK
open3ライブラリ
 昔から標準で入ってるもの
 標準添付ライブラリ。名前の由来はPerl
 ゾンビプロセス:あるプロセスが終了したのに親によりwaitされてないプロセス
 →プロセスが終了すればすぐにwaitしてくれる
  double forkもしないのでpidが得られる。pidを使ってkillも出来る
 spawnのオプションも使用可能なのでカレントディレクトリを移動したり。
 標準入力と標準出力を別々に吐いたり、マージしてくれたり。
shellライブラリ
 シェルを模倣してるためちょっと無理があったり。。
 –
 Shell.def_system_command “zcat”
 sh = Shell.new
 sh.transact{
  (zcat STDIN
 }
 –

コメント

タイトルとURLをコピーしました