หน้าเว็บ

วันพุธที่ 20 สิงหาคม พ.ศ. 2551

Disable Autorun ของ Thumbdrive, flashdrive

ไปที่ Run พิมพ์ gpedit.msc จะเกิดหน้าต่างขึ้นมา

เลือก Computer Configuration
เลือก Administrative Templates
เลือก System
ดับเบิ้ลคลิก Turn off Autoplay จะเกิดหน้าต่างใหม่ขึ้นมา

ที่แท็บ Setting
เลือก Enabled
เลือก All drives จาก drop-down box
เลือก OK

ที่มา
http://www.llbbl.com/2006/06/13/how-to-disable-autoplay/

ระบบปฏิบัติการ
Windows XP SP2

วันพฤหัสบดีที่ 14 สิงหาคม พ.ศ. 2551

RAS entry creation / modification error

วันนี้ลองลง mobile PhoneTools ที่ติดมากับ Axen EDGE USB Air Card
ซึ่งลงสำเร็จด้วยดี แต่พอจะใช้งานต่อออกอินเตอร์เนตก็เจอ error ดังนี้
RAS entry creation / modification error
ไปเจอหลายๆเวบบอร์ดที่มีคนเจอปัญหาเดียวกัน

วิธีแก้
ไปเปิด service ที่ชื่อว่า Remote Access Connection Manager สั่งให้ start เป็นอันเสร็จ

อุปกรณ์ที่ทดสอบ
Device: Axen EDGE USE Air Card: Model EDGE-180M
SIM: Dtac
Software: mobile PhoneTools ของ BVRP
OS: Windows XP SP2

วันอังคารที่ 12 สิงหาคม พ.ศ. 2551

Twitsig รองรับภาษาไทยได้แล้ว

Twigsig คือการเอาข้อความจาก Twitter ไปแปะเป็น Signature ของเรา เช่นตาม webboard เป็นต้น

ซึ่งตอนแรกได้ทดสอบภาษาไทย แล้วปรากฏว่ามันกลายเป็น"ตัวสี่เหลี่ยม"

ก็เลยทำการติดต่อกับทาง Twitsig เพื่อส่ง font thai ไปให้เค้า โดยผมก็เลือกใช้ Loma จาก ftp://linux.thai.net/pub/ThaiLinux/software/thai-ttf/thai-ttf-0.4.9.tar.gz

แล้วก็ช่วยให้ feedback เค้าในการแก้จนมันออกมาดูค่อนข้างดี (ในสายตาผมนะ)

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

ผมก็เลยบอกว่ามันยังเป็น open problem สำหรับภาษาไทยอยู่ ตอนนี้ก็ให้ force ไปก่อน แล้วถ้าการแข่งขัน BEST2009 จบเมื่อไหร่ ก็น่าจะมี software ดีๆที่มีช่วยในการตัดคำให้เค้าได้

สำหรับถ้าใครจะใช้ภาษาไทย ก็ให้เติม /thai เข้าไปด้วย เช่น http://twitsig.com/thai/kaizerwing.png
(แต่สำหรับไฟล์ .jpg ตอนนี้เหมือนจะยังมี bug)

ถ้าใครมีความรู้ด้านนี้ก็สามารถติดต่อมาทางผมหรือติดต่อทาง twitsig โดยตรงเลยก็ได้ครับ

วันอาทิตย์ที่ 10 สิงหาคม พ.ศ. 2551

แก้ปัญหา พิมพ์ subject ภาษาไทยไม่ได้ใน PHPList

อาการคือ เวลาส่งเมล์ แล้วถ้าพิมพ์หัวข้อ subject พอกด save จะไม่สามารถแสดงภาษาไทยได้ถูกต้อง

สำหรับคนที่ใช้ PHPList โดยไม่ได้เปลี่ยนภาษา (หรือเป็นภาษาอังกฤษ) สามารถไปแก้ที่ไฟล์ /lists/texts/englins.inc

โดยให้แก้จาก
$strCharSet = 'ISO-8859-1';
ให้เป็น
$strCharSet = 'UTF-8';
ก็จะสามารถใช้งานได้

ส่วนในตัว body นั้นก็ให้ไปตั้งค่า html charset และ text charset ใน configure ให้เป็น UTF-8 ทั้งคู่

