顯示具有 程式設計 標籤的文章。 顯示所有文章
顯示具有 程式設計 標籤的文章。 顯示所有文章

2016年8月21日 星期日

Python 程式筆記 -- 模組化設計

原本想先提一下這星期用 Python 和 Qt5 寫「浮動工具列」的雛形,但卻寫成『沒有開始功能表的 Windows 生活 (4)』,只好把那部份的故事暫且打住,先專心來介紹 Python 程式心得。

雖然看了一些「Python 模組化」的介紹,也追了幾個程式的模組流程:

小程式

大程式

但自己實作時,還是有點撞牆,主要的重點在:

.


(...繼續閱讀.../...CONTINUE...)

2016年8月14日 星期日

bZmd -- markdown 預覽工具

bZmd -- 自己寫的 markdown 預覽工具

有空並對 markdown 有需求的話,請協助測試

.

  • 解壓縮,然後執行 bZmd.exe,把它的視窗「晾在旁邊」
  • 用檔案總管「點選」(單擊) 某個 .md 檔
  • 也可以使用 Notepad++ 開 .md 檔
  • 如果 .NET 版本不支援, 請執行 .NET Version Detector http://www.asoft.be/prod_netver.html 查看

下載 -- https://github.com/beZong/bZmd/releases

也可以參考 以下文件,不過目前都是英文

  • readme.md
  • changelog.md
  • roadmap.md
  • how-to.md

https://github.com/beZong/bZmd


(...繼續閱讀.../...CONTINUE...)

2016年7月31日 星期日

Python 一週心得

用 Python 寫程式 才一個星期,具體成果要晚一些才看得出來,但在四處找資料並且練習的同時,還是對 Python 有非常正面的看法。

以下整理的參考資料,希望對大家有幫助。

Python 的特點

  • Python 有點歷史,但又不會太老
    ---- 不像 Fortran、C、Basic 那麼老,但已經發展到穩定的規模。1991年發表 0.9.0 的 Python,提供不同過去一般風格的編碼風格,(大企業都在用哪些程式語言?圖解程式語言編年史,T客邦) ---- 架構好很多,而且不用擔心 { } 括號配對,及結尾何時要加;分號。
  • Python 通常可以靠比較短的程式碼完成比較多的功能 (出處)
  • Python 物件導向:封裝、繼承、多型
  • Python 跨平台,而且容易擴充,
    ---- 相關延伸功能幾乎都有對應的配套,例如:

.


(...繼續閱讀.../...CONTINUE...)

2016年7月24日 星期日

Python 入門第一課

最近,積極研究 Python,於是Evernote多了不少相關筆記資料,而今天也通過 Python 入門第一課,接下來進展會快一些吧。

這幾年我較常用的程式環境,各有特色。
* C# (Visual Studio)
* AutoHotKey
* Javascript (TiddlyWiki, NW.JS)

.


(...繼續閱讀.../...CONTINUE...)

2012年10月27日 星期六

尋覓 C / C++ 程式開發環境

最近,花了一些時間尋覓 C / C++ 程式開發環境。

主要的需求如下:

  • 免費且容易取得
  • Windows 作業系統 使用
  • IDE 整合開發環境 (Integrated Development Environment)
  • 除錯功能:中斷點、單步執行、查看變數內容等
  • 小而美的身形,最好在20MB以下
  • 最好能撰寫 GUI 圖形介面程式

(...繼續閱讀.../...CONTINUE...)

2010年1月29日 星期五

另一個台灣之光 - Sikuli

雖然發現 vgod 這號人物才第一天。不過, 我真的很欣賞他

Sikuli 是個以圖形操作為基礎的程式開發工具……

vgod 寫的 Sikuli 是用直覺的『螢幕貼圖』來完成自動化。不像其他熱鍵工具, 需要指定『視窗控件 (window control) 的名字』 (例如: AutoHotkey)

.


(...繼續閱讀.../...CONTINUE...)

2009年12月18日 星期五

改造 Taglocity 3.0 Tag Bar (3) ---- 即時更新

改造 Taglocity 3.0 Tag Bar (2) ---- 反映標籤狀態, 只能做到『一次性』的反映標籤狀態。接下來, 要加入『即時更新』的功能。

以下方法各有優缺點, 也不確定是否適合每個人的使用情境, 所以重點放在優缺點的討論 :

.

即時更新 Tag Bar 來 反映標籤狀態

『即時更新』可以用『定時重複執行』或是『觸發執行』來實現,

  • Outlook VBA 並沒有原生的『定時重複執行』功能, 不過 rockman 在 outlookcode.com (2004-12-07) 提出用 user32 函式庫的 SetTimer 和 KillTimer 的方法, 也提到『必須注意有可能當機』

2) If you don't deactivate the timer when the application closes it will likely crash

  • 實作上, 將 Timer 設定成 1~2 秒就夠用了

.

方法

優缺點

定時執行 SetTimer (User32)

@ 前提 : 對 VB 有相當的把握
O 優點 :
  • 只需要一個觸發條件
X 缺點 :
  • 開啟 Outlook 會有巨集警告
  • 容易當機 (Outlook 直接終止)
  • 和其他 Outlook 改造存在相容性的問題需要克服
