OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】Nreal Lightの環境構築

Unityを使ったNreal Lightの開発環境を簡単に構築できたので，その手順をまとめました．今回は実機でunityちゃんを眺められるようにしました．
![IMG_2882.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263889/f7f2ff8f-7308-fa47-da49-59f0a3236021.jpeg)
なお，以下では5G対応のスマートフォンをコンピューティングユニット兼コントローラーとして使っていますが，6DoFのコンピューティングユニットを使った場合でも同じ手順でできると思います．

また，以下の手順はNreal社の[ディベロッパーサイト](https://developer.nreal.ai/develop/discover/introduction-nrsdk)にも掲載されているので，ここを見れば進められると思います．

# 1. 開発環境
macOS Mojave 10.14.6
unity 2019.1.2f1

nreal本体については以下の記事が参考になりました．
[Nreal Light DevKit の使い方（基本操作編）](https://qiita.com/mhama/items/a79834c39606d1c40ee3)

# 2. 事前の準備
- **Unity 2018.2.X以降**のバージョンをインストールする
- **Android Build Support**を追加する
- **NRSDK for Unity**をダウンロードする．[ここ](https://developer.nreal.ai/download)からダウンロードできる．
- Android SDK 8.0 (**API Level 26**)以降をインストールする．インストールしていない場合はAndroid StudioのSDK Managerからダウンロードする．


# 3. プロジェクトの作成と設定
unityで新しいプロジェクトを作成して，ダウンロードしたSDKをインポートします．

開発の際にはプラットフォームをAndroidに変更します．
<img width="608" alt="スクリーンショット 2020-02-18 11.02.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263889/e6ad3e23-94a1-7e79-a8ff-872eaf04be5d.png">


次に，`Player Settings`の項目をディベロッパーサイトに表記されている通りに，以下の項目を設定します．以下の図は[ここ](https://developer.nreal.ai/develop/unity/android-quickstart)から引用しています．

| Setting | Value |
|:--|:--|
| Player Settings > Resolution and Presentation > Default Orientation | Portrait |
| Player Settings > Other Settings > Auto Graphics API | false |
| Player Settings > Other Settings > Graphics APIs | OpenGLES3 |
| Player Settings > Other Settings > Package Name | Create a unique app ID using a Java package name format. For example, use com.nreal.helloMR |
| Player Settings > Other Settings > Minimum API Level | Android 8.0 or higher |
| Player Settings > Other Settings > Target API Level | Android 8.0 or higher |
| Player Settings > Other Settings > Write Permission | External(SDCard) |
| Player Settings > Other Settings > Allow 'unsafe' code | true |
| Project Settings > Quality > V Sync Count | Don't Sync |

# 5. シーンの作成
1. unityでシーンを作成します
2. `NRSDK/Prefabs`の中にある`NRCameraRig`をシーンに追加します
3. 元々あったカメラは削除します
3. アセットストアからunityちゃんをインポートします
4. シーンにunityちゃんのモデルを追加します．`position`は以下のように設定．
<img width="394" alt="スクリーンショット 2020-02-18 11.26.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263889/bbdb195f-301e-3608-7ae2-6d56a19a0c2f.png">

<img width="258" alt="スクリーンショット 2020-02-18 11.31.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263889/a4d1e00a-b374-8e06-bde8-0bbcc761c031.png">


ここまででゲームビューには以下のように表示されているかと思います．

<img width="604" alt="gameview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263889/8725066b-9b93-0387-4de1-da42d176b971.png">

# 6. ビルドして実機にインストール

通常Build and Runではうまくいかなかったので，ビルドしたものをadbで実機にインストールします（adbの詳細は[こちら](https://developer.android.com/studio/command-line/adb)）．

```terminal
$ adb install <BuildScene>
```
無事にインストールが完了すると，実機のほうにシーンが追加されているので実行します．さすがnreal lightは他のARグラスに比べて輝度が抜群に高いので，unityちゃんも綺麗に映ります．
![](https://i.imgur.com/xlZbiT9.jpg)
Dash 5でFlutterのドキュメントを表示する

MacのドキュメントビューワーであるDash 5でFlutterのドキュメントを検索・表示できるようにする方法です。
（もっと簡単な方法があればコメントで教えてください。）

## 事前準備

1. Homebrew
2. Flutterのリポジトリがローカルに存在する（Flutterをインストールしてある）

## 作業手順

以下のコマンドを実行するとdocsetが作成されます。

```
$ brew install dashing
$ cd flutter
$ dev/bots/docs.sh
$ cd dev/docs
$ dashing build --source ./doc --config dashing.json
```

作成されたdocsetはflutter/dev/docs/flutter.docsetに存在するので、Dashの設定画面のDocsets画面で+をクリックしてAdd Local Docestを選択して追加します。

これでDashでFlutterのドキュメントが検索できるようになりました。
pyminizipの日本語パスについて

# pyminizipって？
ファイルのzip圧縮をpythonで出来ますよってやつ。
pythonの標準ライブラリで```zipfile```ってのもあるけど、こっちはzipにパスワードがかけれない。
今回はパスワードをかけたかったので```pyminizip```を使ってみた。

# 私の環境
windows10(Pro)です。
pythonは```Python 3.7.1```です．あんま関係ないかもだけど。
この記事は僕みたいなMicrosoft社の甘い蜜を吸い続けているWindowsユーザ向けです。
UNIX民は自力で何とかするよね！

# インストール
以下のコマンドを打つだけ

```
pip install pyminizip
```

# どうやって使うの
こんな感じで書いたらオッケー

```python:test_zip.py
import pyminizip

pyminizip.compress(
    'ソースファイル名',
    'ソースファイルプレフィックス',
    '出力ファイル名.zip',
    'パスワード',
    int(0)               #圧縮率：0～9 (0は無圧縮)
)
```
第1引数：zip圧縮したいファイル名
第2引数：zip圧縮後，ファイルを置きたいディレクトリ
第3引数：出力ファイル名
第4引数：パスワード
第5引数：圧縮率．0～9を指定できる．0は無圧縮

例えば、```pyminizip.compress('src/src.txt', 'dir', 'output.zip', 'password', int(0))```という風に実行すると、実行した場所に```dir/src.txt```を内部に持つzipファイルが```output.zip```というファイル名で出力される。

# 本題
日本人ならソースファイル名とか出力ファイル名とか、日本語で出力したいときありますよね？
でも、```pyminizip```は普通に文字列を投げただけじゃエラーが出ます。エラーは以下のように出てきます。

```
Traceback (most recent call last):
  File "test_zip.py", line 28, in <module>
    test1()
  File "test_zip.py", line 16, in test1
    int(0)
OSError: error in opening output/テスト.txt for reading
```

で、どうすれば良いかというと、次のようにしてあげます。

```python:test_zip.py
import pyminizip

pyminzip.compress(
    'ソースファイル名'.encode('cp932'),
    'ソースファイルプレフィックス'.encode('cp932'),
    '出力ファイル名.zip'.encode('cp932'),
    'パスワード'.encode('cp932'),
    int(0)               #圧縮率：0～9 (0は無圧縮)
)
```

文字コードを```cp932```にしてあげると通ります。
Windowsが```cp932```を使っているのが理由でしょうね。

# まとめ
パスワード付きのzipファイルを作りたいけど、標準ライブラリの```zipfile```じゃできないから、```pyminizip```使おうとしたけど、日本語ファイルでエラー出るじゃんってときの解決方法でした。
誰かの役に立てば良し。
思い返して見るのも良し。

# 参考
[pyminizip](https://pypi.org/project/pyminizip/)：公式のやつ
AWS CLI v2をDockerでお手軽に試してみる

AWS CLI v2がGAになってますね。
https://aws.amazon.com/jp/blogs/news/aws-cli-v2-is-now-generally-available/


とはいえ手元の環境を変更するのが怖い、という人はDockerでさくっと試してみましょう。

```Dockerfile
FROM amazonlinux

RUN yum install -y curl unzip jq less

RUN curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN ./aws/install


RUN bash -c 'echo complete -C '/usr/bin/aws_completer' aws  >> $HOME/.bashrc'
ENV PS1="awscliv2> "

WORKDIR /root
```

あとはDocker Buildして、実行するだけです。

```
docker build . -t awscliv2
docker run -v $HOME/.aws:/root/.aws -it --rm --name awscliv2 awscliv2
```

CloudWatch Logでtailができるのは、Lambda使いとしてはとても嬉しい。
https://dev.classmethod.jp/cloud/aws/tail-cloudwatch-logs-group/


と、ここまで書いて、amazonlinuxには最初からv2入っているかも？と思いましたが、気がつかなかったことにします。

### 謝辞
この記事を参考にさせていただきました。
https://qiita.com/icck/items/40545486a342179a5bd3
コマンドプロンプトでjava -versionしてもJAVA_HOMEに設定したJDKが出てこない問題

## 前提条件

##### PC環境

- Winsows10
- Java6(x64)

## コマンドプロンプトでjava -versionしてもJAVA_HOMEのJDKが出てこない


タイトルの通りなので以下解決方法。

下記コマンドを実行して

```
C:\Users\test>set JAVA_HOME
C:\Users\test>where java
```

以下のように表示されたら`Java 6 Update 45`などの名前のファイルがインストールされているのでアンインストールする。

```
C:\Users\test>set JAVA_HOME
JAVA_HOME=C:\Program Files\Java\jdk1.7.0_21

C:\Users\test>where java
C:\Windows\System32\java.exe
C:\Program Files\Java\jdk1.7.0_21\bin\java.exe
```

PCを再起動して以下のコマンドを実行すると`C:\Windows\System32\java.exe`が削除されているはず。

```
C:\Users\test>where java
C:\Program Files\Java\jdk1.7.0_21\bin\java.exe
```

これで`java -version`を実行するとJAVA_HOMEに設定したJDKが正しく読み込まれるようになる。

```
C:\Users\test>java -version
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)
```

## 補足

一度、環境構築してから言語のバージョンアップのようなメジャーアップデートでもしない限り
基本的にJDKをアップデートすることはないと思われるので、アップデータはインストールしておく必要はない。

※セキュリティ的に問題はあるのでできれば最新のJDKで開発した方がいい

- [Java 6 の公式アップデート終了](https://www.oracle.com/technetwork/jp/java/eol-135779-ja.html)
- [2013年4月 Oracle Java SE のクリティカルパッチアップデート (定例) に関する注意喚起 (JPCERT/CC)](https://www.jpcert.or.jp/at/2013/at130021.html)
Vuetifyのv-comboboxで自由に入力された文字列を取得したい

v-comboboxを使うということは自由入力させたいということなのに、自由入力した文字をうまく取得できない！
なぜか微妙にハマったのでメモっておきます。

例のとおりリスト要素から選択された際は`selecteditem`にオブジェクトがバインドされるまではいいが、では自由に入力された値は？
オフィシャルのドキュメントをよく読むと、、valueプロパティは The input's value、つまり入力された値は`value`プロパティに入る、と記載されております。そこでselecteditemのハンドリングとも併せて検証してみました。

結果、`:value="inputedvalue"`のバインドだと入力された値は取得できず、 `ref="comb"`で$refs経由の取得がうまくいきました。


```vue

<v-combobox
    v-model="selecteditem"
    :items="items"
    item-text="name" item-value="id" return-object
    ref="comb" :value="inputedvalue">
</v-combobox>
```

```js


selecteditem: null,
items : [
    { id:"001", name:"牛丼" },
    { id:"002", name:"ピザ" },
    { id:"003", name:"ラーメン" },
]
```

```vue

<script>
var val = "";

// バインド経由では取れない
val = this.inputedvalue; 

// $refs経由でプロパティ直見すると取れる
val = this.$refs.comb.value;

// itemsの中の選択肢から選ぶ判定はv-modelがobjectになってることを確認すればよい
if(this.selecteditem && this.selecteditem.id) {
    val = this.selecteditem.id + " / " + this.selecteditem.name;
}

alert(val);
</script>
```
JavaScriptで日付の判定をする

## 実装

```javascript
const hoge = new Date('aaa')
if(hoge.toString() === "Invalid Date"){
    console.log("日付エラー")
}
```

### 補足

`new Date(1) ※1970/1/1扱い`とか、`new Date('2020/2/30') ※3/1扱い（2020年はうるう年）`が許容されてしまうので微妙かも、、というかこれ単体だと微妙。。
少なくとも正規表現で日付のフォーマットになっているかくらいは別で見た方が良いですね。。
【docker】ERROR:OCI runtime create failedが出る。

###状況

```Dockerfile:Dockerfile
FROM php:7.3-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
  && apt-get install -y zlib1g-dev libzip-dev mariadb-client \
  && docker-php-ext-install zip pdo_mysql

#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

RUN composer global require "laravel/installer"
```
php:7.3-fpmのDockerfile下のように書き、`docker-compose up -d --build`すると、次のようなエラーが出る。

```
ERROR: for php-fpm  Cannot start service php-fpm: OCI runtime create failed: container_linux.go:344: starting container process caused "chdir to cwd (\"/var/www/html\") set in config.json failed: permission denied": unknown
ERROR: Encountered errors while bringing up the project.
```


`chdir to cwd (\"/var/www/html\")`などを見るとphp-fpmの作業ディレクトリの問題だろうと思いDockerfileを修正する。

```Dockerfile:Dockerfile
WORKDIR /var/www 
```
今回はアプリを`/var/www`に置いているので、そこを作業ディレクトリに指定してみる。
再び`docker-compose up -d`してみると無事コンテナが起動する。

###原因
単純にDockerfileに作業ディレクトリの指定がなく、`/var/www/html`となっていたこと。
なぜ`/var/www/html`となっていたかはわからない。デフォルトではそうなるのだろうか。
【cakephp】setについて

#Set互換のパス記法

- {n}	数値添字の表現
- {s}	文字列添字の表現
- Foo	任意の文字列（括弧囲み無し） これは文字列リテラルなどとして扱われます。
- {[a-z]+}	括弧で囲まれた任意の文字列({n}と{s}を除く) は正規表現と解釈されます。

#set::combine

```php
$users = $this->User->find( 'all' );
$list = Set::combine( $users, '{n}.User.id', '{n}.User.name' );
```

$usersは

```php

array(
	[{0}.user.id] => [{0}.user.name]
	[{1}.user.id] => [{1}.user.name]
	[{2}.user.id] => [{2}.user.name]
)
```
findで探し出したものをuser.idとuser.nameで連想配列を作る。

#$this->set
- 使い方

```php

this->set('変数名', 値);
```
contorollerの変数はそのままではviewで使うことができないので一度

```php

$item = 'apple';
$this->set('fruits', $item);
```

のようにsetに入れることでviewに変数を渡すことができるようになる

```php

$this->set(compact("name", "address", "tel"));
```

このようにまとめることもできる。
viewでは

```
$name $address $tel
```

 のように$をつけるだけで使える。

http://www.t-webu.net/cakephp/cakephp%E3%81%AEsetcombine%E3%81%8C%E4%BE%BF%E5%88%A9%E3%81%AA%E4%BB%B6.html

https://book.cakephp.org/2/ja/core-utility-libraries/set.html#



https://hacknote.jp/archives/36667/
VSCode + TypeScript の環境構築で "モジュール 〜.vue が見つかりません" とエラーが出る時の対処法

TypeScript開発環境を構築してる時にハマったので書いておきます。

# エラー

Vueを使った開発中、コンパイルは問題ないのにVSCodeが下記のエラーを表示します。

```
モジュール 'foo.vue' が見つかりません
```


# よくある対処

> プロジェクトルートに下記内容の定義ファイル `sfc.d.ts`　を作れば解決します。

```:sfc.d.ts
declare module '*.vue' {
  import Vue from 'vue';
  export default Vue;
}
```

# 今回の対処

しかしプロジェクトルートはただでさえ設定ファイルが多いので、これ以上増やしたくありません。`@types`というフォルダを作り、そこにまとめます。

```:プロジェクトの一部
.
├── src
│   ├── @types
│   │   └── sfc.d.ts // ここに置いた
│   └── js
│       └── index.ts
└── tsconfig.json
```

## tsconfig.json を編集

```:tsconfig.json
{
  "compilerOptions": {
　〜略〜
  "include": [
    "./src/js/**/*.ts",
    "./src/js/**/*.tsx",
    "./src/js/**/*.vue",
    "./src/@types/**/*.ts", // これを追加
    "tests/**/*.ts",
    "tests/**/*.tsx",
  ],
　〜略〜
}
```

<details><summary>tsconfig.json 全文</summary>
<div>

```
{
  "compilerOptions": {
    "target": "es5",
    "module": "es2015",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "typeRoots": [
      "./node_modules/@types",
    ],
    "types": [
      "webpack-env",
    ],
    "paths": {
      "@/*": ["./src/js/*"],
    },
    "lib": [
      "es2015",
      "es2015.promise",
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "./src/js/**/*.ts",
    "./src/js/**/*.tsx",
    "./src/js/**/*.vue",
    "./src/@types/**/*.ts",
    "tests/**/*.ts",
    "tests/**/*.tsx",
  ],
  "exclude": [
    "node_modules"
  ],
}
```</div>
</details>
Gitコマンド逆引き

備忘メモとして随時更新していきます

## グラフでコミットログ見る

```
git log --graph
```

## ヘルプを見る

git --help

## リポジトリに反映する

git push

#masterブランチの内容をoriginサーバ（だいたいリモートリポジトリ）へ反映。
#-uオプションを付けると、次回からgit pushだけで、origin masterへpush。初pushのときはつけておけばOK。
git push -u origin master

#ブランチの一覧を見る
git branch

#ブランチ「dev」作って、そのブランチへ切り換え
git checkout -b dev

#masterブランチへ切り換え
git checkout master

#マージ
#（予めgit checkout masterでmasterへ移動し、ブランチissue1をマージする）
git merge issue1

#ブランチの削除
git branch -d [branchname]

#リモートリポジトリのブランチ削除
git branch -d [branchname]
git push --delete origin [branchname]

#変更されたファイルの差分（addするまえのファイル）
git diff

#変更されたファイルの差分（addした後のファイル）
git diff　--cached

#リポジトリからファイル除外（ファイルは削除されない）
git rm --cached 

#ステージエリアを直前のコミットまで戻す。作業ディレクトリは変更なし。
git reset --hard

#最新のコミットを取消して、その前のコミットの状態にもどす（コミットの履歴は残らない）
git reset --hard HEAD~

# 過去の指定したコミットの状態まで戻す（コミットの履歴は残らない）
git reset --hard [コミット番号]

# コミットの打ち消し（コミットの履歴は残す）
git revert [コミット番号]

# 過去のコミット一覧を見る
$ git reflog

#　直前のコミットの変更箇所を表示
git diff HEAD^ HEAD

# 直前コミットの変更の情報
git diff HEAD^ HEAD --stat

# 特定ファイルの変更履歴を見る
git log --follow -p filename

#現在のブランチと指定したブランチでの差分ファイルを確認
git diff --name-only {差分を見たいブランチ名}

#指定したブランチのファイルの差分を確認
git diff {ブランチ名} {ファイル名}

#別ブランチから特定ファイルのみ、取り込む
git checkout {ブランチ名} {ファイル名}


##### 変更を一時退避

```
git stash save
```

＊stash とは **こっそりしまう、隠す、蓄える** の意味。

退避したstashを確認
git stash list

stashを元に戻す
git stash  apply <stash名> （編集済み） 

変更したファイル一覧
git stash  show <stash名>

スタッシュを全削除
git stash clear

最新のスタッシュを元に戻してからstashを削除 
git stash pop

N番目のスタッシュを元に戻してからstashを削除 
git stash pop stash@{N}
CentOS6にfreetds1.1xを無理してインストール

#問題
CentOS6はまだ現役。たまにDB接続が切れるそうでfreetdsを最新にしてみることになった。
1.0からCentOS7がベースになっているので無理したくなかったが、いまさらOSを上げましょうは無駄口になる。

#更新
既存freetdsはアンインストールしないままでもOK

```bash
cd /usr/local/src
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-1.1.24.tar.gz
tar xvf freetds-1.1.24.tar.gz
cd freetds-1.1.24

./configure -prefix=/usr -libdir=/usr/lib64 -sysconfdir=/etc
make -j $(nproc)
sudo make install-exec

```

#バージョン確認

```bash
#tsql -C

Compile-time settings (established with the "configure" script)
                            Version: freetds v1.1.24
             freetds.conf directory: /etc
     MS db-lib source compatibility: no
        Sybase binary compatibility: no
                      Thread safety: yes
                      iconv library: yes
                        TDS version: auto
                              iODBC: no
                           unixodbc: yes
              SSPI "trusted" logins: no
                           Kerberos: no
                            OpenSSL: yes
                             GnuTLS: no
                               MARS: yes
```
コンパイル中にいろいろ赤文字が出る。動作には問題なかった。 ~~気がひくが、見なかったことにした。 近々サービス終了のため..~~



#参照
https://www.freetds.org/
ftp://ftp.freetds.org/pub/freetds/stable
https://pkgs.org/download/freetds

2020/3/1にAWS Elastic Beanstalkのphp7.2以下はサポート終了になる。
報告すると、決まった質問が来た。ぬるい
淋しい熱帯魚は私のことだ。
nRF52840 ボードの UART ポートの配線

Nordic nRF52840 ボードで UART ポートを使うときの配線。

# 環境

 nRF5_SDK_16.0.0_98a08e2
 
この SDK には nRF52840 用のものとして pca10056,pca10059 用のサンプルプログラムが多く含まれている。

pca10056,pca10059 というのは Nordic 公式の開発ボード「nRF52840 DK」「nRF52840 Dongle」のこと。

特に nRF52840 DK(pca10056) が標準的なものとして扱われている。

# nRF52840 DKボード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c1d2e009-17fc-38c7-eb1c-1290f068fc82.png)
残念ながら 「nRF52840 DKボード」は技適が取れていない。

# 開発に使える代替品

代わりになるボードとして以下のようなものがある。

## MDBT50Q DB

![IMG_20181114_155946.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/dfe5fbaf-d0d8-42f5-e956-b0f7c1bb8f72.jpeg)

## アオノドン2019

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/87636065-85a3-13e0-ef44-72d73b57480f.png)

# UART ポートの割当

「nRF52840 DKボード」の UART ポートは以下のように定義されています。

```

#define RX_PIN_NUMBER  8
#define TX_PIN_NUMBER  6
#define CTS_PIN_NUMBER 7
#define RTS_PIN_NUMBER 5

```

記載場所は 

(SDKディレクトリ)/components/boards/pca10056.h

 です。


ポートを再割り当てすれば自由に使えますが、サンプルプログラムをなるべく変更せずに使うための方法を示します。

# MDBT50Q DB

UARTを接続するためのポートが出されています。
これはピンをはんだ付け加工したもの。
![IMG_20181117_235713.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/7c21c45d-1512-f3e2-9e61-44a13a449662.jpeg)

また、同じポートがピンヘッダ列にも出ています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1e6d6610-1385-986d-4188-565bb080e634.png)


# アオノドン2019

UARTを接続するためのポートです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/30136c08-5a05-04c1-5c63-2e471932a15e.png)

ピン配置はこうなっています。
後に述べる CP2104 ボードのピン配置に合わせています。


# CP2102 USBシリアル変換アダプタ

UARTポートをPCに接続する時にUSBシリアル変換アダプタを使います。
以下は僕の御用達のUSBシリアルアダプタです。

![IMG_20200218_102556.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1efa1e2b-38ef-1487-a870-2275f0472945.jpeg)


- CP2102搭載
- フェイクチップ問題に悩まされない
- 安定して使える
- 安価



信号線が使えて便利
![IMG_20200218_102614.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/db24eb83-35fd-d72a-c8ab-c3f59fb812d3.jpeg)

これを使った配線例を示します

# 配線

|pca10056定義|nRF52840側信号|USBシリアルアダプタ側信号|
|:---:|:---:|:---:|
|GPIO0.08|RX|TX|
|GPIO0.06|TX|RX|
|GPIO0.07|RTS|CTS|
|GPIO0.05|CTS|RTS|
||GND|GND|

## MDBT50Q DBの場合
![IMG_20200218_100741.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d7da439e-6617-2c83-21bf-b8e40e23bbaa.jpeg)
↑この写真ではピンヘッダ列の方に配線しています。
赤色のジャンパーは5Vです。USBシリアルアダプタから電源を供給しています。3.3Vを供給することもできますが、こちらの方が流せる電流量に動作に余裕があります。


![IMG_20200218_100834.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b1a7041d-6745-5f9b-d65f-59d6c9cd675a.jpeg)
アップです。CTS/RTSを含んで配線しています。



## アオノドン2019の場合

RTS/CTSが必要ない場合
ここでも、5Vラインを使って電源を供給しています。
![IMG_20200218_102250.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f817ad03-964b-7964-4bdd-084add4b91e2.jpeg)

RTS/CTSが必要な場合
![IMG_20200218_101447.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f18e0bf1-d667-f2df-e691-931f85deaee4.jpeg)

アオノドン2019はウラ面のGrove端子にRTS/CTSが出ています。

|pca10056定義|nRF52840側信号|アオノドン2019端子|USBシリアルアダプタ側信号|
|:---:|:---:|:---:|:---:|
|GPIO0.08|RX|UART端子TX|TX|
|GPIO0.06|TX|UART端子TX|RX|
|GPIO0.07|RTS|Grove端子白|CTS|
|GPIO0.05|CTS|Grove端子黃|RTS|
||GND|GND|
印刷時に表示されるURLを消す方法

Bootstrapが使われたwordpressでテーマを作成する際、アーカイブページをプリントアウトすると、意図しないURLが表示されていた。

## 解決方法
解決方法は以下のcssを組み込めはオッケー。

```scss
@media print {
 a[href]:after {
 content: "" !important;
 }
}
```

また、abbrタグのtitle属性を非表示にしたいときは、以下を組み込むと良い。

```scss
@media print {
 abbr[title]:after {
 content: "" !important;
 }
}
```

## 原因
bootstrap.cssには以下のcssが組み込まれていたことが原因であった。
そのため、打ち消すcssを作るか以下のコードを削除すれば良いことになる

```scss:bootstrap.css
a[href]:after {
    content: " (" attr(href) ")";
  }
  abbr[title]:after {
    content: " (" attr(title) ")";
  }
```
Sass 基礎文法　1

#はじめに
フロント実装を学んでいく上で、Sassを用いておりますので、用語等を中心に整理していきます。
もうすでにご存知の方、省略の仕方等ご存知でしたら、ご教授願います。

#Sass(サス)とは
- cssを効率的に書く言語（cssを拡張した言語）
- cssの中で変数を使え、計算を行うことができる。
- Sassファイル
    - cssファイルに記述はできない
    - Scssファイルにcssを記述することはできる。
    - Sassを扱うファイルの拡張子は２種類
          - sass拡張子（SASS記法を用いるが、cssの記法と差があり、普及しなかった。）
          - scss拡張子（cssの記法によく似たSCSS記法)

#Sassのメリット
- 記述の簡略化
- プログラムのような処理
- 複数のcssファイルを1つにまとめることができる
- 同じ値を使い回すことができる


## 記述の簡略化
- CSSをネスト（入れ子）して記述できる。
- 親要素を複数記述しなくてもよくなった。

　　　　
##プログラムのような処理
- 変数や条件分岐といったプログラミング処理ができる

```qiita.scss

$変数名: 値;

//例）ピクセル数やカラーコードなどを何度も使用する値を変数定義
$section-color: rgb(30,30,30);
 section {
 background-color: $section-color;
}
      
```
      
##複数のcssファイルを1つにまとめることができる
####パーシャル
- 複数のSassファイルを1つのCSSファイルとしてまとめることができる。
- また、パーシャルを使えば、機能ごとにファイルを分割し、管理することができる。


####パーシャルファイル作成方法
- ファイル名を　_ から始める。(例えば、reset.scss)

```_reset.scss
   //処理を記載する。
```

- パーシャルファイルを別ファイルで読み込む。

```qiita.scss
   @import "reset";
```


# 同じ値を使い回すことができる
###変数を用いる。 ($変数名: 値;)
- 例）FFEC00という色をmainYellowColorという変数名で定義する。

```color.scss
$mainYellowColor: #FFEC00; 
```


###mixin　　
- まとまったスタイルを定義することができる。
- 変数は値を定義するものだったが、mixinはスタイルを定義するもの。

```qiita.scss
//mixinを定義
@mixin mixin名() {}   

//mixinを呼び出す。
@include
```

例）.clearfoxをよく使うので、パーシャルファイルを作成し、ファイル内にmixinを定義する。

```_clearfix.scss
@mixin clearfix() {
 &:after{
 content: '';
 display: block;
 clear: both;
 }
}
```


  
###&(アンパサンド) とは
- コードを簡易にできる。

```_sample.scss
//例）_sample.scssにmixinを呼び出す。
.menu {
 @include clearfix();
  ...
 .menu__list {
  float: left;
  ...
  }
 }

//例２）mixinを使わなければ・・・冗長になる。
 .menu {
  &:after {
  content: '';
  display: block;
  clear: both;
  }

  .menu__list {
  float: left;
  ... 
  }
 }
```


#さいごに
日々勉強中ですので、随時更新します。
皆様の復習にご活用頂けますと幸いです。
【Laravel】railsのbinding.pryみたいにデバッグする

[【laravel5】 tinkerを利用してpryのように楽にデバッグする！](https://qiita.com/youkyll/items/92e144bec0861b07bc56)
この記事を参考にしました。

#### ポイント1　　デバッグしたいところに``eval(\Psy\sh());``を置く。

```php

public function update(ArticleRequest $request, $id)
    {
        $article = Article::findOrFail($id);
        $article->update($request->validated());
        eval(\Psy\sh());
        return redirect()->route('articles.show',$article->id)->with('message', '記事を更新しました。');
    }
```

#### ポイント2　　``php -S localhost:8000 -t public server.php``でサーバーを立てる。

(今の場合)更新ボタンを押す=> ``: q`` で、コンソールに入れる。

<img width="706" alt="スクリーンショット 2020-02-18 10.47.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402245/8315781c-b74c-2333-4a3d-45965ee89175.png">

こんな感じでデバッグできる！！

``rails c``と同じことがしたければ``php artisan tinker``でいける。
【初心者向け】実装前の思考回路

#目的
課題に取り組む際に事前にロジックを立てて取り組むことで作業の効率化をする

#できること
やることを明確にして余計な脳のリソースを使わずタスクに集中できる
#本題
今回は以下に例を使って書いていく
今回実装したいもの：画像がないページにサンプルイメージを表示させたい

###やりたいこと
=> 画像がないページにサンプルイメージを表示させたい

###実装するために今はないもの
=>  画像がない時 という条件式がない。ある場合の条件式はある


###今はないけど実装したいもの
=> サンプルイメージを表示させるために画像がない時の条件式を作りたい


###実装したい条件式に必要な情報
=> 現時点で画像がない時に画像の変数はどんな状態になっているのか？


###調べる
=> 画像がない時の変数の状態を見てみる


###実装する
=> 変数の状態を参考に条件を実装してみる
else を使うなどして実装できるかも

#まとめ

- やりたいこと
- 実装するために今はないもの
- 今はないけど実装したいもの
- 実装したい条件式に必要な情報
- 調べる
- 実装する

全てに当てはまるわけではないが、自分の場合この思考回路を教えていただいてから作業効率が明らかに上がった。

特に初心者のうちは「何から手をつけていいかわからない」みたいなことが多いかもしれないですが。状況を書き出してみると作業が進むかもしれません。
GlueのSparkジョブを作る方法（CloudFormation）

以下の様に、CommandのNameに「glueetl」と指定することでSparkタイプで作成できます。

```yaml
  GlueJob:
    Type: AWS::Glue::Job
    Properties: 
      GlueVersion: '1.0'
      Command: 
        Name: glueetl
        ScriptLocation: !Sub >-
          s3://<ソースコードのパス>
      Name: <ジョブ名>
      Role: <ロールのARN>
```
この指定が無いと、Python shellとして作成されてしまいます。
【cakephp】メソッドとは

#メソッド
　クラス内で定義される独立していない関数のこと

#メソッド先頭のアンダースコア
- アクセス修飾子の省略形のこと

- 先頭にアンダースコアを付けることで、CakePHPのコントローラメソッドを隠蔽することが可能
- アンダースコアが付けられたコントローラメソッドはウェブ上では見えないように 設定され、内部での利用のみ可能になる
- メソッドの先頭にアンダースコアが1つ→protected、2つ→private

#アクセス修飾子種類
- public：自クラス、子クラス、他クラス
- protected：自クラス、子クラス
- private：自クラス
vue勉強

- `const vm = new Vue ({`の`V`は大文字じゃなきゃ動かない

- `<input type="text" v-model="message">`の`v-model`みたいな`v-〇〇`はディレクティブ（属性ディレクティブ）といって、「ここを動かしまっせ」みたいな印の役割をしている
直訳で 指示 という意味
ディレクター（監督）から出る指示のニュアンス

- バインディング
相互に関連付けること。
双方向データバインディングとかいう

- `v-model`
フォーム入力バインディング。
input要素とかtextarea要素とかのフォームの状態を、p要素などにリアルタイムで関連付けることができる。
textareaに入力した文言をp要素内に出力するなど。
[公式](https://jp.vuejs.org/v2/guide/forms.html)

- idとエレメント名(`el`の値)が一致していることを確認する

- `v-for`のときにリストの配列名を複数形にしたときに`s`の付け忘れに注意


- ES6
[スプレッド構文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)
[アロー関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions)

- マウント：[mounted は Vue\.js におけるライフサイクル\(参考\)において、仮想 DOM が DOM に置き換わるタイミングを指します](https://qiita.com/tatsurou313/items/4f18c0d4d231e2fb55f4)


- const
定数。多分、「以下を定義します」みたいな意味

- vm
view model　の略

- `v-bind:class`
状況によってクラスを可変にする
チェックボックスにチェックが入っていたらクラス（スタイル）を変えるみたいなことができる
[公式](https://jp.vuejs.org/v2/guide/class-and-style.html)

- `filter()`メソッド
例えば、「todoリスト内のアイテムをふるいに掛けてチェックが入っていないアイテムだけを並べる」みたいなことができる。
配列にフィルターを掛けてあたらしい配列を生成する。
カッコ内の引数には関数を渡す。その関数に従ってフィルターをかける

- `v-for`
`:key`(v-bind:keyの略)を必ず付ける。
固有（ユニーク）なidなどをリストアイテムに付す役割。
理由は固有のidを振らないとスタイルやチェックの有無などの状態を紐付けられないから。
keyを持ったアイテムは、状態を維持したまま並べ替えることができるが、keyを持たせないと並べ替えや削除などを行ったときにインデックス番号が状態を持ってしまい、状態を紐付けられない
[わかりやすい説明](https://ja.stackoverflow.com/questions/42250/v-bindkey-%E3%82%92%E4%BD%BF%E3%81%86%E6%99%82%E3%81%A8%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E9%81%95%E3%81%84)
[公式](https://jp.vuejs.org/v2/guide/list.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%A8-v-for)

- `el`,`props`,`data`,`methods`などの名前
[コンポーネントオプション](https://012-jp.vuejs.org/api/options.html)
[推奨される順序](https://jp.vuejs.org/v2/style-guide/index.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88-%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E9%A0%86%E5%BA%8F-%E6%8E%A8%E5%A5%A8)

- 簡単な`hello world`

```
script src="https://cdn.jsdelivr.net/npm/vue"
#app
  | {{testVal}}
javascript:
  const app = new Vue({
    el: '#app',

    data: {
        testVal: 'Hello World!' //testValを定義
    }
  });
```
『Kaggle備忘録』欠損値の検索・削除

## 目的
欠損値のあるcolumnを削除する方法のメモ．

## 環境・使用データ
使用データ：Kaggle cources: [Intermediate Machine Learning - Missing Values](https://www.kaggle.com/alexisbcook/missing-values)の家賃データ

環境：Kaggle notebook

## やったこと
モジュール・osの準備，データの読み込み

```python:DropColumn.py
#os,モジュールのインポート
import os
import pandas as pd

#データの読み込み
X_full=pd.read_csv('../input/train.csv',index_col='Id')
```

`X_full`には以下のインデックスがある

```python:DropColumn.py
X_full.columns
```

<img width="624" alt="スクリーンショット 2020-02-18 9.57.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584227/50d55c1c-fae8-44d1-350f-44985a9b9567.png">

この中で欠損を含むColumnは

```python:DropColumn.py
cols_missing=[col for col in X_full.columns
            if X_full[col].isnull().any()]
cols_missing
```
<img width="345" alt="スクリーンショット 2020-02-18 9.58.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584227/636184c8-5e21-b8b9-3a4c-61190eb0a85e.png">

らしい．これらを一括で削除する．

```python:DropColumn.py
reduced_X_full=X_full.drop(cols_missing,axis=1)
reduced_X_full
```
<img width="630" alt="スクリーンショット 2020-02-18 10.00.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584227/fef4fcec-5244-2cf7-e7da-d0715d8b4ecc.png">

削除完了．

### 2.欠損値の補完
scikit-learnの`SimpleImputer`を使う方法

`SimpleImputer`は，中央値，平均値などの統計値を欠損値の補完に使う．

例えば，中央値で補完するなら
`imputer=SimpleImputer(strategy='median')`のように指定する．

```python:ImputeValue.py
#imputerの定義
from sklearn.impute import SimpleImputer
imputer=SimpleImputer(strategy='median')

#X_fullの欠損値を補完する
imputed_X_full=pd.DataFrame(imputer.fit_transform(X_full))
```
このままだと`imputed_X_full`の列名は序数になっている

```python:ImputeValue.py
imputer_X_full.columns
```
<img width="281" alt="スクリーンショット 2020-02-18 11.44.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584227/b84ce30c-38b9-5551-8cdb-51e92e3a7877.png">
列名を元に戻す

```python:ImputeValue.py
imputed_X_full.columns=X_full.columns
imputed_X_full.columns
```
<img width="632" alt="スクリーンショット 2020-02-18 11.45.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584227/41afa09b-0291-2d9f-e3d7-c9b031a344f9.png">

補完完了．
[iOS13]materializeのdropdownでリンクのタッチがずれる

# materializeで個人開発してます。
Django + materializeで個人のWebアプリを作っています。
この記事はmaterializeを使っていて、うまく動かせなくて悩んだ内容の記事です。

# dropdownがうまく使えない
dropdownしっていますか？　あのdropdownです。
Qiitaの記事画面で編集リクエストとか出すときに使うやつです。
▼　←こんなボタンを押すとにょいっとメニューが出てきて、リンク先に飛んだりできるやつですね。

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376819/306486dc-7925-f1fb-533c-f792db009650.jpeg)


このdropdownを使って、詳細な操作を行うためのリンク先の一覧を表示していました。なぜかiOSだけタッチしたリンクとは違うところに飛んじゃって非常に悩んだので、今回記事にしました。

**なお、予め断っておくと、一応直ったものの「これだ！」という決め手を得るまでには至ってないので、だれかちゃんとした解決策とか、対処法を知っていたら教えてくれると嬉しいです……。**

#どんな問題？
まあタイトルのとおりなんですが、ドロップダウンでタッチ位置と遷移するリンクがずれてしまいます。
わかっていることを箇条書きにすると…。

- PCブラウザでは発生しない。
- Chromeのデベロッパーモードスマホをエミュレートしても発生しない。
- iOSでだけ発生する。
- Androidで発生するかはわからない（持っていないので）

こんな感じです。

# うまく動かない原因
いろいろ調べた結果の予測です。
materializeのdropdownはopen()とclose()をアニメーションで表現してくれます。dropdownは範囲内や外をタッチすると、開いたドロップダウンメニューを閉じる動作をします。

またiOSはclickイベントが発生するのに少し時間がかかる（ダブルタップやロングタップと区別するため）らしいです。
そのためiOSではclickを判定するために少々の時間が必要で、その間に**dropdownのcloseのアニメーションでリンクの表示位置がずれ**、タッチした箇所とは違うリンクが選択されてしまったのではないかと予測しています。
（リンクのタッチとclickイベントはまた別じゃないかとも思ったんですが、どうなんでしょう……？）

実際、dropdownのリンクをタッチしたき時、**タッチした項目よりも下の項目のリンク先にジャンプすることが多く**、一番下の項目は基本的にジャンプできなかったです。

# とった対策
dropdownのcloseはclickイベントで処理されるので、**clickよりも早い段階でページ遷移をムリヤリさせて**しまいました。具体的にはdropdown内のaタグでtouchendイベントが発生したら、ページ遷移するようにしました。
touchendはタッチした指が離れた瞬間に発生するイベントでclickイベントよりも発生タイミングが早かったので、今回採用しました。

```javascript:test.js
    // タッチイベント　ドロップダウンリストのaタグのタッチエンドでhrefの先に飛ぶ
    $(document).on('touchend','.dropdown-content li a',function(){
		var href = $(this).attr('href');
		window.location.href = href;
		
		return false;
    });

```

# 結論
というわけで、一応dropdownのタッチした項目のリンク先にジャンプできるようになったので、自分はそのままにしています。
ただ、ちゃんと対応するなら、アニメーションのせいではないかと疑っているので、closeのアニメーションの速度を非常に遅くするとか、アニメーションをなくしてしまうとか、dropdown内のclickでは閉じないようにするとかの対応があったと思います。
あとはGithubにmaterializeのプロジェクトがあったので、ちゃんとissueにあげておけばよかったかなと……（英語が怖くて逃げました)。

だれかちゃんとした解決方法しってたら教えて下さい（他人任せ）。
レガシーコードからの脱却〜ソフトウェアの寿命を延ばし価値を高める9つのプラクティスを読んで

自分なりに所感とまとめ。

## URL

https://www.oreilly.co.jp/books/9784873118864/

## 構成と簡易まとめ

- I部
    - 1章 ウォーターフォールは保守できないソフトウェアを作り出す
    - 2章 非効率な開発でどのくらいの損失があるか
    - 3章 アジャイルや小さい単位で進めていく事が良い
- II部
    - 4章 原則を理解すること
    - 5章 やり方の前に目的や理由を口にすること
    - 6章 小さなタスクで進めること
    - 7章 継続的に統合する(即ビルドできる)環境の大切さ
    - 8章 協調のためペアプログラミング
    - 9章 凝集性、疎結合、カプセル化、断定的、非冗長なコードを作ること
    - 10章 テストファースト
    - 11章 テストを仕様として使う
    - 12章 設計を最後にする利点
    - 13章 リファクタリングを行う際のまとめ
    - 14章 今までの章を踏まえたうえでのまとめ

## 所感

- 確かに目的とか使われ方がよくわかってない状態で実装して、結合してみて「全く動きませんでした笑」ってありがちだなと思った
- スコープを狭めて小さな単位でならどんどんリリースすることもやりやすそうだなと感じた
- ペアプロはやったことがないので、知識の共有や協調ももちろんだけど単純にやってみたい
- 確かにガチガチに決めて実装するよりかはある程度大枠だけ決めて進めてから打合せしつつ最後に細かい設計のほうが手戻りは少ないのかなと感じた
- レガシーコードを直していく方法がつらつらと書かれている本なのかと思ったが、レガシーコードを書かないためにレガシーコードがどんなものかを理解して保守しやすいシステムをつくることに重きを置いた本だと感じた
[Vuex] getters/mutations/actions は複数形だぞ！

## 複数形

```js
new Vuex.Store({
  state: {},
  mutations: {}, // ← "mutation" ではなく "mutations"
  actions: {},   // ← "action" ではなく "actions"
  getters: {},   // ← "getter" ではなく "getters"
});
```


## 単数形だと…

```
[vuex] unknown action type: xxx
```

あるいは

```
[vuex] unknown local action type: xxx, global type: xxx
```

といったエラーが出ます。

小一時間悩んでしまった…
VS2017でspecflow使うときメモ

# SpecFlow 3 で動かすの手間取ったのでメモ
* C# の .NET Framework library を作る
* App.Config 加えて書き加える
* nugetで入れる
    * nunit
    * SpecFlow.Tools.MsBuild.Generation
    * SpecFlow.NUnit
* feature 加える
* Steps 加えるか生成する

----
# app.config  
* パッケージ入れると更に上書きされる。  

```app.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow" />
  </configSections>
  <specFlow>
    <language feature="ja-JP" />
    <bindingCulture name="ja-JP" />
    <generator allowDebugGeneratedFiles="false" allowRowTests="true" generateAsyncTests="false" />
  </specFlow>
</configuration>
```
Visual Studio Code でJupyter code block を実行できない場合

Visual Studio Code のJupyter連携機能が便利でほとんど素のJupyterを使うことが無いのですが、複数マシンに環境をインストールする際に毎度つまづくので、備忘録としてここに書いておきます。

# Jupyterサーバーが起動しない！

## Jupyter コードブロック

いつも使うのは、最近導入されたJupyter Notebook対応ではなくて、昔からある簡易コードブロックの方です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146939/4c4daeb0-a45f-ef2e-8c21-a32cd7a3e541.png)

これで、Run Cellを実行すると以下のようにJupyter Server への接続ができないと叱られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146939/c314eb19-87a7-395b-4d54-f64892ac12e8.png)

## 解決法
色々探し回るのですが、結局最も基本的なことで解決しました。
コマンドパレットから
Specify local or remote Jupyter server for connections
を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146939/27341d45-fddd-0816-dc93-1aef48179129.png)

次に接続先を指定する方法を聞かれるので、Defaultを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146939/a5eecb26-c902-13f2-f6af-91b9e5d85a8c.png)

これで、Jupyter の接続先がデフォルトのものに指定され、無事動きました。

## どういうときになる？

順番がおかしいですが、なんで毎度このような事になるか状況を挙げておきます。必ずしもこの推理が正しいかどうかはわかりません。（修正：原因はAnacondaのせいではないようでした）


* VSCodeインストール時にPythonがインストールされていない？
* Visual Studio 付属のPythonではうまくJupyterが自動設定されない？
WordPressのREST APIで全記事を取得したい

[ポートフォリオ](https://qiita.com/webiscuit/items/a93d0eaa051e062b5640)を引き続きアップデートしており
今はWordPressのREST APIを使用してブログ機能を追加しています。

#TL;DR
WordPressのREST APIだと最大でも100件までしか記事が取得できなかったから
functions.phpに全記事を書き出すJSONを追加してみた。

#WordPressのREST APIの取得について
まず[ドキュメントへのリンク](https://developer.wordpress.org/rest-api/)を。

WordPressの公開URL末尾に「/wp-json/wp/v2/」することで取得可能で
ここにパラメーターなどを渡して、カテゴリー一覧などを取得します。

公式サイトのURLだとこんなイメージ
> https://wordpress.org/wp-json/wp/v2/

デフォルトで最大件数で取得する場合のパラメーターでよくあるのはこれみたいです（検索調べ）
> /wp-json/wp/v2/posts?per_page=100&page=1

デフォルトで10件、パラメーターを渡して最大で100件までの取得です。
Ajax表示や各ページングで随時呼び出す想定なのでしょうね。

#なぜ全記事を読み込もうと思ったのか
今回はNuxt.jsを使用していて、generateで静的での書き出し＆Netlifyでホスティングを想定しています。
Nuxtで動的なページを生成する際は
nuxt.config.jsに以下のようなものを記述して、生成するページを設定する必要があります。
REST APIのデフォルトに従うと、最大で100件までしか生成できません。。

[ドキュメント](https://ja.nuxtjs.org/api/configuration-generate/#routes)より抜粋

```nuxt.config.js
export default {
  generate: {
    routes: [
      '/users/1',
      '/users/2',
      '/users/3'
    ]
  }
}
```

#WordPressのfunctions.phpに書いたもの

[こちらの投稿](https://wordpress.stackexchange.com/questions/298447/fetch-all-posts-including-those-using-a-custom-post-type-with-wordpress-api)を大いに参考にさせていただきました
（※元記事は複数の投稿タイプを一緒に書き出したいというもの）

これにより、以下のようなパスで全記事読み込みが可能になりました:raised_hands:
> /wp-json/custom/v1/allposts

吐き出しを行う項目も関数内で細かく設定出来るので、環境に合わせてこれから少し調整しようと思います。

```functions.php
function custom_api_get_all_posts() {
    register_rest_route( 'custom/v1', '/allposts', array(
        'methods' => 'GET',
        'callback' => 'custom_api_get_all_posts_callback'
    ));
}
add_action( 'rest_api_init', 'custom_api_get_all_posts' );   

function custom_api_get_all_posts_callback( $request ) {
    $posts_data = array();
    $posts = get_posts( array(
            'posts_per_page' => -1
        )
    ); 
    foreach( $posts as $post ) {
        $id = $post->ID;
        $posts_data[] = (object) array( 
            'id' => $id, 
            'slug' => $post->post_name,
            'title' => $post->post_title,
            'content' => $post->post_content,
        );
    }                  
    return $posts_data;                   
} 
```

#雑記
記事一覧、ページ一覧、カテゴリー一覧などなど、作成するページが多いですが
ある程度コンポーネント化出来ていれば、ファイルごとコピーで流用可能なので、今後が楽しみです◎


かなり数多くのサイトがWordPressで構築されていること、ユーザー側が管理画面に慣れていることから
案件ベースでの静的CMS（Headless CMS）は
しばらくはWordPress REST APIの可能性が一番高いのでは…と個人的には思っています。

クライアントさえ同意してくれれば、すぐに導入していけるチャンスが多そうです。
どういった形でクライアントに提案していくかが、当面の課題です:sweat_smile:
【ふくだ学習録】アプリ制作part8【35日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )
[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)


### 今読んでいる本

なし

# アプリ制作

### docker環境へseleniumとgoogle chrome(headless chrome)追加
スクレイピングを実施するときに、headless chromeで行いたい。ここに至った流れは下記。

**scrapyによるスクレイピング実施**
↓
**取得したい値が取得できない**
↓
**取得したい要素がJSで動的に作成されているので、ブラウザを用いてスクレイピングしないと取得できないっぽい（推測）**
↓
**chrome使おう**
↓
**それならheadless chrome使おう**
↓
**dockerコンテナ内にインストールしよう**

って感じです。（前回と今回の作業にの再整理）


以下参考にしたサイトです。
[Headless ChromeをDocker上で動かして、E2Eのテスト](https://qiita.com/hoshitocat/items/c48bfdce867fc852e829)
[ChromeとPythonのchromedriver-binaryのバージョンを合わせたい。](https://qiita.com/akiko-pusu/items/86faca0cb9c877896c04)


### chromiumを使用する
上記した参考サイトでは、`Debain`系のLinuxを使用していたが、今回自分は`alpine`Linuxで作成していっているので、そのままでは進めない。
具体的には下記コードが通らない。

```docker
RUN sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apk/repositories/sources.list.d/google.list'
```

というのもalipineには`/etc/apk...`といったディレクトリがそもそもないとのこと。（まぁそりゃそう）
まじかーと思って「alpineのパッケージ管理用ディレクトリを探して、それに記載変更しよう」と思っていたのですが、下記サイトを見つけました。

どうやらalpine用の`chromium`というパッケージがあるとのこと。
ここからはchromium使っていこうかと思う。

[How can we install google-chrome-stable on alpine image in dockerfile using dpkg?
](https://stackoverflow.com/questions/58654309/how-can-we-install-google-chrome-stable-on-alpine-image-in-dockerfile-using-dpkg)



### 現段階のDockerfile（スクレイピングサーバ）
今の段階ではこんな感じ

```dockerfile
FROM python:3.6-alpine

RUN apk add --update --no-cache \
    # scrapyに必要なライブラリの追加
    build-base \
    python-dev \
    zlib-dev \
    libxml2-dev \
    libxslt-dev \
    openssl-dev \
    libffi-dev \
    # headless chromeのために必要なライブラリの追加
    udev \
    ttf-freefont \
    chromium

ADD pip_requirements.txt /tmp/pip_requirements.txt
RUN pip install -r /tmp/pip_requirements.txt

# スクレイピング時に日本語化けを防ぐため、フォントを追加
RUN mkdir /noto

ADD https://noto-website.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip /noto 

WORKDIR /noto

RUN unzip NotoSansCJKjp-hinted.zip && \
    mkdir -p /usr/share/fonts/noto && \
    cp *.otf /usr/share/fonts/noto && \
    chmod 644 -R /usr/share/fonts/noto/ && \
    fc-cache -fv

WORKDIR /
RUN rm -rf /noto

ENTRYPOINT tail -f /dev/null

ADD ./app /usr/src/app
WORKDIR /usr/src/app
```



# 今日の一言
結局**chrome**も**chromedriver**もどっちもインストールせず！！ようやく作れる！はず！

環境（docker）構築で結構時間を取られてしまってるーーー。
「軽量Linuxええやん！」って思ってalpine使っていったけど、やっぱり参考にするサイトとか事例では違うディストリビューションの方が圧倒的に多いから、変に工数かかっちゃってる感は否めない。

もう多分詰まりそうなところは抜けだけど、これ以上時間かかるようやったらalpine版のpythonイメージやめる！Ubuntuにする！
VSCODEの日本語対応


１プラグイン追加ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/ca1098a8-59a9-9c70-c1f7-3a0c14bb79af.png)


２．プラグインを「Japanese Language Pack for Visual Studio Code」で検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/2d4567b7-3792-55b2-f278-96583dc67b75.png)


３．「Japanese Language Pack for Visual Studio Code」のInstallボタンを押してインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/8aaf2e29-355e-a951-8b83-b414f27e3fcc.png)


４．再起動を求められるので再起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/a47b86b4-9d84-16dd-ae46-3a4d63cf7720.png)


＜全容＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/59f33cdf-9492-907a-229f-61faa5971fc8.png)
Javascriptの関数で可変長引数を配列として利用する方法 | Array.prototype.slice.call()

＊この記事は、「Javascriptで可変長引数をスグにでも使いたい」と言う人を対象に書いております。細かいことは省いていますので、突っ込んだことを知りたい方は他のページを調べてください。


Rubyには普通に存在する可変長引数ですが、Javascriptで利用するには少し工夫が必要になります。

と言っても、Array.prototype.slice.call()を使うだけです。

以下、例をあげます。

```hatsumori.js
var test = function() {
  var args = Array.prototype.slice.call(arguments);
  console.log(args);
}

test('ななまる', 'イマドキ', 'ショパン', 'アカデミー')
// ['ななまる', 'イマドキ', 'ショパン', 'アカデミー']
```

関数内でargumentsは渡された引数を渡してくるのですが、そのままでは「配列っぽい何か」であり、配列として加工できません。
Array.prototype.slice.call(arguments)で、配列として加工できるようになります。
win10で有名でないけど便利な設定や機能

# 概要
自分の周りでwin10ユーザーが利用はしていなかったが、便利な設定や機能をまとめてみました。
すでに利用者の多い有名な設定や機能、紹介したけど受けが良くない機能は省略しています。

#  「このウィンドウをすべてのデスクトップに表示する」設定
仮想デスクトップの設定状態で、上記の設定を行うと全ての仮想デスクトップで対象のウィンドウが表示されるようになります。
この設定はセカンドディスプレイを設定した場合に有効で、セカンドディスプレイで特定のウィンドウに設定を行うことでセカンドディスプレイの表示を固定することができます。セカンドディスプレイには常にブラウザやメモ画面を固定表示したままで、メインディスプレイを作業したいデスクトップ表示に切り替えることが可能です。もちろん、メインディスプレイを固定表示の設定をしたり、セカンドディスプレイのみでなくマルチディスプレイで対応可能です。
説明が下手くそで言葉では便利さが伝わらないかも知れませんが、設定して利用してみればこの便利さを実感してもらえると思います！！

### 設定方法
1. 仮想デスクトップを設定しておく ※仮想デスクトップの詳細は下記を参照
2. セカンドディスプレイを接続する ※手順1とは順不同
3. セカンドディスプレイに固定したいウィンドウを移動させる
4. 仮想デスクトップ表示（winキー + Tab）表示にして対象ウィンドウを右クリック
5. 「このウィンドウをすべてのデスクトップに表示する」を選択する  
　　→セカンドディスプレイの小窓が全て対象ウィンドウが表示されるようになっていればOK

[Windows 10 仮想デスクトップの使い方](https://www.tipsfound.com/windows10/04005)

### 蛇足
仮想デスクトップの操作は下記の内容だけでも覚えておくと便利です。

|ショートカットキー|操作内容|
|---|---|
| Winキー + Tab| 仮想デスクトップ表示 |
| Winキー + Ctrl + ← | 前のデスクトップに切り替え |
| Winキー + Ctrl + → | 後のデスクトップに切り替え |

#  「仮想デスクトップで全てのアプリをタスクバーに表示する」設定
仮想デスクトップを設定した初期状態では、タスクバーに表示されるアプリが表示中のデスクトップのアプリしか表示されません。
この設定を行うと、全てのアプリがタスクバーに表示されるようになるので、タスクバーのアイコンをクリックすると対象のデスクトップに移動してアプリを表示されます。
アイコン通知がタスクバーで確認出来るようにもなるので、地味に便利な設定です。

### 設定方法
1. 仮想デスクトップを設定しておく
2. システムを開く ※後に紹介している「Winキー ＋ X」から簡単に開けます！
3. 左のメニューからマルチタスクを開く
4. [仮想デスクトップ]->[タスクバーに次の場所で開いているウインドウを表示する]から「すべてのデスクトップ」を選択する

### 蛇足
すぐ下に「Alt + Tab」によるアプリ切り替えも設定変更が可能ですが、「Alt + Tab」は初期設定の表示中のデスクトップ内のアプリのみにしておいたほうが良いです。
デスクトップの切り替えが必要な場合は、タスクバーのアイコンをクリックするか「Winキー + Ctrl + ←/→」で移動するようにして、表示中のデスクトップ内のアプリ切り替えを「Alt + Tab」で行うスタイルが効率的かと思います。

#  Winキー ＋ V
「Ctrl + C」でコピーした内容を記憶しておき、「Winキー ＋ V」を押すと過去にコピーした履歴の一覧表示されペースト内容を選択できるようになります。
フリーソフト等で定番の機能ではありますが、Win10標準機能となっているので職場等でも使用しやすくなりました！

### 設定方法
コピーの履歴は「Winキー ＋ V」を初めて押すと開始され、それ以降は「Winキー ＋ V」でコピー履歴の一覧が表示されるようになります。

### 蛇足
「Winキー ＋ V」で記録されるコピー履歴はテキスト形式のみのようで、通常はエクセル等でセルを「Ctrl + C」でコピーすると、セル内のテキストのみでなく書式等の様々な情報もペースと可能ですが、「Winキー ＋ V」ではセル内のテキストのみがペーストされます。

#  Winキー ＋ X

### 設定方法
WindowsのOS設定関連のメニューが表示されます。システムや管理者権限のPowerShellなどがキーボードで表示できるので、作業途中で頻繁に使用するショートカットではありませんが、OS設定関連で何か確認や変更を行いたい場合には「Winキー ＋ X」からたどれるのでシステムの開き方等で迷うことがなくなります！

### 蛇足
電源ボタンでもできますが、私はスリープも含め再起動、シャットダウン等を「Winキー ＋ X」から良く実行します。

# まとめ
知っていればネット上でも紹介されている機能ですが、win10おすすめの初期設定などでは省略されている場合が多く、周りのwin10ユーザが思ったよりも使用していない機能なので、今更ですがまとめてみました。
個人的には仮想デスクトップでセカンドディスプレイの固定表示はかなりおすすめで、便利な割には結構知られていない機能なので是非試してみてください！
ただ、理想としては仮想デスクトップの１つをセカンドディスプレイに割り当てるといった設定ができると嬉しいのですが、もしご存知の方がいたら是非教えて頂きたいです。
他にも有名ではない便利な設定や機能がありましたら是非コメント頂けると嬉しいですmm
Rails.root.join("foo", "bar")よりも、Rails.root.join("foo/bar")が良いのでは？というお話

## はじめに：joinに渡す引数はいくつ？

たとえば、Railsのテストを書いたりするときに、テスト用のCSVファイルのパスを指定することがあると思います。

```ruby
# 入力フォームでCSVファイルをアップロードするコード例
attach_file 'CSV file', csv_file_path
```

このとき、`Rails.root.join`を使うと簡潔にファイルパスを取得できるのですが、いろんな人のコードを見ていると、大きく分けて以下のような2パターンがあるようです。

```ruby
# "/" で区切った1つの文字列を渡すパターン
csv_file_path = Rails.root.join('spec/fixtures/sample.csv')

# パスの要素ごとに区切って複数の文字列を渡すパターン
csv_file_path = Rails.root.join('spec', 'fixtures', 'sample.csv')
```

僕はふだん前者のパターンで書いています。その理由は以下のとおりです。

- 後者のパターンより短く書けるから
- `'spec/fixtures/sample.csv'`のようなパスが、プロジェクトルートから見た相対パスとして、ぱっと認識しやすいから

一方、後者のパターンで書く人の理由を聞いてみると、「実行環境によってはパスの区切り文字が`/`と限らないから」と答える人が多かったです。
これはおそらく、Windows環境でパスの区切り文字が`\`になることを意識しているんだと思います。

## 検証："/"でパスを区切っても、Windows環境でちゃんと動く

しかし、後者のパターンで書く理由が「Windows環境を意識しているから」なのであれば、その心配はおそらく無用です。

Windows環境のrails consoleで、先ほどのような`Rails.root.join`の2つの書き方を比較した結果を以下に載せます。
（僕はWindowsをふだん使わないため、Railsのバージョンが少し古いですが、おそらく挙動は今でも同じだと思います）

```
C:\dev\rails-sandbox>rails c
Loading development environment (Rails 5.0.2)
irb(main):001:0> Rails.root
=> #<Pathname:C:/dev/rails-sandbox>
irb(main):002:0> p1 = Rails.root.join('config', 'database.yml')
=> #<Pathname:C:/dev/rails-sandbox/config/database.yml>
irb(main):003:0> File.exist? p1
=> true
irb(main):004:0> p2 = Rails.root.join('config/database.yml')
=> #<Pathname:C:/dev/rails-sandbox/config/database.yml>
irb(main):005:0> File.exist? p2
=> true
```

すこし見づらいかもしれませんが、`Rails.root.join('config', 'database.yml')`と書いた場合も、`Rails.root.join('config/database.yml')`と書いた場合も、どちらも同じようにファイルの存在チェックに成功しています。

## まとめ："/"で区切る書き方でも問題ないのでは？

どちらが絶対に正しい書き方、というのはないと思いますが、短くシンプルに書ける「`/`で区切る書き方」を積極的に採用するのは悪くない考えだと思います。

もし「パスの区切り文字が`/`とは限らないから（Windows環境が心配だから）」という理由で`Rails.root.join('spec', 'fixtures', 'sample.csv')`のような書き方をしている人がいたら、次回から`Rails.root.join('spec/fixtures/sample.csv')`のような書き方も検討してみてください。

また、`Rails.root.join('spec', 'fixtures', 'sample.csv')`の方がメリットが大きい、という方がいたら、コメントをお待ちしています。

## 補足１："/"で始まるパスを渡さないように注意！

ただし、この書き方には1つだけ注意点があります。それは「`/`ではじまる文字列を引数として渡さないこと」です。
`/`で始まる文字列を引数にすると、プロジェクトルートのパスが付与されず、引数がそのまま絶対パスとして扱われます。

```ruby
# OK: 最初に"/"を付けない場合→プロジェクトルートのパスが付与される
Rails.root.join('spec/fixtures/sample.csv').to_s
#=> "/Users/jnito/dev/rails-sandbox/spec/fixtures/sample.csv"

# NG: 最初に"/"を付けた場合→プロジェクトルートのパスが付与されない
Rails.root.join('/spec/fixtures/sample.csv').to_s 
#=> "/spec/fixtures/sample.csv"
```

`Pathname#join`メソッドがなぜこのような振る舞いをするのかについては、以下の記事で詳しく説明しています。

- [Pathname\#joinは単純に複数の文字列を連結しているだけではない、という話 \- Qiita](https://qiita.com/jnchito/items/7393c26490b075456154)

## 補足2：Rails.rootメソッドが返すオブジェクトは何？

`Rails.root`メソッドが返すのはRuby標準の`Pathname`オブジェクトです。

```ruby
Rails.root.class
#=> Pathname
```

また、`join`メソッドもRuby標準の実装が使われています。（ActiveSupportによって拡張されているわけではありません）

```ruby
Rails.root.method(:join).source_location
#=> ["/Users/jnito/.rbenv/versions/2.6.5/lib/ruby/2.6.0/pathname.rb", 407]
```

`Pathname#join`メソッドの仕様については以下のドキュメントを参照してください。

- [Pathname\#join \(Ruby リファレンスマニュアル\)](https://docs.ruby-lang.org/ja/latest/method/Pathname/i/join.html)
$PATHを$PASHと間違えた話

# composerのパスを間違えた
```zsh:zsh
export PATH="$HOME/.composer/vendor/bin:$PASH"
```
PASHってなんだよ
パシュってなんだよ
赤ちゃんかよカワイイな

# 結果
#### sudo: command not found
zsh「すどーって何？」
#### vim: command not found
zsh「びむってなーに？」

...?
zshで全てのコマンドが使えなくなっただと？！

#### .zshrc ファイルを直にダブルクリックで書き換えを試みる
**「**あなたはファイル“.zshrc”の所有者ではなく、そのファイルに書き込む権限がありません。**」**
　
　

**zshが死んだ。この世の終わりだ**


# 対応
トイレに籠って冷静になって

```bash:俺たちのbash
sudo vim .zshrc
```
これでPASHを修正。zsh復活

**ありがとう、bash**

# 学び

タイポは死を招く
GitHub　ローカルとリモート

前提）
git.hubの「アプリ(Github Desktop)」と「プラウザ」がある状態
アプリ開発中
自分のブランチ名）top-view
****
使用例）
担当部分の作業をpushしたい
****
１、アプリ(Github Desktop)＝ローカル
-
自分のブランチ（top-view）にいることを確認
→Commit（タイトル名記入）
→push(fetch origin)
→create pull requiest
→リモートにいく

２、Githubプラウザ＝リモート
-
pull requestがきてる
→内容大丈夫ならmerge
→confirm merge
→ローカルへいく

3,アプリ(Github Desktop)＝ローカル
-
masterブランチに変更
→fetch　origin
→pull origin
→自分の記述内容(top-view)が本体へ反映される
RailsでGenerateしたらArgumentErrorで怒られた話

ルー大柴みたい

Railsチュートリアルも完走したし、オリジナルWebアプリ作るぞーと意気込んでGenerateしてみたところ、
ArgumentErrorと怒られたのでその備忘録です。

```Terminal
$ rails generate controller Companys show
Traceback (most recent call last):
        58: from bin/rails:4:in `<main>'
        〜〜省略〜〜
         1: from /Library/Ruby/Gems/2.6.0/gems/actionpack-5.1.6/lib/action_dispatch/routing/mapper.rb
            :307: in `check_controller_and_action'
/Library/Ruby/Gems/2.6.0/gems/actionpack-5.1.6/lib/action_dispatch/routing/mapper.rb
:327:in `check_part': Missing :controller key on routes definition, please check your routes. 
(ArgumentError)
```

#`ArgumentError`とは

![PixelSnap 2020-02-18 at 07.41.04@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532774/7b9e2fd9-2579-683e-0056-6e2d677b95ca.png)

>メソッドの引数が正しくない時や足りない時に発生するエラーです。

>wrong number of arguments (given 0, expected 1+) というエラーメッセージが表示されています。
これは 引数の数が間違っています（現状０個です、正常な引数の数は１個以上です） という意味です。
つまり form_for のメソッドの引数が足りないために起こっているエラーだということが分かります。

>メソッドのリファレンス(http://railsdoc.com/)を見ながら、正しい引数が設定されいるかを確認し修正すると解決できることが多いです。

[参考記事「エラーメッセージから学ぶ」](https://diveintocode.jp/blogs/Technology/ErrorCollection)

なるほど、ArgumentErrorは引数のエラーなんですね
そしてエラー文を読み込むのが大事と。



#エラーメッセージに立ち返る

>`Missing :controller key on routes definition, please check your routes. (ArgumentError)`
>「routes上にあるコントローラーのキーが未定義ですので、routesを確認してね。」

なんかよくわからんけど、`please check your routes.`って言われたし仕方ねえ確認してやるか。

```routes.rb
Rails.application.routes.draw do
  root 'static_pages#home'
  get ''  # <= 何これ？
end
```

とりあえず削除してみて、もう一度generateしてみる

```Terminal
$ rails generate controller Companys show
      create  app/controllers/companys_controller.rb
       route  get 'companys/show'
      invoke  erb
      create    app/views/companys
      create    app/views/companys/show.html.erb
      invoke  test_unit
      create    test/controllers/companys_controller_test.rb
      invoke  helper
      create    app/helpers/companys_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/companys.coffee
      invoke    scss
      create      app/assets/stylesheets/companys.scss
```

上手く行った！！！

#結論：作業途中のコードを放置するのはやめよう

そう心に誓いました。