2014年10月31日 星期五

PDF 印表機

一般列印是輸出到真實印表機, 但在外使用筆電時, 若須保存網頁內容, 例如網上刷卡購物交易憑證, 我都是先把網頁輸出到 PDF 印表機成為一個 PDF 檔案, 再存到隨身碟, 有機會再真正列印出來.

以前曾用過一款 PrimoPDF 印表機, 但不斷升版後越來越花俏, 反而失去簡潔的優點. 今天於下面這篇找到兩個不錯的 PDF 印表機 : Bullzip 與 Print2PDF9 PDF Printer, 安裝使用後覺得各有千秋, 很不錯 :

# The best freeware virtual PDF printer: a comparison

Bullzip 有免費 (community edition, 9 個使用者的公司) 與收費版本 (professional edition), 最大的差別是, 專業版有 append 功能, 亦即當列印的檔名已經存在時, 新的會串在後面. 這點很吸引我, 因為當我要將電子雜誌輸出成 pdf 檔時, 因為 ZINIO 只能一次輸出兩頁, 若一篇文章有三頁, 用別的 PDF 印表機就會輸出兩個 PDF 檔, 而用 Bullzip 就可以整合為一篇文章一個檔. 可惜免費版不支援此功能.

該篇文章作者極力推薦的是 Print2PDF9, 因為其版面設計簡單直觀, 且提供一個很棒的功能,  可以在輸出的同時, 也將 PDF 檔郵寄給指定的收件者, 這個功能也是我需要的, 因為我這樣就不需要另外開寄信軟體或 Web mail 網頁上傳 pdf 檔了, 所以我也是用這款. 當然這個功能必須事先設定好 SMTP 伺服器與收件者才行 :

選擇 Print2PDF 印表機

設定寄件者, 收件者, 與郵件主旨內容

設定 SMTP 伺服器

這功能實在是一個大優點, 因為我都在看完今周刊後, 把值得收藏的篇章用這個方式寄給爸閱讀 (副本給我自己的 Gmail 備查), 因為我買給他的 iPad, 他最常用的功能就是看 Gmail, 因為安裝的 ZINIO 有一點複雜, 所以較少看, 而且一期這麼多文章也看不完, 我只挑保健與財經文章給他看.


2014年10月30日 星期四

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

之前才說要把我的 AOD 260 小筆電操到掛才會去買新筆電, 但上週四 (10/23) 卻下手買了 11.6 吋 Ultrabook (應宏 Carbonbook). 原因是 :
  1. AOD 效能已無法忍受 :
    上週一開無聊的會議時, 想說順便將小筆電的 GAE SDK 升版, 兩小時會議結束時還沒安裝完成. 每天我可運用的時間都很零碎, 短短的 20 分鐘也可以用來改一下程式, 但是小筆電光是開機, 插入隨身碟, 打開 SDK 等工具就用掉 5,6 分鐘, 轉移陣地時又要關機, 插拔隨身碟, 實在吃掉不少時間. 我希望筆電一打開蓋子就能立刻上工使用, SDK, 編輯器, 瀏覽器, 電子書等等都已 ready, 馬上就可寫程式; 一闔蓋就休眠, 保持電池最大續航力. 這只有 Ultrabook 符合要求. 
  2. 資安要求使開發系統阻礙陡增 :
    為了符合越來越嚴格的資安, 辦公室電腦不能再安裝伺服器, 自行開發工作輔助系統只好自備筆電, 完工後再上傳公司伺服器, 免得 MIS 為難跟找麻煩. 
這台 Ultrabook 為 Intel i5 CPU, 4G DRAM, 128G SSD. 10/29 日收到新筆電後就開始動工更新系統與布置開發環境. 這款筆電預載的是 Win8, 不是最新的 Win8.1, 要先做 Windows Update 後, 才能到市集更新為 Win8.1. 注意, 做 Windows Update 前必須先將地區改為台灣 (預設加拿大), 語言改為繁體中文, 最後將日期時間設定正確, 否則無法順利更新, 參考 :

Windows Update 錯誤 80072f8f

開機後先做系統設定, 輸入 Win8 的金鑰 (印在機底標籤上的 Product key), 選擇自訂設定 (不要用快速設定, 那樣會傳送較多資料給微軟, 如果不介意的話就 OK), 設定完成後登入電腦即可.

做完系統設定登入 Win8, 發現它只有一個 C 碟, 也就是全部 128G 的 SSD 不分割, 通通都給系統使用. 在桌機我們都至少有一個 D 碟存放資料, 只有 C 碟萬一系統須還原重灌, 資料不就 .... 本來想分割 SSD 的一半做 D 碟 (在磁碟管理中執行磁碟壓縮), 但看了下列三篇文章後決定不壓縮了, 把右邊 mcro SD 讀卡槽的 TF 卡當作 D 碟用即可 :
  1. SSD可以分割嗎?
  2. ssd做系統碟需要做分割嗎?? 
  3. 想購入SSD M5S 128G,關於分割
  4. SSD分割了Partition後測試分數底了很多
不過我發現, Drive 標籤似乎 TF 卡槽固定為 E 碟, 而左右各一的 USB 槽先插的會被指派為 D 碟, 後插的為 F 碟. 所以 USB 都沒插隨身碟/硬碟/讀卡機時, 就只有 C, E 兩碟而已.

升版到 Win8.1 後, 還要到控制台再做一次 Windows Update, 全部更新完後 (包括兩個備選更新), 設定還原點, 並備份系統映像檔到外接硬碟, 這樣以後要回到純粹的 Win8.1 才不用重複上面的設定與一堆冗長的更新. 升版前, Win8 原佔 C 碟 15.9G, 升版 Win8.1 並更新後佔了 21.5G, 足足多了 5.6G, 微軟作業系統真是龐大啊.

