OmniAICreator/Qiita-1.07M huggingface dataset:
sklearnによるk-近傍法

k-近傍法は機械学習のアルゴリズムである。機械学習の中でも教師あり学習に分類される。回帰と分類問題両方に対応可能。

```python
from sklearn.neighbors import KNeighborsClassifier

n = n_neighbors #近傍点の数
clf = CNeighborsClassifier(n_neighbors = n) #モデルの生成

clf.fit(X_train, y_train)#訓練データを用いて学習

clf.predict(X_test)#テストデータの入力としてテストデータの属性値を予測


```

X_train:データの個数×属性の2次元配列
y_train:データの個数分の１次元配列。これはクラスデータを表す。（そのデータがどのクラスに分類されているか）

X_test,y_testはともにtrainデータと同じ構造である。


参考：https://qiita.com/fujin/items/128ed7188f7e7df74f2c
【メモ】PHPの概要を学ぶ

web系のサーバーサイドエンジニアを目指す奴のメモ書きです。

# ■サーバーサイドエンジニアとは
DB登録、取得など、画面で入力された情報などを処理する層のことをサーバーサイドという。
そのサーバーサイドのロジックを記述するのがサーバーサイドエンジニア。
主に使う技術としてはRuby,PHP,Java/MySQL/Linux/AWSなどがあるらしい。

# ■なんでphp
Youtubeで調べてみてもRubyだろうがPHPだろうがやれることは変わらないということなので
ほんの少し触ったことのあるPHPを学ぶことにする。
サーバーサイド言語は一つ学べば他は比較的簡単に習得できるとか。

# ■PHPとは
PHPは動的にWebページを作成できるサーバサイドのスクリプト言語
PHPの正式名称は「PHP: Hypertext Preprocessor」
Webアプリケーションの開発によく使われる
どうやら動的Webページを簡単に作成できるようにするための言語らしい
しかも習得しやすいらしい←ホンマか!?
MySQLなどのDBともやり取りが簡単
使い方としてはHTMLにPHPのコードを記述するような感じになるらしい
PHPはサーバーサイドで実行される。なので動かすためにはPHPがインストールされているWebサーバが必要みたい。
開発などローカルで頻繁にphpファイルをブラウザで開きたい時に便利なのがXAMPPというフリーウェア。
XAMPPを入れるだけでphpの環境が簡単に用意できる。
運用環境にデプロイする場合は、デプロイするサーバにphpをインストールしてあげる必要がある。
.php拡張子で保存することでphpファイルとして認識される。
`<?php ?>`　←<>の中にphpのコードを記載する。
基本的な記述方法については別でメモする

# ■phpのフレームワーク
無難なのはLaravelみたい。
cakePHPというフレームワークも結構人気らしいけどLaravelが世界で一番使われているPHPのフレームワークらしいのでLaravelを使ってやってみようと思う。
LaravelはMVCモデルを採用している。
Laravelについてはまた別でメモした！
https://qiita.com/4U5zo/items/9b724c9462e8ca488edc

参考サイト
https://www.kagoya.jp/howto/it-glossary/web/php/
https://www.internetacademy.jp/it/programming/php/what-you-can-do-with-php.html
https://techacademy.jp/magazine/6618
https://www.sejuku.net/blog/4097
https://www.php.net/manual/ja/faq.general.php
https://www.php-factory.net/aboutphp/01.php
https://www.youtube.com/watch?v=BDl3tXZlNZU
https://www.youtube.com/watch?v=ye4BCXOjGOw
https://www.youtube.com/watch?v=NqQsRsv22X8
プロジェクトのgem, 端末にインストールされるgem,どっちを使うか指定する方法


## gemとは？
2つの意味があります。
1. **Rubyのライブラリ** のことです。詳細は[こちら。](https://www.ruby-lang.org/ja/libraries/)
1. **gemを管理するパッケージ管理ツール**の名前


ただ、gemというツールでパッケージを管理すると、依存関係で問題が発生することがあります。
そこでBundlerが登場します。

## bundlerとは？
依存関係を考慮してgemを管理してくれるパッケージ管理ツールです。
https://bundler.io


## Gemのインストール方法は大きく2種類

1. 端末全体で使えるタイプ(globalインストール)
mac,windows内のどこでも使えるようになる。
1. プロジェクト(特定の階層)でのみ使えるタイプ(localインストール)
作っているアプリの中で使えるようになる。

# 結論

### `bundle exec`をつける = ローカルインストールのgemが呼ばれる
例)
```
bundle exec rails g controller users
```

### `bundle exec`をつけない = グローバルインストールのgemが呼ばれる



## 参考
bundleをつけて実行しておけばOKかなくらいに思ってたので、これで理解できました。

https://teratail.com/questions/207501
[個人的] AWS タグ戦略

## 概要
個人的なAWS タグ付け方針をまとめる

## 結論
### 必須なもの
|タグ名|概要|例|
|-----|----|---|
|project|プロジェクト名|HogeHogeService|
|resource|リソース名|stg_hoge_hoge_service_cdk|
|creator|リソースを作成した方法|cdk|

### 不特定多数の人が触る環境の場合
|タグ名|概要|例|
|-----|----|---|
|owner|管理者名|hogehoge_team|

### 個人用アカウント(or開発アカウント)の場合
|タグ名|概要|例|
|-----|----|---|
|usetype|使用種別|temp|

## 各タグの説明
### project
目的: プロジェクト全体のコストを把握するため
IaCをする場合, この名前=リポジトリ名にしておくと, 迷わなくて済む.
もし, プロジェクト名≠リポジトリ名の場合は, `repository` タグがあると無難.

### resource
目的: リソース単位でコストを把握するため
これがないとコスト管理が難しくなるので必須.

### creator
目的: 修正時どのように対応すればよいかを把握するため
コンソールからリソースを修正してよいか否かの判断に役立つ.

具体的には以下がつく想定
|タグの値|概要|
|-------|----|
|manual|手動で作成した場合|
|cfn|CloudFormationsテンプレートにて作成した場合|
|sam|SAMテンプレートにて作成した場合|
|cdk|CDKを使用して作成した場合|
|sdk|aws cli 等なにかしらAPI経由で動的に作成した場合|
|terraform|Terraformにて作成した場合|

※ samはcfnに入れてもいいかも

### owner
目的: 管理者を把握するため
何か問題が発生した際, 誰に聞けばよいかが分からないと辛いため.
また, コストの請求にも使用可能.

個人開発であれば, 誰が管理者か自明なため不要.

### usetype
目的: 一時的な検証目的か把握するため
特に個人開発において, そのリソースを消してよいかを判断するために使用.
1年前に作成したリソースが必要なものか記憶がない場合がほとんどのため.

お仕事の場合, 開発環境にてリソースの整理をする際, 消してよいか判断のよりどころとして使用.
本番環境の場合, 使用しているサービスのみなはずのため不要.

具体的には以下がつく想定
|タグの値|概要|削除可否|
|-------|----|-------|
|service|使用しているサービス|NG|
|temp|一時的な技術検証用|OK|
|stresstest|負荷テスト用|OK|

削除可否の扱い
- 個人開発の場合: 記憶になければOK (記憶にあればそもそも削除してよいか否か分かるはず)
- お仕事の場合: 1,2週間ほど動いていなければ削除してもよさそう (実際にしてよいかは職場ルールによる)

## 必須にはしなかったもの一覧
[AWS公式のタグ戦略](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) をもとに, 今回は必須にしなかったもの一覧.
いつの日かつけるかも...? 状況によりそう

- アプリケーション ID
    - `project` タグでよさそう
- アプリケーションロール
    - DynamoDB等で, このテーブルがマスターテーブルであるか否かを判断するために使用するのはありかも
    - それ以上は現時点であまりイメージがわかず...
- クラスター
    - 現時点であまりイメージがわかず...
- 環境
    - アカウントごと分けたい派
- バージョン
    - アーキテクチャレベルでバージョンを分けるイメージがわかず...
- オートメーション系
    - 動的にリソースを作成/削除したことがないため今回は割愛
    - 予定削除時間が分かるのであればタグに残しておくのはありかも
        - その時間を超えて残っている場合削, 除してよい判断の基準となるため
- コストセンター/ビジネスユニット
    - 所有者とコスト管理者が分かれていそうな場合
    - それ所有者な気がする
- 顧客
    - 顧客が所有者と一致しない場合はつけてもよさそう
    - 所有者が作成会社の場合等
- セキュリティー系
    - アクセス制限をする場合あってもいいかも

## その他つけてもよさそうなタグ
- removal
    - CFn スタック等を削除した場合, そのリソースが削除されるか否かを把握するために使用
- dbtype
    - このDBの種別を把握するために使用 (マスターテーブルであるか否か)
windowsでArdupilotのSITLを実行する

## 環境
windows 10

## 手順
大きくは以下２ステップのみ
①スクリプトファイルを作成＆実行
②cygwinでSITLの実行コマンドを入力

