OmniAICreator/Qiita-1.07M huggingface dataset:
PaloaltoVM(10.0.4) 管理者ロール設定

前回はESXiにPaloaltVMをインストールしてみました。今回は管理者ロールや管理者について見ていきます。意外と後回しにしがちですが、adminアカウントはなんでも操作可能なのでPaloaltoを利用するユーザ毎に権限を絞るべきだと思います。

## 1. 管理者ロール作成
adminアカウントでログイン後、画面上でのDEVICEタブから管理者ロールをクリックし、画面左下にある「追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/306be3fc-e0cf-14a1-4c8b-7f39d20811bb.png)

名前に"admin-policy"とし、WebUIから下記項目を無効化します。

|パラメータ |値 |
|--|--|
|モニター | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/d8ccb551-f18f-a3c7-6e51-ed614343e72e.png)|
|ネットワーク | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/d8ccb551-f18f-a3c7-6e51-ed614343e72e.png)|
|デバイス | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/d8ccb551-f18f-a3c7-6e51-ed614343e72e.png)|

次にXML APIタブをクリックし、すべて無効化されている事を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/0348c791-8167-e877-e2bf-1fe9eb38a941.png)

コマンドラインタブも「None」になっている事を確認して、「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/f974830a-bc03-9965-99b8-800fb6f06d0b.png)

admin-policyロールが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/5c521529-42b7-b29c-cde8-4cfbdc6f6e57.png)


## 2. 管理者作成
次に管理者をクリックし、画面下の「追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/8df19e7f-c8ba-ca0a-7377-a8a6850da604.png)

名前を「p-admin」パスワードを入れ、管理タイプをロールベースにして先ほど作成したadmin-policyを選択し「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/b7c7d418-4d8d-dbbc-bdf1-0a91ec80bda4.png)


## 3. コミット
p-adminが作成されました。では、反映したいと思います。画面左上にある「Commit」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/e0f67a0d-2180-0975-3a3c-525f1c57b6af.png)

画面右したの「コミット」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/de515de7-b10c-be34-acda-f5f9080e4e1c.png)

成功したら「閉じる」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/6c6cf599-de1f-d851-e53f-a39be8339e9c.png)

## 4. 動作確認
ブラウザを新規に立ち上げて先ほど作成したp-adminユーザでPaloaltoへログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/09ed975e-68f6-80af-5d86-4e456a6cd162.png)

画面に上に表示されている内容が減っています。これは管理者ロールを作成する際にモニター、ネットワーク、デバイスを無効化しているからですね。このように利用したいユーザ毎で権限をカスタマイズする事が出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/2bc343f7-d87c-de8d-c014-4cc443c3e004.png)

また、単に閲覧だけであればユーザ作成時に管理者タイプを「ダイナミック」にして「スーパーユーザ（read-only）」を選ぶことが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/bcfeaf78-f404-e87f-e898-5c5fbd697a51.png)

## 5. その他 
次回はZone/インタフェース作成をやってみたいと思います。
VMware Cloud on AWSのHCXについて簡単にまとめてみる。（概要と導入編）

VMware Cloud on AWS（VMC）を利用するほとんどの方が、オンプレミスからの移行やL2延伸を要望されます。
非常に難しいと思われがちですが、ポイントとデザインを押さえれば意外と簡単に扱うことができます。

今回は、HCXの機能の簡単なまとめと、VMC on AWSでのHCXの初期設定をまとめていきます。
本人の備忘録もありますので、誤字脱字はご了承ください。。

#VMware HCXについて
- HCXは、Hybrid Cloud eXtensionの略です。
- ライセンス体系は二つあります。（AdvancedとEnterprise）
- Enterpriseの方が機能が多くあります。（L2延伸やマイグレーションはどちらも利用可能）
- NSX-TのEnterprise PlusにHCX Advancedのライセンスが含まれます。（ライセンスは要確認です。）
- L2延伸間のヘアピントラフィックを回避する、MON（Mobility Optimized Networking）や、大量にマイグレーションするときに便利な、RAV（Replication Assisted Vmotion）、そして簡易なDRがEnterpriseのみ利用可能です。ちなみにVMCはEnterpriseが利用可能です。

#### ライセンス体系はこちら（VMwareの英語サイトです。）
https://www.vmware.com/content/dam/digitalmarketing/vmware/en/pdf/products/hcx/vmw-hcx-licensing-and-packaging-solution-overview.pdf

#### 軽く触ってみたい方は、HOL（ハンズオンラボ）もあります。

HCXの紹介はこちらにおいておきます。
https://www.vmware.com/jp/products/hcx.html

#HCXの導入について
初めての時は入手方法を悩みました・・・。

ダウンロードはVMCのvCenterのHCXプラグインの中で可能です。
System -> Administrationの中にあります。（赤線）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/f717b11c-f702-6a59-10d3-0f7e07f6c2f3.png)
当初はリンクが有効になっていませんが、しばらくすると有効になります。

##VMC上でHCXを導入する流れ。
大まかにですが、流れを書いていきます。
1．まずはVMC上にHCXをActivateしましょう。

Add Onsを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/eb744e48-4ce6-58d2-deae-a03398890297.png)

OPEN HCXを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/e38e22a7-d618-b55f-6fe2-b1e145910397.png)

DEPLOY済みですので表示が違いますが、Deployというボタンがありますので押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/5cfb8a1e-d1c6-ba05-c8a1-62dfe2ea4c7d.png)

しばらく待てば、HCX-Cloud（VMC側）がデプロイされます。

2．先ほどの画面からライセンスキーを生成しましょう。
赤い線のボタンを押します。キーが生成されます。（即時です）
このキーは、オンプレミス側のConnectorの登録時に必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/dc3a8dc5-5a0b-fb3e-e7d8-b66bf5b61c34.png)

3．CGWのGateway Firewallのポートを空けましょう。
HCXはインターネット経由でも、Closed（DXやIPsec経由）のどちらでもアクセス可能です。
今回はラボなので、インターネット経由です。（Any（ザル）では開けちゃダメ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/234a5c43-5476-ee7c-1df0-f85871a9a3ee.png)

4．VMCのvCenterのプラグインから、HCX-ConnectorのOVAをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/09d046eb-580e-ab01-751c-9971fbbe740d.png)
ダウンロード画面は、上の方を参考にしてください。

6．オンプレミス側にOVAを導入しましょう。
OVAのデプロイの画面は割愛します。<(_ _)>
初期パスワード、ネットワークパラメータ、NTPなどを聞かれます。


7．HCX-Connectorの初期設定をします。
https://HCX-ConnectorのIP:9443/
Portの9443を忘れないようにしましょう。普通の443はvCenterのPSCと連携して、HCXの通常の画面になります。
管理画面が9443というのが注意点です。


ライセンスキー投入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/ac4296b3-3515-3ec1-3fb5-aa66db89302b.png)

vCenterの登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775358/9e3b1ed6-2af9-c527-fd55-4c83d5ab950c.png)

これでHCXのセットアップは終了です。

## 次回はHCXの初期セットアップを書いていきたいと思います。
PowerPointのテキストボックスのサイズを自動調整する

記事に書いてある内容を試しても上手くいかず，少し躓いたのでちょっとしたメモ。

### やり方
1. テキストボックスを選択
1. 右クリックで［図形の書式設定］を選択
1. 図形の書式設定から［文字のオプション］を選択
1. [テキストに合わせて図形のサイズを調整する]を選択
1. **[図形内でテキストを折り返す]**のチェックを外す

<img width="300" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423323/a8d6e0ba-40b6-a456-3aa9-812812a20fe2.png">

[図形内でテキストを折り返す]にチェックがついていると全然自動調整してくれないので忘れずに！
（私はずっとここで詰まってました…）
SQLの比較演算子 '!=' の落とし穴に気をつけろ

大した話ではないのですが、自分自身の意識に刻み込むために記録。

例えば下記のようなデータの場合。

テーブル名：employee

| ID| name |  department  | post |
|---|------|--------------|-------|
| 1 | 田中太郎 | 営業部 | 社長 |
| 2 | 山本大介　　| 営業部 | 部長 |
| 3 | 岡本花子　　| 営業部 | null |
| 4 | 鈴木裕太 | システム部　　| 係長 | 
| 5 | 佐藤綾   | システム部　　| null |

このテーブルでpost（役職）が「社長」以外の従業員を取得したいなーと思った時に、
下記のSQLを実行すると、、


```
select * from employee
where post != '社長';
```

結果がこうなります。


| ID| name |  department  | post |
|---|------|--------------|-------|
| 2 | 山本大介　　| 営業部 | 部長 |
| 4 | 鈴木裕太 | システム部　　| 係長 | 

postがnull、つまり一般社員のレコードは取得されていません。

SQLのwhere文の比較演算式で!=を使用した場合は、nullは判定対象に含まれてないのです。

