OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyにおける3つのライブラリの使い方

#### Rubyライブラリとは、汎用性の高いプログラムを再利用可能な形でまとめたものである。以下Rubyにおける3つのライブラリの使い方を解説します。
## 1 標準ライブラリ
##### 標準ライブリラリはRubyをインストールする際にRuby本体としてインストールされています。読み込みは以下の方法です。
```ruby:rubyファイル
require ライブラリ名 (date・csv・rake・json・yamlなど)
```
下記のサイトが参考になります。
https://techacademy.jp/magazine/47887#1

## 2 組み込みライブラリ
##### 組み込みライブラリは Ruby 本体に組み込まれているライブラリです。 このライブラリに含まれるクラスやモジュールは、 require を書かなくても使うことができます。
```ruby:rubyファイル
使用する際の読み込みは必要ありません
```
組み込みライブラリの例としては、String・Integer・Array・Hashなどがあります。

組み込みライブラリは下記サイトを閲覧すれば一覧で確認できます。
https://docs.ruby-lang.org/ja/latest/library/_builtin.html
## 3 外部ライブラリ
##### 代表的な外部ライブラリとしては「gem」があります。gemは、世界中の有志のエンジニアによって提供されるライブラリです。多くのライブラリは、RubyGemsに対応しています。標準ライブラリを超える、多種多様なモジュールがあります。

* 外部ライブラリには2つの工程があります。  
 * 使いたいgemをインストール (gem install gemの名前)
 * インストールしたgemをrequireで読み込む

以下で例を記述します
##### 1 ターミナルでgem install ライブラリ名

##### 2 インストールしたgemをrequireで読み込む

```ruby:rubyファイル
require ライブラリ名 (bundler・rails・rspec・sinatra・nokogiri・fakerなど)
```
※外部ライブラリはrequireで読み込む前に、gemをインストールすることに注意が必要です。

今回は、Rubyにおける3つのライブラリの使い方について解説しました。ライブラリを使う際の参考にしていただければ幸いです。
mysql:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) を解決した時の方法

mysqlがある時から急に使えなくなり、復旧するのに2週間近くかかったので、その突起の解決方法を
記述する。

##最初のエラー → sockファイルが必要だった。
```
$ mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

下記記事の通りmysql.sockファイルがないというエラーらしい。
私は記事のコマンドをそのまま実行した。
https://qiita.com/carotene4035/items/e00076fe3990b9178cc0

具体的には`touch`コマンドでmysql.sockファイルを作成し、権限も与えたが上手くいかなかった。
（後で見返したらmysqlとは関係ないディレクトリ上にmysql.sockファイルを作っていた。）

その後、記事の通り、`$ sudo mysql.server restart`を実行すると異なるエラーが出てきた。
##次のエラー → pidファイルが必要だった。

```
$ sudo mysql.server restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/MacBook-Pro.local.pid).
```
どうやら
>1.そもそもpidファイルが存在していない。
2.pidファイルに適切な権限が設定されていない

ことが原因らしい

次は下記記事を参考に`touch`コマンドでpidファイルを作成した。
https://qiita.com/jonakp/items/477a18d4a94c01a31583

```
$  touch /usr/local/var/mysql/ローカル名.pid

補足：ローカル名の調べかた↓
$ uname -nローカル名
```
これまたよく見ると、作成場所を間違えていた。
そのため、実行結果は同じであった。

```
$ sudo mysql.server restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/MacBook-Pro.local.pid).
```

## mysqlの関係ファイルの全削除
その当時もういっそのこと削除しても支障がないDBしかなかったので、一度mysqlの関係ファイルを削除して再インストールするのが一番早いのではないかと思った。

そう思って下記記事を参考にした。
https://qiita.com/ryo_saito_k/items/7d8f5370899df125d459
今度は**しっかりと**mysqlのディレクトリに移動した。

```
cd /usr/local/var/mysql
```

そうして記事の通り関係ファイルを一つずつ消していった。

```
$ sudo rm -rf /usr/local/mysql
$ sudo rm -rf /Library/StartupItems/MYSQL
$ sudo rm -rf /Library/PreferencePanes/MySQL.prefPane
$ sudo rm -rf /Library/Receipts/mysql-.pkg
$ sudo rm -rf /usr/local/Cellar/mysql*
$ sudo rm -rf /usr/local/bin/mysql*
$ sudo rm -rf /usr/local/var/mysql*
$ sudo rm -rf /usr/local/etc/my.cnf
$ sudo rm -rf /usr/local/share/mysql*
$ sudo rm -rf /usr/local/opt/mysql*
```
この時点で`brew ls`を実行してもインストールしたbrewからmysqlが消えていた。

##mysqlの再インストール & sockファイルの再作成
その後、mysqlの再インストールを実行した。

```
 $ brew install mysql@5.7
```

そして、これで上手くいくはずだと思い、mysqlを実行した。だが、、、

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

ここで、ようやく私は**別のディレクトリに関係のないファイルを作っていたのか！！！**
ということに気がついた！！

今度こそ、mysqlのディレクトリに移動して`touch`コマンドでsockファイルを作成した。

```
$ cd /usr/local/var/mysql/

$ sudo touch ローカル名.pid
```
##mysqlの復活！！
そのおかげで、無事に再びmysqlを利用できるようになった。

```
 mysql.server start
Starting MySQL
. SUCCESS! 
```
mysqlは初期設定のままなので下記コマンドで実行できた。

```
mysql -u root
```

皆さんにはディレクトリの違いい気をつけてエラーを解決してほしい！
【VS・.NET】「Your project does not reference ～ framework.」と言われたときの対処法

> Your project does not reference ".NETFramework,Version=v4.8" framework. Add a reference to ".NETFramework,Version=v4.8" in the "TargetFrameworks".

こちらがエラーの本文。
.NET Framework 4.8のプロジェクトを.NET 5に移行して1回ビルドした後、.NET Framework 4.8に戻したときに発生しました。
プロジェクトをリロードしても消えない厄介者です。

## 解決方法
objフォルダに残っているproject.assets.jsonが悪さをしているようです。
objフォルダを消してやったところ解決しました。

[こちら](https://stackoverflow.com/questions/52833741/your-project-does-not-reference-netframework-version-v4-6-2-framework-add-a)が大変参考になりました。
Chromiumでハードウェアアクセラレーション(Manjaro)

#はじめに
Youtubeなど動画再生をハードウェアデコードし確認する方法を書きます。
以前は、ブラウザを自分でビルドするなど、少しハードルが高かったのですが、
Chromium86からArchの標準リポジトリがVAAPIパッチ対応になって
手軽に試せるようになりました。
#インストール
```言語:ターミナル
sudo pacman -S chromium
```
#フラグ設定
フラグを有効にする

```言語:ターミナル
tee ~/.config/chromium-flags.conf <<EOF >/dev/null
--enable-accelerated-video-decode
EOF
```
##確認
```言語:Chromiumの検索窓で
chrome://gpu
```
![Screenshot_20210131_064228.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97825/eae4ccf1-a0df-c8df-171b-97bbc06ac07a.jpeg)
#デコーダーの確認
```言語:Chromiumの検索窓で
chrome://media-internals
```
![Screenshot_20210131_214506.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97825/35ca08f5-6c47-9526-3ac5-451ff479373f.jpeg)

###デコーダー名の種類
|kVideoDecoderName|ソフト or ハード|
|:-----------|:-----------|
|MojoVideoDecoder|ハードウェアデコード|
|GpuVideoDecoder|ハードウェアデコード|
|VpxVideoDecoder|ソフトデコード|
|FFmpegVideoDecoder|ソフトデコード|
|DecryptingVideoDecoder|? DRM動画(ネトフリやアマプラなど)|

#動作環境
Manjaro KDE Edition 20.2.1
Chromium バージョン: 88.0.4324.96（Official Build）Arch Linux （64 ビット）
AMD Ryzen 5 3400G with Radeon Vega Graphics

#参考
[https://aur.archlinux.org/packages/chromium-vaapi/]()
vaapiパッチの元になったAURのリポジトリです。
コメント欄に様々なヒントが書かれています。
Let's encryptでSSL証明書の取得(ubuntu20.04+nginx+certbot)

同様の記事があるのは自明なので、完全なる備忘録。

環境は以下。

```shell
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

$ nginx -v
nginx version: nginx/1.18.0 (Ubuntu)
```

ざっくり確認できるように、解説はだいぶ略します。

# Install
```shell
sudo apt install certbot python3-certbot-nginx
```

# Firewall

ファイアウォールの開き忘れに注意。

```shell
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

