Eclipse Helios is here! (Eclipse 3.6)

July 4th, 2010

ต้องยอมรับว่าหลังๆผมมีโอกาสได้ใช้ Eclipse น้อยมาก ณ ปัจจุบันผมยังใช้ Ganymede (3.4) อยู่เลยเนื่องด้วยจำเป็นต้องใช้ Plugins หลายตัวที่ยังไม่รองรับ Galileo (3.5) เช่น Flex3, Force.com IDE

เรียกได้ว่าผมไม่เคยใช้ Galileo กับงานจริงเลยก็ว่าได้แม้ว่าอยากจะใช้มากก็ตามที แต่ก็ยังแอบลุ้นว่าในอนาคตจะได้ใช้มันมากขึ้น โดยเฉพาะกับงานทางด้าน Java อย่างที่ผมเคย tweet เมื่อนานมาแล้วว่าเขียนภาษาอะไรก็ไม่มันส์เท่าเขียน Java จริงๆ

แต่ไม่ว่าจะอย่างไหร่ก็ตาม ทาง Eclipse Foundation ก็ยังคงออกตามแพลนที่วางไว้คือ Eclipse จะมี release ทุกปี โดยการรวบรวมโปรเจคในรอบหนึ่งปีนั้นๆมารวมกัน โดยปีนี้ชื่อของมันคือ Helios

สิ่งที่น่่าสนใจของ Helios ไม่ใช่เรื่อง Feature ใหม่ๆ (ซึ่งสามารถดูรายละเอียดได้จาก link ด้านล่าง) แต่เป็นความน่าจะเป็นที่ Eclipse และ NetBeans (ที่เพิ่งออก 6.9) มีโอกาสจะได้ join กัน (แต่แน่นอนคงหลังจาก Helios) เนื่องจาก ณ ปัจจุบัน Oracle ที่เป็นสมาชิกของ Eclipse Foundation นั้นได้สิทธิ์ขาดในการควบคุมการพัฒนา NetBeans เพราะการเข้าซื้อ Sun ของ Oracle นั่นเอง

คงต้องดูกันต่อไปครับว่าการสงบศึกในบ้าน Java ระหว่าง Eclipse กับ NetBeans จะมีอะไรดีๆออกมาบ้าง เช่น รวม Community, แชร์ Plugins ฯลฯ

สุดท้ายคือ link ที่น่าสนใจเกี่ยวกับ Helios ครับ

- Helios Home
- Helios Projects มีทั้งหมด 39 projects ที่น่าสนใจคือมี Git กับ JavaScript Development Tools มาในตัว
- Helios Demos
- Helios In Action

ความแตกต่างระหว่าง Software, Application, และ Program

June 20th, 2010

พอดีวันก่อนมีคนถามว่า Software, Application, และ Program นี่มันแตกต่างกันยังไง

ก่อนจะอธิบายด้วยคำพูด มาดูรูปกันก่อนดีกว่าครับ

จากภาพข้างต้นแสดงให้เห็นว่า ระบบคอมพิวเตอร์ (Computer System) ประกอบไปด้วย

- Hardware หรือ Machine นั่นเอง โดยอาจเป็นเครื่องจริงๆ หรือ Virtual Machine เช่น VMware/VirtureBox/VirtualPC ก็ได้

- Software ที่ทำงานอยู่ใน Hardware ข้างต้น ไม่ว่าจะเป็น OS เช่น Windows/Linux/Mac หรือ Game, Web Browser ก็ล้วนแต่เป็น Software

- Program คือส่วนย่อยของ Software กล่าวคือ Software หนึ่งตัวจะประกอบขึ้นมาจาก Program หลายๆตัวนั่นเอง ถ้าใน Software Project ขนาดใหญ่ เราอาจจะได้ยินการประเมิณว่าใน Software ตัวนี้มี Program ย่อยทั้งหมดเท่าไหร่

โอเค ดูเหมือนเราจะเริ่มเข้าใจว่า Software และ Program คืออะไร แล้ว Application ล่ะ?

ก็ขอยกภาพมาให้ดูก่อนที่จะอธิบายด้วยคำพูดเหมือนเดิม

จากภาพข้างต้นแสดงให้เห็นว่า ประเภทของ Software นั้นมีมากมายหลายแบบ รวมไปถึง Application ก็เป็นหนึ่งในประเภทของ Software