## スクリプトファイルを作成＆実装
C:\Users\ユーザー名（あなたのPCのユーザー名）\
上記フォルダ内で新規ファイル作成
ファイル名：SITL.ps1
以下の内容をコピー＆ペーストで保存
```
#Powershell script to download and configure the APM SITL environment

Import-Module BitsTransfer

Write-Output "Starting Downloads"

Write-Output "Downloading MAVProxy (1/7)"
Start-BitsTransfer -Source "https://firmware.ardupilot.org/Tools/MAVProxy/MAVProxySetup-latest.exe" -Destination "$PSScriptRoot\MAVProxySetup-latest.exe"

Write-Output "Downloading Cygwin x64 (2/7)"
Start-BitsTransfer -Source "https://cygwin.com/setup-x86_64.exe" -Destination "$PSScriptRoot\setup-x86_64.exe"

Write-Output "Downloading ARM GCC Compiler 10-2020-Q4-Major (3/7)"
Start-BitsTransfer -Source "https://firmware.ardupilot.org/Tools/STM32-tools/gcc-arm-none-eabi-10-2020-q4-major-win32.exe" -Destination "$PSScriptRoot\gcc-arm-none-eabi-10-2020-q4-major-win32.exe"

Write-Output "Installing Cygwin x64 (4/7)"
Start-Process -wait -FilePath $PSScriptRoot\setup-x86_64.exe -ArgumentList "--root=C:\cygwin64 --no-startmenu --local-package-dir=$env:USERPROFILE\Downloads --site=http://cygwin.mirror.constant.com --packages autoconf,automake,ccache,cygwin32-gcc-g++,gcc-g++=7.4.0-1,libgcc1=7.4.0.1,gcc-core=7.4.0-1,git,libtool,make,gawk,libexpat-devel,libxml2-devel,python37,python37-future,python37-lxml,python37-pip,libxslt-devel,python37-devel,procps-ng,zip,gdb,ddd,xterm --quiet-mode"
Start-Process -wait -FilePath "C:\cygwin64\bin\bash" -ArgumentList "--login -i -c 'ln -sf /usr/bin/python3.7 /usr/bin/python'"
Start-Process -wait -FilePath "C:\cygwin64\bin\bash" -ArgumentList "--login -i -c 'ln -sf /usr/bin/pip3.7 /usr/bin/pip'"

Write-Output "Downloading extra Python packages (5/7)"
Start-Process -wait -FilePath "C:\cygwin64\bin\bash" -ArgumentList "--login -i -c 'pip install empy pyserial pymavlink intelhex'"

Write-Output "Installing ARM GCC Compiler 10-2020-Q4-Major (6/7)"
& $PSScriptRoot\gcc-arm-none-eabi-10-2020-q4-major-win32.exe /S /P /R

Write-Output "Installing MAVProxy (7/7)"
& $PSScriptRoot\MAVProxySetup-latest.exe /SILENT | Out-Null

Write-Host "Finished. Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
```
 ## powershellで実行
WindowsPowerShellを起動し（※起動時は右クリックで管理者として実行）
以下コマンドでスクリプトを保存したフォルダに移動＆スクリプトを実行する。※ユーザー名はあなたのPCのユーザー名
```
cd C:\Users\ユーザー名
```
```
./SITL.ps1
```

## cygwinでSITLの実行(上記のスクリプト実行完了後）
cygwinを起動
cygwinで以下コマンドを入力
```
cd ardupilot/Rover
```
```
../Tools/autotest/sim_vehicle.py --map --console
```

## 確認
mavproxy、map、console画面が開く！！

## 参考サイト
https://ardupilot.org/dev/docs/simulation-2.html
https://github.com/ArduPilot/ardupilot/blob/master/Tools/environment_install/install-prereqs-windows.ps1
https://github.com/ArduPilot
https://ardupilot.org/dev/index.html
初めてのAppleScript。ダイアログとプログレスバーで遊ぶ

![Apr-09-2022 20-22-01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/a1ee4806-d2de-9325-be45-5f6d1d7359d0.gif)

実に可能性を感じるアプリを作りました。

## この記事について
AppleScriptを学び始めて1hでこんなアプリができたのでそのメモ

## コード

```AppleScript
display dialog "実行しますか？"
display dialog "...本当に実行しますか？"
set progress total steps to 10
set progress completed steps to 0
set progress description to "実行します。"

repeat with a from 1 to 10
	set progress completed steps to a
	if a = 2 then
		set progress description to "ざわ.."
	else if a = 3 then
		set progress description to "ざわ..ざわ.."
	else if a = 5 then
		set progress description to "ざわ..ざわ..ざわ.."
	else if a = 7 then
		set progress description to "くるぞ.."
	else if a = 9 then
		set progress description to "うおおおおおおおおおおお"
	end if
	delay 1
end repeat

-- Reset the progress information
set progress total steps to 0
set progress completed steps to 0
set progress description to ""

display dialog "🌸🌸🌸🌸🌸🌸開花🌸🌸🌸🌸🌸🌸"
```

## AppleScriptでのAppの作り方

![スクリーンショット 2022-04-09 20.46.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/a71cacc4-c2d0-b228-0831-de51bf672b7e.png)

macにデフォルトで入っている`スクリプトエディタ`を起動

![スクリーンショット 2022-04-09 20.47.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/090ef148-bb7e-74bc-e1e8-6c6912c635e8.png)

　こんな画面が出てくる

ここに上記のコードを貼って、Command + S で保存する。
その際にアプリケーションを選択すればできる

![スクリーンショット 2022-04-09 20.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/a431c067-6547-ee3b-0d6d-d13c30145339.png)

## コードのポイント

### ダイアログを表示する

```
display dialog "実行しますか？"
```


![スクリーンショット 2022-04-09 20.50.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/4dbeacc6-201c-7b5a-4e39-aece6990f772.png)


### プログレスバーを表示する
参考にも貼っている[ここ](https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/DisplayProgress.html)からとってきてる。

アプリの起動の仕方によってプログレスバーの表示の仕方が違うことに注意。

|プロパティー|内容|
|:--|:--|
|progress total steps|プログレスバーの値の最大値 (Integer)|
|progress completed steps|プログレスバーの値 (Integer)|
|progress description|プログレス中に表示する文言 (String)|



## 参考
https://zenn.dev/suzuki_hoge/articles/2020-12-apple-script-984ae31d9a473ca1ffb2

https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/DisplayProgress.html
Ryzen 9 5900Xはゲームに向いているのか？

![Screen Shot 2022-04-09 at 4.37.35 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627299/8287d679-1f69-3362-a4c8-b9e63f584db7.png)

はじめに Ryzen 9は、AMDの最新ハイエンド・デスクトップ・プロセッサーです。

AMDは、同社の最高級デスクトップ・プロセッサーである最新のRyzen 9プロセッサーを発表しました。このチップは、可能な限り最高のパフォーマンスを求めるゲーマーやエンスージアスト向けに設計されています。Ryzen 9プロセッサーは、最大16コア、32スレッドを搭載し、市場で最も強力なプロセッサーの1つとなっています。高い性能と素晴らしい機能を備えたRyzen 9は、パワフルで効率的なデスクトップコンピュータをお探しの方に最適です。

ベンチマーク：Ryzen 9 5900Xのゲームでの性能は？

AMD Ryzen 9 5900Xは、2019年3月に発売されたハイエンド・プロセッサーです。12nm Zen 2アーキテクチャを採用し、最大10コア20スレッドを実現したプロセッサーです。今回は、Ryzen 9 5900Xの性能をさまざまなゲームやベンチマークでレビューしていきます。

価格は？Ryzen 9 5900Xは価格に見合う価値があるのか？
 
Ryzen 9 5900Xは、ゲーマーやパソコンユーザーを満足させる強力なCPUです。8コアと16スレッドを搭載し、市場で最も強力なプロセッサの1つです。しかし、その値段は妥当なのでしょうか？499.99ドルの値札をつける価値があるのでしょうか？一言で言えば、「イエス」です。Ryzen 9 5900Xは、素晴らしいパフォーマンスと価値を提供します。

ここでは、ゲーム向けのRyzen 9 5900Xについて知っておく必要があることを説明します。

Ryzen 9 5900Xは、2019年初頭に発売されたハイエンド・プロセッサーです。ゲーム用に設計されたプロセッサーで、市場でもトップクラスの性能を誇ります。8コア16スレッドを搭載しており、ゲーミングパソコンのアップグレードを検討されている方に最適です。さらに、このプロセッサーは、Radeon Vegaグラフィックスにも対応しています。

"Ryzen 9 5900X "は市場最高のゲーミングCPUなのか？
 

AMDのRyzen 9 5900Xは、市場で最も強力なCPUの1つであり、ゲーマーに最適なCPUです。ベースクロック3.4GHz、ブーストクロック4.3GHzのこのCPUは、あらゆるゲームタスクを簡単に処理することができます。さらに、5900Xは16コア、32スレッドを搭載しているので、マルチタスクも問題なくこなせます。市場で最高のゲーミングCPUを探しているなら、Ryzen 9 5900Xは間違いなく検討する価値があります。

"Ryzen 9 5900Xの追加コアはゲーマーにとって違いがあるのか？"

長年、インテル・プロセッサーは市場を支配してきました。AMDは昨年、Ryzenブランドのプロセッサーで躍進を遂げましたが、それでもまだ二番手と見なされていることがほとんどです。しかし最近、AMDはRyzen 9 5900Xと名付けられた最新のプロセッサーのラインナップを発表しました。このプロセッサーは、12コアと24スレッドを搭載しており、他のプロセッサーとは一線を画しています。では、この追加された火力はゲーム性能にどのように影響するのでしょうか？簡単に言うと、大きな違いはありません。実際、コア数の増加によってパフォーマンスがわずかに向上するゲームもあれば、まったく顕著な変化が見られないゲームもあります。最終的には、ゲームの最適化と、開発者が5900Xでこれらの機能を特別に利用したかどうかにかかっている。（uniq関数は https://www.vigotest.de/cpus-fur-gtx-1060/ より引用）

結論 Ryzen 9 5900Xは、最高のパフォーマンスを求めるゲーマーに最適な選択肢です。