另外我也接上外接 DVD 燒錄機 (須用外接電源, Ultrabook 的 USB 無法驅動燒錄機), 將映像檔備份到光碟, 但只用兩片就完成了, 第一片 4.37G (全滿), 第二片 4.1G, 合計 8.47G. 奇怪, 兩片滿滿也才 4.3*2=8.6G, 而 C 碟有 21.5G, 壓縮比 8.6/21.5=0.4, 有可能嗎? 我懷疑這兩片應該只是 Win7 時代的修復片吧? 不管了, 總之就是兩片而已就完成了.

接著安裝常用工具軟體, 基本上照著前不久安裝技嘉桌電程序進行, 差別只是 Ultrabook 沒有燒錄機, 不須安裝燒錄程式 (如果外接光碟機就需要, 但不常用, 要燒錄資料的話, 把 TF 卡拔去桌機燒錄即可).

新電腦的安裝設定
  1. 安裝 Chrome 與 Firefox 瀏覽器
  2. 安裝程式編輯器 Editplus 3.7
  3. 安裝 Adobe PDF Reader
  4. 安裝 Adobe Flash Player
  5. 安裝微軟 Silverlight 
  6. 安裝 PotPlayer 多媒體播放器
  7. 安裝 Print2PDF 印表機 (Bullzip PDF Printer 免費版)
  8. 安裝 Bandizip 壓縮解壓縮軟體
  9. 安裝 WinCDEmu 虛擬光碟驅動
  10. 安裝 Classic Shell 開始功能表
  11. 安裝 PicPick 抓圖軟體
  12. IE 安裝郵局 WebATM 元件 (網購轉帳用)
其次安裝程式開發軟體 :
  1. 安裝 JDK7 (32 位元 X86)
  2. 安裝 Python 2.7.8
  3. 安裝 GAE SDK
  4. 安裝 Appserv 套件 (2.5.10 版)
然後安裝 Office2003 就到大功告成, 常用的大概就是這樣.

最後再做一次系統映像檔備份, 佔了外接硬碟 21.4G, 比起 Win8.1 更新完成時的 20G 多了 0.4G, 也就是說, 上面安裝的基本工具, 開發工具, 加上 Office 2003 經壓縮為映像檔後為 0.4G.

以上全部工具準備妥當, 可以開工了. 不過後來發現有一個工具漏掉了, 沒有納入映像檔, 那就是 Arduino SDK, 沒關係, 要用時隨時都可以下載安裝.

參考資料 :
  1. [Windows]處理 Windows Update 更新失敗 
  2. Windows Update 錯誤"0x80248007" 
  3. Windows 8升級為Windows 8.1  
  4. 如何免費下載、升級至 Windows 8.1 最新版作業系統  
  5. 我無法執行window8市集   
  6. 如何建立 Windows 8.1 還原系統? 
  7. 請不要再用行動硬碟「備份」檔案了
  8. Windows 8 的檔案備份與版本控制-詳談「檔案歷程記錄」
  9. [大蜘蛛] Dr.Web CureIt! 2014.10.28 免安裝中文版
  10. Dr.Web CureIt! 大蜘蛛:免費中文掃毒軟體
調整新電腦到可用要花一整天時間, 主要是程序問題以及一些疑難雜症要花時間去查詢, 記錄下來以備將來查考.

* 2014-11-04 註 : 此機使用感想 : 開關機速度極快, 闔蓋或超過設定時間 (2 分鐘) 即進入休眠, 此時耗電即小. 連續使用約 4 個小時多, 如果能像 AIR 那樣達 9 小時會更好. 程式反應速度也很快, 跟 AOD 相比簡直遠如天淵.

* 2015-04-13 系統無法啟動 (missing BCD), 執行映像檔還原, 另加安裝下列元件與驅動程式 :
  1. 郵局 WebATM 讀卡機元件 (IE Only)
  2. 凱基證券 64 位元元件 (憑證匯入上傳用, IE Only)
  3. Arduino driver
  4. PL2303HX 轉 USB 驅動程式 (Arduino Pro Mini 燒錄用)

  

2014年10月28日 星期二

做標本

昨天晚上去巨力, 問老闆有沒有賣小的密封罐, 老闆說有玻璃的, 也有塑膠的, 但玻璃的容易破, 而且是用軟木塞, 實際上沒辦法完全密封, 所以我就買了幾個透明塑膠的回來. 做啥呢? 我要把母親生前為我們製作的最後一批食材做成標本, 因為這些東西很快就會全部被吃掉, 到時真的變成絕響了.

這些食材有 :

1. 豆薣
2. 仙草茶
3. 炒花生
4. 番茄汁
5. 玉米濃湯
6. 醃鹹菜
7. 醃高麗菜
8. 醃蘿蔔乾
9. 醬鳳梨
10. 醬破布子

其中只有番茄汁與玉米濃湯我會做, 其他的通通沒學到, 特別是製作豆薣的技術. 母親去年製作的豆薣所剩不多, 鄉下餐櫥裡僅存的兩瓶已被兩個阿姨瓜分掉, 所幸高雄家裡還有半瓶前年的, 可用一些來製做標本.

上周末我把菜園中的兩個水缸的水全部倒掉, 避免孳生蚊蟲. 那是母親住院前, 趁水圳有水儲存起來淋菜用的. 舊豬舍牆邊還有一個蓋著的陶甕也是儲滿水, 爸說那是媽每年冬天用來製作豆薣專用的甕, 必須先儲水一段時間, 將來做的豆薣才好吃, 我在想, 這是要讓陶甕的隙縫充滿水氣, 好讓豆子充分發酵嗎? 不過現在也沒得問了, 因為爸說他也不知道. 我想那缸水還是放著吧.

我每次到後院時, 總會習慣性地看一下菜園, 平常都可以看到母親在菜園勞動, 一片綠油油的, 現在都空蕩蕩的, 真不習慣.



Robin Nixon 的 PHP 新書

之前在市圖借到 Robin Nixon 膾炙人口的 PHP, MySQL, JavaScript 與 CSS 第二版 (中文), 翻閱後覺得不錯, 上網一找原來今年已出第三版, 但因應 HTML5 潮流, 書名改為 PHP, MySQL, JavaScript, CSS & HTML5, 仍由歐萊里出版.

