今天公司的電子流程上線,裡面可以放置一個電子圖檔,大小限制150x40,這很不人性化的限制,又想有圖檔的我必須做一個專屬自己的簽名圖檔,我花了約20分鐘左右 ,才把這個簽名檔做完,整個有一種賽車的fu.
2008年6月3日 星期二
2008年6月2日 星期一
翻車...
第一次看到這樣的翻車,我看的時已經是事發之後,但沒看到其他事故車輛,有可能是自己撞到分隔島之類的吧,但是能開成這樣,也可以說是相當厲害,這只是一般的道路,也不是啥快速道路,真的是一種車,百樣開法阿~~
鈦金卡. 真的有賺到嗎?
最近不少銀行紛紛推出一些MasterCard的「鈦金卡」,及VISA「御璽卡」強調偏重於商務、旅遊和國內消費優惠上,但是這些優惠上有些地方要注意,因為在什麼都愛精算及計較的銀行,想從他們身上獲得一些好處並不是這麼容易的,誇張的該行的業務專員,似乎回饋方式也有誤解,舉個例來說:回饋的比例如下
請注意它是指上期未繳餘額的金額,而不是上期的刷卡金額。
一般我們會認為我這期有大筆支出可能花費15萬,想說會有回饋,而比例是15萬x1.2% = 1800元,但結果與你想像的完全不同,而實際的回饋方式如下:
一般人而言,刷多少就會繳款多少,在這張卡的回饋結果就是0%,簡單來說,這張卡是要賺你的循環利率,再用這循環利率所賺到的錢,回饋一點削削給你,所以不是很建議辦這類型的信用卡。
如果你最近要結婚,或有連續性的大筆支出,建議去花X銀行詢問,裡面有張信用卡的設計,有些小利可圖,至於要怎麼A到這小利,這邊就不方便說了。
2008年5月28日 星期三
實作應用程式多國語言功能(C#)
雖然在C/C++的環境下(Borland C++ Bulider),實作過多國語言的功能,但是其實並不是很滿意,因為其實簡單來說就是每個表單(Form)的控制項必須自己維護所用的控制項,讀取對應的文字檔(*.ini or *.xml),在對控制項作該語言的顯示,這樣來說可以說是相當累,(1)因為每個開發者都須知道整個多國語言的架構跟使用方法,(2)控制項更名程式碼必須對應修改,(3)而且每個Form的程式碼都會顯的很亂,如果能有一個物件能夠直接轉換多國語系,使用上簡單且只要負責維護多國語言文字檔部分,這不知道該有多好! 所以我這星期就在實作這一個部份,這個物件包含(1)使用者介面(UI)的選單生成(這樣維護多國語言物件就不需要再跟UI層的設計者溝通修改,而且可以掌控目前所支援的語系),(2)程式將表單(Form)上的控制項名稱及顯示文字全部寫入指定的檔案路徑(便於自動產生維護檔,在針對維護檔做多國語言的翻譯),(3)實作轉換語系中介層(這樣任何語系皆能互相轉換)。 雖然第一次實作上比較累,但以後有AP要轉換語系,就能用我這個萬用物件嚕,不過目前支援的控制項只有Button, Label, LinkLabel, ToolStrip, GroupBox, TreeView, ListView, MenuStrip, DataGridView, CheckBox,有些控制項上還有子控制項,藍色字的控制項就需要遞迴處理,才能真正的全部轉換。
2008年5月27日 星期二
排隊加油... 真的是賺到了嗎?
昨天行政院臨時宣布油價調漲,這樣突如其來的消息,用想的就知道一定會造成加油站大排長龍的情形,但是這樣排隊加油真的會賺到嗎? 如果以一般的民眾(不囤油的基礎下),當你得知這消息,去到加油站一定是會排在中後段,讓我們來試算一下:
這樣的模式應該是一般民眾心理所想的,不過真的有省到這麼多了嗎? 思考一下,一台車加油所需時間3分鐘,只要你排在20台車之後,所等的時間可能就要1小時,加上等待時所耗費的油(除非自己下車來推車),預估等待一小時所耗的油是1公升,此外還有許多加油站有配合銀行,或有些加油站可以優惠約2元,讓我們再對汽車試算一下
汽車: 60公升的油箱 油價漲幅 3.9元 60 x 3.9 = 234元 - 30.7元(95為例) x 1.5 (平均等待時間約1.5小時) - 60 x 2(加油站優惠) = 67.95元
這樣的時薪 67.95/1.5 = 45.3 比一般工讀生還低廉,這樣的排隊有任何意義嗎?除非你能減低你排隊的時間,否則這樣以平均的例子來看,不如回家好好看電視,休息,陪陪家人,還比較有價值。
2008年5月26日 星期一
青年成家... 難
身旁的朋友一個接著一個結婚,但對許多人而言,是遙不可及的,這分兩個部份,一方面是在繁忙的工作中,除非抱持著開闊的心胸及積極的認識異性的欲望,不然要認識一個適合彼此的人,在離開校園之後,困難度是與日俱增,另一方面,就是現再想購買一間自己的小窩,實在可以說是遙不可及,身邊也不乏朋友很想結婚,卻面臨無法30而立的窘態,因為適合房子實在與我們的薪資水平有了一段極大的差距,相信年近30,家中無資產的朋友,一定也有這樣的感覺,這時又讓我想到富爸爸所說的:不要期待政府會幫你做什麼,因為當你期待落空的時候,只會令你的窘境更加明顯,我們更要想要如何負擔的起理想的家,雖然這不是一件容易的事,但與其等待政府,不如先從自己做起,盡一切的努力去改善這問題。
2008年5月25日 星期日
親情
這星期去士林夜市逛街時,走在百齡高中旁的人行道時,發現前面是爸爸牽著小女兒的畫面,覺得這個小女生一定是爸爸心目中的小公主,這位爸爸一定會努力呵護小公主的,讓他的小女兒可以快快樂樂的成長,因此我就在當事人不知情的情形下,順手把她拍下來。 在我的經驗中,這對我是一件很難的事情,因為在以往的家教案例中,我似乎不懂的小女生的想法,雖然我試著去理解,但是似乎就是辭不達意,無法走入小女孩的世界,但小男生我就相當容易察覺他們在想啥,動個眉頭我就知道小男生打啥歪腦筋了,所以如果有小孩的話,我應該是會想選男生,因為我想我能給予他,亦師亦友的父愛,但是男生有男生的好,女生也有女生的好,雖然在現今的環境下,教養小孩是相當辛苦的事情,讓人在生育前,不得不三思而行,可是這種辛苦應該就是小學課本所說的"甜蜜的負擔",在怎麼辛苦只要看自己的小孩能夠快樂的成長,這種成就感是無法言語的。
2008年5月22日 星期四
換機車空氣濾清器 (Fighter150)
先前文章有提及換機油的方法跟原因,最近也上網搜尋關於機車傳動的常識,有幾個原因(1)當然是有被坑的感覺,才會有動機,(2)網路上可以查詢到許多資訊,若真的是要搞懂基本的相關知識並不是多大的難題,(3)發現自己在這世界上,目前似乎只會寫程式,還有製造臭蟲外(bug),似乎會實用的東西並不多,所以限在會趁機會去注意身邊生活上的細節,那怕只是一點小小的東西,都有他的經驗及學習價值在,如果花一點小精神就能搞懂,何樂而不為勒。
廢話不多說,換空氣濾清器,建議3000km要稍微清潔一下,5000km是情況更換,而更換空濾其實在簡單不過,以Fighter為例,就是將裝空氣濾清器的黑盒子打開後,就能看到空氣濾清器,接著再把新的空氣濾清器裝上去就好,從頭到尾只需要一隻螺絲起子,說起來比換機油更方便處理,順帶一提高流量空氣濾清器 ,(i)有人說要比較常換,(ii)可能造成汽缸的積碳,(iii)起步有力,不管優點缺點如何,我個人認為,除非你想改車,那請自己要多做功課,不然就全部採用原廠的配件,順順騎,一般的機車都能夠撐很久的。
2008年5月16日 星期五
2008年5月14日 星期三
跑!! 不停的跑!!
可能是最近上班越來越有一種無力感,總覺得這樣搞下去不是辦法,但又沒有其他的出路(或者是不敢嘗試其他的出路),所以一直這樣的跑下去,相信很多人跟我都有相同"上班族情境",很想不要工作,出去環遊世界,但是身旁的事物又讓你放不下心,上有高堂,下有小孩(雖然目前沒小孩),實在很難鼓起勇氣,放棄目前的工作,做自己想做的事情,此外,從小就被賦予好好唸書的觀念,以後好好到大公司上班,所以很多事情都很不了解,也不敢跨出自己不熟悉的領域,這點又被"窮爸爸,富爸爸",這本書明確指出-倉鼠籠,不停的工作是為了付下一期的帳單,這樣週而復始,人生最精華的歲月就飛快的流逝過去,或許每有一個人想要這樣下去,但是絕大多數的人,卻安逸於在這個倉鼠籠裡,不停的跑下去,深怕一停下來,就會挨餓受凍,所以我們更要不停的去思考,要如而有效的跳脫這該死的倉鼠籠,真正的走向財富自由,做自己真正想做的事情,想隨時去騎車環島,學習樂器,環遊世界,讓每天起來都能好好規劃自己的一天,而不是由別人來主宰你的世界... 共勉之。
2008年5月13日 星期二
台灣人的世界觀
今天看到這張圖片,圖中世界各地都被寫上一些標語,這些標語似乎某部份都心有戚戚焉,尤其是小時候父母常說:『不乖乖把飯吃完,就把你送到非洲,讓你沒飯吃。』 而今世界是已經有許多變化,但一些刻板印象似乎還在我們兒時的記憶中留下,你是否也有遺留這種感覺。
2008年5月8日 星期四
動手換機油
昨天我的愛車Fighter150又到了換機油的時刻,以往我機油都是給車行換,可是發現我去的車行似乎都不太老實,第一家是Sym 9000的機油算我400元,可是我找到最便宜的是270元(含換),不過好險我只被賺兩次,更沒想到是後來我改用FINA的全合成機油,我去換的那家算我500元,昨天我購入成本350元/罐,因此,這成為我換機油的一個動機,此外,自從工作之後,發現自己會的東西實在太少了,除了電腦,大概還是電腦,而且說實在話,電腦領域方面,強者輩出,要不斷的充實,才能免於被淘汰的命運。從小又喜歡動手做的感覺,所以我就自己動手換機油嚕,換機油+齒輪油,可是說是在簡單不過了,不過昨天第一次用,看跟做還是有一小段差距,所以花了快15~20分鐘,才把機油+齒輪油換完,不過我的目標可不僅於此,希望我以後能自己換一些簡單的配件,一方面是讓我更了解我的愛車,另一方面也是免於被剝削的可能性。可以不斷的學習是一件很快樂的事,希望我可以持續努力學習下去。
TIOBE 程式語言排名
The TIOBE Programming Community index gives an indication of the popularity of programming languages. The index is updated once a month. The ratings are based on the number of skilled engineers world-wide, courses and third party vendors. The popular search engines Google, MSN, Yahoo!, and YouTube are used to calculate the ratings. Observe that the TIOBE index is not about the best programming language or the language in which most lines of code have been written.
The index can be used to check whether your programming skills are still up to date or to make a strategic decision about what programming language should be adopted when starting to build a new software system. The definition of the TIOBE index can be found here.
看到自己學的語言,似乎是熱門的程式語言。 感覺上還不錯,看來這是適合投資的語言。
Reference:http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
2008年5月7日 星期三
騎車觀念
我是一位機車騎士,平常我騎車常常都是騎到汽車車道與機車車道的交接處,因為那邊我認為是的車流量是一個交界處,所以車流量是比較少,而且預測汽車的行車路徑,遠比預測一群機車的的,顯的容易多,當然遇到計程車及大型車輛,這點並不適用,雖然這樣的行車模式,相對車速必需快一點,但是我認為這樣的安全性+ 行車的舒適度是優於一般在路邊慢慢騎的騎士,原因是(1)台灣的紅綠燈跟紅綠燈之間通常行車速度約70左右,可以暢行一段路,免於一直停停走走。(2)汽車道的柏油路,通常比路邊的馬路平坦。 (3)騎在馬路邊,還有一個很大的風險,就是旁邊停的汽車,可以一個冷不防的開車門,這種意外,天天都在上演。
在連續幾天不停的雨勢,今早的天氣可以說是和煦而,而今天一如往常的上班,卻在行經承德路7段的時候(往台北方向),發生一件慘事,事情經過如下: 大家正等待紅燈的結束,準備催油門,駛去公司的路途上,首先我是在行道樹看到一位婦人,想說這婦人不會在綠燈的時候闖過馬路吧,接著我突然看到右邊突然有一隻小狗(灰白相間-可能是馬爾濟斯),一臉驚慌失措,在我右邊約1.5公尺處,此時的我是在行進中(時速約60km/hr),心中一想,這下不妙,果不出其然,當我轉頭回去看的時候,有許多機車汽車都在緊急煞車,看到機車騎士車輛打滑,人似乎騰空,也似乎看到,那隻小狗,好像被急煞的機車,撞到騰空的樣子,因為一切實在太快,根本來不及反應,只能希望一切都能沒事,如果這隻小狗是那位婦人的,那麼那位婦人真的應該受到處罰,不然那位機車騎士,可能就不會應此受傷,但話又說回來,當你看到一隻,狗狗衝出來,可能明知煞車來不及,到底要直接... ,還是緊急煞車賭個機會,正常人的反應應該都會煞車,但以實例來看,如果緊急煞車,可能自己會受重傷,狗狗也可能受傷,還有後面車輛的追撞,當下這時間很難去決定這一切,但這一決定可能影響你一生,當一個決定一定有人受傷的時候,要做一個完美的決定絕對不可能的,那怎樣的決定是對你最好的,就要馬上去決定,因為這可能會影響你一生。
2008年5月5日 星期一
反組譯 (.Net)
以前在寫C/C++的軟體,很少去考慮到反組譯的情形,因為反組譯之後的結果相當難懂,且直C/C++ 是以binary code在執行,所以這一類的軟體要寫的好的幾乎是很難找到,但是.Net, Java,這種高階語言,多了一層中間語言,.Net是IL(Intermediate Language),這樣反組譯的風險也增高,.Net Tools本身有提供Dotfuscator這個工具
,但是這個安全性並不強,真正的有心人士要破解這一個並不是難事,但總比完全沒有防護好,如果沒有防護,只要在網路上下載反組譯軟體,如: Lutz Reflector ,就幾乎能看到程式碼的全貌(如上圖,可以看到.Net 的實際時作),這種被別人看光光的感覺真的很不好,所以網路上也有人針對這問題,寫了不少軟體去防護,如MaxToCode, Ezirz,當然這些都是要錢阿,不過這些軟體也提供其他的進階功能,所以快想辦法把自己寫的軟體穿起衣服,因為被別人脫光衣服的感覺是不好受的。
2008年4月21日 星期一
拳王爭霸戰
這星期原本打算去士林夜市逛逛,沒想到卻看到百齡高中操場旁,好像有人圍觀,進而一看,沒想到竟然是拳擊比賽,但去的時間似乎已到了比賽的尾聲,不過卻是最精采的重量級比賽,紅色的拳擊手是北體的學生,藍色的拳擊手可能是社會人士,不過在開打時,藍色的呼聲很高,因為身高及手臂的厚實度都佔優勢,不過我知道拳擊其實移動速度是相當重要的,因為小時候是漫畫第一神拳迷,所以誰勝誰負還相當難說,沒想到第一回合就相當精采,紅色選手移動速度優於藍色選手許多,使得藍色選手都攻擊不到要害,反倒是紅色選手卻給了藍色的選手一擊正拳,讓藍色選手直接倒地,站起時又重心不穩,此時場內傳出劇烈的歡呼聲,因為我相信有90%的人都是抱著看精采鏡頭的人吧,反正被打的又不是我的這種心態,不過剛剛的倒地情形讓我已經確定是紅色獲勝,經過3~4回合的激鬥,在結束前的幾秒,發現兩位選手突然有放空,對看著對方的情形,我想是他們應該是很累了,所以才突然放空,最後比數是27比6,紅色獲勝。
這種拳擊比賽在台灣似乎不太盛行,不過看現場的感覺是熱血沸騰阿,縱使比賽選手的程度,比國際級或電視上看的,有相當大的差距,但或許這就是中國人的"溫和"吧,雙方都沒有使出大絕招,可能也怕見血吧,但看免錢的比賽的我,認為算是賺到了,回來之後查了相關新聞,5/25號還有一場比賽,若還是免錢的話我願意去看,因為聲光效果實在是很棒的。
相關新聞:
http://news.pchome.com.tw/sport/cna/20080418/index-12085251085405118007.html
2008年4月17日 星期四
C# 複製檔案進度列實作 (Copy file + Progress Bar)
應用程式常常會有搬移檔案的動作,但複製檔案時若沒有處裡,很容易造成使用者介面沒回應的畫面,此外若涉及複製大檔案,通常需要顯示進度列,便於使用者知道現在的複製進度,是要繼續下去或者是去取消,這一類的問題,有幾個要注意的問題(1)UI的同步更新問題,(2)非同步複製檔案的實作,我相信這問題已經是老掉牙的問題,但是我在網路上找到的例子大都是這一個使用C#在进度条中显示复制文件的进度 (大部分都是貼這個範例),我大概看過且稍為用了一下(我的開發平台是VS2008),發現有一個問題是他在更新ProgressBar的時候,會有InvalidOperationException[Cross-Thread operation not vaild... 的問題產生,這問題可以上Google稍微查一下就發現問題所在,所以我稍微改寫了一下,畫面及程式碼如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
int totalSize; //Total Size
int position; //Position
const int BUFFER_SIZE = 4096;
byte[] buffer;
FileStream fileWriteStream;
FileStream fileReadStream;
public Form1()
{
InitializeComponent();
}
private void ctrlCopy_Click(object sender, EventArgs e)
{
string strFile = "";
position = 0;
totalSize = 0;
OpenFileDialog openDialog = new OpenFileDialog();
if (openDialog.ShowDialog() == DialogResult.OK)
strFile = openDialog.FileName;
else
return;
// Reset Status in order to prevent another copying process
this.totalSize = 0;
this.position = 0;
if (this.buffer != null) this.buffer = null;
if (this.fileWriteStream != null) this.fileWriteStream.Close();
if (this.fileReadStream != null) this.fileReadStream.Close();
//Delete file which aready exists.
if (System.IO.File.Exists("c:\\copyedFile.bin"))
System.IO.File.Delete("c:\\copyedFile.bin");
this.fileReadStream = new FileStream(strFile, FileMode.Open, FileAccess.Read);
this.fileWriteStream = new FileStream("C:\\copyedFile.bin", FileMode.Append, FileAccess.Write);
totalSize = (int)fileReadStream.Length;
this.progressBar1.Maximum = totalSize;
//Copy file while larger than 4KB.
if (totalSize > BUFFER_SIZE)
{
buffer = new byte[BUFFER_SIZE];
// Async Invoke
fileReadStream.BeginRead(buffer, 0, BUFFER_SIZE, new AsyncCallback(AsyncCopyFile), null);
}
else
{
this.fileReadStream.Close();
}
}
// Asynchronously copy file
private void AsyncCopyFile(IAsyncResult ar)
{
int readedLength;
// Lock FileStream
lock (this.fileReadStream)
{
readedLength = this.fileReadStream.EndRead(ar); // When stream endread, get readed length
}
// Write to disk
this.fileWriteStream.Write(buffer, 0, buffer.Length);
// Current stream position
position += readedLength;
// Response UI
MethodInvoker m = new MethodInvoker(SynchProgressBar);
if (this.progressBar1.InvokeRequired)
{
this.progressBar1.Invoke(m);
}
if (position >= totalSize) // Read over.
{
this.fileWriteStream.Close(); //Close FileStream
this.fileReadStream.Close();
return;
}
// Continue to read and write
lock (this.fileReadStream)
{
int leftSize = totalSize - position;
if (leftSize < BUFFER_SIZE)
buffer = new byte[leftSize];
this.fileReadStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(AsyncCopyFile), null);
}
}
private void SynchProgressBar()
{
this.progressBar1.Value = position;
}
}
}
不過細看有一些細節的部份要處裡,如檔案小於4KB時要如何處理,若要將此方法包成物件,要如何用delegate or event傳給上層UI... 這些問題就交給各位看官嚕。 此外有些觀念也是很重要的,在此附上連結: http://www.cnblogs.com/c2303191/articles/826571.html
2008年4月14日 星期一
HtmlTextWriter 實作簡介
HtmlTextWriter使用動機
最近剛好在研究html由程式產生,發現在.net framework下有一個實用簡單的類別-HtmlTextWriter,藉由這個類別可以快速的由程式中寫出Html碼,命名空間是 System.Web.UI,如果在WinForm下使用,請引用(Reference)System.Web.dll。
HtmlTextWriter與Html32TextWriter
HtmlTextWriter支援Html4.0標準,而Html32TextWriter支援Html3.2標準,在msdn中一般不建議將採用Html32TextWriter,它為支援低版本的瀏覽器而設計的,所以建議採用HtmlTextWriter物件,由名稱上也可猜測這類別比較正統,沒有多餘的贅字。
TextWriter - StringWriter, StreamWriter 簡介
在介紹HtmlTextWriter使用前,必須先介紹一些相關的類別,因為HtmlTextWriter本身並不支援輸出的功能,必須由TextWriter的類別來實現輸出的功能。
TextWriter: 表示可以寫入一連串連續字元的寫入器,這個類別是抽象的。
StringWriter: 實作TextWriter以便將資訊寫入字串。資訊儲存在基礎 StringBuilder 中。
StreamWriter: 實作以特定的編碼方式將字元寫入位元組資料流的TextWriter。
HtmlTextWriter初始化
HtmlTextWriter在建構時必須要接串接TextWriter,本身不提供輸出的方法或屬性。
建構子: public HtmlTextWriter (TextWriter writer)
輸出成檔案
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter("C:\\htmlSample.htm");
System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(streamWriter);
streamWriter.toString();
streamWriter.Close();
在C:下可看到htmlSample.htm檔案
輸出成字串:
StringWriter strWriter=new System.IO.StringWriter();
HtmlTextWriter htmlWriter=new HtmlTextWriter(strWriter);
獲得輸出結果 string result = strWriter.toString();
HtmlTextWriter常用方法
1. void RenderBeginTag(HtmlTextWriterTag tagKey)
用於Html開始標籤,如<body>,HtmlTextWriterTag是列舉類別,內部有所有Html 4.0的列舉標籤,如果要增加body標籤,就是RenderBeginTag(HtmlTextWriterTag.Body)
2. void RenderEndTag()
與RenderBeginTag對應,有幾個RenderBeginTag就必須有幾個RenderEndTag。如下面的例子:
<html>
<head></head>
<body></body>
</html>
上面一段是html基本架構,使用HtmlTextWriter生成就是
htmlWriter.RenderBeginTag(HtmlTextWriterTag.Html);
htmlWriter.RenderBeginTag(HtmlTextWriterTag.Head);
htmlWriter.RenderEndTag(); //End of Head
htmlWriter.RenderBeginTag(HtmlTextWriterTag.Body);
htmlWriter.RenderEndTag(); //End of Body
htmlWriter.RenderEndTag(); //End of Html
3. void AddAttribute()
用於增加標籤的屬性,例如<img>標籤的url屬性、width屬性等。注意:AddAttribute必須出現在RenderBeginTag的前面
ex:
htmlWriter.AddAttribute("url","../xxx.gif");
htmlWriter.AddAttribute("width","50");
htmlWriter.AddAttribute("height","50");
htmlWriter.RenderBeginTag(HtmlTextWriterTag.Img);
htmlWriter.RenderEndTag();
輸出: <img url="../xxx.gif" width="50" height="50" />。
4.void AddStyleAttribute()
由於Html並不是很嚴謹的語言,所以上面的函式就可實作所須輸出的字串,但建議還是採用以下範例,以下3個例子,所產生的字串都相同,也能正確輸出
(a)
htmlWriter.AddAttribute("style", "margin:0px; color: #ff0; overflow: auto");
(b)
htmlWriter.AddStyleAttribute("margin", "0px");
htmlWriter.AddStyleAttribute("color", "#ff0");
htmlWriter.AddStyleAttribute("overflow", "auto");
(c)
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Margin, "0px");
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Color, ""#ff0");
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Overflow, "auto");
輸出: Style="margin:0px; color: #ff0; overflow: auto"
我採用的是第三種方法,是因為它有提供對應的列舉,不想全部手動自己寫。
5. void Write()和void WriteLine()
產生Html標籤以外的所有信息。
此外,若是從WinForm上的顏色轉換到網頁上的顏色,可採用此函式System.Drawing.ColorTranslator.ToHtml(Color c);
實作 Web 跑馬燈
private void SaveMessageToHtml1(string htmPath)
{
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(htmPath);
System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(streamWriter);
// Html
htmlWriter.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.Html);
// Head
htmlWriter.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.Head);
htmlWriter.RenderEndTag(); // End of Head
// Meta
htmlWriter.AddAttribute("http-equiv", "content-type");
htmlWriter.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Content, "text/html; charset=UTF-8");
htmlWriter.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.Meta);
htmlWriter.RenderEndTag(); // End of Meta
// Body
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.FontFamily, "Arial");
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Margin, "0px");
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Color, System.Drawing.ColorTranslator.ToHtml(Color.Yellow));
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.BackgroundColor, System.Drawing.ColorTranslator.ToHtml(Color.Black));
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Overflow, "auto");
htmlWriter.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.Body);
// Marquee
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Position, "relative");
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Top, "25%");
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Height, "100%");
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.FontSize, string.Format("{0}px", "20"));
htmlWriter.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Overflow, "hidden");
htmlWriter.AddAttribute("behavior", "scroll");
htmlWriter.AddAttribute("direction", "left");
htmlWriter.AddAttribute("loop", "-1");
htmlWriter.AddAttribute("scrollamount", this.scrollOffset.Text);
htmlWriter.AddAttribute("scrolldelay", this.scrollDelay.Text);
htmlWriter.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.Marquee);
htmlWriter.Write("Hello! This is Web Brower-Marquee");
htmlWriter.WriteLine();
htmlWriter.RenderEndTag(); // End of Marquee
htmlWriter.RenderEndTag(); // End of Body
htmlWriter.RenderEndTag(); // End of Html
streamWriter.ToString();
streamWriter.Close();
htmlWriter.Close();
streamWriter.Dispose();
htmlWriter.Dispose();
// 除錯用
System.Diagnostics.Process.Start("IEXPLORE.EXE", htmPath);
}
Reference:
http://www.cnblogs.com/tonyqus/archive/2005/02/15/104576.html
MSDN
2008年4月8日 星期二
SQL Server 2005 Backup 介紹
最近對SQL Server的備份有些需求: 希望能夠定期備份資料庫,且希望備分檔名是XX_yyyyMMdd.bak 的格式,這樣輩分的檔案就會對應備份的日期,不會被抹寫掉,此外還要能夠備分到另一台主機上。
我的平台是SQL 2005,備份的方式其實很簡單,首先先簡易說明SQL提供的備份方式,有下列四種:
SQL Server provides four different methods for backing up your database:
- A full backup makes a complete backup of your database. You will almost always need to start your backup strategy with a full backup of your database.
- A file backup is useful when your database is so large that a full backup would take too long.
- A transaction log backup creates a copy of all changes made to the database that are currently stored in the transaction log.
- A differential backup stores all changes that have occurred to the database since the last full backup.
我這邊僅介紹第一種full backup,這種方式不適合資料量很大的資料庫,操作方式如下。
針對要備份的資料庫,點擊滑鼠右鍵,會跳出選單,選擇紅框部份,進入畫面後,選擇下圖紅框部份
接著,就會進入編輯備份的工作,重點在於Steps的選項中,必須新增新工作(實際要備份的工作),
這邊可以編輯Script做進階的動作,而我備份的檔名正好需要用到此功能,以下是我備份到本機的方式。這邊有一個小細節要注意,N這個參數代表是本機磁碟的意思,所以一定要有的,此外單引號要注意,不然也會有錯誤。
下圖是我備份到網路磁碟的方式。
接著設定排程都有介面可以設定,這邊也不再贅述。這樣就簡易的設定可以完成一個簡單的備份工作。
此外,設定完成後,實際執行此工作是由SQL Server Agent完成的,可以觀察到Jobs多了一項剛剛新增的工作,如果想測試剛才的設定是否可以正確執行,可以選擇Start Job就會執行此項目的設定,若有錯誤則可以觀看歷史紀錄檔,也可以以進入屬性進行修改。
參考連結:
http://www.devx.com/getHelpOn/10MinuteSolution/16507/1954
2008年4月7日 星期一
DirSync 備份軟體介紹
先前跟同事買了一台IBM T42 MB,由於在這台筆電上花的時間越來越多,而且思考到如果在此台NB 開發新的套件或模組,一但只要電腦不小心毀損,那裡面的心血結晶,不就附諸流水,所以備份是很重要的,但又不想每次是思考我哪些東西備分過哪些沒有備份過,用"純手動"的方式備份,每次都這樣備份會令人抓狂,所以今天介紹一個備份軟體 DirSync,簡單又實用,而且是不用安裝的綠色軟體,首先,你必須建立job,一個job代表一個備份的事項,你可以針對job設定備份的方式,目前提供的方式有五種,但最常用的是(a)(b),將有新增的部份做備份及更新,ex:從NB備份(source)到PC or USB HD(target),source有的檔案是a b c d 這三個檔案,而d這個檔案從source被刪除,target有a c d的檔案,則選用(a)選項,那備份後target,則會有 a b c d 這四個檔案,可是若選擇(c),則target 只會有a b c 這三個檔案,選項(d)則是可以source - target 互相備份,選項(e)是用來還原,允許較舊的檔案複寫較新的檔案,每個選項下都會有說明,所以並不會很難懂,此外也支援排程的備份功能,若有這需求的人不妨去試試。






