2010年5月31日

[ASPNET] 在 Gridview 中繫結 bool 欄位

一般來說,在 Gridview 中要繫結 bool 的欄位
可以用 Gridview 原生自身提供的 CheckBoxField (如下圖)
bC00但如果要讓 CheckBox 和使用者互動,多半會用 TemplateField 來客製
本篇即是介紹如何將 bool 欄位繫結到 CheckBox 控制項Checked 屬性 

I. 準備事項

首先要確定資料欄位的型別需為 boolean
否則在繫結 Checked 屬性時,會丟出格式不符的例外
bC01範例中是用自己建立的虛擬 Table 來模擬 DataBase 的資料
各位在實作時,可直接使用 DB 來練習

另外在圖中可以看到,坎尼用 0 和 1 來輸入 boolean 資料
CSharp 裡的確可以接受這樣的語法 (印象中 VB 也是?)

II. 實作

CheckBoxField 繫結 boolean 欄位,只需給予 DataField 即可
 
但以 TemplateField 加入的 CheckBox 控制項,則是要自行加入 Binding 語法:
Checked='<%#Eval("boolean 欄位")%>'
bC02 執行畫面
bC03 
可以再加上全選的 CheckBox 在標題列,及儲存變更的按鈕
就完成可和使用者互動的 CheckBox 欄位

III. 小結

坎尼好久沒動筆,文句都有些生疏,請多見諒 ^^

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日

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

五月初上了一堂跟雲端運算有關的課,重點是虛擬化技術在雲端運算中扮演的重要角色。這次的講師是胡嘉璽老師(參考資料-12),不像一般常見的討論著重在如何將 Cloud ComputingUtility ComputingGrid 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
參考資料:

Google Spreadsheet 裡用規則運算式

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