Oracleからpostgresへの移行でCREATE SEQUENCEにハマる

OracleDBからpostgresへ移行しているのですが、シーケンスをOracleSQLDeveloperからDDLを生成して、そのままpostgresにCREATE SEQUENCEしたところ、下記エラーでそんなのないよと怒られます。。

test_db=# select * from tran_id
test_db-# ;
ERROR: relation tran_id does not exist

実行したDDLは下記の内容です。

CREATE SEQUENCE “TRAN_ID” MINVALUE 1 MAXVALUE 99999999 INCREMENT BY 1 START WITH 1 CACHE 20 CYCLE ;

権限周りを見直しても何も変わらず、試しに

 CREATE SEQUENCE TRAN_ID MINVALUE 1 MAXVALUE 99999999 INCREMENT BY 1 START WITH 1 CACHE 20 CYCLE ;

を実行したところ、CREATE出来た?普通にSQLでシーケンスが取れた。あれ?

postgresはダブルクォーテーションを付けると付けないでは別ものになるのですね。。

WindowsのRedmineプラグイン開発をVisualStudio Codeに移行してみた

 前にやろうとしていたRedmineのバージョンアップ対応ですが、バージョンが決まり(Redmine2.5.1&Ruby2.0&Rails3.2 → Redmine4.0.4&Ruby2.5&Rails5.2)、インフラ含めスケジュールされたので、ぼちぼち対応に入ろうとした所、Rubyのバージョンを2.0から2.5に変えた影響か、Windowsローカル環境のAptanaStudio3では、実行は出来てもデバッグしようとすると、


と出て動かなくなりました。

 これまで3年くらい、Redmineプラグインの開発用に使っていたAptanaStudio3ですが、原因調査を早々に諦めて、、VSCodeに開発環境を移行する事にしました。
 使っているWindows端末にはRuby系の環境は既にインストール済みなので、Rubyのみ最新にします。

C:¥temp>ruby -v
ruby 2.5.5p157 (2019-03-15 revision 67260) [x64-mingw32]

C:¥temp>rails -v
Rails 5.2.2

 VSCodeを普通にインストールして、既存のAptanaStudio3で対応していたフォルダをワークスペースに追加するだけで、準備が出来ましたが、デバッグ設定が一苦労。。ググるといろいろ情報があり、思いのほか試行錯誤しましたが、こちらが一番参考になりました。デバッグ用のGemをインストールし、設定を試していきます。

 最終的にlaunch.jsonは下記となり、ブレークポイントも止まるようになりました。


 VisualStudio Code ネットの評価に違わずいい感じです。新しいツールを使うのは少し手間が掛かりますが、気分的にもリフレッシュできますね。

Mybatis自動生成SQLからスキーマ名を除外

 既存のWebサービスをマイグレーションしようという事で、Springboot&Mybatis3で実装を開始し、開発端末上のOracleDBに接続してMybatisの自動生成機能を使用してみました。

 かなり便利で、簡単なSQLで済む範囲ならSQLを書く必要が無いようです。が、自動生成されたxmlを見てみると、SQL内のテーブル名にスキーマ名が付加されてしまいます。。
 実際に使用するサーバ上のDBはどんなスキーマ名になるか現段階では解らないし、スキーマ名をカットしてくれる設定が無いか、下記を読み込みます。

http://www.mybatis.org/generator/configreference/table.html

それっぽいのを何個か試して、結果、ignoreQualifiersAtRuntime をつける事でsqlMap.xmlに自動生成されるSQLからスキーマ名が無くなりました。

でも、既存システムはかなり複雑なSQLが多数有り、DB設計はそのままとなると、自動生成の恩恵も一部の限られた範囲になってしまいます。

カテゴリー: Java

