Just Another Blog
25Nov/110

Amazon Kindle Fire Review

Update 2011/11/26: นึกขึ้นมาได้ว่ารีวิว Kindle แต่ไม่มีรายละเอียดเรื่องตัว Reader ที่ใช้อ่านหนังสือ... แฮ่ะๆ เดี๋ยวจะมาอัพเดทให้นะครับ แต่บอกได้สั้นๆว่า ไม่เลวเลยครับ

เมื่อก่อนตอนอยู่ที่อเมริกา ช่วงนี้จะเป็นช่วง shopping spree ของผม เป็นช่วงที่เค้าเรียกกันว่า holiday season หรือช่วงวันหยุดนั่นเอง เพราะมีวันหยุด Thanksgiving Christmas และปีใหม่อยู่ใกล้ๆกัน ถ้าเดินในเมืองก็จะพบร้านค้าต่างๆตกแต่ง theme ร้านให้เข้ากับบรรยากาศ และอาจจะมีการเปิดเพลง christmas บ้านหลายๆบ้านก็จะเริ่มเอาไฟออกมาตกแต่งประชันกัน ให้ความรู้สึกอบอุ่นไม่น้อยเลย แต่สำหรับคนที่อยู่ตัวคนเดียวในเมืองนอกแล้ว บรรยากาศอย่างนั้นอาจทำให้รู้สีกเหงาได้ วิธีแก้ของผมคือการซื้อของเล่นให้ตัวเองในช่วงนี้ (แถมยังเป็นช่วงที่เค้าลดราคากันอีก โดยเฉพาะ Black Friday เนี่ย ตัวดีเลย) แต่พอกลับมาเมืองไทย ก็ทำให้ต้องประหยัดมากขึ้น กลับมาสองปี ไม่ได้ซื้ออะไรให้ตัวเองเลย พอดีเดือนก่อนโน้น Amazon ออกมาประกาศเจ้า Kindle Fire เลยถือโอกาศสอยมาซะหนึ่งเครื่อง โดยให้เพื่อนหอบมาให้ เป็นการสนองตันหาที่อดใจไม่ซื้อ tablet มาเป็นเวลานาน (ตั้งแต่ iPad ตัวแรกออกมาน่ะแหละ) ไม่พูดพล่ามทำเพลงมาก ใช้มาได้ 3-4 วัน ก็ขอรีวิวเลยก็แล้วกันครับ..

เอารูปแกะกล่องมาฝากกันก่อน..

กล่อง Kindle Fire เปิดกล่อง Kindle Fire แผ่นแนบที่มากับ Kindle Fire
Kindle Fire! Kindle Fire's Adapter Kindle Fire!

Hardware

มาเริ่มจาก hardware กันก่อนเลยดีกว่า เจ้า Kindle Fire ใช้จอ IPS ขนาด 7" โดยมีความละเอียด 1024x600 และความหนาแน่นของ pixel ที่ 169 PPI โดยใช้ dual-core CPU TI OMAP 4 ของบริษัท Texas Instruments ที่ความเร็ว 1GHz จากการทดลองทำ Benchmark โดยใช้ Quadrant เจ้า Kindle Fire ตัวนี้จะได้คะแนนอยู่ระหว่าง 1600-1900 ซึ่งนับว่าไม่เลวนักสำหรับ tablet ที่มีราคาเพียงแค่ $199 หรือประมาณ 6000 บาทเท่านั้น

Kindle Fire Benchmark

ตัวเครื่องอาจจะหนาและหนักสักนิดที่ 11.4 มม และ 413 กรัม เมื่อเทียบกับ Samsung Galaxy Tab 8.9" ที่มีความหนาเพียง 8.6 มม และหนักใกล้ๆกันที่ 453 กรัม แต่ถึงแม้ว่าขนาดจะหนากว่า แต่เมื่อถืออยู่ในมือ ไม่ได้มีความรู้สึกว่ามันหนักหรือเทอะทะจนเกินไป จริงๆแล้วขนาดและน้ำหนักของ Kindle Fire ทำให้รู้สึกว่าตัวเครื่องค่อนข้างที่จะ solid และมีราคา อีกทั้งผิวหลังของตัวเครื่องที่ทำมาจากวัสดุคล้ายยาง จึงทำให้รู้สึกดีเวลาที่ถืออยู่ในมือ และทำให้ไม่ต้องกังวลมากว่าจะเป็นรอย

ด้านหลัง Kindle Fire ในมือ ด้านหน้า Kindle Fire ในมือ

ในส่วนของปุ่ม พอร์ต และเซ็นเซอร์ต่างๆบนเครื่อง Kindle Fire มีเพียงแค่ปุ่มปิด/เปิด ช่องสำหรับเสียบ micro-USB ช่องเสียบหูฟัง และลำโพงเท่านั้น โดยพอร์ต USB อยู่ด้านล่างของตัวเครื่องระหว่างช่องเสียบหูฟังและปุ่มปิด/เปิด ส่วนลำโพงจะอยู่ด้านบนของตัวเครื่อง เนื่องจาก Kindle Fire ไม่ได้ทำมาให้รองรับการรับส่งข้อมูลผ่านสัญญาณโทรศัพท์ (เช่น 3G/EDGE) จึงไม่มีช่องสำหรับใส่ SIM ดูเหมือนว่า Amazon ได้พยายามที่จะทำให้เครื่องนี้มีราคาถูกที่สุดเท่าที่จะทำได้ เพราะตัวเครื่องไม่มีกล้อง Bluetooth หรือแม้แต่ช่องสำหรับใส่ SD แม้ว่ามันจะมี internal storage ที่ติดมากับเครื่องเพียงแค่ 8GB (เหลือจริงๆแค่ประมาณ 6GB) เท่านั้น โดย Amazon เคลมว่าพื้นที่แค่นี้สามารถที่จะเก็บได้ 80 apps บวกกับหนัง 10 เรื่อง เพลง 800 เพลง หรือ หนังสือ 6000 เล่ม อย่างไรก็ตาม Amazon ได้พยายามที่จะแก้ข้อจำกัดนี้โดยการนำ cloud storage มาเป็นพื้นที่เก็บข้อมูลอีกทางหนึ่ง ซึ่งจากที่ได้ลองดูแล้วรู้สึกว่าใช้ได้ในระดับนึงเลยทีเดียว ออกจะโล่งใจหน่อยที่ Amazon ยอมใส่ Wireless LAN แบบ b/g/n มาให้ เพื่อไม่ให้น่าเกลียดจนเกินไป) ถ้าดูจาก specs ที่ Amazon ประกาศ Kindle Fire สามารถอยู่ได้ประมาณ 8 ชั่วโมง ถ้าไม่ได้ใช้ wireless จากที่ลองใช้ดู (เปิด wireless ตลอดเมื่อใช้งาน) พบว่าอยู่ได้ตั้งแต่เช้ายันก่อนนอน โดยใช้ทั้งอ่านและดูหนัง นอกเวลาและระหว่างเวลาทำงาน

Software

ในด้านของ software ก็เป็นที่น่าสนใจไม่น้อยที่ Amazon ตัดสินใจใช้ Android 2.3 ซึ่งก็คือขนมปังขิง (Gingerbread) แทนที่จะเป็น Android 3 หรือ Honeycomb โดยเฉพาะถ้าหลายคนจำได้ ว่าทาง Google ได้เคยออกมาประกาศไว้เมื่อปีที่แล้ว (หลัง Samsung ออก Galaxy Tab ตัวแรกมาได้เพียงไม่กี่วัน) ว่า Android 2.x ไม่ได้ถูกสร้างมาเพื่อ tablet อย่างไรก็ดี ขนมปังขิงตัวนี้ก็ไม่ใช้ขนมปังขิงทั่วไปธรรมดาที่เอา UI มาแต่ง แต่เป็นการ fork โค้ด Android ออกมาทั้งกระบิ จึงทำให้มันเป็นเหมือน OS ใหม่อีกตัวนึงเลยทีเดียว และแทนที่เปิดเครื่องมาครั้งแรกจะต้องใส่ account ของ Google เราจะต้องใส่ account ที่ register ไว้กับทาง Amazon แทน

หน้าโฮม Kindle Fire หน้า Newsstand บน Kindle Fire หน้า Movies ของ Kindle Fire

หน้า App ของ Kindle Fire หน้าซื้อเพลงบน Kindle Fire หน้า Video Streaming บน Kindle Fire

เริ่มกันด้วยที่หน้าตา ที่มี home screen ที่แปลกตาไป โดยเป็นชั้นหนังสือแทน โดยแถวบนจะเป็น item (หนังสือ เพลง magazine app ฯลฯ) เรียงตามการใช้งานล่าสุด ส่วยแถวล่างเป็น favorite ด้านของชั้นหนังสือเป็นเมนูดังนี้: Newsstand (ร้านขายหนังสือพิมพ์/magazines) Books (ชั้นหนังสือ) Music (เพลง) Videos (หนัง) Docs (เอกสาร) Apps และ Web โดย Newsstand Books Music Videos และ Apps เป็นพื้นที่สำหรับ browse content ที่อยู่บนเครื่องหรือบน cloud และยังมีช่องทางสำหรับให้ซื้อ content เพิ่มเติมผ่านทาง Amazon Store อีกด้วย วิธีการซื้อก็ง่ายๆ เพียงแค่คลิกที่ราคาของที่จะซื้อ เครื่องก็จะทำการสั่งซื้อให้ (โดยเราต้องมีรายละเอียดบัตร credit ใน account ของ Amazon ก่อน) และถามว่าเราต้องการจะโหลดลงเครื่อง หรือจะเก็บไว้บนปุยเมฆ.. อีกอย่างหนึ่งที่ผมสังเกตุคือ ผมไม่สามารถใช้บัตรเครดิตในประเทศเพื่อซื้อ content ได้ แต่พอเปลี่ยนเป็นบัตรของอเมริกาปุ๊บ ก็ใช้ได้ในทันที อันนี้ไม่แน่ใจเหมือนกันว่าเป็นวิธีในการล็อคไม่ให้ใช้ Kindle Fire นอกประเทศหรือเปล่า (เนื่องจากปัญหา copyright) Kindle Fire อาจจะมีข้อจำกัดในเรื่องของจำนวน app เนื่องจากต้องผ่าน Amazon Appstore ซึ่งมีจำนวน app น้อยมากเมื่อเทียบกับ Apple App Store หรือ Android Market (วิธีแก้คือการ root แล้วเอา Android Market มาลง)

สิ่งใหม่ที่มากับ Kindle Fire คือ browser ตัวใหม่ของ Amazon ที่ชื่อว่า Silk โดย Amazon ได้ให้ความหวังไว้ค่อนข้างสูงกับ browser ตัวนี้ โดยบอกไว้ว่า Silk จะโหลดหน้าต่างๆได้เร็วกว่า browser อื่นๆเพราะใช้ technology การแคชจาก cloud ของ Amazon แต่จากการใช้งานจริง กับจากการอ่านตามรีวิวอื่นๆ พบว่าความเร็วที่เพิ่มขึ้นมานั้นน้อยมากจนแทบจะไม่รู้สึกได้เลย..

ดูหนัง ฟังเพลง อ่านหนังสือ

จากเท่าที่ได้ลองใช้ดูมาหลายวัน มีความรู้สึกว่า Kindle Fire เหมาะกับการเสพ content แบบ offline มากกว่า โดยเฉพาะเมื่อมันไม่สามารถใช้ data service จากสัญญาณโทรศัพท์ได้ สำหรับคนไทยแล้ว อาจจะต้องมาคิดนิดนึงก่อนซื้อ เพราะ service บางอย่างอาจจะใช้ได้ไม่เต็มที่ เช่นการ stream วิดีโอ ซึ่งต้องทำจากในอเมริกาเท่านั้น (หรือใช้ VPN เอา เพื่อให้ได้ IP ที่โน่น) ผมได้ลองใช้ VPN เพื่อ stream ดู ซึ่งผลออกมาใช้ได้ดีพอสมควร อาจจะ buffer นานนิดนึงในช่วงแรก แต่หลังจากนั้นก็แทบจะไม่มีกระตุกเลย ที่ยังไม่ได้ลองคือซื้อการซื้อหรือเช่าหนัง ซึ่งการซื้อหรือเช่าทำให้เราสามารถนำหนังมาเก็บบนเครื่องเพื่อดู offline ได้ ซึ่งผมยังสงสัยอยู่ว่า Amazon จะยอมให้โหลดหรือเปล่าถ้าไม่ได้มี IP ของอเมริกา ที่สงสัยว่าอาจจะได้ เป็นเพราะว่า Amazon ยอมให้ผมซื้อเพลงและเล่นผ่านทาง cloud ได้โดยไม่ต้องโหลดมาไว้บนเครื่อง (แต่ผ่าน cloud player บนเครื่องคอมพิวเตอร์ไม่ได้ ถ้าไม่ต่อ VPN) และไม่ต้องผ่าน VPN ไว้ถ้าผมหาหนังที่อยากดูเจอ จะลองไปโหลดดู แล้วจะกลับมารายงานครับ

เพิ่มเติมในส่วนของ cloud นิดนึง จากที่ได้ลองฟังเพลงผ่านปุยเมฆดู ปรากฎว่าใช้งานได้ค่อนข้างดีเลยทีเดียว โดยใช้เวลาโหลดเพลงแรกแค่ประมาณ 5-15 วินาทีเท่านั้น หลังจากเพลงแรกแล้ว เพลงอื่นๆก็ไม่ต้องรอ buffer

อื่นๆ และสรุป

จากที่ได้ใช้มา 3-4 วัน ส่วนตัวแล้วรู้สึกชอบ Kindle Fire ด้วยขนาดที่เล็กและน้ำหนักที่กำลังพอดี(คหสต) ทำให้รู้สึกอยากพกไปด้วยตลอดเวลา สำหรับคนไทยที่อยากใช้ อาจจะต้องคำนึงถึงเรื่องความยากง่ายในการซื้อ content เพราะอาจจะเข้าถึงได้ลำบากหน่อย ถ้าไม่ได้มีบัตรเครดิตหรือ IP ที่อเมริกา นอกจากนั้นแล้ว Kindle Fire ยังไม่มี keyboard ภาษาไทย จึงอาจทำให้ยากต่อการใช้ ซึ่งจริงมีวิธีแก้ แต่ต้องทำกายกรรมนิดหน่อย ไว้ถ้าว่างๆ หรือมีคนอยากอ่าน เดี๋ยวจะมาเขียนวิธีให้ครับ

ลองมาสรุปข้อดีและข้อเสียกันคร่าวๆ เริ่มจากข้อดีก่อน

  1. ขนาดเล็ก น้ำหนักกำลังดี และวัสดุที่ไม่ใช่พลาสติก ทำให้ไม่รู้สึกก๊องแก๊ง
  2. มี cloud ให้ใช้
  3. คุณภาพจอค่อนข้างดี ใช้อ่านหนังสือและดูหนังได้อย่างไม่น่าหงุดหงิด
  4. มี content (ที่ไม่ใช่ app) ให้เลือกเยอะ

ส่วนของข้อเสีย..

  1. UI ยังมีติดขัดอยู่บ้าง เช่นกดเร็วๆแล้วมันไม่ไป
  2. มี Storage แค่ 8GB (แถมยังเหลือให้ใช้แค่ 6GB)
  3. App น้อย (ถ้าไม่ root)

Kindle Fire ถือว่าเป็นอีกหนึ่งตัวเลือกที่น่าสนใจเลยทีเดียว สำหรับคนที่ชอบ content จำพวกหนังสือ หรือ magazine เพราะมีจำนวนให้เลือกอย่างหลากหลายบน Amazon Store อีกทั้งยังมีหนังให้ดูฟรีสำหรับคนที่เป็นสมาชิก Amazon Prime แต่สำหรับคนที่ชอบเสพ app หรือเล่นเกมแล้วละก็ Kindle Fire ไม่สามารถที่จะมาแทนเจ้าตลาดอย่าง iPad ได้เลย เพราะจำนวน app บน Amazon Appstore ห่างกับ store อื่นอย่าง Apple App Store หรือ Android Market อย่างเทียบชั้นกันไม่ได้ อย่างไรก็ดี เราสามารถ root Kindle Fire ได้ ทำให้โอกาสในการใช้งานอย่างอื่น หรือการเข้าถึง app store อื่นๆเป็นไปได้อย่างไม่ยากนัก..

20Feb/110

ทำโหลดแชร์ริ่งง่ายๆด้วยเราเต้อร์ Cisco

รู้สึกว่าช่วงหลังๆจะคุยเรื่องเที่ยวเรื่องอาหารค่อนข้างบ่อยเลยจะลองขอเปลี่ยนเกียร์มาคุยเรื่อง technical บ้าง เคยคิดไว้ว่าจะเขียนเรื่องนี้มานานแล้วแต่ไม่ได้เขียนซักที ครั้งนี้น่าจะเป็นโอกาสที่ดีที่จะเขียนเรื่องการทำ network load sharing (เพื่อ redudancy และรวม bandwidth) โดยใช้ router ของ Cisco โดยตัวที่จะใช้คือตัว 2600XM series ซึ่งเหมาะสำหรับคนที่ต้องการจะเรียนรู้หรือสอบ certificate ของ Cisco เพราะราคาไม่ค่อยแพงและมี features ค่อนข้างครบ จุดที่น่าสนใจของ project นี้คือเจ้า 2600XM เนี่ยโดย default แล้วจะมี FastEthernet มาแค่ port เดียว แล้วทีนี้เราจะรวมสายกันยังไงล่ะ (ไม่อยากซื้อ module มาเพิ่มเพราะไม่มีตังค์) คำตอบง่ายๆก็คือใช้ switch มาช่วยในการทำ router-on-a-stick (คล้ายๆกับการทำ inter-VLAN routing แต่ง่ายกว่าเพราะไม่ต้องแยก VLAN) ในกรณีของผมเนื่องจาก bandwidth ที่ออก Internet มันแค่ประมาณ 10% ของความเร็ว Fast Ethernet และ throughput ที่จะผ่าน router ไม่ได้มากมายอะไร การทำ router-on-a-stick จึงไม่ทำให้เกิด penalty อะไร เนื่องจาก setup ที่จะนำมาเสนอถูกทำขึ้นมาค่อนข้างนานแล้ว อาจจะจำถูกจำผิดบ้างก็ขออภัยล่วงหน้าครับ (ถ้าทำแล้วใช้ไม้ได้ลองเขียนมาถามได้เลยครับ)

อุปกรณที่ผมใช้

  • 2650XM Cisco Router
  • C2950T-24 Cisco Catalyst Switch

สมมุติว่าทั้งตัว router และตัว switch ยังไม่มี config อะไรเลยนะครับ

เริ่มด้วยการต่อสายตามรูป นำสายจาก ADSL Modem (ฝั่ง LAN) และจาก 2650XM FastEthernet interface มาต่อเข้าที่ Switch เท่านี้การต่อสายก็เสร็จสิ้น

Network Diagram

การ config ก็ง่ายๆเช่นกัน บนฝั่ง switch ก็ไม่ต้องทำอะไรมากแค่เปิด port ที่ใช้ด้วยคำสั่ง no shut

Switch> en
Switch# conf t
Switch(config)# int range fa0/1 - 3
Switch(config-if-range)# no shut
Switch(config-if-range)# int fa0/13
Switch(config-if)# no shut

ส่วนฝั่ง router ก็ง่ายๆเหมือนกัน เริ่มด้วยการคอนฟิก IP address ของ FastEthernet interface ก่อน IP address ที่ใช้เป็นแค่ตัวอย่างนะครับ ใช้อย่างอื่นก็ได้แต่ให้อยู่บน subnet เดียวกันก็พอ

Router> en
Router# conf t
Router(config)# int fa0/0
Router(config-if)# ip address 192.168.1.254 255.255.255.0
Router(config-if)# no shut
Router(dhcp-config)# default-router 192.168.1.154

เพิ่ม default route (สมมุติว่า LAN IP ของ ADSL Modem เป็น 192.168.1.1 และ 192.168.1.2)

Router(config)# ip route 0.0.0.0 0.0.0.0 192.168.1.1
Router(config)# ip route 0.0.0.0 0.0.0.0 192.168.1.2

ถ้าจะใช้ตัว 2650XM เป็น DHCP server ด้วยก็คอนฟิกซะ

Router> en
Router# conf t
Router(config)# ip dhcp excluded-address 192.168.1.1 192.168.1.9
Router(config)# ip dhcp excluded-address 192.168.1.21 192.168.1.254
Router(config)# ip dhcp pool LAN
Router(dhcp-config)# network 192.168.1.0 255.255.255.0
Router(dhcp-config)# default-router 192.168.1.254
Router(dhcp-config)# dns-server 8.8.8.8 8.8.4.4
Router(dhcp-config)# lease 30

การทำ load sharing บนเราเต้อร์แต่ละเครื่องอาจจะมีรายละเอียดปลีกย่อยต่างกันตามรุ่นและเวอร์ชั่นของ IOS ที่ใช้ เช่นบางรุ่นอาจจะสามารถเลือกประเภทของการทำ load sharing ได้ว่าจะเป็น per-packet หรือ per-destination ถ้าเป็น per-packet เราเต้อร์จะส่ง packet ผ่าน route ที่ต่างกัน (ถ้า metric เท่ากันก็จะเป็น equal-cost load sharing) สำหรับทุกๆ packet ที่ออกจาก router แต่ถ้าเป็น per-destination เราเต้อร์จะดู source และ destination address เพื่อที่จะตัดสินใจว่าจะส่ง packet ไป route ไหนโดยใช้ hashing algorithm ข้อดีของ per-destination load sharing คือโดยส่วนใหญ่แล้ว packet จะถูกส่งไปถึงปลายทาง in order/sequence (ส่งก่อนถึงก่อน) เพราะใช้ route เดียวกัน ในขณะที่ per-packet อาจจะทำให้ packet ถึง out of order/sequence (packet ถึงแบบไม่เรียงกัน) เพราะถูกส่งไปคนละเส้นทาง ส่วนข้อเสียของ per-destination คือ packet อาจจะไม่ได้ถูกส่งออกไปแบบ balance นัก (บางเส้นอาจจะได้ packet เยอะกว่า) เพราะเส้นทางที่ถูกส่งออกไปจะขึ้นอยู่กับ source กับ destination เท่านั้น ในขณะที่ per-packet จะส่ง packet ไปแต่ละเส้นเท่าๆกัน (ถ้า metric เท่ากัน) แต่การทำ per-packet จะกิน resource CPU มากเพราะเราเต้อร์จะต้องทำ lookup เพื่อดูว่า route ไหนถูกใช้น้อยกว่าเพื่อที่จะได้ส่ง packet ไปยัง route นั้น จากที่ได้ลองใช้ดูเหมือนเจ้าตัว 2650XM จะทำ per-packet load sharing ได้ไม่ดีนัก (น่าจะเป็นเพราะ resource ไม่พอ)

ถ้าใครอยากจะลองเปลี่ยนวิธี load sharing ก็ทำได้โดยใช้คำสั่ง ip load-sharing ที่ interface นั้นๆครับ

Rossak(config)# int fa0/0
Rossak(config-if)# ip load-sharing per-packet
Rossak(config-if)# ip load-sharing per-destination

เท่านี้ก็เรียบร้อยครับ เราสามารถที่จะดู routing table ได้


Rossak#show ip route
...
Gateway of last resort is 192.168.1.2 to network 0.0.0.0

C 192.168.1.0/24 is directly connected, FastEthernet0/0
S* 0.0.0.0/0 [1/0] via 192.168.1.2
[1/0] via 192.168.1.1

ลอง traceroute ไปหลายๆที่ดูเพื่อที่จะคอนเฟิร์มก็ได้ครับ


$ traceroute www.amazon.com
traceroute to www.amazon.com (72.21.194.1), 64 hops max, 52 byte packets
1 192.168.1.254 (192.168.1.254) 2.725 ms 1.895 ms 1.701 ms
2 192.168.1.2 (192.168.1.2) 1.384 ms 1.768 ms 1.395 ms
..


$ traceroute www.ebay.com
traceroute: Warning: www.ebay.com has multiple addresses; using 66.211.181.19
traceroute to hp-core.ebay.com (66.211.181.19), 64 hops max, 52 byte packets
1 192.168.1.254 (192.168.1.254) 2.143 ms 1.751 ms 1.651 ms
2 192.168.1.1 (192.168.1.1) 1.103 ms 0.991 ms 1.029 ms

..

ผู้อ่านอาจจะสังเกตุว่า packet จะวิ่งไปที่ 192.168.1.254 ก่อนที่จะวิ่งไปที่ ADSL router (192.168.1.1 และ 192.168.1.2) เพื่อจะออก Internet ต่อไป

คร่าวๆก็น่าจะเท่านี้ ถ้าใครอยากจะเอา wireless access point มาเพิ่มก็สามารถทำได้เช่นกันโดยต่อเข้าไปที่ switch ได้เลย (ไม่มีตัวอย่างให้เพราะยังไม่ได้ทำ) หวังว่าจะได้ความรู้แล้วเอาไปใช้จริงได้นะครับ (อาจจะเหมาะสำหรับคนที่อยากรวมสายสำหรับร้านอินเตอร์เนต) ถ้ามีคำถามอะไรก็ทิ้งคอมเม้นท์ไว้ได้หรือจะส่ง tweet มาที่ @kinochanon ก็ได้เหมือนกันครับ

9Feb/110

SEO Workshop

We had a chance to provide a workshop for our partner company today. It is considered the first workshop we organized since we started the company. We talked about Search Engine Optimization (SEO) with my partner, Charn, being the presenter and me being the support.

Today's agenda included:

  • Definition of SEM/SEO
  • Why SEO?
  • Who should be responsible for SEO?
  • When to do SEO?
  • How to do SEO for non-IT?
  • Hands-on exercises

The workshop spanned almost 5 hours. I hope everyone who attended enjoyed it and got something out of the workshop today! Pictures are included below..


The workshop started with an intensive presentation..
SEO Workkshop 1 - Presentation


follows by hands-on exercises...
SEO Workkshop 1 - Hands-on Exercise

SEO Workkshop 1 - Hands-on Exercise

SEO Workkshop 1 - Hands-on Exercise

9Feb/110

URL Shortening Service

เมื่อเช้าวันนี้เพิ่งจะได้ launch เว็ปสั้นไป ที่ทำเว็ปนี้ขึ้นมาจริงๆก็ทำเล่น ระหว่างนั่งทำโปรเจคต์บริษัทอยู่ก็รู้สึกว่าหัวมันไม่ค่อยแล่นเขียนโค้ดต่อไปไม่ค่อยได้เลยมานั่งกด twitter เล่นแล้วเห็นพวก URL shortener ต่างๆเลยแอบสงสัยขึ้นมาว่ามันทำงานอย่างไร หลังจาก research สั้นๆกับเขียนโค้ดไปอีกสองสามชั่วโมงก็ได้ออกมาเป็น prototype หยาบๆอันนึง ตกแต่งหน้าตาอีกนิด ก็ได้มาเป็น สั้น.com อย่างที่เห็นเนี่ยแหละครับ

จุดประสงค์ของพวก URL shortener ที่เห็นส่วนใหญ่ (เช่น bit.ly หรือ tiny.ly ) คือการที่จะสามารถเอาไปแชร์ให้กับผู้อื่นได้ง่ายครับ เพราะ dynamic URL ที่มีพวก query parameters  เดี๋ยวนี้จะค่อนข้างยาวทำให้เวลาเอาไปแชร์แล้วอาจจะดูไม่สวยงาม หรือถ้าเอาไปใส่บน twitter ก็จะทำให้เปลืองเนื้อที่เพราะ twitter อนุญาตให้ใช้แค่ 140 ตัวอักษรต่อ 1 ข้อความเท่านั้น การใช้เครื่องมือย่อ URL ทำให้ประหยัดพื้นที่เพื่อให้มีพื้นที่ไปเขียนอย่างอื่นเพิ่มเติมจาก URL ที่ต้องการแชร์ ลองยกตัวอย่างดู สมมุติว่าผมต้องการจะแชร์แผนที่วิธีการขับรถจากกรุงเทพไปเขาค้อ(เพชรบูรณ์)โดยใช้ google maps จะได้ URL ประมาณนี้

http://maps.google.com/maps?8%97%E0%B8%9E&daddr=%E0%B9%80%E0%B8%82%E0%B8%B2%E0%B8%84%E0%B9%89%E0%B8%AD&hl...

ซึ่งยาวมากและใส่เข้าไปใน twitter ไม่ได้แน่นอน (ลองใส่ดูแล้วเกินมา 244 ตัวอักษร) แต่พอใช้สั้น.comจะได้เป็น URL สั้นๆ

ttp://สั้น.com/hXxQkof

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

อย่างที่บอกว่าเว็ปนี้เป็น prototype เพราะฉนั้นคงมี bug อยู่และเนื่องจากผมไม่มี resource สำหรับ server ตัวเว็ปนี้อาจจะรับ load ได้ไม่มากเท่าไหร่ (ใครใคร่จะบริจาคก็ติดต่อมาได้นะครับ) ถ้ามีข้อผิดพลาดประการใดก็ขออภัยด้วยครับ แล้วช่วยส่งข้อมูล bug เพื่อที่ผมจะได้แก้ไขต่อไปได้ครับ

13Jan/110

Tuning Apache Memory

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

วันนี้มานั่งดูตัว web server เลยได้หาข้อมูลเกี่ยวกับ memory allocation ของ Xen กับ OpenVZ เพราะตอนนี้ใช้ VPS อยู่สองที่โดยที่นึงเป็น Xen และอีกที่นึงเป็น OpenVZ แล้วก็เลยถึงบางอ้อว่าทำไมเราถึงได้เจอ memory allocation error กับบลอกนี้บ่อยจัง (บลอกนี้รันบน server ที่ใช้ OpenVZ) จากที่อ่านมาข้อแตกต่างของ Xen กับ OpenVZ คือ OpenVZ จะให้จำนวนหน่วยความจำ "privvmpages" มาซึ่งจะเป็นจำนวนใกล้เคียงกับ RAM ที่ provider guarantees ให้เรา ปัญหามีอยู่ว่าเวลาโปรแกรมขอหน่วยความจำเพิ่ม (เรียก malloc()) รวมแล้วเกิน "privvmpages" malloc() จะ return NULL pointer ทำให้โปรแกรมที่รันอยู่ใช้งานไม่ได้ ในความเป็นจริงแล้วโปรแกรมอาจจะขอหน่วยความจำเกินจากที่จะใช้จริงดังนั้นการที่มีข้อจำกัดนี้ทำให้โปรแกรมบางตัวไม่สามารถใช้งานได้ สำหรับ Xen จะมีข้อแตกต่างตรงที่ว่าจำนวนหน่วยความจำที่ได้เป็นหน่วยความจำที่ได้จริงเหมือน dedicated server ซึ่งมีทั้ง physical memory และ swap ถ้าโปรแกรมขอหน่วยความจำมากกว่าที่มีอยู่ก็จะเกิดการ swap ขึ้น และเนื่องจากจำนวนหน่วยความจำที่ใช้จริงน้อยกว่าจำนวนที่ขอโปรแกรมจึงยังรันอยู่ได้ คร่าวๆก็ประมาณนี้แต่จริงๆแล้วมีรายละเอียดมากกว่านี้

