<?xml version="1.0" encoding="shift_jis"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>やまかわのログ</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/" />
    <link rel="self" type="application/atom+xml" href="http://antas.jp/blog/yamakawa/atom.xml" />
   <id>tag:antas.jp,2010:/blog/yamakawa//4</id>
    <link rel="service.post" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4" title="やまかわのログ" />
    <updated>2010-10-14T08:09:30Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type  3.33-ja</generator>
 
<entry>
    <title>Foundation of bezier curve (3)</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2010/10/foundation_of_bezier_curve_3.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=904" title="Foundation of bezier curve (3)" />
    <id>tag:antas.jp,2010:/blog/yamakawa//4.904</id>
    
    <published>2010-10-14T07:43:21Z</published>
    <updated>2010-10-14T08:09:30Z</updated>
    
    <summary>さて、今度はこれもまたベジェ曲線で問題になる最近傍点の探索問題です。 以下の図の...</summary>
    <author>
        <name>山川</name>
        
    </author>
            <category term="math" />
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[さて、今度はこれもまたベジェ曲線で問題になる最近傍点の探索問題です。

以下の図のように、ある座標βに最も近いベジェ曲線上αの点を探すにはどうしたらよいでしょう？

<img alt="Bezier2.png" src="http://antas.jp/blog/yamakawa/Bezier2.png" width="350" height="136" />

実は、これについても簡単に求める方法がなく、以下の式の根を求めることになります。

<img alt="nearest.gif" src="http://antas.jp/blog/yamakawa/nearest.gif" width="224" height="29" />

ここでB(t)は1回目で紹介したベジェ曲線の多項式です。上記の式は5次方程式になり、解の公式が存在しないため数値解析等を利用して解くことになります。

解き方としては以下のものが代表的ですが、他にも色々あるようです。
<ul>
<li>Newton法</li>
<li>Bezier Clipping</li>
<li>Bisectionning</li>
</ul>

参考：
<a href="http://ieeexplore.ieee.org/Xplore/login.jsp?url=http%3A%2F%2Fieeexplore.ieee.org%2Fiel5%2F4721667%2F4721981%2F04722219.pdf%3Farnumber%3D4722219&authDecision=-203">Accurate and Efficient Algorithm for the Closest Point on a Parametric Curve</a>他
この論文ではBezier Clipping同様にベジェ曲線のConvex hull性を利用しています。]]>
        
    </content>
