2011年4月28日木曜日

簡単な処理で、滑らかに信号を補間(内挿)したいとき。



世の中にはスプラインだとか色々あるんだけれども、実装が楽で滑らかに繋がる方法を見つけたのでメモ。


式の導出はhttp://www.empitsu.com/pdf/sgd.20080718.pdf に譲るとして、結論のみメモ


データがa,b,c,d,・・・・とあった時



(-a+9b+c9-d)/16



がbとcの間にある点の値です。同様に一ずつずらして計算していけば、cとdの間dとeの間・・・・と求まります。これで2倍のサンプリング点数に補間できます。


16倍はシフトで実装できますし、9倍も8倍+1と言う風に分解すればシフトと加算で実装できます。なので古いマイコンにやさしい実装ができます。


同様の処理を2回かければ4倍アップサンプリングもOKっす。


追記:16倍アップサンプリング例


16倍アップサンプリング例をおいておきますね。


https://picasaweb.google.com/lh/photo/fQMfMkMIUqsiwTFVudy8Kw?feat=directlink





2011年3月4日金曜日

FreeBSD on VirtualBoxで帯域制限ツールを作る。



基本的にはイベント会場で臨時に使う事を考えてます。


具体的には、会場にネットを解放しているけれどもネット中継もやりたい。


ネット中継がカクカクするのは困るので、一般側の回線は帯域をしぼりたい。


という時に使います。


で、既存ネットワークの設定をできるだけいじらずに導入する事を目的にしてます。


なので、PCにUSB等のNICを最大4つさして、ひとつをUplinkポートにして残りの3つが帯域制限が掛かっているポートになるハブを作ります。


PC自体にはIP振っても振らなくてもOKっす。


前準備


私はとりあえずVirtualBoxをMacBookにいれて、USB NICを2つ繋ぎました。


USB-NICが帯域制限つきポートになるので、変なパケットをださないように、Mac側でIPアドレスを「切」に設定してます。


windowsでいえば、ネットワークのプロパティでTCP/IPのチェックボックスをはずすような状態です。


でFreeBSDの仮想イメージはすでにもってるのでそれ使いました(8.2 RC2)


Virtualbox設定


VirtualBoxのネットワークの設定は、全てブリッジで接続です。


一つ目のインターフェイスをUPlinkのポートを設定して、それ以外を帯域制限つきポートにします。


FreeBSDの設定


/etc/rc.confファイル:



cloned_interfaces="bridge0"


#4つのNICをbridge0で繋ぎます。


#仮に3つしかなくても、同じ設定でちゃんと動きます


ifconfig_bridge0="addm em0 addm em1 addm em2 addm em3 up"


ifconfig_em0="up"


ifconfig_em1="up"


ifconfig_em2="up"


ifconfig_em3="up"


dummynet_enable="YES"


firewall_enable="YES"


firewall_type="/etc/ipfw.conf"



/etc/sysctl.confファイル:



net.link.bridge.ipfw=1



/etc/ipfw.confファイル(新規作成):



pipe 1 config bw 100Kbit/s #デフォルトの帯域制限量を書いておきます


pipe 2 config bw 100Kbit/s


pipe 3 config bw 100Kbit/s


add pipe 1 ip from any to any xmit em1 out bridged


add pipe 1 ip from any to any recv em1 out bridged


add pipe 2 ip from any to any xmit em2 out bridged


add pipe 2 ip from any to any recv em2 out bridged


add pipe 3 ip from any to any xmit em3 out bridged


add pipe 3 ip from any to any recv em3 out bridged


allow ip from any to any



以上を書いて再起動すると帯域制限つきHUBになっています。


帯域制限を変更するとき


em1=(VirtualBoxで2番目のNIC)の帯域を変更するときは以下のようにします。


同様にpipeの後の数字を変更すればem2,em3も変更できます。



ipfw pipe 1 config bw 100Kbit/s



障害発生時


VirtualBox上で運用している場合、例えばあるPCをem2からem3につなぎ替えたりすると通信できなくなってしまいます。(2011/3/4現在)


そういう障害が起きたときは以下のようにしてそれぞれのポートを初期化します。



ifconfig em1 down


