Azure SDK for PHP を FreeBSD で使う

Linux/BSD 界隈では LL が共通環境になってくれて非常にうれしいですね。せっかくなので、FreeBSD dumpでとったバックアップファイルを Azure BLOB 上に置こうかと Azure SDK for PHP を使ってみました。

http://www.windowsazure.com/en-us/develop/php/common-tasks/download-php-sdk/
http://www.windowsazure.com/en-us/develop/php/how-to-guides/blob-service/

だいたいそのまま動くのですがいくつか注意点

  • PEAR 経由でインストールする。(Composer 経由でのインストールには失敗 UTF-32LE がなんとかいうエラー。)
  • require_once ‘WindowsAzure/WindowsAzure.php’ を先頭に記述する。(これは PEAR 経由インストールであり Composer を利用しなかったことによる影響。サンプルコードの vendor/autoload.php は Composer 用の記述方法)
  • PHP拡張のうち ctype, openssl をインストールする。

というわけで、コンテナ作成のサンプルコードは以下のよう修正することで使うことができた。

#!/usr/local/bin/php
<?php
// require_once ‘vendor/autoload.php’;
require_once ‘WindowsAzure/WindowsAzure.php’;
use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Blob\Models\CreateContainerOptions;
use WindowsAzure\Blob\Models\PublicAccessType;
use WindowsAzure\Common\ServiceException;

$connectionString = "DefaultEndpointsProtocol=https;AccountName=[アカウント名];AccountKey=[アカウントキー]";
// Create blob REST proxy.
$blobRestProxy = ServicesBuilder::getInstance()->createBlobService($connectionString);

(中略)

?>

スリープ状態に移行するPowerShell コマンド

http://winscript.jp/powershell/239 より

$signature = @"

[DllImport("powrprof.dll")]

public static extern bool SetSuspendState(bool Hibernate,bool ForceCritical,bool DisableWakeEvent);

"@

$func = Add-Type -memberDefinition $signature -namespace "Win32Functions" -name "SetSuspendStateFunction" -passThru

$func::SetSuspendState($false,$false,$false)

をsleep.ps1 として保存しておいて実行する。

リモートデスクトップ経由でWindows8マシンを使っていると、電源メニューでは「切断」しか選択できず、shutdown.exe では休止またはシャットダウンしか出来ないために調べた結果。

ただし、リモートデスクトップ上でこのコマンドを実行してスリープに移行した後、すぐに手元のリモートデスクトップアプリケーションを終了させる必要がある。そうでないと再接続を試みてスリープ状態からすぐに復帰してしまう。(リモートからの接続時にスリープ状態からの復帰をしてくれるからこそ、節電のためスリープさせてもいいと思う訳ですが)

Team Foundation Services に Visual Studio 2008 から接続する際はコレクション名が必須

Team Foundation Sevices でアカウントホームページを作成した後、Visual Studio 2008 から接続するには https://hoge.visualstudio.com/DefaultCollection/ のように、末尾にコレクション名(既定では DefaultCollection) が必要。

(以下そこまでの経緯)
http://tfs.visualstudio.com/en-us/learn/code/connect-vs/
このサイトを見るまで、「 TF31002: この Team Foundation Server に接続できません」という表示に悩まされていた。接続する際のURLとして https://hoge.visualstudio.com/ または https://hoge.visualstudio.com/tfs/ を指定していたがどちらでもうまくいかない。

tfsにVS2008から接続できない

当然、 http://support.microsoft.com/kb/2673642 はインストール済み。http://www.microsoft.com/ja-jp/download/details.aspx?id=10834 を先にインストールしてから http://support.microsoft.com/kb/2673642 をインストールしても状況は変わらず。

以前から使っている場合、TFS2008, TFS2010 どちらの流儀でもなかったので悩んでしまった。

また、この過程で Internet Explorer で以下のサイトを信頼済みサイトに追加した。基本的にはドメイン単位での

  • tfs.visualstudio.com
  • tfs.app.visualstudio.com
  • ajax.aspnetcdn.com
  • *.live.com
  • *.windows.net
  • *.jquery.com

ID連携のおかげで様々なサイトをリダイレクトしながら移動するケースが増えており、単一サービスでも複数のサイトを信頼済みにしなければいけないケースが増えてきた。ファイアウォールのポート番号表のように、どのサイトを信頼済みにするべきか、という一覧表はどこかにないものか。

ADFS 2.0 マシンでの警告の抑制

ソース "MSSQL$MICROSOFT##SSEE" からのイベント ID 17137 の説明が見つかりません。このイベントを発生させるコンポーネントがローカル コンピューターにインストールされていないか、インストールが壊れています。ローカル コンピューターにコンポーネントをインストールするか、コンポーネントを修復してください。

イベントが別のコンピューターから発生している場合、イベントと共に表示情報を保存する必要があります。

イベントには次の情報が含まれています:

AdfsArtifactStore

指定されたリソースの種類がイメージ ファイルに見つかりません。

