Hatena::Groupprogram

ひとり開発日記。 このページをアンテナに追加 RSSフィード

2017/06/24 (Sat)

jax-rs-pac4j 2.0.1

|  jax-rs-pac4j 2.0.1 - ひとり開発日記。 を含むブックマーク はてなブックマーク -  jax-rs-pac4j 2.0.1 - ひとり開発日記。

Pac4Jと言う、Javaベースのウェブアプリの認証をサポートしてくれる、ライブラリ群があります。*1 jax-rs-pac4jは、JAX-RSに特化したライブラリで、今回、私が報告したバグ修正2件の入った、2.0.1がリリースされました。

  1. Grizzly+Jersey+jax-rs-pac4jでNullPointerException
    • 自分で、今、The Twelve-Factor App*2ベースのウェブアプリを作ろうと思っていて、フレームワークは、Jersey MVC*3で、認証はtwitter*4、認証機構には何がいいかな、とググっていたらJAX-RSに特化した、jax-rs-pac4jがあることを知りました。
    • で、早速、推奨構成の Grizzly + Jersey MVC + pac4j-oath + jax-rs-pac4j で、プロジェクトを作成し、認証までは軽く通ったんですが、なぜかコールバックで NullPointerException(NPE) 発生…。 よく分からないので、スタックから追っていくと、pac4jのコールバック処理で、セッションの要素を消すのに、nullを書き込んでいて、Grizzlyの中のインメモリ・セッションキャッシュは ConcurrentHashMap を使っているので、null値をputすると、当然、NPEが出てしまうのです。
    • ユーザーフォーラムで報告したら、GitHubにイシュー立てろ、って言われて、立てたら、"Good find.(よう見つけたな)"ってレスされて、ちょっとイラってしましたけどね…。 まぁ、速攻で直して貰ったのでありがたいですわ。
  2. issueに書いてある回避策を試したらNullPointerException
    • issueに書いてある回避策を参考に、GrizzlySessionStore をラップしたサブクラスを作って、configに追加したら、あれ、認証前に例外発生。 しょうがないんで、またスタックから追っていくと、SessionStoreの有無判定で、三項演算子でnullチェックしてるのに、nullを再代入してる…。 これはNPE不可避ですなぁ。
    • あんまりにも致命的なバグなので、イシューもプルリクも無しで、コミットして、緊急リリースしてくれましたね。

ライブラリ群の中でも再後発、先月リリースの大きく書き直した2.0.0、しかもバグ回避ルートと言う事情なので、仕方ないかもですが、無償でデバッグしてるようで、モニョモニョと…。

とは言え、OSSとはそんなもんで、市井のプログラマーが、協力しあって育てていくものなのかもしれませんね。

*1http://takezoe.hatenablog.com/entry/2017/01/28/021818 pac4jでGitHubのOAuth認証を使ってみる - たけぞう瀕死ブログ

*2https://12factor.net/ja/

*3https://jersey.github.io/documentation/latest/mvc.html

*4:ありがち…

トラックバック - http://program.g.hatena.ne.jp/halflite/20170624

2017/06/02 (Fri)

Windowsのcmd.exeで、Mavenを使って新規プロジェクトを作る時

| Windowsのcmd.exeで、Mavenを使って新規プロジェクトを作る時 - ひとり開発日記。 を含むブックマーク はてなブックマーク - Windowsのcmd.exeで、Mavenを使って新規プロジェクトを作る時 - ひとり開発日記。

mvn archetype:generate ^
  -DarchetypeArtifactId=maven-archetype-quickstart ^
  -DinteractiveMode=false ^
  -DgroupId=net.halflite ^
  -DartifactId=testapp ^
  -Dpackage=net.halflite.testapp

毎度忘れてググってしまうので…。*1 *2

*1:cmdのバッチファイルで、1コマンドを複数行にわたって記述したい場合 http://qiita.com/ndxbn/items/089b97e33ae9b69bf48b

*2:groupId/artifactId/package は適時書き換えて下さいな

トラックバック - http://program.g.hatena.ne.jp/halflite/20170602

2017/02/11 (Sat)

今週の月曜日

|  今週の月曜日 - ひとり開発日記。 を含むブックマーク はてなブックマーク -  今週の月曜日 - ひとり開発日記。

