Optimize คำสั่ง SQL สำหรับการสุ่มเวชระเบียนด้วยวิธี Systematic sampling

เดิมเคยเขียนคำสั่ง SQL ไว้นานละพอแก่ตัวขึ้นกลับไปดู มันก็สมควรเปลี่ยน (Optimize) แหล่ะ  เราจะไม่ลงรายละเอียดเรื่องของการตรวจสอบเวชระเบียนหล่ะกัน ขอข้ามไปพาร์ทสำหรับการเตรียมข้อมูล (กลุ่มตัวอย่าง) เพื่อให้ผู้เกี่ยวข้องทำงานต่อ
เริ่มด้วย Systematic Random Sampling (การสุ่มตัวอย่างแบบเป็นระบบ)

การสุ่มตัวอย่างแบบเป็นระบบ ( Systematic sampling) เป็นการสุ่มตัวอย่างโดยมีรายชื่อของทุกหน่วยประชากรมาเรียงเป็นระบบตามบัญชีเรียกชื่อ การสุ่มจะแบ่งประชากรออกเป็นช่วงๆที่เท่ากันอาจใช้ช่วงจากสัดส่วนของขนาดกลุ่มตัวอย่างและประชากร แล้วสุ่มประชากรหน่วยแรก ส่วนหน่วยต่อๆไปนับจากช่วงสัดส่วนที่คำนวณไว้

ขั้นตอนคร่าว ๆ ของการเตรียมข้อมูลสุ่มตัวอย่างแบบนี้คือ

  1. เลือกแฟ้มจาก OPD Card หรือ สมุดทะเบียนผู้มารับบริการ จำแนกตาม PID หรือ HN หรือวันที่ที่มารับบริการ
  2. หาช่วง Interval (I) ของการสุ่มโดยใช้สูตร
    I = จำนวนเวชระเบียนผู้ป่วยทั้งหมด ÷ จำนวนเวชระเบียนผู้ป่วยที่ต้องการ
  3. หาค่าตั้งต้นโดยการจับฉลาก (สุ่ม) เช่น จับฉลากได้หมายเลข 5 ให้เลือกเวชระเบียนแฟ้มแรกคือลำดับที่ 5 แล้วนับต่อไปทุกลำดับที่ I เช่นกรณีได้ค่า I = 3 ก็นับไปเลย 5, 8, 11, 14, 17, 20, ………จนได้ครบตามจำนวนที่ต้องการ

มาดู SQL ตัวที่พยายาม  Optimize กัน

 

Implements a scheduled task using Supercronic

Cron เป็นโปรแกรมสำหรับการทำ schedule tasks  ที่เราต้องการ พบเจอได้ใน Unix-like OS ตามไปอ่านรายละเอียดได้ที่นี่

Supercronic ก็จัดอยู่ในโปรแกรมข้างต้น คนทำให้นิยามว่า

Supercronic is a crontab-compatible job runner, designed specifically to run in containers.

เหตุผลที่ทำ Supercronic ขึ้นมาตามไปอ่านรายละเอียดได้ที่นี่ (ไม่ได้ขี้เกียจนะ 55+) ที่นี้เราลองมาอิมพลีเมนท์กันดู

เริ่มก็สร้าง Dockerfile ตามนี้

FROM alpine:3.8
LABEL author="mf"
LABEL version="latest"

ENV SUPERCRONIC_VERSION="v0.1.6" \
    SUPERCRONIC_PACKAGE=supercronic-linux-amd64 \
    SUPERCRONIC_SHA1SUM=c3b78d342e5413ad39092fd3cfc083a85f5e2b75

ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/$SUPERCRONIC_VERSION/$SUPERCRONIC_PACKAGE

ENV TZ Asia/Bangkok

# install dependencies
RUN apk add --update --no-cache ca-certificates curl \
# install supercronic
    && curl -fsSLO "$SUPERCRONIC_URL" \
    && echo "${SUPERCRONIC_SHA1SUM}  ${SUPERCRONIC_PACKAGE}" | sha1sum -c - \
    && chmod +x "${SUPERCRONIC_PACKAGE}" \
    && mv "${SUPERCRONIC_PACKAGE}" "/bin/${SUPERCRONIC_PACKAGE}" \
    && ln -s "/bin/${SUPERCRONIC_PACKAGE}" /bin/supercronic \
