OmniAICreator/Qiita-1.07M huggingface dataset:
コロナウイルスによってボコボコにされたフィリピン留学業界の未来を考察してみた

今、瀕死状態の留学代理店を存続させるべく、当事者の私が代表し、現状の問題、解決策を考えてみました。

エージェント界隈は横のつながりも広いため、情報を共有しあって共存する方向に向かっています。

非常に苦しい状況が続いておりますが、一緒に乗り越えていきましょう。



フィリピン留学エージェント界隈の現状
2021年2月現在、フィリピンへの渡航が厳しい中、留学することは不可能です。

フィリピン留学を希望する日本人と、フィリピンにある語学学校をマッチングすることで収益を上げていたエージェント会社（代理店）の売り上げは、99%減という結果になりました。

今の留学エージェントの状況を整理すると以下タイプに分かれます。

①固定費を減らし身を潜める
②商材を大きく変える
③独自サービスを作る



①固定費を減らし身を潜める

・留学エージェント一本でやってた会社
・留学エージェント兼、語学学校を運営していた会社

は軒並み、バタバタと倒れていきました。

雇用調整助成金で、社員さんをカバーしている会社も多いですが、社員をリストラせざるを得ない状況です。

特に、高給取りのマネージャー、社長の右手ポジションの重鎮が辞めさせられています。

固定費（人件費、家賃）を最小限にし、冬眠体勢に入っています。



②商材を大きく変える

留学エージェントは、広告代理店業です。

学校の代わりにお客さんを探し出し、商材を紹介し、マージンをもらう。

いわゆる、広告、集客のプロなんですよね。

適応能力が高い会社の中には、マスクを売ったり、人材業に移行したり、Webマーケティング業に変更したりとあらゆる手段を使い生存戦略を練っています。



③独自サービスを作る

留学の需要と共有のバランスが大きく崩れ、留学生の行き場がなくなり、大きく市場が変化しました。

留学エージェントとしての知見を生かし、新たな需要を作り出す会社もあります。

私が、2020年11月にスタートした「国内留学サービス」もそのうちの一つです。

- 国内留学・英語合宿ならECヴィレッジ
海外留学に比べて格安な費用で安全に英語を習得できます。短期集中の英語合宿プランも。
https://ec-v.com/

日本では実現が難しい国際交流を主軸とした、他国籍の生徒と繋がることができる、「オンライン擬似留学サービス」なんかもあります。

https://class-live.com/



0から１を作り出す作業で、大きなリスクを取る必要がありますが、留学を失った人たちの需要をうまくカバーすることができれば、生き残りが約束されます。

「留学が再開した際にそのサービス需要は継続されるのか？」という点も考慮する必要がありますね。



フィリピン語学学校の現状
フィリピンにある語学学校の施策として、大きく3つのタイプがあります。

①閉校する
②冬眠状態に入る
③オンラインにシフトする


①閉校

資金繰りが厳しくなり、閉校する学校がポツポツ出てきています。

私が知る限り、7校の学校が閉校となりました。

学校側から連絡がきておらず把握できていない物もありますが、最低でも7校潰れています。

また、新たな資本、投資家と提携し、延命措置をとる学校もあります。



②冬眠状態に入る

キャンパスは残したまま講師をリストラし、開国に向けて冬眠状態に入っている学校は、体感として7割くらいかなと。

とはいえ、家賃はかかり続けるので、2021年秋の開国が難しいようであれば、閉校する学校はさらに増えると予想されます。



③オンライン留学にシフトする

比較的、資金の余裕がある学校は、オンライン留学サービスの提供をスタートしています。

特に、日本資本校よりも韓国資本校の方が、積極的に仕掛けていますね。

講師の確保ができ、留学再開直後でも質の高いレッスンができるのも大きなメリットですね。

既存の大手オンライン英会話界隈に主戦場を移す必要があるので、簡単な道ではないですが、独自性、団体提携、法人提携ができればまだ道は残されているのではないでしょうか？

いずれにしても、リスクを伴う施策となるので、ためらう経営者も多くいます。



フィリピン留学はいつ再開される？
圧倒的に1番多くいただく質問です。

結論として、わかりません。

希望的観測では、2021年10月には開国して欲しいなと願っています。

10月の開国が難しいとなると、フィリピンの治安面、インフラ面、医療面に大きな不安が出てきます。また、閉校となる学校も多く出てくるでしょう。

会社を存続させる為にも、最悪の事態を予想し、あと2年は留学が再開できない可能性と考察し準備した方が良いですね。

また、再開した時の懸念点として、「誰がファーストペンギンとなるか？」です。

「まだ留学は早いだろ！」「コロナにかかったらどうするんだ！」

手配した留学エージェント会社、語学学校は、間違いなく批判の的になるでしょう。



批判を承知した上で、一足前に行動しないといけないのは、我々留学エージェントなのかもしれませんね。



今後のフィリピン留学業界のために、嫌われる覚悟はできています。



今後予想される展開
現状、フィリピンにある多くの学校は、韓国資本校と日本資本校です。

しかし、資本が尽きて学校運営が難しくなると、当然学校は売りに出されます。

すでに、いくつかの語学学校が売りに出されてはいますが、さらにその動きは加速するでしょう。

事実、「フィリピンの学校を買いたい」と希望する日本の会社もあるんですよね。

運営元が変わると、学校名、特徴、運営方針がガラッと変更される可能性もあります。

「今まで知っていた学校とは全然違う。」状況が出てきます。

となると、また1から学校視察や、スタッフとの関係作りが必要ですね。



もう一つ予想されるのが、中国資本の介入ですね。

外交問題などハードルはありますが、今回のコロナによって大幅に変更する可能性もあります。

コロナ前も少しづつ中国資本が入ってきているという噂はあったので、この流れが本格化するかもしれません。



正しく、資本主義社会ですね。



留学エージェントと、国内留学サービスを運営している私にとっては、早く留学が再開されることを祈るばかりです。

未来を予想するのは、難しいですが準備はできるはずです。

フィリピン留学業界を失わないためにも、皆さんで協力し、新しい施策を考えていきましょう！



もし、国内留学を始めたよ！紹介して欲しい！という方がいればご連絡ください！以下の記事にて紹介させていただきます！

英語が学べる国内留学の全てがわかる！メリット、デメリット、費用の比較【目的別のおすすめ学校10選】
https://cebridge.jp/kokunai-ryugaku-osusume/

では！
【Laravel】unique:usersとは？バリデーションルールの一つ。指定したテーブルの中で重複なし。

Laravelの認証機能で登録する時にバリデーションルールとして`unique:users`が設定されていたので、内容を調べてみた。


```php:RegisteredUserController.php（バリデーションルールのみ抜粋）
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|confirmed|min:8',
        ]);
```

emailで使われている。


##`unique:users`の意味
・`'カラム名' => unique:テーブル名` 

指定したテーブルのカラムで重複がないというルール。




<br>
###（補足）バリデーションルールの意味

```
'email' => 'required|string|email|max:255|unique:users',
```

| ルール | 内容 |
|:-:|:--|
| required  | 必須  |
| string  | 文字列  |
| emal  | e-mailの形式であること。 xxx@yyy  |
| max:255  | 最大２５５文字  |
| unique:users  | 指定したテーブルの中で重複なし  |
【mySQL8.0.23】Laravel 接続エラー

mySQLバージョン8.0.23のローカル環境で、Laravelに接続する際、エラーになったので、解決方法をメモ。
mySQLのバージョンによっては、pluginを変更しないと繋がらないらしい。

```
 
//エラー内容
Illuminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema =....

```

データベースの現在のuser,host,pluginを調べる。

```
mysql> use mysql
```

use mysqlに変更して、

```
mysql> select user, host, plugin from user;
```

で確認。

```
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
```

Laravelと接続したいuserのpluginを変更。

```
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY '好きなパスワード';
```

無事接続。
iTerm2を便利に使うためのTips7選

# はじめに
僕が普段使っているターミナルは**iTerm2**です。
おそらく、みなさんの中にもiTerm2を普段使いのターミナルにしている方は多いかと思います。
iTerm2には色々な機能があり便利なのですが、標準のターミナルからiTerm2に変えたばかりの人はどの辺が違うのかなどを知らないことが多いかと思います。
なので、本記事ではiTerm2をより便利に使うための機能について紹介をしていきます。

## テーマ変更
iTerm2では、カラースキームを変更することができます。
Macの標準のターミナルでも変更することができますが、コマンドプロンプトを今まで使っていた人はカラースキームを変更するとモチベーションがアップしたり、ターミナルが見やすくなると思います。