Visual StudioでC++再配布可能パッケージ不要のDLLをビルドする

 結構前にちょっと触ったDLLですが、新しい端末に導入したところ動作しないので、何でだろ?と思ったらC++再配布可能パッケージ系が何も入っていない状態でした。
 再配布パッケージを入れるかどうか検討していたところこちらを発見。

 VisualStudioのプロジェクトの設定を見てみると、こんな感じです。

さらにコード生成の箇所を見てみます。

 ランタイムライブラリの箇所では<別オプション>としか表示されていないので、よく解らなかったのですが、消してから確認した所、<親またはプロジェクトの既定値から継承>が選択されていた事が判明。
 その為、全般設定側で指定されているプラットフォームツールセットに依存して再配布パッケージが必要な状態になっていたようです。2年近くもその事に気が付いていませんでした。。
 コード生成のランタイムライブラリを消してビルドした所、DLLのファイルサイズが大きくなりましたが、再配布可能パッケージ無しでも動くようになりました。

springboot AOP でリクエストパラメータをログに出力する

かなり前から稼働しているWebサービスをspringbootで再構築をしているところですが、リクエストとレスポンスをログに出力するという既存仕様の踏襲にAOPを使ってみました。
 対象のWebサービスは、昔ながらのフォームのポストでリクエストを受け付ける仕様なので、application/x-www-form-urlencodedに対応する形になります。
AOPについては、こちらを参考にさせて頂きました。
リクエストとレスポンスなので、@Aroundでメソッドの前後にログ出力をします。

Controllerのメソッド引数にHttpServletRequestとHttpServletResponseを入れる事で、Advicer側でパラメータが取得出来ました。

Adviser側です。

下記のようにログに出力されました。
2019-05-21 11-38-39.002:0:0:0:0:0:0:0:1:/online/XXXX.do:Id=9999999&Password=ggggg&Action=regist

 でも、今回の要件にはこれ以外にログ出力要件があり、Controllerの引数ではちょっと無理っぽい。。
 他にも、同じクラスから呼ばれたメソッドには適用されないようなので、ビジネスロジック側の影響は避けられないようでした。
 また、戻りがあるメソッドに適用するにはjoinPoint.proceed()の戻りを返す必要があったりと、色々ハマりどころがあるようです。

カテゴリー: Java

Selenideでブラウザ操作専用のRPAっぽいのを作ってみた

 とあるWebサイトのデータが欲しいとか、主にブラウザ使って仕事してますとかで、ブラウザの操作を自動化したいという要求は結構あると思います。RPAと謳った製品はあるのでしょうが、そんな大袈裟にやる訳でも無いレベルなものが欲しいなと。昔であれば、エクセルVBAでIEを自動操作とかしてましたが、今回はSeleniumの利用を検討してみました。

 Seleniumといえば、開発者がWebサイトのテストとして使うケースが多く、業務利用的な話はあまり聞きませんが、ブラウザの自動操作なら同じ話、Seleniumを調べていくとjava実装ではSelenideが使いやすいようでした。
 対象となる操作の自動化要求だけ対応するのもつまらないので、いろんな操作を自動で出来るRPAクラス1っぽいものを目指します。

いろんなタイプのブラウザ操作に対応する為に、まず操作テーブルを定義します。今回は、操作対象となるものをWEB、ファイル、プログラムと3種に分類し各操作を定義、実装していきます。
WEBならURLオープンや要素から値を取得したり、要素に値をセットしたり、ファイルならファイルから読込とか出力といった操作です。プログラムは加算や変数に入れる、次に行う処理に飛ぶ判断等です。

で、次は操作対象とするWebページの要素を調べて操作テーブルを作成するのですが、CSSセレクタで指定するのが安定してました。Chormeのデベロッパーツールから要素を右クリックCopyでCopy selecterして、「>」を取ったり最後だけ切り取ったりで指定してます。idやnameがあればそちらの方が良いかも知れません。

実際にWebページからテキストを取得するのは下記のようなソースです。
Selenide.$(By.cssSelector(“span.tlid-translation.translation span”)).getText();

