2010年10月6日 星期三
2009年7月23日 星期四
Visual Studio C# Winform 多國語言開發
這兩天研究這個的結果,整理一下筆記。
主要從下面兩篇文章得到的資訊:
這裡我參照上面的文章,寫了兩個範例:
Project使用的環境為 Windows 平台、.NET Framework 2.0,Visual Studio 2008 撰寫
範例1
這是從資源檔讀取介面文字的範例,我根據 .NET Magazine的一篇文章 所撰寫的。
範例2
我整理的步驟摘要:
- 將Form的屬性Localizable設為true
- 設定介面上所有Control的文字(Text)
- 此時的介面Form屬性Language為Default時的設定,也就是沒特別指定對應的語言
- 現在把Form屬性Language設為Chinese (Taiwan),然後去修改所有Control的Text,或是重新Layout
- 如果有修改的話(沒修改不會產生,會用default),會產生對應的resource檔(如 Form1.zh-TW.resx)
- 也可以同上建立Language為English (United States) 的文字及排版
- 在 InitializeComponent 之前,就先決定要使用的語系 (沒決定的話,系統會幫你偵測,沒對應到的話就用Default,因為我有建立zh-TW,所以有對應到就會用這個)
還有Layout的部份,不同語系的也可以不同排版(有動過排版才會儲存),但這點可是有好有壞 :P
其他可以看一下原始碼,基本上想要動態改變CultureInfo 來改變介面的話,還是要自己寫code去重讀介面。
CodeProject 有人寫好元件來做這件事,可以參考看看。
2009年5月15日 星期五
[Bookmarklet] 瀏覽圖片小工具 PopupX
最後更新時間:
2010.02.25 本blog的bookmarklet不再更新,以userscript版本為主簡介說明:
使用XPath重新撰寫的Bookmarklet,一樣是會在圖片附近顯示出連結的圖片。另外為了支援Firefox的擴充套件Autopager,增加了一個小按鈕在左上角,點一下可以把沒載入圖片的也載入。
支援瀏覽器:
Firefox 3, Google ChromeIE不支援(因為它的ActiveXObject很難用)
目前支援頁面:
- Pixnet相簿
- 無名首頁及個人相簿
- 無名blog(留言大頭照及誰來我家)
- PCHome Photo
- Picasaweb
- Yam Album
- Gamer GNN
- NowNews
- Flickr
使用方法:
參考此篇下載:(拉到書籤工具列)
PopupXFor Greasemonkey Version:
http://userscripts.org/scripts/show/498402009年5月12日 星期二
SyntaxHighlighter 2.0
之前提過的: 讓SyntaxHighlighter幫你網誌內的程式碼上色 ,今年有新版本2.0,好不容易花了一些時間,把相關的元件都更新了。
雖然說顯示介面上沒有什麼大轉變,但是骨子裡可是大不同了…
老實說,使用的語法變化不少,基本上底層的js檔全部都要換成新的,而原本使用:
<pre name=code class=scriptname>1.5的使用方法</pre>
換成:
<pre class='brush:script_name;'>2.0的使用方法</pre>
改變算很大,如果是1.5升級上2.0的使用者,要使用shLegacy.js這個檔來相容舊的寫法,不然要回頭去改之前的文章內容,那會改到傻眼吧!!!
相關閱讀:
2009年4月28日 星期二
2009年3月20日 星期五
[AutoHotKey] 快速切換顯示副檔名
設一個熱鍵可以快速切換副檔名顯示與否,兩張圖比較一下:
下面是AutoHotKey的範例:
; 使用win+F5來更新
#F5::
RegRead, HiddenFiles_Status, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced, HideFileExt
If HiddenFiles_Status = 1
RegWrite, REG_DWORD, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced, HideFileExt, 0
Else
RegWrite, REG_DWORD, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced, HideFileExt, 1
WinGetClass, eh_Class,A
If (eh_Class = "#32770" OR A_OSVersion = "WIN_VISTA")
send, {F5}
Else PostMessage, 0x111, 28931,,, A
Return
目的是修改HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced 內 HideFileExt 的值。
來源參考: Keyboard Ninja: Toggle File Extension Display With a Shortcut Key in Windows
2009年3月10日 星期二
[Bookmarklets] PhotoViewer 快速瀏覽網路相簿的工具
說明:
將滑鼠游標移至圖片上,會自動秀出將該圖片連結的原始的圖片。支援相簿或網站:
PCHome、無名小站、Pixnet、巴哈姆特的GNN、PicasaWeb可使用瀏覽器(目前僅測試windows平台):
IE 6, 7, 8Firefox 3, 3.1 beta 3
使用方法:
開啟要支援的網路相簿頁面後,點這個Bookmarklet,啟可開啟快速瀏覽功能,如果沒效果可以再重按一次。每換一頁要即用這個效果,要重點一次。搭配Firefox的AutoPager,等所有頁面都載進來後使用,效果更好,可一次看所有頁面的照片。
Bookmarklet: (加到最愛或或拉到書籤列,Bookmarklets是什麼可參考此篇使用說明):
擷圖:
原本我是使用Greasemonkey的Splash album viewer來看照片,但搭配AutoPager會沒法運作在新的頁面,想說順便分享給其他非Firefox的朋友使用,所以我試寫了一個bookmarklets,讓IE,Firefox可以在免安裝外掛(or Extension)下快速瀏覽網路相簿。
測試了一下,目前Safari跟Chrome還沒法運用,連jQuery掛上去都怪怪的…功力不夠。用Firefox及IE瀏覽器的人可以試試。
當然,如果是Firefox愛用者,直接使用Greasemonkey+Splash album viewer會方便許多。
Changelog:
2009.03.25
新增測試Firefox 3.1b3, IE 8的環境能正常運作。
支援網站加入PicasaWeb 及無名blog的大頭圖(包含個人資料、誰來我家、回應)。
2009.03.23
修改無名相簿的部份,現在支援相簿首頁及相簿列表了。
2009年3月4日 星期三
[Blogger] 免手動修改圖片連結,讓lightbox也能正常運作的方法
有用lightbox的人,也許會遇到這個問題。
本文的效果為:當網頁載入而未完畢前,點圖片連結會另開新(分)頁來顯示圖片,而javascript載入完成後,lightbox可以正常運作。
原本我以為是Windows Live Writer的問題,當文章內的圖片上傳到blogger後(picasa的相簿內)後,無法讓有使用lightbox的<a>標籤正常使用lightbox來開啟影像(會變成讀取不到圖片)。
當初我自己測試是,把影像連結內的/s1600-h 或是/s800這段文字給刪除掉,lightbox即可正常運作。
但是每次發表完文章,還要上draft.blogger.com去修改文章原始碼,實在耗時費力!當初靈機一動,何不用jQuery直接把href也改成能正常使用的字串呢?
這個東西去年就想弄了,至少拖了有半年以上,之間有讀到Abin一篇相關的文章: Blogger 和 Picasa 的圖片上傳和外連限制,我才知道原來是Google Picasa的做的小詭計,加個"-h"就可避免讓圖片被外連。原來我之前一直錯怪WLW了。
雖然有想法,但是我拖到剛剛才來試寫這個script,沒想到幾分鐘就完成了…
這邊跟大家分享一下我的作法。
函式原始碼:
//用來避免lightbox無法正常連結圖片
//做法是將s1600-h,改為s1600
function ReplaceImageLink()
{
lightboxLinks = $('a.lightbox');
for(i=0; i<lightboxLinks.length; i++)
{
if (lightboxLinks[i].href.match(/s1600-h/))
lightboxLinks[i].href = lightboxLinks[i].href.replace(/s1600-h/g, 's1600');
}
}
因為我的blogger有掛上jQuery,於是我在document.ready裡面,lightbox函式執行之前,加上了ReplaceImageLink()這個函式,內容就變成下面這樣:
<script type='text/javascript'>
$(function(){
//修改符合a.lightbox的href
ReplaceImageLink();
$('.lightbox').lightBox();
});
</script>
這樣就算完成啦。當lightbox執行之前,圖片中有s1600-h的,都會被改成s1600,然後lightbox就可以正常執行。
另外,也可以改成把/s1600-h給整個去掉,一樣是可以正常運作。
2008年12月24日 星期三
[筆記] SQLite 加密?
使用ADO.NET 2.0 Provider for SQLite,在Visual Studio中建立連線時,可以設定密碼。
而我發現設定密碼之後產生的.sqlite資料庫(檔)用ultraedit開啟,會變成一篇亂碼,原本的sqlite檔頭不見了,應該是用password當做加密字串來處理過內容了吧。
但是麻煩的是,設定password產生的資料庫,無法使用其他sqlite工具來開啟,因為檔案內容無法被這些工具辨識的關係。
或著是,這是ADO.NET 2.0 Provider for SQLite僅有的規格?
[筆記] SQLite 如何選取前幾筆的資料
像TSQL有選取前幾筆的語法:
select top n,如:
select top 100 * from table1 order by column1
而SQLite選取筆數的語法為:
在語法最後加上 limit n,如:
select * from table1 order by column1 limit 100延伸閱讀: How to optimise queries to limit the number of rows returned...
[筆記]如何將datetime型的變量存入sqlite中
因為sqlite的時間是用標準時間utc+0,要改為localtime
insert (update_time) values (datetime(CURRENT_TIMESTAMP,'localtime'))
另外關於sqlite的時間函數,可以參考:
2008年11月27日 星期四
[Visual Studio]在Properties.Settings裡面使用Hashtable或Dictionary的方法
其實這算是一種折衷的方法,並不是真的建立Hashtable/Dictionary在Properties裡面。
我自己試過的結果,在Properties.Settings.Default裡面雖然可以建立Hashtable(沒法建立Dictionary),但是在程式裡面去讀取這個Hashtable會出現Exception,因為這個型別並沒有被初始化及讀取user.config的值,不像其他Properties.Settings.Default其他型別的值都會自動被建立並初始化讀取user.config的值,所以沒法使用。(至少我不知道如何用)
最後在網路查到使用的方法,就是先將Hashtable/Dictionary的值序列化成XML字串,再用string型別把值塞到Properties.Settings.Default裡面。
讀取出來也是一樣,先讀出string的值,將string反序列化,將值寫回指定的Hashtable/Dictionary。
下面是Source Code參考:
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml.Serialization;
namespace Neil.Tools
{
public class XMLSerializing
{
//這邊可以改寫為擴充方法
/// <summary>
/// 將Dictionary轉為字串。
/// </summary>
/// <typeparam name="T1">Key型別,通常為string</typeparam>
/// <typeparam name="T2">Value型別,通常為string</typeparam>
/// <param name="d">來源Dictionary</param>
/// <returns>傳回轉換後字串</returns>
public static string ToDictionaryString<T1,T2>(Dictionary<T1, T2> d)
{
if (d.Count == 0)
return "";
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
Serialize(sw, d);
return sb.ToString();
}
//這邊可以改寫為擴充方法
/// <summary>
/// 將string轉回Dictionary
/// </summary>
/// <typeparam name="T1">Key型別,通常為string</typeparam>
/// <typeparam name="T2">Value型別,通常為string</typeparam>
/// <param name="value">XML格式的文字字串</param>
/// <returns>傳回Dictionary<T1,T2></returns>
public static Dictionary<T1, T2> ToDictionary<T1,T2>(string value)
{
Dictionary<T1, T2> d = null;
try
{
d = new Dictionary<T1, T2>();
StringReader sr = new StringReader(value);
Deserialize(sr, d);
if (d.Count == 0)
return null;
}
catch
{ }
return d;
}
public static void Serialize(TextWriter writer, IDictionary dictionary)
{
List<Entry> entries = new List<Entry>(dictionary.Count);
foreach (object key in dictionary.Keys)
{
entries.Add(new Entry(key, dictionary[key]));
}
XmlSerializer serializer = new XmlSerializer(typeof(List<Entry>));
serializer.Serialize(writer, entries);
}
public static void Deserialize(TextReader reader, IDictionary dictionary)
{
dictionary.Clear();
XmlSerializer serializer = new XmlSerializer(typeof(List<Entry>));
List<Entry> list = (List<Entry>)serializer.Deserialize(reader);
foreach (Entry entry in list)
{
dictionary[entry.Key] = entry.Value;
}
}
public class Entry
{
public object Key;
public object Value;
public Entry()
{
}
public Entry(object key, object value)
{
Key = key;
Value = value;
}
}
}
}
而轉換為XML字串的Dictionary會像下面這種內容存儲在user.config:
<setting name="ListViewColumnsOrder" serializeAs="String">
<value><?xml version="1.0" encoding="utf-16"?>
<ArrayOfEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Entry>
<Key xsi:type="xsd:string">lvQueryPatient</Key>
<Value xsi:type="xsd:string">0,1,2,3,4</Value>
</Entry>
<Entry>
<Key xsi:type="xsd:string">lvQueryStudy</Key>
<Value xsi:type="xsd:string">0,1,2,5,3,4</Value>
</Entry>
</ArrayOfEntry></value>
</setting>
2008年11月18日 星期二
[工具]複製檔案/目錄路徑
說明
這是我用AutoIt v3寫的一個簡單的script,用於複製目前檔案選取的檔案/目錄的絕對路徑。
在檔案總案上面的目錄/檔案按滑鼠右鍵,選"複製選取的路徑",就會把檔案的絕對路徑複製到剪貼簿,並跳出對話方塊顯示"複製成功"的訊息,在1秒鐘後自動關閉。
這邊使用AutoIt而不用AutoHotKey的原因,因為AutoIt v3有支援Unicode,而AutoHotKey沒有,有機會遇到一堆???。而系統檔案這東西,偶爾會遇到Unicode。(謎之音A: 還不是因為某人AutoHotKey不熟...)(謎之音B: 這種一兩行而已的東西…)
Screenshot
AutoIt原始碼
If $CmdLine[0] = 1 Then $path = $CmdLine[1] if ClipPut($path) Then MsgBox (0, "路徑複製成功", $path, 1) EndIf EndIf
AutoHotKey原始碼
clipboard = %1% MsgBox ,,路徑複製成功,%clipboard%, 1
.reg刪除登錄檔的寫法
給自己的筆記。
刪除登錄機碼:RegistryPath 之前加上連字號 (-),例:[-HKEY_LOCAL_MACHINE\Software\Test]刪除登錄值:RegistryKey 使用=-,例:
HKEY_LOCAL_MACHINE\Software\Test "TestValue"=-
2008年11月14日 星期五
讓SyntaxHighlighter幫你網誌內的程式碼上色
寫程式又上網google的人,應該常常看到很多網頁或是blog,都會把code依文法上色,或是設計一些css來表現出程式碼的部份。
也有不少線上高亮度語法的服務,讓你貼上原始碼,選好程式語言,就做好html碼給使用者。或是給一段script,在網頁內直接即時產生出code。
今天介紹的是SyntaxHighlighter是只要將下載回來的script檔,找個空間放好,再修改一下自己網誌的樣本檔,然後每次要發佈程式碼時,加上對應的name跟class即可。
因為我個人希望的要求是:
- 在撰寫文章時不會太麻煩,可以直接用簡單的<pre>來區分貼上的程式碼,不用每次都要另外找線上服務來轉html。
- 文章從RSS發佈出去,能看到正常的內容即可。像一些用script即時產生方式就不適合,在rss裡面就看不到程式碼。
剛剛把工具設定好了,這邊分享一下我的經驗。
- 下載SyntaxHighlighter_1.5.1.rar,然後讀一下Usage。
- 把下載回來的檔案解壓出來,將裡面Scripts目錄下面的所有檔案,都傳到自己固定的網路空間,這邊我是使用Google Pages。(其實js傳自己會用到的語法就可以。)
- 將下面這一段,貼到你的網誌樣本檔的header裡面。
<link href='http://nio127.googlepages.com/SyntaxHighlighter.css' rel='stylesheet' type='text/css'/> <script src='http://nio127.googlepages.com/shCore.js' type='text/javascript'/> <script src='http://nio127.googlepages.com/shBrushCss.js' type='text/javascript'/> <script src='http://nio127.googlepages.com/shBrushXml.js' type='text/javascript'/> <script src='http://nio127.googlepages.com/shBrushPython.js' type='text/javascript'/> <script src='http://nio127.googlepages.com/shBrushCSharp.js' type='text/javascript'/> <script src='http://nio127.googlepages.com/shBrushJScript.js' type='text/javascript'/> <script type='text/javascript'> $(function() { dp.SyntaxHighlighter.ClipboardSwf = 'http://nio127.googlepages.com/clipboard.swf'; dp.SyntaxHighlighter.BloggerMode(); dp.SyntaxHighlighter.HighlightAll('code'); });這邊除了shCore.js之外,其他就看個人需求來加了。src那個後面改成自己的空間。
- 到這邊設定就完成了,之後要放程式碼的話,只要使用以下語法放到文章內文: <pre name='code' class='javascript'> [程式碼] </pre> 到時網頁載入後,SyntaxHighlighter就會幫你把程式碼的部份即時轉換了。
這邊有幾點要注意的:
- Blogger的使用者,在要加上BloggerMode(),如下:
dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf'; dp.SyntaxHighlighter.BloggerMode(); dp.SyntaxHighlighter.HighlightAll('code'); - 我上面有使用到jQuery的語法,所以要加上:
<script src='http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js' type='text/javascript'/>
- 不同類型的程式語言,就在class裡面來決定要使用何種類型。
Language Aliases C++ cpp, c, c++ C# c#, c-sharp, csharp CSS css Delphi delphi, pascal Java java Java Script js, jscript, javascript PHP php Python py, python Ruby rb, ruby, rails, ror Sql sql VB vb, vb.net XML/HTML xml, html, xhtml, xslt
這樣應該就可以輕鬆的在blogger貼程式碼了。
補充一下SyntaxHighlighter的額外用法:| nogutter | Will display no gutter. |
| nocontrols | Will display no controls at the top. |
| collapse | Will collapse the block by default. |
| firstline[value] | Will begin line count at value. Default value is 1. |
| showcolumns | Will show row columns in the first line. |
- nogutter 是把左邊的數字條拿掉。
- nocontrols 是把上面的bar拿掉。
- collapse 是預設變成合起來的,上面的bar會多一個+展開。
- 範例: <pre name="code" class="html:nocontrols:nogutter">...</pre>
- 其他請自行參考。
2008年11月11日 星期二
另一款 Javascript Shell : Jash
Jash: JavaScript Shell
網站指出對ie6+, firefox 1.5+, safari 3+有完整支援,chrome也可以用(個人測試),當然也有一些不支援的。
在小弟試用的結果後,有些功能像mouseover DOM算蠻實用的,可惜遇到像gmail用iframe的就沒辦法了。
最主要的script部份,似乎沒有另一個版本的Javascript Shell好用,另如無法shift+enter換行,無法使用語法 function xxx() {} 之類的。但是瑕不掩瑜,它漂亮的介面跟直接顯示在網頁內,自動隨著scrollbar跟著滾動,讓互動變的更即時,這倒是我覺得不錯的優點。
同樣的,要練習或是其他常用的一些javascript語法及測試,可以用這個玩玩看。
推薦用法,firefox跟chromium直接把
2008.11.13補充:
補充一個,在firefox裡可以把這個書籤的關鍵字設為常用的詞(我用jash),方便直接在網址列快速輸入呼叫,不需去滑鼠點。