โดย Application นั้นคือ Software ที่ใช้เพื่อช่วยการทำงานของผู้ใช้ (User) ดังนั้น Application จะต้องมีสิ่งที่เรียกว่า ส่วนติดต่อกับผู้ใช้ (User Interface หรือ UI)

นอกจากนี้เรายังสามารถแบ่ง Application ออกเป็นประเภทย่อยๆ ตามสภาพแวดล้อมการทำงาน (Environment หรือ Platform) ของมัน เช่น

- Desktop Application คือ Application ที่ทำงานบนเครื่อง Desktop Computer เช่น PC หรือ Mac เป็นต้น

- Mobile Application คือ Application ที่ทำงานบน Mobile Device เช่น โทรศัพท์มือถือ เป็นต้น

- Web Application คือ Application ที่ทำงานบน Web เช่น Gmail เป็นต้น

โดย Web App อาจแบ่งออกไปอีกเป็น Intranet Application กับ Internet Application โดย Intranet หมายถึงมีการใช้งานแต่ภายในองค์กร ซึ่งตรงข้ามกับ Internet ที่เป็น World Wide Web นั่นเอง

ในยุค Web 2.0 เราอาจได้ยินคำที่พัฒนาต่อมาจาก Internet Application คือ RIA ที่ย่อมาจาก Rich Internet Application โดยหลักการแล้ว RIA คือ Application ที่ยังใช้ Web Technologies แต่มีการพัฒนาให้มี UI ในฝั่ง Client ที่ดีเหมือนๆกับการใช้ Desktop Application เพื่อสร้างประสบการณ์ที่ดีให้กับผู้ใช้ (User Experience หรือ UX) เช่น ไม่มีการ Refresh หน้าจอ มีลูกเล่น Dynamic ในการแสดงผลมากมายกว่า Internet Application แบบเดิมๆ

นอกจากนี้เราอาจเคยได้ยินคำที่เกี่ยวของกับ Application ตามมามากมาย เช่น

- iPhone Application คือ Application ที่ทำงานอยู่บน iPhone OS

- Facebook Application คือ Application ที่ทำงานอยู่บน Facebook Platform

- Google App Engine คือ ระบบ Cloud ของ Google เพื่อรัน Web Application

การบันทึก State ของ iPhone App ด้วย NSUserDefaults

June 14th, 2010

การบันทึก State ของ iPhone App คืออะไร?

มันคือการบันทึกค่าต่างๆ เพื่อที่ว่าเมื่อ user ปิด app แล้วเปิดขึ้นมาใหม่ก็จะได้ค่าเดิม เทียบได้กับ INI file ของ Windows นั่นเอง

สื่งที่ต้องทำมีสองส่วนคือ ตอน Save กับตอน Load ค่า

1. การ Save state ควรเรียกทุกครั้งที่มีการยืนยันการเปลี่ยนแปลงค่า บางท่านชอบ save ตอนจะปิดโปรแกรมทีเดียว (ใน applicationWillTerminate) ซึ่งมักจะเจอปัญหาว่าถ้าเครื่อง hang ค่าก็จะไม่ทันได้ save

1
2
3
NSUserDefaults *defaults =  [NSUserDefaults standardUserDefaults];
[defaults setInteger:myValue forKey:@"myKey"];
[defaults synchronize];

จากตัวอย่างข้างต้นเป็นการ save ค่า integer ของตัวแปรชื่อ myValue ด้วยชื่อ key ว่า myKey
จะเห็นว่ามีการเรียก [defaults synchronize] ด้วย เป็นการบอกว่าให้ save ค่านี้ทันที

2. การ Load state ควรจะเรียกครั้งแรกครั้งเดียวตอนเปิดโปรแกรม

1
2
3
4
5
NSUserDefaults *defaults =  [NSUserDefaults standardUserDefaults];
int myValue = [defaults integerForKey:@"myKey"];
if(myValue) {
	//set default value for myValue
}

จากตัวอย่างข้างต้นเป็นการ load ค่าจาก key ที่ชื่อว่า myKey มาใส่ตัวแปรชื่อ myValue
โดยหากหากไม่มีค่า (เช่น เปิดใช้โปรแกรมเป็นครั้งแรก) ก็จะให้ใช้ค่า default แทน

นอกจาก integer ตามตัวอย่างข้างต้นแล้ว เรายังสามารถบันทึกค่าประเภทอื่นๆได้อีก แนะนำให้อ่านที่ NSUserDefaults Class Reference ครับ

ทุกอย่างที่คุณควรรู้กับ Java เมื่อกษัตริย์คืนบัลลังก์

