Windows環境からLinux環境にしたらJavaプロセスが動かない

 Windows上で動作させていた既存システムの開発環境を、今回Dockerで動かす形に変えていました。
既存システムの構成上、javaプロセスを2つ立ち上げる必要があり、これまでwindows上でバッチファイルで実行していたのを適当にシェルに置き換えて実行してみましたが、下記のようなメッセージが出てプロセスが動作しません。


See http://www.oracle.com/technetwork/java/javase/documentation/index.html for more details.
/var/lib/apl/tools/lib/app-XXX-server.jar: line 1: $'PK¥003¥004': command not found
/var/lib/apl/tools/lib/app-XXX-server.jar: line 2: $'¥373^¥226P': command not found
/var/lib/apl/tools/lib/app-XXX--server.jar: line 3: ??e?y: command not found
/var/lib/apl/tools/lib/app-XXX--server.jar: line 4: syntax error near unexpected token )'
/var/lib/apl/tools/lib/app-XXX--server.jar: line 4:
?z?z?M)?^)? {,? ?MLy?x?P]?p?PK'

 なんじゃこりゃ?

JAVA実行コマンドとしては、
java -cp resource;lib/* jp.co.esoro.app-XXX.main
のような感じです。

 暫く試行錯誤していましたが、結果的にクラスパスを複数指定するところのセパレータ「;」はWindowsだけで、Linux環境では「:」じゃないとだめというオチでした。。

カテゴリー: Java

ラズパイ4で取ったセンサーデータをAthenaからMetabaseで可視化してみた

 前回の続きです。
 AWS IOTで、ラズパイで取得したセンサーのデータを定期的にPublishするようにしていましたが、実際のベランダに各センサーを配置してみました。
 いろいろ考えた結果、ベランダに電源を引いてラズパイを置くのでは無く、ラズパイは室内に配置、長いリボンコードをエアコンホースの口からベランダへ引くという形になりました。
 リボンコードの加工が面倒でしたが、これならエアコンホースのふたを加工したりしなくても一応大丈夫そうです。

 で、折角データを取得しているんですから、データを可視化してみたくなるものです。AWSにも色々BIサービスがあるようですが、趣味の範囲なので、コストを掛けず導入が容易そうなMetabaseでやってみます。

 MetabaseにAthena用のドライバーは標準では含まれていませんが、有難い事にこちらからJarを取得してプラグインのディレクトリに配置するだけで、簡単にAthenaにアクセス出来るようになりました。

 グラフになると入ってくる情報が違いますね。左軸は温度、湿度、右軸は照度、土壌水分です。温度・湿度センサーの値が取れずゼロになるのが回避できていないのが解ります。照度は明るいと数値が小さく、真っ暗で255になっています。また、湿度は夜高くなり、温度は朝の直射日光で40度になる時間帯があるようです。土壌水分は水やりの都度だいぶ数値的にはぶれるようで扱いが難しそうです。

 Metabaseは簡単に起動させられますが、メモリが1Gは無いと動かない模様、EC2等クラウドで動かすにはコストがネックになるので、結局、ラズパイ自身で動かす事になってしまいました。4Gメモリのラズパイ4なので早くは無いですが、十分動作します。

 こうなると、AWS IOT使っている意味無い気もしますが。。

ラズパイ4で各センサーを試してAWS Iotにpublishしてみた

 前回の続きで、今度はKEYESTUDIOスターターキットに含まれていた各センサーを試してみます。
 まず、温度湿度センサーですが、キット付属のセンサーはDHT11というモノ、サイトのコードはパット見pythonに変換するのが面倒なので、下記を参考にしました。


 簡単に温度と湿度の値が取れましたが、たまにゼロのケースがあるようなので、正しく計測するにはちょっと考慮が必要ですね。

 次は土壌水分センサーです。キットのサイトを参考に、I2Cを有効にし、Cのソースをそのままpythonに置き換えてすぐに値が取れるようになりました。

 キット付属の照度センサーとかも指定するpinを変えるだけで取れました。ただ、照度センサーの場合はキット付属の3種の抵抗から1つを使用するのですが、3種の違いが見た目で解らず、配線が厄介です。
 
 使えそうなセンサーの値が取れるようになったので、これらを定期的にAWS Iotにpublishする事で最適な水やりタイミングを分析出来るようにしてみました。データはCSV形式でこんな感じです。

2020-04-19 00:05:11.97121800,19.3,49.0,134,254

 データは、日時、温度、湿度、土壌水位、照度をAWS Athenaのクエリーで取れるようにしておきます。

 Athenaでは、日時をtimestamp型にする場合、ミリ秒を8桁にしないとデータとして認識しないようなので、無理やりゼロを付けてます。ただ、AthenaではタイムゾーンをJSTとして扱うのが面倒な感じなので、無理にtimestamp型にしなくてもよかったかも?

なお、AWS IOTからS3バケットへの格納するキーは、

${clientid()}/${parse_time("yyyyMM", timestamp(), "Asia/Tokyo")}/${parse_time("dd", timestamp(), "Asia/Tokyo")}/${timestamp()}.csv

のように年月と日付をディレクトリにして、あとでログ管理をしやすくしておきます。ま、この程度ならS3もAthenaも当面コストほとんどゼロでいけるでしょう。

 これで各センサーの値によって水やりを制御する形が大体出来てきました。が、最後に肝心な水やり制御方法をどうするかについては、まだ検討中です。。

Springboot Securityのログイン画面がいい感じになっていた

 Springbootで作ったアプリを、そろそろユーザーに渡そうかというタイミングになりましたが、Springbootのバージョンが結構更新されているので、今更ながら最新に入れ替えてみました。
 それまでフレームワークは、spring-boot-starter-parentの2.0.1.RELEASEを指定していましたが、今見ると2.1系の次に2.2系が既に出ています。
 コードに影響があれば、そこまで最新にしなくてもいいかととりあえず2.2.4を試したところ、特に問題が無かったのでチェンジ。
 今回のアプリはsecurityのデフォルトログイン画面を使っていたのですが、更新したところ画面が変わりました。どうやら2.1から既に変わっていたようです。

2.0系はこれ

2.1系overはこれ

2.0系の見ためがしょぼいのでカスタマイズしようか考えましたが、中央寄せのいい感じのUIに変わってました。これならそのままでも違和感無いですね。

アプリの動作確認は終了、最後に、バージョンアップでこんな警告が出るようになったみたいなので、
2020-02-27 14:09:12 WARN JpaBaseConfiguration$JpaWebConfiguration spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning

出ないようにapplication.ymlに追加

受け渡し準備OKです。
でもjarのファイルサイズはどんどん肥大化してます。。

カテゴリー: Java

Mavenインストールが失敗するようになった

SpiringBootで作成中のツールにちょっと機能が漏れていたので、pom.xmlにライブラリを追加したところ、ダウンロード出来ませんとの事。

mavenリポジトリから501が応答されているのですが、何か変わったのでしょうか?
試しに、ブラウザ越しに上記のDownload URLをたたくと下記の応答

501 HTTPS Required.
Use https://repo.maven.apache.org/maven2/
More information at https://links.sonatype.com/central/501-https-required

httpsにしなくちゃいけないって事?

ちょっと調べると下記を発見。

今時当たり前なのですが、Mavenリポジトリがhttpsのみに変わったようです。

Mavenツールが古いからかな?とまずeclipse(marsを今でも使用中)から更新の確認を実行してもダメ。
インストールの詳細からm2e Eclipse用Maven統合 を更新してもダメでした。

上記リンクに、pom.xmlで設定するのは例が書かれていますので、有難くこれで一旦解決には出来ますが、プロジェクト個別設定でなくて全体的にどうにかならないの?と、.m2に置いてあるsetting.xmlの設定で対応してみます。

結果、リポジトリ設定ではうまくいかず、ミラーの設定をしてみると、ちゃんとライブラリをダウンロードしてくれるようになりましたが、
初回はミラーから全てのライブラリをダウンロードしようとするようなので、とりあえずはpom.xmlで個別に対応した方がいいかもしれません。

後日、別環境で使っているeclipseで確認したところ、比較的新しいeclipseでは特に問題が無かったようです。どうやら、古いバージョンのeclipseだけ対応出来ないようです。

カテゴリー: Java

w2uiでテーブルメンテナンス画面を作ってみる

SpringBootで作っているアプリに、テーブルメンテナンス画面が必要になったので、w2uiで作ってみる事にしました。


テーブルメンテナンス画面といえば、一覧表示があって、選択したら登録フォームが表示されて、とか基本的な構成はどのテーブルも似たようなものですよね。w2uiのグリッドとフォームを使い、使いまわし出来るようjavascriptに機能を纏め、html側にテーブル固有の個別設定を寄せる事で、いろんなテーブルに対応出来るような形にしていきます。
w2uiのformは、urlを指定するとthis.save()でフォームをPOSTしてくれるようなのですが、ちょっと扱いにくいのでsaveを使わずにjsonでPOSTするようにしました。

eclipse上のリソース構成はこんな感じです。

javascriptです。ちょっと変更後のUIの動きがアバウトではありますが。。

htmlにはjsで定義済の要素とか変数を載せます。メンテ対象のテーブルが増えた場合を考慮しツールバーも入れてます。なお、項目の設定はw2uiのドキュメントを見ながら調整していきますが、結構融通が利きますね。

最後にというか、本来なら最初にですがSpringBoot側は、w2uiの項目名と一致するエンティティクラス(ここではCustomer)と、CrudRepositoryを継承したインターフェースCustomerRepositoryを用意し、RESTコントローラーからアクセスさせるようにします。

で、出来た画面です。

なお、今回セキュリティ要件は考慮していません。。

カテゴリー: Java

msg形式のメールファイルをemlファイルに変換する

 数年前にjavamailで作ったメールを受信した後の業務を自動化するツールを、今でもいろいろ機能追加をしているのですが、機能を追加・変更する時に、利用者から対象のメールをemlで提供してもらってテストしています。
 でも、outlookユーザーはmsgでしか提供出来ませんというので、emlへ変換したいのですが、ネットに転がってるツールを使ってもイマイチ変換できません。。
 なら作ろうと調べた所、javaならjotlmsgというのがあったのですが、日本語が文字化けします。
 結局、apache poiでoutlookのmsgを扱えるようなので、msgファイルを読み込んでemlファイルへ出力するという形にしました。

 実行時の引数を、msgファイルを入れたパス、emlファイルを吐き出すパスで指定します。

 何件かのmsgファイルを試した所、htmlで取れるケースが無かった。。メソッド的にはあるはずなのに。。
 その為、完全にemlファイルで再現出来るというレベルにはなりませんでしたが、本文テキストと添付ファイルはemlファイルに出力できているので、まあここまででよいかと。

カテゴリー: Java

weblogic 12cR2にバージョンアップしたら、commons-vfs2でFTPが失敗する

weblogicバージョンアップに伴うトラブルで前回の続き、JAX-RS周りの問題が解消したと思ったら、別のエラーが発生。
commons-vfs2でftp送信している箇所が動かなくなりました。commons-vfs2では他にファイル取得等も実装してますが、そっちの方は何も問題はありません。
ログは下記のように何が原因か解らない状況。


Caused by: org.apache.commons.vfs2.FileSystemException: Could not copy "/tmp/report/upload.txt" to "ftp://username:***@ftphost/report/upload.txt".
Caused by: org.apache.commons.vfs2.FileSystemException: Could not create folder "ftp://username:***@ftphost/report" because it already exists and is a file.

結果的に、pom.xmlに下記を追加しただけで問題が解消しました。

アプリケーションサーバの機能が多いと、かえって何処が依存しているか解らなくなりがちですね。

weblogic 12cR2にバージョンアップしたらJAX-RSが動かなくなった。

5年前に作ったweblogicで動かしているアプリですが、一部の機能でエラーが出ているとの連絡。よく聞くと、weblogic12cから12cR2にバージョンアップをした後に発生しているとの事。

そりゃ、何かしら影響あるよね。。

どうも、JAX-RSが下記のように2.0に変わったという事で、jerseyも2.Xにしないといけない模様。
https://docs.oracle.com/cd/E92951_01/wls/NOTES/whatsnew.htm

pom.xmlを

から

に変更

web.xmlを

から

に変更して再ビルド、概ね事無きを得ました。

対象のアプリは2,3年何も手を加えていなかったので、依存ライブラリのバージョンアップをするのは止めました。トラブル対応だし、必要以上の事はしない方はよいかと。
JavaEEって、oracleからEclipse Foundationに移管されてJakarta EE 8になってたんですね。知らなかった。。
でも、まだ全く別の問題が発生していて対応中です。。

VS CodeからGitbucketへリモートプッシュする

対応していたredmine独自プラグインのredmine4移行が終わり、また別に独自プラグインを入れて業務システムとして使っているredmine2.5のredmine4移行を始めましたが、前回はeclipseからVSCodeへ途中で変えたので、Git周りについてはeclipseからそのままでVSCodeからコミットもリモートプッシュも問題無く動いてました。

今回、VSCode(+GitLensエクステンション)側でGitリポジトリを作成し、Git: Add Remoteで社内で立ち上げているGitBucketをリモート先として登録し、プッシュしたところうまくいきません。。
なお前回と今回のGitBucketリポジトリは別ですが、privateでユーザー、パスワードの認証が必要な構成は同じです。

リモートURLにユーザーを入れたりいろいろしましたが、認証が出来ずにエラーになってます。eclipseならユーザー認証のダイアログが表示されるのですが、VSCodeではエラーメッセージのダイアログのみ。。

で、いろいろ試行錯誤してたら突然プッシュが成功、何がうまくいったか解らないままでしたが、もしかしたらChromeで認証してGitBucketを開いたのがきっかけかもしれませんがそんな事ってあるのでしょうか。。
もう一度やり直すのも面倒なので、今回は謎のままで。。

何か試行錯誤するときは何でうまくいったかちゃんと解るように手順を踏んでやらないといけませんね。。