2007-12-19

Eclipse 快捷鍵

ctrl + shift + L 顯示按鍵輔助

alt + ↑ 上移
alt + ↓ 下移
-- 可以快速的移動一行或一個段落

alt + → 縮排
alt + ← 凸排

ctrl + / 單行註解
ctrl + D 單行刪除
shift + ctrl + F 文件格式化
-- 可以快速的整個文件縮排(phpEclipse)

ctrl + L 移至指定行

ctrl + shift + enter 在現行上加一行
shift + enter 在現行下加一行

ctrl + shift + X 換成大寫
ctrl + shift + Y 換成小寫

ctrl + shift + S 全部儲存

ctrl + alt + ↑ 向上複製選取行
ctrl + alt + ↓ 向下複製選取行
-- 可以快速的複製一行或一個段落

alt + / 內容輔助
ctrl + alt + / 單字完成
-- 與『內容輔助』一樣是可以補齊單字的功能,不過這些單字必須是已經在文件中出現的才行

ctrl + K 快速搜尋下一個
ctrl + shift + K 快速搜尋上一個

紅色的是我覺得蠻好用的快捷鍵,其他的在喜好設定裡有更多的清單
(喜好設定 → 一般 → 按鍵)
或者是快捷鍵(ctrl + shift + L)

2007-11-26

利用 Trigger 做出 CHECK()

最近才發現 MySQL5 並沒有支援 CHECK 指令,但為了部分欄位的定義域檢查只好使用 Trigger 來代替了,改寫了之前用 CHECK 寫的規則。

CREATE TRIGGER `觸發器名稱` -- 命名原則與資料表一樣
{ BEFORE | AFTER } -- 設置事件發生為前或後
{ INSERT | UPDATE | DELETE } -- 設定觸發的事件
ON `資料表名稱` -- 設定引起觸發的資料表
FOR EACH ROW -- 針對行為觸發單位
{觸發的SQL指令} -- 這裡可以是任何合法的指令與複合句(BEGIN/END)


範例:

DELIMITER $$ -- 變更結束符號為 $$

CREATE TABLE t25(
s1 INT,
s2 CHAR(5),
PRIMARY KEY (s1)
)ENGINE = INNODB $$

CREATE TRIGGER t25_bi BEFORE INSERT ON t25
FOR EACH ROW
IF LEFT(NEW.s2,1)<>'A' THEN
SET NEW.s1=0;
END IF;
$$

CREATE TRIGGER t25_bu BEFORE UPDATE ON t25
FOR EACH ROW
IF LEFT(NEW.s2,1)<>'A' THEN
SET NEW.s1=0;
END IF;
$$

DELIMITER ; -- 將結束符號改回 ;


參考文件:
MySQL 5.0-触发器
MySQL 5.1参考手册 :: 21. 触发程序

2007-11-19

初次使用 mootools.js

最近為了網頁的動態效果,從 prototype.js 改使用 mootools.js 做開發依據,雖然 mootools.js 很好用,也比 prototype.js 更簡化了許多,但也應為更簡化讓我有點不太能上手。

為了避免相容性的問題,使用其中很多的函數作媒介,雖然是個很好用的 Framework ,但效率確不如 prototype.js 快,當然不可能要馬兒跑得快,又要馬兒不吃草,mootools.js 在背後為了處理相容性的問題用掉不少時間,也簡化開發時架構的複雜度。

由於對 mootools.js 還不是熟,可能需要花點時間去瞭解,但還是一句老話:

要知道積木有那些,才能蓋出偉大的城堡

2007-11-16

用 mount 設置虛擬目錄

今天團隊在開發上出現了一個問題,在設計 Smarty 樣版時必須用到 CSS 的載入檔,造成在預覽上有很不方便的問題,為了這個問題必須在 ftp server 與 web server 上都開虛擬目錄,然後在網路上找到一個方便的指令:

mount --bind olddir newdir

olddiv :主要的連結目錄的路徑
newdir :目的地的連結目錄的路徑
這兩個目錄必須事先建立好,建議使用絕對路徑去下這個指令。
EX:mount --bind /home/test /home/test2/test3

利用掛載的方式做出虛擬目錄,就像一個捷徑將兩個目錄連在一起,這是系統上的支援,而且在 ftp server 與 web server 上都能正常操作。

2007-11-09

MySQL UNIQUE KEY 複合鍵

由於網路上說明這個語法的中文文章不多,所以想記錄一下

語法:
UNIQUE KEY `test` (`xref_key`,`xref_dbname`)
UNIQUE KEY `xref_key` (`xref_key`,`xref_dbname`)

這個語法會檢查 xref_key 與 xref_dbname 的組合是否為唯一值,當然不只有是兩個欄位的組合,你也可以設定一或多個欄位,test 是索引表的欄位名稱。

適合用來解決欄位相依時,必須滿足唯一性的處理,在時常新增或刪除的資料表中 AUTO_INCREMENT 的 PRIMARY KEY 會造成大量的斷層,這類容易變動的資料表使用 AUTO_INCREMENT 並不是一個很適合的索引值,所以可以採用 UNIQUE KEY 來處理這樣的問題。

參考文章:藍色小舖-請問關於UNIQUE敘述的疑問

2007-11-07

[PHP] 驗證碼

最近在實做文章回復所需要的功能,這是一個既簡單又好用的認證碼,但是他有個缺點,就是單一用戶同時只能存取一次驗證碼,簡單的說就是一次只能寫一篇回應,當然還是可以用其他方式去加強這個缺點。

<?php
header("Content-type:image/png");
header("Content-Disposition:filename=image_code.png");
//定義 header 的文件格式為 png,第二個定義其實沒什麼用

// 開啟 session
if (!isset($_SESSION)) { session_start(); }

// 設定亂數種子
mt_srand((double)microtime()*1000000);

// 驗證碼變數
$verification__session = '';

// 定義顯示在圖片上的文字,可以再加上大寫字母
$str = 'abcdefghijkmnpqrstuvwxyz1234567890';

$l = strlen($str); //取得字串長度

//隨機取出 6 個字
for($i=0; $i<6; $i++){
$num=rand(0,$l-1);
$verification__session.= $str[$num];
}

// 將驗證碼記錄在 session 中
$_SESSION["verification__session"] = $verification__session;


