OmniAICreator/Qiita-1.07M huggingface dataset:
AdHocアプリのクラッシュログ解析

# 概要
この記事では、AdHoc配布されたアプリ上で発生したクラッシュログを解析する方法について記載しています。

# AdHoc配布
AdHoc環境でのアプリ配布は、以下の様な方法があります。

1. [TestFlight](https://help.apple.com/app-store-connect/?lang=ja-jp#/devdc42b26b8)
2. [Firebaseテスト配布](https://firebase.google.com/docs/app-distribution/ios/distribute-console?hl=ja)
3. [DeployGate](https://deploygate.com/)

いずれの方法で配布した場合でも、以降で記載するクラッシュログ解析方法は適用可能です。

# クラッシュログを取得
この項目では、AdHoc環境で配布されたアプリのクラッシュファイルを実機端末から取得する方法を解説しています。

## ipsファイルの取得
アプリのクラッシュログは、`.ips`という拡張子ファイルに暗号化された情報が記載されているため、まずはこのクラッシュログファイルを実機端末から取得します。

1. 実機端末内にある設定アプリの「プライバシー」→「解析および改善」→「解析データ」を開く
2. クラッシュした日付が書かれた`.ips`ファイルを探す
3. AirDropなど任意の方法で解析を実行するmacOSのPCに`.ips`ファイルを渡す

# クラッシュログの解析
`ips`ファイルは生成されたままの状態だとクラッシュログが暗号化されているため、クラッシュ時のスタックトレースなどが目視では理解できない状態に鳴っています。
そのため、この`ips`ファイルの中身を確認するにはSymbolicate(復元)をする必要があります。

## dSYMファイルの取得
`ips`ファイルを複合するには、AdHoc配布されたアプリの`.dSYM`ファイルが必要となります。
この`dSYM`ファイルは、アプリプロジェクトを(Xcodeを使って)アーカイブした際に生成されるバイナリの中に格納されているので、そこから取得してください。
参考: https://www.lanches.co.jp/blog/10314

## ipsファイルの復号
次に前項で取得した`dSYM`ファイルを使用して、`ips`ファイルの中身を復号します。
復号をする場合は、Xcodeのコマンドラインツールを使用します。

`/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v ~/{path_to}/{file_name.ips} ~/{path_to}/{file_name.dSYM} > {output_file.txt}`

コマンド中の変数は下記の用に書き換えてください。

- `{path_to}`: 当該ファイルの格納されているパス
- `{file_name.ips}`: 取得したipsファイル名
- `{file_name.dSYM}`: 取得したdSYMファイル名
- `{output_file.txt}`: 複合した内容を出力するファイル名
    - ※任意のパスに出力する場合はパスも記載してください。

### 注意事項
もし上記のコマンドを実行した際に`Error: “DEVELOPER_DIR” is not defined...`の様なエラーが出力された場合、`DEVELOPER_DIR`変数が適用されていない事で処理が失敗しているため、下記のコマンドを実行して変数を適用します。

`export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"`

また、上記の`/Applications/Xcode.app/`などは、Xcodeアプリの命名を独自で変更している場合に適切な命名に書き換えるようにしてください。

これで再度ipsファイルの復号コマンドを実行すれば、複合されたファイルが出力されるはずです。
クラッシュログ解析

# 概要
この記事では、iPhoneやiPadの実機端末からクラッシュログファイル(`xxx.ips`)を取得し、それをdSYMファイルで復号した中身の見方について記載しています。
なお、実機端末からクラッシュログを取得する方法については[AdHocアプリのクラッシュログ解析](https://qiita.com/yamataku29/items/7d529ee49c28cddbd89e)を確認してください。

# クラッシュログの見方
## 基本情報
- `Exception Type`: クラッシュの種別を示す文字列が表示される
- `Exception Codes`: クラッシュの種別に応じたコードが表示される
- `Exception Note`: クラッシュ種別に関する補足説明の文字列が表示される
- `Termination Reason`: クラッシュの原因が表示される
- `Termination Description`: クラッシュ原因の詳細情報が表示される

## バックトレース
- クラッシュスレッド: `Thread 0 Crashed:`といった様に`Crashed`と記載された箇所のスレッドにてクラッシュが発生している
- クラッシュクラス: 多くの場合、アプリ名(`face MQR`)などが記載されている箇所がアプリ領域で実行されたコードとなる。その中でも一番上位(実行番号が最も小さい)箇所がクラッシュが発生したクラスとなる。
- クラッシュ行数: 上述の`クラッシュクラス`が記載された行内に「クラスファイル名」と「クラッシュが発生した行数」が記載されている

# ドキュメント
- [Identifying the Cause of Common Crashes](https://developer.apple.com/documentation/xcode/identifying-the-cause-of-common-crashes)
- [Addressing Language Exception Crashes](https://developer.apple.com/documentation/xcode/addressing-language-exception-crashes)
- [Investigating Crashes for Zombie Objects](https://developer.apple.com/documentation/xcode/investigating-crashes-for-zombie-objects)

# 具体例
## Exception Type
- `EXC_BREAKPOINT (SIGTRAP)`: アクセス対象の変数にnilが入っていた場合、もしくは型変換に失敗した場合のクラッシュ

## Termination Reason
- `Namespace SPRINGBOARD, Code 0x8badf00d`: 特定の処理に時間がかかっているために、SPRINGBOARDというシステムモジュールがアプリを強制的に停止させた場合のクラッシュ
キーボード配列変更（qwerty, Dvorak)をApplescriptでGUIスクリプティングを用いて自動化する。

# はじめに
 Macはデスクトップ上で行っている作業のほとんどをAppleScriptで自動化できる。AppleScriptをサポートしていないアプリケーションや特定の操作でも、GUIスクリプティングを用いれば、AppleScriptで自動化できる。

　GUIスクリプティングを用いて、キーボードの配列を変更した。あまり需要はないと思うが、他で見かけないので記事にした。

# 環境
macOS ver11.3
AppleScript 2.7

# 準備
　キーボードの配列変更を手作業（マウス操作）で行うときは、"システム環境設定" -> "キーボード" -> "入力ソース" -> "英字のレイアウト" と進み、ポップアップメニューから"ABC (qwerty配列)"、"Dvorak"、その他を選ぶ。
　この手作業を自動化する。

# コード
　最初に`display dialog`で"abc (qwerty)"、"Dvorak"、"キャンセル"を選ぶ。
　"キャンセル"を選択した場合、そこでプログラムが中断される。

```applescript:qwerty_or_Dvorak
tell application "System Events"
	display dialog "選択してください" buttons {"ABC", "Dvorak", "キャンセル"} cancel button "キャンセル"
	set theKeyMap to button returned of result
	tell application "System Preferences" to quit
	delay 1
	tell application "System Preferences" to activate
	tell application process "System Preferences"
		repeat
			if exists (window "システム環境設定") then
				exit repeat
			end if
		end repeat
	end tell
	tell button "キーボード" of scroll area 1 of window "システム環境設定" of application process "System Preferences" to click
	tell application process "System Preferences"
		repeat
			if exists (window "キーボード") then
				exit repeat
			end if
		end repeat
	end tell
	tell radio button "入力ソース" of tab group 1 of window "キーボード" of application process "System Preferences" to click
	tell pop up button 6 of scroll area 2 of splitter group 1 of group 2 of tab group 1 of window "キーボード" of application process "System Preferences" to click
	
	
	if (theKeyMap is "ABC") then
		tell menu item "ABC" of menu 1 of pop up button 6 of scroll area 2 of splitter group 1 of group 2 of tab group 1 of window "キーボード" of application process "System Preferences" to click
	else
		tell menu item "Dvorak" of menu 1 of pop up button 6 of scroll area 2 of splitter group 1 of group 2 of tab group 1 of window "キーボード" of application process "System Preferences" to click
	end if
	
end tell

```

##### 以下は実際に動作させたgif動画
　"ABC"を選択した場合、"Dvorak"を選択した場合、"キャンセル"を選択した場合を順に行っている。

![配列切り替え_4x_encoded.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444980/9c0edeb3-d627-9395-c91f-d36f88c1d908.gif)

# 考察
　GUIスクリプティングのコードは、OSのアップデートなどでGUIが変わると動かなくなることがある。

　GUIスクリプトを行うのには、GUI部品の階層構造を調べる必要がある。その方法は、他のwebページで多数解説があるが、各層毎に`every UI element`を利用して部品を調べ、総当たり的に調べる方法であり、かなり手間がかかる。実際には慣れてくると、部品の名前を見ればだいたい予想がつくようになるが、それでも手間が相当かかる。

　さらに、GUIボタンをクリックすると新しいウィンドウが出現するような、動的にGUI部品が変化する場合もあり、この場合もGUI部品の解析にはかなり手間がかがる。

　上記にて、UI部品の一覧を取得し、目的の部品に一気に到達できるような方法が望ましい。それはまた別の機会に述べることにする。
EPSONプリンタでPDF範囲選択＆両面印刷(Mac・Acrobat Reader DC)

# 使用機器
- Mac(OS Sierra)
- Epson M630T
- Acrobat Reader DC

# 前提知識
- 印刷する際には、<font color="Red">**アプリ**</font>と<font color="Blue">**プリンタ**</font>の**2つの印刷設定箇所**がある
- Macにおいて<font color="Blue">**プリンタ印刷設定**</font>の[レイアウト]>[両面]タブはフェイク！！
 [自動両面/排紙設定]タブから[両面印刷]を選択する必要がある(https://faq2.epson.jp/web/Detail.aspx?id=33234)
- <font color="Red">**Acrobat Reader DCの印刷設定**</font>に両面印刷はない(https://helpx.adobe.com/jp/reader/using/print-pdfs.html)

つまり、<font color="Blue">**プリンタ印刷設定**</font>の[自動両面/排紙設定]タブから[両面印刷]を選択すればいい！

# 問題点：両面印刷かつ範囲選択ができねー！
1. [自動両面/排紙設定]タブで両面印刷にしても、 Acrobat Reader DCの印刷設定が優先されてしまう
2. ブラウザでPDF両面印刷→そもそも[自動両面/排紙設定]タブが出てこないくそったれ！

**範囲選択はできるが、両面印刷はできない
両面印刷はできるが範囲選択ができないという状況**


# とりま解決策
プリンタの印刷範囲とAcrobat Reader DCの印刷範囲を同じにしてやればいい

つまり、
①<font color="Blue">**プリンタ印刷設定**</font>で[自動両面/排紙設定]タブから[両面印刷]を選択してやり、
②<font color="Blue">**プリンタ印刷設定**</font>で範囲を決める。
③最後に<font color="Red">**Acrobat Reader DCの印刷範囲**</font>を<font color="Blue">**プリンタ印刷範囲**</font>と同じにしてやるんだ

なんか無駄なことをしてそう！まあいっか！

# それでもできん場合
- 君のプリンタが両面印刷が可能か確認する(https://faq2.epson.jp/web/Detail.aspx?id=35884)
- フチありとかだと両面選択できん
- 各自調べる　がんばれ！

# 感想
エコタンク好き〜
laravelでルートパラメーターを設定したルーティングで404エラー

 今回の経緯
- 

※かなり初歩的な内容です。

laravelでルートパラメータを設定してルーティングしたら404エラーが返されました。
ちなみに以下のコード。

```
Route::get('/students/{class-id}/{subject-id}',[Controllers\StudentsController::class, 'showStatus'])->name('students.status');
```
初歩的な誤りですね。

PHPにおいて変数名にハイフンは使えないので、404エラーが返されていたわけです。
素直にアンダーバーで対応することで無事解決しました。

```
Route::get('/students/{class_id}/{subject_id}', [Controllers\StudentsController::class, 'showStatus'])->name('students.status');
```


ちなみにPHPにおいて変数の命名で気を付けたいのは以下。
1.数字から始めるのはダメ
　 例：$1hoge　×
2.使えるのは英数字（大文字、小文字含む）とアンダーバー
　　　例：$_hoGE123   ○
　　　　　$ho_ge\_　○


かなり基本的な内容でしたが、やはり基礎は重要だと思い知らされました。
nginxのdefault.confを確認したり数時間回り道をしてしまった。。。
Chrome: "Your connection is not private" と表示された時に、先へ進む方法

Chrome で開発中に、自己証明書などを使っていると、 "Your connection is not private", "NET::ERR_CERT_INVELID" と表示されることがあります。

以前は、それでも進むためのボタンが表示されていましたが、 Chrome のあるバージョンからは表示されなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25846/2b7d521c-cd03-80ac-3ae1-170f99976c08.png)

## 先へ進む方法

詳細情報が表示された状態で、`thisisunsafe` とキーボードで入力するとページが表示されます。 `this is unsafe` のようにスペースを入れてはいけません。

## 警告画面を再度表示させるようにする方法

一度先へ進んだ場合、その情報はブラウザに記録されます。
もういちど警告画面を有効にしたい場合は、 "Re-enable warnings" をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25846/dac19e32-63ea-ed91-38fc-7d10165006b2.png)
GitとGitHubを基本からまとめてみた【プルリクエスト作成までの流れ】

## プルリクエストとは？
『プルリクエスト』とは、コードの変更をレビュワーに通知し、マージを依頼する機能。

## プルリクエストのメリット
コードのレビューを受ける事で、1人で作ると気がつかないコードの指摘やバグや記述ミスの発見ができ、コードの品質を高める。
レビュワーにとっても、他人が書いたコードを読むことで新しい書き方を発見できる。

※ チェックの作業をレビューといい、レビューをする担当の人をレビュワーという。

## プルリクエスト作成までの流れ

(1) Githubでリポジトリを新規作成する。

(2) GitHubにログインし、Repositoriesタブを選択。『New』をクリックする。

(3)『Repository name』を記入し、『Create repository』をクリックする。

(4) https://~の部分をコピーする。

(5) ローカル（自身のPC内）での作業。新規フォルダを作成する。

```
git clone < リポジトリのURL = https://~の部分 >
```
(6) クローンして生成されたフォルダへ移動。

```
cd < フォルダ名　>
```

(7)　(6)のフォルダの中にコードを生成する。

(8) コードをaddする。

```
git add .
```
(9) コミットする。

```
git commit -m "コミットメッセージ"
```

(10)　master(もしくはmain)ブランチにプッシュする。
　（githubの仕様に変更があり、デフォルトで作成されるブランチの名前が「master」から「main」に
　　変更。githubのデフォルトで作成されているブランチ名を確認すること。）

```
// masterブランチにpushする場合
git push origin master

// mainブランチにpushする場合
git push origin main
```

(11) developブランチを作成し、developブランチに移動する。

```
git checkout -b develop
```

(12) 現在developブランチにいることを確認する。

```
git branch
```

(13) 実装し、フォルダの中にコードが格納された状態にする。

(14) 実装したコードをaddする。

```
git add .
```

(15) コミットする。

```
git commit -m "コミットメッセージ"
```

(16)　developブランチにプッシュする。

```
git push origin develop
```

(17) github上からプルリクエストを作成する。

[GitとGitHubを基本からまとめてみた【3】【GitHub上からプルリクエストを作成までの流れ】](https://qiita.com/kanfutrooper/items/79adf6c8206f1baa2978)

## 『Branch』一覧 (用語の整理)
『ブランチ』とは、gitの変更履歴を枝別れさせる機能の事。
『masterブランチ』とは、元祖変更履歴の事。
『developブランチ』とは、開発の主軸になるブランチ。masterブランチから派生させる。


## 参考サイト
[今さら聞けないGitHubとは？超基本のGitから使い方まで徹底解説](https://qeee.jp/magazine/articles/16022)
[【Git入門】Git + Github使い方入門講座🐒Gitの仕組みや使い方を完全解説！パーフェクトGit入門！](https://www.youtube.com/watch?v=LDOR5HfI_sQ&t=451s)
[GitHubで新規リポジトリ作成から、PUSHまで](https://qiita.com/satoNobu/items/12fc71d8927acea20f17)
[いまさらだけどGitを基本から分かりやすくまとめてみた](https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0)
OpenCVで自作分類器を作成する (画像ファイルリストの作成について)

## OpenCVを使ったカスケード分類器の作成
こちらの記事を参考にOpenCVで自作分類器を作成しました。

https://www.pc-koubou.jp/magazine/21280

## 画像ファイルリストの作成
先程の記事の中で不正解画像ファイルを作成する際に、1つずつ手打ちせずにコマンドでファイル生成する方法です。
cvフォルダがある位置でターミナル上で以下のコマンドを打ちます。

```
dir ./ng/*.jpeg -1 > ./ng/nglist.txt
```

ngフォルダ下にnglost.txtが作成されます。このようにパス付きでファイル名が一行ずつ列挙されたテキストファイルを生成することができます。

```nglist.txt
./ng/subject_02_1.jpeg
./ng/subject_02_10.jpeg
./ng/subject_02_11.jpeg
./ng/subject_02_12.jpeg
./ng/subject_02_14.jpeg
./ng/subject_02_15.jpeg
./ng/subject_02_19.jpeg
./ng/subject_02_2.jpeg
./ng/subject_02_20.jpeg
./ng/subject_02_22.jpeg
./ng/subject_02_23.jpeg
./ng/subject_02_24.jpeg
./ng/subject_02_25.jpeg
./ng/subject_02_4.jpeg
./ng/subject_02_9.jpeg
...
```
MinIO のバージョンアップに伴い変更点があった

# おことわり
**本記事では MinIO の概要については触れないこととします。**

## 筆者の環境
* Windows 10 (WSL2)
* Docker: 20.10.7, build f0df350
* Minio: RELEASE.2021-07-08T01-15-01Z

（バージョンアップ前の MinIO のバージョンを控えておくべきでしたが失念してました・・・）

# コンソールへのエンドポイントが別に用意されるようになった
昨年 Docker Compose で MinIO を使い始めたが、先日 PC を買い替えて新規に環境構築した際、コンソールにアクセスできなくなっていた。ログを見ると、下記のようなメッセージが出ていた。

```
minio_1  | API: http://172.18.0.2:9000  http://127.0.0.1:9000
minio_1  |
minio_1  | Console: http://172.18.0.2:37791 http://127.0.0.1:37791
minio_1  |
minio_1  | Documentation: https://docs.min.io
minio_1  |
minio_1  | WARNING: Console endpoint is listening on a dynamic port (37791), please use --console-address ":PORT" to choose a static port.
```

最後の行で、コンソールのエンドポイントが動的ポートになっているというメッセージが出力されている。さらに、静的ポートに切り替えるために `--console-address` オプションを使えという案内。ということで、 `docker-compose.yml` で

コマンド引数と

```yaml
  minio:
    image: minio/minio
    command: ['server', '/data', '--console-address', ':9001'] # --console-address オプションの追加
```

ポートフォワードの設定を追加してあげた。

```yaml
    ports:
      - 9000:9000
      - 9001:9001 # コンソール用のポートフォワード設定追加
```

これでコンソールにアクセスできるようになった。

# 使っていた環境変数が非推奨になった
アクセスキー、シークレットキーとして設定していた `MINIO_ACCESS_KEY` と `MINIO_SECRET_KEY` が非推奨になっていた。

```
minio_1  | WARNING: MINIO_ACCESS_KEY and MINIO_SECRET_KEY are deprecated.
minio_1  |          Please use MINIO_ROOT_USER and MINIO_ROOT_PASSWORD
```

2 行目に代わりの環境変数名が出力されているのでそれを使うようにした。

```yaml
    environment:
      MINIO_ROOT_USER: minio            # 元 MINIO_ACCESS_KEY
      MINIO_ROOT_PASSWORD: miniosecret  # 元 MINIO_SECRET_KEY
```
rubocop：Metrics/BlockLengthからRSpecファイルを除外する

# 経緯
VScodeでrubocopの設定が反映されなかったので、１事例として残す。

# 変更内容
rubocop解析項目の`Metrics/BlockLength`で、RSpecファイルを除外する。

**Metrics/BlockLength：ブロック行数をチェックしてくれる項目**
※デフォルトでは２５行

# 目的
RSpecのテストコードを書くと、どうしても２５行以上になるので個別設定にしておく。


# 設定すべきファイル

rubocopの各種設定ができる`.rubocop.yml`を変更する。

```.rubocop.yml

Metrics/BlockLength:
  Exclude:
    - "spec/**/*"

```

インターネットで情報収集してると、パスを`"spec/**/*.rb"`としているケースも見られたが、それでは反映されなかった。


# おわりに

rubocopの設定変更は今後も必要になる可能性があるので、ネット記事だけではなく、自分でも微修正しながら設定する意識をする。

原因は追及できなかったが、各種ソフトのバージョンも関係しているのかも。

とりあえず、これで本来の実装すべきテストコードに着手できるので良かった。
Typescriptで Expected error to be handled エラー

## 環境
MacOS Big Sur 11.7
Nuxt.js 2.15.7
## 問題

下記のコードで　 `Expected error to be handled` というエラーが出た。　

```
  await axios
    .get('/api/user')
    .then(async (response) => {
      if (response.status === 200) {
        user = response.data
      }
    })
    .catch((error: any) => {
      return null
    })
  return user
```

## とりあえずの解決方法
`.catch` の中をかく（今回はconsoleにerrorを返す）

```
  await axios
    .get('/api/user')
    .then(async (response) => {
      if (response.status === 200) {
        user = response.data
      }
    })
    .catch((error: any) => {
      console.log(error)
      return null
    })
  return user
```
AppleScript と Perl 連携でテキストファイル処理をする（ レーザー加工用svg 形式ファイルのシンプル化）

## レーザーカッター用のデータ作成の課題
　レーザー加工機は、たいがい Adobe Illustrator でデータを作成してプラグインなどで加工器を制御するのですが、ご存知のように Illustrator は価格が高いので、たまにしか使わない個人ユーザーはフリーの作図ソフト（Inkscape や LibreOffice Draw など）で作成し、svg 形式のファイルにエクスポートして、ファブ施設の Illustrator で読み込んで加工している人が多いと思います。

　ところが、この場合、カット用のパスが2重になっていたり、色々不都合が出たりしていました。

　この問題の解決策の一つが「北東北 LABVIEWユーザー会」のサイトで「[レーザーカッターで役に立つメイカーのためのLabVIEW Community活用法](https://forums.ni.com/t5/北東北-LabVIEWユーザー会/レーザーカッターで役に立つメイカーのためのLabVIEW-Community活用法/m-p/4163041?profile.language=ja) として紹介されていました。

　この方法と同じことをするアプリを AppleScript で作ったので紹介します。

## AppleScript だけでは苦戦
　AppleScript だけで作成しようと頑張ったのですが、テキストファイル処理のところで、改行文字とかキャラクター配列とString とか何かの問題でなかなかうまくいかなかったので、テキストファイル処理の部分は Perl スクリプトを作成してそちらに任せました。（結果的に簡単だった）

## プログラムソース
　前置きが長くなりましたが、作成したアプリのソースです。
### まず、本体の AppleScript

```AppleScript:modSVG.scpt
-- SVG 形式のファイルを ADOBE Illustrator 用に修正します
-- レーザーカッター用のカットパスだけを選択します。（彫刻や塗り潰しは無視されます）

set inFile to POSIX path of (choose file) -- 入力用ファイルを選択
set rExp to quoted form of "s/\\.[^\\.]*$//" -- ファイルパスから拡張子を取り除く正規表現
set cmd to "echo " & quoted form of inFile & " | sed " & rExp -- ファイルパスか拡張子を取り除く
set outFile to (do shell script cmd) & "_Mod.svg" -- 出力ファイルパス（..._Mod.svg）をセット

set cmdPath to "~/Desktop/convSVG.pl" -- perl スクリプトの場所を指定（デスクトップ）
-- set cmdPath to appPath & "Contents/Resources/Code/convSVG.pl"	-- perl スクリプトの場所を指定（アプリ内）

set cmd to "perl " & cmdPath & " <" & inFile & " >" & outFile

do shell script cmd
```
　perlスクリプトの場所は、環境に合わせて変更してください。
　コメントアウトしている方は、AppleScriptをAppとして保存したときに、Appの内部に Contents/Resources/ の下に Code ディレクトリを作成してその中に Perl スクリプトをコピーして内包させる場合の記述です。

### テキストファイル処理のPerlスクリプト
```perl:convSVG.pl
#!/usr/bin/perl
#### use encoding 'utf8', STDOUT=>'shiftjis';
$flg = 1;
while(<>) {
	$flg = 0 if(/<svg version=.*/);
	if($flg) { printf($_);
	} else {
		printf($_) if (/<path fill="none".*>$/);
		printf($_) if (/<\/?svg.*>$/);
	}
}
```

## 使用上の注意

　この方法では、レーザー加工機用のデータのうち、カット用のパスデータだけのものに有効です。
　塗り潰しのあるパスデータや彫刻用の画像データは無視されますので、ご注意ください。
Numpy.loadtxtで読み込んだ文字列が切り捨てられるのを止める

備忘録です。
# 状況
Numpyの `loadtxt`を使って文字列の配列を読み込んだ際に、一部の文字列が途中で切り捨てられた形になっていた。
例えば
`short,short,...,longlonglonglonglong,...` というような内容のファイルを
`np.loadtxt("file", delimiter=",", dtype=str)`のように読み込むと、`longlonglonglonglong`が`longl`として読み込まれていた。

# 解決法
`loadtxt`の引数`dtype`に単なる`str`ではなく`U20`のように文字列の長さの上限を決めて指定するようにする。

要素数の少ないファイルで実験するとそもそも上記の状況が起こらなかった。（上記のような文字列の例だと読み込み後の配列は自動的に`dtype='<U20'`が設定されていた。）
恐らく、読み込む要素が多い場合には前のほうの要素だけから文字列長の上限を先に決めていて、後ろのほうで初めて長い文字列が登場した場合に上記のように切り捨てが発生するのだと思われる。
デプロイまでの手順（備忘録）

手順
1) プロジェクトフォルダ作成
`mkdir <プロジェクト名>`
`cd <作成したフォルダ>`
2) ファイル作成
`touch server.js`
３）　views フォルダ作成
`mkdir views`
4) Index ファイルの作成　
`touch views/Index.jsx`
5) modelフォルダの作成
`mkdir models`
6)クラスを書くファイル作成(ファイル名は適当)
`touch models/pokemon.js`
7) 
`touch .gitignore`
8) pakage.jsonを作成するディレクトリにいること
`npm init -y`
9) 
`npm i express`
10) 
`npm i express-react-views react@16 react-dom@16`
11) dotenvのインストール
dotenv モジュールを使用すると、カレントディレクトリに置かれた .env ファイルを読み込み、そこに記述されたキー＆バリューのペアを process.env 経由で参照できるようになります。
`npm install dotenv`
12) 
`npm i mongoose`
13)
`npm i method-override`
【Go】入門（構造体と関数を紐付ける）