Ryzen 9 5900Xは、最高のパフォーマンスを求めるゲーマーに最適な選択肢です。シングルコアとマルチコアの性能に関しては、インテル Core i9-9900Kを約30％上回っており、高性能なPCに投資したい人には最適な選択肢と言えるでしょう。しかし、5900Xはコストパフォーマンスが高い反面、デメリットもあります。1つ目は、その価格から誰にでも適しているわけではないこと、2つ目は、より高価なオプションと比較してオーバークロック機能が限定的であることです。それでも、全体として、Ryzen 9 5900Xは、高性能なゲーミングPCを購入しようとしている人にとって、素晴らしい選択肢となります。
pタグとspanタグとdivタグの違いについて

# はじめに
こんにちわ、きりです。

１０代のときにレンタルサーバで個人サイトを作ったり、サークルのHPを作ったりとにわかWebエンジニアだった、わたくしですが。
今更ながら、HTMLやCSSについて勉強をし直しております。

今回は表題の通り、pタグ、spanタグ、divタグについて、整理していきます。

これまで
div・・・グループでまとめるもの
p,span・・・テキストを表示するときになんとなく利用するもの

というイメージで、いずれも、CSSでスタイルを当てるときに、タグが必要だから足してた感が否めません。

改めて調べてみると、（当然ながら）それぞれのタグには違いがあり、役割が異なることがわかりましたので、備忘録的な意味で記事を書くことにしました。

# divタグ
divタグは、「division（段とか仕切りの意味）」のdivで、ページ内の塊を定義するものです。
divタグはhtml4においては、ブロック要素になります。ブロックタグは「一つのかたまりとして認識される要素」です。
※対して、インライン要素は「文章の一部として扱われる要素」です。

またはhtml5においては、「フロー・コンテント（子孫にテキストなどを持つもの）」です。
※「フレージング・コンテント（段落などの中に含まれる文節・語句など）」ではありません。

# spanタグ
文章を修飾されるためのタグです。

spanタグはhtml4においては、インライン要素になります。インライン要素は「文章の一部として扱われる要素」 です。
１０行程度の説明文章があった場合、文章内で重要な単語などを太字にしたり、赤字にしたりする場合、重要な単語をspanで括り装飾します。

また、html5においては「フロー・コンテンツ（子孫にテキストなどを持つもの）」かつ「フレージング・コンテンツ（段落などの中に含まれる文節・語句など）」になります。

# pタグ
pタグは「Paragraph（段落）」の頭文字です。
divタグはhtml4においては、ブロック要素になります。ブロックタグは「一つのかたまりとして認識される要素」です。

またはhtml5においては、「フロー・コンテント（子孫にテキストなどを持つもの）」です。

# pタグの用途
これまでの説明から分かる通り、spanとdiv,pタグは用途や役割が全く異なります。
文章の一部の修飾する場合はpタグを使えば良いということがわかりました。

# divタグとpタグの使いわけについて
問題はこちらです、html4とhtml5の定義からすればどちらも同じことがわかります。
そのため、２つの使い分けはタグ名の由来に立ち戻り判断します。


divタグ
「division（仕切り）」の「div」なので、ページ内にブロックを作りたい時に使用。

pタグ
「paragraph（段落）」の「p」なのでページ内で段落を作る際に使用。

# 最後に
もやっとしていたことがすっきりし、とても爽快な気分です。
これで、pタグ、spanタグ、divタグ利用時にどのタグを利用すればよいかに迷わずに済みそうです。

# 参考リンク
* [【html】spanタグの使い方！divやpとの違いもわかりやすく解説](https://creive.me/archives/8720/#)
INA219電力計の使い方

INA219というバッテリーモニターに最適なボードがあるのですが、使い方が分かりにくかったので、備忘録として残しておきます。

# 接続方法

まずこのユニット、電圧計と電流計の両方の機能が同時に使えます。
従って、接続を間違うと、ショートさせてしまう危険があります。

端子は６つあります。接続先は以下の通り。

・VCC：3.3V〜5Vの駆動電圧。（ラズパイの5Vピンもしくは3.3Vピンへ）
・GND：アース（負極）
・SCL：i2c通信（ラズパイの物理5pin）
・SDA：i2c通信（ラズパイの物理3pin）
・Vin-：電源供給したい負荷回路（ラズパイの5Vなど）の＋極へ
・Vin+：電源（バッテリーなど）の＋極へ

つまり、INA219はVin+からVin-に流れる電流を測定します。同時に、Vin＋とGND間の電圧を測定します。
この電流と電圧から、電力を計算しているようです。



# 動作確認
https://github.com/chrisb2/pi_ina219

ここから、ライブラリをインストールします。

    ~$ sudo pip3 install pi-ina219

インストール出来たら、動作確認です。


    from ina219 import INA219
    from ina219 import DeviceRangeError

    SHUNT_OHMS = 0.1


    def read():
        ina = INA219(SHUNT_OHMS)
        ina.configure()

        print("Bus Voltage: %.3f V" % ina.voltage())
        try:
            print("Bus Current: %.3f mA" % ina.current())
            print("Power: %.3f mW" % ina.power())
            print("Shunt voltage: %.3f mV" % ina.shunt_voltage())
        except DeviceRangeError as e:
            # Current out of device range with specified shunt resistor
            print(e)


    if __name__ == "__main__":
        read()

# 実行結果
![スクリーンショット 2022-04-09 20.14.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226981/ee5eed59-8ba4-cfac-e699-01147182c286.png)
※降圧前の電圧電流モニターなので、8Vとかになっています。
ping値とjitter値について

大学でCCNAの授業を取っているので、アウトプット代わりにここにまとめていこうと思う。

今回はping値とjitter値について。

## ping値
ping値は応答速度を確認するための数値。単位はms（ミリ秒）を使う。
ping値は高画質の動画をみるときに重要である。（オンラインゲームなど）

場合によっては、pingではなくlatencyやresponse timeで応答速度を表すこともある。
ping値が低い方が、遅延時間が短く、応答速度が速いことになる。


## jitter値
jitter値はping値の揺らぎを表す数値で、値が小さいほうがping値は安定していて、揺らぎ幅が少ないということになる。jitter値が高い場合、ビデオ通話では映像が固まってしまったり、途切れることがある。

ping値が大きかった場合、jitter値を参考にすれば、偶然遅い数値が計測されたのか、それとも常に遅いのかが分かる。

※ ping値とjitter値はセットで確認したほうがいい。
MetabaseでCSVデータを集計・可視化する方法

# はじめに
データ分析にあたってどんなデータなのかを可視化してみることが第一歩になります。また、モニタリングすべき数値があれば、リアルタイムに、誰でも見れる状態にしておくことが理想です。これらのために、BI（ビジネスインテリジェンス）やダッシュボードツールが存在します。
一般に使われる製品としては、セールスフォース社のTableauやマイクロソフト社のPowerBiがあります。しかし、個人で利用するには少々お高め。。。
無料のものとして、RedashやMetabaseがあります。
今回は、Metabaseを使って、delika等で取得できるCSVデータを可視化してみます。標準機能では、DB接続のみですが、アドオンのツールを使ってCSVで読み込めるようにします。

# 要件
- 前提：Metabaseが稼働している
- CSVデータを読み込み、可視化（グラフ化）する

# Metabaseについて
無料で使えるダッシュボードツールです。いわゆる、ローコード開発が可能で、SQLを知らなくても、データを抽出し、集計できるようになっています。もちろんSQLを書くことも可能です。
MySQLやPostgreSQL、SQLiteなどのオープンソースのデータベース、OracleやSQLServerのDB製品、Redshift(AWS)とBigQuery(GCP)のクラウドサービス、など多様なデータソースに対応しています。
ただ、惜しいことにCSVやエクセルファイルなどには標準では対応しておりません。
公式サイト：https://www.metabase.com/
※インストール方法はJavaを使う方法、Dockerを使う方法があります。Documents内のInstallを参照ください。

# 実装方法
csv-metabase-driverをインストール！で完了します。簡単ですね。プラグインとして、CSVを読み込めるようなドライバーを作ってくれている人がいます。

1. 下記、GithubのREADMEを開く
https://github.com/Markenson/csv-metabase-driver
1. ページ中程Installation内の「this file」をダウンロード
1. metabase.jarが格納されているフォルダ内の「plugins」フォルダ内にダウンロードした「csv.metabase-driver.jar」を格納
1. Metabaseの再起動

# 使用方法

1. Metabaseにログイン
1. 「マイデータ」の追加を押す
1. データベースタイプにCSVが追加されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119135/740ae0a6-9a2c-647e-1c0e-2b9725a9089d.png)
1. 下記のように設定値を入れる
- 表示名：CSVファイル名
- Directory：CSVファイルが格納されているフォルダパス
- Separator：「,」カンマ区切りや「\t」タブ区切りなど
- Charset：UTF-8やShiftJISなど文字コード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119135/063e71c1-23bc-4dd1-2e30-bf703be3274c.png)
1. データに追加されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119135/630cd024-f9ba-bef3-2eca-4cf634b2c245.png)

# 落とし穴
CSV読み込めたとおもったら、なんとすべて文字列になっていて、集計ができませんでした。。。色々調べてみたら、下記②の方法で解決しました。
## 試したこと①：データソース設定のAdvanced
下記、解決済みのIssueを見ると、AdvancedにColumnTypeを設定できることを見つけました。実際に、設定値に追加してみました。
```
&columnTypes=String,Date,Integer,Integer,String,String,Integer&dateFormat=yyyy-MM-dd-MM
```
結果はうまくいかず。。。結局文字列のままでした。

