OmniAICreator/Qiita-1.07M huggingface dataset:
【G検定対策】トピックモデル (topic model)

# トピックモデル (topic model) とは
機械学習(教師なし学習)の**分類**手法で，k-means法やウォード法と異なり，**複数のクラスタへデータを分類**する特徴をもつ．

### 潜在的ディリクレ配分法 (latent Dirichlet allocation / LDA)
トピックごとの単語の分布，文章ごとのトピック分布をディリクレ分布に従うと仮定する手法

### LSI
単語ベクトルの圧縮を特異値分解を用いて行う手法．

# 見るべき解説
https://www.albert2005.co.jp/knowledge/machine_learning/topic_model/about_topic_model#:~:text=%E3%83%88%E3%83%94%E3%83%83%E3%82%AF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E3%81%AF%E3%80%81%E6%96%87%E6%9B%B8,%E6%84%8F%E5%91%B3%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

https://www.nico-soda.jp/blog/post/20210121_000096.html

# 数式を交えた解説動画
https://www.youtube.com/watch?v=PZOeZ9CTs2E

https://www.youtube.com/watch?v=UxN40c_VbZo

https://www.youtube.com/watch?v=ZeONz_sDZ8k

# ハンズオンによる説明動画
https://www.youtube.com/watch?v=ZaiNVE0MlTk
【G検定対策】協調フィルタリング (collaborate filtering)

# 協調フィルタリング (collaborate filtering) とは
機械学習(教師なし学習)の手法でレコメンデーション(recommendation)に用いられる手法の1つ．

### コールドスタート問題
事前にある程度の参考てきるデータがない限り，レコメンデーションを行うことができないこと．例えば，ECサイトで対象のユーザと似た"他のユーザ"の購買履歴から，商品を推薦するためには，**"他のユーザ"の情報が必要である**ということ．

### コンテンツベースフィルタリング (content-based filtering)
コールドスタート問題を回避するため，例えば商品側に特徴量を付与することで，特徴が似ている商品を推薦するという手法．しかし必ずしも**コンテンツベースフィルタリングが優れているというわけではない．**


# 見るべき解説動画
https://www.youtube.com/watch?v=Ex1Md9dZuE8

https://www.youtube.com/watch?v=btYruKIGPss

https://www.youtube.com/watch?v=rPKWYwCV724

https://www.youtube.com/watch?v=R2KBQYm9dt0

# ハンズオンによる説明
https://www.youtube.com/watch?v=KDikpKoIDLo

https://www.youtube.com/watch?v=2ap29D4_wV0

https://www.youtube.com/watch?v=8tIYpybe0Tg
【G検定対策】主成分分析 (Principal Component Analysis / PCA)

# 主成分分析 (PCA)とは
機械学習(教師なし学習)で，データの相関を分析することでデータの構造を掴む**次元圧縮**の手法の1つ．

> **次元圧縮**とは 
データの特徴量の数が多い場合に，相関を持つ多数の特徴量から，データの情報を失わない程度に次元を低くし，相関のない少量の特徴量へ圧縮すること．

ここで得られる少数の特徴量を**主成分**という．

> **次元圧縮**(dimentionality redution)のメリット
> - 学習にかかる時間を減らす．
> - データを可視化することができる．

### 主成分回帰 (PCR / Principal Component Regression)
**主成分**分析と**回帰**分析を合わせた手法．主成分分析で特徴量を削減した後，回帰分析(主に最小２重回帰のような線形回帰)を行う．

:::note warn
しかし，コロナ下で聞かれるようになったPCR検査は，正式名称「ポリメラーゼ連鎖反応」（**P**olymerase **C**hain **R**eaction）の略でウイルス等の遺伝子（DNA：デオキシリボ核酸）を増幅させて検出する技術のことである．

参照：[PCR検査ってどんな検査？](https://www.tachikawa-hosp.gr.jp/kenko-column/pcrkensa.html)

:::

---

### 特異値分解(Singular Value Decomposition / SVD)
ある行列を複数の行列の積で表現する行列分解の１つ．
cf )  **多次元尺度構成法** (Multi-Dimensional Scaling / **MDS**)

### t-SNE (t-distributed Stochastic Neighbor Embedding)
可視化に用いられる次元圧縮の手法

# 見るべき解説動画
https://www.youtube.com/watch?v=5uEp2g35qEU

https://www.youtube.com/watch?v=mMmTHoZKWTI

https://www.youtube.com/watch?v=wgFWZFAe00M

# 数式を交えた解説動画
ハンズオンもあり

https://www.youtube.com/watch?v=4FUIH4cRLHI

# ハンズオンによる説明
https://www.youtube.com/watch?v=9RajodK4ZFQ
tkinterのウィンドウを閉じても処理が終わらないときの対処法

