418512 ภาคต้น 2555/การบ้าน 3
เนื้อหา
Mercurial
ในเทอมนี้เราจะใช้ Mercurial ซึ่งเป็นซอฟต์แวร์สำหรับจัดการซอร์สโค้ดตัวหนึ่ง ในการให้การบ้าน การส่งการบ้าน รวมไปถึงการทำแล็บ
คุณสามารถดาวน์โหลด Mercurial ได้จาก [1] และถ้าคุณใช้ระบบปฏิบัติการ Windows เราแนะนำให้คุณลง TortoiseHg ด้วย เพราะมันช่วยทำให้คุณใช้ Mercurial ได้สะดวกขึ้นมาก
สมัครสมาชิก Bitbucket
Bitbucket เป็นบริการบนเว็บที่คุณสามารถสร้างที่เก็บ code repository (ที่เก็บโค้ด) ของตัวเองได้
การบ้านข้อ 1
ให้คุณลงทะเบียนกับ Bitbucket แล้วนำ username ของตัวเองไปกรอกไว้ใน Elab (ผมจะได้ตรวจได้ว่าคุณลงทะเบียนจริงหรือเปล่า)
Fork Repository 418512
วิชา 418512 ภาคต้น 2555 ได้สร้าง repository สำหรับเก็บโค้ดที่คุณจะต้องใช้ทำการบ้านไว้ที่ https://bitbucket.org/ssutee/418512first2012
คุณสามารถคัดลอก repository นี้มาเป็นของส่วนตัวของคุณได้โดยการ "fork" repository 418512first2012
เราจะสอนวิธีการ fork ให้ในชั้นเรียน
ข้อควรระวัง
- หลังจาก fork แล้วคุณต้องทำให้มันเป็น private repository เนื่องจากคุณจะทำการบ้านใส่ในนั้น
- ให้เพิ่ม user ชื่อ ssutee (อ.สุธี) เป็นหนึ่งใน user ของ repository ใหม่ ผมจะได้ download การบ้านคุณมาตรวจได้
การทำงานกับระบบจัดการซอร์สโค้ด
การทำงานโดยใช้ระบบจัดการซอร์สโค้ดมีขั้นตอนดังต่อไปนี้
คุณทำการ clone repository ที่เก็บอยู่บนเครื่องเซิร์ฟเวอร์ (ในที่นี้คือเครื่อง bitbucket.org) ลงเครื่องส่วนตัวของคุณ while true do pull ความเปลี่ยนแปลงที่อยู่บน server มา update ซอร์สโค้ดที่เก็บไว้บนเครื่อง แก้ไขซอร์สโค้ดบนเครื่องส่วนตัว commit ความเปลี่ยนแปลงที่คุณสร้าง push ความเปลี่ยนแปลงที่อยู่บนเครื่องส่วนตัวเข้าเครื่องเซิร์ฟเวอร์
คุณจะเห็นได้ว่ามีขั้นตอนที่มีชื่อเป็นภาษาอังกฤษสามขั้นตอนคือ clone, pull, update, commit, และ push ขั้นตอนสามขั้นตอนนี้เป็นคำสั่งของ mercurial ที่คุณสามารถใช้ได้โดยตรง และเราจะมาเรียนรู้มันกันในวันนี้
การ clone
การ clone คือการคัดลอก repository ทั้ง repository มาเก็บไว้บนเครื่องของคุณ สิ่งที่คุณได้มากับ repository คือประวัติศาสตร์ความเปลี่ยนแปลงทั้งหมดที่คุณเคยสร้างกับโค้ดที่อยู่ใน repository นั้น ฉะนั้นเมื่อคุณมี repository แล้วคุณสามารถจะย้อนไปดูโค้ดเวอร์ชันไหนก็ได้ตั้งแต่เริ่มต้นทำงาน คล้ายกับที่คุณสามารถดู history ของหน้าวิกินี้ได้
การโคลนเราจะใช้การสั่ง hg clone โดยให้คุณเข้าไปใน command prompt ของระบบปฏิบัติการคุณ แล้วสั่ง
hg clone https://bitbucket.org/<<ชื่อ account>>/418512first2012 <<ชื่อไดเรคทอรีที่คุณต้องการให้เป็นที่อยู่ของ repository>>
เช่น ถ้าผมต้องการให้ repository ของผมอยู่ที่ไดเรคทอรี c:\418512 ผมอาจจะสั่งคำสั่งต่อไปนี้
cd c:\ hg clone https://bitbucket.org/ssutee/418512first2012 418512
สำหรับคนที่ใช้ TortoiseHg คุณสามารถคลิกขวาในหน้าต่าง Explorer ของไดเรคทอรีที่คุณต้องการ "Clone a Repository Here..."
การบ้านข้อที่ 2
ในไดเรคทอรีที่คุณเพิ่งจะโคลนมามีไฟล์อะไรบ้าง? (รวมไฟล์ที่ถูกซ่อน (hidden) ด้วย)
การ pull
เวลาโปรแกรมเมอร์หลายคนทำงานพร้อมๆ กัน จะมีการตั้ง server กลางไว้หนึ่งเครื่องเพื่อเก็บโค้ดที่เสถียรและได้รับการทดสอบมาอย่างดีแล้ว หลังจากนั้นโปรแกรมเมอร์แต่ละคนก็จะ clone repository มาไว้บนเครื่องของตัวเอง แล้วทำงานไปเรื่อยๆ บางคนทำงานเสร็จแล้วก็จะส่งโค้ดที่ตนเองแก้ไขหรือเพิ่มเข้า repository ไป เมื่อโปรแกรมเมอร์คนอื่นต้องการจะได้ความเปลี่ยนแปลงที่โปรแกรมคนอื่นสร้างและส่งเข้าสู่ server แล้ว เขาจะทำการ "pull" มันออกมาจาก server
สำหรับการเรียนการสอนวิชานี้ server ที่ว่านี่คือ Bitbucket และ repository นี้คือ repository ที่เพิ่งจะ fork มา โดยจะมีผู้ใช้สองคนคือคุณกับผมเท่านั้น เวลาผมจะตรวจงาน ผมจะ pull ซอร์สโค้ดจาก repository ของคุณมา
นอกจากนี้ repository https://bitbucket.org/ssutee/418512first2012 ยังเป็น repository กลางของวิชา ซึ่งจะมีการบ้านและโค้ดใหม่ๆ เพิ่มขึ้นมาในสัปดาห์ต่อๆ ไป ดังนั้น ถ้าคุณต้องการโค้ดของแล็ปหรือการบ้าน คุณจะต้องไป pull มันจาก https://bitbucket.org/ssutee/418512first2012 มายัง repository บนเครื่องคอมพิวเตอร์ส่วนตัวของคุณ
เวลาจะ pull จาก https://bitbucket.org/ssutee/418512first2012 ให้คุณเข้าไปในไดเรคทอรีที่ของ repository แล้วสั่ง
hg pull https://bitbucket.org/ssutee/418512first2012
การ Update
เมื่อคุณเข้าไปดูในไดเรคทอรีของ repository บนเครื่องคอมพิวเตอร์ส่วนตัวของคุณ คุณจะพบว่ายังไม่มีความเปลี่ยนแปลงอะไรเกิดขึ้นเลย
นี่เป็นเพราะว่าสิ่งที่ Mercurial ทำเวลาคุณสั่ง pull คือการไปดึงเอา "เซตของความเปลี่ยนแปลง" (changeset) ที่ server มายังเครื่องของคุณ แต่มันยังไม่ได้ทำให้เซตของความเปลี่ยนแปลงนี้มีผลกับเนื้อหาของไฟล์ที่คุณกำลังแก้ไข
หากคุณต้องการทำให้ changeset ที่ดึงมามีผลต่อไฟล์ที่คุณกำลังแก้ไข ให้สั่ง
hg update
แก้ไขไฟล์
ให้ทดลองเปลี่ยนแปลงไฟล์ hw03/hello.py และสร้างไฟล์ hw03/hello2.py แล้วก็อปปี้เนื้อหาของ hw03/hello.py ไปใส่
การบ้านข้อที่ 3
คุณสามารถดูสถานะของไฟล์ต่างๆ ในไดเรคทอรีได้ด้วยการสั่ง
hg status
หลังจากลองสั่งคำสั่งนี้แล้วคุณเห็นอะไรบ้าง?
หลังจากคุณแก้ไขและสร้างไฟล์ใหม่นี้เสร็จแล้ว Mercurial ยังไม่รู้ว่ามีไฟล์ hw02/hello2.py นี้อยู่เลย ถ้าคุณอยากจะให้ Mercurial จัดการไฟล์นี้ให้ด้วย ให้สั่ง
hg add hw03/hello2.py
เพื่อบอกให้ Mercurial เพิ่มไฟล์ hw02/hello2.py เข้าในบัญชีของไฟล์ที่มันจัดการให้ ในกรณีที่คุณสร้างไฟล์ใหม่จำนวนหลายๆ ไฟล์ คุณสามารถสั่ง
hg add
เฉยๆ แล้ว Mercurial จะเพิ่มไฟล์ใหม่ทุกไฟล์ที่ยังไม่อยู่ในบัญชีให้โดยอัตโนมัติ
การบ้านข้อที่ 4
สั่ง hg status อีกครั้ง หลังจากลองสั่งคำสั่งนี้แล้วคุณเห็นอะไรบ้าง?
การ commit
แต่หลังจาก add ไฟล์ใหม่ไปแล้ว Mercurial ก็ยังไม่รู้ว่าเนื้อหาของไฟล์มีการเปลี่ยนแปลงแต่อย่างใด มันรู้เฉยๆ ว่ามีไฟล์ใหม่เท่านั้น หากเราต้องการให้ Mercurial รับทราบถึงการเปลี่ยนแปลงของเนื้อหาของไฟล์ต่างๆ เราต้องสั่ง
hg commit
เมื่อสั่งเช่นนี้แล้วคุณจะพบว่ามีหน้าต่าง text editor โผล่ขึ้นมาพร้อมกับข้อความทำนองนี้
HG: Enter commit message. Lines beginning with 'HG:' are removed. HG: Leave message empty to abort commit. HG: -- HG: user: pramook HG: branch 'default' HG: added hw02/hello2.py HG: changed hw02/hello.py
Mercurial บอกให้คุณใส่ "commit message" ซึ่งเป็นข้อความสั้นๆ ที่บอกว่าเราได้ทำอะไรไปก่อนที่จะทำการ commit ครั้งนี้ ในกรณนี้ให้คุณใส่ข้อความทำนองที่ว่าคุณเพิ่มไฟล์ hw02/hello2.py ไป แล้วกดเซฟ แล้วปิด text editor ของคุณ หลังจากทำเช่นนี้แล้วจะถือว่าการ commit สำเร็จ
การบ้านข้อที่ 5
ลองสั่ง hg status อีกครั้ง คุณเห็นอะไรบ้าง?
ถ้าคุณเห็นผลลัพธ์เป็นเหมือนกับผลลัพธ์ในคำถามที่ 4 แสดงว่าคุณทำการ commit ไม่สำเร็จ ฉะนั้นจงทำตามขั้นตอนข้างบนใหม่อีกครั้ง
การ push
การ commit เป็นการสร้าง changeset ซึ่งระบุความเปลี่ยนแปลงที่คุณได้ทำขึ้นตั้งแต่การ clone repository หรือการ commit ครั้งก่อนหน้านั้น เจ้า changeset ที่สร้างขึ้นนี้จะอาศัยอยู่ใน repository บนเครื่องคอมพิวเตอร์ส่วนตัวของคุณ แต่เวลาที่คุณจะส่งแล็ปหรือส่งการบ้าน คุณจะต้องส่ง changeset ที่คุณสร้างไปยัง server กลาง การส่ง changeset นี้เรียกว่าการ "push" ซึ่งคุณสามารถ push ได้ด้วยการสั่ง
hg push
ซึ่งจะทำให้ changeset ที่คุณสร้างขึ้นจากการ commit เมื่อตะกี้ถูกสั่งไปยัง repository ต้นฉบับที่คุณ clone repository บนคอมพิวเตอร์ส่วนตัวของคุณมา (นั่นคือ repository ที่ https://bitbucket.org/<<ชื่อ account ของคุณ>>/418512first2012)
อิสรภาพจากเครื่องคอมพิวเตอร์
เมื่อคุณ push โค้ดที่คุณเขียนไปยัง server กลางทั้งหมดแล้ว คุณสามารถที่จะย้ายไปทำงานที่เครื่องคอมพิวเตอร์เครื่องอื่นที่มี Mercurial ลงได้
ขอให้คุณเปลี่ยนเครื่องคอมพิวเตอร์ที่คุณใช้ไปเครื่องที่อยู่ข้างๆ เมื่อไปถึงแล้วให้สั่ง
hg clone https://bitbucket.org/<<ชื่อ account>>/418512first2012 <<ชื่อไดเรคทอรีที่คุณต้องการให้เป็นที่อยู่ของ repository>>
แล้วตรวจสอบดูว่ามีไฟล์ hw02/hello2.py หรือไม่ และไฟล์ lab-02/hello.py เป็นไปตามที่คุณเคยแก้ไขมันไว้หรือไม่ด้วย