OmniAICreator/Qiita-1.07M huggingface dataset:
Livebook プレゼンテーションモード

## はじめに

Livebook 0.10.0 で追加されたプレゼンテーションモードを紹介します

https://livebook.dev/

今まで、私は色々なイベントで Livebook によるプレゼンを行ってきましたが、正にそれ用の機能が追加されました

今まで以上に Livebook によるプレゼンが盛り上がりますね！

プレゼンテーションモードの公式の紹介動画はこちら

https://www.youtube.com/watch?v=Tlo4mYK8UuM&t=3s
 
## プレゼンテーションモードへの切り替え

プレゼンテーションモードへの切り替えは Livebook の右下にあるうち、一番上のアイコン（下画像内の赤枠）から設定します

![スクリーンショット 2023-07-16 13.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/cc84f445-620e-eb59-8401-da3b27947fb5.png)

アイコンをクリックすると、 "Code zen" と "Presentation" が表示されます

![スクリーンショット 2023-07-16 13.30.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d7c7bbe1-e4f3-82ec-74fc-39a8b960f713.png)

"Presentation" をクリックすると、プレゼンテーションモードになり、選択中のセル以外は白く霞みます

![スクリーンショット 2023-07-16 13.32.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/77dce473-9543-365f-1648-d2ba00693f14.png)

![presentation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/7bd5d76b-2340-e99b-e832-51a83e4b8286.gif)

これで、今見て欲しいところだけに聴衆の目を集めることができます

元に戻すときは、もう一度 "Presentation" をクリックします

![スクリーンショット 2023-07-16 13.34.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/186250a0-fedb-90f1-8605-9756f7939943.png)

ちなみに "Code zen" の方をクリックすると、マークダウンのセルが全て非表示になり、コードと実行結果だけが表示されます

## まとめ

以前より Livebook は「魅せる」ツールだと言っていましたが、ますます魅せるための機能が充実してきましたね
【Typescript】 typeof と keyof を理解する

`typeof`と`keyof`現場のソースコードでよく見るけどわからなくなることがあるのでまとめました。
# typeof
`typeof 変数`と書くと変数の型がつくれます。
`todo`というオブジェクトを例に説明します。

```typescript
const todo = {
id:1,
task:'勉強',
isDone:true
}
```
`Todo1`と`Todo2`は同じ型を示します。
```typescript
type Todo1 = {
id:number;
task:string;
isDone:boolean;
}

// typeof todo はtodoオブジェクトの型だよ。という意味
type Todo2 = typeof todo

```

# keyof
`keyof T`は「型`T`のプロパティ名のユニオン型」を表します。

```typescript
type Todo1 = {
id:number;
task:string;
isDone:boolean;
}

// 型Key1は型Todo1のkeyをとってきた型だよ。という意味
type Key1 = keyof Todo1
//type Key1 =  "id" | "task" | "isDone"

```
※注意点は`typeof 変数`、`keyof 型`のように使うこと。
似ているようで全然違います。

# keyofとtypeofを組み合わせる
`typeof`と`keyof`を使用して以下のようにも表すことができます。
## オブジェクトのプロパティ名の型
```typescript
const todo = {
id:1,
task:'勉強',
isDone:true
}

// 型Keyはtodoの型の、keyをとってきた型だよ。という意味
type Key = keyof typeof todo
//type Key =  "id" | "task" | "isDone"
```
正直プロパティ名の型が欲しいときってあまりない気がしました。
## オブジェクトのプロパティ名に対応する値の型

```typescript
type Value = typeof todo[keyof typeof todo]
// type Value = string | number | boolean;
```
こちらは「このオブジェクトのそれぞれのプロパティに対する値の型がほしい！」
というときに使えます。これ覚えておくと使えるときがわりとあります。

# おわりに
エンジニア歴1年未満の初心者です。
Typescript,React学習中です。
今回は初投稿でした！これから自分のペースで記事投稿続けていきたいと思いますのでよろしくお願いします。
【janog52】フィッシング詐欺について

# 概要
こちらのプログラムのまとめと感想。

https://www.janog.gr.jp/meeting/janog52/phishing/

フィッシング詐欺は、
1. 一般＆フィッシング対策協議会からの報告
1. JPCIRTに連絡
1. 対策を検討＆周知という流れで対策される。

主な被害内容
- 不正送金
- クレジットカード不正利用
    - 番号盗用。
    - これは、3-Dセキュアを利用する対策が重要である。
    - メールに関しては`送信ドメイン認証` `迷惑メール対策`をすること。

2023年は、半年ですでに去年分以上の件数を超えている。

# 傾向
なりすましのフィッシングメールが大量配信されているケースが多い。

大量に偽URLが生成されている。これらをブロックするために、IPアドレスでの制限が必要になるかも。


# 対応・対策と課題
## フィッシング対策

- URLフィルタリング
- フィッシングサイトの閉鎖調整
    - 各事業者がホスティング事業者にサイト閉鎖を要請する。
- 検知サービス

## なりすまし対策

- 送信ドメイン認証
    - SPF
    - DKIM
    - DMARC
    - の3つがメインになっている。

DMARCは、SPFなど単体で使用した場合の機能を補う機能があり、優秀。
利点として、Gmailなどのメールが対応済みであり、モバイルユーザ向けの対応策が高い。
これを利用する事で、なりすましメールの50%~90%を、技術的に排除する事が可能。


# 正規メールの視認性向上

利用者にとって重要なのは、正しいメールかどうか。
Yahooメールで行われている取り組みでは、

送信ドメイン認証で失敗したメールには警告マークがでるようになっている。

他の取り組みとして、
正規メールの表示例をホームページに出す事で、利用者が判別しやすくなるように注意喚起している。



# フィッシング対策

利用者側として。
- 大量にメールが届くのであれば。メールが漏れている可能性があるため、アドレスの変更を検討する。
- また、迷惑メールフィルターは、`電気通信事業法の通信の秘密を守るため、国内ISPのメールサービスではデフォルトで無効になっている`ため、有効にしておくこと。
- 正規メールの表示を知る事

まとめとして、DMARCを利用することを推奨する。

# 送信ドメイン認証技術の普及状況

ざっくりと。
送信者をドメイン名単位で認証する。
技術導入マニュアルは、迷惑メール対策推進協議会のWebサイトから入手できる。

SPFが81％ほど普及している。DMARCは7％ほど。
設定もDMARCの方が簡単なハズだが、なぜかSPFが普及しているのがわからないとのこと。

rejectの設定が増えており、すばらしいとのこと。

DMARC認証のために、最初の認証にDKIを用いるとよいかもしれないとのこと。

メッセージングセキュリティ技術。
メール配送時の暗号化として、TLSを用いているが、これは受信側が対応していなければTLS転送することができない事に注意が必要。

# 全体のまとめ＆感想として

SPFなども効果的であるが、DMARCを検討することが大事である。
メールアドレスを変えるよりもよい方法はあるのか？
新しいメールアドレスを作り、登録させる。IDとして使用するメールアドレス・連絡として使用するアドレスの2通りあり場合、IDとしてしようする方を変えるとよいのではないか。
Windows Terminal入門


### Windows Terminalをインストールする。

- Windows Terminal
https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701?hl=ja-jp&gl=jp&icid=CNavAppsWindowsApps

- Windows Terminal Preview
https://apps.microsoft.com/store/detail/windows-terminal-preview/9N8G5RFZ9XK3?hl=ja-jp&gl=jp&icid=CNavAppsWindowsApps

Preview版もあるのでお好きなほうを選択してください。



---

### Oh My Posh をインストールする

https://ohmyposh.dev/docs/installation/windows

winget, scoopなどでインストールできる。

今回はwinget実行していきます。

Installation wingetから
```
winget install JanDeDobbeleer.OhMyPosh -s winget
```
を実行します。
※上記の公式ページからコマンドは確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283495/4e2da271-300f-2f67-8b3e-47ff10c89384.png)

実行すると上記のようにインストールが完了します。

- $profile を何かしらのエディタなどで開く
```
// vscode
code $profile

// メモ帳
notepad $profile
```

### Fontをインストール・設定をする

・Font をインストールする
```
oh-my-posh font install
```

お好きなフォントをインストールしてください。
特にない方は、`Meslo` をおすすめします。

- fontを変更する
1. 設定 > Windows PowerShell > (追加の設定)外観 > フォントフェイス
からインストールしたフォントに変更してください。
2. `Meslo` をインストールしたかたは `MesloLGM Nerd Font` を選択してください。
3. 保存を押して終了してください。


### テーマをインストール・設定をする

- ここからお好きなテーマを選択して、jsonファイルをダウンロードしてください。

https://ohmyposh.dev/docs/themes

`$profile` を実行してファイルパスを確認して、ディレクトリ内にダウンロードしたファイルを配置します。

- $profile を何かしらのエディタなどで開く
```
// vscode
code $profile

// メモ帳
notepad $profile
```

`{jsonのファイルパス}` の箇所にjsonファイルのパスを入力して保存します。
```
oh-my-posh init pwsh --config "{jsonのファイルパス}" | Invoke-Expression
```

Windows Terminalを再起動してください。
インストールしたテーマが反映されていれば成功です！


- 参考：

https://learn.microsoft.com/ja-jp/windows/terminal/tutorials/custom-prompt-setup
【推し活】推しから寝起きとか仕事終わりにLINEが来たら嬉しくないか？？？〜疑問解決編その2〜

# きっかけ
前回の記事でもともと持っていた疑問点は解決したが，それを踏まえて新たにディレクトリを作ったところ`no module named 'requests'`というエラーが出て動かなかった．そこでプログラミングが得意な弊研究室の後輩たちに相談したら30分ほどで解決したので記事にする．結局パスの問題だった．

