OmniAICreator/Qiita-1.07M huggingface dataset:
子供達に実装されているOptimizerについて考察してみる

# この記事について
- e資格にむけてDeepLearningをお勉強中です。
- 子育て中です。

**子供達の様子を見ていて、学び方にいろいろなパターンがあるなあと思ったため、Deeplearningの学習方法をまとめつつ、子供達エピソードを愛でる親バカ記事です**

- 勉強中のため、解釈とか間違っていたり、イメージが異なるエピソードになっているところがあるかも（免責事項）

# 最適化手法まとめ
## 最急降下法
- θ ← θ - ρ∇Lで更新

## 確率的勾配降下法（SGD）
- θ ← θ - ρ∇Lで更新
- 最急降下法と更新式は同じで、ミニバッチで学習する。
- ∇Lの方向と、最適解の方向が異なる場合に振動して、収束が遅くなる

長女に、「机の上を片付けなさい」と言うと、「机の上を片付けるために、引き出しや本棚を全て片付る！」と言って、全く机の上が片付かない感じかしら。

## モーメンタム
- 勾配降下法・確率的勾配降下法の、「∇Lの方向と最適解の方向が異なる場合に振動して収束が遅くなる」に対応するため、速度ベクトルを採用
- v ←　αv - ρ∇L
- θ ← θ + v
- 物理のモーメントみたいに動いた方向を一定反映してくれて、急な勾配の変化を緩和してくれる
- 速度ベクトルが、損失を減らす方向に向いているかどうかは保証してくれない

長女が小さい頃、コンビニのニキビお兄さんに、「お顔ぶつぶつだから、お薬ちゃんと塗らなきゃダメだよ！」と言っていた（当時、体がガサガサブツブツだったのでヒルドイドをいっぱい塗っていた）。方向は間違っていないけど、自分だけに留めて他の人にも適用できると思わないで欲しい。

## ネストロフのモーメンタム
- 速度ベクトルが損失をへらす方向に向いていることを保証してくれる
- v ←　αv - ρ∇L（θ + dθ）
- θ ← θ + v

子育ては収束の方向を保証してくれるネステロフのモーメンタムはまずありえない。そこそこ変な方向に更新が行われることが多々ある（そこが面白い）

## Adagrad
- たくさん動いた後はあまりたくさん動かないようにする
- r ← r + ∇L・∇L　※動く大きさ、アダマール積
- ∇θ ←　- ε / (δ + √r) ・　∇L　※動く大きさの平方根（単位を合わせる）が分母に来ることで大小入れ替え
- θ　←　θ + ∇θ

子供に何かを注意して、そんなに大きく修正することってなかなかない。むしろ大きく修正と言うの不可能。子供が動いてくれない。ちょっとずつちょっとずつ分かるように導いていくしかない。

## RMSProp
- Adagradの派生
- r ← ρr + (1-ρ)∇L・∇L　※動く大きさ
- ∇Lと、rとどちらを寄り重視するか（ρ）を式に入れた
- ハイパーパラメータが多いと使いづらい
- Adagradで、一度更新量が飽和したらもう更新されない問題を、指数移動平均を使って解決

「損失関数からの学習」と、「たくさん動いた後は小刻みに」、のどちらを優先的に採用するかは、子供達の様子を見ると損失関数側から（うまく行った、うまく行かなかった、からの学び）の方が多そう。
長男が、いろんなこと（ハイパーパラメータ？）を同時に言われて、どの指摘をポイントに採用すればいいのかハテナがいっぱい浮かんで動けなくなっていることがよくある。（大人が気をつけなければいけない）

## Adam
- 一番一般的。第一選択となる方法
- r ← ρ1r + (1-ρ1)∇L・∇L　※rはRMSPropと同じ
- δ ← ρ2δ + (1-ρ2)∇L ※δはモーメンタムと同じ

次男の運動神経が良くて、特にアスレチック系をするときの力の入れ方、転んだり失敗しそうになったときの入れ方を、うまく行ったときとうまくいかなかった時の変更するバランスをうまく取りながら上手になって行っている気がする。
やっぱり、学習の大きさの調整はなかなか子育ての中でのイメージがわかない。

## RAdam
- 最新の方法。Adamより良いらしい。
- SGDによるwarm start
- 周りの勾配方向を考慮してくれる、と何処かで読んだ気が、、、、
- 分散がどうとか、、、、理解できていない

ステップによって学習方法を変えるのは、子育て中あるある。
子供の学習の特徴に合わせて、課題を与えていくのが子育てにはきっと大事。

## ニュートン法
- 目的関数を精度良く近似することができ、最急降下法よりも収束が早い
- 高次元になると解析的に解くための計算コストが高い

頭の中で考えていることのレベルが高いのに、外とのコミュニケーションがまだまだ（言葉の選び方とか理解とか）長男そのままのイメージ

# 最後に
- 子供の学習の特徴に合わせて、課題を与えていくのが子育てにはきっと大事。
- 苦手な数式と暗記、ちょっとだけ分かるようになってきました。
- 親バカ失礼しました。

#参考
- https://qiita.com/omiita/items/1735c1d048fe5f611f80
- https://kamino.hatenablog.com/entry/steepest_gauss#sec4
- https://amzn.to/3ijf0Xu（ゼロから作るDeeplearning）
vim からterminalを使う備忘録

## 概要

vim から華麗にterminal使いましょう


## 気をつけること

vimのバージョンが８以上である必要があります。
もしubuntuでvimをアップデートしたいときは

```
sudo add-apt-repository ppa:jonathonf/vim
sudo apt update
sudo apt-get install vim
```

を実行し、

```
$vim -version

VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Jan 11 2021 10:59:10)
```

を確認しましょう。



## 使い方

```
:terminal
```

で簡単に実行できます。

ウィンドウ間の移動は、普通にvimで複数ウィンドウを開いた時と同じように
`Ctrl + w -> 移動キー`
です。

## vim エディタ上でヤンクしたものをターミナルにコピー

`Ctrl + w -> "" `


で可能。
CloudWatchにロードアベレージを追加する

##背景
CloudWatchを使用しEC2のロードアベレージの監視をしようとしたが現状ロードアベレージのメトリクスは標準で用意されていないので自分でカスタムを作成しないといけないとのこと。。。

なので面倒くさいが自分でスクリプトを書いてCloudWatchから監視できるようにしました！

##ロードアベレージとは

ロードアベレージはシステム全体の負荷状況を表す指標であり
1CPUにおける単位時間あたりの実行待ちとディスクI/O待ちのプロセスの数で表される。

簡単にまとめるとコンピューターシステムが実行している作業量のことです。


##さっそく

■まずEC2にCloudWatchAgentServerPolicyのロールを作成しアタッチする。
sshログインをして

$ vi /home/ec2-user/loadaverage.sh

```
#!/bin/bash

## AWS CLI設定
readonly AWS_CLI="/usr/bin/aws"
readonly AWS_CLI_REGION="ap-northeast-1"

## メトリックス名と単位の設定
metric_name="LoadAverage-EC2"
name_space="AmazonLinux/${metric_name}"
unit="Percent"
#unit="Count"

## ロードアベレージを取得する自分の環境に合わす
## uptimeコマンドで出てくる最初の数字を取得できるように変える(10~12くらい?)
load_average=`uptime | tr -s ' ' | cut -d ' ' -f 11 | cut -d ',' -f 1`


## AWS CloudWatchのカスタムメトリクスにロードアベレージを追加する
${AWS_CLI} cloudwatch --region ${AWS_CLI_REGION} put-metric-data --metric-name `hostname -s`/${metric_name} --namespace ${name_space} --value ${load_average} --unit ${unit}
```
:wq
■権限付与
$ chmod 755 /home/ec2-user/loadaverage.sh

■cloudwatchへメトリクス送信
$ /home/ec2-user/loadaverage.sh

■EC2インスタンスのロードアベレージをCloudWatchに5分おきに記録する
$ crontab -e
*/5 * * * * /home/ec2-user/loadaverage.sh

これで完成です😂😂
![スクリーンショット 2021-01-16 14.56.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579988/956a61b7-8a6d-3c76-958f-6d76a650dea4.png)

##参考記事
・https://qiita.com/na0AaooQ/items/1fedb1d0136cd78c6aa1
・https://qiita.com/ryuichi1208/items/3b21aee6c38bcfdb12b1
Kubernetes the hard way を初学者目線で解説する ~ #9 kubectlのリモートアクセス設定

#はじめに
30代未経験からエンジニアを目指して勉強中のYNと申します。
インフラ初学者の私ですが、`Kubernetes the hard way`を進めるにあたって、インフラに関する基本的な知識を体系的に学ぶことができました。
そこで、初学者目線での学びなどを本記事にまとめておきたいと思います。