แล้วก็มานั่งดูว่าจะแก้ยังไงเลยมานั่งดู top แล้วลองเปิด browser มาที่บลอกแล้วกด reload รัวๆดูเลยอ่อมันเป็นอย่างนี้นี่เอง เนื่องจากตั้ง MinSpareServer MaxSpareServers MaxClients ไว้เยอะเกินมันก็เลยกิน memory จนหมดเวลามีโหลดมากขึ้น เนื่องจากบลอกก็ไม่ค่อยได้มีใครเข้าอยู่แล้วเลยปรับแต่งให้เข้ากับการใช้งาน เอาตัวอย่าง apache2.conf มาให้ดูข้างล่างครับ (ผมใช้ prefork MPM)

StartServers 1
MinSpareServers 1
MaxSpareServers 5
MaxClients 50
MaxRequestsPerChild 5000

StartServers คือจำนวน process ตอน apache starts
MinSpareServers คือจำนวน idle servers ที่จะ run อยู่ตลอดเวลา
MaxSpareServers คือจำนวน maximum idle servers ที่จะ run อยู่ตลอดเวลา
MaxClients คือจำนวน maximum servers ที่จะเกิดขึ้นได้
MaxRequetsPerChild คือจำนวน requests ที่แต่ละ process จะตอบก่อนที่จะถูก kill ไป (process สามารถที่จะถูก kill ไปก่อนได้)

การกำหนด MinSpareServers กับ MaxSpareServers ทำให้มี server process idle อยู่ตลอดเวลา ทำให้พร้อมต่อการตอบรับ request โดยไม่ต้องเสียเวลาโหลด server ขึ้นมาใหม่ ค่าของ MaxClients จะเป็นตัวกำหนดว่า server จะรับได้กี่ request พร้อมกัน เนื่องจาก server process 1 ตัวจะสามารถตอบ request ได้แค่หนึ่ง request ในเวลานึง ถ้าตัวนี้เป็น 50 เหมือนข้างบนก็จะสามารถตอบ 50 requests ได้ในเวลาเดียวกัน แต่การที่มี MaxClients มากๆก็หมายความว่ากินพื้นที่หน่วยความจำมากขึ้นเหมือนกัน ถ้าเกิด process ขึ้นมาเยอะเกินหน่วยความจำก็จะหมดทำให้เกิดปัญหาข้างบนได้(ใน OpenVZ) วิธีปรับตรงนี้ให้ดูว่าเราต้องการจะให้หน่วยความจำสำหรับ web server สักเท่าไหร่แล้วหารด้วยขนาดของแต่ละ process (ใช้ top ดูเอาได้ว่าขนาดประมาณเท่าไหร่)

Parameter อีกตัวหนึ่งที่สำคัญเหมือนกันแต่ยังไม่ได้พูดถึงคือ KeepAliveTimeout ถ้าค่าตัวนี้สูงมาก server process ที่เกิดขึ้นมาก็จะไม่โดน kill ไปหลังจากตอบ request แล้วซึ่งอาจทำให้ไม่เหลือหน่วยความจำได้ถ้าตั้ง MaxClients สูงเกินไป

หลังจากปรับแล้วก็ยังไม่เจอปัญหาอีก (knocks on wood) พอดีคนไม่ค่อยเข้าอยู่แล้วก็เลยรอดตัวไป แต่ในตัว server อีกตัวที่กำลังตั้งค่าอยู่คงจะต้องมาดูกันอีกว่าจะปรับแต่งยังไง คงต้องไปดูกันตอนทำพวก load testing กับ fine-tuning

11Jan/111

Securing a Debian Box

วันนี้มานั่ง setup Linux เซิร์ฟเวอร์สำหรับโปรเจคใหม่ เลยเอาวิธีตั้งค่าความปลอดภัยต่างๆมาลงไว้เผื่อคราวหน้าจะได้ไม่ต้องไปเสียเวลาหาจากที่อื่น การตั้งค่านี้เป็นของ Debian (Lenny) นะครับถ้าใครใช้ distribution อื่นๆก็อาจจะมีรายละเอียดปลีกย่อยต่างกันเล็กน้อย เมื่อทำเสร็จจะได้เครื่องที่มีเฉพาะ service ต่างที่จำเป็น มี firewall ที่ block ทุกอย่างยกเว้นแต่ port ที่ต้องใช้ รวมถึง ssh service ที่ใช้ public key ในการ authenticate แทน password ปกติ

1. สร้าง user
2. เปลี่ยน root password
3. ปิด service ต่างๆที่ไม่ได้ใช้
4. ลง sudo
5. ตั่งค่า SSH
6. ตั้งค่า iptables

1. สร้าง user
ก่อนอื่นเราก็สร้าง user ขึ้นมาใหม่ก่อนจะได้ไม่ต้องใช้ root ตลอดเวลาเพื่อลดการสูญเสียจากความผิดพลาด

