Saturday, October 11, 2008

เว็บใหม่

ในทีสุดก็ย้ายบ้านได้จริงๆแล้ว

เว็บใหม่มีชืี่อว่า LongSpine.com ลองสไปน์ดอทคอม เว็บสันหลังยาว

ได้ลง Drupal และโมดูลหลายๆอย่างไว้เพื่อไว้เขียนโค้ดและสมการคณิตศาสตร์ จะได้ไม่เละเหมือนบทความก่อนหน้านี้ นอกจากนี้ถ้าว่างๆจะกู้บทความบางส่วนจากเว็บเก่าๆมารวมไว้ที่เดียว

Wednesday, October 8, 2008

การเขียนโปรแกรมหาจำนวนเฉพาะโดยใช้ Python

ไหนๆก็ไปโพสท์ไว้ใน blognone แล้ว ก็เลยเอามาแปะไว้นี่ด้วยเลยเผื่อเป็นประโยชน์

ย้ายไปเขียนบน LongSpine.com เนื่องจากโค้ดเละ

วิธีการหาจำนวนเฉพาะ ..แบบเขียนง่ายๆอ่านง่ายๆ


ไอเดียแรกคือการหาจำนวนเฉพาะใหม่จากจำนวนเฉพาะเก่าที่มีอยู่แล้ว โดยมีหลักคือจำนวนเฉพาะนั้นคือจำนวนที่ไม่มีจำนวนเฉพาะอื่นๆหารมันลงตัว

prime = [2]
for i in range(3, 100000):
flag = True # สมมุติว่าจำนวน i เป็นจำนวนเฉพาะ
for j in prime: # จำนวน j ใดๆที่เป็นจำนวนเฉพาะต้องหารจำนวนนี้ไม่ลงตัว
if (i % j == 0): # แต่ถ้าดันหารได้ลงตัว (มีเศษเป็น 0)
flag = False # เราก็พบว่าจำนวนนั้นไม่ใช่จำนวนเฉพาะ
break # ออกจากลูปทันที
if flag == True: # ถ้าพิสูจน์แล้วว่าเป็นจำนวนเฉพาะจริงๆ
prime.append(i) # ให้ใส่ค่านั้นเข้าไปในตัวแปร prime

ไอเดียที่สองคือลดจำนวนตัวที่ต้องวนหารลง เนื่องจากจำนวนเต็มใดๆ j สูงสุดที่จะหาจำนวนเต็มใดๆ i ได้นั้น จะต้องมีค่าไม่มากไปกว่ารากที่สองของ i

prime = [2]
for i in range(3, 100000):
flag = True # สมมุติว่าจำนวน i เป็นจำนวนเฉพาะ
for j in prime: # จำนวน j ใดๆที่เป็นจำนวนเฉพาะต้องหารจำนวนนี้ไม่ลงตัว
if (j ** 2 > i): # ถ้า j มีค่ามากกว่าตัวหารสุงสุดที่เป็นไปได้ (มีค่ามากกว่ารากที่สองของ i)
break # ให้ออกจากลูป
if (i % j == 0): # แต่ถ้าดันหารได้ลงตัว (มีเศษเป็น 0)
flag = False # เราก็พบว่าจำนวนนั้นไม่ใช่จำนวนเฉพาะ
break # ออกจากลูปทันที
if flag == True: # ถ้าพิสูจน์แล้วว่าเป็นจำนวนเฉพาะจริงๆ
prime.append(i) # ให้ใส่ค่านั้นเข้าไปในตัวแปร prime


ไอเดียที่สาม เรายังทำให้เร็วได้มากไปกว่านี้อีก โดยใช้วิธีซีฟของเอราทอสเทนีส ซึ่งใช้หน่วยความจำมาช่วยในการคำนวน (อ่านรายละเอียดได้ตามลิงค์) วิธีนี้ข้อเสียคือเปลืองหน่วยความจำมาก

import numpy

n = 100000 # หาจำนวนเฉพาะที่มีค่าน้อยกว่า 100000

primeArr = numpy.zeros(n) # สร้าง array ขนาด n
primeArr[0] = 1 # 0 ไม่ใช่จำนวนเฉพาะ
primeArr[1] = 1 # 1 ก็ไม่ใช่

