Jul 25 2010

The search for ‘Edge’

Category: Lifem3rLinEz @ 00:15

280px-Roulette_-_detail

 

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

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

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

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

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

Tags: ,

Jun 27 2010

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

Category: Generalm3rLinEz @ 14:24

เมื่อเร็วๆนี้เห็นคนแอด 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 (박산다라) ต่อได้ถ้าต้องการ :P

Tags: , , ,

Jun 17 2010

รีวิว The Art of the Start

Category: Generalm3rLinEz @ 22:34

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 ก็ทำแบบนี้เช่นกัน
  • การล้มเหลวไม่ใช่เรื่องใหญ่ ตราบใดก็ตามที่ยังลองใหม่ได้
  • …. อีกมากมายนับไม่ถ้วน

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

Tags:

Jun 13 2010

Correlation ในราคาหุ้น

Category: Generalm3rLinEz @ 21:20

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

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

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

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

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 ต้องลองเข้าไปดู มีอะไรให้เก็บเกี่ยวเยอะแน่นอน

Tags: , ,

May 9 2010

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

Category: Generalm3rLinEz @ 09:34

ครั้งนี้ตัดคำว่าเฉลยออกแล้ว ลดความมั่นใจลงหน่อยนึง - -‘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

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

Tags: , , ,

May 2 2010

ว่าด้วย M79

Category: General | Lifem3rLinEz @ 11:25

Grenade_launcher_M79_1

ช่วงนี้ตูมตามกันใหญ่ เลยลองไปหาอ่านข้อมูลเพิ่มเติมเกี่ยวกับ M79 มาครับ เผื่อว่าจะมีประโยชน์ในการป้องกันตนเอง พอจะสรุปเป็นประเด็นได้ดังนี้

- M79 มันเป็นชื่อ ปืนยิงระเบิด ไม่ใช่ชื่อของระเบิดจริงๆ จริงๆแล้วมันยิงระเบิดได้หลายแบบมากสังแบบสังหารระยะใกล้ หรือยิงระเบิดระยะไกลแบบที่เจอในไทย

- ระเบิดที่เจอในไทยมีชื่อเรียกเฉพาะจริงๆว่า M406

- ตอนเริ่มยิง หัวระเบิด M406 จะวิ่งออกจากปากกระบอก M79 ด้วยความเร็วประมาณ 75 เมตร / วินาที หรือเท่ารถยนต์ความเร็ว 270 กม. / ชม. … โอ้ววว ที่ยกมาตรงนี้เพราะคิดว่าระหว่างหัวระเบิดวิ่งมันน่าจะมองเห็นทันด้วยตาเปล่าและมี action เช่นการหมอบลงพื้น ได้ทัน

- ตอนระเบิด หัวระเบิด M406 จะให้สะเก็ดระเบิดออกมาประมาณ 300 ชิ้นถ้วนออกมารอบทิศทาง (ถ้าใครไม่คุ้นกับคำว่าสะเก็ดระเบิด ให้คิดว่ามันเป็นกระสุนดีๆนี่เอง) ด้วยความเร็ว 1,524 เมตร / วินาที (อันนี้คงไม่ต้องเทียบกับรถยนต์ เพราะคงรู้นะว่ามันเร็วมาก - -‘’)

- เสียงเดินทางที่ความเร็ว 340 เมตร / วินาที ที่อากาศ 20 °C และความหนาแน่นอากาศระดับน้ำทะเล

- นั่นแปลว่า สะเก็ดระเบิดเดินทางเร็วกว่าเสียง และจังหวะที่เราได้ยินเสียงระเบิด คาดว่าสะเก็ดระเบิดคงฝังในตัวเรียบร้อยแล้ว o__o’ ฮะ!!?! ดังนั้นตอนที่ได้ยินเสียงระเบิด มันไม่มีโอกาสเลยที่จะทำ action เช่นการหมอบ … ยกเว้นจะทำเพื่อหลบระเบิดลูกถัดไป …

- ตัวลูกระเบิดมีระบบรักษาความปลอดภัย … ให้ผู้ยิง (เอ๊ะ!) ด้วยการการรันตีว่าจะไม่ระเบิดภายในระยะ 30 เมตรหลังจากที่มันโดนยิง ดังนั้นถ้าอยู่ใกล้คนยิง 30 เมตรก็จะปลอดภัย …. แต่ถ้าเห็นหน้าคนยิง ก็อาจจะโดนเก็บอยู่ดี =_=’’ โอ้ยย

