2015年4月28日 星期二

第 18 周記事

這個周日的下午因小舅, 婷婷, 阿娟, 以及高樹阿姨來訪, 顯得非常熱鬧. 小舅媽巡菜園時看見我年前一周種的第一批玉米, 說可以採收了, 否則會太老. 我還想說下周再採呢. 扳開玉米尖端一看, 果然米粒飽滿, 當下採收十支, 剩下七八支的留給晚到的婷婷採. 洗淨後立刻下鍋水煮, 其甜味果然如書中所言, 在兩小時內煮來吃, 又新鮮又甜美.


上週五爸去看阿蘭時, 發現腳浮腫, 護理師說排尿不順, 要去醫院掛診. 中午醫生來電說因插尿管不易, 建議做膀胱造口, 並住院幾日觀察. 我想才去養護中心住三周, 竟然變成這樣, 這也不能怪養護中心, 可能阿蘭以前沒有包尿布習慣所致. 週末回鄉下時去病房看她, 與養護中心其他住院的老婆婆同間, 似乎也不會吵鬧, 看到我們頗為高興. 但為防止她拔管針, 手被護士綁起來, 無法滑我的手機. 週日去看她時, 剛好醫師值班, 我問了原因, 他也無法給個明確的答案, 說可能是年紀大了, 排尿不順. 對此我頗為自責, 是否當初應該請外勞才對? 但因請外勞挺麻煩, 母親生前也不認同, 我離退休還很久, 故衡量後決定到機構安置.

過去這一周我又重新回來寫程式專案, 除了搞定 Appfog 的上傳問題外, 也修正了一些 Bug, 新增了部分功能.


2015年4月24日 星期五

無法登入 GAE 問題

今天在處理 GAE 的 cron 問題時, 在命令提示字元視窗下 :

appcfg.py --no_cookies download_app -A myapp -V 1 e:\gae\myapp

輸入 gmail 與密碼後卻發現無法登入 :

11:38 AM Host: appengine.google.com
####################################################
OAuth2 is now the recommended authentication method.
Use the --oauth2 flag to enable.
####################################################
11:39 AM Fetching file list...
Email: myaccount@gmail.com
Password for myaccount@gmail.com:
Invalid username or password.

確定密碼沒錯,試了好幾次還是不行. 由於這帳號是爸的 gmail, 沒有申請兩階段驗證, 應該用 gmail 原本的密碼就行. 兩階段的要另外產生, 參考 :

# 開啟兩階段認證後手機無法使用 Google 服務問題

我到 google 帳戶去找線索, 發現在帳戶設定的 "安全性較低的應用程式存取權限" 是 "已封鎖" :


點一下已封鎖就可以選擇將其打開 :




經過這樣改變設定後, 就可以順利登入 GAE 後台了. 完成後為了安全起見再把它改回已封鎖.

今天一口氣將所有已經不用的 CRON 全部關掉, 只留驅動 Appfog 的兩個應用程式的帳號與 hello, mybidbot 兩個驅動器.


2015年4月23日 星期四

GAE 後台管理指令集

今天終於把三月初暫停的 000a.biz 專案程式大致回復了, 這給我一個教訓, 要定時備份系統, 不要以為跑得順順的就不理它, 一旦系統無法運轉, 裡面寶貴的程式與資料若無法拿回來就虧大了. 那可是花了不少時間寫出來的啊.

這次的麻煩主要是我忽略 000a.biz 要求升級的來信, 我認為那只是行銷而已, 不予理會, 結果四月十日果真就被停止後台使用權了, 這麼巧,  Inhon 筆電就在同一天無法啟動, 必須從光碟做系統回復. 這樣一來本機伺服器在 C:\ AppServ\www 下的程式檔都消失了, 而 TF 卡中的程式雖還在, 但可能不是最新的. 幸好 000a.biz 同意我取回程式的要求, 這幾天就是忙比對取回的程式與 TF 卡中備份的程式有何差異. 沒有做好資料保全的下場就是這樣, 浪費寶貴的時間.

程式檔回復後上傳 Appfog, 接下來就是 GAE 驅動程式的部分了. 先到 GAE 申請一個新的應用程式專案, 然後把之前給驅動 000a.biz 的應用程式複製一份, 作如下修改 :
  1. main.py : 把原 000a.biz 的 URL 為 Appfog URL.
  2. app.yaml : 把第一行的 application 名稱改為新應用程式名稱 
  3. default.htm : 把標題改為 Appfog 應用程式名稱
這樣就可以上傳了. 但使用 GAE SDK Launcher 才發現, SDK 已升版到 1.9.19 了, 所以上 GAE 網站更新了 SDK :

https://cloud.google.com/appengine/downloads

更新完上傳應用程式卻出現如下訊息 :

2015-04-23 17:03:24 Running command: "['C:\\Python27\\pythonw.exe', '-u', 'C:\\Program Files (x86)\\Google\\google_appengine\\appcfg.py', '--oauth2', 'update', u'E:\\GAE\\appfog-myAPP']"
05:03 PM Application: appfog-myAPP; version: 1
05:03 PM Host: appengine.google.com
05:03 PM
Starting update of app: appfog-myAPP, version: 1
05:03 PM Getting current resource limits.
2015-04-23 17:03:35,434 WARNING old_run.py:88 This function, oauth2client.tools.run(), and the use of the gflags library are deprecated and will be removed in a future version of the library. 
Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fappengine.admin+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&response_type=code&client_id=xxxxxxxxx.apps.googleusercontent.com&access_type=offline

If your browser is on a different machine then exit and re-run
this application with the command-line parameter

  --noauth_local_webserver

有問題了, 但沒時間研究, 乾脆改用 command line 來上傳吧. 以下是 appcfg 常用的指令集 :
  1. 上傳應用程式 :
    appcfg.py update APPNAME
  2. 更新 CRON :
    appcfg.py update_cron APPNAME
  3. 顯示 CRON :
    appcfg.py cron_info APPNAME
  4. 下載應用程式 :
    appcfg.py download_app -A APPNAME -V 1 DIRNAME
上傳結果如下 :

E:\GAE>appcfg.py update appfog-myAPP
07:28 PM Application: appfog-myAPP; version: 1
07:28 PM Host: appengine.google.com
####################################################
OAuth2 is now the recommended authentication method.
Use the --oauth2 flag to enable.
####################################################
07:28 PM
Starting update of app: appfog-myAPP, version: 1
07:28 PM Getting current resource limits.
Email: tony123@gmail.com
Password for tony123@gmail.com:
07:29 PM Scanning files on local disk.
07:29 PM Cloning 1 static file.
07:29 PM Cloning 9 application files.
07:29 PM Compilation starting.
07:29 PM Compilation completed.
07:29 PM Starting deployment.
07:29 PM Checking if deployment succeeded.
07:29 PM Deployment successful.
07:29 PM Checking if updated app version is serving.
07:29 PM Completed update of app: appfog-myAPP, version: 1
07:29 PM Uploading index definitions.
07:29 PM Uploading cron entries.

跑了近四小時, 觀察對 Appfog 發出的 Request 蠻正常, 完全 0 error, 可見 Appfog 主機真的一級棒, 難怪收費比人家貴, 還好我有留下免費帳戶, 雖然容量與流量有受限制, 但作為實驗性網站也夠了 :


哈哈, 系統又重新跑起來了, 估計後天全部資料就會抓完全了, 但要謹記這次的教訓, 定期備份系統.

接下來要把目前已經沒用到的 GAE cron table 停掉, 只留兩個 Appfog 帳號以及慢速測試用的 0000webhost 驅動器即可.

參考 :

停止 GAE 的 cron jobs 的方法
# 下載備份 Google App Engine 應用程式檔案的方法
# Uploading, Downloading, and Managing a Python App


2015年4月22日 星期三

用 jQuery EasyUI 打造輕量級 CMS (十二) : Pclzip 壓縮解壓縮

今天突發奇想, 既然 Appfog 不提供 web 介面來管理檔案上傳與下載, 何不自己寫一個呢? 其實我不需要實作 cPanel 那種完整的檔案與目錄管理, 只要下列三個功能即可 :
  1. 將整個根目錄下全系統備份為 zip 檔下載
  2. 刪除全部資料
  3. 上傳 zip 檔自動解壓縮覆蓋原系統
首先去官網下載 :

Pclzip 官方網站 (Pclzip 下載)

解開後將其中的 pclzip.lib.php 複製到 EasyUICMS 專案目錄下的 lib 下, 然後於系統檔 sys.php 前面增加匯入此函式庫 :

require_once("lib/pclzip.lib.php");  //匯入zip/unzip模組     (選項)

不過接下來要在哪裡放置這個系統更新與備份下載功能按鈕就費思量了. 因為昨日測試發現已安裝 af 的 Ruby 免安裝版可以移到其他電腦使用, 所以利用 Pclzip 來自行打造系統更新備份功能的計畫暫緩, 以後有需要再進行.

關於 Pclzip 的用法請參考 :

# AJAXPLORER:超強大的 PHP + AJAX 開源文件管理系統
PHP解壓縮和製作壓縮 (使用pclzip)
# php 解壓縮zip 使用pclzip
PHP CONTENT : PclZip Overview


2015年4月21日 星期二

Appfog 雲端主機 Client 端安裝問題解決辦法

上個禮拜為了在我的應宏筆電安裝 Appfog 的 Client 花了很多時間仍然徒勞無功, 即使照以前安裝 Ruby 1.9.3 的方法也不行 :

# Appfog 雲端虛擬主機

