OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby】シーザー暗号作ってみた

Rubyで簡易なシーザー暗号プログラムを作りました。
初投稿で、至らぬ点も多いですが、よろしくお願いします。

## シーザー暗号とは？
平文の各文字を辞書順に3文字のみシフトし、暗号文をつくる暗号のこと。
単一換字式暗号の一種で、カエサル暗号とも呼ばれている。

要はアルファベット順に文字をシフトさせて、暗号化するってことですね。
例： enter → bkqbo


## 実現するには？
コードを実現するにあたって、考えたことは以下になります。

1. 文字列って、数字で表現できるのでは？
2. 文字列 → 数値 → シフト後の数値 → 文字列と変換すれば可能？
3. 文字列が長くても対応できるように！

上記の3点を意識して、コードを書いてみました。


### 実際に書いたコード

```ruby:code.rb
puts "キーワードを入力してください（アルファベット小文字のみ）"
keyword = gets.chomp

puts "暗号化前: #{keyword}"

# 暗号化した文字列を格納するための配列を定義
code = []

# keyword.charsで入力された文字列を１文字ずつ分解して配列へ
keyword.chars.each do |char|
  num = (char.ord - 3) # .ord で文字コードへ変換（数値化）し、3つ分、シフトする
  code << num.chr # 文字コードを文字列へ戻し、配列codeに入れていく
end

# 配列codeに入った文字列を全て連結させて出力
puts "暗号化後: #{code.join("")}"
```



ターミナルでの出力

```
キーワードを入力してください（アルファベット小文字のみ）
desk
暗号化前: desk
暗号化後: abph
```

やった！できた！　他のも試してみよう・・・

```
キーワードを入力してください（アルファベット小文字のみ）
apple
暗号化前: apple
暗号化後: ^mmib
```
aが記号に変換されてしまった・・・

調べてみると、
aの文字コード: 97 → シフト後: 94 となり、文字コード: 94は「^」みたいです...

となると、「a ~ z」の文字コードでの範囲は「97 ~ 122」。この範囲外では、アルファベットの小文字ではなくなってしまう。
abcやxyzにも対応できるようにしなければ...
そこでコードを以下のように改良しました。

### 改良版

```ruby:code.rb
puts "パスワードを入力してください（aからzまでの小文字）"
keyword = gets.chomp

puts "暗号化前: #{keyword}"
code = []

keyword.chars.each do |char|
  num = char.ord - 97
  num2 = (num - 3) % 26
  num3 = num2 + 97
  code << num3.chr
end

puts "暗号化後: #{code.join("")}"
```
each文の中の処理を少し変更してみました！

each内部の処理ですが...
d を例として説明すると、
dの文字コードは「100」のため、numに入る値は「3」になります。
次にnumに対して、「3」(シフトさせる分の数値)を引き、 %26 してあげると num2は「0」です。
その後、num2に「97」を再び足すことでnum3が「97」となります。
最後に、このnum3に 「.chr」することで文字列に戻り、「a」となります。

num2の計算ですが、%26してあげることで、計算結果は「0 ~ 25」のどれかになります。
たとえ、num2が負の値であってもです。

これは割り算の余りの基本式に当てはめて考えてみると分かるので、気になる方はやってみてください。

(割られる数)＝(割る数)×(商)＋(余り)

最後に書き換えたコードをターミナルで実行してみましょう！

```
パスワードを入力してください（aからzまでの小文字）
apple
暗号化前: apple
暗号化後: xmmib
```

アルファベットの小文字限定ですが、無事暗号化することができました。
まだ大文字や数字には対応していないので、時間があればやってみようかと思います。

分かりづらかったかもしれませんが、ここまで読んでいただきありがとうございました。
カウントアップして日またぎでリセットするSQL

## 1.テーブルを作ります

```sql:create
create table indexT
(
	indexNo int not NULL,
	UpdateDatetime datetime,
	Primary Key( indexNo )
);
```

## 2.SQLを実行します。

```sql:count_up
update [indexT] set 
[indexNo] = ( case when CAST([UpdateDateTime] as DATE) = CAST(getdate() as DATE) then [indexNo] + 1 else 1 end ), 
[UpdateDateTime]= getdate();

insert into [indexT] ([indexNo], [UpdateDateTime]) 
select 1 as indexNo, getdate() as UpdateDateTime 
where NOT EXISTS (select 1 from indexT);

select [indexNo], [UpdateDateTime] from [indexT];
```
[php]  外部API呼び出しブラウザで見れるのにfile_get_contentsで呼ぶとWarningとなる 

*前置き*
---
外部APIを呼び出す実装を行う際に、用意されていたサーバーのモジュールがバラバラでcurlが使用できない条件だったので、file_get_contentsを使用し外部APIで呼び出すのにハマったのでメモ的に記載しておく。

環境は
php7.2 fuelphp1.8


*ハマりどこ*
---
ブラウザでたたくときちんとJSONコードが返ってくるが、file_get_contentsで呼び出すと、下記Warningが出てしまった。

