[PHP] การส่ง parameter แบบ pass by reference

เขียน PHP มาก็ไม่นานและไม่ชำนาญ เพราะส่วนมาก็ใช้พวก CMS หรือ Blog อย่าง WordPress ทำเว็บอย่างเดียว พอมีงานที่ต้องเขียนเอง เนื่องจากติดนิสัยมาจากการเขียน Java อยากส่ง parameter ไปให้ function แบบ pass by reference ลองหาข้อมูลดู สามารถได้ตวามดังนี้ การส่ง parameter แบบปกติจะเป็นแบบ pass by value ดังนั้นถ้าต้องการให้ส่งแบบ pass by reference จะต้องทำดังนี้

public function passByRef(&$param){
	//Code here...
}

จุดที่แตกต่างก็คือ เครื่องหมาย “&” ที่ใส่ก่อนหน้า $param
ตัวอย่างเช่น

<?php
$name = "Supot";
echo "Before : ".$name."<br/>";
passByRef($name);
echo "After : ".$name."<br/>";

function passByRef(&$params){
	$params = "Change value";
}
?>

ผลที่ได้จะเป็น

Before : Supot
After : Change value

โอ้ มันช่างง่ายอะไรเช่นนี้ แต่ตอนใช้งานนี่วุ่นพอควรถ้าไม่จำ พอไปลองหาดูในเอกสารของ PHP แล้วมี function เป็นแบบ pass by reference อยู่พอสมควร

[Java]Setup DB2 9.x Connection Pool on Weblogic 8.1

มีเรื่องราวให้ได้เปลี่ยนจาก Oracle 9i มาใช้ IBM DB2 9.7 ปัญหาที่เจอคือใน Weblogic 8.1 ไม่มี driver สำหรับ DB2 9.7 ในขั้นตอนการสร้าง Connection Pool
1. ให้ทำการ Set classpath ให้กับ db2jcc.jar และ db2jcc_license_cu.jar (อยู่ใน Path ที่ติดตั้ง DB2\java) โดยเปิด ไฟล์

C:\bea\user_projects\domains\<domain-name>\startWebLogic.cmd

เพิ่มบรรทัดดังนี้เข้าไปหลังบรรทัด set JAVA_OPTIONS=%SAVE_JAVA_OPTIONS%

set CLASSPATH=%CLASSPATH%;<db2-path>\java\db2jcc.jar;<db2-path>\java\db2jcc_license_cu.jar

2. จากนั้นทำการ start server และเข้าไปยัง console ของ Weblogic ตอนสร้าง Connection Pool ให้เลือก DB2 -> Others ดังรูป

3. ทำการกรอกข้อมูล Conection ดังรูป

โดย

Driver Classname :ให้ใช้ com.ibm.db2.jcc.DB2Driver
URL :ใช้รูปแบบ jdbc:db2://<server>:<port>/<database>
	- <server> ชื่อเครื่อง server หรือ IP Address
	- <port> เป็น port (ค่า default คือ 50000)
	- <database> ชื่อฐานข้อมูล

และกรอก User/Password
4. คลิกปุ่ม Test Driver Configuration ถ้าไม่มีปัญหาอะไร จะได้ดังรูป

5. คลิก Create and deploy ก็สามารถใช้งานได้แล้วครับ
แหล่งอ้างอิง
Configure DB2 UDB with third-party application servers

[Oracle] ความแตกต่างระหว่าง TRUNCATE และ DELETE

พอดีมีปัญหาในการลบข้อมูลในการทำงาน ซึ่งต้องลบข้อมูลจากตารางเดิมออกให้หมด แล้วทำการบันทึกข้อมูลใหม่เข้าไป ตอนแรกที่ทำไว้ก็คือ ใช้คำสั่ง

DELETE FROM XX

ตอนข้อมูลไม่เยอะก็ทำงานได้ดีไม่มีปัญหาอะไร แต่พอข้อมูลเยอะขึ้นเรื่อย ก็จะช้ามากขึ้น เนื่องจากข้อมูลมี Index, PK, FK Constraints อยู่พอสมควร ก็เลยเปลี่ยนมาใช้ คำสั่ง

