Archive for April, 2011

เรื่องเล่า Twitter 21/04/2011 – 27/04/2011

  • ตั้งแต่ปลายปีที่แล้วมีการใช้เงิน ไปในส่วนที่ไม่จำเป็น เป็นจำนวนมากปีนี้ก็ตัดสินใจพลาด + iPhone หายถึงว่า เขาบอกปีนี้เราให้ดูแลเรื่องเงิน >.< 2011-04-23
  • คนน่ารักมักใจร้าย งิงิ ชอบเพลงนี้จัง 2011-04-23
  • พึงทำ Query แบบมี Condition แบบสมการเลขเสร็จไม่โหดมากสนุกด้วย 2011-04-23
  • GreenDish น่าไปลองกินอะ 2011-04-24
  • NuuNeoI – อีกหนึ่งเหตุธุรกิจซอฟต์แวร์ไทยไม่พัฒนา http://t.co/ezrlCSe via @nuuneoi 2011-04-24
  • วิธีใช้เงื่อนไข IF , Sub-Query ฯลฯใน MySQL เพื่อให้ได้ผลลัพธ์ที่ต้องการ – http://bit.ly/hPgGUB 2011-04-24
  • วิธีใช้เงื่อนไข IF , Sub-Query ฯลฯใน MySQL เพื่อให้ได้ผลลัพธ์ที่ต้องการ http://t.co/JXzxGV0 via @dominixz 2011-04-24
  • ฮาเขียนหัวข่าว "เลิกด่ากู! ตอร์เรสลุยฝนปลดล็อก" 2011-04-24
  • http://bit.ly/e4bta2 2011-04-24
  • ทดสอบ Kontrollbase ตามลิงค์ที่ @heha ส่งมาให้ ถ้าได้ผลยังไงจะรายงานอีกทีครับ 2011-04-24
  • ตี 4 again 2011-04-24
  • ok ตี 5 ได้อาบน้ำนอนสักทีทำ kontrollbase กว่าจะเสร็จ 2011-04-24
  • ไปนอนดีกว่าครับ life talk  icon biggrin เจอกันพรุ่งนี้ 2011-04-24
  • I liked a @YouTube video http://youtu.be/QHcGh1K1UxA?a เธอคือของขวัญ by.Aircool 2011-04-24
  • ปิด Talk บน Android ไม่ให้คนติดต่อได้คริคริ 2011-04-24
  • LED Stilettos http://j.mp/gfB58U 2011-04-24
  • ตื่นมาเสพความรู้ 2011-04-24
  • Learning day 2011-04-24
  • Protect a CodeIgniter Application Against CSRF http://j.mp/gkiUhe 2011-04-24
  • Firefox 4 ทะลุ 100 ล้านดาวน์โหลดหลังเปิดให้ดาวน์โหลดมา 1 เดือน http://j.mp/dP9gH4 2011-04-24
  • Create Hanging File Storage from IKEA Shelf Brackets [DIY] http://j.mp/eJjyPt 2011-04-24
  • LocalScope Uses Search Results, Social Media, and Your Location to Help You Find Nearby Places [Downloads] http://j.mp/e9ScaF 2011-04-24
  • Upload Facebook Clear Games Wall Activity ให้สนับสนุน Mafia Wars 2011-04-25
  • มีคน Download 260 เลยหรอเนี้ย :O 2011-04-25
  • Going back home 2011-04-25
  • พึงเห็นว่า @onebitmatter ไปอยู่ใน @blognone ด้วย >.< 2011-04-25
  • ทำคำถามให้เพื่อนไปตอบ สำหรับการจะเปิดกิจการของตัวเอง 2011-04-25
  • เพื่อนกรู @iamnern วันนี้เขาจะอยู่ดึกฮาฮา 2011-04-25
  • Onebitmatter เริ่มใช้ Sodia อย่างจริงจัง 2011-04-25
  • Upgrade Sodia ให้รับรูปได้เป็น 2600×2600 cc @mr_boyle 2011-04-25
  • [ข่าวลือ] เตรียมตัวพบกับ MacBook Pro ดีไซน์ใหม่ http://j.mp/gOP7Iq 2011-04-26
  • ทำ Index แบบมีหลาย Field เพราะอะไรอ่าน http://t.co/JA0tHm0 cc @oxygenyoyo 2011-04-27
  • indexing onebit monitor 2011-04-27
  • เรื่องการ Migrate Data เรายังอ่อนหัดอยู่มากนัก 2011-04-27
  • Team Coding โดยไม่ต้องใช้ Control Version – http://bit.ly/fNpCYO 2011-04-27
  • เร็วขึ้นมากแล้วเย้ๆ 2011-04-27
  • Mini Barcamp ประจำเดือนเมษา ของ onebit จะเป็นยังไงนะ 2011-04-27
  • อีก 5 นาทีถึงเวลา Mini Barcamp ละ life talk  icon biggrin หัวข้อมีหลายแนวมาก 2011-04-27
  • วันๆมีแต่เรื่องวางแผน 2011-04-27
  • หลังบ้านเสร็จก่อนหน้าบ้าน >.<'' 2011-04-27
  • List Email , Twitter พี่ๆน้องๆที่ทำงาน Online พรุ่งนี้เดียวจะมีการส่งรายละเอียด Product ไปให้นะครับ life talk  icon smile ถ้าไม่ชอบก็ขออภัยไว้ด้วยนะครับ 2011-04-27
  • กลับเข้าไปดู Contact เก่าๆว่าเราน่าจะติดต่อใครได้บ้าง 2011-04-27
  • คำนี้ยังอยู่ในหัว "ด้านได้อายอด" ดังนั้นจะ Blastmail สักรอบต้องหน้าด้านเล็กน้อย 2011-04-27

