docker環境でjavaのgetBytes()を使った際に困った時の対処法

javaソースコード内でgetBytes()を使ってバイト化した際に、上手く変換出来ないという事象が発生して困ってしまったことがあります。
原因は、Javaの日本語ロケールが登録されていないことだったようです。
以下、対象のdockerfileに追記することで解決するかと思います。
(もしかしたらENVの設定いらないかも。)

【dockerfile】

RUN apt-get -y install locales locales-all

RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG="ja_JP.UTF-8" \
        LANGUAGE="ja_JP:ja" \
        LC_ALL="ja_JP.UTF-8" 

※上記、apt-getを使っているが、最近ではaptを使う方が推奨されているらしい。

参考

「ロケール環境変数」の種類と優先順位まとめ【LC_ALL・LC_*・LANG・LANGUAGE】 | LFI

Dockerコンテナ上でJavaプログラムを動かすときにLANG環境変数を設定すると日本語のファイル名が文字化けする問題 - Qiita

https://qiita.com/yuki2006/items/6cea8c352e38f047b52a

CookieのSameSite設定について勉強してみた

SameSiteとは

  • Cookieのアクセス制限設定のこと。
  • 以下の設定がある。
SameSite=None
SameSite=Lax
SameSite=Strict
  • 2020年2月から自動適用される。

なぜ適用されるのか?

  • 元々Googleが推奨していた設定だがほとんどのサイトで実装されていなかった。
  • SameSiteを適用しないことで、クロスサイトリクエストフォージェリ攻撃などの脅威にさらされている。
  • ほとんどのデベロッパーが付けないから脅威から守るためにデフォルトで付けるわ。ということらしい。

対象ブラウザ

参考

developers-jp.googleblog.com

DockerでRedmine環境構築

前提

・Dockerが、すでにインストールされていること。

はじめに

今回、docker-compose.yml作成を行います。
以下、やることの目標になります。
・Dockerを使ってRedmineを作る
プラグインを入れる

基本的な事は、公式に書いてあるので参照していただければ幸いです。
Redmine公式はこちら

ディレクトリ構成

手始めに、作業ディレクトリとして以下のように、
フォルダを作成して頂くとスムーズかと思います。

redmine
├── mysql_data
└── redmine_data
    ├── plugins
    └── themes

Dockerを使ってRedmineを作る

準備

公式のymlを参考に作ります。(バージョンの固定とポート、DBパスワードのみ修正)
以下のdocker-compose.ymlを作成すれば、ここでの作業は、完了になります。
ディレクト

redmine
├── docker-compose.yml ←追加
├── mysql_data
└── redmine_data
    ├── plugins
    └── themes

・docker-compose.yml

version: '3.1'

services:

  redmine:
    image: redmine:4.0.3
    restart: always
    ports:
      - 3000:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: password

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: redmine

実行

以下、コマンドを打ちます。
(完了まで少し時間が掛かると思う。)

$ cd 配置場所までのパス/redmine
$ docker-compose up

ブラウザで「localhost:3000」にアクセスしてみましょう。
見慣れたredmineの画面が表示されるはずです。
確認後、ターミナル(パワーシェル)で「ctrl + c」で停止します。

プラグインを入れる

準備

コマンドを打ち込んで入れるのも面倒なので、ローカル環境にマウントしてみましょう。
(ついでにテーマも!)
これで、入れる準備は完了です。
・docker-compose.yml

version: '3.1'

services:

  redmine:
    image: redmine:4.0.3
    restart: always
    ports:
      - 3000:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: password
    volumes:
      - ./redmine_data/plugins:/usr/src/redmine/plugins ←追加
      - ./redmine_data/themes:/usr/src/redmine/public/themes ←追加

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: redmine

プラグイン配置

マウントしたフォルダにプラグインを配置しましょう。

redmine
├── docker-compose.yml
├── mysql_data
└── redmine_data
    ├── plugins
    │    ├── easy_gantt ←追加
    │    └── redmine_issue_templates ←追加
    └── themes

DB作成

作成したイメージを動かしてみましょう。
おそらくエラーが出始めるので、一旦置いておきます。
(原因は、テーブルが足りないからです。)

