# การเข้ารหัสสคริปต์

ในบทนี้ คุณจะได้เรียนรู้วิธีการเข้ารหัสโมดูลหรือสคริปต์ FIRERPA ที่คุณพัฒนาขึ้น บทนี้ไม่ได้เกี่ยวกับการเข้ารหัสสคริปต์บน PC ของคุณ แต่เป็นการเข้ารหัสสคริปต์หรือโมดูลที่ทำงานในสภาพแวดล้อม Python ที่ติดตั้งมากับ FIRERPA เช่น โมดูลใน `/data/usr/module/task`, `/data/usr/module/extension` หรือสคริปต์ที่รันโดยใช้คำสั่ง Python ที่ติดตั้งมาในตัว เราได้จัดเตรียมเครื่องมือที่เกี่ยวข้องเพื่อช่วยให้คุณดำเนินการได้อย่างรวดเร็ว และในบทนี้คุณจะได้เรียนรู้วิธีการปกป้องสคริปต์ที่คุณพัฒนาขึ้น

การเข้ารหัสสคริปต์ใช้วิธีการแปลงโค้ดเป็น C ด้วย Cython แล้วคอมไพล์เป็นไฟล์ so ซึ่งจะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงานของคุณมากนัก อย่างไรก็ตาม เราแนะนำให้คุณเข้ารหัสเฉพาะส่วนตรรกะหลัก (core logic) เท่านั้น ไม่ใช่ไฟล์สคริปต์ทั้งหมด และโปรดอย่าใช้เพื่อเข้ารหัสไฟล์ของไลบรารีจากภายนอก (third-party library) เพราะเป็นการกระทำที่เปล่าประโยชน์ ควรยึดหลัก "เข้ารหัสเฉพาะตรรกะของคุณเอง" เสมอ

## การสร้าง Image ของเครื่องมือ

เราพึ่งพา Docker เป็นอย่างมาก ดังนั้นโปรดเตรียม Docker ให้พร้อมก่อนดำเนินการต่อ ตอนนี้ โปรด clone `https://github.com/firerpa/compiler` และสร้าง image ตามเอกสารหรือใช้คำสั่งต่อไปนี้

```bash
docker build -t compiler .
```

## การเข้ารหัสโค้ดสคริปต์

ใช้คำสั่งต่อไปนี้เพื่อ map source code เข้าไปใน image และทำการคอมไพล์ สถาปัตยกรรม (arch) ที่รองรับได้แก่ arm, arm64, x86, x86_64 ซึ่งสอดคล้องกับสถาปัตยกรรมต่างๆ ของเซิร์ฟเวอร์ FIRERPA และสถาปัตยกรรมที่แตกต่างกันจะไม่สามารถทำงานร่วมกันได้

```bash
docker run -it --rm -v /source/dir:/data compiler:latest compile.sh --arch arm64 /data/my_important_script.py
```

โดยปกติแล้ว หลังจากรันคำสั่ง คุณจะได้รับไฟล์ `my_important_script.cpython-39.so` ในไดเรกทอรีเดียวกับสคริปต์ของคุณ โปรดอย่าเปลี่ยนชื่อไฟล์นี้ หากคุณต้องการใช้ชื่ออื่น คุณควรเปลี่ยนชื่อไฟล์สคริปต์โดยตรง ตอนนี้ ในสคริปต์ที่คุณจะเผยแพร่ คุณสามารถลบไฟล์ source code .py ที่เกี่ยวข้องออกไป และใส่ไฟล์ .so เข้าไปแทนได้เลย

```{attention}
หากโค้ดของคุณไม่ใช่โมดูลของ FIRERPA (extension, task) และมีเพียงไฟล์เดียว Python จะไม่สามารถรันไฟล์ .so ได้โดยตรง คุณจะต้องเขียนสคริปต์ .py ที่เป็น entry point เพื่อ import และเรียกใช้งานไฟล์ .so ที่เข้ารหัสแล้ว หากเป็นโมดูล คุณสามารถนำไปวางในไดเรกทอรีที่เกี่ยวข้องแล้วรีสตาร์ทได้เลย
```