2017年7月6日

測試的方向選擇

又默默地過了一年.... 

做了一陣子 test infrastructure development 回來重做測試規劃, 可以說也有些體會, 或者說發現一些之前覺得理所當然的東西現在要重新整理一下思考邏輯.

假設有一項測試工作交代下來, 要做之後半年到一年間的規劃, 我們應該做些什麼呢? 

時間跟資源(包括人力以及開發的時間)是做規劃的重要依據, 但還是有些事情在這之前需要先釐清.

好比說產品的方向, 當然可以是產品經理跟使用者體驗設計師的工作, 但是沒有這個方向在做風險評估上會有問題, 即是在問題嚴重程度上會有歧見.

在縮短上線時間為第一目標的前提之下, 我們其實要從一些營運上的角度來思考.

  • 什麼功能是要99.99%可用的? 
  • 什麼功能中斷服務一陣子使用者是可以接受的? 
  • 如果這個功能無法使用了, 我們可以做些什麼? 較低品質但可以維持功能使用? 提示使用者重啟服務? 自動回復並屆時通知? 
  • 即使上線了, 是不是也有方法定期監測功能是否穩定? 
  • 上線後發現問題, 該怎麼解決? 能直接觸發回溯至前一個穩定版本? 
  • 離線或不支援類似功能的話應該怎麼辦? 
這些看起來不是測試的問題, 然而掌握到話無疑可以在測項的建立與取捨上有更好的發揮. 

在有開發資源的狀況下, 我們還可以從測試設施的角度多思考一點.

  • 現有自動化的設施是否完備? 
  • 自動化工具是否有改善空間, 以減少工程師花在上面的時間? (一個例子是, 如何讓自動測試可以在合理的時間內跑完, 像是30分鐘?) 
  • 測試方法上是否 現有的驗證方法是否可靠? 
  • 有沒有更有效的方法驗證並減少錯誤? 
在軟體的方向越來越多元的現在, 軟體品質漸漸從這種多元中抽出模式, 如何快速地理解產品及服務的內容與本質, 兼顧上線後的規劃, 做測試架構才能由針對產品本身走向更普遍可用的服務.

2016年3月28日

買了 google domain

幫家裡的網站續約網址之後感覺也可以幫自己買一個, 沒想到過程比想像的還麻煩....
主要是 google domain 有使用其他 google 的服務, 像是 google wallet, 而沒有使用過 Android 的原因使我對他們非常陌生....

目前 dns 還沒有正確的導到這個網誌, 等到我發現他成功運作以後再來回這篇吧...orz

2015年1月14日

python decorator 也可以吃參數

看了草稿累積的狀況感覺... 來寫一點簡單的筆記好了。

最近碰了一點 python 的 decorator,透過 wrapper 的方式幫你處理一些 function 重複的部分,相對簡明而好懂。
但如果我需要多種 decorator 但只有些微的不同呢?
可能會考慮直接寫多個來實現, dec1, dec2, ... 然後再用 function 的方式去包裝,考慮了 http://stackoverflow.com/questions/10176226/how-to-pass-extra-arguments-to-python-decorator 裡面說的,也可以透過傳一個參數的方式去實現。

python 並非原生支援這種語法,所以寫起來有點難讀,不過使用的時候會比較簡潔。

另外一個在寫 decorator 遇到的事, 就是要注意進入 function wrapper 的時候,原來要傳入的 arguments 並不存在 wrapper 的 scope 。所以只能多包東西進去,不能調整傳進來的東西。

2013年3月29日

軟體測試這回事

做了幾年的軟體測試, 覺得這行飯其實還滿微妙的.

