Dec 26, 2007

วิธีใช้ Thunderbird ดึงเมล์จาก hotmail

ก่อนจะไปยังส่วนอื่น ขอแนะนำสำหรับมือใหม่ที่ยังไม่รู้จัก Thunderbird
Thunderbird เป็นโปรแกรมที่ใช้งานเกี่ยวกับการรับ E-mail ที่อยู่ใน
Mail Server ของค่ายต่างๆ เช่น hotmail.com, gmail.com
หรือจะเป็น yahoo.com และอีกหลายๆ เว็บที่เราไปมีบัญชีอีเมล์ที่นั่น
โดยหน้าที่ของมันคือจะนำจดหมายของเราเหล่านั้นมาเก็บไว้สำหรับอ่าน
ยังเครื่องส่วนตัวของเรา ซึ่งถ้าในช่วงหลังจากนั้น อินเตอร์เน็ตของเรา
อาจจะถูกตัดขาดจากโลกภายนอก เราก็ยังสามารถจะตามอ่านเมล์ที่
โหลดมาก่อนที่เน็ตจะตัดได้โดยผ่านตัวโปรแกรม

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

โปรแกรมที่เราๆ ท่านๆ อาจจะรู้จักอีกโปรแกรมคือ Microsoft Outlook
ยิ่งพนักงานบริษัทไม่ต้องพูดถึง อย่างช่วงฝึกงาน ผมได้ไปฝึกที่บริษัท
โซนี่ ประเทศไทย เห็นพี่ๆ ที่บริษัทเขาใช้ กันเยอะ แต่ก็พบปัญหาบ่อยคือ
มันค้างทุกทีเลย ถ้ารับอีเมล์จำนวนมากๆ แต่ของ Thunderbird นั้น
ถ้าเอาไปใช้ ผมว่าคงยากที่จะค้าง เพราะลองเล่นเปรียบเทียบดูคร่าวๆ แล้ว
เอาเป็นว่าถ้าจะใช้พวก get mail client Thunderbird
ก็นับเป็นตัวเลือกที่น่าสนใจเลยเชียวแหล่ะ

เอาล่ะ เสียเวลากับการทำความรู้จัก Thunderbird มาพอสมควรแล้ว
เรามาดูกันดีกว่าว่า จะตั้งค่าให้ Thunderbird ใช้ hotmail ได้อย่างไร
เพราะว่าตามปกติ hotmail จะให้ใช้ได้ก็ต่อเมื่อเสียตังค์เพิ่ม ซึ่งจะได้รับทั้ง
พื้นที่ความจุของกล่องจดหมาย และการเข้าถึงเมล์โดยพวกโปรแกรม get mail client
ซึ่งหากว่าใช้ Microsoft Outlook ล่ะก็ มันจะไม่สามารถข้ามกฎข้อนี้ไปได้เลย
นอกจากเสียตังค์อย่างเดียว (เท่าที่ผมศึกษาและลองใช้ในปัจจุบันนะครับ)
ยังไงก็ตามแต่ทุกอย่างมีวิธีการหรือหนทางใหม่ๆ เสมอ "ของฟรีดีๆ ยังมีในโลก" ^ ^

โดยขั้นตอนมีคร่าวๆ ดังนี้
1. Download Program ที่ http://www.mozilla.com/en-US/thunderbird/

2. Download Extension ซึ่งจะต้องมี Extension 2 ตัว คือ
Webmail และ Component สำหรับเมล์ที่ต้องการใช้งาน ในที่นี้คือ hotmail
ซึ่ง Download Extension ได้ที่ http://webmail.mozdev.org/installation.html

3. เปิด Thunderbird ขึ้นมา หากเป็นการเปิดครั้งแรกจะมี กล่อง Account Wizard ขึ้นมาให้กด Cancel ไปก่อน

4. ทำการติดตั้ง Extension ที่ Download มาทั้ง 2 ตัว
โดยใช้เมนู Tool -> Extension เมื่อมีหน้าต่าง Extension ขึ้นมาให้คลิกปุ่ม Install
และไปเลือกเอา Extension ที่ Download มาทำการ Install โดยทำการ Install ทืละตัว
เมื่อทำการติดตั้งเสร็จแล้วให้ทำการปิดโปรแกรม Thunderbird และเปิดโปรแกรมขึ้นมาใหม่
เพื่อให้ Extension ทั้ง 2 ตัวเริ่มการทำงาน

5. ทำการเปิด Thunderbird ขึ้นมาใหม่แล้วสังเกตุดูว่าจะมี Web Mail เพิ่มขึ้นมา
ให้คลิกเลือกที่ Webmail และกดปุ่ม Next

6. ป้อนให้ครบโดย Your name คือชื่อของคุณ (ไทยหรืออังกฤษก็ได้)
Email Address คืออีเมล์ที่คุณต้องการใช้ และทำการคลิก Next

7. Incoming User Name และ Outgoing User Name ให้ใส่ชื่อ E-mail ของตนเอง
และอย่าลืมคลิกเลือกที่ Download Messages now ด้วย เพื่อโหลดทันที และเมื่อเสร็จแล้วให้คลิก Finish

8. เสร็จสิ้นการตั้งค่าให้ Thunderbird รับเมล์จาก hotmail (เย้ เสร็จสักที)
รอซักแป๊บโปรแกรมจะเริ่มโหลดจดหมายมาให้เราแล้วครับ

