Windows系エンジニアのためのElastic Map Reduce 1

初めに・・・
MapReduceが世に出て早10年、Amazon Elastic Map Reduce(以降EMR)のようにパブリッククラウド上でHadoopを使った分散処理を行えるようになって5年ほどが過ぎました。実際活用しようとするとLinuxを中心とするOpenSource界隈の知識が必要になるため、Windows系のエンジニアからはどうしても遠い存在になりがちです。
ところが最近EMRのWEBインターフェースが刷新されました。以前はコマンドラインでの操作が必須だったのが、WEBからの操作でもずいぶんと使いやすくなりました。この機会にEMRを使いこなしてBigDataの処理など学びたいと思います。
さてBigData処理には大別して二つあります。一つは大量の非構造化データを扱う処理。二つ目は大量の構造化データを扱う処理です。非構造化データの処理は自然言語処理、機械学習といった高度なソフトウェアサイエンスの知識が必要不可欠で、Hadoopで分散処理ができるようになったから一朝一夕に実現できる類のものではありません。二つ目の構造化データなら高度なコンピュータサイエンスの知識がなくとも、手元のデータを解析して何らかの答えを得ることは可能です。だから、ここでは構造化データを扱うことを最初の目標としたいと思います。
構造化データならRDBを使えばHadoopなんか要らないのでは?と考えるかもしれませんが、RAWレベルのログデータなんかを1年分集めると、中小企業でも数十GB~数百GBに達してしまいローレベルのサーバーでは到底解析できないサイズになってしまいます。これを解析できるサーバーを別途用意するというのは、中小企業にとっては大きなハードルなのです。
Hadoopの基本はMap Reduceにあるわけだけど、実際に使うためにはプログラムを開発せざる得ない。そしてプログラムを開発するとなると、テストやら何やらで結構時間がかかるもの。特に私みたいなWindows中心の開発者だと、Linux環境でのプログラミングに不慣れなこともあって、やたらと時間がかかったりします。でも構造化データを扱うならばMap Reduceは必要ありません。HadoopにはHiveやPigといった構造化データを手軽に扱うための仕組みが用意されています。
HiveはHadoop上で動作する簡易RDBです。一般的なRDBと異なりSELECT文は充実していますが、INSERTやUPDATEと言ったデータを更新するための機能が著しく制限されています。カンマ区切りやタブ区切り形式で保存されたテキストファイルや、Hive独自形式のデータベースファイルに対して集計処理を行えます。Hiveに与えたSQL文は数段階の処理に分解されMap Reduceアプリケーションにより集計されます。下手なMap Reduceアプリケーションを作るより余程高速に動作するので、まずはHiveを使った集計処理を学びたいと思います。

Visual Studio Onlineでgitを使用する

Visual Studio OnlineではMicrosoft独自のTeam Foundation Version ControlかOpen Sourceのgitを選択することができますが、gitを使用する場合には追加でパスワードの設定が必要です。
右上に表示されている自分の名前をクリックして、ドロップダウンメニューから「My Profile」を選択します。表示されるダイアログから「CREDENTIALS」を選択して、「Enable alternate credentials」をクリックします。「User name (secondary)」の右側にある「Edit」、「Password」の右側にある「Change」を栗㏍すいて、gitで使用したいユーザーIDとパスワードを設定します。
この時、設定するユーザーIDとパスワードはWindows Live IDで使用しているIDやpasswordとは別のものにしてください。
gitをhttp接続で使用する場合の認証手段はベーシック認証の選択肢がありませんから、Windows Live IDを使ったシングルサインオンに対応できません。また、残念なことに標準的なgitクライアントはベーシンク認証のユーザーIDとパスワードを平文で保存するため、パスワードの漏えいリスクが高いのです。そのためVisual Studio Onlineではgitで使用するユーザーIDとパスワードはWindows Live IDのユーザーIDやパスワードとは別に設定するように作られています。

ASP.NET MVCの標準ユーザー認証のDBを任意の場所に変更する

