วันเสาร์ที่ 1 กันยายน พ.ศ. 2555

ณ หนังสือพิมพ์เดลินิว

การทำงานหนังสือพิมพ์เป็นอะไรที่ท้าทายมาก
จากประสบการณ์ส่วนตัวคือ ที่ร้านเปิดร้านถ่ายเอกสาร
จึงได้เห็นพัฒนาการของการทำเอกสารรูปแบบต่างๆมากมาย
พอวันนั้นได้มีโอกาสไปดูโรงพิมพ์ของหนังสือพิมพ์
แล้วรู้สึกตัวเลย ว่าเรายังเล็กนิดเดียวเท่านั้น ^^"
เทคโนโลยีช่วยคุณได้ทั้งหมดจริงๆ

แต่ในบางครั้ง มันกลับทำให้คิดว่า
"เทคโนโลยีเยอะไป จนคนจะเป็นหงอยกันไปหมด"

ตัวเราคิดว่า
เทคโนโลยียิ่งโตเท่าไหร่ ยิ่งสบายเท่านั้น ยิ่งทำให้คนเรานั้นไม่มีจิตใจมากยิ่งขึ้น ทำงานคล้ายหุ่นยนต์เข้าไปทุกวัน ทุกวันเลยจริงๆ


กระบวนการกว่าจะมาเป็นข่าว

  • นักข่าว การส่งข่าวนั้นสมัยนี้ทำได้โดยการส่งผ่านอินเตอร์เน็ต
  • หัวหน้า บ.ก. & หัวหน้าช่างภาพ
  • Photo Archive (ตกแต่งภาพ หรือ สร้างภาพ) ช่วยลดความแรงของข่าว
  • แผนกข่าว & re write ช่วยตรวจสอบข้อความคำพูด
จากกระบวนการที่กล่าวมานั้น ล้วนแล้วแต่ต้องใช้เทคโนโลยีเข้ามาช่วย เน็ตเวิร์กต่างๆมากมาย แต่ถ้าลองมองกลับไปสมัยก่อนดูสิ กว่าจะได้ข่าว กว่าจะส่งสารกันนั้น ต้องหนักพอสมควรเลยหล่ะ T_T

กว่าจะมาเป็นหนังสือพิมพ์ กว่าจะพิมได้ ต้องผ่านการทำ Plante ก่อน
สมัยก่อน ถ้าไม่มี ก็ต้องนั่งกัดฟิลม์ก่อนส่งเข้าเครื่องในการพิมพ์ออกมา
   ในการกัดฟิลม์แต่ละครั้งต้องใช้เวลาถึง 45 นาที และจะผลิตข่าวให้ร้อน สด ทันเวลาได้อย่างไร โรงงานที่พิมพ์ไม่ได้อยู่ทุกๆหัวเมื่อง แต่อยู่ที่ กรุงเทพมหานคร เมืองหลวงของประเทศไทยเท่านัน แต่ต้องส่งต่อไปยังทั่วประเทศ จะต้องมีการจัดการการขนส่งเป็นอย่างดี ต้องทำให้เวลากระชับมากที่สุด เพื่อให้ส่งถึงมือของลูกค้าได้ทันเวลา อีกด้วย

แต่ ตอนนี้ มีเทคโนโลยีเข้ามาช่วย เรียกว่า CTP (Computer to Plante) เทคโนโลยีนี้สามารถสร้าง Plante ได้ภายใน 3 นาทีก็ว่าได้ ทำได้อย่างรวดเร็ว และสะดวกมากๆ ช่วยประหยัดเวลา มากขึ้น สามารถกรองข่าวได้มากขึ้น เพิ่มการทำงาน เพิ่มระยะเวลาต่างๆได้มากมาย


เคยสงสัยกันไหม ทำไมถึงต้องแบ่งหนังสือพิมพ์เป็นส่วนๆ หลายๆเล่ม ส่วนหลักบ้าง บันเทิงบ้าง กีฬาบ้าง เปิดอ่านยากไหม ? ทำไมถึงต้องแบ่ง ?
     มันเป็นการตลาดชั้นยอดเลยหล่ะ ตอนแรกก็คิดไม่ถึง คิดเพียงแค่ว่า เปิดยากนะ แต่พอฟังแล้ว รู้สึกได้เลยว่ามันเป็นจิตวิทยา รวมกับการตลาดเล็กๆ เพราะถ้าทำเล่มเดียว จะแบ่งอ่านกันทั้งบ้านได้อย่างไร แม่อาจจะอ่านบันเทิง ลูกอ่านกีฬา พ่ออ่านทางด้านธุรกิจ นี่ก็เรียกได้ว่า ผูกขาดแล้ว เล่มเดียวครอบคลุมทั้งบ้าน ลูกค้าก็จะได้ไม่หนีไปไหน

การสื่อสารเป็นเรื่องสำคัญแค่ไหน ?
   การสื่อสารเป็นเรื่องสำคัญมาก การรู้แต่สื่อออกมาไม่ได้ ก็ไม่มีประโยชน์อะไร ถ้าคุณมีความรู้ แต่ไม่สามารถแชร์ออกมาได้ เมื่อคุณเสียชีวิตไป ความรู้นั้นก็ตายไปกับคุณ ไม่ได้แบ่งไปให้ใคร และประเทศ หรือสิ่งต่างๆ จะพัฒนาต่อไปได้อย่างไร รวมถึงนักข่าว ถ้านักข่าวเข้าใจ แต่ไม่สามารถเขียนอธิบายออกมาได้ ผู้อ่านจะรู้ได้อย่างไร รวมไปถึง การสื่อสารที่ถูกต้อง สื่อออกมาและคนอ่านเข้าใจไปในทางที่ถูกต้อง ถือว่าถูกที่สุด "ทำดีแทบตาย แต่อธิบายไม่ได้ก็จบ"

ทำไมถึงต้องมีสินค้าในโกดัง มันทำรายได้จริงหรือ ?
   สินค้าในโกดังนั้น ไม่สามารถสร้างมูลค่าให้กับเราได้เลย แต่มันสามารถช่วยสร้างความสบายใจให้กับผู้บริหาร เพื่อเกิดเหตุการณ์ฉุกเฉิน เกิดความผิดพลาดต่างๆ ทำให้สามารถหยิบออกมาใช้ได้ในทันที แต่ ถ้าการเก็บกักตุนสินค้า เกิดความผิดพลาดก็ทำให้เกิดผลกระทบได้ด้วย

Forecasting คืออะไร ?
    คือ การทำนายเหตุการณ์ในอนาคต เหตุการณ์ที่จะเกิดขึ้น การคาดเดา คาดคะเน สิ่งนี้สามารถช่วยในการบริหาร ในการวางการตลาดต่างๆได้เป็นอย่างดี ซึ่งคนที่มองต้องอ่านเกมส์ให้ขาด เพื่อให้เอาชนะคู่แข่ง และอยู่รอดได้ อย่างประสบความสำเร็จ

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

นิทานเรื่องมาลัยแคลี่
  วันหนึ่ง ณ สี่แยกไฟแดง คุณต้องการซื้อพวงมาลัย พวงมาลัยพวงนั้นราคา 50 บาท คุณจึงบอกคนขายพวงมาลัยว่า "หนุ่มน้อย พี่ขอไปก่อนนะ และเดียวขากลับจะมาจ่ายเงิน สัญญาว่าจะมาแน่นอน" และเมื่อคุณทำธุระเสร็จทุกอย่างแล้ว พอขากลับมาจ่ายเงิน คุณจ่ายเงินจำนวน 50 บาท พ่อหนุ่มน้อยคนนั้นกลับบอกคุณว่า "ไม่ได้ครับพี่ ตอนนี้พวงมาลัยราคา 80 บาทแล้ว" 

   นิทานเรื่องนี้ทำให้รู้ว่า  ไม่ว่าคุณจะถือเอง หรือจะให้คนขายถือ ก็สามารถเกิดค่า Cost ได้เช่นกัน