- ยิงได้ไกลที่ประมาณ 350 – 400 เมตร  แต่ถ้าระเบิดตกใกล้ตัวในรัศมี 5 เมตร (เกือบเท่าตึก 2 ชั้น) การันตีว่าตาย  - -‘’

- ตอนเรียน นศท. (รด. นั่นแหละ) ทหารแตงโมรึเปล่าก็ไม่รู้ สอนว่าให้ “หมอบ” หลบระเบิด เพราะวิถีสะเก็ดระเบิดจะพุ่งออกมาเป็นตัว V แบบรูปด้านล่าง ดังนั้นการหมอบจะมีโอกาสหลบได้เยอะสุด อีกอย่างนึง (อันนี้ไม่แน่ใจ) ให้คว่ำหน้าเอาตาแนบกับมือเป็นการเก็บอวัยวะสำคัญ

Trajectory

- แต่ประเด็นคือระเบิดแบบที่ทหารบอก มัน assume ว่าระเบิดจากที่พื้น  แล้วถ้าระเบิดบนหลังคา BTS หรือต้นไม้ข้างๆ หรือกำแพงตึกล่ะ ??

Trajectory2

- ผมมานั่งคิดๆดูแล้ว คิดว่าสถานการณ์ส่วนใหญ่การหมอบ work สุดนะ เพราะโอกาสมันคงน้อยมากที่จะยิงแล้วไประเบิดบนเพดาน (ซึ่งเป็นกรณีแย่สุดของการหมอบ  - -‘ ) นอกนั้นก็โอเค

- ดังนั้น ผมคิดว่ากรณีทั่วๆไป ถ้าเราสามารถทำนายได้ว่าต่อไปจะมีเหตุระเบิดเกิดขึ้น หรือเห็นคนกำลังชู M79 กำลังจะยิงเลย ให้หมอบไว้น่าจะดีสุด (หวังว่าจะไม่มีใครทะลึ่งวิ่งเข้าไปหลบในระยะ 30 เมตรจากคนยิง +_+)

หวังว่าคงมีประโยชน์ ไม่ว่าฝ่ายไหนจะยิง ตัวเราต้องปลอดภัยไว้ก่อน

Tags: , ,

Apr 4 2010

ทำงาน 1 ปีแรก

Category: Lifem3rLinEz @ 12:45

คิดว่านี่เป็น milestone ใหญ่ๆอันแรกในชีวิตมนุษย์เงินเดือนครับ นั่นหมายถึงผมทำงานมาครบ life cycle ของมนุษย์เงินเดือนทั่วไปแล้ว คือ

  • ตั้ง objectives
  • ทำงาน
  • ประเมิน performance กับหัวหน้างาน ว่า objectives ที่ตั้งไว้ทำได้ตามนั้นรึเปล่า ได้ระดับไหน
  • ได้เงิน fixed bonus ปลายปี
  • ได้เงิน performance-based bonus ตอนเมษา

(Your mileage may vary)

ที่ทำงานบรรยากาศดีครับ เพื่อนร่วมงานใจดีทุกคน ส่วนใหญ่จะเป็นพี่ๆ มีตั้งแต่รุ่นพี่ประมาณ 3 ปี จนถึงเพื่อนๆของอาจารย์ (ใหม่ๆ) ที่ภาคคอม 55+ แต่คนนอกมองเข้ามาในทีมอาจจะไม่รู้สึกว่าผมแตกต่างเท่าไหร่ เพราะหน้าแก่นำไปแล้ว T_T (เส้า) เคยไปประชุมกับ QA ทีมอื่น โดนเรียกพี่อีก (อ่าววว งอแง) Issues จากระดับบนในบริษัทไม่ค่อยลงมาถึงระดับผมเท่าไหร่ ส่วนหนึ่งคงเพราะ management ใน team อันได้แก่ group leaders และ manager แบกรับจัดการให้หมดแล้ว คนงานทำงานได้อย่างค่อนข้างสบายใจ :’)

