發表文章

[Cordova Hybrid APP] (二) 跨平台開發基礎認識

圖片
NET Developer有極大的比例都跟網頁開發相關,但目前市場主流都關注在行動裝置的開發,一般網頁設計師要轉各平台的APP原生程式開發勢必得付出不小的成本,PhoneGap(Cordova前身,下文一律稱為Cordova)已經在市場上行之有年,但以往都必須要另外安裝其它IDE開發工具,如Eclipse等工具來協助快速開發,今年微軟像是佛心來的,正積極的將Cordova收納到開發工具擴展套件中。 要學習Hybird APP,首先必須要先簡單的了解一下目前三種較常見的手機開發模式,Web APP、Hybrid APP、Native APP。

[Cordova Hybrid APP] (一) Visual Studio 2013開發跨平台APP環境設定

圖片
筆者最近這一年都忙著為公司進行專案導入,對於技術的研究沒有太多的著墨,最近 Ian哥 剛好到TechDays 2014擔任Cordova Hybrid APP開發的講師,跟他請教了一些相關的資訊,也重新燃起對於開發的熱情。 Cordova的前身也就是鼎鼎大名PhoneGap,2012那年剛上來台北的時就有與PhoneGap進行了第一次的親密接觸,但後來因為當時高效能的智慧型手機普及率不佳,加上需要針對各平台進行額外的開發設定等種種因素,因此就直接學習了原生程式的開發,最近Visual Studio 2013正式把Hybrid App納入了產品的功能(雖然目前還只是 CTP2.0版  ,尚有許多改善的空間,CTP3.0版已發佈,若先前已有安裝過2.0的話需移除,可參考 No.18 的說明),且目前幾乎人手一隻高階智慧型手機,再不考慮效能的情況之下,筆者本人也湊熱鬧的下載下來開發玩玩。 目前要開發 Multi-Device Hybrid Apps ,必須先安裝Visual Studio 2013,並且更新到Update3版,並且下載安裝 VS2013擴展套件 後才可以開始進行開發。雖然官方網站有特別說明如何安裝開發環境,但全部都是英文的,這裡還是簡單的說明一下設定步驟。

SQL幾種物理查詢邏輯

圖片
最近在查一個案例,使用者反應在查一個員工數比較少的請假資料的時候會出現錯誤畫面,查員工數較多的公司別的時候反而很快的就查詢出來了,當下一開始的直覺可能是資料面有問題,因此打開程式執行後發現該錯誤為ASP.NET畫面查詢SQL時等待過久timeout所導致,但這問題就來了,為何資料比較少查詢反而會timeout,資料較多的反而不會。 跟同事一起討論後大家一開始都覺的是Index的關係,因此就開始往錯誤的Index去查,結果查出了大學問(小弟我SQL方面的功力很破請見諒)。原來SQL Server在處理Join的時後,會跟據Join table的資料量、索引等…來決定使用不同的實體處理模式,SQL Server本身共有三種物理連接方式,【巢狀迴圈(Nested Loops)】、【合併聯結(Merge Join) 】、【雜湊比對(Hash Match)】。下面先簡單的說明三種連結的處理原則。

ReportServer中參考自定義Assembly

圖片
愚蠢的筆者在 2016/06/16為了解決報表矩陣的問題 ,發現根本不需要畫蛇添足的另外撰寫一個組件,報表本身就可以撰寫函式來處理此問題了,此篇文章僅留下當作參考外部組件的運用方式。 ================= 分隔線底下為原文 ================= 最近接近要發年終的日子了,但老闆們突然交待要將薪資條內的年終獎金和績效獎金的項目合併只呈現年終績效獎金,原本想說一個很簡單的東西,去薪資項目內修改名稱即可,沒想到薪資單列印的程式一打開,暈倒,竟然是寫死的,而且就連位置都是寫死的,我想一時半刻要調整也不是太大的問題,只是報表(rdl)的判斷式IIF會寫的很長很難寫,因此去詢問了有經驗的同事提到可以另外寫Function在提供給報表使用,下面說明一下設定的方法。 需求說明 1.只有年終獎金 -> 年終獎金項目顯示【年終績效獎金】 2.只有績效獎金 -> 績效獎金項目顯示【績效獎金】 3.年終績效獎金都有 -> 維持原先顯示項目【年終獎金】、【績效獎金】 

