OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry pi と watchXでBLE通信


IoTに関する研修を受けてきまして、raspberry piとクラウド(AWS IoT)の連携に関してはできるようになったのですが、BLEを使ったM2Mのような通信をさせたことがありませんでした。

そこで、raspberry pi(raspberry pi3 model B+) とwatchX(arduino leonarde)を使い、watchXの温度センサから値を取得し、BLEでwatchXからraspberry piへセンサ値を送ってみました。

簡単に行くかなと思ったのですが、割とはまりどころが多かったのでここにまとめます。

# 開発環境

## watchX

以下のサイトをご参考ください。arduino leonardeが乗ったスマートウォッチと考えていただければいいかと思います。
https://www.watchx.io/


また、必要なarduinoのライブラリが以下で提供されているので、この中のBLEのペリフェラルとして、温度センサの値を送る「healththermometer」というサンプルプロジェクトを使用します
https://www.watchx.io/download.php



## raspberry pi3 model B+

raspberry pi3 model B+に関しては、bluetoothモジュールがついているので、それを使って通信します。

また、今後、AWSとの連携も考えていきたいので、pythonを使ってBLEセントラルとしての機能を実装します。当初、pybluezを使用していたのですが、うまくモジュールが動かないとの情報も多々ある(自分の手持ちのraspberry piでも動きませんでした・・・)ので、bluepyを使用することにしました。

bluepy の導入は以下の記事を参考にさせていただきました。(とてもわかりやすくて助かりました)
https://qiita.com/FiveOne/items/ea04b74271da0f382ed6

# ソースコード

## watchX

開発環境の項目で紹介したライブラリですが、どうやらピン配置の設定が違うらしく、うまくBLEモジュールが動きませんでした。そのため、以下のように「BluefruitConfig.h」を改良しました。
https://github.com/tomsWalker/watchX/blob/master/healththermometerWatchX/BluefruitConfig.h

その他の場所はサンプルのままで問題ないようでした。(watchXのコードはファイルもいくつかに分かれていますのでgithubにあげさせてもらいました)

## raspberry pi

開発環境作成もお世話になった以下の記事の「notify.py」を流用させていただきまして、温度センサの値を取得しました。
https://qiita.com/FiveOne/items/ea04b74271da0f382ed6

watchX側のプログラム上、使用するキャラクタリスティックのプロパティが「indicate」になるので、以下のように変更し、値を取得いたしました。

```py
import bluepy
import binascii

HANDLE_INDICATE = XX # ここに使用するwatchXのキャラクタリスティックのハンドルを入れます
devadr = "XX:XX:XX:XX:XX:XX" # ここにwatchXのBLEのアドレスを入れます

class MyDelegate(bluepy.btle.DefaultDelegate):
    def __init__(self, params):
        bluepy.btle.DefaultDelegate.__init__(self)

    def handleNotification(self, cHandle, data):
        c_data = binascii.b2a_hex(data)
        print("data:")
        print(c_data)

def main():
    peri = bluepy.btle.Peripheral()
    peri.connect(devadr, bluepy.btle.ADDR_TYPE_RANDOM)
    peri.withDelegate(MyDelegate(bluepy.btle.DefaultDelegate))
    # プロパティがindicateなので、「'\x01\x00'」ではなく「'\x02\x00'」を書き込む
    peri.writeCharacteristic(HANDLE_INDICATE+1, b'\x02\x00') 
    
    while True:
        if peri.waitForNotifications(1.0):
            continue
        print("wait...")

if __name__ == "__main__":
    main()
```

# 最後に

なんとか、上記のソースコードでBLE通信ができるようになりました。

watchXも、温度センサだけでなく加速度センサなどもついているので、その辺りのセンサを使用したり、AWSとの連携も考えていこうかと思います
機械学習前処理

# 機械学習前処

機械学習には、大きく３つの処理があります。

- 決定木
- ニューロンネットワーク
- 多重回帰

決定木以外は、モデルを数値に変える必要があります。

参考となる記事

「前処理」のフォーマット共通化やOSS化はできないんだろうか
http://tjo.hatenablog.com/entry/2013/12/17/201529

WI2研究会(公開用) “データ分析でよく使う前処理の整理と対処”
https://www.slideshare.net/hajimesasaki1/wi2-55598897

Pythonで機械学習はじめました データ前処理編
https://qiita.com/yuuki_1204_/items/c26cb09fba8aad35dc0a

自然言語処理における前処理の種類とその威力
https://qiita.com/Hironsan/items/2466fe0f344115aff177

長岡技術科学大学 自然言語処理チーム
https://www.youtube.com/watch?v=I02cX-uZtzM
0から学ぶDocker

チーム開発をしていて「Dockerイメージを作る」「Dockerコンテナをデプロイする」という言葉を聞くけど、そもそもDockerって何だ...？となった体験からまとめ記事を書きました。
0から学んで書いた記事なので違うことがあればご指摘ください。

##Dockerを使う理由
そもそもなぜDockerを使う必要があるの？と思いましたが、開発をしているとこんな悲しみがあります。

- 開発環境整えるのにめちゃくちゃ時間がかかる
- 手元では動いたのにデプロイしたら動かない

これらを解決するのがDockerです。

##Dockerの構成図
必要な情報をコンテナにまとめているので手元でコンテナを動かせば手軽に開発環境を整えられるし、コンテナをデプロイすれば開発環境と本番環境との差異を小さくできます。
<img width="500" alt="スクリーンショット 2019-11-27 21.43.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533386/3f9c65b9-fc45-5bb8-ff7d-4943c357afc3.png">

- Dockerエンジン
    - Dockerコンテナ・イメージを管理するDockerそのもの
- コンテナ
    - Dockerエンジン上で動く仮想環境
    - この中でアプリケーションが動く

##コンテナの作り方
<img width="1257" alt="スクリーンショット 2019-11-26 23.41.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533386/649880c6-06a4-0f7a-ea8c-19c65e3c0087.png">

- Dockerfile
    - イメージを作るための設計図
- イメージ
    - コンテナを作るための設計図
    - Dockerfileに書かれている各行が各イメージの層にあたる

##コンテナによる仮想化のメリット
仮想化というとVirtualBoxなどをイメージしますが、仮想化には種類があります。

- コンテナによる仮想化
- 仮想マシンによる仮想化
    - ホストOS型（VirtualBoxはこれ）
    - ハイパーバイザー型

仮想マシンによる仮想化はGB単位でリソースを占有するのに対して、コンテナはMB単位なのでとても軽くて速いという特徴があります。

<img width="600" alt="スクリーンショット 2019-11-27 22.07.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533386/b4a4038a-cbb1-f545-19a0-5d736ad9b8a1.png">

##最後に
以上、ざっくりとしたDockerまとめ記事でした。
今後備忘録としてDockerコマンド解説記事も書きたい気持ち。
Ruby学習ログ：その2【class, attr_accessor】

ハマりかけてます。
とりあえず整理するため書いていく！


