บทความนี้ อาจเรียกว่าเป็นความคืบหน้าล่าสุดของบทความเรื่อง “ว่าด้วย SourceCode โปรแกรมโหราศาสตร์” ณ ช่วงการประชุมเอเปค ก็ว่าได้ คือหลังจากที่ผมพบเว็บไซต์ที่มี SourceCode โปรแกรมโหราศาสตร์ คือ http://www.astro.com/ และดาวน์โหลดไฟล์หลักๆ ที่เกี่ยวกับการเขียนโปรแกรมมาแล้ว ก็ยังไม่มีโอกาสได้ตรวจสอบไฟล์เหล่านั้น จนกระทั่งช่วงวันหยุดยาวในเดือนตุลาคม 2546 นี้เอง
Swiss Ephemeris นี้เป็นเพียงส่วนประกอบหลักหรือโมดูลหนึ่งสำหรับนำไปสร้างโปรแกรมโหราศาสตร์ที่สมบูรณ์ สร้างขึ้นด้วย ภาษาC แต่เนื่องจากโมดูลที่จัดทำนี้อยู่ในรูปของไฟล์ DLL คือไฟล์ swedll32.dll ผู้พัฒนาโปรแกรมที่ใช้ภาษาคอมพิวเตอร์อื่นๆ ก็สามารถนำโมดูลนี้ไปใช้ได้โดยไม่จำเป็นต้องมีความรู้ ภาษาC แต่อย่างใด และไม่ว่าจะเขียนโปรแกรมด้วยภาษาใด ก็ไม่ต้องเริ่มจากศูนย์ เพราะสามารถนำคำสั่งสำเร็จรูปที่ทำไว้ใน swedll32.dll มาเรียกใช้ในการคำนวณดาว ณ วันเวลาที่ต้องการได้ทันที
ในวงการการเขียนโปรแกรมไทย เคยมีคำกล่าวแบบติดตลกว่า ภาษาC นั้นมีความลึกลับพอๆ กับภาษาขอม แม้จะได้รับการยกย่องว่าเป็นภาษาที่มีประสิทธิภาพรองจากภาษาเครื่องและแอสแซมบลีก็ตาม ขณะที่ภาษา BASIC แม้จะมีความง่าย และอยู่คู่กับนักเขียนโปรแกรมกลุ่มใหญ่รวมถึงนักเขียนโปรแกรมโหราศาสตร์มานาน แต่ก็ดูค่อนข้างฉาบฉวย และโปรแกรมที่คอมไพล์ได้ในรูปไฟล์ EXE มักจะต้องพึ่งโมดูลของโปรแกรมภาษา BASIC อยู่ตลอด ภาษา Pascal ของบริษัทบอร์แลนด์ ซึ่งปัจจุบันพัฒนาขึ้นมาเป็นภาษาสำหรับเขียนโปรแกรมบนวินโดว์สเช่นเดียวกับ C และ BASIC ในชื่อว่า Delphi นั้น เป็นทางเลือกที่น่าสนใจ เพราะตัวภาษามีความใกล้เคียงภาษาอังกฤษพื้นฐาน ความสามารถแบบ OOP ทำให้มีความลึกซึ้งที่เข้าถึงได้มากกว่าความลึกลับชวนปวดหัวแบบ ภาษาC ความประทับใจในภาษาโปรแกรมนี้ทำให้ผมเลือกใช้ภาษา Pascal ในการเขียนโปรแกรมมาตลอด ตั้งแต่รุ่น Turbo Pascal บน DOS มาจนถึง Delphi และเชื่อว่าอีกหลายท่านน่าจะประทับใจในภาษาโปรแกรมนี้เช่นกัน แต่ถ้าท่านยังมีใจรัก BASIC หรือ C จริงๆ ก็หวังว่าตัวอย่างจาก Delphi ที่จะเสนอนี้จะพอเป็นแนวทางให้ท่านได้เช่นกัน
ก่อนที่จะลืมต้องขอบอกก่อนว่า ในการดาวน์โหลด Swiss Ephemeris มานี้ ผู้พัฒนามีเงื่อนไขว่า ท่านจะต้องนำ Swiss Ephemeris มาพัฒนาโปรแกรมใช้เองโดยไม่จำหน่ายจ่ายแจกใคร หรือหากจะทำโปรแกรมแจกฟรีจะต้องเปิดเผย SourceCode ด้วยตามหลัก OpenSource เหมือนระบบปฏิบัติการ Linux หากท่านจะใช้เขียนโปรแกรมขายหรือแจกฟรีโดยไม่เปิดเผย SourceCode ท่านจะต้องจัดซื้อ Swiss Ephemeris เวอร์ชันที่เป็น Commercial ในราคาหลักหมื่นบาทเลยทีเดียว
ไฟล์ที่ท่านจะต้องไปดาวน์โหลดมานั้น ตัวหลัก คือ sweph.zip หากจะให้โปรแกรมสมบูรณ์โดยเฉพาะการคำนวณดาวเคราะห์น้อยจะต้องดาวน์โหลดไฟล์อื่นอีกนับเป็นสิบๆ เมกะไบต์ แต่ยังไม่จำเป็นในที่นี้ เมื่อขยายไฟล์ sweph.zip ออกมาแล้วจะได้ไฟล์ต่างๆ ทั้งที่เป็น SourceCode ของตัวโมดูลและ SourceCode ของภาษาโปรแกรมต่างๆ ไฟล์ที่เกี่ยวข้องกับนักเขียนโปรแกรม Delphi ได้แก่ swedll32.dll ซึ่งเป็นโมดูลหลักในการคำนวณที่จะต้องเขียนโปรแกรมเรียกใช้ขึ้นมา และกลุ่มไฟล์ที่ใช้ในการเขียนโปรแกรมด้วย Delphi ได้แก่ swedel_2.dpr, swedel_2.cfg, swedel_2.dof, swedel_2.opt, swedel_2.res, sample2.pas, sample2.dfm, sample2.dcu,และswe_de32.pas :ซึ่งไฟล์ไหนเป็นไฟล์ไหนทำอะไร ผู้ที่ศึกษา Delphi คงทราบดี และยังมีไฟล์ตัวอย่างเพิ่มเติมใน zip ชื่อ more_del.zip ซึ่งประกอบไปด้วยไฟล์สำหรับเขียนโปรแกรมด้วย Delphi ซึ่งใช้ชื่อไฟล์เหมือนกับในกลุ่มแรก เพื่อไม่ให้สับสน ผมจะขอเรียกไฟล์สำหรับ Delphi ที่แตกออกมาจาก sweph.zip โดยตรงว่า “ตัวอย่างแรก” และกลุ่มไฟล์ที่ต้องแตกออกมาจาก more_del.zip อีกทีหนึ่งว่า “ตัวอย่างเพิ่มเติม”
ทั้งตัวอย่างแรกและตัวอย่างเพิ่มเติมนี้ เขียนโดยนาย Robert Amlung เป็นการสาธิตการเขียนโปรแกรมโดยเรียกใช้คำสั่งจาก swedll32.dll มาใช้ใน Delphi ในการคำนวณดาวและเรือนชะตาแบบต่างๆ โดยตัวอย่างแรกจะแสดงผลในรูปองศาและจุดทศนิยมขององศา ส่วนตัวอย่างเพิ่มเติมจะแสดงผลเป็นองศาราศีลิบดาแบบที่นักโหราศาสตร์ใช้ และมีการแบ่ง Procedure ย่อยๆ ตามหน้าที่อย่างชัดเจนขึ้น
เป็นที่น่าสังเกตว่าโปรแกรมตัวอย่างทั้งสองได้แสดงการเรียกใช้เฉพาะฟังก์ชันในการผูกดวงตามปกติ โดยที่ในเอกสารประกอบยังมีฟังก์ชันที่น่าสนใจอื่นๆ เช่น กำหนดการคำนวณเป็นระบบนิรายนะด้วยอยนางศแบบต่างๆ การหาวันเกิดคราส เป็นต้น ซึ่งจะเป็นการบ้านสำหรับการเขียนโปรแกรมในระดับก้าวหน้าต่อไป
อีกการบ้านหนึ่งที่เราอาจลองทำกันเล่นๆ ดูก่อน คือนาย Robert Amlung แกเป็นฝรั่งแถบยุโรป ก็ย่อมจะทำตัวอย่างโปรแกรมสำหรับฝรั่งใช้ ทีนี้เราจะลองแก้โปรแกรมตัวอย่างแรกให้เป็นโปรแกรมที่ป้อนวันที่และเวลาตามแบบไทย และกำหนดสถานที่ Default เป็นกรุงเทพฯ ดู
ใน SourceCode ไฟล์ sample2.pas มีที่ต้องแก้ 3 จุด คือ
บรรทัดที่ 298
iyear := StrToInt(year.Text);
แก้เป็น
if (imonth<4) and (StrToInt(year.Text)<2484) then iyear := StrToInt(year.Text)-542 else iyear := StrToInt(year.Text)-543;
บรรทัดที่ 309
tjd := swe_julday(iyear, imonth, iday, dhour, 1);
แก้เป็น
tjd := swe_julday(iyear, imonth, iday, dhour, 1)-7/24;
บรรทัดที่ 337
if (rflag <> iflag) then outfld.Lines.Add(StrPas(serr));
ลบทิ้งทั้งบรรทัดหรือแปลงเป็นหมายเหตุด้วยการเติม // ข้างหน้า ตรงนี้ไม่เกี่ยวกับวันเดือนปี แต่เป็นการปิดการแสดง Error เนื่องจากการที่เราไม่ได้ดาวน์โหลดไฟล์เบ็ดเตล็ดที่ใช้คำนวณพวกดาวเคราะห์น้อยมาด้วย
นอกจากนี้ที่ฟอร์ม sample2.dfm ในช่องป้อนข้อมูลแลตติจูดและลองกิจูดของที่เกิด ต้องแก้ข้อมูล 6 ช่อง ดังนี้
lon_deg แก้ค่าจาก 8 เป็น 100
lon_min แก้ค่าจาก 33 เป็น 30
lat_deg แก้ค่าจาก 47 เป็น 13
lat_min แก้ค่าจาก 23 เป็น 45
ลองรันโปรแกรมแล้วป้อนวันที่เดือนพ.ศ.และเวลาแบบเมืองไทยดู
อีกจุดหนึ่งที่นักโหราศาสตร์ยูเรเนียนควรลองทำดูคือ
บรรทัดที่ 334
for i := SE_SUN to SE_TRUE_NODE do
แก้เป็น
for i := SE_SUN to SE_POSEIDON do if (i<=SE_TRUE_NODE) or (i>=SE_CUPIDO) then
เมื่อรันโปรแกรมดูก็จะได้สมผุสดาวครบทุกดวงที่ใช้ในโหราศาสตร์ยูเรเนียน
เท่านี้คงพอเป็นแนวทางสำหรับผู้ใฝ่รู้ทางโหราศาสตร์และการเขียนโปรแกรมทุกท่าน รายละเอียดอื่นๆ ทั้งในส่วนที่ไม่จำเป็นจะกล่าวในที่นี้และที่เกินกว่าสติปัญญาผมจะอธิบายได้ ขอให้ศึกษาเพิ่มเติมจากเว็บไซต์และไฟล์เอกสารต่างๆ ที่ดาวน์โหลดมานะครับ
เพิ่มเติม 18 มิถุนายน 2547
ตอนที่ผมเขียนบทความส่วนแรกมัวแต่ดูไฟล์ของคุณ Robert Amlung ที่จริงทาง astro.com เขาได้ให้ไฟล์ยูนิตสำหรับ Delphi ที่สามารถเรียกใช้ Swiss Ephemeris ได้เกือบสมบูรณ์ เขียนโดยคุณ Sarah Ashton ครับ ใครที่ถนัด Delphi ลองหาดูนะครับ และไม่ว่าถนัดภาษาอะไร หากติดขัด ไม่เข้าใจ หรือทำโปรแกรมได้เป็นรูปเป็นร่างแล้วต้องการเผยแพร่ หรือต้องการแลกเปลี่ยนความรู้อะไรที่เกี่ยวเนื่อง เชิญติดต่อตามที่อยู่ที่ให้ไว้ หรือส่งข้อความโดยแบบฟอร์มข้างล่างครับ
เพิ่มเติม 15 ธันวาคม 2549
Source Code ตัวอย่างโปรแกรมที่คำนวณสมผุสดวงยูเรเนียน
สินค้าที่เกี่ยวข้องจาก ร้านค้าออนไลน์