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

Read More »

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

Read More »

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 หรือ

Read More »

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 ด้วยวิธีการง่ายๆ

Read More »

การส่งค่าจาก 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  

Read More »