OmniAICreator/Qiita-1.07M huggingface dataset:
C言語で色付きログを出力したくなった時のために

コンソールに引き籠もっている時に、色気が欲しくなった場合に備えてgithubにコードをあげておく。

# 何ができるのか
console（ターミナルソフト）で色付きのログを出すことができる。（ただし、１６色まで）
mac,cygwinで動作確認済み。多分linuxでも動くはず。

# とりあえず、使い方

git hubに上げてあるので以下で取得

```
$ git clone https://github.com/tksmiura/color_log
```

使うのはcolor_log.hとcolor_log.cのみ、
適当に自分のプロジェクトに取り込んで下さい。
サンプルのビルド方法は、

```
$ gcc -o test test.c
$ gcc -o test2 test2.c color_log.c
```

色をつけるエスケープシーケンスをマクロ（文字列）にしているので、色付きの出力はこんな感じでできます。

```c:
#inclue "color_log.h"

    printf(COLOR_FG_LRED "COLOR_FG_LRED" COLOR_RESET "\n");
...
```

testを実行すると色の一覧が出ます。
<img width="718" alt="test.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79353/54095839-8a79-b597-e3e5-734740c301f7.png">

関数とマクロを使って以下のようにすることも可能

```c:
    log_printf(LOG_LEVEL_INFO, "[this is info]");
    
    WARN_LOG("WARN_LOG log.....\n");
```

こちらは、

* コンソール以外では、エスケープシーケンスが出ないように制御(isatty())
* コンソールの場合、コンソールの幅でカットすることで１行以上にならないようにする（ASCII文字以外非対応、ioctl ）

ということをやっています。

test2がサンプルです。```| cat```でパイプすると色が出ません。(ただし、emacsのシェルでは上手く動作せず、、、orz)

<img width="762" alt="test2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79353/6842567d-4ade-c60c-e415-5836ff0eec46.png">

#参考

https://www.serendip.ws/archives/4635
https://www.mm2d.net/main/prog/c/console-02.html
https://qiita.com/hidetzu/items/2978f63e6d9b1848d8fe

# 課題

できればemacsに引き籠もって一歩も外に出たくない
CodeAnywhereやGoorm IDE、PaizaCloudの上では、dockerdを動かせない

ハンズオンのために、以下の条件を満たすCloud IDEが欲しかった。

- クレジットカードの登録が不要
- 無料で最低3時間使える
- 使うまでの審査が10分程度で終わる
- Go 1.13が動作する
- Dockerをインストールでき、利用できる

Docker 19.03がRootlessで起動できることを知り、CodeAnywhereやGoorm IDE、PaizaCloudで試してみた。

- https://medium.com/nttlabs/docker-1903-5155754ff8ac
- https://qiita.com/inductor/items/75db0c1c0d49646dd68a

結果としては、rootlesskitのエラーに見舞われて失敗に終わった。

```
[rootlesskit:parent] error: failed to start the child: fork/exec /proc/self/exe: operation not permitted
```

rootlessでない、dockerdについてはsocketが開けなくて断念した。
知っているとちょっと便利だけど以外に知らないJava Stringクラスのメソッドたち

この記事ではJava11のStringクラスのメソッドで便利だけど意外と知られていないものを独断と偏見でまとめてみます。より短く、良いコードを目指して、我々にとって馴染みの深いクラスを一度立ち止まって復習していきましょう。

# 空白削除
業務系のコードを書くときに文字列の前後の空白を削除したいという場面は、何百回と遭遇します。
そのときに、よく使うメソッドはtrimメソッドですよね。

```java
"   aaa   ".trim(); // aaa
```

しかし、trimメソッドの場合、全角スペースは削除対象外です。
全角スペースを含めて削除したいときに役に立つのが、stripメソッドです。
stripメソッドは前後の全角スペースを含む空白文字を削除してくれます。

```java
"   aaa   ".strip(); // aaa
"　   aaa   ".strip(); // aaa
```

さらに、先頭だけの文字列を削除したい場合には「stripLeading」を。後続だけを削除したい場合には「stripTrailing」を使用することができます。

# 文字繰り返し
文字列の桁数チェックのテストコードを書くときによく以下のような感じソースコードを書いていませんか？

```java
lengthCheck("aaaaa");
```
5桁ぐらいのチェックでしたら、問題ありませんが120桁とか長くなると面倒だし何よりも汚いですよね。
そんなときに、役に立つのが「repeat」メソッドです。

```java
"a".repeat(5); // aaaaa
```

指定の文字列を繰り返すことができる便利なメソッドです。文字列の長さをrepeatの引数で管理できるため、
桁数チェック系のテストコードで積極的に使用して明確にわかりやすくしていきましょう。

# CSV作成のときに便利
業務アプリを作成しているとCSVファイルを作成して他のシステムに連携などは、よくあるかと思います。
そんなときに知りたいメソッドが「join」メソッドです。このメソッドを使用することでカンマ区切りの文字列が
簡単に作れるようになります。

```java
String.join(",", "a","b","c"); // a,b,c
```

もちろん配列に格納された文字も区切り文字を含めた文字列にすることができます。

```java
String[] a = {"a","b","c"};
String.join(",", a);  // a,b,c
```

# equalsで文字列比較をしたくない人達に
文字列の比較をするときにJavaでは当たり前に使われているequalsメソッドです。
しかし、これ以外にもStringの標準メソッドを使って文字列比較をすることができます。

```java
String t = new String("a");
String s = new String("a");
    
t == s // false
t.intern() == s.intern() // true

```
JavaDocを見ると、internでtrueになるケースは、t.equals(s)と同じとわかります。
他の言語を学んでいて、equalsに慣れない人は使うといいかもしれません。
（仕事で使う人はあまり見かけませんが）

# ApacheのStringUtilsが使えない時の空文字判定
厳しい現場になるとOSSが使えず、StringUtilsが使えないケースがあります。
そんなときに知っておきたいのがisBlankメソッドです。
String標準メソッドで空文字の判定ができます。

```java
String s = "";     // 空文字
String t = " ";    // 半角スペース
String r = "　";   // 全角スペース
String i = null;   // null
    
s.isBlank(); // true
t.isBlank(); // true
r.isBlank(); // ture
i.isBlank(); // true
```
注意が必要なんですが、nullの時はnullpointerexceptionになります。（当たり前ですが）
ちなみに、isEmptyはlengthが0の時のみtrueとなりますので用途が違います。

# まとめ
意外と便利だし小回りがきくメソッドが多いですよね。一度、JavaDocを見直しておくと、あなたの悩みが解決することがあるかも。
（今後も、便利な使い方を見つけたら徐々にこの記事に掲載していく予定です。）

# 参考資料
[String](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/String.html)
初めての投稿

#テスト
##テスト

情報発信のファーストインプレッション

>**今は何も思いつかない**
---

