OmniAICreator/Qiita-1.07M huggingface dataset:
Fastly 共有証明書から Fastly TLS への移行


#はじめに
Fastly では TLS 配信を行うための様々なオプションがあるのですが、2019年の11月に新しく [Fastly TLSというオプションがリリース](https://www.fastly.com/blog/fastly-tls-improvements) されました。

Fastly TLS は基本的には今までの Fastly の共有ドメインを利用する共有証明書（Shared Cert）やお客様証明書ホスティングサービス（Customer Hosted Cert)の置き換えとなるものです。

また、Fastly TLS は有償アカウントであれば5ドメインまでは無料で利用することが出来ます。
* 証明書の数ではなくドメインの数ですのでご注意下さい。

この記事では 共有証明書 から、Fastly TLS に安全に切り替えるための手順を説明したいと思います。

Fastly で利用可能な TLS オプションや、Fastly TLS の利用方法の詳細は以下のページをご参照下さい。

[TLS オプション](https://docs.fastly.com/products/tls-service-options-ja)
[お客様所有の証明書を利用した HTTPS での配信](https://docs.fastly.com/ja/guides/serving-https-traffic-using-certificates-you-manage)
[Fastly マネージド証明書を利用して HTTPS で配信](https://docs.fastly.com/ja/guides/serving-https-traffic-using-fastly-managed-certificates)


**この記事では Fastly TLS がデフォルトでサポートしている TLS1.2以上、SNI の証明書の移行手順を説明しています。TLS1.0/1.1 や Non-SNI など特別な要件がある場合の手順は** support@fastly.com **までお問い合わせ下さい**

##利用している共有証明書の確認

最初に登録されている共有証明書について確認します。Fastly のコントロールパネルにログインし、
右上の メールアドレス -> Account -> Sharede and Procured TLS をクリックすると登録されている共有証明書が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/712ae191-67b4-9e2b-25a9-9f0e0c5f5b13.png)

現在サポートしている TLS のバージョンが不明な場合は、DNS Details をクリックすると表示される CNAME Domain に対して sslscan を実行するとサポートしている TLS のバージョンが確認できます。

`例: sslscan xx.shared.global.fastly.net`

sslscan を実行する環境がない場合は "TLS version check online" などと検索すると、入力したドメインがサポートしている TLS のバージョンをサイト上で表示してくれるサービスが多数あるのでそれを利用しても大丈夫です。

対象のドメインが TLS1.0/1.1 に対応しておらず、TLS1.2 のみをサポートしていることが確認できたら次のステップに移ります。

##Fastly TLS にドメインを登録する

共有証明書から Fastly TLS に切り替えるためには Fastly マネージド証明書（Let's Encrypt）を利用します。

[Fastly マネージド証明書を利用して HTTPS で配信](https://docs.fastly.com/ja/guides/serving-https-traffic-using-fastly-managed-certificates)の手順にそって共有証明書に登録されていたドメインを Fastly TLS に登録して下さい。

なお、ドメイン認証については ACME DNS チャレンジを利用して下さい。

展開が完了したら、以下のコマンドで新しい証明書が有効になっていることを確認することが出来ます。

`sslscan --sni-name=<対象のdomain> <CNAME domain>`


##CNAME の切り替え
ここまでのステップが完了すると、対象のドメインに対して共有証明書と Fastly TLS の証明書の両方が有効になっています。

現時点では対象のドメインは共有証明書の CNAME ドメインに向いているので、実際のトラフィックに利用されているのは共有証明書になります。

これを Fastly TLS の証明書に切り替えるためには、対象のドメインの CNAME を Fastly TLS で指定された CNAME Domain に書き換えます。対象ドメインが APEX ドメイン (example.comなど)の場合は、利用する IP アドレスを DNS Detailに表示される A RECORDS(Anycast IPアドレス）に変更して下さい。

以下の dig コマンドで CNAME が切り替わっているかを確認することが出来ます。

`dig <your.domain.com> +short`


この作業は DNS の切り替えになりますので DNS の TTL にも注意が必要です。インターネット上には DNS の TTL を無視して一定の時間キャッシュする DNS サーバーもいますので、CNAME の切り替えがインターネットに伝搬するまで最大72時間程度待つことをおすすめします。

新しい CNAME Domain がインターネット上に完全に伝搬するまでの間は、共有証明書と Fastly TLS 両方の証明書経由で Fastly へのアクセスが発生することになります。

念の為 STATS などからトラフィックの減少など異常がないことを確認し、問題がある場合はすぐに CNAME の切り戻しを出来るようにすると良いと思います。

**なお、この作業は接続時に利用する証明書の切替です。対象のドメインのキャッシュされたオブジェクトはそのまま利用されますので、本作業によってオリジンへのトラフィックの増加やキャッシュヒット率が低下することはありません。**



##共有証明書の削除

最後に無駄な課金が発生しないように共有証明書を削除します。共有証明書経由のアクセスが残っていないように、CNAME ドメインの切り替え後十分な時間的余裕を持ってから削除して下さい。

共有証明書の削除は Shared and procured TLS 画面に表示されるドメインの一覧から、対象のドメインの横の Delete をクリックすると削除をすることが出来ます。

---

以上で共有証明書から Fastly TLS への切り替え作業は完了です。

手順について不明な点や不安がある場合は support@fastly.com までお問い合わせ下さい。
active_hashの使い方

#active_hashとはなんぞや？

Active_Recordのように読み込み専用情報をまとめたハッシュを扱うことができるもの。

#こんな時に使いたい！

テーブルを持つほどでもない・ほとんど変更のないようなちょっとした静的データを保持したい！

#1.Gemfile
gemfileに以下の記述する。

```ruby
gem 'active_hash'
```
bundle installも忘れずに！

```
$ bundle install
```

#2.モデルの作成

今回は毎度おなじみの```rails g model```での作成ではなく、
ActiveHash::Baseを継承したモデルを自作する方法で進めていきます。

prefecture(都道府県)のモデルを作成していきます。

app/models/prefecture.rbという感じで作ってみましょう！！

```prefecture.rb

class Prefecture < ActiveHash::Base
  self.data = [
      {id: 1, name: '北海道'}, {id: 2, name: '青森県'}, {id: 3, name: '岩手県'},
      {id: 4, name: '宮城県'}, {id: 5, name: '秋田県'}, {id: 6, name: '山形県'},
      {id: 7, name: '福島県'}, {id: 8, name: '茨城県'}, {id: 9, name: '栃木県'},
      {id: 10, name: '群馬県'}, {id: 11, name: '埼玉県'}, {id: 12, name: '千葉県'},
      {id: 13, name: '東京都'}, {id: 14, name: '神奈川県'}, {id: 15, name: '新潟県'},
      {id: 16, name: '富山県'}, {id: 17, name: '石川県'}, {id: 18, name: '福井県'},
      {id: 19, name: '山梨県'}, {id: 20, name: '長野県'}, {id: 21, name: '岐阜県'},
      {id: 22, name: '静岡県'}, {id: 23, name: '愛知県'}, {id: 24, name: '三重県'},
      {id: 25, name: '滋賀県'}, {id: 26, name: '京都府'}, {id: 27, name: '大阪府'},
      {id: 28, name: '兵庫県'}, {id: 29, name: '奈良県'}, {id: 30, name: '和歌山県'},
      {id: 31, name: '鳥取県'}, {id: 32, name: '島根県'}, {id: 33, name: '岡山県'},
      {id: 34, name: '広島県'}, {id: 35, name: '山口県'}, {id: 36, name: '徳島県'},
      {id: 37, name: '香川県'}, {id: 38, name: '愛媛県'}, {id: 39, name: '高知県'},
      {id: 40, name: '福岡県'}, {id: 41, name: '佐賀県'}, {id: 42, name: '長崎県'},
      {id: 43, name: '熊本県'}, {id: 44, name: '大分県'}, {id: 45, name: '宮崎県'},
      {id: 46, name: '鹿児島県'}, {id: 47, name: '沖縄県'}
  ]
end
```

#3.アソシエーションを組んでいくぅ

今回はフリマアプリだと仮定して、商品の配送先を登録するときに都道府県をactive_hashを使って表示をしたいので、
product.rbにアソシエーションを組んでいきましょう。

```product.rb
class Product < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :prefecture
end
```

#4.表示していくぅ
商品を登録するフォームなどでcollection_selectを使う際は以下のように表示できます。

<a href="https://gyazo.com/4b22dbfd07e1afaa2eeb29c1cbdd5b57"><img src="https://i.gyazo.com/4b22dbfd07e1afaa2eeb29c1cbdd5b57.png" alt="Image from Gyazo" width="459"/></a>

```ruby
= f.collection_select :prefecture_id, Prefecture.all, :id, :name, {prompt:"選択してください"}, {class:""}
```

詳細画面などで登録した情報として表示したいときは以下のように記述すれば表示がうまくいくと思います。

```ruby
= @product.prefecture.name
```

以上
PHP7.0におけるNULL合体演算子（??）の使い方

#PHP7.0におけるNULL合体演算子（??）の使い方
ずっとPHP7.0を使ってきたのに今更になって知ったことがあるので徒然なるままに書いていく。
合体演算子を見つけた時に「なんだよここ、文字化けしてるじゃねーか」と暫くスルーしていた自分にタイプリープして間違えなかった世界戦に移行するアニメを探しているのですがどなたか知りませんか？

##NULL合体演算子とは？
「値が無かったら指定した値を代入する」みたいな感じ。
詳しくはこちら↓
[新機能：Null 合体演算子](https://www.php.net/manual/ja/migration70.new-features.php#migration70.new-features.null-coalesce-op)

##NULL合体演算子の使い方（実例）
演算子なので`($a === true)`と同じように使う。
例えば

```greet.php
$a = "hello";
$b = "chao";

echo ($c ?? "こんにちは");  //「こんにちは」と出力
```

上では`$c`は定義していないので普通は（合体演算子を使わなければ）`PHP Notice:  Undefined variable: c`のようにnoticeが吐かれてしまう。
ただ、ここでは「$cがなかったら"こんにちは"を代入する」と合体演算子が仕事してくれているので、上の様な結果になる。
（いわゆるデフォルト値を設定するってことやね。）

##こんな感じで使えばよさそう
```isset_no_kawari.php
$a = "hello";
$b = "chao";

if($c ?? NULL){ //$cが無かったらNULLを入れるのでelseの処理が行われる
  echo $c;
}else{
  echo "bye";
}
//　bye
```

`isset()`を使わなくてもいいのはあり難い。
HTMLのFormから返ってきた`$_POST`や`$_GET`を処理するのにつかえるってことやね。

詳しいことは下の参考を見てください。

##関係ないけど気になっていること
・宇宙船演算子ってなんだ？
・`isset()`の配列verって`!empty()`しかないの？

##参考
実装例：PHPのnull合体演算子で「無かったら」の処理が簡単
https://qiita.com/akiyoshi_sasaki/items/1c402e6c4af05f8197e6

PHPマニュアル　新機能
https://www.php.net/manual/ja/migration70.new-features.php
AWSへ自動デプロイ（自分用）

###ec2-userでログインする

```
$ cd ~

$ mkdir ~/.ssh
# .sshというディレクトリを作成
# File existsとエラーが表示されたとしても、.sshディレクトリは存在しているということなので、そのまま進みましょう。

$ mv Downloads/ダウンロードした鍵の名前.pem .ssh/
# mvコマンドで、ダウンロードしたpemファイルを、ダウンロードディレクトリから、.sshディレクトリに移動します。

$ cd .ssh/

$ ls
# pemファイルが存在するか確認しましょう

$ chmod 600 ダウンロードした鍵の名前.pem

$ ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
#（例えばElastic IPが123.456.789であれば、ssh -i ダウンロードした鍵の名前.pem ec2-user@123.456.789 というコマンドになります）
#（ダウンロードした鍵を用いて、ec2-userとしてログイン） 

```

###Nginxの再読み込み・再起動
ターミナル(EC2サーバ)

```
[ec2-user@ip-172-31-25-189 ~]$ sudo service nginx reload
[ec2-user@ip-172-31-25-189 ~]$ sudo service nginx restart
```

###MySQLの起動

MySQLが立ち上がっていないとデプロイが失敗します。コマンドで再起動をしておきましょう。
ターミナル(EC2サーバ)

```
[ec2-user@ip-172-31-25-189 ~]$ sudo service mysqld restart
```

###ローカルの変更点を本番環境へ反映させる

```
#まず、作業しているディレクトリ移動
[ec2-user@ip-172-31-25-189 ~]$ cd /var/www/〇〇〇〇
[ec2-user@ip-172-31-23-189 <レポジトリ名>]$ git pull origin master
```

###Unicornを再起動

```
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn

ec2-user 17877  0.4 18.1 588472 182840 ?       Sl   01:55   0:02 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user 17881  0.0 17.3 589088 175164 ?       Sl   01:55   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
ec2-user 17911  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn
```

プロセスをkillする
（EC2サーバ)

```
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ kill <確認したunicorn rails masterのPID（上のコードでは17877）>
...
```

##自動デプロイする
ローカルのターミナルに戻り、以下のコマンドで自動デプロイを実行する。

```
# アプリケーションのディレクトリで実行する
$ bundle exec cap production deploy
```
awkでunixtime変換

こんなファイルの2列目をunixtimeに変換して別ファイルへ書き出したいとき
Macなので`gdate`を使う

```sample.txt
id1,2020-04-03 00:32:23
id2,2020-03-31 21:57:41
id3,2020-04-02 13:23:14
id4,2020-04-01 21:33:13
```

#### 実行内容
```bash

awk -F, -v 'OFS=\t' '{cmd="gdate -d \""$2"\" +%s"; cmd | getline date; close(cmd); print date, $1}' sample.txt > result.txt
```

#### 結果

```result.txt
1585841543	id1
1585659461	id2
1585801394	id3
1585744393	id4
```

ちゃんと`close(cmd)`で閉じないとある程度の行を処理したとき`awk: gdate -d "2020-03-31 20:32:07" +%s makes too many open files`って怒られてしまうので注意

#### 参考
https://stackoverflow.com/questions/31006731/awk-too-many-open-files-issue-date-parsing
JMP ユーザー インタビュー vol.1

 
![tadashi-mitsui.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/3541dac8-8097-4b50-102c-785ed0792d6e.jpeg)

**三井　正 氏**
**東芝半導体サービス＆サポート株式会社 データサイエンス推進グループ長**
 
**JMPユーザー歴：**
1994年から

**私の意外な一面：**
家具作りなどの木工作業全般が趣味です。特にWood Carvingは本格的に取り組んでいるので、作品を紹介させてください。私の作品は自然の木の特性を活かして色を塗らずに仕上げるのが特徴です。これはLoon（和名：ハシグロアビ）の親子をモチーフにした小物入れです。雛が蓋になっていて、その中に腕時計が入れられるようになっています。
![Wood_carving.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/c3db4f65-a69c-eb2d-788e-5dde3881180c.jpeg)
  
**1.近況についてお話しいただけますか？**
ここ数年は、半導体の研究開発の場でJMPを「使う」立場から、コンサルタントとしてJMPを使った実験計画を「教える」立場へと緩やかに移行していました。今までは関連会社内での活動を主体としていましたが、更に多くの技術者にJMPの楽しみを知ってもらうために、昨年[『JMPではじめるデータサイエンス』(オーム社)](https://www.ohmsha.co.jp/book/9784274224409/)を上梓しました。今後はもっと自由な立場で活動していく予定なので、JMPユーザーと直接お話しする機会が増えることを楽しみにしています。
 
**2.JMPの機能で1番気に入っているものは？**
JMPには、とにかく使っているだけでも楽しかったという初期のMacのDNAが残っています。統計ソフトとしてそれだけでも十分満足していますが、数ある機能の中で１つだけあげるならば「パーティション」が気に入っています。対話的とはかくあるべきという見本として、JMPの基本コンセプトを体感できる素晴らしい機能です。
 
**3.初めての仕事は何でしたか？**
東芝の府中工場で、イオンビームを使った超高真空分析装置の開発に従事していました。装置の設計だけでなく、製造・販売も手がけるグループだったので、イオン光学系のシミュレーションから装置の板金加工や営業回り、展示会の説明員まで何でもやりました。今になっては、とても良い経験になりました。
 
**4.JMPに関心を持ったきっかけは何でしたか？**
その後、半導体の研究開発の場で新しい計測技術を開発し、ユーザーに提供する立場に異動します。そこでは、計測装置の性能を向上するために、以前からMATLABを使った計測データの分析を手がけてはいました。あるとき、装置性能の向上だけでなく、その装置をユーザーにうまく使ってもらうかまでケアしなければならないと思い立ったのです。当時からMacユーザーであった私がJMPに巡り合うのには時間はかかりませんでした。
 
**5.プロフェッショナルとして1番誇らしく感じた瞬間は？**
自分の開発した計測システムが実際に量産工場に展開できたときです。詳しいことは書けないのですが、分散コンピューティングを実装したWEBアプリケーションとして今でも通用するコンセプトだったと思っています。関連特許もたくさん書くことができました。
 
**6.仕事のどの部分が1番好きですか？**
コンサルタントとしての体験でお話ししますと、やはり技術者に喜んでもらえることです。ある製品の欠陥問題に取り組んで成功した事例では「今まで何年も解決できなかった問題が片付いて、これで他の仕事にとりかかれます。」と言われて、ともに苦労して良かったと思いました。
 
**7.最近JMPをどのように活用していますか？**
コンサルタント業務としては、何と言っても「実験計画」に大変お世話になっています。それ以外にも、最近はJMPを使って統計学を教えることに取り組んでいるところです。特に、ヘルプメニューの「サンプルデータ」にある「教育用スクリプト」には優れた教育用のスクリプトが多くあるので、大変役立っています。そのうちのいくつかは、拙著でも紹介していますので、興味ある方は参考にしてください．
 
**8.JMPを用いた最初のプロジェクトは何でしたか？**
JMPが直接業務に役立ったのは1990年の後半でした。あれから20年以上経ってしまったことになりますが、当時、私はアメリカのバージニア州にある半導体の量産工場で計測装置を担当していました。半導体の製品はロット、ウェハ、チップと層別化されているという特徴があります。そこで、量産計測データを分散分析して、製品ごとに問題点を洗い出すことができました。
 
**9.JMPの開発者やジョン・ソール氏に何か伝えたいことはありますか？**
Mac OSがiOSライクに変貌を遂げているように、JMPもMacのDNAを残しつつ、これからも進化し続けてください。個人的には、私のようにコンサルタントとしてJMPを間接的に使う立場の者の意見も取り込んでいただけたらと思っています。例えば「ジャーナル」にはお願いしたい改良がいろいろあります。
 
**10.今後20～50年でデータサイエンスやアナリティクスの分野はどうなると思いますか？**
お金が儲かるということが周知されてきたこともあって、現在多くの企業がこの分野に注目しています。とはいえ、表計算やワープロといったPCソフトの普及を顧みれば、このダイナミックな変革の後に来るのは常態化です。そこでは、データサイエンスを知っているのは当たり前で、自らの知見と融合して行動を起こせるスキルが何よりも重要になっていくでしょう。

■	さあ始めよう！
JMPの全機能を30日間試せるトライアル版で、データからさらなる情報を導き出せることを実感してください。
さあ始めましょう。

ダウンロードは[**コチラ！**](https://www.jmp.com/ja_jp/download-jmp-free-trial.html?utm_campaign=td7013Z000002sEGsQAM&utm_source=JMPblog&utm_medium=)
Amazon SES+Pythonでメールを送信する

## Amazon SESとは
- Amazonが提供するEメールプラットフォーム
- 従量課金制

## 手順
- リージョンの選択
- 送信用のメールアドレスを登録する
- 送信制限を解除する
- メール送信処理の実装

### リージョンの選択
Amazon SESでは現在以下のリージョンがサポートされています
![スクリーンショット 2020-05-14 14.32.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/dfa71e2d-cc22-d9ea-c176-7297b30886ea.png)

### 送信用のメールアドレスを登録する
Amazon SESでは送信用のメールアドレスを検証し、登録する必要があります。
（検証されていないメールアドレスについては使用する事ができません。）

- SESの[Email Addresses]タブの[Verify a New Adress]ボタンから送信用に登録したいメールアドレスを入力
![スクリーンショット 2020-05-14 14.26.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/061bb026-cb11-c91e-1b4a-8ac36aadbd36.png)

- 認証メールが届くので、メールのURLから認証を完了させる

### 送信制限を解除する
何もしない状態の場合、認証したメールアドレス宛てにしかメールを送信できないかつ送信数が限られているため、制限の解除を行う必要があります。

- SESの[Sending Statistics]タブで[Request a Sending Limit Increase]ボタンをクリック
- Support Centerページに遷移するので、必要情報を入力
<img width="619" alt="スクリーンショット 2020-05-14 14.44.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/271cf56d-6502-acd9-280f-948742b409bb.png">
- 申請

### メール送信の実装
```python
import boto3

def main():
  try:
    client = boto3.client(
      'ses',
      aws_access_key_id={AWS_ACCESS_KEY_ID},
      aws_secret_access_key={AWS_SECRET_ACCESS_KEY},
      region_name='us-east-1' # 送信用メールアドレスを登録したリージョン
    )

    client.send_email(
      Destination={
        'ToAddresses': ['hoge@hoge.com', 'hoge2@hoge.com'],
        'BccAddresses': ['hoge_bcc@hoge.com']
      },
      Message={
        'Body': {
          'Text': {
            'Data': 'メール本文',
            'Charset': 'utf-8'
          }
        },
        'Subject': {
          'Data': '件名',
          'Charset': 'utf-8'
        }
      },
      Source='hoge_from@hoge.com', # 登録済みのメールアドレス
      ConfigurationSetName='メール送信者として表示したい名前'
    )
  except ClientError as e:
    print(e.response['Error']['Message'])
  else:
    print(response['MessageId'])
```

## 参考
[Amazon SES開発者ガイド](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/Welcome.html)
[Magicleap]新launcherアプリ The Lab

2020年5月14日時点、開発環境が大きく一新されいくるかの変更点が追加されているので自分用も含めてここにメモしていきます。 (Lumin SDK 0.24.1)

##The Lab
![000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/2c98b5f1-2d75-b9bf-d067-2986f1802a71.jpeg)
従来のPackageManagerは廃止されたのか、この「The Lab」と言われる管理ツールにPackageManagerごと統合されました。以前のPackageManagerとも共存は可能ですが、不要だと思われるので消してしまって問題ないでしょう。

以前のPackageManager↓
![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/a1791048-cd94-5eec-c4d2-f70b275992bd.jpeg)


The Labのダウンロード方法は以下のリンクから
[MagicLeap公式サイト](https://developer.magicleap.com/downloads/lab)

![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/0d099060-b287-af5a-8a35-22f16458319a.jpeg)

ダウンロードしたら、インストール先のパスを確認してインストール
![003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/dd412ae7-229a-c4d6-a68e-620efc5325db.jpeg)

##画面構成
The Labはパッケージマネージャーと各種アプリケーションのlauncher機能を兼ねています
![004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/1b7e6141-b9d4-eb8a-4e96-f69856e7f511.jpeg)
1. タブで隠れてしまってますが「Home」ボタンがあり、各種セッティングを確認できます
2. MagicLeapのパッケージやアプリケーションの保存先ディレクトリを開きます
3. MagicLeapのコマンド「mldb」が使えるコマンドラインを開きます
4. インストールされているアプリケーションが列挙されます
5. パッケージマネージャーを開きます
6. 接続されているMagicLeapの台数、再起動やヘッドポーズの初期化等も行える

Homeボタンからセッティング画面を開いたイメージ
![005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/defd4420-b747-88ad-9e61-a65c6e5394d1.jpeg)

##開発者向け主要機能

###DeviceBridge
![006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/07b127d0-bad1-a3ce-7241-b7fe71e61595.jpeg)
現在接続されているMagicLeapの基本情報を参照できます。また、今までコマンドラインで操作していたファイルマネージメントや、アプリケーションのインストールがこの画面から行えるようになりました。便利。
WifiBridgeへの切り替えやポート番号の動的変更などのネットワーク回りも親切になったのでどんどん使っていきましょう

MagicLeapのデバイス側で
Settings > Developer > DeveloperMode
Settings > Developer > Enable MLDB Access
をONにしないと使えないのでご注意を

###ZeroIteration
![007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/217b815f-6de3-086e-6201-57a31bc6641b.jpeg)
リリース当初からあるZeroIterationもThe Labから起動できます。
これは開発を行うときに必ず必要になるので必須でダウンロードしておきましょう。ダウンロードはパッケージマネージャーからできます。また、デバイスを持っていない場合でもシミュレーター機能を用いて開発を行う事が出来ます。

ダウンロードするもの
![008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/15f11cec-887e-9fb2-8514-10aed3471720.jpeg)

###DeviceStream
![009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/447861e0-df24-e8fc-4b3f-51e4719e8a4a.jpeg)

新機能としてデバイスからのカメラ映像をストリームで共有する機能が新設されました。例えばイベント会場での対応だったりで体験者の見ている画面を観客に共有したいケースなどに利用できますね。ただ、現在はまだBeta版のようで安定動作をしていないように見えます。今後のアップデートを待ちましょう
[漏洞通告]jackson-2704/jackson-databind JNDI注入导致远程代码执行

### 漏洞描述
近日,亚信安全网络攻防实验室跟踪到`jackson-databind`更新了1个jndi注入的黑名单类(并未在发行的最新版中加入).如果在项目包中存在该类的jar包且JDK版本满足注入版本,则可以使用JNDI注入的方式导致远程代码执行.类名为`com.sun.org.apache.xalan.internal.lib.sql.JNDIConnectionPool`.



### 漏洞编号
Jackson内部编号2704

### 漏洞威胁等级
中危

### 受影响范围
全版本

### 漏洞验证

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/a982d300-2c02-18d6-6d45-b955ebf0533a.png)

### 修复建议
参照官方更新至最新版

### 时间轴
[0] 2020/05/14 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://github.com/FasterXML/jackson-databind/issues/2704
https://github.com/FasterXML/jackson-databind/releases
【Rails】後からカラムを追加して外部キーを張る際に、add_referenceを使う場合の注意点。

##始めに
忘れがちになるため、備忘録。

##環境
Ruby　2.6.5
Rails　5.2.4.2

##アソシエーション対象
投稿用のpostsテーブルと、ユーザーのusersテーブルを関連付け。
postsテーブルに外部キー制約を張ったuser_idカラムを追加する

##カラム追加用のマイグレーションを作成
1.マイグレーション作成

```
$ rails g migration AddUserIdToPosts 
```

2.マイグレーションファイルへの記述。__foreign_key: trueを忘れずに記述すること。__

```ruby:db/migrate/[timestamps]_add_user_id_to_posts.rb
class AddUserIdToPosts < ActiveRecord::Migration[5.2]
  def change
    add_reference :posts, :user, foreign_key: true
  end
end
```

※上手く外部キー制約が追加されない記述。

```ruby:db/migrate/[timestamps]_add_user_id_to_posts.rb
class AddUserIdToPosts < ActiveRecord::Migration[5.2]
  def change
    add_reference :posts, :user, index: true
  end
end
```

3.マイグレーションファイルの保存

```
$ rails db:migrate
```

<br>
##何故、foreign_keyが必要なのか
####[Ruby on Rails API](https://api.rubyonrails.org/v5.2.4.1/)より、
>####add_reference(table_name, ref_name, **options)
>>:foreign_key
Add an appropriate foreign key constraint. __Defaults to false__.

>>>Create a supplier_id column and appropriate foreign key
__add_reference(:products, :supplier, foreign_key: true)__

__外部キー制約を張るためのforeign_keyはデフォルトではfalse__になるため、ただ単にadd_referenceカラムを追加しただけでは外部キー制約は張られることがないとのこと。

つまり、「user.posts」のようにアソシエーションを利用してオブジェクトを取得しようとしても、外部キーが存在しないためエラーになるので注意が必要。

##参考
[Railsで外部キー制約のついたカラムを作る時のmigrationの書き方](https://qiita.com/publichtml/items/1fba15d8071fab66d043)
[後からreferencesカラムを追加しようとするとdb:migrateできない](https://kossy-web-engineer.hatenablog.com/entry/2018/09/03/022121)
Djangoの各種データベース用の設定をまとめてみた(MySQL、PostgreSQL)

Djangoで使用するデータベースをコロコロ変える羽目になったときにやりやすいようにまとめました
#SQLite3
```settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
```

#MySQL
```settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DATABASE',  # Database名
        'USER': 'USER',  # ユーザID
        'PASSWORD': 'password',  # ユーザIDのパスワード
        'HOST': 'localhost',  # ホスト名
        'PORT': '3306',
    }
}
```
必要なライブラリ：mysqlclient
PyMySQLも使えますが推奨されているのはmysqlclientです。

#POSTGRESQL

```settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'DATABASE',  # Database名
        'USER': 'USER',  # ユーザID
        'PASSWORD': 'password',  # ユーザIDのパスワード
        'HOST': 'localhost',  # ホスト名
        'PORT': '5432',
    }
}
```
必要なライブラリ：psycopg2
サジェスト機能を実装

#サジェスト機能を実装
機能を追加したので学んだことをoutputしておく。
理解が深まればもう少しわかりやすく改善していく予定。

##実装内容
以下の写真のように文字を入力すると候補が表示されるようにしたい。
![スクリーンショット 2020-05-14 15.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590181/19eef39b-f757-a76e-2c79-0b667afa599d.png)

まず
`gem 'jquery-ui-rails'`をGemfileに記載し、
`bundle install`を実行
jQuery UIは、jQueryを拡張するライブラリ（プラグイン）の一種
これにより「autocomplete」が使えるようになり、候補がリストで表示される。

早速、`search.rb`を作成し、以下のように配置する。(今回は新たに作成したが既存のものに書いても良い。）
![スクリーンショット 2020-05-14 15.11.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590181/6629d9c9-0a7f-4267-d8b6-573d29a4e809.png)

そして以下のように書く。
![スクリーンショット 2020-05-14 15.15.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590181/8c7b750d-5262-a924-4aa7-43bf58e7f1dc.png)

**軽く説明**
１行目はjQuery記載のためのテンプレ
９行目で以下のようなhtmlファイルに記載されたid="suggest"のiuputにユーザーが入力した時に「autocomplete」が反応する。

```
<input type="text" id="suggest">
```
`source:data`によりデータの元を定義する
今回であればl2~l9で定義されたdataを呼び出しユーザーが入力した値に対して該当する値が検出される。
`autoFocus:true`このページの最初の写真のように、「a」を入力するとリストが表示されて、「apple」の部分背景がgrayになっている。trueをfalseに変えると背景はgrayにならない。
`delay:300`入力してから0.3秒後に表示される。
`minLength:1`1文字以上入力された時に実行される。


#参考サイト
[jQuery UI](https://www.buildinsider.net/web/jqueryuiref/0001)
とある学生がゲーム開発してみた#6(MacBookAirの話)

![IMG20200511101658.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614245/4ee59b25-1618-4c01-24a3-a5d1d537a316.jpeg)
#MacBookAir2020モデル
来たました!とうとうMacデビューです!
って言う報告だけです。UnityもBlenderも大きな相違点はなかったので別に書くことはないかと。
そういえば私がしばらく記事を書いてなかった間に私のゲーム制作は結構進展があったのでそれについても近々記事を書こうと思います。
[備忘録] GCP(Container Optimized OS)への秘密鍵によるSCPが"Permission denied (publickey)."になる

GCP上のインスタンスにファイルをSCPで転送するときにあまりにもしょうもないことで詰まったので自分用メモ

# 環境
ローカル：CentOS7
リモート：Container Optimized OS on GCP

# SCPコマンドの使い方を間違っていることに気が付かない

```
[hoge@localhost test]$ scp a.txt -i ~/.ssh/id_rsa_gcp hoge@xx.xx.xx.xx:/home/hoge
Permission denied (publickey).
lost connection
```
このエラーメッセージを見て鍵が間違っている？と思いsshを試してみると問題なくつながる。
色々調べても鍵が間違っているとか、リモート側のPermissionが違うだの、そういうのしか出てこない。
で、ふと気が付いた。
鍵の指定は`scp`のすぐ後ろだと。どうやら`a.txt`が鍵になっているっぽい。
というわけで出来ました。

```
[hoge@localhost test]$ scp -i ~/.ssh/id_rsa_gcp a.txt hoge@xx.xx.xx.xx:/home/hoge
a.txt                                       100% 1086     5.4KB/s   00:00
```

他のCentOSに同じ間違いをしてもエラーメッセージが全く違う。

```
scp a.txt -i ~/.ssh/id_rsa hoge@172.16.0.24:/home/hoge
a.txt                                         100% 1086     2.5MB/s   00:00
-i: No such file or directory
id_rsa                                        100% 1679     1.0MB/s   00:00
```
これで気が付きました。

ググってもおなじ悩みが見つからなかったので、自分の愚かさにちょっと涙が出そうになった。
AWSのIPレンジが取得方法で異なるんだってさ

# 背景
対象のサービスを運用していて、見れる人を制限したかったので、SecurityGroupを利用していました
そこで、シンセティック監視をRoute 53 health checksを利用しようとしてました
ただ、監視をしつつ見れる人を制限する場合、Route 53 health checksのIPレンジが必要になるので
確認すると、取得方法が２種類あって、それぞれ微妙にIPが違ったのでその共有になります

# 取得方法
Amazon Route 53 health checksのIPレンジを調べてたところ、取り方が下記の2パターンあります

1. json
2. SDK

1つ目のjsonとは、AWSがメンテしてる[こちら](https://ip-ranges.amazonaws.com/ip-ranges.json)のjsonから確認する方法です
2つ目のSDKとは、Route 53のSDKからレンジを確認する方法です。今回はPythonを使います

# 環境
```bash
$ python --version
Python 3.6.8
$ pip list | grep boto3
boto3                               1.13.9
```

# 確認
## jsonの確認
```Python
>>> import requests
>>> ip_ranges = requests.get('https://ip-ranges.amazonaws.com/ip-ranges.json').json()['prefixes']
>>> route53_ips_json = [item['ip_prefix'] for item in ip_ranges if item["service"] == "ROUTE53_HEALTHCHECKS"]
>>> route53_ips_json
['54.252.254.192/26', '177.71.207.128/26', '54.255.254.192/26', '54.244.52.192/26', '54.251.31.128/26', '54.241.32.64/26', '54.245.168.0/26', '54.232.40.64/26', '54.248.220.0/26', '176.34.159.192/26', '54.252.79.128/26', '54.183.255.128/26', '54.250.253.192/26', '15.177.0.0/18', '54.228.16.0/26', '107.23.255.0/26', '54.243.31.192/26']
>>> len(route53_ips_json)
17
```

## SDKの確認
```python
>>> import boto3
>>> client = boto3.client('route53')
>>> route53_ips_sdk = client.get_checker_ip_ranges()
>>> route53_ips_sdk['CheckerIpRanges']
['15.177.2.0/23', '15.177.6.0/23', '15.177.10.0/23', '15.177.14.0/23', '15.177.18.0/23', '15.177.22.0/23', '15.177.26.0/23', '15.177.30.0/23', '15.177.34.0/23', '15.177.38.0/23', '15.177.42.0/23', '15.177.46.0/23', '15.177.50.0/23', '15.177.54.0/23', '15.177.58.0/23', '15.177.62.0/23', '54.183.255.128/26', '54.228.16.0/26', '54.232.40.64/26', '54.241.32.64/26', '54.243.31.192/26', '54.244.52.192/26', '54.245.168.0/26', '54.248.220.0/26', '54.250.253.192/26', '54.251.31.128/26', '54.252.79.128/26', '54.252.254.192/26', '54.255.254.192/26', '107.23.255.0/26', '176.34.159.192/26', '177.71.207.128/26']
>>> len(route53_ips_sdk['CheckerIpRanges'])
32
```

## 違い
ということで、上記のように配列の長さが違うので、一致はしませんでした
で、どこが違うというと、下記のようになりました

```python
>>> set(route53_ips_json) - set(route53_ips_sdk['CheckerIpRanges'])                                                                         
{'15.177.0.0/18'}
>>> set(route53_ips_sdk['CheckerIpRanges']) - set(route53_ips_json)
{'15.177.18.0/23', '15.177.2.0/23', '15.177.42.0/23', '15.177.50.0/23', '15.177.34.0/23', '15.177.54.0/23', '15.177.10.0/23', '15.177.6.0/23', '15.177.26.0/23', '15.177.14.0/23', '15.177.46.0/23', '15.177.58.0/23', '15.177.38.0/23', '15.177.62.0/23', '15.177.22.0/23', '15.177.30.0/23'}
```

つまり、15.177.0.0/18で大きく括ってるのがどうかが違ってました

# まとめ
Route 53 health checksのIPレンジが取得方法によってIPレンジが異なりました
jsonで取得する方法だと一部大きくIPレンジを取っていて、SDKだと細かく切っている状態でした
どちらが正しいかと言われると正直怪しいですが、個人的にはSecurityGroupのメンテを少なくしたいので、
大きくとるjsonが良いのかなと思いました
SIQR モデルの表示

次のモデルに SIQR を適用してみました。
[SIR モデルの日本語表示 （その ２）](https://qiita.com/ekzemplaro/items/e40049dec177993252f0)

```py:siqr02.py
#! /usr/bin/python
#
#	siqr02.py
#
#						May/14/2020
# ------------------------------------------------------------------
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
from scipy.optimize import minimize
import	sys

# ------------------------------------------------------------------
def SIQR_EQ(v, t, beta, gamma, p_kakuri):
	q_kakuri = 0.0
	rvalue = [0,0,0,0]
	beta_ss_ii = beta * v[0] * v[1]
	rvalue[0] = - beta_ss_ii
	rvalue[1] = (1 - q_kakuri) * beta_ss_ii - p_kakuri * v[1] - gamma * v[1]
	rvalue[2] = q_kakuri * beta_ss_ii + p_kakuri * v[1] - gamma * v[2]
	rvalue[3] = gamma * v[1] + gamma * v[2]
#	rvalue[3] = -(rvalue[0] + rvalue[1] + rvalue[2])
#
	return rvalue
#
# ------------------------------------------------------------------
def calc_proc(times,beta_const,gamma_const,p_kakuri):
	S_0=999
	I_0=1
	Q_0=0
	R_0=0
	ini_state = [S_0,I_0,Q_0,R_0]

	args  =(beta_const, gamma_const, p_kakuri)

	N_total = S_0 + I_0 + Q_0 + R_0
	R0 = N_total*beta_const *(1/gamma_const)
	print(R0)

#Numerical Solution using scipy.integrate
#Solver SIR model
	result = odeint(SIQR_EQ, ini_state, times, args)
#
	return R0,result
# ------------------------------------------------------------------
def plot_graph_proc(R0,p_kakuri,times,result):
	plt.rcParams["font.family"] = "TakaoExGothic"
#	 plt.rcParams["font.family"] = "IPAGothic"

	str_out = "基本再生産数 : {}".format(format(R0,".3f"))
	str_out += "  "
	str_out += "隔離率 : {}".format(format(p_kakuri,".3f"))
	plt.title(str_out)
	plt.xlabel('日数')
	plt.ylabel('人数')
	plt.plot(times,result)
	plt.legend(['未感染者','感染 非隔離者','感染 隔離者','回復者'])
	plt.show()
#
# ------------------------------------------------------------------
sys.stderr.write("*** start ***\n")
t_max = 160
dt = 0.01
#
beta_const = 0.2/1000
gamma_const = 0.1
p_kakuri = float(sys.argv[1])
sys.stderr.write("p_kakuri = %.3f\n" % p_kakuri)

times =np.arange(0,t_max, dt)
R0,result = calc_proc(times,beta_const,gamma_const,p_kakuri)
#
plot_graph_proc(R0,p_kakuri,times,result)
#
sys.stderr.write("*** end ***\n")
# ------------------------------------------------------------------
```

隔離率 0.0

>```bash
./siqr02.py 0.0
```

![siqr02_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9fc18426-5326-9cf3-3509-3a7dd8e1eb1b.png)

隔離率 0.05

>```bash
./siqr02.py 0.0
```

![siqr02_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/435f9ba6-5459-8817-ebf6-4dd736656313.png)
エクセルのシートを読込　１行ずつループ処理する　Python　VBA

これは　エクセルからデータを読み込んで　スクレイピングするときの自分用メモです
***
処理イメージ　※ソースは初心者レベルの簡単に
■300店舗ほどある
■各店舗ごとになにかしらのデータを取得したり、更新したりする
↓　そのために
エクセルにある店番号や、店舗コード,URL,ログインIDなど様々な情報を読み込み
読み込んだ内容でループする（１行ずつ処理）
***

#Pythonでエクセルのシートを読み込む
※処理イメージ　設定内容をリストにし、１行ずつループする

```python:openpyxlを使いエクセルの設定シートを読みこむ

import openpyxl　　　　#openpyxl　を使えるようにする
wb=openpyxl.load_workbook("test.xlsx")
sheet=wb["設定"]    #シート名は設定
C=[]
for row in sheet:
　C.append([col.value for col in row])

#エクセルシートの内容をループで処理していく
#Cは0から始まる　設定シートの１行目は見出しにしているのでループは1から始めている
for i in range(1,len(C)):
 print(C[i][0])
 print(C[i][1])
```        
*Cに設定シートの内容がリストのリストで取れている。
エクセルの１行１行をループで取得し、処理をしていく。
※
**設定シートはA1から始まるきれいな表にすること。そうすればきれいにループできる。**



#VBAでエクセルのシートを読み込む
多少複雑だけど、融通が利きます。
Variant型配列に設定シートの内容を読みこみ１行ずつ
ループ処理をする

```vb:エクセル設定シートの内容を読みこみ１行ずつループ処理する
Dim CRastRow As Long                         '設定シートの最終行　A列で判断
Dim i as Long
Dim C As Variant
'設定シートのA列の最終行を読み込む
CRastRow = ThisWorkbook.Sheets("設定").Cells(Rows.Count, 1).End(xlUp).Row  

'1行目は見出しのことが多いので、A2からG列最終行までを読み込むとする
C = ThisWorkbook.Sheets("設定").Range("A2:G" & CRastRow)

'ループは1から始まる　1行ずつ処理
For i = 1 To UBound(C)
    Debug.Print(C(i,1))　’A列
    Debug.Print(C(i,2)　 ’B列
    
next i
Railsプロジェクトの *_spec.rb の中で xmpfilter を使う方法

### 要点

1. `rspec/autorun` を読み込むことで rspec コマンドで実行したのと同じ状況にする
1. `require "rails_helper"` などが失敗しないように `-I spec` を指定
1. カレントディレクトリを Rails.root に固定するため `--cd` に .git のあるディレクトリを指定

### 例

```elisp
(defun rubyxmp ()
  (interactive)
  (let ((s "xmpfilter --dev --fork --no-warnings --poetry")
        (rspec-p (string-match "_spec" (buffer-file-name)))
        (git-root (locate-dominating-file default-directory ".git"))
        xmpfilter-command-name)
    (when rspec-p
      (setq s (concat s " -r rspec/autorun -I spec"))
      (when git-root
        (setq s (concat s " --cd " git-root))))
    (setq xmpfilter-command-name s)
    (call-interactively 'xmp)))
```
anime.js スムーススクロール 実装方法

# はじめに
初めてanime.jsでスムーススクロールの実装をしてみました。
普段はvelocity.jsを使っているため、やり方が違ってハマってしまい、調べても出てこなかったので備忘録として記事にしました。

## 実装方法
```javascript:anime
  //$target = document.querySelector(TARGET);
  scroll($target) {
    const $window = window.document.scrollingElement || window.document.body || window.document.documentElement;
    anime({
      targets: { scroll: $window.scrollTop },
      scroll: $target.offsetTop,
      duration: 500,
      easing: 'easeInOutQuart',
      update: (a) => {
        $window.scrollTop = a.animations[0].currentValue;
      }
    });
  }
```

```javascript:velocity
  //$target = document.querySelector(TARGET);
  scroll($target) {
    velocity($target, 'scroll');
  }
```

## 終わりに
他のアニメーションとの兼ね合いでanime.jsを使う必要がありました。
velocityのときは一行で済んでいたのですが、anime.jsだとそうもいかず。。
調べてもなかなか出てこず、ハマりました。
もう少しスマートにかけないかなあと思っているので、こうした方がいいよ等ございましたら
教えていただきたいです。
[Rails]form_for／form_withの書き方(haml含む）

# はじめに
自分が初めてform_with／form_forの文法を学んだ時に「???」となったので、
初学者にも分かるような説明記載と自分の備忘録として記載します。

まず、はじめに「form_for」はRails5.1で非推奨となっており、将来的にform_withに置き換えられる予定です。
「Rails5.1以上」と「form_with」の使用が推奨とされております。(2020/5/14現在)

# **「form_for」と「form_with」**
## 1.form_for
- Railsでフォームタグを簡単に作成するためのメソッド
- モデルに基づくformに使用される


form_forは以下のように書きます。

```ruby
<%= form_for モデル do |form| %>
  <%# フォームの部品 %>
<% end %>
```
具体的なコードで書くと、
※モデルはUserとする

```ruby
<%= form_for @user do |form| %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>
```
__Rails特有__のhamlで書くと、

```ruby
= form_for @user do |f|
  = f.text_field :email
  = f.submit
```


## 2.form_with
- 自動でパスを選択してくれ、HTTPメソッド(getやpostなど)を指定する必要が無い
- コントローラから渡された、ActiveRecordを継承するモデルのインスタンスが利用できる
- モデルに基づかないフォームも生成できる

form_withは以下のように書きます。

```ruby
<%= form_with model:'モデル名' local: true do |form| %>
  <%# フォームの部品 %>
<% end %>
```

上記の説明で取り上げた通り、form_withは、__モデルに基づかないファームも生成できます。__
具体的なコードで書くと、
※モデルはUserとする

```ruby
 #関連するモデルがない場合 → urlの指定のみで、modelの記述がない
<%= form_with url: users_path do |form| %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>
```
```ruby
 #関連するモデルがある場合 → modelの記述のみで、urlの指定は不要
<%= form_with model: @user do |form| %>
  <%= form.text_field :email %>
  <%= form.submit %>
<% end %>
```
__Rails特有__のhamlで書くと、

```ruby
 #関連するモデルがない場合 → urlの指定のみで、modelの記述がない
= form_with url: users_path do |f|
  = f.text_field :email
  = form.submit
```

```ruby
 #関連するモデルがある場合 → modelの記述のみで、urlの指定は不要
= form_with model: @user do |f|
  = form.text_field :email
  = form.submit
```
# 「form_for」と「form_with」の違い
1.localは、記載の必要あり。
2.remote(Ajax)は、基本的にtrue設定で記載の必要なし。
3.form_withではinputタグは用いない
上記の1と2に関しましては、以下の記事が参考になりますので、興味がございましたらご参照下さい。
https://qiita.com/Tatsu88/items/8ea9b944681a48cce589#comment-85443e109252b344989b

# 最後に
これからは form_with を使うことを強くお勧めします。
もしこの記事がみなさんの役に立てば幸いです。

以上となります。最後までご覧いただき、ありがとうございました！
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。

# 参考記事
[【Rails 5】(新) form_with と (旧) form_tag, form_for の違い](https://qiita.com/hmmrjn/items/24f3b8eade206ace17e2)
[form_for/form_tag/form_withについて【概要+使い方】](https://qiita.com/Tatsu88/items/cb78c0997ce24abb6759)
[【Rails入門説明書】form_withについて解説](https://web-camp.io/magazine/archives/17665)
AWS でEC2 のインスタンスを作成した

備忘録がてら。

aws にログインする。自分の場合は「Root user」でログインしてる。

パスワードを入力する。

「AWS Management Console」の「AWS services」に含まれる「EC２」を選択する。
![Screenshot from 2020-05-14 14-11-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369980/f554901d-4acb-5460-5895-3474b566562c.png)

---

画像下部の「Launch instance」をクリックすると、トグルが上方向に広がって出てくる。「Launch instance」を選択すると、インスタンスを生成する画面に移る。
![Screenshot from 2020-05-14 14-13-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369980/f30555a4-37fc-fa6f-cbe8-2e631dcaa204.png)

---

画面右側の青いボタンが3つあるかと思う。自分は一番上の「64-bit(x86)」を選んだと思う。真ん中との違いはなん何だろう。５年保証がどうとか、各種環境が整ってるとか書いてる。どっちを選んでもLinux が使える。一番下はwindows が使える。
![Screenshot from 2020-05-14 14-20-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369980/d6bab53d-b694-c72a-77ef-8aeb784e30c2.png)

---

ここはデフォルトで進んだ。カーソルを乗せると何か注意書きが出てくるので、しっかり読もう。
右下の「Review and Launch」を押すと次に進む。
![Screenshot from 2020-05-14 14-25-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369980/1bd2453b-a9d6-d69e-ed3d-a637e679116f.png)

---

ここもそのまま右下の「Launch」をクリックして進んだように思う。
![Screenshot from 2020-05-14 14-28-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369980/cbc05fff-e4b7-ea30-f85e-12255a02483b.png)

---

こんな画面が出てくる。公開鍵暗号方式で通信をするときに必要なキーペアを生成する画面らしい。
２つあるうちの上のトグルから「Create a new key pair」を選択すると新しいキーペアを得ることが出来る。ただし再生成は出来ないらしい。大事に保管しよう。
自分はとりあえず新しいキーペアを生成したが特に使用していない。
「Launch Instance」をクリックするとインスタンスが生成される。
![Screenshot from 2020-05-14 14-30-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369980/2d1f6268-b0d5-66f7-e4ed-145ab3840309.png)

---
【Laravel】Composer requireでエラー(Installation failed, reverting ./composer.json to its original content.)が出るけどrequireしたい！

#composer requireしてみる

今回私はlarevel uiをインストールしたかった。

```bash
composer require laravel/ui
```

<img width="1105" alt="スクリーンショット 2020-05-14 14.45.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558434/f2e3c6ad-69cb-043b-a5e3-df231e281542.png">

エラーで乙。

#原因
今入れようとしたパッケージとすでに入っているパッケージがそれぞれ同じパッケージの違うバージョンに依存してしまっているよう🙄


#解決法
このようにバージョン指定にアスタリスクをつけて、依存関係が解決されるバージョンが存在するのを祈る。

```bash
composer require laravel/ui:0.*
```

0から試していく。


<img width="598" alt="スクリーンショット 2020-05-14 14.49.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558434/e5c19dc3-d611-4ab5-bd94-0138009da5ff.png">


違うバージョンの時は上の画像のようなエラーが出るが、順次数字を足しながら試していくと合うバージョンが見つかり、インストールできる。

<img width="1139" alt="スクリーンショット 2020-05-14 14.50.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558434/6651aea6-f06c-f15d-7abf-42c120ea09b0.png">

成功っ！！
私の時は、

```bask
composer require laravel/ui:1.*
```

これで成功しました😉
Ubuntu 20.04LTS、wineでkindle for PCインストールにてC++ runtime error

#前提
Ubuntu 20.04LTS
wine version5

#トラブル
インストーラversion1-28、wineの設定Windows8.1でkindle for PCをインストールすると、
C++ runtime library errorとなる。

#解決した方法
過去のUbuntu、wineでもversion1-19以降のインストーラではうまく行かないらしい。
以下よりversion1-17のインストーラを入手しwineでインストールすると問題なく動作(今のところ)。

https://kindle-for-pc.jp.uptodown.com/windows/versions

参考まで。
メソッド定義の中におけるselfについて

selfがよくわからんので学んだことのメモを。
※本記事は更新中で変更の可能性があります
※2020/5/14時点


※※ここではメソッド定義の中におけるselfの話をさします
※※クラスメソッドのselfなどは無視します

selfはメソッドの中で使えるオブジェクト。
selfはそのメソッドをうけとっているインスタンス自身を指す。

例

```ruby
class User
attr_accessor :name
 # setter: name=(value)
 # getter: name

def initialize(name)
 @name=name
end    

def sayhi
 # self
 puts "hi.#{@name}"
end

end

user=User.new("bob")
user.sayhi　# userがselfにあたり、レシーバーと呼ぶこともある
```

上記でコメントにしているselfはUser.newによって生成されたオブジェクトbobを指す。

続いてselfを実際につかう場合、、


```ruby
class User
attr_accessor :name
 # setter: name=(value)
 # getter: name

def initialize(name)
 @name=name
end    

def sayhi
 # self
 puts "hi.#{@name}"
 # 追記箇所
 puts "hi.#{self.name}"
end

end

user=User.new("bob")
user.sayhi　# userがselfにあたり、レシーバーと呼ぶこともある
```

コンソールで吐き出すと

```ruby
ec2-user:~/environment/ruby_lessons $ ruby hello.rb 
hi.bob
hi.bob
```

と、なる。

selfが使えるのは
「getterが設定されてるからself.nameにすると、結果としてインスタンス変数が取得できて@nameがかえってくる」

ということらしい。

なのでためしにattr_accessorをコメントアウトしてみると

```ruby
class User
#  attr_accessor :name　コメントアウトに
 # setter: name=(value)
 # getter: name

def initialize(name)
 @name=name
end    

def sayhi
 # self
 # self.name -> @name(getterが設定されてるから)
 puts "hi.#{@name}"
 puts "hi.#{self.name}"
 # puts "hi.#{name}" # ややこしくならない場合は省略できる
end

end

user=User.new("bob")
user.sayhi
```

コンソールで吐き出すと

```ruby
ec2-user:~/environment/ruby_lessons $ ruby hello.rb 
hi.bob
Traceback (most recent call last):
        1: from hello.rb:118:in `<main>'
hello.rb:111:in `sayhi': undefined method `name' for #<User:0x000000000256fef8 @name="bob"> (NoMethodError)
ec2-user:~/environment/ruby_lessons $ 
```

と、なselfのほうがエラーとなる。


要するに、selfはattr_accessor(厳密にはgetter)とセットってことですかね。

同じ事例で分かりやすい説明を発見しました。

[こちらです](https://ja.stackoverflow.com/questions/40344/ruby%E3%81%AEself%E3%81%AF%E4%BD%95%E3%81%8C%E8%A8%80%E3%81%84%E3%81%9F%E3%81%84%E3%81%AE%E3%81%8B%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84)
macOS Catalinaで Pure Data を使ってみる

# Pure Data(Pd)について
PureData(Pd)は，音声，ビデオ，映像処理のためのリアルタイムなグラフィカルプログラミング環境だ．Pdはミラーパケット氏により開発され，多くの有志のエンジニアによってメンテナンスや拡張がなされている．

`Pure Data`には`Pd-extended`と`PureData vanilla`がある．

`Pd-extended`は`PureData vanilla`が土台となり，様々な有志の方が拡張機能を追加したもの…ですが，2012年よりアップデートされていないため，実用には向かない．

## インストール
現在の主流は`PureData vanilla`であり，拡張機能を追加することのできるモジュールも組み込まれている．従って，[Pure Data](http://puredata.info/downloads/pure-data)より該当するものを選択し，インストールする．

執筆時点においてのバージョンは 0.50-2 である．
使用するPCに適合しているものを選択する必要があるので以下を参照されたい．

[Pure Data Japan](https://puredatajapan.info/?page_id=32)様のサイトでは64bit版は不安定であり，後述するが，64bit版対応のプラグインが少ないので，32bit版をインストールすることを推奨されているが，今日では64bit版も安定して動作していた．また，プラグインも64bitにコンパイルされている．64bitOSを使用されている方はご参考までに…

![スクリーンショット 2020-05-14 13.13.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512948/af5e2d45-7b08-f969-f7a8-9276d8d175f2.png)

インストールは至って簡単であるので省略させて頂くが，不安な方は一般的なインストール方法を検索されたし．
Windowsの`ZIP`形式のものはポータブル版であり，インストールが不要であるのでこちらを使用されるのも良いかもしれない．

## 導入
インストールが完了し，起動するとPdのメインウィンドウが表示される．
このウィンドウにはエラー情報や，実行結果などが表示され，この画面を閉じることによってアプリケーションが終了する．

<img width="612" alt="スクリーンショット 2020-05-14 14.02.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512948/a3f769b4-633a-1b14-cece-89aca94a7561.png">

右上の`DSP`とは音声処理をするか否かのチェックボックスであり，チェックすることによって，音声処理が開始される．

イントロダクションには[こじ研(小嶋研究室) - Pure Data 入門](https://www.ei.tohoku.ac.jp/xkozima/lab/avmed-pd1.html)がとても分かりやすくおすすめです．

### output~ … couldn't create
音処理系統のプログラムを作成する際，大体のサイトでは`output~`オブジェクトを作成し，`DSP`をONにすることによって実行が可能であるように記述されているが，バージョン違いによるものであるのか，以下のように表示され，オブジェクト自体を作成することが出来ない．

<img width="612" alt="スクリーンショット 2020-05-14 14.16.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512948/88026be3-5e1f-8b92-63f5-c8b2900d3989.png">

`dac~`に変更することによって実行，音の出力が可能になる．

## External(プラグイン)の追加
Pdではプラグインのことを`External`を呼ばれており，追加することによって使用することの出来るオブジェクトを増やすことができる．

プラグインはPdメニューバーにある 「Help」 -> 「Find externals」より追加することができる．

<img width="782" alt="スクリーンショット 2020-05-14 14.33.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512948/1b63abce-92ea-c8e4-5148-d2481f1afecb.png">

検索バーのところに追加したいプラグイン名を入力して検索することによって既定のディレクトリにプラグインファイルがダウンロードされる．
<img width="515" alt="スクリーンショット 2020-05-14 14.35.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512948/77f1596c-8d1e-8467-145f-faa1e85e26b7.png">

既定ではDocuments内に設定されているが，特に変更する必要はない．

ダウンロードされたディレクトリを確認し，Pdメニューバーにある
「Pd」 -> 「Preferences▶」 -> 「Path…」を選択し，パスの使いを行う．

<img width="562" alt="スクリーンショット 2020-05-14 14.41.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512948/9bbbf8f7-54c4-9a75-83e2-66df5e8394dd.png">

追加後，念のためにPdを再起動しておこう．
gemのancestoryを使用した多階層構造の実装

#はじめに
今回はフリマアプリでよく見かける、カテゴリの多階層構造についての実装手順を紹介していきます。

#完成図
こんな感じのやつ。
<a href="https://gyazo.com/f68aa0c5589b625bdb030426d064bd85"><img src="https://i.gyazo.com/f68aa0c5589b625bdb030426d064bd85.png" alt="Image from Gyazo" width="621"/></a>

#やりたいこと
カテゴリを親、子、孫の三階層に分けて登録、表示する。

#1.モデルの準備
今回実装したいこととして第一に商品とカテゴリを紐付けたいので、categoryとitemのモデルを作成します。

```ruby
$ rails g model category 
$ rails g model item 
```


#2.ancestoryの導入
Gemfileにancestoryを導入します。

```ruby
gem 'ancestry'
```
ターミナルで下記コマンドを実行しよう。

```ruby
$ bundle install
$ rails g migration add_ancestry_to_category ancestry:string:index
$ rails db:migrate
```
ancestoryを使うことで多対多の関係が１対多の関係になりDB設計がシンプルになります。
category.rbにhas_ancestoryを入れてあげましょう。

```category.rb
class Category < ApplicationRecord
　has_many :items
　has_ancestry
end
```
```item.rb
class Item < ApplicationRecord
　belongs_to :category
end
```

#3.データの導入
seeds.rbにカテゴリのレコードを導入していきます。

```seeds.rb
lady = Category.create(name: "レディース")
lady_1 = lady.children.create(name: "トップス")
lady_1.children.create([{name: "Tシャツ/カットソー(半袖/袖なし)"},{name: "Tシャツ/カットソー(七分/長袖)"},{name: "シャツ/ブラウス(半袖/袖なし)"},{name: "シャツ/ブラウス(七分/長袖)"},{name: "ポロシャツ"},{name: "キャミソール"},{name: "タンクトップ"},{name: "ホルターネック"},{name: "ニット/セーター"},{name: "チュニック"},{name: "カーディガン/ボレロ"},{name: "アンサンブル"},{name: "ベスト/ジレ"},{name: "パーカー"},{name: "トレーナー/スウェット"},{name: "ベアトップ/チューブトップ"},{name: "ジャージ"},{name: "その他"}])
```
ancestryを入れるとchildrenと記述することで直前の変数の子要素として扱うことができます。
細かく説明するとまず、以下の記述で親カテゴリであるレディースが登録されます。

```seeds.rb
lady = Category.create(name: "レディース")
```
次に、以下の記述で子カテゴリであるトップスが登録されます。

```seeds.rb
lady_1 = lady.children.create(name: "トップス")
```
そして、以下の記述で子カテゴリの孫カテゴリ群が登録されます。

```seeds.rb
lady_1.children.create([{name: "Tシャツ/カットソー(半袖/袖なし)"},{name: "Tシャツ/カットソー(七分/長袖)"},{name: "シャツ/ブラウス(半袖/袖なし)"},{name: "シャツ/ブラウス(七分/長袖)"},{name: "ポロシャツ"},{name: "キャミソール"},{name: "タンクトップ"},{name: "ホルターネック"},{name: "ニット/セーター"},{name: "チュニック"},{name: "カーディガン/ボレロ"},{name: "アンサンブル"},{name: "ベスト/ジレ"},{name: "パーカー"},{name: "トレーナー/スウェット"},{name: "ベアトップ/チューブトップ"},{name: "ジャージ"},{name: "その他"}])
```

seeds.rb内にレコードを記述し終わったら、ターミナルで以下のコマンドを実行し、DBに反映させましょう。

```
$ rails db:seed
```

DBではこのように登録されます。

<a href="https://gyazo.com/697c5fba1021ad853da47c02c21042ad"><img src="https://i.gyazo.com/697c5fba1021ad853da47c02c21042ad.png" alt="Image from Gyazo" width="592"/></a>


#まとめ
ancestoryを使用すればアソシエーションの関係性もシンプルになるのでかなりオススメです！！！

###参考記事
https://github.com/stefankroes/ancestry
Rails6環境構築時に発生した"webpacker"と"yarn"の未導入が原因のエラーとその解決方法


##はじめに　
rails tutorial(第6.0版)を参考にrails6の環境を構築したところ、rails server立上げの際にエラーが発生しました。
####原因は"webpacker"と"yarn"の未導入でした。
今後のために、エラー内容と"webpacker"と"yarn"の導入方法を備忘録として残します。

##参考記事
[Rails6 開発時につまづきそうな webpacker, yarn 関係のエラーと解決方法](https://qiita.com/NaokiIshimura/items/8203f74f8dfd5f6b87a0)
[Rails6 Webpackerでエラーが出た](https://qiita.com/libertyu/items/1eb74adc817ab8971100)
[Ubuntu18.04LTSにlinuxbrew(linux版homebrew)を入れる](https://qiita.com/yoshinyan/items/b92dd303626360b43328)

##開発環境
Cloud9 (ubuntu server)
Ruby 2.6.3
rails 6.0.0

##エラー発生までの経緯
rails tutorial(第6.0版)第１章を参考にrails6の開発環境を構築開始。
1.3.1までチュートリアル通り実施し、rails severコマンドを入力すると、

```
{略}
rescue in load': Webpacker configuration file not found /home/ubuntu/environment/hello_app/config/webpacker.yml. Please run rails webpacker:install \
Error: No such file or directory @ rb_sysopen - /home/ubuntu/environment/hello_app/config/webpacker.yml (RuntimeError)
```
上記エラーが表示されました。

##エラーの内容
/hello_app/config/ 内に"webpacker.yml"が存在しないから、webpackerをインストールしなさい。・・・と理解しました。

##webpackerとyarnのインストール
###webpacker導入コマンド

```
$ rails webpacker:install 
```

```
Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/
```

yarnがないと返事が来た場合。
###yarn導入コマンド

```
$ brew install yarn
```

```
Command 'brew' not found, but can be installed with:
```
上記の返事が来た場合。

```
$ sudo apt install linuxbrew-wrapper
```
####yarnとwebpackerを再度導入する。
JSON データを AWS Lambda Tool の Debug時に使用する形式に変換する

# 

変換するアプリを Angular9 を使って作成してみました
https://sasaco.github.io/JsonToAwsLambdaToolsDebug/

ソースコードは
https://github.com/sasaco/JsonToAwsLambdaToolsDebug

## アプリ作成手順

```bash

PS > ng new json-to-lambda-debug

? Would you like to add Angular routing? No
? Which stylesheet format would you like to use? SCSS   [ https://sass-lang.com/documentation/syntax#scss                ]
CREATE json-to-lambda-debug/angular.json (3766 bytes)
CREATE json-to-lambda-debug/package.json (1296 bytes)

…

CREATE json-to-lambda-debug/e2e/src/app.po.ts (301 bytes)

√ Packages installed successfully.
```

こうなった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/76f76ecf-1ae0-7b56-b9f4-bbadf3a599da.png)

### Angular アプリを起動してみる

```bash
> npm run start

> json-to-lambda-debug@0.0.0 start C:\Users\sasaco\Documents\My Web Sites\JsonToLambdaDebug
> ng serve

...

chunk {vendor} vendor.js, vendor.js.map (vendor) 2.71 MB [initial] [rendered]
Date: 2020-04-19T02:31:35.623Z - Hash: f1cca4d28e1cf91b561a - Time: 8052ms
** Angular Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ **
: Compiled successfully.

```


`http://localhost:4200/` にアクセスする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/b818ac96-5e7f-8928-47f2-24e0ca6c8117.png)


## アプリの最終形

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/72d96140-1939-e883-4c27-004e8d14be97.png)

ソースコードは
https://github.com/sasaco/JsonToAwsLambdaToolsDebug
1分でDenoを触る

Deno v1.0が出たので、とりあえず触りたいという方向けに。

# 起動
[Docker化してくれてる方](https://hub.docker.com/r/hayd/deno)がいるのでさらっと起動します。

```bash
docker run -it --entrypoint "bash" hayd/ubuntu-deno
```

# サンプルを動かす
公式のサンプルを動かします。

```bash
deno run https://deno.land/std/examples/welcome.ts
```

```bash:アウトプット
Download https://deno.land/std/examples/welcome.ts
Warning Implicitly using master branch https://deno.land/std/examples/welcome.ts
Compile https://deno.land/std/examples/welcome.ts
Welcome to Deno 🦕
```

さらっとTypeScriptが走り恐竜くんが現れましたね。
あとは色々触ってみましょう。

# 参考

- [Denoの登場でNode.jsの時代は終わるのか？](https://qiita.com/so99ynoodles/items/c3ba2a528052827e3b3c)


# 環境

```bash
% sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.4
BuildVersion:	19E287

% docker --version
Docker version 19.03.8, build afacb8b
```
【jQuery】【rails】使えない!?　動かない

# 解消したいこと
jQueryが上手く動かない
しかしリロードをすれば、動くようになる
なぜ？？

#原因
結論、Turbolinksが邪魔している
デフォルトgemであるturbolinks（ajaxとajaxとhistoryAPIを使ってページ遷移しやすくするもの）が動作しているため、そもそも$(document).ready()が動かない
つまりページが変わっているように見えて、上記のことが起きておりjqueryは起動しない。

# Turbolinksとは
ページ上のリンクをクリックした時に、ページ全体をリロードさせるのではなく、bodyタグの中身とheadの中のtitleを同一ページ上で書き換える方法。
.jsとか.cssとか処理し直さないので、ページの読み込みがかなり早くなる。

# 使い方

gemfileに以下を記述

```
gem 'jquery-turbolinks'
```

bundel install　と　サーバ再起動を行う

# 解消例

該当のjqueryをこの記述に入れることで解消された。

```.js
$(document).on('turbolinks:load',(function(){　}))
```


# 参考文献
https://workabroad.jp/posts/1133
https://qiita.com/hiroyayamamo/items/b258acbaa089d9482c8a
Google Meetでにヘッドセットから入力しようと思ったらマイクがブロックされてた

# より良いコミュニケーションを実現するヘッドセット
皆さん、自粛期間ということでオンラインミーティングの機会が増えているかと思います。オンラインミーティングに生活音が混じって聞きづらい、不快だと感じることはありませんか？
環境音や打鍵音、結構気になります。 機会の多い方は**ヘッドセット** 買いましょう。

# ヘッドセット買った！ミーティングするぞ！
どうやら今日のミーティングはGoogle Meetを使うらしい。前回zoomを使ってオンラインミーティングした際にヘッドセットで参加できたし今日もいけるやろ！

# ん？「マイクがブロックされています。」
マイクをブロックした覚えはないです。初めてマイク接続したけど。

### 私の環境
- Windows10 Home搭載デスクトップ(自作)
- 内蔵マイクはなし(初めてのマイク接続)
- ブラウザ:Google Chrome

# 解決策
個別にサイトでマイクを許可したらいけた。
ちなみに「プライバシーとセキュリティ」の画面から全体のマイク許可できるよ！みたいなのがググったらいっぱいでてきたけどできなかった。なんで。

Chromeで現在開いているwebサイトのURLの左横に鍵のアイコンあるじゃないですか？これクリックしたら下のタブが開かれます！個別に許可してあげましょう。
![Meet - fgy-hfkd-rts - Google Chrome 2020_05_14 13_55_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/eb1a8487-c163-53ab-acb9-89571a51cd69.png)

# まとめ
動いたからヨシ！