Jack of all trades

master of none. 多芸は無芸を地で行く、自作自演何でも屋。

SQL Server 2017 CTP2.0上でPythonのコードを実行する

去る4/19に開催されたMicrosoft Data Ampにて、SQL Server vNextがSQL Server 2017になることが正式に発表されました。それと同時にSQL Server 2017 Community Technology Preview 2.0 (CTP2.0)の提供が開始しています。

blogs.technet.microsoft.com

SQL Server 2017 CTP2.0で提供される目玉機能として、SQL Serverのデータベース上でPythonのコードが実行できるという発表がありました。 現状はWindows OS上で動作するSQL Serverでのみ有効な機能なようです。追々その他の環境でも動作することを期待しています(on Linuxで使いたい)

まだまだ情報は少ないですが、セッション動画内のデモ等を参考に見様見真似で動作確認してみます。

1. SQL Server 2017 CTP2.0をインストール

以下のサイトからインストールメディアをダウンロードします。 www.microsoft.com

setup.exeを実行して新規インストールを開始します。

f:id:sadynitro:20170422141845p:plain

機能の選択画面でデータベースエンジンサービスに加えてMachine Leaningサービスにチェックを付けます。

f:id:sadynitro:20170422141900p:plain

データベースインスタンスのインストールが完了したら、追加でSQL Server Management Studioをインストールします。

f:id:sadynitro:20170422142049p:plain

2. SQL Server Management Studio (SSMS)上でPythonコードを実行してみる

インストールが一通り完了したら、SSMSを起動してクエリエディタ上でPythonコードを実行してみます。 Pythonのコードを実行するには「execute sp_execute_external_script」で外部スクリプトとして記述します。

execute sp_execute_external_script
@language = N'Python',
@script = N'
import sys
import os
print("*****")
print(sys.version)
print("Hello Python!!!")
print(os.getcwd())
print("*****")
'

実行すると恐らく以下のエラーメッセージが表示されます。

メッセージ 39023、レベル 16、状態 1、プロシージャ sp_execute_external_script、行 1 [バッチ開始行 0]
SQL Server のこのインスタンスでは、'sp_execute_external_script' は無効になっています。これを有効にするには、sp_configure の 'external scripts enabled' を使用します。

どうやらデフォルトでは外部スクリプトの実行が無効になっているので有効にしてやる必要があります。

3. 外部スクリプトの実行を有効化する

SQL ServerでRやPythonといった外部スクリプトを実行するためには、グローバル構成設定(sp_configure)にある「external scripts enabled」を有効にする必要があります。 以下のスクリプトを実行して有効化します。

USE master;  
GO  
EXEC sp_configure 'external scripts enabled', '1';

RECONFIGURE

※ 設定変更後にSQL Serverのサービスを再起動する必要があるので注意してください。

4. SQL Server LaunchPadの有効化

外部スクリプトの実行を有効化して再度Pythonコードを実行するスクリプトを実行すると、今度は以下のエラーメッセージが表示されます。

メッセージ 39011、レベル 16、状態 1、行 0
SQL Server が LaunchPad サービスと通信できませんでした。サービスの構成を確認してください。

外部スクリプトを実行するためのサービスと通信するためのサービス(LaunchPadサービス)なるものが必要なようです。

SQL Server 構成マネージャー」を開いてSQL Server LaunchPadを有効化します。 f:id:sadynitro:20170422144315p:plain

5. 再度Pythonコードの実行を試みる

再度Pythonコードを実行するスクリプトを実行すると、今度こそ無事に実行完了して実行結果が返ってきます。間に色々挟まっている所為かレスポンスはかなり遅いですがちゃんとPythonのコードが実行出来ていることを確認できました。 f:id:sadynitro:20170422145731p:plain

6. ついでにTensor Flowを動作させてみる

せっかくPythonコードが実行できることを確認できたので、機械学習用途で利用する為の第一歩としてTensor Flowが動作するか確認してみます。

