วันศุกร์ที่ 8 กรกฎาคม พ.ศ. 2559

Deploy to Production Environment แบบประหยัด

ก่อนอื่น ขอบอกก่อนนะครับว่าบล็อกนี้ #สาระ #GeekAlert

เรื่องของเรื่องคือ มีโอกาสได้ไปวางระบบคอมให้กับคลินิก จึงเป็นที่มาของบล็อกนี้ คือจะเน้นเล่าประสบการณ์ ว่าการเอาระบบ IT เข้าไปใช่ในคลินิกที่ไม่ใหญ่มากเนี่ยมันเป็นยังไงนะครับ



.

.
.
.
.
เชิญบพพบกับบล็อกไร้สาระในท้องเรื่องงงงงงงง 

Deploy to Production Environment แบบประหยัด


เพื่อการโฆษณาแบบเปิดเผย กรุณาเยี่ยมชม Facebook page คลินิกหมอศุภโชค เท้า ข้อเท้า พิษณุโลก โทร 086-3433714 นี่ไม่ได้ค่าโฆษณาอะไรเลยนะ



คลินิกหมอศุภโชค เท้า ข้อเท้า พิษณุโลก โทร 086-3433714



OK ละ เข้าเรื่องของ Developer ดีกว่า ขอเริ่มจาก



Requirement

เรื่องนี้ไม่ใหม่ แต่ก็ไม่ง่าย สำหรับเรื่องความต้องการของระบบ ก็ตามมาตรฐานชายไทยหน้าตาดี ที่ระบบจะยึดหลัก CAP (Consistency, Availability, Partition tolerance) [1] คือ


  • Consistency ข้อมูลจะต้องถูกต้อง ตรงกันเสมอ
  • Availability ระบบต้องพร้อมใช้งานได้แทบจะตลอด (ภายใต้เงื่อนไขที่เป็นไปได้สูงสุด)
  • Partition tolerance ระบบจะต้องแยกกันทำงานได้อิสระ (ภายใต้เงื่อนไขที่เป็นไปได้สูงสุด)

ทีนี้เราได้หลักการละ ต่อมาสิ่งที่ต้องพิจารณาคือสภาพแวดล้อมจริง ก็ต้องมี Software ที่เอาไว้จัดการคลินิกนะครับ ไม่มีไม่ได้นะ ต้องเอาแบบที่ทำงานได้แบบไม่ Standalone ด้วยนะ ระบบจะได้มีความคล่องตัว ซึ่งก็บังเอิญมากๆ ที่มีโปรแกรมที่ชื่อว่า "Win Clinic" ที่นี่ เค้าทำมาได้ OK เลยนะ แยกตัว Database มาให้เสร็จ ก็สำเร็จไป 1 ละ

ต่อไปก็จะเป็น เรื่อง Hardware ละ อันนี้นี่เรื่องใหญ่ ใหญ่ระดับ ดาวพฤหัสเลยครับ มันคือ Database Server เพราะต้องเลือกว่าจะวาง Database Server ไว้ที่ไหนดี ระหว่าง บน Cloud หรือ บน Local เพราะแต่ละอย่างก็มีข้อดีข้อเสียต่างกันไปประมาณนี้


... Cloud Local
Consistency ไม่ต่างกัน ไม่ต่างกัน
Availability เน็ทไม่มี ก็จบ Server พังก็จบ
Partition tolerance ไม่ต่างกัน ไม่ต่างกัน

จะเห็นได้ว่า ถ้าเราเลือก Cloud ปัญหาเราจะขึ้นกับ Internet เป็นหลัก แต่ถ้าเราเลือก Local เราจะเจอปัญหาเรื่อง Maintenance แทน ซึ่งก็นะคำตอบมันชัดอยู่แล้ว ว่าถ้า 
Internet เสีย ก็แค่โทรเรียกมาก็แก้ได้ แต่ถ้า Database Server เสีย เรียกใครดี? ชัดนะ

สรุปว่า เลือก Cloud เพราะดูแลง่ายกว่าครับ (การตัดสินใจแบบมีอคติ)

แล้วพวกเครื่องที่เป็น Client ล่ะ? เอาแบบไหนดี Notebook ดีมั้ย, All in One PC ดีมั้ย หรือเอาพวก mini PC ดีล่ะ อันนี้ก็เน้นเรื่อง Maintenance เหมือนเดิม เลือก mini PC ที่เป็นแบบ Stick [2] [3] เพราะมันง่าย ง่ายทั้งเรื่องพังแล้วหาอะไรมาทดแทนได้ง่าย ดูแลง่าย เคลื่อนย้ายง่าย แล้วก็ไม่มีปัญหาเรื่องระบบ Network มากนัก เพราะมันมีระบบ Wireless ในตัวอยู่แล้ว และที่สำคัญมี Windows ลิขสิทธิ์ติดตั้งมาด้วยเรียบร้อยแล้ว


มาถึงตรงนี้ก็คิดว่าครบแล้วนะ ไม่น่าจะมีปัญหาอะไรมากมาย แต่ๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ ก็ต้องคิดเรื่อง Network ภายในก่อน เพราะถึงแม้ จะมี Wireless Modem Router ของ 3BB มาแล้ว แต่ถ้า Internet หายไป ก็... ใช้มือถือทำเป็น Hot Spot ใช้งานไปก่อน ก็รับได้นะ ไม่ซับซ้อน แล้วก็แก้ปัญหาได้ ที่เหลือก็จะเป็นเรื่องของ คลื่นความถี่ที่ 2.4GHz ละ อันนี้จะหนีไป 5GHz ก็ยังไม่ได้เพราะยังมีอุปกรณ์ที่วิ่งได้บน 2.4GHz เท่านั้นอยู่ ซึ่งก็ดันโชคดีที่ตึกเราเมพ 

"คลื่นในไม่ให้ออก คลื่นนอกไม่ให้เข้า" Yes!



Implementation

ต่อมาก็ลงมือทำ เราเริ่มต้นที่ Internet ก่อน จากการสำรวจและมโนเอา พบว่า ในแถบพิษณุโลก เราเลือก 3BB เพราะเมพสุดละ ถึงราคาจะไม่ถูกสุด และมีระบบ Internet Backup คือ DTAC 4G หรือ TRUEMOVE H 4G แล้วแต่กรณี


เราโชคดีที่เรามี Database Server พร้อมใช้อยู่แล้ว เป็น MySQL นะ เพราะโปรแกรม Win Clinic เค้าใช้ MySQL อันนี้เลือกไม่ได้ เพราะฉะนั้นก็เบาแรงในส่วนนี้ไปได้ เอาไฟล์ SQL ที่เค้าเตรียมให้มา Import เข้าไปก็พร้อมใช้งานได้เลย

ต่อมาก็จัดการ Install โปรแกรมจนครบก็ใช้งานได้
.
.
.
ตู้มมมมมมมมมมมมมมมมมมมมมมม
.
.
.
ทำไมโปรแกรมมันช้าจัง ก็นะเอา .Net3.5 เขียนมันก็คงเร็วได้ประมาณนี้ บวกกับ ตัว CPU ของเรามันก็แค่ Atom ตัวน้อยๆ จริงๆแล้วมันก็ช้าแค่โหลดครั้งแรกนี่แหละ หลังจากนี้ก็ไม่ใช้ละนะ












แล้วไงต่อ?


ก็เสร็จแล้วนี่นา เปิดคลินิกได้แล้ว เย่!




สรุปค่าใช้จ่าย

เน็ท เดือนละ 631 กับแรกเข้า 3500 เป็น 4200 ละกัน
คอม Intel Compute stick อันละ 5500 ซื้อเอง 1 ได้มาฟรี 1 อัน เป็น 5500
จอคอม 9900 + 4500 = 14400 
เม้าส์ กับคีบอร์ด ฟรี เพราะใช้ของเก่า


รวมเป็น 4200 + 5500 + 14400 = 24100

ก็แอบแพงนะ แต่ก็ถือได้ว่าไม่แพง งงมั้ย


----------------------- ตัดจบ -----------------------

 
อ้างอิง

[1] https://en.wikipedia.org/wiki/CAP_theorem
[2] http://www.thailand.intel.com/buy/th/th/product/desktop/intel-stk1aw32sc-507158
[3] http://www.thailand.intel.com/buy/th/th/product/desktop/intel-boxstck1a32wfc-472459

วันศุกร์ที่ 30 ตุลาคม พ.ศ. 2558

ชิวๆกับ MySQL query performance experiment (มีสาระ)

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

ขั้นตอนก็คือ
สร้างฐานข้อมูลชุดทดสอบ table t โดยมี 2 field คือ a และ b ทั้งคู่ให้เป็น interger ก่อน
แล้วก็ใส่ข้อมูล โดยสุมเลขจำนวนเต็ม 0-9 ลงไป ซัก 100,000,000 records (ร้อยล้าน)
แล้วลอง query ข้อมูลออกมา แบบง่ายๆ คือ

#A2
select a,b,a*b as c
from t
where a between 1 and 3 and b between 1 and 3
order by c

#B2
select a,b,a*b as c
from
(select * from t where a between 1 and 3 and b between 1 and 3) as t
order by c
โดยหลักการแล้วทั้ง 2 query นี้ไม่ต่างกัน เพราะตัว Database จะไปหา record ออกมาก่อน แล้วค่อยมาทำ select แต่นั่นคือหลักการ แต่ของจริงคือเราใช้งาน MySQL อยู่ กระบวนการข้างในอาจจะมีอะไรที่ทำให้ประสิทธิภาพแตกต่างกันอย่างมีนัยสำคัญก็ได้

ก่อนที่จะดูผลต้องบอก Environment ก่อน นั่นคือ เตรียม System ได้ 2 System คือ

  1. Macbook pro late 2013
    CPU 2.4 GHz Intel Core i5
    RAM 8 GB 1600 MHz DDR3
    MySQL 5.5.42
  2. Server ตัวถูกสุดของ digital ocean
    CPU 1 Core
    RAM 512 MB
    MySQL 5.5.46



และนอกจากนี้ ยังเพิ่ม query อีก 6 ชุด เพื่อเปรียบเทียบว่าถ้า record ผลลัพท์มากขึ้นประสิทธิภาพจะเป็นอย่างไร ด้วยการเปลี่ยนจากช่วง 1-3 เป็น 1-2, 1-6 และ 1-8 จะได้ sql ดังต่อไปนี้


#A1
select a,b,a*b as c
from t
where a between 1 and 2 and b between 1 and 2
order by c

#B1
select a,b,a*b as c
from
(select * from t where a between 1 and 2 and b between 1 and 2) as t
order by c

#A2
select a,b,a*b as c
from t
where a between 1 and 3 and b between 1 and 3
order by c

#B2
select a,b,a*b as c
from
(select * from t where a between 1 and 3 and b between 1 and 3) as t
order by c

#A3
select a,b,a*b as c
from t
where a between 1 and 6 and b between 1 and 6
order by c

#B3


select a,b,a*b as c
from
(select * from t where a between 1 and 6 and b between 1 and 6) as t
order by c

#A4
select a,b,a*b as c
from t
where a between 1 and 8 and b between 1 and 8
order by c

#B4
select a,b,a*b as c
from
(select * from t where a between 1 and 8 and b between 1 and 8) as t
order by c


ผลการทดสอบขอลงเฉพาะผลที่ได้จาก MBP เท่านั้น เนื่องจากเครื่องของ Digital ocean ไม่รู้สเป็คที่แน่นอน (ผลออกมาในทิศทางเดียวกัน แต่ของ Digital ocean ดีกว่า น่าจะเพราะ CPU แรงกว่า)


QueryRecord(s) #A #B
1 (1-2)3,997,33434.711s31.767s
2 (1-3)8,999,41137.820s36.361s
3 (1-6)36,020,16263.060s63.941s
4 (1-8)63,021,05181.483s96.416s

#A ทำ query แบบธรรมดา
#B ทำ query แบบ sub-query

จากผลที่เห็น ก็พอบอกได้ว่า ที่จำนวนผลลัพท์เท่ากันเวลาที่ใช้จะต่างกันมากขึ้นตามจำนวนผลลัพท์
แต่ยังไม่สามารถสรุปได้ว่า ระหว่าง แบบธรรมดา กับ แบบ sub-query อย่างไหนจะดีกว่ากัน อาจจะต้องใช้ Data มากกว่านี้

เพิ่มเติม
SQL ที่เอาไว้ Gen data
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `mockdata`()
BEGIN
set @insert_query = CONCAT('INSERT INTO t(a,b) VALUES (floor(rand() * 10),floor(rand() * 10))');
set @ia = 0;
while @ia <= 10000 do
set @insert_query = CONCAT(@insert_query, ',(floor(rand() * 10),floor(rand() * 10))');
set @ia = @ia + 1;
end while;
prepare stmt FROM @insert_query;
set @ib = 0;
while  @ib < 10000 do
execute stmt;
set @ib = @ib + 1;
end while;
END$$
DELIMITER ;

วันศุกร์ที่ 31 กรกฎาคม พ.ศ. 2558

Review Micro SD card 32GB Transcend Ultimate UHS-I U3 @ 95/85

ก็กลับมาอีกแล้วนะครับ กับ Hardware Review รอบนี้ เป็น Micro SD card ยี่ห้อ Transcend ความจุ 32GB ในรุ่น Ultimate 633x ตัวการ์ดใช้มาตรฐาน UHS U3 เครมความเร็วในการอ่านข้อมูลสูงสุดไว้ที่ 95 MB/s และความเร็วในการเขียนข้อมูลสูงสุดไว้ที่ 85 MB/s

O_o
ไม่ผิดครับ อ่าน 95 เขียน 85

หน้าตาแพ็กเกจ เป็นแบบนี้ครับ


ก่อนที่จะเข้าเรื่อง Review ขออธิบายก่อนว่า มาตรฐาน UHS นี่มันคืออะไร

Speed Class

ก็ต้องท้าวความกันก่อนว่า เรื่องความเร็วของ SD Card นี่มันมีความเป็นมาอย่างไรนะ
โดยปกติความเร็วของ SD Card จะถูกกำหนดเป็น Class เช่น Class 2, 4, 6 หรือ 10 ซึ่งตัวเลขที่เห็น จะเป็นความเร็วการเขียนข้อมูล การันตีขั้นต่ำตามตัวเลข เช่น SD Card Class 2 จะมีความเร็วการเขียนข้อมูลขั้นต่ำแน่ๆ ที่ 2 MB/s (Megabytes per second)


Big and More Big Content

ในปัจจุบันเรามาถึงจุดที่ ไฟล์รูปภาพ 1 ภาพ อาจจะมีขนาดถึง 20 MB ซึ่งถ้าเรายังใช้ SD Card Class 2 เราจะต้องใช้เวลารอบันทึกข้อมูลถึง 10 วินาที คงไม่สนุกนักถ้าต้องถ่ายภาพ 1 ภาพ แล้วต้องรอไป 10 วินาที จึงจะ ถ่ายรูปต่อไปได้ แล้วลองนึกภาพถึงการบันทึกวีดีโอ 4K ว่าไม่มีทางทำได้แน่นอน

Big Content Need Faster Speed

ด้วยเหตุผลข้างต้น ทางกลุ่มที่ดูแลมามาตรฐาน SD Card จึงได้ออกมาตรฐานความเร็วใหม่ในชื่อว่า UHS (Ultra High Speed) ณ ปัจจุบัน ก็มี U1 และ U3 ซึ่ง U1 นี่มีความเร็วขั้นต่ำที่ 10 MB/s ส่วน U3 มีความเร็วขั้นต่ำที่ 30 MB/s นั่นเอง



เอาละเรื่องมาตรฐานก็ประมาณนี้ เลขยิ่งมายิ่งไว เข้าใจง่ายๆ กลับมาที่ ตัว Review ดีกว่า

Great Performance come with Little Body

ก็อย่างที่บอกว่า เจ้า Micro SD Card ตัวนี้ ทำความเร็วในการอ่านข้อมูลสูงสุดไว้ที่ 95 MB/s และความเร็วในการเขียนข้อมูลสูงสุดไว้ที่ 85 MB/s เรียกได้ว่าเป็นตัวเลขที่สูงงงงงงงงงงงงงมากเลยทีเดียว

ก่อนที่จะดูเรื่องประสิทธิภาพ เรามาดูหน้าตากันก่อน ว่าหน้าตาเป็นยังไงนะ จิ๋วแต่แจ๋ว สุดติ่งกระดิ่งแมวกันเลยทีเดียว


Performance Test
ในการทดสอบจะแบ่งเป็น

  1. ทดสอบกับ Card Reader ติดตัว Macbook Pro Retina 2013 Late 2013
  2. ทดสอบกับ Card Reader ติดตัว Dell Inspiron 5448, Early 2015
  3. ทดสอบกับ Card Reader Transcend USB3 บน Dell Inspiron 5448, Early 2015



ทดสอบกับ Card Reader ติดตัว Macbook Pro Retina 2013 Late 2013



ทดสอบกับ Card Reader ติดตัว Dell Inspiron 5448, Early 2015




ทดสอบกับ Card Reader Transcend TS-RDF8K USB3 บน Dell Inspiron 5448, Early 2015






สรุปผล

จากผลที่ออกมาจะเห็นได้ว่า ความเร็วมันสุดติ่งกันเลยมีเดียว ทำได้ตามสเป็คที่เครมไว้เลย ทั้งบน Mac และ Windows ก็เหมาะกับการที่จะเอาไปใช้งานกับงานที่ต้องการความเร็วสูงอย่างพวก Video 4K ประมาณนั้น




ข้อมูลเพิ่มเติม
https://www.sdcard.org/developers/overview/speed_class/

วันอาทิตย์ที่ 12 กรกฎาคม พ.ศ. 2558

ลอง NoSQL ง่ายๆ กับ IBM Cloudant (มีสาระ)

สวัสดีครับ ก็กลับมาอีกแล้วกับ Blog สาระเน้นๆ รอบนี้จะนำเสนอในท้องเรื่อง ลอง NoSQL ง่ายๆ กับ IBM Cloudant ติดตามรับชมได้เลยครับ

เรื่องของเรื่องมันมีอยู่ว่า เมื่อวันที่ 13-14 มิถุนายน 2558 ที่ผ่านมาได้มีโอกาศมีเข้างาน AngelHack Bangkok 2015 พอดีในงานมี Engineer จาก IBM มาแนะนำ Cloud ของ IBM ที่ชื่อว่า IBM Bluemix จากที่ฟังมาก็เข้าใจได้ทันทีเลยว่า IBM ตั้งใจทำโปรดักตัวนี้มาก ตอนที่เค้า Mini Workshop ให้ ก็พบว่าระบบเค้าก็เข้าใจได้ง่ายดี แล้วตัว Platform ก็สมบูรณ์ในระดับที่ใช้งานได้เต็มรูปแบบเลยทีเดียว




Bluemix คืออะไร

Bluemix ก็คือ Cloud Platform ตัวหนึ่งของ IBM ที่มีทั้งส่วนที่เป็น IaaS, PaaS และ SaaS ลักษณะเดียวกับ AWS: Amazon Web Service ของ Amazon หรือ Azure ของ Microsoft นั่นเอง แต่อาจจะยังเทียบกับเจ้าตลาดในตอนนี้ไม่ได้ เพราะว่าตัว Server พึ่งมีแค่ 2 โซน คือ อเมริกาและยุโรป (เราอยู่เอเซียก็มองตาปริบๆ ไกลเกิน) เอาน่า ไม่เป็นไร เดี๋ยวเค้าก็ต้องขยายมาเอง ไม่งั้นไม่มีคนใช้แน่นอน

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

ก็พอดีว่า ตอนนี้เทรนเรื่อง Big Data เนี่ยมาแล้ว แล้วพวก SQL ที่ใช้กันอยู่ทุกวันนี้ Performance มันไม่ไหวกับข้อมูลขนาดนั้น เค้าก็เลยคิดค้น NoSQL ขึ้นมา โดยเน้นไปที่เรื่อง Performance กับ Unstructured Data แล้ว.......... เอาไงล่ะทีนี้ ก็ตอนใช้ SQL เราก็จะคุ้นๆกับคำสั่ง SELECT FROM WHERE แล้วถ้าเป็น NoSQL ล่ะมันเป็นยังไง




NoSQL VS SQL

เรามาดูคำจำกัดความของ NoSQL กันก่อน
NoSQL นั้น คือ Not Only SQL มันหมายถึงเมื่อเราทำการออกแบบระบบใดๆ ขึ้นมาก็ตาม ให้จำไว้ว่า รูปแบบการจัดเก็บข้อมูลนั้นมีมากกว่าหนึ่งแบบ ดังนั้น ต้องเลือกวิธีการให้เหมาะสมกับความต้องการ
ขอยกข้อความนี้มาจาก http://www.somkiat.cc/note-overview-nosql-database/

ก็คือ NoSQL ถูกออกแบบมาเพื่อ เก็บข้อมูลที่มีรูปแบบหลากหลาย และปริมาณมาก เพื่อให้เราโฟกัสไปที่การสนใจว่าจะเก็บข้อมูลอะไรดี มากกว่าจะเสียเวลาโฟกัสตรงที่ว่า เราควรจะเก็บข้อมูลอย่างไรดี ถ้าจะเอาให้ชัดๆก็คือ ถ้าเราพูดเรื่อง NoSQL vs SQL ก็หมายถึง Schema-less vs Schema นั่นเอง ..... อย่าพึ่งงงนะ

ทีนี้ในการนำไปใช้งาน เจ้า NoSQL นี่ก็มีคนทำหลายเจ้ามาก ที่ดังๆก็คือ MongoDB, Hadoop และอีกหลายๆตัว




Schema-less !== NonType

อันนี้ไม่ขออธิบายนะครับ น่าจะเข้าใจกันดี
ถึงแม้ว่าโครงสร้างการเก็บข้อมูลของ NoSQL จะไม่ใช้เรื่องสำคัญ แต่กับเรื่องชนิดมันสำคัญนะ

ชนิดการเก็บข้อมูลของ NoSQL มันก็มีเป็นแบบหลักๆอยู่ตามนี้


  • Column
  • Document
  • Key-value
  • Graph
  • Multi-model

เอาละ เกริ่นมาระดับนี้แล้วก็น่าจะพอมองออกละนะว่า NoSQL มันเป็นยังไง (มาถึงตรงนี้ถ้าไม่เข้าใจ ก็บังคับเข้าใจนะ!) กลับมาเข้าเรื่องหลักดีกว่า





ลอง NoSQL ง่ายๆ กับ IBM Cloudant

IBM Cloudant
เจ้า Cloudant เนี่ยมันเก็บข้อมูลในลักษณะ Document ถ้าถามว่าการเก็บข้อมูลในลักษณะ Document มันเป็นยังไง ก็ให้นึกถึง JSON อ่ะ แบบนั้นแหละ

แล้วทำไมต้อง Cloudant ล่ะ ก็มันฟรีระดับหนึ่งครับ แถมยังไม่ต้องเซ็ทอะไรให้วุ่นวายด้วยนะ


Let's Play

ต่อไปนี้จะเป็น How To แบบง่ายๆนะ

สิ่งที่ต้องเตรียม


  • JAVA SDK
  • Eclipse
  • IBM Bluemix Account
  • Cloudant libs
  • ความพยายาม
  • ความตั้งใจ



ขั้นแรก

ก็เตรียมตัว จัดการ Eclipse ให้รัน Java ได้ ก็เป็นอันจบ


ขั้นสอง

โหลด Cloudant libs มาซะ เอาเอาไปใส่ใน Project บน Eclipse จะด้วยวิธีการใดก็แล้วแต่ เอาให้ใช้ได้ก็แล้วกัน


ขั้นสาม

ติต่างว่ามี IBM Bluemix Account แล้วนะ ถ้าไม่มีก็สมัครนะ ฟรี

เข้าไปที่ Dashboard ของ Bluemix นะ แล้ว แล้วสังเกตุที่เมนูด้านบน จะเห็นคำว่า CATALOG คลิ๊กเข้าไปเลย


จากนั้นก็จะมีทั้ง Service ทั้ง Application ขึ้นมาให้เลือก อันนี้ให้เราหา หัวข้อ Data Management แล้วเลือก Cloudant NoSQL DB


จากนั้นเราจะต้องตั้งชื่อให้กับ Service นะ ก็ตั้งไป เสร็จแล้วก็กด CREATE แล้วรอแปปนึง


พอระบบสร้าง Service เสร็จ ระบบจะพาเราไปที่ Dashboard ของ Cloudant ให้เราสังเกตุที่เมนูด้านบนจะมีช่องให้สร้าง Database ใหม่ได้ ในที่นี้ให้ใส่ ว่า Test ก่อนนะ จะได้ตรงกัน


รอแปปนึง ระบบจะสร้าง Database เสร็จ ให้คลิ๊กที่ชื่อ Database ที่พึ่งสร้าง แล้วไปที่หัวข้อ Permission เพื่อที่เราจะได้สร้าง Key ให้ใช้ตัว Database ผ่าน API ได้


ก็ให้ Gen Key ขึ้นมานะ ตรงนี้อย่าลืมจดเอาไวนะ เพราะมันจะแสดง password แค่ตรงนี้ ถ้าเรา refresh หน้านี้ มันจะไม่แสดง password แล้ว ในภาพคือตัวอย่างเวลาที่แสดง password พอได้ password แล้วอย่าลืม เปิดสิทธิ์ด้วยล่ะ


ต่อมาให้เข้าไปที่หน้า ACCOUNT ทางเมนูด้านซ้าย จด Account Name มานะ ต้องใช้


ทีนี้ทางฝั่ง Server ก็พร้อมแล้ว ต่อมาเรามาต่อกันที่ฝั่ง Client ก็สร้างโปรเจ็คขึ้นมา 1 โปรเจ็คนะ เป็น Java Console ธรรมดานี่แหละ จัดการ Import Libs ให้พร้อมแล้วก็มาลองกันเลย

ก็เหมือนกับการใช้งานพวก Database ตามปกติ ก็คือสร้าง Connection ขึ้นมา
CloudantClient client = new CloudantClient(API.CLOUDANT_ACCOUNT,API.CLOUDANT_KEY,API.CLOUDANT_PASSWORD);
System.out.println("Connected to Cloudant");
System.out.println("Server Version: " + client.serverVersion());
สังเกตุ Constructor CloudantClient() ที่รับพารามิเตอร์ 3 ตัว ตัวที่หนึ่ง คือ Account ที่เราได้มาจาก Account Name ส่วนตัวที่สองคือ Key ที่เราได้มาจากการ Generate และตัวที่สามคือ Password ที่ได้มาจากการ Generate เช่นกัน

ถ้าโค้ดที่รันผ่าน น่าจะแสดงผลแบบนี้ได้
Connected to Cloudant
Server Version: 1.0.2


เอาละ ต่อมาเราจะลอง Insert ข้อมูลเข้าไปใน Database กันนะ
ขั้นแรกให้สร้าง Class ขึ้นมาซัก 1 Class แล้วให้มี Attribute ซัก 2 ตัว เอาเป็นตามนี้นะ
public class Person{
private String firstname;
private String lastname;
        // set/get
}


แล้วกลับไปที่ โค้ดชุดแรก แล้วสร้าง Person Instance ขึ้นมา
Person person= new Person();
person.setFirstname("Bill");
person.setLastname("Jobs");


ต่อมา ก็สั่งให้ client ติดต่อกับ Database ที่เราสร้างไว้ ผ่าน Method database()
Database db = client.database(API.CLOUDANT_DATABASE_NAME, false);


Method database() จะรับพารามิเตอร์ 2 ตัว ตัวแรกคือชื่อ Database ที่เราสร้างไว้ ก็ใส่ไปนะ ส่วนตัวที่สอง อย่างพึ่งสนใจ ใส่ False ไปก่อน
ตรงนี้ Method database() จะคืน Database Instance กลับมาให้ ต่อไปเวลาเราจะทำอะไรกับ Database นี้ก็ใช้งานผ่าน Instance ตัวนี้ได้เลย

ขั้นต่อมา เราจะลองใส่ข้อมูลไปใน Database จริงๆแล้วนะ ด้วยคำสั่ง
Response lastInserted = db.save(person);


ตรงนี้เราเรียก Method save() ผ่าน Database Instance แล้ว Method save จะคืน Response Instance มาให้ ซึ่งจะมี ID ของข้อมูลที่เราสั่ง save ไป ให้เราเก็บตัว ID นี้ไว้
ตรงนี้หลังจากที่เราสั่ง save ไปแล้ว ถ้าเรากลับไปดูใน Dashboard เราก็จะเห็นข้อมูลนี้ไปปรากฎอยู่ด้วย

ต่อมาเราจะลองเรียก ข้อมูลที่เราพึ่งจะบันทึกไปด้วย Method find()
Person p = db.find(Person.class, lastInserted.getId());


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






เย่ เห็นมั้ย ไม่ยากเลย