[【Ruby】クラスとかインスタンスについて改めて学習してみた]
(https://qiita.com/ksk_diffeasy/items/734b4961e9e6c7480d33)

　   **クラス**
= 　**初期処理** ＋ **インスタンス生成** ＋ **インスタンスメソッド定義・実行**

ちなみにクラスの中は *初期処理* と *インスタンスメソッド定義* が含まれていれば大丈夫！
...と思ったが~~*attr_accessor*というメソッドがないとクラスの外でインスタンス生成ができないらしい~~
(scivolaさんがコメントにて間違いを指摘してくださりました。
`attr_accessor`は**メソッドを定義するメソッド**とのこと)

[attr_accessor (Module)]
(https://ref.xaio.jp/ruby/classes/module/attr_accessor)

  
  
詳しくは
[attr_accessorメソッドの使い方]
(https://qiita.com/pi_ko/items/f4a13ea05013f48d52f9)

>**↓これが一番理解しやすかった↓**
[アクセスメソッド（アクセサメソッド ）について（Ruby）]
(https://www.ryotaku.com/entry/2019/08/01/100814)
より引用↓

```ruby

class Pokemon
  def initialize(name)
    @name = name
  end

  def getName
    @name
  end

  def setName=(changed_name)
    @name = changed_name
  end
end

#クラス外部から値の参照が可能
pokemon = Pokemon.new('ピカチュウ')
puts pokemon.getName
=> ピカチュウ

#クラス外部から値の更新が可能
pokemon.setName = 'ギエピー'
puts pokemon.getName
=> ギエピー
```
これを`attr_accessor`で書き換えると

```ruby
class Pokemon
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

pokemon = Pokemon.new('ピカチュウ')

puts pokemon.name
=> ピカチュウ
```

>やっと理解できた...!

引数処理に関して掘り下げると
[ruby引数処理に使えるテクニック]
(https://qiita.com/metheglin/items/306e81c95f8a5cdea296)

クラスについてもっと知りたい！
→[【まとめ】インスタンス変数、クラス変数、クラスインスタンス変数](https://qiita.com/mogulla3/items/cd4d6e188c34c6819709)





##所感

アウトプット前提で学習すると効率よくインプットできますね！
個人的にはもっと質の高い記事を投稿したいが、学習ログという定に甘えてます:baby:
活性化関数の実装

## 活性化関数の実装

### ステップ関数
```
def step_function(x):
    y = x > 0
    return y.astype(np.int)

x = np.arange(-5, 5, 0.1)
y = step_function(x)

plt.plot(x, y)
plt.xlim((-4,4))
plt.show()
```
![ステップ関数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419560/7282b2ab-2e13-025b-1fb5-dffd1b0989f8.png)

### シグモイド関数
```
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.arange(-5, 5, 0.1)
y = sigmoid(x)

plt.plot(x, y)
plt.xlim((-5, 5))
plt.show()
```
![シグモイド関数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419560/86bb1b66-07ac-1275-0885-de1f30dbdc4d.png)

### ReLU関数
```
def relu(x):
    return np.maximum(0, x)

x = np.arange(-5, 5, 0.1)
y = relu(x)

plt.plot(x, y)
plt.xlim((-5, 5))
plt.show()
```
![ReLU関数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419560/7965fd5f-8fca-ed99-a193-aaaf50e19f25.png)

### tanh関数
```
def tanh(x):
    return(np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x)) 

x = np.arange(-5, 5, 0.1)
y = tanh(x)

plt.plot(x, y)
plt.xlim((-5, 5))
plt.show()
```
![tanh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419560/a95c5263-f31e-1f46-522c-e825da378e51.png)


### ソフトマックス関数
・分類問題を解くためのアルゴリズムとして利用される。
・出力値の総和が常に１となる。

```
def softmax(x):
    exp_x = np.exp(x)
    sum_exp_x = np.sum(exp_x)
    y = exp_x / sum_exp_x
    return y

x = np.arange(-5, 5, 0.1)
y = softmax(x)

plt.plot(x, y)
plt.xlim((-5, 5))
plt.show()
```
![ソフトマックス関数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419560/9d2db9a9-34e5-d58d-3d60-a282910b523e.png)
picoCTF 2019 vault-door-5 - Points: 300

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5de61708-eb84-dff0-eafe-cea6288ebbfe.png)

#解いてみた

javaソースを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/ee766265-6c22-badb-9209-99a6b0da622f.png)

11行目のcheckPasswordメソッドを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5658e48b-9992-69c9-3ac1-f16a0de70f8a.png)

入力した文字をURLエンコードして、さらにbase64した文字列を比較している。
ということは逆をやればいい？

CyberChef使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5515d216-01de-94cc-801b-91bc7555150e.png)

できました。
Laravel6.5でFormファザードを利用する

# Laravel6.5.3でFormファザードが使えるようにする

以下のコマンドを実行するだけ。（バージョン指定せずとも自動でインストールしてくれるっぽい）

```qiita:ターミナル
$ composer require laravelcollective/html
```

````qiita:実行結果
Using version ^6.0 for laravelcollective/html
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing laravelcollective/html (v6.0.3): Loading from cache
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: laravelcollective/html
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
```

無事インストール完了。

ネットで調べると大体、ComposerとLaravelのバージョンの相性の善し悪しがあり、
バージョンまで指定してコマンドを実行していたので、
それに倣って試行錯誤してみましたが、なかなか進みませんでした。

自分でバージョン指定せずにコマンドを実行してみたら、うまくいきました。
【FileMaker】FileMaker Goでポップアップにする？それともプルダウン？

FileMaker Go Advent Calendar 2019、今年もやってまいりました。
今回は、FileMakerではそんなに気にせずに使っているけれど、FileMaker Goで使うとなるとちょっと気をつけて設計したほうがいいよ、ということで選択リストとして提供されている「ポップアップメニュー」と「プルダウンリスト」を取り上げます。
[一貫性のあるデータ入力をサポートする機能](https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help%2Fsetting-field-control.html%23ww1234357)として提供されているこれら「ポップアップメニュー」と「プルダウンリスト」ですが、ちょっとその違いを見てみましょう。

※今回の記事は、FileMaker Pro 14以降での機能説明になります。それよりも下のバージョンでは提供されていない機能になりますので、ご注意ください。

# FileMaker Pro Advancedでの動き
まずは、FileMaker Pro Advanced(PC)での動きです。

## ポップアップメニュー
入力フィールドに被ってメニューが出てきます。
<img width="1061" alt="FileMaker Pro Advanced ポップアップメニュー" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/eea7ebc8-0f89-742d-8325-f48519750b3d.png">

## プルダウンリスト
こちらは、入力フィールドが選択され、かつリストが出てきますし、入力フィールド内でも自由に文字が入力できます。
<img width="1058" alt="FileMaker Pro Advanced プルダウンリスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/85d625e8-dc23-f3e2-66dc-74c00e19ec51.png">
でも、気にしなければ単純にメニューやリストから選択して終わりではないでしょうか？

これを、FileMaker Go(iOS)でやってみます。

# FileMaker Go での動き
設定などは先ほどと同じです。

## ポップアップメニュー
FileMaker Pro Advancedでは入力フィールドに被って出ていましたが、被らずに出てきます。
![IMG_0301.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/a23deb96-9a58-7547-109c-36e7f7dbdc8c.png)

## プルダウンリスト
キーボードががっつり出てきました。
![IMG_0302.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/3344e832-80e6-ebef-00a1-cd7b54fcae3b.png)
プルダウンで選択したいだけの場合でしたら、このキーボードがいちいち出てくるのはうっとおしいですね。

では、プルダウンリストはFileMaker Goで使い勝手が悪い子なんでしょうか？
そうではありません。
設定次第でいい子になります。

# プルダウンリストをいい子にする
キーボードをオフにする機能が、FileMaker Pro 14以降にはあります。
「[タッチボードの有効化](https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help%2Fenable-touch-keyboard.html)」という、タッチボードのON/OFFの設定です。

これを、レイアウトが表示されるときに設定してみます。
<img width="1346" alt="タッチボードの有効化" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/07291c82-7e98-bd3d-5a3e-24d2482f35c9.png">

プルダウンリストの設定は、一応値の編集ができるようにしておきます。
<img width="1216" alt="プルダウンリスト設定" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/5baa254e-2f02-3bad-da76-8c2a4f95ca3c.png">

さて、どうなるかな？
![IMG_0307.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/282058f4-1f03-da77-3258-260858ec383d.png)
お！
出ませんね、キーボード。

「値を編集」をタップすると、やっとキーボードが出てきます。
![IMG_0308.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/98a805ec-64c6-6b06-0a38-6236bb4fbd7a.png)
うざったくない、いい子になりました。

# 設定次第で使い勝手は良くなる
今回はレイアウト全体でキーボードの制御をしましたが、フィールド毎にスクリプトトリガを仕掛けるなど、細かくコントロールできます。
ただその時は、キーボード制御のスクリプトをレイアウトにある全てのフィールドに忘れずに入れるか、キーボードをオフ設定したフィールドを抜ける(OnObjectExit)ときにキーボードをオンに戻す処理を当ててくださいね。
ちょっとしたことですが、少しイラっとすることがなくなるTipsでした。
シェルスクリプトでディレクトリ移動を自動化したぞ！

Webアプリを作ってるとき毎回起動するときdocker-composeでコンテナ立ち上げるのめんどくさいので自動化しました。

+ 使用OS   centOS7
+ ライブラリ laradock

1. ルート直下にディレクトリを分かりやすいように作ってその中に
touch docker_compose_start.sh
というファイルを作成

```sh:docker_compose_start.sh
#!usr/bin/bash

cd /project/laradock
docker-compose start

```

2. 実行できるようにファイルの権限を変える  
 chmod 755 docker_compose_start.sh

3. 作ったディレクトリの中でファイルを実行する
./docker_compose_start.sh

これでコマンド一回でコンテナが立ち上がるようになる
プログラミング問題集（問３１〜問３５）

# 問３１： １変数の確率的勾配降下法 (stochastic gradient descent, SGD)

以下に示す関数の最小値を、確率的勾配降下法で求めなさい。また、そのアルゴリズムを説明し、パラメータを変化させた時の挙動の変化も説明しなさい。

* $f(x) = x ^ 2 + 2 x + 1$
* $g(x) = x^4 − 4 x^3 − 36 x^2$



# 問３２： ２変数の確率的勾配降下法 (stochastic gradient descent, SGD)

以下に示す関数の最小値を、確率的勾配降下法で求めなさい。また、そのアルゴリズムを説明し、パラメータを変化させた時の挙動の変化も説明しなさい。

* $f(x, y) = (x - 1) ^ 2 + 2 (y + 1)^2$
* $g(x, y) = (x^4 + 2 x^2 + 1) (y^2 + 2y + 1)$


# 問３３：回転

二次元ユークリッド座標上の点 $P = (x, y)$ と角度 $t$ (degree) を入力したとき、原点 $O = (0, 0)$ から反時計回りに $t$ だけ回転させた座標を出力する関数を作りなさい。

## 例33-1

```python
P = [1, 0]
t = 45
```

```python
[0.70710678, 0.70710678]
```

## 例33-2

```python
P = [0, 1]
t = 30
```

```python
[-0.5      ,  0.8660254]
```


# 問３４：正多角形

二次元座標上の点 $P = (x, y)$ と整数 $n$ を入力したとき、点 $P$ をひとつの頂点とし原点 $O = (0, 0)$ を重心とする正 $n$ 角形の頂点を出力する関数を作り、その正 $n$ 角形を描画しなさい。

## 例34-1

```python
P = [0, 1]
n = 5
```

![output_7_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/6d6183aa-6a9f-fb0e-a563-93361402f923.png)

## 例34-2

```python
P = [0, 1]
n = 7
```

![output_8_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/a56fab68-3067-a086-456b-a7a9411a8fe4.png)


# 問３５：芒星図形

正 $n$ 角形の頂点の集合 $P_i 　(i = 1 ... n)$ に対して、点 $P_n$ と点 $P_1$, 点 $P_i$ と $P_{i+1}$ を線で結んでいくと正 $n$ 角形が描画できるが、線を結ぶ順序を工夫すると芒星図形が描ける。以下の図形を描画しなさい。

## 例35-1

![output_11_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/6a6bcee5-9e16-3f77-c6e6-832a422c0e5c.png)

## 例35-2

![output_12_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/d89861b5-714f-1a26-a230-9f02f0517426.png)

## 例35-3

![mandara.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/a41140c5-ed06-7100-5b6e-a80172042afa.png)
キーボードから手を放したくない人向けのVSCodeテク

# マウスを捨てたい

１週間に１回くらい思ってます。

キーボードだけで操作できるGUIを持つLinuxがあったら使います。

少なくとも、VSCodeはマウス無しでもいろいろできます。

VSCode関係ない部分も多少ありますが、それも含めてごらんください。

## VSCodeの起動

PATHが通ってる必要があります。

- VSCodeの場合

```bash
cd hoge
vscode .
```

- VSCode insidersの場合

```bash
cd hoge
vscode-insiders .
```

閉じるときは、`Alt+F4`

## ファイルの作成

`Ctrl+N`で、新しいタブを作る

- そのまま保存する場合

`Ctrl+S`

- とりあえず少し書きたいとき

`Ctrl+P`でコマンドパレットを開き、`Change Language Mode`で、好きな言語を選択

## ファイルの切り替え

- 開いている場合

`Ctrl+Tab`

- 開いていない場合

`Ctrl+P`で、ファイルのリストから選択するか、最初の何文字か入力し検索＋選択

※ 実はこのコマンドが死ぬほど便利で、ターミナル行ったり、検索しても、最後にはこいつでファイルに戻れる

## ファイルのリネーム・削除

リネーム・削除したいファイルを選択し、

`Ctrl+K` `R`

エクスプローラが開くので、対象ファイルをリネーム・削除

※ 開いたフォルダを消したいときは、F4でアドレスバーをいじり、Tabでフォルダにフォーカスし、削除

## ターミナルにフォーカスを移す・ターミナルを開く・ターミナルを隠す

``Ctrl+` ``

## ターミナルを閉じる

ターミナル上で、`exit`

## ワークスペースで、プロジェクトを指定してターミナルを開く

``Ctrl+Shift+` ``

## Git Bashを使っているが、コマンドプロンプトでバッチを流したいとき

`cmd`でコマンドプロンプトに切り替わる。

`exit`でGit Bashに戻る

## ターミナルを横に分割する

`Ctrl+Shift+5`

## ターミナルを横に分割するときにプロジェクトを指定する

実はこれができなくて困ってます。

今のところは、`cd`で移動しています。

## ターミナルを縦に広げる・縮める

設定が必要ですが、キーボードだけでできるので安心してください。

`Ctrl+P`でコマンドパレットを開き、「Preferences: Open Keyboard Shortcuts(JSON)」を選択します。

下記の設定を配列に追記し、`Ctrl+S`で保存し、`Ctrl+W`で閉じます。

```json:keybindings.json
[
  {
    "key": "ctrl+shift+q",
    "command": "workbench.action.toggleMaximizedPanel"
  }
]
```

``Ctrl+` ``でシェルを選択し、

`Ctrl+Shift+Q`でシェルを広げたり、縮めたりできます。

エラーが長いときに便利。

## 検索

- 開いているファイル

`Ctrl+F`

- プロジェクト内

`Ctrl+Shift+F`

## 置換

- 開いているファイル

`Ctrl+H`

- プロジェクト内

`Ctrl+Shift+H`

## デバッグ開始

`F5`

## デバッグ停止

`Shift+F5`

## デバッグ再起動

`Ctrl+Shift+F5`

## ブレークポイント設定

`F9`

## ステップイン

`F11`

## ステップアウト

`Shift+F11`

## ステップオーバー

`F10`


# 終わり

対象言語のスニペットや、フォーマット機能は、

拡張機能を入れれば大抵`Ctrl+P`で開くコマンドパレットからコマンドを打てます。

残念ながら、拡張機能のインストールをキーボードのみでは難しそうですが、`Ctrl+X`で横に出てくるので、そこからは辛いでしょうがマウスで選択してください。

最後まで見て頂きありがとうございました。
手元にあるjarファイルがどのバージョンのjavaで利用できるのかを調べたい

手元にあるjarファイルがどのバージョンのjavaで利用できるのかを調べるにはどうすればよいでしょうか? 

実をいうと、jarファイルそのものはビルドのバージョンを有していません。jarファイルというのはclassファイルやpropertiesファイルやそのほかファイルをアーカイブしたものにすぎません。たとえるなら、jarはtarやzipの親戚とでもいえばよいでしょうか。したがって、Javaの特定のバージョンでそのjarファイルが利用可能かどうかを調べるには、jarファイルそのもののバージョンではなく、そのjarファイルに格納されているclassファイルがどのバージョンのjavacでビルドされたのかを見てやる必要があります。

ここでは調査方法の例として`commons-collections4-4.4.jar` ([Apache Commons Collections v.4.4](https://commons.apache.org/proper/commons-collections/)) がどのバージョンから利用できるのかを調査してみます。

まず`jar`コマンドでjarファイルの中身を取り出します。

```
$ jar xf commons-collections4-4.4.jar
```

するとjarファイルに格納されていたclassファイルが複数見つかるはずです。ここではサンプルとして、`./org/apache/commons/collections4/ArrayStack.class`を利用することにします。

```
$ find . -name "*.class"  | head -n1
./org/apache/commons/collections4/ArrayStack.class
```

`./org/apache/commons/collections4/ArrayStack.class`がどのバージョンのjavacによりビルドされたのかを調べたいわけですが、まず手っ取り早いのが`file`コマンドを利用する方法です。この場合はJava8でビルドされていることが一目瞭然ですね。

```
$ file ./org/apache/commons/collections4/ArrayStack.class
./org/apache/commons/collections4/ArrayStack.class: compiled Java class data, version 52.0 (Java 1.8)
```

`file`コマンドがない環境では`javap`を利用しましょう。

```
$ javap -v ./org/apache/commons/collections4/ArrayStack.class | grep major
  major version: 52
```

`javap`はclassファイルを逆アセンブルするコマンドで、`-v`オプションを付けると詳細情報が出力され、その中にバージョン情報が混ざっています。これを`grep`でより分けているわけですね。ここで表示されている`major version: 52`という値はJava8を指しています。この`major version`とJavaのバージョンの対応関係については、次のページがよくまとまっているので、参考にしてください → [Wikipedia: Java class file](https://en.wikipedia.org/wiki/Java_class_file)
picoCTF 2019 flag_shop - Points: 300

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/00d427f1-9033-e7f3-03b9-d1ff27093e6b.png)

#解いてみた

ソースを見てみます。
ちょっと長いのでキモとなる部分を抜粋します。
まずはflagを表示する処理のところ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f8a069e8-9512-e017-3af9-62fa0321d2c0.png)

ソースを見る限り

```
if(account_balance > 100000){
```

を満たせばflagが表示されそうです。
account_balanceについて確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/29466db3-53b9-daa1-e0e9-f842efaf5bd3.png)

定義段階では1100が入っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/41522730-cd87-bd76-243d-8bf72ec6dbb4.png)

42行目でaccount_balanceの値を書き換える処理があるのでここをどうにか頑張る問題のようです。

```
account_balance = account_balance - total_cost;
```

の計算後account_balanceが100000より大きな値になればいいので

```
1100 - total_cost > 100000
total_cost < - 98900
```

となるようにtotal_costがなればよいわけです。
total_costはどこで書き換えられているのでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/db814932-25d0-3dca-ea44-d91b1e27cdb5.png)