// 圖片的寬度與高度
$imageWidth = 160; $imageHeight = 50;
// 建立圖片物件
$im = @imagecreatetruecolor($imageWidth, $imageHeight)
or die("無法建立圖片!");


//主要色彩設定
// 圖片底色
$bgColor = imagecolorallocate($im, 255,239,239);
// 文字顏色
$Color = imagecolorallocate($im, 255,0,0);
// 干擾線條顏色
$gray1 = imagecolorallocate($im, 200,200,200);
// 干擾像素顏色
$gray2 = imagecolorallocate($im, 200,200,200);

//設定圖片底色
imagefill($im,0,0,$bgColor);

//底色干擾線條
for($i=0; $i<10; $i++){
imageline($im,rand(0,$imageWidth),rand(0,$imageHeight),
rand($imageHeight,$imageWidth),rand(0,$imageHeight),$gray1);
}

//利用true type字型來產生圖片
imagettftext($im, 20, 0, 25, 35, $Color,
"/var/lib/defoma/fontconfig.d/D/DejaVu-Serif-Bold.ttf",
$verification__session);
/*
imagettftext (int im, int size, int angle,
int x, int y, int col,
string fontfile, string text)
im 圖片物件
size 文字大小
angle 0度將會由左到右讀取文字,而更高的值表示逆時鐘旋轉
x y 文字起始座標
col 顏色物件
fontfile 字形路徑,為主機實體目錄的絕對路徑,
可自行設定想要的字型
text 寫入的文字字串
*/

// 干擾像素
for($i=0;$i<90;$i++){
imagesetpixel($im, rand()%$imageWidth ,
rand()%$imageHeight , $gray2);
}

imagepng($im);
imagedestroy($im);

輸出結果:



參考文章:php確認碼圖片

2007-11-06

MySQL 遠端連線

MySQL 預設是不允許遠端連線的
要在 my.ini 或 my.cnf 中將他開啟
找到下面兩行將他註解掉
當然使用者也必須設定為可以遠端的權限

skip-networking
bind-address=127.0.0.1

2007-11-01

MySQL5 Procedure For PHP5

今天在編寫 MySQL5 的預存程序,稍微研究了一下,功能蠻強大的,可以讓我用來將複雜的查詢指令包裝起來,就像寫函式一樣的好用。

範例:

DELIMITER $$ -- 變更結束符號為 $$

DROP PROCEDURE IF EXISTS `getData` $$ -- 將原本有的程序刪除
-- 建立程序並設定參數屬性
CREATE PROCEDURE `getData`(id INT, uid CHAR(30))
DETERMINISTIC

BEGIN -- 程序內容起始
SELECT A.FriendUser FROM
(SELECT A.fu, A.Pri FROM A WHERE A.myid = id) AS A1
INNER JOIN
(SELECT B.fu, B.Pri FROM B WHERE B.blid = uid) AS B1
ON A1.fu = B1.fu WHERE A1.Pri >= B1.Pri ;
END $$ -- 程序內容結尾

DELIMITER ; -- 將結束符號改回 ;


執行方法 CALL getData(12,'jax');

由於 phpMyAdmin 沒有支援的工具,也不能匯入,所以只好使用指令模式匯入了,將上面的指令寫到 procedure.sql 文件中,就像寫資料庫建立文件是一樣的,再利用下面的方法將建立指令匯入。
mysql -u username -p < procedure.sql
PS:由於用這個方法匯入時,錯誤訊息的行數會以上一個結束符號為起點,所以在檢查時要看仔細一點,建議先確認程序內容是否正確,在建立預存程序。

預存程序參考文章:
樂多日誌
MySQL 5.0 Reference Manual


在 PHP5 中可以用 db_mysqli.dll 這個函示庫來存取 MySQL 預存程序,如果你也是習慣使用 Dreamweaver 來寫網頁的人,只要將所有的 mysql_xxxx() 都換成 mysqli_xxxx() 就可以了,不過還是要注意 MySQL 連線的參數方法。

$link = mysqli_connect(
'localhost', /* The host to connect to */
'root', /* The user to connect as */
'root', /* The password to use */
'db_name' /* The default database to query */
);

mysqli_query($link, "CALL getData(12,'jax')");


PHP5 參考文章:
PHP 調用 MySQL 預存程序(MySql5.0)

2007-10-26

InnoDB 實現了 MySQL 的 Foreign Key

記得 MySQL 預設是不支援 Foreign Key 的功能,但其實 MySQL 中有相關的套件了,只是沒有開啟而已,InnoDB 是 MySQL 上第一個提供外鍵約束的表引擎。

如何啟動:請在 my.ini 中將 skip-innodb 這行用 # 號註解掉。

引用範例:

CREATE TABLE parent(
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE = INNODB;

CREATE TABLE child(
id INT,
parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY(parent_id) REFERENCES parent(id) ON DELETE CASCADE
) ENGINE = INNODB;
-- 參數:
[ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
[ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]


當關聯父資料表的主鍵紀錄行被刪除修改時,InnoDB 對子資料表中紀錄行的處理方式:
CASCADE - 會將有所關聯的紀錄行也會進行刪除或修改。
SET NULL - 會將有所關聯的紀錄行設定成 NULL。
NO ACTION - 有存在的關聯紀錄行時,會禁止父資料表的刪除或修改動作。
RESTRICT - 與 NO ACTION 相同。

詳細的錯誤訊息可以在 MySQL 指令模式下輸入:
SHOW engine innodb status;

由於會列出很多資料,所以要找一下,在訊息中有一组【LATEST FOREIGN KEY ERROR】會有最近錯誤的詳細描述和解决辦法。

phpMyAdmin 中文亂碼問題

因為 phpMyAdmin 就算編碼方式設定在 UTF-8,中文還是會出現亂碼的問題,真是奇怪的現象,上網找了些資料發現只要改個設定就好了,為了怕以後會忘記,在這裡記錄一下。

設定檔:phpMyAdmin\libraries\select_lang.lib.php

/* 找到下面的這個變數 */
$mysql_charset_map = array(
/* UTF-8 */
'utf-8' => 'utf8' 改成 'utf-8' => 'latin1'

/* Big5 */
'big5' => 'big5' 改成 'big5' => 'latin1'

2007-10-25

為了 Web Server 忙一天! [Linux]

今天又是做了很沒有效率的事,因為 Web Server 一直不能正常 Work,花了很多時間在找問題,原本是安裝系統選單中的 LAMP 套件,做了一些設定後,只有 Apache 運作是正常的,PHP 則是找不到相關 Lib,又是上網找了一堆資料,還到處求助同學,就因為效能的考量必須用到 Linux。

想說套裝的 Ubuntu Linux 應該安裝好就能 Work,但卻不是我想的那麼快樂,雖然是有學到東西,但花的時間實在太多了,真想利用自己的時間慢慢做,不過所花的時間是值得的,在效能上的確比 Windows 快,而且所耗費的資源也很低,今天的問題就是預設的程序中少安裝了幾個套件。

sudo apt-get install apache2
sudo apt-get install php5
sudo apt-get install mysql-server
sudo apt-get install php5-mysql
sudo apt-get install libapache2-mod-php5
sudo apt-get install libapache2-mod-auth-mysql
sudo a2enmod php5

藍色的指令是 LAMP 預設安裝的,紅色的指令是我自己後來裝上去的,安裝完後就可以正常 Work,真是給他卡到陰,出現了莫名其妙的怪問題,我還一直以為是我設定錯誤。

相關教學:LAMP伺服器的配置

2007-10-24

初次使用 Ubuntu [Linux]

今天為了將 Server 架起來,花了不少時間,由於以前很少使用 Linux 的作業系統,所以上網找了很多資料來看,為了安裝 FTP Server 找了半天,結果原來光碟裡已經有套裝軟體了,就是這行
sudo apt-get install vsftpd
安裝指令,既簡單又快速,囧!我花了那麼多時間是在幹嘛!!快炸掉了!而且有很多不常用的指令,Ubuntu 預設都沒有裝,反正也不會用到,後來去了 Ubuntu 論壇看到不少有用的資料,看來我有點跟不上時代了,原來已經不用像以前那麼麻煩了,真是方便的說,明天就可以將 Web 的設定完成了,今天進度有點落後!

2007-10-17

三層 INNER JOIN 五層 SELECT

今天工作時在寫 MySQL 的查詢指令,為了算出一個複雜的結果,必須用到四個資料表,三個 INNER JOIN 及五個 SELECT,一共用了四個子查詢,再推關聯性時我已經昏了 @ @,想說用 IN() 去簡化查詢指令,可是會造成 MySQL 整個當掉,結果只好用原本的去做了。

第一次下那麼長的指令,而且第一個子查詢如果沒有將範圍縮小的話,後面所要的計算時間就會需要很久,原本想用預存程序的,但查詢條件卻設在最基本的子查詢裡面,頭很大!目前還找不到更快且簡潔的方法。

2007-10-16

好用的 iGoogle

今天看硬是要學中寫了一篇有關 iGoogle 的介紹,心血來潮也將我的 iGoogle 分類了一下,而且發現到原來之前掛的書籤工具Google Bookmarks蠻人性化的,除了高度不能變長,且最多只顯示四個,也沒有捲軸,真是缺失阿!!

不過呢!在新增和修改的操作上很人性化,還具有分類的功能,你只要貼上網址,他自動會去抓那個網頁的標題,真的很方便的說,不知道以後會不會修得更好,期待一下吧!要是沒有的話,只好自己寫一個。

iGoogle 可以自訂喜歡的樣式,還可以增加頁籤,不用將一推工具都放在一起了,可以看起來更簡潔,Google 有很多服務都很好用,有興趣的人可以多嘗試一些沒用過的服務,或者去看看相關的介紹文章,別錯失了這些好用的工具。

教學連結:硬是要學

UltraEdit-32 關鍵字色彩

為了讓寫 SQL 指令可以更容易,我修改了 UltraEdit-32 中的 WORDFILE.TXT 檔,可是關鍵字實在太多了,所以上網找了一些定義好的來用,但是只有支援小寫,所以只好自己再加上大寫的部分,也順便加了 PHP 及 JavaScript2.0 的色彩樣式。

在新增樣式時要注意樣式編號要改一下,在每個樣式的第一行都有一個 /L? 的編號,而且必須延續上一個編號,用 UltraEdit-32 那麼久,他真的是一個不錯的文字編輯器,可以在很多語言上都用得到,還有非常方便的編碼轉換及許多功能。

官方下載 FTP

資料列表:山区程序员

2007-10-13

Blogger 排版方式


這是 blogger 的排版方式,雖然不是每個樣式都一樣,但主要都會有這些區塊,在這裡可以讓大家有個參考,如果想知道更明確的排版方式可以用 Firefox 的 DOM 觀察器去瞭解詳細的內容。

線性代數 計算機

這是在讀二技時寫的,當初是用 C++ 去寫 RREF(),後來為了能有圖形介面,又用 Java 改寫,並且加了其他的運算進去,學了 JavaScript 之後又將他移到網頁上,基本上是用瀏覽器再做運算,在結構上整個語法並不是很好,當時學藝不精,不過功能上是正常的。

檔案連結

2007-10-11

浮動的需求文件

自從在虎尾上過劉景秋老師的課以後,我就在也沒有寫過完整的需求分析書了,當初沒有好好去學真是個錯誤,後悔也來不及了,由於那麼課並沒有課本,只好從新把上課的投影片那來看吧!

說實在的這次的需求分析書並不是寫得很好,雖然把該定義的需求都寫上了,但整體的架構上並沒有定義的很清楚,連自己看了都有點灰掉。

而且我們的需求目前並沒有定案,在三天的上班日都有去討論需求,並且做一些變動,整個需求都在浮動中,正所謂牽一髮而動全身,所以這樣的計畫也不能進入開發階段,要不然只會做白工,我要效率!快想點有效率的辦法,但當下也只能用正規的方法,讓系統的需求定義能更完整。

因為專案的問題,開始想研究如何用 Ajax 做分散式運算,好讓使用者去分擔屬於自己的運算。

2007-10-10

PHP Smarty 樣版引擎


這是今天下午兩點才買的書,剛剛將這本書前半段語法說明的部分看完了,原來 Smarty 樣版引擎並沒有想像中的困難,而且書中用了一些簡單的範例作說明。

至於使用樣版的好處我就不多做說明了,已經有多位前輩寫過很多了,他也有很多成功的例子背書了。

這真是一本好書,這也已經有很多人說過了,但我想說的是, 感謝 Jace Ju 寫了這本好書。

2007-10-05

最新 JavaScript 完整語法參考辭典


這本書是我最常用到的一本工具書,裡面收錄了常用且共通性高的語法,以簡單的範例教你如何使用這些語法。

目錄的編排很清楚,可以讓你快速且容易找到你想要的函數或功能,而且每個函數或物件都標示針對不同瀏覽器的支援,是一本實用的工具書,而且價格也不貴。

他是翻譯自日本的書籍,有部分較新的函數並沒有收錄進去,你可以查閱他的原始網站。
連結: OpenSpaceJavaScript 例文辭典

相關連結:
博碩文化股份有限公司
博客來書籍館
Findbook

Form 標籤在 IE6 中會有奇怪的段落現象

最近在練習使用 Div 標籤排版,也順便修改自己常用的網頁,那個頁面是以前用表格排版的,隔了很久的時間我已經快看不懂裡面寫什麼了!果然用表格排版是個錯誤,在練習的過程中真的省去許多不必要的大小和標籤,原始碼的可閱讀性也增加了,我也在裡面加上了一些註解,要養成寫註解的良好習慣。

正題:Form 中如果有隱藏欄位時,在 IE6 中總會多出空的一行,使的 Div 超出預設的大小,嘗試了很多方法之後,終於找到一個有效的辦法,就是在 Div 中設定 overflow:hidden; 這個樣式,可能是我對 CSS 還不是很瞭解才會花那麼多時間,但原先的排版在 Firefox 裡卻是和我想像中的設定一樣,不知道是不是 IE6 本身的問題。

2007-10-03

IE7 的 CSS 樣式

為了解決上次的版面問題,終於找到應對的語法了,看來以後查詢時要多試幾個關鍵字,這次很快的就找到相關的文章了。
#wrapper { 
    color : #00ff00; 
} /* Moz */

*+html #wrapper {
    color : #0000ff; 
} /* IE7 */

* html #wrapper {
    color : #ff0000; 
} /* IE6 */