สามารถดูตัวอย่างที่เป็นการตั้งค่าให้กับ yahoo mail ได้ที่
http://www.osdev.co.th/index.php?option=com_content&task=view&id=27&Itemid=70
ซึ่งส่วนหนึ่งที่ผมทำได้ก็มาจากที่นี่ด้วยเช่นกันครับ (ดูรูปประกอบจากลิงค์ดังกล่าวได้เช่นกัน เพราะคล้ายกันๆ)

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

Dec 2, 2007

ปัญหา upload file ของ ASP กับ Windows Server 2003

ในช่วงสองสามเดือนที่ผ่านมา ผมเฝ้ามองหาวิธีการของการ upload file สำหรับ
ภาษา ASP VB Script ซึ่งยอมรับว่าหายากมาก เพราะส่วนใหญ่นั้นจะเป็น
Component เสริม ซึ่งต้องซื้อต่างหากจาก บริษัท ต่างๆ
ซึ่งคงไม่ไหวแน่นอน ถ้าเพียงต้องการแค่ให้ upload file ได้

ทำไมของฟรีมี จึงไม่ใช้?
ของฟรีที่ว่า ส่วนใหญ่แล้วจะอยู่ที่ PHP ซะมาก
เวลาทำอะไร ก็เพียงค้นๆ ใน google ไม่กี่นาทีก็ได้มาแล้ว
สำหรับ ASP นี้ ต้องมองหาจากผู้ที่เคยใช้มาแล้วบ้าง
หรือจากที่อื่นๆ ซึ่งผมก็นำ Source code ของ Webboard
ASPThai.net ซึ่งทางทีมงานที่นั่นได้แจกจ่ายให้นำไปใช้ได้
ซึ่งก็นำไปใช้และดัดแปลง เยอะพอสมควร
และก็ได้ศึกษา Source code บางส่วนของการ upload file ด้วยเช่นกัน

ทำไมเครื่อง Server ส่งข้อมูลไม่ได้ หรือถ้าได้ก็ไม่เกิน 200 kb?
ผมพบปัญหานี้หลังจากที่ได้ทดสอบด้วยการทำงานบน Server ของลูกค้า
ปัญหาที่เกิดขึ้นหลายๆ อย่าง ไม่เกิดกับเครื่องที่ผมลอง แต่ดันเกิดที่ Server
ผมพยายามคิดในทางลบไว้ก่อนว่า เป็นเพราะผมเขียน Code ได้ไม่ดี จึงเกิดปัญหา

ทำไมเครื่อง ส่วนตัวผมถึงไม่มีปัญหากรณี upload file เกิน 200 kb?
ผมทดสอบอยู่หลายรอบ จนแน่ใจแล้วว่า ไม่ได้เป็นที่ Source code ที่ผมเขียนลงไป
แต่เป็นที่เครื่อง server ของทางลูกค้าเอง

ปัญหานี้ใครจะรับผิดชอบ?
หลังจากสรุปปัญหาได้ ก็ลองสอบถามและแก้ไขดูเอง จนโดนผู้ดูแล Server ฝั่งลูกค้า
บ่นมาหลายที และในที่สุดผมจึงไม่ดำเนินการแก้ไขเอง แต่แจ้งทาง ผู้ดูแล Server แทน
พร้อมกันนั้นก็ได้ส่ง ข้อมูล ที่น่าจะช่วยแก้ไขปัญหาดังกล่าวได้ ว่าต้องไป config server อย่างไร

สรุปแล้วปัญหาเกิดจากอะไร?
ปัญหาเกิดจาก Windows Server 2003 นั้นถูกกำหนดค่าให้สามารถที่จะ upload file
ได้ไม่เกิน 200 kilobyte หรือในค่าที่ตั้งไว้คือ 204800 byte
ดังนั้นถ้าหากต้องการให้รับไฟล์ได้มากกว่าที่กำหนด ก็ต้องเข้าไปปรับเปลี่ยนที่ค่าดังกล่าว
คือที่ C:\Windows\System32\inetsrv\metabase.xml
โดยหาบรรทัดที่เขียนว่า AspMaxRequestEntityAllowed เมื่อเจอแล้วให้เปลี่ยนเป็นค่าใหม่
ส่วนที่เครื่องของผมนั้น สามารถรับไฟล์ได้ขนาดใหญ่ และไม่เกิดปัญหาเพราะเป็น windows xp Profressional
ซึ่งเท่าที่สังเกต ปัญหานี้น่าจะเป็นเฉพาะกับ Windows Server 2003 เท่านั้น
สำหรับแหล่งอ้างอิงที่ทำให้ผมแก้ไขปัญหาได้คือ
http://www.dvhome.co.uk/45/

Sep 26, 2007

ASP error about type mismatch!

วันนี้พยายามกลับมาเขียนเว็บต่อในส่วนของ Poll

ซึ่งเป็นระบบ Management Poll

โดยจะมีทั้งการ Insert, Delete, Update, Active

คุณสมบัติเด่นๆ ก็คือจะเลือกแสดง Poll ได้หลายๆ Poll พร้อมกัน

และมีการลงคะแนนได้หนึ่ง Username ต่อ Poll

ความต้องการของลูกค้ามีประมาณนี้

ผมก็เร่งทำจนเรียบร้อยแต่ติดปัญหาอยู่นานกับ ERROR แบบหนึ่ง

นั่นคือ TYPE MISMATCH ซึ่งสงสัยว่าทำไมจึงติด ERROR ได้

