9 พฤศจิกายน 2554

วิธี Load Balance เน็ต 2สายใน Endian Firewall2.4 ด้วย bash shell script

ปัญหา จากวิธีเดิมที่เคยใช้ EFW 2.4.1 ด้วยการแก้ไขไฟล์ /var/efw/inithooks/start.local ข้อเสียของวิธีนี้คือ.. ถ้าเน็ตเส้นใดเส้นนึงหลุดเน็ตบางเครื่องจะใช้ไม่ได้

วิธีการเซ็ท load balance สำหรับ uplink แบบ PPPoE (router bridge mode) แบบง่ายๆ เร็วๆ
ไฟล์ /var/efw/inithooks/start.local
#!/bin/sh
route del default
ip route add default equalize nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 1  
exit 0

แล้วตั้งเวลาใน etc/crontab ให้รัน start.local ทุก 15นาที
*/15 * * * * /var/efw/inithooks/start.local

จะได้ ip route ออกเน็ตสองเส้นทาง
default equalize 
        nexthop dev ppp0 weight 1
        nexthop dev ppp1 weight 1

ใช้เวลาแปปเดียวแต่เสียความสามารถในการ Backup/Failover ไป ส่วนอีกวิธีที่แน่นอนกว่า..

ทำ load balance ด้วย Linux Bash script 
ผมเปลี่ยนมาใช้วิธีนี้นานแล้วไม่เคยมีปัญหาอีกเลย

กรณีต่อแบบ PPPoE uplink: เซ็ท adsl router แบบ bridge mode ใช้ efw เป็นตัว connect
main uplink : eth0 -> ppp0
uplink1 : eth2 -> ppp1

*Notice* ในสคริปท์ต้องระบุ interface ที่ใช้ คือ eth0, eth2, ppp0, ppp1 ให้ตรงกับชื่อในเซอฟเวอร์จริง

1. สร้างไฟล์สคริปท์ใน /usr/share/balance.sh กำหนด Chmod 755 (-rwxr-xr-x) 

1 พฤศจิกายน 2554

C# .NET เขียนโปรแกรม winform ให้เปิดได้หน้าจอเดียว (mutex single instance app)

 ผมเขียนเรื่องนี้เพราะมีหลายคนถามไม่รู้จะ google หาคำว่าอะไร พฤติกรรมแบบนี้เรียกว่า "single instant application" ครับ

What?
สังเกตุมั้ยว่าโปรแกรม client ส่วนมากเปิด 2 จอ พร้อมกันไม่ได้ user จะต้องหาโปรแกรมเสริมอย่าง sandbox มาใช้เพื่อเปิดโปรแกรม 2จอพร้อมกัน ยกตัวอย่างเช่น msn, skype, camfrog ถ้าเราเปิดโปรแกรมขึ้นมาแล้ว ดับเบิ้ลคลิ้กซ้ำจะเป็นการโฟกัสหน้าจอหลักที่เปิดอยู่แทนที่จะรันโปรแกรมใหม่

How to?
ตัวอย่างโค้ด System.Threading.Mutex ใน .NET framework

/// 
        /// The main entry point for the application.
        /// 
        [STAThread]
        static void Main()
        {
            bool isReady;
            var mutex = new System.Threading.Mutex(true, "MyApplicationName", out isReady);
            if (!isReady)
            {
                //Console.WriteLine("Another instance is already running.");
                return;
            }
            GC.KeepAlive(mutex); 

            //Run main form
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new UI.ReportForm());
        }
อธิบายโค้ด..
class System.Threading.Mutex มาจากคำว่า "mutual exclusion" ทำหน้าที่เป็น synchronization object ประสานงานระหว่าง thread หรือการทำ Thread safe
var mutex = new System.Threading.Mutex(true, "MyApplicationName", out isReady);
จากบรรทัดนี้เราสร้างตัวแปร mutex กำหนดชื่อ "MyApplicationName" ผ่าน constructor ทำให้ object mutex นี้ผูกติดกับ OS เพื่อใช้ตรวจสอบ Process ภายนอกโปรแกรม (interprocess synchroization) ว่ามี Mutex ชื่อนี้กำลังทำงานอยู่หรือไม่ (Note* ถ้าไม่กำหนดชื่อให้ mutex object จะมี scope แค่ภายใน current process เท่านั้น)