ในการ Key ข้อมูลที่เป็นตัวเลขนั้นจะเห็นได้ว่า ผู้ใช้นิยมจะกด Enter เพื่อเลื่อน Cursor
ให้มา Focus อยู่ที่อีก Object หนึ่งไม่ว่าจะเป็น Win app หรือ Web app
สำหรับ Win App นั้นเราก็ใช้วิธีการตั้ง TabIndex และ Setfocus ร่วมกับ Keypress
ซึ่งเป็น Events อยู่แล้วสำหรับ Windows Object..
แต่ถ้าเป็น Web App เราก็อาจจะใช้ JavaScript ได้ ซึ่งวิธีการก็คือ การกำหนด onKeyPress
ลงไปเป็น Parameter สำหรับพวก INPUT ของ HTML Form ดังตัวอย่างต่อไปนี้
Tuesday, October 17, 2006
SELECT แบบเลือก Record บน Firebird
วันนี้ค้นหาข้อมูลเกี่ยวกับคำสั่งในการดึงข้อมูลแบบระบุ Record บน Firebird
ซึ่งการดึงข้อมูลแบบนี้เราจะใช้เมื่อข้อมูลมีปริมาณมากๆ . . .
คำสั่ง
SELECT FIRST 10 SKIP 20 column1, column2, column3 FROM foo
ความหมายของ SQL ด้านบนคือ
ดึงข้อมูล 10 Record ของ Columns ที่กำหนดนับตั้งแต่ Record ที่ 20 จาก Table foo
^ ^
สมมติถ้าต้องการหา 100 อันแรกก็ใช้แค่
คำสั่ง
SELECT FIRST 100 Column From Table
แค่นี้เองครับ ( แต่ถ้าหากจะนับไปกี่ Record จากไหนก็ใช้คำสั่งอันแรกที่มี Skip )
อีกนิดไม่แน่ใจว่า Reference Community ของ Firebird ไว้หรือยัง . .
Firebird Thai
ซึ่งการดึงข้อมูลแบบนี้เราจะใช้เมื่อข้อมูลมีปริมาณมากๆ . . .
คำสั่ง
SELECT FIRST 10 SKIP 20 column1, column2, column3 FROM foo
ความหมายของ SQL ด้านบนคือ
ดึงข้อมูล 10 Record ของ Columns ที่กำหนดนับตั้งแต่ Record ที่ 20 จาก Table foo
^ ^
สมมติถ้าต้องการหา 100 อันแรกก็ใช้แค่
คำสั่ง
SELECT FIRST 100 Column From Table
แค่นี้เองครับ ( แต่ถ้าหากจะนับไปกี่ Record จากไหนก็ใช้คำสั่งอันแรกที่มี Skip )
อีกนิดไม่แน่ใจว่า Reference Community ของ Firebird ไว้หรือยัง . .
Firebird Thai
Thursday, October 12, 2006
ปิด Regedit บน Win XP Pro
ก่อนหน้านี้ได้ลงวิธีการปิด Regedit ด้วย Registry Code ไปแล้ว ในตอนนี้จะแนะนำ
การปิด Regedit ด้วยการใช้ GUI บน Windows XP Professional
หมายเหตุ ( ไม่สามารถใช้บน XP Home ได้เพราะไม่มี Group Policy )
วิธีการง่ายๆโดยการพิมพ์ gpedit.msc ที่ Start -> Run
แล้วเลือกตรงส่วนของ
User Configuration -> Administrative Templates -> System
แล้วเลือกมาท่ Prevent access to registry editting tool คลิกขวา
เลือกเป็น Enable จะเป็นการปิดการใช้งาน Regedit
การปิด Regedit ด้วยการใช้ GUI บน Windows XP Professional
หมายเหตุ ( ไม่สามารถใช้บน XP Home ได้เพราะไม่มี Group Policy )
วิธีการง่ายๆโดยการพิมพ์ gpedit.msc ที่ Start -> Run
แล้วเลือกตรงส่วนของ
User Configuration -> Administrative Templates -> System
แล้วเลือกมาท่ Prevent access to registry editting tool คลิกขวา
เลือกเป็น Enable จะเป็นการปิดการใช้งาน Regedit
การ Disable Regedit เพื่อความปลอดภัย
ช่วงนี้เป็นอีกช่วงที่ทำให้รู้สึกเหมือนตอนทำงานที่ทำงานเก่า
ที่จะต้องรับหน้าที่ Computer Security Admin ในระบบ server
ส่วนหนึ่งของวิธีการที่เราจะทำการ Disable Regedit ก็เพื่อความปลอดภัยและป้องกัน
การเขียนตัวเองลงระบบของไวรัส ( ซึ่งมักจะเริ่มจาก Regeistry )
วิธีการที่เราจะ Disable Regedit ก็คือ
HKEY_LOCAL_USER -> Software -> Microsoft -> Windows ->
CurrentVersion -> Policy -> System ->
ให้เพิ่มประเภทเป็น แบบ DWORD ตั้งชื่อว่า "DisableRegistryTools" ให้มีค่าเป็น 1
แค่นี้ผู้ใช้ก็ไม่สามารถที่จะสั่งเปิด regedit ได้อีกต่อไป .. วะ หะ หะ หะ ^ ^
ที่จะต้องรับหน้าที่ Computer Security Admin ในระบบ server
ส่วนหนึ่งของวิธีการที่เราจะทำการ Disable Regedit ก็เพื่อความปลอดภัยและป้องกัน
การเขียนตัวเองลงระบบของไวรัส ( ซึ่งมักจะเริ่มจาก Regeistry )
วิธีการที่เราจะ Disable Regedit ก็คือ
HKEY_LOCAL_USER -> Software -> Microsoft -> Windows ->
CurrentVersion -> Policy -> System ->
ให้เพิ่มประเภทเป็น แบบ DWORD ตั้งชื่อว่า "DisableRegistryTools" ให้มีค่าเป็น 1
แค่นี้ผู้ใช้ก็ไม่สามารถที่จะสั่งเปิด regedit ได้อีกต่อไป .. วะ หะ หะ หะ ^ ^
Script สำหรับปลด Lock การ Disable Regedit
ต่อไปนี้เป็น SCRIPT จาก Symantec นะครับ ไว้ใช้สำหรับปลด Lock สิทธิการใช้งาน
Regedit ทั้งบน Windows 95/98/ME/XP
[Version]
Signature="$Chicago$"
Provider=Symantec
[DefaultInstall]
AddReg=UnhookRegKey
[UnhookRegKey]
HKLM, Software\CLASSES\batfile\shell\open\command,,,"""%1"" %*"
HKLM, Software\CLASSES\comfile\shell\open\command,,,"""%1"" %*"
HKLM, Software\CLASSES\exefile\shell\open\command,,,"""%1"" %*"
HKLM, Software\CLASSES\piffile\shell\open\command,,,"""%1"" %*"
HKLM, Software\CLASSES\regfile\shell\open\command,,,"regedit.exe ""%1"""
HKLM, Software\CLASSES\scrfile\shell\open\command,,,"""%1"" %*"
HKCU, Software\Microsoft\Windows\CurrentVersion
\Policies\System,DisableRegistryTools,0x00000020,0
จากนั้นให้ Save เป็นไฟล์ชื่อ UnHookExec.inf
ถ้าต้องการใช้ก็ให้คลิกขวาที่ไฟล์ แล้วเลือก Install จะเป็นการ Enable Regedit นะครับ ^^
Regedit ทั้งบน Windows 95/98/ME/XP
[Version]
Signature="$Chicago$"
Provider=Symantec
[DefaultInstall]
AddReg=UnhookRegKey
[UnhookRegKey]
HKLM, Software\CLASSES\batfile\shell\open\command,,,"""%1"" %*"
HKLM, Software\CLASSES\comfile\shell\open\command,,,"""%1"" %*"
HKLM, Software\CLASSES\exefile\shell\open\command,,,"""%1"" %*"
HKLM, Software\CLASSES\piffile\shell\open\command,,,"""%1"" %*"
HKLM, Software\CLASSES\regfile\shell\open\command,,,"regedit.exe ""%1"""
HKLM, Software\CLASSES\scrfile\shell\open\command,,,"""%1"" %*"
HKCU, Software\Microsoft\Windows\CurrentVersion
\Policies\System,DisableRegistryTools,0x00000020,0
จากนั้นให้ Save เป็นไฟล์ชื่อ UnHookExec.inf
ถ้าต้องการใช้ก็ให้คลิกขวาที่ไฟล์ แล้วเลือก Install จะเป็นการ Enable Regedit นะครับ ^^
Monday, October 02, 2006
NGen Revs Up Your Performance with Powerful New Features
วิธีการใช้ Ngen เพื่อช่วยเพิ่มความเร็ว เอกสารเป็นทางการของ Microsoft
NGen Revs Up Your Performance with Powerful New Features
NGen Revs Up Your Performance with Powerful New Features
Friday, September 22, 2006
วิธีการสั่งรัน Process โดยไม่เริ่มหน้าต่างใหม่
Capturing the output from a console application in C#
Submitted by rlipscombe on Mon, 2005-02-07 21:35.C#
The .NET framework class library provides a handy Process class for running (and monitoring) other applications.
Here's how to grab hold of a Stream object for the input and output of a process.
Process process = new Process();
process.StartInfo.FileName = fileName;
process.StartInfo.Arguments = arguments;
// We have to turn off UseShellExecute to redirect the input and output.
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
// If we're a Windows.Forms application, we'll want to turn
// off the new console window that appears.
process.StartInfo.CreateNoWindow = true;
// We have to turn on EnableRaisingEvents to enable the Exited event.
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(OnExited);
// We can't get at the StandardInput and StandardOutput properties until
// after the process is started.
process.Start();
// The Process class gives us StandardInput and StandardOutput
// properties, but they're a StreamWriter and StreamReader.
StreamWriter inputWriter = process.StandardInput;
Stream inputStream = inputWriter.BaseStream;
// If you want the underlying stream, you need the BaseStream
// property.
StreamReader outputReader = process.StandardOutput;
Stream outputStream = outputReader.BaseStream;
StreamReader errorReader = process.StandardError;
Stream errorStream = errorReader.BaseStream;
Ref :: Capturing the output from a console application in C#
Submitted by rlipscombe on Mon, 2005-02-07 21:35.C#
The .NET framework class library provides a handy Process class for running (and monitoring) other applications.
Here's how to grab hold of a Stream object for the input and output of a process.
Process process = new Process();
process.StartInfo.FileName = fileName;
process.StartInfo.Arguments = arguments;
// We have to turn off UseShellExecute to redirect the input and output.
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
// If we're a Windows.Forms application, we'll want to turn
// off the new console window that appears.
process.StartInfo.CreateNoWindow = true;
// We have to turn on EnableRaisingEvents to enable the Exited event.
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(OnExited);
// We can't get at the StandardInput and StandardOutput properties until
// after the process is started.
process.Start();
// The Process class gives us StandardInput and StandardOutput
// properties, but they're a StreamWriter and StreamReader.
StreamWriter inputWriter = process.StandardInput;
Stream inputStream = inputWriter.BaseStream;
// If you want the underlying stream, you need the BaseStream
// property.
StreamReader outputReader = process.StandardOutput;
Stream outputStream = outputReader.BaseStream;
StreamReader errorReader = process.StandardError;
Stream errorStream = errorReader.BaseStream;
Ref :: Capturing the output from a console application in C#
Tuesday, September 19, 2006
Netsh อีกแล้ว . . .
ตัวอย่างการสั่งเปลี่ยน IP ให้ NIC โดยไม่ต้องอ่านจาก TextFile เหมือนรอบก่อน
ทำดังนี้ครับ
netsh interface ip set address "Local Area Connection" static 10.0.0.123 255.255.0.0 10.0.0.1 1
netsh interface ip set dns "Local Area Connection" static 10.0.0.1
ง่ายๆครับเห็นป่ะ . . .
แต่ก็ comment อย่างเดิมใช้ได้แต่กับ XP ขึ้นไปนะครับ
ใช้เวลาในการเปลี่ยน 15 วินาทีขึ้นไป ( ในการประมวลผลคำสั่ง ) ขึ้นกับความเร็ว
ผมว่าเปลี่ยนเองก็พอๆกัน . . ทำไว้เป็น Bat ก็ได้นะครับ
แต่ผมจะเขียนเป็นโปรแกรม อิอิ
ทำดังนี้ครับ
netsh interface ip set address "Local Area Connection" static 10.0.0.123 255.255.0.0 10.0.0.1 1
netsh interface ip set dns "Local Area Connection" static 10.0.0.1
ง่ายๆครับเห็นป่ะ . . .
แต่ก็ comment อย่างเดิมใช้ได้แต่กับ XP ขึ้นไปนะครับ
ใช้เวลาในการเปลี่ยน 15 วินาทีขึ้นไป ( ในการประมวลผลคำสั่ง ) ขึ้นกับความเร็ว
ผมว่าเปลี่ยนเองก็พอๆกัน . . ทำไว้เป็น Bat ก็ได้นะครับ
แต่ผมจะเขียนเป็นโปรแกรม อิอิ
Monday, September 18, 2006
การเปลี่ยน IP ผ่าน Commad Line
วันนี้ผมได้ทดลองทำการเปลี่ยน IP Address ผ่าน Command Line นะครับ
โดยวิธีการคือผมทำ TextFile ไว้เพื่อเก็บข้อมูลเกี่ยวกับ IP Address ดังนี้
# ----------------------------------
# Interface IP Configuration
# ----------------------------------
pushd interface ip
set address name = "Internet" source = static addr = 10.0.0.109 mask = 255.0.0.0
set address name = "Internet" gateway = 10.0.0.2 gwmetric = 1
set dns name = "Internet" source = static addr = 203.146.237.237
add dns name = "Internet" addr = 203.146.237.222
popd
# End of interface IP configuration
จากนั้นก็ Save เช่นผมเซฟ เป็นชื่อ TOT.txt
เวลาจะใช้งานก็เปิด Command Line ขึ้น แล้วพิมพ์คำสั่ง
netsh -f (ชื่อไฟล์)
รอสักครู่ ค่าของ IP ที่ตั้งไว้ใน NIC จะถูกเปลี่ยนตามที่กำหนดครับ
ทั้งหมดนี้ผมทดสอบบน Windows XP Pro นะครับ ^-^ ทำงานได้ดีมั๊กๆ ^ ^
โดยวิธีการคือผมทำ TextFile ไว้เพื่อเก็บข้อมูลเกี่ยวกับ IP Address ดังนี้
# ----------------------------------
# Interface IP Configuration
# ----------------------------------
pushd interface ip
set address name = "Internet" source = static addr = 10.0.0.109 mask = 255.0.0.0
set address name = "Internet" gateway = 10.0.0.2 gwmetric = 1
set dns name = "Internet" source = static addr = 203.146.237.237
add dns name = "Internet" addr = 203.146.237.222
popd
# End of interface IP configuration
จากนั้นก็ Save เช่นผมเซฟ เป็นชื่อ TOT.txt
เวลาจะใช้งานก็เปิด Command Line ขึ้น แล้วพิมพ์คำสั่ง
netsh -f (ชื่อไฟล์)
รอสักครู่ ค่าของ IP ที่ตั้งไว้ใน NIC จะถูกเปลี่ยนตามที่กำหนดครับ
ทั้งหมดนี้ผมทดสอบบน Windows XP Pro นะครับ ^-^ ทำงานได้ดีมั๊กๆ ^ ^
Saturday, September 16, 2006
Login root ด้วย ssh บน FreeBSD 6.0
วันนี้ผมว่างครับเลยกลับมาลองงม FreeBSD อีกรอบ แผ่นที่มีก็เป็นรุ่น 6.0
ตอนนี้ใหม่สุดจากเวบเค้าก็เป็นรุ่น 6.1 ผมเลยไม่ซีเรียด
ตอนนี้ลงเสร็จแล้วเซทต่อเนทแล้ว ติดปัญหาอย่างเดียวครับ คือ ผมลง SSH ไป
แต่ผม Login ด้วย root ไม่ได้
แต่ตอนนี้ผมได้คำตอบเลยเลยขอ Note ไว้สักหน่อย
วิธีก็คือ
แก้ไขไฟล์ /etc/ssh/sshd_config
หา #PermitRootLogin no
ให้ลบ # ออก แล้วแก้ no เป็น yes จะได้เป็น
PermitRootLogin yes
ความจริงแล้วเค้าไม่แนะนำให้ทำแบบนี้นะครับ ( แต่ผมจะทำเพราะยังไม่ได้ออนไลน์ )
ตอนนี้ใหม่สุดจากเวบเค้าก็เป็นรุ่น 6.1 ผมเลยไม่ซีเรียด
ตอนนี้ลงเสร็จแล้วเซทต่อเนทแล้ว ติดปัญหาอย่างเดียวครับ คือ ผมลง SSH ไป
แต่ผม Login ด้วย root ไม่ได้
แต่ตอนนี้ผมได้คำตอบเลยเลยขอ Note ไว้สักหน่อย
วิธีก็คือ
แก้ไขไฟล์ /etc/ssh/sshd_config
หา #PermitRootLogin no
ให้ลบ # ออก แล้วแก้ no เป็น yes จะได้เป็น
PermitRootLogin yes
ความจริงแล้วเค้าไม่แนะนำให้ทำแบบนี้นะครับ ( แต่ผมจะทำเพราะยังไม่ได้ออนไลน์ )
Thursday, September 14, 2006
Access Point 2 Access Point
วันนี้รุ่นพี่ที่ทำงาน โทรมาถามว่า AP มันสามารถทำ Repeat กับ AP ด้วยกันได้ไหม
ผมเองจำได้นะว่ามันทำได้ แต่ก็ไม่เคยมี AP หลายๆตัวเลยไม่เคยได้ทำสักที
หลังจากวางสายก็เลยหาข้อมูลเกี่ยวกับการทำ Repeat สัญญานด้วย AP ก็ได้ข้อมูลมาดังนี้
- AP ทุกตัวที่จะใช้จะต้องมี Mode Repeat ด้วย
- AP ควรจะเป็น ยี่ห้อ และ รุ่นเดียวกัน ( ให้ตรวจสอบ Firmware ด้วย )
ผมเองก็ยังไม่ได้ลองทำ แต่เร็วๆนี้คงได้ลองเพราะต้องไปวางระบบเครือข่าย ที่ส่วนของห้องตรวจ
และจะต้อง Hybrid เข้ากับ Wire Network
งานนี้สั่ง Access Point ไป 4 ตัว กะจะให้สัญญานในย่านนั้น แรงๆ ( มีสำรองเสีย 1 ตัว )
จะลองทำ Repeat ก็งานนี้แหละครับ ^ ^
อีกเรื่องหนึ่ง ผมได้ข้อมูลมาว่า ทั่วๆไปแล้ว AP สามารถส่งสัญญานได้ประมาณรัศมี 100 เมตร
และสามารถรองรับการเชื่อมต่อเข้ามา ตั้งแต่ 100 เครื่องขึ้นไป แต่ถึงเท่าไร ไม่มีระบุ
Ref :: The Lord Of Wireless
ผมเองจำได้นะว่ามันทำได้ แต่ก็ไม่เคยมี AP หลายๆตัวเลยไม่เคยได้ทำสักที
หลังจากวางสายก็เลยหาข้อมูลเกี่ยวกับการทำ Repeat สัญญานด้วย AP ก็ได้ข้อมูลมาดังนี้
- AP ทุกตัวที่จะใช้จะต้องมี Mode Repeat ด้วย
- AP ควรจะเป็น ยี่ห้อ และ รุ่นเดียวกัน ( ให้ตรวจสอบ Firmware ด้วย )
ผมเองก็ยังไม่ได้ลองทำ แต่เร็วๆนี้คงได้ลองเพราะต้องไปวางระบบเครือข่าย ที่ส่วนของห้องตรวจ
และจะต้อง Hybrid เข้ากับ Wire Network
งานนี้สั่ง Access Point ไป 4 ตัว กะจะให้สัญญานในย่านนั้น แรงๆ ( มีสำรองเสีย 1 ตัว )
จะลองทำ Repeat ก็งานนี้แหละครับ ^ ^
อีกเรื่องหนึ่ง ผมได้ข้อมูลมาว่า ทั่วๆไปแล้ว AP สามารถส่งสัญญานได้ประมาณรัศมี 100 เมตร
และสามารถรองรับการเชื่อมต่อเข้ามา ตั้งแต่ 100 เครื่องขึ้นไป แต่ถึงเท่าไร ไม่มีระบุ
Ref :: The Lord Of Wireless
Tuesday, September 12, 2006
ตัวอย่างการสร้าง Assembly ใน .Net
วันนี้ผมทดลองเขียน Assembly เกี่ยวกับ Network ของผมเอง เพื่อความสะดวกในการทำงาน
ตัวอย่าง CODE พัฒนาโดย C# หลังคอมไฟล์จะได้เป็นไฟล์ Stamp.Net.DLL
using System;
using System.Net;
using System.Collections.Generic;
using System.Text;
namespace Stamp.Net
{
public class IPClass
{
private string IP;
private string host;
public string version()
{
string APIversion = "1.0";
return APIversion;
}
public string hostName()
{
string hName = Dns.GetHostName();
host = hName;
return host;
}
public string getHostname()
{
hostName();
return host;
}
public string getMyIP()
{
string ip = null;
getHostname();
IPHostEntry ipEntry = Dns.GetHostEntry(host);
IPAddress[] addr = ipEntry.AddressList;
for (int i = 0; i < addr.Length; i++)
{
ip += addr[i].ToString();
}
IP = ip;
return IP;
}
public string getOtherIP(string domain)
{
string ip = null;
IPHostEntry ipEntry = Dns.GetHostEntry(domain);
IPAddress[] addr = ipEntry.AddressList;
for (int i = 0; i < addr.Length; i++)
{
ip += addr[i].ToString();
}
IP = ip;
return IP;
}
}
}
ผมทดลองใช้แล้วนะครับ ^^ พูดได้แค่ว่า Yes !! It work..
ตัวอย่าง CODE พัฒนาโดย C# หลังคอมไฟล์จะได้เป็นไฟล์ Stamp.Net.DLL
using System;
using System.Net;
using System.Collections.Generic;
using System.Text;
namespace Stamp.Net
{
public class IPClass
{
private string IP;
private string host;
public string version()
{
string APIversion = "1.0";
return APIversion;
}
public string hostName()
{
string hName = Dns.GetHostName();
host = hName;
return host;
}
public string getHostname()
{
hostName();
return host;
}
public string getMyIP()
{
string ip = null;
getHostname();
IPHostEntry ipEntry = Dns.GetHostEntry(host);
IPAddress[] addr = ipEntry.AddressList;
for (int i = 0; i < addr.Length; i++)
{
ip += addr[i].ToString();
}
IP = ip;
return IP;
}
public string getOtherIP(string domain)
{
string ip = null;
IPHostEntry ipEntry = Dns.GetHostEntry(domain);
IPAddress[] addr = ipEntry.AddressList;
for (int i = 0; i < addr.Length; i++)
{
ip += addr[i].ToString();
}
IP = ip;
return IP;
}
}
}
ผมทดลองใช้แล้วนะครับ ^^ พูดได้แค่ว่า Yes !! It work..
วิธีการนำข้อมูลใน DataSet ออกมาเป็น XML
วิธีในการนำ DataSet ออกมาเป็น XML วันนี้จะ Note การนำข้อมูลใน DataSet ออกมาเป็น
ไฟล์ XML โดยการดึงข้อมูลใน DataBase มาทำเป็น XML File สามารถทำได้ผ่าน DataSet
โดยวิธีการใช้งาน Method
DataSet.WriteXML(Filename.XML);
ซึ่ง Method นี้จะทำการนำข้อมูลใน DataSet มาเขียนใส่ไฟล์ XML
สำหรับวิธีการนำเข้าก็ใช้ Method
DataSet.ReadXML(Filename.XML);
###########################################################
วิธีการนี้เราสามารถที่จะนำไปประยุกต์ใช้กับโปรแกรมแปลงประเภทฐานข้อมูลได้ . . หรือนำไป
ประยุกต์ใช้กับโปรแกรมประเภทอื่นๆ ^ ^
ไฟล์ XML โดยการดึงข้อมูลใน DataBase มาทำเป็น XML File สามารถทำได้ผ่าน DataSet
โดยวิธีการใช้งาน Method
DataSet.WriteXML(Filename.XML);
ซึ่ง Method นี้จะทำการนำข้อมูลใน DataSet มาเขียนใส่ไฟล์ XML
สำหรับวิธีการนำเข้าก็ใช้ Method
DataSet.ReadXML(Filename.XML);
###########################################################
วิธีการนี้เราสามารถที่จะนำไปประยุกต์ใช้กับโปรแกรมแปลงประเภทฐานข้อมูลได้ . . หรือนำไป
ประยุกต์ใช้กับโปรแกรมประเภทอื่นๆ ^ ^
Monday, September 11, 2006
โปรแกรมติดต่อ WMI ที่ผมลองเขียน
วันนี้ผมลองเขียนโปรแกรมติดต่อ WMI เพื่อเรียกดู Memory ที่เหลือให้ใช้ในระบบ
และ ชื่อของ SoundCard ในเครื่องของผม Sourcecode ดังนี้ครับ
using System;
using System.Management;
using System.Collections.Generic;
using System.Text;
namespace CS_TestWMI
{
class Program
{
static void Main(string[] args)
{
SelectQuery query = new SelectQuery("Win32_OperatingSystem");
ManagementObjectSearcher search = new ManagementObjectSearcher(query);
foreach (ManagementObject read in search.Get())
{
Console.WriteLine("Query From Win32_OperatingSystem");
Console.WriteLine(read.GetPropertyValue("FreePhysicalMemory"));
Console.WriteLine(read.GetPropertyValue("Caption"));
Console.WriteLine(read.GetPropertyValue("SerialNumber"));
Console.ReadLine();
}
SelectQuery query2 = new SelectQuery("Win32_SoundDevice");
ManagementObjectSearcher search2 = new ManagementObjectSearcher(query2);
foreach (ManagementObject read2 in search2.Get())
{
Console.WriteLine("Query From Win32_SoundDevice");
Console.WriteLine(read2.GetPropertyValue("ProductName"));
Console.ReadLine();
}
}
}
}
ทดสอบแล้วทำงานได้ครับ ^^ เป็น ConSole Application ครับผม
และ ชื่อของ SoundCard ในเครื่องของผม Sourcecode ดังนี้ครับ
using System;
using System.Management;
using System.Collections.Generic;
using System.Text;
namespace CS_TestWMI
{
class Program
{
static void Main(string[] args)
{
SelectQuery query = new SelectQuery("Win32_OperatingSystem");
ManagementObjectSearcher search = new ManagementObjectSearcher(query);
foreach (ManagementObject read in search.Get())
{
Console.WriteLine("Query From Win32_OperatingSystem");
Console.WriteLine(read.GetPropertyValue("FreePhysicalMemory"));
Console.WriteLine(read.GetPropertyValue("Caption"));
Console.WriteLine(read.GetPropertyValue("SerialNumber"));
Console.ReadLine();
}
SelectQuery query2 = new SelectQuery("Win32_SoundDevice");
ManagementObjectSearcher search2 = new ManagementObjectSearcher(query2);
foreach (ManagementObject read2 in search2.Get())
{
Console.WriteLine("Query From Win32_SoundDevice");
Console.WriteLine(read2.GetPropertyValue("ProductName"));
Console.ReadLine();
}
}
}
}
ทดสอบแล้วทำงานได้ครับ ^^ เป็น ConSole Application ครับผม
MySQL Storage Engine Detail
รายละเอียด Storage Engine ประเภทต่างๆใน MySQL
mysql> show engines;
+------------+---------+-------------------------------------------------------+
| Engine | Support | Comment |
+------------+---------+-------------------------------------------------------+
| MyISAM | YES | Default engine as of MySQL 3.23 with great performance |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
| HEAP | YES | Alias for MEMORY |
| MERGE | YES | Collection of identical MyISAM tables |
| MRG_MYISAM | YES | Alias for MERGE |
| ISAM | NO | Obsolete storage engine, now replaced by MyISAM |
| MRG_ISAM | NO | Obsolete storage engine, now replaced by MERGE |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys |
| INNOBASE | YES | Alias for INNODB |
| BDB | YES | Supports transactions and page-level locking |
| BERKELEYDB | YES | Alias for BDB |
| NDBCLUSTER | NO | Clustered, fault-tolerant, memory-based tables |
| NDB | NO | Alias for NDBCLUSTER |
| EXAMPLE | NO | Example storage engine |
| ARCHIVE | YES | Archive storage engine |
| CSV | NO | CSV storage engine |
| FEDERATED | YES | Federated MySQL storage engine |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) |
+------------+---------+--------------------------------------------+
Ref:: MySQL Storage Engine Detail
mysql> show engines;
+------------+---------+-------------------------------------------------------+
| Engine | Support | Comment |
+------------+---------+-------------------------------------------------------+
| MyISAM | YES | Default engine as of MySQL 3.23 with great performance |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
| HEAP | YES | Alias for MEMORY |
| MERGE | YES | Collection of identical MyISAM tables |
| MRG_MYISAM | YES | Alias for MERGE |
| ISAM | NO | Obsolete storage engine, now replaced by MyISAM |
| MRG_ISAM | NO | Obsolete storage engine, now replaced by MERGE |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys |
| INNOBASE | YES | Alias for INNODB |
| BDB | YES | Supports transactions and page-level locking |
| BERKELEYDB | YES | Alias for BDB |
| NDBCLUSTER | NO | Clustered, fault-tolerant, memory-based tables |
| NDB | NO | Alias for NDBCLUSTER |
| EXAMPLE | NO | Example storage engine |
| ARCHIVE | YES | Archive storage engine |
| CSV | NO | CSV storage engine |
| FEDERATED | YES | Federated MySQL storage engine |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) |
+------------+---------+--------------------------------------------+
Ref:: MySQL Storage Engine Detail
Friday, September 08, 2006
ทดลองใช้ WMI ครั้งแรก
เริ่มเลยขอทำ Reference Links ไปที่ WMI ใน MSDN ก่อนนะครับ
Ref :: WMI
คือว่าแบบนี้ครับ วันนี้ผมมีเวลาว่างช่วงบ่ายเล็กน้อย และเคยมีความคิดว่า เออนะ อยากเขียน
โปรแกรมที่สามารถ เรียกรายละเอียดของ Hardware มาดูได้
แต่ผมก็ไม่เข้าใจหรอกนะว่ามันจะไปเรียกมาได้ยังไง แต่อยู่ๆ ผมก็นึกถึง WMI ขึ้นมาได้
ว่าผมเคยอ่านใน MSDN ของ Microsoft และก็ในกระทู้ของอาจารย์สุเทพ
Ref :: กระทู้เกี่ยวกับ WMI ใน Greatfrieds.biz
และผมก็ทดลองใช้หลายๆอย่างดังนี้
- เรียก Printer ที่มีในเครื่อง
- ตรวจดูจำนวน CPU และ ชื่อ CPU
- เรียกดูชื่อ CD-ROM
และผมยังพบอีกว่า ผมสามารถทำ Remote ด้วย WMI ได้ . . ( เด็ดดวง )
ข้อเสีย
จากที่ผมพบข้อเสียในการใช้ WMI ด้วย .Net ( คือตัว .net จะทำ Wrapper ) ให้เราเอง
ก็ช่วยให้เขียนได้ง่ายเหมือนกับเขียน .Net เองเลย แต่ติดตรงที่ทำงานช้าไปนิด . . เพราะที่
ผมทดลองนี่เป็น Console App นะ . . ถ้าเป็น Winapp คงช้ามากๆเหมือนกัน
Ref :: WMI
คือว่าแบบนี้ครับ วันนี้ผมมีเวลาว่างช่วงบ่ายเล็กน้อย และเคยมีความคิดว่า เออนะ อยากเขียน
โปรแกรมที่สามารถ เรียกรายละเอียดของ Hardware มาดูได้
แต่ผมก็ไม่เข้าใจหรอกนะว่ามันจะไปเรียกมาได้ยังไง แต่อยู่ๆ ผมก็นึกถึง WMI ขึ้นมาได้
ว่าผมเคยอ่านใน MSDN ของ Microsoft และก็ในกระทู้ของอาจารย์สุเทพ
Ref :: กระทู้เกี่ยวกับ WMI ใน Greatfrieds.biz
และผมก็ทดลองใช้หลายๆอย่างดังนี้
- เรียก Printer ที่มีในเครื่อง
- ตรวจดูจำนวน CPU และ ชื่อ CPU
- เรียกดูชื่อ CD-ROM
และผมยังพบอีกว่า ผมสามารถทำ Remote ด้วย WMI ได้ . . ( เด็ดดวง )
ข้อเสีย
จากที่ผมพบข้อเสียในการใช้ WMI ด้วย .Net ( คือตัว .net จะทำ Wrapper ) ให้เราเอง
ก็ช่วยให้เขียนได้ง่ายเหมือนกับเขียน .Net เองเลย แต่ติดตรงที่ทำงานช้าไปนิด . . เพราะที่
ผมทดลองนี่เป็น Console App นะ . . ถ้าเป็น Winapp คงช้ามากๆเหมือนกัน
การตั้งค่าหน้ากระดาษ ให้ Printer บน WinXP
ผมติดปัญหากับโปรแกรมที่ใช้ในที่ทำงาน ( รพ. ) มาได้ประมาณ 5 เดือนแล้ว
นั่นเป็นเหตุผลที่ผมต้องใช้ Windows98/ME ในการสั่งพิมพ์ต่างๆ ในชุดโปรแกรม Mrecord
จนกระทั่งวันนี้ผมได้เจอกระทู้เกี่ยวกับวิธีการตั้งค่ากระดาษบน Windows XP
ต้องขอขอบคุณคุณ GOOK เพื่อนจาก Community ของ Greatfriends.biz จริงๆครับ.
หลังจากผมทดลองตั้งค่าตามที่แนะนำไว้ในกระทู้ ก็ปรากฏว่าสามารถใช้ได้จริงๆ . .
เรื่องง่ายๆ ที่เป็นความรู้ใหม่เลยนะครับ ผมคิดมาตลอดเลยว่ามันทำไม่ได้ : P
วิธีการคือคลิกที่ Start->Printer and Fax
แล้วเลือกที่ Menu :: File -> Server Properties
แค่นี้เอง
นั่นเป็นเหตุผลที่ผมต้องใช้ Windows98/ME ในการสั่งพิมพ์ต่างๆ ในชุดโปรแกรม Mrecord
จนกระทั่งวันนี้ผมได้เจอกระทู้เกี่ยวกับวิธีการตั้งค่ากระดาษบน Windows XP
ต้องขอขอบคุณคุณ GOOK เพื่อนจาก Community ของ Greatfriends.biz จริงๆครับ.
หลังจากผมทดลองตั้งค่าตามที่แนะนำไว้ในกระทู้ ก็ปรากฏว่าสามารถใช้ได้จริงๆ . .
เรื่องง่ายๆ ที่เป็นความรู้ใหม่เลยนะครับ ผมคิดมาตลอดเลยว่ามันทำไม่ได้ : P
วิธีการคือคลิกที่ Start->Printer and Fax
แล้วเลือกที่ Menu :: File -> Server Properties
แค่นี้เอง
คำสั่ง SQL เรียกดู Tables และ Database
ปกติแล้วผมไม่ค่อยได้ใช้คำสั่งพวกนี้สักเท่าไร ก็เพราะว่าเรามี SQL Manager ดีๆให้ใช้เยอะ
แต่ก็นั่นแหละ บางทีก็อยากจะรู้ไว้บ้างเหมือนกัน
ตัวอย่าง SQL ต่อไปนี้ใช้สำหรับ MySQL นะ อันอื่นๆ ยังไม่เคยลองแต่น่าจะคล้ายๆกัน
SHOW TABLES;
SHOW TABLES FROM db_name;
SHOW DATABASES;
SHOW TABLES LIKE 'tbl_name';
SHOW TABLES STATUS;
SHOW COLUMNS FROM tbl_name;
SHOW INDEX FROM tbl_name;
SHOW CREATE TABLE tbl_name;
SHOW CREATE DATABASE db_name;
ทดสอบทุกคำสั่งกับ MySQL 5.0.28 แล้วครับ ^-^
และก็ลองหาข้อมูลเทียบกับ Firebird ดูแล้ว รู้สึกว่าจะคำสั่งเดียวกันเพียงแต่เวลาใช้
FireBird ต้องเรียก ISQL ออกมาเท่านั้นเอง ^ ^
แต่ก็นั่นแหละ บางทีก็อยากจะรู้ไว้บ้างเหมือนกัน
ตัวอย่าง SQL ต่อไปนี้ใช้สำหรับ MySQL นะ อันอื่นๆ ยังไม่เคยลองแต่น่าจะคล้ายๆกัน
SHOW TABLES;
SHOW TABLES FROM db_name;
SHOW DATABASES;
SHOW TABLES LIKE 'tbl_name';
SHOW TABLES STATUS;
SHOW COLUMNS FROM tbl_name;
SHOW INDEX FROM tbl_name;
SHOW CREATE TABLE tbl_name;
SHOW CREATE DATABASE db_name;
ทดสอบทุกคำสั่งกับ MySQL 5.0.28 แล้วครับ ^-^
และก็ลองหาข้อมูลเทียบกับ Firebird ดูแล้ว รู้สึกว่าจะคำสั่งเดียวกันเพียงแต่เวลาใช้
FireBird ต้องเรียก ISQL ออกมาเท่านั้นเอง ^ ^
โปรแกรมเข้ารหัสไฟล์ SQLite DB ที่ผมพัฒนาขึ้น
หน้าตาของโปรแกรมที่ผมพัฒนาขึ้นจะเป็นแบบนี้นะครับ
สำหรับ Sourcecode
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Data.SQLite;
using System.Windows.Forms;
namespace SetPasswordProtect
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
public string datasource;
public string ConStr;
private void btnFind_Click(object sender, EventArgs e)
{
if (openFileDlg.ShowDialog() == DialogResult.OK)
{
string dbPath;
dbPath = openFileDlg.FileName;
label3.Text = dbPath;
datasource = dbPath;
ConStr = "Data Source="+datasource+";version=3;";
}
else
{
MessageBox.Show("พบข้อผิดพลาด ","ข้อผิดพลาด");
}
}
private void btnPwdSet_Click(object sender, EventArgs e)
{
if ((datasource == "") || (ConStr == "") || (txtPwdSet.Text == ""))
{
MessageBox.Show("พบข้อผิดพลาด ", " ข้อผิดพลาด");
}
else
{
try
{
SQLiteConnection Conn = new SQLiteConnection(ConStr);
Conn.Open();
Conn.ChangePassword(txtPwdSet.Text);
Conn.Close();
MessageBox.Show("Complete Setting Password", "Result");
}
catch (SQLiteException ex)
{
MessageBox.Show(ex.ToString(), " ข้อผิดพลาดจาก SQLite");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), " ข้อผิดพลาดจากระบบ");
}
}
}
}
}
ที่เห็นด้านบนก็คือ Sourcecode ของโปรแกรมที่ผมเขียน ( C# นะครับ )
สำหรับ Sourcecode
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Data.SQLite;
using System.Windows.Forms;
namespace SetPasswordProtect
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
public string datasource;
public string ConStr;
private void btnFind_Click(object sender, EventArgs e)
{
if (openFileDlg.ShowDialog() == DialogResult.OK)
{
string dbPath;
dbPath = openFileDlg.FileName;
label3.Text = dbPath;
datasource = dbPath;
ConStr = "Data Source="+datasource+";version=3;";
}
else
{
MessageBox.Show("พบข้อผิดพลาด ","ข้อผิดพลาด");
}
}
private void btnPwdSet_Click(object sender, EventArgs e)
{
if ((datasource == "") || (ConStr == "") || (txtPwdSet.Text == ""))
{
MessageBox.Show("พบข้อผิดพลาด ", " ข้อผิดพลาด");
}
else
{
try
{
SQLiteConnection Conn = new SQLiteConnection(ConStr);
Conn.Open();
Conn.ChangePassword(txtPwdSet.Text);
Conn.Close();
MessageBox.Show("Complete Setting Password", "Result");
}
catch (SQLiteException ex)
{
MessageBox.Show(ex.ToString(), " ข้อผิดพลาดจาก SQLite");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), " ข้อผิดพลาดจากระบบ");
}
}
}
}
}
ที่เห็นด้านบนก็คือ Sourcecode ของโปรแกรมที่ผมเขียน ( C# นะครับ )
Thursday, September 07, 2006
ทดลองใส่เพลงบน Blog
ผมเคยเขียนเกี่ยวกับวิธีการ Embled Windows Media Player ลงใน Blog
เมื่อเดือนสิงหา ที่ผ่านมา
มาวันนี้ผมได้ทดสอบนำไฟล์ MP3 ไปวางไว้ใน Server ของผมเองที่เช่าไว้
แล้วก็ทำการ Embled เพลงใส่เข้าไปใน Blog โดยให้ WM ไปเรียกเพลงมา
จาก URL ที่ชี้ไปที่เวบไซต์ของผม ^^
ได้ไม่ได้เดี๋ยวก็รู้กันแล้วครับ ( แต่ผมว่าได้นะ เพราะเมื่อกี้ได้ยินเสียงเพลงแล้ว )
เมื่อเดือนสิงหา ที่ผ่านมา
มาวันนี้ผมได้ทดสอบนำไฟล์ MP3 ไปวางไว้ใน Server ของผมเองที่เช่าไว้
แล้วก็ทำการ Embled เพลงใส่เข้าไปใน Blog โดยให้ WM ไปเรียกเพลงมา
จาก URL ที่ชี้ไปที่เวบไซต์ของผม ^^
ได้ไม่ได้เดี๋ยวก็รู้กันแล้วครับ ( แต่ผมว่าได้นะ เพราะเมื่อกี้ได้ยินเสียงเพลงแล้ว )
รหัสผ่านที่มากับ Virus
วันนี้ผมเจอไวรัสครับ . . . ไอ้เจ้าไวรัสตัวนี้ มันไปใส่รหัสผ่านให้กับ Administrator ของ XP
งานนี้ คงต้องบอกว่าผมโชคดีนะ ที่ว่าเคยอ่าน algorithm ของ virus ตัวนี้มา ( แต่ก็ลืมแล้ว )
ที่แน่ๆ ผมจำได้ว่า Password มันจะเป็น : hackme หรือ hacked ตัวใดตัวนึง
ก็เป็นดังคาดครับ แก้ไขได้
แต่ที่ยังแก้ไม่ได้ก็คือ Folder Option มันถูก Lock เอาไว้ แต่ผมก็จำได้ว่าให้ทำการแก้ไข
No FolderOption = 1 ( ลบทิ้งซะ ไม่แน่ใจพิมพ์ถูกไหมแต่ประมาณนี้แหละ )
ส่วนไอ่ที่ Registry มันไม่ให้เราแก้ไข ( คือเราเรียก Regedit แล้วใช้ไม่ได้ )
มันบอกว่า The registry has been disable by your administrator
ก็ประมาณนี้มั้ง
แต่ถ้าอยากจะแก้จริงๆก็สร้าง account ใหม่ขึ้นมาแล้วก็ไปแก้ซะ . . .
งานนี้ คงต้องบอกว่าผมโชคดีนะ ที่ว่าเคยอ่าน algorithm ของ virus ตัวนี้มา ( แต่ก็ลืมแล้ว )
ที่แน่ๆ ผมจำได้ว่า Password มันจะเป็น : hackme หรือ hacked ตัวใดตัวนึง
ก็เป็นดังคาดครับ แก้ไขได้
แต่ที่ยังแก้ไม่ได้ก็คือ Folder Option มันถูก Lock เอาไว้ แต่ผมก็จำได้ว่าให้ทำการแก้ไข
No FolderOption = 1 ( ลบทิ้งซะ ไม่แน่ใจพิมพ์ถูกไหมแต่ประมาณนี้แหละ )
ส่วนไอ่ที่ Registry มันไม่ให้เราแก้ไข ( คือเราเรียก Regedit แล้วใช้ไม่ได้ )
มันบอกว่า The registry has been disable by your administrator
ก็ประมาณนี้มั้ง
แต่ถ้าอยากจะแก้จริงๆก็สร้าง account ใหม่ขึ้นมาแล้วก็ไปแก้ซะ . . .
การสร้าง XSD เพื่อใช้ทำ Report
วันนี้ได้มีโอกาศคุยกับคุณ Nine ซึ่งเป็น MVP ของ Microsoft Thailand คนหนึ่ง
เลยได้ขอคำแนะนำเกี่ยวกับการสร้าง XSD เพื่อใช้ในการทำ Report กับ CR บน .Net
ซึ่งผมเคยศึกษาจากโปรแกรมที่คุณ Nine ได้ทำไว้ให้ แต่โปรแกรมนั้นสามารถใช้ได้กับ
เฉพาะ DBMS ของ MySQL 4 ขึ้นไป และ MS SQL2000 - 2005
แต่ความต้องการของผมมันมากเกินกว่านั้น
จากการที่ผมได้ศึกษา Flow งานของโปรแกรมตัวนั้นผมคาดว่าใช้การ SELECT เอา Schema
ของ Table ( ซึ่งต่อมาคุณ Nine แนะนำให้ผมนึกภาพว่าเป็นการดึง Query ดีกว่า )
จากนั้นก็นำเอา Query ที่ได้มาทำการ บรรจุลง Dataset ( ด้วย DataAdapter )
แต่อย่าลืมอ้างอิงถึง System.Xml และต้องทำการ Add Ref ของ DBMS ที่จะใช้ด้วย
แล้วก็ใช้คำสั่งของ DataAdapter แล้วก็ทำงานตากปกติ แต่ว่าตอนที่เราจะทำการ Fill
ให้ทำดังนี้
dbAdap.Fill(ds,ชื่อของ Schema);
// ชื่อของ Schema คือ ชื่อที่เราจะใช้ในบันทึกเป็น Element Name ของ File
ds.WriteXmlSchema("ชื่อไฟล์ . XSD");
คราวนี้ผมเองก็เตรียมตัวแล้วที่จะทำการ พัฒนาโปรแกรมสร้าง XSD สำหรับ DB ต่างๆ
เพื่อใช้ในงานอื่นๆ
ที่แน่ๆ คงต้องให้ Support Database ต่อไปนี้
- Firebird
- MySQL
- SQLite
( ที่เหลือผมยังคิดไม่ออกครับ ^ ^ )
เลยได้ขอคำแนะนำเกี่ยวกับการสร้าง XSD เพื่อใช้ในการทำ Report กับ CR บน .Net
ซึ่งผมเคยศึกษาจากโปรแกรมที่คุณ Nine ได้ทำไว้ให้ แต่โปรแกรมนั้นสามารถใช้ได้กับ
เฉพาะ DBMS ของ MySQL 4 ขึ้นไป และ MS SQL2000 - 2005
แต่ความต้องการของผมมันมากเกินกว่านั้น
จากการที่ผมได้ศึกษา Flow งานของโปรแกรมตัวนั้นผมคาดว่าใช้การ SELECT เอา Schema
ของ Table ( ซึ่งต่อมาคุณ Nine แนะนำให้ผมนึกภาพว่าเป็นการดึง Query ดีกว่า )
จากนั้นก็นำเอา Query ที่ได้มาทำการ บรรจุลง Dataset ( ด้วย DataAdapter )
แต่อย่าลืมอ้างอิงถึง System.Xml และต้องทำการ Add Ref ของ DBMS ที่จะใช้ด้วย
แล้วก็ใช้คำสั่งของ DataAdapter แล้วก็ทำงานตากปกติ แต่ว่าตอนที่เราจะทำการ Fill
ให้ทำดังนี้
dbAdap.Fill(ds,ชื่อของ Schema);
// ชื่อของ Schema คือ ชื่อที่เราจะใช้ในบันทึกเป็น Element Name ของ File
ds.WriteXmlSchema("ชื่อไฟล์ . XSD");
คราวนี้ผมเองก็เตรียมตัวแล้วที่จะทำการ พัฒนาโปรแกรมสร้าง XSD สำหรับ DB ต่างๆ
เพื่อใช้ในงานอื่นๆ
ที่แน่ๆ คงต้องให้ Support Database ต่อไปนี้
- Firebird
- MySQL
- SQLite
( ที่เหลือผมยังคิดไม่ออกครับ ^ ^ )
วิธีการแก้ Registry
วันนี้ Computer ที่ทำงานของผมเจอปัญหาจากที่พี่ไวรัส เค้าทำการฝากรอยรักเอาไว้
ซึ่งผมเองก็ไม่มั่นใจนะครับว่าเป็นไวรัสอะไร แต่เคยเจออาการนี้มานานแล้ว
อาการที่พบจะมีหลายอาการไป แล้วแต่โชคแต่ดวงดังนี้
- เข้า Regedit ไม่ได้
- ใช้ Folder Option ไม่ได้
- เข้า Administrator ไม่ได้เนื่องจากไม่มี Password ที่ใช้เข้า
วิธีการแก้ไขอาการแรกนะครับ ( อาการอื่นๆ ยังคิดไม่ออก )
อาการที่พบนะครับ ขั้นแรกเลย . . เราจะใช้ Regedit ไม่ได้ โดยเมื่อเราเรียก
Start -> Run -> regedit
พี่ MS Windows เค้าจะ Response เรามาดังนี้
Registry editing has been disabled by your adminstrator
พูดง่ายๆ . . มันบอกว่า Registry Edition ถูกปิดไว้โดยผู้ดูแลระบบ
แต่เราก็ Logon ไปเป็นผู้ดูแลระบบแท้ๆ - -''
วิธีการให้เราเรียก Start -> Run -> แล้วพิมพ์ข้อความด้านล่างลงไป
REG add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableRegistryTools /t REG_DWORD /d 0 /f
ให้ติดกันเป็นบรรทัดเดียวแล้วกด Enter จากนั้นให้ Restart ก็จะสามารถใช้ได้เช่นเคยครับ
ซึ่งผมเองก็ไม่มั่นใจนะครับว่าเป็นไวรัสอะไร แต่เคยเจออาการนี้มานานแล้ว
อาการที่พบจะมีหลายอาการไป แล้วแต่โชคแต่ดวงดังนี้
- เข้า Regedit ไม่ได้
- ใช้ Folder Option ไม่ได้
- เข้า Administrator ไม่ได้เนื่องจากไม่มี Password ที่ใช้เข้า
วิธีการแก้ไขอาการแรกนะครับ ( อาการอื่นๆ ยังคิดไม่ออก )
อาการที่พบนะครับ ขั้นแรกเลย . . เราจะใช้ Regedit ไม่ได้ โดยเมื่อเราเรียก
Start -> Run -> regedit
พี่ MS Windows เค้าจะ Response เรามาดังนี้
Registry editing has been disabled by your adminstrator
พูดง่ายๆ . . มันบอกว่า Registry Edition ถูกปิดไว้โดยผู้ดูแลระบบ
แต่เราก็ Logon ไปเป็นผู้ดูแลระบบแท้ๆ - -''
วิธีการให้เราเรียก Start -> Run -> แล้วพิมพ์ข้อความด้านล่างลงไป
REG add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableRegistryTools /t REG_DWORD /d 0 /f
ให้ติดกันเป็นบรรทัดเดียวแล้วกด Enter จากนั้นให้ Restart ก็จะสามารถใช้ได้เช่นเคยครับ
Export DataGrid Or DataSet To Excel
วิธีการนำข้อมูลใน DataGrid และ DataSet มาทำการ Export ออกเป็น Excel
สามารถทำได้โดยวิธีการดังนี้ ( ใน .Net Framework 2.0 )
ขั้นตอนแรกให้เราทำการ Add Ref ตัว Excel.dll และเขียน Code ในลักษณะดังนี้
Excel.ApplicationClass excel = new ApplicationClass();
excel.Application.Workbooks.Add(true);
DataTable table = DATASETNAME.Table[0];
int ColumnIndex=0;
foreach(Datacolumn col in table.Columns)
{
ColumnIndex++;
excel.Cells[1,ColumnIndex]=col.ColumnName;
}
int rowIndex=0;
foreach(DataRow row in table.Row)
{
rowIndex++;
ColumnIndex=0;
foreach(DataColumn col in table.Columns)
{
ColumnIndex++;
excel.Cells[rowIndex+1,ColumnIndex]=row.Cells[col.ColumnName].Text;
}
}
excel.Visible = true;
Worksheet worksheet = (Worksheet)excel.ActiveSheet;
worksheet.Activate();
}
สามารถทำได้โดยวิธีการดังนี้ ( ใน .Net Framework 2.0 )
ขั้นตอนแรกให้เราทำการ Add Ref ตัว Excel.dll และเขียน Code ในลักษณะดังนี้
Excel.ApplicationClass excel = new ApplicationClass();
excel.Application.Workbooks.Add(true);
DataTable table = DATASETNAME.Table[0];
int ColumnIndex=0;
foreach(Datacolumn col in table.Columns)
{
ColumnIndex++;
excel.Cells[1,ColumnIndex]=col.ColumnName;
}
int rowIndex=0;
foreach(DataRow row in table.Row)
{
rowIndex++;
ColumnIndex=0;
foreach(DataColumn col in table.Columns)
{
ColumnIndex++;
excel.Cells[rowIndex+1,ColumnIndex]=row.Cells[col.ColumnName].Text;
}
}
excel.Visible = true;
Worksheet worksheet = (Worksheet)excel.ActiveSheet;
worksheet.Activate();
}
Wednesday, September 06, 2006
Code C# Connect FireBird
หลังจากติดตั้ง ADO.Net Provider For .Net Framework 2 สำหรับ FireBird แล้ว
เราก็ต้องทำการ Add Reference ตัว FirebirdSql.Data.FireBirdClient มาไว้ในโปรเจค
จากนั้นก็ทำการเขียน Code ดังนี้
using System;
using System.Collections.Generic;
using System.Text;
using FirebirdSql.Data.FirebirdClient;
namespace FireBirdTestCon
{
class Program
{
static void Main(string[] args)
{
string ConStr = "Database=C:\\Program Files\\Firebird\\Firebird_1_5"+
"\\examples\\EMPLOYEE.FDB;User=SYSDBA;Password=masterkey;"+
"Dialect=3;Server=localhost;";
FbConnection Conn = new FbConnection(ConStr);
Conn.Open();
Console.WriteLine(Conn.ServerVersion);
Console.ReadLine();
Conn.Close();
}
}
}
ผลจากการรันโค๊ตด้านบน โปรแกรมจะตอบกลับ Version ของ FireBird ที่เราใช้อยู่มา
####################################################
แต่ตอนนี้ผมยังหาตัวจัดการ DBMS ของ FireBird ที่เป็น GUI ไม่ได้เลยครับ T T
และผมก็ยังไม่รู้จัก DataType ของ FireBird อีกตั้งหาก
เราก็ต้องทำการ Add Reference ตัว FirebirdSql.Data.FireBirdClient มาไว้ในโปรเจค
จากนั้นก็ทำการเขียน Code ดังนี้
using System;
using System.Collections.Generic;
using System.Text;
using FirebirdSql.Data.FirebirdClient;
namespace FireBirdTestCon
{
class Program
{
static void Main(string[] args)
{
string ConStr = "Database=C:\\Program Files\\Firebird\\Firebird_1_5"+
"\\examples\\EMPLOYEE.FDB;User=SYSDBA;Password=masterkey;"+
"Dialect=3;Server=localhost;";
FbConnection Conn = new FbConnection(ConStr);
Conn.Open();
Console.WriteLine(Conn.ServerVersion);
Console.ReadLine();
Conn.Close();
}
}
}
ผลจากการรันโค๊ตด้านบน โปรแกรมจะตอบกลับ Version ของ FireBird ที่เราใช้อยู่มา
####################################################
แต่ตอนนี้ผมยังหาตัวจัดการ DBMS ของ FireBird ที่เป็น GUI ไม่ได้เลยครับ T T
และผมก็ยังไม่รู้จัก DataType ของ FireBird อีกตั้งหาก
Firebird Project
เมื่อวานผมได้เขียนอะไรถึง Firebird นิดหน่อย และวันนี้ก็เลยลองหาข้อมูลเกี่ยวกับ
การใช้งาน Firebird กับ .net ก็เจอ ADO.net สำหรับ Firebird
Ref:: FireBird Project
การใช้งาน Firebird กับ .net ก็เจอ ADO.net สำหรับ Firebird
Ref:: FireBird Project
Tuesday, September 05, 2006
ผมเพิ่งรู้ว่า Firebird ฟรี
ผมทราบมาตลอดว่า Borland มี Database ดีดี อยู่ตัวหนึ่งนั่นก็คือ Interbase
ซึ่งที่ผมทราบเพราะผมเคยต้องเขียน Delphi ต่อกับฐานข้อมูล Interbase
ตอนนั้นผมเป็นนักศึกษา มหาวิทยาลัยให้ผมใช้ Borland Delphi 5 ต่อ Interbase
ผมก็ใช้ทำโปรแกรมระบบทะเบียนลูกจ้างหน่วยงานรัฐ ( ลูกจ้างชั่วคราวรายวัน รายเดือน )
ซึ่งผมใช้ Interbase เป็น Database Server
เอากันจริงๆ ผมไม่ค่อยคุ้นเคยกับ Interbase นักหรอกครับแต่ผมก็พอจะรู้ว่า Firebird
ก็เป็น Interbase นั่นแหละ ( คล้ายๆ Fedora กับ Redhat ) ในความคิดของผมนะ
จนผมได้ทราบว่า Borland ประกาศแจก Interbase ให้ใช้ได้ฟรีๆ
แต่ผมไม่รู้ว่า Firebird ก็แจกฟรีด้วย
จนกระทั่งวันนี้ผมต้องปล้ำกับ Firebird เนื่องจากผมต้องติดตั้งชุดโปรแกรม Mrecord
หลังจากที่ผมได้ทดลองใช้สักพัก . . ไม่ลึงซึ้งมาก
ผมพบว่ามันเป็น DBMS ที่น่าสนใจตัวนึงเลยทีเดียว เป็นข้อๆดังนี้
1. ฟรี
2. มีทั้งบน Windows/Linux/Unix/MacOS
3. มีคนบอกว่า Copy ไฟล์ .gdb ไปวางข้าม Platform ของ OS ก็ยังใช้ได้
4. มี Trigger และ Store Procedure ให้ผมใช้ ( ถึงผมจะยังไม่เคยใช้มันจริงๆ )
5. ทำ VIEW ได้
6. น่าจะ Stable กว่า MySQL ในความคิดผมนะ ( ไม่ Confirm )
ผมว่ามันลดต้นทุนให้ Developer ได้ดีทีเดียวนะ แต่ก็อย่างเคยครับมันใหญ่เกินไปสำหรับ
โปรแกรมเล็กๆ . . . แต่ถ้าพัฒนาโปรแกรมใหญ่ๆ ต่อไปนี้ Firebird จะเป็นตัวเลือก
อันดับต้นๆ ของผมเลยล่ะ ( ลองจาก MySQL ) แต่ผมได้ยินมาว่า MySQL ไม่ฟรีบน Window
จริงเท็จนี่ผมเองก็ไม่รู้ แต่ถ้าเป็นจริง ผมก็จะหันไปใช้ DBMS ตัวอื่นแทน
ผมยอมรับว่าปัจจุบันก็ละเมิดลิขสิทธิ์ของ IDE และพวกเครื่องมือพัฒนาอยู่ ก็เพราะผมไม่มีเงินซื้อ
และราคาค่าตอบแทนที่ได้จาก Software ที่ขายไปก็ยังไม่เพียงพอสำหรับการนำไปซื้อลิขสิทธิ์
แต่ถ้าทำเป็นบริษัทผมก็คงต้องหาเงินไปซื้อมาเพื่อทำให้มันถูกต้อง
แต่ปัจจุบันนี้ผมไม่มีเงินเพราะฉะนั้นหน้าที่ของผมก็ควรทำให้มันผิดกฏหมายน้อยที่สุด 5 5 5 5
เพราะผมเชื่อว่า Developer ที่ดี ต้องไม่มีเจตนาที่จะละเมิดทรัพย์สินและความคิดผู้อื่น
Reference :: FireBird Resource
ซึ่งที่ผมทราบเพราะผมเคยต้องเขียน Delphi ต่อกับฐานข้อมูล Interbase
ตอนนั้นผมเป็นนักศึกษา มหาวิทยาลัยให้ผมใช้ Borland Delphi 5 ต่อ Interbase
ผมก็ใช้ทำโปรแกรมระบบทะเบียนลูกจ้างหน่วยงานรัฐ ( ลูกจ้างชั่วคราวรายวัน รายเดือน )
ซึ่งผมใช้ Interbase เป็น Database Server
เอากันจริงๆ ผมไม่ค่อยคุ้นเคยกับ Interbase นักหรอกครับแต่ผมก็พอจะรู้ว่า Firebird
ก็เป็น Interbase นั่นแหละ ( คล้ายๆ Fedora กับ Redhat ) ในความคิดของผมนะ
จนผมได้ทราบว่า Borland ประกาศแจก Interbase ให้ใช้ได้ฟรีๆ
แต่ผมไม่รู้ว่า Firebird ก็แจกฟรีด้วย
จนกระทั่งวันนี้ผมต้องปล้ำกับ Firebird เนื่องจากผมต้องติดตั้งชุดโปรแกรม Mrecord
หลังจากที่ผมได้ทดลองใช้สักพัก . . ไม่ลึงซึ้งมาก
ผมพบว่ามันเป็น DBMS ที่น่าสนใจตัวนึงเลยทีเดียว เป็นข้อๆดังนี้
1. ฟรี
2. มีทั้งบน Windows/Linux/Unix/MacOS
3. มีคนบอกว่า Copy ไฟล์ .gdb ไปวางข้าม Platform ของ OS ก็ยังใช้ได้
4. มี Trigger และ Store Procedure ให้ผมใช้ ( ถึงผมจะยังไม่เคยใช้มันจริงๆ )
5. ทำ VIEW ได้
6. น่าจะ Stable กว่า MySQL ในความคิดผมนะ ( ไม่ Confirm )
ผมว่ามันลดต้นทุนให้ Developer ได้ดีทีเดียวนะ แต่ก็อย่างเคยครับมันใหญ่เกินไปสำหรับ
โปรแกรมเล็กๆ . . . แต่ถ้าพัฒนาโปรแกรมใหญ่ๆ ต่อไปนี้ Firebird จะเป็นตัวเลือก
อันดับต้นๆ ของผมเลยล่ะ ( ลองจาก MySQL ) แต่ผมได้ยินมาว่า MySQL ไม่ฟรีบน Window
จริงเท็จนี่ผมเองก็ไม่รู้ แต่ถ้าเป็นจริง ผมก็จะหันไปใช้ DBMS ตัวอื่นแทน
ผมยอมรับว่าปัจจุบันก็ละเมิดลิขสิทธิ์ของ IDE และพวกเครื่องมือพัฒนาอยู่ ก็เพราะผมไม่มีเงินซื้อ
และราคาค่าตอบแทนที่ได้จาก Software ที่ขายไปก็ยังไม่เพียงพอสำหรับการนำไปซื้อลิขสิทธิ์
แต่ถ้าทำเป็นบริษัทผมก็คงต้องหาเงินไปซื้อมาเพื่อทำให้มันถูกต้อง
แต่ปัจจุบันนี้ผมไม่มีเงินเพราะฉะนั้นหน้าที่ของผมก็ควรทำให้มันผิดกฏหมายน้อยที่สุด 5 5 5 5
เพราะผมเชื่อว่า Developer ที่ดี ต้องไม่มีเจตนาที่จะละเมิดทรัพย์สินและความคิดผู้อื่น
Reference :: FireBird Resource
Hungarian Notation
Hungarian Notation เป็นวิธีการประกาศชื่อตัวแปร ให้ง่ายต่อการจดจำ
โดยถือเป็นมาตรฐานอย่างหนึ่งในการ เขียนโปรแกรม
Ref :: Hungarian Notation
โดยถือเป็นมาตรฐานอย่างหนึ่งในการ เขียนโปรแกรม
Ref :: Hungarian Notation
Spec ของ C# 3.0
ถึงตอนนี้ .Net จะอยู่ที่ Version 2 แต่ว่า C# ก็ได้ประกาศ Spec ของ V 3 มาแล้ว
ความจริงแล้ว Spec ของ C#3.0 ก็มีเพิ่มมาหลายอย่าง ยกตัวอย่างเช่นการใช้ var ในการ
ประกาศตัวแปร
ตัวอย่าง
var num = 5;
var name = "Piyanut";
var vat = 0.7;
var ในที่นี้คือ variable ซึ่งเราสามารถใช้ประกาศตัวแปรได้โดยไม่ต้องกำหนด datatype
แต่มีข้อแม้คือ เราต้องกำหนดค่าเริ่มต้นให้กับตัวแปรที่ประกาศด้วย var ทันที และค่าที่ตั้งจะต้อง
ไม่ใช่ null
แต่ที่เห็นจะนิยมกันที่สุดคือ LINQ
ตัวอย่างการใช้ LINQ ใน C#3.0 ดูได้จากเวบ Microsoft เช่นเคยครับ
Ref :: LINQ SAMPLE
ความจริงแล้ว Spec ของ C#3.0 ก็มีเพิ่มมาหลายอย่าง ยกตัวอย่างเช่นการใช้ var ในการ
ประกาศตัวแปร
ตัวอย่าง
var num = 5;
var name = "Piyanut";
var vat = 0.7;
var ในที่นี้คือ variable ซึ่งเราสามารถใช้ประกาศตัวแปรได้โดยไม่ต้องกำหนด datatype
แต่มีข้อแม้คือ เราต้องกำหนดค่าเริ่มต้นให้กับตัวแปรที่ประกาศด้วย var ทันที และค่าที่ตั้งจะต้อง
ไม่ใช่ null
แต่ที่เห็นจะนิยมกันที่สุดคือ LINQ
ตัวอย่างการใช้ LINQ ใน C#3.0 ดูได้จากเวบ Microsoft เช่นเคยครับ
Ref :: LINQ SAMPLE
โปรแกรมที่ดีเริ่มที่การออกแบบ
โปรแกรมที่ดีเริ่มที่การออกแบบ . . . .
บังเอิญผมเจอ Blog บทความนี้มาจาก Blog ของคุณ Bact ซึ่งเกี่ยวกับการออกแบบ Interface
แต่บทความนี้เป็นการออกแบบ User Interface บน MacOS . .
แต่ไม่เป็นไรครับ เพราะเราสามารถนำไปใช้ได้จริงกับทุกๆ OS เนื่องจากการออกแบบโปรแกรมมีพื้นฐาน
มาจากสิ่งเดียวกัน ผมว่าเป็นบทความที่ดีมากๆเลยครับ ขอบคุณผู้เขียนและผู้เรียบเรียงจากใจจริง
Ref :: โปรแกรมที่ดีเริ่มที่การออกแบบ
บังเอิญผมเจอ Blog บทความนี้มาจาก Blog ของคุณ Bact ซึ่งเกี่ยวกับการออกแบบ Interface
แต่บทความนี้เป็นการออกแบบ User Interface บน MacOS . .
แต่ไม่เป็นไรครับ เพราะเราสามารถนำไปใช้ได้จริงกับทุกๆ OS เนื่องจากการออกแบบโปรแกรมมีพื้นฐาน
มาจากสิ่งเดียวกัน ผมว่าเป็นบทความที่ดีมากๆเลยครับ ขอบคุณผู้เขียนและผู้เรียบเรียงจากใจจริง
Ref :: โปรแกรมที่ดีเริ่มที่การออกแบบ
Document Ref สำหรับ .net จาก Microsoft
Reference Web ทั้งหมดที่แสดงนี้อ้างอิงกับ .Net Framework Version 2.0
Reference
.Net Framework Tool
Win32API Compare with .Net Library
.Net Framework V2 Obsolete Type/Member List (By NameSpace)
Reference
.Net Framework Tool
Win32API Compare with .Net Library
.Net Framework V2 Obsolete Type/Member List (By NameSpace)
การเพิ่มความเร็วตอน StartUp ให้ .net App
ประสบปัญหาเดียวกันแทบทุกคนสำหรับ Dev ที่ใช้ Java หรือ .net ในการพัฒนาโปรแกรม
ก็คือเวลาที่เสียไปกับการ StartUp Program มันช้ามากๆจริงๆ
หลังจากที่ค้นหาข้อมูลทาง Internet และได้ถามผู้คนใน Forum รวมถึงดูจาก MSDN ผมพบว่า
Microsoft ได้เตรียมเครื่องมือไว้ตัวนึงซึ่งใช้สำหรับเพิ่มความเร็วในการ StartUp App ที่พัฒนา
ด้วย .net ได้
นั้นคือ Ngen.exe ( Native Image Generator ) วิธีการใช้งานดูได้จาก MSDN
Ref :: Ngen.exe
หลังจากผมได้ทดลองใช้แล้ว ก็พบว่าเร็วขึ้น แต่ก็ไม่ได้มากมายนัก . . . แต่ก็ยังดีครับ ^ ^
ก็คือเวลาที่เสียไปกับการ StartUp Program มันช้ามากๆจริงๆ
หลังจากที่ค้นหาข้อมูลทาง Internet และได้ถามผู้คนใน Forum รวมถึงดูจาก MSDN ผมพบว่า
Microsoft ได้เตรียมเครื่องมือไว้ตัวนึงซึ่งใช้สำหรับเพิ่มความเร็วในการ StartUp App ที่พัฒนา
ด้วย .net ได้
นั้นคือ Ngen.exe ( Native Image Generator ) วิธีการใช้งานดูได้จาก MSDN
Ref :: Ngen.exe
หลังจากผมได้ทดลองใช้แล้ว ก็พบว่าเร็วขึ้น แต่ก็ไม่ได้มากมายนัก . . . แต่ก็ยังดีครับ ^ ^
Create Quality Application in Windows Vista
วันนี้ผมกำลังสร้าง Favorites หลังจากที่ทำการ Format เครื่องใหม่เพื่อที่จะให้ลง VS.net2005 ได้
ไม่เชื่อก็ต้องเชื่อนะ ว่าปัญหามันอยู่ที่ Windows ทั้งๆที่ผมไม่พบอาการผิดปกติใดๆจากการใช้งานเลย
แต่ windows ที่ลงจากแผ่นนั้นกลับไม่สามารถติดตั้ง VS.net2005 ได้ ( แปลกแต่จริง )
เช้านี้ทันทีที่เข้ามาผมก็เริ่มเก็บ Favorite ของเวบต่างๆใหม่เนื่องจากของเก่านั้นผมไม่ได้ Backup ไว้
แล้วก็แน่นอนแวะไปเยี่ยม MSDN ของ Microsoft และพบหัวข้อ สร้างโปรแกรมที่ดีบน Vista
ก็เลยทำ Links ไว้ก่อนเพราะ เผื่อจะกลับมาอ่านใหม่ตอนที่เวบ MSDN เอาออกจากหน้าแรก
Ref :: Create Quality Application in Windows Vista
ความจริงมาจนถึงวันนี้ผมยังไม่เชิงเข้าใจว่า .net 3.0 หรือ .net fx เดิมนั้นมันสิ่งที่เพิ่มมาจาก .net 2
คืออะไรกันแน่ กำลังหาข้อมูลอยู่เหมือนกัน แต่เห็นว่า Microsoft เตรียมจะจัดสัมมนาแนะนำเทคโนโลยี
ซึ่งจะแนะนำ WinFx ซึ่งอยู่ใน .net3.0 ด้วยผมก็หวังว่าจะได้เห็นคำติชมและวิจารณ์ตามเวบบอร์ด
ระหว่างนี้ก็รอต่อไป ^ ^
ไม่เชื่อก็ต้องเชื่อนะ ว่าปัญหามันอยู่ที่ Windows ทั้งๆที่ผมไม่พบอาการผิดปกติใดๆจากการใช้งานเลย
แต่ windows ที่ลงจากแผ่นนั้นกลับไม่สามารถติดตั้ง VS.net2005 ได้ ( แปลกแต่จริง )
เช้านี้ทันทีที่เข้ามาผมก็เริ่มเก็บ Favorite ของเวบต่างๆใหม่เนื่องจากของเก่านั้นผมไม่ได้ Backup ไว้
แล้วก็แน่นอนแวะไปเยี่ยม MSDN ของ Microsoft และพบหัวข้อ สร้างโปรแกรมที่ดีบน Vista
ก็เลยทำ Links ไว้ก่อนเพราะ เผื่อจะกลับมาอ่านใหม่ตอนที่เวบ MSDN เอาออกจากหน้าแรก
Ref :: Create Quality Application in Windows Vista
ความจริงมาจนถึงวันนี้ผมยังไม่เชิงเข้าใจว่า .net 3.0 หรือ .net fx เดิมนั้นมันสิ่งที่เพิ่มมาจาก .net 2
คืออะไรกันแน่ กำลังหาข้อมูลอยู่เหมือนกัน แต่เห็นว่า Microsoft เตรียมจะจัดสัมมนาแนะนำเทคโนโลยี
ซึ่งจะแนะนำ WinFx ซึ่งอยู่ใน .net3.0 ด้วยผมก็หวังว่าจะได้เห็นคำติชมและวิจารณ์ตามเวบบอร์ด
ระหว่างนี้ก็รอต่อไป ^ ^
Sunday, September 03, 2006
Connection String
Note กันลืมนะครับ
Connection String ของ .net 2 สำหรับเรียกใช้ Oracle DB
ให้ทำการ Load ไลบรารี่ นี้ครับ
using System.Data.OracleClient;
สำหรับ String Connection
แบบอย่างสั้น
"Data Source=SampleDB;Integrated Security=yes;"
แบบมี User และ password
"Data Source=SampleDB;User Id=oradbuser;Password=securepasswd;Integrated Security=no;"
#######################################################################
และสำหรับ ConnectionString ของ DBMS อื่นๆสามารถดูได้จาก
Connection String
Connection String ของ .net 2 สำหรับเรียกใช้ Oracle DB
ให้ทำการ Load ไลบรารี่ นี้ครับ
using System.Data.OracleClient;
สำหรับ String Connection
แบบอย่างสั้น
"Data Source=SampleDB;Integrated Security=yes;"
แบบมี User และ password
"Data Source=SampleDB;User Id=oradbuser;Password=securepasswd;Integrated Security=no;"
#######################################################################
และสำหรับ ConnectionString ของ DBMS อื่นๆสามารถดูได้จาก
Connection String
การเรียกใช้โปรแกรมอื่นจากโปรแกรมเรา
ผมไม่รู้ว่าจะตั้ง Title ยังไงดี . . .
เช่นหากต้องการเขียนโปรแกรมให้ Shutdown เครื่องหรือ Restart เครื่องได้ตามต้องการ
แต่จะต้องรันบน Windows XP นะ ^o^
ถ้าต้องการจะสั่ง Shutdown ทำโดย
System.Diagnostics.Process.Start("shutdown", "/s")
ถ้าจะสั่ง Restart ทำโดย
System.Diagnostics.Process.Start("shutdown", "/r");
ง่ายๆเลยก็เปิด cmd ของ WinXP แล้วก็พิมพ์ shutdown ในช่องจะพบวิธีการใช้คำสั่ง shutdown
แต่สิ่งหนึ่งที่ผมไม่เข้าใจก็คือ ทำไมเราใช้คำสั่ง
using System.Diagnostics;
แล้วทำการประกาศ
Process pc = new Process();
pc.start("shutdown","/s");
แล้วถึงไม่ได้ผล . . . - -''
แต่สั่งตรงๆโดยใช้คำสั่ง
System.Diagnostics.Process.Start("shutdown", "/s");
กลับผ่าน - -'' ไม่เข้าใจ ไม่เข้าใจ ไม่เข้าใจ แต่ช่างมันเถอะครับ ^^
เช่นหากต้องการเขียนโปรแกรมให้ Shutdown เครื่องหรือ Restart เครื่องได้ตามต้องการ
แต่จะต้องรันบน Windows XP นะ ^o^
ถ้าต้องการจะสั่ง Shutdown ทำโดย
System.Diagnostics.Process.Start("shutdown", "/s")
ถ้าจะสั่ง Restart ทำโดย
System.Diagnostics.Process.Start("shutdown", "/r");
ง่ายๆเลยก็เปิด cmd ของ WinXP แล้วก็พิมพ์ shutdown ในช่องจะพบวิธีการใช้คำสั่ง shutdown
แต่สิ่งหนึ่งที่ผมไม่เข้าใจก็คือ ทำไมเราใช้คำสั่ง
using System.Diagnostics;
แล้วทำการประกาศ
Process pc = new Process();
pc.start("shutdown","/s");
แล้วถึงไม่ได้ผล . . . - -''
แต่สั่งตรงๆโดยใช้คำสั่ง
System.Diagnostics.Process.Start("shutdown", "/s");
กลับผ่าน - -'' ไม่เข้าใจ ไม่เข้าใจ ไม่เข้าใจ แต่ช่างมันเถอะครับ ^^
Wednesday, August 30, 2006
ทดลองใช้ user32.dll เพื่อเรียกขนาด Resolution
จากการอ่านบทความเมื่อวานเกี่ยวกับการใช้งาน Win32API บน C# ผมก็ได้ทดลองนำไป
ใช้งานกับการเขียนโปรแกรมใช้งาน Win32API ซึ่ง API ตัวที่ผมเรียกใช้คือ user32.dll
สำหรับ Function ที่ผมเลือกที่จะใช้คือ SystemParameterInfo ซึ่งผมจะใช้ ฟังก์ชัน
นี้ในการเรียกค่า Resolution ของจอภาพมาดูครับว่าปัจจุบัน Desktop ของเราใช้
Resolution ของจอภาพไว้ที่เท่าไร
ด้านล่างจะเป็นการประกาศใน Visual Basic นะครับ ( จาก APIViewer )
Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
สำหรับ Sourcecode ของโปรแกรมนะครับผมแปลงมาใส่ C# จากด้านบนเป็นดังนี้ครับ
แน่นอนครับลืมไม่ได้ถ้าจะใช้ WIN32API ต้องอ้างถึงตัวนี้
using System.Runtime.InteropServices;
จากนั้น
[DllImport("user32.dll",EntryPoint="SystemParametersInfo")]
private static extern int SystemParametersInfo(int uiAction,int uiParam,out rc pvParam,int fWinlni);
สำหรับตัวโปรแกรมผมออกแบบโดยมีฟอร์ม 1 ฟอร์มมี Label ไว้แสดง Resolution
และมีปุ่มกด เพื่อใช้เรียกฟังก์ชันให้ดึงค่า Resolution มาแสดงบน Label ที่กำหนด
ตัวอย่างโค๊ตที่จะทำงานเมื่อมีการกดปุ่มนะครับ
private void button1_Click(object sender, EventArgs e)
{
rc Rect;
int lngResult;
lngResult = SystemParametersInfo(48, 0,out Rect,0);
label1.Text = "";
label1.Text = "("+Rect.Left+")("+Rect.Top+"),("+Rect.Rigth+")("+Rect.Bottom+")";
}
** ข้อสังเกตุ **
จากการประกาศ rc Rect;
ตัวแปร rc ในที่นี้คือ Struct ซึ่งแปลงมาจาก Type ของ Visual Basic ใน APIViewer
CODE ประกาศ Struct ของ C#
struct rc
{
public int Left;
public int Top;
public int Rigth;
public int Bottom;
}
ตัวอย่างการเรียกใช้จาก Visual Basic
เริ่มแรกต้องประกาศใช้ก่อนดังนี้
Declare Function SystemParametersInfo Lib "user32.dll" _
Alias "SystemParametersInfoA"(ByVal uiAction As Long, _
ByVal uiParam As Long,pvParam as Any,ByVal fWinlni As Long) As Long
สำหรับ CODE ในปุ่มก็มีดังนี้ครับ
Private Sub Command1_Click()
Dim udiWorkArea As RECT
Dim lngResult As Long
lngResult = SystemParametersInfo(SPI_GETWORKAREA,0,udiWorkArea,0)
With udiWorkArea
Label1.Caption = "(" & .Right &","& .Bottom &")"
End With
End Sub
** หมายเหตุ 1 **
เมื่อเราเปิดจาก APIViewer ในส่วนของ Constant จะพบว่าตัวแปร RECT มีประเภทเป็น Type
ใน Visual Basic ซึ่งจะเท่ากับ Stuct เราจึงทำการประกาศ Struct ใน CODE C#
** หมายเหตุ 2 **
ในส่วนนี้ของ Visual Basic ( บรรทัดล่าง )
lngResult = SystemParametersInfo(SPI_GETWORKAREA,0,udiWorkArea,0)
จะเห็นว่าต่างจากของ C# คือ
lngResult = SystemParametersInfo(48, 0,out Rect,0);
เนื่องมาจาก SPI_GETWORKAREA ใน Visual Basic ตามเอกสารของ WIN32API ระบุว่า
เป็นตัวแปรแบบค่าคงที่ เท่ากับ 48
และที่ส่วนของ Parameter ที่ส่งมีคำว่า out Rect เนื่องจากในการประกาศใช้ Function
มีการกำหนดให้เป็น out rc เอาไว้ ดัง Code ด้านล่าง
[DllImport("user32.dll",EntryPoint="SystemParametersInfo")]
private static extern int SystemParametersInfo(int uiAction,int uiParam,out rc pvParam,int fWinlni);
จะเห็นว่าในส่วนที่ APIViewer แจ้งว่า Function มี Argument แบบ ByVal หรือ ByRef
เวลาเรานำมาประกาศใน C# เราต้องมี out นำหน้า datatype ตามด้วย ชื่อตัวแปร
** หมายเหตุ 3 **
จะสังเกตุว่า เราใช้ int ในตัวแปรของ C# แทนที่จะประกาศเป็น long เช่นเดียวกับ Visual Basic
นั้นก็เพราะขนาดของข้อมูลของ Visual Basic และ C# ไม่เท่ากัน
จบข่าวครับ . . .
ใช้งานกับการเขียนโปรแกรมใช้งาน Win32API ซึ่ง API ตัวที่ผมเรียกใช้คือ user32.dll
สำหรับ Function ที่ผมเลือกที่จะใช้คือ SystemParameterInfo ซึ่งผมจะใช้ ฟังก์ชัน
นี้ในการเรียกค่า Resolution ของจอภาพมาดูครับว่าปัจจุบัน Desktop ของเราใช้
Resolution ของจอภาพไว้ที่เท่าไร
ด้านล่างจะเป็นการประกาศใน Visual Basic นะครับ ( จาก APIViewer )
Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
สำหรับ Sourcecode ของโปรแกรมนะครับผมแปลงมาใส่ C# จากด้านบนเป็นดังนี้ครับ
แน่นอนครับลืมไม่ได้ถ้าจะใช้ WIN32API ต้องอ้างถึงตัวนี้
using System.Runtime.InteropServices;
จากนั้น
[DllImport("user32.dll",EntryPoint="SystemParametersInfo")]
private static extern int SystemParametersInfo(int uiAction,int uiParam,out rc pvParam,int fWinlni);
สำหรับตัวโปรแกรมผมออกแบบโดยมีฟอร์ม 1 ฟอร์มมี Label ไว้แสดง Resolution
และมีปุ่มกด เพื่อใช้เรียกฟังก์ชันให้ดึงค่า Resolution มาแสดงบน Label ที่กำหนด
ตัวอย่างโค๊ตที่จะทำงานเมื่อมีการกดปุ่มนะครับ
private void button1_Click(object sender, EventArgs e)
{
rc Rect;
int lngResult;
lngResult = SystemParametersInfo(48, 0,out Rect,0);
label1.Text = "";
label1.Text = "("+Rect.Left+")("+Rect.Top+"),("+Rect.Rigth+")("+Rect.Bottom+")";
}
** ข้อสังเกตุ **
จากการประกาศ rc Rect;
ตัวแปร rc ในที่นี้คือ Struct ซึ่งแปลงมาจาก Type ของ Visual Basic ใน APIViewer
CODE ประกาศ Struct ของ C#
struct rc
{
public int Left;
public int Top;
public int Rigth;
public int Bottom;
}
ตัวอย่างการเรียกใช้จาก Visual Basic
เริ่มแรกต้องประกาศใช้ก่อนดังนี้
Declare Function SystemParametersInfo Lib "user32.dll" _
Alias "SystemParametersInfoA"(ByVal uiAction As Long, _
ByVal uiParam As Long,pvParam as Any,ByVal fWinlni As Long) As Long
สำหรับ CODE ในปุ่มก็มีดังนี้ครับ
Private Sub Command1_Click()
Dim udiWorkArea As RECT
Dim lngResult As Long
lngResult = SystemParametersInfo(SPI_GETWORKAREA,0,udiWorkArea,0)
With udiWorkArea
Label1.Caption = "(" & .Right &","& .Bottom &")"
End With
End Sub
** หมายเหตุ 1 **
เมื่อเราเปิดจาก APIViewer ในส่วนของ Constant จะพบว่าตัวแปร RECT มีประเภทเป็น Type
ใน Visual Basic ซึ่งจะเท่ากับ Stuct เราจึงทำการประกาศ Struct ใน CODE C#
** หมายเหตุ 2 **
ในส่วนนี้ของ Visual Basic ( บรรทัดล่าง )
lngResult = SystemParametersInfo(SPI_GETWORKAREA,0,udiWorkArea,0)
จะเห็นว่าต่างจากของ C# คือ
lngResult = SystemParametersInfo(48, 0,out Rect,0);
เนื่องมาจาก SPI_GETWORKAREA ใน Visual Basic ตามเอกสารของ WIN32API ระบุว่า
เป็นตัวแปรแบบค่าคงที่ เท่ากับ 48
และที่ส่วนของ Parameter ที่ส่งมีคำว่า out Rect เนื่องจากในการประกาศใช้ Function
มีการกำหนดให้เป็น out rc เอาไว้ ดัง Code ด้านล่าง
[DllImport("user32.dll",EntryPoint="SystemParametersInfo")]
private static extern int SystemParametersInfo(int uiAction,int uiParam,out rc pvParam,int fWinlni);
จะเห็นว่าในส่วนที่ APIViewer แจ้งว่า Function มี Argument แบบ ByVal หรือ ByRef
เวลาเรานำมาประกาศใน C# เราต้องมี out นำหน้า datatype ตามด้วย ชื่อตัวแปร
** หมายเหตุ 3 **
จะสังเกตุว่า เราใช้ int ในตัวแปรของ C# แทนที่จะประกาศเป็น long เช่นเดียวกับ Visual Basic
นั้นก็เพราะขนาดของข้อมูลของ Visual Basic และ C# ไม่เท่ากัน
จบข่าวครับ . . .
Tuesday, August 29, 2006
การใช้ WIN32API ใน C#
[CODE]
using System;
using System.Runtime.InteropServices;
class win32intro
{
struct SYSTEMTIME {
public short wYear;
public short wMonth;
public short wDayOfWeek;
public short wDay;
public short wHour;
public short wMinute;
public short wSecond;
public short wMilliseconds;
}
[DllImport("kernel32.dll",EntryPoint="GetLocalTime")]
private static extern void GetLocalTime(out SYSTEMTIME lpSystemTime);
static void Main(string[] args)
{
SYSTEMTIME tm;
GetLocalTime(out tm);
Console.WriteLine("{0:0000}/{1:00}/{2:00} {3:00}:{4:00}:{5:00}:{6:0000}",
tm.wYear, tm.wMonth, tm.wDay, tm.wHour, tm.wMinute, tm.wSecond, tm.wMilliseconds);
}
}
[/CODE]
หมายเหตุ
ให้ระวังในการประกาศตัวแปร . . เพราะ WIN32API นั้นจะเทียบกับ Visual Basic
แต่ใน C# ขนาดของตัวแปรไม่เท่ากัน . .
integer ของ Visual Basic มีขนาด 16 bit
integer ของ C# มีขนาด 32 bit
Type ของ Visual Basic คือ Struct ของ C#
ส่วนรายละเอียดอื่นๆ ดูจาก Sourcecode หรืออ่านได้จาก
Reference
Twoguru.com
using System;
using System.Runtime.InteropServices;
class win32intro
{
struct SYSTEMTIME {
public short wYear;
public short wMonth;
public short wDayOfWeek;
public short wDay;
public short wHour;
public short wMinute;
public short wSecond;
public short wMilliseconds;
}
[DllImport("kernel32.dll",EntryPoint="GetLocalTime")]
private static extern void GetLocalTime(out SYSTEMTIME lpSystemTime);
static void Main(string[] args)
{
SYSTEMTIME tm;
GetLocalTime(out tm);
Console.WriteLine("{0:0000}/{1:00}/{2:00} {3:00}:{4:00}:{5:00}:{6:0000}",
tm.wYear, tm.wMonth, tm.wDay, tm.wHour, tm.wMinute, tm.wSecond, tm.wMilliseconds);
}
}
[/CODE]
หมายเหตุ
ให้ระวังในการประกาศตัวแปร . . เพราะ WIN32API นั้นจะเทียบกับ Visual Basic
แต่ใน C# ขนาดของตัวแปรไม่เท่ากัน . .
integer ของ Visual Basic มีขนาด 16 bit
integer ของ C# มีขนาด 32 bit
Type ของ Visual Basic คือ Struct ของ C#
ส่วนรายละเอียดอื่นๆ ดูจาก Sourcecode หรืออ่านได้จาก
Reference
Twoguru.com
Monday, August 28, 2006
เริ่มต้นกับ AJAX จาก W3Schools
ผมคิดอยู่มานานว่าเทคโนโลยีอย่าง AJAX นั้นมันนำไปใช้จริงได้มีประโยชน์ไหมนะ
ความจริงแล้วมันมีอยู่หลายความคิดเห็นเกี่ยวกับเทคโนโลยี AJAX เนื่องจากบางความ
เห็นผู้เชียวชาญหลายท่านก็บอกว่า มันทำลายคุณสมบัติของ Browser
คุณสมบัติของ Browser ที่จะเสียไปหากใช้ AJAX
- ไม่สามารถเซฟหน้าเว็บเก็บได้
- ไม่สามารถทำ Favorite เวบหน้าที่ต้องการได้
แต่ว่ากับบางกรณีนั้นผมก็คิดว่ามันเข้าท่าดีนะ เช่นหน่วยงานที่มีการใช้งาน Intranet
ภายในองค์กร ( เช่นหน่วยงานของผม ) เพราะว่า Intranet มันเร็ว เพราะฉะนั้น
เรื่องเกี่ยวกับ Connection Speed ของ Internet จึงไม่ใช่ปัญหา
มาเริ่มกันเลยดีกว่าครับ ^^
#########################################################
AJAX
AJAX ย่อมาจาก Asynchonous Java and XML เป็นเทคโนโลยีในการแสดงข้อมูล
โดยใช้ JavaScript ร่วมกับ HTML และ XML โดย AJAX ไม่ใช่ภาษาคอมฯ ใหม่
แต่เป็นเพียงเทคนิคใหม่ในการแสดงเนื้อหาได้ รวดเร็ว และตอบสนองการใช้งานได้ดี สำหรับ
Web Application
โดย AJAX จะใช้ JavaScript ในการแลกเปลี่ยนข้อมูลระหว่าง WebServ และ WebBrowser
##########################################################
AJAX เป็นเทคโนโลยีของ Web Browser
AJAX เป็นเทคโนโลยีที่รันบน Web Browser มันใช้การ Transfer ข้อมูลระหว่าง Server และ
Browser แบบ Asynchonous ซึ่งเทคโนโลยีนี้จะทำให้ Internet Application
มีขนาดเล็กและค่อนข้างดีกว่าแบบเก่า
และเราสามารถที่จะพัฒนาได้ทันที โดยไม่ต้องหา Services Server อะไรมาเพิ่ม
##########################################################
สรุปว่าสิ่งที่ควรศึกษา . . .
- HTML
- JavaScript
- CSS
- XML
- ภาษาที่ใช้ในการ Program บนเวบเช่น PHP , ASP , ASP.net , JSP เป็นต้น
###########################################################
ไว้มาแปลใหม่วันหลัง
ความจริงแล้วมันมีอยู่หลายความคิดเห็นเกี่ยวกับเทคโนโลยี AJAX เนื่องจากบางความ
เห็นผู้เชียวชาญหลายท่านก็บอกว่า มันทำลายคุณสมบัติของ Browser
คุณสมบัติของ Browser ที่จะเสียไปหากใช้ AJAX
- ไม่สามารถเซฟหน้าเว็บเก็บได้
- ไม่สามารถทำ Favorite เวบหน้าที่ต้องการได้
แต่ว่ากับบางกรณีนั้นผมก็คิดว่ามันเข้าท่าดีนะ เช่นหน่วยงานที่มีการใช้งาน Intranet
ภายในองค์กร ( เช่นหน่วยงานของผม ) เพราะว่า Intranet มันเร็ว เพราะฉะนั้น
เรื่องเกี่ยวกับ Connection Speed ของ Internet จึงไม่ใช่ปัญหา
มาเริ่มกันเลยดีกว่าครับ ^^
#########################################################
AJAX
AJAX ย่อมาจาก Asynchonous Java and XML เป็นเทคโนโลยีในการแสดงข้อมูล
โดยใช้ JavaScript ร่วมกับ HTML และ XML โดย AJAX ไม่ใช่ภาษาคอมฯ ใหม่
แต่เป็นเพียงเทคนิคใหม่ในการแสดงเนื้อหาได้ รวดเร็ว และตอบสนองการใช้งานได้ดี สำหรับ
Web Application
โดย AJAX จะใช้ JavaScript ในการแลกเปลี่ยนข้อมูลระหว่าง WebServ และ WebBrowser
##########################################################
AJAX เป็นเทคโนโลยีของ Web Browser
AJAX เป็นเทคโนโลยีที่รันบน Web Browser มันใช้การ Transfer ข้อมูลระหว่าง Server และ
Browser แบบ Asynchonous ซึ่งเทคโนโลยีนี้จะทำให้ Internet Application
มีขนาดเล็กและค่อนข้างดีกว่าแบบเก่า
และเราสามารถที่จะพัฒนาได้ทันที โดยไม่ต้องหา Services Server อะไรมาเพิ่ม
##########################################################
สรุปว่าสิ่งที่ควรศึกษา . . .
- HTML
- JavaScript
- CSS
- XML
- ภาษาที่ใช้ในการ Program บนเวบเช่น PHP , ASP , ASP.net , JSP เป็นต้น
###########################################################
ไว้มาแปลใหม่วันหลัง
โปรเจค SnapShot V1.0
เมื่อประมาณต้นเดือนที่ทำงานซื้อกล้อง WebCam มา 1 ตัว เห็นเค้าบอกว่าจะนำมากล้องที่ซื้อ
มาใช้ร่วมกับโปรแกรม mrecord ของบริษัท PS Solution . .
ทีแรกผมก็เข้าใจว่า อ้อ . . ที่ระบุเสปคของกล้องคงเพราะกล้องสามารถใช้กับโปรแกรมได้เลย
แต่เอาเข้าจริงสรุปว่าให้ใช้กล้องถ่ายรูปเป็น JPG , BMP แล้วทำการ Import เข้าฐานข้อมูล
ด้วยการ Browse จากโปรแกรมของ Mrecord
ผมก็เลยไปค้นหาข้อมูลเกี่ยวกับการเขียนโปรแกรมต่อกล้อง Digital บน MS Windows ดู
สรุปว่าก็ไปเจอ WIN32API ที่สามารถนำมาใช้งานได้
เนื่องด้วยผมต้องพัฒนาให้โปรแกรมใช้งานบน Windows 98/ME และเสปคคอมฯ ที่ค่อนข้างต่ำ
จึงทำให้ผมตัดสินใจเลือกใช้ Visual Basic 6.0 มาใช้งานเนื่องจากคงเหมาะกว่าจะใช้ .net
แต่แน่นอนว่าเมื่อมีเวลาผมจะพัฒนาด้วย C#.net แต่ไม่รู้เมื่อไร ..
คอมพิวเตอร์ที่ใช้รันโปรแกรม ( เฉพาะ OS และ Ram )
- MS Windows 98/ME/XP
- RAM 128 MB Share VGA 32MB หรือ 8MB
สำหรับ WIN32API ที่เรานำมาใช้ใน โปรเจคนี้จะมีทั้งหมด 2 ตัวคือ
- user32
- apicap32.dll
ตัวอย่าง CODE ( ส่วนของค่าคงที่ และ การเรียกใช้ DLL )
Const ws_visible = &H10000000
Const ws_child = &H40000000
Const WM_USER = 1024
Const WM_CAP_EDIT_COPY = WM_USER + 30
Const wm_cap_driver_connect = WM_USER + 10
Const wm_cap_set_preview = WM_USER + 50
Const wm_cap_set_overlay = WM_USER + 51
Const WM_CAP_SET_PREVIEWRATE = WM_USER + 52
Const WM_CAP_SEQUENCE = WM_USER + 62
Const WM_CAP_SINGLE_FRAME_OPEN = WM_USER + 70
Const WM_CAP_SINGLE_FRAME_CLOSE = WM_USER + 71
Const WM_CAP_SINGLE_FRAME = WM_USER + 72
Const DRV_USER = &H4000
Const DVM_DIALOG = DRV_USER + 100
Const PREVIEWRATE = 30
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" _
Alias "capCreateCaptureWindowA" (ByVal a As String, _
ByVal b As Long, _
ByVal c As Integer, _
ByVal d As Integer, _
ByVal e As Integer, _
ByVal F As Integer, _
ByVal g As Long, _
ByVal h As Integer) As Long
Dim hwndc As Long
Dim saveflag As Integer
Dim pictureindex As Integer
Dim filter1(-1 To 1, -1 To 1) As Single
Dim filter2(-1 To 1, -1 To 1) As Single
Dim temp As String
ตัวอย่าง CODE ( การบันทึกภาพ )
Dim bRet As Boolean
Dim szTest As String
'szTest = App.Path & "\scCapture.bmp" & Chr$(0)
szTest = App.Path & "\Capture\" + FileName + ".jpg" & Chr$(0)
bRet = SendMessage(hwndc, WM_CAP_EDIT_COPY, 0&, 0&)
If bRet Then
DoEvents
If Clipboard.GetFormat(vbCFBitmap) Then
PicWCam.Picture = Clipboard.GetData(vbCFBitmap)
SavePicture PicWCam.Image, szTest
DoEvents
Clipboard.Clear
End If
End If
ตัวอย่าง CODE ( Form Load )
On Error GoTo handler:
hwndc = capCreateCaptureWindow("CaptureWindow", _
ws_child Or ws_visible, _
0, _
0, _
PicWCam.Width, _
PicWCam.Height, _
PicWCam.hWnd, _
0)
If (hwndc <> 0) Then
temp = SendMessage(hwndc, wm_cap_driver_connect, 0, 0)
temp = SendMessage(hwndc, wm_cap_set_preview, 1, 0)
temp = SendMessage(hwndc, WM_CAP_SET_PREVIEWRATE, PREVIEWRATE, 0)
temp = SendMessage(Me.hWnd, WM_CAP_EDIT_COPY, 1, 0)
PicWCam.Picture = Clipboard.GetData
Else
MsgBox "ไม่สามารถติดต่อกล้องได้", vbCritical
End If
Exit Sub
handler:
End
สิ้นสุดคร๊าบบ . . . นั้นเป็นส่วนประกอบหลักๆในการใช้ Connect ไป WebCam และบันทึกภาพ
( Note กันลืมน่ะครับ )
มาใช้ร่วมกับโปรแกรม mrecord ของบริษัท PS Solution . .
ทีแรกผมก็เข้าใจว่า อ้อ . . ที่ระบุเสปคของกล้องคงเพราะกล้องสามารถใช้กับโปรแกรมได้เลย
แต่เอาเข้าจริงสรุปว่าให้ใช้กล้องถ่ายรูปเป็น JPG , BMP แล้วทำการ Import เข้าฐานข้อมูล
ด้วยการ Browse จากโปรแกรมของ Mrecord
ผมก็เลยไปค้นหาข้อมูลเกี่ยวกับการเขียนโปรแกรมต่อกล้อง Digital บน MS Windows ดู
สรุปว่าก็ไปเจอ WIN32API ที่สามารถนำมาใช้งานได้
เนื่องด้วยผมต้องพัฒนาให้โปรแกรมใช้งานบน Windows 98/ME และเสปคคอมฯ ที่ค่อนข้างต่ำ
จึงทำให้ผมตัดสินใจเลือกใช้ Visual Basic 6.0 มาใช้งานเนื่องจากคงเหมาะกว่าจะใช้ .net
แต่แน่นอนว่าเมื่อมีเวลาผมจะพัฒนาด้วย C#.net แต่ไม่รู้เมื่อไร ..
คอมพิวเตอร์ที่ใช้รันโปรแกรม ( เฉพาะ OS และ Ram )
- MS Windows 98/ME/XP
- RAM 128 MB Share VGA 32MB หรือ 8MB
สำหรับ WIN32API ที่เรานำมาใช้ใน โปรเจคนี้จะมีทั้งหมด 2 ตัวคือ
- user32
- apicap32.dll
ตัวอย่าง CODE ( ส่วนของค่าคงที่ และ การเรียกใช้ DLL )
Const ws_visible = &H10000000
Const ws_child = &H40000000
Const WM_USER = 1024
Const WM_CAP_EDIT_COPY = WM_USER + 30
Const wm_cap_driver_connect = WM_USER + 10
Const wm_cap_set_preview = WM_USER + 50
Const wm_cap_set_overlay = WM_USER + 51
Const WM_CAP_SET_PREVIEWRATE = WM_USER + 52
Const WM_CAP_SEQUENCE = WM_USER + 62
Const WM_CAP_SINGLE_FRAME_OPEN = WM_USER + 70
Const WM_CAP_SINGLE_FRAME_CLOSE = WM_USER + 71
Const WM_CAP_SINGLE_FRAME = WM_USER + 72
Const DRV_USER = &H4000
Const DVM_DIALOG = DRV_USER + 100
Const PREVIEWRATE = 30
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" _
Alias "capCreateCaptureWindowA" (ByVal a As String, _
ByVal b As Long, _
ByVal c As Integer, _
ByVal d As Integer, _
ByVal e As Integer, _
ByVal F As Integer, _
ByVal g As Long, _
ByVal h As Integer) As Long
Dim hwndc As Long
Dim saveflag As Integer
Dim pictureindex As Integer
Dim filter1(-1 To 1, -1 To 1) As Single
Dim filter2(-1 To 1, -1 To 1) As Single
Dim temp As String
ตัวอย่าง CODE ( การบันทึกภาพ )
Dim bRet As Boolean
Dim szTest As String
'szTest = App.Path & "\scCapture.bmp" & Chr$(0)
szTest = App.Path & "\Capture\" + FileName + ".jpg" & Chr$(0)
bRet = SendMessage(hwndc, WM_CAP_EDIT_COPY, 0&, 0&)
If bRet Then
DoEvents
If Clipboard.GetFormat(vbCFBitmap) Then
PicWCam.Picture = Clipboard.GetData(vbCFBitmap)
SavePicture PicWCam.Image, szTest
DoEvents
Clipboard.Clear
End If
End If
ตัวอย่าง CODE ( Form Load )
On Error GoTo handler:
hwndc = capCreateCaptureWindow("CaptureWindow", _
ws_child Or ws_visible, _
0, _
0, _
PicWCam.Width, _
PicWCam.Height, _
PicWCam.hWnd, _
0)
If (hwndc <> 0) Then
temp = SendMessage(hwndc, wm_cap_driver_connect, 0, 0)
temp = SendMessage(hwndc, wm_cap_set_preview, 1, 0)
temp = SendMessage(hwndc, WM_CAP_SET_PREVIEWRATE, PREVIEWRATE, 0)
temp = SendMessage(Me.hWnd, WM_CAP_EDIT_COPY, 1, 0)
PicWCam.Picture = Clipboard.GetData
Else
MsgBox "ไม่สามารถติดต่อกล้องได้", vbCritical
End If
Exit Sub
handler:
End
สิ้นสุดคร๊าบบ . . . นั้นเป็นส่วนประกอบหลักๆในการใช้ Connect ไป WebCam และบันทึกภาพ
( Note กันลืมน่ะครับ )
Store Procedure
Store Procedure :: คือการเขียนโปรแกรมปนกับภาษา SQL ทิ้งไว้สำหรับประมวลผลบน
Database Server เองเลย ซึ่งการทำ Store Procedure จะช่วยเพิ่มความเร็วในการทำงาน
เพราะจะสามารถประมวลผลข้อมูลได้เร็วกว่า
ปกติแล้ว Store Procedure จะมีให้ใช้ในฐานข้อมูลเช่น MS SQL หรือ Oracle โดยจะมีชื่อเรียก
ที่แตกต่างกันออกไป
T/SQL ( Transaction SQL ) สำหรับ MS SQL
PL/SQL สำหรับ Oracle
โดยทั้ง MS SQL และ Oracle นั้นมี Store Procedure ให้ใช้ทั้งคู่ แต่ข้อเสียก็คือ
Store Procedure นั้นแต่ละบริษัทเป็นผู้ออกแบบซึ่งทำให้มันไม่สามารถใช้ร่วมกันได้
กล่าวคือ ต้องศึกษาการทำงานของแต่ละ DBMS ก่อนจะเขียน Store Procedure
แต่สำหรับ MS-SQL 2005 มีการฝัง CLR เข้าไปทำให้เราสามารถเขียนภาษาในกลุ่ม .net
เช่น C# , VB.net ปนกับ SQL เป็น T/SQL ใช้บน MS SQL ได้ ซึ่งช่วยให้ .net Dev
ทำงานกับ Store Procedure ได้ง่ายขึ้น ^^ ดีใจจังเลย
Database Server เองเลย ซึ่งการทำ Store Procedure จะช่วยเพิ่มความเร็วในการทำงาน
เพราะจะสามารถประมวลผลข้อมูลได้เร็วกว่า
ปกติแล้ว Store Procedure จะมีให้ใช้ในฐานข้อมูลเช่น MS SQL หรือ Oracle โดยจะมีชื่อเรียก
ที่แตกต่างกันออกไป
T/SQL ( Transaction SQL ) สำหรับ MS SQL
PL/SQL สำหรับ Oracle
โดยทั้ง MS SQL และ Oracle นั้นมี Store Procedure ให้ใช้ทั้งคู่ แต่ข้อเสียก็คือ
Store Procedure นั้นแต่ละบริษัทเป็นผู้ออกแบบซึ่งทำให้มันไม่สามารถใช้ร่วมกันได้
กล่าวคือ ต้องศึกษาการทำงานของแต่ละ DBMS ก่อนจะเขียน Store Procedure
แต่สำหรับ MS-SQL 2005 มีการฝัง CLR เข้าไปทำให้เราสามารถเขียนภาษาในกลุ่ม .net
เช่น C# , VB.net ปนกับ SQL เป็น T/SQL ใช้บน MS SQL ได้ ซึ่งช่วยให้ .net Dev
ทำงานกับ Store Procedure ได้ง่ายขึ้น ^^ ดีใจจังเลย
Tuesday, August 15, 2006
PHP สำหรับ .net
วันนี้อ่าน Blog ใน Thaidev.org แล้วเผอิญไปเห็นว่าในเวบของ CodePlex
บอกว่ามีโปรเจคนึงที่จะทำให้เราสามารถใช้ PHP ได้ใน .net Framework
Ref :: PHP For .net Framework
บอกว่ามีโปรเจคนึงที่จะทำให้เราสามารถใช้ PHP ได้ใน .net Framework
Ref :: PHP For .net Framework
Saturday, August 12, 2006
การ Set Java ClassPath
วันนี้เจอปัญหาใหม่ๆ . . . เกี่ยวกับ Java ClassPath เลยได้คำตอบมาจาก Narisa แต่แปลกดีนะ
บางเครื่องต้องทำ บางเครื่องไม่ต้องทำ . . . . Sun ทำไมไม่ออกแบบให้มันติดตั้งง่ายกว่านี้นะ ไม่เข้าใจ
จริงๆ
การ Set Classpath ของ Java
บางเครื่องต้องทำ บางเครื่องไม่ต้องทำ . . . . Sun ทำไมไม่ออกแบบให้มันติดตั้งง่ายกว่านี้นะ ไม่เข้าใจ
จริงๆ
การ Set Classpath ของ Java
Friday, August 11, 2006
Embled Windows Media Player in HTML
ตัวอย่างการฝัง Windows Media Player เข้าไปในเวบ เพื่อใช้สำหรับทำวิทยุออนไลน์
หรือฟังเพลงออนไลน์ ^-^
Refer :
http://www.mioplanet.com/rsc/embed_mediaplayer.htm
หรือฟังเพลงออนไลน์ ^-^
Refer :
http://www.mioplanet.com/rsc/embed_mediaplayer.htm
ช่วงนี้เห็นมีคนที่ใช้ Windows แบบ Pantip License อยู่ แล้วดันทะลึ่งไป Update : Windows Genuine Advantage
คราวนี้ . . . ก็ติดไอ่ตัวเตือนว่า ใช้ Windows เถื่อน - -''
ความจริงวิธีนี้ของ Microsoft ก็ทำให้ผู้ใช้หลายๆคนได้รู้ว่า . . ตัวพวกเขากำลังใช้ Software เถื่อนอยู่ . . .
สำหรับวิธีแก้ ให้ทำดังต่อไปนี้
HKEY_LOCAL_MACHINE -> SOFTWARE -> MICROSOFT -> ..
WindowsNT -> CurrentVersion -> WinLogon -> Notify
พอถึงตรงนี้ให้ลองหา . . Folder ชื่อ wgalogon
แล้วลบมันทิ้งไปซะ - -''
คราวนี้ก็ไปปิด Auto Update ให้เป็น Disable ซะแล้วก็ลบ system restore ด้วยล่ะ
เรียบร้อยแล้ว ^^
คราวนี้ . . . ก็ติดไอ่ตัวเตือนว่า ใช้ Windows เถื่อน - -''
ความจริงวิธีนี้ของ Microsoft ก็ทำให้ผู้ใช้หลายๆคนได้รู้ว่า . . ตัวพวกเขากำลังใช้ Software เถื่อนอยู่ . . .
สำหรับวิธีแก้ ให้ทำดังต่อไปนี้
HKEY_LOCAL_MACHINE -> SOFTWARE -> MICROSOFT -> ..
WindowsNT -> CurrentVersion -> WinLogon -> Notify
พอถึงตรงนี้ให้ลองหา . . Folder ชื่อ wgalogon
แล้วลบมันทิ้งไปซะ - -''
คราวนี้ก็ไปปิด Auto Update ให้เป็น Disable ซะแล้วก็ลบ system restore ด้วยล่ะ
เรียบร้อยแล้ว ^^
Friday, July 28, 2006
C# Connect To SQLite3
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SQLite;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace TestSQLite
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public string ConStr = "Data Source=Stamp;Version=3;Compress=YES";
private void Form1_Load(object sender, EventArgs e)
{
//string SET = "INSERT INTO TbStamp VALUES('455320117','เอกชัย ทุมจินดา')";
string GET = "SELECT * FROM TbStamp";
SQLiteConnection Conn = new SQLiteConnection(ConStr);
Conn.Open();
//SQLiteCommand sqlCom = new SQLiteCommand(SET, Conn);
//sqlCom.ExecuteNonQuery();
SQLiteCommand Command = new SQLiteCommand(GET, Conn);
SQLiteDataReader dbRead = Command.ExecuteReader();
while (dbRead.Read())
{
MessageBox.Show(dbRead["sid"].ToString(), "คำเตือน");
MessageBox.Show(dbRead["name"].ToString(), "คำเตือน");
}
}
}
}
จากตัวอย่างด้านบนเป็น SourceCode การใช้ C# เชื่อมต่อกับฐานข้อมูลที่สร้างโดย SQLite รุ่น 3
** Note กันลืมครับ ^-^
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SQLite;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace TestSQLite
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public string ConStr = "Data Source=Stamp;Version=3;Compress=YES";
private void Form1_Load(object sender, EventArgs e)
{
//string SET = "INSERT INTO TbStamp VALUES('455320117','เอกชัย ทุมจินดา')";
string GET = "SELECT * FROM TbStamp";
SQLiteConnection Conn = new SQLiteConnection(ConStr);
Conn.Open();
//SQLiteCommand sqlCom = new SQLiteCommand(SET, Conn);
//sqlCom.ExecuteNonQuery();
SQLiteCommand Command = new SQLiteCommand(GET, Conn);
SQLiteDataReader dbRead = Command.ExecuteReader();
while (dbRead.Read())
{
MessageBox.Show(dbRead["sid"].ToString(), "คำเตือน");
MessageBox.Show(dbRead["name"].ToString(), "คำเตือน");
}
}
}
}
จากตัวอย่างด้านบนเป็น SourceCode การใช้ C# เชื่อมต่อกับฐานข้อมูลที่สร้างโดย SQLite รุ่น 3
** Note กันลืมครับ ^-^
Thursday, July 13, 2006
ปณิธานใหม่ๆ
ต่อจากนี้จะไม่มาทำงานสาย หรือถ้าจะต้องสายก็ให้มันจำเป็นต้องสายจริงๆ
แล้วก็จะพยายามพัฒนาความสามารถตัวเอง ให้มีมากขึ้นเรื่อยๆ . . . . .
วันนี้โหลด EBook มาใหม่จากเวบไซต์ความจริงแล้วเราเองก็มี EBook อยู่เยอะ
แต่ไม่ค่อยได้อ่านจนครบส่วนมากจะอ่านเป็นเพียงบางหัวข้อเท่านั้น
วันนี้เช้าเลยปริ้นท์ E-Book ของ Java Webservices มาอ่านเอากันตั้งแต่บทแรก
แต่ไม่รู้จะจบเมื่อไร . . .
ช่วงนี้ความสนใจด้านกรรมวิธีการออกแบบระบบคอมฯ และ ระบบฐานข้อมูล รวมถึง
วิธีการสร้างเวบแบบ AJAX ก็เป็นหัวข้อที่สนใจ
ยังไงซะก่อนจะกลางปีหน้าก็ควรจะรู้ตัวเองได้แล้วว่าชอบงานด้านไหนกันแน่ ^^
แล้วก็จะพยายามพัฒนาความสามารถตัวเอง ให้มีมากขึ้นเรื่อยๆ . . . . .
วันนี้โหลด EBook มาใหม่จากเวบไซต์ความจริงแล้วเราเองก็มี EBook อยู่เยอะ
แต่ไม่ค่อยได้อ่านจนครบส่วนมากจะอ่านเป็นเพียงบางหัวข้อเท่านั้น
วันนี้เช้าเลยปริ้นท์ E-Book ของ Java Webservices มาอ่านเอากันตั้งแต่บทแรก
แต่ไม่รู้จะจบเมื่อไร . . .
ช่วงนี้ความสนใจด้านกรรมวิธีการออกแบบระบบคอมฯ และ ระบบฐานข้อมูล รวมถึง
วิธีการสร้างเวบแบบ AJAX ก็เป็นหัวข้อที่สนใจ
ยังไงซะก่อนจะกลางปีหน้าก็ควรจะรู้ตัวเองได้แล้วว่าชอบงานด้านไหนกันแน่ ^^
Tuesday, July 04, 2006
วิธีสร้าง Logo ของเราใน System Info
วันนี้ผมได้เจอวิธีการสร้าง Logo ของเราเองใส่ไว้ใน System Info โดยวิธีการนี้
ผมได้ทดลองใน MS Windows XP แล้วก็ได้ผลครับ
วิธีการสร้างมีดังนี้ครับ
เราต้องสร้าง File ขึ้นมา 2 File โดยตั้งชื่อดังนี้
- OEMINFO.INI = เป็น file สำหรับใส่ข้อมูลต่างๆเกี่ยวกับคอมพิวเตอร์
- OEMLOGO.BMP = เป็นรูปภาพที่จะใช้แสดง
[ OEMLOGO.BMP ]
จะต้องมีขนาด 170 * 110 โดยประมาณ และมีนามสกุลเป็น .BMP และต้องเก็บแบ 256 สี
[ OEMINFO.INI ]
[General]
Manufacturer= Fazz Inc. Super Computer Design
Model= 5520
[Support Information]
Line1="For technical Support Contact: John Barnett
Line2="Telephone: xxxxx.xxxxxx"
จะต้องมีข้อมูลดังด้านบน ( รายละเอียดให้หาดูใน Google ต่อไป )
#####################################
อีกวิธีที่เจอคือการสร้าง account ไม่ให้ผู้ใช้ทั่วไปทราบ ทำได้โดย add user
ผ่านคำสั่ง control userpasswords2
แต่เงื่อนไขคือ เราคงต้องเปลี่ยนวิธีการ Login เป็นการเอา Welcome Screen
ออกแล้ว Login แบบ Secure mode แทนครับ ^^
ผมได้ทดลองใน MS Windows XP แล้วก็ได้ผลครับ
วิธีการสร้างมีดังนี้ครับ
เราต้องสร้าง File ขึ้นมา 2 File โดยตั้งชื่อดังนี้
- OEMINFO.INI = เป็น file สำหรับใส่ข้อมูลต่างๆเกี่ยวกับคอมพิวเตอร์
- OEMLOGO.BMP = เป็นรูปภาพที่จะใช้แสดง
[ OEMLOGO.BMP ]
จะต้องมีขนาด 170 * 110 โดยประมาณ และมีนามสกุลเป็น .BMP และต้องเก็บแบ 256 สี
[ OEMINFO.INI ]
[General]
Manufacturer= Fazz Inc. Super Computer Design
Model= 5520
[Support Information]
Line1="For technical Support Contact: John Barnett
Line2="Telephone: xxxxx.xxxxxx"
จะต้องมีข้อมูลดังด้านบน ( รายละเอียดให้หาดูใน Google ต่อไป )
#####################################
อีกวิธีที่เจอคือการสร้าง account ไม่ให้ผู้ใช้ทั่วไปทราบ ทำได้โดย add user
ผ่านคำสั่ง control userpasswords2
แต่เงื่อนไขคือ เราคงต้องเปลี่ยนวิธีการ Login เป็นการเอา Welcome Screen
ออกแล้ว Login แบบ Secure mode แทนครับ ^^
Thursday, June 29, 2006
วันแห่งการตัดสินใจ
จั่วหัวไว้แบบนี้ จริงๆก็ไม่ได้ตัดสินใจอะไรที่มันสำคัญหรอก . . . เพียงแต่เริ่มมาคิดว่าคงถึงเวลาสักทีสินะ
ที่จะเลือกภาษาคอมพิวเตอร์ ที่เราถนัดในแต่ละด้านจริงๆสักที เอาแบบที่น่าจะเหมาะสมที่สุด
ตอนนี้ตัวเลือกที่เหลือหลังจากตัดนู่น ตัดนี่ทิ้งไปหลายอันแล้วก็เหลือดังนี้
ภาษาที่จะใช้สำหรับ Web App
- JSP ก็เพราะรันได้ทุก Platform และยังมี class จาก Java ให้ใช้ด้วย
- PHP ก็เพราะมันฟรี และก็คล้ายๆกับ C ซึ่งจริงๆแล้ว PHP นี่ก็พอเขียนได้อยู่แล้ว
ภาษาที่จะใช้สำหรับ Win App
- Cpp มันทำงานเร็วดี และก็คุมทุกอย่างได้ดี แต่จริงๆแล้ว ก็ไม่ค่อยถนัดนักเพราะส่วนตัวคิดว่าเขียนยากจัง
และถ้าหากต้องการให้ cross platform ต้องใช้ widgets แต่ถ้า MFC คงง่ายกว่าแต่ก็แพงอีก
- Java รันได้ทุก Platform และก็มี IDE ฟรีๆ ดีๆ อย่าง netbean และ eclipse แถมด้วย report ฟรีๆ
- VB ก็เพราะมันโคตรจะ productivity เลยอ่ะนะ . . . ใช้เขียนโปรแกรมได้เร็วมากๆ ถึงจะไม่ถนัดแต่ไม่ยาก
ถ้าคิดจะไปศึกษา แต่ก็อีกมันเสียเงินค่อนข้างแพง - -''
- C# อันนี้ก็ดีนะ Compatible กับเครื่องที่รัน ได้ดีกับ Windows เขียนเป็นที่สุดในสี่ตัว .. ก็เรียนจบมาด้วย C#
ถ้าจะใช้ฟรีก็มี IDE อย่าง VC# ในรุ่น Express Edition ให้ใช้ แต่มันไม่มี Report นี่ดิ๊
ระบบบฐานข้อมูล
- Access ใช้บ่อยมันง่ายดี ( แต่เสียเงิน แพงอีกแหละ )
- mysql ฟรีแวร์ดีดี ซึ่งไม่ค่อยมั่นใจว่าถ้าใช้ทำ commercial software จะต้องจ่ายเงินให้หรือเปล่า
แต่คิดว่าไม่น่าจะต้องเสียเงินนะ . .. และก็ได้ทุก platform
- oracle 10g ฟรีแวร์ ( รุ่น express edition ) ยังไม่ได้ใช้เลยจะหัดใช้อยู่ ได้ทุก platform ด้วย
- ms sql express edition แจกฟรีจาก MS เหมือนกัน เค้าว่าดี เสียตรงอยู่แค่ตรง windows
สรุป
ความจริงที่เลือกไว้ก็คือสิ่งที่คิดว่าจะศึกษาแหละนะ แต่ก็อีกนั่นแหละ . . . มันก็ยังขึ้นกับอีกหลายๆอย่าง
ความจริงตอนทำงานที่ทำงานก็ต้องเลือกสิ่งที่จำเป็นต้องเลือก เวลาส่งงานลูกค้าก็ตามใจผู้จ้าง
แต่สิ่งที่เราเลือกจะนำไปใช้จริงๆก็แค่ตอนที่จะทำงานเก็บไว้ขาย ซึ่งก็คงจะเหมาะสมกว่าถ้าเลือกใช้ของที่
เป็นฟรีแวร์มาผลิต เพราะเวลาขายเราจะได้ไม่ต้องไปจ่ายค่าลิขสิทธเครื่องมือพัฒนา . . .
แล้วเอาไว้พอเอาไปหากินได้เยอะๆ ก็ค่อย Donate ผ่านไปก็ได้ มั้ง . . . .
ที่จะเลือกภาษาคอมพิวเตอร์ ที่เราถนัดในแต่ละด้านจริงๆสักที เอาแบบที่น่าจะเหมาะสมที่สุด
ตอนนี้ตัวเลือกที่เหลือหลังจากตัดนู่น ตัดนี่ทิ้งไปหลายอันแล้วก็เหลือดังนี้
ภาษาที่จะใช้สำหรับ Web App
- JSP ก็เพราะรันได้ทุก Platform และยังมี class จาก Java ให้ใช้ด้วย
- PHP ก็เพราะมันฟรี และก็คล้ายๆกับ C ซึ่งจริงๆแล้ว PHP นี่ก็พอเขียนได้อยู่แล้ว
ภาษาที่จะใช้สำหรับ Win App
- Cpp มันทำงานเร็วดี และก็คุมทุกอย่างได้ดี แต่จริงๆแล้ว ก็ไม่ค่อยถนัดนักเพราะส่วนตัวคิดว่าเขียนยากจัง
และถ้าหากต้องการให้ cross platform ต้องใช้ widgets แต่ถ้า MFC คงง่ายกว่าแต่ก็แพงอีก
- Java รันได้ทุก Platform และก็มี IDE ฟรีๆ ดีๆ อย่าง netbean และ eclipse แถมด้วย report ฟรีๆ
- VB ก็เพราะมันโคตรจะ productivity เลยอ่ะนะ . . . ใช้เขียนโปรแกรมได้เร็วมากๆ ถึงจะไม่ถนัดแต่ไม่ยาก
ถ้าคิดจะไปศึกษา แต่ก็อีกมันเสียเงินค่อนข้างแพง - -''
- C# อันนี้ก็ดีนะ Compatible กับเครื่องที่รัน ได้ดีกับ Windows เขียนเป็นที่สุดในสี่ตัว .. ก็เรียนจบมาด้วย C#
ถ้าจะใช้ฟรีก็มี IDE อย่าง VC# ในรุ่น Express Edition ให้ใช้ แต่มันไม่มี Report นี่ดิ๊
ระบบบฐานข้อมูล
- Access ใช้บ่อยมันง่ายดี ( แต่เสียเงิน แพงอีกแหละ )
- mysql ฟรีแวร์ดีดี ซึ่งไม่ค่อยมั่นใจว่าถ้าใช้ทำ commercial software จะต้องจ่ายเงินให้หรือเปล่า
แต่คิดว่าไม่น่าจะต้องเสียเงินนะ . .. และก็ได้ทุก platform
- oracle 10g ฟรีแวร์ ( รุ่น express edition ) ยังไม่ได้ใช้เลยจะหัดใช้อยู่ ได้ทุก platform ด้วย
- ms sql express edition แจกฟรีจาก MS เหมือนกัน เค้าว่าดี เสียตรงอยู่แค่ตรง windows
สรุป
ความจริงที่เลือกไว้ก็คือสิ่งที่คิดว่าจะศึกษาแหละนะ แต่ก็อีกนั่นแหละ . . . มันก็ยังขึ้นกับอีกหลายๆอย่าง
ความจริงตอนทำงานที่ทำงานก็ต้องเลือกสิ่งที่จำเป็นต้องเลือก เวลาส่งงานลูกค้าก็ตามใจผู้จ้าง
แต่สิ่งที่เราเลือกจะนำไปใช้จริงๆก็แค่ตอนที่จะทำงานเก็บไว้ขาย ซึ่งก็คงจะเหมาะสมกว่าถ้าเลือกใช้ของที่
เป็นฟรีแวร์มาผลิต เพราะเวลาขายเราจะได้ไม่ต้องไปจ่ายค่าลิขสิทธเครื่องมือพัฒนา . . .
แล้วเอาไว้พอเอาไปหากินได้เยอะๆ ก็ค่อย Donate ผ่านไปก็ได้ มั้ง . . . .
Wednesday, June 28, 2006
Exthreme Programming
ตอนนี้ผมก็งดรับงานนอกทุกอย่าง ทำแต่งานที่ได้รับมอบหมายมาในแผนก . . รูปแบบงานทั่วไปคือตัวเนื้องานถือว่าไม่ยาก
แต่ว่าก็มีปัญหาตรงผู้ใช้ ให้ข้อมูลได้ไม่ถูกต้องเหมือนบางที ก็รู้สึกว่าจริงๆแล้วเค้าก็ไม่รู้ว่าเค้ากำลังทำอะไรอยู่กันแน่
ตอนนี้เป็นช่วงที่ผมรู้สึกว่าอยากจะหยุดพักโดยทำงานเช้ากลับบ้านเย็น แล้วใช้ชีวิตของเรา ให้เหมือนเป็นชีวิตของเรา
โดยไม่ต้องขวนขวายพยายามหาเงิน เหมือนที่เคยคิดไว้ก่อนหน้านี้
มันอาจจะไม่ดีนักที่ผมมาคิดตอนนี้เพราะผมเองก็ตัดสินใจทิ้งงานที่รับมาสองงาน เพื่อความต้องการส่วนตัวของผมตรงนี้
แต่ผมจะถือว่า นี่ คือการยอมเสีย เพื่อจะเริ่มต้นใหม่อีกครั้งในแบบที่ดีกว่าเดิม มีจุดยืนมากกว่าเก่า
ขอเวลาถึงสิ้นเดือน ตุลาคม . . .
#########################################################
เมื่อสมัยเรียน เคยนึกสงสัยตอนวิชา System Analyst ว่าทำไมนะ WaterFall Model ที่เค้าสอนเรามันดูแล้วรู้สึกว่า
เหมือน infinity loop ชอบกล วันนึงเคยไปอ่านเจอในกระทู้ว่า วันส่งโปรแกรม คือ จุดเริ่มต้นสำหรับผู้ใช้
มันก็จริง . . . คิดแล้วมันอ่อนใจ ผมก็คิดแล้วคิดอีกด้วยตัวผมเองพยายามจะให้การวิเคราะห์และออกแบบระบบของตัวเองมี Pattern
เป็นของตัวเราเอง . . . แต่แล้วจนมาวันนึงได้มีโอกาสอ่านบทความเกี่ยวกับ Exthreme Programming ก็เกิดติดใจขึ้นมาเลย
ว่านี่ น่าจะเป็นวิธีที่ทำให้ ผู้ใช้ และ โปรแกรมเมอร์ มีวันจบโปรเจค วันเดียวกัน และ ให้ผู้ใช้บอกความต้องการตัวเองออกมาได้ก่อนโปรเจค
จะเสร็จแล้วส่งมอบ แต่หลังจากอ่านเงื่อนไขหลายๆอย่างแล้วผมก็คิดว่า มันคงเอามาใช้ได้ไม่หมดหรอก สุดท้ายไม่ว่าจะเป็นทฤษฏีใดๆ
เราก็คงจะต้องเลือกใช้ และ เลือกมองข้าม ตามความเหมาะสมอยู่ดี
แต่ว่าก็มีปัญหาตรงผู้ใช้ ให้ข้อมูลได้ไม่ถูกต้องเหมือนบางที ก็รู้สึกว่าจริงๆแล้วเค้าก็ไม่รู้ว่าเค้ากำลังทำอะไรอยู่กันแน่
ตอนนี้เป็นช่วงที่ผมรู้สึกว่าอยากจะหยุดพักโดยทำงานเช้ากลับบ้านเย็น แล้วใช้ชีวิตของเรา ให้เหมือนเป็นชีวิตของเรา
โดยไม่ต้องขวนขวายพยายามหาเงิน เหมือนที่เคยคิดไว้ก่อนหน้านี้
มันอาจจะไม่ดีนักที่ผมมาคิดตอนนี้เพราะผมเองก็ตัดสินใจทิ้งงานที่รับมาสองงาน เพื่อความต้องการส่วนตัวของผมตรงนี้
แต่ผมจะถือว่า นี่ คือการยอมเสีย เพื่อจะเริ่มต้นใหม่อีกครั้งในแบบที่ดีกว่าเดิม มีจุดยืนมากกว่าเก่า
ขอเวลาถึงสิ้นเดือน ตุลาคม . . .
#########################################################
เมื่อสมัยเรียน เคยนึกสงสัยตอนวิชา System Analyst ว่าทำไมนะ WaterFall Model ที่เค้าสอนเรามันดูแล้วรู้สึกว่า
เหมือน infinity loop ชอบกล วันนึงเคยไปอ่านเจอในกระทู้ว่า วันส่งโปรแกรม คือ จุดเริ่มต้นสำหรับผู้ใช้
มันก็จริง . . . คิดแล้วมันอ่อนใจ ผมก็คิดแล้วคิดอีกด้วยตัวผมเองพยายามจะให้การวิเคราะห์และออกแบบระบบของตัวเองมี Pattern
เป็นของตัวเราเอง . . . แต่แล้วจนมาวันนึงได้มีโอกาสอ่านบทความเกี่ยวกับ Exthreme Programming ก็เกิดติดใจขึ้นมาเลย
ว่านี่ น่าจะเป็นวิธีที่ทำให้ ผู้ใช้ และ โปรแกรมเมอร์ มีวันจบโปรเจค วันเดียวกัน และ ให้ผู้ใช้บอกความต้องการตัวเองออกมาได้ก่อนโปรเจค
จะเสร็จแล้วส่งมอบ แต่หลังจากอ่านเงื่อนไขหลายๆอย่างแล้วผมก็คิดว่า มันคงเอามาใช้ได้ไม่หมดหรอก สุดท้ายไม่ว่าจะเป็นทฤษฏีใดๆ
เราก็คงจะต้องเลือกใช้ และ เลือกมองข้าม ตามความเหมาะสมอยู่ดี
Friday, May 19, 2006
FreeBSD 6.0 เป็นคำตอบสุดท้าย
หลังจากที่ Blog ก่อนพล่ามเรื่อง Linux ไปนาน . . . . สุดท้ายก็ตัดสินใจเลือก OS
ที่จะนำมาทำเป็น Server ได้ละ นั่นก็คือ FreeBSD 6.0 น่ะเอง . .
แบบว่าชอบเป็นการส่วนตัวเนื่องจาก Mascot ที่น่ารักมากๆเลย . . . และแหล่งข้อมูล
รวมถึงความขึ้นชื่อด้านความเสถียร และที่สำคัญเป็น Unix และ Free
ตอนนี้กำลังอยู่ในช่วงการติดตั้ง Services พอทำเสร็จหมดแล้วจะมาเขียนอีกที
ที่จะนำมาทำเป็น Server ได้ละ นั่นก็คือ FreeBSD 6.0 น่ะเอง . .
แบบว่าชอบเป็นการส่วนตัวเนื่องจาก Mascot ที่น่ารักมากๆเลย . . . และแหล่งข้อมูล
รวมถึงความขึ้นชื่อด้านความเสถียร และที่สำคัญเป็น Unix และ Free
ตอนนี้กำลังอยู่ในช่วงการติดตั้ง Services พอทำเสร็จหมดแล้วจะมาเขียนอีกที
Wednesday, May 17, 2006
Roadmap ประจำปี 2006
วันนี้ช่วงบ่าย เกิด Idea ขึ้นมาจากคำถามในเวบ http://www.ubuntuclub.com/ ว่า
"คุณจะทำอะไรเพื่อ Opensource ได้บ้าง" ในฐานะที่ตัวเราเองก็เป็นคนในสาย IT ที่ก็ใช้ประโยชน์
จาก Opensource Project อยู่เหมือนกัน เลยคิดว่า "นั่นสิ . . . จะทำอะไรดีนะ"
แต่ก็นั่นแหละ ด้วยที่ตัวเองก็ไม่ได้สันทัดและแม่นยำในภาษาอังกฤษในระดับดี ( ก็แค่พอใช้ )
และก็ไม่ได้เก่งด้านระบบปฏิบัติการทางฝั่ง Opensource สักเท่าไหร่ . . . เพราะสายงาน
ปกติเป็นการพัฒนาโปรแกรม ซึ่งก็จะใช้พวก IDE อย่างเช่น Visual Studio.net และ
Visual Studio 6 เพื่อพัฒนาใช้ในองค์กร . . . ทำให้ไม่มีโอกาสและไม่สบโอกาสที่จะ
หันมาใช้ Product ของทางฝั่ง Opensource อย่างจริงๆจัง ถึงจะสนใจอยู่ก็ตาม
แต่ก็นั่นแหละ เงื่อนไขต่างๆ นาๆ ที่เป็นข้ออ้างในการที่จะเลือกละเมิดทรัพย์สินทางปัญญาของผู้อื่น
ผมเองก็ตัดสินใจแล้วว่าจะเลิกใช้ซอฟต์แวร์ผิดกฏหมายเสียที แต่คราวนี้ก็คงจะต้องใช้ระยะเวลาสัก
ระยะหนึ่ง ในการศึกษาหาความรู้ต่อไป . .
โปรแกรมของทางกลุ่ม Opensource ที่มีแจกจ่ายให้ใช้ในปัจจุบันมีหลายประเภท ทั้ง OS , Utility , Graphic , Dev tool
etc.. ตัวอย่างของโปรเจคที่ผมให้ความสนใจมีดังนี้
- ระบบปฏิบัติการ
FreeBSD 6.0 ผมคิดว่าเหมาะสำหรับทำ Server มากกว่า Desktop
kubuntu 5.10 เป็น OS ที่ออกมาเพื่อเน้นการใช้งานระดับ Desktop แต่ทำเป็น Server ก็ได้
Fedora Core 5 เป็น Linux ของฝั่ง Redhat ที่ออกมาให้ใช้ฟรีๆ . . ที่สนใจเพราะเห็น Docs ที่เป็นไทยเยอะ
- โปรแกรมสำหรับพัฒนาโปรแกรม ( IDE )
Netbeans 5.x ( สำหรับพัฒนาโปรแกรมด้วยภาษา Java จากทาง Sun ) น่าสนใจครับแต่ใช้ไม่เป็น ...
Eclipse ใช้พัฒนาโปรแกรมด้วยภาษา Java และยังมี mod อีกมากมายให้ใช้
- โปรแกรมชุดสำนักงาน
OpenOffice 2 ก็คล้ายๆกับ Ms Office แต่ดูจะไม่สามารถแทนที่ได้หรอก แค่พอใช้ทดแทนกันได้ในบางจุด
ด้วยทรัพยากรที่ผมพอจะมีในปัจจุบันนี้ คือ ผมมี Domainname ที่จดไว้แต่ไม่ได้ใช้ประโยชน์ และ มี Hosting ที่เช่าไว้พร้อมจดโดเมน
และยังไม่ได้ใช้ประโยชน์ใดๆ ทำให้ผมตัดสินใจแล้วว่าจะทำ Opensource community สักอันนึง ซึ่งคงไม่หวังจะดังแต่น่าจะนำมาใช้ทำเป็น
ฐานข้อมูลความรู้จากการทดลอง ในระดับมือใหม่ อย่างที่ผมกำลังจะหัดใช้งานอยู่ และทำเป็น Article เก็บไว้เผื่อจะมีประโยชน์ ต่อตัวผมเองและผู้ที่คิด
จะหันมาใช้งาน Opensource Product อย่างจริงๆจังๆ
รวมไปถึงผมคิดจะพัฒนาโปรแกรมเล็กๆ ง่ายๆ แจกให้ผู้ใช้ได้ใช้ ทั้งแบบที่ใช้บริการผ่านเวบ และ ดาวโหลดไปใช้ในเครื่องคอมพิวเตอร์ . . . แต่ก็คง
จะต้องดูกันต่อไปว่า จะไปได้ถึงไหนกัน . . .
ท้ายที่สุด ผมคงต้องไปศึกษาข้อมูลเกี่ยวกับ Linux และ Application ต่างๆบน Linux เพื่อใช้งาน . . และบันทึกสิ่งที่เรียนรู้จากมันมาลงเวบ
ขอให้ผมทำสำเร็จด้วยเถอะ . . . กลัวแพ้ใจตัวเองจริงๆ
"คุณจะทำอะไรเพื่อ Opensource ได้บ้าง" ในฐานะที่ตัวเราเองก็เป็นคนในสาย IT ที่ก็ใช้ประโยชน์
จาก Opensource Project อยู่เหมือนกัน เลยคิดว่า "นั่นสิ . . . จะทำอะไรดีนะ"
แต่ก็นั่นแหละ ด้วยที่ตัวเองก็ไม่ได้สันทัดและแม่นยำในภาษาอังกฤษในระดับดี ( ก็แค่พอใช้ )
และก็ไม่ได้เก่งด้านระบบปฏิบัติการทางฝั่ง Opensource สักเท่าไหร่ . . . เพราะสายงาน
ปกติเป็นการพัฒนาโปรแกรม ซึ่งก็จะใช้พวก IDE อย่างเช่น Visual Studio.net และ
Visual Studio 6 เพื่อพัฒนาใช้ในองค์กร . . . ทำให้ไม่มีโอกาสและไม่สบโอกาสที่จะ
หันมาใช้ Product ของทางฝั่ง Opensource อย่างจริงๆจัง ถึงจะสนใจอยู่ก็ตาม
แต่ก็นั่นแหละ เงื่อนไขต่างๆ นาๆ ที่เป็นข้ออ้างในการที่จะเลือกละเมิดทรัพย์สินทางปัญญาของผู้อื่น
ผมเองก็ตัดสินใจแล้วว่าจะเลิกใช้ซอฟต์แวร์ผิดกฏหมายเสียที แต่คราวนี้ก็คงจะต้องใช้ระยะเวลาสัก
ระยะหนึ่ง ในการศึกษาหาความรู้ต่อไป . .
โปรแกรมของทางกลุ่ม Opensource ที่มีแจกจ่ายให้ใช้ในปัจจุบันมีหลายประเภท ทั้ง OS , Utility , Graphic , Dev tool
etc.. ตัวอย่างของโปรเจคที่ผมให้ความสนใจมีดังนี้
- ระบบปฏิบัติการ
FreeBSD 6.0 ผมคิดว่าเหมาะสำหรับทำ Server มากกว่า Desktop
kubuntu 5.10 เป็น OS ที่ออกมาเพื่อเน้นการใช้งานระดับ Desktop แต่ทำเป็น Server ก็ได้
Fedora Core 5 เป็น Linux ของฝั่ง Redhat ที่ออกมาให้ใช้ฟรีๆ . . ที่สนใจเพราะเห็น Docs ที่เป็นไทยเยอะ
- โปรแกรมสำหรับพัฒนาโปรแกรม ( IDE )
Netbeans 5.x ( สำหรับพัฒนาโปรแกรมด้วยภาษา Java จากทาง Sun ) น่าสนใจครับแต่ใช้ไม่เป็น ...
Eclipse ใช้พัฒนาโปรแกรมด้วยภาษา Java และยังมี mod อีกมากมายให้ใช้
- โปรแกรมชุดสำนักงาน
OpenOffice 2 ก็คล้ายๆกับ Ms Office แต่ดูจะไม่สามารถแทนที่ได้หรอก แค่พอใช้ทดแทนกันได้ในบางจุด
ด้วยทรัพยากรที่ผมพอจะมีในปัจจุบันนี้ คือ ผมมี Domainname ที่จดไว้แต่ไม่ได้ใช้ประโยชน์ และ มี Hosting ที่เช่าไว้พร้อมจดโดเมน
และยังไม่ได้ใช้ประโยชน์ใดๆ ทำให้ผมตัดสินใจแล้วว่าจะทำ Opensource community สักอันนึง ซึ่งคงไม่หวังจะดังแต่น่าจะนำมาใช้ทำเป็น
ฐานข้อมูลความรู้จากการทดลอง ในระดับมือใหม่ อย่างที่ผมกำลังจะหัดใช้งานอยู่ และทำเป็น Article เก็บไว้เผื่อจะมีประโยชน์ ต่อตัวผมเองและผู้ที่คิด
จะหันมาใช้งาน Opensource Product อย่างจริงๆจังๆ
รวมไปถึงผมคิดจะพัฒนาโปรแกรมเล็กๆ ง่ายๆ แจกให้ผู้ใช้ได้ใช้ ทั้งแบบที่ใช้บริการผ่านเวบ และ ดาวโหลดไปใช้ในเครื่องคอมพิวเตอร์ . . . แต่ก็คง
จะต้องดูกันต่อไปว่า จะไปได้ถึงไหนกัน . . .
ท้ายที่สุด ผมคงต้องไปศึกษาข้อมูลเกี่ยวกับ Linux และ Application ต่างๆบน Linux เพื่อใช้งาน . . และบันทึกสิ่งที่เรียนรู้จากมันมาลงเวบ
ขอให้ผมทำสำเร็จด้วยเถอะ . . . กลัวแพ้ใจตัวเองจริงๆ
Monday, May 15, 2006
AJAX คืออะไร ( เบื้องต้น )
เรื่องยอดนิยมเกี่ยวกับการพัฒนาโปรแกรมบนเวบไซต์ ในขณะนี้คงหนีไม่พ้น AJAX ซึ่งดังมากในต่างประเทศ
และก็เริ่มมีการกล่าวถึงแล้ว ในบ้านเรา . . .
AJAX เป็นรูปแบบการเขียนโปรแกรมบนเว็บที่นำ JavaScript มาใช้ร่วมกับ XMLHttpRequest
ซึ่งสามารถใช้ได้กับทุกภาษาที่ใช้ในการพัฒนาโปรแกรมโดยมีข้อจำกัดในการใช้ดังนี้
Server : ต้องรองรับ XML , XMLHttpRequest , PHP or ASP or ASP.net or JSP ... etc...
Client : ต้องรองรับ JavaScript
โดยปัจจุบันก็มี Framework ต่างๆเกี่ยวกับ ajax สำหรับภาษาต่างๆออกมามากมายแล้วแต่ Developer
จะเลือกมาใช้งาน
Ajax ย่อมากจาก Asynchronous JavaScript and XmlHttpRequest
แต่ที่จริงแล้ว Ajax ไม่ใช้ของใหม่อะไร . . . .
( ช่วงนี้กำลังศึกษา ajax แต่คงต้องกลับไปศึกษา Javascrip , dom , CSS , xml สักพักจะมาเขียนต่อ
และก็เริ่มมีการกล่าวถึงแล้ว ในบ้านเรา . . .
AJAX เป็นรูปแบบการเขียนโปรแกรมบนเว็บที่นำ JavaScript มาใช้ร่วมกับ XMLHttpRequest
ซึ่งสามารถใช้ได้กับทุกภาษาที่ใช้ในการพัฒนาโปรแกรมโดยมีข้อจำกัดในการใช้ดังนี้
Server : ต้องรองรับ XML , XMLHttpRequest , PHP or ASP or ASP.net or JSP ... etc...
Client : ต้องรองรับ JavaScript
โดยปัจจุบันก็มี Framework ต่างๆเกี่ยวกับ ajax สำหรับภาษาต่างๆออกมามากมายแล้วแต่ Developer
จะเลือกมาใช้งาน
Ajax ย่อมากจาก Asynchronous JavaScript and XmlHttpRequest
แต่ที่จริงแล้ว Ajax ไม่ใช้ของใหม่อะไร . . . .
( ช่วงนี้กำลังศึกษา ajax แต่คงต้องกลับไปศึกษา Javascrip , dom , CSS , xml สักพักจะมาเขียนต่อ
Monday, May 08, 2006
ว่ากันด้วย ฐานเงินเดือน ( จากเวบ พันทิป )
ว่ากันด้วยฐานเงินเดือนของ Developer หรือ Programmer นั่นเอง . . . จากเวบพันทิป มีคนสรุปไว้
ค่อนข้างดี และเห็นภาพได้ชัด ( ข้อมูล ณ วันที่ 8 พ.ค. 2549 )
ธรุกิจเจ้าของคนเดียว : 8K-10K No.สวัส , No.Bonus , Up 3% /Y
ธุรกิจเจ้าจองคนเดียว sw-house: 12K - 15K No.สวัสดิการณ์ . , Up 5%/Y
ธุรกิจตลาดแข่งขันสูง : 15K - 18K Up 5-10%
ธุรกิจ Finance : 15K - 20K Up 10%
ธุรกิจเจ้าของต่างชาติ : 20K - 30K Up 10%
ไปทำงานต่างชาติ : 30K - 45K วางเงินประกัน 100K หรือ อาจไม่มี , Up 10%
ใครจะยังไงไม่รู้ แต่เดี๋ยวนี้ได้เงินเดือนแค่เพียง 7630 เอง หักประกันสังคมเหลือ 7210 ( 5 5 5 )
ค่อนข้างดี และเห็นภาพได้ชัด ( ข้อมูล ณ วันที่ 8 พ.ค. 2549 )
ธรุกิจเจ้าของคนเดียว : 8K-10K No.สวัส , No.Bonus , Up 3% /Y
ธุรกิจเจ้าจองคนเดียว sw-house: 12K - 15K No.สวัสดิการณ์ . , Up 5%/Y
ธุรกิจตลาดแข่งขันสูง : 15K - 18K Up 5-10%
ธุรกิจ Finance : 15K - 20K Up 10%
ธุรกิจเจ้าของต่างชาติ : 20K - 30K Up 10%
ไปทำงานต่างชาติ : 30K - 45K วางเงินประกัน 100K หรือ อาจไม่มี , Up 10%
ใครจะยังไงไม่รู้ แต่เดี๋ยวนี้ได้เงินเดือนแค่เพียง 7630 เอง หักประกันสังคมเหลือ 7210 ( 5 5 5 )
Friday, May 05, 2006
วิธีการปิด autorun cd บน xp home และ xp pro
วันนี้กำลังใช้คอมอยู่ โดยทำการทดสอบ FreeBSD 6.0 บน Notebook ด้วย vmware
คราวนี้ระหว่างที่ลงในช่วงการติดตั้งโปรแกรมจะต้องมีการ เปลี่ยนแผ่น CD บ่อยๆ และด้วยความฉลาด
ของตัว XP Home ที่ใช้อยู่ ทำให้มันมี Dialog ขึ้นมาแสดงตลอดเวลา . . . . และด้วยความรำคาฐ
จึงได้หาวิธีในการปิด autorun cd บน xp home
วิธีปิด autorun cd บน xp pro
ทำได้โดย start -> run -> gpedit.msc -> เพื่อเรียก enable : ในส่วน turn off autorun cd
ไม่แน่ใจว่าอยู่ที่ sub ไหนของ dialog ให้ลองหาดูเอง
วิธีปิด autorun cd บน xp home
เนื่องจาก xp home ไม่มี gpedit.msc ให้ใช้งานเพราะฉะนั้นค่อนข้างจะต้องใช้ความสามารถสักหน่อยในการปิด
แต่ก็ไม่ได้ยากมากจนเกินไป สำหรับวิธีการทำก็ทำได้ด้วยวิธีการดังต่อไปนี้
1. start -> run -> regedit.exe เพื่อเรียก registry editor ขึ้นมา
2. เลือกไปที่ HKEY_Loca_Machine -> System -> CurrentControlSet -> Services -> cdrom
3. จะเห็นหน้าต่างในส่วนขวาของ regedit.exe มีไฟล์ชื่อ autorun ให้คลิกซ้ายเพื่อเลือกและคลิกขวาเพื่อเลือก modify
4. จะพบหน้าต่างชื่อ Edit DWORD value ในช่อง value data ถ้าใส่ เลข 1 จะเป็นการเลือกให้ windows ทำการ
เปิด dialog ทุกครั้งที่มีการใส่แผ่น cdrom แต่หากใส่เลข 0 จะเป็นการปิดไม่ให้ windows เปิด dialog เมื่อใส่แผ่น
แค่นี้เอง วิธีการในการปิด autorun cd dialob บน windows xp ^^
คราวนี้ระหว่างที่ลงในช่วงการติดตั้งโปรแกรมจะต้องมีการ เปลี่ยนแผ่น CD บ่อยๆ และด้วยความฉลาด
ของตัว XP Home ที่ใช้อยู่ ทำให้มันมี Dialog ขึ้นมาแสดงตลอดเวลา . . . . และด้วยความรำคาฐ
จึงได้หาวิธีในการปิด autorun cd บน xp home
วิธีปิด autorun cd บน xp pro
ทำได้โดย start -> run -> gpedit.msc -> เพื่อเรียก enable : ในส่วน turn off autorun cd
ไม่แน่ใจว่าอยู่ที่ sub ไหนของ dialog ให้ลองหาดูเอง
วิธีปิด autorun cd บน xp home
เนื่องจาก xp home ไม่มี gpedit.msc ให้ใช้งานเพราะฉะนั้นค่อนข้างจะต้องใช้ความสามารถสักหน่อยในการปิด
แต่ก็ไม่ได้ยากมากจนเกินไป สำหรับวิธีการทำก็ทำได้ด้วยวิธีการดังต่อไปนี้
1. start -> run -> regedit.exe เพื่อเรียก registry editor ขึ้นมา
2. เลือกไปที่ HKEY_Loca_Machine -> System -> CurrentControlSet -> Services -> cdrom
3. จะเห็นหน้าต่างในส่วนขวาของ regedit.exe มีไฟล์ชื่อ autorun ให้คลิกซ้ายเพื่อเลือกและคลิกขวาเพื่อเลือก modify
4. จะพบหน้าต่างชื่อ Edit DWORD value ในช่อง value data ถ้าใส่ เลข 1 จะเป็นการเลือกให้ windows ทำการ
เปิด dialog ทุกครั้งที่มีการใส่แผ่น cdrom แต่หากใส่เลข 0 จะเป็นการปิดไม่ให้ windows เปิด dialog เมื่อใส่แผ่น
แค่นี้เอง วิธีการในการปิด autorun cd dialob บน windows xp ^^
Wednesday, May 03, 2006
ปัญหาเรื่องเวลาใน PHP 5.1.2
วันนี้อ่านเจอในเวบบอร์ด . . . Narisa . . ว่า PHP 5.1.x ซึ่งที่ผมทดลองคือ PHP 5.1.2 มี Bug เรื่องเวลา
คือว่าเมื่อเราเรียกดูเวลาจากระบบด้วยคำสั่ง
PHP CODE
echo strftime('%Y-%m-%d %H:%M:%S') . "\n";
เวลาที่ปรากฏจะเพิ่มให้อีก 1 ชั่วโมง
ผลลัพธ์
2006-05-3 16:34:29
ซึ่งผลสรุปในแนวทางการแก้ปัญหาคือให้ไปใช้ ซึ่งได้คำตอบมาจาก เวบบอร์ดซึ่งนำมาจากเวบ PHP.net มาว่า
ให้เราไปเรียกใช้
date.timezone = "Asia/Bangkok"
ก็จะสามารถแสดงผลได้ตามปกติ
คือว่าเมื่อเราเรียกดูเวลาจากระบบด้วยคำสั่ง
PHP CODE
echo strftime('%Y-%m-%d %H:%M:%S') . "\n";
เวลาที่ปรากฏจะเพิ่มให้อีก 1 ชั่วโมง
ผลลัพธ์
2006-05-3 16:34:29
ซึ่งผลสรุปในแนวทางการแก้ปัญหาคือให้ไปใช้ ซึ่งได้คำตอบมาจาก เวบบอร์ดซึ่งนำมาจากเวบ PHP.net มาว่า
ให้เราไปเรียกใช้
date.timezone = "Asia/Bangkok"
ก็จะสามารถแสดงผลได้ตามปกติ
Saturday, April 29, 2006
วิธีแก้ไข mysql ให้รับการเชื่อมต่อภายนอก
ปกติแล้วค่าเริ่มต้นจากโปรแกรมฐานข้อมูลฟรี ยอดนิยมอย่าง mysql นั้นจะไม่กำหนด
รหัสผู้ใช้และรหัสผ่านในการเข้าใช้ฐานข้อมูลไว้ แต่จะทำการบังคับการเชื่อมต่อฐานข้อมูล
ว่าจะมีการเชื่อมต่อมาจากภายในเครื่องตัวเองเท่านั้น
ซึ่งเราสามารถตรวจสอบได้ในตารางชือ user ในฐานข้อมูลชื่อ mysql
- วิธีแก้ไข
ในฟิลด์ host ให้เปลี่ยนจากเดิมที่เป็น localhost แก้ให้เป็น %
- ข้อแนะนำ
ผมเองคิดว่าหากใช้ในแง่ของ Web Application เท่านั้น การที่จะให้ mysql เป็นแบบ localhost
ก็เป็นเรื่องที่เหมาะสมดีอยู่ เพื่อความปลอดภัยในการใช้งาน แต่หากต้องการใช้รอรับการเชื่อมต่อ
จากภายนอกก็ควรที่จะเปลี่ยนตามที่ได้แสดงไว้ในวิธีการแก้ไข
รหัสผู้ใช้และรหัสผ่านในการเข้าใช้ฐานข้อมูลไว้ แต่จะทำการบังคับการเชื่อมต่อฐานข้อมูล
ว่าจะมีการเชื่อมต่อมาจากภายในเครื่องตัวเองเท่านั้น
ซึ่งเราสามารถตรวจสอบได้ในตารางชือ user ในฐานข้อมูลชื่อ mysql
- วิธีแก้ไข
ในฟิลด์ host ให้เปลี่ยนจากเดิมที่เป็น localhost แก้ให้เป็น %
- ข้อแนะนำ
ผมเองคิดว่าหากใช้ในแง่ของ Web Application เท่านั้น การที่จะให้ mysql เป็นแบบ localhost
ก็เป็นเรื่องที่เหมาะสมดีอยู่ เพื่อความปลอดภัยในการใช้งาน แต่หากต้องการใช้รอรับการเชื่อมต่อ
จากภายนอกก็ควรที่จะเปลี่ยนตามที่ได้แสดงไว้ในวิธีการแก้ไข
Subscribe to:
Posts (Atom)