Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Pkl/2024-04-17-llt31
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Satoshi SAKAO
April 17, 2024
Programming
0
110
Pkl/2024-04-17-llt31
社内のLTイベント「えるLT Vol.31 オンライン」で発表した資料です
Satoshi SAKAO
April 17, 2024
Tweet
Share
More Decks by Satoshi SAKAO
See All by Satoshi SAKAO
Testcontainers/2024-11-20-llt32
ottijp
0
77
JavaScriptのデバッグ/2023-09-04-llt30
ottijp
0
180
CDK for TerraformでAzureリソースをデプロイする/2023-05-15-llt29
ottijp
1
300
TWELITEへの誘い/2022-12-27-llt28
ottijp
0
180
ビルドツールBazelを触ってみた/2022-09-28-llt27
ottijp
0
200
HashiCorp Vaultを使ったシークレットのセキュアな一元管理 〜Ansibleを添えて〜/2022-07-12-llt26
ottijp
0
170
AWSインフラのデプロイをCDKでカイゼンする/2022-03-23-llt25
ottijp
0
110
Amazon Timestreamでデータ補間/2021-12-27-llt24
ottijp
0
120
ncurses/2021-05-12-llt21
ottijp
0
220
Other Decks in Programming
See All in Programming
MUSUBIXとは
nahisaho
0
140
CSC307 Lecture 06
javiergs
PRO
0
690
LLM Observabilityによる 対話型音声AIアプリケーションの安定運用
gekko0114
2
430
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
1k
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
200
Package Management Learnings from Homebrew
mikemcquaid
0
230
Grafana:建立系統全知視角的捷徑
blueswen
0
330
dchart: charts from deck markup
ajstarks
3
990
Patterns of Patterns
denyspoltorak
0
1.4k
ぼくの開発環境2026
yuzneri
0
240
CSC307 Lecture 03
javiergs
PRO
1
490
Featured
See All Featured
エンジニアに許された特別な時間の終わり
watany
106
230k
Producing Creativity
orderedlist
PRO
348
40k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
110
Odyssey Design
rkendrick25
PRO
1
500
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
150
The browser strikes back
jonoalderson
0
390
Are puppies a ranking factor?
jonoalderson
1
2.7k
The Pragmatic Product Professional
lauravandoore
37
7.1k
Darren the Foodie - Storyboard
khoart
PRO
2
2.4k
Making Projects Easy
brettharned
120
6.6k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
Site-Speed That Sticks
csswizardry
13
1.1k
Transcript
Pkl Satoshi SAKAO えるLT Vol.31 2024-04-17 1
話すひと 2 🏢 インフォコム株式会社 サービスマネジメント室 👨🔧 ソフトウェアエンジニア 🛠 Node.js /
AWS / IoT / iOS (Swift) / Linux 💖 猫,B'z,テクテクライフ(ランク: 29) Satoshi SAKAO @ottijp.com 𝕏 @ottijp
Now playing... 3 https://bsky.app/pro fi le/ottijp.com/post/3kms7pxk2a326
Pkl • 「ぴっくる」 • OSS (since 2024-02-01) by Apple •
Con fi guration as Code • 静的設定ファイル < Pkl < プログラミング言語 4
ユースケース 5 Pkl JSON YAML XML Pkl ••• > pkl
eval ••• > pkl-gen-* App 1. 静的設定ファイルの生成 2. 設定ファイルとして利用 source code
1. 静的設定ファイルの生成 6 host = "localhost" port = 80 api
{ url = "https://example.com/api/hoge" token = "secret" } host: localhost port: 80 api: url: https://example.com/api/hoge token: secret <?xml version="1.0" encoding="UTF-8"?> <root> <host>localhost</host> <port>80</port> <api> <url>https://example.com/api/hoge</url> <token>secret</token> </api> </root> example.pkl pkl eval -f yaml example.pkl pkl eval -f xml example.pkl 再利用,テンプレート,抽象化による 複雑さの低減と保守性の向上
2. 設定ファイルとして利用 7 host: String port: UInt8 api: Api class
Api { url: String token: String } // Code generated from Pkl module `example01-template`. DO NOT EDIT. import PklSwift public enum example01Template {} extension example01Template { public struct Module: PklRegisteredType, Decodable, Hashable { public static var registeredIdentifier: String = "example01-template" public var host: String pkl-gen-swift template.pkl App ビルド ランタイムに読込 template.pkl 言語とのバインディングによる 簡単さと安全さの実現 host = "localhost" port = 80 api { url = "https://example.com/api/hoge" token = "secret" } example.pkl 準拠(amends)
データタイプ(一部) 8 // string name = "Rei" // number age
= 5 // boolean cute = true // object food { name = "ROYAL CANIN" price = 5470 } // class (typed object) class Cat { name: String age: UInt8 } rei = (Cat) { name = "Rei" age = 5 } // Duration duration = 28.d // DataSize size = 42.kb // union env: "dev" | "prod" = "prod" // list toys = new Listing { "けりぐるみ" "ねこじゃらし" "爪とぎ" } // map hospitals = new Mapping { ["primary"] { doctor = "Doctor X" tel = "03-xxxx-xxxx" } ["secondary"] { doctor = "Doctor Y" tel = "03-yyyy-yyyy" } }
式(一部) 9 // if age = 20 type = if
(age >= 20) "adult" else "child" // for ids = List(0, 1, 2) machines { for (_id in ids) { new { name = "machine_\(_id)" } } } // type test floor = 5 isNum = floor is Number // Regex postCode = "100-0001" pcRe = Regex(#"[0-9]{3}-?[0-9]{4}"#) isPCValid = postCode.matches(pcRe) // spread syntax entry1 { type = "book" } entry2 { ...entry1 }
テンプレート 10 module Configuration name: String(length > 0) email: String(isEmailValid)
local isEmailValid = (s) -> s.matches(Regex(#".+@.+"#)) emailSub: String(isEmailValid, this != email) amends "./Configuration.pkl" name = "Hoge" email = "
[email protected]
" emailSub = "
[email protected]
" Configuration.pkl me.pkl
バリデーション(型制約) 11 module Configuration name: String(length > 0) email: String(isEmailValid)
local isEmailValid = (s) -> s.matches(Regex(#".+@.+"#)) emailSub: String(isEmailValid, this != email) amends "./Configuration.pkl" name = "Hoge" email = "
[email protected]
" emailSub = "
[email protected]
" Configuration.pkl me.pkl
制約に違反している場合 12 $ pkl eval me.pkl –– Pkl Error ––
Type constraint `this != email` violated. Value: "
[email protected]
" 6 | emailSub: String(isEmailValid, this != email) ^^^^^^^^^^^^^ at Configuration#emailSub (file:///Users/hoge/Dropbox/presentation/2024-04-17-llt31/learning/ example04/Configuration.pkl, line 6) 5 | emailSub = "
[email protected]
" ^^^^^^^^^^^^^^^^^^ at me#emailSub (file:///Users/hoge/Dropbox/presentation/2024-04-17-llt31/learning/example04/ me.pkl, line 5) 106 | text = renderer.renderDocument(value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at pkl.base#Module.output.text (https://github.com/apple/pkl/blob/0.25.3/stdlib/ base.pkl#L106) amends "./Configuration.pkl" name = "Hoge" email = "
[email protected]
" emailSub = "
[email protected]
"
所感 • Con fi guration as Code便利 • デコードやバリデーションの実装の手間がなくなる •
制約をテンプレート自体に表現でき,ドキュメント化できる • 設定ミスを予防できる • 公式のチュートリアルは説明不足でちょっとわかりにくい 13
14 Appendix
提供されているツール • 実行可能ファイル (pkl) • macOS native, linux native, JAVA
• YAML, JSON, XML, Property List, Jsonnet, Pcf, (Java) Properties, Custom Renderers • ライブラリ,ソースファイル生成 (pkl-gen-*) • Java, Kotlin, Swift, and Go 15
プラグイン • VSCode, IntelliJ, vim • LSPも予定されている 16
Duration, DataSize • ビルドインサポートのフォーマットではそのまま出力できない • output.renderer.converters を定義すれば出力できる 17
Refs • 公式ページ https://pkl-lang.org/ 18