發表文章

手刻 JQuery,Linq to SQL,AJAX , C# 做修改與刪除(Part1)

圖片
寫程式使用Ajax已經是十年前ASP的事,當時沒有其他框架輔助,傳輸資料走的是XML,組合資料相當不方便。以現在而言,不論前端或後端,將DB資料組成JSON傳遞與解析都已經非常方便了。以下的專案用一個ASP.NET WebForm當例子,實作Ajax顯示與更新資料。 WebForm常常被看作懶人程式,因為技術門檻低、拖拉控制項就會有結果。可是ASP.NET本身的ViewState以及操作往返暗地傳輸的資料,當畫面複雜時,速度就會變得笨重,許多顯示事件都放在後製程式碼中也不好閱讀。雖說 Asp.NET MVC更直接改善了責任分離與可維護性,但針對既有的Web Form專案,還是值得去改善她。 步驟一:資料來源 在專案引入Entity framework,選擇從資料庫更新模型。雖說網路上有許多大神推薦Linq to SQL,但以個人建議,除非自己是DBA而且對物件的命名、架構、關聯都有高度掌握,不然後續架構的變化,會讓模型突然跑出一堆編譯錯誤。Entity framework本來就只是個協助將資料庫物件反過來「物件化」的捷徑,若是資料非常龐大或結構複雜,應該好好想一下才對。 例如有一個資料表叫SCHOOL,裏頭有全台所有大專院校的資料,每校一筆且有索引鍵;這種形式的資料透過Linq to SQL存取就變得十分容易。我們用一隻泛型處理函式(.ashx)來顯示Linq從db抓出的資料,然後以JSON回傳給呼叫的前端。實務上還要考慮:回傳筆數是否加個上限,以免DB被操爆了,然後是否要限制這隻泛型處理函式適合被哪幾隻呼叫?需要在有登入的前提下才能呼叫他。 首先,因為考慮要判斷呼叫者的Session,所以.ashx的開端要加上繼承SessionState。  public class GetOperator : IHttpHandler, System.Web.SessionState.IRequiresSessionState 然後,假設我們用學校代碼判斷回傳該校的人員,所以人員代碼要做點格式判斷。 在Ashx內讀取 Request,應該加上 context.Request。  string shno = context.Request .Form["SCHOOL"];         ...

Excel的大魔王:不可視字元(NO-BREAK SPACE, )

公司有許多同事Excel功力已臻化境,Vookup、樞紐分析等功能非常上手。但有時會遇到一個棘手的問題,某些客戶編號(學號)會對不到,或是排序時,明明同屬於一組單位代碼109的資料,卻被排序到不同的位置去。 一般而言,這是因為要拿來比對的兩個欄位之間 (1)資料型態不同 (2)比對的字串末尾夾雜著不可視字元。型態不同的問題,可以利用Excel的「資料剖析」將欄位裡的資料整欄選取,使其變成真正的數字或文字(光改儲存格格式是沒有用的)。但如果資料來自於網站複製貼上的文字,在每個欄位末尾可能藏著設計師放進去、美化表格的字元,肉眼保證看不到,這就超悲哀了。 通常可用的方法有: 1.用len()函數查一下字串的長度,例如儲存格 A1的值是109, len(A1)卻看到長度是4;不得了,後面有鬼。 2.如果已知資料長度固定,那麼資料剖析時選固定寬度,可以像切西瓜一樣從你要的長度位置切下去,後面的就不要了。 3.如果長度不固定而且數字文字混雜,,可以先用 clean()、trim()等函數清一次;如果不能奏效,只能用SUBSTITUTE這個函數將不要的可疑字元濾除。 以這次的案例而言,本來以為是夾雜空白字元,乾脆發狠利用Excel內的char()函數,從1-255組出ASCII全部的字元做比對。結果還是找不到(崩潰)? 後來想想,這個已知的不可見字元在字串末尾,用right(xx,1)可以找出來他的本尊,再用code()函數可以找出他的字碼。得出的結果是char(63),是個問號? 這個答案是錯的。最後看一下Excel還有個函數就叫unicode,可以依照字元查編碼,得出這個搗蛋鬼的真正樣貌是 UNICHAR(160),學名是不換行空格(NO-BREAK SPACE),人果然是他殺的。要取她的字元,則要用 UNICHAR(160)。 https://zh.wikipedia.org/wiki/%E4%B8%8D%E6%8D%A2%E8%A1%8C%E7%A9%BA%E6%A0%BC 由此,網路上流傳的特殊字元清除名單,在Excel中處理時應該略作調整。 Char(1),空字符NULL Char(9),tab Char(10),換行 Char(13),Enter Char(32),空格 Char(160)...

