Archive for the ‘Uncategorized’ Category

How to use autorelease in Objective-C and iPhone SDK

Sunday, 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

Saturday, 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

Friday, 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 เท่านั้น)

Wednesday, 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

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

Tuesday, 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

Monday, 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 เอาไว้ผมจะลองตรวจสอบดูอีกทีว่าตัวเลขนี้มีการกำหนดไว้ตรงไหน

วิธีการดึง Feed ของ SMF เฉพาะ New Topics

Thursday, April 22nd, 2010

ต้องยอมรับว่าปัจจุบัน SMF น่าจะเป็น Forum ที่ได้รับความนิยมมากที่สุด (แต่ไม่ได้หายความว่าดีที่สุดนะ) ทำอันดับใน Search Engine ก็เก่ง
และมี Feed ในตัวก่อนเจ้าไหนๆ เช่น PhpBB เป็นต้น

โดย default ของ SMF นั้น Feed ของมัน ไม่ว่าจะรวมกระทู้ทั้งเว็บ หรือเฉพาะบางห้องที่กำหนดก็ตาม มันจะแสดง Recent Posts ทั้งหมด นั้นรวมไปถึง New Topics และ New Reply ด้วย

ซึ่งบางครั้งน่ารำคาญมากกับกระทู้ประเภท “มีของมแจกครับ ทิ้งเมลไว้เลย” เพราะ Reply จะล้นหลามมาก ส่งผลได้ Feed ไร้สาระเยอะ

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

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

เพียงเท่านี้เราก็จะดึง Feed ของ SMF เฉพาะ New Topics แล้ว

แกปัญหา .htaccess ของ Drupal กับ URL แบบ User Directory

Wednesday, April 21st, 2010

สำหรับใครที่ใช้ Drupal มาคงทราบว่ามันฉลาดมาก

ไม่ว่าเราจะย้าย directory ไปไว้ที ่root ของ domain เช่น

http://192.168.1.10

หรือจะใน subdirectory เช่น

http://192.168.1.10/drupal

เราก็ไม่ต้องแก้ไข config อะไรเลย มันรู้ของมันเอง!!

แต่มาวันนี้ผมเจอ case ประหลาดครับ

พอดี domain ของลูกค้ายังไม่พร้อม production URL ก็เลยเป็น direct URL แบบนี้ชั่วคราว

http://192.168.1.10/~myuser

ปรากฏว่าหน้าแรกเข้าได้ปกติ แต่หน้าอื่นเข้าไม่ได้เลย เจอ 404 ตลอด – -!!

ตอนแรกคิดว่าสงสัย .htaccess ของ host มันชนกับของ Drupal แน่เลย

จึงลองถาม เทพ Drupal ได้วิธีแก้ง่ายๆมาคือแก้ .htaccess ของ Drupal ดังนี้

RewriteBase /~myuser

โดยปกติบรรทัด RewriteBase จะ comment เอาไว้ แล้วโดยทั่วไปเราก็ไม่ต้อง uncomment มันด้วย

แต่ Case นี้ที่ต้องเพิ้ม RewriteBase เนื่องจากว่า .htaccess ของ host มีการกำหนด RewiteRule สำหรับ User Directory นั่นเอง

ผมเข้าใจว่า ถึงแม้ไม่ใช่ User Directory แต่หากเราวาง Drupal ไว้ใน subdirectory และที่ชั้นบนมี RewiteRule ด้วย ก็คงเจอปัญหาเดียวกัน

You have no events scheduled today.

Tuesday, April 20th, 2010

นานๆเจอวันว่างซะที ขอ Capture รูปไว้ซะหน่อย ฮา…

Finally, Flash will be Dreamweaver for HTML5 Canvas.

Monday, April 19th, 2010

คิดเอาไว้แล้วว่ายังไงจุดแข็งของ Adobe ไม่ได้อยู่ที่มาตรฐาน (SWF) แต่อยู่ที่ Tools (Flash/Flex) มากกว่า

สุดท้ายถ้า SWF ถูกมาตรฐานกลางอย่าง HTML5 แซงไป Adobe ก็ยังมีไม้ตายคือ Export จาก Flash เป็น HTML5 ได้อยู่ดี

เหมือนกับ Dreamweaver ที่เป็น Editor สำหรับ HTML/CSS

ที่น่าแปลกใจคือผมไม่คิดว่า Adobe จะออกมาแสดงท่าทีสนับสนุน HTML5 ไวขนาดนี้ (มาพร้อมกับ Flash CS5) ผมนึกว่าจะรอดูท่าทีก่อนว่าถ้านิยมค่อยปล่อยเป็นตัวเสริมอีกที

มองอีกมุมหนึ่ง Adobe คงอ่านเกมแล้วว่า ยังไงคงหยุดกระแส HTML5 ไม่อยู่แน่ๆ เพราะ Google กับ Apple ดันเหลือเกิน ไหนจะ Mozilla อีก

การเข้าแย่งชิงพื้นที่ HTML5 Tools จึงดูน่าสนใจและน่าจะทำกำไรได้มากกว่าการแข่งด้วย Platform/Format (SWF vs HTML5)

http://www.9to5mac.com/Flash-html5-canvas-35409730