有些人叫測試工程師, 或者 QA (Quality Assurance 品管?) QC (Quality Control), SQA, Tester, blabla.... 這個 domain 對台灣人比較陌生, 最酷的是你在學校很難學到.
一般測試可能會遭遇到以下工作:

  • Manual Test, 使用開發完的產品. 包括照表操課的 (有準備 test plan), 或者隨便亂試的. 這類的工作價值有一部分是使用產品本身就是模擬使用者 (客戶) 去操作產品, 相對於其他測試會更能貼近用戶會遇到的問題. 由於正職的測試人員對產品會有一定的熟悉 (也應該熟悉啦), 這件事會讓測試用戶體驗上有負面的影響, 所以也常有公司單獨作這一塊的測試, 有點像是市場調查.
  • Test Planning (Design?) , 泛指 test case creation, test plan creation, ... 跟產品相關的. 這邊的工作常與上面的工作重疊.  也有些公司把這邊的工作特化出來. 或者產品根本就是有白紙黑字的規格, 這邊的工作負荷相對少. 軟體測試因為產品改變的速度極快 (一天變好幾版也有可能), 規格改變導致測試項目與預期結果也急遽改變, 擔任這個角色的工作內容比較吃重.
  • Test Reporting, 根據測試結果產生測試報告. 這邊提到的測試報告是一個彙整, 根據所有測試報告產生列表或者圖像的結果, 以提供決策人員客觀的品質評估. 有些公司是 Developer 作這件事; 也有些地方是 Lead, Manager 在做的.
  • Test Automation, 測試自動化. 有鑑於人作的永遠不會比程式快, 很多公司在考慮流程優化的時候會想到這件事. 如果讓我來說, 最好的自動測試也許就是作一個產品專門使用你的產品, 但實務上相當不切實際.  試著考慮一個產品, 可能的架構是, 他使用了許多 Library, 如下圖的 OS/Driver/Platform 這塊. 程式本身提供了一些 Interface 來完成流程, 或者與使用者互動.  然後跟使用者互動時的圖形界面. 理論上 presentation 這一層之所以要切開就是為了讓 UI 可以頻繁的更動. 以寫一份自動測試的成本/ 效益而言, 過多對於呈現面的自動化無疑自討苦吃. 市面上有許多產品試著解決這樣的問題, 像是 selenium. 相較之下, 在 API 層作自動化, 可以保證作低限度的正確性. 而相較之下不易改變的 API 行為, 也會保證測試本身有較高的性價比. 
  • Write Test Tool, 輔助測試用工具. 這跟測試自動化有相關但我把他切成兩個部份, 因為目標不完全一致. 通常是幫助測試者完成冗長而不易完成的準備工作, 或者是使用一般狀況下無法碰觸到的情境 (高記憶體用量等等). 有些公司會有專屬的人作這些開發, 包括測試自動化; 但如果 QA 能負擔這些工作, 便能減少許多溝通造成的成本.
  • Test Process, 測試流程規劃, 一般來說是 Manager 以上的角色在做的工作, 如果你作的夠久也可能碰的到. 內容像是, 定義開發流程之中的測試工作.


測試所帶來的價值
  • 提供使用者經驗
  • 風險管理
  • 幫助釐清問題
前面兩個項目前面提過了, 我想談一下幫助釐清問題這件事. 作為一個測試人員, 除了發現問題以外, 很多的時間會花在重現問題, 而這是釐清問題的一個重要關鍵. 測試工程師不能只是對問題束手無策. 常用的作法是在 test case 中列舉, 經由交叉比對縮小問題點. 發現 root cause 這個工作如果在測試這邊就有足夠的資訊, 當問題交到開發工程師手上便會減少處理時花費的時間.
自動化在這個地方就扮演一個極其重要的角色.  如果 test case 設計時考慮到平行處理與容易程式化, 便能大幅縮短執行一個完整測試所需時間. 而兩個完整測試的間隔時間若縮短, 就可以縮小回歸 (regression) 問題所需翻查的 code/commit 數. 當發現問題與研究 root cause 的時間縮短, 可以想見的是品質將隨之提昇, 並且需要的開發時間也縮短了, 兩全其美?

測試是很重要的工作, 最重要的是不要把他作小了.

2012年11月14日

用 Mockito 的 injectMocks

官方網站上面沒找到, google 一下看到這篇 http://gladkowski.blogspot.tw/2011/06/mocking-objects-and-injecting.html

常常會遇到待測目標是用 @Resource, 或者其他方法拿到的, 測試的時候一般會想要排除這些依賴項目而嘗試寫假物件來提供更一致的行為; 這邊是要提用 Mockito 時候應該怎麼做.

首先必須 import 以下項目:


import org.mockito.Mock;
import org.mockito.InjectMocks;
import org.mockito.runners.MockitoJUnitRunner;
import org.junit.runner.RunWith;




在你的test class 宣告前面放上

@RunWith(MockitoJUnitRunner.class)


