聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

一月 22, 2013
» PHP: Commands out of sync; you can't run this command now

近日凍仁使用 PROCEDURE 及動態 LIMIT 改寫某 PHP 網站的列出最後 10 筆資料功能,套上新程式碼後,再持續送出 query 就會跳「 Commands out of sync; you can't run this command now」的錯誤訊息,其 MySQL 文件的解釋如下:

18.2.8 Commands out of sync in client 錯誤

如果你在你的客戶代碼中得到 Commands out of sync; You can't run this command now,你正在以錯誤的次序調用客戶函數!

這可能發生,例如,如果你正在使用 mysql_use_result() 並且在你已經調用了 mysql_free_result() 之前試圖執行新查詢。如果你在 mysql_use_result()或mysql_store_result() 之間試圖執行返回數據的 2 個查詢,它也可能發生。

最後試出來的解法是補個手動關閉連線的函式 mysql_close() 即可解決。
 1 <?php
2
3 # = 連結資料庫 =
4 $dbhost = "localhost"; #資料庫網址或IP
5 $dbusername = "db_user"; #資料庫帳號
6 $dbuserpassword = "db_pwd"; #資料庫密碼
7 $default_dbname = "db_name"; #資料庫名稱
8 $connection = mysql_connect($dbhost, $dbusername, $dbuserpassword) or die("無法連結資料庫!");
9 $db = mysql_select_db($default_dbname, $connection) or die("無法選擇資料庫");
10
11 mysql_query("SET NAMES 'UTF8'");
12 mysql_query("SET CHARACTER SET UTF8");
13 mysql_query("SET CHARACTER_SET_RESULTS=UTF8'");
14
15 # = Lab. =
16 $sql_last_10_sort="
17 DROP PROCEDURE IF EXISTS last_10_sort;
18
19 DELIMITER //
20
21 CREATE PROCEDURE last_10_sort()
22 BEGIN
23 DECLARE record_total, record_from int default 0;
24 SET @record_total = (select count(time) from tableA);
25 SET @record_from = (@record_total - 10);
26
27 if @record_total < 10 then
28 select
29 time,
30 round(((`rowsA` + `rowsB`) / (select `rowsC` from tableB where bid = '1') * 100), 2) as 'lab'
31 from tableA order by time limit 10;
32 else
33 prepare stmt_last_10_sort from
34 " . "select `time`, round(((`rowsA` + `rowsB`) / (select rowsC from tableB where bid = '1') * 100), 2) as 'lab' from tableA order by time limit ?, ?" . ";
35 EXECUTE stmt_last_10_sort USING @record_from, @record_total;
36 DEALLOCATE PREPARE stmt_last_10_sort;
37 end if;
38 END //
39 DELIMITER ;";
40 mysql_query($sql_last_10_sort);
41
42 $sql_last_10_sort_value="call last_10_sort();";
43 $result_last_10_sort_value = mysql_query($sql_last_10_sort_value) or die(mysql_error());
44
45 ......
46
47 mysql_close($connection);
48
49 ?>

[SQL on the Pastebin.com]


2013-01-22


補上使用 Sub-Query 的改寫的版本,做同樣的事情,但只需短短的六行即可,這樣似乎也比較省資源
 1 /*
2 * 1. select last 10 record and sort.
3 * 2. calc (`rowsA` + `rowsB`) / `rowsC`.
4 * 3. use Sub-Query.
5 */
6
7 SELECT `record_time`, `tmp` FROM (
8
9 SELECT
10 `record_time`,
11 round(((`rowsA` + `rowsB`) / (SELECT rowsC FROM tableB WHERE bid = '1') * 100), 2) AS 'tmp'
12 FROM tableA ORDER BY `record_time` DESC LIMIT 10
13
14 ) AS `lab_last_10_sort` ORDER BY `record_time` ASC;

[SQL on the Pastebin.com]


資料來源:
18.2.8 Commands out of sync in client錯誤 | MySQL 中文參考手冊
Commands out of sync; you can't run this command now - What's X- 點部落
php - Commands out of sync; you can't run this command now - Stack Overflow
PHP: mysqli::query - Manual

四月 27, 2012
» Failed test 'use DBD::mysql;'

凍仁在幫 Perl 安裝 DBD 模組時,得到了錯誤訊息:

