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

と書いています。

SpringBootのCacheにCSVを入れてみた

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

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

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

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

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

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

依存しているものです

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

テスト結果です。

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

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

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

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

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

google-http-clientを使ってみた

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

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

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

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

 だいぶ経って2019年1月現在、久しぶりに使ってみると、当時のバージョン1.23と現在の1.28では仕様が変わっており上記のままでは動かなくなりました。。

テストの価値

 某国製のロボット掃除機をAmazonで買いましたが2ヶ月で動かなくなりました。最初はとても良い感じで掃除してくれていたんですが、何か喋ってすぐ止まるようになり、自分で治せそうにない、でも保証とかよくわからないし、買った当初はいい買い物したというという満足感がありましたが、今となっては、どこに連絡して、どこに持っていけば治してくれるの??
 Amazonでは購入後1ヶ月間の初期不良しか対応していないようで、一応、メーカーのサービス窓口メアドに故障の旨を少し英語、詳細は日本語で送ってみましたが、今の所、何のレスもありません。。。(追伸  3日後返信が来て、その後少しやり取りした後、部品を無償で送ってもらえる事になりました)
 これが少なくとも半年後だったら、値段を考えるとある程度は納得出来ていたかも知れませんが、たった2ヶ月でこうなると安いからと言って納得出来ませんよね。

 最近、ポルシェ博士の本を読んでたんですが、所謂ワーゲンビートルの元になったポルシェ博士が設計したクルマは、ナチスの親衛隊200人が試作車30台を昼夜問わずで約8ヶ月間走行テストをしたそうです。
 ベストな製品に至るまで必要なテストのコストをナチスが負ってくれていた訳で、それによりクルマのプラットフォームとしての信頼性を極限まで追求出来たのでしょう。戦後になってビートルが生産されるようになり、ポルシェ博士が夢みた大衆の為のクルマを設計するという面では大成功となった経緯になるのですが、元々はナチスからの大衆車を設計して欲しいという依頼から始まったものです。しかし、戦前・戦中に生産されたクルマは、殆どが軍用車であるキューベル・ワーゲンで、しかも、大衆車を手に入れようと宣伝し、購入を予約した国民から集めた貯金までもがナチスにいいように使われていたのです。
 
 単純に製品の値段だけみても、テストにどれだけコストをかけたのかは解りません。ただ、高価な製品でも、スペックだけみても解らないテストの価値も含まれていると感じた場合、それがメーカーに対する信頼なんだと思います。特に摩耗するような部品があるものは、安いから、スペックがよいからと安易にポチっとするのは避けようと思う今日この頃です。

リモートワークを阻害するもの

 働き方改革とかで、リモートワークや在宅勤務とかが話題にはなっていますが、なかなか普及しているようには思えないですよね。筆者のような業種は比較的リモートワークしやすい業種と言えますが、リモートワークが確立されているところは日本ではかなり少ないように思います。

 その時々の仕事内容にもよりますが、コミュニケーションツールでメンバーと少しやりとり出来れば一人で進められる期間が実際にあるので、1時間くらいかけて仕事場に行って、1時間くらいかけて自宅に戻るなんて、1日2時間無駄にしているよなあと感じてしまうものです。この時間に何も報酬は付かないですから、ワークシェアって事で3時間だけ仕事したいといっても、仕事の場に行くためには住んでいる所次第で往復2時間かかったら合計5時間ですよ?全然3時間になってませんよ。

 先日、仕事先でOffice365が導入されて、Microsoft Teamsというツールが使えるようになりました。チャットやテレビ会議が出来るので、リモートワークツールとして使えそうです。とはいえ、今の所は使う機会が無いので使い方を覚えようとしてませんけど。
 結局ツールはリモートワークする人は是非使いたいけど、してないメンバーが使うのはメンドクサイだけになっちゃうんですよね。だってリモートワークツールを使わざるを得ないのは来てない人に合わせなきゃいけないだけなんで、それってリモートワークしていない方としては、何でここに居ないの?って思ってしまいます。

 リモートワークの普及を阻害している要因は、企業側と働く側双方にあるかと思いますが、筆者の主観では、

企業側
 ・リモートワークにより生産性を落とさない為の仕組みが整理出来ていない(殆どがツールの話になるかも)
 ・勤怠管理以外に仕事の評価方法が確立出来ていない

働く側
 ・リモートワークの仕方が解らない(ツールの使い方が理解出来ていないとか含め)
 ・同じ仕事をするメンバーと同じ場所で仕事をしなければいけないという気持ち

なのかと。

 特に、働く側の気持ちが一番難しいように思います。事務所を無くして全員リモートワークとまでは今の所そんな仕組みが出来てる企業は皆無なので、リモートワークをする人とリモートワークができない業務を仕事にしている人とでいろんな思いが出てきます。

 子供の頃から毎日通学し、同級生と長い時間一緒に居ることが当たり前だったし、不登校の同級生にどのような感情を持っていたか覚えているし。。
 でも、家庭環境等で止むを得ない理由があると知ったら、しょうがないんだねと腑に落ちてしまうので、リモートワークも同じように、本人に子育てや介護といった通勤するのが難しいという強い動機付けがあって、それがメンバーと情報共有出来ていれば、リモートワークする人も、リモートワークをしていないメンバーも受け入れやすいんだと思います。でも、これって、その人の止むを得ない状況なのか、それをしたいというその人の要求なのか、それだけの違いです。

 将来的には、リモートワークが当たり前と思えるようになるんでしょうが、筆者自身も含めて、人の意識が変わるには、もう暫く時間が掛かりそうですね。