事件觸發方式,
例如 : Catch all events on a folder (outlookcode.com)


(尚未實作)
O 優點
  • 使用 Outlook 本身的 VBA 功能
X 缺點 :
  • 開啟 Outlook 可能會有巨集警告
  • 必需找到適當的觸發方式, 可能要捕獲不只一個事件
以 AutoHotKey 觸發

@ 前提 :
需要有 AutoHotKey  經驗

O 優點
  • 容易增加判斷條件, 例如 : Outlook 是否為作用中的視窗 ……
X 缺點 :
  • 不是 Outlook 原生, 不見得容易移植

.

AutoHotKey 串連 Outlook 實現自動化

2009-10-10_170220

最後, 目前完成度最高的, 是『AutoHotKey 串連 Outlook』

  • 使用 AutoHotKey 的 SetTimer 來定時觸發
  • 檢查 Outlook 是否為作用中的視窗, 而且螢幕上有 TagBar
  • 使用 AutoHotKey COM Standard Library 來呼叫 反映標籤狀態 的 Outlook 函數, 也就是 COM_Invoke(poul, "updateTagBar")
	COM_Init()
poul := COM_CreateObject("Outlook.Application")
' ... (此處最好有容錯處理)
ol_func := COM_Invoke(poul, "updateTagBar")
' ... (此處最好有容錯處理)
COM_Release(ol_func)
COM_Release(poul)
COM_Term()


.



(...繼續閱讀.../...CONTINUE...)

2009年10月11日 星期日

改造 Taglocity 3.0 Tag Bar (2) ---- 反映標籤狀態

繼上一篇, 改造 Taglocity 3.0 Tag Bar (1) ---- 讓 按鈕文字 變清爽 之後。接下來, 要來看看如何讓『Tag Bar 反映標籤狀態』。

底下的 VBA 程式, 不論是 操作範圍 或 執行時機, 都比要前一篇來得複雜, 所以建議先熟悉 Outlook 的巨集運作, 再來實作。

 

(1) 按鈕文字變清爽

(2) 反映標籤狀態

操作範圍

輸入 : Tag Bar 的文字
輸出 : Tag Bar 的文字
輸入 : 當前的郵件標籤
輸出 : Tag Bar 的狀態

執行時機

只需要執行一次 需要重複執行

.


(...繼續閱讀.../...CONTINUE...)

2009年10月10日 星期六

改造 Taglocity 3.0 Tag Bar (1) ---- 讓 按鈕文字 變清爽

Taglocity 改版到 3.0 之後, Tag Bar 又變回類似 1.x 的模樣, 只是還是有一些美中不足。還好可以用 VBA 巨集來解決 ……

2009-10-08_1431493.0 版 TagBar 有顏色標示,
但是和 1.x 版的使用習慣無法銜接, 因為
不能反映標籤狀態, 顯示數字干擾視線
2009-02-16_220704
1.x 版 TagBar 有顏色標示,
可以反映目前郵件的標籤狀態 (橘色底色) 使用上很方便, 同時可以選擇是否顯示按鈕數字, 視覺上較清爽

.


(...繼續閱讀.../...CONTINUE...)

2009年10月8日 星期四

Outlook 相關郵件工具 ----『相關訊息』的 VBA 巨集

上一篇 提到, 在 Outlook 2007 可以手動將『進階尋找』增加到工具列。但是之前的嘗試, 卻無法找到『相關訊息』和『自寄件者郵件』來加到工具列。

其實, 這部份可以用 VB 巨集的方式來達成 ……

.

在 Outlook 工具列 增加『相關訊息』功能

建立『相關訊息』巨集

  1.  工具 - 巨集 - Visual Basic 編輯器  (或 快速鍵 Alt-F11)
  2. 找到左邊的 Microsoft Office Outlook – ThisOutlookSession 或是 插入一個 新模組
  3. 在模組右邊的編輯視窗輸入以下的程式碼
  4. 記得儲存 *.OTM 專案

(...繼續閱讀.../...CONTINUE...)

2009年5月13日 星期三

包山包海的 AutoHotKey (4) -- 你不能錯過的系統工具語言

還記得我們照著這樣的脈絡一路看下來

.撞飛01撞飛02

AutoHotKey 擁有駭客等級的強大功能

AutoHotKey 只需要 2MB 的安裝檔, 一方面擁有『批次檔的便利』, 另一方面又有『駭客等級的強大功能』,(還不只以下這些)

  • 可以常駐執行, 並且可以設定腳本的各種特性 (視窗、工作列、系統列……)
  • 監視, 控制, 修改 其他程式的 視窗控件 (window control)
  • 存取系統登錄 (Registry)
  • 執行 DLL 呼叫
  • 可以 轉換成 *.exe 讓沒有安裝 AutoHotKey 的電腦也能執行

雖然 AutoHotKey 並不能取代『主流』的程式語言, 例如 : Visual c++, Visual Basic, Delphi, ……。

但是, 如果你需要完成軟體自動化的工作, 或是想要自己寫一些系統小工具, 卻又不知該用什麼程式語言, 我會建議你一定要試試 AutoHotKey。

.

以下這些, 都是用 AutoHotkey 寫的。相信看了這些例子, 你也會同意我的看法。

.遠目

