OmniAICreator/Qiita-1.07M huggingface dataset:
無料かつ別PC不要でIE各バージョンとEdgeの検証環境を用意する(Mac/Windows)

一般向けのWebアプリ開発業務においては
まだまだ一定数の利用者が存在する古いInternetExplorerやEdgeへの
対応が要件となってくるケースが少なくないと思いますが

開発者としてはWeb技術と親和性の高いmacOSを開発環境に利用していたり
Windowsであっても複数のOSバージョンやIEのバージョンの検証環境を用意するのは困難です
[BrowserStack](https://www.browserstack.com/)のような各ブラウザの検証環境を提供してくれるクラウドサービスを利用する手もありますが有償です

そこで、IEやEdgeでのWebアプリの検証用として
バージョン毎のIE(またはEdge)が搭載されたWindowsの仮想マシンイメージが
Microsoftの開発者向けサイトで無料配布されています

- VirtualBox用の仮想イメージを使用する場合の手順です
- VirtualBoxのインストール方法は省略します

## 導入手順

### 入手
以下のURLのページでダウンロードできます
https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/

1. Virtual machine を選択
  - 以下のバージョンのIEとEdgeが選択できます
      - IE 8 (Windows 7)
      - IE 9 (Windows 7)
      - IE 10 (Windows 7)
      - IE 11 (Windows 7)
      - IE 11 (Windows 8.1)
      - Edge (Windows 10)
2. Platform
  - 使用する仮想化ソフトウェアを選びます
      - VirtualBox
      - Vagrant
      - VMWare
      - HyperV (Windowsのみ)
      - Parallels (macOSのみ)
          - VirtualBox を選択します
3. DOWNLOAD .ZIP を押すとダウンロード開始します  
  - 仮想マシンイメージのファイルサイズは5〜8GB程度ありますのでご注意ください

### 起動
- VirutalBox の場合
  - ダウンロードしたファイルを展開すると出力される拡張子`.ovf`のファイルを開く  
      - 仮想アプライアンスの設定ウィザードが表示されるので、設定内容を確認し`インポート`  
  - Oracle VM VirtualBox マネージャー画面で、追加された仮想マシンを`起動`
      - 起動後はWindow Updateなどでセキュリティパッチを当てておくことをおすすめします

### 日本語化
仮想マシンのWindowsは英語UIになっていますが
日本語のWebページの表示は可能です
OSやブラウザのUIを日本語化したい場合は以下のような手順で可能です

- Windows 7
  Windows Update から日本語のlanguage packをインストールします
  - スタートメニュー → All Programs → Windows Update
      - `optional　updates are available`で表示される画面で、`Japanese Language Pack`をチェックして`OK`
          - `Install updates`でインストール
  - スタートメニュー → Control Panel　→ `Change display language` で地域と言語の設定画面を表示
      - `Choose a display language`のプルダウンで`日本語`を選択し、`Apply`
          - ログオフが必要になるのでログオフ後、パスワード `Passw0rd!`でログオンすると日本語UIになります
- Windows 8.1
  コントロールパネルの言語設定画面で追加できます  
  - スタートメニュー右クリック → Control Panel → Add a language
      - `Add a language`ボタンを押して リスト内から`Japanese`を選択し、`Add`で追加
      - 言語設定画面のリストに`日本語`が追加されているので、選択して`Move Up`で最上位に移動
      - 言語設定画面のリストの`日本語`の右の`Options`を押して`Download and install language pack`でインストール
  - ゲストOSの再起動をおこなうと、日本語UIになります

## ゲストOS上のブラウザからホストOSのWebサーバにアクセスする
- VirtualBoxの場合
  - ゲストOSから見た、ホストOSのIPアドレスは 10.0.2.2 になっていることが多いようです
      - http://10.0.2.2(:ポート番号)/ のようなURLでアクセスできるようです
      - 検証するWebアプリの仕様で特定のホスト名でアクセスする必要がある場合は、ゲストOS側のhostsを設定するとよいでしょう


## 注意点
仮想マシンのWindowsは有効期間90日間の評価版となっているので
インストール直後に仮想マシンのスナップショットをとっておくことが推奨されています
※ダウンロードしたzipファイルをとっておいて、上記導入手順をやり直すことでも問題はなさそうです
前澤友作社長から100万円を貰うためにTwitterのフォローとリツイートを自動化する

<font color="Red">**この記事は自動化を推奨するものではありません。自己責任でお願いします。**</font>
<font color="Red">[**キャンペーンに何度も応募するために多くのアカウントを作った利用者は、すべてのアカウントが凍結されることになります。**](https://help.twitter.com/ja/rules-and-policies/twitter-contest-rules)</font>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ZOZOTOWN新春セールが史上最速で取扱高100億円を先ほど突破！！日頃の感謝を込め、僕個人から100名様に100万円【総額1億円のお年玉】を現金でプレゼントします。応募方法は、僕をフォローいただいた上、このツイートをRTするだけ。受付は1/7まで。当選者には僕から直接DMします！ <a href="https://twitter.com/hashtag/%E6%9C%88%E3%81%AB%E8%A1%8C%E3%81%8F%E3%81%AA%E3%82%89%E3%81%8A%E5%B9%B4%E7%8E%89?src=hash&amp;ref_src=twsrc%5Etfw">#月に行くならお年玉</a> <a href="https://t.co/cKQfPPbOI3">pic.twitter.com/cKQfPPbOI3</a></p>&mdash; Yusaku Maezawa (MZ) 前澤友作 (@yousuck2020) <a href="https://twitter.com/yousuck2020/status/1081544630754103296?ref_src=twsrc%5Etfw">2019年1月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

フォローとリツイートすると100万円貰えるそうですwww
とりあえず、Twitterのアカウント作成とフォローとリツイートを自動化しましたwww

# デモ
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/44Ao_p4pgyA/0.jpg)](http://www.youtube.com/watch?v=44Ao_p4pgyA)

# ソースコード
```bash
# インストールする
pip install -r requirements.txt
# 実行する
# 同じIPアドレスで作れるアカウントに上限があるため、
# アカウントが作れない場合は、プロキシ(https_proxyの環境変数)を使用してください。
python main.py
```
すごい簡単なソースコードです。
https://gist.github.com/hirokita10/4d234f5dd7be0e7e875ca74b32d530da

## アカウント作成時間を短縮するには？
アカウント作成を高速にするには、以下の最適化が考えられます。

* sleep時間の短縮
* [Selenium Waits](https://kurozumi.github.io/selenium-python/waits.html)の使用
* [Chromeのヘッドレスモード](https://gist.github.com/johndoe16/9f6d0f8d34f4d6ddae05221f4cb3f0c0#file-main-py-L21)の使用
* 実行の並列化
* ブラウザを使用せずにrequestsなどで直接HTTP通信を行う

# 余談
もっともリツイートされたリツイートのランキングに入ってるw
https://en.wikipedia.org/wiki/List_of_most-retweeted_tweets
フォロワー数はランキングに入りませんねw
https://en.wikipedia.org/wiki/List_of_most-followed_Twitter_accounts

# 引用
> Python Webスクレイピング テクニック集「取得できない値は無い」JavaScript対応@追記あり6/12
> https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a


最後に、

# <font color="#1DA1F2">#月に行くならPython</font>
【ゆるふわ🔰】JavaScript本格入門 【Chapter1,2】

## Chapter1:　イントロダクション
- 基本的にはJavaScriptの歴史
- 初学者の１割はここで落ちる感じ

###攻略法
- 理解しないくらいで読む
- 本気で理解しにかかると、最終Chapterにいけなさそうなのでサラサラ読む
- 基本的にはベテランが喜びそうな内容になっています。

### 自分メモ

#### ECMAScript2015とは
- 遊戯王カードの禁止カードとか、準制限カードみたいなルール変更みたいなこと（たぶん）
- 初学者の１割は脱落していきます。（昔の遊戯王カードのルールを知らないので）
- 詳しくは[ES2015 (ES6)についてのまとめ](https://qiita.com/tuno-tky/items/74ca595a9232bcbcd727)に綺麗にまとめてくださっているので、初学者のみなさんもよく読むようにね
- どうしてもドヤ顔したい場合は、このように回答しておけば良いです。  
  
🤔< ECMAScript２０１５って知っている？  
😏< お、渋いね。ES6って普通言うよね。ジャヴァスクのスピードについていくのまじ大変だわー。

## Chapter2:　基本的な書き方を身につける
- ここではJavaScriptの基本的な記法などが説明されています
- 結局自分で触って見ない限り、完全な理解を得ることは難しいです
- そのため、初学者の２割はこのチャプターを無限ループしてしまい、この本を終了することになります

###攻略法
- 理解しないくらいで読む
- 本気で理解しにかかると、次のChapterにいけなさそうなのでサラサラ読む
- 他の言語を勉強済みの人には、ほー、JavaScriptだとこう書くのか！と気づきになっていいかもです

### 自分メモ
#### 数値リテラルについて
- 普段あまり、2進数・８進数・16進数のことを意識することがなかったので、この記法はメモ

|  | 表記例 | 用途 |
|:--|--:|:--|
| 10進数 | 42 | 数値 |
| 2進数 | 0b0001 | ビット演算など |
| 8進数 | 0o777 | ファイルのパーミッションなど |
| 16進数 | 0xEEFF | 文字コード、RGB値など |

#### インクリメント演算子
- 書き方によって、インクリメントされるタイミングが異なるので注意
- PHPの記事になるが、[++$varと$var++の違い](https://qiita.com/ikemonn/items/53d43a75bced1c63ede8)が参考になるので読みましょう

#### 分割代入

ES６から導入されました！
何が嬉しいのか、　僕にはまだわかりません。
特に「...other」っていつ使うんだろって感じです。

```javascript

let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

let [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9] = data

console.log(x0); //1が表示される

let [y0, y1, y2, ...other] = data

console.log(y0); //1が表示される
console.log(y1); //2が表示される
console.log(y2); //3が表示される
console.log(other); //[4, 5, 6, 7, 8, 9, 10]が表示される

```

ちなみにJavaScriptさんは、ちぐはぐな関係でも、いい感じに色々やってくれるようです。

```javascript

let data = [1];

let [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9] = data

console.log(x0); //1が表示される
console.log(x1); //undefinedが表示される

```
ただし、宣言してない要素に対しては、エラーになる模様です。

```javascript

let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let [y0] = data

console.log(y0); //1が表示される
console.log(y1); //Uncaught ReferenceError: y1 is not defined
```

#### ショートカット演算
- 非推奨記法らしい。英語のスラングみたいな感じでしょうか。（Hey,dude. What’s up?みたいな）
- 読みづらいというか、脳内パワーの消費量が多そうです
- 素直にif文を書いた方が良いです
- これ使うくらいなら「三項演算子」のがいいと思います
- 左式だけ評価されて、右式は無視されるケースがあります。下に例を書きます

```javascript

let x = 1;
x === 2 && console.log('おはよう'); //何も表示されない
x === 1 && console.log('こんばんは'); //「こんばんは」と表示される
```

```javascript

let y = 1;
y === 2 || console.log('おはよう'); //「おはよう」と表示される
y === 1 || console.log('こんばんは'); //何も表示されない
```

#### delete演算子
- 指定した配列要素やオブジェクトのプロパティを削除してくれる
- 削除に成功すると「true」、失敗すると「false」と教えてくれる
- 別に教えてくれなくてもいいと思ったけど、if文とかの判定で使えそうですね。

配列の要素を削除した場合、該当する要素が削除されるだけ。削除されたインデックス番号は永久欠番

```javascript
var ary = ['お雑煮', 'おせち', '門松']
console.log(delete ary[1]); //true
console.log(ary) //[ 0:'お雑煮', ２：'門松']と表示される
```
プロパティを削除した場合、プロパティ自体が削除されるだけで、プロパティが参照するオブジェクトが削除されるわけではない

```javascript
var obj1 = {x:1, y:2}
var obj2 = {x:obj1, y:2}
console.log(delete obj2.x); //true
console.log(obj2) //{y:2}と表示される
```
#### for...of命令
- Coming Soon


## まとめ
- 他の言語と近い構文が多いです。
- ただし、ES６で追加になった構文もあるため、使いながら覚えるしかなさそうです。
- 初学者の３割はここを無限ループすることでしょう
PyTorchチュートリアルメモ(未整理)

人生色々ありますが，数あるライフ・イベントの一つに「PyTorchのチュートリアルをこなすこと」がある人もいると思います．

強く生きましょう…

#PyTorchを学ぶにあたって
普段は参考書に頼るのですが，公式のドキュメントに触れた経験が少ないので今回は[これ](https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html)をやろうと思います．~~60分で終わる人凄い~~
あと完全にメモとして書く予定なので，ごちゃごちゃしております．
後で再度整理する予定です．

##Getting Started
乱数生成
ゼロ行列
onesの行列(名前が分からない)
以下のように和の演算の出力先をoutにて指定することもできる．

```
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
```
インデックスの引き方はNumpyと同じ

```
print(x[:, 1])
```
reshapeは以下の通り

```
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)  # the size -1 is inferred from other dimensions
print(x.size(), y.size(), z.size())
```
NUMPY BRIDGEについてはスルー
##AutoGrad
なんと勾配計算できるらしいです．すごい．
```requires_grad=True```
とすると計算を追跡可能に．デフォルトはFalseとのこと．
```a.requires_grad_(True)```
.requires_grad_(~~)にてフラグを変更できる．
```out.backward()```
の計算でしばし詰む羽目に．よく見たらmeanされていたという…
ヤコビアンを計算してくれます．
>Now in this case y is no longer a scalar. 

なる文があるが，お前がスカラーだったのいつだよと思っていたところtorch.autogradという関数だとComplete Jacobianを計算できないらしい．backward()を使用せよとのこと．
Complete Jacobianとは一体…？正則とかそういう…？

```
with torch.no_grad():
```
を使うと勾配の計算の追跡を切れるらしい．

##Neural Networks
autograd使ってnn覚えようぜっていうパートです．


スタンダードなネットワークを考えるので，やりたいこととしては
・ネットワーク定義
・インプットのデータセットの反復
・インプットをネットワークに送る
・ロスの計算
・誤差逆伝播
・重みの更新
です．

初心者すぎてfcってなんやねんと調べていたのですが，全結合のことでした…実装のお勉強になっております…

```
        self.conv1 = nn.Conv2d(1, 6, 5)
```
と書いたとき，インプットのイメージチャンネル数が1，アウトプットのイメージチャンネル数が6，5×5のコンボリューションを行うということです．

```self.fc1 = nn.Linear(16 * 5 * 5, 120)```
と書いたとき，入力数が16*5*5で出力数が120の全結合を行うということです．
autogradなるものを使うと
```net.zero_grad()```
は勾配の初期化を行うとのこと．

損失関数はMSEloss

最適化手法はtorch.optimから呼び出すとのこと．

##Training a classifier
torchvisionというパッケージのお試し
ここでは以下の5ステップを行う
・torchvisionを用いたCIFAR10のデータセットのロード及び正規化
・ネットワークの定義．今回はCNN
・損失関数の定義
・ネットワークの訓練
・テスト

num_wokersとはなんぞやと調べていたところ[分かりやすいサイト](https://qiita.com/sh-tatsuno/items/42fccff90c98103dffc9)を見つけました．感謝…
[ここ](https://qiita.com/tanemaki/items/8dfb3c81a3af6feebdfe)も大変参考になりました．~~得た知識はこの記事には反映されてません~~

後は前のチュートリアルで説明してある箇所を纏めているだけなのでぼーっと眺める感じです．
**CNNの定義**，**損失関数と最適化手法の定義**
は大体そのまんまです．
**ネットワークの訓練**
ではデータのロード(trainloderとは…？となる)，勾配を0に初期化，forward，backward，パラメータの最適化を行っている．
まあそうですよね，という感想

後はテストしておしまい．
インプット→net()に放り込む→各ラベルの確率が出てくるのでtorch.maxにて最大となるものを予測結果として採用→正解率を計算
という具合です．
ちなみに正解率は60%前後．リアル…
今回GPU周りはスルーします．
LibreOffice6のCalcでデフォルトのフォントを指定するやり方

- Calcでデフォルトフォントを指定するやり方を探していたら、LibreOffice HELP!に [標準テンプレートの変更](https://help.libreoffice.org/Common/Changing_Default_Templates/ja) という解説がありました。
- この情報を参考に設定してみましたので、備忘録として記録しておきます。
    - Windows10 Home + LibreOffice 6.1.3 と Linux Mint 19.1 + LibreOffice 6.0.7 の２種類の環境で各々設定してみました。

## Calcではデフォルトフォントは「テンプレート」で指定するらしい

- 自分の設定を「**既定のテンプレートとして保存**」することで、**デフォルトフォント等の指定が出来る**とのことです。
  - 元々の「標準テンプレート」を上書きするやり方ではなくて、自分が作成したテンプレートファイルを「既定のテンプレート」として扱うようにする様です。
  - Windows10もLinux Mintも基本的に同じ手順でした。

## Calcでデフォルトフォントを自分用にしたテンプレートを作成してみた

### ◇ザックリな要約

- F11（スタイルの管理）から「標準」を右クリックで「編集」、フォント等を好きなものに変更、Shift+F11（テンプレートとして保存）で「既定のテンプレートにする」をオンにして自分用のテンプレートを保存する。

### ◇手順 

（画面はWindows10の例です）

1). 「表計算ドキュメント」を新規作成する。

- 私の環境では、元々のデフォルトのフォントが”MS Pゴシック”の"10"ポイントになっていました。

2). 「スタイル」>「スタイルの管理(F11)」を選ぶ。

- メニューから「スタイル」>「スタイルの管理(F11)」を選びます。

    ![図1. スタイルの管理](https://qiita-image-store.s3.amazonaws.com/0/105904/7177105d-2cb4-73b1-db3d-c8d322307e75.jpeg)


3). スタイルの「標準」の「編集(B)」を選ぶ。

- 「スタイル」のウインドウが表示されますので、一番上の「標準」を右クリックして「編集(B)」を選びます。

    ![図2. "標準"を右クリックして"編集(B)"](https://qiita-image-store.s3.amazonaws.com/0/105904/d5103061-0fb6-71cb-165a-5fc52dfba116.jpeg)


4). 「セルスタイル：標準」の「フォント」タブで、デフォルトにしたいフォントを指定する。

- 「セルスタイル：標準」のウインドウが表示されます。「フォント」タブを選びます。

    ![図3. セルスタイル：標準でフォントを変更（変更前）](https://qiita-image-store.s3.amazonaws.com/0/105904/8afdfd8c-b88e-954b-df39-48eea02a476e.jpeg)


- 西洋諸言語用フォントとアジア圏言語用フォントを、デフォルトにしたいものに変更し、「OK」をクリックします。
   - ここでは西洋用として"Arial"の"12ポイント"、アジア用として"Meiryo UI"の"12"ポイントを指定しました。

    ![図4. セルスタイル：標準でフォントを変更（変更後）](https://qiita-image-store.s3.amazonaws.com/0/105904/49e8ce63-bcfc-498e-2268-5a9e298a50f3.jpeg)


5). 設定した状態を「既定のテンプレート」として保存する。

- メニューの「ファイル」＞「テンプレート」＞「テンプレートとして保存(A)...Shift+F11」を選びます。

    ![図5. テンプレートとして保存](https://qiita-image-store.s3.amazonaws.com/0/105904/b813496d-f3df-9306-b19f-615664edffab.jpeg)


    - 「テンプレートとして保存」のウインドウがでますので、適当なテンプレート名（ここでは”Calc_MyTemplate”としました）を入力し、テンプレートのカテゴリは「自分のテンプレート」を選択し、**「既定のテンプレートにする(S)」のチェックボックスをオン**にして（**←ここ重要**）「保存(S)」します。
      - カテゴリを必ず選ぶ必要があるのかどうかは確かめていません。

    ![図6. テンプレートとして保存](https://qiita-image-store.s3.amazonaws.com/0/105904/c50b93a9-2110-81eb-06aa-044b45bc37bd.jpeg)


6). 再度「表計算ドキュメント」を新規作成してみて、デフォルトフォントが変更されているか確認する。

- 無事、デフォルトのフォントが"Meiryo UI"の”12”ポイントに変わっています。

    ![図8. デフォルトフォントが変わったことを確認](https://qiita-image-store.s3.amazonaws.com/0/105904/dc7caac7-8cdd-dcb9-9f2c-610858b95f5f.jpeg)


### ◇作成したテンプレートファイルの保存フォルダ

- 私の環境では、以下のところに保存されていました。

  - [1] Windows10 Home + LibreOffice 6.1.3

        C:\Users\\\<user name>\AppData\Roaming\LibreOffice\4\user\template\
        <自分用のテンプレートのファイル名>.ots

  - [2] Linux Mint 19.1 + LibreOffice 6.0.7

        /home/\<user name>/Templates/
        <自分用のテンプレートのファイル名>.ots
PDOの使い方

PDOとは「PHP Data Objects」の略で、データベースへの接続やエラーの処理などを行う働きがあります。
では、どのようにしてPDOを使えばいいのでしょうか。


#MySQLへの接続
データベースに接続することは、MySQLへの接続も意味します。
そのときのコードの書き方は、次の通りです。

```
<?php
$todo = 'mysql:dbname=todo;host=localhost';
$user = 'yamada';
$password = 'yamada1111';

try{
    $dbh = new PDO($todo, $user, $password);

    print('接続に成功しました。<br>');

    $dbh->query('SET NAMES sjis');

    $sql = 'select * from shouhin';
    foreach ($dbh->query($sql) as $row) {
        print($row['id']);
        print($row['name'].'<br>');
    }
}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}

$dbh = null;

?>
```

特に、PDOExceptionを記載することでPDO接続時で起こったエラーを表示してくれるので、大変便利なコードとなっています。

##queryメソッド
queryメソッドは、SQL文をデータベースに送って様々な処理を行うものです。
特に、即時実行するときや1回しか行わないときによく使われます。
そして、次のような書き方をします。

```
<?php 

$dbh->query(’SQL文の記入’);


$sql = 'SELECT  '名前', '年齢' WHERE 'ID' = $id';
$dbh->query($sql);

?>
```

###prepareメソッド
prepareメソッドは、同じテーブルに値を入れて何度もデータを入れる際に使う、とても効率の良いコードです。
書き方は、次の通りです。

```
<?php 

$dbh->prepare("UPDATE NAMAE
                    SET '年齢' = ? 
                    WHERE id = ?");

//実行するときは、excuteメソッドを用います。
$stmt = $dbh->prepare('SQL文');

$stmt->execute(array(20, 2));

?>
```

この他にも、PDOの使い方はたくさんあります。
まず覚えておきたいVimコマンド

#はじめに

・自分の備忘録のためにも、Vimのコマンドの一覧を記事にしたいと思います。

---
###・ファイル操作系コマンド
__1.保存コマンド→:w__
__2.強制保存コマンド→:w!__(ファイルによっては「読み込み専用」であったり、「他の人が開いている状態」であったりして、その場で警告が出て保存できない場合)
__3.Vimを閉じるコマンド→:q__
__4.Vimを強制的に閉じるコマンド→:q!__(編集後に:qコマンドを実施しても、その編集が破棄されるという警告が出てそのままでは閉じることが出来ません。それでも、閉じたい場合。)
__5.保存してからVimを閉じるコマンド→:wq__(:w と :q を組み合わせたコマンド)
__6.保存してからVimを強制的に閉じるコマンド→:wq!__(:w! と :q! を組み合わせたコマンド)

---
###・モード変更系コマンド
__7.カーソル位置の次の文字から編集を開始する→a__
__8.インサートモードを抜けるキー→Esc__
__9.カーソルがある場所から編集を開始する→i__
__10.カーソルのある行の先頭から編集を開始する→I__
__11.カーソルのある行の下に行を挿入して編集を開始する→o__

---
###・移動系コマンド
__12.左へ移動するコマンド→h__
__13.下へ移動するコマンド→j__
__14.上へ移動するコマンド→k__
__15.右へ移動するコマンド→l__
__16.先頭行へ移動するコマンド→gg__
__17.最終行へ移動するコマンド→G__
__18.行末尾へ移動するコマンド→$__
__19.行先頭へ移動するコマンド→０__
__20.行の文字の開始位置へ移動するコマンド→^__
__21.次の単語に移動するコマンド→w__

---
###・検索系コマンド
__22.検索コマンド→/検索したい言葉__
__23.該当の単語を検索するコマンド→#__(カーソルがある位置にある「単語」を検索)
__24.検索結果を順にたどるコマンド→n__
__25.検索結果を逆順にたどるコマンド→N__

---
###・置換コマンド
__26-1.文字列をを別の文字列に置き換えるコマンド→:s/置換したい文字/置換後の文字/g__
__26-2.文字列をを別の文字列に置き換えるコマンド→:s10,20/置換したい文字/置換後の文字/gc__
(10,20 ＝＞ 10行目から20行目の間で、
g ＝＞ 指定文字が1行に複数あっても全て対象として
c ＝＞ 置換するか毎回チェックして実行)


以上です。
TCP vs UDP のジョーク画像の意味を調べてみた

## はじめに
Twitterで見かけた↓のジョーク画像の意味が、
なんとなくのニュアンスでしかわかってなかったので、
明後日からの仕事始めで同僚からからかわれないよう調べてみた。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="und" dir="ltr">TCP vs UDP <a href="https://t.co/6DJLTCxREA">pic.twitter.com/6DJLTCxREA</a></p>&mdash; Dragan Damjanovic (@dragan_security) <a href="https://twitter.com/dragan_security/status/1080895022504001536?ref_src=twsrc%5Etfw">2019年1月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## つまり、
**TCP**は、コネクション型の通信を行うプロトコルなので、
通信相手との接続が保証されている。（＝口をつけて飲んでいる）

**UDP**は、コネクションレス型の通信を行うプロトコルなので、
通信相手との接続が保証されてなくてよい。（＝口をつけずに飲んでいる）

## さらには、
**TCP**は、データ送信がコネクションを維持していないといけないので、
データ送信が保証される。（＝きれいに飲まれている）

**UDP**は、データ送信がコネクションがなくても行われるので、
失敗しても構わず、ロストしても再送しない。（＝飲めずにこぼれても気にしない）

## もっと深読むと、
**TCP**より、**UDP**のほうが高速（＝水がなくなるのはUDPのほうが先）


という理解！１枚で特徴を捉えている素晴らしい画像ですね。
【Ruby】while文を使う問題を解いてみた

#問題: 1
ターミナルに、1~10を順に表示してください。
ただし、5のみ表示させないでください。

```ruby:while1.rb
a = 1
while a <= 10

  if a == 5
    a += 1
    next
  end

  puts a
  a += 1

end
```

###繰り返し処理を途中で中断し、次の繰り返し処理に進める方法
`next`を使う。

下記は「もし、aが5の場合＋1して次へ進む」（＝5を表示せず次の繰り返し処理に進む）

```ruby:
if a == 5
  a += 1
  next
end
```

#問題: 2
ユーザーが１を選んだら「あなたが選んだ数字は１です」、２を選んだら「あなたが選んだ数字は２です」、３を選んだら処理を中断するプログラムを書いてください。ただし、3を選ぶまでこの処理を続けること。

```ruby:
while true
  puts '番号を選んでください'
  puts '[1]: あなたが選んだ数字を言います [2]:あなたが選んだ数字を言います  [3] 処理を中断します'

  number = gets.to_i

  if number == 1
    puts "あなたが選んだ数字は#{number}です"
  elsif number == 2
    puts "あなたが選んだ数字は#{number}です"
  elsif number == 3
    break
  end
end
```

###無限ループにならない方法
`break`を使うと、繰り返し処理を脱出できる

```ruby:例
#shuffleメソッドで配列の要素をランダムに並び替える
numbers = [1, 2, 3, 4, 5].shuffle
numbers.each do |n|
  puts n
  #5が出たら繰り返しを脱出する
  break if n == 5
end

# => 3
#    1
#    5
```

以下でも同じ

```ruby:例
#shuffleメソッドで配列の要素をランダムに並び替える
numbers = [1, 2, 3, 4, 5].shuffle
numbers.each do |n|
  puts n
  #5が出たら繰り返しを脱出する
  if n == 5
    break
  end
end

# => 3
#    1
#    5
```
ファイルサイズが大きくてPHPでPOSTできない時の対処法

#0.はじめに
環境：PHP 7.0、Apache
動画などの大きなファイルをphpサーバーにPOSTしたときに、なぜがPOSTできない現象が発生。
エラーメッセージ等も出ていなかった。
調べてみると、サーバーのphp.iniによるアップロードファイルの最大容量がデフォルトでは、2M程度となっており、
php.iniの設定を変更する必要があるとのこと。

#1.php.iniの設定を変更
以下の３箇所の設定を変更すればいいようだ。

```
;メモリ使用量の上限
memory_limit = 100M

;POSTデータの最大サイズ　※合計サイズ
post_max_size = 100M

;1ファイルあたりの最大アップロードサイズ
upload_max_filesize = 100M
```

php.iniを更新した後はAapachサーバーの再起動が必要です。

```
$service httpd restart
又は
＄sudo /etc/init.d/apache2 restart
```

#2.参考にしたURL
https://www.php-factory.net/trivia/05.php
https://qiita.com/macer_fkm/items/dda5e343e19c432a1ccd
http://raspberry.blog.jp/archives/3141444.html
http://raining.bear-life.com/linux/php-ini%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%80%81%E5%8F%8D%E6%98%A0%E3%81%95%E3%81%9B%E3%82%8B
inputかtextareaを取得したいみたいなときのXPath技


例えば、こんなフォームがあるとします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/112393/4191a37a-bd54-0875-6bdc-42b7b8bead27.png)


```html

<div data-input-panel="true" data-panel="true">
  <div class="form-option-group">
    <div data-form-grid="true">
      <div class="form-option-header">
        <h3 class="form-label">郵便番号</h3>
      </div>
      <div data-form-input-area="true" class="">
        <input type="text" name="val1" />
      </div>
    </div>
  </div>
  <div class="form-option-group">
    <div data-form-grid="true">
      <div class="form-option-header">
        <h3 class="form-label">都道府県</h3>
      </div>
      <div data-form-input-area="true" class="">
        <textarea name="val2"/>
      </div>
    </div>
  </div>
</div>
```

こういうフォームをテストするとき、 `input` `textarea` の取得はどうしてますか？
idやdata-*などはないので、 `name` 属性を使うのが鉄板かと思います。
（以下、サンプルコードはすべてWebdriverIOの場合）

```js

$('input[name=val1]') // 郵便番号
$('textarea[name=val2]') // 都道府県
```

はい、name属性を雑に名付けた人のせいで大変悲しい感じのコメントがついていますね。
後で読みにくいこと間違いなしなので、自分はよくこんな感じで書きます。


```javascript

$('div.form-option-group=郵便番号').find('input').setValue('100-0001')
$('div.form-option-group=都道府県').find('textearea').setValue('東京都')
```

ざっくり流れを説明するとこんな感じです。

1. 列要素(`div.form-option-group`)を取得
1. その中から特定の文字列を含むものを取得
1. その中から特定のタグ(inputなりtextareaなり)を取得

さて、フォームは往々にして列が増えていくものなので、なるべくコピペしなくて済むようにしておきたいですね。

```javascript

const rowField = (label, tag) => $(`div.form-option-group=${label}`).find(tag)

rowField('郵便番号', 'input').setValue('100-0001')
rowField('都道府県', 'textarea').setValue('東京都')
```

この、inputかtextareaかを指定するのめんどくさいと思いませんか？思いますよね？そんなときはXPathを使いましょう。


```javascript

const rowField = (label) => $(`div.form-option-group=${label}`).find('//*[self::input or self::textarea]')

rowField('郵便番号').setValue('100-0001')
rowField('都道府県').setValue('東京都')
```

inputかtextareaかは気にせず文字を入力できるようになりました。すごいですね。それではまた。
MacでMIDIファイルを再生&WAV出力する

# 経緯

むかーしに個人的に耳コピして作ったゲーム音楽などのMIDIファイルを、久々にMacで再生したくなったためになります👾

[GUIのアプリ](https://itunes.apple.com/jp/app/midiplayer-x/id954177929)もあるようですが、有料だったので無料でできる方法を調べてみました

# 方法

[サウンドフォント](https://ja.wikipedia.org/wiki/SoundFont)を扱えるOSSのシンセサイザーである[FluidSynth](https://ja.wikipedia.org/wiki/FluidSynth)を使います

サウンドフォントはネットを漁ると~~怪しげなものが~~いろいろ出てきますが、例えば以下などならライセンスも明示されており良さそうです(内容はご自身でご確認ください...)

http://www.schristiancollins.com/generaluser.php

http://zandro.freeunixhost.com/opl3/

# 手順

事前に[Homebrew](https://qiita.com/pypypyo14/items/4bf3b8bd511b6e93c9f9)を使えるようにしておきましょう

```
# fluidsynthコマンドを使えるようにする
~❯ brew install fluid-synth --with-libsndfile

# サウンドフォントのダウンロード
~❯ wget 'https://www.dropbox.com/s/4x27l49kxcwamp5/GeneralUser_GS_1.471.zip'
~❯ unzip GeneralUser_GS_1.471.zip
```

再生・停止と、WAVファイル出力は以下になります

```
# Ctrl + Cで停止
~❯ fluidsynth -i "GeneralUser GS 1.471/GeneralUser GS v1.471.sf2" "GeneralUser GS 1.471/demo MIDIs/All Night Long.mid"

# -Fオプションでファイル出力
~❯ fluidsynth -F out.wav -i "GeneralUser GS 1.471/GeneralUser GS v1.471.sf2" "GeneralUser GS 1.471/demo MIDIs/All Night Long.mid"
# -Tオプションで種類の指定も可(以下で一覧が出ます)
~❯ fluidsynth -T help

# .bashrcなどでaliasをつけると楽かも
alias midigs="fluidsynth -i ~/path/to/sf2/GeneralUser\ GS\ v1.471.sf2"
```

よきMIDIライフを！
【Xamarin.Forms】AVFoundationを使ってiOSカメラアプリ開発　ズーム/明るさ設定編

## AVFoudationでカメラのズーム値を変更
ズーム値は1～100倍近くまで設定することができます(iPad Airの場合)

```c#
    public static AVCaptureDevice device;
    private float BrightnessValue = 1.0f;
    device.LockForConfiguration(out NSError error);
    device.SetExposureTargetBias(BrightnessValue, null);
    device.UnlockForConfiguration();
```

###AVFoudationでカメラの明るさ(露出度)を変更
明るさは-8～+8で設定できます(同じくiPad Air)

```C#
    private float ZoomValue = 1.0f
    device.LockForConfiguration(out NSError error);
    device.VideoZoomFactor = ZoomValue;
    device.UnlockForConfiguration();
```



カスタムレンダラーと組み合わせる事によってスライダーコントロールやボタンコントロールで動的に変更することもできます。
UNIXコマンドのみで行うWordPressサーバ移転

# この記事のスコープ
* ファイルとDB(MySQL)のデータ移行

# この記事のスコープ外
* 移転先のWordPress実行環境の構築（できているものとする）
  * LAMP or LEMP環境
  * webサーバのconfig
* ドメインの変更（なしとする）
* DNSの切り替え（下記作業の後に実施）

# 手順
1. ファイルの移動
2. DBの移動

# 1. ファイルの移動

## 移転元のサーバでの作業

* `index.php` や `wp-config.php` を含んだディレクトリ一式を丸ごとコピーする方針
* 以下、必要に応じてrootで実行

```shell
tar -zcvf wordpress.tar.gz <wpのインストールされたディレクトリ(/var/www/html/wordpressなど)>
mv wordpress.tar.gz ~
```

## ローカルでの作業

* 移転元 => ローカル => 移転先へと移動

```shell
scp -p <移転元ユーザ名>@<移転元ホスト名>:~/wordpress.tar.gz /tmp
scp -p /tmp/wordpress.tar.gz <移転先ユーザ名>@<移転先ホスト名>:~
```

## 移転先のサーバでの作業

* `/var/www/wordpress` に展開する
* `/var/www/wordpress` に向くようにwebサーバの設定ファイルを書き換えておく
* 既に `/var/www/wordpress` にWordPressがインストールされている場合は `mv /var/www/wordpress /var/www/wordpress.bak` などとしておく

```shell
chown www-data:www-data ~/wordpress.tar.gz # webサーバの実行ユーザ名に合わせてください
mv ~/wordpress.tar.gz /var/www/
cd ~/var/www/
tar -zxvf wordpress.tar.gz
```

# 2. DBの移動

## 移転元のサーバでの作業

* 「WPのデータが格納されたデータベース名」を忘れた場合は `wp-config.php` に書いてあるので参照

```shell
mysqldump -u root <WPのデータが格納されたデータベース名> > ~/wordpress.sql
```

## ローカルでの作業

```shell
scp -p <移転元ユーザ名>@<移転元ホスト名>:~/wordpress.sql /tmp
scp -p /tmp/wordpress.sql <移転元ユーザ名>@<移転元ホスト名>:~
```

## 移転先のサーバでの作業

* ダンプしたsqlファイルをリストアするにあたり、 以下の事前作業が必要
  * `wp-config.php` に書かれた `DB_NAME` に記載のデータベースの作成
  * `wp-config.php` に書かれた `DB_USER` に記載のユーザの作成
  * どちらも移転元と変わっていても問題ないはず。
* `wp-config.php` に記載の内容とDBの内容が合致してないとデータベース接続確立エラーになるので、もしエラーが発生したら `wp-config.php` を修正する。

```shell
# 事前作業
mysql -uroot
CREATE DATABASE <データベース名>;
CREATE USER <ユーザ名> IDENTIFIED BY [PASSWORD] '<パスワード>';
# リストア
mysql -u<ユーザ名> -p<パスワード> -D <データベース名> < ~/wordpress.sql
```

# 終わり

この状態ではまだドメインが切り替わっていないが、記事の表示などは通常通りできるようになっているはず。
VirtualBox/vagrantで２台サーバ構成の検証環境を作成する

## はじめに
VirtualBoxで新しいソフトウェアの動作検証はよくやるのですが、たまに２台構成（Manager/Agent型、Master/Slave型など）が必要になったときに、毎回ちまちま一つずつVM作っていたので、Vagrantfileでパパっと２台作れるようにまとめました。

## 作成する構成
<img src="https://docs.google.com/drawings/d/e/2PACX-1vR62_AB7-k-nsTyQtjDYPWOEC3teIqCxPZss_nWdI_CX6LYsjaPUSnNBE05WqG1-KeiEWPLrFnU33ZQ/pub?w=633&amp;h=432">

## 環境情報
今回の作業環境は以下の通りです。

* Windows 10 (64bit / Home)
* VirtualBox 5.26
* Vagrant 2.0.2

## 作ってみる
### vagrantboxの準備

使用するboxを準備します。まずboxが置いてある場所
[Vagrantbox.es](http://www.vagrantbox.es/)
↑ここから欲しいboxのurlをコピー

```bash:コマンドプロンプト
vagrant box add {title} {url}
vagrant init -m {title}
```
{title}は、自分で自由に決めます。

ただ、自分が使いやすいような自作のBoxを準備してそれを使い回すほうがあとあとやりやすいと思うので、そのような方は以下参考にしてください。
[CentOS7.4のvagrantbox作成](https://qiita.com/y_marito/items/d62812b58ef7cc261031)

自分の環境では以下のコマンドを実行。

```bash:コマンドプロンプト
> vagrant box add centos74 D:\Vagrant\CentOS-7.4-x86_64.box
> vagrant init -m centos74
```


### Vagrantfileの修正/vagrant up

```vagrant init```で作成されたVagrantfileを修正します。
※```config.vm.box = "centos74"```は追加したBox名に合わせて修正してください。

```bash:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos74"
  
  config.vm.define :vm1 do | vm1 |
    vm1.vm.hostname = "VM1"
    vm1.vm.network :private_network, ip: "192.168.33.10", virtualbox__intnet: "intnet"
    vm1.vm.network :forwarded_port, guest: 22, host: 2201, id: "ssh"
  end
  
  config.vm.define :vm2 do | vm2 |
    vm2.vm.hostname = "VM2"
    vm2.vm.network :private_network, ip: "192.168.33.20", virtualbox__intnet: "intnet"
    vm2.vm.network :forwarded_port, guest: 22, host: 2202, id: "ssh"
  end

end
```
＜補足＞

* ```vm2.vm.network :forwarded_port,~```ポートフォワードするSSHポートを指定しています。これがない場合、VM1のSSHポートはデフォルトの2222になりVM2は空いている2223に自動割りあてされます。

修正したらvagrant upします。

```bash:コマンドプロンプト
> vagrant up
```

以上、簡単！
ToolbarをDataBindingで扱うTips

## Overview
DataBindingを使ってToolbarを扱う時のTipsをまとめます。
ListenerやCustom BindingAdaptersを使うので好みもあると思いますが、ViewModelやPresenterクラスをbindして実装する場合には便利なのでどんなことができるのかをざっと知っておきましょう。

## メニューの制御

Toolbar上のメニューをinflateし、タップしたときのイベントをハンドリングします。
`inflateMenuResId`というBindingAdapterを作って実現します。

```ToolbarBindingAdapters.kt
@BindingAdapter("inflateMenuResId")
fun Toolbar.setInflateMenu(@MenuRes menuResId: Int?) {
    if (menu.isEmpty() && menuResId != null && menuResId != 0) {
        inflateMenu(menuResId)
    }
}
```

```layout/{layout}.xml
<layout>
    <data>
        <import type="com.konifar.sample.R" />

　　　　　　　　　　　　　　　　<variable
            name="viewModel"
            type="com.konifar.sample.SampleViewModel" />
    </data>
    ...

        <androidx.appcompat.widget.Toolbar
            ...
            app:inflateMenuResId="@{R.menu.sample_menu}"
            app:onMenuItemClick="@{viewModel::onMenuItemClick}" />
```

```SampleViewModel.kt

fun onMenuItemClick(@Suppress("UNUSED_PARAMETER") menu: MenuItem): Boolean {
    // メニューがタップされた時の処理
    return true
}
```

ViewModelに`menuResId`のようなIntの値を持ってバインドすることで、動的にメニューを変更することもできます。

## Navigationアイコンのタップ制御

Toolbar左上のアイコンを変更したり、タップしたときのイベントをハンドリングすることもできます。

```layout/{layout}.xml
<layout>
    <data>
        <import type="androidx.core.content.ContextCompat" />

　　　　　　　　　　　　　　　　<variable
            name="viewModel"
            type="com.konifar.sample.SampleViewModel" />
    </data>
    ...

        <androidx.appcompat.widget.Toolbar
            app:navigationIcon="@{ContextCompat.getDrawable(context, viewModel.navigationIconResId)}"
            app:navigationOnClickListener="@{viewModel::onNavigationClick}" />
```

```SampleViewModel.kt
// 動的に変更する場合はObservableIntなどを使う
val navigationIconResId = R.drawable.back

fun onNavigationClick(@Suppress("UNUSED_PARAMETER") view: View) {
    // タップした時の実装
}
```

## スクロール時のelevation変更

スクロールした時にToolbarに影をつけるための実装をDataBindingで共通化できます。
詳しくはこちら => https://qiita.com/konifar/items/4a5568b32f2ced664706#databinding-tips

```ToolbarBindingAdapters.kt
@BindingAdapter("shadowAnimationScrollViewId")
fun Toolbar.setShadowAnimationScrollViewId(@IdRes scrollViewId: Int) {
    val scrollView = this.rootView.findViewById<View>(scrollViewId)
    if (scrollView is ScrollView) {
        scrollView.viewTreeObserver.addOnScrollChangedListener {
            isSelected = scrollView.canScrollVertically(-1)
        }
    }
}
```

```layout/{layout}.xml
<androidx.appcompat.widget.Toolbar
    ...
    android:stateListAnimator="@animator/toolbar_elevation"
    app:shadowAnimationScrollViewId="@{R.id.scroll}" />

<ScrollView
    android:id="@+id/scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    ...
</ScrollView>
```

----

DataBindingで共通化することで、xmlだけで簡単に画面を作れるようになるだけでなく、ViewModelでUnitTestが書きやすくなるというメリットもあります。プロジェクトやチームの様子を見ながら取り入れてみてください。

以上です。
ツールの勉強 -wafw00f-

# はじめに
ペネトレーションテストを行う際に使うWAFの有無及びWAFの種類を確認するツールである「wafw00f」について簡単に仕組みを調べてみた。

# ツールの使い方
簡単なので開発者のページを見てください。
[GitHub：EnableSecurity/wafw00f](https://github.com/EnableSecurity/wafw00f)
[Reconnaissance, Identification & Fingerprinting of Web Application Firewall using WAFW00F](https://kalilinuxtutorials.com/wafw00f/)

# WAF有無のチェック実行
```
root@kali:~# wafw00f https://www.strikewitches.net/
```

## パケットの中身
基本的にURLに普通はWAFで引っかかるであろう文字列を付与し、リクエストを送っている。
その応答のヘッダ等を見ているようだ。

<img width="1122" alt="スクリーンショット 2019-01-06 0.39.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/118089/2b233c4e-64e7-337c-328d-b4eabe2cfd0e.png">

また、リクエストヘッダをいじってリクエストを送っているものもある。

<img width="902" alt="スクリーンショット 2019-01-06 0.54.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/118089/76279e46-0ff6-271d-967e-10eab7b0e39d.png">

# ツールの仕組み（WAF有無判断部分）
githubに公開されているソースコードのpluginsディレクトリ配下に、それぞれのWAFに対応する判断ロジックが記述されている。
Environment modules事始め

## Environment modulesの概要
数値計算を行うサーバーで、複数のビルド環境をそろえて、それらを簡便に切り替えたい場合や、それらのビルド環境でビルドしたアプリをそろえて切り替えたい場合に便利。

例えば、最新のgccを入れたい場合、一般にはシステムデフォルトのgccと環境が食い合う。
デフォルト以外のコンパイラを入れれば、出来れば使うライブラリもそれに合わせてビルドした方がよい。そうすると、コンパイラの切り替えに伴って、そのコンパイラでビルドしたディレクトリに`LD_LIBRARY_PATH`を通したい という要望が出てくる。他にもintelのコンパイラを使っているときはMKLをリンクしたい という事にもなる。
さらにコンパイラ毎にMPIをビルドする場合、もう少し話がややこしくなる。MPIを使ってビルドしたものはビルドに使ったものと同じ環境のMPIの`mpirun`で**実行する**のが望ましい。つまり、ビルド時だけではなくて、アプリ実行時にも環境をそろえた方が良い ということになる。
と、様々なコンパイラ、ライブラリでのビルド環境をそろえようとすると、何か**一括して**環境を切り替えたい という需要が出てくる。その実現方法として、environment modulesが便利。

## インストール
インストールはCentOSであれば、`yum`で簡単。
参考ウェブページ：[Environment modules のインストールと *modulefile* の登録 - Qiita](https://qiita.com/yt_siden/items/00d578781f6173ef3d91)

## 設定
中心となる環境変数は`MODULESPATH`と`MODULEHOME`。
この環境変数は`$(MODULESHOME)/init/.modulespath`に記載されているので、自分の好みのディレクトリを作りたければ、ここに追加。反映させるには再ログインが必要。

```module:/usr/share/Modules/init/.modulespath に追加するテキスト例
/opt/modulefiles

```

## 使い方
```bash
#ロードされているmoduleのリストを表示
module list
#ロードされているmoduleを全てアンロードする
module purge
#用意されているmoduleのリストを表示
module avail
#モジュールAを読み込む
module load A
#モジュールAのヘルプを見る
module help A
```

### シェルスクリプト内で呼ぶとき
`module`コマンドはやや特殊で、PATHを通す類のものとは異なる。スクリプトの上部に以下のコマンドを書いておくと`module`コマンドが使える

```bash
source /etc/profile.d/modules.sh  #sh/bash
source /etc/profile.d/modules.csh #csh/tsch
```
参考にしたページ: [module コマンド](https://www.scl.kyoto-u.ac.jp/Appli/module.html)

## 書き方

```bash
#ヘルプに表示される内容
proc ModulesHelp { } {
        puts stderr "module what is\n"
}

module-whatis   "module what is"

#基本となる変数の設定
set variable variable_to_be_substituted

#競合するモジュールの指定
conflict a_module_to_be_avoided_with_this_module

#当該モジュールに伴って呼ばれるべきモジュールを読む
module load module_to_be_loaded

#PATHをA_PATH_to_be_prependedに前置
prepend-path A_PATH PATH_to_be_prepended

#AN_ENVIRONMENT_VARIABLE_to_be_declaredを環境変数AN_ENVIRONMENT_VARIABLEとして宣言
setenv AN_ENVIRONMENT_VARIABLE AN_ENVIRONMENT_VARIABLE_to_be_declared
```
たとえば、

```bash
proc ModulesHelp { } {
        puts stderr "\tAdds some_application to your environment variables.\n"
}

module-whatis   "adds some_application to your environment variable.s"

set root /opt/some_application_1.2.3

conflict different_environment_module

module load dependent_module_on_some_application_1.2.3

prepend-path PATH $root/bin
prepend-path PATH $root/sbin

prepend-path MANPATH $root/share/man

prepend-path LD_LAIBRARY_PATH $root/lib

setenv some_application_ROOT $root
```

参考にしたURL: [Modulesを使った環境設定、環境スイッチ - おびなたん☆](https://earth2001y.hatenablog.com/entry/20130205/modules)
css-loaderのsourceMapがスタイル適用の遅延を招く

**:warning: DEPRECATED (2019.07.06) :warning:**
古くからの「HTMLとスタイルは別ファイルに分割すべし」との考えに従ってスタイルはコンポーネント毎に専用のCSSを用意してcss-loaderで読み込ませていたが、Css in JSの方が有用と判断したため本記事は有用性を失っている。

---

# 概要

開発時に、CSSファイルで定義したスタイルがJavascript実行より遅れて適用されて意図しない動作をした。以下、原因を調査した際の覚書。

# 環境

Reactプロジェクトを`create-react-app`で作成後、`yarn eject`を実行した。得られた環境は以下の通り。

- React: 16.5.2
- webpack: 4.19.1

# ソースコード

```javascript:src/App.js
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  componentDidMount() {
    const logo = document.querySelector('.App-logo');
    const logoStyle = window.getComputedStyle(logo);
    const logoHeight = logoStyle.getPropertyValue('height');
    console.log(logoHeight);
  }
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            Edit <code>src/App.js</code> and save to reload.
          </p>
          <a
            className="App-link"
            href="https://reactjs.org"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn React
          </a>
        </header>
      </div>
    );
  }
}

export default App;
```

# OKパターン

`yarn start`にて開発サーバーを立ち上げると、`.App-logo`の`height`が計算され、コンソールに`281.594px`と出力される。また、ChromeのDeveloper ToolsでElementsを見ると、スタイルはheadタグ内に`<style>`として記述されている。

<img width="1268" alt="Screen Shot 2018-10-15 at 16.27.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/286440/50c8ae1f-a015-e2f1-184d-b669c7b8aa40.png">

# NGパターン

webpackの設定にて、css-loaderで`sourceMap`が有効になっていると、スタイルが適用される前にスクリプトが実行されてしまい、期待と異なる結果になる。

```diff:config/webpack.config.dev.js
    require.resolve('style-loader'),
    {
      loader: require.resolve('css-loader'),
-     options: cssOptions,
+     options: Object.assign(cssOptions, {
+       sourceMap: true,
+     }),
    },
```

<img width="1268" alt="Screen Shot 2018-10-15 at 16.28.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/286440/6997fc2d-f5f5-f9dc-7bd0-40064cf6e643.png">

`yarn start`にて開発サーバーを立ち上げると、`.App-logo`の`height`が計算される時点でスタイルは適用されておらず、コンソールには`0px`と出力される。また、ChromeのDeveloper ToolsでElementsを見ると、スタイルはheadタグ内に`<link>`として記述されている。外部ファイルを読み込む形になっており、スクリプト実行時には読み込みが完了してないため、期待と異なる結果になる。

# 参考

- https://github.com/webpack-contrib/css-loader/issues/613
StateListAnimatorを使ってスクロール時にToolbarのelevationを変化させる

## Overview
![test.gif](https://qiita-image-store.s3.amazonaws.com/0/15267/149abd27-44b8-835b-62b7-a49a6188d46f.gif)

Toolbarの下のScrollViewやRecyclerViewをスクロールした時にToolbarの影をつけたい時の実装です。
Toolbarの`StateListAnimator`と、ScrollViewの`canScrollVertically()`を使って実現します。


## 1. ObjectAnimatorを作る

状態がselectedになった時にelevationを変化させるObjectAnimatorを作ります。

```res/animator/toolbar_elevation.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="true">
        <objectAnimator
            android:duration="200"
            android:propertyName="elevation"
            android:valueTo="4dp"
            android:valueType="floatType" />
    </item>

    <item>
        <objectAnimator
            android:duration="200"
            android:propertyName="elevation"
            android:valueTo="0dp"
            android:valueType="floatType" />
    </item>

</selector>
```

## 2. ToolbarにObjectAnimatorをセットする

作成したObjectAnimatorをToolbarにセットします。

```res/layout/{layout_name}.xml
<androidx.appcompat.widget.Toolbar
    ...
    android:stateListAnimator="@animator/toolbar_elevation" />
```

## 3. Toolbarの状態を変更する

ScrollView/RecyclerViewのcanScrollVertically()の値でToolbarの状態を変更します。

```ActivityorFragment.kt
binding.scrollView.viewTreeObserver.addOnScrollChangedListener {
    // -1をセットすると、スクロール位置が一番上の時のみtrueになる
    isSelected = binding.scrollView.canScrollVertically(-1)
}
```

これでスクロール時にToolbarの選択状態が変わり、elevationが変化するようになります。

----

## DataBinding Tips

styleとDataBindingのCustomBindingAdapterを使って共通化することもできます。

```res/values/styles.xml
<style name="Toolbar.NoShadow" parent="Widget.AppCompat.Toolbar">
    <item name="android:elevation">0dp</item>
    <item name="android:stateListAnimator">@animator/toolbar_elevation</item>
</style>
```

```ToolbarBindingAdapters.kt
@BindingAdapter("shadowAnimationScrollViewId")
fun Toolbar.setShadowAnimationScrollViewId(@IdRes scrollViewId: Int) {
    val scrollView = this.rootView.findViewById<View>(scrollViewId)
    if (scrollView is ScrollView) {
        scrollView.viewTreeObserver.addOnScrollChangedListener {
            isSelected = scrollView.canScrollVertically(-1)
        }
    }
}
```

```layout/{layout}.xml
<android.support.v7.widget.Toolbar
    ...
    style="@style/Toolbar.NoShadow"
    app:shadowAnimationScrollViewId="@{R.id.scroll}" />

<ScrollView
    android:id="@+id/scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    ...
</ScrollView>
```
プログラムからSSH接続したときに.bashrcが読み込まれないときの対処

NodeJSで書いたプログラムから外部サーバにSSHで接続してコマンドを実行したいと思ったのですが、普通にSSH接続するときに使えるエイリアスが、プログラムからのアクセスだと使えない、ということがありました。
ライブラリのバグかなーと思い、 `ssh2` のIssueを漁っていた所、こんなものを発見。
（引用中のカッコ内は私が翻訳したものです）

https://github.com/mscdex/ssh2/issues/77#issuecomment-35509746

> You may have to check your .bashrc. At least on Ubuntu, .bashrc will exit early if it detects that it's not being run in interactive mode:
> （あなたのサーバの.bashrcを読んでみてね。Ubuntuなどでは、.bashrcの最初の方でシェルが対話的に実行されてるかどうかをチェックしてます。）
> 
> ```
> # If not running interactively, don't do anything
> [ -z "$PS1" ] && return
> ```
> You could try just setting PS1 before sourceing .bashrc:
> （PS1という変数にセットしてから.bashrcを再読込してみたらどうかな）
> 
> ```
> conn.exec("PS1='\u@\h:\w\$ ' source ~/.bashrc; echo Hooray", function(err, stream) {
>   // ...
> });
> ```

ライブラリのバグではなく、.bashrc上でインタラクティブシェルかどうかの判定をしており、それに引っかかっていたということのようです。
ほとんどデフォルトのままで運用していたため気づきませんでした……ちゃんと読まないとだめですね。
【Rails】omniauth-twitterでOAuth::Unauthorized 400 Bad Requestになった

パーフェクトRuby on Railsを参考にTwitterログインを試していたところ、ずっと
`OAuth::Unauthorized 400 Bad Request`となっていた。

結論としては、以下の**`<<: *default_twitter`** の入力漏れが原因であった。


```config/secrets.yml
default_twitter: &default_twitter
  twitter_api_key: 'dummy api key'
  twitter_api_secret: 'dummy api secret'

development:
  secret_key_base: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  <<: *default_twitter

test:
  secret_key_base: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  <<: *default_twitter
```

見落としがちなので注意したい。
体重計を改造してインターネットにつないでスマートスピーカーと連携させてみた

*本記事は、[2018年7月に別の場所へ書いた記事](https://cyclic-lab.blogspot.com/2018/07/blog-post.html)の転載です*

# 概要
体重計を改造して、測った体重をWi-Fi経由でクラウドに記録できるようにしてみました。さらに、一台の体重計を家族で共有するために、スマートスピーカーで誰の体重かを知らせてあげられるようにしました。

# ハードウェア
一般に、デジタル式の体重計では、ひずみゲージセンサを使った「ロードセル」というデバイスで重さを計測しています。このロードセル、単体でも入手できますが、体重計を作るなら、市販の体重計をばらしてロードセルと筐体をそのまま流用してしまったほうが、手間もコストもかからず楽らしい。
というわけで、タニタのシンプルなデジタル式体重計 [HD-661](https://www.amazon.co.jp/dp/B0052BPUCA) を購入して分解・改造。ロードセルを使った重さの計測には [HX711 というICチップを使ったロードセル用のADコンバータ](http://akizukidenshi.com/catalog/g/gK-12370/) を、マイコンには小型Wi-Fiモジュールの [ESP8266 (ESP-WROOM-02)](https://www.switch-science.com/catalog/2346/) を、体重の表示には[4桁の7セグメントLED](http://akizukidenshi.com/catalog/g/gI-03672/)と[ロジックIC(シフトレジスタ)の 74HC595](http://akizukidenshi.com/catalog/g/gI-08605/) を使います。体重計そのものとこれらの部品など含めて、部品代は総額3500円くらい。

過程はすっ飛ばして、出来上がった体重計はこんな感じです。
![体重計内部](https://qiita-image-store.s3.amazonaws.com/0/336603/56b30c97-9d34-0de3-4250-fa85ae16851a.jpeg)
![体重計外観](https://qiita-image-store.s3.amazonaws.com/0/336603/c2616acc-3e60-5673-3dbb-a1a6bf123c73.jpeg)
回路図は以下の通り。
7セグメントLEDと74HC595の周辺の配線が多くて苦労しました。。。
![回路図](https://qiita-image-store.s3.amazonaws.com/0/336603/cb5f5f2e-81d6-a35b-5ebc-8658bee5cb90.png)

# ソフトウェア
マイコン側は Arduino で体重を計測して HTTP POST、WEB サービス側は AWS の API Gateway + Lambda + DynamoDB で受信した体重を記録、するものをそれぞれ作りました。

また、このままだと誰の体重かが分からないので、Alexa Skill Kit でカスタムスキルを作って、スマートスピーカー (Amazon Echo dot) に誰の体重を測ったのかを伝えられるようにしてみました。使う人とスマートスピーカーとのやり取りはこんな感じ (やり取りがわかりやすかったのでテスト用の画面で)。
![amazon alexa](https://qiita-image-store.s3.amazonaws.com/0/336603/ed9a7c55-fc33-f0be-1570-464f0965dcba.jpeg)
さらに、実際のデータ記録先は、IoT向けのセンサデータなどの記録・分析用WEBサービス [ThingSpeak](https://thingspeak.com) (運営しているのは Matlab の MathWorks だそうです) を活用。
![ws05.png](https://qiita-image-store.s3.amazonaws.com/0/336603/949a361b-46ee-5a39-2d9e-c70eac8e2ce0.png)
というわけで、体重を毎日測って健康管理できるようになりました。

※コードがきれいにまとまっておらず公開できてませんが、「[参考](#参考)」で紹介されているものをうまく組み合わせていくと、一通り動くものが作れると思います。

# 参考
今回のハードとソフトを作るにあたっては、以下の記事などを参考にしました。

- [歪みゲージ(ロードセル)と HX711 を使って重量計測する (Arduino) | tech - 氾濫原](https://lowreal.net/2016/12/25/1)
- [体重計をハックして無線化してみた - Qiita](https://qiita.com/shozaburo/items/8c0aa7ad5c16878bc3c5)
- [4連の７セグメントLEDをシフトレジスタで制御してピン数を節約する | ものづくりとプログラミング日記](http://miha.jugem.cc/?eid=100)
- [ESP-WROOM-02 Arduino互換ボードのGPIOはこうやって使う - Qiita](https://qiita.com/umi_kappa/items/ac3d37db44a2dcfe71fd)
- [ESP8266でSPI通信する - Qiita](https://qiita.com/hikoalpha/items/f735662e2e0d75699675)
- [ESP8266 (ESP-WROOM-02) の便利ライブラリまとめ (Ticker編) - Qiita](https://qiita.com/exabugs/items/34aab51eb2d35207629b)
- [esp8266 - What is the secret of the arduino yield() function? - Stack Overflow](https://stackoverflow.com/questions/34497758/what-is-the-secret-of-the-arduino-yieldfunction/34498165)
- [Alexa | アレクサ | Alexaスキル開発トレーニング](https://developer.amazon.com/ja/alexa-skills-kit/training/building-a-skill)
- [[日本語Alexa] ダイアログモデルでスロットを自由自在に操作するためのドキュメント ｜ Developers.IO](https://dev.classmethod.jp/cloud/alexa-dialog-model/)
何でコーディングが簡単で、私の仕事ではない

私が開発者としてのキャリアに、この質問を多くの人々から受けました。
> コーディングが難しいですか？

他の開発者もそのような質問を受けるそうと思うんだ。

私の答えは：
> 文法的に正しい文を作るのと同じくらい簡単です。

それから私は突然、つまらない種類の人として分類されました。私はそれから私が私の技術か何かを自慢することを意味しないことを明確にしなければなりません。それはコーディングの真実です。

まあ、まず。コードとは何ですか？
> コードとは、情報や指示をコンピュータが理解できる形式で表現するためのシステムまたは言語です。

それでは、文とは何ですか？
> 文は完全に意味をなす単語の集まりです。

以上の意味から、私たちは皆同意できると思います。コードと文は同じです。そうではありませんか？

それで、あなたはどのように文を理解するはずでしたか？どの言語でも、文法と呼ばれる特定の規則に従います。文法は文の文脈と意味を理解させてくれます。

コードの場合は、文法はただしくないのときに、次のようなエラーメッセージが表示されます。

> SyntaxError: missing ; before statement in line 9

このエラーは、特定の規則に従わないと発生します。
それで、コーディングはどれほど難しいのでしょうか。まったく難しいことではありません。あなたはただ規則を学び、コーディングの進歩の中でそれらの規則を適用する必要があります。

それから私はこのようなフォローアップの質問を受けるでしょう
> もしそうなら、なぜ私たちはコードを書くために開発者に多額のお金を払っているのでしょうか？

繰り返しますが、私の答えは
> さて、私はあなたがコードを書くために私たちにお金を払うのではなく、コードを書くことによって問題を解決するために支払うとあなたに言うならどうでしょうか。

ほとんどの人は開発者がすることを誤解していました。コードを書かないように会社から雇われています。それがそれほど単純であるならば、彼らはそれをするためにサルを訓練するでしょう。

特定の問題に対する解決策を見つけ、コードを書くことで問題を解決できるシステムを構築するために雇われます。それは開発者を雇われているの理由だ。

医者のような他の例を使うことができます。医者はあなたが病気になったときあなたに薬を与えるためだけにそこにいません。彼らは実際にあなたの状況を診断し、あなたの状態に適した治療法を考え出す必要があります。あなたが特定の種類の薬にアレルギーがあるかどうか、または特定の治療に他の合併症があるかどうか。

開発者にもそうだし。インフラ、予算、時間など、複数の制限がある特定の問題に直面しています。その制限内でその問題を解決するためのシステムを作成します。

それで、次回誰かがあなたにこの質問をするとき、このように彼らに説明してください。うまくいけば、彼らはあなたの仕事についてのより良い理解と開発者の一人としてのインスピレーションを得るでしょう。

読んでくれてありがとう！
TyranoScriptの禁則処理時の文字表示を改善する

*2019.01.18追記*
ティラノスクリプトV474以上をお使いの場合は本記事の部分はすでに改善されています。
https://twitter.com/shikemokumk/status/1086124376091545600


## 三行でまとめると

* TyranoScriptのメッセージ改行で気になる挙動があった。
   * 画像の通り、文字表示時に「いるが、」の「が」の字が行末に一瞬表示されるが、そのあと次の行に移動してしまう。
* 原因は「、」や「。」を文頭においてはならないという日本語ルールを守るため。
* [noymer/tyranoscript-text-line-break](https://github.com/noymer/tyranoscript-text-line-break)を使えば改善する。


![ezgif-4-e5c998a6ae53.gif](https://qiita-image-store.s3.amazonaws.com/0/69490/2205f5e1-2132-2e5e-0eff-c1d5693dfa91.gif)




## 概要

2018年冬コミで[仮想国のリブラ](https://catalyst-games.com/products/urban)というゲームの体験版を頒布しました。
ゲーム作成には[TyranoScript](https://tyrano.jp/)を利用しました。簡単にノベルゲームが作れる優れもので、エンジニアとしてもwebベースの技術が使われているので非常にとっつきやすいです。
しかし時折メッセージの行末で気になる挙動がありました。
画像の通り、文字表示時に「いるが、」の「が」の字が行末に一瞬表示されるが、そのあと次の行に移動してしまう、というものです。

## 原因

* TyranoScriptにおいて、メッセージは一文字ずつ文字を追加して表示している。

* 例文として「ノイズキャンセリングイヤフォンをして読書している女子もいるが、騒がしいのは音声だけじゃない。」というメッセージを表示する時、
 「......いるが」までは一行に収まるのだが「、」を足すと一行に収まらなくなる。
* 「、」を二行目の文頭に表示するのは「禁則処理」[^禁則処理]という日本語のルール反する。よって「、」を追加したタイミングで、「......いるが、」の「が、」が二行目に移動してしまう。
* これで「が」が一行目末尾から二行目の頭に移動する。

[^禁則処理]: 禁則処理とは、句読点（。、）や閉じ括弧（」』)】など）と言った文字は、文章の行頭に位置させてはならないというルールのこと。[禁則処理 - Wikipedia](https://ja.wikipedia.org/wiki/%E7%A6%81%E5%89%87%E5%87%A6%E7%90%86)


## 対策（プラグイン実装説明）



* 一文字ずつ文字を追加して表示するのではなく、まず全部の文字を見えない状態で追加して、そのあと一文字ずつ見えるようにすれば良い。そうすればあらかじめ「......いるが、」の「が、」は二行目の状態で文章が表示される。
* [noymer/tyranoscript-text-line-break](https://github.com/noymer/tyranoscript-text-line-break)を使えば改善する。

--
*以下からは技術的説明になります*

**before**

* TyranoScriptにおいて、 [`<span class="current_span"></span>` に一文字ずつ文字を追加して](https://github.com/ShikemokuMK/tyranoscript/blob/c34c4ae4069c07775777f6558a3522867d8ee77a/tyrano/plugins/kag/kag.tag.js#L935-L949
)メッセージを表示していた。

**after**

* プラグインを利用すると、 [一文字ずつ `<span style='visibility: hidden'></span>`で囲んで](https://github.com/noymer/tyranoscript-text-line-break/blob/v1.0.0/text_line_break/index.js#L127)全て非表示状態にして、[非表示のまま`<span class="current_span"></span>`に全て追加し](https://github.com/noymer/tyranoscript-text-line-break/blob/v1.0.0/text_line_break/index.js#L131-L132)、そののち一文字ずつ非表示を解いて表示するようにした。

## 締め

* [TyranoScript本体](https://github.com/ShikemokuMK/tyranoscript)にもプルリクエストを投げるといいかなー、と思ってます。
Donskerの定理

```{r}

library(dplyr)

n=10000;c=2

samples=function(z){
  
return(sample(c(1,-1),z,prob=c(1/2,1/2),replace=T))  
  
}



t=0.5

nt=round(t*n)

v=mean(samples(n)^2)

E_guzai_4=mean(samples(n)^4)

c=1/((v^2)/E_guzai_4)

X_mat=array(0,dim=c(nt,10000))

for(j in 1:ncol(X_mat)){

X=(1/sqrt(n*v))*((samples(nt)))

X[nt]=X[nt]+(n*t-nt)*samples(1)

X_mat[,j]=cumsum(X)

}

S_max=apply(X_mat,2,max)

hist(X_mat[nt,])

hist(S_max)

#t>s

s=0.3

nt1=round(n*t);ns1=round(n*s)

E_result=mean(abs(X_mat[nt1,]-X_mat[ns1,])^4)

3*c*abs(t-s)^2



```
wordpress + nginx環境@VPS

備忘録のためのメモ。

vpsの環境設定は終わってるものとする。
（今回はちょと放置してたVPSを引っ張り出して活用）

基本下記を参考にすればOK
- https://qiita.com/fk1/items/3ef1d989d1d5e44a1d03
- https://www.tech-tech.xyz/wordpress-nginx.html
- https://www.server-memo.net/memo/wordpress/nginx-install.html

```
$ yum update // 古くなってるところをアプデ
$ yum install php
$ yum install php-fpm
$ yum install php-gd

// wordpress
$ wget https://ja.wordpress.org/wordpress-latest-ja.tar.gz
$tar zxvf wordpress-latest-ja.tar.gz

```

### mysqlでデータベース作る
（略）参考リンクをば。（書くのだるくなってしまった、、）
### nginx設定
（略）参考リンクをば。
### php-fpm設定
（略）参考リンクをば。

### wordpress設定
（略）参考リンクをば。

wp-config.php書く際はこちらも注意。
- https://www.netassist.ne.jp/blog/?p=1277

### 起動トライ
ここでうまく接続できなかった場合↓

#### mysqlバージョン関連
最後、mysql 8の場合は、うまく接続できないので、下記参考にmy.cnfを変更する。
（既存のユーザーでmysql_native_passwordに変更＆my.cnfでデフォを変更）

- https://www.adminweb.jp/wordpress/install/index1.html
- http://bashalog.c-brains.jp/18/12/17-191903.php


#### 「お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。」のエラーログ
あー、あと、これも
`お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。`出る場合。
`php-mysql`を入れる。

https://qiita.com/pugiemonn/items/6f642ffb0165f69dab

こちら対応したら、
$ systemctl restart nginx
$ systemctl restart php-fpm
忘れずに
VisualStudio2017 LiveTesting xUnit.netでEntityFrameworkに初期値を入れるときにエラーが出る。

並行してテストが実行されているのか、IClassFixtureを使ってテストの開始時に1度だけInmemoryデータべースに初期値を作成するようにしている。

デバッグだと問題ないが、LiveTestingがたまにこける。
発生状況が不安定ですが、初期値にIDを設定しているのだが、重複のエラーでこけているような感じ。

対処としてはInmemoryデータベースを作成するときに名前にGUIDを利用して解決。
https://garywoodfine.com/entity-framework-core-memory-testing-database/
こちらにコードがあります。MSの外国人おばさんの開設にもInmemoryデータベースは名前を一意のものにするのがおススメと記載されている。
【-> {}】アソシエーションでラムダ式を利用する[Rails]

#**はじめに**
アソシエーションでモデル間を関連させるときに、条件を加えることができます。
それに関して簡単にまとめました。

#**ラムダ式を導入すると..**

アソシエーションにラムダ式を導入すると、モデルを参照する際の条件式を指定することができます。
条件式は、メソッドの第二引数にラムダ式`-> {...}`の形式で表します。
ラムダ式の中では、任意のクエリメソッドを指定することができます。
ex) `where`, `order`, `limit`, etc.. 



#**コード**
Userモデルが親モデルで、Tweetモデルが子モデルだとします。
下記のコードでは、deletedカラムがfalseのもののみに限定して子モデルを取得しています。

```user.rb
class User < ApplicationRecord
  has_many :tweets, -> { where(deleted: false) }
end
```

#**おわりに**
こちらの記事が役に立ったという方は、いいね、よろしくお願いします(^^)

また、[takuyaninのマイページ](https://qiita.com/takuyanin)にRails, Rubyに関していくつか記事をまとめてますので、よければご参考ください。