SSブログ

プログラマの数学 [読んでおく本]

プログラマの数学 第2版

プログラマの数学 第2版

  • 作者: 結城 浩
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/02/08
  • メディア: Kindle版

nice!(0)  コメント(0) 

SQLアンチパターン [読んでおく本]

SQLアンチパターン

SQLアンチパターン

  • 出版社/メーカー: オライリージャパン
  • 発売日: 2013/01/26
  • メディア: 大型本

nice!(0)  コメント(0) 

MyBatisでO/Rマッピング [プログラミング]

前置き

MyBatisは他のO/Rマッピングフレームワークとは違って、SQLとオブジェクトをマッピングする。
SQLをXMLファイルで別途定義できるので、実装が分担しやすく管理が容易になる。
以前のCRUD図作成アプリも、 この特性を利用して動作している。

今回は、手順が多い。が、ほとんどが事前準備で、実際はMapperインタフェースと、それに紐づけるXMLファイルがメイン。
本来であれば、Spring FrameworkなどのDIフレームワークと組み合わせて使用するのが一般的。
DIすると、SQLにMapperインタフェースを直接紐づけることができ、かなり便利になる。

今回実装するのは、以前のSQLを、 TableViewで表示するだけの簡単なプログラムで、SELECT文のみ使用する。
もう少し実務寄りな実装は、MyBatis公式で 確認すると良い。という元も子もない事を言っちゃう。

ポイント

  • MariaDBでCREATE TABLE時にCHARSETを指定する
  • @Mapperを付与したマッパーインタフェースを実装する
  • 取得ボタンはデータクラスのListで結果を取得する
  • 集計ボタンはMapのListで結果を取得する
  • 集計ボタンはSeq列を表示しない
  • NULLからデータのマッピングはできないので代替値を取得する
  • SqlSessionはCloseするまでトランザクションが終了しない

実装

pom.xmlにMyBatisと、JDBC(今回は、Maria DB)を追加する。

pom.xml


mybatis-config.xmlを作成し、接続情報とマッピング情報を定義する。

mybatis-config.xml


FXDemo.fxml


FXDemo.kt


mybatis-config.xml


データ準備


構成
MyBatis1.png

実行結果

取得ボタン押下
MyBatis2.png

集計ボタン押下
MyBatis3.png
nice!(0)  コメント(0) 

JavaFXの非同期処理 [JavaFX]

前置き

前回メモした通り、Progress系のコントロールで進捗状況を逐次確認したい時は、非同期で進捗度合いを更新する必要がある。
JavaFXでは非同期処理用に、javafx.concurrent.Taskクラスが用意されている。 Taskクラスのcallメソッドに、時間が掛かる処理を実装しておき、別スレッドでそのTaskを呼び出す流れ。

Taskクラスには、updateProgressメソッドが用意されており、簡単に進捗度を更新できるようになっている。
これにより、Progressコントロールに非同期処理を実装したTaskクラスをバインドすることで、 進捗度合いをリアルタイムでモニタできるようになっている。
Taskクラスは他にも、cancelledメソッドやsucceededメソッドなど、非同期処理を制御するためのメソッドが用意されている。
SwingのSwingWorkerと使い方はほとんど同じだが、処理状況、進捗度合い、処理結果などを保持できるあたりが優秀。

画面設計

  • 初期表示
    • 全てのバーとインジケータを初期化
  • 実行中(Start・Restartボタン)
    • 第1インジケータを不確定モードにする
    • 第2バーを不確定モードにする
    • 非同期処理を開始 or 再開する
    • 他のバーとインジケータで進捗度をモニタする
    • Start・Restartボタンを非活性にする
  • 停止状態(Stopボタン)
    • 非同期処理を中断する
    • 全てのバーとインジケータに停止時の進捗度を表示する
    • 実行中はStartボタンのテキストをRestartに変更する
    • Restartボタンを活性化する
  • 完了
    • 全てのバーとインジケータの状態を完了にする
    • RestartボタンのテキストをStartに変更する

実装

FXDemo.fxml


FXDemo.kt

実行結果

初期表示
task1.png

実行中
task2.png

停止状態
task3.png

完了
task4.png


nice!(0)  コメント(0) 

ProgressBar・ProgressIndicator [JavaFX]

前置き

進捗状況を可視化するためのコントロール。
progressに負の値を設定すると、不確定モードとなる。
progressは1.0を完了状態とし、0.5を50%の状態として表示する。

因みに、何も考えずに使用すると、処理の終了時にゲージが一気に完了状態に切り替わったように表示される。
処理の進捗にあわせてゲージも徐々に上がっていくように見せるには、非同期処理で更新しないとダメ。
非同期処理についてのメモは次回に残す予定。

実装

FXDemo.fxml


FXDemo.kt

実行結果

Progress1.png Progress2.png
nice!(0)  コメント(0) 

CRUD図作成アプリを創る(5/5) [プログラミング]

前置き

さて、今回でいよいよ最終回。
前回までにメインの処理は完成しているので、後はGUIアプリに昇華させるだけ。
インプットに必要な情報を指定するだけのシンプルな作りにしている。

