OmniAICreator/Qiita-1.07M huggingface dataset:
[自分用備忘録]Rails開発で忘れちゃいけない初歩の初歩


自分は初学者なので、新しいものを勉強しては基礎を忘れる段階にいます。
なので自分用に備忘録として忘れちゃいけないRails開発の基礎の基礎を記録しておきます。


#MVCアーキテクチャ


http://〜
↓
Routes.rbファイルでルーティングを確認
↓
(C)コントローラでアクションの確認→(V) 対応するアクションのビューファイルをとってくる
↓
(M)モデルとやりとりする(モデルはアプリケーションの根幹となる部分)

だから開発の流れは基本的に
ルーティング設定する→コントローラでアクション設定する→そのアクションに対応するビュー作る。

#$rails routesで今設定されてるルーティングが確認できる

routes.rbにrootとか設定したら、$rails routesでルーティングの確認してみて。

Rails6以降なら--expandedオプションつけてもっと詳細も確認できる。

####主な使い所 redirect_toのpath指定先チェック

createアクションでフォームに入力された値を取ってきてDBに保存&そのデータを表示するshowアクションにredirectしたい
↓
rails routesで確認。

| Prefix | Verb | URI Pattern | Controller#Action |
|:------:|:----:|:-----------:|:-----------------:|
| article| GET  |/articles/:id(.:format) |articles#show|

↓
article_pathで飛ばせる。
でもURIパターンが`/articles/:id(.:format)` になってるから、
この場合はarticle_path(@article)になる。
そしてこれショートカットで@articleだけでも同じ結果になるらしい。





#railsコンソールでコントローラに書いてること確認できるよ

コマンドで`$rails c`すると、irb> が起動される。

articleモデルがあるならarticle.allとかarticle.findとかできるので、そこでとってきたいデータがとれるか確認したらコントローラに書けばおk。

当たり前だしほんとはコンソールで動き確認しつつ開発するのが普通だと思うんだけど、やり方覚えちゃうとついつい忘れがち。気をつけるっ


#コントローラ名は_で繋げる&複数形だよ。

(例)
articles_controller.rb
pages_controller.rb

一回_じゃなく.でつなげちゃって、永遠エラーに悩まされるという初歩的なミスをやらかしたので注意！


#deleteとdestroyの違い

deleteはActiveRecord(RubyとSQLの翻訳機)を介さずに削除する。
destroyはActiveRecordを介して削除する。




#viewで使いまくりなテーブルの作り方

tableの中にthead, tbodyからの中にtr、thの流れ。

```
<table>
    <thead>
        <tr>
            <th>Title</th>
            <th>Description</th>
            <th>Actions</th>
        </tr>
    </thead>

    <tbody>
        <% @articles.each do |article| %>
            <tr>
                <td><%= article.title %></td>
                <td><%= article.description %></td>
                <td>placeholder</td>
            </tr>
        <% end %>
    </tbody>
</table>
```

ちなみにslim導入時での書き方は以下。

```
table
  thead
    tr
      th
        | Title
      th
        | Description
      th
        | Actions
  tbody
    - @articles.each do |article|
      tr
        td
          = article.title
        td
          = article.description
        td
          | placeholder
```
[npm]依存関係の解決に必要だった前提知識たち

#目的

- 環境構築で依存関係のエラーが頻発した私が、そもそも論に立ち戻って、依存関係ってなに？を解決する。

#今日やること
- npmの役割、依存関係とは何か、そもそもなぜそれらが必要か、処理の意味をまとめる。

