2010年12月29日 星期三

能夠自行設計權限管理的元件嗎

最近開發使用其他公司開發好的工具,這個工具提供多個不錯的元件,不過如果經費有限的專案可能買不起這個工具,但是開發時程通常是考量的因素,因為經費有限所以時間更加緊迫,這個工具提供權限管理的功能,除了能夠管控網頁程式之外,也能夠管控檔案(沒有權限連圖片都不能存取),目前的需求詳細到要求能夠控制網頁程式裡面的按鈕或資料,可惜就我所知這個工具並沒有提供到這種程度。
有可能已經有這樣的產品出來了,只是我沒有找到而已。如果工程師能夠用自己的方式開發程式,到最後權限的部分統一放在MasterPage,權限採用矩陣的方式呈現出來,從資料面的角度,不只針對網頁程式,更可以列出網頁程式內的按鈕勾選是否顯示或使用,從使用者的角度,帳號管理機制不管是自行撰寫的,還是使用微軟提供的,都能夠輕鬆的整合,最好開發成ISAPI的形式,這樣效率比較好,但是如果出錯會危害整個IIS…。

如何顯示一份多頁的報表

日劇TRICK 圈套上田次郎教授的著作「為何不盡力做到最好呢(Why don't you do your best?)」提醒我隨時都要保持年輕的心,要跳脫出自己既定的思維。
專案之中用到SSRS,最近在撰寫報表規格說明時才想到這個問題,一份報表可能包含很多頁的報表,也就是一份報告不只有封面而已,還有目錄、內容等,我知道Crystal Reports能夠達到一份報表多個頁面,我覺得SSRS好像也能夠達到這種程度,但是我目前的功力只能一份報表一個頁面。
下圖是目前一份報表二個頁面的做法,先查詢第一頁,第二頁在依據第一頁的編號找到對應的頁面(第二頁可能沒有內容)


正面的預覽


背面的預覽


我的想法是按下預覽之後,條列出符合的資料,當使用者點選超連結之後才出現報表,將第一頁與第二頁合併之後出現在使用者面前,如果沒有第二頁就只出現第一頁。
2010/12/31補充
將正面報表加入子報表,來源指向背面,由於資料超過一頁,加上資料頁群組分頁等因素,不需要修改程式就能夠達到正面、背面交替出現的報表。

2010年11月23日 星期二

使用Firebird代替InterBase

Firebird是InterBase的Open Source專案,為什麼會有使用Firebird的需求呢?因為需要用到IBLocal資料庫,但是使用SQL Explorer卻發生找不到GDS32.DLL的錯誤,想知道除了安裝InterBase之外,是否有其他解決方法,網路上都推薦使用Firebird代替InterBase,抱著姑且一試的心態,重新啟動電腦後,輸入預設的密碼masterkey就可以使用。從SQL Explorer -> Object -> Version Information可以知道安裝之後多出GDS32.DLL,我想這就是可以使用的主要原因。

2010年11月22日 星期一

工程師的自我修養-協助面試

所謂「協助面試」是指提出一些問題,讓主管們藉由面試者的回答決定是否錄取面試者,通常能夠參加面試,算是主管對自己的肯定。
通常我會提出的問題,包含工作上曾經遭遇過的問題、履歷與自傳的問題、與工作需要具備專業的問題,我會把握每次面試的機會,和面試者進行經驗的分享,就算沒有機會當同事,至少透過這次面談累積自己的專業知識。

2010年11月19日 星期五

做球給其他的同事

有時候只是心情的問題而已,就會讓同事更願意幫我們的忙。這是我從B君身上學到的,有時他會詢問其他的同事,跟經理報告時他總是會說「還好C君剛才幫我的忙」類似的話,幫他忙的同事當然心情會好,以後他有問題時更願意全力協助。
當然做球給其他的同事,這是發至於內心的感動,在與主管報告時,可以在他面前感謝同事幾句,對同事而言,無意間聽到辦公室的耳語,會覺得同事值得幫忙;對自己而言,少了鋒芒畢露卻多了些謙虛。

2010年11月3日 星期三

工程師的自我修養-灌資料

向周星馳電影「喜劇之王」致敬,讓我看見什麼是敬業精神。
根據E君的說法,使用Excel整理需要匯入的資料,您整理的技術越好,後面需要花費的時間越少,所謂技術好就是會使用VLOOKUP或HLOOKUP整理成為代碼、資料剖析拆解資料、整理資料成為多個資料表、樞紐分析表剔除重複,使得左邊與上面的資料唯一,並且分析資料例如加總等、取消「合併儲存格」。
(感謝E君提供上述使用Excel整理資料的方法,並且感謝您這些日子以來的幫忙。)
VLOOKUP 函數

複製貼上:
根據E君的說法,SQL Server 2000的SQL Server Enterprise Manager不支援此功能。

使用OPENROWSET:
撰寫Transact-SQL協助匯入資料,必要時需要將查詢結果回寫至Excel。

DECLARE cursorXXX CURSOR FOR SELECT A,B,C,D,E FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=Yes;IMEX=1;Database=C:\refTest.xls', 'SELECT * FROM [Sheet1$]')


使用SSIS(SQL Server Integration Services):
沒有用過,接近撰寫匯入程式,但是搭配GUI感覺上又比較簡單,擁有.NET Framework平台的支援,上述兩種方法只適用於偶而的需求,如果是經常性的需求,建議使用這個方式或是自行撰寫匯入程式。
dotNET 技術聖殿-部落格: SSIS功能體驗(一)、匯入EXCEL檔案

2010年11月2日 星期二

希望opener幫我們做一些事情

opener是指JavaScript的「window.opener」。
opener在我的理解是開啟子視窗的父視窗,會用到opener通常是我們在子視窗希望父視窗幫我們做一些事情,例如開啟子視窗進行編輯,希望關閉子視窗時同時能夠更新父視窗;或是開啟子視窗條列資料,按下子視窗的編輯後會關閉子視窗,父視窗會跳到資料編輯頁面。上述兩個功能很直覺就會想到用「window.opener.location.href」,但是在IE會有問題。
Object window.opener.location.href is malfunctioning in IE8
window.opener.location.href do not work with Win7 and IE8
我的解決方法是子視窗關閉前呼叫以下函數。

window.opener.execScript("__doPostBack('" + eventTarget + "', '" + eventArgument + "')", "JavaScript");

這個函數會呼叫父視窗執行__doPostBack(),此時在父視窗我們可以在Page_Load(),依據參數將頁面導到其他頁面。

如何轉移本機資料表的部份資料

有時候需要轉移部份資料至其他機器上面,懶得重新輸入就會用以下方法。
在SQL Server Management Studio Express。

  1. 「編輯」需要轉移的資料表

  2. 修改資料表名稱,我會將原本名稱後面加上Test成為一個新名稱。

  3. 「執行」


產生這個資料表的目的是為了保留需要的資料。

USE ABCDB
INSERT INTO ABCTest SELECT * FROM ABC WHERE Code = '05' OR Code = '06'

最後使用Microsoft SQL Server Database Publishing Wizard匯出成為SQL檔案,注意匯出之後請務必檢查有沒有DROP或DELETE指令。

2010年10月27日 星期三

SQL Server竟然不區分大小寫

之前B君在測試部署E君的程式時,居然出現錯誤,花了很多時間找到是大小寫的問題,當時我不以為意,認為反正程式在我的電腦上可以執行就可以了,況且當時年底有很趕,誰會在意這些雞毛蒜皮的小事呢?事情經過了一年,又到了年底,這次換我需要SQL Server區分大小寫,因為指紋機廠商將代碼分為I與i,我納悶為什麼我的SQL Server無法區分大小寫呢?上網找資料才知道原來是定序的問題。
簡單來說,CI不區分大小寫,CS區分大小寫。
碗 & 筷: SQL Server 定序設定

2010年9月6日 星期一

移動偵測打蟑螂遊戲

BugCamSmash – Motion Detection with Silverlight 4 Beta
BugCamSmash – Motion Detection with Silverlight 4 Beta
因為Silverlight 4 Beta提供WebCam的支援,所以作者撰寫這個程式,除了附上程式碼之外,還加入幾篇教學文章,以下就是這些教學文章的連結,很可惜最重要的地方並沒有文章加以說明。
Dissected part 1 – Smash a Bug
Dissected part 2 – Make the Bugs Crawl
Dissected part 3 – Give the Bugs Brains
作者在文章中有提到需要安裝Silverlight 4 Beta才能執行程式,其實下載作者提供的程式碼,並且修改CaptureImageAsync()那部份程式就可以執行了。
確定 Silverlight 應用程式能與 Silverlight 4 搭配運作

2010年8月31日 星期二

Silverlight 版本的線上小畫家-與縮圖進行互動(續)

縮圖在我前一篇文章的定義是全景圖,利用縮圖可以快速移動,並且可以瀏覽全景,因此縮圖只需要變成圖片,讓縮圖與原圖的座標相同,並且在原圖變動時,縮圖也即時更新。
因為縮圖只是圖片,不包含其他物件,所以無法在縮圖上面選取物件,檢視或設定屬性等動作,最經典的範例就是世紀帝國,縮圖上面將每個物件都使用帶有顏色的小圓點分組,你可以選擇縮圖上面的物件並且給予命令,因為我是使用Scale的方式縮圖,所以整個座標系統都縮小了,再加上FindName可以讓你從物件名稱取得物件,縮圖與原圖的物件都有對應關係,因此縮圖被選取,利用物件名稱可以找到原圖物件,我想這樣應該就達成我們的目的了。

2010年8月30日 星期一

Silverlight專案部署環境設定

  1. 資料夾選項 -> 檢視 -> 「取消勾選」使用簡易檔案共用(建議使用)
  2. ASPNET、NETWORK SERVICE、IUSER_、IWAM_「完全控制」(這個很危險,請根據需求自行設定權限)
  3. 將副檔名為CS的檔案移至App_Code(在原本的專案,WCF的SVC檔案與CS檔案位於同一個目錄中)
  4. 設定Web_tracelog.svclog(除錯用途)
對我而言,部署其實很浪費時間,希望大家能夠在這方面少花點時間。

2010年8月13日 星期五

下一個平哥

平哥在C君進來之前就已經離開,C君不曾見過他,也沒有聽過他離開的理由,不過今天他知道了,因為C君他犯了平哥犯的錯誤「程式我測試過了阿!都沒有問題阿!」,C君緊接著說「不信我開我電腦裡面的程式執行給你看!」。
老闆突然在開會時,告訴C君自己所聽到其他經理敘述的事情「程式C君都測試過了,C君說都沒有問題,可是我們執行都出現問題!」,並且告訴C君平哥離開的原因,是因為這樣而導致合作不愉快,C君很慶幸老闆願意幫助他,在他這麼年輕就找出這些問題,最後C君在開完會後,跟自己支援的經理與工程師道歉,並且提出以後預估時程時,會列出系統部署的時間。

2010年8月12日 星期四

Microsoft Access Database Engine 2010 可轉散發套件

Microsoft Access Database Engine 2010 可轉散發套件
  1. Microsoft.ACE.OLEDB.12.0
  2. AccessDatabaseEngine_X64

2010年7月26日 星期一

SSRS匯出Excel格式的問題

SSRS匯出Excel會跑版,報表在PDF格式是一頁,結果在Excel預覽列印時會變成兩頁,就算是欄位很少的報表也是一樣,與同事討論之後,發現可以使用UNIX裡的Pipe概念,SSRS的輸出是NPOI的輸入,最後再輸出至前端,相當於都讓SSRS做格式的輸出,最後請NPOI調整Excel的設定,要不然就只能使用其他軟體廠商開發在SSRS上面的Render元件,或是自己重寫某個Render。
以下的程式碼是NPOI如何接收SSRS輸出的程式碼。

byte[] bytes = ReportViewer1.ServerReport.Render(
"Excel", null, out mimeType, out encoding, out extension,
out streamids, out warnings);

MemoryStream msExcel = new MemoryStream(bytes);
HSSFWorkbook workbook = new HSSFWorkbook(msExcel);

[MSDN Magazine]Display Your Data Your Way with Custom Renderers for Reporting Services
How to Change the Default Rendering on SSRS

2010年7月18日 星期日

Silverlight 版本的線上小畫家-與縮圖進行互動


縮圖不只是將圖片縮小而已,並且座標也會跟著縮小,例如縮圖紅色矩形左上角的座標,與原圖紅色矩形左上角的座標相等。




下圖左上角是縮圖,我希望在縮圖上按下滑鼠左鍵時,在ScrollViewer上的原圖會移到這個區域,當我在原圖上面進行繪圖時,縮圖的內容也要跟著改變。





初次產生縮圖時,需要設定縮放比例。

ScaleTransform scaleScaleMap = new ScaleTransform();
if (ScaleX >= ScaleY)
{
scaleScaleMap.ScaleX = ScaleX;
scaleScaleMap.ScaleY = ScaleX;
}
else
{
scaleScaleMap.ScaleX = ScaleY;
scaleScaleMap.ScaleY = ScaleY;
}

ScaleMap.Background = imageBrush; ;
ScaleMap.RenderTransform = scaleScaleMap;


當原圖有改變需要更新縮圖時,呼叫UpdateScaleMap(),其中WriteableBitmap有Transform參數可用。

void UpdateScaleMap()
{
if (ScaleMap.Visibility == Visibility.Visible)
{
WriteableBitmap bitmap = new WriteableBitmap(TracingPaper, null);
ImageBrush ib = new ImageBrush();
ib.ImageSource = bitmap;
ScaleMap.Background = ib;
}
}


C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十一)制作精美的Mini地图① - 深蓝色右手 - 博客园