ก็จบแล้วสำหรับ Blog นี้ จะเห็นได้ว่าไม่ยากเลย NoSQL เนี่ย แต่ยังไงก็อย่าลืมว่า ไอ้ที่อยู่ใน Blog นี่เนี่ย มันแค่ระดับ Starter เท่านั้น จริงๆแล้วยังมีอะไรให้เล่นอีกมากมาย อย่างที่ยกมาเขียนนี่คือในส่วนที่ใช้งานผ่าน Lib ของ JAVA แต่ถ้าจะทำผ่าน PHP ก็จะต้องใช้ผ่าน curl แทน ก็ถือว่าการใช้งานก็ยืดหยุ่นและง่ายพอสมควรดี แต่จะอย่างไนก็แล้วแต่ ยังก็ต้องฝึกฝน ฝึกใช้กันต่อไป อย่าหวั่นไหว แม้วันที่ไม่เป็นใจ

และที่สำคัญคือ



สวัสดี




อ้างอิง
http://www.somkiat.cc/note-overview-nosql-database/
https://console.ng.bluemix.net/home/
https://docs.cloudant.com/libraries.html#java
https://github.com/cloudant/java-cloudant
http://nuuneoi.com/blog/blog.php?read_id=831

วันพฤหัสบดีที่ 25 มิถุนายน พ.ศ. 2558

บอกลาปัญหารถสุดที่รัก ด้วย Drivebot โครงการ Startup ไทยที่ไปไกลระดับโลก

บอกลาปัญหารถสุดที่รัก ด้วย Drivebot โครงการ Startup ไทยที่ไปไกลระดับโลก


ก็กลับมาอีกครับกับการเขียน Blog ที่พยายามจะให้มีสาระ เท่าที่จะมากได้ ที่มาที่ไปของ Blog นี้ก็คือ เมื่อวันหนึ่งนานมาแล้ว อ่านข่าวเว็บ Blognone แล้วไปเห็นข่าวนี้ "Drivebot อุปกรณ์ช่วยดูแลรถยนต์ผ่านสมาร์ทโฟน เปิดโครงการระดมทุนกับ Indiegogo แล้ว" ก็เลยตามเข้าไปดูที่โครงการ พบว่า โครงการนี้ได้ผ่านโครงการ Dtac Accelrate #2 มา ซึ่งเราก็เห็นว่า โครงการแต่ละโครงการที่ผ่าน Dtac Accelrate มาได้นี่ไม่ธรรมดา คุณภาพคับแก้วมากๆ จากที่อ่านคุณสมบัติกับภาพในโครงการ ตอนแรกก็ "เอ่อ ดีนะ" แต่พอได้ดูวีดีโอที่เค้าทำมา โอ้พระเจ้า มันใช่เลย ใช่มากๆ กดซื้อทันทีไม่คิดเลย

ในวีดีโอก็ทำมาได้ดีเข้าใจง่ายเลยว่ามันทำอะไรได้บ้าง ช่วยอะไรเราได้บ้าง
หลักๆที่เจ้า Drivebot ทำก็คือ

  • แจ้งเตือนสถานะของรถ
  • Log การเดินทางในรูปแบบระยะทาง/การใช้พลังงาน


มาว่ากันที่ตัว Drivebot ก่อน

Drivebot และ Application บน iOS

ตัว Drivebot จะทำงานด้วยการเชื่อมต่อกับพอร์ท OBD-II แล้วสื่อสารกับ Application บนมือถือเราผ่าน Bluetooth โดยที่ตัว Drivebot มีหน่วยความจำในตัว ทำให้ ไม่จำเป็นต้องทำงานคู่กับโทรศัพท์ตลอดเวลา ง่ายๆก็คือ

  1. เอาเจ้า Drivebot ไปต่อกับรถ
  2. เซ็ทการใช้งานครั้งแรก
  3. เสร็จแล้ว !

เวลาใช้งานก็คือขับรถไป ปล่อยให้ Drivebot ทำงานไป เปิด Bluetooth ที่มือถือทิ้งไว้ แล้วเดี๋ยวมันจะ sync ข้อมูลกันเอง อยากดูข้อมูลก็เปิด Application ขึ้นมาดู ง่ายดีนะ ไม่ต้องอะไรกับมันมาก


Drivebot Application on iOS

ในส่วนนี้ขอเขียนเท่าที่ใช้ก่อนนะครับ เพราะยังใช้ความสามารถไม่ครบเลย

หน้าจอหลัก
ครั้งแรกที่ใช้งานก็งงๆ หน่อย ว่าเราจะดูข้อมูลรถเรายังไงหว่า มีแบบ Realtime ให้ดูมั้ย กดๆอยู่ซักพัก ก็ไม่มีอะไรขึ้นมา ก็เลยตีความว่า คงต้องรอให้ตัว Drivebot เก็บข้อมูลซักหน่อยถึงจะแสดงอะไรออกมาได้ อ่ะจัดให้ ก็ปล่อยให้มันเก็บข้อมูลไปซัก 1 สัปดาห์ ก็ลองมาเป็น Application ดู โอ้ยข้อมูลขึ้นมาแล้ววววววววววว






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

นอกจากนี้มันยังเก็บ Log การขับรถของเราไว้ให้ด้วยนะ หน้าตาแบบนี้

ซึ่งข้อมูล Log เนี่ย สามารถ Export ออกมาได้ด้วย เผื่อว่าจะเอาไปทำสถิติหรืออะไรก็ว่าไป



Drivebot แหล่มมั้ย

ก็ถือว่าชอบเลยนะ ถ้ามันเตือนเราก่อนที่ปัญหามันจะใหญ่โต เพราะเราก็คงไม่ได้ไป Monitor มันแบบ Realtime ขนาดนั้น ก็ถือว่า Drivebot นี่ตอบโจทย์ได้ดีเลย

แต่ก็ยังมีหลาย Feature ที่เรารู้สึกว่าถ้ามีเนี่ยจะแจ่มมาก อย่างเช่นถ้าสามารถ ดู Log ต่างๆบนเว็บได้ก็น่าจะดี



ข้อมูลเพิ่มเติม
http://drivebot.io/
http://blog.drivebot.io/post/109187824422/the-drivebot-device-sample-from-our-manufacturer?utm_content=bufferf40a7&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer
https://www.facebook.com/drivebotio
https://www.indiegogo.com/projects/drivebot-a-fitbit-for-your-car#/story
https://www.blognone.com/node/61881

