$30 off During Our Annual Pro Sale. View Details »

F#で作るカメラアプリケーション

 F#で作るカメラアプリケーション

Kouji Matsui
PRO

October 29, 2022
Tweet

More Decks by Kouji Matsui

Other Decks in Programming

Transcript

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

    View Slide

  2. (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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. (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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. (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

    View Slide

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

    View Slide

  13. (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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide