Friday, March 21, 2014

บ้านหลังใหม่

ตอนนี้ผมย้ายไปเขียนบล็อกที่เว็บส่วนตัวอย่างเป็นทางการ (สักที) ที่ www.onlydevtwice.com นะครับ

ติดตามหรือไปพูดคุยกันได้ครับ :-)

Sunday, June 9, 2013

จับภาพหน้าจอใน Raspbian Wheezy


English Version: Take a screenshot in Raspbian Wheezy.

การจับภาพหน้าจอในขณะที่เราทำงานอยู่ใน LXDE ของ Raspbian สามารถทำได้โดยใช้โปรแกรมที่ชื่ีอ ImageMagick โดยสามารถติดตั้งได้ด้วย apt

sudo apt-get install imagemagick

หลังจากติดตั้ง ImageMagick เป็นที่เรียบร้อย เราก็สามารถจับภาพหน้าจอโดยใช้คำสั่ง import

import -window root screen.png

หรือหากต้องการช่วงจังหวะดีเลย์ก่อนเริ่มจับภาพหน้าจอ ก็สามารถระบุเวลาดีเลย์เป็นวินาทีได้โดยใช้ร่วมกับคำสั่ง sleep เช่น

sleep 5; import -window root screen.png

อ้างอิง: http://stackoverflow.com/questions/10581953/how-do-i-take-a-screenshot-on-a-raspberry-pi-running-debian-squeeze-and-lxde

Saturday, June 8, 2013

แก้ปัญหาคีย์บอร์ด mapping ใน Raspbian Wheezy


View in English version

ช่วงนี้กำลังเล่น Raspberry Pi อยู่ครับ ลองเจ้า Raspbian Wheezy อยู่ แต่เจอปัญหาคีย์บอร์ด map ไม่ตรง ที่ผมเจอคือพอจะกดสัญลักษณ์ @ หรือ # มันกลับได้เป็นอักขระอื่น

หลังจากค้นหาในอินเตอร์เนทก็เลยพบว่าเลย์เอาท์ของมันเป็นแบบ UK ดังนั้นวิธีแก้ไขก็คือปรับมาเป็น US โดยใช้ nano เข้าไปแก้ไขตั้งค่าคีย์บอร์ด

sudo nano /etc/default/keyboard


แล้วเปลี่ยนค่า XKBLAYOUT จาก "gb" (เดาว่าน่าจะมาจาก Great Britain) เป็น "us"

จากนั้นก็รีบูตเครื่อง 

sudo /sbin/reboot

หลังจาก PI เปิดขึ้นมาอีกครั้ง คุณก็จะได้เลย์เอาท์ US แบบที่คุ้นเคยแล้วหละครับ

อ้างอิง: http://raspberrypi.stackexchange.com/questions/1042/why-is-my-symbol-not-working

Wednesday, August 29, 2012

บันทึกแสนสั้นของผม จากสัมนา Mobile App ที่ CMMU


เมื่อบ่ายไปงาน สัมนา Mobile Apps ที่วิทยาลัยการจัดการ มหาวิทยาลัยมหิดล (CMMU) ได้ข้อมูลดีๆ มาเยอะ ทั้งข้อมููลจากผลวิจัยของ CMMU และจากวิทยากรรับเชิญ

ขอยกข้อมูลอย่างหนึ่งที่น่าสนใจเขียนเก็บเป็นโน๊ตกันลืมไว้

ข้อมูลนั้นคือวิธีในการใช้แอพเป็นเครื่องมือในการทำธุรกิจขององค์กรต่างๆ ซึ่งเป็นข้อมูลที่เขาไปทำสำรวจและวิจัยมา

วิธีการใช้แอพเป็นเครื่องมือทางธุรกิจมีสองรูปแบบ คือใช้สร้างเป็นธุรกิจและใช้สนับสนุนองค์กร

  1. ใช้สร้างเป็นธุรกิจ
    แอพประเภทนี้มีการสร้างรายได้จาก End User โดยตรง เช่นจากการขายแอพ, In-app purchase หรือแม้กระทั่งการขายแบนเนอร์โฆษณาในแอพ ในงานยกตัวอย่างแอพของ ASTV, Wongnai, Shop Spot และ Molome
  2. ใช้สนับสนุนองค์กร
    เป็นการใช้เพื่อส่งเสริมภาพลักษณ์และเพิ่มช่องทางในการโปรโมทสินค้าและบริการขององค์กรผ่านทาง mobile application ในงานยกตัวอย่างแอพของ AIS, NokAir, KBank, Rarinjinda ซึ่งโดยรวมแอพประเภทนี้ก็ทำหน้าที่เป็นเหมือนอีกช่องทางที่ทำให้ลูกค้าเข้าถึงบริการได้สะดวกขึ้น