AutoHotKey  ---- 檔案、視窗與磁碟管理

  • Folder Menu 是一個快速切換資料夾的工具。

    可以在檔案總管、開啟/儲存對話框、命令提示字元等視窗中快速的切換到常用的資料夾。

.

.

  • 快速切換檔案總管是否顯示副檔名 (快速切換顯示副檔名, 程式旅人 - 學習紀事 –)

    搭配熱鍵 win+F5 再加上 AutoHotKey『存取系統登錄 (Registry)』的 RegReadRegWrite 功能

.

  • 熱鍵開關光碟機拖盤、抽取式磁碟管理

.

AutoHotKey 軟體庫 ---- 1 Hour Software by Skrommel

  • CAPshift ---- 讓 大寫鍵『變慢』, 按 0.5 秒才會有作用, 以避免誤按,
    按 1 秒則出現選單來改變選取文字的大小寫
  • BatteryRun ---- 接上 和 拔掉 電源時, 分別執行不同的程式
  • Barnacle ---- 在軟體視窗加上自訂的工具列
  • Removable ---- 列出目前的磁碟機, 雙擊移除抽取式磁碟
  • Captain ---- 取得 或 改變視窗標題
  • DragKing ---- 自動複製滑鼠選取範圍, 並計算字數, 行數
  • MultiMonMan ---- 多螢幕管理
  • PlainPaste ---- 連續快按兩次 ctrl-V 貼上純文字 (移除格式)
  • TheEnd ---- 更名時, 按 F2 不會選到副檔名

.

AutoHotKey ---- 更多功能 與 參考資料

.

  • Script Showcase (samples) (AutoHotKey 官網)
    ---- 初步看來, 上面 QJCHEN 的文章, 似乎是從這邊翻譯出來的

.


(...繼續閱讀.../...CONTINUE...)

2009年5月11日 星期一

包山包海的 AutoHotKey (3) – TinySpy 輕鬆取得控件的名稱與文字

上一篇提到『用 AutoHotkey 自動化軟體操作』的一種方式是 控制其他程式的 視窗控件 (window control)。

常見的 視窗控件 (window control) 如下:

以下就來說明如何取得『控件』的名稱與文字。

.

取得控件資訊的工具

AutoHotKey 附帶的 AutoIt3 Window Spy 就是『取得控件資訊』的工具, 可以參考以下的介紹

.

另外, 也有用 AutoHotKey 腳本寫的 WinGet, another Window SPY (Smurth, 2008-11-12, AutoHotkey Community Forum)

.

TinySpy 輕鬆取得控件的名稱與文字

至於更簡單的版本, 可以參考我寫的 TinySpy.ahk, 其中最關鍵的是以下幾行

……
Gui, +LastFound
GUI_ID := WinExist()
SetTimer, GetSpyInfo, 250
……
return
……
GetSpyInfo:
……
MouseGetPos,x2 ,y2 , win_id, ctrl_id
if ( win_id = GUI_ID )
    Return 
WinGetTitle, win_title, ahk_id %win_id%
ControlGetText, ctrl_text, %ctrl_id%, ahk_id %win_id%
……

.

2009-05-10_065958


取得『記事本』的視窗資訊 和 文字
2009-05-10_070141 


無法用滑鼠選取文字的『對話框』,
一樣可以把文字取出來

101_藍藍路

.

完整腳本如下, 扣掉註解還不到 40 行

#SingleInstance,Force
#NoEnv
SetBatchLines, -1
SetTitleMatchMode, 2
applicationName = TinySpy
applicationVer = 1.0

Gui, Font, S11 CDefault
Gui, Add, CheckBox, w350 h20 vifSpyOn gClickSpyOnOff Checked
Gui, Add, Edit, w400 h300 vSpyInfo, no Data yet ...
Gui, Show, , %applicationName% %applicationVer%

; Need +LastFound to make WinExist() to return window id of GUI itself
Gui, +LastFound
GUI_ID := WinExist()

; set Spy update period
SetTimer, GetSpyInfo, 250

; config Spy ON/off (and also config AlwaysOnTop or not) according to "ifSpyOn" checkbox,
ClickSpyOnOff:
    Gui, Submit, NoHide
    if ifSpyOn
    {
        Gui, +AlwaysOnTop
        GuiControl, Text, ifSpyOn, Spy ON (Always on Top)
    }
    else
    {
        Gui, -AlwaysOnTop
        GuiControl, Text, ifSpyOn, Spy off
    }
    GuiControl, Focus, SpyInfo
    return

GuiClose:
    ExitApp

GetSpyInfo:
    Gui, Submit, NoHide
    if !ifSpyOn
        return
    MouseGetPos,x2 ,y2 , win_id, ctrl_id