2010年7月16日 星期五

Silverlight 版本的線上小畫家-ScrollViewer的捲軸

現在有個新的需求,使用者希望建立或移動小畫家上面的物件時,捲軸也能夠跟著移動,這樣操作起來比較人性化。

//向右移
if (e.GetPosition(ImageViewer).X > ImageViewer.ViewportWidth - 10)
{
if (ImageViewer.HorizontalOffset != ImageViewer.ScrollableWidth)
{
double doubleHorizontalOffset = ImageViewer.HorizontalOffset;
if (doubleHorizontalOffset + 10 <= ImageViewer.ScrollableWidth)
{
doubleHorizontalOffset += 10;
ImageViewer.ScrollToHorizontalOffset(doubleHorizontalOffset);
}
else
{
ImageViewer.ScrollToHorizontalOffset(ImageViewer.ScrollableWidth);
}
}
}

2010年7月1日 星期四

不是「不對盤」,而是「爹不疼娘不愛」!

C君在開會時又被老闆電了。開會時大家都為著專案,從不同的角度切入問題點,有點火氣在所難免,但是C君與老闆的互動總是覺得有些不同,讓人覺得彼此有些不對盤,然而在我看來並非如此。


新同事對於專案的某些功能短時間內無法完成,老闆不但體諒他是新人,並且還打算將部分工作外包;對於C君,好像…對他有比較大的期望,因此對於他的要求比較嚴格。在我看來C君救火隊的角色依然努力認真,相信總有一天能夠得到大家的肯定。


