Security Casual Talks 2014#2(すみだセキュリティ勉強会)に参加してきました

Security Casual Talks 2014#2(すみだセキュリティ勉強会)に参加してきました

Security Casual Talks 2014#2(すみだセキュリティ勉強会)に参加してきました。

勉強会参加者のツイートは、ハッシュタグ#sumida_secにて参照できます。

以下は勉強会のメモです。私が間違って理解したままメモを書いている箇所もあるかと思いますので、その点にご留意ください。 また、カッコ書きした項目は私の感想・意見となっています。

無線LANデンパゆんゆん観察

CRYPT+YOU,UNDERSTAND TODAY!

  • 発表者は@inaz2さん
  • 資料は以下のURLで公開されています

  • 代表的な現代暗号(RSA,AES,RC4あたり)について、アルゴリズムや使い方も交えた簡単な紹介

  • 換字式暗号
    • 文字、ブロック単位でずらす暗号で、古典暗号のひとつ
      • 「いくつずらしたか」が暗号鍵になる
    • (古典暗号、現代暗号という区分が存在するみたいです)
    • 換字式暗号の例としてはシーザー暗号がある
    • NSAの採用担当者のツイートを例にした換字式暗号の解読デモ
  • xorスクランブルの復元
    • (写真フイルムのネガポジ変換みたいなイメージ、反転→反転で元のデータに戻る)
  • RC4(Rivest Cipher 4)
    • 共通鍵暗号方式のうち、ストリーム暗号と呼ばれるもの
    • 鍵から特定のアルゴリズムに従って擬似乱数を作り、1byteずつのXORで暗号化・復号化する
    • RC4のバイアス問題
      • RC4が生成する擬似乱数列はあまりよろしくなく、2byte目が「0」になる確率はほかの値の2倍になっている
      • (これは実際に自分の手で試してみたい)
  • AES(Advanced Encryption Standard)
    • 共通鍵暗号方式のうち、ブロック暗号と呼ばれるもの
    • 入力は128bit固定で、鍵長は126,192,256bitから選択する
    • 128bitじゃない平分の時は、128bitのブロック毎に処理する。
      • 128bitの倍数にならない場合、不足分はパディングする
      • このブロックの処理方法を「暗号利用モード」と呼ぶ
      • 暗号利用モードのひとつにECB(Electronic Codebook)モードがある
        • 常に同じ暗号化結果が得られる→同じ平分のブロックが同じ結果になる、という欠点がある
        • AESに限らず、ブロック暗号でECBは利用せず、CBC(Cipher Block Chaining)等の他のモードを使う方がよい
          • CBCモード
            • 一つ前の暗号分を事前にXORで混ぜる
            • 最初のブロックはランダムな初期化ベクトル(IV)を混ぜる
  • RSA
$ openssl genrsa 192 | openssl rsa -modulus
...
Modulus=AAAA
$ msieve -e -v AAA
  • 実際に鍵長を指定するときは、2048bitよりも大きい長さを用いるほうがよい
  • RSAによる暗号化・復号化は処理(計算)が重いので、主に鍵共有、デジタル署名に使われる(「ハイブリッド暗号方式」と呼ばれる)

  • DH(Diffee-Hellman key exchange)鍵交換

    • RSAでAESの共有鍵を共有→データ通信という場面で、誰かが通信データ(AESで暗号化されたデータ)を全部集めており、かつRSA秘密鍵が盗まれてしまったら?
      • 鍵共有時のデータが復号化できるため、共通鍵がバレる→これまでのデータが全て復号化されてしまう可能性がある
    • DH鍵交換を用いると、共有鍵のデータを送受信せずとも鍵を共有できる
      • (なので、RSA秘密鍵が盗まれたとしても、送受信されていない共有鍵はバレない→データの復号化は不可能、という理解でよいのかな?)
    • DH鍵交換じたいは正確に言うと暗号ではなく、鍵共有プロトコルと呼ばれるもののひとつ
    • 特にセッション毎に鍵を換える場合DHE(Ephemeral)と呼ぶ。また、この鍵管理の概念を"PERFECT FORWARD SECURECY"と呼ぶ。
  • TSL/SSL暗号化スイートの読み方

    • TSL/SSLで使用する暗号の組み合わせを「暗号化スイート」と呼ぶ
    • 例として暗号化スイートが"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"の場合、以下の意味になる
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
鍵共有                 → ECDHE
通信相手の認証         → RSA
データそのものの暗号化 → AES_128_CBC
メッセージの改竄見地   → SHA1