# 前提
以下の2記事を見てきた人へ向けて
- [【推し活】推しから寝起きとか仕事終わりにLINEが来たら嬉しくないか？？？](https://qiita.com/NAT/items/eeb40ac5fc59be86a468)
- [【推し活】推しから寝起きとか仕事終わりにLINEが来たら嬉しくないか？？？〜疑問解決編その1〜](https://qiita.com/NAT/items/56cded8bedf6f148b7b4)


# 今回やること
1.　環境確認パート
2.　解決パート
3.　意味のなかったこと
4.　お知らせ

# 1.環境確認パート
```
pip install requests
```
の結果は要約するとpipの新しいバージョンが存在するってことと`[notice] To update, run: python3.9 -m pip install --upgrade pip`ということが返ってきたがあんまり関係なさそう．
次にrequestsモジュールが存在する場所，Locationを確認する．

```
pip show requests
```
の結果，NameとかVersionとかが返ってくる．`pip install requests`した後なら必ず返ってくると思う．結果の中の`Location:/hoge/hogehoge`というのを後で使う．
ここで一旦，前回の記事や各々のディレクトリ構成を参考にして
```
python3 ./line_api/line.py
```
を実行してみてやはり`no module named 'requests'`となることを確認する．実際ここまでやったことは環境の確認だけで解決は次のパートからになる．

# 2.解決パート
`.zshrc`でPython3のパスが通っていることは前提とする．

もはやおなじみの`crontab -e`と入力し出てくる画面に1文を追加したことが実質的な解決策になった．
PYTHONPATHの後ろにさっき調べた`Location`の中身を記述する．
```
# 必要なのはrequestsライブラリがあるところを教えること
PYTHONPATH=/hoge/hogehoge

0 6 * * * python3 /Users/hoge1/line_api/line.py
```
再び
```
python3 ./line_api/line.py
```
をやると今度は動くようになっていると思う．

# 3.意味のなかったこと
さっきの`Location`の中身を
```
vi .zshrc
```
で開いた先に`export PYTHONPATH="/hoge/hogehoge:$PYTHONPATH"`というように記述して
```
source .zshrc
```
で設定適用してみたが，なにも変わらなかった．~~`Location`の中身を記述するファイルは`crontab -e`のファイルだった．~~

(2023/7/19追記)
別のモジュールで同じようなことが起こって`.zshrc`に`export PYTHONPATH="/hoge/hogehoge"`と書いて動くようになったのでこれも同様に動くかもしれない．

# 4.お知らせ
諸事情により，この自動化システムをこれ以上発展させることはない．さらに動かすこともやめた．~~このシリーズの更新ももうない．~~ 

(2024/11/13追記)
LINE Notifyがサービス終了するらしい．インターンでの開発に用いたMessaging APIで代替することができるので作ってもいいけど上記の通りもう動かしてないしなぁ……．


# 参考文献
この記事は以下の情報を参考にして執筆しました。

- 研究室の後輩たち
LaravelでのDB操作

## はじめに
Laravelのデータ操作を何回かに分けて試す。
ほぼほぼchatgptを使用し記載している。
なんでも回答してくれる、一人ではほぼ無理。

## 内容
プロジェクト毎の従業員の工数を月ごとに見たい場合を例に挙げる。
一旦テーブルは一つで行う。
ただし比率を計算するにあたり、１つのテーブルから２つのサブクエリーを作り、joinする。
比率はsqlで計算する方法と、laravelで行う方法を試す。
まずはDBファザード等、基本的なLaravelで試す。

長くなっているので、以下に分けて掲載する。

・[環境準備](https://qiita.com/kenji123/items/3ecb150fb2ade6844a9c)
・[比率を計算するSQL例(1回で取得)](https://qiita.com/kenji123/items/5fcf42b8d20410f816ce)
・[DBファザードのDB::select()で対応](https://qiita.com/kenji123/items/84c90f1339a81a932180)
・[比率を計算するSQL例(複数回)で取得)](https://qiita.com/kenji123/items/faff7dd296c56bd8bfa7)
・[誤差を求め、特定のプロジェクトのみ取得する](https://qiita.com/kenji123/items/e1359168b42d58af7cae)
・[両方(UNION等で結合が要)対応する場合](https://qiita.com/kenji123/items/b4b6d3abc6fbeddcffdb)

## 次回対応
今回DB操作に慣れるためにLaravelの機能を使ったが、結局Eloquentを使っていない。Eloquentを使えなければLaravelのDB操作機能を使用したと言えないと思うので、Eloquentの把握を行なっていきたい。
夜間熱中症という言葉を知っていますか？


　どうも、カーブミラーです。

　日中、暑いですね。
　　夜間も多少、
　　　気温が下がるくらい。

　みなさんは、
　　「夜間熱中症」という言葉を
　　　ご存知でしょうか？

　まぁ、
　　文字どおりなのですが、
　　　簡単に
　　　　説明すると、
　　　　　寝ているあいだに
　　　　　　なる熱中症
　　　　　　　とのことです。

　詳しくは、
　　ググってください。

　「**夏の熱中症の約4割は
　　夜間に発症している**」
　　　そうです。

　ちなみに、
　　ChatGPTさんに尋ねたところ、
　　　ご存知ありませんでした。
　　　　最近の言葉なのかも。
***
　寝ているあいだは、
　　当然ですが、
　　　身体も眠っていて、
　　　　意識的に
　　　　　コントロールできません。

　つまり、
　　そのあいだに
　　　熱中症になってしまう
　　　　ということですね。
***
　対策としては、

　・寝具などを
　　　工夫する。
　・クーラーを使って、
　　　室温を下げる。
　・扇風機の首振りで
　　　風の対流を
　　　　コントロールする。
　・寝る前に、
　　　コップ一杯の水を飲む。
　　　　お茶、コーヒー、お酒は
　　　　　利尿作用で脱水症状に
　　　　　　なります。
　　　　　　　やめましょう。
　・起きた際にも
　　　飲みましょう。
　　　　意外と汗をかいている
　　　　　そうです。
***
　まだまだ、
　　暑い日が続きます。
　　　大雨も心配ですが、
　　　　お互いに気を付けましょう。
[node.js][pm2][ts-node]PM2をOS起動時に自動起動する(core dumpを作成しないようにする）

## 概要
PM2で管理しているnode.jsアプリケーションのOS起動時に自動起動する設定を行います。

自動起動スクリプトをそのまま使用した際、OSのユーザー設定でデフォルトがcore dumpファイルを作成しないようになっていても、作成されてしまう事があったので、作成しないよう修正をします。
(amazon linux2だとデフォルトはコアダンプを作らないようなっているっぽい？）

core dumpファイル(core.xxx)：
クラッシュした内容などが書かれているファイル。
数百MBや1GBくらいをポンっと作ってしまうので、PM2で自動起動→停止→自動起動→停止を知らず繰り返しているとサーバーのディスク容量がいっぱいになるので、注意が必要になります。

詳細を調べたいときや（OSクラッシュ時など）容量に十分空きがあればよいですが、nodeアプリケーション停止でPM2が出力するエラーログ以上のものが不要でしたら作らなくてもよいのかなと思いました。

## 環境
- サーバー：amazon linux 2
- node：16.13.1
- pm2：5.3.0
- viでファイルの編集・保存が出来る

## 前提
PM2のインストール等はすでに完了している想定です。
インストールは[こちらの記事](https://zenn.dev/tsonwk/articles/3f76ce1ff60a78)を参照ください。

## 設定
設定は基本的に公式サイト通りになります
https://pm2.keymetrics.io/docs/usage/startup/

### PM2のstartupコマンドを実行
```
$ pm2 startup
```

### startupの登録
コンソールに出力された内容をコピペして実行
```
startupコマンド実行で以下のような内容がコンソールに出力されるので、コピペじて実行する
サンプル：
sudo su -c "env PATH=$PATH:/home/unitech/.nvm/versions/node/v14.3/bin pm2 startup <distribution> -u <user> --hp <home-path>

例：amazon linux2のec2-userなら以下のような感じ
sudo env PATH=$PATH:/home/ec2-user/.nvm/versions/node/v16.13.1/bin /home/ec2-user/.nvm/versions/node/v16.13.1/lib/node_modules/pm2/bin/pm2 startup systemd -u ec2-user --hp /home/ec2-user
```

上記コマンドを実行した時点で自動起動は可能になっています。

### 設定を保存する

```
$ pm2 save
```

### core dumpファイルを作成しないようにする
上記の流れで、自動起動スクリプトの内容が表示されていますが、その中の `LimitCORE` 部分がデフォルト設定より優先されるようなので手動で修正します。

### リミット値を変更する
```
$ sudo vi /etc/systemd/system/pm2-ec2-user.service
変更前：LimitCORE=infinity
↓
変更後：LimitCORE=0
に変更し、ファイルを保存する
```
上記でOS再起動時もコアダンプファイルが作成されないようになります。
![](https://storage.googleapis.com/zenn-user-upload/2e0b3dbf340c-20230716.png)

## 確認
OSユーザーのコアダンプデフォルト設定の確認
`0`の場合はコアダンプを作成しないになっている
```
$ ulimit -c
0
```

プロセス毎の確認
下記設定ファイルの内容でプロセス毎の設定値確認が可能です
`Max core file size`の `Soft Limit`が `0`になっていれば大丈夫です。
![](https://storage.googleapis.com/zenn-user-upload/28c055ee74e0-20230716.png)
```
$ cat /proc/プロセスID/limits

例：下記キャプチャの場合
$ cat /proc/5665/limits
```

- PM2のプロセスIDはpsコマンドでみるか、`$ pm2 list`コマンドで表示される`pid`になります。
- もし `pid`が表示されない場合、ターミナル画面の横幅を広げてみてください
![](https://storage.googleapis.com/zenn-user-upload/cfb9cce2ac80-20230716.png)

## 自動起動の削除

PM2のunstartupコマンドを実行
```
$ pm2 unstartup systemd
```

登録時と同じような内容がコンソールに出力されるので、コピペして実行する
```
サンプル：
sudo su -c "env PATH=$PATH:/home/unitech/.nvm/versions/node/v14.3/bin pm2 unstartup <distribution> -u <user> --hp <home-path>
```

以上です。
誹謗中傷が機能しないSNSを個人開発してみました！「紹介編」| Rails7 x TailwindCSS x Render.com

注：本記事はzennの記事からの転載です。
## 概要
昨今、SNSを通じた誹謗中傷が起こっていますが、それらをどうにか起こさないSNSができないものかと思い自分なりに考え、業務未経験ですが作ってみました！今回は、その簡単な紹介記事です。良ければ読んでみて、そして遊んでみてください！また、意見ももらえるととても嬉しいです！

## 使用技術
- Ruby 3.1.2
- Rails 7.0.6
- 各種Gem （ログインなど）
- Tailwind CSS （デザイン周り）
- PostgreSQL （DB）
- Render.com （デプロイ先）

## 作ったもの
![コトノハ 手紙制作画面](https://storage.googleapis.com/zenn-user-upload/06cc60b20874-20230715.png)

https://gen3-kotonoha.onrender.com/
"コトノハ"というwebアプリを作りました。

## 特徴
未熟な私ではありますが、コトノハでは主に機能面で差別化を測っています。既存のアプリ・サービスとは違う点を、表にまとめました。

| 特徴 | コトノハ | Twitter etc |
| ---- | ---- | ---- |
| フォロー関係 | ☓ | ◯ |
| タイムライン | ☓ | ◯ |
| 拡散力 | ☓ | ◯ |
| ユーザー検索 | ☓ | ◯ |
| ポスト検索 | ☓ | ◯ |
| 充実したプロフィール | ☓ | ◯ |
| いじめや誹謗中傷 | ☓ | ◯ |
| 心理的安全性と匿名性 | ◯ | ☓ |


コトノハでは、あなたのポストはランダムに他のユーザー一人にのみ送られます。それが誰かは、誰にもわかりません。受け取った相手も、誰から来たのかはわかりません。また、そのポストには一度だけ返事ができます。

充実したプロフィール登録画面もなければ、検索機能も、マスに向けた拡散力もありません。しかし、だからこそ、ユーザーは安心して今の気持ちや、感情、考えを自由に素直に「つぶやく」事ができます。

## ぜひ遊んでみてください！
個人的なエゴと妄想で作ってみたアプリです！今はまだ周りの友人達にしか使ってもらってないので、ぜひ遊んでみてください！そして、この記事に対するコメントでも、アプリからでも問い合わせができますので、ご意見お待ちしています！

## 最後に
このアプリを作ってみたきっかけで、プログラマになってもっと色んなことができるようになりたいので転職活動中です。笑 

今はdeno, typescript, fresh あと、next.jsなどなども触ってみつつポートフォリオ的なものも作っています。興味を持っていただけたらコメントいただけるととても嬉しいです！ 

このアプリに関する記事もこれから少しずつ書いていこうと思っているので、どうぞよろしくお願いいたします。

初投稿で読みづらいところもあったかと思いますが、お付き合いいただきありがとうございました！
HasOneThroughについて（備忘録）

# なぜこの記事を書こうと思ったのか
Laravelの公式ドキュメントには、一方向におけるリレーションしか記述されてなかった。
そのため、備忘録としてこの記事を書こうと思った。

# 本題
公式ドキュメントに書いてある例を引用して、解説する。
[リレーション（Has One Through）](https://readouble.com/laravel/10.x/ja/eloquent-relationships.html#has-one-through)

### 使用するテーブル
```php:テーブル
mechanics
    id - integer
    name - string

cars
    id - integer
    model - string
    mechanic_id - integer

owners
    id - integer
    name - string
    car_id - integer
```
`mechanics`→`cars`→`owners`って感じかな。

### mechanicから見たとownerとのリレーション
```php:リレーション(Mechanic.php)
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOneThrough;

class Mechanic extends Model
{
    /**
     * 車の所有者を取得
     * 
     * @return HasOneThrough
     */
    public function carOwner(): HasOneThrough
    {
        return $this->hasOneThrough(
            Owner::class,  // 最終モデル
            Car::class,    // 中間モデル
            'mechanic_id', // 中間モデルの外部キー
            'car_id',      // 最終モデルの外部キー
            'id',          // このモデルの主キー
            'id',          // 中間モデルの主キー
        );
    }
}
```
ここまでは公式ドキュメントに書いてある。

### ownerから見たとmechanicとのリレーション
ここからは公式ドキュメントには書いていない。
```php:リレーション（Owner.php）
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOneThrough;

class Owner extends Model
{
    /**
     * 車の所有者を取得
     * 
     * @return HasOneThrough
     */
    public function carMechanic(): HasOneThrough
    {
        return $this->hasOneThrough(
            Mechanic::class, // 最終モデル
            Car::class,      // 中間モデル
            'id',            // 中間モデルの主キー
            'id',            // 最終モデルの主キー
            'car_id',        // このモデルの外部キー
            'mechanic_id',   // 中間モデルの外部キー
        );
    }
}
```

# hasOneThrough関数の引数について（まとめ）
- 第１引数：最終モデル
- 第２引数：中間モデル
- 第３引数：このモデルと結びつく<font color="Red">中間モデルのキー</font>
- 第４引数：中間モデルと結びつく<font color="Red">最終モデルのキー</font>
- 第５引数：第３引数と結びつく<font color="Red">このモデルのキー</font>
- 第６引数：第４引数と結びつく<font color="Red">中間モデルのキー</font>

たぶんね😇

# 参考
[[ Laravel ] HasOneThrough の公式に無い定義方法について](https://laboliy.com/laravel-hasonethrough/)
C#でMSTestからテスト対象プロジェクトのApp.confgを取得できるようにする

# 1. はじめに
* MSTestクラスを使用して単体テストしようとした時にテスト対象プロジェクトのApp.configが参照できない問題を解決したい

# 2. 開発環境
* C#
* .Net 6
* MSTest
* Visual Stuido 2022
* Windows 11

# 3. 問題点
* テスト対象クラスでApp.Configの値を使用している場合、テストプロジェクトから参照できず、設定値がないことになる

## 3.1. テスト対象クラス
```C#:Class1.cs
public class Class1
{
    public int Add(int x, int y)
    {
        var value = ConfigurationManager.AppSettings["value"];
        return x + y + Convert.ToInt32(value);
    }
}
```

## 3.2. App.config
```XML:App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<appSettings>
		<add key="Value" value="10" />
	</appSettings>
</configuration>
```

## 3.3. テストクラス
```C#:Class1Tests.cs
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var class = new Class1();
            Assert.AreEqual(class.add(1, 2), 10);
            // 毎回NGになる
            // expected: 13
            // actual: 3 →　App.configからvalueが取得できないため
        }
    }
```

# 4. 回避策
1. テストプロジェクト直下にApp.configをコピーして、名前を```testhost.dll.config```に変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/d7a1be75-cfbc-d63e-f073-85be0dbc98b5.png)

2. プロパティで出力ディレクトリにコピーを```新しい場合はコピーする```に設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/3ba2484c-69fd-39b6-e1ba-0b56e3417ea5.png)

# 5. 参考文献

https://devadjust.exblog.jp/28699256/
【Rails】DecoratorとHelperの特徴・違い

# Decoratorとは？

- デザインパターンの一つである。
- デザインパターンとは、汎用的な設計パターンのことで、いろんなプログラムで再利用できるのが特徴。
- Decoratorはインスタンスに対して動作するため、各インスタンスに固有の挙動を持たせることができる。
- draperというgem（ライブラリ）やActive_Decoratorを用いることで使用できる。

# Decoratorの使用例

- モデルとビュー、どちらにも記述できるロジックがある場合に、あいだにDecoratorを定義する事で、モデルをスリムにできる。
- つまり、Fatモデルの解消などの効果がある。
- 例えば、日付フォーマットを変更するロジックを実装する際などに利用できる。
- モデル・ビュー、どちらにも記述することは可能だが、Decoratorを間に定義し、役割を分散させることでコードをスッキリできる。

詳しいコードはこちらの記事が参考になります。
<a href="https://www.sejuku.net/blog/63786">【Rails入門】ViewとModelの間にDecorator（Draper）を置く</a>


# Helperとは？

- RailsにおけるHelperは、ビューで使うための共通のメソッドを定義するために使われる。
- Helperは全てのビューから呼び出すことができるのが特徴である。
- モジュールの一つである。
- Webアプリケーションの開発において、様々なhelperが使用されている。


# Helperの使用例

ヘルパーにはデフォルトで多く定義されているものがあります。

- `content_for` ⇨ Webサイトのタブに表示させるタイトルを動的に表示させる。
- `content_tag` ⇨ HTMLタグをViewファイルに直接入力することなくHTMLコードを生成する。
- `form_with` ⇨ 入力フォームを簡単に生成することができるヘルパー。

参考：
<a href="https://web-camp.io/magazine/archives/19136">【Rails入門説明書】helperについて解説</a>

<a href="https://www.sejuku.net/blog/28563">【Rails入門】helperの使い方まとめ</a>



# DecoratorとHelperの違い

> helperもDecoratorもビューを書きやすくするための仕組みという点では共通点がある。しかし２つの違いとして
・helperはモデルから独立し直接関係していない描画ロジックを実装するのに用いる。
・Decoratorは特定のモデルに関連した描画ロジックを実装するのに用いる。

引用：<a href="https://qiita.com/mmaumtjgj/items/50c8ac82ca5583cac254">【Rails】decoraterの使い方</a>

あるいは、両者の違いについて、このように解釈することもできるかと思います。
- **Decoratorはインスタンスに固有の挙動を持たせたいときに使う。**
- **Helperは全てのビューで共通の挙動を実現したいときに使う。**


# 参考した記事
以下、サイト記事が非常に参考になりました。

https://qiita.com/mmaumtjgj/items/50c8ac82ca5583cac254

https://www.sejuku.net/blog/63786

https://web-camp.io/magazine/archives/19136

https://www.sejuku.net/blog/28563


Railsについて引き続き学習を続けていきます。同じくRails学習されている方はよければ参考にしてみてください。
1. Blenderのインストール【備忘録】

# WindowsでのBlenderのインストールについて
- 主にWindowsにおいてBlenderのインストール方法については以下の２通りがあります。

## 【windows編①】Microsoft storeからblenderをインストール方法
1. 以下のURLより、もしくはMicrosoft storeでBlenderを検索し、Blender3.3 LTS版を選択します。
[https://www.microsoft.com/store/productId/9N1SLK9R16TW](https://www.microsoft.com/store/productId/9N1SLK9R16TW)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/fbeeeaae-676b-b2e3-02c1-fe7d23cb8a38.png)

1. Blender3.3 LTSの画面が現れますので、「入手」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/9852baea-c60d-5e01-b104-806a31e505b5.png)

1. Windowsキーを選択し、blenderを検索すると、インストールされているのが確認できます。ここで開くを選択します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/cc9c7690-7edc-b8d4-5875-67f7ba3c2ea7.png)

## 【windows編②】Blender公式HPからインストール方法
- 以下のページより、Blenderをダウンロード。今回はBlender3.3 LTSのWindows版をダウンロードします。

1. 以下のURLに移動します。

    [https://www.blender.org/download/lts/3-3/](https://www.blender.org/download/lts/3-3/)
    リンクに移ると以下のページ画面が現れます。
    
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/375ed73c-3130-cbc9-e936-f91a93ce4138.png)

1. Downloadのblender-3.3.4-windows-x64.msiを選択します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/bdc823a4-ab2d-33df-fdd3-d0fe752ba673.png)

1. ダウンロードが開始されます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/586d28d0-a62a-e02d-4940-830c62468ae1.png)
 
1. ダウンロードをしたフォルダに移動し、インストーラーを選択・起動し、インストールを開始します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/2f86d316-2521-0c49-dc4d-f7c1fe1d4052.png)

1. インストーラーを起動すると以下のような画面が現れます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/dc69cff0-8f79-28dd-9cf2-ac69935610b6.png)

1. 同意 (I accept the terms in the License Agreement)を選択し、[Next]を選択します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/73f5428a-8fed-ea76-f524-270a1062e995.png)

1. [Next]を選択します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/b42509c1-a97c-3cc5-1bfe-a94ea5f6b0d7.png)
 
1. [Install]を選択します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/fd5a9157-b1b1-5d5b-3cbd-8d733323100e.png)

1. インストールが進み、以下の画面が出てインストールが終了します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/9ca9e42c-dcb6-c12f-dfe5-a392fa16b891.png)

1. Windowsキーを選択し、blenderを検索すると、インストールされているのが確認できます。ここで[開く]を選択します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/a24099a1-a161-d70e-0599-171c06045bdb.png)

1. 無事にBlenderが起動すると以下の画面が現れます
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508676/712954c9-3396-9175-c46e-331aea6e359c.png)
Blenderのシミュレーションノード

## 概要

[Blender 3.6 LTS](https://www.blender.org/download/releases/3-6/)のGeometry NodesのSimulation Nodeを紹介します。

- Simulation Nodeとは
- 簡単な使い方
- 入力で指定する方法
- バウンドするボール

以降では、英語モードとします（Prefernces → Inteface → Translation → Language → English）。
下記も参考にしてみてください。

https://qiita.com/SaitoTsutomu/items/39eb1f022218c647c323

## Simulation Nodeとは

Simulation Nodeを使うと、1つ前のフレームのジオメトリーを元に、新しいジオメトリーを作れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/2385e320-aa18-e8ac-6a58-e638d764fd7b.png)

上図のSimulation Inputから1つ前のフレームのジオメトリーを受け取り、ジオメトリーを更新し、更新したジオメトリーをSimulation Outputに渡します。
つまり、フレームごとに、枠内の処理がジオメトリーに反映されます。

## 簡単な使い方

ボールが移動するだけのシミュレーションを作ってみましょう。

### 手順

- すべてのオブジェクトを削除する（`ax`、`[Enter]`）。
- MeshのUV Sphereを追加する（`Amu`）。
- ワークスペースをGeometry Nodesにする。
- Sphereを選択したまま、Geometry Node EditorでNewを押す。
- Simulation Zoneを追加する（`Assim`、`[Enter]`、適当な位置でクリック）。
  - 以降では、「`[Enter]`、適当な位置でクリック」を省略します。
- Transform Geometryを追加する（`Astra`）。
  - TranslationのXを0.1にする。
- 下図のように接続する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/bfcd89f2-e58a-8985-c310-229a6b4e8eed.png)

スペースでアニメーションしてみましょう。ボールが移動していきます。
これは、毎フレームごとにXに0.1が加算されるからです。

TranslationのXを変更して速度が変わるのを確認してみてください。
Geometry Nodesを変更したら、`[Shift + 左矢印]`で時刻を0にしてからスペースで開始してください。

## 入力で速度を指定する方法

速度を変更できるように、速度をシミュレーションの入力にしてみましょう。
Simulation Inputノードを選択し、ViewメニューのSidebar（`N`）でサイドバーを出し、Nodeタブを選びます。Simulation Stateで「`+`」を押し、追加された項目をダブルクリックし、名前をVelocityに変更します。また、Socket TypeをVectorにします。
下図のようにSimulationノードにVelocityが追加されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/68e2170d-8ab9-ffdb-db54-0c08bedb4e3e.png" width="240">

Simulation InputのVelocityのXを0.1にし、下図のように接続します。わかりやすいように接続を曲げていますが、そのまま接続して構いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/8448ae64-1b22-680c-b6a5-8e0752ba57c1.png)

アニメーションしてみて、動きが変わらないことを確認しましょう。

もし、Simulation InputのVelocityをSimulation OutputのVelocityに接続しないと、動かなくなります。これは、Simulation OutputのVelocityが`0, 0, 0`のままで、その値が次のフレームのSimulation InputのVelocityになるからです。

## バウンドするボール

Vector Math（`Asvem`）、Compare（`Ascmp`）、Mix（`Asmx`）を追加します。
下図のように接続し、パラメータを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/946fad04-ca48-d29c-c1e6-3edb717aca68.png)