</entry>
<entry>
    <title>Foundation of bezier curve (2)</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2010/10/foundation_of_bezier_curve_2.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=903" title="Foundation of bezier curve (2)" />
    <id>tag:antas.jp,2010:/blog/yamakawa//4.903</id>
    
    <published>2010-10-14T07:22:24Z</published>
    <updated>2010-10-14T07:31:10Z</updated>
    
    <summary>だいぶ間があきましたが続きです。 de Casteljauのアルゴリズムではtを...</summary>
    <author>
        <name>山川</name>
        
    </author>
            <category term="math" />
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[だいぶ間があきましたが続きです。

de Casteljauのアルゴリズムではtを定めたのち、次の6つの式をまず計算します。

<img alt="decas.gif" src="http://antas.jp/blog/yamakawa/decas.gif" width="208" height="215" />

この式に出てきたベクトルを下記のように選んで新しいベジェ曲線を２つ作ります。すると、曲線の形を維持したままtの位置で分割された2つのベジェ曲線を得ることができます。

<img alt="splitted.gif" src="http://antas.jp/blog/yamakawa/splitted.gif" width="192" height="67" />

参考：
The Essentials of CAGD
<a href="http://www.farinhansford.com/books/essentials-cagd/">http://www.farinhansford.com/books/essentials-cagd/</a>]]>
        
    </content>
</entry>
<entry>
    <title>手稲高校インターンシップ 2010</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2010/08/_2010.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=898" title="手稲高校インターンシップ 2010" />
    <id>tag:antas.jp,2010:/blog/yamakawa//4.898</id>
    
    <published>2010-08-24T03:21:52Z</published>
    <updated>2010-08-24T03:40:15Z</updated>
    
    <summary>だいぶ遅くなりましたが今年も手稲高校から4名のみなさんに来て頂き、プログラミング...</summary>
    <author>
        <name>山川</name>
        
    </author>
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[だいぶ遅くなりましたが今年も手稲高校から4名のみなさんに来て頂き、プログラミングを体験してもらいました。

去年はProcessingを利用しましたが、見ていると構文エラーが出た時にかなりつらいようでしたので
今年はビジュアルプログラミング環境で行くべ、ということで
MIT Media Lab の Scratch<a href="http://scratch.mit.edu/">(http://scratch.mit.edu/)</a> を利用することにしました。

カリキュラムとしては物体の動かし方を学んでもらってから、最終的にpongっぽいものをつくるというかんじでやってみました。

ことしのみなさんはLOGOやC/C++、なでしこ（！）の経験者という強者ぞろいだったため、事前に用意したネタが尽きてしまうというトラブルもありましたが、おおむね喜んで頂けたようです。

当日作ったスケッチを以下に貼ります。実行にはブラウザへのSun Java プラグインインストールが必要です。
<a href='http://scratch.mit.edu/projects/antas_yama/1261212'><img src='http://scratch.mit.edu/static/projects/antas_yama/1261212_med.png' width='425' height='319' alt='Scratch Project'></a>
(英語が間違ってるのに気付きましたが直してもサムネイルが更新されません！ぎゃー）]]>
        
    </content>
</entry>
<entry>
    <title>Foundation of bezier curve</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2010/03/foundation_of_bezier_curve.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=861" title="Foundation of bezier curve" />
    <id>tag:antas.jp,2010:/blog/yamakawa//4.861</id>
    
    <published>2010-03-25T03:43:00Z</published>
    <updated>2010-10-14T06:51:57Z</updated>
    
    <summary>最近ベジェ曲線をいじいじしていたのですが、案外衝突判定とか切断のまとまった情報が...</summary>
    <author>
        <name>山川</name>
        
    </author>
            <category term="math" />
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[最近ベジェ曲線をいじいじしていたのですが、案外衝突判定とか切断のまとまった情報がなかったので書いておきます。

とりあえずここでは三次ベジェ曲線を取り上げます。Adobe Illustratorとかでお馴染みのアレです。(以下図版はWikipediaより引用)
<img src="http://upload.wikimedia.org/wikipedia/commons/4/44/Bezier.png">
三次ベジェ曲線は次の式によって与えられます。

<img src="http://upload.wikimedia.org/math/5/e/3/5e32b674a98a9f70e492851f9ad92b61.png">

ここでtは長さを表すパラメータで0≦t≦1です。P0（始点）が0、P4（終点）が1になります。P1,P2は制御点です。
ベジェ曲線はふつうの直線の描画とことなり、媒介変数tを動かしてそのtの時のx,y座標を求める、というやり方でしか描画ができなかったりします。

さて、このパスを適当なtの位置（長さ）を決めて、パスの形をそのままにそこで切断するとした時、どのようにしたらよいでしょうか。

これには、<a href="http://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm">de Casteljau's algorithm</a>というのを使います。de Casteljauはベジェ曲線を考えた人ですが、これを使うと新しいコントロールポイントの位置が多項式を逐次的に計算していくだけで簡単に決まります。(続く)

参考：
The Essentials of CAGD
<a href="http://www.farinhansford.com/books/essentials-cagd/">http://www.farinhansford.com/books/essentials-cagd/</a>]]>
        
    </content>
</entry>
<entry>
    <title>NSImageに文字を描画するとさかさまになる？</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2010/01/nsimage.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=831" title="NSImageに文字を描画するとさかさまになる？" />
    <id>tag:antas.jp,2010:/blog/yamakawa//4.831</id>
    
    <published>2010-01-06T09:34:02Z</published>
    <updated>2010-01-07T05:14:04Z</updated>
    
    <summary>今日も今日なでCocoaアプリを書いていたわけですが、 ドはまりしたことがあった...</summary>
    <author>
        <name>山川</name>
        
    </author>
            <category term="OSX" />
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[今日も今日なでCocoaアプリを書いていたわけですが、
ドはまりしたことがあったのでここで書いておこうかと。

アプリケーションの描画の際に、
今までカスタムビュー上にそのまま描画していた部分を、
テキストやパスなどのベクタデータも含めて
半透明合成等のピクセル合成処理をかけないといけなくなったので、
一度NSBitmapRepresentaionをバックエンドに持たせたNSImageにデータを描画し、
一種のラスタライズを行ってからそのNSImageをカスタムビュー上に描画しなおすことにしました。

この方針でおおよそもくろみ通りうまくいっていたのですが、
テキストを描画していた部分をこの方法に置き換えてみたところ、
文字の天地が逆になってしまうという問題が発生してしまいました。

色々往生してみたところ、<a href="http://osdir.com/ml/cocoa-dev/2009-08/msg01364.html">cocoa-devで同じようなハマり</a>をしている人が見つかりました。
focusが当たっているビューの座標系が上下反転させた状態で、
NSImageにlockFocusでfocusを当てて画像上に文字を書くと、この症状が起きるようです。
Cocoaの仕様的にどうにもならないようでしたので、
NSImageにsetFlipped:YESを設定した状態で反転したビットマップを作り、
さらにそのあとにNSAffineTransformで上下反転マトクリクスを作成して
現在のグラフィクスコンテキストに結合し、
上下反転コピーを行ったビットマップをもう一個作ることで
なんとなく対処できました。

一応予定の見栄えにはなったのですが、
2回ビットマップができるので大変無駄臭いような気がします…。]]>
        
    </content>
</entry>
<entry>
    <title>scipyの統計関数が爆速なことについて</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2009/11/scipy.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=824" title="scipyの統計関数が爆速なことについて" />
    <id>tag:antas.jp,2009:/blog/yamakawa//4.824</id>
    
    <published>2009-11-25T08:22:42Z</published>
    <updated>2009-11-25T08:29:19Z</updated>
    
    <summary>自前のピアソンの積率相関係数のpython実装をscipy.stats.pear...</summary>
    <author>
        <name>山川</name>
        
    </author>
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[自前のピアソンの積率相関係数のpython実装をscipy.stats.pearsonrに変更するだけで30倍くらい処理速度が上がってびっくらこきました。すごい…。

ところでscipyで書いたものをJavaに移植したいなあ、と思ったのですが、Commons mathでも予想以上に線形代数や統計関係が充実していました。sparse matrixとか特異値分解とかも入っているので、よっぽど速度が必要な場合以外は<a href="http://code.google.com/p/matrix-toolkits-java/">JNI-BLASバインディング</a>を使わなくてもよさそうです。そのうち比較してみますが。

Javaの場合演算子オーバーライドがないですので微妙にまどろっこしい印象はいなめませんがしかたないですね。]]>
        
    </content>
</entry>
<entry>
    <title>PythonでHTMLのスクレイピング：scrapemark</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2009/10/pythonhtmlscrapemark.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=818" title="PythonでHTMLのスクレイピング：scrapemark" />
    <id>tag:antas.jp,2009:/blog/yamakawa//4.818</id>
    
    <published>2009-10-21T08:20:04Z</published>
    <updated>2009-10-21T08:30:27Z</updated>
    
    <summary>一個前のエントリと関連して、PythonでWebサーバ上のHTMLをスクレイピン...</summary>
    <author>
        <name>山川</name>
        
    </author>
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[一個前のエントリと関連して、PythonでWebサーバ上のHTMLをスクレイピングしてくるべーということをやろうとしたのですが、これはScrapemark :<a href="http://arshaw.com/scrapemark/docs/examples/"> http://arshaw.com/scrapemark/docs/examples/</a>というのを使うと大変簡単にできました。

使い方はまあ簡単で
<blockquote>
&gt;&gt;&gt; scrape("""
        &lt;div id='content'&gt;
        {{ before_table }}
        &lt;table /&gt;
        &lt;/div&gt;
        """,
        url="http://example.com")

&gt;&gt;&gt; {'before_table': 'Look at these data points'}
</blockquote>

みたいなかんじです。
HTMLの繰り返しになっているところの中身をリスト化してとってくることもできます。これは
<blockquote>
&gt;&gt;&gt; scrape("""
        &lt;body&gt;
        {*
                &lt;div class='section' id='{{ [section_ids] }}' /&gt;
        *}
        &lt;/body&gt;
        """,
        html)

>>> {'section_ids': ['nav', 'content', 'footer']}
</blockquote>

というかんじで大変使い勝手が良いですねー。開発元の<a href="http://arshaw.com/scrapemark/docs/examples/">example</a>を見ると、もっと構造化したデータも取ってこれるようです。
RubyでNokogiriとかするより楽な気が致しますねえ。

あと、スーパー便利な事に結果にはユニコード化された文字列が入ってきますので扱いも楽ちんです。]]>
        
    </content>