sudo ufw status
```

以下のように出力されればOK。

```shell
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)
```

# Get

初回はたしかメアドとか聞かれたはず。

```shell
sudo certbot --nginx -d example.com
sudo certbot --nginx -d example2.com -d xxx.example2.com -d yyy.example2.com  # 複数まとめて指定したい場合．こうすると証明書もひとつになる
```


# Config
nginxのConfig。私は `/etc/nginx/conf.d` にあった。

適当にいじりつつ、落ち着いたところ。`managed by Certbot` がついてるやつはCertbotが勝手に書いてくれたやつを流用してます。
httpにアクセスされたらhttpsにリダイレクトするおまけつきです。

私はGoでアプリケーションサーバを立てて、リバースプロキシとして動かしてるので、locationはそういう仕様です。

```config:default.conf
server {
    listen 80;
    server_name  example.com;
    return 301 https://$host$request_uri;
}
server{
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location / {
        proxy_pass http://127.0.0.1:xxxx;
    }
}
```
プログラム世界における"時間"について


時間とは何か。本記事において，深遠な哲学的議論を行うわけでもなく，高度な物理的考察を行うわけでもない。ここでの目的は，いわゆる"代入"操作を認めることによって生じるプログラム世界の時間性について，自分なりの理解を提示することにある。
プログラム言語において代入を認めるか否かは，手続き型言語と関数型言語のいわば相違の軸とみなされるものである。日常的に関数型言語を用いられておられない方にとっても，プログラムの”副作用”をもたらす”代入”操作を基本的には認めない方向性をもつ言語であるということは聞かれたことがあるのでないか。しかしながら同時に，ただの数字の入れ替えのような”代入”操作が，仰々しくも”副作用”をもたらすとはどういうことだと思われたのではないかーーー少なくとも私はそうであった。
結論から述べよう。代入を認めると，プログラムの世界に時間の概念が発生するのである。そしてその結果として，ある面での利便性と，同時に望まぬ挙動ーーすなわち”副作用”ーーとを生み出すのである。ここに一個のボールがある。それを手に取り，肩に力をいれ放り投げると，放物線を描き飛んで行く。あるいは一個の卵がある。室温で数か月，冷蔵庫の外に放置しておけば次第に腐乱し異臭を放つにいたるだろう。私たちはそこに少なからず時間の経過を実感するはずだ。ここにあるのは，何かしらの対象（オブジェクト,object）の変化である。あるいはボールの持つ速度，加速度，あるいは卵の化学的性質。その変化を通して私たちが時間の経過を実感するのである。時間は，物事の変化の要因であり，変化によって生じる概念であるとも言えるだろう。
線形代数学の射程

## 線形代数学
理系の大学生ならば大学に入って最初の一，二年を掛けて，一般教養科目として数学の広義で学ぶ機会も多いだろう「線形代数学」。工学系の人ならば多くの場合，実用的な行列の扱い方と意味不明な線形空間なる概念を学ぶ科目というイメージが強いと思う。
### 大学数学
大学で学ぶ数学（特に代数学）では，高校までに体験的に学んできた対象の持つ性質を切り出し，抽象化した概念を学ぶことが多い。線形代数学だと解析的には「比例」，幾何的には「真っすぐさ」の抽象化であると感じている。性質を特徴づける関係性を取りだし公理化することを概ね方針としている場合が多く，線形代数もその公理系を持って「線形的」なるものの持つ内容を表現しているのだと言えるだろう。
### 応用先

#### 微分
例えば微分は関数の線形化である。局所的に直線に近似することによって，その周辺における扱いを線形化することが可能になる。それは情報の適切な取捨選択なのだ。テイラー展開も一次まで見れば線形近似である。振り子の問題で，振れ幅が大きく倍場合にはsin xをxに近似して十分に振り子の運動を理解できるように，多くの場合局所的に線形近似することが有効であるのだ。更に，ある種の関数の集合は計量可能な線形空間（さらに強い主張としてそのノルムに対して完備である）になっており，多くの解析的な操作を線形空間上の操作と見做せるのだ。典型的な例としては，フーリエ変換は，そのヒルベルト空間の基底に対する線形結合による表示であると言える。

#### 幾何
幾何的な理解も線形空間を持って深めることができる。接ベクトル空間は，対象の多様体の座標に依らず定義される「接平面」の抽象化であり，曲がった空間であってもその周辺では線形的な空間として把握される。結果として，私たちの慣れ親しんだ微分の概念なども容易に展開できたりするのである。

#### 代数
環の具体例としても把握できる。その持つ代数的な構造は更なる抽象への土台でもあるのだ。
以上のように，線形代数はあらゆる分野に顔をのぞかせる，偉大な基礎と言って過言ではないのだ。
【Amazon API Gateway】 リソース作成時に "Resource's path part only allow a-zA-Z0-9...." って怒られた



##エラー内容
Amazon API Gatewayで
以下の図のようなリソースを作成しようと、
[![Image from Gyazo](https://i.gyazo.com/fda8e48fcfd5c854f8d021957126c041.png)](https://gyazo.com/fda8e48fcfd5c854f8d021957126c041)
こう入力したら、
[![Image from Gyazo](https://i.gyazo.com/89fdf8a9dd4af45945f20d20fe3dc916.png)](https://gyazo.com/89fdf8a9dd4af45945f20d20fe3dc916)
こんなエラーが出て怒られた。
>Resource's path part only allow a-zA-Z0-9._- and curly braces at the beginning and the end.

<BR>
##解決方法
以下のようにやったら、うまくいった。

まずitemsだけ作成
アクション＞リソースの作成
[![Image from Gyazo](https://i.gyazo.com/42b7366d3f1c2949d3de5f433f9c517d.png)](https://gyazo.com/42b7366d3f1c2949d3de5f433f9c517d)
以下スクショのとおり入力
[![Image from Gyazo](https://i.gyazo.com/2c9d111f69162b7337dd1c23d508df0b.png)](https://gyazo.com/2c9d111f69162b7337dd1c23d508df0b)
itemsができた
[![Image from Gyazo](https://i.gyazo.com/b0536bc429e35509894d04489b68628c.png)](https://gyazo.com/b0536bc429e35509894d04489b68628c)


つぎに、このままの状態でもう1回、アクション＞リソースの作成
[![Image from Gyazo](https://i.gyazo.com/91971b34d583674f6699d893b5919a21.png)](https://gyazo.com/91971b34d583674f6699d893b5919a21)

以下入力
[![Image from Gyazo](https://i.gyazo.com/b0e326302ccf9a4948f10699c8d41036.png)](https://gyazo.com/b0e326302ccf9a4948f10699c8d41036)

{iid}が追加された
[![Image from Gyazo](https://i.gyazo.com/d2e1ac3482f886d661e7a0ec8ca64225.png)](https://gyazo.com/d2e1ac3482f886d661e7a0ec8ca64225)

この状態で、メソッドの追加
[![Image from Gyazo](https://i.gyazo.com/48c4c456946b81db929ce440b2596ce3.png)](https://gyazo.com/48c4c456946b81db929ce440b2596ce3)

今回のケースではGETを選ぶ
[![Image from Gyazo](https://i.gyazo.com/1ab7de23f11f71f798c49e6ee1f573ee.png)](https://gyazo.com/1ab7de23f11f71f798c49e6ee1f573ee)

あとはセットアップ
[![Image from Gyazo](https://i.gyazo.com/e2f42c6959af6f9ea3a05094867f77d3.png)](https://gyazo.com/e2f42c6959af6f9ea3a05094867f77d3)


以上です。
$ rails s が実行できなくなる現象及び解決方法

今回は、railsを使っている際に
ターミナルで「$ rails s」ができなくなり困ったため解消法を書きます。

#Ruby on Railsで編集中に

スクールの事前学習で、Ruby on Railにて学習に、
いつも通り変更後、ターミナルでサーバーを立ち上げようとした時です。

```terminal:error
$ rails s 
```
でエンターを押すと、立ち上げに成功するのですが、今回は下記のようなエラーが出てきました。

```terminal:error
 Address already in use - bind(2) for "127.0.0.1" port 8080 (Errno::EADDRINUSE)
```
、、、、あれれ？？？おかしいぞ！！！と(笑)解決方法はどうすればいい？？？
（おそらく駆け出しエンジニアさんも同じエラーで困ってるはず、、、）

と思い調べました！！

#解消法の手順
| No | 手順 | 詳細 |
|:-:|:-:|:-:|
|  1 | ＄ sudo lsof -i:<font color=red>〇〇〇〇</font>  | エラーで表示された番号を〇に入れる。  |
|  2 | LISTEN部分を確認  | （LISTEN）と書いてある行のPAID数字を確認する。  |
|  3 | $ kill 〇〇〇〇  |  3で確認した数字を〇にいれて止める。（KILLコマンド） |
|  4 | 完了  | 解消済み。rails sを再度やってみましょう。  |


#①＄ sudo lsof -i:〇〇〇〇
上記の様なエラーが出たら、下記のコードを打ちます。
エラーの文に「port 〇〇〇〇」とあるのでその数字を入力しエンター。（8080の部分です。）

```terminal:improve
   $ sudo lsof -i:8080 ⇦この部分です。