https://github.com/Markenson/csv-metabase-driver/issues/13

## 試したこと②：テーブルの詳細設定
Metabaseを触っていると「テーブルの設定」ができることがわかりました。（下記画像の本のマーク）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119135/7aa6efdc-39ea-ecb5-64d8-bb668adcb8a0.png)
遷移後、「このテーブルのフィールド」を押すと、フィールドタイプを選択できましたので、それっぽいものを設定してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119135/64c0f547-e683-bcf4-293a-561a27213162.png)
すると、Created Atが日付になり、Page Views Countが数値になったので、日別PV数のグラフを作ることが可能になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119135/8e2a16b6-3bc8-7aa9-d8a7-b5836912afcb.png)


# まとめ
元々MetabaseでCSVデータを参照したいと思ったきっかけは、DynamoDBのデータをCSVでダウンロードした後に、簡単に分析できないかなと思ったときでした。DynamoDBに入れているのに、SQLiteに入れ直すのもなーと思い、今使っているダッシュボードであるMetabaseに入れたいと思い、調べてみました。フィールドのところで詰まりましたが、なんとか読み込みに成功しました。
Rustで遺伝的アルゴリズム [optimiGAtion]


## 概要
　初めまして、最近Rustにはまっている学生です。ここでは、Rustの標準機能cargoを用いて、遺伝的アルゴリズムのライブラリを公開したので紹介させていただきます。


## Rustとは
Rustは、c++の正当後継言語と言われる汎用システム言語です。詳しいことは省略しますが、なんといってもメモリ管理が圧倒的に楽ということがメリットです。ほかにも、c++と同様の速度を保持、cargoによるパッケージ管理機能(pythonでいうpip)、エラーメッセージの充実さなどが評価されている、流行間違いなし（想像）の言語です。

しかし、満足のいく研究や設計の際に用いられる最適化アルゴリズム、遺伝的アルゴリズムの汎用ライブラリがなかったので、作ってみました。


## optimiGAtion
Rustで遺伝的アルゴリズム等の進化計算を支援するクレートです。任意の型、マルチ関数の時間的制御(評価関数を途中で変更できるということ)など対応しており、汎用性が非常に高いです。（2022/4/9現在は非対応、今後updateされる予定）


### Repository

githubに公開してます。この記事もREADME.mdの日本語版のようなものです。

https://github.com/nima555/optimiGAtion



## 遺伝的アルゴリズムとは
別で簡単に紹介してますので、こちらを参照してくだされば助かります。

https://qiita.com/nima_h/items/0b47cab7e7600f3aa5f5

(pythonによるとか書いてますがこの記事ではpythonは出てきません（？）理論のみ説明されています。)




## How to use.

まず、RustのフォルダにあるCargo.tomlの[dependencies]を編集しましょう。
```Carfo.toml
[dependencies]
optimigation = "0.1.0"
```

リリースされたばかりなのでバージョンも低いです、、、



次に、main.rsを以下のようにしましょう。ここでは浮動小数点バージョンのONEBOX問題を解いてます。
```main.rs

extern crate optimigation;
use optimigation::GenomeList;

use crate::optimigation::ga_algorithm::Generation;
use crate::optimigation::ga_algorithm::System;


fn sum(genome: &Vec<f32>) -> f32{

    let mut a: f32 = 0.0;
    for i in 0..genome.len(){
        a += genome[i];
    }
    a
}

fn main() {

    //評価関数のクロージャ作成（リスト形式）

    let c1: fn(&Vec<f32>) -> f32 = |x| {(sum(x)/x.len() as f32 - 10.0).abs()};
    let mut functions = Vec::new();
    functions.push(c1);




    let mut world = GenomeList::new(1000, 10, 0.0, 10.0, &functions);      //初期集団生成
    GenomeList::ga_loop(&mut world, 200, 1, 0.05, 0.0, 10.0);              //最適化開始

}
```

結果はすべて１の配列が理論解ですが、以下のように出力されます。
```
Note        : Creating first generation...
Note        : GA loop start.
Result      : Genome { dna: [9.999947, 9.999874, 9.999947, 9.999874, 9.999947, 9.999874, 9.999947, 9.999874, 9.999947, 9.999874], eval: 8.9645386e-5 }
Generations : 38761.0
```

浮動小数なので近似解が出てますね！



### GenomeList::new(usize, usize, f32,  f32,  &Vec< fn(&Vec<f32>) -> f32 >)
 初期集団を生成する関数です。第一引数に遺伝子の数、第二引数に遺伝子の長さ、第三引数に解の最小値、第四引数に解の最大値、第五引数に評価関数クロージャの参照がとられて、初期集団のリストを返します。


### GenomeList::loop(& mut Self, usize, i8, f32, f32, f32)
 最適化を行う関数です。第一引数に初期集団、第二引数に親遺伝子の数、第三引数に交叉方法を示す値、第四引数に解の最小値、第四引数に解の最小値をとります。

交叉方法は以下のようになります。
|   key | way of crossover                        |
| ----: | :-------------------------------------- |
|    -1 | inherited average of parents component  |
|     0 | inherited components in units of random |
| n > 0 | inherited components in units of n      |


## デメリット
　浮動小数しか対応していないこと！！　整数などの最適化は今は無理です。今後実装します。
WEBサイトのツリー図を爆速で作成するサイトを作りました。

## 成果物
https://treeezu.netlify.app
下のようなツリー図が作れます。
![スクリーンショット 2022-04-09 191249.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22714/078640b1-5804-5a44-0506-3391527b1dbc.jpeg)


## 経緯
エクセルでツリー図を作るのツラかったので作りました。

## 使い方
マウスオーバーでピンク色の箇所が編集可能箇所です。
ページ名を入力する箇所と線を引く箇所があります。


## 技術
Nuxt2.15.8
netlifyでデプロイ
保存にはlocalstrageを使用しています。サーバには保存していません。

## 制約
・現状、横階層が4つ、縦階層が10までにしてます。
・度々デプロイし直すのでデータの保管は保証できません。ご了承ください。
・保存はブラウザの印刷でPDF保存してください。A4に収まるかと思います。


## これから
反響あったら独自ドメイン購入して、Firebaseとかで会員制にしてツリー図を保存できるようにしたいです。
Cloudflare Pages で JAMstack 構成なデプロイに失敗するようになったら試したこと

Cloudflare Pages で JAMstack 構成なNuxtプロジェクトが
デプロイの度に20分かけて失敗するようになったので、
試したことをまとめておきます。

## Nuxt用設定確認
Deploy Nuxt on Cloudflare
https://nuxtjs.org/deployments/cloudflare/

```
Speed > Optimization > Auto Minify: Uncheck JavaScript, CSS and HTML
Speed > Optimization > Disable "Rocket Loader™"
Speed > Optimization > Disable "Mirage"
Scrape Shield > Disable "Email Address Obfuscation"
Scrape Shield > Disable "Server-side Excludes"
```

うちの場合は改善されたように見える時もありましたが、
すぐに失敗するようになりました。

## アカウント再作成
もしかするとリポジトリを再設定するだけでも良いかもしれませんが、
アカウントを削除して、リポジトリの設定やドメイン設定などを
一通りやり直すと、1分程度でデプロイが完了するようになりました。

しかし、デプロイに失敗することがまだあるようです。

## Fast builds 無効化
```
Settings - Builds & Deployments - Fast builds 
Disabled Fast builds
```

ビルド時間は2分半から6分ちょっとへ伸びてしまいますが、
デプロイは1分ちょっとで失敗しなくなりました。
また再発するかもしれませんが、しばらく様子を見ます。
IBM Cloudの新認定試験IBM Cloud Advanced Architect v1を受けてみた

# IBM Cloud Advanced Architect v1とは

IBM Cloudの認定技術者の1つで、3～5年程度の包括的な経験を積んだ上級レベルの試験です。新認定資格体系としては初の上級レベルの試験となります。2022年4月8日頃から受験可能になりました。

IBM Cloud Advanced Architect v1に合格すると、IBM Certified Advanced Architect - Cloud v1の認定資格を得ることができます。もちろんOpen Badgeももらえます。

<img width="160" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/2c35c300-ba65-64bd-0ce3-f5e19b8a9625.png">

認定資格および試験の概要はこちらです。

> https://www.ibm.com/training/certification/C9002800

# 学習方法

難易度はIBM Cloudの経験者であれば難しくはありませんでした。一応、下記サイトでラーニングパスが公開されていますが、私はやりませんでした。

> https://www.ibm.com/training/path/ibmcloudadvancedarchitect

# 受験方法

PearsonVUE社のサイトで予約して受験してください。

https://www.pearsonvue.co.jp/Clients/IBM.aspx

以前は最寄りのテストセンターでしか受験できなかったのですが、最近はカメラ付きPCがあれば自宅でも受験可能になりました。こういうご時世ですので、可能であれば自宅での受験をお勧めします。ただし部屋の片づけはきちんとしておいてください。私はいつも気分転換を兼ねてテストセンターで受けるようにしていますが。

# 合格点

60問中37問以上の正解で合格です。正答率は61%です。IBMの認定試験では甘い方だと思います。

# 出題内容

試験規約により具体的な問題文は書けませんので、雰囲気になります。

* 高可用性の設計、必要なクラウドサービス
* 高負荷サーバの性能向上方法
* クラウドマイグレーションの方針、ツール
* DDoS攻撃の防御方法
* セキュリティ関係のサービス
* クラウドベンダーとユーザーの責任共有
* データレジリエンシー
* Twelve Factor App
* Kubernetes
* OpenShift
* Schematics

