2020年12月15日

我的vim設定 PART 2

又來了,他進化了,現在長成這樣 … 

set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'Valloric/YouCompleteMe'
call vundle#end()
filetype plugin indent on

" YouCompleteMe
let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/.ycm_extra_conf.py'
let g:ycm_confirm_extra_conf=0
let g:ycm_python_binary_path='/usr/bin/python3'
let g:ycm_autoclose_preview_window_after_completion=1

set term=screen-256color-s
colorscheme burnttoast256

set autoindent
set expandtab
set tabstop=4
set softtabstop=4
set shiftwidth=4
set textwidth=79

set showmatch

set number
set relativenumber
set ic
set cindent
set confirm
set wrap

set encoding=utf-8

set guioptions-=r
set guioptions-=L
set guioptions-=b

set guifont=Monaco:h13

syntax on
set ignorecase
set incsearch
set hlsearch
set cursorline
set cursorcolumn

.net 字串比較


故事先來一下:

DB存的是str1,使用者輸入的是str2,程式說這兩個字串不一樣,我一眼就看出 ... 看出這個問題我要找很久 …

其實也還好,馬上想到是字串比對StringComparison的問題

原本用的是OrdinalIgnoreCase,但這串奇怪語言,我猜應該是要包含點什麼文化特性,試的結果如下:

str1 = "HÀ HỮU TUYÊN";
str2 = "HÀ HỮU TUYÊN";

 

 

https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/best-practices-strings

官方建議,大概總結一下
  1. 沒有文化特性(只有英文、符號)的比較可以用Ordinal,OrdinalIgnoreCase(效能也比較好)
  2. 有文化特性的(多語系)請用CurrentCulture
  3. 沒事不要用InvariantCulture
  4. 用string.Equals 最好指定 StringComparison,給明確的規則
  5. string.Compare,string.CompareTo不要拿來檢查是否相等(官方寫的沒給理由,有空或有心人再找)

2019年3月5日

mysql docker初始table設定

這個是Dockerfile的內容

FROM mysql

ENV MYSQL_DATABASE some_service_schema

COPY *.sql /docker-entrypoint-initdb.d/

第二行是給定預設schema
第三行的sql script就會在預設的schema上執行


2019年1月24日

vscode .net core test explorer

VSCode上的Test Explorer看不到.net core的test function列表,需要另外裝.NET Core Test Explorer,
但是在Windows上裝了以後還是看不到,Linux上又沒問題,找了半天(幹,真的花了半天時間),發現dotnet的語言要改成英文的才可以,本來是設了一個環境變數DOTNET_CLI_UI_LANGUAGE設為en-US,這樣console輸入dotnet -h的時候是英文的輸出,可是發現還是不行,用了dotnet test xxx.csproj輸出的語言還是中文 …

最後又找到一篇文章,原來要去sdk安裝資料夾把zh-*的語言資料夾刪掉(zh-Hans,zh-Hant),這兩個資料夾刪掉後.net test explorer中test function 列表就出來了。

我刪的資料夾 位於C:\Program Files\dotnet\sdk\2.2.103\zh-*

要刪的時候還要看dotnet的版本,要去對應的版本的資料夾刪,我用的是2.2.1所以是上面的資料夾

2019年1月15日

我的vim設定

set t_Co=256
colorscheme burnttoast256

set expandtab
set tabstop=4
set softtabstop=4

set number
set ignorecase
set cindent
set confirm
set wrap

set encoding=utf-8

2019年1月3日

Docker中的IP

有個程式記Log時要取得IP,當做一個記錄的欄位,那個程式是.net core掛在docker裡面,結果docker 預設的網路模式是bridge,預設給的IP也是相同網段,不同台電腦的docker裡面的IP是一樣的 …造成分不出這個程式是掛在那一台電腦上的



最後用docker network create指令去create一個新的網段,在docker run的時候再加上--net去指定用到新create出來的網段,搞定。

2017年8月8日

Asp.net Web client使用excel元件發生錯誤

