syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

Visual Studio 2022とF# Interactiveと.NET CLIテレメトリ

Windowsの標準スクリプト言語と言えばPowerShellですが、個人的にPowerShellの文法が好きではないので、普段はF#をスクリプト言語として使うということをやっています*1
F#は関数型言語ですが、純粋関数型言語Haskellほど窮屈な原理主義を強制するものではないものの、C#よりも厳格で副作用の少ないコードを書きやすいので、頭の体操がてらに「better C#」としてゆるく使っています。
そんな大層な使い方をしているわけではなく、.NETクラスライブラリを使ってファイルシステム正規表現検索するなど、現状ではちょっとした雑用の自動化にしか使っていません。
F#の対話環境「F# Interactive」は、C# Interactiveと同様にVisual Studioにも統合されているので、ちょっとしたコードを試すのに便利です。

sygh.hatenadiary.jp

VS2015では、インストール後に拡張子.fsxにVisual Studioが関連付けられ、さらにコンテキストメニューに「Run with F# interactive...」というコマンドが追加されていましたが、VS2022ではそういったことはありません。開発・実行環境のメインストリームが.NET Frameworkから.NET (.NET Core) に移ったことで、実行基盤であるCLRのバージョンが流動的になったことと関係しているのだと思います。
.NETではdotnetコマンドを使うことで、ビルドなどの.NETプロジェクトに関連する様々なタスクを実行することができるようになっていますが、dotnet fsiコマンドを使うことで、F# Interactiveを起動することができ、従来通り.fsxファイルを指定してスクリプトを実行させることもできます。
レジストリをいじってコンテキストメニューに従来の互換コマンドを追加することもできるはずですが、今後はコマンドラインから明示的に起動するほうがよいかもしれません。

learn.microsoft.com

.NET CLIテレメトリ

Visual StudioからF# Interactiveを最初に起動すると、以下のようなメッセージが出力されます。

Visual Studio の .NET Core の F# インタラクティブへようこそ。コードを実行するには、
  1. F# スクリプトから [Interactive に送信] (Alt+Enter または右クリック) を使用します。F# インタラクティブ プロセスでは、
     そのスクリプトに関連付けられている任意の global.json 設定が使用されます。
  2. 開始するには、Enter キーを押します。F# インタラクティブ プロセスでは、既定の設定が使用されます。
> 

ここでEnterキーを押してみると、以下のようなメッセージが続けて出力されます。

.NET 9.0 へようこそ!
---------------------
SDK バージョン: 9.0.306

テレメトリ
---------
.NET ツールは、エクスペリエンスの向上のために利用状況データを収集します。データは Microsoft によって収集され、コミュニティと共有されます。テレメトリをオプトアウトするには、好みのシェルを使用して、DOTNET_CLI_TELEMETRY_OPTOUT 環境変数を '1' または 'true' に設定できます。

.NET CLI ツールのテレメトリの詳細をご覧ください: https://aka.ms/dotnet-cli-telemetry

----------------
ASP.NET Core HTTPS 開発証明書をインストールしました。
証明書を信頼するには、'dotnet dev-certs https --trust' を実行します
HTTPS の詳細情報: https://aka.ms/dotnet-https

----------------
最初のアプリを作成するには、https://aka.ms/dotnet-hello-world を参照してください
最新情報については、https://aka.ms/dotnet-whats-new を参照してください
ドキュメントを探すには、https://aka.ms/dotnet-docs を参照してください
GitHub で問題の報告とソースの検索を行うには、https://github.com/dotnet/core を参照してください
'dotnet --help' を使用して使用可能なコマンドを確認するか、https://aka.ms/dotnet-cli にアクセスしてください
--------------------------------------------------------------------------------------

Microsoft (R) F# インタラクティブ バージョン F# 9.0 のための 13.9.303.0
Copyright (C) Microsoft Corporation. All rights reserved.

ヘルプを表示するには次を入力してください: #help;;

> val it: unit = ()

> 

出ました、MSによる個人情報の勝手な収集・送信癖。

learn.microsoft.com

How to opt out

The .NET SDK telemetry feature is enabled by default for Microsoft distributions of the SDK. To opt out of the telemetry feature, set the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 or true.

A single telemetry entry is also sent by the .NET SDK installer when a successful installation happens. To opt out, set the DOTNET_CLI_TELEMETRY_OPTOUT environment variable before you install the .NET SDK.

Data points

The telemetry feature doesn't collect personal data, such as usernames or email addresses. It doesn't scan your code and doesn't extract project-level data, such as name, repository, or author. ……

ドキュメントによると、一応ユーザー名やメールアドレスのような個人データは収集せず、ユーザーが書いたコードなどもスキャンしないと書かれていますが、どうなるか分かったものではありません。ネットワークを無駄に使われるのも気に入らないので、環境変数DOTNET_CLI_TELEMETRY_OPTOUTを設定して無効化します。
setxコマンドを使って設定する方法を紹介している人が多いですが、おなじみのシステムプロパティ(詳細設定)ダイアログのGUIからシステム環境変数またはユーザー環境変数を作成してもよいはずです。

最悪なことに、この.NET CLIテレメトリはデフォルトで有効化されてしまっており、環境変数を設定せずに.NET SDKインストーラーを実行すると、初回の利用データは必ず送信されてしまいます。
環境変数を設定しておけば、以後の利用データは送信されない動作になるはずですが、もしインストール時の初回の利用データも含めて一切送信したくない場合は、.NET SDKをインストールする前(.NET CLIツールを使い始める前)に環境変数を設定しておく必要があります。
以前Visual Studio 2019で.NET 5を使っていた頃は、テレメトリ機能のオプトアウトのために環境変数を設定した記憶はないのですが、当時気付いていなかっただけのようです。

Android StudioFirefoxなど、他の開発環境やブラウザでも利用データやクラッシュレポートなどを収集する機能はありますが、データを開発元に送信するかどうかは最初に必ずダイアログで確認をとるようになっています(オプトイン)。こういう機能をデフォルト有効のオプトアウト方式にするのはアカンでしょ。EUGDPRに違反してるんじゃねーの? 通報しようか?
昔からMSは汚い企業だったけど、さすがにここまで下劣ではなかったと思うよ。バルマーが失脚してインド人のサティア・ナデラがCEOになってから業績は好調のようだけど、なりふり構わないというか本当に無節操になったと感じます。どうもアイツは胡散臭くて好かんね。

*1:他にも広く使われているスクリプト言語の代表格と言えばPythonがありますが、Pythonは動的型付け言語の中でも特にハーネスの欠如した無節操な言語なので、自分はPythonも嫌いです。