參考文章:Ben's 部落不及格

2007-10-02

可惡的 Microsoft IE

這是之前 Blog 在 IE6 中顯示的樣式狀況,很奇怪的多了一條線,在 HTML 中明明就沒有套用樣式,可是那個 div 卻自己套用了上一個父標籤的樣式。


在 Firefox 中沒有這個問題,能夠正常顯示我所設定的樣式。


為了能讓更多的瀏覽者能夠正確的顯示我的網頁,於是我只好另外設計對應 IE6 的樣式,選擇了替代方案。


可是呢?我找別人幫我測試我的網頁,在 IE7 中一樣出現了之前的問題,為了解決這個問題,在網路上找尋相對應的方法,但在胡思乱想的 Blog 中看到了這段話:

話說回來,IE7 的出現,又給網頁設計師們出了個難題,拋開 IE345,以往僅僅要顧及 IE6 和 Firefox 的差異就夠令人鬱悶的了,這又出現了 IE7。一直呼喊著標準啊標準啊,強悍的微軟告訴我們,他們家的 IE 就是標準,什麼 W3C,滾一邊去。


這讓我失去了為 IE7 修改錯誤的動力,就暫時先考量 IE6 和 Firefox 這兩大族群,對於其他不遵守標準的 IE 就暫時不理他吧!

2007-10-01

設定 Blogger 在 IE 的 CSS

由於我另一個 Blog 在 IE 中有了奇怪顯示錯誤,為了達到親和力信念,我無法忽視這討厭的錯誤。

原本是用 !important 的方法去做,但發現完全沒有用,真奇怪到底是那裡不行,原來 blogger 有自己的設定方式。

只要在給 IE 樣式名稱前加上 _ 就可以了,但如果也有給 Firefox 系列用的樣式,必須將Firefox 的樣式放在 IE 樣式的前面。

.sidebar .widget {
border : 1px dotted #FFFFFF ; /*這是給 Firefox 的樣式*/
_border : 2px dotted #999999 ; /*這是給 IE 的樣式*/
}

2007-09-30

預設 AdSense for Search 的查詢條件

在看過 AdSense 的條規後,Google 並沒有看到有限制不可以預設查詢條件,我用亂數的方式去隨機顯示自訂的查詢條件,只要將下面的程式碼貼在 AdSense for Search 的程式碼後面就可以了,不過我只有處理一個查詢欄位,如果有兩個以上的查詢在同一個頁面下,我可不保證程式碼沒有問題。

<script language="JavaScript" type="text/javascript">
<!--
var search_random = new Array();

/* 加入預設的查詢條件 */
search_random[search_random.length] = "PHP";
search_random[search_random.length] = "ASP";
search_random[search_random.length] = "MYSQL";
search_random[search_random.length] = "AJAX";
search_random[search_random.length] = "JavaScript";

document.getElementById("sbi").value =
search_random[Math.floor(Math.random()*search_random.length)];
//-->
</script>

令人又愛又恨的『 推薦2.0 』

在 AdSense 中的推薦功能有一個討厭的問題,就是顯示的廣告時常會消失,在網路上看了許多文章後,還是沒有具體的解決方法,除了用舊版本的廣告程式碼沒有其他的辦法了,我加了四個推薦連結,只有一個偶爾會顯示,我也嘗試過其他語言的廣告,但是一樣沒有任何廣告顯示。

而且也沒有替代的廣告或圖片可以用,就整個空在那,使整個版面看起來怪怪的,在 Firefox 上到還好,只是少了個圖片而已,背景上並沒有什麼變化,但在 IE 上卻出顯了一個白底的方匡,整個版面的感覺就差很多。

但是 AdSense 的『推薦2.0』給瀏覽者的親和力很高,而且廣告的圖片給人有專業的感覺,蠻適合拿來裝飾 Blog,可是這個裝飾品常常會消失,這真是一件麻煩的事。

2007-09-29

重新啟動 Linux