在同網頁下直接建立一個(div)視窗,也是jash的優點。因
為原jshell的window.open有時(指沒有用滑鼠點書籤,而是用關鍵字做法的時候)會被firefox擋到,還要手動去開啟。
JavaScript Shell : Web Developer或Hacker實用的好玩具
特色相當多,請自己去看,反正就是可以開一個javascript的command頁面給你,讓你輸入所有javascript可以做的事,直接動態對指定頁面處理及修改。
用途可多了,看是要拿來測試自己的script,或是測試動態修改頁面以撰寫greasemonkey,用javascript改css來測stylish,測試語法抓廣告來用adblock擋...或是練習jQuery..或是練習最基本的javascript語法,只要跟javascript有關的,全都可以做啦,請自行延伸。
對我來講,它可是一個最實用的Javascript IDE介面。
目前官方版出到1.4(已經很久了~不需更新吧),但只支援Firefox。
如果是ie的用戶,以前只能乾瞪眼,後來有玩家把ie版的也改寫出來,造福大眾。
下載點
用法就是把bookmarklets直接拉到書籤工具列,ie是存成我的最愛,然後在要使用的頁面,直接點一下這個書籤就會開出這個Shell。
使用Greasemonkey + jQuery
這兩天讀了一些jQuery的使用方法,跟我去年認識的jQuery有點出入,不過它確實是很好用,如同它宣稱的:「write less, do more.」
我除了使用Javascript Shell來練習外,也想讓Greasemonkey可以直接套用自訂的jQuery script,於是找到了這個東西:
在Greasemonkey裡面加入jQuery的方法Greasemonkey程式碼:
// Add jQuery
var GM_JQ = document.createElement('script');
GM_JQ.src = 'http://jquery.com/src/jquery-latest.js';
GM_JQ.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(GM_JQ);
// Check if jQuery's loaded
function GM_wait() {
if(typeof unsafeWindow.jQuery == 'undefined') { window.setTimeout(GM_wait,100); }
else { $ = unsafeWindow.jQuery; letsJQuery(); }
}
GM_wait();
// All your GM code must be inside this function
function letsJQuery() {
alert($); // check if the dollar (jquery) function works
}
安裝下載點:
Download as a userscript. (需要安裝 greasemonkey )
因為作者允許MIT License,所以我就直接複製貼上了XD
ps. 如果不想要每次載入都出現那個alert(),就自己//掉需要的地方吧XD ;
2008年10月24日 星期五
自簽證jar文件
僅供自己筆記用。
需要keytool.exe 及jarsigner.exe兩隻程式。
首先,先開一個cmd.exe
創建自簽名證書
keytool -genkey
預設為存放在目前使用者的根目錄,如C:\documents and Settings\Administrator\.keystore檔。
自簽名jar文件
jarsigner -signedjar 目的文件名.jar 來源文件名.jar mykey或是
jarsigner 文件名.jar mykey
第一種會簽名並產生名為"目的文件名.jar" 第二種會簽名並覆蓋"原文件名.jar"
延伸閱讀:
2008年10月23日 星期四
Silverlight 2初入門資源
前兩天因為工作需求的緣故,試著去摸索建立一個新的silverlight專案,雖然剛開始的系統安裝步驟很繁雜,但設定都準備好開始使用後,其實並沒有那麼討厭,而做出來的介面成果也算很不錯。
這邊把這兩天看到覺得比較有用的相關網頁列出來,以茲有興趣或未來回顧silverlight時使用。
至於開發Silverlight 2前所需要安裝的東西可多著呢,至少需要:
Microsoft Visual Studio 2008 (升級至sp1)
Silverlight SDK
但上面這個光一樣就要裝很多東西(很多不同的小安裝),而且要裝很久…0rz