#目次
[こちらをご覧ください](https://qiita.com/theFirstPenguin/items/1f702af92f4eee83f398#%E7%9B%AE%E6%AC%A1)

#kubectlのリモートアクセス設定
クラスター外からkubectlコマンドを打つことができる設定を行います。
今回はクラスター内のmaster-1ノードに新しくkubectlの設定を行いますが、下記3つが揃っている環境であれば、クラスター外でもAPI-serverと通信するこができます。

* `ca.crt`
* `admin.crt`
* `admin.key`

↓この図のように、LBを軽油してAPI-serverにリクエストを行います。
![スクリーンショット 2021-01-16 14.01.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/7733457b-f410-38bc-eef2-5455a589a764.png)

```master-1.node
{
  KUBERNETES_LB_ADDRESS=192.168.5.30

  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.crt \
    --embed-certs=true \
    --server=https://${KUBERNETES_LB_ADDRESS}:6443

  kubectl config set-credentials admin \
    --client-certificate=admin.crt \
    --client-key=admin.key

  kubectl config set-context kubernetes-the-hard-way \
    --cluster=kubernetes-the-hard-way \
    --user=admin

  kubectl config use-context kubernetes-the-hard-way
}
```

#リモートアクセス動作確認
```master-1.node
kubectl get componentstatuses
```
#今までの通信経路との違い
下図のように、いままでの通信経路でAPI-serverと通信する場合は `--kubeconfig=admin.kubeconfig`をつけます。

```
 kubectl get componentstatuses --kubeconfig=admin.kubeconfig
```

![スクリーンショット 2021-01-16 14.03.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/8d2cea52-a24c-46b9-f6c3-9e356d398330.png)
部分テンプレートを使用する（保守性の高いコードを書く）

##前書き
ある程度ポートフォリオが完成してきたところでコードの手直しを行なっていくことにしました。
実際の業務では保守性の高いコードが求められているからです。具体的には同じコードは一つにまとめておくことによって手直しするときに複数直さなくても済むように改善していきます。
書き方を忘れないように備忘録として残しておきます。

##部分テンプレートの使用
ヘッダーは他のページでも繰り返し使用するので部分テンプレートとしてまとめていきます。
部分テンプレートとは、ビューファイルで繰り返し使用するコードを切り出し、再利用する仕組みのことをいいます。
部分テンプレートとして切り出すときに作成するファイルは命名規則として、アンダースコア_を先頭に記述します。
今回の場合、_header.html.erbとなります。
app/views/shared/_header.html.erbディレクトリに作成していきます。


###renderメソッド
renderメソッドは、部分テンプレートを呼び出す際に利用するメソッドのことです。
<%= render "ディレクトリの指定" %>と記述します。
例えばindex.html.erbやshow.html.erbでもヘッダーのコードを使いたい時にrenderメソッドで使い回すことができます。


```index.html.erb
<%= render "shared/header" %>

<div id="home-index" class="contents row">
  <h2 class="page-title">Find your favorite!</h2>
  <p class="page-p">歌いたかったあの曲との出会い提供するMY KARAOKE。
  </p>
  <p class="page-p">このページではみんなが歌いたい曲の情報が満載です。
     みんなの曲を見てレパートリーを増やしましょう。
  </p>
省略
```

```_header.html.erb
<header class='top-page-header wrapper'>
  <%= link_to 'MY KARAOKE', root_path, class: "title" %>

  <nav>
    <ul class="main-nav">
      <% if user_signed_in?%>
        <li><%= link_to current_user.nickname, new_user_session_path, class: "user-nickname" %></li>
        <li><%= link_to 'ログアウト', destroy_user_session_path, method: :delete, class: "logout" %></li>
      <% else %>
        <li><%= link_to'ログイン', new_user_session_path, class: "login" %></li>
        <li><%= link_to '新規登録', new_user_registration_path, class: "sign-up" %></li>
        <li><%= link_to 'ゲストログイン', users_guest_sign_in_path, method: :post %></li>
      <% end %>
    </ul>
  </nav>
</header>
```


一行目の<%= render "shared/header" %>よって_header.html.erbのコードを使用することができます。
部分テンプレートを作成したことによってindex以外のページでも同じように使い回すことができます。


```show.html.erb
<%= render "shared/header" %>

<div class="main">
  <div class="song-show">
    <table class="detail-table">
      <tbody>
        <tr>
          <th class="show-detail-value">投稿者</th>
          <td class="show-detail-song">
            <%= link_to user_path(@song.user_id) do %>
              <%= @song.user.nickname %>
            <% end %>
          </td> 
        </tr>
省略
```


今回はわかりやすいようにヘッダーの例を出しましたがもちろんそれ以外も部分テンプレートが使える場面があります。
例えばnewとeditは新規投稿する際にフォームなどはほぼ同じ記述になるので（少なくとも僕の場合は）使えたりします保守性の観点からまとめてあげるほうが後々楽になるのでやっておくほうがいいと思います。

##後書き
とりあえず簡単な部分テンプレートいついてまとめました。 localsオプションを使った部分テンプレートの記事を次回書いてみようかと思っています。
Ajax通信（いいね機能）

#Ajax通信

##概要
同期通信とは、サーバーからのレスポンスを待ってから作業をしますという意味。
「同期」とはサーバーと足並みを揃えるという意味が込められている。
非同期は、待たない。そのため、サーバーからのレスポンスが遅れていたとしても、他の作業ができる。

| 通信 | 記述 | 読み込み |通信時 | 
|:-:|:-:|:-:|:-:|:-:|
|同期| local:true   | ページ全体（一瞬白くなる）  | 他の作業はできない  |  
| 非同期  | remote:true  | 一部だけ  | 他の作業ができる  |  

##制作物

![スクリーンショット 2021-01-16 14.06.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620852/ba5ae2c6-c54b-9326-9668-526147b80397.png)

```erb:view
  <!-- ↓これが「いいね」ボタン。renderで呼び出している。　これを押すと。。。-->
<td class="favorite-btn"><%= render "favorites/favorite-btn", book: @book %></td>
```

```erb:_favorite.html.erb

<% if book.favorited_by?(current_user) %>
  <%= link_to book.favorites.count, book_favorites_path(book), method: :delete, remote: true, class: "fas fa-heart heart_red" %>
<% else %>
  <!-- ↓現状これが呼び出されている。-->
  <%= link_to book.favorites.count, book_favorites_path(book), method: :post, remote: true, class: "fas fa-heart heart_blue" %>
<% end %>
```

いいねを押すと、remote: trueでコントローラを参照する。

```rb:favorite_controller

  def create
    @book = Book.find(params[:book_id])
    favorite = @book.favorites.new(user_id: current_user.id)
    favorite.save
    #良いね情報を保存したあと、redirect_toもrenderもないので
    #view/controller名/アクション名.js.erbが呼び出される。
  end
```

![スクリーンショット 2021-01-16 14.16.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620852/c1554b5e-db64-09d9-6422-5be2f34e53c3.png)


$(" #book_3 .favorite-btn").html("~")
"book_3"というidと、"favorite-btn"というclassを有する要素の子要素を
.html("~")に変更する。

```erb:create.js.erb

$("#book_<%= @book.id %> .favorite-btn").html("<%= j(render 'favorites/favorite-btn', book: @book) %>");
```

```erb:_favorite-btn

<% if book.favorited_by?(current_user) %>
  <%= link_to book.favorites.count, book_favorites_path(book), method: :delete, remote: true, class: "fas fa-heart heart_red" %>
<% else %>
  <%= link_to book.favorites.count, book_favorites_path(book), method: :post, remote: true, class: "fas fa-heart heart_blue" %>
<% end %>
```

![スクリーンショット 2021-01-16 14.05.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620852/2e102887-ff8f-5096-765d-88c077644d13.png)


##遊び

```erb:create.js.erb
$("#book_<%= @book.id %> .favorite-btn").html("<p>揚げオムレツ</p>");

```

![スクリーンショット 2021-01-16 14.31.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620852/b14c47bd-c1f7-8266-8992-e949748f479c.png)


#RailsにjQuery
railsで/* global $*/を使用する準備

```js:application.js
:
:
//= require jquery3
//= require jquery_ujs
/* global $*/

ここから記述していく

```
【Sequel Pro】毎回出る謎のエラー〜ちょっと奥さん知ってました？⌘Wじゃなくて⌘Qの話〜

### ずっと気になっていたこと

一日の作業を終えた達成感と、心地良い疲労感がじわじわと広がってくる。
PCの電源を落とそうと、ウインドウの左上の赤い❌ボタンでアプリケーションを次々と閉じていく。
Chromeを閉じ、VScodeを閉じ、ターミナルを閉じ、SepuelProを閉じ・・・
左上の🍎マークから終了。いつもの流れである。


次の日にPCを起動し、さあ今日もやっちゃうぞ！と次々とアプリケーションを起動していく。
すると毎回こうなる。


![fa1006c655dd53487dcf3af6adc7800b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887559/77914a9d-0ee5-a975-c5e9-050a04e39fca.png)


**Sequel Pro recently quit unexpectedly.**

インストールした時からずっとだ。
出なかったことはない。
ご苦労である。

いい加減こちらも気になって調べてみたが、Mojaveのものばかりで解決方法がなかった（Catalina使用中
とある人に聞いたところ

<h4>「毎回出る？終了しても？」</h4>

終了しても出るよ！
ん？終了？なんのはなし？

<h4>「左上のSequelPronoメニューから終了だよ」</h4>

ほほう・・・（ぽち
どうせダメなんじゃないの〜？
毎回出るんだから終了したって変わらｎ



<br><br><br><br><br>
（なおった



<h1>⌘Wで「閉じる」
⌘Qで「終了」</h1><br>



このコマンドの違いを今更ちゃんと知ったっていう話でした。
ご清聴ありがとうございました。
Djangoの前に、仮想環境(venv)をつくるメモ

pythonでDjangoを使ってwebアプリをつくる。
↑そのためにまず仮想環境を作る。

#仮想環境つくる手順


###⓪新規フォルダをつくって入る
仮想環境を置くためのファイル（今回は **dj_project** とする）をつくる。

```
mkdir dj_project
```

そして入る。←これ忘れないで

```
cd dj_project
```

<br>

###①仮想環境つくる
今回の仮想環境のファイル名は **dj_kasou** とする。

```
python -m venv dj_kasou
```
macでうまくいかなければこっち

```
python3 -m venv dj_kasou
```
<br>
###②仮想環境はいる

```
cd dj_kasou
```
<br>
###③仮想環境実行する


Macの場合：

```
source bin/activate
```
**完了。**

<br>

Windowsの場合：

```
Scripts\activate
```
**PSSecurityException**のエラーがでるので以下実行。

```
Set-ExecutionPolicy RemoteSigned -Scope Process
```
→実行ポリシー「Y」で応えて、もう一回実行。

```
Scripts\activate
```

**完了。**

<br>

<br>
仮想環境の構築が済んだら、作業ごとに入ったり出たり繰り返すので以下コマンドのメモ。

#####仮想環境ファイルに入る

```
cd dj_kasou
```

#####仮想環境を実行

```
source bin/activate
```

#####仮想環境内の作業ディレクトリに入る

```
cd NOWPROJECT
```

#####仮想環境を終了

```
deactivate
```
<br>
##そもそもなぜ仮想環境が必要？
ライブラリのバージョン違いによって起こるトラブルを防ぐ。仮想環境を作ればアプリごとにバージョンを管理できる。
create-react-app でも WebWorker を使う (TypeScript 対応)

## 概要
[create-react-app は React で開発を始めるのに便利](https://create-react-app.dev/) だが、重い計算をバックグラウンドで行いたくなったので WebWorker を使おうとしたら [サポートされていない](https://github.com/facebook/create-react-app/issues/3660) ことがわかった。WebWorker 自体 [onmessage/postMessage](https://developer.mozilla.org/ja/docs/Web/API/Worker) のような低レベル API を使用しないといけないようで型の恩恵を受けづらいのが難だなと調べていたら [dominique-mueller/create-react-app-typescript-web-worker-setup](https://github.com/dominique-mueller/create-react-app-typescript-web-worker-setup) を見つけた。だいたいこのとおりでうまくいった。

## ReferenceError: $RefreshReg$ is not defined
しばらく悩まされたランタイムエラーがこれ。worker 内で起こっていて、[シンボルの名前で調べてみると react-refresh に関係している](https://github.com/facebook/react/search?q=refreshreg) らしい。トランスパイル後の JavaScript なんて読めないよと思いつつ何に対応して reference が生成されているか追っていったら **関数名が大文字で始まっている** のを見つけた。まあ関係ないだろうと思いつつ直しておくとエラーがなくなった…。

たしかに React コンポーネントは大文字から始まるし、と react-refresh を見返すと [isComponentishName](https://github.com/facebook/react/blob/95feb0e701a5ae20996e8cc6c4acd0f504d5985a/packages/react-refresh/src/ReactFreshBabelPlugin.js#L42) 判定を通ったものは他のシンボルと違う処理が入っているらしい。

## 手順
詳しくは [dominique-mueller/create-react-app-typescript-web-worker-setup](https://github.com/dominique-mueller/create-react-app-typescript-web-worker-setup) を。
### 準備
* react-app-rewired, worker-loader を入れる: `package.json`
* react-app-rewired の設定を行う: `package.json`, `react-app-rewired.config.js`
    * .worker.ts で終わる名前のファイルは worker-loader を使って変換する、というような意味

### 使用
Worker 側では必要なものを expose する:

```ts
import { expose } from 'comlink'
import { f } from 'mylibrary'
export default {} as typeof Worker & { new (): Worker }
expose({f})
```

使う側では wrap すると Promise が返ってくる:

```ts
import { wrap } from 'comlink'
import MyWorker from 'My.worker'
const myWorker = wrap(new MyComlinkWorker()) as { f: (x: number) => Promise<number> }
:
myWorker.f(x).then(g)
```

### TODO
as 以下を書くのが面倒なので any にしてしまっている。勝手になんとかしてくれる方法は?

## 参考
* Comlink, WebWorker については [WebWorkerをenjoyableにするComlinkとは何者か](https://qiita.com/karszawa/items/d97e2b0618a69f0565e7) に詳しい。
* create-react-app と TypeScript の組み合わせは [create-react-appで React + Typescript な環境を構築する](https://qiita.com/sunnyG/items/05c2e9381d6ba2d9fccf) にある。
ドラッグ＆ドロップされた画像や音声ファイルをインラインimgやaudioタグに変換するツールをつくってみた

HTMLに画像を埋め込みたい場合に、下記のように、URLではなく直接データをBase64エンコードして埋め込むことができます。
`<img src="data:image/png;base64,iVBORw0KGgoAAAAN...">`

今回は、このタグを簡単に作成できるツールを作ってみました。

# インラインimgタグ生成ツール

MIME type `image/png` と `image/jpeg` [^1] だけ受け付けるようにしてます。あと、とりあえず8MB以下の制限をつけてます。
【追記】音声ファイル（`audio/wav`とmp3ファイル(`audio/mpeg`)のみ）も対応してみました。
【追記】`String.fromCharCode(...バッファ変数)` の スプレッド構文(`...`)で stack over flow が起こるようなので対策してみました。ただし、textareaのサイズ上限は不明・・。

[^1]: 一度描画してから再エンコーディングする処理となっているので、画質が劣化する可能性があります。音声ファイルの処理のほうを真似れば改善できそうですが、今のところ対応予定はありません。（単純に面倒くさい・・・）

<p class="codepen" data-height="330" data-theme-id="light" data-default-tab="result" data-user="kob58im" data-slug-hash="ZEpVXwr" style="height: 330px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="ImageAndAudioFileBase64Encoder(Under Construction)">
  <span>See the Pen <a href="https://codepen.io/kob58im/pen/ZEpVXwr">
  ImageAndAudioFileBase64Encoder(Under Construction)</a> by kob58im (<a href="https://codepen.io/kob58im">@kob58im</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 注意事項

- <font color="red"><b>画像や音声の著作権はもちろんのこと、個人情報が含まれていないかにも注意を！
（ヘッダー情報とかが埋まっていたりするので、意図せず情報流出させてしまう恐れがあります。）</b></font>

- CodePenとかに埋め込めますが、あまり巨大なデータを埋め込むと利用規約とかに違反するかもしれません。
（ちゃんと読んでないので何ともいえないけど、、）
[^2]

[^2]: CodePenに関してはわりと寛容っぽい？[Pen Limitations - CodePen Blog](https://blog.codepen.io/documentation/limitations/)，[Terms of Service - CodePen Blog](https://blog.codepen.io/documentation/terms-of-service/)

# 参考サイト
- [HTML&JavaScript - Drag&Dropでファイルを読み取るまでの解説とサンプル（バイナリビューワ） - Qiita](https://qiita.com/kob58im/items/d9a64e77cbba933aa97e)
- [JavaScriptでバイナリを扱いたい - Qiita](https://qiita.com/kareharide/items/93f0257ee5c31e239e63#2-%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%81%8B%E3%82%89base64%E3%81%B8)
- [よくある MIME タイプ - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)
- [Maximum call stack size exceeded エラーの解決策【applyの限界】 | PisukeCode - Web開発まとめ](https://pisuke-code.com/js-soln-of-maximum-call-stack/)

# 参考サイト（画像関連）
- [画像をBase64でHTMLファイルに直接埋め込む方法 - design Edge](https://edge.sincar.jp/web/base64-inline-image/)
- [［JavaScript］ 画像変換：&lt;img&gt;要素 ⇔ Base64（相互変換） - Qiita](https://qiita.com/yasumodev/items/e1708f01ff87692185cd)
- [画像をドラッグ＆ドロップで登録してプレビュー表示 - Qiita](https://qiita.com/tonkatu_tanaka/items/77fd4300f543a4f9682d)


# 参考サイト（Audio関連）
 - <font color=red><b>※自動再生アリ※音量注意※</b></font> [【ワテのHTML講座】ウェブサイトで音声ファイルを再生する【Base64エンコードでも可能】](https://www.wareko.jp/blog/play-audio-files-on-website-or-embed-with-base64-encoding)
NFCタグで遠隔PC起動_スマホでWake on lan(ラズペリーパイ経由)

#NFCタグで遠隔PC起動_スマホでWake on lan(ラズペリーパイ経由)
##作成背景
　①NFCタグで何か便利にできることがないか？
　②デスクトップPCをwifi経由でなくLAN接続に最近変えた

Wake on lan でPCを起動しよう。

##材料
①NFCタグ1枚100円
②NFC対応スマホ(android)
③NFC tools (アプリ)
④ラズベリーパイzero (☆wake on lan アプリでもOK)

##実践
###①デスクトップPCの設定(wake on lan)ができるようにする。
　マジックパケットをLANに流すことで、PCが起動できる。
　*マザーボード上で通電している状態にする、Wakeonlanを利用可能にする必要
　https://www.atmarkit.co.jp/ait/articles/2004/20/news021.html
☆macアドレスを取得しておきます。　ifconig/all

###②ラズベリーパイzeroからマジックパケットを出す
xx:xx:xx:xx:xx:xx  ①で調べたMACアドレス

```
apt-get install wakeonlan
wakeonlan xx:xx:xx:xx:xx:xx 
```
wakeonlan.shを作成しておく(後で起動するよう)

```
vi wakeonlan.sh

wakeonlan xx:xx:xx:xx:xx:xx 
```


該当のPCの電源がonになることを確認する。

###③ラズベリーパイzeroをrestapiサーバーにする(flask利用)
材料④でラズベリーパイを利用している理由
・余計なアプリを入れたくない。
・違う起動方法にした際に、応用が利く
今回restapiサーバとしてURLをたたく形で実装

```
pip install Flask
cd 適当なフォルダーへ
```
index.pyという名前でpythonファイルを作成する。

```
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask
import subprocess
app = Flask(__name__)

@app.route("/")
def hello():
    subprocess.call('./wakeonlan.sh',shell=True)
    return "wake on lan!"

if __name__ == "__main__":
    app.run('0.0.0.0', debug=True)
```
python起動する。ssh経由での接続後、切断しも切れないように下記コマンドを実行

```
nohup python index.py
```

http://xxx.xxx.xxx.xxx:5000/ にアクセスして、PCが起動することを確認する

###NFCタグに、http://xxx.xxx.xxx.xxx:5000/にアクセスする指示を書き込む

☆tasktoolsの方で、設定ができるので割愛



##最終結果
　ちょっとQoLが上がった気がします。
　NFCタグは、部屋中のあらゆる場所にスイッチがつけれる魔法の道具だと気付いたので、思いついたらやってみようと思います。
　＊　自宅Iotはやりすぎると、かえって面倒なことが多発します。なのでほどほどが一番
CentOS8でFessを使用し、ローカルファイル検索を試す

Fessを使用して、ローカルファイルの全文検索を試す。
[オープンソース全文検索サーバー Fess](https://fess.codelibs.org/ja/index.html)

今回は前回と違い、rpmからインストールする。
zipからインストールする場合は[こちら](https://qiita.com/asano_yuki/items/60fc7159dae6b929e548)。

インストール先のCentOSのバージョン。

```
CentOS Linux release 8.3.2011
```
[ドキュメント](https://fess.codelibs.org/ja/articles/article-1.html)があるので、インストール作業自体は特に詰まるところはなかったが、minimalインストールをした影響か、言語が不足していて起動時に詰まった。
以下、すべてrootユーザで実行。

en_USがあるかどうかを確認。

```
locale --all-locales
```
このあたりが入っていればOK。

```
en_US
en_US.iso885915
en_US.utf8
```

なければ下記を実行。

```
dnf reinstall glibc-common
dnf install langpacks-en
```

## JDKのインストール

```
dnf install java-11-openjdk-devel
```

## Elasticsearchのインストール

[Download Elasticsearch Free | Get Started Now | Elastic | Elastic](https://www.elastic.co/jp/downloads/elasticsearch) からダウンロード。
この時点での最新は7.10.1。

```
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.1-x86_64.rpm
rpm -ivh elasticsearch-7.10.1-x86_64.rpm
```

## Fessのインストール

githubからfessの最新コードを取得。
[Releases · codelibs/fess · GitHub](https://github.com/codelibs/fess/releases)
この時点での最新は13.10.2。

```
wget https://github.com/codelibs/fess/releases/download/fess-13.10.2/fess-13.10.2.rpm
rpm -ivh fess-13.10.2.rpm
```

## Elasticsearchの設定

参考: [インストール](https://fess.codelibs.org/ja/13.9/install/install.html#zip)

ElasticsearchにFessのプラグインをインストール。
githubを確認したところ、最新は7.10.0だった。
[Tags · codelibs/elasticsearch-analysis-fess · GitHub](https://github.com/codelibs/elasticsearch-analysis-fess/tags)

```
/usr/share/elasticsearch/bin/elasticsearch-plugin install org.codelibs:elasticsearch-analysis-fess:7.10.0
/usr/share/elasticsearch/bin/elasticsearch-plugin install org.codelibs:elasticsearch-analysis-extension:7.10.0
/usr/share/elasticsearch/bin/elasticsearch-plugin install org.codelibs:elasticsearch-configsync:7.10.0
/usr/share/elasticsearch/bin/elasticsearch-plugin install org.codelibs:elasticsearch-dataformat:7.10.0
/usr/share/elasticsearch/bin/elasticsearch-plugin install org.codelibs:elasticsearch-minhash:7.10.0
```

`/var/lib/elasticsearch/config`を認識させる。
Fessにアクセスするための設定を追記。

```/etc/elasticsearch/elasticsearch.yml
configsync.config_path: /var/lib/elasticsearch/config
```

## 自動起動登録

```
systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl enable fess.service
```

## 確認

起動させて、ブラウザでアクセスできるか確認する。
起動していない場合はElasticsearchから起動。

```
systemctl start elasticsearch
systemctl start fess
```

http://[サーバのIP]:8080 でアクセスできるか確認
http://[サーバのIP]:8080/admin が管理ログイン画面。
ID: admin
PASS: admin

アクセスできない場合はfirewallまわりを確認する。

## ローカルファイルのクロール

[前回記事](https://qiita.com/asano_yuki/items/60fc7159dae6b929e548#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB)参照。
WordPressのプラグインEventsManagerの予約フォームをレスポンシブデザインに対応させた

# 前提

* WordPressバージョン 5.6
* PHPバージョン 7.4.13
* Events Managerバージョン 5.9.9

# 目標
EventsManagerの予約フォームをレスポンシブデザインに対応させる

# 結論
CSSを追加してなんとかなった(コードは[下部](#手順))
## Before

* チケットのバグは気にしないお約束

PC表示
![スクリーンショット 2021-01-16 133653.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782216/0623cceb-4875-e612-80f0-c3671337038a.png)

モバイル表示1
![スクリーンショット 2021-01-16 133737.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782216/904674b7-6def-8484-e83d-966ffbf0c0ed.png)

モバイル表示2(1より狭い)
![スクリーンショット 2021-01-16 133813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782216/eff52911-b3f8-4553-aeb7-5be46c4a8c37.png)
このようにレスポンシブデザインに対応していない上、最悪表示されないという致命的問題がある。

## After
PC表示は変わらず
![スクリーンショット 2021-01-16 133939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782216/336808db-23fe-2bb0-55a9-de5bc2dbc6c8.png)

モバイル表示
![スクリーンショット 2021-01-16 134040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782216/65189d82-a786-b04c-76d7-7f73cbd4f673.png)
しっかりと表示されていることが分かる


# 手順
以下CSSを放り込むだけ(のハズ)

```css:style.css
/*アクセスしてきたデバイスのディスプレイ横幅が767px(要調整)以下のとき*/
@media (max-width: 767px){
#em-booking .em-booking-login { /*ログインフォーム左の縦線を非表示*/
    border-left:none;
}

/*微調整*/
#em-booking .em-booking-form-details {
    width:100%;
}

#em-booking .em-booking-form-details input.input,#em-booking .em-booking-form-details textarea {
    width:100%;
}

#em-booking div.em-booking-login{ /*ここが肝*/
    margin:auto;
}
}

#em-booking .em-booking-form label{
    width:100%;
}

#em-booking div.em-booking-login label{
    display:contents;
    width:100%;
}
```
私の管理しているサイトには [VK All in One Expansion Unit](https://ja.wordpress.org/plugins/vk-all-in-one-expansion-unit/) が入っていたので、このプラグインで追加される追加CSS機能で追加しました。
Macで外部モニタを認識しないとき

## 対処法
### 1. ケーブルを変える
まずケーブルが悪いのかを確認する。

### 2. モニターを変える
ケーブルに問題がなければ、モニターを変えて確認する。

### 3. Macを再起動(大体これで直る)
ケーブルとモニターに問題がなければMacが原因の場合がある。
そういう場合はMacを再起動する。

会議先のモニターに接続して、自席のモニターに接続したら認識しないことがたまにあるが、
再起動したら大抵直る。
DLL の delay load

## 目的
依存 dll を本体 exe とは別の場所に配置したい。
例えば以下のようなシチュエーション：

- 開発しているものがプラグイン dll であり、依存 dll を本体 exe と同じ場所に置くのが難しい
  - プラグイン dll の場所は dll サーチパスには入っておらず、同ディレクトリに依存 dll を置いても解決できない
  - プラグイン開発者が一度はハマるであろう問題
- 簡単なツールを配布しようとしているが、依存 dll が多数あって exe を見つけづらいため、別ディレクトリに置きたい
  - 単なるユーザビリティの問題だが、自分的に無視したくない部分

## 対応策
インポートライブラリを使わず実行時に LoadLibrary() & GetProcAddress() するとか、dll サーチパスを設定して本体 dll をロードするだけの proxy dll/exe を作成するとかでも解決できるが、どちらも非常に面倒。
幸いにもこういう問題を解決するためのそのものズバリな機能が用意されている。それが [delay load](https://docs.microsoft.com/cpp/build/reference/linker-support-for-delay-loaded-dlls) である。

Visual Studio 上のリンカオプション "Delay Loaded Dlls" で delay load させたい dll を指定しておく (コマンドラインオプションだと [/DELAYLOAD](https://docs.microsoft.com/cpp/build/reference/delayload-delay-load-import))。これで指定された dll は、その dll の関数が呼ばれる時までロードが遅延され、必要になった時 LoadLibrary() & GetProcAddress() 相当の処理で解決される。よって、dll の関数を呼ぶ前に dll サーチパスを追加しておけばあとは自動で綺麗に解決してくれる。
(ちなみに /DELAYLOAD は #pragma comment(linker) では[指定できないオプション](https://docs.microsoft.com//cpp/preprocessor/comment-c-cpp)らしく、C++ ソース側から指定することはできない)

dll サーチパスの追加は、SetDllDirectory() による指定、SetEnvironmentVariable() で環境変数 PATH に追加などの方法がある。SetDllDirectory() の方が望ましいと思われるが、複数のディレクトリは設定できない点に注意が必要。AddDllDirectory() というそれっぽい API もあるが、これは LoadLibraryEx() に LOAD_LIBRARY_SEARCH_USER_DIRS オプションを入れた時のみ考慮されるものであり、delay load の場合効果がない。
他への影響を最小限に留めたい場合、GetDllDirectory() で元のサーチパスを保存、SetDllDirectory() でサーチパスを指定、[__HrLoadAllImportsForDll()](https://docs.microsoft.com/cpp/build/reference/loading-all-imports-for-a-delay-loaded-dll) で明示的に依存を解決 or エラーハンドリング、SetDllDirectory() で元のサーチパスを復元、とやるのがいいと思われる。



## 対応例
プラグイン dll のケースでは、実行中に dll 自身のディレクトリを得る必要がある。これは以下のように実現できる。


```c++
std::string GetCurrentModuleDirectory()
{
    // この関数自身が所属する exe や dll のディレクトリを返す
    HMODULE mod = 0;
    char buf[MAX_PATH]{};
    ::GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)&GetCurrentModuleDirectory, &mod);
    ::GetModuleFileNameA(mod, buf, std::size(buf));
    return std::string(buf, std::strrchr(buf, '\\'));
}
```

あとは DllMain() とかで SetDllDirectory() すれば綺麗に問題解決できる。

```c++
BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD dwReason, LPVOID lpReserved)
{
    if (dwReason == DLL_PROCESS_ATTACH) {
        auto dll_path = GetCurrentModuleDirectory();
        ::SetDllDirectoryA(dll_path.c_str());
    }
    return TRUE;
}
```
DiscordのReminder Botのループ機能は寄付をしないと使えない

DiscordのReminder Botを使って毎週決まった時間に投稿したかったんですが、寄付しないとできないみたいです。

##Reminder Botとは
名前の通り、リマインダーをしてくれるBotです。
インストール方法や基本的な使い方は @hamurock さんが以下の記事で解説してくれてます。
[Discordで指定時間に通知してくれるリマインダーBot「Reminder Bot」の使い方](https://qiita.com/hamurock/items/dd7a2419e3f2bb7933ca)
##Reminder Botのループ機能は寄付をしないと使えない
`$natural` でコマンドの説明が見れるのですが、以下の部分に注目。
>every : define an interval (Patreon Only)

Google翻訳してみる。
>
every：間隔を定義します（Patreonのみ）

さらに `$donate` で寄付について見れるのですが、このようにあります。
>
When you donate, Patreon/SubscribeStar will automatically rank you up on our Discord server, supposing you have properly linked your Patreon/SubscribeStar and Discord accounts!
With your new rank, you'll be able to:
: set repeating reminders with interval, natural or the dashboard

Google翻訳。
>
寄付すると、Patreon / SubscribeStarアカウントとDiscordアカウントが適切にリンクされている場合、Patreon / SubscribeStarは自動的にDiscordサーバーでランク付けします。
新しいランクを使用すると、次のことができるようになります。
：インターバル、ナチュラル、またはダッシュボードで繰り返しリマインダーを設定する

つまり、寄付がいるらしい。
じゃあいくら寄付すればいいの？ってなりますよね。

`$donate` にはこんな記載もあります。
>
Thinking of adding a monthly contribution? Click below for my Patreon and official bot server :D
>
https://www.patreon.com/jellywx

Google翻訳。
>
毎月の寄付を追加することを考えていますか？ 私のPatreonと公式ボットサーバーについては、以下をクリックしてください：D
>
https://www.patreon.com/jellywx

リンクに飛ぶと寄付ページが表示されます。
それによると月2ドルで、日本円にすると207円(2021/1/16時点)

有料だしドルの払い方わからないということで私はここで諦めました。
寄付してもいいという方はよかったら。
VScodeのスニペット機能を活用しよう ~ もう<%=%>はいちいち打ちたくない ~

# 概要
railsの開発をしていると、結構書くことになる「<%= %>」や「<% %>」。
いちいち打つのは結構めんどくさい。
なので、VScodeのスニペット機能を使って簡単にこれらのめんどくさいコードを打つ時間の短縮をしてみよう！
もちろん、他の言語でもOK!

# 導入の仕方
## VScodeの左下の歯車マークをクリック
![スクリーンショット 2021-01-16 13.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/900b1546-660a-f5e7-8bde-d096f1441453.png)

## Command paletteを開く
![スクリーンショット 2021-01-16 13.36.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/866ef781-4039-315b-1d53-898bd7e9b971.png)


## snippetsと打って、省略したいコードの言語の拡張子を選択
![スクリーンショット 2021-01-16 13.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/277eb65a-0557-1318-ccbe-4357d8814839.png)


![スクリーンショット 2021-01-16 13.38.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/85cad0a9-6fcd-09d1-6202-2deab8cae4f4.png)

## スニペットを記述しよう
![スクリーンショット 2021-01-16 13.38.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/deab6d6e-af32-00a0-0cce-7fa37dc1d95a.png)

自由にスニペットは作れるのですが、
と書き方は、以下のように
はじめの””の中には、**当該スニペットの端的な内容**
prefixの後には、**スニペットを出力するためのトリガー**
bodyの後には、**実際出力したいコードの内容**
descriptionの後には、**スニペットの説明**
を記述します！

```ruby:ruby
{
	// Place your snippets for erb here. Each snippet is defined under a snippet name and has a prefix, body and 
	// description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
	// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
	// same ids are connected.
	// Example:
	"write <%=%> more easier": {
		"prefix": "pa",
		"body": [
			"<%= $0 %>"
		],
		"description": "Log output to console"
	}
}
```

また、$0をかけば、カーソルの位置を指定できます。
上の例のようにかけば、<%= %>における=と%の間にカーソルが合います。
同様に、$1や$2をかけば、改行を挿入できます。

また、以下のように記述すれば複数のスニペットを作成できます。

```ruby:ruby
{
	// Place your snippets for erb here. Each snippet is defined under a snippet name and has a prefix, body and 
	// description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
	// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
	// same ids are connected.
	// Example:
	"write <%=%> more easier": {
		"prefix": "pa",
		"body": [
			"<%= $0 %>"
		],
		"description": "Log output to console"
	},
	"write <%%>": {
		"prefix": "ni",
		"body": [
			"<%%>",
		],
		"description": "Log output to console"
	}
}
```
### 終わり
Author: Kazuhito Nakayama
[Twitter](https://twitter.com/facultyoflaw11)
[Qiita](https://qiita.com/facultyoflaw11)
【Android】MediaPlayerで音楽を一時停止して途中から再生する方法

#プログラミング勉強日記
2021年1月16日
MediaPlayerで音楽を一時停止して、止めたところから再生する方法を簡単にまとめる。

#MediaPlayerで音楽を再生する方法

```java:MainActivity.java
mp = MediaPlayer.create(this, R.raw.musicFile); // 音楽ファイルを読み込み
mp.start(); // 再生開始
```

#MediaPlayerで音楽を一時停止する方法

```java:MainActivity.java
mp.pause();
```

#サンプルプログラム
　ポイントはstartする際にMediaPlayerのインスタンスを生成しないこと。そのまえにonResumeの中でインスタンスを生成することで、一時停止してその途中からまた再生することができる。

```java
public class Sample20120802Activity extends Activity {
    MediaPlayer mp = null;
    Button[] btn = new Button[3];

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        setContentView(ll);

        btn[0] = new Button(this);
        btn[1] = new Button(this);
        btn[2] = new Button(this);

        btn[0].setText("再生");
        btn[1].setText("一時停止");
        btn[2].setText("停止");

        btn[0].setEnabled(true);
        btn[1].setEnabled(false);
        btn[2].setEnabled(false);

        ll.addView(btn[0]);
        ll.addView(btn[1]);
        ll.addView(btn[2]);
        btn[0].setOnClickListener( new sampleClickListener() );
        btn[1].setOnClickListener( new sampleClickListener() );
        btn[2].setOnClickListener( new sampleClickListener() );
    }

    public void onResume(){
        super.onResume();
        mp = MediaPlayer.create(this, R.raw.musicFile); 
        mp.setOnCompletionListener(  new SampleCompListener() );
    }

    public void onPause(){
        super.onPause();
        mp.release();
    }

    class SampleCompListener implements OnCompletionListener{
        @Override
        public void onCompletion(MediaPlayer mp) {
            btn[0].setEnabled(true);
            btn[1].setEnabled(false);
            btn[2].setEnabled(false);
        }
    }

    class sampleClickListener implements OnClickListener{
        @Override
        public void onClick(View v) {
            if( v == btn[0] ){
                btn[0].setEnabled(false);
                btn[1].setEnabled(true);
                btn[2].setEnabled(true);
                try{
                    mp.prepare();
                } catch ( Exception e ){ }
                mp.start();
            }else if( v == btn[1] ){
                btn[0].setEnabled(false);
                btn[1].setEnabled(true);
                btn[2].setEnabled(true);
                if( mp.isPlaying() ){
                    mp.pause();
                } else {
                    mp.start();
                }
            } else {
                btn[0].setEnabled(true);
                btn[1].setEnabled(false);
                btn[2].setEnabled(false);
                mp.pause();
                mp.seekTo(0);
            }
        }
    }
}

```


#参考文献
[【Android】MediaPlayerクラスを使ってmp3形式の音楽ファイルを再生してみる](http://blog.oukasoft.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/%E3%80%90android%E3%80%91mediaplayer%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6mp3%E5%BD%A2%E5%BC%8F%E3%81%AE%E9%9F%B3%E6%A5%BD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92/)
vscode で「php xdebug」設定したらxampp(apache)起動しなくなった

vscodeでデバッグをするため「php debug」と「php xdebug」をインストールした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/c7d7ab45-fc0c-16ee-a24a-027dfc1df7ee.png)

説明通りに
http://localhost/dashboard/phpinfo.php
に書かれている情報をコピーして
https://xdebug.org/wizard
へ貼り付け

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/7be75464-70d3-7002-d9fc-a1a9c5d4c84e.png)
表示された説明通りにdllファイルをダウンロードし、 \xampp\php\extへ貼り付け
php.iniに「zend_extension～」を追記し、xampp再起動したが、apacheが起動しない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/45b95a3c-3b66-92e9-fcfe-a3188500b09c.png)
色々調べたが解決策が見つからず、php.iniを元に戻し、デバッグしたところ、普通にできてるっぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/c1cf92db-757e-8967-355a-b209189bf420.png)
理由は分からないけど一旦解決しました。
時間があるときに調べてまた追記したいと思います。
dockerコマンドでコンテナの状態がどう遷移するかのまとめ

しばらくdockerを使っていないとコマンドの使い方を忘れてしまうので、dockerコマンドとコンテナの状態遷移を中心に整理してみた。
オプションは`-it`か`-itd`、あとは`--name <コンテナ名>`、ポート指定`-p 8080:80`くらいを抑えておけばいいか。


![Dockerプロセス遷移2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218194/b86ea117-7e3b-4b8d-9490-9f497c9e643d.png)
現在実行中のpython.exeのパスを取得するには

現在、当スクリプト.pyファイルを実行中のpython.exeのパスを取得するには: `sys.base_prefix`

```python:Console
import sys
sys.base_prefix
```

```:結果
'C:\\python-3.7.4.amd64'
```

<br>

P.S.

一方、Pythonで実行中の当スクリプト.pyファイルのパスを取得するには: `__file__`

```python:test.py
print(__file__)
```

```:結果
'C:\\test.py'
```

関連情報: 

https://qiita.com/dl_from_scratch/items/fbd3c9ba9afb178253f8
比較演算子と条件分岐

#比較演算子とは
値どうしをを比較するときに使います。書き方は数学で学んだのと似てるようで微妙に違います。
以下に比較演算子の一部を記述します。


|比較演算子  |条件式  |意味 |
|---|---|---|
|  > |  A > B| AはBより大きいか |
| >= | A >= B| AはB以上か |
| <  | A < B| AはBより小さいか |
| <= |  A <= B| AはB以下か |
| == |  A == B| AとBは等しいか |


#真偽値
真偽値とは式が正しいか違うかとことを表すもので
値が真であれば　true
値が偽であれば　false
で表される。

式の真偽の確認や、真偽値に対しての演算を行うことができる演算子を論理演算子と呼びます。

###論理演算子　OR　 ( |  | )
真偽値と共に使われた場合、 演算対象のどちらかが true ならば、true を返し、両方とも false の場合は、false を返します。
A || B (AまたはBみたいなイメージ)

###論理演算子　AND    ( && )
真偽値と共に使われた場合、 演算対象の両方が true ならば、true を返し、そうでなければ、false を返します。
A && B (AかつBみたいなイメージ)

###論理演算子　NOT    ( ! )   
!(エクスクラメーションマーク)は not演算子 と呼ばれ、否定の意味で使われます。
!と=を合わせた!=は、値同士が等しくない場合にtrueを返します。

A!=B(AとBは等しくない)

#if文
もし〇〇なら□□するのように条件によって処理を分岐させる物です

```
if 条件式 　　　＃この条件式がtrueの場合に処理が実行される
  処理
end
```
##elseを使うと条件式がfalseの時に実行する処理をかける

```
if 条件式
  # 条件式が真(true)のときに実行する処理
else
  # 条件式が偽(false)のときに実行する処理
end
```

##elsifを使うとより複雑な条件処理を作れる


```
if 条件式1
  # 条件式1が真(true)のときに実行する処理
elsif 条件式2
  # 条件式1が偽(false)のとき、かつ
  # 条件式2が真(true)のときに実行する処理
else
  # 条件式1と条件式2がどちらとも偽(false)のときに実行する処理
end
```
以上です。
【SwiftUI】Mapビューを使用する


#この記事は何？
iOS13では、SwiftUIでMapKitを扱うにはUIKit互換のビューでラップする必要がありました。iOS14で、SwiftUIネイティブなビューとしてMapが実装されたようです。
ここでは、「アップル本社の場所を地図上に表示するビュー」のコードを載せておきました。

###環境
- macOS11.1
- Xcode12.3
- Swift5.3

###コード

````Swift:SwiftUIのMapビュー
import SwiftUI
import MapKit

struct MapView: View {
    @State var region = MKCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: 37.3351, longitude: -122.0088),
        span: MKCoordinateSpan(latitudeDelta: 0.02, longitudeDelta: 0.02))
        
    var body: some View {
        Map(coordinateRegion: $region)
    }
}

struct MapView_Previews: PreviewProvider {
    static var previews: some View {
        MapView()
    }
}
````

###プレビュー

![スクリーンショット 2021-01-16 13.02.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/cf18e82a-3169-88c8-5610-ae44e4b10b6b.png)
【Mac】よく使うショートカットキー

自分用のまとめ
#環境
macOS BigSur バージョン11.1
#操作関係
・command + X：切り取り
・command + C：コピー
・command + V：ペースト
・command + Z：直前のコマンド取り消し
・shift + command + Z：直前の操作のやり直し
・command + A：項目をすべて選択
・command + F：検索
・command + B：選択したテキストを太字にする
・command + I：選択したテキストを斜体にする
・command + K：Webリンクを追加
・command + U：選択したテキストに下線を引く。
・command + ↑↓←→指定方向の先頭、末尾に移動

##画面関係
・shift+command+5：スクリーンショット撮影（macOS Mojave 以降）
※shift+command+４もしくはshift+command+３でもできる
・shift + command + N：Finder で新しいフォルダを作成
・control + command + Q：画面ロック

##Chrome関係
・command + option + i：デベロッパーツール起動
・command + r：ページの再読み込み
・command + option + →：右側タブに移動
・command + option + ←：左側タブに移動

##引用先
>  [Mac のキーボードショートカット - Apple サポート](https://support.apple.com/ja-jp/HT201236)
>[【Mac】ChromeのデベロッパーツールをF12で開くよう設定する](https://www.suzu6.net/posts/1/)
Gitを理解したい！！！（初心者の叫び）

#Git操作の理解の仕方

自分自身、Git(SourceTree)を使い始めて理解しかけなので、初心者ホヤホヤだからこそ、これからGitを学ぼうとしている人にとって心に寄り添った記事が書けるかなと思いました。


####理解するために必要な事
######1.なんかで作業している

やっぱり、ここがないときついですね。

自分は、過去にGitもGitHubもSourceTreeも使ってないのにGit入門みたいなyoutubeの動画を見て、それだけで満足！みたいなことがありました。

はっきり言って、それで理解できる人は宇宙人だなと思います。
同じ失敗をしないように是非とも何かで作業している状態が手元にあるといいです。

######2基本構造を理解してから…
サルでも分かるなどありますが、
https://backlog.com/ja/git-tutorial/reference/branch/#section1

やっぱり、初心者の心持としてはそれでも分からないものは、分からないのですよ。
初心者は、何が知りたいのかというと全体像が分かるといいのですよね。
常に、構造がやんわりと意識出来ていて、そのうえで細かい作業を使いながら覚えていく。

初心者が知りたい全体像はこれ。（ざっくりですよ！！）
![basic_structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599059/3d000ec7-e29a-f86b-95c8-5dbdfb116d87.png)

作業場で作ったのを、自分用の奴（笑）に保存して、みんなの奴に保存して共有できるようになる。
みんなのコードを、みんな見ることができれば、みんなハッピー！って感じ（？）

これを把握してないで、コミットとか、プッシュとか……、

もう白旗上げるしかない。

ちなみに、自分のパソコンをステージと呼びます。
ググると、当たり前のようにステージとか呼ばれているので、ここで心構えしておこう。

######3 基本操作をかじる（必要最小限）
さっきの基本構造を把握したうえで、基本的な操作を図式に加えるとこんな感じ。

![basic_control.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599059/2cc4598d-e8ea-f2e0-a0d6-86671a57e6b4.png)

プッシュとか、コミットとかって何をしているのかというと、「反映」です。

自分のパソコンの作業状況を、自分の奴（保存先）に「反映」させるのが、コミット。
自分の奴（保存したもの）をみんなの奴（保存先）に「反映」させるのが、プッシュ。

######4 後は、ググりながら、使いながら覚える。
ここは、色んなサイトや動画で言われている通りですね。激しく同意。

#終わりに
本当にふざけた、記事だったかと思いましたが、ご覧いただきありがとうございました。

今回は、ブランチには全く触れませんでした。

というのも、Gitとは？でググると、基本的に我々初心者でも、バージョンを管理するツールであることは容易に理解・納得できるからです。

「なるほど。確かに、コードを編集してどんどん上書きした時に、上書き前を見れなかったり、どこを書き換えたのか見れないのは、なんとなく不便であるなぁ」

と、言った具合です。

自分自身まだまだ、理解が浅いのでつよつよの方々！
お叱りの程よろしくお願いいたします。


# コマンド集
###設定
```
git config --global user.name <name>
git config --global user.mail <mail>
```
###コミット＝上書き
```
git commit -am "なにか書く" // -am でステージングとコミット同時に行う
```

###プッシュ＝反映
```
git push origin <ブランチ名>
git push -u origin <ブランチ名> // -uを付けるとそれ以降、git pushで良くなる（origin masterを省略できる）
```

###リモートのリポジトリを確認
```
git remote -v
```
ECS Fargateを起動時に「CannotPullContainerError」が出てしまう場合の対処法

FargateのタスクでDockerHubからイメージを取得したいときに起きたエラーです。
原因や対処法を紹介していきます。
## 「CannotPullContainerError」の原因
主な原因としては、サブネット上から外部ネットワークへの通信ができずに、imageのpullに失敗しているからです。

## Fargate起動時の「CannotPullContainerError」への対処法
Fargate起動時の「CannotPullContainerError」への対処法を紹介していきます。

### 1.Fargateに設定されたサブネットが外部と通信できるようになっていない
Fargateに設定されたサブネットから外部への通信ができないと「CannotPullContainerError」のエラーになってしまいます。

サブネットに関連付けられているルートテーブルからインターネットゲートウェイまたはNATゲートウェイへの通信が許可されていないといけません。

更にそれらのインターネットゲートウェイまたはNATゲートウェイを通して、外部への通信を許可できる設定になっていないと上記のエラーが起きてしまいます。

#### インターネットゲートウェイの場合の設定
インターネットゲートウェイの場合は以下のように設定することで外部との通信ができるような設定にできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386018/a8ca2bc7-6a1b-cef6-93e3-99a83e413c71.png)

### 2.ネットワークACLのアウトバウンドが許可になっていない

ネットワークACLはデフォルトでは以下のように外部との接続は許可されていますが、設定で通信を許可されていない場合は外部との通信ができません。

上手く行かない場合は以下のように一度すべての通信を許可して試してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386018/41abc885-3faa-7351-8039-48e8ae6ea4ae.png)

## まとめ
「CannotPullContainerError」は外部との通信ができずに起きるエラーでした。AWSは正しく設定できていないと外部との通信ができないので気をつけましょう。

おかしなところや分からない所があったら指摘頂けると助かります。

## 参考
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-pull-container-error/
副問合わせ -SELECT文にサブクエリとは

# SQLの副問合わせ
今回私はPostgreSQLについて学習していて、
そこで**副問合わせ**WHERE句に位置するサブクエリについて学習したので記事にしました。

## 副問合せとは

副問合せとは、別名サブクエリとも呼ばれます。
>クエリ(query)とは、お問い合わせという意味

副問合せは**あるSELECT文の結果を別のSQL文で利用すること**です。

※副問合せは、INSERT, UPDATE, DELETEでも使用可能


## WEHRE句に存在する副問合せ

以下のテーブルを使用して説明していきます。
＜テストテーブル＞
 
| company_name | start_company | money |
|:-:|:-:|:-:|
| 森永製菓  | 1982-03-06  | 4000  |
| 三菱電機 | 1890-07-28  | 5000  |
| パルシステム  | 2017-12-10  | 8500  |

WHERE句に副問合せがあるとするサンプルコードです。

```sql
SELECT * 
FROM campanies
WHERE money > (select AVG(money) FROM campanies);
```

上記SQL文を言語化してみます。

```
すべてのカラムデータを
テーブル<companies>から抽出する。
条件として、<money>カラムの平均値より大きいデータをテーブル<companies>から抽出する。
```

三行目のWHERE句にSELECT文が追加され、これがWHERE句に存在する副問合せです。
>AVGは関数で平均を求めるものに使用します。
moneyの平均値は5833.333になりますのでパルシステムのみが抽出されます。


結果は以下の通りです。

| company_name | start_company | money |
|:-:|:-:|:-:|
| パルシステム  | 2017-12-10  | 8500  |


以上です。

私もまだまだ勉強中です。頑張りましょう！
MATLAB plotのpdf保存

MATLABのplotで作ったグラフをpdfに保存する方法について書いてみます。
グラフをpdfで欲しいという人は、LaTeXを使う人くらいかと思いますので、ここではLaTeXを使う人を想定しています。

# exportgraphics コマンドを使う (R2020a以降)

[ヘルプセンター exportgraphics](https://jp.mathworks.com/help/matlab/ref/exportgraphics.html#mw_7a93ede8-e568-4fd7-bed7-7777278c85bd "exportgraphics プロットまたはグラフィックスの内容をファイルに保存する")

R2020a以降が使えるのであれば、exportgraphicsを使うのが一番簡単です。

```matlab:sineWave.m
%%
x = 0:1e-2:2*pi;
y = sin(x);

%%
fig_h = figure;
po1 = plot(x, y);
xlabel("x")
ylabel("y")
legend("sin(x)")
ax = gca;
ax.FontName = "Helvetica";
ax.FontSize = 14;
ax.XLim = [0, 2*pi];
ax.YLim = [-1.2, 1.2];

%%
exportgraphics(gca, "sineWave.pdf");
```

対象となるオブジェクトがaxisで、figureハンドラではないことに注意が必要です。
(saveasはfigureハンドラを指定します。)

![sineWave.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1029341/61866c95-946f-d890-a1de-6e85bf91379b.png)


# saveas + pdfcropを使う (要 LaTeX環境)

R2020aより以前ではsaveasを使うのがひとつの手です。
saveasでpdfに保存できるのですが、問題があります。
グラフ領域だけでなく、A4ページまるまると出力されてしまう点です。

ですので、補助ツールとしてpdfcropを使います。pdfcropは余白を調整するツールです。
pdfcropはTeXLiveに含まれています。

MATLABスクリプトで処理するには、例えば下のようにします:

```matlab
saveas(fig_h, "sineWave1", "pdf")
pdfcropCOM = "c:/path/To/pdfcrop.exe";
system(pdfcropCOM + " sineWave1.pdf sineWave1-crop1.pdf")
```

pdfcropはかなりギリギリのところで切り取ります。マージンを指定するには

```matlab
saveas(fig_h, "sineWave1", "pdf")
pdfcropCOM = "c:/path/to/pdfcrop.exe";
system(pdfcropCOM + " --margins ""8 8 8 8"" sineWave1.pdf sineWave1-crop2.pdf")
```

のようにすれば良いです。--marginの後の数字はお好みで。

### pdfcropの中身

pdfcropコマンドの実体はPerlスクリプトです。
中の処理は[TeX Wiki/pdfcrop](https://texwiki.texjp.org/?pdfcrop "TeX Wiki/pdfcrop")によれば

- Ghostscriptでバウンディング・ボックスを取得
- 仮のLaTeX文書を生成して、対象のpdfファイルを画像として取り込む。この時に上記のバウンディング・ボックスを利用する。
- pdflatexで pdfとして出力する

とのことです。ですのでLaTeX環境がひと通り必要です。一筋縄ではいかない…。



# export_figを使う (要 Ghostscript)

[MathWorks File Exchange/export_fig](https://jp.mathworks.com/matlabcentral/fileexchange/23629-export_fig "MathWorks File Exchange/export_fig")というツールが公開されています。
これでダイレクトに適切な大きさのpdfを出力できます。

(2009年くらいから公開されているようです。)

```matlab
export_fig("sineWave3.pdf", fig_h)
```


### export_fig の中身

pdfを出力する際のexport_figの中では、まずepsに出力してGhostscriptを呼び出すようです。
だからGhostscriptが必要なのですね。
Node.jsでhelloworld

# ゴール
Node.jsを使用して、コンソールにhelloworldを表示させる


# 前提
Visual Studio Code（以下 VSCode）使用
DockerでNode.jsのコンテナを使用

#Node.jsとは
- 本来クライアント側の言語であるjavascriptを、サーバー側でも使えるようにした仕組み（※1）
- webサイトやwebアプリ、スマートフォンサイト、ゲームなど様々なものをつくることができる
  =>paypalやuverなどもNode.jsでつくられているそう！
- 大量のデータ処理が得意で、処理スピードも早いのが特徴

※1　progate「Node.jsとは」より引用　https://prog-8.com/nodejs/study/1/1#/2
参考：https://udemy.benesse.co.jp/development/system/node-js.html

#DockerにNode.jsをダウンロードする

VScodeの拡張機能のDockerをあらかじめインストールしておく。（※2）
###docker-compose.ymlファイルの作成
`Nodejs-sample-app`(任意のフォルダ名でよい)フォルダを作成。
その下に`docker-compose.yml`ファイルを作成。
こちらはdockerにコンテナをダウンロードする時のお決まりのファイルとなるので、ファイル名は固定。ymlファイルは、YAMLという書き方に沿って記載されたテキストファイルで、データの受け渡しなどに使用される。
今回は以下のように記載した。

```docker-compose.yml
version: "3"
services:
    node:
        image: node:14.15
        volumes:
            - .:/project
        tty: true
        working_dir: /project
        command: bash
```
それぞれの項目の意味

※2　詳しくはこちらのページがおすすめです
@Teach 「VSCodeでDocker入門」 https://qiita.com/Teach/items/ca09b8882f519dca600c

###docekerにイメージをダウンロード
VSCodeのターミナル機能を使い、`Nodejs-sample-app`フォルダの中に入り、以下のコマンドを打つと、docerにNode.jsがダウンロードされる。

```
docker-compose up -d
```

イメージ
![スクリーンショット_2021-01-16_10_53_46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663834/6b5cd6fa-83c4-bab7-ad86-d7b1ed6a7154.jpeg)

dockerを開いて、このような表示になった成功です！
　![スクリーンショット_2021-01-16_10_54_20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663834/e15b6c20-17c0-05e2-6889-b5b8910574bc.jpeg)

コンテナの中に入るためにはAttach shellを選択します（写真参照）
![スクリーンショット_2021-01-16_12_33_56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663834/9e1668d2-c395-6961-e9c7-9b5bdd62952f.jpeg)

ローカル内のターミナルとコンテナ内のターミナルはこちらで切り替えができます
![スクリーンショット_2021-01-16_12_38_45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663834/a95142f0-7fec-ca70-f944-1c88e5219249.jpeg)

###app.jsファイルの作成
`docker-compose.yml`と同階層に`app.js`ファイルを作成。
今回は以下のように記載

```app.js
console.log("Hello nodejs");
```
コンテナ内のターミナルで
```$ node app.js```
とコマンドを打ち、以下のように表示されたら、Node.jsの環境構築は完了です！

![スクリーンショット_2021-01-16_12_47_28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663834/a2844d6f-68de-12c5-7c35-d6baf8f095fb.jpeg)
ターミナルから爆速で回線速度を計測する

# はじめに

昨今、インターネット上には回線の速度を簡単に測定できるサービスが多く存在しています。
その中に、Netflixが展開しているFAST.comという便利なサービスがあります。

https://fast.com/ja/

上記リンクにアクセスすると接続している回線の速度を測定してくれます。
そこで、回線速度を計測したいときにブラウザを使って測定サイトにアクセスしなくても、ターミナルからFast.comを経由して爆速でインターネット回線速度を図る方法が便利だったためまとめてみました。

# 公式コマンドラインツール「fast-cli」のインストール

Node.js（バージョン8以降）がインストールされている場合、npmやYarnなどのパッケージマネージャーから簡単に導入できます。以下のコマンドをターミナルにて実行しグローバルにインストールすることで使えるようになります。

## npmでインストール

```shell
$ npm install --global fast-cli
```

## Yarnでインストール

```shell
$ yarn global add fast-cli
```

# 実行

## ダウンロード速度の計測

```shell
$ fast
```

上のコマンドで回線のダウンロードの速度計測が始まります。オプションとして`--upload , -u`を付けないとダウンロードのみの計測となります。

## ダウンロードとアップロード速度を計測

```shell
$ fast --upload
```

ダウンロード速度とアップロード速度をそれぞれ計測します。

## ダウンロード速度を計測して結果を一行表示

```shell
$ fast --single-line
```

一行でシンプルにダウンロード速度を計測します。

## fast-cliのヘルプを表示

```shell
$ fast --help
```

使用可能なコマンドと使用例を表示します。

# おわりに

ターミナルから簡単に回線の速度を図れるのは便利です。公式のコマンドラインツールということもあり、計測も安定していて精度も良さげです。是非活用してみてください。

Discussionにて紹介されたのですが、同じようなツールとして[Speedtest CLI](https://www.speedtest.net/ja/apps/cli)があります。こちらの導入したときのメモは[スクラップ](https://zenn.dev/ryuu/scraps/2d4e2592dbe45d)にまとめております。合わせてご覧ください。

最後まで読んでいただきありがとうございました。

# 参考

- [sindresorhus / fast-cli](https://github.com/sindresorhus/fast-cli)
- [回線速度のテストができる「fast」コマンドが便利だった](https://qiita.com/suin/items/8398f0b07299a3cc194f)
- [windows10 fast.com のコマンドラインツール「fast-cli」を使って回線速度を計測する](https://mebee.info/2020/04/28/post-10023/)
【React Native】Expo Developer Tools is disconnected from Expo CLI.というエラー

#はじめに
React Nativeの環境構築を公式サイトやUdemyで紹介されている手順通りしようとしたら、
Expo Developer Tools is disconnected from Expo CLI.Use the expo start command to start the CLI again.
というエラーが出てしまい、これを解決するのに少し時間がかかったので共有します。

#環境構築
Node.jsをインストールした後、この順番でターミナルを動かしていました。

```
$npm install --global expo-cli
$expo init my-project
```
この時点で何となくUdemyの動画と少し違いました。
おそらくReactの環境構築した際に、brewやyarnもインストールしていたのでそれが原因なのではないかと思います。
これでnmp start, yarn start, expo startのどれを実行しても上記のエラーが出てしまいました。

#解決方法
```
$brew update
$brew install watchman
```
これを実行したらエラーは解決しました。
brewのバージョンが古かったのかもしれません。
また詳しく分かったら共有したいと思います。
Laravelでエラー「419 | Page Expired」が出た時の対処法

#問題
Laravelでフォーム送信をしてページ遷移した時に419 | Page Expiredのエラーが出ました。


![スクリーンショット 2021-01-16 12.20.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535877/86978916-3330-1c2c-0232-a965acfe03f0.png)

#解決法
\<form>\</form>タグの中に@csrf(クロスサイトリクエストフォージェリ)を記述し忘れていたことが原因でした。


```.php
<form>
@csrf

</fom>
```