理系学生日記

おまえはいつまで学生気分なのか

java

ISUCONにJavaでチャレンジし予選敗退してきました

ISUCON 12とっても楽しかったですね。 今年はISUCON 6以降で久しぶりの登場となったJavaで参加してきました。 ISUCON6 オンライン予選の利用言語比率 : ISUCON公式Blog ISUCON12 オンライン予選の利用言語比率 : ISUCON公式Blog ISUCON 12における698チーム…

Javaにおける依存関係を可視化できるjarvizを試してみる

モノリス的なJavaアプリケーションにおいて、各クラス・メソッドがどのように依存し合っているのかを見極めたいというのは しばしば生じるニーズです。 アプリケーションが巨大になれば分割したいと考えるのは自然の摂理でもあり、 分割面がどこなのかを見極…

GitLabでJavaのソースコードのテストカバレッジを可視化する

テストを書こうと言っても、精神論ではなかなかその文化は育ちません。 これを行おうとすると、自分の記述したテストがどのようにプロジェクトやチームに貢献しているのかを可視化する必要があります。 今日のゴールは2つあり、1つはMerge Requestのファイル…

Checkstyle、SpotBugsのエラー(Violation)を、Reviewdogを使ってGitLabのMergeRequestにコメントする

CheckstyleやSpotBugsのエラーを、Reviewdogを使ってGitLabのMerge Requestにコメントできるようにしました。 それぞれハマりポイントがあって、かなり苦戦しました。このため、それぞれに関する内容を記載しておきます。 Checkstyle Reviewdog自体はネイテ…

GitLabでMavenのローカルリポジトリをcacheしようとすると`WARNING: .m2/repository: no matching files`でキャッシュが効かない

問題 GitLabを使ってJavaのプロジェクトのCIを回す時、Mavenによるアーティファクトのダウンロード時間が問題になります。 CIにおいては、これはMavenのローカルリポジトリをキャッシュすることによって解決される問題です。 ぼくは.gitlab-ci.ymlに以下の様…

QuickTimeの日時情報は32-bit integerであり未設定の場合は1904/01/01 00:00:00 (UTC)扱いになる

メタデータであるCreation Timeを削除したQuickTimeファイルから、Creation Dateを読み出そうとすると例外が発生するように実装しました。 使用しているライブラリはこちらです。 public class QuickTimeCreationTimeKeyMapper implements MovieFileKeyMappe…

MOVファイルから撮影日時を抽出する

いろいろと撮影した動画が溜まってきたので管理をしたい。そこで必要になるのが撮影日付です。 なんとかシステマチックに抽出できないかと思って、試しておりました。 コマンドラインで抽出する ffmpegを使うと、対照ファイルからmetadataが抽出できます。 …

logbackの設定を動的に変更する

そういえば昔、Java のアプリでログレベルを動的に変更したいんじゃ、という要望がありました。 当時、結局その要望は諸事情によって受けられなかったんだけど、Logback でそういうの簡単にできる方法があるらしい。主な方法としては、以下の 2 つ。 logback…

Spring徹底入門

年末年始に Spring 徹底入門をようやく読めた。 Java の FW といえば、Spring を知っておかないともうダメみたいな雰囲気を感じはじめており、以前に買ったままずっと積読してしまっておりました。 Spring徹底入門 Spring FrameworkによるJavaアプリケーショ…

IntelliJ IDEA ハンズオン

Java については、いままでずっと中途半端にやってきたもので、Eclipse で良いんじゃねということで Eclipse でしか書いてなかった。 (大学の頃は、JDEE を使って Emacs で書いていた(使えという指示だった気がする)けどさすがに苦行だった) 現代の Java の …

MyFacesでのステートレスビューとCSRF対策の問題(解決済)

JSF において、ポストバックに対する CSRF 対策が実装されているというエントリを書きました。 ここでは、CSRF 対策トークンの値が javax.faces.ViewState という hidden 値に埋め込まれ、それを改竄した場合は ViewExpiredException が発生するという内容を…

JSFにおけるCSRF対策

CSRF については、一般に正規利用者の意図したリクエストであることを確認することが対策になります。いわゆる徳丸本で紹介されている、具体的な方法としては以下のとおりです。 秘密情報(トークン)の埋め込み パスワード再入力 Referer のチェック 体系的に…

JSFにおけるPostback、そしてライフサイクル

JSF における Postback とは何なのか、っていうのはなかなか本を見てもわかりませんでした。 かといって、こういう概念は実装してもよくわかんなかったりするので、こういうのはやっぱり公式ドキュメントを読んで理解した方が良いだろうと、そこで学んだこと…

WAS Libery ProfileにおけるJVMオプションの設定方法

WAS Liberty Profile において、WAS のランタイムに JVM オプションを指定する方法を探し回っておりました。 この手の JVM オプションは、アプリケーションサーバを立ち上げるスクリプトさえ発見できればすぐなんですけど、今回は Eclipse 上で WebSphere Ap…

スタックトレースの出力が省略されてると思ったそのときに

よくあったんですよ、手元で例外が発生して原因を辿るためにスタックトレースを辿ってたら、おやおや、「... 3 more」とか出てて、原因が辿れねーぞっていうケース。 HighLevelException: MidLevelException: LowLevelException at Junk.a(Junk.java:13) at …

