2010年5月24日

如何善用 Word & Notepad++ 巨集來完成需重複執行的檔案編寫動作

上個週末打開一個影片檔,發現字幕檔是中英文混合的,造成字幕吃掉畫面很大的空間,
打開字幕檔一看,果然每一段時間都有先英文後中文的字幕:
















因此我想要自己作成「只有中文」&「只有英文」兩個字幕檔,但這個檔案有6418 行,如果要手動一行一行的刪除 (而且要作兩次,第一次先刪除全部的中文,第二次刪除全部的英文),顯然會作到瘋掉,經過一些嘗試,我發現有以下幾個辦法可以讓現成的軟體幫我完成這個工作:
  • Word 2007 (其他版本應該也可以) 的巨集
  • Notepad ++ 的巨集
以下分別說明。
如何使用 Word 2007 的巨集
1.點選 Word 左上角的 Office Logo,進入「Word 選項」:
3
2.在「常用」類別中,勾選「在功能區顯示 [開發人員] 索引標籤」
2
3.打開影片的字幕檔 (.srt),記得在「檔案類型」選擇「所有檔案 (*.*)」
4
4.打開檔案後,先把游標移到我要刪除的第一行,然後先把這行刪除掉
6
5.接下來,點選「開發人員」索引標籤,再點選「錄製巨集」
5
6.接下來就是巨集的內容,也就是你要重複不斷執行的一系列動作,我的動作是:
  • 把游標往下移 5 行
  • 按住 shift + end 選取整行(此時會包含換行符號)
  • (shift 鍵不要放開)按「左方向鍵」,以取消選取換行符號
  • 按 Delete 刪除該行
6
7.做完以上動作後,點選「開發人員」索引標籤中的「停止錄製」按鈕,這樣巨集就大功告成啦!
7
8.點選「開發人員」索引標籤中的「Visual Basic」,此時會開啟 Microsoft Visual Basic IDE
9.此時可看到剛剛錄製的巨集,接下來可用以下兩種方法來執行整份文件的取代
  • 把巨集內容改寫為一個無窮迴圈:適用於整份文件的排版、格式都固定,確定重複執行不會出錯時
  • 把 Word 主視窗和 Microsoft Visual Basic 視窗並列顯示,手動重複點選綠色三角形按鈕,以手動執行一次游標所在的 Sub:適用於不確定整份文件的排版、格式是否都一致,或者想要一一確認欲執行的修改時
9
上述的步驟 6 中所執行的一系列動作,若是利用 Word 內建的「按 F4 重新執行剛剛執行的動作」是沒有用的 (只會重複幫你執行「按 Delete」這個動作),必須要以錄製巨集的方式,告訴 word 你要重複執行的動作究竟是哪些。(也可以把欲重複執行的動作設定為「先刪除游標所在的該行,再把游標往下移 5 行」)

如何使用 Notepad ++ 的巨集

利用 Word 麻煩的地方在於:
  • Word 是要版權的 (而且 Word 比較吃資源,啟動時間也比較慢)
  • 在 Word 裡面按「shift + end」會選取到換行符號,不小心會多刪除掉一行,不利於一系列的動作重複執行
有個更好的替代方案是使用有名的開源碼編輯器:Notepad++ (還有 Notepad ++ Portable 可以選擇)。Notepad++ 一樣有句集 (macro) 功能,接下來就看看如何使用吧!
1.打開字幕檔 (.srt)
2.打開檔案後,先把游標移到我要刪除的第一行,然後先把這行刪除掉
3.從「Macro」選單執行「Start Recording」功能,接下來的動作跟在 Word 中錄製巨集一模一樣,差別在於,以「shift+end」選取整行後,不會選取到換行符號!所以就不用作「(shift 鍵不要放開)按「左方向鍵」,以取消選取換行符號」這麼麻煩的事情了。




















或者按紅色的錄音按鈕開始錄製巨集:
11

4.錄製完畢後,點選「Macro」選單的「Stop Recording」功能,以停止錄製巨集:













或者按黑色的按鈕以停止錄製巨集:
13

