Feeds:
文章
迴響

Archive for 2013 年 04 月

好吧,Notepad++ 不是必要,只是我個人習慣~

SAPI (Speech Application Programming Interface)是 Windows 上 TTS 介面,原生只支援英文發音,Ekho 是 Open Source 中文 TTS,他實做了TTS介面,因此可透過 SAPI 使用 Ekho 的中文語音。SAPI 使用 COM 介面,所以不一定需要 Python,用其他熟悉工具(VBS, C#, …)亦可

開發環境

1) Windows XP

2) Pywin32

3) Ekho

核心程式

圖片

用法

sapi_ekho_say.py story.txt

整合到 Notepad++ (Alt+F12 執行)

Shortcuts.xml 中加入

<NotepadPlus>

<UserDefinedCommands>

<Command name="TTS" Ctrl="no" Alt="yes" Shift="no" Key="122″>cmd /k &quot;C:\Python26\python.exe&quot; C:\Python26\sapi_ekho_say.py $(FULL_CURRENT_PATH) &amp; ECHO. &amp; PAUSE &amp; EXIT</Command>

</UserDefinedCommands>

</NotepadPlus>

執行結果

20130416-02

已知問題,如果文章很長該怎麼辦?可能需要實現文章分段….

註:檔案編碼需用 big5, 如要 utf-8 請自行調整檔案讀取方法

Read Full Post »

PID 就是程序的識別碼可以從工作管理員(taskmgr)找到。

找出 PID 有什麼用呢?簡單的用途就是 kill 他,另一個可以搭配 Windows Resource Kit Tool 的 empty.exe 釋放 Working Set, 或其他需要 PID 的工具。

如果這件事用 Python 作也沒什麼困難,只是想嘗試用命令列指令來解看看。

首先取得 Process 清單,可以用系統內建指令 tasklist.exe 產生結果如下

w001

首先要去除開頭多餘三行,可用 cygwin 的 sed.exe

tasklist | sed “1,3d"

因為 “System Idle Process" 含有空白的程序名稱會造成解析問題,先忽略系統行程

tasklist | sed “1,3d" | sed ‘/System Idle Process/d’

依據需求,我們只要 PID 和 Mem Usage 欄位,且依據 Mem Usage 作排序,可用cygwin 的 gawk 將資料重排

tasklist | sed “1,3d" |  sed ‘/System Idle Process/d’ | gawk ‘{printf “%-10s %d\n",$5,$2}’

去除記憶體的逗點,方便後面進行排序, 可用 sed

tasklist | sed “1,3d" | sed ‘/System Idle Process/d’ | gawk ‘{printf “%-10s %d\n",$5,$2}’ | sed ‘s/,//’

接著我們就可以利用排序找出最耗記憶體的 PID

tasklist | sed “1,3d" | sed ‘/System Idle Process/d’ | gawk ‘{printf “%-10s %d\n",$5,$2}’ | sed ‘s/,//’ | sort -n -r

依據需求我只要找出前10個, 一樣透過 sed 挖出來

tasklist | sed “1,3d" | sed ‘/System Idle Process/d’ | gawk ‘{printf “%-10s %d\n",$5,$2}’ | sed ‘s/,//’ | sort -n -r | sed -n ‘1,10p’

如果只要 PID 清單,再透過 gawk 重排

tasklist | sed “1,3d" | sed ‘/System Idle Process/d’ | gawk ‘{printf “%-10s %d\n",$5,$2}’ | sed ‘s/,//’ | sort -n -r | sed -n ‘1,10p’ | gawk ‘{printf “%d\n",$2}’

Read Full Post »

自從開始寫單元測試之後,一直很想知道哪些程式碼上尚未測試過,以前用C#時VS整合的很好,很容易可以看到這份報表。而PHP呢?

後來發現 PHPUnit 有支援 Code Coverage 的報表,可惜一直沒有時間研究,拖到現在終於可以把收集到的資料整理一下。首先 PHPUnit 的 Code Coverage 是利用 XDebug 的 Code Coverage 分析結果所進行的後處理, XDebug 的分析是透過攔截OPCode 進行分析[1]。所以,簡單的來說只要Code Coverage資訊不一定要 PHPUnit。

因為個人不喜歡用 PHPUnit,雖然他框架完整而強大,但也造成門檻高,不一定符合自己的程式流程, 總之這是個人偏好,所以,我想抽離這部份的功能。[2] 已經有描述如何只用含概率的功能,不過還是需要 PHPUnit, 所以先保留。不過該文提到可透過  php.ini 的 auto_prepend_file 將程式碼注入已經存在的程式碼中,這是相當不錯的方式我將其吸收。

那剩下分析 XDebug 的含概率數據的後處理問題,[3]給了我想要的範本,我將 code_coverage_class.php 微調成我要的資訊。另外我將 auto_prepend_file 概念融入產生 code_coverage_prepend.php  方便程式分析。

以下是我整理的測試

php -d auto_prepend_file=code_coverage_prepend.php b.php

其中  auto_prepend_file=code_coverage_prepend.php 就是應用 [2] 提到的注入方式。

圖片

如下是執行結果報表 (code_coverage_reports/b.php.html)

黃色是有執行的部份,紅色則是未執行到的部份。而上面的摘要簡單的呈現執行過得程式碼涵蓋比例。

圖片

有興趣的人可到套件首頁 https://github.com/cwchiu/php_code_coverage_reports 試玩

補充1:記得 php.ini 要打開 XDebug

[xdebug]
zend_extension=ext/php_xdebug.dll
xdebug.coverage_enable=1

補充2: XDebug 的 code coverage 是在 PHP 中使用 xdebug_start_code_coverage/xdebug_get_code_coverage/xdebug_stop_code_coverage 來取得分析資料,所以如果想要分析小區段,可直接應用這些函數

補充3:  PHPCoverage[5]的報表做的蠻漂亮可以學習

 

參考資料

[1] http://blog.csdn.net/qw_study/article/details/6212260

[2] http://www.phpclasses.org/browse/file/29511.html

[3] http://shiftlock.wordpress.com/2009/11/01/standalone-php-code-coverage-without-phpunit/

[4] http://xdebug.org/docs/code_coverage

[5] http://sourceforge.net/projects/phpcoverage/

Read Full Post »