PDCA คุณรู้จักมันมากน้อยแค่ไหนกัน ?
   ช่วงชีวิตนี้ดีใจที่ได้รู้จักมัน แต่เสียใจที่ยังไม่สามารถทำอะไรกับมันได้มากนัก การตรวจสอบการแก้ไขนั้นควรทำในช่วงที่แข็งแรง กำลังดี ไม่ควรทำตอนที่มันพลาด หรือใกล้จะพังเสียแล้ว
   ลองมองในทางกลับกัน ถ้าคุณเป็นโรคหัวใจ คุณต้องทำการผ่าตัด ถ้าคุณเลือกได้ระหว่างผ่าตอนที่คุณแข็งแรง สามารถฟื้นตัวได้ง่าย กับผ่าตอนที่คุณใกล้จะแย่ หาทางรอดยาก นั้นคุณจะเลือกแบบไหน ใครๆก็ต้องเลือกตอนทีตัวเองกำลังแข็งแรง ฟื้นตัวง่าย กันทั้งนั้น เพราะถ้าเลือกตอนกำลังจะแย่ คุณอาจจะไม่สามารถกลับมามีชีวิตอีกเลยก็ได้
   ในด้านของธุรกิจ ก็เช่นกัน ถ้าธุรกิจกำลังดีอยู่ สามารถปรับปรุง พัฒนาได้ แต่ถ้ากำลังแย่ การเปลี่ยนแนวทางกระทันหัน ไม่ใช่ทางออกที่ดีเสมอไป มันจะทำให้ฟื้นตัวได้อย่าง

เทคโนโลยี เป็นเรื่องที่ฉลาดแล้วจริงๆหรือ ดีที่สุดแล้วจริงๆหรือ ?
  เทคโนโลยีนั้น เป็นส่วนที่ดีจริง แต่การใช้บางอย่างก็ไม่ดี สรุปคือ เทคโนโลยีไม่ใช่สิ่งที่ดีทั้งหมด เพราะถ้าการใช้อินเตอร์เน็ตในการค้นหาข้อมูลเป็นสิ่งที่ถูกต้อง และจะได้ข้อมูลต่างๆใหม่ๆมากมาย แต่ถ้าใช้อินเตอร์เน็ตในการค้าหาหนังโป๊ มันก็จะได้มากมายเช่นกัน เต็มไปด้วยสิ่งไม่ดีต่างๆมากมายเลย ซึ่งการใช้เทคโนโลยี ถ้าใช้ต้องเลือกอย่างฉลาด และเลือกใช้ให้เป็น ถูกต้องตามสิ่งที่มันควรจะเป็น

Life's like a box of chocolates. Doesn't last very long for fat people.

ตรรกะของมนุษย์ต่างกัน
   ลองมองในเรื่องของคนขับรถ และ การผ่าตัด
  • ถ้าขับรถมาด้วยความเร็วสูง ทางข้างหน้ามีคนข้ามถนนอยู่ 4 คน ถ้าไม่หักหลับ พวกเขาเหล่านั้นตายๆแน่ๆ แต่ถ้าหักหลบ จะต้องชนคนอีก 1 คน ที่ยืนอยู่ ควรจะเลือกทางไหน จะหักหลบไหม หรือจะเดินหน้าชนเต็มกำลังดี ?
  • ถ้ามองในเรื่องของการผ่าตัด มีคนหนึ่งคนที่ร่างกายสมบูรณ์ แต่ไม่สบาย กับคนอีก 4 คนที่มีปัญหาแตกต่างกัน ไม่ว่าจะเป็น หัวใจ ไต ตับ ขา ถ้าเป็นคุณหมอ จะทำการผ่าจากคนที่สมบูรณ์เพื่อมาช่วยชีวิตคนอีก 4 คนนั้นหรือไม่ ?
ถ้าลองมองทั้ง 2 กรณีนี้มันช่างแตกต่างกันนัก
   ถ้าเรื่องของการขับรถ คงยอมเสียสละ 1 คน เพื่อช่วยอีก 4 คน
   แต่ถ้าในการผ่าตัด จะทำได้อย่างไร ถ้าต้องเสีย 1 ชีวิต มายื้ออีก 4 ชีวิตเอาไว้

บรรยากาศภายในโรงพิมพ์หนังสือพิมเดลินิว
 
ม้วน กระดาษหนึ่งม้วน ราคาแสนแพง แต่คุ้มค่าต่อการลงทุน

การยกม้วนกระดาษขึ้นไปนั้น จะต้องทำอย่างไร แต่สำหรับที่นี่
มันไม่ใช่เรื่องยากเลย

เอาหลักการง่ายๆ เข้ามาใช้ แต่การปฎิบัตินั้นต้องเป็นไปอย่างระมัดระวัง
เพราะอาจจะทำให้เกิดอุบัติเหตุระหว่างการเดินได้
แต่ถ้ารู้ว่าอะไรคืออะไร ก็สามารถเดินผ่านได้อย่างชิวๆ
หรือเล่นเป็นของเล่นได้อย่างสบายๆ
แต่ก็ไม่ควรจะเข้าไปเล่น อย่างนั้น >"<


กระบวนการในการผลิตนั้น ไม่ใช่เรื่องง่ายๆเลย กว่าจะได้มาเป็นรูปเล่ม ต้องผ่านการคัดกรอง การพิมพ์ การจัดเล่ม การจัดส่ง เทคโนโลยีเหล่านี้สามารถช่วยได้

กระบวนการทุกกระบวนการ สามารถนำเอาเทคโนโลยีเขามาใช้ได้ทั้งหมด
การใช้เทคโนโลยีทำให้เกิดความรวดเร็ว และความแม้นจำ


แล้วงานของพี่ๆ พวกนี้เขาทำอะไรกันหล่ะ ถ้าต้องใช้เทคโนโลยีทั้งหมด
จะก่อให้เกิดคนตกงานเยอะแยะมากมายใช่ไหม ถ้าใช้เทคโนโลยีทั้งหมด
ตอบเลยว่าใช่ แต่ทาง ดร.พิสิฐ เหตระกูล บอกกับว่า
"ตอนนี้ค่าแรงยังสู้ไหว ถ้าเราใช้หมดหมดพวกเขาก็ตกงาน เราต้องช่วยพวกเขาด้วย แต่ถ้าค่าแรงขึ้น อะไรก็เกิดขึ้นได้"

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



กระบวนการต่างๆทั้งหมด ก่อให้เกิดเป็นหนังสือพิมพ์เล่มนี้
ไม่ใช่เรื่องง่ายๆเลย



"สิ่งมีชีวิตบนโลกนี้ ไม่ได้แข็งแกร่ง หรือแข็งแรงที่สุด
แต่ปรับตัวได้เก่งที่สุด"
โดย ดร.พิสิฐ เหตระกูล


ขอขอบพระคุณ ดร.พิสิฐ เหตระกูล มา ณ ที่นี้ด้วย
ขอบคุณที่ท่านได้แบ่งปันความรู้ หลักการต่างๆ ชวนให้มองโลกในมุมที่แตกต่างกันไป ช่วยให้คบคิดในเรื่องต่างๆ ขอบคุณจากใจจริงคะ

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

Introduction to Objective-C (Cont.) (Day02 @ iDeveloper03)

เขียนได้ไป 3 ส่วนแล้ว รู้สึกชิน และชิว
เขียนได้เร็วขึ้น
และคิดได้ว่า ควรจะมีรูปประกอบไหม แต่ว่า
ประเด็นสำคัญคือไม่มี mac ไม่สามารถรันและเอารูปมาโชว์ได้
ถ้าจะเอารูปจริงๆ คงต้อง คัดลอกมาจากบทความ หรือสไลด์ T_T
มันจะดีหรอ อออออ เอาแบบไม่มีรูปไปก่อนแย้วกันเนอะ อิอิ


งอแงแล้ว อยากได้ mac จร้า อยากได้ อยากได้
ไม่มีตังอะ ช่วงนี้ช๊อตกันสุดๆ T______________________T


Properties
โดย อาจารย์ภราดา นาคสุข
ช่วยแก้ปัญหาในการเขียน getter และ setter ที่ทำให้เสียเวลา
โปรแกรมสามารถสร้าง Method เหล่านั้นขึ้นมาให้เอง ผ่านทาง properties

ตัวอย่างแบบไม่ใช้ Properties
man.h
@interface man : NSObject
{
      NSStrint *name;
}
-(void) setName : (NSStrint *)firstName;
-(NSString *) getName;
@end

man.m
#import "man.h"
@implementation man

-(void) setName : (NSStrint *)firstName
{
       name =  firstName ;
}

-(NSString *) getName
{
       return name;
}
@end

