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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
210
CDK for TerraformでAzureリソースをデプロイする/2023-05-15-llt29
ottijp
1
370
TWELITEへの誘い/2022-12-27-llt28
ottijp
0
200
ビルドツールBazelを触ってみた/2022-09-28-llt27
ottijp
0
240
HashiCorp Vaultを使ったシークレットのセキュアな一元管理 〜Ansibleを添えて〜/2022-07-12-llt26
ottijp
0
200
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
Kawaiicon: Kubernetes, it's no longer cool, but let's secure it anyway!
barnbarn
0
120
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
300
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
730
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
140
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
410
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
630
地方こそサーバーレス — 10年続けた、顔が見えるチームで確かな基盤を / Serverless Matters Most in Regional Areas — 10 Years of Building Reliable Foundations with Close-Knit Teams
seike460
PRO
1
300
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
130
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.6k
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
170
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
15
11k
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
290
Featured
See All Featured
30 Presentation Tips
portentint
PRO
1
460
Claude Code のすすめ
schroneko
67
230k
Leo the Paperboy
mayatellez
10
2.4k
Practical Orchestrator
shlominoach
192
12k
Why Our Code Smells
bkeepers
PRO
340
58k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
A Tale of Four Properties
chriscoyier
163
24k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.3k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
930
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
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