for i in xrange(2, n):
if primeArr[i] == 0: # ถ้าจำนวนนั้นเป็นจำนวนเฉพาะ
for j in xrange(i * 2, n, i): # จำนวนอื่นๆที่จำนวนนั้นหารลงตัว
primeArr[j] = 1 # ..จะไม่ใช่จำนวนเฉพา

prime = []

for i in xrange(2, n):
if primeArr[i] == 0: # เก็บจำนวนเฉพาะไว่ในตัวแปร prime
prime.append(i)
ทดลองเปรียบเทียบความเร็วของทั้งสามตัวอย่าง

poomk@gemini:/tmp$ time ./prime1.py >0

real 0m19.622s
user 0m19.581s
sys 0m0.020s

poomk@gemini:/tmp$ time ./prime2.py >0

real 0m0.675s
user 0m0.676s
sys 0m0.000s

poomk@gemini:/tmp$ time ./prime3.py >0

real 0m0.535s
user 0m0.504s
จะเห็นว่าเร็วขึ้นตามลำดับ

ไอเดียที่สี่ เนื่องจากตัวอย่างที่สามนั้นไม่เหมาะกับการหาจำนวนเฉพาะที่มีขนาดมากๆ (มากๆๆๆๆ...ๆ) ทำให้เราไม่สามารถใช้วิธีของซีฟได้เพราะเรามีหน่วยความจำไม่เพียงพอ วิธีหนึ่งที่(ผมเคย)ใช้ก็คือการหาจำนวนเฉพาะตั้งต้นด้วยซีฟ(ตัวอย่างที่สาม) จากนั้นค่อยน้ำตัวเฉพาะตั้งต้นเหล่านั้นไปหาตัวเฉพาะอื่นๆต่อตามตัวอย่างที่สอง

import numpy

n = 1000000 # หาจำนวนเฉพาะที่มีค่าน้อยกว่า 1000000 (หนึ่งล้าน)

primeArr = numpy.zeros(n)
primeArr[0] = 1
primeArr[1] = 1

for i in xrange(2, n):
if primeArr[i] == 0:
for j in xrange(i * 2, n, i):
primeArr[j] = 1

prime = []

for i in xrange(2, n):
if primeArr[i] == 0:
prime.append(i)

for i in range(n, 2000000): # หาต่อจนถึงตัวที่ 2000000 (สองล้าน)
flag = True
for j in prime:
if (j ** 2 > i):
break
if (i % j == 0):
flag = False
break
if flag == True:
prime.append(i)
เมื่อจับเวลาก็จะเห็นความแตกต่าง
poomk@gemini:/tmp$ time ./prime2.py >0

real 0m27.190s
user 0m27.090s
sys 0m0.096s

poomk@gemini:/tmp$ time ./prime4.py >0

real 0m20.422s
user 0m20.369s
sys 0m0.040s

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

Thursday, August 28, 2008

อดไป Barcamp Bangkok 2

ผมจะบินกลับถึงไทยเวลาบ่ายสามโมงของวันอาทิตย์ที่ 31 ซึ่งตรงกับวันที่สองของ Barcamp Bangkok ครั้งที่ 2 ดังนั้นผมจึงอดไปงานบารฺแคมพ์ ..อีกครั้ง

เดิมทีผมอยากจะพูดเรื่อง การเข้ารหัสและอำพรางข้อมูลแบบคลาสสิค (Classical Cryptography and Steganography) ซึ่งเป็นหัวข้อที่ค่อนข้างน่าสนุกและไม่เป็นเชิงเทคนิคซักเท่าไหร่ และเนื้อหาที่จะนำมาพูดนั้นจะนำมาจากสมุดจดวิชา Sicherheit und Zuverlässigkeit digitaler Systeme (Security and Reliability of Digital Systems) ซึ่งผมเรียนไปเมื่อหนึ่งปีก่อน

คำว่าคลาสสิคนั้นมีความหมายว่ามีมาก่อนที่คอมพิวเตอร์จะถูกประดิษฐ์ขึ้นมา ซึ่งในส่วนของการเข้ารหัส (Cryptography) นั้นจะแบ่งออกเป็นสองส่วน

  • Transitional cipher เช่น Rail Fence Cipher
  • Subtitution cipher เช้น Ceasar cipher (และ ROT13), Vigenere cipher, และ Playfair cipher

