投稿

ラベル(Java)が付いた投稿を表示しています

[Java] WebDAVからファイルをダウンロード

[Java] WebDAVからファイルをダウンロード Javaにて、WebDAVからファイルをダウンロードして指定の場所にファイルを保存する処理を実装する commons-vfs を使用すると、あたかもローカルファイルを操作するかのようにWebDAV上のファイルを扱える。 Apache Commons VFS – Commons Virtual File System pom.xml < project xmlns = " http://maven.apache.org/POM/4.0.0 " xmlns: xsi = " http://www.w3.org/2001/XMLSchema-instance " xsi: schemaLocation = " http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd " > < modelVersion > 4.0.0 </ modelVersion > < groupId > smuplus </ groupId > < artifactId > sample-webdav </ artifactId > < version > 0.0.1-SNAPSHOT </ version > < dependencies > <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-vfs2 --> < dependency > < groupId > org.apache.commons </ groupId > < artifactId > commons-vfs2 </ artifactId > < version > 2.2 </ version > </ dependency > ...

Mavenで実行可能JARを作成する

Mavenで実行可能JARを作成する 目的 Javaのコンソールアプリを作成したので、実行可能なJARファイルを作成し、依存するライブラリ類もすべてひとつにまとめたい。 概要 maven-assembly-plugin を使用する。 現在(2018/01)の最新バージョンは 3.1.0 Maven Repository: org.apache.maven.plugins » maven-assembly-plugin 今回はEclipseで操作する手順についてまとめる。 手順 (1) Mavenプロジェクトを作成 (2) コンソールアプリを実装 (3) pom.xmlに <build> タグを追加し、 maven-assembly-plugin の設定を定義する < project xmlns = " http://maven.apache.org/POM/4.0.0 " xmlns: xsi = " http://www.w3.org/2001/XMLSchema-instance " xsi: schemaLocation = " http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd " > < modelVersion > 4.0.0 </ modelVersion > < groupId > smuplus </ groupId > < artifactId > cli-test </ artifactId > < version > 0.0.1-SNAPSHOT </ version > < dependencies > <!-- https://mvnrepository.com/artifact/info.picocli/picocli --> < dependency > < groupId > info.picocli </ groupId ...

10/21(土) Java勉強会の感想

イメージ
10/21 (土) のJava勉強会の感想です。 Decoratorパターンについて 藤井さんからDecoratorパターンの解説でした。 最初はもっとシンプルなサンプルで説明した方が分かりやすかったかな? 継承 とか Interface を理解していないと、いろんな class が次々出てきて初学者には辛いかも。 以下のサイトの説明がシンプルで分かりやすかった。 12. Decorator パターン | TECHSCORE(テックスコア) デザインパターンを順に取り上げて説明するのは初学者にとって分かりやすいんだろうか? どういう教材だと分かりやすいのか…難しいなぁ。

[Java] IPアドレスが `169.254.xx.yy`になってしまう