# remove unwanted deps & cleanup
    && apk del --purge ca-certificates curl \
    && rm -rf /tmp/* /var/cache/apk/*

ADD crontab.sample /etc/crontab
RUN chmod 0644 /etc/crontab

ENTRYPOINT ["supercronic"]
CMD ["/etc/crontab"]

** ณ ตอนนี้ (29 พ.ย. 61) เวอร์ชั่นล่าสุดอยู่ที่ 0.1.6 ลองเช็คดูเรื่อย ๆ ที่ Github

ตามด้วยการสร้างไฟล์ Crontab สำหรับทำงาน ตัวอย่าง คือกำหนดให้แสดงผลคำว่า “hello from Supercronic” ทุก 1 นาที

# Run every minute
*/1 * * * * echo "hello from Supercronic"

เสร็จก็ทำการ Build และรัน container sudo docker build -t mf/supercronic . && sudo docker run -it mf/supercronicผลลัพธ์จะได้ตามนี้

จบปิ๊ง ^__^

Source

  • https://github.com/aptible/supercronic

Disable screen sleep on Raspberry PI

Raspberry PI เวลาเอามาใช้ทำตัว Dashboard หรือ Kiosk สักพักก็จะเข้าสู่ Sleep mode วิธีการแก้ไข ก็คือให้ทำการแก้ไขไฟล์ lightdm.conf

sudo nano /etc/lightdm/lightdm.conf

เพิ่มบรรทัดนี้เข้าไปในเซคชั่น [Seat:*]

xserver-command=X -s 0 dpms

เสร็จก็ Reboot รอบนึง จบปิ๊งงง ^__^

Automatic Update All Docker Images

สำหรับอัพเดต Docker Images ทั้งหมดที่ได้ติดตั้งไปแล้ว ใช้คำสั่งด้านล่างนี้

docker images | grep -v REPOSITORY | awk '{printf $1; printf ":"; print $2}' | xargs -L1 docker pull

โดยเมื่อเราได้อัพเดตไปแล้วไฟล์ตัวใหม่จะไม่ได้ทับ (Overwrite) ตัวเดิม เราต้องตามไปลบ (Cleanup) ตัวเดิมอีกรอบ โดยใช้คำสั่ง

docker images | grep "<none>" | awk '{print $3}' | xargs -L1 docker rmi


จบปิ๊งง  ^_^

My GNOME Shell Extensions – Part 1

สำหรับ Linux User ที่เลือก GNOME (อ่านว่า กะโนม) เป็น desktop environment ซึ่งปัจจุบัน (ตุลาคม 2561) เวอร์ชั่นล่าสุดคือ GNOME 3.30 กรณีที่อยากลองใช้ ณ ตอนนี้ก็มี Ubuntu 18.10 Cosmic Cuttlefish ซึ่งจะออกใกล้ ๆ นี้มาให้ทดลองใช้งาน

สำหรับดิสโทรอื่น หลัก ๆ ก็ยังใช้เวอร์ชั่น 3.28 กันอยู่ สามารถตรวจสอบเวอร์ชั่นในเครื่องตัวเองได้จากคำสั่งนี้ (เครื่องตัวเองตอนนี้ใช้เวอร์ชั่น GNOME Shell 3.28.3)

gnome-shell --version

ใครที่อยากลอง GNOME Shell 3.30 ก็ใช้กำลังภายในกันนิดนึงแต่ส่วนตัวก็ยังแนะนำให้ใช้เวอร์ชั่นเดิม ๆ นั่นแหล่ะปลอดภัยสุดแล้ว

GNOME Shell เดิม ๆ นั้นก็ไม่ถึงกับง่อยหรอก แต่ถ้าอยากให้ชีวิตง่ายขึ้น GNOME Shell Extensions ช่วยได้ ซึ่งก็มีให้เลือกใช้งานกันตามแต่ละปัญหาของแต่ละคน (ส่วนใหญ่ปัญหาการใช้งานก็ไม่ค่อยต่างกันมากนัก  :P)