ほぼさっきと同じところで処理されているだけのようです。

```
int total_cost = 0;
total_cost = 900*number_flags;
```

number_flagsは36行目で入力した数値が入ります。
ということでnumber_flagsに大きめのマイナスの値を入力したらよさそうですが、37行目で>0があるので正数である必要があります。

たしかintの仕組みを考えると最大値を超えると桁あふれがおきて最小値に行ってしまうはずです。
∵一番上のけたは符号を判断するための桁なので、桁あふれで1になって1はマイナスを示すから。

intの最大値について調べます。

データ型の最大値の確認 - Qiita
https://qiita.com/hryshtk/items/b848ed3bd78f940ac5af

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/21591b0b-1635-8080-e287-148481c52888.png)

最大値は2147483647とのこと。
試しにこの最大値を入力してどうなるか確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f53a1b31-6d31-c608-8215-2817548ce9c3.png)

-900になりました。方針はこれであってそうです。

今やりたいことはtotal_cost < - 98900を満たしたい。
そのためには

```
-98900 > 900*number_flags
-109 > number_flags
```

となるようなnumber_flagsにする。
2147483647+100=‭2147483747を設定すれば良いんでしょうか。
と思ったらなんかバグって駄目でした。

ちょっと混乱してきました。
逆に引くのか？
2147483647-100=2147483547でやってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4db570b6-dcdd-429d-c3ea-1910a19f2e54.png)

