วันเสาร์ที่ 27 มิถุนายน พ.ศ. 2558

การติดตั้ง Robot Framework

การติดตั้ง Robot Framework

สิ่งที่ต้องลงตามลำดับ

  1. Install Python

  2. Install PIP

  3. Install Robot Framework

1. วิธี Install Python

1. ไปที่ URL: https://www.python.org/
2. ไปที่เมนู Download เลือก Python 2.x.x (แนะนำให้ใช้ version 2 ก่อนครับ)

3. ดับเบิ้ลคลิกไฟล์ python-2.x.x.msi เพื่อทำการติดตั้ง Python

4. กดปุ่ม Next 

5. ให้เลือก dive C:\Python27\ เนื่องจากหลังจากนี้เราจะได้เช้าถึงได้ง่าย (เปลี่ยนได้ตามใจชอบน่ะครับ) กดปุ่ม Next

6. ให้เลื่อนช่อง Feature ไปล่างสุด

7. เลือก Add python.exe to Path  แล้วเลือก Will be installed on local hard drive

8. กดปุ่ม Next

9. รอโปรแกรม install จนเสร็จ

10. กดปุ่ม Finish ก็เป็นอันเรียบร้อย

วิธีตรวจสอบว่าเรียบร้อยหรือไม่

1. เปิด Command Line ขึ้นมา
2. พิมพ์คำว่า python แล้ว Enter ถ้าได้แบบรูปเป็นอันว่าเรียบร้อย

2. วิธี Install PIP

ลง PIP ไว้สำหรับ install library ต่างๆที่ Robot Framework ต้องใช้
1. ไปที่ URL: https://pip.pypa.io/en/latest/installing.html
2. ให้ download file get-pip.py

3. ให้คลิกขวา => บันทึกลิงค์เป็น

4. save ไว้ drive C:\

5. เปิด Command Line ขึ้นมา แล้วพิมพ์ cd \ เพื่อไปยัง drive C:\

6. พิมพ์ python get-pip.py แล้ว enter

7. เราก็ลง PIP เรียบร้อย

วิธีตรวจสอบว่าเรียบร้อยหรือไม่

1. เปิด Command Line ขึ้นมา
2. พิมพ์คำว่า pip แล้ว Enter ถ้าได้แบบรูปเป็นอันว่าเรียบร้อย

3. วิธี Install Robot Framework

1. เปิด Command Line ขึ้นมา
2. พิมพ์คำว่า pip install robotframework แล้ว Enter

วิธีตรวจสอบว่าเรียบร้อยหรือไม่

1. เปิด Command Line ขึ้นมา
2. พิมพ์คำว่า pybot แล้ว Enter ถ้าได้แบบรูปเป็นอันว่าเรียบร้อย

วันศุกร์ที่ 26 มิถุนายน พ.ศ. 2558

Robot Framework with DatabaseLibrary DB2

How to install => http://franz-see.github.io/Robotframework-Database-Library/

สำหรับ DB2 ให้ลงเพิ่ม
pip install ibm_db

เพิ่ม code ทั้ง 3 File ต่อไปนี้

