Cody Blog

使用Trello心得

Trello,是一個小團隊任務管理的工具。關於Trello的使用方法,這此就不再多言了,Google一下都可以找到不少介紹,這篇主要是想記錄一下,我親身使用Trello之後觀察到的一些小心得。

資訊可以快速在成員之間流通

我能在一個畫面就知道目前Project的最新狀態,相較於使用Email溝通,我能比較自由的方式去更新我目前的狀態,也不用太擔心訊息是否會干擾其它成員。

有助於形成 Self Organizing Team

工作的指派可不可以自己決定?在Trello中,我們會希望答案是Yes。傳統工作模式中,可能就是每週一次的指派任務、回報進度。大家都是各做各的。等到一個星期之後,再彼此更新自己的Status。但是在Trello中,我們可以在"一個畫面"就可以知道目前團隊成員正在做什麼,還沒完成什麼。所以當我完成手頭的工作,尋找下一個工作,也許就可以是別人還沒完成的工作。整個氣氛就會變成整個團隊努力把ToDo List中的工作一步一步搬到 Done List中。

快速完成一小步的成就感

在使用Trello中,每一張Card的描述應該要被常常更新。如果這個Card任務太大,那我們就應該適時的把它拆解成幾個比較小的Card。當一個人Own了一個Task,好幾天都不動的時侯,我們就會應該讓它活絡一下。使用Trello的一個大好處就是我可以很容易感受到每一天的小小進步,這樣工作會比較有趣。

有趣其它用法

  1. 我們會在上午開一張Card來訂下午茶,回收率很快。
  2. 開一個Card來當聊天室或是宣佈一些小事情,Trello的系統設計的很好,Response Time 也讓大家感到驚奇。

三個月之後的更新 2012/8

我發現團隊不少人都己經常態使用Trello,甚至是自己私人的規劃,像是出國玩,搬家等等。可見Trello系統的魅力。

測試案例如何區分 RAT, FAST, TOFT ?

我相信更了解測試案例的分類,可以加速測試案例的設計與開發,並且讓開發人員對於測試目標能更了解。一般而言,測試案例種類至少可分成以下幾種:

  • Release Acceptance Test(RAT)
  • Functional Acceptance Simple Test(FAST)
  • Task-Oriented Function Test(TOFT)
  • Force-Error Test(FET)
  • Boundary Test
  • Volume Test
  • Stress Test

之前在學著開測試案例的時侯,前輩有教過各種測試案例種類的差別。網路上也有一些文章討論。最容易讓人分不清大概就是RAT和FAST的差別了。RAT跟FAST都是Acceptance Test。就字面上的意思的確讓人很容易分不清。對我而言,其實測試案例就分成兩類,一種是測正常軟體正向的Test case,或是測試Error handle的FET兩種。然後測Positive Test Case 又依照不同的屬性又可以分成 RAT、FAST、TOFT、Boundary、Volume、Stress。但由於一個軟體建構出來之後。一般而言,皆需通過測試案例的測試,才代表其品質有一定程度的保障。然而,什麼先測,什麼後測?當然是重要的先測。而重要性粗分的話,大概可以分成:

RAT > FAST > TOFT = Boundary = FET > Volume = Stress 

RAT是用來評斷這個Build是否能被測試,在某些流程中,如果RAT Test cases Fail的話,QA人員可以要求不要測這個Build,繼續測試之前的Build。因為這個Build存在著重大的Defect,無法進行接下來的測試。所以RAT Testcase理論上數量應該很少,例如安裝的部份就一定至少會有一條RAT,畢竟如果軟體都沒辦法安裝起來的話,接下來就沒辦法測試了。

FAST可視為某個Module最重要的TestCase,如果不能Pass的話,很可能就會影響到接下來TOFT沒辦法繼續測試。所以可以把某個Module當中最重要的幾個Testcase挑出來當成FAST。 TOFT基本上只要不是被拿去當RAT跟FAST的Positive Test Case的剩下就可以當Test Case。FET是故意製造出一些情況讓程式出錯,測Error Handle是否有處理得當的Test Case,這種TestCase通常可以找到不少的Defect,因為畢竟Developer會比較容易忽略一些Error Handle Boundary Test專測一些臨界情況 …

Trello : 適合小型軟體開發團隊的工作清單系統

Trello : https://trello.com/

看公司某些Team在實行 Scrum,別的不敢說,學得最像的一定是這種上面貼滿,地下也掉滿的便利貼 Task board:

img

Trello就是類似這種清單系統的線上網站。我覺得 Trello 令人驚奇的點就是他可以讓團隊的每一個人可以專注在自己的任務上,也可以同時知道團隊其它人的狀態。Trello UI設計的很簡單,使用上很流暢。讓我一用就決定在日常工作試用看看,並且也說服我的同事們一起使用。

img

Task Board 適用在短時間的任務清單管理上。因為在每一個Scrum中,團隊的任務就是把最左邊的Task努力搬到最右邊,彼此可以互相幫助。如果每個Task分的很細的話,上面也放不了多少Task。所以當達到 MileStone的時侯,就需要適時的 Reset,喘口氣,可以繼續衝下個回合。

Jenkins 在不同的 Jobs 傳遞參數

需求:想讓 Job B 能拿到 Job A 的 Build Number。

在 Jenkins 中每一個Job都有環境變數,可以存取一些像是當下目錄,Build Number 等資訊。但是如果想要存取別的Job的環境變數就要多做一些事情了。

  1. 安裝 EnvInject plugin

  2. 在 Job A 新增一個 Build Step,記錄 Build Number 到 properties file

    echo "JOBA_BUILD=$BUILD_NUMBER" > build.properties

  3. 在 Job B 的 Configuration 中