Goで構造体と関数を紐付ける方法についてのメモです。

# Goで構造体と関数を紐づける方法

Goでは、class内にメソッドを定義できません。
では、どのように構造体ごとの関数を定義するのか？

```go
package main

import "fmt"

type Human struct {
    Name   string
    Age    int
}

func (h Human) addAge(i int) int {
    return h.Age + i
}

func main() {
    // インスタンス生成
    hoge := Human{
        Name:   "hoge",
        Age:    20,
    }

    fmt.Printf("%#v \n", hoge)
    hoge.Age = hoge.addAge(1)
    fmt.Printf("%#v \n", hoge)
}
```

つまり、構造体と関数の紐付けはこのようになります。

```go
type Human struct {
    Name   string
    Age    int
}

func (h Human) addAge(i int) int {
    return h.Age + i
}
```

一般化すると、こうですね。

```go
type 構造体 struct {
    // フィールド定義
}

func (変数名 構造体) 関数名(変数名 型) 型 {
    // do something
    return 値
}
```

（変数名 構造体）を関数の前に加えるだけで、構造体と関数が紐づけられます。
ここで定義した関数は構造体が作成されないと使用できません。
このようにして、構造体ごとに関数を定義することができます。
LPIC level1勉強方法。

##LPIC101
ping-t中心。スピードマスター問題集を軽く一周。
ping-tの解説は非常に充実しているので、それで勉強するイメージ。
正直ping-tだけで合格できそうな印象。
スピードマスター問題集は結構細かいところまで解説してくれてるので、
資格取得関係なくやっておいてもいいかも。