TRUNCATE TABLE XX 

แทนซึ่งก็ช่วยได้มาก แต่ TRUNCATE เองก็มีข้อจำกัดเหมือนกัน จากการหาข้อมูลก็เจอข้อแตกต่างดังนี้
0. TRUNCATE เป็นคำสั่งใน กลุ่ม DDL (Data Definition Language)
1. TRUNCATE ทำงานได้เร็วกว่า DELETE
2. TRUNCATE ไม่สามารถทำการ Rollback
3. ไม่สามารถระบุ เงื่อนไข WHERE ใน TRUNCATE
4. Triggers จะไม่ทำงานกับคำสั่ง TRUNCATE (กรณีมีการใช้ Triggers ในการตรวจตราการเปลี่ยนแปลงของข้อมูล)
สาเหตุหลัก ประมาณ 5 ข้อที่ว่านี่ละครับที่ทำให้ TRUNCATE ทำงานได้เร็วกว่า DELETE

หมายเหตุ : คำสั่งในกลุ่ม DDL, DCL (Data Control Language) ไม่สามารถ Rollback ได้
ข้อมูลอ้างอิง :
Difference between TRUNCATE, DELETE and DROP commands
Oracle Truncate Table

SpringFramework java.lang.OutOfMemoryError: Java heap space on Tomcat 6

เนื่องจากมีโอกาสในการนำ Spring Framework ไปรันใน Web Service Tomcate 6.0.x ซึ่งใช้งานผ่านจาก Eclipse ตอนสั่ง Start Server (Deploy) จะใช้เวลานานมาก และ ขั้นตอนในการ Initialized bean จะเกิด ข้อผิดพลาดดังนี้

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
...... Invocation of init method failed; nested exception is java.lang.OutOfMemoryError: Java heap space
	at org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory. initializeBean(AbstractAutowireCapableBeanFactory.java:1412)
......
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.lang.OutOfMemoryError: Java heap space
	at java.util.HashMap.addEntry(HashMap.java:753)
	at java.util.HashMap.put(HashMap.java:385)
	at java.util.HashMap.putAll(HashMap.java:524)
......
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045

จากความรู้ที่ผ่านๆ มาก็ต้องขยายขนาดของ heap space กันหน่อย อันดับแรกเลยไปแก้ที่ไฟล์

Tomcat.x.x\bin\catalina.bat

โดยเพิ่มบรรทัดต่อไปนี้บนสุดของไฟล์ (หลัง comment) ถ้าเป็น Linux , UNIX ก็ ใช้ catalina.sh

set JAVA_OPTS = "-server -Xms512m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"

และก็คิดว่าน่าจะทำงานได้ปกติไม่มีปัญหาอะไร แต่พอลอง start server ใหม่ ผลที่ตามมาคือ ไม่แตกต่างจากเดิมเลยครับ ทำเอา งง ไปสักพัก กำหนดอะไรผิดหรือเปล่าเพิ่งมาคิดได้ว่า เนื่องจากทำการ Start Server จาก Eclipse ดังนั้นค่าที่กำหนดใน catalina.bat อาจไม่ได้ช่วยอะไร หรือ ไม่มีผล (รวมทั้ง กำหนดผิดเองหรือเปล่า แต่ที่ผ่านๆมาได้ปกติ ถ้า Start Server โดยไม่ผ่าน Eclipse) พอคิดได้แบบนั้นก็ เอาละ ใส่เข้าไปใน JVM ตอน start ซะเลยสิ้นเรื่อง ก็ทำดังรูป

สามารถทำงานได้ปกติ เป็นอันจบปัญหาเบื้องต้นไป ซึ่งผมเองก็ไม่แน่ใจว่าเป็นทางแก้ไขที่ดีมากน้อยแค่ไหน เพราะงานมันเร่งให้แก้ไขแบบนี้ไปก่อน เดียวพอมีเวลาเหลือแล้วจะมาลองหาวิธีการอื่นๆ ดู

[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