Metasploitでペネトレーションテスト

まとめ

Security Casual Talks 2014#2(すみだセキュリティ勉強会)のメモをまとめてみました。正直、スライドが公開されているのでメモをまとめる必要性は低いと思っていました。しかし、自分の理解をメモにまとめるのだと考えると、スライドを見返したりする必要があり、なかなか勉強になります。

暗号の話は学生時代に習った内容の復習的なところが多いものの、すっかり忘れていたりする項目もありました。今回の勉強会を元に知識をキャッチアップできればと思います。

BaaS(Backend as a Service)勉強会に参加してきました

BaaS(Backend as a Service)勉強会に参加してきました

BaaS(Backend as a Service)勉強会に参加してきました。

勉強会の参加者のツイート内容は#BaaS (Backend as a Service) 勉強会のつぶやきログにてまとめられています。

以下のメモについては私のメモをまとめただけなので、内容に間違いがある可能性にご留意ください。

そもそもBaaSとは?(予習)

初めて聞くキーワードに関する勉強会の場合、予習しておかないとメモをまとめるのに苦労するため、あらかじめBaaSについて簡単に調べてみました。

BaaSとは

アピアリーズさんのBaaSとはの解説を引用すると、「モバイルアプリサービスの運用に必要な汎用的なサーバ機能を提供するクラウドサービスの一形態です。」とのこと。

  • モバイルアプリの開発はデバイス側(フロント側)、サーバサイド側、サーバの構築がセットになっている。
  • デバイス側で完結するアプリは殆ど例を見なくなっている。
  • モバイルアプリのサーバ構築では、以下の2点に頭を悩ませることになる。
    • スケーラビリティ
    • アイドルコスト(遊休コスト)

スケーラビリティとアイドルコスト

  • 自前でのハードウェア確保の場合
    • スケールアップの度にサービス停止が発生する。
    • 場合によっては新しいサーバへデータを移行する必要がある。
  • スケールアップの面倒がないように、始めから高性能なサーバを用意すると、今度はサーバが遊んでいる(アイドルコストが大きい)状態になってしまう。
  • スケールアウトの場合、入念な設計と高度なサーバ管理技術が必要であり、実施は容易ではない。

そういえば、WEB+DB PRESSのVol.78の特集記事「DMM.com開発ノウハウ大公開」でもDMM.comさんのサーバ機器の変遷(サーバラックの追加・増設やデータセンターの移行)が解説されていました。

これらの問題への解決方法としてクラウドサービスがあり、その一つとしてBaaSがある、という話のようです。

○aaS

また、BaaS以外にも○aaSと名前のつくサービスがあり、以下のような分類となっています。

図で表現すると、利用者側から見た○aaSの分類は以下のようになります。

f:id:furandon_pig:20140604213403p:plain

これらを踏まえてBaaS勉強会に参加してみました。