ส่วนตัวแล้วเลือกใช้ Extensions อยู่ไม่กี่ตัว มาดูกันว่ามีตัวไหนกันบ้าง (แนะนำให้ติดตั้ง sudo apt install gnome-tweak-tool ด้วย) เรียงลำดับตามตัวอักษรหล่ะกันครับ

  1. Applications Menu by fmuellner
    Add a category-based menu
    สำหรับเรียกเมนูโดยจัดกลุ่มแอพปลิชั่นให้ คล้ายปุ่ม Start ในฝั่ง Windows นั่นแหล่ะ
  2. Blyr by yozoon
    Apply a Blur Effect to GNOME Shell UI elements

    ช่วยเพิ่ม Effect  Blur ใน Background เมื่อเรียกหน้าจอ Activities Overview Screen ขึ้นมา มันดู Sexy ขึ้นนะ
  3. Caffeine by eon
    Disable the screensaver and auto suspend

    ปิดการทำงานของ Screensaver
  4. Clipboard Indicator by Tudmotu
    Clipboard Manager extension for Gnome-Shell – Adds a clipboard indicator to the top panel, and caches clipboard history.

    เพิ่มความสามารถของ Clipboard เราสามารถกำหนดประวัติการใช้งาน Clipboard ได้ (Default อยู่ที่ 30 รายการ)
  5. Coverflow Alt-Tab by p91paul
    Replacement of Alt-Tab, iterates through windows in a cover-flow manner.

    โดยปกติเมื่อเรากดคีย์ Alt-Tab/Alt-Shift-Tab จะเป็นการเลื่อน (Switch) ไปยังแอพปลิเคชั่นที่เปิดอยู่ Extensions นี้ช่วยปรับให้ลักษณะการเลื่อนเป็นแบบ Coverflow ตัวอย่าง
  6. cpufreq by konkor
    Gnome CPU Frequency Monitor and Governor Manager.

    สามารถกำหนด Profile ให้ CPU ทำงานได้ โดยปกติ Linux เองก็ฉลาดมากพอที่จะกำหนดความเร็วของ CPU ตามลักษณะการใช้งาน แต่บางครั้งเราก็อยากรีดความเร็วณ ตอนนั้น หรือลดความเร็วลงเพื่อประหยัดพลังงาน Extension ตัวนี้ช่วยได้
  7. Dash to Dock by michele_g
    A dock for the Gnome Shell. This extension moves the dash out of the overview transforming it in a dock for an easier launching of applications and a faster switching between windows and desktops. Side and bottom placement options are available.

    Dock ที่ติดมากับ Ubuntu ถึงแม้จะ Fork Dash to Dock มาแต่ก็ปรับแต่ง/ทำอะไรไม่ได้มาก ถ้าพฤติกรรมการใช้งานเรา แค่นั้นไม่พอก็ติดตั้ง Dash to Dock ช่วย (Dock จะเก่งขึ้นมากถึงมากที่สุด)
  8. Dash to Panel by jderose9
    An icon taskbar for the Gnome Shell. This extension moves the dash into the gnome main panel so that the application launchers and system tray are combined into a single panel, similar to that found in KDE Plasma and Windows 7+. A separate dock is no longer needed for easy access to running and favorited applications.
    อยากได้ Dock ฟิล Windows ก็ใช้ตัวนี้ (เราก็ใช้สลับกับ Dash to Dock นะ)
  9. Disconnect Wifi by kgshank
    Adds a Disconnect option for Wifi in status menu, when a network is connected. Shows a Reconnect option, after network is disconnected.

    เพิ่มเมนู Disconnect หลังจากที่เชื่อมต่อ Wifi แล้ว เป็น Extension เหมือนไม่มีอะไรแต่มีประโยชน์มาก
  10. EasyScreenCast
    This extension simplifies the use of the video recording function integrated in gnome shell, allows quickly to change the various settings of the desktop recording.

    Screen recording ติดมากับ GNOME Shell แต่การใช้งานก็ไม่ได้ง่ายนัก สำหรับใครที่อยากใช้และไม่ต้องการ Extension ตัวนี้ วิธีใช้ พอไปอ่านแล้วคุณจะกลับมาติดตั้ง Extensions ตัวนี้ 😛
  11. Freon by UshakovVasilii
    Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)

    แสดงอุณหภูมิทั้ง CPU และ Video Card รองรับทั้งทั้งฝั่งเขียวและแดงนะครับ
  12. Frippery Move Clock by rmyorston
    Move clock to left of status menu button

    ย้ายตำแหน่งของนาฬิกาเฉย ๆ
  13. gTile by scherepanov
    Tile windows on a grid.

    ช่วยให้การจัดหน้าต่างที่กำลังเปิดอยู่ทั้งหมดดูง่ายและเป็นระเบียบ ไม่ต้องลากเองนี่จัดตำแหน่งให้เลย
  14. Impatience by gfxmonk
    Speed up the gnome-shell animation speed
    รู้สึกว่าเครื่องมีการตอบสนองมันช้าใช่ไหม เครื่องช้าไหม แต่เปล่าเลย Animation ล้วน ๆ งั้นเรามาเร่ง Speed Animation กัน คือถ้าไม่ชอบก็สามารถปิดได้ ใช้ Gnome Tweak Tool > Appearance แต่ Animation ก็อยากใช้แต่เร่งความเร็วนิดนึง ก็ติดตั้งเลยครับ

