วันศุกร์ที่ 1 กรกฎาคม พ.ศ. 2554

หาขนาด Windows ของ Application ที่รันอยู่ จาก Process Name

มีใครเคยอยากเช็คมั้ยครับ ว่าตอนนี้ Process บางอัน ที่เราสนใจ รันอยู่รึเปล่า รวมถึงโปรแกรมที่สนใจด้วย จริงๆแล้ว เราสามารถ เช็คได้ง่ายๆเลย เพราะ Windows Provide function มาให้แล้ว
สำหรับ VB.Net นะครับ ผมจะเขียน function หาว่ามี notepad รันอยู่หรือไม่นะครับ หลังจากนั้นผมก็อยากรู้ว่่า หน้าต่าง notepad นั้นมีขนาดเท่าไหร่ วางอยู่ตรงไหนของหน้าจอ ก็ทำได้ตามนี้เลย
ขั้นแรก import namespace นี้เพื่อเรียกใช้ function การเช็ค Process ของ Windows นะครับ

Imports System.Diagnostics

Public Sub Get_Application_WindowsSize()

Dim AppNameWithoutPathTheExePart As String = "notepad" 'กำหนดตัวแปรชื่อ process ที่ต้องการหา ดูได้ใน Task Manager นะครับ โดยตัด .exe ออกนะครับ
Dim ps() As Process = Process.GetProcessesByName(AppNameWithoutPathTheExePart) 'อันนี้เป็น function Get Process โดยหาจากชื่อ Process ซึ่งจะ return ตัวแปรเป็น process นะครับ ซึ่งจะออกมาเป็น Array เนื่องจาก Process สามารถถูกรันได้มากกว่า 1

If ps.Length > 0 Then
Dim p As Process = ps(0) 'ผมจะสนใจ process แรกแค่อันเดียวนะครับ
Console.Writeline ("Notepad is running")
End If

End sub

ตอนนี้เราหา Process เจอแล้ว ต่อไปเราจะไปหา Windows Size ของ Notepad กัน
ผมจะเพิ่ม Code ต่อเลยนะครับ
อันนี้เป็น Library ของ windows เอาไว้หาขนาด windows ที่สนใจอยู่นะครับ โดยเราต้องเอา Handle ของ Windows ที่ต้องการ ใส่เข้าไป

Imports System.Diagnostics

Private Declare Function GetWindowRect Lib "user32" (ByVal handle As IntPtr, ByRef lpRect As RECT) As Integer

Public Structure RECT
Dim Left As Integer
Dim Top As Integer
Dim Right As Integer
Dim Bottom As Integer
End Structure

Public Sub Get_Application_WindowsSize()

Dim AppNameWithoutPathTheExePart As String = "notepad" 'กำหนดตัวแปรชื่อ process ที่ต้องการหา ดูได้ใน Task Manager นะครับ โดยตัด .exe ออกนะครับ
Dim ps() As Process = Process.GetProcessesByName(AppNameWithoutPathTheExePart) 'อันนี้เป็น function Get Process โดยหาจากชื่อ Process ซึ่งจะ return ตัวแปรเป็น process นะครับ ซึ่งจะออกมาเป็น Array เนื่องจาก Process สามารถถูกรันได้มากกว่า 1

If ps.Length > 0 Then
Dim p As Process = ps(0) 'ผมจะสนใจ process แรกแค่อันเดียวนะครับ
Dim pRect As RECT
GetWindowRect(p.MainWindowHandle, pRect)
Console.WriteLine("Notepad Windows Left:" & pRect.Left & " Right:" & pRect.Right & " Top:" & pRect.Right & " Bottom:" & pRect.Bottom)
'แค่นี้เราก็ได้ขนาด หน้าจอ notepad ที่กำลัง รันอยู่แล้วครับ

End If

End sub

วันพฤหัสบดีที่ 30 มิถุนายน พ.ศ. 2554

ลง Informix Client 32 bits บน Windows 7 - 64 bits

