OmniAICreator/Qiita-1.07M huggingface dataset:
PCが再起動していきなりMySQLに繋がらなくなった話

# 事の発端
眠くてうとうとしてたら、どこか変なボタンでも押してしまったのかPCが再起動してて、開発の続きをしようとrails sして見たら次のエラーが発生
＊PCの前でうとうとするのは危険だとまじで反省

```
Mysql2::エラー
'/tmp/mysql.sock'(2)経由でローカルMySQLサーバに接続できません。

```
ええええ。。。！？てなってとりあえずはエラー文でググる

ググったら意外とみんなMySQLに繋がらなくなる事態に陥っている人がいた。
しかし、エラー文は一緒でも載っている解決方法ではなかなか解決しなくて、３日目にしてようやく解決したので自分と同じ境遇の人のためにも投稿。

### 自分はこの方のおかげで無事生還。
[mysqlで The server quit without updating PID fileが出た時](http://morototo.hatenablog.com/entry/2017/07/29/103204)
とりあえず解決したコマンドだけ載せておく。
```
$sudo rm -rf /tmp/mysql.sock.lock
```
Android開発、JSONオブジェクトのvalueに入るnullのチェック方法について



# Android開発におけるAPIからのJSONオブジェクトのデコード

今日はAPI絡みの実装でJSONのパースをやって見てハマりましたので知識を整理します。
iOSなら楽勝ですがAndroidだと若干違っていました。
Androidの方がネストが浅い分見やすい印象がありましたね。
iOSだと[Alamofire](https://github.com/Alamofire/Alamofire)か[APIKit](https://github.com/ishkawa/APIKit)でAPI通信の実装をしますのでクロージャーがガリガリ書いていきます。
メソッドの細分化が得意な人ならあまりネストが深くならず醜くなりませんが、
今まで色んな現場にアサインした感じでは2/3の確率でネストが深くなっていました。

ですが、Androidはクロージャーの文化がありませんのであまりネストをきにする必要が無いようです。
ただし、ラムダ記法がありますので` (引数) -> (処理内容)`という流れがありますのでラムダを乱発したら
ひょっとしたら深いネストが起こるかもしれませんね。


さて、下記のようなJsonファイルがあったとします。

```sample.json
[
　　{
　　　　"access":"JR琵琶湖線彦根駅から徒歩15分",
　　　　"address":"滋賀県彦根市金亀町1-1",
　　　　"name":"彦根城",
　　　　"service":"入場料　大人600円、小人200円　博物館とのセット券　大人1000円、小人350円",
　　　　"tel":"0749-22-2742（彦根城管理事務所）",
　　　　"url":"http://www.hikoneshi.com/",
  "pref" : null
　　},
　　{
　　　　"access":"JR琵琶湖線安土駅から徒歩25分",
　　　　"address":"滋賀県近江八幡市安土町下豊浦",
　　　　"name":"安土城跡",
　　　　"service":"入山料　大人500円、小人100円 拝観料（土・日曜）　500円",
　　　　"tel":"0748-46-4234",
　　　　"url":"http://www.azuchi-shiga.com/",
  "pref" : null¥
　　}
]

```

こちらは下の参考サイトから拝借しました。
JSONを整えたい方は
https://lab.syncer.jp/Tool/JSON-Viewer/
などで頑張って見てください。

## AndroidにおけるJSONオブジェクトのパース
Androidでパースしたい場合は　`JSONArray`を使ってJSONの配列オブジェクトを生成します。


``` readjson.java
JSONArray jsons = new JSONArray(JsonFile);
for (int i = 0; i < jsons.length(); i++){
　　JSONObject jsonRslt = jsons.getJSONObject(i);
　　String access = jsonRslt.getString("access");
　　String address = jsonRslt.getString("address");
　　String name = jsonRslt.getString("name");
　　String service = jsonRslt.getString("service");
　　String tel = jsonRslt.getString("tel");
　　String url = jsonRslt.getString("url");
}

```
これで各変数にオブジェクトを格納できます。
iOSのObjective-Cに比べたらメソッドの名前が良心的ですね。
間違えようがありませんね。
~~それに比べて、Objective-Cときたら~~

## Androidにおけるnullチェックについて

Android開発でのjsonのキーに対するnullチェックが分かりませんでしたので調べました。
Androidはnullにアクセスしたらアプリがクラッシュするみたいでした。(当然か)

やり方は下の通りらしいです。他にベストプラクティスがあれば教えていただきたいです。
iOS開発では滅多に使いませんでしたが、try-catch構文でerrorを吐くのもポイントだったりします。

``` json.java

JSONObject object = jsons // jsonオブジェクトの変数を生成
if (jsonObject.isNull("pref")) {
    // prefに対するvalue(値)がnullである 今回はこっちが通る
} else {
    // prefに対するvalue(値)がnullではない
}

```

こうやってみると、
どう考えてもiOS開発の方が難易度が高いように思うのは自分だけだろうか。
iOSだと検索してもだいたい英語のページしかヒットしなかったから信頼性が欠けるコードを使うしかなかったけど、
Androidだとサクっとベストプラクティスを見つけられるぞ。
~~Javaエンジニア本当に大丈夫か？こんな楽でいいのか？~~

iOSだったらほとんどStack Over Flow頼りで検索しまくっていましたね。
Javaエンジニアの方がどう考えても楽な気がして仕方がない・・・。

# 参考ページ

[Android　Jsonファイル取得について https://nextat.co.jp/staff/archives/5](https://nextat.co.jp/staff/archives/5)
RPAExpress徹底解析(1) -マウス操作-

# RPAExpressのマウス操作
RPAExpressでの機能では様々な機能があります。
ウインドウ管理、マウス操作、ファイル作成、Excel連携など。
これらを色々使ってみて、実際に検証し、出来ることを明確にしようではないか。

と考え、いろいろ触って見たのですが、やっぱりなんかおかしい・・・。
マウスのクリックがうまくいかない。。。
そもそも画像認識はあてにならないし、しょうがないから座標指定にしてもおかしい。。。

ってことで、前回自炊にRPAを活用した件を書きましたが、本来であればマウス操作をコントロールできたほうが確実に速いのです。
うまくいかなかったからキー操作を繰り返しました。

そこで改めてマウス操作を触ってみたという経緯です。

# マウス操作の機能一覧
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249830/f5471730-e543-7207-2f66-1b48d85c1b25.png)

・マウスクリック
・マウス移動
・マウスドラッグ
・マウススクロール


ドラッグ、スクロールはあまり使わない気がしたので、「マウスクリック」「マウス移動」を検証しました。


# 検証
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249830/96fd77fb-9478-d11e-f8c4-c43d43b3a6db.png)

試したのは簡単。
1.マウス移動　　「X:50 Y:50」
2.マウス移動　　「X:50 Y:100」
3.マウス移動　　「X:50 Y:150」
4.マウスクリック「X:50 Y:50」
5.マウスクリック「X:50 Y:100」
6.マウスクリック「X:50 Y:150」


# 検証動画
https://youtu.be/vr2X0lJkQk4


# 結論
実際試してみると、5,6は機能しません。
原因はわかりませんが、X座標に入力した値をY座標としても機能しているのでは？って状態。
全く理解出来ないと思います（笑）

つまり、[5.マウスクリック]の際に、マウスクリックする座標は、X:50 Y:50 (本来 100)
[6.マウスクリック]の際に、マウスクリックする座標は、X:50 Y:50 (本来 150)
試しに、[7.マウスクリック「X:150 Y:50」]にしてみると、X:150 Y:150 (本来 50) でクリックしてまう。。。


# 対応策
ってな訳で、C#でRPA補助ツールを作ってみました。
次回説明します。
Componentのconstructor内のsuper(props)

タイトルの通り、super(props)についてです。
Reactのコンポネントをclassを用いて書く際、以下のように記述することが多いと思います。

```hoge.js
class Hoge extends React.Component {
  constructor(props) {
    super(props)
    .......
  }
　render() {
    return(
      <div>{this.props.name}</div>
    )
  }
}

ReactDOM.render(
  <Hoge name="hogehoge" />,
  document.getElementById("root")
)
```
ここでsuper(props)はReact.Componentのconstructorを継承しています。
React.Componentのconstructorで行っていることの中で、個人的に最も重要だと思われることは、classのpropsプロパティのセット（this.props = props）です。
これにより、class内でthis.propsの値が利用できます。

したがって以下のように、constructorの引数に違う変数を指定しても同様に動きます。

```hogehoge.js
class Hoge extends React.Component {
　//propsの代わりにhogeを引数に指定
  constructor(hoge) {
    super(hoge)
    .......
  }
　render() {
    return(
      <div>{this.props.name}</div>
    )
  }
}

ReactDOM.render(
  <Hoge name="hogehoge" />,
  document.getElementById("root")
)
```
インスタンス化の際に以下の様になるだけです。
this.props = hoge

しかし、this.propsの値を取得するためにprops以外の値を指定することはできず、以下のようにするとエラーになります。

```hogehoge.js
class Hoge extends React.Component {
  constructor(hoge) {
    super(hoge)
    .......
  }
　render() {
    return(
      //hogeというプロパティはないと言われます。
      <div>{this.hoge.name}</div> 
    )
  }
}

ReactDOM.render(
  <Hoge name="hogehoge" />,
  document.getElementById("root")
)
```
IDEショートカット集 ~Eclipse(Java) と Visual Studio(C#)の違い ~

プロジェクトが変わって開発環境が変わることなんてよくあると思います。
IDEも変わり「よく使うショートカットはこっちでは何だっけ？」とか右往左往するのも少なくないので、自分なりによく使うものピックアップしました。

#対象
OS：Windows

##Eclipse
* バージョン：Oxygen4.7
* 公式サイト：https://www.eclipse.org/
* ひとこと：汎用性、拡張性がすごい。プラグインとかこだわり始めるとキリが無い。

##VisualStudio
* バージョン：VisualStudio2017(version 15)
* 公式サイト：https://www.microsoft.com/ja-jp/dev/default.aspx
* ひとこと：必要なものが（ほぼ）全部詰め込まれている。インストールしたら即使える。ただ重い。

#ショートカット集

##コーディング、テキストエディタ系
| 機能 | Eclipse | VisualStudio |
|:-:|:-:|:-:|
| 補完 | <kbd>Ctrl</kbd> + <kbd>Space</kbd> | <kbd>Ctrl</kbd> + <kbd>Space</kbd> |
| コメントアウト | <kbd>Ctrl</kbd> + <kbd>/</kbd> or <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>/</kbd> | <kbd>Ctrl</kbd> + <kbd>K</kbd> + <kbd>Ctrl</kbd> + <kbd>C</kbd> |
| コメントアウト解除 | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>\\</kbd> | <kbd>Ctrl</kbd> + <kbd>K</kbd> + <kbd>Ctrl</kbd> + <kbd>U</kbd> |
| フォーマット | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>F</kbd> | <kbd>Ctrl</kbd> + <kbd>K</kbd> + <kbd>Ctrl</kbd> + <kbd>D</kbd> or <kbd>Ctrl</kbd> + <kbd>K</kbd> + <kbd>Ctrl</kbd> + <kbd>F</kbd> |
| 大文字変換 | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>X</kbd> or <kbd>Y</kbd> | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>U</kbd> |
| 小文字変換 | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>X</kbd> or <kbd>Y</kbd> | <kbd>Ctrl</kbd> + <kbd>U</kbd> |
| リファクタリング | <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>R</kbd> | <kbd>Ctrl</kbd> + <kbd>R</kbd> + <kbd>Ctrl</kbd> + <kbd>R</kbd> |
| 行削除 | <kbd>Ctrl</kbd> + <kbd>D</kbd> | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>L</kbd> |
| 選択行を1行上/下へ移動  | <kbd>Alt</kbd> + <kbd>↑</kbd> or <kbd>↓</kbd>  | <kbd>Alt</kbd> + <kbd>↑</kbd> or <kbd>↓</kbd>  |
| キャメルケース⇔スネークケース | <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>K</kbd> | [拡張が必要](https://marketplace.visualstudio.com/items?itemName=wmaurer.change-case) |

##操作、検索系
| 機能 | Eclipse | VisualStudio |
|:-:|:-:|:-:|
| 呼び出し元階層を開く | <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>H</kbd> |  <kbd>Shift</kbd> + <kbd>F12</kbd> |
| 宣言階層を開く | <kbd>F3</kbd> | <kbd>F12</kbd> |
| 対応する括弧に移動する | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd> | <kbd>Ctrl</kbd> + <kbd>]</kbd> or <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>\\</kbd> |
| 矩形選択 | <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>A</kbd> | <kbd>Alt</kbd> + ドラッグ選択 |
| 定義表示 | <kbd>F2</kbd> | <kbd>Alt</kbd> + <kbd>F12</kbd> |

##ビルド、デバック系
| 機能 | Eclipse | VisualStudio |
|:-:|:-:|:-:|
| ビルド | <kbd>Ctrl</kbd> + <kbd>B</kbd> | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>B</kbd> |
| ステップイン | <kbd>F5</kbd> | <kbd>F11</kbd> |
| ステップオーバー | <kbd>F6</kbd> | <kbd>F10</kbd> |
| ステップリターン | <kbd>F7</kbd> | <kbd>Shift</kbd> + <kbd>F11</kbd> |
| 再開 | <kbd>F8</kbd> | <kbd>F5</kbd> |
| 変数確認 | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>I</kbd> | <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>I</kbd> |
| ブレークポイントの設定/解除 | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>B</kbd> | <kbd>F9</kbd> |

#まとめ
自分がよく使うものをピックアップして掲載したが、各開発者や開発するシステム、プロジェクトによってはよく使用するショートカットなのて違うので参考程度になれば幸いです。

「ショートカットを使用すれば開発スピードも上がって、より生産性が高くいい仕事ができる」と言われているが実感はあまりない。しかし軽微ではあるが右手のマウス⇔キーボード間の行き来の「**ラク**」はできていると思います。
Pull RequestレビューコメントにコミットIDを書いてみてる

いい感じの粒度でコミットを作ることが割と一般的だ。どうしてこれが良いのか？それは、数多くの利点がある。その一つとして、そのコミットが一体何をするものなのか理解し易くなるというのが、読み手にとっても書き手にとっても結構大きなメリットだよね。

それではプルリクはどう見るべきか。

沢山のきめ細かいコミットがズラーッと並んでると、めまいがするよね。せっかく個々のコミットが理解し易い状態なのに、全体で見ると、とてもじゃないけど却って理解し難い事が少なくはないと思う。

そこで私は、書き手がせっかく用意してくれた、理解し易いであろう粒度のコミットを、一つ一つ見ることにしている。

しかし、どこまで見たっけ？ということが多々あったので、先日から、コミットに対するレビューが終わったら、コメントに対象のコミットのidを記載するようにしている。

今のところメリットしか無い！ :tada:
[React]絶対パスでimportできるようにする with vscode and eslint

# やりたいこと

- CreateReactAppで作ったプロジェクトでimportのパスを絶対パスで書きたい
- vscodeの補完やeslintも今まで通り動いてほしい

```js
// bad
import SomeComponent from '../../components/SomeComponent';

// good
import SomeComponent from 'src/components/SomeComponent';
```

## React

- `NODE_PATH`という環境変数にrootとなるパスを指定するとできる
- 実行時に指定するパターン

    ```bash
    NODE_PATH=. yarn start
    ```

- .envファイルに書くパターン

    ```config:.env
    NODE_PATH=.
    ```

## ESLint

- 動くようになってもこのままだとESLintが警告を出してくる
- ESLintのconfigに設定を追加することで対処できる

```yaml:.eslintrc.yaml
settings:
  import/resolver:
    node:
      moduleDirectory:
      - node_modules
      - /
```

```.eslintrc.json
{
  "settings": {
    "import/resolver": {
      "node": {
        "moduleDirectory": ["node_modules", "/"]
      }
    }
  }
}
```

## VSCode

- 最後に補完が効くようにVSCodeに設定を入れる
- `jsconfig.json`というファイルを作って以下のように書けばOK

```json:jsconfig.json
{
  "compilerOptions": {
    "target": "es2015",
    "baseUrl": "./"
  }
}
```
Pythonでコンピュータを作る#3 -単純な論理回路-

最近買ったiPadに傷をつけてしまい,自分も凹んでいる[Motmuu](https://qiita.com/Motmuu)です.
今回は前回学んだパーセプトロンというアルゴリズムを用いて,ANDゲート・NANDゲート・NORゲートについて勉強していきます.
パーセプトロン?!?!という方は[こちら](https://qiita.com/drafts/69b3b26afd261484ede9/edit)

#開発環境
以下の環境で勉強していきたいと思います.
`・Python 3.6.5
・Mac OS X 10.13.2
・Atom 1.10.2`

サンプルコードは[こちら](https://github.com/MotoyaKondo/qitta_gates)
#ANDゲート

ANDゲートとは2入力1出力のゲートです.
ANDゲートの真理値表とは以下のようになります.

| x1 | x2 | y |
|:-:|:-:|:--:|
| 0  | 0  | 0  |
| 0  | 1  | 0  |
| 1  | 0  | 0  |
| 1  | 1  |  1 |

この条件を満たすようにパーセプトロンのパラメタを定めると,
(w1,w2,θ) = (0.5,0.5,0.6)
のようになります.(答えは１つではありません!)

ではこの条件を用いて,Pythonで実装してみましょう！


```python
gates/AND.py

# ANDをクラスとして作成(今後組み合わせることを見越して..)
class AND():
    def __new__(self,x1,x2): #引数はnodeのx1とx2
        # パラメタの指定
        w1 = 0.5
        w2 = 0.5
        t = 0.6
        #パーセプトロン
        if x1*w1 + w2*x2 > t:
            return 1
        else:
            return 0

# 実際に真理値表のようになるか確かめてみました.

print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))

```

Terminalで実行してみると結果は以下のようになります.

```terminal

******$ python and.py
0
0
0
1

```

これは真理値表のyと一致しています！
つまりANDゲートをパーセプトロンを用いて実装できました.
同様にNANDゲートとORゲートについても勉強していきたいと思います~.

#NANDゲート

NANDゲートはANDゲートと逆のものを示します.
なので,真理値表は以下のようになります.

| x1 | x2 | y |
|:-:|:-:|:-:|
| 0  | 0  | 1  |
| 0  | 1  | 1  |
| 1  | 0  | 1  |
| 1  | 1  | 0  |

このように,x1もx2も１の時に出力が0になります.
それではこのような入出力を満たすパラメタを考えます.

うーん.
(w1,w2,θ) = (-0.5,-0.5,-0.6) とかですかね...(これも色々あります)

それではサクッと実装していきましょう!

```python
gates/NAND.py

# NANDをクラスとして作成
class NAND():
    def __new__(self,x1,x2): #引数はnodeのx1とx2
        # パラメタの指定
        w1 = -0.5
        w2 = -0.5
        t = -0.6
        #パーセプトロン
        if x1*w1 + w2*x2 > t:
            return 1
        else:
            return 0

# 実際に真理値表のようになるか確かめてみる

print(NAND(0,0))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(1,1))


```

またTerminalでの実行結果は以下のようになります.

```terminal

********$ python nand.py
1
1
1
0


```

これも真理値表と一致していますね!
お気づきかもしれませんが,NANDゲートはANDゲートノパラメタの正負を入れ替えたものになっていますね！
このシンプルさがパーセプトロンの素晴らしさでもあります.

感嘆しながら,ORゲートも実装してみましょう.

#ORゲート

例によってORゲートの真理値表は以下のようになります.

| x1 | x2 | y |
|:-:|:-:|:-:|
| 0  | 0  | 0  |
|  0 | 1  | 1  |
|  1|  0 | 1  |
|  1 | 1  | 1  |

上のように,x1,x2のどちらかが1であれば出力は1になります.
これを満たすパーセプトロンのパラメタは,
(w1,w2,θ) = (0.5,0.5,0.4) とかですかね.

ではPythonで実装します!

```python

# ORをクラスとして作成
gates/OR.py

class OR():
    def __new__(self,x1,x2): #引数はnodeのx1とx2
        # パラメタの指定
        w1 = 0.5
        w2 = 0.5
        t = 0.4
        #パーセプトロン
        if x1*w1 + w2*x2 > t:
            return 1
        else:
            return 0

# 実際に真理値表のようになるか確かめてみる

print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))


```

出力は以下の通りで真理値表と一致しています.

```terminal
*******$ python or.py
0
1
1
1
```


#振り返り
どうでしたか.
パーセプトロンを用いると簡単に論理ゲートが実装できました.
そしてこの論理ゲートこそがコンピュータをつくって行く魔法の部品です.
なんとなく0と1でコンピュータが構成できるのが現実的になってきましたね...! (そうでもないですか??笑)

それでは次回はパーセプトロンのできることできないことを勉強し,他の論理回路についても学習していきましょう!

次はこちら -> [#4 XORゲート](https://qiita.com/Motmuu/items/64bc5106841cb443107a)
ESP32 trableshooting

Arduino開発環境で書き込もうとするときにうまくいかない場合。
ハードウェアに問題がある場合の事例集。

# Falling back to built-in command interpreter.

症状：

```

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
Falling back to built-in command interpreter.
OK
>ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
Falling back to built-in command interpreter.
OK
>ets Jun  8 2016 00:22:57

・
・
・
```
これを繰り返す。
ターミナルから、何か入力すると内蔵Basicが立ち上がる。以下はa+エンターを入力した場合。

```

flash read err, 1000
Falling back to built-in command interpreter.
OK
>a
What? 
```

原因：不明

# A fatal error occurred: Timed out waiting for packet content

症状：

```

Archiving built core (caching) in: /tmp/arduino_cache_535590/core/core_espressif_esp32_lolin32_FlashFreq_80,UploadSpeed_921600_2f1babc24bca0006bd2b88053cae253c.a
最大1310720バイトのフラッシュメモリのうち、スケッチが145118バイト（11%）を使っています。
最大294912バイトのRAMのうち、グローバル変数が10948バイト（3%）を使っていて、ローカル変数で283964バイト使うことができます。
esptool.py v2.1
Connecting........___
Chip is ESP32D0WDQ6 (revision 0)
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Warning: Could not auto-detect Flash size (FlashID=0xffffff, SizeID=0xff), defaulting to 4MB
Compressed 8192 bytes to 47...

A fatal error occurred: Timed out waiting for packet content
A fatal error occurred: Timed out waiting for packet content
```

原因：不明


# Connecting........_____....._____....._____.....

症状：

```

Archiving built core (caching) in: /tmp/arduino_cache_535590/core/core_espressif_esp32_lolin32_FlashFreq_80,UploadSpeed_921600_2f1babc24bca0006bd2b88053cae253c.a
最大1310720バイトのフラッシュメモリのうち、スケッチが145118バイト（11%）を使っています。
最大294912バイトのRAMのうち、グローバル変数が10948バイト（3%）を使っていて、ローカル変数で283964バイト使うことができます。
esptool.py v2.1
Connecting........_____....._____....._____....._____....._____....._____....._____....._____....._____.....____スケッチの書き込み中にエラーが発生しました
_

A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header
```
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/f3eb667e-b8a8-6b70-e224-6512e3ea451d.png)

この症状が起きたボードの書込回路は、上図のようになっている。

原因1：
RTSによるスイッチトランジスタのエミッタが断線
原因2：
DTRによるスイッチトランジスタのBaseが断線
アルファチャネル付きの画像をnumpy用に読みとるには

アルファチャネル付きの画像ファイルをPythonで読み取るには

### cv2.imread(filename, cv2.IMREAD_UNCHANGED)
 BGRAの画像をcv2.imwrite()で書くのは問題がない。
修正後：`cv2.imread(filename, cv2.IMREAD_UNCHANGED)`のように記載すれば、アルファチャネル付きの画像をきちんと読み込めました。
（間違った理解に対して、ご指摘を感謝します。）
 
~~　BGRAの画像をファイルを読み込んだ時にBGR画像となってしまう場合がある。
　私が使っている？？のバージョンでは、まだ解決していない。　~~


### PIL.Image.open(filename) 
　PIL.Imageの画像形式はnumpy.array()とは相互変換をする必要がある。
　若干めんどうに感じます。 

### skimage.io.imread()
http://scikit-image.org/docs/dev/api/skimage.io.html
　BGRAの画像をすんなり読むことができます。

### Input/Output with Mahotas
https://mahotas.readthedocs.io/en/latest/io.html?highlight=imread
PostgreSQLをデータごとDockerコンテナ化する

Dockerの正しい使い方ではないのでしょうが、開発環境では便利なシーンがありそうな「DBをデータごとまるっとコンテナ化する」アイデアを紹介します。

## 背景

* 機能開発と不具合修正を並行するためにDBの現行バージョンと次期バージョンを何度も切り替えたり、マイグレーションツールの検証のために何回もDBをクリーンな状態に戻したり、といったケースで可能な限り高速にDBをある時点の状態に切り替えたい
* DBの環境構築手順が十分に自動化されていないようなプロジェクトであっても、一度がんばって構築すれば、その時点のDBをスナップショットとしてあとで何度でも使いまわせるようにしたい

## 課題

* 一見すると、PostgreSQLの [公式Dockerイメージ](https://hub.docker.com/_/postgres/) を使ってDB構築し、気に入った状態になったら再利用できるよう `docker commit` でイメージ化しておけばよさそうです。しかし、実際にはDBのデータ領域 `/var/lib/postgresql/data` は `VOLUME` 指定されており、イメージ化の対象からは除外されてしまいます（＝再度 `docker run` したときにDBは初期状態に戻ってしまう）

## 解決策

`VOLUME` 指定のないPostgreSQLイメージからコンテナを起動することで、DBのデータ領域も含めてある時点のスナップショットを完全に丸ごとDockerイメージ化できるようにします。

1. PostgreSQL公式イメージの `Dockerfile` を改変して、`VOLUME` 指定を除外する

    ```shell
    $ git clone https://github.com/docker-library/postgres
    $ cd ./postgres/9.6/
    $ vi Dockerfile
    $ git diff
    ```
    ```diff
    @@ -131,7 +131,7 @@ RUN mkdir -p /var/run/postgresql && chown -R postgres:postgres /var/run/postgres
     ENV PATH $PATH:/usr/lib/postgresql/$PG_MAJOR/bin
     ENV PGDATA /var/lib/postgresql/data
     RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values)
    -VOLUME /var/lib/postgresql/data
    +#VOLUME /var/lib/postgresql/data

     COPY docker-entrypoint.sh /usr/local/bin/
     RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat
    ```

2. Dockerイメージをビルドする

    ```shell
    $ docker build -t postgres-embed:9.6 .
    ```

3. 改変したDockerイメージからDBを起動する

    ```shell
    $ docker run -d --rm -p 5432:5432 —-name=temp-db postgres-embed:9.6
    ```
4. DBを初期セットアップする
    * マイグレーションツールで自動構築するなり、SQLを1つずつ実行して手動構築するなりお任せ

5. 新しいDockerイメージとしてDBの状態を保存する

    ```shell
    $ docker commit temp-db my-awesome-db:1.0
    $ docker images my-awesome-db
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    my-awesome-db       1.0                 55f54dadb483        5 seconds ago       273MB
    ```

6. イメージ作成用の実行中コンテナを停止する

    ```shell
    $ docker stop temp-db
    ```

7. 作成したDockerイメージから爆速でDBを起動する（必要になるたび）

    ```shell
    $ docker run -d --rm -p 5432:5432 --name=awesome-db my-awesome-db:1.0
    ```

## まとめ

`VOLUME` 指定をもたないPostgreSQLイメージからコンテナを起動することで、コンテナ起動中にDBに発生したデータ修正も含めて丸ごと `docker commit` でDockerイメージ化するアイデアを紹介しました。コンテナに状態をもたせないという定石からは外れてしまうものの、VirtualBoxなどのVMで実現した場合よりも圧倒的に速く、頻繁にDBを構築し直さなければならない現場では役に立つかもしれません。
【GAS】GDriveにファイルが追加されたらGmailで添付してメールする（２）

#はじめに
Google謹製の同期ソフトを用いてローカルのフォルダにファイルをコピペしたら自動でメール提出してくれます。
IFTTTでできそうですが、添付ファイル名が変わってしまう問題があります。また、複数のファイルの添付に対応していません。
#GASで作ろう
フォルダ名'boss@example.com'に追加されたファイルをboss@example.comに送ります
GoogleDriveのフォルダIDを入力するのが面倒だったので、フォルダ名をメールアドレスとして取得するようにしてます。
普通にIDで指定した方がいいかもしれません。
またはローカルで操作を完結させるためにフォルダ名からメールアドレスを取得するでも良いかもしれません。

```javascript

function main() {
  
  autoSubmitFiles('boss@example.com', //メールアドレス
                  'files の提出', //題名。filseは添付されるファイル名に置換される
                  'hogeです．\nfiles をメールに添付して提出します．\nよろしくお願いします．'//本文
                 );

}

function autoSubmitFiles(address, subject, Body) {
  var folder = DriveApp.getFoldersByName(address).next(); //フォルダ検索
  var files = iteratorToArr(folder.getFiles()); //ファイルの取得と配列への変換
  
  if (files.length == 0) //ファイルがなければ終了
    return;
  
  MailApp.sendEmail({ //メールの提出
    to: address,
    subject: subject.replace("files", "" + files),
    body: Body.replace("files", "" + files),
    attachments: files
  });
  
  files.map(function(x){ //ファイルの削除
    folder.removeFile(x); 
  })
}

 
function iteratorToArr(files) {
  var arr = [];
  
  while(files.hasNext()) {
    arr.push(files.next());
  }
  
  return arr; 
}
```
#問題点
同期ソフトの同期とGASの実行のタイミングによっては複数のファイルが分割されて送られる可能性があります。
GASは最短１分刻みの実行なのでIFTTTより速度で劣るかもしれません。
フォルダに入れたファイルは削除されます。Gmail上には残ります。
細かな設定のためにはブラウザを開く必要があります。
テキストファイルを使って全部ローカルで完結させることもできますが、そこまですることでもないかと思ってます。
Rails enumの闇 整数値(integer)の代わりにbooleanを設定すると死ぬ

## 何かと便利でよく使われるenum
enumは列挙型と訳され、enumを使えば文字の配列に整数を順番に割り当てることができます。
なので、他のプログラマーに読みやすいコードを書くことができます。(可読性が上がる)
整数値の範囲が決定されるので***誤った数値を使ってしまう***ことを前もって、防げます。
参考：https://www.sejuku.net/blog/26369

基本的な使い方はこちら↓
enumは整数値(0,1,2,3・・・)をにキーワードを割り当てて抽象化することができる
コードの可読性が上がるので、とても便利です

```ruby:hoge.rb
class Hoge < ActiveRecord::Base
  enum department_status: {
    unselected: 0,
    human_resourse: 1,
    development: 2,
    corporate: 3,
    other_department: 99
  }
end

@hoge = Hoge.new(department_status: :development)
@hoge.department_status # => "development"

#設定したKeyがmethodとして使えるようになる
@hoge.corporate? # => false
@hoge.development? # => true
```
だが、enumには***闇***があった...
基本的なenumの使い方としては***整数値を抽象化***することです
しかし、あるソースコードを読んでいるときに***整数値の代わりにboolean***を入れているのを見かけた

```ruby:fuga.rb
class Fuga < ActiveRecord::Base
  enum is_target_country: {
    is_target_japan: true,
    is_not_target_other: false
  }
end

#  is_target_countryカラムの初期値は以下でデフォルトでtrueが入っている
#  is_target_country  :boolean  default(TRUE)

@fuga = Fuga.new
@fuga.is_target_country # => "is_target_japan"
@fuga.is_target_japan? # => true
```

## ここでis_target_countryに***false***を入れようとすると問題が起きる

```ruby
# falseを入れてみる
@fuga.is_target_country = false # => false
#問題なくfalseが返ってくる

#しかし、改めて@fuga.is_target_countryを確認してみると・・・

@fuga.is_target_country # => nil
#nilが入ってしまっている・・・（恐怖!!!)
```
なぜか***falseを入れるとnilに変換***される
おそらく、enumがfalseが入ってきた時はnilに変換している？

さすがにenumにbooleanを設定している人は少ないと思うが、もししている人が入れば注意して欲しい
Pythonでコンピュータを作る#2 -パーセプトロンとは-

大学にいる蟻が大きすぎて怖い大学生の[Motmuu](https://qiita.com/Motmuu)です.
今日はパーセプトロンについて勉強していきます.

#開発環境
以下の環境で勉強していきたいと思います.
`・Python 3.6.5
・Mac OS X 10.13.2
・Atom 1.10.2`

#まず...コンピュータって?
よく聞くコンピュータという言葉ですが,研究者が意味するコンピュータというものと世間がイメージするコンピュータというのは若干のズレがあります.
僕自身も,勉強するまではキーボードがあってYoutubeとか見れるのがコンピュータと思っていましたが,現在のコンピュータに必要なのは以下の3つの役割です

・入力装置
・出力装置
・記憶装置,演算装置,制御装置

少し詳しく説明勉強してみましょう.
###入力装置
入力装置とは,計算機にデータを読み込むための装置を指します.例えば,文字データを入力するキーボードや,画面上のポインタを移動させる位置情報を与えるマウス,画像データを与えるスキャナなどです.これらにより次の記憶装置,演算装置,制御装置に情報を伝達することができます.
###記憶装置,演算装置,制御装置
処理やデータが記憶されている記憶装置から,制御装置によって命令を取り出し,それを演算装置によって処理します.
近年の優れたコンピュータはこれらの役割をマイクロプロセッサが担っています.
また,CPUとその周辺機器から構成される計算機システムをロジックボード(マザーボード)と呼びます
###出力装置
計算機によって処理された結果を表示する装置を指します.例えば,画像データとして表示するディスプレイです.



これらの3つの要素を持つものをコンピュータ(計算機)と呼びます.すなわち電卓も立派なコンピュータです.


#0と1の世界

電卓がコンピュータとわかったところで,「コンピュータは0と1しかわからない。」みたいな話よく聞きませんか?
こんなに色々できるのにそんなことないだろうと思うかもしれませんが,実は0と1しかわかりません.

###0と1??
ここで0と1は何を表しているのでしょう.
答えは電気的に電気が通っていることを1,そうでない状態を0としています.すなわちコンピュータは電気が通っている状態と通っていない状態を区別して様々な処理をしています.

###ほんとに??
とは言っても信じがたいですね.
0と1でなぜコンピュータは色々できるのかはやはりもっと色々なことを勉強しないとわかりません.でも,ここまででなぜ2進数がコンピュータで使われているか理解できました.
この0と1で全てできるということを一回信じて,これからパーセプトロンによる論理回路などを学んでいきましょう！




#パーセプトロンとは
パーセプトロンとはローゼンブラットという研究者によって考案されたアルゴリズムです.[^1](アルゴリズムについて知りたい方は[こちら](https://qiita.com/Motmuu/items/ed28e729b863103db089))
このアルゴリズでは,任意の点(Node)からの重み付きの値(重み付きedge)の和が闘値を超えた場合は出力1の点,超えなかった場合は出力0の点をもつというものです.

これを図と式でわかりやすく示すと以下のようになります！

(図)
<img src="https://qiita-image-store.s3.amazonaws.com/0/258933/2aaf5921-182f-3261-d9f6-c426b36a3b72.jpeg" max-width="500px" height="200px">


(式)
 y = 0 (w1 * x1 + w2 * x2 ≦ θ)
 y = 1 (w1 * x1 + w2 * x2 > θ) 
 w1,w2 : 重み  θ : 闘値

このいたってシンプルなアルゴリムを用いて論理回路を実装することができます.
次回から論理回路の基本となる,ANDゲート・NANDゲート・NORゲートをPythonとパーセプトロンを用いて実装していきます！

続けてこちらも -> [#3 -単純な論理回路-](https://qiita.com/Motmuu/items/1f4de21cd4fdbc9a3836)


[^1斎藤康毅 ゼロから作るDeep Learning p21 オライリージャパン(2018)]:
時間表示のフォーマッティング

VerilogとSystem Verilogでは、現在のシミュレーション時間は\$realtimeで取得できます。これを$display()で表示するにはフォーマット指定子の%tを使用します。

```verilog
`timescale 1ps/1ps
module top();
  initial begin
    #10
    $display("Current time = %t", $realtime);
  end
endmodule
```
ただし、デフォルトでは時間の単位が表示されません。

```plaintext
Current time =                   10
```

これを指定するには\$timeformat()を使用します。
ちなみにUVMで`uvm_info()等のメッセージ表示マクロを使用すると、その時点のシミュレーション時間が表示されますが、これも\$timeformat()の指定に従います。上記の通りVerilogのデフォルトでは時間単位が表示されませんので、UVMでもデフォルトでは表示されません。

#書式

\$timeformatの書式は以下の通りです。

```verilog
$timeformat(units_number, precision_number, suffix_string, minimum_field_witdh);
```
<dl>
<dt>units_number</dt>
<dd>表示される時間の小数点の位置を指定します。現在時間が1秒の場合、0指定で1, -3指定で1000と表示されます。従ってns単位で表示させたい場合-9、ps単位で表示させたい場合は-12を指定します。</dd>
<dt>precision_number</dt>
<dd>小数点以下の表示桁数を指定します</dd>
<dt>suffix_string</dt>
<dd>時間表示の数値の後に表示する時間単位を文字列で指定します。"ms", "us", "ns"等。</dd>
<dt>minimum_field_width</dt>
<dd>表示する文字数の最小幅を指定します。suffix_stringで指定した文字もカウントされます。表示するべき文字数がこの値よりも少ない場合、その分だけ頭にスペースが挿入されます。逆に多い場合、この値を超えて必要な分だけ表示されます。</dd>

#実行例
実際にプログラムとその結果を比較すると分かりやすいと思いますので、以下にサンプルプログラムとその結果を示します。

```verilog
`timescale 1ps/1ps

module top();
  initial begin
  #3000
  $display("=====Test 0: Default format=====");
  $display("Default format: Current time=%t", $realtime);

  // Time unit
  $display("=====Test 1: Time Unit=====");
  $timeformat(-12, 3, " ps", 12);
  $display("Test 1-1 : Current time=%t", $realtime);
  $timeformat(-9, 3, " ns", 12);
  $display("Test 1-2 : Current time=%t", $realtime);
  $timeformat(-6, 3, " us", 12);
  $display("Test 1-3 : Current time=%t", $realtime);
  $timeformat(-3, 3, " ms", 12);
  $display("Test 1-4 : Current time=%t", $realtime);

  // Precesion
  $display("=====Test 2: Precision=====");
  $timeformat(-3, 0, " ms", 12);
  $display("Test 2-1 : Current time=%t", $realtime);
  $timeformat(-3, 3, " ms", 12);
  $display("Test 2-2 : Current time=%t", $realtime);
  $timeformat(-3, 6, " ms", 12);
  $display("Test 2-3 : Current time=%t", $realtime);

  // Field Width
  $display("=====Test 3: Field Width=====");
  $timeformat(-9, 2, " ns", 6);
  $display("Test 3-1 : Current time=%t", $realtime);
  $timeformat(-9, 2, " ns", 7);
  $display("Test 3-2 : Current time=%t", $realtime);
  $timeformat(-9, 2, " ns", 8);
  $display("Test 3-3 : Current time=%t", $realtime);
  $timeformat(-9, 2, " ns", 9);
  $display("Test 3-4 : Current time=%t", $realtime);
  end
endmodule
```

```plaintext
=====Test 0: Default format=====
Default format: Current time=                3000
=====Test 1: Time Unit=====
Test 1-1 : Current time= 3000.000 ps
Test 1-2 : Current time=    3.000 ns
Test 1-3 : Current time=    0.003 us
Test 1-4 : Current time=    0.000 ms
=====Test 2: Precision=====
Test 2-1 : Current time=        0 ms
Test 2-2 : Current time=    0.000 ms
Test 2-3 : Current time= 0.000003 ms
=====Test 3: Field Width=====
Test 3-1 : Current time=3.00 ns
Test 3-2 : Current time=3.00 ns
Test 3-3 : Current time= 3.00 ns
Test 3-4 : Current time=  3.00 ns
```
#LRM

* Verilog (IEEE Std 1364-2005)
 * 17.3.2 \$timeformat
* System verilog (IEEE Std 1800-2017)
 * 20.4.2 \$timeformat
《Nuxt.js》 create-nuxt-app で始めたプロジェクトで https://localhost:3000 で起動する方法。


Nuxt を create-nuxt-app で次のような流れでシンプルに始めたとき、http://localhost:3000 にアクセスして開発を進めることになります。

```terminal.bash

npx create-nuxt-app your-title

cd ./your-title

yarn run dev

```

ただこれだと、たとえば web カメラを起動するための API は、 https 環境でしか動かすことができないので、それに対応できるようローカル環境を整えてやる必要があります。

ちょっとひと手間は必要ですが、簡単に実装することができます＊



## サーバーを起動するためのスクリプト
この話は Nuxt の issue で言及されていて、 [localhost https · Issue #146 · nuxt/nuxt.js · GitHub](https://github.com/nuxt/nuxt.js/issues/146#issuecomment-341893997) にあるコードを拝借しましょう。

仮にプロジェクトルートに作った server というフォルダに index.js を作成してみます。

```server/index.js

const {Nuxt, Builder} = require('nuxt');

const https = require('https');
const fs = require('fs');
const isProd = (process.env.NODE_ENV === 'production');
const port = process.env.PORT || 3000;

const config = require('../nuxt.config.js');
config.dev = !isProd;
const nuxt = new Nuxt(config);

// Build only in dev mode with hot-reloading
if (config.dev) {
  new Builder(nuxt).build()
    .then(listen)
    .catch((error) => {
      console.error(error);
      process.exit(1);
    });
}
else {
  listen();
}

function listen() {

  const options = {
    key: fs.readFileSync('./server/cert.pem'),
    cert: fs.readFileSync('./server/cert.pem'),
  };

  https
    .createServer(options, nuxt.render)
    .listen(port);
  console.log('Server listening on `localhost:' + port + '`.');
}

```


## 自己署名証明書を作成する
https サーバを構築するのに、`https.createServer(options, nuxt.render)` の部分にあるように、署名済み公開鍵と秘密鍵をオプションで渡してやる必要があります。

そこで、署名済み公開鍵と秘密鍵 の両方を含む pem ファイルを作成します。
先ほど作成した server フォルダに移動して、次のコマンドを入力します。

```/.terminal

openssl req -days 365 -new -nodes -newkey rsa:4096 -x509 -keyout cert.pem -out cert.pem

```


## package.json にコマンドをかく
コマンドを実行できるようにするため、次のように package.json に記述します。


``` package.json

"scripts": {
  "devHttps": "node server/index.js",
},

```

あとはコマンドを叩くだけですね。

```/.terminal

yarn run devHttps

```

これで https://localhost:3000 にアクセスすることができるようになりました🍟


### おまけ
次のように `PORT=8000` というように指定してあげると、 https://localhost:8000 というようにポート番号を変更してアクセスできるようになります。


``` package.json

"scripts": {
  "devHttps": "PORT=8000 node server/index.js",
},

```

おわります。
コマンドでDockerコンテナを停止・削除、イメージの削除をする

起動しているすべてのDockerコンテナの停止や削除をするときに使っているコマンドが便利なので紹介したいと思います。
紹介するコマンドは[Docker For Mac](https://www.docker.com/docker-mac)で実行し確認しました。

# TL;DR
- 全コンテナ停止: `docker stop $(docker ps -q)`
- 全コンテナ削除: `docker rm $(docker ps -q -a)`
- 全イメージ削除: `docker rmi $(docker images -q)`

# すべてのコンテナを停止する

```
docker stop $(docker ps -q)
```

`docker stop`に関しては説明不要かと思います。
`$(docker ps -q)`の部分に関してですが、
`docker ps`の`-q`フラグを付けることでコンテナのIDのみを取得します。

例えば、以下のように起動しているコンテナがある場合

```
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e2d41562fb71        ubuntu              "/bin/bash"         39 hours ago        Up 13 seconds                           affectionate_bassi
d886772499bd        ubuntu              "/bin/bash"         45 hours ago        Up 12 seconds                           gallant_curran
96b81bf5c03d        alpine              "/bin/sh"           47 hours ago        Up 11 seconds                           cocky_chebyshev
```

`docker ps -q`を実行すると以下のようにコンテナIDのみ表示されます。

```
e2d41562fb71
d886772499bd
96b81bf5c03d
```

このコンテナIDのみ取得する方法を利用しています。

```
docker stop $(docker ps -q)
```

は以下を実行しているのと同じです。

```
docker stop e2d41562fb71 d886772499bd 96b81bf5c03d
```


# すべてのコンテナを削除する
要領は前項と同じです。

```
docker rm $(docker ps -q -a)
```

`docker ps`では起動しているコンテナのみ表示します。
停止しているコンテナも含めすべてのコンテナを表示するには`-a`フラグを用います。

ただし停止しているコンテナのみを削除するので、全てのコンテナを削除するには前項で紹介した方法を用いてコンテナをすべて停止する必要があります。

# すべてのイメージを削除する

```
docker rmi $(docker images -q)
```
`docker images`でも`ps`コマンドと同じように`-q`フラグを用いることでイメージIDのみ取得することができます。

通常はコンテナが停止していないとDockerのイメージを削除することができませんが、`-f`フラグを用いることでコンテナが削除されていなくてもイメージを削除することができます。

```
docker rmi $(docker images -q) -f
```

ただしコンテナが起動している場合はイメージを削除できませんのでコンテナを停止する必要があります。

```
docker stop $(docker ps -q) && docker rmi $(docker images -q) -f
```

# 最後に
筆者は`.bash_profile`に以下を記述しaliasに登録しています。

```
alias docker-purge='docker stop $(docker ps -q) && docker rmi $(docker images -q) -f'
```

一つ一つコンテナの停止・削除、イメージの削除を行っていたときより非常に捗るようになりました。
本記事が皆様の一助になると幸いです。

最後までお読み頂きありがとうございました。不備や質問はコメント欄またはTwitter[@shisama_](https://twitter.com/shisama_)までお願い致します。
[ メモ ]  PHP laravel5.6 compact関数 配列省略

#phpのcompact関数について（laravel）

compactが出てくる度に検索していたので、メモをしておきます:pencil2:

1. 変数名とその値から配列を作成する
2. controllerからviewへの変数の受け渡し

:thinking: phpでcompactを検索すると１番がよく出てきて、
laravelで検索すると２番が出てきます。
二つとも同じこと処理なのか、まだ理解できていないので
詳しい方が入れば教えて頂きたいです:pray:

- compactとは
配列（array）を短く書くことができる

```ruby:index.php
$sports = array(
 'tennis' => $tennis,
 'basketball' => $basketball,
 'soccer' => $soccer,
);

//同じ意味になる

$sports = compact('tennis','basketball','soccer');
```


今回はlaravelで使用したので、２番の事を書いていきます。
##controllerからviewへの受け渡し

- 変数を１つ受け渡す場合は、compact関数かwithメソッドを
- compactの方使うことが多い

```ruby:ListContoller.php
//compact

public function list()
{

  $list1 = 'tennis';

  return view('list.sport',compact('list1'));

}
```

```ruby:ListContoller.php
//with

public function list()
{

  $list1 = 'tennis';

  return view('list.sport')->with('list1',$list1);

}
```

view側

```
<p>{{ $list1 }}</p>
```
GASでTwitterの投稿とタイムライン取得

メモ書きです。

追記
　2020年3月頃により高速なV8ランタイムの利用が可能になりましたが、どうもここで紹介されているライブラリは動作しないようです。V8ランタイムは任意での利用なため、まだ大丈夫ですが、エラ＝が出る人はランタイム確認してください。


#APIの取得と投稿
こちらを参考にAPIを取得

**[Google Apps Script (GAS) でTwitterへ投稿するだけの機能を実装してみる](https://qiita.com/akkey2475/items/ad190a507b4a7b7dc17c)** [1]

CallbackURLの設定はこちら

**[【Twitter】GASで自分のツイートを定期RT/引用するbotを作った](https://qiita.com/expajp/items/7cc16378ee790f1d404f)** [2]



##メモ
[1]のコードの一部です。

```javascript
function postUpdateStatus() {
  var service  = twitter.getService();
  var response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', {
    method: 'post',
    payload: { status: "投稿される文字\nで改行" }
  });
}
```
'https:~'を変えることで投稿したりタイムライン取得したり色々できるようです。ここでは投稿するAPIを使っているようです。
APIの詳しい仕様は公式ページにあります。

**[API reference index](https://developer.twitter.com/en/docs/api-reference-index.html
)** [3]

#タイムラインの取得

```javascript

function getTimeLine() {
  var service  = twitter.getService();
  var json = service.fetch("https://api.twitter.com/1.1/statuses/home_timeline.json");
  var array = JSON.parse(json);
  
  var tweets = array.map(function(tweet){
    return tweet.text;
  });
                          
  Logger.log(tweets);
  return tweets;
}
```
これ以外のところは[1]のものと同様です。
[3]に書かれてあることを参考にタイムラインを取得して各ツイートの文字列を配列にするものです。
APIからJSONが帰ってくるのでパースします。
全体は配列で１ツイートずつ格納されてます。
１ツイートの中身はオブジェクトで色々詰まってます。
今回は文字列のみ取得しています。

##その他
GAS公式サイト。全部書かれてある。当たり前か・・・

**[Google Apps Script](https://developers.google.com/apps-script/reference/)** [4]
Rubyでうっかり行末に;をつけたままgit commitしたくない

Rubyを書いているのに行末にセミコロンを打ってしまうことが時々あります。
JavaScriptとかJavaとかC言語とか、セミコロンを書かないといけない(or 書いたほうが良い)言語を書いたあとにRubyに戻ってくると特に顕著に発生します。

そういうことがあるたびに、「あ、Rubyってセミコロン要らないんだ」　と初学者の頃の新鮮な気持ちに立ち帰る事が出来るわけですが、うっかり気づかすにリポジトリにpushしてしまいレビューアーに「``;`` m9(^Д^)」というコメントを付けられるのは業腹です。(実際は優しく指摘されます)

そこで、Gitフックを使ってRubyコードの行末に ``;`` があったらcommitできなくしてみました。

# 前提

- 毎回RuboCopを回したいわけではない。
- addしたファイルの変更行だけをチェックしたい。

# やってみた

リポジトリの ``.git/hooks/pre-commit`` に以下を書きます。忘れずに実行権限もつけておきましょう。

```Ruby
#!/usr/bin/env ruby

def check_ruby_file(adds)
  adds.select {|add|
    /;\z/.match? add
  }.instance_eval {
    any? ? "Find ';' in Ruby file's line end." : 'ok'
  }
end

def check_adds(filename, adds)
  results = []

  results << check_ruby_file(adds) if /\.rb\z/.match? filename

  results.all? {|result| result == 'ok' } ? 'ok' : results.join("\n")
end

changed_files = `git diff --cached --name-only HEAD`
exit_code = changed_files.split(/\R/).map {|filename|
    [filename, `git diff --cached -U0 HEAD -- "#{filename}"`]
  }.map {|(filename, diffs)|
    [
      filename,
      diffs.split(/\R/).select {|diff| /\A\+[^\+]/.match?(diff) }
    ]
  }.reject {|(_, adds)|
    adds.empty?
  }.map {|(filename, adds)|
    [filename, adds, check_adds(filename, adds)]
  }.reject {|(_, _, result)|
    result == 'ok'
  }.tap {|elements|
    puts 'Invalid adds detected.'
    elements.each do |(filename, adds, result)|
      puts filename
      puts "  \e[31m#{adds.join("\n  ")}\e[0m"
      puts "    #{result}"
    end
  }.any? ? 1 : 0

exit exit_code
```

<img width="516" alt="スクリーンショット 2018-05-24 14.09.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/115234/cfc7c901-76c4-24e7-de07-6adde3af005a.png">

なかなか雑なコードですが、これでも実用上困らない程度には動いています。
行末セミコロン以外もチェックしたければcheck_ruby_fileメソッドを変更、.rbファイル以外も見たければcheck_addsメソッドを変更すれば拡張できます。

正規表現で引っ掛けているだけなので、コメント行の末尾にセミコロンがあったり、ヒアドキュメントの中にJavaScriptのコードがあったりすると誤検出します。が、うっかりcommit -> pushしてしまうのを事前に防ぎたいだけですので、内容を見て問題なければ　``--no-verify`` オプションをつけてcommitしてしまっています。

# まとめ

今回はGitフックを書いてみる練習を兼ねて作成してみました。
複雑なチェックをしたければRuboCopなどLintツールを使うべきでしょうが、簡単なチェックくらいは手慣れた言語で簡単に作成できます。
Request Specでテストを書くときはStrong Parametersを通る前のパラメーターも意識しましょう

Ruby on Railsを使い始めて2ヶ月の初心者がControllerのテストシナリオを書いたときにハマった悲しい事象の共有。

# 前提条件

+ RailsはJSONを吐くWebAPI
+ rails (5.1.6)
+ rspec-core (3.7.1)
+ factory_bot_rails (4.8.3)

# テスト対象のController
よくあるControllerです。サンプルで `:create` と `:update` の2つだけ。本来は `:index` `:show` `:destroy` もあります。

```ruby
class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      render json: @user
    else
      render json: {}
    end
  end

  def update
    @user = User.find_by(params[:id])
    if @user
      if @user.update(user_params)
        render json: @user
      else
        render json: {}
      end
    else
      render json: {}
    end
  end

  private
  
  def user_params
    params.require(:users).permit(:name, :age)
  end
end
```

# 作ってあるroutes.rb
シンプルに。

```ruby
Rails.application.routes.draw do

  resources :users

end
```

`rails routes` した結果も一応

```bash
Prefix Verb   URI Pattern          Controller#Action
# 略
       POST   /users(.:format)     users#create
       PATCH  /users/:id(.:format) users#update
# 略
```

# 書いたテストコード

```ruby
require 'rails_helper'

describe UsersController, type: :controller do

  # rails_helper内で
  # config.include FactoryBot::Syntax::Methods
  # を設定している前提
  let(:user) { create(:user) }
  
  describe 'Post #create' do
    let(:param) do
      {
        users: {
          name: 'Alice',
          age: 21
        }
      }
    end
    
    context 'when send correct parameters' do
      let(:http_response) do
        post :create, params: param
      end

      it 'responds status "200 OK"' do
        expect(http_response.status).to eq 200  # test OK
      end
    end
  end
  
  describe 'Patch #update' do
    let(:param) do
      {
        users: {
          id: users.id
          name: 'Bob',
          age: 30
        }
      }
    end

    context 'when send correct parameters' do
      it 'responds status "200 OK"' do
        expect(http_response.status).to eq 200  # test NG
      end
    end
  end
end
```

んでテストNG時に表示されるエラーメッセージがこれ

```
ActionController::UrlGenerationError:
       No route matches {:action=>"update", :controller=>"users", :users=>{:id=>2, :name=>"Bob", :age=>30}}
```

ルーティングがうまくできていない模様。
updateに必要なパラメーターはIDだけだし、ちゃんと渡してるのに…

# 解決策
上の状態だとルーティングが必要としているパラメーターが渡せていません。
URI Patternの `:id` とは、**Strong Parametersを通る前**のパラメーターです。

```ruby
  # 略
  describe 'Patch #update' do
    let(:param) do
      {
        id: users.id,  # これを追加
        users: {
        #  id: users.id  # これは削除
          name: 'Bob',
          age: 30
        }
      }
    end
  # 略
```

わかってしまえば簡単なのに、これで半日融かしました。
正確にやるなら、nameやageもidと同じくusersの外にも指定してあげるといいと思います。


ご自愛ください。
Web3.js を使って ERC20 トークンを送信

* この記事のサンプルで使用している Web3.js のバージョンは `0.20.6` です。

# スマートコントラクトを扱うための ABI を用意
* ABI は、スマートコントラクトがどのような関数や状態変数を持っているかといった情報をもったインタフェースです。
* プログラムからスマートコントラクトを扱う際は、このABIの情報に基づいて関数を読んだり状態変数の値を読みます。
* 通常、ABI にはあるスマートコントラクトが持っているすべての関数や状態変数の情報が記載されますが、ERC20 トークンを送信するには、transfer という関数を実行できればいいので、この記事では transfer のみを ABI に記載します。

# transfer 関数の情報のみ持つ ABI
```js
let minABI = [
	// transfer
	{
		"constant": false,
		"inputs": [
			{
				"name": "_to",
				"type": "address"
			},
			{
				"name": "_value",
				"type": "uint256"
			}
		],
		"name": "transfer",
		"outputs": [
			{
				"name": "",
				"type": "bool"
			}
		],
		"type": "function"
	}
];
```

# サンプルコード
* decimals が 18 の ERC20 トークンを 100 送る例です。
* この例では、ERC20 トークンのアドレスは `0x2A65D41dbC6E8925bD9253abfAdaFab98eA53E34` です。
* この例では、送り先アドレスは `0x8Df70546681657D6FFE227aB51662e5b6e831B7A` です。

```js
let tokenAddress = "0x2A65D41dbC6E8925bD9253abfAdaFab98eA53E34";
let toAddress = "0x8Df70546681657D6FFE227aB51662e5b6e831B7A";

// 数値は巨大な数値になっても扱えるように BigNumber に変換
let decimals = web3.toBigNumber(18);
let amount = web3.toBigNumber(100);

let minABI = [
  // transfer
  {
    "constant": false,
    "inputs": [
      {
        "name": "_to",
        "type": "address"
      },
      {
        "name": "_value",
        "type": "uint256"
      }
    ],
    "name": "transfer",
    "outputs": [
      {
        "name": "",
        "type": "bool"
      }
    ],
    "type": "function"
  }
];

//  ABI とコントラクト（ERC20トークン）のアドレスから、コントラクトのインスタンスを取得 
let contract = web3.eth.contract(minABI).at(tokenAddress);

// 送付する ERC20 トークンの量を計算
let value = amount.times(web3.toBigNumber(10).pow(decimals));

// 引数にウォレットのアドレスと送付する ERC20 のトークン量を渡して、transfer 関数を呼ぶ
contract.transfer(toAddress, value, (error, txHash) => {
  // トランザクションを実行するので、戻り値はトランザクションハッシュ   
  console.log(txHash);
});
```

# 実際におくったトランザクション
* [https://etherscan.io/tx/0x8e5096bf6f7470729afe8675375266b7248d4d44784967c5d4c6dcc349d402ec](https://etherscan.io/tx/0x8e5096bf6f7470729afe8675375266b7248d4d44784967c5d4c6dcc349d402ec)

# 関連
* [http://blog.playground.io/entry/2018/05/21/102310](http://blog.playground.io/entry/2018/05/21/102310)

# デモ
* [https://piyolab.github.io/playground/ethereum/sendERC20Token/](https://piyolab.github.io/playground/ethereum/sendERC20Token/)

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Web3.js_を使って_ERC20_トークンを送信
API から Slack のスラッシュコマンドを送信する闇の方法

この記事では bot 等 API からスラッシュコマンドを使って Simple Poll の投票を作成する_怪しげな_方法を説明します。

# スラッシュコマンド
```
/invite @halhorn 
```
等と Slack に投稿すると Slack 謹製やサードパーティ製のアプリ等を実行できる便利な機能です。

しかし残念ながら bot の API から実行すると、コマンドとして認識されません。ただの文字列として評価されてしまいます。

```py
# python のサンプル
from slackclient import SlackClient

slack_token = os.environ["SLACK_API_TOKEN"]
sc = SlackClient(slack_token)

sc.api_call(
  "chat.postMessage",
  channel="C0XXXXXX",
  text='/poll "インコ" "すき" "きらい"',
)
# bot が `/poll "インコ" "すき" "きらい"` という文字をつぶやくだけで何も起こらない
```

# API からスラッシュコマンドを送る
2点変更を行います。

- chat.command というドキュメントに無い API エンドポイントを叩く
- API トークンをレガシーな形式のものを使う
    - https://api.slack.com/custom-integrations/legacy-tokens
    - ↑で作れます

```py
# python のサンプル
from slackclient import SlackClient

slack_token = os.environ["LEGACY_SLACK_API_TOKEN"]
sc = SlackClient(slack_token)

sc.api_call(
  "chat.command",
  channel="C0XXXXXX",
  text='/poll "インコ" "すき" "きらい"',
)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61079/cd5e793e-ef4e-8cca-aa67-70ce6f6ebe11.png)
レガシーな API トークンはユーザーに紐付いているので、あたかもユーザーが自身で発言したように見えてしまいますが、とりあえず bot を使って自動で投票を作成することができます。

見ての通り、非公式のエンドポイントは叩くわレガシーで危なげなトークンは使うわの闇の方法なので、使うのは自己責任でお願いします。

参照： https://stackoverflow.com/questions/40919745/how-do-you-invoke-the-poll-command-using-the-slack-api

### 余談
レガシーなトークンではなく普通のトークンで chat.command を叩くと `{'error': 'user_is_bot', 'headers': {'V...` みたいなレスポンスが返ってきます。
Slack としては bot がコマンドを叩くのを推奨していない気持ちが伝わってきます。
一度のビルドで複数のシミュレータにインストール＆起動するCLIツール作った


業務で作ってるアプリの長いビルド中にTwitterをチラ見していたらとあるツイートが目に入りました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">1buildで指定のSimulator全部にappを突っ込む方法欲しい…修正されているかの画面確認でbuildして確認してsimlator変えてbuildして…ってつらい</p>&mdash; ありぜ (@a_aryzae) <a href="https://twitter.com/a_aryzae/status/999542397573840896?ref_src=twsrc%5Etfw">2018年5月24日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

[Bluepill](https://github.com/linkedin/bluepill)などを使えば複数シミュレータを起動しながらUIテストが出来るらしいですが、確かに普通にビルドして、複数シミュレータにインストールするだけがしたいという要望もありそうだなと思いました。
[fbsimctl](https://github.com/facebook/FBSimulatorControl/blob/master/fbsimctl/README.md)でも良いかもしれないけど、Xcodeが複数シミュレータ起動に対応してから僕は使わなくてなりました。
とはいえ、複数シミュレータを起動して確認のはなかなか面倒な作業なので僕は下記の様な感じのシェルスクリプトを組んで実行していました。

```bash
#!/bin/sh

path=~/Library/Developer/Xcode/DerivedData/MyProject-dldoglzedhzxknefqrrzqxdnugcb/Build/Products/Debug-iphonesimulator/MyProject.app
bundleIdentifier=me.fromkk.MyProject
devices=(91E81004-7BE9-4E84-9976-F721E649D2E5 A68CEEAA-3D2A-4ADA-A9A0-6CCAC8E80983 3FEF14D2-4BB4-4759-AB28-A62B97B96140 44EE068E-D87A-4C65-96E4-2199E3C7A9AA)

open -a "Simulator.app"

function bootIfNotBooted() {
	device=$1
	numberOfBooted=`xcrun simctl list | grep $device | grep Booted | wc -l`
	if [ $numberOfBooted = 0 ]; then
		xcrun simctl boot $device
	fi
}

for device in ${devices[@]}; do
	bootIfNotBooted $device
	xcrun simctl install $device $path
	xcrun simctl launch $device $bundleIdentifier
done
```

個人的にはこれで十分だったんですが、インストールされているシミュレータも人によって違うしUDIDも変わるのでこのままでは他人には共有出来ないですよね。
今回これを解決する為のツールを作成してみました。

# 作成したCLIツール

[https://github.com/fromkk/Simulators](https://github.com/fromkk/Simulators)

## インストール方法

インストールはREADME.mdにも記載していますが、下記の通りです。

```bash
git clone https://github.com/fromkk/Simulators.git
cd ./Simulators
make install
```

## 使い方

```bash
simulators [--project <project>] | [--workspace <workspace>] --scheme <scheme> --bundleIdentifier <bundleIdentifier> --beforeClean <beforeClean> --devices <devices> --osVersion <osVersion>
```

オプションはこんな感じです。

項目 | 説明
----|----
--project | XXX.xcodeprojのパスを設定
--workspace | XXX.xcworkspaceのパスを設定
--scheme | schemeを設定
--bundleIdentifier | bundleIdentifierを設定
--beforeClean | ビルドする前にcleanするかどうか [true,false]
--devices | 端末名を設定 [iPhone SE,iPhone 7,iPhone 7 Plus,iPhone X,etc...]
--osVersion | OSバージョンを設定[10.3,11.3,etc...]


実行すると下記の様にアプリがインストールされた状態で複数のシミュレータが起動します。

![Screen Shot 2018-05-24 at 21.10.59.png](https://qiita-image-store.s3.amazonaws.com/0/2846/3db5d46f-4c92-c6ca-863f-0f52d0f0d912.png)


# まとめ

前から同じ様に不便を感じていた部分が他人も困ってるんだなと思った事でCLIツールを作成する後押しをしてくれました。
同じ様な事で困ってる人がいましたら是非使ってみて下さい。
ツイートを見てから3時間程度で作った荒削りなツールなので色々バグなどあるかもしれませんが、見つけたらIssueやPR待ってます。
もし、気に入って頂けましたらいいねやスター🌟を頂けると嬉しいです。
Rubyで言語処理100本ノック 第1章:準備運動 (03 ~ 05)

引き続き、Rubyで[言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100)にチャレンジしたいと思います。

# 03. 円周率
> "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
という文を単語に分解し，各単語の（アルファベットの）文字数を先頭から出現順に並べたリストを作成せよ．

``` ruby
word = "Now I need a drink, alcoholic of course, 
        after the heavy lectures involving quantum mechanics."

puts word.split(/\W+/).map(&:size)
```

``` ruby:結果
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
```

答えが円周率に...!

**正規表現 : \W**
単語構成文字 [a-zA-Z_0-9] 以外の文字

# 04. 元素記号
>"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
という文を単語に分解し，1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字，それ以外の単語は先頭に2文字を取り出し，
取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．

``` ruby
word = "Hi He Lied Because Boron Could Not 
        Oxidize Fluorine. New Nations Might Also 
        Sign Peace Security Clause. Arthur King Can."

array = [1,5,6,7,8,9,15,16,19]
hash = {}

word.split(/\W+/).each.with_index(1) do |str, i|
  key = array.include?(i) ? str.slice(0) : str.slice(0..1)

  hash[key] = i
end

puts hash
```

``` ruby:結果
{"H"  => 1,  "He" => 2,  "Li" => 3,  "Be" => 4,  "B"  => 5, 
 "C"  => 6,  "N"  => 7,  "O"  => 8,  "F"  => 9,  "Ne" => 10, 
 "Na" => 11, "Mi" => 12, "Al" => 13, "Si" => 14, "P"  => 15, 
 "S"  => 16, "Cl" => 17, "Ar" => 18, "K"  => 19, "Ca" => 20}
```

# 05. n-gram
>与えられたシーケンス（文字列やリストなど）からn-gramを作る関数を作成せよ．
 この関数を用い，"I am an NLPer"という文から単語bi-gram，文字bi-gramを得よ．

``` ruby
class Array
  def n_gram(n)
    self.each_cons(n).map(&:join)
  end
end

word = "I am an NLPer"

# 単語bi-gram
puts word.split(/\W+/).n_gram(2)
# 文字bi-gram
puts word.chars.n_gram(2)
```

``` ruby:結果
# 単語bi-gram
["Iam", "aman", "anNLPer"]
# 文字bi-gram
["I ", " a", "am", "m ", " a", "an", "n ", " N", "NL", "LP", "Pe", "er"]

```

問題文の理解に苦戦しました。。
次回で第1章:準備運動の完結編にしたいと思います。

こちらは[前回までの挑戦](https://qiita.com/mamem/items/6d5f8d18cb6b08fc8286)です。
flutter 国際化 dartファイルジェネレート時にエラー

```
flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/l10n --no-use-deferred-loading lib/l10n/app-localizations.dart lib/l10n/intl_*.arb
```

で`message_messages.dart`ファイルの生成時に以下のエラーに遭遇した。

```
Unhandled exception:
Invalid argument(s)
#0      List.[] (dart:core-patch/dart:core/growable_array.dart:141)
#1      VariableSubstitution.variableName (package:intl_translation/src/intl_message.dart:411:56)
#2      VariableSubstitution.toCode (package:intl_translation/src/intl_message.dart:416:21)
#3      CompositeMessage.toCode.<anonymous closure> (package:intl_translation/src/intl_message.dart:352:41)
#4      MappedListIterable.elementAt (dart:_internal/iterable.dart:414)
#5      ListIterable.join (dart:_internal/iterable.dart:165)
#6      CompositeMessage.toCode (package:intl_translation/src/intl_message.dart:352:51)
#7      MainMessage.addTranslation (package:intl_translation/src/intl_message.dart:513:39)
#8      MessageGeneration.generateIndividualMessageFile (package:intl_translation/generate_localized.dart:81:18)
#9      generateLocaleFile (file:///Users/takashi/dev/flutter/.pub-cache/hosted/pub.dartlang.org/intl_translation-0.16.7/bin/generate_from_arb.dart:145:14)
#10     main (file:///Users/takashi/dev/flutter/.pub-cache/hosted/pub.dartlang.org/intl_translation-0.16.7/bin/generate_from_arb.dart:108:5)
#11     _startIsolate.<anonymous closure> (dart:isolate-patch/dart:isolate/isolate_patch.dart:277)
#12     _RawReceivePortImpl._handleMessage (dart:isolate-patch/dart:isolate/isolate_patch.dart:165)
pub finished with exit code 255

```

原因は次のように翻訳対象のコンテンツに`{}`が含まれていたことだった。いやーハマった

```dart
  String get hoge {
    return Intl.message(
      "Hello, {{name}}",
      name: "hoge",
      desc: 'hoge',
    );
  }
```