> https://qiita.com/okohs/items/adf36737973c4e2d0336

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/fe21a842-43bb-5ba6-7e1a-12d4aefc18d0.png)
僕のターミナルの画面です。ちょうどnewmanを使った跡があったので載せておきます。

## タブ機能
この機能も標準のターミナルにあったかと思います。ブラウザのように`Command+T`で新しいタブを開くことができます。
複数のタスクを行いたいときに重宝すると思います。
`Command+W`でタブを削除することができます。`Control+Tab`でタブ切り替えができます。

## 画面分割
**Vim**を使う方は画面分割ができるととても便利だと思います。
iTerm2では、`Command+D`で画面を分割することができます。僕はよくこの機能を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/400e4c5f-7f3c-272d-0600-b33c36353033.png)

このように２つの画面を同時に表示することができます。
`Command+D`で閉じることが出来ます。

## 文字列検索
これもブラウザのような機能で、iTerm2内で文字を検索することができます。
`Command+F`で文字列の検索用のフィールドが出現するので、そこに検索したい文字列を表示するとiTerm2が検索をしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/fe3dfa4e-2418-733d-a8d9-eedf768f128f.png)
このようにハイライトで表示してくれます。

## 処理の完了通知
PaaSにコンテナをデプロイしているときや、重たいダウンロードをしているときはiTerm2の処理が終わるまで待たなくてはいけません。
しかし、この処理完了通知機能を使えば、重たい処理が終わったタイミングで通知を送信してくれます。
重たい処理が実行されている状態で`Command+option+A`でオブザーバーをiTerm2のウィンドウにセットします。
そして、処理が完了するとiTerm2を開いていなくてもiTerm2が通知を送信してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/5e80bd0a-035b-bcd5-d97b-d7678105f2b5.png)

このようなマークが画面の右上にセットされます。

## 保持しておくテキストの行数を変更
Preferencesから、iTerm2のバッファに保持しておくテキストの行数を変更することが出来ます。
無限に保存しておくこともできますが、動作が重くなってしまったので僕はやめました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/a8b7ba7e-b8a9-b2ac-42a8-a342e4f25ba2.png)

## カーソルを素早く移動
ターミナル上では、クリックをするだけではカーソルの位置を移動させることは出来ません。
しかし、実際はカーソルを移動させる方法はいくつかあります。

- `option`を押しながらクリックでカーソルの位置をクリックした場所に移動
- `option`を押しながら方向キーを押すと1単語ずつカーソルが移動
- `Command`を押しながら方向キーを押すと、文頭または文末にカーソルが移動

です。

# おわりに
今回は複雑な設定なしにiTerm2をより便利に使う方法を紹介しました。
デフォルトのターミナルを使用している方は是非一度試してみてください。
Drone.ioのstepを可視化して理解しやすくするツールを作った

# なぜ作ったか

私事ですが、この1月から新しいチームに配属され、様々なキャッチアップをしていく中で、Droneのstepを読み解くためにYAMLファイルと睨めっこするのが辛かったので、図示してみたところ思った以上にいい感じになったので、ツール化することにしました。

# できたもの

こちらです↓
https://inajob.github.io/drone-steps-visualizer/

# 利用できそうな技術

昔作ったPod Manifest Visualizerを少し改造すればすぐに作れそう？ と思い思いっきり流用しています。

https://qiita.com/inajob/items/154a66cb9752ac7159a1

# 原理

`.drone.yml`を読み込んで、`steps`の子要素を調べ`name`と`depends_on`を収集し、mermaid.js記法を生成し、レンダリングしています。

whenの条件をシリアライズしてsubgraphのタイトルにすることで、同じ条件で起動するstepをわかりやすくしています。

# 制限
- `pipeline`間の`depends_on`を図示できていません。(mermaid.jsはsubgraphに矢印をつけることができないため)

# スクリーンショット

ブラウザで動作します。JavaScriptのみで動作しているので、サーバ側のロジックは不要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100375/a4e63d41-06b5-f033-b9cd-f3eefbfa1763.png)


# 試しに図示してみる 

世の中でDroneを使った有名なプロダクトが何か知らないので、適当に検索して探します。

https://www.google.com/search?q=.drone.yml+site%3Agithub.com+depends_on

# oliver006/redis_exporter
https://github.com/oliver006/redis_exporter/blob/23690d1c0bb4d55fb784259761899dee05a5915f/.drone.yml

わかりやすくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100375/e7e7fbde-e787-abf6-1859-fd4f74c77676.png)

# go-gitea/gitea
https://raw.githubusercontent.com/go-gitea/gitea/master/.drone.yml

わかりやすくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100375/5a81edc5-d443-6ae7-64ad-00eef7e367d3.png)



#  grafana/grafana
https://raw.githubusercontent.com/grafana/grafana/master/.drone.yml

限界もあります・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100375/f88285a8-9d14-cb1a-e43e-62bf8055b8a7.png)

# まとめ

以前の[KubernetesのPodの可視化](https://qiita.com/inajob/items/154a66cb9752ac7159a1)でも感じましたが、mermaid.jsによるブラウザでの可視化ツール作成は、コスパの良い手法のように思います。

身近なグラフ構造のデータを突っ込んで色々と可視化してみると面白いと思います。
Gravio 4でGoogle Castデバイスを発見する

Gravio 4を使ってGoogle Castのデバイスを発見する方法は簡単。

```
catt scan
```
というコマンドが使えるので、これをExecコンポーネントで実行するだけ。

デバイスの名前がはっきりわからないときなどに重宝します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/9249a427-8f5d-b323-f3e2-ed332609586a.png)

# 使用環境
* Raspberry Pi 4 Model B w/4GB RAM
* Ubuntu Server 20.04.1 LTS
* Gravio HubKit v4.1.0-6380
* Gravio Studio v4.1.5432.0
Minkowskiの不等式(ミンコフスキーの不等式)とその証明

#Minkowskiの不等式

- 主張 

$1 \leq p \leq \infty$とする. このとき $f, g \in L^p$に対して以下が成り立つ.
$$\\|f + g\\|_{L^p} \leq \\|f\\| _{L^p} + \\|g\\| _{L^p}$$

これは $L^p$ノルムへの三角不等式の一般化といえる.

- 証明

まず $f, g \in L^p$であるとき $f + g \in L^p$であることを示す必要があるが, これは $|f + g|^p \leq (|f| + |g|)^p \leq 2^{p - 1}(|f|^p + |g|^p)$より従う.

 - p = 1のとき

    三角不等式より
$$\int_\Omega |f(x) + g(x)| dx \leq \int_\Omega |f(x)| dx + \int_\Omega |g(x)| dx$$

 - p = $\infty$のとき

      $L^\infty$ノルムの定義より明らか.

 - $1 < p < \infty$のとき

      $\frac{1}{p} + \frac{1}{q} = 1$となる $q$をとると$(p - 1)q = p$より,

```math
\begin{align*}
\int_\Omega |f(x) + g(x)|^p dx &= \int_\Omega |f(x) + g(x)|^{p - 1}|f(x) + g(x)| dx \\
&\leq \int_\Omega |f(x) + g(x)|^{p - 1}|f(x)| dx + \int_\Omega |f(x) + g(x)|^{p - 1}|g(x)| dx \\
&\leq \left( \int_\Omega |f(x) + g(x)|^{(p - 1)q} dx \right)^{\frac{1}{q}}\left( \int_\Omega |f(x)|^p dx \right)^{\frac{1}{p}} + \left( \int_\Omega |f(x) + g(x)|^{(p - 1)q} dx \right)^{\frac{1}{q}}\left( \int_\Omega |g(x)|^p dx \right)^{\frac{1}{p}}\hspace{15pt} (\because \text{Hölderの不等式}) \\
&\leq \left( \int_\Omega |f(x) + g(x)|^p dx \right)^{\frac{1}{q}}\left( \|f\|_{L^p} + \|g\|_{L^p} \right)
\end{align*}
```

となり, 両辺を $( \int_\Omega |f(x) + g(x)|^p dx)^{\frac{1}{q}}$で割ることで示すべき不等式,
$$\\|f + g\\| _{L^p} = \left( \int _\Omega |f(x) + g(x)|^p dx \right)^{1 - \frac{1}{q}} \leq \\|f\\| _{L^p} + \\|g\\| _{L^p}$$
が得られる.

