2008年8月31日 星期日

jQuery 相關教學連結

不需安裝 PDF 檢視軟體,線上觀看 PDF 檔

PDFMENOT 提供了線上觀看 PDF 的服務。可讓使用者經過 URL 或是上傳的方式直接線上觀看 PDF 內容。

除此之外,PDFMENOT 還提供了 FF 的擴充套件以及 Blogger 的 script 等工具。詳情參考這裡

在 ASP.NET 中遇到 Access is denied 錯誤

在舊版的 IIS 中加入「ASP.NET Machine Account」和「Internet 的 Guest 帳戶」即可解決這個問題。

在新版的 IIS 6.0 中,則必須加入 NETWORK SERVICE 方能解決這個問題:

C# 的 Regex.Replace

在 Perl 中正規表示法的取代,可以簡單的利用 $1、$2 等方式來輕鬆指代記憶的群組;比如:

$text="Hypermethylation of E-cadherin is an independent predictor of improved survival in head and neck squamous cell carcinoma. Shematic illustration of E-cadherin in adherens junction. E-cadherin homodimer on the cytoplasmic membranes of adjacent cells is shown. Moreover, overexpression of E-cadherin, which was found underexpressed in MTX-resistant cells, also sensitized the cells toward the chemotherapeutic agent";
$text=~s/([^>])(\bE-cadherin\b)([^<])/$1$2<\/span>$3/g;
print $text;

# 輸出:
Hypermethylation of E-cadherin is an independent predictor of improved survival in head and neck squamous cell carcinoma. Shematic illustration of E-cadherin in adherens junction. E-cadherin homodimer on the cytoplasmic membranes of adjacent cells is shown. Moreover, overexpression of E-cadherin, which was found underexpressed in MTX-resistant cells, also sensitized the cells toward the chemotherapeutic agent

在 C# 中,也可以辦到:

2008年8月30日 星期六

Windows 快速鍵

F3

在 Windows 系統裡,按下 F3 就可以呼叫出「搜尋」功能,可以輸入關鍵字後搜尋電腦裡的檔案。在 IE 瀏覽器裡,按下 F3 則可以切換到自訂的搜尋引擎網站,不需要再輸入搜尋引擎的網址或點選我的最愛。

Word 便條紙功能 Ctrl+Alt鍵+M

想要在某段文字加上 note,只要 Ctrl+Alt+M,便能呼叫「註解功能」。

「Win+F」搜尋檔案

找檔案時只要「Win+F」再輸入檔名,縮短搜尋時間。

「Win+L」立即登出電腦

暫離座位時,按「Win+L」登出系統畫面,防止竄改文件。

Word 中快速改變字母大小寫,Shift+F3
只要將想要改變的字選取起來,按下 Shift+F3 就可以讓小寫變大寫、大寫變小寫。

C# static constructor

在 Java 的類別宣告裡,可以使用 static 區塊來宣告靜態初始化的變數:
class Demo{
    private static int i;
    private static String s;
    static{
        i=24;
        s="abc"
    }
}
在 C# 則可以利用 static constructor 達到同樣的效果:
class Demo{
    private static int i;
    private static String s;
    static Demo(){
        i=24;
        s="abc"
    }
}

2008年8月28日 星期四

中華電信推出「行動導遊 Lite」基地台定位服務

中華電信新推出的「行動導遊 Lite」服務將個人導航加值服務擴大至一般手機上,就算使用的手機沒有 GPS,也能透過基地台定位而使用這項服務。

這個服務的概念,我最早是在 Common Craft 裡看到;介紹 Google Map 的新服務:

跟中華電信的另一個利用 GPS 服務的「行動導遊」僅支援特定 AGPS 手機的加值服務相比(利用手機基地台輔助衛星定位,讓不論在室內或戶外的使用者均能快速定位並搜尋附近的生活資訊),該服務讓低階手機用戶也能使用。

與行動導遊最大不同之處,在於 Lite 透過基地台以 Cell ID 方式定位所在地,即使手機沒有 GPS 定位功能,也能定位搜尋附近影院、加油站、百貨公司與餐廳等生活資訊,甚至提供路徑規劃。不過因為所有資訊包括圖資系統均仰賴行動網路傳輸,因此較適合以 3G 手機使用。