```
<br>
#②LISTEN部分（PIDの番号）の確認
①でエンターを実行すると、下記のような画面が表示されます。

```terminal:improve
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ruby    7930 ec2-user   14u  IPv4  34779      0t0  TCP localhost:webcache (LISTEN)
ruby    7930 ec2-user   15u  IPv6  34780      0t0  TCP localhost6:webcache (LISTEN)
```

**ここで注目する箇所としては、
「COMMAND」と「PID」の箇所です。**

これを見ると、Rubyで起動した状態になっていました。
なぜこうなったかはよくわからないのですが、、、、

<br>


#③＄ kill 〇〇〇〇（killコマンドの実行）
それに対して起動を止めるために、PAIDの番号をKILLコマンドで止めます。

```terminal:improve
   $ kill 7930
```

#④再度rails sを実行で元通り。
再度、サーバーを立ち上げたところ元通りに起動することができました。
もし同じ状況になった方がいたらぜひ試してください。

#参考文献
[侍えんじにあ 成長日記](https://biginerforgood.hatenablog.com/entry/2018/06/24/181644)

以上、たにーでした。
AWS Lambdaのタイムゾーンを日本時刻に変更する方法


## はじめに
この記事は、社会人２年目 AWS、python初心者が勉強したことをまとめたものです。
間違っている点、改善点等ございましたご指摘いただけると大変ありがたいです。

## この記事について
AWS LambdaはデフォルトでUTCが使用されます。
日本時刻であるJSTを使用するための方法について自身の備忘録を兼ねて記載します。

## 結論

pytzモジュールを使用するとJST時刻が使用できます。

```python:lambda_function.py
from datetime import datetime
import pytz

# 使用するタイムゾーンを設定
TIME_ZONE = 'Asia/Tokyo'


def lambda_handler(event, context):
    now_utc = datetime.now()
    now_jst = datetime.now(pytz.timezone(TIME_ZONE))

    # utc時刻が出力
    print(f'utc: {now_utc}')

    # jst時刻が出力
    print(f'jst: {now_jst}')

```

### 実行結果確認
確かに日本時刻JSTとなっていることを確認されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1066929/f6c4412e-6514-377d-f434-a964f2e47b29.png)

日本時刻の設定が漏れていると思わぬトラブルが生じうるので皆様忘れずに設定してくださいね！！
【PHP】composerと名前空間、オートロード

PHPにおいて、`名前空間`と`オートロード`の仕組みは開発効率に大きく影響するということで、実際にこれらを使って簡単にコードを書いてみようと思います。

#コードを書いていく
`composer`を使うには、`composer.json`という設定ファイルをあらかじめ準備しておく必要があります。
今回はターミナルから作成しようと思うので、`composer_practice`というフォルダを用意して、その中で以下のコマンドを実行します。

```:ターミナル
composer init
```
コマンド実行後にエディタに移動すると、フォルダの中に`composer.json`というファイルが生成されています。

```php:composer.json
{
    "name": " ~ /composer_practice",
    "authors": [
        {
            "name": " ~ ",
            "email": " ~ "
        }
    ],
    "require": {}
}

```
このファイルを、オートロードができるように書き換えます。

```php:composer.json
{
    "autoload": {
        "psr-4": {
            "App\\" : "app/" //appが実際のフォルダ、Appがnamespace
        }
    }
}
```
`app`としたので、`composer_practice`フォルダ内に`app`というフォルダを作成すれば、そのフォルダからがオートロードの対象になり、名前空間としては`App`からスタートします。
ファイルを作成したら、ターミナルで以下のコマンドを実行してcomposerをインストールします

```:ターミナル
composer install
```
実行後、`composer_practice`フォルダ内に`vendor`フォルダが新しく生成されていて、その中にオートロードファイルがあります。`composer.json`で設定した内容に従って、`vendor`フォルダの中がインストールされるという訳ですね。

次に、`app`フォルダ内に`Models`フォルダと`Controllers`フォルダを作成して、`Models`フォルダ内には`TestModel.php`ファイルを、`Controllers`フォルダ内には`TestController.php`ファイルを作成します。
そして、それらのファイルを呼び出すための`call.php`ファイルも準備します。

```:ディレクトリ構成図
composer_practice
      ├ composer.json
      ├ composer.lock
      ├ vendor
      ├ call.php
      └ app
         ├ Controllers
         │    └ TestController.php
         └ Models
              └ TestModel.php
```
まず`TestModel.php`にコードを書いていきます。

```php:TestModel.php
<?php

namespace App\Models;

class TestModel {

  private $message = 'hello world';

  public function getHello() {
    return $this->message;
  }
}
```
名前空間はフォルダと同じような構成になります。
それから、クラスの名前をファイル名と同じにする必要があります。なので`1ファイルに対して1クラス`という関係になります。

次に`TestController.php`です。

```php:TestController.php
<?php

namespace App\Controllers;

use App\Models\TestModel;

class TestController {
  public function run() {
    $model = new TestModel;
    echo $model->getHello();
  }
}
```
`use`キーワードを使い、`use App\Models\TestModel;`と記述することで、クラスをインポートしています。

最後に`call.php`です。

```php:call.php
<?php

require_once __DIR__ . '/vendor/autoload.php';

use App\Controllers\TestController;

$app = new TestController;
$app->run();
```
`__DIR__`と記述すると、この定数が呼び出されたファイルがあるディレクトリのフルパスを返してくれます。
実行結果は以下です。しっかり表示されました。

```
hello world
```

#参考
* [PHP開発でComposerを使わないなんてありえない！基礎編 - Qiita](https://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94#composer)
* [【PHP超入門】名前空間（namespace・use）について - Qiita](https://qiita.com/7968/items/1e5c61128fa495358c1f#use-%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
Tensorboard: ValueError: Duplicate plugins for name projectorの原因と解決法

#tensorboard実行時に以下のエラーが発生
```:実行文とエラー文
>>tensorboard --logdir={log_path}

Tensorboard: ValueError: Duplicate plugins for name projector
```

#原因と解決策
エラー文の通り、環境内に複数のTensorboardが存在することが原因のエラー
解決策は以下の通り

1.pip上でtensorboard関連のものを削除する

```:関連ライブラリの削除
pip3 list --format=freeze | grep -e tensorboard -e tb-nightly | xargs pip3 uninstall -y
```

2.python環境の各インポート先site-packagesに、残骸のdir等が残っていないか確認、あれば削除

```:インポート先パスの確認
python3 -m site
```
それぞれのdirに以下が存在している場合削除する。

```
tensorboard
tensorboard-plugin-wit
tensorboardX
tb-nightly
```

3.以下コマンドで再度tensorboard関連をインストールすると解決。

```
pip3 install -q tensorflow
```
Postgresがカラム名を小文字で見に行く

下記のSELECT文を作ったら、メインのSELECT文の方で「"rowNo"というカラムが見つからねぇ」と言われた。（WITHの中は正常終了）
ASで「rowNo」と名前を付けても意地でも「rowno」をを探しに行く模様。
しょうがないので一旦スネークケースにした。

参考:https://blog.goo.ne.jp/toritori0318/e/3aa9009ac512dbb5becff0bc2098cd1c

--- 誤 ---
WITH 商品_G AS
(
  SELECT
    ROW_NUMBER() OVER(ORDER BY 商品.unit_cd ASC NULLS LAST) AS "rowNo",
    SUM(商品.num) AS "sumNum",
    商品.unit_cd AS "unitCd"
  FROM
    shouhin AS 商品
  WHERE
     商品.no = 'xxx'
  GROUP BY
    商品.unit_cd
  ORDER BY
    商品.unit_cd ASC NULLS LAST
  LIMIT ALL OFFSET 0
)
SELECT
    商品_G.rowNo
    商品_G.sumNum
    商品_G.unitCd
    名称情報.name
FROM 商品_G
LEFT JOIN 名称マスタ 名称情報 ON
(
     AND UNM.name_cd = 商品_G.unitCd
)

--- 正 ---
WITH 商品_G AS
(
  SELECT
    ROW_NUMBER() OVER(ORDER BY 商品.unit_cd ASC NULLS LAST) AS "row_no",
    SUM(商品.num) AS "sum_num",
    商品.unit_cd
  FROM
    shouhin AS 商品
  WHERE
     商品.no = 'xxx'
  GROUP BY
    商品.unit_cd
  ORDER BY
    商品.unit_cd ASC NULLS LAST
  LIMIT ALL OFFSET 0
)
SELECT
    商品_G.row_no AS "rowNo",
    商品_G.sum_num AS "sumNum",
    商品_G.unit_cd AS "unitCd",
    名称情報.name AS "unitName"
FROM 商品_G
LEFT JOIN 名称マスタ 名称情報 ON
(
     AND UNM.name_cd = 商品_G.unit_cd
)
Meraki MR クイック スタート

MR クイック スタート
https://documentation.meraki.com/MR/MR_Quick_Start

1.メラキ ダッシュボード (http://dashboard.meraki.com) にログインします。

2.AP を追加するダッシュボードの "ネットワーク" を探すか、新しいネットワークを作成します。

3.AP をネットワークに追加します。

4.AP がネットワークに追加されると、ネットワークは SSID を自己構成して、使いやすく展開できるようにします。

5.ダッシュボード ネットワークの [構成] セクションで、追加の構成変更を行います。
  SSID、アクセス制御、およびファイアウォールとトラフィックシェーピングの設定ページを確認してください。

6.AP をアンパックし、電源 (アダプターまたは PoE 経由) とインターネット アクセスを使用した有線接続に接続します。

7.電源を入れた後、AP は最新のソフトウェアをダウンロードします。

8.AP がアップグレードされたら、IP アドレスが AP に正しく割り当てられていることを確認します
Spring Boot Thymeleaf Viewの一部を動的に変える

# 目的
セレクトボックスで選択した内容に応じてそれに紐付くリストを動的に(画面の再読み込みなしに部分的に)変更する

# 環境
Spring Boot
Thymleaf
Kotlin

# 完成形イメージ
選択した講座に合わせて、開催時間が変わる例
![selectBox.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52335/4a841396-78fd-426f-cd5a-6df5ee9b7562.gif)


# 方法
Thymleafのfragmentを利用して、一部のDOMだけレンダリングさせる。
また、セレクトボックスを押した際のリクエストについては、ajaxを用いる

##### 処理の流れ

1. ViewでselectBoxの値変更 
1. ajaxでpost
1. Controllerで変更したい部分だけのDOMを返す
1. フロント側でControllerからもらったDOMと該当箇所を差し替え(ajaxのレスポンス受け取る部分)

## 詳細


```javascript:testview.html
<!-- 部分的にレンダリングしたい部分 -->
<div th:fragment="test-fragment"> 
  <label for="target">ご希望の時間帯 ※他の時間帯は、お問い合わせ欄に記載ください</label>
  <select id="target" th:field="*{course_id}" th:onchange="updateCourseDateList(this.value)">
    <option th:each="courseDate : ${courseDates}"
            th:value="${courseDate.id}"
            th:text="${courseDate.holding_date}"></option>
  </select>
