Eclipse PHOTON を日本語化(Mac)

Eclipse PHOTONを日本語化する。
All in One を使うのが早いが、余計なプラグインなど入っていないのが好みなのでPleiadesを自分で追加する。
Javaはインストール済みの前提で。

  1. Eclipse をダウンロード
    ここから、”Mac OS X (Cocoa) 64-bit”を選択してダウンロード。

  2. パッケージの展開
    ダウンロードしたファイルを展開し、Eclipse.appを任意の場所にコピー。
    Applications以下でも良いが、個人的にはいくつかのバージョンを使っているのでディレクトリを分けています。

  3. Pleiades をダウンロード
     ここダウンロードします。

  4. Pleiades を展開、適用
    ダウンロードしたファイルを解凍し、”setup.app”を起動。セキュリティの関係で、右クリックから”開く”で起動する。
    起動したアプリで、Eclipse.appを選択して”日本語化する”をクリック。

Tomcat のデフォルトエラー画面を使わない

Tomcat上のアプリでエラーが発生した時、下記のような画面が表示されますがオリジナルの画面を表示したい。
server.xml に errorReportValveClass=”” を追加。

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true" errorReportValveClass="">

JavaのBigDecimalで少数の末尾ゼロを削除

Javaで数値をBigDecimalで取り扱っていて、表示の際に少数の末尾ゼロを削除したい。stripTrailingZeros() を使うと楽。
27.500000000 の”00000000″部分。

BigDecimal val = new BigDecimal("27.500000000");
System.out.println(val.stripTrailingZeros().toPlainString());

少数の桁数を合わせるためにゼロを入れたい場合はフォーマットで対応。

Spring Boot でCSVダウンロード

データが少ない時

データが多くてメモリ不足になりそうなら、データが多い時の方法を検討。
それでもだめならバックグラウンドでcsvファイルを生成しておいて、あとでDLさせるとか検討。

    @RequestMapping(value = "csvdownload", method = RequestMethod.GET)
    public ResponseEntity<byte[]> download() throws IOException {
        HttpHeaders header = new HttpHeaders();
        header.add("Content-Type", "text/csv; charset=shift_jis");
        header.setContentDispositionFormData("filename", "sample.csv");
        String csv = "\"data1\",\"data2\"";
        return new ResponseEntity<>(csv.getBytes("shift_jis"), header, HttpStatus.OK);
    }

データが多い時

出力したいデータを全部取得するとメモリが足りなくなるケースがあるはずなので、順次取得しながら出力する。

    @RequestMapping(value = "csvdownload", method=RequestMethod.GET)
    public void csvdownload(HttpServletResponse response) {
        response.addHeader("Content-Disposition", "attachment; filename=\"sample.csv\"");
        response.setContentType("text/csv; charset=shift_jis");
        try (ServletOutputStream out = response.getOutputStream()) {
            for (int i = 0; i < 10000000; i++) {
                // ここから
                String csv = "\"data1\",\"data2\"";
                out.write(csv.getBytes("shift_jis"));
                // ここまでをデータ取得しながらデータ出力する
            }
            out.flush();
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }

Spring Boot の認証にcookieを使う

Spring Boot でWebアプリを開発していて、少し規模が大きくなり複数のAppサーバーを使用するときにいくつか課題がある。
その一つとしてセッションの問題がある。

Spring Bootではデフォルトでセッションをサーバー側に保存するため、複数のサーバーを使用する場合、クライアントが異なるサーバーにアクセスするとセッションを維持できない。
そこで複数のサーバーで共有するなど、解決方法はいくつか考えられる。

  1. セッション情報をDBだったりRedisのようなKVSに保存する
  2. WebサーバーStickysessionを使う

「1.」 は良い方法ですが、セッション情報を保存するサーバーの運用、性能、冗長性など余計な管理が増えてしまう。
「2.」 は容易に実現できるが、同一のAppサーバーにアクセスする必要があるので、増減を動的に行うのが難しい。

そこでセッション情報をcookieのようなクライント側に保存する方法が良いのではと思う。
例えばPlay frameworkではセッションの実態はcookieを使用している。
https://www.playframework.com/documentation/2.6.x/SettingsSession#Configuring-the-session-cookie

これをSpring Bootで実現するときに参考にしたサイトをメモ。
http://www.svlada.com/jwt-token-authentication-with-spring-boot/
https://qiita.com/nyasba/items/f9b1b6be5540743f8bac