前回投稿から、しばらくたちましたが、

0.1.0から少しずつ機能追加・修正を繰り返し、

0.2.0をリリースしました。

https://github.com/shigenobu/ebonyrack/releases/tag/v0.2.0

(最新はこちら)https://github.com/shigenobu/ebonyrack/releases

前回書いていて、実装したかった分ですが、とりあえず以下の内容で対応しています。

むずい。ペンディング。

むずい。ペンディング。

こちらは、0.2.0でアウトライン機能を実装しました。

アウトラインの枠内を動かすことで、右側のワークスペースが一緒に動きます。

逆もまた同じです。

今まで、グラフィックスを取得すると、後続が描画されないということで諦めていたのですが、

    var rect = workspace.getBounds();
    var captureImage =
        new BufferedImage(rect.width, rect.height,
            BufferedImage.TYPE_INT_ARGB);
    var cg = captureImage.getGraphics();
    workspace.printComponents(cg);
    cg.dispose();

    var g2 = (Graphics2D) g.create();
    g2.drawImage(captureImage, 0, 0, w, h, new Color(73, 70, 44, 8), null);
    g2.dispose();

なんて感じで「printComponents」メソッドを使うことで上手く描画できました。

画像・DDLともに出力時に保存先を選択できるようにしました。

最後に出力した保存先は、次回保存するときにデフォルトで選択されるようになりました。

DDLについては、シーケンス・テーブル・外部キー、を選択して出力できるようにしました。

いつかやる。(かも)

だいぶできてきた感じはあるものの、

まだ対応しきれない細かい部分は結構ある感じです。

直近では、プロジェクトを開いたときに、

ワークスペースのスクロールバーの位置が調整できていないことがあるので、

それを直していければとは考えています。

ひとまず、当面はUI改善を進めつつ、パーティンションの機能を追加できればとは考えています。

以上

投稿日時:2023年11月28日 13:45   カテゴリー:java, mariadb, mysql  

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  

最近知りました。

詳細については、以下を参考ください。

https://github.com/dotnet/runtime/issues/67214

本件ですが、

  • WINDOWSは問題なし
  • MACはダメ
  • LINUXはダメ

ということのようで、LINUXでやってみました。

環境は以下の通りです。

$ cat /etc/os-release
NAME="Pop!_OS"
VERSION="22.04 LTS"

$ dotnet --version
6.0.402

(1. 同期のダメな場合)

public class Program
{
    public static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("main");
            throw new Exception();
        }
        catch (Exception e)
        {
            Console.WriteLine("error");
            throw; // ←こいつが原因
        }
        finally
        {
            Console.WriteLine("finally");   // ここを通過しない
        }
    }
}

(2. 同期でOKな場合)

