2010年2月23日

[Shell Script] 如何擷取字串中的子字串

今天要分享的是,在 shell script 中擷取子字串 (俗稱 substring) 的技巧 (各程式語言都要提供的最基本功能)。

一開始在學 shell script 的時候,我看的是臥龍小三的網站 (News 裡面的 Shell 入門),按照順序看過一遍固然收穫很多,但也僅止於「快速入門」的程度,也就是「讓你不要害怕 shell script」的作用,其中對字串處理這種重要的功能並沒有整理的很詳細,因此我一開始連「取出某個字串的最後一個字元」這樣的功能都不知道如何下手,用 sedawk 都不太對。後來透過孤狗大神找到了幾種方法:

法一:Bash Shell Programming in Linux (搜尋 substring)

time=”20:06:16”
unit=${time:${#time}-1:${#time}} –> $time變數要寫三次!
這個寫法顯然相當之囉嗦,但是它是有效的。

法二:parsing a string in a shell script (透過 awk 來做)

time=”20:06:16”
unit=`echo $time | awk '{print substr($0, length($0), length($0))}'` –> 可用 $0 取代 $time,較簡潔


但整體看來還是非常囉嗦,我只是要取出一個字串的最後一個字元而已阿!

法三:臥龍小三-Linux Shell 程式設計實務 (Chapter 08: 8-4 使用外部程式 expr 做算數運算)

time=”20:06:16”
startPos=$(expr length $time)
unit=`expr substr $time $startPos 1` -> 注意 $time 要被包在“ “裡面


這章介紹的 expr 功能還蠻多的,有找子字串 index 和做 substring 等等功能,值得練習一下。這個作法雖然少了很多小括號,但感覺還是挺麻煩的,最後,終於讓我找到一個最簡單直覺的作法:

法四:一樣出自 parsing a string in a shell script (看這個留言)

time=”20:06:16”
unit=`echo $time | tail -c 2
–> 重點在 -c 這個參數,以及用 tail 的話 byte 數要多 +1 (取最後1個字元:2)

tail-c

一行搞定!而且非常的直覺!除了要取出特定字串以外,如果是要正取 (用 head)或倒取 (用 tail) 固定幾個字元的話,應該都會用 head/tail 來做吧!

以上就是今天的分享,如有更好的作法還請不吝賜教 ^^~

PS. 取出字串的最後一個字元,在 Perl 中也非常簡單:substr $time, -1,負號代表由字尾開始往前面取

WCG 網格計畫發表新專案:Discovering Dengue Drugs – Together – Phase 2 (第二階段)

前陣子 (2010.2.17) 收到 World Community Grid (WCG) 的信 (不知道 WCG 是什麼的朋友請看這篇介紹:WCG網格計畫),信中提到 Discovering Dengue Drugs (研製對抗登革熱、C型肝炎、西尼羅熱、黃熱病等等的藥物) 這個計畫要進入第二階段 (Phase 2) 了!(新聞全文請參考這裡)

這個專案事由 The University of Texas Medical Branch (UTMB)、The University of Chicago 兩所大學共同主持,計畫的詳細內容可參考這裡。在第二階段中的工作項目是以瀑布式 (waterfall) 的方式來組織,也就是說工作項目A的結果會產生工作項目B,而工作項目C的內容則是根據工作項目B的結果來決定。藉由如此的設計,研究人員期望可以節省大量的計算時間,以加速專案的進展。(基本上就是在進行B的時候,不用重新計算進行A的時候已經計算過的東東~)

為了提昇 WCG member 的參與感,很久之前 WCG 就設計了 Project Badge 的機制,Discovering Dengue Drugs – Together – Phase 2 的 Badge 長得像下面這樣:

dddt2_ffffff[1] (一隻蚊子加上一個數字 2,呃 …)

這已經是在 WCG 上 launch 的第 15 個專案啦,希望每個專案都可以順利的進行阿!

另外補充一篇科景 (Sciscapr.org) 的新聞:物理:網格運算未來將可進入家用電腦

2010年2月21日

利用 Joomla 做資產管理 (Asset Management) -1 : 安裝過程紀要 (Windows)

最近需要架設一個網站,來記錄機器設備的基本資料 (請參考 Wikipedia: Computer hardware configuration management 中的 Asset Management),重點在於把以往用 excel 記錄的資料 web 化、集中化,只維護一個版本,並且可以從任何有連網的裝置上存取,也就是說我們要做「雲端資產管理系統」,鏘鏘!(這樣對於誘騙上網找作業的學生本blog的SEO應該有幫助吧? :p)
經過整理,這個資產管理系統要滿足的需求如下 (根據我判斷的重要性排列):
  1. 免費!免費!免費!-> 找 Freeware / Open Source Software
  2. 簡單易用的web介面,支援 CRUD operation (增刪改查)
  3. 批次匯入現有資料
  4. 以選單的方式輸入資料
  5. 條件式的查詢、篩選資料
  6. 保留資料異動的 log
  7. 將資料放上雲端,以展示我們擁有先進的技術,就算電腦掛了也不怕資料不見 (喂! 不要再亂扯雲端了!)
由於最近接觸的都是 LAMP (Linux, Apache, MySQL, PHP) 平台,因此第一個需求不成問題。至於其他的需求,我想可以用擴充性高的 CMS (Content management system) 來完成,經過一天的survey,最後決定嘗試使用 Joomla 這套免費的架站軟體來完成,並且先在 Windows 平台上練習(因為安裝比較無腦容易)。
Joomla 是架構在 LAMP 之上的 (把 Linux 換成 Windows -> WAMP 也是可以,剛好 AMP 都有 Windows 版 ),在 Joomla!123 圖解架站教學網關於Joomla一文中列出Joomla幾個重要的特性:
  • 它的操作並不複雜,Joomla!是開發給大眾使用的
  • 它的授權是基於GNU/GPL授權規定,很容易安裝和管理,而且也很可靠
    –> Free!
  • 完整的資料庫導向網站引擎 –> CRUD!
  • 完全可以客製化的版面,包含了左、中間、右選單區塊 –> Customizability
  • 可在Linux、FreeBSD、MacOSX 伺服器、Solaris及AIX上執行
  • 客製的頁面模組。下載各式各樣的客製頁面模組可以豐富您的網站
    –> Extensibility!
於是我就決定採用 Joomla CMS 來實作這套資產管理系統啦!
首先我試圖在 Win XPP SP3 上分別依序手動安裝 Apache、MySQL 和 PHP,安裝 Apache 的過程很簡單,從 Apache Software Foundation 首頁右邊的 HTTP Server 下載穩定的 release 版本 2.2.14 安裝檔,執行後一路 Next 到結束即可。
安裝 PHP 就花掉我蠻多時間,我參考的是 PHP5 系統環境安裝 Windows XP + PHP + Apache (一),教學中用的是 PHP 5.2.0,我想 5.3.1 更新,應該更優(我承認我喜歡裝最新版的軟體 …Orz),所以從 PHP 官網下載了 5.3.1 版的安裝檔開始安裝,沒想到經過種種設定就是無法與 Apache 正確運作,在 5.3.1 版的安裝畫面中不會有教學中「Web Server Setup」的畫面:
php_5.2.1_choose_Apache_version
於是我參考了[設定] PHP 安裝之後 APACHE 之設定一文手動調整 Apache 設定檔 (httpd.conf),弄了半天還是無法成功,最後只好改裝 PHP 5.2.12 版,一裝好就可以正常運作了,不需要手動調整 httpd.conf,過程相當之無腦愉快阿!
安裝 MySQL 的時候我參考的是 MySQL 安裝教學,過程相當順利,從 MySQL 官網下載 MySQL Community Server 5.1.43 之後,按照教學就可以安裝完成。
在好不容易裝完 AMP 之後卻發現 Joomla 的安裝程式認為我的主機不支援 MySQL,這是很詭異的現象,我可以正常登入 MySQL 的 console,下 select version() 等指令都能傳回正確的結果,但 Joomla 還是認為我的主機不支援 MySQL,最後我只好放棄「手動逐一安裝 Apache、MySQl、PHP」的作法,採用更無腦的方式快速安裝完成!
我參考的是一個很不錯的 Joomla 教學網站:Joomla! 123 圖解架站教學網,在首頁就可以找到 Joomla 的安裝與教學:
Joomla123_installation_tutorial
其中有篇文章解釋得很詳盡:在自己電腦上安裝 Joomla! 1.5 與中文化,其中 Joomla 主程式可以直接在 Joomla!123 首頁下載打包好的 1.5.15繁體中文主程式,這樣就不需要另外安裝 Joomla 繁體中文語言檔了。按照教學中的步驟就可以很順利的將 Joomla 安裝完畢。
2010.02.25補充:在安裝Joomla! 1.5.x的時候,Joomla! 無法安裝預設範例資料解決方法,經過測試的確有效!
順帶一提,Joomla!123 網站的 HTTP 404 頁面還蠻有趣的:
Joomla123_Http404
AppServ (2.5.10 for Windows) 安裝完畢後,連到首頁可看到以下內容:
AppServ_2.5.10_for_windows_homepage
可看到 AppServ 包含以下軟體:
雖然這些軟體並非最新版,但由於安裝方便,所以就先暫時這麼用吧!
以上就是 Joomla 的介紹以及相關軟體的安裝過程紀要,下一篇就來看看如何利用 Joomla 內建的功能以及 Fabrik 這個好用的擴充套件來完成上述的六個需求!

2010-04-21 補充,本系列其他文章:

2010年2月19日

iPhone 使用心得

大約在去年(2009) 11月的時候我敗了一支 iPhone (16G 白),經過這幾個月,我發現 iPhone 真的非常好用,雖然網路上已經有很多人分享使用心得 (例如:李怡志-一個中年人的 iPhone 3GS 初體驗李怡志-很過份的 Amazon iPhone App 之 Remembers (記得要買) 等),但我還是堅持要紀錄一下我個人的使用心得!(握拳)

首先,iPhone 的手寫辨識超強的,例如我想要寫「樓」:

001 (12)

還有這個「餐」:

002 (3)

可以用手亂塗真的很「爽」:

006

精準的手寫辨識帶來的最大好處包括:

  • 不用怕把觸控筆弄丟,或者忘記帶觸控筆:你總不會忘記帶手指出門吧!
  • 老人家也可以輕易上手:只要練習一下如何切換中英文和注音輸入,5 分鐘內就可以學會如何發簡訊了 (對我媽來講很方便,對我來講就是 iPhone 常常會被搶走,很討厭)
  • iPhone多點觸控螢幕精準度非常高,參考MOTO Lab: Touchscreen 測試

接下來談談 browser,如果買了 iPhone 卻沒搭配上網吃到飽的費率,那就太浪費了,因此 browser 在行動上網的使用者體驗中扮演著非常重要的角色!iPhone 上的 Safari 非常清楚它所運行的環境是在手機上,而手機最重要的功能就是打電話,所以 Safari 會偵測網頁上純文字的電話號碼,並將其轉變為一個 hyperlink,如下圖:

1

點了以後就可以直接撥打電話,非常方便且直覺:

2

這功能實在太貼心、太直覺了,我認為在手機上運行的 browser 如果沒有這個功能,就不配稱為 mobile browser!

以上看了很多在 iPhone 上抓的圖,一開始我也不知道要怎樣抓出這麼漂亮的圖,後來發現 iPhone 內建的螢幕截圖功能是要這樣操作的:長按機身下方的Home button (不要按太久,不然會進入聲控模式-Voice Control),再按一下機身右上方的電源鈕,這樣就可以抓到整個螢幕啦,例如這個金色太極圖:

007

iPhone 上的 App 必須要對「iPhone 是單工的環境」這件事情有深刻的體認,在啟動內建的 App (如 Safari, Map) 之前,應該先提醒使用者這麼做將會關閉目前正在使用的 App (大部分 App 的狀態是不會保存的,內建的計算機、時鐘等除外),如舊版的 MobileRSS 就做的很好:

011 (2)

如此一來使用者就不會被強迫結束 MobileRSS,進入 Safari,讀完文章後又必須重新 MobileRSS,但此時 MobileRSS 並不會記住最後一次執行的狀態!對使用者說,這是非常不方便的,使用 App 的過程常常會被中斷。

MobileRSS 並不只滿足於此,在新板中更上一層樓,直接在 App 中就可以載入完整的網頁,使用者讀完網頁之後可以很順暢回到 MobileRSS 中,先前的狀態也不會消失。如果需要載入完整網頁才能閱讀完整內容的話,會看到這個向右的箭頭:

006

點了以後就會載入完整的網頁,按左上角的按鈕即可回到先前的畫面:

007

以上這些操作都在 MobileRSS 中完成,不需要另開 Safari,這就是我要大力推薦 MobileRSS 的原因!而且它是免費的!

前面講了這麼多好用的地方,接下來講一些缺點吧!我覺得 iPhone 3GS 內建的相機真的很弱,例如在晚上室外就呈現幾乎廢掉的狀態 (沒有閃光燈):

003 (5)

當然單工、不能換電池、上網時電力消耗很快都是很令人頭痛的地方,但相較於 iPhone 帶來的便利,我覺得還可以忍受。希望用在 iPad 的 A4 晶片真的像 Apple 宣稱的那樣省電、高效能,接下來就看年中 Apple 宣佈下一代 iPhone 的時候會不會用到 A4 晶片囉!

以上所提的都是 iPhone 的基本操作介面,iPhone 另一個改變了產業結構的創舉是 AppStore,在今年 (2010) 1 月的 iPad 發表會上 Apple 宣佈,App Store 上已經有超過 14萬個應用程式,總下載量也突破 30 億次,而這一切都在 Apple 推出第一代 iPhone 的短短 18 個月內達成!下一篇文章我會準備整理我覺得很實用的 App,希望對大家能有些幫助!

2010.02.19 3:00 PM 補充:微軟下一代的手機 OS 平台 - Windos Phone 7 Series 也支援將網頁中的電話及地址轉變為超連結,請參考Channel9:First Look: Windows Phone 7 Series Hands on Demo

2010年2月17日

Regular Expression (Regex, Regexp) 心得-1: 如何過濾符合樣式 (pattern) 的資料 (shell command: grep –v / egrep -v)

最近花了一些時間研究 Regular Expression,有種相見恨晚的感覺,花時間投資學習這個工具的報酬率真的非常高,因為各種OS平台(Windows, Unix/Linux, Solaris, …)、各種程式語言(shell script, Perl, JavaScript, C#, …)都有支援,應用層面非常廣,只要學一次,到處都可以應用,真的是非常划算阿!

這次學 Regular Expression 我是看朝陽科技大學洪朝貴教授的講義:一輩子受用的Regular Expressions:兼談另類的電腦學習態度,非常值得反復研讀(會用到Linux & Perl),特別是講義裡面連到的另一篇文章:如何有效學習電腦 (Aug 2001 重新整理),更是值得細讀、好好思考。以下節錄幾段我覺得寫的很棒的:

學習高組合性軟體還有另外一個優點。 資訊科技進步迅速, 而資訊市場更是變化驚人, 我們很難預測那些軟硬體未來會有較佳的就業市場。 學一套多功能聚集於一身但與他人溝通不良的「萬能」軟體, 就像是把所有的雞蛋放在同一個籃子裡一樣危險。


附帶而來的好處, 就是 學習組合軟體, 知識的壽命長, 經驗可以累積。


能夠拿來與其他知識組合運用的知識, 才是投資報酬率高, 生命週期長的知識。 眼光放遠, 慎選所學軟體, 培養組合能力, 讓你的新知識與舊知識發揮相乘的效果, 讓生產力曲線成指數成長! (感謝 GNU 文件的啟發, 本文觀念來自 info -f textutils "Opening the software toolbox" 一節; 也請參考我的 linux 講義當中 「組合的力量」 當中的具體操作實例.)


另外舉一個例子,最近在黑暗大的blog看到一篇:MEMO- 用Javascript RegExp將<x>置換成<span class='x'>,也是一個很實用的例子,在 coding 時當然可以依賴 IDE 提供的搜尋/取代功能,但如果利用程式直接修改 memory 的資料,或者要處理從DB中撈出來的資料,最省時省力的方法還是 RegExp!

(附帶一提,如果只是要把 <c> 換成 <span>, 程式只要以下兩行即可:
var regex = /[<](\/?)c\d>/g;
s = s.replace(regex, "<$1span>");
不用拆成兩段!就算用IDE的搜尋/取代功能也無法一次到位阿!)

ok, 以上的廣告好文推薦時間結束之後,接下來進入本日主題:如何把符合樣式 (pattern) 的樣式過濾掉,只顯示「不符合」樣式的資料?

通常學 RegExp 都在探討怎樣從一堆資料中找出「符合」樣式的字串,很少有資料講到如何顯示「不符合」樣式的資料!但是有時候其實很多資料都是雜訊(例如information log),沒有先過濾掉的話,很容易漏掉真正重要的資料,那麼要怎樣把「符合」樣式的資料過濾掉呢?

經過一段時間的摸索,我發現在 Linux / Unix 裡面,有個非常好用的 shell command: grep,只要加上 -v 這個 switch 就可以達到這樣的效果!-v 的作用如下:
-v, --invert match
Invert the sense of matching, to select non-matching lines.



所以我只要下這個command,就可以過濾掉含有「cat」的資料了:
cat /var/log/messages | grep –v cat


接下來的問題是,如果要過濾多個條件怎麼辦?例如我要過濾掉「有出現 cat 或 dog 或 bat 的資料」,要怎麼做呢?最直覺的想法就是利用 pipe (管線命令) 的功能,一層一層的過濾,指令大概會長的像下面這樣:

cat /var/log/messages | grep –v cat | grep –v dog | grep –v bat


這樣的命令當然很好懂,但同時也很冗長!

再經過一陣摸索之後,我發現可以用 egrep 來解決這個問題,如正規表示式的入門與應用(三)文中所說的 (這篇文章是在 Google 搜尋「egrep」的第一名),利用 egrep 所支援的「|」(邏輯 or) 關鍵字可將指令簡化,簡化後的指令如下:

cat /var/log/messages | egrep –v ‘cat|dog|bat’


這樣是不是簡潔很多呢!要特別注意的是,「|」的前後不能多出空白,否則那些條件會僅剩下最後一個有效喔!(不要加上 -v 的話就是直接列出有 cat 或有 dog 或有 bat 的資料)


以上是 Regular Expression 的好文推薦 + grep / egrep 實例演練,之後會持續整理實務上有應用到的 Regexp 實例,敬請拭目以待 :D

2010年2月11日

feedly - 直覺的重新命名 Google Reader 訂閱資料夾

前陣子陸續看到身邊的朋友和知名部落客推薦一款介面清爽好用的 RSS Reader – feedly (官網-feedly: a magazine-like start page),由於我每天的生活都離不開 Google Reader,於是就嘗試了一下 feedly 這個工具,我覺得最實用的功能有兩個:
  • 以拖拉 (drag-and-drop) 的方式重新安排訂閱項目:例如把某個 blog 從資料夾A移到資料夾B,在 Google Reader 裡面要做兩次設定才能完成 (把它加入資料夾B、把它從資料夾A中移除)。用拖拉的方式相當的直覺,用起來也很愉快。
  • 重新命名Google Reader的資料夾名稱:這功能必須大大的推薦一下!之前保哥寫過一篇:在 Google Reader 中如何修改管理訂閱的資料夾名稱,在無計可施的情況下當然是很感謝保哥整理出一個完整的作法,但是實際運用起來還是相當的累人,透過 feedly 的介面就不用煩惱了,直接 rename 就好!
以下是這兩個功能的操作介面:
1.打開 feeedly 介面之後,右上角有個向下的箭頭,點下去就會展開以下的功能列表:
Feedly_ReorganizeSourcesOption
feedly_organize sources_FF
(在 Firefox 上看到的介面正常多了,前一張圖不知道怎麼抓的…||)
2.點選「organize sources」之後,會看到以下畫面,可以重新安排訂閱項目,也可以重新命名資料夾:
feedly_Rename_Category
點選每個category (也就是 Google Reader 中的資料夾)右邊的鉛筆圖示,就可以直接 rename 資料夾啦!(註:Google Reader的畫面要重新refresh才看的到)
feedly_Organize Sources
如果點選每個source名稱右邊的鉛筆圖示,則可以重新命名該訂閱項目。
3.想要把一個訂閱項目從一個資料夾移到另一個資料夾?沒問題,例如91哥2010年榮升MVP,於是我就直接以拖拉的方式,把他的點部落blog移到「Microsoft MVP’s Blogs」這個我會優先讀完的資料夾中:
Feedly_ReorganizeSources
這真的是太方便啦!(註:Google Reader的畫面要重新refresh才看的到)
除了以上兩點功能以外,feedly 清爽的閱讀介面也廣受好評,不過由於我也蠻常在 iPhone 上閱讀 RSS (順便推一下 MobileRSS, 超好用阿!比 Google Reader mobile 版還讚),所以我還是比較習慣 Google Reader 的介面。
另外在MMDays的文章中也提到:「只要feedly把舊文的問題解決,我相信很多人就無後顧之憂的直奔feedly的懷抱了」,也就是一篇文章讀完以後,在 feedly 裡面一律會依閱讀的先後順序被歸類到「history」這個 category 裡面,某種程度上來說破壞了一個 blog 文章的前後連貫性,沒辦法一次列出某個 blog 的已讀文章~
我想如果舊文的問題解決,那我可能會轉換成「在手機上用 MobileRSS,在 PC 上用 feedly」的閱讀方式了吧!
對於如何設定feedly網路上已經有很多好文章,有興趣的朋友請參考以下資料:
後記:這篇文章的草稿寫好沒幾天,Google 就推出了 Google Buzz 這個服務 (點這裡看電腦玩物的介紹文),看來 feedly 下個版本也要想辦法支援一下囉 :p

更新:在 2010.06 Google Reader 終於推出 rename folder 功能,詳細說明請參考電腦玩物-可喜可賀!Google閱讀器終於加入資料夾、標記更名功能

2010年2月9日

World Community Grid – Facebook Integration

在 2010.01.09 的時候收到 World Community Grid (WCG) 的來信 (不知道 WCG 是什麼的朋友請看這篇介紹:WCG網格計畫),信中提到,在 2009 年這一年中,WCG 共增加了超過 71,000 名志願者,總計貢獻了超過 97,000 年的 computing power! 有了這些生力軍的加入,在 2009 年中共完成以下三個 project 的第一階段:
以上三個 project 在 2010 年都會進入第二階段,同時也會啟動新的 project。除此之外,由於社群網路的全球性熱潮,WCG 也推出一個 Facebook AP,首頁長這樣:

WCG_On_FB

這個 AP 提供了以下功能:
FB_WCG_Tab

另外補充一點,從去年中我開始用Win7 beta以後,WCG Client (BOINC Manager) 就無法正確運作,可以打開執行,但是永遠抓不到 task,開啟來也是在那邊發呆,所以後來就一直放著不管它。一直到前陣子測試,在 Win7 RTM (6.1.7600, x64) 上搭配 6.2.28 版的 client 就可以正確運作,所以現在我的 CPU 除了在我種田的時候以外再也沒機會吃閒飯啦!

BOINC_Manager_Version

以下是目前WCG 的統計數字(2010/2/8):
項目 全球 台灣
Member 數 498,007 2,542
Total Run Time 316,920 uears 3861 years

看來台灣區的member還蠻少的,希望未來可以越來越多,讓WCG計畫可以順利的持續運作下去,雖然 IBM 的東西很貴,但是他們願意支持這樣有意義的計畫,真的是很不錯阿!

2010年2月7日

[Excel VBA] 將重複的機械化工作自動化-自製「Mark Answers as Black」、「Mark Answers as White」按鈕

今天分享一下最近用 excel VBA 做的小功能,在整理題庫的時候發現,想要把原本有題目&解答的word檔拆成兩份,一份仍然維持原本的格式,有題目&解答:

Q_And_A

另一份只要有題目就好:

Only_Q

這樣在練習解題的時候可以看第二份檔案,要查答案再看第一份檔案,那麼問題就來了:這份題庫一共有 15 章,每章有 60~80 題不等,總題數大約超過 1000 題!要怎樣在短時間內輕鬆的做出第二份檔案呢?

我想到幾個方法:

  1. 手動用滑鼠反白選取「Answer:」那行文字,然後用滑鼠點選文字顏色的設定,設成白色 –> 真的要這樣幹的話,大概直接點到中風比較快?!
  2. 手動用滑鼠移到「Answer:」那行文字之前,然後用「shift+end」選取整行文字,把顏色設成白色,之後再把滑鼠移到下一行「Answer:」文字之前,按F4重複上述設定顏色為白色的動作 –> 嗯,有用到 F4 來啟動 word 自動錄下的 macro,稍微有點進步,但是很不幸的,這份題庫的總題數大約超過 1000 題!所以還是放棄!
  3. 改進第二個作法,設法讓「再把滑鼠移到下一行「Answer:」文字之前,按F4重複上述設定顏色為白色的動作」可以自動化的對整份文件的內容執行,最好是可以按一個鍵就把整份文件的格式調整好,那麼就愉快了!

經過一番嘗試,完整的程式碼如下 (範例 word 檔可至這裡下載):

VBA_Code

最後的成果,左邊是有答案的版本,右邊只剩下題目,超過1000題只花了我10分鐘左右:

MIS_Answers

要實作這樣的功能並不困難,可歸納為以下幾個步驟:

  1. 先觀察一下要做的事情,如果是不斷重複的機械化動作,就要想到:應該可以用 excel 內建的 function / VBA 來完成
  2. 整理出一個可重複執行的流程 (如上述第二點),以程式的觀點來看就是每次跑迴圈時要執行的動作
  3. 以錄製巨集 (macro) 的方式,錄下手動操作一次該流程所產生的程式碼
  4. (視情況) 清掉錄到的程式碼中沒有用的東西 (可能是不小心手殘多按到無關的功能等等)
  5. 在這段程式碼之外加上一個迴圈
  6. test、test、test
  7. 加上註解,讓下次有需要使用的時候可以快速回憶

follow以上的流程,就可以大大簡化繁瑣的重複性工作,節省可觀的時間,心情也會比較好!聽說日本的上班族很會用 excel 的 function /VBA 來簡化例行性的工作,與大家共勉之 :p

補充:設定讓 Developer (開發人員) Ribbon 永遠顯示在工具列 (以 Word 2010 為例)

在 File –> Options 中,勾選 Developer:

Word2010_Options_DeveloperRibbon

在 Developer 這個 ribbon 內就可以編修、錄製 macro 囉:

Word2010_DeveloperRibbon

回頭爬了一下 blog 上面的文章,上一次寫跟 VBA 有關的文章居然已經是快要一年半之前了 (第一次認真寫 VBA - -> Report Generator),真是時光飛逝阿!

2010年2月6日

[Tips] 一些 CodeSnippets 的用法

最近坎尼看了些 Microsoft 提供的教學影片
發現了一些好用的 code snippets
於是上 MSDN 查了一下用法,順便分享一下心得 :)

I. 前言

以前坎尼在用 Intellisense 的時候,常會跳出些奇怪的字詞 ex. ctor, prop
當時也沒深入研究,想說應該是就是一些沒用過的關鍵字吧

最近剛好在看一些影片,講師很神奇的建立了一些 method 及 屬性
坎尼一恍神不知道發生什麼事,只好使出倒轉,定格,放大再放大大法
總算是發現了講師用的小技巧:Code Snippet

II. 縮寫字 Code Snippets

下面來就介紹一些縮寫字的 Code Snippets

(i) ctor = Constructor
只要鍵入 ctor,並按下 tab 鍵,visual studio 就會直接產生該 class 的建構式
csnp01 csnp02

(ii) ~ = 解構式鍵入 ~,再按下 tab 鍵
csnp03 csnp04
(iii) cw = Console.WriteLine,cw+tab鍵,寫 Console 時要輸出文字很方便 :)
csnp05 csnp06
(iv) mbox = MessageBox.Showmbox + tab 鍵
坎尼以前最討厭就是 key in MessageBox.Show 這個語法 (又臭又長....)
現在可以用 CodeSnippet 快速解決囉 :)
csnp07 csnp08
(v) prop = property 產生 property 的語法,坎尼覺得很實用!!!  (嗯,真的沒抓圖

III. 小結

使用快捷語法可以加速自己的開發
若是覺得用起來不礙手,坎尼建議可以背一下 CodeSnippet
(更多的 CodeSnippets 可以參考附錄的網址)

但也不要忘了原本的語法,省的哪天 Visual Studio 不能用就麻煩了 XD

參考網址:MSDN Default Code Snippets

Google Spreadsheet 裡用規則運算式

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