OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】viewにおけるlink_toで実体参照したい

「３ヶ月連続アウトプット」、1日目です。

今回は、Railsの「link_to」で「>」を実体参照しようとしてうまくいかなかったので調べてみました。

##現象
```ruby:sample.html.erb
<%= link_to "パスワードをお忘れの方はこちら &gt;", "/path", class: "underline" %>
```
```ruby:ブラウザ上
パスワードをお忘れの方はこちら #&gt;
```

link_toで実体参照したところ、そのまま文字列として出力されてしまった。
ううむ。

##解決方法
色々と探してみたところ、「html_safe」を対象文字列の後にメソッドチェーンしてあげることで解決しました。

```ruby:sample.html.erb（修正後）
<%= link_to "パスワードをお忘れの方はこちら &gt;".html_safe, "/path", class: "underline" %>
```
```ruby:ブラウザ上
パスワードをお忘れの方はこちら #&gt;
```
##「html_safe」とは？
Stringクラスで用意されているメソッド。
文字列にエスケープ処理を加えたくない時に使用する。

##後日談、というか今回のオチ
調べていて気づいてしまったのですが、そもそもこれ実体参照する必要なくないか・・・？
どうやらコントローラーからビューへ文字列を引っ張ってくる際によく使うみたい。
多少時間を使ってしまったけど、「まぁ知れたから今後役に立つでしょ！」とポジティブに考えておこう、うん！

##参考サイト
[HTML特殊文字のエスケープ - Ruby on Rails入門](https://www.javadrive.jp/rails/template/index7.html)
Debian 8にOpenJDK 8(1.8) + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してDebian8に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
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-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 8にOpenJDK 8(1.8) + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してDebian8に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
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-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)
```
Discord.jsで起動時に特定の名前のチャンネルでメッセージを出す。

この内容は、Discord.py向けにも解説しています。[こちら](/tskikoh/items/0df803a074ebd63f9ba0)からご覧ください。

# 前提条件
既にnode.jsでDiscord.jsが動く前提で書きますので、環境を揃えてからお願いします。
実行方法等も特に説明しません。

# コードの内容
同じ名前のチャンネルが複数のサーバーにある事を想定して書いてます。
なので、BOTがいる全てのチャンネルを読み込むような動作をします。
そうで無い場合はもっと無駄の少ないコードになると思います。

```on-ready.js
const Discord = require('discord.js');
const client = new Discord.Client();

client.login("<Token>");

client.on('ready', () => {

    const ch_name = "チャンネル名";

    client.channels.forEach(channel => {
        if (channel.name === ch_name) {
            channel.send("起動しました")
            return;
        }
        return;
    });
})
```
これだけです。

# コードの説明
Discord.jsを読み込んで、変数「Discord」に代入します。
`const Discord = require('discord.js');`

Discordにクライアント接続をします。
`const client = new Discord.Client();`

トークンを読み込んでDiscordにログインします。
<Token>の箇所にはあなたのBOTのトークンを入れてください。
`client.login("<Token>");`

BOTのクライアントが起動したときに{ }の中身を実行します。
`client.on('ready', () => { })`

BOTが接続している全チャンネルの情報を順番に`channel`に代入して、チャンネルの数だけ繰り返します。
`client.channels.forEach(channel => { });`

チャンネルの名前が`ch_name`と一致したら実行します。
一致しなければ何もせずに次のチャンネルに行きます。
`if (channel.name === ch_name) { }`
`return;`

指定したチャンネルに「起動しました」と送信して終了します。
`channel.send("起動しました")`
`return;`

以上です。
間違い等があれば、[Discord](https://discord.gg/RBGKgSg)までご連絡ください。

このソースコードは[GitHub](https://github.com/Tsukikoh/Start-up-message-on-discord.js)に掲載しています。
CentOS 7にOpenJDK 11 + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してCentOS7に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
cat <<EOF > /etc/yum.repos.d/adoptopenjdk.repo
[AdoptOpenJDK]
name=AdoptOpenJDK
baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/7/$(uname -m)
enabled=1
gpgcheck=1
gpgkey=https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
EOF
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

# yum install -y adoptopenjdk-11-openj9 which
... 略
```

### 各種確認

```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)
```
CentOS 7にOpenJDK 11 + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してCentOS7に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
cat <<EOF > /etc/yum.repos.d/adoptopenjdk.repo
[AdoptOpenJDK]
name=AdoptOpenJDK
baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/7/$(uname -m)
enabled=1
gpgcheck=1
gpgkey=https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
EOF
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

# yum install -y adoptopenjdk-11-hotspot which
... 略
```

### 各種確認

```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)
```
CentOS 7にOpenJDK 8(1.8) + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してCentOS7に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
cat <<EOF > /etc/yum.repos.d/adoptopenjdk.repo
[AdoptOpenJDK]
name=AdoptOpenJDK
baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/7/$(uname -m)
enabled=1
gpgcheck=1
gpgkey=https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
EOF
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

# yum install -y adoptopenjdk-8-openj9 which
... 略
```

### 各種確認

```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)
```
CentOS 7にOpenJDK 8(1.8) + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してCentOS7に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
cat <<EOF > /etc/yum.repos.d/adoptopenjdk.repo
[AdoptOpenJDK]
name=AdoptOpenJDK
baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/7/$(uname -m)
enabled=1
gpgcheck=1
gpgkey=https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
EOF
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