アニメーションすると、地面でバウンドするように動きます。

前回から次のようにVelocityを変化させているため、バウンドするように見えます。

- Zから0.05を引く（重力に相当）。
- Velocityの平均が-0.25以下なら、Velocityを初期値（`0.3, 0, 1`）に変更する。

以上
[node.js][pm2][ts-node]PM2を使ってアプリケーションを永続化・ログローテーションでログを管理する

## 概要
node.js / expressで構築し、ts-nodeで起動しているアプリケーションのプロセス終了を感知して再起動してくれるPM2のインストールメモです。

ログの肥大化を防ぐために、ログローテーションも行うようにします。

メモリ不足などの場合、nginxやapacheのWebサーバーが反応しなくなる的なイメージを持っていましたが、nodeはプロセスがパタっと止まってしまうんですね。勉強になりました。

PM2のアプリケーションをOS自動起動設定にした場合、コアダンプ(core dump)ファイルを作成しないようにする設定は[こちらの記事](https://qiita.com/t-son-wk/items/c61f55c865812f0c49d8)をご確認ください

公式サイト
https://pm2.keymetrics.io/

## 留意点
ホットリロードをするわけではなく、登録しているアプリケーションのプロセスが落ちたら、起動をしてくれるものになります。
そのため、プロセスが起動するまでの間はアプリケーションへ接続が出来なくなります。
(私の環境ではts-nodeで起動しているためか、20秒ほどかかる場合があります）

ホットリロード的なものを実現するにはPM2で複数プロセス起動が可能なクラスタ化を行い、どれかプロセスを残したまま他のプロセスを再起動的な感じになるのかなと思います（未検証）
https://pm2.keymetrics.io/docs/usage/cluster-mode/

## 環境
- サーバー：amazon linux2
- node.js：16.13.1

## 構築
特に難しいことはなく、コマンドを叩いていく感じです

### PM2インストール
インストール
```
$ npm install pm2 -g
```

### ログローテーションパッケージの追加
https://www.npmjs.com/package/pm2-logrotate
インストール
```
$ pm2 install pm2-logrotate
```

ログの設定
各環境に合った値を設定してください。
下記は1ファイル20MBでローテーションし、100ファイル残す想定です。
（2GB程度（他のファイルもあるので少し超えるかと）をログファイルで残す）
```
$ pm2 set pm2-logrotate:max_size 20M
$ pm2 set pm2-logrotate:retain 100
```

### アプリケーションを登録・起動
登録と同時に起動してくれます
管理用のアプリケーション名は下記を指定しています（ない場合は登録されたIDでも管理可能？）
わかりやすいように、プロジェクト名やアプリ名など入れておくと良いかもです
- アプリケーション名、`testapp` 
```
$ pm2 start --time npm --name "testapp" -- run start
```

MEMO：
通常起動しているコマンドが `$ npmr run start` を想定しています。
`package.json` には `"start": "ts-node -r tsconfig-paths/register src/index.ts"` が記載されています。

## 確認
ログで起動しているか確認します
```
pm2 log
```

## その他メモ
その他、よく使用するコマンドなど

### 登録されているアプリケーションの確認
```
$ pm2 list
```

### 停止・リスタート
停止
```
特定のアプリケーションのみ
$ pm2 stop testapp
すべてのアプリケーション
$ pm2 stop all
```

アプリケーションのリスタート
```
$ pm2 restart testapp
```

### 設定を保存・復元する
インストール等が終わったら保存しておくと、アプリケーションの登録が解除された場合（OS再起動で自動起動を行っていない場合など）に保存情報から復元が可能です

保存する
```
$ pm2 save
```

復元する
```
$ pm2 resurrect
```

### アプリケーションを削除する
削除する
```
$ pm2 delete testapp
```


以上です
UbuntuでFTPサーバーを構築する

## 目的
FTPが必要になったので構築してみる。

## インストール
```
sudo apt -y update
sudo apt -y install vsftpd
```

## 起動
```
systemctl start vsftpd
systemctl enable vsftpd
```

## 確認
```
ftp localhost
```

## ダウンロード
```
cd /path/
bin
get ubuntu1new.qcow2
```
【UiPath】Windows資格情報を使ってみる

# はじめに

資格情報マネージャーは使っていたのですが、改めて使い方をまとめておきたいなとおもったので、記録として残します。

この記事はUiPathブログ発信チャレンジ2023サマーの16日目の記事です。

https://note.com/shumpei_w/n/nd082bdf28853

# 結論

UiPath.Credentials.ActivitiesパッケージのGet Secure Credentialsアクティビティを使用して資格情報を取得します。


# 前提

資格情報は「資格情報マネージャー」から登録します。

「資格情報」などでヒットするので、探してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/eb196e0f-6531-77db-9369-aad766eedf5b.png)

# 事前準備

## Credentials.Activitiesのインストール

パッケージ「Credentials.Activities」をインストールが必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/db16f3c1-abbb-0016-4f4b-b1ca60f673be.png)

