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

法人登記を変更してきた

 法人3期目が終了し、今まで決算申告を自力でやって来ましたが、3期目になると消費税の申告が必要になるのと、自己流でこれ以上やってもあまり得るモノが無さそうな気がして来たところに、今年に入って引っ越しした先のすぐ近所に税理士事務所があったのでお願いする事にしました。Tax Cafeさんです。
 弥生会計の仕訳をしたデータをお渡しして、その後、色々指摘頂いたところを修正、後日事務所に伺って納付書を書いてもらい、あとは申告しておきますので、納付の方をお願いしますと。こちらは銀行で各種税金を納付して終了。だいぶ楽になりました。
 その時に税理士の方に見せた法人登記の代表者住所が引っ越し前の住所になっていたのに気が付き、法人登記を変更しないといけないなあ、と、全く気乗りはしませんが平日時間が取れたのでやる事にしました。
 変更だけなんで近くでも出来るのかなと、最寄りとなる柏法務局に電話すると、やはり支局では出来ず、千葉地方法務局でしか扱っていないとのこと。
 で、千葉地方法務局に電話すると、相談予約した方がよいと言われ、空いてる時間を予約し、持ち物を聞くと印鑑と変更を証明できるものがあればとの事。
 法務局のHPに
 1-5 株式会社役員変更登記申請書(住所移転)
というのがあったので、その記載例を見るとオンラインがどうたらで全く理解出来ず、解る範囲を記入し印刷、念の為過去取得した法人登記を持参し、変更の証明となると住民票でも用意しとけばいいのかなと法務局行きがてら住民票の写しを取りに行って、3年ぶりにはるばる千葉みなとへ。

 予約時間になって初老の法務局員に途中まで書いた申請書を見せ、さらに住民票や法人登記を見せ局員の方が言った通り加筆したり代表印を捺印したりで終了。法務局HP記載例のオンライン何たらは全く必要なかったです。1万円の収入印紙を貼って窓口へとの事で、これで1万ですかと局員の方も申し訳なさそうにお願いしますと、また10年くらい後に登記申請が必要ですので、と何のことか解らず聞いたら、この事でした。ネットで完結出来ないのか聞いたところ、できるが月々2000円程度かかるとの事。郵送も受付ていますと言ってましたが、法務局のHPを見直しして貰わないと素人には出来ない気がします。また、申し訳無さそうに10年後は制度も変わっているかも知れませんので、と相談終了。法務局2階で収入印紙を買って貼り付けて1階に戻り申請を提出、トータル10分程度で終了。登記完了は22日と書いてました。

 なんか、、とても無駄な一日を過ごした気がしてなりません。ちょっとの変更がこんなにメンドくさくて、完了は2週間後、しかも変更費用が普通じゃありえない金額。10年後くらいには、より効率的で納得できる仕組みに変わっている事を願って止みません。

厚生年金に加入してきた

 昨年の事ですが、所轄の年金事務所に行って厚生年金加入の手続をしようと
 
 ・新規適用届
 ・被保険者資格取得届

を持って行ったところ、会社の登記簿謄本が必要との事で一旦撤収、一人法人だし、、正直加入したい訳でも無いし、、、そんなに急ぐ必要も無いかな?と放置状態になっていました。。
 その後、年金事務所から数回通知が届いてましたが、今度は「来所通知」という書類が届き、8月●日●時に来なさいとの事。ちょっと放置し過ぎたと、指定の日時は都合が付かないので、電話して日時を変更した上で、年金事務所へ行って来ました。

 既に、申請に必要な書類も、銀行でハンコを押してもらった口座引落の書類も用意出来ていたので、担当の方がなんども書類を指差し確認しつつ、説明しつつでスムーズに手続終了。
 よくよく見ると、厚生年金は兎も角、健康保険については、国民健康保険と比べて少し安くなってました。