t/00base ......NOK 2# Failed test 'use DBD::mysql;'

請教 星空夜雨 後才知道這是因為 DBD 模組與 MySQL 有相依性,若沒依照 Distribution 預設的方式安裝,得手動補上參數才會過,而以下條件大概都會碰到:

  • MySQL Server 為自行編譯。
  • 本機無安裝 MySQL Server。
  • 未於 MySQL Server 建立指定的測試帳號及密碼。

1. 安裝 DBI 模組。
root@CentOS:~$ perl -MCPAN -e 'install DBI' [Enter]

2. 手動切換至編譯環境底下。
root@CentOS:~$ cd ~/.cpan/build/DBD-mysql-4.020/ [Enter]

3. 手動設定 DBD 參數。
root@CentOS:~$ perl Makefile.PL --testuser='test' --testpassword='password' --testhost="192.168.oo.xx" [Enter]

4. DBD 參數請參考 Makefile.pl 內文 (可略過)。
root@CentOS:~$ vi Makefile.PL [Enter]
......
32 Getopt::Long::GetOptions(
33 $opt,
34 "help",
35 "testdb=s",
36 "testhost=s",
37 "testport=s",
38 "testuser=s",
39 "testpassword=s",
40 "testsocket=s",
41 "cflags=s",
42 "libs=s",
43 "verbose",
44 "ps-protocol",
45 "bind-type-guessing",
46 "nocatchstderr",
47 "ssl!",
48 "nofoundrows!",
49 "embedded=s",
50 "mysql_config=s",
51 "force-embedded",
52 "with-mysql=s"
53 ) || die Usage();
......

5. 編譯及安裝。
root@CentOS:~$ make && make install [Enter]

6. 完成!

資料來源:
Install MySQL and DBD::MySQL on Mac OS X - Building Bioinformatics Solutions

十二月 20, 2011
» 【Scripts】CapsLock Notification on Debian

自從得知 ThinkPad T410 的大寫鍵 Caps Lock 狀態燈離開螢幕下方的 LED 面板的以後,凍仁就一直很依賴右下角的通知(Notification),不是說新的設計不好,但用久了就會發現它早就被左手的小拇指遮住,哪還看得到什麼 LED ..!? 雖說官方早已幫 Windows 寫好 On-screen display(OSD),而 Mac OSX 上也有 CapSee,至於 Linux 上凍仁有找到 lock-keys-applet,但還是不像官方的直覺。


安裝 notification 相關套件

凍仁是透過 notification-daemon 發送訊息來辨別當前的狀態,在開始之前得先安裝發送自訂訊息的套件。
jonny@squeeze:~$ sudo aptitude install libnotify-bin [Enter]

程式主體

Google 半天才找到可以透過 xset 來查詢 LED 狀態。
jonny@squeeze:~$ xset -q [Enter]
Keyboard Control:
auto repeat: on key click percent: 0 LED mask: 00000002
XKB indicators:
00: Caps Lock: off 01: Num Lock: on 02: Scroll Lock: off
03: Compose: off 04: Kana: off 05: Sleep: off
06: Suspend: off 07: Mute: off 08: Misc: off
09: Mail: off 10: Charging: off 11: Shift Lock: off

來加工一下唄!
jonny@squeeze:src$ vi capslock_notification.sh [Enter]
 1 #!/bin/bash
 2 # 用 notify-send 送出訊息時,在不加入單引號以及雙引號的情況下,空格會被當作換行處理 。
 3 # Icon 路徑請自行更改。

 4 
 5 if [ $( xset q | grep Caps | awk '{ print $4 }' ) = off ]; then
 6  STATUS="'Lock keys' 'Caps-Lock has been disabled'";
 7  echo "notify-send -t '2000' -i $HOME/.icons/lock-keys/capslock_off.png $STATUS" | bash
 8 else
 9  STATUS="'Lock keys' 'Caps-Lock has been enabled'";
10  echo "notify-send -t '2000' -i $HOME/.icons/lock-keys/capslock_on.png $STATUS" | bash
11 fi

設定 CapsLock 傾聽

方法一:Compiz

Command Line:
1. 開啟 CompizConfig Settings Manager
jonny@squeeze:~$ ccsm & [Enter]