| Left align       |       Right align |    Center align    |
|:-----------------|------------------:|:------------------:|
| This             |              This |        This        |
| column           |            column |       column       |
| will             |              will |        will        |
| be               |                be |         be         |
| left             |             right |       center       |
| aligned          |           aligned |      aligned       |
Vue.jsにおけるcomputedとmethodsの違い

#computed（算出プロパティ）とは
「算出プロパティ」とは任意に処理を含めることのできるデータのことです。
Mustacheやディレクティブの値にはJavaScriptが使用できますが、やたらに式を書き込んでしまえばテンプレートの見通しが悪くなってしまいます。算出プロパティに書き換えることでテンプレートの可読性を保つことができます。
引用元：[基礎から学ぶ Vue.js](https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6-Vue-js-mio/dp/4863542453/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=vue&qid=1570350462&sr=8-3)　p120

#methodsとは
methodsは、このアプリケーションで使用するメソッドです。コードを管理しやすくするために処理を分けたり、イベントハンドラなど細かな実装を担当します。

#computedとmethodsの挙動の比較
##挙動の違いをコンソールで確認
「Increase」ボタンと「Increase Second」ボタンを押した際の挙動の違いをコンソールで確認してみよう。
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="sssa324542" data-slug-hash="oNNNdLo" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="oNNNdLo">
  <span>See the Pen <a href="https://codepen.io/sssa324542/pen/oNNNdLo">
  oNNNdLo</a> by さと (<a href="https://codepen.io/sssa324542">@sssa324542</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

##「Increase Second」ボタンと「Increase」ボタンを押した結果
###「Increase Second」ボタン（computed）
consoleには「computed」のみ表示される。

###「Increase」ボタン（methods）
consoleには「computed」と「methods」の両方が表示される。

###なぜなのか？
computedはmethodsと違いリアクティブな依存関係にもとづきキャッシュされるためである。

下記表に整理すると

| クリックしたボタン   |      コンソール   |
|:-----------------|------------------------------------:|
| Increase            |     computed&methods    |
| Increase Second          |           methods      |

となるIncreaseボタンを押してコンソールにcomputedとmethodsが表示されるのはもちろんcounterの値が変わるとcomputedとmethods両方とも影響あるからである。しかし、Increase Secondボタンを押した場合はsecondCounterの値が変化し、methodsのみコンソールに表示される。

```Vue.js
new Vue({
　el:'#app',
　data:{
　　counter:0,
　　secondCounter:0
　}
　computed:{
 　output:function(){
 　 console.log('computed');
  　return this.counter>5?'Greater than 5':'Smaller than 5';
 　}
　},
　methods:{
 　result(){
 　 console.log('methods');
  　return this.counter>5?'Greater than 5':'Smaller than 5';
 　}
　}
}
```
[bootstrap-vue]モーダルを閉じないようにしたい

bootstrap-vueのモーダルを閉じないようにしたい! ということがありました。
案外いろいろ指定する必要があったので、備忘として残します。

## 結論だけ知りたい人へ

`<b-modal ok-only hide-header-close no-close-on-backdrop no-close-on-esc>`
とすればOK。(bootstrap-vue2.0.3にて確認)

## "モーダルを閉じる" のいろいろ

特に何も指定しない場合、↓のようなモーダルが出てきます。
![modal1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162371/b5340735-beee-defe-1ac9-bff633aa40d8.png)

モーダルの閉じ方と、それを防ぐために指定するプロパティを以下にまとめます。

|閉じ方|閉じるのを防ぐために指定するプロパティ|備考|
|---|---|---|
|右上の×ボタンを押す|hide-header-close|ボタンを非表示にする|
|Cancelボタンを押す|ok-only|ボタンを非表示にする|
|モーダルの外側(グレーアウトした部分)をクリック|no-close-on-backdrop||
|キーボードのESCボタンを押す|no-close-on-esc||

## 全部指定してみた

前項のプロパティを全て指定すると、以下のようになります。
(コードはグレーアウト部分を参照)
![modal4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162371/f4a33fcb-0482-f4a8-8933-772b788730de.png)

## 最後に
今回の画像は、[公式サイト](https://bootstrap-vue.js.org/docs/components/modal/)のデモを利用しました。
コードを書き換えて動かすこともできるため、各プロパティの検証が手軽にできます。
神機能です。
ITパスポート合格まで

本筆者は2019年10月にITパスポート試験に合格いたしました。(CBT形式)

![IMG_8227 3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509188/be9d43b4-85c1-221e-befc-f96eef4c2c0b.jpeg)



　これからITパスポートを受けようと考えている方々へ私が実践した勉強法や試験中の流れなどご紹介したく作りました。

※これを見れば合格できるわけではないので、ぜひご参考程度に見ていただけると幸いです。


## 試験勉強
### 使用した教材について
ITパスポート合格に向けて使用した教材は以下の2点です。
・[栢木先生のITパスポート教室](https://www.amazon.co.jp/dp/B07L2TVVWD/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
・[ITパスポート過去問道場](https://www.itpassportsiken.com/ipkakomon.php)

合格することが目的なら上記2点で十分だと思います。

### 勉強の仕方
####1. 「栢木先生のITパスポート教室」を1周流し読みし、赤文字とテーマ毎の内容を理解する
この段階で**重要語句、テーマ毎の理解**を目標とします。

**重要語句**
読んでいて頭に残るものだけ覚える。
全部を無理やり暗記しない

**テーマ毎の理解**
細かくテーマが区切られて構成されているので、テーマ毎にどういう内容か簡単に覚える


読んでいるときに実践していた方法として、流し読みして**理解しやすいテーマ、理解しにくいテーマを分けながら**読み進めました。
理由として、
・流し読みでも理解しやすい→**得意分野になりやすい**
・流し読みで理解しづらい→**苦手分野の可能性がある**
と考えたからです。
これは2周目の精読の際にどこを重点的に読むか判断する上で役立ちます。
####2. 「栢木先生のITパスポート教室」の2周精読、付属の問題を解き、理解を深める
**1周目で分けたテーマを参考にしっかりと読み込む。**
　理解しやすいテーマより**理解しにくいテーマに振り分けたテーマの理解**に時間をかけましょう。
ITパスポートは広く浅く知識を問われるので、得意分野を伸ばすより、苦手分野を減らす方が点は取りやすいと感じました。

読んでいるときに実践していた方法として、
**1.テーマ毎に設けられている確認問題を解く**
　まず1周目を読み終えた段階の理解度の確認のため確認問題(過去問)を解いてみましょう。解けない問題が多く出ると思いますが大丈夫です。解説はよく読んで理解しましょう。

**2.本文を精読**
　確認問題を解き終えたら、本文を読んで確認問題で問われた知識を確認しながら理解しましょう。(**実試験で求められる知識レベルの確認**)
重要語句は
周辺の重要語句との違いを確認しながら覚える。
→試験では同じ分野で使用された語句が選択肢として出るため
英語略称の語句は正式な英語表記を覚える。
→略称前の表記を覚えた方が選択肢を選ぶ際の参考になる。

**3.確認問題を正解の根拠を確認して解く**
　読み終えたら再度確認問題に目を通しましょう。1度解いている問題なので正解することは容易でしょう。ここで大切なのは**得た知識から正解の根拠を導く**ことです。選択肢から何故この選択肢になるのか、他の選択肢は何故違うのかを理解しながら問題を解答しましょう。

####3. 過去問道場で過去問をひたすら解く
過去問を解く理由は問題の形式になれることと、不足している知識を取り込むためです。
　試験形式としては択一選択ですが、内容は穴埋めや組み合わせ、計算問題など様々です。問題の形式に慣れ、**覚えた知識を過去問を通してアウトプットする**ことが大切です。また、参考書を2周読んでも、全てを理解することは難しいので、**覚えきれていなかった内容を過去問を通して理解**していきましょう。
目安として直近3年(6回分)ほど行えば大丈夫だと思います。

##試験本番
※試験中の解き方は人それぞれだと思うので、あくまで解き方の一つとして見てもらえたらと思います。
私はCBT形式で受験しました。なのでこれから紹介するやり方はCBT向けかもしれません。
CBT形式は解答で「あとで確認する」ボタンがあるので、これを有効に使いましょう。
　解いていく中で**解答に自信を持てる解答以外全てに「あとで確認する」にチェックをつけました**。
　理由は2つあります。まず1つに、**絶対解けている問題の数を把握**するためです。理解度の度合いによりますが、試験問題の中には必ず正解を確信できる解答が存在します。それを把握することで、**試験中に自分の正答率を擬似的に把握**できます。もう一つに**時間を置いて問題を確認**するためです。最初に問題を解く時は無意識的でも焦りが発生し、落ち着いて問題に向き合えないこともあります。そこで分からない問題や自信が持てない問題を見直す時に**時間を置いて再度みることで落ち着いて問題に向き合う**ことで正解の取りこぼしを防ぐことができます。
　**計算問題は見てすぐ解けるもの以外は飛ばして、見直しの段階で解いていない計算問題に挑戦**しました。計算問題は解けなくて悩んでいるとその後の問題を解く時間を無駄に消費するので、すぐ解答できる問題以外は飛ばして次の問題へ移りました。試験時間は120分ですが一通り解き終えても、時間が余る人がほとんどだと思うので、余り時間を使ってじっくり計算問題に取り組む方が時間が使いやすいと感じました。

##最後に
最後まで読んでいただきありがとうございました。

これからITパスポートを受験する方へ向けて
**合格 ≠ 試験内容の完璧な理解**
合格基準が各分野で満点の30%以上、総合点が60%以上であることなので、たとえ苦手な分野が合っても、他で補うことができれば十分合格することが可能です。

少しでも本記事が皆さんの合格へ向けての力になれば幸いです。
ぜひ皆さんの合格を願っております。
JavaScriptでの変数の型チェック

# 変数の型チェックの重要性

JavaScriptは動的型付け言語であるため、
JavaやC#などの静的型付け言語と違い変数の型を宣言する必要はありません。

いちいち型宣言する必要がないのでとても使い易い一方で
変数の型に気をつけていないと
プログラムの実行時に意図しない挙動が起こってしまうというとても厄介な側面があります。

 
例えば下記の例をとって見ましょう。

```js
const calc = (hoge, fuga) => {
    return hoge + fuga;
};
```

上記の関数では受け取った二つの引数の加算を行なっています。


それではこの関数を

- 1) 引数が二つとも数値であった場合
- 2) 引数の片方が数値で、もう片方が文字列であった場合
- 3) 引数が二つとも文字列型であった場合

の条件で実行してみた場合、実行結果は以下の通りになります。

```
1) 引数が二つとも数値であった場合 : 3
2) 引数の片方が数値で、もう片方が文字列であった場合 : 12
3) 引数が二つとも文字列型であった場合 : 12
```

1)の場合は加算処理、
2)、3)では文字列結合を行なっています。

