Slide 1

Slide 1 text

(c) 2022 Kouji Matsui F#で作る カメラアプリケーション 2022.11.29 FUN FAN F# 7 IN TOKYO - KOUJI MATSUI @KOZY_KEKYO

Slide 2

Slide 2 text

(c) 2022 Kouji Matsui Kouji Matsui – kozy, kekyo • NAGOYA city, AICHI pref., JP • Self employed • Center CLR organizer. https://centerclr.connpass.com/ • .NET/F#/IL/metaprogramming or like… • Bicycle rider

Slide 3

Slide 3 text

(c) 2022 Kouji Matsui (c) 2022 Kouji Matsui Agenda 最近のアウトプット F#でGUIアプリケーションを作る ライブデモ

Slide 4

Slide 4 text

(c) 2022 Kouji Matsui 最近のアウトプット ここ1年程で新規に作ったり継続してメンテナンスしているOSS プロジェクトを、10個ほど紹介します。 ほぼ全部のプロジェクトを、何かしらのお仕事で使っています ◦ 非公開案件ですが、OSSで公開したプロジェクトを仕事で使用OKして 貰っているので感謝。 ここに挙げてないプロジェクトもまだいくつか…

Slide 5

Slide 5 text

(c) 2022 Kouji Matsui 最近のアウトプット RelaxVersioner ◦ パッケージ導入だけで、完全自動で、Gitのタグやブランチ情報をコー ドに埋め込みます。 ◦ Gitだけでバージョン管理出来ます。 ◦ C#, F#, VB.NET, C++/CLI ◦ もちろんCI対応。SourceLink併用可能。 ◦ パッケージへの適用も自動。 ◦ もう結構長くやってて、ずっと使っています。 ◦ https://github.com/kekyo/CenterCLR.RelaxVersioner

Slide 6

Slide 6 text

(c) 2022 Kouji Matsui 最近のアウトプット DupeNukem ◦ ガワネイティブで使うWebViewのJavaScriptと、非同期双方向RPCが手軽 に出来る、WebViewの実装に依存しないライブラリ。 ◦ WebViewに要求されるのは、文字列の送受信のみ。 ◦ C#でもJavaScriptでも、async-awaitで同じようにコードが書けます。通 信アーキテクチャについて悩まなくても良くなった。 ◦ Edge WebView2 ◦ CefSharp ◦ Xamarin Forms (Xam.Plugin.Webview) ◦ etc… ◦ https://github.com/kekyo/DupeNukem

Slide 7

Slide 7 text

(c) 2022 Kouji Matsui 最近のアウトプット Marionetta ◦ DupeNukemを使って、アウトプロセスサンドボックスでライブラリを 駆動するための、IPCライブラリ。 ◦ 直接メインプロジェクトに組み入れることが出来ない、以下のような コードを、出来るだけ簡単に扱えるようにします。 ◦ どうしようもない負債コード ◦ 古いアーキテクチャのライブラリ ◦ 32ビットで縛られているライブラリ ◦ .NET Framework固定のライブラリ ◦ https://github.com/kekyo/Marionetta

Slide 8

Slide 8 text

(c) 2022 Kouji Matsui 最近のアウトプット ILAsm.Managed ◦ 公式のILAsmがネイティブコードで扱いにくいので、monoのILAsmをマ ルチプラットフォームで使えるように移植したもの。 ◦ 公式ILAsmは、ディストリビューション毎にパッケージが分割されていてちょっと… そこに NuGet CLIの制約が組み合わさって、使い物にならない… ◦ マネージコードなので、Windows, LinuxどちらでもOK。 ◦ つまり、CIフリー。 ◦ https://github.com/kekyo/ILAsm.Managed

Slide 9

Slide 9 text

(c) 2022 Kouji Matsui 最近のアウトプット ILCompose ◦ CILアセンブラ言語で書かれたコードを、直接C#などのアセンブリに挿 入します。 ◦ C#で言うところの、partial classによる合成をCILで出来るようにしたも の。イメージ的には、ソース分割されるインラインアセンブラ。 ◦ かつてのILSupportが扱いにくいので、パッケージ導入だけでマルチプ ラットフォームで使えるようにしました。 ◦ CIフリー。 ◦ https://github.com/kekyo/ILCompose

Slide 10

Slide 10 text

