2014年9月30日 星期二

最後旅程

今日巳時, 母親遺骨於高樹火化, 旋即進塔安奉.

母親的最後旅程於今日圓滿.


2014年9月29日 星期一

守靈日誌-5

昨天 9/28 (日) 比較空閒, 早上禮儀社的人來搭建靈堂, 並拆除小靈堂, 親友致贈的花籃也送來了, 但似乎太多了, 靈堂兩側擺不下, 天氣熱為了保鮮, 我一有空就得澆水.

今天早上做齋, 故早午兩餐皆吃素, 頌藥師懺上中下三卷. 下午普渡及大殮, 由大舅二舅封棺, 我把婷婷抄寫的心經以及菁菁畫的阿嬤菜園圖, 姐姐畫的蓮霧 (母親在醫院時最想吃的水果), 玉米 (母親製作 "新發明" 的材料) 等蔬果圖放入棺木中, 希望她能受用.

早晚拜飯煮到昨日晚餐, 今日做齋就不用了. 我每日仍做早晚課, 頌阿彌陀經一卷, 往生咒三遍, 大悲咒三遍, 心經一遍再迴向. 今天是最後在靈前做晚課了, 明日 6 時開孝, 故須早睡. 

2014年9月28日 星期日

菁菁與阿嬤之菜園農忙圖

菁菁說要畫一張阿嬤在菜園的圖放在棺木中火化, 要求我找阿嬤的照片給她, 記得以前網誌有寫過, 但忘記是何年何月, 也忘了標題, 乾脆從圖片庫中搜尋, 找到一張菁菁在菜園幫阿嬤拔花生的照片 :


過去一週她自己向老師請了五天假幫忙折蓮花, 我說阿嬤真的沒白疼妳, 雖然擔心她回校上課後功課補不完, 但老實說, 還好有她陪伴, 不然只有我跟爸在家還真的有點孤寂. 

菁菁在四歲離開鄉下到高雄讀幼稚園之前, 是阿公與阿嬤的開心果, 她的鄉下生活留下非常多的 "菁語錄", 左鄰右舍的婆婆媽媽無人不知, 媽生前不時拿出來糗她. 三隻小狐狸只有她到了六年級還是跟阿公阿嬤又親又抱的, 每天睡覺前也要跟我 KISS GOOD NIGHT.


2014年9月26日 星期五

守靈日誌-4

早上我出來要收早餐的拜飯, 看見小添伯已坐在圓桌那邊整理訃聞, 不久鄰居道彩哥, 堂叔也來了, 今天要拜託他們遞送訃聞給親朋好友.

早上大阿姨請鄰居載她來, 吃過午飯才回去. 下午小舅媽跟小阿姨整理母親衣服, 挑出兩套要放入棺木中的, 其餘則於大殮後火化.下午有人送花籃來, 一問之下才知是從五甲送來, 係內科部陳主任與水某的同事所送. 非常感謝陳主任, 他在百忙中還抽空到安寧病房去探視母親, 並檢查病情.

傍晚禮儀社的阿彬帶我去看塔位, 位於月光山腰的上齋堂地藏殿, 此為母親靈骨暫厝之地, 我幫她選了 0892 號位置, 因為那排剛好補滿, 比較有伴. 後年 105 年利東西, 屆時再擇日移厝家祠. 9 月上旬在 31 病房時, 某次痛完後跟我說 : "這次大概好不了了, 媽過身後火化先置塔, 一對年後才可以放家祠, 要記得". 我深知此次病情, 沒有像之前那樣叫她別亂想, 醫生一定有辦法, 而是反問她 : "六年前化療時不是告訴我你怕火要土葬嗎? 怎麼又改為火葬?", 她說土葬太麻煩, 現在都求簡單了. 我想可能是這幾年周遭鄰居好友一個個仙遊都是火葬的緣故吧.

晚上做完晚課, 我到曬穀場的小靈堂巡一遍, 坐在小板凳上看著母親遺照, 回顧過去的兩個月, 心中感傷不已. 兩個月前走進 101 病房時, 她還能每天自己去上廁所刷牙洗澡, 談論家族中的過往歷史 (事實上我已經聽了很多遍, 但我每次都裝作是第一次聽到). 剛到 31 病房時, 每晚九點還能扶著她去盥洗就寢, 但隨著病況惡化, 尿袋掛上了, 鼻胃管也插了, 就不能像以前那樣服伺她上廁所了. 在安寧病房的六天, 晚上看著在鎮靜劑作用下已昏睡的母親, 失落感很大, 因為已經無法再跟她溝通了, 但若醒著, 又不忍看她承受癌細胞吞噬之痛.

所幸最後及時回到鄉下老家, 在家人親友陪伴下壽終正寢. 在安寧病房時我最大的憂慮就是這個, 母親不識字, 我不希望她在醫院離世, 我怕她會找不到回家的路.

2014年9月25日 星期四

守靈日誌-3

一大早我還在煮菜準備母親的拜飯, 鄰居阿盡姐就過來了, 還好有來提醒我, 昨日統計花籃與庫錢時將她給漏掉了. 接著月騰伯及伯母也來了, 對於未告知母親住院一事有所責備, 只得委婉解釋母親不欲麻煩人家的本意.

今天在小舅媽, 小阿姨, 小姨婆, 以及阿蘊幫忙之下, 終於摺好 108 朵往生咒蓮花, 菁菁明天開始只要每天摺 6 個以上即可.

下午一邊摺蓮花, 一邊聽小阿姨訴說童年寄人籬下的艱苦, 從小三到初三整整六年寄居親友家求學, 小學三年級就要自己打水煮飯了. 她說母親結婚後幾乎每天都會帶青菜回去照顧年幼的弟妹, 她最喜歡我媽回家, 因為這樣就有得吃了.

外公當初會買庄上的房子, 一是為了安置求學中的阿姨與舅舅, 更重要的原因是, 好強的母親面對紛至沓來的求親, 她說沒有像樣的娘家房子她不嫁, 於是外公就買了庄上東角的那棟房子, 結果還被原屋主騙了, 那房子早已抵押給銀行, 只好再跟銀行買一次, 真是冤枉.

晚上 8 點後下起大雷雨, 我趕緊出去檢查靈堂, 還好不會漏雨.

2014年9月24日 星期三

守靈日誌-2

