銀の光と碧い空

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

2017年 .NET Core 1.x (Visual Studio 2017) プロジェクト向け AppVeyor での自動ビルドの設定

ChatWork 向けのC# クライアントを開発していて、ここ1~2年は更新していなかったものの、最近.NET Core対応させたり、API endpoint v2に対応したりしてまた更新するようになりました。

github.com

2年前にAppVeyorで自動ビルド環境を作っていましたが、当時は.NET Core対応などなくVisual StudioのMSBuildでビルドしていました。今回、.NET Core対応したので、dotnetコマンド中心に自動ビルドを対応したので、そのまとめです。作ったプロジェクトはここにあります。

AppVeyor

続きを読む

#decode17 に参加してきました

de:code 2017に久しぶりに参加しました。初年度以来な気がします。ということで感想をまとめてみました。

キーノート

Mobile First, Cloud First からAI中心の Intelligent Cloud, Intelligent Engineへ。あらゆる製品にAIを搭載する流れ。音声認識の認識率が人間の-5.8%まできたいうのが衝撃でした。自動翻訳については、PowerPointとMicrosoft Translator連携。Skypeも合わせて、プレゼンテーションのリアルタイム翻訳も可能に。

Microsoft と Preferred Networkの提携発表。Chainer-readyなVMをAzureに。SQL ServerにもChainerを組み込み。もう一つのテーマはHoloLens。生みの親であるKipman氏が初来日で講演。

MicrosoftはクロスデバイスでのUX向上を進めている。AndroidでコピーしたテキストをWindows PCでペーストできるようなイメージ。

GitHub - Microsoft/project-rome: Code samples and documentation of Microsoft's Project Rome feature

という感じで、.NET TechnologyとかWindows Mobileといった端末とかはほぼほぼ出てこないキーノートでした。

Azure

あとはテーマ別に参加したセッションの感想を。Twitterという名のメモから拾って構成しているので、あまりうまくまとまっていないかもしれないです。

SC02 シチュエーション別 Active Directory デザイン パターン

2020年めどにServer 2008のサポート切れにともなう移行案件があるので、その話。移行先にAzure ADも考えましょうというお話。ADFSとかAADDSとかの利用シチュエーションの説明もあって、現在使えるAADまわりの機能が復習できました。

SC04 あなたのサービスを “ID” で守る! Azure Active Directory の条件付きアクセスの基礎と実装

AADにアプリを繋いで認証すれば、サイン機能の開発も不要、既存のIDが使える、監査セキュリティログもやってくれる、といいことばかり。AADは毎日150万回のアタックを回避し、3万人の攻撃を受けた可能性のあるユーザーを特定している。つまり、自前で作る認証基盤では実現できないようなリスクベースの防御ができる。多要素認証もサポートしているよ、という話。

AC01 Container 環境を支えるマルチ クラウド運用監視のデザインと実装案

セッションの前半はWindows Server Containerの話。nanoserverのサイは350MBくらい。ダウンロードはDockerHubからがおすすめ。今後の目標は.NET最適化コンテナーのサイズ50%OFF

Windows ServerにもInsider Programを導入。nested Hyper-VがAzureにも来たら、Azure上でHyper-Vコンテナも利用可能に。

後半(長さ的には5分くらい)は、コンテナの監視はOMS Agentがおすすめという話。Azure上の仮想マシンに限らず監視できる。OMSはLinux on Azureでも便利なので期待しているんですが、いかんせんIE以外だとうまく表示されないことがよくあり、Linuxデスクトップでどうするんだという個人的懸念が…

AC11 サーバー管理よ、サヨウナラ。サーバーレス アーキテクチャの意義と実践

サーバーレスとは、サーバーの抽象化・イベントどり分で簡単にスケール・実行単位のフェアな課金という3つをポイントとしたサービス。Azureにおけるサーバーレスは、Azure FunctionsやLogic App などなど多くのサービスが該当している。

Azure Functionsはローカルでデバッグできる。またリモートデバッグもできる。Visual Studioのリモートデバッグ含めたデバッグ機能は大きな優位点ですね。Visual Studio Codeなどでもまだまだ到達できてないですし。