ลองเข้าไป ค้นหาใน www.google.com ด้วย Firefox ทันใด

ก็พบหลายเว็บน่าสนใจ แต่ที่จะเอามาคุยตรงนี้ก็คือ เว็บที่มี URL ว่า

http://www.codingforums.com/showthread.php?t=26385

ในนี้เขาบอกวิธีแก้ไขปัญหาเอาไว้ น่าสนใจดี คือการใช้ VarType() Function

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

ซึ่งชนิดข้อมูลที่จะมีการคืนค่าเมื่อใช้ฟังก์ชันจะมีดังนี้

0 Uninitialized
1 Contains no valid data
2 Integer subtype
3 Long subtype
4 Single subtype
5 Double subtype
6 Currency subtype
7 Date subtype
8 String subtype
9 Object
10 Error subtype
11 Boolean subtype
12 Variant (only use for arrays of variants)
13 Data access object
14 Decimal subtype
17 Byte subtype
8192 Array

ซึ่งปัญหา ERROR
Microsoft VBScript runtime (0x800A000D)
Type mismatch
ก็จะสามารถแก้ได้ ด้วยประการนี้แหล่ะ หุหุ

ซึ่งสำหรับงานผม บังเอิญตั้งค่าในฐานข้อมูลเป็น decimal

ด้วยความที่เข้าใจว่าเป็นชนิด ตัวเลข จึงคิดว่าน่าจะเข้ากันได้กับ integer

ผมจึงต้องใช้ Function CInt เพื่อครอบข้อมูลที่เป็นชนิด Decimal

ให้สามารถเข้ากันได้ สุดท้ายจึงใช้ได้ อิอิ

สำหรับใครที่มีข้อมูลรายละเอียด ชนิดข้อมูลของ MS SQL SERVER 2000

แบบละเอียดๆ ช่วยส่งลิงค์มาให้ด้วยนะครับจะขอบคุณมากเลย

ได้ความรู้เพิ่มอีกล่ะ เข้าใจ MS SQL SERVER 2000 และ ASP เข้าไปอีกเปาะ

บอกตัวเองอีกครั้งว่าสู้ๆ "งานจะปิดเต็มทีแล้ว"


เอ้อ เกือบลืมบอก พอดีมีน้องสาวคนสวย

แนะนำ Website ของสาขาวิทยาการคอม

ของนอร์ทกรุงเทพ นี่แหล่ะ พึ่งเปิดได้เดือนกว่าๆ เองมั้ง

ใครสนใจ ก็เข้าไปแวะชมกันได้ ที่ http://www.c2speed.com/

เท่าที่ดู ก็น่าสนใจดี คงต้องปรับไปเรื่อย

นับเป็นก้าวที่ดี พยายามกันเข้าล่ะ น้องๆ ปีสาม ^ ^ พี่โต คอยเชียร์ โฮ่ะๆ

Sep 21, 2007

Problem ASP include dynamic URL

กลับมาแล้วครับกับ วิชาการๆ เนื่องจากในช่วงเวลา ประมาณ เกือบๆ เดือน ผมได้มีโปรเจกเข้ามา
เป็นงานของบริษัท แถวๆ เมืองทองธานี งานที่ว่าก็เป็นงานเว็บไซด์เช่นเคยครับ แต่เป็นภาษา ASP
ใช้ฐานข้อมูลของ MS SQL SERVER 2000 ภาษา ASP เป็นภาษาที่ผมค่อนข้างจะไม่ค่อย
ได้ใช้เวลากับมันซักที ทำให้ไม่ค่อยเชี่ยวชาญ และติดๆ ขัดๆ อยู่เยอะเหมือนกัน
เท่าที่จำได้คือเสียตังค์เข้าอบรม ASP เบื้องต้นที่ทางสถาบันจัดขึ้น เนื่องจากเป็นนักศึกษา
ค่าใช้จ่ายเลยไม่มากเท่าไหร่ ช่วงนั้นก็ประมาณ ปี 48 ได้ ตอนนี้ 50 ล่ะลืมหมดเกลี้ยงเลย เหอะๆ
อบรมครั้งนั้น มีทั้งหมดสองวัน เรื่องที่ลึกที่สุดถึงเพียงแค่การต่อเชื่อมกับ ฐานข้อมูล MS Access 97
ผิดหวังหน่อยๆ แต่ก็ถือเป็นประสบการณ์ที่ดี เพราะตอนนั้นไม่ได้จับภาษาใดเลย (เขียนเว็บยังไม่เป็น)

และในครั้งนี้ ผมต้องมานั่งอ่านศึกษา ตำราต่างๆ เพื่อรื้อฟื้น ASP
จะว่าเป็น ASP.NET ก็อยากใช้นะ แต่ไม่มั่นใจ SERVER ว่ารองรับหรือเปล่า
เลยต้อง ใช้ ASP ธรรมดาเพื่อความปลอดภัยไปก่อน ยากเหมือนกันนะเนี่ย
ผมใช้เวลา ประมาณ สองสัปดาห์ กว่าจะเรียบเรียงข้อมูลต่างๆ เกี่ยวกับ ASP ได้
แต่ที่ได้เร็วก็เพราะใช้วิธีการเทียบเคียงกับภาษาอื่นๆ เช่น PHP หรือ JSP
ผมรู้สึกแย่เหมือนกัน ที่ปกติเขียนโปรแกรม เชิงวัตถุ แต่กลับต้องมานั่งเขียนเป็น โปรแกรมแบบโครงสร้าง
ทำให้งานผมช้ากว่า ภาษาที่กล่าวมาทั้งหมด แต่ก็พยายามทำความเข้าใจ จนเขียนได้คล่องในเวลาต่อมา
แต่ก็ยังติดปัญหา เมื่อมันเกิดความผิดพลาด เพราะดูเหมือนว่ารายละเอียดที่มันแจ้งมาเยอะแยะ
ส่วนใหญ่แล้วไม่ได้ช่วยอะไรขึ้นเลย... เหอะๆ แย่จัง