# yum install -y adoptopenjdk-8-hotspot which
... 略
```

### 各種確認

```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)
```
CentOS 6にOpenJDK 11 + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してCentOS6に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
cat <<EOF > /etc/yum.repos.d/adoptopenjdk.repo
[AdoptOpenJDK]
name=AdoptOpenJDK
baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/6/$(uname -m)
enabled=1
gpgcheck=1
gpgkey=https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
EOF
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum 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)
```
CentOS 6にOpenJDK 11 + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してCentOS6に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
cat <<EOF > /etc/yum.repos.d/adoptopenjdk.repo
[AdoptOpenJDK]
name=AdoptOpenJDK
baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/6/$(uname -m)
enabled=1
gpgcheck=1
gpgkey=https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
EOF
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum 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)
```
CentOS 6にOpenJDK 8(1.8) + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してCentOS6に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
cat <<EOF > /etc/yum.repos.d/adoptopenjdk.repo
[AdoptOpenJDK]
name=AdoptOpenJDK
baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/6/$(uname -m)
enabled=1
gpgcheck=1
gpgkey=https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
EOF
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum 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)
```
CentOS 6にOpenJDK 8(1.8) + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してCentOS6に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
cat <<EOF > /etc/yum.repos.d/adoptopenjdk.repo
[AdoptOpenJDK]
name=AdoptOpenJDK
baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/6/$(uname -m)
enabled=1
gpgcheck=1
gpgkey=https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
EOF
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum 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)
```
[自分用メモ]擬似クラス違い first-child/last-child/first-of-type/last-of-type

擬似クラス[first-child][last-child]が効かない原因が、
それぞれの使い方を少し勘違いしていたことだったのでメモ。

#dl要素のテーブルで考える
![スクリーンショット 2019-10-06 17.31.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287877/ed81a0d7-d320-1312-e5ae-85635208115c.png)

```html:
<dl>
  <dt>dt (first-of-typeで指定可能) or (first-childで指定可能)</dt>
  <dd>dd (first-of-typeで指定可能)</dd>
  <dt>dt</dt>
  <dd>dd</dd>
  <dt>dt (last-of-typeで指定可能)</dt>
  <dd>dd (last-of-typeで指定可能) or (last-childで指定可能)</dd>
</dl>
```

## :first-child

親要素に対する**すべての子要素の中で、最初の子要素**のみに適用される。

dl要素のテーブルで考えると、最初の子要素はdtなので

### ▼OK

```css:
dt:first-child {
}
```

### ▼NG

```css:
dd:first-child {
}
```

## :last-child

親要素に対する**すべての子要素の中で、最後の子要素**のみに適用される。

dl要素のテーブルで考えると、最後の子要素はddなので

### ▼OK

```css:
dd:last-child {
}
```

### ▼NG

```css:
dt:last-child {
}
```

「dtの中で最後」 or 「ddの中で最後」の要素を指定したい場合は、以下の擬似クラスを使えば良い！

## :first-of-type

**特定の子要素の中で、最初の子要素のみ**に適用される。

dl要素のテーブルで考えると、 dtとdd共に使える。

### ▼OK

```css:
dt:first-of-type {
}
```
つまり、`dt:first-of-type`は、「数あるdt要素の中でも最初のdt要素のみ」に適用される。

```css:
dd:first-of-type {
}
```
つまり、`dd:first-of-type`は、「数あるdd要素の中でも最初のdd要素のみ」に適用される。

## :last-of-type

**特定の子要素の中で、最後の子要素のみ**に適用される。

dl要素のテーブルで考えると、 dtとdd共に使える。

### ▼OK

```css:
dt:last-of-type {
}
```
つまり、`dt:las-of-type`は、「数あるdt要素の中でも最後のdt要素のみ」に適用される。

```css:
dd:last-of-type {
}
```
つまり、`dd:last-of-type`は、「数あるdd要素の中でも最後のdd要素のみ」に適用される。

#参考サイト
https://www.vanfu-vts.jp/blog/2014/09/first-child_last-child/
【VisualBasic】Taskを用いて非同期にファイル操作【.Net】

# 非同期処理の呼び出し方
本題の前に`Task`を用いた非同期処理の呼び出し方について軽く触れます（詳しい部分は参考にさせていただいた記事をご参照ください）。
細かな説明は省きますが、今回紹介する方法は`Task.Run`にラムダ式を渡すことで処理しています。

`Task`の結果は余程の理由が無ければ`Await`で取得して下さい。

```vb:Booleanを返すタスクの例
Function AsyncFunc() As Task(Of Boolean)
    Return Task.Run(
        Function() As Boolean
            ' 何かしらの処理
        End Function)
End Function

' Awaitする場合は関数にAsyncを付ける
Async Sub Run()
    Dim task As Task(Of Boolean) = AsyncFunc() ' 呼び出し
    Dim result As Boolean = Await task ' Awaitで結果取得

    Console.WriteLine(result)
End Sub
```

# ファイル操作
以下は1つのファイルをコピーする例です。
ラムダ内でファイルコピーを呼び出しています。

```vb:単一ファイルをコピーする例
' SrcFileをDistDirにコピー
Function AsyncCopyFile(ByVal SrcFile As String, ByVal DistDir As String) As Task(Of Boolean)
    Return Task.Run(
        Function() As Boolean
            Try
                IO.File.Copy(SrcFile, IO.Path.Combine(DistDir, IO.Path.GetFileName(SrcFile)))
                Return True
            Catch ex As Exception
                Return False
            End Try
        End Function)