もし実装者がこの関数を数値の加算処理を想定していた場合、
2)と3)の挙動は意図しない挙動になってしまいます。

それでは
意図しない挙動を避けるためにはどのようにすれば良いのでしょうか？

# typeofを使った型チェック

JavaScriptには

- typeof演算子

というものがあります。

この演算子を使うと
とても簡単に変数の型チェックを行うことができます。

typeofを使って先ほどの関数に型チェックを行うと以下のようになります。

```js
const calc = (hoge, fuga) => {
    if(typeof hoge !== 'number' || typeof fuga !== 'number'){
        return `引数が二つとも数値ではありません。`
    }
    return hoge + fuga;
};
```

上記の関数では
引数が二つとも数値型ではない場合は
文字列結合を行なわないように処理を変更してあります。

実際に
この関数を実行してみると

```
1) 引数が二つとも数値であった場合 : 3
2) 引数の片方が数値で、もう片方が文字列であった場合 : 引数が二つとも数値ではありません。
3) 引数が二つとも文字列型であった場合 : 引数が二つとも数値ではありません。
```

となります。

このように
typeof演算子を使って変数の型チェックを行うことにより
プログラム実行の際の意図しない挙動を未然に防ぐことができます。
aleとasyncomplete.vimを使ってTypeScriptの入力補完を行う