今天把塵封已久的 Linux 系統啟動了,這台機器是使用 Intel Pentium 200MHz 的 CPU,主機板是 ASUS 的,這是我表哥給我的,不灌圖形介面的話其實他跑得還蠻順的,之前有灌過圖形介面,我光是開啟視窗就等很久,整台電腦只有慢而已。

他已經有一年半沒開機了,剛開機時一切正常所有的服務都很 OK,這真是令我驚訝的事,原本對他已經沒什麼好期望的,看來早期 ASUS 的電腦還蠻耐用的,然後重新設定防火牆,由於第一次沒做好重開時設定就跑掉了,這次又再找更多的資料來看,所以防火牆的部分也 OK 了。

開始上載之前寫的網頁,發生了 MySQL 無發連接的問題,在主機上連結沒什麼問題,SQL 指令也都正常,就是網頁連結無法執行,不知道是不是版本的問題,而且 PHP 載入的模組卻只有一個,之前在 Windows 也發生過版本的問題,那時候 Dreamweaver 8 就有顯示錯誤,但這次顯示正常連線,可是就是沒辦法連線,phpmyadmin 也無法正常連線,可以讀取資料庫的內容,但是其他的設定指令都不能運作,上網找了些方法都試過了,但還是不行,正在考慮要不要重灌。

2007-09-27

Google 廣告

這幾天在給 Blog 加上一些廣告,原本是使用 blogger 中的 AdSense 網頁元素工具去建立廣告,但每次在修改 HTML 模版後,AdSense 的設定總會跑掉,真是屢試不爽。

後來我就換成 HTML/JavaScript 網頁元素工具來建立廣告,雖然沒有圖形介面可以用,但是可以修改的空間變的比較大,在排版上的修改也比較容一些,不像之前都要去修改 HTML 模版中的樣式。

目前 Google 的廣告元素共有三種,每一種都蠻特別的,而且感覺 Google 的廣告計畫實驗性意義很重,就像在測試網路上的廣告市場,而且你稍微留意一下你所瀏覽的網頁,其實有很多都有刊登 Google 的廣告,甚至有些廣告你根本不覺得他是廣告,因為廣告的內容會與你的網站相互應,這也是他特別的地方。

2007-09-23

利用 ASP 對 Access 資料庫重組

由於 Access 資料庫沒有支援的 SQL 指令可做重組 而且在做刪除資料時,還是不會將空間釋放出來 這種狀況只能從 Server 上做重組釋放的動作 但不是每個人都可以進入 Server 上做這個動作 所以另外的辦法就是從 ASP 網頁上執行
<%
'CompactDB 成功將回傳 true,失敗將回傳 false
'DBUrl 以主目錄開始的資料庫相對位址字串
'passwd 資料庫密碼,如果沒有請輸入空字串
Function CompactDB(DBUrl,passwd)
  Set fso = CreateObject("Scripting.FileSystemObject")
  Dim strDB
  strDB = server.MapPath(DBUrl)
  Dim strNewDB
  strNewDB = server.MapPath(DBUrl & ".tmp")

  Dim login
  If(passwd<>"") Then
    login = ";Jet OLEDB:Database Password=" & passwd & ";"
  Else
    login = ""
  End If

  If fso.FileExists(strDB) Then
      '壓縮資料庫
    Set Engine = CreateObject("JRO.JetEngine")
    strPvd = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    Engine.CompactDatabase strPvd&strDB&login,strPvd&strNewDB&login
    Set Engine = nothing

      '刪除舊的資料庫
    fso.DeleteFile strDB
    fso.MoveFile strNewDB,strDB

      '回傳已成功的訊息
    CompactDB = true
  Else
      '回傳失敗訊息
    CompactDB = false
  End If
  Set fso = nothing
End Function
%>
檔案連結

2007-09-22

PHP 中的 unescape 函式

由於 PHP 中並沒有支援 JavaScript 的 escape() 的反函式
所以除了尋找其他編碼方式,要不然就要自己寫一個解碼函數
但如果可以使用其他方式編碼會是比較好的

在 JavaScript 中還是有針對資料傳送用的編碼函數
例如:
decodeURL(str) 『解碼』
encodeURL(str) 『編碼』
decodeURLComponent(str) 『解碼』
encodeURLComponent(str) 『編碼』
以上的函數會將英文和數字以外的文字轉成 URL 的 16 進位編碼
decodeURL,encodeURL 不會轉換 [ ; / ? : @ & = + $ , ] 這些文字
decodeURLComponent,decodeURLComponent 則會
所以並非一定要用到 unescape 函式才可以處理編碼的問題

注意關於 PHP 中的 unescape 函式程式碼必須用到 iconv 函式庫
請確認 php.ini 中有載入此函式庫
<?php
function unescape($str){
    $str = rawurldecode($str);
    preg_match_all("/%u.{4}|&#x.{4};|&#\d+;|.+/U",$str,$r);
    $ar = $r[0];

    foreach($ar as $k=>$v){
        /* 下面的 UTF-8 可針對你的網頁編碼方式作變更 */
        if(substr($v,0,2)=="%u"){
            $ar[$k]=iconv("UCS-2","UTF-8",pack("H4",substr($v,-4)));}
        elseif(substr($v,0,3)=="&#x"){
            $ar[$k]=iconv("UCS-2","UTF-8",pack("H4",substr($v,3,-1)));}
        elseif(substr($v,0,2)=="&#"){
            $ar[$k]=iconv("UCS-2","UTF-8",pack("n",substr($v,2,-1)));}
    }
    return join("",$ar);
}
?>

參考網頁:
PHP实现Javascript的escape(),unescape()的方法
PHP5網管實驗室

[PHP] 輸出資料至 Excel

經由設定 header 的文件格式達到輸出至 Excel 檔
這個方法我之前有用過,可惜他不支援 UTF-8 的編碼方式
有嘗試過使用 BIG5 的編碼方式,可以正常輸出文字

<?php
/* 設定文件格式 */
header("Content-type:application/vnd.ms-excel");
/* 設定文件名稱 */
header("Content-Disposition:filename=to_excel.xls");

/* 輸出文件內容 */
for($i=1; $i<10; $i++){
/* 每個項目以( \t )分隔 */
echo "number".$i."\t";
echo "name".$i."\t";
echo "date".$i."\t";
echo "text".$i."\t";

/* 每一筆資料以( \n )分隔 */
echo "\n";
}
?>