## 資格情報マネージャーの登録

資格情報マネージャーに事前に登録が必要です。

また、登録先は「汎用資格情報」である必要があります。

やりがちなミスとして「Windows資格情報」に登録してしまうと、登録した内容が取得できないので注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/183b0211-55f6-1a18-f5a3-ac64c99cfa4f.png)


# 実際にやってみた

今回はシンプルなつくりにしました。

## 登録した情報

わかりやすく「UiPathから資格情報を読み取るテスト」としました。

ユーザー名:tansuke2021

が取得できることを目的とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/52b33f66-3469-49d4-b3bd-fa60c13e3ba2.png)


## 実装

内容はシンプルです。

Get Secure Credentialsで資格情報を読み取り、UserNameをログに出力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/1563f71b-7312-81cc-0d85-0029abb0714a.png)

## 実行結果

無事にUserNameが取得できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/05b21f49-f1da-06ca-fcb5-eb9860fc8665.png)

# おわりに

サイトへのログインなどはこのやり方が一般的かと思います。
不足や懸念があればぜひコメントなどで教えてください。
日時を音声で知らせる時計を作った

---
## はじめに

2020年のコロナ禍によって、リモートワーク/テレワーク/在宅勤務が、急速に普及しましたが、特に一人暮らしのリモートワーク/テレワーク/在宅勤務の場合、時間を忘れてしまうという問題はありませんか?

