カテゴリー「java」

MariaDBの同一ホスト間のデータ同期システムとして作っていたmagentadeskなのですが、

0.7.0のリリースで、MySQL 8.0.31 と 8.0.32 の対応を入れました。

https://github.com/shigenobu/magentadesk

なんで今までやらなかったかというと、

  • テーブルの解析でのinformation_schemaの格納のされ方が微妙にMariaDBとMySQLで異なる
  • MySQLではEXCEPTが8.0.31までなかった
  • MariaDBのdynamic columnに相当する機能がMySQLでは賄えるか不安だった
  • シーケンスがないのをどうするか

といったところでしたが、MySQL 8.0.31でEXCEPTが入ったので、

本腰入れて対応してみました。

やってみて色々大変でした。

なかでもUNIONの動作がおかしくて、無理やりやる感じでした。

MariaDBとMySQLでのUNIONの動作を見てみます。


まず以下のデータを用意します。

> select * from base;
+------+
| c    |
+------+
|    1 |
|    2 |
+------+

> select * from compare;
+------+
| c    |
+------+
|    1 |
|    3 |
+------+

次にこんなSQLを投げます。

with 
t1 as 
(
  select * from base
  except
  select * from compare
),
t2 as 
(
  select * from compare
  except
  select * from base
),
tt1 as 
(
  select 
  json_object('c', t1.c) as b,
  json_object('c', t2.c) as c
  from
  t1
  left outer join
  t2
  on t1.c = t2.c
),
tt2 as 
(
  select 
  json_object('c', t1.c) as b,
  json_object('c', t2.c) as c
  from
  t1
  right outer join
  t2
  on t1.c = t2.c
),
t as 
(
  select * from tt1
  union
  select * from tt2
)
select * from t;

ちょっとややこしいのですが、

MariaDBとMySQLの結果を見てみます。

(MariaDB)

+-------------+-------------+
| b           | c           |
+-------------+-------------+
| {"c": 2}    | {"c": null} |
| {"c": null} | {"c": 3}    |
+-------------+-------------+

(MySQL)

+-------------+-------------+
| b           | c           |
+-------------+-------------+
| {"c": 2}    | {"c": null} |
| {"c": 1}    | {"c": 1}    |
| {"c": null} | {"c": 3}    |
+-------------+-------------+

いやー、MySQLの結果がおかしいですよね。これ仕様なのか?

EXCEPTで除いている筈なのに。。

MySQLのUNIONは結構昔から不具合あるようで、

なんかこうなってくると複雑な集計クエリーを投げるのがちょっと怖い感じもしますね。

現状では、気をつけましょうとしかいいようがないですが。。

以上

投稿日時:2024年09月26日 00:43   カテゴリー:java, mariadb, mysql   [コメントがあればどうぞ]

大したリリースではないのですが、記載します。

https://github.com/shigenobu/ebonyrack/releases

0.6.1と比べて、

・マルチディスプレイの修正

・tableのカラムのテキスト部分をダブルクリックで選択可能(コピーしやすいように)

・読み込み専用モードで開く環境変数追加

という薄い内容です。

tableのカラムのテキストを選択可能とするのは意外と難しく、

もともろJLabelでやっていたのですが、JLabelではテキスト選択ができないため、

JTextFieldにして、ダブルクリックイベントで、コメントの部分の選択範囲を修正するなどの対応を行っています。

やりたいことが難しくて、なかなか進まない現状。。

外部キーのANTLRのパースとかも入れたほうがいい気がしてきています。。

以上

投稿日時:2024年07月09日 23:37   カテゴリー:java, mariadb   [コメントがあればどうぞ]

ちょこちょこ作業してます。

https://github.com/shigenobu/ebonyrack/releases

たまには画面もつけてみよう。(GITHUBに載せたままですが)

v0.5.2からv0.6.1までの主な変更は以下のとおりです。

  • テーブル・シーケンスの右クリックに「Edit」追加(ダブルクリック以外でも開けるように)
  • DDLインポート修正(DOCコメントの不具合、カラムオプションに生成列とチェック制約を登録できるように)
  • 起動時に最新バージョンのチェックを行う(古いバージョンの場合最新バージョンのリンクが表示されます)
  • HTMLにおいて、ダイアログの外側をクリックしたときに、ダイアログを閉じる処理を追加

やりたいことはたくさんあるのですが、なかなか実装が難しいので、

とりあえず未来のTODOを記録しておきます。

  • VIEWの対応
  • TRIGGERの対応
  • FUNCTIONの対応
  • PROCEDUREの対応
  • まとめて行う処理諸々(テーブルやパーティションに対してのグループの一括付与・除去とか、テーブルからカラムをまとめて付与・除去とか)
  • カラムを選択可能にしたい(JEditorPaneとか)
  • オブジェクトの複数一括移動
  • オブジェクトのグループ化みたいなもの