おお、引くのが正解みたい。
2147483647-1000=2147482647とかやればゴールできるか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c04f2a74-771e-1c74-9724-3fcf83d58f0f.png)

できた。
【Linuxコマンド】ファイルの作成と閲覧

# はじめに

こちらは、
`KPI 項目A：「ターミナル・コマンドに慣れる」項目A：「ターミナル・コマンドに慣れる」`
のアウトプット記事です。

# 出会い

学生時代は、Ubuntuを講義で触っていたが、
血反吐を吐くくらい嫌いだった。

「地味だし見えねえし何してんのか分からねえ。ウケる。」という感じ。

そんな記憶のまま、
先日、Linuxコマンドをバシバシ叩く案件に参加することとなった。

最近は先輩に教えて頂きながら、
ターミナルでコマンドをバシバシ叩いている。

--- 少しだけ、楽しくなってきた。 ---

そんな人間が気に入ったLinuxコマンドを書いていくぜ。

# 本編


## touch
本来はタイムスタンプを更新するためのコマンド。

しかし、今のところファイル作るためにしか使っていない。

```sh
# ファイルが作れる
$ touch ito-manager.timecard   #上司
$ touch tanaka-member.timecard #部下
```

こうすれば、部下のタイムカードを改竄することだって出来る。

```sh
# タイムスタンプを操作する
$ touch -t "201911271730" tanaka-member.timecard 
$ ls -ltr *.timecard
-rw-r--r--  1 n***********i  staff  0 11 27 17:30 tanaka-member.timecard
-rw-r--r--  1 n***********i  staff  0 11 27 20:20 ito-manager.timecard
```

## cat 

ファイルの中身を標準出力で表示するコマンド。
中身が多いと標準出力が圧迫されて、お葬式になる。

```sh
$ cat wagahai-ha-cat.book
吾輩は猫である
夏目漱石
　吾輩わがはいは猫である。名前はまだ無い。
...
```
<img width="1680" alt="image01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338551/93559173-9d98-f42b-b5be-cd5e0212e83a.png">

## head/tail

ファイルを先頭または末尾から行数や文字数を限定して出力する。

まさに、頭と尻だけを出すためのコマンド。
「頭隠して尻隠さず」のことわざに立ち向かいたいときにおすすめ。

```sh
# タイトルと作者の先頭２行だけが知りたい人向け
$ head -n 2 wagahai-ha-cat.book
吾輩は猫である
夏目漱石

# オチの最後２行だけで全て分かる人向け
# 最後の１行は改行
$ tail -n 2 wagahai-ha-cat.book
　次第に楽になってくる。苦しいのだかありがたいのだか見当がつかない。水の中にいるのだか、座敷の上にいるのだか、判然しない。どこにどうしていても差支さしつかえはない。ただ楽である。否いな楽そのものすらも感じ得ない。日月じつげつを切り落し、天地を粉韲ふんせいして不可思議の太平に入る。吾輩は死ぬ。死んでこの太平を得る。太平は死ななければ得られぬ。南無阿弥陀仏なむあみだぶつ南無阿弥陀仏。ありがたいありがたい。

```
## おまけ
### clear
標準出力をキレイキレイするコマンド。
おきのどくですが　標準出力は　きえてしまいました:scream:

```sh
$ clear
```
# まとめ
記事のテイストをいつもと変えてみた。

Linuxコマンドも地味に楽しい。

スクリプト言語には、相性もいい気がする。
初心者によるプログラミング学習ログ 170日目

# 100日チャレンジの170日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

170日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>170日目<br><br>今日もwebサイトコーディング課題<br><br>box-shadowとか区切り線がうまくいかなくて苦戦中<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1199417884750929921?ref_src=twsrc%5Etfw">November 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Angular CLIでComponentを追加する

VScodeでAngularを使ってなにか作ろうとしているのですが、コンポーネントを手軽に追加する方法を書きます。

# Angular CLI でコンポーネントを追加しよう
Angular CLIをインストールしておくことでコマンドで簡単にコンポーネントを追加することができます。

## Anguar CLIをインストール
VSCodeのターミナルで以下のコマンドを実行しましょう。

### 
```
npm install  @angular/cli
```

### バージョン指定
```
npm install  @angular/cli@8.3.19
```
### インストールできたか一応確認
```
ng --version

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/
    

Angular CLI: 8.3.19
Node: 12.12.0
OS: darwin x64
Angular: 8.0.3
... animations, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.13.9
@angular-devkit/build-angular     0.13.9
@angular-devkit/build-optimizer   0.13.9
@angular-devkit/build-webpack     0.13.9
@angular-devkit/core              7.3.9
@angular-devkit/schematics        8.3.19
@angular/cli                      8.3.19
@ngtools/webpack                  7.3.9
@schematics/angular               8.3.19
@schematics/update                0.803.19
rxjs                              6.5.3
typescript                        3.4.5
webpack                           4.29.0
```
バッチリですね:relaxed:

## コンポーネントを追加する
以下のコマンドでコンポーネントが追加されます。

```
ng g component component-name
```

実行すると以下のようにファイルが作成されます。

```
component-name
└ component-name.component.css
└ component-name.component.html
└ component-name.component.spec.ts
└ component-name.component.ts
```

あとは好きなように実装しましょう！！！
EC-CUBE4で管理画面からカテゴリナビに固定リンクを追加する方法