C:\Python27\Lib\site-packages\DatabaseLibrary\connection_manager.py
สำหรับ connect to database
=============================================================================================
    def connect_to_database(self, dbapiModuleName=None, dbName=None, dbUsername=None, dbPassword=None, dbHost='localhost', dbPort="5432", dbConfigFile="./resources/db.cfg"):
        config = ConfigParser.ConfigParser()
        config.read([dbConfigFile])
        
        dbapiModuleName = dbapiModuleName or config.get('default', 'dbapiModuleName')
        dbName = dbName or config.get('default', 'dbName')
        dbUsername = dbUsername or config.get('default', 'dbUsername')
        dbPassword = dbPassword or config.get('default', 'dbPassword')
        dbHost = dbHost or config.get('default', 'dbHost') or 'localhost'
        dbPort = int(dbPort or config.get('default', 'dbPort'))
        
        db_api_2 = __import__(dbapiModuleName)
        if dbapiModuleName in ["MySQLdb", "pymysql"]:
            dbPort = dbPort or 3306
            logger.debug ('Connecting using : %s.connect(db=%s, user=%s, passwd=%s, host=%s, port=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort))
            self._dbconnection = db_api_2.connect (db=dbName, user=dbUsername, passwd=dbPassword, host=dbHost, port=dbPort)
        elif dbapiModuleName in ["psycopg2"]:
            dbPort = dbPort or 5432            
            logger.debug ('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort))
            self._dbconnection = db_api_2.connect (database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort)
        elif dbapiModuleName in ["ibm_db"]:
            dbPort = dbPort or 50000            
            logger.debug ('Connecting using : %s.connect(DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;) ' % (dbapiModuleName, dbName, dbHost, dbPort, dbUsername, dbPassword))
            self._dbconnection = db_api_2.connect ('DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;' % (dbName, dbHost, dbPort, dbUsername, dbPassword), '', '')
        else:
            logger.debug ('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort))
            self._dbconnection = db_api_2.connect (database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort)
=============================================================================================

C:\Python27\Lib\site-packages\DatabaseLibrary\assertion.py
สำหรับ initial statement
=============================================================================================

    def table_must_exist(self,tableName):

        if self.db_api_module_name in ["cx_Oracle"]:

            selectStatement = ("SELECT * FROM all_objects WHERE object_type IN ('TABLE','VIEW') AND owner = SYS_CONTEXT('USERENV', 'SESSION_USER') AND object_name = UPPER('%s')" % tableName)
        elif self.db_api_module_name in ["sqlite3"]:
            selectStatement = ("SELECT name FROM sqlite_master WHERE type='table' AND name='%s' COLLATE NOCASE" % tableName)
        elif self.db_api_module_name in ["ibm_db", "ibm_db_dbi"]:
            selectStatement = ("SELECT name FROM SYSIBM.SYSTABLES WHERE type='T' AND name=UPPER('%s')" % tableName)
        else:
            selectStatement = ("SELECT * FROM information_schema.tables WHERE table_name='%s'" % tableName)
        num_rows = self.row_count(selectStatement)
        if (num_rows == 0):
            raise AssertionError("Table '%s' does not exist in the db" % tableName)
=============================================================================================

C:\Python27\Lib\site-packages\DatabaseLibrary\query.py
สำหรับ iqnore comment ที่เป็นแบบ "--"
=============================================================================================
def execute_sql_script(self, sqlScriptFileName):
        sqlScriptFile = open(sqlScriptFileName)

        cur = None
        try:
            cur = self._dbconnection.cursor()        
            sqlStatement = ''
            for line in sqlScriptFile:
                line = line.strip()
                if line.startswith('#'):
                    continue
                elif line.startswith('--'):
                    continue
                
                sqlFragments = line.split(';')
                if len(sqlFragments) == 1:
                    sqlStatement += line + ' '
                else:
                    for sqlFragment in sqlFragments:
                        sqlFragment = sqlFragment.strip()
                        if len(sqlFragment) == 0:
                            continue
                    
                        sqlStatement += sqlFragment + ' '
                        
                        self.__execute_sql(cur, sqlStatement)
                        sqlStatement = ''

            sqlStatement = sqlStatement.strip()    
            if len(sqlStatement) != 0:
                self.__execute_sql(cur, sqlStatement)
                
            self._dbconnection.commit()
        finally:
            if cur :
                self._dbconnection.rollback()
=============================================================================================

ใน code ที่เขียน robot framework
Connect To Database    ibm_db    <DB_Name>     <USER>     <PASS>     <HOST_Name or IP>     <PORT>

credit:น้องกิบ, พี่บอม

วันพฤหัสบดีที่ 25 มิถุนายน พ.ศ. 2558

Clean Code

Clean Code


Credit by: This Book

Clean Code คืออะไร ? 

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

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

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

แต่ถ้าเราเป็นคนเริ่มเขียนละ ยังไงดี เราก็เริ่มง่ายๆเหมือนกัน เขียนเหมือนเรากำลังเล่าเรื่องให้เพื่อนๆฟังเลย

เล่าอะไรดีละ ก็เล่าให้ตามที่ลูกค้าเล่าให้เราฟังเลย พูดกันไปตามนั้นเลย (แต่เราต้องคุยและชัดเจนกับประเด็นต่างๆของความต้องการของลูกค้าแล้วน่ะ)

ดูแลง่าย เป็นอย่างไร เมื่อเราเขียนง่าย อ่านง่ายแล้ว ทีนี้เมื่อมีการแก้ไขเปลี่ยนแปลง หรือจะเพิ่มแทรกตรงไหน ง่ายไหมที่เราจะหาจุดที่จะเปลี่ยน ง่ายไหมที่เราจะเพิ่มเติม ง่ายไหมที่เราจะหาจุดที่จะกระทบ

เรื่องของการเขียน Code ให้ Clean

Meaningful Names

อย่างที่บอกเขียน อ่าน ง่าย เหมือนเขียนเล่าเรื่อง เพราะฉนั้นเรื่องชื่อก็เช่นเดียวกัน ตั้งชื่อให้กับ Class, Method, Object ทุกๆอย่าง ต้องให้สื่อถึงความหมายอย่างชัดเจน ว่า ทำอะไร เช่น 
method บวกเลขสองตัว = ก็มีหน้าที่รับเลขแค่สองตัว แล้วเอาสองตัวบวกกัน ทำแค่นี้ตามชื่อที่บอก
เมื่อชื่อที่สื่อได้แล้วนั้นหมายความว่า คนอื่นๆที่เข้ามาอ่าน ต้องอ่านง่ายแล้วไม่ต้องใช้จินตนาการน่ะ

Functions

มีขนาดเล็ก จำนวนบรรทัด Code ที่น้อย แต่ยังต้องอ่านเข้าใจง่ายน่ะ 
การทำงานเพียงอย่างเดียว (Do One Thing) เป็นการทำงานเพียงเรื่องเดียวเท่านั้น 
อ่านจากบนลงล่าง คือเปิดไฟล์ Class แล้วสามารถอ่านจากบนลงล่างได้ในรอบเดียว


Comments

อ่านง่ายแล้วยังต่อมี Comment อีกเหรอ 

comment ที่มีมักจะเป็นเรื่องของการนำไปใช้ Java Doc เพื่อให้คนอื่นเข้าใจจุดประสงค์ที่ชัดเจนมากยิ่งขึ้น

comment มีเพื่อขยายความ Argument ที่ใช้ว่าคืออะไร เนื่องจากบางครั้งเราก็ encapsulation ไว้ 


Formatting

เดียวนี้เราใช้ IDE Tools ในการเขียนโปรแกรมกันหมดแล้ว ไม่ค่อยจะใช้พวก editor ทำงานกันแล้ว เราก็ควรจะใช้ Tools ให้เป็นประโยชน์น่ะ เราสามารถจัด format code ให้สวยงาม อ่านง่ายด้วย ทำอย่างสม่ำเสมอ หรือบางคนเขียนตรงตาม format อยู่แล้วก็ดีเลย แต่มีเรื่องนึงคือ เราทำงานกันเป็นทีม ซึ่งจะมีข้อตกลงกันในทีมว่า เราจะจัด format แบบไหน IDE Tools นี้แหละช่วยเราได้ง่ายเลย เพียงตั้งค่าให้เหมือนกันทุกคน แล้วก็ run key ลัดเพียง key เดียวเราก็ได้ format ที่เหมือนกันกับทุกคนแล้ว ทำให้เมื่อเรา review code กันก็ทำได้ง่ายเลย


Objects and Data Structures

การเขียน Object หรือโครงสร้างของ code ที่ทำหน้าที่หลายๆอย่าง ทำให้เกิด object หรือ structure ที่ไม่ได้เกี่ยวข้องกับชื่อ method โดยตรงนั้น แต่อยู่ใน method ด้วยซึ่งควรจะ extract ออกไป


Error Handling

เมื่อเรารู้แน่นอนว่า ถ้าโปรแกรมทำงานไม่ถูกต้องแล้วต้องเกิด error ออกมา ซึ่งเราสามารถที่จะจัดการกับ error ที่เกิดขึ้นตรงนั้นได้เลย โดยจะเป็นการแสดงผลทางหน้าจอให้ user ทราบ หรือจะเก็บเป็นข้อมูล หรือจะไปทำงาน business อีกแบบก็ได้

Boundaries

การใช้ Lib Third-Party กับ code ของเรานั้น ก็ควรที่จะรู้ว่า lib นั้นมีประโยชน์ต่อ code เรายังไง แล้วตรงนั้นมีปัญหาอะไรหรือไม่ ถ้าให้ดีก็รู้ว่ามันทำงานยังไงได้ด้วย ใช้อะไรบ้าง เพื่อที่เราจะได้เข้าใจได้เร็วขึ้นเมื่อเกิดปัญหาขึ้นมา ถ้าเราเขียน Test คลุมได้ ก็ทำเลยครับเป็นสิ่งที่จะทำให้เรามั่นใจได้

Unit Tests

การทำ unit test จะทำให้เราเริ่มเขียน code ได้ง่ายตรงตามความต้องการของลูกค้าได้อย่างรวดเร็วด้วย เมื่อต้องการแก้ไขก็ทำได้อย่างมั่นใจเลยว่ามันไม่กระทบ หรือกระทบก็รู้ได้ทันทีว่าที่ไหนเมื่อไร
กฎ 3 ข้อของ Test Driven Development คือ Test Fail, Test Pass และ Refactor 

Classes

Class เป็นสิ่งนึงที่เรามักจะใส่หลายๆเรื่องเข้าไป ซึ่งมันก็ไม่ควรเป็นเรื่องที่ไม่ใช่ตัวมัน
เช่น Class User ก็ควรมี method , object ที่เกี่ยวกับ user เท่านั้น ถ้า user นี้ซื้อของ 1 ชิ้น ควรจะมี order อยู่ใน Class User หรือไม่ เมื่อเรารู้ว่า class นี้คืออะไร ทำอะไร แค่ไหนแล้ว ก็ควรให้มีแค่นั้น ถ้าเป็นเรื่องอื่นก็เป็น class อื่นไป หรือถ้ามันสัมพันธ์กันก็ควรแยกไปเช่นเดียวกัน จะทำ line of code สั้นลงด้วย อ่านง่ายด้วย

Systems

ระบบ เหมือนกับเมืองเมืองนึง การจะสร้างได้ ก็ต้องเริ่มจากบ้านหลังเล็กๆ แล้วก็จะเกิดว่า บ้านแต่ละหลังนั้นต้องการอะไรๆที่เหมือนกันอยู่ เช่น น้ำประปา ไฟ 

Emergence


4 Simple Design Rule เป็นแนวคิดพื้นฐานของการออกแบบ Software กฎ 4 ข้อประกอบไปด้วย

  • All Test Pass เมื่อทุก Test ผ่านแล้ว เราก็จะทำการ refactor ได้น่ะ
  • Express Intent 
  • No Duplication (DRY)
  • Small


Concurrency

ทำอย่าง Thread-Safe 

Successive Refinement

การเขียน code ที่ดี เมื่อมีการปรับสิ่งที่จะ input เข้ามาเพิ่ม ก็แก้ไขได้ง่าย หรือจะลด ก็ทำได้ง่าย

JUnit Internals

เป็น framework ที่มีในทุก IDE ซึ่งจะช่วยให้เราทำ unit test ได้ง่ายขึ้นมากเลย

Refactoring SerialDate

การทำงาน


Smells and Heuristics

เมื่อ code เราเริ่มมีกลิ่นไม่ดี หรือเริ่มรกแล้วควรจะจัดการมันได้แล้ว

4 Simple Design Rule

4 Simple Design Rule

4 Simple Design Rule คิดโดย Kent Beck
เป็นแนวคิดพื้นฐานของการออกแบบ Software
กฎ 4 ข้อประกอบไปด้วย

  1. Test Pass
  2. Express Intent
  3. No Duplication (DRY)
  4. Small


Test Pass


  • สิ่งแรกเลยต้องทำให้การทดสอบระบบเราผ่านก่อน
  • เมื่อไรก็ตามที่เราแก้ไขจุดนึงแล้วกระทบจุดอีกนึงเราจะรู้ได้ทันที
  • Automate Test จะช่วยให้เราทำงานได้เร็วขึ้น


Express Intent


  • แนวคิดของการออกแบบ Code เพื่อให้อ่านง่าย
  • เรื่องการทำงานของ Method ที่ทำแค่เรื่องๆเดียว
  • ถ้าเกิด Bug จะ Focus ได้ง่ายและเข้าใจปัญหาได้เร็ว


No Duplicate


  • Code ที่ซ้ำซ้อน
  • เขียนเหมือนเดิมหลายๆที่
  • มี method ที่ทำงานเหมือนกัน อยู่หลายๆ Class


Small


  • จำนวนบรรทัดของ code ในแต่ละ method หรือ class น้อย
  • แต่ยังคงอ่านเข้าใจ และทำงานได้ดีอยู่


สิ่งสำคัญคือ


  • 4 ข้อนี้ต้องทำไป step by step ครับ ไม่ต้องรีบร้อนที่จะทำมัน
  • ตั้งชื่อให้สื่อต่อการทำงานของมัน
  • ลดความซ้ำซ้อนของ code

วันพุธที่ 24 มิถุนายน พ.ศ. 2558

Sublime Text 2 for Robot Framework

วิธีการลงโปรแกรม Sublime Text เพื่อไว้เขียนโปรแกรม Robot Framework ครับ

Install Sublime Text 2

1. เข้า URL: http://www.sublimetext.com/
2. ไปที่เมนู Download
3. แนะนำให้ใช้ version 2 ก่อนเนื่องจาก version 3 ยังเป็น Beta
4. ดับเบิ้ลคลิก Sublime Text 2.0.x Setup.exe

5. กดปุ่ม Next >

6. เลือก Path ที่ต้องการ install Program แล้วกดปุ่ม Next >

7. ถ้าเลือก check box Add to explorer context menu จะทำให้เราใช้ click ขวาได้แบบนี้
แล้วให้กดปุ่ม Next >

8. กดปุ่ม Install

9. กดปุ่ม Finish

เป็นอันว่าเรียบร้อยในการ install program sublime text 2 ครับ

ต่อไปเราต้องลง Package Control บน Sublime Text 2

1. เปิดโปรแกรม Sublime Text 2 

2. มีหน้าตาแบบนี้

3. ไปที่เมนู View => Show Console

4. ด้านล่างโปรแกรมจะแสดง console ออกมา

5. เข้า URL: https://packagecontrol.io/
6. Click Install Now >>



7. Click SUBLIME TEXT 2

8. Copy Text 

9. กลับไปที่โปรแกรม Sublime Text 2 แล้ว paste ที่ console 
10. กด Enter 


11. ปิด แล้วเปิดโปรแกรม Sublime Text 2 ใหม่

เป็นอันเสร็จเรียบร้อยของการลง Package Control บน Sublime Text 2

ต่อไปเราต้องลง Package Robot Framework บน Sublime Text 2

1. เปิดโปรแกรม Sublime Text 2
2. เลือกเมนู Tools => Command Palette...

3. ได้ดังรูป

4. พิมพ์ install package จะได้ดังรูป แล้ว กด Enter

5. แสดงรายการ Package ต่างๆ

6. พิมพ์ Robot Framework จะได้ดังรูป แล้ว กด Enter

7. เราจะเห็น status ที่กำลัง install ที่ status bar ด้านล่าง

8. รอจนเสร็จ status bar ก็จะกลับไปเป็นเหมือนเดิม

9. เลือกเมนู Tools => Command Palette...

10. ได้ดังรูป

11. พิมพ์ install package จะได้ดังรูป แล้ว กด Enter

12. แสดงรายการ Package ต่างๆ

13. พิมพ์ Robot Framework Assistant จะได้ดังรูป แล้ว กด Enter

14. เราจะเห็น status ที่กำลัง install ที่ status bar ด้านล่าง

15. รอจนเสร็จ จะเห็น Text และ success ที่ status bar

16. ปิด แล้วเปิดโปรแกรม Sublime Text 2 ใหม่

ตอนนี้ Sublime Text 2 เราก็พร้อมใช้งานแล้ว

วิธีให้ text แสดงแบบ Robot Framework 

ไปที่เมนู View => Syntax => (เลือก) Robot Framework.txt และ Robot Framework.txt .robot

ถ้าต้องการให้ Sublime แสดง white space ออกมาแบบนี้

และให้เป็นถาวรก็ไปที่เมนู Preferences => Setting - Default

Sublime Text 2 จะเปิดไฟล์ Preferences.sublime-settings มา
ให้ search คำว่า "draw_white_space"

เปลี่ยนค่า "selection" ไปเป็น "all"

ปิด แล้วเปิดโปรแกรม Sublime Text 2 ใหม่