画面詳細

  • SQLディレクトリを選択する
    • ディレクトリ内のファイルのみ対象とする
  • 定義ブックを選択する
    • Excelブック(*.xlsx)のみ指定可能
    • 機能一覧シートの定義が必要
    • テーブル一覧シートの定義が必要
  • CRUD図作成処理を実行する
    • SQLディレクトリと定義ブックを両方選択していない場合は処理中断
    • 出力ファイルはExcelブック(*.xlsx)のみ指定可能
    • CRUD図作成処理を実行
      • CRUD図の作成に成功
        • メッセージを出力し処理終了
        • コンソールに処理結果を出力
      • CRUD図の作成に失敗
        • メッセージを出力し処理終了

実装

CrudMaker.fxml


CrudMaker.kt

実行結果

GUIイメージ

CrudMaker1.png

CRUD図イメージ(作成直後)

CrudMaker2.png

CRUD図イメージ(レイアウト調整後)

CrudMaker3.png


nice!(0)  コメント(0) 

CRUD図作成アプリを創る(4/5) [プログラミング]

前置き

前回までに取得してきた各種情報をベースに、CRUD図をExcelブックに書き込んでいくメソッドを実装する。
このメソッドの実装次第でCRUD図のレイアウトが決まる。
今回は、横軸に機能、縦軸にテーブルをプロットしてみた。
また、値のプロットしかしていないので、後で書式やレイアウトの調整は必要。

処理詳細

  • 引数に機能一覧Mapとテーブル一覧MapとCRUD情報Map、出力ファイルを指定する
  • ブックを作成
  • シートを"crud_yy-MM-dd"で作成
  • 1行目にヘッダ行を作成
  • 機能毎の列INDEX用のMapを作成する(列INDEX用Map)
  • CRUD情報MapをベースにキーSet(機能ID)を読み込む
    • 列INDEX用Mapに機能IDとINDEXをセットする
    • ヘッダ行に機能IDと機能名のセルを追加する
  • テーブル一覧Mapを読み込む
    • テーブル毎に1行作成する
    • 1列目にテーブルIDとテーブル名のセルを作成する
    • CRUD情報Mapを機能毎に読み込む
      • CRUD情報にテーブルIDが含まれるか判定する
      • 対応したSQL操作を追加する
      • 列INDEX用Mapをベースに対象機能の列にCRUDセルを作成する
  • 出力ファイルに作成したブック情報を書き込む

実装




nice!(0)  コメント(0) 

CRUD図作成アプリを創る(3/5) [プログラミング]

前置き

今回は、前回までの処理で取得した機能ID毎のファイルリストをベースに、 機能毎のCRUD情報を取得するメソッドを実装する。
ポイントはテーブルIDやSQL操作の判定に正規表現を利用していること。

今回実装するメソッドでは、正規表現の基礎知識が必要になる。
自分は正規表現に関わる全ての知識を 【詳説 正規表現 第3版】 で得た。
正規表現は、LinuxのGrepや一般的なテキストエディタでも採用されている汎用性の高い技術で、自分の中では、ある程度扱えるようになった後は、人生がイージーモードに変わったレベル。
難易度が低い、使用可能シーンが多い、即効性が高い、など非常に費用対効果が高いのだが、意外と軽視されがちなので、競争優位性も高いという、非の打ち所がない技術なので、非常におすすめ。

処理詳細

  • 引数にSQLファイル一覧Mapを指定する
  • テーブルIDの正規表現を定義する(テーブルIDReg)
  • SQL操作の正規表現を定義する(SQL操作Reg)
  • 戻り値用のMapを作成する
  • SQLファイル一覧Mapを1機能ずつ読み込む
    • SQL操作毎にテーブルID用のSetを定義する
    • 機能に対応するSQLファイルを読み込む
      • 1行ずつ処理を実行していく
      • SQL操作Regに合致する行を判定する
      • テーブルIDRegに合致するテーブルIDを取得する
      • 取得したテーブルIDを対応するSQL操作Setに追加する
    • 各SQL操作SetでCRUD情報を初期化する
    • 戻り値用Mapに機能IDとCRUD情報をセットする
  • 戻り値用Mapを呼び出し元に返却する

実装




nice!(0)  コメント(0) 

CRUD図作成アプリを創る(2/5) [プログラミング]

前置き

今回は機能・テーブル一覧ブックを読み込むメソッドと、機能IDのリストをベースに SQLファイルの一覧を取得するメソッドを実装する。
ポイントは機能・テーブル一覧ブックを読み込む際にヘッダ行をスキップしている所くらい。

処理詳細

機能・テーブル一覧ブック読み込みメソッド

  • 引数に定義ブックとシート名を指定する
  • 戻り値用のMapを作成する
  • 定義ブックから対象シートを取得する
  • 対象シートを最終行まで1行ずつ読み込む
    • ヘッダ行は読み飛ばす
    • 戻り値用MapにIDと名称をセットする
  • 戻り値用Mapを呼び出し元に返却する

SQLファイルの一覧取得メソッド

  • 引数に機能一覧MapのキーSetとSQLディレクトリを指定する
  • 戻り値用のMapを作成する
  • SQLディレクトリからファイルリストを取得する(再帰読み込みなし)
  • ファイルリストから1ファイルずつ読み込む
    • 機能一覧キーSetから機能IDを読み込む
      • ファイル名が機能IDから始まるかを判定する
      • 見つかった場合は戻り値用Mapに機能IDとファイルをセットする
  • 戻り値用Mapを呼び出し元に返却する

実装




nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。