จบ Part 1 นะครับ ^_^ (เหลืออีกประมาณ 10 กว่าตัว)

Set video wallpaper for your Ubuntu 18.04 Bionic Beaver

การมาของ Live Wallpaper ทำให้ความจำเจเราหายไปบ้าง แต่ก็นั่นหล่ะ เราอยากได้แบบนี้บ้างใน Linux ที่ใช้งานอยู่ (ปัจจุบันใช้ Ubuntu 18.04 Bionic Beaver) พบว่ามีทูลหลายตัวที่ช่วยทำเรื่องเกี่ยวกับ Wallpaper ไม่ว่าจะเป็น Package หรือ Extension สำหรับ Gnome Shell

หรือแม้แต่ komorebi เอง

และก็มี Tool อีกตัวหนึ่งซึ่งสามารถทำได้เหมือนกันคือ VLC Media Player โดยปกติเราใช้ VLC เป็น Media Player หลักอยู่แล้วเลยไม่ต้องติดตั้งอะไรเพิ่มเติมแต่ถ้ายังไม่ได้ติดตั้งก็ติดตั้งได้เลยตามนี้

sudo snap install vlc
หรือ
sudo apt install vlc

ต่อมาก็ใช้ VLC แบบ Command Line กำหนดให้เล่นวิดีโอใน Mode Wallpaper อ่านรายละเอียดคำสั่ง/Options ได้จากที่นี่ รูปแบบคำสั่งก็ใช้แค่นี้แหล่ะ

cvlc --video-wallpaper --no-audio --loop --no-video-title-show "Video File Path"

หรือเปิด VLC ในโหมด GUI ปกติแล้วกำหนดให้เป็น Wallpaper โดยการกด Hot Keys ‘w’


ผลลัพธ์ที่ได้ก็ตามนี้

ป.ล.

Split comma separated string to multiple rows

สำหรับใครที่เคยใช้ฟังก์ชั่น GROUP_CONCAT() ใน  MySQL มาก่อนก็พอจะเดาผลลัพธ์จากฟังก์ชั่นนี้ได้ว่า ผลลัพธ์จะเป็นค่าตามคอลัมภ์ที่ถูกกรุ๊ป (GROUP BY) และนำมาต่อกันด้วยเครื่องหมายที่ระบุ ปกติค่าดีฟอลต์จะเป็น comma ‘,’ รูปแบบคำสั่งก็จะประมาณนี้

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

ตัวอย่าง


**ภาพจาก mysqltutorial

ข้างบนนี่คือต้นเหตุ มักจะมีกรณีที่เราได้ผลลัพธ์มาแล้ว นั่นคือ “A,B,C” และเราต้องการแยกข้อความที่ได้มาออกเป็นแต่ละแถว (ตาราง t ก่อนที่จะผ่านฟังก์ชั่น GROUP_CONCAT() นั่นแหล่ะ) ดูตัวอย่างกัน