</entry>
<entry>
    <title>SQLAutocode</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2009/10/sqlautocode.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=817" title="SQLAutocode" />
    <id>tag:antas.jp,2009:/blog/yamakawa//4.817</id>
    
    <published>2009-10-21T08:10:07Z</published>
    <updated>2009-10-22T03:17:19Z</updated>
    
    <summary>普段はなんぞRubyだのObjective-Cだの書いているのですが 少々諸般の...</summary>
    <author>
        <name>山川</name>
        
    </author>
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[普段はなんぞRubyだのObjective-Cだの書いているのですが
少々諸般の都合（主にRubyに疎行列ライブラリがあんまりない！）で久々にPythonを使っています。
で、既存のDBからデータを取ってくるために
SQLAlchemyを使おうと思ったのですが、SQLAlchemyはどうやらスキーマ定義が必要らしく、
まあSQLSoupを使えばなんとでもなるようなのですが微妙に気に食わなかったため、
DBからリバースエンジニアリングでスキーマ定義ファイルをつくってくれるのはないかなーと探したところ、
SQLAutocodeというのを使えばよいみたいでした。

<a href="http://turbogears.org/2.1/docs/main/Utilities/sqlautocode.html">http://turbogears.org/2.1/docs/main/Utilities/sqlautocode.html</a>

使い方は 
<blockquote>
easy_install sqlautocode
sqlautocode -d -o model.py sqlite:///moviedemo.db
</blockquote> とかするだけです。
べりー簡単ですねえ。

追記：relationはどうにもならないので手で書いて上げる必要があります。]]>
        
    </content>