デフォルトで幾つかのライブラリがインストールされていますが、Tensor Flowは含まれていないようなので、pipでインストールします。 SQL Server 2017のPython環境はデフォルトで「C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES」の中に一式収まっているようです。 このフォルダ配下の「Scripts」フォルダの中にpipが存在するので、コマンドプロンプトでこのフォルダに移動し、以下のコマンドを実行することでTensor Flowをインストールできます。

pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.1-cp35-cp35m-win_amd64.whl

インストールが完了したらTensor Flowが動作していることを確認できる最低限のコードを書いて実行してみます。

execute sp_execute_external_script
@language = N'Python',
@script = N'
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"

import tensorflow as tf
hello = tf.constant("Hello, TensorFlow!")
sess = tf.Session()
print(sess.run(hello))
'

とりあえずTensor Flowが動作していることが確認できました。 f:id:sadynitro:20170422151008p:plain

7. まとめ

SQL Server 2017 CTP2.0のインストールから外部スクリプトとしてPythonコードを実行できるところまで確認しました。
しかしながら、実用(主に機械学習用途)に際しては最低限以下について確認が必要かなと思っています。

  • DBのテーブルに格納されているデータに対してPythonのコードで必要な操作ができることを確認する
  • Tensor Flow等のライブラリで実際に学習モデルを構築して正常に動作することを確認する

ということで、今後の課題として取り組んでいきたいと思います。乞うご期待。

Visual Studio Team Servicesでデフォルト有効になったNotificationの設定

Visual Studio Team Services(VSTS)のリリースノートにも記載がありましたが、Out of the box notificationがデフォルトで有効化されています。*1

以下は@kkamegawaさんによる該当リリースノートの和訳。

kkamegawa.hatenablog.jp

突然VSTSからメールで通知が来るようになってビックリされた方もいらっしゃるかもしれないので、Notificationの設定についてご紹介します。

チームプロジェクト全体の設定

チームプロジェクト全体の設定画面で「Notification」のタブを選択すると、通知の一覧が表示されます。
各通知の「…」をクリックすると、通知の有効・無効設定や通知の設定内容を参照することができます。
デフォルトで全て有効になっていますが、不要であれば無効にしておくとよいでしょう。

f:id:sadynitro:20170411221337p:plain

また「+NEW」ボタンをクリックすると、新たに通知を設定することができます。
設定の1画面目で通知の分類とテンプレートを選択します。

f:id:sadynitro:20170411221601p:plain

2画面目で通知の条件を設定して完了です。

f:id:sadynitro:20170411221608p:plain

ユーザー個別の設定

通知の設定はユーザー個別に設定することもできます。
チームプロジェクト全体で通知を幾つか設定しておいて、ユーザーによっては一部の通知だけ受け取ったり、全て無効にしたりという設定が可能です。

設定画面を開くには画面右上のアイコンをクリックして「Notification setting」を選択します。

f:id:sadynitro:20170411221539p:plain

通知の一覧が表示されるので、右側にあるトグルで通知のON/OFFを設定します。 ちなみにチームプロジェクト全体の設定で無効になっている通知は一覧に表示されません。*2

f:id:sadynitro:20170411221829p:plain

以上、VSTSのNotification設定の紹介でした。
冒頭でも述べた通り、いきなりメール通知が来てビックリされた方もいらっしゃると思いますが、Notificationの機能はService Hooksと同様に便利な機能なので、本記事を参考に適切に設定していただければと思います。

*1:VSTSのテナントによって更新が反映されるタイミングが異なるので、4/11現在でまだ反映されていない可能性があります。

*2:Extensionsに関する通知についてはチームプロジェクト全体の設定に入っていなくても勝手に表示されます。

SQLServer2016の製品版自習書と業務で使用するT-SQLの強化ポイント備忘録

不意に、手元にダウンロードしていたSQLServer2016の自習書がCTP時のものだったことに気付いたので、製品版の自習書を探して入手。

SQL Server 2016 - マイクロソフト クラウド プラットフォーム

SQLServer2016におけるT-SQLの新機能について、R統合やJSON対応が目玉として注目される中、どっちかというと業務ではこっちの方が必須になるであろう強化ポイントがあったので備忘録として書き残すことにします。