June 9th, 2010

ไม่มีอะไรมากครับ ตั้งชื่อล้อหัวข้อข่าวของ mk ณ Blognone เท่านั้นเอง

เรื่องของเรื่องคือ แม้ว่าความนิยมของ Java จะลดลงเรื่อยๆ ถึงขนาดเมื่อเดือนก่อน (May 2010) ก็หล่นจากบัลลังก์มาอยู่อันดับ 2
แต่เดือนนี้แม้ % ความนิยมจะยังลดลงต่อเนื่อง แต่เมื่อเทียบกับคู่แข่งแล้วก็ยังสามารถกลับมาอยู่อันดับ 1 ได้
และคาดว่าคงจะขึ้นๆลงๆแบบนี้อีกหลายรอบซะด้วย

สำหรับคนที่ใช้ Java อยู่ไม่ต้องกังวลนะครับ ว่าภาษาจะล้มหายตายจากไปในเร็ววันนี้
Java ยังคงได้รับความนิยมอยากมากในงาน Enterprise เนื่องจากการพลักดันของยักษ์ใหญ่ในวงการ ไม่ว่าจะเป็น IBM, Oracle, SAP เป็นต้น
หรือวงการ Open source ก็ยังมีการใช้ Java อีกมากเช่น Apache, Eclipse, Spring, หรือแม่กระทั่ง Google
หรือแม้แต่ Mobile App อย่าง Android หรือ Blackberry ก็ยังใช้ Java เป็นหลักในการพัฒนา App

ที่น่าสนใจนอกจาก Java แล้วก็ยังมี Objective-C ที่ขึ้นเอาขึ้นเอาไม่ยอมหยุด
ล่าสุดหลังจากที่ขึ้นมาติด top 10 ได้แล้ว ก็ยังขึ้นต่อจนตอนนี้ อันดับ 9 แล้ว
ต้องดูกันต่อครับว่าจะแรงได้นานแค่ไหน

ดูอันดับที่เหลือทั้งหมดได้ที่นี่ครับ
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

How to use autorelease in Objective-C and iPhone SDK

June 6th, 2010

จากคราวที่แล้วที่ผมพูดเกี่ยวกับ Memory Management in Objective-C and iPhone SDK ด้วยการใช้ alloc และ release

วันนี้เราจะมาดูกันว่าวิธีการใช้ autorelease นั้นดีกว่ายังไง

เดิมนั้นในการสร้าง instance จาก Class นั้นเราจะเขียน code ประมาณนี้

1
2
3
MyClass *myObj = [[MyClass alloc] init];
//Do something with myObj
[myObj release];

โดย alloc เป็น class method (เทียบได้กับ static method ใน Java/C++) ทำหน้าที่สร้าง instance เปล่าๆขึ้นมา
ส่วน init เป็น instance method ทำหน้าที่กำหนดค่าเริิ่มต้นให้กับ instance นั้น

เราจะดัดแปลงการสร้าง instance ของ MyClass ให้มีประสิทธิภาพมากขึ้นดังนี้
- ไม่ต้องมีการเรียกใช้ alloc และ release
- เปลี่ยนจากการเรียกใช้ init ที่เป็น instance method ไปเป็นการเรียกใช้ class method เพื่อสร้างและกำหนดค่าเริ่มต้นให้กับ instance พร้อมๆกัน

โดย Code ที่จะเรียกใช้จะเป็นดังนี้

1
MyClass *myObj = [MyClass getInstance];

จะเห็นว่าไม่มีการเรียกใช้ alloc, release และเปลี่ยนการเรียก init มาเป็น getInstance แทน (ชื่อ getInstance เป็นชื่อที่เรากำหนดได้เอง)

มาดูในส่วนของ Implementation ของ MyClass บ้างว่าต้องแก้ไขอย่างไร

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#import "MyClass.h"
@implementation MyClass
 
+ (MyClass *)getInstance {
	MyClass *myObj = [[MyClass alloc] init];
	[myObj autorelease];
	return myObj;
}
 
- (id)init {
	if (self = [super init]) {
		//Do init own instances
	}
	return self;
}
 
- (void)dealloc {
	//Do release own instances
	[super dealloc];
}
@end

ส่วนที่เราเพิ่มเข้าไปในบรรทัดที่ 4-8 คือ
- การ implement method ที่ชื่อ getInstance โดยการทำงานคือ encapsulate ในส่วนของการเรียก alloc และ init ที่ก่อนหน้านี้ถูกเรียกอยู่ภายนอก
- แทนการเรียกใช้ release ด้วย autorelease