</entry>
<entry>
    <title>Ruby + GDB</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2009/10/ruby_gdb.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=815" title="Ruby + GDB" />
    <id>tag:antas.jp,2009:/blog/yamakawa//4.815</id>
    
    <published>2009-10-06T04:41:14Z</published>
    <updated>2009-10-08T08:43:04Z</updated>
    
    <summary>Rubyで書いたデーモンプログラムがどこかでDeadlockして止まっているのだ...</summary>
    <author>
        <name>山川</name>
        
    </author>
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[Rubyで書いたデーモンプログラムがどこかでDeadlockして止まっているのだけどGDBではRubyインタプリタのバックトレース見れないしどこで止まってるのかよくわからない、という経験をした方はいらっしゃるかと思うのですが、そういう場合にはGDBとRuby用のGDBスクリプトを使うと結構いい感じです。

代表的なものとして
<a href="http://github.com/michaelklishin/gdb-macros-for-ruby">http://github.com/michaelklishin/gdb-macros-for-ruby</a>
などから取得してきたスクリプトを~/.gdbinitに追加しておけば、あとはデッドロックしているプロセスにgdb -p pidでアタッチして、GDB内でrb_backtraceなりrb_raiseなりを実行するとバックトレースが取れます。Googleで検索すると、他にもいくつかスクリプトがあるようです。

Pythonでも同じようにGDB用のスクリプトが用意されているようです。
<a href="http://wiki.python.org/moin/DebuggingWithGdb">http://wiki.python.org/moin/DebuggingWithGdb</a>

不意にRubyがC Extention内などでSEGVってしまった場合などでも同様にインスぺクションが可能ですので、なかなか便利なように思います。

追記：コアを取るようにしていた場合はもちろんコアダンプの解析にも使えますね。]]>
        
    </content>