End Function
```

特定ディレクトリに一括でファイルコピーする場合、以下のように書けます。

```vb:一括でファイルコピーする例
Function AsyncCopyFiles(ByVal SrcFiles As List(Of String), ByVal DistDir As String) As Task(Of List(Of Boolean))
    Return Task.Run(
        Function() As List(Of Boolean)
            Return SrcFiles.Select(
                Function(ByVal SrcFile As String) As Boolean
                    Try
                        IO.File.Copy(SrcFile, IO.Path.Combine(DistDir, IO.Path.GetFileName(SrcFile)), True)
                        Return True
                    Catch ex As Exception
                        Return False
                    End Try
                End Function
            ).ToList
        End Function)
End Function
```

## 補足1: エラー処理について
今回は`Exception`を`false`にして握りつぶしていますが、実際のコードで使う場合には`Tuple`を使ったり、結果を表現する型を作って対応すべきだと思います。

## 補足2: ファイルコピーの別解
一括コピーは`Task`の配列を返す形式として以下のように書けないこともないですが、個人的に実験した所紹介した書き方のほうが速かったです。

```vb:Taskのリストとする例
Function AsyncCopyFiles2(ByVal SrcFiles As List(Of String), ByVal DistDir As String) As List(Of Task(Of Boolean))
    Return SrcFiles.Select(
        Function(ByVal SrcFile As String) As Task(Of Boolean)
            Return Task.Run(
                Function() As Boolean
                    Try
                        IO.File.Copy(SrcFile, IO.Path.Combine(DistDir, IO.Path.GetFileName(SrcFile)), True)
                        Return True
                    Catch ex As Exception
                        Return False
                    End Try
                End Function)
        End Function).ToList
End Function
```

# 参考にさせていただいた記事
- [Task\.Run Method \(System\.Threading\.Tasks\) \| Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.tasks.task.run?view=netframework-4.8)
- [C\# Taskの待ちかた集 \- Qiita](https://qiita.com/takutoy/items/d45aa736ced25a8158b3)
githubでtagを付け直すコマンドを作った

# はじめに

GithubのTagについていつも忘れてしまうのでまとめた
ついでに、同じタグを付け直すコマンドも作った
**注意：チームに迷惑がかかるので勝手に付け直すのはやめましょう**

# Tagの付け方

まずはローカルでタグを付ける

```
$ git tag <タグ名>              # 現在のブランチの最新のコミットに対してtagを作成
$ git tag <タグ名> <ブランチ名>  # 指定したブランチの最後のコミットに対してtagを作成
$ git tag <タグ名> <コミット>  # 指定したコミットに対してtagを作成
```

その後リモートにプッシュする

```
$ git push origin <タグ名>              # <タグ名>をリモートに作成
```

# Tagの消し方

まずはローカルでタグを削除する

```
$ git tag -d <タグ名>              # <タグ名>をローカルで削除
```

その後リモートにプッシュする

```
$ git push -d origin <タグ名>          # <タグ名>をリモートで削除
```

# Tagを付け直すコマンドの作り方

**gretag(git re tag)**というコマンドを作る
関数名は好きに決めてください

```:.bash_profile
function gretag() {
 git tag -d $1;                     # ローカルのタグを削除
 git push -d origin $1;             # リモートのタグを削除
 git tag $1;                        # ローカルでタグを作成
 git push origin $1;                # リモートにタグをプッシュ
}
```

```
$ source .bash_profile
$ gretag <タグ名> 
```
v0というタグをつけ直してみる

```
$ gretag v0
Deleted tag 'v0' (was 264e3c5)
To https://github.com/...
 - [deleted]         v0
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/...
 * [new tag]         v0 -> v0
```

# Tagをリネームする

タグをリネームすることもできるらしい
**なるべくこちらで解決しましょう**

手順は

- 新しいタグを同じタグ（コミット）に対して作成
- 古いタグを削除

```
$ git tag <new> <old>  # <old>と同じコミットに<new>というタグが新しくできる
$ git tag -d <old>      # もともと存在したタグを削除する
```

# 最後に

快適なGithubライフを！

# 参考

https://qiita.com/chihiro/items/cba40015b1aa2c73b78a
Ubuntu 18.04にOpenJDK 11をインストール（OS標準）

# はじめに

Ubuntu18.04にOpenJDKを標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit?usp=sharing) ([日本語版](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit?usp=sharing))では、”At least through Sept 2025” という記載がある。
ただしOSのEOLが2023-04のため、本手法で導入した場合2023-04がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。


## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

# apt update;apt install -y openjdk-11-jdk
... 略
```

### 各種確認

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

# java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3, mixed mode, sharing)
```
Ubuntu 18.04にOpenJDK 8(1.8)をインストール（OS標準）

# はじめに

Ubuntu18.04にOpenJDKを標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit?usp=sharing) ([日本語版](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit?usp=sharing))では、”At least through Sept 2023” という記載がある。またOSのEOLは2023-04となる。
ただし[Announcing OpenJDK 11 packages in Ubuntu 18.04 LTS | Ubuntu](https://ubuntu.com/blog/announcing-openjdk-11-packages-in-ubuntu-18-04-lts)により、2021-04までの保守になる模様。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。
[OpenJDK SRU exception](https://lists.ubuntu.com/archives/ubuntu-release/2018-February/004275.html)でも関連した言及あり。

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

# apt update;apt install -y openjdk-8-jdk
... 略
```

### 各種確認

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

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~18.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
```
Ubuntu 16.04にOpenJDK 8(1.8)をインストール（OS標準）

# はじめに

Ubuntu16.04にOpenJDKを標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit?usp=sharing) ([日本語版](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit?usp=sharing))では、”At least through Sept 2023” という記載がある。
2020年3月頃に [OpenJDK のライフサイクルおよびサポートポリシー \- Red Hat Customer Portal](https://access.redhat.com/ja/articles/1457743) が更新されたので、2026-05までopenJDK 1.8が保守される可能性がある。
ただしOSのEOLが2021-04のため、本手法で導入した場合2021-04がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```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 openjdk-8-jdk
... 略
```

### 各種確認

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

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~16.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
```
追記型のファイルの新しい部分だけダウンロードする