</div>
.
.
.

<script type="text/javascript">
  function updateCourseDateList(selectedId) {
    url = '/updateCourseDate/' + selectedId;
    var targetElement = document.getElementById("target");

    $.ajax({
      method: 'POST',
      data: {},
      url: url
    }).then(
            function(data) {
              targetElement.outerHTML = data;
            },
            function() {
              alert("error");
            });
  }
</script>
```

```kotlin:testController
   @PostMapping("updateCourseDate/{selectedId}")
   fun updateCourseDateList(model: Model, @PathVariable(value= "selectedId") selectedId: Int): String {
        model.addAttribute("course_id",xxxx)
        model.addAttribute("courseDates", xxxxx)
        return "testview :: test-fragment"
// return 時に 部分的にレンダリングしたい部分のtest-fragmentを指定する
    }
```
Dataflow を使用して Datastore にある複数 Kind のエンティティを一括削除する

Dataflow を使用して Datastore のエンティティを一括削除する際の GQL クエリについて紹介します。

この手順自体は [公式ドキュメント](https://cloud.google.com/datastore/docs/bulk-delete?hl=ja) に掲載されており、 Qiita にも [記事](https://qiita.com/owgreen/items/e2241e24529db4298e4e) があります。
しかし削除対象の Kind が多数ある場合は少し工夫が必要になります。

## 何が問題か？

特定の Kind のみ削除する場合は次のような GQL クエリを指定します。

```
SELECT __key__ FROM myKind
```

https://cloud.google.com/datastore/docs/reference/gql_reference より引用

`SELECT __key__` はキーのみを参照する指定です。
これは `SELECT *` より速く [Small operations](https://cloud.google.com/datastore/pricing#small_operations) になるのでコスト面で有利になります。

`FROM myKind` は対象となる Kind の指定です。
この指定を行わない場合はすべての Kind が対象になります。

普通に考えると `SELECT __key__` を指定すれば一括削除できそうですが Datastore にはユーザーからは削除できない [統計エンティティ](https://cloud.google.com/datastore/docs/concepts/stats) が保存されているため実際に実行すると削除途中でエラーになります。

参考: https://stackoverflow.com/questions/49641088/is-it-possible-to-delete-all-google-cloud-datastore-kinds-within-a-namespace

## 解決策

GQL クエリでキーを比較して統計エンティティを除外します。
[キーの比較はバイト値順](https://cloud.google.com/datastore/docs/concepts/queries#key_filters) であるため Kind が大文字で始まっている場合は次のクエリを使用します。

```
SELECT __key__ WHERE __key__ < KEY(__, ' ')
```

Kind が小文字で始まっている場合は次のようなクエリになります。
(こちらのクエリは試していないため失敗する可能性があります)

```
SELECT __key__ WHERE __key__ >= KEY(a, '\0')
```

### gcloud から実行する場合の注意点

gcloud から削除処理を実行する場合はクエリで `,` を使用しているため parameters の区切り文字を変更する必要があります。

参考: https://cloud.google.com/sdk/gcloud/reference/topic/escaping?hl=ja

## ネームスペース

削除対象のネームスペースを指定しない場合はすべてのネームスペースが削除対象になるという記事を見かけたのですが実際にはデフォルトネームスペースが削除対象になるようでした。

何か見落としがあるかもしれませんが削除対象のネームスペースが多数ある場合は個別に Dataflow を起動する必要がありそうです。
Python再履修も兼ねて宇宙関係のMicrosoft Learnをやってみた

![south_edit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/1cc1014e-fc8d-b71d-14fd-bb2e74e02795.jpeg)
趣味で宇宙開発を行う団体「[リーマンサット・プロジェクト](https://www.rymansat.com/)」がお送りする[リーマンサット・プロジェクト　新春アドベントカレンダー2021](https://qiita.com/rsp-dgkz/items/a6ff573c07dbe2c6166f)の19日目になります。
リーマンサットでは広報部でイベント課と宇宙ポスト課に関わっています。元々科学技術コミュニケーションに携わっていたことと、[去年の新春アドベントカレンダー2020](https://qiita.com/rsp-dgkz/items/497225739b88c817a90c)をきっかけに入りました。


## はじめに
普段は[ServiceNow](https://www.servicenow.co.jp/)のようなローコード製品に関わるお仕事をしています。学生時代にMatlabを触って衛星画像の解析をしていた程度なので、プログラミングからは久しくやってないです。
最近になって~~放置しがちですが~~はじめているAtCoderではPythonを選択していますが、そういえば体系的にPythonを学んでいないなって思ったのと、[この記事](https://japan.zdnet.com/article/35159101/)を見つけてからやっていなかったのでせっかくの機会にとやることにしてみました。

触ったのはMicrosoftが提供している下記のラーニングパスです。どれも宇宙に関係するものから選んでみました。

- [宇宙探索での Python の役割を見つける](https://docs.microsoft.com/ja-jp/learn/paths/introduction-python-space-exploration-nasa/)
- [Python と人工知能を使って隕石を分類する](https://docs.microsoft.com/ja-jp/learn/paths/classify-space-rocks-artificial-intelligence-nasa/)
- [機械学習でロケット打ち上げの遅延を予測する](https://docs.microsoft.com/ja-jp/learn/paths/machine-learning-predict-launch-delay-nasa/)

モジュールが細かいので中身は概要レベルで書いていきます。

## 宇宙探索での Python の役割を見つける
はじめ環境のセットアップをします。VS CodeとJupyter Notebookの2つなのでもしかしたらはじめから入れている人も多いかもしれません。もちろん初学者向けなので、設定の方法についても書かれています。

### Pythonの基本的な学習
四則演算、変数・リスト表記、for・whileといった内容を学べます。
コースのはじめの方にも書いていましたが、「Pythonの学習がメインではない」と書いている通り、本当に基本的なところで終わっています。

```Python:リスト表記
rockTypes = ["basalt", "highland", "breccia"] # 玄武岩 高地 角礫岩
rockTypes.append("soil") # 珪藻土
rockTypes[1]
```
変数等の部分が全て宇宙関係にしているのが面白いですね。宇宙関係のラーニングパスはすべて宇宙とか地学に関係している変数が出てきます。

### 簡単なプログラムの作成
上記のモジュールで学んだ内容を使って採取した岩石の種類をカウントするというプログラムを作成します。

## Python と人工知能を使って隕石を分類する
宇宙に存在する岩石の特徴とか、サンプルリターンプロジェクトの「OSIRIS-REx」の紹介がはじめに来ます。

### 画像の解析
Anacondaを経由してMatplotlib、NumPy、PyTorchをインポートします。
隕石の画像をニューラルネットワークを構築して分類をするという内容です。コードがはじめから用意されているので、一切かけなくてもやれるのがありがたいです。

## 機械学習でロケット打ち上げの遅延を予測する
ロケットの打ち上げには正確な気象の予測が必要なので、過去の情報からの予測を立ててみます。NASAのロケットの打ち上げ日とNOAAを気象データを使用し、scikit-learn、PyDotPlus、Azure Machine Learning SDKを新たに導入します。
欠損値のクリーニングからはじまり、データの視覚化まで一連の流れをできますが、この章は他のモジュールと比べて結構分量があります。


## で、どうだったの？
ラーニングパスをやってみた感想ですが、Pythonの超基礎を体系的に学ぶということはできましたが、より詳細な学習については他の学習サイトを使うのが良さそうでした。
コースの説明の中でNASAが取り組んでいる宇宙開発について知ることができたので、読み物としても大変良かったです。機械学習は知識程度しか知らなかったので初学者の導入にいいなと思いました。
[Python と Visual Studio Code で宇宙を探索する (Netflix の『フェイフェイと月の冒険』からのインスピレーション)](https://docs.microsoft.com/ja-jp/learn/paths/explore-space-using-python/)はこちらの応用編ですので、まずはアニメを見てからやろうかなって思います。


## 次回はいよいよ最終回！
明日はとうとう最終回です、トリを飾るのは[@pisamatsuさん](https://qiita.com/pisamatsu)の「[RTL-SDR とV-Dipoleアンテナで作る地上局 ー RSP-01の電波を受信するために](https://qiita.com/pisamatsu/items/2cd25d20281d3a3e41c8)」です。お楽しみに！


リーマンサット・プロジェクトは「普通の人が集まって宇宙開発しよう」を合言葉に活動をしている民間団体です。
興味を持たれた方は https://www.rymansat.com/join からお気軽にどうぞ!
統計検定基礎用語まとめ

## 偏差
- データの散らばりを表す。各観測値から平均値を引いたもの。
$$
偏差 = x_i - \overline{x}
$$

## 平均偏差
- 偏差の絶対値の平均値。データ全体の散らばりを考える時に使う。
$$
平均偏差 = \frac{1}{n}\sum_{i=1}^{n}|x_i-\overline{x}|
$$

## 分散
- 偏差の二乗の平均値。
$$
s^2 = \frac{1}{n}\sum_{i=1}^{n}(x_i - \overline{x})^2
$$

## 標準偏差
- 分散の正の平方根。$(s)$で表す。

## 標準化(基準化)
- 平均値や測定単位の異なる２変数を比べられるように処理すること。z値、zスコアという。
$$
z_i = \frac{x_i - \overline{x}}{s}
$$
- 偏差値は標準化を応用したもの。
$$
偏差値 = 50+10×\frac{x_i - \overline{x}}{s} = 50+10z_i
$$

## 共分散 
- ２変数の関係の強さを図る指標。(変数の単位に依存して変化する)
$$
s_{xy} = \frac{1}{n} \sum_{i=1}^{n}(x_i - \overline{x})(y_i - \overline{y})
$$

## 相関係数
- ２変数間の関係の強さを図る指標。$r_{xy}$で表す。(変数の単位に依存しない、定数倍しても変化しない)

## 回帰直線
- 2変数間に因果関係があると想定し、変数x(説明変数)から変数y(被説明変数、目的変数)を直線の式によって予測する際に使う直線の式のこと。
- 説明変数のとりうる値から大幅にズレた値についての予測をしてはいけない。
- 被説明変数から説明変数を予測してはいけない。
- 回帰直線の係数(傾き)で回帰直線の当てはまりは評価できない。<br>

<直線の式>
$$
y = α + β_x
$$
αとβは回帰係数、$\hat{α}・\hat{β}$は回帰係数の推定値

<βの求め方>
$$
\hat{β} = \frac{s_{xy}}{s^2_x} = r_{xy}\frac{s_y}{s_x}
$$
$r_{xy}$は相関係数、$\frac{s_y}{s_x}$は標準偏差

<αの求め方>
$$
\hat{a} = \overline{y} - \hat{β}_{\overline{x}}
$$
Python 2.7 に pip をインストールする

Python 2.7 はすでに EOL を迎えており Python 3 への移行が推奨されています。 [^1]
とはいえ手元には Python 3 に対応していないコードがあり動かし続ける必要があります。

この記事では最新の pip でサポートされなくなった Python 2.7 環境に pip 20.3.4 をインストールする手順を紹介します。

## 経緯

[pip](https://pip.pypa.io/) は 2021 年 1 月 23 日にリリースした 21.0 から Python 2 サポートを終了しました。

> Note: pip 21.0, in January 2021, removed Python 2 support, per pip's Python 2 support policy. Please migrate to Python 3.

https://github.com/pypa/pip より引用

これに伴い pip をインストールする際に使用する [get-pip.py](https://pip.pypa.io/en/stable/installation/#get-pip-py) スクリプトも Python 2 では動かなくなりました。
当初は SyntaxError が発生 [^2] [^3] していましたが、 2022 年 2 月 20 日時点だと次のようなメッセージが表示されます。

```console
# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
# python get-pip.py
ERROR: This script does not work on Python 2.7 The minimum supported Python version is 3.7. Please use https://bootstrap.pypa.io/pip/2.7/get-pip.py instead.
```

~~実際にはこのメッセージに書かれている URL からさらに移動していますが、しばらくしたら修正されるのではないかと思います。 [^4]~~

## インストール手順 (a)

Python 2.7 用の get-pip.py は次の URL に移動しました。

```console
# curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
# python get-pip.py
```

移動後の URL は Stack Overflow の次のコメントで紹介されていました。
現在は最新の get-pip.py を実行した際のエラーメッセージでも表示されています。

https://stackoverflow.com/questions/65866417/pip-install-failing-on-python2/65866547#65866547

https://stackoverflow.com/questions/65896334/python-pip-broken-wiith-sys-stderr-writeferror-exc/65928602#65928602

## インストール手順 (b)

pip の wheel ファイルをダウンロードしてインストールします。
curl で指定している URL は [pip 20.3.4 の Download files](https://pypi.org/project/pip/20.3.4/#files) に掲載されている wheel ファイルの URL です。

```console
# curl -O https://files.pythonhosted.org/packages/27/79/8a850fe3496446ff0d584327ae44e7500daf6764ca1a382d2d02789accf7/pip-20.3.4-py2.py3-none-any.whl
# python pip-20.3.4-py2.py3-none-any.whl/pip install --no-index pip-20.3.4-py2.py3-none-any.whl
```

この手順は Stack Overflow の次のコメントで紹介されていました。

https://stackoverflow.com/questions/36132350/install-python-wheel-file-without-using-pip/49524140#49524140

Python はもともと zip ファイルを指定して実行することが可能であり wheel ファイルの実態は zip 形式のアーカイブであることから前述の手順でインストールできるようです。

[^1]: https://www.python.org/doc/sunset-python-2/
[^2]: https://stackoverflow.com/questions/65866417/pip-install-failing-on-python2/65866547
[^3]: https://stackoverflow.com/questions/65558034/cant-install-pip-anymore-with-python-2-7/65912726#65912726
[^4]: https://github.com/pypa/get-pip/issues/61
Pythonのcsvモジュールの使い方とその速度

**2021/02/02 22:00追記**
pythonのファイル入出力について勘違いがあった点を修正。
ついでにその勘違いを含んでいたタイトルも変更。

# 要点
Python3のcsvモジュールは便利ではあるが、エラーチェックが不要なら自分で実装するほうが早い。

# 調べたきっかけ

[以前](https://qiita.com/mickie895/items/5ceee1d7f2cdfcbc5ded)csvを変換する速度を調べていたが、最近セルの中にカンマが含まれているようなcsvに出会ってしまった。
実装を考えるのが面倒だったため、csvモジュールを調べながら実装した。

# 使い方

あれこれ書くより、次のコードを見るほうが早そうだ。
下記はpythonのコンソールに書いたときの使用例。

```python
>>> import csv
>>> l = '"abc",1,4.5,"d,ef"'
>>> for row in csv.reader([l]):
...     print(row)
... 
['abc', '1', '4.5', 'd,ef']