เรื่องลักษณะงานที่ทำก็เคยเขียนไปบ้างแล้ว สิ่งที่ได้จากการทำงานที่นี่ คงเป็นเรื่องเทือกๆ Incident Management แล้วก็เรื่องของ Customer Support โดยที่คำถามจากลูกค้าหลายครั้งก็ถูกส่งมาในขณะที่เค้ากำลังอยู่ในขั้นตอนการ develop หรือ test ระบบ ซึ่งอาจจะไม่ร้อนแรงมาก แต่เมื่อไหร่มันมาจาก production environment มันจะเริ่มมีความร้อนขึ้นมาหน่อยๆ - -‘’ ต้องตอบให้เร็วขึ้นและหาต้นเหตุ (root cause) ให้เร็วมากขึ้น ซึ่งเคสแบบนี้ก็มีมาให้ทำเรื่อยๆ งาน specialized technical support แบบนี้มันมีอยู่เฉพาะบริษัทใหญ่ๆที่มีฐานลูกค้าใหญ่ และ “ชัดเจน” เรื่อง support เท่านั้น ดังนั้นมันก็ตามมาด้วยข้อเสียว่า career path ถ้าอยากจะโตในสาย technical มันค่อนข้างจะแคบมากอยู่

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

อีกเรื่องที่ได้ไปเต็มๆคือได้เห็นว่าคนที่เค้าอยากได้ real-time financial data ไปเนี่ยเค้าเอาไปทำอะไรกัน เรื่องนี้ก็ช่วยเพิ่มความสนใจในเรื่อง finance ให้ผมได้ระดับนึงเลยล่ะ >_<’ ตอนนี้แอบสนใจเรื่องแนวๆ Quantitative Finance อยู่หน่อยๆ มันก็เป็นความเชื่อส่วนหนึ่งของผมเลยแหละว่า skill ด้าน software development ของพวกเราวิศวคอมเนี่ย มันจะมีค่ามากที่สุดต่อเมื่อเรารู้เรื่องใน domain อื่นในเชิงลึกคู่กันไปด้วย หลายๆครั้งผมเลยพยายามหาอะไรใหม่ๆทำดูบ้าง

เรื่อง technical ผมยังไม่รู้สึกว่า skill ตัวเองพัฒนามากขึ้นเท่าไหร่ ส่วนหนึ่งเพราะบริษัทมีอะไรๆที่มันเป็นของภายในให้เรียนรู้เต็มไปหมด ประโยชน์ที่เราจะได้ติดตัวไปจากการศึกษาเรื่องพวกนี้มีแค่ idea และ concept ว่าระบบแบบนี้เค้าสร้างกันขึ้นมาให้ประสบความสำเร็จและขายได้ได้ยังไง ผมรู้จักเทคโนโลยีพวก Low-latency Message Bus ละเอียดขึ้นระดับนึงเลย ส่วนเรื่อง implementation มันก็มีการยอมรับและใช้กันแพร่หลายในบริษัทกลุ่ม financial นั่นแหละ ถ้าเปลี่ยน industry ขึ้นมา ความรู้ในระดับ imlementation พวกนี้ก็อาจจะไม่ได้ใช้เลย

ตั้งแต่ทำงานผมยังไม่เคยเจอปัญหาแบบที่เป็น technical แล้วปวดตับไป 3 วันอะไรแบบนั้นด้วยแหละ >_<’ ความลำบากส่วนใหญ่เป็นเรื่องวิธีการค้นหาข้อมูลมากกว่า ช่วงแรกๆที่ทำงานผมบ่นตลอดเวลาว่าอยากได้ internal google เพราะหาอะไรแทบไม่เจอเร้ยยย วิธีการแก้ปัญหาแบบปกติที่เอา keyword ไป search, เจอบลอก, แล้วแก้ปัญหา ไม่สามารถเอามาใช้ได้ที่นี่ ต้องเปลี่ยนวิธีการมาเป็นการค้นในตัว documentation จริงๆ แล้วก็ต้องทำความเข้าใจกับโค้ด C/C++ ขนาดใหญ่มากที่เราไม่ได้เป็นคนเขียนเอง - -‘’ มันก็เหนื่อยอยู่ แต่พอปรับตัวได้มันก็สนุกและทำให้เรากล้ามากขึ้นที่จะเข้าไปรื้อโค้ดของคนอื่นนะ นอกจากนี้ก็มี flight บังคับให้เรียนรู้เทคโนโลยีเก่าๆเพราะต้อง support บ้าง บางทีผมเห็นเพื่อนๆได้ทำงานที่เรียนรู้อะไรใหม่ๆ (โดยตัวเนื้องานเอง) ก็มีอิจฉาบ้างนิดหน่อย แต่ที่นี่ก็ยังเปิดโอกาสให้มี internal project เอามาทำได้เรื่อยๆนะ โดยถือว่าเป็นส่วนหนึ่งในการพัฒนาตนเองของพนักงาน