EC-CUBE4で管理画面からカテゴリナビに固定リンクを追加する方法を紹介します。

以下のようなイメージです。

## PC

<img width="1121" alt="外部リンクPC.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206259/65de154a-a347-1d56-ed59-ca6b0ad3470f.png">

## SP

<img width="376" alt="外部リンクSP.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206259/381aa32b-01b8-033c-60cb-a9006ff58980.png">

# 手順

PCとSPの2個のテンプレートを変更する必要があります。

## PC

1. 管理画面の `コンテンツ管理` -> `ブロック管理` のページを表示
2. `カテゴリナビ(PC)` のブロックを編集
3. 40行目付近に以下の `+` から始まる行のようにリンクを追加（先頭の `+` は消してね）
4. `登録` を押下

```diff:template/default/Block/category_nav_pc.twig
<div class="ec-categoryNaviRole">
    <div class="ec-itemNav">
        <ul class="ec-itemNav__nav">
            {% for Category in Categories %}
                <li>
                    {{ tree(Category) }}
                </li>
            {% endfor %}
+            <li>
+                <a href="http://example.com/" target="_blank">外部へのリンク</a>
+            </li>
         </ul>
     </div>
 </div>
```

## SP

1. 管理画面の `コンテンツ管理` -> `ブロック管理` のページを表示
2. `カテゴリナビ(SP)` のブロックを編集
3. 43行目付近に以下の `+` から始まる行のようにリンクを追加（先頭の `+` は消してね）
4. `登録` を押下

```diff:template/default/Block/category_nav_sp.twig
<div class="ec-headerCategoryArea">
    <div class="ec-headerCategoryArea__heading">
        <p>{{ 'front.block.category.list'|trans }}</p>
    </div>
    <div class="ec-itemNav">
        <ul class="ec-itemNav__nav">
            {% for Category in Categories %}
                <li>
                    {{ tree(Category) }}
                </li>
            {% endfor %}
+            <li>
+                <a href="http://example.com/" target="_blank">外部へのリンク</a>
+            </li>
        </ul>
    </div>
</div>
```

以上となります。
MAXScriptを使ってグループの階層構造をヘルパーに変換する

# ドキュメントの閲覧対象者
- このQiitaは以下の様な方を対象として書かれています。
 - MAXScriptを勉強している。
 - 3dsMaxを使っており、作業効率化を模索している。

# 前提条件
- グループによって構成されたノードが存在するシーンファイルで実行してください。
- 作者は3dsMax2018で動作確認しています。

# スクリプト解説
## 処理について
- 3dsMaxのグループ機能によってまとめられたノード群を、ポイントヘルパーのリンク（親子関係）構造に置き換えます。

## 使い道
- リアルタイム向けのモデリング作業等でグループを使用していたが、出力先のシステムが非対応等の理由により全ての階層構造をヘルパーで再設定しなければならない場合、など。

## 使い方
 1. スクリプト全文をコピー
 2. .ms 形式のファイルに保存
 3.  3dsMaxからスクリプトを起動

```
-- グループをヘルパーによる階層構造へ変換
(
    Fn ConvertGrp2Link objarr =
    (
        ghArr = #()
        -- objarr ノード配列からグループヘッドを探索して処理を行う
        for obj in objarr do
        (
            if (isGroupHead obj) == true do
            (
                childArr = obj.children

                -- 子要素にグループヘッドが含まれている場合は、再帰処理の対象としてghArr配列へ格納
                for child in childArr do
                (
                    if (isGroupHead child) == true do
                    (
                        appendIfUnique ghArr child
                    )
                )
    
                setGroupOpen obj true
                root = Point()
                -- 元のグループヘッドに親ノードが存在する場合、生成されたヘルパーの親としてリンク
                if obj.parent != undefined do
                (
                    ghRoot = obj.parent
                    root.parent = ghRoot
                )
                root.transform = obj.transform -- 元々のグループと同じトランスフォームに設定
                root.name = obj.name -- ヘルパーのノード名はグループヘッドの名前と同じにリネーム
                childArr.parent = root -- グループ内の子要素をすべてヘルパーの子階層へリンク
                delete obj -- 元のグループヘッドを削除
            )
        )
        -- グループヘッドがなくなるまで繰り返す（再帰処理）
        if ghArr.count > 0 do
        (
            ConvertGrp2Link ghArr
        )
    )
    -- 全ノードからグループ（グループヘッド）を探索
    ConvertGrp2Link objects
)
```

# 参考
- 公式リファレンス
 - [一般的なノードのプロパティ](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_00AB0CFA_3190_4A28_A185_4774B684F6D8_htm)
 - [ノードの共通プロパティ](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_D1D7EB56_A370_4B07_99B4_BC779FB87CAF_htm)
 - [配列の値](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_A5B54C67_BFDD_45C0_9D6B_E6869817282A_htm)
 - [Point: ヘルパー](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_855B3FB3_55BB_484B_B2DF_FA718860B462_htm)
[Laravel]テキスト中のURLをリンクに自動で置換する

###概要
テキスト中にあるURLを自動でリンクに置換することでフロント側でリンク化する手間が省けるのでバックエンドで処理をしてみました。


###URLをリンク化する
今回はテキスト中にURLの行のみがある場合にリンク化させます。文章中のURLは、リンク化しない正規表現にしました。


```php
https://sample.co.jp  //リンク化
https://test　テスト   //無視
```

###$textのURLをリンク化

```php
public static function replaceUrl($text)
    {
        $texts = explode(PHP_EOL, $text); //PHP_EOLは,改行コードをあらわす.改行があれば分割する
        $pattern = '/^https?:\/\/[^\s 　\\\|`^"\'(){}<>\[\]]*$/'; //正規表現パターン
        $replacedTexts = array(); //空の配列を用意

        foreach ($texts as $value) {
            $replace = preg_replace_callback($pattern, function ($matches) {
            //textが１行ごとに正規表現にmatchするか確認する
                if (isset($matches[1])) {
                    return $matches[0]; //$matches[0] がマッチした全体を表す
                }
            //既にリンク化してあれば置換は必要ないので、配列に代入
                return '<a href="' . $matches[0] . '" target="_blank" rel="noopener">' . $matches[0] . '</a>';
            }, $value);
            $replacedTexts[] = $replace;
            //リンク化したコードを配列に代入
        }
        return implode(PHP_EOL, $replacedTexts);
        //配列にしたtextを文字列にする
    }
```

####使用したメソッド
*explode* — 文字列を文字列により分割する
(https://www.php.net/manual/ja/function.explode.php)
*preg_replace_callback* — 正規表現検索を行い、コールバック関数を使用して置換を行う
(https://www.php.net/manual/ja/function.preg-replace-callback.php)
implode — 配列要素を文字列により連結する
(https://www.php.net/manual/ja/function.implode.php)

###使っている正規表現について
```php5

$pattern = '/^https?:\/\/[^\s 　\\\|`^"\'(){}<>\[\]]*$/' 
```
`^` 先頭にhttpsまたはhttpにマッチする
`\` 直後の正規表現記号を エスケープ 
`[^...]`角括弧に含まれる文字以外にマッチ
ここでは、半角、全角スペースとURLで除外される記号以外とマッチさせています
`*` 直前の文字が ０回以上 繰り返す場合にマッチします。最長一致。
`?` 直前の文字が ０個か１個 の場合にマッチします。最長一致。


###あとがき
文字列を改行ごとに分割して、分割したものが正規表現にマッチした場合URLをリンク化し、
それをまた文字列に変換したりとするなど色々考えたので勉強になりました。
正規表現もURLとマッチするものを考える作業が楽しかったです。



###参考記事
(https://qiita.com/sukobuto/items/b6cdfa966b29823c62f0)
matplotlibグラフ関係忘備録（最小限）

# 日本語化
```python
import matplotlib.pyplot as plt
import japanize_matplotlib
```

# 保存（解像度も設定）
```python
plt.savefig("name.png",format = 'png', dpi=300)
```

# figureとaxesを同時作成
下記の例では、axは行×列数個の要素を持つ。

```python
#figureという大きな領域を用意し、rows_graph×columns_graph個のグラフ描画領域を作成するイメージ
fig, ax = plt.subplots(rows_graph,columns_graph,figsize=(10,42))

#各ax要素にアクセスし、プロット。
ax[i,j].plot(x,y)

