2013年9月28日 星期六

HTML5 畫布 Canvas 測試

今天陪姐姐全民英檢複試, 地點在樹德家商, 可能是分很多場的關係, 感覺不像初試那麼多人. 複試第一場是對答, 第二場是作文, 一直到 12:30 才結束. 時間很長, 我就帶了幾本 HTML5 的書去看, 打算好好地測試一番. HTML5 的書我看了好幾本, 但都是像看小說那樣, 沒有動手做根本就是隔靴抓癢, 很快就會忘光光.
今天主要是複習 Canvas 部分, 所以就先來測試畫布功能. 書上講 Canvas 是 HTML5 標準中很早公佈的草案, 所以算是 "創黨元老" 之一, 源自於 Apple 公司的 David Hyatt 所提出的 HTML 延伸功能, 2004 年獲得 WHATWG 組織採納.
Canvas 標籤範例如下 :

<canvas id=canvas1 width=300 height=200>您的瀏覽器不支援畫布功能</canvas>

這裡要特別注意 :
  1. Canvas 一定要有關閉標籤 </canvas>
  2. Canvas 的寬度 width 與高度 height 若未指定, 其預設值為 width=300, height=150. 
  3. <canvas> 與 </canvas> 之間的內容為保留給不支援 canvas 時之替代內容, 若瀏覽器有支援就不會顯示, 沒支援才會顯示.
  4. 一個網頁中可以有多個 canvas 元素, 以不同的 id 識別. 只有 canvas 標籤沒辦法繪圖, 那只是個容器, 在畫布上繪圖其實是靠 Javascript, 通常是利用 id 來取得 canvas 物件 (用 document 物件的 getElementById), 故每一個 canvas 元素都要給予一個 id.
  5. Canvas 元素預設無邊框與背景樣式, 因此在網頁中是不可見的, 無法顯現其區域, 必須利用 CSS 來設定其 border (邊框) 或 background-color (背景色) 樣式, 例如 :
    canvas {border: 1px solid black;} 或
    canvas {background-color: grey;}
在測試 HTML5 功能時, 為了單純起見, 我想暫時忘了 jQuery, 但又戒不掉好用的工廠函式 $ (是太愛錢了吧?), 同時為了將來 "沒有 jQuery 的 HTML5" 做好準備 (如果跟 "沒有江宜樺的行政院" 與 "沒有馬英九的總統府" 雷同, 那就是純屬雷同), 所以自製了幾個小函式來取代那又臭又長的 document.getElement(s)ByXXX :

function $i(id) {return document.getElementById(id);}
function $n(id) {return document.getElementsByName(name);}
function $c(id) {return document.getElementsByClass(className);}
function $t(id) {return document.getElementsByClass(tagName);}

這裡在 $ 後面多加一個字元, 目的是保留跟 jQuery 混合使用的機會, 不會跟 jQuery 的名稱空間相衝突. 因為最近使用 jQuery 的 .val() 與 .text() 操作 textarea 元素內容時發現有跳行問題, 但使用 Javascript 原生的 .value 去設定卻沒問題, 詳細原因待查 (但願是我眼花), 總之人生在世還真的不能忘本啊.

首先我們來測試一下 canvas 的屬性與樣式 :

測試範例 1 : http://tony1966.16mb.com/html5test/canvas_1.htm [看原始碼]

在範例一中, 我們放置了一個無預設尺寸的畫布, 後面跟了五個按鈕, 分別用來顯示其尺寸, 設定其邊框與背景色樣式, 以及變更其尺寸. 同時我們也給畫布本身安了個 click 事件, 只要在畫布上點一下, 畫布就回復到其預設值 (300x150, 無邊框與背景樣式). 
程式處理部份請看原始碼, 欲操作畫布, 必須取得畫布物件 :

var canvas=$i("canvas1");  或者 
var canvas=document.getElementById("canvas1"); 

要取得畫布的尺寸屬性就用 canvas.width 與 canvas.height. 尺寸也可以使用 CSS 的 width 與 height 來設定, 
所以比較完整一點的 canvas 容器可以這麼寫 :

<canvas id=canvas1 width=300 height=200 style="border: 1px solid black;">
您的瀏覽器不支援畫布功能
</canvas>

或者是連尺寸也用 CSS 來設定 :

<canvas id=canvas1 style="width:400px; height:400px; border:1px solid blue;">
您的瀏覽器不支援畫布功能
</canvas>

接下來我們要開始在畫布上繪圖. 前面說了, 一個 canvas 元素只是個容器, 自己不會畫圖, 要在畫布上繪圖必須透過 Javascript 操控 canvas 內建的 Context 物件, 這個物件提供了繪製線條, 弧形, 文字等方法, Context 物件相當於是 canvas 裡面的一個繪圖程序 (Process), 而取得此物件的方式是呼叫 canvas 物件的 getContext() 方法, 傳入一個文字參數 "2d" :

var ctx=canvas.getContext("2d");

注意, 這 "2d" 一定要小寫 (記得 Javascript 很現實, 會分大小眼), 如果傳 "2D" 進去看看, 它也不會說語法有錯 (畢竟這只是參數, HTML5 的 3d 標準還在制定中呢).

ADT Bundle for Windows

昨天從彌陀公園分館借了這本 "HTML5 輕鬆開發 iPhone/iPad 軟體", 裡面提到 Phonegap 可以把 HTML5 應用程式轉成 iOS/Android 上執行的原生程式. Phonegap 可以在 Eclipse 裡執行, 我對 Android 比較有興趣, 但一想到 Eclipse 就頭大, 因為檔案大還 OK, 要載入各版本 Android SDK 就要花很久時間, 我從 Eclipse 3.4 開始玩 Eclipse+ADT 到 3.6 版, 每次都要一整個晚上來搞. 昨晚在 "PhoneGap Android版的Eclipse开发环境搭建" 看到 ADT Bundle 的介紹, 才知原來有人為 Android 開發打包好整個工具, 還真不錯. 可以到下列網站下載, Windows 有分 32 位元與 64 位元的  :

