第1回SoftLayer勉強会に参加してきました
第1回SoftLayer勉強会に参加してきました
第1回SoftLayer勉強会が開催されたので参加してきました。
勉強会の告知ページの写真がラウドパークを彷彿とさせる感じだったので、Tシャツにジーンズという風貌で参加したところ、ほとんどの参加者が背広!まるで衣替えの日に一人だけ冬服で登校した中学生のような気分になってしまいました...(クラウド系の勉強会は背広の人が多い傾向があるようです)。
以下は勉強会のメモですが、クラウドまわりの知識に疎いので私の理解に間違いがある可能性にご留意ください。
SoftLayer Introduction
- 発表者は@urasakoさん
- 今回の勉強会の企画を行った方
(まずそもそも)クラウドってなに?
- NIST(アメリカ国立標準技術研究所)が「クラウド」の定義を行っている
-
- SoftLayerはIaaS(Cloud Infrastructure as a Service)を提供する
- 米国、アジア、ヨーロッパ合わせて13のデータセンタがある
- SoftLayerの利用形態
- server
- Bare Metal Server
- 2〜4時間ほどでプロビジョニング可能
- Virtual Server
- Private/PublicなVirtual Serverを構築できる
- Bare Metal Server
- storage
- Object Storage
- OpenStack swiftベースのオブジェクトストレージを持っている
- SAN(Storage Area Network)
- NAS(Network Attached Storage)
- CDN(Contents Delivery Network)
- QuantaStor
- Object Storage
- server
- SoftLayerのWebポータルサイト上で世界中のリージョンが見える
- CDN単独の提供も可能
- Automation & API
- Auto-scaling機構はないけれどAPIで操作できる
SoftLayerに関する日本語の資料について
- "SoftLayer_JPN"でググるとIBMのサイトがヒットする
- が、サイトが重い!
- 資料の閲覧にはIBM-IDが必要
- ゲーム基盤に選ばれているIBM SoftLayer
- "SoftLayer_JPN"でググるとIBMのサイトがヒットする
SoftLayerユーザ会について
- 日本SoftLayerユーザ会(JSLUG)が発足!
- 今後のSoftLayer関連の勉強会、イベント
- SoftLayer勉強会 in Hokkkaido(2014/06/12)
- SoftLayer Night Hands-on
- 2014/06/20
- 2014/06/24
- 2014/07/01(予定)
- 2014/08/01(予定)
- JTF(06/22)で'Hands-on
- 第2回SoftLayer勉強会(2014/07/25)
Email Delivery on Email
- 発表者は@nakansukeさん
- SoftLayerとSendGridの話
SendGridとは
- SoftLayerとSendGridの関係
- SendGridはSoftLayerで動いている
- "Built on SOftLayer,"
- 2011年6月にSoftLayerとSendGridはパートナーに
- SendGridのVP ofProduct&MarketingがもとSoftLayer
- Email Infurastracture as a Service(仮)
- ヘッダを見るとSendGridから来ていることが分かる
- 発表者はSendGridに関わるようになってから、届くメールヘッダを見る癖がついたとのこと
- SoftLayerからメールを送るときは実質SendGrid一択!
- 通数で料金が決まる
- SoftLayerとSendGridの関係
メールについて改めて復習
メールの到達性について
構造計画研究所について
- SendGridの日本代理店
- ブログ、日本語のドキュメントで情報発信している
- 「困ったときは弊社にご相談ください」「無料です!」とのこと
SoftLayer x Bit-isle = ? Bit-isleが提供するハイブリッドクラウドソリューション
発表者は成迫剛志さん
ビットアイル総合研究所
OpenStackに強く(ノウハウがある、という意味で)、所内の一定数の人にはOpenStackの研修を受けてもらっているとのこと
SoftLayerの色
- SoftLayerのデータセンターではラックの配線をキレイに色分けしているという話
- 緑色は管理ネットワーク(1本)
- 青色はプライベートネットワーク(2本)
- 赤はパブリックネットワーク(2本)
- 5本×3種類のネットワーク構成になっている
ラックは最初にきっちり配置し、後から追加・変更しないため、配線がキレイに揃っている
SoftLayerのプライベートネットワーク活用例
- ビットアイルのデータセンターとSoftLayer間のプライベートネットワークの活用例
ビットアイルデータセンター側にDBやioDriveなどの高速IOサーバーを用意し、SoftLayerとはBI Direct Accessで接続することでIOのレイテンシ低減
インターネットを介さない社内LAN/WANとの直接接続
- SoftLayerが提供するインターネットを介さないプライベートネットワークを活用する話
- 国際回線費用の大幅な削減になるとのこと
LT:今さらでも聞きたいSoftLayer network〜VLANとVPNを何とかしたい〜
- 発表者は新島智之さん
- 利用者の観点からのSoftLayerネットワーク構成に関する話
- SoftLayer上に最初のサーバを作成した段階で、パブリック/プライベートVLANが作成される
- IPは利用者側では付けられない
- パブリックVLANには119.x.45.74/29のサブネットが割り当てられる
- プライベートVLANには10.x.158.2/26のサブネットが割り当てられる
- サーバの数が増えてゆくと、自動的にサブネットが追加される
- Portable IPを使うと、VLANで使えるサブネットを追加できる
- 例えば、119.x.63.2/29(パブリックVLAN)、10.x.172.2/26(プライベートVLAN)のようなサブネットを追加できる
- 追加したサブネットはAliasで設定する仕組みのため、別のサーバに移動できる(IPアドレスの割り当てを動的に変更できる)
- VLAN間のルーティング
- VLAN spanningという機能をONにすることで、VLAN間のルーティングが行えるようになる
- 異なるデータセンターのVLAN間もルーティング可能
- 複数VLANとの通信
- Trank portを利用することで、複数のVLANと接続できる
- 最初のVLANはnative VLANとして扱われ、追加したVLANはtag VLANとして扱われる
コマンドラインで始めるSoftLayer
$ curl "https://${SL_USERNAME}:${SL_API_KEY}@api.softlayer.com/rest/v3/SoftLayer_Account.xml?objectMask=fitstName;lastName;id" (以降にXMLが続く)
- PythonによるSoftLayer CLIの話
- コマンド名が"sl"
- 現在のバージョンは3.1.0
- v3.1.0では以下のコマンドが追加されている
- compute
- server(Bare metal servers)
- vs(Virtual Servers)
- networking
- cdn(Content Delibery Network service management)
- storage
- snapshot(iSCSI snapshots)
- general
- ticket(Manage account tickets)
- compute
- v3.1.0では以下のコマンドが追加されている
- PythonにもSoftLayerのAPI Clientが用意されている
- 料金表を生成するサンプル
- https://github.com/ryumei/softlayer-utility/blob/master/sl-vs-prices.sh
- "--test"でdry-run
- その他にもAPIを利用したツール
- Object Storage Uploader
- Configuration Finder
- リファレンス
LT:ベアメタルサーバを作ってみた
- (集中力が途切れてしまってメモを取らずに話を聞くだけになっていました...)
LT: Riak on SoftLayer
- (こちらも話を聞くだけになっていました...)
- 発表者は@monmondawaさん
- 分散データベースriakの話
まとめ
第1回SoftLayer勉強会の参加メモをまとめてみました。SoftLayerって何?という状態で参加していたので、後から自分が読み返しても分かるようにメモをまとめるのが大変でした。初めて参加する勉強会には予習が必要だと痛感しました。SoftLayerは興味を惹かれるので、第2回も参加してみようと思います。
更新履歴
- 「メールの到達性について」の項目で説明と逆の意味にとれる文章になっていたのを修正しました。(5/27)
ご注文はうさぎですか?第7羽からインスパイアを受けてHTML5で「ごちうさパズル」を作ってみた
ご注文はうさぎですか?第7羽からインスパイアを受けてHTML5で「ごちうさパズル」を作ってみた
ごちうさパズル
ご注文はうさぎですか?の第7羽Call Me Sister.のストーリー中で、ココアがパズルを完成させてしまうというエピソードがありました。
このエピソードからインスパイアを受け、「ごちうさパズル」を作ってみました。
あそびかた
選択した分割数(ピースの数)に応じて画像がパズルのピース毎にシャッフルされます。最大で81ピースまで選べるようにしてあります。ごちうさ本編中では4000ピースのパズルだったので、81ピースはだいぶ少ないですが、なかなか没頭できます。
解くのが面倒になった時は"RESET"ボタンを押すとパズルが元に戻ります。
ごちうさパズルの実装
パズルのエピソードを観た時、HTML5で実装できそうだと思い立ったのですが、実装で地味にハマるところが多かったです。
パズルのピースをシャッフルする際の乱数データの取得方法
パズルのピースをシャッフルする際、乱数を使ってデータをシャッフルしています。パズルのピースは重複しないため、値が重複しないように乱数値をあつめる必要があります。かなり昔のI/Oというコンピュータ雑誌に「重複しない乱数列を得る方法」的な投稿コラムがあったのですが、当時はその原理を理解できませんでした。
が、実際には難しい話ではなく、以下の方法で実現できます。
- あらかじめ配列に値を入れておく(等差数列でOK)
- 乱数の値を取得し、配列のインデックスとする(乱数の範囲は0〜(配列のサイズ-1))
- インデックスが指す値を配列の末尾の値と入れ替える
- 乱数の範囲を1減らす
- 乱数の範囲が0より大きい間、処理を繰り返す
JavaScriptによるサンプルは以下のようになります。
var value_list = new Array(10000); // あらかじめ配列に値を入れておく for (var i = 0; i < value_list.length; i++) { value_list[i] = i; } var range = value_list.length - 1; do { // 乱数の値を取得し、配列のインデックスとする var index = ~~(Math.random() * range); // インデックスが指す値を配列の末尾の値と入れ替える var tmp = value_list[index]; value_list[index] = value_list[range]; value_list[range] = tmp; // 乱数の範囲を減らす range--; } while (0 < range); // 乱数の範囲が0より大きい間、処理を繰り返す for (var i = 0; i < value_list.length; i++) { console.log(value_list[i]); }
上記のサンプルを試してみます。配列の中身を一行毎出力しており、単に行数をカウントした値とsort,uniqで重複する値を除去した行数の値が同じであることから、重複しない値であることが分かります。動作環境はNetBSD-6.1-i386です。
$ node sample.js | wc -l 10000 $ node sample.js | sort | uniq | wc -l 10000
値もシャッフルされています。
$ node sample.js | head 2537 6218 7624 7580 692 4295 2508 6329 1150 4781
Pemtium M 1GHz,データの件数1万件の場合で0.4秒程度の処理時間です。
$ time (node sample.js 2>&1 > /dev/null) real 0m0.499s user 0m0.462s sys 0m0.020s $ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 9 model name : Intel(R) Pentium(R) M processor 1000MHz stepping : 5 cpu MHz : 996.80 fdiv_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr mce cx8 apic sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 tm
参考までに、取得した乱数値が重複していないか逐一確認する処理方法の場合と比較してみます。30秒程度かかっており、こちらはオススメできない方法となっています。
$ cat sample-bad.js var value_list = new Array(10000); for (var i = 0; i < value_list.length; i++) { var index; // 配列の値が初期値(-1)でない間繰り返す do { // 乱数の値を取得し、配列のインデックスとする index = ~~(Math.random() * value_list.length); } while (value_list.indexOf(index) != -1); value_list[i] = index; } for (var i = 0; i < value_list.length; i++) { console.log(value_list[i]); } $ time (node sample-bad.js 2>&1 > /dev/null) real 0m31.960s user 0m30.481s sys 0m0.040s
HTML5 Canvasと画像サイズの関係
ごちうさパズルではピースの数を選択できるようにしています。そのため、画像の幅・高さと1ピースあたりの幅・高さが割りきれないことがあり、ピースを並べて行った結果、Canvasや画像のサイズをわずかにはみ出してしまうことがあります。
今回のケースで考えると、画像サイズは600x600で、パズルのピースはNxNとしており、49pcs(7x7)と81pcs(9x9)の場合に幅・高さが割りきれない値になります。当初、単純に四捨五入(Math.round())する方法をとったのですが、Firefoxでは動作するもSafariではおかしなピースが描画されるという、ブラウザの挙動の違いにハマってしまいました。
$ node > 600/2 300 > 600/3 200 > 600/4 150 > 600/5 120 > 600/6 100 > 600/7 85.71428571428571 > 600/8 75 > 600/9 66.66666666666667
結果、割りきれないケースの場合は、扱う画像の範囲を少し小さく扱うことで対応しました。
> 600/9 66.66666666666667 > 66*9 594 /* 594pxを画像の幅・高さとする */
Canvas.strokeStyle()の設定
これは私がCanvasの仕様を把握できていなかっただけなのですが、Canvas.strokeStyle()などでストロークの色を変更すると、既に描画したストロークの色も一緒に変更されるようです(Firefoxでしか確認してないので、他のブラウザだと違うかもしれません)。描画したデータについても、内部的には状態を保持しているようです。
まとめ
ご注文はうさぎですか?第7羽のエピソードを元に「ごちうさパズル」を作ってみました。HTML Canvasまわりではブラウザ毎の挙動の微妙な違いにハマってしまいました。Canvasまわりは私の理解が追いついていないところもあり、もう少し調べてみようと思います。
pmml(MMLコンパイラ)によるMIDIファイル生成環境を構築してみた
pmml(MMLコンパイラ)によるMIDIファイル生成環境を構築してみた
ポケットミクちゃん本を読む会(その2)で使用するMIDIファイルを用意しておきたいと考え、MIDIファイルの生成環境を構築してみました。
以前開催した、やはり俺の耳コピはまちがっている。(その1) ゆるゆに-ゆるいUNIX勉強会-#6でもMIDIファイル生成環境の構築を行ったりしましたが、改めて備忘録として手順をまとめておこうと思います。
構築するMIDIファイル生成環境について
NetBSD-6.1-i386上に、pmmlとTiMidity++をインストールしてみます。pmmlはMML(Music Macro Language)コンパイラと呼ばれるツールで、MMLで記述した楽譜情報からMIDIファイルを生成します。TiMidityはソフトウェアMIDI音源で、pmmlで生成したMIDIファイルを再生するのに利用します。
PMMLをビルドする
まずはPMMLをビルドします。オリジナルのソースファイルはftp://ftp.u-aizu.ac.jp/u-aizu/pmml/にありますが、pmml-0.2p1.tar.gz(1998/06/17)以降は新しいバージョンがリリースされておらず、そのままの状態では現在の環境でビルドできません。
そのため、pmml-0.2p1.tar.gzをビルドが通るように修正したものを以下のリポジトリに用意しました。
cloneしてmakeするだけでビルドできます。筆者の環境ではNetBSD-6.1-i386とDebian GNU/Linux 7.4 (wheezy)でビルドできることを確認できています。
$ git clone https://github.com/furandon-pig/pmml-0.2p1-fork-201405.git $ cd pmml-0.2p1-fork-201405/
ビルドは単にmakeコマンドを実行するだけであり、./configure --prefix=...のような指定ができません(そもそも現状ではconfigure未対応です...)。インストール先を変更したい場合は、以下のようにMakefile中のLIBDIR,BINDIRを修正します。以下の例では/opt/pmml-0.2p1-fork-201405にインストールする設定に修正しています。
$ diff -u Makefile.orig Makefile --- Makefile.orig 2014-05-14 15:32:04.000000000 +0900 +++ Makefile 2014-05-14 15:33:04.000000000 +0900 @@ -5,10 +5,10 @@ #------ configuration parameters ------ # The directory to which PMML library files are installed. -LIBDIR = /usr/local/lib/pmml +LIBDIR = /opt/pmml-0.2p1-fork-201405/lib/pmml # The directory to which executable files are installed. -BINDIR = /usr/local/bin +BINDIR = /opt/pmml-0.2p1-fork-201405/bin # Command name of the C compiler CC = gcc
あとはmake,make installでビルドとインストールは完了です。
$ make 2>&1 | tee -a _make.log $ sudo make install 2>&1 | tee -a _make_install.log
TiMidity++をビルドする
TiMidityについてもconfigure,make,make installで完了します。パッケージで提供されているソフトウェアですが、今回は自分でビルドしてみます。インストール先は/opt/TiMidity++-2.13.0としています。
$ cd work $ wget http://ftp.jaist.ac.jp/pub/sourceforge/t/project/ti/timidity/TiMidity++/TiMidity++-2.13.0/TiMidity++-2.13.0.tar.gz $ tar zxvf TiMidity++-2.13.0.tar.gz $ cd TiMidity++-2.13.0 $ ./configure --prefix=/opt/TiMidity++-2.13.0 2>&1 | tee -a _configure.log $ gmake 2>&1 | tee -a _make.log $ sudo gmake install 2>&1 | tee -a _make_install.log
音源ファイルを用意する
TiMidityを使用するには、「音源ファイル」と呼ばれる、音色のファイル集が必要です。以下の手順で用意します。
$ cd work $ wget ftp://ftp.iij.ad.jp/pub/linux/gentoo/distfiles/shominst-0409.zip $ sudo mkdir -p /opt/TiMidity++-2.13.0/share/timidity $ cd /opt/TiMidity++-2.13.0/share/timidity $ sudo unzip /home/fpig/work/shominst-0409.zip # ディレクトリ直下に展開されるので注意
timidity.cfg内のファイルパスを自分の環境に合わせて修正します。/opt/TiMidity++-2.13にインストールしたtimidiyがデフォルトで参照するファイルパスに一致するよう音源ファイルを置いています(このためTiMidity側での音源ファイルの場所設定は不要です)。
$ diff -u timidity.cfg.orig timidity.cfg --- timidity.cfg.orig 1996-04-08 03:31:00.000000000 +0900 +++ timidity.cfg 2014-05-14 15:15:47.000000000 +0900 @@ -30,9 +30,9 @@ #dir /usr/local/lib/timidity # -dir /nethome/sak95/shom/lib/timidity/inst/GUS -dir /nethome/sak95/shom/lib/timidity/inst -dir /nethome/sak95/shom/lib/timidity/inst/test +dir /opt/TiMidity++-2.13.0/share/timidity/inst/GUS +dir /opt/TiMidity++-2.13.0/share/timidity/inst +dir /opt/TiMidity++-2.13.0/share/timidity/inst/test bank 0 source default.cfg
pmml,timidityコマンドのパスを設定する
pmml,timidyのコマンドを通常と異なる/opt以下にインストールしているため、環境変数PATHを設定します。
$ export PATH=$PATH:/opt/pmml-0.2p1-fork-201405/bin $ export PATH=$PATH:/opt/TiMidity++-2.13.0/bin
それぞれのコマンドが見つかることを確認して設定完了です。
$ which pmml timidity /opt/pmml-0.2p1-fork-201405/bin/pmml /opt/TiMidity++-2.13.0/bin/timidity
MMLのサンプルからMIDIファイルを生成する
MMLのコンパイル環境とMIDI再生環境が構築できたので、MMLのサンプルからMIDIファイルを生成してみます。 PMMLのexamplesディレクトリにMMLのサンプルがあるので、これを利用します。
"pmml <MMLファイル名>"でMMLをコンパイルします。MIDIファイルは MMLファイルと同じディレクトリ に生成される点に注意してください(相対パスでMMLファイルを指定すると「MIDIファイルが生成されない!」と早とちりしてしまいます...)
$ cd ~/work/pmml-0.2p1-fork-201405/examples $ pmml menuet1.pml $ ls Makefile grieg/ menuet1.mid menuet2.pml rand2.pml etude1.pml handel.pml menuet1.pml rand1.pml $ file menuet1.mid menuet1.mid: Standard MIDI data (format 1) using 3 tracks at 1/480
生成されたMIDIファイルをtimidityで再生してみます。
$ timidity menuet1.mid Playing menuet1.mid MIDI file: menuet1.mid Format: 1 Tracks: 3 Divisions: 480 Track name: (rh) Track name: (lh)
emacs+pmmlモードを使ってみる
PMMLの配布物にはpmml-mode.elというファイルが同梱されています。これを利用すると、emacs上でのMMLファイル作成が効率よく行えそうです。
pmml-mode.elを~/.emacs.dにコピーし、.emacsに以下の設定を追加します(最近のemacsは.emacsがobsoleteだった気がする...)。
$ cp pmml-0.2p1-fork-201405/emacs/pmml-mode.el ~/.emacs.d/ $ cat <<_EOF | tail -a ~/.emacs ;; PMML mode setup (setq pmml-player-command '("timidity" "-s16000")) (require 'pmml-mode) _EOF $ emacs --version GNU Emacs 24.3.1 ...
上記設定後、emacsで.pmlファイルを開くと自動的にpmmlモードになります。"C-c C-f"と入力すると、現在開いている.pmlファイルのコンパイルと再生が行われます。
基本的には"C-c C-f"だけでも良さそうですが、"M-x describe-bindings"で利用可能なpmmlモードのキーバインディングを確認してみました。
Major Mode Bindings: key binding 備考 --- ------- ---- C-c C-c pmml-record-finish (筆者の環境では利用できず) C-c C-f pmml-play-file pmlファイル全体を演奏する C-c C-p pmml-play-from-here-all カーソル位置から最後まで演奏する C-c C-q pmml-stop 演奏を停止する C-c C-r pmml-record (筆者の環境では"Recording is not supported."と表示される) C-c C-s pmml-step-record (筆者の環境では"Step recording is not supported."と表示される) C-c C-t pmml-show-track-summary MIDIトラックのサマリ情報を表示する C-c C-y pmml-play-region-all 選択したリージョンを演奏する C-c p pmml-play-from-here-solo カーソル位置のパートをソロで演奏する C-c y pmml-play-region-solo 選択したリージョンをソロで演奏する
MIDIファイルをWAVファイルに変換する
timidityのもう一つの機能として、MIDIファイルをWAVファイルに変換するというものがあります。"-Ow"でWAVファイルへの変換が行えます。
$ timidity -h ...中略... Available output modes (-O, --output-mode option): -Od NetBSD audio device -Ow RIFF WAVE file -Or Raw waveform data -Ou Sun audio file -Oa AIFF file -Ol List MIDI event -OM MOD -> MIDI file conversion Output format options (append to -O? option): `S' stereo `M' monophonic `s' signed output `u' unsigned output `1' 16-bit sample width `2' 24-bit sample width `8' 8-bit sample width `l' linear encoding `U' U-Law encoding `A' A-Law encoding `x' byte-swapped output
以下の例では、pmmlでMIDIファイルを生成し、そこからWAVファイルに変換しています。さらにMP3にエンコードするといった活用方法も可能です。
$ pmml menuet1.pml $ timidity -Ow2 menuet1.mid Playing menuet1.mid MIDI file: menuet1.mid Format: 1 Tracks: 3 Divisions: 480 Track name: (rh) Track name: (lh) Output menuet1.wav Playing time: ~42 seconds Notes cut: 0 Notes lost totally: 0 $ file menuet1.wav menuet1.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 24 bit, stereo 44100 Hz
まとめ
pmmlとTiMidityのビルドとインストール手順をまとめてみました。ビルドが通るよう修正したpmmlのソースコードは以前から手元にあったのですが、HDDの奥深くに埋もれてしまうことが何度かあったため、GitHub上のリポジトリで管理することにしました。TiMidityについても、それ自体のインストールと音源ファイルの準備という若干ややこしい手順のため、pmmlと共に一連のインストール手順としてまとめてみました。
Debian上にOSvビルド環境を構築してみた
Debian上にOSvビルド環境を構築してみた
OSvもくもく会#1 〜OSvで遊んでみよう〜 の予習を兼ねて、Debian上にOSvビルド環境を構築してみました。
OSv
OSvはマイナビニュースで説明されているように、「クラウドオペレーティングシステム」という位置づけになっています。https://github.com/cloudius-systems/osvの説明では、Debian,Fedoraでのビルド環境構築が可能なようであり、今回はそれを参照しながら作業してみました。
- OSv
- OSvの説明(マイナビニュース)
ビルド環境構築の流れ
以下の順番でビルド環境の構築を進めます。
Debian(amd64)のインストール
- Debian 7.5.0(amd64)で仮想マシンを作成する
- ディスクサイズは10Gでギリギリ足りるようです
- amd64でインストールする点に注意する
- ftp://ftp.jaist.ac.jp/debian-cd/7.5.0/amd64/iso-cd/debian-7.5.0-amd64-netinst.iso
- 割り当てるメモリは3GB(3072MB)を設定する
- OSvで2GBのメモリを想定しているため
gcc-4.9.0のビルド・インストール
OSvのビルドにはgcc-4.8.0以上が必要ですが、Debianのパッケージはgcc-4.7が最新版であり、必要なgccバージョンを満たしていません。このため、gcc-4.9.0(2014/04/22にリリース)を自分でビルドします。
自分でビルドするものについては既存の環境と混ぜこぜにしたくないので、/opt以下にインストールする方針で作業を進めます。
Prerequisites for GCCにはgccのビルドに必要なツール、ライブラリが記載されています。gccのビルドの前に以下のライブラリをビルドします。バージョンの指定がある点に注意が必要です。
- GNU Multiple Precision Library (GMP) version 4.3.2 (or later)
- MPFR Library version 2.4.2 (or later)
- MPC Library version 0.8.1 (or later)
- ISL Library version 0.12.2
- CLooG 0.18.1
gccビルドに関連するパッケージのインストール
まずはgccのビルド作業に必要となるツールをパッケージからインストールします。
$ sudo sudo apt-get install lzip # .lz形式のgmp配布物の展開に必要 $ sudo sudo apt-get install autogen # autogenが無いとgccのビルドでエラーになる
ソースファイルの準備(ダウンロード)
インストール前に決めておくこと
- インストール先は/opt/gcc-4.9.0とする。
必要なライブラリのビルドとインストール
必要なソースアーカイブはあらかじめダウンロードしておきます。
$ ls Download/ cloog-0.18.1.tar.gz gmp-6.0.0a.tar.lz mpc-1.0.2.tar.gz gcc-4.9.0.tar.gz isl-0.12.2.tar.bz2 mpfr-3.1.2.tar.gz
ライブラリパスの設定
インストール先を/opt/gcc-4.9.0に想定しているので、作業前にライブラリパスを設定してしまいます。
後から設定しようとすると忘れてしまいがちで、make checkでテストがFAILしてからライブラリパスが未設定だったことに気づいたりします...。
$ export LD_LIBRARY_PATH=/opt/gcc-4.9.0/lib:$LD_LIBRARY_PATH $ export LD_RUN_PATH=/opt/gcc-4.9.0/lib:$LD_RUN_PATH
gmpのビルド
gmpのみソースアーカイブがlzip形式のみでの提供になっています。
$ lzip -dc Download/gmp-6.0.0a.tar.lz | tar xvf - $ cd gmp-6.0.0/ $ mkdir build ; cd build $ ../configure --enable-cxx --prefix=/opt/gcc-4.9.0 2>&1 | tee -a _configure.log $ (date ; make ; date) 2>&1 | tee -a _make.log $ (date ; make check ; date) 2>&1 | tee -a _make_check.log $ sudo make install 2>&1 | tee -a _make_install.log
mpfrのビルド
$ tar zxvf Download/mpfr-3.1.2.tar.gz $ cd mpfr-3.1.2/ $ mkdir build ; cd build $ ../configure --prefix=/opt/gcc-4.9.0 \ --with-gmp-include=/opt/gcc-4.9.0/include \ --with-gmp-lib=/opt/gcc-4.9.0/lib \ 2>&1 | tee -a _configure.log $ (date ; make ; date) 2>&1 | tee -a _make.log $ (date ; make check ; date) 2>&1 | tee -a _make_check.log $ sudo make install 2>&1 | tee -a _make_install.log
mpcのビルド
$ tar zxvf Download/mpc-1.0.2.tar.gz $ cd mpc-1.0.2/ $ mkdir build ; cd build $ ../configure --prefix=/opt/gcc-4.9.0 \ --with-gmp-include=/opt/gcc-4.9.0/include \ --with-gmp-lib=/opt/gcc-4.9.0/lib \ --with-mpfr-include=/opt/gcc-4.9.0/include \ --with-mpfr-lib=/opt/gcc-4.9.0/lib \ 2>&1 | tee -a _configure.log $ (date ; make ; date) 2>&1 | tee -a _make.log $ (date ; make check ; date) 2>&1 | tee -a _make_check.log $ sudo make install 2>&1 | tee -a _make_install.log
islのビルド
$ tar jxvf Download/isl-0.12.2.tar.bz2 $ cd isl-0.12.2 $ mkdir build ; cd build $ ../configure --prefix=/opt/gcc-4.9.0 \ --with-gmp-builddir=/opt/gcc-4.9.0/lib \ CFLAGS="-I/opt/gcc-4.9.0/include" \ LDLAGS="-I/opt/gcc-4.9.0/lib" \ 2>&1 | tee -a _configure.log $ (date ; make ; date) 2>&1 | tee -a _make.log $ (date ; make check ; date) 2>&1 | tee -a _make_check.log $ sudo make install 2>&1 | tee -a _make_install.log
cloogのビルド
$ tar zxvf Download/cloog-0.18.1.tar.gz $ cd cloog-0.18.1 $ mkdir build ; cd build $ ../configure --prefix=/opt/gcc-4.9.0 \ --with-isl=system \ --with-isl-prefix=/opt/gcc-4.9.0 \ --with-gmp=system \ --with-gmp-prefix=/opt/gcc-4.9.0 \ CFLAGS="-I/opt/gcc-4.9.0/include" \ LDLAGS="-I/opt/gcc-4.9.0/lib" \ 2>&1 | tee -a _configure.log $ (date ; make ; date) 2>&1 | tee -a _make.log $ (date ; make check ; date) 2>&1 | tee -a _make_check.log $ sudo make install 2>&1 | tee -a _make_install.log
gcc-4.9.0のビルド・インストール
今回欲しいのはC++コンパイラなので、--enable-languages=c,c++を指定して必要なコンパイラのみビルドします(C言語も不要かもしれません)。
$ tar zxvf Download/gcc-4.9.0.tar.gz $ cd gcc-4.9.0 $ mkdir build ; cd build $ ../configure --prefix=/opt/gcc-4.9.0 \ --disable-multilib \ --program-suffix=-4.9.0 \ --enable-stage1-languages=c,c++ \ --enable-languages=c,c++ \ --disable-isl-version-check \ --with-mpc-include=/opt/gcc-4.9.0/include \ --with-mpc-lib=/opt/gcc-4.9.0/lib \ --with-mpfr-include=/opt/gcc-4.9.0/include \ --with-mpfr-lib=/opt/gcc-4.9.0/lib \ --with-isl-include=/opt/gcc-4.9.0/include \ --with-isl-lib=/opt/gcc-4.9.0/include \ --with-gmp-include=/opt/gcc-4.9.0/include \ --with-gmp-lib=/opt/gcc-4.9.0/lib \ CFLAGS="-I$/opt/gcc-4.9.0/include" \ LDLAGS="-L/opt/gcc-4.9.0/lib -L/usr/lib" \ 2>&1 | tee -a _configure.log $ (date ; make ; date) 2>&1 | tee -a _make.log $ (date ; make check ; date) 2>&1 | tee -a _make_check.log $ sudo make install 2>&1 | tee -a _make_install.log
簡単な動作確認
$ export LD_LIBRARY_PATH=/opt/gcc-4.9.0/lib:$LD_LIBRARY_PATH $ export LD_RUN_PATH=/opt/gcc-4.9.0/lib:$LD_RUN_PATH $ export PATH=/opt/gcc-4.9.0/bin:$PATH $ which gcc-4.9.0 /opt/gcc-4.9.0/bin/gcc-4.9.0 $ which g++-4.9.0 /opt/gcc-4.9.0/bin/g++-4.9.0
$ gcc-4.9.0 --version gcc-4.9.0 (GCC) 4.9.0 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ g++-4.9.0 --version g++-4.9.0 (GCC) 4.9.0 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
qemu-2.0.0のビルド・インストール
OSvのビルド時にqemuの機能を利用しますが、Debianのqemuパッケージだとvirtio-rng-pciなデバイスが利用できないため、ビルドエラーとなります。
https://github.com/cloudius-systems/osv/issues/127を見ると、./configure --enable-virtfsしたqemuを使う方法が紹介されており、これに倣いqemuを自分でビルドします。最初Debianのqemuパッケージと同じバージョンのqemu(1.1.2)をビルドしましたが、そのバージョンではvirtio-rng-pciが提供されていないため、最新版のqemuを使います。
ビルドに必要なパッケージのインストール
$ sudo apt-get install pkg-config $ sudo apt-get install libglib2.0-dev # Development files for the GLib library $ sudo apt-get install libcap-dev $ sudo apt-get install libattr1-dev
libcap-dev,libattr1-devパッケージが無いと、configure --enable-virtfs時に以下のエラーとなります。
VirtFS is supported only on Linux and requires libcap-devel and libattr-devel
$ tar jxvf ./Download/qemu-2.0.0.tar.bz2 $ cd qemu-2.0.0 $ ./configure --prefix=/opt/qemu-2.0.0 \ --target-list=x86_64-softmmu,x86_64-linux-user \ --enable-virtfs \ 2>&1 | tee -a _configure.log $ (date ; make ; date) 2>&1 | tee -a _make.log $ sudo make install 2>&1 | tee -a _make_install.log
インストール後、virtio-rng-pciが使用可能デバイスに含まれていることを確認します。
$ qemu-system-x86_64 -device ? 2>&1 | grep virtio-rng-pci name "virtio-rng-pci", bus PCI
OSvのビルド
環境変数の設定
/opt以下にインストールしたgcc-4.9.0,qemu-2.0.0と必要なライブラリを参照するよう、.bashrc等に以下を追加します。
LD_LIBRARY_PATH=/opt/gcc-4.9.0/lib64:$LD_LIBRARY_PATH LD_LIBRARY_PATH=/opt/gcc-4.9.0/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH LD_RUN_PATH=/opt/gcc-4.9.0/lib64:$LD_RUN_PATH LD_RUN_PATH=/opt/gcc-4.9.0/lib:$LD_RUN_PATH export LD_RUN_PATH PATH=/opt/gcc-4.9.0/bin$PATH PATH=/opt/qemu-2.0.0/bin:$PATH export PATH=/opt/gcc-4.9.0/bin:/opt/qemu-2.0.0/bin:$PATH export CXX=/opt/gcc-4.9.0/bin/g++-4.9.0
GitHubからOSvソースコードをclone
OSvのGitHubの手順にしたがいソースコードをcloneします。clone後、"git submodule update"が必要です。
$ git clone https://github.com/cloudius-systems/osv.git $ git submodule update --init --recursive
OSvのビルド
$ cd osv $ (date ; make ; date) 2>&1 | tee -a _make.log
OSv上でHello,Worldを動かす
OSvを実行する前に、kvm.koをロードします(デフォルトではkvm.koがロードされていない)。
$ sudo /sbin/modprobe kvm $ lsmod | grep kvm kvm 287749 0
Hello,world.を動かしてみます。
$ cat apps/java-example/Hello.java public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); } } $ make image=java-example $ scripts/run.py -e "java.so -cp /java-example Hello" OSv v0.08-60-g8dd67e0 eth0: 192.168.122.15 Hello, World!
ハマりどころ
何もかもが上手く進んだ場合、前述までの手順でOSvのビルドまで行えます、が、OSvのビルドではハマり所がたくさんあります(ありました...)。
何点かハマった点について、エラー内容と解消方法を以下に記載します。
Makeファイルのjar-jarsターゲットの実行でエラーが出る
jar-jarsターゲットの実行で以下のようなエラーが出る場合があります。
$ make ...中略... MVN java-jars [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project cloudius: Fatal error compiling: invalid target release: 1.7 -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException make[1]: *** [java-jars] Error 1 make[1]: Leaving directory `/home/fpig/work/osv_buld/osv/build/release' make: *** [all] Error 2
$ make ...中略... MVN java-jars [ERROR] BUILD ERROR make[1]: *** [java-jars] Error 1 make[1]: Leaving directory `/home/fpig/work/osv_buld/osv/build/release' make: *** [all] Error 2
私の環境では、Maven,JDKのバージョンを複数インストールしていたことが原因でした。
$ /usr/share/maven/bin/mvn --version Apache Maven 3.0.4 Maven home: /usr/share/maven Java version: 1.6.0_31, vendor: Sun Microsystems Inc. Java home: /usr/lib/jvm/java-6-openjdk-amd64/jre Default locale: en_US, platform encoding: ANSI_X3.4-1968 OS name: "linux", version: "3.2.0-4-amd64", arch: "amd64", family: "unix" $ /usr/share/maven2/bin/mvn --version Apache Maven 2.2.1 (rdebian-8) Java version: 1.6.0_31 Java home: /usr/lib/jvm/java-6-openjdk-amd64/jre Default locale: en_US, platform encoding: ANSI_X3.4-1968 OS name: "linux" version: "3.2.0-4-amd64" arch: "amd64" Family: "unix"
Maven 3.0.4が使われると思っていましたが、実際はMaven 2.2.1が使われていました。
$ mvn -version Apache Maven 2.2.1 (rdebian-8) Java version: 1.7.0_55 Java home: /usr/lib/jvm/java-7-openjdk-amd64/jre Default locale: en_US, platform encoding: ANSI_X3.4-1968 OS name: "linux" version: "3.2.0-4-amd64" arch: "amd64" Family: "unix"
さっそく切り替えます。
$ sudo update-alternatives --config mvn There are 2 choices for the alternative mvn (providing /usr/bin/mvn). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/share/maven2/bin/mvn 200 auto mode 1 /usr/share/maven/bin/mvn 150 manual mode 2 /usr/share/maven2/bin/mvn 200 manual mode Press enter to keep the current choice[*], or type selection number: 1 update-alternatives: using /usr/share/maven/bin/mvn to provide /usr/bin/mvn (mvn) in manual mode
これでOK。
$ mvn -version Apache Maven 3.0.4 Maven home: /usr/share/maven Java version: 1.7.0_55, vendor: Oracle Corporation Java home: /usr/lib/jvm/java-7-openjdk-amd64/jre Default locale: en_US, platform encoding: ANSI_X3.4-1968 OS name: "linux", version: "3.2.0-4-amd64", arch: "amd64", family: "unix"
ちなみに、mvn -eで詳細なエラー表示が行えます。Mavenまわりで上記以外のエラーが出た際はbuild.mk内のMVNに-eを追加すると原因切り分けが楽になるかもしれません。
$ man mvn ...中略... -e,--errors Produce execution error messages
JDKについても、私の環境ではこちらも予想と異なるjdkが使われていました。
(あれこれ試行錯誤する中でmaven2やopenjdk-6-jdkとかインストールしたのがマズかったようです...)
$ javac -version javac 1.6.0_31 $ sudo update-alternatives --config javac There are 2 choices for the alternative javac (providing /usr/bin/javac). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib/jvm/java-6-openjdk-amd64/bin/javac 1061 auto mode 1 /usr/lib/jvm/java-6-openjdk-amd64/bin/javac 1061 manual mode 2 /usr/lib/jvm/java-7-openjdk-amd64/bin/javac 1051 manual mode Press enter to keep the current choice[*], or type selection number: 2 update-alternatives: using /usr/lib/jvm/java-7-openjdk-amd64/bin/javac to provide /usr/bin/javac (javac) in manual mode
java,javac共にjava-7-openjdk-amd64を参照することを確認します。
$ java -version java version "1.7.0_55" OpenJDK Runtime Environment (IcedTea 2.4.7) (7u55-2.4.7-1~deb7u1) OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode) $ javac -version javac 1.7.0_55
"undefined reference to `__cxa_throw_bad_array_new_length'"が発生する
これはエラーメッセージの通り、__cxa_throw_bad_array_new_length()が見つけられないことが原因です。
$ make ...中略... LD loader.elf arch/x64/smp.o: In function `smp_init()': /home/fpig/work/osv_buld/osv/arch/x64/smp.cc:78: undefined reference to `__cxa_throw_bad_array_new_length' core/mempool.o: In function `memory::mark_smp_allocator_intialized::mark_smp_allocator_intialized()': /home/fpig/work/osv_buld/osv/core/mempool.cc:386: undefined reference to `__cxa_throw_bad_array_new_length' make[1]: *** [loader.elf] Error 1 ...中略...
__cxa_throw_bad_array_new_length()は/opt/gcc-4.9.0/lib64/libstdc++.soにあります(前述のgccビルド手順を実施した場合)。
$ for i in `find /opt/gcc-4.9.0/ | grep \\.so$`; do nm $i | grep __cxa_throw_bad_array_new_length if [ $? -eq 0 ]; then echo $i fi done 000000000005d3a0 T __cxa_throw_bad_array_new_length /opt/gcc-4.9.0/lib64/libstdc++.so
build.mkの中でlibstdc++.aの場所を指定しているので、/opt/gcc-4.9.0以下のライブラリを探索するようにbuild.mkを修正します。
$ diff -u build.mk.orig build.mk --- build.mk.orig 2014-05-09 02:53:53.124712117 +0900 +++ build.mk 2014-05-09 08:37:33.570625829 +0900 @@ -784,6 +784,7 @@ objects += $(addprefix fs/, $(fs)) objects += $(addprefix libc/, $(libc)) +gccbase = /opt/gcc-4.9.0 libstdc++.a = $(shell find $(gccbase)/ -name libstdc++.a) libsupc++.a = $(shell find $(gccbase)/ -name libsupc++.a) libgcc_s.a = $(shell find $(gccbase)/ -name libgcc.a | grep -v /32/)
bare.imgの作成時に"qemu-system-x86_64: -device virtio-rng-pci: Parameter 'driver' expects device type"のエラーが出る
$ make ...中略... Creating bare.img as qcow2 /home/fpig/work/osv_buld/osv/scripts/mkzfs.py -o bare.img -d bare.img.d -m /home/fpig/work/osv_buld/osv/build/release/bootfs.manifest qemu-system-x86_64: -device virtio-rng-pci: Parameter 'driver' expects device type QEMU 1.1.2 monitor - type 'help' for more information (qemu) QEMU 1.1.2 monitor - type 'help' for more information (qemu) Traceback (most recent call last): File "/home/fpig/work/osv_buld/osv/scripts/mkzfs.py", line 44, in <module> upload_manifest.upload(osv, manifest, depends) File "/home/fpig/work/osv_buld/osv/scripts/upload_manifest.py", line 62, in upload s.connect(("127.0.0.1", 10000)); File "/usr/lib/python2.7/socket.py", line 224, in meth return getattr(self._sock,name)(*args) socket.error: [Errno 111] Connection refused make[1]: *** [bare.img] Error 1 make[1]: *** Deleting file `bare.img' make[1]: Leaving directory `/home/fpig/work/osv_buld/osv/build/release' make: *** [all] Error 2
これはDebianのqemuパッケージではvirtio-rng-pciが利用できないことが原因です。前述のqemuビルドの手順を実施します。
まとめ
Debian上にOSvのビルド環境を構築し、Hello,Worldまで動かしてみました。ビルド環境構築にはいくつかハマり所があり、以下の点に気をつける必要がありました。
- Debianはamd64版を使用する(i386だとダメ)
- OSvで2GBのメモリを使用するので、ビルド環境のマシンはそれを見越したメモリ量にする
- MavenとJDKは複数バージョンの混在に注意する
- 混在していた場合は、update-alternativesで適切なバージョンを利用するよう設定する
- gccは4.8.0以上を使用する
- gccビルドではconfigure --disable-multilib,--enable-languages=c,c++を忘れずに指定する
参照ドキュメント
gcc4.9のビルド手順を調べるにあたり、以下のWebサイト・blogの内容を参考にさせていただきました。
- Prerequisites for GCC
- さくら VPS 上に gcc4.8 をインストールする方法
- Mac OS X に GCC 4.8 をインストール
- GCC 4.9.0 をビルドした
- DebianにJava7をインストールする
- GNUリンカLDの使い方
- Debian Wheezy build error: qemu-system-x86_64: -device virtio-rng-pci: Parameter 'driver' expects device type #127
- http://gcc.gnu.org/install/prerequisites.html
変更履歴
- 2014/05/17:OSvソースコードのclone手順に抜けがあったため追記しました。
「ポケットミクちゃんに何かいろいろさせる会(その1)」開催レポート
「ポケットミクちゃんに何かいろいろさせる会(その1)」開催レポート
ポケットミクちゃんに何かいろいろさせる会(その1)という会を開催してみました。
勉強会ではメモを書いたりするのですが、家に帰るとメモを見返すこともなく、せっかくのメモが埋もれてしまうパターンに陥っているので、ここは思い切って勉強会のメモを元に、(ものすごく)簡単なレポートを書き残すことにしてみました。
みんなでやってみたこと
運の良いことに、参加者のマシンがWindows,OSX,Linux,NetBSDとバラけており、Chromeさえあればポケミクアプリが利用できるという便利さを痛感しました(が、NetBSDのみChromeを動作させられなかったという残念なオチが...)。
得られたノウハウ
あれこれ試してみて、以下のようなノウハウが得られました。
- 最初にみんなでキャリブレーション(ユーザーズ・マニュアルのP.13)をするも、以外にチューニングに手間取るケースが多かった。
- Ubuntu+Rosegardenでポケットミクから音が出せる
- GarageBandのデフォルト機能ではMIDI出力が行えない。別途プラグインが必要。
- GarageBandでは、ポケットミクのデバイス名が"Soundflower"になる。
- DominoやCubase(キューベス)でもポケットミクが利用できるらしい。
- (どちらも使ったことが無いので分からない...)
- NetBSDだと、midiplay(1)でMIDIファイルを指定し、ポケットミクに演奏させることができる
- ただし、何回か演奏しているとOSごと刺さる(!)ことがある。
$ midiplay -l 0: PC speaker 1: <0 >0 on umidi0 $ midiplay -d 1 foo.mid
- Ubuntuにもmidiplay(1)相等のコマンドがある(が、コマンド名を確認し忘れた...)
ポケミクアプリを動かしてみたり、ニコニコ超会議の超ボカロサミットを一通り観たりしていると、飛び入りの参加者さんが。先ほどまで観ていたニコニコ動画に映っていた人に名前が似ている...と思っていると、その人本人(ポケットミク総合Pの@polymoogさん)ががが!
なんだか凄いことになっちゃったぞ((C)孤独のグルメ)と驚きながら、@polymoogさんからポケットミクのひみつを聞いたり、みんなでポケットミクを動かしてみた時に出てきた疑問を聞いてみました。
(※以下は私の理解による記述であり、間違って理解している可能性がある点にご注意ください)
- 実は演奏中もキャリブレーション処理が走っているらしい。
- カーボンキーボードのスキャン方法は2パターンあるらしい。
- シーケンサ側から音色番号を指定して音をだせるが、ポケットミク単体でも可能かもしれない。
- ポケットミクのカーボンキーボードでシーケンサに入力する際、同じ音程で入力される。これはピッチベンドで音を入れているため。
- ユーザーズ・マニュアルの「デフォルト文字テーブル」にあるシステムエクスクルーシブデータ、さりげなく例を出しているが何かひみつがあるとか。
- ポケットミクと共にWeb MIDI APIが広まって欲しい。
- フィジカルコントローラとしてポケットミクを活用したい。
- ポケットミクの本、5月中頃から6月頭にかけて刊行されるかも。
やはりポケットミクの開発に携わった方の話はとても興味を惹かれました。ユーザーズ・マニュアルに書かれていないひみつは多いようで、ポケットミクの本がとても待ち遠しいです。
思いついたアイディア
私の環境ではChromeブラウザが動作しないため、ポケミクアプリを利用することができませんでした。しかし、お話を聞いてみるとポケミクアプリが利用しているWeb MIDI APIに俄然興味が湧いてきました。みんなで話していると、ポケミクアプリの他にも以下のようなアイディアが出てきました。
- フィジカルコントローラとしてのポケットミクの活用。
- カーボンキーボードからの入力を利用したアルカノイド風ゲームを作成した人がいるとか。
- カーボンキーボードで抑揚をつけたテキスト読み上げ
- まるで喋っているかのようなリアルな読み上げができる?
- ポケットミクで何か言葉を喋らせて、Siriやしゃべってコンシェルが音声認識できるか試してみたい。
- 「神調教」と呼ばれる職人の腕前と音声認識の対決?
次回の予定
単にポケットミクを動かしてみようという所から始まった会ですが、実際に開催してみるとポケットミクの隠されたひみつやWeb MIDI API、フィジカルインタフェースとしての活用など、試してみたい項目がいろいろ出てきました。そこで今後も何回かこの会を継続してみようと考えています。
次回は6/28(土)を予定しています。告知ページは近日中に作成する予定ですので、皆様のご参加をお待ちしております。
追記
次回の告知ページを公開しました。
dtrace機能を有効にしたNetBSDインストールCDを作成してみた
dtrace機能を有効にしたNetBSDインストールCDを作成してみた
NetBSDのdtrace機能を試してみようと思い立ち、@akachochinさんのNetBSD dtrace格闘記その2を元にdtrace機能を有効にしたインストールCDの作成手順をまとめてみました。
インストールCD作成準備
@akachochinさんのblogでは、インストール済みのNetBSD環境に直接dtraceまわりのカーネルモジュールをインストールしています。私の環境ではdtraceを有効にしたNetBSDのインストールCDを作成したいため、まずはインストールCD作成用のNetBSD環境を準備します。
ソースコードを展開する
NetBSD-6.1.3-i386を仮想マシンにインストールした後、ソースコードを展開します。
# mount /dev/cd0a /cdrom # cd /cdrom/source/sets/ # ls -l *.tgz -r--r--r-- 1 root wheel 43069713 Jan 19 20:15 gnusrc.tgz -r--r--r-- 1 root wheel 7661899 Jan 19 20:16 sharesrc.tgz -r--r--r-- 1 root wheel 203542266 Jan 19 20:14 src.tgz -r--r--r-- 1 root wheel 40189162 Jan 19 20:15 syssrc.tgz -r--r--r-- 1 root wheel 158393066 Jan 19 20:18 xsrc.tgz
ソースコードは/usr/src以下に展開します。
# for i in *.tgz; do tar zxvf $i -C /; done
カーネルコンフィグを修正してdtrace機能を有効化する
dtrace機能を有効にするためのカーネルコンフィグを追加します。INSECURE,KDTRACE_HOOKS,MODULARを有効にする必要がありますが、GENERICコンフィグではINSECURE,MODULARは既に有効になっていたため、KDTRACE_HOOKSのみ追加します。
# cd /usr/src/sys/ # diff -u arch/i386/conf/GENERIC.orig arch/i386/conf/GENERIC --- arch/i386/conf/GENERIC.orig 2012-08-16 00:33:00.000000000 +0900 +++ arch/i386/conf/GENERIC 2014-04-13 02:23:38.000000000 +0900 @@ -74,6 +74,7 @@ # Standard system options options INSECURE # disable kernel security levels - X needs this +options KDTRACE_HOOKS options RTC_OFFSET=0 # hardware clock is this many mins. west of GMT options NTP # NTP phase/frequency locked loop
build.shを実行する
build.shを使用して一通りのビルドを行います。ビルドは時間がかかるので、以下のスクリプトを作成し、バッチ処理的にビルドを行うようにしました。
上記のスクリプトをMac mini(2.4GHz Intel Core 2 Duo,メモリ 8GB)のVirtualBox上のNetBSDで走らせたところ、全てのビルドが完了するまで15時間程度かかりました。
ビルドが完了すると、以下の場所にdtrace機能が有効になったインストールCDが生成されます。
/usr/obj/distrib/i386/cdroms/installcd/NetBSD-6.1.3-i386.iso
OSインストール後のdtrace機能を利用するための設定投入
インストールCDが作成できたので、このCDを使用してNetBSDを再度インストールします。インストール後、dtrace用にデバイスファイルを作成します(OSインストール後に一度行うだけで良い)。
# mkdir /dev/dtrace # mknod /dev/dtrace/dtrace c dtrace 0
そして、OS起動時にdtraceに必要なカーネルモジュールをロードするよう設定します。もっとスマートな方法があると思うのですが、今回は/etc/rc.localに以下の処理を追加しました。
_MODULE=" solaris dtrace sdt fbt " for i in ${_MODULE} do echo "modload ${i}" modload ${i} done
OSを再起動するとdtrace機能が利用可能になっています。
# dtrace -l | wc -l 45326
dtrace機能を試してみる
NetBSDでdtraceが利用できるようになったので、例としてgetpid()システムコールをフックさせてみます。
"getpid"というキーワードにマッチする関数は、sys_getpid(),sys_getpid_with_ppid()の2つがあるようです。
# dtrace -l | grep getpid 21001 fbt netbsd sys_getpid entry 21002 fbt netbsd sys_getpid return 21003 fbt netbsd sys_getpid_with_ppid entry 21004 fbt netbsd sys_getpid_with_ppid return
どちらがgetpid()システムコールの実体か分からないので、"getpid"でマッチするようにしてみます。dtrace -nを実行すると、その端末内で出力待ちの状態になります。
# dtrace -n fbt:netbsd:*getpid*:entry dtrace: description 'fbt:netbsd:*getpid*:entry' matched 2 probes
別の端末にて、getpid()を実行するサンプルプログラムを用意します。
# cat _getpid.c #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]) { printf("%d\n", getpid()); return 0; } # gcc -Wall -Werror -g -o _getpid _getpid.c
サンプルプログラムを実行すると、dtraceを実行している端末に以下が出力されます。
# dtrace -n fbt:netbsd:*getpid*:entry dtrace: description 'fbt:netbsd:*getpid*:entry' matched 2 probes CPU ID FUNCTION:NAME 0 21003 sys_getpid_with_ppid:entry 0 21003 sys_getpid_with_ppid:entry
getpid()の実体はsys_getpid_with_ppid()のようです。プロセスの生成時にもsys_getpid_with_ppid()は呼ばれるようで、出力が2回になっています。
# cat -n /usr/src/sys/kern/kern_prot.c 81 /* ARGSUSED */ 82 int 83 sys_getpid_with_ppid(struct lwp *l, const void *v, register_t *retval) 84 { 85 struct proc *p = l->l_proc; 86 87 retval[0] = p->p_pid; 88 retval[1] = p->p_ppid; 89 return (0); 90 }
まとめ
NetBSDでdtrace機能を試してみました。デフォルトインストールではdtrace機能が有効で無いため、カーネルとカーネルモジュールの構築が必要です。インストールCDが欲しかったので、備忘録を兼ねた一通りのビルド手順についてもまとめてみました。
ポケットミクでテキスト読み上げ
ポケットミクでテキスト読み上げ
学研から発売された「歌うキーボード ポケットミク」を動かしてみました。
カーボンキーボードで演奏すると、初音ミクが「どーれーみー」という感じで歌ってくれます。また、MIDIデバイスとして利用でき、例えばNetBSDでは以下のdmesgが得られます(NetBSD-6.1-i386の場合です)。
Apr 29 07:12:32 hayase /netbsd: uaudio0 at uhub3 port 3 configuration 1 interface 0
Apr 29 07:12:32 hayase /netbsd: uaudio0: NSX-39 NSX-39, rev 2.00/1.00, addr 2
Apr 29 07:12:32 hayase /netbsd: uaudio0: audio descriptors make no sense, error=4
Apr 29 07:12:32 hayase /netbsd: umidi0 at uhub3 port 3 configuration 1 interface 1
Apr 29 07:12:32 hayase /netbsd: umidi0: NSX-39 NSX-39, rev 2.00/1.00, addr 2
Apr 29 07:12:32 hayase /netbsd: umidi0: (genuine USB-MIDI)
Apr 29 07:12:32 hayase /netbsd: umidi0: out=1, in=1
Apr 29 07:12:32 hayase /netbsd: midi1 at umidi0: <0 >0 on umidi0
すばらしいことに、GitHub上にはRuby,Python等のスクリプトからポケットミクを操作するためのライブラリが有志によって公開されており、Rubyからポケットミクを操作できるpoket_mikuがあります。
pocket_mikuのインストール
私の環境では、以下の手順でpocket_mikuをインストールしました。
- Gemfileを作成する
以下の内容でGemfileを作成します。
source :rubygems gem 'pocket_miku', :git => "git://github.com/toshia/pocket_miku.git"
- gemでインストールする
$ sudo gem193 install pocket_miku
- 簡単なサンプルを試す
以下のサンプルを実行すると、初音ミクが「ふぁー ぼー」としゃべります。
#!/usr/bin/env ruby193 # -*- coding: utf-8 -*- require 'pocket_miku' PocketMiku.sing '/dev/rmidi1' do tempo 240 ふぁ 75; ぼ 82; end
ポケットミクでテキストを読み上げてみる
さて、無事にスクリプトから初音ミクにおしゃべりさせることができたワケですが、もう一歩進めて、今度はテキストを読み上げさせてみます。
以下のように、初音ミクにしゃべらせたい音をスクリプトから指定するだけでOKなのですが、「日本語」→「にほんご」のように、平仮名に直して指定する必要があります。
ふぁ 75; ぼ 82;
ここはサクっとChasenを使ってテキストを平仮名に直すという方法を試してみました。
Chasenによる形態素解析では、以下のような出力が得られます。読みの第一候補(第二カラム)を使うとうまく行きそうです。 (実はこのカラムの名称を知らず、Chasenマニュアルを読む羽目に...)
$ chasen
今日は良い天気です
今日 キョウ 今日 名詞-副詞可能
は ハ は 助詞-係助詞
良い ヨイ 良い 形容詞-自立 形容詞・アウオ段 基本形
天気 テンキ 天気 名詞-一般
です デス です 助動詞 特殊・デス 基本形
EOS
スクリプトは以下においてあります。
以下の手順でスクリプトを実行します(現状「!」とかの記号が入ったテキストだとエラーがでます...)。
$ echo 今日は良い天気です | chasen > data.txt
$ ./miksay.rb data.txt
テキストを読み上げたものの...
ポケットミクによるテキスト読み上げまで行えたのですが、いざ発声を聞いてみると、あまりよく聞き取れません。 しばらく聞いていて気がついたのですが、発声の「間」を調節しないと聞き取りにくいようです。
「キョウハ ヨイ テンキデス」という発声だと良いのですが、「キョウハヨイテンキデス」と一気に読み上げると、思っている以上に単語の区切りが分かりにくいです。日々会話する時にはほとんど意識しないのですが、この「間」は重要なのですね。
まとめ
スクリプトからポケットミクをしゃべらせてみました。形態素解析ツールを活用することでうまいこと仮名の切り出しが行えました。テキスト読み上げについては、発声の「間」などの考慮が必要そうで、まだまだ改良の余地ありです。
追記
肝心なことを忘れていました。5月6日に「ポケットミクちゃんに何かいろいろさせる会(その1)」という会を開催する予定です。ご興味のある方はぜひご参加ください。