Team Coding โดยไม่ต้องใช้ Control Version

วิธีเหมาะสำหรับ Team ที่มีขนาดเล็ก (2-3 คน) แล้วคนในทีมยังไม่มีประสบการณ์ในการใช้ Control Version แต่ต้องส่งงานให้ตามเวลา เราจะทำไงดีละ ? เนื่องจากผมก็เปิดบริษัทใหม่แล้วช่วงนี้ มีงานเยอะก็เลยต้องหาวิธีลุมทำให้เสร็จ โดยมีจุดหลักๆที่จะใช้วิธีนี้ได้มีประสิทธิภาพก็คือ

  • แบ่งการถือครองไฟล์ อย่างชัดเจน
  • ใช้ Framework + Convention เดียวกัน เช่น การตั้งชื่อ folder , folder ที่เกี่ยวข้องกับ controller นี้ คนอื่นห้ามยุ่ง
  • การสื่อสารแบบ “ข้อสิทธิ ถ้าจะทำอะไรกับไฟล์ที่คนอื่นถือครองอยู่” เนื่องจากผมอยู่ใกล้กันเรื่องนี้เลยทำได้ง่ายมาก
  • การแยกส่วนการทำการงาน เช่น A ทำ View , B ทำ Controller , C ทำ Controller ที่ B ไม่ได้ถือครอง

จุดเด่น

  • ไม่ต้องเรียนรู้อะไรเพิ่ม
  • คล่องตัว

จุดอ่อน

  • ความเสี่ยงเรื่องการเขียนไฟล์ทับ ซึ่งถึงแม้จะมีการแยกส่วนกันแล้ว แต่ก็ยังมีสิทธิ์อยู่
  • ไม่มีประวัติว่าใครทำอะไร กับไฟล์แล้วเป็น Version ไหนแล้ว
  • ไม่สามารถทำ Automate Test ได้

สรุปก็คือเราไม่จำเป็นต้องใช้ Technology ใหม่ที่สุด แต่แค่ต้องหา Process ที่ลงตัวกับคนในทีม ซึ่งคนในทีมผมไม่ได้ถนัดการใช้ Version Control ดังนั้นเลยต้องใช้วิธีนี้ไปก่อน แล้วถ้าเพื่อนๆไม่ใช่ Control Version ใช้วิธีไหนในการเขียน Code รวมกันครับ software tips  icon smile

วิธีใช้เงื่อนไข IF , Sub-Query ฯลฯใน MySQL เพื่อให้ได้ผลลัพธ์ที่ต้องการ

