Archive for September, 2010

[Java] JDBC Version & Database Version

มีงานเล็กน้อย จากเจ้านายให้หาว่า JDBC Driver ที่ใช้กันอยู่นั้น Version อะไร เนื่องจาก Consult ที่มาทำงานด้วยต้องนำไปทดลองกับงานที่เค้าต้องใช้ วิธีการก็ตามนี้เลยครับ ใช้ความสามารถของ DatabaseMetaData

/**
 * File Name : JDBCVersion.java
 * Created Date : Sep 22, 2010 : 1:16:57 PM
 */
package com.fun4station.example;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCVersion {

	public static void main(String[] args) throws SQLException {
		Connection conn = GetConnection();

		DatabaseMetaData dbMeta = conn.getMetaData();
		System.out.println("DriverVersion : "+ dbMeta.getDriverVersion());
		System.out.println("DatabaseMajorVersion : "+ dbMeta.getDatabaseMajorVersion());
		System.out.println("JDBCMajorVersion : "+ dbMeta.getJDBCMajorVersion());
	}
	
	private static Connection GetConnection(){
		Connection conn = null;
		try {
			String url = "jdbc:oracle:thin:@localhost:1521:JDEV";
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, "user", "pass");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return conn;
	}
}

นอกจาก JDBC Version และ Databse version แล้วยังบอกข้อมูลอื่นๆอีกหลายอย่าง
แหล่งข้อมูล
Interface DatabaseMetaData

[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 ของแต่ละเจ้า)

[PHP] ปัญหา Cannot send session cache limiter headers already sent

เนื่องจากเวลาทำเว็บ PHP มักนิยม encoding ด้วย UTF-8 เสมอไม่เคยเจอปัญหา เพิ่งจะมาเจอก็ตอนเปลี่ยนมาใช้ Notepad++ ในการเขียน PHP แทน Adobe Dreamweaver เพราะไม่ค่อยได้ใช้ในการ Design แค่ Code อย่างเดียว ปัญหาที่เจอเคือการใช้งาน Session ดังนี้

<?php
session_start();
echo "Session Start...";
?>

ดูผ่านๆ ไม่น่ามีปัญหาอะไร แต่เจอ Errorแบบนี้

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at xxx) in xxx

ก็หน้ามืดไปเกือบ ชั่วโมงได้ สุดท้ายพบว่าเป็นที่ Notepad++ เนื่องจาก Default Encoding ผมกำหนดเป็น UTF-8 ดังรูป
php-utf8-encoding-problem
ตัว Notepad++ เพิ่มข้อความอะไรสักอย่างในไฟล์ ดังนี้ (เปิดจากไฟล์ปกติจะไม่เจอ ที่เจอเนื่องจากลองใช้ Java อ่านข้อมูลออกมา)

๏ปฟ<?php
session_start();
echo "Session Start...";
?>

ทำให้เกิด error ดังกล่าว วิธีแก้ไขให้ บันทึกรูปแบบ Encoding เป็น Encoding UTF-8 Without BOM ดังรูป
php-utf8-encoding-problem
หวังว่าคนที่เจอปัญหาเดียวกันจะได้แก้ไขได้ถูกทางครับ
เพิ่มเติม 08-02-2011 : เพื่อนที่ทำงานแนะนำว่าให้เพิ่ม ob_start(); ในบรรทัดแรกก็แก้ปัญหาได้เหมือนกัน

[Java] Convert เลขฐาน 2 เป็นเลขฐาน 10

รื้อฟื้นเรื่องเดิม สมัยที่ทำ Application ตัวหนึ่งซึ่งต้องทำการแปลงเลขฐาน 2 ไปเป็นฐาน 10 และ แปลงเลขฐาน 10 มาเป็นเลขฐาน 2 ซึ่งแรกกะว่าจะเขียนเอง ลงทุนไปหาสูตรมาเรียบร้อย ที่ไหนได้มันอยู่ใกล้ตัวนี่เอง ง่ายมากๆ เส้นผมบางภูเขาหัวโล้นเลยละ แค่ใช้ Class Integer ก็จบงานแล้วครับ ดังตัวอย่างนี้เลย

/**
 * File Name : BinaryBase.java
 * Created Date : Sep 21, 2010 : 9:48:55 AM
 * Copyright © 2010 www.fun4station.com
 */
package com.fun4station.example;

/**
 * @Author Supot Saelao 
 * @Version 1.0
 */
public class BinaryBase {

	public static void main(String[] args) {
		//Convert 101010 (Binary base) to Decimal
		int dec = Integer.parseInt("101010", 2);
		
		//Convert Binary to Decimal 
		String biStr = Integer.toBinaryString(dec);
		
		System.out.println("101010 => " + dec);
		System.out.println(dec + " => " + biStr);
	}
}

ผลที่ได้ก็ประมาณนี้ครับ

101010 => 42
42 => 101010

นอกจากนี้ ดังสามารถแปลงไปเป็นเลขฐานอื่นๆได้อีกครับ เช่นฐาน 8 , ฐาน 16 ส่วนผมเจอข้อมูลนี้ได้ไงก็จากอ่าน เอกสารประกอบ method parseInt ของ Class Integer

Merge many file to single file on Windows

มีงานที่ต้องทำการ รวมไฟล์ .txt หลายๆไฟล์ เข้าเป็นไฟล์เดียวบน Windows สอบถาม อ.google แล้วก็ได้ solution ดังนี้ (ลอกมาทั้งดุ้น)

for /r %%a in (*.txt) do (
	copy/b merge.txt+"%%a" merge.txt
)

จากตัวอย่างเป็นการอ่านข้อมูล .txt ทั้งหมดใน Directory ปัจจุบันที่รันคำสั่ง และ เขียนไปเป็นไฟล์ใหม่ หรือ จะใช้แบบที่สองดังนี้

copy /a *.txt merge.txt

เป็นการ copy ไฟล์ .txt แล้วเขียนใหม่เป็นไฟล์ merge.txt
จากที่ทดลองดูใช้งานได้ดีเลยครับ เป็นการปิดงานไปอีกงานหนึ่ง ก็เลยมา Note ไว้เตือนความจำหน่อย
หมายเหตุ : เท่าที่รู้ถ้าใช้ Ubuntu นี่ง่ายมากๆเหมือนกัน เดียวจะลองหามาให้ดูที่หลังครับ

แหล่งข้อมูล
Batch File To Join Files Into One File