ぷろぐらま

Web、JavaEEの話題を中心に

Microsoft Azure SQL Databaseの基礎知識、料金について

Azure SQL Databaseについてのメモです。
AWSもそうですがクラウドサービスは公式ページでの料金や機能説明がとても
わかりにくいです。なんとかして欲しい。

料金

以前はデータ量による課金体系などがありややこしそうでしたが
現在はプラン別の単純な時間単位課金になっておりシンプルです。
詳細は以下の公式ページを参照。
例えばStandardレベルのS1であればデータベースサイズは250GBまで利用可能で
¥2.33/時間で利用できます。
料金 - SQL Database | Microsoft Azure
Azure SQL Database Service Tiers and Performance Levels

SLAやデータのバックアップ

このあたりはPaaSで利用する事でメリットが多いところですね。
ほとんど自動でやっていくれてGUIで操作可能です。
SLAは99.99%
 仮想マシン上にSQL Serverを構築した場合は可用性セットで
 2インスタンス以上作らないとSLAは適応されないので
 ここはSQL Databaseの優位点ですね。
SQL Databseの場合は自動で3重化されている
・プランによって復元可能な期間の差はあるが特定ポイントからの復元が可能
・Standardプラン以上であればジオレプリケーション対応している。
 但しBasic, Standardプランではオフライン セカンダリ データベースのみ対応
Azure SQL データベースのアクティブ ジオレプリケーション
Azure SQL Database の標準地理レプリケーション | Technology | Nigerian Daily News

参考資料

MSの自習書シリーズ。とても詳しく解説されていてわかりやすいです。
まずは「Microsoft Azure SQL Database 入門」が良いと思います。
https://www.microsoft.com/ja-jp/sqlserver/2014/technology/self-learning.aspx

WebRTCでビデオチャットアプリ作成① メディア情報の取得

WebRTCを使ってビデオチャットアプリ作成。
何回かに分けてアップします。

基本的な映像・音声の通信に加えてファイル転送、
複数人での通信、NAT超え対応あたりまでやりたいと思います。

環境は以下です。
OS: AWSのEC2でUbuntuを利用
Webサーバ : Tomcat
ブラウザ: Chrome

OSやWebサーバは何でも良いですが後で会議室機能を作りたくなるかも知れないので
Tomcatにしておきます。

事前準備

AWS上でJDK8とTomcat7をインストールします。

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt-get install tomcat7

/etc/default/tomcat7 でJAVA_HOMEを設定

JAVA_HOME=/usr/lib/jvm/java-8-oracle

Tomcatの起動・終了・再起動

sudo /etc/init.d/tomcat7 start
sudo /etc/init.d/tomcat7 stop
sudo /etc/init.d/tomcat7 restart

Tomcatの設定ファイルは /etc/tomcat7、
CATALINA_BASEは /var/lib/tomcat7
CATALINA_HOMEは /usr/share/tomcat7 です。

メディア情報の取得

ローカルのカメラ、マイクの情報を取得してブラウザ上で表示します。
対応しているブラウザは以下を参照してください。ここではChromeで動作確認しています。
Can I use... Support tables for HTML5, CSS3, etc

カメラやマイクの情報を取得するには getUserMedia を利用します。

    // メディア情報の取得
    navigator.getUserMedia( {
        video: true,  // ビデオ情報取得を指示
        audio: true,  // 音声情報取得を指示
      }, 
      // メディア情報取得 成功/失敗時のコールバック
      gotUserMedia, didNotGetUserMedia
    );

第1引数でどのメディア情報を取得するかを指定します。
ここではビデオ、音声情報の取得を指定しています。
第2、第3引数はメディア情報取得に成功k失敗した場合のコールバック指定です。

ビデオの最小・最大サイズや最低限のフレームレート、
音声フィルタといった制約(条件)を指定する事も出来ます。

制約を指定するには constraints オブジェクトを利用して以下のように指定します。
このように指定した場合、取得したMediaStreamオブジェクト全体に制約が反映されます。

    // メディア情報の取得
    navigator.getUserMedia( {
      video: {
        "mandatory": {
          "minWidth": 500,
          "minHeight": 400,
          "maxFrameRate": 30,
        },
        "optional": [
          { "minFrameRate": 5 }]
      },
      audio: {
        "mandatory": {
          "googEchoCancellation": true,
          "googAutoGainControl": true,
          "googNoiseSuppression": true,
          "googHighpassFilter": true
        },
      },},
      // メディア情報取得 成功/失敗時のコールバック
      gotUserMedia, didNotGetUserMedia
    );