5.從「Macro」選單中可以看到,「Playback」(也就是播放巨集)的快捷鍵是「Ctrl+Shift+P」,因此接下來只要按住「Ctrl+Shift+P」不放,Notepad++ 就會自動把整份文件給處理完了。(要注意,若有安裝 PicPick,此快捷鍵會起動 PicPick 的白板功能,只要先把常駐的 PicPick 關閉即可)













或者按藍色三角型按鈕來播放剛剛錄製好的巨集:





如果這個巨集日後會常常需要使用的話,也可以利用「Macro」選單中的「Save Current Recorded Macro…」功能來儲存剛剛錄製好的巨集。

雖然 Word 提供的強大的 VBA 編寫環境,但是對於這類簡單的應用來說,我覺得 Notepad++ 更為輕巧好用,內建的巨集功能相當好用,也不用擔心版權的問題。

(另外發現一個小技巧,用 PicPick 擷取矩形區域時,且要完整保留左上角的 logo / 文字,最好從右下角開始往左上角圈選,會比較順。)

成果:
利用 Notepad++ 的 Compare 功能可以看出,處理前的字幕檔(左)同時有中英文字幕,處理後的字幕檔(右)只剩下英文字幕,要製作全中文的字幕也是如法炮製。




後記:
最近也在幾個介紹好用軟體的有名部落格上看到一些可錄製鍵盤、滑鼠的操作,而後重複播放的軟體,例如:
但是經過測試,這兩套軟體無法正確紀錄「shift + end 選取整行」的動作,只能紀錄到「按 Delete 鍵」這個動作,因此當重複播放錄製完畢的一系列動作時,會發現程式只能自動重複幫我執行「按 Delete 鍵」這個動作而已,不知道是否是我錄製的方法不對,如果各位網友有試出正確的作法,歡迎一起討論 :D

2010年5月21日

為何虛擬化技術是雲端運算的計量(&計費)基礎

五月初上了一堂跟雲端運算有關的課,重點是虛擬化技術在雲端運算中扮演的重要角色。這次的講師是胡嘉璽老師(參考資料-1、2),不像一般常見的討論著重在如何將 Cloud Computing、Utility Computing、Grid Computing 區分開來(例如 Wikipedia 上的 Comparisons,或者研究所考試的題目),胡老師將 Cloud Computing 視為電腦運算發展最終的目標,而 Grid Computing 和 Utility Computing 則是技術演化過程中出現的重大里程碑,兩者都可視為是 Cloud Computing 的基礎。這些重要技術的演進可以下圖來看:
1
其中 Utility Computing 作為 Cloud Computing 中的計量 (以及計費)基礎,就跟水電瓦斯一樣,用了多少運算能力就付多少錢 (pay-as-you-go)。而 Grid Computing 則是作為 Cloud Computing 中的計算基礎,用以組織數量龐大的電腦來執行平行運算,以提昇運算效能 & 容錯能力。
接下來再這次聽到的「如何用一句話定義雲端運算」:
雲端運算就是將已量化的許多運算資源,以網路為媒介,透過特定的介面提供給需要服務的使用者。
其中幾個重點包括:
  • 已量化:方便計算使用量 –> 方便計費 –> Utility Computing 的觀念
  • 許多:認定硬體的不穩定性(終究會壞),因此要以 redundant 的方式提供運算資源 –> Grid Computing 的觀念
  • 運算資源:包括 CPU、RAM、Storage、Bandwidth 等
