OmniAICreator/Qiita-1.07M huggingface dataset:
魔法JS☆あれい 最終話「flatの、最高のflatMap」

登場人物

丹生（にゅう）あれい
魔法少女「魔法（マジカル）JS（女子小学生）☆あれい」として活動中。

イテレー太
正体不明の魔法生物。

第1部「ミューテーター・メソッド編」
* [第1話「popでpushした、ような……」](https://qiita.com/8amjp/items/e44e707ccc8c95b4a40d)
* [第2話「shiftはとってもunshiftって」](https://qiita.com/8amjp/items/3fc1b2defd28ba1c2df3)
* [第3話「もうsortもreverseも怖くない」](https://qiita.com/8amjp/items/86f5294981fbebd3fe2d)
* [第4話「fillも、spliceも、copyWithinもあるんだよ」](https://qiita.com/8amjp/items/0741e35b70ea32711265)

第2部「アクセサ・メソッド編」
* [第5話「joinなんて、concatなわけない」](https://qiita.com/8amjp/items/229c41ad2146728abd89)
* [第6話「indexOfなの絶対lastIndexOf」](https://qiita.com/8amjp/items/f7e421722e419c1c0a7d)
* [第7話「includesのsliceと向き合えますか？」](https://qiita.com/8amjp/items/007ac192399225db3843)

第3部「イテレーション・メソッド編」
* [第8話「filterって、ほんとfindとfindIndex」](https://qiita.com/8amjp/items/f7014b09c5c2a6440a74)
* [第9話「someなの、everyが許さない」](https://qiita.com/8amjp/items/ec91d29f8f166b45efbb)
* [第10話「もうmapにもforEachにも頼らない」](https://qiita.com/8amjp/items/25859c085119cdceed89)
* [第11話「最後に残ったreduceとreduceRight」](https://qiita.com/8amjp/items/c3f58868fd773e1d2da2)

## flat()

イテレー太「早いもので、今回でついに最終話だよ……」
あれい「短い付き合いだったな駄犬」
イ「だけど、戦いはまだ続いてるよ！　召喚したデータは[第8話](https://qiita.com/8amjp/items/f7014b09c5c2a6440a74)を参照してね！」
あ「おう」
イ「そして、最後の敵の弱点は、『記事で使われているすべてのタグ（`tags`）の一覧』だよ！　さあ、タグの一覧を`return`して敵を倒してよ！」
あ「最後まで面倒くせえなあ……」

```js
return items.map(item => item.tags).flat();
```

あ「これでいいのか」
イ「さすがあれい、最後まで頑なに盛り上がりポイントを作らなかったね！　そして解説をお願い！」
あ「面倒くせえなあ……`map()` メソッドですべての記事にアクセスして、`tags`の値を取得している。ただし、そのままだと……」

```js
[
  [
    { name: 'JavaScript', versions: [] },
  ],
  [
    { name: 'JavaScript', versions: [] },
  ],
  ...
]
```

あ「このように階層化（ネスト）された配列が出来上がるので、`flat()` メソッドで配列をフラットにしているわけだ。その結果……」

```js
[
  { name: 'JavaScript', versions: [] },
  { name: 'JavaScript', versions: [] },
  ...
]
```

あ「こういう配列が完成する」
イ「！！！　最終話にして、あれいが積極的に解説してるよ！　僕は感涙を禁じ得ないよ！」
あ「やかましい」

### 解説

> `flat()` メソッドは、すべてのサブ配列の要素を指定した深さで再帰的に結合した新しい配列を生成します。

（[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/flat)より）

`flat()`メソッドは、階層化（ネスト）された配列をフラット化するメソッドです。
なお、「フラット化する階層の深さ」を引数に指定することができます。既定値は1です。

## flatMap()

あ「ちなみに、さっきのは`flatMap()`を使うとさらに簡単に記述できるぞ」

```js
return items.flatMap(item => item.tags);
```

イ「あ、あれいの様子が今までと違うよ！　僕の知らないうちに世界が再構築されたんだろうか！？」
あ「うるせえしばくぞ」

### 解説

> `flatMap()` メソッドは、最初にマッピング関数を使用してそれぞれの要素をマップした後、結果を新しい配列内にフラット化します。これは深さ 1 の [flat](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/flat) が続く map と同じですが、`flatMap` はしばしば有用であり、2 つのメソッドを 1 つにマージするよりもやや効果的です。

（[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap)より）

まさに名前の通り[`flat()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/flat)＋[`map()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)なメソッドです。配列内のすべての要素に`map()`メソッドと同様にコールバック関数を実行し、その結果をフラット化した配列にして返します。

## エピローグ

……というわけで、魔法（マジカル）JS（女子小学生）☆あれいの物語はこれで完結です（すべてのメソッドを網羅できたわけではないですが）。JavaScriptで配列を操るメソッドの面白さと奥深さ、少しでも伝われば幸いです。お付き合いありがとうございました。
Laradockで簡単にLaravel環境構築

#前提
- Mac環境で進めていきます
- Dockerが既にインストールされている
- gitがインストールされている

#フォルダ作成
まずは適当なファイルを作りましょう

```
$ mkdir docker_laravel 
```

次に作ったフォルダに移動します

```
$ cd docker_laravel
```

このフォルダにLaradockを構築していきます

#Laradockをcloneする
では早速Laradockを先ほど作ったフォルダにcloneします
下記を実行してください

```
$ git clone https://github.com/LaraDock/laradock.git
```

上記で`doker_laravel`に`laradock`フォルダが作成されます
`laradockフォルダ`に移動します

```
$ cd laradock
```
laradockに.envファイルを作成します

```
$ cp env-example .env
```
これで、`laradockフォルダ`に.envが作成されました

#Laravelの作成
次にLaravelプロジェクトを作成していきます
`workspace`コンテナを動かします
この`workspace`コンテナにcomposerやlaravelなどが含まれており
artisanコマンドやnpmなども実行できます
`workspace`コンテナを動かしコンテナ内に入ることで上記コマンドも実行できます

コンテナを動かす

```
$ docker-compose up -d workspace
```

コンテナに入る

```
$ docker-compose exec --user=laradock workspace bash
```
コンテナに入ったらLaravelプロジェクトを作成

```
$ composer create-project laravel/laravel sample
```
上記までを無事に実行できれば
`docker_laravel`フォルダ内には`laradock`と`sample`フォルダが入っているはずです

コンテナから出ます

```
$ exit
```

コンテナを一旦止めます

```
$ docker-compose stop
```



#.envの編集(laradock側)
laradock内の.envファイルを下記のように修正してください

```
変更前
APP_CODE_PATH_HOST=../

変更後
APP_CODE_PATH_HOST=../sample
```

```
変更前
DATA_PATH_HOST=~/.laradock/data

変更後
DATA_PATH_HOST=.laradock/data
```

```
変更前
MYSQL_VERSION=latest

変更後
MYSQL_VERSION=5.7
```

#.envの編集(sample側)

```
変更前
APP_NAME=Laravel

変更後
APP_NAME=Sample
```

```
変更前
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

変更後
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```

これで準備は完了です

#コンテナを立ち上げる
それでは、コンテナを立ち上げてLaravelのwelcomeページにアクセスしましょう

```
$ docker-compose up -d workspace nginx mysql
```
これでこちらのURLにアクセスしてwelcomeページが表示されればOKです→[こちら](http://localhost)

#DBにアクセスする
ターミナルにてlaradockに移動してください
laradockにて下記コマンドを実行してください

```
$ docker-compose exec mysql bash
```

これでmysqlコンテナに入れました
さらに下記のコマンドを入力してください

```
$ mysql -u root -p
```
上記を入力するとパスワードを求められますので下記を入力

```
$ secret
```
これでmysqlに入れたかと思います

#マイグレーションの実行
実際にDBの接続がきちんとできているかを確かめるために
マイグレーションを実行して、テーブルを作成してみましょう
ターミナルにて`laradock`に移動し下記コマンドを実行してworkspaceコンテナに入ります

```
$ docker-compose exec workspace bash
```
これでコンテナに入れました
マイグレーションを実行します

```
$ php artisan migrate
```
上記を実行し無事にマイグレーションが実行され
DBにテーブルが追加されていれば完了です

#終わりに
以上がLaradockを使ってLaravelの環境を構築と
マイグレーションの実行やDBの操作方法になります

私はDockerにあまり詳しくないのですが
そんな自分でも簡単に環境を用意することができました

Dockerにそこまで詳しくないけど
Dockerで開発してみたいと言う方は是非、挑戦してみてください
STM32CubeIDEでタイマなどの初期化時の値を変数にする

　STM32CubeIDEで、タイマなどのパラメータをDevice Configuration Tool(GUIの画面)ではなく、プログラム内でパラメータを指定したい場合がある。（あるでしょ?
　Device Configuration Toolで指定するパラメータは自動生成されるコードの初期化値なので、ユーザコード内で変更可能だが、それをするとコード生成の意味が薄れる。

　実は？このパラメータ入力では数値ではなく、変数も利用可能である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558094/71c35e56-e93d-d88c-74f8-e294c50a8f96.png)

図のようにパラメータ入力右の歯車のボタンから"No check"とすると変数を記入できる。

あとはユーザコード内でグローバル変数orマクロを定義することで、main.c内でパラメータを変更できる。

**注:ここで指定した変数を初期化後に変更しても、自動生成された初期化関数を実行しないと、反映されません。
　また、ユーザコード内でパラメータの変更行うために自動生成された初期化関数を実行することは適切でないと思われます。
　あくまでの初期化時の初期値をコード内で指定できるだけの機能？です**
100日後にエンジニアになるキミ - 3日目 - 環境構築 - PCの選択

# PCの選択
ITエンジニアになりたい・・・
そう思ったら、まず真っ先に必要なものは

**そうPCですね。**

PCの選択で重要なポイントがいくつかあるので
それを押さえてPCを選択しましょう。

## 選択のポイント

重要なポイントとしては

用途
・仕事用
・勉強用
・ゲーム作成

PCのタイプ
・モバイル 
・デスクトップ 
・2 in 1
・ゲーミングPC

スペック
・OS
・CPU
・GPU
・メモリ
・ストレージ
・ディスプレイ

## 用途で考えると

まずは用途で考えるのが良いでしょう。

勉強用であれば、そこまでスペックにこだわらなくても何とかなりますが
仕事用であれば、それなりにお金をかけた方が良いです。

勉強用なら予算5-20万円くらいで余裕かと思います。
仕事用なら20万円から、ですね。

予算に関しても、ケチらず頑張った方が良いと思っていて

最初に買うものをケチったとします。
あとあと足りなくなって、別のを買い換える羽目に
なることがあります。

そうなるくらいなら、最初から
いいの買ったほうが損しないと思いますね。

## PCのタイプは？

・モバイル 
・デスクトップ 
・2 in 1
・ゲーミングPC

デスクトップは性能が良いですが
ほぼ家でしか使えません。

2 in 1　も同様です。

デスクトップはディスプレイの大きさを変えられますが
2 in 1　はディスプレイサイズは固定のため
あとで変更できません。

ここを選ぶならディスプレイサイズは慎重に決めた方が良いです。

外で使う用途を考えるならモバイル一択ですね。

ゲーム開発が絡んでくるなら
GPUの積んである機種しかないと思いますので
ゲーミングPCを選択せざるを得ないです。

## スペックは？

・OS
・CPU
・GPU
・メモリ
・ストレージ
・ディスプレイ

スペックのポイントとしてはまずOSです。

選択肢としては
・MacOS
・Windows
・Chrome OS
・LINUX

ここら辺かと思います。

一般的には
MacOSかWindowsでしょう。

MacOSとWindowsではその後の環境構築の仕方が
異なってきます。

そちらも一長一短あります。
ちなみに、うちのチームはゲーミングPC以外は
皆MacBookProでMacOSですね。

個人的にはMacOSの方が使いやすく安定しているので
プログラム開発のしやすさはMacOS推しです。

次にスペックを選択する際のポイントとしては

CPUは良いものであればあるほど
計算処理が早く終わります。

プログラムの実行速度に関わってくるので
良いものの方が早く終わるので
そこらへんを考えて買いたいところですが

まだプログラミングをしたことのない人であれば
予算で調整してください。

メモリは扱えるデータ量などに関わってきます。
自分の家のPCは40GBほど、会社のPCで16GBほどです。

作業中、よくメモリが足りなくなります。
メモリ効率の良いプログラムを書かないといけなくなるのが
面倒なので、多ければ多いほど作業効率が上がります。

ストレージは多ければ多いほどたくさんデータを保存できるのですが
それよりも重要なのが
ストレージのドライブの形式ですね。

SSDとHDDがあり
同じ容量ならHDDの方が安いですが
SSDの方が高速に動作します。

選ぶならSSDを選択した方が
あとあとイライラしないでしょう。

ゲーム作成するなら
GPU搭載のPCを選ぶしかありません。

ディスプレイは
ノートPCの持ち運びをするならA4サイズの13インチが良いですが
16インチになってくると、持ち運びが厳しくなってきます。

カバンの大きさとかも加味して
お店に見に行って大きさを測ってから買った方が良いです。


## 筆者のPC
ちなみにうちのPCは仕事用も兼ねているので
こんなスペックです。
[imac](https://www.apple.com/jp/shop/buy-mac/imac/27-%E3%82%A4%E3%83%B3%E3%83%81-3.7ghz-6%E3%82%B3%E3%82%A2%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%EF%BC%88turbo-boost%E4%BD%BF%E7%94%A8%E6%99%82%E6%9C%80%E5%A4%A74.6ghz%EF%BC%89-2tb#)

CPUはアップグレードしてi9の8コア
メモリは外部で調達して増設して40GBあります。
ストレージはSSDの512GBなので、少々少ないです。

総額はだいたい30万円ほどですね。

これだと、外には持っていけないので
別途ノートPCもあります。

会社で使っているのは
[MacBookPro](https://www.apple.com/jp/shop/buy-mac/macbook-pro/13%E3%82%A4%E3%83%B3%E3%83%81-%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%82%B0%E3%83%AC%E3%82%A4-2.4ghz%E3%82%AF%E3%82%A2%E3%83%83%E3%83%89%E3%82%B3%E3%82%A2%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%EF%BC%88turbo-boost%E4%BD%BF%E7%94%A8%E6%99%82%E6%9C%80%E5%A4%A74.1ghz%EF%BC%89-256gb#)

でメモリとかは最大スペックにしてもらってます。
13inchでメモリ16GB
CPUはi9の4コア
値段は25万円くらいです。

自分は大量データを取り扱う仕事が多いので
そこそこいいものでないと仕事できないのです。

あまり参考にはならないと思いますが
仕事用のPCのスペックでした。

## まとめ

まずは用途で考え
次に持ち運びするかどうかを考え
最後にスペックで選ぶかなと思います。

勉強用なら10万円前後でも
大丈夫かと思いますが

仕事用なら今なら30万円弱のPCになってきますね。
仕事用なら絶対ケチらない方が良いですよ。
元を取ろうと頑張れるしwww

これ以上のスペックになってくると
選択肢は限られますが、初めて買うのに30万円以上だと
オーバースペックかもしれませんね。

これからPCを選ぶ人、買い換える人の参考になれば
幸いです。

君がエンジニアになるまであと97日
基本情報技術者試験の勉強計画　第23週(3/23週)

## 目標と結果
### 目標
・午前問題のために過去問道場をやりこむ
・アルゴリズムの復習
### 結果
・最後にさぼってしまい、過去問道場で復習はしたが、忘れているところが多かった
・アルゴリズムは午前のような理解しやすいところはできるが、午後問題のほうはなかなか難しい
## 振り返り
### keep
・毎日電車の中や、少しでも時間が空いた時は復習している
### problem
・苦手としているところをさぼりがちになってしまう
・家で勉強するとつい寝てしまう
### try
・アルゴリズムを1日１問解説を見ながら解く
Installing ROOT and Jupyter for ROOTbook via Homebrew/Linuxbrew

[Homebrew](https://brew.sh/)/[Linuxbrew](https://docs.brew.sh/Homebrew-on-Linux) can install [ROOT](https://root.cern.ch/) and [Jupyter](https://jupyter.org/). But Homebrew uses venv to install Jupyter, which makes the use of [ROOTbook](https://root.cern.ch/how/how-create-rootbook) a bit complicated.

### Jupyter Notebook + ROOT

First, install ROOT and Jupyter. Additionally, the `metakernel` package is required for C++ notebooks.

```bash:Terminal
brew install jupyterlab root
pip3 install metakernel --no-dependencies  # many of the dependencies are in venv
pip3 install ipyparallel portalocker --no-dependencies  # not in venv
```
In practice, you may also want to install `matplotlib` etc. via `pip3`.

Then, make your customised `root` command:

```bash:.bashrc
root() {
  (
    brew=$(command -v brew)
    . $(brew --prefix root)/bin/thisroot.sh  # this changes $PATH
    export PATH=$($brew --prefix jupyterlab)/libexec/bin/:$PATH
    command root "$@"
  )
}
```

Run it.

```bash:Terminal
root --notebook --no-browser
```

Check if simple examples work, e.g.,

```python:Jupyter&nbsp;(Python&nbsp;3)
import ROOT
c = ROOT.TCanvas()
f = ROOT.TF1("f", "sin(x)/x", 0.0, 10.0);
f.Draw();
c.Draw();
```
```cpp:Jupyter&nbsp;(ROOT&nbsp;C++)

TCanvas c;
TF1 f("f1", "sin(x)/x", 0.0, 10.0);
f.Draw();
c.Draw();
```


### JupyterLab + ROOT

The command `root --notebook` in the above section creates a customised Jupyter configurations in `~/.rootnb`. One can make use of it for JupyterLab:

```bash:.bashrc
rootlab() {
  JUPYTER_CONFIG_DIR=~/.rootnb JUPYTER_PATH=~/.rootnb jupyter lab "$@"
}
```
```bash:Terminal
rootlab --no-browser
```


### Tested environment

```
CentOS 7 (x86_64)
root        6.20.02
jupyterlab  2.0.1
metakernel  0.24.3
```
PostgreSQL 備忘録

# 概要
個人の開発環境用に PostgreSQL を使用した時の備忘メモ。

# PostgreSQL を CentOS 8 にインストールする
今回は、OS標準のリポジトリに採用されているバージョンをインストールする。
（CentOS : 8.0-1911　PostgreSQL : 10.6）

### 1. PostgreSQLインストール
```
# dnf install postgresql
# dnf install postgresql-server
# dnf install postgresql-libs
```
※dnf：Yumの後継パッケージ管理システム。CentOS8よりYum置き換わり採用された
※PostgreSQLの各パッケージの概要は以下の通り

|パッケージ|必須|概要|
|:--|:-:|:--|
|postgresql|●|クライアントユーティリティ<br>（PostgreSQLに接続や操作等を行う）|
|postgresql-server|●|サーバサーバユーティリティ<br>（起動/停止等に必要なプログラム）|
|postgresql-libs|●|ライブラリ|
|postgresql-devel||開発モジュール|
|postgresql-contrib||拡張機能|
|postgresql-doc||ドキュメント|

### 2. データベース初期化
```
# postgresql-setup initdb
```

### 3. 設定ファイル修正
##### postgresq.conf ファイルの修正（接続可能なIPアドレスを指定する）
以下を変更する（接続可能対象を全て（"*"）に変更する）

```
#listen_addresses = 'localhost'
    ↓ 
listen_addresses = '*'
```
コマンド

```
# cp -p /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/postgresql.conf.org
# vi /var/lib/pgsql/data/postgresql.conf
```

##### pg_hba.conf ファイルの修正（接続できるクライアントを設定）
以下を追記する（接続可能対象をローカル（192.168.xxx.xxx）に限定する）

```
host all all 192.168.0.0/16 md5
```
コマンド

```
cp -p /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.org
vi /var/lib/pgsql/data/pg_hba.conf
```

### 4. ポート開放（OS操作のみ）
ファイヤーウォールの設定を変更し、PostgreSQLで使用するポートを開放する

```
# firewall-cmd --add-port=5432/tcp --zone=public
```

### 5. パスワード設定
PostgreSQLをインストールすると、OS、PostgreSQLに "postgres" アカウントが作成される。
初期状態ではパスワードが設定されていないため、以下にてパスワードを設定する

##### OSアカウントへの設定

```
# passwd postgres
（パスワードを設定する）
```
##### PostgreSQLアカウントへの設定

```
# su - postgres
-bash-4.2$ psql
postgres=# alter role postgres with password '（パスワード）';
postgres=# \q
```

### 6. PostgreSQL起動

状態確認

```
# systemctl status postgresql
```

起動

```
# systemctl start postgresql
```

自動起動を有効にする

```
# systemctl enable postgresql
```

# PostgreSQL コマンドメモ

### PostgreSQLログイン（psqlコマンド ※OSのターミナルから実行）
```
# psql -h （ホスト名またはIPアドレス） -p （ポート番号） -U （ロール名） -d （データベース名）
```
* ホスト名は接続先が localhost の場合は省略可
* ポート番号はデフォルト（5432）の場合は省略可
* ロール名は PostgreSQL をインストールした直後はスーパーユーザーである postgres ロールしか作成されていないため -U postgres と指定する
    * ロール名を省略した場合は OS のユーザー名が使用される
    * PostgreSQL では一般的にユーザーと呼ばれるものとグループと呼ばれるものをまとめてロールと呼ぶ
* データベース名を省略した場合はロール名と同じ名前のデータベースに接続する
    * postgresデータベースは自動で作成されており、postgresロールで接続した場合はpostgresデータベースに接続する

### データベース作成
```
postgres=# create database （データベース名）;
```

### カレントデータベース変更
```
postgres=# \c （データベース名）
```

### スキーマ作成
```
postgres=# create schema （スキーマ名）;
```

### テーブル一覧取得
```
postgres=# \l
```
魔法JS☆あれい 第11話「最後に残ったreduceとreduceRight」

登場人物

丹生（にゅう）あれい
魔法少女「魔法（マジカル）JS（女子小学生）☆あれい」として活動中。

イテレー太
正体不明の魔法生物。

第1部「ミューテーター・メソッド編」
* [第1話「popでpushした、ような……」](https://qiita.com/8amjp/items/e44e707ccc8c95b4a40d)
* [第2話「shiftはとってもunshiftって」](https://qiita.com/8amjp/items/3fc1b2defd28ba1c2df3)
* [第3話「もうsortもreverseも怖くない」](https://qiita.com/8amjp/items/86f5294981fbebd3fe2d)
* [第4話「fillも、spliceも、copyWithinもあるんだよ」](https://qiita.com/8amjp/items/0741e35b70ea32711265)

第2部「アクセサ・メソッド編」
* [第5話「joinなんて、concatなわけない」](https://qiita.com/8amjp/items/229c41ad2146728abd89)
* [第6話「indexOfなの絶対lastIndexOf」](https://qiita.com/8amjp/items/f7e421722e419c1c0a7d)
* [第7話「includesのsliceと向き合えますか？」](https://qiita.com/8amjp/items/007ac192399225db3843)

第3部「イテレーション・メソッド編」
* [第8話「filterって、ほんとfindとfindIndex」](https://qiita.com/8amjp/items/f7014b09c5c2a6440a74)
* [第9話「someなの、everyが許さない」](https://qiita.com/8amjp/items/ec91d29f8f166b45efbb)
* [第10話「もうmapにもforEachにも頼らない」](https://qiita.com/8amjp/items/25859c085119cdceed89)

## reduce()

イテレー太「さあ、そろそろ戦いのクライマックスだよ！」
あれい「まだあるのかこの駄犬」
イ「召喚したデータは[第8話](https://qiita.com/8amjp/items/f7014b09c5c2a6440a74)を参照してね！　そして、今回の敵の弱点は、『すべての記事のLGTM（`likes_count`）数の合計値』だよ！」
あ「はあ……」
イ「さあ、LGTMの合計値を`return`して敵を倒してよ！」
あ「はあ……面倒くせえなあ……」

```js
var sum = 0;
items.forEach(item => {
  sum += item.likes_count;
});
return sum;
```

イ「……あれい、コードのレベルの急落幅が凄まじいよ。目に余るものがあるよ」
あ「もう疲れてきたんだよ」
イ「ダメだよ！　こんなコードじゃ敵を倒せないよ！　特に`forEach()`は前回『使いみちがよくわからない』って言っちゃってるよ！」
あ「結果だけ合ってりゃいいだろ」
イ「そんなんじゃ魔法少女じゃないよ！　いつものように1行でビシッと決めてよ！」
あ「面倒くせえなあ……」

```js
return items.reduce((sum, item) => sum += item.likes_count, 0);
```

あ「これでいいのか」
イ「それでこそあれいだよ！　そして解説をお願い！」
あ「はあ、面倒くせえなあ……だから、`reduce()` メソッドですべての記事にアクセスして、`likes_count`の値を順に`sum`に加算してるんだよ。で、予めアキュムレータである`sum`の初期値を0に設定している」
イ「いやー、さすがはあれい！　やればできるのに最初あからさまに手を抜いたね！」
あ「うるせえ」

### 解説

> `reduce()` は配列の各要素に対して（引数で与えられた）**reducer** 関数を実行して、単一の値にします。

（[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)より）

`reduce()`メソッドは、配列のメソッドの中でも最もややこしいメソッドの一つです。ただし、コツさえつかめば非常に便利です。
`reduce()`メソッドは、「コールバック関数、アキュムレータの初期値」の2つの引数を使用できます。さらにコールバック関数では、「アキュムレータ（コールバックの戻り値を蓄積する変数）、現在の要素、現在の要素のインデックス、元の配列」という4つの引数を使用できます。
……と書くと非常にややこしいんですが、単に`map()`メソッドのように「すべての要素に関数を実行」し、その結果が順にアキュムレータに蓄積されていく……と考えると、少しはわかりやすいかもしれません。
また、アキュムレータの初期値を指定しなかった場合、配列の最初の要素が使用されます。

例えば、LGTM数の**最大値**を算出したい場合は、次のような記述になります。

```js
return items.reduce((max, item) => max > item.likes_count ? max : item.likes_count, 0);
```

## reduceRight()

### 解説

> `reduceRight()`は、隣り合う 2 つの配列要素に対して（右から左へ）同時に関数を適用し、単一の値にします。

（[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight)より）

さて、あれいも疲れているようなので、`reduceRight()` メソッドについては解説のみとなります。
`reduce()`メソッドとの違いは、「コールバック関数が最後の要素から逆順に実行される」「アキュムレータの初期値を指定しなかった場合、配列の最後の要素が使用される」の2点です。

## 次回予告

ネストされた配列が扱いにくいだなんて言われたら、
私、そんなのはフラット化できるって、何度でもそう言い返せます。
きっといつまでも言い張れます。

[最終話 flatの、最高のflatMap](https://qiita.com/8amjp/items/219ea5e1b7ebb7252cf6)
Babel Pluginでdata-testid属性を自動で付加する

昨今のReactのテスト事情は、[react-testing-library](https://github.com/testing-library/react-testing-library) が主流です。
[create-react-app](https://github.com/facebook/create-react-app) でデフォルトで生成されるテストテンプレートもすでに `@testing-library` が使われるようになっています。

[Add @testing-library to the default templates by kentcdodds · Pull Request #7881 · facebook/create-react-app](https://github.com/facebook/create-react-app/pull/7881)

また、携わっていたプロジェクトでもenzymeからtesting-libraryに移行しました。

さて、testing-libraryでサポートされているクエリに `data-testid` があります。`data-testid`について詳しくは、以下の記事を参考にしてください。

[idやclassを使ってテストを書くのは、もはやアンチパターンである - Qiita](https://qiita.com/akameco/items/519f7e4d5442b2a9d2da)

また、`data-testid`をいつ使うかについては、Testing Libraryのガイドプリンシパルが役に立ちます。
[Guiding Principles · Testing Library](https://testing-library.com/docs/guiding-principles)

さて、`testid` 属性ですが以下のように自分で書くものですが、これを、ある程度自動的に付加できると便利かつソースコードをクリーンに保てます。

```js
function App() {
  return <div data-testid="App">App</div>
}
```

### インストール

```
npm install --save-dev babel-plugin-react-data-testid
```

api.envを用いて、test環境だけ有効にすることをオススメします。

```babel.config.js
module.exports = api => {
  const isTest = api.env("test");
  return {
    presets: ["react-app"],
    plugins: isTest ? ["react-data-testid"] : []
  };
};
```

これで、テスト時のみコンポーネントの最初の要素に対して、コンポーネント名でdata-testidを付加します。
すでにdata-testidがある場合は処理をスキップし、ネストしてる場合は、一番上のタグに対してdata-testidを付加します。

```js
function App() {
  return <div>App</div>
}

// ↓↓↓ テスト時のみ

function App() {
  return <div data-testid="App">App</div>
}
```

これで、data-testidが自動生成できるようになりました。なお、クラスコンポーネントはサポートしていません。PRは歓迎です。


[akameco/babel-plugin-react-data-testid: babel plugin for react data-testid attributes](https://github.com/akameco/babel-plugin-react-data-testid#contributors-)

バグや要望については、気軽にIssue立ててください。
使ってみていい感じだなと思ったら :star: していただけると嬉しいです。
【随時更新】Neo4Jクエリまとめ

Neo4Jを触る必要があったので、クエリの投げ方をまとめた

# CREATE

## Entityの作成
```
CREATE (n:Person {name:"Tom"})
CREATE (n:Person {name:"Mary"})
```
## Relationの生成
```
MATCH (a:Person), (b:Person)
WHERE a.name = 'Tom' AND b.name = 'Mary'
CREATE (a)-[r:KNOWS]->(b)
```

# READ
## 全データの参照
```
MATCH (n) RETURN (n)
```

## Entity-Relation-Entityの参照
```
EXPLAIN MATCH (a:Person), (b:Person)
WHERE a.name = 'Tom' AND b.name = 'Mary'
CREATE (a)-[r:KNOWS]->(b)
```

# DELETE
## Entityの削除
### (Relationがある場合は先にRelationを削除する)
```
MATCH (a:Person { name:"Johan"})
DELETE a
```

## Relationshipの削除
```
MATCH (a:Person { name:"Emil"})-[roles:KNOWS]-> (b:Person { name:"Ian"})
DELETE roles
```
tailコマンド メモ

PHP側のログを追うことになったのでメモ(FuelPhp以外だとよくわからん)

▼追記されるログを表示
　tail -f ファイル名
　tailf ファイル名

　■参考URL
　https://uxmilk.jp/12218


▼PHPのログ
　これしか使ってない
　log::info('abcdeとかとか・・なんでも日本語もいけました')

　■参照URL
　http://fuelphp.jp/docs/1.7/classes/log.html

▼Gitコマンド

　普段SourceTreeでコマンドあんまり打たないからリンクだけ貼っておこう。
　https://qiita.com/2m1tsu3/items/6d49374230afab251337
3/23 最終課題五日目

3/23
最終課題五日目
#メモです

できている商品詳細ページをgithubに
出してコードレビューをする

コンフリクトが起こっていたので
修正した後にコードレビューをしてもらう

aタグはlink_toで書きましょう。  
と指摘を頂いたので
修正
修正後無事にLGTMともらう

その後マージしてマスターにプッシュする
そして今まで作ったとこに変なところが無いかや修正があるか探す

とりあえず簡単な修正をしてコミットし
マスターにプッシュしました

これで商品詳細ページ（マークアップ）が終わったので次に進む

次はサーバーサイドに進むが
みんなで話し合った結果
先に商品出品のサーバーサイドを進めることに決定
2人で進めることになりました
画像のところとその他で別れることに決定

Git hubでブランチを作った後さらに
ブランチを作ることで二人で進めれるようにする
（孫ブランチ？）
子ブランチの状態で新しいブランチを作る
そうするとマスターブランチの小ブランチを作るか
小ブランチの孫ブランチを作るかと選択が出るので
孫の方を選択
作る際のブランチの名前は小ブランチの名前と一緒もしくは似ているものは
エラーの原因になる

プルリクエスするときは気をつける
間違ってもマスターにプルリクエストを送ることはしないこと！！！

やること
* 商品モデルと商品の画像モデルを作成し、1つの投稿フォームで記事とそれに紐付く複数の画像を投稿できる
* 画像は送信前にプレビューを表示できる
* 上記要件を満たし、1度出品した商品の編集ができる
* 編集画面から、ひもづく画像の変更、削除、追加ができる
* 商品を削除する機能がある
* 商品を削除する際は、削除した商品に紐づく画像が同時に削除される

データベースを作らないとできないので
データベースを作る
Itemsテーブルを作る際外部キーが原因でエラー
Itemテーブルと関連づけされているテーブルを作っていく


#調べたこと

Webスクレイピングとは、ウェブサイトのHTMLから必要なデータを取得する事を言い、
それを行うプログラムをスクレイパとも呼びます。

Ancestryとは
AncestryはRuby on RailsのActiveRecordモデルのレコードを
ツリー構造（階層）として編成することを可能にするGemです。
カテゴリーを作る際に必要になるgemです
https://qiita.com/Rubyist_SOTA/items/49383aa7f60c42141871
参考ページ

orderとは
取得した値に対して、条件を指定して並び替えることができる機能
並びの順番を変えることができる
降順にする場合は”DESC”、昇順は”ASC”
https://techacademy.jp/magazine/7727
参考ページ

カテゴリーにpathカラムがあったので
Pathカラムがわからなかったので調べた
https://kyabatalian.hatenablog.com/entry/2016/12/19/193430
参考ページ
path列に対してパターン比較すれば先祖を取得できます。
メソッドとかもあるので必要みたいです

マイグレーションをしてエラーが出たので
結局は原因はわからなかったけど
メモで
Gemfile
gem 'ancestry'

ターミナル
$ bundle install
$ rails g migration add_ancestry_to_category ancestry:string:index
$ rake db:migrate
ここでエラー
エラーの原因を探して解決方法を見る
テーブルがおかしなことになっているのでリセットする
$ rake db:migrate　reset
またエラー
というのを繰り返した結果
途中でモデルに記述するとうまくいった
記述していなかったのが原因？
初歩ミスっぽいです
Pythonで音声解析をしよう#1 FFT編

# Pythonで音声解析をしよう
本記事では，Pythonの音声解析のいろはを順を追って紹介していきます．

### 事前条件

* Pythonがインストール済み
* cmdからpyまたはpythonでpythonのインタプリタが起動できる

### 私の環境

* Windows10 Home 64bit
* Python3.7.4
* Visual Studio Code(VSCode)
* Vim(マジで好き)

### 必要なPythonライブラリ

* numpy
* wave
* matplotlib.pyplot

```python:インポート設定
import numpy as np
import matplotlib.pyplot as plt
```

## 第一章 ~データの用意~
適当な音声データを読み込んで解析するのが流れとしては良いと思いますが，まずは簡単のためにデータを作成します．正弦波を以下のようにして作ってみましょう．

```python:正弦波の作成
def make_wave():
    fs = 48000 # サンプリングレート
    f = 10 # 周波数
    t = np.linspace(0,1,fs) # 1秒を48,000分割
    y = np.sin(2*np.pi*f*t) # 正弦波を作成
    return y
```
後に再利用したいので，関数にしておきます．

## 第二章 ~プロットしてみよう~
では，用意した波をプロットして外観を見てみましょう．

```Python:プロット
    sig = make_wave()
    plt.plot(sig)
    plt.show()
```
たしかに，10回振動する波が作成されていますね．
このとき，横軸は単純にデータ数なので，0~48,000まであります．
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407942/17490308-987c-9768-1a2c-e044b3beb23d.jpeg)

## 第三章 ~解析編の前に~
ここまでのコードをまとめると，以下のようになります．

```python:まとめ
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

def make_wave():
    fs = 48000
    f = 10
    t = np.linspace(0,1,fs)
    y = np.sin(2*np.pi*f*t)
    return y

def main():
    sig = make_wave()
    plt.plot(sig)
    plt.show()

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

非常に単純なコードですが，これだけでデータの作成，確認ができちゃいます．
pythonって便利ですね．
次回，解析についてまとめるので，今回は短いですが以上で失礼します．

## 次章 ~Fast Fourier Transform~
高速フーリエ変換について
【GAS】トリガーの設定

始めてトリガーの設定する時に少し戸惑ったので残しておく

# トリガーの追加

表示と実行の間の下にある時計マークをクリック
<img width="351" alt="コメント 2020-03-23 180014.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/6b259f0e-bbb3-8615-14fd-afddbcf76992.png">


左下トリガーの追加をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/0d8d5546-6d7c-fe1f-4f37-f2c70200f803.png)

#トリガーの詳細
・「イベントの種類を選択」は自分のプログラムのに合わせて選択
・「エラー通知」は開発時は「今すぐ通知を受け取る」がおすすめ（なぜエラーなのかすぐわかるので）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/693ea4d1-9915-d9cd-a087-94b2f3a2e229.png)


#ログインと許可
Googleアカウントにログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/f4d3cb7a-2eff-93df-e55b-ceaeff3c9a3c.png)

警告が出ても恐れず「詳細」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/caad9972-be94-68a7-aa8b-231b2470d63b.png)
トリガー設定に移動＆トリガーの保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/7cd76219-7b3b-f766-9a27-31e7974857c6.png)
トリガーが追加されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/08cca2be-5826-441c-6155-f35a6d461f27.png)
AtCoderのための環境作成: 自動テスト, コマンド提出 (oj, acc)

# はじめに
問題のsampleの入力をコピーして
IDEに貼り付けてテストして
テストが終わったら自分のプログラムをコピーして
AtCoderに提出って面倒だし, 時間がかかりますよね.

ここではこれらを自動化してくれるツールの導入方法及び, 使い方を説明します.

## ツールの導入
導入するツールは下記の2個です
1. [atcoder-cli](https://github.com/Tatamo/atcoder-cli)
2. [online-judge-tools](https://github.com/kmyk/online-judge-tools)

atcoder-cliはsampleのテストをダウンロード及び, プログラムの提出を行ってくれるツールで, 
online-judge-tools は atcoder-cliでダウンロードしたsampleをテストしてくれるツールです

####導入方法
下記のコマンドを実行するだけでツールの導入ができます

```bash
$ npm install -g atcoder-cli
$ pip3 install online-judge-tools
```
npm が使えない人は下記のサイトを参考にして導入してください
[Node.js / npm をインストール (Mac環境)](https://qiita.com/PolarBear/items/62c0416492810b7ecf7c)

## 使い方
####使うための準備
```
$ acc login //AtCoderにログイン
? username: hogehoge // AtCoderのID
? password: [hidden] // AtCoderのパスワード
OK

//これをやっておくと, 問題のダウンロードを全てしてくれる
$ acc config default-task-choice all 
$ oj login https://atcoder.jp/
```

問題のダウンロードの設定をします
ここではC++の設定を行います
適当なエディタで下記のファイルを開いてください.
 /Users/(PC名)/Library/Preferences/atcoder-cli-nodejs/cpp/template.json

cpp ディレクトリ や templete.jsonファイルはないと思うので作成してください.
開いたら下記のものをコピーしてください.

```json:template.json
{
    "task":{
	"program": ["main.cpp"],
	"submit": "main.cpp", 
	"testdir": "test"	
    }
}
```
次に下記のファイルを作成し開いてください
/Users/(PC名)/Library/Preferences/atcoder-cli-nodejs/cpp/main.cpp
問題のテンプレようのファイルです
私の場合下記のようなファイルを作成しています

```C++:main.cpp
#include<bits/stdc++.h>
using namespace std;

int main() {
    int N, ans=0;
    cin >> N;

    cout << ans << endl;
} 
```
設定の適用

```
$ acc config default-template cpp //cppに設定
```
####使い方
問題のダウンロード

```
$ acc new (コンテストID) //問題のダウンロード ex)  acc new abc159
```
すると下記のような海藻でファイルができているはずです
abc159 
|--a
|  |--test
|  |  |--sample-1.in
|  |  |--sample-1.out
|  |  |--sample-2.in
|  |  |--sample-2.out
|--b
:
:
|--f
|--contest.acc.json

テストは作業ディレクトリ まで行き下記のコマンドでテストを行うことができます
oj t は a.outを読み込みサンプルのテストを行ってくれます

```bash
$ cd abc159/a
$ g++ main.cpp && oj t //テスト
```

提出は下記のコマンドでできます

```bash
acc s
```
今回の場合 ABCのA問題なので
Are you sure? Please type "abca"
聞かれます
abca って打ってください


##まとめ

```
acc new abc159 //テストのダウンロード
g++ main.cpp && oj t // テストの実行
acc s //提出
```

##エラー　（2020/5/2追記）
ある日, 突然"acc s"を用いて提出しようとしたら
下記のようなエラーが発生しました

```
[x] load cookie from: /Users/naokiosako/Library/Application Support/online-judge-tools/cookie.jar
[x] GET: https://atcoder.jp/contests/abc164/tasks/abc164_c
[x] 200 OK
[ERROR] 'value'
```

これは　online-judge-toolsのエラーみたいなので
online-judge-tools再インストールしましょう!

```
pip3 uninstall online-judge-tools
pip3 install online-judge-tools
```

## 参考文献
[atcoder初心者こそ環境構築しよう！(atcoder-cli,online-judge-toolsのインストール、使い方）](https://qiita.com/Adaachill/items/3d4ddad56c5c2cc372cd)
Elmでサクッと現在時刻を取得したい

※追記
Task.map2に激烈に使いやすいサンプルが載ってました。(@ababup1192 さんより)
https://package.elm-lang.org/packages/elm/core/latest/Task#map2
   
  
以下はPosixとZoneを引き回したい人向け。

Ellieでのサンプル
https://ellie-app.com/8pd5fLMRpdja1

DateTimePickerや、ページに入った時に初期値として現在時刻を渡したい時に使える。
以下、概要部分のみ。

```elm
-- 適当なModel
type Model = TheTime Time.Posix Time.Zone

-- Taskを作る
initialTimeTask : Task Never ( Time.Posix, Time.Zone )
initialTimeTask =
    Task.map2 Tuple.pair Time.now Time.here -- Task.map2でPosixとZoneのTaskをまとめる


init : () -> ( Model, Cmd Msg )
init _ =
    ( TheTime (Time.millisToPosix 0) Time.utc -- 適当な初期値
    , Task.perform InitializeTime <| initialTimeTask -- Taskを実行
    )

type Msg = InitializeTime ( Time.Posix, Time.Zone )

update: Msg -> Model -> (Model, Cmd Msg)
update msg model =
    case msg of
        InitializeTime ( posix, zone ) ->
            ( TheTime posix zone, Cmd.none ) -- Modelが更新されるので、自由に使ってやれば良い
```
Azure Updateに関するリソース一覧


どんどんでてくるAzureのアップデートに関する情報がどこにあるのか、と最近聞かれることが多いので、おまとめしてみました。新しいソースが見つかり次第、アップデートしていきます(この記事を)。

## Microsoft 公式
- [Azure の更新情報](https://azure.microsoft.com/ja-jp/updates/)
    - Azure製品に関する最新の更新情報、ロードマップ、お知らせがまとまっています。英語の記事が多いですが、全体像を掴むのに最適です。
    
## By Community

- [FBグループ「Azureアップデートに付いて行く会」](https://www.facebook.com/groups/1641913796067434/)
    - Microsoft Azure のサービスアップデートをひたすら解説をするグループです。早すぎるAzureのアップデートにみんなで付いていけるように団結しましょう。(公式グループ情報より)
- [ブログ 「ブチザッキ」](https://blog.azure.moe/)
    - Microsoft MVP かつ Microsoft Regional Director @kosmosebiさんによるブログ。毎週木曜日にAzure Update情報が配信されます。[YouTubeチャンネル](https://www.youtube.com/channel/UC3VHyKjqgTGSfRMVS1qET-A?view_as=subscriber)もあります。
Vue.jsで子コンポーネントから親コンポーネントへデータを渡す方法

VueやNuxtを使っていて、子コンポーネントから親コンポーネントへ値を渡したい時の方法について記述します。
親→子はpropsを使えばいいのですが、子→親は少しトリッキーなやり方になりますので。

##結論

>$emit(eventName,[...args])

を使います
[$emit](https://jp.vuejs.org/v2/api/index.html?#vm-emit)についてはこちら

##サンプル

###サンプル画面
![ezgif.com-crop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307699/1c92bacb-a96d-ff57-dd10-37d695ac39f4.gif)

###サンプルコード

```parent.vue
<template>
    <div>
        <h1>親</h1>
        コメント：{{ comment }}
        <hr>
        <h2>子</h2>
        //@childの「child」は子コンポーネントの第一引数で指定されたもの
        <child :comment="comment" @child="changeComment"></child>
    </div>
</template>
<script>
import child from '~/components/child.vue'

export default {
    components: {
        child
    },
    data() {
        return {
            comment: "テスト"
        }
    },
    methods: {
        //$emitの第二引数の値はここで受け取っている
        changeComment(childComment) {
            this.comment = childComment
        }
    }
}
</script>
```

```components/child.vue
<template>
    <div>
        <input v-model="childComment" type="text">
        <input type="button" value="親コメントを変更する" @click="change">
    </div>
</template>
<script>
export default {
    data() {
        return{
            childComment:''
        }
    },
    methods: {
        change() {
            //$emitの第一引数でイベントの名前を指定、第二引数で値を渡す
            this.$emit('child', this.childComment)
        }
    }
}
</script>
```

##解説

子コンポーネントの$emitでイベント名(child)を指定して、第二引数に親コンポーネントに渡したい値を指定します。
親コンポーネント側では指定されたイベント（child）で動くmethodであるchangeCommentで第二引数で指定された値を受け取ります。

##最後に
子コンポーネントから親に値を渡して親の値を変更したいといった場面も意外にあるかと思います。そんな時にこの記事がお役に立てれば幸いです。
【Rails】ancestryで簡単に多階層型データの作成し呼び出す

#概要

・多階層型DB作成のためのgem "ancestry" の導入
・seeds.rbでのデータインプット効率化
・viewファイルへの表示

#階層型DB作成のためのgem "ancestry" の導入
###gemの導入

```ruby:Gemfile
gem 'ancestry'
```

```terminal:ターミナル
$ bundle install
$ rails g migration add_ancestry_to_category ancestry:string:index
$ rake db:migrate
```
###モデルの設定
```ruby:categories_controller.rb
class Category < ApplicationRecord
    has_many :items
    has_ancestry
end
```

```ruby:items_controller.rb
class Item < ApplicationRecord
    belongs_to :category
end
```

###データの追加

```ruby:seeds.rb
drink = Category.create(name: "飲み物")

drink_juice = juice.children.create(name: "ジュース")

drink_juice.children.create([{name: "オレンジ"}, {name: "アップル"}, {name: "グレープ"}])
```
```terminal:ターミナル
% rails db:seed
```

#seeds.rbでのデータインプット効率化
数件、数十件レベルのデータ量であれば、上記「データの追加」でも問題ありませんが、
それ以上の膨大なデータを作成するのであれば、以下の方法で効率的に作成しましょう。

```ruby:seeds.rb
@category1 = Category.create(name:"飲み物")

category1s = [
             {level2:"ジュース",level2_children:["オレンジジュース","コーラ","サイダー"]},
             {level2:"お酒",level2_children:["ビール","ハイボール","焼酎","ワイン"]}, 
             {level2:"お茶",level2_children:["緑茶","烏龍茶","ほうじ茶","はとむぎ茶"]},
            ]
category1s.each.with_index(1) do |category1,i|
  level2_var="@category1_#{i}"
  level2_val= @category1.children.create(name:"#{category1[:level2]}")
  eval("#{level2_var} = level2_val")
  category1[:level2_children].each do |level2_children_val|
    eval("#{level2_var}.children.create(name:level2_children_val)")
  end
end
```
```terminal:ターミナル
% rails db:seed
```

これでデータベースに反映されるはずです。

#子要素の呼び出し
```
親要素.children
```
#親要素の呼び出し
```
子要素.parent
```

以上です。
最後まで読んでいただきありがとうございました。
spring-batchで複数DataSource定義時に使用する@BatchDataSource

spring-batchで複数のDataSourceを定義する場合、```@BatchDataSource```でspring-batchのauto-configurationで使用する方を指定できる。```@BatchDataSource```のjavadocによると```2.2.0```で追加されたものらしい。

その定義は以下のようになっており、実態は単なる```@Qualifier```。javadocによると典型的な使い方としては、```@Primary```を付与するメインのDataSourceと、このアノテーションを付与するspring-batch用のセカンドDataSource、というもの。メインとなるDBと、メタデータ格納先DBが分かれてる場合にこれを使う、といった感じだろう。

```java
/**
 * Qualifier annotation for a DataSource to be injected into Batch auto-configuration. Can
 * be used on a secondary data source, if there is another one marked as
 * {@link Primary @Primary}.
 *
 * @author Dmytro Nosan
 * @since 2.2.0
 */
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Qualifier
public @interface BatchDataSource {

}
```

使用例。

```java
	@Bean
	@BatchDataSource
	public DataSource springBatchDs() {
		return DataSourceBuilder.create().url("jdbc:h2:~/test").username("sa").password("").build();
	}
	
	@Bean
	@Primary
	public DataSource primaryDs() {
		return DataSourceBuilder.create().url("jdbc:oracle:thin:system/oracle@localhost:11521/XEPDB1").username("system").password("oracle").build();
	}
```

上記の例の場合、メインはOracle、メタデータ格納先をH2、としている。

従来もこういう設定が出来なかったわけではないが、専用アノテーションにより意図が明示しやすくなる、と思われる。
Laravel+nginx+php-fpmで環境ごとに読み込む.envファイルを切り替える

## はじめに
「環境変数のAPP_ENVで指定すればよい」という説明はいくつかありましたが、その環境変数をどのように指定すればよいという説明があまりなかったので、メモとして残します。

## 前提
環境ごとに各.envファイルが作成されているものとします。

| 環境 | ファイル |
|---|---|
| 開発環境 | .env.dev |
| ステージ環境 | .env.stg |
| 本番環境 | .env.prod |

## APP_ENVを設定
設定する場所は`/etc/nginx/fastcgi_params`です。

```nginx:開発環境
fastcgi_param  APP_ENV  dev;
```

```nginx:ステージ環境
fastcgi_param  APP_ENV  stg;
```

```nginx:本番環境
fastcgi_param  APP_ENV  prod;
```

設定後はnginxとphp-fpmの再起動を忘れずに。

```console
# service nginx restart
# service php-fpm restart
```

以上で、環境ごとに読み込まれる.envファイルが自動的に切り替わります。

もし切り替わらないようであれば、nginxの設定でfastcgi_paramの読み込みが正しく行われているか（下記の行がコメントアウトされたりしていないか）を確認してください。

```nginx
include /etc/nginx/fastcgi_params
```

## まとめ

- 環境ごとに.envファイルを用意する。
- nginxの設定でfastcgi_paramsを設定する。

## 参考
- [PHP FastCGI Example](https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/)
yadからtrelloに予定をin

## 目的

- PCいじっている最中でも予定をぱぱっと入力したい。

→ ショートカットキーでダイアログ呼び出してtrelloに登録する。

## 結果

Command+Spaceを押すと、

![Screenshot from 2020-03-23 16-53-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38964/76ab5e42-b237-3d18-581f-eb4c9ae4b749.png)

入力後、Command+Return押してそのままtrelloに（slack経由で）送信

## 準備

- slackとtrelloの連携 [参照](https://slack.com/intl/ja-jp/help/articles/231967387-Slack-%E3%81%A8-Trello-%E3%82%92%E9%80%A3%E6%90%BA)
- [yad](https://github.com/v1cont/yad) 
- [slack-cmd-trigger](https://github.com/dazlious/slack-cmd-trigger)

＊Python3で動かす場合は、31行目を``print("-> Aborted through user interaction")``に書き換えます。

## ダイアログ

```sh:~/.bin/todoyad:

#!/bin/sh

ask=$(yad --width=400 --title="" --text="Todo" \
--image="/usr/share/icons/Papirus/32x32/apps/calendar.svg" \
--form \
--date-format="%Y-%m-%d" \
--item-separator="," \
--field="Todo" "" \
--field="Due date":DT "$(date +"%Y-%m-%d")" \
--field="Time":CBE "$(seq -f "%02g:00" 6 24 | paste -sd ',')" \
--field="Details":TXT "")

todo=$(echo "$ask" | awk 'BEGIN {FS="|" } { print $1 }')
day=$(echo "$ask" | awk 'BEGIN {FS="|" } { print $2 }')
time=$(echo "$ask" | awk 'BEGIN {FS="|" } { print $3 }')
details=$(echo "$ask" | awk 'BEGIN {FS="|" } { print $4 }')
if [ "$todo" = "" ]
	then
		exit 1
else
python $HOME/.opt/slack-cmd-trigger/index.py -t "{SlackのLegacy Token}" -c "{チャンネル名}" -cmd "trello" -i "add $todo"
python $HOME/.opt/slack-cmd-trigger/index.py -t "{SlackのLegacy Token}" -c "{チャンネル名}" -cmd "trello" -i "set-due $day $time"
fi
```

## ショートカットキー（i3wm）
```sh:~/.i3/config
bindsym $mod+space exec --no-startup-id "~/.bin/todoyad"
```

[trello-cli](https://github.com/mheap/trello-cli)という便利なスクリプトもあるのですが、なぜか締切日時の指定ができなかったため、Slackを経由することにしました。

設定できるのは締切のみで、細かい期間の指定はできません。あくまで暫定的なものとして。
csvファイルの重複を後勝ちでなくす

csvから特定キーで重複を取りたい時。
先勝ちのサンプルはたくさんあるが、後勝ちは見かけなかったので書いてみた。

以下のようなCSVデータを例として、
データ先頭から４番目までをキーとし、後勝ちで重複削除する。

```all.fbk
OL,FBK-0001,001,HL,CD001,CD002,A1,SF,F,20200323,FBK1
OL,FBK-0001,001,HL,CD001,CD002,A2,SF,F,20200323,FBK2
OL,FBK-0001,001,HL,CD001,CD002,A3,SF,F,20200323,FBK3
NW,FBK-0001,001,HL,CD001,CD002,B1,SF,F,20200323,FBK4
OL,FBK-0001,001,HL,CD001,CD002,B1,SF,F,20200323,FBK5
NW,FBK-0001,001,HL,CD001,CD002,B2,SF,F,20200323,FBK6
NW,FBK-0001,001,HL,CD001,CD002,B3,SF,F,20200323,FBK7
```

##AWK
非常にシンプル。ワンライナーで書けるので良い。
普通に書くと先勝ちになってしまうので、`tac`を使って逆順に処理をしている。
どうやらlinux系は`tac`、BSD系は`tail -r`を使わないといけない模様。
元々の順番で出力したいときは、再度 `tac`を通せばいけるかと。

```sh
cat all.fbk | tac | awk -F "," '!colname[$1,$2,$3,$4]++{print $0}'
NW,FBK-0001,001,HL,CD001,CD002,B3,SF,F,20200323,FBK7
OL,FBK-0001,001,HL,CD001,CD002,B1,SF,F,20200323,FBK5
```
* 入力がカンマ区切りのcsvなので `-F "," `を指定(すると、$1から順番に値が割り当てられる)
* `colname`はAWKの内部で展開される連想配列
* `colname[$1 $2 $3 $4]`で先頭から４列までを結合し重複キーとする
* $0には加工前の文字列が入ってくる

##perl
AWKと比べると、こっちの方が何をしたいのか意図を読み取りやすそう。
あとは文字コードの指定が課題となるかも。

```sh
perl fbk.pl all.fbk
OL,FBK-0001,001,HL,CD001,CD002,B1,SF,F,20200323,FBK5
NW,FBK-0001,001,HL,CD001,CD002,B3,SF,F,20200323,FBK7
```

```perl

use strict;
use warnings;
use open ":encoding(shiftjis)";
binmode(STDOUT, ":utf8");

# ファイルの読み込み
my @csvDatas = ();
open(DATAFILE, "< " . $ARGV[0]) || die("Error:$!");

while(my $line = <DATAFILE>){
  chomp($line);
  push @csvDatas, $line;
}

# ユニーク行の抽出
my @uniqLines = ();
my %conflictCheckMap = ();
my $uniqLinesCount = 0;

foreach my $csvData (@csvDatas){
  my @lineCols = split(/\,/, $csvData);
  my $csvKey = $lineCols[0] . $lineCols[1] . $lineCols[2] . $lineCols[3];

  # ハッシュになければ追加、あれば上書き
  unless (exists $conflictCheckMap{$csvKey}){
    push @uniqLines, $csvData;
    $conflictCheckMap{$csvKey} = $uniqLinesCount;
    $uniqLinesCount++;
  }else{
    $uniqLines[$conflictCheckMap{$csvKey}] = $csvData
  }
}
print_array(@uniqLines);

# 配列の中身の確認用
sub print_array{
  my @csvDatas = @_;
  print join("\n", @csvDatas), "\n";
}
```

* やってることはAWKと同じ
* `my` に続いて変数定義を行う
* `@`は配列変数(セットの時は$を使う)
* `%`はハッシュ変数
* `$`は通常変数

##感想
AWKもperlも初めて書いたけど、こりゃ強力だわ。
ただ、AWKで書ける範囲のものをperlとかで書こうとすると、冗長になりすぎる感がある。

可能な限りAWKを使い、どうしても無理なところだけperlとか他のスクリプト言語使うとよさそう。
データ分析ツール AmplitudeのiOSアプリ導入とダッシュボードの見方

# Amplitude?
[Mixpannel](https://mixpanel.com/)のようなデータ分析ツール
GoogleAnalyticsなどはデータ全体の概観を分析し、結果指標（ユーザ数やリテンションなど、施策の結果として現れる指標）を確認するのに適しているのに対し、これらのツールでは「ある特定の行動をとったユーザー」のリテンションなどがパラメーターを逐次変えながら見ることができるのでアプリをグロースさせるには欠かせないツールです

『いちばんやさしいグロースハックの教本』の梶さんがマストとしているツールでもあります
[サービスのグロースやUX改善に不可欠なMixpannelやAmplitudeの計測設計](https://note.com/kajiken0630/n/n8b0c7ac26911)

料金は1000万セッションまでならフリープランで大丈夫ですので気軽に試してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131651/ca813838-2d36-db77-f85f-e463471cb3c3.png)



# iOSアプリへの導入
日本語版が無かったので書いていきます

Cocoapodsを使っている場合は

```:podfile
pod 'Amplitude'
```
と記載して``` $pod install```

```logger.swift
var logger: Amplitude

logger = Amplitude.instance()
logger.initializeApiKey("hogehogepiyopiyo", userId: userID)
```
などとどこかのファイルに記載した上で、(userIDはアプリに固有のユーザーIDを使うとよいと思います)

```application.swift
logger.logEvent(eventName, withEventProperties: ["web_title": "Qiita"])
```
ログを送りたいアクションタイミングでlogEventを呼ぶとログが送られます　ちょろい

# ダッシュボードの見方
こちらに素晴らしい[デモ](https://analytics.amplitude.com/demo)があります

無料版でもたくさんの機能が使えるのですが、ユーザーリテンション分析について少し紹介します
[こちらがデモ版](https://analytics.amplitude.com/demo/chart/sht3xba)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131651/13b67d33-e15e-d55b-bff9-4cb7b60493ca.png)

パネル右で、あらかじめ指定しておいたユーザープロパティごとにユーザーを区切ります
すると、以下のような形で区切られたそれぞれのユーザーの属性に応じてday7までのリテンションを見ることができます
このデモでは、Social Eventsを起こしたユーザーのリテンションが全体よりも高いことがみて取れるので「ユーザーには出来るだけこれらの行動をしてもらうように導線を変えた方が良いかもしれない」という戦略が立てられるかもしれません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131651/83e47f72-c0d7-b3ec-2072-e50d377337b0.png)


英語ですが、[こちら](https://practicoanalytics.com/definitive-guide-amplitude-analytics/#segmentation)にデモの機能全ての解説動画が上げられています
Maya で skined mesh などで, UV を generate したあとに deform などすると, UV がずれる

## 背景

ベイク用に,

* skinnedMesh にポーズを付ける
* UV を generate する
* ポーズをもどす
  * UV が変わってしまう

UV が skin などの影響を受けてしまう(construction history の影響を受けるので, skinCluster -> UV generate と評価される)

## 簡単な解決方法は無いかも?

UV データをなにかしらベイクできればよいのだが...

ヒストリを残さない形でうまくできるか?...

http://myara.blog.fc2.com/blog-entry-231.html 

skinCluster 一個くらいであれば, 一旦 skinCluster を外し, UV generate したあとに rebind するというのも手か.

### ヒストリの削除

とりあえず Edit -> delete by history -> non-Deformer hisotry であれば, skinCluster などは残しつつ UV 生成の history を解決できました. だた, UV 割り当ては変わってしまいますし, ほかに残しておきたい history がある場合にはこの方法は使えませんね.

### history 入れ替え

skiCluster + UV generate の場合は入れ替えできませんでした.

## TODO

* [ ] python で UV 座標を直接指定してみる
* [ ] mesh attribute での UV 転送を試す
対応するOSのBuildSupportをインストールしてるはずなのに「Unsupported Build Target」と出てくる時の対処法。

# 問題の発生
Unityを立ち上げProjectを開こうとしたら、こんなエラーが出ました。
要約すると「Android Build Supportを入れてないじゃろ」といったところですかね。
「さっきまで使ってたはずなのに何故？？？」
となったことが何度かあります。
<img width="425" alt="スクリーンショット 2020-03-23 16.00.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275803/da6efab3-f81b-2a36-7169-ec2dae82e43c.png">

```
Unsupported Build Target
Build Target AndroidPlayer is not supported. Switch to MacStandaloneSupport or exit Unity?
```
iOSとかだと文言が `Build Target iOSPlayer is not supported.`とかになるんですかね？

# 対処法
1. 新規プロジェクトを作成し開く。(仮にTempProjectって名前でもつけてあげますか)
2. File -> BuildSettings を開く。
3. Platformを任意のOSを選択し、SwitchPlatform を押す。今回の場合はAndroidを選択しました。
4. TempProjectを閉じる。
5. 「Unsupported Build Target」のエラーがでたプロジェクトを開き直す。
6. 開けるはず！

# こんな時に発生しやすい
・BuildTarget が Android または iOS の状態で作業をしてる際にUnityをクラッシュさせる。
　その後にプロジェクトを開き直すとたまに出てきちゃう。

# 環境
Mojave 10.14.5
Unity 2018.3.11f1
UrlFetchApp とIFTTTとTrigger

せっかくGASやってるので、UrlFetchAppつかってWebをチェックして、結果をIFTTT経由でLINEに流してみた

#1. UrlFetchApp
[リファレンス](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app)

大抵は、fetch関数くらいしかつかわないかと思います。
###GETでとってくるパターン

```javascript

    let response = UrlFetchApp.fetch("https://xxx.com");
    let responseText = response.getContentText();

```

もどってきた[レスポンス](https://developers.google.com/apps-script/reference/url-fetch/http-response)に対して処理をしたいことが多いとおもいます。

###POSTでデータを送りたい場合
(この場合はJSONデータを送ってます)

```javascript
    let data = {}; // JSON Object
    let params = {
        'method' : 'POST',
        'contentType': 'application/json',
        'payload' : JSON.stringify(data)        
    };
    UrlFetchApp.fetch(url,params);

```

#2.IFTTT

もしなんとかだったらそれやって、ってやつです。
[IFTTT](https://ifttt.com/)にはWebフックがあるので、GASからWebフックを叩いてあげます
IFTTTではアプレットというやつですね。
（IFTTTの設定や、アプレットの作り方はここでは記載しません。世の中に一杯あるし）

上のPOSTするURLFetchAppのソースコードがそのままIFTTTへの処理になります。

```javascript

    let url = "https://maker.ifttt.com/trigger/" + EVENT_NAME + "/with/key/" + MY_IFTTT_KEY;

```

EVENT_NAME はIFTTTで設定したイベント名、
MY_IFTTT_KEYはIFTTTで指定される自分用のキー
です。

今回はLineへ通知をしたので、以下の流れになっています。
GAS　→　IFTTT　→　Line
IFTTTからLineも世の中に説明がたくさんあるので割愛。ここまでならLineデベロッパーアカウント等は不要かと思います。（LineNotifyというのを使う程度）

#3.Trigger

実は結構面倒だったのが、時刻で動かすTriggerです。
時間主導型トリガーはあまり正確な時間で動いてくれず、
１時間ごと、だと指定した１時間のどこかで
１日ごと、も指定した時間の１時間のどこかで
作動します。

というわけで、毎日、時刻指定トリガーをつくって、終わったら削除するトリガーを用意しました。

```javascript
function setTrigger()
{
    // 朝９時のトリガー
    const time9 = new Date();
    time9.setHours(9);
    time9.setMinutes(0);
    ScriptApp.newTrigger('checkDaily').timeBased().at(time9).create();
    // １０，１１，１２，１３，１４，１５，１６，１７，１８のトリガー
    for(let h = 10;h < 19 ; h++){
        const time = new Date();
        if(time.getHours() < h){
            time.setHours(h);
            time.setMinutes(0);
            ScriptApp.newTrigger('checkHourly').timeBased().at(time).create();    
        }
    
    }
}
function removeTrigger()
{
    let triggers = ScriptApp.getProjectTriggers();
    for(const triger of triggers)
    {
        let functionName = triger.getHandlerFunction();
        if(functionName.indexOf("checkDaily") >= 0 || 
            functionName.indexOf("checkHourly") >= 0 ){
                ScriptApp.deleteTrigger(triger);
        }
    }
}

```
朝９時に日時処理、１０時から１８時まで毎時処理を登録しています。
削除は、登録したトリガーの関数名が一致したトリガーを削除しています。
checkDailyやcheckHourlyの中でWebチェックしてIFTTTにLine向けのメッセージを送っています
（getHoursで時間を比較してたり、indexOfで微妙な検索をしてるのは作業中の色々な紆余曲折の結果です。）
この２つ、夜中の１時にremove、２時にsetをそれぞれトリガーとして登録しました。
個人アカウントだと、トリガーの登録数に上限があるので、色々微妙な感じですが、ひとまずこれで様子をみます。

cronのほうが楽じゃね？と思うオールド世代より
Alfred Custom Web Search + DeepL翻訳 で簡単に翻訳ページ表示

# はじめに
巷で話題の [DeepL翻訳](https://www.deepl.com/ja/translator) が Google翻訳よりも精度の高い翻訳をしてくれるということで、乗り換えてみました。

# 成果物
百聞は一見にしかずということで、最初に今回紹介する機能をお見せします。

##### 日本語->英語翻訳
![je翻訳.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457899/f466d4e5-58df-4957-10f0-06f3b44c629f.gif)

##### 英語->日本語翻訳
![ej翻訳.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457899/4525bccb-d1d2-803b-fca6-36e7a139aa7a.gif)
※あんまり翻訳の精度良くない気もしますが...（笑）

このように Alfred の Custom Web Search を使えば簡単に翻訳ページを表示することが出来ます。

# やり方
###### 1. Alfred Preferences を開く　<img width="587" alt="スクリーンショット 2020-03-23 16.41.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457899/62350775-3fb7-8ed5-8746-1fcd249168b8.png">

###### 2. Web Search タブを選択し右下の 「Add Custom Search」 を選択　<img width="1108" alt="スクリーンショット 2020-03-23 16.42.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457899/07315207-407c-4f79-dbae-b7cf38e7360c.png">

##### 3. 日本語 -> 英語　<img width="578" alt="je翻訳.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457899/b59da48e-785f-c575-466b-85730fd16ff2.png">

Search URL: https://www.deepl.com/ja/translator#ja/en/{query}
Title     : 説明
Keyword   : コマンド名 (画像の通りだと<font color="red">「je ほげ」</font> で翻訳ページに遷移します。
※TitleとKeywordは画像の通りでなくても問題ありません。

##### 4. 英語 -> 日本語 <img width="580" alt="ej翻訳.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457899/37889eca-1184-2582-afcc-400d368684e3.png">

Search URL: https://www.deepl.com/ja/translator#en/ja/{query}
Title     : 説明
Keyword   : コマンド名 (画像の通りだと<font color="red">「ej hoge」</font> で翻訳ページに遷移します。
※TitleとKeywordは画像の通りでなくても問題ありません。

# さいごに
この設定はGoogle翻訳でも利用出来ますので、「俺はやっぱりGoogle翻訳派！」という方でも是非活用してみて下さい。
いまさら　raid

昔を今生きてます

**今更RAID**　でなく　**今更ジロー**　は
　　　https://www.youtube.com/watch?v=3KVywuqlt00
**好きだよジロー　RAID**

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/a353c54b-e7bc-61aa-9291-8851b7c6ddfd.jpeg)

がでたー

foreign config をきれいにし
さらに
cleaconfig
してから

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/db71ea42-7a65-cb6a-0c95-88b0cc3a596e.jpeg)







![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/e3d519bc-a838-12fa-07f8-666fdcc52d53.jpeg)

とraid 0 をつくる


次に初期化をする
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/1ebcb65c-a2ce-85d8-1920-38ca81eda07f.jpeg)






![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/ea519c96-4ab4-d198-a6f1-c898f023dba0.jpeg)

とこんなふうに初期化中



https://ameblo.jp/dojyokko/entry-11205248748.html　より
千利休辞世の句（切腹して果てた）
　人生七十力囲希
　肉痩骨枯気未微
　這裡咄提王宝剣
　露呈仏祖共殺機
人生ここに七十年。
えい、えい、えい!。
この宝剣で**祖仏**もわれも、ともに断ち切ろうぞ。
私はみずから得具足（上手に使える武器）の一本の太刀を引っさげて、いま、まさに我が身を天に抛つのだ。
［中公文庫 利休の死；小松茂美（中央公論社）］

なんと激しいこと、ワビ、サビな感じは全くない！
身長が180センチの大男だったらしい。
今なら2ｍ級だ。

|武家の禅（臨済宗）の次の言葉を思い出す|
|:---|
|仏に逢うては仏を殺し、祖に逢うては祖を殺せ（『臨済録』示衆）|

##そんなヒロシに騙されて
https://www.youtube.com/watch?v=v1y48H5dddY

## あばよRAID

https://www.youtube.com/watch?v=dhhtyHjAzUE

ビデオカードをつけまして
![r1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/a2d01820-aaad-ede7-dad8-b53007977d62.jpeg)


それからDVDドライブを外し以下をつけます
![r5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/659e5748-2695-9039-11e4-0c4a41b36a7d.jpeg)