目前只要月付 50 元,就可以無限使用這項加值服務。不過我上去晃了一下,發現不支援我的手機(囧)...原來我的手機比一般低階手機更低階...

2008年8月27日 星期三

AJAX 圖示產生器

如何做好一個合格的下屬

好文共享;其實看完還頗有感觸,好幾點都可以找到認識的人去做對應... 一個好的下屬應該具備哪些方面的特性:
  1. 自己崗位職責上的工作,必須要自己來完成,不要什麼事情都去麻煩上司出面,要明白公司設定我們這個崗位的目的就是要完成工作的。
  2. 不要裝「酷」,在任何時候,面對任何問題的時候都說沒有問題,而在實際工作當中老是就有問題。不懂並不是缺點,用心學習,態度端正才是領導的最愛!
  3. 要充分瞭解自己的領導,不要忽略領導的感受,在開展工作的時候,要多想想領導想要的結果及欣賞的做事方法。
  4. 不要把領導當傻瓜。做事腳踏實地,不要表面一套背裡一套;不要油頭滑面,要知道在我們的背後有無數的眼睛。
  5. 不要吝嗇把功勞推給領導,記住,要想讓自己獲得成功,就必須懂得如何要讓別人先成功。我們的所有成績都應該歸功於領導的正確指導。
  6. 不要老是犯同樣的錯誤或不該犯的錯誤,人無完人,只要是人都有可能會出錯,但是要學會總結,同樣的問題絕對不能重犯,不該出現的問題絕對不能出現。
  7. 要勇於承擔責任,但問題發生時,其實損失最大是公司,不可能是個人,最為一個下屬,要勇敢的面對問題,不要推卸責任,領導是最討厭那些整天推卸責任的下屬。
  8. 要善於幫助領導承擔責任,但問題發生時,不僅僅是下屬的單方面問題,領導就應該付領導責任!面對這個時候,做為一個聰明的下屬,就要學會如何合理的代領導 承擔責任。但是絕對不是要下屬盲目的去承擔,要看是發生了什麼問題,不痛不癢的或者是無關決定工作前程的可以承擔,如果是發生了重大問題時,就不適合了, 作為下屬最好只付自己那些責任就可以了,不能冒然出頭!
  9. 工作時候要仔細謹慎,不要放棄任何一個環節,不要以為事情太小,就可以不抓。但是更要注意衡量利弊,千萬不要抓了芝麻丟了西瓜。
  10. 做事情時,不要老是討價還價,要知道任何一個人都是討厭老是討價還價的人。
  11. 面對額外的工作任務時,要端正態度,適當考慮,服從第一,拒絕時需要十足的理由,千萬別找借口。
  12. 有事情可以商討解決,千萬不要越過自己的上級,去反映事情,做為管理者要時刻明白,越級上報現象的弊端或容易引發的事情。
  13. 不要老是提問題,公司用我們是讓我們來解決問題的,不是來提問題的,一般問題的發現是普遍的,而解決問題的是很少的。作為一個合格的下屬,應該懂得反映問題的方法:提問題時,一定要有自己的見解和解決方案,拿出來一同讓領導考慮。千萬不要老是給領導製造麻煩。
  14. 作為一個合格的下屬,一定要注意自己的言行舉止,一般的領導都比較注重這個方面,任何一個領導不可能喜歡那些吹牛皮的人,也不可能喜歡背後議論他人是非的人,更不可能喜歡作風不良,衛生不講究的下屬。
  15. 和領導一起時,一定要注意保持距離,不要太近乎,否則會讓領導產生反感,或者會產生那種認為你拍馬屁的想法。和領導在一起時,也要注意千萬在面對大眾時,不要去搶領導的風頭,自己要做好一個跟班。
  16. 當領導遇到難題時,在自己能力範圍之內的,不管是不是自己的工作,都應該主動的,而且默默無聞的幫助領導度過難關。
  17. 作為一個下屬,要帶好自己的團隊,要作到自己的團隊與別人比較起來佔有絕對的優勢。在面對工作時,要作到讓領導,省心,放心,開心!
  18. 作為一個合格的下屬,在面對自己的工作崗位,一定要有創新的理念或事物,保持工作原狀,絕對不是公司招我們的目的,在工作上一定要有不斷的突破,一定要做的比前人好,比別人好,才可能證明自己的價值。
  19. 作為一個合格的下屬,應該擁有穩定的心態,不要做暴風雨類的人物,也不要什麼問題與不滿都強壓心頭,要時刻調整自己的心態,沒有過不去的坎,沒有辦不好的事情!
  20. 作為一個管理者,也必須要有著自己的性格,如果都和別人一樣,那在這個世界也不需要有我們的存在。做事情在不能夠違反原則的情況下,要保持著自己良好的個性。