設計共用類別Transaction慎重使用

最近在設計一個較複雜的邏輯控制類別,因為內部較多SQL的存取所以為了方便起見,就在該類別所提供的Method當中包了Transcation,且在該Method的最後安插了一個Event(在尚未Commit之前)給使用者調用。 但這樣的設計上本身存在著一些陷阱,因為你無法預防使用者會如何使用你公開的Method,最近就遇到一個使用方式。 使用者在自己的Method內包了一層Transcation,在呼叫Component公開的Method,結果就發生了Timeout的事情,由這個經驗可以告訴我們,若再設計給其它第三者的API時,必須多考慮其它可能的使用方式。

NET產生PDF

圖片
NET本身沒有提供產生PDF的API,但在實務上不免會遇到需要產生PDF檔案的情況,因此網路上有人分享綜多產生PDF的方法,其中最常見的就是透過 iTextSharp 來產生PDF。但iTextSharp固然好用,但產生PDF必須透過程式的寫法來決定PDF各文字的位置,這憑空想像沒有視覺畫介面來輔助,在開發效率上實在是有點差,雖然網路上有人使用HTML來產生PDF,但確會有字型無法呈現等問題。 好加在NET本身雖然沒有辦法產生PDF,但是確可以透過ReportViewer控制項來達成這樣的需求,透過rdlc先拉好要呈現的報表畫面,再透過程式將資料來源將資料塞入報表中,就可以輕易的產生出PDF檔,要使用此功能必須先安裝【 Microsoft 報表檢視器 2010 可轉散發套件 】,下面我就大概說明一下要如何開發簡單的PDF下載。

SQL正負數排序問題(腦殘文)

圖片
今日再寫一個批次匯入的作業,有個需求是當更新時間一樣的時候,要判斷欄位的大小來決定排序的方式,而我想要的排序方式是當正數時遞減排序,當負數的時候遞增排序。先看一下我的資料結構如下圖。

DataTable幾種讀取資料的效能比較

圖片
DataTable迴圈的讀取方式一般常見的有for、foreach、 DataTableReader 這幾種,這三種方法各自運用或考量點會根據當時的狀況不同使用的方式也不同,因此這裡只是單純的進行三種方式的效能比較。 下圖為實際比較的結果,從數據上看在資料量少的時候,使用for迴圈再效能上是最優異的,但隨著資料量越來越大,foreach迴圈的優勢就慢慢顯現出來了,DataTableReader的效能則是最差的,但實際的使用情境還是要視情況來自行決定了。

GoogleMap API v2再見

Google 正式宣布 2013.11.19停止支援GoogleMap API v2的版本,全面迎向API v3,R.I.P~,不過也就是這樣先前使用舊版API v2的程式將全部失效。v3和v2的版本再程式上的寫法有很大的不同,所以幾乎沒有辦法調整些許的JavaScript語法就可以直接套用,至於修改了哪些部份就不在一一說明。

程式中使用ReportingService發送報表

圖片
Reporting Service一直不是我的強項,但最近因為需要發送一個報表給大老闆,因此稍為查看了一下Reproting報表的發送方式,意外的發現了一個先前自己都沒有用過的方式,一般而言,我們在使用報表伺服器來設定發送電子郵件都是使用訂閱的方式來傳送(下圖所示)。

Application閒置過久關閉

好久沒有寫網誌了,感覺這裡都快要生蜘蛛網了,今天朋友問了如何判斷一個WindowsForm表單閒置過一定的時間後,自動關閉程式,原本想說使用Form MouseMove & Form Click兩個Event加上Timer來判斷,時間到了自動關閉,但後來確發現要是Form上面有一個很大的Component占據了Form的頁面,這時候Form的Event將抓取不到。 後來發現Application本身有提供一個 Event Idle ,Idle本身在表單停止任何動作的時候會進入一次,如此一來就可以搭配Timer來處理關閉程式的動作了,相關程式碼如下,不過這裡還有一個地方需要注意, Timer在執行的過程中並不算系統Idle ,因此我下面的代碼做了點手腳,在Timer檢查的時候判斷的時間點要比Idle的時間點還要早100毫秒,這樣就可以巧妙的通過檢查了。