昨天實在太忙了, 做完晚課便昏昏欲睡, 便叫菁菁一起早些就寢, 因為第二天要早起煮菜給媽拜飯. 昨日 (9/23) 早上賣豬肉的榮發舅媽來點香後走到菜園, 看到已荒蕪兩個月的菜園, 感嘆地說她不知吃了多少來自這菜園的青菜. 今晚月騰伯來電問說媽住幾號病房, 因明天他們夫婦要去榮總門診拿藥, 想順道去探病, 爸告訴他們母親已往生, 想必他們是非常驚訝. 爸說月騰伯母是媽小時候在山上的鄰居, 她每次去鎮上總是帶上自種的青菜, 他們每次來我家也總是帶些豬肉或排骨之類的回禮. 而小舅媽待母親猶過於親姊姊, 原因是在小舅最艱困時期, 媽總是把家裡出產的米, 菜一袋一袋地堆上他們的車 ... 母親的好人緣來自她總是不吝給予, 在這鄉里中, 到哪裡都受歡迎. 反觀我自己卻很小氣, 真的沒遺傳到, 難怪我人緣普普, 朋友只有一個半.

今天終於搞定舅舅阿姨他們的禮數, 包括做齋, 花籃, 花圈, 以及庫錢的很繁瑣的項目. 禮儀社也來敲定喪禮細節.

2014年9月22日 星期一

守靈日誌-1

今天非常忙碌, 禮儀社一早來搭了小靈堂, 指導如何早晚為母親準備宛如生時之刷牙洗臉以及飲食等事宜. 菜是我照以前母親教我的方式煮, 但好勝的她或許會嫌我煮得不夠入味. 小狐狸們也忙著折蓮花, 菁菁說要教我, 但我實在沒空, 因為鄰居親朋好友聞訊趕來, 我必須接待為其點香與祈福. 早上是二姨丈與阿珍夫婦載從台北南下之大舅, 中午是小阿姨與偉偉及左營阿姨, 下午則是台中的表哥, 表妹與表弟.

我每日起床與晚上盥洗後即為母親頌阿彌陀經一卷, 往生咒若干遍, 大悲咒若干遍, 並加以迴向, 希望對她有所助益. 今天阿淑妹子引介慈濟師姐要來助念, 但母親往生時, 已由我領聲與家人一起連續助念 8 小時, 之後觀其面容明亮, 非常安詳.

老家少了老媽的感覺真是不對勁, 像是車子少了顆引擎似的. 這兩個月來的病房生活, 除了末期她已陷入昏睡外, 白天她總是催促我快去上班, 晚上催我快睡覺, 不然半夜叫痛時, 擔心我沒睡好第二天又要趕去上班.

2014年9月21日 星期日

回家

早上起來後幫母親擦臉擦手時發現手關節處有圓形瘀青,翻開被單看到膝蓋也是如此,詢問護理師,她說應該是心肺功能降低,導致循環不良所致。她建議今日即辦出院。
辦好出院手續已十點半,救護車駕駛開很快,約十一點半回到鄉下老家。小舅提醒我去背阿蘭下來給她看,她聽到阿蘭聲音,流下一行清淚,我們告訴她別擔心,12:03 分母親安詳往生。
感謝 31 病房與 105 病房全體護理師,感謝余主任,陳主任,以及親切的潘湘如醫師,還有 31 病房的清潔阿姨,感謝您帶給她最後的一段趣味。

病房雜記-4

今天是 9 月 20 日, 再過三天媽住院就滿兩個月了. 下午到病房後, 護理師在準備按摩浴缸, 要幫媽洗澡. 昨日水某幫媽擦澡時發現頸部垢很多, 雖然有擦身體, 但是因為怕會痛, 所以不敢擦太大力, 加上近兩個月沒洗澡, 垢當然難免.

洗澡前先打止痛, 然後護理師就推了一台機械式的移動單架到病房, 三人合力將她移過去後, 就推到按摩浴缸澡堂. 先用沙威隆洗淨後, 護理師操作移動單架使其下降到浴缸中. 啟動按摩浴缸沖水.

洗完澡量血壓發現降到 102, 呼吸也變得短促, 但傍晚小狐狸們來看阿嬤時再量則又降至 92. 可能洗過澡循環通暢吧, 但也有可能是心肺功能越來越不好了.

2014年9月17日 星期三

病房雜記-3

今天是 9 月 17 日, 因左營阿姨有事, 我請了一天假. 早上聽到媽媽叫喚而醒來, 但她不像以前叫喚我的名字, 而是叫 "姆媽, 等我", 也就是我外婆, 不知是做夢還是 .... 摸一下手覺得似乎有些發燒, 請護理師來看, 約 37.4 度, 在肚子上抹些精油後比較鎮靜下來, 我問她為何叫外婆, 她說叫到不知要叫誰, 就叫媽媽. 這讓我想起搶救雷恩大兵電影裡, 在戰場上被砲火擊中的士兵也是叫喚媽媽, 不同語言的兒童最早學會的單詞也是媽媽, 難道走近人生盡頭時, 都會回到童年嗎? 我測試了一下她還認得我, 也能說出外公外婆名字, 但護理師說, 在藥物作用下, 其意識可能會片片斷斷不連續, 有時清楚, 有時模糊.

前天 (9 月 15 日) 潘醫師通知說安寧病房單人房有空位, 所以那天下午請兩小時假移病房. 這個 105 病房其實就在當初住院時的 101 病房對面, 牆上刻著崇德兩字, 當時並不知道這原來就是安寧病房. 從第 7 床這間窗戶可以看到半屏山, 視野比 31 病房 1 床好, 只是房間較小一點.

來這裡後因為鎮靜劑的關係, 媽媽昏睡的時間多了, 即使醒來眼神也是呆滯. 昨日我特地從家裡帶來李文古的 mp3 給她聽, 還能邊聽邊講, 但今天精神就差多了. 但是問她問題又還能答得出來. 離開 31 的前一天晚上, 她痛完稍緩和時, 語重心長地說, 這個病是治不好了, 然後說了一句 : "這樣就大概是一輩子了吧!" ? 這句話一直在我腦中迴盪不已.

孔子說五十而知天命, 我今年虛歲即五十矣, 晚上在醫院服侍母親近兩個月, 終於明瞭這句話的意思. 五十歲的人父母皆已年邁, 侍親之疾才會深刻了解, 二三十年後就輪到我們上場了. 對於已過半的人生, 若能如孔子所言知天命, 所見光景該是有所不同.