Ajax 使用 POST 傳送

這篇文章是想要將所學到的 Ajax 做一個簡單的紀錄
這裡再次感謝小正正教室

/* 針對不同瀏覽器的前置處理宣告 */
if (typeof(XMLHttpRequest)=="undefined" && window.ActiveXObject) {
XMLHttpRequest=function(){
var arrSignatures = [
"MSXML2.XMLHTTP.5.0",
"MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP"];
for (var i = 0; i < arrSignatures.length; i++) {
try{
var oRequest = new ActiveXObject(arrSignatures[i]);
return oRequest;
}catch(oError){/*ignore*/}
}
throw new Error("MSXML is not installed on your system.");
};
}

/* 傳送連接 */
function convectionLink(){
/*建立傳送的資料 */
var postData = 'user=xxxx&pass=xxxx';
/*產生要求資料的 URL 位址*/
var sURL = "check_in.php";
/* 建立 XMLHttpRequest 物件,並且送要求 */
var oRequest = new XMLHttpRequest();
/* 設定(傳送的方式,要求的位址,是否非同步進行) */
oRequest.open("POST", sURL, true);
/* 使用 POST 傳送必須設定 MIME 型態 */
oRequest.setRequestHeader(
'Content-Type',
'application/x-www-form-urlencoded'
);

/* 建立接收資料的函數 */
oRequest.onreadystatechange = function(){
/* readyState 所有可能的傳送狀態值如下:
0 (還沒開始)
1 (讀取中)
2 (已讀取)
3 (資訊交換中)
4 (請求完成) */
if (oRequest.readyState == 4) {
/* (在此處加入開啟已停用選項的設置) */
/* 處理傳回為 200 的 HTTP 狀態碼 */
if (oRequest.status == 200) {
/* 接受資料成功 */
/*可以從responseText或responseXML取得傳回的資料*/
json = oRequest.responseText;

/* 處理其他錯誤 HTTP 狀態碼 */
}else{
/*接收資料失敗,可以從 statusText 取得錯誤狀態資訊*/
alert(oRequest.statusText);
}
}
}

/* (在此處可以加入一些網頁選項停用的設置,以防止重複送出) */

/* 送出 Ajax 要求 */
oRequest.send(postData);
/*以POST傳送時,這裡可以輸入(XML,串流,字串,JSON格式)*/
/*以GET傳送時,這裡只要輸入 null 或是空的 */
}


參考網頁:
小正正教室:Ajax 兩層連動選單

相關連結:
爪哇豆的秘密:AJAX深度歷險1(Getting Started)
Ajax内部交流文档
MoztwWiki:AJAX 上手篇
維基百科:AJAX
語言技術:Ajax Gossip

2007-09-21

HTML 外出單 產生器

這是在軍中寫的一個外出單自動產生器
完全是用 Notepad 來寫的
經過很多次的修改
大部分能找到的錯誤都更改了
也許還會有學弟需要用到
所以在這裡貼出來

檔案連結

Blog 新樣式

最近把 Blog 的樣式換了
之前因為找不到想要的樣式
所以屈就版面比較寬的樣式

這幾天總算有心情好好的去把他完成了
找了一些喜歡的樣式範本來改
其實我也沒改什麼,只是將版面加寬而已
但在底圖的部分花了我不少時間

相簿上傳有些限制讓我困擾很久
曾經想說放在網頁空間裡
但那個空間實在太小了
只有 100MB 而已,不可以隨便浪費
後來發現相簿的限制問題
就是圖片的長寬不能落差太大
可能是相簿的縮圖會出現錯誤
所以修改了一些圖片的維度

最後總算完成我想要的樣式了

為何使用表格排版是不明智的?

之前在小正正教室中發現了這篇文章的連結,雖然這個文章已經很舊了,但我是最近才瞭解的,以前在別人的網頁中就有發現大部分的網頁已經不是表格排版了。

你是不是跟我一樣還在用表格排版呢?那你需要好好的讀這篇簡報,裡面說明了表格排版的缺點,和使用結構性 HTML 排版的優點,現在已經是資訊的時代了,你的網頁是不是也跟上了腳步呢?

參考網頁:為何使用表格排版是不明智的

2007-09-20

更具親和力的網站

這幾天無意間找到了一篇文章,『在 30 天內打造更具親和力的網站』,很好奇的把他看完了,你也很好奇吧!那為什麼網站需要親和力呢??

相信很多人也相同的經驗,就是在瀏覽他人的網頁時,會看不清楚他所寫的文字,或者是排版的順序很糟,根本找不到你想要的資訊,一般正常人都難以瀏覽的網頁,何況是一些具有障礙的人。

有很多人喜歡在網頁的背景上貼圖片,但不是每張圖片都適合當背景,往往這些背景會造成閱讀上的不便,有時候我也會因為這些背景所困擾,常常必須去除網頁中的 CSS,但沒有 CSS 的網頁又很單調,所以在美化網頁時必須考量到閱讀上的問題,是不是會影響文字的顯示或造成網頁的無法瀏覽。

還有一個重要的問題,就是瀏覽器的支援性,很多的網頁可能只針對某一特定的瀏覽器所撰寫的,往往在 IE 中可以正常顯示的網頁,在其他瀏覽器中可能就會完全走樣,每個瀏覽器都有不一樣的問題,但有些問題是比較重要的必須加以處理,才可以讓網頁更受到大家的歡迎。

參考網頁:在 30 天內打造更具親和力的網站

2007-09-19

利用物件的方式設定事件

這是我第一次使用物件的方式設定事件處理,以前都是用 HTML 去處理事件的呼叫,在利用 JavaScript 將表格模擬成按鈕中就是用這種模式去運作的,那麼用物件去設定有什麼好處呢?

第一用這個方法去處理的話,可以減少網頁檔案的大小,也減少 HTML 上的複雜度,讓網頁有更好的結構感,使 HTML 更容易閱讀,且更容易撰寫。

第二對於大量使用相同的事件有更好處理,重複使用性高,將程式碼獨立成個體的文件,只要在適當的位址中載入,就能重複使用相同的程式碼。