第三版在原第十章後插入了新增的第 11 章 Using the mysqli Extension, 其餘章節往後推, 最後新增了 22~25 共四章的 HTML5 (含 Canvas). 這本書的好處就是把撰寫 PHP 網頁應用程式所需的前後端技術都寫在一本書裡. 可惜沒有包含 jQuery, 只在書中提到 Javascript Framwork 時有提到.

原書範例程式可在下列網站下載 :

http://lpmj.net/3rdedition/


2014年10月20日 星期一

GAE 的資料儲存 (Datastore)

由於 HTTP 是無狀態的協定, 每一個 REQUEST 都是彼此獨立, 但一個應用必須通常必須好幾個 REQUEST-RESPONSE 程序才能完成, 因此後端網頁應用程式通常需要將資料處理的結果儲存起來, 以備後續要求使用, 傳統網頁應用伺服器採用關聯式資料庫來處理, 而在 Google 的 GAE 雲端應用則是採用 Datastore 來儲存資料. 由於其技術跟一般傳統的關聯式資料庫差異極大, 因此 Google 稱其為 "資料儲存" (Datastore), 而不稱為資料庫.

GAE 的雲端資料儲存具有下列兩種特性 :
  1. 擴展性 (Scalable) : 可自動管理使用容量, 具有極大彈性
  2. 強固性 (Robust) : 資料儲存於多個位置
Datastore 使用抽象化資料模型, 使用方式需要重新學習, 只有查詢資料儲存的 GQL 語法部分與傳統 SQL 有重疊. 架構上原先採用 Master/Slave, 但因為在定期維護期間資料無法更新, 因此 2011 年以後改推 HRD (High Replication Datastore) 架構, 不僅維護期間仍可使用, 且大幅提升服務穩定性.

學習如何使用 Datastore 前必須了解幾個專門術語 :

  1. 實體 (Entity) :
    Datastore 事實上是一個物件資料庫, 物件的屬性直接對應到資料欄位. 每一個儲存在 Datastore 中的物件稱為 Entity (資料實體). 相當於關聯式資料庫中的列 (Rows) 或紀錄 (Records).
  2. 鍵 (key) :
    Datastore 中的每一個資料實體都具有一個 key, 這在整個系統中是獨一無二的, 用來辨識每一個 Datastore 中的實體. 在 Datastore Python API 中, key 由 db 函式庫中的 Key 類別的實體負責管理. 資料實體 Entity 也提供 key() 與 getkey() 兩個方法來 注意, Key 並非實體的屬性 (property), 因為一個實體一旦建立後其 key 值就固定不能改變, 而屬性值是可以改變的. Key 由下列幾個部份組成 :
    Application ID :
    用來區別此實體屬於哪一個應用程式, 避免別的應用存取它. 透過 key 可以快速地從整個 Datastore 中擷取該資料物件.
    Entity ID/Key name :
    Entity ID 用來辨識實體, 可以在應用程式中指定 (字串), 這時稱為 Key name (使用 key_name 參數), 程式不指定時由 Datastore 自動指派 (數字), 稱為 Entity ID, 但兩者不會同時存在.
    Kind :
    Kind (資料類型) 就是資料類別的名稱, 也用來辨識資料實體 (因為同名實體可能來自不同類型), 相當於關聯式資料庫中的資料表 (Table), 但不同的是, 一個實體的 Kind 與其屬性沒有關係, 因為屬於同一 Kind 的兩個不同資料實體可以有不同的屬性集合, 而且同名屬性的值可以是不同資料類型. 而關聯式資料庫的資料表與其欄位是相關的, 而且資料表內每一個紀錄列, 其欄位屬性與資料類型都須一致. 
  3. 屬性 (property) :
    Property 就是資料實體的欄位, 每一個欄位有其資料類型, 相當於關連式資料庫中資料表的欄位 (Field) 一樣, 不同的是, 實體的欄位允許多值 (multiple values). 注意, 資料實體的Property 對應到物件的 Attribute, 雖然中文均為屬性, 但用的地方不同. 

GAE 提供了操作 Datastore 的 Python API, 其中 Python 物件與 Datastore 之間有直接的對應 :

  1. Python 物件=Datastore 的 Entity  (實體)
  2. Python 物件的屬性 attribute=Datastore 的 Eintity 的 property (屬性)
  3. Python 資料類別 (Class)=Entity 的 Kind (資料類型)


Python Datastore API 詳見 :

https://developers.google.com/appengine/docs/python/datastore/

GAE 的資料儲存類別放在 google.appengine.ext 路徑下的 db 套件, 因此要在程式中使用資料儲存必須先匯入 db 套件 :

from google.appengine.ext import db

在 Datastore 中建立資料實體的方法有兩種 :
  1. 繼承 db.Model 類別
  2. 繼承 db.Expando 類別
這兩者的差別是, 使用 Model 類別須先在類別定義中指定每一個屬性, 因此據此產生的每一個實體都必須符合所定義之結構與資料型態, 如果指定了一個不存在的屬性值或屬性的資料型態不符, 將出現執行時期錯誤; 而繼承 Expando 類別則只要建立一個空白的子類別即可 (用 pass 帶過), 不須在資料類別中事先定義具有哪些成員變數 (屬性), 而是在建立實體 Entity 時, 視資料物件指定了哪些屬性而自動在 Datastore 中建立屬性並賦值, 因此具有擴充性與彈性.

接下來我將在之前的兩篇舊作基礎上進行 Datastore 功能測試, 參考 :

# 如何在 GAE 上佈署 jQuery 與 ExtJS 專案
# 如何在 GAE 中處理 HTTP 要求

下面範例 1 將以建立一個可調整的 jQuery UI 頁籤面板為目標, 順便來測試 Datastore 的功能. 我的構想是在 Datastore 中建立各頁籤的資訊, 當點選頁籤時, 就帶入該頁籤內容, 同時我們可以新增, 刪除, 或修改頁籤設定.

