Jack of all trades

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

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では壊れてましたけどね

HoloLensおさわり会 with OITECに参加しました

タイトルそのまま。未来に触れてきました。

hololens.connpass.com

みつばたん( @mitsuba_tan )こと、 slikyfeel の泉本CEOが個人所有のHololensを使って各地で体験会を開催してくださっています。 此度は OITEC との共催という形で岡山で開催していただけました。

会場はご存じKLab株式会社様の岡山事業所をご提供いたきました。これに限らず、岡山のコミュニティイベントでしばしば会場提供していただいており大変ありがたい限りです。

百聞は一見に如かずとよく言われますが、Hololensに関しては本当に被ってみないとわからないですね。
なので、あまり細かいことは抜きにして単純に当日のレポートと個人的な感想を少々。

当日のレポート

Hololens本体。重さ579g(タブレットぐらいの感じ)
このサイズ、重量でCPU、GPU、メモリ、バッテリー、各種センサー等々がオールインワン。配線も一切出ていない。謎の技術としか言いようがない。 f:id:sadynitro:20160522214255p:plain

Hololens自体がサーバーになって、そこにアクセスすることで管理画面を開くことができます。
この画面上でHololens装着者が見ている画を共有したり、リソースモニターを確認したりできます。
これのおかげで、実際に装着して体験できるのが一人ずつでも、みんなでワイワイしながら会が進行していたので非常に良かったです。
f:id:sadynitro:20160522214259p:plain

取得した部屋のメッシュが表示された画面。
Hololensを被って部屋をグルグルすることによって 部屋の形状をスキャンしてメッシュを作成してくれているのが確認できます。
f:id:sadynitro:20160522214302p:plain

Hololensを被りなおしても配置されたオブジェクトはそのままなので、後半はかなり散らかった状態に。
お片付けできない子供部屋の様相。
f:id:sadynitro:20160522214306p:plain

画面共有を見ないで被ってる本人だけ見るととっても不審者な図、その1。
f:id:sadynitro:20160522214310p:plain

その2。
f:id:sadynitro:20160522214314p:plain

その3。スーツだと怪しさ倍増ですね。
f:id:sadynitro:20160522214318p:plain

個人的な感想

被った瞬間は「話に聞いてた通り、ちょっと視野角が狭い?」と思いましたが、操作してるうちにほとんど気にならなくなりました。視界の真ん中に見えるポインタをマウスポインタ的に使って操作することもあり、正面の対象に集中しているうちに気にならなくなります。使うアプリケーションの性質にもよるとは思いますが、その辺りの議論はまだ先の話になりそうです。
とにかくオブジェクトの物体感がすごい!普通のウィンドウ表示ですら物体感がある。遠近感もそうですが、ウインドウ表示している板状(?)のオブジェクトを思わず掴みたくなりました。
サンプルゲーム的なもの(ジャンルとしてはアドベンチャーゲームかな)も体験させてもらったのですが、NPCが本当にその場にいるかのように見えました。NPCの立っている位置で声のする方向も変わるので、本当に隣に立って会話しているような感じ。あぁどんなに頑張っても文章では言い表せない…。

まとめ

Hololensは未来でした。何にしても実際に被らないとわからないと断言できるので、どうにかして入手していただく…のは難しいとして、今後他所で開催されるHololensおさわり会に参加されることをお勧めします。差し当たり、松山、名古屋、博多での開催が予定されているようです。

hololens.connpass.com

とは言え競争率が高いので抽選に当たることを祈る感じにはなりそうですね。

ちなみに、HololensのSDKエミュレーター、Unityによる開発環境等々、Hololens用のアプリケーション開発も少しずつ見えてきているので、先んじてキャッチアップしたいですね。

とにかく単純に楽しかった!地方の開発者やコミュニティがモチベーション高く、最新のテクノロジーに立ち向かえるのはこういった会を企画・開催・協力してくださる有志の方々のおかげです。silkyfeel泉本様、KLab岡山事業所の皆様、OITECの皆様に最大級の感謝を。