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/07/24 (Sun)

Vagrantで起動したCentOS6.8にPostgreSQL9.5をAnsibleでインストール

| Vagrantで起動したCentOS6.8にPostgreSQL9.5をAnsibleでインストール - ひとり開発日記。 を含むブックマーク はてなブックマーク - Vagrantで起動したCentOS6.8にPostgreSQL9.5をAnsibleでインストール - ひとり開発日記。

MySQLインストール*1 を参考に、今度はPostgeSQLをAnsibleでインストールしてみました。

環境
[vagrant@localhost ~]$ ansible --version
ansible 2.1.0.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
Vagrantfile

Vagrantboxは no title を使用。

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.define :postgres_db do |node|
    node.vm.box = "bmcgonigle/centos68"
    node.vm.box_version = "1.0.1"
    node.vm.network :private_network, ip:"192.168.33.15"
  end

  config.vm.provider "virtualbox" do |v|
    v.gui = true
  end

end
playbook.yml
- hosts: localhost
  remote_user: vagrant
  sudo: yes
  vars:
    dbuser: "dbuser"
    dbpass: "dbpassword1"
    dbname: "testdb"

  tasks:
    - name: yum update all
      yum: name=* state=latest

    - name: install PostgreSQL Yum Repository
      yum: name=http://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-2.noarch.rpm

    - name: install PostgreSQL Server
      yum: name={{ item }} state=latest
      with_items:
        - postgresql95-server
        - postgresql95-devel
        - postgresql95-contrib
        - libselinux-python
        - python-psycopg2

    - name: initdb
      shell: /sbin/service postgresql-9.5 initdb

    - name: start postgresql
      service: name=postgresql-9.5 state=started

    - name: change listen_addresses to '*'
      lineinfile: dest=/var/lib/pgsql/9.5/data/postgresql.conf
        regexp="^#listen_addresses"
        line="listen_addresses = '*'"
        state=present
        backup=yes

    - name: change pg_hba.conf
      lineinfile: dest=/var/lib/pgsql/9.5/data/pg_hba.conf
        regexp="host\s+all\s+all\s+127.0.0.1/32\s+ident"
        line="host all all 0.0.0.0/0 trust"
        insertbefore=BOF

    - name: allow port 5432
      shell: /sbin/iptables -A INPUT -p tcp --dport 5432 -j ACCEPT

    - name: sysconfig iptables touch
      file: path=/etc/sysconfig/iptables state=touch owner=root group=root mode=0644

    - name: iptables restart
      service: name=iptables state=restarted

    - name: postgres user sudores
      lineinfile: 
        dest: /etc/sudoers.d/postgres 
        owner: root
        group: root
        mode: 0440
        line: "%vagrant ALL=(postgres) NOPASSWD: ALL"
        state: present
        create: yes
        validate: "visudo -cf %s"

    - name: add user
      user: name={{ dbuser }} password={{ dbpass }} group=postgres

    - name : create database
      postgresql_db: 
        name: "{{ dbname }}"
        encoding: "UTF-8"
        login_user: postgres
      sudo_user: postgres
      sudo: yes

    - name: create user
      postgresql_user: 
        db: "{{ dbname }}"
        name: "{{ dbuser }}"
        password: "{{ dbpass }}"
        priv: ALL
        state: present
        login_user: postgres
      sudo_user: postgres
      sudo: yes

    - name: postgresql restart
      service: name=postgresql-9.5 state=restarted enabled=yes
ハマりどころ
  1. ホストOS上のDBクライアントから、ゲストOS上のDBに接続設定で、あれこれ悩む
  2. iptables 再起動時、 "iptables: No config file."とメッセージがでて、ansibleが止まる
トラックバック - http://program.g.hatena.ne.jp/halflite/20160724

2016/05/28 (Sat)

TypeScriptは楽しいですか?

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

最近、TypeScriptを使って、簡単なプロダクトを作ろうとしています。 でも、これ、想像以上に大変で…。

エコシステム覚えること多過ぎ

let a: number = 1;
let b: number = 2;
console.log(a + b);

上記なんか、簡単に書けますが、それから先に進もうとすると、いきなり困ったりしますよね。

コンパイルするだけでも、gulp, browserify, tsify, vinyl-buffer とか覚えることが多過ぎで、「なるほど、これが消耗するということか」*1 *2とか思ったりしてます。

エコシステム変化早過ぎ

型定義ファイルをダウンロードして取り込む、と言う機能だけで、この半年だけで、 tsd → typings → @types と、どんどん(所謂)「ベスト・プラクティス」が変化しているのです*3

正直、今年1月からTypeScript始めた人は、この早さに正直、消耗しますわね…。

エコシステムばらばら過ぎ

import * as Backbone from "backbone";

上記の様に先頭で宣言すると、backbone.jsと、それが依存するライブラリ一式を取り込んで連結して、一つのファイルにまとめてくれるんです。

うわー、最高だ!!、と思ったのもつかの間、import宣言が効かないライブラリ、ホントに多いのです。 なんでexport文書いてくれないのでしょう…。 例えば、rivets.jsとか。まぁ、自分で修正してpull-request投げれば良いのでしょうが、Node.jsの、お作法から勉強しないと…。 そしてキャッチアップした頃には、誰かが修正してるんだろうなぁ、とか思うと、自分まで消耗しそうな気が…。

*1:Grunt/Gulpで憔悴したおっさんの話 - MOL http://t32k.me/mol/log/npm-run-script/

*2:Grunt/Gulpだるい問題私見 - スクールアイドルです http://misumirize.hatenablog.com/entry/2015/04/05/000301

*3@typesはまだアルファ版だけど、MS中の人がやってるってことは、後々公式になるでしょうね…

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