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