>>> for row in csv.DictReader(["a,b,c,d",l]):
...     print(row)
...     
{'a': 'abc', 'b': '1', 'c': '4.5', 'd': 'd,ef'}

```

csv.reader()関数の中に、文字列を返すイテレータブルな変数を入れれば、各行を解釈したものを、リスト形式で返してくれる。
文字列のリストでなくても、例えばテキストファイルのファイルオブジェクトでも成立する。

# 速度チェック
以前の速度チェックに使ったソフトを流用して速度を確認した。
下記はテストに使ったコードで、split周りがなくなってスッキリしている、のだが……？

```python
import datetime
import numpy as np
import csv

ROW = 10 ** 5
COL = 1000


def read_test_0():
    dest = np.zeros((ROW, COL), dtype=bool)
    with open("TestFiles\\case00.csv", "r") as f:
        for row_index, l in enumerate(f):
            dest[row_index, row_index % COL] = True

    print(dest.sum())


def read_test_6():
    dest = np.zeros((ROW, COL), dtype=bool)
    with open("TestFiles\\case00.csv", "r") as f:
        for row_index, l in enumerate(f):
            row = l.split(",")
            for col_index, val in enumerate(row):
                dest[row_index, col_index] = (val == "1")

    print(dest.sum())


def read_test_7():
    dest = np.zeros((ROW, COL), dtype=bool)
    with open("TestFiles\\case00.csv", "r") as f:
        csv_data = csv.reader(f)
        for row_index, row in enumerate(csv_data):
            for col_index, val in enumerate(row):
                dest[row_index, col_index] = (val == "1")

    print(dest.sum())