####期間
1ヶ月
　- 平日：通勤時間(2時間/日)
　- 休日：5時間/日
　- 
####結果
760/800

##LPIC102
LPIC101と同様。


####期間
1ヶ月
　- 平日：通勤時間(2時間/日)
　- 休日：3時間/日

####結果
670/800

アウトプットをしながら完璧に覚えようとする場合、かなり時間がかかると思います。
目的は人それぞれだと思いますが、アウトプットは適度に抑えて1ヶ月くらいで取得するのがいいかなと個人的には感じました。
全体的に覚えるコマンドが多いので、由来などで記憶に定着させていかないと頭パンクします。。。

####参考
コマンドはこのような感じで覚えていきました。

https://qiita.com/essei0-0/items/65d0584ed28c951e5e2b
githubをpythonのデータベースとして使う


###記事はこちらから〜

http://techblog.short-tips.info/python/python_git_database.html



##注意

あまりやりすぎないこと
※やりすぎるとgithubさんから怒られてしまいます...

##前提条件

本サイトではPythonからGithubへアクセスするためにライブラリを使用します。

次のコマンドを使って、PyGithubをインストールしてください

PyGithub

pip install PyGithub
【Docker】AmazonLinux 導入方法

# はじめに

最近、Docker の便利さを再認識し、何をするにしても Docker を使うことを検討してしまっています。