從另一個角度來看,雲端運算所做的事情就是:
將運算資源打散,找出最小的計量單位,之後將其全部集中起來,並重新分配的過程。
廠商提供服務就是為了賺錢,要賺錢就得知道要收多少錢。為了要計費,就必需要先計算使用量,因此必須先「量化」。要計算使用量,就必需要定義出「最小計量單位」,就和水電瓦斯會定義甚麼叫做「一度」,一定要先定義出消耗多少電能稱為一度,才能定義一度電要收多少錢(and for 廠商的成本估算),最後紀錄每個月每戶的使用量(用電度數),就能以此為依據跟用戶收錢了。
因此在衡量電腦運算資源時,要如何定義出一個最小的計量單位,就是一個重要的課題。「最小計量單位」跟上一篇文章中提到的強大擴充性有關:
我覺得使用者能夠 on-demand 的、基本上無上限的(只要付的出錢來)、在短時間內(數十秒到幾分鐘)擴充所需的運算資源,是雲端運算最重要的特性,因為這是以往的架構所做不到的。
在上述這些運算資源中(CPU/RAM/Storage/Bandwidth),通常會將 Storage 隔離出來(以 NAS 實作),因為 Disk Space 的劃分是很容易的,可以動態根據使用者的需求來切割。而剩下的 CPU/RAM/Bandwidth 則可以用一個完整的作業系統來包裝,包裝起來之後成為一個「最小計量單位」,當需要擴充系統的運算能力時,便可以一個作業系統為單位,看要增加幾個作業系統來提供服務,而後依照用戶使用的作業系統數量 & 時間來收費。
基本概念是如此,但是如果作業系統必須被安裝在實體機器上,那麼要擴充運算能力時就必須新增實體機器,這往往要耗費大量的時間和人力,對於應付短時間內暴增的運算需求是緩不濟急的(e.g., 美國的 Black Friday),例如紐約時報的 PDF 轉檔案例 (中文資料),在 24 小時內開啟 100 個 EC2 VM 的 instance 將 4TB 的原始資料轉換為 1.5TB 的 PDF 檔,為求結果正確,整個運算還執行了兩次!如果要買進 100 台實體機器來執行這個運算任務,光是把這 100 台實體機器組裝、上架 & config 好,可能就要耗去一週了 (就算是湊出 100 台舊機器也是很浩大的工程)。更重要的是,這種一次性的運算執行完畢以後,最頭痛的就是後續這些機器要怎麼運用,而紐約時報只要關閉那 100 個 VM 的 instance,就不用再持續付出任何成本了。
為了解決實體機器造成的龐大成本問題(金錢 & 時間),虛擬化技術扮演非常重要的角色,除了把 CPU/RAM/Bandwidth 包裝成作業系統以外,進一步包裝成虛擬機器 (VM) 後,配合最近幾年幾個虛擬化技術的成熟,終於讓「在極短時間內大幅擴充運算能力」的願景得以實現。
虛擬化技術發展已經很久了,最早從 1960 年代開始,最近幾年的重要技術包括:
  • VM templates and clone:可將 VM 製作成範本,而後以此範本為基礎大量產生新的 VM (現在從 Amazon EC2 開啟一個 VM 就是這樣的效果)(參考)
  • VMware vMotion/Hyper-V Live Migration:在 VM 不停機的狀況下,將 VM 從一台實體 server 移轉到另一台實體 server 上執行,在此期間該 VM 所提供的服務不中斷 (MS Hyper-V demo)
透過這些技術讓使用者得以在短時間內新增 VM instances 以提供服務,並且更容易針對硬體規格 & 使用量去訂價,例如 Amazon EC2:
4
至於每種 Instance 的規格是甚麼,就要看 EC2 Instance Types 的說明:
5
使用者(除了 IaaS 廠商之外)只要選擇合適的硬體規格,再跟據需求啟用適當數量的 VM Instance 之後,就可以開始執行運算任務了,整個過程在數分鐘內就可以完成,如此就不用自己建置、維運數量龐大的實體機器了!對於 IaaS 廠商來說,透過 VM 可以有效提高實體機器的利用率,提昇服務的可靠性,以服務更多的使用者,才可以賺更多的錢。
以上補充虛擬化技術在雲端運算中扮演的角色,如有錯誤歡迎指教 :D
相關文章:

2010年5月19日

利用 Joomla 做資產管理 (Asset Management) -4 : Fabrik 套件使用小技巧 & Joomla 客製化