2. 新增傾聽 Caps Lock 事件。
jonny@squeeze:~$ vi $HOME/.config/compiz/compizconfig/Default.ini [Enter]
......
[commands]
......
as_command1 = /usr/local/bin/capslock.sh
as_run_command1_key = Caps_Lock

圖形化設定:
1. 開啟 應用程式選單 → 系統 → 偏好設定 → CompizConfig Settings Manager

2. 點選自訂指令

3. 輸入程式路徑

4. 自訂啟動熱鍵

5. 設定啟動鍵

方法二:gnome-keybinding-properties

基於不是每台 Debian 都會裝 Compiz,補上 Gnome 內建的鍵盤捷徑鍵(Keyboard Shortcuts)手動編輯設定檔方法,GUI 無法直接抓取 Caps Lock 事件。

1. 開啟 應用程式選單 → 系統 → 偏好設定 → 鍵盤捷徑鍵(Keyboard Shortcuts)
2. 新增 Caps Lock 熱鍵

3. 命名並指定路徑

4. 隨便自訂事件,事後再修改
# 註:事件觸發後才會產生新設定檔!

5. 編輯設定檔
jonny@squeeze:~$ vi $home/.gconf/desktop/gnome/keybindings/custom5/%gconf.xml [Enter]
 1 <?xml version="1.0"?>
2 <gconf>
3 <entry name="action" mtime="1299259480" type="string">
4 <stringvalue>/home/jonny/bin/capslock-notify</stringvalue>
5 </entry>
6 <entry name="name" mtime="1299259480" type="string">
7 <stringvalue>CapsLock</stringvalue>
8 </entry>
9 <entry name="binding" mtime="1299235446" type="string">
10 <stringvalue><Alt>grave</stringvalue>
10 <stringvalue>Caps_Lock</stringvalue>
11 </entry>
12 </gconf>

6. 修改完會發現 Shortcuts 被 Disabled

7. 重新啟動 X Windows
jonny@squeeze:~$ sudo /etc/init.d/gdm3 restart [Enter]

8. 完成

成果展示

Caps-Lock ON

Caps-Lock OFF

註:上圖中的通知圖示皆從 Windows 上的 OSD 擷取,應該不可散佈

資料來源:
hardy.dropblog › Trying to detect the state of the caps-lock key in X
用Nofity OSD通知指令工作執行結束 « WMの物語
I am LAZY bones ? : xchat的提醒方式蛮丰富的

三月 15, 2011
» 【Scripts】input GPG key for Debian-base

凍仁每次安裝 Debian-base Linux 時,都得手動自行匯入 GPG key,雖然指令多打幾次就熟了,還是寫個 scripts 省事些。

jonny@lucid:~$ vi gpg-input.sh
#!/bin/bash
for KEY in $@;
do
  ## get key
  echo "gpg --keyserver keyring.debian.org --recv-keys $KEY" | bash

  ## input key
  echo "gpg --export --armor $KEY | sudo apt-key add -" | bash

  ## 若已裝 apt-key 只需一行指令。
  # apt-key adv --recv-keys --keyserver keyring.debian.org $KEY
done


增加執行權限
jonny@lucid:~$ chmod a+x gpg-input.sh

匯入 GPG key
jonny@lucid:~$ ./gpg-input.sh 5044912E \ 0C5A2783 0624A220 98AB5139
# 最多可一次匯入 9 組,感謝 Solomon 分享,現在可無限輸入參數 :P

十月 29, 2010
» 更改 GVim 預設字型及配色

近來凍仁都用 Firefox + Vimperator + GVim 來撰寫 Blog,但也出現了一個小小的困擾,GVim 預設字體過小,設定也與 Vim 不太同,每次手動改完也無法儲存。

當然凍仁也嘗試改過 vimrc 設定檔,但就是沒想到早就有個 gvimrc 在那等著凍仁編。

深灰色配色 + 14pt + LiHei + Monaco = 凍仁的 Gvim

複製 gvimrc 設定檔至家目錄。
jonny@lucid:~$ cp /etc/vim/gvimrc $HOME/.gvimrc

自訂 Gvim 字型與配色設定。
jonny@lucid:~$ vi $HOME/.gvimrc
set guifont=monospace\ 14 # 設定字體樣式及大小
color slate # 更改預設配色為 slate

# 繼續著被 Firefox + Vimperator + vim 制約之路的凍仁。