"mandatory"は必須の制約、 "optional"は任意の制約を意味し、
必須で指定した制約は満たされない場合、基本的にはエラーが発生します。
任意で指定した制約は「可能であれば制約をかける」という意味なので
満たされない場合でもエラーは発生しません。

なので、サービスとして最低限必要なフレームレートは"mandatory"で指定し、
快適な映像を見るために出来れば欲しいフレームレートは"optional"で指定する
といった形になります。

サンプルソース

とりあえず自PCのカメラ映像を表示するだけですが、
適当なWebサーバに配置して確認してください。

<!doctype html>
<html>
  <head>
    <title>WebRTC Application</title>
    <script type="text/javascript" src="http://code.jquery.com/jquery-2.1.4.js"></script>
  </head>
  <body>
    <video id="localVideo" width="640" height="480" autoplay="1" ></video>
 
    <script type="text/javascript">
    // ブラウザ間の差異を吸収する
    navigator.getUserMedia = 
      navigator.getUserMedia || navigator.webkitGetUserMedia || window.navigator.mozGetUserMedia;
    window.URL = window.URL || window.webkitURL;

    // メディア情報の取得
    navigator.getUserMedia( {
      video: {
        "mandatory": {
          "minWidth": 500,
          "minHeight": 400,
          "maxFrameRate": 30,
        },
        "optional": [
          { "minFrameRate": 5 }]
      },
      audio: {
        "mandatory": {
          "googEchoCancellation": true,
          "googAutoGainControl": true,
          "googNoiseSuppression": true,
          "googHighpassFilter": true
        },
      },},
      // メディア情報取得 成功/失敗時のコールバック
      gotUserMedia, didNotGetUserMedia
    );

    function gotUserMedia(stream) {
      $("#localVideo")[0].src = window.URL.createObjectURL(stream);
    }
    function didNotGetUserMedia(err) {
      console.log(err);
    }
    </script>
 </body>
</html>

以上

AWS-EC2上にTURNサーバを構築する

EC2上にWebRTCで利用するTurnサーバを構築する方法。
OSはUbuntu、Turnサーバにはrfc5766-turn-serverを利用します。
https://code.google.com/p/rfc5766-turn-server/

●turnサーバのインストール

$ tar xvfz turnserver-3.2.5.7-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz
$ apt-get update 
$ apt-get install gdebi-core
$ gdebi rfc5766-turn-server_3.2.5.7-1_amd64.deb

●有効化(以下のコメントを外す)

$ sudo vi /etc/default/rfc5766-turn-server
#TURNSERVER_ENABLED=1

●各種設定(必須)
/etc/turnserver.confを以下のように編集

# アクセスを受け付けるIP
external-ip=xxx.xxx.xxx.xxxx   #ec2のPublic IPを指定
# フィンガープリントを有効化
fingerprint
# TURNではlong-term-credientialを利用する必要あり
lt-cred-mech
# long-term-credientialで利用するrealmの指定
realm=mylocal.domain   #任意の値でOK
# long-term-credientialで利用するユーザ管理ファイルを指定
userdb=/etc/turnuserdb.conf

●TURNを利用するためのユーザアカウントを作成
userdbで指定したファイルを以下のように変更。
ここではユーザ名「webrtc」、パスワード「mypassword」のアカウントを1つ追加

#This file can be used as user accounts storage for long-term credentials mechanism.
#
#username1:key1
#username2:key2
# OR:
#username1:password1
#username2:password2
webrtc:mypassword

ここで指定したユーザ名を利用して以下のようにアクセスする。

var pc_config = {"iceServers":[
  {"url":"stun:xxxdomain.com:3478"},
  {"url":"turn:xxxdomain.com:3478", "username":"webrtc", "credential":"mypassword"}
]};
var peer = new webkitRTCPeerConnection(pc_config);

●各種設定(任意)

listening-port=3478  #ポート番号の指定

●起動と終了

service rfc5766-turn-server start
service rfc5766-turn-server stop

【VirtualBox】シリアルポートをrawファイルで利用する

ホストOS: Windows
ゲストOS: Ubuntu
でゲストOSからのシリアル通信をホストOSのファイルに書き出す方法。

VirtualBoxの設定画面でシリアルポートを開いてポート1を以下のように設定
  - シリアルポートの有効化をON
  - IRQ, ポート番号、I/OポートはデフォルトでOK
  - ポートモードは「Rawファイル」を選択
  - ポート/ファイルパスには任意のテキストファイルを指定
  
・上記のポート1を設定すると/dev/ttyS0のシリアルポートが有効になる
・ttyS0は書き込み権限が付与されていないので任意のユーザに権限を与える

これで/dev/ttyS0に出力した結果が設定画面で指定したテキストに出力されます!