def test_str_benchmark_2():
    start = datetime.datetime.now()
    read_test_0()
    end0 = datetime.datetime.now()
    read_test_6()
    end1 = datetime.datetime.now()
    read_test_7()
    end2 = datetime.datetime.now()
    print(f"読み込み時間\n{(end0-start).total_seconds():.3}秒")
    print(f"最初の文字だけの読み取り1\n{(end1-end0).total_seconds():.4}秒")
    print(f"最初の文字だけの読み取り2\n{(end2-end1).total_seconds():.4}秒")


if __name__ == "__main__":
    test_str_benchmark_2()
```

実行結果は何故かこうなった。


```python3

100000
24944449
24994288
読み込み時間
1.57秒
最初の文字だけの読み取り1
15.61秒
最初の文字だけの読み取り2
18.39秒

```

読み込み速度はおそらく、冒頭で述べた通りダブルクオーテーションマークで囲んだときなどの処理が追加されたからだろう。
だが同じファイルを読み込んだはずなのに出力が異なるのはおかしい。追加で調査をすることにした。

## 追加の調査結果
なんとなく心当たりがあったので、read_test_6()関数の適当なところでブレークポイントを作り、row[-1]を確認した。
結果、'1\n'が出力された。
~~自分の環境ではopen("～～", "w")でファイルを書き込むと、CRLFの改行コードを持ったテキストファイルが出力され、読み込むときはなぜかLFのみの改行コードとして読み込まれるようだ。~~

~~ファイルの読み込みと書き込みで形式が違うのはバグっぽい挙動だが、とりあえず```row = l.split(",")```を、```row = l.strip().split(",")```に変更することでcsvモジュールと同様の出力を確認できた。~~

**2021/02/02 22:00追記**
[Pythonのreadline()](https://docs.python.org/ja/3/library/io.html#io.TextIOBase.readline)は[C#のReadLine()](https://docs.microsoft.com/ja-jp/dotnet/api/system.io.streamreader.readline?view=net-5.0)と違って、戻り値の文字列には改行を含むらしい。
[rstrip関数](https://docs.python.org/ja/3/library/stdtypes.html#str.rstrip)を使って、文末の"\n"を取り除く必要があるようだ。
『OpenCVによる画像処理入門』9章

[『OpenCVによる画像処理入門』](https://www.kspub.co.jp/book/detail/1538290.html)のまとめ続き。

#複数画像の利用
## 画像間演算
2枚以上の画像を入力して、それぞれの画像の同じ位置にある画素ごとに、決められた演算を行い、出力する処理を画像間演算という。様々な重ね合わせ方法があるが、重み付け係数αを利用して画像間演算を行う方法を__アルファブレンディング__という。

入力画像I1,I2、重み付け係数αとすると、出力画像IGは以下の式となる。

```math
I_{G}(x,y) = α・I_{1}(x,y) + (1 - α)・I_{2}(x,y)
```

入力画像1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/0446be89-2149-d3f1-c169-5fc5e24c98f9.png)
入力画像2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/5dee83e1-633a-056e-15cb-3004049e939a.png)
入力画像3（重み付け0.5）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/2a0ad62f-a765-080b-4fef-20758fe20997.png)

注意点は画像のサイズが同じでないとエラーになること。
ネットから拾った画像でやろうとしたらエラーメッセージが出てしまい、苦戦した。

## マスク合成
画像の特定の部分のみを表示して、他の部分を表示しないようにする処理を__マスク処理__という。
マスク画像（マスク処理を行った画像）に基づいて、入力画像2枚を画像演算し、出力画像を生成する処理を__マスク合成__という。

合成画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/e240d57d-9fe0-8f94-5c4b-4274e1deb4e0.png)

## 背景差分
2つの時刻において撮影された同じ場所の画像の差を観察すれば、画像内で発生した変化情報を読み取ることができる。

## フレーム間差分
背景差分を取得しようにも、移動物体がある画像しか得られない場合がある。
このような場合、移動物体を異なる3つの時刻において撮影した画像を用いて、移動物体領域を取り出す。
このような処理を__フレーム間差分__という。
Flutter × Firebase ビルドが遅い時の処理


#背景
FlutterにFirebaseを導入後、ビルドに時間がかかりすぎていたので、その対応を忘却録として残します。

#開発環境

PC:macOS Big Sur
エディター：Visual Studio Code

#内容
ビルドに時間が5〜10分くらいかかっていた。

#対応
公式を参考にして、podファイルにコードを追加してビルドすると、以下のようなエラーが発生

```
username@projectName % flutter run               
Launching lib/main.dart on iPhone 11 in debug mode...
 
Running pod install...                                             24.9s
CocoaPods' output:
↳
      Preparing

    Analyzing dependencies

    Inspecting targets to integrate
      Using `ARCHS` setting to build architectures of target `Pods-Runner`: (``)

    Fetching external sources
    -> Pre-downloading: `FirebaseFirestore` from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `6.26.0`
     > Git download
     > Git download
　・
　・
　略
　・
　・
    [!] CocoaPods could not find compatible versions for pod "FirebaseFirestore":
      In Podfile:
        FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `6.26.0`)

        cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) was resolved to 0.14.4, which depends on
          Firebase/Firestore (~> 6.33.0) was resolved to 6.33.0, which depends on
            FirebaseFirestore (~> 1.18.0)
　・
　・
　略
　・
　・
    [!] Automatically assigning platform `iOS` with version `9.0` on target `Runner` because no platform was specified. Please specify a platform for this target
    in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.

Error running pod install
Error launching application on iPhone 11.
```

#原因
今回、podファイルに追記したコードのバージョンが古かった。
エラーコードにも書いてありました。
CocoaPods could not find compatible versions for pod "FirebaseFirestore"
互換性のあるバージョンが見つからない、とのこと

#解決法

エラーコードにも書いてあるとおり、バージョンを6.33.0に変更

```
pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '6.33.0'
```
ビルドも1分くらいに短くなりました。

#参考記事
[FlutterFire Overview](https://firebase.flutter.dev/docs/overview/#initializing-flutterfire)
【備忘録】CSSの擬似要素の種類と使い方

# 初めに
擬似要素（Pseudo-elements）はクラスやIDが付いているタグの特定の部分にスタイルを適用するために使用するものです。擬似要素を使うメリットと種類&使い方についてまとめてみました。

# 目次
- 擬似要素を使う理由&メリットについて
- 擬似要素は:と::どっち？
- 擬似要素を使う時の注意点
- 擬似要素の種類
- 参考サイト

# 擬似要素を使う理由&メリットについて

擬似要素を使うことによって、不要なタグやセレクタを減らすことができます。ただそれだけ？と思うかもしれませんが、コードが長くなればなるほど可読性は重要になリます。特にスタイルを適用するためにタグで囲んでクラスやIDを適用することがなくなるので、クラス名の重複などでスタイルが適用できなかったりするような不具合も防げます。

# 擬似要素は:と::どっち？
結論から言いますとどちらでも使えます。ただ、最新のCSS3では擬似クラスと区別をつけるために「::」を推奨しています。しかし、CSS1やCSS2などの古いバージョンでは「:」しか対応していません。現在は互換性のため、二つの記法が混在しています。

# 擬似要素を使う時の注意点
擬似要素はblock要素に対して適用されます。inline要素に対しては適用外です。よく文字などにスタイルをつける時に<span>タグを使いますが、この<span>タグはinline要素なので擬似要素は適用されません。
<div>や<p>タグなどのblock要素を使わなければなりません。

# 擬似要素の種類
## 1. ::first-letter
要素の第一文字にスタイルを適用します。文字列があり、先頭の文字を大きくしたり色をつけたりする時に使います。

①HTML

```html
<div class="letters">
 Hello World
