[Objective-C myNote]
Objective-C เป็น ภาษาที่ใช้เป็นหลักในการพัฒนาโปรแกรมใน MAC และ iPhone
บันทึกนี้เหมาะสำหรับ ท่านที่มีประสบประการณ์ ในการเขียนโปรแกรม แล้วและเข้าใจ object-oriented ดี ไม่เหมาะสำหรับผู้เริ่มหัดเขียนโปรแกรม นะครับ เพราะจะอ่านไม่รู้เรื่อง เอานะครับ ฮะ ฮะ เอิก
เอาว่าถ้า เริ่มศึกษา Objective-C ก็เชิญไปที่นี่ก่อนะครับ Learn Objective-Cหรือว่าที่นี่ก็น่าจะเป็นที่เริ่มต้นได้เป็นอย่างดี ครับ Cocoadevcentrol.com
สำหรับในบทความเล็ก ๆนี้จะ เป็น บันทึกสั้น ๆ ในเรื่องต่าง ของ Objective-C ดังนี้ครับ
- Method
- Accessor
- การสร้าง Objects (Creating Objects)
- การจัดการกับ Memory – Basic Memory Management
- การออกแบบ class interface – Designing a Class interface
- Init
- Dealloc
- การจัดการกับ memory ,Memory Management (เพิ่มเติม)
- Logging
- Properties
- Calling Methods on Nil
- Categories
Method
- การรียกใช้ methods
[ object method];
[ object methodWithInput:input];
- การ return ค่า จาก method
Output = [object methodWithOutput];
Output = [object methodWithInputAndOutput:input];
ข้อสังเกต นะครับการเรียก method คือการส่ง message ให้ object
การเรียก method ของ class เช่น การเรียก string method ของ NSString class ซึ่ง ให้ค่าเป็น
NSString object
id myObject = [NSString string];
id type หมายถึงตัวแปร myObject สามารถอ้างอิงไปยัง object ใด ๆ ประมาณ late binding นะครับ หมายความว่าหากเราเรียก method ที่ NSString ไม่มี ก็ไม่แสดง error ในหว่างทำการ compile
[จากตัวอย่างเป็นวิธีการ สร้าง object ของ Objective-C เขา นะครับ]
NSString* myString = [NSString string];
ครับสำหรับ ตัวอย่างนี้เป็นการ สร้าง object NSString ชี้โดย myString ซึ่งให้เป็น NSString
Compiler จะตรวจสอบได้ หากเรียกใช้ method ที่ไม่มี ใน NSString นะครับ
สังเกตว่า ตัวแปร object ใน Objective-C จะเป็น pointer แต่ id type จากตัวอย่างด้านบนไม่ต้องมี * เพราะมันถูกกำหนดให้เป็น pointer อยู้แล้ว เพราะฉะนั้นไม่ต้องใช้
การเรียก Message แบบ ซ้อน กัน [Nested messages]
[NSString stringWithFormat:[prefs format]];
การเรียก ซ้อนกันก็ไม่ควรเรียกซ้อนกันไม่เกิน 2 message ต่อบรรทัด เพื่อให้สามารถอ่านได้ง่าย
Methods แบบ หลาย Input
เหมือนทั่วไปครับ method สามรถ รับค่าได้ มากกว่า 1 ค่า ใน Objective-C ก็เช่นเดียวกันแต่ Objective-C นั้น ใช้การแตก ชื่อ method ให้เป็นหลาย ๆ ส่วนเพื่อรับข้อมูล หรือ argument ดังตัวอย่าง
การประกาศ :
-(BOOL) writeToFile:(NSString *)path atomatically:(BOOL) usAuxilliaryFile;การเรียกใช้ :
BOOL result = [myData writeToFile:@”/tmp/log.txt” automatically:NO];
ชื่อmethod ก็คือ writeToFile: automatically: ครับ ไม่ใช่ ชื่อ argument นะครับ
Accessor
Instance variable โดย default เป็น private ในการ กำหนดค่า (set) หรือการรับค่า จาก variable จะต้องใช้ accessors สามารถทำได้ดังนี้ครับ
Traditional 1.x sytax
[photo setCaption:@”Day at the Beach”];
Output = [photo caption];
ครับเราจะเห็นว่าการ ใช้งาน accessor นั้น ก็คือการเรียกใช้ method นั่นเอง
จำไว้ว่าเมื่อใดก็ตามที่เห็น code อยู่ใน square brackets หมายถึง เป็นการส่ง message ให้กับ object หรือ class นะครับ
จากตัวอย่าง ที่ บรรทัดที่ 2 caption ไม่ได้ นำด้วย get ใน Objective-C โดยมากจะไม่ใส่ prefix ให้กับ getter ครับ
Dot syntax
สำหรับ dot syntax สำหรับ getter และ setter นั้น เริ่มมีใน Objective-C 2.0 Mac OS X 10.5 เป็นต้นมาครับ
photo.caption = @”Day at the Beach”;
output = photo.caption;
เราเลือกใช้แบบใดก็ได้นะครับ เลือกเอาซะแบบหนึ่ง นะครับ
การสร้าง Objects (Creating Objects)
การสร้าง Object ใน Objective-C สามารถทำได้ 2 วิธี
วิธีแรกเป็นวิธีที่เรา แสดงให้เห็นแล้วก่อนหน้านี้
NSString* myString = [NSString string];
วิธีนี้เป็นแบบ automatic style ครับ สร้างโดยการใช้ autoreleased object ซึ่งจะพูดถึงต่อไป หลังจากนนี้ครับ
อีกวิธีหนึ่ง เรียกว่า manual style คือต้อง ทำ release memory เองหลังจากใช้ object แล้ว ครับ
NSString* myString = [[NSString alloc] init];
จาก code เป็นการเรียก method แบบ ซ้อนกัน (nest)
– Alloc เพื่อ จ้อง memory และ สร้าง object
– Init เป็นการ เรียก method ใน object ที่ถูกสร้างขึ้น มักใช้ในการ กำหนดค่าเริ่มต้นต่าง ๆ ในบางกรณี เราใช้ init ที่รับ input ได้ เช่น
NSString* value = [[NSString alloc] initWithFloat:1.0] ;
การจัดการกับ Memory – Basic Memory Management
ถ้าเรา สร้าง object โดยใช้ alloc อย่างที่กล่าวไป เราต้องทำการ release object หลังจาก ใช้เสร็จ ครับ
ตัวอย่างเช่น
// string1 will be released automatically
NSString* string1 = [NSString string];// must release this when done
NSString* string2 = [[NSString alloc] init];
//..
[string2 release];
การออกแบบ class interface – Designing a Class interface
การสร้าง class มี 2 ส่วนคือ
- Class interface เก็บไว้ใน ClassName.h
- Define instance variable and public methods
- Implementation เก็บไว้ใน ClassName.m
- Actual code
- Private method ซึ่ง ใช้ภายใน
ตัวอย่าง class ชื่อ photo
#import <Cocoa/Cocoa.h>
@interface Photo : NSObject {
NSString* caption;
NSString* photographer;
}
@end
– ใช้ #import directive เพื่อบอก compiler ว่าจะเรียกใช้ library อะไร
– @interface บอกว่าเป็นการ ประกาศ class ชื่อ photo colon บอกว่า photo มี superclass เป็นอะไร
– ใน curly bracket ประกาศ variable 2 ตัว ชื่อ caption, photographer ซึ่งเป็น NSString
– จบด้วย @end
เอาไว้ต่อกันใน ตอนถัดไปดีไหม ครับ ยาวเกินไปแล้ว
s_teerapong2000@yahoo.com
ธีระพงษ์ ส.
การใช้งาน jQuery กับ ASP.NET
เหมือนกับว่าผม จะ out อยู่คนเดียวนะครับ หันไปทางไหน ก็ jQuery jQuery ถูกนำมาใช้กันอย่างกว้างขวางไม่เว้น ASP.NET ของ Microsoft และมีทีท่าว่าจะกลายเป็น partner กันในที่สุด บทความเล็ก ๆ นี้ของผม จะพาท่านนักพัฒนาทั้งหลายมา รู้จักกับเจ้า jQuery กัน นะครับ
อันที่จริง แล้วผมเองก็ชุลมุนมากมาย มีหลายสิ่งหมลายอย่างที่ต้องจัดการ แต่ก็ยอมไม่ได้ที่จะไม่ได้ แตะ เจ้า jQuery สักนิด สักหน่อย ฉะนั้นก็เชิญตามมา ดูกันเลยนะครับ
jQuery คืออะไร หนอ
jQuery นั้น เป็น javaScript library แฮะ แฮะ อย่างน้อยก็ไม่ได้มีอะไรแปลกใหม่แล้วหล่ะ แต่เจ้า jQuery นั้นมันมีอะไรมากไปกว่า javaScirpt library ธรรมดา เพราะว่ามัน สนับสนุนการใช้งาน CSS3 และ เป็นที่รู้จักของ browsers ทั้งหลาย ใช้งานง่าย เร็ว ใช้ DOM ในการเข้าถึง html documents และสามารถเพิ่มลูกเล่นให้กับ element ต่างได้ และอื่น ๆ อีกมากมาย
jQuery และ JavaScript ต่างกันอย่างไร หล่ะ
อื่ม ก็ JavaScript นั้นเป็น language ส่วน jQuery เป็น library ที่เขียนขึ้นด้วน JavaScript นั่นเอง ครับ
jQuery ไป download ที่ไหน หรือ และเอามาใช้อย่างไร
การใช้ jQuery นั้น สามารถเรียกใช้ได้หลายลักษณะ กล่าวคือ
- วิธีรแรก สามารถdownload code มาใช้งานกับโปรแกรม
- วิธีที่ สอง อ้างอิงได้โดยตรง จาก Content Delivery Network (CDN) ซึ่งมีผู้ ให้บริการ เช่น
ปัจจุบัน Visual studio 2008 สนับสนุน jQuery Intellisense จาก file ที่เพิ่มเข้ามาใน jQuery ซึ่งสามารถ download ได้ที่ http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.2.6-vsdoc.js
แต่ ถ้าเรา update VS2008 SP1 Hotfix เราจะสามารถทำให้ VS2008 ของเรา สนับสนุนการใช้งาน JavaScirpt file รวมถึง jQuery intellisense ด้วย ซึ่งสามารถ download hotfix ได้ที่ http://archive.msdn.microsoft.com/KB958502/Release/ProjectReleases.aspx?ReleaseId=1736 สามารถ download และ update ได้เลย ซึ่ง จะต้อง เป็น vs2008 sp1 เท่านั้นนะครับ
เอาละครับ ลองมาดูการใช้งานกันเถอะ
สมมุติว่าเรา ลง hotfix แล้วนะครับ ให้ไป download
- jQuery library ที่ http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.2.6.js
- และ jQuery VS2008 IntelliSense documentation http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.2.6-vsdoc.js
แล้วทำตามขั้นตอนต่อไปนี้เลยครับ
- เปิด Visual studio 2008 > file > New > WebSite > เลือก ASP.NET 3.5 Website จาก template แล้วเลือก ภาษาในการพัฒนาเป็น C# เลือก ตำแหน่งที่จะวาง project แล้ว บันทึก
- Click ขวาที่ project แล้ว > New folder > กำหนดชื่อให้เป็น “Scripts”
- Click ขวาที่ Scripts > Add Existing Item > Browse ไปที่ path ที่เรา download jQuery (jquery-1.2.6.js )มาวางไว้ และ intellisense document (jquery-1.2.6-vsdoc.js ) เลือก file ทั้งสองแล้ว บันทึก ตามรูป
– - ให้ [ลาก /วาง] jquery-1.2.6.js จาก solution explorer มาวางไว้ที่ page เพื่อสร้าง reference ดังรูป
- เนื่องจาก เราได้ลง hotfix แล้ว เราก็ไม่ต้อง add reference ที่ jquery-1.2.6-vsdoc.js อีก เพราะ visual studio จะค้นหา vsdoc และ load เอง แค่เราวาง runtime library และ document file ไว้ที่เดียวกันเท่านั้น
- เพื่อทดสอบ intellisense ให้ พิมพ์ <script> block แล้ว พิมพ์ “$(“ เราได้เห็น intellesense เหมือนกับที่แสดงตามรุปด้านล่างครับ

- เป็นอันว่าจบขั้นตอนการ ลงและทดสอบ ครับ
ต่อไปลองมาทดสอบกันดูนะครับ ให้เห็นให้รู้กันไปเลย ตัวอย่างเป็นตัวอย่างง่าย ๆ คือ click ปุ่มแล้วแสดง alert window
– ให้ วาง button ตาม code นะครับ
-แล้วเพิ่ม code ใน script box ดังรูป ครับ
จาก code เราอ้างอิง ชื่อ Button1 ด้วย #Button1 นะครับ เมื่อ click ให้แสดง window มีข้อความ Hello world นั่นเอง จะได้ผลตามรูป ครับ
เป็น อันว่าจบ บทความ เรื่อง jQuery นี้แล้วนะครับ คงพอจะได้ แนวความคิดเอาไว้ต่อยอดได้นะครับ ขอให้มีความสุขกับการเขียนโปรแกรมนะครับ
ธีระพงษ์ สนะยามาลย์
s_teerapong2000@yahoo.com
Learn
ํYou ‘ll never be brave if you don’t get hurt
You ‘ll never learn if you don’t make mistake
You ‘ll never be successful if you don’t encounter failure….
– – so
Failure is Success… if you learn from it.
Scrum คือ ?? มาทำความรู้กจักกับ scrum กันเถอะ
Scrum เป็นวิธีการในการทำให้งานสำเร็จ ซึ่ง ”งาน” ในที่นี้เราจะพูดถึง ความสำเร็จในโครงการพัฒนาซอฟต์แวร์ ( software development project ) ลองมาศึกษากันหน่อยดีมั้ยครับว่า scrum มีแบบการทำงานอย่างไร (Framework)
Scrum Framework
- Product owner เป็นคนสร้างและกำหนดลำดับความสำคัญของ ความต้องการ เรียกว่า product backlog
- ในการ ทำงาน team จะดึงงาน บนสุดของ product backlog มาวางแผน และดำเนินการทำให้สำเร็จ เรียกว่า sprint backlog
- Team พัฒนาจะมี เวลา ( sprint ) ที่แน่ชัดในการ ทำงาน ชิ้นที่ดึงมาทำ ให้สำเร็จ โดยปกติประมาณ 2 – 4 สัปดาห์ และต้องมีการประเมิน ความก้าวหน้าทุกวัน (daily scrum)
- ผู้ควบคุมดูแล ให้ team ดำรงเป้าหมาย และดำเนินงาน ให้ประสบผลสำเร็จ เรียกว่า ScrumMaster
- เมื่อจบ แต่ละ sprint งานนั้นเรียกว่า potentially shippable พร้อมที่จะส่งให้กับลูกค้า จะถูกวางไว้ใน store shelf หรือนำมาแสดงให้กับ stakeholder
- ซึ่ง ในแต่ละ sprint จะจบด้วยการ ทำ sprint review และ ตรวจสอบย้อนหลัง
- หลังจากนั้นจึง เริ่ม sprint ใหม่ โดย team จะไปดึง product backlog มาทำงานต่อไป
การทำงานจะทำซ้ำไปเรื่อย ๆ จนกว่า เสร็จงาน ซึ่งการเสร็จงานั้น อาจกำหนดด้วย การที่ product backlog จำนวนหนึ่งเสร็จสิ้น หรือ งบประมาณหมดไป หรือ deadline มาถึง ก็ได้แล้วแต่ โครงการ ซึ่งไม่ว่าจะเป็นการจบแบบไหน การทำงานแบบ scrum จะให้ความมั่นใจได้ว่าเมื่อโครงการจบลง งานที่สำคัญ สุดของโครงการได้ถูก ดำเนินการไปแล้ว
ครับ น่าสนใจที่เดียวครับ การพัฒนาโปรแกรม หรือโครงการใด ๆ ต้องการผลสำเร็จ แต่ถ้าหากต้องจบโครงการลง ไม่ว่าจะเป็นด้วยเหตุใดก็ตามเราก็ยังสามารถได้ชิ้นงานที่ เป็นหัวใจของงานนั้น ๆ หรือเป็นหัวใจของโครงการนั้น ๆ อยู่ ซึ่งก็ถือว่าเป็นหัวใจของการพัฒนาซอฟต์แวร์ด้วยเช่นกัน
ธีระพงษ์ สนธยามาลย์
s_teerapong2000@yahoo.com
การส่ง parameter หรือ data ให้กับ activity [Android เก็บเอามาเล่า] ต่อ
มีเพิ่มเติมต่ออีกในเรื่องของการ ส่งผ่านข้อมูลไปยัง activity (newActivity)อื่นในขณะที่สร้าง activity นั้น ยังมีต่ออีกนิส
ก็เนื่องจากว่า ความต้องการในการใช้งาน ในลักษณะนี้นั้นมี 2 ลักษณะคือ
1 สร้าง activity ที่ 2 แล้วเปิด (Fire and forget) ในกรณีนี้พูดไปแล้วนะครับ ในบทความที่แล้ว
2 สร้าง activity ที่ 2 เปิด แล้วรอ รับค่าส่งกลับ ( First and wait fore response – Ancy callback )
ในบทความนี้เรามาต่อการใช้งานในลักษณะที่ 2
หากเราต้องการ ที่จะ ให้ activity ที่ถูกสร้างขึ้นนั้น นั้นเป็น dialog รับค่าจากผู้ใช้แล้ว ส่งคืนกลับให้กับ activity ที่สร้างมัน (currentActivity) ทำอย่างไร
เรื่องนี้ เรื่องที่ค่อนข้างใช้บ่อยและสำคัญ ครับสำหรับการพัฒนาโปรแกรม เพื่อโต้ตอบกับผู้ใช้ มาดูวิธีการเลยนะครับ
ในการสราง activity แล้วรอ ค่าส่งกลับ เราทำดังนีนะครับ (สมมุติว่า acctivity ปัจจุบันคือ currentAcivity และ activity ที่จะใช้เป็น dialog คือ newActivity)

picture from http://croute.me/352
Intent newIntent = new Intent(this.getApplicationContext(),newActivity.class);
Bundle bundle = new Bundle();
bundle.putString("param1","test");
newIntent.putExras(bundle);
setartActivityForResult(newIntent,REQ_CODE);
** หมายเหตุ – code ด้านบน เขียนใน event อย่างเช่น onClickListener ของ view เป็นต้น
เช่น code เต็ม
....
final static int REQ_CODE = 1;
.....
btnStartAct.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent newIntent = new Intent(this.getApplicationContext(),newActivity.class);
Bundle bundle = new Bundle();
bundle.putString("param1","test");
newIntent.putExras(bundle);
setartActivityForResult(newIntent,REQ_CODE );
});
}
ครับจาก code newActivity เป็น activity ที่เราต้องการสร้าง จาก currentActivity
สำหรับด้านรับข้อมูลด้าน (newActivity)
Bundle bundle = this.getIntent().getExtras();
if(bundle != null){
String param1 = bundle.getString("param1");
}
** ระวังเรื่องการส่งค่านะครับ ในกรณีนี้หากไม่กำหนดค่าให้ param1 ค่าจะเป็น null