首先用 db.Model 來做, 頁籤 Entity 的屬性定義如下 :

tab_name : 頁籤名稱, 唯一識別用, 英數字串
tab_label : 頁籤顯示文字, 文字
tab_link : 頁籤超連結, 文字
tab_level : 頁籤層級, 1=使用者, 9=管理者, 整數
tab_tip : 頁籤提示語, 文字
tab_order : 頁籤顯示順序, 整數

依據這需求撰寫 tabs.py 程式來定義一個資料類別 Tabs 如下 :

# -*- coding: utf-8 -*-
from google.appengine.ext import db

class Tabs(db.Model):
    tab_name=db.StringProperty()
    tab_label=db.StringProperty()
    tab_link=db.StringProperty()
    tab_level=db.IntegerProperty()
    tab_tip=db.StringProperty()
    tab_order=db.IntegerProperty()

tab1=Tabs()
tab1.tab_name="admin"
tab1.tab_label=u"管理"
tab1.tab_link="/tabtest_admin"
tab1.tab_level=9
tab1.tab_tip=u"系統管理"
tab1.tab_order=99
tab1.put()

tab2=Tabs()
tab2.tab_name="logout"
tab2.tab_label=u"登出"
tab2.tab_link="/tab_logout"
tab2.tab_level=1
tab2.tab_tip=u"系統登出"
tab2.tab_order=99
tab2.put()

在這個 tabs.py 程式中, 資料類別 Tabs 繼承了 db.Model 類別, 並定義了 6 個屬性 (property), 然後先呼叫 Tabs() 建構子建立資料物件 tab, 對屬性賦值後呼叫 put() 方法將 tab 物件儲存至 Datastore 中成為一個資料實體 (Entity), 此處我們儲存了 2 個資料實體. 注意, 這裡只要有中文的部分前面都加了一個 u, 這樣做是為了將中文從原先的 byte string  轉成 unicode string 之故, 因為這兩種字串不能混用, 而程式一開始就宣告 # -*- coding: utf-8 -*-, 如此一來所有的中文字串都會以 utf-8 編碼為 byte string, 而其他字串則為 unicode string, 因此執行時會出現如下錯誤 :

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128)

只要如上在每一個中文屬性值前面加上 u 改為 unicode string 就可以了, 詳細參閱 :



  <div id='tabs'>
    <ul>
      <li title='系統管理'>
        <a href='/tab_admin'>管理</a>
      </li>
      <li title='系統登出'>
        <a href='/tab_logout'>登出</a>
      </li>
    </ul>
  </div>
  <script language="JavaScript">
    $(document).ready(function(){
      $(this).attr("title","jQuery Tabs Test");
      $("#tabs").tabs();
      });
  </script>


事實上, Datastore 定義了 24 種 Property 類別, 可用來指定 Entity 各屬性的資料型態, 請參考 :

# Datastore 的 24 種 Property 類別

首先要在 "如何在 GAE 中處理 HTTP 要求" 的範例 3/4 基礎上修改 Members 類別, 擴充其屬性以便對這 24 種屬性進行測試, 如下列範例 1 所示 :

註 : 以上寫於 8/8/2014, 母親住院時的 31 病房.


20160129 補充 :

資料物件實體存入 Datastore 時必須注意兩件事 :

  1. 最好要指定 key_name 屬性 :
    通常是指定不會重複, 可用來作為 primary key 的欄位值做為 key_name 值, 這樣在更新資料或刪除資料時要抓出這筆資料就很方便. 
  2. 使用建立物件同時賦值方式 :
    這種方式搭配指定 key_name 可以確保不會有許多重複的 entity 存在於資料儲存庫中. 不要用上面先建立空的資料物件, 再一一指配屬性值的方式, 此法即使有指定 key_name 似乎無法避免產生許多重複的資料物件.

正確做法如下 :

tab1=Tabs(key_name="admin",tab_name="admin",
   tab_label=u"管理", tab_link="/tabtest_admin", tab_level=9,
   tab_tip=u"系統管理", tab_order=99)
tab1.put()


參考 :

# Google App Engine HTTP請求處理 
# Google App Engine 及 Web Programming 簡介 
# Python 沒有 switch - case  
# 用 Python來開 Microsoft Access的.mdb資料檔的中文欄位問題




2014年10月19日 星期日

高橋邊的市場

早上到鎮裡預定下週五給母親做四七的糕粄, 因是叫化七, 粄果需多一付祭外頭, 計紅龜粄 3 包, 發粄 3 包, 高山粄 5 粒. 老闆說打電話來即可, 不需親跑一趟. 的確, 但早上就是撥電話沒人接, 想說親自跑一趟較妥, 順便去鎮上的市集幫爸買些青菜. 老闆是大舅媽的娘家, 媽生前每年掃墓前都是跟他們訂, 所以很熟, 但我不認識啊, 亂認親似乎怪怪的.

回程經過高橋邊的市場, 把機車停在母親每天都會光顧的阿仁水果行前面, 走到市場裡面看看有哪些菜要買. 這裡我很少來, 只有一年的過年前曾載母親來過一次, 所以我對這裡也不熟悉. 在高橋的橋頭看到一個豆腐攤, 這應該就是媽常說做得最好的豆腐店家, 就買了兩塊板豆腐加一塊花生豆腐. 以前媽每天早上都會把菜園新採的菜整理後載來這邊, 跟熟悉的攤子換菜或賣給他們, 有時是自己做的醬菜, 破布子, 高麗菜乾, 鹹菜等等, 年節缺貨時攤子還會打電話來問還有沒有貨. 當然, 我也不知道這些攤子是哪一家, 我只是會讀書而已.

我一攤逛過一攤, 每一個親切叫賣的阿桑, 我都以為, 這就是媽每天會光顧的攤子吧.



2014年10月18日 星期六

新電腦的安裝設定