一般社員の方も出力したいならこう。

```
select * from employee
where post != '社長'
and post is null;
```

感覚的に書くとけっこう騙される部分(自分だけかもしれないですが…)
だと思うので初学者の方は気をつけましょう。
大学時代に2回プログラミングを挫折した僕が、たった三ヶ月でサービス開発できるようになった話

こんにちは！


現在は個人的に、
Hatakaku: 業務状況改善App
Kiseki: エンジニアの卵用辞書App
VtoIL：様々な議題に対してみんなで考えるアプリ
を制作しています！
使用言語およびフレームワークはReactとFlutterです！
バックエンドと認証には全てFirebaseを利用しています。

と、自己紹介はこの辺にして、本題に入っていきたいと思います。
まずは、私のエンジニアになるまでの道のりについてです。

# 挫折①
大学二年生の頃、とあるドラマ（リッチマンプアウーマン）を見て、「おお、エンジニアかっけえ。」となり、初心者あるあるのprogateでHTML,CSSを学びました。しかし、インプットメインかつ、作りたいものがない中での勉強は身にならず、
結局、一ヶ月かけてカッコ悪いサイトをいくつか作って挫折しました。
これが一度目の挫折でした。

# 挫折②
次に大学四年の時に、ITベンチャーでデザイナーをやっている友人から、アイデアがあるならやってみれば？と言われ、当時はまっていた素数計算のアプリを開発しようとswiftの勉強を始めました。
今回こそはと意気込んで、専門本を複数購入し、毎日必死に勉強しました。
目標もできたことですし、今度こそは....
しかし、結果的に三ヶ月ほどで挫折することになります。
その過程では様々なことがありましたが、今思うとその原因は一つだったと思います。

# 本題
さて、ようやく本題です。
「どうやってそんな半端もんがスラスラコード書けるようになったのか」
これは、私が現在も所属している、「ジーズアカデミー」が深く関係してきます。
これは宣伝用とかでは全くないので、この学校についての詳細は省きます。リンクは載せておくので、気になった人は見てみてね。
[ジーズアカデミー公式リンク](https://gsacademy.jp/?utm_source=google&utm_medium=cpc&utm_campaign=GoogleAd_TYO_SRCH_AT-Brand_2021-03-07&gclid=Cj0KCQiA3fiPBhCCARIsAFQ8QzUfW0A4lJQv-IQzcTU4Ps5Ho1vQmrlEIz5p6g5psmAqiBEyxR9miSAaAs6SEALw_wcB)

ジーズアカデミーでは主にプログラミングと起業関連のスキルを学習しますが、そこで私が出会ったのは山崎先生という恩師でした。
彼から、**「50%の理解でいい。進め。進めば見えてくる。」**という教えを受け、最初は半信半疑でしたが、実際にそれを実行しているうちにその言葉の真意が見えてきました。
プログラミングは、英語を使うし、難しい言葉や概念がたくさん出てくるし、学問っぽさ全開ですよね。
特に僕ら義務教育を修了した日本人にとって、「理解せずに進む」というのは悪のように感じてしまいます。
しかし、**プログラミングは実はスポーツ寄り**なんですよね。
体で覚える。
サッカーでトラップをするとき、X度で向かってくるボールに対してYニュートンの力で足を当てるとボールが地点Aに止まる。なんて考えますか？
しませんよね。あれは数多の経験から導かれたものです。
それと同じことがプログラミングでも起きるようになります。何なら、スポーツで言う「経験」は大抵の場合、天才たちが既に簡単に扱えるようにまとめてくれるので、プログラミングの場合、彼らの知恵を拝借できるわけです。しかも「無料」でね。

学校のテストで言えば、公式を使用している感覚に近いかもしれません。それ故に、理解は後からでもいいんです。
たくさん使っていくうちに覚えて使えるようになります。

実際、前述したように僕は理解を重視したがために2回も挫折しました。しかし、心持ちを変えただけで、優秀な人が集うジーズアカデミーの選手権で2回とも２位に入賞できました。（一位とりたかった.....）

この記事を読んでくれている方の中には、以前の僕のように漠然とした憧れからプログラミングを勉強し始めてみたけど、プロトコルとか、関数とか、引数とか、分からない言葉ばかりで理解できず、自分は向いていないんじゃないか。と落ち込んでしまっている人もいるかも知れません。
大丈夫。向き不向きで言えば、プログラミングに魅力を感じた時点であなたは向いていると思います。

なので、諦めずに、ひたすらコードを書いてみましょう。
おすすめの勉強ルートなどについてはまた後日記事にしたいと思います。

初めての投稿のため、読みづらい記事となってしまいましたが、これから記事の書き方も含めて勉強していきますのでよろしくお願いします。
イテレータを用いたEigen::Matrix内の行・列単位でのアクセス

Eigen 3.4 以降でMatrixの行/列をイテレータでアクセスできるみたいです. これでコンテナに格納されたVector3dをMatrixXdにまとめたり、その逆が簡単に書けるようになります．

https://eigen.tuxfamily.org/dox/group__TutorialSTL.html


```cpp:sample.cpp
#include <Eigen/Dense>
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
        Eigen::MatrixXd M = Eigen::MatrixXd::Random(3, 12);
        std::cerr<<M<<std::endl<<std::endl;
        std::vector<Eigen::Vector3d> vecs;
        std::copy(M.colwise().begin(), M.colwise().end(), std::back_inserter(vecs));
        for(auto v : vecs) {
                std::cout<<v.transpose()<<std::endl;
        }
        return 0;
}
```

出力

```shell-session:
 -0.999984 -0.0826997  -0.905911   0.869386   0.661931  0.0594004  -0.233169   0.373545   0.692334   0.307838   0.820642  -0.905071
 -0.736924  0.0655345   0.357729  -0.232996  -0.930856   0.342299  -0.866316   0.177953  0.0538576  -0.168001   0.524396   0.472164
  0.511211  -0.562082   0.358593  0.0388327  -0.893077  -0.984604  -0.165028   0.860873   -0.81607   0.402381  -0.475094  -0.343532

-0.999984 -0.736924  0.511211
-0.0826997  0.0655345  -0.562082
-0.905911  0.357729  0.358593
 0.869386 -0.232996 0.0388327
 0.661931 -0.930856 -0.893077
0.0594004  0.342299 -0.984604
-0.233169 -0.866316 -0.165028
0.373545 0.177953 0.860873
 0.692334 0.0538576  -0.81607
 0.307838 -0.168001  0.402381
 0.820642  0.524396 -0.475094
-0.905071  0.472164 -0.343532
```
複数のテーブルを結合した上でGroup Byを使用する際に詰まったところ

## なぜこの記事を書こうと思ったか
eager_loadで結合されたテーブルに対して集合関数を使用した際に、少しつまったので記事にしました。

## 結論
eager_loadは使用しない！

## なぜ
eager_loadは他のモデルに対して、検索や並び替えを行いたい時に使用します。ですが、groupメソッドを使用するさいはエラーが発生します。

エラーの理由はeager_loadは結合した全ての列を取得してきます。しかしSQLではGROUP BYを使用したときは取得する列として指定できるのは、GROUP BYで指定したものか集合関数を使用したものになります。

## 解決方法
では、他のモデルに対して検索や並び替えを行いたい。でもgroupメソッドも使用したい。そんな時はどうすれば良いでしょうか？ left_joinメソッドを使用してください！
バネの動きをShaderで再現する


![springLightDamping.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/293df065-09f2-9d9d-1d46-3d9977a32a42.gif)


バネの動きを再現するのに，バネ小振動関数 (Spring light damping function) の公式2.8 [1] を使いました．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/d67ad841-d248-a337-72fd-ff5a1570fa93.png)

見た目は↓の感じです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/0ed90f4c-1675-f2fb-9fc5-cdffdaa5bf5b.png)