第三對於事件的新增及修改有更大的靈活度,不必在新增事件時要去改每個物件的 HTML,可以統一管理相同物件的新增及修改。

所以在大量使用相同程式碼時,這是一個不錯的選擇。
/* 取得所有名稱為 s_but 的物件群組 */
var spanButtons = document.getElementsByName("s_but");

/* 設定群組中每一個物件的事件 */
for (var i = 0; i < spanButtons.length; i++) {
/* 設定當滑鼠按下時的事件函數 */
spanButtons[i].onmousedown = downChange;
/* 設定當滑鼠重疊時的事件函數 */
spanButtons[i].onmouseover = overChange;
/* 設定當滑鼠離開時的事件函數 */
spanButtons[i].onmouseout = outChange;
}

/*Down Change*/
function downChange(){
this.style.borderStyle = "inset";
this.style.backgroundColor = "#EEDDDD";
}

/*Out Change*/
function outChange(){
this.style.borderColor = "";
this.style.borderStyle = "outset";
this.style.backgroundColor = "#FFFFFF";
}

/*Over Change*/
function overChange(){
this.style.borderColor = "#FF0000";
}
檔案連結

2007-09-16

Access 資料庫連結字串

有設定密碼的連結字串
"Driver={Microsoft Access Driver (*.mdb)};DBQ="& Server.MapPath("/test.mdb")& ";User ID=xxxx;Password=xxxx;"

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& Server.MapPath("/test.mdb")& ";Jet OLEDB:Database Password=xxxx;"

沒有設定密碼的連結字串
"Driver={Microsoft Access Driver (*.mdb)};DBQ="& Server.MapPath("/test.mdb")

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& Server.MapPath("/test.mdb")

Server.MapPath 輸入以主目錄為參考的相對路徑,回傳一個網站的絕對路徑
User ID :資料庫使用者帳號
Password :資料庫使用者密碼

Google 的免費空間

今天為了找一個空間來放我寫的網頁,原本想用 Google 文件來放的,但對於 HTML 的格式還是有些限制,所以只好找其他的辦法了,於是我想我們的 Google 大神應該有辦法為我解決這個問題,果然讓我找到了,每個 Google 帳號都擁有 100MB 的免費空間,但目前只有英文版,而且空間並不大,還好我只有放一些純文字文件,所以已經很夠用了。

我找到一個相關的說明網頁
http://fecfec.googlepages.com/gpage.htm

Google 免費空間
Google page Creator

2007-09-07

PHP 專案終止

由於對方的工作調遷
使得這個專案必須終止
因為沒有人要繼續用這個網頁
很可惜的事原本想用這個專案作個學習
前半段的設計部分已經有所學習了
但後面維護及更新的部分就無法進行了
真是可惜啊!!

2007-09-03

利用 Date() 檢查日期格式

這是利用 JavaScript 中現有的函數 Date() 作日期驗證
使用的原理是將輸入值轉成正規的文字字串
再用 Date() 新增一個日期物件
如果是正確日期將會和輸入是一樣的字串
利用這個原理做到日期格式的驗證
/*-- (判斷日期格式是否正確) -------------------------*/
function isDate(year, month, day){
    var dateStr;
    if (!month || !day) {
        if (month == '') {
            dateStr = year + "/1/1"
        }else if (day == '') {
            dateStr = year + '/' + month + '/1';
        }else {
            dateStr = year.replace(/[.-]/g, '/');
        }
    }else {
        dateStr = year + '/' + month + '/' + day;
    }
    dateStr = dateStr.replace(/\/0+/g, '/');

    var accDate = new Date(dateStr);
    var tempDate = accDate.getFullYear() + "/";
    tempDate += (accDate.getMonth() + 1) + "/";
    tempDate += accDate.getDate();

    if (dateStr == tempDate) {
        return true;
    }
    return false;
}

/*檢查格式*/
isDate("2007/2/12")
isDate("2007-2-12")
isDate("2007.2.12")
isDate("2007/02/02")

isDate("2007", "2", "12")
isDate("2007", "2", "")
isDate(2007, 2, 12)

檔案連結

2007-08-27

CSS Diagrams

最近又找到一個有趣的東西
一個用 CSS 畫結構圖的教學
很好奇它事如何做到的吧??
整個繪圖都沒有用到任何圖片
完全是用 HTML 及 CSS 樣式組合出來的

參考網頁 :
CSS Diagrams
53 CSS-Techniques You Couldn’t Live Without

2007-08-26

初次使用 AJAX 技術

在無意間發現了這個技術名詞
於是上網查了一些相關的解說
在 google 的許多服務中都有使用這個技術
AJAX 的功能讓網頁更具有彈性且親切

最近在小正正的 blog 看到他寫的教學文章
他寫的教學讓我對 AJAX 有了初步的了解
AJAX 在使用上並沒有想像中的困難
而且是使用在我熟悉的 JavaScript 語言上
小正正所寫的 JavaScript 語法讓我很驚訝
有些用法是我以前不曾寫過的
他的教學讓我收穫很多
很感謝他寫的這篇文章

不過關於其他細節的設定及參數不是寫的很完整
於是又查到一篇介紹參數及設定的文章
[賴榮樞]的軟體資訊誌裡所寫的 Ajax不只舊調重彈(1)
他對於 AJAX 寫了許多詳細的介紹
在此也感謝他寫的了這麼好的解說

2007-08-17

利用 !important 修正 IE 與 Firefox 的差異

有次在無意間瀏覽他人的CSS檔案時發現沒見過的指令,上網查詢了一些相關資料,發現這令我驚訝的語法。
#pmenu{
    color : red !important; /* Firefox 會採用這一行的樣式 */
    color : blue ;
    /* 由於 IE 看不懂上一行的 !important 指令 */
    /* 所以會採用這一行的樣式 */
}

相關網頁:important终级讲解

2007-08-15

PHP 結案

花的十幾天的時間改寫原來的 ASP 網頁,發現 PHP 的程式碼比較具有彈性且容易撰寫,這次花費的時間沒有上次多,由於版面的架構是沿用寫 ASP 時的設計,這次在版面中做了不少美工上的修飾,應該會讓使用者感覺比較親切一點。

