22 ธันวาคม 2554

port 80 listening PID4(system) หลังจากติดตั้ง VS2010 SP1

หลังจากอัพเดท Visual Studio SP1 แล้วถึงแม้จะปิด IIS (World Wide Web Publishing Service - stop) ไปแล้ว port 80 ก็ยังถูกใช้งานโดย "SYSTEM" pid 4

ทำให้เกิด conflict ไม่สามารถเปิดใช้งาน web server ตัวอื่นอย่าง Apache/Tomcat ที่ port 80 ได้

> netstat -aon
ถ้าลอง start IIS services ที่ port 80 ก็ยังใช้งาน web app ได้ตามปกติ แต่พอ Stop หรือไปใช้งาน port อื่น เจ้า system ก็ยัง listening port 80 อยู่ยังงั้น เฮ่อ.. Microsoft เล่นตลกอีกแล้ว

เสียเวลาไล่ปิด services อยู่นาน สาเหตุของปัญหา มันคือ.. "Web Deployment Agent Service"  นี่เองที่จองผูกขาดใช้งาน port 80 อยู่

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 เท่านั้น)

24 ตุลาคม 2554

ติดตั้ง Endian Firewall เป็น Gateway ใน VMware ESXi (vSphere Hypervisor) VLAN

Study case..วันก่อนเซอฟเวอร์ตัวใหม่ HP Proliant DL120 G7 ที่สั่งซื้อไปเพิ่งส่งมาถึงก็ได้ฤกษ์ทำการทดสอบติดตั้ง VMware ESXi 4 (ชื่ออย่างเป็นทางการคือ vSphere Hypervisor) โดย Server เครื่องนี้จะทำเป็น VPS host เพื่อทดสอบ application ต่างๆ ที่เขียนขึ้นก่อนจะ deploy ใช้งานจริง

Problem : 

1. มีแค่ 1 IP จริง ต่อ Virtual Server (Guest) หลายเครื่อง
โดยปกติเมื่อติดตั้ง vSphere VSXi จะสร้าง virtual switch ให้ทันที คือ vSwitch0 โดย bridge เข้ากับการ์ด LAN จริงๆ ของเซอฟเวอร์ ถ้าต้องการให้ virtual server ติดต่อกับ LAN ภายนอกได้ก็ต้องจ่าย IP ให้ server ละตัว เหมือนเซอฟเวอร์จริง 1 IP/เครื่อง !?

2. ต้องการให้ Virtual Server (Guest) ทั้งหมดทำงานหลัง Firewall
ถ้าเราเอาเซอฟเวอร์ไปวาง datacenter ทันทีที่ต่อสายแลนเข้าไป server เราจะถูกต้อนรับโดยสารพัด spam bot จะวิ่งมา scan port ทันที รวมทั้งปัญหา DoS attack หรือภาษาชาวบ้านเรียก "โดนยิงเซอฟเวอร์ล่ม" ดังนั้นหลัก security policy ที่ได้ผลที่สุด คือ default deny ปิดกั้นการเชื่อมต่อทั้งหมดแล้วเปิดแค่ service ที่ใช้

Solution :
  1. ติดตั้ง Endian Firewall 2.4x ลงใน Virtual Machine (Guest) 
  2. ตั้งค่า Virtual Server ตัวอื่นๆ ให้อยู่ใน Green network โดยใช้ Endian Firewall เป็น Gateway

19 ตุลาคม 2554

C# TAPI3.x ติดต่อกับ USB GSM Modem - Part.1 (RD concept)



ระบบโทรผ่าน TAPI -> COM port (Aircard) -> Public switched Telephone Network (PSTN)
draft อ้างอิงไว้ก่อน..โปรเจคนี้เป็นการเขียน  functional module เพิ่มในโปรแกรม CRM ที่ทำไว้แล้วโดยจะทำเป็น class library เพื่อนำไปเรียกใช้งานต่อ

Telephony Application Programming Interfaces 
อ้างอิง : http://msdn.microsoft.com/en-us/library/windows/desktop/ms734215(v=VS.85).aspx
เป็น lib ที่ใช้จะมี 4 ตัวหลักๆ ..
  1. TAPI 2.x
  2. TAPI 3.x
  3. Telephony Service Provider (TSP)
  4. Media Service Provider (MSP) 

ตัวที่เอามาใช้ในโปรเจคนี้ คือ TAPI 3.x เป็น COM API
TAPI 2.x VS 3.x
  • 2.x ไม่รองรับ VOIP 
  • 2.x ต้องเขียนใน C++ แล้ว complie DLL อีกทีนึง ส่วน TAPI 3.x จะ reference COM component ได้
ความสามารถของ TAPI 3.x ที่ทำได้..
  • Multicast multimedia IP conferencing with quality of service (QOS)
  • Voice calls over the Internet using the H.323 protocol
  • Call center applications capable of tracking multiple agents
  • Basic voice calls on the Public Switched Telephone Network (PSTN)
  • PBX control
  • Interactive voice response (IVR) systems
  • Voice mail
เวอร์ชั่นแรกต้องการแค่ basic calls ก่อน 

รวมตัวอย่าง Code Project TAPI 3.x
เป็น sample project ที่ใช้ทำ TDD และ Prove of concept 

concept วิธีการ Implement TAPI สำหรับ outbound Call 
ใน MSDN มันลำดับข้ามไปมา ดังนั้นจะเขียนใหม่เป็น step นี้

1. Initialize TAPI - สร้าง object instant ของ TAPIClass แล้วเรียกเมธอด Initialize
2. Select Address - เซ็ท ITAddress object โดย enumerate จาก ITTAPI 
3. Register Event - ใช้เมธอด RegisterCallNotifications เซ็ท event handler เพื่อจัดการเหตการณ์ใน TAPI 
4. Create Call - เรียก ITAddress::CreateCall โดยกำหนด address เป็นเบอร์หรือ IP, address type และ media type ว่าเป็น audio, fax หรือ video call จะได้ output return เป็น object ITBasicCallControl
5. Select Terminal - เซ็ท Terminal Object ได้แก่ฮาร์ดแวร์ audio device ไมค์/ลำโพง ให้กับ ITStream 
6. Connect - เรียกเมธอด ITBasicCallControl::Connect 


จบส่วนของการ Research ในเบื้องต้นใน part ต่อไปจะเริ่มทำ TDD test code