เนื่องจากผมจะต้องทำ Report พร้อมมีสมการบางอย่าง เพื่อเป็นการคำนวณ ซึ่งผมใช้ PHP กับ MySQL เป็นหลัก โดยปัญหาที่มักจะเกิดบ่อยๆก็คือ “ดึงข้อมูลจาก Database มาคำนวณที่ PHP แล้วก็เอามาเรียงใส่ Array ใหม่เป็นข้อมูลชุดใหม่” และยังมีเหตุการอื่นๆอีกเช่น ไม่ยอม Join Table แล้ว GET ข้อมูลจาก Table หนึ่งไปใส่อีก Table หนึ่งทำให้ Performance ช้าอีก

วันนี้ผมเลยขอแนะนำตัวที่เราได้ใช้บ่อยๆกันใน MySQL กันนะครับผมก็พึงลองสดๆร้อนๆเลย

CASE

CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END

จริงๆผมสับสนระหว่าง CASE กับ IF แต่พอใช้แล้วก็เข้าใจขึ้น โดยผมมองว่า CASE คือการ FILTER ข้อมูล แต่ IF เป็นเงื่อนไข แต่ปกติเราเขียนโปรแกรมมักใช้ IF เป็นการ FILTER ข้อมูล แต่ใน Database มักแยกกันชัดเจน ยกตัวอย่าง เช่น if(number == 1) ใน php ที่จริงคือ CASE WHEN number = 1 ทำนองนั้นครับ ตัวอย่างที่ชัดเจนคือ

SELECT page_id , SUM(CASE WHEN score = 1 THEN 1 ELSE 0 END) AS good , SUM(CASE WHEN score = 0 THEN 1 ELSE 0 END) AS neutral , SUM(CASE WHEN score = -1 THEN 1 ELSE 0 END) AS bad
FROM sentiments

โดยใน Table มี Field หนึ่งที่เก็บ score ซึ่งส่วนใหญ่แบ่งเป็น 1 , 0 , -1 ซึ่งผมต้องการ 3 เลขนี้ขึ้นมาใน Row เดียวผมเลยต้องใช้วิธีนี้ เพราะมันจะเกี่ยวโยงกับ Subquery เพื่อนำไปใช้ต่อในการคำนวณ ดังนั้นมันเลยเป็นสิ่งจำเป็นที่ต้องได้ค่าเหล่านี้มาอยู่ใน Row เดียว

IF

IF(expr1,expr2,expr3)
เป็นการใส่เงื่อนไขอย่างที่อธิบายก่อนหน้านี้ โดยวิธีใช้คือ  IF(SUM(score) <  80,IF(SUM(score) < 50,’F',’C'),’A') มันก็คือ IF ELSE ใน PHP นั้นเอง แต่สิ่งเดียวที่มันทำไม่ได้คือ IF(score == 1,’YES’,'NO’) ทำนองนี้ เน้นอีกครั้งนะครับ ทำไม่ได้ ดังนั้นเราเลยต้องใช้ CASE มาผสมกัน

อื่นๆ

อาจจะมีบางคนไม่รู้ว่า จริงๆแล้ว SQL สามารถ + – * / ( ) ได้ยกตัวอย่าง เช่น SELECT page_id , score/100 FROM sentiments เป็นต้น

รู้พื้นฐานแล้วแต่ก็คงยังไม่พอต้องผสมให้เป็น

โดยผมจะลองยกตัวอย่าง Query ซ้อน Query มาให้ดูสักอันจากของจริงนะครับ

SELECT page_id,create_date, IF(ABS((((good/devideval) + (neutral/devideval)) – ((bad/devideval) + (neutral/devideval)))) > 7,IF((((good/devideval) + (neutral/devideval)) – ((bad/devideval) + (neutral/devideval))) >0,1,-1),0) AS score
FROM
(
SELECT page_id , SUM(CASE WHEN score = 1 THEN 1 ELSE 0 END) AS good ,SUM(CASE WHEN score = 0 THEN 1 ELSE 0 END) AS neutral , SUM(CASE WHEN score = -1 THEN 1 ELSE 0 END) AS bad , COUNT(score) as total , (COUNT(score) / 100) as devideval , DATE(created_at) AS create_date
FROM `sentiments`
WHERE user_id = 1 GROUP BY page_id,DATE(created_at)
) AS sentiment_result