9/18 向燦坤訂購的 Win8 電腦終於到貨了, 主機早就 OK 了, 但因為 LG 的 24 吋液晶螢幕缺貨, 我說等螢幕到了再去取貨. 會買這台是因為原來的華擎主機板故障, 店家說換板子加電源要 7000 元左右, 索性買台新的, 為了小狐狸們寫作業複習功課, 也不得不換新. 剛好看到燦坤開學季有優惠 (加贈獨立顯卡, 升級無線鍵鼠組, 共 $12988), 所以就捨 PChome 而就燦坤, 因為這款技嘉委託 Lemel 代工的規格較 PChome 的好一些. 昨晚騎摩托車去載回來後就開始進行軟體安裝設定, 主要就是我常用的程式開發環境.

  1. 建立初始還原點 :
    到控制台/系統/系統保護建立初始還原點.
  2. Windows 系統更新並建立更新還原點
  3. 安裝 EditPlus
  4. 安裝 Chrome 與 Firefox 瀏覽器
  5. 安裝 JDK7 (32 位元 X86) :
    由於 JDK 64 位元尚未提供 ACCESS 資料庫之驅動程式, 故仍下載 JDK7 32 位元版 :

    # http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 

    安裝完後, 到控制台新增 CLASSPATH 系統變數, 其值設為 . (小數點, 表示目前目錄), 再新增系統變數 JAVA_HOME, 其值設為 :

    C:\Program Files (x86)\Java\jdk1.7.0_71

    然後於控制台的系統變數 Path 中加入下列路徑 :

    ;%JAVA_HOME%\bin;%JAVA_HOME%\db\bin;%JAVA_HOME%\jre\lib;
  6. 安裝 Python 2.7.8
    下載 Python 2.7.8 :

    # https://www.python.org/downloads/

    安裝完成後, 將下列指令路徑加入系統變數 Path 中 :

    c:\python27;c:\python27\scripts;

    此 2.7.8 版已修正 2.7.6 版關於 UnicodeEncodingError 問題, 不用再去修改 mimetypes.py 檔中關於 UnicodeEncoder 的例外. 詳參 :

    # GAE SDK Launcher 因 UnicodeDecodeError 無法運行問題
  7. 安裝 GAE SDK :
    下載 GAE SDK :

    # https://cloud.google.com/appengine/downloads?hl=zh-tw

    點選 Python 版下載安裝.  
  8. 安裝 Appserv 套件 (2.5.10 版)
  9. 建立工具還原點 :
    清除資源回收桶垃圾, 清空圖片, 下載等目錄下檔案.
  10. 安裝 Windows 2003 :
    比較熟悉的老版本.
  11. 安裝印表機與 wacom 手寫板驅動
  12. 建立最終還原點
  13. 建立系統映像檔

原先 Windows 8 的控制台裡有一個 "Windows 7 檔案修復", 可以讓我們製作系統還原光碟或映像檔, 但可能容易讓人覺得很奇怪, 怎麼還會有 Windows 7 的東西, 故在 Windows 8.1 已經移到 "檔案歷程紀錄" 裡了. 在左下角有一個 "系統映像備份", 點進去就可以選擇 "在一或多片 DVD 上" 進行備份了. 當然也可以備份在 D 碟裡.


但注意, 空白片放進去後, 會彈出一個視窗說此為為格式化光碟, 因此要打開檔案總管, 點選光碟機進行格式化後才能進行複製映像檔到光碟的工作.

安裝其他軟體 :
  1. Bandizip
  2. Arduino IDE
  3. Longman Dictionary 
  4. PotPlayerGOM Player (有廣告)
  5. Ashampoo® Burning Studio 6 FREE
注意, 安裝 GOM Player 時要選自定義安裝, 然後取消勾選安裝 Opera Player, 除非你本來就想安裝 Opera.

2016-06-27 補充 :

從硬碟映像檔回復時, 要先去使用者帳戶設定管理者密碼, 因為回復過程一定要輸入此密碼, 設好後要馬上記下來貼到電腦機殼上, 免得下次忘記.


