2009-11-02
■ [junk] 神の贈り物と地獄の宴
ブロントさん名言集から新しいネタを仕入れた。
お前ら覚えてろよ?PvP機能は俺にとっては神の贈物だがお前等にとっては地獄の宴だからな
[ブロントさん名言集より引用]
応用例:
- instance_evalは上級者にとっては神の贈物だが初心者にとっては地獄の宴だからな
- モナドそのものの理解は上級者にとっては神の贈物だが初心者にとっては地獄の宴だからな
- callccは上級者にとっては神の贈物だが実装者にとっては地獄の宴だからな
■ [mac] Tab Sweep
Shades
MacBookの画面を暗くするソフト。
寝る前にPCいじるときとかに良いかもね (それはどうなんだ)。
ソフト カテゴリ「動画録画」 ~Mac OS X アプリ・ソフトウェア・アプリケーション~
RubyStationのデモ動画を撮るのに参考になった。 CamTwist+iMovieでいけるかと思ったけど、CamTwistを認識してくれなかったので。
結局スクリン・クロラ - The Screen Crawlers というソフトを使いました。名前見てからクリック余裕でしたw
2009-11-07
■ [event] 関西Ruby会議02
「LTの時間が余ってる」とか言われたのでやろうかなーと思っていたネタでLTしました。
伝えたかったことは
- why先生の作品はそれぞれ新メンテナが引き継いでるよ http://github.com/whymirror/
- RubyStationのアプリ書いて下さい
の2つです。
さて、家に帰ったらgithubにメッセージが来てて
- http://github.com/ktlacaelel/gemi をgemcutterに上げようとしたら君のhttp://github.com/yhara/gemi と被ったんだけどマージしてくれない?
- (別の人から) ~/.ruby-stationじゃなく~/.local/ruby-stationにすべき(XDG standard?)
うーん、どうしましょうかね。
あと
- yuya先生が使いたいそうなのでRubyStationのwindows対応をやります
- オタマトーン大人気
B002IGTOZQ って在庫切れかい!
2009-11-10
■ [ruby] 大規模Railsサイトのための新しいHTTPサーバ、Unicorn
githubの中の人が、ブログで「Unicorn使い始めて一ヶ月くらい経つけどいい感じだよ」と書いています。 適当に要点だけ拾ってみました。
Unicornって何よ?
UnicornはRubyのためのHTTPサーバ。MongrelやThinのようなものだけど、全く違う設計と思想を持っている
ありがちな構成
[mongrel] [mongrel] .. [nginx] -> [haproxy] -> [mongrel] [mongrel] .. [mongrel] [mongrel] ..
問題点:
- あるactionの処理に60秒以上かかったとき、Mongrelが当該スレッドをkillしようとして固まることがある
- メモリが一定量を超えたときMongrelを再起動するのが遅い。
- デプロイ時に9個のmongrelが同時に再起動するので重い(対策もややこしい)
- mongrel1つの再起動もけっこう遅い
- push方式のバランシングなので、本当にうまいインスタンスが選ばれるか分からない
そこでUnicornですよ
Unix [unicorn worker] [unicorn worker] .. [nginx] -> ドメイン -> [unicorn worker] [unicorn worker] .. ソケット [unicorn worker] [unicorn worker] ..
nginxを、Unixドメインソケット*1経由でUnicorn workerにリクエストを送るように設定
- Unicorn masterは起動すると、まずアプリケーションをロードする。ロードが終わり次第、16個のworkerをforkする (つまり、workerが16個でもロードは1回だけ)
- 各workerはselect()でソケットからの入力を待つ (つまり、workerが暇になったらリクエストを処理する。いわばカーネルによるロードバランシング)
問題点がどう変化するか:
- workerの処理が30秒*2以上かかると、masterはこのworkerをkillして新しいのをforkする。(forkなので、インスタンスの生成は一瞬で終わる)
- workerがメモリを食いすぎると、godやmonitからSIGQUITが送られる。すると、workerは「リクエストが終わり次第」exitする。(リクエストの途中でkillされることがない)
- デプロイ時は、Unicorn masterにSIGUSR2を送る。
- するとmasterは新しいmasterを起動し、新しいアプリケーションコードが読み込まれ、workerがforkされる。
- 最初のworkerが古いmasterの存在を検知し、SIGQUITを送る。古いmasterは自分のworkerたちを終了してexitする。
- 常にいずれかのworkerが動いているので、ダウンタイムがない。また、新旧のworkerは同じソケットを使うので、nginxは変化に気づかない。
- Unicornの再起動は速い(masterが1回コードをロードするだけなので)。workerの再起動もkillしてforkするだけなのでとても速い。
- pull方式なので、バランシングはworkerが暇になったら自分で取りに行くだけと単純そのもの。
本文ではこのあと移行のためのヒントと、githubで使われている設定、ベンチマークが紹介されています。
関連しそうな書籍
4873114004
4873114160
おまけ
姉妹品のRainbows!も気になってるんだけど、いまいちよく分かんないです (workerの粒度と並列化方法を切り替えられるようにすることで、long-pollとかに対応する??)
□ okkez [Rainbows! は低スペックなマシン用のやつらしいです。]
2009-11-12
■ [ruby] CSSのような概念を取り入れたJRuby用GUIライブラリ、Limelight
LimelightはJRuby上で動くクロスプラットフォームなGUIライブラリだ。
詳細はチュートリアルを見て欲しいが、画面の定義(prop)と:
backdrop :background_color => "black", :width => "100%", :height => "100%" do sample :width => 100, :height => 100, :background_color => "red", :text => "red" selection :id => "the_selection", :width => 300, :height => 300, :background_color => "gray" end
見た目の定義(style) を分けるのが面白い。(属性の一覧)
backdrop { background_color "black" width "100%" height "100%" } sample { width 100 height 100 } selection { width 300 height 300 background_color "gray" }
prop/style共に、RubyのDSLで表現される。
イベントハンドラは、以下のように書く。(イベントの一覧)
module Sample def mouse_clicked(e) selection = scene.find('the_selection') selection.style.background_color = self.style.background_color end end
Ruby Shoesの影響がありそうだけど、ShoesよりもGUI寄り・ライブラリ寄り。
2009-11-13
■ [smalltalk] GNU Smalltalkのクラス階層をグラフ化した
世間の流行りを無視してSmalltalkネタ。
今日はGNU Smalltalkの組み込みクラスの 継承関係をGraphvizでプロットしてみました。(拡大: 560KB)
ソースは http://gist.github.com/233727
感想
- Rubyと比べると、モジュールがないのでシンプル。
- しかし多重継承もないのか。だからArrayやStringはComparable(もとい、Magnitude)じゃないんだ。
- 小クラス主義(と思って良いですか?)なので階層が深い。
- 例えば Array > ArrayedCollection > SequencableCollection > Collection > iterable > Object とかなってて凄い
- 仮想クラスは色を変えてみました
- が、判定方法が /I am an abstract class./ ってそれでいいのか
- クラスの説明に「僕は仮想クラスだよ」とか一人称で書いてるSmalltalk可愛い。
- ちょ、Continuationあるのかw
Graphvizについて
Graphvizについてのメモを書きました。複雑な構造をささっと可視化するととてもハッカーっぽい(イメージ)ので覚えておくと良いと思います。
どうでもいいおまけ
Smalltalkではメソッド呼び出し(Rubyの「.」)がスペースなので、自然言語DSLには強そう。
追記
リファレンスを眺めていたら、ノードにURLを付記する機能があることに気づいた。「ps2形式」で出力して、ghostscriptのps2pdfでPDFに変換すると、 ノードがクリックできるようになる。これは便利かも。
■ [ruby][scraping] load_or_get
スクレイパを書くとき、HTMLファイルを開発用に保存したりするのがめんどいのでなんとかならないか考えてみた。
WebからHTMLを取得するときに、キャッシュを作る。ファイル名はURLを%エンコードしたものを使う。
def load_or_get(url) path = File.join("html", CGI.escape(url)) if File.exist?(path) Nokogiri(File.read(path)) else page = $agent.get(url) File.open(path, "wb"){|f| f.write page.root.to_html} page.root end end doc = load_or_get("http://www.gnu.org/software/smalltalk/manual-base/html_node/Base-classes.html") ...
- 最初の起動時は、キャッシュがないので、WebからHTMLを取得して返す。
- このとき、%エンコードしたファイル名 (html/http%3A%2F%2Fwww.gnu.org%2F...みたいな) でHTMLを保存する。
- 2回目以降はファイルから読み込むので高速 (だしサーバに迷惑をかけない)。
本体(HTMLを操作するコード)の方では、ファイルから読み込んだかWebから取得したかを気にせずに書ける。load || get という感じ
WWW::Mechanizeの機能として標準装備されると嬉しいんだが。
使用例(上のエントリのやつです): http://gist.github.com/233727
2009-11-14
■ [javascript] JavaScript1.7のyieldをIEでも実現する「WSJS」
コメント欄で教えていただいたのですが。
yield文はJavaScript1.7で導入された、「関数を途中で止めたり再開したりする」ための文法です。 いまのところ、Firefox/Safari/Chromeで実装されているらしいのだけど、 SafariとChromeでうまく動かせませんでした。うーむ。
WSJSを使うと、そんなyield文をどのブラウザでも使うことができるそうです。
JavaScriptの機能拡張というと、
- 事前にコンパイルするタイプ
- JavaScriptでJavaScriptをパースするタイプ
などいろいろありますが、これは
- Ajaxを使って、サーバサイドで変換する
ようです。なんとw
中身と関係ないですが、"上記のライセンス規約を了承した上でダウンロードしてください。" と書かれているのに、上には何も書かれていないのが気になりました。
2009-11-29
■ [linux] Ubuntuのfirefoxが起動時に毎回オフラインになることの対策
about:config で、toolkit.networkmanager.disable を false から true に変更
[https://forums.ubuntulinux.jp/viewtopic.php?id=5531より引用]
これでいけた。
2009-11-30
■ [ruby] Ruby Advent Calendarやりましょう
PerlのがうらやましかったのでATNDにRuby版のイベントを立てました。
● Advent Calendarとは?
クリスマスまでの日数を数えるために、1日に1つ、穴が空けられるようになっているカレンダーです。転じて、技術系コミュニティで、クリスマスまでの25日間にTipsを1つずつ公開するイベントをAdvent Calendarと呼ぶそうです。
● ルール
Rubyに関するTipsをひとつ、特定の日に、自分のブログにアップロードしてもらうだけです。
執筆順は、このイベントに参加した順です。最初の人が12月1日、2人目が12月2日…と続いていって、最後の人が12月25日です。
[Ruby Advent Calendar jp: 2009 : ATNDより引用]
よろしくどうぞ!
本当に小さなネタで大丈夫ですよー
Before...
□ yhara [I wrote: * I got a github message from you * You said the ..]
□ Hey yhara-san! [Yeah, I posted this waaay before I sent you that message o..]
□ yhara [yes, rvm is awesome]