ทำงานมาครบปีนึงเลยเข้าใจเลยนะ ว่าเวลาไปสมัครเรียนต่อหรือย้ายงานนี่ เวลาเค้า require “ประสบการณ์” นี่ เค้าอยากเห็นอะไร? ผมคิดว่ารวมๆแล้วมันหมายถึง

  • มีความสามารถที่เป็น hard skill ในการทำงานตามงานที่กำหนดได้
  • เข้าใจเรื่องทั่วๆไปเกี่ยวกับการทำงานในบริษัท: career path, โครงสร้างเงินเดือน, การประเมิน performance, โครงสร้างองค์กร
  • ได้อยู่ในบรรยากาศการทำงานในบริษัท มีการทำงานร่วมกับคนอื่น เห็นความขัดแย้ง ….. blah balh

โดยรวมๆผมยัง enjoy กับการทำงานครับ พี่ร่วมทีมใจดี ขนมเยอะ ชีวิตราบรื่นจนรู้สึกว่า เฮ้ย สบายไปเปล่าวะ - -‘a (เอ๊ะ! ยังไง) อย่างไรก็ตาม กฎของแก๊น ยังเป็นจริงอยู่ครับ

เลือกได้แค่ 2 อันจาก

  • งานสนุก ท้าทาย ได้เรียนรู้อะไรใหม่ๆ
  • มีเวลาว่าง และมี work-life balance หรือเป็น family man
  • จ่ายดีมาก มีตังค์ซื้อของ Apple

ถ้าใครทำให้ตัวเอง “เชื่อ” ได้ว่ามีทั้ง 3 อย่างพร้อมกัน ผมว่าคุณประสบความสำเร็จระดับนึงแล้วครับ ;)

หวังว่าคนอ่านคงได้อะไรไปบ้างครับ (พี่ที่ทีมถ้าหลุดข้ามาอ่านก็อย่าลืมคอมเม็นต์นะ :P) หลักกิโลหน้าคงเป็น “ทำงาน 3 – 4 ปี แรก”

Tags: ,

Apr 3 2010

Why HTML5?

Category: Toolsm3rLinEz @ 09:59

ค่อนข้างจะเป็นเรื่องคึกโครมหลังมีข่าวเรื่องพอร์ตของ Quake II บน HTML5 ออกมา อยากจะรวบรวมงานเจ๋งๆที่เห็นไว้หน่อย เผื่อว่ายังมีคนไม่เคยดู

จริงๆแล้ว HTML5 มันมีหลาย features มาก แต่ demo ส่วนใหญ่ที่เห็นแล้วรู้สึก “อึ้ง” มักจะเป็นการใช้ Canvas ประกอบกับอาศัยการทำงานของ JavaScript ที่เร็วขึ้นมากใน Browser ใหม่ๆ

Quake II

สดๆ อันนี้น่าจะเคยเห็นกันหมดแล้ว

ผมแอบสงสัยเหมือนกัน ว่าถ้าของมันดีจริงทำไมไม่ทำ demo link ให้กดเข้าไปดูง่ายๆหว่า …’ ลองดูใน FAQ เค้าก็บอกนะว่ามันติดปัญหาลิขสิทธิ์ sth

NES (Famicom) Emulator

ผมเป็นหนึ่งในคนคลั่งไคล้ Emulator ครับ! เวลาเห็นอะไรแบบนี้ตื่นเต้นทุกที

วิธีเขียน Emulator พวกนี้ก็ต้องเขียนโปรแกรมขึ้นมาจำลองการทำงานของ CPU นั่นแหละ (รวมถึงส่วนที่เป็น game controller, video, audio, memory ด้วย) โดยทำการจำลองการทำตาม instruction แต่อันใน binary ของตัว ROM (หมายถึงตัวเกม) ความเจ๋งก็คือว่าการทำงานทั้งหมดนี้ทำใน JavaScript ทั้งหมดเลย!

