2015年9月30日水曜日

【Microsoft Azure】BootDiagnostics(起動時の診断)を使って起動しないCentOS6のトラブルを解決してみる

今までAzureで一番(ほんとならふたつみっつあるけど)困ってたことは、起動してからログに書くまでのエラーで立ち上がらないLinux仮想マシンの問題である!

過去にCentOS6が起動しなくなったり(SCSIドライバの問題だが完全には解決してないし)、yumでアップデートしたら起動しなくなったり。

いろいろ苦労してましたが、先日機能追加されたBootDiagnosticsで起動時のログがPreviewポータルから見れるようになりまして。
https://azure.microsoft.com/en-us/blog/boot-diagnostics-for-virtual-machines-v2/

ここでは仮想マシンV2じゃないとできないような書き方ですが、仮想マシン(クラシック)でも、仮想マシンの「診断」で「Boot diagnostics」にチェックを入れて有効にすると使えます。(何度か設定が保存できなかったりしましたが...)

再起動すると、以下のように起動時のログを見ることができます。


今まで起動しなかった仮想マシンを起動すると、こんなメッセージが出ました。
ちなみに、この問題はSELinuxがらみのようです。下記のブログにありました。
http://stackoverflow.com/questions/12867591/how-to-solve-kernel-panic-not-syncing-attempted-to-kill-init-without-er

私の場合は、他のマシンでディスクをマウントして、一旦kernelをダウングレード(/etc/grub.confを編集)から起動することで対応しましたが、これでかなりまともなデバッグができるのではないかと思います。

なお、Linux仮想マシンのエージェントをちょっと設定すると、起動時のログのみならずシリアルコンソール経由で画面のログを見ることができます。
https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-linux-agent-user-guide/

このサイトの記事を参考に、管理者権限で以下のコマンドを実行すると再起動後から有効になります。
# waagent -install
# waagent -serialconsole






2015年9月19日土曜日

【Microsoft Azure】通知ハブのObjective-Cサンプルがそのまま動作しないので指摘してみる

Objective-Cはすっかり忘却の彼方にあったのですが、ふとしたことで触って気がついたのでメモ。

まずはこちら、Azureの通知ハブの使い方。
https://azure.microsoft.com/ja-jp/documentation/articles/notification-hubs-ios-get-started/

結構細かく書いていて、コピペでもイケるんじゃないかと思わせる。
ただ、問題点が2つある。さらに、Xcode7+iOS9でもうひとつ。

1.認証エラーになる
正直なところ「ここでエラーになるのか」と思うのだが、401エラーなのでしょうがない。
「通知を送信する」の段落にある6のコード。SAS認証トークン作成部分。
// Construct authorization token string
        token = [NSString stringWithFormat:@"SharedAccessSignature sr=%@&sig=%@&se=%qu&skn=%@",
            targetUri, signature, expires, HubSasKeyName];
どうもここのパラメーターの並び順が違うようです。
srを一番最後にします。
// Construct authorization token string
        token = [NSString stringWithFormat:@"SharedAccessSignature sig=%@&se=%qu&skn=%@&sr=%@",
            signature, expires, HubSasKeyName, targetUri];
正直謎です...

2.正常な場合のHTTPの応答コード
次はREST APIのメソッド、APNSネイティブ通知の送信です。
https://msdn.microsoft.com/ja-jp/library/azure/dn223266.aspx
ここにある正常な応答コードは「200」と書かれていますが、どうも「201」のようです。
同じく「通知を送信する」の段落にある7のコード。
    // Send the REST request
    NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
        NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response;
        if (error || httpResponse.statusCode != 200)
        {
            NSLog(@"\nError status: %d\nError: %@", httpResponse.statusCode, error);
        }
        if (data != NULL)
        {
            xmlParser = [[NSXMLParser alloc] initWithData:data];
            [xmlParser setDelegate:self];
            [xmlParser parse];
        }
    }];
この中の「httpResponse.statusCode != 200」が「201」になるわけです。
    // Send the REST request
    NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
        NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response;
        if (error || httpResponse.statusCode != 201)
        {
            NSLog(@"\nError status: %d\nError: %@", httpResponse.statusCode, error);
        }
        if (data != NULL)
        {
            xmlParser = [[NSXMLParser alloc] initWithData:data];
            [xmlParser setDelegate:self];
            [xmlParser parse];
        }
    }];
なお、通知ハブのPythonでのチュートリアルでは「201」になっているので、これが正しいんでしょうね。
https://azure.microsoft.com/ja-jp/documentation/articles/notification-hubs-python-backend-how-to/

3.Xcode7から「Enable Bitcode」がデフォルトでYESに
Bitcodeについて調べるとこちらの方がXcode7でのコンパイル方法をブログで解説しています。(助かりました!)
http://qiita.com/Takumi_Mori/items/ace01198c43c8bac6df0
WindowsAzureMessaging.frameworkが「ENABLE_BITCODE」のオプションに対応した形式でビルドされていないので、Xcodeの「Build Settings」の「Build Options」の「Enable Bitcode」をNOにしてね、ってことです。

