アーカイブ「2023年07月」

ASP.NETで、JSONなどのように複雑な形のリクエストをバリデーションする場合、

一発で検証する方法がなく、苦労していた。

どうにか再帰的にできないかな〜と思っていたところ、

よいライブラリがあったので、紹介します。

https://github.com/tgharold/RecursiveDataAnnotationsValidation

こいつはとても素晴らしいです。(マイクロソフトがちゃんとやってほしい気もするが。。)

(入力定義)

public class Card
{
    [Required]
    public int? CardId { get; set; }
    
    [Required]
    public string CardName { get; set; }
}

public class Req
{
    [Required]
    [Range(0, 10)]
    public int? UserId { get; set; }
    
    [MyValidationCollectionLength(Min = 4, Max = 10)] // 独自のバリデーション
    public List<Card> CardList { get; set; }
}

(検証コード)

var req = new Req
{
    CardList = new List<Card>()
};
req.CardList.Add(new Card());
req.CardList.Add(new Card{CardId = 1, CardName = "hoge"});
req.CardList.Add(new Card{CardId = 2, CardName = ""});

var validator = new RecursiveDataAnnotationValidator();
var validationResults = new List<ValidationResult>();
var result = validator.TryValidateObjectRecursive(req, validationResults);

(検証結果をJSON化したもの)

[
  {
    "MemberNames": [
      "UserId"
    ],
    "ErrorMessage": "The UserId field is required."
  },
  {
    "MemberNames": [
      "CardList"
    ],
    "ErrorMessage": "The field CardList is invalid."
  },
  {
    "MemberNames": [
      "CardList[0].CardId"
    ],
    "ErrorMessage": "The CardId field is required."
  },
  {
    "MemberNames": [
      "CardList[0].CardName"
    ],
    "ErrorMessage": "The CardName field is required."
  },
  {
    "MemberNames": [
      "CardList[2].CardName"
    ],
    "ErrorMessage": "The CardName field is required."
  }
]

という具合に、ちゃんと再帰的に検証してくれます。

APIなんかで複雑なリクエストを検証するときは大いに機能するかと思います。

素晴らしいですね。

以上

投稿日時:2023年07月26日 17:02   カテゴリー:c#   [コメントがあればどうぞ]

ショートタームサポートですが、

2023年6月にMariaDB11.0がGAされました。

詳細は以下から。

https://mariadb.com/kb/en/changes-improvements-in-mariadb-11-0/

で、今回のリリースでは、

オプティマイザのコストモデルに大きな修正が入っているのが特徴のようです。

自分としては、

innodb_flush_method

パラメータがdeprecatedになっており、

以下の4つのパラメータに分解されるようです。

  • innodb_log_file_write_through
  • innodb_log_file_buffering
  • innodb_data_file_write_through
  • innodb_data_file_buffering

ログ(WALログ?バイナリログ?それとも2つとも?)とデータによって、

DISKフラッシュをわけるようです。

とはいえ、ちょっと気になるのは、

https://mariadb.com/kb/en/innodb-system-variables/#innodb_flush_method

というページに、

From MariaDB 11.0, if set to one of the following values, then the values of the four boolean flags will be set as follows:

O_DSYNC: 
    innodb_log_file_write_through=ON, 
    innodb_data_file_write_through=ON, 
    innodb_data_file_buffering=OFF, 
    and (if supported) innodb_log_file_buffering=OFF.

fsync, littlesync, nosync, or (Microsoft Windows specific) normal: 
    innodb_log_file_write_through=OFF, 
    innodb_data_file_write_through=OFF, 
    and innodb_data_file_buffering=ON. 

という記述があり、よく見てみると、「O_DIRECTないじゃん」って思ったわけです。

正確には、innodb_flush_methodがなくなった場合、

「O_DIRECTできないじゃん」ということです。

「O_DIRECT」といえば、OSキャッシュをしない、いわゆるダイレクトIOであり、

LINUX環境では設定している人も多いハズ。

(O_DIRECT_NO_FSYNCってのもあり、mysqlのdedicated serverを使うとこっちになることもあるよう)

で、かわりに「O_DSYNC」となるわけだが、こいつの真偽のほどがわからん。。

調べてみると、「O_DIRECT」より速いけど条件付きだよとか、

SSDなら「O_DIRECT」より速いけど一貫性が低いよ(fsyncの回数が少ない?)なんてのもあり、

ちょっと何が正しいのかよくわからん状況です。

11系のLTSが出るまでは時間ありそうなので、

mysqlの動きと合わせて、少し注視しておいたほうがよさげな気がしてます。

あと、自分の作っているmagentadeskも11.0に対応済みです。

https://github.com/shigenobu/magentadesk

以上

投稿日時:2023年07月26日 16:44   カテゴリー:mariadb   [コメントがあればどうぞ]