HTML5 Japan Cupについて

  • 発表者は白石俊平(html5j管理人)さん。
  • 発表スライドは以下のURLで公開されています。
  • html5jについて
    • 「日本が、世界のWebシーンをリードする存在になる。」を目標に掲げている。
    • わりと規模が大きくなってきた。
    • html5jのサブコミュニティ→14個くらいある。
  • 現在開催中のHTML5 Japan Cup 2014のお話。
    • Webデザイナー/Webエンジニア向けの、クリエイティブコンテスト。
    • HTML5 Japan Cup 2014のすごいところ。
      • 賞金すごい
      • 賞(と提供企業→42団体)すごい
      • 会社が開発者にコンタクトを取りたがっている→お仕事につながるかも、とのこと
    • 盛り上がる(希望)
    • 6/30まで作品製作期間、この間に作品をどんどん投稿して欲しいとのこと

HTML5開発者にとってのBaaS活用のメリット

  • 発表者は安藤幸央さん
    • そもそもBaaSとはどのようなものか?
    • サーバサイド開発用の言語が苦手な方でも、BaaSならサーバ機能を使った アプリを作れる!
  • 発表スライドは以下のURLで公開されています
  • BaaSの中にはサービスの中にはMBaaSに特化したものもある,
  • クラウドサービスを実際の天候に見立てた場合、晴れだけでなく、雨の日もある。これを避ける「傘」がBaaSであると考えている
  • 例えばfacebookのようなサービスをつくろうと考えた場合
    • フロントエンドだけでなく、サーバも作り込む必要がある(フロント-サーバの連系)
      • フロントは自分たちで作成し、バックエンドは既存のものを組み合わせて使おう、という考え
  • サービスを作る際に必要な機能
    • 認証、データの保存・管理、プッシュ・メール通知、アクセス解析SNS連系、課金、etc...
    • 基本的には定番の機能で、その都度(定番の機能を)作り直す形になる
      • バグ回避の観点からも、既存の実装済み機能を使いまわす方がよい
  • facebookとParse
    • 最近のBaaS関連のニュースで大きかったトピック
    • facebookが"Parse"というBaaSの会社を約84億円で買収した
    • 無料+使いやすくしたために、買収後の利用者が10倍になった
  • BaaS活用の観点
    • スピード、(人的)リソース、コスト、の3つが重要
    • スマホアプリ開発時の割合
      • 開発する前に設計
      • 開発→サーバ、クライアントの開発割合は50%/50%
      • BaaSを使うとクライアント側の開発に集中できる
  • BaaSの利用が向く開発
    • 開発エンジニアが少ない場合
    • バックエンドエンジニアのリソースが割けない場合
    • 一人で開発する場合
  • BaaSの利用が向かない場合
    • 開発メンバが多い場合orスキルの高いメンバが多い場合はBaaS不要
    • バックエンドエンジニアのリソースが確保できる場合
    • 一般的な機能の組み合わせでできるサービスを構築する場合
      • (BaaSを使うまでもない、という話?)
  • Instagramの開発エピソード(BaaSが無かった頃のサービス開発エピソード)
    • Instagramはクライアントサイド畑のエンジニアが2人で開発したサービス
    • そのため、サーバ側は手さぐりで作っていた
    • 最初の日に25000人が登録、一気に大量に使われるようになった
      • favicon.icoをサーバに置かなかったことで、「faviconが無い」というログで溢れかえってしまった
      • こういう失敗が無いようにBaaSを活用すればよいと考えている
  • 最適なBaaSを選択
    • BaaSベンダを選ぶ際の基準に関する話
    • (発表者のスライド(38枚目)を見てもらった方が良いかも...)
  • BaaSのデメリット
    • セキュリティ→ベンダが対応してくれる
    • ベンダロックイン→二つのサービスにまたがって動作させる、OSSのBaaSを活用
    • ダウンタイム→あきらめと、落ちる前提でサービスを企画する
    • テスト切り分け
    • 価格設定
    • 機能が足りない

現役BaaS開発者パネルディスカッション

  • モデレータは冨田慎一(株式会社マッシュマトリックス)さん
  • BaaS開発者として以下の方々が登壇されていました(敬称略)
    • 荒川義弘(株式会社アピアリーズ)さん
    • 石塚進(Kii株式会社)さん
    • 野田雄也(ニフティ株式会社)さん