Twitterを拾ってメール通知まで、接続するサービスが対応していれば30秒くらいで作れる。Azure Functionsのトリガーの特徴はステートのチェック間隔を秒単位で指定できること。Azure Functionsは課金体系が2種類ある。用途に応じて決めよう。 Azure Functions も App Service PlanならDeployment SlotでBlue-Green Deploymentが可能に。

という感じでAzure Functionsの入門としてもわかりやすい内容でした。

CT06 チョークトーク: 実践! Azure PaaS/IaaS アーキティクチャ デザイン パターン & アンチ パターン

これ、どこまで内容話していいかよくわからないので、あまり言及できないんですが、内容自体は間違いなくよかったです。同様の形態のセッションは来年以降もぜひやってほしい。

DI07 あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake

Data Lakeという大容量のデータを保管し必要に応じて解析するサービス。思想としては、必要なるタイミングまでネイティブフォーマットのまま生データを大量に保管しておく。解析するための言語として、C#の表現力とSQLのクエリを統一したU-SQLというものを利用。U-SQLスクリプトを記述し、ジョブとして投入する。

あとは、U-SQL入門、Data Lake入門として聞いていました。

.NET / .NET Core

TL04 .NET 15 周年の今こそ考えるクラウド ネイティブ アプリケーションと .NET の活用

自分の聞いていた中ではベストセッションだと思います。自分の手を動かしてみないと気づかないような嵌りポイントにも触れていましたし、何よりデモの構成がよくてすべてのデモが最後につながっている流れがありました。自分がセッションやると、ついつい自分のやりたいデモをやってしまって、流れが切れてしまって、理解の妨げになるようなことがあるので、セッションをやる側としても学びが多かったです。

内容としては、.NET Coreにつながれ歴史の振り返り。One ASP.NET 構想とか、OWIN, KATANA Projectといった懐かしい単語がでてきます。そして、その多くはASP.NET Coreに引き継がれている。

.NET Core 2.0 で導入される.NET Standard 2.0で今より多くのAPIが利用可能になる。既存の.NET Frameworkとの共通点も多くなる。

どのAPIが使えるかは.NET APIブラウザーで

.NET API Browser | Microsoft Docs

.NET Framework 4.7 のプロジェクトに.NET Standardのライブラリを追加する場合は、 NETStandard.Library.NETFramework を追加する必要がある。

VS 2017 PreviewからNuGetパッケージ作成まわりのメニューも強化。Visual Studio Codeを使う場合はdotnetコマンドで。Visual Studio 2017 から Linux docker上のdotnetプロセスにリモートデバッグできる。

より高次な.NET アプリのアーキテクチャガイダンスもあるから参考に。

www.microsoft.com

DI01 窓は開かれた! SQL Server on Linux で拡がる可能性

このセッションも、自分の知らなかった知識を補完してくれるということで助かりました。

SQL Serverの掲げるゴール

  • 展開先を選ばない
  • 様々なOSからの選択
  • 多種多様なデータ
  • DB内の分析/学習環境
  • 多彩な開発言語

SQL Server 2017新機能

  • クエリチューニングの自動化
  • データベースと分析環境の融合

SQL Server on Linuxへの道程を説明。LinuxのうえでSQL Serverを互換環境をつかってそのまま動かそうとした。しかし、それはパフォーマンス上の問題があった。理由はSQL ServerがCPUのスケジューリングをWindows OSの機能ではなく自前で実装していたため。それには理由があり、Windows OSのスケジューリング機能がRDB向きではなかった。SQL Server 7.0~2000でUser Mode Scheduleを採用。SQL Server 2005~2016でCPUに加えてメモリ管理も行うSQL Server OSが実装。ブラックボックス化していたので動的管理ビューも追加した。そこで、SQL Server + SQLOS + Linux Host extensionをLinuxプロセスとして動かそうとした。Linux Host Extensionで全部抽象化しようとしたがパフォーマンスに問題がでた。そこでSQLPALを導入。これがDrawBridgeの成果物。この結果、現時点でもon Linuxの方がon Windowsよりパフォーマンスに優れている点がある。将来的にはWindows版も同じアーキテクチャにそろえる予定。