วันศุกร์ที่ 22 พฤษภาคม พ.ศ. 2558

ทำให้ Gradle บน Android Studio ทำงานได้เร็วขึ้นกว่าเดิม ด้วย Gradle 2.4



Gradle มันช้า

เอาละ หลายคนน่าจะเจอปัญหาแบบเดียวกันเวลาใช้ Android Studio ทำงาน ว่าทำไมมัน Build ได้ช้าจัง ถึงแม้ว่าจะเปิดใช้ Deamon และ Parallel แล้วก็ตาม



ทำยังไงดีล่ะ 

จริงๆแล้วที่ทำได้เองเลยก็คือ ขั้นตอนมาตรฐานที่ทำกันตอนนี้ก็คือ เปิดใช้ Deamon และ Parallel ตามรูปนี้
เปิดใช้ Deamon และ Parallel


แต่ถึงจะเปิดใช้แล้วมันก็เร็วขึ้นมานิดนึง แต่ถ้าจะเอามากกว่านี้ล่ะ

จริงๆแล้ว คงเหลือแต่วิธีที่ต้องไปบอกคนที่ทำ Gradle ว่า "ช่วยทำให้มันเร็วกว่านี้ได้มั้ย" ซึ่งคนทำก็จะบอกว่า "ทำอยู่ และจะทำต่อไป" (คุ้นๆนะประโยคนี้) จึงได้มาเป็น Gradle 2.4 ที่เค้าเครมมาว่าเวลาที่ใช้ Build เร็วขึ้นกว่าเดิม 20% ถึง 40% เลยทีเดียว [1] ส่วนเรื่องอื่นๆที่ปรับปรุงไปอ่านใน Release Notes เอานะ


ของใหม่ออกมา แล้วยังไงต่อ

ก็เอามาใช้สิครับ รออะไรอยู่
"แล้วทำยังไง"
OK มีขึ้นตอนนิดหน่อยที่จะทำให้ Android Studio เปลี่ยนมาใช้ Gradle 2.4 ตามนี้เลย

ขั้นแรกให้ดาวน์โหลด Gradle 2.4 มาก่อนเลย แล้วจะได้ ไฟล์ zip มา จากนั้นก็แตกไฟล์ zip นี้ แล้วเอาไปไว้ในที่ที่ถูกต้อง ก็คือถ้าติดตั้ง Android Studio บน Mac ตามปกติ ก็จะอยู่ที่
Applications/Andriod Studio.app/Contents/gradle



ตามรูปที่เห็นจะมี Gradle 2.2.1 อยู่ก่อนแล้ว เอาไว้ด้วยกันเลย ไม่ผิดที่แน่นอน ส่วนใครที่ใช้ Windows ตัว Gradle ก็น่าจะอยู่ ภายใต้ Android Studio เหมือนกันนะ ลองดู

จากนั้นเราก็จะมาเซ็ทให้ตัว Android Studio ใช้งาน Gradle 2.4 ละนะ
เริ่มจาก เปิด Android Studio ขึ้นมา แล้วเข้าไปที่ 
Preferences -> Build, Execute, Deployment -> Build Tools -> Gradle
แล้วปรับ Gradle Home ให้ชี้ไปที่ Gradle 2.4 
จากนั้น ก็เปิด Module Settings ขึ้นมา แล้วแก้ Gradle version เป็น 2.4 ซะ ตามรูป



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

โดยรวมแล้วก็ถือเป็นนิมิตหมายที่ดีว่าในเวอร์ชันต่อๆไปมันก็จะเร็วขึ้นได้อีกแน่นอน


อ้างอิง
[1] Gradle 2.4 Release Notes - https://docs.gradle.org/current/release-notes

https://medium.com/@erikhellman/boosting-the-performance-for-gradle-in-your-android-projects-6d5f9e4580b6

วันศุกร์ที่ 1 พฤษภาคม พ.ศ. 2558

Preview notebook Dell Inspiron 5448 เมื่อ Dell ก็ยังคงเป็น Dell

เมื่อ Dell ก็ยังคงเป็น Dell 


พอดีว่ามีเรื่องให้ต้องซื้อโน๊ทบุคใหม่ รอบนี้มีสเป็คง่ายๆ ก็คือ
  • เปิดเครื่องเพื่อทำความสะอาด และอัพเกรดง่าย
  • จอดีหน่อย
  • แรงพอตัวทั้ง CPU, GPU, HDD, RAM
  • หน้าตาเครื่อง เรียบหรู
  • เอา OpenCL

ทีนี้ ณ นาทีนี้เนี่ยที่แรงๆหน่อยมันก็มี Lenovo Y,  Asus G, MSI, DELL ที่พอจะมีของที่พอจะตรงใจ แต่ไม่ 100%
  • Lenovo Y หน้าตาไม่โดน
  • Asus G ศูนย์บริการดาวอังคาร
  • MSI สเป็คไม่โดน
  • DELL แพงเมื่อเทียบกับคนอื่น

ในเมื่อไม่มีที่ดีที่สุด ก็ต้องเอาที่มันใกล้เคียงที่สุด หวยเลยไปตกที่ DELL เพราะ
  • เปิดเครื่องเพื่อทำความสะอาด และอัพเกรดง่าย ผ่าน เพราะขันน็อต 2 ตัว เปิดฝาหลังได้ทั้งแผงเลย สะดวกดี แล้วเห็นหมดทุกอย่างด้วย
  • จอดีหน่อย ไม่ผ่าน เพราะไม่ Full HD + ไม่ IPS
  • แรงพอตัวทั้ง CPU, GPU, HDD, RAM ผ่าน 
  • หน้าตาเครื่อง เรียบหรู ผ่าน
  • เอา OpenCL ผ่าน เพราะ GPU ได้ AMD

ก็โอเคนะผ่าน 4 ข้อจาก 5 ข้อ ถึงราคาจะรู้สึกว่าแพงไปนิดหน่อย แต่ก็คิดซะว่าแลกกับประกันที่ดี ก็รับได้