我發現 Appfog 有改變其 Client 安裝方式, 以前是只要安裝好 Ruby 1.9.3 或 2.0.0 後, 直接下 gem install af 即可; 但現在根據其官網說明, 卻必須下載安裝 Devkit 開發工具, 然後再用 gem install af 安裝 Client, 但問題就出在這裡, 經過回鄉下用 Win 7 甚至 XP 電腦測試, 不論安裝哪一個 Ruby 版本, 都會出現 extension error 而無法成功 :

Appfog 雲端開發環境新作法

最後決定算了, 要更新系統時再用 AOD D260 小筆電上傳即可.

今天突發奇想, Ruby 也提供 zip 檔, 讓無管理權限安裝程式者也可以使用 Ruby, 那我何不將 AOD D260 小筆電裡面可以用的 Ruby 2.0.0 版從 C:\Program Files 下複製出來, 放到應宏筆電中執行看看? 結果真的可以, 真是太棒了, 這樣就可以用免安裝軟體方式執行了.

我把 Ruby 2.0.0 壓縮為 zip 放在下面 :

# 下載免安裝 Ruby 2.0.0 (已安裝 Appfog Client af)

注意, 下載解壓縮後放在硬碟下, 然後切到 bin 目錄下, 複製其位址, 例如 E:\Ruby200\bin, 將其增加到 "控制台/系統/進階系統設定/環境變數" 中的 Path 內, 開啟命令提示字元視窗下 path 指令確定路徑設定沒問題 :

Microsoft Windows [版本 6.3.9600]
(c) 2013 Microsoft Corporation. 著作權所有,並保留一切權利。

