トップ 最新 追記

Route 477



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にメッセージが来てて

うーん、どうしましょうかね。

あと

  • yuya先生が使いたいそうなのでRubyStationのwindows対応をやります
  • オタマトーン大人気

B002IGTOZQ って在庫切れかい!

[tDiary] Mac+Firefox+tDiary

Firefoxでtdiaryの日記を書こうとするとC-pがプレビュー、C-hが「この日の日記を隠す」、C-aが送信、C-eが「この日付の日記を編集」になるという悪夢モード

本日のツッコミ(全4件) [ツッコミを入れる]

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]


2009-11-10

[ruby] 大規模Railsサイトのための新しいHTTPサーバ、Unicorn

githubの中の人が、ブログで「Unicorn使い始めて一ヶ月くらい経つけどいい感じだよ」と書いています。 適当に要点だけ拾ってみました。

Unicornって何よ?

UnicornはRubyのためのHTTPサーバ。MongrelやThinのようなものだけど、全く違う設計と思想を持っている

ありがちな構成

                         [mongrel] [mongrel] ..
 [nginx] -> [haproxy] -> [mongrel] [mongrel] ..
                         [mongrel] [mongrel] ..

問題点:

  1. あるactionの処理に60秒以上かかったとき、Mongrelが当該スレッドをkillしようとして固まることがある
  2. メモリが一定量を超えたときMongrelを再起動するのが遅い。
  3. デプロイ時に9個のmongrelが同時に再起動するので重い(対策もややこしい)
  4. mongrel1つの再起動もけっこう遅い
  5. 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が暇になったらリクエストを処理する。いわばカーネルによるロードバランシング)

問題点がどう変化するか:

  1. workerの処理が30秒*2以上かかると、masterはこのworkerをkillして新しいのをforkする。(forkなので、インスタンスの生成は一瞬で終わる)
  2. workerがメモリを食いすぎると、godやmonitからSIGQUITが送られる。すると、workerは「リクエストが終わり次第」exitする。(リクエストの途中でkillされることがない)
  3. デプロイ時は、Unicorn masterにSIGUSR2を送る。
    • するとmasterは新しいmasterを起動し、新しいアプリケーションコードが読み込まれ、workerがforkされる。
    • 最初のworkerが古いmasterの存在を検知し、SIGQUITを送る。古いmasterは自分のworkerたちを終了してexitする。
    • 常にいずれかのworkerが動いているので、ダウンタイムがない。また、新旧のworkerは同じソケットを使うので、nginxは変化に気づかない。
  4. Unicornの再起動は速い(masterが1回コードをロードするだけなので)。workerの再起動もkillしてforkするだけなのでとても速い。
  5. pull方式なので、バランシングはworkerが暇になったら自分で取りに行くだけと単純そのもの。

本文ではこのあと移行のためのヒントと、githubで使われている設定、ベンチマークが紹介されています。

関連しそうな書籍

4873114004

4873114160

おまけ

姉妹品のRainbows!も気になってるんだけど、いまいちよく分かんないです (workerの粒度と並列化方法を切り替えられるようにすることで、long-pollとかに対応する??)

*1 TCPにすることもできる

*2 設定可能

本日のツッコミ(全1件) [ツッコミを入れる]

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寄り・ライブラリ寄り。

公式サイト
http://limelight.8thlight.com/
ダウンロード・インストール
http://limelight.8thlight.com/main/download
チュートリアル
http://limelight.8thlight.com/main/tutorial_1
Wiki
Main Page - Limelight
rdoc
http://limelight.rubyforge.org/rdoc/index.html

2009-11-13

[smalltalk] GNU Smalltalkのクラス階層をグラフ化した

世間の流行りを無視してSmalltalkネタ。

今日はGNU Smalltalkの組み込みクラスの 継承関係をGraphvizでプロットしてみました。(拡大: 560KB)

gst_classes_.png

ソースは 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に変換すると、 ノードがクリックできるようになる。これは便利かも。

ダウンロード:http:../files/gst_classes.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")
...
  1. 最初の起動時は、キャッシュがないので、WebからHTMLを取得して返す。
  2. このとき、%エンコードしたファイル名 (html/http%3A%2F%2Fwww.gnu.org%2F...みたいな) でHTMLを保存する。
  3. 2回目以降はファイルから読み込むので高速 (だしサーバに迷惑をかけない)。

本体(HTMLを操作するコード)の方では、ファイルから読み込んだかWebから取得したかを気にせずに書ける。load || get という感じ

WWW::Mechanizeの機能として標準装備されると嬉しいんだが。

使用例(上のエントリのやつです): http://gist.github.com/233727

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

wtnabe [間違いました。72574 じゃなくて http://gist.github.com/76140 こっちでした。]

にゃぁ [あ、こういうやつね。 ソース出さないとありがたくないかもね。実際問題、クラスのヒエラルキってブラウザで追えるでしょ?..]

にゃぁ [SmalltalkならSmalltalkの中で完結して欲しかったね。]


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より引用]

これでいけた。

本日のツッコミ(全2件) [ツッコミを入れる]

ムムリク [毎回ではないですが、Windows 環境で起きます。 about:config を見たけれど、該当項目がなかったです..]

yhara [別の設定項目があるんですかねぇ。 http://fxwiki.blog63.fc2.com/blog-entry-2..]


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より引用]

よろしくどうぞ!

本当に小さなネタで大丈夫ですよー