今回は AWS EC2 でよく使われている（と思う）Amazon Linux を Docker 上で使用する方法についてご紹介したいと思います。


#### 関連リンク
関連リンクを下記に載せておきますので、必要であれば参考にしてください。

* 【Rails】開発中プロジェクトへDocker導入・環境構築方法
    * https://qiita.com/syukan3/items/f8d426b8334086fa4c15

# Amazon Linux イメージ取得

```bash
# DockerHub から amazonlinux のイメージを取得
$ docker pull amazonlinux

# 取得したイメージ確認
$ docker images
# REPOSITORY       TAG              IMAGE ID       CREATED       SIZE
# amazonlinux      latest           7443854fbdb0   2 weeks ago   163MB
```

バージョンの指定などが必要な方は以下のURLから選択してください。

* https://hub.docker.com/_/amazonlinux?tab=tags&page=1&ordering=last_updated


# コンテナ内操作方法

docker のイメージからコンテナを起動して bash に入るためのコマンドは以下となります。

```bash
$ docker run -it amazonlinux

# イメージ詳細確認
bash-4.2# cat /etc/image-id
# image_name="amzn2-container-raw"
# image_version="2"
# image_arch="x86_64"
# image_file="amzn2-container-raw-2.0.20210617.0-x86_64"
# image_stamp="92c8-b60f"
# image_date="20210617014854"
# recipe_name="amzn2 container"
# recipe_id="6007f35f-e474-ef7d-d086-5377-65d8-d92c-de9be4d7"
```

# まとめ

AmazonLinux で本番環境を運用しているサービスはそれなりに多いのかなと思います。
開発環境も AmazonLinux にすることで本番環境にデプロイ時の環境の差異が少なく工数の削減ができると思いますので、今後は積極的に AmazonLinux on Docker を使っていきたいなと思っています。

できるだけ細かい単位にする方が、いろんな人に汎用的に使えるかなぁと思って短めの記事で投稿しています。
長めの記事とどちらが閲覧数多くなるかなどわかればいいなと思ってます。

次回は AmazonLinux 上で Ruby / Rails をインストールする方法や Dockerfile で自動的に環境築する方法などを載せる予定です。

# 参考
* Amazon Linux 2 on Docker
    * https://github.com/revsystem/Dockerfiles/tree/master/AmazonLinux2
* DockerHub: amazonlinux
    * https://hub.docker.com/_/amazonlinux
* Node.js v12をyumでインストールしてみた。(CentOS 7)
    * https://qiita.com/daichi_pd/items/239a7e3eea74c5be6dc9

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
plunkerでa-frame その6

# 概要

plnkerでa-frameやってみた。
physicsやってみた。
エレベータ作ってみた。

# サンプルコード

```

let container = document.querySelector("#container")
let box = document.querySelector("#box")
function run() {

	box.object3D.position.y += 0.1 
	setTimeout(run, 300);
}
run();



```

# 成果物

https://embed.plnkr.co/plunk/1fKNlbfznuC00CjN

以上。
plunkerでa-frame その5

# 概要

plnkerでa-frameやってみた。
physicsやってみた。

# サンプルコード

```
let container = document.querySelector("#container")

function run() {
	let x = Math.random() * 6 - 3
	let y = 5
	let z = -4
	container.innerHTML = `<a-sphere dynamic-body="mass: 0.5" position="${x} ${y} ${z}" radius="0.5" color="aqua" ></a-sphere>`
	setTimeout(run, 3000);
}
run();


```

# 成果物

https://embed.plnkr.co/plunk/Tdk3uoqfCsu54gB0

以上。
Array クラスの select メソッド

RubyのArrayクラスのSelectメソッドの使い方
Rubyで入力した値のうち、3の倍数のデータをa配列に追加して、a配列に入っている要素数をカウントするRubyプログラムです


```Ruby
n = gets.to_i
a = gets.split(' ').select { |n| n.to_i % 3 == 0 }

puts a.length
```

この方法は知らなかったので勉強をかねてQiitaブログに掲載いたします。
ポアソン分布を理解するために試してみた

E資格受験勉強中です。

[二項分布を理解するために試してみた](https://qiita.com/azumabashi/items/9894b4c1a38485c8eff9)
の続きです。

### ポアソン分布

[Wikipadia:ポアソン分布](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A2%E3%82%BD%E3%83%B3%E5%88%86%E5%B8%83) では
「ある時間間隔で発生する事象の回数を表す離散確率分布である。」
と説明されています。

Pythonでは random.poisson で計算できます。
random.poisson に与えるパラメータは　期待値(λ)、サンプル数です。
random.poisson からの戻り値はサンプル毎の事象が発生する回数です。

ちょっと分かりにくいのでパラメータを変えて試してみます。

###試すためのしくみを作る

```poisson.py
import numpy as np
import matplotlib.pyplot as plt

def poisson(lamb):
    np.random.seed(0)
    x = np.random.poisson(lamb,1000)
    fig, ax = plt.subplots()
    ax.hist(x)
    plt.grid(True)
```

###期待値が0の場合
何度やっても事象は発生しません。

```python
poisson(0)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/d793e3ab-3473-7961-a446-875d1e806fe0.png)

###期待値が1の場合

```python
poisson(1)
```

0回か1回になることが7割以上になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/e291328f-5ef2-c3ff-88eb-316773a9a05f.png)

###期待値が2の場合

1、2となることが多く、0や3以上にもすそ野が広がっています。

```python
poisson(2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/6ec7a166-19ac-386a-522e-6fc9f38aba76.png)

###期待値を上げていった場合
少しずつ正規分布に近づいているような感じでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/586971fd-a928-7c71-c65a-a5a170abd0f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/755d1ec5-3d23-91e8-e68b-409f6cef1b6e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/80c01be5-9b99-36c1-2a3f-ea1083d90db8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/1c6700d3-13c1-6fca-e6fb-aaca66cef8b3.png)
[Rails]Action Mailboxとはメール受信時の処理を行うライブラリ

# はじめに
Rails6から追加された、メール受信時の処理を行う機能を提供するAction Mailboxというライブラリ。比較的新しい機能で使う機会がなかったのですが、機会が巡ってきたので、備忘録を書こうと思います！

# 対応するメールサービス、メールサーバ
- Mailgun
- Mandrill
- Postmark
- SendGrid
- Exim
- Postfix
- Qmail

# 利用方法
※今回は本番環境でSendGridを利用することを想定して実装します。

1.ActiveJobので読み込むキューを設定する。

```config/sidekiq.yml
:queues:
  ...
  - action_mailbox_routing
  - action_mailbox_incineration
```

2.ActiveStorageの保存先をクラウドストレージサービス(S3等)に変更する。

3.Action Mailboxのセットアップを行う。

```bash
$ rails action_mailbox:install

$ rails db:migrate
```

3.SendGridを利用する設定を追加する。

```config/environments/production.rb
Rails.application.configure do
  ...
  config.action_mailbox.ingress = :sendgrid
end
```

4.`rails credentials:edit`を実行して、外部からのリクエストを認証するパスワードを設定する。

```yml
...
action_mailbox:
  ingress_password: 任意のパスワード
```

