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

猫が布団にお漏らしを...

この記事を見に来た猫の飼い主さんは、きっとこんな人なのではないでしょうか?

急に、飼い猫が布団にお漏らしをするようになってしまった。

今までトイレにしていたのに...

本当に困ったものです😭

病気なのかな?と心配になったものです。

自分も同じような状況になったことがあり、その時に効果的だった方法をシェア出来たらと思います。

うちの猫情報

  • メス猫
  • 生後半年
  • 今までトイレでうんち、おしっこが出来ていた
  • 餌はちゃんと食べる
  • 元気
  • かわいい

前提

以下、2点はとても大切です。 あてはまらないのであれば、病院にいくことをお勧めします。

  • 餌はちゃんと食べる
  • 元気

本題

実際、何をしたのかというと「猫の砂を変えた」だけです。

今までは、ヒノキの香りがする木材系の砂(?)を使っていたのですが、うちの猫には踏み心地が悪かったみたいでした。(手のひらで完食を試したところ痛かった...)

そこで、以下の砂に変えたところ劇的に変化し、お漏らしをしなくなりました。

急なお漏らしで困っている方は、是非試してみてください。(おおよそ1袋でトイレいっぱい分の量です。)

子猫の食欲がないときの話

はじめに

公の場にわざわざ書き記すなんて行為は、ただのエゴかもしれません。
ただ1匹でも救えたらと思い書き記します。

結論

ただちに病院に行ってください。 一刻を争います。後悔しないうちに、急いで。

自分の話

生後3カ月の子猫を死なせてしまった。
死因は、肺炎。引き取って3日しか経ってないのに。
悔やんでも悔やみきれない。

1日目

生後3カ月の子猫をペットショップで購入した。
家に持ち帰った日、子猫は、慣れない素振りをつつも、家の中を散策し、とても楽しそうにはしゃいでいた。
餌も適量食べていた。猫用のケージが届いていなかったので、一緒のベットで寝た。(可愛い。)
枕元という定位置を確立したようだった。

2日目

起床。
朝ごはんを食べたあと、子猫の朝ごはんを準備した。
朝ごはんを食べさせるために、子猫を呼ぼうとしたが、ぐっすり寝ていたので、一旦放置した。
お昼。
子猫は、まだ寝ていた。
そろそろご飯を食べて欲しいので起こすと眠気眼でこちらをみる。(可愛い。)
すくっと立ち上がったので、ご飯が置いてある場所へと誘導する。
ご飯を食べ、お水を飲んだあと、初のおトイレ(小、大)をしたので、少し安心した。ただ、割とご飯が残っている。
夜。
昨日ほどの元気は無いものの遊びたいのか、オモチャで戯れていた。
少しオモチャで遊んだあとお水をガブ飲みし、寝てしまった。(ご飯食べてない。。。)
深夜。
さすがに、不安だった。
子猫用のマグロゼリー?を付けて食事を与えてみる。
2、3口食べたもののすぐに定位置に移動して寝てしまった。

3日目

起床。
昨日と同じく朝ごはんを食べて、子猫のご飯を準備する。
子猫は、まだ寝ている。
お昼。
起こしてみるものの眠気眼でこちらを見てすぐ寝る。
自分の寝返りで起こしてしまったっぽいので、寝不足かな?と思う。
寝てしまったので、ご飯は食べていない。
夕方。
流石に心配が、ピークに達する。寝すぎだろ。
すこし起こしてみるとお水を少し飲んだあとに、トイレへ向かった。
ただ、問題が発生、トイレに到達する前にうんちのお漏らしをしてしまった。
ここで危機感を覚える。
いろいろ調べたけどそれらしい情報が、ほとんど出てこない。(「子猫は、よく寝る」とか、「家に来たばかりで不安」とか、「トイレを覚えれていない」とかそんな類しかない。)
結果、自分で呼吸数を調べるのが、一番早いという結論に至る。
子猫を寝かしつけて、1分間の呼吸数を数える。
明らかに、早い。カバンに子猫を詰めて、子猫を揺らさないようにダッシュで病院へ向かう。
高熱あり、そのまま入院。

4日目

夜。
病院から電話。
急変でなくなったとのこと。
死因は、肺炎。
感染原因は、不明とのこと。
何も言えない。
もっと気づける事があったはずという後悔しかない。

あとがき

子猫がご飯を食べずに寝ていたら、来たばかりだからと様子見せずに、迷わず病院へ連れて行って。

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