うーん、どれも難しい。。

以上

投稿日時:2024年04月25日 00:22   カテゴリー:java, mariadb, mysql   [コメントがあればどうぞ]

ebonyrack 0.5.2 のリリースとともに、日本語マニュアルを追加しました。

(リリース)

https://github.com/shigenobu/ebonyrack/releases

(マニュアル)

https://github.com/shigenobu/ebonyrack/blob/master/manual/manual.ja.md

これでかなりわかりやすくなったと思うので、

利用者が増えてくれると嬉しいと思っていたりする自分がいます。。


0.5.2 では大掛かりな変更はないのですが、

HTML出力で、これまで<map><area>タグで制御していた部分を、

<svg><rect>タグで制御するように変更しました。

なぜ、svgを採用したかというと、mapだとクリックした場所を目立たせるというようなことが難しく、

そこでsvgとすることでクリックした場所を目立たせるようにすることが可能となりました。

<img usemap="#components" id="image" src="data:image/png;base64,..."/>
<map name="components">
  <area id="a" shape="rect" coords="10,10,20,20"/>
  <area id="b" shape="rect" coords="20,20,30,30"/>
  <area id="c" shape="rect" coords="30,30,40,40"/>
</map>
<script type="text/javascript">
var es = document.querySelectorAll("area");
for (let i = 0; i < es.length; i++) {
  es[i].addEventListener('click', (e) => {
    // ダイアログを表示する処理
  });
}
</script>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
  <image href="data:image/png;base64,..." width="100" height="100"/>
  <rect id="a" x="10" y="10" width="10" height="10" fill="red" fill-opacity="0" stroke="red" stroke-opacity="0"/>
  <rect id="b" x="20" y="20" width="10" height="10" fill="red" fill-opacity="0" stroke="red" stroke-opacity="0"/>
  <rect id="c" x="30" y="30" width="10" height="10" fill="red" fill-opacity="0" stroke="red" stroke-opacity="0"/>
</svg>
<script type="text/javascript">
var es = document.querySelectorAll("rect");
for (let i = 0; i < es.length; i++) {
  es[i].addEventListener('click', (e) => {
    // opacityの操作(他のrectのopacityを戻す操作は割愛)
    es[i].setAttribute("fill-opacity", "0.2");
    es[i].setAttribute("stroke-opacity", "1");
  
    // ダイアログを表示する処理
  });
}
</script>

見ていただければわかるかと思うのですが、

svgでrectを作っておき、不可視状態(opacityを0)にしておき、

クリックイベントで可視状態(opacityを0以外)にするというものです。

mapだと、areaのどこをクリックしたのかわかりずらかったものが、

svgとrectを使うことでクリックした場所(対応するオブジェクト)をわかりやすく表示できるようになります。

イメージを添付しておきます。

(初期状態)

(クリック後)※ダイアログが立ち上がっていますが、赤くなっていることがわかるかと。

意外とこういうことをコードレベルでやっている人は少ないようで、

svgの仕様見ながら試行錯誤で書いてみました。

今後は、積極的にsvgを活用するのもありだなと思っています。

以上

投稿日時:2024年02月14日 23:36   カテゴリー:html, java, mariadb, mysql   [コメントがあればどうぞ]

ebonyrack 0.5.0 をリリースしました。(最近こればかり。。)

https://github.com/shigenobu/ebonyrack/releases

0.4.0 から 0.5.0 での機能追加は以下のとおりです。

  • テーブルからクラス作成(一括・個別)
  • DDLインポートの個別対応
  • テーブル・シーケンス・ノートのコピー&ペイスト
  • DDLに関連するノートの情報をdocコメントとして記載

その他、諸々細かな修正等はありますが、

今回の中では「テーブルからクラス作成」が比較的大きな機能かなと。

これはテンプレートにテーブル情報を渡して、

そのテンプレートをレンダリングすることでクラス(ソースコード)の生成が出来るというものです。

テンプレートは、Velocityの機能が使えるので、他テンプレートを取り込んだりすることもできます。

テンプレートはカスタマイズ可能です。

テンプレートは、

~/.ebonyrack/template/

ディレクトリ以下に配備します。起動時にサンプルが配備されます。

「Sample.java.vm」というように、「{識別名}.{出力したい拡張子}.vm」としてください。

「コピー&ペイスト」もかなり大変ではあったのですが、ひとまずできてます。

とはいえ、コピー時に参照をコピーするだけで、ペイスト時に複製をかける仕組みにしているため、

コピーからペイストの間に、元データに修正が入ると、ペイストされたデータも同様の変更が入るようになってます。

そもそも、コピー&ペイストとして、これがあっているかはわからないのですが、