คราวนี้ ก็จะยกปัญหาอีกปัญหา ที่ไม่น่าจะเกิดขึ้นได้เลย
เพราะมันน่าจะเป็นวิธีการง่ายๆ ที่ไม่น่าที่จะเกิดการไม่รองรับของสคริป
ซึ่งก็คือการ include file แบบ dynamic
ก็หมายถึงว่า การใช้ ตัวแปรเป็นตัวอ้างอิงไปยัง URL แทน
ตัวอย่างคือ
(จากตัวอย่างต้องมีเครื่องหมาย "!" แต่แทนด้วย @ และ "%" แทนด้วย "+"
แต่ใส่ตรงๆไม่ได้เพราะจะกลายเป็น comment )

<@--#include file="tabNews.asp" -->
นี่คือแบบที่เป็นการ กำหนดแบบบังคับโดยให้ Include file ที่ชื่อ page.asp เพียงอย่างเดียว

<@--#include file="<+=urlLink+>" -->
นี่คือแบบที่ไม่สามารถจะทำงานได้ เนื่องจาก หาก ASP เจอเครื่องหมาย # ก็จะเข้าใจว่าเป็น comment ทันที
จึงไม่แสดงผล ซึ่งผมเอง งง อยู่นาน ว่าทำไมมันถึงผิดพลาด จึงไปค้นหลายๆ เว็บ
แล้วก็เจอวิธีแก้ไข โดยใช้ วิธีการอื่นแทน ดังนี้

dim strFile, fso, fsoFile
strFile = "upload/"& CStr(filename)
If strFile <> "" then
set fso = createObject("Scripting.FileSystemObject")
set fsoFile = fso.openTextFile(Server.MapPath(strFile))
response.write "" & fsoFile.readAll & ""
set fso = nothing
set fsoFile = nothing
end if

ซึ่งเป็นการแก้ไขด้วยการดึงข้อความจากลิงค์ที่กำหนดมาจนครบ แล้วถึงจะแสดงผล
เป็นวิธีการพื้นๆ แต่ก็ใช้ได้จริง ซึ่งถ้าใครมีวิธีการที่ดีกว่านี้ ก็ช่วยแนะนำด้วยนะครับ
จะขอบคุณมากๆ เลย ที่มานะครับอยู่ที่เว็บ
http://www.developerfusion.co.uk/show/234/

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

Jul 23, 2007

การค้นตัดคำ PHP with bag of words algorithm

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

ใครมีความคิดเห็นยังไง หรือเจอ Bug ช่วยแจ้งด้วยนะครับ
จะได้นำไปปรับปรุง

ช่วงนี้ ขอแว๊บไปทำงานต่อก่อนล่ะ ครับ



function indexCountText($text,$word)
{
$num = count(explode(strtolower($word), $text)) - 1;
return $num;
}


function cutText($file,$num)
{


$descriptor = fopen ($file, "r");
$contents = fread ($descriptor, filesize ($file));
fclose ($descriptor);
$text = htmlspecialchars($contents);
$text = strtolower($text);


$notChar = array(":",",",";",":",";","?",".","0","1","2",
"3","4","5","6","7","8","9","]","[","(",")","/",
"-","&","*","$","_","'");


$az = array(" 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 ");


$notCheck = array(" then "," i "," the "," is "," am "," are "," a ",
" what "," why "," when "," where "," who "," which "," with ",
" and "," but "," will "," be "," to "," or ", " on "," in ",
" if "," do "," of "," any "," by "," at "," for "," as ",
" its ","http","www"," that "," not "," some ",
" it ","the ","for "," was "," than "," can "," an "," all ",
" also "," yes "," you "," your "," after "," has "," have ",
" how "," into "," like "," may "," often "," other "," such ",
" so "," they "," this "," those "," use "," used "," well ",
" were "," would "," vs "," about "," eg "," ie "," ed "," ma ",
" quot "," he "," amp "," one "," two "," age "," no "," from ",
" see "," ms "," form "," rd "," eda "," low "," length ",
" large "," now "," up "," more "," very "," new "," between ",
" over "," text "," out "," take "," these "," only "," etc ",
" there "," however "," order "," same "," review "," wants ",
" while "," until "," us "," we "," id "," our "," own ",
" her "," de "," ca ","\r\n","\r","\t");


$text = str_replace($notChar,"",$text);
$text = str_replace($az," ",$text);
$text = str_replace($notCheck," ",$text);


$wordAll ="";


$text = str_replace("\n"," ",$text);
$text = str_replace("\r"," ",$text);
$text = str_replace("\r\n"," ",$text);
$text = str_replace($notChar,"",$text);
$text = str_replace($az," ",$text);
$text = str_replace($notCheck," ",$text);


$text = trim($text);
$word = explode(" ", $text);
$word = implode(" ",$word);
$word = trim($word);
$word = explode(" ", $word);
$word = implode(" ",$word);
$word = trim($word);
$word = explode(" ", $word);
$word = implode(" ",$word);
$word = trim($word);
$word = explode(" ", $word);
$word = implode(" ",$word);
$word = trim($word);
$word = explode(" ", $word);
$word = implode(" ",$word);
$word = trim($word);
$word = explode(" ", $word);
$word = implode("#",$word);
$word = trim($word);
$word = explode("#", $word);


//array_multisort($word,SORT_ASC);
$word = array_unique($word);


switch($num)
{
case 0:

$word = implode("\n",$word);
$word = explode("\n",$word);

for($i=0; $i<= count($word)-1; $i++)
{
$wordNum[$i] = indexCountText($text,$word[$i]);
}

array_multisort($wordNum,SORT_DESC,$word);

for($i=0; $i<= 9; $i++)
{
$wordAll .= $word[$i]." ".$wordNum[$i]." time(s)\n\n";
}

return $wordAll;
break;

case 1:
$word = implode(" ",$word);
return substr($word, 0, strlen($word));
break;
}// end case
}