ADT Bundle:http://developer.android.com/sdk
PhoneGap:http://phonegap.com/download

解壓縮後, 到 Eclipse 目錄下執行 eclipse.exe, 結果出現 "failed to create the java virtual machine" 訊息, 找到 "藏經閣" 網站說明, 原來只要刪掉 Eclipse 目錄下的 eclipse.ini 檔就可以正常啟動了. 但啟動後又出現 "Failed to parse the output of 'adb version'" 訊息, 這個網站說是環境變數的關係. Stack overflow 有具體說明.

# 旗標 : 如何安裝 Android 的開發工具

2013年9月27日 星期五

表格的 CSS 樣式

我對 CSS 還不是很熟, 所以要用它來排版面還早, 所以習慣仍然使用表格來排版比較快. 但在 HTML5 時代還是要改用 CSS 比較正統. 例如下列排版用 table 要如何改成 CSS 呢 ?

<table border="0" cellspacing="3" cellpadding="2" width="100%">

相對的 CSS 如下 :


  1. border=0 改用 border-width:0px;
  2. cellspacing=3 改用 border-spacing:2px;
  3. cellpadding=2 改在 td 元素設定 padding:2px;
  4. width=100% 改用 width:100%;


table {border-width:0px;width:100%;border-spacing:2px;}
td {padding:3px;}

2013年9月26日 星期四

另外兩個不孝

近午時, 左營阿姨打電話給我, 說前日與山友閒聊, 談到古語 "不孝有三無後為大", 那麼另外兩個不孝是甚麼? 這下可問倒我了, 從來沒想過這問題, 那山友還真 "閒".
馬上查網路, 有了, 根據蔡志忠動畫網站介紹, 原來 "不孝有三無後為大" 出自孟子, 所謂三不孝是指 :
  1. 不娶無子,絕先祖祀。(未娶妻生子, 使祖先斷絕後嗣)
  2. 阿諛曲從,陷親不義。(一味遵從父母, 即使有錯也不勸諫, 致陷其於不義)
  3. 家貧親老,不為祿仕。(家庭貧窮, 父母年邁, 卻不肯出仕賺取俸祿奉養父母)
後面這兩個就是阿姨要的答案啦.

2013年9月23日 星期一

從用戶端本機網頁觸發執行 WSH 的方法

這次 AutoIt 自動化執行程式在 win7 不知何故 (相容性?) 無法執行, 無暇研究此問題, 只好另闢蹊徑, 改用 HTML 網頁當 GUI 介面, 利用網頁中的按鈕來執行 WSH 自動執行程式. 作法以自動連上批踢踢實業坊為例, 簡要說明如下. 首先撰寫一個 Javascript 為基礎的 WSH 自動執行程式 run.js :

Telnet 到 ptt.cc 的 WSH

var shell=WScript.CreateObject("Wscript.Shell");
var result=shell.Run("telnet.exe",1);
WScript.Sleep(1000);
shell.SendKeys("open ptt.cc{Enter}");

然後寫一個網頁 index.htm 如下 :

觸發 WSH 的網頁介面

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">  
  <title></title>
</head>
<body>
  <input type="button" value="前往批踢踢" onclick="executeJS('run.js')">
  <script>
    function executeJS(file) {
         var shell=new ActiveXObject("WScript.Shell");
        var folder=get_folder(); //傳回雙左斜線格式
        folder=folder.replace(/\\\\/g,"\\"); //改為單左斜線
        shell.CurrentDirectory=folder; //設定為目前目錄
         shell.Run(file); //執行 WHS 程式
        shell=null;
         }
    function get_folder() { 
        //傳回網頁在本機中的真實路徑,例如 D:\\project\\robot\\
        var browser=window.navigator.appName;
        var b_version=window.navigator.appVersion;
        var version=b_version.split(";"); 
        var trim_Version=version[1].replace(/[ ]/g,""); 
        var sys_path=unescape(window.location.pathname);
        var pos=sys_path.lastIndexOf("\/"); 
        var path=sys_path.substring(1,pos+1); 
        var path_arr=path.split("\/"); 
        var folder=path_arr.join("\\\\");
        return folder;
        }
  </script>
</body>
</html>   

把這兩個檔案都存在磁碟中, 然後以 IE 開啟 index.htm 檔 (注意, 必須用 IE, 因為這裡用到 ActiveX 技術), 就會看到一個 "前往批踢踢" 的按鈕, 按下它就會執行 run.js, 而此 WSH 程式的作用是打開命令提示字元, 執行 telnet.exe 程式, 連線到批踢踢. 若是在 WIN7 以上系統, 要注意 telnet 服務預設沒有打開, 請參照 "Windows 7 使用 Telnet 連上 PTT" 這篇說明先打開 telnet. 還有若連上 ptt 後顯示亂碼, 那就是命令提示字元視窗的預設編碼問題, 請改為 950 (Big5) 即可.


Textarea 裡面有 "00" 導致顯示內容中斷問題

下午在演示新版機器人程式時, 發現機器吐出的 log 竟然沒有全部顯示在 textarea 裡面, 從中間斷掉了, 原先還以為指令運行錯誤, 檢查後發現原始 log 內容完整, 為什麼用 FileSystemObject 讀取後竟然只顯示一半在 textarea 中呢? 於是我把讀取進來的 log 檔案內容反手寫出去, 嘿嘿, 規髒呵呵 (完整無缺啦), 足證問題出在 textarea 跟內容裡的某些東西 "相剋" 所致.



我用 HxD Hexeditor 載入 log 檔, 找尋內容斷裂點, 發現斷裂位置是在跳行前出現的 "00" 這個 byte (如上圖中的 00 0D 0A 序列, 其中 0D 0A 分別是 CR LF 回車與換行字元), 這是 non-ASCII 編碼, 難怪用 EditPlus 開啟時會問要用何種編碼開啟, 試到最後只有 Western European 可以, 就是這個奇怪的 "00" 造成的, 而且整個 log 檔裡只出現一次. 該怎麼清掉這壞東西, 好讓 log 內容完整顯現呢? 很簡單, 先用 escape 轉成 Latin1 碼, 再用正規表示法的 replace 把 幹掉, 最後用 unescape 轉回 ASCII 碼即可 :