</entry>
<entry>
    <title>インターンシップ受け入れ</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2009/07/post_1.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=787" title="インターンシップ受け入れ" />
    <id>tag:antas.jp,2009:/blog/yamakawa//4.787</id>
    
    <published>2009-07-31T10:57:58Z</published>
    <updated>2009-07-31T11:13:31Z</updated>
    
    <summary>7/2に手稲高校の2年生4人のインターンシップを受け入れました。 当日はProc...</summary>
    <author>
        <name>山川</name>
        
    </author>
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[7/2に手稲高校の2年生4人のインターンシップを受け入れました。

当日はProcessingで四角を塗りつぶすところから始めて、
プリミティブなゴルフゲーの弾を出すだけのようなプログラムを作ってもらいました。

何故ゴルフゲーかというと、簡単な物理の数値シミュレーションを体感してもらいたかったためです。
重力加速度と空気抵抗のパラメータを変えると反重力になるとか、すごい勢いで物が落ちていくとかを
色々試してもらいました。

<a href="http://www.openprocessing.org/visuals/?visualID=3128">
<img alt="ball.png" src="http://antas.jp/blog/yamakawa/ball-thumb.png" width="213" height="216" />
http://www.openprocessing.org/visuals/?visualID=3128
</a>

時間が足りなかったため、
↑の打ち出し機は実際には固定になってしまいました。

来年があったらハードウェアにしますかねー。
AVRとか。
（こっそり最近ICE買ったので。。）
]]>
        
    </content>
</entry>
<entry>
    <title>Velocity 2009(2)</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2009/07/velocity_20092.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=777" title="Velocity 2009(2)" />
    <id>tag:antas.jp,2009:/blog/yamakawa//4.777</id>
    
    <published>2009-07-15T02:50:24Z</published>
    <updated>2009-07-15T03:45:41Z</updated>
    
    <summary>だいぶ間が空きましたがVelocity 2009の続きです。 Building ...</summary>
    <author>
        <name>山川</name>
        
    </author>
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[だいぶ間が空きましたが<a href="http://en.oreilly.com/velocity2009/public/schedule/proceedings">Velocity 2009</a>の続きです。

<strong>Building OpenDNS Stats</strong>
<a href="http://jp.techcrunch.com/archives/20080720opendns-makes-20kday-filtering-phishing-and-porn-sites/">OpenDNS</a>というDNSを外部提供してる会社の人のログ捌きの話です。ログが一日140億件くらいあるそうです…。生ログは阿呆ということでとりあえずグラフ、というのと、ログを一個のテーブルに入れるのは問題外なのでネットワーク毎に別テーブルにしてる、オートインクリメントはロックがかかるのでタコだからSHA1でPKを作ってる、iowaitの80%はファイルのopen/closeなんでmysqld_safe に ulimit -n 600000をセットしとく、ログ集計処理は専用のサーバを3台用意してバッチ処理してる、集計クエリはLIMITつけないで発行してmemcachedに丸ごと入れておき、ページングは手元でやるなどなど。

<strong>Death of a Web Server: Crisis in Caching</strong>
あんまり中身がなかったので省略。珍しくWindows ServerベースのWebサーバの話だったのでなんか特有のスケーリングてくにっくとかあるのかと思ったらそういう話も特になく…。

<strong>Fixing Twitter: Improving the Performance and Scalability of the World's Most Popular Micro-blogging Site</strong>
えーまず2008年に752%（げえ）ユニークビジターが増えたという話から始まります。ていうかグラフの角度が怖いです。このくらいになるとちゃんと計算機科学を使わんと無理、とか消火活動するより予測を行って事前にCapacity Planningしておきましょう、とか。Webサーバのログを拾って503エラーとか500エラーの件数はグラフ作ってるそうです。これはいいですねー。サーバの設定変更はレビューを必須にしてて、履歴をレビューツールに記録してて、Subversionはchangelogに"reviewed"っていうのが入ってないとはじくようにしてる、等々。
プログラム側の方の話ではなんでも計測できるようにしておこう、とかメトリクスは推測じゃなくて決断のために使いましょう、あとキュー使おうなど。色々書いてあって忘れてきました。ActiveRecordのキャッシュライブラリ<a href="http://github.com/nkallen/cache-money/tree/master">Cache Money</a>というのが割と気になりました。
キャッシュの話。全体設定の変更とかでキャッシュが一気に整合性壊れるのとかどうすんべ、memecachedもたまにSEGVるなど。]]>
        
    </content>