SQL Serverの管理ツールもクロスプラットフォームへ。CLIならsqlcmd、GUIならVisual Studio Codeが現時点で利用可能。将来的にはLinuxではsqlcmd, bcp, sql-cli (nodejs), mssql-scripter(予定)が使える。さらに、DBA向けのクロスプラットフォームで動くGUI Toolsも開発中。

SQL Server on Linuxに接続するアプリの開発言語もいろいろ選択できる。SQL Server 2017 on Linuxでもバックアップ/リストアは同じ手順。Windowsでエクスポートした bakファイルを転送して、Linux上でリストアもできる。SQL Server 2017 on Linux での自動フェールオーバー可能な構成は、Pacemaker + corosyncを使う。SQL Server自身の機能でフェールオーバーするのに加え、接続するIPアドレスを Pacemaker + corosyncでフェールオーバー。

TCP-Hでの測定では、SQL Server 2017 on Linuxは 2016 on Windows Server 2012 R2より高評価。

その他のセッション

あと参加したけどちょっと感想かきづらいセッションとか、参加していないけど参加したかったセッションとかあります。特に、Web Apps on LinuxとWindows ハードコアデバッキングは聞きたかったですね… 仕事に役立ちそうな方を優先してしまったので*1……

Hack Days (Post event)

今年からの試みとしてdecode終了後の2日間で、ハンズオンとハッカソンを実施されました。私はハンズオンに参加したのですが、ハンズオンはdecodeでも説明のあったMicrosoftの各種技術を自習形式で開発し、わからないことがあったらその場にいるMSのエンジニアに聞けるという形式です。10個くらいテーマがあったはずなので、全部やるには2日で足りない人もいたかもしれないです。という自分は、Linux関連メインであまり該当するテーマがなかったので、独自ハンズオン(ハッカソン)を進めました。

成果

Cognitive ServiceのEmotion API(人の顔の写真から感情を推定する)を使ったアプリを開発。.NET Frameworkを使った例だったので、ASP.NET Coreに変えてLinuxでも動くようにしてみました。

github.com

あと、下記のページにあるRed Hatが出した、OpenShift on AzureのARM Templateの解読とハッキングをしたりしてました。これは、ARM TemplateでAzure上に必要なリソースを展開し、ARM Templateから必要な設定ファイルの配置とOpenShift のAnsible Installerを実行するスクリプトも実行しています。ただ、MarketplaceのRHELイメージを前提としているので、これをBYOLな自前RHEL VHDイメージを基に展開するようにいじろうとしていました。

Deploying Red Hat OpenShift Container Platform 3 on Microsoft Azure - Red Hat Customer Portal

また、この辺の話に興味のある方は6/24のinteract2017の「OpenShift on Azure」のセッションで話す予定なので、ぜひご参加を。

interact.connpass.com

まとめ

運営面の感想としては、満足したという面もあれば、それはちょっとどうだろうという面もあり、アンケートでフィードバックしました。なんか後から話を聞くと、じゃあやむを得ないかと思わないこともないんですが、アンケート書いた時点では知らなかったということで、厳しいフィードバックもご了承いただければ…

セッション全体としてはかなり満足でしたが、やはり自分の立場的には.NET CoreとかASP.NET CoreとかLinux on Azure *2とかとかのセッションが増えるとと嬉しいなという感じです!!

*1:というか最終日の最後の枠が重なりすぎ

*2:OSS on AzureではなくてLinux on Azureね

Y8 2017 spring in Shibuya で .NET Core on Linux の内部について話しました

Y8 2017 Spring という技術系ノンジャンル(と私は理解している)イベントがあったので登壇してきました。CFPにリアクションして頂いたみなさまありがとうございました。こちらが資料です(更新するかもしれないです)。

doc.co

イベントサイトはこちら。

y8-2017-spring.hachiojipm.org

.NET Core がLinux(やmacOS)で動くようにどうやって実装しているかとか、デバッグの仕方とか、OS固有の部分をどうやってLinuxの世界に持ち込んでいるのか、というテーマはずっと話したくて機会を伺っていたのですがようやく世に出すことができました。