จริงๆ ผมเชื่อว่าข้อมูลข้างต้น นักพัฒนาหรือคนที่ใช้ smart phone อยู่เป็นประจำคงเข้าใจดีอยู่แล้ว เพียงแต่ผมเห็นว่าข้อมูลที่ได้ฟังมาวันนี้เป็นผลมาจากการสำรวจและวิจัยโดยตรง จึงน่าจะโน๊ตเก็บไว้ เท่านั้นเอง :-D

ข้อมูลอีกส่วนที่นักพัฒนาน่าจะสนใจคือ คำตอบจากคำถามที่ว่าเราควรจะพัฒนา app แบบ mobile website application (รวมถึงเทคโนโลยี cross platform อย่าง HTML5) หรือ native application ซึ่งผู้ตอบคำถามก็คือพี่เนยแห่ง Molome ซึ่งใจความที่ผมจับได้พี่เนยแสดงความเห็นว่า native app มี performance ที่ดีกว่าและมีลูกเล่นที่เยอะกว่า แต่ในระยะหลังๆ เริ่มมีการพัฒนา app ด้วย HTML5 มากขึ้น ซึ่งพี่เนยก็บอกว่าถ้าทำ app แนว informative (app ที่นำเสนอ content เป็นหลัก) ใช้ HTML5 ก็เหมาะดี

โดยส่วนตัวผมก็เห็นด้วยกับความเห็นนี้ เพราะจากที่เคยเจอมาเอง ผมเชื่อว่าถ้าองค์กรต้องการจะมี mobile application เป็นของตัวเองและต้องการรีบผลักดันออกสู่ตลาดเร็วๆ ใน short term ใช้ HTML5 ก็ถือว่าเหมาะเพราะใช้เวลาและงบประมาณในการพัฒนาน้อยกว่าและเป็น cross platform แต่ใน long term เมื่อมีความต้องการฟังก์ชันที่มากขึ้น ควรจะพัฒนาเป็น native app เพราะมี performance ที่ดีกว่าและที่สำคัญ "User Experience" ก็ดีกว่าด้วย

Thursday, November 10, 2011

กลับมาแว้ววว

ผมกลับมาเขียนบล็อกภาษาไทยที่นี่นะครับ สำหรับบล็อกภาษาอังกฤษตามอ่านได้ที่ http://johnnydew.blogspot.com

Thursday, December 31, 2009

ยืดๆ หดๆ กับ ArrayList



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