ひとまずそんな感じになってます。

だいぶできたのですが、少し忙しくなりそうなので、

ebonyrackの機能追加は見合わせようかなと。

もちろん、不具合あれば修正していきますが、

時間みて、操作マニュアル等のドキュメント作成をしていこうかと考えています。

改めて、0.5.0 での機能は以下のようになってます。

  • テーブル作成
  • シーケンス作成
  • ノート作成
  • データのWrite out → JSONを出力するので、バージョン管理で使えるかも
  • データのRead in → Write outされたJSONを取り込めるので、作業者以外はいいかも
  • DDLのImport(最初に一括と、個別で追加)
  • DDLの出力(一括と個別)
  • 画像の出力
  • HTMLの出力 → 本アプリを使わない作業者にいいかも
  • クラス用ソースコード生成(一括と個別)

機能としては、一通り出揃った感はあるので、

今後としては、使い勝手の向上、見栄えの向上、パフォーマンス調整とかでしょうか。

使ってくれる人がいれば嬉しいです。

以上

投稿日時:2024年01月26日 16:19   カテゴリー:java, mariadb, mysql   [コメントがあればどうぞ]

ebonyrack 0.4.0 をリリースしました。

https://github.com/shigenobu/ebonyrack/releases

今回の目玉は、DDLからのIMPORTです。

結構危険な機能なので、新規プロジェクト作成直後しか利用できません。

この機能により、mysqldumpまたはmariadb-dumpで出力される

  • CREATE SEQUENCE
  • CREATE TABLE

をパースして、ebonyrack上に展開することが可能となります。

いい加減なDDLでは駄目で、データベースが吐き出すDDLを使ってください。

こんな感じですね。

mariadb-dump --databases test -d > test.sql

DDLのパースには、antlr4を使っています。

(ANTLR)

https://www.antlr.org/

※内包したため、かなりバイナリが重くなりました。。

※ANTLRを使ったMariaDBのパースについては、そのうち書こうかと思います。

とはいえ、以下の機能の部分のパースは無視しています。

  • テーブルのオプション
  • カラムのオプション(生成列とかCHECK制約とかINVISIBLEとか)
  • 外部キー

一応、実案件の100を超えるテーブルは取り込めたので、まあ大丈夫かなと。

備忘録を兼ねて、今後のTODOを記載しておきます。

  • オブジェクトのコピー&ペイスト(やっぱりあるといいなと思いました)
  • IE記法の導入
  • ヘルプダイアログ
  • クラス生成
  • DDL出力時に関連するノートをDOCコメントとして出力

このうちの「クラス生成」は、テンプレートを指定すると、

クラスコードが作れるってやつですね。

これをやると、設計段階でプログラムのクラスが作成できるのでいいかなと思っています。

以上

投稿日時:2024年01月19日 16:30   カテゴリー:java, mariadb, mysql   [コメントがあればどうぞ]

https://github.com/shigenobu/ebonyrack/releases

というわけで、今月は滅茶苦茶バージョンアップしました。

ERMASTERの代替を目指して作り始めてみましたが、

逆にERMASTERの偉大さを痛感しています。。

代替なんておこがましいですね。。

とはいえ、機能紹介をしておきます。


  • テーブル作成
  • シーケンス作成
  • ノート作成
  • データのWrite out → JSONを出力するので、バージョン管理で使えるかも
  • データのRead in → Write outされたJSONを取り込めるので、作業者以外はいいかも
  • DDLの出力
  • 画像の出力
  • HTMLの出力 → 本アプリを使わない作業者にいいかも

って具合です。

細かい不具合(わかっている限り描画の背景が一部無くなるとか、画像出力がまれにおかしくなるとか)やら(0.3.5で修正しました、多分)、

どうしてもチェックしきれいないところ(check制約やpartitionの式部分の正当性の保証ができない)もありますが、

かなり使えるレベルまで進化したかと自己満足しています。

あとは、どのくらいのオブジェクト数に耐えられるかを試験したいのですが、

そうなると、実案件からインポートするような機能が必要となり、

今のアプリとは別に作ることも考えています。(Read inがあるから別につくっても行けそうな気がする)

とはいえ、アプリではカラム情報なんかは「辞書」という形で持っていたり、

外部キー制約を厳し目にやっていたりするので、インポートも一筋縄ではいかなそうです。

ヘルプというかマニュアルというかも整備しないと意味が不明なので、

操作性の修正に加えて、インポートやらヘルプなんかも少しずつ進められばと考えています。

以上

投稿日時:2023年12月12日 16:52   カテゴリー:java, mariadb, mysql   [コメントがあればどうぞ]

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

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   [コメントがあればどうぞ]

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

最初の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   [コメントがあればどうぞ]