#一般化
Minkowskiの不等式は一般化でき, 以下が成り立つ. $(\Omega_1, \mu _1), (\Omega_2, \mu _2)$を測度空間として$1 \leq p \leq \infty$と $\Omega _1 \times \Omega _2$上の可測関数$f(x, y)$に対して,
$$\left( \int _{\Omega _2} \left\\{ \int _{\Omega _1} |f(x, y)| d\mu _1 \right\\}^p d\mu _2 \right)^\frac{1}{p} \leq \left( \int _{\Omega _1} \left\\{ \int _{\Omega _2} |f(x, y)|^p d\mu _2 \right\\}^\frac{1}{p} d\mu _1 \right)$$
となる.
【ngrok】ngrokでwebサービステスト公開

#はじめに
ngrokの公式HP：https://ngrok.com/
###記事に書いてあること
前編：ngrokってなに?
後編：ngrokをつかってローカルサーバーをインターネットに公開

###ngrokとは？？
@@@@
ngrok allows you to expose a web server running on your local machine to the internet. Just tell ngrok what port your web server is listening on.
@@@@
日本語訳：ngrokを使用すると、ローカルマシンで実行されているWebサーバーをインターネットに公開できます。 

###ngrokと検索した結果
![スクリーンショット 2021-02-09 14.08.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/1798496f-0bd0-3bc1-7f90-2d14a56fdc78.png)


#動作環境
・Mac book air 2015 early

#それではやってみる

##0.ngrok.comからサインインする
https://ngrok.com/
サインインするとダッシュボードにはいれます。

##1.fileをダウンロードして解凍する
Download for Macからダウンロードする
![スクリーンショット 2021-02-09 13.50.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/cb553ac5-fba8-1229-dd47-d9ebdb6adcae.png)
解凍するとこんな感じのファイルがでてきますよ〜〜
（上が解凍前、下が解凍後）
![スクリーンショット 2021-02-09 13.51.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/6ae023e6-e255-e84d-4ac6-e9e6a1427d78.png)


##2.ダッシュボードに書いてあるコマンドを打ち込む
↓のような説明書きがあるのでその通りにコマンドを打ち込む
（ダウンロードした画面の下に書いてあるコマンドです）

1. Unzip to install（zipの解答：↑でやりました）
$ unzip /path/to/ngrok.zip

2. Connect your account（アカウントを紐づける）
$ ./ngrok authtoken xxxxxxxxxxxxxxxxxxxxxxxxxxxx
僕はDownload直下で解凍したので、その階層でコマンドをうちます

##3.ローカルサーバーを立ち上げる
僕はpythonでlocalサーバーを立ち上げました。

//local severたちあげ
$ python server.py  

server.pyと同じ階層に
先ほど解凍したngrokファイルをおいて

$ ./ngrok http 8888←任意のポート

を実行すると、下の写真みたいな感じになります。
![fdsfwae.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/63f0fba5-e251-cc1c-76ef-073ad04e7de9.png)

赤枠のURLをブラウザにうちこんであげれば、httpとhttpsどちらも取得することができます。
（ちなみにfreeプランの場合、立ち上げるごとにURLは変更されます。この記事を書いている時点でこの写真のURLは僕のものではなくなっています。）

トンネル化なので、ローカルサーバーを立ててあげないと、うまく機能しません。
その場合はこんな感じのエラーがでるはずです。
![fawe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/ec340c9d-ba35-0cc9-aa4d-ed1c6aacb75c.png)



##おわり
今回は、httpsでカメラをつかったサイトをデプロイ？しました。
ちゃんと動いています👍

無料でこれはいいですね！！
![スクリーンショット 2021-02-09 14.05.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/b14897ee-108e-e64c-de28-efd46149708e.png)
VSCodeでSSH接続【Raspberry Pi】

## 1．ゴール
PCにインストールされたVSCodeからRaspberry Piのディレクトリにアクセスしファイルの編集を行う．
## 2．必要なもの
 ① VSCode
 ② Raspberry Pi （PCと同一のローカルWiFiに接続済のもの）
## 3．方法
1. Raspberry Piのローカルipアドレスを調べる．
Raspberry Piのターミナルを開き，接続しているネットワークにおけるローカルipアドレスを調べる．

```linux:terminal(RaspberryPi)
$ ifconfig
```
表示された結果から，```wlan```の中の```inet:123.456.789.00```数値部分がローカルipアドレスとなる．WiFiでなく，有線接続の場合は```eth0```のアドレスを参照．


2.．VSCodeを起動，ターミナルを開く．
"username"の部分にログインしたいRaspberry piのアカウント，@後にアドレスを入力する．

```shell:terminal
$ ssh username@123.456.789.00
```

3． パスワードの入力

下記のようにパスワードを求められる場合は入力．

```shell:terminal
username@123.456.789.00's password:
```

正常に接続できた場合には下記のように表示される．

```shell:terminal
Linux raspberrypi 5.4.83-v7l+ #1379 SMP Mon Dec 14 13:11:54 GMT 2020 armv7l

The programs included with the Debian GNU/Linux system are free software;  
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Jan 20 22:27:50 2021 from 
```

##VSCodeからディレクトリ操作をGUIで行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969489/e74eba5b-bd78-cd75-476c-23c4c8c22b86.png)

ssh接続をした状態であればコマンドによって(CLIによる)ファイル操作が可能だが，VSCode上でファイル一覧などPCの操作と同じように行いたい場合，VSCodeのプラグイン"Remote-SSh"が便利である．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969489/dc2aecf0-a96f-eef1-b4d5-e4cdc93250cb.png)

このプラグインを利用すると，VSCodeのエクスプローラ上でファイルを操作できる．
プラグインをインストール後，左のサイドバーに新しく追加されたRemote Explorerを選択する．
再びパスワードを求められるので入力し，接続完了．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969489/dffad259-f928-aa78-db6a-708c309e3a7f.png)
Bluetooth LE(BLE)のcapture用のTI CC2540 dongle

今回はBLEのプログラムをデバッグするために, TI(Texas Instruments)のCC2540 USB Dongleを手に入れました。
それでは下の画面のように表示するまで必要な手順を述べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/739847/f212c3e8-2d4c-1235-3dd6-a032861640da.png)
簡単に言うと, CC2540 USB DongleはBLEやZigbeeなどを使ってパケットをブロードキャスト際に, ブロードキャストされたパケットをキャプチャーすることができるキットです。今回BLE機器のデバッグ用のため, これを使ってみました。
最初にCC2540 USB DongleはPCに挿すと自動的にドライバーがインストールされると思っていましたが, 何も起こっていなくてデバイス認識失敗してしまいました。結局は下のリンクでWindows Installer for SmartRF Studio 7というファイルをダウンロードしてインストールすることで解決しました。https://www.ti.com/tool/download/SMARTRFTM-STUDIO/
ちなみにこのファイルをダウンロード前にこのサイトのログインが必要あるみたいです。
次に下のリンクで今度モニタするソフトウェアをダウンロードしてインストールします。
https://smartrf-packet-sniffer.software.informer.com/download/
完成したらデバイスマネージャーで自分のPCにちゃんと接続できたかどうかをチェックしましょう。（普通にCC2540のランプが点灯しましたら接続無事にみえます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/739847/09d25724-3138-2f22-1f0f-f233b6d31370.png)
CC2540 USB Dongleを挿した状態で、SmartRFを起動すると、最初に下の図のようにどのプロトコルを調べるのか選択する画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/739847/fa60c773-f63f-95ed-e41c-81afef0df59b.png)
ZigbeeやSimplidTIやどその他の2.4GHzのGeneralというのが選択肢に出てくるが, 今度はBLEだからBluetooth Low Energyを選択します。
Startすると, 右向き三角▲ボタンを押すだけで結果が見えると思います。
【cakephp】icon付きボタンの作成




###cakephpでlinkボタンにiconを付けて実装したかったが、詰まったのでここに記載する

```php4


<div class="btn-group">
  <a href="<?= $this->Url->build(["controller" => "コントローラ名", "action" => "アクション名"]) ?>" class="btn register_btn" type='button'><span><i class="fas fa-undo-alt"></i>一覧へ戻る</span></a>
</div>

```

これでicon付きボタンが完成！！！

cssはごめんなさい。。
Ubuntuでパイプで来たものをクリップボードに保管する

Ubuntuでパイプで来たものをクリップボードに保管します。

クリップボードへの保管にはxselを使用しますのでインストールします。

````bash
sudo apt install xsel ;
````

これで下記のようなコマンドでクリップボードに情報を移行できます。

````
cat hoge.txt | xsel --clipboard --input ;
````

ただ、これだと長いので、.bashrcファイルなどにエイリアスを貼って置きます。

````bash
nano .bashrc ;
````

