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 เป็นต้น
Tags: iPhone, Objective-C
Posted in Uncategorized | No Comments »
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 ครับ
Tags: iPhone, Objective-C
Posted in Uncategorized | 2 Comments »
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"
Tags: iPhone, Objective-C, Xcode
Posted in Uncategorized | No Comments »
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 ก็ได้ ง่ายสุด
Tags: Flash, Windows Software
Posted in Uncategorized | 1 Comment »
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. นปช.เผายางรถยนต์กลางสะพานกรุงธนบุรี (ซังฮี้)ขาเข้า /หลีกเลี่ยงเส้นทางด่วน
บุคคลใดมีบ้านแถวถนนที่ห้ามนี้ ให้พกบัตรประชาชน + ทะเบียนบ้าน เพื่อรับสติ๊กเกอร์ผ่านทางจากเจ้าหน้าที่ ขณะนี้แนะนำให้ออกอจากบริเวณอันตรายไปพักที่อื่น
Tags: Politics
Posted in Uncategorized | No Comments »
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 ด้วย ก็คงเจอปัญหาเดียวกัน
Tags: Apache, Drupal
Posted in Uncategorized | No Comments »
April 20th, 2010
นานๆเจอวันว่างซะที ขอ Capture รูปไว้ซะหน่อย ฮา…

Tags: Life Style
Posted in Uncategorized | No Comments »
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
Tags: Flash, HTML, HTML5
Posted in Uncategorized | 1 Comment »