テキストから MIDI ファイルを作成する

MIDI とスクリプトの勉強を兼ね、テキストから MIDI ファイルを作成してみました

環境

MIDI ファイルを再生できること、また Ruby が動くこと

MIDI データ

  • C コードを 1 回だけ鳴らす
  • SMF(Standard MIDI Files) のフォーマットに従い、テキストで書く
  • cmajor.txt
4D 54 68 64 00 00 00 06 00 00 00 01 00 01 4D 54 72 6B 00 00 00 1C 00 90 3C 40 00 90 40 40 00 90 43 40 04 80 3C 00 00 80 40 00 00 80 43 00 00 FF 2F 00
  • 上だけ見ると訳がわかりませんが、次のような構造です
4D 54 68 64 # ヘッダ
00 00 00 06 # データ長:6[byte]
00 01       # フォーマット:1
00 01       # トラック数:1
00 01       # 1 拍の分解能:1

4D 54 72 6B # トラック 1 開始
00 00 00 1C # データ長: 28[byte]
00 90 3C 40 # 0拍後, オン:ch0, key:3C(ド), vel:40
00 90 40 40 # 0拍後, オン:ch0, key:40(ミ), vel:40
00 90 43 40 # 0拍後, オン:ch0, key:43(ソ), vel:40
04 80 3C 00 # 4拍後, オフ:ch0, key:3C
00 80 40 00 # 0拍後, オフ:ch0, key:40
00 80 43 00 # 0拍後, オフ:ch0, key:43
00 FF 2F 00 # トラック 1 終了

しかし

  • 実際の MIDI ファイルはバイナリです
  • 一方、作成した cmajor.txt はテキストのため、このままでは Windows Media Player 等で再生することができません
  • このため、cmajor.txt に記載したデータをバイナリ化します

テキストの 16 進数をバイナリ表示するスクリプト

  • txt_to_bin.rb
 #!/usr/bin/ruby
 
 array = []
 
 filename = ARGV[0]
 file = open( filename )
 text = file.read
 file.close
 
 array << text.split.join
 binary = array.pack( "H*" )
 
 print binary

バイナリ化したデータを cmajor.midi へ書き込み

 ruby txt_to_bin.rb cmajor.txt > cmajor.midi

新規作成された cmajor.midiWindows Media Player 等で再生すると、C のコードが 1 回鳴るはずです

参考

switch-monitor で datapath_id が表示されない

とりあえず直りました。@chibacchie ありがとう!

事象

  • trema examples の switch_monitor を実行するが、datapath_id が表示されない
  • OS を再起動しても再現する
$ sudo trema run switch-monitor.rb -c switch-monitor.conf 
All switches = 
All switches = 
All switches = 
All switches = 

機材

$ uname -a
Linux dev01 3.5.0-28-generic #48~precise1-Ubuntu SMP Wed Apr 24 21:42:24 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
$ trema version
trema version 0.3.19
$ 

switch_monitor プログラムとコンフィグ

アドバイス@chibacchie

  • "trema killall" してみる
  • $TREMA_HOME/tmp/pid か $TREMA_TMP/pid に pid ファイル残ってないか確認して、残ってたら当該プロセス殺すとか
  • "killall switch" とかで switch daemon 皆殺ししてみるとか

実行

再起動後、trema run するが、datapath_id が表示されない

$ sudo trema run switch-monitor.rb -c switch-monitor.conf 
All switches = 
All switches = 
All switches = 
All switches = 

killall switch, trema killall 後、再度 trema run するが、datapath_id 表示されない