โดยใน MyClass.h เราต้องมีการประกาศ getInstance ด้วย เนื่องจากเป็น method ใหม่ที่เรากำหนดขึ้นมาเอง

สรุปได้ว่าเราใช้ getInstance ข้างต้นเพื่อ encapsulate การจองและคืนหน่วยความจำนั่นเอง

นอกจากนี้เรายังสามารถกำหนด method ที่หลากหลาย เพื่อที่จะสร้าง instatnce ที่มีคุณสมบัติแตกต่างกันได้ ดังตัวอย่างนี้

1
+ (MyClass *)getInstanceWithName:(NSString *)name;

วิธีข้างต้นเป็น Best Practice ที่ใช้กันอย่างแพร่หลายใน Class มาตรฐานของ Obejctive-C เช่น NSString ที่มี method ที่ใช้สร้าง instance ชื่อ string และ stringWithFormat เป็นต้น

Memory Management in Objective-C and iPhone SDK

June 5th, 2010

เนื่องจากข้อจำกับของ iPhone SDK ทำให้ไม่สามารถมี Garbage Collector ได้ ดังนั้นเราจึงต้องมาจัดการในเรื่องการจองและคืนหน่วยความจำเอง

สอง method หลักๆที่เราต้องเรียกในครั้งนี้คือ

1. alloc เทียบได้กับ malloc ใน C

2. dealloc เทียบได้กับ free ใน C โดยเราจะไม่เรียกใช้ตรงๆแต่จะเรียกผ่าน release method

มาดูตัวอย่างกันดีกว่า

1
2
3
MyClass *myObj = [[MyClass alloc] init];
//Do something with myObj
[myObj release];

จากตัวอย่างข้างต้น
- เรามีการจองหน่วยความจำด้วย alloc และเรียก init ของ instance นั้น (เทียบได้กับ contructor ใน Java/C++)
- หลังจากเราใช้งาน instance นี้เสร็จแล้ว เราก็ทำการคืนหน่วยความจำด้วยการเรียก release

มาดูในส่วนของ Implementation ของ MyClass บ้างว่าต้องทำอะไร

MyClass.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import "MyClass.h"
@implementation MyClass
 
- (id)init {
	if (self = [super init]) { 
		//Do init own instances
	} 
	return self;
}
 
- (void)dealloc {
	//Do release own instances
	[super dealloc];
}

จากตัวอย่างข้างต้นเรามี 2 methods คือ
- init ที่ถูกเรียกหลังจากจองหน่วยความจำด้วยการเรียก alloc แล้ว
- และ dealloc ที่จะทำงานเมื่อมีการเรียก release นั่นเอง
ทั้ง 2 methods นั้นเป็นการ override มาจาก Base Class (NSObject) ดังนั้นเราจึงไม่ต้องประกาศใน MyClass.h ส่วน alloc นั้นเราไม่ต้อง implement ครับ

ในคราวหน้าผมจะพูดถึงเกี่ยวกับการใช้ autorelease แทน release ซึ่งจะช่วยลดความสับสนว่าเมื่อไหร่ควรจะเรียก release ครับ

วิธีการเปลี่ยน __MyCompanyName__ ใน Xcode

June 4th, 2010

ช่วงนี้งานอดิเรกเป็น Objective-C ครับ

สำหรับใครที่เคยเจอว่า new file หรือ new project แล้ว file template แสดงชื่อบริษัทเป็น __MyCompanyName__

วิธีแก้ให้พิมพ์คำสั่งนี้ใน terminal (แทน www.choopong.com ด้วยชื่อบริษัทของคุณ) จากนันก็ restart Xcode ใหม่ก็จะได้ชื่อบริษัทที่ต้องการเวลา new file หรือ new project แล้วละครับ

defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions -dict ORGANIZATIONNAME "www.choopong.com"

วิธีการเรียกใช้ External EXE file จาก Flash (Windows App เท่านั้น)

May 26th, 2010

วันนี้มีโจทย์มาว่าใน Flash (Windows App) ต้องทำ Link ให้สามารถเปิดสิ่งต่อไปนี้ได้
1. PowerPoint file (*.ppt)
2. E-Mail Client (mailto:)
3. Windows Live Messenger (exe file)
4. Skype (exe file)
5. Google Talk (exe file)