5.受信メールを`/rails/action_mailbox/sendgrid/inbound_emails`に転送するよう[SendGridのInboundParse](https://docs.sendgrid.com/for-developers/parsing-email/setting-up-the-inbound-parse-webhook)を設定します。

```
＜例＞
https://actionmailbox:PASSWORD@任意のドメイン/rails/action_mailbox/sendgrid/inbound_emails
```

6.基本的なルーティングを設定する。

```app/mailboxes/application_mailbox.rb
class ApplicationMailbox < ActionMailbox::Base
  # 正規表現にマッチしたメールは、指定したActionMailboxに処理が振り分けられる
  routing /^save@/i     => :forwards

  # ブロック引数を受け取り判断処理
  routing ->(inbound_email) { inbound_email.mail/.to.size > 2 } => :multiple
 
  # すべてのメールにマッチする
  routing :all => :backstop
end
```

7.メールボックスを生成する。

```bash
$ rails g mailbox comments
```

8.メールボックスの設定を行う。

```app/mailboxes/forwards_mailbox.rb
class CommentsMailbox < ApplicationMailbox
  # 処理に必要な条件をコールバックで指定する
  before_processing :validate_request

  def process
    board.comments.create!(body: mail.decoded, creator: commenter)
  end

  private

  def require_forward
    return if commenter && board

    # 引数で受け取ったActionMailerオブジェクトに対して、deliver_latorメソッドを実行してメール送信
　　　　　　　　# InboundMailの状態をbouncedに変更する
    bounce_with CommentMailer.invalid_request(
      inbound_email, commenter: @commenter, board: @board
    )
  end

  def commenter
    return @commenter if defined?(@commenter)
    @commenter = User.find_by(email: mail.from)
  end

  def board
    return @board if defined?(@board)
    @board = Board.find_by(id: mail.to.split('-')[0])
  end
end
```

10.メールが削除される日数を設定する。(デフォルトでは30日間)

```config/environments/production.rb
...
config.action_mailbox.incinerate_after: 100
...
```

## 受信したメールの状態

| 状態 | 意味 |
|:----|-----:|
| pending | 初期状態 |
| processing  | 処理中  |
| delivered  | 処理が正常終了した |
| failed | 処理中に例外が発生した  |
| bounced | 処理の実行を中止  |

## 開発を支援するWeb UI
実際にSendGridを用いなくても、動作確認を行うことができるWebUIを提供しています。
必要なデータを作成し、以下のURLにアクセスする。
この画面でメールを送信することで、詳細情報画面に遷移し、いろんな情報を確認できます。

http://localhost:3000/rails/conductor/action_mailbox/inbound_emails

# 終わりに
こういった機能を標準で装備されているのは嬉しい限りですね！Githubのようなプルリクにコメントが来た際にメールが来ますが、そのメールに返信するとコメントとして返信できるような機能も実装できるので、利用幅が広いなと思いました。


# 参考
[Action Mailbox の基礎]
(https://railsguides.jp/action_mailbox_basics.html)
AI/機械学習の学習時の備忘録サイトマップ

AI業界に興味があり、AI/機械学習について学習中です。
以下は、学ぶ中での備忘録をまとめた**自身のQiita記事**のサイトマップです。

## サイトマップ
1. [Pythonの下準備](https://qiita.com/y-y/items/0c99b813a1fafaa85019)
Google Colaboratoryの機能やPythonライブラリのインポートなど実行前の下準備部分について書いてます。

1.  [AI/機械学習の学習中に気になった用語](https://qiita.com/y-y/items/0b6e40fa4a76a47bffe2)
学習中に気になった用語などをつらつらと書いていきます。
（後から要整理）

1.  [Pythonのライブラリ/パッケージについて](https://qiita.com/y-y/items/93bac3eb1767d9f9c46b)
利用したPythonのライブラリ/パッケージについて纏めます。

1. [AI/機械学習関連 リンク集](https://qiita.com/y-y/items/ce4b0de9bdc65f7a8f3d)
AI/機械学習関連について調べる中で気になったり、後から参照したいリンク集です。
AI/機械学習関連 リンク集

AI/機械学習関連 リンク集です。
とても参考になります！（ありがとうございます！）


## データセット
#### [UC Irvine Machine LearningRepository](https://archive-beta.ics.uci.edu/)
カリフォルニア大学アーバイン校が管理する機械学習リポジトリ
寄付された様々なデータセットが集まっている。

#### [「この世に存在しない人物の顔画像5000枚」のアノテーションデータ](https://ledge.ai/aif-apto-annotation-data/)
株式会社エイアイ・フィールド（AIF）、および株式会社APTOが提供するAI（人工知能）開発に必要なアノテーションデータ。無償提供期間は2021年9月30日まで。

#### [東京都オープンデータカタログサイト](https://portal.data.metro.tokyo.lg.jp/)
東京都のオープンデータを検索・ダウンロードできる「カタログ」サービスです。

#### [オープンデータ ジャパン](https://www.opendata-japan.com/)
自治体や省庁が公開しているオープンデータの情報を簡単に検索できるサイト

## 学習サイト
#### [codExa](https://www.codexa.net/ai-magazine/)
機械学習の動画学習サイト。
特に機械学習を学ぶ上で必要な情報の記事(AIマガジン)がとても参考になる。

#### [Python でデータサイエンス](https://pythondatascience.plavox.info/)
データの統計分析の手順や使い方について紹介されている。
分かりやすく、かつ実践的な方法で纏められている。
例えば、決定木分析では長所、アルゴリズム、分析クラスの引数、可視化の方法まで網羅されている。ただ、情報が古い可能性は高いので参考程度に。

[キカベン](https://kikaben.com/)
機械学習の色々なトピックについて、とても分かりやすく説明されている。

## 検索プラットフォーム
#### [e.g.](https://ledge-eg.com/)
これからAIプロジェクトの一歩を踏み出す人のためのAI活用事例の検索プラットフォーム。
掲載時点で約700件のAI活用事例が検索できる。

#### [Papers With Code](https://paperswithcode.com/)
コードがGitHubで公開されている論文だけが表示される。

## コンペ系
### Kaggle始めるとき
#### [Kaggleをはじめるにあたって知っておくべきこと](https://github.com/amaotone/kaggle-memo/blob/master/getting_started.md)
#### [Kaggleに登録したら次にやること ～ これだけやれば十分闘える！Titanicの先へ行く入門 10 Kernel ～](https://qiita.com/upura/items/3c10ff6fed4e7c3d70f0)
#### [初心者チームでkaggleコンペに参加して銅メダルを取った話](https://qiita.com/naccchan/items/f836876d3ed7b4528478)
#### [Kaggle日記という戦い方](https://zenn.dev/fkubota/articles/3d8afb0e919b555ef068)

## ノーコード
#### [STUDIO](https://studio.design/ja)
STUDIO株式会社が提供するクラウドベースの Web サイト作成ツール。
ノーコードでWebサイトを作成できる。


## 仮想通貨関連記事
機械学習で仮想通貨の価格を予測する記事達。

#### [【入門編】機械学習で仮想通貨の価格予測！KerasでLSTMモデルを構築してビットコインとイーサリアムの翌日の価格を予測する方法](https://www.codexa.net/keras-lstm-cryptos-forecast/)

#### [仮想通貨取引所のPoloniexからAPI経由でデータ取得し、ディープラーニング（Chainer）で翌日の価格予測をしよう](https://qiita.com/yoshizaki_91/items/79f4056901dd9c059afb)

## 開発環境
#### [本番環境に移行しやすいMLエンジニアリング](https://zenn.dev/hrsma2i/articles/production-ready-ml)
メンテナンス性を高める為に環境構築、実装時の注意点について記述されている。

#### [【2020年新人研修資料】ナウでヤングなPython開発入門](https://speakerdeck.com/stakaya/2020nian-xin-ren-yan-xiu-zi-liao-nauteyankunapythonkai-fa-ru-men?slide=21)
パッケージマネージャ、フォーマッタ、単体テストなど開発時にあると良いものが書かれている。
AI/機械学習の学習中に気になった用語

# AI/機械学習を学ぶ中で気になった用語集【随時更新】
随時追加、整理します。

## 数学関連
**ヒンジ(hinge)**
統計量の1種。
四分位数の簡易な求め方として、中央値より上の値の中央値と、中央値より下の値の中央値を使う場合があり、この値のことをヒンジと呼ぶ。

**シグモイド関数**
あらゆる入力値を0.0～1.0の範囲の数値に変換して出力する関数

**潜在変数**
統計学において、直接は観察されないが、観測された他の変数から推定される変数を意味する。

**主成分分析**
相関のある多数の変数から相関のない少数で全体のばらつきを最もよく表す主成分と呼ばれる変数を合成する多変量解析の一手法。データの次元を削減するために用いられる。

**線形回帰の過学習を抑制する方法**

- Ridge回帰  
  正則化された線形回帰の一つで、線形回帰に「学習した重みの二乗の合計（L2正則化項）」を加えたもの
- Lasso回帰  
  正則化された線形回帰の一つで、線形回帰に「学習した重みの合計（L1正則化項）を加えたもの
- Elastic Net  
  リッジ回帰とLasso回帰の折衷案で「Lasso回帰のモデルに取り込める説明変数の数に制限がある」という問題点をカバーできる方法

## 機械学習

**ニューラルネットワーク**
人間の脳内にある神経細胞（ニューロン）とそのつながり、つまり神経回路網を人工ニューロンという数式的なモデルで表現したもの。
機械学習や深層学習（ディープラーニング）などを学ぶ際に知っておくべき基本的な仕組み。
入力層、出力層、隠れ層から構成され、層と層の間には、ニューロン同士のつながりの強さを示す重み「W」がある。

**CNN**
畳み込みニューラルネットワーク（Convolutional Neural Network)

**RNN**
再帰型ニューラルネットワーク（Recurrent Neural Network)
ニューラルネットワークを拡張して時系列データを扱えるようにしたもの

**回帰**
未知のデータまで予測する。

**分類**
すでにあるデータを分ける。

**機械学習のパラメータ更新方法**

 - バッチ学習
 学習に用いるデータ全てで勾配を計算した後にモデルのパラメータを更新する手法。

 - ミニバッチ学習
 一度のパラメータを更新に用いるデータの数はバッチサイズと呼ばれる人手で設定するハイパーパラメータによって決定

 - オンライン学習
 学習データ1つごとにモデルのパラメータを更新する手法。


## [Kaggle](https://www.kaggle.com/)
多くのデータサイエンティストが参加するデータ分析コンペ。[Kaggleチュートリアル](https://www.codexa.net/what-is-kaggle/)
日本企業でもメルカリが「適正な販売価格の予測」のコンペなどを開催している。
[Kaggle メルカリ価格予想チャレンジの初心者チュートリアル](https://www.codexa.net/kaggle-mercari-price-suggestion-challenge/)

**Kernels**
初心者向け機能。
各データセットに対して他のユーザーが構築した予測モデルのコードや説明が公開されている。

**Discussion**
世界中のデータサイエンティスト・機械学習実装者とのコミュニケーションが可能。

**SIGNATEとの違い**
大きな違いは「日本語」で記載されているのか「英語」で記載されているのか。
コーディングの環境が用意されていない。他の参加者の実装内容が公開されていない

## その他

**ティッカーシンボル**
欧米などで金融商品取引所に上場する銘柄を識別するために付けられるコード

**活性化関数**
ニューラルネットワークのニューロンにおける、入力のなんらかの合計から、出力を決定するための関数で、非線形な関数とすることが多い。

**目的関数、目的変数**
最適化問題で、値を変化させるものを変数といいます。
最小にしたい、あるいは最大にしたい値、あるいは関数値のことを目的関数といいます。


**アンサンブル学習**
個々に別々の学習器として学習させたものを、融合させる事によって、未学習のデータに対しての予測能力を向上させるための学習

**ベイズ統計**
確率のベイズ的解釈に基づく統計学の分野における理論。主観確率を扱う統計学。
データが不十分でも、”ある事態が発生する確率”を最初に設定（＝事前確率を設定）した後、さらなる情報が得られる度に”ある事態が発生する確率”（＝事後確率）を更新していき、本来起こるであろう事象の確率（主観確率）を導き出す。

**GAN（Genera tive Adversarial Networks）**
敵対的生成ネットワーク。
教師なし学習で使用される人工知能アルゴリズムの一種。
生成モデルの一種であり、データから特徴を学習することで、実在しないデータを生成したり、存在するデータの特徴に沿って変換できる。

**特徴量**


**特徴量エンジニアリング**
今あるデータの特徴量から新しくデータの特徴量を作成する作業のこと

**スパース行列(疎行列)**
成分のほとんどが零である行列のこと
scipyのスパース行列に変換すると、メモリ削減・処理速度向上の効果がある。
Java: QuartzScheduler やタスク定期実行

スケジューラ実行ができるライブラリ、Quartz。

http://www.quartz-scheduler.org/

http://www.quartz-scheduler.org/documentation/quartz-2.2.2/examples/ にサンプルがあります。

## Hello World

https://github.com/Flipkart/quartz/blob/master/distribution/examples/src/main/java/org/quartz/examples/example1/HelloJob.java
https://github.com/Flipkart/quartz/blob/master/distribution/examples/src/main/java/org/quartz/examples/example1/SimpleExample.java

を参照のこと。以下抜粋

```SimpleExample.java
  public void run() throws Exception {
    Logger log = LoggerFactory.getLogger(SimpleExample.class);

    log.info("------- Initializing ----------------------");

    // First we must get a reference to a scheduler
    SchedulerFactory sf = new StdSchedulerFactory();
    Scheduler sched = sf.getScheduler();

    log.info("------- Initialization Complete -----------");

    // computer a time that is on the next round minute
    Date runTime = evenMinuteDate(new Date());

    log.info("------- Scheduling Job  -------------------");

    // define the job and tie it to our HelloJob class
    JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();

    // Trigger the job to run on the next round minute
    Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();

    // Tell quartz to schedule the job using our trigger
    sched.scheduleJob(job, trigger);
    log.info(job.getKey() + " will run at: " + runTime);

    // Start up the scheduler (nothing can actually run until the
    // scheduler has been started)
    sched.start();

    log.info("------- Started Scheduler -----------------");

    // wait long enough so that the scheduler as an opportunity to
    // run the job!
    log.info("------- Waiting 65 seconds... -------------");
    try {
      // wait 65 seconds to show job
      Thread.sleep(65L * 1000L);
      // executing...
    } catch (Exception e) {
      //
    }

    // shut down the scheduler
    log.info("------- Shutting Down ---------------------");
    sched.shutdown(true);
    log.info("------- Shutdown Complete -----------------");
  }

```


## タスク定期実行等、関連

http://www.atmarkit.co.jp/fjava/javatips/078java008.html


http://www.02.246.ne.jp/~torutk/javahow2/timer.html


メモのようなところですが、以上です。
Pythonの下準備

Pythonの実行環境は[Google Colaboratory](https://colab.research.google.com/notebooks/intro.ipynb?hl=ja)の利用を想定。
本記事ではPythonを利用する際の下準備部分の情報について記述する。
主な内容は以下の通り。

 - Google Colaboratoryの機能
 - ライブラリのインストールについて
 - Pythonの構文など

## Google Colaboratory ショートカット
```Python
# Markdownモードへ変更
[Ctrl] + [M] + [M]
# Codeモードへ変更
[Ctrl] + [M] + [Y]
# セルを上に追加
[Ctrl] + [M] + [A]
# セルを下に追加
[Ctrl] + [M] + [B]
# セルのコピー
[Ctrl] + [M] + [C]
# セルの貼り付け
[Ctrl] + [M] + [V]
# セルの消去
[Ctrl] + [M] + [D]
# コメントアウト
[Ctrl] + [/]
```

## Python 環境構築
```python:
# ライブラリをverson指定してインストール
pip install torch==1.7.0+cu101
# 最新バージョンへ更新
pip install --upgrade torch
# バージョンの確認
pip show torch
# 一括Update
pip list -o | awk 'NR>2{print$1}' | xargs pip install -U

# Windowsにwheel形式でインストールする方法
# 1.wheel形式を扱える様にwheelをインストール
pip install wheel
# 2.各ライブラリの公式サイトからwheel形式のファイルをダウンロード
# 3.ダウンロードしたライブラリをインストール
pip install '***.whl'
```

## 基本的な構文の備忘録

```python:
# print記述方法
print('{}, {}, {}'.format(1, 2, 3))
print('{0}, {1}, {2}'.format(1, 2, 3))
print('{a}, {b}, {c}'.format(a=1, b=2, c=3))
print('{a}, {b}, {c}'.format(**{'a':1, 'b':2, 'c':3}))

# 小数点四捨五入(小数点3桁表示の場合)
print('小数点4桁目四捨五入結果：{:.3f}'.format(0.15555))
 # printの中でformat(0.15555, '.3f')の様に指定しても四捨五入されない

# リスト内包表記
j = [i + 1 for i in range(5)] # [1, 2, 3, 4, 5]

# Tensor型値抽出例
a = torch.Tensor([1., 2., 3.])
print(a[0].item())

# dict 属性を持つオブジェクトの、 dict 属性を返す。
vars(obj)
```
## デバッグ
Google Colaboratoryのデバッグでは、`%debug`というマジックコマンドが使用可能。
標準のデバッグツールである`pdb`を起動する。
セルごとで分けて実行が出来る為、あまり使用する場面はなさそう。

**主なコマンド**

- `Pdb().set_trace()`：ブレークポイント
- `h`：ヘルプ
- `p`： [expression]：式を評価して出力する
- `s`：ステップイン（行単位で実行）
- `n`：ステップオーバー（行単位で実行）
- `c`：次のブレークポイントへ
- `q`：その場で終了する

## 用語
- wheel形式
Pythonのパッケージの形式（フォーマット）のことを指す。実態はzip形式のアーカイブ。

- シード
シードは乱数の元になるもので、Pythonの環境を最初に実行した時に時刻などで初期化される。
シードを固定することで再現性のある同じ乱数列（結果の連なり）を作ることが可能。

- マジックコマンド
JupyterLabやIPythonで用意されている関数群
 - `%lsmagic`：コマンドのリスト
 - `%magic`：マニュアル
リファクタリング

そもそもリファクタリングとは何かに関しては下記のリンクからご確認いただいた方が腹落ちしやすいかと。

```
chrome-error://chromewebdata
```

さて今回はそんなリファクタリングに関しての私自身が実際に行った修正。

```ruby
class PurehasesController < ApplicationController
  before_action :authenticate_user!, only: [:index, :create]
  before_action :set_item, only: [:index, :create]
  before_action :set_purehase, only: [:index, :create]

def index
    @order = PurehaseShipping.new
    return redirect_to root_path if current_user.id == @item.user.id || @item.purehase.present?
  end

  def create
  end

  private

#一部省略


  def set_purehase
    if @item.purehase.present?
      redirect_to root_path
    end
end
```

```ruby
return redirect_to root_path if current_user.id == @item.user.id || 

 def set_purehase
    if @item.purehase.present?
      redirect_to root_path
    end
```

ここの記述の内容が重複していたので

```ruby
def set_purehase
    return redirect_to root_path if current_user.id == @item.user.id || 　　　　@item.purehase.present?
  end
```

上記のようにbefore_actionの私の記述でいうset_purehaseの中にリファクタリング。
問題なく動作も確認できたので同じ記述を何度もするという生産性を下げてしまう行為、
デバッグの際、見つけやすくするためにも今後も心掛けていかなければ。
2021/07/10開催 Connpassイベントランキング

# 申込数TOP5

|順位|イベント名|グループ|申込数|定員|
|:---:|:---|:---|:---:|:---:|
|:one:|[Power Automate Desktop勉強会 vol.3](https://powerautomatedesktop.connpass.com/event/215355/)|[Power Automate Desktop勉強会](https://powerautomatedesktop.connpass.com/)|604||
|:two:|[Agile Tech EXPO - New Normal Agile Episode 2](https://agiletechexpo.connpass.com/event/208376/)|[Agile Tech EXPO](https://agiletechexpo.connpass.com/)|567|600|
|:three:|[AW基礎を学ぼう 特別編　最新サービスをみんなで触ってみる はじめてのCI/CDパイプライン](https://awsbasics.connpass.com/event/214771/)|[AWS エバンジェリストシリーズ　AWSの基礎を学ぼう](https://awsbasics.connpass.com/)|447||
|:four:|[Kernel/VM探検隊online part3](https://kernelvm.connpass.com/event/209105/)|[カーネル／VM探検隊](https://kernelvm.connpass.com/)|375|65547|
|:five:|[こっそり EMS オンライン勉強会 (2021 年 7 月 6 回目)](https://ems-meeting.connpass.com/event/217342/)|[Japan EMS Users Group](https://ems-meeting.connpass.com/)|202|250|
二項分布を理解するために試してみた

E資格受験勉強中です。

[ベルヌーイ分布を理解するために試してみた](https://qiita.com/azumabashi/items/4c4abfc25a29ab6c8315)
の続きです。

### 二項分布

[Wikipadia:二項分布](https://ja.wikipedia.org/wiki/%E4%BA%8C%E9%A0%85%E5%88%86%E5%B8%83) では
「結果が成功か失敗のいずれかである試行（ベルヌーイ試行と呼ばれる）を独立に n 回行ったときの成功回数を確率変数とする離散確率分布である。ただし、各試行における成功確率 p は一定とする。」
と説明されています。

Pythonでは random.binomiral で計算できます。
random.binomial に与えるパラメータは　試行回数(n)、確率(p)、サンプル数です。
random.binomial からの戻り値は　n回の試行のうち確率pで生じる事象が発生する回数です。

ちょっと分かりにくいのでパラメータを変えて試してみます。

###試すためのしくみを作る
```binomial.py
import numpy as np
import matplotlib.pyplot as plt

def binomial(n):
    
    np.random.seed(0)
    x = np.random.binomial(n, 0.5, 1000)
    fig, ax = plt.subplots()
    ax.hist(x)
    plt.grid(True)
```

###独立な1回の試行を繰り返した場合
結果は0ばかり、1ばかりの何れかになります。

```
binomial(1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/1c7590af-3f70-5918-b6a9-d4b922e3fc9a.png)

###独立な2回の試行を繰り返した場合
0、1、2 の3通りに分かれます。2になるケースが多くなります。

```
binomial(2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/d361ecf0-bddb-d2a7-c171-49c5ccf9e4a9.png)



###独立な3回、4回、5回の試行を繰り返した場合
すべてが0、すべてが1になる比率が徐々に下がって、グラフの山が中央に寄ってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/4010e9c3-be49-bf19-4a7a-f4e42c15398e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/9b417c56-eb30-8e21-60b0-b31914561a1a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/47950936-1978-7889-3155-9bcf00503257.png)

###独立な10回、100回、1000回の試行を繰り返した場合
すべてが0、すべてが1になる比率が徐々に下がって、グラフの山が中央に寄ってきます。
グラフの山がどんどんなめらかになってゆきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/954708b1-ab05-fa3d-521c-1f5bfec552c3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/4b9d2170-8414-4760-00ef-b9246fef0d54.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/960ae070-14e1-815c-b48c-ed34c84440e5.png)


[ポアソン分布を理解するために試してみた](https://qiita.com/azumabashi/items/29dfa80bc91142b6682f)
に続きます。
ベルヌーイ分布を理解するために試してみた

E資格受験勉強中です。

### ベルヌーイ分布

[Wikipadia:ベルヌーイ分布](https://ja.wikipedia.org/wiki/%E3%83%99%E3%83%AB%E3%83%8C%E3%83%BC%E3%82%A4%E5%88%86%E5%B8%83) では
「数学において、確率 p で 1 を、確率 q = 1 − p で 0 をとる、離散確率分布である。」
と説明されています。

コイン投げのように結果が２種類しかない試行（ベルヌーイ試行）を行った場合の分布のことを言うようです。

```bernoulli_trial.py
import numpy as np

def bernoulli_trial(coin_data):
    prob_be_data = np.array([])
    for i in np.unique(coin_data):
        p = len(coin_data[coin_data==i]) / len(coin_data)
        print(i, 'が出る確率:', p)
        prob_be_data = np.append(prob_be_data, p)

print('>>1回目のベルヌーイ試行')        
coin_data = np.array([1, 0, 1, 0, 1])
bernoulli_trial(coin_data)

print('>>2回目のベルヌーイ試行') 
coin_data = np.array([0, 0, 0, 0, 0, 1, 1, 1])
bernoulli_trial(coin_data)
```

結果

```
>>1回目のベルヌーイ試行
0 が出る確率: 0.4
1 が出る確率: 0.6
>>2回目のベルヌーイ試行
0 が出る確率: 0.625
1 が出る確率: 0.375
```

結果をグラフにしてみます。
```bernoulli_distribution.py
import numpy as np
import matplotlib.pyplot as plt

def bernoulli_trial(coin_data):
    prob_be_data = np.array([])
    for i in np.unique(coin_data):
        p = len(coin_data[coin_data==i]) / len(coin_data)
        print(i, 'が出る確率:', p)
        prob_be_data = np.append(prob_be_data, p)
    return prob_be_data

def bernoulli_distribution(be_data):
    fig, ax = plt.subplots()
    ax.bar([0, 1], be_data, tick_label= ['0', '1'])
    plt.grid(True)

print('>>1回目のベルヌーイ試行')        
coin_data = np.array([1, 0, 1, 0, 1])
be_data = bernoulli_trial(coin_data)
bernoulli_distribution(be_data)
print('>>2回目のベルヌーイ試行') 
coin_data = np.array([0, 0, 0, 0, 0, 1, 1, 1])
be_data = bernoulli_trial(coin_data)
bernoulli_distribution(be_data)
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/af8261e4-875b-c874-5e11-9e910c212fb5.png)

[二項分布を理解するために試してみた](https://qiita.com/azumabashi/items/9894b4c1a38485c8eff9)
に続きます。
突然yahoo_finance_api2がデータ取得できなくなった。その解消法

＜経緯・事象＞
土曜日にいつものようにyahoo_finance_api2を利用したデータ取得プログラムを走らせてみたら、
エラーが出ました。
リクエストのステータスコードが403となっているので、閲覧権限がないってことです。

＜解消法＞
requests.getを実行しているところに、ヘッダー情報を追加して、ブラウザからのリクエストに見せかけることで、うまくいきます。

requests.getはyahoo_finance_api2のshare.pyにある_download_symbol_dataメソッドにあります。
pycharmを使っている方は、自分のコードにあるget_historicalをctrl押しながらクリックすれば飛んでいきます。


```python:share.py　対象部分の変更前（多分以下の通り）
        resp_json = requests.get(url).json()

```

```python:share.py　対象部分の変更後
        # ブラウザに偽装　" urllib.error.HTTPError: HTTP Error 403: Forbidden"対策
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36'}
        resp_json = requests.get(url,headers=headers).json()

```

参考：以下は403対策の汎用的なメモですが、早速の出番にびっくり。↓↓↓
https://qiita.com/DragonNameLeo/items/0df4316a18f2eea813bd
Flutter の pub.yaml で Gitのブランチを指定する

Flutterのパッケージは、まだまだ成熟していないものが多いですよね。
もし、他の方のパッケージを少し変更してすぐに使いたい場合は、フォークしてURLとブランチを指定するだけ！

```
shogi:
  git: 
    url: https://github.com/ryicoh/shogi
    ref: main
```

もちろん、コミットIDも指定できます。

```
shogi:
  git: 
    url: https://github.com/ryicoh/shogi
    ref: c31df28c3cf076c9aacaed1d77f45b66bb2e01a6
```

便利すぎますね。
SCPでファイル取得した履歴を保持する

表題の件です。ファイル授受する際に「だれが」「いつ」「どのファイルを」参照／取得したか？ログとして保持したいという要件です。

専用のシェルを利用するなど手段はありますが、メンテコストであったり、シェルの中身を見てログ出力部分を回避されてしまうなどあるかと思います。そのため、SCPクライアント側は特に制限せず普通のSCPコマンドを使ってもらい、サーバ側でログを出すようにしたい。

## 想定状況
サーバの/tmpにファイルを設置する
利用者はSCPでファイル取得している
SCPが来る場合「いつ」「だれが」「どのファイル」を転送したか？ログに出したい

**サーバの設定**

```sh
# uname -a
Linux ip-172-16-3-205.ap-northeast-1.compute.internal 4.14.232-177.418.amzn2.x86_64 #1 SMP Tue Jun 15 20:57:50 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
auditctl -w /tmp -p rwxa -F success=1
```

**ファイル作成**

```sh
touch /tmp/aaabbb
```

**クライアントからファイル取得**

```sh
scp user@XXX.XXX.XXX.XXX:/tmp/aaabbb .
```

**ログ出力

```sh:/var/log/audit/audit.log 
type=SYSCALL msg=audit(1626022142.750:11687): arch=c000003e syscall=257 success=yes exit=3 a0=ffffffffffffff9c a1=555a32b0aa00 a2=800 a3=0 items=1 ppid=4573 pid=4574 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=(none) ses=30 comm="scp" exe="/usr/bin/scp" key=(null)
type=CWD msg=audit(1626022142.750:11687): cwd="/home/ec2-user"
type=PATH msg=audit(1626022142.750:11687): item=0 name="/tmp/aaaa" inode=312761 dev=ca:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
```

ログにはこの2倍ほどのログが出ていますが、ファイルを特定できる箇所だけ抽出しました。どのユーザーが、いつ、どのファイルをSCPしたか？ログから特定できます。このコマンドで設定を入れた場合、そのセッション内でしか有効にならないので運用する場合はファイルにした上で永続化をお願いいたします。またログ出力量が大幅に増えるのでディスクの残量には注意してください。

2021年ファイル授受にはもっとマシな方法がたくさんありますが、なんらかの理由でSCPを使っている場合はあるかと思います。そこで既存の仕組みは変えず、サーバ側で監査を入れる場合は利用できると思います。

以上、よろしくお願いいたします
今更ながらLaravel8.xのComponentを使う

今更ながらLaravel8.xを触ってみたりしたので、忘備録として。

# 6.x以前の話
6.x以前は`@component`ディレクティブを利用してコンポーネントを読み込んでた方も多かったと思います。

```php:xxx.blade.php
@component('alert', ['foo' => 'bar'])
    ...
@endcomponent
```

第二引数で値を渡して、`@if`とかの条件分岐でモギモギする感じでしたね。

# Component作成コマンドの追加
7以降では新たに以下のコマンドが追加されています。

```shell
php artisan make:component Alert
# サブディレクトリに配置する場合は「/」で区切る
php artisan make:component Common/Alert
```

このコマンドを利用した場合、コンポーネントのbladeテンプレートは`resources/views/components`以下に配置されます。
また、`app/View/Components`内にAlertコンポーネントクラスファイルが配置されます。

# 試しにコンポーネントを作成する
とりあえずどこかの掲示板のコメントを想定して作ってみます。

- お名前
- コメント
- メルアド（空白可）

の３つのパラメーターを持つコンポーネントを作成してみます。

## `make:component`コマンドの実行
ArtisanコマンドでCommentItemコンポーネントを作成します。
この時点ではパラメーターが追加されていないので、
コンポーネントクラスにいろいろ書き加えにいきます。

```
php artisan make:component CommentItem
```

## コンポーネントクラスにパラメーターの追加
`__construct`に受け取る変数を追記します。
いずれも文字列なのでString型で受け取り、メンバ変数として保存。
Null許容のメールアドレスのみ、nullableにします。

```php:app\View\Components\CommentItem.php
<?php

namespace App\View\Components;

use Illuminate\View\Component;

class CommentItem extends Component
{
    public String $name;
    public String $comment;
    public ?String $mailAddress;

    public function __construct(String $name, String $comment, ?String $mailAddress)
    {
        $this->name= $name;
        $this->comment = $comment;
        $this->mailAddress = $mailAddress;
    }

    /**
     * Get the view / contents that represent the component.
     *
     * @return \Illuminate\Contracts\View\View|\Closure|string
     */
    public function render()
    {
        return view('components.comment-item');
    }
}
```

## コンポーネントViewの修正
メールアドレスがあれば名前にリンクを付けるような形式にします。
コメントはそのまま表示。

```html
@if ($mailAddress)
<p><a href="mailto:{{ $mailAddress }}">{{ $name }}</a></p>
@else 
<p>{{ $name }}</p>
@endif
<p>{{ $comment }}</p>
```

## コンポーネントの呼び出し

`<x-(コンポーネント名) [(パラメーター名)=(値)]>`
みたいな形式でbladeテンプレートに追記することで、コンポーネントの呼び出しが可能です。

```xml
<x-commentItem name="山田太郎" comment="こんにちにゃ！" mail-address="sample@example.com" />
<x-commentItem name="山田二郎" comment="こんばんにゃ！" />
```

これでコンポーネントの呼び出しまで出来るようになったかと思います。

# その他
`動的コンポーネント`など便利なものもあるようですが、今回は扱わないのでreadoubleにて。。

https://readouble.com/laravel/8.x/ja/blade.html

# ちら裏
pugやらvueやらの影響を受けてこのような書き方になったのでしょうか。。
フロントエンジニア視点で作りやすくなっていれば良いのですが。。
ラピッドチャレンジ　レポート　応用数学

第１章　線形代数

　高校程度の内容の確認。基本的な知識で特異事項はないが、必要に応じて再度確認

・スカラー、ベクトル、行列
・連立方程式の行列での表現
・行列の演算
・行基本変形の行列の積での表現
・逆行列（Inverse matrix）と単位行列（Identity matrix）
　　逆行列の求め方：ガウス掃き出し法
　　逆行列が存在しない場合（面積・体積０の場合）
・行列式（Determinant）
　　行列式の線形性
　　　＊行を入れ替えると符号が入れ替わる
　　行列式の求め方

```math
\begin{vmatrix}
a & b \\
c & d \\
\end{vmatrix}
=ad-bc
```

　　　＊３×３以上に増えても変換して出せる
・固有値と固有ベクトル


```math
A\vec{x}=\lambda\vec{x}
```

　上記の時、$\vec{x}$と$\lambda$を固有ベクトル、固有値という。

・固有値の求め方
　$|A-\lambda I|=0$ を解くことで求められる。（なぜなら$\vec{x}$は$\vec{0}$ではない）

・固有値分解
　固有値を対角線上に並べた行列（それ以外の成分は0）$\Lambda$と、固有ベクトルを並べた行列$V$で正方行列を次のように変形できる。
　$$A=V\Lambda V^{-1}$$

・特異値分解
　正方行列以外の行列を固有値分解のようなことをする。
　$$M=USV^{-1}$$　（$U$、$V$は直交行列）

・特異値の求め方
　$MM^{-1}$と$M^{-1}M$を固有値分解する。

・特異値分解の利用例
　画像データを行列として特異値分解し、成分の小さな特異値を取り除いても概ね同じような画像に見える。
　画像の大枠を変えずに画像の圧縮ができる。
　また特異値の大きい成分を比較することで、画像の類似性を判断することができるため、機械学習の前処理で利用できる。


第２章　統計学

　こちらも必要に応じて確認する程度

・集合
　和集合：$A\cup B$　　共通部分：$A\cap B$
・確率
　　条件付き確率：$P(B|A)=\frac{P(A\cap B)}{P(A)}$
　　ベイズ則：$P(A|B)=\frac{P(A)P(B|A)}{P(B)}$
・記述統計：揃っているデータを整理
　推計統計：標本から母集団を予想
・確率変数と確率分布
・期待値
　離散値：$E(f(X))=\sum_{k=1}^n P(x_k)f(x_k)$
　連続値：$E(f(X))=\int_{}P(X=x)f(X=x)dx$
・分散
　$V(f(X))=E\left( \Big(f(X=x)-E(f(x))\Big)^2\right)=E(f(X)^2)-\Big(E(f(X)) \Big)^2$
・共分散
　２つのデータの相関度：正だと正の相関、負だと負の相関、0だと無関係
　$Cov(f(X),g(Y))=E\bigg( \Big(f(X=x)-E(f(X)) \Big) \Big( g(Y=y)-E(g(Y))  \Big) \bigg)\\
=E\Big(f(X=x)g(Y=y) \Big)-E\Big(f(X=x)\Big)E\Big(g(Y=y)\Big)$
・標準偏差：分散の平方根
・代表的な分布（数式いらない・・・？）
　ベルヌーイ分布：コインの裏表のような２クラスのどちらかの分布
　マルチヌーイ（カテゴリカル）分布：サイコロのような多クラスの分布
　二項分布：ベルヌーイ分布の多試行版
　ガウス分布：山型の分布。データがわからないときはとりあえずこの分布と仮定
・推定：標本から母集団の特性（平均値等のパラメータ）を推測
・推定量：計算方法など関数のこと
　推定値：実際に出た数値　$hat{\theta}
・標本分散：サンプル数が少ないと本来の分散より小さくなる

$$\frac{1}{n}\sum_{i=1}^n (x_i-\bar{x})^2$$
　不変分散：サンプル数に応じて補正

$$\frac{n}{n-1}\times\frac{1}{n}\sum_{i=1}^n (x_i-\bar{x})^2=\frac{1}{n-1}\sum_{i=1}^n (x_i-\bar{x})^2$$

第３章　情報科学

　感覚的につかみにくいので繰り返し確認が必要

・自己情報量
　$$-\log P(x)=\log W(x)$$
　対数の底が2：単位はビット(bit)　　　対数の底がe：単位は(nat)
・シャノンエントロピー：自己情報量の期待値
$$H(x)=E(I(x))=-E(\log(P(x)))=-\sum_{}P(x)\log P(x)$$
・カルバック・ライブラー　ダイバージェンス：二つの確率分布の類似性を表す（＊共分散でも似た話あった）
$$D_{KL}(P\, ||Q)=E_{X\sim P}\left[\log\frac{P(x)}{Q(x)}\right]=E_{X\sim P}\left[\log P(x)-\log Q(x) \right]$$
・交差エントロピー
$$H(P,Q)=-\sum_{x}P(x)\log Q(x)$$