擷取元件 (CLSID 為 {00024500-0000-0000-C000-000000000046}) 的 COM Class Factory 失敗
擷取元件 (CLSID 為 {00024500-0000-0000-C000-000000000046}) 的 COM Class Factory失敗,因為發生下列錯誤: 80040154 類別未登錄 (發生例外狀況於 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))。
描述: 在執行目前 Web 要求的過程中發生未處理的例外狀況。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。 

例外狀況詳細資訊: System.Runtime.InteropServices.COMException: 擷取元件 (CLSID 為 {00024500-0000-0000-C000-000000000046}) 的 COM Class Factory 失敗,因為發生下列錯誤: 80040154 類別未登錄 (發生例外狀況於 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))。
以下嘗試的解決方式:

1. Start->run->regedit 
Find 00024500-0000-0000-C000-000000000046 ->資料夾按右鍵內容,安全性加入NETWORK SERVICE給予權限,找遍所有00024500-0000-0000-C000-000000000046相關的機碼全部設了Network service 與 IIS_IUSRS完全控制的權限,結果失敗
2. Start -> run -> DCOMCNFG
來想照著以上說明去「元件服務」設定DCOM元件,竟然沒有Microsoft Excel Application。因為Excel是32位元,64位元的作業系統看不到該元件,結果失敗
3.在web.config 加入
帳號密碼請先使用本機administrator帳號試比較沒問題
若是 Server 2008 x64 請建立下述資料夾
C:\Windows\SysWOW64\config\systemprofile\Desktop
若是 Server 2008 x86 請建立下述資料夾
C:\Windows\System32\config\systemprofile\Desktop
以上的設定。結果成功
4. Start -> run -> mmc comexp.msc /32
元件服務 -> 電腦 ->我的電腦 ->DCOM設定 ->Microsoft Excel Application ->安全性->啟動和啟用權限&存取權限->自訂權限加入Network service與IIS_IUSRS完全控制權限, 識別身份用互動式使用者。結果成功

參考:http://tsaiyuchi.blogspot.tw/2011/02/excel-manipulate.html#more



存著用,現在用不到,這抄別人的 … 

型別轉換


public class C
{
    public T Data;
}

public class C : C
{
}

public C c1;
public C c2;

上面的c1無法轉換成c2,但我就是有這種需求…可能是我設計的不好 … 
我的Interface中訂了 C Query(string str);
在各個實作介面的物件中,回傳是各種C ,C等等…
因為要統一在外面接到就直接把C轉成Json字串,
所以需要C能正常轉型成C。

最後是在C裡面實做implicit(隱含轉換)


public class C
{
    public T Data;

    public static implicit operator C ( C cc )
    {
        var obj   = new C ();

        obj.Data  = cc.Data;

        return obj;
    }
}

這樣c2 = c1;的時候就不會出錯了!

隱含轉換的準則:
  1. 不會拋出例外
  2. 不會遺失資訊
所以其他程式設計人員可以不用注意這個東西直接拿來使用。

相對來說,如果希望其他程式設計人員在做轉型時可以注意到會有差異,希望他有認知到有做轉型的動作,
那實做的implicit關鍵字要改成explicit這樣在轉換的時候必須加上轉型關鍵字,寫成

c2 = (C)c1;

2017年8月1日

刪除某時間之前的檔案

本來要寫個batch file去定期刪除某個時間之前的檔案,
後來發現只要一行指令就完成了,也不用寫batchfile了。

forfiles /P "D:\Logs\IISLog" /M *.log /S /D -30 /C "cmd /C Del @path"

2017年7月28日

呼叫泛型方法時Type為變數值

之前做過一次,呼叫泛型方法,但型態在寫的時候還沒決定,
或是這個型態是個變數,還未知的,要做成下面這樣

public GenericMethod(object obj);

Type type = someobject.GetType();
GenericMethod(someobject);
想當然程式寫成這個樣子是不可行的。
所以才寫這個筆記…

2017年7月19日

時區轉換失敗


今天碰到一個問題,程式要轉換時間的時候找不到時區,第三方程式丟過來的時區資訊是MET( Middle European Time ),找了方法除了寫程式去處理例外、用第三方元件,最可靠的應該是下面這個方法了。
下圖就是找不到時區時會丟出的錯誤:

圖一









2017年7月5日

