{
public Form1()
{
InitializeComponent();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
DrawFractal(e.Graphics, 300, 10, 1,1);
DrawFractal(e.Graphics, 900, 10, 1,2);
DrawFractal(e.Graphics, 1500, 10, 1,3);
DrawFractal(e.Graphics, 300, 530, 1,4);
DrawFractal(e.Graphics, 900, 530, 1,6);
DrawFractal(e.Graphics, 1500, 530, 1,8);
}
int size = 270;
public void DrawFractal(Graphics g,int x,int y ,int n,int N )
{
if(n == Math.Pow(2,N))
{
g.DrawLine(Pens.Black ,x, y, (int)(x - size / n), (int)(y + Math.Sqrt(3) * size / n));
g.DrawLine(Pens.Black, x, y, (int)(x + size / n), (int)(y + Math.Sqrt(3) * size / n));
g.DrawLine(Pens.Black, (int)(x + size / n), (int)(y + Math.Sqrt(3) * size / n), (int)(x - size / n), (int)(y + Math.Sqrt(3) * size / n));
return;
}
DrawFractal( g, x, y ,n*2,N);
DrawFractal( g, (int)(x - size / n /2 ), (int)(y + Math.Sqrt(3)*size / n / 2) ,n*2,N);
DrawFractal( g, (int)(x + size / n / 2 ), (int)(y + Math.Sqrt(3)*size / n / 2) ,n*2,N);
}
}
[ view entry ] ( 27156 views ) | permalink | ( 3 / 2587 )
อยากเขียน App ให้รวยๆ แบบ Instragram : +++ Rome is not build in a day +++
Rome is not built in a day
การเรียนเขียนโปรแกรมแบบมี app ที่อยากทำไว้ในหัวเป็นสิ่งที่ดีมากๆ เลยครับ เพราะจะทำให้เรามีแนวทางว่าเราจะไปยังไง อะไรคือสิ่งที่เราต้องการ สิ่งที่สำคัญคือการ ค่อยๆ ทำ iterate ที่ละstep อย่าข้ามขั้น และขอให้เขียน ย้ำว่าเขียน idea ของเรา ออกมาเป็นรายลักษณ์อักษร ว่า ระบบของเราต้องมีอะไร บ้างทีละ step ภาพสุดท้ายต้องการอะไร และมีส่วนประกอบอะไรบ้าง บอกเลยว่า ไอ้ความคิดประเภทว่า ก็ทำแบบ instragram ทำแบบ web โน้นนี่ นั้นแหละ แล้วก็เพิ่มแผนที่ เข้าไป แล้วก็เพิ่มโน้นนี่นั้นเข้าไป มันไม่ได้สื่ออะไรครับ
ขั้นที่ศูนย์ หาข้อมูล หาว่า ที่กำลังจะทำมีอยู่แล้วหรือเปล่า และคนที่ทำก่อนเรามีจุดเด่นจุดด้อยยังไง ขั้นตอนนี้เรียกว่า การ Review สิ่งที่มีอยู่แล้วเราจะได้ไม่ไปผิดพลาดซ้ำกับเค้า ผลลัพท์จากขั้นนี้ คือ ผลการวิเคราะห์ 5-force , SWOT , และการวิเคราะห์ทางเทคนิคของ โปรแกรม ซึ่งแย่งเป็น Functional และ none-functional
functional คือ function หรือ feature ของโปรแกรมว่าทำอะไรได้ทำอะไรไม่ได้
none-functional คือ ประสิทธิภาพ ความเร็วความช้า ความสเถียรของโปรแกรม ความละเอียดของรูปที่ถ่ายได้ ปริมาณของ traffic ที่รับไหว
ทั้งหมดนี้ส่งผลต่อการวิเคราะห์ของเรานะครับว่าอะไรควรจะทำอะไรไม่ควรทำตามลำดับยังไง เพราะการเขียนโปรแกรมต้นทุนในช่วงแรก คือเงินและเวลา ซึ่งเข้าใจว่าทั้งสองอย่างมีจำกัดในช่วงเริ่มต้น
ขั้นแรกนะครับ แตกความคิดเป็น ส่วนย่อย แต่ยังไม่ต้องลงรายละเอียด
ขั้นที่สอง ลงรายละเอียดให้มากที่สุดว่าในส่วนย่อยแต่ละอัน
ขั้นที่สาม ถ้ายังเขียนโปรแกรมไม่เป็นไม่เคยเรียน เคยเรียนนิดหย่อย แต่ยังไม่เคยทำโปรเจ็คเป็นชิ้นเป็นอันให้ลง course JAVA J104,CS102,PHP101 อะไรก็ได้สักอันก่อนแล้วจะเห็นภาพมากขึ้น
เช่น สมมุตินะครับว่าอยากทำ web แบบ instragram แต่ใช้เป็น social สำหรับร้านอาหารอย่างเดียว
ขั้นแรก
แตกความคิดเป็นส่วนย่อย พบว่าระบบเราต้องการ
1 ระบบ สมาชิก
2 ระบบ การpost รูป และ comment ใต้รูป สามารถ กด like ให้รูปได้
3 ระบบตกแต่งรูปให้ดูฟรุ้งฟริ้งมุ่งมิ้ง hipster สุดๆ
4 ต้องสามารถ ต่อ GPS ดึงข้อมมูล lat-long ของเราได้ ถ้าอยู่ในอาคาร ใช้ .... ในการ localization และต้องดึงแผนที่จาก google map ได้
สมมุติว่าเราจะทำประมาณนี้นะครับ
ขั้นที่สอง
ลง detail ลงdetail ว่าแต่ละระบบต้องมีอะไรบ้าง เช่นระบบ สมาชิกต้องเขียนออกมาว่า ต้องเก็บข้อมูลอะไรบ้าง ชื่อ นามสกุล บ้านเลขที่ แขวงเขต อำเภอ วัดเกิด และพอเก็บผู้ใช้ก็ต้องแก้ได้ ระบบลืม password ระบบ friend เพิ่มเพื่อน ลบเพื่อน block เพื่อน แค่ระบบ สมาชิกอย่างเดียวคุณก็เขียน app หลายวัน หลายสัปดาห์แล้ว ย่ำว่าควจจะต้องลง detail ให้ละเอียดก่อนเริ่มทำ
ปล. ท่านสามารถเล่า idea ของท่านให้ผมฟังได้อย่างสบายใจโดยไม่ต้องกลัวว่าผมจะ copy ไปทำ start up ก่อนท่านหรอกครับ ผมเป็นครู คือเป็นครูจริงๆ มีหน้าที่สอนมีคำปฏิญาณที่ต้องรักษา มีจรรยาบรรณ ผมไม่เอา idea ของนร. ไปบอกคนอื่นแน่นอน ถ้านร.ไม่ยินยอม เหมือนแพทย์ที่จะไม่เอาความลับของผู้ป่วยไปบอกแก่คนอื่น ถ้าไม่ใช่เรื่องด้วยการรักษา
ปล.2 ปีหนึ่งๆ มีคนเอา idea มาบอกผมเป็นหลายสิบ อาจจะถึงร้อยเช่นปีที่แล้ว คนไม่ต้องกลัวหรอกว่า ผมจะ copy ผมฟังจนหูจะระเบิดก็ซ้ำกันไปซ้ำกันมานี่แหละครับ
ปล.3 ลองคำนวนต้นทุน ลองคิด feasibility analysis ทุกครั้งก่อนเริ่มทำอะไร ไอ้ประเภทแบบว่า อย่างทำ web แบบ Facebook อะนะ แต่ขายของได้ถ่ายรูปได้ tag แต่งรูปได้ แต่อยากให้เสร็จในงบ 40,000 บาทภายใน 2 เดือน มันไม่มีนะครับ ของแบบนี้ในโลก ไม่งั้นคนก็รวยแบบ Zuckerberge กันหมดแล้ว คิดเล่นๆ นะ instragram ใช้วิศวกร ในการเขียนเริ่มต้น 3 คน (แน่นอนว่า เป็นวิศวกรระดับเทพ ไม่ธรรมดา) ถ้าคุณจะจ้างระดับนั้น ในไทยก็ต้องมี เงินเดือน อย่างต่ำย้ำม่าอย่างต่ำ 35k ทำงาน 1 ปี = 35k*3*12 = 1,260,000 บาท แปลว่า ถ้าคุณวางแผนจะใหญ่แบบนั้น คุณเตรียมเงินไว้เลย หลักล้าน นี่คือการประเมินอย่างต่ำ นะครับ นี่ยังไม่มีค่าเช่า office ค่าจ้างแม่บ้าน ค่าจ้าง designner
ปล.4 การปรึกษากับผมไม่มีค่าใช้จ่ายแต่ควรเตรียมข้อมูลมาให้พร้อม ไม่ใช่อารมณ์ถามว่า แล้วapp คุณ model หารายได้เป็นยังไงก็ยังไม่ได้คิดอะไรแบบนี้ ลูกค้าคือใครก็ยังงง อะไร แบบนี้ คนประเภทไหนที่จะ Load ฤยย
อยากจะทำ project แบบนี้ต้องเรียนอะไรบ้าง
1 ระบบ สมาชิก --> สอนใน course J104,CS102,PHP101-J
2 ระบบ การpost รูป และ comment ใต้รูป สามารถ กด like ให้รูปได้ --> สอนใน course J104,CS102,PHP101-J
3 ระบบตกแต่งรูปให้ดูฟรุ้งฟริ้งมุ่งมิ้ง hipster สุดๆ --> สอนใน course imageprocessing
4 ต้องสามารถ ต่อ GPS ดึงข้อมมูล lat-long ของเราได้ ถ้าอยู่ในอาคาร ใช้ .... ในการ localization และต้องดึงแผนที่จาก google map ได้--> สอนใน course Android
จริงอยู่อาจจะดูเยอะว่าต้องเรียนหลายอย่างจัง แต่ course ของเราเน้นให้ฝึกคิดเองได้ search google เองได้ ไม่ต้องมีครูคอยป้อนอย่างเดียว คือไม่จำเป็นต้องเรียนทุกอย่าง ทุก course เรียนเฉพาะส่วนที่จำเป็นพอ
ปล.5 พื้นฐานที่ต้องมีก่อนการเป็น start upและคนสร้าง app คืออะไร
1 คณิตศาสตร์ ม.ต้น ม.ปลาย
(ในที่นี้ไม่ได้หมายถึงพวก calculus) เพราะใช้แทรกอยู่ในทุกขั้นตอนการทำโปรแกรม และการทำธุรกิจ ถามหน่อย Mark Zuckerberge ,Bill Gate , larey page, sergey brin ใครไม่เก่งเลขบ้าง คำตอบ ไม่มีทุกคนเม่ง Geek เลขหมด กรุณาเชื่อผม ว่า ถ้าพระเจ้ามีอยู่จริง ท่านจะต้องเป็นนักคณิตศาสตร์ และ พระเจ้าจะทรงให้พรในด้านธุรกิจกับ คนที่ชอบเลข และสวดภาวนา เข้าถึงพระองค์ด้วยการฝึกทำโจทย์เลข และใช้คณิตศาสรต์ในการตัดสินใจทางธุรกิจ
2 ถาษาอังกฤษ ข้อนี้ไม่ต้องอธิบายเหตุผล
3 มีเวลา และความตั้งใจมุ่งมั้น
ข้อดีของการเป็นเจ้าของธุรกิจ หรืออยากเป็นเจ้าของ ธุรกิจและมาเรียนเขียนโปรแกรม
1 เวลาลูกน้องที่เป็น programmer ทำงานเราตรวจสอบได้
2 อ่าน code เข้าใจรู้ว่าอะไรดีไม่ดี
3 ประเมินเวลา เงิน และ ทรัพยากรณ์ที่ต้องใช้ถูก
4 คุณกับคนในสาย นี้เข้าใจมากขึ้น
ปล. คำแนะนำของผมคือเริ่มเล็กๆแล้วค่อยต่อยอดให้ใหญ่ขึ้น การโตช้านๆดีกว่าการอยากจะใหญ่เลยแต่สมองระเบิดบึ้ม
[ view entry ] ( 11054 views ) | permalink | ( 2.9 / 1842 )
Enigma ทำงานอย่างไร
เพื่อเพิ่มอรรถรสในการชมภาพยนต์ เรื่อง Imitation Game
จึงอยากจะขออธิบายการทำงานของเครื่อง Enigma ก่อน
ENIGMA ทำงานอย่างไร
ก่อนพูดถึงการทำงานของ ENIGMA ขอพูดเรื่องการเข้ารหัสก่อน มนุษย์ทั่วๆ ไปล้วนมีความลับ (Secret) ที่บอกใครไม่ได้ ยิ่งการรบด้วยแล้ว ข้อมูลต่าง ๆ ต้องปกปิดไม่ให้ฝ่ายตรงข้ามรู้ แต่ถ้าเราไม่สามารถสื่อสารข้อมูลให้ฝ่ายเรารู้ได้ ย่อมไม่มีประโยชน์
เช่น
Hitler ต้องการสั่งให้เรือรบของฝ่ายเยอรมันโจมตีอังกฤษย่อมต้องไม่อยากให้อังกฤษรู้ข้อมูลการโจมตีแน่นอน เช่น เรือรบไหนโจมตีเป้าหมายไหนเวลากี่โมง ถ้าอังกฤษรู้ข้อมูลก็จะเตรียมการป้องกันซึ่งไม่ดีกับฝ่ายเยอรมันแน่
Technology ในการส่งข้อมูลทั้งในอดีตและปัจจุบันสามารถโดนดักฟัง ดักข้อความได้โดยง่าย (เช่น ส่งผ่านคลื่นวิทยุ) ดังนั้น จึงใช้วิธีการเข้ารหัสข้อความเพื่อให้คนที่ขโมยข้อมูลตรงกลางระหว่างคนส่งและคนรับไม่สามารถเข้าใจข้อความได้ เช่น
เช่น นาย A อยากจะส่งจดหมายรัก (ข้อความลับ) ให้นางสาว B แต่กลัวพ่อว่า นาย A จึงเข้ารหัส (Encode) ข้อความก่อน เมื่อพ่อของนางสาว B ได้ข้อความไปก็ไม่เข้าใจอยู่ดี แต่นางสาว B สามารถเข้าใจได้ เพราะนางสาว B มีวิธีถอดรหัส (Decode) จริง ๆ แล้ว มีหลักฐานว่าการเข้ารหัสมีมาตั้งแต่สมัยเจงกิสข่านส่งข้อความแล้ว คงเพราะกลัวม้าเร็วโดนดักตีหัวและขโมยข้อความไป นอกจากนี้กระเทยไทยยังมีภาษาลู (เติมคำว่าลูไว้ข้างหน้าแล้วผวน1รอบ) การเข้ารหัสและถอดรหัสมีหลายแบบ และเป็นความหมกมุ่ยของมนุษย์บางกลุ่มมากๆ
การเข้ารหัสที่ติ่งต๊องที่สุดเช่น ROT-3 (Rotate-3) เช่น
A B C D E F G H……
X Y Z A B C D E…….
การเข้ารหัสคือ ถ้า Input บรรทัดบน จะได้ข้อความบรรทัดล่าง ซึ่งก็คือ กระเถิบไป 3 ตัวอักษร
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
X Y Z A B C D E F G H I J K L M N O P Q R S T Y V W
เช่นอยากส่งคำว่า ILOVEYOU จะได้ข้อความ
FILSBVLR สำหรับส่ง
ที่ต้องทำก็แค่บอก(ตกลงกับคนรับข้อความไว้ก่อนว่าจะส่งรหัสแบบ ROT-3)
เนื่องจากข้อความติ่งต๊องของมันจึงแกะง่ายโคตรๆ มนุษย์จึงคิดอีกวิธีขึ้นมา คือ การใช้ตาราง MAP โดยจะมีการตกลงกันล่วงหน้าว่าจะใช้ตารางแบบไหนในการ MAP ไปและกลับ เช่น ตารางต่อไปนี้
A B C D E F G H
H B E A C G D F
(ขออนุญาตเขียนแบบสมมุติ แค่ 8 ตัวอักษร)
เช่น อยากส่งคำว่า FABCFAB จะได้ข้อความเป็น
GHBEGHB
ซึ่งวิธีแกะคือใช้วิธีทางภาษาศาสตร์ และสถิติ เช่นในภาษาอังกฤษเรารู้ว่าตัว E , A เป็นอักษรที่ใช้เยอะ ตัวไหนมีเยอะ ๆ ก็ลองเดาเป็น E , A ก่อนแล้วทำการเดาแบบเดียวกันกับตัวอื่น ๆ (จริง ๆ วิธีการลึกซึ้งกว่านี้ นี่เป็นแค่ตัวอย่าง)
มนุษย์ก็เลยมีความคิดว่า จะต่อต้านการแกะโดยใช้สถิติยังไง IDEA ก็คือ ตัวอักษร A ตัวเดียว จะถูกแปลงเป็นตัวอักษรอื่น ๆ อีก หลายตัวเพื่อป้องกันการแกะโดยใช้สถิติได้ และนี่คือสิ่งที่ ENIGMA ทำ ENIGMA รับ Input 3 อย่าง
จะเห็นว่าค่า n เปลี่ยนไปเรื่อย ๆ ตามลำดับ แปลว่าถึงจะใส่ค่าเดียวกันเข้าไป enigma มากกว่า 1 ครั้ง ผลลัพธ์ก็จะเปลี่ยนไปเรื่อย ๆ ทำให้ไม่สามารถใช้สถิติแกะรหัสแบบนี้ได้
แล้ว ENIGMA ทำงานอย่างไร
Idea ของ ENIGMA ต้องการให้ตัวอักษรที่ผ่าน ENIGMA ออกมามั่วที่สุดและยังสามารถถอดรหัสได้โดยใช้ ENIGMA อีกเครื่องหนึ่ง
Output = f (input_char , initsetting , n)
ให้ f เป็น enigma function
Input_char เป็น ตัวอักษรที่จะEncode
Initsetting เป็น การตั้งค่าเครื่องเริ่มต้น
N เป็น ลำดับของตัวอักษรที่เข้า
Output เป็น ตัวอักษรที่ encode แล้ว
นอกจากนี้ enigma ยังต้องมีสมบัติ
ถ้า output = f (input_char , initsetting , n) แล้ว input_char = f (output , initsetting , n)
กล่าวคือ เอาตัวอักษร ใส่เข้าไปในenigma ออกมาได้ตัวอักษรใหม่ เอาตัวอักษรใหม่ใส่เข้าไปใน enigma อีกเครื่องหนึ่งที่ตั้งเครื่องเหมือนกับเครื่องแรกและลำดับเดียวกันต้องได้ตัวอักษรตัวแรกออกมา
การใช้ ENIGMA
1. ผู้ส่งสาร มีข้อความที่จะส่งให้เป็น K1
2. ผู้ส่งสารตั้งเครื่อง enigma ตามวิธีการตั้งเครื่อง ซึ่งวิธีการตั้งเครื่อง จะเปลี่ยนทุกวัน ตามภาพ
3. ผู้ส่งสารได้ตัวอักษรที่ encode แล้ว (K2)
4. ผู้ส่งสาร ส่งตัวอักษรที่ encode แล้วเข้าระบบ (K2) ไม่ต้องกลัวว่าจะถูกดักฟังเพราะ ถึงดักได้ก็ไม่มีประโยชน์เพราะไม่เข้าใจ และต่อให้ถูกขโมยเครื่อง enigma ไปก็ไม่สามารถถอดรหัสได้อยู่ดีเพราะว่าไม่รู้วิธีการติดตั้งเครื่องซึ่งเปลี่ยนทุกวัน
5. ผู้รับสาร รับ ตัวอักษรที่ encode แล้ว (K2)
6. ผู้รับสารตั้งเครื่องตามวิธีการติดตั้งเครื่องให้ตรงกับผู้ส่งสาร
7. นำข้อความที่ได้ encode แล้วเข้า enigma จะได้ข้อความเดิมกลับออกมา (K1)
จะเห็นว่า วิธีการเช้ารหัสและถอดรหัส ไม่เป็นความลับฝ่ายตรงข้ามขโมย enigma ไปก็ไม่มีประโยชน์ ข้อความที่ส่งก็ไม่เป็นความลับเพราะได้รับไปก็งงอยู่ดี แต่สิ่งที่เป็นความลับคือวิธีการตั้งเครื่อง enigma
ฝ่ายเยอรมันใช้วิธีการติดตั้งเครื่องที่เปลี่ยนทุกวัน พิมพ์ลงหมึกที่ละลายน้ำได้ แจกจ่ายเดือนต่อเดือน ถ้าจวนตัวจะถูกจับได้ ฝ่ายเยอรมันก็แค่เอาน้ำสาดวิธีการตั้งเครื่องก็จะละลายหายไป ความสุดยอดอยู่ที่ว่า วิธีการตั้งเครื่อง (KEY) สามารถเปลี่ยนได้บ่อย ๆ เปลี่ยนได้ ง่าย ๆ เมื่อเทียบกับ Algorithm ซึ่งถ้าเปลี่ยนก็ต้องเปลี่ยนเครื่องไปเลย การใช้ enigma จึงเป็นวิธีที่เหมาะสมมากมายในการรบ (ยุคเกือบ 100 ปี) ที่แล้ว
แกะดูข้างในเครื่อง enigma จะประกอบด้วย
1. Key board ก็ตามชื่อก็คือ ปุ่มมี26 ปุ่ม A-Z ใช้เป็น input
2. Light board คือไฟ มีตัวอักษรกำกับ A-Z ใช้เป็น Output
3. Rotors มี 3 ตัว ในเครื่อง (ตามมาตรฐาน) เวลาจะใช้มี 5 ตัว(ทั้งหมด) และเลือก 3 ตัว มาใช้ (ของ Army และ Air force) ของ (Navy จะใช้8ตัวเลือก3) การตั้ง Rotors จะมี 2 อย่าง คือ ตั้งจุดเริ่มต้น (ตั้งตำแหน่งเริ่มต้นว่าเริ่มจากตัวอักษรอะไร) และตำแหน่ง Kicker
เมื่อ Rotors C หมุนถึงจุด Kicker จะไปเตะให้ Rotors B ขยับไปหนึ่งตำแหน่งและเมื่อ Rotors B ขยับถึง Kicker จะไปเตะให้ A ขยับ 1 ตำแหน่ง
ภายใน Rotors จะมีการเดินสายแบบมั่ว ๆ เอาไว้ในแต่ละ Rotors จะเดินสายไม่เหมือนกัน เมื่อกดปุ่ม 1 ครั้ง Rotors ขวาสุดจะหมุน 1 step
4. Reflector หรือตัวสะท้อน จะไม่หมุน (Version ต่อมา สามารถหมุนได้) สามารถเปลี่ยนได้เหมือนกัน Reflector จะทำให้มั่นใจว่า กด A แล้วผลลัพธ์จะเป็นอันอื่นที่ไม่ใช่ A แน่นอน
5. Plug board เป็นที่เสียบปลั๊ก มีสาย 10 เส้น เป็นการเลือกเสียบ 10 คู่ รูที่ไม่ได้เสียบจะต่างกันเองแบบปกติ
Enigma wiring diagram
แสดงการทำงานของ Enigma
ความเป็นไปได้ทั้งหมดของ key (วิธีการ set เครื่องของ ENIGMA)
1. มี 5 Rotors (ของกองทัพบกและกองทัพอากาศของ Germars)
C(5 , 3) * 3! = (5*4*3*2*1) / ( 3*2*1*2*1) * (3*2*1)
= 5*4*3 กรณี
= 60 กรณี
2. มี 2 Reflector มี 2 กรณี
3. มีวิธีการตั้งจุดเริ่มต้นของ Rotors 26 แบบในแต่ละตัว
ดังนั้นมี 26 * 26 * 26 กรณี = 17576 กรณี
4. มีวิธีการตั้ง Kicker 26 แบบ ต้องตั้ง 2 ตัว (ตัวกลางและขวา)
มี 26 * 26 กรณี = 676 กรณี
5. Plug board มีสาย 10 เส้น ดังนั้นมี
1/10! * C(26 , 2) * C(24 , 2) * C(22 , 2) * …… C(8 , 2) = 26!/(10!*6!*2^10)
รวมทั้งหมด = 60 * 2 * 17576 * 676 * 150,738,274,937,250
ซึ่งได้ค่าประมาณ 320 ล้านล้านล้าน กรณี
การแกะ code enigma และจุดกำเนิด computer
ในเมื่อมี Key เยอะแยะไปหมดที่เป็นไปได้ เราจึงไม่สามารถใช้สมองของมนุษย์คิดได้ ดังนั้น Alan Turing จึงมาเกี่ยวข้องโดยการใช้เครื่องจักร (machine) ที่คิดเร็วกว่าคนโคตร ๆ เพื่อมาแก้ปัญหานี้และด้วยเวทมนต์ทางคณิตศาสตร์อีกสักกระบุง ฝ่ายอังกฤษจึงสร้าง Algorithm เพื่อสร้าง bombe เครื่องสำหรับแกะรหัส enigma
ในคราวต่อไปถ้าผมว่างผมจะพยายามอธิบายวิธีการแกะรหัส enigma ให้ฟังแบบไม่ต้องใช้ ทฤษฎีคณิตศาสตร์เยอะ ๆ นะครับ
ปล
1. Computer ในปัจจุบันสร้างโดยใช้แนวคิดของ Turing Machine ที่ Alan Turing เป็นคนคิด
2. Turing Test เป็นชื่อของวิธีการตรวจสอบปัญญาประดิษฐ์
3. Turing Award เป็นรางวัลสูงสุดของนักวิทยาศาสตร์คอมพิวเตอร์ (อารมณ์ประมาณ Nobel
prize ของ computer)
สำหรับคำถามที่ว่าเครื่องจักรสามารถคิดได้หรือไม่นั้น ผมขอไม่ตอบแต่ขอถามว่า เรือดำน้ำสามารถว่ายน้ำได้หรือไม่ คำตอบคือไม่ เรือดำน้ำไม่ว่ายน้ำ แต่เคลื่อนที่ได้ในน้ำ เครื่องจักรก็ไม่คิด แต่สามารถทำในสิ่งที่เหมือนกับมนุษย์คิดได้
___________________________________
http://expert-programming-tutor.com/
รับสอนเขียนโปรแกรมคอมพิวเตอร์
เพราะการเขียนโปรแกรมไม่ได้มีแค่การทำweb และการ insert/update/delete/select DB
[ view entry ] ( 3683 views ) | permalink | ( 3 / 3275 )
ทีมา
http://carlcheo.com/startcoding
[ view entry ] ( 4142 views ) | permalink | ( 3.2 / 1038 )
ทำไมคณิตศาสตร์สำคัญกับการเรียนเขียนโปรแกรมคอมพิวเตอร์
รับสอนเขียนโปรแกรมคอมพิวเตอร์
http://expert-programming-tutor.com/
ถ้าอยากเขียนโปรแกรมไม่เรียนคณิตศาสตร์ได้ไหมนะ?
คงเป็นคำถามที่หลายคนสงสัย จะว่าไปก็ต้องบอกว่าได้ครับ แต่โปรแกรมที่ได้จะมีลูกเล่นน้อย
นอกจากนี้ยังลำบากต่อผู้เรียนในการทำความเข้าใจอัลกอริทึมต่างๆเวลาเรียนอีกด้วย
และที่สำคัญคือนั่นจะไม่บรรลุจุดประสงค์ที่แท้จริงของการเขียนโปรแกรม
ทำไมหล่ะ? โดนัล เออร์วิน คนุธ (Donald Ervin Knuth) ผู้เป็นปรมาจารย์ด้านอัลกอริทึมกล่าวเรื่องการเขียนโปรแกรมไว้ว่า
“โปรแกรมที่ดีที่สุดเขียนขึ้นมาเพื่อให้เครื่องคำนวณ สามารถทำงานได้อย่างรวดเร็ว
และเพื่อให้มนุษย์นั้นสามารถเข้าใจเครื่องคำนวณเหล่านั้น
ในเชิงอุดมคติแล้วโปรแกรมเมอร์เป็นเหมือนนักเขียนรายงาน
ผู้ทำงานด้วยสุนทรียะตามแบบแผนและตามรูปแบบของงานเขียน
และรวมไปถึง [การใช้] ความคิดเรื่องคณิตศาสตร์
เพื่อจะสื่อสารให้รู้ว่าอัลกอริทึมทำงานอย่างไร
และเพื่อจูงใจให้ผู้อ่านเชื่อว่าผลลัพธ์จะถูกต้องเสมอ”
แล้วการเขียนโปรแกรมเขียนมาเพื่อคำนวณนั่นหมายความว่าอย่างไรนะ?
ถ้าจะพูดเรื่องนี้คงต้องเล่าถึงประวัติศาสตร์การเกิดคอมพิวเตอร์เสียก่อนว่ามนุษย์แต่ไหนแต่ไรมามีความต้องการที่จะหาเครื่องคำนวณอยู่แล้ว เช่น การขีดนับเลขกับกำแพงพัฒนามาหน่อยก็เป็นลูกคิดเป็นต้น วันเวลาผ่านไป เบส ปาสคาล(Blaise Pascal) ได้ประดิษฐ์เครื่องคำนวณแบบฟันเฟืองขึ้น โดยใช้หลักการหมุนของฟันเฟือง 1 อันถูกหมุนครบ 1 รอบ ฟันเฟืองอีกอันหนึ่งซึ่งอยู่ ทางด้านซ้ายจะถูกหมุนไปด้วยในเศษ 1 ส่วน 10 รอบ เครื่องมือของปาสคาลนี้ถูกนำมาขายในปี พ.ศ. 2188 แต่ไม่ค่อยมีคนนิยมเนื่องจากราคาแพง และตอนใช้งานจริงจะเกิดเหตุการณ์ที่ฟันเฟืองติดขัดบ่อยๆ ทำให้ผลลัพธ์ที่ได้ไม่ค่อยถูกต้องตรงความเป็นจริง ต่อมีไลบ์นิซGottfriend von Leibnitz) ได้ปรับปรุงเครื่องคำนวณของ ปาสคาลให้สามารถคูณและหารได้ด้วย
ชาลส์ แบบบิจ (Charles Babbage) “บิดาแห่งคอมพิวเตอร์” ต้องการสร้างเครื่องคำนวณหาผลต่าง แต่ไม่สำเร็จแต่ก็เป็นไอเดียของการสร้างคอมพิวเตอร์ต่อๆมา หลังจากนั้นเลดี้ เอดา(Lady Auqusta Ada Byron) ได้ทำการศึกษาความคิดของชาลส์ แบบิจจนเขียนวิธีการที่จะสร้างอย่างเป็นขั้นตอนด้วยภาษาคอมพิวเตอร์ชื่อ Ada จึงได้รับขนานนามว่าเป็น “โปรแกรมเมอร์คนแรก”อาดาได้ทำบัตรเจาะรูเพื่อให้คอมพิวเตอร์สามารถทำงานด้วยคำสั่งซ้ำๆจนเป็นที่มาของลูป(Loop)ในเวลาต่อมา ต่อในช่วงปี 1940 มีเครื่องคำนวณขนาดใหญ่ของจริงขึ้นมา โดยใช้หลอดสุญญากาศหลายๆท่อมาช่วยคำนวณเลขฐานสอง ชื่อ ENIAC (Electronic Numerical Integrator And Computer) แต่เครื่องแบบนี้ก็ร้อนมากแถมขนาดใหญ่มโหฬาร ต่อมาเลยทำเครื่องแบบ ทรานซิเตอร์ แทน.จอน นวูแมน (John Von Neumann) ได้พบวิธีการเก็บโปรแกรมไว้ ในหน่วยความจำของเครื่องเช่นเดียวกับการเก็บข้อมูลและต่อวงจรไฟฟ้า สำหรับการคำนวณ และการปฏิบัติการพื้นฐาน ไว้ให้เรียบร้อยภายในเครื่อง แล้วเรียกวงจรเหล่านี้ด้วยรหัสตัวเลขที่กำหนดไว้ เพื่อให้การใช้โปรแกรมง่ายขึ้น เครื่องคอมพิวเตอร์ที่ถูกพัฒนาขึ้นตามแนวความคิดนี้ได้แก่ EVAC (Electronic Ddiscreate Variable Automatic Computer)
คอมพิวเตอร์ถูกพัฒนามาเรื่อย John Backus และ IBM ร่วมกันสร้างภาษาคอมพิวเตอร์ชื่อ FORTRAN ซึ่งเป็นภาษาระดับสูง (high level programming language) ภาษาแรกในประวัติศาสตร์คอมพิวเตอร์ คอมพิวเตอร์ยุคต่อมาใช้ วงจรไอซี (Integrated Circuit) เป็นสารกึ่งตัวนำที่สามารถบรรจุวงจรทางตรรกะไว้แล้วพิมพ์บนแผ่นซิลิกอน (Silicon) เรียกว่า "ชิป"
หลังจากคอมพิวเตอร์ได้ผ่านการเวลาและมีภาษา Assembly ในการสั่งการเครื่องแล้วก็เกิดภาควิชาใหม่แยกออกมาจากภาควิชาคณิตศาสตร์นั้นคือภาควิชาคอมพิวเตอร์ที่มีการศึกษาด้านการพัฒนาซอร์ฟแวร์อย่างจริงจัง อลัน ทัวริ่ง(Alan Mathison Turing) ได้เขียนบทความชื่อ “ว่าด้วยจำนวนที่คำนวณได้และการประยุกต์ใช้สำหรับปัญหาการตัดสนใจ (On Computable Numbers with an application to the Entscheidungs problem)" บทความนี้เกี่ยวกับ คำสั่งตรรกะ (logical instructions)ของการทำงาน แล้วก็บอกว่าการทำงานต้องมี กฎเกณฑ์ที่แน่นอน (definite method) ทั้งหมดก็เป็นเรื่องที่เกี่ยวกับวิธีการเขียนโปรแกรมต่มมา ซึ่งทำให้ต่อมาเขาได้ชื่อว่าเป็น “ผู้ก่อตั้งวิทยาการคอมพิวเตอร์ในยุดใหม่”
จะเห็นได้ว่าจากประวัติคร่าวๆคอมพิวเตอร์นั้นเกิดจากการที่นักคณิตศาสตร์เริ่มจะขี้เกียจคิดเลขจนต้องหาเครื่องมาช่วยคิด ไปๆมาๆก็เลยกลายคอมพิวเตอร์และพัฒนากันมาจนถึงปัจจุบัน หากจะบอกคอมพิวเตอร์ไม่เกี่ยวกับคณิตศาสตร์ก็คงไม่ใช่แล้ว นี่เป็นเหตุผลแรกเลยก็ว่าได้ว่าทำไมเราจึงควรเรียนคณิตศาสตร์ ก็เพื่อให้เข้าใจคอมพิวเตอร์ได้มากที่สุดนั่นเอง
หน้าที่หลักของคอมพิวเตอร์คือการคำนวณแทนมนุษย์อย่างที่ได้กล่าวไปแล้ว แล้วจะคำนวณได้อย่างไรกันนะ?
ALU (Arithmetic & Logical Unit : ALU) หรือหน่วยคำนวณตรรกะ ทำหน้าที่เหมือนกับเครื่องคำนวณอยู่ในเครื่องคอมพิวเตอร์โดยทำงานเกี่ยวข้องกับ การคำนวณทางคณิตศาสตร์ เช่น บวก ลบ คูณ หาร นอกจากนี้ยังสามารถคำนวณในเชิงตรรกะศาสตร์ ได้แก่ ความสามารถในการเปรียบเทียบตามเงื่อนไข และกฎเกณฑ์ทางคณิตศาสตร์ เพื่อตรวจเงื่อนไขนั้นเป็น จริง หรือ เท็จ เช่น เปรียบเทียบมากว่า น้อยกว่า เท่ากัน ไม่เท่ากัน ของจำนวน 2 จำนวน เป็นต้น ซึ่งการเปรียบเทียบนี้มักจะใช้ในการเลือกทำงานของเครื่องคอมพิวเตอร์ จะทำตามคำสั่งใดของโปรแกรมเป็น คำสั่งต่อไป
ส่วนคำนวณเป็นส่วนประมวลผล ซึ่งนับว่าเป็นส่วนที่สำคัญที่สุดของเครื่องคอมพิวเตอร์ ส่วนคำนวณทำหน้าที่ใหญ่ ๆ สองประการ คือ ประการแรกทำการบวก ลบ คูณ และหาร ประการที่สองคือ ทำหน้าที่ตัดสินใจว่าข้อมูลมากกว่าหรือน้อยกว่าอีกข้อมูลหนึ่ง หน้าที่ทั้งสองประการนี้สามารถเกิดได้ด้วยการอาศัยวงจรตรรกะที่เป็นวงจรอิเล็กทรอนิกส์ จึงทำให้ส่วนคำนวณนี้มีชื่อเรียกอีกอย่างหนึ่งว่า ส่วนคำนวณตรรกะ (arithmetic logic unit; ALU) นอกจากนี้ ส่วนคำนวณสามารถเลื่อนข้อมูลไปทางซ้าย หรือทางขวา เก็บหรือย้ายข้อมูลไปยังส่วนอื่น ๆ ของส่วนควบคุมกลางได้ วงจรตรรกะ (logic circuits) เป็นวงจรทางอิเล็กทรอนิกส์ที่ใช้ส่วนประกอบ เช่น ตัวความต้านทาน ตัวเก็บประจุ ไดโอด ทรานซิสเตอร์ ฯลฯ มาจัดให้สามารถทำงานแทนการคำนวณทางตรรกะได้ โดยใช้ "การมีสัญญาณไฟฟ้า" และ "ไม่มีสัญญาณไฟฟ้า" แทนสภาวะตรรกะ "จริง" และ "เท็จ" หรือ "1" กับ "0"
และนี่ก็คือการทำงานของคอมพิวเตอร์นั่นเองต้องอาศัยเรื่องการคำนวณและตรรกศาสตร์ ซึ่งเรื่องพวกนี้ยังช่วยพัฒนาระบบความคิดของเราให้เป็นระบบซึ่งจะทำให้ง่ายต่อการเข้าอัลกอริทึมหรือวิธีคิดในการเขียนโปรแกรมคอมพิวเตอร์ด้วย
คณิตศาสตร์ช่วยเราแก้ปัญหาอะไรเราบ้าง?
ก็อย่างที่เรารู้กันแล้วว่าคอมพิวเตอร์ช่วยแก้ปัญหาทางคณิตศาสตร์ได้ แล้วคณิตศาสตร์ช่วยแก้ปัญหาอะไรให้เราบ้างนะ เราก็จะพบว่าโลกที่เราอยู่ทุกวันเต็มไปด้วยคณิตศาสตร์อยู่รอบตัวเรา
เช่น เวลาที่อยู่บ้าน เราตื่นนอนด้วยนาฬิกาปลุก ก็ต้องตั้งนาฬิกาปลุก ไหนจะตอนไม่ตื่นแล้วกดเลื่อนเวลานาฬิกาก็ต้องทำการคำนวณหาเวลาใหม่และทำการปลุกต่อไป ไม่เพียงแค่นี้เท่านั้นเรายังต้องใช้การคำนวณทำสิ่งต่างๆอีกมากมาย ทั้งการคำนวณเวลารายรับรายจ่ายประจำวัน หรือหาเฉลี่ยของค่าใช้จ่ายรายเดือน หรือแม้กระทั่งเราจะทาสีบ้านต้องใช้สีเท่าไหร่ จะวางเฟอร์นิเจอร์อย่างไรให้ได้พื้นที่ใช้สอยสูงสุด
และเวลาที่ไปเที่ยวก็ยังต้องมีการคำนวณระยะทาง ระดับน้ำมันที่จะใช้ หรือถ้าขึ้นเครื่องบินเราก็ต้องคำนวณการเดินทางไปให้ทันเวลาออก ไหนจะน้ำหนักกระเป่า ว่าเราควรจะใส่อะไรในกระเป่าให้เป็นประโยชน์มากที่สุดก็ล้วนต้องใช้คณิตศาสตร์
นอกจากนี้ในระดับประเทศเราก็ยังระบบธนาคารการคำนวณดอกเบี้ย หากเราฝากเงินไว้กับธนาคารเราจะสามารถคำนวณล่วงหน้าถึงดอกเบี้ยที่จะได้ ราคาหุ้นที่ต้องเปลี่ยนไปวินาทีต่อวินาทีต้องมีการคำนวณอย่างรวดเร็วบนหน้าจอแสดงผล การเก็บข้อมูลประชากรก็ไม่ใช่เรื่องเล่นๆ เรายังต้องคำนวณหาว่าแล้วพลเมืองของรัฐจะเติมโตขึ้นกี่เปอร์เซ็นต์เพื่อนำไปคำนวณด้านอาหาร พลังงานและโรงเรียน สาธารณูปโภคให้มีเท่ากับความต้องการของคนในชาติ หรือถ้าพบว่ามีแนวโน้มลดลงเราจะหาคนจากไหนมาทำงานต่อ รวมไปถึงเวลามีโรคแพร่ระบาดก็ต้องควบคุมประชากรและคำนวณหาโอกาสของผู้ที่จะติดเชื้อด้วย การหาเลขบัตรประชาชนที่จะไม่ซ้ำกับคนอื่นๆ
และสำคัญที่สุดที่ขาดไม่ได้คือโลกแห่งวิทยาศาสตร์ที่เติมโตไปข้างหน้าทุกวันก็ปฏิเสธไม่ได้เลยว่าวิทยาศาสตร์ต้องเดินด้วยคณิตศาสตร์ คอมพิวเตอร์เป็นเทคโนโลยีเป็นวิทยาศาสตร์ก็ต้องเดินด้วยคณิตศาสตร์ แต่ก่อนนักวิทยาศาสตร์นั้นอธิบายปรากฏการณ์ของโลกด้วยคำบรรยายมากมาย แต่เมื่อกาลิเลโอผู้มีเรื่องเล่าว่าไปโยนหินบนหอเอนปิซ่า ได้ขึ้นมาประกาศว่าต่อไปนี้ฟิสิกส์ และธรรมชาติ จะสามารถอธิบายด้วยคณิตศาสตร์ได้เพราะคณิตศาสตร์มีความถูกต้องเหมือนกับที่ฟิสิกส์มีความถูกต้อง ก็เป็นที่นิยมมาถึงปัจจุบันที่ฟิสิกส์และศาสตร์อื่นนำคณิตศาสตร์มาใช้อธิบายโลก เช่น การเดินทางดวงจันทร์ และการคำนวณอื่นๆอีกมากมาย
เกมส์ต่างๆที่เราเล่นก็ต้องใช้คณิตศาสตร์นะ ทุกวันนี้เวลาต้องเดินทางด้วยรถเมล์หรือบีทีเอสนานๆมันคงน่าเบื่อไม่น้อยถ้าเรายังต้องมานั่งบิดบัตรบีทีเอสเล่นไปมา แต่ด้วยความโชคดีที่เหล่าโปรแกรมเมอร์ทั้งหลายต่างสร้างเกมส์มาเพื่อแก้เบื่อให้เรา แล้วเกมส์มันสร้างยังไงล่ะ คำตอบคือเกมส์ก็เป็นการคำนวณทางคณิตศาสตร์ ขั้นเล็กน้อย ตั้งแต่ set vector ,matrix เช่นการเปลี่ยนตำแหน่งของตัวละคร ให้สัตว์ประหลาดหรือมอนสเตอร์มาโจมตีผู้เล่นต่างก็เป็นคณิตศาสตร์ทั้งนั้น ไปจนถึงคณิตศาสตร์ชั้นสูง (calculus , linear algebra ฯลฯ )เช่น การ simulate ต่างๆ มากมาย
ในชีวิตประจำวันๆหนึ่งเราไม่สามารถหนีคณิตศาสตร์ได้เลยจริงๆ แต่การคำนวณทางคณิตศาสตร์จะทำทุกครั้งด้วยตัวเองก็ไม่ไหว เราจึงควรศึกษาคณิตศาสตร์เพื่อมาเขียนโปรแกรมซะ ชีวิตจะได้ง่ายขึ้นเยอะ
สมองมนุษย์กับคณิตศาสตร์
และนอกจากนี้ ถึงจะไม่เกี่ยวกับคอมพิวเตอร์เท่าไหร่ แต่การเรียนคณิตศาสตร์ก็ยังมีช่วยในจิตใจสงบและเกิดสุนทรียภาพด้วย จากบทความ “Mathematics: Why the brain sees maths as beauty” โดย James Gallagher ก็ยังกล่าวว่า ความงามของคณิตศาสตร์เกิดจากการที่ตอนแรกเรามองไม่เห็นความเชื่อมโยงของสัญลักษณ์ต่างๆแต่เมื่อเมื่อเชื่อมโยงกันและเราเข้าใจสมองจะทำงานในรูปแบบเดียวกับตอนที่เราดูงอนศิลปะเลยทีเช่น เช่น e^{i *pi} + 1 = 0 เราอาจไม่เข้าใจ e i และ pi สัมพันธ์กันอย่างไรแต่เมื่อมันสัมพันธ์กันเราก็จะเกิดความสุนทรีย์ การเรียนคณิตศาสตร์ก็เป็นการคลายเครียดไปอีกแบบนั่นเอง
*************************************
บทความโดยน้องตี้
รับสอนเขียนโปรแกรมคอมพิวเตอร์
http://expert-programming-tutor.com/
[ view entry ] ( 1318 views ) | permalink | ( 2.9 / 1303 )
| 1 | 2 | 3 | 4 | 5 | Next> Last>>