JAVA code with Rail fence algorithm


private String RailFenceCipher(String text,int key,boolean encry)
{
String spText="";
char[][] irText;
int row = 1;
int column = 1;
int k=0;
int j=0;
int i=0;

//รับ plaintext จากผู้ใช้เก็บไว้เป็นตัวแปรอาร์เรย์
char[] iText = new char[text.length()];
iText = text.toCharArray();

try {
//เข้าเงื่อนไขนี้ ถ้าต้องการเข้ารหัส
if(encry == true)
{

spText += "Plaintext = "+text;
spText += "\nKey = "+key;

//ถ้าความยาวของจำนวนอักขระเป็นเลขคี่
if(text.length()%key != 0) //check row
{
//ให้บันทึกความยาวของแถว และ คอลัมภ์โดยคิดด้วยการหารกับคีย์ที่ได้มา
//และเพิ่มคอลัมภ์ให้มีมากขึ้นอีกหนึ่งคอลัมภ์

row = key-1;
column =(text.length()/key) ;
} else {
//ให้บันทึกความยาวของแถว และ คอลัมภ์ โดยคิดด้วยการหารกับคีย์ที่ได้มา
row = key-1;
column = (text.length()/key)-1;
}

//ประกาศจำนวนแถวและคอลัมภ์ที่จะจัดเรียงและเข้ารหัส
irText = new char [row+1][column+1];
spText += "\nrow="+(row+1)+" column="+(column+1);

//วนตามจำนวนอักษรที่รับเข้ามา
k=0;
i=0;
j=0;
while(k<=text.length()-1)
{
//ถ้าแถวเกินให้ตั้งแถวใหม่และเปลี่ยนคอลัมภ์
if(i>row)
{
i=0;
j++;
}
//ถ้าคอลัมภ์เกินให้ตั้งคอลัมภ์ไปที่คอลัมภ์แรก
if(j>column)
{
j=0;
}
//นำค่าที่ได้จากการดึงอักษรที่มีมาเก็บไว้ในรูปแบบใหม่ที่ผ่านการเรียงแบบ Rail fence
irText[i][j] = iText[k];

//เพิ่มแถวและเพิ่มตัวชี้ลำดับอักษรที่ป้อนเข้ามา
i++;
k++;
}
spText += "\n\n";

//วนข้อมูลในการอ้างถึงอาร์เรย์โดยสิ้นสุดเมื่อวนครบซึ่ง คิดจาก แถวคูณคอลัมภ์
i=0;
j=0;
k=0;
while(k<((row+1)*(column+1)))
{
//ถ้าแถวมากกว่าแถวทิ่กำหนดให้แถวเริ่มต้นที่ 0 ใหม่
if(i>row)
{
i=0;
}
//ถ้าคอลัมภ์มากกว่าคอลัมภ์ที่กำหนดให้คอลัมภ์เริ่มต้นที่ 0 ใหม่
//และให้มีการเพิ่มค่าแถวอีก 1 และให้มีการเว้นบรรทัดด้วย

if(j>column)
{
j=0;
i++;
spText += "\n";
}
//แสดงอักษรตามการเรียงที่ละคอลัมภ์และทำการเพิ่มค่าหลักและเพิ่มค่าตัวนับอย่างละ 1
spText += "\t"+irText[i][j];
j++;
k++;
}

//แสดง ciphertext โดยเรียงตามแถว
spText += "\n\nCiphertext = ";
for(i=0;i<=row;i++)
for(j=0;j<=column;j++)
{
spText += ""+irText[i][j];
}
}
else //จะกระทำเงื่อนไขนี้ ก็ต่อเมื่อต้องการถอดรหัส
{
spText += "Ciphertext = "+text;
spText += "\nKey = "+key;
//ถ้าความยาวของจำนวนอักขระเป็นเลขคี่
if(text.length()%key != 0) //check row
{
//ให้บันทึกความยาวของแถว และ คอลัมภ์โดยคิดด้วยการหารกับคีย์ที่ได้มา
//และเพิ่มคอลัมภ์ให้มีมากขึ้นอีกหนึ่งคอลัมภ์

row = key-1;
column =(text.length()/key) ;
} else {
//ให้บันทึกความยาวของแถว และ คอลัมภ์ โดยคิดด้วยการหารกับคีย์ที่ได้มา
row = key-1;
column = (text.length()/key)-1;
}

//ประกาศจำนวนแถวและคอลัมภ์ที่จะจัดเรียงและถอดรหัส
irText = new char [row+1][column+1];
spText += "\nrow="+(row+1)+" column="+(column+1);


//วนตามจำนวนอักษรที่รับเข้ามา
i=0;
j=0;
k=0;
while(k<=text.length()-1)
{
//ถ้าแถวมากกว่าแถวทิ่กำหนดให้แถวเริ่มต้นที่ 0 ใหม่
if(i>row)
{
i=0;
}
//ถ้าคอลัมภ์มากกว่าคอลัมภ์ที่กำหนดให้คอลัมภ์เริ่มต้นที่ 0 ใหม่
//และให้มีการเพิ่มค่าแถวอีก 1

if(j>column)
{
j=0;
i++;
}
//ให้ตัวแปรอาร์เรย์เก็บค่าที่ป้อนเข้ามาตามการเรียงแบบแถว
//และทำการเพิ่มค่าคอลัมภ์และตัวนับ

irText[i][j] = iText[k];
j++;
k++;
}
spText += "\n\n";

//วนข้อมูลในการอ้างถึงอาร์เรย์โดยสิ้นสุดเมื่อวนครบซึ่ง คิดจาก แถวคูณคอลัมภ์
i=0;
j=0;
k=0;
while(k<((row+1)*(column+1)))
{
//ถ้าแถวมากกว่าแถวทิ่กำหนดให้แถวเริ่มต้นที่ 0 ใหม่
if(i>row)
{
i=0;
}
//ถ้าคอลัมภ์มากกว่าคอลัมภ์ที่กำหนดให้คอลัมภ์เริ่มต้นที่ 0 ใหม่
//และให้มีการเพิ่มค่าแถวอีก 1 และให้มีการเว้นบรรทัดด้วย

if(j>column)
{
j=0;
i++;
spText += "\n";
}
//แสดงตัวอักษรเรียงตามแถวและเพิ่มตัวนับ
spText += "\t"+irText[i][j];
j++;
k++;
}

//วนแสดงอาร์เรย์ทั้งหมดเพื่อแสดง ciphertext
spText += "\n\nCiphertext = ";
i=0;
j=0;
k=0;
while(k<((row+1)*(column+1)))
{
//ถ้าแถวมากกว่าแถวที่กำหนดให้เริ่มต้นที่แถว 0 ใหม่และเพิ่มคอลัมภ์อีกหนึ่ง
if(i>row)
{
i=0;
j++;
}
//ถ้าคอลัมภ์มากกว่าคอลัมภ์ที่กำหนดให้คอลัมภ็เริ่มต้นใหม่ที 0
if(j>column)
{
j=0;
}
//แสดงตัวอักษรที่ได้จากการถอดรหัส
spText += ""+irText[i][j];
i++;
k++;
}
}//else

} catch(Exception e) {
System.out.println(e);
}

return spText;
}


