ทดลอง IKVM

IKVM เป็น run-time ที่ใช้แปลง byte code ของ Java ไปเป็น IL บน .NET รวมถึงมี Base Class Library ของ Java ที่ implement เป็น .NET ให้เรียกใช้ด้วย ตอนนี้ใช้งานได้ในสองโหมดคือ

1. เอา IKVM ไปแทน Java ไปเลย สั่งรัน class ของ Java หรือ .JAR ที่ build มาแล้วได้ทันทีบน .NET Framework

2. แปลง byte code ไปเป็น IL ให้เสร้จก่อน แล้วเรียกใช้เหมือน app ปกติ (หรือ add reference ไปในกรณ๊ที่เป็น library)

กรณีทั่วๆไปคงหาโอกาสใช้ให้เกิดประโยชน์ได้ยาก ถ้าโปรแกรมเล็กๆเขียนใหม่จาก Java –> .NET ดูจะเป็นวิธีแก้ปัญหาที่ดีกว่า ถ้าแต่โปรแกรมมันเริ่มซับซ้อนและใหญ่ และการใช้งานจริงๆเราก็มองว่าเป็น black box (give input, get output) แก้ปัญหาโดยใช้ IKVM ก็ไม่เลว เคสของผมคือมันมี logic สำหรับการแกะ format อะไรซักอย่างที่มัน proprietary มากๆ spec ก็คงหาค่อนข้างยาก ให้แกะ spec จากโค้ดลองดูแล้วนิดหน่อยก็คิดว่าคงใช้เวลามหาศาล แต่โชคดีที่มันมี implementation ที่เป็น Java อยู่แล้ว ก็ใช้ IKVM แปลงมาเป็น library ใน .NET แล้วเรียกใช้ได้เลย

ตอนแรกคิดว่าคงมีปัญหาแน่ๆ เพราะ library มันก็ใหญ่มากอยู่ แต่ปรากฎว่าผ่านฉลุยตั้งแต่รอบแรกอย่างน่าตกใจ o__o! วันนี้กลับมาบ้านเลยมาลองกับ project วิชา programming methodology ที่เคยเขียนเป็น game คู่กับแบงค์ ทิ้งไว้เมื่อตอนปีสอง ถ้าวัดในแง่ขนาดของโค้ดคงเล็กกว่าที่แปลงก่อนหน้านี้หลักร้อยเท่า แต่เนื่องจากมันเป็น game เลย depends on libraries หลายตัว อาทิ:

  • Swing ทำ GUI
  • อ่านเขียนไฟล์
  • Audio เล่นเสียง
  • คลาสพวกจัดการ Image
  • Math
  • อ่าน Image จากไฟล์ใน JAR (เทียบได้กับ Resource ล่ะมั้ง)
  • ..

รัน

ikvmc CPLander100.jar

ได้มาเป็น CPLander100.exe ผลคือ

  • Start up นานได้ใจ (เกือบ 3 วินาที)
  • เปิดเมนูหน้าแรกได้ ใช้ได้ Hooray!
  • In game ใช้ได้ แต่ออกมาเมนูข้างนอกอีกรอบไม่ได้ T_T
  • เสียงหาย
  • ช้ากว่ารันด้วย Java มาก (สมเหตุสมผล)
  • Component ของ Swing ที่ใช้ทำงานถูก
  • พวก Math มีคำนวณพลาดจน paint ภาพผิดตำแหน่ง คิดว่าน่าจะเกิดจากตอนเขียนโค้ดไม่ระวังเรื่องพวกใช้ floating point (มั้ง)

 

ถึงจะรันได้ไม่ perfect แต่โดยรวมถูกใจ IKVM มาก ว่างๆไปหาโอกาสเล่นกันดู ยกนิ้วให้คนทำ –/\-

IKVMx

ประสบการณ์ Heisenbug

รู้จักคำนี้ครั้งแรกมาพักนึงแล้ว สั้นๆคือ Heisenbug เป็น bug ที่ตรวจไม่เจอหรือ reproduce ไม่ได้ถ้าพยายามจะ debug มัน … อึ้ยยย ฟังก็งงแล้วว่ามีจริงเหรอวะของแบบนี้ ชื่อก็ตั้งตาม Heisenberg คนที่คิด “หลักความไม่แน่นอนของไฮเซนเบิร์ก” ที่เคยเรียนในฟิสิกส์แหละครับ เนิ้ดร้องอ๋อแน่นอน

นอกจากนี้ยังมี bug อื่นๆ ที่จัดว่าเป็น bug แบบ “แปลกๆ” อีก แปลมาให้ฟังเล่นๆดังนี้

Bohrbug – นานๆเป็นทีนึง แต่ condition แน่นอน มักจะเกิดกับ condition ที่ rare มากๆ ส่วนใหญ่มักจะโผล่มา say hi บน production และเราก็จะหาไม่เจอว่า condition อะไรที่มัน trigger อาการนี้ออกมา – -‘

Mandelbug – ต้นเหตุของปัญหาซับซ้อนมาก จนมองจากภายนอกแล้วเหมือนจะไม่มี pattern อะไรแน่นอนที่ทำให้เกิดปัญหานี้เลย ซึ่งปัญหาอาจเกิดจากการ interact กับระบบภายนอกระบบอื่น หรือว่ามันอาจใช้เวลานานกว่าปัญหาจะฟักตัวออกมาให้เห็นนับจากตอนที่มีการ execute อะไรบางอย่างผิดๆ

Schrödinbug – ปัญหาที่ไม่เคยปรากฎตัวเลย จนมีคนไป observe source code แล้วพบว่ามันผิด! อันนี้มันเป็นเรื่องที่เกี่ยวกับแนวคิดของ quantum นิดๆ คนสายเราน่าจะเคยอ่านเรื่อง แมวของชโรดิงเจอร์ มาบ้าง อันนี้เป็นเรื่องเดียวกัน แต่ผมนึกสถานการณ์ตัวอย่างไม่ออก .. เท่าที่คิดก็คงแบบว่าพวก hacker ที่อ่าน source code แล้วพบว่ามันผิด ก็เลยไป exploit ซะเองล่ะมั้ง ..

Phase of the Moon bug – อันนี้เกิดจากการคาดการณ์ว่า bug ตัวนึงจะเกิดขึ้นเนื่องจากปัจจัย A,B,C แล้วก็พยายาม isolate ปัญหาโดยลองกับปัจจัย A,B,C ทีละตัว … ทั้งๆที่จริงๆแล้ว A,B,C ไม่ได้เกี่ยวข้องกับปัญหาเลย ทำให้สุดท้ายแล้วหาสาเหตุไม่เจอซักที … อันนี้ลองมองเทียบกับเรื่อง ดูลายนิ้วมือ หรือ โหงวเฮ้ง ก็พวกดูดาวแล้วเอาไปเป็นสัญญาณ trade หุ้น คล้ายๆกัน

Statistical bug – เป็นประเภทที่ไม่สามารถมองเห็นปัญหาได้จากการรันทดสอบเพียงครั้งเดียว ตัวอย่างที่วิ่งขึ้นมาในใจตัวอย่างแรกคือเรื่องการการเขียนโปรแกรม shuffle ไพ่ ซึ่งเป็นโปรแกรมที่เขียนให้ผิดได้ง่ายมากเพราะบางทีผลการสับไพ่หลายๆครั้งอาจจะไม่กระจายออกมาในทุกรูปที่เป็นไปได้แบบ uniform … พูดง่ายๆคือสับออกมาแล้วออกมาแบบนี้บ่อยกว่าอีกแบบนึงอะไรแบบนั้น อ่านมาจาก http://www.codinghorror.com/blog/2007/12/the-danger-of-naivete.html