# 感想

初の上級試験ということでドキドキしながら受験しましたが、はっきり言って拍子抜けするほど簡単でした。開始5問目くらいで合格を確信できました。私には中級のProfessional Architectの方が難しかったです。
目的変数と説明変数の特徴量との違い

目的変数や説明変数は機械学習などでよく使われる変数である。

目的変数：予測したい変数
説明変数：目的変数を説明するための変数

これらはの学習の使い方によっても、教師あり学習と教師なし学習が分類できる。
教師あり学習：目的変数と説明変数を用いて学習する
教師なし学習：説明変数のみで学習する

また特徴量とはそのデータの特徴を表す

具体例を用いてこれらを説明する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627192/a2f3acfe-cfe0-b131-dbe5-48805669e73d.png)

特徴量は「大きさ」「鳴き声」「種類」である。
一方で、目的変数は予測したい変数であるから「大きさ」「鳴き声」「種類」のどれにでもなりうる。
また説明変数は目的変数を説明するための変数であるから、例えば、動物Aの「種類」を説明したいとき、「大きさ」「鳴き声」を用いるので、この時の説明変数は「大きさ」と「鳴き声」になる。

このように特徴量はそのデータの特徴を決める変数であるが、目的変数や説明変数は場合によって変化する。つまり、目的変数や説明変数は特徴量に含まれる変数である。



参照：https://py-memo.com/machinelearning/feature-explanatory-target/

#機械学習
Obsidianのマリアージュ技その2｜Alfredのスニペットで表を書きはじめる

## はじめに

