Tuesday, October 17, 2006

วิธีการให้กด Enter เพื่อเลื่อน Focus ของ WebForm

ในการ 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 ดังตัวอย่างต่อไปนี้



Name:


Address:


City:






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

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

การ Disable 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 นะครับ ^^

Monday, October 02, 2006

NGen Revs Up Your Performance with Powerful New Features

วิธีการใช้ Ngen เพื่อช่วยเพิ่มความเร็ว เอกสารเป็นทางการของ Microsoft

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#

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 ก็ได้นะครับ

แต่ผมจะเขียนเป็นโปรแกรม อิอิ

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 นะครับ ^-^ ทำงานได้ดีมั๊กๆ ^ ^

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

ความจริงแล้วเค้าไม่แนะนำให้ทำแบบนี้นะครับ ( แต่ผมจะทำเพราะยังไม่ได้ออนไลน์ )

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

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..

วิธีการนำข้อมูลใน DataSet ออกมาเป็น XML

วิธีในการนำ DataSet ออกมาเป็น XML วันนี้จะ Note การนำข้อมูลใน DataSet ออกมาเป็น
ไฟล์ 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 ครับผม

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

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 คงช้ามากๆเหมือนกัน

การตั้งค่าหน้ากระดาษ ให้ Printer บน WinXP

ผมติดปัญหากับโปรแกรมที่ใช้ในที่ทำงาน ( รพ. ) มาได้ประมาณ 5 เดือนแล้ว
นั่นเป็นเหตุผลที่ผมต้องใช้ 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 ออกมาเท่านั้นเอง ^ ^

โปรแกรมเข้ารหัสไฟล์ 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# นะครับ )

Thursday, September 07, 2006

ทดลองใส่เพลงบน Blog

ผมเคยเขียนเกี่ยวกับวิธีการ Embled Windows Media Player ลงใน Blog
เมื่อเดือนสิงหา ที่ผ่านมา

มาวันนี้ผมได้ทดสอบนำไฟล์ 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 ใหม่ขึ้นมาแล้วก็ไปแก้ซะ . . .

การสร้าง 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

( ที่เหลือผมยังคิดไม่ออกครับ ^ ^ )

วิธีการแก้ 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 ก็จะสามารถใช้ได้เช่นเคยครับ

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();
}

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 อีกตั้งหาก

Firebird Project

เมื่อวานผมได้เขียนอะไรถึง Firebird นิดหน่อย และวันนี้ก็เลยลองหาข้อมูลเกี่ยวกับ
การใช้งาน 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

Hungarian Notation

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

โปรแกรมที่ดีเริ่มที่การออกแบบ

โปรแกรมที่ดีเริ่มที่การออกแบบ . . . .

บังเอิญผมเจอ 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)

การเพิ่มความเร็วตอน StartUp ให้ .net App

ประสบปัญหาเดียวกันแทบทุกคนสำหรับ Dev ที่ใช้ Java หรือ .net ในการพัฒนาโปรแกรม
ก็คือเวลาที่เสียไปกับการ 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 ด้วยผมก็หวังว่าจะได้เห็นคำติชมและวิจารณ์ตามเวบบอร์ด
ระหว่างนี้ก็รอต่อไป ^ ^

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

การเรียกใช้โปรแกรมอื่นจากโปรแกรมเรา

ผมไม่รู้ว่าจะตั้ง 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");

กลับผ่าน - -'' ไม่เข้าใจ ไม่เข้าใจ ไม่เข้าใจ แต่ช่างมันเถอะครับ ^^

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# ไม่เท่ากัน

จบข่าวครับ . . .

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

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 เป็นต้น

###########################################################

ไว้มาแปลใหม่วันหลัง

โปรเจค 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 กันลืมน่ะครับ )

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 ได้ง่ายขึ้น ^^ ดีใจจังเลย

Tuesday, August 15, 2006

PHP สำหรับ .net

วันนี้อ่าน Blog ใน Thaidev.org แล้วเผอิญไปเห็นว่าในเวบของ CodePlex
บอกว่ามีโปรเจคนึงที่จะทำให้เราสามารถใช้ PHP ได้ใน .net Framework

Ref :: PHP For .net Framework

Saturday, August 12, 2006

การ Set Java ClassPath

วันนี้เจอปัญหาใหม่ๆ . . . เกี่ยวกับ Java ClassPath เลยได้คำตอบมาจาก Narisa แต่แปลกดีนะ
บางเครื่องต้องทำ บางเครื่องไม่ต้องทำ . . . . 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
ช่วงนี้เห็นมีคนที่ใช้ 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 ด้วยล่ะ

เรียบร้อยแล้ว ^^

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 กันลืมครับ ^-^

Thursday, July 13, 2006

ปณิธานใหม่ๆ

ต่อจากนี้จะไม่มาทำงานสาย หรือถ้าจะต้องสายก็ให้มันจำเป็นต้องสายจริงๆ
แล้วก็จะพยายามพัฒนาความสามารถตัวเอง ให้มีมากขึ้นเรื่อยๆ . . . . .

วันนี้โหลด 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 แทนครับ ^^

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 ผ่านไปก็ได้ มั้ง . . . .

Wednesday, June 28, 2006

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 พอทำเสร็จหมดแล้วจะมาเขียนอีกที

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 เพื่อใช้งาน . . และบันทึกสิ่งที่เรียนรู้จากมันมาลงเวบ
ขอให้ผมทำสำเร็จด้วยเถอะ . . . กลัวแพ้ใจตัวเองจริงๆ

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 สักพักจะมาเขียนต่อ

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 )

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 ^^

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"

ก็จะสามารถแสดงผลได้ตามปกติ

Saturday, April 29, 2006

วิธีแก้ไข mysql ให้รับการเชื่อมต่อภายนอก

ปกติแล้วค่าเริ่มต้นจากโปรแกรมฐานข้อมูลฟรี ยอดนิยมอย่าง mysql นั้นจะไม่กำหนด
รหัสผู้ใช้และรหัสผ่านในการเข้าใช้ฐานข้อมูลไว้ แต่จะทำการบังคับการเชื่อมต่อฐานข้อมูล
ว่าจะมีการเชื่อมต่อมาจากภายในเครื่องตัวเองเท่านั้น

ซึ่งเราสามารถตรวจสอบได้ในตารางชือ user ในฐานข้อมูลชื่อ mysql


- วิธีแก้ไข

ในฟิลด์ host ให้เปลี่ยนจากเดิมที่เป็น localhost แก้ให้เป็น %


- ข้อแนะนำ

ผมเองคิดว่าหากใช้ในแง่ของ Web Application เท่านั้น การที่จะให้ mysql เป็นแบบ localhost
ก็เป็นเรื่องที่เหมาะสมดีอยู่ เพื่อความปลอดภัยในการใช้งาน แต่หากต้องการใช้รอรับการเชื่อมต่อ
จากภายนอกก็ควรที่จะเปลี่ยนตามที่ได้แสดงไว้ในวิธีการแก้ไข