2021年7月31日 星期六

[ASP.NET Core] Run the same project at local by different port and environment variable

 ASP.NET Core   Development  

 

Introduction


 

Sometimes we want to run the same project at local as two or more processes that each of them has different port and environment variable.

 

The best way is to containerize your application.

However, if you want a quick solution in order to do some simple tests in this scenario, we can use dotnet CLI and a few setups to achieve it.   

 

Environment


 .NET Core 5.0.301

Visual  Studio 2019 Community

 

 

 

Implement



Here are 2 tips of dotnet CLI to run a project as multiple processes with different port and environment variable.

 

1.Launch profiles


The launchSettings.json file describes how the application launches by specified URL, port, environment variables, etc.

 

We can define multiple launch profile in that file. For example, we have 2 launch profiles in the following launchSettings.json, "Demo.Client1" and "Demo.Client2".

{
  "$schema""http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "Demo.Client1": {
      "commandName""Project",
      "launchBrowser"true,
      "launchUrl""Home",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT""Client1"
      },
      "dotnetRunMessages""true",
      "applicationUrl""https://localhost:5001;http://localhost:5000"
    },
    "Demo.Client2": {
      "commandName""Project",
      "launchBrowser"true,
      "launchUrl""Home",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT""Client2"
      },
      "dotnetRunMessages""true",
      "applicationUrl""https://localhost:5003;http://localhost:5002"
    }
  }
}

 

Now we can switch different launch profile when execute "dotnet run".

 

$ dotnet run --launch-profile Demo.Client1

 

 

Notice that the above command will BUILD THE PROJECT and put the built binaries to "/bin/Debug/". If we modify the code and run another "dotnet run –launch-profile Demo.Client2", it will cause the following error:

 

 

The process cannot access the file '…\src\Demo.Client\bin\Debug\net5.0\Demo.Client.exe' because it is being used by another process.  […\src\Demo.Client\Demo.Client.csproj]

 

 

 

We can specified the "--configuration|-c" argument to build and put the binaries in different path.

 

For example, it is safe to run 2 processes like this:

 

$ dotnet run --configuration client1 --launch-profile Demo.Client1
$ dotnet run --configuration client2 --launch-profile Demo.Client2

 

 

And the binaries will be put at "bin\client1" and "bin\client2".

 

$ ls Demo.Client\bin\
client1/  client2/

 

 

 

 

 

2.Passing program arguments

 

The other tip to use the program arguments.

Since we can set the Kestrel web-server’s options by config file or by WebHostBuilderKestrelExtensions.ConfigureKestrel Method (See Configure options for the ASP.NET Core Kestrel web server), we can take the program arguments and then set the custom configuration for each process.

 

For example, I want to run the same project in 2 processes with different port and different values of environment variable "ASPNETCORE_ENVIRONMENT".

 

$ cd Demo.Client\bin\Debug\net5.0
$ dotnet Demo.Client.dll --urls https://localhost:5001 --env Client1
$ dotnet Demo.Client.dll --urls https://localhost:5003 --env Client2

 

  

The "--urls" is a default argument of "dotnet run" that will set the listening URL of Kestrel webserver. "--env" is the custom argument that we will catch and update the "ASPNETCORE_ENVIRONMENT" value in our application.

public class Program
{
        public static void Main(string[] args)
        {
            if (args is { Length: > 0 })
            {
                #region Set the ASPNETCORE_ENVIRONMENT variable to the process by argument

                const string targetArg = "--env[= ]";
                var reg = new Regex($"{targetArg}.*");
                string env = args.Where(arg => reg.IsMatch(arg)).Take(1) .Select(s => Regex.Replace(stargetArg"")) .FirstOrDefault();
                Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"env);
                #endregion
            }

            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.ConfigureKestrel(serverOptions =>
                    {
                        // Set properties and call methods on options
                    }).UseStartup<Startup>();
                });
}


 

Reference


 

Configure options for the ASP.NET Core Kestrel web server

 

 


2021年7月28日 星期三