# はじめに
pulpを用いて最適化処理をした結果([前記事参照](https://qiita.com/mmura001/items/a826fcc89da8ae575cac))をtkinterで表示させるプログラムを作成していました。
その際にtkinterのウィンドウを閉じるボタンを押下しても処理が止まらない現象が生じました。

# 対処法
- [以下記事](https://www.javaer101.com/ja/article/45163551.html)の通りにしたところ解消しました。
- 内容は上記とほぼ同じですが、lambdaを用いた運用にすることで関数として呼び出すことが可能です。
- 備忘録も兼ねて記します。

# サンプルコード

```python:python(対処前)
import tkinter as tk

def show_graph(a,b):
    root = tk.Tk()
    root.title("Optimization Result Graph")
    root.geometry("800x600")   

    ------ここは結果をグラフ表示するコード部分のため割愛-------

    root.mainloop()

```

- 関数quit_meを追記します。

```python:quit_me(root_window)
def quit_me(root_window):
        root_window.quit()
        root_window.destroy()
```

- show_graph3行目へroot.protocol("WM_DELETE_WINDOW", lambda :quit_me(root))を追記します。
- root.protocol("WM_DELETE_WINDOW",quit_me(root))とするとエラーを吐くので、lambdaを使用します。

```python:python(対処後)
import tkinter as tk

def quit_me(root_window):
        root_window.quit()
        root_window.destroy()

def show_graph(a,b):
    root = tk.Tk()
    root.protocol("WM_DELETE_WINDOW", lambda :quit_me(root))
    root.title("Optimization Result Graph")
    root.geometry("800x600")   

    ------ここは結果をグラフ表示するコード部分のため割愛-------

    root.mainloop()

```
ウィンドウを閉じると処理が完了するようになりました。

# 参考
- [tkinterウィンドウを閉じてもPythonプログラムが終了しない](https://www.javaer101.com/ja/article/45163551.html)
UML概要

## UMLとは
　ソフトウェアを形式化するための統一的なモデリング言語。
　システム化の対象を、図を使って様々な表現で可視化する。

・目的
　図を用いて視覚的に表現する
・メリット
　視覚的に仕様が理解、明確化される
　関係者間の認識齟齬を無くす
　言語間の認識齟齬を無くす（特にオフショア）

### UMLモデル図の種類
以下の13種類ある
・クラス図
・オブジェクト図
・パッケージ図
・合成構造図（コンポジット構造図）
・コンポーネント図
・配置図
・ユースケース図
・アクティビティ図
・シーケンス図
・コミュニケーション図
・相互作用概要図
・タイミング図
・ステートマシン図

### 各図の体系
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1308027/fd190138-da31-1979-faf5-1ebfcb34f8da.png)

## 開発工程毎に利用するUMLモデル図
UMLはプロジェクトの主に上流工程で利用する。
その為、実装（実際の開発、プログラミング）以降では通常利用しない。

1.要求分析
　ユースケース図、　アクティビティ図
2.分析
　クラス図、シーケンス図、コミュニケーション図、
　ステートマシン図、オブジェクト図、相互作用概要図
3.設計
　クラス図、シーケンス図、コミュニケーション図、ステートマシン図、
　アクティビティ図、オブジェクト図、コンポーネント図、配置図、
　相互作用概要図、合成構造図、タイミング図、パッケージ図
4.実装
5.テスト

## 履歴
2022/3/4　作成
AtCoder(Algorithm) 入水振り返り

# 要約

競技プログラミングを真面目にやるには才能がないと思い適当にやっていたが、
GitHubの芝生やしの道具として使ってみたら意外と面白かったし入水までは行けた。

※1「競技プログラミング」を「AtCoderのコンテスト」のように書いている箇所があります。
※2 学んだアルゴリズムの紹介などはありません。


# 競技プログラミングとの馴れ初め

- 知ったきっかけ
    - 大学院の研究室同期達がコンテスト明けの平日に事後検証会をしていた
- 参加したきっかけ
    - Rustを使う題材が欲しかった


# 不真面目参加期（2019/04〜2020/05)

初期は以下の理由でコンテストに不真面目だった。

- 競技プログラミングの面白さが分からない
- 研究、就活、新生活が忙しく、競技プログラミングを優先する理由がない
- Rustに慣れてなくて書きにくく、入力を楽に受け取るマクロを毎回コピペするのも面倒

不真面目な行いの例

- コンテストの時間ギリギリに参加してA問題だけ解く（他の人の成績向上に繋がると思っていた）
- B問題まで解いたら解散（C問題は解けないと思っていた）
- 競技プログラミングとは無関係な動画を見ながらやる（パフォを求めてないので集中する必要がない）

# 転機（2020/05）

GitHubの芝生がたくさん生えているアカウントはかっこいいなあ。

**毎日競技プログラミングの問題を解いてcommitしたら、GitHubの芝生をめっちゃ生やせる！！**
**毎日やるからには真面目に参加するか！！！！！！！！！！**


# 真面目参加期（2020/05〜)

古いABCから灰色・茶色Diffの問題を毎日1～2問解いてcommitしてpush。
虚無と呼ばれることもあるが、楽に草を生やせるのでありがたかった。

灰色・茶色が埋まったら緑色を埋めるように解いてcommitしてpush。

並行してコンテストに出来るだけ参加したら入水できた。

![g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186959/db37fc80-56cf-5d0d-dab1-70b833a9c8a6.png)

上から [AtCoder(Algorithm)のコンテスト実績](https://atcoder.jp/users/tatarabako)・[AtCoder Problems
のProgress Charts(Daily Effort)](https://kenkoooo.com/atcoder/#/user/tatarabako?userPageTab=Progress+Charts)・[AtCoder Performances](https://atcoderapps.herokuapp.com/atcoderperformances/show_graph/?username=tatarabako&rivalname=&since=2019-04-06&until=2022-02-27) の画像です。

- 芝生やし初期の緑問題は解説ACをしていたはず
- 2021年10月辺りは土曜出勤があった時期で、コンテストに参加する気力がなかった
- 問題の復習や典型90問を一切やっていないので、経験値で殴って入水しただけのように感じる


# 競技プログラミングの良さ

- 使用している言語（Rust）の理解が深まる
    - `std::collections::*` のデータ構造とメソッドに詳しくなれる
    - 他人の提出やドキュメントから良い書き方やメソッドを知れる
    - C++で書かれた実装をコンパイラと協力しながらRustに変換できるようになるかもしれない
    - 慣れたらコンパイラに怒られることなく書ける
- 学びになる
    - 色々な問題やアルゴリズムを知ることができる
    - 色々な問題を解くことができるようになる
    - 公式以外の解説が沢山ある
    - 解説が分からなくても他人の提出を見れば大抵どうにかなる
- 競技として楽しい
    - 他人が解けない問題を自分が解けることがある
    - 早解きだけでもレーティングを上げられる
    - 問題が解けなかったら、ほぼ自分のせいにできる（稀に嘘解法で更新されていく順位表を眺めます）
    - 解法が思いつかなくても、類似問題とその解説を見つけられたらACできることがある
- 色々な人がいて楽しい
    - 人の数だけ様々な思いや振る舞いを観測できます


# 今後について

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186959/d7fafa46-8e0d-34fa-71c1-ea26a483f52c.png)

**GitHubの芝生やしのために**、多く残っている緑色・水色の問題を1日1問ペースで解いていきたい。
緑から水までに1年近くかかったので、3年以内に入青できたら嬉しい。
Envaderでtouchコマンドに触れてみる✋

突然ですが、皆さん、touchコマンドって知っていますか？
この記事は、touchコマンドがどういうものなのかをザックリと紹介する目的で作成しました。

この記事は、Envaderというサイトの[Linux基礎コース](https://envader.plus/courses)にあるこちらのコースを参考に作りました

https://envader.plus/course/1/scenario/1005

### touch（タッチ）コマンドの使い方は大きく分けて二つあります
---

```bash
## 新しい空のファイルを作る
touch apple.txt

## apple.txtのタイムスタンプを2022年3月3日21時30分15秒に変更する
touch -t 202203032130.15 apple.txt
```

### そもそもtouchコマンドって？
---

touchコマンドの役割は、大きく分けると以下の二種類になります。

1.  新しい空のファイルを作る

1. 既存のファイルのタイムスタンプを変更

新しい空のファイルというのは、何かを入れるための入れ物だと思ってください

なぜファイルが必要なのかは、例えで見ると分かりやすいでしょう。

リンゴが10個あったとします。そのリンゴを入れる箱としてどちらが好ましいでしょうか？

次の3つから選んでください。

1. リンゴと書いてある箱
2. みかんと書いてある箱
3. フルーツバスケット

- 正解は...
    
    １です！
    
    フルーツバスケットを選んで頂いた方には、個人的には、正解をあげたいですが、私と皆様が混乱しないように、今回は１とさせてください！ｗ
    

このように、中にどんなものが入っているのか？分かりやすく分類するというのがファイルを作る上で大事になります。

~~リンゴと書いてある箱なのに,みかんやにんじんが入っているというような光景は八百屋さんだけにしましょうｗ~~

これでファイルが必要な理由とファイルの作り方はザックリおさえていただけたかと思います！

次は、タイムスタンプについて見ていきましょう

### タイムスタンプとはなんなのか？
---

タイムスタンプは、日時情報を表します。色々と種類はあるのですがここでは

「何が、いつ作成されたものなのか？」を表すものだと思ってください。

そもそも、なぜタイムスタンプがあるのか？

それは、ファイルの中身を変更した時などに更新日時を示すためだったり、セキュリティ面での完全性を上げるため等の理由があります。

例

```bash
## apple.txtのタイムスタンプを2022年3月3日21時30分15秒に変更する
touch -t 202203032130.15 apple.txt
```

どのようにタイムスタンプが作られるのか？をコマンドを分解して見ていきましょう

touch -t　→　タイムスタンプを変更するよ〜

202203032130.15 　→　変更内容は2022年3月3日21時30分15秒にするよ〜

apple.txt 　→　変更する対象のファイルはapple.txtだよ〜

という風になります。

もっと短くすると

[touch　変更する日時　対象となるファイル]　となります。

これで、touchコマンドを使った「空のファイルの作り方」と

「既存のファイルのタイムスタンプの変更の仕方」はバッチリおさえられたと思います。

### おわりに
---

いかがでしたか？おさらいを含めて、問題を出題して終わろうと思います！

1. touchはなんと読みますか？

1. touchコマンドは大きく分けて二つの事ができます。それは何ですか？１つ答えてください

```bash
〜解答欄〜
```

### 雑感

今回はtouchコマンドを学びましたが、Linuxコマンドの数はもっと多いので、更に学習を続けていきたいと思いました。
他にも色々とコースがあるそうなので、触ってみようと思います。

https://envader.plus/
[Codeigter4 Tips] Modelを拡張して findColumn($fieldName) かつ first() の値を取得する

[以前作成した MyModel.php](https://qiita.com/bananacoffee/items/1b9b56ce541174a3fb7d#%E3%81%A4%E3%81%BE%E3%82%8Amodel%E3%81%AB-getcompiledselect-%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E3%82%84%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84)  を活用して、**findColumn($fieldName) かつ first()** の値、つまり、**最初の結果行の特定カラムの値をダイレクトに取得** してみる

## プログラム

MyModelの作り方、継承の仕方はこちらから
[[CodeIgniter4 Tips] getCompiledSelect で useSoftDelete が効くようにする](https://qiita.com/bananacoffee/items/1b9b56ce541174a3fb7d#%E3%81%A4%E3%81%BE%E3%82%8Amodel%E3%81%AB-getcompiledselect-%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E3%82%84%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84)

```php
/**
 * findColumn($fieldName) かつ first() の値を取得する
 *
 * @param string fieldName
 * @return mixed 結果の値
 */
public function firstColumn($fieldName)
{
	$ret = $this->findColumn($fieldName);
	if ($ret === null) {
		return $ret;
	}
	return $ret[0];
}
```

やっていることは何ということはない。

1. `firstColumn($fieldName)` で特定カラムのみの結果を取得する
1. 結果なし（null）だった場合はそのまま返却
1. 結果ありの場合は1行目の値を返却

## 使い道

- 特定の条件でDBに値が存在しているかのチェック（祝日チェックとか）
- 入力値や演算結果とDBの値で上書きするとか
- データの初期値にするとか

ただし、見ての通り都度都度クエリが発行されるので重いループ内での利用は控えたほうが良い。
基本的には予めもっと広い範囲でDBから取得しておいて配列なりオブジェクトに入れて探索する方が効率は良いと思われるが、当プログラムの方が全体的な見通しは良くなりそう。
PDO エラー　Call to a member function rowCount() on null  参考サイト

https://wakaranai.hatenablog.com/entry/2015/04/20/153550


PDOでselectを実行と同時にselectされた数をrowCountでカウントする際、

レコードがnullだと

Fatal error: Call to a member function rowCount() on null

とエラーが返される

```index.php
$sql =  "SELECT * FROM table";
$resolt = $pdo->query($sql);
$entry=$resolt->rowCount();

```

```.log
PHP Fatal error:  Uncaught Error: Call to a member function rowCount() on null in /var/www/html/index.php:51
```

`if`文で`$entry`が`empty`ではない場合に`rowCount`するように修正する。

```index.php
$sql =  "SELECT * FROM table";
$resolt = $pdo->query($sql);
if(!empty($resolt)){$entry=$resolt->rowCount();}
```

成功！！
Mac のキーボードショートカットを改善し Paste(⌘+V) を Paste and Match Style 相当にする

# Mac のキーボードショートカットによる貼り付けは2種類ある

スタイルを{持ち込む/持ち込まない}の2種類の貼り付け方法が選択できます。

1. Paste(⌘V)
    - 元の文書のスタイルを維持したままペースト
    - こちらがデフォルト
2. Paste and Match Style (⌥⇧⌘V)
    - 今の文章のスタイルに合わせてペースト(≒ プレーンテキストでペースト)
    - 両手操作が必要。普段遣いはムリ

# ⌘V が Paste and Match Style になればもっと良くなる 

今の僕は、Adobeツールに囲まれた働き方ではなく、IDEやエディタ主体のエンジニア的な働きをしているため「⌘V で Paste and Match Style できたら最高!」って感じです。 

> 個人差があります。コンサル的な働き方をする場合は、おそらく従来どおりの設定のほうがよいでしょう。

# 設定して行きます

🍎 > System Preferences > Keyboard > Shortcuts > App Shortcut > All Application を選択し。[+] ボタンをクリックします。

ダイアログの Menu Title に "Paste and Match Style" と入力し、Keyboard Shortcut に ⌘V を入力します。
> Mac OS の設定で日本語をメインに使用している人は
> "Paste and Match Style" の代わりに
> "ペーストしてスタイルを合わせる" と入力します。

![Screen Shot 2022-03-04 at 21.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8751/552e231a-b98c-9d8d-3bdf-9c1795553a66.png)

![Screen Shot 2022-03-04 at 21.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8751/234fc953-72be-5a22-5797-cc5cca6ac781.png)

# 出来ました!

これで ⌘V が Paste and Match Style になりました!

Webサイトから文字列をコピペしてきても、リンクがついたままになったり、変なスタイルが引き継がれたりしません!

# 昔の Paste はもうできないの?

わかります。そういう時もありますよね。
その場合は、コンテキストメニューから Paste(貼り付け) を実行してください。こちらはこれまで通りに、スタイル付きのペースト機能が維持されています。

以下は、⌘V を "Paste and Match Style" に置換した状態で、Google Sheet の A1 セルの内容を GMail に貼り付けた際の振る舞いの例です。

![Screen Shot 2022-03-04 at 21.45.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8751/7439d47b-8b26-acf0-cd0b-c337b207e773.png)


- ⌘V が "Paste" から "Paste and Match Style" に置換されている場合は、上段のようなプレーンテキストとして貼り付けられます
    - さらにその状態で、「やっぱり今回はスタイルも持ち込みたい」となった場合は、コンテキストメニューから Paste を実行してください。下段のようにスタイル付きのテキストとして貼り付けられます

<!--
![Screen Shot 2022-04-07 at 4.52.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8751/dc3f3d54-6d26-1fcd-3251-65d80ff18b70.png)
-->

<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8751/dc3f3d54-6d26-1fcd-3251-65d80ff18b70.png">

# 特定のアプリでコピペがうまくできなくなったよ?

何事も良い側面ばかりではないのだ。という事ですね。トレードオフがあります。

- Google Slide で、⌘C + ⌘V しても図形オブジェクトを貼り付けできなくなったよ?
    - ⌘V する代わりに、コンテキストメニューから Paste を実行してください
【G検定対策】強化学習 概要

# 強化学習とは
エージェントが収益を最大化するような行動の選択を繰り返す学習．

# 頻出単語

|用語|意味|
|:--|:--|
|エージェント|ある環境で動くプレイヤー|
|状態|エージェントが置かれている状況| 
|行動|エージェントが取る行動| 
|収益|エージェントが行動することによって得られる評価値|
|方策 (policy)|ある状態の時，取りうる行動の選択肢及びどの行動を取るべきか示す関数|
|ステップ|状態，行動，報酬のやり取りを進める時刻の区切りのこと|
|エポック||
|活用|現在知っている情報の中から報酬が最大となる行動を選ぶこと．|
|探索|現在知っている情報以外の情報を獲得するために行動を選ぶこと．|
|Deep Q-Network (DQN)|価値観数の計算を近似計算するディープニューラルネットワーク．DeepMind社が開発．DQNを用いる強化学習を，深層強化学習とよぶ．|

### バンディットアルゴリズム (bandit algorithm)
**ε-greedy方策**(epsilon-greedy policy) 
報酬が最大となる行動を選択(活用)するが，一定確率でεで探索する(= ランダムな行動を選択する)というもの．

**UCB方策**(upper-confidence bound policy)
複数の行動に対してスコアを計算し，スコアが最大な行動を選択するというもの．


参照：
[ALBERT Official Blog バンディットアルゴリズム基本編](https://blog.albert2005.co.jp/2017/01/23/%E3%83%90%E3%83%B3%E3%83%87%E3%82%A3%E3%83%83%E3%83%88%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%80%80%E5%9F%BA%E6%9C%AC%E7%B7%A8/)


### マルコフ決定過程 (Markov decision process)
次のステップの状態は，現在の状態にのみ依存するという**マルコフ性** を仮定したモデルのこと．

### 価値関数，Q値
エージェントの状態や行動の価値が最大となるような学習を将来的に得られる収益の期待値を示す関数． **Q値(Q-value)** ともよぶ．Q値を最適化する手法として，**Q学習** や **SARSA** などが挙げられる．

状態価値関数と，行動価値関数が存在するが，基本的には行動価値関数のことを指す．状態や行動の「価値」を設定し，その価値が最大となれば，強化学習の目的である，報酬が最大となるよう最適な方策を選択できるようになるのでは?という考え方が根底にある．

### 方策勾配法
方策を決定する関数のパラメータを，累積報酬の期待値が最大となるように学習する手法のこと．行動の選択肢が大量にある場合の課題で用いられる．

**REINFORCE**
方策勾配ベースの具体的な手法の1つ．

**Actor-Critic**
価値関数ベースと方策勾配ベースのアプローチの複合形．行動を決めるActorと，方策を評価するCriticから成り立つ．

**A3C** (Asynchronous Advantage Actor-Critic)
Actor-Criticの応用形．

# 見るべき解説動画
https://www.youtube.com/watch?v=kSIu8bJBNAw

https://www.youtube.com/watch?v=K1telr0cklk

# 数式を交えた解説
https://kikaben.com/g-reinforcement-learning/

https://www.youtube.com/watch?v=s0_WuACWOzU


Q値についての説明で詳しく尺が設けられている．

https://www.youtube.com/watch?v=aKHXXgAo_rA


深層強化学習について

https://www.youtube.com/watch?v=LU4M6qgJsug
【discord.js v13】登録したslash commandを削除する

# 概要
[discord.js でスラッシュコマンド（Slash commands）を使う](https://qiita.com/gaato/items/55b32bc4777905ac162a)
これを見ながら適当にサンプルコマンドを作成して
「ほーんこんな感じで作れるんか、で、削除どうすんの？？？？」
って小一時間ハマった

Googleで「discordjs slash command 削除」とかで検索かけたら1ヶ月くらい無回答で放置されてるteratailが出てきて涙を流したので、メモ程度に残しておく

# 消し方
``` javascript
// GUILD_IDはdiscordのサーバアイコン右クリ→IDをコピーで取れる
const guild = client.guilds.cache.get(GUILD_ID);

// こいつで全削除
guild.commands.set([])
  .then(console.log)
  .catch(console.error);
```

# 参考
[discord.js 公式ドキュメント](https://discord.js.org/#/docs/discord.js/stable/class/ApplicationCommandManager?scrollTo=set)
.deleteの箇所読みながらこれ一括で消せないのかなーとか思ってたら.setの下にちっちゃく書かれてた
中途半端に読むのは良くないッスね
小道具：固定小数点を10進文字列にする

```python:Python
# x=整数(正を想定), b=小数部のビット数, p=小数点以下の桁数【丸めなし、切り捨て】
# p=-1 は b 桁
# p=0 は int(b * 0.301) 桁
# (p > 0) は p 桁
fixdec = (lambda x, b, p=0: (lambda x, b, p, f: f(x >> b, x & ((1 << b) - 1), b, p))
          (x, b, (b, int(b * 0.301), p)[min(2, p + 1)],
           lambda h, l, b, p: (('%d.' % h) + ('%d' % (((l | (1 << b)) * (10**p)) >> b))[1:])))
```

```python:テスト
>>> for p in [0, 32, -1]: print(fixdec(1, 64, p))                                               ... 
0.0000000000000000000
0.00000000000000000005421010862427
0.0000000000000000000542101086242752217003726400434970855712890625
>>> for p in [0, 48, -1]: print(fixdec(1, 96, p))        
... 
0.0000000000000000000000000000
0.000000000000000000000000000012621774483536188886
0.000000000000000000000000000012621774483536188886587657044524579674771302961744368076324462890625
```
Pleasanter1.3 を docker で構築してみた。


# 1.3の変更点
・フレームワークが.NET6に変更された
・pleasanterのgithub内のソースから、cmdnetcore フォルダが削除された。

# 作成物
ということで、zipファイルからサービスが立ち上がるように、
docker-composeを作成しました
https://github.com/k-is-k/docker-pleasanter

# 使い方
上記githubから、ダウンロードし、
```
docker-compose build
docker-compose up -d
```
で起動します。

# その他
`pleasanter/parameters/init_send/`
内に、App_Data/Parameters/内の、カスタムhtmlファイルや、設定jsonファイルを入れた状態でビルドすることで
設定を過去バージョンの設定を流用できます。

また、pg_trgmをpleasanterのデータベースに付与したことで、
pleasanter右上のサイト内全体の検索機能が動くようにもなりました。


# 参考
この記事は@yamada28goさんの記事を参考に制作しました。大変ありがとうございました。
https://qiita.com/yamada28go/items/b9e6acdb4cca9572c7a6
VRChatがOSCに対応したので、M5StackのUIFLowでライブラリなしのOSC通信してみた

## 前回

https://qiita.com/ono-honeycomb/items/f0bd76f44df704969be1

VRChatでOSCが使えるまでの設定をしておきます

## 今回

Node.jsで同じPC内でVRChat内のアバターをジャンプさせることができましたが、今回はM5StackCore2でやりますので、必然的に別マシンから遠隔(同LAN内)操作になります

さらに、M5StackでOSC通信しようとするとArduinoでのプログラミングが必要になりますが、M5StackのUIFlowを使ってOSC通信を目指してみます

OSC通信のフォーマットとかもちょっと学べました

### できた様子

[![Image from Gyazo](https://i.gyazo.com/c9bbb31263fd31ddce148c39a4640fd8.gif)](https://gyazo.com/c9bbb31263fd31ddce148c39a4640fd8)

* M5StackCore2の左ボタンでTrueを送り、ジャンプボタンを押し込んだような動作をさせ、アバターが実際にジャンプ
* M5StackCore2の真ん中ボタンでFalseを送り、ジャンプボタンを離したような動作をさせることによって、もう一度ジャンプボタンを押して、ジャンプできるようにする（押し込んだまんまだともう一度押せないので）

## UIFlow

[![Image from Gyazo](https://i.gyazo.com/6c401750a17d5d22e597e246fe0995ea.png)](https://gyazo.com/6c401750a17d5d22e597e246fe0995ea)
Scipyで多段のフィルタをかけ合わせる




## 背景

ScipyではMATLAB-likeにフィルタを設計するコマンド群が存在します。
計算結果は分母と分子の係数として出てくるのですが、これらを多段に重ねた結果を取得したい場合の対処法をメモします。

https://docs.scipy.org/doc/scipy/reference/signal.html#matlab-style-iir-filter-design

## 実装

numpyのpoly1dを使った多項式計算で簡単にフィルタの掛け合わせが実現できます。
公式の関数がぱっと見当たらなかったので作りましたが、無い訳は無い気がしているので見つけたら追記します。



なお、この方式だと**極ゼロ相殺の判定ができない**ので自分で設計した覚えのないフィルタにこれを使用するのは推奨しません。

```py
import scipy
import numpy as np

def series_filter(b_s,a_s):
    a = np.poly1d([1])
    b = np.poly1d([1])
    
    for ai, bi in zip(a_s,b_s):
        a *=  np.poly1d(ai)
        a *=  np.poly1d(bi)
    return b.coeffs, a.coeffs
```

## 使用例


例えばLowpassとノッチを組み合わせるなどすると下記のような離散フィルタを設計できます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188863/454a85d7-8f1e-0642-42f3-4ffc358cc37c.png)

MATLABと同じ[freqzというコマンド](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.freqz.html)で上記の可視化ができるのでお試しあれ。

```py
import matplotlib.pyplot as plt

b1,a1 = scipy.signal.butter(2,10, btype='low',analog=False,fs=1000)
b2,a2 = scipy.signal.butter(2,[20,25], btype='bandstop',analog=False,fs=1000)

b,a = series_filter([b1,b2],[a1,a2])

## 可視化
w, h = signal.freqz(b,a,fs=1000)
fig = plt.figure()
ax1=fig.add_subplot(2,1,1)
ax1.set_title('Digital filter frequency response')
ax1.plot(w, 20 * np.log10(abs(h)), 'b')
ax1.set_ylabel('Amplitude [dB]', color='b')
ax1.set_xlabel('Frequency [rad/sample]')
ax1.grid()
ax1.set_xscale('log')
ax1.set_xlim([0.1,100])
angles = np.unwrap(np.angle(h))/np.pi * 180.0
ax2=fig.add_subplot(2,1,2)
ax2.plot(w, angles, 'g')
ax2.set_ylabel('Angle (deg)', color='g')
ax2.grid()
ax2.axis('tight')
ax2.set_xscale('log')
ax2.set_xlim([0.1,100])
plt.show()
```
インメモリDBとは

## 勉強前イメージ

メモリで動くDB？それともメモリが多いDB？

## 調査

### インメモリDB とは

データをメモリで上で格納するように設計されているデータベースになります。
すべてをメモリで動かすので、ストレージ上で構築するデータベースより高速な処理を行うことができます。
しかしメモリは電源を切るとデータが失われるので
シャットダウンの際や再起動、また定期的にストレージにデータを保存してデータの欠損がないようにされています。

従来のストレージに記録されるDBはオンディスクDBと呼びますが、
基本的にはDBはオンディスクなので、インメモリと比較する際に呼ばれることがほとんどです。

### AWSでのインメモリデータベース

- Amazon MemoryDB for Redis
- Amazon ElastiCache for Redis
- Memcached 用 Amazon ElastiCache

## 勉強後イメージ

今日はちょっと短め
メモリで動くDBだったな

## 参考

- [インメモリデータベースとは何ですか?](https://aws.amazon.com/jp/nosql/in-memory/)
- [インメモリデータベース 【in-memory database】 IMDB / メインメモリデータベース](https://e-words.jp/w/%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9.html)
S3のストレージクラス

# スタンダード
デフォルトで設定されているストレージクラス。
頻繁にアクセスされるデータ向け。
# スタンダード-IA
スタンダードクラスと同等の耐久性がある。
データの格納コストはスタンダードクラスと比較して安価。
アクセス頻度は低いが、重要度が高いデータ向け。
# One Zone-IA
ひとつのAZのみにデータを保存。
必要に応じてすぐに取り出したい場合に適用する。
重要度が低いデータ向け。
# Glacier
アーカイブを目的としたストレージ。
大容量のデータを安価に保管することができるが、アクセスに時間を要する。
# Glacisr Deep Archive
通常のGlacierよりさらにアクセス時間を要する。
取得時間に12時間許容されるデータ向け。
# Intelligent-Tiering
アクセス頻度に応じて、最も効率の良い階層へデータを保管。
VRChatでOSCパラメータの送受信を確認してみる

# はじめに
VRChatのアップデートによって、OSCでの送受信が出来るようになりました。
何番煎じかはわかりませんが、とりあえず触ってみたのでまとめていきます。
(通信部分等をすべて作成するわけではありません)

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [開発環境](#setup)
1. [Server側(VRC)](#VRC)
1. [Client側(PC側)](#PC)
1. [参考文献](#reference)
1. [アバターとの連携(Unity)](#unity)
1. [発展形:心臓の鳴動を描画してみる(WIP)](#takuya)

<a id="#setup"></a>
# 開発環境
・Windows10
・VRChat IK-Beta(2022/3/4時点)
・Javascript
・Node.js
・VisualStudioCode

<a id="#VRC"></a>
# Server側(VRC)
## VRC側からの受信データを見てみる
とりあえずProtokolをインストールします。
https://hexler.net/protokol

起動してOSCタブでPORTを9001番で接続、VRCでアバターを動かしてみると、![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567886/ac7ffd60-8b01-e485-43cb-1a6c060d1448.png)
この様にアバターの向き等の情報がパラメーターの値毎に受け取ることができます。
これはVRC側が出力しているOutputのパラメータになります。

## VRCゲーム内での設定
VRChatをBeta版で起動すると、Optionのメニューに[OSC]の項目が追加されます。![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567886/601b374c-3fcf-3756-f534-563a90263bdc.png)
EnabledをONにして、OSCDebug画面も表示させておくと、受信確認がスムーズに進みます。![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567886/898f1a94-020a-5ffc-2c2f-951c54b310d8.png)



<a id="#PC"></a>
# Client側(PC側)
まずはアバターとの連携等考えずに、VRCへパラメータを送ってみます。
```Send.js
const osc = require('node-osc');

const client = new osc.Client('127.0.0.1', 9000);
client.send('/avatar/parameters/Hoge', 1);
```
Nodeで実行して、VRCのOSC Debug画面を確認してみると...
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567886/495fda56-f3e4-682f-ee5e-047832b5fceb.png)
送信したデータが確認出来ました！
色々と複雑そうな気はしますが、ただ送信するだけであればこれでOKです。

<a id="#unity"></a>
# アバターとの連携(Unity)
上記でパラメータを一方的にVRCへ送りつけることは出来るようになりましたが、
ここからアバターのパラメータと紐づけを行う必要があります。
OSCが有効な状態で変更したアバターは、以下にOSC用のjsonファイルが追加されます。
\Users\[username]\AppData\LocalLow\VRChat\VRChat\OSC\[userID]\Avatars
ファイル内に以下パラメータを追加しておきます。
```avaterID.json
    {
      "name": "hoge",
      "input":{
        "address":"/avatar/parameters/hoge",
        "type":"Float"
      }
    }
```

Unity上では、まずはFXLayerのパラメータにFloat型で"Hoge"を追加します。
また連携したいアニメーションを作成し、以下の様に設定しておきます。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567886/0c4cf12f-ec72-00a4-0344-f5d0a928eeca.png)
ここで追加、MotionTimeに設定するパラメータの名称は、jsonファイルに設定したaddress内のパラメータ名と同一にしておきます。
同様に、ExpressionsParameterにも同名のFloat型のパラメータを作成しておきます。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567886/f4bc1353-d0a4-1b5e-656f-6d928af064d4.png)
ゲーム内のExpressionMenuから操作しないのであれば、これだけでOKです！


<a id="#reference"></a>
# 参考文献
- [公式リファレンス](https://hello.vrchat.com/blog/vrchat-osc-for-avatars)
- [MiBand5で心拍数表示](https://github.com/mkc1370/miband-heartrate-osc/releases/tag/2.2.0)
2022/3/3までに発売された主なfoldable端末の解像度まとめ

# 目的
foldable端末が増えたことによって
- 縦方向表示だが横方向に十分な描画領域のある端末  

が増えてきました。
今後、android開発においては端末のorientationだけでは適切な表示ができないケースが増えてくると想定されます。
現時点でどのように閾値を設定するかの考慮材料としてまとめてみます。
なお、
- 主に横方向折りたたみのもの
- 話題になったもの（主観

を中心にまとめました

# 一覧
|端末名|メーカー|見開き時解像度(縦x横)|折りたたみ時解像度(縦x横)|発売時期（凡そ）|公式ページ|
|---|---|---|---|---|---|
|Mate X|Huawei|2480 x 2200|2480 x 1149|2019年-月|---|
|Galaxy Fold|Samsung|2152 x 1536|1680 x 720|2019年10月25日|https://www.galaxymobile.jp/galaxy-fold/|
|Galaxy Z Fold2|Samsung|2208 x 1768|2260 x 816|2020年11月4日|https://www.galaxymobile.jp/galaxy-z-fold2/|
|Mate X2|Huawei|2480 x 2200|2700 x 1160|2021年2月25日|https://consumer.huawei.com/en/phones/mate-x2/|
|Galaxy Z Fold3 5G|Samsung|2208 x 1768|2268 x 832|2021年10月6日|https://www.galaxymobile.jp/galaxy-z-fold3-5g/|
|Find N|OPPO|1792 × 1920|1972 × 988|2021年12月23日|https://www.oppo.com/cn/smartphones/series-find-n/find-n/|

# 比率
見開き状態での比率(height/width)を計算すると、
- 最大：Galaxy Fold(1.40)
- 最小：Find N(0.93)

となりました

閉じた場合の比率(height/width)は
- 最大：Galaxy Z Fold2(2.77)
- Find N：Find N(2.00)

発売当初から縦長で話題のXperia1(3840x1644)でも`2.34`なので、折りたたみ状態だとかなり縦長であることがわかりますね。
Sequelizeでトランザクション処理を行う際のtransactionオプションの配置場所

## 初めに
Sequelizeでマネージドトランザクションを使用する際に、transactionオプションの配置場所がメソッドによって異なっていたので備忘録として投稿する。

結論として、Sequelizeのトランザクション処理に使用するtransactionオプションはcreate、updateのようなメソッドは第２引数に、その他のメソッドは第１引数に渡す必要がある。
理由は、create、updateのようなメソッドには更新するべき値を記載するが、その他のfindAll等のメソッドには更新するべき値がないため、その影響で引数の格納場所が異なっていると考えられる。
今回はupdateメソッドとfindAllメソッドを例にとって記載する。

## 環境
■ Sequelizeバージョン
3.30.4
■ 使用OS
Amazon Lunux 2
■ MySQLバージョン
5.7.35


## updateメソッド
 [Sequelizeを使用してトランザクション処理を行う](https://qiita.com/shintaro_secual/items/845651b23804ff41897b)
上記記事を参照いただきたいが、updateメソッドだと以下のような書き方で正常に動作する。


```js
User.update(
  { money: 500 },
  { where: {id: 1}, transaction: tx }
)
```

また更新する値を第１引数に記載している。

```js
 { money: 500 }
```

## findAllメソッド



findAllメソッドでは、updateメソッドの様に更新する値を記載していないため、第１引数にtransactionオプションを配置する。

```js
User.findAll(
  { where: {money: 500 }, transaction: tx }
);
```

findAllメソッドでtransactionオプションを第２引数に渡すと以下のようなエラーになる。

```js
User.findAll(
  { where: {money: 500 } },
  { transaction: tx });
```

```
Error: Please note that find* was refactored and uses only one options object from now on.
```

findAllメソッドだと分かりやすくエラーが出力されるが、findOneメソッドだとエラーが出力されない様なので注意が必要。

## 参考文献
[Sequeizeのトランザクションに関して](https://sequelize.org/master/manual/transactions.html)
【PHP】クラスのstatic(スタティック)はなぜ使うのか？

# ※staticをなぜ使うか？

インスタンスの生成を省略できる※他はわからん

```PHP 
<?php

class Food
{
    static $cat = "キャットフード";
    static $dog = "ドッグフード";
    static $bird = "パフ・ザ・フルーツ";
    
    static function cry($animal) {
        if($animal === 'cat') return self::$cat;
        if($animal === 'dog') return self::$dog;
        if($animal === 'bird') return self::$bird;
    }
}

echo "猫の餌：".Food::cry('cat');
echo PHP_EOL;
echo "犬の餌：".Food::cry('dog');
echo PHP_EOL;
echo "鳥の餌：".Food::cry('bird');

```

# 結果
```
猫の餌：キャットフード
犬の餌：ドッグフード
鳥の餌：パフ・ザ・フルーツ
```
【G検定対策】ウォード法 (Ward's method)，群平均法

# ウォード法 (Ward's method)とは
機械学習(**教師なし学習**)の**階層ありクラスタリング**手法の1つ．階層なしクラスタリング手法のk-means法から，さらに階層構造を求めるまで行う．

データ全体の中で，最も距離が近い2のデータを選び，それらを1つのクラスタにまとめる，という処理を繰り返すだけである．クラスタリングにおけるまとまりは樹形図のような階層構造で表すことができ，これを **デンドログラム(dendrogram)** という．デンドログラムをどの深さまでにするかにより，階層構造を分析するクラスタは変化する．
### 群平均法

# 見るべき解説動画
https://www.youtube.com/watch?v=M76gcTE98kQ

https://www.youtube.com/watch?v=PaDh55ilLqA

https://www.youtube.com/watch?v=irkOLAbYCwM

https://www.youtube.com/watch?v=OAGjrUQKDhE

https://www.youtube.com/watch?v=Yt5qUcv8BhE

# 数式を交えた解説動画
https://www.youtube.com/watch?v=8PC3doWnyCE

# ハンズオンによる説明
https://www.youtube.com/watch?v=lDsTkp5COqo

https://www.youtube.com/watch?v=I1YLk8pbs-Y
エクセルの条件付き書式の重複する値は１６文字まで見て判定してるっぽい

# Summary

エクセルの条件付き書式の重複する値で重複してないのに重複判定されるときがある

# 結論

１６文字までで重複判定している（と思う。。。⇒数値化できるもの限定？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149269/cf6e0b0c-7dc9-4692-8052-81ea5e58ebf7.png)

# 結論２

他の方法で重複値をだすようにする（たとえばピポットテーブルとか
【G検定対策】k-means法

# k-means法とは
機械学習(**教師なし学習**)の **階層なしクラスタリング**手法の1つ．**元のデータより，k個のクラスタ** (グループ構造) **に見出してまとめる**手法．クラスタ分析ともいう．k-NN法(教師あり学習)とは別．

1. データ全体のなかで，ランダムにクラスタの重心の代わりとなる点をk個生成
2. 1で生成したk個の点それぞれから近いデータを求め，クラスタを作成．
3. 各クラスタに属する各データの距離を求め，重心を求め直し，各データを一番近いクラスタ(重心)へ振り分け直す
4. 2と3を変化がなくなるまで繰り返す．

各クラスタがどういうものなのかを解釈するのは人間です．**教師なし学習** とは，一見散乱しているように見えるデータの特徴を掴むために行われ，散乱しているように見えるデータの規則や構造などを解釈する手助けとなります．

# 見るべき解説動画
https://www.youtube.com/watch?v=V4PN2tjEqA8

https://www.youtube.com/watch?v=ifVRVMV2Wpo

ヨビノリさんの解説なのに数式を使っていない動画

https://www.youtube.com/watch?v=8yptHd0JDlw

k-means++についても解説

https://www.youtube.com/watch?v=ff9xjGcNKX0


# 数式を交えた解説動画
ハンズオンもあり

https://www.youtube.com/watch?v=mmGj9qcFKAM

# ハンズオンによる説明
https://www.youtube.com/watch?v=wRXtnlUNNBo
Typescript勉強ノート#3_More on Functions

## はじめに
Typescriptを使いこなせるようになるためにドキュメントを読んで勉強する。
typescript Documentation: https://www.typescriptlang.org/docs/handbook/intro.html
自分用なのであるていど把握できていると思う部分はスキップしていく。

今回は、ドキュメントのMore on Functionsを参考にしてまとめる。
https://www.typescriptlang.org/docs/handbook/2/functions.html


## Construct Signatures
オブジェクト型にnew演算子使用して呼び出せる。
型定義ファイルで登場するらしい。（あまりわかってないのでわかってきたら追記）
```ts
type SomeConstructor = {
  new (s: string): {};
};
function fn(ctor: SomeConstructor) {
  return new ctor('hello');
}
class Fuga {
  name: string;
  constructor(name) {
    this.name = name;
  }
}
const ctor = Fuga;
console.log(fn(ctor)); // {naem:"hello"}
```

## Generic Functions
処理が同じで型だけ違う場合にany型ではなくちゃんと型付けできるようにする仕組み。
`T`という関数が実行されるまで未定の型を使うことを書く。
書く場所は引数の前に`<>`で囲む。

```ts
const firstElement = <T>(arr: T[]): T | undefined => {
  return arr[0];
};
const s = firstElement(["a", "b", "c"]);
const n = firstElement<number>([1, 3]);
// const n = firstElement<string>([1, 3]); これはタイプエラー
```

配列や文字列の長さを返すようにしたいときに、単にsample1のようにするとTは型が定まっていないため`'length' は型 'T'にはない`と言われる。そこで`extends`を使ってsample2のようにする。このようにすると、lengthのメソッドを持っている型のみを受け入れるようになる。同様にあるメソッドを使いたいときはこのように型を制限することで利用できる。

```ts: sample1
const longest = <T>(a: T, b: T) => { 
  if (a.length >= b.length) {
      ・・・
```


```ts: sample2
const longest = <T extends { length: number }>(a: T, b: T) => {
  if (a.length >= b.length) {
    return a;
  } else {
    return b;
  }
};

const longerArray = longest<number[]>([1, 2], [1, 2, 3]);
```

## Function Overloads
一番下には大本となる関数を記述する。その関数の上に異なる引数の関数を書くことで引数の条件を増やすことができる。

```ts
function fn(x: string, y: string): string;
function fn(x: number): string;
function fn(x: string | number, y?: string) {
  return "message";
}

fn("hoge", "fuga");
fn("hoge"); // error
fn(1);
```

## Rest Parameters and Arguments
### Rest parameters

`...`を使うと制限なく値を指定することができる。
また、1,2,3,4 で指定したものを[1,2,3,4]に変換してくれる。

```ts
const multiply = (n: number, ...m: number[]) => {
  return m.map((x) => n * x);
};
const a = multiply(10, 1, 2, 3, 4); // n->10 , m-> [1,2,3,4]
const b = multiply(10, [1, 2, 3, 4]); // error
```
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters

### Spread syntax 
`...`を使うと、[4,5,6] の配列を分割して4, 5, 6のようにできる。

```ts
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
arr1.push(...arr2); // arr1 -> [1,2,3,4,5,6]
```

オブジェクトの場合も一緒
```ts
interface Profile {
  name: string;
  age?: number;
}

const risa: Profile = {
  name: "risa",
  age: 20,
};

const show = (profile: Profile) => {
  console.log({ ...profile, like: "apple" }); // { name: 'risa', age: 20, like: 'apple' }
  console.log({ profile, like: "apple" }); // { profile: { name: 'risa', age: 20 }, like: 'apple' }
};

show(risa);
```

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

## おわり
次はObject Typeに進む！！

https://www.typescriptlang.org/docs/handbook/2/objects.html
レイアウト作成時に利用できるサンプルデータ

# 初めに
今回の主旨としては、レイアウト作成時に画像や名前といったサンプルのデータを入れておきたいけど、パッと代用できるものが出てくる様なものではないものに対して行う設定です

### やること
レイアウトを確認するのに、わざわざ関係のない画像を用意したり適当な文言を考えるのって少し面倒ですよね？

そんな時に使えるのが`tools:sample`です
これ、どういったものかというとAndroid側が用意したダミーのリソースを使うことができるんですね。
なので、画像や名前、日時などを勝手に当てはめてくれます
書き方はすごく簡単で

```xml
 <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:src="@tools:sample/backgrounds/scenic" />
```
これだけです
こうすることで下記の様に適当な画像を当てはめてくれます。
ただ、なぜか虫の画像ばかりなので苦手な方には厳しいかもしれませんね
![スクリーンショット 2022-03-04 18.13.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638092/72a7d88f-ae77-c521-146f-94ded2459e42.png)

他にも下記の様なものがサンプルデータとして置かれています

```
@tools:sample/full_names    @tools:sample/first_names と @tools:sample/last_names の組み合わせからランダムに生成されたフルネーム
@tools:sample/first_names   一般的な名前
@tools:sample/last_names    一般的な苗字
@tools:sample/cities    世界中の都市の名前.
@tools:sample/us_zipcodes   ランダムに生成された米国の郵便番号
@tools:sample/us_phones 	(800) 555-xxxx の形式でランダムに生成された電話番号
@tools:sample/lorem ラテン語を使用したプレースホルダ テキスト
@tools:sample/date/day_of_week  指定された形式でランダムに生成された日付と時刻。
@tools:sample/date/ddmmyy
@tools:sample/date/mmddyy
@tools:sample/date/hhmm
@tools:sample/date/hhmmss
@tools:sample/avatars   プロフィール アイコンとして使用できるベクター ドローアブル
@tools:sample/backgrounds/scenic    背景として使用できる画像
```

### 最後に
非常に便利ですが、意外と使われていないものが多いのでこの機会にどんどん使っていっていただけると備忘録として残した自分としても大変嬉しいことです
[Nuxt.js] Node.js 16 時代の Sass の利用方法

`Nuxt.js` での Sass(SCSS) の利用については毎回苦しめられるのですが、 `Node.js` バージョン 16 の環境でもひと癖あったのでメモします。

## 🏹 TL;DR
### 素直に Nuxt 3 使っとけ

公式でベータ版になった `Nuxt3` には、とくに設定などなく `Sass(SCSS)` を利用できる環境が備わっています。

抵抗がなければ `Nuxt 3` 使うのがベター。



### Nuxt 2 を使う場合

リリース済みのアプリなど `Nuxt 2` で `Sass(SCSS)` を利用しないと行けない場合は、次の手順です。

```shell
$ yarn add -D sass sass-loader@10
```

でインストールして、

```javascript:nuxt.config.js
export default {
  css: [ '~/assets/scss/style.scss' ],
}
```

ですね。



個人的には `fibers` 使いたいところなんですけど、こいつも `Node.js` 14 止まりなので、アップデートされたら記事もリライトするかもしれません。



## 💡 Node.js 14 環境では

`fibers` のことに触れたので、 `Node.js` 14 環境下の設定も書いておきます。

まずインストール。

```shell
$ yarn add -D sass fibers
```

※もし `node-sass` がある場合は次のコマンドで消しておきましょう

```shell
$ yarn remove node-sass
```

んでもって、 `nuxt.config.js` にこうですね。

```javascript:nuxt.config.js
import Sass from 'sass'
import Fiber from 'fibers'

export default {
  // any...
  build: {
    loaders: {
      scss: {
        implementation: Sass,
        sassOptions: {
          fiber: Fiber
        }
      }
    }
  }
}
```



## 🍟 まとめ

`Nuxt 2` での `Sass(SCSS)` の取り扱いって何かと厄介なイメージ。

やっぱり、**素直に `Nuxt 3` 使っとけ！**　ってことかな。
Rspec+FactoryBot導入メモ


## gemのインストール
下記のgemを追加して `bundle install` を実行する。
```rb:Gemfile
group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  # 以下必要に応じて追加する
  # 必要になったタイミングで追加で問題なし
  # gem 'faker' 名前やリージョンなど様々なダミーデータが使用できる
  # gem 'rubocop-rspec' rspecでrubocopを使用できる
  # gem 'rspec_junit_formatter' circleCIなどのCIツールで並列テストを効率的に実行するためのタイミングデータを作成してくれる
end
```

**注) factory_bot_railsをdevelopmentのgroupに含めないと、テスト実行時に下記エラーが発生する**
```plaintext:shell
An error occurred while loading ./spec/models/hoge_spec.rb.
Failure/Error: config.include FactoryBot::Syntax::Methods
```



## Rspec初期化
下記コマンドを実行。

```shell:shell
$ rails g rspec:install
      create .rspec
      create spec
      create spec/spec_helper.rb
      create spec/rails_helper.rb
```

Rspecの実行テストを行う。
```shell:shell
$ rspec
No examples found.

Finished in 0.00177 seconds (files took 0.47683 seconds to load)
0 examples, 0 failures
```

## Rspecの設定
### RAILS_ENVについて
puma.rbなどでRAILS_ENVが初期化されてしまっている場合spec_helperを修正する必要があるので、必要に応じて下記の箇所を修正する。
```rb:spec_helper.rb
ENV['RAILS_ENV'] ||= 'test' # 必要に応じて ||= を = に変更する
```


### 結果出力設定
Rspec実行時に `-f documentation` オプションを付与すると出力結果が整形されて見やすくなる。
spec_helperの下記部分のコメントアウトを外し、実行ファイルが一つの場合自動でdocumentationオプションが付与されるようにするのがオヌヌメ。
 
```rb:spec_helper.rb
  if config.files_to_run.one?
    # Use the documentation formatter for detailed output,
    # unless a formatter has already been configured
    # (e.g. via a command-line flag).
    config.default_formatter = "doc"
  end
```


## DBの設定
（未作成の場合）テスト用のDBを作成する。
`config/database.yml`のtest環境を正しく設定した後、コマンドを実行する。

```yml:database.yml
  default: &default
    ... # 略

  test:
    <<: *default
    database: test_application
```

```shell:shell
$ rake db:create
$ rake db:migrate RAILS_ENV=test
```

## FactoryBotの設定
Factory_botのメソッドを使用する際、クラス名を省略できるように
rails_helper.rbに設定を追記する。
```rb:rails_helper.rb
Rspec.configure do |config|
  ...

  # 下記設定の追加
  config.include FactoryBot::Syntax::Methods
end
```

### spec_helper.rb と rails_helper.rb の違い

<dl>
  <dt>spec_helper.rb</dt>
  <dd>railsに紐づかないテストを実行する際にも適用される。</dd>
  <dt>rails_helper.rb</dt>
  <dd>railsに紐づくテストのみに適用される。</dd>
</dl>

railsに紐づかないテストを書くことが基本的にないのでrails_helper.rbに追記する方針でおk。

## FactoryBotのファイル生成・設定
ファイル生成
```shell:shell
$ rails g factory_bot:model user
      create  spec/factories/users.rb
```
設定
```ruby:spec/factories/users.rb
FactoryBot.define do
  factory :user do
    sequence(:name) { |n| "NAME_#{n}" }
    age { 10 }
    gender { User.genders.values.first }

    trait :man do
      gender { User.genders[:man] }
    end

    trait :woman do
      gender { User.genders[:woman] }
    end
  end
end

```

## テストファイルの作成・設定
ファイル生成
```shell:shell
$ rails g rspec:model user
      create  spec/models/user_spec.rb
```

設定
```ruby:spec/models/user_spec.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  let!(:user) { create(:user, name: "taro") }

  describe "User#change_name" do
    context "12文字以下の場合" do
      let!(:after_name) { "ObiWanKenobi" }
      it "正しくnameが変更される" do
        user.change_name(after_name)
        expect(user.name).to eq after_name
      end
    end
  end

end

```
【G検定対策】自己回帰モデル (autoregressive model, ARモデル)

# 自己回帰モデル (autoregressive model, ARモデル)とは
機械学習(教師あり学習)の手法の1つで，一般的に回帰問題に適用される手法．時系列データを対象とするモデル．入力が複数種類ある場合を， **ベクトル自己回帰モデル(VARモデル)** と呼ぶ．

# 見るべき解説動画
数式が用いられているけれど，説明が多いので，数式アレルギーでも用いられた数式への理解が図れるかと思います．

https://www.youtube.com/watch?v=Fq73BS32a-8

# 数式を交えた解説動画
https://www.youtube.com/watch?v=KU4qE83hHtI

https://www.youtube.com/watch?v=d0EGcXZlpJ4

https://www.youtube.com/watch?v=P_204LIcsFk

https://www.youtube.com/watch?v=Ja7OZzu1s7w

# ハンズオンによる説明
https://www.youtube.com/watch?v=g_aPnS37-WA&t=10s

https://www.youtube.com/watch?v=aLyEQQ6_-gQ

https://www.youtube.com/watch?v=bLd9s9DtDbE

https://www.youtube.com/watch?v=y-XvMZq33c4

https://isolution.pro/t/machine-learning-with-python/regression-algorithms-overview/kaiki-arugorizumu-gaiyo

https://isolution.pro/t/artificial-intelligence-with-python/artificial-intelligence-with-python-analyzing-time-series-data/python-o-shiyoshita-ai-ji-keiretsu-de-ta-no-bunseki
【Automation Anywhere】フォルダの削除　- はじめてのAA

# 今日はこれを覚えよう！

ここではまずはシンプルにAutomation360でフォルダを削除する流れを押さえましょう。

# 作り方

[Botの作成画面を起動](https://qiita.com/IQ_Bocchi/items/27a23969bcb4917824ec)し、以下の手順でBotを作成します。

---
「アクションを検索」の入力欄をクリックし、「フォルダー」と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/9d57c62a-6ecf-280c-8df4-73862ff25bc5.png)

---
絞り込まれたアクションの中から、「フォルダー」パッケージの「削除」アクションを開始と終了の間にドラッグします。
その後、画面右側の「フォルダー」欄に、削除するフォルダ名を絶対パスで入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/10d942d2-793d-0339-b0f2-9b469f892fa8.png)

### -- Tips: 変数を使用したフォルダ削除 --
フォルダー作成のケースと同様に、削除するフォルダを文字列変数を使用して指定することも可能です。

まず事前に「変数を作成」画面から作成するフォルダパスを任意の文字列変数に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/bda0c136-64eb-db83-ce79-179cbf8dd8a6.png)
次に絞り込まれたアクションの中から、「フォルダー」パッケージの「削除」アクションを開始と終了の間にドラッグします。
その後、画面右側の「フォルダー」欄の「(x)」をクリックし「値を挿入」画面を立ち上げ、事前に設定した文字列変数を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/4dfac511-9498-b809-1151-2c8ff9d484c5.png)
下記のように「フォルダー」欄に事前に作成した変数が設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/e8b6f38d-08d6-1bec-3b1b-c665a414c11d.png)

---
「保存」をし、「実行」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/044e13d9-8775-de41-00fc-4fccaca9398e.png)


---
Botの正常終了を知らせる「キラキラ」が表示されるので、「閉じる」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/27debd3c-4ea7-e10f-4e33-1ec2f99c7ad0.png)

なお、指定したフォルダが存在しない場合は下記のエラーとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/397c89fe-8a28-ce9f-b3c4-f29e962a51f4.png)

---
先ほど⑤で指定したフォルダが削除されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/49d4c643-a5e8-1896-5452-80c2f82add64.png)


# この演習で学んだこと
この演習では、Botでフォルダを削除する流れを学びました。

フォルダ削除時のポイントとしては、下記になります。

- 削除するフォルダは必ず絶対パスで指定する
- フォルダを指定する際には変数の利用も可能
- 既存フォルダが存在しない場合はエラーとなる
*存在有無の条件分岐処理と組み合わせることが有効

一連の処理の中で一時的にフォルダが必要な場合など、フォルダ作成と組み合わせることで実践的な処理を行うさまざまなケースで活用する機会があるかと思います。どんどん活用してみましょう！

# もっと知りたい！　学びたい！

この記事を読んで、「Automation 360 の使い方をもっと知りたい！」と思った方は、以下のシリーズをチェックしてみてください。

Automation360の基礎知識や使い方を、わかりやすくまとめたシリーズで、この記事もシリーズの１トピックとなっています。

https://qiita.com/IQ_Bocchi/items/8d28f12256037b5f9058

Automation Anywhere を使い始めたばかりの方はもちろん、これから使ってみようと思っている方や、ずっと使っているけど改めて基本を学びたい方などは、ぜひチェックしてみてください！
RabbitMQでキュー内のメッセージをすべて取得する方法

RabbitMQでキュー内のメッセージを確認する方法のメモ。
既存のメッセージをACKなしでconsumeすることで、キュー内のメッセージに影響を与えずに済みます。

## コード
以下のメソッドを実行すると全メッセージをACKなしで取得できる。

```python
import json
import pandas as pd
import pika

def get_all_messages(user='guest', password='guest', host, topic):
    """
    Queue内のMessagesをすべて取得する
    """
    credentials = pika.PlainCredentials(user, password)
    pika_param = pika.ConnectionParameters(host=host, credentials=credentials, channel_max=2)
    dfs_ = list()

    with pika.BlockingConnection(pika_param) as connection:
        channel = connection.channel()
        for method, properties, body in channel.consume(queue=topic, inactivity_timeout=10):
            if (method, properties, body) == (None, None, None):
                break
            dfs_.append(json.loads(body))
    
    return pd.DataFrame(dfs_)
```
実行例
```python
messages = get_all_messages(host="test_host", topic="test_topic")
```

取得するメッセージ数が多い場合、適宜time.sleep()を入れたりが必要かも？
でもそうするとメッセージの取得に時間がかかりすぎるので、一括でdumpできる方法があればなぁと。

## 関連リンク
https://yolo-kiyoshi.com/2022/02/23/post-2888/
バケット所有者強制（BucketOwnerEnforced）の場合マネジメントコンソールでS3クロスアカウントアップロードの「AccessControlListNotSupported」エラーを解消する方法

# 背景

マネコンを経由してクロスアカウントのS3アップロードをやりたいです。
バケットのオブジェクト所有者を「ACL無効」→バケット所有者強制（BucketOwnerEnforced）に設定します。

# 設定

##### ・アカウントAのS3バケットポリシーでアカウントBに対するアップロード権限を付与する

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<アカウントBのID>:role/<ロール名>"
                ]
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketVersioning",
                "s3:DeleteObject",
                "s3:PutObject",
                "s3:PutObjectTagging"
            ],
            "Resource": [
                "arn:aws:s3:::<S3バケット名>",
                "arn:aws:s3:::<S3バケット名>/*",
            ]
        }
    ]
}
```

##### ・アカウントBのロールポリシーでアカウンAのS3バケットに対するアップロード権限を付与する

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<アカウントAのS3バケット>"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::<アカウントAのS3バケット>/*"
            ]
        }
    ]
}
```

# エラー

アカウントBの該当ロールを使ってマネコンからファイルをアカウントAのS3バケットへアップロードする時に「AccessControlListNotSupported」エラーが出ました。
ブラウザーでネットワークの状況をデバッグすると「x-amz-acl」が「private」に設定しているので、間違えています。
※正しいのは「bucket-owner-full-control」です

# 解決方法
アカウントAのバケットポリシーとアカウントBのロールポリシーの`Action`に下記「[GetBucketOwnershipControls](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetBucketOwnershipControls.html)」権限を追加します。

```json
"s3:GetBucketOwnershipControls"
```

# 原因分析

　　バケット所有者強制（BucketOwnerEnforced）を設定する場合（他のアカウント所有も同じ）、既定ACLをアップロード元で設定する仕組みとなります。加えて、既定ACLを`bucket-owner-full-control`に設定しないとアップロードが失敗するわけです。
　　しかし、`s3:GetBucketOwnershipControls`が許可しない場合、マネコンからアップロードする時、[デフォルトACL許可: private](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/acl-overview.html#canned-acl)しかを利用できないから、`AccessControlListNotSupported`エラーになります。
　　エラーを防ぐため、`s3:GetBucketOwnershipControls`APIのコールでObjectOwnership設定を事前に確認して、正しいACL設定を実施します。

さらに深掘りすると、[ACLの設定](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/managing-acls.html)の「❗️重要」による、下記の記載があります。

> ACL の設定または ACL の更新の要求に失敗すると、AccessControlListNotSupported エラーコードを返します。ACL の読み取り要求は引き続きサポートされています。

自分の考えだと、ACLでS3権限を制御することは最初からの仕組み、最近はACL無効化という機能がリリースしたばかりなので、バケットをACL無効（バケット所有者強制）に設定しても、互換性を持つためにACLの読み取りが続いてサポートしています。というのはACLという機能が実際に裏で動いています、なのでせめてACL参照権限をアップロード元に付与しないとアップロード元はバケット所有者設定はどうなっているのが知らないです。この場合既定ACLはデフォルトで`private`を設しかできないです。
DDoS攻撃の対策


参考サイト

https://cybersecurity-jp.com/column/18262#DDoS-3



### DDos攻撃とは
攻撃者は複数の機器（パソコンなど）を踏み台にして、特定の機器（サーバーなど）に一斉攻撃をしかけます。 このとき、踏み台として利用される機器には関連性がないため、攻撃を受けた側は犯人を特定しにくいことも特徴の一つです。

↓こちらはDDos攻撃のリアルタイムでみられます

https://www.digitalattackmap.com/#anim=1&color=2&country=ALL&list=0&time=18763&view=map


### 対策

- アクセス制限をする
- 海外からのアクセスを停止する
- ネットワークトラフィックを監視システムの導入
- DDoS対策ツールの導入
- 警察や司法機関への連絡

詳しくは参考サイト参照してください
webpack の使い方

こちらのページの通りに行いました。
[Webpackとは【Webpack + TypeScript + React で環境構築】](https://zenn.dev/ichigo_dev/articles/d061205249e6db364c2a)

次のバージョンで確認しました。

```text
$ node --version
v17.6.0
```

GitHub からクローン

```bash
git clone https://github.com/igsr5/webpack-test-react
```

ビルド&実行

```bash
cd webpack-test-react
npx webpack serve --config webpack.config.js
```

次のエラーが出ます。

```text
    at /home/uchida/webpack-test-react/node_modules/webpack/lib/NormalModule.js:809:5 {
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
```

環境変数を設定してエラーを回避

```bash
export NODE_OPTIONS=--openssl-legacy-provider
npx webpack serve --config webpack.config.js
```

クライアントで
http://localhost:8080/
にアクセス

![hello_mar04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/d0a0d6aa-a531-bc4c-b737-827aadde0868.png)

## webpack を使います ## 

dist フォルダーを削除

```bash
rm -rf dist
```

コンパイル

```bash
webpack --config webpack.config.js
```

dist フォルダーが作成されます。

```text
$ tree dist
dist
├── app.js
└── index.html
```

コンパイルされたコードを実行

```text
$ serve dist

   ┌─────────────────────────────────────────────────┐
   │                                                 │
   │   Serving!                                      │
   │                                                 │
   │   - Local:            http://localhost:3000     │
   │   - On Your Network:  http://192.168.1.6:3000   │
   │                                                 │
   │   Copied local address to clipboard!            │
   │                                                 │
   └─────────────────────────────────────────────────┘
```

クライアントで
http://localhost:3000
にアクセス

![dist_mar04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/59a672cb-dcd8-2c53-c82f-384e7009f84a.png)

## プログラムを改造 ##

```tsx:src/HelloWorld.tsx
import * as React from 'react';

const HelloWorld: React.FC = () => <div>
<h1>皆さんこんにちは!!</h1><blockquote>Hello World!!</blockquote></div>;
export default HelloWorld;
```

開発サーバーを起動

```bash
npx webpack serve --config webpack.config.js
```

ブラウザーで　http://localhost:8080/ にアクセス
![hello_mar0402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/2f920cdb-e4c4-f96e-8be4-36d5231c71ec.png)


コンパイル

```bash
webpack --config webpack.config.js
```

dist のコードを実行

```bash
serve dist
```

ブラウザーで　http://localhost:3000/ にアクセス
![hello_mar0403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1d2ebd8b-74be-d60d-d4d0-1451d870975a.png)