(c) 2022 Kouji Matsui 最近のアウトプット ILRepack.FullAuto ◦ ILRepack (Successor of ILMerge) を、完全自動で使えるようにしたパッ ケージ。 ◦ 多種多様な亜種がありますが、いろいろ問題が発生したりするので、 とにかく現在の環境で完全に使えるように。 ◦ Linuxでも行けるので、CIで使えます(要: monoランタイム) ◦ https://github.com/kekyo/ILRepack.FullAuto

Slide 11

Slide 11 text

(c) 2022 Kouji Matsui 最近のアウトプット SkiaImageView ◦ SkiaSharpの各種オブジェクトを、バインディングだけで表示できるコ ントロールです。 ◦ WPFのImageコントロールに似せてあります。レイアウトの制御方法も ほぼ同じです。 ◦ Source=“{Binding Image}” ◦ SKBitmap, SKImage, SKPicture, SKDrawable, SKSurface ◦ 文字列またはUriで非同期ダウンロード表示 ◦ WPF, Xamarin Forms ◦ https://github.com/kekyo/SkiaImageView

Slide 12

Slide 12 text

(c) 2022 Kouji Matsui 最近のアウトプット FlashCap ◦ マルチプラットフォーム対応のビデオキャプチャ(フレームグラバ) ◦ Windows (DirectShow, VFW), Linux (V4L2) ◦ 完全に自前でP/Invokeするので、依存ライブラリなし。 ◦ 多くのデバイスと環境でテスト。 ◦ 簡潔かつ拡張可能なインターフェイス。 ◦ https://github.com/kekyo/FlashCap

Slide 13

Slide 13 text

(c) 2022 Kouji Matsui 最近のアウトプット Epoxy ◦ 様々なプラットフォームで使える、直交的なMVVMライブラリです。 ◦ WPF, Avalonia, OpenSilver, UWP, WinUI 3, Xamarin Forms, MAUI ◦ F#も行けます!(WPF, Avalonia) ◦ どの環境でも、一様に同じAPIインターフェイス ◦ ViewModelのイベント発火は、ビルド時に自動的にCILコード挿入を行 うので、完全スタティック動作。 ◦ 個々の機能は完全に独立していて、自由に組み合わせることが出来ま す。 ◦ そのため、他のライブラリとの併用も問題ありません。 ◦ https://github.com/kekyo/Epoxy

Slide 14

Slide 14 text

(c) 2022 Kouji Matsui (c) 2022 Kouji Matsui Agenda 最近のアウトプット F#でGUIアプリケーションを作る ライブデモ

Slide 15

Slide 15 text

(c) 2022 Kouji Matsui F#でGUIアプリケーションを作る カメラアプリケーションを作ります: ◦ USBカメラを接続して、映像がプレビュー出来るところまでが目標 ◦ F#でWPFのアプリケーション ◦ Epoxy, FlashCap, SkiaImageViewを使います ◦ コードビハインドは一切使いません ◦ そもそも、F#とWPFの組み合わせでは出来ません。 ◦ Epoxyがあれば簡単です。

Slide 16

Slide 16 text

(c) 2022 Kouji Matsui (c) 2022 Kouji Matsui Agenda 最近のアウトプット F#でGUIアプリケーションを作る ライブデモ

Slide 17

Slide 17 text

(c) 2022 Kouji Matsui ライブデモ YouTube: https://youtu.be/bhXDUpG8xSg

Slide 18

Slide 18 text

(c) 2022 Kouji Matsui 以下の展望が持てるかも? キーか何かでシャッターを切って、画像を保存するのは簡単 に出来るはず? ◦ XAMLにボタンを配置して、Commandをプロパティで公開しておけば、 ボタンクリックが検知できる。 ◦ 直近のSKBitmapを保存しておく。 ◦ SKBitmap.Encode()で任意の画像フォーマットでファイルに保存。 Zxingにかければ、バーコードをリアルタイムで認識出来そ う? ◦ ZXing.Net.Bindings.SkiaSharpのSKBitmapLuminanceSourceを 使えば、SKBitmapから直接バーコード検出が出来ます。

Slide 19

Slide 19 text

(c) 2022 Kouji Matsui 以下の展望が持てるかも? 少しの変更でAvaloniaでも行けそう? ◦ SKBitmapの代わりにAvaloniaのBitmapを使えば簡単に行けます。 C# & XAMLの様々な知見が応用できそう? ◦ 課題も、対応する情報もウェブ上にいっぱいあります。 ◦ F#固有の問題は (Epoxyを使う限りは) そんなに多くないです。

Slide 20

Slide 20 text

(c) 2022 Kouji Matsui 質疑応答 デモ実装例: https://github.com/kekyo/fffsharp-demo-cameraapp