CREATE TABLE DEMO (
    ID INTEGER PRIMARY KEY AUTO_INCREMENT,
    PID VARCHAR(20) NOT NULL,
    ICD10LIST VARCHAR(255) DEFAULT NULL
);
 
INSERT INTO DEMO(ID, PID, ICD10LIST) VALUES(NULL, '101', 'E119,E112,I10'), (NULL, '102', 'E119,E112'), (NULL, '103', 'E119,I10');

ข้อมูลในตารางเป็นแบบนี้ (คุ้น ๆ กันไหม 5555)

**แนวคิดของคำสั่งก็คือทำการสร้างตารางค่า Index ที่อยู่ในชุด/เซตข้อความเพื่อแยกแต่ละไอเท็มออกมา

SELECT
  DEMO.ID,
  DEMO.PID,
  SUBSTRING_INDEX(SUBSTRING_INDEX(DEMO.ICD10LIST, ',', numbers.n), ',', -1) AS ICD10
FROM
  (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) numbers INNER JOIN DEMO
  ON CHAR_LENGTH(DEMO.ICD10LIST)-CHAR_LENGTH(REPLACE(DEMO.ICD10LIST, ',', '')) >= numbers.n-1
ORDER BY
  PID, n

ผลลัพธ์ที่ได้

จบปิ๊ง !!!

ป.ล.

  • ตาราง numbers จะสร้างไว้ก่อนก็ได้ ปกติก็ใช้บ่อย ๆ นะครับจะด้วย RECURSIVE CTE ก็ได้หรือตัวนี้
  • ตัว Split String จะทำเป็นฟังก์ชั่นไว้ก็ได้นะ ^_^
  • ข้อมูลเป็นข้อมูลสมมุติจาก Data Exchange สมมุติแห่งหนึ่ง

 

 

transfer.sh – Easy file sharing from the command line

transfer.sh เป็นบริการ file sharing แบบต้องใช้ command line ตอนนี้ก็รองรับทั้งการฝากไฟล์ที่อยู่ในเครื่อง (local file) s3 (Amazon S3) และ gdrive (Google Drive) โดยฟีเจอร์หลัก ๆ ก็มี

  • ผ่าน shell command ได้ (Powershell ด้วย)
  • ขนาดไฟล์สูงสุดได้ 10 GB
  • ฝากไฟล์ได้ 14 วัน
  • เข้ารหัสไฟล์ได้
  • กำหนดเงื่อนไข (จำนวน) การดาวน์โหลด
  • ฟรี 👏👏👏

ตัวอย่างแบบเบสิคเลย

# Uploading is easy using curl
$ curl --upload-file ./hello.txt https://transfer.sh/hello.txt
https://transfer.sh/66nb8/hello.txt

$ curl -H "Max-Downloads: 1" -H "Max-Days: 5" --upload-file ./hello.txt https://transfer.sh/hello.txt
https://transfer.sh/66nb8/hello.txt
# Download the file
$ curl https://transfer.sh/66nb8/hello.txt -o hello.txt

หรือจะเป็นการ Backup MySQL ก็ทำได้เหมือนกัน

# Backup, encrypt and transfer
$ mysqldump --all-databases|gzip|gpg -ac -o-|curl -X PUT --upload-file "-" https://transfer.sh/test.txt

* ถ้าใครสนใจลองเข้าไปใช้งานได้ที่เว็บ transfer.sh ส่วนตัวแล้วเป็นบริการที่ชอบเลย ด้วยความที่เป็นอะไรที่ใช้งานง่ายและมีประโยชน์จริง ๆ