var log=read_file("20130923.log");  //用 FSO 檔案函式庫讀取 log 檔
log=unescape(escape(log).replace(//g, ""));  //把 "00" 碼清掉

2013年9月22日 星期日

HTML5 範本

昨天終於把網頁版機器人設定程式寫完, 這次因為公司電腦都要升級 WIN7, 所以大膽改用 HTML5 來寫. 趁這機會把 HTML5 做個大整理, 準備好好測試一番.
首先要準備 HTML5 手寫範本, HTML5 為了解決用一堆外掛的亂象, 決定一統江湖, 所以它的範本很乾淨, 沒什麼雜七雜八的東西, 不像 HTML4.01 跟 XHTML1.0 囉哩八嗦一大堆. 其格式規範整理如下 :

  1. 要宣告 DOCTYPE :
    第一行一定是 $lt;!DOCTYPE html> (大小寫不拘)
  2. 要存檔為 utf-8 格式 :
    除了 head 內要宣告 $lt;meta charset="utf-8"> 外, 不管用哪一種編輯器, 存檔時一定要選擇 utf-8 格式.
  3. 預設使用 CSS3 與 Javascript :
    因此使用 <style> 定義樣式或用 <link> 匯入外部樣式檔時都不用再宣告 type="text/css"; 同樣地, 使用 Javascript 時也不用再宣告 type="text/javascript"
  4. 屬性值如果沒有空格, 雙引號, 單引號, 小於符號, 右斜線, 等於符號, 那麼就不需要用引號括起來, 例如 :
    <img src=logo.jpg>

更妙的的是, 它甚至可以不用 head, body, html 這三個標籤, 所以最小的 HTML 範本如下 :

最小的 HTML5 範本

<!DOCTYPE html>
<meta charset=utf-8>
<title></title>
<script src=myjs.js></script>

不過實際上, 為了向下相容 HTML4, 我們通常還是保留 head, body, html 架構 (特別是 IE 8 以下一定要有 body 元素) :

與 HTML4 相容的範本

<!DOCTYPE html>
<html lang="zh-tw">
<head>
  <title></title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
</head>
<body>
  <script type="text/javascript">
  </script>
</body>
</html>

還有為了跟那個不成材的 IE 妥協, 替它擦屁股, 補上它不認識的新標籤, 得從 Google CDN 匯入 html5shiv 函式如下, 這樣在包含 IE8 以下的微軟瀏覽器才能大致 OK :

從 Google CDN 匯入 html5shiv 的範本

<!DOCTYPE html>
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<html>
<head>
  <meta charset="utf-8">  
  <title></title>
  <style>
    article,aside,figure,figcaption,footer,header,hgroup,menu,nav,section {display:block;}
  </style>
</head>
<body>
  <script>
  </script>
</body>
</html>

經我在家中 WIN8 電腦測試, 微軟 IE10 已經幡然醒悟, 連 BORDER-RADIUS 也支援了, 浪子回頭金不換啊! (但已白了少年頭, 市場早已被 Chrome 與 Firefox 奪去).

雖然 HTML5 強調向下相容, 但是某些標籤被認為已不合時宜而遭廢除, 在撰寫 HTML5 文件時要注意不可再使用下列這些標籤 :

 廢除的標籤 功能
 acronym 指定首字母
 applet 指定 Java Applet
 basefont 指定基本文字尺寸
 big 文字大一號顯示
 center 置中對齊
 dir 指定目錄清單
 font 指定字型
 frame 指定框架內容
 frameset 構成框架
 isindex 文字框的建立
 noframes 指定無框架支援的替代內容
 strike 顯示刪除線
 tt 以等寬文字顯示





2013年9月16日 星期一

如何用 jQuery 操作核取方塊 checkbox?

這幾天忙著把執行公部門任務的視窗程式改為網頁版, 使用 jQuery UI 做介面, 但一段時間沒玩 jQuery 了, 有些遺忘, 趁著複習之便寫一下 memo, 下次要用時速查即得也. 今天進度之一是要讀取一組 checkbox 的核取狀態, 判別哪些項目被選取了, 作為後續處理之依據, 例如使用者選取了機器一, 那麼後續就只對機器一下命令, 若同時選取了機器一與機器二, 那就依序對兩台機器下命令. 為了方便說明, 下面以水果為例 :
網頁部份 :

  <p>你最喜歡吃的水果是 :</p>
  <input type="checkbox" id="watermelon" name="fruit" value="西瓜">
  <label for="watermelon">西瓜</label>
  <input type="checkbox" id="banana" name="fruit" value="香蕉">
  <label for="banana">香蕉</label>
  <input type="checkbox" id="pineapple" name="fruit" value="鳳梨">
  <label for="pineapple">鳳梨</label>
  <input type="checkbox" id="apple" name="fruit" value="蘋果">
  <label for="apple">蘋果</label>
  <input type="button" id="ok" value="確定">
  <div id="msgbox" title="訊息"></div>

jQuery 部分 :

粗體字部分就是重點, 我們用 each 函式遍歷每一個 checkbox 元素, 判斷其狀態是否為被選取 (checked), 是的話就放入陣列中.

      $("#ok").click(function() {
        var fruit=new Array();
        $("[name=fruit]:checkbox").each(function() {
          if (this.checked) {fruit.push(this.value);}
          });
        if (fruit.length==0) {
            $("#msgbox").html("不吃水果容易便秘喲!");
            $("#msgbox").dialog("open");    
            }
        else {
            $("#msgbox").html("你喜歡吃的水果:" + fruit.join());
            $("#msgbox").dialog("open");
            }
        });

測試範例 1 : http://mybidrobot.allalla.com/jquerytest/checkbox_1.htm [看原始碼]

其實核取方塊也可以用 jQueryUI 的 buttonset() 方法改變為按鈕群組, 這時在 checkbox 外面要用一個 div 或 span 元素包起來 :

<div id="fruits">
    <input type="checkbox" id="watermelon" name="fruit" value="西瓜">
    <label for="watermelon">西瓜</label>
    <input type="checkbox" id="banana" name="fruit" value="香蕉">
    <label for="banana">香蕉</label>
    <input type="checkbox" id="pineapple" name="fruit" value="鳳梨">
    <label for="pineapple">鳳梨</label>
    <input type="checkbox" id="apple" name="fruit" value="蘋果">
    <label for="apple">蘋果</label>
    <input type="button" id="ok" value="確定">
    <div id="msgbox" title="訊息"></div>
</div>

然後呼叫該 div/span 物件的 buttonset() 方法即可 :

$("#fruits").buttonset();

測試範例 2 : http://mybidrobot.allalla.com/jquerytest/checkbox_2.htm [看原始碼]



jQuery UI 訊息盒 (Msgbox) 語法

今天撰寫 jQuery UI 程式時一時忘了訊息盒用法, 整理如下備查. 網頁元件部份, 不論網頁中要顯示多少個不同的訊息, 只要用一個 DIV 元素即可 (共用) :

<div id="msgbox" title="訊息"></div>

在 jQuery 部分, 先呼叫 dialog 進行訊息框初始化, 其中選項務必將 autoOpen 設為 false, 否則網頁一開, 訊息盒就顯示了, 我們要等按鈕按下了再顯示 :

var opt={autoOpen: false,
               buttons: {"確定": function() {$(this).dialog("close");}}
               };
$("#msgbox").dialog(opt);

當按下按鈕或條件符合時, 先用 html() 設定訊息內容, 再用 dialog("open") 顯示訊息盒 :

$("#copy").click(function() {
  $("#msgbox").html("指令已複製到剪貼簿");
  $("#msgbox").dialog("open");
  });

2013年9月15日 星期日

關於面相

談到面相, 可能讀聖賢書的人會視為旁門左道嗤之以鼻; 讀科學的會認為怪力亂神, 是早該丟入歷史垃圾桶的無根據偽學術. 若以聖賢書言, 前清中興名臣曾國藩可謂大儒吧, 我書架上有一本此君所著冰鑑一書, 所言均為識人之法, 其中不離面相, 為何讀聖賢書的曾公還要對面相夸夸而談? 我認為面相術是最實用的處世學, 因為初見面之人, 你不可能看他手相, 更不可能知其八字, 如何推算此人性情? 唯獨面相, 觀其人即略知一二矣. 曾公一員儒將, 統湘軍而定天下, 幕下參謀如雲, 如何知賢愚別忠奸? 冰鑑一書就是他閱人無數後的心得.
相書云, 唇厚重情尚義, 觀近日政壇紛爭, 再細看老馬面相, 其人上唇極薄, 主寡情薄義, 此格若為司法人員極為適合, 若為主上, 恐刻薄寡恩也. 對的人放在對的位子, 對個人是幸福, 而國家社會亦得大助; 反之則陰陽逆行, 社稷危矣.

以 IE9 本地端網頁存取 ACCESS 資料庫失敗問題

升版 WIN7 後又發現一個問題, 就是以前為處理碩士論文中龐大的語音檔而寫的本地端網頁程式在 IE9 竟然無法動作, 也沒有錯誤訊息, 但在 IE8 卻可以, 我正急著用這套程式所用的技術解決工作上的問題, 真是傷腦筋. 起因其實是系統更新時不小心沒注意就從 IE8更新到 IE10了, 結果工作日誌系統的 FCKEditor 卻不能用, 退回 IE9 卻又可以, 所以真的會被 IE 這爛貨氣死 (而且很奇怪, 升完 WIN7是 IE8, 更新到 IE10 後取消更新竟然是退回 IE9 而非 IE8). 但話說回來, 它的 ActiveX 還蠻好用的, 用 ADODB 或 FSO 存取本地資料庫與檔案非常方便.
我找到 "cannot open ADODB connection" 這篇, 結果沒用. 後來找到 "MS ACCESS connection string" 這篇, 把 Javascript 連線字串由下列舊的 (for IE6/7) :

var strDsn="DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" + dbfile;

改為如下 :

var strDsn="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + dbfile;

發覺在 IE8 是 OK 的, 明天到公司再試試 IE9 行不行.

20130917 註 : 可以的, 但是因為我的電腦是 WIN7 64 位元, 結果會出現無法建立資料庫連線問題, 要到微軟 DOUNLOAD CENTER 下載 "Microsoft Access Database Engine 2010 可轉散發套件" 安裝後才行. 請參考這篇說明 : C# 編譯.cs檔 資料庫使用access 無法開啟 問題出在 'Microsoft.jet.oledb.4.0'提供者並未登入於本機電腦上

2013年9月13日 星期五

如果人生也能 Ghost

昨天下午幫一樓同事的電腦做 Ghost, 因為她準備將辦公室的電腦升級為 win7, 又擔心萬一不成功可能耽誤工作進度, 所以先做 Ghost 有備無患. 結果越擔心越會發生, 因為 BIOS 沒改, 升版後竟說是非法版本, 無法系統更新. 早上又打電話來要我 Ghost 回去好處理公務, 升版的事慢慢再說. 花了十幾分鐘, 她的電腦又重回原來的 XP, 回魂了.
做完後大家開玩笑, 如果人生也可以這樣, 隨時隨地做 Ghost, 當覺得過去一段歲月不堪回首時, 嘿嘿, 就 Ghost 回去重來, 想回去哪就回去哪, 該有多好. 呵呵, 癡人說夢.

如何顯示 win7 檔案路徑字串

作業系統換新最惱人的問題就是使用習慣, 以前 XP 的檔案總管上方會顯示目前所在位置的路徑字串, 例如 "c:\Program Files\AutoIt3", 直接複製很方便; 但換成 WIN7 後卻改成階層式, 例如 "電腦 > 本機磁碟 (C) > Program Files(X86) > AutoIt3", 有時候寫 memo 需要紀錄路徑位置時, 就有點麻煩了, 沒辦法直接複製. 例如要在系統變數中新增 JAVA_HOME 變數, 指定 Java 的執行檔路徑時, 我就傻眼了, 難道要一個一個敲嗎? 摸索了一下發現, 其實只要點一下 win7 檔案階層右方的向下按鈕, 就會切換成字串模式了, 詳如下圖所示 :





2013年9月12日 星期四

Eclipse 在 Win7 無法啟動問題

前天公司電腦升級為 Win7 後, 一切都非常順利, 記憶體也抓到整整 4G, 跑起來非常順, 這是升版經驗最好的一次. 但是今天想要用以前 XP 時代下載的 Eclipse 3.7 時, 卻發現無法啟動, 我照Eclipse 網站指示去改 eclipse.ini 檔後仍舊不成功, 這回出現訊息窗顯示 "Java was started but returned exit code=13", 原以為是我新裝好的 JDK7 沒設好 PATH, 於是照 Kevin 兄網站之說明去設 path, 結果還是一樣. 最後終於在百度找到解法, 原來 Eclipse 有分 32 與 64 位元版, 只要到 Eclipse 去下載 64 位元版就可以了 :




2013年9月11日 星期三

清官比貪官更可惡

昨日下班後去市場買菜, 跟老闆閒聊了一下, 談到這幾天的 "九月政爭" 大戲, 我發現很多市井小民對老馬這種鬥爭手法甚不以為然. 小店老闆對十月即將漲電價罵聲不絕, 說還是你們領薪水的比較好. 問題是萬物皆漲, 薪水沒漲啊! 更可憐的是現在的年輕人, 房子買不起, 薪水 22K, 還有人遠赴中國, 南韓, 澳洲, 新加坡等當台勞.
老闆說貪官一堆, 甚麼北素如, 中朝卿, 南益世, 街坊都朗朗上口, 結果還不都沒事. 但我說清官問題更大. 前清劉鶚的老殘遊記描寫的非常傳神 : 「贓官可恨,人人知之,清官尤可恨人多不知,蓋贓官自知有病,不敢公然為非;清官則自以為不要錢,何所不可,剛愎自用,小則殺人,大則誤國」. 也就是說, 自認為清官者常拿自己持身正就 "一身正氣沛然莫之能禦" 而一意孤行, 如果是嫉惡如仇的就會殺殺殺, 相信自己是替天行道; 掌軍國大計者如果也是這麼搞, 那可會帶來不可想像的災禍. 更何況這世上多的是那些多重標準的偽君子, 持身根本不正, 還打著公平正義的大旗四處招搖呢.
錯誤的政策比貪汙更可怕, 但要追究其責卻很困難, 因為那不像貪官可以人贓俱獲. 錯誤的政策其禍害既深且遠, 通常要多年後才能體會其貽害之烈. 而且被追究了還可以狡辯, 可以振振有詞說他的決策是正確的. 也就是自我感覺良好啦!
清官比貪官更可惡, 但老馬是清官嗎? 請參考李大師的 "馬英九 你清廉個屁!"

2013年9月10日 星期二

除了生死, 都是小事

今天在網路上看到這個微博文章, 轉載的短篇, 值得細細思考 :
"世上除了生死,都是小事。從今天開始,每天微笑吧。不管遇到了什麼煩心事,都不要自己為難自己;無論今天發生多麼糟糕的事,都不應該感到悲傷。今天是你往後日子里最年輕的一天了,因為有明天,今天永遠只是起跑線。記住一句話:越努力,越幸運。。。"

2013年9月9日 星期一

關於關說案

[武俠時報特派記者黃某某 9月8日恆山電]

這幾天江湖風雨欲來風滿樓, 武林即將腥風血雨. 華山派岳掌門並不反對左盟主的五嶽併派之議, 還認為只有五嶽併派, 才能力抗魔教. 恆山派掌門定逸師太不僅對併派嗤之以鼻, 還私下跟令狐沖關說, 希望他能勸說岳掌門不要贊成併派, 結果 6 日凌晨定逸師太於返回恆山途中遭人暗算, 當場身亡. 師太之死已經引起喧然大波, 武林恐無寧日矣.
江湖盛傳, 定逸師太可能是因為反對五嶽併派才遭人暗算, 那麼最大的嫌疑人恐怕是左盟主矣. 亦有傳言指出, 師太可能是因為特定案件向令狐沖關說, 犯了大忌才被狙殺云云, 但這則網路謠言稍早已獲特偵組證實, 將於下午約談岳掌門. 真相如何, 本週三即將在嵩山召開的五嶽併派大會將會是武林注目的焦點. 目前檢警已根據師太於遇害現場遺留的手機進行科學鑑識, 調閱通聯記錄, 並密切監聽此案重要關係人.

[新聞小百科] : 何謂關說 ?

依據少林寺方證大師解釋, 公職人員之關係人不得向機關有關人員關說、請託或以其他不當方法,圖其本人或公職人員之利益。陽光法案第八條定有明文規定,其中所稱關說、請託,指其內容涉及機關業務具體事項之決定或執行,且因該事項之決定或執行致有不當影響特定權利義務之虞者 (陽光法案施行細則第四條)。

[課後小測驗] : 實際案例

"馬英九宴請司法首長時,提到二次金改案,扁家及企業負責人一審全判無罪,不符合社會期待,他說:「司法不能孤立於社會,更不能悖離人民對司法正義的合理期待」,他一定會與相關單位攜手,力推人民高度期待的法案早日通過。"

這是公然向司法與立法單位關說嗎? 何謂罪刑法定原則? 證據, 證據, 證據, 不是期待, 期待, 期待. 證據到哪罪就定到哪. 重點是誰的期待?

2013年9月5日 星期四

大咪回來了

中午打電話回鄉下時, 媽說大咪終於回來了, 這次跑得真久, 剛好一個禮拜, 我原以為遇到颱風被洪水沖走了呢, 說不定他跑到荖濃溪河床去鬼混, 那裏只要一有颱風都會被淹沒, 水流聲轟轟響, 站在我家晒榖場都聽得到. 所幸大咪回來了, 再不回來我擔心它會跟小咪一樣永遠失蹤了. 這就是我為什麼想學 Arduino 的原因, 我想掛一個追蹤器, 看看他都跑去哪裡鬼混. 媽說拿貓食給他, 結果四隻小貓也跑來吃, 大咪竟然會禮讓他們, 我說搞不好那四隻小貓是他的骨肉吧, 要不然母貓幹嘛跑來我們家待產, 趕都趕不走.
今天剛好左營阿姨去鄉下家裡, 電話中聊了一下, 明璋的美河市終於交屋了, 好在很順利.

2013年9月4日 星期三

姐姐畢業旅行

昨日姊姊模擬考完, 緊接著是三天的畢旅. 由於是跟最要好的同學住同一間, 她顯得相當興奮. 我說给你一千元零用, 她說五百元就夠了, 她真是省錢一姐啊. 行程如下 :
First day: 鹿港老街, 科博館, 逢甲夜市
Second day: 木柵動物園, 十三行博物館, 紅毛城, 淡水老街
Third day: 六福村
呵呵, 六福村跟木柵小學畢旅不是去過了嗎?

2013年9月3日 星期二

AutoIt 基本語法

這陣子可能又要修改機器人程式, 有一段時間沒用到 AutiIt 了, 所以今天把以前胡亂抄寫的筆記稍做整理, 順便複習一下.

一. 變數與常數 :
  1. AutoIt 的變數與常數名稱須以 $ 開頭, 只能使用英數字與底線, 不分大小寫 (常數名稱建議都用大寫以利識別), 所以 $var 與 $Var是一樣的. 注意不可以跟內建函式名稱相同. 變數可以先宣告再賦值, 也可以宣告同時賦值, 多個變數可以同時在一行宣告並賦值, 例如 :
    Dim $a                       ;宣告變數 (一定要有修飾詞)
    $a=1                          ;先宣告再賦值
    Dim $a=1                   ;宣告同時賦值
    Dim $a, $b, $c            ;同一行宣告多個變數 (一定要有修飾詞)
    Dim $a=1, $b, $c=3   ;同時宣告多個變數並賦值 (一定要有修飾詞)
    注意, 下列指令會有執行錯誤 :
    $a=1, $b=2, $c=3       ;沒有加修飾詞
    $a                               ;沒有加修飾詞
  2. 常數要用 Const 關鍵字宣告, 且其值不可更改, 否則執行錯誤. 例如 :
    Global Const $PI=3.14159
    ** 使用 Const 就是為了避免數值不小心被改變 (因重複宣告同名變數)
    ** 常數不能重複宣告, 否則執行錯誤 (變數是可以重複宣告的)
  3. 變數應該用 Dim/Local/Global 三個關鍵字宣告其有效範圍 (scope) :
    Dim : 宣告之變數如果在全域範圍中不存在, 那麼就是 Local; 否則就是 Global
    Local : 強制宣告變數之有效範圍為 Local
    Global : 強制宣告變數之有效範圍為 Global (即使在函數內宣告)
    ** 建議明確使用 Local/Global 宣告有效範圍, 不要使用 Dim 讓直譯器判斷
    ** 若未使用 Dim/Local/Global 修飾詞, 則必須在宣告之同時賦值, 否則會執行錯誤.
    ** 未宣告修飾詞之變數, 在程式最外層預設為 Global; 在函式或 If/For/While 等結構內為 Local
  4. 執行過程中常要輸出變數值, 以檢驗演算結果是否正確, 可用下列兩種輸出方式 :
     (1). 輸出到 STDOUT : ConsoleWrite("$Str=" & $Str & @CRLF)  
     (2). 輸出到訊息框 : MsgBox(0, "標題", $Str)  
    讀取輸入到變數中可用 :
    從 InputBox 讀取輸入 : $ID=InputBox("標題", "提示語")
  5. AutoIt與Javascript一樣屬於弱型態語言, 變數之資料型別於賦值時決定, 且可以隨時更換型別, 例如 :
    Local $x= “abc”   ;宣告 $x 為字串, 存入 “abc”
    $x=123                ; $x 因賦值為123而變成數值

二. 註解 :
  1. 單行註解 :
    AutoIt使用分號當作單行註解符號, 所有跟在分號後面的字串都會被直譯器或編譯器忽略. 但是字串中的分號為例外, 就只是個分號而已. 例如 :
    ;此行是註解
    $string=";這不是註解, 是字串"
  2. 段落註解 :
    若註解超過一行, 則可以用 #cs 與 #ce包圍起來, 例如 :
    #cs
    這是段落註解
    #ce
三. 敘述 :
  1. AutoIt 的敘述以跳行為結束. 
  2. AutoIt 敘述若太長時, 可用 “空白+底線” (“ _”) 表示跨到下一行繼續. 例如 :
    $Str=“蘋果 iPad2 _
             iPod and Itune”
    ** 注意, 底線後面不可再加任何註解, 否則會執行錯誤. 
四. 資料類型 :
      AutoIt 有五種資料類型, 但因為是弱型態語言, 所以宣告變數時不用宣告型態 :
  1. 數值 :
    (1). 10進位數值 : 整數例如 123, -123, 實數例如 1.23, -1.23, 1.23e5 (科學表示法)
    (2). 16進位數值 : 以前綴 0x 為首, 例如 0x1cf, 0x236b (最大只能表示 32 位元之整數)
    (3). 檢查變數是否為數值可呼叫函式 IsNumber(), IsInt(), IsFloat()
  2. 字串 :
    (1). 字串內容必須用單引號或雙引號括起來, 例如 : ‘Hello’ 或 “Hello”
    (2). 字串內容含有引號時, 必須使用混合使用單引號與雙引號, 例如 : “I am ‘smart’”
    (3). 字串與數值做數學計算時, 會呼叫 Number() 函數將文字轉成數值, 若其內含有非數值
           字元, 則將傳回0進行計算. 例如 10 * “abc3” -> 0 而 10* “3” -> 30
    (4). 檢查變數是否為字串可呼叫函式 IsString()
    (5). 字串的串接使用 & 符號
  3. 布林值 :
    (1). 布林值只有兩個 : true 或 false, 例如 : Dim $b1=true, $b2=false
    (2). 布林值通常使用於三個邏輯運算子 : And, Or, 以及 Not, 例如 :
           Dim $b3=$b1 And $b2
    (3). 布林值與數值, 文字混合運算時會以下列規則轉換 :
           a. 布林值與數值做數學計算時 : true -> 1, false -> 0
           b. 布林值與數值做邏輯運算時 : 1 -> true, 其他數值 -> false
           c. 布林值與文字串接時 : true -> “True”, false -> “False” (注意首字母大寫)
    (4). 檢查變數是否為布林值可呼叫函式 IsBool()
  4. 二進位值 :
    (1). 二進位值可以呼叫 Binary() 函式取得, 顯示其值時會以16進位數值表示
          例如 : $bin=Binary(“abc”) -> 0x616263
    (2). 檢查變數是否為二進位值可呼叫函式 IsBinary() 
  5. 指標 (pointer) :
    (1). 指標是一個記憶體位址, 例如呼叫 WinGetHandle() 函式時就會傳回指定視窗之控制碼
    (2). 指標值大小依 AutoIt32 或 AutoIt64 分為 32/64 位元




開學了

新學期又開始了, 姊姊升上國三, 準備當十二年國教第一屆白老鼠, 這兩天正在模擬考; 二哥升國一, 終於換上學校運動短褲上學啦, 從五年級開始他就堅持穿長褲 (大家調侃他是否腳毛過長); 菁菁則升小五, 高年級了, 所以我也不會再有晨光教學了, 現在陪菁菁上學回來時, 校園中的小朋友都是生面孔, 沒人打招呼, 感覺有點落寞.

2013年9月2日 星期一

語言學去來

今天突發奇想, 又利用 Google 對自己進行人肉搜索, 發現與我同名同姓者還真不少啊, 所幸, 我根本排不上邊, 呵呵, 這樣就不會違反資安規定了.
但意外找到一篇政大語言學碩士論文, 竟然引用了我的論文, 沒想到我這麼厚, 全篇堆滿計算數據的 "枕頭", 會有人耐心去看啊? 感恩喔. 這篇 "以優選理論分析美濃客語陰平變調" 有空要好好地讀一下, 看看理論派如何去料理變調問題. 但語言學我已快十年沒碰了, 之前鍾老師也提過要我把論文濃縮一下發表, 但我工作重心一直在 IT 部份, 根本無暇再顧語言學, 很多理論的東西早已回歸自然矣, 充其量只保持對實驗語音學的熱度而已.

匯入無名小站網誌

前幾天新聞報導無名小站年底即將關站, 9/2 開始讓部落客下載資料庫搬家. 我自今年 1 月 22 日開始就轉到 blogger 來寫網誌了, 因為手機是 Android 系統, 用 blogger 記事較方便. 當時還不知如何將過去幾年在無名寫的網誌搬過來, 所以就下載備份檔後放著. 既然無名關站在即, 內容搬家就必須馬上處理了. 所幸經過搜尋, 在重灌狂人發現已經有人寫好無名轉 blogger 的程式了, 只要下載解壓縮後執行該程式, 點選無名所匯出之 xml 檔, 再匯出成 blogger 的 xml 檔, 就可以在 blogger 後台的 "設定/其他" 裡匯入了.
完成後一算, 哇咧, 竟然匯入將近 1000 篇, blogger 還以為是機器人在灌檔咧.

# 無名要倒了?如何幫「無名小站」部落格搬家到 Google 的 Blogger 去?


智慧言語

今天收到一封 email, 充滿了智慧, 節錄如下 :

  1. 女人記住了,選男人沒別的,就是選疼妳的!不管他再有錢,再有才華,再帥,再有口才,再有智慧,再有能力,再孝順,再大愛助人,要是不疼妳,一點屁用都沒有!
  2. 一個人的孤單,並不可怕。 最可怕的,是有了伴侶之後那份孤單。
  3. 一位父親對女兒的愛情忠告,有些人適合妳但不愛,有些人愛妳卻不適合。想知道愛不愛,別用耳朵聽要用眼睛看。看他付出多少。而想知道適合與否,別問他有什麼,而要問妳的笑和眼淚。一直讓妳流淚的條件再好也不能要,一直讓妳笑的,就算吃苦也值得。寧可笑著累,也不要哭著享受。
  4. 一個人最幸福的時刻,就是找對了人,他寵著妳,縱容妳的習慣,並愛著妳的一切。
  5. 對愛你的女人,你可以讓她哭,讓她受委屈,但不要讓她沉默,因為無言是一種最深的傷痛,是一個女人最悲的哭聲。你要知道,女人最愛傾訴,不管生活有多苦多難,無論她有沒有心事,她都想和你講述關於她的一切,這是她愛你的最好方式。如果有一天,她突然安靜了,你也走到了後悔的邊緣。



關於資安

最近公司如火如荼地搞資安, 所有系統不可共用帳密, 於是大夥全都申請了新帳號, 但真正讓人惱火的問題是密碼, 因為這麼多系統, 密碼要求都不同, 有的要求 8 碼, 有的一定要 12 碼, 甚至大小寫至少要有一個, 或者一定要有一個特殊符號, 我又沒去學過快速記憶, 怎能記得如此多組密碼? 結果每天要進入不同機器時都在 try 密碼, 明明是這組怎麼會不對呢? 卡好, 超過三次被認為是駭客入侵, 帳號被鎖死啦! 正有急件要進入系統處理, 卻被這密碼搞得快瘋了!
路是人走出來的, 於是我開始進行密碼統一工作, 全部系統使用同一組密碼, 大部分系統進行得還算順利, 只有少部分很支支哇哇, 竟然連好不容挑選出來好記又可以被眾多密碼政策接受的一組黃金密碼也挑剔, 說不能有連續兩個字元與帳號相同, 真是順了姑意卻逆了嫂意, 只好記兩組密碼, 寫在一張立可貼上黏貼在鍵盤後面. 希望資安查核時不會翻看鍵盤背面才好.
重視資安我不反對, 但是不可以做得人性化些, 方便些嗎? 我擔心萬一系統出現重大問題需要緊急介入處理時, 搞不好會被密碼給搞死. 屆時資安就變成 "牛豬安" 矣.

重看笑傲江湖

暑假結束前, 跟我們家小狐狸一起看完笑傲江湖 (中國 2001 年央視版, 李亞鵬, 許晴主演), 非常過癮. 其實多年前我就看過了, 前陣子整理光碟卻久尋不獲, 乾脆趁買空白片時, 在建國路再買一套未壓縮版的, 這樣在 42 吋液晶電視看影像才清晰.
李亞鵬版的笑傲, 我認為是拍得最好的一部, 當然專家的評論褒貶不一, 甚至貶的較多, 但對我而言, 我只問是不是看得爽, 是的話那就是最棒. 首先是它的武打漂亮, 令狐沖的獨孤九劍就是要這樣拍才帥. 此劇中有兩個場景是最令我激賞的, 一是五嶽併派大會與左冷禪之戰, 其次是最後一集岳不群率眾攻打黑木崖, 與任我行爭天下第一之戰. 被令狐沖打敗後卻想暗算令狐沖, 反而被儀琳師姐妹出劍釘死在岩壁上, 堪稱是經典畫面.
許晴出演的任盈盈我也覺得不錯, 雖然有人批評妖氣太重, 我卻認為拿捏的很好. 特別是許晴高貴的氣質很能詮釋聖姑這角色. 姐姐卻獨鍾只出現兩次的東方不敗, 她說那髮型與化妝不錯, 還說很想練葵花寶典的武功, 像東方不敗那樣用內功繡花, 呵呵, 我說妳又不能自宮, 沒資格練啦. 東方不敗那裝扮, 我倒覺得還真是像人妖哩.

2015-12-14 補充 :

今天將 DVD 存檔, 又重看部分段落, 真好看. 還搜尋到蠻多人認為此部最佳 :

# 最好的電視劇——央視版(2001)的笑傲江湖


2013年9月1日 星期日

Arduino 初步

最近迷上 Arduino 這個開放式微控器硬體, 主要是因為它提供免費的開發軟體, 內置大量範本, 且只需要用 USB 連上電腦就可以寫入程式了. 經過多方比較研究, 決定購買 Nano 開發版, 搭配 ENC28J60 乙太網晶片接上 Internet 來做遠端控制, 因為 Nano 板夠小, 可以直接插在麵包板上作實驗. 我原先想買 UNO 或 MEGA 2650, 但我覺得板子太大了, 反正都是要先接到麵包板連接一些電阻電容或電晶體啊, 幹嘛不用剛好可以插到麵包板的 Nano 呢? 如果系統測試完畢, 甚至可以將 Nano, ENC28J60, 以及 RF 板一起 Lay 在一塊縮小板上呢. 其實用 Pro mini 也不錯, 少了 USB 板子更小, 價格更便宜 (約 190 元), 只要加買一個 USB 調適器, 除了 Pro mini 沒有 3.3v 輸出以外, 其實就跟 Nano 幾乎一模一樣了.

我預計用 Arduino 做如下應用 :
  1. 家庭門禁警報 : 大門一開即發出 Email 或簡訊
  2. FPV 飛航控制
另外, 我們家大咪常常一出去就好幾天, 像昨天回鄉下, 爸就說大咪好幾天沒回來了, 我一直很好奇它都上哪去, 如果可以設計一個追蹤器的話, 那就可以了解其行蹤了. 大咪每次要出去時, 都會經過大門, 然後對著客廳喵幾聲, 好像是說, 我要出去囉.

參考 : 簡易無線電追蹤器自動化的改良裝置介紹

27 年同學會

    昨日在中油宏南餐廳舉辦畢業 27 年來第一次正式同學會, 畢業後各奔前程, 有幾位是畢業後沒再見面的, 真是難得. 我本下午就要返鄉下, 但正如老張所說, 機會難得, 下次不知何時能辦成啊.
    二十七年過去了, 大家都已是步入中年的 middle age, 事業有成的大有人在, 我們同學本來都是當年考取第一志願高中名校的佼佼者, 在職場繼續發光發熱自是理所當然. 過了四十歲之後, 鬢角泛白, 髮際漸疏, 對於人生的體悟, 雖然各人機遇不同, 但風霜冷暖, 雖短短兩小時聚餐未能深談, 相信都領略甚深吧!
兒子前日問我, 哪一階段同學感情較好, 我回顧了一下, 小學懵懵懂懂, 印象非常模糊, 只有幾位青梅竹馬的同學還留存在腦海中; 青澀的國中都在忙考試, 但因為男女合班, 趣味事特別多, 加上國文老師強迫寫下的三本日記, 記憶最是深刻 (忘了還可以翻), 但至今常連絡的僅僅一位; 而漫漫五年的專科, 則是漸漸有思想互相碰撞的青少年時期, 同窗時期最長, 所以也是感情最深的; 之後去中山大學進修, 同學大都是 40, 50 歲的中年人, 我是少數 30 上下的小朋友. 雖說共窗三年, 感情自是無法與專科相比; 到了師大研究所, 情況反過來, 同窗都是小我一輪的小弟弟小妹妹, 我變成大哥啦! 呵呵, 雖然只有短短兩年半, 但重返校園卻讓我有返老還童之感.
    人生者, 記憶也. 沒了記憶什麼都不是了. 就像是 DRAM, 電一關掉就沒了. 彷彿存在過的, 又似乎不存在. 未來回顧人生時, 能提醒我們彷彿存在過的, 就是相片與日記啦. 但願到時候別指著照片說, 這帥哥是誰呀, 長得可俊俏啊. 懼老怕老是我們這些中年人目前的煩惱, 但套句宮崎駿 "霍爾的移動城堡" 中, 荒野女巫的那句話 : "老年人的好處是, 能失去的東西已經不多啦!", 呵呵.