對於 CSS 的應用也比上次熟練,也針對 IE 及 FireFox 的差異作了相對應的修正,雖然在系統測試上還不是做得很完整,而且對方的需求也不是很明確,之後的修改應該還會花不少時間。

2007-07-07

顯示物件的所有屬性

很多時候在寫 JavaScript 時,會因為無法確定變數的狀況,而找不到是那裡出現錯誤,最好的辦法就是顯示變數的所有屬性,以確認目前的狀況。

利用這個函數可以顯示傳入的物件或變數的狀況,會開啟新的頁面顯示所有的資訊。

/*Show Object Element ( 顯示物件的元素 ) */
function SOE(Obj){
var i, outText = "", eName, eValue;

for (i in Obj) {
/* 加入例外處裡 */
try {
/* 設定元素名稱的樣式 */
eName = i.bold().fontcolor('#770077');
/* 設定元素數值的樣式 */
eValue=(Obj[i]+'').replace("function","function".bold());
eValue = eValue.fontcolor('#0000ff');
/* 將資料串接在一起 */
outText += eName + " = " + eValue + "<hr/>";
}catch (e) {
/* 處理例外事件的訊息 */
eName = (e + '').replace(/" /g, '"< br/>');
outText += eName.fontcolor('red') + "<hr/>";
}
}

/* 設定顯示的視窗 */
i=window.open("","","width=450,height=550,"
+"scrollbars=yes,resizable=yes");
/* 將資料加入視窗的文件中,並設定字體定寬及大小 */
i.document.body.innerHTML = outText.fixed().fontsize(2);
/* 設定顯示視窗的標題 */
i.document.title = 'Show Object Element';
/* 讓顯示視窗取得焦點 */
i.focus();
}

2007-07-05

動態新增 select 的選項


Obj.options[number]=new Option(text,value);

Obj:select 的物件
number:選項的編號(第幾個選項),起始值為 0
text:選項所顯示的文字
value:選項的值

EX:
Obj.length=0; /* 先將選項的數目設定為 0 */

/* 再依序增加選項,當然也可以用迴圈處理 */
Obj.options[Obj.length]=new Option("中正區","100");
Obj.options[Obj.length]=new Option("大同區","103");
Obj.options[Obj.length]=new Option("中山區","104");

/* length 會因為選項的增加而改變,所以是一個可以善用的變數 */

利用 JavaScript 將表格模擬成按鈕

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=big5"/>
    <title>利用 JavaScript 將表格模擬成按鈕</title>
    <script language="JavaScript" type="text/javascript">
      <!--
      var mouseOverColor = "#CCEEEE";
      var mouseOutColor = "#FFFFFF";
      var mouseDownColor = "#99CCCC";

      /* 滑鼠游標重疊時的顏色及滑鼠指標 */
      function mOver(Obj){
          Obj.style.backgroundColor = mouseOverColor;
          Obj.style.cursor = "hand";
      }

      /* 滑鼠游標離開時的顏色 */
      function mOut(Obj){
          Obj.style.backgroundColor = mouseOutColor;
      }

      /* 滑鼠游標按下時的顏色 */
      function mDown(Obj){
          Obj.style.backgroundColor = mouseDownColor;
      }

      -->
    </script>
  </head>
  <body>
    <!-- 利用滑鼠事件去製造相對應的功能
    onmousedown 當滑鼠按下時的事件
    onmouseover 當滑鼠指標與物件重疊時的事件
    onmouseout 當滑鼠指標離開物件時的事件
    -->
    <table width="200" border="1">
      <tr>
        <td onmousedown="mDown(this)"
            onmouseover="mOver(this)"
            onmouseout="mOut(this)">
        </td>
      </tr>
    </table>
  </body>
</html>

2007-07-03

ASP網頁設計

由於為了幫朋友寫一個人員管理程式,最近開始重新學習寫ASP了,為什麼要用ASP呢?ASP的系統哪麼不穩,而且又常當機,但是沒辦法的是架設的平台只有ASP而已,連 SQL Server 都沒有,只好透過 ODBC 去處理 Access 資料庫的問題了。

在開始幫朋友撰寫程式之前,我找了一個類似的題目做練習,”無線電修復記錄管理系統”這個系統雖然很小,但對於系統中的細節可是非常注重,而且為了分擔 Server 負擔我用了很多 JavaScript 去運算資料的處理,也再次複習了 JavaScript 的運用。

開發工具是用 Dreamweaver 8 ,這是一個很好用的工具,但就像朋友所說的,這個工具會讓自己感覺像一個不會寫網頁的麻瓜,到現在關於 ASP 的語法和架構我還是不是很了解,這真是糟糕的一件事,也就是說沒有 Dreamweaver 8 我就沒辦法寫ASP了,對於很多其他的功能要自己去寫也不知道該怎麼寫,但為了開發一個簡易的管理程式來說,這已經很夠了。

2007-06-06

數獨(sudoku)程式寫作

這幾天無修室裡有許多人都在解數獨,李昂祐助彥良當然還有我,以前去參加程式競賽時也有數獨的題目,當時沒有寫出來心中有點遺憾,所以又再次的想去寫程式了,也好久沒讓大腦動一動了。

只靠筆記本來撰寫JavaScriptInternet Explorer來除錯,林易泉老師常說,寫程式最好還是用筆記本,不要靠一些輔助工具,但還真是有難度的說,光是除錯就花了不少時間了,還好有做排版要不然根本不知道錯在那裡,排版上也是辛苦的很,tab的寬度又太大,只能一直按空白鍵來做排版了,html 的撰寫也只能靠自己慢慢寫了,要是有撰寫工具該有多好,以前只要專心去想流程就好了,剩下的排版除錯電腦會輔助你完成,現在還要自己去找流程以外的錯誤,Internet Explorer給的錯誤訊息又那麼的不明確,訊息行數常常都落差幾百行,有等於沒有。

最後還是寫出來了,已經可以解出較困難的題目了,運算時間也很快,只是空間的使用還需要修改一下,要將部分的INT變數改為Boolean變數以節省空間和加快邏輯運算,花了快三天的時間才完成撰寫,這比我預計的時間要慢很多,這種運算型的題目頂多花一天就很夠了!看來少了工具真的差很多。

SUDOKU.html 2007.06.03
SUDOKU_2.html 2011.05.23