หลังจากนั้นก็จะพูดถึงการอำพรางข้อมูล (Steganography) และยกตัวอย่างเช่น หมึกล่องหน (และกระดาศป้องกันหมึกล่องหน), microdots, และ the Doll Woman

หลังจากนั้นก็ลองทำโจทย์ง่ายๆตามหัวข้อที่พูดไป

ถ้ามีเวลาเหลืออาจขึ้นในส่วนต้นๆของ modern cryptography ซึ่งแบ่งเป็น assymetric key, symmetric key, และ hybrid key ซึ่งคงจะพูดถึงแค่หลักการของมัน

นอกจากนั้นอาจพูดถึงโพรโตคอลที่น่าสนใจ เช่น No-key protocol และ Zero-knowledge protocol ซึ่งผมไม่รู้ว่าจะจัดมันอยู่ในประเภทคลาสสิคหรือสมัยใหม่ดี เนื่องจากมันเป็นอะไรที่ธรรมดามากจนคนยังใช้กันอย่างแพร่หลายในปัจจุบัน

หวังว่าโอกาสหน้าคงจะได้พูดเสียที

Wednesday, August 27, 2008

This is not a pipe


This is not a pipe

This is not the rightous

This is not a viloence

This is our democracy


ตอแหลทั้งนั้น !!

(รูปประกอบจาก Wikipedia, BBC, และเว็บไซท์กองการเลือกตั้ง สนง.ตำรวจแห่งขาติ)

Thursday, July 10, 2008

กำลังย้ายบ้าน

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

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

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

ปล. ไว้รอสอบเสร็จแล้วจะมาอัพเดทอีกทีว่าย้ายไปไหน ขอให้สแปมบอททุกตัวอดใจรอหน่อย

Friday, April 25, 2008

มติประชาชน = มติหอประชุมใหญ่ ?

วันนี้บังเอิญได้เข้าไป manager เพราะพี่คนหนึ่งพูดเรื่องการเมืองว่าฝ่ายนี้เขากำลังเร่ง "เผา" ไอ้เราก็อยากรู้ว่าคืออะไร และบังเอิญได้ไปเจอไอ้นี่เข้า

“สมศักดิ์” ชูมติประชาชนล้ม “พลังแม้ว” เพื่อชาติ