#課題
例えば、計測機器はデータを同一ファイル(CSV等)へ追記していくものが多い。この場合、機器から定期的にデータを取り出すには、繰り返してそのファイルをダウンロードする必要がある。しかしこの時ファイルの上部、つまり取得済み部分は毎回送って欲しくない。なぜなら、ムダな通信にあたるから。

#対策
wget では "-c" を付ければ、新しい追加部分だけのダウンロードが可能で、通信量を減らすことができる。(注意点あり)

#説明
オプション -c(--continue) は、ダウンロード中断の再開時に使用されるが、
https://www.gnu.org/software/wget/manual/wget.html
にも詳しく記述されているように、「受け入れディレクトリにリモートファイルと同じ名前のローカルファイルが存在するなら、それをリモートファイルの上部であるとみなして、そのバイトサイズだけオフセットさせた部分のみをダウンロードしてローカルファイルの後方へ追加させる」という動作をするオプションである。
つまり「追記されたデータやログの新しい部分だけ取得できる。」
![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481244/f4607623-44d2-98df-5789-5933129f5352.png)



もちろん、ファイルサイズが意図せず変化するとズレるので、

1. ダウンロードしたファイルを移動、変更しないこと
2. ダウンロード元のファイルの上部が変更されないこと
3. 転送中断時にそのシグナルをファイルに挿入(未確認)されるケースがあること

が注意点である。

#追記
一方 curl は、"-C -"を付ける。なお、こちらはオフセット量を変更することもできるそうです。両方知りませんでしたのでメモ。
nmcli でよく使うコマンドまとめ


CentOS 7 で確認。nmcli のバージョンは 1.18.0-5.el7_7.1。

### ホスト名を変更
```
nmcli general hostname <ホスト名>
```

`nmcli g h <ホスト名>` でもよい。

### ネットワークデバイスの状態を表示
```
nmcli device status
```

`nmcli d` でもよい。

### 定義されている接続のリストを表示
```
nmcli connection show
```

`nmcli c s` でもよい。

### 接続の詳細を表示
```
nmcli connection show <接続ID>
```

`nmcli c s <接続ID>` でもよい。
特定のセクションを表示するには、`-f <セクション>` をつける。

### 接続
```
nmcli connection up <接続ID>
```

`nmcli c u <接続ID>` でもよい。
接続がすでに有効になっている場合、切断してから再接続する。

### 切断
```
nmcli connection down <接続ID>
```

`nmcli c d <接続ID>` でもよい。

### 接続の詳細を変更
```
nmcli connection modify <接続ID> <設定名> <設定値>
```

`nmcli c m <接続ID> <設定名> <設定値>` でもよい。
設定を追加/削除する場合は設定名の前に`+`/`-`をつける。
Ubuntu 14.04にOpenJDK 7(1.7)をインストール（OS標準）

# はじめに

Ubuntu14.04にOpenJDKを標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit?usp=sharing) ([日本語版](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit?usp=sharing))では、”At least through to June 2020” という記載がある。
ただしOSのEOLが2019-04のため、本手法で導入した場合2019-04がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

