Jersey(JAX-RS)でリストの要素が一つしかない場合にレスポンスのjson内の値が配列じゃなくなっちゃう問題の対応

f:id:saihoooooooo:20071226161622j:plain

タイトル長いですが、読んで字の如くです。
例えばこんなクラスがあるとします。

@XmlRootElement
public class MyResponse {

    private List<String> list;

    public List<String>getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

}

このクラスをレスポンスとして返した時、複数の要素がある場合はこうなりますが。

{
    "list": ["fukusu", "aruyo"]
}

要素が一つしかないとこうなる。

{
    "list": "hitotsudake"
}

お前リストやったんちゃうんかい、と。

まぁ別にデータが破損してるわけじゃないんだけど、読み取る側で分岐を入れないといけないとか割とクソ感あります。
「これ直すのに結構奥深くまで手入れないといけないんだろうなぁ・・・」と思いながらグーグル先生に訊いてみると、stackoverflowにそのものズバリな回答がありました。


How can I customize serialization of a list of JAXB objects to JSON? - Stack Overflow

要するにweb.xmlの<servlet>タグに以下のパラメータを追加するだけでいいと。
「your.project.packages」の部分は各自の環境に合わせて書き換えてください。

<init-param>
  <param-name>com.sun.jersey.config.property.packages</param-name>
  <param-value>your.project.packages;org.codehaus.jackson.jaxrs</param-value>
</init-param>

たったこれだけで、ねんがんのレスポンスをてにいれることができました。

{
    "list": ["hitotsudake"]
}

コードの追加、修正が全くなくて得した気分です。

AWS SDK for Java(&KCL)でのDynamoDB、Kinesisのリージョン&プロキシ設定

f:id:saihoooooooo:20141212184703p:plain

コードだけ。

プロキシの設定は両者ともcom.amazonaws.ClientConfigurationを使う。
リージョン設定はDynamoDBの場合、com.amazonaws.regions.Regionを渡し、Kinesisでは名前の文字列を渡すだけでいい。

DynamoDB

// クレデンシャルプロバイダ
AWSCredentialsProvider credentialsProvider = new InstanceProfileCredentialsProvider();

// クライアント(プロキシ)設定
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProxyHost("unko.proxy.jp");
clientConfig.setProxyPort(8080);

// クライアント生成
client = new AmazonDynamoDBClient(credentialsProvider, clientConfig);

// リージョン設定
client.setRegion(Region.getRegion(Regions.fromName("us-west-2")));

// 実行
DynamoDB dynamo = new DynamoDB(client);
Table table = dynamo.getTable("people");

Kinesis

String applicationName = "hogeApp";
String streamName = "hogeStream";
String workerId = InetAddress.getLocalHost().getCanonicalHostName() + ":" + UUID.randomUUID();

// クレデンシャルプロバイダ
AWSCredentialsProvider credentialsProvider = new InstanceProfileCredentialsProvider();

// キネシスクライアント設定生成
KinesisClientLibConfiguration kinesisClientLibConfiguration = new KinesisClientLibConfiguration(
		applicationName, streamName, credentialsProvider, workerId);

// リージョン設定
kinesisClientLibConfiguration.withRegionName("us-west-2");

// クライアント(プロキシ)設定
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProxyHost("unko.proxy.jp");
clientConfig.setProxyPort(8080);
kinesisClientLibConfiguration.withCommonClientConfig(clientConfig);

// 実行
IRecordProcessorFactory recordProcessorFactory = new ProcessorFactory();
Worker worker = new Worker(recordProcessorFactory, kinesisClientLibConfiguration);
worker.run();

railsで使用するgitignoreメモ

まず前提としてgithubが公開しているものをベースにする。


gitignore/Rails.gitignore at master · github/gitignore · GitHub

secret_token.rbとsecrets.ymlについてはどうしようか。
まぁ案件の規模にもよるだろうけど、どちらにしろプライベートな場所に置くと思うのでとりあえずコメントアウトしておく。

# TODO Comment out these rules if you are OK with secrets being uploaded to the repo
# config/initializers/secret_token.rb
# config/secrets.yml

あとはエディタ、OSのゴミなど細かいのを追加。

doc/
*.swp
*~
.project
.DS_Store
.idea
.secret

で最終的にはできたのはこんな感じ。