“สมศักดิ์” ชูมติประชาชน ร่วมต้าน “พลังแม้ว” ล้มล้างรัฐธรรมนูญ ลั่นตายเป็นตายต้องทำความดีเพื่อชาติ เตือนนักการเมืองพรรคร่วม ริสุ่มหัว “พลังประชาชน” หมดอนาคตทางการเมืองแน่
    
  คลิกที่นี่ เพื่อฟัง สมศักดิ์ โกศัยสุข แกนนำพันธมิตรฯ กล่าวปราศรัย (แก้ลิงค์ออก)
    
  คลิก! ชม “สมศักดิ์ โกศัยสุข” ปราศรัย(56K) |(256K) (แก้ลิงค์ออก)
    
  วันนี้ (25 เม.ย.) นายสมศักดิ์ โกศัยสุข แกนนำพันธมิตรประชาชนเพื่อประชาธิปไตย กล่าวในการสัมมนาประชาชน - ติดอาวุธทางปัญญา “ยามเฝ้าแผ่นดิน ภาคพิเศษ” ครั้งที่ 2 ที่หอประชุมใหญ่ มหาวิทยาลัยธรรมศาสตร์ ว่าวันนี้เป็นการประกาศต่อสู้อย่างเด็ดขาด ทุกคนมาด้วยใจรักชาติ บ้านเมือง และมาด้วยความที่ทนความอัปลักษณ์ของผู้ปกครองบ้านเมืองในเวลานี้ไม่ได้ โดยเฉพาะคำกล่าวอ้างว่ามาจากการเลือกตั้ง แล้วเป็นประชาธิปไตยนั้นไม่ถูกต้อง หากมาจากการเลือกตั้งจริง ต้องไม่มีการซื้อเสียง หากมีการซื้อเสียงก็ไม่ใช่ประชาธิปไตย และที่สำคัญต้องใช้อำนาจเพื่อประเทศชาติ ไม่ใช่เพื่อคนบางกลุ่ม บางพวกดังที่รัฐบาลปัจจุบันดำเนินการอยู่
    
  นายสมศักดิ์ ยังกระตุกต่อมสำนึกรัฐบาลชุดนี้ ด้วยการให้ย้อนรำลึกถึงวันเดินทางเข้าเฝ้าทูลละอองธุลีพระบาทถวายสัตย์ปฏิญาณก่อนเข้าทำหน้าที่ว่า รัฐมนตรีทุกคนจะต้องถวายสัตย์ปฏิญาณตนต่อหน้าพระพักตร์ว่า จะซื่อสัตย์จงรักภักดีต่อพระมหากษัตริย์ และบริหารประเทศด้วยความซื่อสัตย์สุจรติ ทั้งจะรักษาไว้และปฏิบัติตามรัฐธรรมนูญนี้อย่างเคร่งครัดทุกประการ เช่นเดียวกับ ส.ส.-ส.ว.ที่ต้องปฏิญาณตน แต่เมื่อเข้ามาไม่กี่วันก็ไม่ยอมปฏิบัติตาม กลับจะไปแก้รัฐธรรมนูญเพื่อผลประโยชน์ของพวกพ้องตัวเอง ไม่ใช่เพื่อประโยชน์ของประชาชนส่วนใหญ่ ปัญหาความทุกข์ยากของประชาชนจึงไม่ได้ถูกเยียวยาอย่างที่ควรจะเป็น
    
  “รัฐบาลกำลังกลัวกระบวนการยุติธรรม กลัวการตรวจสอบ สวนทางกับเราที่เชื่อมั่นในกระบวนการยุติธรรม หากกระบวนการยุติธรรมเดินไป มีการตรวจสอบอย่างตรงไปตรง ผลสรุปออกมาเป็นอย่างไรเราก็ยอมรับ ผิดก็คือผิดไม่ผิดก็คือไม่ผิด เรายอมรับได้หากกระบวนการยุติธรรมมันเดินไปถึงที่สุดแล้ว ขณะเดียวกันคนที่สุจริตก็ยังสามารถกลับมาดำเนินการใดๆ ก็ได้ แต่ถ้าผิดก็ควรได้รับการลงโทษ” นายสมศักดิ์ กล่าว
    
  นอกจากนี้ นายสมศักดิ์ได้ขอฉันทามติจากประชาชนที่อยู่ในหอประชุมใหญ่ มหาวิทยาลัยธรรมศาสตร์ ในการไม่วางใจรัฐบาล พร้อมกับระบุว่า เราทุกคนล้วนแต่มีสติปัญญา เข้าใจปัญหาบ้านเมือง ประชาธิปไตยนั้นต้องไม่มีการทุจริตเลือกตั้ง และเมื่อมีอำนาจต้องไม่โกงกิน ซึ่งหากโกงกินก็เท่ากับเป็นเผด็จการทรราช ดังนั้น เมื่อเราเห็นว่าการกระทำไม่มีเหตุผลก็ต้องใช้สิทธิตามรัฐธรรมนูญ มาตรา 69 คือ ชุมนุมโดยเปิดเผย เพื่อปกป้องรัฐธรรมนูญ ฉบับปี 2550 ต่อไป
    
  นายสมศักดิ์ กล่าวด้วยว่า การชุมนุมในวันนี้ (25 เม.ย.) เป็นการชุมนุมครั้งสุดท้ายในนามพันธมิตรฯ ก่อนจะประกาศชุมนุมใหญ่อีกครั้ง ในวันที่รัฐบาลยื่นญัตติแก้ไขรัฐธรรมนูญ วาระแรก กลุ่มพันธมิตรฯ จะชุมนุมใหญ่ในวันดังกล่าว ทุกคนไม่ต้องกลัว ไม่มีอะไรน่ากลัวสำหรับการทำความดี เกิดมาแล้วตายทุกคน แต่จะตายเพราะความขี้โกงหรือขี้ขลาดก็ต้องเลือกเอา เมื่อเวลาบ้านเมืองมีปัญญา เราก็ต้องลุกขึ้นมาปกป้องบ้านเมือง ไม่เกินเดือนพฤษภาคมนี้เราจะได้ชุมนุมบนท้องถนนอย่างแน่นอน
    
  ขณะเดียวกัน นายสมศักดิ์ ยังกล่าวเตือนสตินักการเมืองว่า อยากเรียกร้องให้นักการเมืองพรรคร่วมรัฐบาลคิดและตรึกตรองถึงอนาคตให้ดี หากจะร่วมหัวจมท้ายกับรัฐบาลในการแก้ไขรัฐธรรมนูญ ต้องนึกถึงอนาคตที่รุ่งโรจน์ทางการเมืองของตัวเองให้มากๆ นั่งนึกถึงสิ่งที่จะเกิดขึ้นในอนาคตให้มาก

