tag:blogger.com,1999:blog-67582600419263809092024-03-19T16:48:32.209+08:00Sean's BlogAll of Sean‧All for YouSean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.comBlogger23125tag:blogger.com,1999:blog-6758260041926380909.post-17834887923480556342015-08-10T03:18:00.002+08:002015-08-10T03:18:44.235+08:00應用程式沒有 http 服務也可以用 oauth2 <br />
oauth2 使用者同意受權你的應用程式後,一般都導回參數 redirect_uri 指定的網址, 並把 code 帶進去。
如果你的應用程式(傳統程式、非網頁) 懶得做 http 服務,也可以這樣玩...<br />
<a href="http://2.bp.blogspot.com/-buJdhF8FzD0/VcenRY5-H2I/AAAAAAAAHE8/TTHCJoOMmvY/s1600/oauth2.png" imageanchor="1"><img border="0" src="http://2.bp.blogspot.com/-buJdhF8FzD0/VcenRY5-H2I/AAAAAAAAHE8/TTHCJoOMmvY/s1600/oauth2.png" /></a><br />
<br />
叫 User 自己把 code 貼到你的程式上,然後程式再拿這個 code 去要 access token。
Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com4tag:blogger.com,1999:blog-6758260041926380909.post-54018046928457327722012-10-08T15:08:00.002+08:002012-10-08T15:08:16.934+08:00IIS 的 URL Rewrite 使用: 規則運算式<img align="right" border="0" src="http://3.bp.blogspot.com/-x0w9mV3j6VM/UHJ6vnPiRdI/AAAAAAAAGV8/_EvS4HTDKoI/s1600/1.png" /><br />
假設請求網址為 http://www.domain.com.tw/dir/search.aspx?user=sean<br />
<br />
這算是自己的筆記吧! IIS 的 URL Rewrite 很好用,但想設定的人可能一頭霧水。Regular Expression 的 Pattern 是要從 http:// 開始、或是 www. 開始、或是 /dir 或 dir 都沒有說明,
每次都會忘記,所以自己做個筆記。址尾是否包含 Query String 也沒說明。<br />
<br />
<br />
<b>結論:</b><br />
<br />
● 「模式:」填寫 Regular Expression Pattern,此例「^dir/search\.aspx$」是符合的。<br />
<br />
● 「重寫 URL:」用 {R:1} ~ 9 當回溯值(Back-reference; 也就是 RegExp 中的括弧順序)。<br />
<br />
● 勾「附加查詢字串」會把「?user=sean」加到「重寫 URL」尾端。<br />
<br />Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com7tag:blogger.com,1999:blog-6758260041926380909.post-11235069784933217502012-08-17T01:08:00.001+08:002012-08-17T14:28:53.707+08:00讓 YUI DataTable 使用 JSON Data Over XHR 時支援中文 field<div class="separator" style="clear: both; text-align: center;">
<a href="http://developer.yahoo.com/yui/2/" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;" target="_blank"><img border="0" src="http://4.bp.blogspot.com/-RlmEH5H2uCA/UC0orMitxjI/AAAAAAAAGTI/cpvzF0NaStk/s1600/yui.png" /></a></div>
<b><span style="font-size: large;">原由</span></b><br />
<br />
<a href="http://developer.yahoo.com/yui/2/" target="_blank">YUI </a>真是個好東西,最近拿它來寫公司的程式。<br />
天殺的! 不知以前是誰把資料庫欄位都用中文命名。<br />
我輸出 JSON 長這樣...<br />
<br />
<br />
<pre>
{
"ResultSet": {
"Result": [{
"ID": "1234",
"姓名": "林洵賢",
"電話": "1234567890"
... 省略
</pre>
<br />
話說當今瀏覽器 UTF8 編碼的頁面 JavaScript 運作起來是沒什麼問題。<br />
但 YUI 是外國人設計的,用它的 DataSource 抓資料後認為這些以中文為 key 的是壞東西會自動被忽略。<br />
<br />
<br />
<b><span style="font-size: large;">解決</span></b><br />
<br />
追程式囉! 我原本是用 DataTable 當然從它開始追,追到另一個模組 DataSource 找到了!<br />
我用的是 YUI 2.9 版,修改 \build\datasource\datasource*.js 原始程式,把<br />
<br />
<pre>[^\w\.\$@]
</pre>
<br />
改成<br />
<br />
<pre>[^\w\.\$@\u4e00-\u9fa5]
</pre>
<br />
就支援中文 key 了。<br />
<br />
<br />
或許這篇算是寫給自己的筆記,沒接觸過的應該看沒有。<br />
如果你不幸也在找同樣的解決方案 google 到我,那恭喜你囉,留個言吧!<br />
<br />
<br />
<b><span style="font-size: large;">後記</span></b><br />
後來發現欄位排序中文Key也有問題,要修改 datatable*.js 尋找 [^\w\-] 改為 [^\w\-\u4e00-\u9fa5] 即可。
Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com24tag:blogger.com,1999:blog-6758260041926380909.post-76235957053013423092011-08-02T00:22:00.003+08:002011-11-27T14:23:25.575+08:00IIS 7.5 Express 多重網站IIS 7.5 Express 支援多重網站嗎? 官方是不支援這樣的設定的。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-hpot5AGMgr8/TjbUBIDuwRI/AAAAAAAAF7I/f5BuE_Nk5qk/s1600/IIS-Express-Web-Server.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-hpot5AGMgr8/TjbUBIDuwRI/AAAAAAAAF7I/f5BuE_Nk5qk/s1600/IIS-Express-Web-Server.jpg" /></a></div>微軟出的 IIS 7.5 Express 可以讓舊電腦(XP)安裝最新的IIS版本。想把 XP 內建的 IIS 換成 IIS Express 要有些心理準備。它沒有完整的 GUI 設定介面,所有設定都要用文字編輯器修改設定檔。啟動或停止網站服務也都要用命令列指令來完成。不過裝了它可以讓 XP 擁有如同伺服器最新 IIS 版本的所有功能。<br />
<br />
還有個缺點,一次只能只能啟動一個網站,即使設了多個也是只能選其中一個來啟動。畢竟它是設計來當開發用的測試環境。還好 IIS Express 內建 URL Rewrite 模組。有了 URL Rewrite 透過一些小技巧就可以把不同目錄模疑成支援多網站的IIS了。<br />
<br />
假設有兩個網域 www.aaa.com 及 www.bbb.com 的 IP 都指到這台電腦。如果想讓<br />
<br />
<ul><li>連到 http://<span class="Apple-style-span" style="color: blue;">www.aaa.com</span>/ 連到網站根目錄下的 /<span class="Apple-style-span" style="color: blue;">www.aaa.com</span>/</li>
<li>連到 http://<span class="Apple-style-span" style="color: red;">www.bbb.com</span>/ 連到網站根目錄下的 /<span class="Apple-style-span" style="color: red;">www.bbb.com</span>/</li>
</ul><br />
<br />
可以透過修改網站 web.config 檔 (沒有的話自行建立放置於網站根目錄)<br />
加入 URL Rewrite 的設定如下:<br />
<br />
<pre><?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rewriteMaps>
<rewriteMap name="site1" />
</rewriteMaps>
<rules>
<rule name="CanonicalHostNameRule1" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^(.+)$" />
</conditions>
<action type="Rewrite" url="{C:1}/{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
</pre><br />
如此一來感覺就像同時啟動兩個虛疑網站囉!<br />
<br />
有關 IIS Express 的安裝使用就請客位看官請自行 Google 一下吧!Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com7tag:blogger.com,1999:blog-6758260041926380909.post-42672259945541924612011-05-31T02:06:00.004+08:002011-05-31T13:00:38.328+08:00噗浪備份工具 v2Plurk Backup v2.0 Beta 1<br />
<br />
感謝大家愛用小弟寫的「噗浪備份工具」程式。平常都沒什麼人反映問題,以為沒人在用這程式。這幾天噗浪官網突然改變 Web 介面的一些東西,造成舊程式不能使用。向小弟反映的網友突然爆量,只好先趕出一個 Beta 版。因為沒什麼時間寫 GUI 介面,所以各位就先用這個版本頂著用吧!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-KjlvowwSBgM/TePcZ8ALa3I/AAAAAAAAFeU/x0HOdFYn2zU/s1600/pb.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="145" src="http://4.bp.blogspot.com/-KjlvowwSBgM/TePcZ8ALa3I/AAAAAAAAFeU/x0HOdFYn2zU/s400/pb.png" width="231" /></a></div>從這版開始改用官方 API 重新撰寫資料傳輸程式,我想下載速度應該比以前快。此外,這個版本改變抓資料時登入方式,將不再詢問密碼。如果您是「私密時間軸」的話,請把 <a href="http://www.plurk.com/pbu" TARGET ="_blank">http://www.plurk.com/pbu</a> 加入好友,備份完馬上刪除好友即可。<br />
<br />
<b><span class="Apple-style-span" style="color: red;">下載</span></b> PlurkBackup v2.0 (Beta2): <a href="https://sites.google.com/site/seanjsfile/pbscr/PlurkBackup2Beta2.zip?attredirects=0&d=1">PlurkBackup2Beta2.zip</a> (2.5MB)Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com60tag:blogger.com,1999:blog-6758260041926380909.post-51551999755220032972010-12-23T16:56:00.029+08:002011-11-15T15:08:47.540+08:00讓 Blogger 的「意見回應」可以有「作者回覆」 (最終版)<img align="left" src="http://3.bp.blogspot.com/_T8KAZQJUgOM/TRQZpXiT_GI/AAAAAAAAFOY/iyJtvYWu_gg/s1600/ar.jpg" /><br />
<br />
有很多網友反應【<a href="http://sean.o4u.com/2008/10/blogger.html">讓 Blogger 的意見回應可以有回覆</a>】那篇,使用 <a href="http://s.o4u.com/host/blog/ar.js">ar.js</a> 檔案需要有自己的 Web 空間,對於初階的網友有點難度。好人做到底,再做一個不用另找網站空間的教學。相信只要一步一步做都能成功的。<br />
<br />
<br />
<a name='more'></a><span class="Apple-style-span" style="font-size: large;"><b>一步一步來</b></span><br />
<br />
1. 進入 設計 → 修改 HTML。<br />
<br />
2. 勾「展開小裝置範本」。<br />
<br />
3. 搜尋「<b:includable id='comments' var='post'>」。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="http://2.bp.blogspot.com/_T8KAZQJUgOM/TRMLXDa8T1I/AAAAAAAAFOE/CD2r5YgKKjs/s1600/ar1.jpg" /></div><br />
<br />
4. 在它的下一行插入(貼上)下面的程式碼。<br />
<br />
<pre><b:if cond='data:post.allowComments'>
<script src='http://www.google.com/jsapi' type='text/javascript'/>
<script type='text/javascript'>
//<![CDATA[
google.setOnLoadCallback(initializeAuthorReply);
function initializeAuthorReply(){var a=document.getElementById("comments").getElementsByTagName("H4"),b=document.getElementById("comments").getElementsByTagName("A"),c="";if(document.getElementById("comment-editor-src"))c=document.getElementById("comment-editor-src").href.replace(/-iframe/,"");else for(i=0;i<b.length;i++)if(b[i].href.indexOf("/comment.g?")>0)c=b[i].href;var l=/\s*(.+)\s+?(?:\u63d0\u5230|said)/i,m=/^\s?<p[^>]*>\s?Re:\s*(.+?)\s*&lt;(\d+)&gt;<br\/?>((?:.|\n)+)<\/p>\s?$/i,n=/postID=(\d+)/,
d="",h="",e,f,g,j={},k=0;for(i=0;i<b.length;i++)if(b[i].href.indexOf("/delete-comment.g?")>0){d=n.test(b[i].href)?RegExp.$1:"";e=document.getElementById("c"+d);f=nextElement(e);g=nextElement(f);j["c"+d]=g;h=l.test(e.innerText)?RegExp.$1:"";if(h==PostAuthor&&m.test(f.innerHTML)){if(replyID=RegExp.$2,replyMsg=RegExp.$3,j["c"+replyID])j["c"+replyID].innerHTML+='<hr noshade size="1" color="#e0e0e0" /><div align="left" style="background-color: lightyellow; padding: 4px">\u25cf<b style="color: blue">\u4f5c\u8005\u56de\u8986</b>\uff1a'+
replyMsg+'<br/><div align="right" style="font-size:8pt; color:darkgray">'+g.innerText+"</div></div>",e.style.display="none",f.style.display="none",g.style.display="none"}else k++;d='<a href="'+c+"&postBody=Re%3A%20"+encodeURIComponent(h)+"%20%3C"+d+'%3E%0D%0A" style="font: 9pt Arial; color:#8a8a8a" title="\u56de\u8986\u610f\u898b">\u56de</a>';afterEndHtml(b[i],d)}a[0].innerHTML=a[0].innerHTML.replace(/\d+/,k)}
function replyEmbedComment(a,b){var c=c+="&postBody=Re:+"+encodeURIComponent(a)+"+<"+b+">";location.href=c}function afterEndHtml(a,b){if(a.insertAdjacentHTML)return a.insertAdjacentHTML("AfterEnd",b),a.nextSibling;var c=a.ownerDocument.createRange();c.setStartAfter(a);c=c.createContextualFragment(b);a.parentNode.insertBefore(c,a.nextSibling);return a.nextSibling}function nextElement(a){return a.nextElementSibling?a.nextElementSibling:a.nextSibling}
window.navigator.userAgent.toLowerCase().indexOf("msie")<0&&(HTMLElement.prototype.__defineGetter__("innerText",function(){for(var a="",b=this.childNodes,c=0;c<b.length;c++)b[c].nodeType==1?a+=b[c].innerText:b[c].nodeType==3&&(a+=b[c].nodeValue);return a}),HTMLElement.prototype.__defineSetter__("innerText",function(a){this.textContent=a}));function HTMLDecode(a){var b=document.createElement("div");b.innerHTML=a;return b.innerText||b.textContent};
//]]>
</script>
<script type='text/javascript'>var PostAuthor=HTMLDecode(&#39;<data:post.author/>&#39;);</script>
</b:if>
</pre><br />
5. 按 [儲存範本]。<br />
<br />
<br />
<span style="font-size: large;"><b>如何使用</b></span><br />
<br />
1. 在登入的狀態下,每篇留言都有一個「回」字。點下去就能「回覆」了。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="http://4.bp.blogspot.com/_T8KAZQJUgOM/TRMQ_YONu3I/AAAAAAAAFOM/78BbZgNmHkI/s1600/use1.jpg" /></div><br />
2. 回覆畫面第一行 Re: ... 不能刪掉唷,要從第二行開始打「回覆內容」。回覆完記得按下 [發表您的意見] 送出。<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="http://2.bp.blogspot.com/_T8KAZQJUgOM/TRMRKAcp-LI/AAAAAAAAFOQ/YdqPgm7tO0I/s1600/use2.jpg" /></div><br />
3. 如果回錯也可以刪掉重回。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><img border="0" src="http://2.bp.blogspot.com/_T8KAZQJUgOM/TRMRLlQOKBI/AAAAAAAAFOU/bVgftL1yxFc/s1600/use3.jpg" /></div><br />
<br />
<span style="font-size: large;"><b>進階使用者</b></span><br />
<br />
上面的程式碼為了減少 Size 經過 <a href="http://closure-compiler.appspot.com/">Closure Compiler</a> 編排已經亂掉了。會 JavaScript 的人可以下載 <a href="http://s.o4u.com/host/blog/ar.js">ar.js</a> 來修改或加強自己要的樣式風格。Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com112tag:blogger.com,1999:blog-6758260041926380909.post-17847135739788963772010-05-27T10:37:00.008+08:002011-04-10T03:24:21.296+08:00照片網誌小幫手 (Flickr to Blogger)<img border="0" src="http://3.bp.blogspot.com/_T8KAZQJUgOM/S_3ZiRnaURI/AAAAAAAAE6c/4p7NxLUGB5Y/s320/sample-blogger.png" align="right"/><br />
閒閒在家沒事幹,寫了一個網頁小程式。我稱它為「<b>照片網誌小幫手</b>」,它可以幫您把 Flickr 照片以相簿方式刊登在 Blogger 網誌。(<a href="http://flickr-logs.blogspot.com/2010/05/blog-post.html" target="_blank">效果展示</a>)<br />
<br />
它完全用 JavaScript 完成,沒有動用到 Server 端的程式。<br />
<br />
網址在 <a href="http://s.o4u.com/flog/">http://s.o4u.com/flog/</a><br />
<br />
大家來玩玩看吧!<br />
<br />
雖然 Flickr 雖然每個月都開放上傳空間,但是免費使用者在 Flickr 網頁上最多只可以瀏覽最後的 200 張照片。只要照片網址記得,Flickr 並不會擋住超過200張的照片。因此,結合了網誌的功能後,再也沒有 200 張照片的限制了。Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com29tag:blogger.com,1999:blog-6758260041926380909.post-63591894718478672232009-11-05T07:57:00.009+08:002011-05-31T02:11:12.756+08:00噗浪備份工具<b style="background-color: red;"><span class="Apple-style-span" style="color: white;">注意: 這是舊版程式,已無法下載噗浪了。請至新版頁面「<a href="http://sean.o4u.com/2011/05/v2.html">噗浪備份工具 v2</a>」。</span></b><br />
<br />
<img src="http://sites.google.com/site/seanjsfile/pbscr/PlurkBackup.png" /><br />
<br />
■ 程式版本:v1.1 (3/16/2010 更新)<br />
<br />
<span class="Apple-style-span" style="color: white;"><b><br />
</b></span><br />
<div><div><br />
噗浪 (http://www.plurk.com/) 在台灣算是使用人口最多的微型網誌。它有別於堆特之時間軸設計、以及回覆功能非常受到歡迎。</div><div><br />
</div><div>噗浪客若要查詢稍久以前的噗文,用滑鼠滾時間軸不知要滾到民國幾年。此程式可以將指定期間內自己的噗文全部抓下來。</div><div><br />
</div><div>從 1.0 版閞始,已經可以連同回覆的噗文一起抓下來了。<br />
1.1版增加「分離私噗」功能。<br />
希望您會喜歡,也請您不吝給小弟指教。</div><br />
<blockquote>這個程式由 Perl 撰寫而成。使用到 CPAN 上的 <a href="http://search.cpan.org/dist/WWW-Plurk/lib/WWW/Plurk.pm">WWW-Plurk</a> 模組,由於它太久沒維護了已經不太能使用,我有修改到一些。需要我的原始碼可以在<a href="http://sites.google.com/site/seanjsfile/pbscr">這裡</a>下載。</blockquote><br />
<div><br />
</div></div>Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com202tag:blogger.com,1999:blog-6758260041926380909.post-66223903918363963052009-10-25T10:12:00.003+08:002009-11-05T08:24:32.858+08:00PicasaWeb Perl Module<div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.google.com/intl/zh-TW/images/logos/picasa_logo.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://www.google.com/intl/zh-TW/images/logos/picasa_logo.gif" /></a><br />
</div><div style="text-align: center;">■ Download/下載 : <a href="http://s.o4u.com/host/blog/picasaweb_perl.zip">picasaweb_perl.zip</a><br />
</div><br />
<br />
你在找 Perl 管理 PicasaWeb 的模組嗎? 如果你在 CPAN 上找到 Net::Google::PicasaWeb 覺得很難用,還有功能不全。可以來試試小弟改寫的 Perl 模組。<br />
</div><div><br />
</div><div>CPAN 上的 Net::Google::PicasaWeb 並沒有建立相簿、上傳照片等功能。我改寫對岸 董强 <dongqiang#gmail.com> 的 Google::Picasa。歡迎大家使用。</dongqiang#gmail.com><br />
</div><div><br />
</div><div>裡面有幾個簡單的範例,沒什麼教學文件。有心使用的人只好用肉眼看看 Picasa.pm 這個檔案吧!<br />
</div>Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com5tag:blogger.com,1999:blog-6758260041926380909.post-92058287271714917552009-06-25T17:09:00.002+08:002010-05-18T03:54:09.727+08:00在 .Net 使用 GDI+ 調整圖片亮度<div class="separator" style="clear: both; text-align: center;"></div><a href="http://3.bp.blogspot.com/_T8KAZQJUgOM/S_GexN-bbdI/AAAAAAAAE5o/YRpaorQaWSk/s1600/1600x1200.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="150" src="http://3.bp.blogspot.com/_T8KAZQJUgOM/S_GexN-bbdI/AAAAAAAAE5o/YRpaorQaWSk/s200/1600x1200.jpg" width="200" /></a>也就是 RGB 一起調啦!<br />
<br />
<a href="http://blog.bee-eee.com/2008/01/23/c-adjusting-brightnesscontrast-and-gamma-of-an-image/">原始出處</a><br />
<br />
<code><br />
Bitmap origanalImage;<br />
Bitmap adjustedImage;<br />
double brightness = 1.0f; // no change in brightness<br />
double constrast = 2.0f; // twice the contrast<br />
double gamma = 1.0f; // no change in gamma<br />
<br />
float adjustedBrightness = brightness - 1.0f;<br />
// create matrix that will brighten and contrast the image<br />
float[][] ptsArray ={<br />
new float[] {contrast, 0, 0, 0, 0}, // scale red<br />
new float[] {0, contrast, 0, 0, 0}, // scale green<br />
new float[] {0, 0, contrast, 0, 0}, // scale blue<br />
new float[] {0, 0, 0, 1.0f, 0}, // don't scale alpha<br />
new float[] {adjustedBrightness, adjustedBrightness, adjustedBrightness, 0, 1}};<br />
<br />
imageAttributes = new ImageAttributes();<br />
imageAttributes.ClearColorMatrix();<br />
imageAttributes.SetColorMatrix(new ColorMatrix(ptsArray), ColorMatrixFlag.Default, ColorAdjustType.Bitmap);<br />
imageAttributes.SetGamma(gamma, ColorAdjustType.Bitmap);<br />
Graphics g = Graphics.FromImage(adjustedImage);<br />
g.DrawImage(originalImage, new Rectangle(0,0,adjustedImage.Width,adjustedImage.Height)<br />
,0,0,bitImage.Width,bitImage.Height,<br />
GraphicsUnit.Pixel, imageAttributes);<br />
</code>Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com5tag:blogger.com,1999:blog-6758260041926380909.post-75849895480310257192009-06-03T15:35:00.000+08:002009-06-03T15:36:31.540+08:00取得瀏覽器事件上的物件 IE/FF 相容式<div><br /></div><div><div>// <xxx> 取得瀏覽器事件上的物件 IE/FF 相容式</div><div><br /></div><div>function abc(e) {</div><div> var o=(document.all)?window.event.srcElement:e.target; </div><div>}</div><div><br /></div><div><br /></div></div>Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com2tag:blogger.com,1999:blog-6758260041926380909.post-18941138826222323792009-04-22T16:57:00.001+08:002009-11-25T09:27:48.314+08:00[轉載] 一維條碼<div style="text-align: right;"><span style="font-style: italic;">轉載自 青衫(邱奕南)</span><br />
</div><br />
一維條碼可分為39碼、EAN-13碼、EAN-8碼、UPC-A碼、UPC-E碼、交錯式25碼、CODABAR碼(又稱NW-7碼)、128碼等多種,以下便說明一下各種條碼的意義,以及編碼方式:<br />
<br />
<span style="font-weight: bold;">(一)39碼</span><br />
<br />
39碼發展於1974年,由於限制少,又支援文數字,因此多應用於一般管理軟體。其編碼特性如下:<br />
<br />
1. 資料碼可以是0~9、A~Z、-、.、Space、$、/、+、%等43種,資料長度不限,各資料編號次序依上列次序編號0~42。<br />
2. 編碼結構為〔起始碼+資料碼+檢查碼+終止碼〕,其中檢查碼可有可無,且檢查碼亦會被視為資料輸入。<br />
3. 起始碼與終止碼均固定為*。<br />
4. 檢查碼為資料編號值(0~42)累加後(Sum)除以43取餘數,並將該值視為相對應資料編號值的資料。<br />
5. 編碼資料如下,每碼有9條,其中3條為粗,各佔12線。以下各位元奇數位為黑,要畫線,偶數位為白,不畫線,0為細,1為粗:<br />
<br />
0 000110100<br />
1 100100001<br />
2 001100001<br />
3 101100000<br />
4 000110001<br />
5 100110000<br />
6 001110000<br />
7 000100101<br />
8 100100100<br />
9 001100100<br />
A 100001001<br />
B 001001001<br />
C 101001000<br />
D 000011001<br />
E 100011000<br />
F 001011000<br />
G 000001101<br />
H 100001100<br />
I 001001100<br />
J 000011100<br />
K 100000011<br />
L 001000011<br />
M 101000010<br />
N 000010011<br />
O 100010010<br />
P 001010010<br />
Q 000000111<br />
R 100000110<br />
S 001000110<br />
T 000010110<br />
U 110000001<br />
V 011000001<br />
W 111000000<br />
X 010010001<br />
Y 110010000<br />
Z 011010000<br />
- 010000101<br />
. 110000100<br />
Space 011000100<br />
$ 010101000<br />
/ 010100010<br />
+ 010001010<br />
% 000101010<br />
* 010010100<br />
<br />
各資料碼之間必須再空開一條白線。<br />
<br />
<br />
<span style="font-weight: bold;">(二)EAN-13碼</span><br />
<br />
EAN-13碼(European Article Number,歐洲商品條碼)是1977年由歐洲十二個工業國家所共同發展出來的一種條碼系統,其後逐漸變成國際性的條碼系統,一般多用作商品標示條碼。其編碼特性如下:<br />
<br />
1. 資料只能為0~9之數字計12個,連同檢查碼共13碼。資料中包括國家代碼3碼、廠商代碼4碼、產品代碼5碼,為一種專用於商品標示的條碼。<br />
2. 編碼結構為〔護線+6個左資料碼+中線+5個右資料碼+檢查碼+護線〕,共佔119條線。其中在畫線時,護線和中線在下方均略長於資料碼,以便肉眼能明顯區分,但對於條碼機閱讀時並無差異。<br />
3. 左資料的編碼方式有A、B兩組之分,而資料的第一碼隱藏在左資料碼的編碼方式,故實際只編出12碼。以下為左資料依首碼所對應使用的編碼方式:<br />
<br />
0 AAAAAA<br />
1 AABABB<br />
2 AABBAB<br />
3 AABBBA<br />
4 ABAABB<br />
5 ABBAAB<br />
6 ABBBAA<br />
7 ABABAB<br />
8 ABABBA<br />
9 ABBABA<br />
<br />
4. 左資料的編碼方式,A組編碼為:<br />
<br />
0 0001101<br />
1 0011001<br />
2 0010011<br />
3 0111101<br />
4 0100011<br />
5 0110001<br />
6 0101111<br />
7 0111011<br />
8 0110111<br />
9 0001011<br />
<br />
B組編碼為:<br />
<br />
0 0100111<br />
1 0110011<br />
2 0011011<br />
3 0100001<br />
4 0011101<br />
5 0111001<br />
6 0000101<br />
7 0010001<br />
8 0001001<br />
9 0010111<br />
<br />
以上各位元0為白,1為黑。<br />
<br />
5. 護線固定為101,中線固定為01010,各位元0為白,1為黑。<br />
6. 右資料編碼方式固定為:<br />
<br />
0 1110010<br />
1 1100110<br />
2 1101100<br />
3 1000010<br />
4 1011100<br />
5 1001110<br />
6 1010000<br />
7 1000100<br />
8 1001000<br />
9 1110100<br />
<br />
各位元0為白,1為黑。<br />
<br />
7. 檢查碼計算方式為1000減去前12碼之奇數碼和與偶數碼和*3後,除以10取餘數。假設各碼依次為ABCDEFGHIJKLM,則M = (1000 - (A+C+E+G+I+K) - (B+D+F+H+J+L)*3) % 10。<br />
<br />
<span style="font-weight: bold;">(三)EAN-8碼</span><br />
<br />
EAN-8碼為EAN-13碼的簡化型,除了少掉了廠商代碼外,其餘大致和EAN-13碼相同,其編碼特性如下:<br />
<br />
1. 資料只能為0~9之數字計7個,連同檢查碼共8碼。資料中包括國家代碼3碼、產品代碼5碼。<br />
2. 編碼結構為〔護線+4個左資料碼+中線+3個資料碼+檢查碼+護線〕,共佔67條線。其中在畫線時,護線和中線在下方均略長於資料碼,以便肉眼能明顯區分,但對於條碼機閱讀時並無差異。<br />
3. 首碼不再隱藏於編碼方式,因此實際編出8碼。左資料一律以A組方式編碼,右資料編碼方式同EAN-13碼(請參閱EAN-13碼)。<br />
4. 檢查碼為1000減去前7碼之奇數碼和*3與偶數碼和後,除以10取餘數。假設各碼依次為ABCDEFGH,則<br />
H = (1000 - (A+C+E+G)*3 - (B+D+F)) % 10。<br />
<br />
<br />
<br />
<span style="font-weight: bold;">(四)UPC-A碼</span><br />
<br />
UPC-A碼(Universal Product Code,統一商品條碼)為1973年由美國超級市場公會所發展出來的條碼系統,適用於加拿大以及北美等地區,亦為EAN碼的前身,因此和EAN碼極為相似。UPC-A碼共有13碼,除了最後一個檢查碼外,還包括了旗碼2碼、廠商代碼5碼、產品代碼5碼。其中旗碼第一碼固定為0,第二碼用以表示商品的種類。整個UPC-A的編碼結構和EAN-13碼是完全相同的,只是首碼必須固定為0,因此在編碼上較EAN-13碼簡單。<br />
<br />
<span style="font-weight: bold;">(五)UPC-E碼</span><br />
<br />
UPC-E碼為UPC-A碼的簡化型,共計有8碼,係由某些特殊的UPC-A碼簡化而來。由於並非所有UPC-A碼均能簡化成UPC-E碼,因此可簡化的UPC-A碼有一定的限制,這些限制為:<br />
<br />
1. 旗碼=00,廠商代碼=xx000,產品代碼=00xxx<br />
2. 旗碼=00,廠商代碼=xx100,產品代碼=00xxx<br />
3. 旗碼=00,廠商代碼=xx200,產品代碼=00xxx<br />
4. 旗碼=00,廠商代碼=xxx00,產品代碼=000xx<br />
5. 旗碼=00,廠商代碼=xxxx0,產品代碼=0000x<br />
6. 旗碼=00,廠商代碼=xxxxx,產品代碼=00005~00009<br />
<br />
假設UPC-A各碼依次為ABCDEFGHIJKLM,則符合上述這些限制的UPC-A碼,可依次簡化成下列對應的UPC-E碼:<br />
<br />
1. 0CDJKL0M<br />
2. 0CDJKL1M<br />
3. 0CDJKL2M<br />
4. 0CDEKL3M<br />
5. 0CDEFL4M<br />
6. 0CDEFGLM<br />
<br />
以下則為UPC-E碼的編碼特性:<br />
<br />
1. 資料只能為0~9之數字計7個,連同檢查碼共8碼。各資料代表意義如前所述。<br />
2. 編碼方式為〔左護線+6個資料碼+右護線〕,共佔51條線。由於第一碼固定為0,不列入編碼,而檢查碼隱含在編碼方式中,因此實際只編出6碼。<br />
3. 資料碼依檢查碼有A、B兩組不同的編碼方式,各檢查碼對應的資料編碼方式如下:<br />
<br />
0 BBBAAA<br />
1 BBABAA<br />
2 BBAABA<br />
3 BBAAAB<br />
4 BABBAA<br />
5 BAABBA<br />
6 BAAABB<br />
7 BABABA<br />
8 BABAAB<br />
9 BAABAB<br />
<br />
A、B兩組編碼方式同EAN-13碼。<br />
<br />
4. 檢查碼計算方式如下:<br />
<br />
0ABCDEFM : M = (1000 - (A+D+F) - (B+C+E)*3) % 10,F = 0~2<br />
0ABCDE3M : M = (1000 - (A+C+D) - (B+E)*3) % 10<br />
0ABCDE4M : M = (1000 - (A+C) - (B+D+E)*3) % 10<br />
0ABCDEFM : M = (1000 - (A+C+E) - (B+D+F)*3) % 10,F = 5~9<br />
<br />
5. 左護線固定為101,右護線固定為010101,以上各位元0為白,1為黑。<br />
<br />
<br />
<br />
<span style="font-weight: bold;">(六)交錯式25碼</span><br />
<br />
交錯式25碼(Interleaved 2 of 5)發展於1972年,為最早出現的條碼系統。由於編碼方式係採2個資料交錯放置,且每個資料有5條線,故命令為交錯式25碼。其編碼特性如下:<br />
<br />
1. 資料只能為0~9之數字,長度不限,但必須是偶數個,不足時最前面必須多補一個0。<br />
2. 編碼結構為〔起始碼+資料碼+終止碼〕。<br />
3. 編碼資料如下,每碼有5條線,其中2條為粗,故每碼各佔7線,各位元值0為細,1為粗:<br />
<br />
0 00110<br />
1 10001<br />
2 01001<br />
3 11000<br />
4 00101<br />
5 10100<br />
6 01100<br />
7 00011<br />
8 10010<br />
9 01010<br />
<br />
實際編碼時,以2個資料之位元交錯放置,也就是第一個資料放一個位元,然後輪第二個資料放一個位元,再輪回第一個資料放一位元,如此循環下去。編碼完畢後,在奇數位者一律為黑(要畫線),偶數位者一律為白(不畫線)。<br />
<br />
4. 起始碼固定為0000,終止碼固定為100。依前述奇數位為黑、偶數位為白、0為細、1為粗,則起始碼為細黑、細白、細黑、細白,而終止碼為粗黑、細白、細黑。<br />
<br />
除了交錯式25碼外,也有沒進行交錯排列處理的標準式25碼(Standard 2 of 5),但使用上沒有交錯式25碼普及。<br />
<br />
<span style="font-weight: bold;">(七)CODABAR碼(又稱NW-7碼)</span><br />
<br />
CODABAR碼發展於1972年,但直到1977年才正式被使用。由於發展年份和交錯式25碼相近,因此編碼方式有許多地方頗相似。其編碼特性如下:<br />
<br />
1. 資料只能為數字0~9,以及/+-*$.:等7個特殊符號,長度最長為32碼資料。<br />
2. 編碼結構為〔起始碼+資料碼+終止碼〕,其中起始碼和終止碼必須為英文字母A~D。<br />
3. 編碼資料如下,每碼有7條線,長度不一,各位元奇數位為黑,偶數位為白,0為細,1為粗:<br />
<br />
0 0000011<br />
1 0000110<br />
2 0001001<br />
3 1100000<br />
4 0010010<br />
5 1000010<br />
6 0100001<br />
7 0100100<br />
8 0110000<br />
9 1001000<br />
$ 0011000<br />
- 0001100<br />
A 0011010<br />
B 0101001<br />
C 0001011<br />
D 0001110<br />
+ 0010101<br />
. 1010100<br />
: 1000101<br />
/ 1010001<br />
* 1010101<br />
<br />
各資料碼之間必須再空開一條白線。<br />
<br />
<br />
<br />
<span style="font-weight: bold;">(八)128碼</span><br />
<br />
128碼是個功能強大卻頗複雜的條碼系統,約於1981年開始被採用。其編碼特性如下:<br />
<br />
1. 資料可為ASCII 0~127之任何字元,長度最長30個資料。<br />
2. 編碼結構為〔起始碼+資料碼+終止碼+檢查碼〕,其中檢查碼可有可無,通常不加。<br />
3. 有三類編碼方式:<br />
<br />
A類:ASCII 0~95。<br />
B類:ASCII 32~127。<br />
C類:數字00~99。<br />
<br />
其中ASCII 0~31對應編碼索引為64~95,ASCII 32~95對應編碼索引為0~63,ASCII 96~127對應編碼索引為64~95,C類數字直接對應至編碼索引。各類尚有特殊編碼索引值如下:<br />
<br />
A類:F3=96、F2=97、Shift=98、Code C=99、Code B=100、F4=101、F1=102<br />
B類:F3=96、F2=97、Shift=98、Code C=99、F4=100、Code A=101、F1=102<br />
C類:Code B=100、Code A=101、F1=102<br />
<br />
4. 起始碼有11線,用以決定一開始的編碼類型,各類型的起始碼為:<br />
<br />
A類 = 11010000100<br />
B類 = 11010010000<br />
C類 = 11010011100<br />
<br />
終止碼有13線,固定為1100011101011。<br />
<br />
5. 各編碼索引對應之編碼值如下,0表白線,1表黑線,各佔11條線:<br />
<br />
00 11011001100<br />
01 11001101100<br />
02 11001100110<br />
03 10010011000<br />
04 10010001100<br />
05 10001001100<br />
06 10011001000<br />
07 10011000100<br />
08 10001100100<br />
09 11001001000<br />
10 11001000100<br />
11 11000100100<br />
12 10110011100<br />
13 10011011100<br />
14 10011001110<br />
15 10111001100<br />
16 10011101100<br />
17 10011100110<br />
18 11001110010<br />
19 11001011100<br />
20 11001001110<br />
21 11011100100<br />
22 11001110100<br />
23 11101101110<br />
24 11101001100<br />
25 11100101100<br />
26 11100100110<br />
27 11101100100<br />
28 11100110100<br />
29 11100110010<br />
30 11011011000<br />
31 11011000110<br />
32 11000110110<br />
33 10100011000<br />
34 10001011000<br />
35 10001000110<br />
36 10110001000<br />
37 10001101000<br />
38 10001100010<br />
39 11010001000<br />
40 11000101000<br />
41 11000100010<br />
42 10110111000<br />
43 10110001110<br />
44 10001101110<br />
45 10111011000<br />
46 10111000110<br />
47 10001110110<br />
48 11101110110<br />
49 11010001110<br />
50 11000101110<br />
51 11011101000<br />
52 11011100010<br />
53 11011101110<br />
54 11101011000<br />
55 11101000110<br />
56 11100010110<br />
57 11101101000<br />
58 11101100010<br />
59 11100011010<br />
60 11101111010<br />
61 11001000010<br />
62 11110001010<br />
63 10100110000<br />
64 10100001100<br />
65 10010110000<br />
66 10010000110<br />
67 10000101100<br />
68 10000100110<br />
69 10110010000<br />
70 10110000100<br />
71 10011010000<br />
72 10011000010<br />
73 10000110100<br />
74 10000110010<br />
75 11000010010<br />
76 11001010000<br />
77 11110111010<br />
78 11000010100<br />
79 10001111010<br />
80 10100111100<br />
81 10010111100<br />
82 10010011110<br />
83 10111100100<br />
84 10011110100<br />
85 10011110010<br />
86 11110100100<br />
87 11110010100<br />
88 11110010010<br />
89 11011011110<br />
90 11011110110<br />
91 11110110110<br />
92 10101111000<br />
93 10100011110<br />
94 10001011110<br />
95 10111101000<br />
96 10111100010<br />
97 11110101000<br />
98 11110100010<br />
99 10111011110<br />
100 10111011110<br />
101 11101011110<br />
102 11110101110<br />
<br />
<br />
<br />
6. 檢查碼的計算方式103加上各資料的編碼索引值乘上位置值的總和,再除以103取餘數。假設資料編碼索引值依次為ABC,則檢查碼 = (103 + A*1 + B*2 + C*3) % 103。計算出檢查碼後,即視為編碼索引值進行編碼。<br />
7. 特殊資料碼意義為:<br />
<br />
F1~F4 = 同按下F1~F4鍵<br />
Shift = 同按下Shift鍵<br />
Code A = 編碼類別改成A類<br />
Code B = 編碼類別改成B類<br />
Code C = 編碼類別改成C類<br />
<br />
由於128碼可以中途轉變編碼類別,因此同一個資料可能有多個編碼方式,如何將編碼長度縮到最小,便成為一項考驗。以下係我們經過分析後,所得到的演算法,可使得編碼長度縮到最小:<br />
<br />
*** 決定起始碼<br />
<br />
1. 一開始數字連續4個以上時,使用C類。<br />
2. 先遇上ASCII 0~31者,使用A類,先遇上ASCII 96~127者,使用B類。都遇不上,一律採用A類。<br />
<br />
*** 中途轉碼考慮<br />
<br />
A、B類 -<br />
<br />
1. 數字6個以上時,改用C類。<br />
2. 遇上ASCII 0~31者,改用A類,遇上ASCII 96~127,改用B類。<br />
<br />
C類 -<br />
<br />
3. 只剩0~1個數字時,往後找2的情況,若無,一律使用A類。<br />
4. 遇上ASCII 0~31者,改用A類,遇上ASCII 96~127,改用B類。Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com7tag:blogger.com,1999:blog-6758260041926380909.post-26150571011313950582009-04-20T16:10:00.000+08:002009-04-20T16:14:26.306+08:00在ASP將字串轉成 Big5 位元串以十六進制表示古老的 ASP 程式通常都在 ANSI 模式下。<br /><br />近年來已朝向 Unicode (UTF-8) 的環境開發<br />在第一行加入: <%@LANGUAGE="VBScript" CODEPAGE="65001" %><br />可以讓程式碼、語言核心、HTTP IO 都使用 Unicode 了。<br /><br />如果有一個特殊狀況要把 Unicode 網頁的文字轉回去 Big5 怎麼辦呢?<br /><br /><pre><br />'=== 將(Unicode)字串轉成 Big5 位元串以十六進制表示<br />Private Function HexBig5(strData)<br />Dim o,B,I,out<br />Set o = Server.CreateObject("ADODB.Stream")<br /><br />o.Charset = "big5"<br />o.Mode = 3 '1讀 2寫 3讀寫<br />o.Type = 2 '1二進制 2純文字<br />o.Open<br />o.WriteText strData<br /><br />'o.SaveToFile Server.MapPath("t.txt"),2 '測試輸出文字檔<br />o.Position = 0 '從頭開始<br />o.Charset = "big5"<br />o.Type = 1<br />B = o.Read<br /><br />out = ""<br />For I= 1 To o.size<br /> out = out & HexB(AscB(MidB(B,I,1)))<br />Next<br />HexBig5 = out<br />End Function<br /><br />Private Function HexB(value)<br />hexB = Right("0" & HEX(value),2)<br />End Function<br /></pre>Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com6tag:blogger.com,1999:blog-6758260041926380909.post-55939589461510306382008-12-01T15:43:00.000+08:002009-10-25T10:08:54.768+08:00溢出字元上篇討論到使用 Windows 內部的轉碼、轉字功能,事事不是那麼如意。Big5 碼並不是什麼字都有,Windows API 的轉碼功能遇到不能轉的字會變成「?」字元。<br />例如:<br /><br /> <span style="color: rgb(51, 51, 255);">print ToANSI("陶喆的歌");</span><br /><br />輸出 big5碼結果是:<br /><br /> <span style="color: rgb(51, 51, 255);">陶?的歌</span><br /><br />於是 Sean 再寫一個函式 ToHTML,輸出結果為:<br /><br /> <span style="color: rgb(51, 51, 255);"> 陶&#21894;的歌</span><br /><br />完整的原始程式在 <a href="http://code.google.com/p/sean/source/browse/trunk/Perl/Win32Encode.pm">這裡</a>。Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com3tag:blogger.com,1999:blog-6758260041926380909.post-4475084750932367142008-11-26T15:10:00.000+08:002009-10-25T10:09:20.708+08:00在 Windows Perl 5.8 下的簡繁轉字續<a href="http://www.blogger.com/2008/11/windows-perl-58xxx-unicode.html">上篇文章</a>使用 Windows 系統的 API 在 Unicode 與 ANSI 字元轉換。接下來就是簡體與繁的互換了。<br /><br />雖然在 Perl 中可以 use Encode::HanConvert 來轉換。但還是同樣的問題,若要打包成執行檔會包出一大包怪物。在速度效能上的考量,Sean 還是使用 Windows API 來轉換。<br /><br />在 GBK 字集中包含所有簡體與繁體字,所以 Sean 的程式都先轉成 GBK 再呼叫系統的 LCMapString。<br /><br />這個函不該稱「簡繁轉碼」,應該稱「簡繁轉『字』」。因為編碼並沒有改變。函式傳入的字串使用 Unicode (Perl預設UTF8),回傳值也是 Unicode 字串,僅做簡繁字互轉。<br /><br />Sean 已寫成 Perl 模組,<a href="http://code.google.com/p/sean/source/browse/trunk/Perl/Win32Encode.pm" target="_new">完整的程式在這裡</a>。<br /><br />題外話,簡繁體字並非一對一的關係唷,因為無法100%逆轉。<br />例如繁體「干」「幹」「乾」簡體皆為「干」,再轉回繁體還是「干」。<br /><br /><br /><code><br /><pre><br /><br /><br />use Encode qw(encode decode);<br />use Win32::API;<br /><br />use utf8;<br />use strict;<br /><br />use constant LOCALE_SYSTEM_DEFAULT => 0x0800;<br />use constant LANG_CHINESE_SIMPLIFIED => 0x0804;<br />use constant LANG_CHINESE_TRADITIONAL => 0x0404;<br />use constant LCMAP_SIMPLIFIED_CHINESE => 0x02000000;<br />use constant LCMAP_TRADITIONAL_CHINESE => 0x04000000;<br /><br /># Perl 的 Unicode 字串正體中文轉簡體中文<br />sub ToCHS {<br /> my $source = ToANSI(shift,'GBK');<br /> my $len = length($source);<br /> my $target = "\0" x $len;<br /><br /> $API_LCMapString = new Win32::API('kernel32','LCMapString','NNPNPN','N') unless defined $API_LCMapString;<br /><br /> my $ret = $API_LCMapString->Call(LANG_CHINESE_SIMPLIFIED,LCMAP_SIMPLIFIED_CHINESE,$source,$len,$target,$len);<br /> return undef unless $ret;<br /><br /> return(ToUnicode($target,'GBK'));<br />}<br /><br /><br /># Perl 的 Unicode 字串簡體中文轉正體中文<br />sub ToCHT {<br /> my $source = ToANSI(shift,'GBK');<br /> my $len = length($source);<br /> my $target = "\0" x $len;<br /><br /> $API_LCMapString = new Win32::API('kernel32','LCMapString','NNPNPN','N') unless defined $API_LCMapString;<br /><br /> my $ret = $API_LCMapString->Call(LANG_CHINESE_SIMPLIFIED,LCMAP_TRADITIONAL_CHINESE,$source,$len,$target,$len);<br /> return undef unless $ret;<br /><br /> return(ToUnicode($target,'GBK'));<br />}<br /><br /><br /></pre><br /></code>Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com3tag:blogger.com,1999:blog-6758260041926380909.post-32391533534128950832008-11-20T14:56:00.000+08:002009-10-25T10:09:38.337+08:00在 Windows Perl 5.8 中 Unicode / ANSI 互轉在 Perl 5.8 中使用字元集轉碼功能通常 use Encode。若在 Windows 下使用 PerlApp 之類的工具,將程式包成獨立的執行檔,通常會包出很龐大的執行檔。因為裡面包含著不小的轉碼表。<br /><br />例如 encode 用到 big5 至少要 use Encode::TW,這麼一來檔案至少膨脹了好幾百K。而且你還無法預期不只有 TW 或許 CN, JP.... 都有可能用到。<br /><br />Sean 寫了一個模組呼叫 Windows API 來轉碼,不使用 Perl 裡面的。<br />當然只能在 Windows 上跑,但可以將 Perl 程式包出較小的執行檔。<br /><br /><span style="font-weight: bold; color: rgb(255, 0, 0);">使用時請注意,如果程式碼中有 "中文字串",您的原始碼文字檔必須是 UTF8 格式。</span><br /><br /><pre><br /><code><br /><br />package Win32Encode;<br /><br />use Encode qw(encode decode);<br />use Win32::API;<br /><br />use utf8;<br />use strict;<br /><br />use Exporter;<br /><br />use vars qw(<br />$VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS<br />%cp $API_MultiByteToWideChar $API_WideCharToMultiByte<br />);<br /><br />$VERSION = '0.01';<br />@ISA = qw(Exporter);<br />@EXPORT = qw( ToUnicode ToANSI );<br />@EXPORT_OK = qw( ToUnicode ToANSI );<br /><br /><br />%cp = qw( EBCDICCPUS 37 437 437 CP437 437 CSPC8 437 CODEPAGE437 437 IBM437 437<br />ASMO708 708 DOS720 720 IBM737 737 CP500 775 IBM775 775 IBM850 850 IBM852 852<br />CP852 852 IBM857 857 IBM861 861 DOS862 862 CP866 866 IBM866 866 IBM869 869<br />CP870 870 ISO885911 874 DOS874 874 WINDOWS874 874 TIS620 874<br />XEBCDICGREEKMODERN 875 MSKANJI 932 CSSHIFTJIS 932 CSWINDOWS31J 932<br />XMSCP932 932 SHIFTJIS 932 XSJIS 932 CSISO58GB231280 936 GBK 936<br />GB231280 936 CSGB2312 936 CHINESE 936 CNGB 936 ISOIR58 936 GB2312 936<br />CSGB231280 936 KSC5601 949 KOREAN 949 KSC56011989 949 CSKSC56011987 949<br />KSC56011987 949 ISOIR149 949 CSBIG5 950 BIG5 950 XXBIG5 950 CNBIG5 950<br />CP1026 1026 XEBCDICCPUSEURO 1140 XEBCDICGERMANYEURO 1141<br />XEBCDICDENMARKNORWAYEURO 1142 XEBCDICFINLANDSWEDENEURO 1143<br />XEBCDICFRANCE 1143 XEBCDICITALYEURO 1144 XEBCDICSPAINEURO 1145<br />XEBCDICUKEURO 1146 XEBCDICFRANCEEURO 1147 XEBCDICINTERNATIONALEURO 1148<br />XEBCDICICELANDICEURO 1149 UNICODE 1200 UTF16 1200 UNICODEFFFE 1201<br />WINDOWS1250 1250 XCP1250 1250 WINDOWS1251 1251 XCP1251 1251 ISO646US 1252<br />WINDOWS1252 1252 ISO646IRV1991 1252 USASCII 1252 IBM819 1252 LATIN1 1252<br />CP819 1252 XANSI 1252 ANSIX341986 1252 ISOIR6 1252 ISO885911987 1252 ASCII 1252<br />ISOIR100 1252 US 1252 ANSIX341968 1252 CSASCII 1252 CP367 1252 ISO88591 1252<br />IBM367 1252 WINDOWS1253 1253 WINDOWS1254 1254 ISOIR148 1254 ISO88599 1254<br />LATIN5 1254 ISO885991989 1254 ISO88598I 1255 VISUAL 1255 WINDOWS1255 1255<br />ISO88598 1255 WINDOWS1256 1256 CP1256 1256 WINDOWS1257 1257 WINDOWS1258 1258<br />JOHAB 1361 MACINTOSH 10000 XMACJAPANESE 10001 XMACCHINESETRAD 10002<br />XMACKOREAN 10003 XMACARABIC 10004 XMACHEBREW 10005 XMACGREEK 10006<br />XMACCYRILLIC 10007 XMACCHINESESIMP 10008 XMACCE 10029 XMACICELANDIC 10079<br />XMACTURKISH 10081 XCHINESECNS 20000 XCHINESEETEN 20002 XIA5 20105<br />XIA5GERMAN 20106 XIA5SWEDISH 20107 XIA5NORWEGIAN 20108 ISOIR6US 20127<br />XEBCDICGERMANY 20273 XEBCDICDENMARKNORWAY 20277 XEBCDICFINLANDSWEDEN 20278<br />XEBCDICITALY 20280 XEBCDICSPAIN 20284 XEBCDICUK 20285<br />XEBCDICJAPANESEKATAKANA 20290 XEBCDICARABIC 20420 XEBCDICGREEK 20423<br />XEBCDICHEBREW 20424 XEBCDICKOREANEXTENDED 20833 XEBCDICTHAI 20838<br />CSKOI8R 20866 KOI 20866 KOI8 20866 KOI8R 20866 XEBCDICICELANDIC 20871<br />XEBCDICCYRILLICRUSSIAN 20880 XEBCDICTURKISH 20905<br />XEBCDICCYRILLICSERBIANBULGARIAN 21025 KOI8U 21866 KOI8RU 21866 L1 28591<br />CSISO 28591 L2 28592 ISOIR101 28592 ISO88592 28592 CSISOLATIN2 28592<br />LATIN2 28592 ISO885921987 28592 ISO88593 28593 ISO885931988 28593<br />ISOIR109 28593 LATIN3 28593 L3 28593 LATIN4 28594 ISO885941988 28594<br />ISOIR110 28594 L4 28594 ISO88594 28594 CSISOLATIN4 28594 ISO88595 28595<br />CYRILLIC 28595 ISOIR144 28595 CSISOLATIN5 28595 CSISOLATINCYRILLIC 28595<br />ISO885951988 28595 ECMA114 28596 ISO885961987 28596 ARABIC 28596 ISOIR127 28596<br />ISO88596 28596 CSISOLATINARABIC 28596 GREEK8 28597 ELOT928 28597<br />ISO885971987 28597 CSISOLATINGREEK 28597 ISO88597 28597 ECMA118 28597<br />ISOIR126 28597 GREEK 28597 HEBREW 28598 ISO885981988 28598<br />CSISOLATINHEBREW 28598 ISOIR138 28598 L5 28599 L9 28605 LATIN9 28605<br />ISO885915 28605 XEUROPA 29001 LOGICAL 38598 ISO2022JP 50221<br />CSISO2022JP 50221 CSISO2022KR 50225 ISO2022KR 50225<br />XEBCDICJAPANESEANDKANA 50930 XEBCDICJAPANESEANDUSCANADA 50931<br />XEBCDICKOREANANDKOREANEXTENDED 50933 XEBCDICSIMPLIFIEDCHINESE 50935<br />XEBCDICTRADITIONALCHINESE 50937 XEBCDICJAPANESEANDJAPANESELATIN 50939<br />XEUC 51932 EUCJP 51932 XEUCJP 51932<br />EXTENDEDUNIXCODEPACKEDFORMATFORJAPANESE 51932 CSEUCPKDFMTJAPANESE 51932<br />EUCCN 51936 XEUCCN 51936 EUCKR 51949 CSEUCKR 51949 HZGB2312 52936<br />XISCIIDE 57002 XISCIIBE 57003 XISCIITA 57004 XISCIITE 57005 XISCIIAS 57006<br />XISCIIOR 57007 XISCIIKA 57008 XISCIIMA 57009 XISCIIGU 57010 XISCIIPA 57011<br />CSUNICODE11UTF7 65000 XUNICODE20UTF7 65000 UNICODE11UTF7 65000 UTF7 65000<br />XUNICODE20UTF8 65001 UTF8 65001 UNICODE20UTF8 65001 UNICODE11UTF8 65001);<br /><br /><br /># 使用 Windows API 互轉 ANSI 字元及 Perl Unicode 字串<br />#<br />#<br /># 原始碼以 utf-8 儲存時<br /># $ansi = ToANSI("中文字ABC\n"); # 相當於 encode("Big5","中文ABC") 傳回的 Big5 byte 型式<br /># $unicode = ToUnicode($ansi); # 轉成 Perl Unicode 字串<br />#<br /># 字元集參數預設為 CP_ACP(0) 即系統預設語言<br /><br /><br /># 轉成多位元字元 (Perl 的 Unicode字串,[字元集])<br />sub ToANSI {<br /><br /> my($u8,$codepage) = @_;<br /> $codepage ||=0;<br /><br /> unless($codepage =~ /^\d+$/) {<br /> $codepage = uc($codepage);<br /> $codepage =~ s/[^A-Z0-9]//g;<br /> $codepage = (exists $cp{$codepage})?$cp{$codepage}:0;<br /> } <br /><br /> my $u_len = length($u8);<br /> my $uni_str = encode("UCS-2LE",$u8);<br /><br /> $API_WideCharToMultiByte = new Win32::API('kernel32','WideCharToMultiByte','NNPNPNPP','N') unless defined $API_WideCharToMultiByte;<br /><br /> my $len = $API_WideCharToMultiByte->Call($codepage,0,$uni_str,$u_len,0,0,0,0);<br /> return undef unless $len;<br /><br /> my $string = "\0" x $len;<br /><br /> my $result = $API_WideCharToMultiByte->Call($codepage,0,$uni_str,$u_len,$string,$len,0,0);<br /> return undef unless $result;<br /><br /> return($string);<br />}<br /><br /><br /><br /># 轉成 Perl 的 Unicode 字串( ANSI字串,[字元集] )<br />sub ToUnicode {<br /><br /> my($string,$codepage) = @_;<br /> $codepage ||=0;<br /><br /> unless($codepage =~ /^\d+$/) {<br /> $codepage = uc($codepage);<br /> $codepage =~ s/[^A-Z0-9]//g;<br /> $codepage = (exists $cp{$codepage})?$cp{$codepage}:0;<br /> }<br /><br /> $API_MultiByteToWideChar = new Win32::API('kernel32','MultiByteToWideChar','NNPNPN','N') unless defined $API_MultiByteToWideChar;<br /><br /> my $len = $API_MultiByteToWideChar->Call($codepage,0,$string,length($string),0,0);<br /> return undef unless $len;<br /><br /> my $ustring = "\0" x ($len*2);<br /><br /> my $result = $API_MultiByteToWideChar->Call($codepage,0,$string,length($string),$ustring,$len);<br /> return undef unless $result;<br /><br /> return decode("UCS-2LE",$ustring);<br />}<br /><br />1;<br /><br /><br /></code><br /></pre><br /><br /><br /><br />題外話。為了更減輕打包出來的大小,C:\Perl\lib\unicore 目錄可以只剩下列檔案:<br /><br />Canonical.pl<br />Exact.pl<br />PVA.pl<br />lib\gc_sc\Digit.pl<br />lib\gc_sc\SpacePer.pl<br />lib\gc_sc\Word.pl<br />To\Digit.pl<br />To\Fold.pl<br />To\Lower.pl<br />To\Title.pl<br />To\Upper.pl<br /><br />這只是通常的情況,保險一點修改 C:\Perl\lib\utf8_heavy.pl 裡的 DEBUG 為 1。<br />把自己的程式跑一遍,看看有沒有缺少哪個 unicore 裡的檔案。Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com3tag:blogger.com,1999:blog-6758260041926380909.post-32037807927828774102008-10-20T01:32:00.005+08:002010-12-23T17:14:16.007+08:00讓 Blogger 的意見回應可以有回覆<blockquote>新方法改起來比較容易囉,見 <a href="http://sean.o4u.com/2010/12/blogger.html">新文章</a>(2010/12/23)。下面是舊方法,忘記它吧。<br />
</blockquote><br />
<br />
Blogger 中的張點的意見(回應)都沒有「作者回覆」的功能,剛剛 hack 一下... 終於有了。<br />
曾看過其他解決方案,但要申請第三方留言版來外掛。<br />
我的方法不用另外申請,直使用 Blogger 資料庫。<br />
<br />
<br />
<br />
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_T8KAZQJUgOM/ShUPvnburGI/AAAAAAAADYY/1OhGLcuYlsY/s1600-h/3.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 305px; height: 169px;" src="http://4.bp.blogspot.com/_T8KAZQJUgOM/ShUPvnburGI/AAAAAAAADYY/1OhGLcuYlsY/s400/3.jpg" alt="" id="BLOGGER_PHOTO_ID_5338190244031147106" border="0" /></a>版面配置 → 修改 HTML → 勾「展開小裝置範本」<br />
「下載完整範本」後,用習慣的編輯器來改。<br />
<br />
修改後再上傳。最好是能把最原始範本保留一份起來,免得改錯了來找我。<br />
<blockquote>注意,每個人的 Template 或許不同。<span style="color: rgb(255, 0, 0);">紅色為新增部份。</span><pre style=";font-family:Tahoma;font-size:8pt;"><span style="color: rgb(255, 0, 0);"><script type='text/javascript'>
function authorReply(CID) {
var strBody = document.getElementById(CID).innerHTML.replace(/Re:\s*.+\s*&amp;lt;(\d+)&amp;gt;\s*&lt;BR\/?&gt;/i,&#39;&#39;);
var strOut = &quot;<div style='background-color: bisque; padding: 4px'><b>作者回覆</b>&#65306;<br/>&quot;+strBody+&#39;</div><p/>&#39;;
if(RegExp.$1)
document.getElementById(&#39;RID&#39;+RegExp.$1).innerHTML = strOut;
else
document.write(strOut);
}
function replyEmbedComment(CN,CID) {
var url = document.getElementById(&#39;comment-editor-src&#39;).href.replace(/-iframe/,'');
url += &quot;&amp;postBody=Re:+&quot;+escape(CN)+&quot;+&lt;&quot;+CID+&quot;&gt;%0D%0A&quot;;
location.href = url;
}
</script></span>
<dl id='comments-block'>
<b:loop values='data:post.comments' var='comment'>
<span style="color: rgb(255, 0, 0);"></span><span style="color: rgb(255, 0, 0);">
</span><span><span style="color: rgb(255, 0, 0);"> <</span></span><span style="color: rgb(255, 0, 0);">b:if cond='data:comment.author == data:post.author'</span><span><span style="color: rgb(255, 0, 0);">>
</span></span><span style="color: rgb(255, 0, 0);"> <div expr:id='&quot;CID&quot; + data:comment.id' style='display:none'><data:comment.body/> <span style='font: 7pt Arial; color:#8a8a8a'>(<data:comment.timestamp/>)</span>
<b:include data='comment' name='commentDeleteIcon'/>
</div>
<script type='text/javascript'>
authorReply(&quot;CID<data:comment.id/>&quot;);
</script>
<b:else/>
</span> <dt expr:class='&quot;comment-author &quot; + data:comment.authorClass' expr:id='data:comment.anchorName'>
<a expr:name='data:comment.anchorName'/>
<b:if cond='data:comment.authorUrl'>
<a expr:href='data:comment.authorUrl' rel='nofollow'><data:comment.author/></a>
<b:else/>
<data:comment.author/>
</b:if>
<data:commentPostedByMsg/>
</dt>
<dd class='comment-body'>
<b:if cond='data:comment.isDeleted'>
<span class='deleted-comment'><data:comment.body/></span>
<b:else/>
<p><data:comment.body/></p>
</b:if>
</dd>
<dd class='comment-footer'>
<span class='comment-timestamp'>
<a expr:href='data:comment.url' title='comment permalink'>
<data:comment.timestamp/>
</a>
<b:include data='comment' name='commentDeleteIcon'/>
<span style="color: rgb(255, 0, 0);">
<span expr:class='&quot;item-control &quot; + data:comment.adminClass'>
<b:if cond='data:post.embedCommentForm'>
<a href='#comment-form' expr:onclick='&quot;replyEmbedComment(\&quot;&quot; + data:comment.author + &quot;\&quot;,\&quot;&quot; + data:comment.id + &quot;\&quot;)&quot;' style='font: 9pt Arial; color:#8a8a8a'>回</a>
<b:else/>
<b:if cond='data:post.allowComments'>
<a expr:href='data:post.addCommentUrl + &quot;&amp;postBody=Re%3A%20&quot; + data:comment.author + &quot;%20%3C&quot; + data:comment.id + &quot;%3E%0D%0A&quot;' expr:onclick='data:post.addCommentOnclick' style='font: 9pt Arial; color:#8a8a8a'>回</a>
</b:if>
</b:if>
</span>
</span>
</span>
</dd>
<span style="color: rgb(255, 0, 0);"> <dd class='comment-reply'>
<span expr:id='&quot;RID&quot; + data:comment.id'/>
</dd>
</b:if></span>
</b:loop>
</dl>
</pre><br />
</blockquote><br />
<br />
<br />
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_T8KAZQJUgOM/ShUMkDT_ZVI/AAAAAAAADYI/jndFHAwyeIo/s1600-h/1.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 270px; height: 140px;" src="http://3.bp.blogspot.com/_T8KAZQJUgOM/ShUMkDT_ZVI/AAAAAAAADYI/jndFHAwyeIo/s400/1.jpg" alt="" id="BLOGGER_PHOTO_ID_5338186746821567826" border="0" /></a><br />
<br />
完成之後....<br />
在使用者登入的情況下在每篇「意見」後面都會多一個「回」字。用力點下去就對了!<br />
<br />
<br />
<br />
<br />
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_T8KAZQJUgOM/ShUMvCu_ahI/AAAAAAAADYQ/-OG2onjaCEc/s1600-h/2.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 270px; height: 140px;" src="http://3.bp.blogspot.com/_T8KAZQJUgOM/ShUMvCu_ahI/AAAAAAAADYQ/-OG2onjaCEc/s400/2.jpg" alt="" id="BLOGGER_PHOTO_ID_5338186935644940818" border="0" /></a><br />
<br />
寫回覆內容時,自動出現的第一行要留起來唷。不然就會變成普通留言。Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com138tag:blogger.com,1999:blog-6758260041926380909.post-35768374109736492302008-06-30T16:35:00.000+08:002008-07-02T14:48:42.003+08:00單一網卡同時設定「自動取得IP」及固定的「靜態IP」<span style="font-style: italic;"><span style="color: rgb(51, 255, 255);font-family:arial;" >Use a DHCP obtained IP address along with a static IP address at the same time.</span><br /></span><br /><br /><br /><span style="font-weight: bold;">如果懶得找 Registry,請</span><a style="font-weight: bold;" href="http://sean.tw.googlepages.com/SetDHCPAndStaticIP.rar">下載</a><span style="font-weight: bold;">小弟寫的 Script 程式來輔助設定。</span><br /><br /><br />最近申請 Cable Modem 發現一個問題,雖然不用 PPPoE 撥接很方便。但是它提供的 DHCP 發給的 IP 都不在同網段,家裡區網的網芳互連很不方便。以下文章介紹如何在一片網卡上自定私有的靜態 IP,又同時「自動取得 IP 位址」(DHCP)。<br /><br />XP 的 Internet Protocll (TCP/IP) 網路設定「使用下列的 IP 位址」再按 [進階] 可以設定多個靜態 IP。但是如果使用「自動取得 IP 位址(DHCP)」的話將無法在同一片網卡上設定其他 IP。想要在同一片網卡上有兩個 IP(一個是 DHCP 發下來的,另一個是自定的),使用 Regedit 修改註冊表即可。<br /><br /><ul><li>先將 TCP/IP 設成「自動取得 IP 位址」。<br /><br /><br /></li><li>執行 Regedit 找<br />HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\數字<br />上面的「數字」可能好幾個,要找:<br /><br />Description = 你的網卡名稱<br />ServiceName = {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} ← 長得像這樣。<br /><br /><br /></li><li>再找 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}]<br /><br />編輯 IPAddress 第二行加上你要增加的 IP 按 Enter 加換行。<br /><br />編輯 SubnetMask 第二行加上 255.255.255.0 (一般是這樣),按 Enter 加換行。<br /><br /><br /></li><li>「區域連線」上按右鍵「停用」再「啟用」,看看 ipconfig /all 是不多了一組IP。</li></ul><br /><div style="text-align: center;"><span style="font-style: italic; color: rgb(255, 0, 0);">!!注意!! 一台電腦同時具有 WAN + LAN 時要特別注意網路安全。</span><br /></div>Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com32tag:blogger.com,1999:blog-6758260041926380909.post-77214067520872783772008-05-08T14:41:00.003+08:002011-11-05T18:52:40.503+08:00ID3批次編輯工具 - ID3 Batch Editing<a href="http://4.bp.blogspot.com/_T8KAZQJUgOM/SCKg0XJGVBI/AAAAAAAABX4/YTW91ZK9YO8/s1600-h/ID3xls.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5197893741364794386" src="http://4.bp.blogspot.com/_T8KAZQJUgOM/SCKg0XJGVBI/AAAAAAAABX4/YTW91ZK9YO8/s400/ID3xls.png" style="cursor: pointer;" /></a><br />
<br />
Edit your MP3 information the way you like in Office Excel!<br />
(Multilanguage support)<br />
<br />
<b>■ 最新版本:</b>v2.2<br />
<br />
<b>■ 發佈日期:</b>2008 年 8 月 28 日<br />
<br />
<b>■ 介面語言:</b>英文、簡體中文、正體中文<br />
<br />
<b>■ 檔案下載:</b><a href="http://ftp.ntu.edu.tw/cpatch/mp3/id3xls/id3xls23a_install.exe">id3xls23a_install.exe</a> (2.1 MB)<br />
<br />
<br />
<br />
<b>■ 功能說明:</b><br />
<br />
<div style="line-height: 120%; margin-left: 20px; text-indent: 32px;"><br />
編輯 ID3 資訊是一件麻煩的事。如果您習慣 Excel 的編輯環境,使用它來編輯 ID3、複製文字、剪剪貼貼。那是不是方便多了?不管你是從無到有、或是修改現有的 ID3 資訊,使用這個程式都可以方便的完成。<br />
</div>Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com71tag:blogger.com,1999:blog-6758260041926380909.post-12878205122676508622008-04-21T13:30:00.007+08:002014-02-18T01:24:37.143+08:00農曆月曆&世界時間 DHTML 程式版本日期:2007年3月6日<br />
<br />
<img align="right" border="0" src="http://1.bp.blogspot.com/_T8KAZQJUgOM/SAwnsvPIs0I/AAAAAAAABXk/qA750O4BTjM/s400/CalendarScreenShots.jpg" /><br />
<br />
■ 純 HTML 版本:<br />
<ul><li><a href="http://googledrive.com/host/0BxwUdFnrQGeKUGUyajY3dkdZWHM">台灣版(繁體)</a><br />
</li>
<li><a href="http://googledrive.com/host/0BxwUdFnrQGeKd1VuRG9VUFZQVDg">台灣宗教節日版(繁體)</a><br />
</li>
<li><a href="http://googledrive.com/host/0BxwUdFnrQGeKLWZxYkx0Zm8xd1E">大陸版(簡體)</a><br />
</li>
<li><a href="http://googledrive.com/host/0BxwUdFnrQGeKVXNuZDdyTExWWFU">香港版(繁體)</a><br />
</li>
<li><a href="http://googledrive.com/host/0BxwUdFnrQGeKODF4bjZYa2ltSE0">美國中文版(繁體)</a> <br />
</li>
</ul><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_T8KAZQJUgOM/S_GcMDlXzKI/AAAAAAAAE5g/G2ndAjmsnlU/s1600/gadget.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="242" src="http://3.bp.blogspot.com/_T8KAZQJUgOM/S_GcMDlXzKI/AAAAAAAAE5g/G2ndAjmsnlU/s400/gadget.jpg" width="400" /></a></div><br />
■ Sidebar Gadget 版本 (for Windows Vista/7): <br />
<ul><li><a href="http://gallery.live.com/liveItemDetail.aspx?li=cd7eb0db-3532-4cd6-b828-4c23991c6a62&l=1">台灣版</a><br />
</li>
<li><a href="http://gallery.live.com/liveItemDetail.aspx?li=ea81c50c-fd0b-431e-8d8c-f8b7cbb2b889&l=1">香港版</a><br />
</li>
<li><a href="http://microsoft.csdn.net/vista/gadgets-contest/showme.aspx?pointid=168">大陆版</a><br />
</li>
</ul>Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com68tag:blogger.com,1999:blog-6758260041926380909.post-35649777125489621842008-04-14T10:53:00.000+08:002009-04-08T11:21:58.792+08:00即時「電視節目表」與「選台器」版本:v2.3.4 版 (2008年4月8日)<br /><br />下載:<a href="http://tvcontrol.googlecode.com/files/tvctrl234.install.exe">tvctrl234.install.exe</a> (120KB)<br /><br /><br /><br /><img src="http://3.bp.blogspot.com/_T8KAZQJUgOM/SARUWSj3JSI/AAAAAAAABXI/jH4RxVQiCUE/s400/TvScreenShots.png" border="0" /><br /><br /><pre><br /> v2.3.4 (2009/03/27)<br /> - 節目來源HTML改格式配合修改 TvAgent.wsf。(serate)<br /> - 全日節目表點擊節目名稱,可直接上 Google 搜尋。(stanwu.tw)<br /> - 如果已經下載過的節目資料,在程式開啟時就直接顯示。(sean.tw)<br /></pre>Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com131tag:blogger.com,1999:blog-6758260041926380909.post-11908068203656752112008-03-29T18:49:00.001+08:002008-03-30T18:22:21.316+08:00還沒準備好還在工作中....<br /><br />最近工作比較忙,沒什麼時間做自己的網站。<br /><br />TVControl 節目表有問題,還沒時間修。請再忍耐一下,不要再寫信來問了。Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com14tag:blogger.com,1999:blog-6758260041926380909.post-31361688329107539942008-03-29T12:41:00.001+08:002008-03-29T12:47:17.739+08:00施工中<p>因為原先網站主機掛掉。所以打算把舊網站所有內容移植到這個 blog。</p> <p>請再等幾天...</p> Sean Linhttp://www.blogger.com/profile/16994068867619037922noreply@blogger.com4