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)

檔案連結