public class Program
{
    public static void Main(string[] args)
    {
        try
        {
            try
            {
                Console.WriteLine("main");
                throw new Exception();
            }
            catch (Exception e)
            {
                Console.WriteLine("error");
                throw; // ←こいつがいてもfinallyに入る
            }
            finally
            {
                Console.WriteLine("finally");   // 上位のエラーハンドラーがいればOK
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("error - wrapper");
        }
    }
}

(3. 非同期の場合)

public class Program
{
    public static async Task Main(string[] args)
    {
        try
        {
            Console.WriteLine("main");
            throw new Exception();
        }
        catch (Exception e)
        {
            Console.WriteLine("error");
            throw; // ←こいつがいてもfinallyに入る
        }
        finally
        {
            Console.WriteLine("finally");   // async修飾子があればOK
        }
    }
}

(4. NET6からの簡易構文の場合)

try
{
    Console.WriteLine("main");
    throw new Exception();
}
catch (Exception e)
{
    Console.WriteLine("error");
    throw; // ←こいつがいるとダメ
}
finally
{
    Console.WriteLine("finally");   // ここを通過しない
}

以上のように、4つのパターンで試してみました。

asyncの場合は何も気にする必要はないですが、他パターンでは一考が必要かなと。

ちなみに以下のようなエラーになります。

Unhandled exception. System.Exception: Exception of type 'System.Exception' was thrown.

これって、コンテナでやるときにやばいかなと思う。。

気をつけてください。

また、シャットダウンハンドラー(以下のようなコード)を仕込んでみましたが、

動いたのは、「2. 同期でOKな場合」だけでした。

そもそも、asyncはシャットダウンハンドラーって使えない?(要調査)

AppDomain.CurrentDomain.ProcessExit += new EventHandler(ShutdownHander);
public static void ShutdownHander(object sender, EventArgs e)
{
    Console.WriteLine("shutdown");
}

(追記)

Unhandled exceptionは、ProcessExitには反応しないようです。

こちらを使う必要があります。

https://learn.microsoft.com/ja-jp/dotnet/api/system.appdomain.unhandledexception?view=net-8.0

以上

投稿日時:2023年05月18日 18:00   カテゴリー:c#  

多くの苦難を乗り越え、とりあえずですが、

最初のGAリリースを成し遂げました。

https://github.com/shigenobu/ebonyrack/releases/tag/v0.1.0

(最新はこちら)https://github.com/shigenobu/ebonyrack/releases

今回のGAでは、オブジェクトのスムーズな移動を実装しました。

TimerとMouseInfoを駆使することで、なんとか実装できました。

参考させていただいた「てんぷらメモ」様のサイトには感謝です。

(参考)

https://ateraimemo.com/Swing/MouseInfo.html

何度か記載していますが、今後の実装予定は以下です。(諦めちゃうかもしれませんが)

  • オブジェクトのコピー&ペースト → やっぱりCTR+Cとか使いたいよね
  • 外部キーのコネクターのIE記法導入 → 現状、文字表現なので(優先度低め)
  • 拡大・縮小またはアウトライン表示でのスムーズな表示中画面移動 → オブジェクトの数が多いとしんどいよね
  • 画像・DDL出力時のオプション選択 → 外部キーいらないとか、IF NOT EXISTSで出力したいとか
  • ヘルプダイアログを各所に配置 → 説明なしなので。。

なお、0.1.0に自己相関は入ってますので。


では、あらためて「ebonyrack」の紹介をさせていただきます。

「ebonyrack」は「ER Master」を代替する目的で作っており、

データベースのテーブル設計のためのツールです。

対象はMariaDBですが、MySQLでも問題なく使えます。

とはいえ、パーティションや、テーブルの細かな設定などには対応していません。

ViewやTriggerなどを定義する機能もなく、

あくまでテーブルの定義とその関連を可視化し、DDLとして出力するためのツールです。

テーブル設計に重点をおいているため、既存データベースからのリバースエンジニアリングはありません。

おそらくは、今後も一人でぽちぽち修正していくことになるので、

大幅な機能追加などはしない(できない)かなと思っています。

なので、不具合があったら、githubのISSUEで教えてもらえばとは思いますが、

全部直したりはできないかもしれませんので、ご了承ください。

githubのISSUEについては、英語でお願いしたいのですが、

もし日本語であるのでしたら、githubのメールアドレス宛に連絡ください。

なお、利用にあたっては、OSSなんで自己責任でお願いします。

といろいろ書きましたが、とりあえず形になってホッとしてます。

何年できるかわからんですが、可能な限り頑張れればとは思ってます。

また、過去コミットを消してしまったのですが、コネクターの結線アルゴリズムについては、

ArmadaSuitさんに手伝ってもらったので、

Contributorsに記載させていただいております。

ご協力ありがとうございました。

以上

投稿日時:2023年05月05日 22:48   カテゴリー:java, mariadb, mysql  

RCリリースですが、0.0.3をリリースしました。

https://github.com/shigenobu/ebonyrack/releases/tag/v0.0.3

(最新はこちら)https://github.com/shigenobu/ebonyrack/releases