Mario

Phong Shading

อันนี้คนเคยเรียนวิชากลุ่ม CG คงคุ้นหูมิใช่น้อย …’’

Phong

HTML5 Paint

ทำออกมาเกือบเหมือน Photoshop เลยทีเดียว แต่เท่าที่ผมดูมันก็ยังเอ๋อๆอยู่บ้างนะ (เช่นลาก selection แล้วขอบมันเลื่อนไปเรื่อยๆ)

เป็นเดโมอันแรกๆที่ทำมาแล้วรู้สึกว่า HTML5 เจ๋งว่ะ!

Paint

สำหรับผมแล้ว อะไรที่คลิกขวาลงไปแล้วไม่มีชื่อ Adobe โผล่มานี่ให้ความรู้สึกดีขริงๆ T-T … ไม่ได้ชิงชัง Adobe นะครับ แต่แค่มันให้ความรู้สึกว่ามันเบา (lightweight) ไม่ต้องโหลด plug-in อะไรมาเพิ่มระหว่างเราเปิดเว็บ แต่คนใหญ่คนโตบางคนก็มีวิสัยทัศน์กับ Adobe ชัดเจนเหมือนกัน โดยการทำให้ผลิตภัณฑ์เกือบทุกตัวใช้ Flash ไม่ได้ ^ ^” ไอ่เรื่อง Flash มัน bug เยอะ จริงหรือไม่จริงนี่ในฐานะผู้ใช้เราตอบได้น้อยมาก ปัญหาบางอย่างมันอาจจะเกิดมาจากคนใช้ Flash จริงๆ แต่บางที Jobs อาจจะเจอสถานการณ์แบบ Apple submit bugs ไป support ของ Adobe แล้วทางนั้นไม่ยอมแก้ซักที หรืออะไรแบบนี้ก็เป็นได้

On Google: We did not enter the search business, Jobs said. They entered the phone business. Make no mistake they want to kill the iPhone. We won’t let them, he says. Someone else asks something on a different topic, but there’s no getting Jobs off this rant. I want to go back to that other question first and say one more thing, he says. This don’t be evil mantra: “It’s bullshit.” Audience roars. 

About Adobe: They are lazy, Jobs says. They have all this potential to do interesting things but they just refuse to do it. They don’t do anything with the approaches that Apple is taking, like Carbon. Apple does not support Flash because it is so buggy, he says. Whenever a Mac crashes more often than not it’s because of Flash. No one will be using Flash, he says. The world is moving to HTML5.  

ในฝั่งชุมชนผู้พัฒนา ผมลอง surf เล่นๆดูก็เจอคำถามประเภทว่า "เริ่มใช้ HTML5 ได้รึยัง?” พอสมควร แต่ส่วนใหญ่จะได้คำตอบว่า “ยัง” เพราะพวก browser ยังไม่ค่อยพร้อมกันเท่าไหร่ ยังมี behavior ที่ไม่เหมือนกันอยู่อีกมาก

ณ เวลานี้ ส่วนตัวผมรู้สึกว่า technology มันดูมีอนาคตมากมาย ไว้อีก 3 ปีมาดูกันว่าจะเป็นยังไง (ถ้าตอนนั้นยังเขียนบลอกอยู่นะ = =’)

Tags: , ,

Mar 5 2010

ตัดคำไทยด้วย C#

Category: OOAD | .NET | Java | Nativem3rLinEz @ 02:15

WARNING: Highly technical blog ahead

กาลครั้งหนึ่งนานมาแล้ว … อาจารย์สมชายแห่ง CP เคยเอารัฐธรรมนูญฉบับเก่ากับฉบับใหม่มาเทียบความถี่ในการปรากฎของคำ ตอนนั้นผมอึ้งมากที่รู้ว่า Java มันตัดคำไทยได้ด้วย แบบ built-in มาไม่ต้องหา library อะไรมาเพิ่มเลย >_<  ถ้าผมเข้าใจไม่ผิด Java ใช้ ICU ของ IBM ที่เป็น open source แต่ตัวที่อยู่ใน class library ของ Java จะเป็นเวอร์ชันเก่ากว่าหน่อย

