kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

何回実行しても特定の時間まで実行しないアプリランチャー

ほとんど毎日の作業としてこんなものがあります。

  1. Windows Terminalを起動する(スタートアップ起動)
  2. winget実行してアプリケーションを最新にする
  3. npm installを(同上)
  4. dotnet global packageを(同上)
  5. PowerShellのパッケージを(同上) ....

シェルのヒストリーがあるとはいえ、まぁまぁめんどくさい。バッチにして、Terminalのタブ起動時に実行してもいいけど、空振りすることがわかっているのに実行されるのもちょっと嫌だなぁ、と思っていたらはせがわようすけさんがこんなことを書かれていました。

そうだよなぁ、まさにそうと思って簡単なツール作ってみるか?とGitHubにレポジトリ作ったのがこの後すぐ…だけど、めんどくさくなってきて(笑。ほかにもやることあったし)、長い間放置していました。

当時からRustもあり、勉強がてらいいかな?と思ったけど、C/C++のほうがわかるし別に起動してすぐ終わるツールだからC++でいっかと思ってつくりはじめたものの、時間とられすぎて放置していたのです。でもやっぱり面倒になったところに出てきたのがGitHub Copilot(とエージェント)。コード補完やAskしかなかった頃は「違うそうじゃない」と思って、やはりあきらめたのです。

しかし、GPT-5以降のモデルの利用やAgentモードになって自分が作るよりも立派なものをより早くできるようになったので冬休み頑張って仕上げました(Copilotが)。Coding Agentは今のところUbuntuで動いていたので、WindowsのC++は駄目だろう?と思っていたのですがビルドは当然してくれないものの、コンパイルエラーにならない程度のものを作ってくれてびっくりでした。

あとはローカルのVisual Studioで仕上げます。最初「GoogleTestとcmakeがデファクトだよ」と言われて(Ubuntuで動いていたのもあったのでしょうが)、そのまま承諾していたらローカルでGoogleTestがさっぱり動かない。DLLがないっぽいのですが、ちょっとわからなかったし動かせる自信もモチベーションもなかったので、MicrosoftのC++ Testing Frameworkに変えて、cmakeもやめました(のでコミット記録が結構残っています)。この辺の変更もAgentにやってもらいました。

この辺は最初にちゃんとカスタムイントラクション作らなかったのがいけなかったかな、と反省しています。

あと、レポジトリのルートにあるreadme.mdをVisual Studioが認識しない?っぽいのでそこも結構困る。いぜんかずきさんが似たこと(.NETのプロジェクト)で困られていて、「GitHubにあるものであれば大丈夫そうだ」と書かれていましたが、C++のプロジェクトでは認識していないようにも見えます。この辺は要調査。

とまぁ長々と書きましたが、Copilotのおかげで割と自分が納得いくツールになったと思うので良ければ使ってください。wingetへの登録も後ほど…。Visual Studio 2026使っているのにツールセットが2022なのはGitHub Actionsのhosted runnerにVisual Studio 2026が入っていないからです。

github.com

最初はNTFS代替ストリームに最終実行時間を書こうかなとか思っていましたが、起動パラメータとかjsonにするんだからjsonでもいいかと思いなおしました。200KB程度の小さいバイナリーにしましたが、できれば100KB程度にしたかった。

Visual Studioの新しいソリューション形式slnx

先日Visual Studio 2022 17.0 Preview 3が公開されました。新しいプレビューが公開されると、プレビュー機能のダイアログ(今はタブになりましたが)を一通り見るのですが、気になる項目が増えていました。

もちろん有効にします(非推奨とか、古い互換性のための機能でない限り原則有効にします😉)。

Visual Studioのソリューションを選択して保存時にslnxが増えています。