で、大体操作テーブルが出来たので動かしてみます。下記はテストとしてGoogle翻訳ページの操作テーブルです。

結構動かないので操作内容等を微調整していきます。。PAUSE入れたり。。

Selenideというか、Seleniumのはまりどころでしょうか、
・clickは問題無い(画面が遷移するまで待ってくれる)が、JavaScript実行で画面遷移する時は考慮が必要→直前の画面のどこかの要素を取得して、それが変更されていないなら待つみたいな小技が必要
・現時点、Windows環境上ではChromeで動かない→Windows+ChromeだとChrome本体とChromedriverのバージョンが合わない(Macでは動く)、Firefoxは動いた
・Windows+FireFoxドライバで動かしっぱなしにするとかなりのメモリを消費する→対象のページによるのかも知れませんが、数時間動かすような処理だと定期的に落し上げ(close&open)した方がよさそう

使ってみたいという方がいらっしゃいましたら、コメントからお問い合わせ下さい。
なお、このサイトではコメントの公開はしておりません。

AWS CodePipelineでspringbootアプリをECSへデプロイしてみた

オンプレサーバで稼働しているシステムをAWSへ移行したいという話があり、AWS環境でCI/CDがどう出来るか確認してみました。
構成としては、開発用端末のIDE(IntelliJ IDEA)でコミット、CodeCommitのリポジトリにプッシュしたら、Mavenビルドを開始してECRへコンテナをプッシュ、ECSへデプロイという流れです。

下記AWS環境を用意します。
・ECSの設定(クラスタ、サービス、タスク定義)
・ECRにリポジトリを作成、springbootのアプリなのでopenjdkのイメージをプッシュ
・CodeCommitにリポジトリ作成
・CodePipelineを設定

ググれば、いろいろAWSに関する情報はあるのですが、なかなかうまく出来ません。
で、いろいろやってみた結果、ビルド用にbuildspec.yml、デプロイ用にDockerfileをリポジトリの直下に置くとデプロイが成功しました。

すいません、情報の参照元が解らなくなってしまいました。。
mvn install 結構時間掛かりますね。。

AWSは数年前にアカウントを登録してちょこっとだけ遊んでみただけだったので、ちゃんとAWS環境を理解した上で整理してからじゃないと実利用には遠い感じです。。

カテゴリー: Java

Redmine4のプラグイン開発環境を整備してみた

 独自プラグインが複数入った既存のRedmine2.5をそろそろアップデートしたいという事で、つい先月リリースされたredmine4へアップデートする方向になり、プラグインの改修を行う為にredmine4用の開発環境を使っているWin端末に整備してみました。
 元々Redmine2.5用にWindows7 + Aptana Studio 3(eclipse) の開発環境があり、まずはruby2.0→ruby2.5.3にします。rubyは普通にWindows用のインストーラーで入れましたがruby2.0が入っているので、原始的ですが、環境変数をC:¥Ruby25-x64¥binが先になるように変更してruby2.5を有効にしました。

 次に、AptanaStrudioにrails プロジェクトを作成し、ダウンロードしてきたRedmine4を突っ込み、AptanaStudioのコンソールから、Redmineのインストールを行います。

    $ gem install bundler
    Fetching: bundler-2.0.1.gem (100%)
    Successfully installed bundler-2.0.1
    Parsing documentation for bundler-2.0.1
    Installing ri documentation for bundler-2.0.1
    Done installing documentation for bundler after 9 seconds
    1 gem installed

    $ bundle install –path vendor/bundle
    Fetching gem metadata from https://rubygems.org/……….
    Fetching gem metadata from https://rubygems.org/.
    Resolving dependencies….
    Fetching rake 12.3.2
    中略
    MSYS2 could not be found. Please run ‘ridk install’
    or download and install MSYS2 manually from https://msys2.github.io/