ASP.NET MVCの標準ユーザー認証機能の保存先データベースはApp_DataASPNETDB.MDFになっている。これを任意のデータベースに変更するためには、Visual Studio 2010のコマンドプロンプトを開いてaspnet_regsqlを実行してDBに必要なテーブルなどを作成した後、Web.configのconnectionStringsに書かれているApplicationServicesの接続文字列を変更すれば良い。
[C#] #27. フォーム認証によるユーザーの認証

VC++ .NET 2003でUACを有効にしたアプリケーションを作成する。

VC .NET 2003以前の開発環境はマニフェストを実行ファイルに埋め込む機能が、設定画面に用意されていません。そこで手動で作成したマニフェストをリソースとして埋め込む必要があります。
まずは以下のようにマニフェストファイルを作成します。赤字の部分がUACに関する部分です。requestedExecutionLevelのlevelにrequireAdministrator(管理者権限が必要)を指定すると、実行時にUACの画面が表示されます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="Microsoft.Windows.WinSafeCleaner"
type="win32"
/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="true"/>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

これをRT_MANIFESTという名称のカスタムリソースの、リソース番号1として実行ファイルに埋め込みます。
参考資料
マニフェスト・ファイルをアプリケーションに組み込むには?

Excelで計算がされない

Excelで複雑な計算式を多数入力していると、自動計算やF9による再計算で、一部の数式が再計算されずに正しい値を表示しない事があります。
CTRL+ALT+SHIFT+F9で再計算する
Excelは値が変更されたセルや、再計算が必要なセルを記憶しており、必要最低限の計算量で再計算をおこなうようになっています。稀にこれが正しく動作せずに再計算が行われなくなる場合があります。この場合はCTRL+ALT+SHIFT+F9を押すことで、変更されているか否かにかかわらず、すべての式を計算します。これによって次回から変更されたセルに関する情報がリセットされ、正しい計算結果を返すようになります。
数式のどこかにエラーがある
数式のどこかで循環参照などのエラーがあると、そこで計算をやめてしまい、その他の式が計算されなくなる場合があります。この場合は循環参照を起こしている数式を正しく修正することで、正しい値を返すようになります。

Windows Vista以降でサービスから画面を表示する

Windows VISTA以降のWindowsではセッション0分離の機能により、サービスから直接UIを表示することができなくなりました。Microsoftの互換性情報では代替手段として「ユーザーログイン時に常駐プロセスを起動しサービスと通信を行う。」「WTSSendMessage関数を使用してメッセージボックス相当の表示を行う。」「CreateProcessAsUserを使用してログインユーザー権限でアプリケーションを起動する。」の三つの方法が提示されています。ここでは最後の「CreateProcessAsUserを使用してログインユーザー権限でアプリケーションを起動する。」サンプルを提示します。
サービスから画面を表示するにはRemote Desktop Services APIを使用します。
WTSGetActiveConsoleSessionId関数で物理コンソールのセッションIDを取得します。
WTSQueryUserToken関数で取得したセッションIDのユーザートークンを取得します。
DuplicateTokenEx関数で取得したユーザートークンを複製し、プライマリトークンを作成します。
CreateEnvironmentBlockを使用してユーザーの環境変数を取得します。
CreateProcessAsUser関数を使用して画面を表示するプロセスを起動します。

BOOL    bRet(FALSE);
HANDLE  hUserToken(INVALID_HANDLE_VALUE);
if (::WTSQueryUserToken(WTSGetActiveConsoleSessionId(), &hUserToken))
{
    SECURITY_ATTRIBUTES sa;
    memset(&sa, 0x00, sizeof(sa));
    sa.nLength	= sizeof(SECURITY_ATTRIBUTES);
    HANDLE	hDupedToken(INVALID_HANDLE_VALUE);
    if (::DuplicateTokenEx(hUserToken, 0, &sa, SecurityIdentification, TokenPrimary, &hDupedToken))
    {
        PVOID	lpEnvironment(NULL);
        if (::CreateEnvironmentBlock(&lpEnvironment, hUserToken, FALSE))
        {
            STARTUPINFO stStartUpInfo;
            memset(&stStartUpInfo, 0, sizeof(STARTUPINFO));
            stStartUpInfo.cb        = sizeof(STARTUPINFO);
            stStartUpInfo.lpDesktop = _T("winsta0¥¥default");
            PROCESS_INFORMATION ProcessInfo;
            memset(&ProcessInfo, 0, sizeof(PROCESS_INFORMATION));
            ::CreateProcessAsUser(hDupedToken, _T(""), (char*)(const char*)strCmd, NULL, NULL
                    , FALSE, CREATE_UNICODE_ENVIRONMENT, lpEnvironment, NULL, &stStartUpInfo, &ProcessInfo);
        }
    }
}

Hello Android 2:Hello Worldを作ってみる

・・・と言っても、HelloWorldは日本語のページが用意されています。なので、公式のHelloWorldでは書かれていない事を中心に書いていこうと思います。
AVD(仮想Android)の作成
まずはAVD(Android Virtual Device)なるAndroidの仮想OSを設定します。通常はこの仮想OS上でデバッグをおこないます。コマンドプロンプトを起動して、Android SDKのをインストールしたフォルダ配下のToolsに移動します。ここで”android create avd –target 2 –name my_avd”と入力するとAVDが作られます。パラメータ無しでandroidと指定するとGUIが起動するので、私としてはGUIを使うのがお勧めです。
GUIを起動してVirtual Devicesを選択して、Newボタンをクリックします。表示されたダイアログから、AVDの名称、Androidのバージョン、使用メモリ、画面サイズなどを指定してCreate AVDボタンをクリックします。これでAVDが作成されます。作成したAVDを選択してStartボタンをクリックすると、AVDが起動します。
作成したAVDを初めて起動する時には、相当に時間がかかります。何分と言うレベルではなく、何十分も待つ事になるので気長に待ってください。

Hello Android 1:SDKのインストール

いままでスマートフォンを避けて来たのだけれど、IS03の発売を記念してAndoroid Programmingを始めてみようと思う。
Androidの開発者向けの情報はAndroid Developersにあります。幸いな事に一部の情報は日本語で提供されているので、あまり躓かずにスタートできると思います。
まずは開発環境の構築です。
Android用のアプリケーションは原則としてJavaで開発します。そのためにJDKの5.0または6.0が必要です。OracleのJavaホームページからJDKをダウンロードします。ここではJava SE JDK 6 Update 22を使う事にします。インストーラをダウンロードしたら、jdk-6u22-windows-i586.exeを実行しWizardに従ってインストールしていきます。
Android用の等号開発環境には原則としてEclipseを使います。ダウンロードサイトには様々な開発言語に合わせたパッケージが用意されていますが、あまりオオーバースペックなパッケージをダウンロードすると重たさに苦鳴をあげることになります。ここは無難にEclipse IDE for Java Developersあたりにしておきます。EclipseのインストールはダウンロードしたZIPファイルをインストール先のフォルダに解答するだけです。解凍後にEclipse.exeを起動すると開発環境が立ち上がります。
続いてAndroid SDKをインストールします。Android SDK ダウンロードページからWindows用のZIPファイルをダウンロードします。ダウンロードしたZIPファイルをSDKのインストール先フォルダに解凍し、SDK Manager.exeを実行します。あとはWizardにしたがってインストールするだけです。
android_sdk_install
最後にEclipseにAndroid用のプラグインをインストールします。Eclipseを起動してメニューの”Help->Install New Software”を選択して、表示されたダイアログの”Work With”にプラグインのダウンロード元URLとして”https://dl-ssl.google.com/android/eclipse/”を入力すると、名前にインストールするプラグインが表示されます。表示されたプラグインにチェックを付けたら、ウィザードに従って次に進めていってください。
eclipse_plugin
Pluginのインストールが終わったら、Eclipseを再起動してください。Eclipseのメニューの”Window->Setting”を選び設定画面を開きます。Androidという項目が増えているので、Android SDKのインストール先フォルダを指定して適用します。
eclipse_setting
以上で開発環境の準備は完了です。

感染した未知のコンピュータウィルスを削除するには・・・実践編2/2

続いてレジストリの確認を取ります。実践編1/2でウィルスが起動しないようにしたあと、for VirusCheck OSを起動して、レジストリエディタから全レジストリの内容をエクスポートします。エクスポートしたレジストリはテキストファイルイン保存されますので、for Refrence OSのウィルス感染前のレジストリをエクスポートしたものと比較して変更箇所を検証していきます。
registry
実際に細かく追っていくとかなり根気のいる作業です。今回のウィルスでは以下の場所に改変がくわえられ、ログオン時にウィルスが起動されるようになっていました。

[HKEY_LOCAL_MACHINE&yenSOFTWARE&yenMicrosoft&yenWindows NT&yenCurrentVersion&yenWinlogon]
“Userinit”=”C:&yen&yenWINDOWS&yen&yensystem32&yen&yenuserinit.exe,C:&yen&yenProgram Files&yen&yenCommon Files&yen&yensvchost.exe -s”

今回のウィルスは比較的シンプルな作りになっていたので、ファイル1つ、レジストリ1箇所だけで済んでいます。etcやDNSサーバの情報を改ざんしたり、電子証明書を改ざんしたり、ドライバを組み込んだり、ブラウザやエクスプローラーにプラグインを組み込んだりと、複雑な動作をするウィルスもいます。気を抜かずに根気よく一つ一つ確認していく事が重要です。
ウィルスを駆除する為に削除するファイルやレジストリが明確になったら、実際に感染した環境でそれらのファイルを削除したり、あるいはレジストリを修復していく事になります。ウィルスが常駐している状態では削除などの操作はウィルスによってトラップされており、おこなえないのが常です。OSのモジュールの一部が置き換えられている場合には、たとえセーフモードで起動したとしてもウィルスは常駐してしまいます。KNOPPIXなどのCDからブートするLinux環境から、NTFSのファイルシステムをマウントして、ファイルの削除などをおこなうのが一番確実でしょう。
今回のウィルスは幸いな事に、セーフモードのコマンドプロンプトで起動すれば、ウィルスが常駐する事を防げます。したがってセーフモードのコマンドプロンプトで起動した後、C:¥Program Files¥Common Files¥svchost.exeのシステム属性と非表示属性を解除し、ファイルを削除することで除去できました。

Failed to create database ‘DevelopmentStorageDb20090919’

Windows Azureのアプリケーションをデバッグ実行しようとすると次のメッセージが表示される。

「Windows Azure Tools: Failed to initialize the Development Storage service. Unable to start Development Storage. Failed to start Development Storage: the SQL Server instance ‘localhostSQLExpress’ could not be found. Please configure the SQL Server instance for Development Storage using the ‘DSInit’ utility in the Windows Azure SDK.」

ローカルにインストーすしているSQLServerの接続設定で、リモート接続やWindows認証を無効にしている場合には、これを有効にしてからやり直す必要があります。また使用するSQL ServerがSQLEXPRESS以外の名称の場合にはC:\Program Files\Windows Azure SDK1.1\bin\devstore\DSInit.exeを実行して手動でAzure Data Storageの初期化をおこなう必要があります。
ですが手順に従って「DSInit.exe /SQLInstance:サービス名」としても以下のメッセージが表示される場合があります。

「Failed to create database ‘DevelopmentStorageDb20090919’ : SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。 」

この場合には「DSInit.exe /SQLInstance:」とSQLInstanceオプションつきでサービス名を指定せずに実行してください。これでAzure Data Storageの初期化を行える場合があります。
どうもSQLServerのインストール後に、OSのコンピューター名などを変更している環境で、上記の問題が発生するようです。
参考:Visual Studio 2010 Problem: Windows Azure Tools: Failed to initialize the Development Storage service.