假設欲測的 class 叫做 target, 需要 inject 的 resource 叫做 dependent; 那麼在 class 的 scope, 可以宣告


@Mock
private Dependent dependent;
@InjectMocks
Target target = new Target();


之後你就可以跟原本一樣使用 dependent 來達成測試的需求了, 例如


when(dependent.func(anyString()).thenReturn("Hello");
        assertEquals("Hello", target.getStringFromDependentFunc());




2012年9月14日

Resize(Shrink) image size

大部份 resize VM image的文章都是講怎麼 expand, 讓既有的VM繼續長大; 這次我的需求是要從一個VM刪除掉多餘的資料以作出base image.

2012年7月2日

install SVN in OSX

因為新公司使用subversion 做 revision control, 很自然地找到 eclipse 的 subversion plug-in.  結果狀況還是東缺西缺的.
參考網路搜尋到的文章, 從eclipse -> help -> install new software, 找svn然後裝起來.
看起來版本有問題, 抓到的東西跟 repository上面的差很多....
上了subclipse的官網去撈, 確定版本之後抓下來, 準備要撈source的時候跳了一個 javahl not found的error..... google了一下, 有人說用macport裝 subversion就可了, 於是去找了brew上面的解法, 實驗之後仍然出現了java hl 的問題, 不過 ignore 之後 code好像抓下來了..... 來確認一下....

2010年1月22日

在Perl裏面使用Get Option

新年新氣象...(抖

使用script通常會想要保留一點彈性, 在command line可以做一些設定, 無論是單純的data input或是功能的擴充. 雖然perl讀取command line arguments已經相當簡單, 從@ARGV裏面撈東西就可以了, 但是用了一陣子的Linux之後, 漸漸覺得使用standard option相當直觀而且方便, 如果有現成的Module我們就不必每次都花很多時間在處理input上面了.

參考文章1: 詳細介紹Perl支援的GetOption以及一些歷史
參考文章2: (中文)GetOption的用法

簡單的說, 可以利用 Getopt::Long這個module,
給一個hash variable, 拿到command line的parameter. 另外可以用=s, =f, =i這種宣告來拿到option帶的參數.
更甚者, Getopt::Long提供alias的功能, 對於一個選項可以有多種的命名. 對於console mode的使用也相當的方便. 特別要介紹的是bundling這個選項. 打開之後可以支援複合選項的輸入, 像是-a -b -c 可以簡化成 -abc. 但是這樣一來可能會造成一些誤用, 以致在這個module default是沒有打開的.

2009年1月5日

用Perl讀寫Excel文件(1)

基本上是參考IBM網站上的說明文件
不過這篇有種濃厚的機器翻譯感, 稍微擷取一下需要的部分來談談吧!
Windows下通常我們會使用Win32::OLE裡的方法來處理,

use Win32::OLE::Const 'Microsoft Excel';
my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
|| Win32::OLE->new('Excel.Application', 'Quit');

上面為設定參數, 嘗試尋找已存在的Excel, 否則開啟一個新的Excel Instance.

# open Excel file
my $Book = $Excel->Workbooks->Open("c:/komodo projects/test.xls");

開啟一個指定路徑下的Excel檔案, 回傳一個Win32::OLE->Excel->Workbooks的物件; 有了這個handle就可以使用Excel檔案了.

my $Sheet = $Book->Worksheets(1);

指定調用第幾個工作表. 上面指定了第一個. 可以利用worksheet的名字來調用.

$data= $Sheet->Cells($row,$col)->{'Value'};

$data將得到(row,col)的值. 事實上, 相反的也可以這樣修改(row,col)的內容.
調用Formula則是把Value改為Formula即可. ex: $Sheet->Cells($row,$col)->{'Formula'} ;row,col也可以用Range("[alphabet][number]")的方式直接取值.

不過實際上我是看到另外一個作法, 所以才看到這篇文章的. 據該文表示, 這可能不適用於Windows系統. 不過對於一篇2001年的文章, 有足夠理由相信作者已經作了許多改變. 這個perl module的名字叫做 Spreadsheet::WriteExcel 和 Spreadsheet::ParseExcel. 光聽名字就感覺很強大....錯覺?

如果需要cpan上的manual與若干code請點這個連結

正體中文愛好者可以看這篇, 簡介了最基礎的調用方法. 引用裡面的code:

use Spreadsheet::WriteExcel;
my $workbook = Spreadsheet::WriteExcel->new("-");
my $worksheet = $workbook->add_worksheet("MySheet");

建Wworkbooks, worksheet的方法.

$worksheet->write(5, 0, "Division Number:", $bold);
$worksheet->write(5, 1, $division_number);

填值的方法, 大同小異.

字體格式可以另外加上, 例如:

my $bold = $workbook->add_format();
$bold->set_bold();


基本上還有許多參數可以下, 以及許多函式可調用. 可以參照上面的cpan連結.

2008年12月30日

Intel的Virtualization Technology

參考這篇Intel網站上的介紹

Virtualization Technology的技術主要是要解決在同一台電腦上面share給許多不同的使用者時, 同時存在著各自獨立的OS時運作上的問題. 而這主要提供給有虛擬系統需求的使用者. 舉個例子, 當你有以前的win95 or 98的程式要執行, 在現在的XP上往往是不相容. 這個時候就需要有虛擬OS來運作他. Virtual OS就是提供一個環境, 讓這些舊版程式以為他在原本的OS上面跑. 當然這種方式有許多的限制. 就速度來說一定會打折扣(不過電腦速度可是今非昔比), 因為程式經過多層的function call. 就新聞稿上看來, Intel宣稱VT技術可以讓虛擬的系統跑得像真的一樣(科).

其實是要解決最近遇到的問題, 如何在VMWare上面執行64-bit的OS?
更精確一點的說, 如果我電腦灌32-bit的XP, 有沒有辦法在上面跑64-bit的VMWare(虛擬OS的產品)?
一般來說產品是向下相容容易, 向上相容難; 但就實際測試的結果而言, VT可以克服這個問題. 首先CPU要有支援VT, 可以下載Intel 處理器辨識公用程式 看看你的處理器支不支援. 再者要看看VMWare的版本, 一般來說最新版的應該都有支援 (6.5以上?).

很久沒貼文, 順便貼歌..

山崎まさよし很酷的翻唱歌 "M", 之前有在Plurk上貼過~

2008年12月4日

find the colors of your rainbow

Your rainbow is shaded violet.

 
 
 
 
 
 
 

What is says about you: You are a creative person. You appreciate beauty and craftsmanship. You are patient and will keep trying to understand something until you've mastered it.

Find the colors of your rainbow at spacefem.com.

心理測試之類的東西...可以玩玩

2008年12月3日

Perl的XML Parser XML::Simple (2)

來寫XML::Simple 裡面 XMLout跟一些Option的設定. 最後面附的example寫的到的話再說...
照樣附上原文 <--直接reference到XMLout
假設已經有一個data structure的hashref了, XMLout可以將它寫出成XML格式.
寫出的時候有一些事情必須注意; 1. Hash Key會被encode成element name or Attribute name.
2. 這些name必須由字母開頭. 剩下的必須為字母, 數字, -, 底線, '.', 或者分號(這個只能出現一次, 而且必須被用於namespaces). hash value部分就可以隨便用符號, 除了binary data以外.
如果違反這些規則, XMLout還是可以寫出, 只是不能再被讀取而已.
另外資料還是不要有產生迴圈的關係, 會讓他掛掉.

Options:
每一版他都會release一些新的option, 所以其實這個XML::Simple已經變得不是很簡單了:) 作者建議兩個Option一定要看一下: ForceArray, KeyAttr

挑一些簡單, 作者建議的Option來看:
AttrIndent=>1: 輸出的時候請斷行.
ForceArray=>: 設成1的時候將會將巢狀結構的第二層開始都強制存成array, 不管他是不是只有一項. 若把KeyAttr打開的時候, 將會偷偷把ForceArray設為1.
或者可以給一個hashname, 這樣遇到該hashname的時候會自動強制存成array. 2.05版開始可以用regular expression.
KeepRoot=>1: 有時候讀入或讀出會遺失root, 這個option設為1會避免這個狀況.
KeyAttr=>[list]: 還滿難講的....附上原文的例子比較清楚.
NoAttr=>1: 把所有Attribute去掉.
OutputFile=>: 可以指定output file.

Optional OO Interface; 就是專門給OO使用的.
要先有一個new出來的XML::Simple的instance.
parse_string(text)
parse_file(filename)
parse_fh(file_handle)

看完了, 其實很多option都是幫忙整理XML讀進來的format, 讓找值的時候code不會太難看....
似乎有進階用法, 之後再看看好了.

Perl的XML Parser XML::Simple (1)

工作上會用到有關XML的東西, 講到資料處理當然是Perl啦, 馬上來survey一下.

cpan提供了一些好用的module, XML::Simple基本上灌完ActivePerl就有內建. 此Module的作者首頁
下面大量翻譯網頁裡的東西, 有興趣可以看看原文.
XML::Simple是一個Perl Module, 主要為了提供一個容易讀寫XML文件的界面. 本來作者是想做一個讀寫XML格式的config檔案. 不過很多人拿去做其他用途(kerker.

Installation:
上面提到很多安裝的方法, 包括用cpan提供的shell啊, 安裝檔啊..不過作者說只要把Simple.pm解壓縮出來放到perl/lib/XML/底下就可以了:)

用法: (原文)

主要使用的function: XMLin; XMLout

一般 format:
use XML::Simple;

my $ref = XMLin([] [, ]);

my $xml = XMLout($hashref [, ]);
用物件導向讓你看不懂的話:
require XML::Simple;

my $xs = XML::Simple->new(options);

my $ref = $xs->XMLin([] [, ]);

my $xml = $xs->XMLout($hashref [, ]);
如果要得到error message, 只要作一些修改
use XML::Simple qw(:strict);

一個簡單的範例:
file name :foo.xml
XML包法:

裡面項目可大量.

perl 程式裡:
use XML::Simple;

my $config = XMLin();

這會產生一個名叫$config的hashref, 因為他沒有設定初值, $config會預設對應到該Script的name跟location.

接下來要將資料吃進來, 使用Data::Dumper把資料弄進去:
use Data::Dumper;

print Dumper($config);
印出來會有如下效果:
{
'logdir' => '/var/log/foo/',
'debugfile' => '/tmp/foo.debug',
'server' => {
'sahara' => {
'osversion' => '2.6',
'osname' => 'solaris',
'address' => [ '10.0.0.101', '10.0.1.101' ]
},
'gobi' => {
'osversion' => '6.5',
'osname' => 'irix',
'address' => '10.0.0.102'
},
'kalahari' => {
'osversion' => '2.0.34',
'osname' => 'linux',
'address' => [ '10.0.0.103', '10.0.1.103' ]
}
}
}
這是hashref裡面包的內容, 記得他是一個物件.
那要怎麼拿裡面的元素呢? 假設我要拿log directory的name
print $config->{logdir};
如果要拿特定的元素, 例如 kalahari Server的第二個Address
print $config->{server}->{kalahari}->{address}->[1];

但程式不會只寫的這麼簡單. 下回待續?

2008年11月28日

Microsoft 輸入法的神祕

引用自 Tuan's Blog
以及 http://tw.myblog.yahoo.com/soo4526/article?mid=457&sc=1
總之就是在
1. 英數狀態下按住Alt直接輸入內碼, 以呈現特殊字元
2. 利用windows新注音輸入法的前導字元'`'來使用big-5 or unicode的特殊字元

字元索引請見blog~

今天的歌是:

山崎まさよし— One more time , One more chance
一頭亂髮的實力派歌手, 據說是寫給因病過世的女友的歌...

2008年11月27日

微星維修站一遊

昨天跑去了微星的維修站處理我顯卡的問題. 禮拜天因為想做個電腦的更新, 買了CPU+MB+MEM的組合. 想說我本來版子就有顯卡, 回去一插--一長二短逼逼逼. 把顯卡拔起來看, 有兩顆電容鼓鼓的, 想說是不是卡的問題. 插回原版上, 又可以用....禮拜一跑回光華的店家, 整組東西拿回去他們維修站測, 分別都可以動, 就是組合起來不能動. 應該是其中之一壞掉了吧?
昨天就去了趟光華那的微星維修站, 拿顯卡給他大概五分鐘內小姐換了一塊良品給我. 我緩緩的跟他說, 版子我有帶來, 東西都插好了, 麻煩你測看看能不能使用, 我拿回去才安心. 於是我在那個維修站坐了半小時. 回報的時候換了一支8500GT給我, 轉述維修工程師的話是"不相容"....我怒了...版子p43NEO3-F跟顯卡7300GT都是MSI牌的, 出廠的時候難道不會測測自己的產品嗎? 神奇的是也沒有看到相關的討論....真的那麼湊巧是我的問題@_@?

2008年11月24日

消費卷的議題

一直以來對於消費卷我的感覺都是刺激GDP, 因為實際上每個人消費數字的提高. 然而昨天跟某店家老闆小聊了一下, 發現這消費卷確有其妙用. 不過跟上面講的完全走相反的方向.
記得消費卷的使用只能到合法開業的商家(換言之, 可開立發票的)? 對於一些不是合法經營, 或者根本掛羊頭賣狗肉的店家, 為了領到消費卷, 便會盡可能去申請. 據說台北市在政策公布的這段期間, 便有相當的商家申請量. 對於政府而言, 既然這些本來走法律邊緣搖擺的店家申請合法經營, 下年度的稅收將會相對性的增加. 等到該申請的人都申請了, 剩下攤販這種絕不可能, 又說可以有其他配套讓他們可以被使用. 另外, 日本發消費卷之所以失敗是因為日本商家都合法習慣了, 沒有像這樣的其他賺錢考量.
當然這是就老闆的角度來看, 畢竟他很討厭那種非法經營的店家, 特別是他的競爭對手(科科).
我覺得合法商家變多->稅收變多這有某種程度上的道理, 但又不是天天在發消費卷. 今天我可以申請營業, 難道消費卷政策一過, 我就不能走回我原本的老路子嗎? 結論是, 就算是賺, 很可能也是短線. 在實施政策時所投注的成本, 我想更是一個麻煩的地方. 畢竟我們是升斗小民, wait & see, 看看之後會如何吧!

本日的歌是:

MAAYA SAKAMOTO (坂本真綾) - 24
有關午夜0時灰姑娘的歌~ enjoy:)

