Category: Linux (OS, shell script, etc)

  • Dual Boot Ubuntu 14.04 & Windows 8.1 in UEFI

    • เหตุการณ์สมมติจึงใช้ VirtualBox
    • ตั้งค่า VirtualBox ดังภาพ (ขอข้ามวิธีการสร้างเครื่องใหม่บน VirtualBox ไปเลยนะครับ คิดซะว่าชำนาญแล้ว โดยขนาด HDD ที่ต้องการ 100GB เป็นอย่างน้อย) โดยเลือก option ที่เขียนว่า Enable EFI (special OSes Only) และในช่อง  Boot Order: ให้เลื่อนเป็น Optical แล้วตามด้วย Hard Disk แล้วกด OK
      uefi1
    • เมื่อเปิดเครื่องจะได้หน้าจอดังภาพ แสดงว่า BIOS ของเรากลายเป็น UEFI เรียบร้อยแล้ว
      uefi2
    • เลือกแผ่น Ubuntu 14.04 ให้ต่อเข้ากับ Device
      uefi3
    • reset เครื่อง
      uefi4
    • เลือก *Try Ubuntu without installing
      uefi5
    • รอจนได้ Windows Manager แล้วดับเบิ้ลคลิก Install Ubuntu 14.04.2 LTS บน Desktop เข้าสู่กระบวนการติดตั้ง Ubuntu ปกติทั่วไปสามารถใช้ Next Technology ได้เลยไปเรื่อยๆ จนถึงหน้า Installation type ให้เลือกหัวข้อ Something else แล้วกด Continue
      uefi6
    • คลิก New Partition Table… คลิก Continue จะได้ดังภาพ
      uefi7
    • คลิกคำว่า free space แล้วคลิกเครื่องหมายบวก (+) สร้าง Partition ขนาด 512MB มีชนิดเป็น EFI boot partition (ควรดูด้วยว่าพาทิชั่นที่ได้เมื่อสร้างเสร็จมีขนาด 512MB จริงๆ โดยใน VM ที่สร้างนี้ตอนสร้างใส่ไป 514MB) และกด + เพื่อสร้าง swap ในตัวอย่างกำหนดแรมไว้ 4GB สามารถสร้าง Swap เท่าแรมได้เลย และ / (root ขนาด 50GB) ตามลำดับโดยจะเหลือพื้นที่เปล่าไว้ด้วย
      uefi8
    • ภาพแสดงพาทิชั่นเมื่อสร้างเสร็จแล้ว
      uefi9
    • คลิก Install Now และคลิก Continue ที่เหลือหลังจากนี้สามารถกลับสู่โหมด Next Technology ได้เลยจนจบ
      uefi10
      uefi11
    • สิ้นสุดคลิก Restart Now
      uefi12
    • เอาแผ่นออกแล้วกด Enter (ปกติจะเอาออกให้อัตโนมัติ)
      uefi13
    • ลองบูตดูจนได้หน้า Log In
      uefi14
    • เลือก Devices แล้ว Optical Drives แล้วเลือกแผ่น Windows 8.1
      uefi15
    • คลิกรูปเฟืองที่มุมบนขวา เลือก Shutdown แล้วคลิก Restart
      uefi16
    • เมื่อ VM กำลัง Shutdown ให้สังเกตุดูว่า โลโก้ Ubuntu หายไปให้รีบ ESC ทันทีจะได้ดังภาพ
      uefi17
    • เลื่อน Cursor ลงมาที่ Boot Manager แล้วกด Enter จะได้ดังภาพ
      uefi18
    • เลื่อน Cursor ลงมาที่คำว่า EFI DVD/CDROM แล้วจะมีข้อความว่า Press any key to boot from CD or DVD….
      uefi19
    • เมื่อกดปุ่มใดๆ จะเข้าสู่วินโดวส์เพื่อเริ่มติดตั้ง
      uefi20
    • เมื่อได้หน้าเลือกภาษาให้เลือกดังภาพ แล้วคลิก Next
      uefi21
    • คลิก Install now
      uefi22
    • คลิกเครื่องหมายถูกหน้าข้อความ I accept the license terms คลิก Next
    • เลือก Custom: Install Windows only (advanced)
      uefi23
    • จะเห็นพื้นที่ดิสก์ที่เราใช้งานอยู่ในตอนนี้จะเห็นว่ามีที่เหลืออยู่ 48GB ที่เป็น Unallocated Space (และถูกเลือกโดยอัตโนมัติไว้อยู่แล้ว) ในตัวอย่างนี้เราจะสร้างเพียงไดรฟ์ซีเพียงอย่างเดียวให้คลิก Next
      uefi24
    • เข้าสู่การติดตั้ง Windows รอไปจนเสร็จ…
      uefi25
    • เมื่อติดตั้ง Windows  เสร็จแล้วจะถูกบังคับเข้าวินโดวส์ทันที Ubuntu หายไปแล้ว… เพราะ Boot Manager ของ Ubuntu ถูกเขียนทับไปนั่นเอง ให้ตั้งค่า Windows ให้เสร็จเรียบร้อยก่อนแล้วชัตดาวน์เครื่อง เลือก Devices แล้วเลือก Optical Drives เลือกแผ่น Ubuntu อีกครั้ง เมื่อได้ Menu ให้เลือก *Try Ubuntu without installing
      uefi26
    • เมื่อได้หน้า Windows Manager กด Ctrl+alt+T พิมพ์ข้อความดังนี้  และในขั้นตอนนี้ต้องแน่ใจว่าเครื่องเชื่อมต่อ Internet ได้เรียบร้อยแล้ว
      sudo add-apt-repository ppa:yannubuntu/boot-repair
      sudo apt-get update
      sudo apt-get install -y boot-repair
    • แล้วต่อด้วยคำสั่ง sudo boot-repair จะได้ดังภาพ
      uefi27
    • คลิกที่ Recommended repair จะได้ดังภาพ ให้รอไปจนเสร็จ
      uefi28
    • เมื่อได้หน้าจอดังภาพกด OK แล้วสั่งรีบูตได้เลยuefi29
    • เมื่อบูตขึ้นมาจะได้หน้าเมนูที่คุ้นเคยสามารถเลือกได้ว่าจะเข้าอะไร
      uefi30
    • จบขอให้สนุกครับ

    อ้างอิงเพิ่มเติม

    https://help.ubuntu.com/community/Boot-Repair

  • How to reset root password CentOS 7.1

    • เข้า Single user mode โดย reboot แล้วเมื่อได้เมนูของ Grub ให้เลื่อนแถบสีไปยัง Kernel ที่ต้องการบูต (โดยปกติจะถูกเลือกไว้อยู่แล้ว) ให้กด e
      reset1จะได้หน้าจอดังนี้
      reset2สิ่งที่เราสนใจคือบรรทัดที่ขึ้นต้นว่า linux ซึ่งในบทความนี้คือ linux16 สำหรับ CentOS 7/7.1 x86_64 บนเมนบอร์ดที่ใช้ระบบ BIOS (อาจจะพบกับ linuxefi สำหรับเมนบอร์ดที่ใช้ระบบ UEFI) เมื่อหาเจอแล้วเลื่อน cursor ไปที่ ข้อความ ro
      reset2-1เปลี่ยน ro เป็น rw init=/sysroot/bin/sh
      reset3-1กดปุ่ม ctrl และปุ่ม x พร้อมกันเพื่อบูตระบบจะได้ดังภาพ
      reset4
    • พิมพ์คำสั่ง chroot  /sysroot
      reset5-1
    • พิมพ์ passwd เพื่อเปลี่ยนรหัสผ่านสำหรับ root
    • สร้างแฟ้ม autorelabel เพื่อปรับปรุงกฏของ selinux (ถึงแม้จะไม่ได้ใช้งาน selinux ก็ตาม เพื่อความไม่ประมาท) โดยคำสั่ง touch /.autorelabel
    • พิมพ์ exit เพื่อยกเลิก chroot
    • พิมพ์ reboot
      reset6-1
    • ระบบจะรีบูตสองรอบ อัตโนมัติเพื่อปรับปรุง selinux และไฟล์ autorelabel จะถูกลบอัตโนมัติ
    • ล็อคอินเข้าระบบด้วยผู้ใช้ root และ password ที่เปลี่ยนไป ลบแฟ้ม /.bash_history ทิ้งด้วยคำสั่ง rm /.bash_history (ถูกสร้างตอนออกจากระบบ chroot)
    • จบขอให้สนุกครับ

    อ้างอิงเพิ่มเติม
    https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sec-Terminal_Menu_Editing_During_Boot.html#sec-Recovering_Root_Password

  • วิดีโอแนะนำการติดตั้ง PSU12-Sritrang Server โปรแกรมสำหรับการจัดการห้องบริการคอมพิวเตอร์ (cloning & control PC)

    วิดีโอแนะนำการติดตั้ง PSU12-Sritrang Server โปรแกรมสำหรับการจัดการห้องบริการคอมพิวเตอร์ (cloning & control PC)
    โดย  Wiboon Warasittichai on youtube

    01 PSU12-sritrang install (ตอนที่ 1 วิธีติดตั้ง)
    PSU12-sritrang-t01
    https://youtu.be/GAhZhGCciY0

    02 PSU12-sritrang cloning (ตอนที่ 2 วิธีโคลนนิ่งฮาร์ดดิสก์)
    PSU12-sritrang-t02
    https://youtu.be/CegdT_LtE4k

    03 PSU12-sritrang features (ตอนที่ 3 คุณสมบัติของแต่ละเมนู)
    PSU12-sritrang-t03
    https://youtu.be/Dw_wAyMa3vA

    04 PSU12-sritrang control (ตอนที่ 4 การควบคุมเครื่องวินโดวส์ send, restart, shutdown, wakeonlan)
    PSU12-sritrang-t04
    https://youtu.be/o801BZ9ye0Y

    05 PSU12-sritrang prnews (ตอนที่ 5 ประชาสัมพันธ์ข่าวด้วยภาพ เมื่อ boot from network)
    PSU12-sritrang-t05
    https://youtu.be/FA2X182oKXo

    06 PSU12-sritrang windows master (ตอนที่ 6 เตรียมวินโดวส์ต้นฉบับที่ติดตั้ง cygwin)
    PSU12-sritrang-t06
    https://youtu.be/9XkLQQ-niz4

    07 PSU12-sritrang windows computer name (ตอนที่ 7 เปลี่ยนชื่อเครื่อง)
    PSU12-sritrang-t07
    https://youtu.be/TuW8_Z2U7V4

    08 PSU12-sritrang windows pgina freeradius (ตอนที่ 8 ตั้ง login ใช้ RADIUS server)
    PSU12-sritrang-t08
    https://youtu.be/58Pw-dbxljw

    09 PSU12-sritrang windows partitions (ตอนที่ 9 เตรียมฮาร์ดดิสก์ของวินโดวส์ต้นฉบับ)
    PSU12-sritrang-t09
    https://youtu.be/jP4oSqRNvCo

    10 PSU12-sritrang linuxmint master (ตอนที่ 10 เตรียมลินุกซ์มินท์ต้นฉบับ)
    PSU12-sritrang-t10
    https://youtu.be/zpR0UQbTy_U

    11 PSU12-sritrang control linuxmint (ตอนที่ 11 การควบคุมเครื่องลินุกซ์มินท์)
    PSU12-sritrang-t11
    https://youtu.be/bVtfc4x-kKU

    12 PSU12-sritrang server backup (ตอนที่ 12 สำเนาไฟล์เก็บไว้)
    PSU12-sritrang-t12
    https://youtu.be/dA7-pWjy35I

    และมีเอกสารแนะนำอยู่ที่ http://opensource.psu.ac.th/PSU-Open-server

  • How to restore a system after accidentally removing all kernels?

    เหตุการณ์สมมติ… ทำไงดี??? เผลอรันคำสั่ง

    sudo apt-get remove --purge linux-image-3.19.0-*

    ได้ผลดังรูป (ดันกด y แล้ว enter อีกนะ)
    Capture1งานงอก …ลอง ls /boot เผื่อว่ายังมี Kernel เหลืออยู่บ้าง
    Capture2
    คุณพระ ไปหมดแล้ว… ตกใจ!!! reboot สิ… (กรั่ก ๆ)
    (หากไม่ตกใจจน reboot ไปซะก่อนสามารถพิมพ์คำสั่ง sudo apt-get install linux-image-generic ได้เลย)
    Capture3 เงิบ!!! เหลือแต่ Memory Test….

    แก้ไขโดยหาแผ่น Ubuntu Desktop ควรเป็นรุ่นเดียวกับรุ่นที่ติดตั้ง 12.04, 14.04 เป็นต้น (แต่แนะนำ 14.04 ถึงแม้จะกู้เครื่องที่เป็น 12.04)

    • เมื่อบูตให้เลือก Try Ubuntu รอจน Desktop ขึ้นมาเรียบร้อย เปิด Terminal ขึ้นมา (กด ctrl+alt+t)
    • พิมพ์คำสั่ง sudo fdisk /dev/sda -l (กรณีนี้รู้แน่ๆ ว่าติดตั้งบน /dev/sda)
      Capture4
    • จากรูปมีสอง patition ที่น่าจะติดตั้ง Ubuntu เอาไว้ คือ /dev/sda1 และ /dev/sda5 ถ้าใช้แผ่น 12.04 จะไม่สามารถ mount ส่วนของ /dev/sda5 ได้เพราะมองไม่เห็น patition ที่เป็น LVM ตั้งแต่แรก แต่แผ่น 14.04 มองเห็น
      Capture5
    • เมื่อคลิกที่ 103 GB Volume สามารถมองเห็นไฟล์ทั้งหมด
      Capture6
    • ลองเปิดไฟล์ใน etc/fstab ดูไฟล์ข้างในว่า partition อยู่อย่างไร
      Capture7
    • พบว่า /dev/sda1 เป็น boot และ /dev/mapper/ubuntu–vg-root เป็น / และ /dev/mapper/ubuntu–vg-swap_1 เป็น swap เราสนใจแค่ boot และ /
    • สั่ง mount patition ตามลำดับต่อไปนี้
      sudo mount /dev/mapper/ubuntu--vg-root /mnt
      sudo mount /dev/sda1 /mnt/boot
      sudo mount --bind /dev /mnt/dev
      sudo mount --bind /sys /mnt/sys
      sudo mount --bind /proc /mnt/proc
      Capture1111
    • สั่งคำ chroot ไปยัง /mnt สังเกตว่าหลังจากสั่งคำสั่ง chroot แล้ว prompt จะเปลี่ยนเป็น root@ubuntu:/#
      sudo chroot /mnt
      Capture9
    • ให้ตรวจสอบแฟ้ม /etc/apt/sources.list ว่าใช้ repository ไหนด้วย หากไม่ได้ใช้ th.archive.ubuntu.com หรือ mirror.psu.ac.th หรือ mirrors.psu.ac.th หรือ mirror1.ku.ac.th ให้เปลี่ยนเป็น th.archive.ubuntu.com จากนั้นทดสอบ nslookup th.archive.ubuntu.com สำหรับคนที่ resolve ได้ (เรายินดีด้วย) ข้ามข้อ ๑๐ ไปได้เลย
      Capture11
    • แก้ไขแฟ้ม /etc/hosts
      สำหรับเครื่องที่อยู่นอกมหาวิทยาลัยเพิ่มข้อความว่า
      192.100.77.186 th.archive.ubuntu.com
      สำหรับเครื่องที่อยู่ภายในมหาวิทยาลัยเพิ่มข้อความว่า
      192.168.101.34 th.archive.ubuntu.com
       
    • สั่ง
      apt  install linux-image-generic
      Capture1112
    • รอจนเสร็จได้ข้อความสุดท้ายประมาณว่า  Setting up linux-image-generic (… ให้แก้ไขไฟล์ /etc/hosts โดยเอาบรรทัดที่เพิ่มเข้าไปออก
    • พิมพ์คำสั่งต่อไปนี้ตามลำดับ
      exit
      sudo umount /mnt/proc /mnt/dev /mnt/sys /mnt/boot /mnt
      sudo reboot
    • เย่บูตได้..
    • จบขอให้สนุกครับ
  • Dialog cannot open tty-output

    dialog บน Oracle Enterprise Linux และ Ubuntu ไม่เหมือนกัน (ทำไมล่ะ…ไม่ทราบครับ)

    สร้างสคริปต์ชื่อ file.sh มีข้อความว่า

    #!/bin/bash
    FILE=$(dialog --ascii-lines --title "Delete a file" --stdout \
    --title "Please choose a file to delete" --fselect /tmp/ 14 48)
    echo $FILE

    บน Ubuntu รันได้ผลลัพธ์
    Ubuntu's Dialogแต่บน Oracle Enterprise Linux
    Oracle Enterprise LInux' Dialog-_-

    ต้องเปลี่ยนสคริปต์มีสองแบบ
    แบบแรก
    #!/bin/sh
    dialog --ascii-lines --title "Delete a file" --stdout \
    --title "Please choose a file to delete" --fselect /tmp/ 14 48 2>/tmp/file.tmp
    echo $(cat /tmp/file.tmp)

    แบบที่สอง
    #!/bin/bash
    FILE=$(dialog --ascii-lines --title "Delete a file" --stdout \
    --title "Please choose a file to delete" --fselect /tmp/ 14 48 2>&1>/dev/tty)
    echo $FILE

    ผลลัพธ์ของทั้งสองแบบให้ผลเหมือนกันคือ
    Oracle Enterprise Linux's Dialog2จบ..วันนี้ห้วนไปหน่อย ขอให้สนุกครับ

  • Shell Script : Grouping and Summation

    มี Log ขนาดใหญ่ แล้ว ต้องการจะวิเคราะห์ข้อมูลของนาทีที่ผ่านมา เลือกเฉพาะรูปแบบที่ต้องการด้วยคำสั่ง

    grep 'Apr 28 10:59' /var/log/mail.log | grep 'postfix/qmgr' |grep 'nrcpt=' |grep -v 'from=<>'

    ได้ผลมาประมาณนี้

    01

    ต้องการเอาข้อมูล X และ Y จากรูปแบบนี้ from=<X> และ nrcpt=Y ใช้ความรู้จาก Shell Script: Extract exact pattern from string ใช้คำสั่งต่อไปนี้

    grep 'Apr 28 10:59' /var/log/mail.log | grep 'postfix/qmgr' |grep 'nrcpt=' |grep -v 'from=<>'|sed -n 's/.*\sfrom=<\(.*\)>.*\snrcpt=\(.*\)\s(.*/\1:\2/p'

    ได้ผลมาประมาณนี้

    02

    ต้องการจับกลุ่มตาม คอลัมน์ที่ 1 แล้วหาผลรวมของคอลัมน์ที่ 2 ในแต่ละกลุ่ม ใช้คำสั่ง

    grep 'Apr 28 10:59' /var/log/mail.log | grep 'postfix/qmgr' |grep 'nrcpt=' |grep -v 'from=<>'|sed -n 's/.*\sfrom=<\(.*\)>.*\snrcpt=\(.*\)\s(.*/\1:\2/p' | awk 'BEGIN{FS=OFS=":"}{a[$1]+=$2}END{ for (i in a) print i,a[i]}'

    ได้ผลดังนี้

    03

    Reference:

    http://unix.stackexchange.com/questions/169215/group-by-and-sum-in-shell-script-without-awk

  • Shell Script : Extract exact pattern from string

    มี string ดังนี้ ในตัวแปร line

    line=’Apr 18 06:04:57 webmail squirrelmail: Message sent via webmail: by username.s (psu.ac.th) at 41.203.69.5 on 04/17/2015 23:04:57: Message-ID: 98f9739438686e127bcb8547fea7ed82.squirrel@webmail.psu.ac.th Total 9 recipients Message-ID: 98f9739438686e127bcb8547fea7ed82.squirrel@webmail.psu.ac.th’

    ต้องการค่าที่อยู่ระหว่าง Total … recipients

    ใช้คำสั่งนี้

    total=$(echo $line | sed -n ‘s/.*Total \([[:digit:]]*\) recipients.*/\1/p’)

    ตัวแปร $total จะมีค่า 9 ตามที่ต้องการ

    อธิบาย
    คำสั่ง
    sed -n ‘s/PATTERN/&/p’
    จะแสดงข้อความที่ตรงกับ Pattern เท่านั้น ไม่แสดงข้อความอย่างอื่่น

    Reference:
    http://www.grymoire.com/Unix/Sed.html#uh-15

  • เทคนิคการเพิ่ม user ในระบบ linux คราวละมากๆ

    มีผู้สนใจ linux ได้สอบถามเข้ามาทางอีเมลว่า จะเพิ่ม user ในระบบ linux คราวละมากๆ พอจะมี shell scripts ให้นำไปใช้งานหรือเปล่า ผมก็มีอยู่แล้ว แต่ก็ปรับแต่งเล็กน้อย

    shell script นี้มีดังนี้
    1. makeusername.sh เพื่อสร้างไฟล์รายชื่อตามจำนวนที่ต้องการ เลขเริ่มต้น min และสิ้นสุด max
    2. bulkuseradd.sh เพื่อเพิ่ม user และ password แบบ random และสร้างไฟล์ .csv เก็บ user:password นำไปพิมพ์แจก user ได้
    3. bulkuserdel.sh เพื่อลบ user

    ผมเขียนไว้ในเว็บไซต์ opensource.cc.psu.ac.th หัวข้อ เทคนิค+scripts (
    http://opensource.cc.psu.ac.th/เทคนิคการเพิ่ม_user_ในระบบ_linux_คราวละมากๆ)

  • Mozilla Thunderbird & Google Calendar

    1. ติดตั้ง extension 2 ตัวใน Thunderbird ได้แก่ Lightning และ Provider for Google Calendar ดังรูป

    Screenshot from 2015-01-12 13:55:01
    extension; lightning, Provider for Google Calender

    2. รีสตาร์ท Thunderbird จะพบปุ่ม Screenshot from 2015-01-12 13:47:30 อยู่ทางมุมบนขวา
    3. เข้า gmail.psu.ac.th ล็อคอินให้เรียบร้อย คลิก  Screenshot from 2015-01-12 14:25:17 แล้วเลือก Calendar
    4. ที่หน้า Calendar คลิก Screenshot from 2015-01-12 13:42:32 เลือก Setting

    5. คลิก Calenders ทีี่มุมซ้ายบน Screenshot from 2015-01-12 13:43:43

    6. เลือกปฏิทินที่ต้องการ

    Screenshot from 2015-01-12 13:44:58
    Available Calendar

    7. ตรวจสอบว่าใช่ปฏิทินที่ต้องการหรือไม่ดูที่ ช่อง Calender Owner ว่าเป็นอันเดียวกับ Username ที่ล็อคอินเข้า gmail

    Screenshot from 2015-01-12 13:45:26
    Calendar Owner

    8. เลื่อนดูด้านล่างในส่วนของ Private Address:

    Screenshot from 2015-01-12 13:45:49
    Private Address

    9. คลิกขวาที่ ICAL เลือก Copy Link Location

    Screenshot from 2015-01-12 13:47:1010. กลับมาที่ Thunderbird กดปุ่ม Screenshot from 2015-01-12 14:37:32 เพื่อเปิดปฏิทิน
    11. คลิกขวาที่ช่องว่างฝั่งซ้ายมือใต้คำว่า Calendar เลือก New Calendar

    Screenshot from 2015-01-12 13:48:07
    New Calendar

    12. ได้หน้าต่าง Create New Calendar เลือก Google Calendar กด Next

    Screenshot from 2015-01-12 13:56:5913. กด Ctrl-v เพื่อ paste URL ของปฏิทินที่ Copy มาในข้อก่อนหน้า

    Screenshot from 2015-01-12 13:57:2114. กด back 1 ครั้งแล้วกด Next ใหม่ (อันนี้น่าจะเป็นบักของ Ubuntu 14.10)

    Screenshot from 2015-01-12 13:57:3915. กด Next
    16. จะมีหน้าต่างเพื่อยืนยันตัวตนของ Google ปรากฎขึ้นมา

    Screenshot from 2015-01-12 14:00:1217.  กด Sign in จะได้อีกหน้าต่างดังรูป กดยอมรับ

    Screenshot from 2015-01-12 13:59:0518. จะมีหน้าให้เลือกปฏิทินที่ต้องการอีกครั้งกด Next

    Screenshot from 2015-01-12 13:59:30
    Lacate your calendar

    19. จะมีหน้าให้ ยืนยันตัวตน และหน้าเพื่อขอสิทธิ์การเข้าถึง อีกรอบกดให้ Sign in และยอมรับ

    20. กด Finish

    Screenshot from 2015-01-12 14:00:3721. ก็จะได้ปฏิทินเพิ่มมาตามต้องการ

    Screenshot from 2015-01-12 14:51:2822. ทั้งหมดนี้ทำบน Ubuntu 14.10 บน Windows ก็น่าจะทำเหมือนกัน
    23. สามารถเพิ่มลบเหตุการณ์ผ่าน Thunderbird ได้เลยไม่ต้องเข้าเว็บอีก …
    24. จากที่ทดสอบหนึ่ง Profile ของ Thunderbird สามารถมี Google Calendar ได้เพียง account เดียว
    25. ขอให้สนุกครับ