## 概要
[ale](https://github.com/dense-analysis/ale)と[asyncomplete.vim](https://github.com/prabirshrestha/asyncomplete.vim)を使って、TypeScriptの入力補完を行うための設定について記載します。

## 前提
- プラグインの管理は[dein.vim](https://github.com/Shougo/dein.vim)で行っています。
- tsserverを使用するため、typescriptがプロジェクトローカルまたはグローバルにインストールされている必要があります。

## 依存関係

必要になるまでaleを有効化したくないため、`on_cmd`にコマンドを列挙しています。
各プラグインの設定は`hook_source`で行っています。

```vim
[[plugins]]
repo = 'dense-analysis/ale'
on_cmd = ['ALELint', 'ALEToggle', 'ALEEnable', 'ALEToggleBuffer', 'ALEEnableBuffer']
hook_source = '''
let g:ale_linters_explicit = 1 " 必要なlinterのみ有効化したいため
let g:ale_linters = {
  \   'typescript': ['tsserver']
  \   }
'''
depends = 'asyncomplete.vim'

[[plugins]]
repo = 'prabirshrestha/asyncomplete.vim'
on_func = 'asyncomplete#enable_for_buffer'
hook_source = '''
let g:asyncomplete_enable_for_all = 0 " TypeScriptファイルの編集時のみ使用したいため
set completeopt+=preview

autocmd User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#ale#get_source_options({
\ 'priority': 10
\ }))
'''
```

## vimrc

下記の設定をvimrcに記載します。
設定後、vimrc等必要なファイルの再読み込みを行うと、入力補完が効くようになると思います。

```vim
" .tsファイルを開いたときに、aleとasyncomplete.vimを有効化しています。
function! s:typescript() abort
  ALEEnable
  call asyncomplete#enable_for_buffer()
  map <buffer> <C-]> <Plug>(ale_go_to_definition)
  imap <buffer> <C-Space> <Plug>(asyncomplete_force_refresh) 
endfunction

augroup TypeScript
  autocmd!
  autocmd FileType typescript call s:typescript()
augroup END
```

## 参考
以下を参考にさせていただきました。

https://qiita.com/hokorobi/items/b4be36253262373fbefc
https://github.com/dense-analysis/ale/pull/2627
コマンドプロンプトで大量ファイルの処理を並列でやりたい

野暮用で大量のSVGをinkscapeでEMFに変換しようとしたら、雑なループだと結構時間がかかりそうだったので並列して処理させたかった。ただ、メモリやプロセスを食いつぶして中途半端に止まるのは嫌なので上限数を決めたかった。


``` svg2emf.bat
@echo off
setlocal enabledelayedexpansion

set INKSCAPE=C:\PATH_TO_INKSCAPE\inkscape.exe

:: 並列数
set PARALLEL=10

:: この辺りは自由に書く
FOR /f "delims=" %%A in ('where /r . *.svg') do (
	echo "%INKSCAPE%" "%%~A" -M "%%~dpnA.emf"
 	call :BACKGROUND "%INKSCAPE%" "%%~A" -M "%%~dpnA.emf"
)

:: 終了
exit /B

:: 汎用並列処理
:BACKGROUND command arg1 arg2 ...
	:: バックグラウンド処理する
	:: startは最初にダブルクォート付の引数にあるとタイトルとして解釈するので、空文字列を渡しておく
	start /B "" %*
	
	:: プロセスが指定数未満になるまで待機するループ
:WAIT_LOOP
	for /F %%c in ('tasklist ^| find /C "%~nx1"') do set PCOUNT=%%c
	if !PCOUNT! GEQ %PARALLEL% timeout 1 /nobreak >nul && goto WAIT_LOOP
exit /B
```

うーん、結構めんどい。

ポイント

- `FOR /f "delims=" %%A in ('where /r . *.svg') do ` で1行づつ処理
- `start /B "" コマンド ...` でバックグラウンド処理
    - startの最初のダブルクォート付の引数はタイトルと認識されて事故る事例が多いことで有名なので、空文字列を渡して事故を回避する。
- `tasklist`でプロセス数を数えてN個以上起動しないようにする
    - 雑な数え方なので、変なプロセス名があるとバッティングする可能性があったり、バッチとは関係ないプロセスも数えてしまうので注意する

ただ、コマンドプロンプトの処理はアホみたいに時間がかかるので、今回のような1秒で終わるような処理をプロセス数を制限して並列処理しようとしても、プロセス数を制限しようとする処理がボトルネックになる。（自分のPCでは6個以上実行されることはなかった）

というわけで、コマンドプロンプトは並列処理に向いてないと思うので他の方法を使った方がよいでしょう。
例えば、Git for windowsを入れている環境なら、findとxargsで処理したほうが速く処理できます。

```
# 10並列で処理
/usr/bin/find . -name "*.svg" | xargs -P 10 -I{} /c/PATH_TO_INKSCAPE/inkscape.exe "{}" -M "{}.emf"
```
Scratchでプログラミングに親しもう

# Scratchとは？

Scratch (スクラッチ) は、MITメディアラボが開発したプログラミング言語学習環境です。
非常に直観的にプログラムを組み合わせる事が出来、幼い内からプログラミングの概念を学ぶのに最適な環境だと思います。
※タブレットとの相性もとても良く、PCを普段使わない方にもお勧めです。

それでは、実際にどういうものか紹介していきます。

# Scratchで作品を作る上で最低限抑えるべき機能

## 動きと制御

Scratchは、スプライトと呼ばれるオブジェクトを画面に追加し、追加したスプライトに命令ブロックを組み立てる事で作品を作っていきます。
![スプライト.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/5e13ebbd-4791-0898-f033-715bd1109b93.png)
※Scratchには、デフォルトで沢山のスプライトがあります。中にはリアル物もありますが、子供が興味を持てるかわいいキャラクターも多いです。

下の画像が動きと制御を組み合わせた例です。
![動きと制御.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/450c1491-4366-b36e-f869-5a5f49f40c3c.png)

動きは青色・制御はオレンジ色と視覚的にも大変分かりやすくなっています。

スプライトの「回転方法を左右のみ」にした後、
ずっと10歩動き、もし画面の端っこについたら跳ね返る
という命令をスプライトに与えています。

簡単な例ではありますが、ずっとの中に「回転方法を左右のみ」にする命令を入れても動きが変わらないけれど、一回命令すれば良いよね？など、気づきを得られるポイントが沢山あります。

## 変数と演算

変数と演算を組み合わせて、制限時間を実装してみます。

![変数と演算.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/1e877ed6-b911-5515-0dcb-654c06af92cb.png)

変数は濃いオレンジ色、演算は緑色です。
個人的な感想ですが、変数と制御を組み合わせるとぐっとプログラミングっぽくなると思っています。

![制御のもし.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/b3cf7132-4865-6f9e-8656-f31bef058e22.png)
Scratchを学ぶ上での最初の関門なのですが、制御に上記画像の様な演算をはめる事が出来る穴があいたブロックがあります。
これを組み合わせる事で、**状態の概念**や**条件分岐**が学べます。素晴らしい。

# 豊富な拡張機能

Scratchには、興味が広がる面白い拡張機能が沢山あります。
![拡張機能.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/5f5f5e98-7181-143b-688c-3c801b1d7401.png)

Googleが提供する翻訳機能が使えたりAmazonが提供する音声合成機能が使えたりと結構あなどれないラインナップです。
次回は豊富な拡張機能を紹介したいと思います。
FileMakerで工事契約情報を管理する

#目的
ファイルメーカーというデータベースソフトを使用して、工事契約情報を管理するアプリを作成してみる。
ファイルメーカーを購入したのは約2年前でしたが、一度挫折し最近やっと使えるようになってきたので、同じように挫折してしまった方のお役に立てればと思います。


#環境
windows10(windows7からのアップグレード)
FileMaker 16 pro

#サンプルファイル
https://www.dropbox.com/s/zyfd999vekp5m6z/%E5%B7%A5%E4%BA%8B%E5%A5%91%E7%B4%84%E7%AE%A1%E7%90%86.fmp12?dl=0




#作成手順
##1.テーブルの作成
###1-1.基本情報テーブル
下記の通りフィールドを作成する。

![1_基本情報テ!ーブル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213168/bbcc4f5b-cbbb-1bd1-3cb6-618fe2743178.png)

![2_基本情報テーブル2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213168/2e9f34df-2262-acea-7285-815e8502ae0b.png)

・「工事番号」は年度の西暦4桁と3桁の数字を連結させたものを使用する。
例：2019年度の一番目の工事の場合->「2019001」

・「c_工事別税抜合計_工事一覧」は工事一覧に表示する工事別の集計です。
集計する場合は、集計フィールドを使用する方法もありますが、ここでは計算フィールドで対応しています。
理由は集計フィールドにすると、レコードを追加削除した際の再計算がされないことがあることと、集計結果がゼロの場合にゼロと表示できないためです。
また、金額のフィールドが1-4に示している「金額工期テーブル」でなく「基本情報テーブル」に作成していることに違和感があるかもしれません。SQLに慣れている方ほどこういったファイルメーカー特有のフィール作成に悩まされると思います。
理由としては、金額工期テーブルに作成して計算フィールでsum関数を使用すると想定通り集計されません。それはファイルメーカーのヘルプを参照すればわかりますがファイルメーカーに慣れていない方の感覚とは違った結果が返ってきます。そのため、「基本情報テーブル」で計算フィールを作成して、計算式の設定を下記のようにしてsum関数を使用すると期待通りの結果が返ってきます。
例：税抜金額の場合
・次のコンテキストから計算式を評価するを「TO_01_工事台帳_基本情報」に設定する。
・計算式の内容は「sum(TO_01a_工事台帳_金額工期_金額工期情報::税抜)」とする。

###1-2.顧客情報テーブル
下記の通りフィールドを作成する。
顧客CDはあ行->01 か行->02というようにして、4桁の数字を連結したものを使用する。
例：「あ」から始まる名前->「010001」

![3_顧客情報テーブル1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213168/dd84740a-e749-fcec-7b7c-041e26a5ad85.png)

![4_顧客情報テーブル2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213168/564fd330-1fc0-e36f-31cb-e6323a4f3d87.png)

###1-3.社員情報テーブル
以下画像は省略しますのでファイルの中身を確認お願いします。

###1-4.金額工期テーブル
金額と工期は、変更契約が何度かある可能性があるため基本情報とは分けています。


##2.テーブルオカレンス（以下、TOとする）の作成
下記のようなTOを作成します。
![13_オカレンス.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213168/8fca1ed1-bb13-775c-43bc-1133466e50db.png)
作成していて難しかったところは、最新の工期を表示することでした。
レイアウト「工事一覧」では、工事別に金額を集計、最新の工期を表示するようにしています。
そのため下記のように2段回に分けてリレーションを設定しています。

・TO「TO_01e_工事台帳_金額工期情報_工期開始」と「TO_07e1_工事台帳_金額工期情報_工期開始_maxid」とのリレーションの照合に、金額工期情報テーブルに「g_工期開始終了日_空白除去_フィルタ」フィールドを作成して「1970/1/1」を設定して<=「工期開始」で工期開始が空白のレコードを除外しています。
「1970/1/1」以前のレコードを管理する必要がある場合は別の方法を考える必要があります。

・TO「TO_07e1_工事台帳_金額工期情報_工期開始_maxid」と「TO_07e2_工事台帳_金額工期情報_工期開始最新」とのリレーションの照合に、金額工期情報テーブルに「c_工事台帳_工期開始_maxid_フィルタ」フィールドを作成して=IDで照合することで最新の工期を取得できるようにしています。

説明がわかりずらいと思いますのでファイルをご確認ください。

##3.レイアウトと値一覧の作成
###3-1.工事登録レイアウトの作成
工事登録のレイアウトは下記のようにしました。
他のレイアウトはファイルを確認おねがいします。
原価情報などはテーブルを作成していないのでファイルでは動作しませんのでご了承ください。
![7_工事登録レイアウト.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213168/117f2b2f-2d9d-39b4-34af-a0f1a394b596.png)

###3-2.値一覧の作成
入力の効率化のために下記のような値一覧を作成して、フィールドに割り当てます。

・顧客分類：G…国　P…県　C…市　Z…民間
・元請・下請
・官庁・民間
・受注部門
・許可業種
・契約区分

##4.今後の展開
・会計年度で工事一覧を表示できるようにするために、別のTOを作成する。
・登録の確定キャンセルができるように「OnRecordCommit」を制御する。
Railsチュートリアル 第１章＜復習＞

学習内容のメモ。
個人的に重要と感じた点を、メモしていきます。


#開発環境について
Railsの環境構築は初心者とって大変。
よって、必要なツールがほぼプリインストールされている
クラウドのIDEサービスを使うと良い。AWSのCloud9を使用していく。


#Railsアプリケーションの作成
任意のフォルダで

```
rails new <アプリケーション名>
```

を実行すると、新規フォルダが作成され、
Railsの新規アプリケーションファイルが一式格納される。


#Gemfile
作成したフォルダ内に**Gemfile**という物が作られる。
この中に、必要なgem（各種ライブラリ類？）を記載する。
内容を書き換えたら

```
bundler install
```

を実行すると変更が反映される。


#Railsアプリケーションの起動
アプリケーションの起動は

```
rails server
```

を実行する。
Cloud9のPreviewタブから、URLにアクセスできる。


#Gitについて
ファイルのバージョン管理ツール。
ローカルリポジトリ、リモートリポジトリで管理する。
ファイルの流れは以下の通り（合ってるか不安・・・）。

##ローカルリポジトリ
作業領域
　↓
`git add <ファイル名>`
　↓
ステージング領域
　↓
`git commit`
　↓
リポジトリ

##リモートリポジトリ（GitHub等）
- リポジトリのURLを取得

```
git remote add origin <リポジトリのURL>
```

originは任意の文字で良い。
URLをoriginに格納するイメージ。

- ファイルをリポジトリにプッシュ（ローカル→リモート）

```
git push origin master
```

masterは、リモートリポジトリのブランチ名を表す。
origin(=リポジトリURL)／master(=ブランチ名)　に
ファイルを格納するイメージ。

また、Branchを分けたり、マージしたりできる。

##Branchの作成

```
git checkout -b <ブランチ名>
```

または

```
git branch <ブランチ名>
```

##Branchの一覧表示

```
git branch
```

##Branchの移動

```
git checkout <ブランチ名>
```

##Branchの削除

```
git branch -d <ブランチ名>
```

##マージ

```
git merge <ブランチ名>
```
　　
なんかGitがメインになってる・・・？
【初心者】【unity】【メモ】 インスタンスは別のスクリプトから呼び出した時、スクリプト名で指定


####呼び代元
 
public class testDebug : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        GameObject test = EffectsUtil.GetPrefab(prefab, "testPa");
        EffectsUtil.Shot(test);
    }
}
 
 
####呼び出し先
public class EffectsUtil : MonoBehaviour
{ 
    public static GameObject GetPrefab(GameObject prefab, string name)
    {return prefab ?? (prefab = Resources.Load("Effects/" + name) as GameObject);}
 
 
    public static GameObject Shot(GameObject prefab)
    {
        GameObject gb = Instantiate(prefab);
        return gb;
    }
}
僕がアプリを新規で作るときによく使うrailsコマンド集