套一句小K的一句話「太慢了,得快點做出一些成績才行!」,C君,我會跟你一起加油的!

資料庫中已經有一個名為 'PK_AgrRRRF01' 的物件。


因為用SQL建立資料表時,PK_AgrRRRF01發生重複,逼迫我將PK_AgrRRRF01改成PK_AgrRRRF01_2,雖然資料表建立成功,可是我仍然心有不甘,想要知道是那個資料表佔用這個名字,於是我下了以下指令搜尋:


SELECT name, object_id, OBJECT_NAME(object_id) AS object_name, parent_object_id, OBJECT_NAME(parent_object_id) AS table_name
FROM sys.objects
WHERE type = 'PK' AND name LIKE '%PK_AgrRRRF01%'
ORDER BY name ASC


其中OBJECT_NAME()傳回結構描述範圍物件的資料庫物件名稱,name是物件名稱,object_id是物件識別碼,parent_object_id是這個物件所屬的物件識別碼(0 = 不是子物件)。


參考資料
sys.objects (Transact-SQL)

2010年5月27日 星期四

要如何協助別人除錯呢

協助別人除錯我習慣先自己測試,等到找到問題時才,這樣一來可以避免浪費他人時間,再來自己也不會緊張。可是如果是老師在講台上解題,就不可能自己悶在講台上不說話解自己的問題,相反的就要將解決問題的思考步驟說出來,一方面說給自己聽,提醒自己下一步要如何進行,一方面要提醒同學在思考中需要注意的地方。說真的在辦公室睡睡念會被同事討厭,好像自己在做事情要讓其他人知道似的,特別是位置距離很近。在辦公室有問題就該提出來,一方面提問的人會讓人覺得有在思考,一方面被問的人會認為被重視,當然前提是發問的人有作過功課,畢竟希望藉由討論的方式讓提問與方問方都獲得知識。