#複数描きたい場合は、for文（ネスト）で複数のグラフ描画
for j,day in enumerate(date_list):
    for i,item in enumerate(cal_items):
        ax[i,j].plot(x,y)
```

# タイトル、軸、凡例関係
axisではなく、axesのメソッドであることに注意

```python
ax.set_title('タイトル')
ax.set_xlabel('x軸名')
ax.set_ylabel('y軸名')
ax.set_xlim(min,max)
ax.set_ylim(min,max)
ax.legend(['A','B'])#系列が２つある時
```
https://matplotlib.org/1.5.1/faq/usage_faq.html#parts-of-a-figure
![fig_map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/3ee852bf-ad5b-d2e9-c74f-b069c8844089.png)
Laravel6.5 ログイン(login)画面と登録画面(register)画面のレイアウトの崩れを修正

# ログイン画面と登録(register)画面のレイアウト崩れをただす方法

Laravelをインストールして、いざ開発してみようとしたらレイアウトが崩れてる。。。
![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/f29d520c-97c0-e1a6-5183-2f8d608367a1.png)



開発環境
・AWS Cloud9
・PHP 7.3.11
・Laravel6.5

Laravelのインストール後、

```qiita:ターミナル
$ composer require laravel/ui
```


```qiita:ターミナル
$ php artisan ui vue --auth

$ php artisan migrate
```

```qiita:ターミナル
$ npm install
npm WARN deprecated fsevents@1.2.9: One of your dependencies needs to upgrade to fsevents v2: 1) Proper nodejs v10+ support 2) No more fetching binaries from AWS, smaller package size
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

added 1011 packages from 489 contributors and audited 17168 packages in 26.202s
found 0 vulnerabilities
```

LaravelはCSS/JavaScriptのファイルをコンパイルする必要があります。

```qiita:ターミナル
$ npm run dev

> @ dev /home/ec2-user/environment/instaAutoPost
> npm run development


> @ development /home/ec2-user/environment/instaAutoPost
> cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js

12% building 20/23 modules 3 active ...t/node_modules/jquery/dist/jquery.js
```
![npm run dev.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/7a1b211f-d855-597e-8bcf-3a7637028a51.png)

こんな感じで出たら無事、ビルド終わりです。
![login success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/a477cc04-1bf2-321f-c4d9-31849ed0e973.png)

ちゃんと表示されました。

参考ページ
<a href="https://qiita.com/daisu_yamazaki/items/a914a16ca1640334d7a5">Laravel6.0「make:Auth」が無くなった 〜Laravel6.0でのLogin機能の実装方法〜MyMemo</a>
Javaプログラミング (クラスメソッド)

#クラスメソッド
ここではクラスメソッドについて紹介します。
クラスのなかの変数でstaticが宣言時に頭についたものをクラス変数と言いました。同じように、メソッドでstaticが宣言時に頭についたものをクラスメソッドと言います。クラスの構成やメソッドの書き方や呼び出し方がわかれば読めると思います。また、アクセス指定子も説明は省きます。(知らなくても読めると思いますが。)
##クラスメソッドの特徴
クラスメソッドは呼び出すときにはインスタンス化をしません。呼び出すときはクラス名を使います。それによって便利なことや注意するべきことがあります。
###クラスメソッドの構成
クラスメソッドの書き方と使い方をまとめました。
####クラスメソッドの定義の仕方
クラスメソッドの書き方は次のようになります。

```java
public class クラス名{ 
  public static 戻り値の型 メソッド名(引数の型　引数){
  // メソッドの中身
  }
}
```
staticがつくだけです。なので、構成というほどのものはありません。
ただし、staticなメソッドはstaticなメソッドしか使えません。
####クラスメソッドの呼び出し方
クラスメソッドはインスタンスせずにクラス名を使って

```java
クラス名.メソッド名(引数の型　引数);
```
みたいに呼び出します。
###クラスメソッドの例
次にクラスメソッドの例を書いてみましょう。
クラス名はCallクラスです。

```java
public void Call(){
  public static void Dog(){
   System.out.println("ワンワン");
  }
  
  public static void Cat(){
    System.out.println("ニャーニャー");
  }

  public static void Monkey(){
    System.out.println("ウキー");
  }
}
```
このクラスのstaticなメソッドをメインメソッドから呼び出します。このとき、インスタンス化せずにクラス名を使って呼び出していることに注意してください。

```java
public class MainMethod(){
 public static void main(String[] args){
  Call.Dog();
  Call.Cat();
  Call.Monkey();
 }
}
```
これで次のように

```
ワンワン
ニャーニャー
ウキー
```
という出力になります。

###クラスメソッドの注意
クラスメソッドはインスタンス化しません。つまり、インスタンス毎に区別することが出来ません。例えばつぎのクラスではインスタンス毎のクラスの中のメソッドが呼び出された回数を変数instans_countでカウントします。この変数instans_countはインスタンス化するからこそ意味があります。なので、staticなメソッドでは意味をなさなくなります。

```java
public class ClassValue2 {
    private int s = 3;
    private static int static_count = 0;
    private int instans_count = 0;

    public void add(int num){
        s = num + s;
        static_count = static_count + 1;
        instans_count = instans_count + 1;
    }

    public void substract(int num){
        s = -num + s;
        static_count = static_count + 1;
        instans_count = instans_count + 1;
    }

    public void multiple(int num){
        s = num*s;
        static_count = static_count + 1;
        instans_count = instans_count + 1;
    }
    public void division(int num){
        s = 1/num*s;
        static_count = static_count + 1;
        instans_count = instans_count + 1;
    }