僕は、すぐに忘れてしまうのでここにメモする。

```bash
# mysql環境でアプリを作る
rails new hoge_blog -d mysql

# controllerを作成す。メソッドを引数につけるとそのメソッドができる
rails g controller Users index show

# 開発用サーバ起動
rails s

# create databaseしてくれる
rails db:create

# モデルとmigrationファイルを作ってくれる
rails g model user name:string username:string location:string 
about:text

# migrationファイル実行
rails db:migrate

# seeds.rb編集したらこれで実行する
rails db:seed
```

参考ページ
[Rails generate の使い方とコントローラーやモデルの命名規則 \- Qiita](https://qiita.com/higeaaa/items/96c708d01a3dbb161f20)
AWS RDSのパブリックアクセシビリティについて

Microsoft SQL ServerへJavaプログラムから接続して、個人的に確認してみたいことがあり、Amazon RDSをサクッと立ててみて、試してみようと思いました。

RDSの立ち上げまでは本当にサクッとできたのですが、ローカル環境のJavaプログラムからの接続ができない・・・
セキュリティグループの設定も適切にできているのに何故だと、30分ほど悩んでいました。

結果、RDSの設定の**パブリックアクセシビリティをON**にすることで解決しました。
※設定は、RDSの変更画面からできます

以下、 AWS RDSのユーザーガイドを参照しますが（リンク先はAuroraですが、他のRDSも同じかと思います）、どうやらRDSのようなデータベースへの接続は基本的にインターネット経由で接続するのではなく、EC2などによる踏み台経由での接続を推奨しているため、**デフォルトではインターネット経由からの接続はできない**ようになっているみたいです。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html#USER_VPC.Hiding

※以下はRDSの設定画面のスクリーンショットです。パブリックアクセシビリティの欄が記載されています。
![スクリーンショット 2019-10-06 18.26.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148996/e683f053-ba96-af4a-da5f-75e24c456563.png)

おそらくRDSをよく使う方にとっては、基本中の基本なのかと思いますが、だいぶ悩みました・・・
同じような境遇の方々にお役に立てられれば幸いです。
Docker コンテナで SAM CLI を使用する

ローカルに環境をインストールせずに SAM CLI でビルド・デプロイをおこなう。

## コンテナイメージの作成

必要なランタイムおよび SAM CLI がインストールされたイメージを作成する Dockerfile を作成する。(以下は Python 3.7 の例)

```dockerfile
FROM python:3.7-alpine
# Install awscli and aws-sam-cli
RUN apk update && \
    apk upgrade && \
    apk add bash && \
    apk add --no-cache --virtual build-deps build-base gcc && \
    pip install awscli && \
    pip install aws-sam-cli && \
    apk del build-deps
RUN mkdir /app
WORKDIR /app
```

イメージをビルドして適当なタグをつけておく。

```bash
docker build -t sam-python37 .
```

## SAM CLI 実行

### 基本

コンテナ内から AWS リソースにアクセスするため、認証情報を含む ${HOME}/.aws をマッピングして実行する。

```bash
$ docker run \
    -v $(pwd):/app \
    -v ${HOME}/.aws:/root/.aws \
    sam-python37 sam ...
```

### 認証プロファイルを指定する場合

```bash
$ docker run \
    -v $(pwd):/app \
    -v ${HOME}/.aws:/root/.aws \
    -e AWS_PROFILE=${AWS_PROFILE} \
    sam-python37 sam ...
```

### 認証情報を直接指定する場合

直接指定する場合は ${HOME}/.aws のマッピングは不要。

```bash
$ docker run \
    -v $(pwd):/app \
    -e AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
    -e AWS_SERCET_ACCESS_KEY=${AWS_SERCET_ACCESS_KEY} \
    sam-python37 sam ...
```

## alias 設定

お好みのコマンドを alias に設定しておくと楽です。

```bash
$ alias sam-python37='docker run ... sam-python37 sam'
```
CentOS7 HAProxyの接続エラー

## エラー
```
Oct  6 12:35:03 localhost haproxy[25984]: Server redis-master/<name> is DOWN, reason: Layer7 timeout, info: " at step 1 of tcp-check (send)", check duration: 2002ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
----
Oct  6 12:35:03 localhost haproxy[25984]: Server redis-slave/<name> is DOWN, reason: Layer7 timeout, info: " at step 1 of tcp-check (send)", check duration: 2002ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
```
L4 ロードバランサーとして使用する際に、なぜかL7でtimeoutが発生し接続できなかった。

## バージョン
* CentOS Linux release 7.7.1908 (Core)
* haproxy.x86_64_1.5.18-9.el7

## 設定内容
```/etc/haproxy/haproxy.cfg
listen redis-master
    bind 127.0.0.1:16379
    mode tcp
    option tcp-check
    tcp-check send PING\r\n
    tcp-check expect string +PONG
    server <name> <IP>:6379 check port 6379 inter 2000 fall 5

listen redis-slave
    bind 127.0.0.1:16380
    mode tcp
    option tcp-check
    tcp-check send PING\r\n
    tcp-check expect string +PONG
    server <name> <IP>:6379 check port 6379 inter 2000 fall 5

```

## 解決策
```/etc/haproxy/haproxy.cfg
listen redis-master
    bind 127.0.0.1:16379
    mode tcp
    option tcp-check
    tcp-check connect #ここを追加
    tcp-check send PING\r\n
    tcp-check expect string +PONG
    server <name> <IP>:6379 check port 6379 inter 2000 fall 5

listen redis-slave
    bind 127.0.0.1:16380
    mode tcp
    option tcp-check
    tcp-check connect #ここを追加
    tcp-check send PING\r\n
    tcp-check expect string +PONG
    server <name> <IP>:6379 check port 6379 inter 2000 fall 5
```
`haproxy.x86_64_1.5.18-9.el7` のバグのようで、 `haproxy.x86_64_1.5.18-8.el7` へ戻すか
、私は`tcp-check connect` を追加することで解決しました。

だいぶハマった...

## 原因
`tcp-check sendとtcp-check expect`が複数行ある場合に発生するバグのようです。
`tcp-check connect` を追加することで新しい接続を開くことで解決できるようでした。

## 参考
https://access.redhat.com/solutions/4455211
https://bugzilla.redhat.com/show_bug.cgi?id=1754085
http://www.haproxy.org/download/1.5/doc/configuration.txt
Ubuntu 16.04にOpenJDK 8(1.8) + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してUbuntu16.04にOpenJDK8 + OpenJ9をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Installation | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/installation.html)