2014年9月14日 星期日

病房雜記-2

今天已經是九月十四, 媽住院已經一個半月多了,下午小舅與舅媽來時,看到外面陽光燦爛,問她要不要坐輪椅到花園看看,她說好,於是我去跟護士借輪椅,她們都很驚訝,可能料想不到臥床那麼久,醒來就痛得要打嗎啡的她,竟然會答應出去逛逛.

我扶她起來坐輪椅時非常吃力,因為她的雙腳根本已無法站立.菁菁幫忙推點滴架,我跟舅媽推著她沿著三樓走廊走一遍,透過落地窗看看外面的花園,本來想出去花園走走,但一推開門熱氣沖來,她就說太熱別出去了.我看著園中隨風搖曳的樹葉,這對我們而言是再普通不過的風景,沒有人會停下來看一眼,即使看了也不會有什麼意義.但對媽這樣可能來日無多的病人來說,能這樣停下來看看花葉的機會卻是彌足珍貴.

昨日下午醒來還沒開始痛時,精神似乎特好,她要我幫她撥電話給有元哥,她自己跟他講電話, 叫他這兩天去我家將菜園鋤出兩行溝來種高麗菜.這讓我很訝異,前陣子還說菜園的事已經管不了那麼多了.這兩天嗎啡的止痛效果已經不明顯,可能閥值已上升,痛到不行時我就去通知護士打鎮靜劑讓她睡著,睡著了或許就不知道痛了.老來就怕病來磨,特別是像癌症這種病,其痛楚只有病人才知道何其難耐.




2014年9月8日 星期一

jQuery EasyUI 測試 : Datagrid (一)

jQuery EasyUI 的視覺效果我覺得比 jQueryUI 細緻, 直逼 ExtJS, 而且使用方法直觀簡單, 完全採用 HTML5 格式, 這也是我重回 jQuery 陣營的因素之一. 其環境配置已如前文, 參見 :

# jQuery EasyUI 環境配置

在該文中, 我簡單地將 EasyUI 的 demo/datagrid 目錄下的 basic.html 稍稍改裝 (主要是相關的 js 與 css 資源相對位址調整), 上傳伺服器測試後發現效果不錯. 它主要是透過 HTML5 的 data-options 屬性來設定表格功能的 (當然也可以用 Javascript 物件屬性來設定) : 

data-options="singleSelect:true,collapsible:true,url:'datagrid_data1.json',method:'get'"

singleSelect 用來設定單列選定模式, collapsible 用來設定表格右上角是否要擺一個內容縮合按鈕; url 用來指定表格的 ajax 資料來源, method 則是 HTTP 方法. 其 API 參考 :

# jQuery EasyUI 參考文件 

測試範例 1http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-1.htm [看原始碼]

此處要詳細地來測試 datagrid 的各項功能與整理期設定方式.

首先我想先搞定資料來源議題, 上述範例 1 乃是從現成的靜態 json 檔提供表格資料來源, 其格式如下 :

 {"total":28,"rows":[
    {"productid":"FI-SW-01",
     "productname":"Koi",
     "unitcost":10.00,
     "status":"P",
     "listprice":36.50,
     "attr1":"Large",
     "itemid":"EST-1"},
     ...
     ]}

但實際應用中, 表格的資料來源通常是由資料庫動態取得, 亦即是由後端程式例如 PHP 從資料庫中動態擷取再輸出 JSON 格式的資料, 而 EasyUI 要求所需的 JSON 資料須有 total 與 rows 兩個屬性.

在下面範例 2 中, 我將參考之前測試 ExtJS 的 GridPanel 時所使用的範例, 利用 PHP 程式來動態地輸出表格所需的 JSON 資料. 參考 :

# ExtJS 4 測試 : GridPanel (三) 

在此文的範例 28 中, 我使用一個 PHP 程式 get_stocks.php 從後端 MySQL 資料表 stocks 取得表格內容來源, 並輸出為 ExtJS 的 GridPanel 所需要的 JSON 格式 :

http://mybidrobot.allalla.com/extjstest/get_stocks.php

ExtJS GridPanel 所需的 JSON 格式是 totalProperty 與 root 兩個屬性. 此處我將利用相同的後端 MySQL 資料表 stocks, 只要修改 PHP 程式, 更改為輸出 total 與 rows 屬性即可, 如下列 get_stocks.php :

http://mybidrobot.allalla.com/easyuitest/get_stocks.php

其原始碼如下 :

<?php
header('Content-Type: text/html;charset=UTF-8');
$host="abc.xyz.com";
$username="test";
$password="123";
$database="testdb";
$conn=mysql_connect($host, $username, $password); //建立連線
mysql_query("SET NAMES 'utf8'"); //設定查詢所用之字元集為 utf-8
mysql_select_db($database, $conn); //開啟資料庫
$SQL="SELECT COUNT(*) FROM `stocks`";
$RS=mysql_query($SQL, $conn);
list($total)=mysql_fetch_row($RS); //紀錄總筆數
$SQL="SELECT * FROM `stocks`";
$result=mysql_query($SQL, $conn); //執行 SQL 指令
$stock=array();
for ($i=0; $i<mysql_numrows($result); $i++) { //走訪紀錄集 (列)
     $row=mysql_fetch_array($result); //取得列陣列
     $stock[$i]=array("name" => $row["name"],
                      "id" => $row["id"],
                      "close" => $row["close"],
                      "volumn" => $row["volumn"],
                      "meeting" => $row["meeting"],
                      "election" => $row["election"],
                      "category" => $row["category"]
                      );
     } //end of for
$arr=array("total" => $total, "rows" => $stock);
echo json_encode($arr);  //將陣列轉成 JSON 資料格式傳回
?>

接著修改上面範例 1 的 data-options 屬性中的 url 為 get_stocks.php, 並設定與資料表相關欄位對應的表格欄位如下 :

  <table class="easyui-datagrid" title="台股" style="width:700px;height:250px"
    data-options="singleSelect:true,collapsible:true,url:'get_stocks.php',method:'get'">
    <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>
  </table>

將檔案存成 easyui-datagrid-2.htm 後上傳, 結果如下 :

測試範例 2http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-2.htm [看原始碼]