adduser username

2. เปลี่ยน root password

passwd

3. ปิด service ต่างๆที่ไม่ได้ใช้
พอดีลง OS เป็น minimum install อยู่แล้วเลยไม่มีอะไรต้องปิด หลักๆก็ให้ดู /etc/inetd.conf กับ /etc/rcX.d

4. ลง sudo

apt-get install sudo

ลงเสร็จแล้วก็ใช้ vi (หรือ editor อื่นๆ)แก้ /etc/sudoers

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

username ALL=(ALL)

โดยที่ username คือ user ที่จะใช้สิทธิ์ root ได้

5. ตั้งค่า SSH
5.1 ปิด root login
เปิดไฟล์ /etc/ssh/sshd_config หาบรรทัด PermitRootLogin yes แล้วเปลี่ยนเป็น PermitRootLogin no

5.2 ใช้ SSH version 2
เปิดไฟล์ /etc/ssh/sshd_config หาบรรทัด Protocol 2, 1 (ถ้ามี) แล้วเปลี่ยนเป็น Protocol 2

5.3 ใช้ public key authentication
5.3.1 สร้าง public/private key (ถ้ายังไม่มี)บนเครื่องลูกข่าย

ssh-keygen -t rsa

แล้วทำตามที่ prompt ที่ขึ้นมา และควรจะใส่ password ด้วยเพื่อเพิ่มความปลอดภัย

5.3.2 upload public key ไปที่ server
ใช้ scp หรือ sftp เพื่อ upload public key ที่เพิ่งสร้างขึ้นไปบน server

scp id_rsa.pub username@remotehost

แล้วเข้าไปที่ server เพื่อเพิ่มอนุญาตให้ key นี้ login ได้

mkdir ~/.ssh
chmod 700 ~/.ssh
cat id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

5.3.3 ตั้งค่าในไฟล์ /etc/ssh/sshd_config
เปิดไฟล์ /etc/ssh/sshd_config หาบรรทัด PasswordAuthentication yes แล้วเปลี่ยนเป็น PasswordAuthentication no
หาบรรทัด UserPAM yes แล้วเปลี่ยนเป็น UsePAM no

5.3.4 restart sshd
/etc/init.d/ssh restart
เป็นอันเสร็จเรียบร้อย ขอแนะนำว่าเพื่อที่จะทดสอบว่าตั้งค่าถูกหรือไม่อย่าปิด ssh session ที่ใช้อยู่ปัจจุบันแต่ให้เปิด session ใหม่(ใช้หน้าต่างอื่น)แทน เพราะถ้าตั้งค่าผิดอาจจะทำให้ ssh กลับมาที่เครื่องไม่ได้อีก ถ้าลองแล้ว ssh ไปที่ server ไม่ได้ให้ใช้ session ที่เปิดอยู่แล้วแก้ค่ากลับมาให้ใช้ password เหมือนเดิมแล้ว restart sshd อีกครั้ง

6. ตั้งค่า iptables
อันดับสุดท้ายเป็นการตั้งค่า firewall โดยใช้ iptables ก่อนอื่นก็สร้างไฟล์ขึ้นมาเพื่อเก็บ rules ต่างๆ ของผมเอาตัวอย่างมาจาก wiki.debian.org แล้วแก้ไขเอาอีกนิดหน่อย

vi /etc/iptables.test.rules

*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# Allows SSH connections for script kiddies
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access
# for everyone is really desired. Most likely you will only allow access from certain IPs.

# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls (access via 'dmesg' command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Reject all other inbound - default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

จากนั้นก็ activate มันซะ

iptables-restore < /etc/iptables.test.rules

list rules ดูว่าใช้ได้หรือไม่

iptables -L

ถ้าใช้ได้แล้วก็ save

iptables-save > /etc/iptables.up.rules

และสร้าง script เพื่อ load rules ขึ้นมาตอนบู๊ท

vi /etc/network/if-pre-up.d/iptables

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

ตั้ง permission ไฟล์เป็น executable

chmod +x /etc/network/if-pre-up.d/iptables

Reference
http://wiki.debian.org/iptables
http://www.howtoforge.com/set-up-ssh-with-public-key-authentication-debian-etch

เท่าที่พอจะนึกออกก็ประมาณนี้ครับ ถ้าใครมีคำแนะนำหรือคำถามอะไรก็มาคอมเมนท์ไว้ได้นะครับ

ป.ล. จะเห็นได้ว่าใน iptables rules ตัวอย่างได้พูดถึงการเปลี่ยน port sshd ถ้าต้องการจะเปลี่ยนให้ไปเปลี่ยนได้ที่ /etc/ssh/sshd_config ซึ่งจะทำให้ hack ได้ยากขึ้น(อีกนิดนึง)เพราะต้องหา port ให้เจอก่อน

19Dec/101

Hello World!

hello world! is probably the most famous line for one's first program for any language . I guess it would be appropriate for a title of my first blog post. This is going to be a space for me to write pretty much about anything to record my experience as well as document anything I do so that I could come back and take a look in case I need to later. The things I will write in this space will come from my work experience and personal experience including any hobby (photography for now) I may pursue in the future..  In any case, I please sit back, relax, and enjoy the show. Questions and comments are always welcomed!