2015年3月20日金曜日

FlashAirとMicrosoftAzureを連携してやる(ダウンロード編)

引き続き、ダウンロードもしてやりましょう。

なお、認証が難しいので、今回はAzureストレージのコンテナの設定を「パブリックBLOB」にします。
秘密の画像は置かないように。

まず、SDカードに次のプログラムをおきましょう。
$ vi /Volumes/FLASHAIR/download.lua
local function waitWlanConnect()
    while 1 do
        local res = fa.ReadStatusReg()
        local a = string.sub(res, 13, 16)
        a = tonumber(a, 16)
        if (bit32.extract(a, 15) == 1) then
            print("connect")
            break
        end
        if (bit32.extract(a, 0) == 1) then
            print("mode Bridge")
            break
        end
        if (bit32.extract(a, 12) == 1) then
            print("mode AP")
            break
        end
        sleep(2000)
    end
end

waitWlanConnect()

res = 0

while 1 do
  res = fa.HTTPGetFile("http://アカウント.blob.core.windows.net/コンテナ名/ファイル名", "/DCIM/保存するファイル名")
  sleep(600000)
end



FlashAirのLuaには、sleep関数(引数はミリ秒)が追加されています。親切設計です。
Wi-Fiに接続するのを確認して、定期的にファイルをダウンロードする仕様です。

このプログラムを起動時(SDカードを挿したとき)に実行するように設定します。
$ vi /Volumes/FLASHAIR/SD_WLAN/CONFIG
LUA_RUN_SCRIPT=/download.lua


ネットワーク設定などは前回を参考に。

これで定期的にファイルが増える(すでにあるファイルは後ろに番号がつく)のが確認できるかと思います。

こうやって見ると、Azureだからと言って特別なことは少ないのかなー




2015年3月18日水曜日

FlashAirとMicrosoftAzureを連携してやる(アップロード編)

東芝から発売されているSDカード「Flash Air™」をご存知でしょうか?
SDカード+Wi-Fi機能という、なかなかのものです。
http://www.flashair.info/

それだけなら、Eye-Fiとかでいいじゃん、と思うかもしれません。
ところが、こいつはLuaスクリプトを実行できるんですね。
さらに、PIO制御ができたり、なんか狂ってて素敵ですね。
そんな開発者向け情報はこちらで。
https://flashair-developers.com/ja/

なんとなく気になったので、もちろんMicrosoftAzureと連携してみます。

新しいファイル(sample.jpg)が追加されたら、MicrosoftAzureのBlobにアップロードする、というのをやってみましょう。
ただ、Azureストレージの認証ヘッダーをFlashAirだけで作れないので、セキュリティも考慮してPHP経由でアップロードしたいと思います。

まずは、FlashAirがインターネットにつながるように設定します。
Macなら、ターミナルで隠しフォルダと隠しファイルが直接編集できます。
カードの名前を「FLASHAIR」とします。

$ vi /Volumes/FLASHAIR/SD_WLAN/CONFIG
APPMODE=5
APPSSID=HWD15_581F28C13B88
APPNETWORKKEY=***************
LUA_SD_EVENT=/upload.lua

変更箇所だけ説明します。
APPMODEの初期値は4 (無線LAN親機)ですが、5(無線LAN子機)に変更します。
APPSSIDに接続するSSID、APPNETWORKKEYにはパスフレーズを設定します。
これで次回起動時に無線LANにつながります。
LUA_SD_EVENTは、カードにファイルが追加された際に発生するイベントで、そのタイミングで実行するLuaプログラムを指定します。
今回は、カードの「/」にあるupload.luaを指定します。

upload.luaは以下の内容です。
以下の例を参考に、PHPでのアップロードに必要なMAX_FILE_SIZEを追加します。

アップロード先は、今回はAzureWebSites上のPHPです。