</entry>
<entry>
    <title>Velocity 2009</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2009/07/velocity_2009.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=767" title="Velocity 2009" />
    <id>tag:antas.jp,2009:/blog/yamakawa//4.767</id>
    
    <published>2009-07-03T05:07:31Z</published>
    <updated>2009-07-03T06:06:03Z</updated>
    
    <summary>BBC Radio Asian network内ので配信されているBhangra...</summary>
    <author>
        <name>山川</name>
        
    </author>
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[BBC Radio <a href="http://www.bbc.co.uk/asiannetwork/underground/">Asian network内の</a>で配信されているBhangra番組のクオリティの高さにびっくりしたりしていましたが、ぼちぼち<a href="http://en.oreilly.com/velocity2009/public/schedule/proceedings">Velocity2009の資料</a>が公開されてきているので、上から順番に眺めてみた感想をつらつら書いていこうと思います。

<strong>10+ Deploys Per Day: Dev and Ops Cooperation at Flickr</strong>
<a href="http://my.safaribooksonline.com/9780596518578">The Art of Capacity Planning</a>でおなじみFlickrのマネージャJohn Allspawさんらによる、運用チームと開発チームの関係を如何に円滑にマネージして行くかという話です。兎角運用は「オレのサーバは悪くない！おまえのヘボコードのせいだ！」となり一方開発は「オレのコードは悪くない！おまえのヘボサーバのせいだ！」となりがちですが、そこらへんの責任の投げ合いをどうやって回避していくかというような大変心に響く内容でした。開発の方も運用の方も一読をお勧めいたします。

<strong>2 Years Later, Loving and Hating the Cloud</strong>
一年半くらいオンラインレタッチつき写真カタログサービスをAmazonのCloud関係で運用してるPicnikの方のAmazonCloud感想です。正直あんまり印象が残らず…。「 S3に要らんデータを残しとくと無駄にお金がかかるけど、あんまりうまい削除の方法が思いつかんので放置中」という話くらいでしょうか。後はサーバリソースの使用状況に大きいスパイクがあるような運用ケースでは結構使い出があるというグラフなど。

<strong>Ajax Performance</strong>
<a href="http://www.amazon.co.jp/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742">JavaScript: The Good Parts</a>という著書（この本は知らなかったので後で調べます。。）のあるDouglas CrockfordさんのAjaxでどうやって性能を出していくかという話です。ブラウザのヘッポコ加減やDOM操作の遅さに嫌気がさしている方は結構いらっしゃるかと思いますが、DOMにノードを追加する前にプロパティの設定は終わらせておくなど、「あるある」ネタが割と書いてあって良かったと思います。

<strong>Beyond Gzipping</strong>
HTTPストリームをGzipというかdeflate対応にしておくと転送量が減るのはすでにおなじみですが、なんかgzipで転送されないユーザーエージェントが結構あるなー(15%くらい）と思ったら、パーソナルファイアウォールとかのプロクシ機能を持つセキュリティソフトが、HTTP通信の内容をgzipされると中身を読めないので勝手にHTTPヘッダの「Accept-Encoding:gzip, deflate」を削除しくさってた、というかなり「まじでー」という話でした。

続きは後日！]]>
        
    </content>