在前面的文章中已經介紹完 Joomla & Fabrik 套件的安裝以及使用方式,接下來整理的是我使用 Fabrik 套件過程中發現的小技巧,以及如何客製化 Joomla。
[無痛解法] Fabrik drop down 欄位的搜尋問題
開始使用 Fabrik 套件的時候發現一個問題,若把 Form 中的 Element 設定為 drop down,在輸入資料時固然方便,但是要過濾資料時會遇到一個問題:沒有「All」這個過濾條件!以下圖為例,當我想要利用「IP」來找某台主機的資料,此時「服務類別使用狀態」條件的第一個值會生效,也就是說兩個條件都必須符合 (邏輯 AND) 才能正確找到所要的資料。這是很不方便的,因為我也沒辦法記住每台主機的「服務類別使用狀態」是什麼,若「服務類別使用狀態」的值沒有設定對,就算 IP 打對還是找不到資料。若把 Element 設定為 field,過濾條件中的預設值就是「All」,也就是沒有作用,就不會遇到這個問題了!
1
經過測試,發現一個最簡單的解法,也就是在新增資料時將 Element type 設定為「drop down」,以減少資料輸入錯誤的可能;等到資料輸入完畢後,再把 Element type 改回「field」,如此在過濾條件中該欄位的下拉式選單就會出現「All」的選項。這樣做的話,就不用擔心將 drop down 改為 field 之後,drop down 的選項會消失,所有的設定資料(drop down 的 text & value) 都會保留在 DB 裡面,未來要再輸入資料時,只要將 Element type 改回 drop down 即可繼續使用。
2
如何批次匯入資料至 Fabrik Table
經過實驗以後,整理出以下幾種批次匯入資料的方法的優劣比較:
利用 Joomla / Fabrik 來匯入 在 phpMyAdmin 介面匯入
操作介面 Joomla 網站 phpMyAdmin 網站
支援檔案格式 CSV (需要保留欄位名稱列) CSV (不可保留欄位名稱列)
支援編碼 UTF-8 UTF-8
中文亂碼問題 難處理 (匯入後要手動調整,
e.g., 101—>分機101)
沒問題
其他 fabrik_internal_id 和 time_date 欄位可空白 fabrik_internal_id 可空白time_date 欄位要有資料(改為 TIMESTAMP 也不會自動填入匯入時的時間)

需將半型逗號「,」取代為全型逗號「,」,以避免匯入資料時欄位分割錯誤
最後還是決定用 phpMyAdmin 的介面來執行批次匯入/匯出。
(匯出資料的注意事項可參考:phpMyAdmin 匯出中文資料成 utf-8 編碼的 .csv 格式之注意事項)
從 phpMyAdmin 管理後台批次匯入資料:
步驟一:先準備好要匯入的原始資料:
3
步驟二:調整原始資料,要注意:
  • 不可保留頂端列的欄位名稱
  • 欄位順序要與 MySQL 中的 Table 欄位順序一致
  • 不用新增 fabrik_internal_id 欄位,但要自己給 time_date 欄位的資料
4
Excel 預設編碼方式為 ANSI,檔案只要用 Excel 編輯過,編碼就會被改成 ANSI,要再以記事本開啟另存為 UTF-8 編碼
(以 Notepad++ 編輯則不會更改原本的檔案編碼)
5
phpMyAdmin 介面的設定參考下圖:
image
利用 CSV 批次匯入資料:
步驟一:一樣先準備好要匯入的原始資料:
3
步驟二:調整原始資料,要注意:
  • 新增 fabrik_internal_id 和 time_date 這兩個欄位 (內容可空白)
  • 要把原始資料的中文欄位翻譯成英文,欄位順序要與 MySQL 中 的 Table 欄位一致