    public void confirmation(){
        System.out.println("static_count:" + static_count);
        System.out.println("instans_count:" + instans_count);
        System.out.println("s:" + s);
    }

}
```
AWS CodePipelineを通すとsymlinkがテキストファイルになる件

# はじめに

AWS CodePipelineはデフォルトでは、

1. Source

2. Build

3. Deploy

の3ステージでCI/CDパイプラインを実行します。

上記のSourceステージのリポジトリにsymlinkがあった場合、それらはBuildステージの段階でただのテキストファイルに変化してしまうようです。

# Sourceステージでの状態

以下は、Sourceステージ(CodeCommitあるいはGitHubリポジトリ)での状態です。
この段階ではsymlinkとなっています。

```console:
$ ls -l
-rw-r--r--  1 foo  bar  193 Nov 27 19:10 appspec.yml
-rw-r--r--  1 foo  bar    0 Nov 27 19:10 blank.txt
-rw-r--r--  1 foo  bar  108 Nov 27 19:10 buildspec.yml
lrwxr-xr-x  1 foo  bar    9 Nov 27 19:10 symlink.txt -> blank.txt # symlinkになっている
```

# Buildステージでの状態

次に、Buildステージでの状態を見てみます。

具体的にはマネジメントコンソールのCodeBuildの画面での、このファイルです。
Sourceステージのリポジトリの特定のブランチ・コミットが、ZIPに固められてS3にアップロードされたもの、という理解です。

![スクリーンショット 2019-11-27 19.57.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/4e6159b0-171e-a587-31da-f71395bb238d.png)

これをダウンロードして中身を見てみると、以下の通りsymlinkでは無くなっています。

```console:
$ ls -l
-rw-rw-r--  1 foo  bar  193 11 27 10:01 appspec.yml
-rw-rw-r--  1 foo  bar    0 11 27 10:01 blank.txt
-rw-rw-r--  1 foo  bar  108 11 27 10:01 buildspec.yml
-rwxrwxrwx  1 foo  bar    9 11 27 10:01 symlink.txt # symlinkではなくなっている
```

symlink.txtの中身は以下のようなテキストファイルになっています

```symlink.txt
blank.txt
```

# 最後に

CodePipelineの仕様？なんでしょうか。

CodePipelineを使っていて、気になった点でした。
DELL管理ツール（OMSA）のインストール方法・利用方法

## はじめに
* DELLのサーバを利用している方ならご存知かと思いますが、`OMSA（OpenManage Server Administrator）`のナレッジを整理します。

## OMSAとは
* DELLが提供している管理ツールOpenManage Server Administrator（通称：OMSA）のこと。
* WebブラウザやCUIでHW状態確認が可能。

## OMSAインストール手順
* DELLのyum repositoryを設定。

```
# wget -q -O - http://linux.dell.com/repo/hardware/latest/bootstrap.cgi | sudo bash
```

* OMSAのコンポーネントをyumでインストール。

```
# yum install -y srvadmin-all
```

* OMSAを起動。

```
# /opt/dell/srvadmin/sbin/srvadmin-services.sh start
```

## OMSAの利用
* OMSAが起動した状態でWebブラウザから以下のURLへアクセスする。
    * https://<ホスト名 or IPアドレス>:1311/

* 以下のログイン画面が出るので、ユーザとパスワードを入力する。

<img width="666" alt="51526059-e5aef980-1e74-11e9-968a-a42836551bd4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320001/20d5368e-76f3-bf4e-397e-10b0a2310454.png">

* ログインをすると、HWの状態やログを確認することが可能となる。
    * 2枚目のキャプチャはストレージの状態を確認したサンプル

<img width="1224" alt="51526066-e8115380-1e74-11e9-816a-aaef12f857a5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320001/e098b00e-3738-6a0a-1646-e256d3d58e20.png">
<img width="1211" alt="51526080-eb0c4400-1e74-11e9-8bbb-38a40b2c8bdf.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320001/297acc44-26c2-884b-44f1-7e9b8dfb975f.png">

## CLIの使い方
* OMSAをインストールすると、CLIでHWの状態確認を行うことが可能になる。
    * 詳細は別途、整理予定。
シェルスクリプト サブシェル

##### サブシェルを動かしてみる
シェル変数を局所的に使用したい場合など、元のシェルの状態に影響を与えないで何らかの処理を行いたい場合、その部分のリストを () で囲むことで、サブシェルを実行させることができる。

```bash:sub-shell-example1.sh
SH="Main"
echo "$SH"
(
  SH="Sub"
  echo "$SH"
)
echo "$SH"
```

上記のスクリプトを実行させた場合、同じ変数SHを使用しているが、元のシェル変数は変更されない。

```bash:sub-shell-result1
$ ./sub_shell-example1.sh 
Main
Sub
Main
```

##### サブシェルのプロセス
```bash:sub-shell-example2.sh
echo "Main"
(
  while : ;do
    echo "Sub"
  done
)
```

2つのプロセスで動いていることが分かる。

```bash:sub-shell-result2
$ ps aux | grep sub-shell
blueskyarea  27800  0.0  0.0  13312  3132 pts/3    S+   18:54   0:00 /bin/bash ./sub-shell-example2.sh
blueskyarea  27801 94.2  0.0  13312   260 pts/3    R+   18:54   0:25 /bin/bash ./sub-shell-example2.sh
```

##### グループコマンドとの違い
サブシェルは、グループコマンドと似ているが、グループコマンドは同じシェル内で動作する。

```bash:sub-shell-example3
SH="Main"
echo "$SH"
{
  SH="Sub"
  echo "$SH"
}
echo "$SH"
```

グループコマンドは同じシェルのプロセス上で動いているため、最初に定義したシェル変数が書き換わっている。

```bash:sub-shell-result3
$ ./sub_shell3.sh 
Main
Sub
Sub
```

##### サブシェルの出力をリダイレクト
```bash:sub-shell-example4.sh
(
  cd
  pwd
  ls -l
) > sub_output
```

リダイレクト先のファイル（sub_output）の中身

```bash:sub-shell-result4
/home/blueskyarea
total 1516
drwx------ 2 blueskyarea blueskyarea   4096 Aug  2 07:13 Desktop
drwxr-xr-x 2 blueskyarea blueskyarea   4096 Aug  2 07:13 Documents
drwxr-xr-x 4 blueskyarea blueskyarea   4096 Oct 25 17:59 Downloads
```
Laravel でむやみに Model all() を使うとパフォーマンスが悪くなる

## はじめに
(サンプルのバージョンは 5.5 で書いてます)

Laravelって便利。リレーションだって簡単に貼れます。
しかし、書き方によって予期しない挙動したので備忘録として残します。

## 実際にやってみた

まずサンプルとして、ユーザ情報を扱うテーブルと、トレーニング情報を扱うテーブルを用意。

```sql
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(64) NOT NULL COMMENT '名前',
  `deleted_at` datetime DEFAULT NULL COMMENT '削除日時',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='ユーザ';

CREATE TABLE `trainings` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `trained_user_id` int(10) unsigned NOT NULL COMMENT 'トレーニング者',
  `summary` varchar(255) NOT NULL COMMENT '概要',
  `deleted_at` datetime DEFAULT NULL COMMENT '削除日時',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='トレーニング';

```

トレーニング情報と一緒に、トレーニング者のユーザ名を取得したいとき、
Modelクラスでこのように関数を設置し、belongsToでリレーションを貼っておくと、
Training情報を取得した時にも trained_user関数 を呼び出しただけで users 情報を取得できます。

```php:Training.php
use Illuminate\Database\Eloquent\Model;

/**
 * Class Training
 */
class Training extends Model
{
    public function trained_user()
    {
        return $this->belongsTo(User::class);
    }
}
```


```php
$trainings = Training::all();
$trainings[0]->trained_user->name; // トレーニング者の名前が取れる
```

でも、やったね！と思ってクエリログを見ると愕然します...

```sql
select * from `trainings` where `trainings`.`deleted_at` is null
select * from `users` where `users`.`id` = '1' and `users`.`deleted_at` is null limit 1
select * from `users` where `users`.`id` = '2' and `users`.`deleted_at` is null limit 1
select * from `users` where `users`.`id` = '3' and `users`.`deleted_at` is null limit 1
```

みてください、・・・ユーザ分毎回SQL投げてる；；；；
めっちゃパフォーマンス悪い；；；；

反省して書き直し。

```php
$trainings = Training::with(['trained_user'])->get(); // trained_user を設定する
$trainings[0]->trained_user->name; // 同様にトレーニング者の名前が取れる
```
クエリログは・・・

```sql
select * from `trainings` where `trainings`.`deleted_at` is null
select * from `users` where `users`.`id` in ('1', '2', '3') and `users`.`deleted_at` is null
```

期待どおりの結果になりました！
というわけで、リレーション貼ってる時は気をつけましょう〜
Python loggingでsyslog出力するサンプルプログラム

```py
#!/usr/bin/python  
# -*- coding: utf-8 -*-
import logging
import logging.handlers

logging.basicConfig(filename='/tmp/logger.log', level=logging.DEBUG)
log = logging.getLogger("test_logge_name")

syslog_handler = logging.handlers.SysLogHandler(address="/dev/log", facility=logging.handlers.SysLogHandler.LOG_LOCAL1)
#syslog_handler.setLevel(logging.WARNING)