</entry>
<entry>
    <title>Rackデーモンの起動スクリプトを書いてみる</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2009/05/rack.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=716" title="Rackデーモンの起動スクリプトを書いてみる" />
    <id>tag:antas.jp,2009:/blog/yamakawa//4.716</id>
    
    <published>2009-05-13T09:46:51Z</published>
    <updated>2009-05-18T03:13:41Z</updated>
    
    <summary>割合最近マルチスレッドかつそこそこ高速に、簡単なHTTPリクエストをDBを引いて...</summary>
    <author>
        <name>山川</name>
        
    </author>
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[<p>割合最近マルチスレッドかつそこそこ高速に、簡単なHTTPリクエストをDBを引いて捌くサーバプログラムを書く機会がありました。
</p>
<p>そういうのにMerbをとかを使うのもヘビーウェイトだなあと思い、Ramazeとかもいんじゃないかなあと少し思いましたが折角なのでRack+Sequelでいってみることにしました。 RackについてはMerbでおおよそ知っていましたのでさっくり作ることができたのですが、デーモンの起動スクリプトを作るところで少し困ってしまいました。</p>

<p>Rackは出来合いのrackupというコマンドがあり、これでサーバを起動します。-dオプションを付けるとデーモンとしてバックグラウンド起動するのですが、たいへん不便なことに停止するコマンドがありません。なのでとめる時はpidをもとにSIGINTをおくってやらないといけないです。</p>
<p>
また、rackupには実行ユーザーを指定する方法がありません。したがって、rackupコマンドを実行する際にsu -cを利用して、実際の実行ユーザーでデーモンを起動する必要があります。</p>

<p>これらにより以下のようなスクリプトを書きました。出来あがったプログラムはRubyとは思えない速さでウルトラ高速に動作して大変よかったですので機会を見つけてまた使ってみようと思います。</p>]]>
        <![CDATA[<pre class="code">
#!/bin/bash
#
# chkconfig: - 85 15
# description: launch rackup app
#

APP_DIR=/home/rackapp/app/rackapp
APP_NAME=rackapp
USER=rackapp
GROUP=rackapp
PORT=9100
ENV=deployment
PID_FILE=/tmp/rackapp.pid
LIBDIR="$APP_DIR/lib"
BOOTUP_RU="$LIBDIR/bootup.ru"

RETVAL=0

# Gracefully exit if the rackup is missing.
which rackup &gt;/dev/null || exit 0

# Go no further if config directory is missing.
[ -d "$APP_DIR" ] || exit 0

function start
{

    ARGS="$BOOTUP_RU  -s mongrel -p $PORT -E $ENV -D -I $LIBDIR -P $PID_FILE"
    echo $ARGS
    su -c "rackup $ARGS" $USER
    RETVAL=$?
    sleep 3
    if pgrep -f 'rackup'
    then
      echo "$APP_NAME listened at $PORT"
    else
      echo "error: $APP_NAME bootup was failed."
    fi
}

function stop
{
    if [ -f $PID_FILE ];
    then
      # send interupt.
      kill -INT `cat $PID_FILE`
      RETVAL=$?
      sleep 3

	  if pgrep -f 'rackup'
      then
        echo "error: $APP_NAME was not terminated."
      else
#        rm $PID_FILE
        echo "$APP_NAME was terminated"
      fi
    else
      echo "pid file for $APP_DIR was not found : [$PID_FILE]"
      exit 0
    fi
}

case "$1" in
    start)
	start
	;;
    stop)
	stop
	;;
    restart)
	stop
	start
	;;
    *)
	echo "Usage: $APP_NAME {start|stop|restart}"
	exit 1
	;;
esac

exit $RETVAL
</pre>]]>
    </content>
