2008年2月27日 星期三

送Blogger文後相關文章功能

加入書籤: HemiDemi MyShare Baidu Google Bookmarks Yahoo! My Web Del.icio.us Digg technorati furl

原文出處 http://abintech.azhai.org/2007/03/related-post.html

轉貼教學

Blog 文章一多,分類標籤的運用在找尋特定文章時就很重要。當有些讀者從外面的搜尋引擎或 RSS 連進來看 Blog 特定文章的時候,在文章的後面隨機列出一些相關文章的標題,一方面可以讓讀者找到更多對方可能會感興趣的 Post,另一方面也可以吸引讀者多去瀏覽自己其他的文章。Blogger 系統所有的文章都有靜態連結網址,看起來頁面內容並不是「動態」從資料庫抓出來的(除了那些要去即時收集的模組),所以在單篇文章的後面亂數挑出一些相關的文章表列出來,應該也不會太花時間。

原理其實很簡單,透過文章分類標籤的 RSS Feed,找出一些和該篇文章有相同標籤的文章,它們就是「相關文章」,然後亂數挑出幾篇,過濾內容將標題、連結和日期列出就大功告成了。在網路上找到了一些範例,其實不大滿意,因為有個 bug:相關文章應該是排除本文之外有相同分類標籤的文章,偏偏這些範例挑亂數的時候有可能會挑到本文,這樣就會看到相關文章模組內還有本文標題在裡面的奇怪情況(邏輯上是沒錯啦)。所以看到這些範例除了例行性會去修改增加可讀性外,還要自己去解決這個 Bug。這個 Hack 應該是我 Blog 最後一個大規模的修改,之後除了調整 CSS 和外觀外,差不多想弄得功能都弄完了~

老樣子,要修改之前要先備份樣版。首先,塞入以下這段 Javascript (在 </head> 標籤前):

<script type='text/javascript'>
//<![CDATA[
<!-- Script functions for Related Posts: RelatedLabels(), RemoveDuplicatedPosts(), contains(), ShowRelatedPosts()-->
var relatedPostsNum = 0;
var relatedTitles = new Array();
var relatedUrls = new Array();
var relatedDates = new Array();
function RelatedLabels(json) {
for (var i = 0; i < json.feed.entry.length; i++) {
var entry = json.feed.entry[i];
relatedTitles[relatedPostsNum] = entry.title.$t;
relatedDates[relatedPostsNum] = entry.published.$t.substr(0,10);
for (var j = 0; j < entry.link.length; j++) {
if (entry.link[j].rel == 'alternate') {
relatedUrls[relatedPostsNum] = entry.link[j].href;
relatedPostsNum++;
break;
}
}
}
}
function RemoveDuplicatedPosts(PostUrl) {
var tmpUrls = new Array(0);
var tmpTitles = new Array(0);
var tmpDates = new Array(0);
function contains(a, e) {
for(var j = 0; j < a.length; j++)
if (a[j]==e)
return true;
return false;
}
for(var i = 0; i < relatedUrls.length; i++) {
if(!contains(tmpUrls, relatedUrls[i]) && PostUrl != relatedUrls[i]) {
tmpUrls.length += 1;
tmpUrls[tmpUrls.length - 1] = relatedUrls[i];
tmpTitles.length += 1;
tmpTitles[tmpTitles.length - 1] = relatedTitles[i];
tmpDates.length += 1;
tmpDates[tmpDates.length - 1] = relatedDates[i];
}
}
relatedTitles = tmpTitles;
relatedUrls = tmpUrls;
relatedDates = tmpDates;
}
function ShowRelatedPosts(PostUrl) {
RemoveDuplicatedPosts(PostUrl);
var r = Math.floor((relatedTitles.length - 1) * Math.random());
var i = 0;
if (relatedTitles.length > 0) {
document.write('Related Posts: <ul>');
while (i < relatedTitles.length && i < 5) {
document.write('<li><a href="' + relatedUrls[r] + '">' + relatedTitles[r] + '</a> - ' + relatedDates[r] + '</li>');
if (r < relatedTitles.length - 1)
r++;
else
r = 0;
i++;
}
document.write('</ul>');
}
}
//]]>
</script>

獨獲創見的部分就是把該篇本文的 URL 當變數傳入 Javascript Function 裡,在剔除重複文章的時候把自己一併從陣列裡刪掉,這樣就解掉上述的 Bug 啦!此外,程式裡紅字的部分,是用來控制相關文章的數量,我預設用五篇,請依個人需要修改。接下來,就是塞入收集相關文章的 Javascript,找到下面這段在文章內容後面顯示分類標籤的程式:

<b:if cond='data:post.labels'>
<data:postLabelsLabel/>
<b:loop values='data:post.labels' var='label'>
<a expr:href='data:label.url' rel='tag'><data:label.name/></a><b:if cond='data:label.isLast != "true"'>,</b:if>
</b:loop>
</b:if>

