Archive for the ‘ .NET Technology ’ Category

True Wifi Auto Login (โปรแกรมสำหรับ Login เข้าใช้ True Wifi หลังหมดเวลา)

ได้มีโอกาสอันดีในการมาสมัครใช้ True Wifi แบบรายเดือนเพราะสถานที่ทำงานไม่มี อินเตอร์เน็ตให้ใช้ ดังนั้นเลยต้องไป ซื้อ SIM True และจัดการสมัคร package 100 ใช้ Wifi แบบไม่จำกัด แต่ปัญหาที่เจอก็คือ ระบบจะตัดสัญญาเมื่อครบกำหนด 90 นาที และต้องทำการ Login ใหม่ซึ่งถ้าใช้งานทั่วไปก็คงไม่มีปัญหาอะไรแต่ถ้าเกิดกำลังดูหนังฟังเพลงกันอยู่ จะทำให้อารมณ์ค้างไม่ใช่เล่น ก็เลยเกิดความคิดจะเขียน script หรือ โปรแกรมอะไรขึ้นมาเพื่อทำให้ทำการต่ออินเตอร์เน็ตเองหลังจากใกล้หมดเวลา ประมาณ นาทีที่ 88, 89 พอลองค้นหาจาก Google ดูแล้วเหมือนไม่เจอโปรแกรมลักษณะนี้ เจอแต่ script ที่ต้องเปิดหน้า browserเอาไว้ (หรือหาไม่เป็นก็ไม่รู้ เลยไม่เจอ) ก็เลยคิดว่า เอาแบบนั้นก็เขียนเองละกัน

1. ขั้นแรกไปศึกษาการ ส่งค่าไปให้ระบบสำหรับทำการ login ก่อน พบว่า จากหน้าจอ login ข้อมูลที่ถูกส่งไปคือ

username==ชื่อผู้ใช้งาน
password=รหัสผ่าน
param=ค่า MAC Address +"|"+ปี+เดือน+วัน+ชั่วโมง+นาที ที่ทำการเข้าระบบ ทำการ เข้ารหัสด้วย base64

ตัวอย่างค่า param

MDA6Mjc6MTA6OTk6YjI6NmN8MjAxMzEwMTgxMzA3Cg==

จากนั้นมาลองเขียน Java โดยทำการ post ค่าดังกล่าวไปในส่วนของการ Login แต่จนแล้วจนรอดก็ไม่ได้ ทั้งๆที่การเข้าหรัสถูกต้องหมด แต่ถ้าเอาค่าจากใน browser มาทดสอบส่งไปสามารถ login ได้ปกติ เลยคิดเอาเองว่า ในขั้นตอนการ generate param นั้นอาจมีการเก็บค่าเพื่อทำการอ้างอิงและตรวจสอบกับค่าที่ส่งจากหน้าจอ ถ้าไม่ตรงกันก็ไม่สามารถเข้าระบบได้

พอสันนิษฐานดังกล่าวก็เปลี่ยนแนวคิด ดังนี้
1. เปิด Connection ไปที่ http://www.google.com ก่อน รอให้ระบบส่งเราเข้าไปยังหน้า Login เอง
2. จากนั้นก็ไป Copy ค่า param จากหน้าจอดังกล่าวมา โดยไม่ต้อง generate เอง
3. ส่งข้อมูลไปทำการ Login

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

Download
Java Version (Windows)
.NET Windows Form version (Update 20/10/2013)

Note: ติดปัญหา และต้องการแนะนำเพิ่มเติม ติดต่อได้ที่หน้า Readme