で、起動してみます。

    $ rails -s
    Could not find gem ‘rails (= 5.2.2) x64-mingw32’ in any of the gem sources liste
    Run bundle install to install missing gems

動きません。。。railsがインストール出来ていないようです。

前に出ていた、MSYS2 could not be found. という所で、MSYS2なるものを入れてビルドする必要があるようです。

DOS窓からridk installと打ち、1を選択するとインストーラー画面が出てインストール終了です。

で、railsをインストールします。

    C:¥Users¥maki>gem install rails
    Temporarily enhancing PATH for MSYS/MINGW…
    Building native extensions. This could take a while…
    ERROR: Error installing rails:
    ERROR: Failed to build gem native extension. current directory: C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/nio4r-2.3.1/ext/nio4r
    C:/Ruby25-x64/bin/ruby.exe -r ./siteconf20190117-14000-1ru4f4e.rb extconf.rb

    current directory: C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/nio4r-2.3.1/ext/nio4r
    make “DESTDIR=” clean
    ‘make’ は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    current directory: C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/nio4r-2.3.1/ext/nio4r
    make “DESTDIR=”
    ‘make’ は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。

    make failed, exit code 1

    Gem files will remain installed in C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/nio4r-
    2.3.1 for inspection.
    Results logged to C:/Ruby25-x64/lib/ruby/gems/2.5.0/extensions/x64-mingw32/2.5.0
    /nio4r-2.3.1/gem_make.out


makeが無い??MSYS2に標準では入っていないようです。。

で、こちらを参考にさせて頂き、MSYS2環境に下記のコマンドを打っていきます。

    $ pacman -Su

    $ pacman -Su

    $ pacman -S mingw-w64-x86_64-gcc

ビルド環境は出来たようなので、AptanaStudioの該当プロジェクト上のターミナルよりrailsのみインストールしてみます。

    $ gem install rails -v 5.2.2
    Temporarily enhancing PATH for MSYS/MINGW…
    Building native extensions. This could take a while…
    Successfully installed nio4r-2.3.1
    Fetching: websocket-extensions-0.1.3.gem (100%)
    Successfully installed websocket-extensions-0.1.3
    Fetching: websocket-driver-0.7.0.gem (100%)
    Building native extensions. This could take a while…
    中略
    Installing ri documentation for railties-5.2.2
    Parsing documentation for sprockets-3.7.2
    Installing ri documentation for sprockets-3.7.2
    Parsing documentation for sprockets-rails-3.2.1
    Installing ri documentation for sprockets-rails-3.2.1
    Parsing documentation for rails-5.2.2
    Installing ri documentation for rails-5.2.2
    Done installing documentation for nio4r, websocket-extensions, websocket-driver,

入ったような気がするが。。。
rails s
まだ動かない。。。

    $ bundle update
    Fetching gem metadata from https://rubygems.org/……….
    Fetching gem metadata from https://rubygems.org/.
    Resolving dependencies…..
    Using rake 12.3.2
    Using concurrent-ruby 1.1.4
    中略
    Fetching rmagick 2.16.0
    Installing rmagick 2.16.0 with native extensions
    Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory:
    C:/work/Dev/workspace/redmine4/vendor/bundle/ruby/2.5.0/gems/rmagick-2.16.0/ext/
    C:/Ruby25-x64/bin/ruby.exe -r ./siteconf20190117-11036-fkmn5g.rb extconf.rb
    *** extconf.rb failed ***
    Could not create Makefile due to some reason, probably lack of necessary
    libraries and/or headers. Check the mkmf.log file for more details. You may
    need configuration options.