หลายๆ คนที่เขียนโปรแกรมด้วยภาษา Java ก็คงจะคุ้นเคยกับเจ้า ArrayList ซึ่งมีความสามารถในการยืดหดขนาดของตัวเอง (^ ^") ตอนที่มีการเพิ่มหรือลบข้อมูลเหมือนกับ Linked List และยังเข้าถึงข้อมูลในindex ที่ต้องการได้โดยตรง(direct access) ราวๆกับอาร์เรย์ทั่วๆไป เจ้า ArrayList ได้นำข้อดีของทั้งArray และLinked List มารวมไว้ด้วยกัน

เวลาเราใช้่ArrayList ในโปรแกรมของเรา ถ้าต้องการดูขนาดของArrayList เราก็จะเรียกใช้เมธอดที่ชื่อว่า size() ซึ่งเมธอดนี้จะรีเทิร์นผลลัพธ์เป็นเลขจำนวนเต็มบอกถึงจำนวนข้อมูลที่อยู่ในArrayList นั้นๆ และเมื่อเราจะเพิ่มข้อมูลลงไปตรงตำแหน่งท้ายสุดของArrayList เราก็ใช้เมธอด add(E element) ซึ่งใช้เวลาการทำงานเท่ากับ O(1) หรือ add(int index, E element) ในกรณีที่ต้องการระบุตำแหน่งที่ต้องการใส่ข้อมูลใหม่ลงไป ซึ่งใช้เวลาการทำงานเท่ากับ O(n) เนื่องจากต้องเลื่อนข้อมูลทุกตัวไปทางขวามือหนึ่งช่อง ส่วนเวลาต้องการข้อมูลก็เรียกใช้เมธอด get(int index) ซึ่งใช้เวลาในการทำงานเท่ากับ O(1) ถ้าจะลบก็ใช้เมธอด remove(int index) ซึ่งใช้เวลาในการทำงานเท่ากับ O(1) เช่นกัน (เนื่องจากทั้งสองเมธอดเป็นการทำงานแบบ direct access)

เวลาเราใช้เมธอด add() หรือ remove() ขนาดของArrayList ก็จะเปลี่ยนไปด้วย (ทดสอบได้ด้วยการเรียกจากเมธอด size() ) ดูแล้วราวกับว่าArrayList จะปรับเปลี่ยนขนาดของตัวเองได้เหมือนกับ Linked List แต่จริงๆ แล้วเจ้าArrayList ก็มีลิมิตของตัวเองเหมือนกันนะจ้ะ !!!??!!




จริงๆ แล้วArryaList จะจองหน่วยความจำไว้ค่าหนึ่ง แล้วเมื่อเราเพิ่มข้อมูล(เรียกเมธอด add()) ไปเรื่อยๆจนพื้นที่ตรงนั้นเต็ม ArrayList ก็จะทำการเพิ่มหน่วยความจำให้เองโดยอัตโนมัติ ซึ่งขั้นตอนการจองหน่วยความจำตรงนี้ ผู้เขียนโปรแกรมเองไม่จำเป็นต้องทำเอง ทั้งหมดล้วนทำงานอยู่เบื้องหลัง แต่ผู้เขียนโปรแกรมเองก็สามารถที่จะสั่งให้ArrayList เพิ่มขนาดได้ด้วยเช่นกัน โดยการเรียกเมธอด ensureCapacity(int minCapacity) โดยที่อาร์กิวเมนต์ minCapacity คือจำนวนช่องที่เราจะขอเพิ่มขนาดของArrayList

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

Saturday, November 28, 2009

มาซ่อนข้อความลับในไฟล์รูปภาพกันเถอะ !!!

เมื่อเช้า Notebook ของผมอาการเข้าขั้นโคม่าเลยครับ ช่องเสียบชารจ์แบตท้ายเครื่องเจ้ง เสียบไฟไม่เข้า วันนี้ทั้งวันผมเลยวุ่นอยู่กับการชำแหละ Notebook ออกมาเป็นชิ้นๆ สุดท้ายก็เจอสาเหตุครับ นั่นคือเจ้าตัวช่องเสียบชาร์จแบตมันเริ่มหลวมๆ ก็เลยต้องบัดกรีมันลงบนเมนบอร์ดใหม่ให้แน่นขึ้น ตอนนี้ก็ดีเหมือนเดิม ได้กลับมาอัพblog อีกครั้ง ^ ^

งานนี้ต้องขอบคุณพี่ิเบิ้มที่ช่วยแนะนำตอนผมชำแหละเครื่อง, พี่อนุชาและพี่แก้วแห่งห้องแลบฮาร์ดแวร์ที่ช่วยบัดกรีเมนบอร์ดให้

มาเข้าเรื่องบทความกัน วันนี้ผมขอแนะนำวิธีการซ่อนข้อความไว้ในไฟล์ภาพ หรือที่เรียกกันว่า Steganography พอดีการบ้านวิชา Computer Security อาจารย์ให้ทำ Steganography วันนี้ก็เลยอยากจะมาแนะนำวิธีทำ Steganography แบบเบสิกกันครับ



Steganography
เป็นเทคนิคในการซ่อนข้อมูลไว้ในไฟล์อื่น ซึ่งอาจจะเป็นไฟล์ภาพ หรือไฟล์เสียงก็สามารถที่จะซ่อนได้ แต่ที่เป็นที่นิยมก็คือไฟล์ภาพ ไฟล์ภาพที่จะนำมาซ่อนข้อความก็มีอีกหลายชนิด ไม่ว่าจะเป็น GIF, JPEG, PNG ฯลฯ โดยในบทความนี้ ผมจะแนะนำวิธีการทำ Steganography ทั้งตัวซ่อนข้อความ (Encoder) และตัวถอดข้อความออกจากภาพ (Decoder) โดยจะใช้ไฟล์ภาพแบบ GIF และใช้ภาษาซีในการทำครับ

ก่อนอื่นก็ต้องรู้จักโครงสร้างของรูปภาพแบบ GIF กันก่อน โดยขอให้ดูที่เว็บไซต์ของคุณ Matthew Flickinger(http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp) ประกอบนะครับ เพราะที่เว็บนี้มีรูปโครงสร้างของไฟล์ภาพแบบ GIF ที่เข้าใจได้ง่ายมาก นอกจากนั้น อยากแนะนำให้ใช้โปรแกรม Hex Editor Neo กัน เพราะโปรแกรมนี้สามารถที่จะเปิดดู Binary Code ของไฟล์ต่างๆ รวมไปถึงไฟล์ภาพแบบ GIF ที่เราจะใช้กันด้วย ซึ่งพอเราเปิดไฟล์ภาพแบบ GIF ในโปรแกรม Hex Editor Neo ประกอบกับดูรูปอธิบายโครงสร้างไฟล์ภาพของคุณ Matthew Flickinger แล้วจะยิ่งเข้าใจโครงสร้างของ GIF มากขึ้นครับ

โปรแกรม Hex Editor Neo โหลดได้ที่เว็บไซต์ http://www.new-hex-editor.com/ โดยเจ้าโปรแกรมตัวนี้ สามารถที่จะดูโค้ดภายในรูปได้ทั้งแบบเลขฐานสอง หรือฐานสิบหก รวมถึงยังสามารถค้นหา Pattern ในโค้ดได้ด้วย ซึ่งจะสะดวกมากเวลาเราจะค้นหาส่วนต่างๆ ในรูป




สำหรับวิธีการหรืออัลกอริทึมที่จะใช้ในการซ่อนข้อความนั้น ผมจะใช้การซ่อนแต่ละบิตของข้อความไว้ในบิตที่มีนัยสำคัญน้อยที่สุด(LSB) ของ Global Color Table ของไฟล์ GIF เนื่องจากการที่เราไปเปลี่ยนแปลงบิต LSB ของ Global Color Table นั้น จะไปส่งผลให้เฉดสีของรูปในแต่ละ pixel เปลี่ยนไปแค่เล็กน้อยมากๆ จนตาคนเราสังเกตุเห็นได้ยาก ในทางกลับกันถ้าเราเปลี่ยนไปซ่อนในบิตที่มีนัยสำคัญสูงที่สุด (MSB) ของ Global Color Table จะทำให้เฉดสีเปลี่ยนไปเป็นคนละสี ซึ๋งง่ายต่อการสังเกตุด้วยตาเปล่า

ตัวอย่าง

อักขระ A แปลงเป็นเลขฐานสองได้ 0100 0001
และสมมติให้ข้อมูลใน Global Color Table เป็นดังต่อไปนี้

11111110 11111111 11111110 11111110
11111111 11111111 11111110 11111100

เมื่อนำแต่ละบิตของอักขระ A (เริ่มจาก LSB) ไปแทนที่ตำแหน่ LSB ของแต่ละไบต์ใน Global Color Table จะได้ผลลัพธ์ดังนี้

11111111 11111110 11111110 11111110
11111110 11111110 11111111 11111100

เราก็ทำแบบเดียวกันนี้กับตัวอักษรตัวอื่นๆ ครับ ซึ่งเราสามารถจะเก็บได้เรื่อยๆ จนกระทั่งสิ้นสุดตำแหน่งของ Global Color Table

อัลกอริทึมที่จะใช้สำหรับ Encoder นั้นเป็นไปตาม Flow Chart ดังนี้ (คลิกที่รูปเพื่อดูภาพขยายครับ)



จากอัลกอริทึมนี้ จะเห็นว่าเราจะใส่ท้ายข้อความด้วยอักขระ ‘:’ เพื่อที่เวลา Decoder ทำการถอดข้อความออกจากรูปภาพ จะได้ทราบจุดสิ้นสุดของข้อความด้วยการมองหาอักขระ ‘:’
ในส่วนของ Decoder มีอัลกอริทึกดังนี้ (คลิกที่รูปเพื่อดูภาพขยายครับ)



ส่วนของ Decoder จะมองหาอักขระ ‘:’ เนื่องจากถ้าไม่มีอักขระ ‘:’ ก็แสดงว่าไฟล์ภาพนี้ยังไม่ได้ผ่านการซ่อนข้อความจาก Encoder สำหรับ source code ภาษาซีทั้ง Encoder และ Decoder สามารถดาวน์โหลดได้ที่นี่ โค้ดนี้สามารถคอมไพล์ได้ทั้ง gcc บน unix , c-free บน windows หรือ IDE ตัวอื่นๆ ของภาษาซีก็ได้ครับ หากมีข้อสงสัยเกี่ยวกับ code ที่ให้ไป (ต้องสงสัยแน่ เพราะคนเขียนนูป ^ ^") ก็เมล์มาถามกันได้ครับที่ programmer_boyz@hotmail.com

สำหรับวิธีการซ่อนข้อความไว้ในไฟล์ GIF ยังมีอีกหลายแนวทางที่สามารถทำได้ ไม่ว่าจะเป็นซ่อนใน Local Color Table หรือแม้แต่ซ่อนใน Comment Extension ก็สามารถทำได้ ซึ่งขึ้นอยู่กับความต้องการของผู้ใช้ ถ้าเราเข้าใจโครงสร้างของไฟล์ภาพ ก็สามารถที่จะเลือกซ่อนข้อความได้หลากหลายวิธีครับ

สำหรับวันนี้ ขอลาไปก่อนนะครับ ^ ^

ปล.เครดิตให้คุณ Fah Longhorn ที่แนะนำอัลกอริทึมนี้ให้ผมตอนทำ Assignment วิชา Computer Security ครับ

ปล.อีกทีนะ คุณ @aeronz เขียนบทความเกี่ยวกับ Steganography ในไฟล์ภาพแบบ PNG ไว้ ลองคลิกอ่านดูเพิ่มเติมกันที่นี่เลยครับ