參考 :
    10種免費的CD/DVD燒錄軟體

    更多的內容在:http://www.590103.idv.tw/blog/archives/957
    版權所有 © 笨笨包的天空
    1. 10種免費的CD/DVD燒錄軟體 
    2. Windows 8 要如何建立還原隨身碟?  
    3. Win8.1如何使用緊急修復磁碟機 
    4. 整合傳統選單與磚的「開始」功能表 – Start Menu Reviver  
    5. 讓Windows 8也有開始功能表-StartMenu 8
    6. 用 Windows 8 卻懷念「開始」按鈕?6個小工具幫你變出來!
    7. win8.1 的[Windows 7檔案修復] 功能呢??

    2014年10月17日 星期五

    如何在 GAE 佈署 jQuery EasyUI 專案 (一)

    今天回顧之前在 GAE 佈署 jQuery 與 ExtJS 專案的舊文章, 心想應該也可以如法泡製 Easy UI 的專案環境. 下午做完例行工作後, 就來動手試試看. 相關文章參考 :

    jQuery EasyUI 官網
    # jQuery EasyUI 環境配置
    # 如何在 GAE 上佈署 jQuery 與 ExtJS 專案

    為此我特別在 GAE 上申請了一個專用的應用程式 jqueryeasyui 來放置這個專案 :

    # http://jqueryeasyui.appspot.com

    首先在 GAE SDK 上產生一個 jqueryui 應用程式, 會產生如下四個檔案 :


    接下來在應用程式根目錄下新增一個 static 資料夾, 用來存放靜態檔案, 例如 EasyUI 套件要用到的檔案. 然後到 EasyUI 官網下載 EasyUI GPL 版 zip 檔 (目前是 1.4 版) :

    jQuery EasyUI 下載 (GPL 版本) 

    解開 zip 檔後結構如下 :


    將其中的 themes 目錄, jquery.min.js, jquery.easyui.min.js, 以及 locale 目錄下的 easyui-lang-zh_TW.js 四者複製到剛建好的 static 目錄下 :


    接著到 EasyUI 官網下載擴充主題 (Extension) :

    http://www.jeasyui.com/extension/themes.php

    官網提供了兩個 jQuery UI 與 Metro 兩種主題, 分別點進去, 下載 zip 檔 :

    jquery-easyui-themes.zip
    jquery-easyui-themes-metro.zip

    將 zip 檔解開後可以發現 jQuery UI 主題有 4 個樣板, metro 有 5 個樣板, 把這總共 9 個主題目錄分別複製到我們專案的 static/themes 下, 跟預設的 default 放在一起備用 :


    搞定 UI 主題後, 回到根目錄下, 我們要修改應用程式設定檔 app.yaml, 主要是加入靜態目錄 static 的設定, 這樣以後所有的靜態檔案 (圖檔, js 檔, ...) 都可以放在 static 下, 不必再修改 app.yaml 檔了, 如下所示 :

    application: jqueryeasyui
    version: 1
    runtime: python27
    api_version: 1
    threadsafe: yes

    handlers:
    - url: /favicon\.ico
      static_files: favicon.ico
      upload: favicon\.ico
    - url: /static
      static_dir: static
    - url: .*
      script: main.app

    libraries:
    - name: webapp2
      version: "2.5.2"

    然後就可以開始撰寫基於 EasyUI 的網頁, 可以使用 template 模板架構來做. 參考 "如何在 GAE 上佈署 jQuery 與 ExtJS 專案" 這篇文章, 先寫一個 HTML5 模板檔案 html5.htm 如下 :

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

    在這個模板中, 我們放置了 title, link, javascript, style, 以及 body 等五個區塊, 然後繼承此網頁模板來寫 EasyUI 網頁 jqueryeasyui.htm 如下 :

    {% extends "html5.htm" %}
    {% block link %}
      <link rel="stylesheet" href="/static/themes/default/easyui.css">
      <link rel="stylesheet" href="/static/themes/icon.css">
    {% endblock %}
    {% block javascript %}
      <script type="text/javascript" src="/static/jquery.min.js"></script>
      <script type="text/javascript" src="/static/jquery.easyui.min.js"></script>
      <script type="text/javascript" src="/static/easyui-lang-zh_TW"></script>
    {% endblock %}

    這樣就把 EasyUI 所需要的資源檔案都套用進來了, 注意這裡我們先使用預設主題風格 default. 接下來就可以繼承此 EasyUI 模板來寫測試用網頁 easyui_1.htm 如下 :

    {% extends "jqueryeasyui.htm" %}
    {% block body %}
    <table class="easyui-datagrid" title="台股" style="width:600px;height:230px"
        data-options="singleSelect:true,collapsible:true,rownumbers:true">
        <thead>
          <tr>
            <th data-options="field:'name',width:80">股票名稱</th>
            <th data-options="field:'id',width:80">股票代號</th>
            <th data-options="field:'close',width:100,align:'right'">收盤價 (元)</th>
            <th data-options="field:'volumn',width:100,align:'right'">成交量 (張)</th>
            <th data-options="field:'meeting',align:'left'">股東會日期</th>
            <th data-options="field:'election',width:80,align:'center'">董監改選</th>
            <th data-options="field:'category',width:60,align:'center'">類股</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>台積電</td>
            <td>2330</td>
            <td>123</td>
            <td>4425119</td>
            <td>2014-06-04</td>
            <td>0</td>
            <td>半導體</td>
          </tr>
          <tr>
            <td>中華電</td>
            <td>2412</td>
            <td>96.4</td>
            <td>5249</td>
            <td>2014-06-15</td>
            <td>0</td>
            <td>通信</td>
          </tr>
          <tr>
            <td>中碳</td>
            <td>1723</td>
            <td>192.5</td>
            <td>918</td>
            <td>2014-07-05</td>
            <td>0</td>
            <td>塑化</td>
          </tr>
          <tr>
            <td>創見</td>
            <td>2451</td>
            <td>108</td>
            <td>733</td>
            <td>2014-06-30</td>
            <td>0</td>
            <td>模組</td>
          </tr>
          <tr>
            <td>華擎</td>
            <td>3515</td>
            <td>118.5</td>
            <td>175</td>
            <td>2014-07-20</td>
            <td>0</td>
            <td>主機板</td>
          </tr>
          <tr>
            <td>訊連</td>
            <td>5203</td>
            <td>97</td>
            <td>235</td>
            <td>2014-05-31</td>
            <td>0</td>
            <td>軟體</td>
          </tr>
        </tbody>
      </table>
    {% endblock %}

    這樣末端網頁內容就很單純, 不需要管 head 要帶入那些資源檔, 只要專注寫 body 的內容即可. 這裡使用 datagrid 來顯示表格. 最後必須修改 URL 路由器 main.py, 指派各種 URL 要求

    # -*- coding: utf-8 -*-
    import os
    from google.appengine.ext.webapp import template
    import webapp2

    class easyui_1(webapp2.RequestHandler):
        def get(self):
            url="easyui_1.htm"
            path=os.path.join(os.path.dirname(__file__), url)
            content=template.render(path,{})
            self.response.out.write(content)

    class MainHandler(webapp2.RequestHandler):
        def get(self):
            self.response.write('Hello jQuery EasyUI!')

    app = webapp2.WSGIApplication([
        ('/', MainHandler),
        ('/easyui_1', easyui_1)
    ], debug=True)

    這裡 URL 路由器收到根目錄要求時, 會由 MainHandler 函式輸出 "Hello jQuery EasyUI!", 而鳩收到 easyui_1 要求時, 將由 easyui_1 函式處理, 它會將 easyui_1.htm 內容讀進來後就用 self.response.out.write 輸出給前端. 在 GAE SDK 上按 Browse 鈕會在瀏覽器中顯示結果 :


    如上所述, 這是套用預設主題樣式的結果, 如果要套用別的主題樣式, 只要修改 jqueryeasyui.htm, 修改 easyui.css 的主題目錄即可, 例如改為 jQueryUI 的 ui-pepper-grinder 的話效果如下 :

    {% block link %}
      <link rel="stylesheet" href="/static/themes/ui-pepper-grinder/easyui.css">
      <link rel="stylesheet" href="/static/themes/icon.css">
    {% endblock %}


    大功告成 ! 按下 GAE SDK 的 Deploy 鈕即可將整個專案上傳 GAE, 網址如下 :

    測試範例 1 : http://jqueryeasyui.appspot.com/easyui_1 [下載 zip 檔]


    2014年10月14日 星期二

    樹苺派 XBMC (Raspbmc) 介面中文化設定

    母親仙遊後, 爸成為獨居老人, 我每天都透過網路攝影機連回鄉下查看家中內外情形. 上週三天連假時花了些時間研究 DVR 的移位觸發功能, 設定都沒問題, 網路都通, 但就是不會觸發送出 email, 我猜可能移位觸發是靠紅外線作用的, 而四支監視器的紅外線目前都無作用, 可能因此無法觸發.

    為了搞定安全監控, 我這兩天重拾那塊 Raspberry Pi 板子來研究, 太久沒碰了, 有些生疏, 買這塊板子時同時買了兩個 8G Class10 的 SD 卡, 請賣家一個灌 NOOB, 一個灌 XBMC, 但 XBMC 那個版本從沒用過, 所以昨晚換 SD 卡後重開機, 弄了整晚仍然沒輒, WiFi 網路聯不上.

    今天在 Raspberry 官網發現 XBMC 也支援 Android, 於是在手機下載安裝, 但是預設是美式英文, 在 System/Settings/Apperance/International 中將 Language 改成繁體中文, 結果整個選單內容全不見了, 只剩下框框而已, 只好改回英文版. 晚上我找了一張空的 SD 卡灌最新版的 XBMC, 結果發現樹苺派也是一樣, 難道只能用英文版嗎? 後來在下列網站找到原因了 :

    # [Raspberry Pi] 作業系統+XBMC 影音+Samba網芳 安裝教學

    原來要先在 System/Settings/Apperance/Skin 中將 Font 改為 Arial Based 後, 再去 International 下將 Language 改為 Traditional Chinese 才會正確顯示繁體中文 :

    Font 預設為 Skin default

    將 Font 改為 Arial based

    預設語言為 English

    將語言改為繁中


    我先在 Android 中改, ok 後再到樹苺派依樣畫葫蘆, 成功了 !


    2014年10月13日 星期一

    師傅的良心

    今天在 Yahoo 看到這篇 :

    # 吳念真「師傅的良心」 九把刀流淚領受

    "真正的知識份子,是將自己的知識貢獻給知識比他低的人,而不是反過來利用知識,去掠奪知識比他不足的人。"

    事實上, 資訊不對稱正是我們社會中, 知識分子進行資源掠奪的優勢武器.

    因為過去科舉流弊, 讀書成為窮人翻身的唯一晉身梯, 讀書關乎肚皮與臉皮, 誰還有時間去管頭皮下的良心, 讀聖賢書所學何事, 學子也就口誦心不行. 現今人心敗壞, 說一套做一套, 死不認錯, 指鹿為馬, 顛倒黑白, 做賊喊捉賊, 惡人先告狀, 人前人後不同樣, ... ,  種種厚黑之術, 讀書人使起來尤見其妙,  屠狗之輩是萬萬不及也.

    如今世道, 求一真不可得, 高級食用油是假的, 食品標示是假的, 廣告是騙人的, 官員的話是 "顧全大局"  的, 這些都是資訊不對稱條件下才能造的假.

    良心即真心, 沒有真, 哪來的善, 一切都因此而不美了.


    2014年10月11日 星期六

    廣川鰻魚飯

    今天在 Yahoo 看到這篇讓台灣人丟臉的新聞 :

    # 老被放鴿子!京都名店「廣川」 拒台客訂位?

    評論沒有意義, 所以就別再說了. 重點是要把這家店記下來,下回去京都時務必去吃看看. 上一次去京都已是 24 年前了, 三菱公司的人假日時帶我去逛的, 我對這城市印象極好, 據說是仿唐朝長安城建造, 漫步於街道中似乎可以感受到唐人的生活氣息.

    鰻魚飯我不會做, 因為市場也沒看到賣鰻魚啊. 看起來應該是用烤的, 特殊的滋味來自於那甜甜的醬料, 以及鰻魚肉特殊的香味.

    媽媽的味道

    放三天假, 但因為姊姊與二哥還要補習與上英文課, 因此昨日也只有我跟菁菁能回鄉下. 現在母親已仙遊了, 我必須提早一點在 16:30 前出發, 這樣回到家約 17:30, 才趕得上煮晚餐. 現在不能那麼晚回鄉下, 以前只要打個電話說大約幾點到, 母親就會適時煮好菜, 回家馬上就有熱騰騰的晚餐.

    這兩天清理那快塞爆的冰箱, 把老媽預存的食材一一解凍煮掉, 好幾項都是她的特製招牌食材, 有自家菜園種的玉米作成的玉米濃湯, 番茄湯, 甘蔗汁, 以及仙草茶 :



    右邊那瓶甘蔗汁是路邊田埂上種的南光蔗搾的, 用來烘冬瓜或高麗菜時提味用, 比用味精還甘甜. 左邊那瓶是仙草茶, 仙草種在菜園一角, 晒乾後可保存很久, 要用時加水煮開過濾後加紅糖即可, 這瓶是冰箱中最後一瓶, 喝完就真的成絕響了, 菁菁說要去買個透明玻璃小密封管保留最後 5 cc. 前面上方是自種的紅番茄打的汁, 打個蛋煮湯很營養, 而下方的玉米汁就是小狐狸們讚不絕口的 "阿嬤的新發明", 只剩最後三包, 今晚被我煮掉一包.

    媽門診住院前兩週我回鄉下時, 我說拿去公司的那瓶花生吃完了 (我通常配中午的便當), 同事陳小姐說非常好吃, 於是媽又給了我新的一瓶, 現在我都捨不得吃. 每年媽都會在菜園種花生, 採收後經充分曝曬後用鹽炒, 非常香脆好吃. 外面市場賣的都是未完全曬乾就油炸的, 熱量太高.


    等冰箱中的食材煮完, 往後媽媽的味道就會消失了, 唉.


    華為 Honor 3C LTE 韌體升級

    午睡醒來查看手機訊息, 發現原廠有韌體更新通知, 先做好備份後進行線上更新, 約 72.9MB. 購買時原廠版本是 H30-L02_V100R001C900B106, 升級後為 H30-L02_V100R001C900B110 :

    升級後
     
    升級前

     更新項目


    這款手機對我來說具有紀念性, 因為是在母親往生前兩天的 9/19 日到貨的, 下班後帶去安寧病房換成 4G SIM 卡, 然後為母親留下最後的一張病房照片.

    本來還不想換 4G 系統的, 但舊手機 HTC Desire S 在那段期間常常撥不出電話, 按完號碼後撥出就沒反應, 其實是等很久後才出現撥號中畫面, 我也沒裝多少軟體啊, 刪除一些菁菁安裝的遊戲後有好些, 但過幾天又故態復萌了. 因常要跟阿姨與小舅媽等聯絡, 實在受不了這怪現象, 加上公司遊說升級為 4G, 於是就在 PC Home 以 $5490 買了這款入門款的 LTE 手機, 贈送一個藍芽喇叭, 還蠻划算的, 至少比起之前 Desire S 的 $11000 便宜一半了吧! 況且 Desire S 一直都沒有韌體升級, Android 停留在 2.3.6, 連 Zinio 都無法安裝, 很是苦惱. 當初 HTC 有把 Desire S 列入升級為 4 版名單, 可能後來股價大跌, 研發人員流失, 就不玩了.

    換 4G 後覺得它比 3G 耗電 (4 核 vs 單核, 5 吋 vs 3.7 吋), 幾乎每天都要充電, 如果只是打幾通電話, 沒長時間掛網, 還可以撐兩天. 而且 4G 涵蓋率還不是很全面, 據周刊調查, 中華是速度最優, 涵蓋面最好, 但回到鄉下老家卻只能用 3G. 10/8 給母親做三七時, 在納骨塔那邊測到目前最高速 105MB :




    2014年10月6日 星期一

    應宏 Inhon 11.6 吋筆電 Carbonbook


    我的 AOD D260 小筆電效能太慢, 很早就想換成 Macbook Air 11.6 吋的輕薄筆電, 8 月份時在露天談好一筆不錯的交易, 8G DRAM+256G SSD 的客製款全新 $31000 (蘋果官網要 $39600), 連阿龍表弟都說能談到這價格可以了, 想叫他幫我取貨代付款, 但想到當時媽在住院, 病情每況愈下, 實在沒有時間與心情學另外一種 OS, 只好跟老闆取消交易, 把機會讓給別人, 該機當天馬上售出.

    雖然覺得可惜, 但也不會後悔, 或許將來可以買到更物超所值的筆電. 前陣子在城邦的抽獎 DM 上看到應宏這款搭載 Win 8.1 的 Ultrabook, 雖然電池續航力沒有 Macbook Air 這麼強, 但熟悉的 Window 作業系統可直接使用, 同樣的輕薄, 價格又便宜許多 ($18900 vs $28900, 同樣是 4G DRAM+128G SSD), 是不錯的替代方案.

    註 : 但我目前還不想換, 準備把這台 D260 榨乾最後一滴油再說, 千萬要克制買 3C 的衝動. 這幾天收到幾位訪客關於 jQuery 技術的詢問, 但我還沒心情開工, 很抱歉, 等過一陣子稍微平靜後再說囉.

    # 應宏官網商店
    # inhon carbonbook 碳纖超輕薄筆電 - 帶著筆電跋山涉水去旅行,超強續航用整天。
    # 應宏Inhon Carbonbook 超輕碳纖維台灣製造 超高CP值Ultrabook
    # Ultrabook筆電:應宏Inhon Carbonbook使用心得評價  
    免運"台灣製造"世界最輕965g✬ INHON CarbonBook 11 亮光菱格紋 ($22900)

    2014-10-14 註 : Inhon 為頂新集團旗下手機筆電部門.

    2014年10月2日 星期四

    點點滴滴

    過去的兩個月發生了很多事情, 但忙著照顧母親的病, 奔波於家裡, 醫院與公司, 沒有心思記些甚麼, 評論甚麼. 如今母親解脫了, 這幾天坐下來細細回想, 略記如下 :

    7/21 : 去台北出差
    7/23 : 年度評鑑, 麥德姆颱風, 復興航空空難
    7/24 : 媽門診住院 101 病房
    7/28 : 媽轉 31 病房
    7/31 : 高雄氣爆
    8/23 : 參訪天鵝堡
    8/26 : 赴高雄家事法庭提出許可終止收養聲請
    9/10 : 收到家事法庭裁定駁回
    9/11 : 向家事法庭提出抗告
    9/16 : 媽轉 105 安寧病房
    9/21 : 媽往生
    9/29 : 寄出抗告陳報狀與補件
    9/30 : 媽出殯進塔

    時光不斷地流轉, 發生的事情很多, 但能記得的太少. 如果沒有了記憶, 一切都將失去意義.


    2014年10月1日 星期三

    上班

    今天銷假回公司上班, 同時將毛巾發給送奠儀的同事, 處理完馬上去開資安會議, 一早上昏沉沉的實在很想睡覺, 可能最近太累了突然鬆下來覺得很疲倦, 又不時想起在醫院時的情景, 越想越沉重.

    中午照例打電話回家, 只是現在改成爸接電話了. 以前都是媽接電話, 爸若有事情要講才會接過來. 他現在是獨居老人了, 所以要照三餐打電話.

    媽不在後的感覺實在很差.