2008年11月21日

下部門

終於下部門了, 經過漫長的一個半月訓練....
不能說習慣公司的文化啦, 只是習慣了上班族的生活...跟學生差距相當大; 或者說比較像好學生的生活!? 接下來要做比較核心技術的方面, 相信在工作上挑戰會比較大....
補充篇幅, 來首歌吧:

可惡 這篇文章我編輯三次了, 前兩次在igoogle上面編輯, 居然會一段時間就把我清掉......至少也該儲存個草稿吧!

2008年11月13日

google map結合大眾運輸工具!

這邊說到結合大眾運輸工具的是有關路徑規畫的部分. 今天看到新聞馬上去試試, 真的滿方便的, 不知道google有沒有做到全省的規劃. 對於我來說, 最大的好處大概是如何坐公車上下班, 這樣一來下雨天就可以不用騎車弄得滿身濕了....

但不管搭哪一班車, 總是會有點繞路, 加上公車停等時間的問題, 比起自己騎車可能要花上兩倍以上的時間, 這個部份應該是要斟酌的.

2008年11月4日

實況野球15

對於每天回家就沒剩什麼時間可以用的上班族來說, 運動遊戲時間短, 並且可以很快帶來刺激的遊戲方式(有種色色的感覺?!) 算是很適合的, 因而之前打了很長一段時間的籃球遊戲, 不過玩久了也有點膩, 這次來挑戰一下實況野球看看, 以前每次玩都被狂電, 現在反正每天都可以練習...就玩玩看吧!

這兩天玩了一陣子人生模式(my life 又稱買來福) 由於只有打擊跟跑壘是可以操作的 (我是野手) , 感覺上像是打擊訓練. 這樣也不錯, 因為實況野球系列打擊很不容易上手(要求一定要打中球心), 新手會有強烈的挫折感, 如果直接去打比賽的話. 透過這個人生模式, 就像是一邊看著劇情一邊練習打擊, 感覺不錯. 不過人說三歲看到大, 第一年沒準備也沒計劃, 使得之後成長的亂七八糟, 越來越想打掉重練的說....只是好說歹說也打到第三年了, 想知道職業生活接下來會如何... 會不會在生涯末期達到一個高峰呢(科科 想太多).

2008年10月31日

Nico試貼


貼個ero聲組曲, 這樣感覺有點虛說, 只有簡介頁~~QQ

整理一下發現好多草稿....不過隔太久都不知道要寫什麼了....@_@