โค้ดดังกล่าวแก้ปัญหาได้ด้วย recursive โดยให้มันตรวจสอบไปเรื่อยๆ ว่า status code ที่ได้เป็น 302 หรือไม่ ถ้าเป็น 200 แล้วก็ให้คืน URL นี้มาได้เลย
<WINGY+ />
Junior Programmer, Software Quality
5/13/2013
หา url จริงๆ จาก http redirect
จะเอามาลองทำ check status ของ alfresco แบบง่ายด้วยการให้ลอง GET จาก index page ซึ่ง alfresco ทำ redirect page ไว้ทำให้เรา request ไปจะได้ status code เป็น 302 กลับมาก็เลยลองเขียน python ให้มันแก้ปัญหานี้เพื่อหา URL ที่แท้จริงมาซึ่งก็ได้ประมาณนี้
5/11/2013
Mock object ที่ถูกสร้างใน method
โจทย์ของผมคือต้องใช้ Popen module subprocess แต่มีปัญหาว่าเราจะ mock ยังไงในเมื่อมันไป new object ใน method ไม่ได้มาจากการ inject ผ่าน constructor หรือ setter แต่อย่างใด ก็เลยเกิดไอเดียจากการนั่งอ่าน stackoverflow ทำให้เห็นภาพเป็นประมาณนี้
จากที่เห็นเราต้องสร้าง class MockPopen เพื่อเอามา mock ก่อนจากนั้นก็จัดการ mock method และ getter ต่อมาก็คือใช้ setattr เพื่อหลอกว่า Popen คือ MockPopen ที่เราสร้างขึ้น เมื่อ class Process เรียกใช้ก็ยังเห็นว่ามันเป็น Popen และที่เราเทสนั้นก็ยังกำหนด return_value และยังสามารถ verify ได้ว่า method ได้ถูก call หรือไม่
จากที่เห็นเราต้องสร้าง class MockPopen เพื่อเอามา mock ก่อนจากนั้นก็จัดการ mock method และ getter ต่อมาก็คือใช้ setattr เพื่อหลอกว่า Popen คือ MockPopen ที่เราสร้างขึ้น เมื่อ class Process เรียกใช้ก็ยังเห็นว่ามันเป็น Popen และที่เราเทสนั้นก็ยังกำหนด return_value และยังสามารถ verify ได้ว่า method ได้ถูก call หรือไม่
3/28/2013
Data Types ใน Tcl
หลักๆ เราคงจะรู้อยู่แล้่วว่าหลักๆ ยังไงต้องมีตัวเลข(Number) และข้อความ(String) ล่ะ ซึ่งก็ยังไม่ได้ดูนะว่า Data Type ของมันหน้าตาเป็นไง(Number มันเดาง่ายอยู่ล่ะ) แต่ก็มีคำถามที่คิดในหัวอยู่ล่ะหลักๆ คือ
- floating point มันเป็นอีก type มั้ย?
- จากที่เราเห็นข้างบนคำว่า pineapple มันเป็น Type อะไร?
- แล้วมันมี Type อื่นๆ อีกมั้ย
นั่งหาข้อมูลอยู่นานว่ามันจะทำยังไงให้เรารู้ว่า มันคือ Number หรือ String หาไปหามาก็เจอ link นี้ บอกว่า Tcl น่ะ มีแค่ String นะแต่ ห๊ะ อะไรนะ มันมีแค่ String!! จริงๆ คือมันไม่ได้มี Number Floating หรือ type หลักๆ ที่เราใช้กันเลย ทุกอย่างจะเป็น String หรือมองว่าเป็น Object ก็ได้ และเวลา มี Operator อะไรมากระทำมันก็จะเปลี่ยนแลงตรงนั้นให้เป็นค่าที่ต้องการเอง ซึ่งก็ตอบข้อ 1. กับ 2. ที่ผมสงสัยได้เลย แต่สงสัยขึ้นมาว่า
"แล้วเราจะตรวจสอบมันยังไง"
เพราะเวลาที่เราต้องมี Data Type เหตุผลส่วนหนึ่งเราต้องการตรวจสอบมันว่าเป็นอะไร หาไปหามาก็เจอ link นี้บอกว่า เราสามารถตรวจสอบได้ด้วยว่ามันคืออะไร โดยใช้
% string is type varName
ยกตัวอย่าง
% set a 5
5
% string is integer $a
1
สังเกตจากข้างบนมันจะ return ได้ออกมาเป็น 1 ซึ่งผมก็เดาไปเรื่อยว่ามันน่าจะใช่ หรือ true ล่ะมั้ง เลยเดาจากคำถามข้อ 1. ว่า floating point มันจะเป็น Data Type ชื่ออะไรโดยเริ่มจาก
% set a 0.1 ; # อันนี้ก็ลองเดาจากประสบการณ์การเขียนภาษาอื่นมา และมันก็ผ่านซะด้วย
0.1
% string is float $a
bad class "float": must be alnum, alpha, ascii, control, boolean, digit, double, entier, false, graph, integer, list, lower, print, punct, space, true, upper, wideinteger, wordchar, or xdigit
อ่าว มันด่ากลับมา T^T แสดงว่า floating point ของ Tcl ไม่ได้เรียกว่า float เอาล่ะงั้นลองไล่อ่านดูจากที่มันบอกล่ะกันว่าจะเป็นอันไหน ซึ่งก็เห็นว่ามันมีคำว่า double ซึ่งดูจะเข้าเค้าสุด
% set a 0.1
0.1
% string is double $a
1
เยส floating point ของ Tcl มันคือ double นั้นเอง แต่เห็นมัน return 1 ออกมาเลยอยากทดสอบดูว่ามันเป็น boolean จริงมั้ยโดย
% set a 1
1
% string is boolean $a
1
% string is true $a
1
"แล้ว Type อื่นล่ะไม่มีเลยจริงๆ เหรอ"
ผมก็ยังข้องใจอยู่ดีว่ามันไม่มีเลยเหรอ Data Type แบบอื่นเนี่ย พออ่านจาก link แรกแล้วก็พบว่ายังมีอีกนะ เช่น
- Arrays (เห็นมันบอกว่าเป็น String Arrays)
- Lists
- Handles
- Widgets
- Byte Codes
เขียนหมดนี่คงเยอะไว้ขึ้นหัวข้อหน้าดีกว่า
Hello World กับ Tcl
ผมได้รับคำสั่งให้เรียน Tcl เพื่อเอาไปทำงานลับบางอย่าง :) เมื่อเริ่มก็ต้องหาทางให้มัน Hello World ให้ได้ก่อน โดยเริ่มจาก
ลง Tcl ผมใช้ OS X เพราะงั้นก็จัดผ่าน Homebrew ซะเลย
$ brew install tcl-tk
ลงเสร็จปรากฎว่ายังใช้ไม่ได้เลยเพราะ มี Tcl version 8.5 อยู่ในเครื่องแล้ว :( เพราะงั้นก็เลยใช่วิธีแก้ปัญหาเฉพาะหน้าไปด้วยการ
export TCL_HOME="/usr/local/Cellar/tcl-tk/8.6.0"
export PATH="$TCL_HOME/bin:$PATH"
จากนั้นก็ลอง ตรวจสอบ tcl ดูว่ามันเป็นไปตามที่เรา export หรือไม่โดยการ
$ ls -la `which tclsh`
[censor] /usr/local/Cellar/tcl-tk/8.6.0/bin/tclsh -> /usr/local/Cellar/tcl-tk/8.6.0/bin/tclsh8.6
โอ้วว เยส!! มันได้ผล เพราะงั้นก็จัดเลย สร้างไฟล์ hello.tcl แล้วเปิดขึ้นมาแล้วจัด
puts "Hello World"
สั่งเซฟ แล้วจัดการรันโดยใช้
$ tclsh hello.tcl
Hello World
โอเคผ่าน :) พรุ่งนี้ค่อยทำความเข้าใจมันว่าเป็นมาอย่างไร
ลง Tcl ผมใช้ OS X เพราะงั้นก็จัดผ่าน Homebrew ซะเลย
$ brew install tcl-tk
ลงเสร็จปรากฎว่ายังใช้ไม่ได้เลยเพราะ มี Tcl version 8.5 อยู่ในเครื่องแล้ว :( เพราะงั้นก็เลยใช่วิธีแก้ปัญหาเฉพาะหน้าไปด้วยการ
export TCL_HOME="/usr/local/Cellar/tcl-tk/8.6.0"
export PATH="$TCL_HOME/bin:$PATH"
จากนั้นก็ลอง ตรวจสอบ tcl ดูว่ามันเป็นไปตามที่เรา export หรือไม่โดยการ
$ ls -la `which tclsh`
[censor] /usr/local/Cellar/tcl-tk/8.6.0/bin/tclsh -> /usr/local/Cellar/tcl-tk/8.6.0/bin/tclsh8.6
โอ้วว เยส!! มันได้ผล เพราะงั้นก็จัดเลย สร้างไฟล์ hello.tcl แล้วเปิดขึ้นมาแล้วจัด
puts "Hello World"
สั่งเซฟ แล้วจัดการรันโดยใช้
$ tclsh hello.tcl
Hello World
โอเคผ่าน :) พรุ่งนี้ค่อยทำความเข้าใจมันว่าเป็นมาอย่างไร
3/07/2013
ทำ trailing whitespace ตอนบันทึกไฟล์
เนื่องจาก git มันแคร์เรื่อง trailing whitespace มากเลยต้องหาวิธีตัดออกซึ่งใน vim ทำได้โดย
%s/\s\+$//
ซึ่งทำแบบนี้ต้องทำทุกครั้งก่อนที่เราจะเซฟซึ่งมันเหนื่อยและดูยุ่งยากโดยไม่จำเป็นเลยลองเขียน script ลงไปใน vimrc ซึ่งก็ได้ผลออกมาดังนี้
ซึ่งโค้ดข้างบนหมายความว่าทุกครั้งก่อนที่จะเขียนไฟล์หรือ buffer ให้ call function TrailingWhiteSpace ก่อนทุกครั้ง
1/01/2013
เป้าหมายปีนี้ (sprint แรก)
มานั่งเขียนเป้าหมายตัวเองที่อยากได้ปีนี้ อาจจะดูยาวไกลไปไม่เข้าหลัก agile งั้นแยกเป็น sprint ล่ะกัน sprint ล่ะเดือน ยาวไปมั้ยว่ะ ฮาๆๆ
ผมอยากได้ skill network programming มาได้ในครอบครอง
โดยจะต้อง เขียนบทความลงใน blog ตัวเองให้ได้ครบ 10 บทความ
แต่คงจะ retrospective รอบล่ะสัปดาห์ล่ะเพื่อมาทบทวนกันว่ามีปัญหาอะไรก่อนหน้าบ้างคงเอามาเขียนลง blog แม่มซะเลย จะได้เป็นเหมือนกับการส่องกระจกมองตัวเองด้วย
เริ่ม sprint แรก
ในนามของ กระผมผมอยากได้ skill network programming มาได้ในครอบครอง
โดยจะต้อง เขียนบทความลงใน blog ตัวเองให้ได้ครบ 10 บทความ
แต่คงจะ retrospective รอบล่ะสัปดาห์ล่ะเพื่อมาทบทวนกันว่ามีปัญหาอะไรก่อนหน้าบ้างคงเอามาเขียนลง blog แม่มซะเลย จะได้เป็นเหมือนกับการส่องกระจกมองตัวเองด้วย
11/18/2012
Subscribe to:
Posts (Atom)


