筆者について
FreeBSDを通じてOSSにささかな貢献を。
- 日本xrdpユーザ会発起人
- xrdp developer
- FreeBSD developer
OSS活動をご支援いただける方を募集しています
2011-04-23 不要な npviewer.bin を殺す
■ ゾンビとなった npviewer.bin を掃除する
FreeBSD で Flash を動かしていると、npviewer.bin プロセスが大量に発生します。
後藤大地さんの記事でこれを掃除するための npviewermonitor というスクリプトが公開されていますが、ここでは別の方法をとります。
npviewer.bin は Firefox から fork して生成されますが、親プロセスである firefox が死んだ後も残ってしまいます。残った npviewer.bin は flashplugin としての役目を果たすことができません。親プロセスが死んだ子プロセスは init に引き取られるため、PPID が 1 であるものを掃除します。
kill $(procstat $(pgrep npviewer.bin) | awk '$2 == 1 { print $1 }')
これを cron で適当な間隔で実行すればよいでしょう。
2011-04-16 ports あれこれ
■ ports の配布ファイルダウンロードを速くする
タイムアウトを指定する
ports からソフトウェアをインストールしていると、ミラーサイトに応答しないものが含まれていて、時間がかかることがあります。 応答のないミラーをさっさと諦めて、次のミラーからのダウンロードを試みるようにするには HTTP_TIMEOUT, FTP_TIMEOUT 環境変数を使用します。
# make HTTP_TIMEOUT=5 FTP_TIMEOUT=5 install
とすると、HTTP/FTPコネクションを確立するまでのタイムアウトが5秒に設定され、5秒待ってもサーバから応答がない場合には次のミラーからのダウンロードを試みます。 これらの変数は fetch コマンドが参照し利用します。タイムアウトはコネクションを確立するまでの時間なので、ファイルサイズが大きくダウンロードに時間がかかるといった場合には影響しません。
国内ミラーを指定する
よく使われるソフトウェアは国内のFreeBSDミラーサイトからもダウンロードできる場合があります。 /etc/make.conf に以下のように書いておくと、最初に国内ミラーからのダウンロードを試みるようになります。
MASTER_SITE_OVERRIDE?=ftp://pub.allbsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/
ここで指定した allbsd.orgとは東京理科大学内に設置されているBSD系OSのミラーで、portsnap や cvsup のミラーも提供されています。
2011-03-18 net/xrdp
■ net/xrdp JP106/109キーボードサポート
先日行った send-pr に関する解説です。
Windows のリモートデスクトップ接続クライアントや rdesktop で接続できる Linux 用ターミナルサーバの xrdp ですが、 FreeBSD ports に収録されているバージョン(xrdp-0.6.0.20101009cvs )は、クライアントが日本語106キーボードでは動作しませんでした。これには2つの原因があります。
- 日本語106/109キーボード用のキーマップが同梱されていない
- キーコードが128以上の入力を受け付けないので、日本語キーマップの有無にかかわらず正常に動作しない
後者の問題にはすでにパッチを書かれている方がいて、既に本家に取り込まれています。日本語109キーボードの場合、アプリケーションキーのキーコードは255、全角/半角キーが252なので、以前の127までのみの対応では不十分だったのですが、前述のパッチで対応されました。
今回 net/xrdp に加えた変更は ports の xrdp のバージョンを現時点で最新のバージョンに追従したことと、日本語キーボード用のキーマップを同時にインストールできるようにしたことの2点です。
問題がなければ FreeBSD の ports tree にコミットされると思いますが、すぐに試したいという方はこちらから。
2011-03-01 FreeBSDでFlashを使う
■ FreeBSD 8.2-RELEASEでFlash10を使う
上の記事を執筆時点の情報に合わせて直しただけのものです。FreeBSDのLinuxエミュレーション機能を利用してLinux版のFlashを動かします。
Linuxエミュレータの用意
Linuxエミュレーション機能を使用するので、カーネルモジュールをロードしておく必要があります。
# kldload linux
起動時に自動的にロードにさせるには、/etc/rc.conf に以下のように記述します。
linux_enable="YES"
Linuxのベースシステムをインストールします。portmasterでもportinstallでもmakeでも好きな方法で。
# cd /usr/ports/emulators/linux_base-f10; make install
flashplugin, nspluginwrapper のインストール
好きな方法でportsからインストール。
# cd /usr/ports/www/linux-f10-flashplugin; make install # cd /usr/ports/www/nspluginwrapper-devel; make install
プラグインをFirefoxに組み込む
$ nspluginwrapper -v -a -i
これでダメな場合は
$ nspluginwrapper -i /usr/local/lib/npapi/linux-f10-flashplugin/libflashplayer.so
とします。
2011-02-11 vimユーザー養成ギプス
■ vimユーザ養成ギプス
vi/vim でカーソルキーを使っちゃうようなニワカはこうだ!
$HOME/.vimrc に以下のように記述しましょう。
noremap <unique> <Up> :<C-U>qall!<CR> noremap! <unique> <Up> <Esc>:qall!<CR> noremap <unique> <Down> :<C-U>qall!<CR> noremap! <unique> <Down> <Esc>:qall!<CR> noremap <unique> <Left> :<C-U>qall!<CR> noremap! <unique> <Left> <Esc>:qall!<CR> noremap <unique> <Right> :<C-U>qall!<CR> noremap! <unique> <Right> <Esc>:qall!<CR>
本当はUNIXカテゴリにしたかったんだけど、FreeBSDとLinuxとUNIXカテゴリがあると使いわけに困るのでまあこれで。
2011-02-08 TwitterDM同報ぼっと
■ TwitterDM同報ぼっと: metadcaster
TwitterのDMを同報送信するスクリプトを作りました。実行にはRuby1.9系が必要です。ダウンロードはこちら。
仲間内での連絡用アカウント(鍵つき)を用意してDMを送る用途を想定しています。
連絡用アカウント (@search) -- @retweets -- @home -- @lists -- @about -- @privacy
連絡用のアカウント @search にDMを送ると、@search をフォローしている @retweets, @home, @lists, @about, @privacy の5人にDMが同報されます。 @search のフォロワー全員にDMが同報されるので @search は鍵つきにしておくことをお薦めします。
使用方法はREADMEに書いています。
初期設定: 以下の2つのファイルを用意してください。
・$HOME/.metabotrc
・./config.rb
初回起動時だけ環境変数 DRY_RUN をセットして実行してください。
受信済みのDMを同報しないように記憶します。
例: $ DRY_RUN=yes ruby19 ./metadcaster.rb
実際の使用の際にはcronなどで定期実行するようにして使用します。
*/5 * * * * /usr/bin/env ruby19 /path/to/metadcaster.rb
== $HOME/.metabotrc: めたぼっとフレームワークの設定ファイル
# OAuth 関連のキーを取得して設定してください。
CONSUMER_KEY = ''
CONSUMER_SECRET = ''
ACCESS_TOKEN = ''
ACCESS_TOKEN_SECRET = ''
== config.rb: 設定ファイル
MY_SCREEN_NAME #=> 自分(同報DMの送信元になるアカウント)の
# スクリーンネームを設定してください。
# MY_SCREEN_NAME = "privacy"
#
EXCLUDE_RECIPIENTS #=> metadcasterはフォロワー全員に同報DMを送信します。
# 同報DMを送信したくないアカウントのスクリーンネームを
# 設定してください。
# EXCLUDE_RECIPIENTS = ["null", "privacy"]
== twstore.yaml: 処理済みDMを記憶しておくファイル
# 存在しなければ自動的に生成されます。
CONSUMER_KEYやACCESS_TOKENの取得方法は以下のページなどを参照してください。
--
追記: ライセンスはGPLv3にします。著作権表示はそのうち差し替えます。
Tue Feb 8 22:41:39 JST 2011
2010-12-20 PortForwarding for radiko.jp
■ radiko.jp を地域外で聴くためのトンネリング (2010年12月のリニューアル rev.2)
12月4日の日記で2010年12月1日に行われたradikoのリニューアルに対応しましたが、対応が不完全でしたので訂正します。
12月1日にリニューアルが行われ、この記事を書いている現在ではradikowを聴くために必要なサーバは以下の2つのようです。前者が主にWebページを配信し、後者が音声ストリームを配信するサーバです。再生中の通信を監視したところ、転送すべきポートは以下のようでした。
- 219.103.34.226 (radiko.jp)
- 80/tcp
- 443/tcp
- 8935/tcp
- 8936/tcp
- 8937/tcp
- 219.103.34.224 (radiko.smartstream.ne.jp)
- 80/tcp
- 1935/tcp
Webブラウザ、radiko_player_air、radikker、ラジ朗など、聴取に利用するアプリによって必要なポートが異なる(全てのポートを転送しなくても聴ける)ようですが、ひとまずこれだけ転送しておけばどの環境でも聴けるようです。
SSH用のシェルスクリプトとipfw用のルールは気が向いたら更新します。
■ radiko SSHポート転送用シェルスクリプト & ipfw 用ルール
いずれも一例です。
SSH用シェルスクリプト
#!/usr/local/bin/bash
if [ `ps xwww|grep radiko_autologin|wc -l` -eq 0 ]; then
echo "Making Radiko Tunnel..."
ssh chiba.example.jp -l user -N -f \
-L10080:219.103.34.226:80 \
-L10443:219.103.34.226:443 \
-L18935:219.103.34.226:8935 \
-L18936:219.103.34.226:8936 \
-L18937:219.103.34.226:8937 \
-L10081:219.103.34.224:80 \
-L21935:219.103.34.224:1935 \
-i /path/to/.ssh/radiko_autologin
else
echo "Radiko Tunnel is alive."
fi
ipfw 用フォワーディングルール
40000 fwd 127.0.0.1,10080 tcp from ${inet}:${imask} to 219.103.34.226 dst-port 80
40000 fwd 127.0.0.1,10443 tcp from ${inet}:${imask} to 219.103.34.226 dst-port 443
40000 fwd 127.0.0.1,18935 tcp from ${inet}:${imask} to 219.103.34.226 dst-port 8935
40000 fwd 127.0.0.1,18936 tcp from ${inet}:${imask} to 219.103.34.226 dst-port 8936
40000 fwd 127.0.0.1,18937 tcp from ${inet}:${imask} to 219.103.34.226 dst-port 8937
40000 fwd 127.0.0.1,10081 tcp from ${inet}:${imask} to 219.103.34.224 dst-port 80
40000 fwd 127.0.0.1,21935 tcp from ${inet}:${imask} to 219.103.34.224 dst-port 1935
2010-12-10 ruby19-iconv
■ lang/ruby19 と converters/ruby-iconv の関係
FreeBSDでTwiProwlなどのruby1.9を必要とするソフトウェアを実行しようとすると、以下のようなエラーが出る場合があります。
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load --
iconv (LoadError)
from <internal:lib/rubygems/custom_require>:29:in `require'
from /usr/local/lib/ruby/1.9/json/common.rb:2:in `<top (required)>'
from <internal:lib/rubygems/custom_require>:29:in `require'
from <internal:lib/rubygems/custom_require>:29:in `require'
from /usr/local/lib/ruby/1.9/json.rb:1:in `<top (required)>'
from <internal:lib/rubygems/custom_require>:29:in `require'
from <internal:lib/rubygems/custom_require>:29:in `require'
from twiprowl:16:in `<main>'
見ての通りiconvのロードに失敗しているだけなので、本来はportsからconverters/ruby-iconvをインストールすればOKなはずです。しかし、単に
cd /usr/ports/converters/ruby-iconv && make install
としたのでは下記のようにruby1.8用のものがインストールされてしまいます。
$ sudo make install ===> License check disabled, port has not defined LICENSE ===> Extracting for ruby18-iconv-1.8.7.302,1 ===> ruby18-iconv-1.8.7.302,1 depends on file: /usr/local/bin/ruby18 - found /bin/mkdir -p /usr/ports/converters/ruby-iconv/work /bin/ln -sf /usr/ports/lang/ruby18/work/iconv /usr/ports/converters/ruby-iconv/work/ ===> Patching for ruby18-iconv-1.8.7.302,1
直接extconfなどを実行してruby1.9用のiconvをインストールしている記事もありますが、これは正攻法ではありません。RUBY_DEFAULT_VER環境変数をセットして以下のようにビルドするのが正解です。
cd /usr/ports/converters/ruby-iconv && make RUBY_DEFAULT_VER=1.9 install
とするとruby1.8用のiconvとruby1.9用のiconvを別々のパッケージとして共存させてインストールすることが可能です。
$ pkg_info| grep iconv | grep ruby ruby18-iconv-1.8.7.302,1 An iconv wrapper class for Ruby ruby19-iconv-1.9.2.0,1 An iconv wrapper class for Ruby
どうしてこうなるのかの秘密は、ruby-iconvのMakefileと8-12行目あたりと、/usr/ports/Mk/bsd.ruby.mkの139-142行目にあります。
これは他の多くの ruby-* というportに対しても有効です。
2010-12-04 PortForwarding for radiko.jp
■ radiko.jp を地域外で聴くためのトンネリング (12月1日のリニューアルに対応)
2010年12月1日のradikoのリニューアルで、フォワーディングの設定変更が必要になりました。
radiko.jp のAレコードが変更になったためです。以前は3つのIPアドレスがDNSラウンドロビンで運用されていました。
;; ANSWER SECTION: radiko.jp. 264 IN A 210.172.41.85 radiko.jp. 264 IN A 210.172.41.88 radiko.jp. 264 IN A 210.172.41.91
12月1日より下記のように変更されています。
;; ANSWER SECTION: radiko.jp. 194 IN A 219.103.34.226
変更点は 210.172.41.80/28 に転送していたパケットの転送先が 219.103.3.226 になった点だけのようです。
これをふまえて、SSHポートフォワーディングのスクリプトは以下のように変更になりました。
--- radiko.sh 2010-12-04 03:37:13.000000000 +0900
+++ radiko.sh.old 2010-12-04 03:32:43.000000000 +0900
@@ -2,9 +2,9 @@
if [ `ps xwww|grep radiko_tunnnel|wc -l` -eq 0 ]; then
echo -n 'Making Radiko Tunnel...'
ssh chiba.example.jp -N -f \
- -L10080:219.103.34.226:80 \
+ -L10080:210.172.41.88:80 \
-L11935:219.103.32.110:1935 \
- -L18935:219.103.34.226:8935 \
+ -L18935:210.172.41.88:8935 \
-i /path/to/.ssh/radiko_tunnel \
&& echo 'OK!'
else
ipfwによるIPフォワーディングの設定例は下記のようになります。
ipfw add 40000 fwd 127.0.0.1,11935 tcp from any to 219.103.32.110 dst-port 1935 ipfw add 40000 fwd 127.0.0.1,10080 tcp from any to 219.103.34.226 dst-port 80 ipfw add 40000 fwd 127.0.0.1,18935 tcp from any to 219.103.34.226 dst-port 8935
以前の radiko.jp 地域外聴取についての記事はこちらです。
2010-10-24 シンクライアント
■ FreeBSDでRDPシンクライアントの作成
FreeBSDでRDPシンクライアントを作成したときのまとめです。
FreeBSDを最小構成でインストール後、X11サーバが使用できる状態にしておきます。
今回はログインマネージャにSLiMを使用します。また、サーバにはRDPで接続するのでrdesktopもインストールします。
# pkg_add -r slim rdesktop
/etc/ttys を下記のように編集します。SLiMの起動方法については/usr/local/etc/rc.d/slim にも解説があります。
-ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure +ttyv8 "/usr/local/bin/slim" xterm on secure
SLiMは大変シンプルなログインマネージャなので $HOME/.xinitrc 以外を参照することはほとんどありません。シンクライアントとして動作させるためには、SLiMからログインしたセッションでrdesktopを自動起動させる必要があります。
rdesktopを起動させるために $HOME/.xinitrc の代わりとなるスクリプトを作成します。下記のファイルを適当な場所に保存します。今回は /usr/local/bin/startrdesktop としました。作成したら実行権を付けておくのを忘れずに。
#!/bin/sh # rdesktop を英字配列、フルスクリーンで起動する。 exec rdesktop -k en-us -f rdp.example.jp
次に /usr/local/etc/slim.conf を変更して、SLiMでログインしたらこのスクリプトが実行されるように変更します。
-login_cmd exec /bin/sh -login ~/.xinitrc %session +login_cmd exec /bin/sh - /usr/local/bin/startrdesktop %session
以上で完成です。init(8)にSIGHUPを送ればSLiMが起動してログイン画面が現れます。SLiMでログインするとRDPクライアントがフルスクリーンで起動しているので、そこからさらにログインすればシンクライアントとして使用することができます。
補足
この設定ではシンクライアントとして使う端末にユーザアカウントが必要です。 rdesktopの起動をrc.localに書くことでユーザアカウントは不要となりますが、サーバやrdesktopをユーザ権限で動かすためにこのような方法を採っています。
実際に運用している環境では、シンクライアント端末のSLiMによる認証をリモートデスクトップ先のアカウントと統合しているので、同じアカウントでSLiMとリモートデスクトップの2回認証することでログイン可能にしています。
SLiMでPAM認証を行うためには /etc/pam.d/slim を適切に設定する必要があります。
Σ Noppi [これは知りませんでした。便利ですなー。]