[Graphtoyで描画したバネ小振動関数](https://graphtoy.com/?f1(x,t)=3.0*exp(-x*0.6/PI)*cos(x*3)&v1=true&f2(x,t)=&v2=false&f3(x,t)=&v3=false&f4(x,t)=&v4=false&f5(x,t)=&v5=false&f6(x,t)=&v6=false&grid=1&coords=10.971303370786517,0.033808988764044756,14.520000000000003) のリンクをたどってグラフを見ることもできます．

実際のHLSLコードは下のような感じです

```HLSL
//
// Reference:
//     George C King, Vibrations and waves, https://himafi.fmipa.unej.ac.id/wp-content/uploads/sites/16/2018/03/vibrations-and-waves-george-c-king.pdf
//
void SpringLightDamping_float(
	float x, float expFrequency, float cosFrequency,
	float amplitude, out float res)
{
    res = amplitude * exp( - x * expFrequency / 2 ) * cos( x * cosFrequency);
}
```

下のリンクには，UnityのShaderGraph用に拡張HLSLコードを書いているので，ぜひご参照ください．

https://github.com/supertask/ShaderLibCore

[1] George C King, Vibrations and waves, https://himafi.fmipa.unej.ac.id/wp-content/uploads/sites/16/2018/03/vibrations-and-waves-george-c-king.pdf
100日でSQLの達人になる@LeetCode! Day4 <union or or>

##595. Big Countries （問題レベル: Easy）
今日の問題はこれ。
Big Countryという基準が人口と面積で２つあってどちらかの条件に合致する場合国名をリストアップする問題。

内容は、```where句```で```or```を使うだけのシンプルな問題。

solutionを見ると、```union```を使う別解もあったがコメントでは```or```の方が早いということ。
そこで今日のポイントは```union```よりも```or```が早い。としよう。
明日もサクッと解いていきたい。

* [LeetCode](https://leetcode.com/)の問題は、MS SQL Serverで解いています。
Ubuntu 電卓 アップデート


UbuntuをアップデートしたらUbuntuアプリストアの電卓の表示がおかしくなった。

コマンドラインから入れ直したらもとに戻った

```sh
sudo apt-get install gnome-calculator
```

<img width="300" alt="Screenshot from 2022-02-05 22-44-30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/0b4444e9-1c32-5de0-bec4-22e877c3fbad.png">

設定画面から書式を自動にしないと計算結果が変になります。
デフォルトだと書式が工学になっている
<img width="300" alt="Screenshot from 2022-02-05 22-55-55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/382a49e5-3cdc-d70b-624a-2bee3c0b52d1.png">
【Go net/http 各メソッド解説】

Goのnet/httpの使い方を理解する必要があったのでまとめてみた。
メモ代わりにする。

## http.ListenAndServe

サーバーを起動するよくあるやつ
・第1引数にPORT番号
・第2引数に**http.Handler**
```golang
http.ListenAndServe(":8080", nil)
```

## http.Handler
ServeHTTPメソッドを定義しているinterface。つまりinterface。

```golang
type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}
```

## http.ServeMux

ServeMux.Handleメソッドを使用して、URLとHandlerの登録ができる。

以下のようにすると/echoURLに対してechoHandlerを登録できる。これによってechoHandlerのServeHTTPメソッドが呼び出されるようになる。

つまり、HandlerInterfaceの実装を第2引数にわたすこととなる。

```go
func main() {
    mux := http.NewServeMux()
    mux.Handle("/echo", echoHandler)
}

type echoHandler struct{}

func (h *echoHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "Hello World")
}
```

## http.HandlerFunc

HandlerFunc型は`ServeHTTP(ResponseWriter, *Request)`が実装されている。

そして、中ではキャストされたもとの関数を呼び出せるようになっているので以下のようにServeMux.Handleの第2引数とすることができる。

hello()をHandlerFunc型にキャストすることでServeHTTPがレシーバーとして勝手についてくる。
レシーバーのServeHTTPは紐付き先を呼び出しているだけ。

この仕組みにより、上記のechoHandlerのような構造体は必要なくなる。

```jsx
type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
    f(w, r)
}
```

```jsx
func hello(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "Hello World")
}

func main() {
    mux := http.NewServeMux()
    mux.Handle("/hello", http.HandlerFunc(hello)) // helloをHandlerFuncにキャスト
}
```

## http.ServeMux.HandleFunc

実装はこんな感じ
第2引数のhandlerを自身のHandleで呼び出している。
http.HandlerFuncでやっていたことが省略して書けるので便利。

```go
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    mux.Handle(pattern, HandlerFunc(handler))
}
```

## MIddlewareのはさみ方

これまでの説明で最終的に`http.ServeMux.handle`になんとかして、http.Handler, つまり**Handler interfaceの実装**を渡してあげればいいことがわかった。

このことから、http.ServeMux.HandleFuncなどから返される**Handler interfaceの実装**を引数にとり、返り値をまたしても**Handler interfaceの実装**としてあげるメソッドを実装すればmiddleware挟むことができる。

参考資料

https://journal.lampetty.net/entry/understanding-http-handler-in-go
初めてのlambda

#概要
簡単なlambda関数を作成し、テストでの引数を渡して関数を実行。
結果の違いを確認してみようと思います。

#手順

1. lambda関数作成
2. ソースコードの挿入
3. テスト
4. テストの実行結果


#詳細内容
ここから上記手順の詳細の設定方法などを記載していきます。

## 1.lambda関数の作成
まずはawsコンソールからlambdaコンソールを表示させ、lamda関数の作成を押します。
![lambda_function.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621314/094dd743-ca60-0a19-fb7b-71c0ca4dca85.png)

* 一から作成を選択
* 関数名：jyankenで登録(名前は自分で自由に決めてください…)
* ランタイム：今回のlambda関数はpythonで書いております。python3.8でお願いします。
右下の「関数の作成」ボタンを押してください。
*関数の作成に少し時間がかかります。その間に関数について説明しておきます。

> 関数： 関数には引数と戻り値があります。(引数はオプションなので無い関数もあります。)
> ***********例****************
> 関数A(引数1,引数2)
> 戻り値 引数1 + 引数2
> ***********ここまで***********

> 上記例の場合、関数Aを動かすときに引数1と引数2が必要です。その結果は
> 引数1 + 引数2で戻ります。
> 引数1・・・1、引数2・・・3の場合は
> 関数Aは4を戻します。



## 2.ソースコードの挿入
コードの画面が表示されましたら下記、ソースコードをコピペしてください。

```python
Pon = {'Gu':'Pa!','Cyoki':'Gu!','Pa':'Cyoki!'}#じゃんけんの勝ちパターンJSON
"""
lambda_handlerは必ずLambdaにあるイベント関数。すべてはここから処理が開始されます。
"""
def lambda_handler(event, context):

     # event['Jyanken']にテストの値が来ます。(JSON形式だから複数の引数設定が可能)
     #Jyankenの値をとりあえずaite変数に入れておく。
    aite:str = event['Jyanken']

    #aiteがPonの中にいる時
    if aite in Pon:#PonのJSONにaite(=Jyanken引数)が存在したら
        #koreda変数にPonから取得した勝ちパターンをセット
        koreda:str = Pon[aite]
    #elseなのでいない時
    else:
        #じゃんけん以外の文字が来たらMaketaを返す
        koreda = 'Maketa!'
    return koreda
```
ソースコードの詳細の説明はコード内部のコメントを読んでください。
内容としては

| lambda関数に渡す値 | 戻り値 |
| :-- | :-- |
| Gu | Pa! |
| Cyoki| Gu!|
| Pa | Cyoki!|
| 上記以外 | Maketa! |
となります。じゃんけんには必ず勝つlambda関数ですがGu,Cyoki,Pa以外が来たら
Maketa!となります。

下図のようにソースコードを挿入したら「**Deploy**」を押してください。
![lambda_function.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621314/5aa7641d-5880-587a-6e1c-3ce00bbeaa47.png)

## 3.テスト
テストを作成します。
テストの作成とは、作成したlamda関数に渡す引数を決めてテストします。
テストタブを押してください。

![lambda_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621314/3c0f7fd1-055f-4986-a393-ef4a0dc1af9a.png)

* イベント名を登録してください。(ponとしていますが自由です。)
* json形式で上記図のように入力してください。
変更を保存を押してください。

# 4.テストの実行結果
![lambda_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621314/3cee83a9-149f-b31f-162f-bace6589065b.png)
「▶詳細」部分を押してください。
黒三角の向きが変わり「▼詳細」になり詳細が表示されます。
結果で"Pa!"が出ていれば成功です。
テスト「pon」の引数でじゃんけんを変更すれば戻り値の値も変わるようになります。
QGISを用いた都道府県境データの作成

#1 はじめに
趣味で、任意の県/市の境目の経度、緯度情報を必要とするアプリをpythonで作成することになりました。便利なAPIやライブラリ等は見つけることができなかったため、国土交通省によって公開されている行政区画データ（シェープファイル）に基づき、作成することにしました。
GISに関しては全くの素人なので、調べるのに結構時間がかかってしまったが、一都道府県程度であれば、下記やり方で30分程度でpythonによる情報読み込みまで行けると思います。今回は、GIS用のソフトウェア（QGIS）を新たにインストールし、シェーププファイル形式で記録された行政区画データから、都道府県/市境のデータを作成する方法しか調べきれなかったのですが、他により簡単な方法があるかもしれません。

記事作成後の追記：
シェープファイルの扱いに慣れている人は、[こちらの記事](https://qiita.com/ty21ky/items/193e316370a8c7122b3c) のやり方にしたがって、県境/市境のデータを取得後、pyshpを用いて特定の市域、県域情報を抽出する、というやり方の方がてっとり早いと思います。

#2 シェープファイル/QGISとは
シェープファイルとは、地理情報など、GISにおいてベクターファイルを扱うためのファイル形式..らしい。国土交通省などのページでも、行政区画情報がシェープファイルで公開されている。シェープファイルについては、[こちらの記事](https://qiita.com/c60evaporator/items/78b4148bac6afa4844f9)がとても詳しい。QGISは、シェープファイルをはじめとしたGIS情報の表示・編集・分析のためのオープンソースソフトウェア。今回は、シェープファイルを読み込み、特定の都道府県、市町村の抽出、書き出すために使う。

#3 具体的手順
##### 3. 1. 必要な都道府県のシェープファイルのDL, QGISのDL/インストール
今回は、愛知県名古屋市の市境抽出をターゲットとして、国土交通省のページから平成２２年版をDLする。
https://nlftp.mlit.go.jp/ksj/jpgis/datalist/KsjTmplt-N03.html#prefecture23

##### 3. 2. QGIS上でフィルタ、dissolve処理
DLした圧縮ファイル内のシェープファイル「.shp」を右クリックし、起動するアプリ選択でQGISを選択し、QGISにファイルを読み込む

1. レイヤ->属性テーブルの表示し、シェープファイルの中身を確認。N03_001列が県情報、N03_004列が市情報であることがわかる。
![スクリーンショット 2022-02-05 18.42.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102065/09d7a106-9b12-6930-a298-259be8b077c7.png)

2. レイヤ->フィルタにより、クエリビルダを開き、N03_001列で名古屋市の情報のみをフィルタする。
![スクリーンショット 2022-02-05 22.11.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102065/d3b7f83a-d04f-4b7d-7d4c-b14619470d17.png)
3. ベクタ -> 空間演算ツール -> 融合（dissolve）を選択。N03_001列でdissolveする。若干、境界領域にゴミのようなものが残っているが、今回はこのまま残すこととする（解決策は、こちらの[ブログ](https://odgu.net/archives/215)に記載がある）。
![スクリーンショット 2022-02-05 22.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102065/a93ae388-485e-f715-9238-46dfd5b8069f.png)

4. レイヤ -> 名前をつけて保存において、形式をESRI Shapefileとして保存。
##### 3. 3. pythonでシェープファイルの読み込み
pyshpライブラリを用いて上で作った.shpファイルを読み込む。

```python
import shapefile

shape_file = "./nagoya.shp"
sf = shapefile.Reader(shape_file, encoding="latin1")
shapes = sf.shapes()
borders = shapes[0].points #bordersに境界の経度、緯度情報が入っている

```

# 他に参考にした記事、ブログ：
https://hayatoiijima.jimdofree.com/2017/11/14/%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C%E5%A2%83%E3%81%AE%E3%81%BF%E3%81%AEshp%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9/
JavaScriptのswitch文

#switch文とは
***if文などの条件分岐をわかりやすくまとめた書き方***です。
switch文をif文と比較するとかなり書きやすいです。

⚫︎条件分岐の資料


#switch文の書き方
書き方を下記に記載します。

>下記の参考資料より引用します。

```js
switch (式){
  case 値A：
    式が値A の場合に実行する処理;
    break;
  case 値B:
    式が値B の場合に実行する処理;
    break;
  case 値C:
式が値C の場合に実行する処理;
    break;
  default:
    式の値がいずれのcaseとも一致しない場合に実行する処理;
}
```

これ以外にもあります。

数値を使う時

```js
switch (a) {
    case 1:
        console.log('aは1です');
        break;
    default:
        console.log('aの値は1ではありません');
}
```

文字列を使う時です。

```js
switch (birthplace) {
    case '東京':
        console.log('出身地は東京です');
        break;
    default:
        console.log('出身地は東京以外です');
}

```

⚫︎資料
https://www.pasonatech.co.jp/workstyle/column/detail.html?p=2624

***こちらの資料に他の書き方も載っているので見てみてください***。

#if文とswitch文の比較
if文とswitch文を比較するとわかりやすいかと思います。

まずはif文です。

```js
const favorite_sports = '野球';

if (favorite_sports === '野球') {
  console.log('野球');
} else if (favorite_sports === 'サッカー') {
  console.log('サッカー');
} else if (favorite_sports === 'バスケ') {
  console.log('バスケ');
} else if (favorite_sports === 'バレー') {
  console.log('バレー');
} else {
  console.log('スポーツ嫌い');
}
//野球と出力
```

続いてswitch文です。

```js

const favorite_sports = '野球';

switch (favorite_sports) {
  case '野球':
    console.log('野球が好き');
    break;
  case 'サッカー':
    console.log('サッカーが好き');
    break;
  case 'バスケ':
    console.log('バスケが好き');
    break;
  case 'バレー':
    console.log('バレーが好き');
    break;
  default:
    console.log('スポーツ嫌い');
}

//野球が好きと出力
//breakがないと処理が余計に走ります。
```
⚫︎注意点
breakがないと処理が余計に走ります。
もしconsole.log('野球が好き');の下のbreakがないと
野球を出力させたいのにサッカーから下まで全部処理が走ります。
AppStreamからメタデータをダウンロードできないときの対処法(CentOS8)

先日から急にyumやdnfでパッケージがダウンロードできなくなってしまい、そのときの対処法のメモ。
## 状況　　
yum,dnfでパッケージインストール時「Failed to download metadata for repo 'appstream'」といったエラーが出てリポジトリからパッケージを落とせなくなってしまった。
「yum update」でも同様。。。

```bash 
$yum update
Failed to set locale, defaulting to C.UTF-8
CentOS Linux 8 - AppStream                                                           60  B/s |  38  B     00:00    
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
```

## 解決方法
CentOS8のEOLにより元々のリポジトリが使えなくなってしまったとのこと。
リポジトリのURLを書き換えると再度インストールできるようになる。

```bash
$sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*;
$sed -i 's|mirrorlist|#mirrorlist|g' /etc/yum.repos.d/CentOS-*; 
$yum update
Failed to set locale, defaulting to C.UTF-8
CentOS Linux 8 - AppStream                                                          569 kB/s | 8.4 MB     00:15    
CentOS Linux 8 - BaseOS                                                             404 kB/s | 4.6 MB     00:11    
CentOS Linux 8 - Extras                                                             6.1 kB/s |  10 kB     00:01    
Dependencies resolved.
~~
~~
```

- 書き換え前　　

```bash
$cat /etc/yum.repos.d/CentOS-Linux-AppStream.repo 
# CentOS-Linux-AppStream.repo
#
# The mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client.  You should use this for CentOS updates unless you are
# manually picking other mirrors.
#
# If the mirrorlist does not work for you, you can try the commented out
# baseurl line instead.
[appstream]
name=CentOS Linux $releasever - AppStream
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
$
```

- 書き換え後

```bash
$cat /etc/yum.repos.d/CentOS-Linux-AppStream.repo 
# CentOS-Linux-AppStream.repo
#
# The #mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client.  You should use this for CentOS updates unless you are
# manually picking other mirrors.
#
# If the #mirrorlist does not work for you, you can try the commented out
# baseurl line instead.

[appstream]
name=CentOS Linux $releasever - AppStream
#mirrorlist=http://#mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
baseurl=http://vault.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
$
```

## 参考
https://stackoverflow.com/questions/70930615/no-urls-in-mirrorlist-with-yum-on-centos-due-to-appstream
VS codeのアクティブエディタの色を変更する

VS codeが素晴らしいので使用しているのですが、コーディング中に複数ファイルを開きますよね。
その際にエディターのアクティブタブがどれかわからなくなることが多々あり、色を変更するための備忘として本記事を残しました。
まずは結果を以下に載せます。

## 変更前:
パッとみてどれがアクティブかわかりませんね。。。スプリットビューにしていたりすると尚更です。
![ 2022-02-05 21.59.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169015/2841134b-13a4-0643-b1bd-074cb48c81bb.png)

## 変更後:
気分で　#483D8B　を私は選びました。うーん。わかりやすい。
![ 2022-02-05 22.07.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169015/fe489526-169a-7bfe-48ab-16d0e37e2734.png)

## 変更方法:
Macなら［Command］＋［Shift］＋［P］キーでコマンドパレットを開いて"setting.json"と入力し、開いてください。
そこで"workbench.colorCustomizations"があるかどうか検索してください。私はそもそも存在しなかったので以下のように追記しました。

```json
"workbench.colorCustomizations": {
        "tab.activeBackground": "<write your favorite color>"
}
```

後は保存するのみ。知っていれば簡単ですね。これでもうわからなくなることはないはず。
removeAllViewsが機能しない？

#作ろうとしたもの
![20220205_160339.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520713/f0da8f80-34ba-3acc-c243-639444372474.gif)
このようにボタンが跳ね返る動きを作りました。始めるのボタンを押すたびに新しいviewを追加して動かすことをしています。その際以前のviewを消すためにframeLayout.removeAllViews();を使用してすでに入っているviewを消そうとした。
#問題
frameLayout.removeAllViews();でviewを消すと見かけ上はviewを消すことができたが動画のように別のViewが存在するかのように動きがおかしくなった。これはframeLayoutの中にあるviewの座標を取得して跳ね返るようにしていたためだ。
具体的にはこのような感じでframeLayoutの中身を取得していた。

```java
for (int i=0;i<frameLayout.getChildCount();i++){
    frameLayout.getChildAt(i);
}
```

![20220205_160253.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520713/9e9e335f-70e5-e07b-ef03-2aced70345ba.gif)

removeAllViewsではviewの情報までは消し切れていない？と考えられる。
#解決
frameLayoutのなかに新しく作ったframeLayoutを入れてその中にviewを入れることで解決した。もちろん始めるボタンを押した際には親frameLayout.removeAllViews();をし新しく子frameLayoutを作り追加した。
#感想-宣伝-
初心者のころ作ったゲームのコードがあまりにもメンテナンスしにくかったのでリメイクしたときに詰まった部分です。

このゲームが収録されたゲームです。
よかったら遊んでみてください。
https://play.google.com/store/apps/details?id=com.nisinis.brainbreak
jpeg画像加工プログラムを書きたい

#c言語で画像加工プログラムかいてみる
注意！この投稿者（私）は何もかも知らない初心者です

##機能
　jpeg の画像を読み込んで加工して別フォルダに保存する（←理想）

##環境
　わからん（何を書けばいいか）
##手順（内容）
　1.インストール
　2.調整
　3.コードかく
##1.インストール
　調べてみたところ jpeg 画像を加工するには色々準備する必要がある
　インストールするものがあるサイトはここから↓
　http://onestep.air-nifty.com/blog/2007/01/vcjpeg_0e77.html
　（古すぎ）
　ここに飛んでjpegsr6.zip をダウンロードするらしいです・・・
　ないね・・・
　更新されているのかなんかでないね、file に飛んでみると jpegsr6b.zip という
　似たような奴があるからこれをダウンロードすることにします。
　解凍して、適当なところに置いておきましょう。
##2.調整
　このままではうまく噛み合わないのか知らんけどできないらしいです。
　なので先ほどのサイトの[Independent JPEG GroupのJPEG Softwareを使おう Step1](http://www.wince.ne.jp/frame.asp?/review/kappy/tips3.htm)
　に飛んで色々調整します。
　見たところ自分がダウンロードしたのが正解だったみたいです。（よかった）
###step1.解凍したら必要なファイルを選び出そう
　使うも使わないものがあるので選ぶみたいです。
　一応貼っておきます。
　![取り出すファイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302319/bcfbb649-7585-6b62-0914-39a39114b043.png)
　すごく大変ですねショートカットとあるのかもしれないですがそんなこと
　わからないので、私はちまちま分けていきます。
　こんな感じでいいのかな？
　![あってるの？.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302319/fe16fae5-3853-d4c2-04ad-91b3d8a7386e.png)

###step2.リネーム、コード書き込み、コメントアウト
　1.選別した中の jconfig.vc を jconfig.h にリネームします。
　2.リネームした jconfig.h にこの３文を追加します

```
#include <Windows.h>	
#define NO_GETENV	
#define XMD_H		
```

　3.次は jmorecfg.h の変更です。次の部分をコメントアウトします。

```
//この変更はビルド時には必要なくてもできるが、ライブラリ使用時の為に最初からいれてあります。
#if 0  //Kappy@WindowsCE FAN removed  #ifを使ってコメントアウトしました。
#ifdef NEED_FAR_POINTERS　//これらは68系Mac, DOSや16bit Windowsの頃の名残ですね。年がバレル!? (^^;
#define FAR  far          //MPWやMSCつかってました.....
#else
#define FAR
#endif
#endif
```
場所はここらへん
![場所はここら辺.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302319/923a80d6-09a5-f9e3-4ce8-ee96c96d769b.png)
　4.引き続き jmorecfg.h の変更

```
//+++++ kappy@WindowsCE FAN Changed
//#define RGB_RED		0	/* Offset of Red in an RGB scanline element */
//#define RGB_GREEN	1	/* Offset of Green */
//#define RGB_BLUE	2	/* Offset of Blue */
//#define RGB_PIXELSIZE	3	/* JSAMPLEs per RGB scanline element */
#define RGB_RED	　2	//１ピクセルのデータはＢ→Ｇ→Ｒとバイトデータが並びますという意味
#define RGB_GREEN	　1
#define RGB_BLUE	　0
#define RGB_PIXELSIZE	3 //１ピクセルのデータは３バイトですという意味
//---


```
　場所は
　![場所は.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302319/67ea5f66-afc7-73d0-f6d1-73e6e3148de1.png)

　5.ソースファイル拡張子の変更
　　DOSプロンプトというものを使って拡張子を変えるらしいです（なにそれ）
　　調べたらコマンドプロンプトのこと？だと思う。
　　やってみよう。
　　![おしまい.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302319/8f06a133-9f11-e0ac-f3e8-c56efe5fd89b.png)

　End....

  何がダメなのかすらわかりません調べてきます。
ServiceNow のこらからのAngularJSサポート

#本資料の目的
1 .ServiceNowではAngularJSを利用している
1. AngularJSのサポートは2022年1月1日に終了
本資料の目的に上位条件の中、ServiceNowはどのようにこらから対応するのかを調べた結果

#これからのServiceNowのUI
1. ServiceNowはAngularJSをフォークして利用している
1. 当分の間は自社でサポートする。セキュリティパッチなどもServiceNowで行う

関連ページ
https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB0965345

San Diegoから新しいUI　(UIB）に移行す検討するが推奨されています。（21:16）
https://www.youtube.com/watch?v=wuli92FRGC0

そのためにもApp Engine Studio (AES)を勉強して置いた方がよい。

余談、
Romeの次はSan Diego。その次はTokyoになる。（5:16）

以上
[Note] A Tour of Go -Basics(2)-

# Using the tour

`A Tour of Go`とは
`Go`言語の最も重要な機能について説明するtourです。

https://go.dev/tour/list

## Basics - Flow control statements: for, if, else, switch and defer

### For

`for`ループはセミコロン`;`で3つの部分に分かれています。

1. init statement
2. condition expression
3. post statement

ループは、`condition expression`が false となった場合、停止します

```Go
func main() {
	sum := 0
	for i := 0; i < 10; i++ {
		sum += i
	}
	fmt.Println(sum)
}
```

初期化と後処理ステートメントの記述は任意です。

### For is Go's "while"

`init statement`と`post statement`の記述は任意、`;`も省略できます。
そうすることで、`while`は、`Go`では`for`だけを使います。

```Go
func main() {
	sum := 1
	for sum < 1000 {
		sum += sum
	}
	fmt.Println(sum)
}
```

### Forever

`condition expression`も省略すれば、`infinite loop`になります。

```Go
func main() {
	for {
	}
}
```

### If

 `if`は、`for`と同様に、`()`は不要で、`{}`は必要です。

```Go
func sqrt(x float64) string {
	if x < 0 {
		return sqrt(-x) + "i"
	}
	return fmt.Sprint(math.Sqrt(x))
}
```

### If with a short statement

`if`条件の前に、statementを書くことができます。
ここで宣言された変数は、`if`のスコープ内だけで有効です。

```Go
func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	}
	return lim
}
```

### If and else

`if`statementで宣言された変数は、 `else`ブロック内でも使うことができます。

```Go
func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	} else {
		fmt.Printf("%g >= %g\n", v, lim)
	}
	// can't use v here, though
	return lim
}
```

### Switch

`Go`では選択された`case`だけを実行し、それに続く全ての`case`は実行されません。

もう一つの違いは
`Go`の`switch`の`case`は定数である必要はなく、 
関係する値は整数である必要もないということです。

```Go
func main() {
	fmt.Print("Go runs on ")
	switch os := runtime.GOOS; os {
	case "darwin":
		fmt.Println("OS X.")
	case "linux":
		fmt.Println("Linux.")
	default:
		// freebsd, openbsd,
		// plan9, windows...
		fmt.Printf("%s.\n", os)
	}
}
```

### Switch evaluation order

`switch`は、上から下へ`case`を評価します。 
`case`の条件が一致すれば、そこで停止(自動的にbreak)します。

```
switch i {
case 0:
case f():
}
```

i==0であれば、 case 0でbreakされるため`f`は呼び出されません。

### Switch with no condition

条件のないswitchは、`switch true`と書くことと同じです。

この`switch`の構造は、`if-then-else`のつながりをシンプルに表現できます。

```Go
func main() {
	t := time.Now()
	switch {
	case t.Hour() < 12:
		fmt.Println("Good morning!")
	case t.Hour() < 17:
		fmt.Println("Good afternoon.")
	default:
		fmt.Println("Good evening.")
	}
}
```

### Defer

`defer`へ渡した関数の実行を、呼び出し元の関数の終わり(returnする)まで遅延させるものです。

```Go 
package main

import "fmt"

func main() {
	defer fmt.Println("world")

	fmt.Println("hello")
}

```

```zsh:output
hello
world
```

### Stacking defers

`defer`へ渡した関数が複数ある場合、その呼び出しはスタック`stack`されます。 
呼び出し元の関数がreturnするとき、渡した関数は`last-in-first-out`の順番で実行されます。

```Go
package main

import "fmt"

func main() {
	fmt.Println("counting")

	for i := 0; i < 10; i++ {
		defer fmt.Println(i)
	}

	fmt.Println("done")
}
```

```zsh:output
counting
done
9
8
7
6
5
4
3
2
1
0
```
Matlab coderでraspberrypi

#環境
MacBookPro16
matlab R2021b
MATLAB Support Package for Raspberry Pi Hardware version 21.2.0
raspberry-pi 3B+

#MATLAB Support Package for Raspberry Pi Hardwareのインストール
「Support Package for Raspberry Pi Hardware」をmatlab「ハードウェアサポートパッケージの入手」からにインストールする。

#　MATLABのアドイン設定：　「ハードウェアセットアップ」を使用してイメージの入手
1.Piのボード種類を適当に選択して、「次へ」。
2.Piのイメージを入手するために、Select Linux Operationg Systemで、
I want to:
 Setup hardware with MathEorks Raspbian imageを選択して、「次へ」
3.ダウンロードするイメージの「Download」ボタンを押すか、Githubへのリンクをクリックして、手動でダウンロード。
「次へ」
4.先に入手したイメージファイルを検証すると、
「~/Documents/MATLAB/SupportPackages/R2021b/raspbian/mathworks_raspbian_R21.2.0/」に展開したファイルが保存される。
ちなみに、mathworks_raspbian_R21.2.0.img は(busterベース)
これ以降のイメージ作成は失敗するので、「キャンセル」

https://github.com/mathworks/Raspbian_OS_Setup/releases

# SDの作成
Macの場合、
~/Documents/MATLAB/SupportPackages/R2021b/raspbian/mathworks_raspbian_R21.2.0/mathworks_raspbian_R21.2.0.img (busterベース)
をSDカードに焼くだけ。

必要なものは全て入っている模様。

RaspberryPi Imagerの v1.7でsdカードを作ると、consoleが開けない。safeモードになる。
v1.6.2はOK

# piの設定
1.焼いたSDで起動する。
2.ファイルシステムの拡張を「raspi-config」で行う。
3.再起動後、ネットワークなどを設定。

#coder向けにスクリプトの作成。
関数命の直後にコード変換プラグマを記述
``function 関数名() %#codegen
   r = raspi;
 ...
 ...
end``

#動作確認
コマンドウィンドウで
1.「run 関数名」で動作確認
2. board = targetHardware('Raspberry Pi')
　　boardのプロパティを変更する場合は
　　　board.DeviceAddress = '173.21.22.327'
3. deploy( board, '関数名')

piにコピーされたelfファイルはダイレクトに実行可能
キレイなMonkeypatchを書きましょう！（Gemの内容を別のGemでMonkeypatchした話）

# RubyのMonkeypatchとは？

身近な言葉のモンキー・パンチ、ではなく、パッチですね。
MonkeypatchはRubyでクラス・モジュールを開いて、その一部・もしくは全部を書き換えるということです。
Rubyの最大の魅力点でもありながら、あまりやらない方がいいとも言われています。

実はRailsに入っているActiveSupportというものがあって、その中にはMonkeypatchがいっぱい集まっています。
Twitter上でこれがいいことかどうかについて時々炎上しています。

### Stringクラスで簡単な例

```ruby
class String
  def neko
    replace "cat"
  end
end
cat = "neko"
cat.neko
cat
# => "cat"

module CatHelper
  def neko
    replace "neko"
  end
end

String.prepend CatHelper
cat = "neko"
cat.neko
cat
# => "neko"

# String.include での結果も試してみて！
```

なので、安全にモンキーパッチングを楽しみましょう！

### Monkeypatchを利用した時の話


さきほど翻訳機能をStringに入れるGem, [sampokuokkanen/ActiveTranslateSelf](https://github.com/sampokuokkanen/ActiveTranslateSelf)にI18nバックエンドとしてDBを使っている場合、
翻訳がない場合は自動的に翻訳するという機能です。パッチででこのGemの中のメソッドを変えたかったです。

最初は以下のような感じで書こうと思っていました：

```ruby
module I18n
  module Backend
    class ActiveRecord
      module Missing
        def store_default_translation(locale, key, interpolations)
          translation = ActiveRecord::Translation.new locale: locale.to_s, key: key
          default = I18n.t(key, locale: I18n.default_locale
          translation.value = default.public_send "to_#{locale}" if default.respond_to?("to_#{locale}")
          translation.interpolations = interpolations
          translation.save
        end
      end
    end
  end
end
```

ただ、これだと結構見にくいですし、フォルダー構成も結構奥まってしまいますし、あまりキレイではないです。
余談ですが、
Railsの中だとActiveRecordはモジュールとして定義されていて、ここだとクラス、ということでもZeitwerkに怒られていましたが。￥

どうやってもっとキレイに書けるかというと、`prepend`を使います。
（今まで正直あまり`prepend`使ってなかったです）


モジュールを呼び出す前に、モジュールの中を一部差し替えたいので、こちらのパッチは以下のように定義します：

```ruby
module ActiveTranslateSelf
  module Missing
    def store_default_translation(locale, key, interpolations)
      translation = I18n::Backend::ActiveRecord::Translation.new locale: locale.to_s, key: key
      # デフォルトに設定されている言語の翻訳から訳します
　　　 default = I18n.t(key, locale: I18n.default_locale)
      # ここで実際に値を訳しています
      translation.value = default.public_send "to_#{locale}" if default.respond_to?("to_#{locale}")
      translation.interpolations = interpolations
      translation.save
    end
  end
end
```
ネームスペースも自分のGem配下になっていて、かなりわかりやすいかと思います。

では、実際にパッチを適用しましょう！

```ruby
I18n::Backend::ActiveRecord::Missing.prepend ActiveTranslateSelf::Missing
I18n::Backend::Simple.include I18n::Backend::ActiveRecord::Missing
```

`prepend`使っているので、どの段階でどこが変わっているのがわかりやすいかと思います。

### 面白いので仕事のRailsアプリでも活用しよう！・・・というわけにはいかない

結構責任も問いますので、普通にRailsをやている時はほとんど必要になることはないかと思います。
Gemアップデートの時に壊れやすくもなりますので、あまり使いたくいないです。

他にやり方があれば、Monkeypatchは避けましょう！
誘惑に負けないことです！
公式ホームページのIntro to Vue 3クラス3 (Attribute Binding)

## 3. Attribute Binding

>クラス https://www.vuemastery.com/courses/intro-to-vue-3/attribute-binding-vue3

まずは、VS Codeから該当フォルダを選択して、開きます。その後に、配下のgit部分をクリックして、ブランチをL3-startへ入れ替えてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516328/931164da-db8b-f392-a036-c2f52bdf9bd7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516328/a975700f-ee2e-4bef-d0cb-ce94d0de78ae.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516328/bde5624f-4ae3-bdd6-c122-940e7bcc50fd.png)
今日の重要ポイントは属性を入れることですね。

```html:index.html
<div class="product-image">
  <!-- image goes here -->
</div>
```

```javascript:main.js
const app = Vue.createApp({
    data() {
        return {
            product: 'Socks'
        }
    }
})
```
main.jsにimageデータを入れます。

```javascript:main.js
const app = Vue.createApp({
    data() {
        return {
            product: 'Socks',
            image: './assets/images/socks_green.jpg'
        }
    }
})
```
その後にindex.htmlのイメージを入れてくださいと言うコメント部分にイメージタグを入れましょう。

```html:index.html
<div class="product-image">
  <img src="image">
</div>
```
Vue app’sのデータを直接に入れるためにはv-bindを使います。直接に入れたい属性の前に「v-bind:」を付けます。

```html:index.html
<div class="product-image">
  <img v-bind:src="image">
</div>
```
v-bindはよく使われるものなので、以下のように諸略することも可能です。

```html:index.html
<div class="product-image">
  <img :src="image">
</div>
```
今回の課題は
urlデータオブジェクトの追加とanchor tagのhrefにバインドすることです。


<details>
<summary>課題確認</summary><div>

```html:index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Vue Mastery</title>
    <!-- Import Styles -->
    <link rel="stylesheet" href="./assets/styles.css" />
    <!-- Import Vue.js -->
    <script src="https://unpkg.com/vue@3.0.11/dist/vue.global.js"></script>
  </head>
  <body>
    <div id="app">
      <div class="nav-bar"></div>
      
      <div class="product-display">
        <div class="product-container">
          <div class="product-image">
            <img v-bind:src="image">
          </div>
          <div class="product-info">
            <h1>{{ product }}</h1>
            <!-- solution -->
            <h2>anchor : <a :href="anchorUrl" target="_blank">{{ anchor }}</a></h2>
          </div>
        </div>
      </div>
    </div>

    <!-- Import App -->
    <script src="./main.js"></script>

    <!-- Mount App -->
    <script>
      const mountedApp = app.mount('#app')
    </script>
  </body>
</html>
```

```javascript:main.js
const app = Vue.createApp({
    data() {
        return {
            product: 'Socks',
            image: './assets/images/socks_green.jpg',
            // solution
            anchor: 'phjg81',
            anchorUrl: 'https://qiita.com/phjg81'
        }
    }
})

```
</div>
</details>
AIシステムトレード開発　野望編

前回、為替チャートをVGG-16で分類という検討を進めたが、やはり何か腑に落ちない点が多い
https://github.com/chanmoto/eurusd_forex_vgg16

https://qiita.com/EasyCording/items/25fdec1d1f2305c621c9

#問題点
　そもそも画像で認識するタスクというのは、物の識別には使えるが、これはあくまで人間が見て判断できるデータである。つまり、それなりの特徴を有しているが故に分類ができるのである。今回の為替チャートに関しても、チャートの特徴は分類できたとして、その先の未来情報などは、そもそも引き出せるのであろうか？
　次の疑問としては、そもそも折れ線グラフのように平面上に書かれた図形を、２Ｄ図面で分類したところで、それが時系列データの特徴に十分反映されているのだろうか？

#思考すべき点
　やはり為替データは時系列に変動する波動のようなものであり、やはり数値データを直接的に反映したデータ形態をとる必要がある。今回のVGG-16のアプローチをとるのであれば、やはり横から見るのではなくて、山の等高線のように上から俯瞰しなくてはならないのでは、ないだろうか？
　そこで、自分が過去に書いたブログ記事に辿り着くのであるが、やはり為替相場というものは、一種の山登りのようなものなのである。
　http://1969681.blog66.fc2.com/blog-entry-163.html

>山です。
>チャートというのは山みたいなもので、相場と言うのは
>実に登山みたいなものなのです。
>目の前に立ちはばかる、マーケットという山に、トレーダは勇敢に立ち向かっているのです。
>山の上にはいったい何がありますか？
>もちろん。。。
>お金
>・・・非常に現実的ですが、大事だと思います。
>夢
>・・・いいですね、頂上を目指して夢が膨らむ、そんな感じです。
>野望
>・・・天下統一という野望を抱いていた時代もありました。
>いろんな欲望を目指して上っていくんですね。
>山へと向かって。
>山に登るって言っても、常に上っていくだけやないやろー
>って、野次馬の声が聞こえてきました。
>分かりました、下がる場合ですね。
>そのときは、海にもぐるのか、地底にもぐるのかは知りません。
>とりあえず地下の難所に、果敢にチャレンジしている
>冒険を想像してみてくださいな。。。
>なぜ、このような例えをしたかというと、
>最近、山に登るのが趣味だからです。
>って、そんなことかいな?
>いーえ、違います。
>山に登るのは、人間が常に抱いてきた大きな夢だからです。
>さて、山に登ると言っても、山は実は最初は見えないんです。
>盲目の登山家ということでしょうか？
>今後の先行きが分からないからでしょうか？
>どっちでも構いませんが、最初は見えなかったものが、
>ちょっとずつ進むたびに見えてくるのです。
>つまりですねえ。。。。
>チャートというのは、「結果」なんですね。
>ただし、「結果」といっても「偶然の結果」ではなく、「当然の結果」なのです。
>この場合の原因とは、ずばりいえばファンダメンタルですね。
>そういう山だったんですよ、もともとが・・・・
>もともと決まっている山に対して、夢を抱いて
>勇敢に立ち向かう登山家がたくさん押し寄せて
>お祭りのような状態なんですよね。
>過度の期待、夢、欲望、などなど・・・・
>ただなんとなく、後になって、
>この山はあそこが頂上だったんだなあ・・・　とか、
>結構低い山だったなあ・・・　とか
>みんな夢をおっかけてたんだな・・・って
>思い返すんですよね。
>チャートとはそんな、人の欲望の足跡、みたいなものです。

#アプローチ
　ただし、今回はVGG-16に乗りかかった部分もあるので、大きく方向転換せずに、データの入力形式を変えることにする。
イメージ的には、チャートをValueにして2次元配列という形で、マッピングをしてみようかと思う。
こんな感じで、Ｘ、Ｙに価格をとり、掛け算でマッピングするイメージ。データは０－１で正規化させると、濃淡画像になるだろう。
RGBのチャンネルも活用したいので、HI,LOW,CLOSEの３つを重ねてはどうだろうか・・・


          1 3  4  3  5
         ---------------
       1 | 1 3  4  3  5 
       3 | 3 9  12 9  15
       4 | 4 12 16 12 20
       2 | 2 6  8  6  10
       5 | 5 15 20 15 25
Home Assistant サーバーを Amazon Alexa と統合する

「RaspberryPi に Home Assistant 入れて Lチカするまで」
https://qiita.com/nanbuwks/items/f1a13331b757c74346da
では、Home Assistant サーバーを作り、エンドデバイス代わりにサーバにつなげたLEDをON/OFFするところまで行いました。

次に手持ちのAmazon Alexa と統合し、サーバにつなげたLEDを音声でON/OFFしてみます。

# 環境

- Raspberry Pi Model B
- Home Assistant core-2022.2.1 インストール種別	Home Assistant Container
- Amazon Echo Plus (エコープラス) 第2世代 - スマートスピーカー with Alexa

# 方法

Amazon Echo のエンドデバイスとして Home Assistant のエンドデバイスを登録するやりかたとしては、以下の三つの方法があるようです。

- Home AssistantCloud を使用する
- カスタム Alexa skill を作製する。
- Philips HUE のエミュレーションを行う


また、今回の目的とは異なりますが Amazon Echo を Home Assistant のエンドデバイスにするやりかたもあるようです。
「custom-components/alexa_media_player: This is a custom component to allow control of Amazon Alexa devices in Home Assistant using the unofficial Alexa API.」
https://github.com/custom-components/alexa_media_player

今回は、 Home AssistantCloud を使用してみます。

# Home AssistantCloud

有料ですが、一ヶ月は無料です。

NABU CASA 
https://www.nabucasa.com/
にアクセスし、アカウントを作成してログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/de1ed91e-409c-0e25-83cf-da7ecdc3da13.png)

Home Assistantより、
「設定」-「Home Assistant Cloud」-「Alexa」を選び「AlexaのHome Assistantスキルを有効にする」をクリックしてみると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fe93463f-159c-5a07-c6bd-156695a56de7.png)

はて、謎の言語でアクセスしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2dc152ee-785c-f19a-b5b7-80e46a1e9302.png)
改めて、Amazon.jp から Home Assistant を探して「有効にする」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1eadc107-1aa6-d316-abf2-28c2a3638db3.png)
先程のアカウントを入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/02d501d8-63a7-b704-47ff-7a0bffe8be6a.png)
進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e3a0c7d9-98c1-4926-2f3a-9ed6235bc9ff.png)
いずれかを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f4f43da0-79a2-8b7e-c8f0-1ae84c985c66.png)
そうすれば、GPIO0がみつかり登録されました。