C#反組譯

先記著一些反組譯比較麻煩的東西

一、
反組譯出來的程式碼中,如果出現  CallSite ,這個應該是程式碼裡面用了dynamic,這次的例子中有出現這個
public static CallSiteobject
, OHLCDto, object>> <>p__0;但我還不知道這些型態是怎麼決定的 … 先記一下

二、
程式碼中出現<>這種東西,大概就是編譯的時候編出來的,很有可能是delegate、()=>或是Lambda表示式

三、Function 上有[AsyncStateMachine(typeof(OHLCPublisher.d__6))]這種東西,這應該是這個Function是用Async做出來的

2017年6月2日

C++ virtual function 作用

直接看程式好了,
簡單來說virtual function如果子類別有實作則會執行子類別中的內容,
如果不是virtual function,即使子類別有實作,還是會執行父類別中的內容。

2017年4月27日

MySql binary type data read & write (by Json.net)


MySQL資料型態為BINARY時,DATA TABLE讀到C#中是binary array ( byte[] )
現在用的framework是 ZayniFramework,
裡面轉物件的方式是用NewtonSoft.Json(JSon.net),

table →serialize→string
string→deserialize→object

裡面的bite array在序列化之後會轉成base64的字串,

程式中有一段,先讀出來,再更新寫回去的地方出錯,
資料型態為bianry(1),
sql parameter裡就直接將Base64的字串寫回去,錯誤訊息寫說大小超過欄位設定,

結果最後是mysql server版本的問題,
一開始安裝的是最新版5.7.18,
後來換成5.6.20版本就解決了,
這個以後換新版不知道怎麼辦…有空應該要試一下…

2017年3月8日

Visual Studio2010開Web專案一直報asp.net 4.0沒註冊


ASP.NET 4.0 has not been registered on the Web server. You need to manually configure your Web server


一直給我報上面的機歪訊息,
windows7的解決方案是打個指令
aspnet_regiis -i
這樣就好,但是win10不能用,

電腦裡裝的是.net framework 4.6 ,什麼功能也都啟用了,說我4.0沒註冊

今天找到 … 原來 … 是bug … 

2017年1月10日

Timer 執行完前次工作後再倒數

這裡用的Timer是System.Threading.Timer;

目的是在倒數計時的程式中,不要前一次工作還沒完成,下一次工作就開始執行。

看到兩種作法

  1. 用Thread中的Monitor去鎖定物件來做控制
  2. 改變計時器時間(這個比較準)

2017年1月6日

Winform DataGrid Binding

    下面是程式中需要的Grid 欄位長相

     1. 新增Class並繼承INotifyPropertyChanged,實作其function

[coggle] 線上心智圖

最近流行用心智圖來做思考,介紹一下coggle,是我最近試用過的,
大家可以試玩看看,他是線上的工具,網址:https://coggle.it

一開始我用了幾套,有線上的有下載的安裝的,我覺得這個用起來最直觀,滑鼠直接點就可以出現分支連線,直接拖拉就可以移動,雖然很簡單,且免費的有限制一些功能(顏色、全部自動排序、分支合併等等),但初步會用到的功能都有。


2017年1月4日

oracle重複連線(關閉又開),帳號密碼錯誤

Persist Security Info=True;

今天碰到連線關閉又打開時報錯:使用者密碼錯誤(之類的,我忘了錯誤代碼…)
原來是連線字串上面的這個屬性搞鬼,預設為false,連線一次就會把敏感資訊清掉,敏感資訊就是帳號阿密碼之類的,如果上面屬性寫成true就不會清掉。

也不一定要設這個屬性,只是每次連線就要抓取本來的連線字串,不能用OracleConnection.ConnectionString

2010年10月18日

書 - WPF

基峰 : Windows大師Charles的著作

悅知 : WPF開發團隊的人寫的著作(全彩)

博碩 : 日本微軟的人寫的WPF著作

旗標 : AW的Essential WPF(未出版)

上奇 : Wrox的WPF

全世界真的寫得好的書,也就這幾本.

建議常常看MSDN好書推薦 

http://www.microsoft.com/taiwan/msdn/books/default.htm#5