果然順利地將 PHP 檔輸出的 JSON 資料渲染成所要的表格呈現. 注意, 如果 th 的 data-options 中沒有設定 witdth, 則 EasyUI 會以 fit (剛好適合資料寬度) 方式處理, 例如上面的股東會日期欄位. 如果全部資料欄位寬度超過表格寬度 (這裡是設定為 700px), 那麼就會出現水平卷軸, 若資料列太多, 超過表格高度 (這裡設定為 250px), 則會出現垂直卷軸.

比起 ExtJS 的複雜物件設定而言, jQuery 是比較簡單直觀, 非常適合網頁設計師學習網頁程式開發, 而 ExtJS 則適合一般程式設計師學習網頁開發.

上面範例 2 使用 HTML5 的 data-options 設定表格參數, 也可以像 ExtJS 那樣使用 Javascript 設定, 如下範例 3 所示 :

測試範例 3 : http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-3.htm [看原始碼]

  <table id="grid1" title="台股" style="width:700px;height:250px"></table>
  <script language="javascript">
    $(document).ready(function(){
      $('#grid1').datagrid({
        url:'get_stocks.php',
        columns:[[
          {field:'name',title:'股票名稱',width:80},
          {field:'id',title:'股票代號',width:80},
          {field:'close',title:'收盤價 (元)',width:100,align:'right'},
          {field:'volumn',title:'成交量 (張)',width:100,align:'right'},
          {field:'meeting',title:'股東會日期',align:'left'},
          {field:'election',title:'董監改選',width:80,align:'center'},
          {field:'category',title:'類股',width:60,align:'center'}
          ]],
        singleSelect:true,
        collapsible:true
        });
      });
  </script>

可見效果是一樣的. 只要為 table 標籤指定一個 id, 就可以用 Javascript 設定各項參數. 以上範例均透過 Ajax 取得遠端資料來源, 如果資料由網頁本身提供, 則可以直接寫在 tbody 標籤內, 並且取消 url 設定即可, 如下列範例 4 所示 :

測試範例 4 : http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-4.htm [看原始碼]

  <table class="easyui-datagrid" title="台股" style="width:700px;height:250px"
    data-options="singleSelect:true,collapsible: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>

事實上這種應用較少, 除非是少量且固定的靜態資料. 

接著來測試分頁功能, 只要將 paginate 屬性設為 true, 表格下方即出現分頁工具, 如下範例 5 所示 :

測試範例 5 : http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-5.htm [看原始碼]

    $(document).ready(function(){
      $('#grid1').datagrid({
        url:'get_stocks.php',
        columns:[[
          {field:'name',title:'股票名稱',width:80},
          {field:'id',title:'股票代號',width:80},
          {field:'close',title:'收盤價 (元)',width:100,align:'right'},
          {field:'volumn',title:'成交量 (張)',width:100,align:'right'},
          {field:'meeting',title:'股東會日期',align:'left'},
          {field:'election',title:'董監改選',width:80,align:'center'},
          {field:'category',title:'類股',width:60,align:'center'}
          ]],
        singleSelect:true,
        collapsible:true,
        pagination:true
        });
      });


如果是用 HTML5 方式設定, 就在 table 標籤的 data-options 屬性中加上 paginate:true 即可. 本例是拿掉中文化檔案的結果, 可見預設是英文版的分頁工具列, 如果在 head 標籤內加上中文化檔案 :

<script type="text/javascript" src="../jquery/easyui-lang-zh_TW.js"></script>

這樣就會得到繁中的分頁工具列, 如下列範例 6 :

測試範例 6 : http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-6.htm [看原始碼]



由於我們的後端資料不夠多, 只有一頁無法測試切換頁效果, 下面範例 7 將參考 ExtJS 測試的範例 12 所用之 PHP 程式 get_stocks_list_page.php 與 stocks_list 資料表來產生足夠長的資料列 :

ExtJS 4 測試 : GridPanel (一)

因為 EasyUI 的 datagrid 會向後端傳送 page (頁數) 與 rows (列數, 即 page size) 這兩個參數, 而且所輸出的 JSON 資料須有 total 與 rows 兩個屬性, 因此這個 get_stocks_list_page.php 也需做些修改如下 :

<?php
header('Content-Type: text/html;charset=UTF-8');
$host="abc.xyz.com";
$username="test";
$password="123";
$database="testdb";
$conn=mysql_connect($host, $username, $password); //建立連線
mysql_query("SET NAMES 'utf8'"); //設定查詢所用之字元集為 utf-8
mysql_select_db($database, $conn); //開啟資料庫
$page=isset($_POST['page']) ? intval($_POST['page']) : 1;
$rows=isset($_POST['rows']) ? intval($_POST['rows']) : 10;

$start=($page-1) * $rows;  //本頁第一個列索引 (0 起始)
$SQL="SELECT COUNT(*) FROM `stocks_list`";
$RS=mysql_query($SQL, $conn);
list($total)=mysql_fetch_row($RS); //紀錄總筆數
$SQL="SELECT * FROM `stocks_list` LIMIT ".$start.",".$rows;
$result=mysql_query($SQL, $conn); //執行 SQL 指令
$stock=array();
for ($i=0; $i<mysql_numrows($result); $i++) { //走訪紀錄集 (列)
     $row=mysql_fetch_array($result); //取得列陣列
     $stock_name=$row["stock_name"];
     $stock_id="<a href='http://tw.stock.yahoo.com/q/q?s=".
               $row["stock_id"]."' target='_blank'>".
               $row["stock_id"]."</a>";
     $stock[$i]=array("stock_name" => $stock_name,
                      "stock_id" => $stock_id);
     } //end of for
$arr=array("total" => $total, "rows" => $stock);
echo json_encode($arr);  //將陣列轉成 JSON 資料格式傳回
?>

此程式中用 $_POST 取得分頁工具列傳來的 page 與 rows 參數, 用三元運算子設定其未傳出時之初始值, 然後計算每頁第一列的索引, 再用 MySQL 的 SELECT ... LIMIT 語法取得該頁的列記錄. 最後會輸出指定頁次列數之 stock_name 與 stock_id 這兩欄資料, 參考 EasyUI tutorial :

#  Add a pagination to DataGrid

注意, 這裡 stock_id 我給它加上 Yahoo 股市的超連結. 網頁程式如下範例 7 所示 :