読み込むときにも選択肢として増えています。何が違うのでしょう。

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.10.34804.81
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorApp1", "BlazorApp1\BlazorApp1\BlazorApp1.csproj", "{BFD7AF15-7028-43D2-AC5D-1AD1B7D7C4C7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorApp1.Client", "BlazorApp1\BlazorApp1.Client\BlazorApp1.Client.csproj", "{82BD4B72-63B3-4C4F-992D-09FF5586C07D}"
EndProject
Global
    GlobalSection(ExtensibilityGlobals) = postSolution
        SolutionGuid = {B7807233-0A06-4B9F-B06C-4A4C48D34E24}
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {82BD4B72-63B3-4C4F-992D-09FF5586C07D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {82BD4B72-63B3-4C4F-992D-09FF5586C07D}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {82BD4B72-63B3-4C4F-992D-09FF5586C07D}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {82BD4B72-63B3-4C4F-992D-09FF5586C07D}.Release|Any CPU.Build.0 = Release|Any CPU
        {BFD7AF15-7028-43D2-AC5D-1AD1B7D7C4C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {BFD7AF15-7028-43D2-AC5D-1AD1B7D7C4C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {BFD7AF15-7028-43D2-AC5D-1AD1B7D7C4C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {BFD7AF15-7028-43D2-AC5D-1AD1B7D7C4C7}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Release|Any CPU = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
EndGlobal

Blazorのプロジェクトをテンプレートで作っただけのおなじみの(?)sln構成です。これをslnxにするとこうなります。

<Solution>
  <Project Path="BlazorApp1\BlazorApp1.Client\BlazorApp1.Client.csproj" Type="Classic C#" />
  <Project Path="BlazorApp1\BlazorApp1\BlazorApp1.csproj" Type="Classic C#" />
</Solution>

簡単!.NETのプロジェクトがSDKスタイルになった時のようです。前々から「projectのGUIDや構成定義は必要なのか」とか思っていたので、すべてcsprojに行ってくれたのは助かります。ただ、これまだ始まったばかりのようで、関連付けも行われていません。

そして、当然ですが、dotnetコマンドでもサポートされていないようでビルドができません。

devenvコマンドならビルドができます(もちろんPreview版のVisual StudioのDeveloper Command Promptを起動します)。

プレビューを使わないといけないからCIで使えないし、このslnのファイル構成を当てにしている拡張機能やツールもたくさんあるでしょうから、どのくらいでデフォルト有効になるのかちょっとわからないですが、XMLになってパースしやすくなるのと、サイズが劇的に小さくなるのは非常にうれしいですね。Visual Studio 2022 17.10正式版ではサポートになるのかな?楽しみです。

Visual Studio SubscriptionのAzure特典でWindows Client OSとVisual Studio入りイメージを使う

免責事項開始
本件はMicrosoftサポートに問い合わせて得られた結果を書いていますが、ライセンスに関することはAzureサポートにお問い合わせください。
免責事項終了

いつのころからか定かではない(多分DevBoxがリリースされたころ)のですが、Visual Studioサブスクリプション特典のAzureサブスクリプションを使ってVisual Studio入りイメージを使おうとすると上記のエラーが出るようになりました。確実に以前は使えており、数年前にデプロイしたWindows 10 + Visual Studio入りイメージがAzure上にあります。

2023年5-6月ごろだったか、このエラーに初めて遭遇して、「一時的なものだろう」と思っていたのですが、まったく直る気配もなかったので、8月に問い合わせ始めて、ようやく今日回答がもらえました。まとめるとこんな感じ。

  • Visual Studio サブスクリプションの特典Azureサブスクリプションの場合、クレジットカードなどを登録して上限解除しなければVisual Studio入りイメージは使えない(これはサードパーティーオファーなどと同じ)
  • ただし、Azureサポートが試したところ、サードパーティーオファーと異なり、「無料枠から」クレジットが消費され、上限を超えた場合(Enterpriseの場合$200/month)に登録した課金方法への請求が行われる

とのことでした。「以前は大丈夫だったのに」と言って証拠のデプロイ済みVMも見せたのですが、いつ変わったかはサポートでもわからないといわれました。そして、多くの人は個人MSアカウント(outlook.jpなど)を使ってAzureサブスクリプションを使っているかもしれません。Virtual Desktopが出たころからですがこんなチェックが増えています。

一番下のLicensingI confirm I have an eligible Windows 10/11 license with multi-tenant hosting rights.(Windows 10/11のマルチテナントホスティングライセンスを保有しています)という宣言です。知られている通り、Windows 10/11をAzureで使う場合Windows VDAもしくはWindows E3/E5のライセンスが必要です。Visual Studioサブスクリプションにはないのでは?ということはWindows Client OSが使えないのでは?ということになってしまいます。うーん、困った。

これも聞いたところ、「Visual Studioサブスクリプションの場合は使ってもよい(チェックを入れればよい)」のだそうです。根拠はたぶんこちら。

Visual Studio のサブスクライバーは、Microsoft Windows Virtual Desktop サービスで Azure Dev/Test の個人クレジットを使用できるようになりました。

出展:learn.microsoft.com

現実的にAzure Virtual Desktopを使う場合、Entraが必要で、個人MSアカウントでは無理(だよね?)なわけですが、ここでやるということになるのでしょうか。でも、正直これは困るのでこのサブスクリプションをEntraのテナント側に引っ越そうかなと思っています…。

あくまでも本記事は個人のメモなので、Azureサポートにご確認ください(大事なことなので二回目)

AzureのPaaSのローカル開発環境まとめ

という投稿を読んで、昔からAzureというかMicrosoftのツールはローカルでのエミュレータや開発環境が提供されているので気にも留めていなかったのですが、AWSのLocalStackはコンテナーで一式あるので便利ですね。LocalStackで無償で使えるのは一部の機能で有償のProが必要になるケースもあるので、完全に無料でローカル開発ができるわけではないようです。

AzureのPaaSのうちローカルで開発するためのエミュレーターなどをあつめてみました。もともとWeb AppsはIIS(Express)があるし*1、SQL DatabaseもSQL Server (Express)やLocalDbで開発やローカルテストはほぼ問題なかったですし、さらに今はLinux版がありDockerコンテナー内で容易に動くようになりました。

自分の思いつく範囲で書いてみましたが、これは?とかあれば教えてください。

SQL Database

learn.microsoft.com

どの環境でも動かすならDockerが一番簡単です(Windows版SQL ServerのDockerコンテナー提供はなくなりました)。Developer EditionかExpress Editionで使えば無料です。

learn.microsoft.com

www.microsoft.com

Windows版はLocal DbかSQL Server Express, Developer Edtionをローカルインストールするしかないでしょう。Developer Editionの機能はEnterprise相当なので、うっかりStandardで使えない機能を使ってしまったとかないようにしてください。データベースのリストアができなくなります。

(追記)

learn.microsoft.com

現在プレビューですが、SQL Database Emulatorがあると教えてもらいました。知らなかった。ありがとうございます。

Azure CosmosDB

learn.microsoft.com

CosmosDBもエミュレーターがあります。

Azure Functions / Logic Apps

learn.microsoft.com

VS Codeおよび、Visual Studioで使えます。実際はストレージアカウントも必要になることが多いので、次のストレージエミュレータも入れてください。

Azure Storage

learn.microsoft.com

これ単独で使うことはあまりないのですが、Azure PaaSが前提にすることが多いので、入れないといけないことが多いですね。昔のエミュレーターはWindows専用でしたが、今はクロスプラットフォームのエミュレーターに移行しました。Visual Studioをインストールするときには昔のエミュレーターが追加インストールされますね。

API Management

learn.microsoft.com

面白いところではAPI managementもセルフホストゲートウェイがあります。もともとは直接イントラから出せないような要件向きっぽいですが。ただ、これ使ってローカル開発しているという人の話は聞いたことがないです。

IoT Edge

learn.microsoft.com

使ったことはないのですが、こういう感じでローカル開発できるそうです。

Stream Analytics

learn.microsoft.com

同上。使って開発したことはないです…。

Azure Machine Learning

learn.microsoft.com

OpenAIの陰に隠れたような気がしますが、こんな感じで環境作れます。Azureにはサイエンス用ということでこの辺がプリインストールされたVMもあります。

Azure Kubernetes Services

learn.microsoft.com

AKSというか、kubernetesであればmicro k8sとかminikubeとかそもそもローカルで開発するためのものも多く提供されているので、好きなものを選べばいいんじゃないでしょうか。

kubernetes.io

microk8s.io

(おまけ) Dev TonelとBridge to Kubernetes

learn.microsoft.com

まだプレビューのはずですが、直接接続できない環境でもデバッグできるようになります。

learn.microsoft.com

KubernetesをデバッグするときはBridge to Kubernetesを使うといいようですね。

*1:macOSには…IISないですね。