2010年5月26日 星期三

說話有時會透露自己的內心世界

C君跟新同事分享專案用到的工具,同事不安地問道「前輩,人家以後是不是要負責目前專案底下的系統呢?」身為前輩的C君說道「不一定啦!說不定會負責…我想一下…」,此時C君不小心將自己負責的專案名稱脫口而出,心想「被發現了!」,沒想到其他同事也紛紛說出自己負責的案子。

2010年5月24日 星期一

Silverlight 版本的線上小畫家-存檔

Is it possible to save the Canvas with "children" on the server
Photoshop存檔時,可以選擇儲存成為Photoshop的格式,或是匯出成一般圖片(例如JPEG)。這個概念仍然可以用在線上小畫家,目前我是用Silverlight 3的類別存檔,在畫布上面的物件(例如矩形等)會被結合成為一張圖片,主要的程式碼如下。

WriteableBitmap bitmap = new WriteableBitmap(TracingPaper, null);

可是如果要達到類似Photoshop的功能(圖層疊疊樂),這個方法就不行了,不過方法並不難,主要的方法有二,一是存成XAML格式,不過存檔很不方便,開啟舊檔時也要重新解析,目前我還沒有找到解析的方法,另一是存在資料庫內,這是我決定採用的方法。
讀檔時首先利用雜湊演算法計算出圖片的雜湊值,並且搜尋資料庫是否存在,如果存在則傳回陣列並且動態建立繪圖物件與加上事件,存檔時將幾個必要的屬性值傳回後端儲存,並且刪除之前存在資料庫的屬性,至於屬性的資料列可以設計成(屬性A, 屬性B, 屬性C)或是(屬性名稱, 屬性值)的方式,我採取後者,因為這種方式彈性較大。