6
Excel 預設編碼方式為 ANSI,檔案只要用 Excel 編輯過,編碼就會被改成 ANSI,要再以記事本開啟另存為 UTF-8 編碼
(以 Notepad++ 編輯則不會更改原本的檔案編碼)
5
步驟三:從 Fabrik Table 的介面中,點選「Import from CSV」功能
image
設定參考下圖:
image
Fabrik 擴充套件的程式架構
由於 Joomla 採用 Model-View-Controller (MVC) 架構,Fabrik 套件也是以 MVC 架構來開發,因此程式架構很好理解,也很容易猜測如何修改。接下來記錄我小小調整 Fabrik 套件的 PHP 程式碼的作法,包括:
  • 修改 Fabrik 套件存檔時的 time_date 欄位,以儲存資料異動當下的完整時間 (原本僅記錄日期:yyyy-mm-dd 00:00:00)
  • 在資料存入 DB 之後,把異動的 log 也寫入 DB
MVC 架構:
8
修改 Fabrik 套件存檔時的 time_date 欄位,以儲存資料異動當下的完整時間
7  10
  • 修改檔案:
    [path/to/Joomla Dir]/components/com_fabrik/models/table.php
  • 新增 function getDateTime(),利用 php 內建的 getdate 函式取得目前時間,再調整為「yyyy-mm-dd hh:mm:ss」的格式。
  • 修改 function storeRow() <負責 Insert & Update>,在適當位置加入:$oRecord->time_date=$this->getDateTime();。
image
getDateTime() 函式的內容:
12
留下資料異動記錄 (Insert、Delete、Update)
  • MySQL 內建的 bin-log 無法區別不同的 Joomla 使用者,一律會記錄為 Joomla 用來登入 MySQL 的 user (通常為 root)
  • 利用 jos_fabrik_log 這個 fabrik 內建的 table 來儲存資料異動的 log:
欄位名稱 內容
id auto_increment 的流水號,作為 PK
timedate_created 每一筆資料的異動時間,採預設值即可(CURRENT_TIMESTAMP)
referring_url 用來儲存進行此操作的 username
(e.g., user1, user2)
message_type 用來儲存該 user 進行的操作
(i.e., INSERT, DELETE, UPDATE)
Message 該 user 執行的 SQL Statement
(重要:必須將「`」和「’」取代為空白)
  • 修改檔案:
    [path/to/Joomla Dir]/components/com_fabrik/models/table.php
  • 新增 function getUserName(),以取得目前登入的使用者名稱,參考 [path/to/Joomla Dir]/components/com_fabrik/models/formsession.php 中的 getUserId() function
  • 新增 function logDBOperation($SQL),取得 log 所需的資料,並存入 jos_fabrik_log。
  • 修改 storeRow <負責 Insert & Update>及 deleteRows <負責 Delete> 兩個 function,在適當位置加入:
    $this->logDBOperation 的呼叫。
成果(登入 phpMyAdmin 查看):
11
經過測試,批次匯入資料時也會留下每一筆資料的異動記錄。
getUserName() 函式的內容:
13
logDBOperation($SQL) 函式的內容:
14
設定 MySQL 排程定期備份
參考資料:MySQL備份 shell script
  • 修改以下程式,另存為 [path/to/Joomla Dir]/backup/backup.sh:
    • 設定 db_user、db_passwd 以及 db_host 變數
    • backup_dir=“[path/to/Joomla Dir]/backup“
    • # get all databases 以下的內容,改為僅備份 Joomla DB:
      $MYSQLDUMP -u $db_user -h $db_host -p$db_passwd [JoomlaDB] | $GZIP -9 > "$backup_dir/backup.0/$time.Joomla2.gz“
  • 設定 cron job 每月1日進行備份:
    • crontab -u root -e:
      0 0 1 * * sh [path/to/Joomla Dir]/backup/backup.sh
將 Joomla 從測試環境轉移到正式環境
在正式環境上最好是用 clean installation 比較保險,並且把網站名稱和 DB 名稱都設定成與測試環境相同,再用 phpMyAdmin 把資料匯出成 insert SQL,以免忘記修改到 DB 中的設定造成網站運作的異常。
其他待解問題
  • 先排序好A欄位,再排序B欄位,不要把A欄位的順序重排
  • 暫時提昇某個user的權限為可讀寫 (調整「存取」為「作者」無效)
  • Range filter 會清掉其他 filter 的設定值 (要設定兩次,多出一個Go button)
以上就是最近使用 Joomla 的一些心得分享,整理完畢之後,未來要查筆記就方便多啦 :D

本系列其他文章:

2010年5月15日

Windows 合併網卡實作 (以 Broadcom 網卡為例)

上週實作了三台 Windows 主機的合併網卡(active-standby mode,觀念可參考Wikipedia – Link aggregation, 在 Linux 上通常稱為 NIC Bonding,作法可參考Linux Bonding (合併網卡)實作),若利用 Windows 內建的網路橋接器(Bridge),無法正確實作 NIC Bonding (active-standby mode),必須使用網卡廠商提供的管理軟體來實作。以下紀錄以 Broadcom 網卡實作 active-standby mode 的步驟。
步驟一:安裝 Broadcom 提供的 Windows 管理工具 – Broadcom Advanced Control Suite (BACS),可從 Broadcom 官網下載。安裝完成後,可從命令列啟動:
image001
或者從開始功能表啟動:
image002
步驟二:點選功能表中的「Teams」-->「Create a Team」
image003
步驟三:選擇「ExpertMode」(專家模式),這個模式比較好用,若使用預設值,則兩張網路卡會是 Load Balancing 的組態,而不是 active-standby。
image004
步驟四:逐一設定以下項目
  • Team Name:也就是 Linux 的 Bonding DEVICE 名稱,按照慣例命名為Bond0
  • Team Type:也就是 Linux 的 Bonding Mode,設定為 Smart Load Balancing (TM) and Failover
  • Load Balance Members:也就是 Linux 的 Primary NIC—>Active 的網卡
  • Standby Member:顧名思義,就是 standby 的網卡
設定完成後的畫面如下:
image005
步驟五:點選視窗左下的「Update」按鈕,先不要按視窗右下角「Apply/Exit」按鈕(按了以後 NIC Bonding 就會生效,網路會斷掉)
image007
步驟六:抄下現有的網路橋接器(Bridge)上的 IP 設定,之後刪除網路橋接器(此時網路開始斷掉)
步驟七:回到 BACS,點選視窗右下角的「Apply/Exit」按鈕,BACS 會開始設定 NIC Bonding
image006
步驟八:此時在控制台的網路連線中,會出現 Bond0 這個 BASP Virtual Adapter
image008
步驟九:按照一般設定 Windows 網路卡的方式設定 IP、Netmask、Gateway、以及 DNS (在設定完成前網路都是斷掉的狀態)
image009
以上就是在 Windows 系統上以 Broadcom 網卡管理軟體-BACS 實作合併網卡的過程啦,其實蠻簡單的 :D
參考資料:

2010年5月5日

phpMyAdmin 匯出中文資料成 utf-8 編碼的 .csv 格式之注意事項

今天測試了從 phpMyAdmin 介面將 MySQL DB 中的中文資料匯出成 .csv 檔,原本想說既然中文資料可以正確以 utf-8 編碼存入 MySQL,在 phpMyAdmin 的網頁介面上也可以正常顯示,之前匯出成 .sql 檔也沒有亂碼問題,那匯出 .csv 這種純文字格式應該更沒有問題吧?誰知道匯出成功後用 Excel 打開卻是下面這個樣子:
phpMyAdmin_Export_Before_ExcelView
但是用 Notepad++ 這個超好用超強的免費軟體來看卻是正常的:
phpMyAdmin_Export_Before_Notepad  View
後來我發現,從 Notepad++ 中可以看出,phpMyAdmin 匯出的 utf-8 編碼文件是「檔首無BOM」的格式:
phpMyAdmin_Export_Before_Notepad  DefaultSetting
只要利用 Notepad++ 把整份文件重新編碼為 utf-8 格式後存檔:
phpMyAdmin_Export_Before_Notepad  NewSetting
再用 Excel 打開,就不會有亂碼問題了:
phpMyAdmin_Export_After_ExcelView
補充:phpMyAdmin 的 export 設定可參考下圖:
phpMyAdmin_Export
有勾選「將欄位名稱放在首行」,匯出的文件才會含有標題列,比較清楚易讀。

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D