- 天気
雨。東京マラソンのため最寄駅が最短経路が塞がれてたり、 入り口が塞がれてたり、なかなか面倒な感じで。
- 会場(青山の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 } --