資料來源:
Willie's Blog: 設定 GVim 預設字型以及預設佈景

六月 11, 2010
» Netbeans 啟動自動補齊(Auto Padded)

近來一直聽到社群上的伙伴在寫 Python, C .. 的時候都用 vim 的文字補齊寫 code 寫的很開心,可問題是已經用 Netbeans 開發三個多月的凍仁是不可能說換就換。

拜了一下 Google 得知在工具(T) → 選項 → Editor 內可以手動開啟自動補齊的功能,預設不開啟也是蠻合理的,Netbeans 跑不快,畢竟是在 Java 上跑 Java,更何況這樣會多增加了傾聽 key world 的事件,也就是說資源會多一吃

Auto Popup on Typing Any Java Identifier Part 打勾即啟用。

資料來源:
hoamon | NetBeans 用了快一年,才想到「自動補齊」是種選項

三月 11, 2010
» Manual PPPoE on Debian

最近凍仁在 Debian 5.0.3 上發生了件 PPPoE run 完 gnome 的 nm-editor 才跑的情形,既然人家兜好的不好用,那就自己寫 code 唄。

安裝 pppoeconf (已安裝請略過)

jonny@debian:~$ sudo apt-get install ppp pppoeconf ppp-pam ppp-udeb


設定 ADSL 帳號及密碼 (請參考 PPPoE 撥接上網(ADSL) )
jonny@debian:~$ sudo pppoeconf


將區網設為 dhcp 並註解 pppoe 的 code
jonny@debian:~$ sudo vi /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp


# dns-* options are implemented by the resolvconf package, if installed

# PPPoE
# auto dsl-provider
# iface dsl-provider inet ppp
# pre-up /sbin/ifconfig eth0 up # line maintained by pppoeconf
# provider dsl-provider


撰寫 bash script
jonny@debian:~$ vi dsl-up
#! /bin/bash

#Stop all of PPPoE commect.
poff -a

#Start PPPoE.
cd /etc/ppp/peers
pon dsl-provider

#for exit the sudo.
exit


以下請參考 Firestarter 開機甭輸入密碼again 一文設定。

join sudo ./dsl-up to Sessions

由於已固定使用 PPPoE ,可毋需再跑 GUI 的網路管理,Disenable the Network Manager

這樣 Debian 就會自動撥接 ADSL 啦,還請各位指教囉:P

» Install JDK 6 Update 18 @Debian lenny

近來凍仁開始在 openSUSE 11.1 底下使用 Netbeans 6.8 為公司寫收費系統,可在升級完 11.2 後爛掉了,MrMoneyC 說動到 dup 會炸掉,先跑 Debian 5.0 (lenny) - stable 然後改回 suse themes 就好,這邊是重新安裝 jdk 的筆記。

至 Oracle (Sun) 下載 JDK6

解開 JDK 包,並同意授權書。

jonny@debian:~$ sudo ./jdk-6u18-linux-i586.bin


將 JDK 目錄移至 /opt 底下。
jonny@debian:~$ sudo mv jdk1.6.0_18 /opt/


新增 Java環境變數
jonny@debian:~$ sudo vi etc/profile
...


# Java Environment
export JAVA_HOME=/opt/jdk1.6.0_18
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar


測試環境變數
jonny@debian:~$ echo $JAVA_HOME
/opt/jdk1.6.0_18

jonny@debian:~$ echo $CLASSPATH
.:/opt/jdk1.6.0_18/lib/dt.jar:/opt/jdk1.6.0_18/lib/tools.jar

jonny@debian:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games:/opt/jdk1.6.0_18/bin


連結 java執行檔至 /usr/local/bin,也就是讓 bash 認得 jdk 的執行檔。
jonny@debian:~$ cd /usr/local/bin