โดยแม้จะเป็น Query ที่ดูยากสักหน่อย แต่ผมจะอธิบาย SELECT ล่างก่อนนะครับโดยจะอ่านเป็นประมาณนี้ครับ

“ให้ทำการเลือก page_id , ผลรวมของ score โดย score มีค่าเป็น 1 ให้มีค่าเป็น 1 อย่างอื่นเป็น 0 , ผลรวมของ score โดย score มีค่าเป็น 0 ให้มีค่าเป็น 1 อย่างอื่นเป็น 0 เป็น good , ผลรวมของ score โดย score มีค่าเป็น 0 ให้มีค่าเป็น 1 อย่างอื่นเป็น 0 เป็น neutral , ผลรวมของ score โดย score มีค่าเป็น -1 ให้มีค่าเป็น 1 อย่างอื่นเป็น 0″

อธิบายเพิ่มเติมตรงส่วนนี้คือ การที่ต้องทำให้ต้องมีค่าเป็น 1 เป็น 0 นั้นเพราะความต้องการของผมคือ “จำนวนนับของ score 1 , 0 และ -1″ เลยต้องทำแบบนั้น จะ COUNT ก็ได้เช่นกัน แต่ผมขี้เกียจแก้ของผมที่ทำได้แล้วเท่านั้นเอง

ส่วนที่เหลือก็ Where ตามปกติ แต่ที่นี้ผมต้องอธิบายเพิ่มเพราะผมนำ SELECT อันล่างไปเป็นข้อมูลของ SELECT ข้างบนดังนั้นตอนนี้ผมเลยมี page_id , good , neutral , bas , total , devideval , create_date ที่สามารถเรียกใช้งานได้ ใน SELECt ด้านบนผมเลยมาทำสมการเลข สังเกตุว่าผมใส่ ( ) ค่อนข้างมาก เพื่อความมั่นใจว่า มันจะหารก่อนแล้วค่อยนำมา + – กันเสร็จแล้วผมก็ยังใช้ IF ELSE ฉบับ MySQL อีกด้วยคือ IF(express,IF(express,result1,result2),result3) ทำนองนั้นครับ

ประโยชน์ที่ได้รับสำหรับการใช้การคำนวณอยู่ใน Database

  • เร็วไม่เปลื้อง  CPU , Memory ในการทำ Array ชุดใหญ่ใน PHP
  • สำหรับผม Maintenance ทำได้สะดวกกว่าใช้ PHP SQL สลับไปสลับมา

โดยหลักๆคือ 2 ข้อแต่ประโยชน์จะทวีคูณ หากนำไปใช้กับ PHP อย่างเหมาะสม โดยคำเตือนขอเดียวก็คือ “ให้รู้ Limit ของ SQL และไม่จำเป็นต้องตั้งเงื่อนไขว่า จะได้ข้อมูลเหล่านี้ด้วย SQL ล้วนๆ มีบางกรณีของผมซึ่งใช้ Query เดิมได้แต่ต้องนำ good*1 , neutral*0 , bad*-1 แล้วนำมา + กันทั้งหมด ซึ่งตามจริงแล้วการจะได้เช่นนั้นผมจะต้อง SELECT อีกครั้งหนึ่งซึ่งมันสุดโต่งเกินไป ผมเลยหยุดที่ก่อน Step นั้นแล้วเวลานำไปใส่ใน Report ผมก็ใช้ PHP + – เอาแต่ทีนี้มันง่ายแล้วไงครับ เพราะใน Row ก็มี good , neutral , bad มาให้พร้อมแล้วแค่ใส่สมการ เอาไปแสดงผลเป็นอันเสร็จ วันนี้ผมลาไปก่อนหวังว่ามีประโยชน์ไม่น้อยสวัสดีครับ geek tips programming solution  icon biggrin

Next Page »