</entry>
<entry>
    <title>mod_xsendfile+mod_proxyの小ネタ</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2009/04/mod_xsendfilemod_proxy.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=700" title="mod_xsendfile+mod_proxyの小ネタ" />
    <id>tag:antas.jp,2009:/blog/yamakawa//4.700</id>
    
    <published>2009-04-15T04:24:48Z</published>
    <updated>2009-04-24T03:23:06Z</updated>
    
    <summary> mod_xsendfileが利用できる場合はmod_xsendfileを使って...</summary>
    <author>
        <name>山川</name>
        
    </author>
            <category term="小ネタ" />
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[<p>
mod_xsendfileが利用できる場合はmod_xsendfileを使って、
そうでない場合は自前で送るようにしたいなあ、というときの小ネタです。
</p>

<p>
そういうことをするには、mod_xsendfileが有効であるかどうかをなんとか
判別しないといけないわけですが、そのためにmod_headerを使って、
mod_xsendfileが有効な時だけ付加的なヘッダをねじこんでやるとうまいことが判別ができました。
</p>]]>
        <![CDATA[<p>
Apacheの設定に以下の内容を書いておくと、mod_proxyのリバースプロクシによるリクエストのヘッダにX-Mod-XSendFile:Onというのが入ってきます。アプリケーション側ではRack::Requestの場合だとrequest.env["HTTP_X_MOD_XSENDFILE"]で内容がとれますので、その内容に応じてXSendfile処理をしたりしなかったりするとよい感じです。
</p>

<pre style="background-color:#fef">
&lt;IfModule mod_xsendfile.c&gt;
&lt;IfModule mod_headers.c&gt;
RequestHeader append X-Mod-XSendFile "On"
&lt;/IfModule&gt;
&lt;/IfModule&gt;
</pre>

追記：rack-contribにも似たようなのがありました。
そちらを使うとNginxとかにも対応できるようなので
同様にリクエストヘッダを追加することは必要ですが、
プログラム側でのレスポンスヘッダの対応は必要ないみたいなのでそっちのほうがいいです。]]>
    </content>
</entry>
<entry>
    <title>RubyでUDPブロードキャストを送受信してみる その２</title>
    <link rel="alternate" type="text/html" href="http://antas.jp/blog/yamakawa/2009/03/rubyudp_1.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://antas.jp/mtsys/mt-atom.cgi/weblog/blog_id=4/entry_id=687" title="RubyでUDPブロードキャストを送受信してみる その２" />
    <id>tag:antas.jp,2009:/blog/yamakawa//4.687</id>
    
    <published>2009-03-25T06:23:44Z</published>
    <updated>2009-03-25T07:08:58Z</updated>
    
    <summary>同一マシン内外の複数プロセスにブロードキャストメッセージを送る必要があり、 さて...</summary>
    <author>
        <name>山川</name>
        
    </author>
    
    <content type="html" xml:lang="ja" xml:base="http://antas.jp/blog/yamakawa/">
        <![CDATA[<p>同一マシン内外の複数プロセスにブロードキャストメッセージを送る必要があり、
さて不特定多数に送るならUDPブロードキャストかなあと思ったのですが、
同じポートにbindできないといけないからダメだなーとと思ったところ、
実はUDPだとsetsockoptでSO_REUSEADDRをセットすると
複数プロセスで同一ポートを待ち受けるようになり、
マルチキャストやブロードキャストもそれぞれのbindしているプロセスに届けられるようです。</p>

<p>ということを知ったので以前の<a href="http://antas.jp/blog/yamakawa/2008/12/rubyudp.html">RubyでUDPブロードキャストを送受信してみる</a>を改修してみました。ついでにアドレスなどをSocketクラスの定数を使うように置き換えています。
</p>]]>
        <![CDATA[<p>
server:</p>
<pre style="background-color:#fef">
require 'socket'
require 'yaml'

require 'socket'
require 'yaml'

SETTING = YAML.load_file('./invoker.yaml')
sock = UDPSocket.open()

sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR , true)

sock.bind(Socket::INADDR_ANY, SETTING[:expose_port])

while(1) do
    p sock.recvfrom(20)
end
</pre>

<p>
client:</p>
<pre style="background-color:#fef">
require 'socket'
require 'yaml'
SETTING = YAML.load_file('./udp.yaml')
sock = UDPSocket.open()

port =  SETTING[:expose_port]
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
p sock.send("Hello\n", 0, Socket::INADDR_BROADCAST, port)
</pre>

<p>
試してみるとベリーナイスに動きます。メッセージ送信元のプロセスもポート待ち受けしているときは、メッセージを受け取った時に送信元が自分かどうか確認するような対策をしたほうが良い場合もあるかもしれません。
</p>

<p>参考： <a href="http://docs.sun.com/app/docs/doc/819-2254/udp-7p?a=view">Solorisのudp(7)マニュアル</a><br />
<a href="http://www.developerweb.net/forum/showthread.php?t=3908">SO_REUSEADDR and UDP - UNIX Socket FAQ</a>
</p>
]]>
    </content>
</entry>

</feed> 


