Home › Monthly Archives › 2月 2012

期待されたら裏切れって俺が言ってた!!

そりゃ俺人に期待されるの嫌いですからね。期待されたら裏切りますよ、俺は。
とはいえ、今回も実はそれなりに書くことたまってます。3740文字を超えることはないと思いますが、それなりの長さにはなるかも?
しかもある程度専門的な話になりますので、ご興味のない方はうふふんの曲でも聞いててください

それでは早速行きましょう。お題は、「VMWare Serverによる仮想環境の構築と外部からのアクセス」です。

今俺が仕事で作ってるシステムって、具体的な内容は省きますが、Windowsで動く携帯向けシステムなんですよ。
皆さんご存知かはわかりませんが、実はWindowsって普通にWEBサーバー(この場合アプリケーションサーバーですが)として動かす機能があったりするんです。IIS(インターネットインフォメーションサービス)でググれば詳細が分かると思います。
普通にっていうのは、別にWindows Serverである必要はないってことです。Windows XPでも十分WEBサーバーにできますよ。
まあ、実際に「サーバー」として動かすためには、複数のユーザーが同時にアクセス出来たりする必要があるので、これはあくまでWEBサーバーとしての運用が出来るのみでしかありませんが。
話が盛大にそれましたが、ともかくWindowsのIISというサーバーで動くシステムを作ってるわけです。
ところで、現在仕事を請け負ってる先というのがとても小さな会社なんですが、外部に向けたテストサーバーが存在しないんですよ。
普通の仕事だったらそれで事足りるのですが、今回作ろうとしているのは携帯向けのシステム。最終的には携帯でアクセスをしてテストしなければなりません。実際、PCでは動いたけど携帯では動かなかったということが何回かありました。
携帯でVPNとか使って内部からアクセスなんて真似は出来ません。そのため、外部からアクセス可能なサーバーが必要だったのですが、それが本番環境しかないという有様でした。
幸いなことにお客さん(仕事を請け負った会社に依頼をした会社)もそれを理解してくれたので、本番環境兼テスト環境という形で仕事を進めてくることが出来ました。
しかし、少し考えればわかることだと思いますが、これって非常に危うい環境です。まだリリースにはなっていないから出来ていますが、これがシステムリリースという形になったら、何があってもミスは出来ないということになってしまいます。
たとえばテストソースにPCでは動くけれど携帯では動かない部分があったとしましょう。それを本番環境に適用した瞬間、ユーザーにとっては重大な不具合という形で発現してしまいます。そしてそれはシステムのユーザー離れを誘発することになります。
勿論手間という面もあります。お客さん先のサーバーに俺はアクセスできません。ソースをアップしておいて、サーバーに適用してもらうよう依頼するしかありません。
なので、俺の手元で動かせる外部アクセス可能なテスト用Windowsサーバー環境が欲しかったわけです。