$ sudo killall switch
switch: no process found
$ ps aux | egrep 'trema|swi'
root      1043  2.0  7.7 190780 78548 tty7     Ss+  00:35   0:20 /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none
root      3032  0.0  0.0   9140   860 ?        Ss   00:45   0:00 /var/lib/gems/1.8/gems/trema-0.3.19/objects/openvswitch/bin/ovs-openflowd --detach --out-of-band --fail=closed --inactivity-probe=180 --rate-limit=40000 --burst-limit=20000 --pidfile=/var/lib/gems/1.8/gems/trema-0.3.19/tmp/pid/open_vswitch.0x1.pid --verbose=ANY:file:dbg --verbose=ANY:console:err --log-file=/var/lib/gems/1.8/gems/trema-0.3.19/tmp/log/openflowd.0x1.log --datapath-id=0000000000000001 --unixctl=/var/lib/gems/1.8/gems/trema-0.3.19/tmp/sock/ovs-openflowd.0x1.ctl netdev@vsw_0x1 tcp:127.0.0.1:6633
root      3037  0.0  0.0   9140   868 ?        Ss   00:45   0:00 /var/lib/gems/1.8/gems/trema-0.3.19/objects/openvswitch/bin/ovs-openflowd --detach --out-of-band --fail=closed --inactivity-probe=180 --rate-limit=40000 --burst-limit=20000 --pidfile=/var/lib/gems/1.8/gems/trema-0.3.19/tmp/pid/open_vswitch.0x2.pid --verbose=ANY:file:dbg --verbose=ANY:console:err --log-file=/var/lib/gems/1.8/gems/trema-0.3.19/tmp/log/openflowd.0x2.log --datapath-id=0000000000000002 --unixctl=/var/lib/gems/1.8/gems/trema-0.3.19/tmp/sock/ovs-openflowd.0x2.ctl netdev@vsw_0x2 tcp:127.0.0.1:6633
root      3042  0.0  0.0   9140   868 ?        Ss   00:45   0:00 /var/lib/gems/1.8/gems/trema-0.3.19/objects/openvswitch/bin/ovs-openflowd --detach --out-of-band --fail=closed --inactivity-probe=180 --rate-limit=40000 --burst-limit=20000 --pidfile=/var/lib/gems/1.8/gems/trema-0.3.19/tmp/pid/open_vswitch.0x3.pid --verbose=ANY:file:dbg --verbose=ANY:console:err --log-file=/var/lib/gems/1.8/gems/trema-0.3.19/tmp/log/openflowd.0x3.log --datapath-id=0000000000000003 --unixctl=/var/lib/gems/1.8/gems/trema-0.3.19/tmp/sock/ovs-openflowd.0x3.ctl netdev@vsw_0x3 tcp:127.0.0.1:6633
tetchi    3065  0.0  0.0  14556   908 pts/1    S+   00:51   0:00 egrep --color=auto trema|swi
$ sudo trema killall
$ ps aux | egrep 'trema|swi'
root      1043  2.0  7.7 190780 78548 tty7     Ss+  00:35   0:20 /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none
tetchi    3115  0.0  0.0  14556   908 pts/1    S+   00:52   0:00 egrep --color=auto trema|swi
$ sudo trema run switch-monitor.rb -c switch-monitor.conf
All switches = 
All switches = 
All switches = 
^C
terminated

terminated
error: exit
$ 

