rksoftware

Visual Studio とか C# とかが好きです

mac で Process.Start() で Permission denied がでる

mac で .NET Core 3.0 の単一ファイルの実行可能ファイル(/p:PublishSingleFile=true)を、.NET Core アプリから Process.Start() で実行しようとしたときに少しハマったのでメモ。

■ コード

ここでは Ready という単一ファイルの実行可能ファイルを作ったものとします。

var readyProcess = new Process()
{
     StartInfo = new ProcessStartInfo("Ready")
};
readyProcess.Start();

これで Win32Exception Permission denied とエラーになりました。

■ 解決策

当たり前のことですが、作っただけでは実行の権限が付いていません。次のようにして、作った単一ファイルの実行可能ファイルに実行の権限を付けると、意図通りに動作するようになりました。

chmod u+x Ready 

ReadyToRun 設定

世間で今一番の話題と言えば、.NET Core 3.0 で間違いないでしょう。

そんな .NET Core 3.0 の新機能の中でも、ReadyToRun が気になっている方も多いと思います。もちろん私もその一人です。

■ 何がうれしいの?

事前に動作環境に合わせて最適化されたアセンブリを作ることで、アプリの起動時間を短くできます。環境というのは、Linux x64 や Windows x64 といった粒度です。
エンタープライズ分野の一品ものやデスクトップアプリでは、ターゲットの環境が固定であることが一般的だと思うので設定しない意味はないのではないかと思います。

■ 設定方法

設定方法は、前述のページに記載があり、 .csproj に設定を追加します。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <PublishReadyToRun>true</PublishReadyToRun>
  </PropertyGroup>
</Project>

コマンドラインで発行する場合は発行コマンドのパラメータ /p:PublishReadyToRun=true でも行けるようです。

dotnet publish -r win10-x64 -c Release /p:PublishReadyToRun=true  

■ 試してみる

今回動かしてみた環境は、mac 上の VM の Windows なので、実測時間は何の役にも立たない数値だと思います。
しかし、ReadyToRun とそうでない実行ファイルの比較をしているので、効果の有る/無しについては信じていいかなと思っています。

ReadyToRun 設定をしている実行ファイルのコード

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(DateTime.Now.Ticks);
    }
}

ReadyToRun 設定をしていない実行ファイルのコード(全く同じです)

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(DateTime.Now.Ticks);
    }
}

それらを、100 回実行してそれぞれの平均をとるコード

    class Program
    {
        static void Main(string[] args)
        {
            var readyProcess = new Process() { StartInfo = new ProcessStartInfo("Ready") { RedirectStandardOutput = true } };
            var notReadyProcess = new Process() { StartInfo = new ProcessStartInfo("NotReady") { RedirectStandardOutput = true } };

            Console.WriteLine(DoProcess(readyProcess));
            Console.WriteLine(DoProcess(notReadyProcess));

            var readyElapsed = 0L;
            var notReadyElapsed = 0L;

            const long times = 100L;
            foreach (var _ in Enumerable.Range(0, 10))
            {
                foreach (var __ in Enumerable.Range(0, 10))
                {
                    readyElapsed += DoProcess(readyProcess);
                    notReadyElapsed += DoProcess(notReadyProcess);
                }
                Console.WriteLine(_);
            }

            Console.WriteLine($"   ready:{readyElapsed / times}");
            Console.WriteLine($"notReady:{notReadyElapsed / times}");
        }

        static long DoProcess(Process p)
        {
            var tick = DateTime.Now.Ticks;
            p.Start();
            var output = p.StandardOutput.ReadToEnd();
            var elapsed = long.Parse(output) - tick;
            return elapsed;
        }
    }

実行結果 1 回目

   ready:928692
notReady:945244

実行結果 2 回目

   ready:1124247
notReady:1143800

実行結果 3 回目

   ready:1056758
notReady:1092803

単位(100ナノ秒)

設定を逆にしても期待通りの結果となったので、とりあえず ReadyToRun の効果は期待して良さそうです。
とりあえず設定しておくことにします。

■ 追記

mac で試してみても ReadyToRun した方が早かったので、効果はあるのでしょう。

技術書典7に一般参加してきました

技術書典7に一般参加してきました。

今回は、本当に忙しく全く事前チェックなしで挑みました。いくつか SNS で流れてきた知人の参加情報は見ていましたが、スペース番号までは把握できておらずまた、忙しさで SNS 上のすべての投稿をチェックできても 居ない状態でした。
加えて会場の混雑もあり今回手にした本は少しだけ。
f:id:rksoftware:20190923140710j:plain