それよりも、サンプルをswiftにしていただきたい、今日この頃です。



2015年9月14日月曜日

【Microsoft Azure】SQLサーバー/SQL Databaseへ接続するSQLCMDとBCPをCentOSにインストールする

以前FreeTDSを使ってLinuxからSQL Databaseへの接続を試みましたが、今度はMicrosoftが提供しているSQLCMDから接続してみたいと思います。

なお、Ubuntuの手順はここに書いてあります。
http://blogs.msdn.com/b/joseph_idzioreks_blog/archive/2015/09/13/sql-server-sqlcmd-and-bcp-on-ubuntu-linux.aspx

もちろん、CentOSから挑戦します。
今回は6.7に導入してみますが、7系もほぼ同様かと思います。

まず、Cコンパイラとライブラリをインストールします。
# yum -y install gcc
yum -y install libssl glibc

次は、unixODBCをソースからインストールします。
RPMだと2.2系が入りますが、今回必要なのは2.3系です。
最後に、ライブラリのシンボリックリンクを作っておきます。
wget ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.0.tar.gz
# tar zxvf unixODBC-2.3.0.tar.gz 
cd unixODBC-2.3.0
# ./configure --disable-gui --disable-drivers --enable-iconv --with-iconv-char-enc=UTF8 --with-iconv-ucode-enc=UTF16LE
make
# make install
ln -s /usr/local/lib/libodbcinst.so.1 /lib/libodbcinst.so.1
ln -s /usr/local/lib/libodbc.so.1 /lib/libodbc.so.1
ldconfig

さて、SQLCMDとBCPのインストールです。
lddで依存するライブラリがあるか確認してからインストールします。
wget http://download.microsoft.com/download/B/C/D/BCDD264C-7517-4B7D-8159-C99FC5535680/RedHat5/msodbcsql-11.0.2270.0.tar.gz
# tar zxvf msodbcsql-11.0.2270.0.tar.gz 
# cd msodbcsql-11.0.2270.0/lib64/
# ldd ./libmsodbcsql-11.0.so.2270.0 
ldd: warning: you do not have execution permission for `lib64/libmsodbcsql-11.0.so.2270.0'
linux-vdso.so.1 =>  (0x00007ffc16a5e000)
libcrypto.so.6 => /usr/lib64/libcrypto.so.6 (0x00007ffa831d3000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ffa82fcf000)
librt.so.1 => /lib64/librt.so.1 (0x00007ffa82dc6000)
libssl.so.6 => /usr/lib64/libssl.so.6 (0x00007ffa82b77000)
libuuid.so.1 => /lib64/libuuid.so.1 (0x00007ffa82973000)
libodbcinst.so.1 => /lib/libodbcinst.so.1 (0x00007ffa8275b000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007ffa82474000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007ffa82230000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007ffa81f29000)
libm.so.6 => /lib64/libm.so.6 (0x00007ffa81ca5000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007ffa81a8f000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffa81871000)
libc.so.6 => /lib64/libc.so.6 (0x00007ffa814dd000)
libz.so.1 => /lib64/libz.so.1 (0x00007ffa812c7000)
/lib64/ld-linux-x86-64.so.2 (0x0000003093c00000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007ffa810c2000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007ffa80e96000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007ffa80c8b000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007ffa80a87000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007ffa8086d000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007ffa8064d000)
# cd ..
# ./install.sh install --force

インストールが終わったら、SQLCMDとBCPコマンドの動作を確認します。
# sqlcmd -S xxxx.database.windows.net -U ユーザー名 -P パスワード
1> Select @@version;
2> go
                                                                                                                                                                                                                                                                                                            
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Azure (RTM) - 12.0.2000.8 
Sep  2 2015 20:51:51 
Copyright (c) Microsoft Corporation
                                                                                                                                                                                                       

(1 rows affected)
1> exit
# bcp
usage: bcp {dbtable | query} {in | out | queryout | format} datafile
  [-m maxerrors]            [-f formatfile]          [-e errfile]
  [-F firstrow]             [-L lastrow]             [-b batchsize]
  [-n native type]          [-c character type]      [-w wide character type]
  [-N keep non-text native] [-q quoted identifier]
  [-t field terminator]     [-r row terminator]
  [-a packetsize]           [-K application intent]
  [-S server name or DSN if -D provided]             [-D treat -S as DSN]
  [-U username]             [-P password]
  [-T trusted connection]   [-v version]             [-R regional enable]
  [-k keep null values]     [-E keep identity values]
  [-h "load hints"]         [-d database name]

大雑把ですが、CentOSでもUbuntu同様に動かすことができました。