สองตัวแรกไม่มีปัญหา
- PowerPoint file ใช้ fscommand เปิด ppt file ที่อยู่ใน fscommand folder ได้ เพราะอยู่ใน sandbox อยู่แล้ว
- mailto นี่ตรงไปตรงมาทำ URL เป็น mailto:who@where.com ก็ได้เลย

ไอ้สามตัวหลังนี่แหละที่มีปัญหา ถ้าดูตามเอกสาร fscommand ของ Adobe จะบอกไว้ชัดเลยว่า exec ของ fscommand จะเรียกได้เฉพาะไฟล์ใน fscommand folder เท่านั้น อ้าว แล้วพวก exe ข้างนอกละจะเรียกได้ไง

ตอนแรกคิดแบบง่ายเข้าว่า ทำ proxy เองเป็น .bat เช่น googletalk_proxy.bat เขียนดังนี้

1
"C:\Program Files\Google\Google Talk\googletalk.exe"

แล้วใน Flash เรียกแบบนี้

1
fscommand("exec", "googletalk_proxy.bat");

แต่ชีวิตมันไม่ง่ายเหมือนการ์ตูนแบบนั้น ดูเหมือน Flash จะมีปัญหาการเรียก .bat บนตระกูล NT เช่น 2000/XP/Vista
วิธีการมันเลยต้องซับซ้อนอีกหน่อยดังข้างล่าง

Flash <-> Proxy.exe <-> Proxy.bat <-> Any.exe

คือต้องเพิ่ม exe อีกตัวนึงเพื่อเป็น Proxy ไปเรียก .bat ซึ่ง Mr.Tim Goss ได้ทำเอาไว้ให้แล้ว
โดยหลักการมันจะเป็น naming convention คือเรียก .bat ที่ชื่อเหมือนกับ .exe ให้เอง เช่นถ้าจะเรียก GoogleTalk เราอาจตั้งชื่อไฟล์แบบนี้

googletalk_proxy.exe
googletalk_proxy.bat

โดยทั้งสองไฟล์อยู่ใน fscommand folder
จากนั้นใน googletalk_proxy.bat จะเขียนดังนี้

1
"C:\Program Files\Google\Google Talk\googletalk.exe"

แล้วใน Flash จะเรียกแบบนี้

1
fscommand("exec", "googletalk_proxy.exe");

ผมทดสอบกับอะไรบ้าง
- Flash 9 AS3
- Windows XP SP3
- Admin role user

สรุปสิ่งที่ต้องทำมีอะไรบ้าง
1. Flash ต้อง publish เป็น exe เท่านั้น
2. ไฟล์ที่เกี่ยวข้องได้แก่ proxy.bat กับ proxy.exe ต้องอยู่ใน subfolder ชื่อ fscommand โดย folder นี้อยู่ระดับเดียวกันกับไฟล์ flashapp.exe ของเรา
3. การตั้งชื่อไฟล์ proxy.exe จะเป็น naming convention ให้ตรงกับ .bat เช่น googletalk_proxy.exe จะเรียกไฟล์ googletalk_proxy.bat ให้เอง

Remarks
1. ถ้าไม่ใช้ Flash เพรียวๆ สามารถใช้ Flash Wrapper เช่น Zinc ก็สามารถแบบข้างต้นได้
2. ดูเหมือนใน AIR 2.0 จะมีความสามารถเกี่ยวกับการเรียกไฟล์ที่ดีขึ้น แต่เนื่องจากยังเป็น Beta อยู่ และผมยังไม่มีโอกาสเอา Flash CS5 มาลองด้วย เลยใช้วิธีข้างต้นไปก่อน
3. งานนี้ถ้าไม่จำเป็นต้องใช้ Flash ผมว่าใช้ VB จะ VB6 หรือ VB.NET ก็ได้ ง่ายสุด :P

บริเวณที่ปิดการจราจรและห้ามเข้าพื้นที่เด็ดขาด

May 18th, 2010