ここまで前置き。ここからが今回の本題です。
うちには自宅サーバーがあります(皆さんが読んでるこの日記も、っていうかこのサイト自体うちのサーバー上にあるものです)。そして、そこに入っているOSはLinuxです。
何故Linuxを選んだかというと、純粋にサーバーとしての利用を考えた場合、Windowsよりもはるかに軽いからです。サーバーを立てる上で、俺は軽さを重要視しました。
今回必要となっているOSはWindows系。しかしサーバーに入っているOSはLinuxです。では、どうやってLinuxが入っているサーバーにWindowsを入れればいいでしょうか。
その答えとなるのが、今回のお題の一つである「仮想環境の構築」です。
仮想PCという言葉は、そろそろ皆さんも馴染んでいる頃かと思います。Windows7ではWindows Virtual PCという仮想環境構築ソフトがあり、XPモードというものも存在します。
今回やろうとしたのは、それをLinux上で動かすということです。
実を言うと、俺は以前VMWareでなく「Xen」というLinuxの仮想化ソフトを利用しようとしたことがあります。これはあえなく失敗し、HDDの不具合が発生したときに、ともに闇の彼方へと葬り去られました。
今回は前回の失敗を活かし、Windows・Linuxともに広く使われている仮想環境構築ソフト「VMWare Server」を利用することにしました。
こちらは広く使われているだけあって、解説サイトも親切なものが多数存在しています。
VMの構築で難しいところは何一つありませんでした。rpmを使ってVMWareをインストールし、vmware-config.plというコマンドを叩き、あとはほとんど空エンターでしたから。
サービスを登録し、SSLでポート8333にアクセスし、VMWare Server Consoleにアクセスすることが出来ました。これで下準備完了です。
これからVM(Virtual Machine)を構築します。Consoleのメニュー「Virtual Machine」から「Create Virtual Machine」を選択します。
ここで最初にOSを選ぶことになるのですが、注意が必要です。何かと言うと、構築できるVMは「インストールディスクを持っているOS」に限られます。俺も最初それでWindows Server選んで失敗しました。
今回ほしいのはWindows系なので、もともとサーバー筐体に入っていたWindows XP Professionalを選択。あとは適当なHDD容量やメモリ設定をします。
VMの設定が完了したら、サーバー筐体にWindows XPのインストールディスクをセットし、VMを起動します。
すると、Console画面から子ウィンドウが開き、昔見慣れたXPのインストール画面が立ち上がりました。
これを見た瞬間俺は思いました。「なるほど、これは確かに『仮想マシン』だ」と。
つまり、その子ウィンドウこそがVMのディスプレイであり、操作をする端末であるというわけです。実体としての筐体があるわけではなく、仮想的にマシンを作り上げている、そんな感じです。
後は普通のXPのインストールと同じです。ガンガン進めて行きます。
と、ここで問題発生。どうやらこのVM、ネットワークにつながっていないようです。
解説サイトではVMのネットワークアダプターをBridgeに設定していましたが、うちの環境には適合しなかったようです。三つある選択肢、「Bridge」「Host Only」「NAT」からNATを選択しなおします。すると、VMがネットワークにつながりました。
VMが更新プログラムやIISをインストールしている間に、VMのWEBサーバーを外部接続する方法を調べます。
どうやら、VMWareには「ポートフォーワード」という機能が存在するようです。本体であるサーバーの特定ポートへのアクセスを、VMの指定したポートへのアクセスに変換する機能です。
これを使えばVMのIISに外部からアクセスできるようです。というわけで、早速Consoleから操作……って、そんなメニューねえぞ。
調べに調べ、とうとう英語サイトにまで手を出しました。要約すると、「Linux版には便利なメニューないから、手作業で設定しようぜ!」とのこと。Linux版の風当たりが強い。
あとは手探りで設定ファイルを探し当てました。VMWare設定フォルダにあるvmnat8/nat/nat.confというファイルです。
ここに既にテンプレートとしてポートフォーワード文が書かれてコメントアウトされていました。コメントアウトを解除し、VMWareを再起動。
この間にIISとかのインストールや設定を終え、テストプロジェクトをInetpub\wwwrootに配置。PCからhttp://サーバーIP:指定ポート/テストプロジェクト/にアクセスしてみました。
諸事情あって画像は出せませんが、ちゃんとアクセスすることが出来ました。どうやら設定は成功のようです。これでWindows外部向けサーバーが構築できました。
喜び勇み、携帯を取り出しEZWeb起動。さっきと同じアドレスを入力し、wktkして待つことしばし。
……つながらねえじゃねっかよう。
ポートフォーワード設定も、IISの設定も出来ています。考えられるのは、このポートへのアクセスが拒否されているということ。一体何が原因で……。
これで丸一日ぐらい悩みました。で、昨日チャットで消せるでっていうKeceldettyさんに助力を求めました。
「ケディー、こいつを見てくれ。こいつをどう思う?」
「凄く……ファイアウォールです」
「Oh…」
ということで、結論はファイアウォールで弾かれているということでした。今まで意識したことなかったけど、ちゃんと機能してたのねファイアウォール。
自分の備忘用に、どのコマンドでポートに穴をあけたのか記しておきます。
iptables -I INPUT -p tcp –dport 指定ポート -j ACCEPT_COUNTRY
ポートを閉めるときは以下の通り。
iptables -D INPUT -p tcp –dport 指定ポート -j ACCEPT_COUNTRY
これで本当に外部向けIISサーバーを構築することが出来ました。嗚呼疲れた……。

というわけで、VMWareで仮想サーバーを立てるときの留意事項。
・ポートフォーワードを使いましょう
・ファイアウォールに穴をあけましょう
以上です。
たったこれだけのためにどんだけ時間使ってんだとか言わない。

これがこの2日間ぐらいの仕事内容なわけですが。

4,000文字……だと……?

……期待は……裏切れなかったよ……。