源泉徴収の法定調書を提出し忘れてました。。

 今月中旬あたりに税務署から書類が届いていたので、何だろうと開けてみると、
「給与所得の源泉徴収票」等の法定調書の提出について
とのタイトル、やんわりと未提出なら早く提出を、確認後結果を郵送で返信を、という内容でした。

あれ、提出してなかったかな?と、eTaxで送信履歴を確認すると、1月に納税は済んでますが、法定調書の提出履歴が見当たらない・・
そういや、そのタイミングは住基カードの有効期限が切れていたので、マイナンバーカードの発行を申請し、到着待ちだった時でした。
法定調書の提出は、eLTaxの方から国税と市役所宛てに同時に送れるようになっていますが、提出時に電子署名が必要なので、そのまま忘れてしまったようです。。
慌ててeLTaxで源泉徴収の法定調書を提出、書類は提出しましたと書いて郵送。。3ヶ月遅延してますけど、ま、今となってはしょうがない。。
 
 税務関係はちゃんと事業年度内に発生するイベントのスケジュールを管理しなきゃいけませんね。

ADOでCSVファイルを読み込むと255文字以上でエラーになる

 ちょっと前にVBScriptで作られたツールがあるのですが、最近になってエラーが出るとの連絡。
エラーになるケースは、CSVファイルを読み込んで255Byteを超えている値を扱う時と判明。
対象のツールは実装上ADOが使われており、下記のようにCSVへアクセスしてます。

対象のCSVファイルが改行を含む値を扱う都合でADOを使ったようなのですが、どうやら、CSVテキストドライバとしての仕様上、255を超える項目数だったり、255を超えるサイズといった、昔ながらの壁がある模様。
回避策としては、Schema.iniで逃げるのが定番らしいのですが、試したところエラーにはならないが、255文字超が勝手に切られる形に・・・

というか、これ以上ADODBについて調べる時間が無駄!!なので、テキストファイル読み込みとして作り直しました。。

こちらを少し参考にして、さらにダブルクォーテーション内のカンマも考慮し(ここではカンマは削除してます)、ADOのレコードセットっぽく1レコード毎に配列へ列の値をセットしてから処理を行っていきます。

自分が使わなきゃ、誰かに使ってもらえない

 先月、新居に引っ越したところ、備え付けのガス操作パネルに昨日と今日のガス代が表示される機能が付いていました。入居時にガス開栓に来てくれた係員曰く、一定の計算方法に基づいて表示している金額なので、実際のガス代とは違うとの事。
 使用状況を管理して、請求されるガス代と見比べられればガス代を節約出来ると思い、毎日のガス代を記録していく事にしました。
 で、どう記録しようと、ふと数年前に作ったAndriodアプリを思い出しました。

 ガス代の入力項目を設定して、

 こんな感じで毎日登録していきます。

 たまに登録忘れてますけど。。


 このアプリは、筆者が前職を辞めた後に、プログラミングのリハビリを兼ねて、JavaでAndroidアプリを作ったものですが、5年くらい経ってもまだ、ダウンロードは100レベル。。完全ほったらかしなんで、そんなもんでしょうし、どちらかというと仕事利用がターゲットで、利用者が自分でデータ項目を決めるというコンセプト自体がそもそも理解しにくいでしょうね。UIもAndroid2.X時代のままですし。。

 作ろうと思った経緯自体は、ビル管理の仕事をしている人から、計器類の記録を取るツールが欲しいなあという話を聞いたのがきっかけですが、コンセプトとしたのは

 ・汎用的なデータフォーマットに対応
 ・オフラインでも記録が可能
 ・記録したデータは他システムと連携可能
 という3点でした。

 最初の汎用的なデータフォーマットという所で、偶々見つけてくれた人でさえ、データを定義して設定しないと何もできないという難しさがあったと思います。
 2点目は、スマフォアプリなら出来て当たり前ですが。。
 3点目は、スマフォ内部でのデータ保存はあくまで一時的なもので、DBサーバとかに連携出来るよう、結果的にメール送信として実装しています。メールをインターフェース手段としておけば受信側で何か用意すればどうにでも取り込めるだろうと、SMTPの設定をすれば、送信ボタン一発で送れます。
入力画面から1件単位で送信するのと、例えば1か月とか貯めて一覧画面からCSVで送信するのと2パターンを用意しました。今回のガス代は後者を使ってあとでエクセルとかで確認する予定です。
完全フリーですが、この連携箇所に何等かのニーズがあればユーザー開拓が出来るかなあという目論見もありましたが、何も無かったですね。。

 コンセプトうんぬん以前に、作ったアプリを自分自身が使う機会が無かったという事が、ほったらかしにしてしまったようです。
 作った人が使わないものを他の誰かに使ってもらえるという事は期待しちゃいけないですね。5年くらいの時を経て改めて使ってみましたが、暫く使い続けて問題と感じたところを改良してみようと思います。