OmniAICreator/Qiita-1.07M huggingface dataset:
AWS ANS 資格勉強用の用語集まとめ

## はじめに
AWS ANSを勉強した際に本または問題集に出てきた用語とサービスについて一部まとめました。


## ネットワーク関連の基礎知識　用語

### 帯域幅
以下のサイトから抜粋しました。

帯域幅は１秒間に送信できる転送量または伝送路容量（1秒間に何ビット転送できるか）を示すbps（ビット/秒）の単位で表される。

https://baremetal.jp/blog/2022/07/13/1220/#:~:text=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%B8%AF%E5%9F%9F%E5%B9%85%E3%81%A8%E3%81%AF%E3%80%81%E7%89%B9%E5%AE%9A%E3%81%AE%E6%99%82%E9%96%93%E5%86%85%E3%81%AB,%E5%8D%98%E4%BD%8D%E3%81%A7%E8%A1%A8%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

### ジッター
データパケットが到着する間の時間の変動
により、ネットワークが安定しないこと
以下のサイトが参考になりました。
https://e-words.jp/w/%E3%82%B8%E3%83%83%E3%82%BF.html
https://ja.manuals.plus/nextiva/what-is-jitter/amp

### スループット
以下のサイトから抜粋しました。
コンピュータやネットワーク機器が単位時間あたりに処理できるデータ量のこと
https://it-trend.jp/words/throughput#:~:text=%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%84%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%A9%9F%E5%99%A8%E3%81%8C,%E3%82%92%E3%83%93%E3%83%83%E3%83%88%E6%95%B0%E3%81%A7%E8%A1%A8%E3%81%99%E3%80%82

ジッターや遅延により、帯域幅が大きくても、スループットの処理が低下する場合があります。

### MTU
ネットワークで1回で送信できるパケットの最大サイズ
インターネットは1500バイト
MTU値を超えた場合、送信できるサイズにパケット分割される

以下のサイトが参考になりました。
https://atmarkit.itmedia.co.jp/aig/06network/mtu.html
https://www.server-memo.net/memo/research_mtu.html


### ジャンボフレーム
以下のサイトから抜粋しました。
イーサネット標準の最大フレームサイズ、1518バイトを超えるフレームサイズのこと

パケットの最大サイズ1518より大きいパケットサイズを送る際に使用される場合がある
但し、ジャンボフレームに対応してない機器もあるため、注意　ANSの試験対策として、どんなサービスがジャンボフレームに対応してるか復習した方が良いです。

https://www.iodata.jp/lib/manual/etg-r/htm/jumbo1.htm#:~:text=%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%9C%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&text=%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88%E6%A8%99%E6%BA%96%E3%81%AE%E6%9C%80%E5%A4%A7%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0,%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%8C%E8%A6%8B%E8%BE%BC%E3%82%81%E3%81%BE%E3%81%99%E3%80%82


## 用語
最近出たGLBについても調べてみました。

### GLB Gateway　Load Balancers