便利メモツール[Obsidian](https://obsidian.md)。さらにラクして使うコツ、なかでも練度のあがってきたものをご紹介します。

## AlfredのSnippetsと組み合わせる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/d74a22ff-057a-9749-b315-80c6480ec45f.png" width=60%>

[Alfred](https://www.alfredapp.com)は、macOS用の作業効率化ツールです。有料版（パワーパック）は34ユーロもしくは59ユーロですが、このツールにピンと来る人なら元が取れるとおもいます。わたしにとっては、過去最高級のコスパでした。

Alfredにはたくさんの機能がありますが、そのなかでもObsidianとのマリアージュが最高の`Snippets`との組合せ例のご紹介です。

## テーブル（表）のスケルトンをスニペットとして登録する

Alfred Preference > Features > Snippets　であたらしいスニペットを登録します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/746ddd80-479a-6dd5-0785-2f0cae40c0c9.png" width=60%>


**Keyword（発火トリガー）** を`!|||`とし、
**Snippets** に下記を登録します。

```
|   |   |   |
|---|---|---|
| {cursor}  |   |   |
|   |   |   |
|   |   |   |
```

## 動作イメージ

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/67569f7d-26d9-b3a4-c837-1bd0c9490227.gif)

## おわりに

マークダウンで表を書くのがめんどうなのは
- 細かな表記を覚えていない（'+'って使うんだっけ、使わないんだっけ？とか）
- 最低タイプ数もまあまあ多い

からだとおもいます。最低タイプ数も、あらためて数えてみたところ、Obsidianでは9タイプでした（下記文字＋タブキー）。

```
|||
|-|-|
```

いちど表形式とObsidianが認識すれば、あとは自動整形が効くので、表を書くのはラクになります。

つまり、表スケルトンさえサクッと入力できれば、マークダウンエディタでがしがし表をつかえるようになるということです。

ちょっとした工夫、ツールの組合せでラクにできるのが、こういうツールのいいところですよね。

### 参考リンク

[Obsidian｜使いかたとコツ（目次）](https://qiita.com/hann-solo/items/ac8fa75394813e8adcf4)

### 環境

ここで書いていることは、下記のバージョンで実施しました。

- Alfred 4.6.4
- Obsidian 0.14.5
- macOS Monterey 12.3.1
- MacBook Pro (14-inch, 2021)
Autonomous Database で監査ポリシー・ハンドラーを試す（Oracle Database 19c)

Oracle Database には様々な監査機能があります。標準監査、ファイン・グレイン監査、SYSユーザー監査等です。これにOracle Database 12c からは統合監査が追加されました。Oracle Database の今後のバージョンでは統合監査（Unified Auditing）に収斂していく予定です。しかし「イベント・ハンドラ」の機能を使う場合にはファイングレイン監査の設定が必要です。本記事では Autonomous Database でイベント・ハンドラの実行を確認します。

# イベント・ハンドラ
監査対象のSQL文が実行された場合に自動的にプロシージャを起動する機能および実行されるプロシージャを「イベント・ハンドラ」と呼びます。これは特定のパラメーターを持つストアド・プロシージャで、監査ポリシーに設定されます。イベント・ハンドラは以下のパラメーターを持ちます。

|パラメーター名|データ型|説明|
|:---|:---|:---|
|schema_name|VARCHAR2|監査対象オブジェクトのユーザー名|
|table_name|VARCHAR2|監査対象テーブル名|
|policy_name|VARCHAR2|実行されたポリシー名|

例えば以下のようなイベントハンドラを作成します。このハンドラーは実行されると無条件に５秒待機します。このプロシージャは ADMIN ユーザー内に作成しています。

```SQL:
SQL> CREATE OR REPLACE PROCEDURE wait_proc (
  2      schema_name VARCHAR2,
  3      table_name  VARCHAR2,
  4      policy_name VARCHAR2
  5  ) AS
  6  BEGIN
  7          DBMS_LOCK.SLEEP(5);
  8  END;
  9  /

プロシージャが作成されました。
```

# テーブルの準備
監査対象を SCOTT ユーザーの DATA1 テーブルとします。以下の例では SCOTT ユーザーのスキーマ内にテーブルを作成し、データを格納しています。

```SQL:
SQL> CREATE TABLE data1(c1 NUMBER PRIMARY KEY, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO data1 SELECT LEVEL c1, 'data1' c2 FROM DUAL CONNECT BY LEVEL <= 100000;

100000行が作成されました。

SQL> COMMIT;

コミットが完了しました。
```

# ファイングレイン監査の設定
ファイングレイン監査の管理は AUDIT_ADMIN ロールを持つユーザーで実行します。ここでは Autonomous Database の管理者である ADMIN ユーザーで実行しています。ファイングレイン監査の作成には DBMS_FGA パッケージの ADD_POLICY プロシージャで実行します。以下の設定でファイングレイン監査の設定を行います。

|項目|パラメーター名|設定値|
|:---|:---|:---|
|監査対象スキーマ| object_schema| SCOTT |
|監査対象オブジェクト| object_name | DATA1 |
|監査ポリシー名|policy_name| WAIT_POLICY|
|イベント・ハンドラー所有者|handler_schema|ADMIN|
|イベント・ハンドラー名|handler_name|WAIT_PROC|
|監査対象DML|statement_type|SELECT|

```SQL:
SQL> EXECUTE DBMS_FGA.ADD_POLICY( -
>      object_schema   => 'SCOTT', -
>      object_name     => 'DATA1', -
>      policy_name     => 'WAIT_POLICY', -
>      handler_schema  => 'ADMIN', -
>      handler_module  => 'WAIT_PROC', -
>      statement_types => 'SELECT' );

PL/SQLプロシージャが正常に完了しました。
```

# 実行
ファイングレイン監査のポリシーを無効にして SELECT 文を実行します。0.02秒ほどで実行されていることがわかります。

```SQL:
SQL> EXECUTE DBMS_FGA.DISABLE_POLICY('SCOTT', 'DATA1', 'WAIT_POLICY');

PL/SQLプロシージャが正常に完了しました。

SQL> SET TIMING ON
SQL> SELECT COUNT(*) FROM scott.data1;

  COUNT(*)
----------
    100000

経過: 00:00:00.02
```

次にファイングレイン監査ポリシーを有効にして同じ SELECT 文を実行します。イベント・ハンドラーの実行が 5 秒かかるため、実行時間が 5.38 秒になっていることがわかります。

```SQL:
SQL> EXECUTE DBMS_FGA.ENABLE_POLICY('SCOTT', 'DATA1', 'WAIT_POLICY');

PL/SQLプロシージャが正常に完了しました。

SQL> SET TIMING ON
SQL> SELECT COUNT(*) FROM scott.data1;

  COUNT(*)
----------
    100000

経過: 00:00:05.38
SQL>
```

イベント・ハンドラーにはパラメーターとしてテーブル名が渡されますが、SQL 文自体を取得する場合には SYS_CONTEXT 関数を使用します。namespace パラメータには USERENV を指定し、parameter には以下の値を設定します。詳しくは[マニュアル](https://docs.oracle.com/cd/F19136_01/sqlrf/SYS_CONTEXT.html)を参照してください。

| parameter | 説明 |
|:---|:---|
|CURRENT_SQL|実行されたSQL文の先頭4Kバイト|
|CURRENT_SQL1～7|後続のSQL文4Kずつ|
|CURRENT_SQL_LENGTH|実行されたSQL文の長さ|
|CURRENT_BIND|バインド変数|
【AWS】SOA不合格体験記 - 2022年4月9日 -

# AWS SOAについて
SOA(AWS Certified SysOps Administrator - Associate)は
AWSの資格だと中レベルの資格になります。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512673/b92e754d-59fa-cea7-4e9f-099d5f64d2f2.png)

2022年4月9日に受験し、不合格(687点)でした。
合格には720点が必要なので33点足りない……

# 勉強方法
Udemyの問題集を購入、2～3周ほど実施しながら不明点は調べるを繰り返しました。
最終的に9割以上とれる状態までもっていきました。

# 総評
結果不合格でした。うーんSAA、SAPは持っているんですがSOAは難易度高めだった印象です。
SAAの問題から一歩踏み出して各種設定や運用する際の設定内容を細かく問題として出されました。

だいたい下記のような内容でしたが、CloudFormationの設定変更がサッパリで全然できませんでした。
・通常の問題が55問
・ラボ①：SNSとCloudwatchを使った問題
・ラボ②：CloudFormationの問題

[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)の有料会員になって
1か月後くらいにリトライしたいと思います！！
データカタログ横断検索システムの検索結果からdimでデータを取得する

# TL;DR

内閣府「戦略的イノベーション創造プログラム(SIP)第2期」の2021年度の成果として[データカタログ横断検索システム](https://search.ckan.jp/ "データカタログ横断検索システム") [^1]というサイトが公開されている。今回はこの検索結果のjsonを参照してCSVデータを引っ張り[dim](https://github.com/c-3lab/dim "dim - オープンデータパッケージマネージャー")に登録する。

# 準備

* [dim](https://github.com/c-3lab/dim "dim - オープンデータパッケージマネージャー")のインストール
* `dim init`

# 検索

データカタログ横断検索システムから必要なデータを検索する。

1. データカタログ横断検索システム https://search.ckan.jp/ を開く。
1. 検索を実行する。
![jp.ckan.search.search.result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21963/07fe00ae-1b02-2172-f4be-8b69547b3448.png)
1. xckan_idを記録する。これがデータセットのキーとなる。
![jp.ckan.search.search.datasets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21963/0fd9d0c8-2583-cbb0-f9e9-c2d43e01e706.png)

# データの取得と登録

記録したxckan_idを用いてbashで以下を実行すると`dim install`が実行される。(行頭の変数xckan_idを適宜変更する)

```
$ xckan_id=www.geospatial.jp__ckan__dataset:22130-018; curl -s https://search.ckan.jp/backend/api/package_show?id=${xckan_id} | jq -r '.result.resources[] | .url + ";" + .name' | grep '.csv;' | while IFS=';' read u n; do exec dim install ${u} -n ${n} ; done;
Installed to ./data_files/www.geospatial.jp/ckan/dataset/ef28eb70-bd49-40ef-bcc7-ce3642749688/resource/119dc3ea-ace2-43df-b127-54752339a07b/download/parkrejya.csv
```

# 確認

`dim list`でデータを確認する。

```
$ dim list
公園・レジャー
  - URL       : https://www.geospatial.jp/ckan/dataset/ef28eb70-bd49-40ef-bcc7-ce3642749688/resource/119dc3ea-ace2-43df-b127-54752339a07b/download/parkrejya.csv
  - Name      : 公園・レジャー
  - File path : ./data_files/www.geospatial.jp/ckan/dataset/ef28eb70-bd49-40ef-bcc7-ce3642749688/resource/119dc3ea-ace2-43df-b127-54752339a07b/download/parkrejya.csv
  - Preprocess:
```

[^1]: 国立情報学研究所プレスリリース(2022/2/28)「内閣府『戦略的イノベーション創造プログラム(SIP)第2期』における『ビッグデータ・AIを活用したサイバー空間基盤技術』の研究開発において分散型の分野間データ連携基盤技術を開発し、社会実装に向けて実証を開始」 https://www.nii.ac.jp/news/release/2022/0228.html
TerraformでEKSのチュートリアルをやる

# EKSとは？
>Amazon Elastic Kubernetes Service（EKS）は、コンテナ化されたアプリケーションをKubernetesでデプロイ、管理、スケーリングするためのAWSサービスです。

本記事ではチュートリアルを通してTerraformを使用してEKSクラスターをデプロイします

- 前提条件
Kubernetesとkubectlの基本的な知識
AWSアカウントを所持
AWS CLIを使える

## リポジトリをクローンする
```
git clone https://github.com/hashicorp/learn-terraform-provision-eks-cluster
```
クローンしたディレクトリに移動する
```
cd learn-terraform-provision-eks-cluster
```
ここには、VPC、セキュリティグループ、およびEKSクラスターのプロビジョニングに使用される6つのファイルがあります。最終的な以下のような構成になります

![スクリーンショット 2022-04-09 1.06.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515540/ae153113-5766-0fbb-c49c-eb36d94c9420.png)

- 各ファイルの説明

>vpc.tfは、AWS VPCモジュールを使用してVPC、サブネット、およびアベイラビリティーゾーンをプロビジョニングします。このチュートリアル用に新しいVPCが作成されるため、既存のクラウド環境やリソースに影響を与えることはありません。

>security-groups.tfは、EKSクラスターによって使用されるセキュリティグループをプロビジョニングします。

>eks-cluster.tfは、AWS EKSモジュールを使用してEKSクラスターをセットアップするために必要なすべてのリソース（AutoScalingグループなど）をプロビジョニングします。

>output.tfは、出力構成を定義します。

>version.tfは、Terraformのバージョンを少なくとも0.14に設定します。また、このサンプルで使用されているプロバイダーのバージョンも設定します。

### Terraformワークスペースを初期化する

```
terraform init
```

### 設定ファイルを適用する
```
terraform apply
```
このテラフォームの適用により、合計53のリソース（VPC、セキュリティグループ、AutoScalingグループ、EKSクラスターなど）がプロビジョニングされます。

アプリケーションが正常に実行されると、端末はoutputs.tfで定義された出力を出力します。

### EKSクラスターをプロビジョニングしたら、kubectlを構成する
```
aws eks --region $(terraform output -raw region) update-kubeconfig --name $(terraform output -raw cluster_name)
```
Kubernetesクラスターの名前とリージョンは、Terraformの実行が成功した後に表示される出力変数に対応しています。

### Kubernetesダッシュボードをデプロイしてアクセスしてみる
クラスタが正しく設定されて実行されていることを確認するには、Kubernetesダッシュボードをデプロイし、ローカルブラウザでそのクラスタに移動します。

### KubernetesMetricsServerをデプロイする
1.メトリックサーバーをダウンロードして解凍します。
```
wget -O v0.3.6.tar.gz https://codeload.github.com/kubernetes-sigs/metrics-server/tar.gz/v0.3.6 && tar -xzf v0.3.6.tar.gz
```
2.メトリックサーバーをクラスターにデプロイします。
```
kubectl apply -f metrics-server-0.3.6/deploy/1.8+/
```

3.メトリックサーバーがデプロイされていることを確認します。
```
kubectl get deployment metrics-server -n kube-system
```
### Kubernetesダッシュボードをデプロイする
1.ダッシュボードに必要なリソースをスケジュールします。
```
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
```

2.ローカルマシンのブラウザからダッシュボードに移動できるプロキシサーバーを作成します。
```
kubectl proxy
```

3.ここからKubernetesダッシュボードにアクセスできることを確認する```http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/```

### ダッシュボードを認証する
>Kubernetesダッシュボードを使用するには、ClusterRoleBindingを作成し、認証トークンを提供する必要があります。 これにより、cluster-adminにkubernetes-dashboardにアクセスする権限が付与されます。 kubeconfigを使用した認証はオプションではありません。 詳細については、Kubernetesのドキュメントをご覧ください。

1.ClusterRoleBindingリソースを作成します。
```
kubectl apply -f https://raw.githubusercontent.com/hashicorp/learn-terraform-provision-eks-cluster/main/kubernetes-dashboard-admin.rbac.yaml
```

2.次に認証トークンを生成します。
```
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep service-controller-token | awk '{print $1}')
```

3.ダッシュボードUIで[トークン]を選択し、受け取ったトークン全体をコピーしてダッシュボード認証画面に貼り付けてサインインします。

これでEKSクラスターをプロビジョニングし、kubectlを構成し、Kubernetesダッシュボードをデプロイするチュートリアルは完了です！

### お掃除する
このチュートリアルが終了したら、作成したリソースをすべて破棄することを忘れないでください。
```
terraform destroy
```
webrickでproxyを作ったときレスポンスのbodyが文字列として取り出せない

ちょっと悩んだのでメモ。

あるWebアプリがどんなパラメータの受け渡しをしてるのか覗いてやろうと思って WEBrick::HTTPProxyServer でプロキシサーバを作りました。その時レスポンスのボディ (WEBrick::HTTPResponse オブジェクト) がなんか Proc オブジェクトになってたので中身が覗けません…。で、こういうふうにやれば覗けましたというメモです。

だめな例
```ruby
s = WEBrick::HTTPProxyServer.new(
      Port: 8080,
      ProxyContentHandler: ->(_req, res) {
        puts res.body # ここが問題。これじゃ覗けない
      })
Signal.trap('INT') do
  s.shutdown
end
s.start
```
だめな例では `#<Proc:0x00007f8a06977628 (省略)/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/webrick-1.7.0/lib/webrick/httpproxy.rb:344 (lambda)>` とか言う文字列が出力されます。

[res.body の中身を見ると](https://github.com/ruby/webrick/blob/e4182968b1ae34f38b71247fae05acf22a8f258e/lib/webrick/httpproxy.rb#L344)なんかパラメータを一個取り (xとします) bodyを保持しているバッファ (body_tmp: 実体は Array) からから読み出して x に write で書いていたので StringIO オブジェクトを渡してやればいいかなと思ってこうしました。

良い例
```ruby
s = WEBrick::HTTPProxyServer.new(
      Port: 8080,
      ProxyContentHandler: ->(_req, res) {
        sio = StringIO.new(String.new, 'r+')
        res.body.(sio)
        sio.rewind
        res.body = sio.read
        puts res.body
      })
Signal.trap('INT') do
  s.shutdown
end
s.start
```
これで body が見えました。res.body に読んだ結果を改めて代入しているのは、こうしないと UA 側に body が渡らないからです (body_tmp.shift で破壊的に読み出してるので残らない)。

あともう一つ、StringIO オブジェクトを作るときに '' などリテラルではなく String.new を渡している理由を説明します。今どき
```ruby
# frozen_string_literal: true
```
を普通にやってると思うんですが、これだとリテラルで作った String が freeze されてるので書けないんですよ。ということで 'r+' モードで作ろうとしても permission denied になっちゃいます (よくできてる)。ということで freeze されてない String オブジェクトを得るのに手っ取り早い方法が String.new なのでした。
開発者アカウント申請ページへの移動の仕方（Amazon SP-APIチャレンジ①）

**前提**
AmazonのAPIとしては、SP-APIというものが用意されている。
【公式】SP-API開発者ガイド
https://github.com/amzn/selling-partner-api-docs/blob/main/guides/ja-JP/developer-guide/SellingPartnerApiDeveloperGuide(%E6%97%A5%E6%9C%AC%E8%AA%9E).md


開発してみたいので、まずは、下記手順の通り開発者アカウントを用意することに。
>アプリとサービスメニューのアプリの開発をクリックします。
>
>デベロッパーセントラルページが表示されます。


**困ったこと**

と思ったけれども、デザイン変更のためか、「アプリとサービス」がわからなかった。

**結論**
私が「アプリの開発」を見つけたのは「パートナーネットワーク」のなかでした。
そして、「パートナーネットワーク」は、「セラーセントラルのトップページ」にある、左上の三本メニューの中にありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627227/080380b4-2b24-3edb-aa02-b3ca5efe6a31.png)

ただいま申請中…。
SQL Serverトランザクションログの仕組み(論理アーキテクチャ編)

## 調べた背景
普段何気なくBEGIN TRAN と COMMIT TRANを使っているけれど、人に説明できるほど理解していないと思ったため。

### 参考にしたドキュメントや書籍
* [SQL Server トランザクション ログのアーキテクチャと管理ガイド](https://docs.microsoft.com/ja-jp/sql/relational-databases/sql-server-transaction-log-architecture-and-management-guide?view=sql-server-ver15)
* [絵で見てわかるSQL Serverの仕組み](https://www.amazon.co.jp/dp/B08CRMBCQG/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

上記文献からの引用が多いですがご了承ください。
自分の理解のために作成した図などを載せています。

## トランザクションの論理アーキテクチャ
### ログレコードについて
トランザクションはトランザクションログが存在することで動作可能となっています。
トランザクションログに記載されていく各動作のログのことを**ログレコード**と呼びます。
それぞれのログレコードは**LSN**(Log Sequence Number)によって識別されます。
新しい各ログレコードは、ログの論理上の末尾に前のレコードのLSNよりも大きなLSNをつけて、作成された順に連続して書き込まれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918417/2adeda0c-2544-2763-a6e3-b0f88ae09616.png)

LSN2によって参照されるログレコードで示される変更は、LSN1で示される変更の後に行われます。
各ログレコードには**トランザクションID**が含まれており、どのトランザクションに含まれているレコードかが示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918417/ca971234-633c-1bcb-cd26-665ac6809b2f.png)


各トランザクションに関連付けられているログレコードはすべて、逆方向のポインターを使用して連鎖的にリンクしており、
これによってトランザクションのロールバックを早くすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918417/6c262444-410e-ffc8-c98d-67a8ab334525.png)

データ変更のログレコードには、実行した論理操作の記録または変更したデータの前後のイメージの記録が行われます。 前イメージは操作が実行される前のデータのコピーのことで、後イメージは操作を実行した後のデータのコピーです。

### 操作の復旧手順
* 論理操作が記録されている場合
    * 論理操作をロールフォワードするには、その操作を再実行します。
    * 論理操作をロールバックするには、逆の論理操作を実行します。

* 前後イメージが記録されている場合
    * 操作をロールフォワードするには、後イメージを適用します。
    * 操作をロールバックするには、前イメージを適用します。

自分なりに調べてみたのですが、残念ながら**論理操作**の定義はわかりませんでした。

### ログレコードの種類
以下のクエリで現在使用中のデータベースのトランザクションログファイルの中身を見ることができます。
```sql
select * from sys.fn_dblog(null,null);
```
画像に表示されているものは取得できるカラムの一部です。
引用元のサイトに特に有用な情報として紹介されていました。
画像ないにはありませんが、もちろんロールバックした際のレコードも生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918417/fe2be354-1325-ab38-4575-1eccdf0b5b92.png)
画像引用元：[Inside the Transaction Log file using fn_dblog() and fn_full_dblog()](https://blog.coeo.com/inside-the-transaction-log-file)

## 障害発生時などのロールバックに必要なLSN
障害発生時などで、トランザクションがコミットされずに終了してしまった場合などで
データベースに対しロールバックをする際に必要となるLSNが存在します。
ロールバックを成功させるために必要となるログレコードのログファイルセクションは
**ログのアクティブな部分**と呼ばれ、その最初のログレコードのLSNを
**最小復旧LSN**と呼ばれています。
物理アーキテクチャを理解する際、この最小復旧LSNは重要なものとなっているようです。

## まとめ
SQL Serverのトランザクションでは、各動作をLSNという値で判別し、
ログファイル内に該当の動作の情報を保存しているようでした。
また、最小復旧LSNが存在していることによってロールバック時に
どのトランザクションの内容からデータを復旧させるかを判断しているようです。
トランザクションログファイルの内容は
**処理の順に時系列に並んでいて、シーケンシャルな構造になっている**と言えると思います。

内容について不備やご意見などあればコメントお願いいたします。

ここまで読んでいただいてありがとうございました。
Momoを使ってRaspberry Pi 映像のリアルタイム配信

PythonでOpenCVを使って、カメラの映像を取得し、それをVNC経由で見る。ということをしているのですが、動作が遅く、10fpsも出ていないと感じていたので、試しにMomoを使ってみたら、驚きの速さと低遅延でした。
ただし、OpenCVで加工とか画像認識とか出来ないので、見るだけですが。

そこで、その方法について、簡単にまとめて見ました。

# 動作環境
・Raspberry Pi B4(4GB　OS:Bullseye 32bit)
・Camera Module V1

# インストール
LXTarminalからインストールします。

    ~$ wget  https://github.com/shiguredo/momo/releases/download/2022.1.0/momo-2022.1.0_raspberry-pi-os_armv7.tar.gz
    ~$ tar -zxvf momo-2022.1.0_raspberry-pi-os_armv7.tar.gz

以上で、インストールが終わりました。

# テスト配信
LXTarminalで次のように入力します。

    ~$ cd momo-2022.1.0_raspberry-pi-os_armv7
    ~$ ./momo --no-audio-device test

これで、配信開始となります。
同じネットワークに繋がっている端末のブラウザで、`http://192.168.*.*:8080/html/test.html`を開き、次の画面が表示されていれば、OKです。(*.*にはご自身のRaspberry Piのアドレスを入れて下さい。)
![スクリーンショット 2022-04-09 17.59.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226981/fdee877f-2cc2-e4c9-02dd-dc13df92aa12.png)
`Connect`ボタンを押せば、ラズパイからの映像を見る事ができます。
![スクリーンショット 2022-04-09 18.01.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226981/a81283fa-e5b0-e69a-7b05-2d59e439e8de.png)

https://twitter.com/northarant/status/1512723694493188096?s=20&t=oYezFTOLX8B3XFrZukVZ6w

# 参考記事
https://stemship.com/raspberry-pi-momo/
InlineEditConditionToggleでDetailsパネルをすっきりさせる

# はじめに
UPROPERTYの指定子である`EditCondition`は知っている方も多いかと思います。
[UE4 EditConditionsについて - PaperSloth's diary](https://papersloth.hatenablog.com/entry/2019/10/12/181828)
[[UE4]プロパティ指定子"EditCondition"でできること](https://qiita.com/_efe/items/f922cb1e48e43519fc6f)

```EditCondition.h
UPROPERTY(EditAnywhere)
bool bUseHoge = false;

UPROPERTY(EditAnywhere, meta = (EditCondition = "bUseHoge"))
int32 Hoge = 0;
```
こんな感じで`EditCondition`で指定した条件がtrueならそのプロパティが編集できるようになります。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325493/33e6a416-310b-4c75-1c5e-9721946cb463.png)
これだけでも便利ですが、以下の様なマテリアルインスタンスのプロパティのようにチェックボックスを対象のプロパティの行に表示する方法をこの記事ではご紹介します。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325493/17bd4a04-eab3-787e-1def-c1b435f6b64d.png)

# やり方
```InlineEditConditionToggle.h
UPROPERTY(EditAnywhere, meta = (InlineEditConditionToggle))
bool bUseHoge = false;

UPROPERTY(EditAnywhere, meta = (EditCondition = "bUseHoge"))
int32 Hoge = 0;
```
先程の`EditCondition`のコードのフラグのプロパティ側のメタ指定子に`InlineEditConditionToggle`を追加します。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325493/05ff16a8-9d25-3c7c-4e8a-d6d70f1260a1.png)
変数名が表示されなくなりますが、`BlueprintReadWrite`か`BlueprintReadOnly`を追加すれば普通に変数として使用できます。

# おわりに
割と細かいことなのでしなくても良いといえばそうですが、マケプレに出品するプラグインを作ったり、他職種の人が触る機能を作る際にひと手間加えると使う側の人が喜ぶかもしれません。
[iOS] もう二度と調べ直さないためのconvertメソッドに関するメモ

記事の内容はこちらを参照してください。
https://mishimay.github.io/c9d99cf3ef9b3061dfae/
<!--


## convert to
```swift
func convert(_ rect: CGRect, to view: UIView?) -> CGRect
```

レシーバ（メソッドが呼ばれるUIView）が、引数で渡す `view` を基準とする座標系のどこへ位置しているかを割り出す
`rect` にはレシーバのローカル座標 (bounds) を指定する

コード例
```swift
let rect = targetView.convert(targetView.bounds, to: baseView)
```


## convert from
```swift
func convert(_ rect: CGRect, from view: UIView?) -> CGRect
```

レシーバ（メソッドが呼ばれるUIView）を基準とする座標系のどの位置に、引数で渡す `view` が位置しているか割り出す
`rect` には `view` のローカル座標 (bounds) を指定する


コード例
```swift
let rect = baseView.convert(targetView.bounds, from: targetView)
```

## Swift Playground 用
```swift
let baseView = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
let someView = UIView(frame: CGRect(x: 10, y: 10, width: 200, height: 200))
let targetView = UIView(frame: CGRect(x: 20, y: 20, width: 100, height: 100))
baseView.addSubview(someView)
someView.addSubview(targetView)

let rect1 = targetView.convert(targetView.bounds, to: baseView)
// -> {x 30 y 30 w 100 h 100}
let rect2 = baseView.convert(targetView.bounds, from: targetView)
// -> {x 30 y 30 w 100 h 100}
```


## 参考
https://developer.apple.com/documentation/uikit/uiview/1622504-convert
https://developer.apple.com/documentation/uikit/uiview/1622498-convert


-->
SphinxのセットアップおよびGithubPagesとの連携を行う

SphinxのセットアップおよびGithubPagesとの連携方法について記述する。

# 前提事項
構築に使用した環境は以下の通り。

* OS：Ubuntu 20.04.3 LTS（WSL2）
* python 3.8.10
* pip 20.0.2

# Sphinxの導入
pip3を利用してSphinxのインストールを行う。
```bash
sudo pip install sphinx
```

Sphinxの拡張テーマである（sphinx_rtd_theme）をインストールする。
```bash
sudo pip install sphinx_rtd_theme
```

# Sphinxプロジェクトの作成
sphinx-quickstartコマンドでsphinxのプロジェクトを作成する。
```bash
sphinx-quickstart
```

拡張テーマ（sphinx_rtd_theme）の適用のため、conf.pyを修正する。

```python
# -- Project information -----
import sphinx_rtd_theme

# -- Options for HTML output ---
html_theme = 'sphinx_rtd_theme'
html_static_path = [sphinx_rtd_theme.get_html_theme_path()]
```

Sphinxプロジェクトのビルドを行う。

```bash
make html
```

# ホットリロードの導入
ホットリロードを実現するためにsphinx-autobuildをインストールする。

```
pip install sphinx-autobuild
```

sphinx-autobuildを起動する。

```
sphinx-autobuild source build
```
source配下のファイルが変更されると自動でビルドが動き、build配下にhtmlファイル等が格納される。 また、sphinx-autobuildを起動した後にhttp://127.0.0.1:8000/ にアクセスすると、ビルドされたHTML文書にアクセスできる。 HTML文書が変更されると、ブラウザが自動更新される。

sphinx-autobuildを終了するには、Ctrl+Cを入力する。

# Github Pagesとの連携

ビルド成果物の出力先フォルダを変更するために、Makefileに追記する。

```make
# Put it first so that "make" without argument is like "make help".
html:
      @$(SPHINXBUILD) -b html "$(SOURCEDIR)" "$(BUILDDIR)/docs"
```

Github上でリポジトリを作成した後、プロジェクトのセットアップを行う。 first-commitを行わないと、gh-pagesブランチの作成ができなかった。

```bash
mkdir docs
cd docs
echo "# docs" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/user/xxxxx
git push origin main
```

作成したSphinxプロジェクトをGithubPagesと連携する。

```bash
cp ../sphinx/. .
git branch gh-pages
git checkout main
git add .
git commit -m "setup sphinx"
git push origin gh-pages
```
Github上で公開設定を行う。 Githubのリポジトリからgh-pagesブランチの公開設定を行う。Sourceにはdocs配下のファイルを設定する。
WSL2にKali Linuxを導入したときのあれこれ

- セキュリティの勉強のためにkali Linux環境をVirtual Boxを使って作ってみたが、どうももともとあったWSL(Hyper-V)環境との相性が悪かったらしく、ブルースクリーンエラーが頻発するようになった
- Windowsをクリーンインストールしたら治ったが、さすがにまた同じことになると困るので別の道を検討してみた
- ダメ元でMicrosoft Storeを検索すると、なんとWSL用のKali Linuxディストリビューションがあったのでこれにすることにした
- MSが配布してるからと安心していたら、`apt-get update`も通らないというまあまあひどい状態だったので、なかなか大変だった

# 問題
- (1)`apt-get update`で失敗する
- (2)`apt-get upgrade`で失敗する



# 詳細と解決策
## (1)`apt-get update`で失敗する
### 現象
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418947/ff9241c5-018d-d47e-148b-eab62b87f9c0.png)
- 認証でコケている

