2008年8月5日

NicoProxy2 と Squid を MacOSX 上で 組み合わせる

最近は元気が無いがニコニコ動画は面白い。Youtube や Veoh に上がってる動画も面白い。

しかし、動画のファイルサイズは HTML/CSS/JavaScript に比べて大きすぎるためか、 キャッシュプロクシとは本当に相性が悪すぎる。Squid でキャッシュ保存するサイズを大きめに取って対処していたのだが、、、どうも気持ちが悪い。

ニコニコ動画限定だが専用のキャッシュサーバ「NicoProxy2」が出てきている。そのうち、動画専用キャッシュサーバがぼこぼこ出て来るんかいなぁ。

なので、Squid と NicoProxy2 を組み合わせてみた。

ユーザは外部サイトを Squid を通してアクセスする状況で、Squid がニコニコ動画の動画リクエストのみNicoProxy2 に委託するのが目的。

NicoProxy2の立ち上げ

手軽に launchd 経由で立ち上げたいので daemondo が含まれる MacPorts を入れてく。

ソースを取ってきて、適当な場所に置く。

# ls -l /opt/local/etc/nicoproxy/
total 24
-rw-r--r--  1 root  admin   321 Aug  5 16:36 conf.yml
-rw-r--r--  1 root  admin  8062 Aug  5 18:58 nicoproxy.rb

もうこの状態で、conf.yml を弄れば、Proxy として機能すると思う。動作確認したら、launchd 用の定義ファイルとラッパースクリプトを書く。

/opt/local/etc/LaunchDaemons/org.macports.nicoproxy/org.macports.nicoproxy.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Debug</key>
	<false/>
	<key>Label</key>
	<string>org.macports.nicoproxy</string>
	<key>OnDemand</key>
	<false/>
	<key>ProgramArguments</key>
	<array>
		<string>/opt/local/bin/daemondo</string>
		<string>--label=nicoproxy</string>
		<string>--start-cmd</string>
		<string>/opt/local/etc/LaunchDaemons/org.macports.nicoproxy/nicoproxy.wrapper</string>
		<string>start</string>
		<string>;</string>
		<string>--stop-cmd</string>
		<string>/opt/local/etc/LaunchDaemons/org.macports.nicoproxy/nicoproxy.wrapper</string>
		<string>stop</string>
		<string>;</string>
		<string>--restart-cmd</string>
		<string>/opt/local/etc/LaunchDaemons/org.macports.nicoproxy/nicoproxy.wrapper</string>
		<string>restart</string>
		<string>;</string>
		<string>--pid=none</string>
	</array>
	<key>RunAtLoad</key>
	<false/>
</dict>
</plist>

/opt/local/etc/LaunchDaemons/org.macports.nicoproxy/nicoproxy.wrapper

#!/bin/sh

prefix=/opt/local
pidfile=/opt/local/var/run/nicoproxy.pid

Start()
{
	cd /opt/local/etc/nicoproxy
	ruby ./nicoproxy.rb &
	echo $! > $pidfile
}

Stop()
{
	kill `cat $pidfile`
}

Restart()
{
	Stop
	Start
}

Run()
{
case $1 in
  start  ) Start   ;;
  stop   ) Stop    ;;
  restart) Restart ;;
  *      ) echo "$0: unknown argument: $1";;
esac
}

Run $1

launchd に登録すれば、再起動しても自動的に上がってくれる筈?

# launchctl load -w /opt/local/etc/LaunchDaemons/org.macports.nicoproxy/org.macports.nicoproxy.plist
...
# launchctl list | grep nicoproxy    
62595	-	org.macports.nicoproxy
...
# ln -s /opt/local/etc/LaunchDaemons/org.macports.nicoproxy/org.macports.nicoproxy.plist /Library/LaunchDaemons/

まぁ、MacPorts に含まれていないのに、org.macports.XXXX なのは愛嬌ってことで。

Squid と連携する