その足で、国民年金のカード引落を停止する必要があるとの事で、同じ事務所内の年金窓口の方で「国民年金保険料クレジットカード納付辞退申出書」を提出して手続終了。

 それから2週間くらいした後、健康保険証と「適用通知書」って書類が届きました。と、その数日後、今度は「国民年金保険料納付案内書」が到着。あれ?厚生年金加入で自動的に国民年金は終了しているのでは?

 さらに後日、国民健康保険証を返却しに市役所へ行き、返却と同時に「国民健康保険資格喪失届」を記入し提出、その場で、国民年金の納付書を見てもらったところ、どうも加入手続による脱退と請求とのタイミングズレみたいなことらしく、納付書は廃棄してくださいとの事。

 その1週間くらいのち、「健康保険・厚生年金保険資格取得確認および標準報酬決定通知書」という書類が到着。加入時に提出している「被保険者資格取得届」に書いた報酬月額から、保険料額表に合わせた標準報酬月額が書いてあるのですが、保険料額表上で1等級の上下は申請不要と聞いたので、決算期のタイミングで自分の給与をちょっとあげてやろうかと思います。

情報処理安全確保支援士に登録申請してみた

 2年前くらい前ですが、セキュリティスペシャリストに合格していたので、せっかくなんで、情報処理安全確保支援士に登録申請してみました。
 登録したところで何のメリットがあるんだろう??と、微妙なところで暫く保留してたのですが、それなりのコストがかかるとはいえ、専門分野とは言い難いし、トレンドもあるので定期的に学習する機会があるならそれは一応メリットだし、何かしら役にたつかと。

 申請書類はIPAのサイトからダウンロードして記入すればよいのですが、その他いろいろ必要な書類があります。

 市役所に行って住民票を、本籍地が都内なので区役所行って身分証明書を、もうひとつ「登記されていないことの証明書」というのを法務局で取得しなければいけないのですが、こちらは法務局の出張所では受け付けておらず、九段の東京法務局まで行って取得。法務局内で書類申請を書いて窓口に提出すると、それがコピーされて「上記の者について、・・・・・・を証明する」と書かれた書類を渡されました。

 さらに郵便局で印紙を購入、銀行で登記手数料の振込、まる一日かかりました。平日休みが取れないと無理です。

 書類送付後、しばらく何の連絡も来ないのですが、半月以上経ってから領収書が届き、1ヶ月くらいしてからメールで受け付けた旨の連絡が来ました。

NTLM認証のサイトからファイルをダウンロードする

SpringBootで作成中のアプリに、企業内のWebサイトよりエクセルファイルをダウンロードする要件があったので、何となくBasic認証のサイトだろうなと思い込んで実装を始めましたが全然繋がりません。

wget ‘http://username:password@filestore.bbb.co.jp/web/download/downloadfile.xlsx’
でファイルは取れます。

でも、
curl ‘http://username:password@filestore.bbb.co.jp/web/download/downloadfile.xlsx’
では動きません。

試しにwgetをデバッグモードでやってみて気が付きました。。

WWW-Authenticate: NTLM

このサイト、NTLM認証ですね。。

下記を参考に認証箇所を変更
http://code-addict.pl/reporting-services-rest-url-client/

また依存が増えてしまいましたが。。

ダウンロードファイルが更新されていた時だけダウンロードするという対応も必要なので、サーバ内にダウンロードしたローカルファイルとサイト上のファイルタイムスタンプをチェックし、一致しなければファイルをダウンロードしタイムスタンプをサイト上と同じ時間に書き換えるという対応になりました。

で、タイムスタンプはどこ?ここに書いてました。

確かにhttpヘッダに
Last-Modified:Tue, 14 Aug 2018 08:53:30 GMT
と書いてあります。

結局、こんな感じのコンポーネントを用意しました。

テストしてみます。

とりえあず、動いたので整理してから実装します。

カテゴリー: Java

SpringBootでWebアプリが動かない

 作りかけのSpringBootのRestアプリを別端末の開発環境(Windows+EclipseSTS+Maven)へ移行して動かしてみたところ、ブラウザからURLを打ち込んでも、RestControllerがうんともすんともいいません。元々の環境では普通に動作していたのですが。。
 困ったな・・と別環境への移行を諦めようかと思っていたところ、よく見るとSpring実行時のログ出力に下記を発見


[ERROR] C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.31\tomcat-embed-core-8.5.31.jarの読込みエラーです。invalid LOC header (bad signature)

 とりあえず該当のC:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.31 内のファイルを全て消して再度、プロジェクト→実行→Maven install実施。
すると何事も無く動き始めました。。


2018-07-30 15:18:55.806 INFO 14844 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8090 (http) with context path ''

こういった問題はあまり深く考えても詮無き事。。
なお、デフォルトの8080ポートは他アプリと被ってたので、application.ymlに

server:
port: 8090