「2017/01/01は日曜日なので、"今週の月曜日"なら2017/01/02になりますよ」ってコメントしようと思ったのですが、どうにもこうにもクソリプっぽかったので、自分の日記に書きます。

解決策として、「今日が日曜日なら本日、そうでないなら前の日曜日に戻る」→「次の月曜日を求める」で、2017/01/01週の月曜日を求めると、Java8だと、日時APIを使用して、以下のようにするのがいいのですかね。

package test;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

import java.time.DayOfWeek;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;

import org.junit.Test;

public class ThisMondayTest {
    @Test
    public void testThisMonday() {
        String date = ZonedDateTime.of(2017, 1, 1, 0, 0, 0, 0, ZoneId.of("Asia/Tokyo"))
                .with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY))
                .with(TemporalAdjusters.next(DayOfWeek.MONDAY))
                .format(DateTimeFormatter.ISO_LOCAL_DATE);
        assertThat(date, is("2017-01-02"));
    }
}

このAPIGroovyを使って書き直せばいいのではないでしょうか。*1

*1:すみません、Groovy全然分からないんですよね。 Gradleも触ったこと無いくらいなので…。

トラックバック - http://program.g.hatena.ne.jp/halflite/20170211

2016/02/29 (Mon)

jOOQは楽しいですね。

| jOOQは楽しいですね。 - ひとり開発日記。 を含むブックマーク はてなブックマーク - jOOQは楽しいですね。 - ひとり開発日記。

まぁ、タイトルで出落ちですが。

また一人開発始めてるんですが、アーキテクチャ選定やるんですよね。

で、永続層/ORMが悩む訳です。 正直、JPA2.xは、使いづらい…。 コストかけて学習したのに*1、あの実地で使えない感じは、ホント嫌だなぁ、とか思うんですよねー。

で、上記スライド見て、「なんつー、今の俺」とか思うんです*2

それでもって、試すと、S2JDBCを初めて触った時のワクワク感、「これで、タイプセーフ+流れるようなI/Fで、バグもすぐ見つけられて、ハマりも少ない!!」を思い出ささてくれるんですよね。 まぁ、しばらく使ってみますかねー。

*1金魚本って、何だったんでしょうね…??? http://amazon.jp/dp/4798124605

*2:まぁ、JavaのORMのバリエーションが少なくて、開発/イノベーションが停滞してる、ということなんですがー…

トラックバック - http://program.g.hatena.ne.jp/halflite/20160229

2015/10/01 (Thu)

EclipseLink/JPAのエンティティクラスから作成したDDLを、flywayでマイグレーション

| EclipseLink/JPAのエンティティクラスから作成したDDLを、flywayでマイグレーション - ひとり開発日記。 を含むブックマーク はてなブックマーク - EclipseLink/JPAのエンティティクラスから作成したDDLを、flywayでマイグレーション - ひとり開発日記。

EclipseLink/JPAのエンティティクラスから、CREATE TABLEのDDLを、Mavenで作成 - ひとり開発日記。 - プログラマの秘密のあれこれ の続きです。

DBマイグレーションツールflywayは、Mavenプラグイン形式でも提供されているので、別個インストールしなくても、pom.xmlに記述するだけで実行OKなんですね。

そして、結構面倒くさいConfiguration設定も、必要なだけ properties の中で flyway.*** 形式で記述するだけで良いのです。

    <properties>
        <flyway.url>jdbc:mysql://127.0.0.1:3306/testdb</flyway.url>
        <flyway.user>testuser</flyway.user>
        <flyway.password>testpassword</flyway.password>
        <flyway.locations>filesystem:${project.basedir}/db/migration</flyway.locations>
    </properties>

    <build>
        <plugins>
             <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>3.2.1</version>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.36</version>
                    </dependency>
                </dependencies>
            </plugin>
       </plugins>
    </puild>

JDBCURL、ユーザー、パスワードDBのドライバーは、それぞれ自分の環境に合わせて頂いて…。

mvn flyway:migrate

上記を実行すると、DDLDBに流し込まれて、各種テーブルが出来上がります。

トラックバック - http://program.g.hatena.ne.jp/halflite/20151001