追記する内容

````
alias cb='xsel --clipboard --input'
````

有効化

````bash
source .bashrc ;
````

これで下記コマンドでクリップボードに保存されます。

````bash
cat hoge.txt | cb ;
````
AdobeXDでスマートフォン版のWebカンプを作る

#デイトラWeb制作コース初級編DAY16の学び

# 【この記事に書いてあること】
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">プログラミング学習23日目⏩<br><br>Web制作コース初級編DAY16💻<br><br>学習時間:1時間45分⏳<br><br>学習内容:XDでスマートフォン版のカンプを作る✏<br><br>学び📚<br>・スマホサイズ専用のアートボードがある<br>・各セクションごとグループ化して見やすくする<br>・カンプから画像を保存することができる<br>詳しくはQiitaへ<a href="https://twitter.com/hashtag/%E3%83%87%E3%82%A4%E3%83%88%E3%83%A9?src=hash&amp;ref_src=twsrc%5Etfw">#デイトラ</a> <a href="https://t.co/SqGvKE0Ze5">pic.twitter.com/SqGvKE0Ze5</a></p>&mdash; ふりっく💻トリプルゼロのWeb制作者 (@FuRiC_twi) <a href="https://twitter.com/FuRiC_twi/status/1358997361310257153?ref_src=twsrc%5Etfw">February 9, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#　【制作物】
![スクリーンショット 2021-02-09 13.19.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1028584/d4d54d03-8647-cd59-eaf8-53e424125977.png)


#　【学び】

1
スマホサイズ専用のアートボードがある

２
PC版とスマホ版のカンプが完成したら、各セクションごとグループ化して見やすくする
![スクリーンショット 2021-02-09 11.35.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1028584/8c36221c-05db-c015-b254-d684f1b4495d.png)

3 
カンプから画像を保存することができる！
けど、可能であれば元画像をもらった方がいい
「選択した項目を書き出し」で保存できる

![スクリーンショット 2021-02-09 11.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1028584/1d2c6d62-2154-d81a-8f41-50bbfdfd862a.png)

4 【JPGとPNGの違いとは？】
・JPGデータ：写真に適している

・PNGデータ：色数の少ないもの（イラスト）
　　　　　 四角形でないもの（アイコン）
　　　　　 透明な部分があるもの（ロゴ）に適している

５　【Retina使用について】
最近のPCは解像度が高いディスプレイが多い
なので、カンプの画像のより大きいサイズの画像データを用意するとRetinaディスプレイでもきれいに映すことができる

＜方法＞
書き出し時に、「Web」を選択する
![スクリーンショット 2021-02-09 12.00.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1028584/d6284f10-e499-8c49-8bbc-12587699db8b.png)

６　【効率のいい書き出し方法】
書き出したい画像の横にある四角形マークを押す→一斉書き出し

![スクリーンショット 2021-02-09 12.09.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1028584/a60bb4b9-c494-3ee3-6112-41f763327d3b.png)

７
アードボード全体も書き出しができる
アートボード全体を選択した後に書き出し

８　【Web上からでもカンプを見る方法】
みたい画像もしくはアートボードを四角形マークで選択→共有→開発→リンクを作成→リンクに飛ぶ
![スクリーンショット 2021-02-09 12.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1028584/6d88b471-e376-5816-f72c-e6457808de89.png)

９　おすすめワイヤーフレームサイト