存檔資料庫設計畫面


讀檔示意畫面(紅色與藍色框框都會從資料庫中讀出來)

2010年5月22日 星期六

聯銓的Smart eVision

認識Smart eVision
最近去聽聯銓的Smart eVision,除了認識他們BI的解決方案之外,還見識到華麗的3D效果,身為工程師的我當然會想知道這個立體效果是怎麼做出來的。
後來找到Animated Perspective Transform,不過可惜沒有程式碼。

Silverlight立體效果 (遠近景深轉換)
Perspective Transform Laboratory
Silverlight 一点透視図法によるグラフィクス
透視畫法的影片教學
Perspective 3D in Silverlight 3

2010年5月21日 星期五

無法開始偵錯。未安裝Silverlight Managed偵錯封裝。


之前專案用到Silverlight 3,使用Visual Studio 2008 SP1 的 Microsoft® Silverlight™ 3 Tools,沒想到最近開舊專案編譯時竟然出「無法開始偵錯。未安裝Silverlight Managed偵錯封裝。」,後來找到Question on SIlverlight 3 debugging,發現其實是自己安裝新版的Silverlight 4,導致無法除錯,後來反安裝新版的並安裝Silverlight 3 Developer Runtime,就可以正常除錯了。

2010年5月20日 星期四

SSRS設定數字和時間格式選項


這個功能位於「文字方塊屬性」「數字」底下,與Excel的「儲存格格式」「數值」類似,設定格式之後我們切換到「自訂」。
此時會看到「自訂格式」的內容為「#,0.00;#,0.00-」,如果原本的值「-2」要呈現為「2(負數)」,此時負數「12,345.00-」就要改為「#,0.00;#,0.00(負數)」,「零的顯示方式」也可以使用這種方法自訂格式。

2010年5月14日 星期五

C#呼叫Win32 API

Calling Win32 DLLs in C# with P/Invoke
P/Invoke(平台叫用)什麼時候會用到呢?有時用到.NET沒有封裝(Encapsulation)的功能時就會用到。
1. 引用「System.Runtime.InteropServices」

using System.Runtime.InteropServices;

2. 在pinvoke.net左上方搜尋列輸入函數名稱,這裡就不用文章中的例子,使用「FindWindow」函數。
3. 搜尋到的結果有很多種,例如智慧型裝置上面也有類似的API(呼叫coredll.dll),但這不是我們需要的,我們在user32底下找到以下函數。

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

將這段宣告放在要呼叫的class裡面,或是你可以將.NET沒有提供的Win32 API自己打包成為一個類別。
4. 最後在事件或函數裡面加入這個函數。

2010年5月13日 星期四

網頁程式碼排版

Awesome code syntax highlighting made easy
這篇文章說明如何設定「程式碼排版」,以下簡單介紹設定步驟。
1. 在</head>之前加入以下程式碼,其中要編排C#需要引入shBrushCSharp.js,使用shThemeDefault.css風格排版。

<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/shBrushCSharp.js' type='text/javascript'></script>

2. 在</body>之前加入以下程式碼。

<script language='javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>

3. 在<pre></pre>之間加入你的程式碼,class="brush: csharp"可以替換成你需要排版的程式語言。

<pre class="brush: csharp">

</pre>

4. 如果要顯示HTML,可以使用Quick Escape轉換HTML標籤。

SyntaxHighlighter
Quick Escape