Build Environment > Inject environment variables to the build process 設定剛才的 Properties File Path, 例如 /var/lib/jenkins/jobs/JobB/workspace/build.properties

因為 Step 3 的關係,我們在Job執行過程中可以直接使用 $JOBA_BUILD 來拿到 Job A 的變數。

[Python] Class Private 跟 Module Private 的差別

在Python中雖然有Private variable,但是不像一般程式語言一樣具有強制的效力,如果外界執意要使用還是可以呼叫的到。在這篇StackOverflow有很清楚的解釋其中的差別。

  • Module private 是指是以一個下底線 _ 開頭的變數,例如 _number 或 _getNumber() 

  • Class Private 基本上是以二個下底線 __ 開頭,而且不超過一個下底線 _ 結尾的的變數名稱,例如 __number 或 __getNumber(),但是init 就不是 class private,但這種兩個下底線開頭和結尾叫 Magic methods有其特別的用途,但這個不在本文討論範圍。

Module Private

# moduleA.py

def _foo():
    return 'hi'

from moduleA import *
    print _foo()

以此例子來說,我們在 moduleA.py裡面定義了一個 Module private _foo(),因為Python有個規定是在Import的時侯會略過所有以underscore開頭的成員,所以_foo()會被忽略,在執行 print _foo() 的時侯就會發生 Exception:

Traceback (most recent call last):
File "D:\priavte\__init__.py", line 4, in <module>
NameError: name '_foo' is not defined

但是如果執意要用還是可以透過Import __foo,得到想要的結果

from moduleA  import _foo
print _foo()

Class Private

class Foo():
    __aoo …

Thinkpad X220 擴充記錄

記錄一下目前跟小黑相關的敗家購買清單: X220 i5-2410M 美規機 (42872VU)  1. 為了用桌機也可以跟ThinkPad有一樣的鍵盤體驗:ThinkPad USB Keyboard with TrackPoint img

  1. 為了Total 8GB的RAM:原廠記憶體 PC-10600 4GB 為了有SSD+HDD雙硬碟:Intel 310 Series 80GB mSATA SSD img

為了上班可以不用帶變壓器:90W 20V變壓器

為了IPS面板: IPS 面版 (LP125WH2 SLB1)

為了同時外接兩台VGA螢幕:VGA to Display 轉接線

為了用新的小紅盤Track Point 小紅盤

為了可以隨時馬上敗家刺激經濟:[讀卡機 SCM SCR3340 Express Card 54]

直衝16GB  :單條 8GB 的RAM * 2 Link

Django 修改 Model 之後要如何更新到 Database

Django 如果 Model裡面的欄位有更動時,即使執行

$ python manage syncdb

是不會更動已經存在的 database 的 Table。

在這StackOverflow討論串有提到像是用 South等Migration Tool,但如果Model只是新增一些Optional的欄位時,這真的是用牛刀了。裡面有提到另一個方法,我覺得還不錯簡單,在此記錄一下:

先用 dumpdata 這個指令把DB的資料先輸出成 .json 的格式。要注意的事,這時侯 model.py 必需是舊的 schema

$ python manage.py dumpdata <APP_NAME> >> /tmp/old_data.json

然後先把資料清掉

$ python manage.py sqlclear <APP_NAME> | python manage.py dbshell

此時就可以修改 models.py 修改欄位,執行 syncdb

$ python manage.py syncdb

最後再把 json 格式的 data 載入回來即可

$ python manage.py loaddata temp_data.json

Process handle is invalid in Python

Error

Tool.py", line 97, in __funcExecCmd

    intResult = subprocess.call(strCmd, stdout=output, stderr=output)

  File "C:\Python26\lib\subprocess.py", line 470, in call

    return Popen(*popenargs, **kwargs).wait()

  File "C:\Python26\lib\subprocess.py", line 616, in __init__

    errread, errwrite) = self._get_handles(stdin, stdout, stderr)

  File "C:\Python26\lib\subprocess.py", line 724, in _get_handles

    p2cread = self._make_inheritable(p2cread)

  File "C:\Python26\lib\subprocess.py", line 763, in _make_inheritable

    _subprocess.DUPLICATE_SAME_ACCESS)

WindowsError: [Error 6] The handle is invalid

Solution

Add stdin = subprocess.PIPE in subprocess.call()

Python 多種 Print 函式的用法

最簡單的用法:把想Print的內容放在 print 後面

print 'Hello'

輸出結果

Hello

另一個方便的用法,可以把不同資料型態的變數不經過轉型就直接一起print出來:

print 'Hello',2012

也就是可以省下把其它變數都轉成string的麻煩

輸出結果

Hello 2012

想把多個 print 合併在同一行輸出,而不要一個print就斷行一次,就在最後面加上一個逗號:

print 'Execution Result:',
print runSomeThing()

輸出結果:

Execution Result: PASS

另外低階的sys.stdout.write在特定需求也可以使用,比如說我想輸出兩個字串,但是中間不要像 print 函式一樣加一個空白的話,就可以使用這個方法:

import sys
sys.stdout.write("Hello")
sys.stdout.write("2012")

輸出結果:

Hello2012

Notepad++ 縮排從Tab改成4個Space

用 Notepad++ 開 Python 的 .py 檔案預設是用 tab 來當縮排符號的,與一般程式語言常使用的 space 空白縮排慣例不同。可以從

Settings > Preferences > Language Menu / Tab Settings

調整,把 Replace by space 打勾即可