Cody Blog

研發替代役申請出國旅遊

研發替代役在第三階段之後,一年可申請出國旅遊一次。我剛從北京-香港回來,在此小記一下。每年的1/1日重新計算,照規定可出國天數8天,但因為「出境日數」為出境翌日開始計算,所以實際可以出國天數為9天。出國的規定每年可能都不一樣,最新規定請參照內政部役政署。

1. 申請護照(以護照過期而親辦為例)

位置:外交部領事事務局,台北市濟南路一段二之二號,中午不休息。 費用:正常件 1600

所需文件: 1.二吋照片兩張(需合乎護照規定) 2.身份證正反影本 3.研替身份證正反影本(背面要寫上用人單位資訊), 需要把研替影本貼在申請表後面 4.過期舊護照,剪角後會歸還

2.請公司HR向研發替代役專案辦公室提出出境申請

盡早申請,需要告知欲前往的國家、班機、跟日期等基本資訊。這個可以先申請,護照可以之後再補。HR會把你的護照送回內政部,並會蓋上一個章核準出國。HR會給你一張公文:

img 這張公文出境時可以隨身帶著,必要時可以提出證明

3.申請台胞證

我是找簽證通,價格還算實惠。加簽300,新辦含加簽1400。

軟體測試人的每日體操

之前讀了一本軟體測試的書《贏在測試》,裡面主要以訪談的形式來訪問中國界的軟體測試界的前輩,像是Google的段念,IBM的陳雅麗等。詳細誰講了什麼,我記不清了。但是裡面有前輩提到做軟體測試的人很容易忘了讓自己持續的進步,而漸漸地失去競爭力。這也難怪,因為做軟體測試畢竟永遠不是公司內最核心的研發主力,普遍來說技術水平比開發人員要求來得低一些。

之前讀到一篇James Bach老兄的文章,覺得還不錯。James Bach是軟體測試界的名人,他最著名的就是在Exploratory Testing的貢獻。有一位軟體測試的菜鳥問他說軟體測試工作者的每日家庭作業是什麼。Bach提出了四點:

Write every day

隨身帶筆記本,隨時記下任何對測試的想法

Watch yourself think ever day

工作時,當有任何測試的點子,嘗試去追蹤自己的想法。這是一種訓練Self-observation的方法

Question something about how you work every day

問問題,例如:何時需要寫下一個測試,那些步驟需要被記下。而不是只討論那些案例"Passing"或是"Failing"

Explain testing every day

解釋測試方法(Methodology),不要只說自己在做黑箱測試,更深入些,並解釋為什麼你去做?

使用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()