また[SecurityTeam/ESM/14.04 - Ubuntu Wiki](https://wiki.ubuntu.com/SecurityTeam/ESM/14.04)によるとExtended Security Maintenanceの対象外となる。

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.6 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.6 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

# apt update;apt install -y openjdk-7-jdk
... 略
```

### 各種確認

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

# java -version
java version "1.7.0_201"
OpenJDK Runtime Environment (IcedTea 2.6.17) (7u211-2.6.17-0ubuntu0.1)
OpenJDK 64-Bit Server VM (build 24.201-b00, mixed mode)
```
Ubuntu 14.04にOpenJDK 6(1.6)をインストール（OS標準）

# はじめに

Ubuntu14.04にOpenJDKを標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit?usp=sharing) ([日本語版](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit?usp=sharing))では、”Supported primarily by Azul systems” という記載がある。
Azul systemsが提供する無償版OpenJDKとなる[Zulu Community](https://www.azul.com/products/zulu-community/)では2019-12まで保守される模様。
ただしOSのEOLが2019-04のため、本手法で導入した場合2019-04がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

また[SecurityTeam/ESM/14.04 - Ubuntu Wiki](https://wiki.ubuntu.com/SecurityTeam/ESM/14.04)によるとExtended Security Maintenanceの対象外となる。

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.6 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.6 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

# apt update;apt install -y openjdk-6-jdk
... 略
```

### 各種確認

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

# java -version
java version "1.6.0_41"
OpenJDK Runtime Environment (IcedTea6 1.13.13) (6b41-1.13.13-0ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 23.41-b41, mixed mode)
```
Debian 10にOpenJDK 11をインストール（OS標準）

# はじめに

Debian10にOpenJDKを標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit?usp=sharing) ([日本語版](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit?usp=sharing))では、”At least through Sept 2025” という記載がある。
しかし[Red Hat Enterprise Linux Life Cycle - Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/errata)に記載されているRed Hatの保守期間と差が大きすぎる。
またOSのEOLも不明瞭（そのうちELSが出る可能性がある）なため、EOLは未確定。
2024後半から2025年以内、くらいじゃないでしょうか。

[Debian7の事例](https://www.debian.org/News/2016/20160425.ja.html)のようにOSがEOLを迎えるまでは[Debian Javaチーム](https://java.debian.net/)が保守する可能性が高いと思われる。

## LOG

### インストール

```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 openjdk-11-jdk
... 略
```

### 各種確認

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

# java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Debian-1deb10u1)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Debian-1deb10u1, mixed mode, sharing)
```
Debian 9にOpenJDK 8(1.8)をインストール（OS標準）

# はじめに

Debian9にOpenJDKを標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit?usp=sharing) ([日本語版](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit?usp=sharing))より、Red Hat主導でコミュニティが2023-09まで無償アップデートを行うという記載がある。
2020年3月頃に [OpenJDK のライフサイクルおよびサポートポリシー \- Red Hat Customer Portal](https://access.redhat.com/ja/articles/1457743) が更新されたので、2026-05までopenJDK 1.8が保守される可能性がある。
ただしOSのEOLが2022中なので、本手法で導入した場合2022中にEOLを迎えると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

[Debian7の事例](https://www.debian.org/News/2016/20160425.ja.html)のようにOSがEOLを迎えるまでは[Debian Javaチーム](https://java.debian.net/)が保守する可能性が高いと思われる。

## LOG

### インストール

```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 openjdk-8-jdk
... 略
```

### 各種確認

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

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1~deb9u1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
```
【Vue.js】人生初のテトリスを作ってみた

テトリスを作るのは今回が初めてで、基本的な実装方法は知らず、思うがまま作っています。

細かい仕様や実装については以下のブログに記載しているの、ご興味ある方は参考にしていただければと思います。

[ブログ記事](https://b1tblog.com/?p=349&preview=true)

実装についてアドバイスなどあれば教えていただけると幸いです。


# 完成品

<p class="codepen" style="height: 783px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-height="783" data-theme-id="0" data-default-tab="result" data-user="b1san1" data-slug-hash="VwwZExv" data-pen-title="VwwZExv">See the Pen <a href="https://codepen.io/b1san1/pen/VwwZExv">
VwwZExv</a> by b1san (<a href="https://codepen.io/b1san1">@b1san1</a>)
on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

コードペンのページは[こちら](https://codepen.io/b1san1/pen/VwwZExv)
Debian 8にOpenJDK 7(1.7)をインストール（OS標準）

# はじめに

Debian8にOpenJDKを標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit?usp=sharing) ([日本語版](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit?usp=sharing))より、Red Hat主導でコミュニティが2020-06まで無償アップデートを行うという記載がある。
OSのEOLも2020-06-30なので、本手法で導入した場合、2020-06がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

[Debian7の事例](https://www.debian.org/News/2016/20160425.ja.html)のようにOSがEOLを迎えるまでは[Debian Javaチーム](https://java.debian.net/)が保守する可能性が高いと思われる。


## LOG

### インストール

```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 openjdk-7-jdk
... 略
```

### 各種確認

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

# java -version
java version "1.7.0_231"
OpenJDK Runtime Environment (IcedTea 2.6.19) (7u231-2.6.19-1~deb8u2)
OpenJDK 64-Bit Server VM (build 24.231-b01, mixed mode)
```
【簡単】CentOSでかな入力(かな切替)をする方法【日本語入力】

## 1.事前知識
- [【超簡単】WindowsにVirtualBoxをインストールする方法](https://qiita.com/ryome/items/519fd7e50fb0b951fd7f)
- [【画面あり】VirtualBoxでCentOSの仮想環境を作る方法](https://qiita.com/ryome/items/e55caf5bed345f95451d)

事前知識として、上記リンクの内容が必要です。

## 2.CentOSでかな切替をする方法
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/36175015-4429-385f-c6ec-5376acc79f0c.png)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/db4f0682-fdd6-7631-92f6-c789d24d2b66.png)
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/b23708a7-5c03-0ccc-b389-8efefb6d189e.png)
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/bd964db3-bed9-3044-5c0a-3b0dc439fc08.png)
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/cb9f4afb-6661-3f98-6758-03e1f3fa202f.png)
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/dcc487b3-5f4a-12fa-e4a1-d44bfaf61a53.png)
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/da59f650-c93b-0aa4-7004-23106376ccb2.png)


- `Windowsキー` + `Spaceキー` を押してもかな入力ができない人向けです。

1. メニューの `アプリケーション` から `システムツール` の `設定` をクリックする。
- `設定` の `地域と言語` を選択し、 `入力ソース` の `＋ボタン` をクリックする。
- `入力ソースの追加` で `日本語` を選択する。
- `日本語(かな漢字)` を選択し、 `追加` をクリックする。
- `日本語(かな漢字)` が追加されているのを確認する。
- メニューの `アプリケーション` から `アクセサリ` の `テキストエディター` をクリックする。
- `Windowsキー` + `Spaceキー` を押し、 `かな入力` が出来れば成功です。


## 3.関連
- [【簡単!!】VirtualBoxのホストOSとゲストOS(仮想環境)間のマウスポインターの移動方法](https://qiita.com/ryome/items/07a908bbbad27d35cd2e)
- [CentOSでネットワークを有効化する方法](https://qiita.com/ryome/items/781e0cdcf8221ea80f85)
- [【超簡単!!】CentOSにLAMP環境を構築する方法](https://qiita.com/ryome/items/931abd54c9b8a46c9722)
- [【初心者でも簡単!!】WordPressをダウンロード及びインストールする方法](https://qiita.com/ryome/items/ca73897b67dc9c4a3df0)
Xdebugを使えるDockerローカル開発環境

## 前提
ローカル(自PC)に Docker Desktop で開発環境を構築する場合を想定しています。
LAN内の別PC・サーバーやVPS、AWS・GCP等のクラウド上での設定にはあわないのでご注意を。

## ローカル開発環境の作成
Xdebug をインストールした php-fpm と Nginx の環境を作成します。
1つディレクトリを作成してその中で作業してください。

### Xdebug設定
Xdebugの設定ファイルを作成します。
デバッグ(ステップ実行)するかはIDE側(PhpStormなど)で切り換える使い方になります。

```ini:docker-php-ext-xdebug.ini
zend_extension = xdebug.so

xdebug.remote_enable = "1"
xdebug.remote_autostart = "1"
xdebug.remote_host = "host.docker.internal"
```

| 項目 | 設定内容 |
|---|---|
| xdebug.remote_enable | リモートデバッグを有効化 |
| xdebug.remote_autostart | リモートデバッグを自動で開始 |
| xdebug.remote_host | リモートデバッグの接続先ホスト(自PC) |

Docker Desktop 環境ではリモートホストに `host.docker.internal` を指定します。

### php-fpm
Xdebug をインストールした php-fpm のコンテナを作成します。

```dockerfile:Dockerfile
FROM php:7.3-fpm-alpine3.10

RUN : "Install build dependencies ..."; \
    set -xe; \
    apk add --update --no-cache -t .build-deps \
        autoconf \
        build-base; \
    : "Install Xdebug ..."; \
    pecl install xdebug; \
    : "Cleanup ..."; \
    apk del --purge .build-deps; \
    pecl clear-cache;
```

PECLを使って Xdebug をインストールします。
インストールの段階では Xdebug の有効化はせず、Docker Compose のボリューム設定を使って Xdebug 設定ファイルをマウントして有効化します。

### Nginx設定
Nginx のコンテナを動作させるための最小限の設定ファイルを作成します。

```nginx:nginx-php-fpm.conf
server {
    listen 80 default_server;
    root /var/www/html/public;

    index index.html index.php;

    charset utf-8;

    access_log  /dev/stdout;
    error_log   /dev/stderr;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    location ~ /\.ht {
        access_log off;
        log_not_found off;
        deny all;
    }
}

```

### Docker Compose
php-fpm と Nginx を実行するための Docker Compose 設定を作成します。

```yml:docker-compose.yml
version: '3'

services:
  php-fpm:
    build:
      context: ./
      dockerfile: Dockerfile
    environment:
      PHP_IDE_CONFIG: "serverName=MyApp"
    expose:
      - "9000"
    volumes:
      - .:/var/www/html
      - ./docker-php-ext-xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini:ro

  nginx:
    image: nginx:1-alpine
    expose:
      - "80"
    ports:
      - "80:80"
    volumes:
      - ./nginx-php-fpm.conf:/etc/nginx/conf.d/nginx-php-fpm.conf
```

| 項目 | 設定 |
|---|---|
| PHP_IDE_CONFIG | PhpStorm でコンソール実行のデバッグをするための設定 |

### index.php
テスト用に実行するPHPファイルを作成します。

```php:public/index.php
<?php
declare(strict_types=1);

if (PHP_SAPI === 'cli') {
    echo PHP_VERSION;
    return;
}

echo phpinfo();
```

## 環境を起動する

```shell
docker-compose up
```

`http://127.0.0.1` にブラウザでアクセスしてPHP情報が表示されたらOKです。
リモートマシン上でのJupyterLabの設定

自分用にまとめたメモです．
設定のいくつかは意味まで把握しているわけではありません．
サーバはubuntu，ローカルはUNIX系OSです．

## 1. JupyterLabのインストール (サーバでの作業)
まずインストールから`config`ファイル作成まで

```
$ pip install jupyter
$ pip install jupyterlab
$ pip install --upgrade "ipython[all]"
$ python -c 'from notebook.auth import passwd;print(passwd())' # パスワードを設定
Enter password:
Verify password:
sha1:***** # ここで表示される文字列をコピーしておく
$ jupyter notebook --generate-config # configファイルが作成される
```

## 2. 作成された`config`ファイルの編集 (サーバでの作業)
作成された`config`ファイルに以下の内容を追記 (もしくは該当箇所のコメントを外して適切な内容に書き換える)

```python:jupyter_notebook_config.py
c = get_config()
c.IPKernelApp.pylab = 'inline'
c.NotebookApp.allow_origin = '*' # 外部通信も含めて使用可能に (?)
c.NotebookApp.ip = '0.0.0.0' # どのIPアドレスからもアクセスを許可
c.NotebookApp.password = 'sha1:*****' # 先ほどコピーした文字列をここに
c.NotebookApp.open_browser = False # ブラウザの自動起動を無効化
c.NotebookApp.port = [abc] # jupyter lab自体が使うポート番号の指定
c.NotebookApp.notebook_dir = '<DIRPATH>' # デフォルトで開くディレクトリの指定
```

## 3. ローカルマシンの./ssh/configを編集
次の一行を追記
`LocalForward [def] localhost:[abc]`
これで`localhost` (リモートマシン，サーバ) のabc番のポートを，ローカルマシンのdef番ポートに渡してくれる．ブラウザで起動する時には，URL中に`def`が入るはず...
ダイエット関数を活用！この秋に痩せます

# 注意事項
⚠⚠⚠本記事はいかなる責任も取りかねます🔪🔪🔪

**\ JUST DO IT !!!!! /**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330109/dea03c26-5aa8-7e1b-8f73-f542887f03e3.png)

# ダイエット関数とは
太ってしまった、社会人になってから。~~これはどう考えても社会が悪いナ😡~~
以前、[半年間で18kg減らした](https://dic.nicovideo.jp/id/889596)ことがあるが、重要だったのは数値計算だった。
そのとき使っていた計算式をプログラミング化したものが下記である。

```JavaScript
/**
 * ダイエット関数
 * @param {int} metabolism    - 基礎代謝+運動量
 * @param {int} dailyCalorie  - 本日の摂取カロリー
 * @param {float} weight      - 現在の体重
 */
const diet = (metabolism, dailyCalorie, weight) => {
    const kcal = dailyCalorie - metabolism;
    return ((weight * 7200) + kcal) / 7200;
}
```

- 引数として基礎代謝+運動量、一日の摂取カロリー、体重を受け取る
- 摂取カロリーから基礎代謝+運動量を引いて、体重増減に関わるkcalを計算
- 体重をカロリー換算(×7200)し、体重増減に関わるkcalを足してから元に戻す
- それが体重の増減

**これがダイエット関数である😇**
※実際こんなに単純ではないが、かなり参考になる計算方法ではある。
色々と試すと簡単に痩せることなんてできないことがわかるだろう🍖
例:70kgの人が45000kcalの消化すると6kg痩せる。

## サンプルコード
基礎代謝+運動量、一日の摂取カロリー、体重を入力すると体重の増減がわかる。

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="sapporo_east_k" data-slug-hash="qBBBjEE" 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="diet">
  <span>See the Pen <a href="https://codepen.io/sapporo_east_k/pen/qBBBjEE">
  diet</a> by かんちゃん (<a href="https://codepen.io/sapporo_east_k">@sapporo_east_k</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

基礎代謝が分からない人は[ここ](https://keisan.casio.jp/exec/system/1161228736)で出せるが、最近の体重計は基礎代謝が出せるらしいので、そっちのほうが正確な値がわかって良さそうだ。

## ヒトは弱い。続かないものだ

**Twitterを[活用](http://it-geinin.org/diet/diet.html)するのです。**

http://it-geinin.org/diet/diet.html で摂取kcalを公開しましょう。食べ過ぎが恥ずかしくなるので、嫌でも減量できるはず。~~デザインがひどい~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330109/5fb7d0ff-fe8e-17d3-508e-8d7f7a8efa56.png)
**~~タピオカとかラーメンの画像はもう挙げてはいけない。俺が許さない~~**


## 基礎代謝をあげるべき
走る等で運動量を増加させれば、必然的に体重は下がるが、オススメは基礎代謝の増加！

その方法とは**筋トレ**！ 肩こりの解消にもつながるぞ★
![200w.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330109/ccfa8ebf-e53a-b93b-f80c-129dfecea78c.gif)

逆に食事制限はやり過ぎないように気をつけましょう。宣伝ではありませんが1食400kcalのBASE FOODというモノをほぼ毎食食べてます。同じものを食べるとkcalが計りやすいですね（※常人は3食同じものを食べる行為をすべきではありません）

### 完
現実世界の事象をプログラム化するのは大事ですね。「痩せたいいね」と思ったら「いいねボタン」を押してくださると頑張って痩せれます。
Djangoでwebサービスを作る2

#実際にファイルをいじってみる

##projec/\<project名>/settings.pyをいじる
INSTALLED_APPS内に

```
'\<apprication名>.apps.\<Apprication名Config>',
```
を追加。
下の方に行って
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

##projec/\<project名>/urls.pyをいじる
django.urlsのincludeをインポート
urlpatternsに以下を追加

```
#http://localhost:8000/<apprication名>が呼び出された時に
#<apprication名>.urlsファイルを見に行く
path('<apprication名>/', include ('<apprication名>.urls')),
```

##\<apprication名>/urls.pyをいじる
django.urlsのpathをインポート
from . import views

```
app_name = '\<apprication名>'
```

urlpatternsに下記を追加

```
#http://localhost:8000/<apprication名>が呼び出されたら
#views.indexを表示
path('', views.index(viewsファイルに定義された関数名index), name='index'),
#例えば<apprication名>/aboutが呼び出された場合に表示したいものは
#path('about', views.about, name='about'),などとする
```

##\<apprication名>/views.pyをいじる

```
from django.shortcuts import render
#indexというhtmlファイルを表示する
def index(request):
	return render(request,'<apprication名>/index.html')
```
renderはURLで指定された変数を受け取り、第二引数のページに飛ぶ
redirectは指定したページに直接飛ぶ

##templatesフォルダ作成
下記を作成
\<apprication名>/templates/\<apprication名>/htmlファイル

あとはhtmlファイルを作っていく。

##staticフォルダ作成
下記を作成
\<apprication名>/static/\<apprication名>/cssファイル

あとはcssファイルを作っていく。
(jsとか画像とかもこのフォルダに入れておく)

##htmlファイルでcssファイルを読み込む
htmlファイルに下記追記

```
{% load static %}
    <link rel="stylesheet" type="text/css" href="{% static '<apprication名>/<cssファイル名>' %}">
```
Gitについて勉強する。第六弾 (プルリクエストについて 編)

# プルリクエストとは？
githubには色んな人がソースコードをアップすることができるのですが、中身も確認せずに判断するのは、品質の担保もしづらいし難しいです。
そんなときに、一度リクエストを送ってレビューを挟むことによって、ソースコードの品質を担保できる仕組みがプルリクエストだそうです。

# 一連の流れ
1. githubにpushする。
2. github上で「create pull request」ボタンからプルリクエストを作成する。
3. チームメンバーにコードレビューをお願いする。
4. レビューが通るまで、やり取りする。
5. github上で「merge」ボタンからmergeをします。
6. mergeができたら、今までのブランチを消します。(ローカルブランチも消しておきましょう)

# GitHub Flowとは
githubを用いてチーム開発するのに、GitHub社のワークフローであるGitHub Flowというやり方があるそう。
オーソドックスなやり方らしいので初心者はこのやり方に沿っていくのが良いとのことです。

## GitHub Flowの流れ
1. masterブランチを取得する。
2. ローカルで開発用のブランチを作成する。
3. 作業が完了したら、作業した(開発用に作ったブランチ)ブランチでpushする。
4. pull requestを行う。
5. レビューOKなら、masterブランチにマージする。

## GitHub Flowのポイント
* masterブランチは、常にデプロイできる状態にする。
* 新開発は、masterブランチから、新しいブランチを作成して行う。
* 作成したブランチ上で、作業してコミットする。
* キリが良いところで、適度にpushする。(こうしておくと、他のチームメンバーが自分の作業内容を確認できる。)
* masterにマージするためにPullRequestする。
* レビューをする。
* masterブランチにマージしたら、その時点で本番デプロイする。(そのためにも、テストとデプロイは自動化しておく)

[次・第七弾](https://qiita.com/hajime_manul/items/4008017159e3bd752722)
Jupyter Lab ショートカット一覧(Windows) とキー割り当て変更方法

#【概要】

書籍 [スッキリわかるPython入門](https://book.impress.co.jp/books/1118101169)を読みJupyter Labを使い始めたのですが、
**Jupyter Notebook**のショートカット一覧は調べればすぐ見つかるものの、
**Jupyter Lab**のWindowsショートカット一覧はあまり無く、探すのが大変だったので、個人的備忘も兼ねて下記に記載します。

また、**Jyupiter Lab内でのショートカットキー一覧の見方**と**ショートカット割り当ての変更方法**も記載します。

#【Jupyter Lab ショートカット一覧】
※初期状態の場合

|内容	     |キー割り当て |
|:-----------|:------------|
|Change to Code Cell Type	|Y	|
|Change to Heading 1	|1	|
|Change to Heading 2	|2	|
|Change to Heading 3	|3	|
|Change to Heading 4	|4	|
|Change to Heading 5	|5	|
|Change to Heading 6	|6	|
|Change to Markdown Cell Type	|M	|
|Change to Raw Cell Type	|R	|
|Clear Outputs	|未割り当て	|
|Collapse All Code	|未割り当て	|
|Collapse All Outputs	|未割り当て	|
|Collapse Selected Code	|未割り当て	|
|Collapse Selected Outputs	|未割り当て	|
|Copy Cells	|C	|
|Cut Cells	|X	|
|Delete Cells	|D, D	|
|Disable Scrolling for Outputs	|未割り当て	|
|Enable Scrolling for Outputs	|未割り当て	|
|Expand All Code	|未割り当て	|
|Expand All Outputs	|未割り当て	|
|Expand Selected Code	|未割り当て	|
|Expand Selected Outputs	|未割り当て	|
|Extend Selection Above	|Shift+K	|
|Extend Selection Below	|Shift+J	|
|Insert Cell Above	|A	|
|Insert Cell Below	|B	|
|Merge Selected Cells	|Shift+M	|
|Move Cells Down	|未割り当て	|
|Move Cells Up	|未割り当て	|
|Paste Cells Above	|未割り当て	|
|Paste Cells and Replace	|未割り当て	|
|Paste Cells Below	|V	|
|Redo Cell Operation	|Shift+Z	|
|Run Selected Cells	|Shift+Enter	|
|Run Selected Cells and Don't Advance	|Ctrl+Enter	|
|Run Selected Cells and Insert Below	|Alt+Enter	|
|Run Selected Text or Current Line in Console	|未割り当て	|
|Select Cell Above	|K	|
|Select Cell Below	|J	|
|Split Cell	|Ctrl+Shift+-	|
|Undo Cell Operation	|Z	|


#【Jupyter Lab内でのショートカット一覧の見方】

Jupyter Labを起動し、**左ペインのパレットマークをクリック**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211328/32dcb876-5bf0-ae90-8dfc-f7eb80390c64.png)



検索ボックスに**「notebook cell operations 」**と入力。
すると、ショートカット一覧を見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211328/33d9f769-b4ba-448e-49f0-60b41880d025.png)



#【ショートカットキー割り当ての変更方法】
**「Settings」**から、**「Advanced Settings Editor」**を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211328/0535e34c-2e92-24d9-034a-28591726c4cc.png)
  

すると、下記のような画面に切り替わるので、
**右側のUser Preferencesに変更したいキー割り当てを入力し、保存。**
(下画像は、ノートブックのセルを消すコマンドを**「D+D」から「Delete」**に変更した場合\)




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211328/ca0ed797-1ace-4714-a0f2-991ff98bd58e.png)


##**【キー変更方法 詳細】**
初期で{ }が上記画像の「User Preferences」ペインに書かれているので、その中に下記の要領で記載していきます。

**①"shortcuts": [ ]を入力**
**②上記の角カッコの中にcommand・keys・selectorを書き入れていく。**
　※command・selectorは「System Defaults」ペインの中を漁って、変更したいものと同じにすればOK!
　　keysは他のデフォルトコマンドを見ながら書いていく。 
　　(なお、WindowsにおけるCtrlは「Accel」と表記されているようです。\)

  　　
ノートブックのセルを消すコマンドを「D+D」から「Delete」に変更したい場合は下記のようになります。

```json
"shortcuts": [
    {
            "command": "notebook:delete-cell",
            "keys": [
                "Delete"
            ],
            "selector": ".jp-Notebook:focus"
        }
  ]
```

  　　
以上になります。

Jupyter Labはまだまだ日本語情報が少ないので、
しばらくは手探りで調べる必要がありそうですね。