## サポート

本手法で導入した場合、[Support | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/support.html)より、~~2023-09~~ 2026-05がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update;apt install -y wget software-properties-common apt-transport-https
# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
```

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

# apt update; apt install -y adoptopenjdk-8-openj9
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
Eclipse OpenJ9 VM (build openj9-0.15.1, JRE 1.8.0 Linux amd64-64-Bit Compressed References 20190717_368 (JIT enabled, AOT enabled)
OpenJ9   - 0f66c6431
OMR      - ec782f26
JCL      - f147086df1e based on jdk8u222-b10)
```
Ubuntu 16.04にOpenJDK 8(1.8) + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してUbuntu16.04にOpenJDK8 + HotSpotをインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Installation | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/installation.html)

## サポート

本手法で導入した場合、[Support | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/support.html)より、~~2023-09~~ 2026-05がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update;apt install -y wget software-properties-common apt-transport-https
# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
```

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

# apt update; apt install -y adoptopenjdk-8-hotspot
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.222-b10, mixed mode)
```
Debian 10にOpenJDK 11 + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してDebian10にOpenJDK11 + OpenJ9をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Installation | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/installation.html)

## サポート

本手法で導入した場合、[Support | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/support.html)より、~~2022-09~~ 2024-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update;apt install -y wget software-properties-common apt-transport-https gnupg
# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y adoptopenjdk-11-openj9
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.4+11)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.15.1, JRE 11 Linux amd64-64-Bit Compressed References 20190717_286 (JIT enabled, AOT enabled)
OpenJ9   - 0f66c6431
OMR      - ec782f26
JCL      - fa49279450 based on jdk-11.0.4+11)
```
Debian 10にOpenJDK 11 + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してDebian10にOpenJDK11 + HotSpotをインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Installation | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/installation.html)

## サポート

本手法で導入した場合、[Support | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/support.html)より、~~2022-09~~ 2024-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update;apt install -y wget software-properties-common apt-transport-https gnupg
# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y adoptopenjdk-11-hotspot
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.4+11)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.4+11, mixed mode)
```
Orcacle 12cのユーザー作成、接続でハマったやつ(Create User, Grant)