2008年8月26日 星期二

db4o 簡介與初探

db4o object database 引擎主要由一單獨的 DLL 組成。目前版本支援了 Microsoft .NET. framework 1.0/1.1 以及 2.0。

一般 .NET framework 的 DLL 檔位於安裝目錄內的 bin/net/ 目錄底下;.NET Compact Framework 則位於 bin/compact/ 下(我使用的 6.4 版本檔名為 Db4objects.Db4o.dll)。在開發時,必須將這個 DLL 加入到參考中。

Db4objects.Db4o namespace

包含了大部分開發所需要用到的功能。其中最重要的兩個類別是 Db4objects.Db4o.Db4oFactory 和 Db4objects.Db4o.IObjectContainer。

  • Db4oFactory:提供的靜態方法讓我們可以開啟資料庫檔案、啟動伺服器或是連線到既存的伺服器。另外,它也允許我們再開啟資料庫前先設定好 db4o 的環境變數。
  • IObjectContainer:則是我們最常會使用到,也是最重要的資料庫程式介面。它代表的就是我們的 db4o 資料庫。
    • IObjectContainer 可能是處於單一使用者模式的某個資料庫,或是一個連線到某個 db4o 伺服器的客戶端連線。
    • 每一個 IObjectContainer 都擁有一個 transaction。每個執行的動作都是處於 transaction 狀態;當我們開啟一個 IObjectContainer,我們就處於一個 transaction 之中;當我們下達 Commit() 或是 Rollback(),將會馬上切換到另一個 transaction。
    • 只要我們有在操作 IObjectContainers,它將會持續保持開啟連接的狀態。當我們關閉一個 IObjectContainer,所有存在記憶體中的資料庫參考將會被丟棄。

第一個 db4o 程式

我們首先常是如何儲存、擷取、更新和刪除某個只包含 primitive 以及字串成員的類別 。

public class Sentence
{
 private string rawText;

 /// raw 參數代表原本的文字內容
 /// section 參數則為該文字所屬的 section
 public Sentence(string raw, string section)
 {
     rawText = raw;
     this.section = section;
 }
 public string RawText
 {
     get { return rawText; }
     set { rawText = value; length=value.Length}
 }
 private int length;
 public int Length
 {
     get { return length; }
     set { length = value; }
 }

 private string html;
 public string HTML
 {
     get { return html; }
     set { html = value; }
 }
 private string section;
 public string Section
 {
     get { return section; }
     set { section = value; }
 }
}

開啟資料庫

要存取一個 db4o database 資料檔或是建立一個新的資料庫,我們只要呼叫 Db4oFactory.OpenFile(),並提供我們想要存取的資料庫檔案路徑當作參數及可。該方法會回傳一個 IObjectContainer 實例。

如前述,IObjectContainer 代表的就是一個資料庫,並且扮演了我們跟 db4o 將的主要溝通橋梁。藉由呼叫 Close() 方法,將關閉該 IObjectContainer 資料庫檔,並且是放所有參考到的資訊。

// accessDb4o
IObjectContainer db = Db4oFactory.OpenFile(dbfilename);
try
{
// do something with db4o
}
finally
{
  db.Close();
}

儲存物件

要儲存某個物件,我們只要對我們的資料庫呼叫 Set() 方法,並且存給它某個物件當作參數及可!

// store First Sentence object
Sentence s = new Sentence("Pain management: evaluating the effectiveness of an educational programme for surgical nursing staff.", "Title");
db.Set(s);
Console.WriteLine("Stored {0}", s);