復旧!

  • $TREMA_HOME/tmp/pid/*.pid を別ディレクトリに移動したところ復旧
$ cd /var/lib/gems/1.8/gems/trema-0.3.19/
$ cd tmp/
$ cd pid/
$ ls
LearningSwitch.pid  open_vswitch.lsw.pid  phost.host1.pid  phost.host2.pid  switch.0xabc.pid  switch_manager.pid  tremashark.pid
$ mkdir org
$ mv *.pid org
$ ls
org
$ sudo trema run switch-monitor.rb -c switch-monitor.conf 
Switch 0x1 is UP
Switch 0x2 is UP
Switch 0x3 is UP
All switches = 0x1, 0x2, 0x3
All switches = 0x1, 0x2, 0x3
^C
terminated

terminated
$ 

考察・課題

  • 何で直ったのかは別途確認
  • 事象が発生する直前に learning-switch と TremaShark で遊んでいたので、これらが関係していると思われる
  • Trema 本の TremaShark の解説が理解できないので要勉強。何かわかるかも
    • イベントコレクタ、USR2 シグナル、IPC イベント等

追記 2013/05/18

  • trema run 前は $TREMA_HOME/tmp/pid の中に pid ファイルがないのが正常と思われる
  • 各 pid ファイルは vswitch や vhost の起動時に作成され、終了時に削除される
  • pid ファイルには起動中の vswitch や vhost の pid が記載される
    • 各プロセスの pid は ps コマンドで確認できる
  • trema run 中に pid ファイルを削除すると、trema kill をしても起動中の各プロセスは終了しない
    • このとき、vswitch や vhost は手動で kill する
  • learning-switch や TremaShark と dpid が見えなくなった事象は恐らく関係ない
    • trema run したまま、ノート PC のハイバネーション失敗 > 再起動 > pid ファイル残ってる、みたいなことがあったのではないか、と
  • IPC(Inter Process Communication)、プロセス間通信
  • USR2 シグナルはまだ調べてない

KVM - VM 間スループット

Celeron G530 機上の KVM と VM でどの程度通信スループットが出るのか試してみました。

結果

  • 9Gbps 超: KVM-VM 間
  • 4Gbps 超: 同一 KVM 上の VM-VM 間

------"GbE の壁"------

  • 900Mbps 未満: KVM

構成

ゲストもホストも Ubuntu 12.04LTS

  • 参考にしたインストール記事へのリンクを本文の一番最後に添付
----------------------+
<iperf1><iperf2> # vm |
 |.7     |.11         |
 | +-----+            |
(br0).4          kvm01|
[eth0]----------------+
 |
GbE 10.5.255.0/16
 |
[eth0]----------------+
(br0).5               |
 |                    |
 |.12                 |
<iperf3> # vm    kvm02|
----------------------+

kvm01 と kvm02 は CPU、マザー、メモリ、電源、SSD 全て同じ構成

kvm01$ cat /proc/cpuinfo |grep CPU
model name      : Intel(R) Celeron(R) CPU G530 @ 2.40GHz
model name      : Intel(R) Celeron(R) CPU G530 @ 2.40GHz
kvm02$ cat /proc/cpuinfo |grep CPU
model name      : Intel(R) Celeron(R) CPU G530 @ 2.40GHz
model name      : Intel(R) Celeron(R) CPU G530 @ 2.40GHz

測定

異なる KVM 上の VM 間通信

iperf1 > iperf3 : 875Mbps

iperf1:~$ iperf -c 10.5.255.12
------------------------------------------------------------
Client connecting to 10.5.255.12, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 10.5.255.7 port 58488 connected with 10.5.255.12 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.02 GBytes   875 Mbits/sec
iperf1:~$ iperf -c 10.5.255.12
------------------------------------------------------------
Client connecting to 10.5.255.12, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 10.5.255.7 port 58489 connected with 10.5.255.12 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.02 GBytes   875 Mbits/sec
iperf1:~$ iperf -c 10.5.255.12
------------------------------------------------------------
Client connecting to 10.5.255.12, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 10.5.255.7 port 58490 connected with 10.5.255.12 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.02 GBytes   875 Mbits/sec
iperf1:~$

kvm01 上の VM 間通信

iperf1 > iperf2 : 4.6Gbps 前後

iperf1:~$ iperf -c 10.5.255.11
------------------------------------------------------------
Client connecting to 10.5.255.11, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 10.5.255.7 port 58255 connected with 10.5.255.11 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  5.41 GBytes  4.64 Gbits/sec
iperf1:~$ iperf -c 10.5.255.11
------------------------------------------------------------
Client connecting to 10.5.255.11, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 10.5.255.7 port 58256 connected with 10.5.255.11 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  5.39 GBytes  4.63 Gbits/sec
iperf1:~$ iperf -c 10.5.255.11
------------------------------------------------------------
Client connecting to 10.5.255.11, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 10.5.255.7 port 58257 connected with 10.5.255.11 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  5.29 GBytes  4.54 Gbits/sec
iperf1:~$

kvm01 上の KVM - VM 間通信

iperf1 > kvm01 : 9Gbps 超

iperf1:~$ iperf -c 10.5.255.4
------------------------------------------------------------
Client connecting to 10.5.255.4, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 10.5.255.7 port 43187 connected with 10.5.255.4 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  10.8 GBytes  9.25 Gbits/sec
iperf1:~$ iperf -c 10.5.255.4
------------------------------------------------------------
Client connecting to 10.5.255.4, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 10.5.255.7 port 43188 connected with 10.5.255.4 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  10.8 GBytes  9.27 Gbits/sec
atom@iperf1:~$ iperf -c 10.5.255.4
------------------------------------------------------------
Client connecting to 10.5.255.4, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 10.5.255.7 port 43189 connected with 10.5.255.4 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  10.8 GBytes  9.26 Gbits/sec
iperf1:~$

おまけ

kvm01 > kvm01 : 37Gbps

kvm01:~# iperf -c 10.5.255.4
------------------------------------------------------------
Client connecting to 10.5.255.4, TCP port 5001
TCP window size:  169 KByte (default)
------------------------------------------------------------
[  3] local 10.5.255.4 port 50566 connected with 10.5.255.4 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  43.4 GBytes  37.3 Gbits/sec
kvm01:~# iperf -c 10.5.255.4
------------------------------------------------------------
Client connecting to 10.5.255.4, TCP port 5001
TCP window size:  169 KByte (default)
------------------------------------------------------------
[  3] local 10.5.255.4 port 50567 connected with 10.5.255.4 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  43.2 GBytes  37.1 Gbits/sec
kvm01:~# iperf -c 10.5.255.4
------------------------------------------------------------
Client connecting to 10.5.255.4, TCP port 5001
TCP window size:  169 KByte (default)
------------------------------------------------------------
[  3] local 10.5.255.4 port 50568 connected with 10.5.255.4 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  42.1 GBytes  36.2 Gbits/sec
kvm01:~#

対ローカルホストはさておき、KVM-VM 間のスループットは VM 間の倍速いぞと。

参考

もし 12.04LTS にこだわりがなければ、12.10 版の記事が 1NIC 構成かつコピペでセットアップできるのでオススメ

Let's note SX1 CF-SX1GE メモリ 16GB 化

以下、自己責任で!

経緯

  • 検証用に軽くてメモリをモリモリ積めるノート PC がほしかった

追加メモリ

UMAX Castor DCSoD3-16GB-1333 (8GB×2 計16GB) ノート用 SO-DIMM DDR3-1333

手順

  • DVD 蓋空けてネジ 4 本抜く。但し一番手前左のネジは抜かないこと
  • 本体裏のネジを片っ端から抜く
    • メモリ、CPU FAN の蓋は取らなくていい。SD カードスロット裏のフタは SD カード側のネジだけ外せばオケ
  • バッテリ左右の足のネジ 1 本づつ抜く。そして足を外すとその中にもネジが 1 本づつあるので抜く
  • バッテリに隠れている本体側の封を剥すとネジが 1 本現れるので抜く
  • ここで画面をフルオープンにすると筐体上半分を外せるはず。左パームレスト下にフレキがあるので慎重に。力は一切不要
  • 現れた標準メモリを 8GB に交換。保護シールは剥がす
  • もう 1 本の 8GB を本体底面の空きスロットに装着して完了

以上、自己責任で!

すべてのウィンドウを結合

不便に思いながら放置してたけど本日わかっちゃったこと

これがー
f:id:tetchitakkun:20120426203358p:plain

こうなる!
f:id:tetchitakkun:20120426203741p:plain

今までは面倒になったらCtrl+Wを連打してました

環境

Windows7
Safari 5.1.2(7534.52.7)

VirtualBoxの仮想マシンでPXEブート

ハマりポイントが2点

  • サーバ: ネットワークがNATでは動かない?10.0.2.4の何かがクライアントに応答している
  • クライアント: PCnet-FastⅢ以外のアダプタでブートしなかった

PCnet-FastⅢとプライベートネットワークを選択したところ動作した。
あとはiptablesとファイルのパスの記述に気をつければ大丈夫かと。

環境

  • VirtualBox 4.1.8 r75467(on Windows 7 Professional SP1)
  • CentOS6.2(CentOS-6.2-x86_64-minimal.iso)