Squid は、MacPorts のものを入れ、取り敢えず動かせる所まではやっておく。NicoProxy2 連携用に、次の設定を加える。但し、例では NicoProxy2 のポートは 25255に変えてあり、自身のホストがCNAMEとか追加して nicoproxy.example.com で引けるようになっているので、各自の環境に合わせる必要がある。

squid.conf

...
# nico proxy
acl nico url_regex -i ^http://www\.nicovideo\.jp/api/getflv/?
acl nico url_regex -i ^http://.*\.nicovideo\.jp/smile\?
cache_peer nicoproxy.example.com. parent 25255 0 proxy-only no-query
cache_peer_access nicoproxy.example.com. allow nico
never_direct allow nico

まとめ

NicoProxy2はon-the-flyでは転送しないのかぁ。。。


[全文を読む]

2008年8月3日

CentOS 5.2 上で Ruby の環境を整える

CentOS 5.2 の標準では ruby 1.8.5 止まりである。

Ruby を最新バージョンに上げて、RubyGems入れて、Railsも入れるとか、結構、巷で行われている

まぁ、記念なので、次のサイトを参考にインストールしたら、すんなりできた

RPMforge の追加

公開鍵の取得し、レポジトリのパッケージの確認し、インストールし、デフォルトでは使わない設定をする。

# rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
# wget http://apt.sw.be/redhat/el5/en/i386/RPMS.dag/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
# rpm -K rpmforge-release-0.3.6-1.el5.rf.i386.rpm
rpmforge-release-0.3.6-1.el5.rf.i386.rpm: (sha1) dsa sha1 md5 gpg OK
# rpm -i rpmforge-release-0.3.6-1.el5.rf.i386.rpm
# sed -ie 's/enabled = [01]/enabled = 0/' /etc/yum.repos.d/rpmforge.repo
# yum --enablerepo=rpmforge list

気持ち ffmpeg や mencoder をインストール出来るようになるってうれしい

# yum --enablerepo=rpmforge install fmpeg mencoder

checkinstall のインストール

tarball からRPMパッケージなどを簡単に作れるようにするものらしい。(1, 2)、、、ちょっとだけいい。

# yum --enablerepo=rpmforge install checkinstall

ruby 1.8.7 のインストール

公式サイトから取得して、つらつらとRPMパッケージに仕立てて、インストールする。バイナリパッケージなので、依存するライブラリを気をつければ、別の環境にもサクサク移せるとは、いい感じ。

# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p17.tar.bz2
# tar xfj ruby-1.8.7-p17.tar.bz2
# cd ruby-1.8.7-p17
# ./configure --prefix=/usr
...
# make
...
# checkinstall --fstrans=no
...
# rpm -ih /usr/src/redhat/RPMS/i386/ruby-1.8.7-p17-1.i386.rpm 
# ruby -v
ruby 1.8.7 (2008-06-09 patchlevel 17) [i686-linux]

RubyGemsのインストール

公式サイトから取得して、サクッとRPMパッケージに仕立てて、インストールする。

# wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz
# tar xfz rubygems-1.2.0.tgz 
# cd rubygems-1.2.0
# checkinstall -R "ruby setup.rb"
...
# rpm -ih /usr/src/redhat/RPMS/i386/rubygems-1.2.0-1.i386.rpm 
# gem -v
1.2.0

ここまでくると、gem コマンドが使える状態になるので、あとはそいつに任せれば、環境が出来上がる。

# gem install rails

どっかに、CentOS 用の ruby 最新版のレポジトリとか無いのかなぁ。。。

追記(2010-05-18)

2年も経つとURLも変わるらしい。上手く行かない時は次の記事を参考にと。

1.8.7へアップデート死亡遊技 - Rubyの勉強を始めます。 - Rubyist

[全文を読む]

2008年8月1日

Xen on CentOS5 は安定してる

P4P800-VM に CentOS 5.2 をインストールしてみた。インストール時に、パッケージ選択に仮想化をチェックすれば、インストール直後から Xen+Dom0 の環境が素で出来ていた。RHEL から流用しているからか、変に固まること無く本当に安定してる。

