Month: January 2018

  • Raspberry Pi 3 [Basic Configuration]

    หลังจากเราได้ติดตั้ง OS แล้ว ต่อไปจะเป็นการเชื่อมต่อกับเครือข่าย LAN หรือ Wi-Fi

    ถ้าเป็นสายแลน ก็ไม่ยากครับ เสียบสายเข้าไปเลย โดย default config eth0 จะเป็น DHCP Client อยู่แล้ว

    ส่วน Wi-Fi นั้น จากการหาข้อมูลชิบBroadcom BCM43438 Wireless Controller นั้น เหมือนจะรองรับเฉพาะ 2.4GHz ครับ

     

    ผมจะเลือกทำการ connect Wi-Fi ก่อนนะครับ หลังจากนั้นค่อยเซ็ตอัพวัน/เวลา และโปรแกรม

    เรื่องของการ connect เข้า Wi-Fi ที่เป็น WPA2 Enterprise นั่นก็อาจจะเป็นปัญหาเบื้องต้นที่เจอครับ คือ โดย default แล้วนั้น จะไม่ support ดังรูปข้างล่างนี้ ทำให้ connect เข้าโดยตรงไม่ได้

    ต้องทำการแก้ไขปัญหาดังนี้ครับ

    1.เปิด terminal จากนั้นแก้ไฟล์ wpa_supplicant.conf โดยใช้คำสั่ง

    sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

     

    2.เพิ่มบรรทัดต่อไปนี้เข้าไป

    network={
    ssid=PSU WiFi (802.1x)
    priority=1
    proto=RSN
    key_mgmt=WPA-EAP
    pairwise=CCMP
    auth_alg=OPEN
    eap=PEAP
    identity=”YOUR_PSU_PASSPORT_USERNAME
    password=hash:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    phase1=“peaplabel=0”
    phase2=“auth=MSCHAPV2”
    }

     

    เซฟไฟล์ด้วยการกด Ctrl + X ตอบ Y กด Enter กลับมาที่หน้าจอ Terminal ตามเดิม

    ข้อมูลที่ท่านสามารถปรับแก้ได้คือตัวอักษรสีแดงด้านบน ได้แก่

    ssid <= ชื่อ ssid ซึ่งบางที่อาจจะไม่ใช่ดังในตัวอย่าง

    identity <= username ของ psu passport อยู่ภายใต้เครื่องหมาย ” ”

    password=hash: มาจากการคำนวณ hash ด้วยคำสั่งต่อไปนี้

    echo -n YOUR_PASSWORD | iconv -t utf16le | openssl md4

    จากนั้นเอาค่ามาใส่แทนที่ xxxxxxxx ตามตัวอย่างข้างบน

     

    3.เมื่อเรียบร้อยแล้วให้ restart service networking ซักครั้งหนึ่งด้วยคำสั่ง

    sudo service networking restart

     

    4.หากไม่เกิดการเปลี่ยนแปลงอะไร ให้ reboot ซักครั้ง

    sudo reboot

     

    5.เมื่อ reboot กลับมาแล้ว ท่านจะพบว่ามีการเชื่อมต่อ SSID ตามที่ท่านได้เซ็ตเอาไว้เรียบร้อยแล้ว ดังรูปด้านล่างนี้

     

    ** คำสั่งที่ท่านพิมพ์ผ่าน Terminal จะถูกเก็บ History เอาไว้ รวมทั้งรหัสผ่านที่ท่านได้สร้างเป็น hash เอาไว้ ท่านจะต้องทำการเคลียร์ออก ด้วยคำสั่ง

    history -c (เพื่อเคลียร์ทั้งหมด) หรือ

     

    history | tail เพื่อดูหมายเลขบรรทัด เช่น 300  จากนั้นใช้คำสั่ง

    history -d 300 เพื่อลบเฉพาะบรรทัดนั้น

     

    เมื่อเสร็จเรื่องการเชื่อมต่อแล้ว จากนั้นควรทำการเซ็ตอัพวันเวลา / timezone ให้เรียบร้อย

    เปิด Terminal จากนั้นพิมพ์คำสั่ง sudo dpkg-reconfigure tzdata

             

    เลือก Asia และเลือก Bangkok กด Enter เป็นอันเสร็จสิ้นครับ

     

    จากนั้นควรทำการ sync time เพื่อให้ได้เวลาที่ถูกต้อง

    ** ใน Raspbian Stretch ส่วนของ NTP จะไม่ได้ถูกติดตั้งโดยอัตโนมัติ จะต้องทำการติดตั้งก่อนด้วยคำสั่งต่อไปนี้

    sudo apt install ntp

    รอจนเสร็จ จากนั้นทำการ enable ด้วยคำสั่ง

    sudo systemctl enable ntp

    และสั่งอัพเดทวัน/เวลา ด้วยคำสั่ง

    sudo timedatectl set-ntp 1

     

    สำหรับการติดตั้ง Software เพิ่มเติมนั้น สามารถทำได้โดยการใช้ Add / Remove Software

    (ขอกลับมาใช้ GUI บ้างครับ)

    ด้วยการกดที่ ICON Raspberry เลือก Preferences > Add/Remove Software

     

    จากนั้นท่านจะพบกับ package ให้เลือก ตามที่ท่านต้องการ จากนั้นกด Apply ได้ทันทีครับ

     

     

    และบางครั้งการทำงานผ่านหน้าจอ console ของ Raspberry Pi เอง อาจจะลำบาก ยากต่อการเข้าถึง จึงแนะนำให้ติดตั้ง Remote Desktop ด้วยครับ (ในที่นี้ เนื่องจากผมทำงานกับ Windows ซะเป็นส่วนใหญ่ จึงขอติดตั้งเฉพาะ RDP นะครับ ส่วนวิธีอื่น (เช่น VNC) ท่านสามารถหาอ่านได้ทั่วไปเลยครับ)

     

    ทำการติดตั้ง package RDP ด้วยคำสั่งต่อไปนี้

    sudo apt-get install xrdp

     

    เมื่อเรียบร้อยแล้วท่านก็จะสามารถเข้าผ่าน Remote Desktop บน Windows ได้ทันที

    โดย default username จะเป็น pi และ default password ก็คือ raspberry ครับ

     

    และสำหรับการใช้งานสำหรับคนไทย ขาดไม่ได้คือการเพิ่มคีย์บอร์ดภาษาไทย เพื่อให้พิมพ์ไทยได้ ด้วยวิธีการดังต่อไปนี้

     

    คลิ๊กขวาบน Taskbar ด้านบน เลือก Panel Settings

     

    เลือกแทบ Panel Applets จากนั้นกดปุ่ม Add

     

    เลือก Keyboard Layout Handler จากนั้นกด Add

     

    กด Preferences เพื่อแก้ไขค่าของ Keyboard Layout Handler

     

             

    นำเครื่องหมายถูก หน้า Keep system layouts ออก (unchecked) จากนั้นกดปุ่ม Add เพื่อเพิ่ม Keyboard Layouts

    เลือก th Thai จากนั้นกด OK ออกมาจากหน้าจอ Add Keyboard Layout

    หากต้องการปรับปุ่มสลับภาษา สามารถเลือกได้ที่ Change Layout Option โดยมีให้เลือกตามความถนัด

     

    จากนั้นสังเกตมุมขวาบน จะเห็นสัญลักษณ์ธงชาติ แสดงภาษาที่ใช้งานอยู่ ณ ขณะนั้นครับ

     

     

    สำหรับตอนต่อไป จะเป็นการเชื่อมต่อกับ I2C Module กับจอ LCD ขนาด 16×2 เพื่อแสดงผลตัวอักษร และการเขียน Python เบื้องต้นครับ

     

    ผิดพลาดประการใด ขออภัยมา ณ ที่นี้ครับ

     

  • Raspberry Pi 3 [Assemble & OS Installation]

    ใน part นี้ขอพูดในส่วนของการติดตั้ง heat sink, ประกอบลงใน enclosure และติดตั้ง OS Raspbian ครับ

     

    Heat Sink จำเป็นไหม

    โดยส่วนตัวผมว่าจำเป็นครับ เพราะอุปกรณ์อิเล็กทรอนิกส์เมื่อมีการทำงาน จะก่อให้เกิดความร้อน ความร้อนทำให้เกิดการเสื่อมของอุปกรณ์ และจากการหาข้อมูล พบว่าการติดตั้ง Heat Sink + พัดลม จะทำให้อุณหภูมิของอุปกรณ์ (โดยเฉพาะ CPU และ GPU) นั้นไม่สูงเกินไปครับ (อ้างอิงจาก https://www.youtube.com/watch?v=e6okZKRwnTQ)

     

     

    Heat Sink อลูมิเนียมสีดำขนาดเล็ก เพียงพอต่อการใช้งานทั่วๆ ไป

     

    ติดตั้งด้วยการใช้เทปกาวสองหน้าแบบนำความร้อน (ติดมากับ Heat Sink) แปะลงไปบนตัว CPU และ GPU ได้เลย
    ** กรณีที่ไม่มีเทปกาวสองหน้านำความร้อน ให้ใช้กาวซิลิโคน นำความร้อน แทนครับ **

     

    Enclosure หรือกล่อง จำเป็นหรือไม่ ?

    บอกเลยว่า ขึ้นอยู่กับบุคคลครับ ซึ่ง Enclosure ก็มีหลายแบบให้เลือกใช้ ทั้งแบบเป็นกล่องเดี่ยวๆ (แบบที่จะแสดงให้ดูนี้), แบบที่เป็น Stack, แบบอลูมิเนียมเพื่อระบายความร้อนแบบ Passive และอีกมากมายครับ ประเด็นคือ เลือกให้ตรงกับความต้องการดีกว่าครับ ทั้งนี้ก็เพื่อความเป็นระเบียบและเรียบร้อยของอุปกรณ์นั่นเองครับ

     

     

    ผมเลือกใช้เคสที่เป็นอะคริลิค พร้อมช่องพัดลม เพื่อติดตั้งไว้ระบายความร้อนของ Heat Sink อีกทีนึงครับ

     

     

    ประกอบเรียบร้อยพร้อมติดตั้งพัดลมครับ
    ** ผมติดตั้งพัดลมแบบดูดเข้านะครับ เพื่อให้ลมเย็นจากภายนอกปะทะกับ Heat Sink โดยตรง **

    ** พัดลมติดตั้งโดยใช้ไฟจาก GPIO PIN 4 (+5V) และ 6 (GND) ครับ **

     

    พร้อมแล้วสำหรับการใช้งานครับ ต่อไปเตรียม microSD สำหรับติดตั้ง OS กันครับ

    ถ้าหลายท่านเคยผ่านตา จะเห็นว่าส่วนใหญ่จะใช้โปรแกรม SD Card Formatter ครับ แต่ผมจะใช้อีกตัวนึงตามคำแนะนำของ raspberrypi.org

    นั่นคือ Etcher ครับ

    สิ่งที่ต้องมีคือ

    • SD Card 8GB ขึ้นไป (Class 4 หรือ 10 แล้วแต่ท่านสะดวกเลยครับ ผมลองแล้ว ความเร็ว ไม่ต่างกันเท่าไหร่)
    • Card Reader และ microSD Adapter *ถ้าจำเป็น
    • 7-Zip หรือโปรแกรมสำหรับ Extract Zip File
    • โปรแกรม Etcher ดาวน์โหลดได้ที่นี่
    • ผมติดตั้ง Raspbian เพราะงั้นต้องมี image file ซึ่ง ดาวน์โหลดได้ที่นี่

    ** เมื่อเข้าไปหน้าดาวน์โหลด ท่านจะเป็น NOOBS และ RASPBIAN ให้เลือก RASPBIAN นะครับ ซึ่งจะได้ Latest Version **

    ** NOOBS (New Out Of the Box Software) คือตัวติดตั้งที่ออกมาจาก Official Raspberry Pi เอง โดยจะมีพื้นฐานจาก Raspbian นั่นเอง แต่มีการปรับให้สามารถทำการติดตั้งได้ง่ายขึ้น พร้อมโปรแกรมอื่นๆ สามารถเลือกติดตั้งได้ทันทีจาก internet **

     

    Flash SD Card

       1.ทำการใส่การ์ดใน Card Reader จากนั้นเปิดโปรแกรม Ether

    2.เลือก Image File จากนั้นกด Flash

             

    3.รอจนเสร็จ

    4.นำ microSD Card ไปใส่ใน Raspberry Pi จากนั้นทำการต่อสายอุปกรณ์ให้เรียบร้อย (Power, HDMI, Keyboard + Mouse)

    ** เพื่อป้องกันความเสียหายที่อาจเกิดขึ้นกับ microSD Card ให้ทำการ Power Off ทุกครั้งก่อนถอด/ใส่ การ์ดนะครับ **

     

    5.พร้อมแล้วสำหรับการ Power On (Raspberry Pi จะไม่มีสวิตซ์สำหรับเปิดนะครับ แค่เสียบเสีย micro USB ที่มีไฟ ก็จะทำการเปิดเองโดยอัตโนมัติ)

    ** เนื่องจากผมไม่มี Monitor ที่ Input HDMI ได้โดยตรง จึงต้องใช้ตัวแปลงจาก HDMI –> VGA ครับ **

     

        

    รูปซ้าย รูประหว่างการ boot (ถ่ายไม่ค่อยทัน)

    รูปขวา แสดงหน้า Desktop พร้อมใช้งานได้ทันทีครับ

     

    ตอนหน้า จะเป็นเรื่องของการเซ็ตอัพทั่วๆไป, การเชื่อมต่อ Wi-Fi และการติดตั้งโปรแกรมพื้นฐานอย่างง่ายครับ

     

    ผิดพลาดประการใด ขออภัยมา ณ โอกาสนี้ครับ

     

  • วิธีใช้ Google Sheets เป็นฐานข้อมูล เพื่อการเฝ้าระวังระบบ โดยการใช้งานผ่าน Google API Client Library for Python

    ต่อจาก

    1. วิธีการใช้ Google Sheets เป็นฐานข้อมูล
    2. การใช้งาน Google Drive API ด้วย Google Client Library for Python
    3. วิธีการ Upload ไฟล์ไปบน Google Drive File Stream ด้วย Google Client Library for Python

    คราวนี้ ใครมีข้อมูลที่เกิดขึ้นในเซิร์ฟเวอร์ภายในองค์กร แล้วต้องการส่งไปเขียนเก็บไว้ใน Google Sheets แบบต่อท้าย (Append)

    เช่น ในตัวอย่างนี้ วัดระยะเวลาการโอนย้ายข้อมูล เปรียบเทียบระหว่าง rsync เพื่อสำรองข้อมูลไปไว้ในเครื่องเซิร์ฟเวอร์สำรองที่ต่างวิทยาเขต กับ การนำไปเก็บไว้ใน Google Drive ตามวิธีการที่กล่าวไว้ใน วิธีการ Upload ไฟล์ไปบน Google Drive File Stream ด้วย Google Client Library for Python

    ผมได้เขียนโค๊ดเอาไว้ที่ https://github.com/nagarindkx/google.git
    สามารถโคลนไปใช้งานได้ (ช่วย Reference กันด้วยนะครับ)

    ขั้นตอนการใช้งานมีดังนี้

    1. ใช้คำสั่ง
      git clone https://github.com/nagarindkx/google.git
      cd google
    2. ติดตั้ง python, pip, google-api-python-client ตามที่เขียนไว้ใน การใช้งาน Google Drive API ด้วย Google Client Library for Python และสร้างโปรเจคใน Google Developer Console เปิดใช้งาน Google Sheets API, สร้าง Credentials > OAuth Client ID แล้ว download JSON มาไว้ในชื่อว่า client_secret.json
    3. รูปแบบคำสั่งคือ
      $ python append2gsheet.py --help
      
      usage: append2gsheet.py [-h] [--auth_host_name AUTH_HOST_NAME]
                                   [--noauth_local_webserver]
                                   [--auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]]
                                   [--logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
                                    --data DATA --sheetid SHEETID [--range RANGE]
                                   [--value-input-option VALUEINPUTOPTION]
      
      optional arguments:
       -h, --help show this help message and exit
       --auth_host_name AUTH_HOST_NAME
         Hostname when running a local web server.
       --noauth_local_webserver
         Do not run a local web server.
       --auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]
         Port web server should listen on.
       --logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
         Set the logging level of detail.
       --data DATA CSV format
       --sheetid SHEETID Google Sheets ID
       --range RANGE Simply Sheet Name like 'Sheet1!A1'
       --value-input-option VALUEINPUTOPTION
         Optional: [RAW,USER_ENTERED]
    4. สิ่งที่ต้องมี คือ Google Sheets ที่สร้างไว้แล้ว ให้สังเกตที่ URL
      ตัวข้อความที่อยู่หลัง https://docs.google.com/spreadsheets/d/ จะเป็น “Sheet ID” ซึ่งจะใช้ในตัวแปร “sheetid” ในขั้นต่อไป
    5. ในแต่ละ Google Sheets จะประกอบด้วย หลาย Sheet ในที่นี้ จะเขียนลง Sheet ที่ชื่อว่า “Data” ซึ่งจะใช้ในตัวแปร “range” ในขั้นต่อไป
    6. ตัวอย่างการใช้งาน เมื่อระบบทำการสำรองข้อมูล จับเวลา ก็จะทำการส่งข้อมูลไปเก็บในลักษณะ CSV อย่างนี้ส่งไป เช่น
      20180129-12,37.0188,27.5338,943.7682,902.7372

      ซึ่งประกอบด้วย 5 ฟิลด์ คือ วันเวลาที่วัด และ ข้อมูล เป็นจำนวนวินาที อีก 4 ฟิลด์
      วิธีการส่งคำสั่งในการใช้งาน ครั้งแรก ต้องใส่  –noauth_local_webserver ด้วย

      python append2gsheet.py --data 20180129-12,37.0188,27.5338,943.7682,902.7372 --sheetid 1YV_W_k8VkJbYn1fG1XXXXXXXXXXXXF8y5YtQwRC0DAY --range 'Data!A1' --noauth_local_webserver
      

      จะได้ผลดังนี้

      ให้เอา URL ไปเปิดบนเว็บ Browser ที่สามารถยืนยันตัวตนกับ Google ได้ ผลดังนี้

      แล้วก็ให้การอนุมัติ

      ก็จะได้ Verification Code อย่างนี้

      เอาไปใส่

      สำเร็จ และ ผลที่ได้

    7. แต่จะเห็นว่า ข้อมูล ตัวเลขที่ใส่เข้ามา จะถูกแปลงเป็นข้อความ ซึ่ง สามารถแก้ไขได้ด้วยการใส่ –value-input-option USER_ENTERED
      python append2gsheet.py --data 20180129-12,37.0188,27.5338,943.7682,902.7372 --sheetid 1YV_W_k8VkJbYn1fG1XXXXXXXXXXXXF8y5YtQwRC0DAY --range 'Data!A1' --noauth_local_webserver --value-input-option USER_ENTERED

      ผลที่ได้คือ คือ บรรทัดล่าง จะได้ชนิดเป็น Numeric มาเลย

    8. เมื่อเก็บผลเรียบร้อยแล้ว สามารถดูเป็น Chart แบบ Realtime ได้

    เผื่อเป็นประโยชนครับ

  • Raspberry Pi 3 [Overview]

        

    Raspberry Pi (ราสเบอร์รี่ พาย) คือ เครื่องคอมพิวเตอร์ ขนาดเล็ก (ประมาณบัตรทั่วไป) ที่มีราคาถูกกว่าคอมพิวเตอร์ ราคาปกติมาก (1,xxx บาท ขึ้นอยู่กับว่าผลิตจากประเทศไหน China, UK หรือ Japan) สามารถต่อเข้ากับจอคอมพิวเตอร์ (ผ่าน HDMI) หรือจะใช้ตัวแปลง (HDMI to VGA)  และยังรองรับเมาส์/คีย์บอร์ด/อุปกรณ์อื่นๆ ผ่านทาง USB Port อีกทั้งยังสามารถต่อสายแลน (10/100 RJ45) ได้อีกด้วย (มี Bluetooth และ Wi-Fi 802.11n Controller On-Board)

     

     

             

     

     

    Specification (ข้อมูลจาก: https://www.raspberrypi.org/magpi/raspberry-pi-3-specs-benchmarks/)

    SoC: Broadcom BCM2837
    CPU: 4× ARM Cortex-A53, 1.2GHz
    GPU: Broadcom VideoCore IV
    RAM: 1GB LPDDR2 (900 MHz)
    Networking: 10/100 Ethernet, 2.4GHz 802.11n wireless
    Bluetooth: Bluetooth 4.1 Classic, Bluetooth Low Energy
    Storage: microSD
    GPIO: 40-pin header, populated
    Ports: HDMI, 3.5mm analogue audio-video jack, 4× USB 2.0, Ethernet, Camera Serial Interface (CSI), Display Serial Interface (DSI)

     

     

    (รูปจาก element 14)

    Raspberry Pi ทำอะไรได้บ้าง ?

    เรียกว่าเป็นเครื่องคอมพิวเตอร์ desktop เครื่องหนึ่งเลยก็ว่าได้ อาจจะไม่พลังสูงเหมือนกับเครื่อง PC แต่ก็เพียงพอสำหรับเด็กๆ ลูกๆ หลานๆ ได้ใช้งาน พิมพ์งาน เล่นเกมจำนวนหนึ่ง และที่สำคัญสามารถฝึกการเขียนโปรแกรม (เช่น Python) ได้อีกด้วย ซึ่งสามารถใช้งานได้ทันที สามารถต่อ I/O (Input/Output) ร่วมกับเซนเซอร์ต่างๆ อีกทั้งสามารถทำเป็น Media Center ได้อีกด้วย

     

     

     

    Raspberry Pi VS Arduino

    ทั้งสองอย่างอย่างนี้ ถ้ามองกันจริงๆ แล้วแตกต่างกันพอสมควร โดยที่ Arduino (อา-ดู-อิ-โน่ หรือ อาดุยโน่) เป็น Microprocessor ตระกูล AVR เอาไว้รันโปรแกรมเล็กๆ หรือเอาไว้ต่อพ่วงกับอุปกรณ์อื่นๆ เช่น เซนเซอร์, รีเลย์ ได้อย่างง่ายกว่า Raspberry Pi ซึ่งอย่างที่กล่าวเอาไว้ก่อนหน้า Raspberry Pi คือ คอมพิวเตอร์ขนาดจิ๋ว สามารถลงระบบปฏิบัติการ (OS) ใช้งานแทนคอมพิวเตอร์ได้

     

    แล้วจะเอา Raspberry Pi มาทำแบบ Arduino ได้มั้ย ?

    คำตอบคือ ได้ครับ เนื่องจาก Raspberry Pi ก็มี GPIO (General Purpose Input Output) ให้จำนวนหนึ่ง สามารถคอนโทรลให้เป็น “1” หรือ “0” ได้ตามใจชอบ ด้วยการเขียนโปรแกรมควบคุมแต่ละ Pin (เหมือนกับ Microcontroller) ด้วยภาษา C หรือ Python

     

    (รูปจาก https://www.raspberrypi.org/blog/introducing-pixel/)

    แล้ว OS ที่จะเอามาติดบน Raspberry Pi มีอะไรบ้าง

    โดยส่วนใหญ่จะเป็น OS ในตระกูลของ Linux ครับ ที่สามารถทำงานบน Processor ARM ได้ ซึ่งในเว็บของ raspberrypi.org นั้น แนะนำเป็น “Raspbian” นอกจากนี้ยังมี Windows 10 IoT ก็ยังสามารถใช้งานได้อีกด้วย ซึ่งมีโอกาสอาจจะได้ลองติดตั้งให้ดูครับ

     

    ตอนหน้า จะเป็นเรื่องติดตั้ง OS “Raspbian” ให้กับ Raspberry Pi ครับ

     

    ผิดพลาดประการใด ขออภัยครับ

  • วิธีส่ง email ในนามหน่วยงาน ที่ออกจาก Gmail ให้เป็น @psu.ac.th หรือ @group.psu.ac.th

    ไปที่
    คลิก Add Another email address
    ใส่ ชื่อที่ต้องการ
    email address ที่ต้องการส่งออกไป
    แล้วคลิก Next Step
    จากนั้น ใส่
    SMTP Server: smtp2.psu.ac.th
    Username; yourpsuemail@psu.ac.th  <—– email address ของ psu ครับ
    Password: Password ของ psu email
    แล้วคลิก Add Account
    รอ email ที่เข้าสู่ Groupmail ที่กำหนดไว้
    จะได้รับ email ประมาณนี้
    ให้เอา Confirmation Code ไป หรือ จะคลิก Link ก็ได้
    เมื่อเสร็จแล้วก็จะได้ผลลัพธ์ประมาณนี้
    ครับ
  • Windows CRLF to Unix LF Issues in Cygwin Shell Script

    เมื่อเรารัน shell script ของโปรแกรม Cygwin for Windows ซึ่งมีการเขียนคำสั่งไปตัดเอาข้อความผ่านคำสั่ง (Command Line) ของ Windows มาใส่ในตัวแปรของ shell script

    เช่น ในตัวอย่างนี้คือคำสั่ง ipconfig เมื่อได้ข้อความที่ต้องการมาเราจะได้ \r แถมมาให้ด้วยต่อท้าย เพราะ Windows style line ending จะมี CRLF (\r\n)  ในขณะที่ Linux style line ending จะมี LF (\n) เท่านั้น

    น่าแปลกใจมากว่า เราเคยรัน shell script นี้ใน Windows 7 ใช้งานได้ แต่พอเป็น Windows 10 build 1709 มันรันไม่ได้

     

    ปัญหา

    เมื่อเปิด Cygwin Terminal ขึ้นมา จะได้เป็น bash shell

    ในไฟล์ test.sh ดังตัวอย่างข้างล่างนี้ เมื่อสั่งรัน จะพบว่าพบข้อผิดพลาด ตัวแปร ZONEX จะไม่มีค่า ซึ่งจริง ๆ จะต้องได้คำว่า zone1
    $ cat test.sh

    #!/bin/bash
    
    DHCPSERVER=$(ipconfig /all | grep -i "DHCP Server" | cut -d: -f2 | xargs)
    
    MAC=$(ipconfig /all | grep -A4 -i "^Ethernet Adapter Ethernet" | tail -1 | cut -d\: -f2 | tr - : | xargs)
    
    ZONEX=$(curl -s http://${DHCPSERVER}/dhcpd.txt | grep -i ${MAC} | awk '{print $2}' | cut -d'_' -f1)
    
    echo "DHCP SERVER is ${DHCPSERVER}"
    echo "MAC is ${MAC}"
    echo "Zone is ${ZONEX}"

    สั่งรันดูผลลัพธ์ด้วยคำสั่ง bash test.sh

    $ bash test.sh
    DHCP SERVER is 192.168.6.150
    MAC is 50:7B:9D:30:2E:4B
    Zone is

    ผมก็ตรวจสอบด้วยวิธีการ debug คือ เพิ่ม -x ดังตัวอย่างนี้

    $ bash -x test.sh
     ++ ipconfig /all
     ++ grep -i 'DHCP Server'
     ++ cut -d: -f2
     ++ xargs
     + DHCPSERVER=$'192.168.6.150\r'
     ++ ipconfig /all
     ++ grep -A4 -i '^Ethernet Adapter Ethernet'
     ++ tail -1
     ++ cut -d: -f2
     ++ tr - :
     ++ xargs
     + MAC=$'50:7B:9D:30:2E:4B\r'
     ++ curl -s $'http://192.168.6.150\r/dhcpd.txt'
     ++ grep -i $'50:7B:9D:30:2E:4B\r'
     ++ awk '{print $2}'
     ++ cut -d_ -f1
     + ZONEX=
     ' echo 'DHCP SERVER is 192.168.6.150
     DHCP SERVER is 192.168.6.150
     ' echo 'MAC is 50:7B:9D:30:2E:4B
     MAC is 50:7B:9D:30:2E:4B
     + echo 'Zone is '
     Zone is

    จึงพบว่า ตัวแปร DHCPSERVER และ ตัวแปร MAC จะมี “/r” แถมมาให้ด้วย ซึ่งเป็นส่วนเกินที่ทำให้คำสั่งถัดไปทำงานผิดพลาดทำให้ได้ค่า ZONEX เป็น ว่างเปล่า

     

    วิธีแก้ไข เราต้องใส่ option ” -o igncr ” หลังคำสั่ง bash เพื่อให้ตัด “/r” ออกไป

    สั่งรันดูผลลัพธ์ด้วยคำสั่ง bash -o igncr test.sh

    ผลลัพธ์คราวนี้ถูกต้องแล้ว

    $ bash -o igncr test.sh
    DHCP SERVER is 192.168.6.150
    MAC is 50:7B:9D:30:2E:4B
    Zone is zone1

     

    วิธีแก้อีกวิธีคือ หากไม่ใส่ option ที่ว่านี้ เราก็ต้องไปแก้ไขบรรทัดคำสั่ง เพื่อเติม sed ‘s/\r$//’ ต่อท้าย เป็นการตัด /r ออกไปก่อนนำค่าที่ได้ไปใส่ในตัวแปร DHCPSERVER
    เช่น

    DHCPSERVER=$(ipconfig /all | grep -i "DHCP Server" | cut -d: -f2 | xargs | sed 's/\r$//')

    ซึ่งก็ทำได้เช่นกัน แต่ต้องแก้ไขไฟล์ shell script ซึ่งก็แล้วแต่ชอบวิธีไหน

     

    Reference
    https://stackoverflow.com/users/1010997/user1010997
    https://stackoverflow.com/questions/11616835/r-command-not-found-bashrc-bash-profile
    https://stackoverflow.com/questions/18608380/r-command-not-found

  • วิธี upgrade Node.js ใน Bash ของ Windows 10 ให้เป็นรุ่นปัจจุบัน

    ปัญหาคือ บน Windows 10 เราสามารถใช้ Windows Subsystem for Linux (WSL) หรือ Bash Shell ได้ ซึ่งจริงๆมันก็คือ Ubuntu 16.04.3

    แต่ว่า เวลาจะใช้งาน Node.js ติดตั้งพวก Firebase, Angular อะไรพวกนี้ จะทำไม่ได้ เพราะรุ่นที่ให้มามันเก่ามาก

    วิธีการคือ (Reference: https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions)

    ใช้คำสั่งต่อไปนี้

    curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
    apt-get install -y nodejs

    ก็เรียบร้อย