### 原因
#### (1) 配布されてるバージョンが古いから
- なんと3年前!
- それはkeyの期限も切れるわ
- ![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418947/04eac7d3-b237-6fe6-cda3-1769f1271357.png)

#### (2) `sources.list.d`のURLが間違ってる
- URLが正しければ、`apt-get update`はできるはず
- まずは、こっちを治す

### 解決策
- 色々遠回りしたが、 [Update getting failed(forum.kali-linux.org)](https://forums.kali.org/showthread.php?47710-Update-getting-failed)を参考に以下２つを実施したことで解決した模様
	- /etc/apt/sources.list.d の中の鍵ファイルをすべて削除する
		- もともと空
	- /etc/apt/sources.listの中身をコメントアウトして以下２行を記載した
	`deb http://http.kali.org/kali kali-rolling main contrib non-free`
`deb-src http://http.kali.org/kali kali-rolling main contrib non-free`



## (2)`apt-get upgrade`で失敗する!
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418947/74ab2a87-f836-78cf-21f8-d2c2c8ae3b02.png)
- `apt --fix-broken install`をやってみる
- `/usr/bin/perl: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory`となる...


### 原因
- `libcrypt`の問題らしい
### 解決策
- libcrypt1をインストールする
- [Bug#993755: libcrypt.so.1: cannot open shared object file when upgrading from Stretch to Sid](https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1818037.html)

```
$ cd /tmp
$ apt -y download libcrypt1
$ dpkg-deb -x libcrypt1_1%3a4.4.25-2_amd64.deb  .
$ cp -av lib/x86_64-linux-gnu/* /lib/x86_64-linux-gnu/
$ apt -y --fix-broken install
$ apt-get install -y libcrypt1
````

これで解決。
【統計検定準1級対策③】二項分布の確率関数，期待値，分散，母関数の導出過程

## 結論
>確率関数
>```math
>f(x) = {}_{n}C_{x}p^x(1-p)^{n-x} \ \  (x = 0,1,\cdots,n)
>```
>期待値，分散
>```math
>E[X] = np, \ \ V[X]=np(1-p)
>```
>母関数
>```math
>G(s) = (ps+1-p)^n
>```
## 期待値の導出
二項分布は，ベルヌーイ試行（$X_1,\cdots,X_n$）の結果の和（$X_1+\cdots+X_n=X$）が従う分布でした。

したがって，期待値の線形性（「和の期待値」＝「期待値の和」という性質）を使って

```math
\begin{align*}
E[X] &= E[X_1 + \cdots + X_n]\\
&= E[X_1] + \cdots + E[X_n]\\
&= \underbrace{p + \cdots + p}_{n \text{個}}　= np
\end{align*}
```

## 分散の導出
分散も，期待値の時と同じ考え方です。

$X,Y$が独立ならば，$V[X\pm Y] =V[X]+V[Y]$なので
```math
\begin{align*}
V[X] &= V[X_1 + \cdots + X_n]\\
&= V[X_1] + \cdots + V[X_n]\\
&= \underbrace{p(1-p) + \cdots + p(1-p)}_{n \text{個}}　= np(1-p)

\end{align*}
```

## 母関数の導出
こちらも期待値・分散のときと同様，二項分布はベルヌーイ分布の和であることを利用します。

ここでは，$X,Y$が独立であることの定義：$E[XY]=E[X]E[Y]$を用いています。

確率母関数の定義：$G(s)=E[s^X]$ から，

```math
\begin{align*}
G(s) &= E[s^X]\\
&= E[s^{X_1+\cdots+X_n}]\\
&= E[s^{X_1}\times \cdots \times s^{X_n}]\\
&= E[s^{X_1}]\times \cdots \times E[s^{X_n}]\\
&= \underbrace{(ps+1-p) \times \cdots \times (ps+1-p)}_{n \text{個}}　= (ps+1-p)^n
\end{align*}
```

## まとめリンク
[【統計検定準1級対策】確率分布の確率関数，期待値，分散，母関数まとめ
](https://qiita.com/matsuda-blog/items/4573b08f75b3d3c49c16 "すべての主要確率分布まとめ")