各社のBaaSの特徴紹介の後、モデレータの方から出されたテーマを元にBaaS開発者の方が話すという内容でした。その後、参加者からの質疑応答タイムとなっていました。

モデレータの方から出されたテーマを元にBaaS開発者の方が話した内容

  • (テーマその1.)日本のBaaS市場、これから伸びてゆく?盛り上がってゆく?そして、ぶっちゃけ儲かっている?

    • アピアリーズさん
      • IIJさんと提携してからお問い合わせをいただくようになったので、勝手に盛り上がっていると考えている。
      • まだ儲かっているとこまでは行っていない。
    • Kii株式会社さん
      • 日本で盛り上がっているかと言われるとまだまだ
      • ただ、隠れて興味を持っている人・会社は多いようで、しずかに注目されていると思う
      • 儲けはまだまだだが、これからだぞというかんじ
    • ニフティ株式会社さん
      • 儲けはまだまだ
      • イベントに出典して問い合わせをいただいているので、企画で盛り上がってきていると思う。
      • 具体的なお問い合わせも多くなっており、(BaaSの盛り上がりは)これからだと思っている
  • (テーマその2.)海外のBaaSベンダーは40社以上あり乱立している。大手の会社もBaaSやろうとしており、海外勢をどう考えている?海外と自分たちのBaaSベンダの違いは何であると考えているか?

    • アピアリーズさん
      • 海外/国内の違い→日本語対応、サポート。
      • 日本国内でワンストップになるのが強みだと考えている。
    • Kii株式会社さん
      • モバイルでもローカルに特化するのも意味があると考えている。
      • マルチサイト対応しているので、日本で作って中国に持っていけるのは自分たちの強みだと考えている。
    • ニフティ株式会社さん
      • 一番大きいのはサポートが日本であること。
      • 企業で使おうと思うと早い時間で日本語でレスポンスがあるのはかなりのメリットと考える。
      • (データセンタが日本にあるので)レイテンシが低いのもポイント
        • が、海外からのレイテンシが大きくなるという逆の見方もあるとのこと
  • (テーマその3.)HTML5jカップでBaaSのからみで→MBaaSでモバイル、ネイティブアプリ/Webアプリという文脈でモバイルに限らずWebアプリを考えたときにBaaS利用はありえる?BaaS利用でHTML5はこれからどうなる?

    • アピアリーズさん
      • WebアプリでBaaSは十分にアリだと考えている。
      • アプリKeyが無くてもOKにしている、WebアプリとBaaSは親和性が高いと考えている。
    • Kii株式会社さん
      • アリだと思う。元々BaaSに'M'が付くのはMobile(の開発)が特殊だったから
      • Ruby on RailsとかはBaaSで置き換えてもよいのではと考えている。
      • ネイティブ/Webアプリの文脈→前者はbaaSある。
      • WebアプリはBaaSが取りに行ってないし、やろうという人もいない。我々としても後者にチャレンジしたいと考えている。
    • ニフティ株式会社さん
      • JavaScript SDKでキー書き出す。
      • セキュリティはsignatureチェック、機能制限をかけようという考えている。
      • PhoneGap→ブラウザオンリーでアプリが作成できるという開発環境。ライトなアプリはこれで十分。
  • (テーマその4.)今回の参加者からアンケートを取ったらサーバ系の人が多い。インフラ/DB/ミドルの構成教えて

    • アピアリーズさん
      • 概ねJavaで作っている。場合によってPHP,JavaScript
      • 基盤はIIJさんのGioクラウドを使わせていただいている。
      • DBまわりはメインでMongoDB。
    • Kii株式会社さん
      • 基本的にインフラはAWS、中国だけ別。
      • メインはJavaPython,NodeJS、ストレージは普通のRDBだったりMongoDBだったり。
      • ロックインされたくないので差し替え可能なように作っている。
    • ニフティ株式会社さん
      • IaaSはニフティクラウド
      • 開発言語はかなりの部分がJava
      • ミドルDBはMongoDB。
      • 他社様の構成も弊社と似ているのではと考えている。
  • (テーマその5.)言ってみればBaaSってサーバエンジニアをいらなくする技術なのでは?そう考えた時にサーバエンジニアのキャリアパスは?

    • アピアリーズさん
      • BaaSが出てきてサーバエンジニアがいらなくなることは無いと思う。
      • ラッキングやスイッチング部分では不要。構成を考える部分では必要。
      • BaaSでも通信、トランザクション、想定される負荷の検討しだいでは(レイヤが変わってくるけど)必要だと思う。
    • Kii株式会社さん
      • 今後はバックエンドとフロントエンドエンジニアは分かれてゆくと思っている。
      • AWSで同じ話が出ている。
      • オンプレミスデプロイや他サーバとの連系を考えるとサーバエンジニアはこれからも必要。
      • シビアなビジネスロジックやパフォーマンスが要求されるようなコストが厳しい場面ではサーバエンジニアが必要だと思う。
    • ニフティ株式会社さん
      • なくならないと思う。
      • BaaSを選ぶのはフロントエンドの人だけでなく、backendの人が逆にBaaSを選択してあげても良いと思う。
      • フロント側の知識を得ればフルスタックエンジニアに一歩近づく。サーバの知識は無駄にならない。
      • ゲーム系の顧客では(パフォーマンスの観点から)BaaS使わない顧客も多い。