</div>
```

②CSS

```css
.letters::first-letter {
  color: red;
  font-size: large;
}
```

③実行結果
![スクリーンショット 2021-01-31 23.04.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/fd9958fe-aa39-8631-b3ca-2afb02b5f927.png)

## ２. ::first-line
要素の1行にスタイルを適用します。

①HTML

```html
 <div class="letters">
        Hello World
        <div>
            Welcome
        <div>
</div>
```

②CSS

```css
.letters::first-line {
 color: red;
 font-size: large;
}
```

③実行結果
![スクリーンショット 2021-01-31 23.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/248ef7a0-cce9-05b3-52d8-f74eb3b8320d.png)
## 3. ::before
要素の直前に「content」を設け、その「content」にスタイルを適用します。「content」は""で囲む必要があります。ただし、画像のURLを指定する場合には「content: url("screenshot.jpg")」のように指定します。
①HTML

```html
<body>
    <div class="letters">
        Hello World
    </div>
</body>
```

②CSS

```css
.letters::before {
  content: "Welcome";
  color: blue;
  font-size: large;
}
```

③実行結果
![スクリーンショット 2021-01-31 23.37.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/3c4ee91c-41f4-f876-5480-36daf15065cd.png)

## 4. ::after
要素の直後に「content」を設け、その「content」にスタイルを適用します。::beforeと記法は同じです。
①HTML

```html
<body>
    <div class="letters">
        Hello World
    </div>
</body>
```

②CSS

```css
.letters::after {
  content: "Welcome";
  color: blue;
  font-size: large;
}
```

③実行結果
![スクリーンショット 2021-01-31 23.40.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/bff958c7-9263-d6b7-dfac-e5714e18df4e.png)

# 参考サイト
- http://www.htmq.com/htmlkihon/005.shtml
- https://wemo.tech/1450
- https://www.asobou.co.jp/blog/web/css2
VPC内のLambdaからboto3を使用する際に気を付けること




## はじめに
この記事は、社会人２年目 AWS、python初心者が勉強したことをまとめたものです。
間違っている点、改善点等ございましたご指摘いただけると大変ありがたいです。


## この記事について
VPC内のLambdaからboto3を使用してパラメータストアからDB接続情報を取得しようとしたところはまりました。
自身のための備忘録として、また初心者が同じところで嵌らないようにはまった内容について記載しておきます。


## 結論
VPC内のプライベートサブネットに配置されたLambdaからインターネット経由でboto3を使用するためには以下のいずれかを実行する必要がある。

* publicサブネットのNATゲートウェイを経由する。
* private linkを使用する。


■参考
https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-vpc-parameter-store/


## やりたいこと

パラメータストアからDB接続情報を取得し、LambdaからDBに対してSELECT、INSERTを行うこと。

## 前提

* Lambdaにパラメータストアからパラメータを取得するためのIAMポリシー（ssm:GetParameters、sts:AssumeRole）は付与済み
* LambdaとDBは同じプライベートサブネットに配置


## エラー内容

```
2021-01-30T14:29:59.355Z 410cd8d5-7a8f-4c2a-a247-eff916e351f7 Task timed out after 3.00 seconds
```

## 原因

>デフォルトでは、Lambda は追加設定を行わなくても、インターネットと Systems Manager および パラメータストアへアクセスできます。
>ただし、Amazon VPC の Lambda 関数は、デフォルトではインターネットとパラメータストアへの値にアクセスできません。

勝手にAWS内のリソースへのアクセスはいい感じにルーティングしてくれると思っていました。。。

■参考
https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-vpc-parameter-store/

## 解決策

パブリックサブネットをにNATゲートウェイを配置し、Lambdaが配置されているプライベートサブネットに以下のルートを追加してあげたら、
無事パラメータストアからDB接続情報を取得できました!

0.0.0.0/0 NATゲートウェイ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1066929/aaabab65-d8bd-2a51-d7e7-2bf09e4221e2.png)


## 最後に

private linkは使用したことがないので追々試してみたいと思います。
テレワークなアジャイルチームでslackでイイねチャンネル作ってみた話

# 背景紹介
- 4-5人からなるアジャイルチームで活動しています。
- チームは1年前に結成し、そこそこチームとして成熟した状態になってきていました。
- そこにコロナによるテレワーク推奨。半年ほど前からほぼ完全テレワークで業務に取り組んでいます。

スクラムイベントの振り返りの中で、以下の2つ が問題として上がり、その対策にイイねチャンネルを導入しました。
        1. テレワークによる(雑談レベルの)コミュニケーションの低下
        2. メンバーのモチベーションの低下（プロジェクトにまつわるゴタゴタにより）


# やったこと
- slackにイイねチャンネルを開設。
    - チームメンバーへの感謝を投稿できるようにしました。やってもらって嬉しいことがあれば会議中でもいつでもどこでも投稿するようにしました。

### 運用で気を付けたこと
- slack投稿の心理的ハ―ドルを下げる
    - これまで弊チームではslackは業務連絡メインで、メールの延長線のような運用をしていました。Twitterにつぶやくような気軽さでイイねチャンネルに投稿できるように、イイねチャンネルとは別に雑談チャンネルを開設。投稿する事へのハードルを下げました。
- 「お礼へのお礼」は極力避ける
    - 「お礼へのお礼」が当たり前になると、そうすることへの心理的な圧力がかかって疲れそう…
    - ということで明確ルール化したわけではないですが、やんわりと共通認識を持つようにしました。

# 良かったこと
- みんなの前でほめられることがモチベーションになる
    - 今までの「直接お礼を言われる」に加えて「みんなに見えるように褒められること」で、モチベーションは大きく上がります。単純ですね(笑)
- テレワークでのコミュニケーションのきっかけになった。
    - 副産物として開設した雑談チャンネル、ここに技術的な話や身の上話などが投稿されることになりました。それらが休憩時間の雑談の役割を代わりに果たしてくれ、そこから仕事の報連相につながり業務がスムーズになりました。（ずっと雑談チャンネルに張り付いてる人がいたりするとの噂も…）
- 頼み事の罪悪感が軽減される
    - これは個人的に感じていることです。立場上、メンバーにお願いすることが多いのですが、今までは必死に対面でお礼を言っていうくらいしかできることがありませんでした。ですが、イイねチャンネルにも投稿することで、少しだけ相手の親切に報いることができる気がして頼み事がしやすくなりました。

- 周囲からの期待マネジメントができる
    - これは運用前は想定していなかったことなのですが、結構な頻度で「こんな小さなことでこんなにほめてくれるの⁉」みたいな投稿があります。思えば、それは「周囲からの自分への期待」の自分の認識がずれていたからなのでしょう。余談ですが、チーム内でこれがズレだすと結構パフォーマンス落ちる気がします。イイねチャンネルにはそれを微修正する効果もあると思いました。

# 悪かったこと
良いこともあれば悪いこともあります。悪いことというかこれから改善したいことですね。

- 上司（チーム外）からの理解が得られない。参加者以外には必要性があまり理解されない。
    - イイねチャンネルに上司も参加してもらえると、個人業務の再ろ化防止やコミュニケーションコストの見える化などが期待できるので、何とかしたいですね。
- 性格的に向き不向きがある
    - イイねチャンネルの投稿者に偏りがあります。すごくイイねしてくれる人とそうでない人。そうでない人たちも感謝していないわけでなく、感謝を言語化する習慣が薄いor忙しすぎるだけです。後者はまだしも前者は、感謝なのでルールで矯正したりしづらい領域なので悩みどころです。
ポストモーテムを理解する

## はじめに
こんにちは、webエンジニアの@an_sonyです。

最近、障害対応の振り返りをしていた時に「ポストモーテム」という手法を初めて知りました。これまで「どうやったら良い振り返りができるのか？」と悩んでいた自分にとって目から鱗の知識ばかりでしたので、整理のためにまとめてみます。

## ポストモーテムとは？

SRE サイトリライアビリティエンジニアリング[^1]によると、**インシデントとそのインパクト、その緩和や解消のために行われたアクション、根本原因（群）、インシデントの再発を避けるためのフォローアップのアクションを記録するために書かれるドキュメント**を指します。
言い換えると、失敗（障害）から学び、再発防止策を決める活動です。

## 障害報告書との違い

障害報告書と内容が似ていますが、ポストモーテムは読者と目的が違います。
障害報告書は、障害発生によって不利益が生じたユーザーに対して、その説明をするための報告書を指します。対して**ポストモーテムは障害から学び、より良いサービスにするための報告書です**。そのため読者は身内のエンジニアになります。

|  | 想定読者 | 目的 |
| ------------- | ------------- | ------------- |
| **ポストモーテム**  | 身内のエンジニア | 障害からの学び・サービス改善 |
| **障害報告書** | 上司・ユーザー  |障害の報告・情報共有|

## フォーマット

SRE 付録D ポストモーテムの例[^1]のフォーマットです。

```
作成日:
作者:
ステータス:
サマリ: 
インパクト: 
根本原因: 
発生要因: 
対応: 
検出: 
アクションアイテム: 

