2010年5月12日 星期三

SyntaxHighlighter 讓文章的程式碼顯示行號

常常看到有些網友的文章,有關程式碼的段落都可以處理得很漂亮,原來是有個SyntaxHighlighter 好幫手。可以直接到 http://alexgorbatchev.com/wiki/SyntaxHighlighter 網站下載完整程式來測試一下。而以下則是一段簡單 Demo :

function getValue()
{
  var i=0;
  i=i+1;
  alert(i);
  
}  

套用了SyntaxHighlighter  JS 後,只需在想要呈現效果的地方,加上 <pre class="brush: html"> ... </pre>,就可以很輕鬆的完成,只是要等一會兒時間,效果才會出來,可能因為要下載比較多的 js 與 css 檔,所以沒有這麼即時。

接著紀錄自己修改 blogspot 的步驟。
1. 點選右上角的[自訂],並進入[版面配置],選擇修改 HTML。

2.在修改範本裡,找到 <head> 標籤,並在裡面加上以下程式:

<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css'  rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'></script>
<script language='javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>

3.最後按下「儲存範本」,如此,日後只要使用<pre class="brush: html"> ... </pre>,就可以出現顯示行號的效果了。

以前曾經介紹過 Blog 文章中貼程式碼,現在再推薦另一種顯示方式,可以多多比較。

【補充20101001】
在上述範例中,我過於信任作者每次 release 的版本應該是最新最好的,所以我都是參考他 current 的版本。但沒想到作者釋出 3.0.83 版後,畫面真的有點怪,行號出現的位置似乎都會亂掉,但發現許多網友使用舊的版本 2.x 版都還蠻穩定的,所以後來自己將原先使用 current 改為指定舊的版本 2.1.382 ,反而比較美觀。

可以參考作者歷次 release 的版本:
http://alexgorbatchev.com/SyntaxHighlighter/hosting.html


【補充20120214】
補充一篇德瑞克的說明。請參考:

接 store procedure 的回傳結果

如果已經有人寫好了一支共用 store procedure,他回傳值可能是:

欄位A   欄位B   欄位C
====     ====     ====
A001     A002    A003
B001     B002    B003
C001     C002   C003

那我們可能會建一個暫存資料表
去接收 stroe procedure 的回傳值。

create table #tmp ( fieldA  nvarchar(max), fieldB nvarchar(max), fieldC nvarchar(max) )

insert into #tmp ( fieldA, fieldB, fieldC)
exec mystoreprocedure

然而,如果共用的 store procedure 回傳了30 幾個欄位,如果用上述方法,就得建立一個30幾個欄位的暫存資料表。這作法真的會讓人很無力,且容易發生「 An INSERT EXEC statement cannot be nested 的錯誤訊息[注3]」。所以這情況,可以考慮 OPENROWSET[注1] 來完成。雖然共用的 store procedure 回傳了30幾個欄位,但我真正會使用的,可能只有其中二、三個。所以可以寫成:


SELECT com_empno,com_cname FROM
OPENROWSET('SQLOLEDB',
'.';'sql_account';'sql_password',
'exec swapdb.dbo.pr_Find_ITRI_BossID')

此外,有個重要的地方需注意,就是使用  OPENROWSET 時的查詢字串,一定要「常數」,不可以是「變數」。因此,如果你的共用 store procedure 需要傳參數進去,則不可以將查詢字串寫成  'exec swapdb.dbo.pr_Find_ITRI_BossID  '+@seqsn   (參考[注2])

如果遇到需要傳參數的 store procedure,則可以透過先宣告一個字串變數( declare @str),來組出 OPENROWSET 的所有指令,最後再用 exec 去執行它 ( exec (@str) )來完成,這樣就可以避開 OPENROWSET 的查詢字串,一定要「常數」的限制。



參考:
[注1]OPENROWSET (Transact-SQL)
[注2]OpenDataSource、OPENQUERY、OPENROWSET用法
[注3]An INSERT EXEC statement cannot be ne...
[注4]感謝 Ken 熱心指導

2010年5月1日 星期六

工作病

常見的工作病:

」:遇到棘手事情,都推給別人。
」:沒有執行力,老是愛拖延。
」:害怕不熟悉的事物,缺乏膽識。
」:明明自己沒出半點力,卻都吹噓是自己的功勞。
」:只顧自己爽快,不會替他人想想。


藥方一:在時間體力可負荷之下,樂當「Yes Man」。
藥方二:列出你的待辦清單,從最不想做的事情開始動手。
藥方三:功不唐捐。今天你的努力,會是明天你的資產。
藥方四:你今天撒一個謊,明天會用更多的謊言來掩飾今天的行為。
藥方五:心裡放不下別人,是沒有慈悲;心裡放不下自己,是沒有智慧。

仔細想想,自己好像也得了一些工作病了ㄟ...
這五種病,好像跟燙傷處理的 沖、脫、泡、蓋、送 很相似。