rmagickのインストールでエラーが出ているようなので、除外してインストールし直し

    $ bundle install –without rmagick –path vendor/bundle
    Fetching gem metadata from https://rubygems.org/……….
    Fetching gem metadata from https://rubygems.org/.
    Resolving dependencies…..
    Using rake 12.3.2
    中略
    Bundle complete! 27 Gemfile dependencies, 74 gems now installed.
    Gems in the groups rmagick and rmagik were not installed.
    Bundled gems are installed into ./vendor/bundle
    Post-install message from yard:
    ——————————————————————————–
    As of YARD v0.9.2:

    RubyGems “–document=yri,yard” hooks are now supported. You can auto-configure
    YARD to automatically build the yri index for installed gems by typing:

    $ yard config –gem-install-yri

    See yard config --help for more information on RubyGems install hooks.

    You can also add the following to your .gemspec to have YARD document your gem
    on install:

    spec.metadata[“yard.run”] = “yri” # use “yard” to build full HTML docs.

    ——————————————————————————–

やっと動きました!
DBのマイグレーションはしなかったけど、とりあえず動いたので、これから少しずつプラグインを導入しながら、もぐら叩きが始まります。。

ROBOCOPY再び

 Windows端末にインストールする形で提供しているアプリについて、変更都度インストールしなきゃいけないのが面倒という話があり、ファイルサーバからリソースをコピーする形にしようと思います。
 対象のアプリは下記のようなフォルダ構成で、基本的に初期インストール以外はファイルを配置するのみです。

アプリルートフォルダ¥src
アプリルートフォルダ¥img
アプリルートフォルダ¥data
アプリルートフォルダ¥log

 上記フォルダのうち、logとdataのフォルダはコピー対象外となります。
 また、アプリ変更時は数人に先行して使ってもらって評価した後に他の利用者へ配布するという運用なので、端末側に新しいリソースがある場合はコピーしないようにします。

結果こうなりました。

robocopy ファイルサーバの所定フォルダ アプリルートフォルダ /E /XO /XD log data /NDL /NFL /NJH /R:2 /W:3

前回使ったrobocopyコマンドを参考に、/XD でlogとdataのフォルダを対象外にし、/E /XO /XD で端末側が新しければコピーしないという形にします。

Swagger + SpringBoot で APIサイトを作ってみる

既存システムのDBへアクセスしてデータを参照するようなAPIを、って事で、
SwaggerでAPIを定義し、Swaggerから自動生成したソースを使って実装してみました。
なお、今回対象としているのは参照系がメインでRESTって雰囲気ではありません。
対象が既存システムのDBなので。。

とりあえず、ざっくりとした要求と応答の仕様を整理し、Swagger Editorにyamlを書いてみます。

なお、Swagger Editorは、別件で使っていた端末内のxampp/htdocsにGitHubからダウンロードしたZIPを解凍して使ってます。
ある程度、定義を書いた後、Swagger EditorからGenerate ServerでSpringのサーバソースを出力してみます。

自動生成されたJavaソースはこんな構成です。

Controllerとレスポンスエンティティのモデルが揃ってます。全体的なソース構成は、コントローラ層、サービス層、データアクセス層という3構成になりますかね。
コントローラ層は概ねSwaggerで生成したので、データアクセス層も自動生成しようと、Doma2を使ってみます。
doma-gen-build.xmlに接続先DB情報と出力先ソースの設定等を記述し、こちらもGenerate!

結果、ソースを手書きする必要があるのは、

・サービス層全体

・Swaggerで自動生成されたSpringBootApplicationクラスのComponentScanにサービス層のパッケージを追記
  @ComponentScan(basePackages = { “io.swagger”, “io.swagger.api”,”jp.esoro.api” })

・Swaggerで自動生成されたControllerにServiceをコールする箇所を追記

・DAOインターフェースに下記アノテーションを追記
@ConfigAutowireable
@Repository

・自動生成不可能なSQL文の作成し、それに合わせてDAOにメソッド追加

といったところで、とりあえずの動作確認が出来ました。

ただ、実用するには認証やページング等も必要なので、こんな単純な話にはなりませんし、APIの仕様をちゃんと整理してからSwaggerでソースを生成して着手しないと後が面倒ですね。

カテゴリー: Java