上色

Code Block

2023年11月29日 星期三

[RouterOS] Ikev2/IPsec VPN設定

 記個備忘錄,免得之後忘了


###設定認證

/certificate

add common-name=ca name=ca

sign ca ca-crl-host=2.2.2.2


/certificate

add common-name=2.2.2.2 subject-alt-name=IP:2.2.2.2 key-usage=tls-server name=server1

sign server1 ca=ca


/certificate

add common-name=rw-client1 name=rw-client1 key-usage=tls-client

sign rw-client1 ca=ca


###Export client certificate (pkcs12 format)

export-certificate rw-client1 export-passphrase=1234567890 type=pkcs12

export-certificate ca type=pem


###Set profile

/ip ipsec profile

add name=ike2


###Set proposal

/ip ipsec proposal

add name=ike2 pfs-group=none


###Set IP pool

/ip pool

add name=ike2-pool ranges=192.168.77.2-192.168.77.254


###Config

/ip ipsec mode-config

add address-pool=ike2-pool address-prefix-length=32 name=ike2-conf


##Policy

/ip ipsec policy group

add name=ike2-policies

/ip ipsec policy

add dst-address=192.168.77.0/24 group=ike2-policies proposal=ike2 src-address=0.0.0.0/0 template=yes


###Peer

/ip ipsec peer

add exchange-mode=ike2 name=ike2 passive=yes profile=ike2


###Identity

/ip ipsec identity

add auth-method=digital-signature certificate=server1 generate-policy=port-strict mode-config=ike2-conf peer=ike2 policy-template-group=ike2-policies


###Firewall

###If this router is VPN server (clients connect to it), then you want (before the last drop in input chain):

/ip firewall filter

add chain=input dst-port=500,4500 protocol=udp action=accept

add chain=input protocol=ipsec-esp action=accept


###VPN clients should access router itself (via encrypted tunnel),

/ip firewall filter

add chain=input ipsec-policy=in,ipsec action=accept


2023年3月12日 星期日

[JQuery] ready is deprecated

以下幾種敘述都可以代表當網頁DOM建置完畢之後再執行
$( handler )
$( document ).ready( handler )
$( "document" ).ready( handler )
$( "img" ).ready( handler )
$().ready( handler )
但根據jQuery 3.0文件說明,只建議第一種方法,因此其餘方法會被標示為deprecated

2021年7月4日 星期日

[.Net][C#] 禁止TextBox輸入數字

太常用到這功能了,寫下來記錄一下
以下code都寫在TextBox的KeyPress()裡面就可以了
//only allow integer (no decimal point)
if (!char.IsDigit(e.KeyChar) && (e.KeyChar != '.') && (e.KeyChar != '-') && (e.KeyChar != 8))
	e.Handled = true;
// only allow one decimal point
if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1))
	e.Handled = true;
// only allow sign symbol at first char
if ((e.KeyChar == '-') && ((sender as TextBox).Text.IndexOf('-') > -1))
	e.Handled = true;
if ((e.KeyChar == '-') && !((sender as TextBox).Text.IndexOf('-') > -1) && ((sender as TextBox).SelectionStart != 0))
	e.Handled = true;
首先利用IsDigit判斷輸入的是否為數字,若不是的話只能允許"."、"-"、BackSpace(←,KeyChar為8) 

接下來分別判斷小數點及負號
  1. 小數點只能出現一次,用IndexOf('.')判斷是否已經有小數點,若有的話則不允許輸入 
  2. -號只能出現一次而且只能出現在字串最前面,因此先以IndexOf('-')判斷是否出現過,若已出現過且位置不為0(最前面)則不允許輸入

2018年7月9日 星期一

[.Net] 以string,Join串接array of array(jagged array)

大家都知道使用string.Join可以串接陣列或清單中字串,像是下面這樣的形式
string[] source = new string[]{"one", "two", "three"};
string result = string.Join(",", source);

但是當陣列中還有陣列(jagged array, e.g. array of array)的時候怎麼辦呢?
這時候LINQ的Select語法就派上用場了,一層一層的串上去就對了
string[][][] source = new string[][][]{
 new string[][]{
  new string[]{"1", "2", "3"},
  new string[]{"one", "two", "three"}
 },
 new string[][]{
  new string[]{"4", "5", "6"},
  new string[]{"five", "six", "seven"}
 }
};

string result = string.Join(",", source.Select(m => string.Join(",", m.Select(n => string.Join(",", n)))));

如此一來就可以成功串接每一層陣列中的字串了。

Reference:
https://stackoverflow.com/questions/35102320/c-sharp-copying-jagged-arrays-to-strings


2018年7月4日 星期三

[.Net] Office interop runtime無法執行

紀錄一下最近遇到的問題,使用C#於MS Office 2013的環境上開發了一個程式,於MS Office 2010的機器上運作正常,但拿到MS Office 2007的機器上運作就會報錯。

首先,PIAs(Primary Interop Assemblies)必須與想要支援的最低版本相容,亦即想要支援Office 2007的話就必須使用v12的PIAs。
所以必須在Project的reference中加入v12版本的office PIAs(可以使用NuGet直接找到v12版本的PIA,亦即Microsoft.Office.Interop(v12)加入);但是光這樣是不夠的,因為當你的機器上有安裝更新版Office(如Office 2013)的時候,編譯時候會自動redirect到新版的PIAs,也就是在本機的GAC(global assembly cache)中所安裝的版本。

要修正這個問題,必須停止所謂的assembly binding redirection,可依照下列步驟進行:

1. 打開C:\Windows\Assembly\GAC或C:\Windows\Assembly\GAC_MSIL資料夾(根據你的windows版本而定)。
2. 找到對應的PIA,如我要使用Word的PIA,就找到Policy.12.0.Microsoft.Office.Interop.Word這樣的資料夾。
3. 在資料夾中找到設定的xml檔案,將下面這段註解掉
<bindingredirect newversion="14.0.0.0" oldversion="12.0.0.0"></bindingredirect>
變成
<!--<bindingredirect newversion="14.0.0.0" oldversion="12.0.0.0"></bindingredirect>-->
如此一來就會不會在redirect到新版本的PIAs,可以達到在不同機器上的相容性。

Reference:
https://stackoverflow.com/questions/6984733/office-2007-pia

2018年6月28日 星期四

[.Net] Embedded dll into exe

1. Add dll to resources, set the build action to "embedded resources" 2. Add following code to "Program.cs"
static void Main()
{
 //load resource dll
 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

 Application.EnableVisualStyles();
 Application.SetCompatibleTextRenderingDefault(false);
 Application.Run(new frmTDSCreator());
}

private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
 string resourceName = "TDSCreator.Resources." + new AssemblyName(args.Name).Name + ".dll";
 using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
 {
  byte[] assemblyData = new byte[stream.Length];
  stream.Read(assemblyData, 0, assemblyData.Length);
  return Assembly.Load(assemblyData);
 }
}

2016年6月3日 星期五

[.Net] 讀取CSV出現亂碼

當CSV檔中含有中文時,使用StremReader讀取通常都會出現亂碼,這是因為.Net預設使用Unicode編碼,但通常Excel還是使用Big5編碼,此時只要以下列方式指定系統編碼即可解決;
System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
System.IO.StreamReader sr = new System.IO.StreamReader(fs, System.Text.Encoding.Default);
使用System.Text.Encoding.Default指定系統預設編碼為StremReader的編碼格式。