OmniAICreator/Qiita-1.07M huggingface dataset:
iTermのログを出力する。（我々初学者はやるべき）

# why?

昨日初投稿としてこんな記事を書きました
[vagrantでMySQL勉強用にcentos7で環境構築 + Linuxbrew](https://qiita.com/shoicchi/items/122502c915c939b1cc59)
つまり、これからMySQLを勉強します。

とりあえずドットインストールのMySQL入門を進めていこうと思っていて
MySQLを叩いてるログを出力して後からコメントアウト足していって
備忘録にしちゃえ、とそんな経緯で至ってます。


# 初学者はやるべき　の意味。



「よっしゃー！Dockerにanacondaでこうしてこうしてこうだーっ」て張り切ってたときに
スクールのメンターさんから

「環境構築立てる時はくどいぐらいログ残した方がいいですよ。

コマンドと結果全部コピーして、時間ある時に1行ずつ読むぐらいがいいです。

ぼんやり依存関係にあるライブラリとか見えてきますよ。」

って言われてたんですね、そういえば。。。
さらに言うと、我々みたいな初学者ってやっぱ行き詰まって誰かに助けを求めること多いと思うんです。
そういったときに、助ける側の人間にとって必要な情報は
-================-
1.　どういう状態から
2.　何がしたくて
3.　実際に何をして
4.　どうなっているか
-================-
これだと思うんです。
そんな時の為にもログは残しましょう。

#### 教えを乞う＝相手の時間をいただく
だからこそ、
それなりの環境作り、姿勢、相手への理解
が必要不可欠だと思います。


# さあ設定！
と言ってもすっごい簡単です。
ググったら一瞬で出てきた。

## まずはどこにログを出すか。


`/Users/shoji/terminal_logs
`

自分の場合はこうしてterminal_logsってディレクトリを作りました。

そして

## iTerm2の設定

iTerm2起動したら上部メニューから

Preferences
　>Profiles
 　　>Session
の中のAutomatically log session input to files in:
ってとこに
チェックを入れて窓の中にさっき作ったディレクトリをペッ。

<img width="917" alt="スクリーンショット 2019-10-07 19.55.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475554/ab347131-d849-f86c-73fc-1e39339817ba.png">


こんな感じですね。
これで完了です。簡単。

あとはカタカタっと適当に打って確認するとログ

<img width="1380" alt="スクリーンショット 2019-10-07 20.06.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475554/bc406ab1-c610-a89d-4994-eb0c7157d194.png">

できてます。

完璧。ただ、、、




## もしも




カタカタっと打ってあれ、ログ

**出てねえ。**

って人は


<img width="441" alt="スクリーンショット 2019-10-07 19.00.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475554/83182eff-a2d6-3d70-396c-9ec1412bc8c8.png">


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓


<img width="53" alt="スクリーンショット 2019-10-07 19.01.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475554/d68cbd46-aa71-cbd3-d5b2-2310ae87d96e.png">

こんな感じになってたら、ディレクトリの書き込み権限がない場合です。
一回これ、あれっ？あれっ？てなりました。

「iTerm ログ　出力　できない」

[こちら](https://sh0e1.com/posts/230/)がヒットしました。
求めていたものそのまま。
ありがとうございます。


見つけた記事通りに行くと

```zsh
$ ls -la ~/Desktop/work/vagrant/centos7/| grep mysql-lesson
drwxr-xr-x  6 shoji  staff   192 10  7 18:52 mysql-lesson
```
で権限を確認

```zsh
$ sudo chown :admin ~/Desktop/work/vagrant/centos7/mysql-lesson
Password:
```

でグループをadminにして


```zsh
$ sudo chmod 775 ~/Desktop/work/vagrant/centos7/mysql-lesson
```
でadminグループに書き込み権限を付与

```zsh
$ ls -la ~/Desktop/work/vagrant/centos7/| grep mysql-lesson
drwxrwxr-x  6 shoji  admin   192 10  7 18:52 mysql-lesson
```

確認すると、なるほど確かに。

そういえばPFをデプロイしたときにこんなコマンドで権限確認したり変更してたなあと、
そもそもUNIXコマンドちゃんと覚えてこい、勉強してこいって話ですね。

⚠️の人もこのあと、iTerm再起動したらいけてるはずです。
ハッピーセットのおもちゃをコンプリートする確率

YouTuberのセイキンさんが
[『大人が全力で新作ハッピーセット「スーパーマリオ」全種類集めてみた。』](https://www.youtube.com/watch?v=ZIr75Fgz7ro)
という動画でハッピーセットを20個購入し、おもちゃ10種類をコンプリートしていました。

運がいいような気もしますが、実際にこの条件でおもちゃをコンプリートする確率はいくつでしょうか。
気になったので、数学とPythonを使ってこの確率を求めてみます。

以下の流れで進めます。

- 数学で一般の場合について考察(問1)
- Pythonで実際の確率を計算(問2)

# 問1

ハッピーセットを $m$ 個購入したとき、おもちゃ $n$ 種類をコンプリートする確率はいくつか？

# 解1

$m < n$ ならば求める確率は $0$ である。
$m \geq n$ とする。

以降の計算を簡単にするため、 $k = m - n \geq 0$ とおく。
ハッピーセットを $m = n + k$ 個購入し、おもちゃ $n$ 種類をコンプリートする確率 $p_{n k}$ を求める($n \geq 1,\, k \geq 0$)。

おもちゃの当たり方は、全部で $n^{n + k}$ 通りある。
この中で、おもちゃをコンプリートする場合の数を $a_{n k}$ とする。

```math
a_{1 k} = 1,\, a_{n 0} = n!
```

である。また、おもちゃをコンプリートする場合は、最後の1個の購入でちょうどコンプリートする場合と、それ以前に既にコンプリートした場合に分けられるため

```math
a_{n k} = n (a_{n - 1, k} + a_{n, k - 1})
\hspace{1em}
(n \geq 2,\, k \geq 1)
```

が成り立つ。この漸化式を解くと

```math
a_{n 0} = n!,
\hspace{1em}
a_{n k} = n!
\sum_{1 \leq i_1 \leq \cdots \leq i_k \leq n} i_1 \cdots i_k
\hspace{1em}
(k \geq 1)
```

となる。ただし右辺の $\sum$ は、 $1 \leq i_1 \leq \cdots \leq i_k \leq n$ を満たすような自然数の組 $i_1, ..., i_k$ 全体について積 $i_1 \cdots i_k$ の和をとったものである。
よって求める確率 $p_{n k} = a_{n k} / n^{n + k}$ は

```math
p_{n 0} = \frac{n!}{n^n},
\hspace{1em}
p_{n k}
=
\frac{n!}{n^{n + k}}
\sum_{1 \leq i_1 \leq \cdots \leq i_k \leq n} i_1 \cdots i_k
\hspace{1em}
(k \geq 1)
```

となる。

# 問2

ハッピーセットを $20$ 個購入したとき、おもちゃ $10$ 種類をコンプリートする確率はいくつか？

# 解2

解1をもとに、ハッピーセットを $20$ 個購入し、おもちゃ $10$ 種類をコンプリートする確率をPython 3で計算します。

ただし、漸化式を解いた結果は逆に扱いづらいので、残念ですが漸化式そのものを扱うことにしましょう。


```py
import functools
import math


@functools.lru_cache()
def a(n: int, k: int) -> int:

    if n == 1:
        return 1

    if k == 0:
        return math.factorial(n)

    return n * (a(n - 1, k) + a(n, k - 1))


def p(n: int, k: int) -> float:
    return a(n, k) / (n ** (n + k))


if __name__ == '__main__':
    print(p(n = 10, k = 10))  # n + k = 20, k = 10
```

結果は

```
0.21473732319740063
```

約 $21.5$ %でした。
セイキンさんはラッキーだったようですね。
ESlintでerror  'Vue' is not defined が出たら

# ESlintでerror  'Vue' is not defined が出たら

何でエラーでるん！？

```
error  'Vue' is not defined
```

ということでgitHubで他人のコード眺めていたら直ぐに解決した内容をまとめて見ます。

## 1. `.eslintrc`ファイルのextendsにvueを追加する

ESlintのVueのプラグインを導入します。

```
$ npm install --save-dev eslint eslint-plugin-vue
```

設定ファイルに下記の用にextendします。
※例はyml形式ですが色んな拡張子が選べます。

```ym;:.eslintrc.yml
extends:
  - 'plugin:vue/recommended'
```

## 2. `.eslintrc`ファイルのglobalsにVueを許可していない

Vueをグローバルとして許可しましょう！

```ym;:.eslintrc.yml
globals:
  Vue: true
```

## 参考
https://qiita.com/sympe/items/f6473c45d45c7be271e5
https://eslint.org/docs/user-guide/configuring
62日目　ゴミを捨てるのがだるいので、ゴミを捨てるんだボタンを作りました。


今朝ふとゴミを捨てるのにどんくらい時間がかかっているか計ってみたら、２分５７秒かかっていました。約３分。だるい時は動きたくないし、急いでいるときは無理すぎです。

そんなわけで、ゴミを捨てるボタンを作ってみました。

###機能
・URLを開く
・カウント開始
・ゴミを集める
・袋に入れる
・つぶす
・指定ゴミ袋に入れる
・ごみ捨てばに持っていく
・最後にツイート
・めっちゃ褒めるエフェクト

###URLを開いてカウント開始
Javascriptで作れそうです。
https://www.tagindex.com/javascript/time/timer1.html

###ゴミを集めて袋に入れる
###ゴミ捨て場に持っていく
ここを自動化したいのですが、今の技術力では難しい・・・どうにかしたい！

###最後にツイート
ツイッターのURLにパラメーターを渡せば良さそうですね。
https://qiita.com/coconeko/items/dcd3a004578e02f63da5

###ボタンのCSSはこちらからいただきました。
https://saruwakakun.com/html-css/reference/buttons

###めっちゃ褒めるエフェクト
ゴミをすてるとファンファーレと花火があがり拍手喝采がわきおこるエフェクトがほしい・・・のですが、どうにもならなかったので、ほめてください！！！

###完成！
さあこれで明日からがんばれる！！！

ゴミ捨てるんだ ボタン
http://appdays.herokuapp.com/tr_timer/


``` trash.js
var PassSec=0;   // 秒数カウント用変数 

// 繰り返し処理の中身
function showPassage() {
   PassSec++;   // カウントアップ
   var msg = "";
   var m = Math.floor(PassSec/60);
   var s = Math.floor(PassSec%60); 

   msg = + m + "分" + s + "秒";  // 表示文作成
   var str = "";
    str = str  + `<div class='contents'>`;
    str = str  + `<a href="https://twitter.com/intent/tweet?text=${msg}でごみをすてたよっ！&hashtags=ほめて" onClick="window.open(encodeURI(decodeURI(this.href)), 'tweetwindow', 'width=650, height=470, personalbar=0, toolbar=0, scrollbars=1, sizable=1'); return false;" rel="nofollow" class="twitter-link">`
    str = str  + `<div class="btn-gradient-radius">`;
    str = str  + `<h3>すてた! </h3>`;
    str = str  + `</div>`

   document.getElementById("PassageArea").innerHTML = msg;   // 表示更新
   document.getElementById("button-area").innerHTML = str;   // 表示更新
}
setInterval(showPassage, 1000);
```
(所要時間　３時間）
【忘備録】win32comを使ったメール送信

# win32comを使ったメール送信

* Outlookのメールをpythonで送信
* バッチ内で使用し、ファイルの自動送信

```python
import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application")
my_ol = outlook.CreateItem(0)

# メールフォーマット：1 テキスト, 2 HTML, 3 リッチテキスト
my_ol.BodyFormat = 2 # HTML

my_ol.To = "送信先"
my_ol.Subject = "題名"
my_ol.Body = "本文"

# ファイルを添付(2個)
my_ol.Attachments.Add(r'保存先フォルダ' + r"\添付ファイル1.pdf")
my_ol.Attachments.Add(r'保存先フォルダ' + r"\添付ファイル2.pdf")

# my_ol.Display(True)
my_ol.Send()

```
React でVideoElement使った時の後処理


そのままにしておくとビデオがアクティブのままになっている。

ref.pause() やref.remove()　等では消えてくれなく


下記のやりかたが良いらしい。

```
MediaStream.getTracks().forEach(track => track.stop()); 
```

delete(this.ref)などでも対応できるらしいですが、安定、安全性では上記らしいです。
【Laravel5.8】二つの配列パラメータ数が同じバリデーションがほしい


二つの配列パラメータ数が同じバリデーションを追加したい。
一カ所だけでしか使わないからフォームリクエストを使うほどでもない。

どういうことかというとこんなかんじ。

```
// OK
test.php?name[]=100&value[]=980
test.php?name[]=100&value[]=980&name[]=200&value[]=2000
test.php?name[1]=100&value[1]=980

// NG
test.php?name[]=100&value[]=980&name[]=200
test.php?name[]=100&value[]=980&value[]=2000
test.php?name[1]=100&value[2]=980
```

たとえば商品IDと個数、みたいなセットで送る必要のあるパラメータに使いたい。
その場合は`items[商品ID]=個数`とかのほうがいいだろうけど、3点以上のパラメータが必要だとか、色々とそうもいかないことがあるわけですよ。


```php:コントローラ
    // バリデータ
    $validation = [
        'name' => 'required|array',
        'name.*' => 'required|integer',
        'value' => 'required|array',
        'value.*' => 'required|integer',
    ];
    $v = Validator::make($request->all(), $validation);

    // パラメータ数が同じバリデーション
    $v->after(function ($validator) {
        $data = $validator->getData();
        if (!isset($data['name']) || !isset($data['value'])
            || !is_array($data['name']) || !is_array($data['value'])
            || array_keys($data['name']) !== array_keys($data['value'])
        ) {
            $validator->errors()->add('name', 'nameとvalueの個数は同じでないといけない');
        }
    });

    // バリデーション実行
    if ($v->fails()) {
        return 'えらー';
    }
```

なんだこれ。
目的は達成しているのですがコードがとても微妙。

`name`や`name.*`などのバリデーションに成功しても失敗しても必ず`after`は呼ばれます。
すなわち当初の`$validation`と同等の事前チェックを`after`にも再度書かないといけません。

だからといってチェック後の値を取得しようと`$validator->getData()`を`$validator->validated()`にしたら無限ループで死にます。
あと試しに`$validator->fails()`ってしてみたらApacheごと死んだ。何故。

このあたりもうちょっとうまい書き方はないものだろうか。
おそらくあるんだろうけどよくわかりませんでした。
ネットワークを利用した双方向性のあるコンテンツのプログラミング

##2021年　新学習指導要領が中学校で完全実施
新学習指導要領において、小学校でのプログラミングが導入されることが話題となっております。それを受けて、2021年から中学校の技術家庭科では「ネットワークを利用した双方向性のあるコンテンツのプログラミング」の授業が開始されます。「双方向のプログラミング」の概略を体験させることを目的として教材を作成しました。
「ネットワークを利用した双方向性のあるコンテンツのプログラミング」ライトノベルの題名のように長いので省略して「ねそプロ」を開発しました。
![20191007_nesopuro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509199/6d08c27d-fc7e-08ad-95b5-d51e63822e44.png)

##「ねそプロ」とは？
http://iwate-manabi-net.sakura.ne.jp/nesopuro/
　↑ Chrome等のブラウザ上で作動します（IE不可）
ブロック部品を並べて、くつけるだけの簡単なプログラミングです。Google Blockly を使ってJavaScriptのコードを作成して実行します。データは、Ajaxで非同期通信をサーバとしています。
SNSを作成することを通して、プログラミングの楽しさと、セキュリティの大切さにつて学ぶことがでれば、と考え開発しました。

##《使い方》
１　左側のツールボックスから部品を真ん中にドラッグ

　　画面に表示 スタート
　　画面に「セキュリティ」を表示
　　画面に「表示エリア」を表示
　　画面に「入力エリア」を表示
　　画面に「送信」ボタンを表示
　　画面に「受信」ボタンを表示
　　画面に「画像」ボタンを表示

上の「実行」ボタンを押すと、画面が作られます。
ブロックを配置した順番で画面がデザインされます。
（ボタンを上に置くことも可能です・・・使いにくいですが。）
「AIチャットボットに送信」で、機械による自動返信も体験できます。

２　「送信ボタンが押された」のブロックの中に
　　　入力エリアのデータ取得
　　　データを送信・受信
　　　受信データを表示
　　　入力エリア内を消去
　　　表示エリアをスクロール
　　を入れます

上の「実行」ボタンを押すと、作動可能になります。
入力エリアに文字を書いて「送信ボタン」を押して下さい。
入力エリアに書いた文字が、表示エリアに出るはずです。
　→　出ない場合には、通信エラーです

アドレスとセキュリティの番号が同じ人とだけ、通信できます。

部品を消してから「実行」を押して、「送信ボタン」を押すと、その作動がない状況を確認できます。例えば、「表示エリアをスクロール」ブロックを外して消すと、自動スクロールしません。

※ブロックを変更しても「実行」を押さないとプログラムの変更が反映されません。

送受信に関しては、プログラムの順番が変わると、うまく作動しなくなることを体験させます。

３　受信の場合を、送信を例に作りながら考えさせます。

４　タイマーを使って、１分ごとに自動で受信する場合を作らせます。

５　画像ボタンの作動を作らせます。

##《工夫点》
・右上の「アドレス」は、「疑似IPアドレス」です。
　「iwate.jp」のように、文字を入力することもできます。
　「192.168.10.3」と同様に、「同じ文字」の場合のみ通信できます。
　→　IDNSサーバによる「URL→IPアドレス」変換で、同じ物同士が通信できることを「擬似的」に体験させます。

・「セキュリティ番号」が同じ時だけデータを返します。
　→情報をやりとりする場合において、
「パスワードや、IDなどのセキュリティが大切である」
　ことを教えます。

・安全のために、SNSの書き込み内容は、日付が変わると表示されないようにしています。

・画面下にはプログラムしたHTMLとJavaScriptの一部が表示されます。

・「寝そべってでも、プログラミングできる簡単教材」を目指しました。
CentOS 8にOpenJDK 11 + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

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

2019-10-06現在[Supported Platforms](https://adoptopenjdk.net/supported_platforms.html)に掲載はないが[Index of rpm/centos/8](https://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/8/)が存在し、インストール自体は可能。

## サポート

本手法で導入した場合、[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/8/$(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 8.0.1905 (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)
```
CSSですっごく邪道なやり方でインプットの必須マークを作りました件

エンジニアなって4ヶ月で米印を作れなかったお話。
＊はじめに言っておきますこれ絶対間違えてます。誰かお優しい方コメントどうぞよろしくお願いいたします。

<img width="200" alt="komemark.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468686/1aaaf559-d982-3874-8121-4a72a9f4d314.png">
こいつを作ろうとして色々探したのですがなかなか見つからず、
<img width="300" alt="komemark2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468686/6ec0155b-cea2-abe6-2312-e3e2c4bc8205.png">
こうなりました。

クライアントに確認したらこれでもよろしいようでしたので良かったですが、本当はImageか何か使ってBackgroundとして設置するのかなといろいろやってみましたがこれに落ち着きました。

# 環境
・[Wordpress](https://wordpress.com)
・[Contact Form7](https://wordpress.org/plugins/contact-form-7/)（プラグイン）を使っております。

# （自分流）必須マークの作り方
 ```java
    //インプットフォーム
　　　
     <label> Name <span class="mark_label"> ＊ </span>
        <span class="required">(required)</span＞
     </label>
　　　
  ```
これで２枚目の写真のようにはなりますが、絶対にやり方間違っています。。。
やはり新人エンジニアにとって、
検索力->知りたい情報に素早く的確にたどり着く能力
を磨くことは必須事項の一つだなと感じました。

もし、正式なやり方をご存知の方いましたらぜひ教えてください！！
xdebugの使用上の注意

xdebug.iniに記載したあと、読み込まれているか確認
まずは、phpのサーバーにxdebugがインストールされているか確認
インストールされていたらこんな感じで「with Xdebug」の記載が見える

```
$ php -v
PHP 7.3.10 (cli) (built: Oct  4 2019 22:35:39) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.10, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v2.7.2, Copyright (c) 2002-2019, by Derick Rethans
    with Zend OPcache v7.3.10, Copyright (c) 1999-2018, by Zend Technologies
```

続いて,php.iniに記載されているか確認
設定が正しくできていれば、ここらへんがxdebug.iniに記載したものと一致しているはず

<img width="1024" alt="スクリーンショット 2019-10-07 19.28.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/3c68b1be-81bd-b71b-66b3-02253dbe12a6.png">

##一致していなかった場合

php.iniの場所を探す

```
find / -name php.ini
```

xdebug.iniに記載していた内容をphp.iniに直接記載する

こんな感じ

```
[xdebug]
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so

xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_host = 10.254.254.254
xdebug.remote_port = 9003
xdebug.idekey = PHPSTORM
```

その後、php-fpmをリスタートする

##dockerの注意点
どのコンテナのphp.iniを読みに行っているか事前に確かめておく。
コンテナが複数立ち上がっているときに、「このコンテナにphpはあるけど、実際はここはみに行ってない」みたいなことがあるため。
CentOS 8にOpenJDK11 + HotSpotをインストール（AdoptOpenJDK）

# はじめに

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

2019-10-06現在[Supported Platforms](https://adoptopenjdk.net/supported_platforms.html)に掲載はないが[Index of rpm/centos/8](https://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/8/)が存在し、インストール自体は可能。

## サポート

本手法で導入した場合、[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/8/$(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 8.0.1905 (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 8にOpenJDK 8(1.8) + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

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

2019-10-06現在[Supported Platforms](https://adoptopenjdk.net/supported_platforms.html)に掲載はないが[Index of rpm/centos/8](https://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/8/)が存在し、インストール自体は可能。

## サポート

本手法で導入した場合、[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/8/$(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 8.0.1905 (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)
```
go-txdbを使ってGoのデータベースのテストを楽にする

## はじめに

データベースを使うテストにはいくつかやり方があります。
- モックを使う Goだと[go-sqlmock](https://github.com/DATA-DOG/go-sqlmock)とか
- テストの時は軽量DBを使う sqlite3とか
- 実際のDBに接続する。dockerとか

ちょっと複雑なクエリを試したいときとかにはやっぱり実際のDBを使いたいです。

## 実際のDBに接続するテスト

実際にDBに接続するテストだといくつかネックになるポイントがあります。
- DBの初期化（DDLなど
- テスト実行後のテストデータの後処理（消す

Goにはテストの前処理や後処理を書く仕組みがあります。
https://golang.org/pkg/testing/#hdr-Main

なお、同じパッケージ内に複数のTestMainを記述することはできないので注意が必要です。

```go
package foo

import (
	"testing"
)

func TestMain(m *testing.M) {
	// 前処理 Open connectionとか
	// DDLを流すとか

	m.Run()

	// 後処理 Close connectionとか
}

func TestFoo(t *testing.T) {
	// ...
}

```

そして各テストメソッドの中でもデータを消す必要があります。

```go
func TestFoo(t *testing.T) {
	// ...
	deleteTestData()
}
```

ちなみにデータを消す時は`DELETE`よりも`TRUNCATE`の方が速いです。

大量のテーブルのデータをまとめて消したりする際は`DROP`するかもしれませんが、重たいのでオススメしません。
各テストメソッドごとに`DROP`するとテストメソッドが増えた際にどんどんテストとの実行時間が長くなっていきます。

ここで一つ思いつくでしょう。
**データ消すのめんどくさいからテスト中のトランザクションをロールバックすればよくね？**

## go-txdb

[go-txdb](https://github.com/DATA-DOG/go-txdb)
このライブラリを使うとDBコネクションをOpenしてからCloseするまでの間のトランザクションを全てロールバックしてくれます。

使い方は簡単でREADMEにあるとおりです

```go
// https://github.com/DATA-DOG/go-txdb/blob/master/README.md

package main

import (
    "database/sql"
    "log"

    "github.com/DATA-DOG/go-txdb"
    _ "github.com/go-sql-driver/mysql"
)

func init() {
    // we register an sql driver named "txdb"
    txdb.Register("txdb", "mysql", "root@/txdb_test")
}

func main() {
    // dsn serves as an unique identifier for connection pool
    db, err := sql.Open("txdb", "identifier")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    if _, err := db.Exec(`INSERT INTO users(username) VALUES("gopher")`); err != nil {
        log.Fatal(err)
    }
}
```

ちなみにgo-txdbを使う場合は各テストメソッドの中でコネクションをOpenしてdeferでCloseすればOKです。
サブテストの中でCloseするのもいいかもしれません。
全てテストメソッド内で完結させられるので同じパッケージ内であっても前処理や後処理を書き分けたいときにも使えると思います。

手軽に始められるのでオススメですが、テストが終わるとデータが全部消えてしまうのでテストコードのデバッグは結構大変です。
AWS samでローカルのテストは通ったけど、AWS上のAPIGateWay+Lambdaでは通らなかったときの解消法

# まえがき
AWS APIGateWay+Lambdaを利用してサーバレスでシステムを組んでいる。
ローカルでsamを利用してテストが通ったので、AWS上で動かしたところうまく動かなかったことがあるので解決策を記述する。
なお、runtimeとしてgo1.xを利用した。

# sam initでテストアプリを作成する
```shell
 sam init --runtime go1.x --name test-app
```

でsample applicationを作成する。
ここで生成されるテンプレートアプリケーションを変更し、Postされたjsonの内容を返却するアプリケーションを作成する。

```go
package main

import (
	"encoding/json"
	"fmt"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

type Parameter struct {
	ID string `json:"id"`
}

func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
	body := request.Body
	jsonBytes := []byte(body)
	param := new(Parameter)
	if err := json.Unmarshal(jsonBytes, param); err != nil {
		return events.APIGatewayProxyResponse{}, err

	}

	return events.APIGatewayProxyResponse{
		Body:       fmt.Sprintf("ID, %v", param.ID),
		StatusCode: 200,
	}, nil
}

func main() {
	lambda.Start(handler)
}
```

Postを受けたいのでtemplate.yaml の`Resources.HelloWorldFunction.Properties.Events.CatchAll.Properties`

のPathとMethodを以下のようにする

```yaml
---
Properties:
  Path: /test
  Method: POST
---
```
その後 `make build` を実行し、`sam local start-api` を実行すればlocalでテストができる

```shell

curl -X POST \
  http://localhost:3000/test \
  -d '{
	"ID": "test"
}'
```

```shell
ID, test
```

テストできたので、AWS上でLambda,APIGatewayを作成し、 zipで固めたバイナリをLambda上にデプロイしたところ動作しなかった。 

json.Unmarshalしたところでエラーが出ているようだった。

# 対処法
APIGateWayを作成したときに統合リクエストの部分で、Lambda プロキシ統合の使用にチェックを入れなかったのが原因。

`sam init`で生成されるテンプレートの handlerの引数である `(request events.APIGatewayProxyRequest)` は以下のような構造体となっている
https://github.com/aws/aws-lambda-go/blob/master/events/apigw.go#L6

Lambdaプロキシ統合の使用を利用すると APIGatewayから構造体にあったリクエストが飛んでくるようになるのでこれでリクエストを受けることができるようになった。

これをマッピングテンプレートで行おうとするとかなり大変なので便利な機能だなと思った。
CentOS 8にOpenJDK 8(1.8) + HotSpotをインストール（AdoptOpenJDK）

# はじめに

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

2019-10-06現在[Supported Platforms](https://adoptopenjdk.net/supported_platforms.html)に掲載はないが[Index of rpm/centos/8](https://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/8/)が存在し、インストール自体は可能。

## サポート

本手法で導入した場合、[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/8/$(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 8.0.1905 (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)
```
Ubuntu 18.04にOpenJDK11 + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してUbuntu18.04に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
# 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="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 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)
```
Ubuntu 18.04にOpenJDK 11 + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してUbuntu18.04に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
# 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="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 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)
```
SheetJS js-xlsx ブラウザ上でのExcelファイル解析の例

SheetJS js-xlsx を使用した、ブラウザ上でのExcelファイル解析の例

[SheetJS js-xlsx community version](https://github.com/SheetJS/js-xlsx)

```html:index.html
Excelファイル選択 <input id="input_sheet" type="file">
<button type="button" onclick="inputSheet()">解析する</button>

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.15.1/shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.15.1/xlsx.full.min.js"></script>
```

```javascript:main.js
var inputSheet = function () {
  var input = document.getElementById("input_sheet");
  parseSheet(input.files[0], "data", function (result) {
    // 変換後の処理
    console.log("result", result);
  });
};

// フォームで入力されたExcelのsheetNameシートをオブジェクトにする。
var parseSheet = function (file, sheetName, callback) {
  var reader = new FileReader();
  reader.onload = function (e) {
    var unit8 = new Uint8Array(e.target.result);
    var workbook = XLSX.read(unit8, {type: "array"});
    // 通常は1行目がヘッダ行となる。{header: 1} を指定で配列形式となる。
    var sheet = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], {header: 1});
    // 基本的な使い方であれば、sheet_to_jsonの結果だけでOK
    // 下記は変換を行う例
    var result = [];
    // 0行目から末尾まで走査
    for (var i = 0; i < sheet.length; i++) {
      var row = sheet[i];
      // 何か変換処理があれば行う
      console.log(i, row);
      result.push(row);
    }
    callback(result);
  };
  reader.readAsArrayBuffer(file);
};
```
Ubuntu 18.04にOpenJDK 8(1.8) + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してUbuntu18.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
# 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="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 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)
```
ESLint couldn't find the config "airbnb"が出たよ

## eslintでエラー

ESlintのための設定ファイルば見当たらねえぜ！
そうだお前が`eslint --init`で選択したAirbnbのやつだ！

と私のフィルターを通すとそう見えています。

```
Oops! Something went wrong! :(

ESLint couldn't find the config "airbnb" to extend from. Please check that the name of the config is correct.

The config "airbnb" was referenced from the config file in "/var/www/resources/.eslintrc.yml".

If you still have problems, please stop by https://gitter.im/eslint/eslint to chat with the team.
```

## 解決 - pakage.jsonを手動で更新

eslintのairbnbを元にした設定ファイルを入れちゃうぜ！

`.eslintrc.yml`とか`.eslintrc.json`とか自分の選択した拡張子でpakage.jsonと同じ階層にできるはずだ！

```
// グローバル
$ npm install --save eslint-config-airbnb
または
// devDependenciesに入れる
$ npm install --save-dev eslint-config-airbnb
```

## `.eslintrc`ファイルは事前に作製していたのになった場合

それは`.eslintrc`ファイルと`pakage.json`ファイルを違うディレクトリ以下に置いてたのが原因かも知れない！

`pakage.json`はどの階層にある？

## 参考 github
https://github.com/airbnb/javascript/issues/465
Ubuntu 18.04にOpenJDK 8(1.8) + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してUbuntu18.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
# 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="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 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)
```
emacs org-modeからrevtexへgraphを投げる時にbbで困った

emacs org-modeからlatexのrevtexへgraphを投げる時にbbで困ったのでその解決策．

普通にlatexへexportするとincludegraphicsのbbは自動的に解決してくれるが，
revtexでplatexかけるとbbが無いと怒られる．
多分，revtexできっているのかな？

bbを明示的に指定する方法がグーグっても出てこなかったので．．．

``` org
#+caption: hoge
#+name: fig:structure_energy_vasp
#+attr_latex: :width 9cm :placement [tbp] :options bb=0 0 1024 768
[[../keynotes/first_paper/first_paper.001.jpeg]]                                                                    
```
です．

でもこの方法はあまりお勧めではないようです．
確かに，bbを固定してしまうのでね．
いざという時のbb指定法と思ってください．

それよりもrevtexではkeynoteのdefault出力形式の
'hoge.001.png'
なんかに対応していない可能性があります．
ちゃんと調べてません．通らないのは確かなんですが．．．

なーーに，pngをpdfに変換しているだけです．
Rakeでの変換の様子を以下においておきます．

``` ruby
desc "convert png to pdf"
task :conv_png do
  file = 'end_of_dislocation_theory_e.tex'
  ['.png','.jpeg'].each do |ext|
    conts = File.read(file)
    Dir.glob("../figs/**/*#{ext}").each do |file|
      file_mtime = File.mtime(file)
      name = File.basename(file,ext)
      dir = File.dirname(file)
      pdf = File.join(dir, name.gsub('.','_')) +'.pdf'
      if File.exists?(pdf)
        pdf_mtime= File.mtime(pdf)
      else
        pdf_mtime= File.mtime(file)
      end
      if file_mtime >= pdf_mtime
        res = command_line("convert #{file} #{pdf}")
        p res.stderr
      end
      conts.gsub!(file, pdf)
    end
    File.write(file, conts)
  end
end
```
ごめんなさい．時間があるときにちゃんと調べます．
Ubuntu 16.04にOpenJDK 11 + OpenJ9をインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してUbuntu16.04に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
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-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)
```
PIPの意味

#PIPの意味

qiitaの練習投稿です。
~~pip installs pythonの略。~~
Package Installer for Pythonっぽいです。

~~この序盤のpip自体が何を指すのかはよくわからん。
辞書的な翻訳はサイコロとかの目、みたいな。~~
EJSで別ファイルに定義したEJSの関数を呼び出す

備忘録として。

共通関数ファイル

```js:myFunctions.ejs
<%
myFunc = {
  test: function(){ return "hello"; },
  hoge: function(str){ return str; }
}
%>
```

Viewファイルとか

```js:index.html.ejs
<% include('./myFunctions.ejs') -%>
<%- myFunc.test() %>
```

出力

```
hello
```
Ubuntu 16.04にOpenJDK 11 + HotSpotをインストール（AdoptOpenJDK）

# はじめに

AdoptOpenJDKを利用してUbuntu16.04に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
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-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)
```
pipのpsycopg2のインストールでError: pg_config executable not found

## エラー

```console
$ pip install psycopg2
Collecting psycopg2
  Downloading https://files.pythonhosted.org/packages/5c/1c/6997288da181277a0c29bc39a5f9143ff20b8c99f2a7d059cfb55163e165/psycopg2-2.8.3.tar.gz (377kB)
    ERROR: Command errored out with exit status 1:
     command: /usr/bin/python3.6 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-7bbzhbc4/psycopg2/setup.py'"'"'; __file__='"'"'/tmp/pip-install-7bbzhbc4/psycopg2/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base pip-egg-info
         cwd: /tmp/pip-install-7bbzhbc4/psycopg2/
    Complete output (23 lines):
    running egg_info
    creating pip-egg-info/psycopg2.egg-info
    writing pip-egg-info/psycopg2.egg-info/PKG-INFO
    writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt
    writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt
    writing manifest file 'pip-egg-info/psycopg2.egg-info/SOURCES.txt'

    Error: pg_config executable not found.

    pg_config is required to build psycopg2 from source.  Please add the directory
    containing pg_config to the $PATH or specify the full executable path with the
    option:

        python setup.py build_ext --pg-config /path/to/pg_config build ...

    or with the pg_config option in 'setup.cfg'.

    If you prefer to avoid building psycopg2 from source, please install the PyPI
    'psycopg2-binary' package instead.

    For further information please check the 'doc/src/install.rst' file (also at
    <http://initd.org/psycopg/docs/install.html>).

    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
```

## 環境
- CentOS 6.7

## 解決策
以下をインストール。

```console
$ yum install -y postgresql-devel
```
AfterEffectsで髪の毛をエクスプレッションで揺らす方法[追記20/01/15]

#概要
AfterEffectのパペットピンをエクスプレッションで制御して動く立ち絵素材を作成します
この記事では腕等は動かさず髪の毛のみ動かします
関連記事
[[ループ素材作成]AfterEffectsで髪の毛をエクスプレッションで揺らす方法](https://qiita.com/hi_tyanww/items/04f89b566f7fa491d6e6)
#作例
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ゆかりさん動かして遊んでる<br>楽しい <a href="https://t.co/7FRjdv7ZpZ">pic.twitter.com/7FRjdv7ZpZ</a></p>&mdash; ひーちゃん (@hi_tyanww) <a href="https://twitter.com/hi_tyanww/status/1174463009181159424?ref_src=twsrc%5Etfw">September 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

お借りした素材
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【ver.1.4.0】結月ゆかりの立ち絵【素材】<br>うおおおおおやっと形になりました<br>ゆかりちゃんの立ち絵です。<br>レイヤー分割が増えてだいぶわかりづらくなりましたが、<br>慣れれば使いやすいと思います。<br><br>DLはこちらからどゾ！<br>■<a href="https://t.co/pwia46bMG4">https://t.co/pwia46bMG4</a><br><br>■ニコニコ静画<a href="https://t.co/Shku6OcTXX">https://t.co/Shku6OcTXX</a> <a href="https://t.co/TfyW0ENhyt">pic.twitter.com/TfyW0ENhyt</a></p>&mdash; 薙派（ちぱ） (@arutana) <a href="https://twitter.com/arutana/status/1136995986377601024?ref_src=twsrc%5Etfw">June 7, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

この立ち絵を使って学習する場合立ち絵製作者様に迷惑をかけないようreadmeをよく読んでから使って下さい
#解説
動かす為の下準備の説明等は省きます
もみあげを動かします
![タイトルなし2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299114/1ff451d2-bf49-98ac-71c9-cecf3a40ab07.png)

まずはもみあげの根本にピンを刺し次に真ん中辺りに刺して
パペット→メッシュ→パペットピン(真ん中のピン）→位置の時計マークにAltキーを押しながらクリックしてエクスプレッションを書ける状態にします

```
x=ピンのX座標+Math.sin(time*2)*5;
y=ピンのY座標;
[x,y]
```

これで動きます
後はお好みで値を弄って下さい。後頭部や前髪も同じやり方で動きます

#追記19/10/23
ピックウィップで座標を取得出来る事に気が付いたので更新

```
var moto=
;
x=moto[0]+Math.sin(time*2)*5;
y=moto[1];
[x,y]
```

この一行目の＝の後に動かすパペットピンの位置にピックウィップを繋げば動きます
![タイトルなし5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299114/413f955d-d952-0bb2-e739-0356755472ad.png)

#追記19/11/06
上の解説
パペットピンのピンの位置にピックウィップを繋いだ時の挙動

- 位置にピックウィップを繋いだ時


```
effect("パペット").arap.mesh("メッシュ 1").deform("パペットピン 1").position
```

- X、またはYにピックウィップを繋いだ時

```
x=effect("パペット").arap.mesh("メッシュ 1").deform("パペットピン 1").position[0]
y=effect("パペット").arap.mesh("メッシュ 1").deform("パペットピン 1").position[1]
```

XまたはYにピックウィップを繋ぐと<b>位置にピックウィップを繋いだ時の文字列</b>+[0]、[1]の文字列を参照出来ます
今回はXY座標それぞれに別の動きをさせたかったのでmotoに位置を入れた後motoに[0]or[1]を付け足してみました
参考資料
[エクスプレッション言語](https://helpx.adobe.com/jp/after-effects/using/expression-basics.html#the_expression_language)の配列と多次元プロパティ
＜SFDC資格＞ Identity and Access Managemnt デザイナー試験

2020/04/19ライセンスに関して追記。
記載中。。。
ーーーーーーーーーーー

####ライセンス
・Identityライセンスは、認証/アプリケーションランチャー機能のみ利用する社内ユーザ向けライセンス。オブジェクトを利用する場合、Salesforceライセンス/Salesforce Platformライセンスとなる。↓こんなイメージ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/8bbe8108-2c3d-5168-0fa8-341fa5f02557.png)

・尚、External Identityは、「External」という文字がつくため、社内向けのIdentityライセンスと異なり外部向け。つまり、Communityを使うような外部の顧客が使う場合にこのライセンスを使用。
・ライセンスにPlusという文字がついた場合、レポートなど使える。
・Salesforceライセンスだと色々な標準オブジェクトが利用できるが、SalesforcePlatformだとあまり標準オブジェクトは使えず、基本的にカスタムオブジェクトを利用する。

####2段階認証/2要素認証(2FA)
・2段階認証は、要素が同じでもいい。2回やればよい。
・2要素認証は、要素が2つ以上必要。
※要素とは以下3要素を指す。
　（１）本人しか知らない情報（ID/PW）
　（２）本人の所有物の情報（スマホとか）
　（３）もしくは本人の身体特徴（指紋など）の3点を指す。

・中間者攻撃やフィッシングは2要素、2段階で防げない。なぜか？
⇒そもそも偽サイトに飛んでしまっており、かつそのサイトを本物であるとユーザが思い込んでいるため、2要素であっても攻撃の防ぎようがない。（そもそも偽サイトで2段階認証してしまうとか。）

・ソーシャルエンジニアリング
⇒システム周囲の人間などの脆弱性を狙う攻撃手法。カスタマーサポートをだましたり公開鍵を奪ってシステムに侵入し、ユーザ本人と思いこますような、ハッキングを指す。
これも2要素/2段階では防げない。

####OAuthの特徴
（例）Salesforceにログインする際に、ID/PWを入れなくとも、FacebookやTwitter、Linkedin経由でログイン(認可)できる場合

####代理認証の特徴
・SAMLが使えない場合に代理認証を利用。社内の認証サーバを使いたいとか、SAMLより古い規格を使いたい（SAMLが対応していない）場合など。
・認証のWebサービスはSOAPである必要あり。
・TLSを使うこと。
・RESTは使えない。
・統合IDも使わない。（統合ID使うのはSAML）
・SFDCサポートに依頼して有効化してもらわないと代理認証は使えない。
https://wa3.i-3-i.info/word11616.html

####SAMLの特徴
・複数アプリが存在し、それぞれログインするときにID/PW入れるの面倒だよねってなった時にSAMLが登場。どこか1か所（Idp）にユーザ情報を保持し、色んなアプリ（SP）からログインするときに、1か所（Idp）で認証されて、あとは自由にログインできればいいよねってのがざっくり思想。
・ユーザの認証情報をXML形式で記述。
・ユーザオブジェクト上の標準項目である統合ID（フェデレーションID）を利用する。
・SPからのログインも、Idpからのログインもサポート。
・事前にSPとIsp間でTrust必要。
　　⇒Trustとは要は証明書をIdpがSPに渡し、SPが読み込んでいること。
https://wa3.i-3-i.info/word13374.html

####IdentityConnectの特徴
・上段で記載しているIdentityはライセンス。ここで書いてるIdentityConnectは製品。
・どんな製品かというと、ActiveDrectly⇒SFDCへ「SSO」ができる製品。
・IdentityConnectには、ユーザプロビジョニング機能あり。（ADからSFDCへの一方通行に限定。）
　　⇒ユーザプロビジョニングとは、ログインしたタイミングでユーザがいなければ自動生成（数秒で作成され、ログインできるようになる）される機能。ユーザが退職したら同期して無効化することも可能。

####更新トークン
・これで新しいトークンを要求する。
・アクセストークンは有効期限があるため、期限切れたら更新トークン使って再取得が必要。

####お世話になったサイト
http://salesforcememo.com/2017/09/18/how-to-prepare-for-and-pass-identity-and-access-management-designer-exam/
cmake-format で CMakeLists.txt を自動整形する

## 背景

CMakeLists.txt いろいろ手動で記述していくと, 1 行が長くなったり, ifdef のインデントを保つのが面倒ですね...
clang-format で C/C++ コードが自動整形できるように, cmake の CMakeLists.txt も自動整形したい.

## 解決

`cmake-format` があります.
 
https://github.com/cheshirekow/cmake_format

ありがとうございます.

pip install でお手軽に使えます.

cmake-format -i CMakeLists.txt で上書き(in-place)できます.

その他の詳細は git repo を参照ください.
iOS13&Xcode11ではSKStoreProductViewControllerを継承したクラスが使えなくなりました

# 環境
* iPhone 11 Pro Max
* iOS13.0
* Xcode11.1 GM

# 原因
* タイトルそのまま

# エラーログ
```terminal:error.log
*** Terminating app due to uncaught exception 'SKUnsupportedClassException', reason: 'SKStoreProductViewController may not be subclassed.'
```

# 対応
* 継承したクラスの削除
* 呼び出し処理の追記

```swift:SampleViewController.swift
internal final class SampleViewController {
    internal func openStoreProduct() {
        let storeProductViewController = SKStoreProductViewController()
        storeProductViewController.delegate = self

        // StoreのIDを追記
        let parameters = [SKStoreProductParameterITunesItemIdentifier: 000000];
        storeProductViewController.loadProduct(withParameters: parameters) { [weak self] status, error -> Void in
            guard let self = self else { return }
            if status {
                self.present(storeProductViewController, animated: true) { [weak self] in
                    // 閉じた時の処理
                }
            } else {
                if let error = error {
                    print("Error: \(error.localizedDescription)")
                }
            }
        }
    }
}

extension SampleViewController: SKStoreProductViewControllerDelegate {
    internal func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) {
        viewController.dismiss(animated: true, completion: nil)
    }
}
```
【Ruby on Rails:Mysql2】起動時エラー uninitialized constant Mysql2::Client::LONG_PASSWORD

# 概要
Railsのモジュールを動かそうとしたらエラーが出てハマったのでメモ。
なかなか対応策が見つからなかったの記載。
根本的な原因はともかく、とりあえず動かしたい人向けの対応となります。

# 環境
```
# コンテナ（サーバ）環境
Docker Container : ruby:2.5
mysql  Ver 15.1 Distrib 10.3.17-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
# Rails：
Ruby on Rails 5.0.2
mysql2 (0.4.5)
```

# エラー内容
DB接続で失敗。初回アクセスやmigrateで失敗する。

```
# メッセージ
uninitialized constant Mysql2::Client::LONG_PASSWORD

# スタックトレース
mysql2 (0.4.5) lib/mysql2/client.rb:14:in `default_query_options'
mysql2 (0.4.5) lib/mysql2/client.rb:25:in `initialize'
activerecord (5.0.2) lib/active_record/connection_adapters/mysql2_adapter.rb:25:in `new'
activerecord (5.0.2) lib/active_record/connection_adapters/mysql2_adapter.rb:25:in `mysql2_connection'
activerecord (5.0.2) lib/active_record/connection_adapters/abstract/connection_pool.rb:729:in `new_connection'
activerecord (5.0.2) lib/active_record/connection_adapters/abstract/connection_pool.rb:773:in `checkout_new_connection'
activerecord (5.0.2) lib/active_record/connection_adapters/abstract/connection_pool.rb:752:in `try_to_checkout_new_connection'
<略>
```

# 対応
gemで落としたmysql2のclient.rbから「LONG_PASSWORD」を削除する

```
# /usr/local/bundle/gems/mysql2-0.4.5/lib/mysql2/client.rb(環境差異はあります。)

# 変更前
:connect_flags => REMEMBER_OPTIONS | LONG_PASSWORD | LONG_FLAG | TRANSACTIONS | PROTOCOL_41 | SECURE_CONNECTION,
# 変更後
:connect_flags => REMEMBER_OPTIONS | LONG_FLAG | TRANSACTIONS | PROTOCOL_41 | SECURE_CONNECTION,

# ワンライナーでだと以下のコマンド
find /usr/local/bundle/gems -type f -wholename *mysql2*/client.rb | xargs sed -i -e "s/LONG_PASSWORD | //g"
```

# コメント、考察

* あくまで暫定対応です。
* gemのライブラリを直接手を加えてしまうのでできることならやめたほうがいい。
* コンテナのmysqlコマンドのバージョンがMariaDBだからか？
* ちなみに、debianは特定のバージョン以降はapt-getではMariaDBになる。
Railsチュートリアル 第２章＜復習＞

第２章の復習メモです。
個人的に重要と思ったことを書きます。
調べたことや、知っていたことも含めて書きます。


#scaffoldジェネレータ
以下のコマンドで、簡単なCRUDアプリケーションを生成できる。

```
$ rails generate scaffold <モデル名> <カラム名1>:<型> <カラム名2>:<型>
```

- モデル名
 - 任意のモデル名を記載（今回はUserとした）
 - 頭は大文字、単数形で書く
 - モデルは、DBのテーブル１つと対応し、DBの操作を担う。
 - モデルを作ると、対応するテーブルがDBに作られる（Userモデルを作成 → usersテーブルの生成）
- <カラム名>:<型>
 - 任意のカラム名を記載（今回は`name:string`、`email:string`の二つ）
 - 主キー（idカラム）は、Railsが自動生成してくれるので不要

以下のコマンドで、設定をDBに反映。

```
$ rails db:migrate
```

以上がDB回り。
加えて、ルーティングやCRUDの各メソッドも自動生成されている。

こんな画面が出来た。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506678/8fad00c4-7e1f-ec1b-dde8-64a5a2b844d6.png)


#その他

- モデルの関連付け（テーブルの結合）
- クラスの継承について

後の章で詳しく扱うようなので、今回は軽く流しておく。
Railsチュートリアル 第２章＜ハマったこと＞

#2.1 アプリケーションの計画　その１
Toyアプリケーション用のGemfileをコピペし、
`bundle install --without production`
を実行すると、以下のエラーが発生。

```
You have requested:
  spring = 2.0.2

The bundle currently has spring locked at 2.1.0.
Try running `bundle update spring`

If you are updating multiple gems in your Gemfile at once,
try passing them all to `bundle update`
```

`bundle update`を実行するよう表示されているので、
実行してみると、問題なくupdateされた模様。

再度`bundle install --without production`を実行。
上手くいった！

```
Bundle complete! 15 Gemfile dependencies, 64 gems now installed.
Gems in the group production were not installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
```

#2.1 アプリケーションの計画　その２
指示に従いソースコードを編集後、
Herokuにアップロードしようとして
`$ heroku create`を実行すると、以下のエラーが発生。

```
bash: heroku: command not found
```

herokuがインストールされていない？
第１章でインストールしなかったっけ・・・？？

下記URL
https://teratail.com/questions/157274
を参考にさせていただき、
単発（？）インストールであったことが判明。
（Linuxコマンドの知識不足です）

今回は、１章と同じ方法で再度インストールしました。

インストール

```
$ source <(curl -sL https://cdn.learnenough.com/heroku_install)
```

結果

```
$ heroku --version
heroku/7.33.1 linux-x64 node-v11.14.0
```
Railsチュートリアル 第１章＜復習：補足＞

#Herokuの基本コマンド

- **Cloud9に**Heroku CLIをインストール

```
$ source <(curl -sL https://cdn.learnenough.com/heroku_install)
```


- Herokuのバージョン確認

```
heroku --version
```


- Herokuにログイン、SSHキーの追加

```
$ heroku login --interactive
$ heroku keys:add
```


- Herokuサーバーに、アプリケーションの実行場所を作成

```
$ heroku create
```


- Herokuにデプロイ

```
$ git push heroku master
```


- Herokuのアプリケーション名を変更

```
$ heroku rename <新アプリケーション名>
```