  • 自己相関時の外部キーのコネクター変更
  • 外部キーのコネクターのIE記法導入

を前回書きましたが、やはりIE記法は難しく、

なんとか数字で表示する形で対応しました。

残りの課題は、折を見てやろうかな。。

あとはちょいちょい修正などをして、

次でGAリリースしたいかなと。

以上

投稿日時:2023年05月02日 16:34   カテゴリー:java, mariadb, mysql  

ebonyrackの0.0.2をリリースしました。

https://github.com/shigenobu/ebonyrack/releases/tag/v0.0.2

(最新はこちら)https://github.com/shigenobu/ebonyrack/releases

まだ、RCですが、ちょちょい修正しています。

あと1回くらいRCだして、GAリリースにしようかなと。

かなり課題があるので、取り組めたら以下やろうかなと。

  • オブジェクトのコピー&ペースト
  • 外部キーのコネクターのIE記法導入
  • オブジェクト移動中の残像表記(マウスでのスムースな移動)
  • 拡大・縮小またはアウトライン表示でのスムーズな表示中画面移動
  • 画像・DDL出力時のオプション選択
  • ヘルプダイアログを各所に配置
  • 自己相関時の外部キーのコネクター変更

とはいえ、全体的な作りもイマイチなので、どうにか見直したいと思うこのごろ。。。

以上

投稿日時:2023年04月28日 18:01   カテゴリー:java, mariadb, mysql  

2023年2月にMariaDB 10.11がリリースされました。

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

LTSリリースということで、2028年2月までのサポートとなります。

基本的には、リリースノートを見ていただければとは思いますが、

個人的には system versioning テーブルの dump/restore サポートがついに入ったか〜という感じです。

たとえば、こんな感じで、テーブルつくって、データ操作します。

create table t_system_versioning (
  id int not null,
  name varchar(32) not null,
  primary key (id)
) with system versioning;

insert into t_system_versioning values (1, 'n1');
update t_system_versioning set name = 'n2' where id = 1;
delete from t_system_versioning where id = 1;

このあとの段階では、当然以下のようになります。

MariaDB [test]> select * from t_system_versioning;
Empty set (0.000 sec)

履歴をすべてを出力すると、以下のようになります。

MariaDB [test]> select *, row_start, row_end from t_system_versioning for system_time all;
+----+------+----------------------------+----------------------------+
| id | name | row_start                  | row_end                    |
+----+------+----------------------------+----------------------------+
|  1 | n1   | 2023-03-22 16:56:29.376669 | 2023-03-22 16:56:53.845864 |
|  1 | n2   | 2023-03-22 16:56:53.845864 | 2023-03-22 16:57:08.520850 |
+----+------+----------------------------+----------------------------+
2 rows in set (0.000 sec)

これまでは、これらの履歴データが dump で取得できませんでした。

10.11で追加されたオプション「–dump-history」を使うことで、履歴が dump に載るようになります。

$ mariadb-dump --databases test --tables t_system_versioning --dump-history
:
:
/*!101100 SET @old_system_versioning_insert_history=@@session.system_versioning_insert_history, @@session.system_versioning_insert_history=1 */;
LOCK TABLES `t_system_versioning` WRITE;
/*!40000 ALTER TABLE `t_system_versioning` DISABLE KEYS */;
INSERT INTO `t_system_versioning` (`id`, `name`, row_start, row_end) VALUES (1,'n1','2023-03-22 07:56:29.376669','2023-03-22 07:56:53.845864'),
(1,'n2','2023-03-22 07:56:53.845864','2023-03-22 07:57:08.520850');
/*!40000 ALTER TABLE `t_system_versioning` ENABLE KEYS */;
UNLOCK TABLES;
:
:

これで、やっと system versioning も使い易くなった感じです。

デフォルトの挙動としてもいい気がしますが。。

その他として、GPGキーが2023年から変わっています。

https://mariadb.com/kb/en/gpg/

バージョンアップの際は、上記を参考にGPGキーを更新する必要があるので、注意が必要です。

また、自分が作成している magentadesk も10.11 に対応しました。

https://github.com/shigenobu/magentadesk

v0.4.9 が 10.11 の対応版となります。

以上

投稿日時:2023年03月22日 17:10   カテゴリー:java, mariadb  

ER master という優れたツールがあります。

https://ermaster.sourceforge.net/index_ja.html

ただ、もう10年前に更新が止まっており、

eclipseプラグインの上、新しいeclipseでは動作しない(?)ものとなっています。

ER master は、データベースの管理はもとより、設計に注力したツールかと認識しており、

未だこれ以上のものは市場にはないような気はしています。

※有償でしか触れないようなものは除く

ずっと、ER master の代替になるようなものを作りたいと思っており、

非常に不十分ではありますが、ちょっとつくってみました。

(ebonyrack)

https://github.com/shigenobu/ebonyrack

https://github.com/shigenobu/ebonyrack/releases/tag/v0.0.1

(最新はこちら)https://github.com/shigenobu/ebonyrack/releases

mariadbの特有機能を盛り込もうかと思ってmariadbと書いてありますが、

特有機能を入れすぎて、複雑になりすぎてしまったため、

結局特有機能は削ぎ落とし、結果としてmysqlでも問題はない形になっています。

現時点では、不具合もあるでしょうし、機能不十分ではありますが、非常に大変でした。

クロスプラットフォーム(WIN、MAC、LINUX)での動作を目標としたため、

JAVAのSWINGで作成してします。

SWINGは基本機能は揃っていますが、

いわゆる気の利いたコンポーネントはないため、かなりコード量が肥大化しました。

よかったら使ってみてください。

今後もバージョンアップは続けますので。

以上

投稿日時:2023年03月22日 14:51   カテゴリー:java, mariadb, mysql  

C#で、IPアドレスを取得する際、Dns.GetHostEntryを使うという記事がよく出てきます。

当然、DNSサーバを利用する前提なので、DNSサーバから正引きできないと、

結局は、ローカルループバックアドレスしか取れなかったりします。

ローカルネットワークであっても、

consulやdnsmasqなどをつかって、DNS設定くらいちゃんとしとけよというのはもちろんですが、

IPアドレスだけで済むなら、そうしたいのものかと思います。(WINSサーバについては不明です)

このように、正引きできないが、ローカルアドレスを取りたい場合、

NICを直接見に行くほうが楽です。

自分のTCPサーバ・クライアントライブラリに、将来的に使いそうな気がして、実装しておきました。

https://github.com/shigenobu/PurpleSofa/blob/master/PurpleSofa/PsNetwork.cs

v4のアドレス取得部分だけ抜粋します。