jonny@debian:/usr/local/bin$ ln -s /opt/jdk1.6.0_18/bin/* .


測試 java@bash
jonny@debian:~$ java
Usage: java [-options] class [args...]
   (to execute a class)
 or java [-options] -jar jarfile [args...]
   (to execute a jar file)

where options include:
 -d32   use a 32-bit data model if available

 -d64   use a 64-bit data model if available
 -client  to select the "client" VM
 -server  to select the "server" VM
...


相關連結:
LINUX Java 環境及 Tomcat 安裝 by 洋蔥爸的工作雜記
設定Linux中 的 Java 支援 by PHP5網管實驗室

三月 7, 2010
» 縮短 Netbeans 編譯時間

近來凍仁都在使用從恩師手中借來的 IBM Thinkpad A31 開發公司的系統,由於小弟學藝不精的緣故得透過 Netbeans IDE 寫 Java Swing,話說這台 Notebook 是 91 年度的機種,跑 Windows 會想睡覺的那種,目前的作業系統為 Debian 5 Lenny。

在專案(Projects) 上點選右鍵 → 內容(Properties)。


取消 製作文件右方的 編譯後建置 JAR

也不知道為什麼預設會把建置JAR的選項打開,凍仁就這樣每次建置 JAR 過了兩個月有了,時間就這麼浪費掉了。

相關連結:
Netbeans 官方網站

九月 12, 2009
» KaLUG 五月份:Python 於 Embedded linux 上的應用

過了兩個月,終於可以抽空參加 kalug 聚會了,這次的主講者 Tim 帶來了他們公司新研發的產品,有點像傳說中的黑盒子,雖然他是白的:D 它是個 DV Camera(攝影機) Player、DVD-RW(燒錄機)及DVD-Player(播放機),還支援 HDMI 輸出,直接與電視連線即可欣賞,省了一道轉檔的手續... (相信玩過轉檔的人都知道,cpu 不夠力可是要等上半天的)。其中的 TUI(Tim`s GUI) 就是 Python 寫的,Tim 還把 Python 壓縮,好讓它輕量化。(Python 凍仁還沒玩到.. 跳過跳過XD)

還談到出貨時,廠商會做軟體測試(聽說用 Python 寫,之後要寫測試軟體很方便@@")以及壓力測試,好讓市面上流通的商品為良品。說到這邊凍仁就會想起粘老師之前也有聊到他以前大學做專題也是這樣,沒有 Moniter(顯示器) 可以看錯誤訊息,只得靠 cpu 的叫聲這些的反應來 debug,同時還得在各種不同的壓力下測試。甚至還有因為開機速度過快、晶片沒焊好.. 等等的問題造成各種bug。這可是商科出身的凍仁可是完全沒摸到的地方..

這次參加者有 黃大哥、小詳、Tim、qerter、goodfifagun、老是穿著Debian衣服的教師.. (小弟不才只知道這些人名,loss 的通知一下),難得 yurenyu 這次沒到害的黃大哥怪想念的.. Orz

說真的,自修 Ubuntu 四個月的凍仁這次能參加聚會真的覺得很開心,感覺自己找到知音.. 能跟小詳學長(雖然他不喜歡我叫他學長,可凍仁還是覺得要阿翔叫小翔挺怪的 :D)還有老闆之外的人討論 open source。感覺自己在童軍之外找到了另一片天,套一句高中行義時常講的話:童軍是最快樂的傻瓜,而現在這些人也與自己一樣求新求變,每天都努力學習而不畫地自限,感覺自己的已冷卻的熱忱又再次被 open source 給點燃..

最後的最後要補充的是...
下次車別停博愛路上,不然又要被拍照 + 接紅單了 ... :P

資料來源:
Tim:Applying Python on embedded Linux 簡報

» 【NetBeans】刪除 Events Code

Netbeans 是套不錯用的 Java IDE,更棒的是可以直接拖曳 Button, Label .. 等等的 Opject(物件)。或許就因包太多東西,使用上也不是那麼的得心應手.. (以下 Design 模式簡稱 [Design];Source 模式簡稱 [Source]。

NetBeans - Design 模式

新增 Events


在 [Design] 中的 Opject 上點滑鼠右鍵EventsType。接下來在 [Source] 會新增類似以下的 code
1. private void searchMenuItemActionPerformed (java.awt.event.ActionEvent evt) {
2.     //TODO add your handling code here:
3. }

然而會發現 1, 3 行無法在 [Source] 底下編輯 Orz

刪除 Events code


1. 切回 [Design] 在 Opject 上點左鍵 → Properties(屬性) → Events

2. 刪除 searchMenuItemMouseClicked 請點右邊的 ...

3. 從 Handlers 裡 Remove 掉即可。

相關連結:
(Ubuntu+Netbeans 6) Java GUI視窗化程式開發的小Bug by 大智若魚

support:

biggo.com.tw

A Django site.