測試範例 7http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-7.htm [看原始碼]

 <table id="grid1" title="台股" style="width:600px;"></table>
  <script language="javascript">
    $(document).ready(function(){
      $('#grid1').datagrid({
        url:'get_stocks_list_page.php',
        columns:[[
          {field:'stock_name',title:'股票名稱',width:100},
          {field:'stock_id',title:'股票代號',width:100}
          ]],
        singleSelect:true,
        collapsible:true,
        pagination:true,
        pageSize:10,

        rownumbers:true
        });
      });
  </script>


此處我們將 rownumbers 設為 true, 這樣列首會出現列編號, pageSize:10 只是初始化時用到, 可以透過下拉式選單更改每頁列數. 其次, table 標籤僅設寬度, 其高度由列數多寡自動調整. 換頁時若使用 Chrome 按 F12 鍵可觀察到 Form Data 送出 page 與 rows 兩個參數 :


分頁工具列位置由 pagePosition 屬性決定, 預設為 'bottom', 其餘選項有 'top' 與 'both' (注意是字串) :

        pagination:true,
        pagePosition:'top',

如下列範例 7-1 與 7-2 所示 :

測試範例 7-1 : http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-7-1.htm [看原始碼]
測試範例 7-2 : http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-7-2.htm [看原始碼]




當設為 'both' 時, 上下兩個分頁工具列會連動.

如果要讓欄位可排序, 可在欄位設定 Columns 的 field 中加上 sortable:true, 如下列範例 8 所示 :

測試範例 8 : http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-8.htm [看原始碼]

    $(document).ready(function(){ 
      $('#grid1').datagrid({
        url:'get_stocks_list_page.php',
        columns:[[
          {field:'stock_name',title:'股票名稱',width:100,sortable:true},
          {field:'stock_id',title:'股票代號',width:100,sortable:true}
          ]],
        singleSelect:true,
        collapsible:true,
        pagination:true,
        pageSize:10,
        rownumbers:true
        });
      });

兩個欄位 stock_name 與 stock_id 均設定為可排序, 這樣點擊欄位名稱時就會以該欄位來排序 (asc 與 desc 交替), 名稱右方會出現小三角形, 向上表示順序 (asc), 向下表示逆序 (desc). 

但實際上範例 8 並不會正確地排序, 原因是後端的 PHP 程式也必須修改. 在 Chrome 按 F12 鍵, 切到 Network 可發現按排序欄位時, Form Data 除了傳出 page 與 rows 參數外, 還傳出 sort (排序欄位名稱) 與 order (排序方向) 兩個參數, 後端程式必須依據這些參數傳回正確的 JSON 資料. 

<?php
header('Content-Type: text/html;charset=UTF-8');
$host="abc.xyz.com";
$username="test";
$password="123";
$database="testdb";
$conn=mysql_connect($host, $username, $password); //建立連線
mysql_query("SET NAMES 'utf8'"); //設定查詢所用之字元集為 utf-8
mysql_select_db($database, $conn); //開啟資料庫
$page=isset($_POST['page']) ? intval($_POST['page']) : 1;
$rows=isset($_POST['rows']) ? intval($_POST['rows']) : 10;
$sort=isset($_POST['sort']) ? $_POST['sort'] : 'stock_id';
$order=isset($_POST['order']) ? $_POST['order'] : 'asc';
$start=($page-1) * $rows;  //本頁第一個列索引 (0 起始)
$SQL="SELECT COUNT(*) FROM `stocks_list`";
$RS=mysql_query($SQL, $conn);
list($total)=mysql_fetch_row($RS); //紀錄總筆數
$SQL="SELECT * FROM `stocks_list` ORDER BY ".$sort." ".$order.
           " LIMIT ".$start.",".$rows; 
$result=mysql_query($SQL, $conn); //執行 SQL 指令
$stock=array(); 
for ($i=0; $i<mysql_numrows($result); $i++) { //走訪紀錄集 (列)
     $row=mysql_fetch_array($result); //取得列陣列
     $stock_name=$row["stock_name"];
     $stock_id="<a href='http://tw.stock.yahoo.com/q/q?s=".
               $row["stock_id"]."' target='_blank'>".
               $row["stock_id"]."</a>";
     $stock[$i]=array("stock_name" => $stock_name, 
                      "stock_id" => $stock_id);
     } //end of for
$arr=array("total" => $total, "rows" => $stock);
echo json_encode($arr);  //將陣列轉成 JSON 資料格式傳回
?>

此處 get_stocks_list_sort.php 以 $_POST 擷取 sort 與 order 兩個參數以便在 SQL 中加入排序資訊, 這樣就會傳回排序後的 JSON 資料, 當然網頁程式也要修改, 如下列範例 9 所示 :

    $(document).ready(function(){ 
      $('#grid1').datagrid({
        url:'get_stocks_list_sort.php',
        columns:[[
          {field:'stock_name',title:'股票名稱',width:100,sortable:true},
          {field:'stock_id',title:'股票代號',width:100,sortable:true}
          ]],
        singleSelect:true,
        collapsible:true,
        pagination:true,
        pageSize:10,
        rownumbers:true
        });
      });

測試範例 9 : http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-9.htm [看原始碼]



在 jQuery 外掛 Datatables 中, 預設就有一個搜尋框, EasyUI 也可以在上方添加搜尋工具列, 只要準備一個 div 包裹的搜尋框, 然後在 table 標籤裡用 toolbar 屬性指定搜尋框的 id 即可, 參考 :

# Add search functionality in DataGrid

搜尋框的網頁碼如下 :

  <div id="search_bar" style="padding:3px">
    <select id="search_field">
      <option value="stock_name">股票名稱</option>
      <option value="stock_id">股票代號</option>
    </select>
    <input id="search_what" style="line-height:15px;border:1px solid #ccc">
    <a href="#" class="easyui-linkbutton" plain="true" onclick="doSearch()">搜尋</a>
  </div>

這個搜尋框 id 要設定在 table 標籤的 toolbar 屬性中, 這樣在表格標題欄下方的工具列位置就會出現此搜尋框了. 這裡我用一個下拉式選單 search_field 來選擇要搜尋的欄位, 用 search_what 文字框輸入要搜尋的關鍵字, 用一個超連結 a 標籤來製作連結按鈕 (樣式類別為 easyui-linkbutton), 當按下搜尋時呼叫 doSearch() :

  <script type="text/javascript">
    function doSearch(){
      $('#grid1').datagrid('load',{
        search_field: $('#search_field').val(),
        search_what: $('#search_what').val()
        });
      }
  </script>