บริเวณที่ปิดการจราจรและห้ามเข้าพื้นที่เด็ดขาด มีดังนี้
1 ถ.เพชรบุรี ตั้งแต่ แยกขึ้นทางด่วนเพชรบุรี ถึง สี่แยกราชเทวี
2 ถ.พญาไท ตั้งแต่ สี่แยกราชเทวี ถึง สี่แยกสามย่าน
3 ถ.วิทยุ ตั้งแต่ สี่แยกถ.วิทยุ ถึง แยกขึ้นทางด่วนเพชรบุรี
4. ถนนในพื้นที่ต้องห้าม ตามข้อ 1 – 3 จนถึงแนวพระราม 4
5. ถ.ราชปรารภ ถึง สี่แยกประตูน้ำ ถึง สี่แยกมักกะสัน
6. ถ.ศรีอยุธยา จากแยกหมอเหล็ง มุ่งหน้ าแยกศรีอยุธยา
7. ถ.สามย่าน จนถึง ปากซอยงามดูพลี
8. ตึกใบหยก2 ถึง แยกราชปรารภ ถึง แยกดินแดง
***[บริเวณนี้ห้ามเข้าเด็ดขาดทหารใช้กระสุน จริง]
9. แยกราชปรารถ ถึง ซ.รางน้ำ
***[บริเวณ นี้ห้ามเข้าเด็ดขาดทหารใช้กระสุนจริง]
10. วิภาฯขาเข้า หน้ารร.Miracle Grand ทหารตั้งด่าน ปิดเหลือ 1 เลน
11. แยกพระราม9 ถึง fortuneมุ่งหน้าไปยังโบสถ์แม่พระ สามเหลี่ยมดินแดง
12. อนุสาวรีย์ชัย หน้าซอยดุสิต (ราชวิถี 5) และราชวิถี 7
13. ทางด่วน ปิดทางขึ้น-ลงเพชรบุรี และทางขึ้น-ลง พระราม 4 ทั้ง 2 ฝั่ง
14. ย่านบ่อนไก่ *****พื้นที่ใช้กระสุนจริง
15. ทางด่วนใช้ได้ปกติ แต่ปิดทางลงบางส่วน เช่น ทางขึ้น-ลงดินแดง ทางขึ้น-ลงเพชรบุรี ทางขึ้น-ลงพระราม4
16. อนุสาวรีย์ถูกปิดแล้วครับ
17. ถนนพระราม 4 ปิด ระหว่างแยกสามย่าน-สามแยกคลองเตย
18. ปิดการจราจรลงด่วนพระราม4-1 ด่านพระราม4-2 ลงด่านดวงพิทักษ์ ถ้าลงด่านเพลินจิตซ้ายนานาใช้การได้
19. ถ.เพชรบุรี ขาเข้า ปิดขยายถึงแยก อโศก-เพชรฯ
20. ปิดถ.พระราม4 แยกสามยาน-สะพานเหลือง ต่อเนื่อง ถ.บรรทัดทอง แยกเจริญผล
21. เลี่ยงการจราจรสะพานข้ามแยกคลองเตย นปช.จอดรถปิดขวางถนน
22. นปช.เผายางรถยนต์กลางสะพานกรุงธนบุรี (ซังฮี้)ขาเข้า /หลีกเลี่ยงเส้นทางด่วน

บุคคลใดมีบ้านแถวถนนที่ห้ามนี้ ให้พกบัตรประชาชน + ทะเบียนบ้าน เพื่อรับสติ๊กเกอร์ผ่านทางจากเจ้าหน้าที่ ขณะนี้แนะนำให้ออกอจากบริเวณอันตรายไปพักที่อื่น

วิธีการ limit จำนวน Items ในการดึง Feed แต่ละครั้งของ SMF

May 3rd, 2010

ต่อจากครั้งที่แล้ว วิธีการดึง Feed ของ SMF เฉพาะ New Topics อาจจะเคยเจอปัญหาว่า Feed Reader เก็บกระทู้ได้ไม่หมด

เนื่องจากว่าค่า Default ของ SMF จะคืน Feed ให้ครั้งละ 5 Items เท่านั้น ทำให้ถ้า Feed Reader เข้ามาดึงไม่บ่อยพอ ก็อาจเกิดการพลาดกระทู้ได้

วิธีแก้ก็แค่เพิ่ม parameter เข้าไปที่ Default Feed URL ดังข้างล่าง

http://www.simplemachines.org/community/index.php?type=rss;action=.xml;sa=news;limit=200

เพียงเท่านี้เราก็จะดึง Feed ของ SMF ครั้งละ 200 topics แล้ว

ป.ล. เท่าที่ลองมาหลายเว็บที่ใช้ SMF การเพิ่มตัวเลขให้มากกว่า 200 ไม่มีประโยชน์อะไรเลย เว็บส่วนใหญ่จะคืนค่าที่ประมาณ 140-160 items เอาไว้ผมจะลองตรวจสอบดูอีกทีว่าตัวเลขนี้มีการกำหนดไว้ตรงไหน