「Alexa, GPIO0 を点けて」と言うと点灯しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/77a2f118-19a4-e4ce-8bd0-eee6a5814959.png)
ElastiCache for Redis を構築する前知識

ElastiCache for Redisの構築を依頼されました。
インメモリで、EC2とDBの間にキャッシュとして利用したり、EC2をステートレスに扱う為のセッション保存などに利用できるということは知っているくらいで、いざ構築しようとしても、「ノード、シャード、クラスターってなんでしょね。」ってなりました。

BlackBeltとか読んでみたんですが、よくわかんねー。
その他、ググってもイマイチよくわかんねー。
ってなってたのですが、これが一番わかりやすかったですね。
#### 要点整理から攻略する『AWS認定 データベース-専門知識』
https://tech.nri-net.com/entry/2021/06/02/085824

（4か月前にDBS取得した時に購入して読んでいたはずなのにその後、4つくらい資格とって本の存在も学んだ知識も既に忘れていた）

### 私なりに理解した点をメモ（構築手順までは記載していません）

### 登場物
・ノード・・・最小単位。データが保存される場所。
・シャード・・・複数ノードの集まり。プライマリノードは１つ。レプリカノードが０以上。シャード内のノードは、プライマリノードからレプリカノードにレプリケートされる（1シャード内のノードに存在するデータは全て同じ）
・クラスター・・・複数シャードの集まり。クラスターに向けて書き込み指示がきたらシャードが複数ある場合は分散して書き込まれる。