取回物件

db4o 提供三種不同的 query 系統:

  • Query by Example (QBE)
  • Native Queries (NQ)
  • SODA Query API (SODA)
這裡我們先嘗試利用 QBE。而 NQ 則是 db4o 主要的 query 介面,文件也建議開發者使用該介面為主。

當使用 QBE 時,我們會提供 db4o 一個原型物件(prototypical object)作為我們想要取得的物件的一個範例,並呼叫 Get() 方法。db4o 將會依據傳給 Get() 方法的物件的內容,從資料庫內取得包含跟我們提供的物件一樣資料值欄位的所有物件(非預設值;一般物件的預設值為 null,int 為 0),並以 ObjectSet 實例回傳(代表所有符合的物件)。

下面我們示範如何從資料庫中取得所有的 Sentence 實例。方法很簡單,我們只要提供一個空的 Sentence 原型即可(所有的資料欄位值都為預設值):

Sentence sents = new Sentence(null, null);
ObjectSet result = db.Get(sents);
ListResult(result);

// ...略

public static void ListResult(IObjectSet result)
{
    Console.WriteLine(result.Size());
    while (result.HasNext())
    {
        Console.WriteLine(result.Next());
    }
}

db4o 另外提供了一個簡便的方法讓我們可以取得某類別的所有實例:

ObjectSet result = db.Get(typeof(Sentence));
ListResult(result);
對於泛型物件,可以利用 query() 方法取得:
IList <Sentence> sents = db.query<Sentence>(typeof(Sentence));

下面示範如何依據 section 來查詢:

Sentence sent = new Sentence(null, "BACKGROUND");
ObjectSet result = db.Get(sent);
ListResult(sent);

更新物件

更新物件跟儲存物件的動作很類似;我們也是呼叫同樣的 Set() 方法:

ObjectSet result = db.Get(new Sentence(null, "TITLE"));
Sentence found = (Sentence)result.Next();
found.Section="BACKGROUND";
db.Set(found);
Console.WriteLine("Modified section for" + found);

注意很重要的一點是我們第一個步驟是先去 query 物件。假若,當我們呼叫 Set() 方法去修改一個未知的(但是實際上我們想要修改的是既存的物件)的物件;也就是說我們沒有先去 queyr 物件,那麼 db4o 將會在資料庫內插入一個新的物件。db4o 並不會自動的把我們產生的物件跟資料庫內的物件進行比對;它假設我們實際上要插入一個剛剛好有同樣值的物件到資料庫內。

刪除物件

在資料庫內的物件可經由 DELETE() 方法加以移除。
IObjectSet result = db.Get(new Sentence("Pain management: evaluating the effectiveness of an educational programme for surgical nursing staff.", null));
Sentence found = (Sentence)result.Next();
db.Delete(found);
Console.WriteLine("Deleted {0}", found);

Object Database 相關連結

依據之前使用 object database 的經驗,查詢速度印象中並不理想,尤其當資料量非常大的時候(不知道是不是錯誤的記憶)。

最近又想要在嘗試一下。下面列出 object database 相關連結:

2008年8月24日 星期日

jQuery 筆記:用 jQuery 快速選取元素

完整的文件可以參考官方網站。以下摘錄重點:

$("div").addClass("special");
$ 記號是 jQuery 的物件(其實是 jQuery 函數的縮寫),使用 $("div") 就是用 jQuery 來選取元素,這個範例可以選取文件內所有的 <div> 元素。後面接著的 .addClass("special") 就是用來做一些事情,這個範例是將先前所選取到的所有元素都加上一個名為 "special" 的 class。也就是透過 $("div").addClass("special") 的語法,可以一次幫文件上有的 <div> 元素都加入 special 的 class。

這和原本使用 JavaScript 來寫程式有很大的差異,原本自己寫可能會需要用到迴圈之類的語法,而 jQuery 的函數大多具有批次處理的功能! $ 記號 $ 是使用 jQuery 過程中最重要的函數,可以用來用來找元素;使用方式只要把參數帶入即可。下面的範例,結果將會和上面的範例一模一樣:

jQuery("div").addClass("special");
如前述,$ 是 jQuery 函數的縮寫。