*.rbc
capybara-*.html
.rspec
/log
/tmp
/db/*.sqlite3
/public/system
/coverage/
/spec/tmp
**.orig
rerun.txt
pickle-email-*.html

# TODO Comment out these rules if you are OK with secrets being uploaded to the repo
# config/initializers/secret_token.rb
# config/secrets.yml

## Environment normalisation:
/.bundle
/vendor/bundle

# these should all be checked in to normalise the environment:
# Gemfile.lock, .ruby-version, .ruby-gemset

# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
.rvmrc

# if using bower-rails ignore default bower_components path bower.json files
/vendor/assets/bower_components
*.bowerrc
bower.json

# Ignore other unneeded files.
doc/
*.swp
*~
.project
.DS_Store
.idea
.secret

とりあえずこれでやってみる。
なんか不便を感じればその都度改良していこう。

modern.IEの設定方法メモ

よく忘れるのでメモ。

  1. https://www.modern.ie/ja-jp/virtualization-tools#downloads から実行する側のOSを選択後、目的のバージョンのsfx、rarをダウンロード
  2. sfxに実行権限を付与(chmod +x 〜)
  3. sfxを実行してファイルを結合
  4. カレントディレクトリにovaファイルが出来ているので実行する
  5. vmwarevirtualboxなどが立ち上がるので日本語設定(タイムゾーン、言語パック)を行う
  6. 言語を変更した後は一旦ログオフしてからIEUser:Passw0rd!でログインしなおす
  7. hostsファイルにてlocalhostを10.0.2.2に向けてアクセス

以上。

glowshi-ft.vimでストレスフリーな横移動を実現する

皆さんこんばんわ。
そろそろ梅雨も明けたでしょうか。
海開き、山開きの時期を迎え、いよいよ本格的な夏の到来となりました。
熱中症などにはくれぐれもお気をつけて、素敵なvim活をお過ごし下さい。

本日は自作プラギンの紹介をしたいと思います。
本当はmomonga.vim #3の頃にはあらかた出来ていたのですが、中途半端な状態から怒涛の放置が続いてしまいました。
最近ようやく落ち着いてきたので記事にしてみたいと思います。

vimの横移動について

皆さんはvimでどういう横移動をしていますか?
h/l?w/b?
私はやっぱりf/tが好きです。
f{char}と入力することで直近の{char}に移動できるアレです。

ただ一つ気に入らない点があって、同一行に対象の文字が複数あった場合に目的の位置に一発で移動しづらいっていう問題があります。
2faとすれば2個目のaに移動できるものの個数を数えるという作業が入るし、数えた末に間違えてた日にゃあキーボード叩き潰したろか、とか思ってしまうわけです。

最近は横移動のプラグインも出揃ってきているので色々使ったりしていましたが、自分にもいいアイデアが浮かんだので形にしてみることにしました。

glowshi-ft.vimを使う

saihoooooooo/glowshi-ft.vim

https://github.com/saihoooooooo/glowshi-ft.vim

glowshi-ftとはglow shift(光る移動)とftの動きを改善したという意味を込めて名付けました。
gif動画を作ったので、見てもらうと動きがわかりやすいかと思います。

http://gifzo.net/JEJkjm4LKP.gif

  • 基本的な挙動はf/tと同じ
  • 対象が複数存在する場合はそれぞれの位置がハイライトされ自由に移動することができる
  • 移動にはhまたはlを使用
  • エンターキーやタイムアウトで位置を確定

といった特徴を持っています。

glowshi-ft.vimのいいところ

では個人的glowshi-ft.vimのいいところベスト3を発表したいと思います。

其ノ壱.vimmerに優しい操作性

前述の通り、対象文字間の移動にはh/lが使えるのでこれ以上ない直感的な操作が可能です。
気づいたらエクセルがhjklで埋め尽くされているアナタも安心。
ストレスフリーです。

其ノ弐.移動と同時にキー入力

候補を移動中に操作できるキーはh/lのようにいくつか用意されていますが、それ以外の用途が割り当てられていないキーを押すと入力時点での位置に移動を確定しつつ、そのキーを入力した状態に移行します。
たとえばある候補の上でiを押せば移動後に即インサートモードになり、またある候補の上でdを押せば入力待ち状態になるため続けてiwと押すことでテキストオブジェクトでの削除が行えます。
これはストレスフリー。

其ノ参.ビジュアルモードやオペレータと合わせてどうぞ

もちろんビジュアルモードやオペレータにも対応しているのでvf{char}lyとかdF{char}hh<Enter>といった操作も可能です。
うーんストレスフリー。

またここでは紹介していない機能(そんなに大したものはないですが)もあるので気になった方はgithubやドキュメントをご覧ください。

最後に

glowshi-ft.vimは絶賛人柱募集中です。
興味が沸いた方は是非使ってみてください。
問題を発見したら容赦なくissuesをくださると大変助かります。

それでは、よいvimライフを!