<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
  <id>http://fannys23.pixnet.net/blog</id>
  <title><![CDATA[Study:: 痞客邦 PIXNET ::]]></title>
  <author>
    <name>fannys23</name>
    <email>fannys23@not-valid.com</email>
  </author>
  <updated>2009-10-07T23:21:37+08:00</updated>
  <published>2009-10-07T23:21:37+08:00</published>
  <link rel="self" href="http://fannys23.pixnet.net/blog" hreflang="zh"/>
  <subtitle><![CDATA[上進上進...就算沒有365.25天都在上進也要上進個25.365天啊...

<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-6815093-1");
pageTracker._trackPageview();
} catch(err) {}</script>]]></subtitle>
  <rights>Copyright 2003-2009 fannys23,Pixnet Digital Media Coporation. All rights reserved.</rights>
  <generator>PIXNET Media Digital Coporation</generator>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/25181959</id>
    <title><![CDATA[[Misc.] 輕巧的 Bug Tracker: roundup]]></title>
    <updated>2009-10-07T23:21:37+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/25181959"/>
    <summary><![CDATA[需要一個 Bug Tracker，身為 Python fan 的同學 Willie 推薦我用 roundup。Willie 先讓我看了 Jserv 的推薦文：《Roundup -- 簡單好用的 Issue Tracker》，文中建議小於 15 人的專案可以用這個來記錄、追蹤 issues。Jserv 的文章裡這句話讓我看完以後馬上找出 roundup 的下載連結──「安裝超級容易，只要有 Python 2.3 以上的環境，跑 "python demo.py" 就會動了。」是有沒有這麼好康的事啊？事實證明我們要相信大師是不會騙人的。安裝步驟真的超簡單。1. 先安裝 Python。我電腦裡本來就有 Python 2.5，如果你還沒安裝，請先到 Python 官網的下載頁面抓適合你的版本下來用。（我在 Windows 上作業，所以我都抓 Python Windows installer&nbsp; 這種版本）2. 下載 roundup。到 roundup 的專案頁面就有原始碼版本可以抓了。（我抓的時候是 1.4.9 版）3. 開始安裝。先解壓縮到你高興的地方，像我是解成 roundup-1.4.9 這個資料夾後整個放在 D:\。然後可以自己在命令提示字元視窗輸入 "python demo.py" 來啟動服務，像我懶得每次都要打，就在桌面做一個批次檔：
d:cd roundup-1.4.9python demo.py
上面這個批次檔我的製作方法是：右鍵&rarr;新增純文字文件&rarr;把上面的文字貼進去，存檔&rarr;把檔名改成 "roundup.bat"。以後每次要用，就點兩下桌面上的 "roundup.bat" 這個檔案，會跳出一個 command 視窗，開始啟動服務。等幾秒以後就會看到畫面上顯示一個網址（類似像 http://localhost:1234/demo/ 這種），告訴你可以去連你的專案頁面，到服務啟動完成，就可以用了。
之前裝 dokuwiki 就覺得還不算太麻煩，不過解壓縮就定位後還要設定一下，自然覺得 roundup 也可能需要做些什麼事。可是只要打開瀏覽器、直接連到剛才 command 視窗上的網址，就可以開始用了耶。也太方便了吧。如果覺得英文很礙眼的話，第一次使用前執行 "python setup.py install" 這個指令，就可以快快樂樂的使用中文版啦。大略看過文件和討論區，它的語系判斷好像是從使用者自身瀏覽器的語系設定來判斷的？Anyway 我執行完這行就有中文版可以用了，也不用在設定檔裡設半天。如果跟我一樣想用 issue tracker 來管理自己亂七八糟、進度不明的 todo list，我想 roundup 應該會是個簡單方便又愉快的選擇。 :)--文章打一打想到，不知道為什麼雖然我裝的是 Python Windows installer，但是我的環境變數裡沒有設定，所以不能直接執行 "python demo.py" 這種指令，要在「我的電腦」右鍵&rarr;內容&rarr;「進階」頁籤&rarr;環境變數(N)&rarr;系統變數的 "Path" 裡加上 python 路徑，以我自己為例就是在該值的最尾巴加上 ";C:\Python25\"。]]></summary>
    <content type="html"><![CDATA[<p>需要一個 Bug Tracker，身為 Python fan 的同學 Willie 推薦我用 <a title="roundup" href="http://pypi.python.org/pypi/roundup" target="_blank">roundup</a>。Willie 先讓我看了 Jserv 的推薦文：<a title="Roundup -- 簡單好用的 Issue Tracker" href="http://blog.linux.org.tw/~jserv/archives/001279.html" target="_blank">《Roundup -- 簡單好用的 Issue Tracker》</a>，文中建議小於 15 人的專案可以用這個來記錄、追蹤 issues。<br /><br />Jserv 的文章裡這句話讓我看完以後馬上找出 roundup 的下載連結──「安裝超級容易，只要有 Python 2.3 以上的環境，跑 "python demo.py" 就會動了。」是有沒有這麼好康的事啊？<br /><br /><br /><br />事實證明我們要相信大師是不會騙人的。安裝步驟真的超簡單。<br /><br /><strong>1. 先安裝 Python。</strong>我電腦裡本來就有 Python 2.5，如果你還沒安裝，請先到 Python 官網的<a title="Download Python" href="http://www.python.org/download/" target="_blank">下載頁面</a>抓適合你的版本下來用。（我在 Windows 上作業，所以我都抓 Python Windows installer&nbsp; 這種版本）<br /><br /><strong>2. 下載 roundup。</strong>到 roundup 的<a title="Download roundup" href="http://pypi.python.org/pypi/roundup" target="_blank">專案頁面</a>就有原始碼版本可以抓了。（我抓的時候是 1.4.9 版）<br /><br /><strong>3. 開始安裝。</strong>先解壓縮到你高興的地方，像我是解成 roundup-1.4.9 這個資料夾後整個放在 D:\。然後可以自己在命令提示字元視窗輸入 "python demo.py" 來啟動服務，像我懶得每次都要打，就在桌面做一個批次檔：</p>
<blockquote>d:<br />cd roundup-1.4.9<br />python demo.py</blockquote>
<p>上面這個批次檔我的製作方法是：右鍵&rarr;新增純文字文件&rarr;把上面的文字貼進去，存檔&rarr;把檔名改成 "roundup.bat"。以後每次要用，就點兩下桌面上的 "roundup.bat" 這個檔案，會跳出一個 command 視窗，開始啟動服務。等幾秒以後就會看到畫面上顯示一個網址（類似像 http://localhost:1234/demo/ 這種），告訴你可以去連你的專案頁面，到服務啟動完成，就可以用了。<br /><br /><br /></p>
<p>之前裝 dokuwiki 就覺得還不算太麻煩，不過解壓縮就定位後還要設定一下，自然覺得 roundup 也可能需要做些什麼事。可是只要打開瀏覽器、直接連到剛才 command 視窗上的網址，就可以開始用了耶。也太方便了吧。<br /><br />如果覺得英文很礙眼的話，第一次使用前執行 "python setup.py install" 這個指令，就可以快快樂樂的使用中文版啦。大略看過文件和討論區，它的語系判斷好像是從使用者自身瀏覽器的語系設定來判斷的？Anyway 我執行完這行就有中文版可以用了，也不用在設定檔裡設半天。<br /><br />如果跟我一樣想用 issue tracker 來管理自己亂七八糟、進度不明的 todo list，我想 roundup 應該會是個簡單方便又愉快的選擇。 :)<br /><br /><br /><br /><br />--<br />文章打一打想到，不知道為什麼雖然我裝的是 Python Windows installer，但是我的環境變數裡沒有設定，所以不能直接執行 "python demo.py" 這種指令，要在「我的電腦」右鍵&rarr;內容&rarr;「進階」頁籤&rarr;環境變數(<span style="text-decoration: underline;">N</span>)&rarr;系統變數的 "Path" 裡加上 python 路徑，以我自己為例就是在該值的最尾巴加上 ";C:\Python25\"。<br /><br /><br /><br /><br /><br /><br /></p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/25181959">(Read More...)</a></div>]]></content>
    <category term="Python"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/25181959#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/24795526</id>
    <title><![CDATA[[Win] IIS 6 無法正確辨識 CSS]]></title>
    <updated>2009-08-04T23:32:19+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/24795526"/>
    <summary><![CDATA[這兩天發生一件怪事，我在開發環境中明明能夠正常運作的頁面，送到 server 上只有 IE 能正常瀏覽、Firefox 下，所連結的外部樣式表完全不見。首先懷疑的就是路徑問題，但若是路徑異常應該 IE 也無法顯示才是。第二個考慮的是編碼，但看起來 *.css 編碼都正常、裡面也沒有不可見的奇怪字元。最後想到的是 MIME 類型。之所以最後一個才懷疑它，是因為我以為 CSS 是一種很尋常的 type，應該預設值裡就有、不須另行設定。在 Google 找了 MIME、CSS、IIS 這幾個關鍵字，很快的查到了 "MozillaCssMimeType"、以及標題就點清問題的 "IIS 6 Does not Know What a CSS File Is (Missing MIME Types)"。因此只要在 IIS 的網站&rarr;「內容」&rarr;「HTTP 標頭」&rarr;「MIME 對應」的「檔案類型」，設定副檔名為 .css、內容類型 (MIME) 為 text/css，就可以解決這個問題了。在 Apache 下遇到這種問題，則是修改 mime.types 檔案，加上「text/css&nbsp;&nbsp;&nbsp; css」，詳情可以參考 "MozillaCssMimeType" 一文。話說在 IIS 5.1 沒遇到這個問題，反而是在 IIS 6 碰上，還是生平頭一遭。以此為記，希望下次再遇到不要慌了手腳。]]></summary>
    <content type="html"><![CDATA[<p>這兩天發生一件怪事，我在開發環境中明明能夠正常運作的頁面，送到 server 上只有 IE 能正常瀏覽、Firefox 下，所連結的外部樣式表完全不見。<br /><br />首先懷疑的就是路徑問題，但若是路徑異常應該 IE 也無法顯示才是。第二個考慮的是編碼，但看起來 *.css 編碼都正常、裡面也沒有不可見的奇怪字元。最後想到的是 MIME 類型。之所以最後一個才懷疑它，是因為我以為 CSS 是一種很尋常的 type，應該預設值裡就有、不須另行設定。<br /><br />在 Google 找了 MIME、CSS、IIS 這幾個關鍵字，很快的查到了 <a href="http://css-discuss.incutio.com/?page=MozillaCssMimeType" target="_blank">"MozillaCssMimeType"</a>、以及標題就點清問題的 <a href="http://hdrlab.org.nz/iis-6-does-not-know-what-a-css-file-is-missing-mime-types/" target="_blank">"IIS 6 Does not Know What a CSS File Is (Missing MIME Types)"</a>。<br /><br />因此只要在 IIS 的網站&rarr;「內容」&rarr;「HTTP 標頭」&rarr;「MIME 對應」的「檔案類型」，設定副檔名為 <span style="color: #0000ff;"><strong>.css</strong></span>、內容類型 (MIME) 為 <span style="color: #0000ff;"><strong>text/css</strong></span>，就可以解決這個問題了。<br /><br />在 Apache 下遇到這種問題，則是修改 mime.types 檔案，加上「text/css&nbsp;&nbsp;&nbsp; css」，詳情可以參考 <a href="http://css-discuss.incutio.com/?page=MozillaCssMimeType" target="_blank">"MozillaCssMimeType"</a> 一文。<br /><br />話說在 IIS 5.1 沒遇到這個問題，反而是在 IIS 6 碰上，還是生平頭一遭。以此為記，希望下次再遇到不要慌了手腳。</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/24795526">(Read More...)</a></div>]]></content>
    <category term="Windows"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/24795526#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/24726196</id>
    <title><![CDATA[[Win] 誤刪「顯示桌面」按鈕的補救方法]]></title>
    <updated>2009-07-26T18:24:06+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/24726196"/>
    <summary><![CDATA[如果不小心刪掉工作列上的「顯示桌面」按鈕，請執行下列兩個步驟。1.「開始」&rarr;「執行」&rarr;輸入「regsvr32 /n /i:u shell32」&rarr;「確定」2.「開始」&rarr;「電腦關機」&rarr;「重新啟動」 打完收工。]]></summary>
    <content type="html"><![CDATA[<p>如果不小心刪掉工作列上的「顯示桌面」按鈕，請執行下列兩個步驟。<br /><br />1.「開始」&rarr;「執行」&rarr;輸入「regsvr32 /n /i:u shell32」&rarr;「確定」<br />2.「開始」&rarr;「電腦關機」&rarr;「重新啟動」 <br /><br />打完收工。</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/24726196">(Read More...)</a></div>]]></content>
    <category term="Windows"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/24726196#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/24579939</id>
    <title><![CDATA[[ASP.NET] Excel 自動轉型造成的錯誤]]></title>
    <updated>2009-07-12T16:48:31+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/24579939"/>
    <summary><![CDATA[今天在從 Excel 抓資料要匯進程式裡時出問題了。某欄數值資料在開頭幾筆剛好都是 1，都可以成功轉入，但遇到大於 1 的值時，DataTable 裡的值卻是 DBNull，取用時要做加總就拋出了 Exception 了。問題發生的原因是，某一欄的資料如果輸入數值 "1"，是可以成功轉型為 double 的，但是輸入大於 1 的數值後，Excel 的儲存格左上角會出現綠色的三角形，提示「此儲存格內的數字其格式為文字或開頭為單引號」，要求使用者更正這種數字。我參考了 "OleDB incorrectly returning DBNull for an Excel Column"，解決這個問題的方法如下：1. 修改 Regedit，把 Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel 的 TypeGuessRows 的值改成 0。（原本是 8，代表抓取前 8 列的值來判斷儲存格內的資料型態；改成 0 則表示搜尋整欄的儲存格來判斷資料型態）2. 在 Connection String 加入 "IMEX=1;"。以我的程式為例，關於 Excel 讀檔的片段寫起來就長成這個樣子：
string strExcelFile = @"C:\Test.xls";string strExcelConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strExcelFile + ";Extended Properties='Excel 8.0;IMEX=1;'";OleDbDataAdapter oleAp = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", strExcelConn);DataSet ds = new DataSet();oleAp.Fill(ds, "ExcelData");
接著就可以取用 ds.Tables["ExcelData"] 這個 DataTable 裡的資料來做處理了，此時會發現原本讀進來會被判斷為 DBNull 的資料也能正常轉換進來。]]></summary>
    <content type="html"><![CDATA[<p>今天在從 Excel 抓資料要匯進程式裡時出問題了。某欄數值資料在開頭幾筆剛好都是 1，都可以成功轉入，但遇到大於 1 的值時，DataTable 裡的值卻是 DBNull，取用時要做加總就拋出了 Exception 了。<br /><br />問題發生的原因是，某一欄的資料如果輸入數值 "1"，是可以成功轉型為 double 的，但是輸入大於 1 的數值後，Excel 的儲存格左上角會出現綠色的三角形，提示「此儲存格內的數字其格式為文字或開頭為單引號」，要求使用者更正這種數字。<br /><br /><br /><br />我參考了 <a href="http://forums.asp.net/p/1196609/2070400.aspx" target="_blank">"OleDB incorrectly returning DBNull for an Excel Column"</a>，解決這個問題的方法如下：<br /><br />1. 修改 Regedit，把 <strong>Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel</strong> 的 <span style="color: #0000ff;"><strong>TypeGuessRows</strong></span> 的值改成 <span style="color: #ff0000;"><strong>0</strong></span>。（原本是 8，代表抓取前 8 列的值來判斷儲存格內的資料型態；改成 0 則表示搜尋整欄的儲存格來判斷資料型態）<br /><br />2. 在 Connection String 加入 "<span style="color: #ff0000;"><strong>IMEX=1;</strong></span>"。<br /><br /><br /><br />以我的程式為例，關於 Excel 讀檔的片段寫起來就長成這個樣子：</p>
<blockquote>string strExcelFile = @"C:\Test.xls";<br />string strExcelConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strExcelFile + ";Extended Properties='Excel 8.0;<span style="color: #ff0000;"><strong>IMEX=1;</strong></span>'";<br />OleDbDataAdapter oleAp = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", strExcelConn);<br />DataSet ds = new DataSet();<br />oleAp.Fill(ds, "ExcelData");</blockquote>
<p>接著就可以取用 ds.Tables["ExcelData"] 這個 DataTable 裡的資料來做處理了，此時會發現原本讀進來會被判斷為 DBNull 的資料也能正常轉換進來。</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/24579939">(Read More...)</a></div>]]></content>
    <category term="Windows"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/24579939#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/24414573</id>
    <title><![CDATA[jQuery新手上路。Day #4: 快速切換佈景的ThemeRoller Dev Tool]]></title>
    <updated>2009-06-20T01:20:51+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/24414573"/>
    <summary><![CDATA[今天在 jQuery UI 網站上挑佈景主題 (theme)，發現右上角冒出一則小訊息，寫著 "New! Bring ThemeRoller into any page: Get the ThemeRoller Firefox Bookmarklet!" (在任意頁面使用 ThemeRoller: 取得 ThemeRoller Firefox 書籤小工具)。加入的方式很簡單，準備一個 FireFox，打開 jQuery UI ThemeRoller，滑鼠左鍵拉著 "ThemeRoller Dev Tool" 這行，拖到書籤工具列上，就大功告成囉。有了這個書籤小工具以後，遇到每一個有使用 jQuery UI widget 的頁面，都可以點一下這個書籤小工具。譬如說，在 jQuery UI 中文站，我們想試一下它首頁的 tab 換掉 theme 的效果。原本的是淺藍色的，點了書籤小工具以後右邊會出現一個可拖曳的 ThemeRoller 工具：切到 Gallery 套用不同的 theme 試試看，我選了 Trontastic，馬上就套用進來囉。不過用這個工具的時候感覺網路要很流暢哩，因為它是會回到 jQuery UI 去取檔案回來套用的，我今天網路不太順，感覺在切換 theme 的時候就卡卡的。但至少有了這工具，切換 theme 可以一點就靈，以後就不必自己辛苦的一個個下載回來、逐一更換測試效果囉。]]></summary>
    <content type="html"><![CDATA[<p>今天在 jQuery UI 網站上挑佈景主題 (theme)，發現右上角冒出一則小訊息，寫著 <strong>"New! Bring ThemeRoller into any page: Get the ThemeRoller Firefox Bookmarklet!" </strong>(在任意頁面使用 ThemeRoller: 取得 ThemeRoller Firefox 書籤小工具)。<br /><br />加入的方式很簡單，準備一個 FireFox，打開 <a href="http://jqueryui.com/themeroller/developertool/" target="_blank">jQuery UI ThemeRoller</a>，滑鼠左鍵拉著 "ThemeRoller Dev Tool" 這行，拖到書籤工具列上，就大功告成囉。<br /><br /><a title="Flickr 上 in_future 的 ThemeRoller Dev Tool" href="http://www.flickr.com/photos/in_future/3641905120/"><img src="http://farm4.static.flickr.com/3637/3641905120_989d1d7542.jpg" alt="ThemeRoller Dev Tool" width="500" height="364" /></a><br /><br /><br /><br />有了這個書籤小工具以後，遇到每一個有使用 jQuery UI widget 的頁面，都可以點一下這個書籤小工具。譬如說，在 <a href="http://jqueryui.net/" target="_blank">jQuery UI 中文站</a>，我們想試一下它首頁的 tab 換掉 theme 的效果。<br /><br />原本的是淺藍色的，點了書籤小工具以後右邊會出現一個可拖曳的 ThemeRoller 工具：<br /><br /><a title="Flickr 上 in_future 的 ThemeRoller Dev Tool" href="http://www.flickr.com/photos/in_future/3641082111/"><img src="http://farm4.static.flickr.com/3400/3641082111_d35f0e912b.jpg" alt="ThemeRoller Dev Tool" width="500" height="308" /></a><br /><br />切到 Gallery 套用不同的 theme 試試看，我選了 Trontastic，馬上就套用進來囉。<br /><br /><a title="Flickr 上 in_future 的 ThemeRoller Dev Tool" href="http://www.flickr.com/photos/in_future/3641891064/"><img src="http://farm4.static.flickr.com/3647/3641891064_5cb8905168.jpg" alt="ThemeRoller Dev Tool" width="500" height="308" /></a><br /><br /><br /><br />不過用這個工具的時候感覺網路要很流暢哩，因為它是會回到 jQuery UI 去取檔案回來套用的，我今天網路不太順，感覺在切換 theme 的時候就卡卡的。但至少有了這工具，切換 theme 可以一點就靈，以後就不必自己辛苦的一個個下載回來、逐一更換測試效果囉。</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/24414573">(Read More...)</a></div>]]></content>
    <category term="jQuery"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/24414573#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/24309095</id>
    <title><![CDATA[[Misc.] VIM 程式碼縮排]]></title>
    <updated>2009-06-09T13:07:24+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/24309095"/>
    <summary><![CDATA[從原始碼拿出一大段 HTML，貼到 VIM 慢慢看，覺得很想把程式碼重新排版一下，就在 Google 找到《vim combo - 程式排版》。做法是這樣：1. 如果在插入模式 (insert mode)，先按 Esc 跳回常態模式 (normal)。2. 直接輸入 0ggVG=（第一個字是數字零，注意大小寫，畫面上不會出現你輸入的內容），輸入後按 Enter，排版完成。依照 bluecat 的說明，這一串代表的意義如下：0：回到行首（移到該行第0個字元）gg：回到檔案開頭（&larr;因為有這個，我覺得第一個0應該可以省略？）V：視覺選取-列模式G：到檔案結尾=：重新排版延線爬到 Blake 寫的一系列關於 VIM 的文章，有很多都超有趣的。 :D]]></summary>
    <content type="html"><![CDATA[<p>從原始碼拿出一大段 HTML，貼到 VIM 慢慢看，覺得很想把程式碼重新排版一下，就在 Google 找到<a href="http://bluecat.csie.net/2007/11/16/2045/" target="_blank">《vim combo - 程式排版》</a>。<br /><br />做法是這樣：<br /><br />1. 如果在插入模式 (insert mode)，先按 Esc 跳回常態模式 (normal)。<br />2. 直接輸入 <span style="color: #0000ff;"><strong>0ggVG=</strong></span>（第一個字是數字零，注意大小寫，畫面上不會出現你輸入的內容），輸入後按 Enter，排版完成。<br /><br />依照 <a href="http://bluecat.csie.net/" target="_blank">bluecat</a> 的說明，這一串代表的意義如下：<br /><strong>0</strong>：回到行首（移到該行第0個字元）<br /><strong>gg</strong>：回到檔案開頭（&larr;因為有這個，我覺得第一個0應該可以省略？）<br /><strong>V</strong>：視覺選取-列模式<br /><strong>G</strong>：到檔案結尾<br /><strong>=</strong>：重新排版<br /><br /><br /><br />延線爬到 Blake 寫的<a href="http://greenisland.csie.nctu.edu.tw/wp/category/comuter/vim/" target="_blank">一系列關於 VIM 的文章</a>，有很多都超有趣的。 :D</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/24309095">(Read More...)</a></div>]]></content>
    <category term="No Category"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/24309095#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/24288663</id>
    <title><![CDATA[[Win] SVN 專案檔案匯出 & 網站顯示「找不到網頁」]]></title>
    <updated>2009-06-07T21:06:57+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/24288663"/>
    <summary><![CDATA[今天要把專案裡的 .svn 檔案移掉，然後放到 IIS 上。先是刪了半天才發現有簡單的方法（感謝吳老師～），再來是在 IIS 設定好以後卻顯示「找不到網頁」。SVN 的部分的話，因為我龜毛不想使用 will 在《如何快速刪除 Subversion 專用的隱藏目錄 》裡介紹的偏方、一時又沒看懂他在前半段說的匯出，所以還傻傻的在 command 底下試了很久怎麼對每層目錄做遞迴的 RD .svn /S /Q。後來在 willie 提醒下，使用到 will 的文章裡也提到的、Tortoise SVN 的匯出功能。1. 開一個新資料夾。2. 右鍵&rarr; Tortoise SVN -&gt; 匯出 (Export)。3. 設定檔案庫 URL (Repository URL)，也就是你平常 commit 時的目的地。按下確定後，就能輕鬆得到乾乾淨淨、沒有 SVN 資訊的專案檔案們（當然啦，僅限有 commit 到檔案庫的檔案）。把檔案匯出後，接下來又有新的問題了，就是我的 IIS 突然不想理我，不管我怎麼瀏覽網頁都只得到「找不到網頁」。重啟 IIS、重啟 WWW 服務、重裝 .net Framework、設了資料夾的安全性，一樣都不見效。後來在別人的協助下才發現，原來是我的網頁服務延伸模組被關掉了，原因不明，在 IIS 裡把它們重新打開就可以了。在微軟技術支援服務網站上的《HTTP 404 - 找不到檔案錯誤訊息的一般發生原因及解決方式》也有提到。]]></summary>
    <content type="html"><![CDATA[<p>今天要把專案裡的 .svn 檔案移掉，然後放到 IIS 上。先是刪了半天才發現有簡單的方法（感謝吳老師～），再來是在 IIS 設定好以後卻顯示「找不到網頁」。<br /><br />SVN 的部分的話，因為我龜毛不想使用 will 在<a href="http://blog.miniasp.com/post/2008/04/Remove-Subversion-Folders-using-Shell-Command.aspx" target="_blank">《如何快速刪除 Subversion 專用的隱藏目錄 》</a>裡介紹的偏方、一時又沒看懂他在前半段說的匯出，所以還傻傻的在 command 底下試了很久怎麼對每層目錄做遞迴的 RD .svn /S /Q。<br /><br />後來在 willie 提醒下，使用到 will 的文章裡也提到的、Tortoise SVN 的匯出功能。<br /><br /><br /><br />1. 開一個新資料夾。<br /><br />2. 右鍵&rarr; Tortoise SVN -&gt; 匯出 (Export)。<br /><a title="Flickr 上 in_future 的 消除 .svn、得到乾淨的資料夾的方法" href="http://www.flickr.com/photos/in_future/3602853557/"><img src="http://farm4.static.flickr.com/3638/3602853557_0ba09ec82f_o.jpg" alt="消除 .svn、得到乾淨的資料夾的方法" width="361" height="166" /></a><br />3. 設定檔案庫 URL (Repository URL)，也就是你平常 commit 時的目的地。<br /><a title="Flickr 上 in_future 的 匯出SVN專案" href="http://www.flickr.com/photos/in_future/3602865809/"><img src="http://farm4.static.flickr.com/3306/3602865809_f5383e6d99_m.jpg" alt="匯出SVN專案" width="240" height="168" /></a><br /><br /><br /><br />按下確定後，就能輕鬆得到乾乾淨淨、沒有 SVN 資訊的專案檔案們（當然啦，僅限有 commit 到檔案庫的檔案）。<br /><br /><br /><br />把檔案匯出後，接下來又有新的問題了，就是我的 IIS 突然不想理我，不管我怎麼瀏覽網頁都只得到「找不到網頁」。重啟 IIS、重啟 WWW 服務、重裝 .net Framework、設了資料夾的安全性，一樣都不見效。<br /><br />後來在別人的協助下才發現，原來是我的網頁服務延伸模組被關掉了，原因不明，在 IIS 裡把它們重新打開就可以了。在微軟技術支援服務網站上的<a href="http://support.microsoft.com/kb/248033/zh-tw" target="_blank">《HTTP 404 - 找不到檔案錯誤訊息的一般發生原因及解決方式》</a>也有提到。</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/24288663">(Read More...)</a></div>]]></content>
    <category term="Windows"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/24288663#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/23917886</id>
    <title><![CDATA[[ASP.NET] 在服務發生錯誤時，寄信通知管理者]]></title>
    <updated>2009-05-11T00:19:48+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/23917886"/>
    <summary><![CDATA[在 Winodws 作業系統上有許多服務 (Windows Service)，在服務意外中斷時（非正常停止服務的情況下），我們會希望系統做一些處理或提醒。從「開始」&rarr;「所有程式」&rarr;「系統管理工具」&rarr;「服務」，或直接在「開始」&rarr;「執行」中輸入「services.msc」，可以列出所有的服務，找出我們想要設定的服務，按下右鍵&rarr;「內容」&rarr;切到「修復」頁籤，可以看到系統已經提供幾種預設的處理方式了。為了要能夠寄信，我們會使用到裡面的「執行程式」這個選項。在進行服務這邊的設定之前，先準備一支會送信的程式。寄信的方式如同以前提到的，可以利用 System.Net.Mail 來發送信件。為了能夠增加程式的彈性，我們可以藉由傳入參數的方式來取得信件的收件人與信件內容，方法就像這樣：
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void test(params string[] args)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strMail="";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strMsg="";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (string s in args)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (s.StartWith("/mail:")) { strMail = s.Substring(6); }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (s.StartWith("/msg:")) { strMsg = s.Substring(6); }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MailMessage newMail = new MailMessage();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newMail.To.Add(strMail);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newMail.From = new MailAddress("abc@___.com", "Hi Co.", System.Text.Encoding.UTF8);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newMail.Subject = "(Notice)Error!";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newMail.SubjectEncoding = Encoding.UTF8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newMail.Body = strMsg;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newMail.BodyEncoding = Encoding.UTF8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SmtpClient client = new SmtpClient("127.0.0.1");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.Send(newMail);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex) { Console.WriteLine("Send mail failed!\n" + ex.Message); }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
我把這支程式做成 mail.exe。然後，為了測試，我也開一個服務專案，做一個叫做 TestService.exe 的服務。手動安裝這個服務可以使用 Visual Studio Tools 的「Visual Studio 2005 命令提示字元」，找到服務的位置，註冊 TestService.exe 這個服務。

D:\installutil TestService.exe
如果要卸載這個服務，就加上 /u 參數。

D:\installutil /u TestService.exe
準備好測試用的服務以後，回到「服務」裡設定它的設定值。在這篇文章一開始提到的「修復」頁籤裡，有「第一次失敗時」、「第二次失敗時」、「後續失敗時」的處理對策，我在這邊都設成「執行程式」。然後，在底下「程式(P)」的文字方塊裡，輸入forcedos.exe。接著，在「命令列參數(C)」設定「/D C:\ test.bat」。test.bat 這支批次檔裡就寫了「sendmail /mail:test@___.com /msg:"test"」。會再額外指給一個批次檔，是因為我在測試時感覺好像一口氣丟太多參數給命令列似乎不管用，所以這麼做。我測試的方法不太聰明，就是從 Windows 工作管理員找出 TestService.exe 後按下「結束處理程序」。我測試時發現直接停用服務是沒有用的，在設計 TestService.exe 時在裡頭塞會拋出 Exception 的段落也沒用，我猜是得讓服務「正常啟動，並且非正常停用」的狀態下才會跑到「修復」裡的那些失敗事件。]]></summary>
    <content type="html"><![CDATA[<p>在 Winodws 作業系統上有許多服務 (Windows Service)，在服務意外中斷時（非正常停止服務的情況下），我們會希望系統做一些處理或提醒。<br /><br />從「開始」&rarr;「所有程式」&rarr;「系統管理工具」&rarr;「服務」，或直接在「開始」&rarr;「執行」中輸入「services.msc」，可以列出所有的服務，找出我們想要設定的服務，按下右鍵&rarr;「內容」&rarr;切到「修復」頁籤，可以看到系統已經提供幾種預設的處理方式了。<br /><br />為了要能夠寄信，我們會使用到裡面的「執行程式」這個選項。在進行服務這邊的設定之前，先準備一支會送信的程式。寄信的方式如同<a title="[Win] ASP.net 撰寫發信程式時，IIS 應做的轉送設定" href="http://fannys23.pixnet.net/blog/post/23336484" target="_blank">以前</a>提到的，可以利用 System.Net.Mail 來發送信件。為了能夠增加程式的彈性，我們可以藉由傳入參數的方式來取得信件的收件人與信件內容，方法就像這樣：</p>
<blockquote>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void test(<strong>params </strong>string[] args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strMail="";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strMsg="";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (string s in args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (s.StartWith("/mail:")) { strMail = s.Substring(6); }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (s.StartWith("/msg:")) { strMsg = s.Substring(6); }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MailMessage newMail = new MailMessage();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newMail.To.Add(strMail);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newMail.From = new MailAddress("abc@___.com", "Hi Co.", System.Text.Encoding.UTF8);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newMail.Subject = "(Notice)Error!";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newMail.SubjectEncoding = Encoding.UTF8;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newMail.Body = strMsg;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newMail.BodyEncoding = Encoding.UTF8;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SmtpClient client = new SmtpClient("127.0.0.1");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.Send(newMail);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex) { Console.WriteLine("Send mail failed!\n" + ex.Message); }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</blockquote>
<p><br /><br />我把這支程式做成 mail.exe。然後，為了測試，我也開一個服務專案，做一個叫做 TestService.exe 的服務。手動安裝這個服務可以使用 Visual Studio Tools 的「Visual Studio 2005 命令提示字元」，找到服務的位置，註冊 TestService.exe 這個服務。</p>
<blockquote>
D:\installutil TestService.exe</blockquote>
<p>如果要卸載這個服務，就加上 /u 參數。</p>
<blockquote>
D:\installutil /u TestService.exe</blockquote>
<p><br /><br />準備好測試用的服務以後，回到「服務」裡設定它的設定值。在這篇文章一開始提到的「修復」頁籤裡，有「第一次失敗時」、「第二次失敗時」、「後續失敗時」的處理對策，我在這邊都設成「執行程式」。然後，在底下「程式(P)」的文字方塊裡，輸入forcedos.exe。<br /><br />接著，在「命令列參數(C)」設定「/D C:\ test.bat」。test.bat 這支批次檔裡就寫了「sendmail /mail:test@___.com /msg:"test"」。會再額外指給一個批次檔，是因為我在測試時感覺好像一口氣丟太多參數給命令列似乎不管用，所以這麼做。<br /><br />我測試的方法不太聰明，就是從 Windows 工作管理員找出 TestService.exe 後按下「結束處理程序」。我測試時發現直接停用服務是沒有用的，在設計 TestService.exe 時在裡頭塞會拋出 Exception 的段落也沒用，我猜是得讓服務「正常啟動，並且非正常停用」的狀態下才會跑到「修復」裡的那些失敗事件。</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/23917886">(Read More...)</a></div>]]></content>
    <category term="Windows"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/23917886#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/23842100</id>
    <title><![CDATA[[LaTeX]調整目錄中的縮排情形]]></title>
    <updated>2009-05-03T22:09:54+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/23842100"/>
    <summary><![CDATA[寫英文的文章很容易遇到圖、表標題過長，以至於圖目錄或表目錄內容必須換行的情形。但是，在未調整設定時，往往第二行是切齊第一行的開頭的，沒有任何縮排，我們通常會希望能調出凸排的效果。做法是在文件開始前，也就是 \begin{decument}之前，利用 titletoc 這個套件做設定。例如說我想要改變圖目錄的縮排情形。原本排起來可能是長成這樣：

Figure 1.1 testtest......1我們希望排起來可以長成這樣：

Figure 1.1 test
　　　　　　test......1這時可以為 Figure 做設定，
\usepackage{titletoc}\titlecontents{figure}[5em]{}&nbsp;&nbsp;&nbsp; {\hspace{-5em} Figure {\thecontentslabel}\quad}&nbsp;&nbsp;&nbsp; {}&nbsp;&nbsp;&nbsp; {\hspace{.5em}\titlerule*[6pt]{.}\contentspage}
其中，我在 Figure 之前先做一個負的縮排 (\hspace{-5em})，讓第一行文字向左移。為了要讓整篇再回到原來的位置，再為整個圖目錄設定縮排 5em。我在批踢踢 LaTeX 板搜尋時也有看到縮排可以使用 \hangindent 和 \parindent，但好像是我設定得不對？做不出我要的效果。所以最後就是在 label 之前加上一段水平空白。titletoc 的用法可以看 "The titlesec and titletoc Packages"。]]></summary>
    <content type="html"><![CDATA[<p>寫英文的文章很容易遇到圖、表標題過長，以至於圖目錄或表目錄內容必須換行的情形。<br />但是，在未調整設定時，往往第二行是切齊第一行的開頭的，沒有任何縮排，<br />我們通常會希望能調出凸排的效果。<br /><br />做法是在文件開始前，也就是 \begin{decument}之前，<br />利用 titletoc 這個套件做設定。<br /><br />例如說我想要改變圖目錄的縮排情形。<br /><br />原本排起來可能是長成這樣：<br />
<span style="color: #808080;"><br />
Figure 1.1 test<br />test......1</span><br /><br />我們希望排起來可以長成這樣：<br />
<span style="color: #808080;"><br />
Figure 1.1 test<br />
　　　　　　test......1</span><br /><br /><br /><br />這時可以為 Figure 做設定，<br /></p>
<blockquote><span style="color: #993300;">\usepackage{<strong><span style="color: #ff0000;">titletoc</span></strong>}</span><br />\titlecontents{figure}[<span style="color: #800080;"><strong>5em</strong></span>]{}<br />&nbsp;&nbsp;&nbsp; {<span style="color: #0000ff;">\hspace{<strong>-5em</strong>} </span>Figure {\thecontentslabel}\quad}<br />&nbsp;&nbsp;&nbsp; {}<br />&nbsp;&nbsp;&nbsp; {\hspace{.5em}\titlerule*[6pt]{.}\contentspage}</blockquote>
<p><br /><br />其中，我在 Figure 之前先做一個負的縮排 (\hspace{-5em})，讓第一行文字向左移。<br />為了要讓整篇再回到原來的位置，再為整個圖目錄設定縮排 5em。<br /><br />我在批踢踢 LaTeX 板搜尋時也有看到縮排可以使用 \hangindent 和 \parindent，<br />但好像是我設定得不對？做不出我要的效果。<br />所以最後就是在 label 之前加上一段水平空白。<br /><br />titletoc 的用法可以看 <a href="http://www.ctex.org/documents/packages/layout/titlesec.pdf" target="_blank">"The titlesec and titletoc Packages"</a>。</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/23842100">(Read More...)</a></div>]]></content>
    <category term="LaTeX"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/23842100#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/23705623</id>
    <title><![CDATA[[Misc.] 輕盈小巧的日曆控制項：JS Calendar]]></title>
    <updated>2009-04-22T14:20:38+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/23705623"/>
    <summary><![CDATA[查高鐵時刻表的時候發現他們用的 JS calendar 還滿不錯的，可以透過鍵盤控制，因此我也想要在程式裡放一個。首先要到 JS Calendar 的官網下載原始碼。下載好以後，解壓縮放到你高興的地方，像我就習慣開一個叫做 jscript 的資料夾，在裡面分別設不同的資料夾放不同的套件（TinyMCE, jQuery &amp; jQuery UI...etc.），這樣才不會大家都混在一起。我把 JS Calendar 解壓縮成 jscalendar-1.0 資料夾，放到我的 jscript 裡頭，在網頁的 &lt;head&gt; 裡面加上 JS Calendar 的主檔、語系檔、設定檔。
&nbsp;
&lt;script type="text/JavaScript" src="../jscript/jscalendar-1.0/calendar.js"&gt;&lt;/script&gt;&lt;script type="text/JavaScript" src="../jscript/jscalendar-1.0/lang/calendar-big5-utf8.js"&gt;&lt;/script&gt;&lt;script type="text/JavaScript" src="../jscript/jscalendar-1.0/calendar-setup.js"&gt;&lt;/script&gt;
外觀的部分內建有 11 種主題可以使用，都不愛的話也可以自己改 CSS。懶人如我是直接看官網上的範例套用的結果（點右上角的 Theme 的名稱，右邊那個日曆就會馬上顯示出套用的樣子來），選一個和現在的網頁樣式搭配的來用。我選的是 winter 這個 theme，把 CSS 設定寫在 &lt;head&gt; 裡面，產生出來的日曆控制項。（網站上示範的 "blue" theme 是對應到 calendar-blue2.css）
&nbsp;
&lt;link type="text/css" href="../jscript/jscalendar-1.0/calendar-blue.css" rel="Stylesheet" /&gt;
&nbsp;
然後我想要點選一個日曆小圖示來呼叫 JS Calendar，並且在一個 text 裡頭取得日曆文字的 text。以 ASP.net 來說，就是拉一個 TextBox 和 Image 物件到頁面上。
&nbsp;
&lt;asp:TextBox ID="txtCalendar" runat="server" /&gt;&lt;asp:Image ID="imgCalendar" runat="server" ImageUrl="~/images/calendar.gif" AlternateText="小日曆" /&gt;
&nbsp;
如果你是 pure HTML / PHP / JSP，可能會寫成這樣：
&nbsp;
&lt;input type="text" name="date" id="txtCalendar" /&gt;&lt;img src="../images/calendar.gif" id="imgCalendar" alt="小日曆" /&gt;
&nbsp;
擺好你的文字方塊和小圖片以後，就可以來把 JS Calendar 和它們的關聯建立起來了。請記得在這些物件之後再放上以下的 JavaScript，不然物件還沒有產生，在 Calendar.setup 執行時它會執行 document.getElementById 來找你的文字方塊和小圖片，這時就會出現 null 之類找不到物件的錯誤（因為文字方塊和小圖片之後才生出來嘛）。
&nbsp;
&lt;script language="javascript" type="text/javascript"&gt;&nbsp;&nbsp;&nbsp; Calendar.setup({&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputField: "&lt;%=txtStart.ClientID%&gt;",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifFormat: "%Y/%m/%d", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; button: "&lt;%=imgStart.ClientID%&gt;", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; align: "Tl", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; singleClick: true&nbsp;&nbsp;&nbsp; });&lt;/script&gt;
&nbsp;
以上面這串 JSON 來說，inputField 指向的就是接收日期字串的 TextBox；ifFormat 是你要產生的日期格式，我這邊只產生 2009/04/01 這種格式的字串，你高興的話可以產生時、分、秒；button 則是點下去會呼叫日曆控制項的物件，可以是圖片也可以是按鈕；align 是對齊的方式，預設是對齊 button 的左下方，大小寫有別，請參考官方說明文件的 5.3.11 這節。在 inputField 和 button 的 ID 這部分，如果不是 ASP.net，這邊就直接填 text 和 img 的 ID 就好，我是因為放在 MasterPage 的某個內容子頁裡，所以必須讓它轉成 ClientID。這樣就設定得差不多了，然後這時候就可以點日曆小圖示來喚醒你可愛的 JS Calendar。不過在這時候這個日曆控制項也爆炸了。摸摸鼻子在 Google 下關鍵字「jscalendar undefined」，找到了一條明路、以及再一條明路。總之，就是在你引用的語系檔最後面加上「Calendar._FD = 0;」，以我的情況來說就是找出 jscript/jscalendar-1.0/lang 資料夾裡的 calendar-big5-utf8.js 這個檔案，在檔尾加上這行設定值。然後可愛的日曆控制項又活過來了。像我有個頁面要設定一段時間，所以得有兩個日曆控制項，這時候就是在裡頭寫兩遍 Calendar.setup()，在這兩個 Calendar.setup() 裡頭把 inputField 和 button 分別設給兩組不同的物件就可以了。其實網路上的 JavaScript Calendar 很多，各種日曆控制項各有優點，不過像我在用 jQuery UI 裡的 datePicker 時，就遇到它在 thickbox 裡垂直位置不正確的問題，看了原始碼，原因是因為產生日期控制項時，垂直位置是透過捲軸的總長度來計算的，但是 datePicker 沒有正確抓到 iframe 的捲軸長度、反而抓到了外圍的視窗捲軸長度，導致位置不正確。我回報了這個 bug，不過它的 milestone 設在 1.8 版（現在才 1.7.1），所以只好物色新的日曆控制項來換了。改用 JS Calendar 有效地解決了這個問題。它的位置似乎是以 button 的位置來換算的（沒時間看原始碼，純屬不負責任猜測，有錯歡迎指正XD），所以用在 thickbox 裡也沒有像 jQuery UI 的 datePicker 那樣往高空亂飛。除了位置正確、可以鍵盤操作，我還滿喜歡這個控制項可以任意拖曳 (drag)、可以讓使用者自己決定一週的第一天是哪天（點一下最上面的星期幾，就可以馬上 render 出以它為一週之首的日曆來），產生的速度也很快，不過我看很多人的程式還是都習慣自己刻一個日曆控制項，不知道為什麼&hellip;&hellip;希望這個小玩具不要有地雷。 XD]]></summary>
    <content type="html"><![CDATA[<p>查高鐵時刻表的時候發現他們用的 JS calendar 還滿不錯的，可以透過鍵盤控制，因此我也想要在程式裡放一個。<br /><br />首先要到 <a href="http://www.dynarch.com/projects/calendar/" target="_blank">JS Calendar 的官網</a>下載原始碼。<br /><br />下載好以後，解壓縮放到你高興的地方，像我就習慣開一個叫做 jscript 的資料夾，在裡面分別設不同的資料夾放不同的套件（TinyMCE, jQuery &amp; jQuery UI...etc.），這樣才不會大家都混在一起。我把 JS Calendar 解壓縮成 jscalendar-1.0 資料夾，放到我的 jscript 裡頭，在網頁的 &lt;head&gt; 裡面加上 JS Calendar 的主檔、語系檔、設定檔。</p>
<p>&nbsp;</p>
<blockquote>&lt;script type="text/JavaScript" src="../jscript/jscalendar-1.0/<span style="color: #0000ff;"><strong>calendar.js</strong></span>"&gt;&lt;/script&gt;<br />&lt;script type="text/JavaScript" src="../jscript/jscalendar-1.0/<strong><span style="color: #0000ff;">lang/calendar-big5-utf8.js</span></strong>"&gt;&lt;/script&gt;<br />&lt;script type="text/JavaScript" src="../jscript/jscalendar-1.0/<span style="color: #0000ff;"><strong>calendar-setup.js</strong></span>"&gt;&lt;/script&gt;</blockquote>
<p><br /><br />外觀的部分內建有 11 種主題可以使用，都不愛的話也可以自己改 CSS。懶人如我是直接看<a href="http://www.dynarch.com/static/jscalendar-1.0/index.html" target="_blank">官網上的範例</a>套用的結果（點右上角的 Theme 的名稱，右邊那個日曆就會馬上顯示出套用的樣子來），選一個和現在的網頁樣式搭配的來用。我選的是 winter 這個 theme，把 CSS 設定寫在 &lt;head&gt; 裡面，產生出來的日曆控制項。（網站上示範的 "blue" theme 是對應到 calendar-blue2.css）</p>
<p>&nbsp;</p>
<blockquote>&lt;link type="text/css" href="../jscript/jscalendar-1.0/<span style="color: #0000ff;"><strong>calendar-blue.css</strong></span>" rel="Stylesheet" /&gt;</blockquote>
<p>&nbsp;</p>
<p>然後我想要點選一個日曆小圖示來呼叫 JS Calendar，並且在一個 text 裡頭取得日曆文字的 text。以 ASP.net 來說，就是拉一個 TextBox 和 Image 物件到頁面上。</p>
<p>&nbsp;</p>
<blockquote>&lt;asp:TextBox ID="<span style="color: #008000;"><strong>txtCalendar</strong></span>" runat="server" /&gt;<br />&lt;asp:Image ID="<span style="color: #008000;"><strong>imgCalendar</strong></span>" runat="server" ImageUrl="~/images/calendar.gif" AlternateText="小日曆" /&gt;</blockquote>
<p>&nbsp;</p>
<p>如果你是 pure HTML / PHP / JSP，可能會寫成這樣：</p>
<p>&nbsp;</p>
<blockquote>&lt;input type="text" name="date" id="<span style="color: #008000;"><strong>txtCalendar</strong></span>" /&gt;<br />&lt;img src="../images/calendar.gif" id="<span style="color: #008000;"><strong>imgCalendar</strong></span>" alt="小日曆" /&gt;</blockquote>
<p>&nbsp;</p>
<p>擺好你的文字方塊和小圖片以後，就可以來把 JS Calendar 和它們的關聯建立起來了。請記得在這些物件之後再放上以下的 JavaScript，不然物件還沒有產生，在 Calendar.setup 執行時它會執行 document.getElementById 來找你的文字方塊和小圖片，這時就會出現 null 之類找不到物件的錯誤（因為文字方塊和小圖片之後才生出來嘛）。</p>
<p>&nbsp;</p>
<blockquote>&lt;script language="javascript" type="text/javascript"&gt;<br />&nbsp;&nbsp;&nbsp; Calendar.setup({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>inputField</strong>: "<span style="color: #008000;"><strong>&lt;%=txtStart.ClientID%&gt;</strong></span>",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>ifFormat</strong>: "%Y/%m/%d", <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>button</strong>: "<span style="color: #008000;"><strong>&lt;%=imgStart.ClientID%&gt;</strong></span>", <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>align</strong>: "Tl", <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>singleClick</strong>: true<br />&nbsp;&nbsp;&nbsp; });<br />&lt;/script&gt;</blockquote>
<p>&nbsp;</p>
<p>以上面這串 JSON 來說，<br /><strong>inputField </strong>指向的就是接收日期字串的 TextBox；<br /><strong>ifFormat </strong>是你要產生的日期格式，我這邊只產生 2009/04/01 這種格式的字串，你高興的話可以產生時、分、秒；<br /><strong>button </strong>則是點下去會呼叫日曆控制項的物件，可以是圖片也可以是按鈕；<br /><strong>align </strong>是對齊的方式，預設是對齊 button 的左下方，大小寫有別，請參考官方說明文件的 <a href="http://www.dynarch.com/static/jscalendar-1.0/doc/html/reference.html#node_sec_5.3.11" target="_blank">5.3.11 這節</a>。<br /><br />在 <strong>inputField </strong>和 <strong>button </strong>的 ID 這部分，如果不是 ASP.net，這邊就直接填 text 和 img 的 ID 就好，我是因為放在 MasterPage 的某個內容子頁裡，所以必須讓它轉成 ClientID。<br /><br /><br /><br />這樣就設定得差不多了，然後這時候就可以點日曆小圖示來喚醒你可愛的 JS Calendar。不過在這時候這個日曆控制項也爆炸了。<br /><br /><a title="Flickr 上 in_future 的 在網頁加上 JS Calendar" href="http://www.flickr.com/photos/in_future/3464999502/"><img src="http://farm4.static.flickr.com/3596/3464999502_9fe6a5f617_o.jpg" alt="在網頁加上 JS Calendar" width="388" height="78" /></a><br /><br />摸摸鼻子在 Google 下關鍵字「jscalendar undefined」，找到了<a href="http://drupal.org/node/118277" target="_blank">一條明路</a>、以及<a href="http://blog.csdn.net/alexdream/archive/2007/12/06/1920885.aspx" target="_blank">再一條明路</a>。總之，就是在你引用的語系檔最後面加上「<span style="color: #ff0000;"><strong>Calendar._FD = 0;</strong></span>」，以我的情況來說就是找出 jscript/jscalendar-1.0/lang 資料夾裡的 calendar-big5-utf8.js 這個檔案，在檔尾加上這行設定值。然後可愛的日曆控制項又活過來了。<br /><br /><a title="Flickr 上 in_future 的 在網頁加上 JS Calendar" href="http://www.flickr.com/photos/in_future/3464999528/"><img src="http://farm4.static.flickr.com/3572/3464999528_3d3eff97db_o.jpg" alt="在網頁加上 JS Calendar" width="277" height="200" /></a><br /><br />像我有個頁面要設定一段時間，所以得有兩個日曆控制項，這時候就是在裡頭寫兩遍 Calendar.setup()，在這兩個 Calendar.setup() 裡頭把 inputField 和 button 分別設給兩組不同的物件就可以了。<br /><br /><br /><br />其實網路上的 JavaScript Calendar 很多，各種日曆控制項各有優點，不過像我在用 jQuery UI 裡的 datePicker 時，就遇到它在 thickbox 裡垂直位置不正確的問題，看了原始碼，原因是因為產生日期控制項時，垂直位置是透過捲軸的總長度來計算的，但是 datePicker 沒有正確抓到 iframe 的捲軸長度、反而抓到了外圍的視窗捲軸長度，導致位置不正確。我回報了這個 bug，不過它的 milestone 設在 1.8 版（現在才 1.7.1），所以只好物色新的日曆控制項來換了。<br /><br />改用 JS Calendar 有效地解決了這個問題。它的位置似乎是以 button 的位置來換算的（沒時間看原始碼，純屬不負責任猜測，有錯歡迎指正XD），所以用在 thickbox 裡也沒有像 jQuery UI 的 datePicker 那樣往高空亂飛。<br /><br />除了位置正確、可以鍵盤操作，我還滿喜歡這個控制項可以任意拖曳 (drag)、可以讓使用者自己決定一週的第一天是哪天（點一下最上面的星期幾，就可以馬上 render 出以它為一週之首的日曆來），產生的速度也很快，不過我看很多人的程式還是都習慣自己刻一個日曆控制項，不知道為什麼&hellip;&hellip;希望這個小玩具不要有地雷。 XD</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/23705623">(Read More...)</a></div>]]></content>
    <category term="No Category"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/23705623#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/23538002</id>
    <title><![CDATA[[Excel] 利用「定義」抓出公式來]]></title>
    <updated>2009-03-31T13:15:20+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/23538002"/>
    <summary><![CDATA[有時候我們會希望可以在某一個儲存格計算結果，在這個計算值的儲存格旁邊又能列出所使用的公式內容。例如說，A2設了公式，在A1顯示出A2的公式內容、A2則顯示運算的結果。原本想的滿麻煩的，想說用 VBA 去抓內容、再把內容加上一個逗點輸出在別的儲存格&hellip;&hellip;不過找到了《Excel妙用-公式結果我都要》，不過第一種方法我試不出來、第二種方法又必須手動更新，因此後來又在 CSDN 上面找到了一篇《自動顯示公式計算過程》，回文裡有把兩種方法結合的建議，就利用回文中建議的「定義」來做。
1. 先把要計算的資料準備好，例如在 A1 輸入 2，B1 輸入 3，在 E1 計算這兩個儲存格的加總（=A1+B1），得到計算的結果。2. 現在要取出公式了。在工具列的「插入」&rarr;「名稱」&rarr;「定義」，新增新的定義。現有名稱的部分隨便你取，但請避開既有的函式。我將「現有名稱」取名為「TEST」，「參照到」設定為「=GET.CELL(6, E1)」，GET.CELL 的第一個參數意思是「取得第二個參數指定的儲存格的公式內容」，第二個參數則是指定要抓取的儲存格（也就是第一個步驟中我計算出結果的位置）。設定好以後按下「確定」新增這個定義。3. 游標移到我們想要秀出公式內容的儲存格，輸入我們的定義。以我的設定為例，我想要在儲存格 F1 列出公式來，就將游標移到 F1，在儲存格中輸入「=TEST」。這麼一來就能取出 E1 內的公式了。一開始我不懂為什麼在 GET.CELL 的第一個參數要下 "6"，還誤以為是儲存格位置的意思，實際上 GET.CELL 的用法可以參考《獲取儲存格資訊的秘技函數 GET.CELL》所做的整理。]]></summary>
    <content type="html"><![CDATA[<p>有時候我們會希望可以在某一個儲存格計算結果，在這個計算值的儲存格旁邊又能列出所使用的公式內容。例如說，A2設了公式，在A1顯示出A2的公式內容、A2則顯示運算的結果。<br /><br />原本想的滿麻煩的，想說用 VBA 去抓內容、再把內容加上一個逗點輸出在別的儲存格&hellip;&hellip;不過找到了<a href="http://big5.pconline.com.cn/b5/www.pconline.com.cn/pcedu/soft/office/excel/0311/246360.html" target="_blank">《Excel妙用-公式結果我都要》</a>，不過第一種方法我試不出來、第二種方法又必須手動更新，因此後來又在 CSDN 上面找到了一篇<a href="http://topic.csdn.net/t/20041121/17/3573818.html" target="_blank">《自動顯示公式計算過程》</a>，回文裡有把兩種方法結合的建議，就利用回文中建議的「定義」來做。</p>
<p>1. 先把要計算的資料準備好，例如在 A1 輸入 2，B1 輸入 3，在 <span style="color: #0000ff;"><strong>E1 </strong></span>計算這兩個儲存格的加總（=A1+B1），得到計算的結果。<br /><a title="Flickr 上 in_future 的 利用「定義」抓出公式內容" href="http://www.flickr.com/photos/in_future/3400230887/"><img src="http://farm4.static.flickr.com/3571/3400230887_09842639dd_o.jpg" alt="利用「定義」抓出公式內容" width="471" height="203" /></a><br /><br />2. 現在要取出公式了。在工具列的「<strong>插入</strong>」&rarr;「<strong>名稱</strong>」&rarr;「<strong>定義</strong>」，新增新的定義。現有名稱的部分隨便你取，但請避開既有的函式。我將「<strong>現有名稱</strong>」取名為「<span style="color: #008000;"><strong>TEST</strong></span>」，「<strong>參照到</strong>」設定為「<strong>=GET.CELL(6, <span style="color: #0000ff;">E1</span>)</strong>」，GET.CELL 的第一個參數意思是「取得第二個參數指定的儲存格的公式內容」，第二個參數則是指定要抓取的儲存格（也就是第一個步驟中我計算出結果的位置）。設定好以後按下「<strong>確定</strong>」新增這個定義。<br /><a title="Flickr 上 in_future 的 利用「定義」抓出公式內容" href="http://www.flickr.com/photos/in_future/3400230911/"><img src="http://farm4.static.flickr.com/3442/3400230911_08ba3da1d9_o.jpg" alt="利用「定義」抓出公式內容" width="408" height="231" /></a><br /><br />3. 游標移到我們想要秀出公式內容的儲存格，輸入我們的定義。以我的設定為例，我想要在儲存格 F1 列出公式來，就將游標移到 F1，在儲存格中輸入「<strong>=<span style="color: #008000;">TEST</span></strong>」。這麼一來就能取出 <strong><span style="color: #0000ff;">E1</span></strong> 內的公式了。<br /><a title="Flickr 上 in_future 的 利用「定義」抓出公式內容" href="http://www.flickr.com/photos/in_future/3401037156/"><img src="http://farm4.static.flickr.com/3649/3401037156_6ff9ee8f91_o.jpg" alt="利用「定義」抓出公式內容" width="540" height="181" /></a><br /><br /><br /><br />一開始我不懂為什麼在 GET.CELL 的第一個參數要下 "6"，還誤以為是儲存格位置的意思，實際上 GET.CELL 的用法可以參考<a href="http://blog.xuite.net/crdotlin/excel/9016218" target="_blank">《<span class="titlename">獲取儲存格資訊的秘技函數 GET.CELL</span>》</a>所做的整理。</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/23538002">(Read More...)</a></div>]]></content>
    <category term="Windows"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/23538002#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/23514807</id>
    <title><![CDATA[[Misc.] Google Calendar 加入台灣假日日曆]]></title>
    <updated>2009-03-28T16:48:16+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/23514807"/>
    <summary><![CDATA[Google Calendar 內建的「台灣假日」不夠完整，沒有顯示出彈性假日來，今天看到學妹的 Google Calendar 上有「2008-2009 台灣假日及重要節日」，連彈性放假都有提供唷，超貼心！想要也來一個的人可以按這裡：2008-2009 台灣假日及重要節日。右下角有加入至 Google Calendar 的按鈕，點選後就可以把它加入到你自己的 Google Calendar 裡了。]]></summary>
    <content type="html"><![CDATA[<p>Google Calendar 內建的「台灣假日」不夠完整，沒有顯示出彈性假日來，今天看到學妹的 Google Calendar 上有「2008-2009 台灣假日及重要節日」，連彈性放假都有提供唷，超貼心！<br /><br />想要也來一個的人可以按這裡：<a href="http://www.google.com/calendar/embed?src=jaout7qf5f5akruoj5ro66p184%40group.calendar.google.com&amp;ctz=Asia/Taipei" target="_blank">2008-2009 台灣假日及重要節日</a>。右下角有加入至 Google Calendar 的按鈕，點選後就可以把它加入到你自己的 Google Calendar 裡了。</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/23514807">(Read More...)</a></div>]]></content>
    <category term="No Category"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/23514807#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/23336484</id>
    <title><![CDATA[[Win] ASP.net 撰寫發信程式時，IIS 應做的轉送設定]]></title>
    <updated>2009-03-06T19:21:18+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/23336484"/>
    <summary><![CDATA[今天寫了支程式要送出信件，但是卻冒出了錯誤來。錯誤訊息是 "System.Net.Mail.SmtpFailedRecipientException: 無法使用信箱。 伺服器回應為: 5.7.1 Unable to relay for xxx@xxx.xxx.xx"，照著這一篇網誌設定，在 IIS 改成我自己的實體 IP，錯誤訊息又變成「傳送郵件失敗」。後來在同事的協助下才發現，是我弄錯了。我在程式裡是這樣寫的：&nbsp;&nbsp;&nbsp; Dim client As System.Net.Mail.SmtpClient = New System.Net.Mail.SmtpClient("127.0.0.1")因此，我應該在 IIS 做如下設定（也可以參考這頁，有可能有你需要的其他訊息）：1. 打開「網際網路資訊服務 (IIS) 管理員」。（找不到的話，我都習慣在「開始」&rarr;「執行」&rarr;輸入「inetmgr」，就可以打開了）2. 打開「網際網路資訊服務」&rarr;「本機電腦」&rarr;「預設 SMTP 虛擬伺服器」&rarr;右鍵「內容」。3. 在「存取」頁籤，找到「轉接限制」的「轉接 (E)」，設定轉接限制。我是設定白名單（在「只有下列清單中的 (O)」新增我要允許的 IP），按下新增後輸入 127.0.0.1。按下確定後，我沒有重新啟動 IIS，直接重新整理網頁，程式即可正常發送信件。另外，發寄 mail 時，在測試資料的收件人為英文名、寄件人為中文名時都沒有問題，就不疑有他的往下寫了。但是到了後來，當測試資料中收件者的名字為中文時，就冒出了「指定字串不在電子郵件地址的必要表單中」。在《System.Web.Mail升級至System.Net.Mail的第一個問題》裡找到方法，原來要改寫指定寄送對象的語句，來避免這個問題。原本的寫法是長這樣（我在頁首已寫了 Imports System.Net.Mail）：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim Message As MailMessage = New MailMessage(strFrom, strRecipients, strSubject, strBody)改寫成這樣就沒事囉。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim Message As MailMessage = New MailMessage()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message.From = New MailAddress(strFrom)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message.To.Add(New MailAddress(strRecipients))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message.Subject = strSubject&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message.Body = strBody&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim client As SmtpClient = New SmtpClient("127.0.0.1")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.Send(Message)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return "郵件已成功送出！"]]></summary>
    <content type="html"><![CDATA[<p>今天寫了支程式要送出信件，但是卻冒出了錯誤來。錯誤訊息是 <span style="color: #0000ff;"><strong>"System.Net.Mail.SmtpFailedRecipientException: 無法使用信箱。 伺服器回應為: 5.7.1 Unable to relay for xxx@xxx.xxx.xx"</strong></span>，照著<a href="http://dotjum.spaces.live.com/Blog/cns!F0C7688CEBFA8680!486.entry" target="_blank">這一篇網誌</a>設定，在 IIS 改成我自己的實體 IP，錯誤訊息又變成<span style="color: #0000ff;"><strong>「傳送郵件失敗」</strong></span>。<br /><br />後來在同事的協助下才發現，是我弄錯了。我在程式裡是這樣寫的：<br />&nbsp;&nbsp;&nbsp; <span style="color: #800000;">Dim client As System.Net.Mail.SmtpClient = New System.Net.Mail.SmtpClient("<span style="color: #ff0000;"><strong>127.0.0.1</strong></span>")</span><br />因此，我應該在 IIS 做如下設定（也可以參考<a href="http://www.systemwebmail.com/faq/4.3.11.aspx" target="_blank">這頁</a>，有可能有你需要的其他訊息）：<br /><br />1. 打開「網際網路資訊服務 (IIS) 管理員」。（找不到的話，我都習慣在「開始」&rarr;「執行」&rarr;輸入「inetmgr」，就可以打開了）<br /><br />2. 打開「網際網路資訊服務」&rarr;「本機電腦」&rarr;「預設 SMTP 虛擬伺服器」&rarr;右鍵「內容」。<br /><br />3. 在「存取」頁籤，找到「轉接限制」的「轉接 (E)」，設定轉接限制。我是設定白名單（在「只有下列清單中的 (O)」新增我要允許的 IP），按下新增後輸入 <span style="color: #ff0000;"><strong>127.0.0.1</strong></span>。<br /><br /><br />按下確定後，我沒有重新啟動 IIS，直接重新整理網頁，程式即可正常發送信件。<br /><br /><br /><br />另外，發寄 mail 時，在測試資料的收件人為英文名、寄件人為中文名時都沒有問題，就不疑有他的往下寫了。但是到了後來，當測試資料中收件者的名字為中文時，就冒出了「<strong>指定字串不在電子郵件地址的必要表單中</strong>」。在<a href="http://www.dotblogs.com.tw/jeff-yeh/archive/2008/04/09/2656.aspx" target="_blank">《System.Web.Mail升級至System.Net.Mail的第一個問題》</a>裡找到方法，原來要改寫指定寄送對象的語句，來避免這個問題。<br /><br />原本的寫法是長這樣（我在頁首已寫了 Imports System.Net.Mail）：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000;">Dim Message As MailMessage = New MailMessage(strFrom, strRecipients, strSubject, strBody)</span><br /><br />改寫成這樣就沒事囉。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">Dim Message As MailMessage = New MailMessage()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message.From = New MailAddress(strFrom)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message.To.Add(New MailAddress(strRecipients))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message.Subject = strSubject<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message.Body = strBody</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim client As SmtpClient = New SmtpClient("127.0.0.1")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.Send(Message)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return "郵件已成功送出！"</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/23336484">(Read More...)</a></div>]]></content>
    <category term="Windows"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/23336484#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/23308877</id>
    <title><![CDATA[jQuery新手上路。Day #3: 在 Mater Page 中使用 jQuery]]></title>
    <updated>2009-03-03T20:06:33+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/23308877"/>
    <summary><![CDATA[今天為了做個選單，於是打算把 jQuery 放在 MasterPage 裡。如果網頁 (*.aspx) 和 MasterPage 放在同一層還 OK，但若程式和 MasterPage 分處不同的資料夾，就會因為相對路徑的問題而造成無法讀取 jQuery core 與 CSS。嘗試做了幾個試驗，譬如說寫成這樣：&nbsp;&nbsp;&nbsp; &lt;link type="text/css" href='&lt;%=ResolveUrl("~/jquery/theme/ui.all.css") %&gt;' rel="Stylesheet" /&gt;或是這樣：&nbsp;&nbsp;&nbsp; &lt;link type="text/css" href="&lt;%=Request.ApplicationPath()%&gt;/jquery/theme/ui.all.css"&nbsp; rel="Stylesheet" /&gt;這些方法都沒有用，不管我有沒有在 &lt;head&gt; 加上 runat="server"。前者會直接把整個單引號內的內容印出來，後者會出現「無法修改 Controls 集合，因為控制項包含程式碼區塊 (例如 &lt;% ... %&gt;)。」，都不是我要的結果啊。最後在 Google 上找到這篇："Moving jQuery File Reference to ASP.NET MasterPage"，原來要先增加一個 ContentPlaceHolder。對方的範例是 for C# 的，像我用 VB 就是這樣做。1. 在 MasterPage 的 *.master 檔裡，&lt;head&gt; 加上 runat="server" 屬性，並增加一個 ContentPlaceHolder。
&nbsp;&nbsp;&nbsp; &lt;head runat="server"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:ContentPlaceHolder id="head" runat="server"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:ContentPlaceHolder&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script src="jquery/jquery-1.3.1.js" type="text/javascript"&gt;&lt;/script&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/head&gt;
2. 一樣是 *.master 檔，把 script 或 css 加上 ResolveUrl 方法，使它們可以轉換為絕對路徑。
&nbsp;&nbsp;&nbsp; &lt;link type="text/css" href='&lt;%#ResolveUrl("~/jquery/theme/ui.all.css") %&gt;' rel="Stylesheet" /&gt;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" src='&lt;%#ResolveUrl("~/jquery/jquery-1.3.1.js") %&gt;'&gt;&lt;/script&gt;
3. 在 *.master.vb 檔裡，覆寫原來的 OnLoad 方法。
&nbsp;&nbsp;&nbsp; Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyBase.OnLoad(e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Page.Header.DataBind()&nbsp;&nbsp;&nbsp; End Sub
&nbsp;
原本打算如果真的不行就要動態註冊了，譬如說這樣：&nbsp;&nbsp;&nbsp; Me.PageScriptManager.RegisterClientScriptInclude("jQueryCore", "/jquery/jquery-1.3.1.js")css 的部分就靠增加 head 的 Control 來處理：&nbsp;&nbsp;&nbsp; CSSLink.Href = "/jquery/theme/ui.all.css"&nbsp;&nbsp;&nbsp; CSSLink.Attributes("rel") = "stylesheet"&nbsp;&nbsp;&nbsp; CSSLink.Attributes("type") = "text/css"&nbsp;&nbsp;&nbsp; Me.Page.Header.Controls.Add(CSSLink)不過後來沒用到，不曉得這樣會不會也有問題。
都弄好以後，開始寫程式，卻在某個套用 MasterPage 的頁面、使用 jQuery Impromptu 時，發生這樣的錯誤訊息：　　「Internet Explorer 無法開啟網際網路網站 http://....」　　(Internet Explorer
cannot open the Internet site, Operation aborted)因為其他套用 MasterPage 的頁面沒事，所以我很肯定是 content page 暴走了。原本猜測是在 content page
中不可以動態註冊 JavaScript、或是在 content page 不給動態註冊 jQuery，但是測試了以下的語法，都是可行的：　　' 測試 JavaScript 可否動態註冊　　ScriptManager.RegisterStartupScript(Me, Me.GetType(), "jsalert", "alert('123');", True)　　' 測試 jQuery 語法可否動態註冊　　ScriptManager.RegisterStartupScript(Me, Me.GetType(), "jqalert", "$('.myitem').text('123');", True)既然最大的原因排除掉了，那嫌疑就落到 jQuery Impromptu 上面了。原本以為是這個 plug-in 有
Bug，但是找了很久都找不到相關的文件。後來拿錯誤訊息搜尋，剛好看到有人在 ExtJS 遇到一樣的問題，心想這幾個 library
感覺在跑的模式還滿像，就試著把 $(document).ready() 從 MasterPage 移掉、挪進 content page 裡動態註冊。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim sb As StringBuilder = New StringBuilder&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.Append("$(document).ready(function() {" + vbCrLf)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.Append("$.prompt('test')" + vbCrLf)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.Append("});" + vbCrLf)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScriptManager.RegisterStartupScript(Me, Me.GetType(), "jsalert", sb.ToString(), True)結果就好了，看來是 DOM 沒有載入完全我就召喚 Impromptu 出現的問題。 =_=#原本設計時的想法是 $(document).ready() 要做的事是固定的，所以就把它放在 MasterPage 裡了。看來還得考慮到其他物件產生的時機點啊。]]></summary>
    <content type="html"><![CDATA[<p>今天為了做個選單，於是打算把 jQuery 放在 MasterPage 裡。如果網頁 (*.aspx) 和 MasterPage 放在同一層還 OK，但若程式和 MasterPage 分處不同的資料夾，就會因為相對路徑的問題而造成無法讀取 jQuery core 與 CSS。<br /><br />嘗試做了幾個試驗，譬如說寫成這樣：<br /><strong>&nbsp;&nbsp;&nbsp; &lt;link type="text/css" href='<span style="color: #ff0000;">&lt;%=ResolveUrl("~/</span><span style="color: #999999;">jquery/theme/ui.all.css</span><span style="color: #ff0000;">") %&gt;'</span> rel="Stylesheet" /&gt;</strong><br />或是這樣：<br /><strong>&nbsp;&nbsp;&nbsp; &lt;link type="text/css" href="<span style="color: #ff0000;">&lt;%=Request.ApplicationPath()%&gt;</span>/jquery/theme/ui.all.css"&nbsp; rel="Stylesheet" /&gt;</strong><br />這些方法都沒有用，不管我有沒有在 &lt;head&gt; 加上 runat="server"。前者會直接把整個單引號內的內容印出來，後者會出現「無法修改 Controls 集合，因為控制項包含程式碼區塊 (例如 &lt;% ... %&gt;)。」，都不是我要的結果啊。<br /><br />最後在 Google 上找到這篇：<a title="&quot;Moving jQuery File Reference to ASP.NET MasterPage&quot;" href="http://beckelman.net/post/2008/09/09/Moving-jQuery-File-Reference-to-ASPNET-MasterPage.aspx" target="_blank">"Moving jQuery File Reference to ASP.NET MasterPage"</a>，原來要先增加一個 ContentPlaceHolder。對方的範例是 for C# 的，像我用 VB 就是這樣做。<br /><br />1. 在 MasterPage 的 *.master 檔裡，&lt;head&gt; 加上 runat="server" 屬性，並增加一個 ContentPlaceHolder。</p>
<blockquote>&nbsp;&nbsp;&nbsp; &lt;head runat="server"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000;"><strong>&lt;asp:ContentPlaceHolder id="head" runat="server"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:ContentPlaceHolder&gt;</strong>&nbsp; </span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script src="jquery/jquery-1.3.1.js" type="text/javascript"&gt;&lt;/script&gt;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;/head&gt;<br /></blockquote>
<p>2. 一樣是 *.master 檔，把 script 或 css 加上 ResolveUrl 方法，使它們可以轉換為絕對路徑。</p>
<blockquote>&nbsp;&nbsp;&nbsp; &lt;link type="text/css" href=<span style="color: #008000;"><strong>'&lt;%#ResolveUrl("~/jquery/theme/ui.all.css") %&gt;'</strong> </span>rel="Stylesheet" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" src=<strong><span style="color: #008000;">'&lt;%#ResolveUrl("~/jquery/jquery-1.3.1.js") %&gt;'</span></strong>&gt;&lt;/script&gt;</blockquote>
<p>3. 在 *.master.vb 檔裡，覆寫原來的 OnLoad 方法。</p>
<blockquote>&nbsp;&nbsp;&nbsp; Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyBase.OnLoad(e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000;"><strong>Page.Header.DataBind()</strong></span><br />&nbsp;&nbsp;&nbsp; End Sub</blockquote>
<p>&nbsp;</p>
<p>原本打算如果真的不行就要動態註冊了，譬如說這樣：<br /><strong>&nbsp;&nbsp;&nbsp; Me.PageScriptManager.RegisterClientScriptInclude("jQueryCore", "/jquery/jquery-1.3.1.js")</strong><br /><br />css 的部分就靠增加 head 的 Control 來處理：<br /><strong>&nbsp;&nbsp;&nbsp; CSSLink.Href = "/jquery/theme/ui.all.css"<br />&nbsp;&nbsp;&nbsp; CSSLink.Attributes("rel") = "stylesheet"<br />&nbsp;&nbsp;&nbsp; CSSLink.Attributes("type") = "text/css"<br />&nbsp;&nbsp;&nbsp; Me.Page.Header.Controls.Add(CSSLink)</strong><br /><br />不過後來沒用到，不曉得這樣會不會也有問題。<br /><br /><br /><br /><br /></p>
<p>都弄好以後，開始寫程式，卻在某個套用 MasterPage 的頁面、使用 <a href="http://trentrichardson.com/Impromptu/index.php" target="_blank">jQuery Impromptu</a> 時，發生這樣的錯誤訊息：<br /><span style="color: #800000;">　　「Internet Explorer 無法開啟網際網路網站 http://....」<br />　　(Internet Explorer
cannot open the Internet site, Operation aborted)</span><br /><br />因為其他套用 MasterPage 的頁面沒事，所以我很肯定是 content page 暴走了。原本猜測是在 content page
中不可以動態註冊 JavaScript、或是在 content page 不給動態註冊 jQuery，但是測試了以下的語法，都是可行的：<br /><span style="color: #008000;">　　' 測試 JavaScript 可否動態註冊</span><br /><span style="color: #0000ff;">　　ScriptManager.RegisterStartupScript(Me, Me.GetType(), "jsalert", "<span style="color: #800000;">alert('123');</span>", True)</span><br /><span style="color: #008000;">　　' 測試 jQuery 語法可否動態註冊</span><br /><span style="color: #0000ff;">　　ScriptManager.RegisterStartupScript(Me, Me.GetType(), "jqalert", "<span style="color: #800000;">$('.myitem').text('123');</span>", True)</span><br /><br />既然最大的原因排除掉了，那嫌疑就落到 jQuery Impromptu 上面了。原本以為是這個 plug-in 有
Bug，但是找了很久都找不到相關的文件。後來拿錯誤訊息搜尋，剛好看到有人在 ExtJS 遇到<a href="http://blog.xuite.net/joehwang1/IT/14610347" target="_blank">一樣的問題</a>，心想這幾個 library
感覺在跑的模式還滿像，就試著把 $(document).ready() 從 MasterPage 移掉、挪進 content page 裡動態註冊。<br /><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim <span style="color: #800000;">sb </span>As StringBuilder = New StringBuilder<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000;">sb</span>.Append(<span style="color: #ff6600;">"$(document).ready(function() {"</span> + vbCrLf)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000;">sb</span>.Append(<span style="color: #ff6600;">"$.prompt('test')"</span> + vbCrLf)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000;">sb</span>.Append(<span style="color: #ff6600;">"});"</span> + vbCrLf)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScriptManager.RegisterStartupScript(Me, Me.GetType(), "jsalert", <span style="color: #800000;">sb</span>.ToString(), True)</span><br /><br />結果就好了，看來是 DOM 沒有載入完全我就召喚 Impromptu 出現的問題。 =_=#<br /><br />原本設計時的想法是 $(document).ready() 要做的事是固定的，所以就把它放在 MasterPage 裡了。看來還得考慮到其他物件產生的時機點啊。</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/23308877">(Read More...)</a></div>]]></content>
    <category term="jQuery"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/23308877#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/23281141</id>
    <title><![CDATA[[Misc.] Plurk GTalk Bot 語法]]></title>
    <updated>2009-02-28T20:28:55+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/23281141"/>
    <summary><![CDATA[在噗浪的「我的帳戶」裡，可以設定即時通訊，就可以透過 IM 來接收通知、發佈 plurk。就我所知，噗浪支援的 IM 軟體有 Google Talk 和 MSN，不過我習慣用 Google Talk。因為噗浪的 web 介面載入速度不錯，其實沒事也很少用 GTalk 發佈 plurk。不過最近有時會無故覺得很慢，載入速度變差的時候又手癢想噗一下，就會透過 GTalk。原本不知道可以透過 GTalk 回噗，老覺得看到 GTalk 傳來別人的回應、我卻得等好久才能連上 plurk 回應，感覺有點煩。煩久了就會認真找解決辦法了。嗯，原來用 GTalk 是這樣回的：每則 plurk 都會有專屬的編號（plurk 頁面網址的最後五個字，例如 a1b2c），在這個編號前加上井字號、在編號之後空個半形空白，再輸入要回覆的內容，就可以回文囉。例如，有一則噗的 plurk 頁面是這樣：　　http://www.plurk.com/p/a1b2c如果想要回應這則噗，那就打開 GTalk 上的 plurk bot 對話視窗，輸入：　　#a1b2c 今天天氣好好歐。這樣就可以回應在這則噗之後囉。Plurk GTalk bot 也支援直接在對話中輸入噗浪動詞 (Qualifier)。例如像這樣：　　說 今天天氣好好歐。當然啦，那些 **粗體**、*斜體*、__底線__、http:// (超連結) 之類的語法，在與 bot 的對話視窗裡也是可以直接輸入的。]]></summary>
    <content type="html"><![CDATA[在<a target="_blank" href="http://www.plurk.com">噗浪</a>的「我的帳戶」裡，可以設定即時通訊，就可以透過 IM 來接收通知、發佈 plurk。就我所知，噗浪支援的 IM 軟體有 Google Talk 和 MSN，不過我習慣用 Google Talk。<br /><br />因為噗浪的 web 介面載入速度不錯，其實沒事也很少用 GTalk 發佈 plurk。不過最近有時會無故覺得很慢，載入速度變差的時候又手癢想噗一下，就會透過 GTalk。原本不知道可以透過 GTalk 回噗，老覺得看到 GTalk 傳來別人的回應、我卻得等好久才能連上 plurk 回應，感覺有點煩。<br /><br />煩久了就會認真找解決辦法了。嗯，原來用 GTalk 是這樣回的：每則 plurk 都會有專屬的編號（plurk 頁面網址的最後五個字，例如 a1b2c），在這個編號前加上井字號、在編號之後空個半形空白，再輸入要回覆的內容，就可以回文囉。<br /><br /><br /><br />例如，有一則噗的 plurk 頁面是這樣：<br />　　<font color="#000099"><b>http://www.plurk.com/p/<font color="#990000">a1b2c</font></b></font><br /><br />如果想要回應這則噗，那就打開 GTalk 上的 plurk bot 對話視窗，輸入：<br />　　<font color="#666666"><b><font color="#cc0000">#a1b2c</font> 今天天氣好好歐。</b></font><br /><br />這樣就可以回應在這則噗之後囉。<br /><br /><br /><br />Plurk GTalk bot 也支援直接在對話中輸入噗浪動詞 (Qualifier)。例如像這樣：<br />　　<b><font color="#666666"><font color="#cc0000">說</font> 今天天氣好好歐。</font></b><br /><br />當然啦，那些 <font color="#3333ff"><b>**粗體**</b></font>、<font color="#009900"><i><b>*斜體*</b></i></font>、<font color="#cc6600"><u><b>__底線__</b></u></font>、<font color="#660000"><b>http:// (超連結)</b></font> 之類的語法，在與 bot 的對話視窗裡也是可以直接輸入的。<br /><br /><br /><br /><br /><br /><br /><div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=b68ff587-1698-48f5-81c6-1f3439c27d38" /></div>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/23281141">(Read More...)</a></div>]]></content>
    <category term="No Category"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/23281141#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/23280937</id>
    <title><![CDATA[[LaTeX]設定文獻格式的套件：natbib]]></title>
    <updated>2009-02-28T19:57:25+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/23280937"/>
    <summary><![CDATA[需要完整的說明文件的話，請參考這邊：http://ftp.twaren.net/Unix/TeX/CTAN/macros/latex/contrib/natbib/natbib.pdf。使用時在文檔的開始要先引入這個套件。語法是「\usepackage[...]{natbib}」，其中，中括號內可以使用的設定有以下幾種：(1) 文章內引用時的樣式，例如：「Alice (2009) 曾提出……」，或是「Alice [1] 曾提出……」round&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 圓括號(預設值)square&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方括號curly&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大括號({}, curly braces)angle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 角括號(&lt;&gt;, angle brackets)(2) 多筆文獻之間的分隔符號，例如：「學者 [1, 2, 3] 提出……」，或是「學者 [1; 2; 3] 提出……」semicolon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分號分隔多筆文獻(預設值)colon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 冒號分隔comma&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 逗點分隔(3) 文獻的格式，例如：「學者 [1, 2, 3] 提出……」，或是「學者 (Alice, 2009; Bob, 2008) 提出……」authoryear&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; author-year citations(預設值)numbers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; numerical citationssuper&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上標型 numerical citationssort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 排序同時引用的多筆文獻(4,2,8,3 -&gt; 2,3,4,8)sort&amp;compress&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 類似 sort ，但又加上壓縮功能(4,2,8,3 -&gt; 2-4,8)compress&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 對已排序的文獻條目才有壓縮作用nonamebreak&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 保障作者的名字在引用時不會被斷行依引用的方式不同，也有不一樣的寫法。（藍色字為範例）(1) \citep&nbsp; 引用作者與年份(author, year)(Alice, 2009)(2) \citet&nbsp; 直接引用author (year)Alice (2009)(3) \citeauthor 引用作者author&nbsp;&nbsp;&nbsp; - 多人作者的引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \citeauthor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Alice et al.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \citeauthor* 或 \citefullauthor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Alice, Bob, and Cyril(4) \citeyear&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用年份yearAlice(5) \citeyearpar&nbsp;&nbsp;&nbsp; 引用年份(加括號)(year)(2009)]]></summary>
    <content type="html"><![CDATA[需要完整的說明文件的話，請參考這邊：<a href="http://ftp.twaren.net/Unix/TeX/CTAN/macros/latex/contrib/natbib/natbib.pdf" target="_blank">http://ftp.twaren.net/Unix/TeX/CTAN/macros/latex/contrib/natbib/natbib.pdf</a>。<br /><br /><br /><br />使用時在文檔的開始要先引入這個套件。語法是「<font color="#990000"><b>\usepackage<font color="#6600cc">[<font color="#666666">...</font>]</font>{natbib}</b></font>」，其中，中括號內可以使用的設定有以下幾種：<br /><br /><b><font color="#006600">(1)</font></b> <b>文章內引用時的樣式</b>，<font color="#666666">例如：「Alice (2009) 曾提出……」，或是「Alice [1] 曾提出……」</font><br />round&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 圓括號(預設值)<br />square&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方括號<br />curly&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大括號({}, curly braces)<br />angle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 角括號(&lt;&gt;, angle brackets)<br /><br /><b><font color="#006600">(2)</font></b> <b>多筆文獻之間的分隔符號</b>，<font color="#666666">例如：「學者 [1, 2, 3] 提出……」，或是「學者 [1; 2; 3] 提出……」</font><br />semicolon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分號分隔多筆文獻(預設值)<br />colon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 冒號分隔<br />comma&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 逗點分隔<br /><br /><b><font color="#006600">(3)</font></b> <b>文獻的格式</b>，<font color="#666666">例如：「學者 [1, 2, 3] 提出……」，或是「學者 (Alice, 2009; Bob, 2008) 提出……」</font><br />authoryear&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; author-year citations(預設值)<br />numbers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; numerical citations<br />super&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上標型 numerical citations<br />sort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 排序同時引用的多筆文獻(4,2,8,3 -&gt; 2,3,4,8)<br />sort&amp;compress&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 類似 sort ，但又加上壓縮功能(4,2,8,3 -&gt; 2-4,8)<br />compress&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 對已排序的文獻條目才有壓縮作用<br />nonamebreak&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 保障作者的名字在引用時不會被斷行<br /><br /><br /><br />依引用的方式不同，也有不一樣的寫法。（藍色字為範例）<br /><br /><b><font color="#006600">(1)</font></b> <b>\citep</b>&nbsp; 引用作者與年份<br />(author, year)<br /><font color="#000099">(Alice, 2009)</font><br /><br /><b><font color="#006600">(2)</font></b> <b>\citet</b>&nbsp; 直接引用<br />author (year)<br /><font color="#000099">Alice (2009)</font><br /><br /><b><font color="#006600">(3)</font></b> <b>\citeauthor</b> 引用作者<br />author<br />&nbsp;&nbsp;&nbsp; - 多人作者的引用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \citeauthor<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#000099">Alice et al.</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \citeauthor* 或 \citefullauthor<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#000099">Alice, Bob, and Cyril</font><br /><br /><b><font color="#006600">(4)</font></b> <b>\citeyear</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用年份<br />year<br /><font color="#000099">Alice</font><br /><br /><b><font color="#006600">(5)</font></b> <b>\citeyearpar</b>&nbsp;&nbsp;&nbsp; 引用年份(加括號)<br />(year)<br /><font color="#000099">(2009)</font><br /><br /><div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=24df089d-04f5-491d-a854-925097c71394" /></div>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/23280937">(Read More...)</a></div>]]></content>
    <category term="LaTeX"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/23280937#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/23200665</id>
    <title><![CDATA[[Misc.] 所見即所得的線上文字編輯器：TinyMCE]]></title>
    <updated>2009-02-19T22:35:52+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/23200665"/>
    <summary><![CDATA[在官網下載主程式後解壓縮，我抓下來玩的版本是 Main Package，以下以解壓縮到 C:\tinymce 資料夾為例。解壓縮後就可以打開裡面的 example 資料夾的 index.html，試看看能不能正常操作 TinyMCE。在操作過程會發現，所有的提示文字都是英文的，如果需要可以再做中文化設定。如果要做中文化，得先抓繁體中文的語系設定檔。別的 blog 多半都說要抓 "zh_tw_utf8"
這個語系檔，但是我在官網找很久都沒有看到，"Chinese" 抓下來是簡體中文的，後來才在官網的附設討論區裡得知要找 "Twi"
這一個下載。下載語系設定檔解壓縮後，放到剛才的主程式放置相關 javascript
的資料夾裡，以我的情況就是放在C:\tinymce\jscripts\tiny_mce 啦。另外，在TinyMCE的初始化函式裡要加入語系設定，例如：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tinyMCE.init({&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // General options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode : "textareas",&nbsp;&nbsp;&nbsp;&nbsp; // 表示對所有 Textarea 元素都套用 TinyMCE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; language : "tw"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 表示指定繁體中文語系，TinyMCE 會在資料夾下搜尋檔名為 tw*.js 的語系檔&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });如果要在 ASP.net 裡引用，要指給特定的 textbox，由於在 ASP.net 中會循結構自動產生物件 ID，無法直接設定
elements 的值，因此若是要將 TextBox1 加上 TinyMCE、又擔心 TextBox1 的 ID 會隨程式結構變化（尤其是有使用到 MasterPage 的時候），可以利用物件的 ClientID 屬性取得它在編譯為 HTML 之後的 ID，像這樣寫：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tinyMCE.init(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode : "exact",&nbsp;&nbsp;&nbsp;&nbsp; // 表示對特定元素指定套用 TinyMCE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elements: "&lt;%=TextBox1.ClientID%&gt;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt; -----------------相關學習資源：TinyMCE中文手冊（簡體中文）]]></summary>
    <content type="html"><![CDATA[<p>在官網<a href="http://tinymce.moxiecode.com/download.php" target="_blank">下載主程式</a>後解壓縮，我抓下來玩的版本是 Main Package，以下以解壓縮到 C:\tinymce 資料夾為例。<br /><br />解壓縮後就可以打開裡面的 example 資料夾的 index.html，試看看能不能正常操作 TinyMCE。在操作過程會發現，所有的提示文字都是英文的，如果需要可以再做中文化設定。<br /><br />如果要做中文化，得先抓繁體中文的語系設定檔。別的 blog 多半都說要抓 "zh_tw_utf8"
這個語系檔，但是我在官網找很久都沒有看到，"Chinese" 抓下來是簡體中文的，後來才在官網的附設討論區裡得知要找 "Twi"
這一個下載。<br /><br />下載語系設定檔解壓縮後，放到剛才的主程式放置相關 javascript
的資料夾裡，以我的情況就是放在C:\tinymce\jscripts\tiny_mce 啦。<br /><br />另外，在TinyMCE的初始化函式裡要加入語系設定，例如：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">tinyMCE.init({<br /></span><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;"><span style="color: #008000;">// General options</span><br /></span><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;"><span style="color: #800080;">mode :</span> "textareas",&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000;">// 表示對所有 Textarea 元素都套用 TinyMCE</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800080;">language :</span> "tw"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;"> // 表示指定繁體中文語系，TinyMCE 會在資料夾下搜尋檔名為 tw*.js 的語系檔</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">});</span><br /><br />如果要在 ASP.net 裡引用，要指給特定的 textbox，由於在 ASP.net 中會循結構自動產生物件 ID，無法直接設定
elements 的值，因此若是要將 TextBox1 加上 TinyMCE、又擔心 TextBox1 的 ID 會隨程式結構變化（尤其是有使用到 MasterPage 的時候），可以利用物件的 ClientID 屬性取得它在編譯為 HTML 之後的 ID，像這樣寫：<br /><span style="color: #808080;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">tinyMCE.init(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800080;">mode :</span> "exact",&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;"> // 表示對特定元素指定套用 TinyMCE</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800080;">elements:</span> "<strong><span style="color: #ff0000;">&lt;%=TextBox1.ClientID%&gt;</span></strong>"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt; </span><br /><br /><br /><br />-----------------<br />相關學習資源：<br /><a href="http://www.inpeck.com/TinyMceManual/" target="_blank">TinyMCE中文手冊</a>（簡體中文）<br /></p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/23200665">(Read More...)</a></div>]]></content>
    <category term="No Category"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/23200665#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/23132368</id>
    <title><![CDATA[[VBA] 自訂函式：取得檔案最後修改時間]]></title>
    <updated>2009-02-10T23:23:14+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/23132368"/>
    <summary><![CDATA[寫了一個自訂函數，負責取得活頁簿（XLS 檔）最後存檔時間。設計的時候考慮到自訂函數是不會自動更新的，因此在用的時候輸入 TODAY()、NOW() 之類會經常自動計算的函數，整個活頁簿中有異動的時候，這個函數也就會因為它裡頭包的內容異動了而跟著執行一次。今天一開始在 Excel 2007，還一度找不到要去哪裡編輯 VBA，好險有快速鍵：Alt-F11。打開一個 Excel 檔案，按下 Alt-F11 叫出 Visual Basic 編輯器，左手邊「專案」視窗中，會看到目前開啟的 Excel 檔案這個專案底下掛了哪些東西。在「專案」視窗按滑鼠右鍵&rarr;「插入」&rarr;「模組」，就可以開始編輯以下程式碼了。' 利用傳入 Today() 函數的值，讓自訂函數能和 Today() 函數一樣經常重新計算' 函數名稱：EDITTIME' 傳入值型態：日期Function EDITTIME(filedate As Date)&nbsp;&nbsp;&nbsp; ' 從現在開啟的這個 Excel 檔案 (ThisWorkbook) 的屬性，&nbsp;&nbsp;&nbsp; ' 取得此檔案的 BuiltinDocumentProperties 屬性值中的「Last Save Time（上次修改時間）」，&nbsp;&nbsp;&nbsp; EDITTIME = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")&nbsp;&nbsp;&nbsp; ' 也可以利用這個屬性取得上次列印日期 (Last Print Date)、最後編輯者 (Last Author) 等等檔案資訊
End Function寫好馬上就可以用了，使用的時候不需要執行編譯，就只要在儲存格裡輸入=EDITTIME(TODAY())，儲存格內容就會出現程式裡指定回傳的檔案最後存檔時間。如果時間以數值方式顯示，請對該儲存格按右鍵&rarr;「儲存格格式」，在「數值」頁籤利用自訂來改變 Date 顯示的樣式。像我就設成「yyyy/mm/dd hh:mm:ss AM/PM」。此外，除了利用 BuiltinDocumentProperties 這個屬性取得檔案最後存檔時間，也可以利用 FileDateTime 函數加上檔案路徑取得你的檔案建立或修改時間。因此可以改寫成這樣：' 利用 FileDateTime(filepath) 取出檔案最後存檔時間Function EDITTIME(filedate As Date)&nbsp;&nbsp;&nbsp; EDITTIME = FileDateTime(ActiveWorkbook.Path)End Function如果你寫的自訂函數不會自動更新，你也可以按 Ctrl-Alt-F9 手動重新計算整本活頁簿中的值。不過想想又覺得我這種做法好像有點怪，找了一下，在這個討論串中看到「揮發性函數」的說法，於是又試著加入了 Application.Volatile 改寫原來的函數：' 函數名稱：EDITTIME' 傳入值：無Function EDITTIME()&nbsp;&nbsp;&nbsp; Application.Volatile&nbsp;&nbsp;&nbsp; ' 傳入檔案路徑，取得該檔案的建立或最後修改時間&nbsp;&nbsp;&nbsp; EDITTIME = FileDateTime(ActiveWorkbook.Path)End Function使用的時候就只要在儲存格裡輸入：「=EDITTIME()」，就可以了。現在，編輯工作表中任意儲存格，EDITTIME() 也會自動更新囉！]]></summary>
    <content type="html"><![CDATA[<p>寫了一個自訂函數，負責取得活頁簿（XLS 檔）最後存檔時間。<br /><br />設計的時候考慮到自訂函數是不會自動更新的，因此在用的時候輸入 TODAY()、NOW() 之類會經常自動計算的函數，整個活頁簿中有異動的時候，這個函數也就會因為它裡頭包的內容異動了而跟著執行一次。<br /><br />今天一開始在 Excel 2007，還一度找不到要去哪裡編輯 VBA，好險有快速鍵：Alt-F11。打開一個 Excel 檔案，按下 Alt-F11 叫出 Visual Basic 編輯器，左手邊「專案」視窗中，會看到目前開啟的 Excel 檔案這個專案底下掛了哪些東西。在「專案」視窗按滑鼠右鍵&rarr;「插入」&rarr;「模組」，就可以開始編輯以下程式碼了。<br /><br /><span style="color: #008000;">' 利用傳入 Today() 函數的值，讓自訂函數能和 Today() 函數一樣經常重新計算<br />' 函數名稱：EDITTIME<br />' 傳入值型態：日期</span><strong><br />Function <span style="color: #0000ff;">EDITTIME(</span>filedate As Date<span style="color: #0000ff;">)</span><br /></strong><span style="color: #008000;">&nbsp;&nbsp;&nbsp; ' 從現在開啟的這個 Excel 檔案 (ThisWorkbook) 的屬性，<br />&nbsp;&nbsp;&nbsp; ' 取得此檔案的 BuiltinDocumentProperties 屬性值中的「Last Save Time（上次修改時間）」，<br /></span><strong>&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">EDITTIME </span>= ThisWorkbook.BuiltinDocumentProperties("Last Save Time")<br /></strong><span style="color: #008000;">&nbsp;&nbsp;&nbsp; ' 也可以利用這個屬性取得上次列印日期 (Last Print Date)、最後編輯者 (Last Author) 等等檔案資訊</span><strong><br />
</strong><strong>End Function</strong><br /><br /><br />寫好馬上就可以用了，使用的時候不需要執行編譯，就只要在儲存格裡輸入<span style="color: #0000ff;"><strong>=EDITTIME(TODAY())</strong></span>，儲存格內容就會出現程式裡指定回傳的檔案最後存檔時間。如果時間以數值方式顯示，請對該儲存格按右鍵&rarr;「儲存格格式」，在「數值」頁籤利用自訂來改變 Date 顯示的樣式。像我就設成「yyyy/mm/dd hh:mm:ss AM/PM」。<br /><br /><br /><br />此外，除了利用 BuiltinDocumentProperties 這個屬性取得檔案最後存檔時間，也可以利用 FileDateTime 函數加上檔案路徑取得你的檔案建立或修改時間。因此可以改寫成這樣：<br /><br /><span style="color: #008000;">' 利用 FileDateTime(filepath) 取出檔案最後存檔時間</span><br /><strong>Function <span style="color: #0000ff;">EDITTIME(</span>filedate As Date<span style="color: #0000ff;">)</span><br /></strong><strong>&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">EDITTIME </span>= </strong><strong>FileDateTime(ActiveWorkbook.Path)</strong><br /><strong>End Function</strong><br /><br /><br />如果你寫的自訂函數不會自動更新，你也可以按 Ctrl-Alt-F9 手動重新計算整本活頁簿中的值。<br /><br /><br /><br />不過想想又覺得我這種做法好像有點怪，找了一下，在<a href="http://gb.twbts.com/index.php/topic,1338.0.html" target="_blank">這個討論串</a>中看到「揮發性函數」的說法，於是又試著加入了 Application.Volatile 改寫原來的函數：<br /><br /><span style="color: #008000;">' 函數名稱：</span><span style="color: #008000;">EDITTIME</span><br /><span style="color: #008000;">' 傳入值：無</span><br /><strong>Function </strong><span style="color: #0000ff;"><strong>EDITTIME</strong></span><strong><span style="color: #0000ff;">()</span><br />&nbsp;&nbsp;&nbsp; Application.Volatile<br /></strong><span style="color: #008000;">&nbsp;&nbsp;&nbsp; ' 傳入檔案路徑，取得該檔案的建立或最後修改時間</span><br /><strong>&nbsp;&nbsp;&nbsp; </strong><strong><span style="color: #0000ff;">EDITTIME </span></strong><strong>= FileDateTime(ActiveWorkbook.Path)<br />End Function</strong><br /><br />使用的時候就只要在儲存格裡輸入：「=EDITTIME()」，就可以了。現在，編輯工作表中任意儲存格，EDITTIME() 也會自動更新囉！</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/23132368">(Read More...)</a></div>]]></content>
    <category term="Windows"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/23132368#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/23117283</id>
    <title><![CDATA[[Win] IIS 網站啟動時出現「發生未預期的錯誤 (0x8ffe2740)」]]></title>
    <updated>2009-02-09T00:04:56+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/23117283"/>
    <summary><![CDATA[抓了 Ext-JS SDK 下來研究，但是連文件都打不開。後來在《掏錢學 ExtJS》裡看到，原來得把Ext-JS 的文件放在 IIS 之類的服務器上面跑。可是把整個 Ext-JS 解壓縮後放到 Inetpub\wwwroot，在瀏覽器輸入 http://localhost/Ext-JS/docs/index.html 卻仍是空白一片。猜想可能是 IIS 設定值得改一下，打開 IIS 卻看到網站被停用了，重新啟動卻出現「發生未預期的錯誤 (0x8ffe2740)」。Google 後第一個結果就說是和 Skype 衝到了，要改 port。因為夜深了，實在是懶得動，就直接把執行中的 Skype 結束掉，這時再重新啟動網站，就沒事了。怎麼會這樣啊&hellip;&hellip;--------------------------(2009/02/09 update)後來發現到更方便的看 Ext JS 文件的方法：裝 Adobe AIR。先到 Adobe 官網下載安裝 Adobe AIR。因為 Ext JS 有提供 AIR 版本的文件，所以可以到 Ext JS Download 下載 "Ext JS 2.2 API Documentation"。Ext JS API Documentation 下載完成後，直接點兩下就可以安裝。（如果系統不認識 .air 這個檔案類型，請確定你有沒有安裝 Adobe AIR 了，沒有的話請到 Adobe 官網下載安裝）安裝完成以後，Ext JS API Documentation 就是一個桌面軟體，在桌面上會有捷徑，點兩下就可以在 Adobe AIR 看文件囉。由於 Adobe AIR 的系統需求中不包括 IIS or Apache...etc.，看來這樣就不需要安裝 IIS 或 Apache、也能進入 Ext JS 的世界啦。]]></summary>
    <content type="html"><![CDATA[<p>抓了 <a href="http://extjs.com/products/extjs/download.php" target="_blank">Ext-JS SDK</a> 下來研究，但是連文件都打不開。後來在《掏錢學 ExtJS》裡看到，原來得把Ext-JS 的文件放在 IIS 之類的服務器上面跑。<br /><br />可是把整個 Ext-JS 解壓縮後放到 Inetpub\wwwroot，在瀏覽器輸入 http://localhost/Ext-JS/docs/index.html 卻仍是空白一片。猜想可能是 IIS 設定值得改一下，打開 IIS 卻看到網站被停用了，重新啟動卻出現「發生未預期的錯誤 (0x8ffe2740)」。<br /><br />Google 後第一個結果就說是和 Skype 衝到了，要改 port。因為夜深了，實在是懶得動，就直接把執行中的 Skype 結束掉，這時再重新啟動網站，就沒事了。怎麼會這樣啊&hellip;&hellip;<br /><br /><br /><br /><br /><br />--------------------------<br />(2009/02/09 update)<br />後來發現到更方便的看 Ext JS 文件的方法：裝 Adobe AIR。先到 Adobe 官網下載安裝 <a href="http://www.adobe.com/tw/products/air/" target="_blank">Adobe AIR</a>。<br /><br />因為 Ext JS 有提供 AIR 版本的文件，所以可以到 <a href="http://extjs.com/products/extjs/download.php" target="_blank">Ext JS Download</a> 下載 <a href="http://extjs.com/products/extjs/download.php?dl=extjs22-docs" target="_blank">"Ext JS 2.2 API Documentation"</a>。<br /><br />Ext JS API Documentation 下載完成後，直接點兩下就可以安裝。（如果系統不認識 .air 這個檔案類型，請確定你有沒有安裝 Adobe AIR 了，沒有的話請到 Adobe 官網下載安裝）<br /><br />安裝完成以後，Ext JS API Documentation 就是一個桌面軟體，在桌面上會有捷徑，點兩下就可以在 Adobe AIR 看文件囉。由於 Adobe AIR 的<a href="http://www.adobe.com/tw/products/air/systemreqs/" target="_blank">系統需求</a>中不包括 IIS or Apache...etc.，看來這樣就不需要安裝 IIS 或 Apache、也能進入 Ext JS 的世界啦。</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/23117283">(Read More...)</a></div>]]></content>
    <category term="Windows"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/23117283#comments</wfw:comment>
  </entry>
  <entry xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <id>http://fannys23.pixnet.net/blog/post/22935695</id>
    <title><![CDATA[jQuery新手上路。Day #2: 搭配 UpdatePanel]]></title>
    <updated>2009-01-16T21:19:00+08:00</updated>
    <link rel="alternate" href="http://fannys23.pixnet.net/blog/post/22935695"/>
    <summary><![CDATA[學了一下 jQuery 就躍躍欲試的把它用在目前的系統裡。系統是 ASP.net 開發的，有一個功能是使用者變更密碼，當使用者輸入密碼時要檢查使用者密碼強度。不過問題出現了，按下了「確定修改」的按鈕後，postback 回到原頁面後，以下這段檢查密碼的 jQuery 就不肯動了。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jQuery(document).ready(function() {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $j('#txt_NewPass').keyup(function(){&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $j('#result').html(passwordStrength($j('#txt_NewPass').val(),$j('#txt_OldPass').val()));&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });
找了很久，才發現到是因為網頁中有一塊 updatepanel，裡面放了 CustomValidator，如果使用者沒有輸入正確格式的密碼，就會回到原頁面顯示訊息。因此，按下「確定修改」後，會先檢查僅有 updatepanel 的部分更新，此時整個網頁並沒有 reload，因此無法觸發 jQuery(document).ready() 這一部分的程式。於是下了關鍵字 "jquery ready 事件 updatepanel" 查了一下，得到這一篇《ASP.NET AJAX Advance Tips &amp; Tricks (5) UpdatePanel 與 jQuery》。修改後的程式變成這樣，把密碼檢查的部分抽出來寫成一支 function，頁面載入時執行一次。
&nbsp;&nbsp;&nbsp; &lt;script language="javascript"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jQuery(document).ready(function() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; passwdCheck();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function passwdCheck(){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var $j = jQuery.noConflict();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $j('#txt_NewPass').keyup(function(){&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $j('#result').html(passwordStrength($j('#txt_NewPass').val(),$j('#txt_OldPass').val()));&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &lt;/script&gt;
另外為了讓按下「確認送出」後 postback 回原頁面時也能觸發檢查密碼的函式，在網頁上 ScriptManager 之後也做設定，讓 postback 後能觸發密碼檢查函式。
&nbsp;&nbsp;&nbsp; &lt;asp:ScriptManager ID="ScriptManager1" runat="server" /&gt;&nbsp;&nbsp;&nbsp; &lt;script language="javascript"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Sys.WebForms.PageRequestManager.getInstance().add_endRequest(passwdCheck);&nbsp;&nbsp;&nbsp; &lt;/script&gt;
會寫在 ScriptManager 之後是因為，此時 Sys 物件才產生。如果把這一行和前述的 jQuery 函式一起寫在頁首，會因為 Sys 物件未產生而出現錯誤訊息「Sys 未定義」。
&nbsp;
&nbsp;]]></summary>
    <content type="html"><![CDATA[<p>學了一下 jQuery 就躍躍欲試的把它用在目前的系統裡。系統是 ASP.net 開發的，有一個功能是使用者變更密碼，當使用者輸入密碼時要檢查使用者密碼強度。不過問題出現了，按下了「確定修改」的按鈕後，postback 回到原頁面後，以下這段檢查密碼的 jQuery 就不肯動了。<br /></p>
<blockquote>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jQuery(document).ready(function() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $j('#txt_NewPass').keyup(function(){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $j('#result').html(passwordStrength($j('#txt_NewPass').val(),$j('#txt_OldPass').val()));<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });</blockquote>
<p><br /><br />找了很久，才發現到是因為網頁中有一塊 updatepanel，裡面放了 CustomValidator，如果使用者沒有輸入正確格式的密碼，就會回到原頁面顯示訊息。因此，按下「確定修改」後，會先檢查僅有 updatepanel 的部分更新，此時整個網頁並沒有 reload，因此無法觸發 jQuery(document).ready() 這一部分的程式。<br /><br />於是下了關鍵字 "jquery ready 事件 updatepanel" 查了一下，得到這一篇<a href="http://www.cnblogs.com/blodfox777/archive/2008/12/08/1347805.html" target="_blank">《ASP.NET AJAX Advance Tips &amp; Tricks (5) UpdatePanel 與 jQuery》</a>。<br /><br />修改後的程式變成這樣，把密碼檢查的部分抽出來寫成一支 function，頁面載入時執行一次。</p>
<blockquote>&nbsp;&nbsp;&nbsp; &lt;script language="javascript"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jQuery(document).ready(function() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; passwdCheck();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function passwdCheck(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var $j = jQuery.noConflict();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $j('#txt_NewPass').keyup(function(){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $j('#result').html(passwordStrength($j('#txt_NewPass').val(),$j('#txt_OldPass').val()));<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &lt;/script&gt;</blockquote>
<p><br /><br />另外為了讓按下「確認送出」後 postback 回原頁面時也能觸發檢查密碼的函式，在網頁上 ScriptManager 之後也做設定，讓 postback 後能觸發密碼檢查函式。</p>
<blockquote>&nbsp;&nbsp;&nbsp; &lt;asp:ScriptManager ID="ScriptManager1" runat="server" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;script language="javascript"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Sys.WebForms.PageRequestManager.getInstance().add_endRequest(passwdCheck);<br />&nbsp;&nbsp;&nbsp; &lt;/script&gt;</blockquote>
<p><br /><br />會寫在 ScriptManager 之後是因為，此時 Sys 物件才產生。如果把這一行和前述的 jQuery 函式一起寫在頁首，會因為 Sys 物件未產生而出現錯誤訊息「Sys 未定義」。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>  <div class="more"><a href="http://fannys23.pixnet.net/blog/post/22935695">(Read More...)</a></div>]]></content>
    <category term="jQuery"/>
    <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fannys23.pixnet.net/blog/post/22935695#comments</wfw:comment>
  </entry>
</feed>