    private static readonly IEnumerable<NetworkInterface> NetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces()
        .Where(i =>
            i.OperationalStatus == OperationalStatus.Up &&
            i.NetworkInterfaceType == NetworkInterfaceType.Ethernet &&
            i.NetworkInterfaceType != NetworkInterfaceType.Loopback);

    public static IEnumerable<IPAddress> GetLocalIpv4Addresses()
    {
        List<IPAddress> addresses = new();
        foreach (var networkInterface in NetworkInterfaces)
        {
            var address = networkInterface.GetIPProperties().UnicastAddresses
                .Where(a => a.Address.AddressFamily == AddressFamily.InterNetwork)
                .Select(a => a.Address)
                .FirstOrDefault();
            if (address != null)
                addresses.Add(address);
        }

        return addresses;
    }

要は、起動中のイーサネットのNICだけを取得して、それをIEnumerableで返している感じです。

これでWIFIも取れるかと思います。(LINUXでは大丈夫だったが)

NICを複数持っているケース、

たとえばゲートウェイサーバのように、外向きと内向きのアドレスを持つ場合などについては、

https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.aspnetcore.httpoverrides.ipnetwork?view=aspnetcore-7.0

なんていうクラス(ASPですが)を使うことで、

取得したアドレスが、指定のアドレス範囲内かどうかを判断して、取捨選択も出来るかと思います。

以上

投稿日時:2023年01月12日 23:27   カテゴリー:c#