เจ้า ICU ที่ว่านี่นอกจากตัดคำได้ (Boundary Analysis) แล้วมันยังทำอย่างอื่นที่เกี่ยวกับกับ localization & internationalization ได้อีกมากมายก่ายกองครับ ลองเข้าไปดูกันเอง IBM ทำไว้สองชุดคือ ICU4C และ ICU4J สำหรับ C, C++ และ Java (ไม่มี .NET แป่วว) ถ้าใครทันสมัยใช้ Firefox ที่ยังตัดคำไทยไม่ค่อยจะคล่องอาจจะได้ยินชื่อนี้บ่อย เพราะมีคนไทยฮาร์ดคอร์มากมายเอาโค้ด Firefox มาแก้ใส่ ICU ให้ตัดคำแล้ว build ใหม่ … แค่ฟังก็อยากจะอ้วกออกมาเป็น pointer กับไฟล์ .h แล้วว =__=’

ด้วยความที่ 3 วันนี้ผมเมาจัดหรือยังไงไม่ทราบ เลยใช้เวลาว่างอันมีอยู่น้อยนิดไปพยายามทำ binding ให้เรียกใช้ ICU จาก C# (และ .NET) ได้ครับ! ก่อนทำก็หา best practice โดยการไปถามที่แหล่งประจำเล็กน้อย ได้คำตอบมาแค่อันเดียวน่าเศร้าใจ TvT

ผมเข้าใจว่าการทำ binding มันจะต่างจาก wrapper ตรงที่ เราต้องนำเสนอ interface เดียว (หรือคล้ายๆ) กับที่ underlying C++ classes มันใช้อยู่ให้กับผู้ใช้ ส่วนการทำ wrapper มันเหมือนกับว่าเราไปสร้างอะไรซักอย่างหุ้ม C++ classes เหล่านั้นไว้ และให้ผู้ใช้เรียกใช้งานผ่าน interface ของเรา (โดยไม่รู้ว่าข้างในมีอะไรอยู่บ้าง – Facade Pattern อ่านว่า “ฟา-ซ้าด”) ซึ่งการทำ wrapper นี่มันง่ายกว่าโขเลยน่ะ

หลังจากลองถูๆไถๆ ใช้พลังกับ C++/CLI เหมือนที่เคยใช้ในซีเนียร์โปรเจค ก็ออกมาเป็นรูปเป็นร่าง อยู่ที่ ICU4NET สามารถลองดาวน์โหลดไปใช้ได้ ถึงชื่อจะบอกว่า ICU4NET แต่จริงๆแล้วตอนนี้มันมี class ที่ใช้งานได้อยู่ class เดียวคือ BreakIterator =_=” ตั้งใจไว้ว่าจะจัดการกับ class ในกลุ่ม boundary analysis ให้หมด

เอาโค้ดตัวอย่างให้ดูเล็กน้อย อันแรกเป็นแบบดั้งเดิม ลักษณะเดียวกับที่เขียนใน ICU4J และ ICU4C

private List<string> WordBreak(string text)
{
var sb = new StringBuilder();
var col = new List<string>();

using (BreakIterator bi = BreakIterator.CreateWordInstance(Locale.GetUS()))
{
bi.SetText(text);
int start = bi.First(), end = bi.Next();
while (end != BreakIterator.DONE)
{
col.Add(text.Substring(start, end - start));
start = end; end = bi.Next();
}
}

return col;
}

ส่วนอันนี้ผมเขียน Extension Method เพิ่มให้มัน return เป็น IEnumerable ได้ พวกขา 3.5 จะได้เล่นซนแบบนี้ได้ :’)

using (BreakIterator bi = BreakIterator.CreateWordInstance(Locale.GetUS()))
{
bi.SetText(uxText.Text);

// requires ICU4NETExtension to use Enumerate extension method
MessageBox.Show(string.Join(Environment.NewLine, bi.Enumerate()
.GroupBy(w => w)
.OrderBy(x => x.Count())
.Reverse()
.Select(x => x.Key + " : " + x.Count())
.Take(10)
.ToArray()));
}