質疑応答

  • Q1.BaaSを使ってmobile appを作ることを考えたとき、どういうアプリがBaaSに向いていると思いますか?

    • アピアリーズさん
      • 弊社のBaaSではキャンペーンアプリが多いという歴史があり、短期間、低コストであった。
      • ヘビーなアクセスがあるようなゲームは自前のインフラとか考慮したりする必要があるので向いてないと思う。
    • Kii株式会社さん
      • 我々が色々な企業さんと話すと、いろいろなジャンルに向いていると思う。
      • BaaSはテクニカルじゃない部分がある。
      • アプリを複数持つとバックエンドを共通化したくなる。
      • そのため、アプリではなく業務として共通化したいのでは。
    • ニフティ株式会社さん
      • 私もなんでもできると思っている。
      • IaaSと同じでun-controllableなものをどうするかという点ではBaaSも同じ。
      • un-controllableな箇所を許容できるならもつ、そうでないなら持たない。
  • Q2.将来どこで他社と差別化(機能、料金とか)を図ろうと考えていますか?

    • Kii株式会社さん
      • 弊社はマルチサイト、海外展開が差別科要因だと思っている。
      • 機能で差別化は難しい。使ってもらわないと差別化にならないから。
      • 開発者の不満感に反応して(機能が)進化してゆくと思う。
      • どのBaaSを選ぶかはぶっちゃけ好みだと思う。使って行くことで自然にノウハウがたまると思う
    • アピアリーズさん
      • 正直BaaSは汎用的な機能を安価に使えるように、が出所なので差別化難しいと考える。
      • IIJのお客様から業務系アプリのお話をいただくことが多い。
      • 今後の展開は汎用機能突き進む側とエンタープライズ向け特価の2つを進めると思う。
      • エンタープライズ向けが差別かの点だと考えている
    • ニフティ株式会社さん
      • 差別化難しいよね。
      • (弊社の場合)IaaSから持っているのは強みだと思う。
      • スマホアプリのノウハウを持っている会社との連合軍で進められるのが強みだと考えている。
  • Q3.(Kii株式会社さんはオンプレを提供しているが)なぜオンプレしようと思ったのですか?また、他の会社はオンプレやる予定はありますか?

    • アピアリーズさん
      • オンプレはOEMで提供を検討している会社が数社ある。
    • Kii株式会社さん
      • オンプレに踏み切った理由→エンプラ向けの需要があるから。
      • 米国のBaaS業者もエンプラに行っている。
      • 既にあるエンプラ(MEEP)を喰いに行っている。
    • ニフティ株式会社さん
      • オンプレの話は問い合わせが多々ある。エンプラ系で多い。
      • が、現状はできていない。検討は引き続き行っており、うまい方法があるか考えている。