Noob bug (or Noobug) – เป็นอะไรที่ง่ายมาก แต่นู้บหาสาเหตุไม่เจอ อันนี้เจอเองบ่อย (ฮาาา) ยกตัวอย่างซะหน่อย มือใหม่อาจแปลกใจว่าทำไมโปรแกรมข้างล่างถึง print ออกมา 101 ตลอด กะจะเขียนโปรแกรม 1 + 2 + 3 + 4 + … + 100 ไปส่งคุณครูซะหน่อย Smile with tongue out

int increment, sum = 0;
for (increment = 1; increment <= 100; ++increment) ;
sum += increment;

Console.WriteLine(sum);

ส่วนเคส Heisenbug ที่เจอ โค้ดมันเป็นประมาณนี้ (C#)

public class MyEventGen { }

class Program
{
public static void Main()
{
var gen = new MyEventGen();
var wr = new WeakReference(gen);

// run the collector
GC.Collect();
while (true)
{
Thread.Sleep(1000);
Console.WriteLine(wr.IsAlive);
}
}
}

ถ้าเอาไปรันแบบ Debug หรือ Release ใต้ Visual Studio โปรแกรมจะ print True ออกมาตลอด (การใช้ WeakReference ไปชี้แล้วตรวจ IsAlive บอกได้ว่าโดน Garbage Collector เก็บไปรึยัง) … แต่ถ้ารันนอก Visual Studio (without debugging) จะกลายเป็น False ตลอดทันที ตอนแรกก็เลยไม่รู้จะ debug ยังไง

ตามความเข้าใจผมตัวแปร gen ควรจะยังมี reference อยู่ตลอดเวลาเพราะยังไม่ออกจาก scope Main เลย … ซึ่งถ้าตาม syntax มันก็เป็นแบบนั้น คือผมสามารถเขียนโค้ดเพื่อ access ตัวแปร gen ได้ภายใน scope Main … แต่ run-time behavior มันไม่ได้เป็นแบบนั้น เพราะ GC ใน Release mode มันค่อนข้าง aggressive มาก เลยเก็บตัวที่ไม่ได้ใช้เรียบ T_T อันนี้ส่วนหนึ่งโดนฝังแนวคิดมาจาก C++ ด้วย เพราะปกติพวก object ที่ alloc ไว้บน stack จะโดน destruct ตอนออกจาก scope … ซึ่งมันไม่เหมือนกับภาษาที่มี GC.

อันนี้ตอนแรกมองว่าเป็ Heisenbug แต่จริงๆมองเป็น Noob bug ก็ถูก เพราะถามปุ๊บมีคนตอบทันที!! Open-mouthed smile http://stackoverflow.com/questions/4757869/is-this-com-object-subject-to-garbage-collection

เรื่อง bug ส่วนใหญ่ก็แปลมาจาก http://en.wikipedia.org/wiki/Unusual_software_bug ใครเจอเคสอะไรแปลกๆมาแชร์ให้ฟังหน่อยก็ดี อยากฟังครับ

รีวิว Kindle DX Graphite

รีวิวนี้เหมาะกับคนกลั่นข้อมูลมาเต็มที่แล้วนะครับ อะไรที่มันซ้ำๆกับรีวิวอันอื่นจะละๆไปละกัน

ในที่สุดกิเลสที่สั่งสมมายาวนานของผมก็ก่อตัวเป็นรูปร่างของแข็งครับ TvT จุดประสงค์หลักๆเลยที่ซื้อมาคือเพื่อจะเอามาอ่าน PDF ที่เก็บๆไว้มากมาย ยังไม่ค่อยสนใจจะซื้อของจาก store ของ Amazon เท่าไหร่ ส่วน 3G ถึงจะแถมมาให้ฟรี แต่ก็ด้วยข้อจำกัดของตัวจอ E-ink ที่ refresh ช้ามากรวมถึงตัว web browser บน Kindle DX นั่นแหละ ที่ทำให้การเล่นเน็ตบน DXG ไม่ค่อยสะดวกสบายเท่าไหร่ เหมือนเค้าตั้งใจให้เอาไว้แค่เวลาซื้อหนังสือผ่าน Kindle จะได้ง่ายๆมากกว่า ขอสรุป requirement ของตัวเองดังนี้

  • เอามาใช้อ่านไฟล์ PDF เป็นหลัก ส่วนใหญ่เป็นหนังสือวิชาการ บทความ เอกสารประกอบซอฟแวร์ การ์ตูนบ้างบางเวลา
  • ไม่ได้พกไปข้างนอกมากเท่าไหร่ อ่านบนโต๊ะบนเตียงที่บ้าน
  • ยังไม่ค่อยสนใจซื้อหนังสือผ่าน Kindle store
  • 3G มีก็ดี เผื่อเอาไว้ไปเช็คเมล์ขำๆไม่ต้องเสียตังค์

มีคนถามบ่อยว่าทำไมไม่เอา iPad เปิด PDF ได้เหมือนกัน หลักๆเลยคงเป็นเรื่องจอ E-ink นี่ล่ะครับ

หลังจากอ่าน review มาหลายเจ้าก็ได้ข้อสรุปว่า ถ้าจะเอามาอ่านหนังสือ PDF นั้น ควรจะเป็นจอขนาด 9.7” ของ DXG เท่านั้นครับ (จอเล็กมันเล็กไป) ปรึกษาคนโน้นคนนี้อยู่หลายวันว่าจะสั่งยังไงให้มันถูกๆดีหว่า สุดท้ายก็ไม่ได้ทำไร –_-‘ สั่งตรง Amazon โดน Tax เต็มๆ ส่วนตัวก็รู้สึกอุ่นใจกว่านะที่มันมาส่งให้ถึงบ้านเลยไม่ต้องทำ action อะไรแล้ว แต่ถ้าคิดเป็นเม็ดเงินก็ >_<” (อยากจะร้องไห้)

เวลาจัดส่งประมาณ 4 วัน (คลิกดูรูปใหญ่) ติดตามผ่านเว็บ DHL ได้ตลอด (มันมี tracking number ให้) ดูผ่านเว็บจากที่ทำงานว่าพี่ที่บ้านเซ็นรับให้แล้วก็อุ่นใจ .. แต่ก็แอบไม่มีสมาธิทำงาน ฮ่าๆๆ

00_DELIVER

เข้าเรื่องตัวของเล่นกันเลยดีกว่า

จอ E-ink

เปิดกล่องมาครั้งแรกเห็นมันมีพลาสติกใสทับเครื่องอยู่แล้วก็มี instruction สอนให้เสียบปลั๊กแบบโน้นแบบนี้ ตอนแรกนึกว่า instruction มันเป็นหมึกพิมพ์ลงบนพลาสติกใส ปรากฎว่ามันเป็นรูปจากจอ E-ink ว่ะ o__o’ โอ้! ใช้ได้ๆ บางคนพอได้ยินคำว่า E-ink หรือจอกระดาษ อาจจะงงว่าแล้วมันต่างจากจอคอมหรือ iPad ยังไง? อ่านในที่มืดได้รึเปล่า? คำตอบคือมันไม่เหมือนกัน แล้วมันอ่านในที่มืดไม่ได้ครับ แต่ถ้าอยากอ่านก็ต้องเอาไฟฉายมาส่งเหมือนกระดาษ อ่านที่แดดจ้าไม่มีปัญหา (แต่อยู่เมืองไทยใครจะไปอ่านกลางแดด ….)

จอของ DX ขนาด 9.7” ตามแนวแทยงมุม (เหมือนเวลาบอกขนาด TV)  หรือ 20 x 14 cm

Pixel Count:
1200 x 825 (SVGA)

Active Area:
202.9 x 139.5 mm
246.38 mm (9.7") diagonal

DPI:
150

ส่วนจอ Kindle 3 (Kindle ตัวใหม่ที่จะออกปลายสิงหานี้) ขนาด 9 x 12 cm ผมแนะนำว่าให้ตัดกระดาษออกมาขนาดเท่านี้ดู ถ้าอยากรู้ว่ามันเล็กเกินไปรึเปล่า

Pixel Count:
800 x 600

Active Area:
122.4 x 90.6 mm
152.3 mm (6") diagonal

DPI:
166

อีกเรื่องนึงที่มารู้ไม่นานก่อนซื้อเครื่องคือ ตัว firmware ของ Kindle มันจะทำหน้าที่ตัดขอบขาวๆของ PDF ออกให้ด้วย โอ้ววว >_< พูดง่ายๆคือไม่ต้องทำอะไรกับ PDF เลย แค่โยนลงเครื่องแล้วตอน display มันก็จะไม่แสดงขอบขาวๆพวกนี้ให้เห็น เป็นการใช้พื้นที่หน้าจออย่างมีประสิทธิภาพ ดังนั้นขนาด 20 x 14 หรือ 9 x 12 cm อาจจะเทียบตรงๆกับขนาดกระดาษไม่ได้ ให้มองเฉพาะส่วนที่เป็น text (ถ้าจะเปรียบเทียบ)

ผมประทับใจจอมากๆ วันที่สองที่ได้มา อ่าน pocket book เล็กๆไปประมาณ 2 – 3 ชม. ไม่ล้าเหมือนอ่านหน้าคอมเลย

01_DXG_VS_A4

สีขาวเป็นกระดาษ A4

06_SHADE

เฉดสีเทามี 16 ระดับ

ปุ่ม

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

และเนืองจากจอ E-ink ที่มัน refresh ช้าด้วยนี่แหละ เลยทำให้บางทีเวลาพิมพ์หรือเลื่อน cursor หรือกดปุ่มอะไร มันจะตอบสนองไม่ค่อยทันใจเรามาก แต่ก็ไม่ได้รู้สึกว่ารำคาญกับเรื่องนี้มากนะ

keyboard ถือแล้วใช้นิ้วโป้งพิมพ์ไม่ได้ อันนี้เคยอ่านมาจาก review อันอื่นเหมือนกัน แต่ผมคงไม่ได้พิมพ์อะไรบ่อยๆอยู่แล้ว ยกเว้นเวลาจะ jump ไปยังหน้าที่ระบุ หรือเวลาจะ search ใน PDF ถ้าอยากพิมพ์จริงๆควรจะตั้งกับพื้นแข็งๆแล้วพิมพ์

ปัญหาตลกๆอีกอย่างคือเวลาจะพิมพ์ตัวเลขต้องกด Alt ก่อน = =’ อันนี้แอบลำบากจริงเพราะต้องใช้บ่อย

03_KEYBOARD

น้ำหนัก

หนักประมาณ 0.5 kg เบากว่า iPad ขีดนึง เพื่อนผมบอกว่าถือนานๆคงเมื่อยมือ หนักไป ใหญ่ไป แต่ผมไม่มีปัญหากับข้อจำกัดเรื่องนี้เพราะว่ากะจะใช้ที่บ้านอยู่แล้ว เนื่องจากจอมันค่อนข้างจะใหญ่ด้วย กลัวพอไปมากระแทกแล้วแตก

3G

ฟรี ช้า และไม่บันเทิง

ผมลองใช้ในบ้านเราดู มันก็เข้าเว็บใดๆได้นะครับ แต่จะแสดงภาษาไทยไม่ได้ แล้วก็แสดงผลแปลกๆ ไม่มันส์เท่าเล่นในมือถือหรอก

มีคนถามมาบ่อยว่าแล้วมันใช้ 3G ผ่านเครือข่ายของใคร? AIS, True, DTAC? อันนี้ก็ไม่รู้เหมือนกัน รู้แต่เคยเห็นเว็บที่มันแกะเครื่องออกมา ข้างในจะมีซิมจาก Amazon ใส่มาอันนึง (เปลี่ยนเองไมได้)

การใช้งาน PDF

มีเรื่องที่งงๆกันเกี่ยวกับ Kindle และ PDF อยู่หลายอย่าง

  • Firmware Kindle ปัจจุบันใช้ zoom PDF ได้แล้ว แต่ก็เพราะจอ E-ink มัน refresh ช้าจัด บางทีจะให้มา zoom บ่อยๆมันก็ไม่สะดวกนะ (ยกเว้นเป็นพวก map ที่นานๆใช้ทีนึง)
  • ภาษาไทยหรือภาษาอะไรก็ตามใน PDF จะอ่านได้เสมอ ตามที่ผมเข้าใจคือ ส่วนใหญ่เอกสารที่เป็น PDF มันไม่ต้องใช้ข้อมูลพวก font จากข้างนอกมา render
  • ปรับขนาด font ใน PDF ไม่ได้แน่นอน ถ้าเป็น E-reader รุ่นอื่นอย่างเช่นของ Sony จะมีฟังก์ชันที่เรียกว่า reflow (แต่ก็ไม่ควรไปคาดหวังว่ามันจะทำงานได้ดี) แต่หนังสือและเอกสารส่วนใหญ่ผมเปิดใน DXG แล้วได้ font ที่ขนาดกำลังดี อ่านได้นะครับ ยกเว้นบางเล่มจริงๆที่รู้สึกว่ามันเล็กไปมากๆ หรือไม่ก็เล่มที่ขอบหนังสือมันไม่ขาวหมดจด มีขอบโน่นขอบนี่ตัว firmware เลยตัดไม่ได้
  • ถ้าเป็นหนังสือที่ซื้อจาก Amazon จะทำ text to speech ได้, take note ได้, เปลี่ยนขนาด font ได้ แต่ถ้าเป็น PDF ดาดๆ จะทำอะไรพวกนี้ไม่ได้เลย

ลองมาดูตัวอย่าง

04_AI_CHART

05_MANGA

05_MANGA_ZOOM

อันนี้เป็นอีกปัญหาที่หลายคนเจอเหมือนกัน คือ font ที่เป็นสีๆ บางทีพอมาดูบน Kindle แล้วสีมันจะเทาอ่อนเกินไป ทำให้อ่านไม่ออก

08_CODE 

09_CODE_NORMAL

บางไฟล์ตัวอักษรจะเล็กเกินไปจริงๆ แต่ถ้าพลิกเป็นแนวนอนก็จะใหญ่ขึ้นพออ่านได้เหมือนรูปด้านล่าง

10_HOR

สรุป คือผมพอใจกับมันนะครับ รู้สึกขอขวดที่ขวางผมกับ PDF ที่มีบน harddisk มันหายไปเกือบหมด >_< (เว่อซะ)  ค่อนข้างมั่นใจว่านี่จะไม่ใช่ E-reader เครื่องสุดท้ายที่จะซื้อในชีวิตนี้ มันมีตลาดตรงนี้จริงๆซึ่งตอนนี้อาจจะยังไม่ใหญ่ แต่คงไปได้อีกไกล

ข้อเสียส่วนใหญ่ก็เป็นเรื่องที่รู้มาจาก review อื่นแล้วเกือบจะทั้งหมด ไม่เจอเรื่อง surprise อะไรพิเศษ

ถ้าพยายามกว่านี้คงสามารถหาวิธีสั่งซื้อที่มันถูกกว่านี้ได้ เช่น ฝากเพื่อนที่ US หิ้วหรือหาคนที่เค้ารับส่งของจาก US มาให้ ในกรณีของผมที่สั่งตรงกับ amazon จะโดน tax ไปเยอะมากกกก…ก (โดนตัดไปตั้งแต่ตอนสั่งผ่านเว็บ) ถือว่าเป็นค่าขี้เกียจละกัน แต่ก็สบายใจดีในแง่ที่ว่าถ้าเปิดกล่องแล้วจอมันแตก ก็คงโวยกับ customer service ได้อย่างสะดวกใจ เสียตังค์กับของเล่นชิ้นนี้ไปเยอะเหมือนกัน TvT ขออนุญาตไม่คูณเป็นเงินบาท

34260_423955127256_637427256_5086573_7611058_n

รายละเอียดเพิ่มเติมไปดูที่หน้าสินค้า คนแถวนี้ใครจะซื้อมาคุยกันก่อนก็ดี :’P

จริงๆอยากเขียนละเอียดกว่านี้แต่เขียนไปเขียนมาชักยาว สงสัยอะไรถามมาได้ๆ ตั้งแต่ใช้มาจนถึงตอนนี้อ่านหนังสือเล่มเล็กๆไปได้ประมาณ 1 เล่มครึ่งแล้ว ยังคงแฮปปี้อยู่ ส่วนใหญ่นอนอ่านบนเตียง

วิธีคำนวณ ROA ในเว็บ SET

เพิ่งอ่านหนังสือเล่มแรกจบใน Kindle ไปได้ไม่นาน (The Little Book that beats the market) หนังสือมันสอนวิธีกรองหุ้นง่ายๆโดยใช้ reuturn on capital + earning yield แต่วิธีที่หนังสือมันใช้คำนวณสองค่านี่มันต้องใช้ค่าดิบๆบางอย่างจากงบการเงิน ซึ่งหามายากพอควร ( .. แปลว่า automate ไม่ได้ ..) ผมเลยลองมาดูๆค่าที่ใช้แทนได้ใกล้เคียงที่สุดแทนและมีบนเว็บ SET คือ ROA (return on assets – ผลกำไรต่อสินทรัพย์) และ ROE (return on equity – ผลกำไรต่อส่วนผู้ถือหุ้น)

 

ค่าสองตัวนี้ควรจะหาได้ง่ายๆ Wikipedia กล่าวว่า

ROA_FORM

แต่ทำไปทำมาปรากฎว่าคำนวณแล้วไม่เห็นจะตรงกับที่เขียนไว้ในเว็บเลยว่ะ ….’’ นั่งงงอยู่นาน

FS

จากรูป ถ้าจะหา ROA ปี 2009 (ปี 2010 ยังได้ข้อมูลไม่ครบ เด๋วจะงง) จะได้ 10190.22 / 115698.28 = 8.8076 %  … ไม่เห็นจะตรงกับ 13.33 % เลยอ้ะ

ถามอากู๋คนเดิมได้ความจากกระทู้ในพันทิบว่า SET มันใช้วิธีคำนวณคนละวิธี ใช้เป็น ROAA (return on average assets) แทน

ROAA = EBIT of nth year  / (0.5 * (NET assets n-1th year + NET assets nth year))

ตัวย่อแปลกๆในข้อความนี้อีกตัวคือ EBIT (Earnings before interest and taxes) ซึ่งเป็นกำไรแบบที่ยังไม่ได้คิดดอกเบี้ยเงินกู้กับภาษี ถ้าดูจากตารางข้างบนจะเห็น กำไร/ขาดทุน = 10,190.22 ล้านบาท แต่ถ้าไปเปิดงบกำไรขาดทุนละเอียดดูแล้วจะได้ EBIT = 14,878.46 ล้านบาท

INCOME

สุดท้ายเอาไปคำนวณ 14878.46 / ((115698.28 + 107510.00) / 2) ~ 13.3 % ตรงแล้ว

วันนี้แมงเม่าหนุ่มจึงอ่านงบการเงินเป็นมากขึ้นพอสมควรหลังจาก trade มานานเกือบปีแล้ว จดไว้นิดนึงเผื่อมีคนงงเหมือนกัน

หลักๆ หนังสือเล่มที่อ่านมันสอนให้ดูค่าพวกนี้เพื่อบอกว่าหุ้นตัวไหนน่าซื้อแบบ relative เค้าบอกว่าการทำนายอนาคตหรือราคาที่เหมาะสมนี่มันไม่ใช่เรื่องที่ใครๆก็จะทำได้ง่ายๆ แล้วหุ้นที่ undervalued แบบที่ Ben Graham เจ้าพ่อ VI ชอบซื้อปัจจุบันมันก็ไม่ได้เจอได้ง่ายขนาดนั้นอีกแล้ว ดังนั้นเรามาดูข้อมูลปีล่าสุดกันดีกว่า … ใครสนใจลองหาไปอ่านกันดู

หนังไม่สมจริง

ตอนเด็กๆ (ก็ไม่น่าจะเด็กมากประมาณ ม.3 ล่ะมั้ง) เวลาป๊าม๊าที่เป็นหมอนั่งดูละครชุดเรื่อง E.R. กันก็จะนั่งดูเหมือนจะบันเทิงแต่ก็จะจับผิดตลอดเวลาอย่างโน้นอย่างนี้ ไม่สมจริง ทำแบบนี้ไม่ได้ …. ตัวเองตอนนี้มาพอนั่งดูนั่งที่เกี่ยวกับคอมพิวเตอร์หลายๆเรื่องก็ไม่เห็นจะมีเรื่องไหนมันทำสมจริงๆมากๆเลยว่ะ (มีนะแต่น้อย) ส่วนใหญ่ GUI ของคอมพิวเตอร์ในหนังมันก็จะเว่อร์ๆอยู่แล้วเพื่อให้คนดูสนุก วันก่อนก็ได้คุยกับพี่ที่ทำงานอีกคนเค้าก็ติๆ Angel & Demon หน่อยว่าทำอะไรไม่อิงข้อมูลวิทยาศาสตร์ แล้วก็ชมเรื่อง Iron Man ให้ฟังว่าเรื่องนี้ทำอะไรปรึกษานักวิทยาศาสตร์ตลอด ไม่ได้ให้ข้อมูลผิดๆเหมือน Angel & Demon

พักหลังๆผมชอบไปอ่าน review หนัง หลายครั้งบทวิจารณ์หนังพวกนี้มันบอกว่าหนังเรื่องนึงไม่ดีด้วยเหตุผล “ไม่สมจริง” ยกตัวอย่างเช่นเรื่อง The Hurt Locker คนวิจารณ์เคยทำงานเกี่ยวกับทหารมาก่อน เค้าบอกว่าเค้าดูแล้วรู้สึกสะดุดมากตอนที่ตัวเอกตัดสินใจจัดกลุ่ม 3 คนไปกู้ระเบิด เค้าบอกว่าสถานการณ์จริงไม่มีทางมีเรื่องแบบนี้เกิดขึ้นเป็นอันขาด ทำให้เค้าเสียอารมณ์ = =’

มานั่งคิดๆดู สมมติว่าคนเขียนบทเค้าสามารถทำให้คนดู 95% ทั่วโลกบันเทิงไปกับหนังโดยไม่สะดุดเลยได้จนจบเรื่อง และไม่ต้องสนใจคน “วงใน” อีก 5% เลย ว่าจะคิดยังไง มันก็ดูคุ้มค่าที่จะทำนะ ไม่รู้จะเอาเงินไปจ้างที่ปรึกษาด้านวิทยาศาสตร์ การแพทย์ คณิตศาสตร์ โบราณคดี blah blah ไปทำให้คนอีก 5% พอใจไปทำไม

ผมมาจบที่ข้อสรุปว่า “ความไม่สมจริง” ไม่ใช่เหตุผลที่ทำให้หนังมันไม่ดีที่สามารถใช้เอามาบอกคนอื่นได้ (ยกเว้นชัวร์ว่าเป็น 5% ด้วยกัน) … หรือว่ายังไง ?

ถ้าจะให้ผมพูดในฐานะที่เป็นคนใน “5%” ของบางเรื่อง อย่างถ้าใครเคยดูเรื่อง Antitrust ไม่รู้จะมีคนสงสัยเหมือนผมรึเปล่าว่า บริษัทยักษ์ใหญ่จะแย่งตัวหนุ่มน้อยอัจฉริยะผู้เขียนโปรแกรมภาษา “Java” ได้ (ซึ่งมีคนเขียนเป็นอยู่ล้นตลาด) ไปทำงานทำไม =_=” อย่าลืมกดดูให้ถึงหน้าจอที่แสดงโค้ด Java สำหรับทำ Satellite Uplink .. หนังเรื่องนี้พยายาม feature ผลิตภัณฑ์ของ Sun ทั้งเรื่องเลย  …. ไม่อยาก spoil เพิ่มแต่ลองไปดูแล้วกันว่าคนพวกนี้พยายามกันขนาดไหนเพื่อจะ “ขโมย” โค้ด “Java” ของคนอื่น

แต่ก็ต้องยกให้ว่าเรื่องนี้ในด้าน GUI มันค่อนข้างจะสมจริงมาก จะมองมุมไหนคอมพิวเตอร์ก็น่าเกลียดเหมือนจริง +__+’

ถ้าหนังเรื่องไหนสามารถกำจัดความไม่สมจริงที่ถูกสั่งสมขึ้นมาโดยเรื่องอื่นๆได้นี่ ก็จะได้เป็น Hero ไปเลย :’) ยกตัวอย่าง Trinity ใช้ nmap ใน The Matrix (เคยลองๆใช้โปรแกรมนี้ตอนไปแข่ง Network Security Contest ด้วยนะ!) อันนี้ได้ใจคน 5% ไปชัวร์ๆ

หรือคุณว่ายังไง ??

The search for ‘Edge’

280px-Roulette_-_detail

 

ถ้ามีเกมเกมนึงมีกฎว่า โยนเหรียญเที่ยงตรงแล้วออกหัว จะได้ 1.001 บาท แต่ถ้าออกก้อย จะต้องเสียเงิน 1.000 บาท มันจะเป็นเกมที่น่าเล่นมากๆ เพราะเหรียญเที่ยงตรงยิ่งโยนมากเท่าไหร่ จำนวนที่ออกหัวต่อที่ออกก้อยก็จะเข้าใกล้ 1 มากกว่านั้น

ในกรณีแบบนี้ จะเห็นว่าผู้เล่นค้นพบ ‘กลยุทธ’ ที่จะทำให้ตัวเองได้กำไร (เสมอ) จากการพนันได้ พูดอีกแบบว่าผู้เล่นมี ‘Edge’ สำหรับเกมโยนเหรียญอันนี้

เรื่องอื่นๆที่ไม่ใช่เรื่องการพนันก็คล้ายๆกัน

  • ร้านอาหารมี edge เหนือร้านอื่นคือทำเลดี ลูกค้าติดปากอาหาร พ่อครัวเก่ง ….
  • กระเป๋า/ นาฬิกา/ เสื้อผ้าแบรนด์ดังมี edge คือคนติดแบรนด์ เป็นค่านิยมของสังคม
  • เซลล์มี edge คือหน้าตาดี พูดเก่ง เครือข่ายเยอะ โน้มน้าวเก่ง
  • บริษัทโทรคมนาคมมี edge คือได้สัมปทาน จำนวนคู่แข่งมีจำนวนจำกัด
  • ผู้นำเข้าสินค้ามี edge คือช่องทางนำเข้าที่ต้นทุนต่ำกว่ารายอื่น
  • เจ้าของ software house มี edge คือ connection เยอะมากคอย source งานให้เรื่อยๆ
  • เทรดเดอร์มีอัลกอริทึมจะทำให้เทรดได้โดยได้กำไรในระยะยาวและจำกัดความเสี่ยง
  • …. มากมาย

ถ้าไม่รู้สึกว่ามี edge ในสิ่งที่กำลังจะทำแล้ว โอกาสจะประสบความสำเร็จในสิ่งที่ทำคงมีน้อย ทุกวันนี้คุณมี ‘edge’ ในสิ่งที่ตัวเองทำ (หรือกำลังจะทำ) อยู่รึเปล่า ?

จับโจรขโมยรูป

เมื่อเร็วๆนี้เห็นคนแอด facebook มา … รูป profile ดึงดูดเกินมาตรฐานเพื่อนไปมาก >_< … แต่ไม่รู้ว่าเป็นใคร …..’’

FacebookTheft

ปกติเวลามีคนไม่รู้จักแอดมา ถ้าไม่ได้ใช้รูป profile เป็นรูปคนผมจะดองไว้พักใหญ่ๆ (เผื่อตอนหลังเปลี่ยนรูปแล้วจำหน้าได้) แต่ถ้าเป็นหน้าคนแล้วไม่รู้จัก รอซักพักนึงไม่นานผมก็จะ Ignore ไป ครั้งนี้ก็เช่นเดียวกัน ผมดองไว้พักใหญ่ๆ จากเดิมที่ mutual friends ไม่มีเลย จนเริ่มเพิ่มจาก 3 …. 5 …. 8 …. 11 (จากการสังเกตพบว่าเกือบทั้งหมดเป็นผู้ชาย)

Mutual

Mutual friends ส่วนใหญ่เป็นคนที่จบ ม.ปลาย โรงเรียนเดียวกัน …. หรือว่าคนนี้มันจะคนดังโรงเรียนเราวะ …. อ่ะๆ ไหนๆก็ไหนๆ ขอเข้าไปเก็บข้อมูลเพิ่มหน่อยแล้วกัน ว่ะฮะๆๆ .. accept

ปรากฎว่า

  1. เข้าวอลล์อันดับแรก …. มันเป็นใครวะ ?!? ข้างในวอลล์ไม่มีอะไรเลย เขียนเพิ่มไม่ได้ แล้วก็มีเขียนบอกไว้ว่า ถ้าอยากติดต่อให้ message ไปหา ….. เฮ้ย!
  2. แน่นอน ดูรูป! มีอัลบั้มรูปเพิ่มอีกอันนึงเป็นรูปเหมือนถ่ายที่งานอะไรซักอย่าง แล้วเหมือนกำลังซ้อมอะไรอยู่ คนข้างหลังรูปมีอยู่คนนึง หน้าไม่ค่อยเหมือนคนไทย –_-‘ เริ่มเอะใจ แถมยังคอมเม็นต์รูปไม่ได้อีก ปกติถ้ารูปดีขนาดนี้จะมีพวกเข้ามาเม้นต์ว่า “น่ารักจังครับ ผม%sนะ อยากรู้จัก”

เริ่มสงสัยว่าตกลงนี่มันรูปอะไรกันแน่ การเสิร์ชหารูปดาราจากชื่อนั้นเป็นเรื่องปกติที่ใครๆก็ทำกันอยู่แล้ว แต่ไอ่การมีรูปดาราแล้วจะสาวกลับไปหารูปนี่ … วิธีปกติคือต้องถามคนที่รู้เยอะๆ หรือไม่ก็ถามตามเว็บบอร์ด แถมดาราสาวเกาหลีสมัยนี้หน้าตาเหมือนกันอย่างกะปั๊มออกมาจากโรงงาน HTC … จะหาเจอได้ไงหว่า

ยังโชคดีที่โลกเรามีสิ่งที่เรียกว่า Reverse Image Search!

Reverse

การใช้งานง่ายมาก แค่อัพโหลดรูปที่จะหาขึ้นไป ระบบจะหาให้ว่ามีรูปคล้ายๆกันอยู่ที่ไหนบ้าง จากการทดลอง ถ้ามี text มาโปะหน้ารูปนิดหน่อย / รูปโดน crop / รูปเอียง / เบี้ยว / distort นิดหน่อย มันก็หาเจอนะ!

ผลลัพธ์ …. tadaaaaa~!

Result

ปรากฎว่ารูปนี้เป็นของดาราจากประเทศขวัญใจเยาวชนไทยคนนึง ชื่อ Sandara Park (박산다라) ครับ

(หมั่นไส้ล่ะสิ เวลาเห็นคนเขียนชื่อแล้ววงเล็บชื่อเกาหลี – -‘ ก็เห็นเด็กๆเค้าชอบทำกันอยากทำบ้าง ไม่งั้นจะมี Unicode ไปทำไม)

dd2

สรุปสั้นๆของนิทานเรื่องนี้

  • Bandwagon effect มันมีผลมากกับการ add friend
  • มองโลกในแง่ร้าย คนที่กระทำการในลักษณะนี้จะสื่อสารกับเหยื่อที่หลงเข้ามาแบบ private เท่านั้น ไอ่การสื่อสารผ่านวอลล์ คอมเม็นต์ จะโดนปิดหมด ไม่ให้เหยื่อได้ข้อมูลเพิ่มจากเหยื่อคนอื่น พอการสื่อสารเป็นแบบ private แล้ว การล่อลวงก็จะทำได้ง่ายขึ้น
  • มองโลกในแง่ดี อาจจะมีเพื่อนโรงเรียนเก่าล่ะมั้ง ที่แค่ชอบดาราคนนี้ล่ะมั้ง เลยต้องเอารูปทั้ง profile ทั้งอัลบั้มอื่นเป็นคนนี้หมดเลยล่ะมั้ง ขี้อายก็เลยไม่อยากให้คนเขียนวอลล์แล้วให้เมสเสจไปคุยล่ะมั้ง ….
  • ผมจะไปลบ friend ที่เพิ่งแอดทิ้ง
  • ผมเข้าไปเสพย์รูป Sandara Park (박산다라) ต่อได้ถ้าต้องการ 😛

รีวิว The Art of the Start

TheArtOfTheStart

เพิ่งอ่านจบครับ ได้ยินชื่อหนังสือเล่มนี้ครั้งแรกนานมาแล้ว แต่ได้ยินจากที่ไหนจำไม่ได้แฮะ น่าจะเป็นหนังสือแนะนำของพวก developer เจ้าของบลอกดังๆซักคน จนเมื่อเร็วๆนี้เองไปเจอ video บรรยายโดย Guy Kawasaki หรือคนเขียนหนังสือเล่มนี้นั่นแหละ ดูแล้วชอบมากๆๆๆ ก็เลยตัดสินใจไปถอยมาทันทีจากคิโนะฯพารากอน

เนื้อหาประมาณ 200 หน้า ถือว่าไม่ยาว อ่านเพลินมากๆ ตอนอ่านก็คิดตามไปโดยเทียบกับประสบการณ์ที่เคยเจอมาในชีวิตด้วย แต่ยอมรับว่ามันก็มีบางเรื่องที่อ่านไม่ค่อยเข้าใจเท่าไหร่ อาจจะเป็นเพราะยังไม่มีประสบการณ์พอ – -‘a

หนังสือเล่มนี้ให้ข้อคิด และตบหน้าความเชื่อของผมหลายๆอย่างครับ ยกตัวอย่างให้ฟังเป็นบางเรื่อง ถ้าอ่านจากหนังสือจะพบว่ามันเป็น structure มากกว่านี้มาก

  • เรื่อง 10/20/30 – ทำ slides 10 หน้าเท่านั้น และบรรยาย 20 นาที และใช้ฟอนต์ 30 pts (หรือขนาดเท่ากับอายุมากสุดของคนที่มาฟังหารสอง)
  • สร้าง mantra ไม่ใช่ mission statement
  • ทำสิ่งที่มีความหมาย ไม่ใช่ทำเพราะอยากได้เงิน แต่การทำสิ่งที่มีความหมายก็ต้องการเงิน ต้องการ business model ที่ทำให้อยู่ได้ ไม่งั้นก็อดตาย
  • กว่าจะทำ market research จนพิสูจน์ได้ว่าตลาดมันมีอยู่จริง คู่แข่งมันก็เต็มไปหมดแล้ว จะรอ proven market ก็รอกินฝุ่นได้เลย (อันนี้มีแอบกัด Gartner)
  • งานสำคัญอย่าง branding หรือเขียน business plan สำคัญเกินกว่าจะจ้าง consultant ข้างนอกทำ หรือจะจ้างก็เอาไว้ตรวจสอบก็พอ
  • หลายคนอยากทำ product หรือ service ของตัวเองแต่ทำไม่ได้เพราะเรื่องเงิน ต้องรับงานพวก consulting คือการทำตาม requirement ลูกค้าไปก่อนโดยพยายามเอา product ที่ทำไปเป็นส่วนประกอบ พอเงินพอ + ลูกค้าเยอะพอ ลุกค้าก็จะวิ่งเข้ามาหา product/service ของเราแทน (ไม่ต้องเข้าหาลูกค้าเหมือน consulting)
  • จ้างคนที่เสพย์ติด และเชื่อในความหมายที่เราจะสร้างไปด้วยกัน
  • เลือกเพื่อนร่วมงานที่หลากหลาย หาคนเห็นต่าง หาคนมีเน็ตเวิร์คเยอะ หาคนชอบ implement หาคนไอเดียบรรเจิด หา …. (มีลิสต์ในหนังสือ)
  • เทคนิคการพูด + การนำเสนอ … อันนี้รู้สึกเป็นประโยชน์กับตัวเองมากเพราะยังพูดไม่ค่อยเก่ง
  • การหาลูกค้าที่ชื่นชอบ product/service ของเราเพื่อขอความช่วยเหลือให้เป็นแนวร่วมในการเจาะตลาดเพิ่ม – สร้าง evangelist — evangelist ไม่ต้องการผลตอบแทนในรูปแบบเงิน แต่ถ้าได้เสื้อหรือแก้วน้ำ หรืออะไรที่ทำให้รู้สึกว่าเป็นลูกค้าคนพิเศษจะดีใจมาก
  • สร้าง exit ที่ง่ายให้กับลูกค้า — การสมัครสมาชิกที่ยกเลิกสมาชิกได้ง่ายๆ จะทำให้ลูกค้ารู้สึกดีกว่า
  • ไม่มีบริษัทที่สร้างมาให้ยิ่งใหญ่เหมือน Microsoft, Apple, Google (ตอนนี้) ตั้งแต่แรก ให้เริ่มจากตลาดที่ยักษ์ใหญ่จะเจาะไม่ถึง แต่ไม่คิดจะเจาะก่อน แล้วค่อยๆขยายไป .. แม้แต่ MS, Apple, Google ก็ทำแบบนี้เช่นกัน
  • การล้มเหลวไม่ใช่เรื่องใหญ่ ตราบใดก็ตามที่ยังลองใหม่ได้
  • …. อีกมากมายนับไม่ถ้วน

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

Correlation ในราคาหุ้น

ช่วงนี้สนใจเรื่องแนวๆ quantitative มากเป็นพิเศษ อ่านไปเรื่อยๆก็สนุกดี แต่บางทีก็อดรู้สึกไม่ได้ว่านี่เอาเวลามาทำอะไรอยู่ฟะเนี่ย -*- ยิ่งทำๆไปแล้วยังไม่เห็นผลลัพธ์ที่จับต้องได้นี่ มันจะเริ่มหงุดหงิดๆ 555+

Correlation นี่มันเป็นความสัมพันธ์เชิงสถิติระหว่างข้อมูล (ในที่นี่ก็หมายถึงพวกราคานั่นแหละ) ซึ่งบางทีการที่ข้อมูลสองชุดมัน correlate กัน ก็ อาจจะ แปลว่ามีความสัมพันธ์อะไรบางอย่างอยู่เบื้องหลังก็ได้

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

ใน Excel มีฟังก์ชันสะดวกๆให้ใช้ชื่อ CORREL ส่วนใน Python เข้าใจว่าใน SciPy ก็มีเหมือนกัน แต่บางครั้งคนเราควร Reinvent the Wheel บ้าง เพื่อความบันเทิง 😛

Pearson

วิธีการตีความผลลัพธ์คือ

  • ถ้าได้ค่าใกล้ 1 มาก แปลว่ามันขึ้นลงพร้อมๆกันมากๆ (correlate)
  • ถ้าได้ค่าใกล้ 0 แปลว่ามันแทบจะไม่ correlate กันเลย
  • ถ้าได้ค่าใกล้ 1 มาก แปลว่ามันจะขึ้นลงกลับกันมากๆ (correlate)
def corr(series1, series2):
"""Calculate Pearson's product-moment coefficient

More info: http://en.wikipedia.org/wiki/Correlation_and_dependence#Pearson.27s_product-moment_coefficient

"
""
if len(series1) != len(series2):
raise Exception((series1, series2), 'Lengths of series are not equal')

n = len(series1)
sum_x = sum(series1)
sum_y = sum(series2)
sum_sqx = sum(a*a for a in series1)
sum_sqy = sum(a*a for a in series2)
sum_xy = sum(map(lambda s: s[0] * s[1], zip(series1, series2)))

import math
res = (n*sum_xy - sum_x*sum_y)/(math.sqrt(n*sum_sqx - sum_x*sum_x)*math.sqrt(n*sum_sqy - sum_y*sum_y))

return res

ตัวอย่างที่ค่อนข้าง obvious:

  • [1,2,3] กับ [3,4,5] ได้ 1.0
  • [1,2,3] กับ [-3,-4,-5] ได้ -1.0

ลองเอามาทดสอบกับราคาหุ้นดู ช่วงนี้ผมมีฐานข้อมูลราคาเป็นของตัวเองแล้ว (จากการไป pull ข้อมูลมาจากเว็บสาธารณะ) เก็บใส่ mongdb ไว้ ใช้คู่กับ Python สะดวกโยธินมาก (เอาเวลาตอนไหนไปทำวะเนี่ย)

ทดสอบกับ data 500 วันล่าสุด

  • CPF กับ CPALL = 0.96  — ขึ้นลงตามกันโคดๆๆ .. แน่ล่ะ
  • CPF กับ TUF = 0.94 — อาหารเหมือนกันมั้ง
  • BBL กับ KBANK = 0.94 — กลุ่มธนาคารเหมือนกัน
  • PS กับ QH = 0.89 — อันนี้อยู่ใน sector อสังหาเหมือนกัน
  • DTAC กับ ADVANC = 0.74 — ไม่เยอะอย่างที่คิด
  • CPN กับ CPF = 0.37 — ห้างเซ็นทรัล กับ อาหาร
  • CPF กับ CAWOW = –0.68 – ไก่ ลง ฟิตเนส ขึ้น ??
  • TRC กับ PS = -0.11 — ไม่ค่อยเกี่ยวกันเท่าไหร่ …
  • ..

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

สรุปว่าถ้าลองทำกับทุกคู่ในตลาด (ประมาณ 500 ตัว) น่าจะพอเห็นอะไรบ้าง … ไว้เวลาเอื้ออำนวยอีกรอบละกัน 🙂

ช่วงนี้ความสนใจเยอะจัด สับสนมาก เลือกทำไม่ถูก – -‘ อย่างนึงที่ทำก็คือไล่อ่านบลอกของไอดอลคนใหม่อยู่ (Max Dama) ใครสนใจเรื่องพวก automated trading ต้องลองเข้าไปดู มีอะไรให้เก็บเกี่ยวเยอะแน่นอน

กูเกิ้ลโค้ดแยม : รอบคัดเลือก 2010

ครั้งนี้ตัดคำว่าเฉลยออกแล้ว ลดความมั่นใจลงหน่อยนึง – -‘a 

แต่ตั้งแต่ทำมา 3 ปี ปีนี้เป็นปีแรกที่ได้คะแนนเต็มรอบแรก T_T ดีใจ

ข้อแรก Snapper Chain

ถ้าเปลี่ยน ON เป็นเลข 1 แล้ว OFF เป็นเลขศูนย์ แล้วให้ปลั๊กไฟหลัก (Power) อยู่ซ้ายสุด

ถ้ามี Snapper สองอัน มันจะวิ่งตามลำดับนี้

00
10
01
11 <— Light on!
00
10 …

ถ้าเป็น 3 อัน ก็พอจะเดาได้ว่ามันก็เป็นแบบนี้

000
100
010
110
001
101
011
111 <— Light on!

สรุปว่ามันก็เหมือนกับนับเลขฐานสองกลับหลัง ดังนั้นถ้ามี snapper n อัน กรณีที่จะทำให้หลอดไฟติดได้ก็คงต้องเป็นการ snap เป็นจำนวน (c * 2^n) – 1 เท่านั้น (โดย c เป็นจำนวนเต็ม … บวก)

if __name__ == '__main__':
fin = 'A-large.in'
fon = 'A-large.out'

fi = open(fin, 'r')
fo = open(fon, 'w')

c = int(fi.readline())
for i in xrange(c):
n, k = [int(x) for x in fi.readline().split(' ')]
ans = (k % 2 ** n) == 2 ** n - 1
fo.write("Case #%d: %s\n" % (i + 1, 'ON' if ans else 'OFF'))

print "Done!"
fi.close()
fo.close()

ข้อสอง Fair Warning

ข้อนี้เข้าใจว่าเป็นเรื่องแนวๆ number theory

มีคนอ่านโจทย์แล้วงงเยอะมาก โจทย์มันถามว่า ต้องใช้เวลานานอย่างน้อยเท่าไหร่ ถึงจะทำให้ ตัวหารร่วมมากสุด (ห.ร.ม. – Greatest Common Divisor (GCD)) มีค่ามากที่สุด

ในโจทย์ตัวอย่างเป็น 26000 11000 6000 ดังนั้นถ้าเวลาผ่านไป 4000 sec (ซึ่งเป็นคำตอบที่ถูกต้อง) จะทำให้กลายเป็น 30000 15000 10000 และทำให้เลขชุดนี้มี GCD เป็น 5000 ซึ่งไม่ว่าจะเป็นเวลาก่อน 4000 sec หรือหลัง 4000 sec ไปอีกนานเท่าไหร่ก็ตาม GCD ที่หาได้ก็จะมีค่าไม่เกิน 5000 แน่นอน เช่นถ้าผ่านไปแค่ 2000 sec จะได้เลขชุดนี้เป็น 28000 13000 8000 ซึ่งมี GCD = 1000 (น้อยกว่า 5000)

ขอแทนเวลาที่ผ่านไปเรื่อยๆ ด้วยแถบยืดๆ x (ซึ่งยืดได้เท่าไหร่ก็ไม่รู้ แต่ต้องยืดเท่าๆกันสำหรับแต่ละ event)

<===== x ===…==><==  6000 ==>

<===== x ===…==><== 11000 ======>

<===== x ===…==><== 26000 ================>

หรือถ้าเรา define ให้ y = x + 6000 จะกลายเป็นรูปนี้ (เลือก 6000 เพราะเป็น MIN)

<===== y ===…=======>

<===== y ===…=======><== 5000 ======>

<===== y ===…=======><== 20000 ===========>

ทีนี้เราก็จะหา GCD ของ y, y+ 5000, และ y + 20000 .. ยกคุณสมบัติ GCD ที่จะใช้มาทวนก่อน

  • gcd(a, b) = gcd(b, a) …. สลับที่
  • gcd(a, gcd(b, c)) = gcd(gcd(a, b), c) …. เปลี่ยนกลุ่ม
  • gcd(a, b) = gcd(b, a – b) … กรณี a > b

จากรูปด้านบน ถ้าเราหา GCD ระหว่าง y กับบรรทัดอื่นๆ ทีละคู่ จะได้อะไรประมาณนี้ออกมา

<===== y ===…=======>

<== 5000 ======>

<== 20000 ===========>

กลายเป็น gcd(5000, 20000, y) ทำโน่นนี่ไปมาจะได้ GCD = gcd(gcd(5000, 20000), y)

เนื่องจากว่าเราให้ y เป็นอะไรก็ได้อยู่แล้ว ดังนั้น MAX GCD = gcd(5000, 20000) = 5000 แน่นอน!

ต่อมา เราต้องการทราบ x น้อยที่สุด (เวลาน้อยที่สุดที่จะทำให้ได้ MAX GCD) ซึ่ง y = x + 6000

พบว่าในเคสนี้ x น้อยสุดเป็น 4000 ซึ่งทำให้ y เป็น (+) ได้ และหาร MAX GCD = 5000 ลงตัว

ขอสารภาพว่า … ข้อนี้ตอนทำไม่ได้คิด math แบบข้างบนหรอก (อ้าววว) นั่งวาดรูปๆๆๆ เดาๆๆ แล้วลองมั่วๆกับ sample ดู ถูกเคสเล็กก็ลองเคสใหญ่เลย ไอ่ที่ทำ math เพราะพยายามหาข้อสนับสนุนวิธีที่ทำไป(แล้ว) = =’

ขอขอบคุณ Python ทำให้ไม่ต้องไปวุ่นวายเรื่อง BigInteger แล้วก็ยังแถม fractions.gcd มาให้อีก!

(แอบภูมิใจบรรทัด reduce TvT)

import fractions

if __name__ == '__main__':
fin = 'B-large.in'
fon = 'B-large.out'

fi = open(fin, 'r')
fo = open(fon, 'w')

c = int(fi.readline())
for i in xrange(c):
ts = [int(x) for x in fi.readline().split(' ')][1:]
m = min(ts)
tns = [x - m for x in ts]
unit = reduce(lambda x,y: fractions.gcd(x,y), tns)
r = m % unit
ans = unit - r if r else 0
fo.write("Case #%d: %d\n" % (i + 1, ans))

print "Done!"
fi.close()
fo.close()

ข้อสาม Theme Park

ข้อนี้ใช้วิธี pre-computed (หรือจะเรียกว่า cache ?) อะไรที่มันทำได้ไว้ก่อน ทำให้ตอนคำนวณจริงๆไม่ต้องทำอะไรซ้ำๆ แต่ถ้าทำแค่นี้มันจะยังไม่เร็วพอ (โดยเฉพาะถ้าเป็นโปรแกรม Python รันดิบๆ T_T’)

แนวคิดคือ ในการเล่นรอบใดๆที่มี group ที่อยู่หัวคิวเป็น group เดียวกัน (เช่นรอบ 3 กับรอบ 5 มี g1 เป็นหัวคิวเหมือนกัน) จะเก็บเงินได้เท่ากันเสมอ และหัว group ในรอบถัดไปก็จะเป็น group เดียวกันเสมอ …

ดังนั้นไอ่การคำนวณจำนวนคนนั่งในแต่ละรอบนี่ ทำครั้งเดียวก็พอ (สำหรับรอบที่ขึ้นต้นด้วยแต่ละ group) และก็ควรบันทึกไว้ด้วย ว่าหลังจาก group นี้เล่นในรอบนี้แล้ว รอบถัดไปจะเป็น group ไหน จากตัวอย่าง

grou: [1, 4, 2, 1]

hist: [5, 6, 4, 6]

next: [2, 3, 1, 2]

อันนี้บอกว่า ถ้าเริ่มที่ g0 เก็บเงินได้ 5 ในรอบนั้น, g1 เก็บได้ 6, ….

และถ้าเริ่มที่ g0 รอบถัดไปจะเริ่มที่ g2, เริ่ม g1 ถัดไปเริ่มที่ g3, เริ่ม g2 ถัดไปเริ่มที่ g1, …

โจทย์กำหนดมา r รอบ ก็แค่บวก hist แล้ววนตาม next ต่อไป r ครั้งก็น่าจะได้คำตอบแล้ว แต่อาจจะไม่ทัน …

ถ้าสังเกต next ดีๆ จะเห็นว่ามันวนซ้ำๆ

  • g0 –> g2 –> g3 –> g1 –> g2 –> g3 –> g1 –> g2 –> g3 –> g1 –> g2 –> ….
  • g0 –> (g2 –> g3 –> g1 –>)*  ….

จะเห็นว่ามี loop g2 –> g3 –> g1 วนซ้ำไปมา เราสามารถคิดเงินรวมได้เป็น hist[2] + hist[3] + hist[1] และการวนนี้ใช้เวลา 3 รอบ

ถ้าเรารู้ว่าในการเล่นเครื่องเล่น r รอบมันมีการวนแบบนี้เกิดขึ้นกี่ครั้ง ก็เอาจำนวนรอบมาคูณค่าเล่นรวมได้เลย จะลดการคำนวณไปได้มากเลยทีเดียว เพราะบางเคสมันเล่นตั้ง 10^8 รอบ

ข้อนี้โค้ดผมยาวและซับซ้อนผิด concept มาก – -‘ ปัญหาหลักเกิดจากการเลือกใช้ data structure ไม่ถูกต้อง ผมดันไปใช้เป็น linked structure แบบที่เห็นด้านบน ทำให้ทั้งการหา loop อะไรมันทำยากไปหมด ทั้งๆที่มันทำเป็น list ธรรมดาก็ได้แล้ว

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

ว่าด้วย Big Integer

ข้อสองดักคอคนเขียน C++ สุดๆ เพราะ input/output มันเกิน range ของ int, long ไปเยอะมากๆๆ (10^50)

หลังจากไปไล่อ่านโค้ดเพื่อนบ้านมาว่าแต่ละคนแก้ปัญหายังไง เพื่อนบ้านเขียนกันหลายภาษามาก Python, Ruby, C#, C++, Java, Scala, .. ได้ข้อสรุปว่า

  • Python – ไม่ต้องทำอะไร เด๋วมันเพิ่มขนาดให้เอง
  • C/C++ – ปกติใครๆในอินเทอร์เน็ตก็จะแนะนำให้ใช้ GNU MP (GMP – http://gmplib.org/) แต่เชื่อว่าหลายคนเห็นว่าเป็น GNU ก็คงไม่อยากยุ่งด้วยแล้ว ด้วยความชันของการเรียนรู้เพื่อใช้งาน (ผมคนนึงล่ะ) แล้วก็มีคนใช้ http://mattmccutchen.net/bigint/ ผมว่า lib มันดูใช้ง่ายน่าใช้มากเลยอ่ะ บางคนก็เคยเขียน big num ไว้ใช้เอง (จริงๆ)
  • Java BigInteger!
  • C# – เข้าใจว่า pre 4.0 ยังต้องหา lib ข้างนอกมาใช้เอง ส่วนถ้า 4.0+ (Visual Studio 2010) มี System.Numerics.BigInteger ให้ใช้ (พร้อมเมธอด GreatestCommonDivisor) เฉพาะเรื่องนี้ตามหลัง Java ไม่รู้กี่ปี 555+

ส่วนตัวรู้สึกสอบรอบนี้ โจทย์เน้นหนักไปทางคนที่ถนัดคิดแบบ verbally ซะเป็นส่วนใหญ่ (คือคนที่คิดเป็นข้อความ คำพูด พวกตรีโกณมิติ พีชคณิต ทฏษฏีจำนวน) คนที่ถนัดคิดแบบ visually จะเสียเปรียบ

Code Jam 2010 participants from Thailand http://www.go-hero.net/jam/10/regions/Thailand

ใครมีอะไรมาแชร์ คอมเม็นต์มาโลดด~