[C#] Check if a collection is empty (null or no elements)

  C#   Check empty collection  


List<stringstrs = null;

if(strs == null || strs.Count > 0)
  Console.WriteLine("1. The list is empty.");
  
if(!(strs?.Count > 0)) 
  Console.WriteLine("2. The list is empty.");
// Notice that when strs is null, 
// strs?.Count will be null and "strs?.Count == 0" will be false.   
if(strs is null || strs is {Count0})
  Console.WriteLine("3. The list is empty.");
  
if(strs is not {Count0})
  Console.WriteLine("4. The list is empty.");






2021年7月16日 星期五

[Entity Framework Core] Static methods for translating query expressions to SQL

 Entity Framework Core   SQL   LINQ  


There are some static methods under the namespace: "Microsoft.EntityFrameworkCore", that can provides CLR methods that get translated to database functions when used in LINQ to queries and Lambda Extension.

 

For example, a query with LIKE expression.

var entities = myDbContext.MyEntity.Where(x => EF.Functions.Like(x.Name"%ack%"));

 Or

var entities = from x in myDbContext.MyEntity
                           where EF.Functions.Like(x.Name"%ack%")
                           select x;


In Entity Framework, we can use the static method: SqlMethods to do the same thing as EF.Functions in EF Core.

For more reference on the mappings between the query expression and SQL, see Npgsql- Entity Framework CoreMapping and translationTranslations.

 


2021年7月15日 星期四

[PMI] PMP and ACP renewal

今天把 PMP ACP 證照都 renew 了,雖然 PMI 近幾年來在敏捷的議題或是教材上飽受質疑,不過本人很推崇 PMI 系統化的教材和教學方式。 而且我也覺得瀑布式和敏捷都有其適用的場景,重點在於是否能活用並解決問題。 當然我身在的軟體業變化快速,Agile 會是比較有效率的方式囉

 

另外在 renew 的過程中,大家應該都會加入 PMI membership 記得要在會員期間瀏覽並取得PMBOK® Guide and Standards (會員可免費下載。密碼是當時候你的 PMI 登入密碼)。

 

好吧,其實這一篇是廢文騙一下流量 😅😅  請多按網誌旁邊廣告,勿戰。

 






2021年7月10日 星期六

[Book] Creating Magic (落實常識就能帶人:迪士尼企業提升夢幻績效的10種領導力)


圖片來源:商業週刊





曾經去過日本迪士尼兩次,每次去都會不同的驚喜(當然人潮也是啦...)。 而樂園及飯店的服務品質簡直無可挑剔; 因此當在2017年公司附近的書店看到這本書,就馬上帶回家快速閱讀一遍; 直到四年後才終於有時間把它仔細好好的閱讀第二遍。

書是如此神奇,每個時期你再翻閱同一本書都會有不同的心境和領悟。


2017 年中,我剛被升任為開發團隊的主管,面對數個專案,不同的USER、主管,還有內部帶領新舊人的課題; 排山倒海的壓力讓我沒有好好的去思考這本書上提到 "領導" (Leadership)能力和方法。 
  
2018年我加入一個年輕的開發團隊,我以為和我過去(年輕時候 XDD)和專案開發成員互動的方式就可以帶領這些人,結果我錯了。  新的世代看待工作和事物的方式已大大的不同。 所以我回頭翻了幾本書,包含這一本落實常識就能帶人:迪士尼企業提升夢幻績效的10種領導力,來重新檢視及調整我的方式。 


不過老話一句,書或文章的知識只能讓你"知道",真正能不能"內化"及"活用"就一定要練習和上場比賽啦。 




筆記


  • "我們的成功不是來自於魔法,而是我們的努力創造出魔法。"
  • 太平日子裡很容易就會認為自己已上軌道,但只有在危機來臨時才是真正的考驗。
  • 問員工表現前,先問問領導力。
    • 產品不是取得客戶滿意的唯一要素,重點在於如何款待客戶。
  • 迪士尼的成功公式:"卓越領導力" -> "優秀演員(員工)" -> "滿意的客戶" -> 完美的企業成果。
  • 優秀領導者會聚焦他人而非專注於自我。
    • 雇用隊的員工,訓練、相信、尊重及傾聽員工
    • 無論產品多好,在各個階層仍需要有參與感、被讚賞,以及對自己所做感到驕傲、全心投入的員工。
  • 年輕世代在職場會有不同的期許、需要及要求。
    • 彈性、非專制,且將他們視為獨立個體與准許他們發展與開拓全部潛能的環境。
    • 得到有意義的工作、有趣的挑戰、平衡的生活及獲得感謝。
    • 不願被"上司"視為下屬,也希望能與謙遜且將重心放在工作本身而非地位的領導者共事。
  • 組織文化不會一夜之間改變。 建立以員工為主、尊重所有人的環境或許會很費時,但身為領導者,你需要崇高的願景與執行它們所需的技能,更需要耐心、恆心及堅強的意志力。


CH1.別輕忽任何人

  1. 當每個員工都重要,也都了解自我價值,便會樂於工作,且願意奉獻。
  2. 而當員工感覺不被接納時,便會變得消極,也不會全心投入工作。


CH2.落實改善組織結構

  1. 你或許能聘請最佳人才並激發他們,但若無法提供正確的結構,他們就無法發揮最大成效。
  2. 一個領導者是思考組織該有什麼樣的結構,而非僅是在既有結構中努力付出。
  3. 優質的組織結構可以降低成本、最大化工作效益、精簡決策程序、增加員工滿意度、培養創造力與革新。


CH3.聘用正確人才

  1. 聘用比自己更有才華的人
    • 如果對某位求職者感到猶豫,請確定不是因為擔心對方可能把焦點從你身上奪走。
    • 請聘用最好的人才,他們的成就不會掩蓋你的名望,而會讓你更加光彩奪目。
  2. 明確描述工作內容
  3. 親自視察求職者的表現

CH4.花費心思培育員工

  1. 給予目的,而非一件件工作
    • 人們會為住宿和飲食付出大量金錢,但印象最為深刻、會為其寫信致意的,卻是逗樂他們的巴士司機與在客房為孩子留下小小驚喜的房務人員。
    • "請確認每一位賓客都能享受到一生中最美好的時光"能傳達出各項任務的最終目的。
    • 讓"精神"存在於每一處:
      • 願景宣言:我們想達成的目標
      • 精髓宣言:我們想讓賓客感受到的目標
      • 使命宣言:我們該做的目標
  2. 成為一位教練
  3. 讓員工練習面對突發狀況
    • 預先擬定所有可能發生的狀況,並演練最有成效的反應措施。
    • 練習與演練是訓練士兵、運動員及其他需在意外狀態下發揮表現的方法。

CH5.剔除不必要的麻煩

  1. 小小程序,大大影響。 若少了完成事務所需的適當程序,即使是在絕佳環境中受過妥善訓練的員工都無法創造魔法。 每一間公司皆由程序所運作。
  2. 有效率的程序能順暢及穩定低完成例行事項,好讓員工有時間執行能讓優秀公司變成絕佳公司的額外事務。
  3. 無效的程序則帶來混亂、疑惑及不必要的麻煩。
  4. 身為領導者,你的責任之一便是辨識出程序問題並盡可能迅速解決。


CH6.了解真相

  1. 如果不了解事實,如何做決策?
  2. "我不知道發生了那件事情" 是不被允許的藉口。
  3. 探討完整的事實
    • 如果你想知道事情的後續,請在與員工交談時注意他們說了什麼又遺漏了什麼。
    • 觀察細微的線索,例如肢體語言、表情、或行為的改變來挖掘對方心中的真實想法。
    • 詳細作筆記,追問細節。用不帶威脅的方式持續挖掘,直到你找到事情真相。
    • 一旦找到真相,就該將你的焦點放在未來。

 

CH7.善用"ARE"的免費資源

感激(Appreciation),認同(Recognition),鼓勵(Encouragement),即 "ARE" 能量。
三種免費且能永續使用的動能,能增加自信及自尊心、驅動個人及團隊績效,讓組織穩健運行。


CH8.持續走在前面


  1. 帶領下屬也走在前面
    • 你不是唯一需要走在學習曲線領先的人。 領導者最重要的職責之一是支持其團隊持續接受教育。
  2. 渴求知識、注意周遭的一切,並持續增加參考對象。 讓你能用更新更好的方法來改善經營公司的方式。

CH9.隨時隨地保持適當言行

  1. 散播微笑的強大能量
    • 身為領導者,你需要隨時展現正面態度,因為你會決定團隊或組織的情緒。
    • 永遠不要低估微笑所散發的強大能量和其影響力。
  2. 保持幽默感
    • "假如我們沒有感到歡樂,就無法在工作上有最佳表現。"
    • 嚴肅看待你的工作,但別嚴肅到讓工作變得沉悶。
    • 創造讓員工下班時仍面帶微笑,或許還能與家人分享有趣小故事的環境,工作效率會更高。
  3. 隨時退居一旁,協助他人
    • 謙卑是專業素養的核心關鍵之一。
    • 隨時保持 "你沒有你想像中的那麼厲害" 的想法


CH10.立定言行準則

當生命來到尾聲,沒有人會在乎你之前有過什麼頭銜、賺多少錢、或是多偉大的人物。 如果你有堅實的品格,而且確實言行舉止都立基於此,人們就會記得你曾是一位值得追隨的領導者。