もし次があれば、デバッグまわりの部分はもう少し実践的な内容にしたいなあと思います。また、Linuxユーザー向けにはVisual Studio側の機能紹介もしたいですね。今回デモしたように、.NET CoreをLinuxにデプロイする場合でも、Windowsで開発することができ、リモートデバッグすることができます。また、リモートデバッグについてはいつの間にかやたらリモートデバッグの接続の種類が増えているので、改めて調査します。

f:id:tanaka733:20170527164325p:plain

dllに含まれるシグニチャを見るには?

質問されて答えが出せなかったので、いったん調べた内容をこちらに。dllの中で定義されているクラスとかメソッド一覧を取得したいという質問だったのですが、dllの中に定義されているのはIL(中間言語)なのでnmコマンドなどでは見れないはずです。あくまで.NET CoreのILを解釈する必要があります。Windows上の.NET FrameworkならILSpyなどのフリーのツールで逆コンパイルすることもできるのですが、Linux上で動作する.NET Core向けの逆コンパイルツールは見つけられませんでした。

ILSpy

とりあえずできそうな方法はLLDBでlibsospluginをsosコマンドからたどって行く方法です。.NET Coreのlibsospluginの使い方の詳細はこちらにあります。

github.com

定義されているsosコマンドは.NET Frameworkのものと対応しており、その詳細はこちらに書いてあります。

SOS.dll (SOS デバッガー拡張)

ではこれを使って、stringクラスのメソッド一覧を出してみましょう。ちなみにsosコマンドあまり詳しくないので、よりよい方法があればコメントなどをもらえるとうれしいです。

DumpHeapでstringを指定します。

(lldb) sos DumpHeap string
         Address               MT     Size
00007f6b1aed5000 00000000010717b0       24 Free
00007f6b1aed5018 00000000010717b0       24 Free
00007f6b1aed5030 00007f6d3b77db68       72     
(以下略)

どれか1つのアドレスを指定してDumpObjします。

(lldb) sos DumpObj 00007f6b1aed50b8
Name:        System.String
MethodTable: 00007f6d3b77db68
EEClass:     00007f6d3b0916d0
Size:        60(0x3c) bytes
File:        /opt/dotnet/shared/Microsoft.NETCore.App/1.1.1/System.Private.CoreLib.ni.dll
String:      Format_GuidDashes
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007f6d3b797948  4001aa6        8         System.Int32  1 instance               17 m_stringLength
00007f6d3b7827c0  4001aa7        c          System.Char  1 instance               46 m_firstChar
00007f6d3b77db68  4001aa8     1258        System.String  0   shared           static Empty
                                 >> Domain:Value  00000000010e3fb0:NotInit  <<

メソッド一覧はMethodTableで取得できます。詳細を出すために--mdを指定します。

(lldb) sos DumpMT -md 00007f6d3b77db68 
EEClass:         00007F6D3B0916D0
Module:          00007F6D3B00B000
Name:            System.String
mdToken:         00000000020005AD
File:            /opt/dotnet/shared/Microsoft.NETCore.App/1.1.1/System.Private.CoreLib.ni.dll
BaseSize:        0x18
ComponentSize:   0x2
Slots in VTable: 196
Number of IFaces in IFaceMap: 7
--------------------------------------
MethodDesc Table
           Entry       MethodDesc    JIT Name
00007F6D3B42CE10 00007F6D3B0E1508 PreJIT System.String.ToString()
00007F6D3B42E3F0 00007F6D3B0E17A8 PreJIT System.String.Equals(System.Object)
00007F6D3B42EA60 00007F6D3B0E1878 PreJIT System.String.GetHashCode()
00007F6D3B41EE10 00007F6D3B0DF0B0 PreJIT System.Object.Finalize()
00007F6D3B42CE20 00007F6D3B0E1510 PreJIT System.String.ToString(System.IFormatProvider)
00007F6D3B42CE30 00007F6D3B0E1518 PreJIT System.String.Clone()
00007F6D3B42CF40 00007F6D3B0E1550 PreJIT System.String.GetTypeCode()
00007F6D3B42CF50 00007F6D3B0E1558 PreJIT System.String.System.IConvertible.ToBoolean(System.IFormatProvider)
(以下略)

まあ、めんどくさいですね… これはもう少し調べてみることにします。