當然後端 PHP 程式也要修改, 將 search_field 與 search_what 加入 SQL 指令中 :

<?php
header('Content-Type: text/html;charset=UTF-8');
$host="abc.xyz.com";
$username="test";
$password="123";
$database="testdb";
$conn=mysql_connect($host, $username, $password); //建立連線
mysql_query("SET NAMES 'utf8'"); //設定查詢所用之字元集為 utf-8
mysql_select_db($database, $conn); //開啟資料庫
$page=isset($_POST['page']) ? intval($_POST['page']) : 1;
$rows=isset($_POST['rows']) ? intval($_POST['rows']) : 10;
$sort=isset($_POST['sort']) ? $_POST['sort'] : 'stock_id';
$order=isset($_POST['order']) ? $_POST['order'] : 'asc';
if (isset($_POST['search_field'])) { //有 search
  $where=" WHERE ".$_POST['search_field']." LIKE '%".
         $_POST['search_what']."%'";
  }
else {$where="";} //無 search
$start=($page-1) * $rows;  //本頁第一個列索引 (0 起始)
$SQL="SELECT COUNT(*) FROM `stocks_list`".$where;
$RS=mysql_query($SQL, $conn);
list($total)=mysql_fetch_row($RS); //紀錄總筆數
$SQL="SELECT * FROM `stocks_list` ".$where." ORDER BY ".
     $sort." ".$order." LIMIT ".$start.",".$rows;
$result=mysql_query($SQL, $conn); //執行 SQL 指令
$stock=array();
for ($i=0; $i<mysql_numrows($result); $i++) { //走訪紀錄集 (列)
     $row=mysql_fetch_array($result); //取得列陣列
     $stock_name=$row["stock_name"];
     $stock_id="<a href='http://tw.stock.yahoo.com/q/q?s=".
               $row["stock_id"]."' target='_blank'>".
               $row["stock_id"]."</a>";
     $stock[$i]=array("stock_name" => $stock_name,
                      "stock_id" => $stock_id);
     } //end of for
$arr=array("total" => $total, "rows" => $stock);
echo json_encode($arr);  //將陣列轉成 JSON 資料格式傳回
?>

我們用 isset() 判斷有無傳出 search_field 欄位 (用 search_what 或兩者 AND 亦可), 有的話就製作 $where 字串, 此處用 %...% 將 search_what 包起來, 表示只要欄位值含有 search_what 即符合. 網頁程式也要改用此具搜尋功能之 get_stocks_list_search.php, 同時也要增加一個 toolbar 屬性, 並指定其值為上面的搜尋框 id :

  <table id="grid1" title="台股" style="width:600px;" toolbar="#search_bar"></table>
  <script language="javascript">
    $(document).ready(function(){
      $('#grid1').datagrid({
        url:'get_stocks_list_search.php',
        columns:[[
          {field:'stock_name',title:'股票名稱',width:100,sortable:true},
          {field:'stock_id',title:'股票代號',width:100,sortable:true}
          ]],
        singleSelect:true,
        collapsible:true,
        pagination:true,
        pageSize:10,
        rownumbers:true
        });
      });
  </script>

如下列範例 10 所示 :

測試範例 10 : http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-10.htm [看原始碼]


我們搜尋股票名稱含有 "富" 字者共有 11 筆, 用 Chrome 的 F12/Network/Headers/Form Data 觀察可知, 的確會向後端傳出 search_field 與 search_what 參數 :


在上面範例 10 中, 放在工具列位置的搜尋框, 我們使用超連結來製作搜尋按鈕, 其中 a 標籤的  plain="true" 屬性設定表示只顯示按鈕文字, 不顯示按鈕外框, 但當滑鼠移到按鈕上面時就會顯示外框. 如果 plain 設為 "false" 或不加 plain 屬性, 那麼就會出現按鈕外框了 (plain 屬性預設為 false).

事實上, 除了文字連結按鈕外,  EasyUI 提供了許多常用的圖形按鈕樣式, 可用 iconCls 屬性加以指定, 例如 :
  1. icon-cancel : 取消
  2. icon-reload : 重新載入
  3. icon-search : 搜尋
  4. icon-print : 列印
  5. icon-help : 協助 
  6. icon-save : 儲存
  7. icon-cut : 剪下
  8. icon-edit : 編輯
  9. icon-remove : 刪除
  10. icon-new : 新增
  11. icon-back : 返回
參考 :

# Create a Link Button

根據 "Jquery EasyUI 中图标问题" 這篇文章, EasyUI 的圖示都放在 themes/icons 目錄下, 所以在上面的所有範例中均有指定 icon.css 這個樣式設定檔, 只要指定 iconCls 屬性即可直接使用這些圖檔 :

<link rel="stylesheet" type="text/css" href="../jquery/easyui-themes/icon.css">

在下面範例 11 中我在工具列中多放了三個連結按鈕 : 新增, 編輯, 刪除, 儲存, 因此我把工具列 div 標籤的 id 改為 tool_bar :

  <div id="tool_bar" style="padding:3px">
    <select id="search_field">
      <option value="name">股票名稱</option>
      <option value="id">股票代號</option>
    </select>
    <input id="search_what" style="line-height:15px;border:1px solid #ccc">
    <a href="#" class="easyui-linkbutton" iconCls="icon-search" onclick="doSearch()">搜尋</a>
    <a href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="doAdd()">新增</a>
    <a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="doEdit()">編輯</a>
    <a href="#" class="easyui-linkbutton" iconCls="icon-remove" onclick="doRemove()">刪除</a>
    <a href="#" class="easyui-linkbutton" iconCls="icon-save" onclick="doSave()">儲存</a>
  </div>

因此 table 標籤的 toolbar 屬性也要改為 tool_bar :

<table id="grid1" title="台股" style="width:600px;" toolbar="#tool_bar"></table>

為了簡單起見, 這三個按鈕的 click 事件處理函式都只是顯示一個訊息盒 :

    function doAdd(){$.messager.alert('訊息','新增!');}
    function doEdit(){$.messager.alert('訊息','編輯!');}
    function doRemove(){$.messager.alert('訊息','刪除!');}    function doSave(){$.messager.alert('訊息','儲存!');}