開發iOS後的一些感觸

首先,我必須承認我是一個Microsoft派的Programmer,且我是站在開發者角度來觀察,因此我的感觸可能會有些偏頗。 在還沒有接觸之前都只是從賈伯斯和User的說法來得知Apple的產品,他們口中的Apple的產品幾乎就是一個美感、高品質、高效能的代表。甚至幾年前我還從網路的文章中看過一段對話,A問:為什麼Apple電腦沒有防毒軟體? B答:因為麥金塔本身就是最佳的防毒軟體。

ASP.NET產生Excel的幾種方式

圖片
還記得剛跨進程式設計這個領域的時候,當時有處理到一個問題,使用者在Web上面產生Excel檔造成記憶體崩潰的問題。查看了程式發現那時候的開發方式是使用【 Excel 物件模型來存取 】,但這種方式主要是運用在單機使用上,若在Web上面使用常常會有很多問題產生,例如 : 記憶體無法釋放等問題。 那時候剛進行,完全不知道該如何解決,老闆只好請我跟微軟詢問該如何解決,得到的答案確是Microsoft 不建議在Server端使用直接存取 Excel 物件模型的方式來控制 Excel 檔案,後來因為某些因素就離開了該公司,也沒有解決此問題,這個問題變成我寫程式以來最挫折的事情。但很幸運的是,後來所接觸的程式開發,除了報表外(可以透過ReportViewer幫我們產生),要匯出Excel的檔案都不是很複雜的,因此都可以使用Html表格畫表在透過改變ContentType的方式來產生,日子久了也漸漸淡忘這個悲慘的往事 ~"~。

Android 開發GoogleMap專案

圖片
前幾天把一個先前已開發好的GoogleMap專案移到另外一台電腦上開啟,卻發現GoogleMap地圖沒有辦法正常work,找了好久才突然想起,若要在模擬器開發GoogleMap的程式必須先去註冊一組debug key(金鑰),這個很重要每次都忘記~"~。 在Android上面開發GoogleMap並不是直接接元件拉過去就可以使用了,必須先去註冊一組Key,而且模擬器和實體機器(發佈版本)的使用方式又有些許不同,下面我就記錄一下整個開發的步驟。

HTC Sense3.0待機(鎖屏or關屏)模式下無法使用Toast提示訊息

圖片
最近在開發手機來電監聽的APP,有個需求就是要有電話打進來的時候,要跳出客製的來電訊息,等到我一切在模擬器上面測試都OK的時候,放到實體機器上面測試,馬上就破功,電話打進來的時候毫無反應,一開始我想說會不會是Android的版本關係,於是我就換了其它版本的模擬器,還是正常可以正常執行,但是我在這時候發現原來實機上面是會運作的,只是在待機模式下面程式都沒有反應。

解決Reflection找不到繼承其它類別之類別

圖片
前幾天說明了如何使用dynamic來取代Reflection的功能,寫完文章後自己又玩了一下,卻無意間發現另外的問題,如果要操作的類別與繼承的類別並不是在相同的dll的話會取不到類別,dynamic與 Reflection的結果都一樣, 在發生問題的當下以為是namespance寫錯的關係,不過反覆調整了幾次發現都不是,於是就陷入了混亂的思緒,這時候就證明了當你以呈現混亂的思緒還是離開當下的環境比較好,回到家洗完澡後就想到一個問題,會不會是子類別讀不到父親類別的參考(雖然我編譯時期有參考)但是編譯成dll檔後它們並不互相認識,於是我就很天才的把兩個dll放在同一目錄底下,然後很開心的一試,還是掛掉(理所當然的吧),再把父親類別跟子類別放在同一個專案下編譯就正常,當下覺得很奇怪。

NET4.0新特性 dynamic

