ช่วงหลายวันมานี้ได้มีโอกาสสร้าง FHIR Implementation Guide โดยใช้ FHIR Shorthand (FSH) มาครับ ผมรู้จัก FSH ครั้งแรกจาก blog ที่พี่กวินเขียน หลังจากนั้นก็เห็นคนพูดถึงมากขึ้นเรื่อย ๆ เลยคิดว่าน่าสนใจครับ พอดีมีงานที่ต้องทำ IG เข้ามา ก็เลยถือโอกาสลองใช้ FSH ดูเลยครับ
ต้องบอกว่าจริง ๆ FSH ก็แอบมี learning curve ที่ไม่ง่ายมากนะครับ คือส่วน basic มันไม่ยากหรอก แต่ส่วนที่ซับซ้อนขึ้นมาก็ใช้เวลาเป็นวันเหมือนกันครับ แต่ว่าพอเข้าใจหลักการแล้ว ผมว่า FSH ดีมาก ๆ เลยนะครับ คือถ้าต้องทำทั้ง Profiles ทำทั้งตัวอย่าง resource instance โดยใช้เครื่องมือที่มีในปัจจุบัน (เช่น Forge) ก็คงไม่ได้เสร็จได้ง่าย ๆ และจะแก้อะไรทีละเยอะ ๆ ก็ลำบาก พอเป็น command-line tool แบบนี้ แก้รวดเดียว build รวดเดียว เสร็จเลย ผมว่านี่น่าจะกลายเป็นท่ามาตรฐานในการทำ FHIR artifact ในอนาคตเลยครับ
สำหรับ blog นี้ ก็คือโอกาสสรุปขั้นตอนที่ทำ เพื่อบันทึกไว้กันลืม และเพื่อแชร์ให้คนอื่นด้วยครับ
Special Thanks: วิดีโอจาก FHIR DevDays เหล่านี้ที่ให้ความรู้ครับ
- José Costa Teixeira – Accelerating your Implementation Guide Production | DevDays June 2021 Virtual
- Mark Kramer – Create an Implementation Guide with FHIR Shorthand | DevDays June 2021 Virtual
- Chris Moesel – Advanced FHIR Shorthand and Tools | DevDays June 2021 Virtual
- Mark Kramer – Introduction to FHIR Shorthand | DevDays November 2020 Virtual
- M. Kramer & C. Moesel – Let’s Build – Profiling with FHIR Shorthand | DevDays November 2020 Virtual
ภาพ featured image โดย Francesco Ungaro บน Unsplash
ขั้นที่ 1: เตรียมเครื่องมือ
ซึ่งได้แก่ NodeJS, SUSHI (npm package)
npm install -g fsh-sushi
ขั้นที่ 2: สร้าง FSH โปรเจคท์ใหม่
sushi --init
การ config เพิ่มเติมต่าง ๆ ดูได้ที่หน้า Project Structure และ Configuration ครับ หลัก ๆ ที่ต้องแก้ขั้นพื้นฐาน ก็คือไฟล์ sushi-config.yaml ดูตรงส่วน minimum configuration หรือ recommended configuration ก็ได้ครับ (แต่เราน่าจะไม่ได้ใช้ US Core dependency) จากนั้นเวลาจะทำ artifiacts ต่าง ๆ (Profile, Instance, ฯลฯ) เราจะทำผ่านไฟล์ .fsh
ครั้งนี้ผมทำใน VS Code เพราะมี extension ชื่อ FHIR Shorthand ให้ใช้ ซึ่งจะช่วย highlight syntax ของไฟล์ .fsh ให้เราครับ ถ้าเราใช้ sushi init เราจะได้โครงสร้าง project ประมาณนี้ หลัก ๆ ที่ต้องแก้อยู่ในโฟลเดอร์ fsh จะมีกี่ไฟล์กี่โฟลเดอร์ย่อยข้างในนั้นก็ได้ เวลามัน process ออกมามันจะไปดูไฟล์ทั้งหมดในโฟลเดอร์

ขั้นที่ 3: ลองรัน SUSHI
จากนั้นก็ลองเข้าไปที่ directory แล้วลองรัน SUSHI โดยรันคำสั่งนี้
sushi .
ถ้าไม่มี error อะไร ก็จะขึ้นเป็นกล่องเขียว ๆ ไม่มี error แต่ถ้ามีก็จะเป็นกล่องแดงแล้วบอกเราว่า error อยู่ตรงไหน