記事作成、自環境での作業は、特に[こちらの記事](https://qiita.com/righteous/items/e5448cb2e7e11ab7d477)と[こちらの記事](https://bagelee.com/programming/npm-package-json-dependencies/)を参考にさせていただきました。

#npmとは?

>パッケージを操作するための CLI(コマンドラインインターフェイス; コマンドラインから実行できるプログラム)

>npm (node package manager) はその名の通り Node.js のパッケージを管理するための CLI であり、パッケージを作成したり、NPM 上のパッケージをローカルにインストールしたり、自分のパッケージを NPM に公開したりと、Node.js の開発に欠かせないツールである。Node.js をインストールすると自動的に npm もインストールされる。

#依存関係とは？

私自身が理解しておきたかった点ですが、そもそもの大前提として、フレームワークなどを使うにはパッケージが必要です。そしてその必要なパッケージ郡をまとめたものがpackage.jsonに入っています。
（あれ？最初からpackage.jsonが用意されている状況下では、initしたらinstallせずともされるのかな？）

#package.jsonを作る
１からプロジェクトを作る場合は、初期化をすることでpackage.jsonを作成できます。

```
npm init
```

対話形式で質問がでてくるが、全てEnterでよい。質問をスキップする場合は```-y```オプションをつけておく。

#依存関係のあるパッケージを追加する（フレームワークなどに必要なパッケージをいれる）

２つの方法があります。

##先輩の環境をコピーする　OR　自分でpackage.json書いたのでパッケージを追加したい。


```
npm install
```

使用シーンはこのような場合のようです。

>- GitHub 上のパッケージを開発/実行したいので、新しいマシン上に clone してきた
- create-react-app などの、新しくプロジェクトを生成するツールを使ってパッケージを作成した
そのツールが自動で npm install まで実行してくれることもある
- node_modules 内のファイルを誤っていじってしまい、一旦 node_modules ごと削除した


##一つずつインストールする

```
npm install [パッケージ名]
```

どちらでinstallした場合も、package-lock.jsonに追加されます。

#package.jsonとpackage-lock.jsonって何がちがうの？


[こちらの記事](https://qiita.com/risto24/items/18837cc4eef176e8b6c7)でとてもシンプルに説明してくださっています。

>**package.json**
買い物リスト
>**package-lock.json**
買ったものリスト

インストールが終わったものは、package-lock.jsonに記述されます。


#Git管理は必要？

ローカルと全く同じものをGitにあげるのは、意味がないし、なんならローカルとGITとでverが同じなのかという懸念も生じる。そのため、node-modulesはgitignoreファイルにいれておくとよい。

（node-modules自体が何をしているのか公式をみても理解できなかったので追って学ぶ。）

##@righteousさま　にnode-moduleが何か？おしえていただきました。ありがとうございます。

>基本的には単にインストールしたパッケージが node_modules ディレクトリの中に置かれるというだけです。ただし、そこにあるパッケージがexportしているもの(正確には、そのパッケージの package.json にかかれている main の JS が export しているもの)は、自分のコードから require("パッケージ名") で import できるという、特別ルールがあります。

node-moduleは、パッケージが入っている箱で、
packege.jsonは、インストールしたいパッケージリストで、特別な使い方があると理解しました！


#npmとyarnの違いは？



2019年ごろからFacebook社により開発されたyarnも使われはじめ、npm欠点を補っており人気。
両者の違いは、世界最大規模なので対応の多さのnpm、速さとセキュリティーのyarnと理解した。
両者の学習コストは高くない模様
pipenv installでPipfileとPipfile.lockが作れない時の対処法

DjangoでWebアプリを作ろうとした際、pipenv installを指定のディレクトリ上で実行してもPipfileとPipfile.lockファイルが出てこなかったので対処法をご紹介します。

#環境
・Python version => 3.8.3
・macOS Catalina

#解決方法

自分の場合は超単純でした。

・ウイルスバスターの制限を解除する
・再実行する

----------以上------------
DuckDuckGoのBang検索 + google(日本語ページのみ) + google(英語ページのみ)でChromeの検索を快適に

![Peek 2020-07-23 11-53.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177/299556e5-a6b9-0702-b00b-92f07eb7a1e6.gif)

- [探しものがはかどる検索エンジンDuckDuckGo、NDC順Bangリスト 読書猿Classic: between / beyond readers](https://readingmonkey.blog.fc2.com/blog-entry-799.html)
- [DuckDuckGo !Bang](https://duckduckgo.com/bang)

少し前にDuckDuckGoにBang検索なるものがあることを知りました。
これと、自分が設定している、google日本語ページのみ、google英語ページのみの設定を組み合わせれば検索がより快適になるのではないかと思ったので試してみました。

## tl;dr

Google ChromeのSettingsから設定を行います。

Settings -> Search engine -> Manage search engines -> Other serch engines -> Add

```
Search engine: google(english)
Keyword: e
URL: https://google.co.jp/search?q=%s&lr=lang_en&hl=ja
```
```
Search engine: google(japanese)
Keyword: j
URL: https://google.co.jp/search?q=%s&lr=lang_ja&hl=ja
```
```
Search engine: duckduckgo
Keyword: d
URL: https://duckduckgo.com/?q=%s
```

## DuckDuckGoのBang検索とは

`!` + `サイトに紐づけされたkeyword`で特定のサイトに絞った検索ができるようになります。
例えば
!gh kubernetesとすれば、GitHubでkubernetesを検索することができます。

## 使い方

最初に張ったgifを見るとわかりますが、Chromeの検索バーにて

`keyword 1文字` + `Tab` + `検索ワード`で検索を行います。

プログラミング中に調べ物をするときは基本英語の検索結果を使うので、自分が一番よく使うkeywordはeです。

英語でうまく検索できないとき、日本語の情報を調べたい時にはjを使ってます。englishのeとjapaneseのjなので覚える負荷はほとんどありません。

このように無限にkeywordを増やしていけば自分が狙った検索結果を得られるわけですが、たくさんkeywordは覚えられませんし、設定してもほとんど使わないと思われます。そういった理由でこれまではこの二つを設定していました。

しかし、DuckDuckGoのBang検索があることをしりBang検索と組み合わせて自分の狙ったサイトから検索できるのではと思いついたのです。

これを思いついたときにはDuckDuckGoをデフォルト検索エンジンにして、そこからなんでもbangで調べればいいのかと思ったのですが、各サービスへの検索がDuckDuckGo経由になるので検索結果の表示が1テンポ遅れてしまうこと、毎回Bangキーワードを打つのが面倒くさいという理由でこの3つにしました。

1文字のキーワード3つなら覚えるのも容易いし、今のところ迷うことなく快適に使えています。
初心者によるプログラミング学習ログ 379日目

#100日チャレンジの379日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
379日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日の作業・やったこと⇩<br>●ブログ1記事作成<br>●プログラミング学習379日目 1.5h<br><br>予定があって、勉強時間少なめ。<br>あと、夜中うなされていたらしい<a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a></p>&mdash; ぱぺまぺ@社畜✕投資✕ブロガー (@ppmp65) <a href="https://twitter.com/ppmp65/status/1286034871320625152?ref_src=twsrc%5Etfw">July 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ファイル末尾に改行がないと怒ってくれるGithubActionsでも使えるbashスクリプト

行儀がよくないエディタがあるのを知った。
中身があるのに、最後の行が改行で終わってくれない。
[調べると、POSIXのファイル仕様に違反するらしいがよくわからん。](https://www.google.com/search?client=firefox-b-d&q=posix+file+%E6%94%B9%E8%A1%8C+%E7%B5%82%E3%82%8F%E3%82%8A)

動きはするが、とても気持ちが悪い。
そこで、レポジトリにこのようなファイルがあると、Github Actionsで怒られるようにした。

# bashスクリプト

以下のbashスクリプトをレポジトリに入れておく。

動作としては、`find`で対象ファイル一覧を作って、参考文献のカッコいい方法で各ファイルの末尾をチェックしていく。
違反ファイルがあると、ファイル一覧を出力してエラー終了する。

ファイル数は大したことない前提で見やすい書き方にしている。対象ファイルが多い場合は、エラーファイルを溜めないようにループするように書き換える必要があると思う。

## コード

```bash:./scripts/check_endoffile_with_newline.sh
#!/bin/bash

# 対象ファイルのリスト
#   一部パスを除外している
#   対象は拡張子で指定している
files=$(find . \
             -not -path "./node_modules/*" -not -path "./public/*" \
             -not -path "./vendor/*" \
             -type f -regex '.*\.\(rb\|erb\|css\|scss\|js\|yml\)')

error_files=""
for file in ${files}; do
    # 改行で終わってないファイルを探し記録する
    # 参考: https://qiita.com/BlackCat_617/items/c0d7f7378bc55b3e07d0
    if [ `tail --lines=1 ${file} | wc --lines` == 0 ]; then
        error_files="${error_files} ${file}"
    fi
done

if [ "${error_files}" == "" ]; then
    echo "Good."
    exit 0
else
    echo "[ERROR] There are some files without newline in end of file."
    for file in ${error_files}; do
        echo "  ${file}"
    done
    exit 1
fi
```

```bash:追記：gitのls-filesを使えばGit管理下のファイルを対象にできる
files=$(git ls-files | \
            grep --invert-match '\.keep$' | \
            grep --invert-match '\.png$' | \
            grep --invert-match '\.ico$' | \
            grep --invert-match '\.yml\.enc$')
```

## 実行例

```shell-session
$ ./scripts/check_endoffile_with_newline.sh
[ERROR] There are some files without newline in end of file.
  ./config/locales/models/ja.yml
  ./app/views/users/new.html.erb
  ./app/views/users/show.html.erb
  ./app/views/layouts/_footer.html.erb
  ./app/views/layouts/_header.html.erb
  ./app/views/shared/_error_messages.html.erb
  ./app/assets/stylesheets/header.scss
  ./app/assets/stylesheets/footer.scss
```

# Github Actionsの設定

以下のように、好きな名前をつけてスクリプトを実行する。

## コード

```yaml
# ～省略～
    - name: End of File with Newline
      run: ./scripts/check_endoffile_with_newline.sh
# ～省略～
```

## 実行例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/ad5fcba0-4aaa-ec55-d0a6-eb756e2837cc.png)

# 所感

- 「人がコードの指摘をする」のは指摘するほうもされる方も消耗していく
- 機会的な指摘だと、指摘された方は消耗しづらい
- コードレビューはできる限り自動化していこう

# 参考

- [Qiita記事：ShellScript: テキストファイル末尾が改行かどうか調べる．](https://qiita.com/BlackCat_617/items/c0d7f7378bc55b3e07d0)
気軽に追加できて5W1Hで書けるGitHub/GitLabのIssue/プルリクテンプレートを作った

## はじめに

知人数人と開発をしていて、リモートリポジトリに GitHub を使っていたのですが、Issue の品質に統一感がなく、見づらいことがありました。

そこで Issue の品質を統一しようと思い、Issue テンプレートというものがあることに気づきました。Issue テンプレートの勉強をかねて、5W1H で書けるテンプレートを作成し公開しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16539/3a84bd45-a557-41c7-cf71-f2e5c5e2cf9f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16539/2b37d925-4988-6a17-39e7-6d3c69f19044.png)

興味がある方は以下のリンクからテンプレートをダウンロードして使ってみてください。導入の仕方も下記リンクに記載してあります。GitHub や GitLab に不慣れな方でも、手順に沿って気軽に追加できるよう意識して作りましたので、是非一度お試しください。

[Yasuhisa/GitHubTemplate](https://github.com/Yasuhisa/GitHubTemplate)

また、私が所属するチームでは、GitHub 以外に GitLab を使うプロジェクトもありましたので、GitLab の Issue テンプレートも作成し追加しました。

## Issue テンプレートの追加の仕方

1. [リポジトリ](https://github.com/Yasuhisa/GitHubTemplate) のコードをダウンロードします。（方法がわからなければお使いのブラウザでリンク先にアクセスし Code → Download ZIP の順にクリックして解凍してください）
2. お使いのリモートリポジトリに合わせたディレクトリ（`.github` もしくは `.gitlab`）をコピーします。
3. お使いのリポジトリの直下（ルート）にペーストします。
4. 追加したファイルをリモートリポジトリへ push します。

## 追加されるもの

- Issue テンプレート
  - Issue の概要
  - 何をすれば Issue が解決するか、追加/変更/削除する点
  - 参考リンク（あれば）
- プルリクエスト/マージリクエストテンプレート
  - 変更点
  - レビューで見てほしいポイント（要レビュー時記載）
  - 関連 Issue
  - 参考リンク（あれば）
- リポジトリのガイドライン（CONTRIBUTING.md）
  - このリポジトリへプルリクエストを送るには
  - Issue の作り方
  - ブランチの作成例
  - Pull Request の作り方

Issue は「機能追加」と「動作不良」の 2 種類のテンプレートが追加されます。機能追加は `enhancement` ラベル、動作不良は `bug` ラベルが自動で付きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16539/e87015c7-e609-d3e0-d594-47b198763096.png)

## 実際にこのテンプレートを使った Issue と Pull Request 例

- [Issue](https://github.com/Yasuhisa/GitHubTemplate/issues/1)
- [Pull Request](https://github.com/Yasuhisa/GitHubTemplate/pull/2)
- [リポジトリのガイドライン（CONTRIBUTING.md）](https://github.com/Yasuhisa/GitHubTemplate/blob/master/.github/CONTRIBUTING.md)

## おわりに

プロジェクトによってリポジトリの運用ルールはさまざまありますが、汎用的に使えそうな内容にしました。

5W1H の Issue を強制することは少々面倒になりますが、よくわからない Issue を作らないことで、後々のコミュニケーションを円滑に進められるかと考えています。

もし追加の要望などがあれば、上述のリポジトリへ機能追加の Issue を作成していただけたら幸いです。

## 参考

- [リポジトリ用に Issue テンプレートを設定する - GitHub Docs](https://docs.github.com/ja/github/building-a-strong-community/configuring-issue-templates-for-your-repository)
- [Description templates | GitLab](https://docs.gitlab.com/ee/user/project/description_templates.html)
イーサネット経由でシリアルポートを共有

##ネットワーク上でCOMを共有する方法
特殊なシリアルポートデバイスをネットワークに接続するには、まず、ネットワークシステムのすべてのマシンにシリアルオーバーネットワークソフトウェアをインストールする必要があります。

次に、インターネット対応デバイスとの間のデータ転送を有効にする必要があります。

これは、これを行う方法です。

1. 必要なシリアルデバイスが直接接続されているコンピューターのシリアルイーサネットコネクター。メインメニューの「サーバー接続」を選択し、接続パラメーターを設定します。 「サーバー接続の作成」をクリックします。これはLAN上のCOMポートを共有します

2. リモートマシンでアプリを起動します。 「クライアント接続」タブを開き、必要な設定を行います。 「サーバー」コンピューターで共有されているCOMポートを指定し、「クライアント接続の作成」をクリックします。


それでおしまい！これで、リモートシリアルポートデバイスからのすべてのデータは、デバイスがそのPCに物理的に接続されているかのようにクライアントコンピューターに表示されます。特に便利なのは、必要なリモート機器に接続するための追加のワイヤ、ケーブル、ハードウェアが不要なことです。


###ネットワーク経由でシリアルポートする方法

COM over networkソフトウェアは、リモートシリアルデバイスと情報システム間の安全な接続を作成および維持するための簡単な方法を提供します。 [Serial to Ethernet Connector](https://www.serial-over-ethernet.com/serial-over-lan/)（SEC）などの専用アプリケーションを使用すると、データは暗号化されたチャネルを介して転送され、手動で入力する必要はありません。これは、人為的ミスの余地がないことを意味します。

また、ワイヤレス通信により、迅速かつ頻繁なデータ更新が保証されるため、意思決定を迅速化し、ワークフローの効率を向上させることができます。

シリアルイーサネットコネクタは、有線ネットワークと無線ネットワークの両方で完全に機能します。イーサネットとインターネットを介してCOMポートを共有できます。

専用ソフトウェアは、選択したデバイスにあるシリアルポートの仮想コピーを作成するように設計されています。これらの仮想COMポートにより、特定の機器をネットワーク上の任意のソフトウェアプラットフォームに接続できます。


###LANを介したシリアルポートへのリモートアクセスの代替ソリューション

前述のように、Serial to Ethernetソフトウェアは、LAN経由でCOMにアクセスする最も簡単な方法です。ソフトウェアはインストールと使用が簡単で、複雑な設定やプログラミングのスキルは必要ありません。または、ハードウェアRS232からLANへのコンバーターとCOMポートを共有して、最適なソリューションを確認することもできます。

管理モジュールコマンドラインインターフェイスとDPCProxyユーティリティを備えたIntel Serial over LAN

管理ワークステーションまたは中央ネットワークプロキシで実行されているクライアントソフトウェアからLAN経由でベースボード管理コントローラー（BMC）に接続する必要がある場合は、IntelシリアルオーバーLANコマンドラインインターフェイスとDPCProxyユーティリティを使用してこれを行うことができます。

DPCProxyユーティリティは、WindowsサービスまたはLinuxのデーモンとして実行できることに注意してください。管理コンソールまたは集中サーバーにインストールできます。また、どちらのシステムで実行しているOS（WindowsまたはLinux）でも、管理コンソールからDPCProxyへのTelnetセッションを開始する必要があります。

リモートサーバーへのTelnetセッションを開始するには、次の操作を行います。

OSのコマンドプロンプトで、「telnet xxx.xxx.xxx.xxx 623」と入力します。
♦xxx-ネットワークプロキシを実行しているシステム（中央ネットワークサーバーなど）のIPアドレス。ローカルシステムの場合は、代わりに「localhost」と入力します。
♦623-Intelコマンドラインインターフェース接続に使用されるデフォルトのUDPポート。
次に、「サーバー：」というプロンプトでサーバー（接続先）のIPアドレスを入力します。
その後、ターゲットシステムのBMCユーザー名とパスワードを入力します。認証が完了すると、ログインが成功したことを示すメッセージと「dpccli>」プロンプトが表示されます。
次に、コマンドプロンプトで「console」と入力します。これにより、SOLモードへのリダイレクトが開始されます
SOLを終了するには、「〜」を使用します。
これらの簡単な手順を使用すると、Intel Serial over LANオプションを使用してCOMポートを操作できます。

LAN経由でArduinoにアクセスする

ネットワーク経由でArduinoと通信する簡単な方法を探している場合、便利なアプリswDuino 2.0がこの目標の達成に役立ちます。

###Arduino
swDuino 2.0は、インタラクティブなヒューマンマシンインターフェース（HMI）を構築するために設計された便利なプログラムです。クライアントソフトウェアとArduinoの間のシームレスな通信が可能になり、ArduinoにWeb APIを介してリモートで接続されたデバイスを監視および制御できます。この無料のソリューションのおかげで、HTTPプロトコルをサポートするクライアントプログラムは、LAN経由でArduinoと変数を交換することができます。

[swDuino 2.0](http://www.swduino.com/?tab=download)は専用のプラグアンドプレイArduinoライブラリを提供し、Arduinoでの作業のためにSerial over LANにアクセスできるようにします。また、このWindowsベースのソフトウェアには組み込みのマルチスレッドHTTP / Webサーバーがあり、ArduinoセンサーのデータをSQL、MySQL、Oracleなどのコンピューターデータベースに保存できます。

#####結論

他のSerial over LANソリューションと比較して、COM to Ethernetコネクタは、ネットワーク経由でシリアルデバイスを共有するためのより効率的で安全な方法のようです。このアプリを使用すると、シリアルPOSデバイスから中央サーバーにデータを簡単にリダイレクトできます。この優れた機能のおかげで、このユーティリティは、コンピューターからの距離に関係なく、必要なPOSデバイスへのアクセスを簡単にしますが、ハードウェアベースのソリューションは距離によって制限され、そのような機会を提供できません。また、この効率的なプログラムは、机の上の大量のケーブルを扱いたくない人にとって完璧なツールになります。
pythonのfor文でリストの要素とインデックス同時に取り出す方法(enumerate関数)

普通(?)だったら

```python
list = ['a','b','c','d']
for i in range(len(list)):
    print(i,list[i])
```
と書くが
enumerate関数を使うと

```python
list = ['a','b','c','d']
for index,value in enumerate(list):
    print(index,value)
```
と書ける．


```:実行結果
0 a
1 b
2 c
3 d
```

### 参考文献
[現場で使える! Python深層学習入門 Pythonの基本から深層学習の実践手法まで](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Python%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80-Python%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%8B%E3%82%89%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%81%AE%E5%AE%9F%E8%B7%B5%E6%89%8B%E6%B3%95%E3%81%BE%E3%81%A7-AI-TECHNOLOGY/dp/4798150975)
DevOpsとは何か

# 要約
開発者(Dev)と運用者(Ops)の協力体制をうたったキーワード。
主に構築やデプロイを安全かつ迅速にに行うことを主軸にしている。


#発祥
DevOpsという言葉は、2009年の米国ITカンファレンスで　Flickrのエンジニア発表されたプレゼンがきっかけで生まれた。
発表「開発者と運用者のコラボで一日に１０回以上デプロイできるようになった件(Flickrで)」
10+ Deploys per Day: Dev and Ops Cooperation at Flickr
その後、ムーブメントにつながる。（アジャイルのブームが根底にある。）

# 発表内容
### 従来の対立構造からの変革
- Devの役割が“システムに新しい機能を追加する”
- Opsの役割は“システムの安定稼働”

そのため、利害が相反する。
しかし、ビジネス要求から来る変化に耐えるために、Devは、Opsが協力し合って、すすめるべき。

###  DevOpsを成り立たせるツール
-  自動化されたインフラストラクチャ： インフラの構築を自動化する。よく使われているツールにはAnsibleやChef、Dockerなどがある
-  バージョン管理システムの共有： Gitなどの同じバージョン管理システムをDevとOpsで共有する
- ワンステップによるビルドとデプロイ： 手順書などを使い、手動でビルドやデプロイをするのではなく、ビルドやデプロイを自動化する。
- フィーチャーフラグ： アプリケーションの中に新たな機能（feature）を組み込んでおくが、その機能を有効にするかどうかは設定ファイル（＝フラグ）によって決めるというテクニック。リリースのタイミングと機能の有効化のタイミングを分けることができる。一方でこのテクニックを使うと、機能を有効化するには設定ファイルを配置し、機能を無効化する際に設定ファイルを削除するだけで済み、機能を無効化にするためだけのリリースが不要になる。
- メトリクスの共有 ： 取得したメトリクスの結果をダッシュボードでDevとOpsでお互いに共有する。
- IRCとインスタントメッセンジャーのBot： Slackなどのチャットツールに自動的にビルドやデプロイのログ、アラート内容を投稿する仕組みを作ることで情報をお互いに共有する

### DevOpsであるべき組織文化
- お互いを尊重する
- お互いを信頼する
- 失敗に対して健全な態度を取る
- 相手を非難しない（Avoiding Blame）
投稿リスト

## JavaScript

* [JavaScript勉強してみた（基本編）変数・配列・関数
](https://qiita.com/kobayashi_tatsuya/items/4b57574fcc3ba881a104)
* [JavaScript オブジェクトとかクラスとか](https://qiita.com/kobayashi_tatsuya/items/bfbad58dfa3c0c71c44d)

## Vue.js

* [Vue.js勉強してみた　～オプションオブジェクト編～](https://qiita.com/kobayashi_tatsuya/items/248a233765d3a42969de)
* [Vue CLI](https://qiita.com/kobayashi_tatsuya/items/24915eb04dfa30d27ec3)

## その他、メモなど。
* [postgreSQL環境作成](https://qiita.com/kobayashi_tatsuya/items/d501753402a87274a2c9)

## いずれしたい(memo)
- Google Apps Script
- RPA
- サーバ構築
- nginx
- rtmp
- VR
- Python
What is Fiber Array (FA)?

Fiber Array (FA for short) is an array formed by installing a bundle of optical fibers or a fiber ribbon on the substrate at specified intervals by using a V-Groove substrate.

An optical fiber array in optical communication mainly includes a substrate, a pressing plate, and an optical fiber. Usually, a plurality of grooves are cut on the base of the substrate, and the optical fiber is fixed into the groove by the pressure plate. Optical fiber arrays have high requirements on materials and manufacturing processes.

Fiber array is usually located by the precision carved V-shaped grooves. The V-groove requires special cutting process to achieve precise fiber positioning. In order to reduce the connection fiber loss, it’s very important to accurately position the fiber core in the V-groove. After positioning, pressurize with a compactor and fix it with an adhesive to polish the end face of the optical fiber. That is the final fiber array. The substrate material will affect the optical performance of the optical fiber array, and it is necessary to use a material with a small expansion coefficient to ensure that the optical fiber array has no stress, high reliability, and no fiber displacement at high temperatures. Glass and silicon are commonly used materials, in addition to ceramics, conductive substrates and plastic substrates.

![150.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/e11d4dc9-565d-8c88-19ad-6087c8565399.jpeg)

The distance between the grooves of the V-shaped groove, the number of fiber channels, and the grinding angle are all customized according to the needs. The parallelism of the groove length direction between the grooves is usually within ± 0.1 degree. Most of the fibers used in FA are colored ribbon fibers, which have good bending resistance, and the colorful colors can easily distinguish the channels.

![151.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/036e6dde-b423-f378-1a94-490ee171312d.jpeg)

Fiber arrays are usually used in planar optical waveguides, arrayed waveguide gratings, active/passive array fiber devices, micro-electromechanical systems, multi-channel optical modules, etc. Among them, the optical fiber array is one of the important components of the PLC Splitter, which can greatly reduce the loss of optical waveguide devices and optical coupling alignment.

HYC provides a variety of choices of fiber arrays, such as the number of fiber array channels, core spacing and grinding angle can be customized. HYC Co., Ltd has been focusing on the OEM/ODM manufacturing of optical passive devices for 20 years. It has a strong R&D team and production capacity.  It can provide customers with one-stop customized production of optical communication passive basic device design, R&D and manufacturing. Product lines mainly include optical fiber connectors, optical fiber jumpers, PLC splitters, wavelength division multiplexers(WDM), MEMS optical switches, etc.
www.hyc-system.com
Automation Anywhere A2019を使って最初につまづくところ

# はじめに
Automation Anywhere Ver11ユーザがA2019(community edition)を使ってみました。あまりWebマニュアルも読まずに触ったら、いろいろつまづいたのでメモ。きっと初心者は同じ道をたどりそうな気がするので少しでも役に立てば幸いです。

# デバイスの接続
「ローカルデバイスに接続」のデバイスユーザとデバイスのパスワードって何？
![device.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/8afdf606-7927-d924-6405-b054fd18583d.png)

- デバイスユーザ名はコマンドプロンプトでwhoamiの結果
- デバイスのパスワードは普通に使う分には不要。スケジュール実行、遠隔からの実行などWindowsログインが起きるときは必要

# 変数の方とアクションでの使用
数字型とか文字列型とか細かく分かれていて、相互に変換するためのアクションもある。
数字変数をメッセージボックスに表示するために、最初は別の文字列変数に変換し文字列変数を表示していた。
でも、実は、メッセージボックス内で変換できるみたい。
![String01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/5de19f85-f1a0-e623-0c6d-ecdaa8d28fc7.png)
 
- メッセージボックスで$を打つと数字変数も選択できる（F2だと文字列しか選べない）
- 最後の$の前にピリオドを打つと変換や操作の手段が選択できる
- $$と最初にドルマークを2個うって、その間に変数名を打っていいくと、変数のサジェストが出て選べる。

# タスク間呼び出しの引数の形式が変わる
特に、子から親へ戻す場合が辞書変数にまとめられる点がVer11と大きく違う。

以下に少しまとめました。
https://qiita.com/etoootak/items/21d5cfc2674dd63bcf4f


# システム変数が結構減っている
ループ内で使うCouner変数とかフォルダ内のファイル一覧でループするときのファイル名、Excelのデータ読み込むときの変数とか、がっさり無くなってて、作り方が変わる。
フォルダ内のファイル一覧でループするときは、自前の辞書変数に名前と拡張子が格納されるのだが、その場合のキーがnameとextension。全部小文字。
（最初に、キーを日本語で{名前}と{拡張子}にしてハマる）。

# MetaBotはどこへ行った
どうもMetaBotデザイナーみたいなものは標準でなくSDKで作らないといけない。ハードル上がっている。あとでやってみようと。
Ver11でもMetaBotは選ばれた人間だけが作る扱いに見えたから、まぁ何で作ろうと構わないかな。


# A2019で便利だな、って思ったところ
まだ全然使い込んでいないが以下は便利だなぁ、と思った。

 - レコーダーが1種類だけで使い分けに悩まなくてよい
 - csvを読んでExcelに書き込みときにテーブル変数使えば１発
 - python呼べる（でも関数の引数が1個だけなのは何故？？）
 - クラウド操作用のアクションが充実している。きっとここが一番のうり（なのかな？）

# さいごに
とか、いろいろ偉そうに書いているけどQiita見渡すと上記のことは全部書いてある。まぁ自分の備忘録（最初はこんなところでつまづいたんだ...）として残してみます。そしてA2019も使いこんでみます。はい。
ウォッチドッグタイマの機能

応用情報技術者令和元年秋期 午前問21


組込みシステムにおける，ウォッチドッグタイマの機能はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c02f65b9-64f3-2959-4a05-cdc4b9dfdc5c.png)


ウィッチドッグタイマで設定されていた時間以内でリセットされる
・正常の場合、定めていた時間内で０にリセット
・異常の場合、リセットができなく、タイマが増え続く

なので、「設定した時間内にリセットが行われなかったのは、システムに異常が起きている」という結果になります。
ノンマスカブル割込みを発生させ、システムに異常を通知するという仕組みです。

**NMI**（ノンマスカブル割り込み：Non-maskable interrupt）とは、その名の通りマスクできない割り込みです。通常の割り込みでは、割り込み要因が発生しても、その割り込みをマスクして受け付けない設定が可能です（マスカブル割り込み：Maskable interrupt　可屏蔽中断　と呼ばれる）。しかし、NMIの場合はマスクができず、NMIの割り込み要因が発生した場合には必ず割り込みを受け付けます。


参照：
https://www.ap-siken.com/kakomon/29_aki/q22.html#:~:text=%E7%B5%84%E8%BE%BC%E3%81%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%EF%BC%8C%E3%82%A6%E3%82%A9%E3%83%83%E3%83%81%E3%83%89%E3%83%83%E3%82%B0,%E3%81%A6%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AB%E9%80%9A%E7%9F%A5%E3%81%99%E3%82%8B%E3%80%82
iCloudで大量のファイル削除

iCloudの空き容量を増やそうとして、750GB分ファイルを削除したけど、なかなか空き容量が増えなかった。その顛末。

### 問題
- iCloudの空き容量を増やそうとして、750GB分ファイルを削除した。
- iCloud（WEB版）で、「最近削除した項目」を「削除（パージみたいなもの？）」すると、①エラーとなり削除できない、②削除しても復活する、等の事象が発生した。

### 原因

アップルのサポートに問合せたら、「iCloud内での解放処理に時間がかかるので、ちょっと待て」とのこと。

### 対策と結果

じっと待つ。

- 解放処理が終わるまでは、Macのシステム環境設定→Apple ID画面で「削除できてない（空き容量が変化しない）」ように見える。
- 解放処理が終っても、Mac側をリブートしないと、「削除できてない（空き容量が変化しない）」ように見える。
- iCloud内での解放処理の時間：約750GBで48Hくらいかかった。
Rootログイン禁止CentOS

# はじめに
CentOSに限らずSSH接続ではRootログイン禁止が一般的です。
今回はこの作業をテーマに行っていきたいと思います。
ユーザーをパスワード認証方式で作成します。

## 環境
■OS
CentOS8

## 全体のながれ
手順１.SSHユーザー作成
手順２.rootと同じ権限を付与
手順３.ID／パスワードを該当ユーザーに渡す
手順４.ログインを確認してもらう
手順５.Rootログイン禁止

## 余談（ログインします）
SSHターミナルを開いて接続してください。
最初はrootユーザーかと思いますので`@`の前はroot、後ろは接続先です。
`root@接続IP`
下記どちらかで接続します。
- パスワード認証
- 公開鍵認証方式（秘密鍵をお持ちの場合）

## 手順１.SSHユーザー作成
ユーザーコマンドで一般ユーザー作成
ユーザの作成コマンドは`useradd`を使用します。わたしの愛飲ドリンクからLipovitanというユーザーを作成したいと思います。
例）`lipovitan`というユーザを作成

```
# useradd lipovitan
# passwd lipovitan
ユーザー lipovitan のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
```

## 一般ユーザーでログインしてみる
作成しただけで安心しないでください。ユーザーログインができるか試験します。
`lipovitan@接続IP`

## 手順２.rootと同じ権限を付与
Rootと同じ権限で操作できるようにする
CentOSの`wheel`というグループに追加されている事が必要です。コマンドの先頭に`sudo`をつけることで root 権限を実行します。作成ユーザを`wheel`グループに追加いたします。

次のコマンドで確認

```
# groups lipovitan
lipovitan : lipovitan
```
グループに追加

```
# usermod -G wheel lipovitan
```

次のコマンドで確認

```
# groups lipovitan
lipovitan : lipovitan wheel
```

- 一般ユーザーでroot権限が使用できるか確認します。

※もし下記のようなメッセージがでても慌てなくて大丈夫です。一般ユーザーで一度`exit`して、もう一度`lipovitan@接続IP`で接続します。

```
$ sudo cd /var/log/

あなたはシステム管理者から通常の講習を受けたはずです。
これは通常、以下の3点に要約されます:

    #1) 他人のプライバシーを尊重すること。
    #2) タイプする前に考えること。
    #3) 大いなる力には大いなる責任が伴うこと。

[sudo] lipovitan のパスワード:
lipovitan は sudoers ファイル内にありません。この事象は記録・報告されます。
```


- `sudo`を使用する度に毎回パスワードが求められる場合

特殊なコマンド`visudo`で`/etc/sudoers`を編集する

```
# visudo /etc/sudoers
```

下記の場所を探します。
先程`whell`のグループに一般ユーザーを追加しましたよね。

```
%wheel  ALL=(ALL)       ALL
```

このグループを下記のように変更します。

```
%wheel        ALL=(ALL)       NOPASSWD: ALL
```
これで毎回sudoを使ったコマンドの実行時にパスワードは求められなくなります。


## 手順３.ID／パスワードを該当ユーザーに渡す
## 手順４.ログインを確認してもらう
## 手順５.Rootログイン禁止
Root権限でSSHできないように設定を変更します。

```
# cd /etc/ssh
# vi /etc/ssh/sshd_config


省略
#PermitRootLogin yes
省略
```

`sshd_config`の`PermitRootLogin`を探します。
コメントアウトされていればコメントを外して`PermitRootLogin no`に設定してください。
コメントアウトされていなければ`PermitRootLogin yes`かと思いますので`PermitRootLogin no`に設定してください。


■SSHターミナルに対して、キーボードの`i`を一度押すと編集モードに切り替わります。
上記の編集作業を書き換えたらキーボードの`esc`を押すと、保存モードに変化します。

- 保存する場合は`command`+`:`に続けて`wq`を押します。
- 保存しない場合は`command`+`:`に続けて`q!`を押してください。

■編集が終わりましたら設定を有効化するために`sshd`を再起動します。

```
# systemctl restart sshd
```

以上で手順は終わりです。お疲れ様でした。
[和訳] ZIO Overview - Summary

Scala開発でZIOを利用する機会があるのですが、公式ドキュメントが英語しかないので自分の理解促進も含めて概要部の和訳をしました。ほとんど直訳です。
以下はhttps://zio.dev/docs/overview/overview_index の和訳です。
# Summary 

ZIOは純粋な関数型プログラミングに基づく非同期及び並列プログラミング用のライブラリです。

ZIOの中核となるのはHaskellのIOモナドから影響を受けた強力なエフェクトタイプ、ZIOです。
ZIOの型はシンプル・タイプセーフな上、テストしたり全体の構成をしやすいコードで複雑な問題の解決を可能にします。

# ZIO


`ZIO[R,E,A]`の型には3つのパラメータがあります。

```
R - Environment型。処理には R 型 の環境が必要です。この型パラメータがAnyの場合、処理は任意の値で実行できるため、その処理に必須の環境要件がないことを意味します(例：uniti値 ())。
E - Failure型。処理が E 型 で失敗する場合があります。一部のアプリケーションではThrowableを使います。この型パラメータがNothingの場合、Nothing型の値がないため、その処理は失敗しないことを意味します。
A - Success型。処理が A 型で成功する場合があります。型パラメータがUnit型の場合、その処理は有用な情報を生成しないことを意味する。Nothing型の場合、効果は永久に（または失敗するまで）実行されることを意味します。
```
例として、ZIO[Any, IOException, Byte]型で実行された処理は必須の環境型はなく、IOException型で失敗するか、成功時はByte型を返すことを意味します。
ZIO[R, E, A]型の値は下記の関数型のより効果的なバージョンのようです。

```
R => Either[E, A]
```
Rを必要とするこの関数は、失敗を表すE、または成功を表すAを生成します。もちろん、ZIO処理は、非同期処理や同時処理などの複雑な処理をモデル化するため、実際には関数ではありません。

# Type Aliases
ZIO型はZIOでの唯一の型です。ただし、一般的なケースを簡略化するタイプエイリアスとコンパニオンオブジェクトのファミリーがあります。

- `UIO[A]` - ZIOの`[Any, Nothing, A]`のタイプエイリアス。環境要件はなく、失敗することはすることはませんがAで成功することができることを表します。
- `URIO[R,A]` - ZIOの`[R, Nothing, A]`のタイプエイリアス。実行にはRを必要とし、失敗することができませんが、Aで成功することができることを表します。
- `Task[A]` - ZIOの`[Any, Throwable, A]`のタイプエイリアス。環境要件はなく、Throwableで失敗するかAで成功することを表します。
- `RIO[R,A]` - ZIOの`[R, Throwable, A]`のタイプエイリアス。実行にはRを必要とし、Throwableで失敗するかAで成功することを表します。
- `IO[E,A]` - ZIOの`[Any, E, A]`のタイプエイリアス。環境要件はなく、Eで失敗するかAで成功することを表します。

これらの型エイリアスにはすべてコンパニオンオブジェクトがあり、これらのコンパニオンオブジェクトには適切な型の値を作成するために使用できるメソッドがあります。

関数型に馴染みがない場合はTask型から始めることを勧めます。Task型は型パラメータを一つだけ扱いかつScalaの標準ライブラリに組み込まれているFuture型に最もよく対応します。

もしCats Effectライブラリを使用している場合は、RIO型を使用すると便利です。RIO型を使用すると、サードパーティのライブラリとアプリケーションを介して環境をスレッドかできるためです。

自分のアプリケーションで使用しているタイプエイリアスに関係なく、UIO型は失敗しない実行処理を書く場合に便利です。(例外エラーの結果も含め)

最後に、経験豊富な関数型プログラマーの場合は、ZIO型を直接使用することをおすすめします。ただし、アプリケーションの様々な部分で独自の型エイリアスを作成すると便利な場合があります。
Github/GitlabのPR/MRテンプレートメモ

Github/GitlabのPR/MRテンプレートについてのメモ書き。

## Github

### ディレクトリ・ファイル

ファイルの拡張子は *.txt* でも可。複数の場合に記載の方法は単一ファイルも可。

単一の場合：.github/<pull_request_template>.md
複数の場合：.github/PULL_REQUEST_TEMPLATE/<pull_request_template>.md

### 複数テンプレート

*template* クエリパラメータを使う。WebUIのサポートなし。

## Gitlab

### ディレクトリ・ファイル

共通：.gitlab/merge_request_templates/<merge_request_template>.md

### 複数テンプレート

上記記法に沿いユースケース毎にファイルを用意する。WebUIのサポートあり。詳細は[using-the-templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates)を参照。

### その他

#### Gitlab Quick Actions

IssueやMRのメタデータ等をテキストで表現できる。例えば、テンプレートファイル内に */labes bug* と記載しておけばわざわざラベルをふる必要がなくなる。詳細は[GitLab Quick Actions](https://docs.gitlab.com/ee/user/project/quick_actions.html)を参照。

## 所感

WebUIからテンプレートを操作する場合、Gitlabのテンプレート選択フィルタが地味に嬉しい。

## 参考

* [Creating a pull request template for your repository](https://docs.github.com/en/github/building-a-strong-community/creating-a-pull-request-template-for-your-repository)
* [Description templates#creating-merge-request-templates](https://docs.gitlab.com/ee/user/project/description_templates.html#creating-merge-request-templates)
【初心者向け】React-ReduxでToDoアプリを作ってみた

#今回は
ToDoリスト応用編ということで
様々な機能を付加してみました。

具体的には
・ログイン機能の実装
・バックエンドとの連携によるトークン認証
などがメインとなってきます。

また今回はReact-ReduxやHooksを用いて
構築を行ってみました。

正直挫折してしまったのですが、
今どこまで出来ているかということを確認して
次に活かしていきたいと思います！

それでは見ていきましょう。

〜ログイン前〜

[Home]
<img width="1139" alt="スクリーンショット 2020-07-23 16.32.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611734/10cdf444-7ff8-9418-23d1-8ac00d629f35.png">
SemanticUIのiconでGitHubネコちゃんを入れてみました
非常に可愛くて癒されますね🐱

[signIn]
<img width="1162" alt="スクリーンショット 2020-07-23 16.32.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611734/2d1cafca-04fd-bd73-ead6-51c6d3557f63.png">
react-hook-formを用いてバックエンドと連携しました
最初redux-formを使っていましたが、こちらの方が使い勝手が良かったです
[signUp]
<img width="1154" alt="スクリーンショット 2020-07-23 16.33.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611734/959aa7a2-8f83-9914-305a-4db95cd65719.png">
↑いらない利用規約
<img width="1141" alt="スクリーンショット 2020-07-23 17.04.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611734/b479b216-7ca5-868d-7e6b-23092781d4ba.png">
ここで登録した要素は、事前にバックエンド側が指定したnameと合わせる必要があります
そうすることでサインイン時にtoken認証が行えます

〜ログイン後〜
[Create]
<img width="1152" alt="スクリーンショット 2020-07-23 16.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611734/020ff5f3-19b0-fa4e-a8c2-720394c61597.png">
ここもreact-hook-formを用いて書いています
signUpでユーザーを作るときと基本的に同じで、
actionを呼び出して処理をさせ、Reducerにかけてstateを更新していきます

[Edit]
<img width="490" alt="スクリーンショット 2020-07-23 16.36.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611734/35f26547-5bcc-66f8-d276-c437609d24a4.png">
ここができていません！
理想は
・ページネーション機能で３つずつ、全ての表示を見れるようにする
・ToDoのひとつひとつのページに遷移できて、以下の編集をできるようにする
　□Title、コンテンツを編集できるようにする
　□そのものを削除できるようにする
なんですが、なかなかうまくいきませんでした、、次回リベンジ！

[signOut]
<img width="1148" alt="スクリーンショット 2020-07-23 16.37.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611734/915b2856-66a1-fda3-002c-6aa8fe4498aa.png">
Sureしたらログイン前（最初はHome）に戻ります☺️
このコンポーネントが一番楽でした！！！


【反省】
・ちょっとずつ理解していない機能を導入していったら分からなくなった
・もっとメモを載せていき、ぱっと見でわかるコーディングを心がければよかった
・Udemyの講座を途中で放置したため、バグの箇所が分からなくなった
→焦らずに一区切りがついてから次のステップに進みたい
・講座が写経にならないように、理解度を確認しながら進めていく

【学び】
・React-Reduxの回し方を理解した
・react-router-domでLinkを使えるようになった
・Hooks（useState）を利用できたので、
　classコンポーネントでstateのバケツリレーをしなくて良くなった
・Hooks（useEffect）、sessionStorageを軽く理解した
・REST API連携の基礎を理解した、もっと自在に扱えるようになりたい


【今後】
ToDoに関しては今後Editの導入やリファクタリングを随時行なっていきます。
GoogleOAuthなどの認証機能も搭載できたら便利かなあと思ったり。
UdemyでJSやReactの講座を受けながら学んでいきたいと思います！
別の言語だとSwiftが少し興味あるかなあ、Macだし。
あとReact NativeでiOSのアプリも作ってみたいです！
TypeScriptもいずれ触れられたらと考えています。
あとNo Codeがどんなものなのか、どこまで自由にできるのか気になるので触ってみたいと思います。
Laravel6.0から"make:auth"が使えない


## 1.趣旨
Laravel6.0から"make:auth"が使えません。。
"make:auth"に変わる手順を記載しました。

```
Command "make:auth" is not defined.  
                                       
  Did you mean one of these?           
      make:cast                        
      make:channel                     
      make:command                     
      make:component                   
      make:controller                  
      make:event         
```

## 2.手順

以下のコマンドを順番に実行します。

```
# composer require laravel/ui --dev
Using version ^2.1 for laravel/ui
./composer.json has been updated
```

```
# php artisan ui vue --auth
Vue scaffolding installed successfully.
Please run "npm install && npm run dev" to compile your fresh scaffolding.
```


```
# npm install && npm run dev
```

必要であれば、マイグレーションしましょう。

```
# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.1 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.07 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.04 seconds)
Migrating: 2020_07_05_105521_create_connects_table
Migrated:  2020_07_05_105521_create_connects_table (0.04 seconds)
```

認証が出てきました！
<img width="1160" alt="スクリーンショット 2020-07-23 18.00.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244070/576f0230-b181-d372-20ee-9c0bd7409839.png">
AttributeError: 'tuple' object has no attribute 'layer'の対処

#はじめに
株価の予測とか色々Kerasを使ってやろうとしたのだがエラーがでて混乱
結局は互換性がないimportをしていたのが原因
##環境
一応
windows10
python3.7
##起きたエラー
```python:qiita.py
AttributeError: 'tuple' object has no attribute 'layer'
```
タプルなんてどこにも見当たらなくてどうしたものかと苦しんでいたら以下の投稿を発見
[kerasとtf.kerasの差分と互換検証 #1](https://qiita.com/saiaron/items/fcfbffb39cbd7294cb15)
読んでみるとこのように書いてあった

*※2の実行時エラー発生（tf-kerasのModelにmb-kerasのLayerを突っ込む）
AttributeError: 'tuple' object has no attribute 'layer't*

どうやら互換性がないものを突っ込むとこのようなエラーが起きるらしい
##対処法
```python:qiita.py
import numpy as np
from tensorflow.keras.models import Model
from sklearn.model_selection import train_test_split
from keras.layers import Input, Dense, LSTM,concatenate,MaxPooling1D
from sklearn.preprocessing import StandardScaler
```
上記が元のimport
２行目と４行目があっていないので合わせたのが下記のimport

```python:qiita.py
import numpy as np
from tensorflow.keras.models import Model
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Input, Dense, LSTM,concatenate,MaxPooling1D
from sklearn.preprocessing import StandardScaler
```
おわり
[Rust/WinRT] async/await構文が実装された

Rust/WinRT は2020年4月30日に最初のプレビュー版が公開されたばかりですが, 急速に開発が進んでいます. 特に, 当初は Rust の async/await 構文に対応していなかった ([issue 80](https://github.com/microsoft/winrt-rs/issues/80)) のですが, 7月8日の[PR 251](https://github.com/microsoft/winrt-rs/pull/251)で async/await 構文が使えるようになりました！ async/await は WinRT の特徴のひとつでもあったので, これはうれしいですね. そこで本記事では Rust/WinRT での async/await の使い方をまとめます.

# PR251 以前

当初は Rust の async/await 構文に対応していなかったため, [IAsyncOperation](https://docs.microsoft.com/en-us/uwp/api/windows.foundation.iasyncoperation-1?view=winrt-19041) や [IAsyncOperationWithProgress](https://docs.microsoft.com/en-us/uwp/api/windows.foundation.iasyncoperationwithprogress-2?view=winrt-19041) のような WinRT の非同期操作を表すオブジェクトが得られたら, `.await` の代わりに `.get()` メソッドを用いてブロックしていました.

例えばウェブサイトに GET リクエストを送り, レスポンスを表示するコードはこうでした (import マクロは自明なので省略).

```rust
use windows::{
    foundation::Uri,
    web::http::HttpClient,
};

fn main() -> winrt::Result<()> {
    // URL を指定
    let uri = Uri::create_uri("https://www.jma.go.jp/jp/week/333.html")?;

    // HTTP クライアントを起動
    let client = HttpClient::new()?;

    // GET リクエストを送信しレスポンスを取得
    let resp = client.get_string_async(uri)?.get()?; // <- ここでブロックしている
    println!("{}", resp);

    Ok(())
}
```

# PR251 以後

crates.io の最新版は本記事執筆時点 (7月23日) では `winrt = "0.7.1"` ですが, PR251はこのバージョンの後にマージされたため, このバージョンではまだ await できません. `"0.7.2"` には取り込まれると思いますが, さしあたり git リポジトリを直接指定して開発版に依存します.

```toml:Cargo.toml
[dependencies]
winrt = { git = "https://github.com/microsoft/winrt-rs" }
futures = "0.3"
```

なお非同期ランタイムとして `futures` を使います. こうすれば, 上のコードは Rust の async/await 構文を用いて次のように書き直せます.

```rust
use windows::{
    foundation::Uri,
    web::http::HttpClient,
};

async fn main_async() -> winrt::Result<()> { // async 関数としてメインの処理を定義
    // URL を指定
    let uri = Uri::create_uri("https://www.jma.go.jp/jp/week/333.html")?;

    // HTTP クライアントを起動
    let client = HttpClient::new()?;

    // GET リクエストを送信しレスポンスを取得
    let resp = client.get_string_async(uri)?.await?; // async 関数中では await できる
    println!("{}", resp);

    Ok(())
}

fn main() -> winrt::Result<()> {
    futures::executor::block_on(main_async())
}
```

なお, PR251以前の書き方も引き続き可能です. async/await が必要ない場合はその方がお手軽です.

# 参考文献

* https://github.com/microsoft/winrt-rs/pull/251
My SQLでフリーワード検索をしたい

##フリーワード検索をしたい
指定した全カラムからワードをあいまい検索する方法。

まずは今のソース

```.sql
CREATE TABLE `search_info` (
  `id` int(50) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `team_name` varchar(80) NOT NULL DEFAULT '' COMMENT 'チーム名',
  `picture` blob COMMENT 'チーム写真',
  `sport_name` varchar(25) DEFAULT NULL COMMENT '競技名',
  `prefectures` varchar(255) DEFAULT NULL COMMENT '活動地域',
  `activity_frequency` varchar(30) DEFAULT NULL COMMENT '活動頻度',
  `day_of_the_week` varchar(21) DEFAULT NULL COMMENT '活動曜日',
  `team_concept` varchar(400) DEFAULT NULL COMMENT 'チームコンセプト',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8
```
###検索準備

検索対象にしたいカラムをFULLTEXTというカラムに追加する。
今回ngramという検索方法を用いるので`WITH PARSER ngram`を追加。
つまり、`FULLTEXT(カラム名) WITH PARSER ngram`となる。

`alter table テーブル名 add　カラム名`でカラムを追加できる。

実施したコードは以下となった。

```.sql
alter table search_info add FULLTEXT(team_name,sport_name,prefectures,activity_frequency,day_of_the_week,team_concept) WITH PARSER ngram
```
結果、FULLTEXT が追加されている↓

```.sql
CREATE TABLE `search_info` (
  `id` int(50) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `team_name` varchar(80) NOT NULL DEFAULT '' COMMENT 'チーム名',
  `picture` blob COMMENT 'チーム写真',
  `sport_name` varchar(25) DEFAULT NULL COMMENT '競技名',
  `prefectures` varchar(255) DEFAULT NULL COMMENT '活動地域',
  `activity_frequency` varchar(30) DEFAULT NULL COMMENT '活動頻度',
  `day_of_the_week` varchar(21) DEFAULT NULL COMMENT '活動曜日',
  `team_concept` varchar(400) DEFAULT NULL COMMENT 'チームコンセプト',
  PRIMARY KEY (`id`),
  FULLTEXT KEY `team_name` (`team_name`,`sport_name`,`prefectures`,`activity_frequency`,`day_of_the_week`,`team_concept`) /*!50100 WITH PARSER `ngram` */ 
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8
```

###検索方法
`MATCH (カラム,カラム,...) AGAINST (ワード [検索モード])`
検索モードが何種類かあり、今回は完全一致の`IN BOOLEAN MODE`を使用する。
（他のあいまい検索、関連度順検索等はページ最下部の参考記事から）

使用してる検索方法「ngram」はデフォで2文字ずつ文字を切り分けているので、
最低2文字のワードが必要。

※変更するには「ngram_token_size=数宇」を設定。
（この値の変更には、SQLインスタンスの再起動が必要。
また、インデックスの再作成も必要。
テーブル、カラム単位で設定は行えない。）
1文字の方が良くないか・・とも考えたが、
メモリの使用量が増える等のデメリットもあり、
実際に、LINEのメッセージやオープンチャット検索でも
最低2文字が必要になっていた為、それに合わせた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384409/822060ce-cd86-03db-08f9-1618b3d9621a.png)

「んな」というワードを検索してみる。

```.sql
SELECT * FROM search_info WHERE MATCH (team_name,sport_name,prefectures,activity_frequency,day_of_the_week,team_concept) AGAINST ('んな' IN BOOLEAN MODE)
```

team_conceptカラムの「んなもんねえ！」が一致し引っ掛かった。
思ったより簡単過ぎた。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384409/f8259198-9010-d151-cb2d-4450c1a43722.png)

##参考記事
[MySQLのN-gramを使った全文検索](https://blog.kozakana.net/2018/05/mysql-fulltext-search-by-ngram/)
Tableauのカスタム分割（split関数）は使用しない方がいいかも

Tableauで文字列を分割する場合、よく用いられるのがカスタム分割です。区切り文字と、何列目を取得するかを指定すると自動で文字列が取得できる優れものです。以下がその設定画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679299/c02866e2-42bd-d583-b526-5d0c1fbee62c.png)

結論から言うと、シンプルな方法で文字列を取得できるのであれば、カスタム分割を使わない方がパフォーマンスが向上する可能性が高いです。

まずカスタム分割がどのように動作しているかを検証してみます。今回は以下のようなオーダー IDの列に対して実行してみます。データソースはSQL Serverです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679299/a4dbad7a-d333-107f-d208-e097a79d0374.png)

「-」（ハイフン）で区切り、3列目を取得するように指定すると、以下のような計算フィールドが生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679299/7506c941-d7de-9c35-81cd-f0edc5f4705e.png)

このSPLIT関数の動作を確認します。以下のメニューからパフォーマンスの記録を実行します。

　ヘルプ -> 設定とパフォーマンス -> パフォーマンスの記録を開始

この状態でカスタム分割の計算フィールドをシェルフに入れるなどして少し操作し、DBにクエリを発行させます。その後、停止します。

　ヘルプ -> 設定とパフォーマンス -> パフォーマンスの記録を停止

Executing Queryをクリックし、SPLIT関数をどのようなクエリで実現しているのか確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679299/fa1feb43-922a-d39b-20a8-f76c05dc9957.png)

凄く長いカオスな式が出てきます。SPLIT関数を汎用的にするため例外処理なども入っているためか、複雑になっています。LTRIM(RTRIM())はTRIMに対応する部分だと思いますので、その中がSPLIT関数に対応する部分になります。

>LTRIM(RTRIM((CASE WHEN ([注文].[オーダー ID] IS NULL) THEN CAST(NULL AS NVARCHAR) WHEN NOT ([注文].[オーダー ID] IS NULL) THEN ISNULL((CASE WHEN CHARINDEX('-',[注文].[オーダー ID],cast((CASE WHEN CHARINDEX('-',[注文].[オーダー ID])= 0 THEN LEN([注文].[オーダー ID])+ 1 WHEN NOT CHARINDEX('-',[注文].[オーダー ID])= 0 THEN CHARINDEX('-',[注文].[オーダー ID])+ 1 ELSE NULL END) as int))= 0 THEN '' WHEN NOT CHARINDEX('-',[注文].[オーダー ID],cast((CASE WHEN CHARINDEX('-',[注文].[オーダー ID])= 0 THEN LEN([注文].[オーダー ID])+ 1 WHEN NOT CHARINDEX('-',[注文].[オーダー ID])= 0 THEN CHARINDEX('-',[注文].[オーダー ID])+ 1 ELSE NULL END) as int))= 0 THEN (CASE WHEN CHARINDEX('-',SUBSTRING([注文].[オーダー ID],cast(CHARINDEX('-',[注文].[オーダー ID],cast(CHARINDEX('-',[注文].[オーダー ID])+ 1 as int))+ 1 as int),LEN([注文].[オーダー ID])))= 0 THEN SUBSTRING([注文].[オーダー ID],cast(CHARINDEX('-',[注文].[オーダー ID],cast(CHARINDEX('-',[注文].[オーダー ID])+ 1 as int))+ 1 as int),LEN([注文].[オーダー ID])) WHEN NOT CHARINDEX('-',SUBSTRING([注文].[オーダー ID],cast(CHARINDEX('-',[注文].[オーダー ID],cast(CHARINDEX('-',[注文].[オーダー ID])+ 1 as int))+ 1 as int),LEN([注文].[オーダー ID])))= 0 THEN LEFT(SUBSTRING([注文].[オーダー ID],cast(CHARINDEX('-',[注文].[オーダー ID],cast(CHARINDEX('-',[注文].[オーダー ID])+ 1 as int))+ 1 as int),LEN([注文].[オーダー ID])),(CASE WHEN CHARINDEX('-',SUBSTRING([注文].[オーダー ID],cast(CHARINDEX('-',[注文].[オーダー ID],cast(CHARINDEX('-',[注文].[オーダー ID])+ 1 as int))+ 1 as int),LEN([注文].[オーダー ID])))- 1 >= 0 THEN CHARINDEX('-',SUBSTRING([注文].[オーダー ID],cast(CHARINDEX('-',[注文].[オーダー ID],cast(CHARINDEX('-',[注文].[オーダー ID])+ 1 as int))+ 1 as int),LEN([注文].[オーダー ID])))- 1 ELSE NULL END)) ELSE NULL END) ELSE NULL END), '') ELSE NULL END)))

これを大量の行に対して実行する場合、この計算のために処理が遅くなる可能性があります。スポット的な分析ではなく、継続利用するダッシュボードで使う場合などは使用を避けたがいいかもしれません。

例えばこのSPLIT関数をMID関数に書き換えると、以下のようにシンプルなクエリが実行されます。

>SUBSTRING([注文].[オーダー ID],cast(9 as int),LEN([注文].[オーダー ID]))

なお、複雑なクエリとなるのはSQL Server等のDBをデータソースとする場合で、Excelのデータに対して実行する場合などはクエリを使わないので、カスタム分割の方が適している可能性があります。
microk8s を Amazon Linux 2 にインストールしてIngressを起動するまで


## snapコマンドのインストール

こちらの記事のワンライナーでsnapコマンドをインストールする。
https://www.bonusbits.com/wiki/HowTo:Install_Snap_on_Amazon_Linux_Workspace

```bash
tag_version=v0.1.0 && \
rpm_version=2.36.3-0 && \
wget https://github.com/albuild/snap/releases/download/${tag_version}/snap-confine-${rpm_version}.amzn2.x86_64.rpm -P $HOME/Downloads && \
wget https://github.com/albuild/snap/releases/download/${tag_version}/snapd-${rpm_version}.amzn2.x86_64.rpm -P $HOME/Downloads && \
sudo yum -y install $HOME/Downloads/snap-confine-${rpm_version}.amzn2.x86_64.rpm $HOME/Downloads/snapd-${rpm_version}.amzn2.x86_64.rpm && \
sudo systemctl enable --now snapd.socket
```

## microk8sのインストールと設定

Canonicalの公式リファレンス通りに microk8s のインストールコマンドを実行する。
https://microk8s.io/docs

```bash
sudo snap install microk8s --classic --channel=1.18/stable
```

この時、下記のエラーが出たが数分待ってから再度実行することでインストールに成功した。

```bash
error: too early for operation, device not yet seeded or device model not acknowledged
```

あとは公式ドキュメント通りに設定するが、AmazonLinux2に合わせて少しコマンドを改変。

```bash
sudo usermod -a -G microk8s $USER
sudo chown -f -R $USER ~/.kube

# aliasだとkubectlのプラグイン(krewなど)が動かないので、シェルスクリプトを作る方式の方が良いかも
echo alias kubectl="'microk8s kubectl'" >> $HOME/.bashrc
sudo su - $USER
```

よく使うaddonを有効化

```bash
microk8s enable dns storage ingress
```

## Ingressの起動

Kubernetesの最小限の設定ファイルを作成してIngressを起動する。

```yaml:deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
```

```yaml:service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
```

```yaml:ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: http-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: nginx-service
          servicePort: 80
```

```bash
kubectl apply -f deploy.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
```

これでIngressが起動してパブリックIPから接続することができた。

# トラブルシューティング

## kubectl logs や kubectl exec が動作しない問題

DNS解決に失敗してlogs, execが動作しない問題が発生した。
AWSのVPCの「DNSホスト名の解決」が有効になっているか確認。
有効にして5分ほど待つとプライベートDNS名が解決されるようになり動作するようになった。

## Nginx Ingress ControllerはがデフォルトでHTTPSへのリダイレクトを行う

Ingressに下記のアノテーションを入れることで回避できる

```yaml
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
```
Node.jsのasync queueを使ってみた

## async queueについて
- 非同期処理を順番に実行してくれる
- async.queueの第一引数は非同期処理
- async.queueの第二引数はqueueを同時に実行する数
- async.queueの返り値はqueueを表すオブジェクト

## queueオブジェクトの中身
### push
- queueの最後尾にデータを追加

### unshift
- queueの最初にデータを追加

### length
- 待機しているqueueの数

### running
- 実行中のqueueの数

### pause
- queueの処理を一時停止

### resume
- queueの処理を再開

## サンプルコード
```javascript=
const async = require('async')

// 第一引数がqueueのパラメータ、第二引数が次のqueueの処理に入るトリガー
const q = async.queue((data, callback) => {
  const obj = {
    length: q.length(),
    running: q.running(),
    data
  }
  console.log('結果', obj)
  setTimeout(() => {
    callback()
  }, 1000)
}, 1)

q.push('1')
q.push('2')
q.push('3')
q.push('4')
q.push('5')
q.unshift('0')

setTimeout(() => {
  console.log('一時停止')
  q.pause()
}, 3000)

setTimeout(() => {
  console.log('再開')
  q.resume()
}, 5000)
```
### 結果
```
結果 { length: 5, running: 1, data: '0' }
結果 { length: 4, running: 1, data: '1' }
結果 { length: 3, running: 1, data: '2' }
一時停止
再開
結果 { length: 2, running: 1, data: '3' }
結果 { length: 1, running: 1, data: '4' }
結果 { length: 0, running: 1, data: '5' }
```

## queueの削除について
- queueを追加した後にqueue内のデータを削除する処理が見当たらなかったので、queueの持っているデータとは別に同じデータを外部で保存しておいて、外部のデータ内にデータが存在すればqueueを実行するようにしました

```javascript=
const list = []
const queue = async.queue((data, callback) => {
    // listにデータが存在する場合のみ処理を実行
    if (list.include(data)) {
        // queueの処理を実行する
        callback()
    } else {
        callback()
    }
})

const data = 'sample'
list.push(data)
queue.push(data)
```
Grbl_ESP32

# Grbl_ESP32が到着

LaserGRBLを使うとあまりに頻繁にエラーが出るので、別のコントローラーを使ってみようと画策。

普通にArduino UNO＋GRBL Shieldを使うのが簡単で良いのだが芸が無いので
日本語では全くと言ってよいほど情報がないGrbl_ESP32を注文してみた。
Arduino UNOでLaserGRBLが使えるかは確認済み。
~~(本当は真っ赤な中華GRBL Shieldの見た目が最悪過ぎで買いたくなかっただけ)~~

Designed by Bart Dring in United States of America / Tindie 
https://www.tindie.com/products/33366583/grbl_esp32-cnc-development-board-v41/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/51c5bcdd-0cd4-795f-fbca-f14ea6a99e05.png)
かっこいい‼

そしてお約束のESP32コンパイルエラーの嵐。
まる1日頑張ってファームの書き込み完了。

###※　別記事にも書きましたが、現在はvscodeを使う方法でしか正常に書き込みできません。(2021年6月時点)


##手順
1.最新版Arduino IDEでESP32が使えるようにする。ESP32のボードマネージャのバージョンは最新版の1.0.4。
やりかたはあちこちに書いてあるので省略。
（そもそもESP32をArduinoIDEで使ったこと無い人がこのボードを使ってみたいと思うのか？？）
ファーム書き込みするときはこのドライバボードからESP32を外しておくこと。（重要）

2. ボードの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/f944da12-06d8-3201-f4ef-02b1f8fc02e2.png)
ここを参照
https://github.com/bdring/Grbl_Esp32/wiki/Compiling-the-firmware

3．GitHabからファームの入手
ここからzipダウンロード
https://github.com/bdring/Grbl_Esp32
解凍して、ライブラリをインストール
　スケッチ→ライブラリをインクルード→ZIP形式のライブラリをインストール
　　解凍したフォルダ内のGrbl_ESP32フォルダを指定
　　　ファイル→スケッチ例→Grbl_ESP32を開く

ArduinoUNOにGRBLを書き込む感覚ならばこれで終了なのだが、ESP32はそんなラクはさせてくれない。
コンパイルしてもエラーが出まくる。

4．ライブラリのインストール
下記のライブラリをライブラリの管理…画面からインストール
Websockets　（ESP対応のもの）
ESP32SSDP　（https://github.com/luc-github/ESP32SSDPから入手し手動でインストール）
TMCStepper
ESP OTA GitHub

5．マイコンボードに書き込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/e29d0fd8-4fbf-46ce-039c-674d6cfe541c.png)

6．確認
シリアルモニタで確認。
＄＄とか＄Iとかを入力してみてちゃんと返ってきてればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/9c571f0c-e1f7-caca-d3e9-1d309502345f.png)

この状態ではテスト用のファームが書き込まれている状態。
実際に使用するにはファームのあちこちをカスタマイズする必要あり。
（4．でインストールしたライブラリが合っているのか今のところ不明）

次回は実使用できるように調整予定。

ちなみにこの状態でLaserGRBLを立ち上げてデモってみた。
全く問題なし。
（ステッピングモーターを繋げてないのでノイズが出てないから当たり前の気がするが）