log.addHandler(syslog_handler)
log.debug('Test Debug message')
log.info('Test Info message')
log.warning('Test Warning message')
log.error('Test Error message')
log.critical('Test Critical message')
```
AWS Rekognition デモまとめ

## 目的

前回の投稿でMLの動画解析ソリューションを調べました。
[機械学習関連AWSソリューション簡易まとめ](https://qiita.com/ykajiro/items/58cfb12a6f945624947f)

今回は実際にRekognitionのデモを体験したので、
スクショを貼って具体のイメージが持てる状態にしたいです。

---

## オブジェクトとシーンの検出

画像に現れるオブジェクト検出を行います。自分の画像で解析してみましたが、オブジェクトは汎用的なものが多く精度はデモ画像ほど検出してくれませんでした。動画を検索する際のキーワード抽出等で活用できるかもしれません。
<img width="1000" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191585/49efb33a-e332-9145-2fa7-6bb084a9f526.png">

---

## 画像の節度

サービスを提供する側にとって、不適切な画像などは検知したい場合があると思います。家族の画像の場合は問題ないですが、水着の女性の画像は`Suggestive`と判定されています。この判定がされた場合に映像の検品などのユースケースがあると思います。
<img width="1000" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191585/d486d000-480b-bb6b-962d-d7ec3294eba3.png">

---

## 顔の分析

笑っているなど、顔の情報が取得できます。複数人いる場合もそれぞれ検出してくれます。自分の画像で試してもかなりの精度でした(99％の確率で幸せとのこと笑)。動画を検索する際のキーワード抽出等で活用できるかもしれません。
<img width="1000" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191585/c9bc3d32-b7d0-238c-1c82-a3ec7177e061.png">

---

## 有名人の認識

日本人かつ複数人の有名人が写る画像でもちゃんと判定してくれました(沢尻エリカはiconiqと誤判定された)。たまたま目に止まったbishというバンドメンバーでは判定できませんでした。動画を検索する際のキーワード抽出等で活用できるかもしれません。
<img width="1000" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191585/aa18dc8b-d982-0392-320a-dfd85896f3b8.png">

---

## 顔の比較

そのままの機能ですが、自分の画像で試してみたところかなりの精度で検出してくれました。動画のグルーピングに活用できそうです。
<img width="1000" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191585/788161b9-e8a1-7f79-195f-12d4c41eb53d.png">

---

## イメージ内のテキスト

いわゆるOCRです。デモのためなのかわかりませんが、日本語は対応してないようでした。
<img width="1000" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191585/7f4ef74f-9978-f50c-dfa5-f3a6e4415a7c.png">

---

## ビデオ分析

ビデオ分析では今まま説明した機能が入っていました。動画のプレビューにあるオレンジの帯は選択した人物やオブジェクトの出現時間となります。利用してみましたが、オブジェクトの出現時間の精度がいまいちのようでした。
<img width="1000" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191585/52f60b5c-bda4-ee2e-07a7-d269eef3cbcf.png">

---

## まとめ

Rekognitionでは人物検出など既に実用できるレベルでした。懸念があるのはオブジェクト検出です。そもそもオブジェクト検出は膨大な種類から特定する難しい問題だとは思います。そのため用途を限定する必要があると感じました。Rekognitionの概要は掴めたので、次はAzureのVideo indexerを利用してみたいと思います。
カスタム投稿タイプの管理画面にタクソノミー列を追加

#列に行を追加
```functions.php
function add_custom_column( $defaults ) {
$defaults['event_cat'] = 'カテゴリー';
return $defaults;
}
add_filter('manage_event_posts_columns', 'add_custom_column');
```

'event' : 投稿タイプ
'event_cat' : タクソノミー名


#追加した行にタームを追加
```functions.php
function add_custom_column_id($column_name, $id) {
if( $column_name == 'event_cat' ) {
echo get_the_term_list($id, 'event_cat', '', ', ');
}
}
add_action('manage_event_posts_custom_column', 'add_custom_column_id', 10, 2);
```


#列の順番を変更
```functions.php
function sort_custom_columns( $columns ) {
  $columns = array(
    'cb'     => '<input type="checkbox" />',
    'title'  => 'タイトル',
    'region' => 'カテゴリー',
    'date'   => '日付'
  );
  return $columns;
}
add_filter( 'manage_event_posts_columns', 'sort_custom_columns' );
```


#アイキャッチを表示
```functions.php
function add_custom_column( $defaults ) {
$defaults['thumbnail'] = 'サムネイル';
$defaults['event_cat'] = 'カテゴリー';
return $defaults;
}
add_filter('manage_event_posts_columns', 'add_custom_column');

function add_custom_column_id($column_name, $id) {
if( $column_name == 'event_cat' ) {
echo get_the_term_list($id, 'event_cat', '', ', ');
}
if ( 'thumbnail' == $column_name ) {
		$thumb = get_the_post_thumbnail($post_id, array(80,80), 'thumbnail');
		echo ( $thumb ) ? $thumb : '?';	
	}
}
add_action('manage_event_posts_custom_column', 'add_custom_column_id', 10, 2);

function sort_custom_columns( $columns ) {
  $columns = array(
    'cb'     => '<input type="checkbox" />',
    'title'  => 'タイトル',
    'thumbnail'  => 'サムネイル',
    'region' => 'カテゴリー',
    'date'   => '日付'
  );
  return $columns;
}
add_filter( 'manage_event_posts_columns', 'sort_custom_columns' );
```
Spackでドツボに嵌った話

# はじめに
世の中にはSpackというパッケージマネージャーがありまして

 - OSがCentOS7等でgcc等のパッケージが古め
 - ユーザー権限だけで最新のgccやclangを入れて使いたい

というような人には魅力的な選択肢です。
ただやっぱり落とし穴はあります。
ここではSpack初心者の私が嵌った落とし穴を紹介していこうと思います。

# clangがみつからない！

最新版のgccとclangが欲しかったのでした。最小限のセットアップが済んでいれば

```shell
$ spack install gcc
```

10分かそこらの時間はかかりますが、依存するパッケージを含めて`gcc@9.2.0`が入ってくれます。いやこれは楽チン。この要領でclangも：

```shell
$ spack install clang
==> Error: Package 'clang' not found.
```

残念無念、標準のリポジトリにclangは入っていないのでしょうか。
実は名前が違うだけです。

```shell
$ spack install llvm
...
$ spack load llvm
```

これで（ビルドが問題なく通れば）最新のclang/clang++が使えるようになります。
初心者には厳しいですねこれ。

# でもビルドが通らない

`llvm`のインストール中に、`perl-data-dumper`というパッケージのビルドで必ずコケてしまうようになってしまいました。
なにをやったらそんなことになってしまったのか、順を追ってみます（原因が判明して直ってしまったので、再現実験と詳細な画面コピペはまた後日）。

CentOS7に入っているgccはversion 4.8.5です。この状態で

```shell
$ spack install gcc
```
とすることで`gcc@9.2.0`が依存パッケージを含めて入ります。これをこのまま使っても別によいのですが、これで入ったのは`gcc@4.8.5でビルドされたgcc@9.2.0`と`gcc@4.8.5でビルドされた依存パッケージ`です。どうせなら全部`gcc@9.2.0`でコンパイルし直したほうが気持ちいいですよね。

```shell
$ spack load gcc
$ spack compiler find
$ spack install gcc
```
これで目出度く`gcc@9.2.0でビルドされたgcc@9.2.0`と`gcc@9.2.0でビルドされた依存パッケージ`が入ります。

```
$ spack find -l
```
とすれば全てのパッケージが綺麗に重複して入っていることがわかります。`gcc@4.8.5`でビルドされた方を残しておく理由もないだろうと`spack uninstall`で全部消してしまいました。新しいコンパイラパスをspackに登録しておくため

```shell
$ spack compiler remove gcc@9.2.0
$ sparc load gcc
$ spack compiler find
```

としました。gccの方は準備できたということで次はclangなのですが、依存パッケージの`perl-data-dumper`のビルドが通らない。

```shell
$ spack install perl-data-dumper
```
が必ずコケてしまいます。どうやら`/tmp`以下でビルドしているようなのでそこを見に行くと`Makefile`があってその中身に

```Makefile
CC = `gcc@4.8.5でビルドしたgcc@9.2.0のパス`/gcc
```

などと書かれています。`gcc@4.8.5でビルドしたgcc@9.2.0`はとっくに削除されているので、そりゃmakeすれば「そんなファイルない」で即死するわ。問題は

 - 誰がどうやってこんなMakefileを生成できたのか
 - 削除済みのコンパイラのパスなんて文字列を何処から拾ってこれたのか

ちなみに`.spack/linux/compilers.yaml`を調べても古いパスは残っていませんでした。

#何が問題だったか

どうやら一部のperl系のパッケージはビルド時に

```shell
$ perl Makefile.PL
```
のようにして`Makefile`を作っているようです。ただしこの`perl`もspackで入れたものになります。なのでこの`perl`は`gcc@9.2.0`でコンパルされたものということになります。しかもどうやら、
**この`perl`は自分が`gcc@4.8.5でビルドされたgcc@9.2.0`でビルドされたということを覚えているようなのです！！**
そして自身をコンパイルしたgccのパスを件の`Makefile`に書いてしまったらしい。いや君をコンパイルした`gcc@9.2.0%gcc@4.8.5`[^1]ではなくspackに登録されてる`gcc@9.2.0%gcc@9.2.0`を使わなきゃ駄目でしょうに。

[^1]: どうもspackでは`@`後置でバージョン番号、`%`後置でビルドしたコンパイラのような表記をするみたいです。

といわけで対処療法、というかこのやり方で治ったから上述のような推論にいたったわけですが、一度依存パッケージを含めて`perl%gcc@9.2.0%gcc@4.8.5`をアンインストール、`perl@gcc@9.2.0%gcc@9.2.0`を再インストールすることで`perl-data-dumper`のビルドも成功するようになりました。

実はまだ`llvm@9.0.0`のビルドを通し切ってはいません。ただ、下手に古いコンパイラの削除とかをするとドツボに嵌まるということがよくわかりました。上手くいきますように🙏