ลองมองในทางกลับกันดิ่ ถ้ามีตัวแปลเยอะๆแสดงว่าต้องมี set กับ get เยอะมากจริงไหมจร่ะ ดังนั้น ในเวอร์ชั่น 4.4 เป็นต้นไปจึงมีการนำเอา properties เข้ามาช่วยในการกำหนดค่า และแสดงค่า


ตัวอย่างแบบใช้ Properties
man.h
@interface man : NSObject
{
}
@property (strong) NSString *name;

@end

man.m
#import "man.h"
@implementation man
@synthesize name;

จากการใช้ properties จะเห็นได้ว่า

  • ไม่ต้องสร้าง Attribute เลย เพราะตัว properties จะทำการสร้างขึ้นมาให้เอง
  • เราไม่ต้องสร้าง get methods & set methods ใน .h แต่เราใช้ properties เข้ามากำหนดค่าแทน
    • @properties(ประเภทของ Attribute) ชื่อ Attribute ที่ต้องการสร้าง
  • @property(readonly) NSString* name;
  • จะได้เป็น NSString* _name;
สามารถใช้ synthesize แทนการกำหนดค่าใน  get methods & set methods 
จะทำการสร้าง  get methods & set methods ให้ โดยกำหนดชื่อเป็น get และตามด้วยชื่อ Method โดยกำหนดให้ตัวแรกเป็นตัวใหญ่ นอกนั้นเหมือนเดิม
  •  @synthesize name;
    • -(void) setName : (NSString*) name;
    • -(NSString *) getName;
ประเภทของ Attribute ประกอบด้วย
readonly &  readwrite 
    • readonly : มีแค่ get methods 
      • @property(readonly) ชนิดAttribute AttributeName;
    • readwrite : มีทั้ง  get methods & set methods 
      • @property(readwrite) ชนิดAttribute AttributeName;
      • แต่ปกติจะไม่เขียนถึงอยู่แล้ว ถ้าเป็นกรณี readwrite
        • @property ชนิดAttribute AttributeName;
        • แต่ไม่นิยมใช้ เพราะจะไประบุประเภทของ setter กันแทนมากกว่า
    • หมายเหตุ ถ้าไม่มีการกำหนดจะบังคับเป็น readwrite
Setter Attribute
    • กำหนดโดยระบุรูปแบบการจองแทนว่าจะเป็น strong weak copy assign retain
      • ถ้าไม่มีการกำหนดจะบังคับเป็น assign
        • @property(__strong)  ชนิดAttribute AttributeName ;
        • @property(__weak) ชนิดAttribute  AttributeName ;
Atomicity เป็นการกำหนดลักษณะการทำงานของเทรด
    • nonatomic : กระทำพร้อมๆกันเลย โดยไม่ต้องรอการทำงานของเทรดแรก
    • atomic : รอการกระทำ ต้องทำเสร็จไปทีละเทรด
    • หมายเหตุ ถ้าไม่มีการกำหนดจะบังคับใช้เป็น atomic

  • การกำหนดค่า  Attribute นั้นสามารถกำหนดผสมกันได้
    • @property(nonatomic, strong) NSString* name;
ตัว Attribute ที่โปรแกรมทำการสร้างให้จะเป็น ชนิดเดียวกับที่กำหนด และ จะมีชื่อเป็น _ และตามด้วยชื่อของAttribute ที่กำหนด

Array in Cocoa
(NSArray , NSMutableArray)

NSArray
  • เก็บกลุ่มของออบเจกต์ที่สามารถเรียงลำดับได้
  • มีการเข้าถึงข้อมูลที่เริ่มต้นที่ 0
  • สามารถสร้าง object แบบสุ่มได้
  • ไม่สามารถลบ เพิ่ม เปลี่ยนแปลงสมาชิกได้เมื่อสร้างแล้ว
  • Method ที่สำคัญ
    • -(NSInteger)count : หาจำนวนสมาชิกภายในอาเรย์
    • -(id)objectAtIndes : (NSUInteger)index : การกำหนดลำดับในการเข้าถึงข้อมูล
  • การใช้งานตั้งแต่ XCode 4.4 สามารถ
    • Literals syntax : @[obj1,obj2,.....,nil]
      • จำเป็นต้องปิดท้ายที่ nil เสมอ
    • Subscription ใช้ในการเข้าถึงข้อมูล ด้วยการเติม []