JAVA code with Columnar Transposition

สำหรับ code ของแนวคิดนี้ ค่อนข้างจะยาว
และผมยังหาวิธี แสดงลงที่ Blog นี้ไม่ได้
ไว้จะส่งลิงค์ มาให้ โหลด ไปศึกษา นะครับ


JAVA code with Monoalphabetic algorithm


private String Monoalphabetic(String text,int key,boolean encry) {
String spText="";
int index = 0;

//กำหนดค่าให้กับตัวแปรเพื่อเป็น plaintext ทั้งหมดที่อนุญาติให้เข้ารหัสและถอดรหัส
char[] pText = new char[180] ;
try{
//A=>z 94
for (int i=32; i<=126; i++) {
pText[i-32] = (char)i;
}
//ก=>ฮ 58
for (int i=160; i<=218; i++) {
pText[i-160+94] = (char)i;
}
//0=>9 28
for (int i=223; i<=251; i++) {
pText[i-223+94+58] = (char)i;
}
}catch(Exception e){System.out.println(e);}

//กำหนดค่าสูงสุดของจำนวน plaintext ที่มีทั้งหมด
int maxChar = pText.length-1 ;

//รับตัวเลขลำดับอ้างถึง plaintext ทั้งหมด เก็บไว้ในตัวแปร
int[] xText = new int [pText.length];
for(int i=0; i<(maxChar+1); i++) {
xText[i] = i;
}

//กำหนดค่า
int[] cText = new int [xText.length]; //algorithm have value key
int[] ixText = new int [text.length()]; //number code text of iText
char[] iText = new char[text.length()]; //char of text

//เก็บข้อความ plaintext ที่ได้จากผู้ใช้ ไว้ยังตัวแปร
try{
text = new String(text.getBytes("TIS-620"),"ISO8859_1");
} catch(java.io.UnsupportedEncodingException e) {
e.printStackTrace();
}
iText = text.toCharArray();

//ทำการเข้ารหัสแบบ Monoalphabetic ร่วมกับ key ที่ป้อน
//และเก็บไว้เป็นชุดของ plaintext ทั้งหมดที่ผ่านการเข้ารหัสแล้ว
//ซึ่งเป็นการนำตัวเลขลำดับ ที่ผ่านการบวกกับคีย์ นำมาหารตัดเศษ

for(int i=0; i<=maxChar; i++) {
              cText[i] = (xText[i]+key)%(maxChar+1);
}

//ถ้าเข้ารหัส จะเข้าเงื่อนไขนี้
if(encry == true) {

spText += "Plaintext = "+text+"\n";
spText += "key = "+key+"\n\n";

//เรียงอักษรที่เป็น plaintext ทั้งหมดแสดงบนหน้าจอ
for(int i=0; i<=maxChar; i++) {
spText += pText[i]+" ";
}
spText += "\n";

//เรียงตัวเลขชี้ลำดับของ plaintext ทั้งหมดแสดงบนหน้าจอ
for(int i=0; i<=maxChar; i++) {
spText += xText[i]+" ";
}
//แสดงตัวเลขประจำของอักษรที่ป้อนเข้ามา
spText += "\n\nPlaintext code = ";
for(int j=0; jfor(int i=0; i<=maxChar; i++) {
//ถ้าตัวอักษร plaintext ที่มีตรงกับอักษรที่ป้อนเข้ามา
//จะเก็บลำดับของตัวชี้ แสดงบนหน้าจอ

if(pText[i] == iText[j]) {
spText += xText[i]+" ";
}
}

spText += "\nEncryption Algorithm :: e_k(x) = x + K mod "+(maxChar+1)+"\n\n";

//วนเรียงตัวอักษรที่เป็น plaintext ที่มีทั้งหมด
for(int i=0; i<=maxChar; i++) {
spText += pText[i]+" ";
}
spText += "\n";

//วนเรียงตัวชี้ลำดับตัวอักษร ที่ผ่านการหารตัดเศษเรียบร้อยแล้ว
for(int i=0; i<=maxChar; i++) {
spText += cText[i]+" ";
}
//กระบวณการอิงอักษร plaintext ที่ป้อนมากับที่มีทั้งหมด
spText += "\nCiphertext = ";
for(int j=0; j<=iText.length-1; j++)
for(int i=0; i<=maxChar; i++) {
//ถ้าที่ plaintext ที่ป้อนเข้ามากับ plaintext ที่กำหนดไว้ตรงกันก็จะแสดงการเข้ารหัส
//โดยที่อ้างถึง plaintext ตามตัวชี้ที่มีค่าที่ได้จากการนำตัวเลขลำดับ บวกกับคีย์ และหารตัดเศษ

if(pText[i] == iText[j]) {
spText += pText[cText[i]];
}
}

} else //จะกระทำเงื่อนไขนี้ ก็ต่อเมื่อต้องการถอดรหัส
{
spText += "Ciphertext = "+text+"\n";
spText += "key = "+key+"\n\n";

//เรียงอักษรที่เป็น plaintext ทั้งหมดแสดงบนหน้าจอ
for(int i=0; i<=maxChar; i++) {
spText += pText[i]+" ";
}
spText += "\n";

//เรียงตัวเลขชี้ลำดับของ plaintext ทั้งหมดแสดงบนหน้าจอ
for(int i=0; i<=maxChar; i++) {
spText += xText[i]+" ";
}
//แสดงตัวเลขลำดับสำหรับอ้างถึงอักษร Ciphertext
spText += "\n\nCiphertext code = ";
for(int j=0; j<=iText.length-1; j++)
for(int i=0; i<=maxChar; i++) {
//ถ้าตัวอักษร plaintext ที่มีนั้น ตรงกับที่ป้อนเข้ามาแล้ว
//ให้เก็บค่าตัวเลขแสดงลำดับไว้ยังตัวแปร และแสดงออกทางหน้าจอ

if(pText[i] == iText[j]) {
ixText[j] = xText[i];
spText += ixText[j]+" ";
}
}
spText += "\n\n";

//วนแสดงอักษร plaintext ที่มีทั้งหมด
for(int i=0; i<=maxChar; i++) {
spText += pText[i]+" ";
}
spText += "\n";

//วนแสดงตัวแปรที่เก็บ ค่าที่ได้จากการนำตัวเลขลำดับ บวกกับคีย์ และหารตัดเศษ
for(int i=0; i<=maxChar; i++) {
spText += cText[i]+" ";
}
//วนแสดง plaintext
spText += "\n\nPlaintext = ";
for(int j=0; j<=iText.length-1; j++)
for(int i=0; i<=maxChar; i++) {
//ถ้าค่าตัวเลขของ plaintext ที่ป้อนเข้ามา ตรงกับ
//ค่าที่ได้จากการนำตัวเลขลำดับ บวกกับคีย์ และหารตัดเศษ
//ก็ให้แสดงตัวอักษร plaintext ที่อ้างถึงโดยตำแหน่ง ที่เท่ากันกับ ตำแหน่งของ
//ตัวแปรที่เก็บค่าที่ได้จากการนำตัวเลขลำดับ บวกกับคีย์ และหารตัดเศษ

if(ixText[j] == cText[i]) {
spText += pText[i];
}
}

}//encry == false

try{
spText = new String(spText.getBytes("ISO8859_1"),"TIS-620");
} catch(java.io.UnsupportedEncodingException e) {
e.printStackTrace();
}

return spText;
}


JAVA code with Shift cipher algorithm

วันนี้ผมมี แนวคิดการเข้ารหัสและถอดรหัสมาฝากนะครับ
เป็นโปรแกรมที่ผมพัฒนาขึ้นมาเองนะครับ สำหรับภาษาที่ใช้ก็คือ ภาษาจาวานะครับ
เป็น Java windows application เครื่องมือที่ใช้ในการพัฒนาคือ
NetBeans IDE 5.5.1 นะครับ

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

อย่างไรก็ตาม ขอบคุณสำหรับเพื่อนๆ ทุกคนที่ช่วยอธิบายแนวคิดให้ผม
จนสามารถนำมาเปิดเผย เพื่อให้บุคคลที่สนใจได้ศึกษาต่อไปด้วย
ซึ่งสำหรับผู้สนใจท่านใดยังไม่เข้าใจในแนวคิดหรือกระบวณการทำงานของโปรแกรม
สามารถแสดงความคิดเห็นมาได้ทันทีนะครับ
สำหรับ Code ที่เป็นแบบ Visual Basic .Net
ลองดูได้ที่เว็บพี่เดช นะครับ




private String shiftCipher(String text,int key,boolean encry) {

String spText="";

int index = 0;

int num = 0;



//กำหนดค่าให้กับตัวแปรเพื่อเป็น plaintext ทั้งหมดที่อนุญาติให้เข้ารหัสและถอดรหัส

char[] pText = new char[180] ;

try{

//A=>z 94

for (int i=32; i<=126; i++) {

pText[i-32] = (char)i;

}

//ก=>ฮ 58

for (int i=160; i<=218; i++) {

pText[i-160+94] = (char)i;

}

//0=>9 28

for (int i=223; i<=251; i++) {

pText[i-223+94+58] = (char)i;

}

}catch(Exception e){System.out.println(e);}



//รับข้อความ plaintext ที่ได้จากผู้ใช้โปรแกรมเก็บไว้ในตัวแปร

char[] iText = new char[text.length()];

try{

text = new String(text.getBytes("TIS-620"),"ISO8859_1");

} catch(java.io.UnsupportedEncodingException e) {

e.printStackTrace();

}

iText = text.toCharArray();



//กำหนดจำนวนที่มีของ plaintext

int maxChar = pText.length-1 ;



//วนเก็บค่าไปยังชุดข้อมูลใหม่โดยให้มีการ shift เกิดขึ้นตาม key ที่รับมา

//โดยที่ถ้าตัวลำดับที่อ้างถึงน้อยกว่าหรือเท่ากับจำนวนทั้งหมดของ plaintext ให้เข้าเงื่อนไขนี้


num = 0;

char[] xText = new char[pText.length];

while(num <= maxChar) {

//ให้ตัวชี้มีค่าตาม Key

index = num+key;



//ถ้าวนจนตัวชี้เกินค่ามากที่สุดของชุดข้อมูลให้ทำการ

//นำค่าที่มีลบออกด้วยค่าที่มากที่สุดของชุดข้อมูล

//ดังนั้นก็จะสามารถนำข้อมูลเข้ากล่องข้อมูลกล่องแรกได้ และถัดต่อไปเรื่อยๆ


if(index > maxChar) {

index = index - pText.length;

}

//เก็บค่าข้อมูลที่มีการ Shift แล้ว

xText[num] = pText[index];

num++;

}



//ถ้าผู้ใช้ต้องการเข้ารหัสจะเข้าเงื่อนไขนี้

if(encry == true) {



spText += "Plaintext = "+text+"\n";

spText += "key = "+key+"\n\n";



//แสดง plaintext ทั้งหมดที่หน้าจอ

num = 0;

for(int i=0; i<=maxChar; i++) {

spText += pText[i]+" ";

}

spText += "\n";



//แสดง plaintext ที่ผ่านการ shift ตาม key

for(int i=0; i<= maxChar; i++) {

spText += xText[i]+" ";

}



spText += "\n";

spText += "\nEncryption Algorithm :: C_i = E(P_i) = P_i + key";



//แสดงการเข้ารหัส

spText += "\nCiphertext = ";

for(int j=0; j<iText.length; j++)

for(int i=0; i<=maxChar; i++) {

//ถ้าวนมาเจออักษร plaintext ที่กำหนดไว้ในโปรแกรมและ

//ตรงกับอักษรที่รับเข้าไปก็ให้นำอักษรที่มีลำดับตรงกันแสดงทางหน้าจอ

//โดยที่อักษรดังกล่าวนั้นได้ผ่านการ shift ไว้แล้ว


if(pText[i] == iText[j]) {

spText += xText[i];

}

}

} else //ถ้าผู้ใช้ต้องการถอดรหัส จะเข้าเงื่อนไขนี้

{

spText += "Ciphertext = "+text+"\n";

spText += "key = "+key+"\n\n";



//แสดงอักษรที่มีการ shift แสดงที่หน้าจอ

for(int i=0; i<=maxChar; i++) {

spText += xText[i]+" ";

}

spText += "\n";



//แสดงอักษรที่ไม่มีการ shift ซึ่งเป็น plaintext ทั้งหมด

for(int i=0; i<=maxChar; i++) {

spText += pText[i]+" ";

}



//แสดงอักษร plaintext ที่มาจากการรับค่าและผ่านการถอดรหัส

spText += "\n\nPlaintext = ";

for(int j=0; j<iText.length; j++)

for(int i=0; i<=maxChar; i++) {

//ถ้าค่าที่รับเข้ามาตรงกับค่าที่ถูก shift แล้ว

//ให้แสดงตัวอักษร plaintext ที่ยังไม่ผ่านการ shift


if(iText[j] == xText[i]) {

spText += pText[i];

}

}

}



try{

spText = new String(spText.getBytes("ISO8859_1"),"TIS-620");

} catch(java.io.UnsupportedEncodingException e) {

e.printStackTrace();

}



return spText;

}



Blog Comment

บทความที่ได้รับความนิยม