このほか、DL が一つです。関心ある技術用語には注意をして歩いたつもりですが、あまり関心のある単語を見つけられなかったです。

.NET、C#、Azure、Android など。

前回は 10 冊くらい手にしていたことを考えると、ちょっとブースを見ながら歩く集中力が足りなかったかもしれません。
定時退社は悪。 間違いないです。
次回はコンディションを整えて、また 10 冊以上の技術書との出会いを目指したいです。

秋葉原 C# もくもく会 #101 勉強会を開催しました

■ C# もくもく会

C# もくもく会 #101 を開催しました。

C# もくもく会 は東京の秋葉原で毎週木曜日に開催している .NET 系の勉強会です。
もくもく自習を基本とし、分からないことを教えあったり情報共有したりしている会です。 定期開催していますので、お時間のある時に遊びに来ていただければと思います。
ちょっと詰まった時、ネット上で聞くのははずかしいなぁ、という課題のできた時などにも思い出していただけると嬉しいです。
f:id:rksoftware:20190922113651j:plain

■ 今週の成果発表

今週は、足元固めの日でした。良いエンジニアリングは基礎力から!

  • .NET Core 3.0 の RedyToRun を試してました
  • インスタアカウントを作りました
  • ASP.NET 復習してました
  • インスタアカウント作りました

会場のコワーキングスペースでインスタグラムみ関する神サービスが作られたので、こぞってインスタグラムアカウントを作った会でした。

その日の夕食は全力のインスタ映えを。 見てください! このインスタ映え!!
f:id:rksoftware:20190922113637j:plain

ちなみにこの勉強会ですが、実は公序良俗に反しなければどのような技術を扱っても大丈夫です。そもそも C# エンジニアが C# だけしか使わないというわけではありませんし。

■初心者歓迎

このもくもく会には、入門者の方も多くご参加いただいています。 突然 C# やらなければならなくなって途方に暮れている方、何となく C# をやってきたけど改めて見直してみたい方なども大歓迎です。
入門セミナー代わりでのご参加も歓迎です。プログラミング入門者の方も是非遊びに来てください。

特に C# で課題をお持ちでなくても是非遊びに来てください。

■ 目指す勉強会スタイル

世界一敷居の低い勉強会を目指しています。

何か聞きたいことがある場合は、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

何か共有したい情報を見つけた場合も、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

そんなスタイルでやっています。

■ 次回予定

次回は 2019/09/26 に開催予定です。

C# に関心のある方、是非遊びに来てください。

城東.NET #36 勉強会を開催しました。

■ 城東.NET

城東.NET #36 を開催しました。

城東.NET は東京の最近は秋葉原で毎月第 3 水曜日に開催している .NET 系の勉強会です。
発表を中心として、発表でなくとも最近やった事や新しい情報などを参加者で共有している会です。

f:id:rksoftware:20190918195149j:plain

今月は参加者 1 名 (私です!) で開催です。

発表は 1 名 (私です!) の LT がありました。

私は .NET Core 3.0 に備えよう というタイトルで話をしました。

来週にリリース予定の .NET Core 3.0 の復習と有効にしたいプロジェクト設定等です。

.NET Core 3.0 プレビューバージョンごとの新機能名メモ(日本語メモ追加)

.NET Core 3.0 のリリースなので、新機能を復習してみたいと思ってまず、新機能の名前だけでも並べてみようと思いました。

.NET Core 3.0 (プレビュー 9) の新機能はこちらに情報があります。

このページから各プレビューバージョンのアナウンスのブログ記事へのリンクが張られています。
リンク先のブログサイト

リリースノートもあるのですが、微妙に表現が違う場合もあって詳細までは書いていないので、アナウンスブログを見ていきます。

■ 日本語メモ

私自身が英語読めなくて英語をメモしても活用しきれないので日本語でメモを機械翻訳に頼ってそれっぽく書いてみました。
長かったので書いた時の気分(気力の充足具合)で書き口が違います。一通り書いて疲れたので書き口の統一をするにはもう気力が足りませんです...。

■ 機能(名?)とバージョン