教訓
うまくいったこと
うまくいかなかったこと
幸運だったこと

タイムライン

参考情報
```

## ポストモーテムを実施する上で重要なこと
### 批判を行わない

これが最も重要なことです。批判をしてしまうと、過失を犯した人間は処罰を恐れて何も語らなくなり、その背後にある本当の原因に気付くことができません。そうするとポストモーテムの目的である障害から学ぶことができなくなってしまいます。批判ではなく原因分析と改善に集中することが大切です。

#### 障害について根本原因を十分に分析し、理解する

障害に対して分析が不十分だと、間違った再発防止策になってしまい、結果的に同じ障害が再発してしまいます。分析は「客観的であること」「原因がシンプルで、かつシステムやプロセスにあること」を意識して、なぜ？をひたすら問い続けることが大切です。

### 人ではなく仕組みで解決する

再発防止策が「気をつける」とか「頑張る」という結論は人に頼って解決することになりますが、人を簡単に「修正」することはできません。それよりもシステムやプロセスを修正して、人々が正しい選択をすることができる支援に取り込むことが大切です。

### 多くの人に知識を共有する

障害の原因分析や再発防止策は、障害から学んだ知識の集合です。その知識は他のチームでも活用できるノウハウになります。ポストモーテムはサービス改善が目的なので、知識はどんどん共有していくことが大切です。

## どうやって実践していくか

### ポストモーテムを書く基準を決める

ポストモーテムはそれなりの時間と労力を費やすため、全ての障害に対して取り組むのは現実的ではありません。そのため、判断基準を決めておく必要があります。

例）
・ダウンタイムが一定の閾値を超えた
・データの損失が生じた
・オンコールエンジニアの介入が必要だった
・解決までに一定以上の時間を要した
・モニタリング自身の障害

### 文化を根付かせるための継続的な活動

ポストモーテムを書く文化を根付かせるために、過去のポストモーテムを振り返るポストモーテム読書会をやったり、過去のポストモーテムをロールプレイする不運の輪をやったりするのが良いです。

## まとめ

「失敗から学ぶ活動」に対しての具体的な意識や行動がイメージを理解できました。
あとは実践して、より良いサービスを開発できるよう改善活動していきます。

### 参考
[^1]: SRE サイトリライアビリティエンジニアリング (https://sre.google/books/)
Fast Notionで簡単にメモを取る方法

#はじめに
Notionのスマホ版は繋いにくいので、メモを入力する専用に使っています。わたしと同じ用途であれば、このFast Notionはおすすめです。

##前提
- iPhoneに「Fast Notion」のアプリが入っている。
- パソコンでWeb版のNotionを開いておく。



##設定の流れ

###全体の流れ

1. 歯車マークを押す。
2. Your Account Tokenを押す。
3. Your Account Tokenを入力する。
4. Notion Page URLを入力する。

###1.歯車マークを押す。
(iPhoneのFast Notionのはじめの画面です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/8875f57b-852b-d1be-10d0-65db5c246fb2.png)

###2.Your Account Tokenを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/c61afdcb-801e-0d4b-6951-8c616c924181.png)

###Your Account Tokenとは…
この作業だけは、パソコンのWeb版でしか行うことができません。

- 自分のNotionのページで右クリック（or Oprion + Command + I）をして、「検証」を押す。
- Applicationのタブをクリック
- Storageの中の、Cookiesをクリック
- 表示されたページから、`token_v2`を探し、Valueのカラムに表示されている英数字の羅列です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/19c52454-1cff-3a90-4455-ea30580169b9.png)

###3.Your Account Tokenを入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/1dac2c29-3a51-aa83-bdf7-46fb4142d58c.png)
iCloudで同期されていると、パソコンでコピーしたものをそのままiPhoneで貼り付けることができます。

ここまでで、Fast NotionとNotionを紐づけることができました。

次は、ページとFast Notionを紐付けます。
###4.Notion Page URLを入力する。
歯車マークから、Notion Page URLをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/02e70ef4-ff06-f52a-3068-c1d25875a151.png)

Notionのページに戻り、
Notionのページの右上にある、`・・・`から、`Copy link`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/9f062c41-4a59-a1ac-526d-85f820fead4a.png)

Page URLに`Copy link`でコピーしたURLを貼り付けます。
URL LABELは自由に。ページの名前や用途別に命名するとわかりやすいと思います。

ADD URLでいくつもページを登録しておけば、メモを送りたいページを指定することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/c6b19ceb-9712-9d3b-907a-b43bbda4f079.png)

SELECT PAGEを選択して、テキストを入力して、Postを押すと、Notionのその選択したページに一番下に、入力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/76c121cb-dcf4-8124-3226-50ec033317bf.png)
composerでmemory sizeが足りないというエラーが出る

# 課題
composer require 〇〇としたときにメモリが足りませんというエラーが出てしまう

```
PHP Fatal error:  Allowed memory size of 1610612736 bytes exhausted (tried to allocate 12288 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/GenericRule.php on line 36
```

maxOS Big Sur
PHP 7.4.14
Laravel 7.12

## 解決法

一時的にメモリ制限を解除してインストールする

```
php -d memory_limit=-1 /usr/local/bin/composer require 〇〇
```
udemyによるAWSの勉強④ - AWS S3とdjangoの連携 - 画像アップロード

#◆udemyの教材
本記事を作成するにあたって、参考にしたudemyの教材は以下のものになります。

これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）
https://www.udemy.com/share/101WKk/

#◆本記事の内容
udemyにてAWS S3がどういうものかを理解しました。
そこで、簡単なWebサイトを作り、AWS S3と連携させます。

* 画像ファイルをS3に保存する方法
* S3に保存してある画像をwebサイトに表示する方法は以前の記事で紹介しましたので、そちらを参考にしてください。

https://qiita.com/Tett/items/ca2a7ee534c6ccfc9223

#◆参照サイト
①https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html

②https://qiita.com/sand/items/b897aa47c304b7fbdcb5

#◆環境準備

* AWS S3のバケット作成
* djangoの設定ファイル変更は以前の記事で紹介しましたので、そちらを参考にしてください。

https://qiita.com/Tett/items/ca2a7ee534c6ccfc9223

#◆views.pyの編集

```
from django.views.generic import TemplateView, CreateView
from .forms import PhotoForm
from .models import PhotoModel

----
class Photo(CreateView):
#class AwsUploadView(TemplateView):
    model = PhotoModel
    form_class = PhotoForm
    template_name = 'aws_upload/aws_upload.html'
    success_url = 'upload/'
    #success_url = 'aws_upload/aws_upload.html'

    def get_context_data_photo(self, **kwargs):
        #最初に継承元のメソッドを呼び出す
        ctxt = super(Photo, self).get_context_photo(**kwargs)
        ctxt["photos"] = PhotoModel.objects.all()
        return ctxt
```

#◆htmlファイルの編集

アップロードテスト用のページとして以下を用意しました。

```
<h1>Upload test</h1>

<form action="" method="POST" enctype="multipart/form-data">{% csrf_token %}        {{ form.as_p }}
    <button type="submit">アップロード</button>
</form>

{% for photo in photos %}
    <a href="{{ photo.image.url }}">{{ photo }}</a>
    <hr>
{% endfor %}
```

#◆models.pyの編集

```
from django.db import models

# Create your models here.

class PhotoModel(models.Model):
    image = models.ImageField(upload_to='images')

    def __str__(self):
        return self.image.url
```

#◆forms.pyの作成

```
from django import forms
from .models import PhotoModel

class PhotoForm(forms.ModelForm):
    class Meta:
        model = PhotoModel
        fields = '__all__'
```

#◆urls.py(アプリ側)の編集

```
from django.urls import path

from .views import IndexView, MaskedView, MainView, AboutView, AwsView, Photo

urlpatterns = [
    ---
    path('upload/', Photo.as_view())
]
```

#◆Webサイトでの確認

まずは正常に表示されることを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/db747106-794b-845e-aa0a-18f26388b2d2.png)

ファイルを選択してみます。
「ファイルを選択」をクリックすると以下のようなファイル選択画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/a020346f-af93-8b50-981e-82699fdf1d27.png)

ファイルを選択すると、選択されたファイル名が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/9bf48e66-73da-e513-2b0b-bf46f27b2d02.png)

「アップロード」をクリックします。
以下のようなエラーが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/65844f04-cda1-4f2f-5373-9e376df78bd8.png)

1度AWS S3を確認します。
AWS S3には画像がアップロードされていることが確認出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/1a09c826-c8fe-347b-f4fc-01e9d48252af.png)

しかし、アップロードクリック後の画面が表示されない問題について解決する必要があります。
解決できましたら、内容を更新します。(2021/1/31　調査中)