發表文章

目前顯示的是 2018的文章

無法啟用教育版的office怎麼辦

工作上常常遇到,學生的電腦無法 正確啟用學校下載的Office軟體。 有這樣的情形,通常是學生購買的筆電已經安裝過Office365或是筆電附贈的Office精簡版。 必須要徹底把這些原有Office移除,才能安裝校園版的Office。 不過光從控制台刪除再重開機,還是會移不乾淨。 請連至以下微軟的官方頁面(連結可能無法直接點選,請複製至瀏覽器的網址列): https://support.office.com/zh-tw/article/%E5%BE%9E%E9%9B%BB%E8%85%A6%E8%A7%A3%E9%99%A4%E5%AE%89%E8%A3%9D-Office-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8?ui=zh-TW&rs=zh-TW&ad=TW 查看 選項 2 - 使用簡易修正程式工具完全解除安裝 Office 2016。 請點選畫面中的 簡易修正按鈕 將 Office 解除安裝。 確定移除且重新開機後,再安裝前次下載至您筆電中的Office。 軟體啟用作業需在校內進行,或透過學校的VPN連線認證後,再從校外執行。

提升前端安全性 檢查表

1.加上安全的header https://devco.re/blog/2014/03/10/security-issues-of-http-headers-1/ 2.頁面端傳遞變數時,將其編碼,以免有些參數跑掉了 透過javascript傳遞值,要再加上  encodeURIComponent() 做urlEncode 若使用    encodeURI()   不編碼符號包括:  ~!@#$&*()=:/,;?+' (轉引自 https://blog.longwin.com.tw/2010/01/javascript-encodeuri-component-utf-8-2010/ ) 3.不要相信前端傳遞的資料。關鍵的代碼需要在後端編碼過,再傳到前端。

regexp 測試網站

https://regex101.com/

Entity framework 攻略

有多重排序的需求,該怎麼作? .OrderBy(x => new { x.PROGRAM_CODE , x.LITERACY_CODE }).ToList(); 提升寫入速度 利用foreach新增多筆資料或刪除多筆資料時,將多筆資料塞到一個 list中,再利用RemoveRange()方法處理。同時不要每一筆紀錄就執行一次 savechange()。 也有人建議將偵測異動屬性關閉,但這樣會抓不到savechange筆數 dbContext.Configuration.AutoDetectChangesEnabled = false; 要追求極致效能,使用手寫sql等技巧,有以下的討論: https://www.thereformedprogrammer.net/entity-framework-core-performance-tuning-a-worked-example/ Entity framework 要如何 left join? (LINQ LEFT JOIN where clause) 此處的情境假設有個db實體為XEntities,主要表格為PROGRAMs,join SCHOOLs、PROGRAM_TYPE兩個表格。要找出 PLAN_FILL_RECORD 有沒有填寫紀錄。 因為 PLAN_FILL_RECORD 要指定只抓某年度的紀錄,因此年度的條件是放在 join 該行的 where 敘述中。若放在 on 的敘述,會變成 inner join。 此外,PLAN_FILL_RECORD 不一定有值,所以在on 之後會讓查詢結果加上一個 into 敘述(黃色部分),將以上的查詢結果帶到  pRes   之中。 接下來再用 from .... in  pRes.DefaultIfEmpty() 的語法查詢結果,這樣有結果則顯示資料,沒結果則帶出 left join資料表的欄位預設值。 最後用欄位投影方式,處理欄位有null時如何顯示。這裡為了讓資料維持強型別,定義了一個 OBJECT_SHOW物件來接收資料。 var query2 = ( from b in XEntities .PROGRAMs join e in  XEn...

C# 入門語法整理(字串函數)

常用字串函數 用途 回傳 .Tostring() 其他型別轉字串 字串 char sp = ‘,’; string someStr=”joe,alisa,tesla”; string[] array1 =someStr.split(sp) 把字串分割成陣列 字串陣列 .Trim() 清字串末尾的空白 字串 (“where a={0}”, str1) 字串格式化 字串 .replace(“ 目標字元 ”,” 取代後字元 ”) 取代某個字串 字串 string. Contains( "goodbye" ) 確認是否包含某個字元 bool string.IndexOf(“ 清華 ”, 0) 查出某字串自第幾個字元起是否包含要查詢的詞彙 Int ,表示所在位置, 不存在時,回傳 -1 string.Compare(" 字串 ", " 測試 "); // result = -1  string.Compare(" 字串測試 ", " 字串測試 "); // result = 0  比對兩個字串是否完全相符 不同 =-1 相同 =0 .ToUpper() 轉大寫 字串 .ToLower() 轉小寫 字串 .Substring(1, 2) 擷取某部分字串 字串 轉型別 ( 型別寫在前面 ) (int32)obj 求餘數 % Stringbuilder 類別 用於大量的字串串接,提高效能 Stringbuilder sb = new stringbuilder(); Sb.append(“xxxxxxxx”); 條件 ( 三元 ) 運算子 Stirng vColor...

手刻 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)     {       ...