選取元素

前面的例子使用 $("div") 來選取元素,帶入的參數 div 表示要找的元素,這是 CSS 選擇器(CSS Selector)的語法,如同 CSS 在做排版和外觀所使用的選擇器語法一樣。jQuery 所支援的 CSS Selector 包含了 CSS 1、CSS2 以及仍未正式發佈的 CSS3,透過 plugin 還可支援常用的 XPath 語法。

這是一段原始的 HTML: 以下用一連串的範例,以展示基本的語法與文件中會被選取的元素。

$("#body")
  • 選取到:<div id="body">
  • 解釋:選取 id 為 body 的元素

$("div#body")
  • 選取到:<div id="body">
  • 解釋:選取 id 為 body 的 <div>

$("div.contents p")
  • 選取到:<p>...</p><p>...</p>
  • 解釋:選取 class 為 contents 的 <div> 元素所包住的所有下層的 <p>

$("div > div")
  • 選取到:<div class="contents">
  • 解釋:選取被 <div> 包住的下一層 <div>

$("div:has(div)")
  • 選取到:<div id="body">
  • 解釋:選取至少有包住一個 <div> 的 <div>

2008年8月20日 星期三

Songsterr 吉他 tab 撥放器

吉他通常採用簡譜的方式來紀錄如何彈奏歌曲。但是這種方法對於樂曲節奏的呈現上有先天的不足。

Songsterr 服務藉著在每個簡譜中插入音樂檔,來呈現樂曲原有的旋律、節奏。

2008年8月14日 星期四

咕咕克拉克---線上鬧鐘

需要設定時間提醒你嗎?...Kuku Klok 提供線上鬧鈴的服務。

Windows Vista 更新後,Word 2007 無法開啟

今天中午吃飯前,放著讓 Vista 自動更新,更新完後(應該是有自動重開機),想利用 Word 2007 改 comment,沒想到卻無法使用。症狀是:只要開啟 Word 2007,整個視窗就 hold 住;無回應。

查了一下 Word 2007 解決方案中心在「在 Windows Vista - 架構電腦上安裝自動更新 Word 2007 供您可能會遇到許多問題」一文中找到了解決方案。節錄如下:

徵狀

自動更新在安裝之後,必須重新啟動電腦。不過,如果在重新啟動電腦時,正在執行 Word 2007,則可能會遇到下列問題:

  • 使用 Word 2007 時滑鼠無法運作
  • 無法開啟一份 Word 文件
  • 嘗試啟動或結束 Word 時當機
  • 開啟 [ 開啟 ] 對話方塊時, Word 停止回應
  • 儲存文件時,Word 停止回應
  • 關閉文件時,Word 停止回應

解決方案

利用 regedit,刪除 HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Word\Data 登錄子機碼即可解決!

我是大明星

我是大明星網站提供了將使用者上傳的相片,依據版型輸出成雜誌的服務。

參考下圖為其輸出的範本(恩,相片是誰我也不清楚...:P):

JSMin 瘦身 JavaScript

JSMin 幫忙替 JavaScript 檔案瘦身。

驗證 JavaScript 程式:JSLint

JSLint 提供了線上驗證 JavaScript 語法的服務。

2008年8月13日 星期三

在 blogger 中高亮度顯示程式原始碼

JSPWiki 移轉到 Blogger 以來,最大的困擾除了語法不能像 Wiki 那麼簡潔之外,另一個問題就是程式碼在顯示上不能像 JSPWiki 有一些 plug-in 可使用。

一個方式大概就是利用 Format My Source Code For Blogging 的服務,可以產生格式化的語法。然後貼到 Blogger 上。

但是這種方式其實只是把原始碼稍微排版一下而已(近似於原本 Wiki 的 {{{、}}} 語法)。另一種方式就是利用類似 Hightlight Code Coverter: 將排版後的程式碼轉換成 HTML 輸出 的工具輸出 HTML 後再貼上。

不過這些方式都要繞一大圈才能。這裡介紹一種或許比較好的方式(支援高亮度顯示);利用 syntaxhighlighter

syntaxhighlighter 支援了大部分常見的程式語言,如 C++、Java、C# 等(完整列表見此列表)。