另外, 為了接下來要測試線上編輯後端資料表內容, 我改用上面範例 6 以前所使用的 stocks 資料表 (因為我不想變動 stocks_list 資料表的內容), 所以遠端 JSON 資料來源為 get_stocks_search.php :

    $(document).ready(function(){
      $('#grid1').datagrid({
        url:'get_stocks_search.php',
        columns:[[
          {field:'name',title:'股票名稱',width:80,sortable:true},
          {field:'id',title:'股票代號',width:80,sortable:true},
          {field:'close',title:'收盤價 (元)',width:100,align:'right',sortable:true},
          {field:'volumn',title:'成交量 (張)',width:100,align:'right',sortable:true},
          {field:'meeting',title:'股東會日期',align:'left',sortable:true},
          {field:'election',title:'董監改選',width:80,align:'center',sortable:true},
          {field:'category',title:'類股',width:60,align:'center',sortable:true}
          ]],
        singleSelect:true,
        collapsible:true
        });

參考 get_stocks_list_search.php 修改為 get_stocks_search.php :

<?php
header('Content-Type: text/html;charset=UTF-8');
$host="abc.xyz.com";
$username="test";
$password="123";
$database="testdb";
$conn=mysql_connect($host, $username, $password); //建立連線
mysql_query("SET NAMES 'utf8'"); //設定查詢所用之字元集為 utf-8
mysql_select_db($database, $conn); //開啟資料庫
$page=isset($_POST['page']) ? intval($_POST['page']) : 1;
$rows=isset($_POST['rows']) ? intval($_POST['rows']) : 10;
$sort=isset($_POST['sort']) ? $_POST['sort'] : 'id';
$order=isset($_POST['order']) ? $_POST['order'] : 'asc';
if (isset($_POST['search_field'])) { //有 search
  $where=" WHERE ".$_POST['search_field']." LIKE '%".
         $_POST['search_what']."%'";
  }
else {$where="";} //無 search
$start=($page-1) * $rows;  //本頁第一個列索引 (0 起始)
$SQL="SELECT COUNT(*) FROM `stocks`".$where;
$RS=mysql_query($SQL, $conn);
list($total)=mysql_fetch_row($RS); //紀錄總筆數
$SQL="SELECT * FROM `stocks` ".$where." ORDER BY ".
     $sort." ".$order." LIMIT ".$start.",".$rows;
$result=mysql_query($SQL, $conn); //執行 SQL 指令
$stock=array();
for ($i=0; $i<mysql_numrows($result); $i++) { //走訪紀錄集 (列)
     $row=mysql_fetch_array($result); //取得列陣列
     $stock[$i]=array("name" => $row["name"],
                 "id" => $row["id"],
                 "close" => $row["close"],
                 "volumn" => $row["volumn"],
                 "meeting" => $row["meeting"],
                 "election" => $row["election"],
                 "category" => $row["category"]
                 );
     } //end of for
$arr=array("total" => $total, "rows" => $stock);
echo json_encode($arr);  //將陣列轉成 JSON 資料格式傳回
?>

如下列範例 11 所示 : 

測試範例 11 : http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-11.htm [看原始碼]


圖形按鈕看起來很不錯 !


jQuery EasyUI 環境配置

前幾天在找 jQuery 的 DataGrid 外掛時, 在下面這網站找到 jQuery EasyUI 這個好用的函式庫, 昨晚幫媽按摩完後, 睡覺前將這些資料整理如下 :

Top 5 jQuery UI Alternatives

它主要是利用 HTML5 技術來為 jQuery 提供簡易快速的 UI 介面, 我覺得是不錯的 jQueryUI 替代方案. 其官網, 範例以及下載連結如下 :

# jQuery EasyUI 官網
# jQuery EasyUI 範例

jQuery EasyUI 基本上是個商用軟體, 但提供 GPL 版本免費使用, 可從這裡下載 :

# jQuery EasyUI 下載 (GPL 版本)

目前是 1.4 版, 下載解開後目錄結構如下 :


專案中會用到的只有 jquery.min.js, jquery.easyui.min.js,  與 locale 目錄下的 easyui-lang-zh_TW (繁體中文化) 這三個檔案, 以及 themes 這個目錄即可. 但我 PHP 測試網站已經有 jQuery UI 的測試環境, 所以我只要複製 jquery.easyui.min.js 與 themes 目錄到我的網站的 jquery 目錄下即可. 因為 jQuery UI 已經有一個 themes 目錄在那裡, 為了區別, 所以我先把 EasyUI 的 themes 目錄改名為 easyui-themes 再壓縮上傳伺服器後解壓縮. 最後自備的 jquery 目錄下是長這樣 (圈選起來的是屬於 EasyUI 的, 其餘則是以前測試 jQueryUI 的) :


經過這樣配置, 我原先測試 jQueryUI 的伺服器環境就可以同時測試 EasyUI 了. 下面就以解壓縮目錄下的 demo/datagrid/basic.html 這個檔來測試一下是否配置無誤. 打開此檔可以發現於 head 中需指定下列資源檔 :

<link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="../../themes/icon.css">
<link rel="stylesheet" type="text/css" href="../demo.css">
<script type="text/javascript" src="../../jquery.min.js"></script>
<script type="text/javascript" src="../../jquery.easyui.min.js"></script>

這邊我們要根據環境配置修改 href 的相對路徑, 我的網站路徑配置如下 :

root
  |__ jquery
  |         |__ jquery.js
  |         |__ jquery.easyui.min.js
  |         |__ easyui-lang-zh_TW.js
  |         |__ easyui-themes
  |__ jquerytest
            |__ easyui-datagrid-1.htm


所以 JS 與 CSS 資源的相對路徑要改為如下 :

<link rel="stylesheet" type="text/css" href="../jquery/easyui-themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="../jquery/easyui-themes/icon.css">
<script type="text/javascript" src="../jquery/jquery.js"></script>
<script type="text/javascript" src="../jquery/jquery.easyui.min.js"></script>
<script type="text/javascript" src="../jquery/easyui-lang-zh_TW.js"></script>

接下來看 basic.html 中的 HTML5 表格內容, 其中 table 標籤的 data-options 屬性中的 url 是用來指定表格的 AJAX 資料來源, method 用來指定 HTTP 方法, 如下所示 :

<table class="easyui-datagrid" title="Basic DataGrid" style="width:700px;height:250px" data-options="singleSelect:true,collapsible:true,url:'datagrid_data1.josn',method:'get'">
  <thead>
    <tr>
      <th data-options="field:'itemid',width:80">Item ID</th>
      <th data-options="field:'productid',width:100">Product</th>
      <th data-options="field:'listprice',width:80,align:'right'">List Price</th>
      <th data-options="field:'unitcost',width:80,align:'right'">Unit Cost</th>
      <th data-options="field:'attr1',width:250">Attribute</th>
      <th data-options="field:'status',width:60,align:'center'">Status</th>
    </tr>
  </thead>
</table>


我們將原始的 basic.html 經上述修改後存成 easyui-datagrid-1.htm, 但是這個網頁檔在本機執行時只會顯示表格標題, 無法顯示表格內容, 必須將 datagrid_data1.json 這個資料來源檔案也上傳到伺服器才行, 其內容結構如下 :

{"total":28,"rows":[
    {"productid":"FI-SW-01",
     "productname":"Koi",
     "unitcost":10.00,
     "status":"P",
     "listprice":36.50,
     "attr1":"Large",
     "itemid":"EST-1"},
     ...
     ]}

可見需有 total (總筆數) 與 rows (列資料) 兩個屬性, 列資料是一個物件陣列, 每一個物件實體是欄位名稱與欄位值的對應.

範例 1http://mybidrobot.allalla.com/easyuitest/easyui-datagrid-1.htm [看原始碼]


當然, 實際應用上是由後端程式如 PHP 等產生輸出資料, 這時只要將 table 標籤的 data-options 屬性裡的 url 改為 .php 程式即可. 

第二種環境配置就是直接使用 EasyUI 官網的檔案, 放在 http://www.jeasyui.com/easyui/ 目錄下, 只要依照下載 zip 檔解壓縮後的目錄結構按圖索驥即可找到, 所以上述之資源指定要改為 :

 JS 與 CSS 資源的相對路徑要改為如下 :

<link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/themes/icon.css">
<script type="text/javascript" src="http://www.jeasyui.com/easyui/jquery.min.js"></script>
<script type="text/javascript" src="http://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="http://www.jeasyui.com/easyui/locale/easyui-lang-zh_TW.js"></script>

如下列範例 2 所示 :

範例 2 : http://mybidrobot.allalla.com/easyuitest/easyui-settings-cdn.htm [看原始碼]

效果是一樣的, 好處是不必自己準備資源檔.

參考資料 :

zTree-jQuery tree plug-ins

2014年9月6日 星期六

買液晶螢幕

因為小狐狸們開學了, 放學後常要用電腦寫作業, 而客廳的 win8 電腦因使用電視充當螢幕太大, 而且位置過高要抬頭看, 考慮移到書房去, 因此早上到 PCHOME 找到 Viewsonic 20 吋的, 促銷價 $2888 :

# 限時促銷 ViewSonic VA2046m-LED 20型LED寬螢幕

而且 24 小時快速到貨, 最晚明天 10 點就可收到了.

客廳以後就用樹莓派做家庭多媒體, 或者買個二手的 Mac Mini.

今天下午跟阿姨一起扶媽坐起來拍背, 避免臥床太久生褥瘡.

註 :

下午阿姨來病房接替我, 回到家後已三點半, 管理員通知我說螢幕剛到, 哇, PCHOME 24 小時到貨超過 5 小時, 不過中午時我在客戶回應中已回覆 "我可以等, 請勿催送貨員, 交通安全最重要". 就算準時送到, 我也還沒回家啊.

叫二哥幫忙把螢幕裝好, 一切 OK, 原先擔心 20 吋太大, 現在卻覺得還好. 


病房雜記

今天已經 9 月 6 日, 再過兩天就是中秋了. 我已一個多月沒寫日記, 因為媽的淋巴癌二度復發, 自 7/24 門診住院以來, 我幾乎都在病房過夜, 第二天左營阿姨來了, 再趕去上班. 小阿姨也再度每周搭高鐵下來照顧, 還有小舅一家的幫忙與關照, 不知如何言謝.

7/28 轉入單人病房後, 一連串的檢查發現, 不只是淋巴癌再現, 還多了個泌尿道上皮細胞癌. 病情每況愈下, 止痛藥已經無法止住疼痛, 必須使用嗎啡, 有時還要加高劑量. 再度復發化療其實已經效果不大, 副作用卻很嚴重, 電療也只是設法降低疼痛而已.

當查出腹痛的原因是上皮細胞癌, 醫生說可做低劑量化療時, 突然, 我心裡又看到一絲希望, 似乎媽還有再度治癒可能, 但是化療後那周, 由於血小板與白血球過低, 無法再繼續, 加上藥效過後的劇烈疼痛, 我跟醫生表達了安寧照護的意思, 只要鎮住疼痛即可, 不須積極治療, 因為每次去電療都是一種折磨.

檢查報告出來後, 我感覺到媽這次要能再回去種菜或許是奢求了. 我開始恐慌, 就像以前打電話時聽她說身體又怪怪時那樣. 後來向圖書館借了 "不被醫生殺死的 47 心得" 這本書, 才對安寧照護較能接受. 也讓我了解了一個道理, 人要跟癌症鬥爭, 要完全戰勝癌症, 事實上還是很無力. 化療過後似乎治癒了, 但幾年後又會復發, 當它再次撲過來時, 是那樣地快速與凌厲.

由於要在工作, 家庭, 與病房穿梭, 所以最近也把跟市圖借的書逐一清空, 閒書全部還掉, 只留下 PHP, jQuery, 以及投資方面的書. 前陣子忙的 Java 與 ExtJS 全部擱下.

九月小狐狸們都開學了, 姊姊上了高中似乎很高興, 她說還好有去考美術班. 二哥這學期上國二了, 山葉的鋼琴課在 8/17 的音樂比賽結束後就停了, 因為他似乎對鋼琴不是很有熱情, 音樂會我也沒去看, 只是載他去彩排時拍了一些照片而已. 菁菁上小六, 據說本屆不舉辦畢業旅行了, 我沒空參加班親會, 所以無法跟老師確認. 本學期開始她自己走路上學, 學學獨立也好.

阿蘭的終止收養聲請我已跑兩趟家事法庭, 我的感想是, 我第一趟就已經說清楚問題了, 但照法律程序, 第一趟 "必須" 是白跑, 法官一定會依法駁回, 因為不是本人提出聲請, 然後我們再提出抗告, 所以, 還要跑第三趟開庭. 跑一趟要花程序費一千塊.

今天下午媽媽在睡覺, 得空姑且記一下這些日子來的生活點滴.