Posts
.NET Core - Uninstall with shell script
若非使用 HomeBrew 安裝 .NET Core,沒辦法使用 HomeBrew 命令直接反安裝,需就官方解除安裝的步驟進行反安裝。
不過官方反安裝步驟繁瑣,需自行去多個目錄清除資料,非常不便。所以這邊直接使用 dotnet/cli 提供的腳本來進行反安裝。
先下載腳本。
wget https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/uninstall/dotnet-uninstall-pkgs.sh 運行下載下來的腳本。
sudo sh dotnet-uninstall-pkgs.sh .NET Core 就會被反安裝了。
dotnet --version && dotnet --list-sdks && dotnet --list-runtimes
read morePosts
.NET Core - Update .NET Core SDK with HomeBrew
用 HomeBrew 安裝的 .NET core SDK,可直接用 HomeBrew 進行更新。
像是筆者電腦中的 .NET Core SDK 是 3.0 的版本。
dotnet --version 要升級到最新版的 .NET core SDK 3.1,可直接透過 HomeBrew cask reinstall 命令去更新 dotnet-sdk 套件。
brew cask reinstall dotnet-sdk .NET core SDK 就會被升到 3.1 最新版。
dotnet --version
read morePosts
Redis - Install on Linux
要在 Linux 安裝 Redis,可先將 Redis 下載下來。
wget http://download.redis.io/redis-stable.tar.gz 解壓縮下載下來的檔案。
tar xvzf redis-stable.tar.gz 進到解壓縮後產出的目錄。
cd redis-stable 進行編譯(若無法編譯,請安裝 Make 與 gcc 套件)。
Make 編譯完成使用 utils 下的內建腳本進行 Redis 服務的設定與啟用。
./utils/install_server.sh 最後實際用 redis-cli 測試確認一下 Redis 服務正常運行即可。
src/redis-cli ping
read morePosts
Medis - Reunning locally
要在本地運行 Medis,先要將 Medis 下載下來。
git clone https://github.com/luin/medis 進入 Media 目錄。
cd medis 安裝需要的 npm 套件。
npm install 建置。
npm run build 因為運行需依賴 electron,若未安裝,這邊可進行全域安裝。
npm install -g electron 最後使用 npm 的 start 命令啟用程式即可。
npm start
read morePosts
gRPC - Unable to start ASP.NET Core gRPC app on macOS
使用 ASP.NET Core 3.0 範本建立 gPRC 程式, 在 MAC 的環境下直接運行起來會發生 HTTP/2 over TLS is not supported on macOS due to mis sing ALPN support 錯誤。
System.IO.IOException: Failed to bind to address https://localhost:5001. ---> System.AggregateException: One or more errors occurred. (HTTP/2 over TLS is not supported on macOS due to missing ALPN support.) (HTTP/2 over TLS is not supported on macOS due to missing ALPN support.) ---> System.NotSupportedException: HTTP/2 over TLS is not supported on macOS due to missing ALPN support.
read morePosts
gRPC - Services logging
gRPC Service 內建的 log 可透過 appsettings.json 控制 log 層級。
預設為 Information 層級。
{ "Logging": { "LogLevel": { "Default": "Debug", "System": "Information", "Grpc": "Information", "Microsoft": "Information" } } } 所以 gRPC service 運行起來會看到 Info 或是 Warn 層級的 Log 輸出。
若是調整為 Debug 層級,可看到像是哪個 gRPC method 被調用,以及是哪個 Method type 這樣的細部資訊。
除了用 appsettings.json 設定,也可以在建立 HostBuilder 時設定。
... public class Program { ... public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.AddFilter("Grpc", LogLevel.Debug); }) .
read morePosts
gRPC - Logging with interceptor in gRPC service
要紀錄每次 gRPC 的呼叫,可以使用 gRPC interceptor 來做。
建立一個 Interceptor 類別繼承自 gRPC 的 Interceptor,建立個建構子允許注入 Logger,接著覆寫掉會用到的方法,像是 UnaryServerHandler,然後在內部將要記錄的資訊透過 Logger 寫入 Log 即可。
像是下面這邊筆者實作了一個 Interceptor,希望能紀錄每次 gRPC 的調用。
using System.Linq; using System.Text.Json.Serialization; using System.Threading.Tasks; using Grpc.Core; using Grpc.Core.Interceptors; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace GrpcServiceInterceptor { public class LoggerInterceptor : Interceptor { private readonly ILogger<LoggerInterceptor> _logger; public LoggerInterceptor(ILogger<LoggerInterceptor> logger) { _logger = logger; } public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>( TRequest request, ServerCallContext context, UnaryServerMethod<TRequest, TResponse> continuation) { var response = await base.
read morePosts
gRPC - Global exception handling with interceptor in gRPC service
要做 gRPC 的全域攔截,可以使用 gRPC interceptor 來做。
建立一個 Interceptor 類別繼承自 gRPC 的 Interceptor,覆寫掉會用到的方法,像是 UnaryServerHandler,然後在內部調用基底的方法並用 try/catch 去攔截錯誤做對應的處理即可。
像是下面這邊筆者實作了一個 Interceptor,希望能在錯誤發生時顯示錯誤,並回傳錯誤訊息。
using System; using System.Threading.Tasks; using Grpc.Core; using Grpc.Core.Interceptors; using Microsoft.Extensions.Logging; namespace GrpcServiceInterceptor { public class ExceptionInterceptor : Interceptor { public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(TRequest request, ServerCallContext context, UnaryServerMethod<TRequest, TResponse> continuation) { try { return await base.UnaryServerHandler(request, context, continuation); } catch (Exception e) { Console.WriteLine(e.ToString()); var obj = (TResponse) Activator.CreateInstance(typeof(TResponse)); var prop = typeof(TResponse).
read morePosts
dotnet-dump - Analyze .Net Core dump file
Dump 出 .Net Core 的 Dump file 後。
可使用 dotnet-dump analyze 帶上 Dump file 的位置進行 Dump 檔的分析。
dotnet-dump analyze $dump_file 分析是使用 SOS 命令,像是要查詢 Thread,可輸入 clrthreads 命令。
clrthreads 要查詢呼叫堆疊,可輸入 clrstack 命令。
clrstack 要查看是什麼錯誤導致程式死掉,可使用 pe 命令。
pe -lines
read morePosts
dotnet-dump - Installation
要安裝 dotnet-dump 可使用 dotnet tool install –global 將 dotnet-dump 安裝到全域。
dotnet tool install --global dotnet-dump 安裝完設定路徑。
export PATH="$PATH:/root/.dotnet/tools" 查驗版本確認安裝無誤即可。
dotnet-dump --version
read more