Preview 1
.NET Framework 4.8 .NET Core の話の前に .NET Framework 4.8 の話
Windows Desktop Comes to .NET Core .NET Core で Windows デスクトップアプリが作れるようになります。Windows です
WPF, Windows Forms, and WinUI Open Sourced WPF、Windows Forms、WinUI の GitHub リポジトリ作りました
WPF and Windows Forms WPF、Windows Forms アプリケーションを .NET Core で作れるようになりました
Applications now have executables by default デフォルトでアプリケーションが実行可能ファイルとしてビルドされるようになりました
dotnet build now copies dependencies dotnet build で NuGet キャッシュから出力ディレクトリへのコピーがされるようになりました(これまでは publish 時だけ)
Local dotnet tools .NET Core tools に local tools scenario が追加されました
Introducing a fast in-box JSON Reader System.Text.Json.Utf8JsonReader。Json.NET よりも速い
Ranges and indices C# 8 の一部として Index 型と Range 型を追加
Async streams C# 8 の一部として非同期ストリームを追加
System.Buffers.SequenceReader ReadOnlySequence のリーダーとして System.Buffers.SequenceReader を追加
Serial Port APIs now supported on Linux Linux でシリアルポート API のサポートを追加
GPIO, PWM, SPI and I2C APIs now available GPIO, PWM, SPI, and I²C pin 用 API System.Device.GPIO NuGet パッケージを追加
Supporting TLS 1.3 and OpenSSL 1.1.1 now Supported on Linux Linux で TLS 1.3 と OpenSSL 1.1.1 のサポートを追加
Cryptography AES-GCM、AES-CCM 暗号化の追加
Cryptographic Key Import/Export 暗号化キーのインポート/エクスポートの追加
More BCL Improvements その他の BCL の改善。最適化、パフォーマンス改善
Default implementations of interface members C# 8 の機能の一部。インタフェースメンバーのデフォルト実装
Tiered Compilation 階層型コンパイルデフォルトで有効。いい感じになるはず
Assembly Metadata Reading with MetadataLoadContext 新しい MetadataLoadContext を追加。呼び出し元アプリケーションのドメインに影響を与えずにアセンブリメタデータを読み取ることができる
ARM64 Linux の ARM64 をサポートします
Platform Support サポート対象プラットフォームの一覧
Preview 2
C# 8 C# 8 の一部機能が追加されました
Using Declarations Using Declarations。using の後ブロックを作らなくても宣言されたブロックの終わりで Dispose
Switch Expressions switch 式。ステートメントでなく式
Async streams 非同期ストリーム
IEEE Floating-point improvements IEEE 準拠の浮動小数点にしようとします
.NET Platform Dependent Intrinsics プラットフォーム依存の組み込み関数。パフォーマンス改善
Introducing a fast in-box JSON Writer & JSON Document System.Text.Json.Utf8JsonWriter と System.Text.Json.JsonDocument を追加。高速
Utf8JsonWriter Utf8JsonWriter の説明と使用サンプル
JsonDocument JsonDocument の説明と使用サンプル
GPIO Support for Raspberry Pi Raspberry Pi 向け GPIO サポート
Local dotnet tools Local dotnet tools。dotnet new tool-manifest / dotnet tool list の 2 コマンドが追加されました
Assembly Unloadability アセンブリのアンロード。AssemblyLoaderContext の新機能
Windows Native Interop Windows COM相互運用機能
WPF and Windows Forms WPF と Windows Forms の GitHub リポジトリ運用頑張ってます
Visual Studio support .NET Core 3 でのデスクトップアプリ開発が Visual Studio でサポート
MSIX Deployment for Desktop apps .NET Core 3 デスクトップアプリを Windows 10 で配置するために MSIX が使えるように Windows Application Packaging Project が Visual Studio(プレビュー)で作れる
Install .NET Core 3.0 Previews on Linux with Snap Snap のある Lnux で Snap で .NET Core 3.0 がインストールできる
Platform Support .NET Core 3 のサポート対象プラットフォーム一覧
Preview 3
.NET Core SDK installers will now Upgrade in Place Windowsでは、.NET Core SDK MSIインストーラーはパッチバージョンのアップグレードをします
Docker and cgroup memory Limits Docker と cgroup のメモリ制限が適切になりました
Docker Publishing Update コンテナイメージを Microsoft Container Registry (MCR) で公開するようになりました
Index and Range C# 8.0 の Index と Range のサポート
.NET Standard 2.1 .NET Standard 2.1 ライブラリ作成をサポート
F# Update F# についての更新
F# 4.6 F# 更新の明細。F# 4.6(プレビュー )
dotnet fsi preview F# 更新の明細。dotnet fsi コマンド(プレビュー)
AssemblyDependencyResolver AssemblyLoadContext.LoadAssemblyFromPath が期待通りに動作する
DLLMap and Native image resolver events 動的にロードされたネイティブライブラリのエクスペリエンスを改善
.NET Core Windows Desktop Project Update WPF、WinForms プロジェクト進捗あります
High DPI for Windows Forms Applications Windows Forms アプリケーションの High DPI 対応
Entity Framework Project Update Entity Framework プロジェクト頑張ってます
Preview 4
WinForms Chart control now available for .NET Core チャートコントロール() System.Windows.Forms.DataVisualization ) が Windows Forms で使用可能になりました
Enabling the Chart control in your .NET project チャートコントロールを使う手順
WPF WPF のいくつかのコンポーネントが GitHub で公開されました
Improving .NET Core Version APIs バージョン API が期待される結果を返すようになりました
Tiered Compilation (TC) Update 階層型コンパイルの更新。効果を調査中フィードバック求む
HTTP/2 Support HttpClient が HTTP/2 をサポートするようになりました
SDK Docker Images Contain PowerShell Core .NET Core SDK Docker コンテナイメージに PowerShell Core が追加されました
Better support Docker CPU (–cpus) Limits Docker クライアントでできるメモリと CPU の制限のサポートが追加されました
Round up the value of the CPU limit CPU 制限の補足
Thread pool honors CPU limits CPU 制限の補足
Making GC Heap Sizes Smaller by default GC ヒープサイズが小さくなった
Better support for many proc machines GC がより多くのプロセッサで良い感じになった
Hardware Intrinsic API changes ハードウェア組み込み API の変更
Assembly Load Context Improvements Assembly Load Context が機能強化されました
Preview 5
WPF and Windows Forms Update WPF、Windows Forms の起動時のパフォーマンスが改善。WPF のコードをさらに GitHub に公開
Introducing the new SqlClient 新しい SqlClient を Microsoft.Data.SqlClient NuGet パッケージで公開
What is new in Microsoft.Data.SqlClient? 新しい SqlClient で Data Classification、UTF-8 support が追加された
What does this mean for System.Data.SqlClient? System.Data.SqlClient も引き続き使えるが、新しい機能は Microsoft.Data.SqlClient に追加されていく
Publishing Single EXEs アプリケーションを単一の exe ファイルとして発行できる
Introducing the JSON Serializer (and an update to the writer) JSON Serializer これまでよりも高性能な JSON シリアライザー System.Text.Json.Serialization ができました
Utf8JsonWriter Design Change Utf8JsonWriter が以前よりもさらに良くなりました
Index and Range 以前のプレビュー版から Index と Range が変わりました。使用しているコードに変更が必要です
New Japanese Era (Reiwa) 日本の新しい元号令和対応
Hardware Intrinsic API changes ハードウェア組み込みAPIの変更
.NET Core runtime roll-forward policy update .NET Coreランタイムのメジャーバージョンのロールフォワード
Making.NET Core runtime docker images for Linux smaller Linux 用の .NET Core ランタイムの Docker イメージが小さくなった
Docker Updates Docker でサポートする OS/バージョンを追加
AssemblyLoadContext Updates AssemblyLoadContextの改善、より手間をかけずに使えるように。さらなる改善も目指す
COM-callable managed components COM 呼び出し可能なマネージドコンポーネントを作成できるようになった
GC Large page support GC が Windows で large pages を使える設定を追加
Preview 6
WPF and Windows Forms update WPF のコードの多くが GitHub での公開を完了しています
Alpine Docker images ARM64 の Docker イメージができました。これまでは x64 だけ
Event Pipe improvements イベントパイプが複数のセッションをサポートするようになりました。新しいパフォーマンスカウンターが追加されました。
Optimize your .NET Core apps with ReadyToRun images コンパイル形式 ReadyToRun。使うとパフォーマンス向上
Sample performance numbers ReadyToRun のパフォーマンス測定値サンプル起動時間メモリ使用量 70-80%
ReadyToRun images, explained ReadyToRun が何をするかの説明。NGEN はクライアントマシンで行う物だったが、ReadyToRun はビルド時に行う
Instructions ReadyToRun の使い方。.csproj、publish のコマンド
Cross platform/architecture compilations ReadyToRun は今のところターゲットの環境で publishコマンドを実行する必要がある
Assembly linking 自己完結型のアプリを publish する際に、使われないアセンブリをトリミングして発行サイズを減らせる
Using the Linker and ReadyToRun Together リンカーと ReadyToRun はアプリケーションに一緒に適用できる
Native Hosting sample ネイティブホスティングのサンプルプロジェクトを GitHub に公開しました
HTTP/2 support in HttpClient HttpClient が HTTP/2 をサポートするようになりました
Preview 7
.NET Core SDK Size Improvements SDK のサイズの改善、インストールサイズ-70%くらい
Preview 8
Preview 9