$ cd 配置場所までのパス/redmine
$ docker-compose up

次に、別ターミナルを開きます。 以下、コマンドを実行しましょう。
(easy_ganttしか載せていませんが、プラグインのReadMeを見て必要なら他のプラグインにも実行してください。)

$ docker ps
$ docker exec -it コンテナID(一番左に表示されてる) bash
root@コンテナID:/usr/src/redmine# cd /usr/src/redmine/plugins
root@コンテナID:/usr/src/redmine# cd easy_gantt(対象プラグインのフォルダ)
root@コンテナID:/usr/src/redmine# rake redmine:plugins:migrate RAILS_ENV=production

放置していたターミナル(パワーシェル)上で、「ctrl + c」を押して停止します。
停止できたら再度、起動します。
これで、エラーが出ていなければ完了です。
お疲れ様でした。
(Redmineの画面で、プラグインが入っていることの確認を忘れずにね。)

$ docker-compose up

空のレスポンスコード200を返すには?

前提

「200」で返すには、ボディ部が必要だと思っていた。
プログラムは、画面から呼ばれるAPIで基本的にJSONを返す仕様。

はじめに

なぜ「200」で返す必要があるのか?
特に返す情報がない場合、204(=OKかつno contents)でも良いのだが、
自社プログラムにて、200だけが成功とみなされるため。
(画面側の処理が、影響しているのだろう。。。)

課題感

レスポンスコード200(=OKかつボディがある)にするために、実行結果であるJSONが不要な場合でも、「"OK"(=文字列)」をJSONで返している。(既存処理)
「イケてない。。。」とは思いつつも既存処理に倣って「"OK"」を詰めたオブジェクトをJSONに加工して返すような処理を書いていた。

施策

JAX-RS(Jersey)を使って、無駄なレスポンスを削る。
これで、200(=OKかつno contents)で返ってきます。

import javax.ws.rs.core.Response;

public Response method() {
  .
  .
  .
  return Response.ok().build();
}