ตอนแรกตั้งใจว่า ส่วนที่น่าจะเอาไปเล่นได้หลักๆคงเป็นพวก ASP.NET Web App แหละ แต่นั่งคิดๆดูแล้วมันมีส่วนประกอบที่เป็น library native ของ ICU หลายอันอยู่ ถ้าเข้าใจไม่ผิดคงมีปัญหากับเรื่อง trust level ของ IIS พอสมควร …

ผลพลอยได้จากการผลาญเวลา (แบบไร้เหตุผล เอามันส์ล้วนๆ) ครั้งนี้คือ ได้ศึกษา C# เพิ่มอีกนิดหน่อย แล้วก็ลองใช้ C++/CLI อีกนิสสสนึง หลังๆมานี่อยู่ที่ทำงานได้ใช้แต่ C++ จนรู้สึกตัวเองตามโลก C# ไม่ทัน มาอ่านโค้ดของ @chakrit (ขา 3.5 ตัวพ่อ) ทีนี่นั่งงงอยู่หลายนาที –..-‘ เออออ … น้ำหลักลดด้วยนะ ^ ^

จากประสบการณ์ ด้วยหัวข้อยบลอกประมาณนี้ ผมเชื่อว่าคงมี นิสิต/นักศึกษา ที่กำลังปั่นงานของอาจารย์แล้ว search มาเจอ และอยากนำไปใช้ได้โดยเร็ว … ผมขอร้องว่าก่อนจะทิ้งคอมเม็นต์ไว้หรือเมล์มาถาม technical issue กับผม ช่วยศึกษาเรื่องพื้นฐาน C# กับเรื่องพวกวิธี reference รวมถึงอ่าน Readme ก่อน แล้วค่อยถามมานะครับ …

ผมตั้งเป้าไว้ว่าจะมีคนเอาไปใช้ประโยชน์ได้ 2 คนขึ้นไป ใครเอาไปใช้ทำอะไรบอกด้วยๆ :’)

ICU4NET – ICU Binding for .NET

WordBreak

Tags: , , , , , ,

Mar 1 2010

New Big Toy

Category: Lifem3rLinEz @ 12:08

พักหลังๆนี่เวลาแก๊นจะตัดสินใจซื้ออะไรซักอย่างที่มันมีราคา จะคิดแล้วคิดอีก อย่างน้อยก็ทิ้งเวลาไว้ตั้งแต่ 2 อาทิตย์ - หลายเดือน เพื่อจะดูว่าเราต้องการมันจริงๆรึเปล่า (ถ้าผ่านมานานแล้วก็ยังต้องการอยู่ก็แปลว่าโอเค ไม่ใช่ความรู้สึกชั่ววูบหลังดูโฆษณา)

ของเล่นชิ้นล่าสุดที่เอาเข้าบ้านคือ LCD TV ของ LG รุ่น LH70 ขนาด 32 นิ้ว กระเป๋าแห้งไปอีกหลายเดือน อยากถ่ายรูปที่ห้องเก็บไว้เหมือนกัน แต่ห้องรกจัด แหะๆ ผมแนะนำว่าซื้อกับร้านข้างนอกถูกกว่าในห้างมากจนน่าตกใจเลยนะครับ สุดท้ายมันก็ประกันศูนย์ LG เหมือนกัน

LH70_LR (1)