ขั้นที่ 4: ลองใช้ Publishing tool สร้าง Implementation Guide (IG)
ลองดูตรงหน้า Running SUSHI ตรงส่วนนี้เพิ่มเติมครับ ที่ต้องทำก็คือ download IG Publisher มาก่อน
./_updatePublisher.sh
จากนั้นลองรันดู
./_genonce.sh
มันจะ generate ไฟล์ทั้งหมดไปไว้ที่ /output/index.html ถ้าเรามีพวก live-server extension ก็จะสะดวกดีครับ ไม่ต้องคอยเปิดไฟล์
ขั้นที่ 5: จัดการเรื่อง Git และ GitHub
จริง ๆ git init นี่ควรจะทำตั้งแต่แรก ๆ แต่ไม่เป็นไรครับ สมมติทำในขั้นนี้ก็ได้ จากนั้นเราก็ไปเปิด repo ใหม่บน GitHub อันนี้ไม่ยากนะครับ ทำตามขั้นตอนไป แล้วก็มาเพิ่ม remote branch เข้าไปใน git ของเรา
git init echo "# MESSAGE" >> README.md git add README.md git commit -m "first commit" git remote add origin git@github.com:User/UserRepo.git git push -u origin main
ขั้นที่ 6: จัดการเรื่อง GitHub Page
ไปเปิดใช้ที่ Settings ของ repo นั้น แล้วไปที่ส่วน Pages ตอนนี้เลือกเป็น main ไปก่อนก็ได้ครับ
หลังจากนั้นให้สร้าง Action ใหม่ โดยสร้างไฟล์ชื่อ main.yml ที่ [repo]/.github/workflows/ กลายเป็น [repo]/.github/workflows/main.yml โดยเนื้อหาของไฟล์ ให้นำมาจากไฟล์นี้ของ HL7 Belgium กลายเป็นแบบนี้นะครับ

จากนั้น เมื่อเรา push code ของเราขึ้นไป ระบบจะไป build ให้เราเอง โดยนำ output ที่ได้ไปอยู่ที่ gh-pages branch แบบนี้ครับ

ตอนนี้เราต้องไปเปลี่ยน Source ของ GitHub Page ตรง Setting ของ repo ตรงส่วน Page ให้เป็น gh-pages branch ก่อนครับ

เราจะสามารถเข้าผ่าน https://username.github.com/repo/ ได้ครับ
หมายเหตุ: ในขั้นตอนการ build หลังจากที่ push code และในขั้นตอนการเปลี่ยน source จะมีระยะเวลาต้องรอนิดนึงนะครับ วิธีดูง่าย ๆ ว่าเสร็จแล้วคือดูจากลูกศรสีเขียวข้างบน repo ครับ

ขั้นที่ 7: ลงมือแก้ไข FHIR Artifacts
ทั้งเรื่องการใช้ FSH และการแก้ไขข้อมูลใน IG เพื่อทำการ publish มีรายละเอียดที่ค่อนข้างเยอะ จะเขียนในนี้คงยาวครับ ไว้มีโอกาสมาสรุปให้ฟังครับ หากสนใจหาข้อมูลเพิ่มเติม ผมแนะนำแหล่งต่อไปนี้ครับ
ในด้านการใช้ FSH ผมว่า Docs ของเขาก็เขียนได้ดี แต่หาข้อมูลยากไปนิด
- ตรงส่วน Overview จะพอเข้าใจการใช้งานขั้นพื้นฐานที่สำคัญ ๆ ได้ แต่ไม่พอทำอะไรซับซ้อน เช่น Slicing
- ตรงส่วน Language Reference อันนี้เป็นการใช้งานโดยละเอียด แต่ยาวมาก
- FSH school อันนี้ก็เป็นการแนะนำการใช้งานเบื้องต้นที่ดีครับ ทีเด็ดจริง ๆ อยู่ที่ Play with FSH ครับ โดยเราสามารถไปเอา Profile ดัง ๆ ที่คนอื่นเขียน (เช่น US Core, IPS) เอามา convert เป็น FSH ได้ครับ เราก็พอได้ไอเดียว่าต้องเขียน FSH ของเรายังไง
ในด้านการใช้ IG publishing มี 2 แหล่งที่สำคัญครับ
- Guidance for FHIR IG Creation อันนี้บอกเรื่องการสร้าง IG ค่อนข้างละเอียด
- IG Publisher Documentation อันนี้บอกวิธีการใช้ publishing tool
- tutorial-ig GitHub repo ของ HL7-BE ลองดูไปแต่ละ commit ครับ เขาอธิบายวิธีการ config publishing tool ได้ค่อนข้างดี หรือดูคลิปที่คุณ José Costa Teixeira สอนชั่วโมงที่สอง จะอธิบายเรื่องนี้ครับ
อันนี้ก็เป็น IG ที่ผมสร้างวันนี้นะครับ ยังไม่เสร็จหลาย ๆ หน้าครับ

หากสนใจสามารถเข้าไปดูได้ที่ https://rathpanyowat.github.io/ncd-th-ig-demo/ ครับ
ก็จบแล้วครับ ไว้ได้เรียนรู้ประเด็นนี้เพิ่มเติมอย่างไรเอามาแชร์เพิ่มครับ