ifconfig em1 up


ifconfig em2 down


ifconfig em2 up


ifconfig em3 down


ifconfig em3 up



ふつうUpLinkがわでそのようなつなぎ替えをすることはないのでem0はする必要はほぼないでしょう。





P.S.


暇見てもシェルスクリプトも整備して、仮想イメージ公開してもいいかもね・・・需要があれば





2011年3月3日木曜日

VirtualBoxのNICをpromiscにするときの注意@MacOSX



たとえば複数のNICをbridge接続するとき等NICをpromiscモードにするんだけど、


ホスト環境であるMacOS側が自動でpromiscモードになってくれない。


普通は



ifconfig en0 promisc



とでもやればいいのだろうが。あいにくMacOSXでは当該昨日が削除されている。ほんのわずかネットが重くなるが



tcpdump -i en0 icmp



で代用して、ホスト環境をporomiscモードにしてあげればちゃんとゲストの中でブリッジする事ができる。





ちなみに、なんでこんなのをやっているかというと、USBのNICを2枚さして、LANケーブルの間に挟めば透過的に帯域制限ができるっていうのを作りたくてやってみた。


もちろん、BootCampでPC-UNIXをいれれば一発解決なのだが、それだとPC-UNIXが起動しているあいだMacがつかえなくてしょぼーんとなるので、VirtualBoxでがんばってみた。





というのは全くの嘘でした!



普通につかえます。ただ、NICを複数用意していて途中でケーブルの入れ替えなどを行うと、VirtualBox側のブリッジが混乱して変に通信できなくなるっぽい。


ちょっとこれはしらべないとわからなぁ。。。


とりあえずの対応方法


LANケーブルの差し替えなど通信不能になったときは、



ifconfig em0 down


ifconfig em0 up



をLANの入れ替えなどをおこなったインターフェイスにたいして行えば復活する





2011年2月8日火曜日

メモ: GEOM journalの0fill



virtualboxのディスクイメージちっちゃくするぞ作戦で、gjournalについては調査が手つかずだった。


とりあえずソースを読んでわかったこと。



gjournal dump /dev/ada1s1a



とやってflagが1の時はjournalがsyncさておりCLEANな状態。


この状態で且つ、ジャーナルのワーカースレッドが起動する前ならジャーナルディスクを吹っ飛ばしても大丈夫。


つまり、マウントしてない状態で、flagが1で有ることを確認した後、jstartからjend(byte単位)を0fillしてもOKなはず。


今日はもう眠くて作業するのは危険なので、計画のメモのみ。


追記


とりあえず前回書き忘れてた事として、最後の1セクタはメタデータがあるから書き込まないように注意しなきゃです。oseekだけ設定してうしろ消さないように。ちゃんとcount指定が必要なはず。


で、実験した結果消した後にマウントするのはOKなのだが、ルートパーティションにしている場合は最初の一回のみルートパーティションみつからなくて転ける。


もう一回再起動すればちゃんと起動する。もしくは0fill 作業後にgeom_journalをloadして一度読み込ませれば正常に起動します。


とりあえずは0fill作業としてはうまくいくけど、ちょっと気持ちわるい。





2011年2月6日日曜日

FreeBSD on Virtualbox のVDIを小さくする



やることは以下のコマンドを実行するだけなのだが、



VBoxManage modifyhd hogehoge.vdi --compact



その前準備として出来るだけ全てのセクタを0で埋めた方がよい。ググってみると、



init 1 #シングルユーザモードに切り替え


cat /dev/zero >o



として0でうめたファイルを作ってから削除するのが主流らしい。


確かに手っ取り早く、実践的なのだが、より完璧を目指すならちゃんとファイルシステムの空きブロックを一つ一つ消したい。(手元の実験では0.15%程度の空きブロックが0fillされていなかった)


と言うことでそんなツールを作ってみた。


http://syunei.dip.jp/~akira/deldfree.tar.gz



make #コンパイル


./deldfree /dev/ada1s1a #コールドランで、状況チェックだけ


./deldfree /dev/ada1s1a -f #実際に処理するときは最後に-fをつける



ただ、このツールはマウントされていないファイルシステムにしか実行できないので