中文難字與 Html Entities (C#)

工作的環境中會遇到新舊系統交雜以及中文內碼轉換問題。 某系統為Big5編碼,用 Html Entities 儲存但超出Big5編碼範圍的unicode字元,存在資料庫內像是: 伃 瀏覽器顯示出來,會是人字旁的 伃 。 我的工作得把在另一套舊系統內,用非Unicode造字的姓名找出來。當初公司本來採用另一套造字管理程式。由於這些字的內碼沒有規則,對電腦而言跟天書沒兩樣,只能利用windows的輸入法整合器手寫,找到跟unicode內一致或相近的字體,丟到網路上查出Html Entity,再回存到資料庫。 現在機器學習成為顯學,本來想過要寫套圖形辨識來比對特徵,把舊有難字轉成圖片,找出unicode的字。後來發現實際執行上人工搜尋雖然笨,但已能滿足需求,只好把自動辨識的  side project  先擱在一邊了。 另外,必須找一部xp跟一部win7以上電腦做比較,確認big5的欄位有沒有字是混到unicode?要確認未來舊的難字系統關閉後,能不能忠實呈現難字。 一定有同行質疑,新系統的值幹嘛不直接存unicode?主要還是要考慮其他人用舊系統回溯查詢的問題。新的系統帶unicode,舊系統帶存有 html entity的值的欄位。這是又大又複雜的系統,所不得不做的考量。 由unicode的字查Html Entity,可以用轉換的;少量可以單筆試手氣,如: http://jicheng.tw/hanzi/search.php Html Entity 的大全集可再下面找到: http://jdawiseman.com/papers/trivia/character-entities-lots.html 此外,在網頁顯示時,瀏覽器會自動轉換成unicode顯示,但在匯轉成excel或csv時,帶出這樣的值會被當成亂碼。在C# 中,必須將其加以處理,但要注意的是,考慮專案跨平台的可能性,不要呼叫  HttpUtility.HtmlDecode , 而是使用 System.Net.WebUtility.HtmlDecode(texts); 可以得到相同結果,但有比較大的彈性。 參考出處: https://stackoverflow.com/questions...

小資族理財:重讀「有錢21招:寫給低薪族的理財觀念魔法書」

小資族理財:重讀「有錢21招:寫給低薪族的理財觀念魔法書」 《有錢21招:寫給低薪族的理財觀念魔法書》( 財信出版 ,2010 )是本出版很久的老書,在網路上可以找到許多內容摘錄與評論。但筆者覺得本書歷久彌新而且富有歷史意義。 首先,2008次貸風暴引發全球不景氣,許多高收益組合變成泡影。此時這本書強調的: 理財不是要變有錢,而是不要變窮,就顯得十分受用。 其次, 這本書是針對手頭資源不多的人的入門建議。想要獲得具體理財操作步驟的人,難免會有點失望,因為這本書不是要教你殺進殺出。也許更適合有一點點理財經驗但無法跳出窮忙困境的人閱讀。 本書原來的例子很多取自美國,因此以下的心得是以個人的經驗以及本土的例子重新改寫過。 一、理債 算清楚手頭有那些錢 有義務要付給別人 。避免「感覺有錢、真貧窮」。 不要被欠款利息拖垮。 超出負擔能力的借貸,在市場低迷時會加劇損失 (ex1:借房貸買股或買債券、卡債以債養債) (ex2:極端例子,如次貸風暴時部分民眾寧可棄屋不繳,因為房子貶值到低於市值,根本不值錢,還要付利息出去)。 二、節用 物質慾望少一點,用精心規劃的旅遊、家庭聚會....等生活上的 愉悅體驗 代替 物質享受 。 付得起的錢不要靠保險,保險只用來轉嫁不可承受的風險 (只要存款夠多,很多錢你都負擔的起。保費付出去你手頭的可支配現金就少了。 保險只用於轉嫁不可承受的風險(身故/全殘)。如果沒有扶養親屬[尊長或子女],壽險可能不需要) ※可參考劉鳳和先生的 平民保險王 從源頭減少固定支出 (個人註解:汽車、房屋等看似基本配備的物件,都須長期付出維護費,且需每年折舊) 手頭緊的話,要狠下心別考慮買房子或留錢給小孩,先考慮老年生活跟退休金。 小孩有無窮的機會,但是你活不好會拖累下一代(不要禍延子孫) 越老 存錢,越來不及 小孩可以辦學貸,你老了可是無錢可貸 要考慮到,你可能會活很久(不要禍延子孫,很重要) 三、 賺錢是基本, 存錢更重要 以台灣的例子,行有餘力的話多存勞退基金(雇主提薪資6%,個人可以自己選擇加扣薪資的6%),強迫儲蓄。還有最低保證收益與稅務減免。 (很多人搞不清楚 勞工保險金 跟 勞工退休金 是兩筆錢,沒有留意雇主扣除額被高薪低報的問題) 年輕時多存錢,到30歲以...

IIS記事兩則:上傳空間限制(MaxRequestLength) 與 錯誤追蹤紀錄不完整(LOG-FILE-MAX-SIZE-TRUNCATE)

圖片
Windows Server 的IIS 有個陳年舊案:系統為了安全與效能考量,會限制上傳檔案的大小。從多年前的4MB大小,演變到在.net framework可自行調整設定。若設的太保守,user上傳檔案超過限制,系統會直接噴錯誤。這靠try-catch會攔不下來,得從該部主機的事件檢視器裡才能觀察的到。 要解決本問題,以Server 2012而言的步驟如下: (1)首先要改 web.config內的 <system.web> 區段內的httpRuntime設定,在當中增加maxRequestLength屬性(請記得是將語法加到現有那一行內的內容,不是多複製一條貼上。這樣會造成網站不能運作)。 範例中8096的單位是KB。 < system.web > <httpRuntime targetFramework="4.5" enableVersionHeader="false" maxRequestLength="8096" executionTimeout="300" /> .....  </ system.web > (2)再者, 在IIS的要求篩選頁面的設定,點選右方藍色小字的 編輯功能設定。 允許的內容上限應比前述步驟一的httpRuntime略大一些。 另外,加上錯誤的處理程序會更好一些。讓Global.asax實作超出可容忍上傳大小的錯誤處理,避免噴出錯誤,而是重導到某個較友善的說明網頁。 protected void Application_BeginRequest(object sender, EventArgs e) {     HttpRuntimeSection section = WebConfigurationManager.GetSection("system.web/httpRuntime") as HttpRuntimeSection;     if (section != null)     {       ...

日治時期舊籍電子資料庫書目解題

台史所檔案系統 | 台灣研究古籍資料庫  |   台灣日記知識庫  | 公共資訊圖書館數位典藏  (戰後「民報」、報刊查詢) 國家檔案資訊網  |   檔案資源整合查詢  |    總督府公文類纂   (國史館台灣文獻館) 臺灣法實證研究資料庫    |  日治法院檔案資料庫  | 台灣文獻叢刊      台灣百年歷史地圖 淡新檔案數位典藏  | 淡新檔案數位圖書館  | 淡新檔案全文 南方資料  |  日治時期期刊影像  |  台灣政經資料庫 (戰後初期) 台南新報 國立台灣圖書館台灣學數位電子書 日據時期住所番地與現行行政區對照表 門牌地址查詢系統 重測前後新舊地建號查詢  |  新竹市 日文舊籍聯合目錄 http://192.192.13.206/cgi-bin/gs/wgsweb.cgi?o=dccw 台灣都市計畫(德州大學圖書館) http://www.lib.utexas.edu/maps/ams/formosa_city_plans/ 福爾摩沙影像 https://rdc.reed.edu/c/formosa/home/ 國立公共圖書館 http://das.ntl.gov.tw/sp.asp?xdurl=sp.asp&spurl=xdcm/query_for_front/search/search_ad.jsp?dtd_id=000038&ctNode=344

Epplus 設定 excel 儲存格顏色、儲存格內文字變色 (set cell color)

Epplus 是好用的.net 讀/寫 Excel套件。當中有個設定儲存格填滿顏色的小技巧。 Epplus可以用範圍宣告,改變範圍內所有儲存格的色彩外觀。 using (ExcelRange rng = ws.Cells["A1:E1"]) {     rng.Style.Font.Bold = true ; } 當然,大多數時候我們是從資料庫將資料以迴圈帶出,事先不知道筆數,因此擺在for 迴圈內逐筆指定:  sheet1.Cells[startRow, 5]. Style.Font .Bold = true; sheet1.Cells[startRow, 5]. Style.Fill.PatternType  = OfficeOpenXml.Style. ExcelFillStyle.Solid; sheet1.Cells[startRow, 5].Style.Fill.BackgroundColor.SetColor( System.Drawing.Color.Aqua ); C#寫久的開發者,常常會習慣.Style.Fill...嘗試方法一路找下去,找到SetColor,但光是這樣無法執行。還要加上 Style.Fill.PatternType。否則在編譯時會報錯。 此外網路上的範例會寫 Style.Fill.PatternType  = ExcelFillStyle.Solid,但這樣IDE會顯示找不到,還是要補齊  OfficeOpenXml.Style. ExcelFillStyle.Solid 才能運作。 儲存格內文字變色的範例:(這是vb.net 的,語法類似)   If Dt1.Rows(rIndex)(colIndex).GetType.ToString() = "System.Int32" Then           If Dt1.Rows(rIndex)(colIndex) > 0 Then                   sheet1.Cells(startRow, colIn...