参考サイト: [Wires.jp](https://www.behance.net/gallery/67284971/Wires-jp)
NewRelic初心者 Javaエージェントを導入する(AP:Apache+Tomcat と DB:MySQL)

#はじめに
NewRelicで提供されるアプリケーション監視機能ApplicationMonitoring(APM)の実装を行う。

#1. 環境準備
〇APサーバ
　CentOS 8
　Apache ※ApacheからTomcatへ連携させる設定を入れておく
　Tomcat ※sampleアプリ(入力した文字をDBへ格納、参照するアプリ)をデプロイ済み

〇DBサーバ
　CentOS 8
　MySQL

#2.NewRelic APM導入
##2-1.javaエージェントをインストール
エージェントをダウンロード

```
curl -O https://download.newrelic.com/newrelic/java-agent/newrelic-agent/current/newrelic-java.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 14.6M  100 14.6M    0     0  4018k      0  0:00:03  0:00:03 --:--:-- 4018k
```

ダウンロードしたファイルを展開する

```
unzip newrelic-java.zip
Archive:  newrelic-java.zip
   creating: newrelic/
  inflating: newrelic/LICENSE
  inflating: newrelic/THIRD_PARTY_NOTICES.md
  inflating: newrelic/newrelic.jar
  inflating: newrelic/extension-example.xml
  inflating: newrelic/extension.xsd
  inflating: newrelic/newrelic.yml
  inflating: newrelic/newrelic-api.jar
  inflating: newrelic/newrelic-api-sources.jar
  inflating: newrelic/newrelic-api-javadoc.jar
```

##2-2. エージェントの設定
newrelic.ymlの修正を行う。
①ライセンスキーを修正

```
license_key: <NewRelicのアカウント情報を参照>
```

②app_nameを修正

```
app_name: sample
```

##2-3. 展開したものを配置
一式/opt配下へ移動

```
mv newrelic/* /opt/newrelic_apm/
```

##2-4. javaagentの設定
今回はTomcatで-javaagent引数を渡す
JAVA_OPTS環境変数を使用して、New Relicエージェントを使用するようにcatalina.shファイルを設定する。

```
export JAVA_OPTS="$JAVA_OPTS -javaagent:/opt/newrelic_apm/newrelic.jar
```

##2-5. Tomcatを再起動
```
systemctl restart tomcat
```

#3. NewRelic上の確認
アプリケーションを稼働させたところ、NewRelicにデータが送られていることが確認できた。トランザクションでDB接続実施するため、Databaseの項目についても確認。

〇Summary
![Summary](https://dm2306files.storage.live.com/y4mbmQWZZOM8mchUbdlYWBjQ8hI1eQquSjWQkIrNA888Xx7wDtuvWlPGoZ0WH9xngsJLshkMg6fatNVA8Sqb8UZfCZ3duswfg3iR2jwzCsRPwYFNBAvYzVlRXWfUjvUGvMDcAdkkRcP5fSaFRnON3gqLF9tlFEBj6TrOHuMOZPdZTSY5eM4yAUcQ5MAw0znB9qT?width=1917&height=861&cropmode=none)

〇Database
![DB](https://dm2306files.storage.live.com/y4mr45zMXTY6PpMOUpf2WcExeILO6D7iBT5J-AfqfFTluH8dGuF5QY5BVdgjAsm5Hne3OcTT2OG30TZjnxLHh1B77QgFVTXM8tzfSZsuwGui6-Tmw0vbIZFL-euLuaG2Sp3pCjTlKIXAunwVG8_kv4gh3iCxS1A4aztgaywUiJjXEhc2YGysRqBl49FvbAt1U3t?width=1913&height=863&cropmode=none)
HTTPメソッド不備によるRoutingError修正の一例

No route matches [POST]"/tweets/search"
Routing Error

上記のエラーが発生した場合は、必要なルーティングが設定されているか確認します。
エラー画面の下記にPathという検索窓で/tweets/seaechを探します。

```
search_tweets_path    GET    /tweets/search(.:format)
```
上記のよく似たパスが見つかります。
リクエストのHTTPメソッドはPOSTになっていますが、こちらはGETになっています。

このことから間違ったHTTPメソッドPOSTを送信した仮説がたちます。
index.htmlを確認し、POSTをGETに修正してエラーの確認を行います。
UXと要件定義

# はじめに
引き続き研修で学んだことをアウトプットしていきます
今回は「UXと要件定義について」です。

# 学んだこと
### UXとは？
単にかっこいい見た目や使いやすいWebサービスを指すのではなく、ユーザーが製品やサービスを通して得られる「体験」や「経験」すべてのことを指している

例）商品を注文したらすぐに届いた

### UXデザインとは？
〇〇がしたい！という目的を達成するまでの体験や経験を設計すること

### いいUXとは？
UXは主観的なものであるため、すべてはユーザー次第
ユーザーの捉え方次第で良し悪しは変わる

＝ユーザー（誰が使うのか）を意識して開発することが大事！

##### UIとは？
接点。ユーザーの目に触れ、利用される部分。
目的達成のために、必要な情報や機能をユーザに伝える。

### 要件定義について
「なにをつくるか」を決める
このフェーズは要求を「分析する」工程と「定義する」工程に分かれる

「〇〇という条件を満たすものをつくる」の条件部分を明確にする

##### 要求とは？
- ビジネスの要求：どんな価値を生むのか、どんな市場にどんな価値を与えたいのか
- システムの要求：どんなシステムなのか
- ハードウェアの要求：どんな製品なのか
- ソフトウェアの要求：どんなサービスなのか

要求＝目的とも置き換えられる

##### 要件とは？
設計にいれる情報、設計する前に知っておきたい情報

# まとめ
UI/UXとふんわりと一括りにしてしまっていたので、考え方の違いを理解できました。今回研修で演習をおこなうことで、要件を分析して情報をまとめてから「なにをつくるか」を考える、情報の洗い出しはとても重要であると感じました。
UI/UXに関しては、普段から意識することで出てくる「気づき」もあると思うので、いろんな技術やサービスに積極的に触れて意識していきたいと思います。
Ubuntu20.04でIPアドレスを調べる～自分用メモ～

# コマンド(解決策)
```common-lisp:端末
$ ip address show
```

# なんでこのコマンド？
* `Ubuntu18.04`では、ifconfigコマンドは非推奨だった模様。
* `Ubuntu20.04`では、ifconfigコマンドをインストールしようとすると『パッケージが見つかりません』とでました。もうない？知っている方いたら教えてください。。。

#参考元
本当に助かりました。ありがとうございました。
『Ubuntu18.04だとifconfigコマンドが標準で使えない？』
https://fuqda.hatenablog.com/entry/2019/05/02/111849
単体テストコードで解決したこと

```spec/models/item_spec.rb
models 'rails_helper'

RSpec.describe Item, type: :model do
  
   before do
    @item = FactoryBot.build(:item)
   end
   describe '商品出品機能' do
  it "全て正常" do
    # @item.image = nil
    expect(@item).to be_valid
  end

  it 'imageが必須であること' do
    @item.image = ""#nil
    @item.valid?
    expect(@item.errors.full_messages).to include("Image can't be blank")
  end

  it `id必須であること` do


  it "商品名が必須であること" do
    @item.name  = ""
    @item.valid?
    binding.pry
    expect(@item.errors.full_messages).to include ""
  end
end
end
```
前提として単体テストコードは文字入力した際にエラーを出すために行う。

```
   it "全て正常" do
    # @item.image = nil
    expect(@item).to be_valid
  end
```


この記述はこのテストは全て正常に動くように宣言している。この宣言がないと、テストコードがうまくいかなくなる。

```

  it 'imageが必須であること' do
    @item.image = ""#nil
    @item.valid?
    expect(@item.errors.full_messages).to include("Image can't be blank")
  end
```
imageが必須であること　この記述はコンパクトにシンプルにまとめた。本来は 商品画像を1枚つけることが必須であること　とあったが、アプリの動作を軽く&見やすくする為に、文言はシンプルに書く。
@image.image = ""と@image.image =　nilは同じ意味である。
Rails6でBootstrapとFontAwesomeをwebpack経由で使う

## BootstrapとFontAwesomeのwebpackでの導入方法

Rails6からはwebpackが標準で搭載され、javascriptとstylesheetのファイルの位置も変わっており、意外に苦戦したので記載。

### まずはターミナルからyarnでインストール

```
$ yarn add bootstrap@4.3.1 jquery popper.js
```

```
$ yarn add @fortawesome/fontawesome-free
```


### 下記のコードを追記

私はjavascriptディレクトリの下にsrcディレクトリを配置しているので注意。

```scss:app/javascript/src/application.scss
@import "~bootstrap/scss/bootstrap";
@import "~@fortawesome/fontawesome-free/scss/fontawesome";
```


```js:app/javascript/packs/application.js
import "bootstrap";
import "@fortawesome/fontawesome-free/js/all"
```

```js:config/webpack/environment.js

const webpack = require('webpack')
environment.plugins.prepend(
  'Provide',
  new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery',
    Popper: 'popper.js'
  })
)
```

```erb:app/views/layouts/application.html.erb
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> 
//↑↑削除

<%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
```

コピペ可能です。
ggplot2の図にさくっとメイリオフォントを埋め込む（Windows 10）

ggplot2 (3.3.3) の図にメイリオフォントを埋め込んで，PDF出力する手順の自分用メモ．


```{r}
# Windowsフォントを設定
windowsFonts(Meiryo = windowsFont("Meiryo"))
ggplot() + 
  ...
  # geom_text, geom_labelがある場合は，その中でもフォントファミリーを指定
  geom_text(..., family = "Meiryo") +
  # themeのベースファミリーを指定
  theme_**(base_family = "Meiryo")
# deviceにcario_pdfを指定
ggsave(..., device = cario_pdf)
```

さらに詳細な設定については以下を参照．

- [おまえはもうRのグラフの日本語表示に悩まない (各OS対応) -- ill-identified diary](https://ill-identified.hatenablog.com/entry/2020/10/03/200618)
JavaScriptの数字への変換 上限まとめ

## 文字列を数値に変換するメソッド
- [Number](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/Number)
- [parseInt](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt)
- [parseFloat](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseFloat)

### 数字が丸まる
18桁目で四捨五入処理が入る

```javascript
// 21桁
const num = 123456789012345678901

console.log(Number(num)) //123456789012345680000
console.log(parseInt(num)) //123456789012345680000
console.log(parseFloat(num)) //123456789012345680000
```

### 表記が変更される
```javascript
// 22桁
const num = 1234567890123456789012

console.log(Number(num)) //1.2345678901234568e+21
console.log(parseInt(num)) //1
console.log(parseFloat(num)) //1.2345678901234568e+21
```
aタグをlink_toに書き換える

細かい書き方を忘れて毎回検索するのが手間なのでメモ。

```html:test.html.erb
<a href="#" class="nav__link">削除</a>

```

```html:test.html.erb
<%= link_to "削除", wish_path(wish), method: :delete, class: "nav__link" %>

```

wish_path(wish)の部分はご自分の使っているリソース、リソースの変数名を入れてください。
Python boot camp by Dr.Angela day6

#Function(関数)とは？
数学の f(x) = ax^2 + bx + c を思い返すと分かりやすい。自分でf(x)という関数を定義(Definition function)しただけでは、値は出力されず、x=3などxに値を入れて(Calling function)関数を呼び出すことで初めて結果が算出される。
今まで使用してきた関数は全てpythonにもともと組み込まれているものだったが、「def: 」を使用することで自分専用の関数をカスタムすることが可能。書式は以下参照。

```python
def my_funtion():     # Definition function
  print("Hello") 

my function()         # Calling function

#出力結果
Hello
```
1つの関数内はインデントで先頭を揃えないと、関数内だとみなされない。
上の例だと、L1,L2は同じ関数内で1つの定義関数だとみなされ、L4のmy function()という呼び出し関数は別の関数とみなされているということ。

#Tab vs Space key
どちらも同じことができるので好みの問題だそうだ。python3公式では4回のSpace key押下を推奨しているようだが、Angelaはeditorを改造することで解決することを推奨している。

#While Loop
__For Loop__
list内の各変数/値それぞれに対し何かを行い、全ての値に対し実行が終わったらそこでループ終了。

```python
list =[2,4,20]
for a in list:
    print(a)

出力結果
2
4
20

for b in range(1,3):
    print(b)

出力結果
1
2
3
```
__While Loop__
While直後に記載した条件に合致した場合、条件不一致になるまで永遠にループを繰り返す。
Forと違って、どのくらい繰り返せばよいのかわからない場合に用いることが多い。

```python
a  = 100
while a > 7:
    a -= 3
print(a)

出力結果
10
```
100から3ずつ減らしていって、7より小さくなる一歩手前の値をprintするプログラム

もし永遠に繰り返したいならば、絶対にTrueになる式をWhile直後に書いておけばよいだけ。

```python
while 1=1:
    print("True")
```
これは永遠に続くループ関数となる。
なお、コードの一部にループから抜けられる要素がない場合はエラーになることが多いので注意が必要。強制的にループを抜けさせる場合は「break」で可能だが、おすすめしない。詳しくはこちら→ https://engineer-club.jp/java-break

##Mission>> 迷路から脱出するアルゴリズムをコーディング
フリーサイト__"Reeborg's World"__
→ https://reeborg.ca/reeborg.html?lang=en&mode=python&menu=worlds%2Fmenus%2Freeborg_intro_en.json&name=Maze&url=worlds%2Ftutorial_en%2Fmaze1.json
いろいろと工夫すれば使えるので、アルゴリズムの練習にもってこいのサイト。
__↓↓ヒント↓↓__
 turn_right()がないので、turn_left()を使用して独自に関数を定義する必要がある！
Robbotの初期位置はランダムなので、永遠にループしてしまうケースが出てくる。これをどう処理するか？が課題。
【Laravel】CSS/JavaScriptの読み込み

知識を整理するための個人的な備忘録です。

#方法
##CSS
`public/css`フォルダ内に`css`ファイルを作成。
`index.blade.php`ファイルで`index.css`ファイルを読み込む場合

```php:index.blade.php
<link href="{{asset('css/index.css')}}" rel="stylesheet">
```
ヘルパーメソッドの`asset`は、作成したプロジェクトの`public`ディレクトリまでのパスを返してくれる関数ですので、`asset`を使うことで`public`フォルダの中身を自動的に判別してくれるという仕組みになっています。

```php
<link href="{{asset('(public/)css/index.css')}}" rel="stylesheet">
```

##JavaScript
他にも方法はありますが、今回は`node.js`を使います。
まずは下記コマンドでインストール。

```
$ npm install
```
`resources/js/`内に任意のファイル名`index.js`を作成し、`webpack.mix.js`にコードを書き足します。

```php:webpack.mix.js
const mix = require('laravel-mix');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel application. By default, we are compiling the Sass
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.js('resources/js/app.js', 'public/js')
    .js('resources/js/index.js', 'public/js')  //追記
    .sass('resources/sass/app.scss', 'public/css');
```
`index.blade.php`ファイルで`index.js`ファイルを読み込む場合

```php:index.blade.php
<script src="{{ mix('js/index.js') }}"></script>
```
最後にターミナルでコマンドを実行。

```
$ npm run dev
```

#参考
* [【Laravel】Bootstrap導入時のCSSやJavaScript/jQueryの置き場所はどこ？](https://seita-limitless.net/laravel-bootstrap-css-js/)
* [Laravel で JavaScriptをやるときの手法 - Qiita](https://qiita.com/ntm718/items/fed0e1060557a4e28ef3)
C#  HTML をExcelに変換

<p><strong>この記事ではC#でHTMLをExcelに変換する方法を紹介します。今回はSpire.XLSというライブラリが必要だから、どうかE-iceblueの公式からこれをダウンロードしてください！さあ、初めましょう。</strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/download-excel-for-net-now.html">Free Spire.XLS</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210209/20210209122340.png" alt="f:id:lendoris:20210209122340p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong>2.Visual Studioを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire.XLS.dllを参照に追加してください。</strong></p>
<p><strong>（Net 4.0を例としたら、デフォルトパスは“Bin→NET4.0→XLS.dll”というようです。）</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210209/20210209122354.png" alt="f:id:lendoris:20210209122354p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210209/20210209122730.png" alt="f:id:lendoris:20210209122730p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
```JAVA
using Spire.Xls;
namespace HTML_to_Excel

{
    class Program
    {
        static void Main(string[] args)
        {
            
            Workbook workbook = new Workbook();
            workbook.LoadFromHtml("Sample.html");

        
            Worksheet sheet = workbook.Worksheets[0];
            sheet.AllocatedRange.AutoFitRows();

            //保存します。
            workbook.SaveToFile("Result.xlsx", FileFormat.Version2010);

        }
    }
```

</blockquote>
<p> <img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210209/20210209122748.png" alt="f:id:lendoris:20210209122748p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p> </p>
【IQ Bot】Tegaki利用時のセットアップ方法

IQ BotでTegakiを利用するためには、インストール後に以下の設定を行う必要があります。

## 手順１：Tegakiサーバーの起動確認

インストール済みのTegakiサーバーをネットワークにつなぎ、電源をONにした状態で、Tegakiサーバーと**同一ネットワーク内の別マシン（IQ Botサーバ―など）**から以下の確認を実施します。

### １－１：管理UIの起動

管理UIへのログインURLは、Cogent Labs社提供のセットアップ資料に掲載されています。
そちらのURLにアクセスすると、以下のような管理UIが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/2e102cf8-58e8-0bf1-0796-8ff1a9a9b77f.png)
管理UIの詳しい使い方は、Cogent Labs社の資料を参照。

### １－２：APIの疎通確認

Cogent Labs社提供のセットアップ資料に、POSTとGETのAPIのサンプルコードが載っています。
そちらを参考に、APIを投げてSuccessが返ってくることを確認します。

※このあとIQ Botとの接続を行いますが、Tegakiサーバー単体が正しく動いていることを確認する目的です。

## 手順２：TegakiOCREngineSettings.json ファイルの設定

以下の公式ドキュメントを参考に、IQ BotのConfigフォルダ（インストール時にいじっていなければ`C:\Program Files (x86)\Automation Anywhere IQ Bot A2019\Configurations`）配下の`TegakiOCREngineSettings.json`を設定します。

https://docs.automationanywhere.com/ja-JP/bundle/enterprise-v2019/page/enterprise-cloud/topics/iq-bot/extraction/iqb-ocr-tegaki.html

## 手順３：データベースへの反映（.21～）

Automation 360.21以降、上記のセッティングファイルをAPIでデータベースに反映させる必要が出てきました。
→　こちらはトライアル的に使うことはできないので、この記事で説明することは避けます。

## 手順４：IQ Bot - Tegakiの疎通確認

以下の手順を参考に、IQ BotとTegakiの疎通確認を実施します。
[【リンク】IQ Bot：稼働確認のしかた（参考）](https://qiita.com/IQ_Bocchi/items/112e4e6bebb325566e05)

## その他のパラメーター

`TegakiOCREngineSettings.json`のうち、IQ Bot x Tegakiの疎通に必ず必要なパラメータは手順２で解説したとおりですが、それ以外のパラメーターも解説しておきます。

| キー |設定値可能な値|解説|
|:------------|:------------|:------------|
| EnableFieldMerging | true または false | trueにすると、近くにある2つのSIRを一つにまとめます（水平方向のみに有効）|
| EnableFieldRegions | true または false | trueにすると、近くにあるSIR同士をさらに大枠のSIRが囲うようになります（水平方向・垂直方向ともに有効） |
| DebuggingFolder | フォルダパスの文字列 | Tegakiのログを出力する先のフォルダを指定します。 |

なお、EngineTypeについては、出荷時のまま変えることがないはずなので説明を割愛します。
C#  PDFをWord、Image、XPSで保存

<p><strong>今日はCシャープについての話です。Spire.PDFを通じてPDFをWord、Image、XPSで保存する方法を紹介します。</strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/">Free Spire.PDF</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210209/20210209121045.png" alt="f:id:lendoris:20210209121045p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong>2.Visual Studioを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. PDF.dllを参照に追加してください。</strong></p>
<p><strong>（Net 4.0を例としたら、デフォルトパスは“Bin→NET4.0→PDF.dll”というようです。）</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210209/20210209121059.png" alt="f:id:lendoris:20210209121059p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4><strong>元のファイル</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210209/20210209121124.png" alt="f:id:lendoris:20210209121124p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4><strong>PDFをWordで保存</strong></h4>
```JAVA
using Spire.Pdf;

namespace ConsoleApplication30
{
    class Program
    {
        static void Main(string[] args)
        {
            //PdfDocument objectを作成します。
            PdfDocument doc = new PdfDocument();

            //PDFをロードします
            doc.LoadFromFile("sample.pdf");

            //Docで保存します。
            doc.SaveToFile("toWord.doc", FileFormat.DOC);

        }
    }
}
```


<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210209/20210209121208.png" alt="f:id:lendoris:20210209121208p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4><strong>PDFをイメージで保存</strong></h4>

```JAVA
using Spire.Pdf;

namespace ConsoleApplication30
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocument objectを作成します。
            PdfDocument doc = new PdfDocument();

            // PDFをロードします
            doc.LoadFromFile("sample.pdf");

            //PDFのページをループします。
            for (int i = 0; i < doc.Pages.Count; i++)
            {
                //PDFをbitmapで保存します。
                System.Drawing.Image bmp = doc.SaveAsImage(i);

                //bitmapを pngで保存します
                string fileName = string.Format("Page-{0}.png", i + 1);
                bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);

            }
        }
    }
}

```

<p> </p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210209/20210209121238.png" alt="f:id:lendoris:20210209121238p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4><strong>PDFをXPSで保存</strong></h4>
```JAVA
using Spire.Pdf;

namespace ConsoleApplication30
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocument objectを作成します。
            PdfDocument doc = new PdfDocument();

            // PDFをロードします
            doc.LoadFromFile("sample.pdf");

            //XPSで保存します。
            doc.SaveToFile("toXPS.xps", FileFormat.XPS);

        }
    }
```
<p> </p>
[Error MySQL] ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

MySQLを起動するために、 `$ mysql -u root -p` を実行した時に現れたエラーです。

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

#原因　起動していないだけかも
以下を実行してみます。

```
$ sudo mysql.server start
```

`SUCCESS!` と表示されたら `$ mysql -u root -p` を実行してみます。
#原因　mysql.sockファイルがないかも
以下を実行してみます。

```
$ sudo touch /tmp/mysql.sock
```

そして、mysqlを再起動します。

```
$ sudo mysql.server restart
```

`SUCCESS!` と表示されたら `$ mysql -u root -p` を実行してみます。

(2)が(38)に変わった場合。↓

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
```

この場合は、mysql.sockファイルが入っているディレクトリ権限が原因だと思われます。
以下を実行してみます。

```
$ sudo chown mysql:mysql /tmp
```

そして、mysqlを再起動します。

```
$ sudo mysql.server restart
```

他にも原因はあるそうですが、私はこれで解決できました。
あなたも解決できていたら幸いです。
Missing required parameter for [×××] の解決方法

Laravel初学者です。
オリジナルアプリを作成しているのでその過程を記事にしています。

理解が曖昧なところも多いため、ご指摘等ありましたらご連絡いただければ幸いです。

今回は
`Missing required parameter for [×××]`
が出たのでその解決方法を記録として残します。


## 環境

|                | Version     |
|:---------------|------------:|
| PHP            | 7.4.14      |
| Laravel        | 8.24.0      |
| mysql          | 8.0.23      |
| docker         | 20.10.2     |
| docker-compose | 1.27.4      |

## エラー発生

データの一覧表示の「詳細」ボタンから詳細画面に遷移する実装を行った際にエラーがおきました。

```PHP:app/Http/Controllers/GameController.php
public function show($id)
    {
        $game = Game::find($id);
        return view('game.show', compact('game'));
    }
```

上記がコントローラーの記述です。
showアクションで`$game = Game::find($id);`でidから引っ張ってきたデータを$gameに入れています。
そして`return view('game.show', compact('game'));`viewに変数を渡して詳細画面を開くというアクションです。

```PHP:resources/views/game/index.blade.php
<div class="table-responsive">
    <table class="table table-hover">
      <thead>
        <tr>
          <th>ボードゲーム名</th>
          <th>プレイ時間</th>
          <th>最小プレイ人数</th>
          <th>最大プレイ人数</th>
          <th>画像</th>
          <th>詳細</th>
        </tr>
      </thead>
      <tbody id="tb1">
      @foreach($games as $game)
      @if($game->image_path)
        <tr>
          <td>{{ $game->name }}</td>
          <td>{{ $game->play_time }}</td>
          <td>{{ $game->players_minimum }}</td>
          <td>{{ $game->players_max }}</td>
          <td><img src="{{ $game->image_path }}"></td>
          <td class="text-nowrap">
            <p><a href="{{ route('game.show') }}" class="btn btn-primary btn-sm">詳細</a></p>
          </td>
        </tr>
      @endif
      @endforeach
      </tbody>
    </table>
  </div>
```

上記が一覧表示画面のviewです。
`<a href="{{ route('game.show') }}" class="btn btn-primary btn-sm">詳細</a>`の記述で詳細画面に遷移しようとしています。

ここで下記のエラーが発生しました。

![スクリーンショット 2021-02-08 0.30.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/e9de359f-9658-2674-2994-bf3343cc5368.png)


## 解決方法

[こちら](https://biz.addisteria.com/laravel-url-parameter/)の記事を参考にさせていただきました。
ありがとうございます！

>URLに入れるパラメーターが渡せていないことが原因

とのことです。

```HP:resources/views/game/index.blade.php
<a href="{{ route('game.show', $game->id) }}" class="btn btn-primary btn-sm">詳細</a>
```

上記のようにパラメーターを渡してあげることで解決しました。

以上です。
[保存版] Raspberry PiやJetsonのバックアップをする方法（Mac）

## はじめに
バックアップを定期的に取っておくことは大事です。
Raspberry PiやJetsonなどのシングルボードコンピュータのバックアップ方法をまとめます。

## バックアップの手順
### 1. SDカードをシングルボードコンピュータ本体から取り出し、Mac本体に接続
- SDカードを取り出す
- MacにSDカードを接続する

### 2. マウントディスク名を確認する
- Macのターミナルを起動する
- ```diskutil list```を叩いて、マウントしているボリュームのパーテーションを一覧で確認する

```
$ diskutil list
```

#### 実行例
![diskutil.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403760/fa18efef-38b1-f16b-738c-6559e7ee47a1.png)


- 該当するSDカードのマウントディスク名を確認する
- 私の場合は/dev/disk2でした。

### 3. SDカードをアンマウントする
- ```diskutil umountDisk [2で確認したディスク名]```を叩いて、SDカードをアンマウントする 

```
$ diskutil umountDisk /dev/disk2
```

#### 実行例
![diskutil_unmount.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403760/e810b215-7c05-bfeb-4457-5d8f9da410a3.png)

「Unmount of all volumes on disk○ was successful」が出ればOKです。

### 4. ddコマンドでバックアップする
- ddコマンドを使ってバックアップを取る
- ddコマンドの基本的な使い方: ```dd if=[コピー元] of=[コピー先] bs=[バッファリングサイズ]```
- バックアップの進捗状況は```ctrl + T```で確認できます

```
sudo dd if=/dev/rdisk2 of=20210209_jetson_backup.img bs=64m
```

#### 補足（ddコマンド高速化）
Macでddコマンドすることはかなり遅いです。
少しでも早くバックアップを完了させるためのTipsを紹介します。

##### 指定するマウントディスク名について
- ```/dev/disk○```ではなく```/dev/rdisk○```にしてあげると、速くなるみたいです


参考ページ： [mac のdd / ddrescue が遅すぎる大問題に対処する。](https://takuya-1st.hatenablog.jp/entry/2020/01/14/005622)
参考ページ： [diskとrdisk](https://www.junk-works.science/disk-and-rdisk/)

##### bsオプションについて
- bsオプションは適切な値にしてあげると速くなるみたいです
- ちなみに私のMacでは64mが最も速かったです

参考ページ： [ddコマンドのbsサイズ](https://qiita.com/wf9a5m75/items/6bfea7a2b8c9658ce4fc)
IPv6

## はじめに
CCNA取得に向けて学習中です。
備忘録としてIPv6についての記事です。

## IPv6とは
・「IPアドレス枯渇問題」を改善するための新しいIPアドレス
・アドレス長が128ビットあり、約340澗個ものIPアドレスを割り振れる。（IPv4は32ビット）

## IPv6の種類
IPv6は通信対象ごとに3種類に分類される。
 ① ユニキャストアドレス
 ② マルチキャストアドレス
 ③ エニーキャストアドレス

|  IPv6の種類  |  通信対象  |
| ---- | ---- |
|  ユニキャストアドレス  |  1対1  |
|  マルチキャストアドレス  |  1対グループ  |
|  エニーキャストアドレス  |  1対グループの内の１つ  |


## ① ユニキャストアドレスとは
　IPv4のユニキャストと同じように、1対1の通信で利用されるアドレス。
　このアドレスを使用し、１つのインターフェースを特定することができる。
___ 
####ユニキャストアドレスはスコープ（パケットの到達範囲）によって3つに分類される
スコープ範囲は下図参照

1. グローバルユニキャストアドレス
2. ユニークローカルアドレス
3. リンクローカルアドレス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641744/8322639d-afc1-8d18-6efd-b519ba4c40ff.png)
___

| アドレス名 | スコープ | IPアドレス |
|:-:|:-:|:-:|
|  グローバルユニキャストアドレス | 全ネットワーク  |  先頭3ビットが「001」から始まる。<br>16進数表記では「2000::/3」 |
|  ユニークローカルアドレス |  同ネットワーク内 |・FC00::/7<br>・FC00::/8<br>・FD00::/8|
| リンクローカルアドレス | 同セグメント内 | FE80::/64 |


## ② マルチキャストアドレスとは
　IPv4のマルチキャストと同じように、1対グループの通信で利用されるアドレス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641744/7a6f910d-038b-25a9-65ae-08efa7672757.png)
・先頭8ビットは「1111 1111」で始まる。(FF00::/8)
・プラグは、永続的なものには０、一時的なものには1を
・スコープは、ドコ宛てに送るかを指定　予約済みマルチキャストアドレスを参照↓
  https://www.infraexpert.com/study/ipv6z10.html

#### MACアドレス
IPv6のMACアドレスは「33:33：マルチキャストアドレス下位32ビット」で構成。
例）　マルチキャストアドレス　FF02：：1:FF22:2222→MACアドレス 33:33:FF:22:22:22

#### 要請ノードマルチキャストアドレス
ICMP(IPv4でいうところのARP)の時に使うアドレス？？？


## ③ エニーキャストアドレスとは
　複数ノードで同じIPアドレスを指定している。そうすると近くのノードへとパケットが送信される。
ちなみに１対１での通信。

## まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641744/482a55f9-43f2-9dc8-b68d-b8ef39d22545.png)

## 参考
https://www.infraexpert.com/study/study35.html
terraformで配列を結合する場合はconcatを使う


## 使い方
- concat(list1, list2, ...)

```hcl
  cidr_blocks = concat(
    local.access_allow_cidr_blocks,
    ["${aws_nat_gateway.default.public_ip}/32"]
  )
```

```
locals {
  access_allow_cidr_blocks = [
    "12.34.56.78/32",
  ]
}
```
.net Core MVCでDBに接続してViewに表示させるまで

.net core mvc を使ってAzureDBからデータを出力するまでを簡単にまとめます。
今回は社員マスターを表示させるだけのテストです。

##Modelを作成
.net Core MVCではModelを作ることが前提ですので、

```Sym.cs
namespace XYZ.Models
{
    public class Sym
    {
        public string ID { get; set; }
        public string Name1 { get; set; }
        public string Name2 { get; set; }
    }
}
```

##Controllersを作成

参照を追加しておきます

```HelloController.cs
using XYZ.Models;
```

```HelloController.cs
        public ActionResult Index()
        {
            Sym sym = new Sym();

            IList<Sym> SymList = new List<Sym>();

            try
            {
                SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();

                builder.DataSource = "xyz.database.windows.net";
                builder.UserID = "hoge";
                builder.Password = "hogehogehoge";
                builder.InitialCatalog = "xyzdb";

                using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
                {

                    connection.Open();


                    String sql = "SELECT 社員CD,姓,名  FROM TB_SYM";

                    using (SqlCommand command = new SqlCommand(sql, connection))
                    {
                        using (SqlDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                SymList.Add(new Sym()
                                {
                                    ID = Convert.ToString(reader["社員CD"]),
                                    Name1 = Convert.ToString(reader["姓"]),
                                    Name2 = Convert.ToString(reader["名"]),
                                });
                            }
                        }
                    }

                    ViewData["Sym"] = SymList;
                }

            }
            catch (SqlException e)
            {

            }

            return View();
        }
```

##Viewsを作成
Hello-Index.cshtml

```Index.cshtml
@model XYZ.Models.Sym

<!--省略------->


    <div class="col-md-3">
        <h2>How to</h2>
        <ul>
            @foreach (var item in ViewData["Sym"] as IList<Sym>)
            {
                <li>@item.ID</li>
                <li>@item.Name1</li>
                <li>@item.Name2</li>
            }
        </ul>
    </div>
openCVとKotlinを使った塗り絵アプリ#1

#はじめに
授業でアプリ開発の機会があり、お絵描きアプリを作ることになりました。
アプリ開発の際、苦労した点が多かったので解決方法などを導入から順番に書いていこうと思います。
#openCVとKotlinを選んだ理由
- 自分で用意した絵で塗り絵をするのに画像処理が必要で、　　　　　　　
　今回は、画像処理の中でもいろいろなことができるopenCVを選びました。

- Kotlinでアプリ開発をしてみたかった。

- openCVとKotlinを組み合わせた開発が少なかったので挑戦してみようと思った。
#開発環境
- OS　　　　　： Windows10
- 開発ツール 　： Android Studio 4.1
- 開発言語  　　： Kotlin
- 使用ライブラリ : openCV 4.5.0
- **開発者は学生で授業で言語を少し触った程度の知識しかありません。**

#環境の導入
・[Android Studio](https://developer.android.com/studio?hl=ja)(最新版2021/02/09)
　Android Studioの導入方法は記事がたくさんあるので割愛します。
　バージョンは最新でも問題ないと思います。

・[openCV](https://opencv.org/releases/)
　[参考記事](https://qiita.com/tifa2chan/items/a2ec4f5d90eeb9cf1802)
　上記リンクの作業をそのまましました。
　画面が少し違うところがありますが無視して問題ありませんでした。

#XMLのデザインを表示させる
導入のみだとXMLのデザインが表示されなかったので
色々試してみた結果、解決策が見つかったので載せておきます。
なぜ表示されるようになったかは不明です。

画面左側に表示されているproject内のGradle Scripts(象さんのマーク)から
build.gradle(Module:プロジェクト名.sdk)内の

・**compileSdkVersion**
・**minSdkVersion**
・**targetSdkVersion**

以上３つをbuild.gradle(Module:プロジェクト名.app)と同じ値にする。

#さいごに
今回は導入編として投稿させていただきました。
デザインを表示するのに苦労しました。なぜ解決したのかわかってないので、
もしわかる方いらっしゃいましたらコメントにて教えていただけると幸いです。

次は実際に色が塗れるようになるまでについて投稿しようかと思います。
Phinxでwarning no environment specified, defaulting to: developmentが出る時の対処

## 結論
-eオプションで環境指定できたようです
https://book.cakephp.org/phinx/0/en/commands.html#the-migrate-command

```
$ phinx migrate -e development
```

当たり前すぎたのか情報が全然見つけられなくてハマったので一応...
アプリ制作 herokuでのslug sizeについて

##この記事について
プログラミング初学者の私が初めてherokuにデプロイする際につまずいてしまったところを共有していけたらと思います。少しでも参考になれば幸いです。

##herokuでのデプロイ
今回私はFlaskを使ったアプリの開発を行いherokuへデプロイしようとしました。しかし最初から上手くいくはずもなくエラーがバンバン出てきました。
その中で一番出てきたエラーが 
`Compiled slug size: 504.7M is too large (max is 500M).`
herokuにデプロイできる最大容量が500MB（無料版）に対して実際にデプロイしようとしたものが__504.7MBで容量オーバー__ですよというエラー。
あと4MBぐらいならrequirements.txtでモジュールを違うバージョンに書き換えて調整すれば500MBきるかなと思っていたんですが、デプロイしようとするたびに容量オーバーのエラーが出てしまっていました。
##原因
最初はモデルに読み込ませたデータ量が大きすぎたのかなと思いデータ量を少なくしてモデルを再構築しデプロイしてみましたが__結果は変わらず。__
ネットサーフィンしてたらどうやら`tensorflow`が重たいことが判明しました。
##対策①
https://qiita.com/aquamarine/items/656d76425468ca47b5c9
まずはこのページを参考に2つ目のやり方で`requirements.txt`の`tensorflowを1.15.3`に指定してherokuへデプロイすると290.8MBまで減り無事デプロイできました。
デプロイできたのは良かったんですけど肝心の__アプリが起動できなくなっていました。__
原因としてはもともとのモデルを`tensorflow2.3.0`のもので構成していて今回`requirements.txt`で変えた`tensorflow1.15.3`のものと大きくバージョンが違ったからみたいです。

##対策②
もともとのモデルを`tensorflowの1系`で構成しようと思いやってみましたが、モジュールのバージョンダウンがなかなかうまく行かず断念しました。
その後検索していたら同じようなところでつまずいている記事を発見。
https://stackoverflow.com/questions/61062303/deploy-python-app-to-heroku-slug-size-too-large

この記事の解答欄の中にこんな内容が。
`Turns out the Tensorflow 2.0 module is very large (more than 500MB, the limit for Heroku) because of its GPU support. Since Heroku doesn't support GPU, it doesn't make sense to install the module with GPU support.`

`Solution:
Simply replace tensorflow with tensorflow-cpu in your requirements.
This worked for me, hope it works for you too!`

どうやら`tensorflowの2系`はGPUをサポートしているおかげで容量が大きくなっているみたいです。それでもってHerokuはGPUをサポートしていないらしく__GPUをサポートするモジュールは意味が無い__みたいです。
なので`requirements.txt`の`tensorflow`を__`tensorflow-cpu`__に置き換えてデプロイすると無事解決できました。

```
tensorflow==2.3.0
```
   ↓↓↓↓↓

```
tensorflow-cpu==2.3.0
```
ちなみにデプロイ時の容量は
` Done: 330.4M`でした。
だいぶ減ってたので結構びっくりしましたね。