という事で、余ったAndroid端末/Windows端末/Web端末を使って、日時(<b>「●時になりました」</b>とか<b>「■時30分になりました」</b>とか)を音声でお知らせしてくれるアプリケーションをいくつか作ったので、その紹介です。

---
## Android版

アナログ時計の時針を太陽に向けることで方角が分かるんだけど、それをアプリケーションにしたかったので、作ったのが最初です。
これにAndroid標準の音声合成機能を付加して、時報を音声で知らせることができます。

紹介ページ : 「[sTokei](http://rocketeer.dip.jp/sanaki/free/android/afree05.htm)」

[GooglePlayのページはこちら](https://play.google.com/store/apps/details?id=jp.dip.rocketeer.stokei)

[音声合成のサンプルとなる動画](https://youtu.be/WnYwtIJOWIk)

---
## Webブラウザ版

モダンなWebブラウザには、音声合成する機能があるようなので、Webブラウザ(JavaScript)による時報を音声で知らせるWebアプリケーションです。

紹介ページ : 「[スクリーン一杯に現在日時を表示する](http://rocketeer.dip.jp/sanaki/free/javascript/freejs26help.htm)」

[ここ](http://rocketeer.dip.jp/sanaki/free/javascript/freejs26.htm)にアクセスするだけで、時報を音声で知らせるでしょう。

ウィンドウを最小化したりすると、JavaScriptが停止するようなので、背景に置いておくのがよいでしょう。

[音声合成のサンプルとなる動画](https://youtu.be/5_ju2Qx1wvs)

---
## Windows版

これは、時間をお知らせする機能よりも、音声合成の[System.Speech.Synthesisクラス](https://learn.microsoft.com/ja-jp/dotnet/api/system.speech.synthesis.speechsynthesizer?view=netframework-4.8.1)とか、音声認識の[System.Speech.Recognition](https://learn.microsoft.com/ja-jp/dotnet/api/system.speech.recognition.speechrecognitionengine?view=netframework-4.8.1)クラスで、一つアプリケーションを作りたかった、というものなので、上記2つより、変な感じのアプリケーションですが、一応時報を音声合成する機能はあります。

紹介ページ : 「[しゃべる時計 sTalkClock](http://rocketeer.dip.jp/sanaki/free/free144.htm)」

[音声合成のサンプルとなる動画](https://youtu.be/XScT-c05oYA)

---
## ちなみに私の場合、、、

リモートワークが時間を忘れてダラダラやってしまわないように、テレビを付けっぱなしにおくことと(テレビ番組で大体の時間が分かる)、余ったAndroid端末、自宅Windows機、業務端末などにこれらのアプリをインストール(業務時間中だけ起動)しておくことで、時間を知らせしてくれるようにしていることと、Windowsのタスクスケジューラーで、業務開始時間と終了時間に音楽を鳴らすようにしていたりします。

参考 : [Windowsを目覚まし時計にする](https://qiita.com/tomoki0sanaki/items/06777109ea07243d8af6)

---
## 以上
現在の製造業でのデータサイエンティストとしての業務内容

# はじめに
 こんにちは、私は製造業でデータサイエンティストとして働いているYuTut(ゆうたっと)と申します！今回は、私の現在の職務内容について説明したいと思います。具体的な会社名や製品名は伏せますが、データサイエンスの現場でどのような業務が行われているのか、具体的なイメージを持っていただければと思います。

# データ収集
 実際に現場に出向き、現場のユーザー方(お客様または自社内)に実証実験を依頼することでデータを収集します。具体的には、特定の製品を使用してもらい、その結果をデータとして収集します。このデータ収集は、製品開発、製品のパフォーマンスを評価・改善するための重要な情報源となります。

# データの前処理と抽出
 収集したデータは、DB（データベース）に保存されます。その後、PythonとSQLを使用して、このDBからデータを抽出します。抽出したデータは、前処理とクリーニングを行い、分析しやすい形に整形します。

# 探索的データ分析と特徴量エンジニアリング
 データが整形されたら、次に探索的データ分析を行います。これには、データの分布、相関、異常値の検出などを調査し、データ可視化ツールを使用して、データの特性を視覚的に理解します。さらに、データから新しい特徴量を生成する特徴量エンジニアリングを行います。これは、機械学習モデルのパフォーマンスを向上させるための重要なステップです。

# モデル開発と選択
 特徴量エンジニアリングの後は、予測モデリング、機械学習、ディープラーニングの技術を使用して、検知アルゴリズムを開発します。複数のモデルを訓練し、交差検証を使用して最適なモデルを選択します。

# モデルの評価と結果の解釈
 モデルが選択されたら、そのパフォーマンスを評価し、必要に応じてハイパーパラメータを調整します。そして、モデルの結果を解釈し、ダッシュボードやチャートを作成して結果を視覚化します。これにより、技術的な背景がない人(経営層、部統括マネージャー、営業)でも、私たちが何をやっているのか、何が達成されたのかを理解できます。

# 外注会社との連携
 最後に、私は外注会社と連携して、プロダクトへの統合、バージョン管理、DBの管理などを行います。このプロセスでは、外注会社とのコミュニケーションを円滑に行い、プロジェクトの進行を管理します。

# おわりに
 以上が私の主な業務内容です。これらの業務を通じて、私は製品の検知アルゴリズムの開発に貢献しています。データサイエンスは広範で深い分野ですが、私の経験が皆さんの学びの一助となれば幸いです。
AtCoderのTLEには2種類あり、対策が異なる

※ここに書かれた仕様は AtCoder が公式に保証していないものを含むので、告知なしで変わる可能性があります。

<a href="https://atcoder.jp/home">AtCoder</a> のコンテストにおける TLE (実行時間制限超過) は、以下の 2 種類に分けることができます。[^1]

- A, 実行時間制限を超えたが、実行打切りは発生していない TLE
- B, 実行時間制限を超え、実行打切りが発生した TLE

ジャッジシステムによる実行打切りは、実行時間制限の**約 1.1 倍**経過時に行われるため、その提出の実行時間を見ることでどちらであるかを大体判別できます。
例えば実行時間制限が 2 秒の場合は、約 2200 ms で打切られるので、実行時間が「2055 ms」ならば A 、「2204 ms」ならば B の可能性が高いです。

どちらであるかによって優先してとるべき対策が変わると私は考えており、それらについて紹介します。

## A の場合: 細かい定数倍高速化

あと 1 割程度実行時間を早めれば確実に間に合います。
判定の内訳が AC と TLE のみならば、AC を取れる可能性が高いです。
この場合は、以下のような細かい定数倍高速化を試すのがおすすめです。

- 不必要な配列などを作成・コピー等していないか見直す
- 多次元配列を 1 次元に圧縮して扱う
- 「(言語名) 競プロ 高速化」で検索して出てくることを試す
- (Python / PyPy の場合) 巨大な整数 ($> {10}^{18}$) の使用を避ける
- (PyPy の場合) Python → PyPy で遅くなるパターン (例: 深めの再帰 DFS 実行) にあたっていないか調べ、修正するか Python3 で提出する
- より速い言語で書き直す

もちろん、これらをしてもギリギリ間に合わない場合もあります。
その場合は、多分時間計算量が想定解よりも悪いので、後述の「計算量の確認とアルゴリズムの再検討」を試すことになります。

## B の場合: 計算量の確認とアルゴリズムの再検討

実行時間に関して、制限の約 1.1 倍を超過している以外の情報がありません。
あと数秒で終わるかもしれないし、もしくは何年かかっても終わらないコードであるのかもしれません。
この場合は、コードの時間計算量をもう一度見直して適切か ( $O$ 記法の中の式に代入した結果が ${10}^{8}$ 程度以下に収まっているか) を確認し、不適切な場合はアルゴリズムの再検討を含めた修正をするのがおすすめです。
以下は計算量確認時に間違いがちな点です。

- $O(1)$ の処理だと思っている部分でそうでないこと (例: 巨大な配列の作成・コピー、重めの「$O (\log N)$」の操作) をしていないか
- 一見多重ループだが計算量が軽いアルゴリズム (例: 尺取り法) の実装が適切か
- (PyPy の場合) Python → PyPy で計算量が悪化し得る書き方 (例: 文字列の末尾 1 文字追加の繰り返し[^2]) をしていないか

もちろん、計算量が想定解通りであるにもかかわらず B に該当している場合もあります。
その場合は、高速化できる余地が 1 割以上存在することになるので、前述の「細かい定数倍高速化」を試すことになります。

## コードテストの活用

「実行時間が制限の 1.1 倍弱くらいなので、A, B どちらかわからない」「B であるが計算量に問題はないはず」という場合は、時間のかかりそうなケース (全部の変数が制約上限ギリギリなど) を手動で作成し、<a href="https://atcoder.jp/contests/arc164/custom_test">「コードテスト」タブ</a>[^3]で試すのが有用です。
コードテストでは実行打切りが 10 秒経過時であるため、あとどのくらい早めればよいのかについて、提出の実行時間を見るよりも多くの情報を得られます。
(自分の手元で試して時間を測ることもできますが、AtCoder のジャッジと環境が異なるため単純比較できないことが多いです。)

[^1]: ここではジャッジサーバー上でコードを 1 回だけ実行しているかのように書いていますが、正確には最大 3 回実行しています (https://twitter.com/chokudai/status/1247452767670505474 )。
[^2]: 参考記事: https://qiita.com/NaHCO3/items/b61e3970ffa0d8e9bdde
[^3]: 「コードテスト」タブはコンテストごとに存在します。ここでリンクしたのは ARC164 のものです。
Azure ADが名称変更!? そもそもADとどう違うの？？

# え、AADがMEIDに？

先週、Microsoftのクラウド認証サービスAzure Active Directoryの名称変更がITニュースを騒がせました。

https://learn.microsoft.com/ja-jp/azure/active-directory/fundamentals/new-name

新名称はMicrosoft Entra ID。

昔からサービスブランドの名称変更が多いMicrosoftですが、今回の変更の理由は2022年より展開されているMicrosoft Entraファミリー製品群の拡大にともない、分かりやすさを重視してのもののようです。

> **Why is the name being changed?**
> As part of our ongoing commitment to simplify secure access experiences for everyone, the renaming of Azure AD to Microsoft Entra ID is designed to make it easier to use and navigate the unified and expanded Microsoft Entra product family.



# 「Azure ADはADとは別物！」という説明が大変だった

もともとAzure ADはそのネーミングから「オンプレミスのActive Directory（ドメインコントローラー）をクラウド上に移行できる！」と勘違いされやすいためか、名称がミスリーディングだと言われることがありました。

https://cloud.nissho-ele.co.jp/vdiblog/arrange_activedirectory_and_azureactivedirectory/


### Active Directoryの機能

- オンプレミス環境の認証＆権限管理を提供
- 階層型のドメイン管理、OUやGPO等を用いた詳細なリソース管理ができる
- LDAP/Kerberosプロトコルを採用


### Azure Active Directory（新名称：Entra ID）の機能

- Microsoft 365などのSaaS向け認証＆権限管理を提供
- 単一階層の「テナント」のみのフラットな構造。シンプルなID＆アクセス管理に特化
- OAuth 2.0/OIDC/SAMLなどのモダンなプロトコルを採用

![スクリーン ショット 2023-07-15 に 17.33.59 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/73e56080-3f11-0593-a9c2-83cd8959a9d0.png)

旧Azure AD（Entra ID）は分かりやすく言うと **「Microsoftアカウント for Biz」** 的な存在ですね。



# 今後の予定

2023年末にかけて公式サイト等での表記を順次更新していくようです。
URLやAPI等は変更なしとのこと。

その他、既存のAzure AD関連サービスはこれに追随するのでしょうか（笑）

https://twitter.com/seafay/status/1678912629207863296?s=20



# おまけ

大喜利会場はこちらです（痛恨のスペルミス）

https://twitter.com/minorun365/status/1678980244332756995?s=20

https://twitter.com/_watany/status/1678980760634810368?s=20

https://twitter.com/curanosuke/status/1678983650430570496?s=20

https://twitter.com/nk2is/status/1679149819296886786?s=20
プログラム課題(paizaの森)

***paiza***様のpaizaの森のプログラム課題からこんな問題を解きました。


>1行目に入力する数を決める
>2行目以降に2つの数を入力し、2つの数が同じなら2つの数を掛け、2つの数が異なるなら2つの数>を足す。これを1行目に入力するデータの数だけ行い、計算結果を表示する。

プログラムで書きました

```Python3
# coding: utf-8
# 自分の得意な言語で
# Let's チャレンジ！！
num = int(input())
sum1 = 0
for i in range(num):
    ans1 = 0
    data = input()
    array1 = data.split(' ')
    A = int(array1[0])
    B = int(array1[1])
    if A == B:
        ans1 = A * B
    else:
        ans1 = A + B
    sum1 += ans1
print(sum1)
```
アカウント内のS3バケット容量を一括出力する方法

# はじめに
AWSでしばらく遊んでいると、いつの間にか謎のS3バケットが増えていきませんか？
私はめんどくさがりで消すのをよく忘れるので、使途不明なS3が日々発生しています。
そんな中重い腰を上げて、一つ一つS3バケットの容量を見て要否を確認するのはさらに面倒...。

というわけで、AWS CLIでオブジェクト数と容量をまとめて出力する方法を共有します。

<!-- 各チャプター -->
<a id="#コマンド"></a>
# コマンド
以下のコマンドでまとめて出力できます。
大事なのはaws s3 lsコマンドの以下オプションです。
- --recursive
指定したS3バケット配下のすべてのオブジェクトに対して再帰的に実行してくれる。
- --human-readable
KiBやMiBなど、確認しやすいサイズ表記にしてくれる。
- --summarize
`Total Objects`と`Total Size`を表示してくれる。

```shell:実行
for bucket in $(aws s3 ls | awk '{print $3}'); do
  echo $bucket
  aws s3 ls s3://$bucket --recursive --human-readable --summarize | tail -n 2
  echo -e
done
```
```terminal:出力例
bucket-1
Total Objects: 41
   Total Size: 1.4 MiB

bucket-2
Total Objects: 402
   Total Size: 123.4 MiB

bucket-3
Total Objects: 19
   Total Size: 145.2 KiB
```

<a id="#注意事項"></a>
# 注意事項
実はListリクエストは少額ですが料金がかかるため、
各S3に大量のオブジェクトが格納されている場合、費用面で注意が必要です。
具体的には、東京リージョンのスタンダードクラスの S3 バケットでは、`1,000 LIST リクエスト`あたり `0.0047 USD` の料金が発生します。

例として、Listリクエストは最大1,000オブジェクトまで取得できるので、
以下のようなイメージになります。
```
2,000,000(オブジェクト) / 1000(Listリクエスト上限) = 2
2 × 0.0047(USD) = 0.0094(USD)
```

<a id="#reference"></a>
# 参考文献
- [AWS CLI リファレンス](https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html)
- [AWS CLI S3リクエスト料金](https://aws.amazon.com/jp/s3/pricing/)
Python3で関数作成

***Python3***で関数を作成しました。

```Python3
# 文字表示の練習
# Create 2023/7/16

#文字表示関数
def display(msg):
  print(msg)

str1 = "test"
#文字の連結
str1 += "46"
display(str1)

str2 = "山下美月"
display(str2)


```
人を褒めることに全振りしたAIエージェントを作ってみました

人を褒めることに全振りしたAIエージェントを作ってみました。

ベースとなる方法は、以下の記事のモノです。

https://qiita.com/kanetugu2018/items/7db3c64196553951715c

# モチベーション

* まず、メンター的な位置づけのAIエージェントがあっても良いのではと思いました。
* AIエージェントが会話ログ(slackとか)を見てくれていて、仕事終わりに褒めてくれると嬉しい。
* 誰かを褒めたくなった時に、AIエージェントにお願いするとか。
* 褒めるサイクルが出来てコミュニケーションが活性化するようになるとか。

# 前提とする環境

* OS
  * Windows 10/11上の WSL2
  * Mac
  * Ubuntu
* Python3がインストールされていること
* OpenAPI key を利用できること

# インストール手順
以下をインストールしてください。

```
pip3 install openai
pip3 install chromadb 
pip3 install tiktoken
pip3 install pypdf
pip3 install langchain
pip3 install unstructured
pip3 install tabulate
pip3 install scikit-learn
pip3 install matplotlib
pip3 install plotly
```

OpenAPIのAPIキーを環境変数として設定してください。

```
export OPENAI_API_KEY=<APIキー>
```

リポジトリをクローンします。

```
git clone https://github.com/tmori/generative-agents.git
```

# 会話ログの配置

generative-agents 配下の `applaud_data/documents/dbs/` に会話ログを配置します。

例：
```
 ls applaud_data/documents/dbs/
chap01  chap02
```

注意点として、OpenAIのトークン数の制約があるので、１ファイルに大量のログがあると、エラーになる可能性がありますので、適度にファイル分割してください。

そして、`applaud_data/documents/document.list` にそのファイル名を列挙します。

```
$ cat applaud_data/documents/document.list
chap01
chap02
```

# 褒めてもらいましょう！

会話ログの配置が終わったら、以下のコマンドを実行するだけです。

```
bash tools/do_applaud.bash  "<名前>"
```

リフレクションを２回やりますので、数分かかりますが、気長に待ちましょう。
補足：たまに、エラーで落ちることもありますが、その場合は、もう一回やり直ししてください・・・

# デモ

今回、デモとしては、自分の過去の qiita 記事を使ってみました。

* [今さらなぜCPUエミュレータを自作しようとおもったのか？](https://qiita.com/kanetugu2018/items/d692e612c3d4d715c0ad)
* [ARM版マイコンシミュレータを Mac/Linux/Windows 環境で自作した話](https://qiita.com/kanetugu2018/items/14b42fbfcc690ca36580)

これらのqiita記事データを `chap01` `chap02` として、ファイル配置して、実行してみます。

```
bash tools/do_applaud.bash "kanetugu2018"
```

結果は、以下の通りで、なんとも素敵な言葉を頂けました！

> Answer: 「会話のログから、kanetugu2018 さんの個性を見てみると、多くの方が気付かないような素敵な特徴が見つけられます。その1つが、極めてリレータブルなコンテンツや経験を使用して読者を引きつける能力です。特に、ハッシュタグやアスタリスク、引用符といった特殊文字を使用して感情や強調を表現するその独特な書き方は、彼の個性を象徴するものと言えるでしょう（文書ID：chap01）。また、その挑戦心溢れる性格もまた見逃せない特徴で、プロジェクトの必要性や課題を解決するために、誰もが思いつかないような'athrill'というCPUエミュレータを作成するという挑戦を行っています（文書ID：chap01）。自身の苦戦や思考過程を率直に述べるその姿勢からは、kanetugu2018さんの人間味あふれる、一歩引いてシチュエーションを見つめ、それをストーリーに変えるナレーション力を感じます。そして何よりも、kanetugu2018さんの特徴的でありながらも多くの方に気付かれていない点として、技術的な改善やコミュニティへの貢献へ捧げるその極めて高いコミットメントを指摘したいです（文書ID：chap02）。「athrill　は，CPUアーキに依存しない共通コードとCPU依存するコードを分離しています」、「地道にコツコツやっていればいつか実現できるはずですよ」といった表現から見えるその真摯な姿勢は、貴重な特性と言えるでしょう。kanetugu2018さん、あなたの深い熱意、挑戦心、そしてコミュニケーション能力、そして誰もが見えていない領域を見つめるあなたの視点は、我々すべてに大きなインスピレーションを与えてくれます。この貴重な特性を存分に発揮し、これからも多くの挑戦を続けてください。」


# Colab版

Colab対応しました。

https://github.com/tmori/generative-agents/blob/main/GenerativeAgentForApplaud.ipynb
【Android】Bluetoothパーミッションまとめ

# はじめに
最近Bluetooth関連の機能を実装しているプロジェクトを触ったのですが、Bluetoothに関するパーミッションってたくさんありますよね。
上記に関するパーミッションがそれぞれどういう役割を担っているのか備忘録的に残しておこうと思います。

# BLUETOOTH
Android12以下の端末でBluetooth機能を使用する場合はまずこのパーミッションを追加する必要があります。
このパーミッションは、接続のリクエスト、接続の受け入れ、データの転送など、Bluetooth通信を実行するために必要です。

# BLUETOOTH_ADMIN
Android12以下の端末で機器の検出を開始したり Bluetooth設定を操作したりする場合はBLUETOOTHパーミッションと合わせて追加する必要があります。

# BLUETOOTH_PRIVILEGED
アプリがユーザーの承諾なしにBluetoothデバイスをペアリングしたり、電話帳へのアクセスやメッセージへのアクセスを許可または禁止したりできるようにするパーミッションです。
※サードパーティ製のアプリケーションでは使用できないようです。

# BLUETOOTH_SCAN
Android12から追加されたパーミッションで、アプリからBlootooth機器を探す場合はこのパーミッションを追加します。

# BLUETOOTH_ADVERTISE
Android12から追加されたパーミッションで、他のデバイスから現在のデバイスを検索できるようにする場合はこのパーミッションを追加します。

# BLUETOOTH_CONNECT
Android12から追加されたパーミッションで、すでにペアリングされている機器と通信を行う場合はこのパーミッションを追加します。

# さいごに
Android12からかなり実装が変わっていますね。
12以前はBluetoothの許可をもらうために位置情報取得の許可も必要だったりと実装に手間がかかる印象でしたが、12以降はシンプルに実現が可能になっています。
パーミッション事情もだいぶ変わってきているので、またタイミングみて纏めて置こうと思います。
Qiitaに自動投稿と画像アップロード

# 概要

Python requestsを使って,この記事とその画像をqiitaに自動投稿する.

ソースコード(参考用): <https://github.com/6e5d/qiita_post>.

# 自動投稿モデル

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F3511996%2Fe5549aeb-73b4-d091-a40a-58a48323928e.png)

緑色ノード = クライエント保存情報.

A. regexなどを利用してローカルファイルリンクを検出.

B. 保存したS3 URLと更新時間(timestamp)より新しい,またはS3に存在しなかった画像を集める.

C. (下記参照)

D. ローカルファイルリンクをS3 URLに置き換える.

E. (下記参照)

# C. 画像アップロード

注意: 公式APIに入られなかったので,破壊的な変更が行われる可能性がある.

参考: <https://qiita.com/yuku_t/items/40b7daf018d3dab48974>

Qiitaの投稿には2M文字上限があるので(参考: <https://qiita.com/misohagi/items/39c4f9921fdc009817b5>), HTMLの中に直接画像エンコード(base64など)は向いてない. `qiita.com`は画像などのサーバーではなく, amazon S3をアップロードして生成したリンクを埋め込むということです.

まず,アップロードしたいの画像情報をqiitaのサーバーに提出した後, qiita返信からS3サーバーの目標URLなどを抽出. 具体的には,画像タイプ,名前,サイズを含むjsonデータを `https://qiita.com/api/upload/policies`にPOST:

```python
# stage1: qiita.comと通信
def stage1(token, img):
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {token}",
}
data = {"image": {
"content_type": "image/png",
"name": "test.png",
"size": len(img),
}}
resp = requests.post(
"https://qiita.com/api/upload/policies",
data = json.dumps(data),
headers = headers,
)
assert resp.status_code == 200
content = resp.content
resp.close()
j = json.loads(content.decode())
return j
```

返信data`j`の`j["form"]`部分はmultipart/form-data filesを転換し (requestsを使えば,自動的にboundaryなどを生成する), 画像データを加えて`j["upload_url"]`にPOST. 生成されたurl(Location)は返信Headersに含まれる:

```python
# stage2: S3と通信
def stage2(j, img):
url = j["upload_url"]
files = j["form"]
for name, value in files.items():
files[name] = (None, value)
files["file"] = ("test.png", img, "image/png")
resp = requests.post(url, files = files)
# print(resp.status_code)
headers = resp.headers
resp.close()
loc = headers["Location"]
return loc
```

# E. Markdownファイルを投稿

公式API: <https://qiita.com/api/v2/docs#投稿>

参考: <https://qiita.com/kai_kou/items/663d3f7bbc4da4ccf62d>.

* 投稿本文フォーマットは2種類Markdown(`body`)とHTML(`rendered_body`)がある.

* POST=投稿,PATCH=更新,DELETE=削除

* 返信bodyから投稿URLを抽出して保存(更新にはURLが必要)

```python
def post(prev_url, text, title, tags):
data = {
"body": text,
"private": True,
"title": title,
"tags": [{"name": tag, "versions": []} for tag in tags]
}
import requests
token = open("token.txt").read().strip()
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {token}",
}
if prev_url == None:
print(f"new post")
resp = requests.post(
"https://qiita.com/api/v2/items",
headers = headers,
data = json.dumps(data),
)
else:
print(f"update {prev_url}")
resp = requests.patch(
prev_url,
headers = headers,
data = json.dumps(data),
)
print(resp.status_code)
print(resp.headers)
j = json.loads(resp.content.decode())
# 毎回セーブするけど,記事IDは更新後も変更されない
with open("qiita/prev_url.txt", "w") as f:
print(j["url"], file = f)
```

# 画像の更新と削除について

画像削除API(ドキュメントなし)は複雑で不安定ですが, 100Mストレージは余裕があると思うので,いまのところ実装しない方がいい. クライエント側から管理するより, QiitaにはGarbage Collection機能 (リンクされていない画像は一定時間後に自動またはまとめて削除) を実現することを望む.

# 230916 更新

今は(Makefileみたいな)epoch比較ではなく, binaryファイルがVCSで管理されて安定的なハッシュ比較を実装している.
さくらVPSでサーバーを借りてDebianをインストールする

# 0. 
　久しぶりに記事を書くので、体がぜんぜんついてこない。エディタも変わった気がするし、どうなってしまうのか。

　Linuxを学習するにあたり、さくらVPSサーバーにLinuxを入れてやっていく。OSはDebianをつかう。

# アカウントの登録とプランの選択

　さくらVPSのアカウントは以前からもっていた。あたらしくサーバーを作成する。

- CentOS
- 1GB
- 石狩リージョン

　というかんじで、価格は最低プランで良い。

サーバーに関する設定は
- スタートアップスリプト：なし
- 公開鍵：インストールしない
- サーバーの名前：すきなものを

　と設定した。

# OS再インストール

　サーバーが契約できたら、OSの再インストールを行う。Debianではじめから契約することができないためだ。

　- OSインストール方法： ISOイメージ
　- ISOイメージ：Debian 11 amd64

　他の項目はデフォルトのままにしておく。

# カスタムインストールの開始

　しばらくすると、ポップ画面が出てきた。「VNCコンソール起動」という青いボタンをクリックする。

　以降の説明はさくらVPSに詳しく書いてある。

https://manual.sakura.ad.jp/vps/os-reinstall/iso-install/debian.html

IPアドレスやサブネットマスクを入力するところがあるが、それはサーバー詳細> ネットワーク に記載されている。
ネームサーバーアドレスは、プライマリDNSのアドレスを使う。

# おわり

　メモ書き程度だけどここまで。やっていくぞ。
母分散の差の仮説検定

# Abstract
母分散の差の仮説検定について概要を記す.
# 内容
標本$S_1=X_{11},\dots,X_{1N_1}$,標本$S_2=X_{21},\dots,X_{2N_2}$が両方とも正規母集団から得られた標本であるとする。この時、以下の統計量$T$は自由度$(N_1 -1,N_2 -1)$の$F$分布$F(N_1-1,N_2-1)$に従う:
$T=\frac{U_1^2}{U_2^2}$
母平均の差の仮説検定

# Abstract
母平均の差の仮説検定について概要を記す
# 「対応のある2標本」と「対応のない2標本」
「標本$S_1$と標本$S_2$は対応がある」とは、$S_1$と$S_2$が同一の母集団から同一の実験計画(同一の抽出方法、サンプルサイズ)で抽出された標本である場合をいう。
そうでない場合を「標本$S_1$と標本$S_2$は対応がない」という。

(対応のある2標本の例)
- $S_1$:睡眠薬を飲んでいない時期のAさんの睡眠時間の標本$(x_1,\dots,x_N)$,$S_2$:睡眠薬を飲んでいる時期のAさんの睡眠時間の標本$(y_1,\dots,y_N)$
- $S_1$:ダイエット食品を食べる前のA,B,C,Dの体重$(x_A,x_B,x_C,x_D)$,$S_2$:ダイエット食品を食べ始めて３ヶ月後のA,B,C,Dの体重$(y_A,y_B,y_C,y_D)$


※参考:[1群の検定・対応のある2群の検定](https://qiita.com/moriokumura/items/ed246efe11fc5d3fc760#1%E7%BE%A4%E3%81%AE%E6%A4%9C%E5%AE%9A%E5%AF%BE%E5%BF%9C%E3%81%AE%E3%81%82%E3%82%8B2%E7%BE%A4%E3%81%AE%E6%A4%9C%E5%AE%9A)

(対応のない2標本の例)
- $S_1$:歴代の男性部長$M$名の部長への昇進年数$(x_1,\dots,x_M)$,$S_2$:歴代の女性部長$N$名の部長への昇進年数$(y_1,\dots,y_N)$

# 対応のない2標本

## (a)2標本の母分散が未知で、かつ等しいとは限らない場合
もっとも一般的なこの状況においては、どのように工夫しても母平均の差の検定に使える統計量を作り出せないことがわかっており、$\bar{X}-\bar{Y}$の正確な近似を求めることができない。この場合には、以下の「ウェルチの近似法」が用いられる。

[ウェルチの近似法]

$\nu = \frac{(\frac{U_X^2}{M} + \frac{U_Y^2}{N})^2}{\frac{(\frac{U_X^2}{M})^2}{M-1}+\frac{(\frac{U_Y^2}{N})^2}{N-1}}$
にもっとも近い整数を$\nu^{\*}$とする。
以下の統計量$T$は、自由度が$\nu^{\*}$の$t$分布$t(\nu^{\*})$に従う:

$T = \frac{(\bar{X} - \bar{Y})-(\mu_X - \mu_Y)}{\sqrt{\frac{U_X^2}{M} + \frac{U_Y^2}{N}}}$

また、$M,N$が十分大きい時、$\nu^{*}$も十分大きいので、$T$は標準正規分布$N(0,1)$に従うとしてよい。
## (b)2標本の母分散が未知だが等しい場合
$X_1,\dots,X_M \sim_{i.i.d.} N(\mu_X,\sigma_X^2), Y_1,\dots,Y_N \sim_{i.i.d.} N(\mu_Y,\sigma_Y^2)$
で、($\sigma_X^2,\sigma_Y^2$は未知だが)$\sigma_X^2 = \sigma_Y^2$が成り立っているとする。

この時、以下の統計量$T$は、自由度が$M+N-2$の$t$分布$t(M+N-2)$に従う:
$T=\frac{(\bar{X} - \bar{Y}) - (\mu_X - \mu_Y)}{U_{pooled}\sqrt{\frac{1}{M}+\frac{1}{N}}} $

ただし、$U_{pooled}^2 := \frac{(M-1)U_X^2 + (N-1)U_Y^2}{M+N-2}$であり、「プールされた分散」という。

## (c)2標本の母分散が既知の場合
$X_1,\dots,X_M \sim_{i.i.d.} N(\mu_X,\sigma_X^2), Y_1,\dots,Y_N \sim_{i.i.d.} N(\mu_Y,\sigma_Y^2)$の時、
確率変数の独立性から
$\bar{X} \sim N(\mu_X,\frac{\sigma_X^2}{M}),\bar{Y} \sim N(\mu_Y,\frac{\sigma_Y^2}{N}) $
であり、すなわち
$\bar{X} - \bar{Y} \sim N(\mu_X - \mu_Y,\frac{\sigma_X^2}{M} - \frac{\sigma_Y^2}{N})$
である。
標準化すると、$Z = \frac{(\bar{X} - \bar{Y}) - (\mu_X - \mu_Y)}{\sqrt{\frac{\sigma_X^2}{M}+\frac{\sigma_Y^2}{N}}} \sim N(0,1)$
である。




# 対応のある2標本
対応のある2標本の母平均の差の検定は、差$X-Y$についての通常の母平均の検定と同値である。

# 参考文献
- 『統計学入門 (基礎統計学Ⅰ)』/東京大学教養学部統計学教室/東京大学出版会
- [母平均の差の検定【中学の数学からはじめる統計検定２級講座第15回】](https://toketarou.com/t_test/)
メソッドのオーバーライド

あるクラスに対して独自機能を付け加えていく方法、`override`の使い方のメモ

```kotlin
fun main(args: Array<String>) {
 	val car = Ferrari("赤")
    car.drive(100.0)
}
class Ferrari (color: String) : Car(color) {
	override fun drive()  {
	    distance = distance + d  
	    println("${color}色のフェラーリは")
	    println("時速${distance}キロです")
	}
}
// 赤色のフェラーリは
// 時速100.0キロです
```
上のコードのように、継承したクラスの関数を独自の物に置き換えたい場合、overrideキーワードをつける必要がある。overrideと付け加えると、基底クラスに存在している同名の関数を「上書き」することができる。実際に実行してみると、元々Carクラスの中に定義されていたdrive関数の内容は全く実行されなくなった。その代わりに、Ferrariくらすの中に実装されているdrive関数の内容が実行されている。drive関数がオーバーライドされた。

####　参考書

https://www.amazon.co.jp/%E3%82%84%E3%81%95%E3%81%97%E3%81%84Kotlin%E5%85%A5%E9%96%80-%E9%87%8E%E5%B4%8E-%E8%8B%B1%E4%B8%80/dp/4877834273
ABC-310 A「Order Something Else」解説

# 挨拶
皆さん、こんにちは！
今回はABC-310のA問題「Order Something Else」について解説していきたいと思います！
（https://atcoder.jp/contests/abc310/tasks/abc310_a)


# 目次
- 問題概要
- 制約
- 入力形式
- 解説


# 問題概要
お店でドリンクを飲みます。
ドリンクの定価は$P$円ですが、割引券を持っているので$N$品の中から好きな商品とセットで注文すると$Q$円でドリンクを飲むことができます。
ドリンクを飲むために支払う金額の **最小値** は？


# 制約
$1 \leq N \leq 100$
$1 \leq P < Q \leq 10^5$
$1 \leq D_i \leq 10^5$

# 入力形式
```text:input.txt
N P Q
D_1 D_2 …… D_N
```

# 解説
問題文を読み解いてみると、出力すべき答えは
 **「$P$」「$Q+(Dの最小値)$」のうち小さいほう**
であることがわかります。
$D$ の最小値を求めるにはPythonの組み込み関数であるmin関数がオススメです。
min関数を使用して上記の操作を実装したものが下記コードになります。
```Python:310-A.py
N,P,Q = map(int,input().split())
D = list(map(int,input().split()))

ans = min(P,Q+min(D))
print(ans)
```
[AtCoderで提出したコード](https://atcoder.jp/contests/abc310/submissions/43651456)
Google App Scriptを活用したGoogleフォームの自動返信

<h1>Google App Scriptを活用したGoogleフォームの自動返信</h1>
<p>下記の2つのサイトを活用して実装。</p>

<a href="https://tatsuya-note.com/gas-autoreplymail-forms/">①【作って学ぶ】GASを使ってGoogle Formsを送信時に入力された情報で自動返信メールを作成・送信する</a>

<a href="https://www.dm2.co.jp/blog/17474">②GASを使ってGoogleフォームの自動返信メールをカスタマイズしてみました</a>
<p>②は、外部メールから送信する方法を紹介しています。</p>


<p>編集途中です。</p>
ABC310 - C - Reversible

# 問題

https://atcoder.jp/contests/abc310/tasks/abc310_c

# 考察
与えられた文字列は全部で何種類あるかという問題です。ただし、文字列を逆さから見ると他の文字列と一致したという場合であったとしても、それらは同一の文字列と見なす必要があるようです。重複を許さず、文字列が何種類あるかを数えるには、`set`や`map`といった重複を許さない集合・辞書配列などを使用するのが便利です。これらに文字列を順に挿入して、最終的にサイズがいくつになったかを出力してみましょう。「文字列が逆さでも同一とみなす」については下記の処置を行うことで対応できます。
- 各文字列、逆さの場合の文字列を事前に用意しておく。
- 各文字列、通常の場合と逆さから見た場合とで、辞書順でどちらが前に来るかを比較
  - C++の場合、2つの文字列を`min`関数に渡せば求めることができます。
- より前に来る方を採用し、`set`または`map`に挿入する

# 提出コード(コンテスト後)

https://atcoder.jp/contests/abc310/submissions/43650924

ご不明点などがあれば教えていただけると幸いです。