在迴圈結束 </b:loop> 前面加入呼叫收集相關文章的code:

<!-- Fixed for Related Posts -->
<b:if cond='data:blog.pageType == "item"'>
<script expr:src='"/feeds/posts/default/-/" + data:label.name + "?alt=json-in-script&amp;callback=RelatedLabels&amp;max-results=10"' type='text/javascript'/>
</b:if>

同樣的,紅色的部分也是用來限制數量,每個標籤抓出最近的幾篇文章來匯總(該數字至少要 >= 上面 Javascript 裡定義顯示的數量。數字加大,可以增加相關文章的亂數樣本,也就是相關文章可以顯示越多舊的相關文章)。抓完文章當然就是找地方顯示囉!只有一個限制:一定放要在文章分類標籤那段的後面(就是一定要呼叫過上面那段,這樣也才會有相關文章可以顯示啊~),所以我就直接放在後面(上面這段 </b:if> 標籤的後面就可以,位置依自己的樣版外觀調整),這部分呼叫顯示相關文章的程式碼如下:

<!-- Fixed for Related Posts -->
<b:if cond='data:blog.pageType == "item"'>
<script type='text/javascript'>
ShowRelatedPosts(&#39;<data:post.url/>&#39;);
</script>
</b:if>

2008年2月26日 星期二

SiteTag:http://sitetag.us/ 標籤雲產生器

加入書籤: HemiDemi MyShare Baidu Google Bookmarks Yahoo! My Web Del.icio.us Digg technorati furl

快速的幫部落格文章自動制定標籤,而且又支援中文關鍵字的定義

要使用SiteTag,首先必須你的部落格可以安裝JavaScript的外掛,然後後續過程就很簡單了。點選網站上方的「註冊」,然後依照說明填入相關資料,最後就會獲得需要安裝到部落格的追蹤程式碼,只要跟其他外掛一樣,將程式碼安裝到你的部落格側邊欄位即可;接著等待一段時間讓SiteTag蒐集足夠的Tag資訊,然後登入SiteTag,在「我的SiteTag」控制台左方,可以選擇「設定Badge」來安裝可以顯示的標籤雲。

Sitetag目前提供了兩種標籤雲,一種是簡單超連結的「文章標籤列表」,它會依據目前文章頁面來顯示相關關鍵字;另一種是有外框的「標籤雲名片」,它會顯示整個網站熱門的關鍵字;只要點選「立刻使用」就可以獲得外掛程式碼,將其安裝到部落格中即可,SiteTag的標籤雲讓訪客可以透過標籤雲來查找具有相關性的其他文章

關於「SiteTag」的網站步驟介紹,請觀賞異塵行者的文章「SiteTag 幫部落格文章自動定標籤」,那的解釋說明十分詳盡!

SiteTag官方網站

2008年2月22日 星期五

加密Gmail,讓你收發信件更安全

加入書籤: HemiDemi MyShare Baidu Google Bookmarks Yahoo! My Web Del.icio.us Digg technorati furl

在使用公用電腦收取Email時,會不會很擔心資料不夠安全,可能會被駭客或木馬竊取呢?其實Gmail內建了加密功能,只要稍微改一下網址,就可以讓郵件寄送更安全喔!

1.一般我們使用Gmail的時候,只有在登入畫面送出帳號密碼時會將資料加密,在讀取信件時還是沒有加密,所以郵件還是有被竊取的危險。其實,我們只要在登入時將網址由「 http://www.gmail.com 」改為「https://www.gmail.com」,就是在http後面加一個「s」,就可以啟動加密功能喔!


2.在載入郵件時,會出現是否要顯示非安全性項目的對話盒,這時候要按下〔否〕,才能將所有資訊加密喔!


3.開啟加密功能後,在IE右下方狀態列就會出現鎖頭圖示(一般只有在登入時出現),這時候收發信就更安全囉!


4.如果你已經登入Gmail網頁信箱,不用急著登出喔,只要在網址列中改為「https://www.gmail.com」,就會馬上切換成加密版的Gmail(不必重新登入),讓讀寫信全程都有SSL加密保護。注意喔,此時IE狀態列原本出現鎖頭的地方點兩下,也會跳出憑証視窗,表示真的有加密。

2008年2月20日 星期三

資料,需要正規化?

加入書籤: HemiDemi MyShare Baidu Google Bookmarks Yahoo! My Web Del.icio.us Digg technorati furl

正規化的主要工作,就是要調整事實描述方式,將每個表單簡化到只描述一種事實,好讓資料井井有條得存放在電腦中,避免資料重複浪費儲存。

正規化(Normalization)是關聯式資料庫在設計資料表時,用來消除資料儲存異常的處理方法。由於現實生活中,一張表單記錄的資料有很多,正規化的主要工作,就是要調整事實描述方式,將每個表單簡化到只描述一種事實,好讓資料井井有條得存放在電腦中,避免資料重複浪費儲存,並消除資料之間矛盾的情況,使資料庫運作起來更有效率,維護上也更容易。
對關聯式資料表來說,表單就是描述一個實體的資料,像員工這個實體會有員工姓名、員工職稱等資料,而正規化的過程,就是把一個實體的描述資料,透過一定的流程,將每張表單內容簡化,做到只單純描述一種事實為止。
正規化的過程,會調整資料表的組成結構,減少資料發生異常的機會,這些過程通常會逐步分為多個步驟,包含:第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、BC正規化(Boyce-Codd Normal From,BCNF);除了上述這四種,還有第四正規化(4NF)、第五正規化(5NF)、DK正規化(Domain/key Normal Form)以及第六正規化(6NF),而每一次的正規化,都能減少一些造成資料異常的原因。一般的資料庫大多經過前四道手續,就可以完成正規化,而後四者則是用來處理特殊情況的表單,例如4NF及5NF,主要功能。是要消除多值相依(Multi-Value Dependency)的情況,例如一個產品有許多不同型號當作主鍵,但這些主鍵其實都是代表同一物件等問題。
將表單逐步正規化時要注意,每次表單正規化的結果,都必須滿足前一個正規化的條件。因此,除了第一正規化之外,當我們調整資料表架構之後,都要檢查產生出來的新結果,是不是滿足之前的正規化條件,如果沒有,那就要回到前一個步驟,重新檢查,然後再調整表單架構,直到滿足所有正規化條件為止。
我們可以參考圖例內的範例資料表,這是一家水果店的訂單表,以及正規化完成後的資料表,接著我們來參考這個表單試做前三種正規化,看看每次要做哪些事。

水果訂單正規化前後差異

將正規化前的水果訂單與完成後的表單相比,最明顯的地方,就是1張水果訂單變成3張表,包含水果訂單、貨品資料、客戶資料,且每個欄位也只有一筆資料,表單變這麼多張,乍看之下有些複雜,其實就如同之前說的,其實是將表單拆成很多張,並讓每張表單記載的資料更單純,像客戶清單,僅有辨識用的客戶編號,以及記錄客戶名稱等兩個欄位。

完成正規化之後,欄位總和變多了,而且貨品編號及客戶編號等欄位還重複,怎麼會說節省資料空間呢?在正規化前,每當陳先生下單時,就會使用2個欄位儲存客戶資料(客戶編號+客戶名稱);若是經過正規化,水果訂單內只會存放客戶編號,而省下1個欄位,當訂單日益增加時,就能省下越多的空間。

第一正規化確定主鍵
1NF的工作主要有三,首先要確認資料表中的主鍵。主鍵是辨識每筆資料的關鍵欄位,它可以由資料表現有的欄位中,挑選一組符合主鍵規則的當作主鍵,也能替表單增加一組專為識別用的欄位當主鍵。主鍵並不侷限只能有單一欄位,也能由多個欄位共同構成。
第二步驟,就是讓單一欄位內只能有一筆資料。所以我們將這些超過的資料改列一筆新資料,讓每個欄位都只儲存一筆資料,而其他的空白欄位,則需要填入符合該筆訂單的原始資料。
第三步,要確認表單內所有的欄位,都要與主鍵有關係,這點稱為相依性。完成之後,就變成經過1NF的水果訂單。
第二正規化消除重複欄位
接著,我們要開始執行2NF。在這個階段,除了要符合1NF之外,還要消除部分相依(Partial Dependency),以減少資料重複和不一致性。部分相依,所指的是,在多重主鍵的情況下,有些資料只跟部分主鍵有直接關係,而不是跟每個主鍵都有關聯。基本上,經過1NF且主鍵僅有單一欄位的資料表,就能符合2NF的規範。
從完成1NF的水果訂單上,貨品名稱及單價這兩欄位,只跟貨品編號有相依性,而不是跟整個主鍵有關聯,這樣就會有部分相依的問題,所以我們需要執行2NF來解決。
第三正規化將非主鍵決定的欄位獨立成新表單
接著要開始3NF,這個步驟除了要滿足前面兩個正規化,還要消除資料表中的遞移相依(Transitive Dependency)。
遞移相依的意思,是說資料表單中,有些欄位資料內容,在一張表單裡面,可以由某一個「不是主鍵」的欄位決定,像我們在完成2NF的表單中,客戶名稱這個欄位,其實是由客戶編號決定的,而不是訂單編號,因此需要執行第三正規化。
完成上述步驟後,水果訂單就能符合3NF的規範,而經過這些處理後,該表單也就完成了資料表的正規化。

原作者:林郁翔

EasyReadMore