สำหรับผู้ที่ไม่รู้จัก Informix นะครับ เป็น Database รุ่นดึกดำบรร ที่ไม่ค่อยได้พบเห็นกันมากนัก แต่ก็พอมีใช้กันอยู่บ้าง ซึ่งผมเองก็กำลังจะต้องดึงข้อมูลจากมันซะด้วย
ก่อนจะ Connect ไปได้ ก็ต้องทำการลง Informix Client กันให้เรียบร้อยก่อน ถึงจะได้ Connect ไป
แต่ถึง Informix จะเก่ายังไง แต่ Windows ที่ผมใช้ก็ยังต้องใหม่ไปตามกาลเวลา นั่นก็คือ Windows 7 64 bits
พอลง Informix Client เรียบร้อยแล้ว ก็ต้องไปเปิด ODBC admin ดูหน่อย จะได้จัดการ Add Data Source ใหม่ที่เป็น Informix ของเราเข้าไป แต่ไม่ราบรื่นอย่างนั้นสิ เมื่อเปิด ODBC admin ขึ้นมาแล้ว ไม่มี Informix Driver อย่างที่คิด ทำไมละทีนี้ Restart แล้วก็ยังไม่มี ฮือๆ หาไปหามาก็ได้รู้ว่า
ODBC ที่เป็น 32 bits ที่ลงไป ก็ต้องใช้ ODBC Admin ที่เป็น 32 bits ในการ Set ด้วย ซึ่ง Windows เองเค้าก็ไม่ได้เอาออกไปไหน เข้าไปเปิดได้ที่
C:\Windows\SysWOW64\odbcad.exe
ท่านก็จะเห็นหน้าตา ODBC Admin แบบโบราณๆ ที่เราคุ้นเคยครับ แล้วที่สุด ก็เจอ Informix Driver 32 bits ของเราซะที

Snapshots หรือ Materialized View ของ Oracle

สำหรับมือสมัครเล่นกับ Oracle อย่างผมครับ เรื่องของเรื่องคือ กำลังอยากทำ Oracle Data Mart ส่วนตัว ที่ต้องคอย Get Data จาก Source หลายๆที่ ซึ่งแน่นอนเป็น Database ต่างๆกัน และ Source แรกที่อยากได้ เป็น Database MSSQL
เคยเห็น DBA Oracle หลายท่านทำ Report Server ด้วยวิธีการทำ Snapshots ที่ลักษณะการทำงานคือ Select data จากต้นทางมา update ที่ Snapshots โดยข้อมูลก็จะถูก update เฉพาะส่วนที่เพิ่มเติมเข้ามา ผมได้มีโอกาสไปแอบดู Script การทำ Snapshots ของ DBA แล้ว รู้สึกแปลกใจที่ ไม่มี Where clause ที่แสดงถึง การเลือกโดย update date ของ data ที่ไปดึงมาเลย เช่น ตารางที่มักจะเก็บ Update_Date ไว้เป็น field หนึ่งที่จะบอกถึงเวลาที่ record นั้นๆถูกบันทึก ผมจึงเกิดคำถามขึ้น และได้รู้จาก DBA ว่า ใน Record แต่ละ Row ของ Oracle ก็จะมีการ เก็บ Update_DateTime ของ Record นั้นๆไว้อยู่แล้ว โดยที่ไม่ได้เป็น field ใน Table เลย ผมจึงสงสัยขึ้นอีกว่า function แบบนี้ ไม่ได้อยู่ใน DB อื่นๆนี่ แล้วแบบนี้จะทำ Snapshots จาก MSSQL ได้อย่างไร
สุดท้ายคำตอบที่ทำให้ผมหน้าแตกก็คือ Snapshots เอาไว้ capture data ระหว่าง DB Oracle ด้วยกัน เอาไปใช้กับ DB อื่นๆไม่ได้ ถ้าจะ Update ข้อมูลจาก DB อื่น ต้องเขียน Store Procedure แล้วให้ Job รันเอา
ฮ่าๆๆๆ อายเลยครับพี่น้อง

กำเนิดบล็อก

ทำงานมาหลายปีครับ ได้ความรู้จากบล็อกและ Forum ต่างๆจากหลายคนที่มีน้ำใจ ผมเองได้แต่อ่าน แต่ไม่เคยแชร์เลย ต่อไปถ้าได้ความรู้อะไรมา ก็จะพยายามมาแชร์ที่นี่ละกันครับ เผื่อใครจะ search มาเจอบ้าง ก็จะได้เป็นประโยชน์ครับ