**เพิ่มเติม
ตอนแรกใช้งานได้ แต่กลับมีปัญหาที่ตัว ภ. (ภ สำเภา) ไม่สามารถแสดงได้ถูก
วิธีแก้เพิ่มคือ ไปที่ไฟล์ admin/mysql.inc
ตรงฟังก์ชัน function Sql_Query($query,$ignore = 0) {
ให้เติม mysql_query("SET NAMES 'utf8'"); เข้าไป
function Sql_Query($query,$ignore = 0) {
mysql_query("SET NAMES 'utf8'");
if (isset($GLOBALS['lastquery'])) {
unset($GLOBALS['lastquery']);
}

แต่ว่าวิธีนี้คือตัวฐานข้อมูลก็ต้องตั้ง ให้เป็น utf-8 ด้วย

ระบบที่ทดสอบ
PHPList: 2.10.5

วันศุกร์ที่ 8 สิงหาคม พ.ศ. 2551

แก้ไขปัญหา Database error 1071 while doing query Specified key was too long; max key length is 1000 bytes ของ PHPList

เนื่องจากถ้าใช้ db เป็น MyISAM จะรองรับ index key ขนาดไม่เกิน 1000 bytes
แต่ว่า user_blacklist_data ใช้ email และ name เป็น index key ซึ่งมีขนาดรวมกันคือ 255+100 = 355 bytes
และถ้าใช้เป็น UTF แต่ละ character จะใช้ 3 bytes รวมเป็น 3*355 = 1065 bytes ซึ่งเกินที่กำหนด

วิธีแก้วิธีแรก สร้างตาราง user_blacklist_data ขึ้นมาเอง โดยลดขนาด email ลงเหลือ 233 bytes แทน ซึ่งปกติก็ไม่ค่อยมีใครใช้ถึงอยู่แล้ว
CREATE TABLE phplist_user_blacklist_data (email varchar(233)
not null unique,name varchar(100) not null,data text,index
emailidx (email),index emailnameidx (email,name))


หรือวิธีที่สอง ให้ใช้ InnoDB แทน MyISAM จะไม่เกิดปัญหานี้

ระบบที่ทดสอบ
PHPList: 2.10.5

ข้อมูลจาก
http://forums.phplist.com/viewtopic.php?t=8150
http://mantis.phplist.com/bug_view_advanced_page.php?bug_id=8583

วันพฤหัสบดีที่ 7 สิงหาคม พ.ศ. 2551

แก้ PHPList ให้ทำงานกับ SMTP แบบ TLS

บังเอิญช่วงนี้ผมกำลัง implement ระบบ newsletter ให้กับองค์กรแห่งหนึ่งอยู่ ซึ่งผมก็เลือก PHPList มาใช้เพื่อการนี้

แต่คราวนี้มีปัญหาเกิดขึ้น เมื่อผมพยายามจะใช้ PHPList ส่งเมล์ โดยใช้ SMTP ขององค์กรแห่งนี้

ปัญหาคือว่า องค์กร นี้ใช้ SMTP Authentication, TLS, port 25

แต่ตัว PHPList เวอร์ชันล่าสุดที่ผมใช้นั้นคือ 2.10.5 นั้นไม่รองรับ TLS เพราะว่าลองไปดู module ในการส่งเมล์ของ PHPList จะเห็นว่ามันใช้ PHPMailer เวอร์ชัน1.73 (ดูจากไฟล์ Changelog อันบนสุด) แต่ว่าตัวที่จะรองรับต้องเป็น PHPMailer เวอร์ชัน 2 ขึ้นไป

ก็เลยลองไปโหลดเอา PHPMailer 2.2.1 มา แล้วทำกระบวนการตาม http://www.bookwish.org/phplist-and-gmail-smtp โดยทำการดัดแปลงเล็กน้อยจาก gmail ที่เป็น ssl ให้เป็น tls ดังนี้

สรุปคือ

1. extract PHPMailer 2.2.1 ออกมาจะได้โฟลเดอร์ชื่อ phpMailer_v2.2.1_ แล้วเอาไปไว้ที่ %YOURWWWROOT%/lists/admin โดย %YOURWWWROOT% เป็นที่อยู่ของ public_html หรือ htdocs หรือ wwwroot ของคุณ
2. แก้ไขไฟล์ %YOURWWWROOT%/lists/admin/class.phplistmailer.php
require_once dirname(__FILE__).'/accesscheck.php';

#require( dirname(__FILE__) . '/phpmailer/class.phpmailer.php');
require( dirname(__FILE__) . '/phpmailer_v2.2.1_/class.phpmailer.php');
require( dirname(__FILE__) . '/phpmailer_v2.2.1_/class.smtp.php');


3. ในไฟล์เดียวกัน แก้ฟังก์ชัน PHPlistMailer
...
if (isset($GLOBALS['phpmailer_smtpuser])...
$this->SMTPAuth=true;
$this->SMTPSecure="tls";
$this->Port=$GLOBALS['phpmailer_smtpport'];
$this->Username=$GLOBALS['phpmailer_smtpuser'];
$this->Password=$GLOBALS['phpmailer_smtppassword'];
...

4. ในไฟล์เดียวกัน ต่อจากเดิมลงมาหน่อย แก้
if (!$this->Host || $ip == $this->Host) {
$this->Mailer = "mail";
# logEvent('Sending via mail');
} else {
$this->Mailer = "smtp";
# logEvent('Sending via smtp');
}

ให้เป็น
if (!$this->Host) {
$this->Mailer = "mail";
# logEvent('Sending via mail');
} else {
$this->Mailer = "smtp";
$this->IsSMTP();
# logEvent('Sending via smtp');
}


5.แก้ไฟล์ %YOURWWWROOT%/ lists/config/config.php

...
define("PHPMAILERHOST",'mail.yoursmtpdomain.com');
...
$phpmailer_smtpuser='smtp username';
$phpmailer_smtppassword='smtp password';
$phpmailer_smtpport=25;
...

เป็นอันใช้ได้

ระบบที่ทดสอบ

PHPList: 2.10.5

Web Server: Apache2.2

Database: MySQL5

วันอังคารที่ 29 กรกฎาคม พ.ศ. 2551

การสร้าง Java class เพื่อใช้กับประเภทข้อมูลของ TinyOS

ในการเขียนโปรแกรมภาษา nesC นั้นส่วนใหญ่จะมีการสร้างประเภทตัวแปรไว้สำหรับจัดการกับ message ที่ส่งในระบบ หรือมีการประกาศค่าคงที่ต่างๆที่จะนำไปใช้ได้ โดยมักจะประกาศในไฟล์ .h หรือ header ไฟล์ เช่นเดียวกับภาษา C
แต่ถ้าเราจะเขียนโปรแกรมภาษาจาวาเพื่อทำการติดต่อข้อมูลกับระบบ sensor network ที่เขียนด้วยภาษา nesC นั้น เราก็จะต้องมีการสร้าง class บนภาษา Java เพื่อมารองรับ message นั้นๆ
ซึ่งใน TinyOS นั้นจะมี tool ที่ช่วยให้เราทำงานนี้ได้สบายขึ้น คือ MIG และ NCG

MIG
- Message Interface Generator
ตัวนี้จะเป็นตัวที่ใช้สร้าง class Java เพื่อจะรองรับ message ที่เราสร้างขึ้น

NCG- NesC Constant Generator
ตัวนี้จะทำหน้าที่ดึงค่า constant ต่างๆที่เราประกาศไว้ออกมาใส่ใน class Java

ก่อนอื่นผมขอสมมติว่า ผมทำ nesC app ไว้ที่ /opt/tinyos-1.x/apps/MyApp
โดยใน MyApp มีโฟลเดอร์ชื่่อ types ที่ใช้เก็บ header file ที่ใช้ประกาศประเภทข้อมูล message เอาไว้
และใน types มีไฟล์ชื่อ MyMsg.h ซึ่งภายในไฟล์มีการประกาศค่าคงที่ AM_TYPE และ message ไว้ คือ
// ไฟล์ MyMsg.h
enum AM_TYPE
{
AM_PINGMSG = 20,
AM_PINGREPLYMSG = 21,
};

typedef struct PingMsg
{
uint16_t hostid;
uint16_t seqno;
} PingMsg;

typedef struct PingReplyMsg
{
uint16_t hostid;
uint16_t seqno;
uint16_t origin;
uint16_t parent;
uint16_t depth;
} PingReplyMsg;

คราวนี้เราจะมาสร้าง class java โดยใช้ structure จากค่าเหล่านี้กัน

สมมติว่าเราจะสร้าง class java เอาไว้ใน MyApp/java ให้ทำการสร้างไฟล์ชื่อ Makefile เอาไว้ใน MyApp/java โดยมีเนื้อหาดังนี้ (สำหรับใครที่อ่านแล้วงงๆ ลองศึกษาเรื่องมีวิธีการทำ Makefile http://frank.mtsu.edu/~csdept/FacilitiesAndResources/make.htm)
// ไฟล์ Makefile
TOS = $(shell ncc -print-tosdir)
APPDIR = $(TOS)/../apps/MyApp

MIG = mig java
NCG = ncg java

MSGS = PingMsg.java ReplyPingMsg.java
CONST = PingConst.java

INITIAL_TARGETS = $(MSGS) $(CONST)

OTHER_CLEAN = cleanmig

ROOT = ../../../tools/java
include $(ROOT)/Makefile.include

PingMsg.java:
$(MIG) -java-classname=PingMsg $(APPDIR)/types/MyMsg.h PingMsg -o $@
$(JAVAC) $@

PingReplyMsg.java:
$(MIG) -java-classname=PingReplyMsg $(APPDIR)/types/MyMsg.h PingReplyMsg -o $@
$(JAVAC) $@

PingConst.java:
$(NCG) -java-classname=PingConst $(APPDIR)/types/MyMsg.h AM_PINGMSG AM_PINGREPLYMSG -o $@
$(JAVAC) $@

cleanmig:
rm -f $(MSGS) $(CONST)

โดยมีส่วนที่สำคัญคือ
MIG = mig java
NCG = ncg java

จะเป็นการสร้างค่าเพื่อใช้เรียกคำสั่ง mig และ ncg โดยให้สร้างเป็น class ประเภท java
MSGS = PingMsg.java ReplyPingMsg.java
CONST = PingConst.java

เป็นการระบุว่าเราจะสร้าง class ชื่ออะไรออกมาบ้าง ในที่นี่คือ PingMsg.java, ReplyPingMsg.java และ PingConst.java เพื่อเป็นประโยชน์เวลาสั่ง clean จะได้ตามลบได้หมดทุกตัว นั่นคือมันจะทำการ clean ทุกไฟล์ที่มีการประกาศไว้ใน MSGS และ CONST (ดูในโค้ด makefile ส่วนที่เป็น cleanmig ด้านล่างสุด) เพราะเวลาเราสั่ง make clean มันจะดูที่ค่าคงที่ OTHER_CLEAN ที่ประกาศไว้ ซึ่งในที่นี้เราให้เป็น cleanmig มันก็จะไปทำ cleanmig ซึ่งลบทุกอย่างที่ประกาศไว้ใน MSGS และ CONST นั่นเอง

include $(ROOT)/Makefile.include
ใช้ในการระบุ makefile ที่จะใช้ในการ compile java โดยไฟล์นี้จะชี้ไปที่ /opt/tinyos-1.x/tools/java/Makefile.include

PingMsg.java:
$(MIG) -java-classname=PingMsg $(APPDIR)/types/MyMsg.h PingMsg -o $@
$(JAVAC) $@

ทำการสร้างไฟล์ชื่อ PingMsg.java โดย
-java-classname เป็นการระบุชื่อไฟล์ java
$(APPDIR)/types/MyMsg.h เป็นการระบุ nesC header ไฟล์ที่เราต้องการจะดึงค่าออกมา
PingMsg เป็นชื่อ struct ที่เราประกาศไว้ใน nesC ไฟล์และจะเอามาทำเป็น java class
-o $@ สร้าง output ชื่อว่า PingMsg.java (@ คือชื่อที่เขียนไว้ที่บรรทัด PingMsg.java:)
$(JAVAC) $@ ทำการคอมไพล์ (ข้อควรระวัง เว้นวรรคด้านหน้านั้น ให้ใช้ tab(\t) หนึ่งครั้ง ห้ามเป็นเครื่องหมาย space ต่อกันหลายครั้ง)

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

พอสุดท้ายเราก็จะได้ PingMsg.java PingMsg.class PingReplyMsg.java PingReplyMsg.class PingConst.java และ PingConst.class เพื่อเอาไปใช้ในโปรแกรม java ของเราได้

ระบบที่ใช้ทดสอบ
TinyOS: 1.1.15 on cygwin