picture from http://croute.me/352
ต่อ นะครับ สำหรับการส่งค่ากลับ ให้กลับ currentAcitivity พร้อมกลับ ส่งการ focus ให้กับ currentActivity ดังนี้
btnOk.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Bundle bundle = new Bundle();
bundle.putString(“status”, “OK”);
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
setResult(RESULT_OK, mIntent);
finish();
});
}
จะเห็นว่าการส่งค่ากลับนั้น ก็ส่งผ่าน Intent โดยใช้ putExtra method แล้วสั่ง finish เลย เป็นการเป็นหน้า activity ไปด้วยเลย สุดท้าย ในด้าน currentActivity ให้เขียน overried method ที่ชื่อว่า onActivityResult method จะถูกเรียกทันทีหลังจาก newActivity ปิดลงและส่งค่ากลับ ตัวอย่าง code ดังนี้ครับ

picture from http://croute.me/352
@Override protected void onActivityResult(int requestCode,int resultCode,String strdata,Bundle bundle)
{
Log.i(Global.TAG, "MainDriver main-activity got result from sub-activity");
if(resultCode == RESULT_OK)
{
// do something here ....
// รับข้อมูลจาก bundle เหมือนปกติครับ
}
}
ครับ เป็นอันจบขั้นตอนการ ทำงานทั้งหมดแล้ว หวังว่า จะเป็นประโยชน์ต่อ หลายท่านที่กำลังค้นหาข้อมูลส่วนนี้อยู่นะครับ s_teerapong2000@yahoo.com