>Fuel\Core\PhpErrorException [ Warning ]:
file_get_contents(http://hogehoge/auth/login): failed to open stream: HTTP request failed! HTTP/1.0 401 Unauthorized

*結果*
---
file_get_contents の第三引数に渡すコンテキストリソースを作成して渡すことで解決しました。

こんな感じです。

```ruby:qiita.rb
$url = 'http://hogehoge/auth/login';
$context = stream_context_create(array(
 'http' => array('ignore_errors' => true)
));
echo file_get_contents($url, false, $context);
```


参考にさせて頂いたサイト。ありがとうございます！
[Data API を PHP の file_get_contents で取得するときに注意した方がいいかもしれないこと](https://tinybeans.net/blog/2013/12/12-125027.html)
[[メモ] PHPのfile_get_contentsを、HTTPリクエストに使うときのTIPS](https://havelog.ayumusato.com/develop/php/e188-php_file_get_contents_tips.html)




*ちなみに...*
---
file_get_contents の頭に「@」を付けて「@file_get_contents」にすれば、Warning はでなくなったのですが、根本は解決しませんでした。
cp -r はコピー先ディレクトリが存在するかで動作が異なる

すごく基本的なことだと思うのですが
自分は知らなかった `cp -r` の動作についてです。

基本中の基本のディレクトリの再帰的コピー
---

あるディレクトリとその中にファイルを入れたとします:

```shell
mkdir /tmp/dir1 && touch /tmp/dir1/some.txt
```

ここでディレクトリ `dir1` 内には `some.txt` が生成されました。

次に、この `dir1` を `dir2` としていつものようにコピーします:

```shell
cp -r /tmp/dir1 /tmp/dir2 && ls -la /tmp/dir*
```

結果は予想通り、同じ構造をもったディレクトリ `dir1`, `dir2` ができました:

```:1回目
/tmp/dir1:
total 0
drwxr-xr-x   3 user  wheel   96 Feb 15 11:58 .
drwxrwxrwt  19 root  wheel  608 Feb 15 11:58 ..
-rw-r--r--   1 user  wheel    0 Feb 15 11:58 some.txt

/tmp/dir2:
total 0
drwxr-xr-x   3 user  wheel   96 Feb 15 11:58 .
drwxrwxrwt  19 root  wheel  608 Feb 15 11:58 ..
-rw-r--r--   1 user  wheel    0 Feb 15 11:58 some.txt
```

2 回目のコピー
---

ここで、更に先ほどのコピーのコマンドを実行します:

```shell
cp -r /tmp/dir1 /tmp/dir2 && ls -la /tmp/dir*
```

この結果は先程の結果とは異なり、
`dir2` 内に `dir1` が子としてコピーされています:

```:2回目
/tmp/dir1:
total 0
drwxr-xr-x   3 user  wheel   96 Feb 15 11:58 .
drwxrwxrwt  19 root  wheel  608 Feb 15 11:58 ..
-rw-r--r--   1 user  wheel    0 Feb 15 11:58 some.txt

/tmp/dir2:
total 0
drwxr-xr-x   4 user  wheel  128 Feb 15 11:58 .
drwxrwxrwt  19 root  wheel  608 Feb 15 11:58 ..
drwxr-xr-x   3 user  wheel   96 Feb 15 11:58 dir1
-rw-r--r--   1 user  wheel    0 Feb 15 11:58 some.txt
```

この動作の違いは
`cp -r` では最後に指定されたコピー先がディレクトリの場合、
指定したファイルをディレクトリ内に作成するようになっているためです。

そのため、コピー先が存在する場合は `cp -r` の動作は
コピー先が存在しない初回とは違う結果になるというわけです。

よくあるバッチをさっくり書いて定常的に動かしていると
いつのまにか意図しない結果になっているしれないので注意が必要ですね。

私は恥ずかしながらこの動作を知らず
冪等性のある操作だと思っていました……。
ずっと使ってきたのに。


いつも同じ動作にしたいときは？
---

`-T` (`--no-target-directory`) オプションを追加します。

このオプションを追加すると、
先程のようにコピー先のディレクトリが存在する場合でも
そのままディレクトリごとコピーされます:

```shell
cp -rT /tmp/dir1 /tmp/dir2 && ls -la /tmp/dir*
```

**※**
ただし、このオプションは **GNU 版の cp** にしかないと思われて、 
Mac や BSD の子孫の cp ではディレクトリを移動して差し替えか、
単に削除しておくということが必要そうです。
(実はいいやりかたがあれば教えてください)

以上、無知の知でした。
Re:VIEW 向け VSCode ユーザースニペット設定

Re:VIEW のチートシートを毎回見に行くつらみを回避するため、ユーザスニペット作りました。

# 使用方法
VSCode の ファイル → 基本設定 → ユーザスニペット → review.json にまるっとコピペ。

```json
{
	"image": {
        // 画像の挿入をするときに使う
        "prefix": "image",
        "body": [
            "//image[${1:file_name}][${2:caption}][scale=${3:1.0}]{\n//}"
        ],
        "description": "For Re:VIEW"
	},
	"indepimage":{
		// 採番なし画像の挿入に使う
		"prefix": "indepimage",
        "body": [
            "//indepimage[${1:file_name}][${2:caption}][scale=${3:1.0}]{\n//}"
        ],
        "description": "For Re:VIEW"
	},
	"quote": {
		// 引用するときに使う
		"prefix": "quote",
		"body": [
			"//quote{\n\n//}"
		],
		"description": "For Re:VIEW"
	},
	"br": {
		// 強制改行に使う
		"prefix": "br",
		"body": [
			"@<br>{}"
		],
		"description": "For Re:VIEW"
	},
	"bold": {
		// 太字に使う
		"prefix": "bold",
		"body": [
			"@<b>{${1}}"
		],
		"description": "For Re:VIEW"
	},
	"under": {
		// 下線に使う
		"prefix": "under",
		"body": [
			"@<u>{${1}}"
		],
		"description": "For Re:VIEW"
	},
	"italic": {
		// イタリックに使う
		"prefix": "italic",
		"body": [
			"@<i>{${1}}"
		],
		"description": "For Re:VIEW"
	},
	"delete": {
		// 取り消し線に使う
		"prefix": "delete",
		"body": [
			"@<del>{${1}}"
		],
		"description": "For Re:VIEW"
	},
	"link": {
		// URLに使う
		"prefix": "link",
		"body": [
			"@<href>{${1}}"
		],
		"description": "For Re:VIEW"
	},
	"img": {
		// 画像の引用に使う
		"prefix": "img",
		"body": [
			"@<img>{${1}}"
		],
		"description": "For Re:VIEW"
	},
	"code": {
		// 文中コードに使う
		"prefix": "code",
		"body": [
			"@<code>{${1}}"
		],
		"description": "For Re:VIEW"
	},
	"list": {
		// リストブロックに使う
		"prefix": "list",
		"body": [
			"//list[${1:label}][${2:title}]{\n\n//}"
		],
		"description": "For Re:VIEW"
	},
	"listnum": {
		// 行番号付きリストブロックに使う
		"prefix": "listnum",
		"body": [
			"//listnum[${1:label}][${2:title}]{\n\n//}"
		],
		"description": "For Re:VIEW"
	},
	"cmd": {
		// コマンドブロックに使う
		"prefix": "cmd",
		"body": [
			"//cmd{\n\n//}"
		],
		"description": "For Re:VIEW"
	},
	"footnote": {
		// 脚注に使う
		"prefix": "footnote",
		"body": [
			"//footnote[${1:label}][${2:body}]"
		],
		"description": "For Re:VIEW"
	},
	"fn": {
		// 脚注の引用に使う
		"prefix": "fn",
		"body": [
			"@<fn>{${1:label}}"
		],
		"description": "For Re:VIEW"
	},
	"comment": {
		// コメントに使う
		"prefix": "comment",
		"body": [
			"#@#${1:comment}"
		],
		"description": "For Re:VIEW"
	},
}
```

# 注意事項
`techbooster-doujin.sty`の使用を想定していますが、`@<del>{}`だけはうまく動かない可能性があります。`techbooster-doujin.sty`に下記の呪文を追加してください。

```
\usepackage{jumoline}
\renewcommand{\reviewstrike}[1]{\Midline{#1}}
```
reCAPTCHAを中央寄せしたい

# 初期では左寄せされる

Railsで実装したので
`= recaptcha_tags`をビューに記述するだけで表示されました。
しかし左寄せで表示されてしまい、不恰好なので中央寄せさせたいです。

<img width="498" alt="スクリーンショット 2019-02-15 14.05.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/331247/29b21671-efe4-155b-7128-f319427bddfa.png">

# CSSで中央寄せにする
検証ツールを使用してクラス g-recaptchaを持ったdivタグの下に配置されていることがわかったので、
そのクラスにCSSを当てる。
下記のコードで中央寄せすることが可能。
中央寄せとは関係ないがパスワードの入力フォームと近かった為、margin-topで離している。

```reCAPTCHA.css 
.g-recaptcha {
  margin-right:auto;
  margin-left:auto;
  text-align: center;
  width:300px;
  margin-top:20px;
}
```
# 最終的に
このように中央寄せすることができた！
<img width="527" alt="スクリーンショット 2019-02-15 14.16.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/331247/3da161d2-9fa4-ca74-779d-69001668d931.png">
gitコマンドを打つと、warning: unable to access '/.config/git/attributes': Permission deniedのエラー。

#gitコマンドを打つと、warning: unable to access '/.config/git/attributes': Permission denied

ターミナルを立ち上げて、gitコマンドを打つと、

```
$ git push origin create-tables
warning: unable to access '/Users/XXXXXXXXXXXXXXX/.config/git/attributes': Permission denied
```

```
$ git status
warning: unable to access '/Users/XXXXXXXXXXXXXXX/.config/git/ignore': Permission denied
```

##まずファイルの所有者を確認する。

```
ホームディレクトリへ移動
cd ~/
```

```
ファイルの所有者一覧を表示
ls -al
```

```
drwx------    3 root     96  2 14 17:39 .config
```

.configの部分がrootになっている。

root＝管理者

一般ユーザーじゃないのがおかしい。

多分ターミナルにブランチ名を表示させる時に色々といじったので、それが関係していたのかな、、と思う。

```
所有者を一般ユーザーに変更
sudo chown -R $(whoami) .config
```

すると警告が出なくなりました！

参考
https://stackoverflow.com/questions/27150926/unable-to-access-git-attributes/27151021#27151021

https://eng-entrance.com/linux-root
CloudWatchグラフ自動更新のカウントダウン表示

CloudWatchコンソールでメトリクスをグラフ表示していて気づいたので投稿

<img width="755" alt="update_setting.png" src="https://qiita-image-store.s3.amazonaws.com/0/51108/4a025add-6901-f526-adca-48340169e49a.png">

右上の更新ボタンから自動更新On/Offと更新間隔の指定ができますね。

で、このボタンの下の方に、青い線が見えますよね？
これがカウントダウンのゲージです。

<img width="81" alt="update1.png" src="https://qiita-image-store.s3.amazonaws.com/0/51108/3cc363b3-d73e-f442-27da-1ac843b4d384.png">

↑これが時間が経過するにつれて
↓こんな感じでゲージが減っていき、青線が消えるタイミングでグラフが更新されます。

<img width="78" alt="update2.png" src="https://qiita-image-store.s3.amazonaws.com/0/51108/72c72098-d364-368e-814c-3b26ccde8be0.png">

これ気づいてない人結構いるんじゃないかと思い投稿しました！
（AWSマネジメントコンソールのUIは頻繁に変わるので、いつまで残っているかはわかりません）
pythonでcsv dictを読み書きする方法

備忘録です．
辞書型配列の読込と書込です．
参考は[こちら](https://www.yoheim.net/blog.php?q=20171003)

CSVファイル読込の際には全ての値の型が保持されていないため，毎回データの型を指定する必要があることに注意．

```py
import csv # module
```

```py
def read_dict(file):
	with open(file, newline = "") as f:
		read_dict = csv.DictReader(f, delimiter=",", quotechar='"')
		ks = read_dict.fieldnames
		return_dict = {k: [] for k in ks}
		
		for row in read_dict:
			for k, v in row.items():
				return_dict[k].append(v) # notice the type of the value is always string.	

	return return_dict
```

```py
def write_csv(file, save_dict):
	save_row = {}

	with open(file,'w') as f:
		writer = csv.DictWriter(f, fieldnames=save_dict.keys(),delimiter=",",quotechar='"')
		writer.writeheader()

		k1 = list(save_dict.keys())[0]
		length = len(save_dict[k1])

		for i in range(length):
			for k, vs in save_dict.items():
				save_row[k] = vs[i]

			writer.writerow(save_row)
```
bashrcでLinux/Debian系サーバーのuser@hostnameの表示色を区別する

linux Debian系で実行しました。

~/.bashrcの編集です。

bashrcの使い方のようですが。

単純にraspberrypiの

pi@raspberrypi:~/ $

このUserとHost名前でpi raspberrypi ~ $　の箇所の色を変えました。

raspberrypi Model B+
OS = Stretch
で調べました。

[.bashrc]の60行目

if [ "＄color_prompt" = yes ]; then
    PS1='＄{debian_chroot:+($debian_chroot)}\[\033[0X;XXm\]\u@\h\[\033[00m\]:\[\033[0X;XXm\]\w \$\[\033[00m\] '

0X;XX 0X;XX
の箇所の編集で

user@hostname /dir $

user@hostname ここと
dir $ ここを
色の変更ができます。

[編集箇所]
[\033[0X;XXm\] から [\033[00m\] 

で、囲った範囲に適応されます。

0X;XX は色の割り当てです。

defaultでは数字の設定は

明るい緑 01;32 
明るい青 01;34
に、なっています。

00;32
00;34　にすると色が濃く(暗く)なります。

00;xx 暗い色
01;xx　明るい色

xxの数字を

黒：30
赤：31
緑：32
黄：33
青：34
マゼンダ：35
シアン：36
白：37

で編集した色で表示されます。

例えば
01;36 00;31
してやれば
user@hostname が明るいシアン色
dir $ が暗い赤になります。

少し考えれば全て色を変更できます。
user = pi　明るいシアン 01;36
@　白
hostname = raspberrypi　濃いシアン 00;36
:　白
dir $　赤 00;31

にして、他のマシンとraspberrypiサーバとの、区別をして分かりやすくしました。

RedHat系では/etc/DIR_COLORSとゆうファイルがあります。
そこで細かい設定でdirectoryの色やlsした時のファイルの表示色の変更が可能なようです。
GitHubのお勉強

素人が久しぶりに手を出します。

#GitHubでリポジトリを作成する 

「New Repository」ボタンを押下 「Repository name」web_kintai、「Description」とある会社のWeb勤怠魔改造スクリプト

`C:\Users\kenmi_000\Documents\GitHub>mkdir web_kintai`
`C:\Users\kenmi_000\Documents\GitHub>cd web_kintai`
`C:\Users\kenmi_000\Documents\GitHub\web_kintai>git init`
Initialized empty Git repository in C:/Users/kenmi_000/Documents/GitHub/web_kintai/.git/

#ファイルを追加する

`C:\Users\kenmi_000\Documents\GitHub\web_kintai>git add kenmituo_webkintai.user.js`

`C:\Users\kenmi_000\Documents\GitHub\web_kintai>git remote add origin https://github.com/kenmituo/web_kintai.git`

#ローカルリポジトリをプッシュしてリモートリポジトリへ反映させる（git push）
`C:\Users\kenmi_000\Documents\GitHub\web_kintai>git push -u origin master
fatal: unable to access 'https://github.com/kenmituo/web_kintai.git/': error:1407742E:SSL routines:SSL23_GET_SERVER_HELL
O:tlsv1 alert protocol version`


解決策があった https://kazusa-pg.com/installed-git-update/

最新版を入れたが、古いものが勝手には消えてくれない。コンパネからアンインストールする。
booked2.7.2から2.7.4へ

オープンソースの予約管理システムBookedのバージョンを2.7.2から2.7.4に変更するためのメモ
今後のバージョンアップのためにもちゃんと書く。
https://www.bookedscheduler.com/

ちなみにWindowsね

#　準備
##　ダウンロード
上記サイトのDownloadから最新版のzipをダウンロードする。Windowsサーバで展開する。
旧： "C:\Apache24\htdocs\booked"
新： "C:\Apache24\htdocs\booked274"
こんな構成にしておく。

#　導入
## httpd.confの加工
これが大本

```c:\Apache24\conf\httpd.conf
Alias /booked "C:/Apache24/htdocs/booked"
<Directory "C:/Apache24/htdocs/booked">
<RequireAny>
Require local
Require ip xxx.xxx.xxx.xxx
</RequireAny>
</Directory>
```
大雑把に動くやつを作って挿入

```c:\Apache24\conf\httpd.conf
Alias /booked274 "C:/Apache24/htdocs/booked274"
<Directory "C:/Apache24/htdocs/booked274">
        Order allow,deny
        Allow from all
</Directory>
```

##　config.phpを作る
config.dist.phpをリネームして作る。修正したところだけ抜粋

```C:\Apache24\htdocs\booked274\config\config.php
 */
$conf['settings']['default.timezone'] = 'Asia/Tokyo';      // look up here 

$conf['settings']['default.language'] = 'ja_jp';                // find your language in the lang directory
$conf['settings']['script.url'] = 'http://exsample.com/booked274/Web';   	// public URL to the Web directory of this instance. this is the URL that appears 

$conf['settings']['database']['name'] = 'booked';
```

ひとまずこれで検証できるようになった。

#追記smtpを設定した
「パスワードを忘れました」で検証するときは、登録してあるアドレスを指定しないと飛んでくれないのがハイライト

```$conf['settings']['phpmailer']['mailer'] = 'smtp';
$conf['settings']['phpmailer']['smtp.host'] = 'smtp.example.co.jp';
$conf['settings']['phpmailer']['smtp.port'] = '25';
$conf['settings']['phpmailer']['smtp.secure'] = '';
$conf['settings']['phpmailer']['smtp.auth'] = 'false';
$conf['settings']['phpmailer']['smtp.username'] = '';
$conf['settings']['phpmailer']['smtp.password'] = '';
$conf['settings']['phpmailer']['sendmail.path'] = '/usr/sbin/sendmail';
```
Windows MySQL　5.7.11から5.7.25でハマった

バージョンアップだから簡単だと高をくくってた。

バックアップをとっておく。

```backup.bat
mysqldump -a --user=root --password=hoge_pw --all-databases > all_databases.mysql
```

アンインストールせずにインストーラーを起動して進めると、既存のパスワードを入力するところで躓いた。何入れても入らない。

いろいろと試しているとコマンドプロンプトでmysqlにログオンできない。サービスも動かない。

どうにもならないので、MySQL Server5.7.25をremoveした。

#どこにいったMySQL 5.7.25
なぜかMySQL8.0しか現れない。

other releaseを選択する
![001.png](https://qiita-image-store.s3.amazonaws.com/0/17187/faf43446-5b12-6aa8-09d7-bac6a1410d49.png)

でた！
![002.png](https://qiita-image-store.s3.amazonaws.com/0/17187/b8238ab0-aa95-d905-74ed-161f91393735.png)

無事にインストール完了した。
![010.png](https://qiita-image-store.s3.amazonaws.com/0/17187/8472ec06-7d21-9d77-c737-66ab6e885688.png)

#リカバリ
実行してみる。

```
C:\Users\Administrator\Documents\mysql_backup>mysql -u root -p < all_databases.mysql
```
インポート完了後にrootでログイン、データベースが復元されているのを確認した。

#ワードプレスがつながらない
ブラウザでレイアウトは表示されるが、wordpressが「データベース接続確立エラー」を表示させている。

wp_userでログインを試す。
```
>mysql -u wp_user -p
```
パスワードが違うとなる。

phpMyAdminで変更を試すがエラーになった。


コマンドで対処する方法を見つけた。
```
mysql> SET PASSWORD FOR wp_user@localhost = PASSWORD('password');
ERROR 1133 (42000): Can't find any matching row in the user table

mysql> grant all on *.* to wp_user@localhost identified by 'password';
Query OK, 0 rows affected (0.00 sec) 

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> set PASSWORD for wp_user@localhost = PASSWORD('password');
Query OK, 0 rows affected, 1 warning (0.00 sec)
```

これで表示されるようになったー！
DataTableで独自フォームで検索する方法

自分用の覚書です。
DataTableに独自のフォームを設ける方法ですが、検索条件リセットボタンを設置した際に少しハマったのでメモ。

```example.js
jQuery(function($){
    $.fn.dataTable.ext.search.push(
        function( settings, data, dataIndex ) {
            var form = document.forms[0]; // １列目の値を取得
            var value = form.elements['フォームの名前'].value;

            if (value !== '' && data[0] !== value) { // 行の値と一致するか判定
                return false;
            }

            return true;
        }
    );
    // テーブル初期化
    var table = $("#テーブルのID").DataTable({
　　　　　　　　　　　　　　　　　・・・
        // 検索機能
        searching: true, // falseにすると独自の検索も反映されない
　　　　　　　　　　　　　　　　・・・
    });
    // フォーム切り替え時にテーブル更新
    $('form').on('change', function(event) {
        table.draw();
    });
    // 検索条件リセット
    $('#search_reset').click(function() {
        var form = document.forms[0];
        form.elements['purpose'].value = '';
        form.elements['area'].value = '';
        table.draw();
    });
});
```

```html:example.html
<form action="#">
        <select name="purpose">
            <option value="">Default</option>
　　　　　　　　　　　　　　　　　　　　　　　　<option value="Hoge">Hoge</option>
            <option value="Fuga">Fuga</option>
        </select>
        <input name="reset" id="search_reset" class="btn" type="reset" value="リセット">
</form>

<table border="1" id="portfolio-table-list">
    <thead>
        <tr>
            <th>検索する列</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Hoge</td>
            <td>Fuga</td>
        </tr>
    </tbody>
</table>
```

ポイントは`$('form').on('change', function(event))`でフォームの値が入れ替わった時にテーブルを再描画しているのですが、テーブルの再描画の時に`$.fn.dataTable.ext.search.push`が走って検索条件の値で絞り込みを行なっているんですが、`type=reset`のボタンが押された時は`$('form').on('change', function(event)`は走りませんので、クリックイベントを手動で追加しています。（これだったら`type=button`でもいいかも？）
Elixir~外部APIからQiita記事をWeb表示する~

#ここまでのあらまし

piacereさんの　[Excelから関数型言語マスター5回目：Webにグラフ表示](https://qiita.com/piacere_ex/items/290b76b76d5ff8e019bf)

までは、何度もコードを書いて動作確認してトライしていました。

今回、復習で3回目の連載からsample_dbを再度作成しようとやってみたのですが、何をやってもmix ecto.createでコケる、またはPhoenixが立ち上がらない。

Time Machineバックアップから5回目完了のsample_dbを引っ張ってきたので（こういう悪知恵は利く)、いいね!数を含めたWeb表示までのコードを確認してみようと思います。

# コードと解析

```elixir


<%
result = Json.get( "https://qiita.com", "/api/v2/items?query=elixir" )
data = result
columns = [ "id", "title", "created_at" ]
%>
<table border="1">
<tr>
  <%= for column <- columns do %>
  <th><%= column %></td>
  <% end %>
</tr>
<%= for record <- data do %>
<tr>
  <%= for column <- columns do %>
  <td><%= record[ column ] %></td>
  <% end %>
</tr>
<% end %>
</table>

```



[Excelから関数型言語マスター4回目：Webに外部APIデータ表示](https://qiita.com/piacere_ex/items/4c212615a4eb699dd109)

までの、下準備やsmallex導入は割愛します。

table~から始まるHTML部分は、連載のそれまでの部分と変えていないとのこと。
つまり、肝要なのは、Json.getでQiitaからelixirに関連ある記事を抜き出し、
それをid、タイトル、作成日時、いいね数を指定するだけでWeb表示してくれるということです！
HTMLにもあかるくないわたしは、trやtdタグについてもググってみたのですが、これは見出しに関わるところが大きいとわかり、だいぶ理解への負担が減りました。

<img width="1552" alt="Screen Shot 2019-02-15 at 13.39.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/306722/1b6a7383-cd22-3675-be5b-4eb279c79479.png">


本当は3回目のPJ作成に戻ってfor文などの構成もしっかり理解したいのですが、きょうはここまで。

うまずたゆまず、頑張ります。
Kento Mizuno
【連載】ジャンプ＆ランゲームを作ろう(1) プロジェクト作成

# はじめに
チャリ走風なジャンプ＆ランゲームを作ってみようという連載講座です

# プロジェクトを作成する
## EgretLauncherを起動する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/fd112269-bbeb-4555-f6fb-adc35915eb91.png)

## 新規プロジェクトを作成する
画面左の「New Project」を押してください。

PrjectNameに「JumpAndRun」

縦型のゲームにしたいのでRotation「Portrait」、Scale「FixedWidth」にしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/f57e0541-229e-4e3d-79a8-cc29c82627ab.png)

プロジェクト一覧に表示されているプロジェクトの右の「VS Code」アイコンを押してください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/3c56b40f-f289-11fa-6042-040844119f88.png)

## プロジェクトの動作を確認する

VS Codeを起動するとこのようにプロジェクトが作成されているはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/77579055-ccfa-f3bd-4510-76e0b90f51ec.png)

左のツールバーから「◎」デバッグアイコンを選択してください。
画面左上の「構成が選択されていません」選択リストをクリックして「構成を追加する」を選んでください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/fa218a28-8793-0069-b607-34ea816bc47d.png)

複数の構成が出てきますので「Egret Debugger」を選んでください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/3b894bf7-6bdf-4918-0b06-bd582cc89dfa.png)

デバッガー起動用のlaunch.jsonが追加されます
次に画面の左上の先ほど「構成が選択されていません」と表示されていた箇所が「Egret Debugger」となっていることを確認してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/3caad8fc-a55c-e696-850e-3a16cc4dadb1.png)

次に画面の左上の「Egret Debugger」左の緑色の三角のボタンを押すとデバッガーが起動され下記のように表示されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/5e3dc312-2ba9-e4ed-1e84-f2376106d9d8.png)

これでは横に表示されていますので、右クリックしてメニューを表示させ「検証」を選びデバイスを選択すると下記のように表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/fbce7cd5-99d0-8188-6990-a310ddaf21c7.png)
メモ：RailsのActionMailerでテキストメールを自動生成する

この記事は
===

* 技術メモです

やりたかったこと
===

* RailsのActionMailerを使ってメールを送信しているサービスがあります
* そこですでにHTMLメールを送信しているのですが、一部メーラでHTMLメールは受信できないという話がありました
* そこで全メールについてTEXTとのマルチパートメールで送出する必要がでてきました

普通にやると
===

* 既存のHTMLメールのテンプレートに加えて、TEXTメールのビューテンプレートも作成するとマルチパートで送信することが可能です
* しかし、TEXT/HTMLのビューテンプレートを両方メンテナンスしていくのは結構きついです

actionmailer-text gem
===

* [actionmailer-text](https://github.com/dblock/actionmailer-text)を使うと、自動的にHTMLメールからタグを除去していい感じにテキストメールを送出してくれます
* こんな感じっぽく動きます
    * ```<br/>```は改行に置換
    * リンクは```リンク文字列(URL)```みたいな感じに置換
    * そのほかの普通のタグは除去
    * [このへん](https://github.com/dblock/actionmailer-text/blob/master/lib/actionmailer-text/html_to_plain_text.rb#L27)を見るとなんか一生懸命正規表現で置換してるっぽい

使い方
===

* gemを入れます

```ruby:Gemfile
gem 'actionmailer-text'
```

* application_mailerに所定のモジュールをincludeします

```ruby:application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  # 追記
  include ActionMailer::Text
end
```

* ちなみにdeviseを使っている場合、deviseから送られるメールはApplicationMailerを継承していないことがあるので、devise設定ファイルで指定します

```ruby:config/initializers/devise.rb
config.parent_mailer = 'ApplicationMailer'
```

* 以上で普通に全てのメールがTEXTとHTMLのマルチパートメールになって送信されます

終わりに
===

* ガラケーとかのテキストしか受けられないメーラ爆発しろ
Nuitrackでフェイストラッキング設定

Nuitrackの設定ファイルは私の環境だと以下にあります。
C:\Program Files\Nuitrack\nuitrack\nuitrack\data\nuitrack.config

Nuitrackのインストールディレクトリのパスは、
環境に応じて適時読み替えてください。

オリジナルのファイルは残しておきたいので、
`nuitrack.config`を複製して`nuitrack_origin.config`とリネームしておきましょう。

## フェイスモジュールを有効にする

`Faces.ToUse`と`DepthProvider.Depth2ColorRegistration`を`true`に設定します。
具体的には`nuitrack.config`の下記2箇所を変更します。

```JSON
    "DepthProvider": {
        "Depth2ColorRegistration": true, 
    }
```
```JSON
    "Faces": {
        "ToUse": true
    }
```
Unityの場合、
以下のサンプルプロジェクトからフェイストラッキングを試すことができます。
http://download.3divi.com/Nuitrack/doc/UnityFaceTracking_page.html

取得できる顔情報を知りたい方は、以下のドキュメントを参考にしてください。
JSON形式で取得することができます。
http://download.3divi.com/Nuitrack/doc/Instance_based_API.html

※現在の実装ではユーザーのスケルトンが検出させた後でないと顔の情報を取得できないようです。
jQuery、jsの色々メモ(随時追加)

##.appendの使い方
`//$(row).appendTo('#modalSearchTable tbody');`

例えば  
$(A).append(B) とした場合にAにBが追加されるのに対して、
$(A).appendTo(B) ではBにAが追加される。

参考url:http://semooh.jp/jquery/api/manipulation/appendTo/content/ 日本語リファレンス

##『jQuery Toast plugin』の使い方(トーストの使い方)

例えばこういうやつ↓
参考url:https://kamranahmed.info/toast Jquery Toast Plugin
→俗にいう「通知バナー」のこと。
→画面の隅（主に右下）から現れる（ポップアップする）小さな長方形のメッセージ表示のこと。

####ajaxと組わせることで、画面をリロードさせることなく通知をすることができます。
```js:sample.js
function sendParameter(parameter){
  $.ajax({
        type: 'post',
        url: '繋げ先',
        data: {'parameter':parameter},
        cache : false,
        timeout: 20000
    }).done(function() {
    /* Jquery Toastによるメッセージ*/
      $.toast({
          heading: 'SampleMassage',             // 見出し
          text: '送信完了',                      // 表示したいテキスト(HTML使用可)
          showHideTransition: 'slide',	        // 表示・消去時の演出
          icon: 'info'                          // 事前定義された種類のトーストを指定するため
      })
//ここからは気にしない
    }).fail(function(XMLHttpRequest, textStatus, errorThrown) {
    //失敗時処理
  }).always(function(XMLHttpRequest, textStatus) {

  });
}
```
####※ajaxだと、何かしら値をサーバーに渡す必要がある。⇒特に値を渡さずに画面遷移なく通信するにはどうするか。
```sample1.js
function sendParameter(parameter){
	 fetch('url').then(function(response) {
		  if(response.ok) {
		    response.json().then(function(json) {
		      products = json;
		      //initialize();
		    }).then(function() {
			    /* Jquery Toastによるメッセージ*/
		        $.toast({
		            heading: Messages("テスト"),
		            text: Messages("おｋ"),
		            showHideTransition: 'slide',
		            icon: 'success'
		        })
		      });
		  } else {
		    console.log('Network request for products.json failed with response ' + response.status + ': ' + response.statusText);
		  }
		});
}

```
↑まぁajaxに適当な値を渡してサーバー側でその値を使わなければ別にいいんだけどね。。かっこわるいしさ。。


送信に成功したか、失敗したか画面遷移なく知れるので割と便利かも。。

##ダウンロードボタンを押下した時、確認メッセージ
```js:sample.js
    $("#ボタンタグのid").click(function(){
      if(confirm("出したいメッセージ")){
         return true;
       }else{
         return false;
       }
    });
```
##特定位置に要素を追加
```js:sample.js
$(document).ready(function(){
    $('dl:eq(2) > dt:eq(0)').after("<br>");//3番目の<dl>内の1番目の<dt>～</dt>の後ろに<br>を挿入する
    //他にbefore,prepend,appendがある
});
```
##改行幅をもう少し小さくしたい場合
```js:sample.js
//改行を入れたはいいけど、その行間がちょっとでかいなと思って何とかした方法(本来の用途ではない)
$(document).ready(function(){
    	    var li = $('<p style="font-size: 1pt">').text('');//これでちょうどデフォルト設定の行間の半分くらいになった。
    	    $('dl:eq(2) > dt:eq(0)').after(li);
});
```

jQuery promise()　async


## 要素の表示・非表示を切り替える方法
```js:sample.js

    // 表示するボタン
    $('#btn1').click(function() {
        $('#demo1').show();
    });

    // 隠すボタン
    $('#btn1').click(function() {
        $('#demo1').hide();
    });

//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//
    //※ちなみに、表示・非表示の切り替え ( toggle )
    $('#btn1').toggle();    //左は以下と同じ意味です。

    // .show()と.hide()を交互に実行する
    if($('#btn1').css('display') == 'none'){
        $('#btn1').show();
    } else {
        $('#btn1').hide();
    };

```

★jQueryで動的に追加した要素はクリックイベントが発火しない？いやそんなことはないぞ

結構躓いた案件↓
[参考URL](https://qiita.com/ayies128/items/5d044bc08b9308767f4c)
正規表現の確認が爆速になるregex101.com

プログラム書く時に正規表現を簡単にチェックしたいなぁというときありますよね。

そんな時にオンラインのツールを使う方いらっしゃると思います。
いろいろな正規表現チェックツール試してみましたが、regex101.comの圧勝だったので紹介したいと思います。

https://regex101.com/

言語設定に日本語がないため、日本ではあまり有名ではありません。
開発者に聞いたところ以下のページで翻訳を追加すると日本語対応してくれるそうです。
英語できる方みんなで一緒に日本語化しましょう! 
全部で1000行もないので一人数行でもやればすぐに終わるはずです!
英語できない方はぜひこの記事が、英語ができて協力的で優しいエンジニアに届く様にシェアしてください。

https://r101.cf/projects/regex101/www/

それではここから、regex101.comの素晴らしさを伝えていきたいと思います。

#regex101.comはここがすごい

## 1. 正規表現に一致した箇所をすぐにハイライトしてくれる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/43996/4bbdfcbd-a20d-53fd-27c3-1ae2fba74424.png)

## 2. マウスオーバーするとその正規表現の意味を教えてくれる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/43996/2cb6d7be-4596-8ad9-49ba-83c07a1d1603.png)

このようにマウスオーバーすると意味を表示してくれます。
キャプチャ置き換えをする場合に何番目かわからなくなる時あると思いますが、マウスオーバーするとそれも教えてくれます。

そのほかにもサイドバーに現在使用している正規表現の意味を一つずつ説明してくれるなど非常に親切な設計になっています。

## 3. クイックリファレンスが充実
あれっこういう時どう書くんだったっけ?という時にもサイドバーにあるクイックリファレンスからすぐに目的の正規表現を見つけることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/43996/0f96f2e9-8ca5-060e-6630-d6e3674ae06a.png)

## 4. ユニットテストがかける
複雑な正規表現を修正しておかしくなっていないか簡単にチェックしたい!そんな時にはユニットテストを保存して実行することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/43996/408d025e-4718-5a49-ee66-f1c63f3bd1f5.png)

## 5. 置き換えができる
置き換えの正規表現を書くと置き換え結果を表示してくれます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/43996/e3921e7d-3109-b4f6-47de-34adfe18fd1a.png)

ほかにも痒いところにてが届くようになっていて、自分でもこんな素晴らしいツールを作りたいと思う様な良いツールですので是非是非みなさんお試しください!
【WordPress】ウィジェットでショートコードを設置できるようにする

WordPressのウィジェットはショートコードを書いてもただの文字として認識されちゃう。
でも下記を記述するだけでショートコードとして認識してくれる。うれしい。

```ruby:fuction.php
add_filter('widget_text', 'do_shortcode' );
```

終わり
MySQLで長い文字列=TEXT型と安易に考えてはいけない

wysiwygエディタで入力したhtmlをデータベースに保存するというのはよくあるケースではないかと思います。
今回は、エディタを保存するフィールドを何も考えずTEXT型にしてしまうと、不具合になるかもよ！というお話です。

ある日のテストで、登録処理を通ったのにエディタに何も出てこない不具合を発見。

- ログにエラーは吐かれていない。
- エディタを外しても現象は再現する。
- 別所で同じエディタを使っている所は通るし、中身も出る。

phpから取ったsqlを投げてみると

```
error 1406 - Data too long for column
```
指定のフィールドを見てみると途中でエディタに入力した内容が途切れていました。
よくよく見ると、中身が出たデータも途中で切れています。

**根本的な原因**
TEXT型の最大値の量を超えたため。
[MySQL 5.6 リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/string-type-overview.html)には
>最大長が 65,535 (216 − 1) 文字の TEXT カラム。値にマルチバイト文字が含まれる場合、有効な最大長は少なくなります。各 TEXT 値は、値のバイト数を示す 2 バイト長のプリフィクスを使用して格納されます。

とあるので、日本語だと4万文字もあればキャパオーバーしそうです。

**なぜ真っ白に？**
入っているデータの出だしは以下の通り。

```
[{"craft":"<p>boss<\/p>\r\n","～
```
[json_encode](http://php.net/manual/ja/function.json-encode.php)されていますね。
途中で途切れた結果、閉じ括弧がなく[json_decode](http://php.net/manual/ja/function.json-decode.php)が出来なかったのでしょう。

**なぜ正常に通ってしまったのか**
SQLを抽出してMySQLで投げると通らないパターンがちょいちょいあります。大体NULL関係と文字長さで引っかかるんですが。。。
フレームワークによるものなのか何なのか、詳しい方是非ご教授お願いいたします。

**対策**
きちんと使用目的に合った型を宣言する事。
今回はどれだけの長さになるか想定できないので対象のフィールドをLONGTEXT型とし解決しました。
それだけでなくquery長(SQL文の文字数)にも制限があるので注意。
　詳しくは`max_allowed_packet`などで検索検索ゥ！
最大文字数に合わせて各input項目にバリデーションがあると尚良いかなと思います！

決してTEXT型に限ったお話でもないので、皆様もサイレント文字数カットによる不具合にお気をつけ下さい。:point_left::smiley_cat:
NuitrackでRealSense D435iの画面表示設定を変更する

Nuitrackの設定ファイルは私の環境だと以下にあります。
C:\Program Files\Nuitrack\nuitrack\nuitrack\data\nuitrack.config

Nuitrackのインストールディレクトリのパスは、
環境に応じて適時読み替えてください。

オリジナルのファイルは残しておきたいので、
`nuitrack.config`を複製して`nuitrack_origin.config`とリネームしておきましょう。

## 解像度とフレームレート

`RawWidth/RawHeight`でストリームの解像度を変更し、
`ProcessWidth/ProcessHeight`はその入力ストリームをリサイズすることができます。
`FPS`はフレームレートの変更です。

```JSON
    "RGB": {
        "RawWidth": 1920,
        "RawHeight": 1080,
        "ProcessWidth": 1920, 
        "ProcessHeight": 1080, 
        "FPS": 30
    }
```

Realsense2Module.Depthも同様のキーで変更できます。

## ポートレートモード（縦表示）とミラーモード

`RotateAngle`で回転。下のコードだと90度回転で縦長表示になります。180/270度もOKです。
`Mirror`で左右反転します。

```JSON
    "DepthProvider": {
        "RotateAngle": "90", 
        "Mirror": true
    }
```

`setConfigValue()`メソッドで変更することもできるようですが、こちらは未検証です。
AudioImporter で Force to mono は有効にしつつ、Normalize だけ無効にする

# Force to mono
Unity側で音源をモノラルに変換して、容量を削減してくれる設定
モバイルだとONにしたい。

インスペクタ上だと、この設定をONにすると、 `Normalize` というオプション設定が選択できるようになる。
これは音量を平均化してくれる機能ですが、音素材側で音量調整されているケースもあって、
「小さい音にしたかったのにやたら音量上がってない？」みたいなことになります。

なので、モノラル設定はONにしつつ、ノーマライズはOFFにしておきたい気持ちになりますね。

# インポート設定を自動化したい
手動でやるのはつらくなるので、
AudioImporter をスクリプトからいじってなんとかしたい。

が、AudioImpoter には、 `forceToMono` というパラメータはありますが、
`Normalize` に関するパラメータが公開されていませんでした。

# 結果
以下のようにやってやると、該当のパラメータを取得して書き換えることができました。

```csharp:AudioAssetPostProcessor
var audioImporter = assetImporter as AudioImporter;
var serializedObject = new SerializedObject(audioImporter);
var normalize = serializedObject.FindProperty("m_Normalize");
normalize.boolValue = false;
serializedObject.ApplyModifiedProperties();
```

## 参考
https://answers.unity.com/questions/1016473/how-to-disable-normalize-in-audioimporter.html
https://docs.unity3d.com/ScriptReference/EditorUtility.SetDirty.html
DockerがホストOSのディスクを圧迫するので、コンテナ再作成のついでにディスクスペースを空ける

開発中のアプリの動作確認でデータベースを頻繁に更新するため、docker-composeでmysqlのコンテナを作っては壊ししています。
手軽にデータベースを初期状態に戻せて便利なのですが、使っているとホストのディスク容量をあっという間に占領します。
データベース初期化のついでにディスクスペースも空けるようにシェルスクリプト化してしまいました。

# 前提・参考ページ
OS: CentOS Linux release 7.2.1511 (Core)
Docker: Docker version 1.13.1, build 8633870/1.13.1

[コチラの投稿](https://qiita.com/Manatee/items/58d0f98a15656ed65136)を~~お手本~~丸パクリして、docker-composeからmysqlコンテナを立ち上げています。
Dockerがディスクスペースを圧迫した時の対処法は、[コチラの投稿](https://qiita.com/shinespark/items/526b70b5f0b1ac643ba0)で知りました。

# 使用するコード
やっていることは
・コンテナの破棄・作成
・docker関連のファイル削除
くらいです

``` conductor.sh
#!/bin/bash

######################################################
# 環境を初期化します。
#  ・DBの初期化
#####################################################

echo "::Started::"
SPACE_S=`df -h | grep '/dev/mapper/centos-root' | awk '{print $5}' | awk -F'%' '{print $1}'`
if [ ${SPACE_S} -gt 85 ];
then
        echo "Exec space opener"
        sudo sh /root/space_opener.sh
fi

sh ./subcommands/initDB.sh &
sh ./subcommands/AnyOtherShellscripts.sh &
wait

echo "::Completed::"
df -h | grep "centos\-root"
```
・ディスク使用量が85%を超えたらスペースを空けるようにしています

``` /root/space_opener.sh
#!/bin/bash
echo "# 作業前 空き容量"
df -h

# rootユーザでなければ終了
if [[ "root" == $(whoami) ]];
then
        echo "# root user"
        docker system prune -f
        docker rmi -f $(sudo docker images -a | awk '/^[^R]/{print $3}')
else
        echo "# Not root user"
        exit 1
fi

echo "# 作業後 空き容量"
df -h
```

``` subcommands/initDB.sh
#!/bin/bash

docker-compose down
sleep 2s
docker-compose up -d
```


# 参考
先達の皆様のおかげで快適に使えております。
ありがとうございます。

- [docker-composeでMySQL5.7を起動して接続してみた](https://qiita.com/Manatee/items/58d0f98a15656ed65136)
- [Docker for Macを使っていたら50GB位ディスク容量を圧迫していたのでいろんなものを削除する](https://qiita.com/shinespark/items/526b70b5f0b1ac643ba0)
JPAのModelでメンバ変数を作る方法

当方、java歴一ヶ月未満の初心者です。
自分用の備忘録として残します。

---

## やりたかった事
tableからfindしてきたmodelのクラスに
カラムに存在しないフィールド名のパラメータを持たせたかった。
phpでは（あまりおすすめできないけど）そのまま変数宣言すれば普通に使えたので
javaでもできると思った。

## だめだった例
Hogeテーブルにnameカラムは無く
外部からとってきたり、動的にhogeで処理させたいような時

```
@Entity
public class hoge {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;
```

こうしたら

```
Caused by: java.sql.SQLException: Column 'name' not found.
```

怒られた。
PHPみたいに、nullで入ってたりはくれず
見るデータがないからダメらしい

## 解決法

`@Transient`アノテーションを使って、マッピング対象外にする。
本来は永続化対象外にする為のアノテーションらしいが
その影響でマッピング対象外になるらしい（違かったらすいません）

```
@Entity
public class hoge {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Transient
    private String name;
```
怒られなくなりました

---

javaを勉強していると
いかに自分がPHPで適当なコーディングしていたかがよく分かります。
以下の日程でご都合いかがでしょうかメーカー on Outlook

「便利すぎて震える」と声があがっている日時文字列整形ツールですが、
[以下の日程でご都合いかがでしょうかメーカー](https://shirasaka.tv/ikano/)

ビジネスで使う上ではOutlookが標準で、自分の予定を見ながら会議セットをする人も多いはずです。（はずです）
でもなんやかんやで、会議案内を使わずに複数候補だしてまず伺い立てることもあるはずです。（はずです。ない企業はGo Back。）

というわけで以前から使っていましたが、Outlook予定表で選択した時間帯をクリップボードにコピーしてくれるマクロを投下します。

Outlook予定表上で、対象の日時を選択して、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/202646/90c099db-a5ad-f184-03b5-2ef004d6bd01.png)

マクロ実行でこんな感じにコピーされます。
（マクロはショートカット登録しておくと便利です）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/202646/45d8ae14-4645-82e3-54b4-72ef50690b83.png)



```visualbasic
Sub ▼選択時間を文字列コピー()
    Dim l_calendar As Outlook.Folder
    Set l_calendar = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar)
    Dim l_appointments As Outlook.Items
    Set l_appointments = l_calendar.Items
    Dim objAppt As AppointmentItem
    Dim CB As New DataObject ' Microsoft Forms 2.0 Object Libraryを参照設定が必要。ないときはc:\Windows\System32\FM20.DLL
    Dim buf As String
        
    With ActiveExplorer.CurrentView
        ' 予定表Viewでない場合は終了
        If TypeName(ActiveWindow) <> "Explorer" Or .ViewType <> olCalendarView Then Exit Sub
        
        '予定表でアイテムを選択していたら終了
        If ActiveExplorer.Selection.Count > 0 Then Exit Sub
        
        If .SelectedStartTime <> .SelectedEndTime Then
            buf = Format(.SelectedStartTime, "m/d(aaa)  hh:nn") & " ～ " & Format(.SelectedEndTime, "hh:nn")
            CB.SetText buf        ''変数のデータをDataObjectに格納する
            CB.PutInClipboard     ''DataObjectのデータをクリップボードに格納する
        End If
    End With
End Sub
```

ご活用ください。
ローカル環境で、localStorageが使えるかの確認メモ

#localStorageが使える環境
ローカル環境で使えないのと、そのエラーハンドリングがうまくいかないことがあるので、以下のコードで調査したメモです。

```javascript

try{
	if (window.localStorage) {
		console.log('LS can use !');
	}else{
		_c_('LS cannot use 1');
	}
} catch(e) {
	_c_('LS cannot use 2');
}

```

##結果
| 環境 | ブラウザ | 結果 |
|:---|:---|:---|
| ローカルファイル（file:///C:/） | Win10 Edge | LS cannot use 2 |
| ローカルファイル（file:///C:/） | Win10 IE11 | LS cannot use 1 |
| ローカルファイル（file:///C:/） | Win10 Chrome | LS can use ! |
| ネットワークフォルダ（\\server-name\） | Win10 Edge | LS can use ! |
| ネットワークフォルダ（\\server-name\） | Win10 IE11 | LS can use ! |
| ネットワークフォルダ（\\server-name\） | Win10 Chrome | LS can use ! |
| サーバー（http://） | Win10 Edge | LS can use ! |
| サーバー（http://） | Win10 IE11 | LS can use ! |
| サーバー（http://） | Win10 Chrome | LS can use ! |


##使用可否の判別コードについて
Edgeでローカルファイルを開いたときは、try ～ catch でないと判別できず、エラーで止まります。
pythonで配列のコピーを渡す方法

備忘録です．

####追記

コメントをいただきました．
深い構造の配列でこのタイプの渡し方をすると下層にある値は変化してしまうため，copy.deepcopy()という関数を使うべきだというコメントをいただきました．

-------------

関数に配列を渡すときに参照渡しになっていると困るときがあったので．
配列のあとに[:]をつけると値渡しになります．

```py
def hoge(arr):
	arr[0] += 1

arr_ref = [0, 1]
arr_val = [0, 1]

hoge(arr_ref)
hoge(arr_val[:])

print(arr_ref)
print(arr_val)
```

出力結果

```py
[1, 1]
[0, 1]
```

確かに２つ目の配列が値渡しになっています．
Numpyと画像とガンマと速度

# TL;DR

ファイルに保存された画像データには、ほとんどの場合、ガンマがかかっている。印刷系なら1.8。動画系なら2.2。sRGBならガンマっぽいけれど実はガンマではない、ガンマ2.2に近い処理がされている。

これを元に戻す処理がデガンマ。デガンマしないと、`cv2.blur`とかで色がおかしくなる。

ガンマのかかったデータがチャンネル当たり8ビットなら、デガンマ後は16ビットで扱う。でないと元のデータが失われ、露骨なトーンジャンプが発生する。

デガンマしたままでデータを引き回すのがリニアワークフロー。データ量は2倍になるが、ガンマ・デガンマは重い処理の上に、ガンマがかかっているかどうか＆ガンマはいくつなのかを間違えることがある。「入り口でデガンマ、出口でガンマ」と決め打ちするメリットは大きい。昔はメモリが足りなかったので、データ量2倍はきつかったのだ。

ガンマの発祥はCRTの特性云々という話があるが、ガンマは人間の知覚に沿った圧縮手法と考えたほうがいい。物理現象（混色）はリニア、知覚はガンマなのだ。

リニアワークフローを貫徹できればいいのだが、時として、16ビットでは困る場合に出くわす。ライブラリが8ビット＆ガンマ前提だったり、速度が欲しかったり。

そのときに愚直に1.8や2.2でガンマする必要があるかどうか考えると、速度がかなり違ってくるかもしれない。

# `np.power`は`np.sqrt`の6倍くらい遅い

```python
%timeit a = np.sqrt(np.arange(1,1000).astype(np.float))
5.89 µs ± 17.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit a = np.power(np.arange(1,1000).astype(np.float), 0.5)
33.1 µs ± 16.9 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
```
2でガンマすることにして、np.power(x, 0.5)をnp.sqrtに置き換えると、だいぶ速くなる。

# 追記

人間の知覚に近いガンマは~~3だが、~~（[2.4弱だった](https://en.wikipedia.org/wiki/Lightness)）`np.cbrt`はなぜか`np.power`より遅い。

```python
%timeit a = np.cbrt(np.arange(1,1000).astype(np.float))
48.9 µs ± 96.3 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit a = np.power(np.arange(1,1000).astype(np.float), 1/3)
32.1 µs ± 39.8 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
```

# 追記2

16ビット→8ビットのLUTは64KBなので、普通のCPUのL1データキャッシュ（Ryzenで32KB）には乗らない。だから平方根を計算するほうが速いだろう、と思い込んでいたが、Pythonではそうでもなかった。

```python
def np_linear16_to_gamma8(img16):
    g = np.zeros(img16.shape, np.uint8)
    less = img16 <= 64
    g[less] = (img16[less] / 8).astype(np.uint8)
    g[~less] = np.sqrt(img16[~less]).astype(np.uint8)
    return g


def cv2_linear16_to_gamma8(img16):
    g = np.zeros(img16.shape, np.uint8)
    less = img16 <= 64
    g[less] = (img16[less] / 8).astype(np.uint8)
    g[~less] = cv2.sqrt(img16[~less].astype(np.float))[:,0].astype(np.uint8)
    return g

_L16_G8_TABLE = np_linear16_to_gamma8(np.arange(65536))

img16 = np.arange(10000,dtype=np.uint16).reshape(100,100)

%timeit a = cv2_linear16_to_gamma8(img16)
69.4 µs ± 259 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit a = np_linear16_to_gamma8(img16)
93.9 µs ± 356 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit a=_L16_G8_TABLE[img16]
46.2 µs ± 743 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
```

`np.sqrt`が遅い。`cv2.sqrt`はfloat32とfloat64しか食わないので、uint16からfloat32に型変換するペナルティがあるのに、それでも`np.sqrt`より速い。

uint16決め打ちの平方根関数を、コンパイラで最適化が効くように書けば、おそらくLUTよりも速いと思うが、現状のPythonではLUTが一番速いという結論になった。

#追記3

デガンマ側も。`np.power`よりも`cv2.pow`のほうが6倍くらい速い。

```python
fimg = np.arange(65536).reshape(256, 256) / 65535

%timeit a = cv2.pow(fimg, 1.8)
298 µs ± 1.27 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit a = np.power(fimg, 1.8)
1.84 ms ± 5.83 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
```

ちなみに`cv2.pow`は1次元のndarrayを食わせると2次元にして返すので要注意。

# 追記4

なぜ`cv2.sqrt`はこんなに速いのかと思って調べたら、x64のSIMD命令に平方根を求める命令があった。おそらくOpenCVは、Intel IPPを通じてこの命令を使っている。[ストリーミング SIMD 拡張命令の算術演算](ストリーミング SIMD 拡張命令の算術演算)

これではuint16決め打ちの平方根関数など書いても太刀打ちできない。
Elixir~Streamをシンセサイザーになぞらえて~

#ここまでのあらまし
前回、[Elixir~Enum.zipでドラムシーケンサー！~](https://qiita.com/kmizuno0211/items/85b0a8095f38009a9759)
でドラムパターンを作ったが、今度はStream関数をシンセサイザーになぞらえることになりました。


#式と解説

```elixir

1..100 |> Stream.map (& (&1 * 2)) |> Enum.filter(& &1 >= 10 and &1 < 100)

```

1..100は1から100のリストの短縮系です。これにパイプライン演算子でStream関数をかけています。
Stream.mapで1から100のマップの数字すべてに2をかけているようです。
そしてEnum.filterで、10以上、100未満の結果を出力する。

#シンセサイザーになぞらえてみよう

シンセサイザーというのは、もともとの波形をオシレーターで出力し、それにフィルターをかけ、LFOで各種周期をかけて音を揺らして音色を生成します。

1..100は純然たるオシレーターでしょう。サイン波かスクエア波かノコギリ波かでいえば、さしあたり一番シンプルなサイン波でしょうか。
Stream.mapで2をかけているところは音色の立ち上がり、減衰などを司るADSRというセクションに酷似しています。気になる方は"シンセ ADSR"でググってみてください。
そして、Enum.filterは文字通りフィルター。シンセサイザーではカットする周波数帯にピークをつけるレゾナンス機能とあわせてローパスフィルターでオシレーターの波形を加工するのが一般的です。

現時点ではめちゃくちゃわかりにくいかもしれませんが、Elixirでシンセサイザーをつくる、というのがわたしの中長期的なミッションです。
うまずたゆまず、頑張ります。
Kento Mizuno
python：現在のパスとその中のファイル一覧取得及びファイルの存在有無の確認

備忘録です．

pythonで現在のパスとそのパス内にあるファイルの取得方法です．

```py
import os

print(os.getcwd()) # can see the path to the current working directory.
print(os.listdir(os.getcwd())) # can see the list of the files in the current working directory.
```

その他にあるファイルが存在するか否かを見るためには[この記事](https://qiita.com/tortuepin/items/4a0669d8f275e966229e)が参考になります．

```py
import os

os.path.exists(path)
os.path.isfile(path)
os.path.isdir(path)
```
2019年2月のApple Developerのポリシー変更（Apple  IDの2ファクタ認証が必須になる件ほか）

2月14日にApple Developerサポートからこんなメールが飛んできました。
見逃している方もいらっしゃるかと思ってシェアいたします。
**2月27日から、Apple Developerで使っている Apple IDの2ファクタ認証が必須になる**とのことです。

>Dear XXXX,
>
>In an effort to keep your account more secure, two-factor authentication will be required to sign in to your Apple Developer account and Certificates, Identifiers & Profiles starting February 27, 2019. 
>This extra layer of security for your Apple ID helps ensure that you're the only person who can access your account. 
>If you haven't already enabled two-factor authentication for your Apple ID, please learn more and update your security settings.
>
>If you have any questions, contact us.
>
>Best regards,
>Apple Developer Relations

ということで、早めに設定しておかないと、慌てることになりそうです。

また、**Apple DeveloperとApp Store Connectのメンバーおよびロールが統合される**とのこと。
https://developer.apple.com/support/teams/

こちらは2月12日から開始されているそうです。
Amazon Linux EBSサイズ拡張手順


「Amazon Linux 2 AMI」限定で、EBS拡張手順のメモです。EBSは１つのみアタッチしている前提。

公式Documentは、下記参照

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-modify-volume.html

- AWS Management Console -> EC2 -> EBS
  - 対象のEBS Volumeを選択、Modify
  - ご希望のSizeを指定
- SSHでEC2に接続
  - `lsblk` で状態確認
  - `sudo growpart /dev/nvme0n1 1` でパーティション拡張
  - `lsblk` で状態確認
- Reboot後、`df -h`で、ディスク認識されている事を確認。
  - `sudo xfs_growfs -d /` を実行すれば、rebootしなくても良さげだが、念のためRebootで反映。
AWS初心者が3ヶ月で出来るようになったこと

業務でAWS使うことになったので、成果をまとめてみました。
# 開始時の状況
オンプレの新規システム構築経験あり。
AWSの実務経験：実務経験なし。ハンズオンで触った程度。

# やったこと・出来るようになったこと 
## Route 53 
ドメイン管理 
DNSレコード登録  

## Certificate Manager 
ACM証明書の無料証明書適用 
	
## VPC 
VPC作成  
  無計画に/24で切ると、IPアドレス不足で作り直す羽目になるので注意。大きめに切ろう。

サブネット設計  
 public/private分離  

## EC2 
### イメージ 
AMIの作成、インスタンスへの複製、

### ネットワーク＆セキュリティ 
セキュリティグループ設計
ElascticIP管理/リソース上限の追加

### ロードバランシング 
ALB作成
SSL証明書適用

### RDS
新規作成、起動停止

## AWS認定試験
Cloud Practitonerの合格 
https://qiita.com/matsuda-hiroki/items/8a4565b7f38ecaf4d587
# やりたかったけど出来なかったこと 
CloudFront 
ECS
CI/CDの自動化 
# 感想 
オンプレと同じよう構成で構築することが出来た。 
AWS特有の構成で作れなかった。  
また、コスト面でももっと削減できそう(特にEC2)
streamを学んだ（ListをMap<Integer,List>に変換したい）

# List<xxx>形式のデータをMap<yyy,List<xxx>>形式に変換する
今まで愚直にfor使っていたので、メモ。

DBから取得した、リスト形式のデータを
フィルタリングした上で、Map形式に変換したい（そのほうがjspで表示するときに楽だった）なと思った時に使った。

```java
List<myClass> resList = myClassDao.query(insMap);

// フィルタリング
List<myClass> dataList = resList.stream()
        .filter(c -> c.getHogeId() != null)
        .collect(Collectors.toList());

// Mapに変換
Map<Integer, List<myClass>> res = dataList.stream().collect(
        Collectors.groupingBy(myClass::getHogeId)
);
```

これで、こんな感じのデータが

```json
[
    {
        id:1,
        hogeId:1,
        data:"a"
    },
    {
        id:2,
        hogeId:1,
        data:"b"
    },
    {
        id:3,
        hogeId:2,
        data:"c"
    },
    {
        id:4,
        hogeId:null,
        data:"d"
    }
]
```

こうなります。多分。

```json
{
    1:[
        {
            id:1,
            hogeId:1,
            data:"a"
        },
        {
            id:2,
            hogeId:1,
            data:"b"
        }
    ],
    2:[
        {
            id:3,
            hogeId:2,
            data:"c"
        }
    ]
}
```

もっといいやり方があればぜひ教えてください！
ペアプロを受けたことがない新人は人生を少し損している(かも). -実践編

#はじめに
初めてペアプログラミングをメンターにしてもらい,大変勉強になったのでそのまとめです.

以前からペアプログラミングには興味があったが,機会がなく..:persevere:
そうして月日が流れ3カ月が過ぎました.が今回機会があり試すことになりました.:blush:

これらの記事が興味を持つきっかけでした.(重複した内容を今回書くけど,自分の経験したメモなので.)
[新人エンジニアの私が圧倒的成長するためにやっていること](https://qiita.com/_kanacan_/items/d9d99e5bb0248584a6c5)
[ペアプログラミングして気がついた新人プログラマの成長を加速する３つの習慣](https://qiita.com/KakkiiiiKyg/items/2d0920416a0e0187810d)

#Who am i
新人プログラマ応援タグをつけた自分は社会人4年目となります. (大学院も行ったので+2年)
入社して3年半(半年は研修みたいなもの)は,FileMakerというノーコーディングなプラットフォームでコンサル-開発-導入と幅広く仕事をしました.ノーコーディングと言っても,javascript,phpなども書くことができるのでコーディングしたことないという訳ではないです.
去年の10月からweb系の部署に移動となりました.いきなり既存システムをvueで書き換えるという業務をメンター含むメンバで対応したことにより,簡単なものなら(Firebaseあれば)作れるかなぁというのが現状になります.:neutral_face:

#ペアプログラミング
参考パスを参照でお願いします.wikiを見ると開発とテストについて書かれているけど,
今回は自分で分からない(動かない)ところを一緒に自分が操作,メンターが質問をする形式で問題を解決するという感じです.

##経緯
アプリケーションのバージョンアップでグラフィックライブラリを軽量なものに変更することになり調査を行い.それぞれのライブラリでやりたいことはできるところまでは確認したが, vue-typescriptの構成で書くとエラー出ないけど..グラフも出るけど,オプションがでない..
ここで折角なので,ペアプログラミングをお願いすることにしました.(ちなみにメンターは15年目?くらいのシニアエンジニアだけど,理学修士でそっち系の話はあいます.)


##事前にやったこと
- 公式docを読む
- GitHubを読む
- 参考にしたものはまとめておく.

ここまでやるとGitHub上でのissueから昔のバージョンではできなかったのかぁー
そういう要望で変わっていったのかぁー,という豆知識までつきました.:smirk:
ここまでやらなくても,__調べて分かること__は網羅してまとめておけばいいかと思います.(その判断も難しいですが.)

##ペアプロで学んだこと
最初は,今までの経緯,やったこと,ソースを全て説明しました.(メンターはグラフの部分は全くノータッチなので)
その後,ドキュメントやソースを見ながら進めました.ナドナドやるうちにゴールしましたが,時間は1時間程度でした.

####point1.ライブラリのソースを見る
ライブラリというと,なんか難しいことをやっているんだろうなぁ..
見ても分からないだろうなぁ..
ということで見たことなかったけど,ソースを見るのが手っ取り早いと感じました.

####point2.細かいところまで徹底して調べる
全く今まで気にしたことがないところまでよく見ていました.
extendという機能がある場合はこれはjavascriptなのか,vueなのか,ライブラリなのか分からないことは調べ尽くす.

####point3.問題の細分化
当たり前ですが,結果できるできないだけでなく__ここまでは__できる.という分割がかなり細かいものでした.
TypeScriptで無理ならJavaScriptで書いてみる.なども行い徹底してました.

#まとめ
コードレビューを受けたことはありましたが,__〇〇したほうがいい__という断片的な知識で止まることは多かったです.
今回で特に__調べかた__の知識が深まったと思います.また,事前調査もメンターに伝えるために念入りになるため知識がつきます.お客さん(知らない人)に分かるように伝えるために思考する機会も減ったので..いい予防練習かなと思います.:smiley:

注意点は,__理解のない会社だと,2人で同じことをやっているとみなされる(全員が同じ能力な訳ないのに..)のでほどほどに.__
個人的に以下のポイントも大切かなと思いました.

- 全くの新人だとメンターの時間の無駄が大きく,効率が悪い.
- 配属後3-6カ月後の少しコーディングができる程度だと次のステップアップにちょうど良い. 
- 定期的に続けることで,幅が広がると思う(1カ月に2回,1時間くらいは使いたい.) 

今回試みて得たことが大きく,4年目だと新人の教育なども少しは担当したことがあり,やっておけばよかったと思い.
反省してます..反省を胸に今後の育成に努めたいと思います.

もし,ペアプロや教育にかかわる記事で読むべきものがあれば教えてください.
ありがとうございました!!!
Nexus7(2013）に TWRP で Android 9.0.0(Pie) をインストール後、Open GApps の error70 を回避する方法


原因：インストール作業領域のシステムパーティションが容量フルで空きが無いため[（英文詳細）](https://forum.xda-developers.com/nexus-7-2013/development/rom-t3569067)。
対策：初回にパーティションリサイズツール [sysrepart_1280_120.zip](https://drive.google.com/open?id=0By6p5AdQfavBUlhsLWFHZThGTnM) で変更する。

インストールの順番（参考）

```bash:
adb push sysrepart_1280_120.zip /sdcard/
adb push AospExtended-v6.2-deb-20190208-1518-UNOFFICIAL.zip /sdcard/
adb push open_gapps-arm-9.0-nano-20190209.zip /sdcard/
```
上記作業は、[Nexus7(2013年モデル）にAndroid 9.0.0(Pie)をインストールしよう](https://koulog.sakura.ne.jp/3504.html)のサイトが参考になる。
SpringBoot アプリをサービスとして動かす方法

# 概要
1. Fully Executable Jarの作成
1. confファイルの作成
1. サービス登録

# 1. Fully Executable Jarの作成
Fully Executable Jarという形式のJarにするとJarの先頭にスクリプトをつけて出力してくれる。
このスクリプトがそのままサービス起動用のスクリプトとして使用できる。

作成の仕方は、pom.xmlの`<build>`タグの中身を次のようにする

```pom.xml
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
            </configuration>
        </plugin>
    </plugins>
</build>
```

`<executable>true</executable>`がキモ

# 2. confファイルの作成
実行するJarファイルと同名で拡張子だけ`.conf`に変えたファイルを作成する。
内容は環境変数の定義とjavaに渡すオプションとjarに渡す実行時引数。

### 環境変数は普通に`export`

```例
export LANG="ja_JP.UTF8"
```

### javaのオプションは`JAVA_OPTS`

```例
JAVA_OPTS="-Xms1024M -Xmx1024M"
```

### 実行時引数は`RUN_ARGS`

```例
RUN_ARGS="--spring.profiles.active=production"
```

# サービス登録
CentOS7などのsystemdでは`/etc/systemd/system/`にserviceファイルを作成すればOK

```/etc/systemd/system/hoge.service
[Unit]
Description = <サービスの説明>

[Service]
ExecStart = /home/application/hoge.jar
Restart = always
Type = simple
User = application
Group = application
SuccessExitStatus = 143

[Install]
WantedBy = multi-user.target
```

これで

```
$ sudo systemctl start hoge
```
とかができる