** โปรเจคอยู่บน github (https://github.com/dutchcoders/transfer.sh) จะเอามาทำใช้เองก็ได้มี Docker ให้ด้วย

#ยังคิดถึงเสมอ

กะละมังอาบน้ำของมังกี้ยังวางอยู่หน้าบ้านเหมือนเดิม
สายจูง ลูกบอลอีกลูกก็ยังอยู่ในลังของเล่นอยู่
บางครั้งก็มีขนเธอปลิวมาบ้าง ถึงแม้เราจะทำความสะอาดบ้านครั้งใหญ่ไปหลายรอบละ
ต้นมะลิที่ปลูกไว้หลังบ้าน ตรงที่เธอนอนอยู่… ต้นที่เป็นของเธอก็ยังรอดปลอดภัย
ผ่านมาปีนึงละ ก็ยังคิดถึงเธอเสมอ

 

 

Hierarchical and recursive queries in MySQL

Hierarchical query คืออะไร ?

A hierarchical query is a type of SQL query that handles hierarchical model data. They are special cases of more general recursive fixpoint queries, which compute transitive closures.

อยากบอก(บ่น) ว่าก่อนที่ MySQL 8 จะออกนี่การดึงข้อมูลแบบลำดับชั้นลักษณะต้นไม้ (Tree) แบบนี้โคตรเปลืองพลังงาน แต่ตอนนี้ดีขึ้นมาก ต้องขอบคุณจริง ๆ ที่ MySQL อิมพลีเมนต์ Common Table Expression (CTE) ให้ใช้ได้ซะที เขียนคำสั่งสั้นลง ประสิทธิภาพดีขึ้น (ก็แหงสิเจ้าของเค้าทำออกมาเอง)

ยกตัวอย่างข้อมูลลักษณะแบบลำดับชั้น เช่น โครงสร้างองค์กร เธรดในคอมเมนต์ต่าง ๆ ข้อมูล Categories and sub-categories ที่เห็นภาพชัด ๆ  เลยคือ โครงสร้างองค์กร (Organization charts ) นี่ง่ายสุดละ มีหัวหน้าเป็นรูทและมีลูกน้องในความดูแลและบางทีลูกน้องก็มีเบ้ต่อลงไปอีกที ลักษณะข้อมูลแบบรูปนี้เลย


ว่าแล้วก็ติดตั้ง MySQL 8 สำหรับใช้งานกัน

docker run -d -p 3306:3306 --name mysqltest --restart always -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=demo mysql:8

โดยธรรมเนียมปฏิบัติทั่วไป ของตารางที่เก็บข้อมูลในลักษณะนี้ก็จะออกแบบคล้าย ๆ แบบนี้ โดยให้คอลัมภ์ parent เก็บข้อมูลหัวหน้า

DROP TABLE IF EXISTS category;
CREATE TABLE IF NOT EXISTS category(
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(20) NOT NULL,
        parent INT DEFAULT NULL
);

INSERT INTO category VALUES
(1,'Root A', NULL),
(2,'Item 1', 1),
(3,'Item 2', 1),
(4,'Item 3', 3),
(5,'Root B', NULL),
(6,'Item 4', 5),
(7,'Item 5', 6),
(8,'Root C', NULL),
(9,'Item 6', 8);

การดึงข้อมูลในลักษณะ Recursive MySQL ได้เตรียมคำสั่งให้แล้ว รูปแบบการใช้งาน

with_clause:
    WITH [RECURSIVE]
        cte_name [(col_name [, col_name] ...)] AS (subquery)
        [, cte_name [(col_name [, col_name] ...)] AS (subquery)] ...

ลักษณะของคำสั่งนี้คือ


*ภาพจาก mysqltutorial : A Definitive Guide To MySQL Recursive CTE

เรามาดูผลลัพธ์กัน

WITH RECURSIVE categorypath(id, name, dept, breadcrumbs) AS
(
  SELECT id, name, 0, CAST(name AS CHAR(1000))
  FROM category 
  WHERE parent IS NULL
  UNION ALL
  SELECT c.id, c.name, cp.dept + 1, CONCAT_WS('/', cp.breadcrumbs, c.name) 
  FROM categorypath cp 
    JOIN category c ON cp.id = c.parent
)
SELECT * FROM categorypath ORDER BY breadcrumbs;

ไปอ่านเพิ่มเติมกันได้ที่

  • https://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/
  • https://www.percona.com/live/17/sites/default/files/slides/Recursive%20Query%20Throwdown.pdf
  • https://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL

จบปิ๊ง ^__^
ป.ล.1 วันหยุด วันฝนตกฉันควรนอนกกใครสักคนอยู่ใต้ผ้าห่มนี่นา
ป.ล.2 เศร้าาาวันทำงาน