公式サイトでは、[セキュリティアプライアンスなどのサードパーティー仮想アプライアンスを簡単にデプロイ、スケーリング、管理出来るロードバランサーと記載されている。

アプリケーションがインターネット上で送受信する際は、GLBエンドポイント経由でGLB(ターゲットグループ セキュリティアプライアンス)を通ってしてトラフィックを検査している様に見えます。

公式サイト
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/gateway/getting-started.html


GLBエンドポイントとアプリケーションは同じVPCに配置　※サービスコンシューマー VPCと呼ばれる
GLBとセキュリティアプライアンスは同じVPCに配置　※サービスプロバイダーVPCと呼ばれる


※コンシューマー(消費者)　セキュリティアプライアンスを使う側
https://e-words.jp/w/%E3%82%B3%E3%83%B3%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%9E.html
プロバイダー　サービスの提供者


セキュリティアプライアンスの用語の意味
悪意のあるマルウェアからトラフィックを守るためのもの
https://www.itnavi.jp/words/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%A2%E3%83%97%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%82%B9/

GLBのプロトコルは GENEVE であり、ポートは 6081です。
GLBのターゲットグループのEC2は、セキュリティアプライアンスのため、一例ですがAWS Marketplaceから探してくることになります。
Vue3の導入

# Vue3の導入（nodebrew)
## 環境構築に必要なもの
* nodebrew
* node.js
* npm
* homebrew (homebrewはインストール済みとします）

## 1. nodebrewのインストール
まずnodebrewをインストールします。
```terminal
% brew install nodebrew
```
インストール完了後、以下の使用できるコマンドが表示されることを確認
```terminal
% nodebrew
nodebrew 1.2.0

Usage:
    nodebrew help                         Show this message
    nodebrew install <version>            Download and install <version> (from binary)
    nodebrew compile <version>            Download and install <version> (from source)
    nodebrew install-binary <version>     Alias of `install` (For backward compatibility)
    nodebrew uninstall <version>          Uninstall <version>
    nodebrew use <version>                Use <version>
    nodebrew list                         List installed versions
    nodebrew ls                           Alias for `list`
    nodebrew ls-remote                    List remote versions
    nodebrew ls-all                       List remote and installed versions
    nodebrew alias <key> <value>          Set alias
    nodebrew unalias <key>                Remove alias
    nodebrew clean <version> | all        Remove source file
    nodebrew selfupdate                   Update nodebrew
    nodebrew migrate-package <version>    Install global NPM packages contained in <version> to current version
    nodebrew exec <version> -- <command>  Execute <command> using specified <version>
    nodebrew prune [--dry-run]            Uninstall old versions, keeping the latest version for each major version

Example:
    # install
    nodebrew install v8.9.4

    # use a specific version number
    nodebrew use v8.9.4
```
## 2.node.jsのインストール
インストールする前にフォルダを作る
```terminal
% mkdir -p ~/.nodebrew/src
```
インストールできるバージョンの確認
```terminal
% nodebrew ls-remote
```
**node.jsのインストール**
* バージョン指定
`nodebrew install-binary v*.*.*`
* 最新のバージョン
`nodebrew install-binary latest`
* 最新の安定版
`nodebrew install-binary stable`

インストール後の確認
```terminal
% nodebrew ls
v18.9.0

current: none
```
`current: none`ではnodeが有効化されていないので有効化する
```terminal
% nodebrew use v18.9.0
% nodebrew ls
v18.9.0

current v18.9.0
```
## 3.パスを通す（zshrc)
```terminal
% echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zshrc
% source ~/.zshrc
% cat ~/.zshrc

~~~~~~~~~~~~~~~~
PATH=$HOME/.nodebrew/current/bin:$PATH
```
バージョンが表示されるか確認
```terminal
% node -v
v18.9.0

% npm -v
8.19.1
```
## 4.Vue.jsのインストール
公式ドキュメント
https://v3.ja.vuejs.org/
vue.jsを扱うフォルダに移動

今回はCLIではなくViteを使います。
いろんな記事でViteのほうが速度がはやいこと、Vue, Reactなどのライブラリの設定なしですぐ使えることで評価が高いので使ってみようと思います。
Vite公式
https://ja.vitejs.dev/

```terminal
% npm init vite@latest vue-app-tutorial -- --template vue

Need to install the following packages:
  create-vite@3.1.0
Ok to proceed? (y) y

Scaffolding project in ~~~~/vue-app-tutorial...

Done. Now run:

  cd vue-app-tutorial
  npm install
  npm run dev

```
アプリが正しく起動することができました。
![8AFAAF02-CF95-4CB6-B11E-9E89DEEEBBEF.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883081/80784f91-ba7f-c432-f8bb-423dbdcc77ac.jpeg)
WSLでRstudio serverが起動しない

【直面した問題】
WSLでRstudio server経由でRstudioを起動しようとしても起動しない。
```bash
sudo rstudio-server verify-installation
```
としてもRstudio Serverはインストールされているようだった。

Windows10
Ubuntu 20.04LTS

【解決策】
```bash
sudo rstudio-server start
```
で解決した。
Git「fatal: not a git repository (or any of the parent directories): .git 」エラーとリポジトリ紐づけ

自分用の解決メモです
# したい。できぬ
ローカルフォルダ → リモートリポジトリに紐づけ

# 解決
既存.gitフォルダの削除
（& 初期化 + リモートリポジトリ登録）

※「.gitconfig」`user.name` , `user.email`は登録済

# 原因
リポジトリと紐づけたいローカルフォルダに
.gitフォルダが既に存在していたこと
***
### 状況別 エラーメッセージ（一部）

#### ⭕正常　.gitファイルがまだ存在しない状態
```
$ git init
Initialized empty Git repository in (ローカル)
　→（ローカル）でGitリポジトリ初期化したよ🙆

$ git remote add origin (リモートURL)
　→（ぶじ登録できて終わり）🙆
```
#### ❌失敗1　初期化前から.gitフォルダがある場合
```
$ git init
fatal: bad config line 1 in file （ローカル）/.git/config
　→ .git/configの１行目がダメ🙅

$ git remote add origin (リモートURL) 
fatal: not a git repository (or any of the parent directories): .git
　→ 親リポジトリが違うYo🙅
```
#### ❌失敗2　初期化前からある.git/.gitconfigだけ削除した場合
削除した.gitconfigが作り直されるだけ？
```
$ git init
Reinitialized existing Git repository in （ローカル）/.git/
　→ 再初期化したよん🙆

$ git remote add origin (リモートURL) 
fatal: not a git repository (or any of the parent directories): .git
　→ 親リポジトリが違うYo🙅
```
***
##### 備考
`git remote add ~`じゃないコマンドで
削除せずともリモートURL変更できたかも...
Lambda(Python)のテストイベントを作成するために、関数の先頭に入れる1行

# はじめに
「API Gateway→Lambda」などのLambdaを書くときに、最初にlambda_handlerのeventに渡ってくるデータを取得したい場合のワンライン、コピペ用メモです。

# Lambda
```Python
    print(json.dumps(event, ensure_ascii=False))
```
まず、この1行を入れて、APIを送信するなどして、Lambdaを動かします。
eventの内容をCloudWatchLogsから取得して、テストのイベントJSONに使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155165/19be57b9-0eb1-043e-b8a8-e5d3a25adf9c.png)

# おわりに
小技として記事にしてみました。
Linux ESP、efibootmgr、initramfs等について

●EFI System Partition (ESP）
ESPはUEFIシステムにおいて、物理的なマシンを起動し、ファームウエアが読み込まれた後、その後の起動シーケンスで最初にアクセスされる領域。ESPは「/boot/efi」にマウント。
マザーボードの実装により差はあるが、規格としては、FAT16またはFAT32でフォーマットされている必要がある。

●UEFIブートマネージャー
UEFIでは、マシン起動後にファームウエアが読み込まれると、ハードウエアを初期化し、UEFIブートマネージャーを起動。UEFIブートマネージャーは起動情報（OSをどこからどのようにロードするか）を管理するプログラムであり、役割としては、BIOSでのブートローダーのような役割を実行。多くの場合は、ブートローダーを起動エントリに持ち、そちらに制御を渡しますが、環境によってはブートローダーなしでの起動も可能。

●efibootmgr
UEFIブートマネージャーの起動エントリをOS上から操作するコマンド。
ESPに格納されたブートローダーなどのプログラムを管理し、起動パラメータをブートローダーに渡したり、起動順序を変更したりなど、起動エントリの変更や設定を行います。
UEFIは、BIOSと同様にブートローダーを登録することもできるが、UEFI自体にブートローダーと同様の機能をもたすことができる。こうした機能もefibootmgrで操作可能。
ESPに格納されたブートローダーをUEFIから見ると拡張子.efiがついたファイルとなっていて、efibootmgr上でも、EFIアプリケーションとして扱われる。

オプションを付けずに実行すると現在のブートエントリーを表示。


●UEFI shell
UEFIでは、UEFIシェルと呼ばれるシェル環境を持っており、OSを起動せずにハードウエア周りの設定を行うことができ、デバイスドライバや、TCP/IPスタックも利用できる。

●デバイスドライバ
ハードウェアをOSから制御するためのソフトウェア。Linuxではデバイスドライバはカーネルモジュール（カーネルで扱うべき色々な機能を独立した部品のようなもの）として提供。
Linuxのブートプロセスにおいて、カーネルは起動するとハードウェアの認識を行う。認識したハードウェアに対応するカーネルモジュールが検出されロードされると、そのデバイスドライバによってハードウェアの初期化処理が行われる。ハードウェアの初期化が完了するとハードウェアは利用できるようになる。

●initramfs 
初期 RAM ディスクの形式の1つ。システム起動時に仮の環境としてまずメモリ上にファイルシステムを展開し、そこでカーネルを動作させてから本来のファイルシステムをルートにマウントし直す、といった段階的なブートを実現する機能。
initramfsはカーネルからは通常のファイルシステムと同様にアクセスでき、格納されているプログラムを実行することもできます。カーネルは、initramfs上に配置されたinitプログラムである /init を起動しようとする。
php で headless browser chrome-php

・指定したサイトのスクリーンショットを取りたい
・スマホ用ページを取得したい
・Laravelで使う

参考

https://qiita.com/oouaioi/items/fcd157da21368dc8e5b9
https://github.com/chrome-php/chrome

# インスコ

```
composer require chrome-php/chrome
```

# 文字化け対策のため、centosに日本語を入れとく

```
sudo yum install ipa-gothic-fonts ipa-pgothic-fonts
```

# コード

```hoge.php

use HeadlessChromium\BrowserFactory;

//略

$browserFactory = new BrowserFactory();

//ブラウザ表示サイズを指定
$browserFactory->setOptions([
    'windowSize' => [375, 900],
    'noSandbox' => true//cron で動くように
]);

$browser = $browserFactory->createBrowser();
try {
    // 新しいページを作成し、指定のURLへ移動する
    $page = $browser->createPage();

    //スマホ要UAをセット
    $page->setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1');
    $page->navigate('https://yahoo.co.jp')->waitForNavigation();

    //javascript実行の結果を待つ
    sleep(5);

    // スクリーンショットを撮る
    $page->screenshot()->saveToFile(public_path("/tmp/screen_shot".time().".png"));


} finally {
    // headless chromeの終了
    $browser->close();
}

```

`OK`

# 備考

# pythonでやりゃいいじゃん

あまり使わないのでコードがぐちゃぐちゃになるのが嫌だ
phpだけで完結したい

# なんでスクショを取りたいと思うの？

本来はvue3で書いたコードをグラフ生成のため
cronで動かしたかった

# puphpeteerはどうなの？

やったけどエラーが出るので、こっちにした。

# sandbox エラーが出た


```
[2022-10-14 14:26:02] local.ERROR: Chrome process stopped before startup completed. Additional info: [1014/142602.129443:ERROR:zygote_host_impl_linux.cc(90)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180. {"exception":"[object] (RuntimeException(code: 0): Chrome process stopped before startup completed. Additional info: [1014/142602.129443:ERROR:zygote_host_impl_linux.cc(90)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180. at /var/www/html/twikon.club/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php:410)
[stacktrace]
```

cronで動作させたら上記エラーが出た。

```
//ブラウザ表示サイズを指定
$browserFactory->setOptions([
    'windowSize' => [375, 900],
    'noSandbox' => true//cron で動くように
]);
```

とすればOK
Vue3でsetIntervalで定期的にAPI連携する際のTips

# はじめに
全国1億2623万人のGARNET CROWファンの皆さん、こんにちは
@garnetddolphin です。
先日Vue3で定期的にAPIからデータを取得し、更新するというコードを書きました。
SPAでページを移動した際にclearIntervalが設定されておらず、setIntervalが残り続けてハマったのでTipsとして公開します。

# 実装
```hoge.vue
<script lang="ts">
import { defineComponent } from "vue"
export default defineComponent({
・
・
・
    data() {
		return {
            // clearIntervalで削除するためタイマーを宣言しておく
			updateTimer: 0,
		}
	},
	methods: {
    async fetchAPIData(): Promise<void> {
        // API実行処理
    },
	async mounted() {
        // 宣言したタイマーにsetIntervalで実行する処理を代入
		this.updateTimer = setInterval(async () => {
			await this.fetchAPIData()
		}, 30000)
	},
	unmounted() {
        // ページを移動した際（コンポーネントインスタンスがアンマウントされた際）にはsetIntervalを削除する
        // Vue3のライフサイクルフック unmountedでタイマーをクリアする
		clearInterval(this.updateTimer)
	},
})
</script>
```

# 最後に
えるしっているか
ふろんとえんどは
おもしろい
Docker環境構築におけるnextjsのホットリロード不可問題

# Next.jsのホットリロード
Next.jsでのフロントエンド開発の一つのメリットとして、プログラムの変更を行った際にnpm run devコマンドを毎度実行したり、ブラウザでF5キーを毎度押さなくても自動的に内容を変更していってくれる点があるが、dockerでnextjsを構築した際にこの機能がうまく動かなかった。

# 解決策
https://github.com/vercel/next.js/issues/36774
こちらの記事にあるように、next.config.jsを./ディレクトリに直に作成して、下記のコードを挿入することで解決した。

```js
/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
  swcMinify: true,
  webpack: (config, context) => {
    config.watchOptions = {
      poll: 1000,
      aggregateTimeout: 300
    }
    return config
  }
}

module.exports = nextConfig
```
プログラミングと座禅

- 真面目にプログラミング業をやり始めてのべ5年ぐらいだろうか。それでもなんとかぎりぎりモノになっている気がする。もし20代あるいは10代の若い頃から「ちゃんとした」プログラマ経験を積んでいれば今頃はどうなっていたんだろう。まあ皮算用。
- ごくごく簡単なプログラミングは癒しになる。手元でpythonを走らせていた。本当に初歩の初歩の初歩。癒やしとしてのプログラミングも良いかも知れない。
- 例えば、とあるプログラミング言語のバージョン2を今覚えてしまったら、バージョン3にアップデートされた時に学び損が大きくないだろうか。そうだ、今学習するのはやめよう！
- オンラインのミーティングに出ていると丸裸になるみたいな気分だ。洋服を着たくなる。
- GUで買ったシャツがスカートみたいに長い。なぜか末広がりだ。こんなはずでは。二枚も同時に買った時に限ってこうなる。
- 俺が死ぬと俺はいなくなるらしい。想像できるだろうか？
- 生きることの不安が消えない。人間は成長するはずだ。これは一体いつになったら止むのだろう。座禅をするとましになるがすぐ元に戻る。
- 「ただ坐る (ネルケ無方)」。「ただ坐る」という座禅のコンセプトをタイトルでいきなり教えてくれた良い本。ドイツ流らしいストイックな思想で書かれていると思う。はじめて身体を発見したときのエピソードが印象的。「日本人は軸がない！」など少々鼻につくところはある。
- これが人生最初で最後の座禅だったらどんな風に坐るだろうと問いながら座禅をする。これがビギナーズマインドを得るための究極の質問ではないだろうか。座禅に真心を込めて集中するための良い問いかけかもしれない。これを一歩進めて今日が人生最後の日だったらどういう風に感じるだろうと己に問いかけてみる。今日が宇宙最後の日だったらどう感じるだろうと。よくある自己啓発チックな質問ではあるが座禅をしながら問いかけると上っ面の言葉ではなく真実味を持った感じ方が出来る気がする。
- 人を待たせると待つ相手は相当な精神力を消費する。時間だけの問題ではない。待ち合わせた時にはもう相手は疲れ切っている。
- スターバックスでFXの師匠と弟子らしき男たちが話している。しばらくして弟子が「これは必勝法のあるゲームですね！」と言った。話し始めてから1時間ほどして師匠が「コーヒー頼んでくるわ」と言って席を立った。それが1杯目のコーヒーだったようだ。
- 「前者」「後者」の表現は有害ではないだろうか。シンプルにどっちがどっちか分からなくなる。非推奨指定。言語の標準から除外すべきだ。
- エネルギーが今の100倍あれば偉人にだってなれると思う。
- スターバックスでカップルが隣の席に座った。店員さんに頼んで着席禁止の席をひとつ空けてもらっていた。そのせいで僕は使おうと思っていたコンセントを使えなくなった。その着席禁止の席の下にだけコンセントがあるのだ。少しだけこのカップルが嫌いになった。でももし僕がコンセントを使おうとしていなかったら全く怒らなかったはずだ。コンセントを使おうとしている自分、使おうとしていない自分。自分の状態によって怒りを感じるかどうかが変わるのだ。ところでカップルの女の顔を見るとわりと可愛かった。男の方はぼさっとしていた。なぜこんな男がこんな女性を？と思うことはたまにある。
- 僕は座禅で爆速で悟りたいのだろうか。悟りへの道は長ければ長いほど良い。旅は長いほうが楽しいから。
- スターバックスのドリンクカウンターで「お客様レシート拝見してよろしいですか？」と聞くのは宜しくない習慣だと思う。あれはなんとか改善出来ないんだろうか。
- 問いに関する本を読んでいる。質問は人間の根源的欲求だと説かれている。確かに子供はなんでもよく質問する。


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
指数表示

桁数が多い数値は見づらいです。例えば2の30乗を計算してみます。

```python
x = 2**30
print(x)
```

↓出力

```
1073741824
```

ぱっと見、桁数が分かりませんね。Pythonのf文字列（フォーマット済み文字列リテラル：f-string）を用い、変数名の後ろに「:e」を付けると指数表示されます。

```python
print(f'{x:e}')
```

↓出力

```
1.073742e+09
```

これで桁数（この場合は10^9の桁数）が一目で分かるようになりました。eの前の数字部分（仮数部）を小数点以下何桁まで表示するかは、eの前に「.数字」を付け足します。

```python
print(f'{x:.1e}')
print(f'{x:.2e}')
print(f'{x:.3e}')
```

↓出力

```
1.1e+09
1.07e+09
1.074e+09
```
【夏休み企画】#IT用語一問一答【毎朝投稿23日目】Polymorphism

# この記事を読むと、、
- 「関連用語」を使って「Polymorphism」を説明できるようになる
- 「Polymorphism」がもっと好きになる(多分)

# 関連用語
アドホック多相 / パラメトリック多相 / サブタイピング

[**復習用**] 記事の内容を見る前に上記の言葉で「Polymorphism」を説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/56708b48165e81eb7a74

# Polymorphismとは
Polymorphism = 多相性 = 多態性 = 単一のインターフェースで様々な型に対応した処理を実行できる実装

- カプセル化、継承に並びOOPにおける重要な性質の一つ
    - ただし、PolymorphismはOOPLに限った用語ではない

- 以下の3つに(ぼんやりと)分類できる
    - **アドホック多相** = 同一の名前を持つ関数やメソッドを文脈(ex. 実引数の型)に対応して複数定義すること(オーバーロード)
    - **パラメトリック多相** = 抽象的な型を用いて関数やデータ型を記述すること
        - ex. C++のテンプレート、Javaのジェネリクス
    - **サブタイピング**
        - スーパークラスのインスタンスをサブクラスのインスタンスで安全に代替できる継承の用法
        - ざっくりいうと、`class A`を継承した`class B`があったときに`A a = new B();`ができる

# 参考資料
- https://en.wikipedia.org/wiki/Polymorphism_(computer_science)
- https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/object-oriented/polymorphism
-
Backlogのお知らせを通知するChrome拡張作った

# はじめに
**全国1億2623万人の布袋寅泰ファンの皆さん、こんにちは**
@garnetddolphin です。
参画したプロジェクトでBacklogを使用する機会があり、お知らせがあったら通知するChrome拡張を作ったので公開します。

# 開発の経緯
backlogに登録すると、**深夜に**「本日のBacklogプロジェクトレポート」というメールが届きます。正直うっとうしい。メールの通知で起きたことも何度かありました。このメールから開放されたい、けど通知があったら気づきたい... API公開してるじゃん→作ろう！

# 実装
`manifest.json` と`background.js`、`backlog-favicon_48.png`を作成し、同フォルダに入れておきます。
こちらを[chrome://extensions/]![backlog-favicon_48.png]
(chrome://extensions/)の「パッケージ化されていない拡張機能を読み込む」から読み込みます。
```manifest.json
{
  "name": "Backlog Desktop notification",
  "version": "1.0.0",
  "manifest_version": 3,
  "description": "Backlog のお知らせを通知します",
  "permissions":[
    "alarms",
    "webRequest",
    "notifications"
  ],
  "host_permissions": [
    "*://*/*/*/"
  ],
  "background": {
    "service_worker": "background.js"
  },
  "icons": {
    "48": "backlog-favicon_48.png",
  }
}
```
```background.js
function showNotification() {
  let url =
    "https://crewinc.backlog.com/api/v2/notifications/count?[アカウントのAPIキー]&alreadyRead=false";

  fetch(url, { method: "GET" })
    .then((response) => response.json())
    .then((data) => {
      if (data.count >= 1) {
        let options = {
          type: "basic",
          title: "Backlog 通知",
          message: "お知らせが" + data.count + "件あります！確認して！",
          iconUrl: "backlog-favicon_48.png",
        };
        chrome.notifications.create(options);
      }
    });
}

chrome.alarms.create("check_backlog_unReadNotification", {
  delayInMinutes: 0,
  periodInMinutes: 10,
});
chrome.alarms.onAlarm.addListener((alarm) => {
  if (alarm.name === "check_backlog_unReadNotification") {
    showNotification();
  }
});
```
```backlog-favicon_48.png```
![backlog-favicon_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423133/b7666721-0f8e-ce9c-a805-57a58ea58290.png)

# まとめ
深夜のメールから開放されてハッピー！
10分に1度じゃなくてWebhookとかで即時実行したいよね
Markdownでチェックボックスを作る

### 背景
Markdownでチェックボックスを表現します。

### 方法


-ハイフンと[ ]角括弧（かくかっこ）を使います。
チェックされた場合を表現する場合には、その中にxを入れます。

```markdown
- [ ] チェックされていない
- [x] チェックされている
```

のようにすると、

- [ ] チェックされていない
- [x] チェックされている

と表示されます。


### 終わりに

誰かの役に立つことがあれば幸いです。
TerraformでRDSのスナップショットから復元（リストア）したことなかったので試した

すでに取得されているスナップショットを元にTerraformから復元（リストア）したことがなかったな、ということで試しました。

今回は、RDSのスナップショットを元に新しいインスタンスを作成します。

## 1. スナップショットを作成する

必要であれば手動でスナップショットを作成してください。
手順は以下のドキュメントをご参照ください。

[DB スナップショットの作成 - Amazon Relational Database Service](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html)

## 2. Terraformで1で取得したスナップショットからRDSインスタンスを作成する
### 2-1. dataでスナップショットを取り込む

既存リソースであるスナップショットを取り込みます。

```tf
data "aws_db_snapshot" "任意のリソース名" {
    db_snapshot_identifier = "{スナップショット名}"
}
```

[aws_db_snapshot | Resources | hashicorp/aws | Terraform Registry](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_snapshot)

クラスターの場合はこちらだと思います。

[aws_db_cluster_snapshot | Data Sources | hashicorp/aws | Terraform Registry](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/db_cluster_snapshot)

### 2-2. インスタンスの作成

`snapshot_identifier` で先程取得したスナップショットのIDを指定します。

```tf
resource "aws_db_instance" "任意のリソース名" {
  allocated_storage    = 10
  db_name              = "mydb"
  engine               = "mysql"
  engine_version       = "5.7"
  instance_class       = "db.t3.micro"
  username             = "foo"
  password             = "foobarbaz"
  parameter_group_name = "default.mysql5.7"
  skip_final_snapshot  = true
  snapshot_identifier = "${data.aws_db_snapshot.上記で付けたリソース名.id}"
}
```

[aws_db_instance | Resources | hashicorp/aws | Terraform Registry](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_instance)

### 2-3. 実行

```shell
$ terraform apply
```

以上です。

## 参考

[TerraformでスナップショットからRDSを復元・リストアする | Hodalog](https://hodalog.com/restore-rds-using-terraform/)

[TerraformでRDS Auroraクラスタのリストアをする - そうなんでげす](https://www.soudegesu.com/post/aws/restore-aurora-cluster-with-terraform/#snapshot%E3%81%8B%E3%82%89%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2%E8%A8%AD%E5%AE%9A)
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その032

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: アプリケーションと活動
生産性とコラボレーションの学習

にある練習問題5問目をご紹介します

紹介動画はこちらです

https://www.youtube.com/watch?v=6FxVu5zzvfY

<iframe width="560" height="315" src="https://www.youtube.com/embed/14m8fLHLTw8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-applications-activities-and-mobile/study-up-on-activity-management-and-collaboration?trail_id=administrator-certification-prep


![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9c01893e-6000-4a31-7b92-8ae720cbc513.png)


正解はCです

通常のレポートやダッシュボード作成よりもApp Exchangeでレポートダッシュボードを作成したほうが素早く作成ができますね


こちらのTrailheadにも書いてありますね

https://trailhead.salesforce.com/ja/content/learn/modules/lex_implementation_reports_dashboards/lex_implementation_reports_dashboards_appexchange

レポートやダッシュボードを作成する場合、まず既存のレポートをコピーして、ニーズに合わあせて変更するというのが一般的な方法です。でも変更元となるサンプルレポートやダッシュボードはどこから持ってくれば良いのでしょうか? Ursa Major Solar のシステム管理者である Maria は、AppExchange を使用しています。


色々なダッシュボードのインストールがインストールできますのでぜひ色々試してみてください
【IntelliJ】Jarファイルの生成方法

# はじめに
コーディングしたJavaソースを別環境に持っていったり、実行可能形式にしたい場合にJarにする必要がありました。
ネットで調べてみると、依存ライブラリを含める形の方法ばかり出てきました。
依存ライブラリを含めるとかなり膨大なJarファイルになってしまうので、依存ライブラリを含めない形にしたいと想い、調べてみたのでまとめてみます。

# 依存ライブラリを含める場合
1. IntelliJの[ファイル] > [プロジェクト構造] > [プロジェクト設定] > [アーティファクト]に移動します。
2. 追加ボタンから[JAR] > [依存関係を持つモジュールから...]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/d2073e81-7027-af74-9fb7-20fea729cc3d.png)

3. 対象のモジュールを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/71b23769-ccfb-a8e6-6693-d5001dc68b20.png)

4. 次に[ビルド] > [成果物のビルド]をクリックします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/5f64a024-6520-636e-6a7b-1a11cd58580d.png)

5. ビルドを実行すると、プロジェクトフォルダにoutフォルダが新たに作成されて、その中にJarファイルができます。

# 依存ライブラリを含めない場合
Gradleのメニューから[build] > [jar]をクリックするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/c4d5364a-0462-805a-6797-a65d84acc433.png)

build/libsディレクトリに*.SNAPSHOT-plain.jarファイルができます。
（*.SNAPSHOT.jarファイルは依存ライブラリを含む形式です。）

ちなみに、jar tf [JARファイル]コマンドでjarの中身を確認することができます。
いちばん最近編集した(最終更新日が一番新しい)ファイルを開くコマンド

これでカレントフォルダの全ファイルを最終更新日順に表示できる

```sh
find . -type f -printf '%T@ %p\n' | sort -nr | cut -d " " -f 2
```

最新ファイルだけ取得する関数にして...

```sh
# 第一引数: 検索するフォルダ (省略時はカレントフォルダ)
# 第二引数: 行数 (省略時は1)
function latest(){
  find ${1:-.} -type f -printf '%T@ %p\n' | sort -nr | cut -d " " -f 2 | head -${2:-1}
}
```

VSCodeで開ける

```sh
code `latest src`
```

- 参考: [How to recursively find the latest modified file in a directory?](https://stackoverflow.com/questions/4561895/how-to-recursively-find-the-latest-modified-file-in-a-directory)
chrome.storage.*.getを同期的に扱う

# TL;DR

```js
// async キーワードで同期処理のできる関数を定義
window.onload = async (e) => {
    // chrome.storage.sync.get() に await をつけて同期処理に
    // (await chrome.storage.sync.get()) は Promise の処理結果を返すので、戻り値は ['要素名'] で取得できる
    const domainList = (await chrome.storage.sync.get('domainList'))['domainList'];
    console.log(domainList);
}
```

この書き方が`new Promise()`が不要なので簡単だと思います。

## ポイント

### その1

`chrome.storage.sync.get()`関数はそのままだと非同期処理になり`Promise`[^1]を返すので、`asyc`をかけた関数でラップして同期処理を可能にしたうえで`(await chrome.storage.sync.get('domainList'))`を使って`storage`内の値が帰ってくるまで待つようにしています。

今回はHTMLの描画後にjavascriptが動いてほしかったので、`window.onload`イベント用の無名関数に`async`をかけました。

### その2

`(await chrome.storage.sync.get('domainList'))['domainList']`は`get('domainList')`と同じキー`'domainList'`を使って`sync`に保存されているオブジェクトから取得する値を指定しています[^2]。

また、`(await 〜.get())`をカッコで括ることにより、`get()`の`Promise`処理後の戻り値が取得でき、`.then()`を呼ぶ必要もなくなります。

### 例

```js
window.onload = async (e) => {
    // domainList1 と domainList2  と domainList3 は同じ値になる
    const domainList1 = (await chrome.storage.sync.get('domainList'))['domainList'];
    const domainList2 = await chrome.storage.sync.get('domainList').then(item => item['domainList']);
    const domainList3 = await chrome.storage.sync.get('domainList')
                            .then(item => {
                                return item['domainList']
                            });
}

```

## 参考文献

[^1]: [Promise - JavaScript | MDN](
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)
[^2]: [本記事コメントより](https://qiita.com/hidao/items/bc3c3f201651ccd2fc45#comment-5ebc1d854fdb2c85362f)
Redocを用いたAPI仕様書作成方法 メモ



## Redocとは

* Swaggerで生成したjson/ymlを整形した形でhtml化するためのツール

## 準備

* インストール※node.js,npm使用

  ```shell
  npm install -g redoc-cli
  ```



## HTML化

* [Swagger公式サンプル](https://petstore.swagger.io/)のjsonを利用させていただく。

```shell
redoc-cli bundle swagger.json -o index.html
```



## 実行結果

* 生成されたindex.htmlを開くと下記のように表示される。

![redoc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/3b1b5cba-b915-422f-f3fe-fdbf273ed5e4.png)


## 参考情報

* [Swagger Petstore](https://petstore.swagger.io/)
* [Redocly](https://github.com/Redocly)/[redoc](https://github.com/Redocly/redoc)
LDAP Injection Prevention Cheat Sheet メモ


OWASP Cheat Sheet SeriesのLDAP Injection Prevention Cheat Sheetについてメモする。

## LDAPとは

* ネットワーク機器やユーザーなどの情報を管理するディレクトリサービスへ接続するためのプロトコル
  * ディレクトリサービス：ネットワークに存在するさまざまな情報を一元的に管理し、検索などの機能を提供するサービス

### LDAPの仕組み

LDAPディレクトリに接続する場合、通常のLDAPワークフローは以下のようになる※プリンターと接続する場合

1. LDAPディレクトリとのセキュアな接続を確立する。
2. 特定のプリンタの「検索」クエリをLDAPディレクトリに送信する。
3. LDAPディレクトリはユーザを認証する。
4. ディレクトリ内で検索オペレーションが実行され、要求されたプリンタのアドレスが返却される。
5. プリンタに接続する。

![LDAP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/a2e300dc-011b-e7a1-fd17-356b9641d01c.png)




## LDAPインジェクション

* ユーザー入力に基づいてLDAPステートメントを作成するWebベースのアプリケーションを悪用するために使用される攻撃。
* アプリがユーザー入力を適切にサニタイズできない場合、 SQLインジェクションと同様の手法でLDAPステートメントを変更できる。

* 許可されていないクエリへのアクセス許可の付与やLDAPツリー内のコンテンツの変更などの任意のコマンドが実行される可能性がある。

### LDAPインジェクションの要因

1. 安全にパラメータ化されたLDAPクエリI/Fの欠如
2. ユーザー認証を行うためのLDAPの広範利用

## LDAPインジェクション対策

### 対策1:適切なLDAPエンコーディング機能を使用した全変数のエスケープ

#### 識別名のエスケープ

* LDAPが名前を格納する主な方法は、DN（識別名）に基づいている。
  * ユーザー名などのリソースにアクセスするために使用される。

* DNには特殊文字と見なされる特定の文字があるため、エスケープを行う。
* [リスト](https://ldapwiki.com/wiki/DN Escape Values)

#### 検索フィルターのエスケープ

* 各DNは正確に1つのエントリを示す。※RDBMSのレコード・行のようなもの。
* エントリごとに、RDBMS列に類似した1つ以上の属性があります。LDAPを介してユーザーの特定の属性を検索する場合は、検索フィルターを使用できる。
  * 検索フィルターでは、標準のブール論理を使用して、任意の制約に一致するユーザーのリストを取得できる。

* アプリケーションコードでLDAPクエリを生成するときは、LDAPクエリに追加された信頼できないデータをエスケープする必要がある。
* LDAPエスケープには2つの形式がある。
  * LDAP検索のエンコーディング
  * LDAPDN（識別名）のエンコーディング。
    * 適切なエスケープは、検索フィルターの入力をサニタイズするか、リソースにアクセスするためのユーザー名のようなクレデンシャルとしてDNを使用するかによって異なる。

* 検索フィルターで許可され、エスケープする必要がある「特殊」文字には次のものがある。

```
* ( ) \ NUL
```

※検索フィルターのエスケープの詳細は[RFC4515](https://datatracker.ietf.org/doc/html/rfc4515#section-3)を参照のこと

### 対策2：LDAPインジェクションに対して自動的に保護可能なフレームワークの利用

### その他の対策

* 上記2つの主要な防御のいずれかを採用するだけでなく、多層防御を提供するために、次の追加防御策をすべて採用することも推奨される。

#### 最小特権の付与

* LDAPインジェクション攻撃が成功した場合の潜在的な損傷を最小限に抑えるために、環境内のLDAPバインディングアカウントに割り当てられている特権を最小限に抑える必要がある。

#### バインド認証の有効化

* LDAPプロトコルがバインド認証で構成されている場合、攻撃者は、ユーザーによって渡された有効な資格情報に対して実行される検証および承認チェックによって、LDAPインジェクション攻撃を実行できない。

#### 許可リスト入力の検証

* 入力検証を使用して、LDAPクエリに渡される前に不正な入力を検出する。

  ※詳細は[入力検証に関するチートシート](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html)を参照

## 参考情報

* https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html
Movable Type7立ち上げ時に迷ったポイント

Movable Type立ち上げ時に迷ったポイントを残しておく。作業環境は以下の通り。

:::note info
作業環境
* Movable Type7(個人無償ライセンス)をインストール
* phpmyadmin(MySQL5.7)利用
* レンタルサーバーはエックスサーバーを利用
:::

# 個人利用は無償
WordPressのように法人個人問わず無償で何とでもできるのかと思ったら個人以外では無償じゃなかった。
気を付けていないといつの間にか違反しそうだから注意。
>法人や団体、個人事業での利用の場合、ブログの内容に関わらず有償ライセンスが必要となります。
[個人無償ライセンス](https://www.sixapart.jp/movabletype/license/)

# データベースを作る
Movable Type7はデーターベース作成は必須。

:::note info
動作確認済
* MySQL 5.1 以上（5.7.x を推奨）
* MariaDB 5.5 以上（10.3.x を推奨）
:::

今回はMySQL5.7の環境下で作業をした。
利用中のレンタルサーバーでデーターベースを作成不可の場合、これ以上の作業ができない点に注意。

# mt.cgiとmt-config.cgi修正
一部のコードは変更が必要。

## mt.cgiの修正箇所
``` diff
mt.cgi 1行目
- #!/usr/bin/env perl
+ #!/usr/bin/perl
```
perlのパスはレンタルサーバーによって異なる。
私が利用しているエックスサーバーはenv要らなかったので削除。

## mt-config.cgiの修正
mt-config.cgi-originalをmt-config.cgiにリネームして以下修正が必要。

エックスサーバーのルートディレクトリ(publc_html)以下にmtディレクトリを置き、
その中でMovable Typeを利用することにしたので以下のように変更した。

``` diff
- CGIPath    http://www.example.com/cgi-bin/mt/
+ CGIPath    https://sample.com/mt/
```
CGIPathを変更する。.cgiのあるディレクトリを相対パスではなく絶対パスで指定。

```diff
- StaticWebPath    http://www.example.com/mt-static
+ StaticWebPath    https://sample.com/mt/mt-static/
```
StaticWebPathを変更する。mt-staticディレクトリを絶対パスで指定。
最後の/は付けなくても大丈夫だが、付けておいたままでも問題ない。

```diff
DATABASE SETTINGSの部分を変更する
- Database DATABASE_NAME
- DBUser DATABASE_USERNAME
- DBPassword DATABASE_PASSWORD
- DBHost localhost
+ Database レンタルサーバー設定値
+ DBUser レンタルサーバー設定値
+ DBPassword レンタルサーバー設定値
+ DBHost レンタルサーバー設定値
```
この作業を行う前までにデーターベースの設置は済ませておくこと。
WordPressもだけどユーザー名やパスワードそのまま直書きなのはちょっと危ない気がするけど。

# 属性変更が必要
Movable Type7の中身をアップロードしたら属性変更を忘れずに。
cgi系やmt-staticディレクトリは755、mt-static/supportは777にする。
属性変更を忘れていると403エラーや404エラーを吐き出す。

# Movable Typeのインストール
ここまで仕上がったらmt.cgiのあるURLまで飛ぶ。今回の場合はhttps://sample.com/mt/mt.cgi
インストールが終わったら、セキュリティ確保のためmt.cgiの属性をオーナー権限にしておいた方が無難。
URL構造を知っていれば悪用できるため。私は700にしておいた。

# 公開パスの設定
実は一番悩んだ項目。
「ディレクトリの考え方が違うのか！？」と思い、
ディレクトリの位置を上下移動していたら動かなくなってしまってものすごく慌てた。
結局index.htmlをディレクトリに入れてなかったのが問題だった。

全般設定>サイト設定>公開パスの設定については、以下の通り。
```
サイトURL
https://samlpe.com/sample-blog/

サイトパス
/レンタルサーバーによって異なる/sample.com/public_html/blog-sample
※public_htmlディレクトリを挟むのはエックスサーバーの仕様
```
ただURLとパスを指定するだけじゃだめで、以下の設定も必要。

* blog-sampleディレクトリの属性を775
* 空白ページでいいからindex.htmlをblog-sample内に入れる
* サイト再構築

上記を行わないとサイトが表示しない。
地味に面倒くさかった。解決するのに丸1日かかったし、
しかもこの辺はマニュアルに詳しく書かれていない感じだ。

子サイトの公開パスも同じ要領で行えばOK
```
サイトURL
https://samlpe.com/sample-blog/child/

サイトパス
/レンタルサーバーによって異なる/sample.com/public_html/blog-sample/child
※public_htmlディレクトリを挟むのはエックスサーバーの仕様
```

# まとめ
今回はMovable type立ち上げ時に迷ったポイントをまとめた。
WordPressのようにインストールしてあとはブラウザ上で作業すればいいわけじゃなくて、
ちゃんと自分の環境下で設定する箇所があるよってことを覚えておこうと思った。
タイマー、ストップウォッチ等で使用する文字がぶれる

# はじめに
ストップウォッチやタイマーなどで動的に動く文字列を使用する際、デフォルトの設定では文字がぶれるような挙動をしてしまいます😭
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/b9532945-578e-e94b-65b9-fc2d973ecc6e.gif)

## 等幅フォントに設定しよう!!
そんな時は等幅フォントに設定しましょう😄(すべての文字の幅が同じ幅のフォント)

```swift
// 例としてUILabelのフォントを設定(timerMinute: UILabel)
timerMinute.font = UIFont.monospacedDigitSystemFont(ofSize: 50, weight: UIFont.Weight.regular)
```

これで実行してみましょう😃
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/4309a0f9-306c-29e1-7801-594b00a32df1.gif)

いい感じです👍
Google Pixcel 4a(5g)のディスプレイが故障したので交換した件　続き

#目次
- [1. はじめに](#1-はじめに)
- [2. 状況](#2-状況)
- [3. 分解とお掃除](#3-分解とお掃除)
- [4. 動作確認](#4-動作確認)


# 1. はじめに

前回で修理後にボタンチャタリングが発生したので、続きの対応をした内容になります。
結局マザーボードまで分解、洗浄を行ってなんとかなったお話になります。
作業はifixitに沿ったものですが、実物写真やコメントを添えておりますので、
似た作業を行う方のご参考になればと思います。

↓前回

https://qiita.com/ichihey/items/9d3fe29e2be1168e7c30


# 2. 状況
前回の修理後、1日くらいすると以下の症状が発生しました。

・カメラアプリが勝手に起動する
・緊急通報モードが頻発する
・電源のON/OFFが繰り返される

ググると電源ボタンの複数回プッシュで緊急通報やカメラアプリが起動するショートカットになっているとのことでした。
どうも電源ボタンがチャタリングを起こしているようです。

https://k-tai.watch.impress.co.jp/docs/column/minna/1377892.html

再度パネルを開けてダスターなどでブローしたりもしましたが、改善がみられなかったので、
もう少し深いところまで分解して調査し、対応を検討することとしました。

# 3. 分解とお掃除
前回同様、ifixitを参考に今回はバッテリ、マザーボードまでをバラしました。

https://jp.ifixit.com/Device/Google_Pixel_4a_5G

ミッドフレーム外し→マザーボードブラケットを外したところです。
まぁまぁ汚れがついてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112433/da2b14b7-c5de-9e9c-ec6c-6ad47d1e9139.png)

なんやかんや外してマザーボードまでバラしたところ。
若干ブレてる。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112433/f2354791-38b1-95a1-9dc7-8fb239a4cd8e.png)

今回はガッツリ洗浄したかったので、一応バッテリも外しました。
シリアルっぽい情報がQRであるので、一応塗りつぶしてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112433/7f302a5a-fbce-2536-5012-24f1b781365c.png)


ところどころ粉っぽくなってる部分もあります。
前述の通り海水が若干入り込んできているので、塩が結晶化しているのかと思われます。
入り込んじゃうとやはりこうなっちゃいますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112433/caa2803f-f080-51c0-c97a-38c4806f29a8.png)


電源ボタンはﾊﾞｯﾃﾘﾌﾚｰﾑの外側にそって実装されており、下図のように少し離れたところにPAD出しして、
ﾏｻﾞｰﾎﾞｰﾄﾞ側へ接触させて入力しているような構造でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112433/cdc8a7e6-258b-13f2-5630-293f10f398d1.png)


電源ﾎﾞﾀﾝ入力部のﾏｻﾞｰﾎﾞｰﾄﾞ側とﾌﾚｰﾑ側の写真です。
組立時はココが接触して導通していることになります。
この写真は清浄化後ですが、清浄化前は若干汚れ付着しておりました。
今回のﾁｬﾀﾘﾝｸﾞはｺｺの接触がNGだったと推定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112433/2a83ad69-4984-95f4-8ec9-536e2724ce40.png)

清浄化は
・KUREのｸｲｯｸﾄﾞﾗｲｸﾘｰﾅでｼｬﾊﾞｼｬﾊﾞに洗浄　（換気のよい洗面所で）
・数時間自然乾燥
・接点部分にKURE接点回復ｽﾌﾟﾚｰを塗布
・数時間自然乾燥
としました。
無水ｴﾀﾉｰﾙなどでの超音波洗浄などかけたいところですが、家には環境ないのでこれで我慢。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112433/80c96777-5b9c-6724-ba65-a4f2308e0a9a.png)


ifixitの逆手順で組み立てていきます。
ただ、ﾊﾞｯﾃﾘはﾃｰﾌﾟを剥がしているのでそこだけ再度ﾃｰﾌﾟ貼り付けが必要です。
ｱﾏｿﾞﾝやAliでそれ用のﾃｰﾌﾟはあるのでそちらを使用するのが望ましいかと思いますが、
今回は耐熱性のﾎﾟﾘｲﾐﾄﾞﾃｰﾌﾟがあったのでそちらでﾊﾞｯﾃﾘ固定をしました。
（写真は無し）


ﾃﾞｨｽﾌﾟﾚｲまで組み立てた状態です。
ﾃﾞｨｽﾌﾟﾚｲをまた両面ﾃｰﾌﾟがｶﾞｯﾂﾘ接着するとまたNGになった時にバラすのが大変なので、
とりあえず外周部をﾎﾟﾘｲﾐﾄﾞﾃｰﾌﾟで貼り付けて仮固定としました。
幅は5mmのものを使ってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112433/b2ae38b3-e564-2558-56c4-61f2080c4b59.png)


# 4. 動作確認
充電して電源ONし、動作確認をしました。
充電後、1hくらいは問題なく起動し、しばらく放置してました。
しばらくすると、またﾁｬﾀﾘﾝｸﾞを起こして電源ON/OFFを繰り返すようになってしまいました。
ただそこから2-3日くらいかけながら2-3回充電/放電を繰り返すとふとﾁｬﾀﾘﾝｸﾞがなくなりました。
接点回復剤は若干の極薄絶縁層を形成すると思うので、塗布か乾燥のさせ方が不適切だったのかもしれません。
軽く導通を繰り返すことで、接点部分が安定してきたのかなと理解しました。

こういった状況なのでしばらく使用しながら様子見をしようと思います。
Blazor WebAssembyをルート以外にデプロイすると動かない

# TL;DR;

`index.html`の`<base>`タグをコメントアウトする。

# `<base>`タグ

既定の動作では、HTML内で相対パスを記述したとき、現在読み込んでいるHTMLのパスを基準として解決されます。しかし、`<base>`タグが指定されていると、そのパスを基準として解決されます。

https://developer.mozilla.org/ja/docs/Web/HTML/Element/base

# Blazor WebAssemblyの`<base>`タグ

Blazor WebAssembyでは、起動時に`index.html`から、`_framework/blazor.webassembly.js` が読み込まれるのですが、`<base href="/">`が指定されているので、

- http://example.com/_framework/blazor.webassembly.js
- fie:///_framework/blazor.webassembly.js

といったように解決されます。

デプロイしたときに、`index.html`のディレクトリ内のファイル群をルート以外にデプロイした場合でも、`<base>`タグのせいで、上記と同じようなアドレスに解決されます。そのため、404になって読み込めないのです。
グラレコしたい

## 「グラレコ」
[グラレコとは？プロセスを記録する](https://www.igaku-shoin.co.jp/paper/archive/y2019/PA03350_05)

> **グラフィックレコーディング**（通称，グラレコ）とは，セミナーやシンポジウムなどの登壇者の話や，会議での議論の様子を，文字だけではなく，図や絵を用いてリアルタイムに可視化する手法のこと

グラレコ、上手になったらもう少し便利そうである。
そのコツをまとめる。

## 動機
- 議事録同様、共有・整理・ふりかえり をしたい
- 文章を並べ立てた議事録より視覚的にわかるようにしたい
- 紙とペンとスマホの無料アプリ程度でできるようにしたい

## 参考
[デジタル・グラフィックレコーディングで可能になる会議の新しい共有の形｜くぼみ｜note](https://note.com/kuboasa/n/nfa0f5e3c9169)
[一番簡単なグラレコのやり方〜紙とペンと無料アプリでスマホでもできる！〜│ぐるっと浜名湖](https://hamakkodo.com/graphicrecorder/)

## 費用
[ヨドバシ.com - スマホと連動する文房具特集](https://www.yodobashi.com/store/320032/) - freno（フリーノ）20000yen
[いろいろ出てきたスマホ連携ノート、どれがオススメ？（1/2 ページ） - ITmedia Mobile](https://www.itmedia.co.jp/promobile/articles/1204/13/news133.html) - shot note 数100yen

## 機能

### OCR 
[「Googleドライブ」OCR機能で文字起こし検証→かなり高精度なのでご紹介 | 株式会社ウェブ企画パートナーズ](https://wk-partners.co.jp/homepage/blog/webservices/googledrive-ocr/)

### フォト
[フォトアルバムを作成、編集する - Android - Google フォト ヘルプ](https://support.google.com/photos/answer/6128849?hl=ja&co=GENIE.Platform%3DAndroid)


## 実践

以下を題材にチャレンジした。

https://www.udemy.com/course/leader1on1/

![FchUv03aQAEt5x1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/6259165a-6966-0f46-7af7-dca46b4e3696.jpeg)

頭の中がまとまらないと難しい
というかまとめた上で適切なグラフィックに落とし込むのは難しい。文字のほうがどれだけ集中できることだろうか

しばし練習を続けてみようと思う...
M1 Mac (macOS Monterey) で Docker の MySQL のインストールに失敗するときの対処法

M1 Mac で Docker の MySQL のイメージを pull しようとすると以下のようなエラーが表示されます。

```
no matching manifest for linux/arm64/v8 in the manifest list entries
```

`docker-compose.yml` に `platform: linux/x86_64` を追加すると pull できるようになります。

```diff:docker-compose.yml
 version: '3'
 services:
   db:
+    platform: linux/x86_64
     image: mysql:5.7
```



# 参考サイト
* [Docker (Apple Silicon/M1 Preview) MySQL "no matching manifest for linux/arm64/v8 in the manifest list entries"](https://stackoverflow.com/a/65592942)
M1 Mac (macOS Monterey) で Node.js のインストールに失敗するときの対処法

# 解決方法
M1 Mac で従来どおりに Ruby をインストールしようとするとビルドエラーが出てしまいます。

筆者の環境では以下のコマンドを事前に実行することにより無事インストールすることができました。

```shell:Shell
arch -x86_64 zsh   # Zsh の場合
arch -x86_64 bash  # Bash の場合
```

tmux などを使っている場合は以下のようなメッセージが表示されるので、いったん終了してから実行してみてください。

```
sessions should be nested with care, unset $TMUX to force
```



# 参考サイト
* [Unable to install nodejs](https://github.com/asdf-vm/asdf-nodejs/issues/130#issuecomment-753945615)
M1 Mac (macOS Monterey) で Ruby のインストールに失敗するときの対処法

# 解決方法
M1 Mac で従来どおりに Ruby をインストールしようとするとビルドエラーが出てしまいます。

筆者の環境では以下のコマンドを実行することにより無事インストールすることができました。

まず、必要なパッケージをインストールします。

```shell:Shell
brew install openssl@1.1 readline libyaml
```

次に必要な環境変数をセットします。

```shell:shell
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"
export LDFLAGS="-L/opt/homebrew/opt/readline/lib"
export CPPFLAGS="-I/opt/homebrew/opt/readline/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/readline/lib/pkgconfig"
export optflags="-Wno-error=implicit-function-declaration"
export LDFLAGS="-L/opt/homebrew/opt/libffi/lib"
export CPPFLAGS="-I/opt/homebrew/opt/libffi/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/libffi/lib/pkgconfig"
export RUBY_CFLAGS="-w"
```

これでインストールできるようになるはずです。

```shell:Shell
asdf install ruby <RUBY_VERSION>
```

上記の例では asdf を使用していますが、rbenv などでも同様にインストールできるようになると思います。

環境変数をエクスポートする代わりに実行時に指定することも可能です。

```shell:Shell
RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)" LDFLAGS="-L/opt/homebrew/opt/readline/lib" CPPFLAGS="-I/opt/homebrew/opt/readline/include" PKG_CONFIG_PATH="/opt/homebrew/opt/readline/lib/pkgconfig" optflags="-Wno-error=implicit-function-declaration" LDFLAGS="-L/opt/homebrew/opt/libffi/lib" CPPFLAGS="-I/opt/homebrew/opt/libffi/include" PKG_CONFIG_PATH="/opt/homebrew/opt/libffi/lib/pkgconfig" RUBY_CFLAGS="-w" asdf install ruby <RUBY_VERSION>
```



# 参考サイト
* [Install older Ruby versions on a M1 MacBook?](https://stackoverflow.com/a/69012677)
* [Suggested build environment](https://github.com/rbenv/ruby-build/wiki#macos)
* [BUILD FAILED (macOS 12.0.1 using ruby-build 20211019)](https://github.com/asdf-vm/asdf-ruby/issues/232#issuecomment-1062141372)
* [m1macにasdf install ruby latestで苦戦しまくった話](https://blog.mrym.tv/2021/10/m1mac-asdf-install-ruby-latest-error/)
Atcoder 始めました．やったことまとめ（Python）

Atcoderを始める人，Pythonで進めていきたい人向けにやったことをまとめていこうと思います．

# 目標
水色をまずは目指したいと思います！
アプリ開発や機械学習系の研究はしていますが，アルゴリズムあたりは苦手です．．．
開始時のステータスはM2，23歳です．

# DockerでPython環境構築
特に高速に処理する必要はないので，Dockerで環境構築します．
今回作ったフォルダはGitHubに上げてます．
https://github.com/kami9811/atcoder_python_environment

# 参考にするところのリストアップ
会員登録と同時にコンペの準備をやりました（2022/9/22）

実際に終わったやつから[DONE]をつけていきます

__環境のヒント__
- https://qiita.com/marogoma/items/c39ee7638c2a3ae7552d

__練習__
- [DONE: 2022/9/23] https://atcoder.jp/contests/practice
普通に練習のB問題時間かかって笑ってしまった．

__Python特化の練習部__
- [DONE: 2022/9/24] https://techblog.finatext.com/lets-do-competitive-programming-with-python-9c8b834769f6
- https://qiita.com/ryusuke920/items/4a3bf6cd07d4df39c06e

__AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～ 関連__
- [DONE: 2022/9/23] https://atcoder.jp/contests/abs
- https://qiita.com/drken/items/fd4e5e3630d0f5859067
- https://delta114514.hatenablog.jp/entry/2018/03/15/014555

意外と簡単だった10問．全探索とかでCは行けるのかって感じ．

__アルゴリズム系の勉強__
- https://algo-logic.info/how-to-think-cp/ 　（考え方のお話）
- https://algo-logic.info/competitive-programming-must/ （アルゴリズムのお話）

__過去問（バチャコン）__
- https://kenkoooo.com/atcoder/#/table/
    - 便利なリンク集に色々載ってる: https://atcoder.jp/posts/261
- https://qiita.com/e869120/items/eb50fdaece12be418faa

# コンペの参加状況
進捗があり次第まとめていきます．

## 会員登録
やることの気分転換に始めました（2022/9/22）

## 2022/9/24（土曜）　トヨタ
~~初参加予定...~~ 初参加してきました！
事前学習はpractice, 精選10問, Python特化の練習部, アルゴリズムの初級（DFS含む）＋Uniform-find tree みたいな感じです．

精選10問とか触った感じ，Cまではいけて，Dはワンチャン...とか思ってたんですけど
__Cで大爆死でしたw__
Cは木構造の単純パスをDFSで見つけるって問題でした．

死因としては主に大規模な木構造へのPythonの書き方を理解していないことでした．居残りでCを倒して気づいたんですけど，大規模木構造への解決策は
__1. メモリアクセスの効率化__
__2. 再起回数の増加__

という感じです．

「メモリアクセスの効率化」は上のPython特化記事にもありますが，Pythonのsetはハッシュメモリアクセスなので，
```Python
route = [a, b, c]  # list
if a in route:
  ...  # こっちより O(N)
route = {a, b, c}  # set
if a in route:
  ...  # こっちの方が早い O(1)
```
という感じで高速化ができるんですよね．

あとはDFS自体はアイディアにあったんですけど，Pythonの関数再起呼び出し回数の上限がデフォルトで1000回になっているのを知らなかったことが問題でした...

これは
```Python
sys.setrecursionlimit(400000)
```
と書くだけで再起回数上限のエラーは消せるので，知っておけばなんともない話でした．本番中はこいつのせいで無限にREが消えませんでした．

今回は知っておけばどうとでもなるところで詰まってしまったので，来週までにアルゴリズムだけじゃなく，Pythonで問題をいくつか解いておきます←超大事
Dもちょっとつまみ食いして今日は寝ます．
bladeファイルが認識されてない時に真っ先に疑うべきこと


# bradeになってないか確認！！以上！！

本当はbladeが正解です。

なぜか片方のbladeファイルは反応するのにもう一つが反応しないなんてことがあったら多分これです。

僕はこれで3時間も無駄に考えてしまいました

おかしいと思ったらまずはファイル名を確認しましょうねwwwww
【Android】GPSを利用する方法【kotlin】

GPSでは場所を移動するたびに緯度情報がコールバックされ、情報を受け取ることができます。
そのためにコールバックに必要なメソッドを用意してインスタンスを渡します

**LocationListener**インターフェースを継承し、４つのメソッドをoverrideすることで利用可能になります

# onLocationChanged
```
override fun onLocationChanged(location: Location?) {
    }
```
位置情報が変更された時に呼ばれる
# onStatusChanged
```
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
    }
```
GPSが利用不可、利用可能になった時に呼ばれる
# onProviderDisabled
```
override fun onProviderDisabled(provider: String?) {
    }
```
プロバイダを使用不可にした時に呼ばれる
# onProviderEnabled
```
override fun onProviderEnabled(provider: String?) {
    }
```
プロバイダを使用可能にしたときに呼ばれる
突然Firebase Storageで画像が表示されず。「A required service account is missing necessary permissions」になった。（解決済み）

2022/09/23 の夜、個人で運営しているサイトの画像がすべて表示されなくなった。
エラーの内容を見てみると、
```
{ "error": { "code": 412, "message": "A required service account is missing necessary permissions. Please resolve by visiting the Storage page of the Firebase Console and re-linking your Firebase bucket or see this FAQ for more info: https://firebase.google.com/support/faq#storage-accounts" }}
```
というような内容だった。

急いでエラーメッセージをもとに検索してみると、
firebaseのgithub上で、まさに09/23付けでIssueが立ち上がっていた。

その内容をもとにどのような修正を行ったか、書き記しておく。


①Google Cloud のIAMを開く
https://console.cloud.google.com/

②画面上部のADDから、新しいプリンシパルを作成する。
「新しいプリンシパル」：
service-[firebaseのプロジェクト番号]@gcp-sa-firebasestorage.iam.gserviceaccount.com

「ロール」
Cloud Storage for Firebase サービス エージェント

③保存して、確認する。（反映に数分時間がかかる？）

以上の設定で再びStorageにアクセスできるようになりました。


※firebaseのプロジェクト番号は、firebaseプロジェクトの「プロジェクトの設定」画面に書いてあります。

主に参考にしたもの
・上記のIssue：
https://github.com/firebase/flutterfire/issues/9588

・Firebaseのcloud-storageのサービスアカウントについて
https://firebase.google.com/support/faq#storage-buckets

突然こういう事態が発生するのかと驚きました。
取り急ぎ以上です！
PC買い換え後にGit環境を整えてみた

PC買い換え後にGitの環境構築に躓いたので、忘備録として残す。

主な手順としては以下の通りである。

##### ①パスを通す

##### ②ssh暗号キーの再設定とGitへの再登録

なおGitへの登録方法は以下を参考に進めるものとする。

https://datawokagaku.com/github_ssh/

今回は特に①の部分についてのものを書く。

まずPC買い換え後に躓いた箇所がここ

    MacBook-Pro:work SHOTA$ git push origin main
    git@github.com: Permission denied (publickey).
    fatal: Could not read from remote repository.

何でgit pushしたのに許可出来ないなどと言われないとならない？

そうか、そういえばGitのssh接続の設定をし忘れていたと思い、登録方法をもとに手順を進めていくと、今度はここで躓く。

    -bash: subl: command not found

sublコマンドができない。。。

な、なぜ？？？

もはや頭はプチパニック

そしてここでパスが通っていないことにようやく気がつく。

パスとは環境変数のことで、ここを参考にすると良い。

https://datawokagaku.com/what_is_path/

パスは一時的に生成されるもので、シェルが消えてしまったりすると消えてしまう。

これを永続的にシェルが立ち上がるたびに生成される様にするには、すでにPATHが通っているパスにsublをぶち込んであげる必要があり、すでにPATHが通っているパスにsublの**シンボリックリンク**を貼るのが良い。

というわけで、以下のコマンドを入れてあげる。

    ln -s //Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl //usr/local/bin/.

すると

    MacBook-Pro:// SHOTA$ ln -s //Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl //usr/local/bin/.
    MacBook-Pro:// SHOTA$ subl
    MacBook-Pro:// SHOTA$ subl test

無事にパスが通り、その後Sublime Textも起動できた。

sshキーも無事に再発行＆Gitに再登録できたので、めでたしめでたし。

    MacBook-Pro:work SHOTA$ git push origin main
    Enumerating objects: 3, done.
    Counting objects: 100% (3/3), done.
    Delta compression using up to 8 threads
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (3/3), 27.87 KiB | 4.64 MiB/s, done.
    Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
    To github.com:kamikami1107/DS_statistics.git
     * [new branch]      main -> main
FlutterでMVVMを採用して、カレンダーアプリを作成してみた件

カレンダーって使うことも多いと思うのですが、
意外といい感じのパッケージがなかったりコピペできそうな実装もないので作成してみました

Flutterで使われることの多いアーキテクチャのMVVMをFreezedを使用して実装しました
READMEとQiitaの記載は随時やっていこうと思ってます
（適宜コメント書いているので何となくはわかるかと思います）


<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737689/c87f8184-9b9a-c1aa-fcba-192af71d1579.gif">

ボタンを押したりスクロールすることで表示している年月を変更でき、
タップすることで選択状態を変更することができます

レイアウトをかなりシンプルに作ったので、適宜修正していただければと思います

ソースはこちらになります
https://github.com/Gnao/calendar


## リンク
https://qiita.com/slovenly_engineer/items/99b9a2e70a5294008c16
Axonを使って線形回帰のパラメータ（傾きと切片）の値を求めてみよう

# Axon のHello world

AxonをLiveBookを使っていろいろ試してみたのですが、うまくいかず、苦労しました。

最も簡単な、y = ax + b にフィッテングしてみました。

# 処理の流れ

y = 2 * x + 0.5 + 乱数　の{x,y}の組を100個つくる
↓
train_model()で、フィッティングする
↓
結果表示


# LiveBookで実行したコード

## Setup
```Elixir
Mix.install([
  {:nx, "~> 0.3.0"},
  {:kino_vega_lite, "~> 0.1.3"},
  {:axon, "~> 0.2"},
])
```

## 本体

```Elixir
defmodule Basic do
  require Axon

  def build_model(input_shape) do
    inp1 = Axon.input("x", shape: input_shape)

    inp1
    |> Axon.dense(1)
  end

  defp batch do
    x = Nx.tensor(for _ <-1..100, do: [:rand.uniform()])
    y = Nx.multiply(x, 2)
     |> Nx.add(0.5)
     |> Nx.add(Nx.tensor(for _ <-1..100, do: [:rand.uniform()])|>Nx.multiply(0.5))
    {x, y}
  end

  defp train_model(model, data, epochs) do
    model
    |> Axon.Loop.trainer(:mean_squared_error, :sgd)
    |> Axon.Loop.run(data, %{}, epochs: epochs, iterations: 1000)
  end

  def run() do
    model = build_model({nil})
    data100 = batch()
    data = Stream.repeatedly(fn -> data100 end)
    # data = Stream.repeatedly(&batch/0)
    model_state = train_model(model, data, 10) |> IO.inspect(label: "model_state")

    result = Axon.predict(model, model_state, %{"x" => Nx.tensor([[0, 1]])|>Nx.transpose()   })
    {data100, result}
  end
end
```

## 結果表示

```Elixir
{{x,y},predict_y} = Basic.run()

VegaLite.new(width: 600, height: 600)
|> VegaLite.layers([
  VegaLite.new()
  |> VegaLite.data_from_values(x: x |> Nx.to_flat_list(), y: y |> Nx.to_flat_list())
  |> VegaLite.mark(:point, tooltip: true)
  |> VegaLite.encode_field(:x, "x", type: :quantitative)
  |> VegaLite.encode_field(:y, "y", type: :quantitative),
  VegaLite.new()
  |> VegaLite.data_from_values(x: [0, 1], y: Nx.to_flat_list(predict_y))
  |> VegaLite.mark(:line)
  |> VegaLite.encode_field(:x, "x", type: :quantitative)
  |> VegaLite.encode_field(:y, "y", type: :quantitative)
])
```

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/ea110edd-efc2-fd0f-dd80-6deada1ffabf.png)


# model_stateの値


```Elixir
model_state: %{
  "dense_0" => %{
    "bias" => #Nx.Tensor<
      f32[1]
      [0.6768180131912231]
    >,
    "kernel" => #Nx.Tensor<
      f32[1][1]
      [
        [2.0908796787261963]
      ]
    >
  }
}

```

切片のほうは乱数のばらつきで多少誤差がありますが、ほぼ正しい値が得られてる。

やっと入口にだとりついた。



参考
https://hexdocs.pm/axon/0.2.0/multi_input_example.html#everything-together
AWSにおけるバックアップの種類

# AWSにおけるバックアップの種類
## 初めに
何となくしか理解できていなかった分野。5回目はAWSにおけるバックアップの種類についてです。
AWS上ではEC2のバックアップ、RDSのバックアップ、AWSBackupでのバックアップなどいろいろと種類があり、業務で扱っていながら何となくの理解で済ましてしまっているのでこれを機にしっかりとまとめたいと思います。

## バックアップの種類
まずこの記事で扱うAWSにおけるバックアップの種類ですが、下記についてかいせつしていこうとおもいます。
・EC2のバックアップ
・RDSのバックアップ
・AWSBackup（AWSのサービス名）で取得できるバックアップ

### EC2のバックアップ
そもそもEC2のバックアップはEBSスナップショットとAMIがあります。

#### EBSスナップショット
EBSスナップショットは、EBSのバックアップでS3上に作成されます。S3に保管されたスナップショットはリージョン内の複数のAZ間で同期されます。

#### AMI
AMIにはEBSのスナップショット情報、AWSアカウントがAMIを使用してインスタンスを起動可能にするための起動許可、インスタンスの起動時にインスタンスにアタッチするボリュームを指定するブロックデバイスマッピングなどの情報が含まれており、AMIさえあればEC2をAMI取得時点の状態に復元できます。ですので、EC2のバックアップは基本的にAMIを取得するという形になります。（その中にEBSのスナップショットも含まれます。）

### RDSのバックアップ
RDSのバックアップはRDS自体に備わっている自動バックアップと手動でバックアップを取得する手動バックアップの2種類があります。DBインスタンスの初期スナップショットはDBインスタンスの古データ、後続のスナップショットは増分のデータが保存されます。

#### 自動バックアップ
自動バックアップで取得されるバックアップは２種類あります。
１つ目が、スナップショットです。１日１回バックアップウィンドウとして設定された時間帯に取得します。
２つ目が、トランザクションログです。トランザクションログは、RDSへのすべての書き込みトランザクションを記録しているログで、５分ごとに取得されます。
この２つのバックアップデータを組み合わせることで、特定の時刻を指定し、その時刻時点のデータを復元することができます。

#### 手動バックアップ
文字通り手動でバックアップを取得する方法です。自動バックアップとは異なり、手動スナップショットはバックアップ保持期間の影響を受けません。スナップショットは期限切れになりません。

### AWSBackUp
AWS Backup はフルマネージド型のバックアップサービスであり、AWS のサービス、クラウド内、およびオンプレミス間で簡単に一元化およびデータ保護を自動化できます。このサービスを使用すると、1 つの場所でバックアップポリシーを設定し、AWS リソースのアクティビティを監視できます。
また、RDSは自動バックアップ機能があるのでAWSBackUpでわざわざバックアップを取得する必要があるのか？と思うかもしれませんが、AWSBackUpだと、「指定の時間に取得できる」「RDSが削除されてもバックアップが消えない」「他のリソースと同じ場所で一元管理できる」等のメリットがあります。

サポートされている代表的なリソースは
・EC2
・S3
・EBS
・RDS
・EFS
などなど。。これ以外にも多くの種類のリソースをサポートしています。

ちなみにEC2のバックアップはAMIを取得という形になります。また、AWSBackUpのコンソールでは手動、自動、AWSBackUpで取得したバックアップが一元的に管理されています。

## まとめ
次回以降ですが、Linuxのディスク回り、AWSのセキュリティサービスなどについてまとめようと思います！