使用方法
  1. 首先到 syntaxhighlighter 下載 StyleHighlighter 原始碼
  2. 將壓縮檔內的 Scripts 和 Styles 目錄解壓到可公開存取的網站目錄內
  3. 修改您的 Blogger 的範本,加入如下程式碼
    <link type="text/css" rel="stylesheet" href="css/SyntaxHighlighter.css"></link>
    <script language="javascript" src="js/shCore.js"></script>
    <script language="javascript" src="js/shBrushCSharp.js"></script>
    <script language="javascript" src="js/shBrushXml.js"></script>
    <script language="javascript">
    window.onload = function(){
    dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf';
    dp.SyntaxHighlighter.HighlightAll('code');
    }
    </script>
  4. 最後在以下列語法修改包含原始碼的 HTML 片段:
    1. 利用 <pre> tag,並設定 name 屬性為 code、class 屬性為對應的程式語言代碼(參考此表
      <pre name="code" class="c-sharp">
      ... some code here ...
      </pre>
    2. 利用 <textarea> tag。
      <textarea name="code" class="c#" cols="60" rows="10">
      ... some code here ...
      </textarea>
      
範例
<html>HTML 測試</html>
collapse
nogutter
注意事項
  • 使用 <pre> 來包含程式碼時,中若是程式碼中有 < 符號,則必須將其置換為 &lt;,否則原始碼可能會被截斷。
  • 在 class="xxx" 中可以利用「:」指定額外的控制參數。詳細控制參數列表參考此表

2008年8月12日 星期二

今晚,英仙座流星雨

英仙座流星雨(每年最先登場的流星雨)將在今晚七時卅分到十時達到極大期,據報導每小時約有一百顆流星畫過天際(四金ㄟ嗎?) 在光害少的地方,只要抬頭就有可能看到流星!

英仙座 in Google Sky

幕末古寫真;走回老式相片

幕末古寫真提供了線上將現代相片轉換成老式相片風格的有趣服務。

參考右圖是旗山製冰廠拍的彩色相片經由轉換後的結果。

2008年8月9日 星期六

北京奧運開幕!

奧運會聖火宣傳片 聖火點燃

鄉民低調碼自動還原

裝了這個到 FF 上,就不用再每次猜測 ptt 上的鄉民們在低調甚麼了 :)

安裝後會在 FF 的搜尋引擎中自動加入[鄉民低調碼自動導向]...接著就是把低調碼貼進去就對了

2008年8月8日 星期五

2008 Best of Open Source Software Awards

InfoWorld 公布了 2008 年的 OSS Awards。下面整理大概會用到的東西:
  • GitVersion control
  • soapUIWeb Services Testing Tools

2008年8月7日 星期四

Mloovi RSS&Blog 翻譯服務

藉由 Mloovi 提供的服務,來訂閱國外網站的 RSS feed,可以直接將其內文翻譯成自訂的語言。

比如下面是 TechCrunch 的繁體中文 feed
http://mloovi.com/r/00885942775b267049eee20daf09d9d0

2008年8月5日 星期二

由 Greasemonkey script 直接產生 Firefox extension

參考這個線上工具。將 script 檔

// ==UserScript==

之後的所有原始碼直接貼上,即可產生 xpi 檔。
注意事項

==UserScript== 區塊中請把空白欄位去除。比如

// @include http://www.example.idv/*
// @exclude
^^^^^^^^^^^^^
 移除此欄

JavaScript 的 Sound API

SoundManager 2 補足了 JavaScript 欠缺的 Sound API。

2008年8月2日 星期六

8/4 Yahoo! 開放 kimo.com 帳號註冊

6 月時,Yahoo! 在全球推出了兩個全新的信箱網域 ymail.com 以及 rocketmail.com(我也去搶了一個帳號 :>)。今年的八月,台灣將成為 Yahoo! 推出第一個在地化域名的地區!Yahoo! 選擇的是先前併購進來的奇摩站帳號 kimo.com。據報導,主要原因是希望提供在地化、使用者較容易記憶聯想的域名。

8/4 記得想要申請自己容易記得的帳號的人,記得要到 Yahoo! 報到。