#### 構築の仕方は？
以下、3つのパターンがある
1. シングルノード・・・シャードなし、単一ノード
2. クラスターモードが無効　・・・シャードは１つ。シャード内に、プライマリノード１つ、レプリカノードが１つ以上（最大５つまで）。エンドポイントはプライマリ用、レプリカ用の２つが存在。
3. クラスターモードが有効　・・・シャード複数。１シャード内。シャード内に、プライマリノード１つ、レプリカノードが１つ以上（最大５つまで）。エンドポイントは１つ。

この辺りの詳細は、
・Amazon ElastiCache for Redis でクラスターモードを使用する
https://aws.amazon.com/jp/blogs/news/work-with-cluster-mode-on-amazon-elasticache-for-redis/
に記載されている。


#### スケーリングは？
クラスターモードで作成した場合は、以下のアプローチがある。
1. 書き込みを改善
・シャードを追加
・ノードタイプ(EC2でいうインスタンスタイプみたいなもの）を変更
2. 読み込みを改善
・ノードを追加
・シャードを追加
・ノードタイプ(EC2でいうインスタンスタイプみたいなもの）を変更

因みに、5.0.4以上バージョンであれば上記はどれもダウンタイムなしで変更可能みたい。

また、最近AutoScallingもサポートされました。
・Elasticache for RedisでAutoScalingを利用できるようになりました
https://dev.classmethod.jp/articles/autoscaling-elasticache-for-redis/

### 費用
EC2やRDSのように停止できない。停止させたいなら削除になる。
ノードタイプ「cache.t3.micro」で、2022.02.05現在の価格だと東京リージョンだと0.026USD。1ノードで月額約20USD。

### でどうする？
ノード、シャードの両方の追加が可能なクラスターを有効化した構成にする。クラスターだとエンドポイントは１つでそこにアクセスすればAWSさんが良しなにやってくれる。ノードが死んでも生きてるノードからまたノードを作成し自動復旧。
一旦最安で、ノードタイプ「cache.t3.micro」でノードは２つ。AZを分けて配置。シャードは1つからスタートしてみることにしました。 

#### 構築後の稼働確認
Nginx + PHPから使う想定で、以下を参考に稼働確認
https://aws.taf-jp.com/blog/38956


### ■その他参考資料
・AWS Blackbelt 
https://d1.awsstatic.com/webinars/jp/pdf/services/20171214_AWS-Blackbelt-ElastiCache.pdf
・ElastiCacheは良いサービス！！特徴や使い方をおさらいしましょ！
https://dev.classmethod.jp/articles/elasticache-is-very-good-lets-review/
・RedisとElastiCacheを分かりやすくまとめてみた
https://qiita.com/gold-kou/items/966d9a0332f4e110c4f8
・レプリケーション: Redis (クラスターモードが無効) 対 Redis (クラスターモードが有効)
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/Replication.Redis-RedisCluster.html
CloudFront+S3で静的Webサイトを公開する時の話

Webサーバ上で動いていた静的WebサイトをS3の静的Webサイトホスティングへ移行したい。更にCloudFrontも使いたい。。。でもあれ、静的Webサイトホスティングを有効にしなくてもCloudFront経由でWebサイト動きそうってなって。でも移行してみたらリンク押しても他のページに遷移しない（サイトの作りによる）などあって結局、静的Webサイトホスティング有効にしたら動くようになって。でも静的WebサイトホスティングのエンドポイントをCloudFrontオリジンに指定したらオリジンアクセスアイデンティティ(以下OAI)が使えなくなって。S3に直接アクセスさせず、CloudFront経由に絞りたいけど、S3のバケットポリシーでIP制限しようと思ったら、CloudFrontのエッジサーバのIPが動的に変わるし。。みたいな事になったので整理ついでにメモ。

結局、調べたいことはココに全部書いてあった。
#### CloudFront を使用して、Amazon S3 でホストされた静的ウェブサイトを公開するにはどうすればよいですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudfront-serve-static-website/

##### REST API エンドポイントとウェブサイトエンドポイントって何？
1．REST API エンドポイント　　・・・バケット作成したら絶対あるS3エンドポイント
　　＜例＞ https://[S3バケット名].s3.[リージョン].amazonaws.com/
2．ウェブサイトエンドポイント　・・・静的Webサイトホスティングを有効にした場合に払い出されるエンドポイント
　　＜例＞ http://[S3バケット名].s3-website-[リージョン].amazonaws.com/　
  　　　　※ウェブサイトエンドポイントは「HTTP」
###### ■Amazon Simple Storage Service エンドポイントとクォータ
https://docs.aws.amazon.com/ja_jp/general/latest/gr/s3.html

##### 何が違うの？
###### ウェブサイトエンドポイントと REST API エンドポイントの主な違い
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/WebsiteEndpoints.html#WebsiteRestEndpointDiff

私はこれを読んでも？ってなったので。
具体的には静的Webサイトホスティングにしないといけない理由にはこんなことがあるようで。
##### Amazon S3 + Amazon CloudFrontでWebサイトを構築する際にS3静的Webサイトホスティングを採用する理由
https://dev.classmethod.jp/articles/cloudfront-with-s3-hosting/

S3のRESTAPIエンドポイントをオリジン指定した場合は、OAIで制限できる。
でも、静的Webサイトホスティングのウェブサイトエンドポイントをオリジンに指定OAIは使えなくなる。この為、直接CloudFront以外からS3ウェブサイトエンドポイントへのアクセスをどうやって制限するかを考える必要がある。

思いついたのは、S3のバケットポリシーでCloudFrontのエッジサーバのIPアドレス制限。でも、IPアドレスは公開されているが、動的に変わる。。。。しかも制限できたとしても、他のアカウントでCloudFrontディストリビューションを作成して、静的WebサイトホスティングのS3指定されたら、アクセス可能だなと。
###### ■CloudFront エッジサーバーの場所と IP アドレス範囲
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html
###### ■CloudFront エッジサーバのIPアドレスの取り出し方
https://www.xn--ebkc7kqd.com/entry/aws-ip-ranges

じゃあどうする？で、またここに戻る。
#### CloudFront を使用して、Amazon S3 でホストされた静的ウェブサイトを公開するにはどうすればよいですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudfront-serve-static-website/
⇒「アクセスが Referer ヘッダーで制限されたオリジンとして、ウェブサイトのエンドポイントを使用する」
オリジンのカスタムヘッダーにRefererで秘密の値を指定。S3のバケットポリシーでRefererに秘密の値が設定されている場合のみアクセスさせることでCloudFront経由に制限。
ただ、Refererに指定した値が漏れるとRefererヘッダーを書き換えればアクセスできてしまうので、やっぱ静的Webサイトホスティングじゃなく、OAIが使えるREST API エンドポイントにしたいところ。

でも、Rest APIエンドポイントにした場合、index.htmlに転送されないなどあるようで、そんな時はLambda@Edgeを使う必要があるそう。
###### ■できた！S3 オリジンへの直接アクセス制限と、インデックスドキュメント機能を共存させる方法
https://dev.classmethod.jp/articles/directory-indexes-in-s3-origin-backed-cloudfront/
###### ■S3とCloudFront関連のあれこれ
https://engineering.mobalab.net/2019/06/25/tips-on-s3-and-cloudfront/

##### 伝えたい事
Webサーバ上で動いていた静的Webサイトを移行する時、Rest APIエンドポイントを使用する場合はWebサイトのコードをRestAPI用に修正する必要があること、それができなくてOAIを使わず、静的Webサイトホスティングを有効にして使うならS3へ直接アクセスを防ぐ考慮が必要ということを認識しておいてたほうが良さそう。
【Flutter】Warning: CocoaPods not installed. Skipping pod installと言われた時の解消方法

## 概要

Android Studioを更新した後に、Flutterアプリを実行しようとして下記のエラーが出た時の解決方法です。

```
Warning: CocoaPods not installed. Skipping pod install.
  CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to your plugin usage on the Dart side.
  Without CocoaPods, plugins will not work on iOS or macOS.
  For more info, see https://flutter.dev/platform-plugins
To install see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.

Exception: CocoaPods not installed or not in valid state.
```

## 解決方法

1. Android Studioを終了する

2. ターミナルで下記のコマンドを実行する

```
chmod +x /Applications/Android\ Studio.app/Contents/bin/printenv
```