after dusk, before dawn
最近好像沒啥能期待的MMO....
Wednesday, January 11, 2023
台灣想要的是和平,不是戰爭
作者: Died |
Wednesday, June 22, 2022
[.NET 6] Custom Converter for System.Text.Json
作者: Died |
He want user get the specific format from DateTimeOffset (not DateTime)
DateTimeOffset.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fffzzz");
//"2022-06-22 06:28:55.207+00:00"
If using default converter, the result will follow ISO 8601 format
return DateTimeOffset.UtcNow;
//"2022-06-22T05:55:57.4313761+00:00"
And the don't want to use ToString() to achieve it everytime, so the best way is add the custom converter to JsonOptions
Monday, January 3, 2022
WSL2 - Temporary failure in name resolution
作者: Died |
If you are first time install WSL2 and reboot or something like it, it may become no internet connectivity and show error
Temporary failure in name resolution
To fix it, please follow this gitgub issue, JohnnyQuest1983's reply.
The steps can be simple like this
- set generateResolvConf=false in /etc/wsl.conf
- set dns in /etc/resolv.conf
then use exit or wsl --shutdown, reboot wsl, and it worked, the internet back.
Thursday, October 14, 2021
[.NET 6] Implement custom LogProvider with RabbitMQ into ILogger
作者: Died |
In .NET 6, ILogger is very easy to use, but on modern project, we will write log to somewhere else and use log viewer to read it. For example: sent log to RabbitMQ and read on Kibana
Here is a demo to show how to lmplement a custom logging provider with RabbitMQ into ILogger in .NET 6 RC1, basically same as this article but with some modify.
Step 0 : Before Start
In this demo we choose RabbitMQ.Client to communite with RabbitMQ, you can choose other client if you want, just install it from nuget, easy.
Another thing is RabbitMQ server, if you don't have one, you can use docker to create one.
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management
Tuesday, September 28, 2021
[.NET 6] System.StackOverflowException after upgrade VS2022 to Preview 4.1 from 3.1
作者: Died |
System.StackOverflowException
HResult=0x800703E9
Message=Exception of type 'System.StackOverflowException' was thrown.
Stack overflow.
Repeat 2291 times:
--------------------------------
at Microsoft.Extensions.Primitives.ChangeToken+ChangeTokenRegistration`1[[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].OnChangeTokenFired()
at Microsoft.Extensions.Primitives.ChangeToken+ChangeTokenRegistration`1+<>c[[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].<RegisterChangeTokenCallback>b__7_0(System.Object)
at System.Threading.CancellationTokenSource.Invoke(System.Delegate, System.Object, System.Threading.CancellationTokenSource)
at System.Threading.CancellationTokenSource.Register(System.Delegate, System.Object, System.Threading.SynchronizationContext, System.Threading.ExecutionContext)
at System.Threading.CancellationToken.Register(System.Delegate, System.Object, Boolean, Boolean)
at System.Threading.CancellationToken.Register(System.Action`1<System.Object>, System.Object)
at Microsoft.Extensions.Configuration.ConfigurationReloadToken.RegisterChangeCallback(System.Action`1<System.Object>, System.Object)
at Microsoft.Extensions.Primitives.ChangeToken+ChangeTokenRegistration`1[[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].RegisterChangeTokenCallback(Microsoft.Extensions.Primitives.IChangeToken)
--------------------------------
at Microsoft.Extensions.Primitives.ChangeToken+ChangeTokenRegistration`1[[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].OnChangeTokenFired()
at Microsoft.Extensions.Primitives.ChangeToken+ChangeTokenRegistration`1+<>c[[System.__Canon, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].<RegisterChangeTokenCallback>b__7_0(System.Object)
at System.Threading.CancellationTokenSource.Invoke(System.Delegate, System.Object, System.Threading.CancellationTokenSource)
at System.Threading.CancellationTokenSource+CallbackNode+<>c.<ExecuteCallback>b__9_0(System.Object)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.CancellationTokenSource+CallbackNode.ExecuteCallback()
at System.Threading.CancellationTokenSource.ExecuteCallbackHandlers(Boolean)
at System.Threading.CancellationTokenSource.NotifyCancellation(Boolean)
at System.Threading.CancellationTokenSource.Cancel()
at Microsoft.Extensions.Configuration.ConfigurationManager.RaiseChanged()
at Microsoft.Extensions.Configuration.ConfigurationManager.AddSource(Microsoft.Extensions.Configuration.IConfigurationSource)
at Microsoft.Extensions.Configuration.ConfigurationManager.Microsoft.Extensions.Configuration.IConfigurationBuilder.Add(Microsoft.Extensions.Configuration.IConfigurationSource)
at Microsoft.Extensions.Configuration.ChainedBuilderExtensions.AddConfiguration(Microsoft.Extensions.Configuration.IConfigurationBuilder, Microsoft.Extensions.Configuration.IConfiguration, Boolean)
at Microsoft.Extensions.Configuration.ChainedBuilderExtensions.AddConfiguration(Microsoft.Extensions.Configuration.IConfigurationBuilder, Microsoft.Extensions.Configuration.IConfiguration)
at Microsoft.AspNetCore.Builder.WebApplicationBuilder.Build()
at Program.<Main>$(System.String[])
builder.Services.AddSingleton<IConfiguration>(builder.Configuration);
Solution
services.AddSingleton<IConfiguration>(configuration);
Wednesday, September 22, 2021
[JAVA] HMAC SHA384 example code
作者: Died |
import java.security.NoSuchAlgorithmException;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Mac;
public class SecureUtils {
private static String bytesToHex(final byte[] hash) {
final StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
final String hex = Integer.toHexString(0xff & hash[i]);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
public static void main(String[] args) throws NoSuchAlgorithmException {
final String nonce = "test"; //your key
final String message = "Password"; //your plain txt
SecretKeySpec signingKey = new SecretKeySpec(nonce.getBytes(),"HmacSHA384");
final Mac mac = Mac.getInstance("HmacSHA384");
try{
mac.init(signingKey);
System.out.println(bytesToHex(mac.doFinal(message.getBytes())));
}
catch(Exception ex){ }
}
}
Sunday, January 31, 2021
[敗家] Alienware m17 R3
作者: Died |
Alienware m17 R3
上一台筆電是2013年買的Alienware M14x R2,拿來寫code已經有點慢了,最近終於找了機會買了新筆電,17吋螢幕真的比較適用啊。
不能免俗地附上配備表。
順帶一提,這次順便買了外星人背包,裝17吋筆電剛好,還有些空間可以裝我需要的東西,相當不錯。
這是2020/12月底買的,沒想到一忙就忘記貼文,直到現在。
Sunday, November 8, 2020
[.NET Core] 400 Bad Request / 'MS-ASPNETCORE-TOKEN' does not match the expected pairing token
作者: Died |
At this time, I am testing an old code build by .NET Core 2.0, when I tring to send request to the service, I always got 400 Bad Request, but I can know the service got request because I am running debug mode, it shows request coming and exception happend.
Since I can't find out the error just by 400 bad request, I open "Application Insights Search" in Visual Studio and found this error.
After some digging on stackoverflow, I found the error cause by a old version bug.
This question "Cannot debug in Visual Studio after changing the port number?" 's answer has good explain about this error.
You are getting this error message because Kestrel expected to run behind IIS, and received a direct request. And it noticed that because IIS was not there to inject the MS-ASPNETCORE-TOKEN header. --Gerardo Grignoli
Here have some options to solve the problem:
- Call UseUrls() before UseIISIntegration()
- Use Kestrel to debug, not IIS Express
- Upgrade the framework
That's all,
Sunday, November 1, 2020
[.NET core] Localization with Enumeration
作者: Died |
Let's see how it work.
1.Add resource file
2.Setup Startup.cs
Add following code (depending how many language you support) into your IServiceCollection//set Support Cultures and default
services.Configure(options =>
{
var supportedCultures = new[]{
new CultureInfo("en-US"),
new CultureInfo("zh-TW"),
new CultureInfo("ja-JP")
};
options.DefaultRequestCulture = new RequestCulture("en-US");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
//set resource path
services.AddLocalization(options => options.ResourcesPath = "Resources");
Make sure your ResourcesPath set to right path.
3.DI Localizer
Since we are using .NET Core, so we need to DI our Localizer before we using it, for example if you are use it on a controller.private readonly IStringLocalizer _localizer;
public YourController(IStringLocalizerFactory factory)
{
_localizer = factory.Create("Message", System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
}
The "Message" is my resource name, you can DI multi Localizer if you have not only one resource group.
4.Usage
Here is the content of my resource, the usage for Localizer is easy, just use it like a dictionary.var str = _localizer["Cool"];
If you wanna get a localization string for enum, it was easy too, for example your enum called "WeatherSummary".
var str = _localizer[WeatherSummary.Cool.ToString()];
It was very simple, don't need add custom thing like LocalizedDescriptionAttribute for enum i18n in .NET Framework.
You can check my demo code on github .NET-Core-Localization-and-Enum
Hope you enjoy it.
Sunday, October 25, 2020
[.NET core] System.NotSupportedException: The collection type 'System.Object' on 'somewhere' is not supported.
作者: Died |
System.NotSupportedException: The collection type 'System.Object' on 'somewhere.InnerResult.Data' is not supported.
at System.Text.Json.JsonPropertyInfoNotNullable`4.GetDictionaryKeyAndValueFromGenericDictionary(WriteStackFrame& writeStackFrame, String& key, Object& value)
at System.Text.Json.JsonPropertyInfo.GetDictionaryKeyAndValue(WriteStackFrame& writeStackFrame, String& key, Object& value)
at System.Text.Json.JsonSerializer.HandleDictionary(JsonClassInfo elementClassInfo, JsonSerializerOptions options, Utf8JsonWriter writer, WriteStack& state)
at System.Text.Json.JsonSerializer.Write(Utf8JsonWriter writer, Int32 originalWriterDepth, Int32 flushThreshold, JsonSerializerOptions options, WriteStack& state)
at System.Text.Json.JsonSerializer.WriteCore(Utf8JsonWriter writer, Object value, Type type, JsonSerializerOptions options)
at System.Text.Json.JsonSerializer.WriteCore(PooledByteBufferWriter output, Object value, Type type, JsonSerializerOptions options)
at System.Text.Json.JsonSerializer.WriteCoreString(Object value, Type type, JsonSerializerOptions options)
at System.Text.Json.JsonSerializer.Serialize[TValue](TValue value, JsonSerializerOptions options)
at TestWeb.Controllers.AuthController.VerifyToken(String token, Int32 tp) in C:\repos\somewhere\TestWeb\Controllers\AuthController.cs:line 51
public class InnerResult
{
public bool Success { get; set; } = true;
public int Code { get; set; }
public string Message { get; set; }
public dynamic Data { get; set; }
}
{
"success": true,
"code": 0,
"message": null,
"data": "vfu3MF5RFlQV9dWNQCFh6iRPNxeezFaV"
}
{
"success": true,
"code": 0,
"message": null,
"data": {
"name": "Died"
}
}
That's because in .NET core , they default using System.Text.Json to deal with json convert, but somehow it can't handle object in property, so......
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.1.9
If you are using .NET core 2.x , add .AddNewtonsoftJson() after your AddMVC()
services.AddMvc().AddNewtonsoftJson();
If using .NET core 3.x , add it after what you have.
services.AddControllers().AddNewtonsoftJson();
services.AddControllersWithViews().AddNewtonsoftJson();
services.AddRazorPages().AddNewtonsoftJson();
Then no more this System.NotSupportedExceptio again.