ประโยชน์ใช้สอยหลักๆก็เอามาดูหนังนั่นแหละครับ คนแรกที่ทำให้อยากซื้อคือพี่ธี CP31 เนื่องจากผมเห็นเค้าตั้งชื่อใน WLM ในทำนองแฮปปี้กับ TV ใหม่มาก หลังจากนั้นผมจึงเกิดความอยากได้แล้วก็เริ่มมีความรู้เรื่องพวก High Definition (Hi-Def) ขึ้นมาเล็กน้อย สรุปให้ฟังคร่าวๆดังนี้

  • TV ที่มันเขียนว่า FullHD แปลว่ามันแสดงผลได้ที่ 1920 x 1080 pixel
  • ไฟล์วีดิโอที่ขนาดดังกล่าว เรียกสั้นๆว่า 1080p แต่จริงๆแล้วมันยังมีขนาดเล็กกว่านั้นคือ 720p อีก เรียกรวมๆกันว่า Hi-Def video ทั้งคู่
  • หนัง Hi-Def พวกนี้ไฟล์ใหญ่เอาเรื่อง เรื่องนึงมีขนาดได้ตั้งแต่ 8 – 12 GB สำหรับหนัง 2 ชม.ครึ่ง
  • พอร์ตที่ใช้ส่งข้อมูลจะกลายเป็น HDMI แทน ซึ่งขนส่งข้อมูลแบบ digitial ไม่ใช่ analog ดังนั้นสายจีนแดงอันละ 350 กับสายแพงๆอันละ 2000 – 3000 จะมีความสามารถในการส่งเท่ากัน ต่างกันแค่ที่ความคงทน แล้วก็เรื่องคุณภาพของหัวต่อนิดหน่อย (แต่ไม่ทำให้สีอิ่มขึ้น สวยขึ้น ชัดขึ้น แน่นอน) เคยมีดราม่าเรื่องนี้ด้วยนะเทอว์
  • พอร์ต HDMI จริงๆแล้วมันขนส่งข้อมูลที่เป็นสัญญาณภาพแบบเดียวกับ DVI (ที่เห็นใน Graphics card และจอ LCD ของคอมพิวเตอร์ทุกวันนี้) แต่จะมี digital audio เพิ่มมาด้วย สรุปคือ HDMI = DVI + digital audio
  • ดังนั้นมันจึงมีหัวแปลงจาก HDMI –> DVI (โดยที่เสียงจะหายไป) และ DVI –> HDMI ได้โดยไม่เสียคุณภาพของภาพแม้แต่น้อย
  • ดังนั้น ตามทฤษฎี การเอาหัวแปลง DVI –> HDMI มาต่อที่ Graphics card แล้วเอาสาย HDMI ต่อเข้า TV จะทำให้เสียงไปโผล่ที่ TV ไม่ได้ อีกทั้ง Graphics card มันก็ไม่ได้ออกแบบมาให้มีเสียงออกมาด้วยอยู่แล้ว
  • แต่ ในทางปฎิบัติ ทั้ง ATi และ Nvidia ก็ต่างมีวิธีของตัวเองทำให้เสียงมันออกมาด้วยได้ !! (ตึ๊ง) โดยที่ ATi ต้องใช้หัวแปลงที่แถมมากับกับการ์ดเท่านั้น ส่วน Nvidia ลองไปดูกันเอง ฮ่าๆ (ผมใช้ ATi รุ่นที่มันยังไม่แถมหัวแปลงมาให้ ปัจจุบันยังหาไม่ได้เลย ยังใช้ลำโพงของคอมพิวเตอร์อยู่ T_T)

หลายวันนี้จะมีช่วงนึงที่เงียบๆไป เพราะเห่อของเล่นใหม่อยู่ครับ ฮาาาา โดยรวมๆแล้วจุดที่ชอบก็มีตรงที่ดู XVid จาก USB Flash Drive + USB HDD ได้ (มีพอร์ต USB หลังเครื่อง) แล้วก็ TruMotion ที่เป็นเทคโนโลยีการแทรก frames เข้าไประหว่าง frames ทำให้ภาพมันลื่นไหลมากขึ้น และส่วนของ UI ทำออกมาดูสวยใช้งานง่ายดี

ส่วนจุดที่ผิดคาดนิดหน่อยคือเวลาเอาหนัง 1080p กับ 720p ไปเปิดแล้วดูที่ระยะประมาณ 3 เมตร ผมแทบจะสังเกตความแตกต่างไม่ออกเลย T_T แต่หลายคนก็บอกอ่ะนะ ว่าถ้าเป็น LCD TV ขนาด 32” ไม่ต้องจ่ายเพิ่มเพื่อให้เป็น FullHD ก็ได้ เพราะมันสังเกตความต่างยาก

เอารูปตัวอย่างที่ printScrn มาให้ดูนิดหน่อย (ภาพเต็มขนาดที่ http://www.solidskill.net/FCKUploaded/Image/FullDistrict.png )เผื่อจะสามารถกระตุ้นต่อมอยากคนแถวนี้ได้ ฮ่าๆ

FullDistrict

ปล. มีแววอยากได้เครื่องเล่นเกมอีกแหงมๆ แต่เชื่อว่าคงไม่มีเวลาเล่นว่ะ T_T เส้าใจ (แล้วมีเวลาดูหนังได้ไงวะ !?)

Tags: , , ,