飛び入りLT

質疑応答の後、自作BaaSサービスを作成された方の飛び入りLTがありました。福岡からの参加(!)とのことでした。

  • 発表者は@nobkzさん
  • Milkcocoaという自作BaaSサービスの紹介
    • エンドユーザがWebアプリを作れないか!という観点で作成した
  • あわせてflowerというグラフィカル言語の紹介
    • Raspberry Piの上でも稼働するようです

まとめ

BaaS勉強会のメモをまとめてみました。今回は予習をしていったので楽にメモをまとめられると考えていたのですが、やはり四苦八苦してしまいました。メモを取りながら話のつながりをリアルタイムにまとめあげるという要領のよさが必要そうです...。

第1回SoftLayer勉強会に参加してきました

第1回SoftLayer勉強会に参加してきました

第1回SoftLayer勉強会が開催されたので参加してきました。

勉強会の告知ページの写真がラウドパークを彷彿とさせる感じだったので、Tシャツにジーンズという風貌で参加したところ、ほとんどの参加者が背広!まるで衣替えの日に一人だけ冬服で登校した中学生のような気分になってしまいました...(クラウド系の勉強会は背広の人が多い傾向があるようです)。

以下は勉強会のメモですが、クラウドまわりの知識に疎いので私の理解に間違いがある可能性にご留意ください。

SoftLayer Introduction

  • 発表者は@urasakoさん
    • 今回の勉強会の企画を行った方
  • (まずそもそも)クラウドってなに?

  • SoftLayerについて

    • SoftLayerはIaaS(Cloud Infrastructure as a Service)を提供する
    • 米国、アジア、ヨーロッパ合わせて13のデータセンタがある
    • SoftLayerの利用形態
      • server
      • storage
        • Object Storage
          • OpenStack swiftベースのオブジェクトストレージを持っている
        • SAN(Storage Area Network)
        • NAS(Network Attached Storage)
        • CDN(Contents Delivery Network)
        • QuantaStor
    • SoftLayerのWebポータルサイト上で世界中のリージョンが見える
    • CDN単独の提供も可能
    • Automation & API
      • Auto-scaling機構はないけれどAPIで操作できる
  • SoftLayerに関する日本語の資料について

  • 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一択!
      • 通数で料金が決まる
  • メールについて改めて復習

    • 日本語ではメールに依らないメッセージサービスが多いため、メールはオワコンと考える人が多いようだ
    • また、スパムのイメージも強い?
    • しかし、海外ではコミュニケーションツールの一つとして活用されている
      • 加えて、HTMLメールが良く利用される
        • 日本国内ではテキストメールがメイン
  • メールの到達性について

    • 約20%のメールは届かない
      • ISPのスパム対策で正常な配信が困難になる
      • メールサーバの設定だけでなく、「到達性を高める」取り組みも必要
      • 時にはインフラ面での対応も必要になる
        • 社内LANから(スパムの踏み台等で)外部に変なメールを出すのを事前に阻止する等
        • スパム送信PCを放置したままにすると、ISPブラックリスト入り→メールの正常な配信が困難という状況になる
  • 構造計画研究所について

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との直接接続

      • WANのプライベートネットワークからビットアイルのデータセンターに接続し、そこからSoftLayerのプライベートネットワークに接続するような構成
      • セキュリティの観点から「インターネットは経由したくない」というケースに対応
      • 各拠点システムDBを集約してBI/データウェアハウスを構築
        • こちらもWANのプライベートネットワーク→ビットアイルのデータセンター→SoftLayerという構成
        • DBのリモートレプリケーション先をビットアイルのデータセンターにする
      • x86サーバとのハイブリッド構成
    • 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

  • 発表者は@lyumeiさん
  • RESTでSoftLayerを操作する話
  • curlでのREST API呼び出し例
    • SL_USERNAME,SL_API_KEYはあらかじめ環境変数として値を設定しておく