[C#] แก้ปัญหา Event Log ใน Windows เต็ม

ปัญหานี้เจอ เมื่อหลายเดือนก่อนแล้ว แต่ไม่มีเวลาเขียน ปัญหาดังกล่าวเกิดจากในโปรแกรมที่พัฒนามีการเขียน log การทำงานและสถานะไปไว้ใน Event log ในส่วนของ Application ดังรูป

พอ Event log เต็มทำให้โปรแกรมดันหยุดไม่ทำงานต่อ แรกๆก็หาหาเหตุไม่เจอ จนเอามารัน debug แล้วก็เจอปัญหาดังกล่าว วิธีการแก้ไขสามารถทำได้ดังนี้
1. เพิ่มขนาด Event log ให้มากขึ้น เพราะโดยปกติ Windows จะให้ขนาดมาที่ 1024 KB เท่านั้น (ทั้ง Log ที่สร้างขึ้นเอง และ ของ Windows เอง) คลิกขวา -> Properties จะได้หน้าต่าง ดังรูป

2. กำหนดรูปแบบการจัดเก็บ เช่นแทนที่ Log เดิมถ้าเต็ม, เคลียร์ออกเมื่อเต็ม ดูรูปจากข้อ 1 ประกอบ
ทั้งสองวิธีดังกล่าวอาจไม่สะดวกหากต้องไปไล่นั่ง Config ให้กับ user ทุกคน ดังนั้นทำการกำหนดใน code ส่วนที่เขียน log จะง่ายกว่า ดังนี้

EventLog evl = new EventLog();
evl.Log = "MyLogName";
evl.MaximumKilobytes = 1024;
evl.ModifyOverflowPolicy(OverflowAction.OverwriteAsNeeded, 0);

หลังจากแก้ไปปัญหาดังกล่าวก็สามารถใช้โปรแกรมได้อย่างราบรื่น

แหล่งข้อมูล
Event Logging – Clearing the Event Log

[C#] String or binary data would be truncated The statement has been terminated.

ผมเจอ Exception

String or binary data would be truncated.\r\n The statement has been terminated.

ตอนบันทึกข้อมูลลงฐานข้อมูล MS SQL Server 2005 ตอนแรก งง เป็นไก่ตาแตกมาก เพราะเคยเจอ Exception แบบนี้ในการบันทึกข้อมูล byte[] ที่เป็นข้อมูลประเภทรูปภาพ พอดีในข้อมูลชุดนี้ก็มี column ที่เป็น byte[] ของไฟล์เอกสารด้วย สิ่งแรกที่ทำคือ สอบถาม อ.google ท่านก็โปรดเมตตาได้คำตอบมาว่า

เพราะ ข้อมูลที่ทำการบันทึกนั้นมีขนาดเกิน ขนาดของข้อมูลที่กำหนดใน column

ตรวจสอบใหม่โดยกรอกข้อมูลใน column ที่คิดว่าเกินใหม่ ผ่านฉลุยเลย ความรู้สึกแรกๆเลย ปัญหาในเรื่องการรายงานผลความผิดพลาดในการทำงานกับฐานข้อมูลของ C# (อาจทั้ง .NET) ห่วยครับ ไม่รู้ว่าเป็นเพราะ Library (ADO.NET) ในการติดต่อฐานข้อมูล หรือ ตัวฐานข้อมูลรายงานเอง ทำให้ไม่ตรงประเด็นเท่าไร จากการทำงานกับ Java และฐานข้อมูลต่างๆมา รายงานข้อผิดพลาดได้ตรงจุดมากกว่านี้มาก โดยเฉพาะการใช้งานกับ Oracle(ของ Java ถูก implement ใน JDBC Driver ของแต่ละเจ้า)

[C#]บันทึกการใช้งาน Combobox แบบด้วนๆ

เนื่องจากความไม่รู้ และ เพิ่งมาหัดเล่น Windows App ด้วย C# ได้ใหม่ยังไมุ่คุ้นเคยกับการใช้งบาน Component ต่างๆ ที่เจอปัญหาคือ จะแสดงข้อมูลใน Combobox ให้แสดง ข้อมูลรายละเอียดแต่ตอนทำการบันทึกให้เอา Value ไปใช้แทน เหมือนกับ ในเว็บไซต์ เช่น

<select name="province">
	<option value="56">เชียงใหม่</option>
	<option value="57">เชียงราย</option>
</select>

งง อยู่สักพัก เลยลองผิดลองถูกได้ความว่า สามารถทำได้ง่ายมากดังนี้
1. ทำการ Set Datasource ให้กับ Combobox และกำหนด DisplayMember และ ValueMember ดังนี้

//Query data to List<ListBoxModel>
List<ListBoxModel> lists = "แหล่งที่มาของข้อมูล";
cmbProvince.DataSource = lists;
cmbProvince.ValueMember = "id";
cmbProvince.DisplayMember = "name";

หมายเหตุ : Class ListBoxModel มี properties “name” และ “id” และ DataSource ยังสามารถใช้ข้อมูลได้หลากหลายรูปแบบด้วย แต่ผมชอบแบบนี้ที่สุด
2. ตอนดึงข้อมูล Code ที่ selected อยู่ก็แบบนี้

//ดึง Selected ID ออกมา
object id = cmbProvince.SelectedValue;
//ดึง Class ที่ bind ออกมา
ListBoxModel obj = (ListBoxModel)cmbProvince.SelectedItem;

3. ส่วนการ Set ค่าใส่ Combobox ก็ตามนี้เลยครับ

//ใส่ค่า ID โดยตรง
cmbProvince.SelectedValue = "ค่าที่ต้องการ";
//กรณีมีค่าที่ Display อยู่แล้ว
cmbProvince.FindByText("ค่าที่ต้องการ").Selected = true;
//กรณีรู้ค้า ID
cmbProvince.FindByValue("ค่า ID ที่ต้องการ").Selected = true;
//แบบรู้ลำดับ
cmbProvince.SelectedIndex = ลำดับที่ต้องการให้ เลือก (เป็นตัวเลข);
//ใช้ Display โดยตรง
cmbProvince.SelectedText = "ข้อความที่ต้องการ";

อันนี้ลองผิดลองถูกมา ท่านใดที่ทราบการใช้งานแบบง่ายกว่านี้ก็ ช่วยชี้แนะด้วยครับ

[C#]Run batch file in C#

หลังจากที่ผ่านงาน Run batch file in Java class มาแล้วก็มาคิดว่า ในเมื่อรันอยู่บน Windows ทำไมไม่ใช้ภาษา C# ซะละครับ เลยลองไปหาตัวอย่างการใช้งานของ C# มาดังนี้
1. รันโดยไม่สนใจผลการทำงาน

private void btnRun_Click(object sender, System.EventArgs e){
	System.Diagnostics.Process.Start(@"C:\MyBatch.bat");
}

2. รันโดยรอผลการทำงาน

private void btnRun_Click(object sender, System.EventArgs e){
	System.Diagnostics.ProcessStartInfo proInfo = new System.Diagnostics.ProcessStartInfo(@"C:\MyBatch.bat");
	proInfo.RedirectStandardOutput = true;
	proInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
	proInfo.UseShellExecute = false;
	
	System.Diagnostics.Process pro = System.Diagnostics.Process.Start(proInfo);
	System.IO.StreamReader strReader = pro.StandardOutput;
	pro.WaitForExit(2000);
	if(pro.HasExited){
		string output = strReader.ReadToEnd();
		Console.WriteLine(output);
	}
}

โอ้… ดูแล้วออกจะง่ายกว่า Java อยู่หลายช่วงตัว (Code ที่แสดง copy มาแค่บางส่วนเท่านั้น)
แหล่งข้อมูล
How can I run another application or batch file from my Visual C# .NET code?
How to execute a .bat file from a C# windows form app?