東京RubyKaigi03に行ってきました

  • 天気

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

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

スケールアウトという会社で広告配信のお仕事を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版のシフトJISWindows-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  }  --