# この記事は。
OracleDBの勉強中にユーザー作成とセッションの確立で知らなかった点を記載しています。
熟練のOracle使いからすれば小ネタにもならない点でしたが、備忘録です。

# 私の環境
- MacBook Pro (13-inch, Mid 2012)　Mojave 10.14.5
- Oracle Database 12c
- Docker version 19.03.1
- DBearver(クライアント)

# ローカルユーザーの作成場所/CDBとPDBについて
少し前に[DockerにOracleDBを乗っけて勉強を始めました。](https://qiita.com/shinbones/items/07d474a049c454100363)
SYSユーザーで接続できることは確認していましたが、もちろん管理者権限でDBを触るwebアプリケーションなんてありません。ないよね？
なので一般ユーザーを作成しようとしたのですが、**ここで早速躓きました。**

![スクリーンショット 2019-09-11 20.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270852/d663ba18-643e-c649-2b3f-10ad584d6ea7.png)

**[ORA-65096]??????**

結論から言うと、12cからはそれまでと構成が変わり、**コンテナデータベース(CDB)とプラガブルデータベース(PDB)に別れた**が為に発生したエラーでした。

というのも、12cからOracleDBは「マルチテナントアーキテクチャ」を採用しています。
平たく言うと、このアーキテクチャでは**CDBの中に一つ以上のPDBが内包される**構成になっており、複数のPDBはそれぞれ独立したデータベースを持てるようになっているそうです。
その上で、PDBが属するCDBに対してバックアップやアップグレードを行えるため、PDBの独立性を保ちながら管理コストの低減を図れるようになってるとのこと。
この点については[こちらのブログ](https://ts0818.hatenablog.com/entry/2017/11/18/152830)や[こちらの内容](https://www.projectgroup.info/documents/Oracle/ORA-120005.html)が理解し易かった為。参考させていただきました。




従って、アプリケーションから接続することを想定したユーザー ＝ ローカルユーザーはPDB側に作ってあげないといけません。
で、先ほどユーザーを作成しようとした際の接続を確認してみると、

![スクリーンショット 2019-09-11 20.59.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270852/fa3fd412-a9bd-8825-5b64-72b7fc82d636.png)

**思いっきりCDBに接続していますね。**

もちろん、共通のCDBユーザーを作る方法もありますが、これは今回想定しているユーザーではないです。
共通の管理ユーザーを作成する場合は以下の記事を参考にすると良さそう。

- [CDBに共通ユーザを作るときの注意事項](https://qiita.com/kanaNan/items/df61ce9a67324d6dcf09)

# ユーザー作成と接続権付与

そうと分かれば以下のようにPDB側へ接続。

![スクリーンショット 2019-09-12 19.53.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270852/dc2cbcf9-7dde-7459-008a-3f4a337ac283.png)


以下でユーザー作成、接続権限を付与。

````
/* ユーザー作成 */
CREATE USER "TestUser"       --大文字小文字を反映させたい場合は""必要
IDENTIFIED BY "testpass"
DEFAULT TABLESPACE users     -- デフォルトの表領域指定
TEMPORARY TABLESPACE temp;   -- 一時表領域指定

/* 接続権限付与 */
GRANT CREATE SESSION TO "TestUser";

````

これでテスト接続できました。

![スクリーンショット 2019-09-12 20.12.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270852/592fca51-b5c1-c131-d5b5-4053e43a201c.png)

# 補足とか

実際select文の書き方なんかを勉強する為には、テストデータを突っ込まないといけませんでした。
なので他に権限を色々付与していく必要がありますが、それはまた別の記事で紹介したいと思います。

また、私の場合環境を作る中でPDBが起動する状態になっていたので大丈夫でしたが、PDBの起動設定なども行わないといけない場合があるみたいです。
その辺りについては[こちらのサイト](https://xn--w8j8bac3czf5bl7e.com/2018/07/04/pdb%E3%81%AE%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95/)が大変参考になりました。ありがとうございます。




# 参考記事、サイト
[Oracle Database 12c プラガブル・データベースについて](https://www.projectgroup.info/documents/Oracle/ORA-120005.html)
[Oracle Database 12c データベースのマルチテナントを実現するOracle Multitenant](https://ts0818.hatenablog.com/entry/2017/11/18/152830)
[Oracleのユーザ名を小文字にするとダブルコーテーションが必要](https://www.smartllc.jp/blog/20141001-username-of-oracle/)
[PDBの自動起動](https://xn--w8j8bac3czf5bl7e.com/2018/07/04/pdb%E3%81%AE%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95/)
Debian 10にOpenJDK 8(1.8) + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してDebian10にOpenJDK8 + OpenJ9をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Installation | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/installation.html)

## サポート

本手法で導入した場合、[Support | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/support.html)より、~~2023-09~~ 2026-05がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update;apt install -y wget software-properties-common apt-transport-https gnupg
# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y adoptopenjdk-8-openj9
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
Eclipse OpenJ9 VM (build openj9-0.15.1, JRE 1.8.0 Linux amd64-64-Bit Compressed References 20190717_368 (JIT enabled, AOT enabled)
OpenJ9   - 0f66c6431
OMR      - ec782f26
JCL      - f147086df1e based on jdk8u222-b10)
```
Debian 10にOpenJDK 8(1.8) + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してDebian10にOpenJDK8 + HotSpotをインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Installation | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/installation.html)

## サポート

本手法で導入した場合、[Support | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/support.html)より、~~2023-09~~ 2026-05がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update;apt install -y wget software-properties-common apt-transport-https gnupg
# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y adoptopenjdk-8-hotspot
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.222-b10, mixed mode)
```
Debian 9にOpenJDK 11 + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してDebian9にOpenJDK11 + OpenJ9をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Installation | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/installation.html)

## サポート

本手法で導入した場合、[Support | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/support.html)より、~~2022-09~~ 2024-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update;apt install -y wget software-properties-common apt-transport-https gnupg
# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y adoptopenjdk-11-openj9
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.4+11)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.15.1, JRE 11 Linux amd64-64-Bit Compressed References 20190717_286 (JIT enabled, AOT enabled)
OpenJ9   - 0f66c6431
OMR      - ec782f26
JCL      - fa49279450 based on jdk-11.0.4+11)
```
Dockerで構築したオンプレのMongoDBとEC2上のMongoDBとでレプリカセット組む

同じネットワークではない別々のマシン間において、レプリカセットを組むやり方まとめ。

端的に言うとポートフォワードでできた。

# 状況

- EC2上に構築したMongoDBと自宅サーバのMongoDBとでレプリカセットを組みたい
- それぞれDockerでMongoDBは構築している
- 双方向にSSHは可能


## やり方

EC2の1インスタンス上にMongoDBのPrimaryとArbiterのコンテナをそれぞれ作り、自宅サーバにはSecondaryのコンテナを作るシチュエーション。

37016がArbiter
37017がPrimary
37018がSecondary


### 1. EC2から自宅サーバにトンネルを掘る

今回はautosshを使ったが、普通のsshでも同じようにできる。
`-g`が無いとコンテナの中からアクセスできないので注意。

```
autossh -M 0 -N -f -C -g my_home@example.com -L 37018:localhost:37018
```

### 2. 自宅サーバからEC2にトンネルを掘る

```
autossh -M 0 -N -f -C -g ec2@example.com -L 37017:localhost:37017 -L 37016:localhost:37016
```

### 3. レプリカセット構築

PrimaryのMongoDBに入って、以下のように設定する。
172.17.0.1はDockerコンテナ中から見たホストマシンのIP。

```
config={_id:"mongo-set", members: [ { _id:0, host:'172.17.0.1:37016', "arbiterOnly":true }, { _id:1, host:'172.17.0.1:37017' }, { _id:2, host:'172.17.0.1:37018'} ] }
rs.initiate(config)
```

### 4. 完成🙌
Debian 9にOpenJDK 11 + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してDebian9にOpenJDK11 + HotSpotをインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Installation | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/installation.html)

## サポート

本手法で導入した場合、[Support | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/support.html)より、~~2022-09~~ 2024-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update;apt install -y wget software-properties-common apt-transport-https gnupg
# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y adoptopenjdk-11-hotspot
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.4+11)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.4+11, mixed mode)
```
influxdb2.0 alpha メモ

#確認環境
OS:CentOS 7

#ガイド
[Document](https://v2.docs.influxdata.com/v2.0/get-started/#download-and-install-influxdb-v2-0-alpha)
[REST API Document](https://v2.docs.influxdata.com/v2.0/api/#section/Authentication)

#Connector
[公式リンク集](https://v2.docs.influxdata.com/v2.0/reference/client-libraries/)
┗ [Java](https://github.com/influxdata/influxdb-client-java)
┗ [Python](https://github.com/influxdata/influxdb-client-python)
他にもGo, JavaScript, Nodeがある。公式リンク参照。

#環境構築における知見
* 1.*系でなくなったUIが復活。
* 1系のAPIとインタフェースが変わったため、1系のアクセス方法や取り扱い方法と互換性なし  
当然、クライアントライブラリも1系と2系で異なる。
* ストレージの場所は起動引数で与える。 
自分はこんな感じ。 
influxd --bolt-path=/data/influxdb/data/influxd.bolt --engine-path=/data/influxdb/engine
　
参照：[influxd run オプション](https://v2.docs.influxdata.com/v2.0/reference/cli/influxd/run/)

* CLI作業環境の環境変数「INFLUX_TOKEN」の設定は普通に作成時のrootでいいなら、UI＞Load Data > Tokens > RootのTokenを設定すればいい。それでCLI作業は全部できる。
* よく一緒に利用されている。grafanaはまだ、influxDB2系には対応していない。influxDB2 がalpha版なので、当分待ちの姿勢と思われる。

#UIイメージ
こんな感じ
ログイン時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87538/93d244f0-f7af-fb46-52e1-607ec69c3001.png)
グラフも見れる。※サーバのリソース使用状況
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87538/2a1003a5-363c-4060-5acc-9ce50331179d.png)
Debian 9にOpenJDK 8(1.8) + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してDebian9にOpenJDK8 + OpenJ9をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Installation | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/installation.html)

## サポート

本手法で導入した場合、[Support | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/support.html)より、~~2023-09~~ 2026-05がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update;apt install -y wget software-properties-common apt-transport-https gnupg
# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y adoptopenjdk-8-openj9
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
Eclipse OpenJ9 VM (build openj9-0.15.1, JRE 1.8.0 Linux amd64-64-Bit Compressed References 20190717_368 (JIT enabled, AOT enabled)
OpenJ9   - 0f66c6431
OMR      - ec782f26
JCL      - f147086df1e based on jdk8u222-b10)
```
Debian 9にOpenJDK 8(1.8) + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してDebian9にOpenJDK8 + HotSpotをインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Installation | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/installation.html)

## サポート

本手法で導入した場合、[Support | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/support.html)より、~~2023-09~~ 2026-05がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update;apt install -y wget software-properties-common apt-transport-https gnupg
# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y adoptopenjdk-8-hotspot
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.222-b10, mixed mode)
```
Debian 8にOpenJDK 11 + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してDebian8にOpenJDK11 + OpenJ9をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Installation | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/installation.html)

## サポート

本手法で導入した場合、[Support | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/support.html)より、~~2022-09~~ 2024-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update;apt install -y wget software-properties-common apt-transport-https
# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y adoptopenjdk-11-openj9
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.4+11)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.15.1, JRE 11 Linux amd64-64-Bit Compressed References 20190717_286 (JIT enabled, AOT enabled)
OpenJ9   - 0f66c6431
OMR      - ec782f26
JCL      - fa49279450 based on jdk-11.0.4+11)
```
Debian 8にOpenJDK 11 + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してDebian8にOpenJDK11 + HotSpotをインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Installation | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/installation.html)

## サポート

本手法で導入した場合、[Support | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/support.html)より、~~2022-09~~ 2024-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update;apt install -y wget software-properties-common apt-transport-https
# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y adoptopenjdk-11-hotspot
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.4+11)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.4+11, mixed mode)
```