หลังจากพิจารณา อย่างยาวนาน ก็ได้ DELL INSPIRON 5448 สำหรับสเป็คคร่าวๆก็คือ
CPU: Intel Core i7-5500U (2.40 GHz, 4MB L3 Cache, up to 3.00 GHz)
Graphic: AMD Radeon R7 M270 (4GB GDDR3)
DisplaySize: 14 inch (1366x768) HD
Memory: 8 GB DDR3L  Memory Bus 1600 MHz
Hard Disk: 1 TB 5400 RPM + 8GB SSD (SSHD)
 
 
 


เจาะลึกชิ้นส่วนสำคัญ 3 ชิ้นหลัก: CPU, GPU, HDD ที่ส่งผลกับประสิทธิภาพของระบบ

CPU: Intel® Core™ i7-5500U Processor

Intel® Core™ i7-5500U Processor (4M Cache, up to 3.00 GHz) ตัวนี้ถือว่าเป็นตัวต่ำสุดของ i7 ใน gen5 codename Broadwell ใช้กระบวนการผลิตแบบ 14 นาโนเมตรอย่างเต็มรูปแบบ แต่เมื่อเทียบกับพวก gen4 ประสิทธิภาพก็ดีขึ้นราวๆ 10% ได้

Ref
http://ark.intel.com/products/85214/Intel-Core-i7-5500U-Processor-4M-Cache-up-to-3_00-GHz
http://ark.intel.com/products/family/84979/5th-Generation-Intel-Core-i7-Processors#@All

GPU: AMD Radeon™ R7 M270

R7 m270 นี่ก็ถือได้ว่าเป็นตัว top ของ R7 mobile เลย ประสิทธิภาพนี่ก็คาบเกี่ยวกับ g840m g850m ก็ถือว่าเล่นเกมบนโน๊ทบุคแก้เบื่อได้สบายๆ แถมยังรองรับ API DirectX® 12 ด้วย

Ref
http://www.amd.com/en-us/products/graphics/notebook/r7-m200

HDD

เจ้า Seagate st1000lm014-1ej164 ตัวนี้มันมีดีอยู่ที่มันคือ SSHD: Solid State Hybrid Drive ที่ทาง Seagate เครมมาว่า SSD-like Speed. Large HDD Capacity. An Affordable Price. ซึ่งจาการใช้งานจริงพบว่ามันไวกว่า HDD ธรรมดา แต่ก็ยังไม่เท่า SSD ตามกลไกของมันเอง

Ref
http://www.seagate.com/as/en/internal-hard-drives/solid-state-hybrid/laptop-solid-state-hybrid-drive/#specs
http://hdd.userbenchmark.com/Seagate-Laptop-SSHD-25--1TB/Rating/1804

ทีนี้ก็มาถึงจุดสำคัญคือ ผล Benchmark

เน้นลองกับโปรแกรม 3D เป็นหลักคือ Unigine กับ 3D Mark
และโปรแกรมยอดนิยมอีกตัวก็คือ CINEBENCH


ตรงนี้เพิ่มผลเทียบกันกับ PC ตัวเก่าที่มีอยู่แล้ว โดย System 1 จะเป็น Dell 5448 ส่วน System 2 จะเป็น PC ใช้ AMD 7790
System 1
Platform: Windows NT 6.2 (build 9200) 64bit
CPU model: Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz (2394MHz) x2
GPU model: Intel(R) HD Graphics 5500 10.18.10.3960/AMD Radeon R7 M270 14.301.1002.1001 (4095MB) x1
System 2
Platform: Windows NT 6.2 (build 9200) 64bit
CPU model: AMD FX(tm)-6100 Six-Core Processor (3322MHz) x3
GPU model: AMD Radeon HD 7700 Series 14.501.1003.0 (1024MB) x1

Unigine Valley Benchmark 1.0

# System 1 Settings System 2 settings
Render: Direct3D9
Mode: 1280x720 2xAA windowed
Preset: Basic
Render: Direct3D11
Mode: 1600x900 8xAA windowed
Preset: Extreme
Render: Direct3D11
Mode: 1920x1080 8xAA fullscreen
Preset: Extreme HD
Render: Direct3D9
Mode: 1280x720 2xAA windowed
Preset: Basic
Render: Direct3D11
Mode: 1600x900 8xAA windowed
Preset: Extreme
Render: Direct3D11
Mode: 1920x1080 8xAA fullscreen
Preset: Extreme HD
FPS 20.9 8.1 6.4 43.6 24.7 18.8
Score 876 338 268 1826 1033 788
Min FPS 12.7 5.3 4.0 14.1 11.8 7.9
Max FPS 36.2 14.0 11.2 79.7 45.3 36.0


Unigine Heaven Benchmark 4.0



# System 1 settings System 2 settings
Render: Direct3D9
Mode: 1280x720 2xAA windowed
Preset: Basic
Render: Direct3D11
Mode: 1600x900 8xAA windowed
Preset: Extreme
Render: Direct3D9
Mode: 1280x720 2xAA windowed
Preset: Basic
Render: Direct3D11
Mode: 1600x900 8xAA windowed
Preset: Extreme
FPS 23.7 7.2 69.5 22.1
Score 597 182 1750 557
Min FPS 7.0 4.8 19.2 13.8
Max FPS 44.1 15.0 123.0 49.6

3D Mark

Test Score Graphics Score Physics Score Combined Score
Ice Storm 57554 73162 32951
Cloud Gate 5954 8724 2821
Sky Diver 4624 4500 4840 5386
Fire Strike 1226 1323 4053 473

Cine Bench R15 & R11.5

 
 

เพิ่มผลเมื่อเทียบกับเครื่อง Macbook Pro มาให้ดูด้วย

สรุปคือ

ได้ Notebook งานประกอบดีมา 1 เครื่อง
ประสิทธิภาพ+งาน+ประกัน คุ้มกับราคา 29XXX จริงๆแล้วถ้าราคามัน 26XXX นี่จะเรียกได้ว่าคุ้มสุดๆเลยนะ