瀏覽標籤:

筆記

[C#][Visual Studio 2017] 修改預設 class 存取範圍成 public

版本:Visual Studio 2017 Enterprise

路徑:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\ItemTemplates\CSharp\Code\1028\Class\Class.cs

 

範本:

using System;
using System.Collections.Generic;
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq;
$endif$using System.Text;
$if$ ($targetframeworkversion$ >= 4.5)using System.Threading.Tasks;
$endif$
namespace $rootnamespace$
{
    public class $safeitemrootname$
    {
    }
}

 

這樣就新增 class 時就會自己加上 public 囉

       

[.NET Core] 將 NET Core 部署至 Ubuntu Server 16.04

最近裝了個Linux Server想來玩玩看NET Core並佈署到上面,結果發現好多眉眉角角,網路上的文件似乎有點舊讓我一直撞牆撞不停,經過了幾個小時的煎熬最後終於成功了,這裡筆記一下方便下次使用…

首先按照 官網 提供的步驟進行安裝如下:

  1. 加入apt-get來源
    sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893
    sudo apt-get update
  2. 開始安裝
    sudo apt-get install dotnet-dev-1.0.4
  3. 建立一個空資料夾
    mkdir HelloWebApp
    cd HelloWebApp
  4. 初始化MVC專案
    dotnet new mvc

    Templates清單:

    Templates                 Short Name      Language      Tags
    ----------------------------------------------------------------------
    Console Application       console         [C#], F#      Common/Console
    Class library             classlib        [C#], F#      Common/Library
    Unit Test Project         mstest          [C#], F#      Test/MSTest
    xUnit Test Project        xunit           [C#], F#      Test/xUnit
    ASP.NET Core Empty        web             [C#]          Web/Empty
    ASP.NET Core Web App      mvc             [C#], F#      Web/MVC
    ASP.NET Core Web API      webapi          [C#]          Web/WebAPI
    Solution File             sln                           Solution
  5. 檢查套件是否遺失並安裝
    dotnet restore
  6. 安裝Apache反向代理(Reverse-Proxy)
    sudo a2enmod proxy
    sudo a2enmod proxy_http
    sudo a2enmod proxy_ajp
    sudo a2enmod rewrite
    sudo a2enmod deflate
    sudo a2enmod headers
    sudo a2enmod proxy_balancer
    sudo a2enmod proxy_connect
    sudo a2enmod proxy_html
  7. 設定000-default.conf
    <VirtualHost *:80>
    	ProxyPreserveHost On
    	ProxyPass / http://127.0.0.1:5000/
    	ProxyPassReverse / http://127.0.0.1:5000/
    </VirtualHost>
  8. 重新啟動Apach並啟動.NET Core專案
    sudo service apache2 restart
    dotnet run
  9. 完成 !!
    2017-03-14-00_24_31-home-page-hellowebapp

 

 

  • 2017/05/24 開啟啟動&背景執行
    新增:/etc/systemd/system/kestrel-hellomvc.service

    [Unit]
    Description = https://blog.exfast.me/
    
    [Service]
    WorkingDirectory = /home/user/HelloWebApp/
    ExecStart = /usr/bin/dotnet run /home/user/HelloWebApp/HelloWebApp.dll
    Restart = always
    # Restart service after 10 seconds if dotnet service crashes
    RestartSec = 10
    SyslogIdentifier = dotnet-example
    User = user
    Environment = ASPNETCORE_ENVIRONMENT = Production 
    
    [Install]
    WantedBy = multi-user.target

    指令:

    sudo systemctl stop kestrel-hellomvc
    sudo systemctl disable kestrel-hellomvc
    sudo systemctl enable kestrel-hellomvc
    sudo systemctl start kestrel-hellomvc
    sudo systemctl status kestrel-hellomvc

     

來源:

  1. https://www.microsoft.com/net/core#linuxubuntu
  2. How To Use Apache HTTP Server As Reverse-Proxy Using mod_proxy Extension
  3. Asp.Net Core 发布和部署( MacOS + Linux + Nginx )
  4. Publish to a Linux Production Environment
  5. Using Apache web server as a reverse proxy
       

[C#] 基礎複習 – 遞迴練習

好久沒用遞迴了,趕快找個簡單的題目複習一下,不然都要忘光光了,熟悉一下之前的Feel ~
順便練習一下簡單工廠模式,首先設計介面ICompute.cs

interface ICompute
{
    /// <summary>
    /// 1 + ... + N = ?
    /// </summary>
    /// <param name="n"></param>
    /// <returns>Answer</returns>
    Int64 Iterative(Int64 n);

    /// <summary>
    /// 1 - 2 + 3 ... + N = ?
    /// </summary>
    /// <param name="n"></param>
    /// <returns>Answer</returns>
    Int64 AdvancedIterative(Int64 n);

    /// <summary>
    /// 1 x 2 x ... x N = ?
    /// </summary>
    /// <param name="n"></param>
    /// <returns>Answer</returns>
    Int64 Factorial(Int64 n);

    /// <summary>
    /// Fn = Fn-1 + Fn-2
    /// </summary>
    /// <param name="n"></param>
    /// <returns>Answer</returns>
    Int64 Fibonacci(Int64 n);
}

接著建立兩個類別Recursive.csForLoop.cs並繼承ICompute.cs實作其方法:

  • Recursive.cs
    public class Recursive : ICompute
    {
        public Int64 Iterative(Int64 n)
        {
            if (n == 1)
            {
                return n;
            }
            else
            {
                return n + Iterative(n - 1);
            }
        }
    
        public Int64 AdvancedIterative(Int64 n)
        {
            if (n == 1)
            {
                return n;
            }
            else
            {
                return n % 2 == 0 ? -n + AdvancedIterative(n - 1) : n + AdvancedIterative(n - 1);
            }
        }
    
        public Int64 Factorial(Int64 n)
        {
            if (n == 1)
            {
                return n;
            }
            else
            {
                return n * Factorial(n - 1);
            }
        }
    
        public Int64 Fibonacci(Int64 n)
        {
            if (n < 3)
            {
                return 1;
            }
            else
            {
                return Fibonacci(n - 1) + Fibonacci(n - 2);
            }
        }
    }
  • ForLoop.cs
    public class ForLoop : ICompute
    {
    
        public Int64 Iterative(Int64 n)
        {
            int ans = 0;
    
            for (int i = 1; i <= n; i++)
            {
                ans += i;
            }
    
            return ans;
        }
    
        public Int64 AdvancedIterative(Int64 n)
        {
            int ans = 0;
    
            for (int i = 1; i <= n; i++)
            {
                if (i % 2 == 0)
                {
                    ans -= i;
                }
                else
                {
                    ans += i;
                }
            }
    
            return ans;
        }
    
        public Int64 Factorial(Int64 n)
        {
            int ans = 1;
    
            for (int i = 1; i <= n; i++)
            {
                ans *= i;
            }
    
            return ans;
        }
    
        public Int64 Fibonacci(Int64 n)
        {
            int ans = 0;
            int[] arr = new int[2] { 1, 1 };
    
            for (int i = 1; i <= n; i++)
            {
                if (i < 3)
                {
                    ans = 1;
                }
                else
                {
                    ans = arr[0] + arr[1];
                    arr[0] = arr[1];
                    arr[1] = ans;
                }
            }
    
            return ans;
        }
    }

接著在Program.cs裡面寫一個Run的方法來呼叫剛剛寫好的兩個類別:

static void Run(int n, ICompute compute)
{
    Console.WriteLine("1 + ... + N = {1}", n, compute.Iterative(n));
    Console.WriteLine("1 - 2 + 3 ... + N = {1}", n, compute.AdvancedIterative(n));
    Console.WriteLine("N! = {1}", n, compute.Factorial(n));
    Console.WriteLine("Fn = Fn-1 + Fn-2, n = {0}, Ans = {1}", n, compute.Fibonacci(n));
}

這樣就完成囉 !!

2017-01-05-20_15_29-file____c__users_developer_documents_recursiveeample_recursiveeample_recursiveea

 

原始碼:https://github.com/shuangrain/RecursiveEample

       

[C#] Convert(轉型)、Parse(強制轉型)、TryParse(安全轉型)與運算子轉型的差別、效能

最近再磨練基本功的時候複習了常用到的「轉型」,找一找資料後統整了一下才比較搞懂這些差異。

轉型別基本上分為下列五種:

  1. Convert(轉型)
    Convert.ToInt32("5.5");
  2. Parse(強制轉型)
    (int)(5.5);
    int.Parse("5.5");
  3. TryParse(安全轉型)
    int i = 0;
    int.TryParse("5.5", out i)
  4. 運算子 – as
    CustomModel model = obj as CustomModel
  5. 運算子 – is
    CustomModel model = obj is CustomModel

根據參考資料差異如下:

  1. Convert 是將值轉換成最接近的 32 位元帶正負號的整數
    Console.WriteLine(Convert.ToInt32("4.5")); //result = 4
    Console.WriteLine(Convert.ToInt32("4.51"));//result = 5
    Console.WriteLine(Convert.ToInt32("5.4")); //result = 5
    Console.WriteLine(Convert.ToInt32("5.5")); //result = 6
  2. Parse 則是無條件捨去( long、float、double、或 decimal )
    Console.WriteLine((int)(4.5)); //result = 4
    Console.WriteLine((int)(4.51));//result = 4
    Console.WriteLine((int)(5.4)); //result = 5
    Console.WriteLine((int)(5.5)); //result = 5
    
  3. TryParse 會回傳一布林值來判斷是否轉換成功
    string s1 = "1234"; 
    string s2 = "1234.65"; 
    string s3 = null; 
    string s4 = "123456789123456789123456789123456789123456789"; 
    bool success = false;    
    int result = 0; 
    success = Int32.TryParse(s1, out result); //-- success => true;  result => 1234 
    success = Int32.TryParse(s2, out result); //-- success => false; result => 0 
    success = Int32.TryParse(s3, out result); //-- success => false; result => 0 
    success = Int32.TryParse(s4, out result); //-- success => false; result => 0
  4. as 若轉型失敗會回傳null,且只能用於參考類型,不能應用於值類型(除非是Nullable的值類型)。
    CustomModel model = obj as CustomModel;
    if(model  != null)
    {
        //轉型成功
    }
    else
    {
        //轉型失敗
    }
  5. is 若轉型失敗則會跳Exception
    try
    {
        CustomModelt = obj is CustomModel;
    }
    catch
    {
        //轉型失敗
    }

2017/09/24 更新

(Net Core 2.0)效能上 Parse > TryParse > Convert。

測試程式碼:

class Program
{
    static void Main(string[] args)
    {
        Stopwatch sw = new Stopwatch();

        sw.Start();
        for (int i = 0; i < 10000000; i++)
        {
            Convert.ToInt32(i.ToString());
        }
        sw.Stop();

        Console.WriteLine(string.Format("Convert.ToInt32 = {0} ms", sw.ElapsedMilliseconds));
        sw.Reset();

        sw.Start();
        for (int i = 0; i < 10000000; i++)
        {
            int.Parse(i.ToString());
        }
        sw.Stop();

        Console.WriteLine(string.Format("int.Parse = {0} ms", sw.ElapsedMilliseconds));
        sw.Reset();

        sw.Start();
        for (int i = 0; i < 10000000; i++)
        {
            int.TryParse(i.ToString(), out int tmp);
        }
        sw.Stop();

        Console.WriteLine(string.Format("int.TryParse = {0} ms", sw.ElapsedMilliseconds));
        sw.Reset();

        object model = new TestModel
        {
            Tmp = 100
        };

        sw.Start();
        for (int i = 0; i < 10000000; i++)
        {
            var tmp = model as TestModel;
        }
        sw.Stop();

        Console.WriteLine(string.Format("as = {0} ms", sw.ElapsedMilliseconds));
        sw.Reset();

        sw.Start();
        for (int i = 0; i < 10000000; i++)
        {
            var tmp = model is TestModel;
        }
        sw.Stop();

        Console.WriteLine(string.Format("is = {0} ms", sw.ElapsedMilliseconds));
        sw.Reset();

        Console.ReadKey();
    }

    public class TestModel
    {
        public int Tmp { get; set; }
    }
}

 

參考:

  1. Convert(轉型)與Int32(強制轉型)的差別、效能
  2. [C#]Convert.ToInt32()與int.Parse()的差別
  3. [C#]Convert、Parse、TryParse 差異
  4. [C#]Effective C# 條款三: 運算子is或as優於強制轉型
       

[IIS] 在 Windows Server 上執行 PHP 莫名的慢

原本在Linux非常順暢的Wordpress移植到了Windows Server上卻發生一個頁面要Loading一秒以上,餵狗了一下找了幾種方法來優化一下。

  1. 修改php.ini
    output_buffering修改為Off

    output_buffering = Off
  2. 將php內用到localhost的通通修改為127.0.0.1
  3. 關閉Router的防DDOS功能 <-- 這個功能害我測了好久

修改完後有快一點點了,但還是比不上Linux的速度,可能這就是Windows Server先天上的吃資源吧。

 

 

來源:https://forums.iis.net/t/1153459.aspx?PHP+very+slow+on+IIS7

       

[IIS] Windows Server 2016 無法安裝 URL Rewrite !?

今天興致來在VM上灌了2016打算把Wordpress移植過去的時候發現,無法安裝URL Rewrite !!!!
我明明就已經7.0以上了阿,我書讀得少不要唬爛我啊 !!!
2016-12-16-20_01_04-winserver_2016-vmware-workstation

 

餵狗了一下才發現,原來不只我有這個問題,解法如下:

  1. Win+R輸入下方指令打開註冊檔
    regedit
  2. 找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp\MajorVersion
  3. 將數值修改為 7 再進行安裝!!
    2016-12-16-20_02_19-winserver_2016-vmware-workstation
  4. 就可以順利安裝囉 !!
    2016-12-16-20_02_44-winserver_2016-vmware-workstation
  5. 安裝完記得改回去嘿,避免發生不必要的錯誤 !!

 

 

來源:https://forums.iis.net/t/1225087.aspx

       

[轉載] 系統架構設計

來源:[鐵人30天]當ASP.NET MVC 遇見 Angular.js MVC 客戶管理系統(3) – 系統架構設計

* 為何要分層架構規劃

分層的重要性,也是寫程式幾年後才真的領悟,ASP時代那種義大利麵式的寫法(html、Script、後端程式、SQL程式全混再一起),接著WebForm CodeBind將前後端拆後,再到現在慣用的MVC,深深覺得”關注點分離”這的確是一件很重要的事,目前開發習慣,即使專案在小,也會整理出自己的三層架構起手式,如果是更大型專案,就會再更細分。

架構圖:

_thumb3

各分層介紹:

  • DAL(Data Access Layer) : 有關SQL語法、EntityFream資料庫溝通,都會在此層。
  • BLL(Business Login Layer):資料流從DB或從User輸入後,一定會有一些邏輯判斷,該商業邏輯流程都會寫在此層
  • UI(User Interface):有關Web專案、Web API(Web Service)、Apps 都會在此層
  • Domain Entity : 裡面會有定義ViewModel Class,用來貫穿三個分層
  • Resources:用來放一些資源檔 … e.g 多國語系檔
  • Utility : 用來放置一些共用函示庫 … 如加解密

整個專案建立完如下圖:

1_thumb4

       

[應用] SSD 4K對齊

在Windows安裝前,先按下Shift+F10進入Command模式,並輸入diskpart即可開始進行分割磁區!

 

  1. 列出硬碟清單,找出要操作的編號
    list disk
  2. 選擇硬碟
    select disk 0
  3. 清除硬碟
    clean
  4. 初始化磁區
    create partition primary align=1024
  5. 列出磁區,找出要操作的編號
    list partition
  6. 選擇磁區
    select partition 1
  7. 啟用磁區
    active
  8. 格式化
    format fs=ntfs unit=4096 quick
  9. 完成!

 

 

       

[Regex] 知道這20個規則運算式,能讓你少寫1,000行代碼(2017/04/22)

轉載:知道这20个正则表达式,能让你少写1,000行代码

 

規則運算式,一個十分古老而又強大的文本處理工具,僅僅用一段非常簡短的運算式語句,便能夠快速實現一個非常複雜的業務邏輯。熟練地掌握規則運算式的話,能夠使你的開發效率得到極大的提升。

規則運算式經常被用於欄位或任意字串的校驗,如下面這段校驗基本日期格式的JavaScript代碼:

var reg = /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/; 
var r = fieldValue.match(reg); 
if(r==null)alert('Date format error!');

下面是技匠整理的,在前端開發中經常使用到的20個規則運算式。

 

  1. 校驗密碼強度
    密碼的強度必須是包含大小寫字母和數位的組合,不能使用特殊字元,長度在8-10之間。

    ^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
  2. 校驗中文
    字串僅能是中文。

    ^[\\u4e00-\\u9fa5]{0,}$
  3. 由數位、26個英文字母或底線組成的字串
    ^\\w+$
  4. 校驗E-Mail 地址
    同密碼一樣,下面是E-mail地址合規性的正則檢查語句。

    [\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?
  5. 校驗身份證號碼
    下麵是身份證號碼的正則校驗。15 或 18位。

    • 15位
      ^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$
    • 18位
      ^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$
  6. 校驗日期
    “yyyy-mm-dd“ 格式的日期校驗,已考慮平閏年。

    ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
  7. 校驗金額
    金額校驗,精確到2位小數。

    ^[0-9]+(.[0-9]{2})?$
  8. 校驗手機號下麵是國內 13、15、18開頭的手機號規則運算式。(可根據目前國內收集號擴展前兩位開頭號碼)
    ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$
  9. 判斷IE的版本IE目前還沒被完全取代,很多頁面還是需要做版本相容,下面是IE版本檢查的運算式。
    ^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$

     

  10. 校驗IP-v4地址IP4 正則語句。
    \\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b

     

  11. 校驗IP-v6地址IP6 正則語句。
    (([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

     

  12. 檢查URL的首碼應用開發中很多時候需要區分請求是HTTPS還是HTTP,通過下面的運算式可以取出一個url的首碼然後再邏輯判斷。
    if (!s.match(/^[a-zA-Z]+:\\/\\//))
    {
        s = 'http://' + s;
    }

     

  13. 提取URL連結下面的這個運算式可以篩選出一段文本中的URL。
    ^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?

     

  14. 檔路徑及副檔名校驗驗證windows下檔路徑和副檔名(下面的例子中為.txt文件)
    ^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$

     

  15. 提取Color Hex Codes有時需要抽取網頁中的顏色代碼,可以使用下面的運算式。
    ^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$

     

  16. 提取網頁圖片假若你想提取網頁中所有圖片資訊,可以利用下面的運算式。
    \\< *[img][^\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)

     

  17. 提取頁面超連結提取html中的超連結。
    (<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>

     

  18. 查找CSS屬性通過下面的運算式,可以搜索到相匹配的CSS屬性。
    ^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}

     

  19. 抽取注釋如果你需要移除HMTL中的注釋,可以使用如下的運算式。
    <!--(.*?)-->

     

  20.  匹配HTML標籤通過下面的運算式可以匹配出HTML中的標籤屬性。
    <\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[\\^'">\\s]+))?)+\\s*|\\s*)\\/?>

     

  21. 6-20位英數混合字,不可以輸入空白字元、特殊符號。(2017/04/22)
    /^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z0-9]{6,20}$/