Author: kampanart.c

  • Raspberry Pi 3 [Drive 16×2 LCD with I2C Interface]

    หลังจากตอนที่แล้วเราได้ทำการ setup โปรแกรมที่เราต้องการ

    ในตอนนี้ขอพูดถึงอุปกรณ์ต่อพ่วงกันบ้าง เพื่อให้ดูเหมือนเข้าสู่ยุค IoT (Internet Of Things) มากขึ้น นั่นคือจอ LCD ระดับเบื้องต้น ขนาด 16×2 ดังรูปนี้

    ซึ่งอุปกรณ์ตัวนี้ สามารถแสดงผลได้ 2 แถว แถวละ 16 ตัวอักษร ซึ่งเพียงพอในระดับเบื้องต้นสำหรับการเรียนรู้การเขียนโปรแกรมครับ

    โดยในตลาดจะมีขายหลายรุ่น เช่น 16×2, 20×4 ไปจนถึง 128×64 อีกทั้งยังมี จอสีประเภท TFT 2.4 นิ้ว, 3 นิ้ว, 3.2 นิ้ว, 4 นิ้ว เป็นต้น และมีแบบหน้าจอสัมผัสให้เลือกใช้งานอีก มากมาย

     

    การเชื่อมต่อจอ 16×2 กับบอร์ด Raspberry Pi 3

    โดยทั่วไปแล้ว จะต้องทำการเชื่อมต่อดังรูปด้านล่างนี้

     

             

    การเชื่อมต่อแบบ 4 bits (ซ้าย) – การเชื่อมต่อแบบ 8 bits (ขวา)

    จะเห็นว่าเป็นการเชื่อมต่อที่ยุ่งยาก ใช้สายหลายเส้น และยากต่อการปรับเปลี่ยนการใช้งาน ดังนั้นจึงมึโมดูลที่เข้ามาช่วยตรงนี้คือ I2C

     

    I2C คืออะไร

    I2C คือบัสการเชื่อมต่ออนุกรมแบบ Synchronous ด้วยสายสัญญาณเพียง 2 เส้น (แต่จริงๆ ต่อ 4 เส้น ได้แก่ SDA, SLC, +5V และ GND) โดยจะมีสายสัญญาณข้อมูล คือ SDA (Serial Data Line) และสายสัญญาณนาฬิกา คือ SLC (Serial Clock Line) โดยแบ่งการทำงานออกเป็น 4 โหมดตามความเร็วดังนี้

    1. Normal Mode ความเร็ว 100Kbps
    2. Fast Mode ความเร็ว 400Kbps
    3. Fast Mode Plus ความเร็ว 1Mbps
    4. High Speed ควาามเร็ว 3.4Mbps

     

    ซึ่งเมื่อเป็นการเชื่อมต่อแบบอนุกรม ทำให้เราสามารถใช้งาน I2C ได้มากกว่าหนึ่งอุปกรณ์บนสายเพียง 2 เส้น โดยจะเลือกติดต่อกับอุปกรณ์ใดได้ด้วยการกำหนดที่อยู่ (Address) ของ Hardware ให้กับอุปกรณ์

     

    และเนื่องด้วยความง่ายของการใช้งานของ I2C ทำให้อุปกรณ์จอ LCD ส่วนใหญ่จะทำการติดตั้งมาพร้อมกับจอแล้ว ดังรูป

              

    I2C Module คือโมดูลสีเข้มในรูป
    บอร์ดสีเขียวคือ ด้านหลังของจอ LCD 16×2 ซึ่งได้ทำการเชื่อมต่อเรียบร้อยแล้ว

     

    เริ่มทำการเชื่อมต่อกับ Raspberry Pi

    โดย I2C จะต้องทำการเชื่อมต่อ 4 เส้น คือ +5V, GND, SDA, SLC กับ Pinout ของ Raspberry Pi 3

    ดูจากข้อมูล Alternate Function เราจะต้องทำการต่อสาย SDA ที่ Pin 3, SCL ที่ Pin 5
    และ +5V ที่ Pin 2 หรือ ส่วน GND นั้นมี Pin 6, 9, 25, 39, 14, 20, 30 หรือ 34 ให้เลือก

     

         

    จากนั้นทำการ Power On Raspberry PI 3 ขึ้นมาครับ จะพบว่าหน้าจอ LCD ติดพร้อมไฟ Backlight (แต่ไม่มีตัวอักษรอะไรแสดง เพราะเรายังไม่ได้โปรแกรมครับ)

     

    หน้าจอสามารถปรับ Contrast (ความเข้มของตัวอักษร) และสามารถ เปิด/ปิด ไฟ backlight ได้ด้วย Jumper บนโมดูล I2C ครับ

     

    ตอนต่อไป จะเป็นการเริ่มเขียน Python เพื่อแสดงผลตัวอักษร

     

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

  • 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 และการติดตั้งโปรแกรมพื้นฐานอย่างง่ายครับ

     

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

     

  • 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 ครับ

     

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

  • ASP.NET API Security

    ปัจจุบันการพัฒนาโปรแกรมในรูปแบบของ API นั้นแพร่หลายมาก เนื่องจากจะทำให้โปรแกรมยืดหยุ่น สามารถพัฒนา Interface ไปในรูปแบบที่หลากหลาย ทั้ง Desktop, Mobile โดยเฉพาะการเรียก API ผ่าน http นั้น ถือว่าค่อนข้างที่จะยืดหยุ่นกับเกือบจะทุก platform ดังนั้น การรักษาความปลอดภัยให้กับ API เหล่านี้ เป็นสิ่งที่จำเป็นและสำคัญอย่างยิ่ง

    บทความนี้จะพูดถึง 2 เรื่องหลักๆ ได้แก่ การ Authentication และการ Authorization ดังนี้ครับ

     

    Authentication

    เปรียบเสมือนกับการตรวจสอบว่าใครเป็นผู้ร้องขอ (request) ซึ่งอาจจะเป็นในลักษณะของ username/password หรือเป็น API Key จากใน HTTP Request Header

    ในบทความนี้จะขอข้ามการพูดถึงการ authentication ด้วย username/password เพราะเชื่อว่าสามารถทำกันได้อยู่แล้ว ไม่ว่าจะเป็นการเขียน provider เองหรือใช้ provider ที่มีมาให้กับ .net framework ซึ่งได้แก่ MembershipProvider โดยจะขอเริ่มพูดในส่วนของ API Key ซึ่งจะใช้คลาส HttpMessageHandler (ทำงานใน http message level ดีกว่าไปทำใน controller แน่นอนครับ) วิธี implement คือ การสร้าง Class ที่ inherite มาจาก DelegatingHandler (ซึ่งมาจาก HttpMessageHandler อีกที) จะให้ override ส่วนของการตรวจสอบ HTTP Request โดยการทำ overriding method ชื่อ SendAsync และเพื่อให้ทำงานได้ จะต้องทำการ register handler ที่ Global.asax ใน Application_Start ด้วยครับ ด้วยคำสั่ง GlobalConfiguration.Configuration.MessageHandlers.Add(new MY_CLASS());

    API Key Authentication

    เราจะต้องมี API Key โดยสามารถเก็บไว้เป็นค่าคงที่ หรือเก็บไว้เป็นข้อมูลในฐานข้อมูล จากนั้นทำการตรวจสอบ Request ที่เข้ามาด้วยคำสั่งต่อไปนี้

    HttpRequestMessage.Headers.TryGetValues(“API_KEY”, out myHeader)
    (ต้องทำการสร้าง instance ของ HttpRequestMessage ก่อนนะครับ — myHeader เป็น type IEnumerable<string>)

    จากนั้นเรานำค่าในตัวแปรมาตรวจสอบกับ API Key ของเรา ที่เราเก็บไว้ เช่น

    ถ้าเก็บไว้เป็นค่าคงที่ ก็ตรวจสอบดังนี้

    myHeader.FirstOrDefault().Equals(“MySecretAPIKeyNaJa”);

    หรือถ้าเก็บไว้ในฐานข้อมูล ก็ตรวจสอบดังนี้

    db.API_KEY.Where(w => w.KEY == myHeader.FirstOrDefault()).Count() > 0 เป็นต้น

    หากเป็น API Key ที่ถูกต้อง สามารถ return response ดังนี้ได้ทันที await base.SendAsync(HttpRequestMessage, CancellationToken);
    ส่วนถ้าเป็น API Key ที่ไม่ถูกต้อง สามารถ return response ดังนี้ เพื่อให้ browser รู้ว่าเกิดอะไรขึ้น HttpRequestMessage.CreateResponse(HttpStatusCode.Forbidden, “Invalid API Key”);

     

    Authorization

    การทำ authorization นี้จะใช้งาน RoleProvider จาก .NET Framework ซึ่งจะต้องทำการ Implement role provider มาก่อน (รายละเอียด: https://msdn.microsoft.com/en-us/library/8fw7xh74.aspx)

    หลังจากการทำยืนยันตัวตน (Authentication) แล้ว ควรจะทำการตรวจสอบการอนุญาตให้เข้าถึงทรัพยากรหรือการกระทำ (action) ด้วย ด้วยการใช้งาน AuthorizeAttribute ซึ่งเป็น filter attribute ด้วยวิธีการง่ายๆ เพียงการใส่ [Authorize] ไว้บน Controller (Class) หรือ Action (Method) ซึ่งจะมี attribute [AllowAnonymous] ให้สามารถใช้ได้ สำหรับ controller, action ที่ไม่ต้องการการ authentication หรือ authorization ครับ

     

    นอกจากนี้เรายังสามารถระบุ role กับ attribute ได้อีกด้วย เช่น [Authorize{Roles = “Manager, ValidUsers”}] เป็นต้นครับ

     

     

     

  • การส่งค่าจาก Models แบบ Multiple มายัง Single View

    โดยปกติแล้วใน MVC เราจะไม่สามารถส่งค่าที่อยู่ใน Models มามากกว่า 1 Models จาก Controller มายังวิวเดียวกันได้ ซึ่งจริงๆ แล้วมีเทคนิคที่จะทำให้สามารถส่งค่าผ่านมาได้โดยง่าย ดังหลายๆ วิธีต่อไปนี้

     

    ดาวน์โหลด Source Code ได้ที่นี่ครับ

     

    หมายเหตุ: ในตัวอย่างผมจะใช้ method GetTeachers() และ GetStudents() ร่วมกันในหลายวิธีนะครับ ตามนี้ครับ

     

    1. ใช้ View Model

    View Model เป็น Class เดี่ยวๆ ที่อาจจะประกอบด้วยหลาย models อยู่ภายใน ซึ่งไม่ควรจะมี method อยู่ภายใน
    จากตัวอย่างข้างล่าง เป็น model ที่มี 2 properties ซึ่งจะต้องทำการ define strongly typed เพื่อให้ Intellisense สามารถใช้งานได้

    Controller

    View

     

    2.ใช้ View Data
    การใช้ ViewData เป็นอะไรที่ง่ายมาก สามารถเก็บค่าและส่งค่าผ่านจาก Controller ไปยัง View ได้ทันที (คล้ายกับตัวแปล Session ใน C# รุ่นก่อนๆ) ดังตัวอย่าง

    Controller

     

    View

     

    3.ใช้ Dynamic Model

    จะต้องทำการเรียกใช้คลาส ExpandoObject (อยู่ภายใต้ namespace: System.Dynamic เฉพาะใน .NET Framework 4.0 ขึ้นไป) จะอนุญาตให้เราเพิ่มหรือลบค่า properties ของ object ขณะ runtime ซึ่งจะทำให้เราสามารถสร้าง object และ เพิ่มหรือลบ ค่าเข้าไปใน properties ได้ ซึ่งมีข้อเสียคือการส่งค่าแบบ dynamic นี้จะไม่สามารถใช้ strongly typed model ได้ ซึ่งจะต้องนำไป cast เป็น type ที่ต้องการ เมื่อเรียกใช้อีกครั้งหนึ่ง

    Controller

    View

     

     

    4. ใช้ View Bag

    จะเหมือนกับการใช้ View Data ซึ่ง View Data เป็น dictionary object ต่างจาก View Bag ที่เป็น dynamic property ของ ControllerBase Class

    Controller

    View

     

    5. ใช้ Tuple

    Tuple คือ Object ที่ไม่สามารถเปลี่ยนรูปได้ (Immutable), ขนาดคงที่และเรียงตามลำดับ (fixed-size and ordered sequence object) โดยโครงสร้างจะมีหมายเลขที่เจาะจงและลำดับที่ของข้อมูล โดย .NET Framework รองรับได้สูงสุด 7 ข้อมูล (elements) ดังตัวอย่าง

    Controller

    View

     

    6. ใช้การ Partial View (Partial Render in Action Method)

    ทำการ render partial view อยู่ภายในวิว ซึ่งเราสามารถแยกเป็นสอง partial view โดยแต่ละ partial view ก็จะมี model เป็นของจนเอง ตามตัวอย่าง

    Controller

    View

     

    ดาวน์โหลด Source Code ได้ที่นี่ครับ

     

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

     

     

  • กว่าจะมา… C# 7.0

    สวัสดีครับ

    บทความนี้เขียนเพื่อนำเสนอ Features ใหม่ บนภาษา C# 7.0 พร้อมกับเปรียบเทียบกับเวอร์ชั่นก่อนหน้าครับ ซึ่งเพิ่งจะ Release ออกมาเมื่อวันอังคารที่ 7 มีนาคมที่ผ่านมานี่เอง และได้เป็นส่วนหนึ่งของ Visual Studio 2017 ไปเรียบร้อยแล้วครับ (มีให้ดาวน์โหลดใน Microsoft Imagine แล้วครับ ซึ่งขณะเขียนบทความนี้เป็นเวอร์ชั่น Release Candidate (RC))

    ขั้นตอนการติดตั้ง ไม่ขอเอ่ยถึงนะครับ เชื่อว่าทุกคนติดตั้งเป็น ส่วนสำคัญจะเป็นการเลือก Component สำหรับติดตั้งครับ เลือกตามที่ต้องการ ซึ่งใน Microsoft Imagine จะเป็น Professional Edition ครับ เพียงพอสำหรับการใช้งาน

     

    ตัวอย่าง Source Code สามารถ ดาวน์โหลดได้ที่นี่ ครับ

     

    เริ่มกันเลยครับ

    • Out Variable

    ก่อนหน้าตัวแปร out variable จะต้องทำการประกาศค่า (pre-declare) ก่อนที่จะนำไปใช้

    แต่ด้วย C# 7.0 สามารถ declare ค่าพร้อมกับรับค่าจากส่วน out argument ได้ทันที

    ตัวอย่างการนำไปใช้งาน กับ Decision if…else…

    ซึ่งหากเราต้องการ discards ค่าตัวแปรที่รับมา ก็สามารถทำได้ ด้วยการใส่ “_”

    • Pattern Matching

    เป็นการตรวจสอบว่า element ที่มีอยู่นั้นมีรูปร่าง (shape) หรือค่า (value) ตรงกับที่ต้องการหรือไม่ ดังตัวอย่าง

    Is expression

    ตัวอย่างการนำไปใช้งานร่วมกับการ decision if…else… ร่วมกับ method Try…

    Switch expression

    สามารถ switch โดยใช้ type ได้ (ไม่เฉพาะ primitive types) ซึ่งสามารถนำ patterns มาใช้ในส่วนของ case และสามารถเพิ่มเงื่อนไข (condition) ได้ ดังตัวอย่าง

     

    • Tuples

    คือการ return ค่าจาก method มากกว่า 1 ค่า (ในเวอร์ชั่นก่อนหน้าของ c# ก็สามารถทำได้ โดยใช้ out parameters หรือ System.Tuple<…> หรือสร้าง transport type ด้วยตัวเอง (custom-built) หรือให้ return ค่าเป็น anonymous type ผ่าน dynamic return type) ซึ่งในเวอร์ชั่นใหม่นี้ ไม่จำเป็นต้องทำเช่นนั้นอีกแล้ว ดังตัวอย่าง

    (กรณี target framework ต่ำกว่า 4.6.2 จะไม่สามารถใช้ได้ ให้เลือก target framework ของ project เป็น 4.6.2 หรือไม่ก็ค้นหา “System.ValueTuple” จาก Nuget Package ครับ

    การนำไปใช้งาน หรือเรียกจาก method อื่น สามารถรับค่า tuple ผ่านประเภทตัวแปร var โดยสามารถเข้าถึงแต่ละ element แบบ individually ได้เลย

     

    ซึ่งถ้าสังเกตตอน coding พิมพ์ตัวแปร names จะขึ้น Intellisense Item… ให้เลือก

    หรือจะตั้งชื่อให้กับ tuple เพื่อความสะดวกในการเรียกใช้งาน ดังตัวอย่างนี้ครับ

    และแน่นอนว่า Intellisense ก็จะมีชื่อให้เลือก แทนที่จะเป็น Item1, Item2, Item3 ตามตัวอย่างก่อนหน้าครับ

    • Deconstruction

    เป็นอีกวิธีหนึ่งของการใช้งาน tuple คือการ deconstruct ซึ่งมี syntax สำหรับ split tuple value ใส่ในตัวแปลแต่ละตัว (individually variable)

    ทั้งสามตัวอย่างด้านล่างนี้คือการนำค่ามาใส่ในตัวแปรที่ถูกสร้างขึ้นใหม่

    ตัวอย่างข้างล่างนี้ คือการนำค่ามาใส่ในตัวแปรที่มีค่าอยู่แล้ว (existing variable value)

    และเราสามารถ discard ค่าที่เราไม่ต้องการได้ ด้วยสัญลักษณ์ “_” เหมือนกับตัวอย่างแรกๆ ที่เคยกล่าวไว้ก่อนหน้านี้

     

    • Local Functions

    บางครั้งการเขียน method (function) ซ้อนเข้าไปด้านใน method (function) อีกทีหนึ่ง จะช่วยให้เขียนโปรแกรมได้ make sense มากขึ้น ดังตัวอย่าง

    เช่น ตามตัวอย่าง เมื่อมีการเรียก CalcFibonacci(int x) จะเรียก method (function) ข้างในอีกครั้งหนึ่งที่ชื่อ DoFib และ return ค่าเป็นแบบ tuple โดยที่ patermeter จะใช้งานได้ใน scope ของ method (function) ของตัวเองเท่านั้น

    จากตัวอย่างข้างบน method ที่ implement อยู่ภายใน จะทำการ execute เมื่อมีการเรียกใช้เท่านั้น (ไม่สามารถเรียกมาจาก outer method หรือจาก method อื่นๆ ได้)

    จะสังเกตว่า การทำงานนี้คล้ายๆ กับการสร้าง private method แยกไว้อีก method นึง แต่การสร้างแยกไว้นั้น อาจจะมีข้อผิดพลาดในการเรียกใช้งานโดยไม่ตั้งใจ กรณีที่ชื่อ method คล้ายกัน โดยไม่ผ่าน argument checking/validating (คือตัวแปร source, filter) อาจทำให้เกิดการทำงานที่ผิดพลาดได้

    • Literal Improvements

    นอกจากการปรับเพิ่มความสะดวกในการเขียนโปรแกรมมากขึ้นแล้ว ยังปรับปรุงเรื่องความสะดวกในการอ่านโค้ด โดยเฉพาะเมื่อมีการ assign ค่าตัวเลขลงในตัวแปร

    จึงได้มีการใช้สัญลักษณ์ “_” เพื่อใช้เป็นตัวคั่น (digit separator) โดยไม่กระทบกับค่าที่ assign (ใช้เพื่อให้เราอ่านได้สะดวกขึ้นนั่นเอง) – (improve readability)

    • Ref return and locals

    เป็นการส่งค่าผ่านการ reference (ไม่ใช่การส่ง value) เช่น reference address, reference location ของ array เป็นต้น

    สิ่งนี้การเขียนโปรแกรมทั่วไปอาจจะไม่ค่อยได้ใช้เท่าไหร่  และในบางกรณีอาจส่งผลถึงเรื่องความปลอดภัย (เช่นการ modified ค่าใน memory ทำให้โปรแกรมทำงานผิดพลาด เป็นต้น) ดังตัวอย่าง

     

    • Expression bodied members allowed

    expression body ที่ไว้สำหรับเขียน method, properties ใน C# รุ่นก่อนหน้า เป็นปัญหามาก เพราะเขียนได้เฉพาะ method และ properties เท่านั้น

    และใน C# 7.0 นี้ ได้เพิ่ม accessors, constructors และ finalizers ซึ่งสามารถเขียนลงในในส่วนของ expression body ได้แล้ว ดังตัวอย่าง

     

    • Throw Exception

    ใน C# 7.0 สามารถเขียน throw exception ได้แม้ไม่อยู่ใน method (ของเดิมต้องอยู่ใน method เท่านั้น)  โดยสามารถเขียนใน expression body ที่เดียวกับ accessors, constructors และ finalizers ได้เลย ดังตัวอย่างด้านล่างนี้

    สำหรับโค้ดตัวอย่างโปรแกรม สามารถ ดาวน์โหลดได้ที่นี่ ครับ
    (มีตัวอย่างตามบทความนี้ ทุกตัวอย่าง – รันบน Visual Studio 2017 ครับ)

     

    ขอบคุณครับ

    อ้างอิง ต้นฉบับจาก https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/

     

  • การตั้งค่า Font เริ่มต้นใน Word ไม่ต้องคอยเปลี่ยนทุกครั้ง

    สำหรับท่านที่อาจจะต้องพิมพ์เอกสารราชการบ่อยๆ ซึ่งต้องใช้ TH Sarabun นั้น คงเป็นเรื่องน่าเบื่อที่จะต้องมาคอยเปลี่ยน Font ทุกครั้ง

     

    อันที่จริงแล้ว ใน Microsoft Word 2016 (ล่าสุด ณ ตอนเขียนบทความนี้) ท่านสามามารถบันทึกรูปแบบเริ่มต้นทั้งฟอนต์, ขนาดฟอนต์ รวมทั้งรูปแบบตัวอักษรไว้เป็นค่าเริ่มต้นได้เลย (Overwrite the Normal.dotm template) ด้วยวิธีการต่อไปนี้ครัช

     

    1. เลือก Font ที่จะเป็น Font เริ่มต้น ในตัวอย่างเลือกเป็น TH SarabunPSK ขนาด 16 แล้วก็คลิกตามลูกศรชี้

    2. กดที่ Set As Default ตามลูกศรอีกเช่นเคย

    3.เลือก All document based on the Normal.dotm template แล้วกด OK

    เพียงเท่านี้ ค่าที่ตั้งไว้ก็จะเป็นค่าเริ่มต้นทุกครั้งที่เปิด Microsoft Word 2016

    (เนื่องจากผมใช้ UI เป็นภาษาอังกฤษ สำหรับภาษาไทยนั้น ลองเทียบตำแหน่งปุ่มดูนะครับ)

     

    หากมีข้อผิดพลาด ขออภัยไว้ ณ โอกาสนี้ครัช