; Not Spy on GUI itself
    if ( win_id = GUI_ID )
        Return

    WinGetTitle, win_title, ahk_id %win_id%
    ControlGetText, ctrl_text, %ctrl_id%, ahk_id %win_id%
    GuiControl,, SpyInfo, [Window]  %win_title%`n[Control]  %ctrl_id%`n========== [Text] ==========`n%ctrl_text%
    Return

.


(...繼續閱讀.../...CONTINUE...)

2009年5月9日 星期六

包山包海的 AutoHotKey (2) -- 自動化軟體操作

以下是幾個『用 AutoHotkey 自動化軟體操作』的例子,

  • 呼叫視窗』、『送按鍵』……
  • 控制 其他程式的 視窗控件 (window control) ……
  • 使用 PostMessage 方式呼叫, 並且找到『隱藏文字』……

.

用 AutoHotKey 來自動化 DVD Shrink 的操作

Hack Attack: One-click DVD rips (lifehacker.com, 2006-10-31)
autohotkey 原始碼 (lifehacker.com)

主要做法是『呼叫視窗』、『送按鍵』……

……
WinWait, DVD Shrink 3.2 - E:\
WinActivate, DVD Shrink 3.2 - E:\
Sleep 500
Send, {Ctrl Down}
Send, {b}
Send, {Ctrl Up}
Sleep 600
IfWinExist, ……
……

類似的自動化, 可以使用 AutoHotKey 提供的 AutoScriptWriter 來『錄製』腳本

.

自動化控制其他程式的視窗控件

在需要『執行精準動作』或是『搭配邏輯判斷』的時候, 就需要用 視窗控件 (window control) 的方式來寫腳本, 也就是 AutoHotKey 的 Control, ControlGet, ControlGetText, ControlSetText, ControlSend, ControlClick …… 等指令。

最近我寫的一個腳本, 有如下的功能

image

 

  • 將兩個檔案『拖放』到 .ahk 腳本 上面,
    當做參數 (%1%, %2%)

IfWinNotExist, ……
{
    Run, ……
}
WinWait, ……,

  • 取得兩個檔案的『長檔名』, (Loop %1%),
    (『拖放』得到的是 8.3 檔名, 類似 xxxxxx~2.xxx)
  • Loop %1%
    {
        file1 = %A_LoopFileLongPath%
    }
    SplitPath, file1, , path1, , file1_noext
    nn1 := ""
    Loop, Parse, file1_noext
    {
        if A_LoopField between 0 and 9
            nn1 = %nn1%%A_LoopField%
    }

    image

     

  • 篩選檔名裡的數字部分, 再將兩個檔名的數字部分, 組合成第三個檔名,
  • 把這三個檔名, 填到 程式視窗 的對應欄位 (ControlSetText, Edit1, ……)
  • image

     

    • 控制 程式視窗 的下拉式選單 (Control, ChooseString, ……, ComboBox1)

    如果需要, 再補上完整的程式。

    .099_鞭

    依照『磁碟代號』呼叫系統列的『安全地移除硬體』

    ……
    PostMessage, 1226, 1226, 0x201,, ahk_id %hWnd%    ; Left Click down
    PostMessage, 1226, 1226, 0x202,, ahk_id %hWnd%    ; Left Click Up
    WinWaitActive, ahk_id %hWnd%,,5    ; Wait for SRH Tray left-click-Menu
    ……
    DllCall( "GetMenuString", UInt,hMenu, Int,idx, Str,mStr, Int,nSize, UInt,0x400 )
    If InStr( mStr,Drv ) {
        ControlSend,,{Down %A_Index%}{Enter},ahk_id %hWnd%
        Break
    }
    ……

    .


    (...繼續閱讀.../...CONTINUE...)

    2009年5月8日 星期五

    包山包海的 AutoHotKey (1) -- 不只是熱鍵工具

    為 AutoHotKey 正名 ---- 包山包海的 AutoHotKey

    包山包海的 AutoHotKey, 怎麼說呢?

    最近開始使用 AutoHotKey, 這才真正體會到 AutoHotKey 的強大, 覺得該為它『正名』 :

    AutoHotKey 不只是熱鍵工具

    雖然叫 AutoHotKey, 但是以下這些其實只是 AutoHotKey 的基本工夫,
    • 自訂『熱鍵』『熱字串』的自動化操作
    • 按鍵滑鼠動作 給特定視窗

    骨子裡的『AutoHotKey』, 可是遠比『熱鍵工具』來得強大的哦!!

    .

    AutoHotKey 擁有批次檔的便利

    • 雙擊 *.ahk 腳本 就可以執行 (當然要先安裝 AutoHotKey),
    • 純文字的 *.ahk 腳本就像批次檔一樣, 可以隨時用文字編輯器新增和修改
    • 可以 使用環境變數, 例如 %temp%

    此外, AutoHotKey 還有批次檔所沒有的 GUI 介面

    .

    AutoHotKey 擁有駭客等級的強大功能

    『駭客等級的強大功能』還不只以下這些,
    • 可以常駐執行, 並且可以設定腳本的各種特性 (視窗、工作列、系統列……)
    • 監視, 控制, 修改 其他程式的 視窗控件 (window control)
    • 存取系統登錄 (Registry)
    • 執行 DLL 呼叫
    • 可以 轉換成 *.exe 讓沒有安裝 AutoHotKey 的電腦也能執行

    .

    AutoHotkey 熱鍵設定

    簡睿的這一篇, 是很好的『入門指南』, 包括 : AutoHotKey 的下載、安裝、基本概念、『熱鍵』『熱字串』 的設定 …… 等

    ……
    AutoHotkey顧名思義就是協助你將常用按鍵自動化的工具
    ……
    本文會一步一步地把建立腳本檔的步驟清楚、簡單的介紹給你,讀者們只要依樣畫葫蘆馬上就能感受到AutoHotkey的強大威力了!

    .

    • F2改檔名時只會選取主檔名,原本是不管主檔名還是副檔名都會選 (原始碼, 來源待查)

    .催眠

    AutoHotkey 的參考資料

    以下的參考資料, 同時也介紹了許多 AutoHotkey 的其他功能

    .096_K書

    撰寫腳本時, 當然更要隨時查閱官網的 參考資料

    .


    (...繼續閱讀.../...CONTINUE...)

    2009年4月23日 星期四

    HSL 色彩空間的視覺效果

    接下來的『相關度』和『標籤雲』都會加上 HSL 的方式來處理顏色。在改版發表之前, 可以到我的『HSL 測試頁』先體驗一下。

    image 
    一般的作法 線性內差 得到的『色彩漸層』中間的部分常常是 灰色
    image
    但是, 在 HSL 色彩空間 得到的卻是彩虹般的『紅橙黃綠藍』

    .

    HSL 色彩空間的注意事項

    • 設定的 minColor, maxColor 還是以 RGB 表示的
    • 直接從 .colorHSL = 0, 1, 2 選一個滿意的『視覺效果』就可以了

    簡單吧 !!

    .

    .

    好奇寶寶分隔線

    是的, 使用者只需要以 RGB 來設定顏色, 程式內部會自動換算 RGB 到 HSL,

    如果你還是好奇, 希望以下這些『應用面的觀念』可以幫助進一步了解 ……

    • HSL 和 RGB 色彩空間 (色座標) 有何不同?
    • HSL 和 RGB 色彩空間 為何會影響『視覺效果』?
    • HSL 色彩空間的其他細節

    .

    最後, 才是給程式設計者的參考資料:

    • HSL 的程式設計參考資料

    .

    HSL 和 RGB 色彩空間的不同

    RGB 色彩空間

    • R : Red = 紅色
    • G : Green = 綠色
    • B : Blue = 藍色

    image

    類似『直角座標』的方式 

    HSL 色彩空間

    • H : hue= 色相
    • S : saturation = 飽和度
    • L : lightness = 亮度

     image

    類似『極座標』的方式

    此外, 還有和 HSL 類似的 HSV (色相 hue, 飽和度 saturation, 明度 value), 詳情請看  :

    096_K書

    .

    HSL 和 RGB 色彩空間的視覺效果

    image 
    一般的作法從 青色 RGB=#00FFFF 線性內差到 紅色 #FF0000, 得到的『色彩漸層』中間的部分是 灰色 #808080
    image
    但是, 在 HSL 色彩空間 得到的卻是彩虹般的『紅橙黃綠藍』

    下面的圖示可以幫助理解,

    • 路徑 0 : 一般 RGB 的作法, 兩個顏色的內差路徑常常會經過中間灰色的部份

     

    • 路徑 1 : HSL 色彩空間, 使用角度來表示 hue (色相), 所以內差路徑會呈現『弧線』或 『螺旋線』, 而經過比較多的顏色
    • 路徑 2 : HSL 採用 極座標系統, 所以同樣兩個顏色之間的內差路徑可以有兩個方向

     

    image 099_鞭

    HSL 色彩空間, 使用角度來表示 hue (色相)

    • R : Red = 紅色 (0度)
    • G : Green = 綠色 (120度)
    • B : Blue = 藍色 (240度)
    • Y:Yellow = 黃色 (60度)
    • C:Cyan = 青色 /青綠色 (180度)
    • M:Magenta = 洋紅色 / 品紅色 (300度)

    .

    把對應的 RGB 變化也一起畫出來 (在 HSL 測試頁 可以自己輸入顏色)

    image
    0: 傳統 RGB 運算方式

    (左圖)
    在簡單的線性內差之下, RGB 一起變化, 產生的視覺效果並不理想


    (下左, 下圖)
    經過 HSL 的換算之後, RGB 依序變化, 就變得非常精彩 
    image
    1: HSL不跨過0度
    image
    2: HSL 經過0度 (紅/紫色)

    .

    HSL 色彩空間的其他細節

    還有一些細節, 不見得每個人都會遇到, 下面先簡單帶過, 建議到我的『HSL 測試頁』去『實際體驗』一下, 會更有感覺, 或是隨時提出來討論

    擔心被搞混的人, 就不一定要往下看囉~~

    項目

    測試參數

    • HSL 採用 極座標系統, 所以同樣兩個顏色之間的內差路徑可以有兩個方向, 目前的定義是
      • 1: HSL 內差路徑不跨過0度
      • 2: HSL 內差路徑經過0度 (紅/紫色)
      • 0: 傳統 RGB 運算方式

    任意兩個顏色, 觀察 0, 1, 2 的不同
    • 紅色 (0度) 附近的 紅偏橙 #FFxx00 和 紅偏紫 #FF00xx, 可以產生出不一樣的效果
    • maxColor = (255, 1, 0) 或 (255, 0, 1), 搭配任意的 minColor
    • maxColor = (255, 1, 0), minColor = (255, 0, 1), 或對調
    • 非常接近的灰色 (或黑色), 可以因為 hue (色相) 的不同, 而有不同的效果
    • 任意顏色, 搭配 (33, 32, 32), (32, 33, 32), (32, 32, 33), (33, 33, 32) 或其他不同的灰/黑色

    .

    HSL 的程式設計參考資料


    之前在處理『相關度』和『標籤雲』的顏色時, 就在思考如何呈現出 更理想的『色彩漸層』

    當時所使用的方法, 效果雖然還不錯, 但設定上比較麻煩, 也不容易理解。

    所以, 除了 依相關度排序的『相關文章』功能 提到 optionRGB = […] 之外, 並沒有做太多的介紹。

    這些程式, 都還沒有使用 HSL 色彩空間 來處理顏色

    .

    後來, 有機會和『標籤文章選台器』的作者 LVCHEN 討論到這方面的問題, 提到或許可以將 色座標改用 HSL (色調,飽和度,亮度), 又不約而同找到類似的 RGB <=> HSL 轉換程式 ……

    現在, 在我的程式裡看到的是『改寫的 RGB <=> HSL 轉換函數』, 產生的 HSL 只適合程式內部使用。如果要用作其他用途, 建議還是參考下面的『原出處』:

    .

    另外, HSL 測試頁 還用到了 JavaScript Vectorgraphics Library 來繪圖

    .


    (...繼續閱讀.../...CONTINUE...)

    2009年3月11日 星期三

    Cygwin 習作 ---- 編譯 DrawTiming

    你應該也有這種經驗, 想找某方面的軟體, 尋尋覓覓尋尋覓覓的結果, 卻發現怎麼就只有 Linux 版本 ..., 這時候你怎麼辦? 會想動手把它『移植』到 Windows 嗎?

    例如: 有機會和 Evernote 或 OneNote 互補的 BasKet Note Pads, 讓我差點想把 andLinuxcoLinux 架起來....。而最近找到『畫時序圖的免費工具 DrawTiming, 就讓我安裝了第一次使用的 Cygwin 來編譯執行檔, 最後又換成 MSYS + MinGW ...

    . 

    Cygwin 與 MinGW 的不同

    Cygwin 與 MinGW 有什麼不同? 我的看法是: 比較複雜, 或是使用到較多外部函式庫的程式, 適合使用 Cygwin; 而比較單純, 沒有使用到外部函式庫, 而且又希望很容易分享出去的程式, 則適合使用 MinGW

    其他說明可以參考 :

    Cygwin ... 透過 ... Cygwin1.dll ... 建立一個系統呼叫轉換層,將原先 unix 世界裡的 system call 呼叫,... 映對到微軟視窗作業系統的系統呼叫,... 在 Windows 底下模擬出一個 unix 平台來

    MinGW ... 將 gnu 這個 open source, free 的開發工具移植到微軟視窗平台,他直接產生出來的PC視窗平台機器碼,

    MinGW 是取 Minimalist GNU for Windows 計劃之意,其目標為提供一個可在 Win32 平台上開發 Win32 native code 的 GNU GCC tools ,而非提供 Unix 程式移植到 Win32 平台之用,此即為其 Minimalist 之意。... 在 MinGW 中,有提供一套最小化的 unix shell 擬似執行環境,稱為 MSYS (Minimal SYStem)
    ... 如果是打算將原本在unix 環境下的程式移植到win32 的使用者,也不建議用這套工具, Cygwin 更合適。

    簡單的說,cygwin在windows上提供了一個像linux (Linux-like)的環境,可以讓使用者在windows上執行linux的程式。

    嚴格地說, cygwin 是模擬了 GNU 的環境, 而不是 linux 的環境,藉著 cygwin 的函式庫(library), 在 Win32 API 環境上提供了像 linux 般的API 環境. 利用 Cygwin, 你可以:

    • 將 linux 上的程式移植到 Windows , 而不必做重大的修改,只需將原始碼拿來作 configure 與 make 就好了。
    • 使用常用的 linux 工具程式,如grep, sed, awk等。
    • 撰寫 Win32 native console 或是 GUI 應用程式。

    .

    下載與安裝 Cygwin

    1. 連至 www.cygwin.com 下載 setup.exe
    2. 執行 setup.exe , 選取Download from Internet
      1. 選取距離自己最近的下載點
      2. 選取所需套件 // 建議全選devel, lib等分類的所有套件
    3. 執行 setup.exe , 選取Install from Local directory安裝套件 //最好選取 All user
      1. 選取所有套件
    4. 執行桌面上的 Cygwin 的 icon 圖示即可執行此一 Cygwin 環境。// 視窗大小可由icon 圖示右點按 選取調整字型 及佈置

    step by step 可參考 http://linux.tnc.edu.tw/techdoc/shell/x52.html

    .

    例如, DrawTiming 官網的 安裝說明 提到已經在 FreeBSD, Linux, 和 Cygwin 底下測試過, 另外在 編譯成 Cygwin 版本的注意事項 又說到需要這些函式庫: ImageMagick, libMagick-devel, libbz2-devel, gcc-g++, make, xorg-x11-devel, ghostscript-base, 所以我裝 Cygwin 的步驟就是 :

    • 先下載 572K 的 Cygwin setup.exe,
    • 執行 setup.exe, 選『下載但不安裝』 (Download Without Installing)
    • 指定下載檔案到本機的存放位置
    • ... 選下載點, 例如 ftp://ftp.???.???.edu.tw (台灣的幾個大學)
    • ... 選 下載的函式庫
      這是一個樹狀選單, 如果不清楚到哪一個類別節點去找函式庫, 可以在 本機存放位置的 ftp://ftp.???.???.edu.tw 子目錄底下找到 setup.ini 的內容, 例如下面的例子 :
    • 下載完成之後, 再執行一次, 這次選『從本機的存放位置安裝』(Install from Local Directory) ...

    setup.ini 的內容

    @ libMagick-devel
    sdesc: "Image manipulation software suite (development)"
    ldesc: "ImageMagick is a software suite to create, edit, and compose bitmap ..."
    category: Graphics
    requires: cygwin libbz2-devel
    libfontconfig-devel libfpx-devel libfreetype2-devel libjasper-devel libjbig-devel libjpeg-devel liblcms-devel libpng12-devel libtiff-devel libwmf-devel libxml2-devel libX11-devel libXext-devel zlib

    ...

    @ xorg-x11-devel
    sdesc: "Obsolete package"
    ldesc: "Obsolete package"
    category: _obsolete
    requires: libX11-devel xorg-x11-base

    可以得知 libMagick-develGraphics 這個類別節點底下, 而且它同時需要 cygwin libbz2-devel, 這些相依的函式庫 (dependency), 會在點選 libMagick-devel 時被自動納入, 而 xorg-x11-devel 則是不存在 (_obsolete)

    下面是我在 Cygwin 內定的部份之外, 配合 DrawTiming 再勾選的函式庫 :

    類別節點 函式庫
    Devel gcc-core
    gcc-g++
    make
    Graphics ImageMagick
    ghostscript
    ghostscript-fonts-others
    ghostscript-fonts-std
    libMagick-devel
    Libs libbz2-devel

    _obsolete (不存在)

    ghostscript-base
    xorg-x11-devel

    .

    製作 Cygwin 版的 DrawTiming

    假設 drawtiming-0.7.tar.gz 存放在 e:

    • 點選桌面的 Cygwin 圖示
    • cd cygdrive/e/
      ( cygwin 底下的 e: 會對應成 /cygdrive/e/, c: 會對應成 /cygdrive/c/ )
    • tar -xzf drawtiming-0.7.tar.gz
    • cd drawtiming-0.7
    • ./configure
    • 依照需求 make
      make           (編譯執行檔)
      make install  (編譯並自動安裝到)
      make check  (編譯並測試執行結果)
    • 回到 Windows, 檢查 *.gif 的結果是否正確

    如果只需要在一台機上器上執行 DrawTiming, 到這邊就算完成了。

    總計 Cygwin 版完整的 DrawTiming, 過程中除了120KB 的 DrawTiming 原始程式碼之外, 還要下載 Cygwin 將近 80MB 的安裝檔 (含 gcc, ImageMagick, ghostscript ... 等), 安裝之後則變成大約 300MB 的 Cygwin 的執行環境 ....。不過, 這一番辛苦之後可以正確輸出 GIF, JPG, PS, EPS。

    .

    『免安裝 Cygwin』的 DrawTiming

    經過一番嘗試, 我發現可以抽取出一些 DLL, 變成『免安裝 Cygwin』在 Windows 命令列執行的 DrawTiming。而這個『免安裝版』因為字型相依性還沒全部解決, 所以只能輸出 PS, EPS 格式。雖然功能上打了折扣, 但是只需要複製大約 10MB 的檔案, 就 可以在另一台『沒有安裝 Cygwin 的電腦』執行 DrawTiming

    把下面這些檔案, 連同在 Cygwin 底下編譯的 drawtiming.exe 複製到同一個目錄,
    其中, type-ghostscript.xml 裡面的路徑設定 /usr/share/ghostscript/fonts/ 要去掉

    例如 :

    ... metrics="/usr/share/ghostscript/fonts/a010013l.afm" glyphs="/usr/share/ghostscript/fonts/a010013l.pfb"

    改成 :

    ... metrics="a010013l.afm" glyphs="a010013l.pfb"

    cygbz2-1.dll
    cygexpat-1.dll
    cygfontconfig-1.dll
    cygfreetype-6.dll
    cygiconv-2.dll
    cygjpeg-62.dll
    cyglcms-1.dll
    cygMagick++-1.dll
    cygMagickCore-1.dll
    cygMagickWand-1.dll
    cygtiff-5.dll
    cygwin1.dll
    cygX11-6.dll
    cygXau-6.dll
    cygxcb-1.dll
    cygxcb-xlib-0.dll
    cygXdmcp-6.dll
    cygXext-6.dll
    cygz.dll

    原本在 c:\cygwin\bin

    懶得篩選, 也可以 *.dll 全部複製
    n019*.* 原本在 c:\cygwin\usr\share\ghostscript\fonts

    type.xml
    type-ghostscript.xml
    type-solaris.xml
    type-windows.xml

    原本在 c:\cygwin\lib\ImageMagick-6.4.0\config

    .


    (...繼續閱讀.../...CONTINUE...)

    2009年3月10日 星期二

    畫時序圖的免費工具 DrawTiming

    DrawTiming 是『畫時序圖的免費工具, 可以從命令列產生時序圖, 不僅描述時序的文字檔語法非常直覺, 而且還能畫出時序的相依性
    sample

    .

    Windows 也能使用 DrawTiming

    原本 DrawTiming 要自己在 Linux 或 Cygwin 底下編譯成執行檔, 而且要搭配 Magick++ API 等 ..., 不過, 我改造出一版 只能產生 PS, EPS 格式的『免安裝版』, 請從 這裡下載 zip 檔
    之後就可以 在 Windows 命令列執行 DrawTiming ...

    • 將 zip 檔解壓縮到任意目錄
    • 開啟命令列 ---- (附屬應用程式-命令提示字元, 或是 開始-執行-cmd),
    • 切換到那個目錄
    • 執行 sample-eps.bat
    • 或是手動執行 drawtiming  -o  sample.eps  sample.txt
      -o *.eps    => 指定輸出檔名
      *.txt         => 輸入檔名
    • 順利的話就可以產生如下幾個 *.eps 檔

    .

    • 可以安裝 GhostView 來觀看 EPS 檔,
    • 可以將 EPS 檔插入 (或拖放) 到 Word, Excel, PowerPoint 等 MS-Office 軟體而成為向量圖檔
    • 繪圖軟體 (例如: PhotoShop), 看圖軟體 (例如: XnView) 也可以支援 EPS 檔,
      ---- 歡迎大家補充
    • 原始程式 EPS 檔頭缺了一個驚歎號, 已經一併修正
      => %!PS-Adobe-3.0 EPSF-3.0

     

    sample.eps
    sample_font.eps (和 sample.eps 一樣, 但文字變大)

    guenter 
    guenter

    statement1

    statement1

    memory

    memory

    .

    DrawTiming 使用技巧

    DrawTiming描述時序的文字檔語法』非常直覺, 並且有『命令列參數』可以調整字體大小, 圖檔格式 ... 等, 這些在 官網上有詳細的說明, 就不再贅述。

    如果急著上手, 也可以從 示範的輸出結果『看圖說故事』, 直接從圖形上找到想要的圖樣, 再回頭研究 *.txt 文字檔案的相關內容。

    以下補充其他的注意事項 :

    • 善用 # 號開頭的整行註解, 讓檔案更具可讀性
    • 依照要顯示的順序列出所有的變數和它們的初始值, 不確定的值還是應該指定 Z (high Z) 或 X (don't care),
    • 不需要全部擠在同一行, 在句號之前都是表示同一個單位時間
    • 在兩個句號之間 (同一單位時間), 不需要特別注意順序, 但是除了下面這種例子 :

    token = "\"=\"".
    token = SYMBOL.
    token = "\".\"" => clock = "N+1" => deps.length = "0".

    token = "\"=\"".
    token = SYMBOL.
    token => clock = "N+1" => deps.length = "0";
    token = "\".\"".

    statement2

    .

    目前有下面的小問題, 不清楚是否有相關語法可以解決

    • 當有多個訊號而希望分成幾個群組時, 無法插入空白行, 暫時的解決方法是插入一個沒有變化的假訊號當作區隔

    .

    UML 與 TDML

    在搜尋『畫時序圖』軟體的過程, 我用 Timing Diagram 當關鍵字, 發現另外兩個名詞

    • UML (Unified Modeling Language, 統一塑模語言)

      image軟體系統發展人員用以建造模型 ... 使得工作團隊能夠:將系統具象化、系統結構化、行為規格化、建構系統、以及記錄發展系統過程中之各項決策。...

      UML所涵蓋的內容是表示法而非程序,UML是與程序無關的,也就是說,無論以任何程序來開發軟體系統,都可以使用UML來建構軟體模型。 (淺談UML 資策會)

    2005年, UML 2.0 增加 時間圖 (UML Timing Diagram) 的定義, 不過可惜的是找到幾種免費的 UML 軟體, StarUML, BOUML, umbrello, 看來都只有『循序圖』(Sequence diagram), 而沒有『時序圖』(Timing Diagram)

    .

    • TDML (Timing Diagram Markup Language)

    http://xml.coverpages.org/tdml.html 有 TDML 的說明, 也列出一些軟體, 不過我並沒有找到合用的軟體來畫『時序圖』。

    付費版的可以參考 Timing designer

    有一款免費線上使用的 TimingTool Lite, 看來需要 Java 1.5, 而且點下 "Demo" 之後會提示要註冊一個帳號, 所以我還沒使用過。

    AndyTiming 是我同事找到的另一款免費的時序圖工具, 它比 DrawTiming 更簡單, 請見下面的說明

    .

    AndyTiming 另一款免費的時序圖工具

    imageimage

    AndyTiming (下載點) DrawTiming
    在下半視窗直接輸入一串字元來代表波形 命令列工具
    用字元『畫出』時序圖 從時序描述檔案轉換成圖形 (邏輯上較為嚴謹)
    無法表示『時序的相依性』, 也不能標示『時間間隔』 可以標示『時序的相依性』與『時間間隔』

    .


    (...繼續閱讀.../...CONTINUE...)