本周閒暇時間都花在寫程式, 週日回家又因午後下陣雨, 也是躲在屋內寫程式. 還好近午時看天色不對, 叫喚二哥幫忙將路邊兩棵芒果樹套袋, 但二十分鐘不到就下起雨來了, 根本沒套完.
因下周菁菁畢業考, 所以週日早上我一個人上市集買菜. 上週二哥的手機在鄉下突然不見, 本周回來到處找, 遍尋不著, 真是奇怪. 上週我跟姐姐與菁菁都出去買菜, 回來時二哥就說找不到手機. 我們出去時他不是還在用嗎? 不過這也好, 這樣就不會一直想玩遊戲. 但是手機 SIM 卡還有儲值數百元, 所以還是得找出來才行 (二哥該不會懷疑是我偷藏起來吧? 我若是要禁止, 就會要他交出來, 不會偷藏).
週日早上把同事給我的木瓜樹種在菜園, 這樣總共有四棵了, 希望年底能開始收成. 傍晚小舅他們來了, 幫忙把他們寄放的舊流理台搬出來清洗, 因為小木屋也許再過半個月就完工了.
稻穀幾天前收割, 田裡鋪滿了切斷後的稻稈, 我突然想起書本有提到, 日本農人常用稻稈鋪在冬瓜藤蔓下, 一來使冬瓜不會直接碰觸泥土, 二來可減少雜草叢生情形. 所以趁天尚未黑, 趕緊一簍簍將田裡的碎稻稈鋪在菜園空地上 :
下周再將藤蔓區也鋪滿, 反正下一期稻作申請轉作, 不會犁田, 所以稻稈都會在田裡.
2015年5月31日 星期日
2015年5月30日 星期六
Easyui 測試 : Combobox 下拉式選單
今天在修改財工程式時遇到 Combobox 的運用問題, 在實際系統中測試變數較多, 環境較複雜, 不容易掌握問題的原因, 因此花一點時間單獨來測試一下 Combobox.
根據 Easyui 文件, Combobox 可以用兩種 HTML 元件轉化, 一是 SELECT-OPTION 下拉式選單, 二是 INPUT 元件, 只要指定 class 為 easyui-combobox 即可. 用 SELECT-OPTION 當然是最直覺的, 如下列範例 1 所示 :
範例 1 : http://mybidrobot.allalla.com/easyuitest/easyui-combobox-1.htm [看原始碼]
<select id="category" class="easyui-combobox" name="category" data-options="panelHeight:'auto'">
<option value="水泥">水泥</option>
<option value="食品">食品</option>
<option value="塑膠">塑膠</option>
<option value="鋼鐵">鋼鐵</option>
<option value="電子" selected>電子</option>
<option value="金融">金融</option>
</select>
此處 combobox 的屬性就放在 data-options 中, 這裡 panelHeight 設為 'auto', 表示會視選項多寡自動調整拉把的高度, 也可以直接指定一個數值 (例如 100 或 '100px', 有 px 須視為字串), 這樣高度就會被固定. 利用 OPTION 的 selected 屬性就可以設定初始值了. 注意, combobox 預設即有 autocomplete 功能, 輸入任何一個字首, 就會顯示過濾後的選項了.
此外也可以用 Javascript 來設定 data-options 中的屬性值, 如範例 2 所示 :
範例 2 : http://mybidrobot.allalla.com/easyuitest/easyui-combobox-2.htm [看原始碼]
<select id="category" class="easyui-combobox" name="category">
<option value="水泥">水泥</option>
<option value="食品">食品</option>
<option value="塑膠">塑膠</option>
<option value="鋼鐵">鋼鐵</option>
<option value="電子" selected>電子</option>
<option value="金融">金融</option>
</select>
<script language="javascript">
$(document).ready(function(){
$("#category").combobox({
panelHeight:'80px',
panelWidth:150
});
});
</script>
此例我們將 panelHeight 改為 '80px' (注意, 須用引號括起來), 但選項長度超過 80px, 所以會出現垂直滑動桿. 當然也可以全部都用 Javascript 設定, 但這最好使用第二種元件, 也就是 INPUT 來製作, 如範例三所示 :
範例 3 : http://mybidrobot.allalla.com/easyuitest/easyui-combobox-3.htm [看原始碼]
<input id="category" name="category">
<script language="javascript">
$(document).ready(function(){
$("#category").combobox({
valueField:'value',
textField:'text',
data:[
{value:'水泥',text:'水泥'},
{value:'食品',text:'食品'},
{value:'塑膠',text:'塑膠'},
{value:'鋼鐵',text:'鋼鐵'},
{value:'電子',text:'電子',selected:true},
{value:'金融',text:'金融'}
]
});
});
</script>
此例中我們只放置了一個具有 id 屬性的 INPUT 元素, 然後在 combobox 方法中設定 valueField (option 的 value 屬性名稱), textField (option 的顯示字串), 以及 data (option 屬性陣列) 這三個屬性即可. valueField 與 textField 的值是任意定的, 只要能與 data 中的設定相符即可. 預設的選項要用 seleted:true 來指定.
注意, 全部使用 Javascript 設定時, 應該像範例 3 那樣使用 INPUT 元件, 不要用沒有 option 的 select 來做, 否則會變得扁扁的. 將範例 3 的 INPUT 改為如下測試即知 :
<select id="category" name="category"></select>
# 2015-05-30 21:50:50 註 :
晚上在鄉下測試好久, 終於找到原因了, 原來問題出在 mode 這個屬性沒有設, 預設是 local, 這樣 combobox 只會在載入的資料的 text 中 (不是 value), 搜尋以輸入字開頭的選項. 參閱 Easyui 文件 combobox 的 mode 屬性說明 :
"Defines how to load list data when text changed. Set to 'remote' if the combobox loads from server. When set to 'remote' mode, what the user types will be sent as the http request parameter named 'q' to server to retrieve the new data."
也就是說, 當 mode 為 remote 時, 輸入查詢字時會以 http 要求將此查詢字串用 q 這個參數傳給後端伺服器. 為了說明這個問題, 我先準備了一個含有台股股票代號與公司名稱的資料表 stocks_list :
--
-- 表的結構 `stocks_list`
--
CREATE TABLE IF NOT EXISTS `stocks_list` (
`stock_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`stock_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`stock_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- 轉存資料表中的資料 `stocks_list`
--
INSERT INTO `stocks_list` (`stock_id`, `stock_name`) VALUES
('0015', '富邦'),
('0050', '台灣50'),
('0051', '中100'),
('0052', 'FB科技'),
('0053', '寶電子'),
('0054', '台商50'),
('0055', '寶金融'),
....
('9958', '世紀鋼'),
('2342', '茂矽'),
('2364', '倫飛'),
('2816', '旺旺保');
然後我希望在 combobox 中, 輸入股票代號的第一個字元時就顯示以其為首的所有股票; 或者當輸入公司名稱的任一字元時, 就顯示所有含有此字元的股票. 亦即, 前者在 SQL 搜尋條件是 "$q%"; 而後者是 "%$q%", 如下面範例 5 所示 :
範例 5 : http://mybidrobot.allalla.com/easyuitest/easyui-combobox-5.htm [看原始碼]
<input id="stock" name="stock">
<script language="javascript">
$(document).ready(function(){
$("#stock").combobox({
panelHeight:150,
valueField:'value',
textField:'text',
url:"get_combobox_stocks_list.php"
});
});
</script>
此例中我們僅指定資料來源為遠端程式 get_combobox_stocks_list.php, 其內容如下 :
<?php
header('Content-Type: text/html;charset=UTF-8');
mysql_query("SET NAMES 'utf8'"); //設定查詢所用之字元集為 utf-8
mysql_select_db($database, $conn); //開啟資料庫
$q=$_REQUEST["q"]; //combobox 送出的查詢參數
if (isset($q)) { //有搜尋
$where=" WHERE `stock_id` LIKE '".$q."%' OR ".
"`stock_name` LIKE '%".$q."%'";
}
else {$where="";} //沒有搜尋,顯示全部
$SQL="SELECT stock_id,stock_name FROM stocks_list".$where;
$result=mysql_query($SQL, $conn); //執行 SQL 指令
$arr=array();
for ($i=0; $i<mysql_numrows($result); $i++) { //走訪紀錄集 (列)
$row=mysql_fetch_array($result); //取得列陣列
$value=$row["stock_id"];
$text=$row["stock_id"]." (".$row["stock_name"].")";
$arr[$i]=array("value" => $value,"text" => $text);
}
echo json_encode($arr);
?>
此程式回應的 value 屬性為股票代號, 而顯示的選項文字是像這樣 : 2330 (台積電). 輸入 2 會顯示所有股票代號開頭為 2 之選項, 但是當輸入股票名稱, 像 "台" 時, 卻沒有半個選項. 原因就是如上所言, combobox 的 mode 屬性預設是 "local", 它只會在載入的選項資料中, 從開頭去比對 text 的內容, 因為傳回的 text 屬性都是以代號開頭, 因此輸入名稱就不會有任何匹配的選項了.
解決之道就是加上 mode:"remote" 設定即可, 如範例 6 所示 :
範例 6 : http://mybidrobot.allalla.com/easyuitest/easyui-combobox-6.htm [看原始碼]
<input id="stock" name="stock">
<script language="javascript">
$(document).ready(function(){
$("#stock").combobox({
panelHeight:150,
valueField:'value',
textField:'text',
url:"get_combobox_stocks_list.php",
mode:'remote'
});
});
</script>
哈哈, 終於搞定這個困擾我許久的問題了. 原以為 easyui 的 combobox 處理中文有 bug, 前面範例 1~4 破除了這個疑慮, 沒想到是設定上的問題.
不過這種 remote 方式會增加許多 request 次數, 例如輸入一個 "台" 字就會產生三次 http 要求, 如下圖所示, 第一個是輸入 "ㄊ" 時傳出 q 參數, 第二個是輸入 "ㄞ" 時傳出 q="ㄊㄞ" 給後端, 最後一個是傳出 q="台" :
最後, 也最重要的是, 當使用者選定選項後必須要去執行一項工作 (不然是選好玩的嗎), 這就要用到 onSelect 這個屬性, 其值是一個回呼函數, combobox 會傳入一個選項參數物件 item (不一定用此名稱, 我們可任意命名傳入參數, 例如 option), 利用 valueField 與 textField 所定義的值與顯示文字欄位名稱, 就可取得被選取項目的 value 與 text. 例如 valueField 與 textField 分別定為 "value" 與 "text", 則 item.value 與 item.text 就是被選取項目的值與顯示文字, 如範例 7 所示 :
範例 7 : http://mybidrobot.allalla.com/easyuitest/easyui-combobox-7.htm [看原始碼]
<input id="stock" name="stock">
<script language="javascript">
$(document).ready(function(){
$("#stock").combobox({
panelHeight:150,
valueField:'value',
textField:'text',
url:'get_combobox_stocks_list.php',
mode:'remote',
onSelect:function(item){
$.messager.alert("Info", item.value + " " + item.text);
}
});
});
</script>
實際運用上可能是去更新 datagrid 的內容, 例如 :
onSelect:function(item){
$('#daily').datagrid("load",{
op:"list_daily",
stock_id:item.value
});
}
此處就是傳出 op 與 stock_id 這兩個參數去載入 id 為 daily 的 datagrid 內容.
參考 :
# EasyUI的ComBoBox怎么设定默认值?
根據 Easyui 文件, Combobox 可以用兩種 HTML 元件轉化, 一是 SELECT-OPTION 下拉式選單, 二是 INPUT 元件, 只要指定 class 為 easyui-combobox 即可. 用 SELECT-OPTION 當然是最直覺的, 如下列範例 1 所示 :
範例 1 : http://mybidrobot.allalla.com/easyuitest/easyui-combobox-1.htm [看原始碼]
<select id="category" class="easyui-combobox" name="category" data-options="panelHeight:'auto'">
<option value="水泥">水泥</option>
<option value="食品">食品</option>
<option value="塑膠">塑膠</option>
<option value="鋼鐵">鋼鐵</option>
<option value="電子" selected>電子</option>
<option value="金融">金融</option>
</select>
此處 combobox 的屬性就放在 data-options 中, 這裡 panelHeight 設為 'auto', 表示會視選項多寡自動調整拉把的高度, 也可以直接指定一個數值 (例如 100 或 '100px', 有 px 須視為字串), 這樣高度就會被固定. 利用 OPTION 的 selected 屬性就可以設定初始值了. 注意, combobox 預設即有 autocomplete 功能, 輸入任何一個字首, 就會顯示過濾後的選項了.
此外也可以用 Javascript 來設定 data-options 中的屬性值, 如範例 2 所示 :
範例 2 : http://mybidrobot.allalla.com/easyuitest/easyui-combobox-2.htm [看原始碼]
<option value="水泥">水泥</option>
<option value="食品">食品</option>
<option value="塑膠">塑膠</option>
<option value="鋼鐵">鋼鐵</option>
<option value="電子" selected>電子</option>
<option value="金融">金融</option>
</select>
<script language="javascript">
$(document).ready(function(){
$("#category").combobox({
panelHeight:'80px',
panelWidth:150
});
});
</script>
此例我們將 panelHeight 改為 '80px' (注意, 須用引號括起來), 但選項長度超過 80px, 所以會出現垂直滑動桿. 當然也可以全部都用 Javascript 設定, 但這最好使用第二種元件, 也就是 INPUT 來製作, 如範例三所示 :
範例 3 : http://mybidrobot.allalla.com/easyuitest/easyui-combobox-3.htm [看原始碼]
<input id="category" name="category">
<script language="javascript">
$(document).ready(function(){
$("#category").combobox({
valueField:'value',
textField:'text',
data:[
{value:'水泥',text:'水泥'},
{value:'食品',text:'食品'},
{value:'塑膠',text:'塑膠'},
{value:'鋼鐵',text:'鋼鐵'},
{value:'電子',text:'電子',selected:true},
{value:'金融',text:'金融'}
]
});
});
</script>
此例中我們只放置了一個具有 id 屬性的 INPUT 元素, 然後在 combobox 方法中設定 valueField (option 的 value 屬性名稱), textField (option 的顯示字串), 以及 data (option 屬性陣列) 這三個屬性即可. valueField 與 textField 的值是任意定的, 只要能與 data 中的設定相符即可. 預設的選項要用 seleted:true 來指定.
注意, 全部使用 Javascript 設定時, 應該像範例 3 那樣使用 INPUT 元件, 不要用沒有 option 的 select 來做, 否則會變得扁扁的. 將範例 3 的 INPUT 改為如下測試即知 :
<select id="category" name="category"></select>
以上都是使用本地端資料, combobox 也可以由遠端提供動態選項資料, 這必須用到 url 這個屬性, 若需要本地提供參數, 也需要用到 method 與 queryParams 屬性, 如範例 4 所示 :
<input id="category" name="category">
<script language="javascript">
$(document).ready(function(){
$("#category").combobox({
panelHeight:'auto',
valueField:'value',
textField:'text',
url:"get_combobox_category.php"
});
});
</script>
此例中我們透過 url 指定由遠端程式 get_combobox_category.php 提供選項資料, 不過須先在後端資料庫建一個 category 資料表, 裡面只有一個欄位 category, 填入上面本地資料的六種類別, 此 category 資料表匯出內容如下 :
--
-- 表的結構 `category`
--
CREATE TABLE IF NOT EXISTS `category` (
`category` varchar(255) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- 轉存資料表中的資料 `category`
--
INSERT INTO `category` (`category`) VALUES
('水泥'),
('食品'),
('塑膠'),
('鋼鐵'),
('電子'),
('金融'),
('金融');
然後就可以撰寫輸出此 category 資料的程式 get_combobox_category.php 如下 :
<?php
header('Content-Type: text/html;charset=UTF-8');
$host="mysql.1freehosting.com";
$username="easyui_test";
$password="blabla";
$database="easyui_test";
$conn=mysql_connect($host, $username, $password); //建立連線
mysql_query("SET NAMES 'utf8'"); //設定查詢所用之字元集為 utf-8
mysql_select_db($database, $conn); //開啟資料庫
$SQL="SELECT * FROM `category`";
$result=mysql_query($SQL, $conn); //執行 SQL 指令
$arr=array();
for ($i=0; $i<mysql_numrows($result); $i++) { //走訪紀錄集 (列)
$row=mysql_fetch_array($result); //取得列陣列
if ($i==4) { //指定第 5 個為預設值
$arr[$i]=array("value" => $row["category"],
"text" => $row["category"],
"selected" => true);
}
else {
$arr[$i]=array("value" => $row["category"],
"text" => $row["category"]);
}
}
echo json_encode($arr); //將陣列轉成 JSON 資料格式傳回
?>
此程式會輸出一個 JSON 物件陣列 :
[{"value":"\u6c34\u6ce5","text":"\u6c34\u6ce5"},{"value":"\u98df\u54c1","text":"\u98df\u54c1"},{"value":"\u5851\u81a0","text":"\u5851\u81a0"},{"value":"\u92fc\u9435","text":"\u92fc\u9435"},{"value":"\u96fb\u5b50","text":"\u96fb\u5b50","selected":true}, {"value":"\u91d1\u878d","text":"\u91d1\u878d"},{"value":"\u91d1\u878d","text":"\u91d1\u878d"}]
此處第五項多了一個 selected 屬性, 設為 true 即為預設值. 好了, combobox 就暫時測試到這裡, 總算釐清 combobox 中文傳回值可正常運作無疑, 要回頭檢視財工程式到底哪裡弄錯以至於無法顯示選項, 以後有空再繼續整理測試結果.
# 2015-05-30 21:50:50 註 :
晚上在鄉下測試好久, 終於找到原因了, 原來問題出在 mode 這個屬性沒有設, 預設是 local, 這樣 combobox 只會在載入的資料的 text 中 (不是 value), 搜尋以輸入字開頭的選項. 參閱 Easyui 文件 combobox 的 mode 屬性說明 :
"Defines how to load list data when text changed. Set to 'remote' if the combobox loads from server. When set to 'remote' mode, what the user types will be sent as the http request parameter named 'q' to server to retrieve the new data."
也就是說, 當 mode 為 remote 時, 輸入查詢字時會以 http 要求將此查詢字串用 q 這個參數傳給後端伺服器. 為了說明這個問題, 我先準備了一個含有台股股票代號與公司名稱的資料表 stocks_list :
--
-- 表的結構 `stocks_list`
--
CREATE TABLE IF NOT EXISTS `stocks_list` (
`stock_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`stock_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`stock_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- 轉存資料表中的資料 `stocks_list`
--
INSERT INTO `stocks_list` (`stock_id`, `stock_name`) VALUES
('0015', '富邦'),
('0050', '台灣50'),
('0051', '中100'),
('0052', 'FB科技'),
('0053', '寶電子'),
('0054', '台商50'),
('0055', '寶金融'),
....
('9958', '世紀鋼'),
('2342', '茂矽'),
('2364', '倫飛'),
('2816', '旺旺保');
然後我希望在 combobox 中, 輸入股票代號的第一個字元時就顯示以其為首的所有股票; 或者當輸入公司名稱的任一字元時, 就顯示所有含有此字元的股票. 亦即, 前者在 SQL 搜尋條件是 "$q%"; 而後者是 "%$q%", 如下面範例 5 所示 :
範例 5 : http://mybidrobot.allalla.com/easyuitest/easyui-combobox-5.htm [看原始碼]
<input id="stock" name="stock">
<script language="javascript">
$(document).ready(function(){
$("#stock").combobox({
panelHeight:150,
valueField:'value',
textField:'text',
url:"get_combobox_stocks_list.php"
});
});
</script>
此例中我們僅指定資料來源為遠端程式 get_combobox_stocks_list.php, 其內容如下 :
<?php
header('Content-Type: text/html;charset=UTF-8');
$host="mysql.1freehosting.com";
$username="easyui_test";
$password="blabla";
$database="easyui_test";
$conn=mysql_connect($host, $username, $password); //建立連線mysql_query("SET NAMES 'utf8'"); //設定查詢所用之字元集為 utf-8
mysql_select_db($database, $conn); //開啟資料庫
$q=$_REQUEST["q"]; //combobox 送出的查詢參數
if (isset($q)) { //有搜尋
$where=" WHERE `stock_id` LIKE '".$q."%' OR ".
"`stock_name` LIKE '%".$q."%'";
}
else {$where="";} //沒有搜尋,顯示全部
$SQL="SELECT stock_id,stock_name FROM stocks_list".$where;
$result=mysql_query($SQL, $conn); //執行 SQL 指令
$arr=array();
for ($i=0; $i<mysql_numrows($result); $i++) { //走訪紀錄集 (列)
$row=mysql_fetch_array($result); //取得列陣列
$value=$row["stock_id"];
$text=$row["stock_id"]." (".$row["stock_name"].")";
$arr[$i]=array("value" => $value,"text" => $text);
}
echo json_encode($arr);
?>
此程式回應的 value 屬性為股票代號, 而顯示的選項文字是像這樣 : 2330 (台積電). 輸入 2 會顯示所有股票代號開頭為 2 之選項, 但是當輸入股票名稱, 像 "台" 時, 卻沒有半個選項. 原因就是如上所言, combobox 的 mode 屬性預設是 "local", 它只會在載入的選項資料中, 從開頭去比對 text 的內容, 因為傳回的 text 屬性都是以代號開頭, 因此輸入名稱就不會有任何匹配的選項了.
解決之道就是加上 mode:"remote" 設定即可, 如範例 6 所示 :
範例 6 : http://mybidrobot.allalla.com/easyuitest/easyui-combobox-6.htm [看原始碼]
<input id="stock" name="stock">
<script language="javascript">
$(document).ready(function(){
$("#stock").combobox({
panelHeight:150,
valueField:'value',
textField:'text',
url:"get_combobox_stocks_list.php",
mode:'remote'
});
});
</script>
哈哈, 終於搞定這個困擾我許久的問題了. 原以為 easyui 的 combobox 處理中文有 bug, 前面範例 1~4 破除了這個疑慮, 沒想到是設定上的問題.
不過這種 remote 方式會增加許多 request 次數, 例如輸入一個 "台" 字就會產生三次 http 要求, 如下圖所示, 第一個是輸入 "ㄊ" 時傳出 q 參數, 第二個是輸入 "ㄞ" 時傳出 q="ㄊㄞ" 給後端, 最後一個是傳出 q="台" :
最後, 也最重要的是, 當使用者選定選項後必須要去執行一項工作 (不然是選好玩的嗎), 這就要用到 onSelect 這個屬性, 其值是一個回呼函數, combobox 會傳入一個選項參數物件 item (不一定用此名稱, 我們可任意命名傳入參數, 例如 option), 利用 valueField 與 textField 所定義的值與顯示文字欄位名稱, 就可取得被選取項目的 value 與 text. 例如 valueField 與 textField 分別定為 "value" 與 "text", 則 item.value 與 item.text 就是被選取項目的值與顯示文字, 如範例 7 所示 :
範例 7 : http://mybidrobot.allalla.com/easyuitest/easyui-combobox-7.htm [看原始碼]
<input id="stock" name="stock">
<script language="javascript">
$(document).ready(function(){
$("#stock").combobox({
panelHeight:150,
valueField:'value',
textField:'text',
url:'get_combobox_stocks_list.php',
mode:'remote',
onSelect:function(item){
$.messager.alert("Info", item.value + " " + item.text);
}
});
});
</script>
實際運用上可能是去更新 datagrid 的內容, 例如 :
onSelect:function(item){
$('#daily').datagrid("load",{
op:"list_daily",
stock_id:item.value
});
}
參考 :
# EasyUI的ComBoBox怎么设定默认值?
2015年5月29日 星期五
GAE 出現 Server Error 問題
今天財工程式告一段落, 把 GAE 的 cron table 修改後上傳 Google 讓心跳啟動, 但是連線 GAE 網站卻發現 Server Error :
事實上過了 30 秒再連線也是無濟於事, 因為這是我的 Python 程式有問題之故. 到 "Logs" 檢視 Error 原因, 發現是抓取信用額度總量管制餘額表的程式 fetch_twse_daily_debit.php 時出現錯誤 :
('/fetch_twse_daily_institutes', fetch_twse_daily_institutes),
('/technical_analysis', technical_analysis),
('/create_daily_report', create_daily_report),
('/fetch_daily_report', fetch_daily_report),
('/fetch_twse_daily_debit', fetch_twse_daily_debit),
所以只要補定義此類別即可 :
class fetch_twse_daily_debit(webapp2.RequestHandler):
def get(self):
url="http://mystockbot.com/cron/fetch_twse_daily_debit.php"
result=urlfetch.fetch(url, deadline=60)
if result.status_code == 200:
self.response.write(result.content)
else:
out="urlfetch failed"
self.response.write(out)
這樣 GAE 就可正常運作了, 如下圖所示, 在 cron 啟動後的三個多小時因為程式錯誤導致所有 Request 都收到 500 Server Error 回應 (紅色), 改正後全部恢復正常的藍色了 :
先跑一個星期再來看看還要改哪裡.
Error: Server Error
The server encountered an error and could not complete your request.Please try again in 30 seconds.
事實上過了 30 秒再連線也是無濟於事, 因為這是我的 Python 程式有問題之故. 到 "Logs" 檢視 Error 原因, 發現是抓取信用額度總量管制餘額表的程式 fetch_twse_daily_debit.php 時出現錯誤 :
Traceback (most recent call last):
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 240, in Handle
handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler
handler, path, err = LoadObject(self._handler)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 85, in LoadObject
obj = __import__(path[0])
File "/base/data/home/apps/s~appfog-twstockbot/1.384633447891051628/main.py", line 228, in
('/fetch_twse_daily_debit', fetch_twse_daily_debit),
NameError: name 'fetch_twse_daily_debit' is not defined
原來我在 webapp2.WSGIApplication 中指派了 fetch_twse_daily_debit 這個 URL 所對應的 Class 名稱, 但是卻沒有定義這個類別的內容 :('/fetch_twse_daily_institutes', fetch_twse_daily_institutes),
('/technical_analysis', technical_analysis),
('/create_daily_report', create_daily_report),
('/fetch_daily_report', fetch_daily_report),
('/fetch_twse_daily_debit', fetch_twse_daily_debit),
所以只要補定義此類別即可 :
class fetch_twse_daily_debit(webapp2.RequestHandler):
def get(self):
url="http://mystockbot.com/cron/fetch_twse_daily_debit.php"
result=urlfetch.fetch(url, deadline=60)
if result.status_code == 200:
self.response.write(result.content)
else:
out="urlfetch failed"
self.response.write(out)
這樣 GAE 就可正常運作了, 如下圖所示, 在 cron 啟動後的三個多小時因為程式錯誤導致所有 Request 都收到 500 Server Error 回應 (紅色), 改正後全部恢復正常的藍色了 :
先跑一個星期再來看看還要改哪裡.
2015年5月27日 星期三
第 22 周記事
今天已是週三了, 因為專心寫程式, 所以上週週記都沒時間寫. 過去這一周豪雨不斷, 雖然旱象解除, 但也造成一些災難. 因為下雨沒辦法出去菜園幹活, 所以專心寫財工程式, 自從四月底發現 000a.biz 停掉我的軟體機器人後, 我就回頭來改寫, 把整個專案移植到 Appfog 去. 因此 Arduino, 風力發電機, 水車都要先晾一邊了, 雖然每次看到那一票書跟板子零件都會心癢癢的.
菜園南邊竹架上的胡瓜 (小舅帶回來種的) 最近結果豐碩, 每周都有兩三顆可採, 因為長在竹架上, 所以有時沒注意就會太老, 只好拿來留種.
菜園南邊竹架上的胡瓜 (小舅帶回來種的) 最近結果豐碩, 每周都有兩三顆可採, 因為長在竹架上, 所以有時沒注意就會太老, 只好拿來留種.
茄子也是不斷開花結果, 只要過了採收期就會由深紫色變淡, 壓起來變硬, 這樣就不好吃了, 只好丟掉 :
現在菜園都佈滿冬瓜藤蔓, 走進菜園都要躡手躡腳, 免得踩到藤蔓與花朵 :
年初從公司園子裡挖回來的山蕉已長到與我同高, 果然作物最需要的是陽光與肥料, 以前在公司的樹林裡, 周遭都被高大的樹木遮住陽光, 根本長不大 :
等本周天氣放晴, 要動手來清理路邊的甘蔗園與香蕉園, 把老香蕉樹砍掉, 這樣新發的芽才會長得好.
2015年5月20日 星期三
智利陸軍的障礙接力賽
昨天在 Youtube 看到這個影片, 讓我對智利刮目相看, 原來人家是這樣訓練軍隊的!
想想我們的五百障礙簡直是小兒科呢! 以前服預官役時最怕背著步槍爬竿, 因為全副武裝太重, 我臂力差根本爬不上去, 會被阿兵哥笑. 如果我們也用人家智利這套, 我看我會逃官吧!
想想我們的五百障礙簡直是小兒科呢! 以前服預官役時最怕背著步槍爬竿, 因為全副武裝太重, 我臂力差根本爬不上去, 會被阿兵哥笑. 如果我們也用人家智利這套, 我看我會逃官吧!
2015年5月18日 星期一
第 21 周記事
本周為了姊姊下個月學校要去蘇州交流跑了兩趟領務局, 一次是補交照片, 過了兩天又通知說身分證是舊的, 想起去年底有申請補發, 姊姊拿給我的是後來又找到的舊身分證, 領務局核發護照時會向戶政單位查核身分證件, 所以又跑第二趟. 台胞證要等護照下來, 再委託旅行社辦理, 雄獅價錢是 $1500, 台北明陽 $1300 :
# 申請台胞證
週六菁菁去百博做入班測驗, 她的成績與程度可能會比姊姊那時差吧! 我們家小狐狸數理都不太行.
昨天聽小舅媽說, 大阿姨的外勞似乎沒在煮, 常常一大堆菜放壞掉全部丟垃圾車, 兩個人竟然吃醬油拌飯! 難不成我每周拿去的菜都白費了? 那真是可惜了. 原本我對此印尼籍外勞塞噴娜印象甚佳, 看起來很老實, 只是語言不通, 我用英文也無法與其溝通, 交代她如何煮她也聽不懂. 請外勞的麻煩就是這樣. 舅媽說不如送養護中心, 但是大阿姨願意去嗎? 這一代的老人真是可憐, 介於大家庭與小家庭, 農業與工業社會的遞變世代, 他們奉養父母終老, 但等自己老了, 時代卻變了, 沒有大家庭了, 孩子在新竹台北工作, 甚至是深圳, 北京, 紐約. 只能被送去養老院.
本週把財工的程式做了大改變, 恢復 2011 年原本的每日追蹤表, 甚至加上每月追蹤表, 希望 Appfog 不會對此做出限制才好, 大不了必要時花錢租虛擬主機亦可.
週日又去買了 100 張芒果袋, 傍晚繼續套袋, 到六點還是沒套完, 因為要煮菜了, 只好下周繼續. 只是芒果越來越大顆, 太晚套的話, 搞不好已被蟲蟲入侵了.
菜園現在被冬瓜藤四處攀爬, 令人舉步維艱, 怕踩到藤蔓. 冬瓜開黃色的花, 我查 "第一次種菜" 這本書, 說跟南瓜一樣, 最好在開花時進行人工授粉, 將熊花採下來, 撕開花瓣會看到裡面雄花的蕊, 將其與雌花的蕊柱接觸即可授粉. 雌花和雄花的差別是, 雌花底下有一個圓鼓鼓肥大的子房. 正面結構也有差異, 如下取自 "芒果树下种冬瓜,双丰收" 照片所示 :
昨天下午要做冬瓜封, 發現冰箱的甘蔗不夠了, 只好去蔗園砍一株來用. 但找來找去竟然沒看到堪用的南崗蔗, 但找到一株西洋蔗, 砍下來後削皮時發現非常脆, 很好削, 而且非常甜, 這拿來做料理實在太可惜了, 應該當水果吃. 我把頭尾切下拿去菜園種, 這樣的好品種一定要留下來.
雨季就快要來了, 菜園我看就只種冬瓜, 茄子, 空心菜與地瓜葉就好.
# 申請台胞證
週六菁菁去百博做入班測驗, 她的成績與程度可能會比姊姊那時差吧! 我們家小狐狸數理都不太行.
昨天聽小舅媽說, 大阿姨的外勞似乎沒在煮, 常常一大堆菜放壞掉全部丟垃圾車, 兩個人竟然吃醬油拌飯! 難不成我每周拿去的菜都白費了? 那真是可惜了. 原本我對此印尼籍外勞塞噴娜印象甚佳, 看起來很老實, 只是語言不通, 我用英文也無法與其溝通, 交代她如何煮她也聽不懂. 請外勞的麻煩就是這樣. 舅媽說不如送養護中心, 但是大阿姨願意去嗎? 這一代的老人真是可憐, 介於大家庭與小家庭, 農業與工業社會的遞變世代, 他們奉養父母終老, 但等自己老了, 時代卻變了, 沒有大家庭了, 孩子在新竹台北工作, 甚至是深圳, 北京, 紐約. 只能被送去養老院.
本週把財工的程式做了大改變, 恢復 2011 年原本的每日追蹤表, 甚至加上每月追蹤表, 希望 Appfog 不會對此做出限制才好, 大不了必要時花錢租虛擬主機亦可.
週日又去買了 100 張芒果袋, 傍晚繼續套袋, 到六點還是沒套完, 因為要煮菜了, 只好下周繼續. 只是芒果越來越大顆, 太晚套的話, 搞不好已被蟲蟲入侵了.
菜園現在被冬瓜藤四處攀爬, 令人舉步維艱, 怕踩到藤蔓. 冬瓜開黃色的花, 我查 "第一次種菜" 這本書, 說跟南瓜一樣, 最好在開花時進行人工授粉, 將熊花採下來, 撕開花瓣會看到裡面雄花的蕊, 將其與雌花的蕊柱接觸即可授粉. 雌花和雄花的差別是, 雌花底下有一個圓鼓鼓肥大的子房. 正面結構也有差異, 如下取自 "芒果树下种冬瓜,双丰收" 照片所示 :
昨天下午要做冬瓜封, 發現冰箱的甘蔗不夠了, 只好去蔗園砍一株來用. 但找來找去竟然沒看到堪用的南崗蔗, 但找到一株西洋蔗, 砍下來後削皮時發現非常脆, 很好削, 而且非常甜, 這拿來做料理實在太可惜了, 應該當水果吃. 我把頭尾切下拿去菜園種, 這樣的好品種一定要留下來.
雨季就快要來了, 菜園我看就只種冬瓜, 茄子, 空心菜與地瓜葉就好.
2015年5月16日 星期六
十分鐘讓你看懂科技性失業
今天在 Tsung's Blog 看到這短片, 探討自動化科技不斷進步下, 未來的人們將會面臨 100 年前汽車工業發展後, 馬兒所面臨的科技性失業問題. 未來不僅硬體機器人會奪走大多數藍領的工作, 軟體機器人也將讓很多白領階級丟掉飯碗.
# https://www.youtube.com/watch?t=895&v=uAvbinkTqzY
我感到最有興趣的是, 在這短片大約 7 分 30 秒左右, 談到未來具有人工智慧的軟體機器人, 將會具備自我學習能力, 也就是說會自行寫出具有先進演算法的軟體, 也能夠修正本身的瑕疵與錯誤, 使自己不斷進化 ... 天啊, 太可怕了, 軟體工程師也將沒搞頭了.
參考 :
# How to Teach Computers to Learn on Their Own
# Machines that Think for Themselves - Yaser S. Abu
# https://www.youtube.com/watch?t=895&v=uAvbinkTqzY
我感到最有興趣的是, 在這短片大約 7 分 30 秒左右, 談到未來具有人工智慧的軟體機器人, 將會具備自我學習能力, 也就是說會自行寫出具有先進演算法的軟體, 也能夠修正本身的瑕疵與錯誤, 使自己不斷進化 ... 天啊, 太可怕了, 軟體工程師也將沒搞頭了.
參考 :
# How to Teach Computers to Learn on Their Own
# Machines that Think for Themselves - Yaser S. Abu
2015年5月15日 星期五
兩篇 Raspberry Pi 實作論文
今天在聯合大學網站上找到這篇樹莓派實作論文 :
# 遠端農場環境監控
此文利用樹莓派板子透過 GPIO 來讀取農場的溫濕度, 操控 webcam, 以及透過繼電器控制水閥與燈光. 軟體部分採用 Node.js 與 Express.IO 來建構後端平台與資料庫, 透過 Linux 本身的 cron job 定時更新環境資料.
上期商周封面文章探討全球瘋農業, 其中談到物聯網在未來幾年將會在農業應用上發展得最快. 這篇論文正好呼應了這個展望. 現在國外許多農夫已經開始運用 IT 與 IOT 技術在農場經營了, 若結合太陽能供電與行動上網, 農場遠距營運管理將會越來越紅火.
第二篇是南台科大的這篇 :
# 以 Raspberry Pi 為基礎之遠距無線監控
此文所實作之監控車, 好比是個活動的監視器, 透過家中的 WIFI 信號進行操控, 使其成為一個行動保全. 若能像掃地機器人那樣在弱電源時自動回座充電就更完美了.
# 遠端農場環境監控
此文利用樹莓派板子透過 GPIO 來讀取農場的溫濕度, 操控 webcam, 以及透過繼電器控制水閥與燈光. 軟體部分採用 Node.js 與 Express.IO 來建構後端平台與資料庫, 透過 Linux 本身的 cron job 定時更新環境資料.
上期商周封面文章探討全球瘋農業, 其中談到物聯網在未來幾年將會在農業應用上發展得最快. 這篇論文正好呼應了這個展望. 現在國外許多農夫已經開始運用 IT 與 IOT 技術在農場經營了, 若結合太陽能供電與行動上網, 農場遠距營運管理將會越來越紅火.
第二篇是南台科大的這篇 :
# 以 Raspberry Pi 為基礎之遠距無線監控
此文所實作之監控車, 好比是個活動的監視器, 透過家中的 WIFI 信號進行操控, 使其成為一個行動保全. 若能像掃地機器人那樣在弱電源時自動回座充電就更完美了.
小森食光
上周六吃午飯的時候, 我在公視看到這部電影的預告片, 描述橋本愛飾演的主角市子, 在結束一段戀情後, 從都市回到東北的老家小森, 過著自給自足的農耕生活, 依循以前對母親的記憶, 調理出各種好吃的料理.
種植, 採集, 料理, 就是本片的主軸, 自食其力的田園生活, 對都市長大的人而言, 可能會覺得很寂寞與無聊, 對我來說是熟悉不過了, 但不是我親力親為, 而是多年以來看著母親自己養雞養鴨與種菜, 吃的食物大都是自己田裡生產的作物. 如今, 我也開始了假日親手耕種的生活, 雖然還只是一小步而已.
看到片中橋本愛吃番茄的神情, 讓我覺得, 食物真正的味道不需要言語來形容, 只要用舌頭深度去品味. 據說她在片中做了 20 道料理, 光是預告片中的冰鎮番茄就讓我學到一招了.
真迫不及待想要去看. 但高雄到底要何時才會上映呢?
# 綠野,時光,與生活的真味——專訪橋本愛《小森食光》
# 療癒系電影 「小森食光」用手造暖感填補虛空心靈
# Youtube : 小森食光
# 小森食光1(電影《小森食光》原著作品)
種植, 採集, 料理, 就是本片的主軸, 自食其力的田園生活, 對都市長大的人而言, 可能會覺得很寂寞與無聊, 對我來說是熟悉不過了, 但不是我親力親為, 而是多年以來看著母親自己養雞養鴨與種菜, 吃的食物大都是自己田裡生產的作物. 如今, 我也開始了假日親手耕種的生活, 雖然還只是一小步而已.
看到片中橋本愛吃番茄的神情, 讓我覺得, 食物真正的味道不需要言語來形容, 只要用舌頭深度去品味. 據說她在片中做了 20 道料理, 光是預告片中的冰鎮番茄就讓我學到一招了.
真迫不及待想要去看. 但高雄到底要何時才會上映呢?
# 綠野,時光,與生活的真味——專訪橋本愛《小森食光》
# 療癒系電影 「小森食光」用手造暖感填補虛空心靈
# Youtube : 小森食光
# 小森食光1(電影《小森食光》原著作品)
關於 MySQL 的限制
今天為了確認 MySQL 對資料表名稱的限制, 整理了網路上查到的資料如下 :
資料庫與資料表名稱的限制 :
另外, 最多可建多少個 MySQL 資料庫, 以及一個資料庫最多可建幾個資料表呢? 根據 "Limits on Number of Databases and Tables" 這篇說明, MySQL 基本上對此並無限制, 但可能會受到作業系統的檔案系統限制; 而儲存引擎 Innodb 則允許最多 400 萬個資料表.
"MySQL has no limit on the number of databases. The underlying file system may have a limit on the number of directories.
MySQL has no limit on the number of tables. The underlying file system may have a limit on the number of files that represent tables. Individual storage engines may impose engine-specific constraints. InnoDB permits up to 4 billion tables."
某些免費主機會限制能建立的資料表數目, 超過就會被停權. 而 Appfog 的 MySQL 限制如下 :
# https://support.appfog.com/hc/en-us/articles/202315676-MySQL
參考 :
# MySQL 教材:建立/描述/刪除表格
# mysql一個資料庫最可以幾個表
# Limits on Number of Databases and Tables
# MySQL 超新手入門(9)表格與索引 (讚)
意外找到張益裕的部落格, 十多年前開始學 Java 時, 買過他所翻譯的書, 非常厚, 可說是我走向軟體之路的啟蒙書.
# Python Tutorial 第一堂(1)揭開序幕
資料庫與資料表名稱的限制 :
- 只使用英數字與底線之組合 (小於 64 字元), 且不可用數字開頭
- 有分大小寫
- 只使用英數字與底線之組合 (小於 64 字元), 且不可用數字開頭
- 不分大小寫, 故 USER 與 user 是同一欄位
另外, 最多可建多少個 MySQL 資料庫, 以及一個資料庫最多可建幾個資料表呢? 根據 "Limits on Number of Databases and Tables" 這篇說明, MySQL 基本上對此並無限制, 但可能會受到作業系統的檔案系統限制; 而儲存引擎 Innodb 則允許最多 400 萬個資料表.
"MySQL has no limit on the number of databases. The underlying file system may have a limit on the number of directories.
MySQL has no limit on the number of tables. The underlying file system may have a limit on the number of files that represent tables. Individual storage engines may impose engine-specific constraints. InnoDB permits up to 4 billion tables."
某些免費主機會限制能建立的資料表數目, 超過就會被停權. 而 Appfog 的 MySQL 限制如下 :
# https://support.appfog.com/hc/en-us/articles/202315676-MySQL
參考 :
# MySQL 教材:建立/描述/刪除表格
# mysql一個資料庫最可以幾個表
# Limits on Number of Databases and Tables
# MySQL 超新手入門(9)表格與索引 (讚)
意外找到張益裕的部落格, 十多年前開始學 Java 時, 買過他所翻譯的書, 非常厚, 可說是我走向軟體之路的啟蒙書.
# Python Tutorial 第一堂(1)揭開序幕
訂閱:
文章
(
Atom
)