オブジェクトの存在を確認して存在する場合は削除するクエリ

とても地味ですが絶対使います。
例として「'obj1'という名前のオブジェクトが存在するかチェックして、存在する場合は削除する」というクエリを書くとします。 SQLServer2014までは以下のような感じです。

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'obj1'))  
  DROP TABLE obj1

SQLServer2016からは以下のようにかなり簡潔に書けます。

DROP TABLE IF EXISTS obj1

バージョンアップごとの自習書確認のすゝめ

本エントリーは本当に1機能をピックアップしただけの備忘録なので、どっちかというと冒頭に記載した自習書を確認することをお勧めします。
最上位エディションでしか使えない機能やゴリゴリの分析機能だけでなく、T-SQLSQLServerのバージョンが上がるごとにちょっとずつ便利な機能が追加されているので、冒頭に記載した自習書等を確認して有用な情報を仕入れることをおすすめします。

Azure上の仮想マシンに対してVPN(ポイント対サイト)接続する

仕事の関係でAzure上に作成した仮想マシンに対してクライアントPCからVPN接続できる環境を準備する必要があり、その際の作業記録というか備忘録も兼ねてブログにまとめておきます。

基本的には下記サイトの通りに進めることで環境を構築することができたのですが。幾つかハマりどころがあったのでそのあたり補足しながら手順をまとめます。

docs.microsoft.com

1. 実現したい環境

実現したい環境の構成は以下の通りです。

といった構成でポイント対サイトのVPN接続を確立したクライアントからのみリモートデスクトップ接続やWebサイトへのアクセスできる環境の構築を目指します。
アドレス空間やサブネット、VPNゲートウェイのアドレスプールの設定は一例です。アドレスの切り方は、

だけ注意すればなんでも良いかと思います。

上述の公式ドキュメントでは、まず仮想ネットワークを作成し、その後で仮想マシンを作成するという手順になっていますが、大概の場合はまず仮想マシンを作成してから設定していく(と思う)ので、そのような手順で進めていきます。

2. 具体的な手順と注意事項

2.1. 仮想マシンの作成

仮想マシン作成の細かい手順については割愛します。公式ドキュメント等、他所をご参照ください。

押さえるべきポイントは以下の通り。

2.2. 仮想ネットワークの設定

仮想マシン作成時に作成されたリソースグループに含まれるVnetに対して以下の設定を行います。

アドレス空間の設定
f:id:sadynitro:20170201224405p:plain

※※※何故かここで仮想マシンを囲うアドレス空間(デフォルト)とゲートウェイ用のアドレス空間をそれぞれ作成しないと最終的にうまいこと接続できませんでした。この辺り誰かに詳しく教えてほしい…。

サブネットの設定
f:id:sadynitro:20170201224450p:plain

2.3. 自己証明書とクライアント証明書

ここで一旦Azureのポータルから離れてクライアントVPN接続用の証明書の作成を行います。

docs.microsoft.com

Windows10用のWindows ソフトウェア開発キット(SDK)をインストールする必要があるのでその点は注意。
(開発キットなどインストールしたくない!という方は別の手段で証明書を取得してください)
作成自体は手順に従って進めれば問題ないかと思います。

2.4. 仮想ネットワークゲートウェイの作成

クライアントからVPN接続するための口として仮想ネットワークゲートウェイを作成します。
新規作成メニューの検索から「gateway」などのキーワードで検索するとすぐ見つかります。

f:id:sadynitro:20170201224533p:plain

設定は以下の通り。 もちろんゲートウェイの種類はVPNで。VPNの種類はルートベース、SKUは実験目的であればBasicで良いと思います。仮想ネットワークは上述で設定済みのVnetを選択します。

f:id:sadynitro:20170201224553p:plain

作成された仮想ネットワークゲートウェイの設定画面で「ポイント対サイトの構成」画面を開き、アドレスプールを設定します。
ここでは「172.31.0.0/24」とします。
次に作成済みのルート証明書情報を登録します。
ルート証明書の.cerファイルをテキストエディタで開き、下の画像の通りにBASE64コードをコピーして、設定画面の公開証明書データのテキストボックスにペーストします。