Javaプログラムが動いているPCで、そのPCのIPアドレスを取得したい。 InetAddress.getLocalHost() で取得した InetAddress の getHostAddress() メソッドから返ってくるIPアドレスが 169.254.xx.yy (プライベートIPアドレス) になってしまう。 おそらく環境によっては結果は違う (もしかするとWindowsなら意図する動作するかも) と思う。 InetAddress.getLocalHost() は複数NICのことは考えてないのかもしれない。いまどきは仮想NICみたいなのがあるのが普通の気がするので、これでは困る。 ということで、とりあえず以下のようなテストプログラムを作成してみた。 package test; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Enumeration; public class TestGetAddress { public static void main (String[] args) { TestGetAddress test = new TestGetAddress(); test.getLocalAddress(); test.getInterfaces(); } public void getInterfaces () { try { Enumeration<NetworkInterface> list = NetworkInterface.getNetworkInterfaces(); if (list == null ) { return ; } while (list.hasMoreElemen...

Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER is marked for publish/export but is not exported on the project classpath

Jerseyのプロジェクトで、別プロジェクトにModelクラスなどを配置している。 デプロイメント・アセンブリーでModelプロジェクトを参照するように設定しているんだけど、 以下のような警告が表示されていた。 Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER is marked for publish/export but is not exported on the project classpath. Classpath visibility within Eclipse and at runtime will differ. とりあえずデバッグ実行しても問題なく動いているんだけど、キモチワルイので除去するために調査。 結論からいうと、下記「参考」リンクの 1 や 2 の対応でOKだった。 該当プロジェクトのプロパティを表示 「Java のビルド・パス」 -> 「順序およびエクスポート」 「Maven 依存関係」にチェック 「OK」をクリック つまり、Mavenでインストールしたモジュールが他プロジェクトから見えねーよ!って警告だったんですね。 参考 Why the “MAVEN2_CLASSPATH_CONTAINER will not be exported or published” | Geert Schuring java ee - Eclipse build path warning - Stack Overflow JavaEE 7をやってみよう。 Webデプロイメントアセンブリー - ひこぽんのーと “クラスパス・エントリーはエクスポートまたは公開されません”警告を解消する - R42日記

[eclipse] "Java コンパイラー・レベルが、インストールされている Java プロジェクト・ファセットのバージョンと一致しません" という警告を解消する

JerseyのプロジェクトでModelクラス群を別プロジェクトに切り出して開発してる。 で、「デプロイメント・アセンブリー」でModelクラス群のあるプロジェクトを参照するように設定してるんだけど、そうすると以下のような警告が表示された。 Java コンパイラー・レベルが、インストールされている Java プロジェクト・ファセットのバージョンと一致しません Javaプロジェクト・ファセットなんて設定した覚えないんですけど?って感じだが、警告はキモチワルイので除去しよう。 で、Modelプロジェクトのプロパティに「プロジェクト・ファセット」という項目がある。 確かに「Java」の項目のバージョンが 1.6 になっていたので 1.8 に変更。 それだけで警告が除去できた。 参考 エンジニアの暇潰し : EclipseでJava プロジェクト・ファセットのエラーが出る http://blog.livedoor.jp/crimson373/archives/2924766.html

[Java] SingletonなクラスでExceptionInInitializerError

Databaseから正常に応答が返ってくるかを定期的にチェックし、結果をRedisの特定キーに保持するプログラムを書いたんだが、Databaseが停止しているとConnectionを取得する際に ExceptionInInitializerError が出てしまう。 catch (Exception e) としていても捕まえられなかったので、ちょっと調べた。 そもそも ExceptionInInitializerError って? ExceptionInInitializerErrorとは : JavaA2Z static初期化子内で例外が投げられた場合に投げられる。Errorクラスのサブクラスのため厳密には例外ではない。 なるほど。 今回、Connection取得処理をSingletonなクラスに集約したんだけど、そのSingletonクラスの初期化時に当該エラーが出ている模様。 Exceptionでcatchできなかったのは Errorクラスのサブクラス だからか。 今回の対応 以下のようにすると catch できた。 private void hoge () { try { // Singletonなクラスの使用 MySingleton.getInstance().execute(); } catch (Exception | ExceptionInInitializerError e) { logger.error( "エラーだよ" , e); } } 参考: SingletonとExceptionについて考えてたら、なんだか良く分からなくなってしまいました。 - テツ日記

[Jedis] ZRANGE WITHSCORES

RedisのZSETに受信データを蓄積していくプログラムを書いた。 ZSETのScoreに受信日時(1970/01/01からのミリ秒)をセットしていて、日付を指定して受信データを抜き出せる設計にした。 で、テストするときに「最も過去のデータがいつ受信したのか知りたいなー」と思って調査。 Redisだと以下の方法で memberとscore を取得できる。 > ZRANGE key 0 0 WITHSCORES 日本語ドキュメントだと 値だけではなくて要素のスコアを返せるように WITHSCORES オプションを与えることもできます。Redisはデータをvalue1,score1,value2,score2,…,valueN,scoreNというリストの形で返します。しかしクライアントライブラリはデータをより適切な形で返すことも可能です。(このコマンドで一番良い形なのは2要素のタプルの配列だと思います) ってあって、「Javaにタプルねーしなー、どうすっべかなー」と思ってたら redis.clients.jedis.Tuple ってクラスがあった。 Jedisだと以下のように実装できる。 Set<Tuple> result = jedis.zrangeWithScores(key, 0 , 0 ); for (Tuple item : result) { return item.getScore(); } ふむ。簡単。 別に汎用的に使えるタプルのクラス、って訳ではなく、あくまでRedisのscoreとmemberを一緒に返す時に使うクラスってだけなので、 Tuple って名称は微妙だな。 参考 ソート済みセット型 — redis 2.0.3 documentation Java Code Example redis.clients.jedis.Tuple

[Jedis] Subscribe時にClassCastException

JavaのRedisクライアントであるJedisを使って、Redis Pub/SubのSubscribeするクライアントを作ってたんだけど動作確認してみると ClassCastException - [B cannot be cast to java.util.List という例外が発生する。 原因 作成したプログラムではdaemonとして稼働するんだけど、中では2つのスレッドが動いていて きちんとdaemonが正常稼働していることをRedisの特定キーに書き込むスレッド チャンネルをSubscribeしてRedisからデータを受け取るスレッド 各スレッドはJedisが提供するJedisPoolを使ってRedisのコネクションを取得していたんだけど、Subscribeするコネクションが1.で使用される (あるいは逆の) 状況が発生していたんじゃないかと推測。 解決方法 Subscribeするスレッドは JedisPool からではなく、普通に new Jedis(hostname); するように修正したところ、再現しなくなった。

2017-09-13 日報

昨日投稿できなかったので2日分をまとめて投稿。 今日調べたこと [Java] Map -> List 変換 Map<Object, T>#values() を取得して List<T> にしたかった。 ArrayList のコンストラクタにあるのね。一発でした。 List<T> list = new ArrayList<T>(map.values()); 【Java実践】Map→List、List→Map変換方法まとめ | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト [Java] Java で LeftPad / RightPad Commons Lang の StringUtils にあるけど、わざわざ Commons Lang を導入するほどでもないので自作。 実際には RightPad しか必要なかったんだけど、どうせなので LeftPad も実装しておいた。 public class StringUtility { /** * 方向 */ public enum Direction { Left, Right } /** * 文字列が空か判定します * * @param str * @return */ public static boolean isEmpty (String str) { if (str == null ) { return true ; } if ( "" .equals(str)) { return true ; } return false ; } /** * 対象文字列が指定された桁数になるまで左側に文字列を追加します * * @param source 対象文字列 * @param length ...

2017-09-05 日報

めっちゃコード書いてた。 今日調べたこと [Redis] pipelining と transaction の違い stack overflowに超分かりやすい回答があった。 パイプライン処理は、主にネットワークの最適化です。これは基本的に、クライアントが一連のコマンドをバッファリングし、それらを一度にサーバーに送ることを意味します。これらのコマンドは、トランザクション内で実行される保証はありません。ここでの利点は、すべてのコマンドのネットワークラウンドトリップ時間を節約することです。 Redisはシングルスレッドなので、個々のコマンドは常にアトミックですが、異なるクライアントからの2つのコマンドは、例えば、それらの間で交互に実行できます。 しかし、Multi / execは、他のクライアントがmulti / execシーケンスのコマンド間でコマンドを実行していないことを保証します。 pipelining vs transaction in redis - Stack Overflow [Redis] Jedisでの Pipelineの使い方 AdvancedUsage · xetorthio/jedis Wiki 場合によっては、さまざまなコマンドを送信する必要があります。素朴なやり方よりも優れたパフォーマンスを発揮する、非常にクールな方法は、パイプライニングを使用することです。こうすることで、応答を待たずにコマンドを送信することができ、実際には最後に応答を読むことができます。 Pipeline p = jedis.pipelined(); p.set( "fool" , "bar" ); p.zadd( "foo" , 1 , "barowitch" ); p.zadd( "foo" , 0 , "barinsky" ); p.zadd( "foo" , 0 , "barikoviev" ); Response<String> pipeString = p.get( "fool" );...

2017-09-04 日報

文章を推敲していると余計な時間を食ってしまうので、思いついたことを書き連ねることにした。 ITエンジニアの評価などについて。 食べログみたいにお客さんに「この人と仕事してよかった!」みたいな評価をしてもらい、それを職務経歴書と一緒に公開することでエンジニア能力を客観的に表すことはできないだろうか。 ランサーズとかクラウドワークスではそういう仕組みがあるのかな? 今日調べたこと [Java] 未実装であることを表現する方法 非推奨メソッドとする場合は @Deprecated を付ける。 その操作をサポート (実装) していないというときは UnsupportedOperationException をスローする。 Javaクラス使用メモ(Hishidama’s Java Class use Memo) Java例外の投げ方メモ(Hishidama’s Java throw Memo) [Redis] ZSETでスコアを指定して要素を削除 ZREMRANGEBYSCORE で min と max に同じ値をセットする。 ソート済みセット型 — redis 2.0.3 documentation ZREMRANGEBYSCORE Redis [Redis] LISTのpush/pop 単純なキューを実装するときに右を最新とするのか、左を最新とするのか、どちらが直感的かを考えだしたら分けわかんなくなってきた。 今回は rpush, lpop (右に追加して左から取り出す) にした。 んー、反対な気がするなw 僕は左利きなので、こういう時に他人と反対になっちゃう。 リスト型 — redis 2.0.3 documentation [Redis] Pub/Subしたときに受信したかどうか RedisのPub/Subにおいて、Publishする方で、クライアントがデータを受信できたかどうかを判定する方法。 悩むまでもなく、PUBLISHコマンドの戻り値が受信したクライアントの件数だった。 万が一、Subscribeしてるプロセスが死んでいた場合にデータが時空の狭間に消えていくと困る気がするので、PUBLISHの戻り値が 0 なら LIST に保持することにした。 ...

2017-09-01 日報

他者の作業がボトルネックになって自分の作業が進められない。 影響がなさそうなプログラムから先に実装を進めていくことに。 やっぱりチャットツールがある方が仕事やりやすいなぁ。 事前の登録なんかが容易で チャンネルとかの参加とか退出が手軽で メンションが容易に飛ばせて Botなんかが楽に導入できる って感じのチャットツールないかしら。 今日調べたこと Jersey Clientの使い方 » Jersey Client API : Java でWeb API Client を作成する方法 TECHSCORE BLOG Web API の死活監視がしたいだけだったので、レスポンスをStringで受けることにした。 HTTP Status Codeをチェックしていないので微妙だけど、とりあえず要件は満たしているのでOK。 Propertiesで取得した値の走査 java.util.Properties は Mapインターフェースを実装してるから拡張for文で全要素を走査できるのね。 public class Config { public void function () { Properties prop = new Properties(); InputStream stream = Config.class.getClassLoader().getResourceAsStream( "config.properties" ); try { prop.load(stream); stream.close(); for (Entry<Object, Object> entry : prop.entrySet()) { // なんかの処理 } } catch (IOException e) { e.printStackTrace(); } } } Java Propertiesで習得したプロパティファイルの内容をMapに詰め込み表示する - Code Log Properties (Java Platform SE 8 ) ...

2017-08-31 日報

コーディングする気分じゃなかったので、PowerPointの資料作成を先に進める。 クラス図かシーケンス図があった方が分かりやすいかも、と思ったけど作るの面倒くさいし読んでくれるかどうかも分からないので、ソースからクラス図を自動生成できないか軽く検索。 どうやらEclipseのプラグインで出来そうなので、後日試す。 Web APIの死活監視の実装をどうやろうか検討。 version返すAPIを用意して、それを定期的に呼んでチェックしよう。 今日調べたこと [Java] Jersey Clientの使い方 1年くらい前に実装したんだけど、使い方を忘れたので再度確認。 Chapter 5. Client API JAX-RS Client メモ - REST API を呼び出してレスポンスをBeanにマッピングする - Qiita BaseのURLとpathを別々に渡すんだよね。変な仕様だ。 [Java] HttpClientのサンプル Webアプリの死活監視のためにJavaでHTTP接続する手順。 HTMLの中身が欲しいわけじゃないので HEAD とか OPTION とかでもいいんだけど、まぁ GET しとこう。 JavaでのHttpClientサンプル - CLOVER

2017-07-15 Java勉強会の感想

イメージ
7/15 (土) に開催した「第5回 ひでかず君と学ぶはじめてのJava」の感想。 当日の模様はYouTubeで公開中。 https://www.youtube.com/edit?o=U&video_id=E0jky9ng0Sw テーマは以下のとおり。 * デザインパターンについて * JSP & Servlet 入門 デザインパターンについては僕も詳しくなく、概要とか大雑把なイメージくらいしかフォローできなかった。 次回はもっと突っ込んだ話をしてくれるらしいので期待したい。 僕から、以下の記事に沿ってJSP & Servlet のハンズオン。 JSP & Servlet 入門 - Qiita http://qiita.com/Kazunori-Kimura/items/a15a011485ac92074d6f 思った以上に環境の問題で躓く。これだからJavaは... どうしてもハンズオンをやると参加者の環境の問題でグダグダになってしまう。 勉強会では実際に実装している様子を見てもらい、参加者には後日やってもらうのが良いかもしれない。 今回は YouTube Live の画面共有機能でEclipseの操作を公開したが、事前に実装の手順を動画化しておき、勉強会ではそれを上映する、というのも良いかも。 どちらにしろ、ハンズオンと動画中継は相性が悪いように思った。