การสร้าง Array
NSArray* array1 = [[[NSArray alloc] init] arrayWithObjects: @"a" , @"b", nil];

  • NSArray* array1 : สร้างพอยเตอร์ชี้ไปยังออบเจกส์ใหม่ภายใน Class NSArray
  • [NSArray alloc] : สร้างออบเจกส์ใหม่ภายใน Class NSArray เพื่อให้พอยเตอร์มาชี้
  • [[NSArray alloc] init] : กำหนดให้ออบเจกต์ใหม่นั้นมีค่าเป็นค่าเริ่มต้นตามที่คลาสนั้นกำหนดไว้
  • arrayWithObjects: @"a" , @"b", nil : การใส่ข้อมูลจำนวน 2 ตัว
    • โปรแกรมสามารถรู้ได้เลยว่า 2 ตัวเพราะมันนับจากการสั่ง nil แสดงว่าข้อมูลครบแล้ว ถ้าไม่ nil จะไม่สามารถรันโปรแกรมได้จะเกิด error
    • เราต้องเลือกชนิดดีๆ ถ้าต้องการสร้าง array เพียงตัวเดียวต้องใช้ arrayWithObject โปรดสังเกตุว่าขาดตัว s ไป 1 ตัว
    • แต่ถ้าต้องการสร้างหลายตัวต้องเติม s ด้วย ไม่งั้นหล่ะ error และจะ งง จนหากันยาว เราเจอมาแล้ว 5555 (จริงไหม ปีปี้ #แซวเล่นจร้า)
จริงๆแล้ว ไม่ต้องเขียนยาวๆดังข้างบน เขาย่อไว้ให้เราแล้ว ปีกกามันเยอะเกินไปนะจร่ะ

NSArray* array1 = [NSArray arrayWithObjects: @"a" , @"b", nil];
NSLog (@"%@", array1);
//Output : a , b

NSLog(@"%@" , [array1 objectAtIndex : 1]);
//Output : b

//การใช้ literals syntax
NSArray * array2 = @[@"a" , @"b" , @"c" , nil];
NSLog (@"%@", array2);
//output : a , b , c

//Supscription
NSLog (@"%@" array[1]);
//output : b


NSMutableArray
  • สืบทอดมาจาก NSArray
  • สามารถลบ เพิ่ม เปลี่ยนแปลงสมาชิกได้เมื่อสร้างแล้ว
  • ไม่สนับสนุน Literals syntax (ย่อไม่ได้นะจร่ะ)
  • Method หลัก
    • -(void)addObject : (id)anObject
    • -(void)insertObject : (id)anObject atIndex : (NSUInteger)index
    • -(void)removeLastObject
    • -(void)removeObjectAtIndex :  (NSUInteger)index
    • -(void)replaceObjectAtIndex :  (NSUInteger)index withObject : (id) anObject

ตัวอย่างเช่น

NSMutableArray* array3 = [NSMutableArray array];
[array3 addObject : [@"a", @"b" , @"c"]];
  // output : abc
[array3  insertObject  : [@"a"] atIndex : 0];
 // output : a
               abc

[array3 addObject : [@"b" , @"c"]];
 // output : a
               abc
                bc
[array3 removeObjectInRange : (NSRange){0,2}];
 //output : abc


การสร้าง อาเรย์ 2 มิติ
NSArray* list = [NSArray arrayWithObject :
                                            [NSArray arrayWithObject : @"1" , @"2" , nil],
                                            [NSArray arrayWithObject : @"A" , @"B" , nil],
                                            nil];

NSLog (@"List[0][1] : %@" , list[0][1]);
//output : List[0][1] : 2

การวนลูปแสดงผล
   for(x in list)
       NSLog (@"%@",x);


** การจะทำคอมเม้นต์โปรแกรม สามารถทำโดยการคลุมดำทั้งหมดและกด command + / 


ปล. ยังไม่จบนะ เหลือเรื่อง Dictionary , for อีก
ปล. เดียวมาต่อนะจร่ะ จุ๊ฟๆ
ปล. หามีข้อผิดพลาดประการใด ขออภัยมา ณ ที่นี้ด้วย











Memory Management (Day02 @ iDeveloper03)

วันนี้วันที่สองแล้วที่มาอบรม
ยังคงเดินทางไปกลับแบบเดิม
มันไกลดีนะ แต่ว่าชอบจังเลย มหาลัยกว้างใหญ่
ถ้าอยากจะย้ายมาเรียนนี่ทันไหมนะ ปี 4 แล้วจะจบแล้ว
เกิดหลงรักสถานบันกว้างขวาง 5555

ท่าทางจะไม่ทันเสียแล้วหล่ะ 
ไม่เป็นไร เก็บไว้ในใจ เก็บบรรยากาศเอาไว้
และจะไปบ่อยๆ คิดว่าช่วงนี้คงไปเยอะหล่ะ
จบอบรมนี้ก้กอมีท๊อปกันต่อเลย 5555

Memory Management
โดย อาจารย์ภราดา  นาคสุข

ทำไมต้องมีการจัดการกับเรื่องของหน่วยความจำ ???
เพราะว่า ตัวอุปกรณ์เองนั้นมีจำนวนของหน่วยความจำที่จำกัด ไม่มีการซื้อเพิ่มเติมได้
สามารถแก้ไขได้โดยให้ Developer ที่ออกแบบ App นั้นเป็นคนจัดการ วางแผนเอาไว้ ว่าต้องการใช้ ตอนไหนเมื่อไหร่ เลิกใช้ตอนไหนเท่าไหร่ยังไง ซึ่งจะกล่าวถึงวิธีการ ในลำดับต่อไป

ในส่วนของการจัดการ เราจะต้องเรียนใช้ Methods ในการจัดการอยู่ 2 ตัว นั้นก็คือ
+ (id)alloc ใช้ในการจองหน่วยความจำ
- (void) release ใช้ในการคืนหน่วยความจำ

กำหนดให้ Class test เป็นคลาสๆหนึ่งที่สืบทอดคุณสมบัติของ NSObject

test *a = [[a alloc] init];  
         // การสร้างpointer a ที่ทำการชี้ไปยังอ๊อบเจกต์ใหม่ภายใน Class Test
[a doSomething];
         // การเรียก method doSomething ให้กระทำกับอ๊อบเจกต์ที่ a ชี้อยู่
[a release];
         //เป็นการคืนพื้นที่หน่วยความจำ

ตัวอย่างที่จะทำให้เกิดปัญหา ถ้ามีการใช้ Pointer ในการชี้ร่วมกัน

test *a = [[a alloc] init];  
test *ab = a;
         //กำหนดให้ pointer ab ชี้ไปยัง Address เดียวกับที่ pointer a ชี้อยู่
[a doSomething];
[ab doSomething];

[a release];
         //เป็นการคืนพื้นที่หน่วยความจำ

[ab doSomthing];
         //เมื่อสั่งคำสั่งนี้จะทำให้เกิดปัญหา เพราะได้คืนหน่วยความจำที่ชี้อยู่ไปแล้ว จะทำให้เกิดการ Crash ของโปรแกรม ซึ่งจะทำให้ทำงานต่อไม่ได้ โปรแกรมมีปัญหา


Reference Counting : การป้องกันการ Crash ของโปรแกรม

  • Retain Count : ตัวเลขจะบวก 1 ของอ๊อบเจกต์เมื่อถูกทำการอ้างอิง สร้างขึ้นมา
  • Dealloc : จะถูกส่ง message ไปเรียกมาทำลายพื้นที่ที่จองไว้เมื่อ retain count = 0
การส่งข้อความไป Dealloc ไม่ควรทำกับอ๊อบเจกต์โดยตรง

หลักของการนับ Reference Counting
  • Alloc                 +1
  • Copy                 +1
    • แต่จะเป็นการเพิ่มที่เกิดจากออบเจกต์ที่สร้างใหม่อีกตัวหนึ่ง
  • Retain              +1
  • Release            -1
  • Autorelease     -1 แต่จะทำในอนาคต
ตัวอย่างที่ 1
NSObject *obj = [[NSString alloc] init];  //retain = 1
[obj release]; //ทำให้ retain = 0 จะมีการส่งข้อความไปยัง dealloc เพื่อทำการทำลายพื้นที่ที่จองไว้

ตัวอย่างที่ 2
NSObject *obj1= [[NSString alloc] init];  //retain = 1
NSObject *obj2 = [obj1 retain];  //retain = 2
[obj1 release]; //retain = 1
[obj2 release]; //retain = 0 ทำการเรียก dealloc เพื่อทำการทำลายพื้นที่ที่จองไว้

ตัวอย่างที่ 3
-(NSObject *) getObject
{
     NSObject *obj = [[NSObject alloc] init];
     return obj; //จะทำให้เกิด Memory leak นั่นคือการจองไว้แล้วไม่มีการคืน เปลืองพื้นที่ของโปรแกรม
}

ตัวอย่างที่ 4
-(NSObject *) getObject
{
     NSObject *obj = [[NSObject alloc] init];
     [obj release];  //retain = 0 จะทำการทำลายพื้นที่ที่จองไว้
     return obj; //ทำการส่งขยะคืนไป เพราะการสร้างและลบ ค่าที่ส่งไปจะเป็นขยะทำให้เกิดการ Crash
}

ตัวอย่างที่ 5
-(NSObject *) getObject
{
     NSObject *obj = [[NSObject alloc] init];
     [obj autorelease];  //เป็นการสัญญาว่าในอนาคตจะทำการลบพื้นที่ที่จองเอาไว้
     return obj; //เป็นวิธีการที่ดีที่สุด ไม่เปลือง ไม่ได้ขยะ มีการคืนในอนาคต แต่ในปัจจุบันมีการใช้ ARC เข้ามาช่วยในการจัดการกระบวนการ Retain & Release แล้ว ทำให้ง่ายต่อการ Developer
}

ตัวอย่างที่ 6
-(void)printHello
{
     NSString *string;
     string = [NSString stringWithFormat : @"Hello"];
              //NSString เป็นชื่อคลาสที่ Pointer string ชี้อยู่
             //stringWithFormat เป็น Method ในการจัดเก็บข้อความ
     NSLog(@"%@",string);
            //เป็น Method ในการแสดงข้อความที่เก็บอยู่ในตัวแปล String
            //NSLog เปรียบเสมือนการสั่ง Printf
}
** ในตัวอย่างนี้ไม่ต้องมีการสั่ง Retain & Release เนื่องจาก stringWithFormat , NSLog เป็นส่วนของ Convenience constructors ไม่ต้องทำการคืนหรือจองหน่วยความจำ **

  • การจองหน่วยความจำจะเกิดขึ้นกับการ Alloc Copy Retain Release autorelease เท่านั้น
  • ข้อยกเว้น ในการ dealloc ไม่สามารถเข้าถึงออบเจกต์โดยตรงได้ แต่สามารถเข้าถึง Super Class โดยตรงได้ สามารถกำหนดโดย [super dealloc];
การแสดงสถานะที่ออบเจกต์นั้นอยู่ทำได้ผ่านการส่งข้อความดังนี้
NSLog (@"%@ called : %@", NSStringFormSelector(_cmd),self);
  • NSStringFormSelector(_cmd) : เป็นการบอกว่าออบเจกต์นั้นอยู่ใน Methods ใด
  • Self : เป็นการบงบอกว่า เรียนออบเจกต์ใดออกมาใช้อยู่ เปรียบเสมือน this ในภาษาจาวา
Automatic Reference Counting (ARC)
** สามารถเลือกได้ในขั้นตอนแรกของการสร้างโปรเจค **
  • ARC เป็นฟีเจอร์ของคอมไพเลอร์ที่ช่วยในการจัดการหน่วยความจำ (Retain & Release)
  • คอมไพเลอร์จะแทรกโค๊ดให้อัตโนมัติ
  • ไม่ลดความเร็วในการทำงานของโปรแกรม
  • ในการประการออบเจกต์ต้องทำการระบุว่าใครเป็นเจ้าของ
    • เจ้าของ (Owner) จะเป็นออบเจกต์ชนิด Strong Relationship
      • จะมีนับเมื่อเริ่มชี้ไปยังออบเจกต์ (alloc)
    • อ้างอิง จะเป็นออบเจกต์ชนิด Weak Relationship
      • จะไม่มีการนับ เมื่อทำการชี้ไปยังออบเจกต์ ซึ่งจะทำให้ออบเจกต์ที่อ้างอิงอยู่ถูกทำลายลงไปเมื่อไหร่ก็ได้ แต่เมื่อถูกทำลายตัวออบเจกต์จะถูกกำหนดค่าเป็นค่า nil (ค่าว่าง) 
      • การกระทำนี้อาจจะทำให้ข้อมูลที่เราต้องการเรียกใช้เกิดความผิดเพี้ยน
      • ไม่ว่าอย่างไรนักพัฒนาจำเป็นจะต้องตรวจสอบการเรียนใช้หน่วยความจำของตัวเองอยู่ดี เพราะถ้ามีการผิดพลาด ARC จะช่วยไม่ใช้โปรแกรม Crash เท่านั้น
  • หากการประกาศตัวแปรไม่ระบุบว่าเป็น __strong หรือ __weak จะถือว่าเป็น __strong
  • ข้อควรระวัง
    • การกำหนดให้เป็น __weak จะออบเจกต์อ้างอิงสามารถถูกทำลายเมื่อใดก็ได้
    • _strong อาจจะทำให้เกิด Circular Ownership (deadlock)
      • deadlock คือการค้างอยู่ในระบบ มีการจองพื้นที่เป็นของกันและกัน ไม่สามารถลบทิ้งออกจากระบบไปได้ เช่น A จองพื้นที่เดียวกันกับ B และ A กับ B เป็นของกันและกัน สามารถแก้ไขได้จากการออกแบบโปรแกรมเท่านั้น
ตัวอย่างที่ 1.1 เรียกใช้ ARC
กำหนดให้ myClass เป็น Class ที่สืบทอดมาจาก NSObject

myClass *var1 = [[myClass alloc] init];  //retain = 1
myClass * __strong var2;

var2 = var1;
   // แสดงว่า var2 มาขอเป็นเจ้าของร่วมกับ var1


ตัวอย่างที่ 1.2 ใช้แบบไม่มี ARC
myClass *var1 = [[myClass alloc] init];  //retain = 1
myClass * var2 = nil;  //

if(var2 != var1)
{
     [var2 release]; 
     var2 = [var 1 retain]; //retain = 2
}
[var2 release];  //retain = 1
[var1 release];  //retain = 0

ตัวอย่างที่ 2.1 ใช้ ARC
myClass *var1 = [[myClass alloc] init];  //retain = 1
myClass * __weak var2;

var2 = var1;

[var1 release]; 
[var2 doSomething]; 
   //รันผ่าน แต่จะได้ค่าของ var2 ที่ผิดเพี้ยนไป เพราะพื้นที่ที่จองไว้ถูกทำลายไปแล้ว อาจจะไปได้อย่างอื่นมาแทน

ตัวอย่างที่ 2.2 ใช้แบบไม่มี ARC
myClass *var1 = [[myClass alloc] init];  //retain = 1
myClass * var2 = nil;  //

if(var2 != var1)
{
     [var2 release]; 
     var2 = [var 1 retain]; //retain = 2
}

[var1 release];  //retain = 0
[var2 doSomething]; 
   // รันผ่าน แต่จะได้ค่าของ var2 ที่ผิดเพี้ยนไป เพราะพื้นที่ที่จองไว้ถูกทำลายไปแล้ว อาจจะไปได้อย่างอื่นมาแทน

ตัวอย่างโปรแกรมที่ทำให้เกิด Deadlock
@interface Department : NSObjcet
{
    Person* __strong head;
}
@end

@interface Person : NSObject
{
     Department* __strong dept;
}
@end


ปล. จบแล้วจร้า 1 ส่วนของวันที่ 2
ปล. หากมีข้อผิดพลาดประการใด ขออภัยไว้ ณ ที่นี้ด้วยจร้า

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

Introduction to Objective - C (Day01 @ iDeveloper03)


Introduction to Objective - C
การเขียนโปรแกรมแบบ OOP

ประวัติโดยย่อ ของ ภาษา Objective - C
  • เป็นภาษาเชิงวัตถุซึ่งเป็นส่วนขยายของภาษา C
  • Brad J Cox และ Tom Love ออกแบบในยุค 80
  • มีแนวคิดมาจากภาษา SmallTalk


การนิยามคลาสในภาษา  Objective - C
ขั้นตอนที่ 1 : เขียนส่วน interface ของคลาส
เป็นส่วนที่ประกาศว่าคลาสนั้นมี Attribute และ Method อะไรบ้าง
โดยจะบันทึกไว้ในไฟล์ที่มีนามสกุล .h ซึ่งเรียกว่า Header File

@interface CLASSNAME :  SUPERCLASSNAME
{
     Attribute declarations
}
     Method declarations

@end

  • CLASSNAME : ชื่อคลาส
  • SUPERCLASSNAME : ชื่อคลาสหลักที่ทำการสืบทอดมา เป็นคลาส UI..... , NS..... , เป็นต้น
  • Attribute Declarations : ตัวแปรที่ระบุถึงคุณสมบัติภายในคลาส
  • Method Declarations : กระบวนการที่ภายในคลาสสามารถทำได้
ตัวอย่างเช่น

@interface Account : NSObject
{
     int accountID;
     NSStrint *accountName;
     float balance;
}
-(void)deposit : (float)amount;
-(void)withdraw : (float)amount;
-(float)getBalance;
@end

**หมายเหตุ**
-(void)deposit : (float)amount;
  • เครื่องหมาย - +
    • - คือ (instance) method สร้าง Object ขึ้นมาได้และเรียกใช้
    • + คือ class method ที่สามารถเรียกใช้ได้โดยตรง

ในส่วนนี้เค้ายังไม่เข้าใจว่า ตัว + - หมายถึงอะไร แต่ส่วนใหญ่ - ถูกใช้เยอะที่สุด

และถ้าหาคำตอบได้ จะมาบอกเน้อ จุ๊ฟๆ



  • void คือ RETURN TYPE
  • deposit คือ Method name
  • float คือ Parameter TYPE
  • amount คือ Parameter NAME
  • สรุปคือ - (Returne Type) Method name : (Parameter TYPE) parameter name
  • เปรียบได้เหมือนกับ public void deposit (float amount) ในการเขียน Function ทั่วไป

ขั้นตอนที่ 2 เขียนส่วน Implementation ของคลาส
โดยจะบันทึกไว้ในไฟล์ที่มีนามสกุล .m ซึ่งเรียกว่า Implementation File

#import "interfaceFile.h"

@implementation CLASSNAME

      Method definitions

@end

ตัวอย่างเช่น

#import "Account.h"
@implementation Account

-(void)deposit : (float)amount;
{
       balance = balance + amount;
}

-(void)withdraw : (float)amount;
{
       balance = balance - amount;
}

-(float)getBalance;
{
       return balance;
}

@end


การสร้างอ๊อบเจกต์ในภาษา Objective - C

#import "Account.h"  //import interface ของคลาส Account ก่อนเรียกใช้

int main()
{
     Account *myAcc;   //สร้างตัวแปร pointer เพื่อใช้ชี้ไปยังอ๊อบเจกต์ประเภท Account
     myAcc = [Account alloc];  //ส่ง message "alloc" ไปยัง Account เพื่อสร้างอ๊อบเจกต์ใหม่ โดยให้ myAcc ไปชี้ที่อ๊อบเจกต์ใหม่ที่สร้างขึ้นมาใหม่
     [myAcc init];         //ส่ง message "init" ไปยังอ๊อบเจกต์ชี้โดย myAcc เพื่อทำการ intiallize อ๊อบเจกต์ขึ้นมาใหม่

}

จากกระบวนการทั้ง 3 บรรทัด
     Account *myAcc;
     myAcc = [Account alloc];
     [myAcc init];  
สามารถรวมได้เป็น Account *myAcc = [[Account alloc] init];

การส่ง message 
     [myAcc init];
     [myAcc deposit : 100];    //การส่ง message สำหรับการฝากเงินจำนวน 100 บาท
     [myAcc withdraw : 50];

NSObject : คลาสหลักของคลาสเกือบทั้งหมด เป็นคลาสที่เป็น method พื้นฐาน

  • Alloc : เป็นคลาส ใช้สร้างอ๊อบเจคใหม่ในหน่วยความจำ กำหนดค่า Attribute ทุกตัวเป็น 0 และ return pointer ไปยังอ๊อบเจกต์ที่สร้างขึ้นมา
  • Dealloc : จะถูกเรียนกโดยอัตโนมัติเมื่ออ๊อบเจกต์ถูกทำลาย โดยมีหน้าที่ทำการคืนทรัพยากรให้กับกน่วยความจำ
  • init : มีหน้าที่ initialize อ๊อบเจกต์ใหม่ ถ้าทำสำเร็จจะทำการ return pointer กลับไปยังอ๊อบเจกต์ แต่ถ้าทำผิดพลาดจะทำการ return nil กลับไปแทน
  • copy : สร้างอ๊อบเจกต์ใหม่ขึ้นมา และคัดลอกคุณสมบัติอีกอ๊อบเจกต์หนึ่งเข้าไป โดยจะ return pointer ของอ๊อบเจกต์ใหม่ออกมา
Object Initialization : กระบวนการการเตรียมอ๊อบเจกต์ที่สร้างใหม่ให้พร้อมใช้งาน
  • ทุกคลาสที่มีการสืบทอดจาก NSObject มี Methods ชื่อ init ไว้สำหรับการกำหนดค่าเริ่มต้นแล้ว
  • แต่ถ้าหากต้องการกำหนด initialize เพิ่มเติมจากคลาส ต้องทำการ override init ขึ้นมา
  • เมื่อกำหนดค่าเริ่มต้นได้สำเร็จ ควรจะ return pointer ไปยังอ๊อบเจกต์เองเลย แต่หากมีข้อผิดพลาดก็จะทำการ return nil ไปให้กับอ๊อบเจกต์
  • Sub Class ที่ Override init นั้นจำเป็นต้องมีการเรียกใช้ [super init] สามารถตรวจสอบว่า super class ดำเนินการ init สำเร็จหรือไม่
กำหนดค่าเริ่มต้นให้กับคลาสได้โดย
-(id)init
{
     self = [super init]
     if(self)
     {
         //Initialization code here.
      }
      return self;
}


สตริง (NString)
NSString เป็นคลาสที่มาพร้อมกับเฟรมเวิร์ค Foundation ของอ๊อบเจกต์ของคลาส
ใช้เก็บข้อความที่ประกอบไปด้วยอักขระ (Unicode)

สตริงเก็บอยู่ในรูปของอ๊อบเจกต์ไม่สามารถเปลี่ยนแปลงได้ (immutable)

การใช้งานสามารถกำหนดค่าสตริงได้ดังนี้

  • "abcd" เป็นการเก็บแบบอาเรย์
  • @"abcd" เป็นการเก็บไว้ภายในอ๊อบเจกต์เดียว
วิธีการสร้างอ๊อบเจกต์ NSString ในรูปแบบที่ใช้บ่อย
  • NSString Iuteral : 
    • NSString *accountName = @"iDev2";
  • Alloc and init : 
    • NSString *accountName = [[NSString alloc] initWithFormat : @"iDev%d", 2];
  • String builder method : 
    • NSString *accountName = [NSString stringWithFormat : @"iDev%d",2];
  • สรัางสตริงจากภาษา C
    • NSString *accountName = [[NSString alloc] initWithCString : "iDev2"];
  • สร้างสตริงใหม่โดยการต่ออ๊อบเจกต์
    • NSString *String1 = @"iDevelopers";
    • NSString *String2 = @"course";
    • NSString *String3 = [NSString stringWithFormat : @"%@ %@", string1 , string2];
           เมื่อแสดงผลโดย NSLog(@"%@ : %d",String3 , 3);
           จะได้เป็น
                     iDevelopers course : 3

การตัดข้อความภายใน NSString
      NSString *String1 = @"iDevelopers";
      NSString *String2 = [String1 substringFromIndex : 2];
      //การเก็บสตริงตัวที่ 2 เป็นต้นไป โดยตัดตัวที่ 0 - 1
      NSString *String3 = [String1 substringToIndex : 5];
      //การตัดเก็บสตริงไว้เพียง 5 ตัวแรก คือตัวที่ 0 - 4
      NSString *String4 = [String1 substringWithRange : (NSRange){3,4} ];
      //การเก็บสตริงตั้งแต่ตัวที่ 3 ไว้จำนวน 4 ตัว คือ ตัวที่ 3 - 6

ดังนั้นผลลัพธ์คือ
     String 1 = @" iDevelopers "
     String 2 = @" veelopers "
     String 3 = @" iDeve "
     String 4 = @" velo "

การค้นหาคำภายใน String
NSString *String1 = @"age";
NSString *String2 = @"pager";
NSRange foundRange = [String2 rangoOfString: String1 option: (NSCaseInsensitiveSearch)];

ผลลัพธ์ที่ได้จะเป็น foundRange = NSRange {1 , 3}

การเปรียบเทียบ NSString
NSString *String1 = @"abcd";
NSString *String2 = @"ABCD";
BOOL isEqual = [String1 isEqyalToString : String2];

//ผลลัพธ์ที่ได้จะเป็น isEqual = NO

การกำหนดรูบแบบอักษร

NSString *String1 = @"apple MAC iOS";
NSString *String2 = [String1 uppercaseString];
          //การกำหนดให้ตัวอักษรเป็นตัวใหญ่ทั้งหมด
          //String2 = @"APPLE MAC IOS"
NSString *String3 = [String1 lowercaseString];
          //การกำหนดให้ตัวอักษรเป็นตัวเล็กทั้งหมด
          //String3 = @"apple mac ios"
NSString *String4 = [String1 capitalizedString];
          //การกำหนดให้ตัวอักษรตัวแรกเป็นตัวใหญ่เท่านั้น ที่ตามมาเป็นตัวเล็ก
          //String4 = @"Apple Mac Ios"


ปล. แบ่งออกมาตามคำแนะนำของเพื่อนจักร อิอิ
ปล. หากมีข้อผิดพลาดประการใด ขออภัยมา ณ ที่นี้ด้วยนะ

INTRODUCTION TO iOS Programming (Day01 @ iDeveloper03)


เมื่อวานเป็นวันแรก วันที่ 28-08-55

ได้ไปอบรม iDeveloper รุ่นที่ 3

ที่สถาบันพระจอมเกล้าลาดกระบัง

อะหื้ม มมมมมม

การเดินทาง ยากสักเล็กน้อย หลายต่อเสียเหลือเกิน

จะโทษใครก็ไม่ได้ เพราะตื่นไม่ไหวเอง ทำให้การเดินทางเร่งรีบ

ออกจากบ้าน นั่งมอไซด์ ต่อใต้ดิน ไปแอร์พอตลิ้ง นั่งแท็กซี่

555 5 นั่งรถจนเหนื่อยเลย

ไปถึงนั่งเรียน เรียน เรียน 6 ชั่วโมง ที่แสนจะมีความสุข

ตกเย็นก็กลับบ้าน นั่งแท็กซี่ แอร์พอตลิ้ง BTS สองแถว

ลดมานิดหน่อยเนอะ ว่ามะ 555


แต่มันเป็นการเดินทางที่คุ้มค่า คุมกับความรู้ที่ได้มา
และจะตั้งใจเรียนจริงๆ อิอิ

ป.ล. ไปลาดกระบังครั้งนี้ ทำให้รู้สึกว่าอยากเรียน มหาลัยที่แสนกว้าง 555 สงสัยจะไม่ทันแล้วหล่ะ คริคริ




บทแรกที่เรียนในวันนี้
INTRODUCTION TO iOS Programming
By ดร.อิสระ อนันตวราศิลป์


IOS
IOS  คือ ระบบปฏิบัติการของอุปกรณ์เคลื่อนที่ของ Apps 
ถูกออกแบบและพัฒนามาจาก Mac OS 
ซึ่งเป็นระบบ UNIX (ระบบเก่า ที่เสถียรมาก) ประเภทหนึ่ง
ปัจจุบันอยู่้ที่เวอร์ชั่น 5.1.1 ซึ่ง 6.0 
น่าจะออกในเร็ววันนี้ (ข่าวลือมาว่าน่าจะกลางเดือนกันยายน)

iDevice หมายถึง อุปกรณ์ต่างๆ ได้แต่ iPhone , iPod Touch , iPad , Apple TV 
มีฟังก์ชันการทำงานต่างๆ เช่น Swipe (เลื่อน) , 
Tap (กด สัมผัส เลือกเมนู เลือกปุ๋ม) , Pinch (หยิบ รวบ การใช้ 4  นิ้ว 5 นิ้ว)
ปกติแล้วจะทำด้วย Touch Gestures
มีฮาร์ตแวร์ต่างๆภายใน iDevice มากมาย ดังนี้
- กล้องถ่ายรูป / วีดีโอ
- Gyroscope : ตรวจับการวางตัวบนแนวระนาบของอุปกรณ์
- Accelerometer : ตรวจจับอัตราเร่ง
- GPS receiver : ตรวจหาตำแหน่งปัจจุบัน
- Digital compass : ใช้ตรวจหาทิศทาง
- GSM : ติดต่อโทรเข้า โทรออก SMS MMS

* ในแต่ระ อุปกร์จะมีฮาร์แวร์ที่แตกต่างกัน เช่น iPad WiFi จะไม่มีฟังก์ชั่น GPS *


Apps & AppStore
อุปกรณ์ IOS สามารถรัน App ต่างๆที่สามารถหาโหลด 
หาซื้อได้จาก AppStore ซึ่งปัจจุบันนี้ มี App มากมายถึง 725,000 app 
มีการดาวโหลดมากกว่า 2.5 หมื่นล้านครั้ง


สิ่งที่เราต้องใช้ ในการพัฒนา App
1. IOS SDK (Software Development Kit)
1.1 Xcode IDE (Integrated Development Environment)  
ชุดของโปรแกรมที่ใช้พัฒนา IOS , MacOS
- Source cod editor
- Compiler
- Debugger
1.2 Device Simulator โปรแกรมจำลองการทำงานของ iDevice
2. ภาษา Objective - C
3. เครื่อง Mac .. Xbox & Simulator ทำงานบน Mac เท่านั้น
4. IOS Device (iDevice)

App Deployment
(การลง App ใน Device ของตัวเอง หรือ การขาย App ภายใน AppStore)
1. Registered iOS Developer
นักพัฒนาต้องลงทะเบียนกับแอปเปิ้ล
ถึงจะสามารถเข้าไปโหลด Xcod และ iOS SDK ได้
2. iOS Developer program Mermber
นักพัฒนาต้องจ่ายเงินให้กับแอปเปิ้ล
ถึงสามารถนำ App ลงเครื่องของคุณ และ นำไปขายใน AppStore ได้
โดยแบ่งเป็น 3 ประเทภ ดังนี้
- Individual Program ($99) 
ขายหรือแจกภายใน AppStore โดนหักค่าการตลาด 30%

- Enterprise Program ($299) 
จัดจำหน่าย ทำการตลาดเอง

- University program (Free) 
ลงได้ภายในเครื่องที่ใช้พัฒนา ไม่สามารถแจกจ่ายได้

*ทั้ง 3 ประเภทนั้นจะสามารถใช้ได้ภายใน 1  ปี (สัญญา ปีต่อปี)

สรุปคือ การจะเป็นนักพัฒนาต้องมีดังนี้
1. รายชื่อทีมพัฒนา
2. รายชื่อเครื่องที่จะใช้พัฒนา
3. รายชื่อ App ที่จะใช้พัฒน

จากนั้นนำไปติดต่อกับทาง Apple เพื่อขอจดทะเบียน 
ในประเภทต่างๆ ดังได้กล่าวไว้ข้างต้น


OOP & UML
บทเรียนที่สอง
โดย ดร.อิสระ  อนันตวราศิลป์

Object Oriented Programming (OOP)
  • การเขียนโปรแกรมเชิงวัตถุ
  • รูปแบบการเขียนโปรแกรมที่ใช้แนวทางความคิดของ วัตถุ ในการออกแบบ และ สร้าง โปรแกรม
Object ,, อ๊อบเจกต์ ,, วัตถุ
  • Attributes : คุณสมบัติเฉพาะ หรือ ข้อมูลของวัตถุ
  • Methods ,, Operations : กริยา การโต้ตอบ หรือคำสั่งที่สามารถกระทำกับวัตถุได้ ถ้าในภาษาทั่วไป อาจจะเรียกว่า Function 

ตัวอย่างเช่น บัญชีธนาคารของนายดำ แซ่ขาว
  • Object : บัญชีธนาคารนายดำ
  • Attributes : 00001 , นายดำ แซ่ขาว , 5000 บาท , ........
  • Methods :  การฝาก  ,  การถอน  ,  การโอน  ,  การดูจำนวนเงิน .....

Class (คลาส) : ต้นแบบกำหนดคุณสมบัติ และการทำงานของวัตถุ ประกอบไปด้วย Attributes และ Methods เหมือนกัน

ตัวอย่างเช่น บัญชีธนาคาร
  • Class : บัญชีธนาคาร
  • Attributes (คุณสมบัติเฉพาะของคลาสนั้นๆ) :  เลขที่บัญชี , ชื่อบัญชี , จำนวนเงินภายในบัญชี ....
  • Methods (คำสั่งที่คลาสนั้นสามารถทำได้ สามารถรับได้) : การฝาก  ,  การถอน  ,  การโอน  ,  การดูจำนวนเงิน .....
Object Instantiation : การจองพื้นที่ในหน่วยความจำ (Memory) ไว้สำหรับการเรียนใช้้อมูลผ่านทางอ๊อบเจกต์ของคลาสนั้นๆ โดยการจองนั้นจะมีค่า Attribute ที่แตกต่างกันออกไป

ตัวอย่างเช่น บัญชีธนาคารของนายดำ และนางสาวแดง
  • Object : บัญชีธนาคารนายดำ
  • Attributes : 00001 , นายดำ แซ่ขาว , 5000 บาท , ........
  • Methods :  การฝาก  ,  การถอน  ,  การโอน  ,  การดูจำนวนเงิน .....

  • Object : บัญชีธนาคารนางสาวแดง
  • Attributes : 00002 , นางสาวแดง แซ่เขียว , 5000 บาท , ........
  • Methods :  การฝาก  ,  การถอน  ,  การโอน  ,  การดูจำนวนเงิน .....
* จะเห็นได้ว่ามีการขีดเส้นใต้ คือสิ่ที่จะต้องไม่เหมือนกัน เพื่อการเรียกใช้ เป็นการแทนด้วยรหัส ลองมองกลับไป การที่เรามีเลขที่บัญชีของเรากับของเพื่อน ซึ่งเป็นธนาคารเดียวกัน จำเป็นจะต้องไม่ซ้ำกัน ถ้าซ้ำกันก็เรื่องใหญ่แล้วคร๊าบพี่น้อง *

Object Messaging : การปฏิสัมพันธ์กันโดยการส่งข้อความ
  • Messaging คือข้อความ หรือคำสั่งที่อ๊อบเจกต์นั้นสามารถทำได้ โดยการกำหนดผ่านทาง Attributes ไว้ตายตัวอยู่แล้ว ถ้าต้องการทำนอกเหนือจากนั้นต้องทำการสร้าง Attributes เพิ่มก่อน เพราะ Attribute หมายถึงความสามารถที่อ๊อบเจ๊กต์นั้นสามารถกระทำได้ ดังได้กล่าวไว้ข้างต้นแล้ว
  • ตัวอย่างเช่น : ต้องการฝากเงินจำนวน 100 บาท ,, ต้องกาดูยอดเงิน
Encapsulation : การซ้อนข้อมูลไว้ภายใน ,, การซ้อน Attribute ของอ๊อบเจกต์ไว้ภายใต้ accessor 

  • Accessor : คือการขอดูข้อมูล การ retune ค่าที่อยู่ภายใน Attribute เป็นพวกของการ get  Methods ต่างๆ
  • Mutator : คือการเพิ่มเติม ปรับปรุงข้อมูล ภายใน Attribute เป็นพวกของการ set Methods
ข้อดีของ Encapsulation

  • ปลอดภัย : สามารถควบคุมการเข้าถึงข้อมูลของอ๊อบเจกต์ได้
  • แก้ไขง่าย : แก้ไขได้ทันที โดยไม่มีผลกระทบถึงอ๊อบเจกต์ตัวอื่นๆ ถ้ามีการเชื่อมโยงกันของข้อมูลก็สามารถเรียกใช้ผ่านทาง Methods เดิม แต่เพียงค่าที่ออกมานั้นจะมีการปรับปรุงเป็นค่าที่ถูกต้องแล้ว
ตัวอย่างเช่น การดูจำนวนดอกเบี้ยในบัญชีธนาคารของนายดำ
  • Object : บัญชีธนาคารนายดำ
  • Attributes : 00001 , นายดำ แซ่ขาว , 5000 บาท , ........
  • Methods :  การฝาก  ,  การถอน  ,  การโอน  ,  การดูจำนวนเงิน .....
จากตัวอย่างขั้นต้น นายดำจะไม่สามารถดูจำนวนดอกเบี้ยภายในธนาคารได้ เพราะไม่มี Methods ในการแสดงจำนวนดอกเบี้ย ภายในบัญชีของนายดำ ดังนั้นถ้าต้องการเพิ่มเติม Methods นั้น จำเป็นต้องไปขอให้ธนาคารเพิ่ม Methods การดูจำนวนดอกเบี้ยให้ก้บระบบบัญชีธนาคาร (Class บัญชีธนาคาร)

Inheritance : การสืบทอดคุณสมบัติจากคลาสหนึ่ง มายังอีกคลาสหนึ่งได้

ตัวอย่างเช่น A รับการสืบทอดคุณสมบัติมาจาก B
                     นั้นหมายความว่า Class A เป็น sub Class ของ Class B
                     และ Class B เป็น Super Class ของ Class A
** Sub Class สามารถเพิ่มเติม ปรับปรุง เปลี่ยนแปลง Attribute , Method ของ Super Class ได้ **

ตัวอย่างเช่น บัญชีออมเงินที่สืบทอดมาจากบัญชีธนาคาร
  • Super Class : บัญชีธนาคาร
  • Sub Class : บัญชีออมเงิน
  • Attributes (คุณสมบัติเฉพาะของคลาสนั้นๆ) :  เลขที่บัญชี , ชื่อบัญชี , จำนวนเงินภายในบัญชี , อัตราดอกเบี้ย ....
  • Methods (คำสั่งที่คลาสนั้นสามารถทำได้ สามารถรับได้) : การฝาก  ,  การถอน  ,  การโอน  ,  การดูจำนวนเงิน , ดูจำนวนอัตราดอกเบี้ย , กำหนดอัตราดอกเบี้ย , จำนวนเงินที่อัพเดท ....
จากตัวอย่างจะเห็นได้ว่ามีการเพิ่มเติมค่าของอัตราดอกเบี้ย และ Method การทำงานต่างๆ เพราะโดยปกติแล้ว ถ้ามีการออมเงิน จำเป็นจะต้องมีเรื่องของอัตราดอกเบี้ยเข้ามาเกี่ยวข้อง และผู้ฝากมักจะอยากรู้จำนวนเงินที่ตัวเองได้จากการออม ทั้งผลรวม และ จำนวนเงินที่ได้จากดอกเบี้ย

Unified Modeling Language : UML
 UML เป็นชุดแผนภาพลักษณะ (diagram) เพื่อแสดง Model เชิงวัตถุและอธิบายกระบวนการการทำงาน และเป็นชุดที่มีความหมายเป็นมาตรฐาน มีหลายประเภท ดังต่อไปนี้

USE CASE Diagram
อธิบายสิ่งที่ระบบทำ และมีปฏิสัมพันธ์กัน ระหว่างระบบ กับ ผู้กระทำ (Actor) ในมุมมองของผู้กระทำ

CLASS Diagram
อธิบายโครงสร้างของระบบ ด้วยคลาสและอ๊อเจกต์ ซึ่งจะบงบอกว่า คลาสๆนั้นสามารถเก็บ Attribute อะไรได้บ้าง มีความสามารถในการกระทำ Attribute ผ่านทาง Methods อะไรได้บ้าง

ASSOCTATIONS
ความสัมพันธ์ระหว่างคลาส 2 คลาส
  • สามารถระบุจำนวนความสัมพันธ์ได้
  • สามารถระบุทิศทางของความสัมพันธ์ได้
INHERITANCE (IS A)
เป็นความสัมพันธ์ระหว่าง Sub Class และ Super Class ที่มีการเรียกใช้ Method หรือ Attribute ตัวเดียวกัน โดยมีการระบุว่า มีหรือไม่มีผ่านทาง สามเหลี่ยม และตัวที่ระบุถึงจะกลายเป็นตัวเอียง ในส่วนของ Super Class
  • Describing Taxonomy : ความสัมพันธ์ของคลาส รูปแบบ is a นั้นจะมีการให้ความสำคัญจากบนลงล่าง โดยคลาสที่อยู่บนสุดจะเป็นคลาสที่ใหญ่สุดเปรียเสมอคลาสแม่
  • Abstract Operation : เป็นการกำหนดตัวเอียงให้กับ Attribute หรือ Methods ที่อยู่ภาย Super Class ที่ถูกอ้างถึง
ตัวอย่างเช่น คลาสนกบินได้ is a คลาสนก แสดงให้เห็นว่า คลาสนกบินได้ เป็น Sub Class ที่มีการ inheritance บางอย่างจากคลาสนกที่เป็น Super Class

AGGREGATION (PART - OF)
ความสัมพันธ์ที่ Class หนึ่ง เป็นส่วนหนึ่งของอีก Class หนึ่ง โดยระบุผ่านทางสัญลักษณ์ สี่เหลี่ยมข้าวหลามตัด

ตัวอย่างเช่น Class นาฬิกา จะมีส่วนประกอบที่ประกอบไปด้วย คลาสปุ๋ม คลาสหน้าจอ คลาสแบตเตอรี่่ เป็นต้น

COMPOSITION : ส่วนที่แข็งกว่า Aggregation
ความสัมพันธืที่ระบุว่า จำเป็นจะต้องมีอีกคลาสหนึ่งเป็นส่วนประกอบ ซึ่งถ้า Composed Class (ผู้ถูกกระทำ) ถูกทำลาย แสดงว่า Composing Class (ผู้กระทำ) จะถูกทำลายไปด้วย

ตัวอย่างเช่น Class นาฬิกา จำเป็นจะต้องมี Class แบตเตอรี่ เพราะถ้า ไม่มีแสดงว่านาฬิกาไม่สามารถทำงานได้

DEPENDENCY
ความสัมพันธ์ที่แสดงให้เห็นว่า คลาส A ต้องการ คลาส B ในการทำงาน
ถ้าคลาส B เปลี่ยนปลง คลาส A จะเปลี่ยนแปลงตาม
แต่ถ้าคลาส A เปลี่ยนแปลง จะไม่มีผลกระทบ หรือมีการเปลี่ยนแปลงที่คลาส B

สัญลักษณ์ที่ใช้ในการแสดง คือการใช้เส้นที่มีหัวลูกศรชี้จากคลาส B ไปยังคลาส A

PACKAGE Diagram
เป็นการช่วยให้มองเห็นภาพรวมว่าสิ่งที่เราทำนั้นมีอะไรบ้าง
ซึ่งการออกแบบที่ดี ควรจะทำการออกแบบที่แสดงให้หัวลูกศรไปในทิศทางเดียวกัน
  • Package : กลุ่มของคลาสต่างๆที่เกี่ยวข้องกัน หรือทำงานร่วมกันบ่อยๆ
  • Sub Package : การแบ่งกลุ่มย่อยๆ ที่ทำงานร่วมกันกับ Package ดังกล่าวในรูปแบบคล้ายๆกัน
  • Subsystem decomposition : เป็นรูปแบบการการแยกออกมาเป็นส่วนๆ ที่ประกอบไปด้วย package และ Sub Package
ACTIVITY Diagram
แสดงให้เห็นถึงขั้นตอนการทำงานของระบบ และการส่งอ๊อบเจกต์ในแต่ละขั้นตอนการทำงาน บอกว่าเริ่มต้นจากจุดใด ส่วนไหนที่ทำงานพร้อมกันได้บ้าง ผลลัพธ์ที่ได้ส่งต่อไปยังกระบวนการใด เป็นต้น

SEQUENCE Diagram
อธิบายขั้นตอนการเรียก Method ต่างๆ ผ่านทางการส่ง Message ระหว่าง Class ว่าต้องส่งอะไรจากใคร ไปได้ผลกลับมาเป็นอย่างไร เป็นต้น




ปล. หากมีข้อผิดพลาดประการใด ขออภัยมา ณ ที่นี้ด้วย ^^"
ปล. จบแล้ว 1 วัน การเขียน Blog ไม่ใช่ง่ายอย่างที่คิดเลยหล่ะ T_T
ปล. ขอกำลังใจเยอะๆน๊า จะได้มีแรงเขียนต่อ 55555