C:\Users\Tony Huang>path
PATH=C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Clien
t\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\W
indowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Compone
nts\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Prog
ram Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files
 (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Ja
va\jdk1.7.0_71\bin;C:\Program Files (x86)\Java\jdk1.7.0_71\db\bin;C:\Program Fil
es (x86)\Java\jdk1.7.0_71\jre\lib;c:\python27;c:\python27\scripts;C:\Program Fil
es\Bandizip\7z;C:\Program Files (x86)\Google\google_appengine\;C:\AppServ\Apache
2.2\bin;C:\AppServ\php5;C:\AppServ\MySQL\bin;E:\Ruby200\bin

重開命令提示字元視窗, 再下 af -v 就可以看到 af 的版本是 0.3.18.12 :

C:\Users\Tony Huang>af -v
[WARNING] DL is deprecated, please use Fiddle
af 0.3.18.12


C:\Users\Tony Huang>af login
[WARNING] DL is deprecated, please use Fiddle
Attempting login to [https://api.appfog.com]
Email: tony123@gmail.com
Password: ********
Successfully logged into [https://api.appfog.com]

這樣就登入 Appfog 後台了, 切換到本機的專案目錄下, 用 af update app-name 指令來更新系統 :

E:\mysnowball>af update mysnowball
[WARNING] DL is deprecated, please use Fiddle
Uploading Application:
  Checking for available resources: OK
  Processing resources: OK
  Packing application: OK
  Uploading (37K): OK
Push Status: OK
Stopping Application 'mysnowball': OK
Staging Application 'mysnowball': OK
Starting Application 'mysnowball': OK

E:\mysnowball>

早一點想到這招免安裝版的話, 就不用浪費這麼多時間了.


架設風力發電機 part2

週日 (4/19) 下午小舅回去後, 想起我的風力發電機底座還沒安裝好, 於是找出上兩周油漆好的底板, 放到角鐵支架上, 正揣摩要如何鎖螺絲時, 才發現板子上竟有一隻小蟲 :


附近則有兩三個洞 : 


卡好, 難道是蛀蟲嗎? 我叫爸來看, 他說這是白蟻, 會把整塊木板掏空, 二話不說就捏死了這隻白蟻. 有可能這塊購自特力屋的板子已經有白蟻, 上油漆後它受不了就跑出來了. 

把塗上藍色漆的底板用四顆螺絲鎖在角鐵支架上, 然後再鋸一塊固定板,  塗上油漆 (只剩紅色), 用螺旋螺絲鎖在底板上, 最後將發電機用一個環形鐵箍鎖在固定板上.  這固定板方向對著風向最強的西南方, 因為每天下午總是會有強烈的西南風吹過來. 下面是安裝後的測視圖 :


底下是後視圖 :


超過啟動風速後即開始發電 :



拿了電表來量, 發電電壓於風力強勁時可達 50V, 經過電壓調整器後對 12V 鉛酸電池充電應該沒問題. 因為還沒有想好怎樣幫發電機遮雨, 而接下來幾天氣候不穩定, 所以先將發電機拆下來, 下周再來想解決辦法 :


紅色的固定板尺寸 : 長 16cm, 寬 14.5cm, 厚 1.5cm. 是要蓋個小木屋呢? 還是拿個不要用的飯盒蓋上去呢? 或者用上回買的珍珠板組一個方盒? 真是傷腦筋. 

成本概算 :

發電機含葉片 450
基座角鐵 170
螺絲螺帽組 50
基座木板 60

目前小計 730 元.

參考 :

大灣高中-廢棄吊扇改直立風力發電機

小舅媽的蠔油冬粉

週日 (4/19) 小舅媽回鄉下, 中午教我煮了這道菜, 其實這是她去餐廳吃過後, 觀察其材料內容, 回來後揣摩出來的, 我也常常用這種方法學做菜. 此道菜所需材料如下 :
  1. 高麗菜半顆
  2. 芹菜一把
  3. 火鍋肉片一盒
  4. 冬粉若干捲
  5. 花椒一小包
  6. 香菜一把
  7. 素蠔油
作法如下  :

高麗菜切小片, 芹菜與香菜切小段備用. 熱鍋加一匙油, 放入花椒炒香後加入2~3 碗水與 2~3 匙醬油, 水滾過後用篩撈起花椒粒, 鋪上一半的火鍋肉片, 高麗菜與芹菜, 疊上冬粉, 最上面再鋪上剩下的一半高麗菜與芹菜, 肉片與香菜, 淋上適量素蠔油, 蓋上鍋蓋以中火燜煮, 約十分鐘後打開來翻炒, 若水分已被吸乾, 再加些水繼續燜煮至肉片與菜全熟即可.


我非常喜歡冬粉, 只要自助餐有上這道必點. 而舅媽這道蠔油冬粉尤為美味, 我想是因為透著花椒的香氣之故. 下次要自己來做看看, 特記下作法以免遺忘.


2015年4月20日 星期一

第 16 周記事

這個周末有自知之明, 沒帶多少書回鄉下, 因為通常沒多少時間看. 反正週日早上行程就是去大阿姨家巡視, 買菜, 慈恩塔上香, 養護中心看阿蘭, 然後回家煮中餐. 整個早上就去掉了, 只剩下午可做整理菜園等雜事而已. 回鄉下就拋開書跟電腦, 純粹做事就好.

周日除了早上摘些杓菜與地瓜葉給大阿姨有到菜園外, 沒有在菜園勞動. 不過茄子已經開花結果, 支架我已立好,  等長高一些再來綁繩子固定 :


第一批玉米的鬚已經開始變褐色, 可能兩周之後就可以採收了 :


第二批也已經開花 :


同事給我的木瓜樹上個月被野狗折斷, 令我惋惜, 沒想到竟然重新長出嫩葉了 : 


可能是上周拿菜去給有緣哥, 這周他拿來一包自製的南瓜饅頭, 同時從菜園拔走一把蔥, 原來那畦青蔥是他去年夏天種的, 那時媽常叫他有空時來種菜. 而媽自己種的是下面這三株, 下周回去再分株擴大 :


本周雖然時間不多, 但事情倒是完成不少.  下午在小舅幫忙下, 先將梳妝鏡安裝在新建浴室, 然後把二樓浴室的磁性門檔裝上去. 傍晚再將前兩周沒完成的發電機底座安裝作業完成.


用 jQuery EasyUI 打造輕量級 CMS (十一)

睽違一個多月沒動這個專案了, 這兩三天因為 000a.biz 停止了我的應用程式, 無奈之下只好另擇良木而棲. 還好 000z.biz 有把程式跟資料庫還我, 所以我將這兩天自行修改部分與 000a.biz 還我的程式做個混合調整, 修改了部分EasyUICMS 系統與 STOCK 專案程式, 由近而遠摘要如下.

今天將調整後的專案 ZIP 檔上傳以前用過的 000webhost 這一家虛擬主機商, 結果系統安裝後竟然沒有出現成功訊息視窗, 我研判應該是 Ajax 回傳訊息有問題, 用 F12 觀察 Response 發現, 果然回傳訊息後面還帶了 000webhost 的統計用 Javascript :

{"status":"success","msg":"MySQL \u8cc7\u6599\u5eab\u53c3\u6578 : <br>MYSQL_ADDRESS=mysql3.000webhost.com<br>........."}
<!-- Hosting24 Analytics Code -->
<script type="text/javascript" src="http://stats.hosting24.com/count.php"></script>
<!-- End Of Analytics Code -->

而 index.htm 的 Ajax 回傳訊息處理如下 :

      $("#install_form").form({
        url:"install.php",
        method:"post",
        success:function(data){
          var data=eval('(' + data + ')');
          $("#install_dialog").dialog("close");
          if (data.status==="success") {  //不會符合
            $.messager.alert("訊息",data.msg,"",function(btn){
              if (btn){window.location.href="index.php";}
              else {window.location.href="index.php";}
              });          
            }
          else {
            $.messager.alert("訊息",data.msg,"info",function(btn){
              if (btn){window.location.href="index.php";}
              else {window.location.href="index.php";}
              });          
            }        
          }
        });

這樣用 eval() 把 data 轉成物件時就會失敗, 以至於雖然安裝成功了 (可由 phpMyAdmin 觀察資料表都正常建立得知), 但卻沒有顯示成功訊息. 我用 substr 擷取回傳訊息中的 {} 部分解決 :

          var r=data.substr(0,data.indexOf("}") + 1); //取出 {} 部分字串
          var data=eval('(' + r + ')');  //轉成物件

所以以後處理 Ajax 回傳異常時, 不要以為自己的程式有錯, 要馬上想到免費主機大都會在回傳訊息後面安插統計資訊, 使 Ajax 回傳處理函式破功, 這在本機 localhost 以及某些免費主機 (如以前免費的 Appfog) 都不會有這問題. 事實上不只是在 index.htm 裡有此 Ajax 回應被加上額外訊息導致的錯誤, 在 sys.php 中也有同樣的問題, 甚至應用程式 STOCK.php 也是, 所以都一併修改了.

其次我修改了系統程式 sys.php 裡的 remove_app 模組, 添加移除應用程式在網頁左方導覽列中所建立的超連結 :

        //找出屬於此 APP 的導覽區塊
        $RS=search("sys_nav_blocks","app",$app_name);
        for ($i=0; $i          $block_id=$RS[$i]["id"];
          //從 sys_nav_links 刪除此 app 所建立之超連結
          $result=delete_record("sys_nav_links","block_id",$block_id);
          if ($result===FALSE) {
            $status="failure";
            $msg .= "刪除應用程式在 sys_nav_links 之超連結失敗
";
            }
          }
        //從 sys_nav_blocks 刪除此 app 所建立之超連結
        $result=delete_record("sys_nav_blocks","app",$app_name);
        if ($result===FALSE) {
          $status="failure";
          $msg .= "刪除應用程式在 sys_nav_blocks 之超連結失敗
";
          }

當移除應用程式時, 會先找出資料表 sys_nav_blocks 中屬於該應用程式的導覽區塊找出來, 然後到 sys_nav_links 資料表中刪除該區塊的所有連結. 最後刪除 sys_nav_blocks 中該應用程式的導覽區塊. 當然, 為了配合這個功能, 在安裝程式 install.php 中, 建立 sys_nav_blocks 資料表時, 要添加 app 欄位 :

    //插入 sys_nav_blocks 之連結
    $data_array["title"]="主功能";
    $data_array["sequence"]=0;  
    $data_array["display"]="Y";  
    $data_array["app"]="varchar(255)";         //所屬應用程式名稱
    $result=insert("sys_nav_blocks", $data_array);
    $data_array=NULL;

另外, sys.php 程式中的 nav_blocks, list_nav_blocks, add_nav_block, update_nav_block 這四個模組也要為了這個新增的 app 欄位添加程式碼.

最後在應用程式的安裝檔, 例如 STOCK_install.php 裡面, 要建立導覽區塊時, 務必在 sys_nav_blocks 資料表的 app 欄位指定應用程式名稱, 例如下面是為 STOCK 應用程式建立 STOCK 與 BROKER 這兩個導覽區塊 :

//插入 sys_nav_blocks 之連結
$data_array["title"]="STOCK";
$data_array["sequence"]=2;  
$data_array["display"]="Y";  
$data_array["app"]="STOCK";  
$result=insert("sys_nav_blocks", $data_array);
$data_array=NULL;
$RS=search("sys_nav_blocks","title","STOCK");
$nav_block_1=$RS[0]["id"]; //sys_nav_links 用

//插入 sys_nav_blocks 之連結
$data_array["title"]="BROKER";
$data_array["sequence"]=3;  
$data_array["display"]="Y";  
$data_array["app"]="STOCK";  
$result=insert("sys_nav_blocks", $data_array);
$data_array=NULL;
$RS=search("sys_nav_blocks","title","BROKER");
$nav_block_2=$RS[0]["id"]; //sys_nav_links 用

//插入 sys_nav_links 之連結
$data_array["title"]="台股觀測站";            
$data_array["url"]="https://2330.tw/";                
$data_array["target"]="_blank";
$data_array["sequence"]=0;
$data_array["block_id"]=$nav_block_1;
$data_array["hint"]="台股觀測站";
$result=insert("sys_nav_links", $data_array);

$data_array=NULL;

另外, 為了佈署在 Appfog, 又把 index.htm 中原本已拿掉的 Appfog 專用安裝程式碼放回去 (因為 Appfog 的 MySQL 參數必須用環境參數 VCAP_SERVICES 取得後再用 $mysql_config[] 讀取) :

  //先判斷是否為 Appfog 雲端虛擬主機以讀取 MySQL 連線參數
  $services_json=json_decode(getenv("VCAP_SERVICES"),true);
  if (is_array($services_json)) { //appfog 雲端虛擬主機
      $mysql_config=$services_json["mysql-5.1"][0]["credentials"];
      $username=$mysql_config["username"];
      $password=$mysql_config["password"];
      $hostname=$mysql_config["hostname"];
      $port=$mysql_config["port"];
      $address="$hostname:$port";
      $db=$mysql_config["name"];
      } //end of if
  else { //一般 PHP+MySQL 虛擬主機 (從 dbsettings.php 檔讀取)
    $str=read_file("db.php"); //讀取資料庫設定檔初始值 (或參考值)
    $username=return_between($str,"'MYSQL_USERNAME','","')","EXCL");
    $password=return_between($str,"'MYSQL_PASSWORD','","')","EXCL");
    $address=return_between($str,"'MYSQL_ADDRESS','","')","EXCL");
    $db=return_between($str,"'DATABASE','","')","EXCL");
    } //end of else

最後修改了檔案上傳功能的一個 Bug, 
 在 sys.php 的 files 模組增添表單 validate 功能, 否則若檔案說明沒填, 上傳會當在那邊沒有回應 :

    $("#upload_file_go").bind("click",function(){
      var arr=$("#uploader").filebox("getText").split("\\");
      filename=arr[arr.length-1];
      var reg=/^[a-zA-Z0-9._-]+$/g;
      if (reg.test(filename) && $("#upload_file_form").form("validate")) {
        $("#uploading").css("visibility","visible");
        $("#upload_file_form").form("submit");    
        }
      else {
        var msg="每一欄位均須填寫! 檔名必須為英數字, 小數點, 底線, " +
                "或減號之組合! 請更改檔名!<br>";
        $.messager.alert("訊息",msg,"warning");
        }

      });

以上便是此次意料之外的大改版, 沒想到換個虛擬主機竟然發現這麼多需要修改的地方.

2015年4月18日 星期六

菁菁國中報到

早上九點跟菁菁去龍華報到, 照例一大堆補習班在校門口發傳單, 占用人行道, 剛好遇到警察跑來喝斥. 報到完出來中庭買制服與運動服, 合計 3440, 上國中治裝費也不便宜呢.

下午二哥第一次去全成補理化, 回來時已近六點, 說明日下午還要補課, 所以只有我跟菁菁與姐姐三人回鄉下.

晚上在晒穀場踱步, 想想以前媽還在時, 這時是幫她做足部腳底按摩的時候. 母親走後, 爸變獨居老人, 相信周一到周五面對空蕩蕩的房子, 應該是非常孤寂吧. 除了中午與晚上電話問候外, 似應於上下班時再打電話.


新申請 1freehosting 帳號

由於 000z.biz 的免費帳號因為流量超標被停止了, 這兩天忙著回頭複習 Appfog 的用法, 因為我以前有申請兩個 Appfog 帳號, 其中一個閒置未用, 剛好拿來應急.

Appfog 的好處是, 它跟 GAE 一樣, 超過免費的配額頂多程式不執行, 不會把整個帳號停掉不能用. 但不方便的地方是, 它的用戶端必須安裝 Ruby, 使用 CLI 介面管理雲端伺服器帳號, 這幾天在我的應宏筆電安裝的結果發現, 這機制在 Win8 有問題, 使用 gem install af 安裝 Appfog 的 client 時總是卡在 extension 而失敗. 這讓我很困擾, 因為無法直接使用應宏筆電上傳程式, 得依賴 AOD D260 小筆電的 XP 上的環境才行. 搞得我這台 D260 為此還要帶來帶去. 我還是比較喜歡像 000a.biz 這種完全用網頁管理的後台操作介面.

今天在 1freehosting 新申請了一個帳號 mysnowball, 然後把停在 3 月 4 日的最新專案檔案上傳, 一切 OK. 接下來只要在 GAE 建立一個新應用程式來當心臟, 就能驅動整個機器人繼續運作了. 不過以前在 1freehosting 也曾經因為 SQL 操作與網頁要求超量, 被視為濫用免費資源而停止帳號, 所以將來還是可能被停權. 其實有一個辦法可以避免過早超標, 就是把 crontab 的時間調慢, 本來 8 分鐘擷取或分析一次, 改為每 40 分鐘, 只是一個 cycle 從 2 天延長為 8 天而已, 反正財報資料也不是每天更新啊.

其實 3 月 4 日的可能不是最新檔案, 因為安裝成功後, 系統設定畫面空空如也, 最新的資料有可能是在 C 下的 Appserv 資料夾下面, 隨著系統復原消失了. 昨天抱著死馬當活馬醫的心態, 給 000a.biz 開了一張 ticket, 說明這些程式資料對我的重要性, 希望能取回程式與資料庫. 沒想到今天收到回復, 可以從指定位址下載系統備份檔. 真是太好了. 這件事的教訓是 : 重要資料一定要三天兩頭就備份, 而且要狡兔三窟.

這次我才知道 000a.biz 的實際廠商是 www.byethost.com, 這家服務不錯, 當天就回覆, 而且過去一季使用經驗, 其伺服器相當穩, 例如擷取每日收盤資料從不失誤, 不像我用過的其他家, 有一頓沒一頓的, 零零落落. 專案完成後若要使用付費主機當然選 000a.biz.


關於 SSD 固態硬碟的效能

上周六在燦坤會招時買了 64G 創見 Class 10 SDHC 卡, 剛好我的應宏筆電從系統毀損回復, 想測試看看這台筆電的 SSD 到底多快, 就下載了 AS SSD Benchmark 來測試, 此軟體我用 VirusTotal 掃過是乾淨的, 不須安裝, 解壓縮後就可以用了

AS SSD Benchmark 1.7.4739.38088

首先測試應宏 Carbobook 本機 128G SSD, 表現 OK :


接著插上創見 64G 隨身碟測試, 跟 SSD 簡直不能比, 畢竟它還要透過 USB 串列埠啊 :


參考資料 :

# 免費檢查SSD硬碟4K對齊的軟體AS SSD Benchmark
# SSD 新手筆記


好書 : 互動式網站前台開發武功秘笈 :使用HTML5、CSS3和jQuery

這本書借自左新, 分為基礎, 應用, 與比較三篇. 基礎介紹互動網站前台三大技術 : HTML5, CSS3, 與最夯的 jQuery.


第六章介紹了 CreateJS Suite 套件, 這是以 Javascript 為基礎的網頁動畫函式庫, 用來簡化 HTML5 中撰寫動畫的 Javascript 語法. Adobe 也提供了 Toolkit for CreateJS 擴充套件可將 Flash 動畫轉換成 HTML5/CreateJS 語法. 參考 :

# http://www.createjs.com
http://www.adobe.com/go/downloadcreatejs
# Getting started with the Flash Professional Toolkit for CreateJS

其實這本書程式方面較弱, 應用篇主要在講如何用 jQuery 設計導覽選單與淡入淡出效果, 也就是 click(), hover(), 以及 fadein(), fadeout(), animate() 函式的用法罷了. 而比較篇則是介紹輪播效果以及介紹循序動畫的五種製作方法. (jQuery, CSS3, HTML5, Edge Animate, Adobe toolkit for CreateJS). 此書較適合網頁設計師.

比較有趣的是書末介紹了 Adobe Creative Cloud, 只要申請 Adobe ID 登入, 就可以付費取得 Adobe 軟體如 Photoshop CC, 透過雲端儲存空間與檔案同步能力, 與團隊成員或客戶分享創作概念與成果, 即使式行動裝置也可以. 透過 Behance 整合可以在專屬網站 URL 上發布作品集, 加入全世界最大創意社群. 不過費用不便宜 :

"取得我們的所有創意應用程式和連線行動應用程式,每月只需支付新台幣 960 元起", 學生四折, 每月 320 元.

# https://creative.adobe.com

摘要 :

  1. 將圖片變成半透明 :
    $("img").css("opacity",0.5);
  2. 選擇器 :
    $("選擇器 類別")
    $("選擇器 : 偽類別")
  3. jQuery 除錯 :
    console.log("OK");
    console.warn("NG"); //顯示警告訊息
    console.error("error"); //顯示錯誤訊息
    console.info("OK"); //顯示一般訊息
    console.clear(); //清除 console 視窗中所有訊息
    console.assert((x==1), "x != 1"); //當條件為 false 時輸出訊息







2015年4月16日 星期四

如何將 Win8 光碟放進 USB 隨身碟裡

現在很多筆電已經不搭載光碟機了, 特別是 Ultrabook, 如果系統毀了要重灌, 得找個攜帶式光碟機挺麻煩的. 如果筆電採用硬碟的話, 通常會把作業系統放在一個隱藏磁區, 做系統回復時只要一開機按 F6 甚麼的, 很快就回到過去了.

但我的 Ultrabook 是採用 SSD 的, 沒有隱藏的回復磁區, 而是隨機附一個 Win8 還原光碟. 這次系統毀損花了不少時間回復, 主要是只有兩個 USB 埠, 又要插光碟機, 又要插行動硬碟, 滑鼠就得退位了. 雖然已經製作了 USB 回復磁碟機, 但若要回復出廠狀態還是得用光碟機. 所以我就在想, 如何把還原光碟也放進隨身碟?

經這兩日摸索, 發現網路上許多解決方案, 不管是 WinSetupFromUSB, 還是製作 ISO 檔的工具 imgburn, 都有一個大問題, 這些工具程式都被掃出木馬或間碟軟體 (即使是看起來像是官方網站的也是), 拿這些免費工具製作回復光碟,  豈不請鬼拿藥單?

參考資料如下 : (請勿用這些文章所建議的軟體, 其中只有 Windows 7 USB/DVD Download Tool 是安全的)

當使用Windows 7 USB/DVD Download Tool製作USB開機碟出現"The Selected
# USB手指(隨身碟)安裝Windows-WinSetupFromUSB篇
# 如何建立Windows 7或Windows 8安裝使用的可開 機USB系統安裝專用碟
# WinSetupFromUSB:製作Windows 7及XP安裝隨身碟
# 當使用Windows 7 USB/DVD Download Tool製作USB開機碟出現"The Selected file is not Valid ISO File"

本來要用 Windows 7 USB/DVD Download Tool 這個微軟原版免費工具來做, 但是不管是用 UltraISO 還是 Windows7 內建的 ISO 工具所製作的 ISO 檔, 都會出現 "The selected file is not Valid ISO File" 訊息.

最後在下列網站找到一個軟體 Universal USB Installer :

# How to fix selected file is not a valid ISO file 

我用 VirusTotal 掃過是乾淨的. 先將光碟用 Win7 內建的 Create ISO image 製作 ISO 檔 (滑鼠點選光碟機後按右鍵) :


然後準備一個 8G 隨身碟, 再到下列網站下載 Universal USB Installer (下載點在最底下) :

# Universal USB Installer Free Download

此 exe 檔下載後直接執行, 選取 Windows 8 Installer, 按 Browse 鈕選取 ISO 檔, 然後選擇所插入的 8G 隨身碟 (注意, 一定要選對哈) :


按 Create, 就會讀取 ISO 檔內容燒進隨身碟裡. 注意, 隨身碟會先被格式化, 因此裡面如果有資料要先備份起來. 以後若要做系統回復, 只要用插入此回復碟, 以 USB 方式開機即可, 不用再四處找光碟機了.

參考 :

# 使用Windows 8.1內建工具來備份系統


2015年4月15日 星期三

Win8.1 執行 exe 檔等很久問題

為了要在應宏筆電上安裝 Ruby, 點了 exe 檔後卻一直在 waiting 中, 檔案總管就只是一個圈圈在轉, 剛開始還以為沒反應, 難道系統當機了? 開啟工作管理員, 發現 Antimalware Service Executable 這個程序佔了 20% 資源 :


按滑鼠右鍵, 點選 "開啟檔案位置", 可知此程序之程式檔是 C:\Program Files\Windows Defender 下的 MsMpEng.exe :


查了網路才知道原來這是微軟自 Win7 開始內建的安全防護功能 (Windows Defender), 預設為啟動. 安裝應用程式時就會耗很多時間去掃描是否為安全程式, 難怪一直 wainting. 如果不趕時間的話就讓它慢慢檢查, 完成後若沒問題就會出現安裝畫面了.

這個 Antimalware Service Executable 程序無法直接停掉 (Access Dinied), 須參考下列這篇文章將其列為除外程序 :

ANTIMALWARE SERVICE EXECUTABLE: HIGH CPU USAGE

首先將此程式的路徑複製下來 (在 "常用/複製路徑") :


然後在程式集 (我用的是 Classic Shell) 的 "Windows 服務" 下開啟 "Windows Defender" :


切換到 "設定" 頁籤,  貼上所複製的路徑 :


再按新增與儲存變更即可 :


停掉這程式的功能按理會使系統較不安全, 但是其他資安軟體像賽門鐵克也沒掃這麼慢啊. 微軟的技術能力是不是走下坡了?

參考 :

# win8使用心得 之 系統優化


2015年4月14日 星期二

Appfog 雲端開發環境新作法

今天心血來潮檢查了佈署在 a000z.biz 的股市機器人, 發現竟然掛點了, 原因是我的定時抓取與分析資料的程式流量太大, 超出免費的配額, 必須升級為付費用戶才能繼續使用. 後台還是可以登入的, 但是裡面的操作功能被拿掉了.

這 a000z.biz 算是好的, 讓我的系統重載跑了一季左右. 之前就不斷寄信來說, 恭喜我的網站流量宏大, 生意興隆 (天知道那全是 GAE 機器人製造出來的), 希望我能付費升級, 以免超過免費額度, 果不其然真的被停了.

它的付費制最低是每月 3.99 美金, 估量目前還不是付費的時候, 所以腦筋就動到以前申請的免費 Appfog 雲端主機了. Appfog 自 2014/3/20 起已經取消免費帳戶了, 但之前已申請並在截止日前有登入確認的, 還是能保留免費帳戶, 只是配額縮水了. 現在 Appfog 新用戶最低消費額是每個月 20 元美金 (Basic 方案), 折合台幣約 600 元, 比起一般主機來說是貴了點.

Appfog 雲端虛擬主機
AppFog 新用戶要收費了

Appfog 後台管理必須用到 Ruby, 參考了之前寫的文章, 下載了 Ruby 1.9.3 版 (建議暫時不要用 2.x 版) :

# Appfog 要用 Ruby 1.9.3
http://rubyinstaller.org/downloads/

但完成後下 gem install af 卻發現無法安裝 Appfog 管理程式 :

E:\>cd mysnowball

E:\mysnowball>gem install af
Fetching: eventmachine-1.0.7.gem (100%)
ERROR:  Error installing af:
        The 'eventmachine' native gem requires installed build tools.

Please update your PATH to include build tools or download the DevKit
from 'http://rubyinstaller.org/downloads' and follow the instructions
at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'

經查下列網頁才知, 光是 Ruby 不夠, 還必須先再安裝 Devkit 這個擴展工具 :

# Installing the AF CLI Tool on Windows
# Install Ruby and the Ruby DevKit

DevKit 下載位址與 Ruby 同一網頁 :


我下載的是搭配 Ruby 1.9.3 的 Devkit, 是個 7z 壓縮檔. 先在 C 碟下建立一個 Devkit 資料夾, 然後將此 7z 檔解壓縮在此資料夾下面. 完成後打開命令提示字元視窗, 切換至 Devkit, 執行初始化指令 :

c:\Devkit>ruby dk.rb init
[INFO] found RubyInstaller v1.9.3 at C:/Ruby193

Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.

此初始化指令會在 Devkit 下產生一個 config.yaml 檔, 用來指定要搭配的 Ruby 版本, 用記事本開啟內容如下 :

# This configuration file contains the absolute path locations of all
# installed Rubies to be enhanced to work with the DevKit. This config
# file is generated by the 'ruby dk.rb init' step and may be modified
# before running the 'ruby dk.rb install' step. To include any installed
# Rubies that were not automagically discovered, simply add a line below
# the triple hyphens with the absolute path to the Ruby root directory.
#
# Example:
#
# ---
# - C:/ruby19trunk
# - C:/ruby192dev
#
---
- C:/Ruby193

其實就是指定我們之前已安裝的 Ruby 1.9.3 版的安裝路徑而已, 以便下一步安裝開發工具時找到複製檔案的目的地. 接著就下達安裝指令如下 :

c:\Devkit>ruby dk.rb install
[INFO] Updating convenience notice gem override for 'C:/Ruby193'
[INFO] Installing 'C:/Ruby193/lib/ruby/site_ruby/devkit.rb'

這樣就安裝好 Ruby 開發工具了. 接著來安裝 JSON 藉以測試看看開發工具是否能用 :

c:\Devkit>gem install json --platform=ruby
Fetching: json-1.8.2.gem (100%)
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
Successfully installed json-1.8.2
1 gem installed
Installing ri documentation for json-1.8.2...
Installing RDoc documentation for json-1.8.2...

回應訊息有 "native extension" 表示開發工具運作 OK. 這樣就可以安裝 Appfog 的開發工具了, 但是卻出現 Error :

c:\Devkit>gem install af
Fetching: rb-readline-0.4.2.gem (100%)
Successfully installed rb-readline-0.4.2
Fetching: uuidtools-2.1.5.gem (100%)
Successfully installed uuidtools-2.1.5
Fetching: addressable-2.2.8.gem (100%)
Successfully installed addressable-2.2.8
Fetching: interact-0.4.8.gem (100%)
Successfully installed interact-0.4.8
Fetching: terminal-table-1.4.5.gem (100%)
Successfully installed terminal-table-1.4.5
Fetching: mime-types-1.25.1.gem (100%)
Successfully installed mime-types-1.25.1
Fetching: rest-client-1.6.8.gem (100%)
Successfully installed rest-client-1.6.8
Fetching: rubyzip-0.9.9.gem (100%)
Successfully installed rubyzip-0.9.9
Fetching: json_pure-1.6.8.gem (100%)
Successfully installed json_pure-1.6.8
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
ERROR:  Error installing af:
        ERROR: Failed to build gem native extension.

    C:/Ruby193/bin/ruby.exe -r ./siteconf20150415-2772-wnxdxi.rb extconf.rb
checking for main() in -lssl... no
checking for rb_trap_immediate in ruby.h,rubysig.h... no
checking for rb_thread_blocking_region()... yes
checking for ruby/thread.h... no
checking for inotify_init() in sys/inotify.h... no
checking for __NR_inotify_init in sys/syscall.h... no
checking for writev() in sys/uio.h... no
checking for rb_thread_fd_select()... yes
checking for rb_fdset_t in ruby/intern.h... yes
checking for rb_wait_for_single_fd()... yes
checking for rb_enable_interrupt()... yes
checking for rb_time_new()... yes
checking for windows.h... yes
checking for winsock.h... yes
checking for main() in -lkernel32... yes
checking for main() in -lrpcrt4... yes
checking for main() in -lgdi32... yes
checking for clock_gettime()... no
checking for gethrtime()... no
creating Makefile

make  clean
Makefile:165: *** target pattern contains no `%'.  Stop.

make
Makefile:165: *** target pattern contains no `%'.  Stop.

make failed, exit code 2

Gem files will remain installed in C:/Ruby193/lib/ruby/gems/1.9.1/gems/eventmach
ine-1.0.7 for inspection.
Results logged to C:/Ruby193/lib/ruby/gems/1.9.1/extensions/x86-mingw32/1.9.1/ev
entmachine-1.0.7/gem_make.out

看起來是無法建立 Native exteion 問題, 不知原因為何, 我以為是版本問題, 試著移除 Ruby 1.9.3, 改安裝 2.1 版還是一樣, 殘念 ~~~

試過公司的 Windows 7 安裝的 Ruby 1.9.3 沒問題 (本周末回鄉下時再用 Win7 系統的 AOD255 小筆電驗證看看), 以前在 XP 安裝 1.9.3 版也都 OK, 我懷疑跟 Win8 有關, 所以我看不要讓費時間在這上面, 反正程式要更新時再用 XP 或 Win7 系統即可. 或許過一陣子 Appfog 就解決此問題了.

# RubyGem 2.4.x and ruby 1.9.3 在DevKit時不合
# Installing the AF CLI Tool on Windows
# Installing AppFog client on Windows x64 with Ruby 2.0.0
https://bintray.com/oneclick/rubyinstaller/rubyinstaller/1.9.3-p545/view

2015-04-20 補充 :

昨晚在鄉下用 ACER XP 筆電與 D255 Win7 小筆電安裝 Ruby 1.9.3 版都失敗, 同樣是 extension 問題. 用 XP 桌電以前安裝的 Ruby 1.9.3 p545 可正常登入, 於是去找了 p545 來安裝還是不行. 可見不是作業系統問題, 也不是 Ruby 版本問題, 應該是 Appfog 的 af 安裝時程序跟以前不同造成的. 我想不用再花時間去研究了.



小蘋果

每年尾牙幾乎都會有當年度的熱門舞曲, 今年是大陸製的小蘋果. 起初我對這種流行音樂不感興趣, 甚至對到處都在學跳小蘋果的流行現象有點反感.

會注意到這首舞曲, 主要是前些日子某天, 菁菁在搜尋歌曲時, 播放了 Youtube 上的 MV, 我注意到裡面的韓籍舞者裴瑟琪, 怎麼看都覺得她的舞步很特別, 一查才知道她在南韓是有名的復古女王. 復甚麼古呢? 就是傳統類似迪斯可那種自由發揮, 隨著強烈節奏盡情搖擺的舞蹈.

我通常是在流行退過後才會去注意它, 是出了名的慢半拍. 很奇怪厚.

# 筷子兄弟-小苹果 MV
The Little Apple 小苹果 MV (无对白版) 1080p HD 高清
# 小苹果舞蹈排练版
T-ARA(티아라) & Chopsticks Brothers - Little Apple OFFICIAL MV(1080P)
# 【 Demo】The Little Apple 小蘋果 Cover Dance


Chrome 封鎖下載問題

今天要下載 MP3GAIN 來調整音量時, 發現 Chrome 會將其認為是惡意檔案而予以封鎖, 導致無法下載 :


經爬文後才知道這是可以解除的, 參見:

# Chrome浏览器提示下载文件是恶意文件chrome已将其拦截怎么办

原來只要在 Chrome 右下角點 "顯示所有下載" :


然後按 "還原惡意檔案" 即可恢復下載 :



還債

晚上到樓下管理室去跟五樓住戶藍先生談車子修復賠償問題. 起因是上周四晚上要去載菁菁時, 在 B1 停車場騎了機車剛出發, 才繞過電梯間就被五樓住戶開車撞倒, 整個人從機車上摔下來, 那人有下來問身體有無受傷, 我站起來後, 手腳動動感覺似乎無異樣, 但是機車車頭的塑膠板歪了, 也破了個洞, 對方前保險桿也是一個洞. 出事問題在於車道旁的電梯間形成死角, 又沒有鏡子, 很容易在轉角處互撞. 所以我習慣都在出入停車場時先按兩聲喇叭, 以便警告對方來車. 但對方從外面回來溜下車道時未按喇叭, 所以我以為沒車, 但卻在出轉角時赫然發現一台車衝過來, 根本來不及剎. 還好那人有緊急剎車.

由於要去接菁菁, 所以只說再連絡, 沒有當場跟他喬責任與賠償問題. 結果次日睡覺起來才發現左右手臂跟屁股痠痛, 左手拇指無力, 雖仍可活動, 但是無法往後彎, 拇指根部關節壓下去會很痛, 但不壓不彎又沒啥感覺. 不過洗澡或提垃圾去丟就不能用左手, 除此之外別無外傷, 實屬萬幸. 因每天都有節目要忙, 所以也沒時間去看中醫傷科.

週五晚上管理員來電問我, 是否週四有跟五樓住戶相撞, 對方藍先生說他車子保險桿有去估修理費 3000 塊, 問我何時有時間協商. 我一聽哇咧, 我還沒空去看醫生呢! 於是周六早上抽空把車騎去給袁老闆估價, 袁老闆說大約一千塊, 若加上斷掉的左剎車把, 約 1500 上下.

接著去齊祥看傷科, 醫生說是筋膜拉傷, 建議針灸, 但我想還是貼藥布就好了. 約今天晚上 09:30 協商. 我一下去就問我這件事情該怎麼處理, 我說我機車估約 1500, 拇指受傷部分貼藥布再複診, 他一聽馬上說 : "你的意思是說要我負責醫藥費囉, 醫藥費先不談, 先來談車子修復費, 我保險桿修理費 3500", 我說 : "你不是跟管理員說 3000 元嗎? ", 他回道 : "他聽錯了". OK, 3500.

他接著說 : "兩個人都有責任, 3500 減 1500, 你是不是要賠我 2000?", 我說 : "雙方都有責任沒錯, 但那是死角, 你從上面開下來也應該鳴喇叭不是嗎?". 他的回答很經典 : "我的喇叭改裝過, 非常大聲, 所以沒有習慣鳴喇叭. 如果你要理論, 要吼, 是壓不過我". 我也沒要吼啊, 只是爭個合理而已. 他說他是駕訓班教練, 這種糾紛遇到很多了.

他擺出的架式, 我明白我是沒辦法跟他理論了, 我說 2000 要我全付我不同意, 他就說那就 1500. 我說那我的手受傷部分, 醫藥費是否該分攤呢? 他語氣馬上轉溫和, 說 : "大家都有點年紀了, 要多運動, 我平常都跑馬拉松, 你呢?", 我說慢跑. 然後起身準備上樓, 轉頭說, 你 1500 就交給管理員轉交. 我跟上去追問, 那醫藥費呢? 他的回答很有趣 : "醫藥費就不要再談了 ...". 哇.

在電梯裡還說, 要多運動! 我只能苦笑. 我又不能怎樣.

回來後越想越鬱卒, 我完全陷入他的話術裡了! 而我想反擊卻不知如何反擊, 真是窩囊. 整個晚上都非常不開心, 就在不開心到極點時, 突然想到, 這世間總有你無法應對之人, 這或許就是前世的債吧! 還給他不就輕鬆了?

大師, 我懂了. 呵呵.

* 2015-04-14 補注 :
今早在辦公室跟同事們談起這件事, 蔡樣說從沒聽過責任相當的車禍, 小車竟然賠大車. 可以找里長辦公室協調, 如果對方只想要我們賠車損, 卻對醫藥費淡然處之, 可以告他傷害. 聽後讓我一度想找曾擔任法官現已轉任律師的堂哥問問看意見. 但隨後又想, 藍教練看來是老江湖, 我們雖已知天命, 但仍然是沒見過多少世面的嫩薑, 這樣搞下去會耽誤我很多正事, 所以打算還是學習烏龜的兒子的兒子的辦法, 當龜孫子好了, 就真的是欠他的啦.
晚上這位藍教練九點多下班後經過管理室發現 1500 元沒有到手, 就叫管理員打電話上來, 問我說那 1500 元呢? 我回答說您還沒回答我醫藥費問題呢! 他就避而不談, 氣急敗壞地質問, 那昨天談的都不算數了齁? 那種口氣就像是流氓威脅一樣. 我因要幫菁菁複習明天月考的數學, 不堪其擾, 乾脆拿了個信封袋裝了 1500 元拿去管理室交給他. 他說要簽和解同意書 (怕我告他傷害吧), 我回明天再說. 也罷, 花錢消災.


2015年4月13日 星期一

凱基證券匯入憑證出現 5206 權限不足問題

今天筆電時光回復後, 想到兩個跟 IE 綁在一起的理財服務, 一是郵局的 WebATM, 拍賣轉帳時要用, 二是凱基證券的線上憑證更新.

郵局 WebATM 只要將提款卡插入讀卡機連結電腦, 上郵局 WebATM 網站就會跳出安裝附加元件視窗, 安裝後就可以找到讀卡機了. 但凱基的憑證中心即使安裝了所要求的元件, 最後要匯入憑證時卻出現 5206 權限不足錯誤. 查了網路資料, 才知必須以管理員權限開啟 IE 瀏覽器才行 :

http://www.kgieworld.com.tw/service/Service_3_6.aspx?frm=08#01


這個開始選單是我所安裝的 Classic Shell (免費軟體).


應宏 Inhon Carbon Book 系統還原

這台 Ultrabook 從去年十月底買來用到現在堪稱滿意, 價格低 ($15900 優惠價) 性能高, 而且半年來平常幾乎都沒在關機, 闔蓋就休眠, 開蓋按電源鈕馬上回復可用狀態, 是我專案開發的好幫手. 但周五去黎陽正要整理讀書筆記, 卻出現如下畫面無法開機 :


錯誤訊息是 "The Boot Configuration Data file is missing some required information", 錯誤碼是 "0xc0000034", 意思大概就是啟動時系統找不到 BCD 啟動設定檔. 重開了好幾次都沒輒, 害我沒辦法工作, 只好看 Line 訊息.

回家後找出原廠附的 Win8 光碟, 接上行動光碟機, 放入 Win8 光碟後重新開機, 但要在按下啟動鈕時立刻按住 F12, 然後出現詢問是否選擇光碟 DVD 開機時按下 Enter, 這樣才會從外接光碟開機. 這樣就會從光碟回復 Win8 到 SSD 的 C 碟.

回復到出廠的 Win8 後, 想說就直接從行動硬碟的映像檔回復到 Win8.1 吧! Win8 的系統還原跟 Win8.1 不同, 是在 "控制台/Windows7 檔案修復" 裡, 不過要先將控制台右上方的檢視方式由類別改為小圖示, 點選 "Windows7 檔案修復", 在中間 "還原" 項下 "選取其他用來還原檔案的備份" 即可. 但很奇怪地, 這樣行不通, 結果會失敗, 必須要升版到 Win8.1, 但在此之前須先去做 Windows Update, 才能升版到 Win8.1.

本來想依據之前的開發工具安裝程序一個個重新安裝 :

# Carbonbook 系統更新與軟體安裝紀錄

但這太麻煩了, 以前系統都裝好時有做過系統映像檔 (約 20G), 存在行動硬碟中, 如果能從這映像檔回復就太好了. 回復 Win8 後本想直接從映像檔回復到 Win8.1+開發工具 OK 狀態, 但 Win8 跟 8.1 有差, 實在很難操作, 所以乾脆先線上升版為 8.1 後再來從映像檔回復.

我是參考下面這兩篇作法來從映像檔回復到過去狀態的 :

使用Windows 8.1內建工具還原系統
如何在Windows 8.1中,還原已備份的Windows 8.1映像檔?

不過這次當機讓我覺得系統回復需要準備一台行動光碟實在太麻煩, 爬文研究後發現原來可以先找一顆 USB 隨身碟來製作 Win8.1 的 USB 修復磁碟機, 這樣以後電腦無法開機時, 只要插入此 USB 即可進入系統修復畫面了. 參考下列文章 :

如何製作Windows 8.1系統修復的USB磁碟機?
# 建立 USB 修復磁碟機
# 雲南白藥:Win8.1如何使用緊急修復磁碟機

於是找了一個 1G 的隨身碟清空後插入筆電, 同時把存有系統映像檔的硬碟插在另一個 USB 槽 (因 Carbonbook 只有兩個 USB 槽, 所以必須先拔掉無線滑鼠, 使用觸控板), 然後到 "控制台/檔案歷程紀錄/修復/建立修復磁碟機", 系統會搜尋目前掛載的磁碟, 點選隨身碟後按 "下一步", 再按 "建立" 即可. 使用 1G 是因為建立 USB 修復磁碟機至少需要 512MB 容量之故. 建立後實際量大概 370MB 左右 (裡面有 boot, efi, sources 三個目錄, 以及 bootmgr, bootmgr.efi 兩個檔案), 所以如果找得到不用的 512M 隨身碟應該還 OK.

製作好 Win8.1 開機 USB 後, 重新開機, 同時按下 F12 選擇從 EFI USB 設備開機 :


這樣就會進入 Win8.1 修復畫面, 先選擇語言 (微軟注音或繁體中文), 選擇 "疑難排解/進階選項/系統映像修復/", 系統映像修復選擇 Win8.1, 然後選取存在行動硬碟的系統映像 :


按下一步, 點選 "排除磁碟", 勾選開機用的 USB 隨身碟為排除對象 (因我們只是要修復 C 碟) :


按下一步, 再按是即開始從映像檔還原 :


詳細請參閱 :

使用Windows 8.1內建工具還原系統

我前兩次還原失敗 (系統映像還原失敗: 錯誤碼 0x80070057 與 0x80780017), 第三次就可以了, 也不知原因是啥.

週六剛好燦坤特招, Sandisk 64G 降價至 799 元, 趁機買回來取代原來那片威剛的 16G 卡, 擴充資料碟容量. 今天有先將映像檔從行動硬碟複製到此 SDHC 卡中, 但用 USB 開機後, 復原操作畫面卻抓不到此 SDHC 卡內的映像檔, 一定要用行動硬碟才行. 我猜可能是用 USB 開機的話並未掛載內建的 SD 讀卡機驅動之故.

至於在 Win8.1 要如何製作系統映像檔, 可參考下列文章 :

# 使用Windows 8.1內建工具來備份系統

注意 Win8.1 與 Win8 不同, Win8 是在 "控制台/Windows 7 檔案修復", 但 Win8.1 卻是在 "控制台/檔案歷程紀錄/系統映像備份", 然後選擇把映像檔建立在另一顆硬碟上, 例如 2.5 吋外接 USB 硬碟就可以, 但插在 SD 卡插槽的 micro SD 卡卻讀不到.

經過這次系統修復, 也才確認原廠的回復光碟與自建的系統映像檔是 OK 的, 也學會如何建立 USB 修復磁碟機, 這樣以後系統又毀損時就不用到處找光碟機了, 只要利用 USB 修復磁碟機開機, 再用行動硬碟中的映像檔回復即可.

如果能把原廠的 Win8 光碟也做成 USB 那就更方便了, 以後完全不必再靠光碟機, 參考 :

Windows 8 製作USB安裝隨身碟的軟體WiNToBootic

有空再研究了.

*2015-04-14 注 :
此軟體 WiNToBootic 經 VirusTotal 掃描有特洛伊木馬, 網友實際監控也發現會偷偷連網中國 ip, 而且實作有人說完全無效, 強烈懷疑這是釣魚軟體. 還有一款叫做 WinToFlash 也是, 都有木馬, 千萬不要下載. 這種軟體居心險惡, 每次系統回復他又還魂了.

我另外開源的 Windows USB/DVD Download Tool 軟體, 完全無檢出, 這比較保險.


2015年4月12日 星期日

第 15 周記事

每個禮拜好像都很忙, 但是感覺完成的事卻屈指可數. 週六回鄉下時帶了一堆電子零件與書, 事實上開卷率是 0, 發電機也沒時間安裝. 所以我覺得以後鄉下的周末不要好大喜功, 能完成兩件事就很欣慰了.

早上到養護中心繳本月月費, 計 $16900 (不足月之故, $15400 + 體檢費 $1500), 今日要趕回去包水餃, 所以只推阿蘭出去曬一下太陽, 吃一下蘋果, 就回去了, 沒有待很久. 下午小舅跟阿娟他們來, 想起上回小舅說開車要出大門時, 左方視線會被蓮霧樹的枝枒遮住, 比較不安全, 馬上找出鋸子把路邊的蓮霧修整一番.

早上起床後去菜園撿了一大袋蝸牛, 奇怪, 怎麼老是撿不完呢? 第二批的 16 株玉米已經有一株開花了, 可惜忘了帶手機拍下來. 茄子也開出藍色小花, 留第一朵花下兩分枝, 其下均摘除. 我看杓菜與新種的地瓜葉已經非常茂盛, 摘了各四把, 加上姑婆的孫媳送的西瓜兩顆, 上市場時順路帶去給大阿姨跟阿嬌姊. 蕃薯藤我也沒浪費, 下午鋤了一行給種下去, 這幾日雨水稍多, 很快就會長出綠油油的嫩葉, 地瓜葉真是聖品啊.

屋後的新浴室已啟用, 洗髮乳架我已安裝好, 但鏡子卻不適用, 又要帶回小北換了, 這兩周已換貨兩次, 我看店員可能認識我了.

2015年4月9日 星期四

一生一定要為孩子準備的 83 種聰明健康餐

這本書借自河堤分館, 李敏, 陳敏著, 華威國際出版. 裡面有一些之前沒讀過的飲食知識, 心得整理如下 :
  1. 西方醫學之父希波克拉底 : 智者應是健康為人類最大福祉. 但人通常要到一病不起時, 才知道健康原來是生命裡勝過一切名利的東西.
  2. 早餐一定要吃好, 要吃脂肪含量低的食物, 如水果或新鮮果汁, 稀飯, 炒麵, 麵包等. 糖和澱粉食物會使腦中血清素增加, 其鎮靜作用會使人的智力在上午達到高峰.
  3. 成長中孩子的營養原則為 : 高醣, 高蛋白, 低脂. 孩子在學習時, 大腦消耗的能量主要是醣類. 
  4. 讀書眼睛易疲勞, 宜多吃胡蘿蔔, 豬肝, 紅棗, 白菜等富含維生素食物.
  5. 茄汁海鮮菠菜湯 :
    番茄一顆, 蟹腿肉 150 克, 蛤蠣 5 粒, 菠菜 200g, 蔥段, 薑片, 太白粉, 香油
    水煮開放入切塊之番茄與蟹腿肉, 切段之菠菜, 加入蛤蠣與調味料, 用太白粉勾芡即可.
  6. 菠菜富含維生素 A, C, 與 B 群, 是健腦蔬菜, 可預防貧血. 菠菜與雞蛋同煮相宜, 但不可與豆腐同煮或同餐食用, 因其大量草酸易與豆腐中氯化鎂, 硫酸鈣結合成草酸美與草酸鈣, 易造成結石.
  7. 鳳梨凍做法 :
    鳳梨頭部切掉挖空內部, 果肉切丁. 洋菜泡水後煮溶, 加入砂糖煮至溶化, 加入鳳梨丁煮開後冷卻放入冰箱.
  8. 大蒜本身雖不含維他命, 但可和維生素 B1合成蒜胺, 可促進維生素 B1 之功用, 為腦細胞提供能量.
  9. 和風醬的作法 :
    橄欖油 50cc, 米醋 20 cc, 水果醋 5cc, 味淋一匙, 白芝麻 10g
  10. 傷害腦力的食物 :
    爆米花 (製造過程會混入鉛, 使智力降低), 皮蛋 (含鉛), 油條 (含鋁, 傷害記憶力), 糖精 (含苯酐), 味精 (使腦細胞反應遲鈍, 記憶力下降), 酒精, 過多甜食, 泡麵, 洋芋片, 青蔥 (久食令人多忘), 芫妥 (香菜, 損記憶力). 
  11. 大豆含不飽和脂肪酸與卵磷脂, 能修補腦細胞. 但生大豆含抗胰蛋白酶與凝血酶, 不宜生吃.
  12. 香煎鮭魚作法 :
    鮭魚片用鹽與黑胡椒醃一小時, 油煎八分熟去除腥味即可.
  13. 苦瓜的苦味含抗瘧疾的奎寧, 能控制體溫中樞, 有清熱解毒功效. 
  14. 爛薑, 凍薑不要吃, 因薑變質後含有致癌物 (黃樟素).
  15. 蒜粒茶油雞作法 :
    土雞整隻去頭爪, 大蒜半斤去皮填入雞腹, 開口處用線縫幾針, 煎鍋放入茶油, 將雞放入以中火慢煎, 至表皮呈金黃色, 筷子可穿過即熟透.
  16. 俗語說 : 杏一益, 梨二益, 木瓜有百益, 木瓜含十七種以上胺基酸, 可阻止致癌物亞硝胺形成, 對考生有消暑, 防流感功效. 
  17. 優酪乳宜飯後兩小時食用, 因空腹胃酸會殺死乳酸菌. 
  18. 番茄所含維生素C 因為有有機酸保護, 在烹調過程中不容易被破壞. 
  19. 生薑紅糖水只適用於風寒或淋雨後之感冒. 
  20. 因奇異果含維生素C量高, 易與乳製品中之蛋白質凝結成塊導致腹脹消化不良, 故不宜同食.
  21. 蜂蜜宜用玻璃罐儲存, 不可用鐵罐. 蜂蜜忌高溫, 加熱軟化時不要超過 60 度, 否則會破壞其生物活性. 
  22. 小米是所有穀物中色胺酸含量最高者, 可促使大腦分泌令人欲睡之神經物質五羥色胺. 小米熬熟冷卻後加入蜂蜜, 睡前一小時服用可助眠.
  23. 核桃富含卵磷脂與不飽和脂肪酸, B 群與微量元素, 可治療神經衰弱, 健忘與失眠. 
  24. 魚丸番茄瘦肉湯作法 :
    瘦肉切片川燙, 番茄切塊, 與魚丸加水同煮, 加薑蔥與鹽等調味煮熟即可. 
  25. 芒果不宜多吃, 多吃傷腎. 芒果帶濕毒, 皮膚病或換腫瘤者不宜食用. 
  26. 女性經期不可食用辣椒, 因會加重骨盆腔充血導致經痛. 亦不宜食用酸性食物, 因其有收斂特性會使血管收縮引起經痛.
  27. 香蕉性涼, 與柿子, 西瓜同為三大寒涼水果, 女性經期忌吃. 



Raspberry Pi 的 HDMI 轉 VGA/DVI 輸出

週二去還書前, 把待還的 "Raspberry Pi 快速上手指南" 稍微掃了一遍, 裡面提到此板可以透過轉接線轉成 VGA 或 DVI 介面, 這樣就可以接到電腦螢幕去了. 我檢查了家裡的 LCD 螢幕, 確實有這兩個介面. 一般 HDMI 轉 VGA 較貴, 大約 200~500 之間, 最便宜的也要 $145 元 :

# ★樹莓派專賣店★綠聯 UGreen HDMI轉VGA 含音源輸出 外接電源 Raspberry Pi 2 $460
# <微控制器科技> HDMI轉VGA轉換器 附音源線 Raspberry Pi $240 
最穩定版晶片 VD-127 HDMI 轉 VGA + 3.5 耳機 轉接線 平板 筆記型電腦 $145
# 【台南批發】 HDMI轉VGA 原裝晶片 附音頻線 Raspberry Pi/PC/投影機/電視盒 均可用 $160

後來發現, 如果已經有 HDMI 線, 只要買下面這種 40 元的 HDMI-DVI 轉接頭就可以了, 是最便宜的連接方式 :

《耀升》【原 東東大批發】鍍金口【 24+1】DVI轉HDMI HDMI母轉DVI公 轉接頭 $40

若加上 100 元以上的 HDMI 線就跟上面的沒差了.




不過實際測試發現, 不是每一台顯示器都有效, 高雄 LG 24M35 與鄉下的 Samsung 就不行, 而高雄 Acer 與 公司 ASUS 都可以. 

參考 :

# RaspberryPI : 用 HDMI to VGA 接電腦螢幕
排除 Raspberry Pi 無法使用 HDMI to VGA 的問題
Raspberry Pi:我最常被詢問的問題「螢幕一片漆黑」
# Raspberry Pi 筆記(一):螢幕無法呈現及HDMI轉接線忽黑忽亮問題
# Raspberry Pi 購買指南(6/10):購買零配件 -- 影音端子
# 快速C10+U1*Micro SDHC 8G TF記憶卡/ Class4 $95


2015年4月7日 星期二

第十四週記事

連續假期四天很快就過去了, 我沒辦法像一般人那樣出遊, 因為有好多事情要做.

週六因姊姊與二哥還要補習與完成志工時數, 所以我跟菁菁周五早上就回鄉下了, 馬上巡視菜園, 發現玉米已經開花, 長出長長的鬚了, 想到書上說每一根鬚授粉後都會變成一顆顆玉米粒, 雖然很想去摸, 但還是忍住了.

玉米的雄花

玉米的雌花

而剩下的 6 株奶油洞洞白菜全部採收, 感覺應該上週就採完, 過了一周似乎有點老了, 煮湯還可以煮爛些沒關係, 以後絕不再種這種容易被蟲吃的青菜 :


茄子長至膝蓋高, 4/6 下午岳母來時看見側葉與側芽這麼多, 就動手摘除了 :


本周最重要的一件事是週日 (4/5) 載阿蘭去養護中心試住, 兩天下來據工作人員與護理師說她還蠻乖的, 看來應該還可以適應. 安置阿蘭到機構是遲早該做的事, 但過去條件不成熟, 我對補助程序也不甚了解, 直到去年媽住院後, 在小舅媽關心與社工的協助下, 經過半年多的摸索與努力, 終於有安置機構可去了. 每月費用基本上是 18000 元, 雖然對我的財務有些負擔, 但這是必須要承擔之事.

另外, 風力發電機已完成底座安裝, 下周再進行裝機.


架設風力發電機 part1

之前寫過兩篇關於風力發電的網誌兩篇如下 :

關於風力發電機 (2015-03-12)
# 自製風力發電機 (2014-01-13)

源自 2014 年初因為在露天看到有人賣小型直流發電機含葉片, 就想要在鄉下老家的屋頂上實驗性地架設一個自製的風力發電系統, 但事情總是忙不完, 計畫也就擱著了. 我所謂的自製不是從無到有, 而是購買現成的發電機再組裝供電系統, 我哪有時間自行繞線啊, 況且在學校也沒學過繞線, 只是紙上談兵而已.

直到上個月終於出手了, 花了 $450 元購買了那組小型直流發電機含葉片的套件. 但是很令人失望的, 我在高雄住家八樓迎著我認為不太小的風, 葉片硬是聞風不動, 我想可能是葉片太短, 啟動風速較高. 本來已打算放棄風力發電, 把發電機移作水力發電用. 前兩周將整組帶回鄉下, 當我站在二樓頂舉起機組迎向午後強勁的西南風, 它竟然轉起來了, 而且突破啟動風力後只要風力沒有降太多, 只要一點風便能維持轉動, 風力強時更是轉得飛快. 這又讓我重燃信心.

今天 (4/4) 在樓上量測圍牆尺寸後, 繪製了一張發電機基座繪製了去鎮上五金行買了發電機固定底座要用到的角鐵 (一條 $170), 螺絲螺帽與半圓箍 (約 $30), 合計 200 元. 加上發電機與葉片組 $450, 到目前成本是 $650.

四組較短的螺絲組用來將兩條橫梁固定在四個柱子上, 而四個長的螺絲組則用來將木板鎖在橫梁上 :


角鐵裁成 4 個 50 公分長的柱子, 以及兩個 25 公分的橫梁 :


我找二哥來幫忙鑽洞, 將角鐵鎖在頂樓圍牆上, 下面是發電機底座的完成圖 :


這個禮拜就做到這邊.

2015年4月2日 星期四

Arduino 網路測試 : 發送 Twitter

今天終於有時間來玩 Arduino 最好玩的部分-網路服務了, 這是物聯網的一部份, 只要 Arduino 能上網, 各種奇怪好玩的創意都可以透過網路來實現.

第一步就來測試由 Arduino 來自動發送 Tweet. 以前我對推特沒啥特殊印象, 我覺得跟 facebook 一樣, 就是關注別人在幹啥+期待別人關注自己在幹啥. 但不管發了多少 Tweet 或按了多少讚, 事實上, 人都是孤獨的. 我沒那麼多鳥時間來上 facebook 跟 twitter 啦.

但開始做 Arduino 實驗後, 我就注意到幾本書上提到了 Twitter :
  1. Arduino 自造指南 (Arduino Workshop) :
    第 19 章 project#61 : 建造一個 Arduino Twitter 發送器.
  2. Arduino 完全實戰手冊 (Arduino in Action) :
    第 8.3 節 : 發出訊息到 Twitter
  3. Arduino 錦囊妙計第二版 (Arduino Cookbook) :
    第 15.12 節 : 傳送 Twitter 訊息
這三本翻譯書都不約而同用到 Twitter, 讓我對推特開始改變看法, 原來 Twitter 有提供 API 給第三方應用使用, 透過 OAuth 開放授權標準, 程式也能發出 Tweet.

以下是 "Arduino 自造指南" 這本書的作法. 需要的材料就是一塊 Arduino, 一塊 Wiznet5100 乙太網擴充板, 使用 UNO 的話很方便, 兩塊板子疊在一起就行了.

首先要去 Twitter 申請帳號 (自己指定的 Email) :

# http://twitter.com/

然後以帳號密碼登入 Twitter. 接著到下面這個第三方網站, 授權讓我的 Arduino 可以透過它存取我的 Twitter :

# http://arduino-tweet.appspot.com/


這網頁底下有一些關於 Twitter 的限制 : 一分鐘內只能發送一個推文, 而且前後兩筆推文內容不可雷同. 此外, 每一個推文需在 140 字以內.

如果已經登入 Twitter 的話, 點 Step 1 超連結會出現 :


按 "授權應用程式" 就會得到一個 Token (令牌), 將其記錄下來 (Arduino 程式要用) :


如果尚未登入 Twitter, 會出現帳號/郵件+密碼登入框, 請先輸入 Twitter 帳密再按 "授權應用程式" :


這個第三方網站 arduino-tweet 是一個中介的角色, 作為 Arduino 的 proxy server, 在 Arduino 與 Twitter 間建立溝通的橋樑, 溝通的憑藉就是所申請的 Token. 此令牌讓我們不需要提供自己的 Twitter 帳號密碼給此第三方網站, 它就能存取我們的 Arduino 與 Twitter 資料.

點 Step 2 的超連結下載 Arduino 的 Twitter 的函式庫 :

# http://playground.arduino.cc/Code/TwitterLibrary
http://arduino-tweet.appspot.com/Library-Twitter-1.3.zip


將 Twitter 函式庫解壓縮後是一個 Twitter 資料夾, 將其複製到 "文件/Arduino/Library" 下. 但是要注意, 若在此之前已經打開 Arduino IDE 先編輯好程式, 則編譯將會失敗, 說找不到 Twitter.h 這個函式, 請關掉 IDE 再重開就可以抓到 Twitter.h 函式了 :


這樣便可以開始寫 Arduino 程式了, 這裡將 "Arduino 自造指南" 這本書的 project 61 稍作修飾如下 :

//Arduino Tweeter
#include <SPI.h>
#include <Ethernet.h>
#include <Twitter.h> //第三方函式庫
byte ip[]={192,168,2,106};
byte mac[]={0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02};//指定網路卡 MAC 位址 (隨便設)

//建立 Twitter 物件
Twitter twitter("56122**************************************0Nuv10j");
char msg[] = "Hello World!"; //要傳送的 Tweet
void setup() {
  delay(30000);
  Ethernet.begin(mac, ip); //乙太網路介面初始化
  Serial.begin(9600); //設定 SPI 介面速率
  }
void loop() {
  Serial.println("connecting ...");
  if (twitter.post(msg)) { //傳送 Tweet 給 Twitter
    int status = twitter.wait();
    if (status == 200) { //傳送成功
      Serial.println("OK.");
      }
    else { //傳送失敗
      Serial.print("failed : code ");
      Serial.println(status);
      }
    }
  else { //無法連線 Twitter
    Serial.println("connection failed.");
    }
  do {}
  while (1);
  }


將程式編譯上傳後, 在 Twitter 網頁就會看到 Arduino 推送的訊息 "Hello World!" :


Bingo! 大功告成.

當然這只是初步實驗, 應用方面我們可以使用紅外線感測器, 當偵測到有人經過時就送出推文, 這樣透過 Twitter 就能知道是否有人闖入了.