と書いています。

カテゴリー: Java

SpringBootのCacheにCSVを入れてみた

 別のところで開発してもらったSpringBootのソースを引き取って機能追加の対応をしているのですが、毎日定時に更新されるCSVファイルをマスターデータとして使用するという要件が含まれてました。
 CSVをそのまま処理の都度読み込むのもイマイチだし、今回はSpringBootのアプリケーションなんで、SpringBootCacheを使ってみる事にしました。

今回の要件的にCacheとしてはConcurrentMapCacheでこと足りそうなので、実装前に下記サイトの住所CSV関東版を使って試してみます。
住所データのダウンロードサイト【住所.jp】

まず適当にエンティティを・・

キャッシュ設定のevictスケジュールについては、ここではテストなので1分でクリアし、クリアした事がわかるように出力してます。実際には日次CSVファイル更新処理が終わった後くらいに動作するようにします。

で、サービスを作りますが、ここでCSVのデータを全部キャッシュに突っ込みます。CSV読み込みについてはこちらを参考にさせて頂きました。

事前にapplication.ymlに下記を書いておきます。

依存しているものです

最後にテストを書いて効果を確認します。

テスト結果です。

CSVを読んだ場合500ms程度ですが、キャッシュが効いてると殆ど1ms以内の世界です。
こりゃいい感じですね!

カテゴリー: Java

違うと考えるか、同じと考えるか??

 とあるWebサービスにアクセスするところを、去年書いたものに追加するという要件でしたが、どうも去年作ったものと違うところが結構あるなあと。
 でも、こちらからすると同じような事をしているだけなんですが、微妙に要求パラメータの名前が違ったり、Webサービス側からの応答も何故か同じようではないようです。
 
 これと、それと、何が違うのか?  って、意識して設計していますかね?
 
 なんらかのシステムという仕組みを作ろうと思うと、まず、検討しなければならないのは、そのシステムが対応する範囲に存在する多様性(パターン)ですが、その多様性の中に共通するものは一体何処にあるのか?というのを整理し最適化するのがシステム設計者の醍醐味なんだと思います。逆に言うと、そう考えないと、やってられませんよ?全てのパターンに対して別物として用意すると言うのは、かなりの無駄な仕事が発生しますが、これとこれは同じですと整理出来れば、そのパターンに対応するものを一つ用意して、ちょっとだけバリエーションに対応すればよいだけなんで、とても楽になるんです。

 でも、これと、それと、が違うとされると、ちょっと待ってよ、これとそれは殆どこの辺りが同じなんだけど何で違うの?と思えるところがあると、とても残念な気持ちになります。ま、もっと残念なのは、同じとも違うとも何も考えた形跡が無い場合なんですが。

 これと、それ、に対して違うところに着目すると、半目が生まれますが、同じところに着目すれば共有が生まれませんか?
 この感覚って、とても重要な気がします。
 歴史上の悲劇や戦争は相手が敵=自分達と違う存在、という感覚から起きてませんか?
 貴方と私はここが同じだね!これとそれはここが同じで、この辺りだけがちょっとだけ違うみたいですね、っと思える感覚がとても重要なんだと思います。
 とは言え、何でもかんでも一緒くたというのとは違います。最初のアプローチとして、まず同じところは何処と何処なのか?
 という所から始めた方がいい事が多いような気がします。

google-http-clientを使ってみた

 とあるWebAPIサービスを提供しているサイトへアクセスするクライアントをjavaで書こうかと、最初はjerseyを試してみたのですが、これがなかなか厄介で、次から次と依存が判明して動作するまで一苦労。。
最終的には、とあるサイト側の認証における制約により、jerseyの仕様ではどうやってもアクセスが出来ない事が判明。。

 失敗の原因は概ね当たりが付いていたので、その辺りに問題が無さそうなライブラリとしてgoogle-http-clientを使うことにしました。
 jerseyで途中まで実装していたものをそのままgoogle-http-clientを使う形に置き換えて疎通確認レベルまでやってみます。

 google-http-clientは依存が無く構成がとてもシンプルで置き換えた途端に、サックリとAPIアクセスに成功しました。proxy経由でもJVM引数で指定してあっさり通りました。

 細かいところでは、どうも指定したタイムアウトは効いてないような気がしますが、まあ、今回の実務上問題無さそうなので、利用しやすいように整理して実装しようと思います。