SlideShare a Scribd company logo
型プロバイダー開発
ハンズオン
【第五回】 Fun Fan Fsharp 発表資料
自己紹介
京德 優希 (きょうとく ゆうき)
1994年12月20日生まれ(現在27歳)
Twitter : ゆきあん@snowapricot47
F#は2017年からかな
現在休職中(2月~6月?)
復職、転職の決断をする
背景
型プロバイダー面白そう
自分がインプットしたことをアウトプットしたい
調べていくうち、私の言いたいことをほとんど言わ
れているという気持ち
型プロバイダーとは
メタデータを与えて型を生成できる
・ローカルにあるCSVのファイルから型を作ったり
・ネットワークからJsonを受け取って型を作ったり
IDEと組み合わせるとコード補完が効く
コンパイル時計算としても使える
今回のスコープ
1. 型プロバイダーのテンプレートの使い方
2. 型プロバイダーの作り方
3. 実際にやってみる
型プロバイダーのテンプレートの使い方
dotnet new -i FSharp.TypeProviders.Templates
dotnet new typeprovider –o [プロジェクト名]
cd [プロジェクト名]
いくつかのファイルを修正する
dotnet tool restore
dotnet paket update
dotnet build
ProvidedTypes.fs/fsi をプロジェクトに追加したいっぽい
paket を使っていい感じに解決してくれている
型プロバイダーのテンプレートの使い方
以下のファイルを修正した方がいいかも
global.json
sdkのバージョンを「5.0.400」から変更
paket.dependencies
Fsharp.Coreのバージョンを「4.7.2」から変更
src/[パッケージ名].Runtime
Fsharp.Coreのバージョンを「4.7.2」から変更
自分で型プロバイダーを作成する
主にDesignTime.fsを触ることになる
TypeProviderForNamespacesを継承したクラスを作る
TypeProvider属性を付ける
TypeProviderConfigとassemblyReplacementMapについては、
今回はおまじないと思ってもらって(今回は使わないので
後々使うものをついでに定義しておく(ns, asm)
[<TypeProvider>]
type SampleProvider (config : TypeProviderConfig) as this =
inherit TypeProviderForNamespaces (config,
assemblyReplacementMap=[("SampleProvider.DesignTime", "SampleProvider.Runtime")])
let ns = "SampleNamespace"
let asm = Assembly.GetExecutingAssembly()
自分で型プロバイダーを作成する
1. 型を作る関数を作る
1. 型名と引数を受け取れるようにする
2. 型を作る
3. 型にメンバーを追加する
4. 型を返す
2. 静的パラメータを受け取る処理を作る
3. 名前空間に追加する
型を作る
ProvidedTypeDefinitionで定義する
必要そうなものだけピックアップ
引数名 型名 指定内容
assembly Assembly 型を含めるアセンブリ
namespaceName string 名前空間名
className string クラス名
baseType Type option 基底クラス
hideObjectMethods bool option Objectクラスのメソッドを使わないならtrue
isErased bool option 消去型ならtrue 生成型ならfalse
型にメンバーを追加する
以下の型を作成し、AddMemberで加える
よく使うものをピックアップ
型名(Provided) 名称指定 引数指定 型指定 コード指定
Constructor なし parameters なし invokeCode
Property propertyName なし propertyType getterCode
setterCode
Method methodName parameters returnType invokeCode
型にメンバーを追加する
コード指定はExpr型を利用している
コードクォートとスプライス演算子の知識が必要
Exprを作るときは <@@ @@> で囲む
Exprから取り出すときは %% を前につける
let expr1: Expr = <@@ 3 :> obj @@>
let expr2: Expr = <@@ %%expr1 @@>
let f (expr: Expr): Expr = <@@ (%%expr :> obj) :?> int @@>
静的パラメータを受け取る処理を作る
型を作り、DefineStaticParametersを呼び出す
基本的には型を作る関数を呼び出すだけ
静的パラメータはobjのため、キャストして渡す
let provider = ProvidedTypeDefinition(asm, ns, “MyProvider”,
Some typeof<obj>, isErased=false)
provider.DefineStaticParameters(
[ProvidedStaticParameter("count", typeof<int>)],
fun typeName args -> createType typeName (args[0] :?> int)
)
名前空間に追加する
this.AddNamespaceを呼び出すだけ
名前空間、作成した型のリストを渡す
Provided~はAddXmlDocでコメントを付けられる
provider.AddXmlDoc("<sammary> ドキュメント</sammary>")
do this.AddNamespace(ns, [provider])
ハンズオン!
さすがにブラウザ環境ではできないのVSCodeで
以下の流れで行きます
1. 自分で作ったものを実演
2. プロジェクト作成から完成まで
参考になるページ
The F# Type Provider SDK (fsprojects.github.io)
https://fsprojects.github.io/FSharp.TypeProviders.SDK/
Type Providers From the Ground Up - Mavnn's blog
https://blog.mavnn.co.uk/type-providers-from-the-ground-up/
なごやまつりでF# Type Providerについて(?)話してきた - ぐるぐ
る~ (hatenablog.com)
https://bleis-tift.hatenablog.com/entry/ngmatsuri
型プロバイダー(TypeProviders)のちょっとしたアレコレ - Bug
Catharsis (hatenablog.com)
https://zecl.hatenablog.com/entry/TypeProvderArekore
ご視聴ありがとうございました
感想とかもらえると嬉しいです(励みになります)

More Related Content

What's hot

課金アプリの作り方(高畑)
課金アプリの作り方(高畑)課金アプリの作り方(高畑)
課金アプリの作り方(高畑)
Masahide Takahata
 

What's hot (20)

【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで
【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで
【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで
 
ユーザーインタビューするときは、どうやらゾンビのおでましさ
ユーザーインタビューするときは、どうやらゾンビのおでましさユーザーインタビューするときは、どうやらゾンビのおでましさ
ユーザーインタビューするときは、どうやらゾンビのおでましさ
 
企業システムにアジャイルは必要か
企業システムにアジャイルは必要か企業システムにアジャイルは必要か
企業システムにアジャイルは必要か
 
はじめての datadog
はじめての datadogはじめての datadog
はじめての datadog
 
ディープラーニングとAppiumでテストを自動化
ディープラーニングとAppiumでテストを自動化ディープラーニングとAppiumでテストを自動化
ディープラーニングとAppiumでテストを自動化
 
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
 
5分で解るセキュアコーディング
5分で解るセキュアコーディング5分で解るセキュアコーディング
5分で解るセキュアコーディング
 
お客様の目を覚ませ! ついでに自分の目も覚ませ! デザイン思考のクライアントワークのプレセールス
お客様の目を覚ませ! ついでに自分の目も覚ませ! デザイン思考のクライアントワークのプレセールスお客様の目を覚ませ! ついでに自分の目も覚ませ! デザイン思考のクライアントワークのプレセールス
お客様の目を覚ませ! ついでに自分の目も覚ませ! デザイン思考のクライアントワークのプレセールス
 
実践リーンエンタープライズ(20161027)
実践リーンエンタープライズ(20161027)実践リーンエンタープライズ(20161027)
実践リーンエンタープライズ(20161027)
 
パーソナルデータのあり方を変える!オープンソース分散型PDS「Personium」を使ってみよう!
パーソナルデータのあり方を変える!オープンソース分散型PDS「Personium」を使ってみよう!パーソナルデータのあり方を変える!オープンソース分散型PDS「Personium」を使ってみよう!
パーソナルデータのあり方を変える!オープンソース分散型PDS「Personium」を使ってみよう!
 
オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法 (PHPカンファレンス2019)
オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法 (PHPカンファレンス2019)オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法 (PHPカンファレンス2019)
オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法 (PHPカンファレンス2019)
 
グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発
 
クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014
クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014 クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014
クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014
 
課金アプリの作り方(高畑)
課金アプリの作り方(高畑)課金アプリの作り方(高畑)
課金アプリの作り方(高畑)
 
E school japan waseda july11
E school japan waseda july11E school japan waseda july11
E school japan waseda july11
 
What is quality culture? Is it something tasty?
What is quality culture? Is it something tasty?What is quality culture? Is it something tasty?
What is quality culture? Is it something tasty?
 
Elastic APM:ログとメトリックから全体像を描き出す
Elastic APM:ログとメトリックから全体像を描き出すElastic APM:ログとメトリックから全体像を描き出す
Elastic APM:ログとメトリックから全体像を描き出す
 
動画コンテンツにおいて、BGMとの制御でつまづいたところ
動画コンテンツにおいて、BGMとの制御でつまづいたところ動画コンテンツにおいて、BGMとの制御でつまづいたところ
動画コンテンツにおいて、BGMとの制御でつまづいたところ
 
オートモーティブ領域における 位置情報関連アルゴリズムあれこれ
オートモーティブ領域における 位置情報関連アルゴリズムあれこれオートモーティブ領域における 位置情報関連アルゴリズムあれこれ
オートモーティブ領域における 位置情報関連アルゴリズムあれこれ
 
Data × UX - 定量分析と定性分析のシナジーをガチUXデザイナーが語る
Data × UX - 定量分析と定性分析のシナジーをガチUXデザイナーが語るData × UX - 定量分析と定性分析のシナジーをガチUXデザイナーが語る
Data × UX - 定量分析と定性分析のシナジーをガチUXデザイナーが語る
 

Recently uploaded

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
ssuserbefd24
 

Recently uploaded (11)

論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 

型プロバイダー開発ハンズオン.pptx