Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Pkl/2024-04-17-llt31
Search
Satoshi SAKAO
April 17, 2024
Programming
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Pkl/2024-04-17-llt31
社内のLTイベント「えるLT Vol.31 オンライン」で発表した資料です
Satoshi SAKAO
April 17, 2024
More Decks by Satoshi SAKAO
See All by Satoshi SAKAO
Testcontainers/2024-11-20-llt32
ottijp
0
120
JavaScriptのデバッグ/2023-09-04-llt30
ottijp
0
200
CDK for TerraformでAzureリソースをデプロイする/2023-05-15-llt29
ottijp
1
360
TWELITEへの誘い/2022-12-27-llt28
ottijp
0
190
ビルドツールBazelを触ってみた/2022-09-28-llt27
ottijp
0
230
HashiCorp Vaultを使ったシークレットのセキュアな一元管理 〜Ansibleを添えて〜/2022-07-12-llt26
ottijp
0
190
AWSインフラのデプロイをCDKでカイゼンする/2022-03-23-llt25
ottijp
0
130
Amazon Timestreamでデータ補間/2021-12-27-llt24
ottijp
0
130
ncurses/2021-05-12-llt21
ottijp
0
260
Other Decks in Programming
See All in Programming
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
4
1.4k
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
1.1k
Next.js: The final boss of Web Performance
guaca
0
370
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
6k
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
3
630
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
1.9k
Railsバージョンを4倍にした話
optim
0
840
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
490
学びを記事・スライド・Xへ高速展開する― AI-assisted Learning Loopで回すコンテンツ生成術
ochtum
0
170
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
200
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
240
Vue.jsで作る空間解析アプリとCapacitorプラグインのData Bridge
hal_spidernight
1
130
Featured
See All Featured
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
610
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
660
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Claude Code のすすめ
schroneko
67
230k
The untapped power of vector embeddings
frankvandijk
2
2k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
560
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
450
A Soul's Torment
seathinner
8
3.8k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
310
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
720
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
470
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