$ vi /Volumes/FLASHAIR/upload.lua
boundary = "--1234567890"
contenttype = "multipart/form-data; boundary=" .. boundary
filepath = "sample.jpg"
mes = "--"
  .. boundary .. "\r\n"
  .."Content-Disposition: form-data; name=\"MAX_FILE_SIZE\"\r\n\r\n800000\r\n"
  .."--" .. boundary .. "\r\n"
  .."Content-Disposition: form-data; name=\"file\"; filename=\""..filepath.."\"\r\n"
  .."Content-Type: text/plain\r\n"
  .."\r\n"
  .."\r\n"
  .."--" .. boundary .. "--\r\n"

blen = lfs.attributes(filepath,"size") + string.len(mes) - 17

b, c, h = fa.request{url = "http://flashair.azurewebsites.net/up.php",
  method = "POST",
  headers = {["Content-Length"] = tostring(blen),
  ["Content-Type"] = contenttype},
  file = filepath,
  body = mes
  }


次は、アップロード先のPHPプログラムです。
Azure SDK for PHPの準備(https://github.com/Azure/azure-sdk-for-php)と、Azureストレージの設定とコンテナの作成が別途必要です。

$ vi up.php
require_once 'bin/vendor/autoload.php';
use WindowsAzure\Common\ServicesBuilder;

$account = 'Azureストレージのアカウント';
$key = 'アクセスキー';
$container = 'アップロード先のコンテナ名';

$connection = 'DefaultEndpointsProtocol=https;AccountName=' . $account . ';AccountKey=' . $key;
$blob = ServicesBuilder::getInstance()->createBlobService($connection);

/* save file */
$a = time();
$filename = "blob_" . "$a";
move_uploaded_file($_FILES['file']['tmp_name'], $filename);

/* upload Blob */
$content = fopen($filename, "r");
try {
  $blob->createBlockBlob($container, "claudia.jpg", $content);
} catch (Exception $e) {
}
fclose($content);

unlink($filename);


これで、sample.jpgというファイルをFlashAirに書き込むと、Azureストレージに自動でアップロードされます。

サンプル程度ですが、興味があればどうぞ。



2015年2月10日火曜日

心霊写真とか電子音声現象とか

電子音声現象を捉えるガジェットが発売される予定だそうだ。
http://www.ghostark.com/

詳しくはBingっていただくとして、記録装置がデジタル化していく過程で
明瞭に解析できることは興味深い。

しかしながら、アナログからデジタルに移行して最近あまり聞かなくなったものもある。
私が子供の頃は「心霊写真」というものが大変人気(?)があった。
フィルムになんらかのものが映り込む、アレである。
さらに古くは、フィルムに「念写」するというのもあった。(映画リングを見ましょうw)

これらは、解像度が低い故に幅広い解釈も可能なものが多かったように思う。
音声についても、20世紀頭から電子音声現象は捕らえられているが、
やはり不明瞭なものが引き起こす部分も多かれ少なかれあるのではないかと。

ただし、これらのものが全てが霊ではないとも言い切れないだろう。
世の中の多くのことはまだ解明されずにいるから。

「GhostARK」を買って考えてみようかな…。

2015年1月28日水曜日

Windowsな人へ、AzureのCentOSをアップデートしましょう

めっちゃ簡単なので、セキュリティパッチの適用をお願いします。

1.sshでログインする
Puttyとかなんでもいいのでログインしましょう。

2.yumコマンドでアップデートしましょう。
$ sudo yum -y update
※ "-y"オプションは、勝手にアップデートをする際に必要

3.再起動
$ sudo shutdown -r now

アップデート方法がわからないのに、コンパイルしてアプリケーションをインストールしてる場合はちょっと困りますね...

なお、Ubuntuの場合はこれで。
$ sudo apt-get upgrade




2015年1月26日月曜日

MySQL Percona XtraDB Cluster を Azure上で動かしてみる

Percona XtraDB Cluster は、MySQLでマルチマスター型レプリケーションを実現するものです。

こちらの記事を読んでいたら、「別にAzureでできるじゃん」と思ったのでやってみることに。
http://qiita.com/nownabe/items/462f46f2702ce1ad4b6d#percona-xtradb-cluster-1

ClearDBもPercona使ってるのかな?
https://www.cleardb.com/blog/entry?id=press-release/april-18-2013/cleardb-ceo-to-speak-at-percona-live-santa-clara

Azureでのポイントは以下の3つ。
・仮想ネットワークを作成し、同一の仮想ネットワーク内に仮想マシンを置く。
・仮想マシンに可用性セットを設定し、メンテナンスなどの停止に備える。
・エンドポイントに負荷分散セットを設定し、ロードバランシングする。

今回はCentOS7でやってみましたが、もちろんハマるところはこの2つ。
・firewalldを止める(ほんとはきちんとポートの設定をしてOnにしましょう!今回だけですよ!!)
・SELinuxをオフにする

ざっくり手順を。
まずは管理ポータルでの設定。

1.仮想ネットワークの作成
名前を「percona」、場所を「日本(東)」にした。

2.仮想マシンの作成(1台目)
ギャラリーから「CentOSベース」→「OpenLogic 7.0」を選択。
仮想マシン名を「percona1」、サイズは「標準、A1」に。
新しいクラウドサービスを作成、DNS名は「percona0」、作成した仮想ネットワークを指定、可用性セットを「percona」という名前で作成。

3.仮想マシンの作成(2台目、3台目)
ギャラリーから「CentOSベース」→「OpenLogic 7.0」を選択。
仮想マシン名を「percona2(percona3)」、サイズは「標準、A1」に。
作成したクラウドサービス「percona0」を選択、作成した仮想ネットワークを指定、作成した可用性セット「percona」を選択。

4.MySQLのエンドポイントの追加(percona1)
まず、percona1でエンドポイントを作成します。
「スタンドアロン エンドポイントの作成」を選択し、次へ。
エンドポイントの詳細で、名前を「MySQL」に、「負荷分散セットの作成」にチェック。

5.MySQLのエンドポイントの追加(percona2、percona3)
「既存の負荷分散セットにエンドポイントを追加する」を選択し、次へ。
エンドポイントの詳細で、名前を「MySQL」に、「負荷分散セットの再構成」にチェック。

ここまでで、管理ポータルの設定は完了。
なお、各IPアドレスは、percona1(10.0.0.4)、percona2(10.0.0.5)、percona3(10.0.0.6)です。

各サーバーの設定は参照記事の通りですが、ざっくりと。

1.アップデートとSELinuxとfirewalldの無効化
sshでログインして、以下のコマンドをどうぞ。
$ sudo yum -y upgrade
$ sudo vi /etc/sysconfig/selinux
SELINUX=disabled
$ sudo systemctl disable firewalld
$ sudo shutdown -r now

2.Percona XtraDB Cluster のインストール
$ sudo yum -y install epel-release
$ sudo yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
$ sudo  yum -y install Percona-XtraDB-Cluster-56

3.my.cnfの編集(percona1)
$ sudo vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
user=mysql

binlog_format                  = ROW
innodb_buffer_pool_size        = 100M
innodb_flush_log_at_trx_commit = 0
innodb_flush_method            = O_DIRECT
innodb_log_files_in_group      = 2
innodb_log_file_size           = 20M
innodb_file_per_table          = 1

wsrep_cluster_address          = gcomm://10.0.0.4,10.0.0.5,10.0.0.6
wsrep_provider                 = /usr/lib64/galera3/libgalera_smm.so

#wsrep_slave_threads            = 8
wsrep_cluster_name             = Cluster
wsrep_node_address=10.0.0.4

wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cret"
default_storage_engine=InnoDB

innodb_locks_unsafe_for_binlog = 1
innodb_autoinc_lock_mode       = 2

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file = /run/mysqld/mysql.pid

!includedir /etc/my.cnf.d
※percona2、percona3の場合は、「wsrep_node_address」を自分のIPアドレスに変更

4.percona1の起動(起動後はMySQLの管理者パスワードを設定すること)
$ sudo systemctl start mysql@bootstrap

5.SST用ユーザーの作成
$ sudo mysql -u root -p
Enter password:
mysql> create user 'sstuser'@'localhost' identified by 's3cret';
mysql> grant RELOAD, LOCK TABLES, REPLICATION CLIENT on *.* to 'sstuser'@'localhost';
mysql> flush privileges;

6.percona2、percona3の起動
$ sudo systemctl start mysql

あとは、参照記事の通りSQLを実行して確認できるかと思います。

性能検証は誰かやってるのかなー。
案件で困ってたら弊社へw
http://www.pnop.co.jp/













2015年1月19日月曜日

年明けたけど、Azure SDK for PHP を新しいバージョンのストレージAPIに対応してみる(適当編)

Azureの古いストレージAPI(2012-02-12以前)が削除されるのですが(以下参照)、

http://blogs.msdn.com/b/windowsazurej/archive/2014/08/12/blog-microsoft-azure-storage-service-version-removal.aspx

PHP向けSDKはまだ対応できてないのです。

せっかちな私は、ちょっとした変更で対応してみようと思います。
良い子は正式なSDKが出るのを待ちましょう。

まず、SDKのバージョンを定義してる定数は、「WindowsAzure/Common/Internal/Resources.phpの248行目の「STORAGE_API_LATEST_VERSION」にあります。

https://github.com/Azure/azure-sdk-for-php/blob/master/WindowsAzure/Common/Internal/Resources.php

ここを、最新の「2014-02-14」に変更します。

次に、動作させるバージョンによってはエラーが出るので、WindowsAzure/Common/Internal/Authentication/StorageAuthScheme.php」の一部を変更します。
どうもインターフェースのメソッドを全て実装してないっぽいですが ...
42行目のimplements以降を消します。

https://github.com/Azure/azure-sdk-for-php/blob/master/WindowsAzure/Common/Internal/Authentication/StorageAuthScheme.php

なんか嫌な感じですが、これでストレージの読み書きはできました。

やっぱり、正式に対応していただきたいです。




2014年11月14日金曜日

CentOSのPHP(pdo-dblib)から、ODBCなしに Azure SQL Database に接続する(前回の続きです)

前回は、私の嫌いなODBCを使わなくてもコマンドラインで SQL Database につながることを確認しました。
SQL Database が use が使えないので、DB名を接続時に指定する必要があることがわかりました。

では、まずphpinfo()で、PDO周りの設定を確認しましょう。
(おそらくパッケージは epel の php-pdoでしょうか)

以下の状態ならOKです。(コマンドで見てます...)
PDO

PDO support => enabled
PDO drivers => dblib, firebird, mysql, odbc, pgsql, sqlite

pdo_dblib

PDO Driver for FreeTDS/Sybase DB-lib => enabled

Flavour => freetds

接続に必要なのは、dblibです。
FreeTDSのライブラリの中にある DB-Library を使っています。

なお、FreeTDSは前回の設定と同様です。
freetds.conf の内容はこんな感じでしたね。
[mymssql]
host = mssql1.database.windows.net
port = 1433
tds version = 8.0
client charset = UTF-8

この場合、PHPのコードはこうなります。
$server = 'mymssql';
$username = 'user@mssql1';
$password = 'password';
$database = 'mydatabase';

$db = new PDO("dblib:host=" . $server . ";dbname=" . $database . ";charset=UTF-8", $username, $password);
foreach ($db->query('SELECT DB_NAME()') as $row) {
  print_r($row);
}


公式ドキュメントでハマるところは、DSNのhostに渡す名前です。
これは freetds.conf に記述してあるサーバー名(ここでは mymssql)だったんですね。
そりゃわからんよ。

mssql関数でも、ある程度まではイケるんですが、接続時にDB名を指定する方法がわからずに断念しました。(masterには繋げます)

Azureの SQL Database は、唯一管理されたRDBMSなので、もっと他のOSや言語から簡単に繋がってほしいものです。

思い切って、OpenTechとかがFreeTDSプロジェクトに参加するとか、どうでしょう?