$ curl "https://${SL_USERNAME}:${SL_API_KEY}@api.softlayer.com/rest/v3/SoftLayer_Account.xml?objectMask=fitstName;lastName;id"

(以降にXMLが続く)

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-i386Debian 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でのビルド環境構築が可能なようであり、今回はそれを参照しながら作業してみました。

ビルド環境構築の流れ

以下の順番でビルド環境の構築を進めます。

Debian(amd64)のインストール

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の機能を利用しますが、Debianqemuパッケージだとvirtio-rng-pciなデバイスが利用できないため、ビルドエラーとなります。

https://github.com/cloudius-systems/osv/issues/127を見ると、./configure --enable-virtfsしたqemuを使う方法が紹介されており、これに倣いqemuを自分でビルドします。最初Debianqemuパッケージと同じバージョンの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

これはDebianqemuパッケージではvirtio-rng-pciが利用できないことが原因です。前述のqemuビルドの手順を実施します。

まとめ

Debian上にOSvのビルド環境を構築し、Hello,Worldまで動かしてみました。ビルド環境構築にはいくつかハマり所があり、以下の点に気をつける必要がありました。

  • Debianamd64版を使用する(i386だとダメ)
  • OSvで2GBのメモリを使用するので、ビルド環境のマシンはそれを見越したメモリ量にする
  • MavenJDKは複数バージョンの混在に注意する
    • 混在していた場合は、update-alternativesで適切なバージョンを利用するよう設定する
  • gccは4.8.0以上を使用する
  • gccビルドではconfigure --disable-multilib,--enable-languages=c,c++を忘れずに指定する

参照ドキュメント

gcc4.9のビルド手順を調べるにあたり、以下のWebサイト・blogの内容を参考にさせていただきました。

変更履歴

  • 2014/05/17:OSvソースコードのclone手順に抜けがあったため追記しました。

「ポケットミクちゃんに何かいろいろさせる会(その1)」開催レポート

「ポケットミクちゃんに何かいろいろさせる会(その1)」開催レポート

ポケットミクちゃんに何かいろいろさせる会(その1)という会を開催してみました。

勉強会ではメモを書いたりするのですが、家に帰るとメモを見返すこともなく、せっかくのメモが埋もれてしまうパターンに陥っているので、ここは思い切って勉強会のメモを元に、(ものすごく)簡単なレポートを書き残すことにしてみました。

みんなでやってみたこと

運の良いことに、参加者のマシンがWindows,OSX,Linux,NetBSDとバラけており、Chromeさえあればポケミクアプリが利用できるという便利さを痛感しました(が、NetBSDのみChromeを動作させられなかったという残念なオチが...)。

得られたノウハウ

あれこれ試してみて、以下のようなノウハウが得られました。

  • 最初にみんなでキャリブレーション(ユーザーズ・マニュアルのP.13)をするも、以外にチューニングに手間取るケースが多かった。
  • UbuntuRosegardenでポケットミクから音が出せる
  • GarageBandのデフォルト機能ではMIDI出力が行えない。別途プラグインが必要。
  • GarageBandでは、ポケットミクのデバイス名が"Soundflower"になる。
  • DominoCubase(キューベス)でもポケットミクが利用できるらしい。
    • (どちらも使ったことが無いので分からない...)
  • 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(土)を予定しています。告知ページは近日中に作成する予定ですので、皆様のご参加をお待ちしております。

追記

次回の告知ページを公開しました。