圖片
以往我們如果有一個dll檔,如果要使用C#來呼叫,我們都會使用反射(Reflection)的方式來呼叫相關的Methods,我先前也有一篇文章有提到關於 Reflection的基本操方式 。 最近因為因緣巧合的情況之下發現了NET4.0所提供的新特性 dynamic ,根據MSDN的說法  dynamic 型別可讓它發生所在的作業略過編譯時期型別檢查 ,講白話文的意思就是dynamic可以讓C#語法有了類似VB的特性弱型別語言的特性,宣告的時候不需要知道型別,且編譯的過程中編譯器預設也不會對dynamic進行檢查。

動態Included JavaScript的問題

圖片
在寫元件的時候常常會需要Included一些JavaScript檔,最近遇到一個問題就是需要Included一個jQuery檔案,但是NET所提供的【Page.ClientScript.RegisterClientScriptInclude】會把檔案放在<form></form> 中間,這樣一來會有一些問題產生。 通常我們在寫JavaScript的時候,會習慣把JS寫在 <head><head>中間,如果頁面中有用到jQuery的話,必須要把jquery.x.x.js檔放在自己寫的JS上面,不然會發生找不到物件的情形產生。舉個例子來說,最近要寫一個在iframe載入完畢後要自動調整寬高,理論來說這麼簡單的語法,只需要透過JavaScript就可以輕易達成了( 之前的文章也有提到 ),但最近發現先前所提到的寫法在不同瀏覽器計算出來的高度有誤,或者無法正常運作的情況產生,經過多次測試後發現,其實使用jQuery就可以輕易的取得我們所需要的iframe的寬高(測試幾個瀏覽器IE7,IE9,Chrome,Firefox都正常),於是我就想說寫一個IFrame的元件來用。

VS2005 連接 TFS2010 無法正常連線解決辦法

圖片
這幾天因為環境的關係,不得已必須使用Visual Studio2005透過Internet來連線Team Foundation Server 2010,但是VS2005預設是沒有安裝Team Explorer,所以沒有辦法連線,網路上找了一下資訊,發現 程湘之間 有教人家如何安裝,我就大概說明要安裝哪些東西

GridView轉出Excel時出現System.OutOfMemoryException 的問題

這幾天在改善系統問題時出現了 System.OutOfMemoryException 的問題,由於這個錯誤訊息提示的關係,直覺是記憶體不足嗎?所以到了Server上執行該程式並監看記憶體使用狀況,似乎沒有很誇張,Google了一下,保哥有提到遇到此問題的解決辦法,按照保哥的方式調整發現,問題還在,所以就是程是本身的問題了。 

T-SQL使用遞迴的方式來查詢同一資料表

最近要調整公司原有系統機制的時候,由於資料架構的關係不得以必須使用到SQL來遞迴查詢一些資料,一開始我的想法本來是跟程式的觀念一下寫一個Function然後遞迴呼叫自己,但想來想去覺得這樣好像怪怪的,資料量大的時候怕會有效能問題,於是就上Google查了一下,果然有SQL本身就有提供類似遞迴的語法(SQL Server2005 + 的版本才支援)。

Windows Phone 7 取得GPS訊號

圖片
要取得GPS的訊號主要是透過 GeoCoordinateWatche 來取得,下面的範例是一個簡單的取得經緯度的語法。

Windows Phone 7 開發GoogleMap基礎說明

圖片
1. 要開發Bing Maps App前,必須先到官網註冊一組程式中必須使用到的Key才可以繼續進行下一個步驟。 Register Key  畫面如下:

Windows Server 2008 安裝 Windows Phone SDK 7.1

圖片
Windows Phone SDK 7.1正式釋出了,但是微軟的 官網 明確的說明該SDK支援的作業系統為Windows 7或Windows Vista。網路找一下答案,果然有人分享如何破解這個限制,先說明一下 kylin 分享的是線上安裝的調整方式,我試著用一樣的步驟來執行離線安裝檔的方式會失敗,但是只要把線上安裝的baseline.dat Copy到離線安裝檔那,就可以正常運作了。

C# WinForm使用新字型

圖片
前幾天突然有個問題,以前如果我們需要一個新的字型要使用,我們會將下載回來的字型檔安裝到字型裡面後才繼續使用,但是問題來了,如果我寫了一支程式然後那支程式裡面需要使用到非系統預設的新字型,那麼我們就必須要想辦法讓動態的載入或者安裝字型,因此我上網搜尋了一下整理出以下幾種方式可以進行。