Jack of all trades

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

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

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

Transact-SQLのISNULL内では型比較が必ず発動するらしい

仕事の備忘録。

ISNULL (Transact-SQL)

check_expression
NULL かどうかを調べる式です。 check_expression は任意のデータ型です。
replacement_value
check_expression が NULL の場合に返される式です。 replacement_value は、暗黙的に check_expresssion の型に変換できる型である必要があります。

MSDNに記載されている通り、判定の結果がNULLだった場合に置き換える値は、判定される値と同じ型、もしくは暗黙的に変換できる型でなければ型変換エラーとなります。

型を比較する処理は実際にNULLが入ってきた場合にのみ発動するかと思いきや、NULLでない値が入っている場合でも発動する模様。

DECLARE @d AS DATE = GETDATE()
SELECT ISNULL(@d, 1)

これを実行すると型変換エラーが発生します。

メッセージ 206、レベル 16、状態 2、行 2
オペランド型の不整合: int は date と互換性がありません

ちなみにDATETIME型の場合はINT型から暗黙の型変換が可能なためエラーにはなりません。

DECLARE @dt AS DATETIME = GETDATE()
SELECT ISNULL(@dt, 1)

まぁNULLでない値で型変換エラーになるということはNULLが入ってきても同じくエラーになるので、どちらにしても型をきちんと合わせるのが正解なんですが、たまたまこのエラー原因に行き着くのが難しいケースにぶち当たったのでメモ。初歩的なことで理解してないことが結構あります。

Bash on WindowsでRVMインストールからRuby on Rails環境構築まで

※検証環境はWindows 10 Pro Insider PreviewのOSビルド14352.1002です。

Bash on Windows(正確にはBash on Ubuntu on Windowsですね)の環境を作って壊してまた作る日々です。
ようやくrvmのインストールからRuby on Rails環境構築までが上手いこといくようになったので、備忘録的に書き起こしておきます。
まぁ正直、最初のバージョンからちゃんと動いてるっぽい*1ことも考慮するとrbenv使った方がいいんじゃないかな(以下Qiitaの記事参照)

qiita.com

rvmのインストール

まずはgitをインストール。

sudo apt-get install

curlはインストールされているようなので、そのままrvmのインストール。公開鍵の設定をしてからインストール実行。

curl -sSL https://rvm.io/mpapis.asc | gpg --import - 
curl -L https://get.rvm.io | bash -s stable

~/.bashrcの末行に以下を追加。

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"

.bashrcを再読み込み。

source ~/.bashrc

一応rvmのバージョン確認を実行して正常にインストールされていることを確認。

rvm -v
rvm 1.27.0 (latest) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

Rubyのインストール

rvm経由でRubyのインストール。とりあえずバージョンは2.3.0を選択。

rvm install ruby-2.3.0

インストールが完了したら一応バージョン確認。

ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

Ruby on Railsのインストール

まずはnodejsのインストール。

sudo apt-get install nodejs

一応Rails環境用のgemsetを作っておく。globalが散らかってもいいという方はご自由に。

rvm gemset create rails
rvm gemset use rails

環境作成用のディレクトリを作成して移動。

mkdir /mnt/c/BashOnWindows/src/rails/
cd /mnt/c/BashOnWindows/src/rails/

Railsのインストール。割とすんなりいけるはず。

gem install rails

おもむろにrails newする。プロジェクト名は任意で(ここではtrial01とした)

rails new trial01

作成されたディレクトリに移動してbundle installを実行。

cd trial01/
bundle install

で、エラー発生。

Unfortunately, an unexpected error occurred, and Bundler cannot continue.

First, try this link to see if there are any existing issue reports for this error:
https://github.com/bundler/bundler/search?q=parent+directory+is+world+writable+but+not+sticky&type=Issues

If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at:
https://github.com/bundler/bundler/issues/new

どうやらbashにおける新規ファイル作成時の付与権限がデフォルトのままだと「~/.bundle」ディレクトリに対する操作がうまく動かないらしい。 Bash on Windowsのissues専用GitHubで解決策を書いてくれています。ありがたい。

github.com

ということで、コメントに従って以下を実行。

umask 007
rm -rf ~/.bundle
bundle install

正常に実行完了!お待ちかねのrails sを実行。

rails s

ブラウザを開いて「http://localhost:3000」にアクセス。無事に動いてます。
f:id:sadynitro:20160605133818p:plain

ちなみに/mnt/c/配下の領域に環境作成用ディレクトリを作成しているので、Windows側のVSCode等で編集できます。
f:id:sadynitro:20160605134243p:plain

これでRailsアプリケーションの開発環境が構築できました。本番環境へのデプロイ等々が心配な感じですが、そのあたりは順番に実験していきます。

疲れた。

*1:Bash on Windowsの1回目のUpdateでは壊れてましたけどね