CDIにおけるProducerメソッド

JavaEE 良くわかっていないのですが、それでもプロジェクトが JavaEE 標準だーウオーという状況っぽいので、ちょっと勉強をしはじめております。 ぼくが Java に対して得意意識を持てないのは、こういうところの知識がないのもあるので、そのへんを払拭して…

スレッドダンプを解析する地獄とFastThreadというWebサービス

スレッドダンプというと、JVM 言語に関する運用でマジで困ったときの頼みの綱みたいなイメージある。マジで困ったとき、じゃなくて、カジュアルに見れば良いんだけど、スレッドダンプのフォーマットが異常すぎてつらくなる。 そもそもなんなんだこのゴミみた…

Socket

最近ソケット通信実装のサポートに入っていたので、ちょっとまとめてみたいと思います。 Socket からのデータ読込 Java に関しては不勉強なところが多いんですが、Socket クラスは「ソケット」を抽象化したものであり、「ソケット」は TCP におけるコネクシ…

JavaでのQRコード生成

QR コード あまり知られていませんが、QR コードは日本発の規格になります。 スマートフォンで打ち込むのが面倒なデータをカメラ読込のみで入力できることから世界的にも普及しておりまして、先日は iOS の Chrome に QR コードをスキャンする機能も追加され…

JavaのJSSEでクライアント証明書を自由に選択できるようにする

HTTPS で API を呼び出すっていうシーンは頻繁にあって、その API を使うには、通常何らかの認証が求められます。 認証にも色々あるんだけど、そのうちの一つが HTTPS のクライアント認証です。 普通に HTTPS 通信をしたいだけだと意識しないことも多いので…

Stubby4JにおけるJSONでの正規表現、あるいはリクエスト中の特定のフィールドでレスポンスを変更する

Stubby4J を使用したテストにおいて、API リクエストとして送る JSON の中の値によって、レスポンスを切り替えたい場合がある。 もうちょっと具体的にいうと、 リクエストの JSON の中の特定のフィールドの値によってのみ、レスポンスを切り替える 他のフィ…

Maven Assembly Plugin でできるファイル名がクソダサかった話

Maven Assembly Plugin でできるファイル名がクソださかったのでなんとかしたかった話。 descriptorRef 要素で jar-with-dependency 指定してたら、hoge-0.0.1-SNAPSHOT-jar-with-dependencies.jar とかいうフザけた名前になってて、あまりの衝撃に手足が震…

Maven Assembly Pluginで実行可能jarをつくる

maven assembly plugin maven 力も Java 力も貧弱なのだけれど、依存性を 1 つにまとめた実行可能 jar を作る必要性に駆られたので、ちょっと調べてた。 maven の plugin で実行可能 jar を作ろうとすると、以下の 2 つがメジャー。 Maven Assembly Plugin M…

Stubby4JをJUnitから利用する

Stubby4J を Junit で起動できればだいたいの HTTP 要求に関するテストはできる。 だいたいこんな感じでテストを書きたい。 public class Stubby4jTest { @ClassRule public static Stubby4jServer server = Stubby4jServer.fromResource("com/kiririmode/bl…

RestEasyとHttpComponents、そしてConnectionManager

RestEasy client を使用した HTTP 要求を行うと、TCP コネクションが長時間にわたり残存する問題が発生することがあります。 RestEasy の公式ドキュメントを読めば「HTTP コネクションは適切に release し、適切に close しなければならない」ということは分…

パスワード等の秘匿情報をKeyStoreで保持する

DB 接続用のパスワードだったり、Basic/Digest 認証のときに使うパスワードだったり、世の中にはパスワードが溢れていて、もうパスワードを個別にして記憶しておくとか絶対にムリ、ムリムリムリムリかたつむりであるから、みんなどの Web サービスのアカウン…

コマンドラインで簡単にAES暗号化、または Java での AES 暗号化

Java で AES 暗号化とかやってて、コマンドラインで簡単に試せれば良いのになぁとか思ってたら、openssl 使ったら余裕で暗号化できることに気付いた。 例えば、AES/CBC の 128 bit 鍵長で暗号化したい場合は、以下のようにすれば良い。 -e は暗号化、-d は復…

Javaアプリから共有ライブラリが読み込めない問題(java.library.path と LD_LIBRARY_PATH)

なんか良くわからないエラー (no [ライブラリ名] in java.library.path みたいなヤツ) が出てきたのだけれど、解決方法が java.library.path の設定ではなく、LD_LIBRARY_PATH の設定だったりした。この手のエラーに苦しめられ続けており、そのあたり、ちょ…

maven と git-flow を使用したリリースフロー

ぼく自身、git-flow を利用するのは始めてで、Maven 力も低い。 そういう人間がリリース時にどうしようかとか考えても仕方がないので、先人に頼るかーと思っていたら、ちょうどいいエントリがあった。 Why I Never Use the Maven Release Plugin - DZone Jav…

モックサーバStubby4jの性能

モックサーバに Stubby4j というのがある。 一緒に働いている方に紹介してもらったんだけど、これすごく使いやすい。 使い方は README にわかりやすく書いてあるからそれを読んでもらえばよい。 この Stubby4J、性能テストにも使いたいことがあるから、どの…