但し、2点くらい留意する必要があるっぽい。

  1. CentOS 5.2 のインストールメディアを使う場合、インストール時とカーネルを最新バージョンにするまで irqpoll を付ける必要がある。逆に言えば、yum で最新バージョンにすれば必要ない。つまり、CentOS 5.3 くらいには、過去の事になるんだろうなぁ。
  2. 別途PCIカードに差し込んだ e1000 のアダプタで Wake On Lan が機能しない。これは Xen によるブリッジが放置される問題で、終了処理にブリッジを落とせば問題なく機能する。

Second p0st: Wake on LAN」には debian 向けに書かれているが、これを CentOS 用に変更し、/etc/init.d/xen-bridge-phil に書き落とす。その後、適当なコマンドで登録する。

#!/bin/sh
#
# xen-bridge-phil	Stopping Xen network bridge so WOL will work
#
# Author:       localadmin <localadmin@localhost>
#
# chkconfig: 2345 99 02
# description: Stopping Xen network bridge so WOL will work

# Source function library.
. /etc/rc.d/init.d/functions

RETVAL=0
prog=xen-bridge-phil
ETH=eth0

stop()
{
        /etc/xen/scripts/network-bridge stop > /dev/null 2>&1
        test "x$ETH" != "x" && /sbin/ethtool -s ${ETH} wol g
}

case "$1" in
  start)
	touch /var/lock/subsys/$prog
	;;
  stop)
        echo -n "Stopping Xen network bridge so WOL will work"
        stop
	RETVAL=$?
	if [ $RETVAL -eq 0 ]; then
		rm -f /var/lock/subsys/$prog
		success $"$prog shutdown"
	else
		failure $"$prog shutdown"
	fi
	echo
        ;;
esac

exit 0

登録処理

# chkconfig --add xen-bridge-phil

ついでなのだが、終了時に xend が呼ばれていない気がするので、/etc/init.d/xend の中に適当な位置に

...
start)
...
  touch /var/lock/subsys/xend
...
stop)
...
  rm -f /var/lock/subsys/xend
...

を埋め込む必要があるかもしれん。

追記 (2008/12/10)

某OKWaveの質問サイトにリンクの記載がある。それは良いんだが、ホスト名が異なるだけのコピーが約30サイトもあるのには、ビックリした、、、OKWaveって。。。

大本の質問のやり取りは、「XenでWOLできない?」がそうらしい。

最近のNICのWOLの設定は、電源を完全に落とすと保存されないものが多くなったなぁ。それに、カーネルのバージョンがあがると思い出したようにWOLの不具合が発生するし、みんなIPMPに流れて使っていないのかんなぁ。。。普通のマザボでも載るならよいのに。。。グチグチ

まぁ、ethtool で設定を入れ込むとしたら、/etc/init.d/xen-bridge-phil ファイルのstop()関数の中で、上のようにすればよいかも。

WOL設定って、udev で何とかするのがモダンな解法なのかなぁ。。。良くわからんが。。。。

がんばれ>>RedHat/Fedoraチーム


[全文を読む]

Remote がiTunesから登録を解除される問題の対処法

iPhone/iPod touch アプリに Remote という、iTunes を制御できる優れものアプリがあるらしい。iPod touch のファームを 2.0 に上げて以来試しているが、なぜかiTunesから登録が解除される挙動に悩まされてきた。。。

今日なんと対処法が分かった。。。

どうも4桁のピンコードを入力した後に、折り返しに iTuens から iPod touch へ HTTP アクセスがあって登録が完了するらしい。このとき iTunes が動いてるマシンにプロクシ設定があるとき、折り返しアクセスが HTTPプロクシを通して返され、別のIPアドレスから登録完了の通知なので iPod touch に拒絶されるのが原因らしい。。。あばば

つまり、4桁のピンコード登録時にはiTunes が動いてるマシンのプロクシを一時的に切れば良い。

で登録できましたよ〜〜。。。Remote アプリいいすぅね。。。


[全文を読む]