.NET Core 3.0 プレビューバージョンごとの新機能名メモ

.NET Core 3.0 のリリースなので、新機能を復習してみたいと思ってまず、新機能の名前だけでも並べてみようと思いました。

.NET Core 3.0 (プレビュー 9) の新機能はこちらに情報があります。

このページから各プレビューバージョンのアナウンスのブログ記事へのリンクが張られています。
リンク先のブログサイト

リリースノートもあるのですが、微妙に表現が違う場合もあって詳細までは書いていないので、アナウンスブログを見ていきます。

■ 機能(名?)とバージョン

Preview 1
.NET Framework 4.8
Windows Desktop Comes to .NET Core
WPF, Windows Forms, and WinUI Open Sourced
WPF and Windows Forms
Applications now have executables by default
dotnet build now copies dependencies
Local dotnet tools
Introducing a fast in-box JSON Reader
Ranges and indices
Async streams
System.Buffers.SequenceReader
Serial Port APIs now supported on Linux
GPIO, PWM, SPI and I2C APIs now available
Supporting TLS 1.3 and OpenSSL 1.1.1 now Supported on Linux
Cryptography
Cryptographic Key Import/Export
More BCL Improvements
Default implementations of interface members
Tiered Compilation
Assembly Metadata Reading with MetadataLoadContext
ARM64
Platform Support
Preview 2
C# 8
Using Declarations
Switch Expressions
Async streams
IEEE Floating-point improvements
.NET Platform Dependent Intrinsics
Introducing a fast in-box JSON Writer & JSON Document
Utf8JsonWriter
JsonDocument
GPIO Support for Raspberry Pi
Local dotnet tools
Assembly Unloadability
Windows Native Interop
WPF and Windows Forms
Visual Studio support
MSIX Deployment for Desktop apps
Install .NET Core 3.0 Previews on Linux with Snap
Platform Support
Preview 3
.NET Core SDK installers will now Upgrade in Place
Docker and cgroup memory Limits
Docker Publishing Update
Index and Range
.NET Standard 2.1
F# Update
F# 4.6
dotnet fsi preview
AssemblyDependencyResolver
DLLMap and Native image resolver events
.NET Core Windows Desktop Project Update
High DPI for Windows Forms Applications
Entity Framework Project Update
Preview 4
WinForms Chart control now available for .NET Core
Enabling the Chart control in your .NET project
WPF
Improving .NET Core Version APIs
Tiered Compilation (TC) Update
HTTP/2 Support
SDK Docker Images Contain PowerShell Core
Better support Docker CPU (–cpus) Limits
Round up the value of the CPU limit
Thread pool honors CPU limits
Making GC Heap Sizes Smaller by default
Better support for many proc machines
Hardware Intrinsic API changes
Assembly Load Context Improvements
Preview 5
WPF and Windows Forms Update
Introducing the new SqlClient
What is new in Microsoft.Data.SqlClient?
What does this mean for System.Data.SqlClient?
Publishing Single EXEs
Introducing the JSON Serializer (and an update to the writer) JSON | | Serializer
Utf8JsonWriter Design Change
Index and Range
New Japanese Era (Reiwa)
Hardware Intrinsic API changes
.NET Core runtime roll-forward policy update
Making.NET Core runtime docker images for Linux smaller
Docker Updates
AssemblyLoadContext Updates
GC Large page support
Preview 6
WPF and Windows Forms update
Alpine Docker images
Event Pipe improvements
Optimize your .NET Core apps with ReadyToRun images
Sample performance numbers
ReadyToRun images, explained
Instructions
Cross platform/architecture compilations
Assembly linking
Using the Linker and ReadyToRun Together
Native Hosting sample
HTTP/2 support in HttpClient
Preview 7
.NET Core SDK Size Improvements
Preview 8
Preview 9