このようなイベントが定期的に記録されていたのを抑制するため、以下のようなSQLを実施した。

sqlcmd -S \\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query -Q "ALTER DATABASE AdfsArtifactStore set auto_close off"

具体的な原因は AdfsArtifactStore データベースが autoclose=自動終了 になっていたこと。自動終了を無効にするためのコマンドが上のコマンドになる。検索すると SSMS を利用してプロパティの変更をするような記事しか出てこなかったが、手元の該当マシンには SSMS が入っていなかったため sqlcmd.exe を利用することにした。

SQL 2012 ColumnStore

http://engineermemo.wordpress.com/2011/10/12/パーティションのスイッチを使用した-columnstore-インデ/

columnstore インデックスの説明を読んでいたところ、利用できるEditionが Enterprise のみだった。
→とはいえ「パーティションと組み合わせ出来たら最強なんじゃね?」。なかなかに神機能な雰囲気。

最近 Analysis Services と戯れていたところだったので、ある意味 Analysis Services の統合となるこの機能には興味津々。SQL構文のままアプリケーション側の変更なしで集計が早くなるので大変ありがたい。

あとはこれが SQL Azure に搭載されれば。

async/await パターンで同時アクセス数を制御する

http://stackoverflow.com/questions/10806951/how-to-limit-the-amount-of-concurrent-async-i-o-operations

http://blogs.msdn.com/b/pfxteam/archive/2012/02/29/10274035.aspx

http経由で大量のデータ取得アクセスをしないといけないような状況で、 async/await を何も考えずに使ったら数万件同時にtcpセッション開始してエラーになってしまった。

SemaphoreSlim を使って同時実行数を制限するようなサンプルが役に立った。セマフォで待たされる所も Async でスレッド制御を戻せるのが素敵。
でもTaskをすべて抱えるサンプルコードなので、さらに桁が多い状況ではちゃんと考えないといけない。だいたい10万件ぐらいが対象の時に役に立つパターン。

SQL Azure DataSyncを除外して各テーブルのレコード数調査

http://engineermemo.wordpress.com/2011/04/30/sql-azure-%E3%81%A7%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E5%8F%96%E5%BE%97/ にあるものをベースに、DataSync 関連のテーブルを除去したかったので以下のようなので調査。
   1:  SELECT
   2:      OBJECT_NAME(sys.indexes.object_id) AS object_name,
   3:      sys.indexes.name,
   4:  --    sys.indexes.type_desc,
   5:      sys.dm_db_partition_stats.row_count,
   6:      SUM(sys.dm_db_partition_stats.reserved_page_count) * 8.0 / 1024 AS [Size (MB)]
   7:  FROM
   8:      sys.dm_db_partition_stats
   9:      LEFT JOIN
  10:      sys.indexes
  11:      ON
  12:      sys.dm_db_partition_stats.object_id = sys.indexes.object_id
  13:      AND
  14:      sys.dm_db_partition_stats.index_id = sys.indexes.index_id
  15:  WHERE OBJECT_NAME(sys.indexes.object_id) NOT LIKE '%_dss_tracking'
  16:      AND sys.indexes.name NOT LIKE 'PK_DataSync%'
  17:      AND sys.indexes.type_desc = 'CLUSTERED'
  18:  GROUP BY
  19:      sys.indexes.object_id,
  20:      sys.indexes.index_id,
  21:      sys.indexes.name,
  22:  --    sys.indexes.type_desc,
  23:      sys.dm_db_partition_stats.row_count
  24:  ORDER BY
  25:      OBJECT_NAME(sys.indexes.object_id),
  26:      sys.indexes.object_id,
  27:      sys.indexes.index_id

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

当初は http://blog.clicdata.com/2012/07/31/table-row-count-and-size-in-sql-azure/ にあるSQL文を試していたのだが、2倍の数値が出て少し悩んでしまった。どういう理由で row_count の値をSUM で足したりしてるの…

Automating Windows Azure SQL Database Backup

http://msdn.microsoft.com/en-us/library/jj900675.aspx

Azure blob storage にエクスポートするための方法が書いてある。とりあえずのサンプルはコンソールコマンドを作成するためのコードになっている。

PowerShellコマンドレットにしとくと後で便利そう

今後はODBCがOLE DBよりも推奨される

http://www.infoq.com/jp/news/2011/09/OLE-DB-End

SQL Azure へオンプレミスSQL Serverからリンクサーバー設定をしようと Linked Servers to SQL Azure http://blogs.msdn.com/b/sqlcat/archive/2011/03/08/linked-servers-to-sql-azure.aspx を参照していたら、ODBC 利用だったので、なぜ OLE DB でないんだろう?と疑問に思ったのがきっかけ。

昔はアプリケーションからのデータアクセス手段がいろいろ必要だったけど、最近はどんどん WebAPI 化している。リンクサーバー とかSSISとか、データベース周辺以外での出番はあるかなあ。