銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

ASP.NET Core on Linux でも SignalR が使いたい

ASP.NET Core Advent Calendar一日目です。内容は直前で変えたのですが、Sessionまわりの話は空いている日のネタとして投下したいと思います。

qiita.com

SignalR もASP.NET Core対応が進んでいます。

github.com

ので現時点で動作するアプリをASP.NET Coreで作れるは作れるのですが、必要なライブラリは正式版としてnuget.orgには公開されてはいません。というところが今回のお話です。

続きを読む

MVP Summit のハッカソンで.NET Core CLIの拡張を作りました

MVP Global Summit 2016に参加して来たのですが、今年は木曜に行われるハッカソンまで参加してきました。ツアーで行くと木曜の朝出発するスケジュールなのでずっと参加できなあったのですが、今年は自分で予約したので参加できました。10個くらいのテーマがあって、その中から好きなものを選んでハッカソンする形式で、だれがどんなものを作ったかがブログにまとまっています。

blogs.msdn.microsoft.com

集合写真は最後に取ったらしく、日のあるうちにその日の宿のシアトル市内まで帰りたっかた私はちょっと早く帰ったので写っていません。ハッカソンは16時過ぎまであったのですが、16時にMicrosoft本社の構内にあるバス停から路線バスに乗って1時間弱でシアトル市内に着きます。日の入りが16時半ごろなのでつく頃にはかなり暗くなっていました*1

私が選んだテーマは.NET Core CLIの拡張だったのですが、これを選んだのは私だけのようで、ボッチハッカソンになりました。ほかのテーマでは、やはり人気はXamarinでした。作成したのは、.NET Core CLIを拡張した"dotnet add" コマンドです。使い方はリンク先のGIF画像でどうぞ。csproj対応の.NET Core 1.0 preview 3以降のCLIが必要です。

github.com

Visual Studioで開発していると気づきづらいのですが、Visual Studio Codeで開発しているとクラスファイル一つ追加するにも空ファイルを追加してusingやらnamespaceやらクラス宣言やらを手入力する必要があります。yo generator aspnet を使えばいいのですが、わざわざnodejsセットアップするのもねえということで作ってみました。とはいえ、CLI拡張のPoC的な意味合いが強く、本来であればオレオレ拡張というよりSDK本家に組み込んでほしい機能です。

github.com

.NET Core CLIの拡張そのものについては、このリポジトリのフォーク元のリポジトリを見ると解説してあります。

github.com

こちらのリポジトリではMSBuildのタスクを拡張して、CLIから呼べるようにする拡張のサンプルもあります。注意点としては、CLI拡張はNuGetパッケージとして作成し、参照する側のプロジェクトでそのNuGetパッケージを追加するのですが、用意されたスクリプトだとビルドしなおしても古いバージョンがキャッシュに参照されたまま更新されないので、キャッシュを消す必要があります。