現実的には、作業用の仮想環境があって、そこに処理対象のHDDを追加で繋いでやるのが楽だとは思う。そこでそんなVirtualbox用イメージも作ってみた


http://saifes.dip.jp/~akira/freebsd_rescue.ova


パスワード無しでrootでログインして使う。/root/deldfree/以下に当該ツールがはいっているので、それを対象のディスクにかけてやればいい。





補足


かなり趣味に走ったツールです。0.15%をけちるよりは、作業の楽さをとったほうが一般には良いとおもいますよ。多分。


あとswapパーティションの0 fillも忘れずに。


補足2:高速化のためには?


わざわざ最初に読み込んで0かどうかチェックしてますが、これはどれくらい減ったか確認できるようにするためだけです。多分空きブロックに何が書いてあろうが問答無用で0fillするほうが速いです。





2011年2月2日水曜日

FreeBSDをVirtualBoxでキビキビ使う with geom journal



VirtualBoxを使っていて、一番気になるのはディスクアクセスだと思う。


体感的にものすごく効いてくる。


とりあえず,FreeBSDで一番高速なファイルシステムはgeom journal(gjournal)らしいので、それを使うべく、設定してみた。


普通はPC-BSDのインストーラを使えばいいらしいが、そのために4Gもダウンロードするのは面倒なので、FreeBSDのインストーラのみでがんばってみた。結論から言うと2回FreeBSDをインストールする事になる。


一回目のインストール


本番HDDと一回目の踏み台に使う踏み台HDDを繋いだ状態で、一回目のインストールを行う。(VirtualBoxの設定でHDDコントローラをSATAにするのを忘れずに。)


一回目のインストールで本番HDDのFdisk/Label作業も行って良いが、一つ注意点がある。gjournalはそれなりにでかいパーティーションじゃないと意味がない。従って、デフォルトのように細切れに切るのではなく、今回はswapパーティションと/パーティションのみにする事にした。とりあえず本番HDDは/honbanに仮にマウントしておく。


一回目の起動:ファイルシステム初期化


ここでHDDの状況は以下の通りだとする



ada0s1a 踏み台HDDの/パーティション


ada0s1b 踏み台HDDのswapパーティション


ada1s1a 本番HDDの/パーティション


ada1s1b 本番HDDのswapパーティション



まずは作業するためにアンマウントする。



swapoff /dev/ad1s1b


umount /honban



geom journalを起動



gjournal load



本番HDDのファイルシステムをジャーナル化してフォーマットする



gjournal label -f /dev/ada1s1a


#ここで/dev/ada1s1a.journalだとか/dev/ufsid/[英数字].journalができる


newfs -J -O 2 -L root /dev/ada1s1a.journal #(/dev/ufsid以下に対して行ってもよい)



ここで-Lでラベルをつけているのがミソ、設定が書きやすくなるのでお勧め。


ついでにswapにもラベルをつけてあげる



glabel label swap /dev/ada1s1b



一回目の起動:OSインストール


必要なファイルをインストールするため、再びマウントしてあげる。



mount /dev/ufs/root /honban



インストールはsysinstallを使うが「Option」でインストール先ディレクトリとして「/honban」を指定するのを忘れないように。


インストールはCustom->DistributionやConfigure->Distributionから行う。


/honban/etcの変更


インストール後は/etc/や/boot/以下の設定を行う必要がある。/etcは踏み台HDDの内容をコピーして、fstabを書き換えれば良い。




  • swapに関してはデバイス名を/dev/label/swapに変更。

  • 「/」に関してはデバイス名を/dev/ufs/root、オプションを「rw,noatime,async」に変更。


/honban/bootの変更


カーネルをインストールしただけでは、boot/GENERICというディレクトリ名になっているのでboot/kernelに修正する必要がある。すでに存在しているboot/kernelは空のディレクトリなので消しておく事。(まちがってboot/kernel/GENERICとなると悲しい)


loader.confに以下を足す



ahci_load="YES"


geom_label_load="YES"


geom_journal_load="YES"



二回目の起動


以上の設定がおわったら、インストール完了である。


Virtualboxの設定で、踏み台HDDを取り外して再起動して、見事起動すればOK!