こんな事できるなんてすごいなぁー(小並感

結果

無駄なオブジェクトが減らせてよかったと個人的には思ってる。
こんな事も知らなかった自分が恥ずかしい。。。

つぶやき

Dockerやドメイン駆動など、色々勉強しなくてはいけない重いものが増えてきて、中途半端になってきてる。。。 拙い記事ばかりですが、見に来て下さりありがとうございます。 なんとか整理して皆さんにお届けできるように頑張ります。

Dockerをはじめてみる。(エラー編)

はじめに

ここでは、テキストを進めた際に、起きたエラーと解決方法について記載して行こうと思う。 (原因までは、言及していないのでご了承ください。。。) 列挙形式で記入のため、分かりずらかったらコメントください。

Docker [ Adrian Mouat ]

価格:3,888円
(2019/3/11 22:07時点)

5章 開発でのDockerの利用

5.1 "Hello World!"

  • 問題箇所
[Dockerfile]

FROM python:3.4

RUN pip install Flask==0.10.1
.
.
.
  • エラー
DEPRECATION: Python 3.4 support has been deprecated. pip 19.1 will be the last one supporting it. Please upgrade your Python as Python 3.4 won't be maintained after March 2019 (cf PEP 429).
  • 解決方法
    バージョンをあげる。
FROM python:3.6

  • 問題箇所
[Dockerfile]

FROM python:3.6

RUN pip install Flask==0.10.1 uWSGI==2.0.8
.
.
.
  • エラー
requests.exceptions.ConnectionError: HTTPConnectionPool(host='dnmonster', port=8080): Max retries exceeded with url: /monster/monster.png?size=80
  • 解決方法
    バージョンをあげる。
RUN pip install Flask==0.10.1 uWSGI==2.0.18

6章 シンプルなwebアプリケーションの作成

6.2 既存のイメージ利用

  • 問題箇所
[identidock.py]

@app.route('/monster/<name>')
def get_identicon(name):
    r = requests.get('http://dnmonster:8080/monster/' + name +'?size=80')
.
.
.
  • エラー
requests.exceptions.ConnectionError: HTTPConnectionPool(host='dnmonster', port=8080): Max retries exceeded with url: /monster/monster.png?size=80
.
.
.
  • 解決方法
    ymlに追記する。
[docker-compose.yml]
.
.
.
  volumes:
    - ./app:/app
  links:
    - dnmonster

dnmonster:
  image: amouat/dnmonster:1.0

2/2_QUARKUS(Javaフレームワーク)触ってみた!(チュートリアル実行編)

はじめに

今回は、チュートリアル実行編です。 「そんなの自分でやってやるぜ!」って方に向けて、 以下に実行するチュートリアルの元URLを添付しておきます。

quarkus.io

環境構築編

環境構築大事!!
コマンド漏れなく打ってるのに、エラーになったらここを疑ってみて!
以下、リンクはWindowsの方向けに貼っておきます。
macは、「brew」使えばいいので...(脳筋

1. IDE(Javaなので、ecilpseかIntelliJ かな?)
eclipsehttp://mergedoc.osdn.jp/
IntelliJhttps://www.jetbrains.com/idea/
1. JDK 8以上
Windowshttps://qiita.com/ko2a/items/69fa8a5366d7449500ca
JAVA_HOMEの設定も忘れずに!
1. Maven or Gradle(Mavenが無難かな)
Mavenhttps://qiita.com/tarosa0001/items/e5667cfa857529900216
Gradle:https://qiita.com/vvakame/items/83366fbfa47562fafbf4
1. GraalVM
GraalVM:https://www.graalvm.org/docs/getting-started/ qiita.com

eclipseとかの入れ方は、ググっておくれ...
その他は、先駆者の方の記事をお借りします...(ありがたやー)
Gradleでのビルドは、追々やれたらいいな。。。

チュートリアル

1.Gitからクローンを落としてきます。

$ cd 保存場所
$ git clone https://github.com/quarkusio/quarkus-quickstarts.git

※ソースを落とす際に、プロジェクト名を変えないで!

2.Quarkusプロジェクトを作成します。

$ mvn io.quarkus:quarkus-maven-plugin:0.11.0:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=getting-started \
    -DclassName="org.acme.quickstart.GreetingResource" \
    -Dpath="/hello"

3.動作確認をします。

$ cd quarkus-quickstarts
$ cd getting-started
$ mvn compile quarkus:dev

localhostにアクセスする。
URL:http://localhost:8080

f:id:WoodPecker:20190317003130p:plain

もう一つコンソールを開き、curlを投げてみる。

$ curl http://localhost:8080/hello
hello

とりあえず今回は、ここまで!
お疲れ様でしたー

補足

プロジェクト作成時に、以下のエラーが出て焦ったけど、コマンド打つ階層を間違えてただけだったよ。。。

[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:0.11.0:create (default-cli) on project quickstart-projects: Unable to generate the project, the `projectGroupId`, `projectArtifactId` and `projectVersion` parameters are not supported when applied to an existing `pom.xml` file -> [Help 1]

リンク

続きはこちら↓
未作成
前回はこちら↓ woodpecker.hatenadiary.jp

1/2_QUARKUS(Javaフレームワーク)触ってみた!(導入編)

はじめに

3/7(かな?)に発表された新しいフレームワークのため、
記述内容に拙いところがありますが、ご了承ください。
quarkus.io

QUARKUSとは

サーバ関係でよく耳にするであろうredhat社が作ったJavaフレームワークです。 ( redhat社ホームページ:https://www.redhat.com/ja/global/japan )

何が嬉しいの?

  1. くそ早ええー
  2. くそ軽い!
  3. 既存のライブラリにも対応してるぜ

https://quarkus.io/assets/images/quarkus_graphics_v3_bootmem_wide_03.png

f:id:WoodPecker:20190312215818p:plain
出典:https://quarkus.io/

上記画像は、公式サイトに乗っている画像です。 メモリ使用量とアプリを起動してから最初のレスポンスが返却されるまでの時間です。(画像:上) 一目瞭然ですね。 また、画像にあるように既存の便利なライブラリも利用できるようです。(画像:下)

リンク

続きはこちら↓
woodpecker.hatenadiary.jp