rm ./nupkgs/*
rm $env:USERPROFILE\".nuget\packages\dotnet-add"

また作っていてどうすればいいかまだ分かっていないこととしては、

  • 拡張そのものがNuGetライブラリを参照する場合の追加の仕方
  • Workspace情報の参照の仕方(add拡張の例でいえば、namespaceをプロジェクトのdefaultNamespace+相対フォルダで自動生成したいが、defaultNamespaceをどうやって取得するか)

あたりになります。

余談ですが、お昼ごはんは「ハッカソンらしく、Unhealthy なピザだぜー(意訳)*2」ということでピザだったのですが、なんとピザ窯が敷地の外にやってきて焼きたてを食べることができました。写真を取り忘れたので、ほかの方のツイートをはっておきます。

*1:本社のあるレドモンド郊外からシアトル市内まで$2.75。シアトル市内から空港まではLinkで$3

*2:別に他のものがHealthyというわけでもない

SQL Server on Linux を RHEL や OpenShift で動かしてみる

さて、SQL Server on Linuxがpublic releaseになりましたので

blogs.technet.microsoft.com

早速、RHELやOpenShiftで動かしてみたいと思います。といっても、RHELで動かすのは手順通りやるとあっという間に動いてしまいます。

docs.microsoft.com

ちなみに、rootでリダイレクトするためだけにsudo suしているところは次のようにやるとsudo1回ですむはずです。

$ sudo sh -c "curl https://packages.microsoft.com/config/rhel/7/mssql-server.repo > /etc/yum.repos.d/mssql-server.repo"

さて接続テストですが、sqlcmdは別パッケージなのでサーバーで接続する場合もパッケージを追加します。

docs.microsoft.com

sqlcmdを使うのもいいですが、せっかくなのでVisual Studio Code拡張を使ってみましょう。拡張をインストールします。

marketplace.visualstudio.com

そのあと、ファイルを新規作成して、Language ModeをSQLにします。その後、Ctrl+Shift+Cを押すと接続先とユーザー/パスワードなどを聞かれるので全部正しく入力するとそのサーバーに接続します。Ctrl+Shift+Pを押して、MSSQL:Connectと入力しても同じことになります*1。あとは適当なSQLを入力して、Ctrl+Shift+EもしくはCtrl+Shit+PからのMSSQL:Executeで実行します。

f:id:tanaka733:20161119181830p:plain

さて、次にOpenShiftで実行してみましょう。SQL Server on LinuxのコンテナがDocker Hubに置いてあるので普通のコンテナと同じように実行すればよいのですが、いくつか注意点があります。現在のSQL Server のコンテナはrooユーザーでプロセスを実行する必要がありますが、これはOpenShift上で動かすコンテナとしてはデフォルトの設定では許可されていません。

blog.openshift.com

とりあえずテスト目的ということで許可しましょう。

$ oadm policy add-scc-to-user anyuid -z default

また、Dockerとして動かす場合のドキュメントにある通り、ACCEPT_EULASA_PASSWORD環境変数を指定しないと動きません。

Run the SQL Server Docker image on Linux, Mac, or Windows - SQL Server vNext CTP1 | Microsoft Docs

次のように指定します。

$ oc env dc/<deploymentconfigの名前> ACCEPT_EULA=Y SA_PASSWORD=<password>

これで動けばよいのですが、パスワードが簡単すぎた場合など、起動に失敗するケースがあります。OpenShiftだと起動に失敗した場合、コンテナのログしか確認できません。

$ oc logs <podの名前>
Configuring Microsoft(R) SQL Server(R)...
Microsoft(R) SQL Server(R) setup failed with error code 1. Please check the setup log in /var/opt/mssql/log for more information.

という感じに詳細は/var/opt/mssql/log を見ろとありますが、起動に失敗したPodはすぐにterminateされるのでこのファイルを見れません。このような場合は debugコマンドを使いましょう。debugコマンドにより所定の起動コマンドが実行される前の状態でコンテナに入れるので、表示された起動コマンドを実行してログを確認します。ちなみに/var/opt/mssql/logはディレクトリで、しかもこのshellは補完がきかないので先にlsでファイルを確認しています。

$ oc debug <terminateされたpodの名前>
Debugging with pod/mssql-server-n-xxxxx-debug, original command: /bin/sh -c /opt/mssql/bin/sqlservr.sh
Waiting for pod to start ...
Pod IP: 10.1.0.n
If you don't see a command prompt, try pressing enter.

# /bin/sh -c /opt/mssql/bin/sqlservr.sh
Configuring Microsoft(R) SQL Server(R)...
Microsoft(R) SQL Server(R) setup failed with error code 1. Please check the setup log in /var/opt/mssql/log for more information.
# ls /var/opt/mssql/log
HkEngineEventFile_0_131240215600920000.xel  errorlog  errorlog.1  log.trc  setup-20161119-093236.log  system_health_0_131240215607860000.xel
# cat /var/opt/mssql/log/errorlog
<snip>
2016-11-19 09:32:41.37 spid17s     Password validation failed. The password does not meet SQL Server password policy requirements because it is too short. The password must be at least 8 characters.

こんな感じでエラーメッセージが確認できます。最後の方はOpenShiftのコマンド紹介になってしまいましたが、他のコンテナプラットフォームで同じような制約がある場合にも使えるかと思います。

*1:mssql:connectは全部入力しなくても適宜補完されます