สีและตัวเน้นนี่ผมเพิ่มไปเอง

คิดแล้วผมรู้สึกเครียดๆแฮะ แต่อย่างน้อยก็อยากจะบายความเครียดออกมาเห็นข้อๆให้เห็นกันชัดๆ โดยตัดเนื้อหาจุบจิบที่ไม่สบอารมณ์ตามแบบฉบับของแหล่งข่าวที่นี่

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

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

เรื่องรัฐมนตรีทุกคนต้องปฏิญาณตนต่อรัฐธรรมนูญ น่าจะเอาไปบอกพวกที่มาจากระบอบเผด็จการทหารด้วย และหากเรามาลองพิจารณากันว่า ถ้ารัฐบาลก่อนหน้านี้มั่วซั่วขนาดออกรัฐธรรมนูญเส็งเคร็งมา รัฐบาลใหม่สมควรแก้ไหม? หรือถ้ารัฐบาลนี้แก้รัฐธรรมนูญให้เหมือนเก่าได้จริง คิดหรือว่าทหารและปชป.จะไม่แก้ใหม่? ทำยังไงถึงแก้ได้ ทำยังไงถึงไม่ควรแก้?

เนื้อหาจดหมายมีการปลุกระดม และการสร้างภาพว่านี่เป็นความดี? นอกจากนั้นยังมีการพูดถึงเรื่อง "ไม่ตายก็ยอม" ให้ความหมายทำนองว่าการต่อต้านรัฐบาลที่มาจากเสียงส่วนใหญ่ (แต่คนพูดไม่รู้มาจากไหน) นั้นเป็นสิ่งที่ควรยอมตายแทน

ย่อหน้าสุดท้ายก็คือการขู่นักการเมืองที่อยู่ฝ่ายตรงกันข้าม โดยเฉพาะพวกที่ครั้งหนึ่งเคยญาติดีกับกลุ่มของผู้เขียนข่าวรึเปล่า

..ผมเบื่อหวะ

Sunday, January 27, 2008

Web 2.0 Workplaces

สภาพแวดล้อมการทำงานของคุณเป็นอย่างไร ออฟฟิศของคุณนั้นน่าทำงานแค่ไหน?

สำหรับหลายๆคนรวมทั้งตัวผมเองแล้ว สภาพแวดล้อมของที่ทำงานนั้นเป็นสิ่งสำคัญลำดับต้นๆในการทำงาน (แต่แน่นอนว่าค่าจ้างก็ยังสำคัญอยู่)



ภาพจาก UADDit: สถานที่ทำงานของ Twitter

เมื่อวันก่อนเว็บไซต์ UADDit ได้รวมภาพสถานที่ทำงานของบริษัทที่เกี่ยวข้องกับ Web 2.0 เช่น Facebook, Flickr, Twitter, และบริษัทอื่นๆไว้ได้อย่างน่าสนใจ ใครอยากเห็นว่าบริษัทไอทีสมัยใหม่เขาให้ความสำคัญกับที่ทำงานแค่ไหนกันบ้าง สามารถเข้าไปดูรูปกันได้ที่ Web 2.0 workplaces

บริษัทไทยหลายๆที่ก็มีสภาพแวดล้อมดีในระดับเดียวกัน โดยเฉพาะบริษัทที่ผมเคยไปร่วมงานด้วย ตอนนี้ผมท่องไว้ในใจว่าหากตั้งบริษัทสักบริษัทหนึ่ง สภาพแวดล้อมที่ดีแก่พนักงานนั้นสำคัญมาก เพราะผมต้องใช้หนึ่งในสามของชีวิตในที่ทำงานนี้

เพิ่มเติม ไปอ่านใน Blognone พบว่ามีคนเอาข่าวมาลงเหมือนกัน นอกจานี้ยังมีลิงค์ไปยังรูปของบริษัทอื่นๆ