こうなったら無茶振りするしか。
=INT(RAND()*3)=1ということで、次はシグマさん。一番いい画像を頼む。

MIDI講座なんてなかったんやぁ・・・

2000字も書かれたら対抗して大量に書かざるを得ない。

という訳でMIDIについて話すことにします。

 

ちょっと調べれば分かるんですが、MIDIはWAVとかACCとかの音楽ファイルと違って音楽の波形データを記録する形ではなく、イベントと呼ばれたりする命令を使ってPCにプリインストールされてたり、別売りで売ってる10何万の外部セットだったり、数万前後のソフトウェアみたいな形で売られてたりする音源を適時発音させて音を出します。 で、その処理の方法が大きく分けて、チャンネルやトラックごとに発音した後全部を統合する方法と、発音タイミングに合わせてその時有効になっているイベントを発音する方法にわかれるんですが、WMP(Windows Media Player、WindowsOSのデフォルト音楽プレイヤー)は後者を採用しています。で、この方式の何が問題かというと、音が結構競合したりするんですよ。特にsynthStringsとかが起こりやすい。音の競合ってなんぞっていう人のために説明しておくと、要は音の発音の時に打ち消し合ってどっちかの音が聞こえなくなる現象です。ただ、前者の方がいいかというとそうでもない。なぜなら、普通の16チャンネルぐらいのMIDIならいいんですがSC-88とかの120いくつとかのチャンネルフルに使ってるMIDIになると処理がくっそ重くなるそうなんです。自分は持ってないんでわからないんですがね。  まあ、まずそんなMIDIお目にかからないって言われたらそれまでなんですが。ともかく、MIDIを録音するときは数チャンネルごとを小分けに録音→合成みたいな感じでやると音の無駄とPCの負荷が減りますよと言う話。(時間が数倍かかりますが。)

 

これだけじゃなんなので、MIDIの基礎知識みたいなものでも小出しにしていこうと思います。

べ、別にこの先数回のネタ作りサボろうってわけじゃないんだからね!!勘違いしないでよね!!

 

※この下でトラックと言う単語が何回か登場しますが、CDのトラックやシーケンサーソフトのトラックとはまた別のものであることをご了承ください。

今回扱うのはSMF自体についてとイベントの内のノート、プログラムチェンジ、それにコントロールチェンジの一部です。

まず、SMF自体についてですが、SMFと言うのは最も普及しているMIDIの種類です。フォーマットは大きく分けて3つあり、0は1トラックに全イベントをまとめている形式で、再生向きです。1は複数トラック(通常はチャンネルごと)にイベントをまとめている形式で、最もポピュラーです。2は1ファイルに複数楽曲を保存している形式らしいですが、マイナーらしく自分も見かけたことはありません。ファイルの構造は最初にヘッダーが来てその後にトラックチャンクが必要数だけ作られてそこに各種イベントが格納されます。ちなみに、中身のイベント同士のタイミング差は相対時間で記録されています。

さて、このイベントの中でもっともわかりやすいのが次に扱うノートイベントです。これは音の発音そのものを命令するイベントで、後述のプログラムチェンジにより決定された楽器の音程を指定するイベントです。実際はノートオンイベントやノートオフイベントなどの複数イベントから構成されているのですが、シーケンサーソフトでは全部ひっくるめて1つの単位として扱っていることがほとんどなので、全部ひっくるめて「ノートイベント」と呼んでしまいます。さて、このイベントを扱うにあたって覚えておくべき要素はノートオンベロシティー、ノートオフベロシティー、デュレーション、ノートNO、チャンネル、そしてイベント位置の6つです。順に説明すると、ノートオンベロシティーはノート開始時の音量を決定する要素で、0(min)-127(max)の数値で定義されています。ノートオフは開始時が終了時に変わっただけの要素なので割愛するとして、この数値をいじることで音の強弱の微妙な調整がある程度可能です。次に、デュレーションですが、これはそのノートイベントの長さを決定します。これは、1イベントが使用できる最小単位を1として表されます(長さは四分音符が960)。ここを弄ってスタッカートなどをより名前の演奏に近づけることができますが、トラック内でイベントBのオンの位置がイベントAのオフの位置より先になるとイベントが正常に再生されなくなるので留意しましょう。その次のノートNOですが、大抵の場合は「C4」や「D5」などのコードで表されます。大抵のシーケンサーソフトでは(意図して作成されていない限り)この形で表されるのでDTMを初めようとしている人は慣れておいたほうがいいでしょう。チャンネルについてですが、これはノートイベントに限らず各イベントに設定されている要素で、Win系OSにプリインストールされているMSGS音源では16チャンネルが用意されています。そのうちの10チャンネル(10+16×n)はドラムに割り振られています。各チャンネルは同じトラックに格納されるため、同じチャンネルのイベントはオフになるまで同時に参照されます。最後のイベント位置も他のイベントに設定されている要素です。これはその名の通り、イベントの開始位置のみを設定する要素です。(ノートの場合はデュレーションで長さが決められており、その他のイベントは長さを設定する必要がないため。)デュレーションと同じ単位で現されます。また、GM1規格(世界共通のMIDI規格)で10chで8音、それ以外のchで16音の系24音の同時発音が保証されています。