f:id:sadynitro:20170201224634p:plain

f:id:sadynitro:20170201224725p:plain

※※※証明書のBASE64コードのコピー時の注意点として、開いたテキストエディタによってはそのままコピーすると改行コードが含まれてしまい、ポイント対サイトの構成を保存しようとした時点でエラーになる可能性があるので、その場合は改行を除去して(コードを1行にして)再度コピー、保存してみてください。

2.5. クライアントVPNの設定

ポイント対サイトの構成を保存したら「VPNクライアントのダウンロード」ボタンが有効になるので、64bitOSの場合は「AMD64」32bitOSの場合は「x86」を選択してダウンロードしてください。

f:id:sadynitro:20170201224737p:plain

ダウンロードしたVPNクライアントのインストールすると、タスクトレイのネットワーク接続メニューの一番上にVPN接続が表示されるようになります。 クリックすると設定メニューのVPN設定画面が開くのであとは接続するだけです。

f:id:sadynitro:20170211161825p:plain

f:id:sadynitro:20170211162027p:plain

2.6. 接続確認

クライアントブラウザから仮想マシンのローカルIP宛でIISのDefault Web Siteにアクセスできることを確認します。
ネットワークセキュリティグループの受信セキュリティ規則にhttpの許可を追加していないので、VPN接続を確立していない場合はアクセスできないはずです。

f:id:sadynitro:20170211162637p:plain

2.7. ネットワークセキュリティグループの設定

ここでさらにネットワークセキュリティグループの受信セキュリティ規則からRDPの許可を削除します。
これにより、仮想マシングローバルIP宛でもリモートデスクトップができなくなり、完全にVPN接続を確立したクライアントからのみアクセスできる環境になります。

f:id:sadynitro:20170211163235p:plain

グローバルIP宛の接続ができないことを確認します。

f:id:sadynitro:20170211163600p:plain

VPN接続を確立した状態であればローカルIP宛で接続できます。

f:id:sadynitro:20170211163548p:plain

3. まとめ

以上、Azure仮想マシン(WindwosServer2012R2)とクライアントPC(Windows10)のポイント対サイト接続環境を構築する手順でした。
最終的にVPN接続を確立したクライアントのみ、Webサイト接続、リモートデスクトップ接続できることを確認しました。
冒頭に書いた通り、基本的には公式ドキュメントに従えば構築できると思いますが、幾つか注意点・ハマりどころがあるので、躓いたら本記事を参考にしてみてください。

MemotchUWPをリリースしました

Windows Phone 8.xのアプリとしてリリースしたMemotchをUWPに移植しました。一応若干の機能追加もあります。

www.microsoft.com

Windows Phone 8.x版のMemotchについては以下のエントリーで幾分か説明しています。
Windows Phoneアプリ作りました - Jack of all trades
memotchをアップデートしました - Jack of all trades

基本的にはWindows 10 Mobileでの利用を想定していますが、タブレットやデスクトップでも利用可能です(ウィンドウ幅は狭めの方が使いやすいかもしれません)

以下、Windows Phone 8.xアプリのMemotchから追加になった要素をご紹介します。

1. アクションタイルを追加

選択できるアクションの種類を増やしました(多少)
とりあえずこの辺↓

f:id:sadynitro:20161129215426p:plain

2. メモの完了済みステータス

タスクとしては完了しているけど、削除せず残しておきたいメモについて「完了済み」にして残すことができます。
完了済みにすると、表示順としては一番下になり、後述のライブタイルには表示されなくなります。
(一度完了済みにしたメモを未完了に戻すこともできます)

f:id:sadynitro:20161129215436p:plain

3. ライブタイル対応

期限が今日以降、かつ完了済みでないメモをスタート画面のライブタイルに表示します。
(期限が近いものから最大5件)

f:id:sadynitro:20161129215540p:plain

大体こんな感じです。どうぞよろしく。