さて、次のプログラムチェンジイベントですが、余り書くことがないほど単純なイベントです。これは各チャンネルにおいてこのイベント後のノートイベントを発音する楽器を決定するイベントで、GM1規格に基づいた最低128の共通した楽器が、どの音源にも用意されています。この詳細については各自調べてもらうことにしますが、後半に成るに連れてゲテモノ(?)になります。このイベントには上のノートイベントの要素のうちのチャンネルとイベント位置、そして各楽器に対応した数値が設定されています。(128以上の楽器については後ほど)

最後に、コントールチェンジイベントですが、128枠有り全て使用されているわけではないにしろ数が多いので数回に分けて説明します。 今回説明するのはそのうちでも比較的よく使うボリュームチェンジ(No,7)、パンポット(No,10)、エクスプレッション(No,11)、そして外部音源を使うなら必要なバンクセレクトMSB(No,0)とバンクセレクトLSB(No,32)について説明します。まず、ボリュームチェンジですが、読んで字のごとくそのトラックのこのイベント後の音の大きさを決定するイベントで、0(min)~127(max)の数値で定義されます。主にトラック全体の大まかな音の大きさを決定する時に使われることが多いイベントです。次にパンポットですが、これは音を左右のどちらにより多く出力するかを決定するイベントでやはり0-127の数値で定義されており、64を中央値として値が大きくなるほど右側に大きく出力され最大(最小)の場合は右側(左側)のみに出力されます。この次のエクスプレッションですが、ボリュームチェンジで指定した範囲内でさらに音量を0(min)-127(max)の範囲で設定するイベントです。主に細かな音量調節に使われることが多いイベントです。これら3つのイベントは実はMSB、LSBと有りMSBが適用された後にLSBが適用される形で更に細かい設定が可能なのですが、今回は割愛します。最後にバンクセレクトMSB&LSBですが、これは外部音源の128以上のプログラムチェンジを扱うためのイベントです。外部音源は音を音源のバージョンごとの階層に分け、さらにそれを楽器のセットごとに分割して記録しています。MSBはこの階層を決定しLSBはセットを指定するイベントでどちらも0-127の数値で定義されています。自分自身が使ったことが無いのであまり詳しい説明はできませんが大体のイメージはこんな感じのハズ。 上記のコントロールチェンジ達にはチャンネル。イベント位置、コントロールナンバー、そしてその値(大体が0-127)が設定されています。

 

長々と書きましたが、今回のことを簡単にまとめると

・音量はボリュームチェンジ→ノートオンオフベロシティー→エクスプレッションの順で設定するといい。

・パンポッドで音を左右に振れる。

・SMFの音階はギターみたいなコードで表される事が多い。

・SMFの最小単位は四分音符の1/960。

・外部音源を使うための専用のコントロールチェンジがある。

の5行で済むという悲劇。シカタナイネ。

次やる時はエフェクト系のコントロールチェンジとピッチベンド、スペシャル当たりについて説明しようかしら。しっかし眠い。

 

では、次回の日記はロベルトさんにお願いします。これ以上の長文を書いてくれると期待してッ・・・ご愛読ありがとうございますた?

『会話スキルなんてなかったんや・・・ッ!』

はい、14日でした。チョコはお婆ちゃんからもらいました。美味しかったです。バレンタインとはなんだったのか・・・。

それはそうと最近小説読みすぎて会話してないから、会話スキル(笑)が大変態なことに低下のしすぎでもう日記もどう書いていいやら・・・という訳でいつも通りネタなどなかった。真面目すぎるのも考えものねぇ。

あ、コイントスで表出たんで次はうふふさんです。