OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidStudioでビルドが通らない時の解決方法

## はじめに
AndroidStudioで開発しているとたまに以下のようなエラーが発生してビルドが通らなくなったりします。

```
Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
```
そんな時に僕が試している解決方法を備忘録として残しておきます。

## キャッシュの削除

File → nvalidate Cashesを選択。
![スクリーンショット 2024-04-14 15.56.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113615/1b0a2008-7d1a-aa35-e5b2-12ab2e5a5deb.png)

キャッシュをクリアする項目を選択してから、Restart。
![スクリーンショット 2024-04-14 15.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113615/6294dd55-5589-cddb-5627-50fd5357222e.png)

## gradleのバージョンを合わせる
まずはbuild.gradleファイルを開いてgradleのバージョンを確認します。
![スクリーンショット 2024-04-14 16.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113615/cd7f5a6d-6f32-ffbd-0d23-70f01433bfe8.png)

File → Project Structure → Projectを選択して、Gradle Versionを合わせます。
![スクリーンショット 2024-04-14 16.14.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113615/7ef8745a-dbfe-552b-afb9-4e4ae343d292.png)

## JDKのバージョンを修正
File → Setting → Build Tools → Gradleを選択。
使用したいGradle JDKを選択。
![スクリーンショット 2024-04-14 16.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113615/36bf83b3-7e44-dfc0-eff5-54d3737f455b.png)

## 不要なmoduleを削除
File → Project Structure → Dependenciesを選択。
![スクリーンショット 2024-04-14 16.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113615/a3100472-7662-1df9-5e1e-3d0787c1e417.png)

不要なものがある場合は赤線が表示されるので、マイナスを押して削除しましょう。

## appモジュール配下の.buildディレクトリを削除する
![スクリーンショット 2024-07-04 11.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113615/f4044d4d-0560-7b41-4fb5-093d208453fb.png)

## 最後に
困った時は試してみてください！
さくらのレンタルサーバから送信したメールがGmail側で受信されない

## 起こった問題
* さくらのレンタルサーバから送信したメールがGmail等で受信できない
* 携帯キャリア(ドコモ)も同様に受信できない(**テスト不十分**)
* Outlook2021、さくらのレンタルサーバ側のWebメール等のメーラー経由から送信したメールもGmailで受信できない
## 問題が起こった条件
* さくらのレンタルサーバ
* ```xxxxxx@xxxx.sakura.ne.jp```形式の初期ドメインなメールアドレス
* SPFレコード、DKIMレコード、DMARCレコード設定済
* DMARCポリシーは```quarantine```を設定
* PHP(v8.3)でPHPMailer(v6.9.1) を用いて送信
* PHP側のソースにSender ```$send_mail->Sender = "foo@bar.com";```を追記
![名称未設定0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349992/de4fe98f-77db-1e10-f140-f2eeb4e323e4.png)

さくらのレンタルサーバ側の設定
## 解決方法
* さくらのレンタルサーバ側の設定からSPFレコードを解除
![名称未設定1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349992/416b9d85-fc69-07cc-6cbf-bec7049659fd.png)

**だけです。多分。**
解決に時間が掛かりましたが何とか行きそうです。やれやれ。
**ただ、Gmail側には迷惑メールとしてボックスに入っていたので迷惑メールもチェックしましょう**
困っている方がいましたらお試しください!
vscodeでjupyter notebookを使う

めも
・vscodeをインストール
・vscodeでpythonとPython Extensionとjupyterをインストール
・pyenv+virtualenvをインストール
・jupyterのkernelにpyenv+virtualenvで作った仮想環境を登録する
・vscodeでipynbをひらき上右からkernelを作成した仮想環境に変更
・vscodeの左下からpythonのinterpreterを作成した仮想環境に変更
【RotorHazard】Raspberry Pi 3Bを動かす上での準備と予備知識

# 14. ラズパイを使った専用機の作成

この記事はFPVドローン ラップ計測システム【RotorHazard】をRaspberry Piで作成するにあたってのTipsをまとめたものです。ですが一般的なラズパイ構築方法としても参考になるかと思いますので、ぜひご活用ください。

### 14-1. RotorHazard ラズパイ版を作成するにあたって…

えー。ちょっとここからは、忘れないように順番がきっちりしているか？は怪しいのですが、少し鮮度があるうちに？書き連ねていければと思っています。

RotorHazardは、実は機能がONになっていないと画面が出てこないという問題がちょっとあったりします。例えば温度関連センサーだったり、LED関連項目だったりと関連項目やメニューも見る事はできないのです。その為に翻訳をより精度良く仕上げるには…PC版だけでなくラズパイ版をも手をかけないといけないかな？と思っていました。

そんな時に『RotorHazard PCB1.2基板を送りましょうか？ハンダも得意でないとの事で完成品をお送りしますよー。(RX5808モジュールは4つほど、代替で郵送いただければ問題ないっす)』と[ninjaMoonLight](https://twitter.com/masaaki_oyama) さんからのお声掛けがっ！

※こちらがRotorHazard専用設計基板の1つ **RH PCB rev.1.2**。1枚で4つのRX5808モジュール、最大2段積みによる8波同時処理が可能になるアイテムでGitHubにてデータ公開しています。欲しい方は、既にRotorHazardを自作されている方々にお問い合わせいただくと、もしかしたら手元にご自身で発注された際の在庫(余り)があるかもしれません。(実は中国の某PCBオーダーショップさんでオーダーしますと、5枚までお値段変わらずとなる為)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/37e390a7-f523-e83b-b7fc-79af15658007.png)

https://github.com/RotorHazard/RotorHazard/blob/main/resources/PCB/README.md

おぉぉ！一番難易度の高い…その部分を完成品で仕上げてくれるなんて、私にとっては天から何かを求められているのかしら？と思いｗ(うぬぼれ？) ちょっと甘えさせてもらって、今回PCB1.2基板(完成版)を手に入れる事となりました。

ですが、それを動かすラズパイを手に入れなければ…。
ヤフオク等ちょっとさまよってみたものの、ちょうど時期が悪いせいか？良品と感じるものを見つける事ができず、またラズパイ4の新品は高いし、先日発売されたラズパイ5の新品となると、Intel N100 ミニPCが買えてしまうのではないか？という高価なものであまりラズパイでやる価値を見出せず…。

そんな時にちょっと思い出したのです！

RotorHazard日本語化を実施するにあたり、最初にきっかけをいただきました [Yanazoo](https://twitter.com/yanazoo) さんには以前、『もしラズパイ使うようであればお声掛けください。手元にだぶらせているものがありますのでー』とお話していたのを思い出しました。そこでご連絡。日本語関連開発に是非お使いください！とありがたいお言葉ぁぁ！結果として無償で提供いただける事となりました。マジでありがたい限りです。

こんな形で皆様から応援されたのもあり、今後RotorHazardを何か進める上での手引きになればとラズパイ関連Tipsを書き残しておきます。


### 14-2. まずはラズパイを動かす上で、色々な準備を！

皆さん、Raspberry Piってご存じっすかね？ここでは背景や歴史的な内容、機器のグレードやスペック等に関しては割愛致します。今回 [Yanazoo](https://twitter.com/yanazoo) さんよりご提供を受けたのは **Raspberry Pi 3B** となります。世間では **3B+** がバカ売れし、これぞラズパイのような代名詞のモデルがありましたが、それの1つ前のものになります。ですが今回はこれで全然十分、もしかしたら個人利用であれば2Bシリーズでも良いかも知れませんね。

- Raspberry Pi 3B
- SanDisk Ultra 16GB microSD
- 転がっているUSBキーボード＆マウス
- HDMIケーブル＋ディスプレイ
- microUSBタイプ電源

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/a01de88f-c71c-140a-cf90-414dd3de80aa.png)


何も考えずに利用するならば、microSDカードは32GBがあれば幸せになれると思います。でも何か特殊なことをせずとも16GBでも問題はないものと考えます。それよりも…microSDカードは読み書きが頻繁に起きても大丈夫な高耐久性が謳われているものを是非用意したいところです。私もそこまで気を遣わずとも良いかと最初は思っていたのですが、別件でリアルお仕事に携わっている別拠点のヒトから『ラズパイのmicroSDは、油断すると1ヶ月ぐらいで壊れちゃうパターンあるのでお気をつけて』なんてアドバイスをもらっちゃったのもあり、我が家で一番安心安全？なSanDisk Ultraを使う事としました。
※否、買ってくれば良いのかもしれませんがｗｗｗ

っと前振りを少し書きましたが、次から色々とラズパイ構築レシピを書いていこうと思います。

ラズパイ構築編のつづきはこちら

https://qiita.com/tmac116/items/bb258f4e41ca9da44b45?2
Almalinux9でRundeckを建てる

# はじめに
必要に駆られてRundeckを建てたら驚いた。
Rundeckの名前すらなくなっているとは。

# 前提
iptables,selinux,yum設定済みのAlmalinux9サーバが作ってある前提。

# Rundeckのリポジトリと本体のインストール
ここは公式の手順ほぼそのまま。

```ruby:Rundeckのリポジトリと本体のインストール
curl https://raw.githubusercontent.com/rundeck/packaging/main/scripts/rpm-setup.sh 2> /dev/null | sudo bash -s rundeckpro
yum install java rundeckpro-enterprise
```

# http接続設定
rundeckはそのまま起動してもつながらない(要検証)
なので/etc/rundeck/rundeck-config.propertiesの`grails.serverURL`を変更する。

```ruby:http接続設定
vi /etc/rundeck/rundeck-config.properties

#rss.enabled if set to true enables RSS feeds that are public (non-authenticated)
rss.enabled=false
# change hostname here
grails.serverURL=http://[サーバのIPアドレス]:4440
dataSource.dbCreate = none
dataSource.url = jdbc:h2:file:/var/lib/rundeck/data/rundeckdb;DB_CLOSE_ON_EXIT=FALSE;NON_KEYWORDS=MONTH,HOUR,MINUTE,YEAR,SECONDS
grails.plugin.databasemigration.updateOnStart=true
```

# Rundeck起動
rundeckを起動する。

```ruby:Rundeck起動
systemctl enable rundeckd
systemctl start rundeckd
```

# ログ確認
rundeckは起動までに時間がかかるためログをtailしておく。
`Started Application in XX.XXX seconds (JVM running for XX.XXX)
Grails application running at http://localhost:4440 in environment: production`がでれば起動完了。

```ruby:ログ確認
tail -f /var/log/rundeck/service.log

[2024-04-13T14:46:24,310] INFO  rundeckapp.Application - Started Application in 56.864 seconds (JVM running for 65.876)
Grails application running at http://localhost:4440 in environment: production
```

# 画面確認
なんでもいいのでブラウザに「http://[サーバのIPアドレス]:4440/」といれて画面がでればOK
せっかくなので初期設定していろいろ遊んでみよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092362/c64e9557-d3fe-3e78-2477-4e10032b2816.png)
もはやRundeckの名前が無くなっている......

# あとがき
完全にPagerDutyの一部になっていた。
(コミュニティ版はまた違うかも)
今後作る度に名前が変わっていくのだろうか。。。。
【文字列 3】p4!2@ (paizaランク B 相当)

【文字列 3】p4!2@ (paizaランク B 相当)

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__leet_paiza

![2024_04_09【文字列 3】p4!2@.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768836/833208f9-e21c-721c-096a-504afae0f637.jpeg)

Leet判定の問題です。単純に"paiza"なら"paiza"と出力して、Leet文字なら一度Leet前の文字に変換した後、"paiza"5文字と一致すれば"Leet"出力します。
【全探索 1】高い寿司を食いたい！ (paizaランク B 相当)

【全探索 1】高い寿司を食いたい！

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__get_richer_sushi

![2024_04_08【全探索 1】高い寿司を食いたい！.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768836/cf8fdbe4-e958-f918-ef3e-abbca51a13ab.jpeg)

円形のレーンに対して連続してお寿司をとるにはどうすればいいかという問題。これには剰余を使えば解決します。
Excel VBAでUIAutomationを使って自動化するということ

# はじめに
主にExcel VBAを使用したUIAutomationの活用方法について掘り下げた記事を書いていきたい。おそらく、世の中の99%には需要が無い記事になる。

## なぜ需要が無いか

基本的に、この世界はUIAutomationなんか使わなくても良いようになっているからである。
1. デスクトップ操作の自動化以前に、業務フロー全体を自動化するサービスが沢山ある
1. ブラウザ操作ならSeleniumもあるし、IEモードならMSHTMLが使えるし、PADもある
1. 他アプリの自動化もPADとかで十分（むしろそっちの方が多機能） 
1. （UIAutomationで実現する仕組みは）開発者以外に配布して運用するのに不向き
1. 活用している人が少なすぎて、機能を深堀りした記事が皆無
1. 公式ドキュメントが解りにくすぎる
1. 単語がやたらと長くてコーディングしにくい
1. ある画面の自動化で作り込んだ機能を、他の画面の自動化処理に流用しにくい
1. エラー判定と対策が面倒
1. tagPoint死すべし

など、"UIAutomationを使わない理由"は枚挙に暇がない。


## どこに需要があるのか

逆に、2024年現在においてもExce VBAでUIAutomationを活用する意味があるとすれば
1. Excel以外のツールを一切使わずにデスクトップ上の何かを自動操作したい
1. 開発者自身が都度コードの面倒を見ながら、小道具感覚で使う（単発マクロの感覚）
1. MSHTMLが使えなくなった後でも似たような感覚で処理を続けたい
1. PADの動作がトロ臭いので、もっと攻めた自動化がしたい
1. PCスペックが低すぎてPADを動かす余裕がない
1. 研究目的

といった辺りだろうか。深く掘り進めると結構便利な機能が用意されてるので、VBEのオブジェクトブラウザーに表示されているメンバー一覧を一気にセルに書き出すとか、ちょっとした定型業務だけど通常のアプローチだと自動化できない（または自動化する手間が掛かり過ぎる）作業を手軽に自動化したい時には活躍してくれると思う。

また、UIAutomationに用意されているマイナーな機能は世の中に一切記事が出回っていないことも多いので、他人が真似できない記事を書きたい人は研究してみると面白いかもしれない。

## 筆者の活用方法
私は職場では、主にEdgeの自動操作のために活用している。社内の基幹システムの各要素へのアクセス方法を関数郡として用意し、必要に応じてその機能を組み合わせて定型業務の一部をワンクリックで処理できるようにすることが多い。
【ハイブリッドクラウドに興味ある方必見】Azureアダプティブクラウドコミュニティ

# アダプティブクラウドコミュニティの概要
Microsoftのアダプティブクラウドの製品グループが月例で新機能の紹介やQ&Aを行うコミュニティが発足されました。以下の3点を主に目的にしています。

- Azure Arc、Azure Stack HCI、Azure IoT、AKSなどの製品やサービスの製品更新をアダプティブクラウドコミュニティに提供
- アダプティブクラウド技術および製品テクノロジに関して共有・デモ
- アダプティブクラウド技術と製品に関連する問題、ブロッカー、ユースケース、質問に関するコミュニティからのフィードバックを収集

Microsoftのアダプティブクラウドについて、Microsoftのエンジニアから最新の情報を入手、デモで詳細を理解する、製品チームへフィードバックを提供するチャンスです。
北米・英語のコミュニティのため、定例会への参加にはタイムゾーン・言語の壁はあるかもしれません。過去のログはYoutubeで配信されているためそちらで確認することも可能です。

コミュニティについて詳細は以下からもご確認ください。

https://github.com/microsoft/adaptive_cloud_community?tab=readme-ov-file

# 参加方法・過去ログの確認方法
## Teamsチャネルへの参加方法
参加資格はなく、Microsoftの顧客、パートナーやテクノロジーを愛する者であればどなたでも参加可能です。[参加フォーム](https://aka.ms/AdaptiveCloudCommunityTeamsForm)に自身の情報を入力することでコミュニティのTeamsチャネルに参加できます。

## 過去ログの確認方法
Teamsチャネルに参加しなくても過去のログを確認することはできます。まずは以下のレコーディングから期待している内容になっているか確認してみるといいかもしれません。
過去の資料は[こちら](https://github.com/microsoft/azure_arc_community/tree/main/Presentations)からアクセスすることができます。
過去の月例会のレコーディングは[Youtube](https://aka.ms/ArcMeetup)で確認することができます。

# まとめ
2024年4月から開始されたMicrosoftのアダプティブクラウドコミュニティについて紹介しました。タイムゾーン、言語の壁から、日本からリアルタイム参加は難しいかもしれません。私の方でチェックしてまとめていきたいと思いますのでぜひチェックしてみてください。
【条件判定 1】郵便料金 (paizaランク C 相当)　他

【条件判定 1】郵便料金

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__posting_fee

![2024_04_08 【条件判定 1】郵便料金.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768836/47a0e6c8-a4bc-026b-55c6-e427b34ae69a.jpeg)
特に複雑な考えはいらず、素直に条件分けして、コード記入で解ける問題。

<br>
【条件判定 2】視力検査

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__vision_test

![2024_04_08 【条件判定 2】視力検査 (1).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768836/86e2413f-84b2-f237-65ff-79d6f89d0b78.jpeg)

![2024_04_08 【条件判定 2】視力検査 (1).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768836/349d7423-f43e-7173-3657-f71118a4eac5.jpeg)

![2024_04_08 【条件判定 2】視力検査 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768836/2349a827-73ab-2f56-d221-d05428611455.jpeg)
![2024_04_08 【条件判定 2】視力検査 (3).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768836/b4cf1b66-63e4-3e16-37d9-37216b3668e1.jpeg)

長いコードになってしまったけど、要は"OK"あるいは"NG"が先に2回出た時点で条件をスキップすればいいので、カウント用の変数を複数用意して、2重の条件によるやり方が解きやすかったです。
マルチモーダルAIのユースケースを整理してみた

# はじめに
マルチモーダルAIの中で特にテキスト・画像・動画からテキストを生成すること（Azure OpenAI GPT-4 Turbo with vision）の注目度が高いためここではそのユースケースについて整理します。

# アップロードした画像に関するレコメンドを提供する

## 会社概要
[instacart](https://www.instacart.com/company/about-us)は北米でサービスを展開するオンライン食料品配送サービスを提供する企業です。ローカルのスーパーマーケットと提携しており、食料品や日用品をアプリやウェブサイトから注文、指定した場所まで配送してもらうことができます。

## マルチモーダルAIの活用
現時点ではプレビュー中の機能ですが、以下の画像のようなオンラインショッピングサイトに写真をアップロードすると、写真の内容に沿って必要な食材を提案してくれる機能が開発されています。食料品に限らず、衣料品などオンラインショッピングサイトを持つ企業であれば同じような顧客の購入体験を向上する仕組みを導入することが期待されます。

![Instacart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/71129a29-ca85-021e-c96d-16656a408086.png)

詳細は[こちら（英語）](https://www.instacart.com/company/updates/preview-envisioning-the-future-of-grocery-shopping-with-gpt-4v/?irgwc=1&utm_source=instacart_impact&utm_medium=affiliate&utm_term=partnertype-mediapartner_adtype-TEXT_LINK_adname-Use%20your%20EBT%20SNAP%20benefits%20on%20select%20Instacart%20orders.%20Stay%20home%20and%20skip%20the%20lines%20with%20grocery%20delivery%20today.%20Terms%20apply.&utm_campaign=partner-Bing%20Rebates%20by%20Microsoft&utm_content=clickid-2LEXOAXZExyPWfJ3iBztaVoYUkHUJMSfUXU83k0_campaignid-7412_partnerid-2003851_adid-1088185_sharedid-EdgeBingFlow)で説明されています。

# アップロードした画像や動画コンテンツの説明を生成し、コンテンツを分析する
## 会社概要
[WPP](https://www.wpp.com/about)はイギリスに本社を置き、100ヵ国以上に展開する世界最大級の広告サービスグループです。

## マルチモーダルAIの活用
WPPでは動画の広告コンテンツの評価や最適化にマルチモーダルAIを活用しています。動画ファイルをシステムに入力すると、動画コンテンツの要約が生成されます。生成したテキスト形式の要約を独自のAIツールに与えることで、広告コンテンツの有効性について分析することを可能にしています。同社はこのような動画からテキストを生成するツールを2年以上検証していたが、その中でGPT-4 Turbo with Visionが一番よいツールだと説明しています。

![WPPv2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/2c5b29ac-8653-5a11-a551-a4d665ce9374.png)

詳細は[こちら（英語）](https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/gpt-4-turbo-with-vision-on-azure-openai-service/ba-p/3979933)で説明されています。

# まとめ
生成AIのインプットに画像や動画を活用した事例を整理しました。POCではありますが、すでに実用化が始まっていることがわかりました。今回まとめた事例からは(1)レコメンドを提供する、(2)コンテンツを分析するの2つの使い方が見えてきました。もう少し事例が増えてきたら他の使い方も整理してみたいと思います。
LightGBMをGPUで回すと結果の再現性が得られない


# 概要

タイトルの通りなのだが、LightGBMをGPUで回すと結果の再現性が得られないことに気づいた。

CPUの場合は乱数seedを42などに固定すれば、同じ条件で何回回しても毎回同じ結果が得られる。
しかし、GPUの場合は乱数seedを固定しても回すたびに結果が変わってしまうのだ。

# なぜ再現性がないのか？

この問題はLightGBMの公式のissueでも議論されている。

https://github.com/microsoft/LightGBM/issues/2659

まず、GPUを使う場合は並列で計算できる部分は並列処理をすることで効率化している。
さらに、並列化した結果を足し算するときに、順番によって微妙に値が変わってしまうということだ。

もちろん数学的には足し算の順番が変わっても結果が変わることなんてないんだけど、コンピュータでfloatなどの値を計算する以上、丸め誤差だったり複数の要因で結果が「ほんのわずかに」違うということが起きうる。

さらに、LightGBMをGPUで回した場合、効率を重視するため浮動小数点の精度を32bitに落として計算するため、この影響が大きくなりやすい。

X(Twitter)でのこちらの議論も参照:

https://x.com/Ayumu_walker/status/1774344613580702138


# 暫定的な解決策

## 1. GPUではなくCPUを使う

まず、本当の意味での再現性を確保したかったら**GPUではなくCPU**を使うというのが一つ。
大きいデータセットでCPUで時間がかかる場合であればGPUを使う必要性が出てきそうだが、比較的小さなデータであればCPUで十分だ。

## 2. DP(倍精度=64bit)の設定にする

次に、GPUを使う場合はSP (単精度=32bit)ではなくDP(倍精度=64bit)の設定にすることでこの変動を抑えるという手もある。

上のissueでも議論されているが、

```python
gpu_use_dp=True
```

とパラメータを設定することで、LightGBMの浮動小数点の計算を64bitで行うことができる。

# gpu_use_dp=Trueの副作用

ただ、当然これにも副作用はある。
まず、デフォルトのSPだと効率化のために32bitで計算を行っているため、より多くのリソースを必要とする可能性がある。

自分が試した環境だと

```
[LightGBM] [Fatal] bin size 258 cannot run on GPU
```

のエラーが出た。
LightGBMでは効率的に計算するためにfeatureの情報をhistogramに詰めて、そこから適切な分割を探すのだが、そのbinの数が上限値を超えてしまったということだ。

これは細かい精度で計算しようとすればするほど起きうる問題であるため、32bitだと発生しないが64bitだと発生する、などの状況が（環境によっては）起きうる。

このようは場合はLightGBMのパラメータにmax_binを指定すれば良い。

```python
params = {
    # 略
    'gpu_use_dp': 'true',
    'max_bin': 255  # added GPU上での計算に適合するようにビンの数を調整
}
```

ただ、結局これもベストな方法かと言われると微妙で、細かい精度を上げるために`gpu_use_dp`を使っているのに、結局histogramのbin数に制限をかけてそれを抑制することに繋がってしまう。

結局のところ「**細かい浮動小数点まで計算したい**」と「**少ないリソースで効率的に計算したい**」のトレードオフの関係があるため、パラメータをいじったところでこれをどのように制御するのかという話でしかない。

# 結論

- GPUで計算を回すということは単に「**CPUとまったく同じ計算をめちゃくちゃ早くやってくれる！**」という夢のような話ではない
  - 並列化することによるわずかな影響がどこかに出るということを理解する
- どれくらいの精度で計算すべきかは環境やリソース等さまざまな要件に応じて決めるべし
WordPressで一部のNoto EmojiがiOSで表示されない問題をたぶん解決した

## やりたかったこと
WordPressに入力した絵文字を『[Noto Emoji](https://fonts.google.com/noto/specimen/Noto+Emoji?query=noto+emoji)』で表示したい

Noto EmojiはGoogle Fontsで提供されている絵文字フォント。通常の絵文字より使いやすいので、タイトルのアイコンなどに使用したかった。

https://fonts.google.com/noto/specimen/Noto+Emoji?query=noto+emoji

カスタムフィールドでテキストの絵文字入力エリアを作り、そこに入力した絵文字がタイトルなどで表示されるようにしたい。
![qiita_emoji.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592738/94bad227-a7b0-3d64-51f1-59a37553d22b.png)


## 起きていた問題
PCで確認していた時は問題なく表示されていたが、iOSで見ると一部の絵文字が表示されない。

通常の絵文字では表示されるが、Noto Emojiを適用すると表示されない。しかし、Noto Emoji内に絵文字自体はあるので、何かの齟齬が起きているらしい。

## 解決のヒントが見つかった

絵文字のエンコード周りの問題ではないかと思い、色々と変換を試みた。
UTF-32に変換し→16進数へ数値化をしたところ、iOSでもNoto Emojiで表示できる絵文字は2文字で構成されているのに気付く。

⛩️ → `&#x26e9;&#xfe0f;`
❤️ → `&#x2764;&#xfe0f;`

表示されない絵文字は、1文字で構成されていた。

🌸 → `&#x1f338;`
📚 → `&#x1f4da;`
🐏 → `&#x1f40f;`

「`&#xfe0f;`が最後についていると表示ができるらしい？」
試しにHTML上で試したところ、表示ができてしまった……！

`&#xfe0f;`はどうやら『異体字セレクタ』というやつらしい。これをつけてあげることで、iOSでもちゃんとどの文字なのかが分かるようだ（たぶん？）

## 出来上がったコード

『異体字セレクタ』をくっつければいいのなら、関数化して使いまわせばいいか。
ということで以下のような関数を追加。

```functions.php
// iOSで Note Emoji が置き換えされない問題を解決する
function convert_for_notoemoji($str){
	$emoji   = mb_convert_encoding( $str, 'UTF-32', 'UTF-8' );
	$hex     = bin2hex( $emoji );
	$hex_len = strlen( $hex ) / 8;
	if($hex_len <= 1){
		$emoji_utf = str_replace("000", '&#x', $hex);
		$emoji_utf = $emoji_utf.';&#xfe0f;';
	}else{
		$emoji_utf = $str;
	}
	return $emoji_utf;
}
```
投稿ループ内では以下のように使用。

```single.php
    $title_icon = get_post_meta($post->ID, 'title_icon', true);
	$title_icon = convert_for_notoemoji($title_icon);
    echo '<span class="noto-emoji">'.$title_icon.'</span>';
```
```style.css
.noto-emoji{
  font-family: "Noto Emoji", sans-serif;
  font-optical-sizing: auto;
  font-weight: 400;
  font-style: normal;
}
```

事前にGoogleフォントなどで『Noto Emoji』を読み込んでおいてね。

ひとまずサイトでも使えるようになったので、よかったよかった。
Minecraft Kotlinプラグイン開発 ミニ構文紹介 プレイヤーの取得

# 初めに
今回はミニ番外編としてプレイヤーの取得に焦点を当てて紹介していきます。

今までかなり一記事当たりの内容が濃かったので、
それに比べたら内容は薄くなってしまいますが
今回からはちょっとした構文の紹介もしていきたいと思います。

また、ミニ番外編は特に繋がりを持たない記事にする予定なので
次の記事とかのURLは無しで行きます。

# 今回紹介するコードの基本構文
今記事で紹介するコードは **Bukkit.getPlayer()** です。
このコードでは名前やUUIDを使用してプレイヤーを取得できます。
コマンドを作る時に使用したり、
そもそも特定のプレイヤーにのみ反応する機能を作る時に活用できます。

## 名前でプレイヤーを指定
引数にプレイヤー名(MCID)を記入することでプレイヤーが関数の返り値で返ってきます。
```kotlin
@EventHandler
fun onJump(event: PlayerJumpEvent) {
    val player = Bukkit.getPlayer("towa0111")
    if (player == null) return
    player.sendMessage("${event.player}がジャンプしました")
}
```
上の例文では誰かがジャンプした時に、プレイヤー(towa0111) にメッセージを送信します。
ここで大事なのが4行目の`if (player == null) return`の部分です。


## UUIDでプレイヤーを指定
引数にUUIDを記入することでプレイヤーが関数の返り値で返ってきます。
```kotlin
@EventHandler
fun onJump(event: PlayerJumpEvent) {
    val player = Bukkit.getPlayer(event.player.uniqueId)
    if (player == null) return
    player.sendMessage("あなたはジャンプしました")
}
```
上の例文ではジャンプした時にそのプレイヤーへメッセージを送信します。
(event.playerを使って省略できる文をわざと解説のために、回りくどい文にしています。)

基本的な使い方は一緒です。

UUIDはplayer.uniqueIdで取得出来ます。
UUIDはMCIDとは違い変更ができないので、データの保存に使用される事が多いです。

:::note warn
このコードは一つ前のMCIDの方法でも全く問題なく動きます。
UUIDで指定する方法はデータベースを使用するようになってから
使うことが多いので最初の方は特にUUIDを使う必要はありません。
:::


## オフラインのプレイヤーも取得
先ほど紹介した**getPlayer()**はオンラインのプレイヤーしか取得できません。
そのためそのプレイヤーがオフラインだと`null`が返されてしまいます。

その対策で **Bukkit.getOfflinePlayer()** という関数も存在します。
使用方法は **getPlayer()** と同じなので紹介しませんが
全く同じでUUIDとMCIDで取得できます。

# 終わりに
短いですが今回の記事はここまでです。

今回の記事ではMCIDやUUIDを使用してプレイヤーを取得する方法を紹介しました。

紹介した内容はデータベースを使うときやコマンドの引数で
プレイヤーを取得するときなど、プラグイン開発序盤じゃ使うことは少ないと思いますが
今後どこかで使うことはあると思うので多少でも覚えておいてもらえると幸いです。

それでは次回はまた別の文を紹介したいと思います。
お疲れ様でした。
【ペアワイズ法】PICTの導入方法の備忘録【QA】

# はじめに
QA界隈で人気なツール「PICT」。
業務用PCを交換したとき毎回インストールするが、
高頻度で実施する作業ではないため、毎回よく忘れる。

こうした個人的な悩みを緩和するための記事だ。
うろ覚えで書いているため、一部間違っているOR古い情報になっているかもしれない。

# 導入手順
## Windows
基本的には提供元からexeを落とし、パスが通っているディレクトリに置けばOK。
専用のパスを追加してもいいけど、面倒であればSystem32とかに突っ込んでおけばいいと思う。
提供元Microsoftだから大丈夫っしょ。

### ダウンロードリンク
Githubから入手可能。

https://github.com/microsoft/pict/releases/

pict.exeを落とす。
<img width="600" alt="ダウンロードリンク" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680589/9cc4bc0d-a168-45c9-87a9-f16aa7768e4b.png">

### パスを通す
#### 面倒くさい時
コマンドプロンプトまたはPowerShellから実行できるように、パスを通す。
だるい場合は、System32に突っ込んでおけばOK。

#### System32に置きたくない時
System32に置きたくない場合は、
すでに通っているパスに「pict.exe」を配置すればOK。
パスを確認するには、コマンドプロンプトで「path」を実行するのが楽。

#### 独自のパスに置きたい時
独自のパスを追加したい場合は以下の手順を実施。
1. 環境変数の設定画面を開く
    1. Windowsキー + I　で設定を開く
    1. 左側のリストから「システム」を開く
    1. 右側のページ下部から「バージョン情報」を開く
    1. 「システムの詳細設定」を開く▶「システムのプロパティ」が開く
    1. 「詳細設定」タブの環境変数ボタンを押下
1. ユーザーの環境変数「path」に対象のパスを追加する

<img width="400" alt="環境変数の追加" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680589/81ade162-ad1a-1f8e-5ff2-fcb048039007.png">


## Mac
うろ覚えのため間違っていたり、不要な手順がある可能性が高い。

### Rosettaの有効化(M1 Macのみ)
ターミナルの「情報を見る」を開き、「Rosettaを使用して開く」のチェックを入れる。
なんで必要かは忘れた。

<img width="600" alt="rosseta" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680589/d0a41f6f-9f82-89cb-8cf1-445488d201e8.png">


### homebrewのインストール

```bash: homebrewのインストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

バージョンが表示されればOK
```bash: homebrewのバージョン確認
brew -v
```

### Gitのインストール
Gitをインストールする。
```bash: Gitのインストール
brew install git
```

```bash: Gitのバージョン確認
-git --version
```

### PICTのインストール
1. ターミナル上で、PICTをインストールしたいフォルダに移動する
1. インストールする
```bash: PICTのインストール
$ git clone https://github.com/Microsoft/pict.git
$ cd pict/
$ make
$ sudo install -m 0755 pict /usr/local/bin/pict
```

# 最後に
実際にPICT文を書くときは、VSCodeで書いて、統合ターミナルから「pictほにゃらら」を実行するのが楽。
ファイル形式を「ini」とするといい感じの着色になるが、多分、もっといい方法はある。
【2024年版】Jupyter notebook、Jupyterlabの最適でイケている設定

Jupyter周りのイケてる設定をメモしておきます。

# 前準備

## フォントのインストール

等幅フォントの**noto sans mono extra condensed**を使います。
半角文字は半角文字同士で等幅、全角文字は全角文字同士で等幅、全角文字は半角文字の2倍の幅のフォントになっていて、プログラミングでは良い感じの表示になります。
そこら辺のフォントよりも見た目もイケてます。

Googleのサイトからフォントデータをダウンロードして、Windowsとかにインストールしておきます。

https://fonts.google.com/noto/specimen/Noto+Sans+Mono

## Jupyterとかのインストール

```bash
pip install jupyter jupyterlab ipython
```

## 日本語化パッケージのインストール

Jupyterの日本語化に使います。

```bash
pip install jupyterlab-language-pack-ja-JP
```

# Jupyterの設定ファイルの編集

Jupyter notebookもしくはJupyterlabを立ち上げて、`Settings`>`Settings Editor`>`JSON Settings Editor`を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/041ca556-1a09-4520-9778-d527951ee86e.png)

多分こんな感じの画面になるので、左の一覧から次の項目を選んで右側の`User Preferences`を記載の通りに編集して保存します。

## Code Completion

```JSON
{
    // Tab入力なしで自動補完候補を表示
    "autoCompletion": true
}
```

## File Browser

```JSON
{
    // チェックボックスは非表示
    "showFileCheckboxes": false,
    // ファイルサイズを表示
    "showFileSizeColumn": true
}
```

## Notebook

```JSON
{
    // 初期起動時の通知をOFF
    "enableKernelInitNotification": false,
    "codeCellConfig": {
        // 括弧はじめを入力したときに自動で括弧閉じを入力
        "autoClosingBrackets": true,
        // スペース文字を表示
        "highlightWhitespace": true,
        // フォントの指定
        "customStyles": {
            "fontFamily": "'Noto Sans Mono ExtraCondensed Medium','游ゴシック Medium'",
            "fontSize": null,
            "lineHeight": null
        },
        // 行番号を表示
        "lineNumbers": true,
        // コードを右端で折り返す
        "lineWrap": true
    },
    // ノートブックを閉じたときに自動でカーネルも落とす
    "kernelShutdown": true
}
```

## Language

```JSON
{
    // 日本語化
    "locale": "ja_JP"
}
```

## Theme

```JSON
{
    // ダークテーマを指定
    "theme": "JupyterLab Dark"
}
```

これで完璧なJupyter環境が完成です。おめでとうございます。
Azure DevOpsのScrumプロセステンプレートにおけるPBIのStateとCycle Time

# まとめ

Azure DevOpsでScrumプロセステンプレートを使用するときは、PBIに着手するときにStateをCommittedにすることで、Cycle Timeが正しく算出される

# Azure DevOpsのPBIのState

[Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/devops/boards/work-items/guidance/scrum-process-workflow?view=azure-devops#scrum-workflow-states)によると、PBIのStateは次のようになっています。

- New: 新しくPBIが作成された
- Approved: PBIがプロダクトオーナーによって承認された
- Committed: チームによってコミットされた
- Done: 作業が完了した

これだと「コミットされた」がわかりづらいのですが、このタイミングはいつでしょうか？

まずは、スクラムにおける「コミット」について見てみます。スクラムガイドの[Revision History](https://scrumguides.org/revisions.html)を見てみると(太字は筆者)、

> **Changes between 2010 and 2011 Scrum Guides**
> Development Teams do not **commit** to completing the work planned during a Sprint Planning Meeting. The Development Team creates a forecast of work it believes will be done, but that forecast will change as more becomes known throughout the Sprint.

2011年度版以前は、スプリントプランニングで選択することを「コミット」と呼んでいたことがわかります。そして、Azure DevOpsの説明も2018年以前は、

> the team updates the status to **committed** when they decide to complete the work during the sprint

となっており、スプリントプランニングで選択したものを表すことがわかります。

# Cycle Timeと照らし合わせると

一方、PBIとCycle Timeとの関係について見てみます。Cycle Timeは、一般的な意味としては工程を開始してから終了するまでです。Azure DevOpsのダッシュボードウィジェットでは、Scrumプロセステンプレートに対して、[CommittedになってからDoneになるまで](https://learn.microsoft.com/en-us/azure/devops/report/dashboards/cycle-time-and-lead-time?view=azure-devops)を表します。

これが工程の開始から終了までに紐づくということは、Committedにするタイミングはスプリントプランニング時点ではなく、PBIの最初のタスクに着手した時点だということがわかります。そうすることで、Cycle Timeが正しく求められます。

# 参考
- https://learn.microsoft.com/ja-jp/azure/devops/boards/work-items/guidance/scrum-process-workflow?view=azure-devops#scrum-workflow-states
- https://learn.microsoft.com/en-us/azure/devops/report/dashboards/cycle-time-and-lead-time?view=azure-devops
- https://scrumguides.org/revisions.html
- https://www.developervote.com/confusing-committed-status-in-azure-devops/
Android エミュでビルドしたら Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE: Failed to override installation location] というエラーが出た

# これなに
Android エミュレーターでビルドしたら `Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE: Failed to override installation location]` なるエラーが出た。


# エラーログ
ターミナルで出てきたエラーログは以下の通り。
```zsh 
% flutter run --device-id emulator-5554
Launching lib/main.dart on sdk gphone64 arm64 in debug mode...
Running Gradle task 'assembleDebug'...                            105.4s
✓  Built build/app/outputs/flutter-apk/app-debug.apk.
Installing build/app/outputs/flutter-apk/app-debug.apk...           9.6s
Error: ADB exited with exit code 1
Performing Streamed Install

adb: failed to install /Users/user/Github-su3/myapp/build/app/outputs/flutter-apk/app-debug.apk: Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE: Failed to override installation location]
Error launching application on sdk gphone64 arm64.
```


# 解決方法
エミュレーターを修了した上で、Android Studio の Device Manager から Wipe Data を実行すると解決した。（スクショは起動中になってますが、気にせず）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/4a020068-2b1a-418e-f010-1d29e41a45cc.png)


# 原因
ストレージスペースがなくなったことにある。
元々エミュレーターのストレージ量は極少なので、必要があれば数字をいじれば解決する。
ただ、多様なユーザーがいると思うので低スペックデバイスがどう振る舞うかを確認できるのであんまりイジらない方が良いと考えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/08dff36c-49ef-09df-c735-e529f2f0c813.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/4f274df5-8494-6fdf-027a-2d453b510647.png)
SDL2の環境構築とサンプルの実行【MacOS】【Homebrew】【VSCode】

Homebrewでsdl2をmacOSにinstall後、サンプルコードの実行まで行います。

## 実行環境
- macOS Ventuna 13.5.1
- SDL 2.30.2
- Homebrew 4.2.17
- g++ Apple clang version 14.0.3

## HomebrewからSDL2をインストール

https://brew.sh/ja/

[search欄にsdl2を入力してクリック](https://formulae.brew.sh/formula/sdl2#default)
install commandとして
```
$ brew install sdl2
```
が出るのでコマンドラインで実行
sld2関連の他のライブラリを入れたい場合は
```
$ brew install sdl2 sdl2_image sdl2_ttf sdl2_mixer sdl2_gfx sdl2_net
```


## コマンドラインから実行するためのオプションを調べる
installしたsdl2は `/usr/local/Cellar/sdl2` にあるようです。

```
$ cd /usr/local/Cellar/sdl2/2.30.2/bin
```
でディレクトリへ移動 (2.30.2の箇所はバージョンによって異なる)

`$ ./sdl2-config` を実行することで、コンパイルオプションを調べられます。

```
$ ./sdl2-config 
Usage: ./sdl2-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]
```

今回は、sdl2ライブラリをリンクするためのコンパイルオプションが知りたいので、以下を実行
```
$ ./sdl2-config --cflags --libs
-I/usr/local/Cellar/sdl2/2.30.2/include/SDL2 -D_THREAD_SAFE
-L/usr/local/Cellar/sdl2/2.30.2/lib -lSDL2
```
これら2つのオプションをつけてあげれば良さそうです。

## サンプルコードの実行

[Windowを表示する記事のコード](https://sirius10.net/blog/wordpress/index.php/2021/09/27/2070/)を参考に、VSCodeでサンプルコードのcppファイルを作成し、サンプルコードを実行します。

```
$ g++ hoge.cpp -I/usr/local/Cellar/sdl2/2.30.2/include/SDL2 -D_THREAD_SAFE -L/usr/local/Cellar/sdl2/2.30.2/lib -lSDL2
```

ウィンドウが画面に表示されれば成功です。
![show_window.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865650/489dd908-6c8c-b605-55fe-a910d6bd521d.png)


## Makefileでコンパイルコマンドの省略
コンパイルのたびに、毎回`g++~`と打っていては大変なので、makeコマンドでコンパイルから実行までできるようにします。

makefileという名前のファイルを作成します。

```make:makefile
# コンパイル対象のソースコード
arg = main.cpp

# 前回の実行ファイルを消去してから、新しくコンパイル、実行を行う
all: clean compile exec
compile:
	g++ $(arg) -I/usr/local/include/SDL2 -D_THREAD_SAFE -L/usr/local/Cellar/sdl2/2.30.2/lib -lSDL2
exec:
	./a.out
clean:
	-rm ./a.out
```

以下のコードでコンパイルから実行までを行ってくれます。
（デフォルトのcppのファイル名がmain.cppなのに注意）

```
$ make
```

任意のファイルをコンパイルしたいときは以下のように引数を指定してあげるといいです。

```
$ make arg=hoge.cpp
```

## 参考記事

[web帳 | Mac Home brewでSDL2.0を簡単に環境設定](https://www.webcyou.com/?p=10388)

https://sirius10.net/blog/wordpress/index.php/2021/09/27/2070/

## 備考

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

この動画を参考にXCodeでも動くように設定を試みましたが、
`Library not loaded: /usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib`
というエラーが消えないため、仕方なくVSCodeでの環境構築をしました。

また、Homebrew以外のインストール方法として、[公式ドキュメント](https://www.libsdl.org/)や[個人のブログ記事](https://blog.iizukak.com/entry/2018/09/23/230501)を参考に、[GitHub](https://github.com/libsdl-org/SDL/releases/tag/release-2.30.2)から落としたデータをbuildしましたが、`/usr/local/Cellar/sdl2/2.30.2`のところにあるはずのデータが上手く生成されませんでした...謎。

個人的にはXCodeよりもVSCodeの方が使い勝手が良いと思っているので、こちらで開発を進めます。
CloudFormationを1から学習する Part1-1 テンプレートのルールについて知る

# 概要
仕事がCFnをメインとして利用する環境になりましたので、改めて一から勉強し直します。
認定試験や前の仕事で少しだけ触ってはいましたが、terraformでいいじゃん的な気分でいてキチンと学習をしてきませんでした。
いざ業務でCFnメインとなるとかなーりいろいろなことを忘れていたり理解していないことを痛感しました。
ここでキチンと修行します。

この記事はそのメモやまとめです。
すでに設定済みの項目がいくつかある。
試行錯誤しながらやったので、手順として不要かもしれない。**あくまでメモ用。**

# 学習項目について
sysopsの試験対策講座から抜き出してみましたが以下の要素がわかっていれば基本は理解できているのかなと思えましたので、以下の要素の学習を進めたいと思います。
できるだけCLIとConsole画面の両方で確認していけばより理解が深まりそうです。
(書き出しているだけなので内容が被るかも……)

### 基本操作
```
create stack
update stack
delete stack
```

### テンプレートのルールについて
```
Parameters
Mappings
Conditions
Transform
Resource
Outputs
```

### もっと詳細
```
Outputs＆Exports
Intrinsic Functions
Rollbacks
Service Role
Capabilities
Deletion Policy
Stack Policy
Termination Protection
Custom Resources
Dynamic References
!Ref
User Data
cfn-init
cfn-signal Failures
Nested Stacks
Depends on
StackSets
```

# 用語
今回はテンプレートのルールについての用語の意味を確認します。
ざっくりと確認しあとからCLIとConsole画面の両方で実際にスタックを利用したいと思います。
CLIのコマンドと混在していたりしますが、そのへんは許してください……。

## create
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html
スタックを作成します。

## update
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks.html
スタックを更新します。
2種類の更新方法があり、直接更新または変更セット(change set)の作成と実行があります。

## delete
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-cli-deleting-stack.html
スタックを削除します。
削除保護(Termination Protection)が有効になっているスタックを削除することはできない。


## Mappings
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/mappings-section-structure.html
Mappingsセクションでは、キーと名前付きの一連の値とが対応付けられます。たとえば、リージョンに基づく値を設定する場合、リージョン名をキーとして必要な値を保持するマッピングを作成する。
呼び出す際は組み込み関数`Fn::FindInMap`を利用する。


## Conditions(条件)
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html
Conditionsセクションではいわゆる条件をつけることができる。
例えばEC2の場合、EnvによってはEBSを作成しアタッチする、それ以外の環境ではEC2の作成のみといった感じのことができる。


## Transform(変換)
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/transform-section-structure.html
これについては本当に理由がわからなかった……。いくつかブログを漁ってみたけどそれでもはっきりとしたことはわかりませんでした。
実際に手を動かしてみるとわかるものなのかな……？

## Resource
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resources-section-structure.html
テンプレート内でAWSリソースの宣言をする際に利用します。

## outputs(出力)
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html
Outputs セクションは、Consoleでスタックからの出力値を参照したり、別のスタックに作成したスタックのパラメーターをエクスポートする際に利用する。
こちらのqiitaの記事がシンプルかつ注意点も記載されていてわかりやすかったです。
https://qiita.com/jonhyoku_imu/items/c4125c21143eb77d5612
本当はこのレベルまで自分の言葉で落とし込むべきなのでしょう……。



# 終わりに
改めて学習すると、ほんとうに学習した気になっていたということを痛感しました。
次回は今回調べた部分を実際に手を動かして学習します。
【ポートフォリオ】収支管理アプリ作成【React・Next.js】

# はじめに
Webエンジニアへ転職を目指し、自分が独学で実際にポートフォリオが完成したのでその紹介と作成した背景や
作成する上で意識していたことなどを共有しようと思いますので、こちらの記事を通して
これからエンジニアを目指される方に少しでも参考になれたらと思っております。

# 作成したアプリについて
作成したアプリについて説明したいと思います。

![スクリーンショット 2024-04-06 14.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565796/c8de37a0-6c00-2c59-8da5-52536de90584.png)

# アプリ概要
このアプリは、収入と支出を簡単に記録し、管理することを目的としています。ユーザーは、入力フォームに収支の内容と金額を入力するだけで、一覧に反映されます。また、入力したデータは編集や削除も可能です。 アプリはシンプルなデザインであり、誰でも直感的に操作でき、日々の収支を簡単かつ効率的に管理することができます。さらに、月ごとに収支を管理するため、ユーザーは毎月の収支を分かりやすく確認できます。

# 機能について
機能についての説明をしたいと思います。
### 一覧と金額の入力
入力欄に内容と金額を入力すると、一覧に反映します。
プルダウンを＋にすると収入一覧、-にすると支出一覧に表示され支出の際は入力された支出データに基づいて円グラフが表示されます。
![収支管理アプリ4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565796/e8147bb5-1fca-eac8-cfbb-2e439ba958c3.gif)

### 月毎に管理
収入と支出を月毎に管理することができます。各月の収支を一目で把握し、予算を立てたり支出を調整したりすることが可能です

![収支管理アプリ5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565796/b3b06e05-1110-3565-040d-9e5c08aa6349.gif)

### 編集、削除　（CRUD処理）
編集した一覧を入力することで、編集と削除が可能なページに遷移できます。編集ページでは、選択した項目の情報を編集し、更新することができます。また、不要な項目を削除することも可能です。
さらに、編集した内容は即座に残高に反映されます。つまり、収入や支出の編集や削除が行われると、その変更が残高に反映されます。
![収支管理アプリ 編集.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565796/be6500df-ec52-57a9-e151-75cbeb83bff9.gif)

# 現時点のアプリ機能一覧
2ヶ月で作成したポートフォリオの機能一覧です。
今後も機能は追加予定です。

### 機能一覧
* 収入、支出の表示、編集、削除　（CRUD処理）
* 支出のグラフ表示]
* レスポンシブデザイン対応
* 月ごとの収支管理


# 使用技術

### フロントエンド
Next.js "13.4.9"
React "18.2.0"
Tailwind "3.3.2"

### インフラ
vercel

### その他
Github

# 選定理由
メインのReact,Next.js ,Tailwindを作成した理由について述べていきたいと思います。

* React :フロントエンド開発においてもっとも使用されてるライブラリの一つだという事と、学習コストが他の言語に比べて低いと思ったため。

* Next.js:ファイルシステムベースのルーティングを提供し、ページの管理が簡単である事、Reactとの親和性が高い事、Vercelとの統合が簡単でありVercelを使用することで簡単にデプロイできる事を理由に選定しました。
*Tailwind:事前に定義された多くのクラスを使用することで、開発効率が向上する点とカスタマイズ性と柔軟性が高いため、あらゆるデザインに対応できるので選定しました。


# このアプリを作成した背景
普段の生活での支出に目を向けると、思っていた以上にお金を使っていることに気付きました。日常的な買い物や娯楽、飲食など、細かな支出が積み重なると、意識しないうちに予算をオーバーしていることがあります。

収入を把握していても、支出が予想以上に高くなっていることに気付くことがありました。月末になると残高が思ったよりも少なくなっていることに驚かされます。

そこで、自分の収支をより詳細に把握し、無駄な支出を減らすための手段として、収支管理アプリの開発に取り組みました。このアプリは、支出をカテゴリー別に分類し、定期的な支出パターンを把握できるように設計されています。さらに、支出をグラフやチャートで可視化することで、どの部分にお金を使っているか一目瞭然になります。

このように、収支管理アプリは自分の財務状況を客観的に把握し、節約や投資などの改善策を見つけるための有用なツールとなると考えたので作成しました。

# 　作成時に意識していた事
* タスクをばらして言語化
* 質問する前にまずは仮説を立ててやってみる


### ■とにかく小さく、タスクをばらして言語化

手を動かす前に、具体的に何をしたいのか、何を作りたいのかを明確にします。その後、それを細かく分解し、一つひとつのタスクに言語化して進めることを心がけています。機能を実装する際は、その内容をメモなどに書き出し、それを細かく分解してから、それをもとにコードを書いています。
エラーが発生した場合も、問題の箇所を一つひとつ言語化してから、それを一つひとつデバッグして原因を特定するようにしています。これにより、原因を追究するプロセスがスムーズになりました。


### 　■質問する前に仮説を立てて問題に取り組む
分からないことがあった時はMENTAを通じてメンターさんに質問していました。その際、質問する前に自分なりにまず何が分からないのか、どこまで理解しておりどこから分からないのかを把握し、言語化してから質問することを意識していました。


# 終わりに
最後まで読んで頂きありがとうございます。
ポートフォリオを完成させることができ、とても充実した経験でした。このプロジェクトを通じて、多くの学びを得る事ができました。特に、コードを書く際に小さくタスクを分解することの重要性や、エラーが発生した際に問題を一つずつ解決するアプローチが役立ったことを感じています。
ポートフォリオの内容やデザインについても改善の余地があると思うで改善しつつ学習を継続していきたいと思います。
【生成AIアプリ100チャレンジ】（16）マギシステム（エヴァンゲリオン風）

https://ai.nuevo.jp/magi_system/results/


# 開発環境

|              |              |
|:------------:|:------------:|
| Server       | lightSail    |
| Language     | Python3.11   |
| Framework    | Django       |
| DB           | sqlite3      |

ローカル環境ではPythonのvenvを使用。エディタはvs codeです。

# 目的
人気アニメ「エヴァンゲリオン」のマギシステムをChatGPTで実装してみました。
科学者としての意見
母親としての意見
女としての意見
三つの意見を元に結論を導くアプリです。

このマギシステムを活用すれな、ネルフ同様、日本のリーダーは結論をすぐに出せるようになるかもしれません。
作ってみたかったアプリのひとつです

# コード
```python:qiita.rb
    OPENAI_API_KEY = os.environ['OPENAI_API_KEY']
    prompt = request.POST.get('message')
    interactions = []

    def discussion(OPENAI_API_KEY, prompt, message):
        client = OpenAI(
            api_key = OPENAI_API_KEY,
        )
        response = client.chat.completions.create(
            model="gpt-4",
            messages=[
                {
                    "role": "system",
                    "content": message
                },
                {
                    "role": "user",
                    "content": prompt
                },
            ],
            temperature=0.3,
            max_tokens=512
        )
        response = response.choices[0].message.content
        response = response.replace("\n", "<br>")
        return response

    message = """日本語で応答してください。あなたは優秀な科学者です。科学者としての意見を述べてください"""
    casper_response = discussion(OPENAI_API_KEY, prompt, message)
    interactions.append({'input': "議論の課題は" + prompt + "です。", 'response': casper_response})

    message = """日本語で応答してください。あなたは慈愛に満ちた母親です。母親としての意見を述べてください"""
    balthazar_response = discussion(OPENAI_API_KEY, casper_response, message)
    interactions.append({'input': "議論の課題は" + prompt + "です。", 'response':  balthazar_response})

    message = """日本語で応答してください。あなたは人類の女性代表です。女性としての意見を述べてください"""
    melchior_response = discussion(OPENAI_API_KEY, balthazar_response, message)
    interactions.append({'input': "議論の課題は" + prompt + "です。", 'response': melchior_response})

    message = """日本語で応答してください。あなたは結論を出すリーダーです。３つの意見をもとに結論を述べてください"""
    magi_response = discussion(OPENAI_API_KEY, balthazar_response, message)
    interactions.append({'input': "一つ目の意見は「" +  casper_response + "」です。" + "二つ目の意見は「" +  balthazar_response + "」です。" + "三つ目の意見は「" +  melchior_response + "」です。", 'response': magi_response})


    return JsonResponse({'message': interactions})

    else:
        form = ChatForm()
```

優秀な科学者、慈愛に満ちた母親、人類の女性代表をそれぞれアニメ同様にcasper、balthazar、melchiorとして意見を述べてもらっています。結論を出すリーダーが三つの意見を元に結論を出しています。
まさにマギシステムです。


# アプリ画面
![スクリーンショット 2024-04-14 14.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398694/ccabb73f-0a0e-2d1b-fbb1-248c7a9efae5.png)



# 感想
絵心さえあればアニメ風のマギシステムのデザインにしたいんだけれども、とりあえずは使い回しのレイアウトで書きます。
意見を戦わせているので結論が出るのに1分ほどかかります。
BRICSによる化合物のフラグメント化とバーチャルライブラリ構築

# はじめに
こんにちは、@sasshi_iです。
本日はバーチャルライブラリの構築方法について紹介します。

化合物のバーチャルライブラリとは、**実際に合成する前にコンピュータ上で設計された多くの化学構造から成るデータベース**です。

バーチャルライブラリ構築の目的は、理論上可能な化合物の構造を列挙し、それらの中から実験的に合成してテストする価値のある候補を選択することです。(実際に合成するとお金かかるので、計算機上で有力候補を絞り込む)

バーチャルライブラリは下記の流れで作成できます。

* 生理活性や化合物の合成容易性を考慮して化合物の部分構造(フラグメント)を列挙
* フラグメントを組み合わせる

化合物を生理活性および合成可能性の観点からフラグメントに分解する手法の1つに**BRICS**があります。

それでは、BRICSについて説明していきましょう。

# BRICSとは
**BRICS(breaking of retrosynthetically interesting chemical substructures)** は、既知の化合物を特定の化学結合で区切り、特定の化学構造断片を生成するアルゴリズムの1つです。

化学構造断片を組み合わせることで新たな化合物ライブラリーを構築することを目的としています。

BRICSは医薬品様化合物のフラグメント化手法である**RECAP(Retrosynthetic Combinatorial Analysis Procedure)** を改善した手法になります。

RECAPでは11種類のルールを基に化合物を切断していましたが、BRICSでは**16種類のルール**を基に切断します。

これにより、化合物を切断する際の性能がRECAPと比較して
* 切断されない分子数の減少
* フラグメントの総数の増加

となっています。

# BRICSを用いた化合物の操作
ここからは、実際に化合物をフラグメント化し、フラグメントを用いて化合物のバーチャルライブラリーを作成してみます。

フラグメント化する化合物は、[金子研HP](https://datachemeng.com/pythonassignment/)から取得した`水溶解度データ`を使用します。

また、実行環境はGoogle Colaboratoryを使用しています。

## 化合物のフラグメント化
はじめにrdkitをインストールします。
```python
!pip install rdkit
```

```python
# データ読み込み
suppl  = Chem.SDMolSupplier("logSdataset1290_2d.sdf")
mols = [mol for mol in suppl if mol is not None]

# 読み込めた分子をBRICSでフラグメント化
fragment_set = set()
for mol in mols:
    fragment = BRICS.BRICSDecompose(mol)
    fragment_set = fragment_set | fragment

fragments = list(fragment_set)
fragments = np.array([Chem.MolFromSmiles(smi) for smi in fragments])

descriptor_calc = MoleculeDescriptors.MolecularDescriptorCalculator(['MolWt'])
MolWt_list = np.array([descriptor_calc.CalcDescriptors(mol)[0] for mol in fragments])

# 分子量の大きい複雑なフラグメントは除く
fragment_list = np.array(fragments)[np.where(MolWt_list<=200)]

Draw.MolsToGridImage(fragment_list[:15], molsPerRow=5)
```
化合物のフラグメントのリストを構築できました。

![スクリーンショット 2024-04-05 001529.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324032/833a0b56-240b-db31-7b9a-9eedc8ae8c83.png)

## バーチャルライブラリーの構築
ここからはフラグメントを組み合わせて化合物ライブラリーを作成します。

```python
builder = BRICS.BRICSBuild(fragments)
# フラグメントから1000個の分子を作成
generated_mols = [next(builder) for x in range(1000)]

# 生成された分子は価数が間違っている可能性があるため、価数を更新
for mol in generated_mols:
    mol.UpdatePropertyCache(strict=True)

Draw.MolsToGridImage(generated_mols[:25], molsPerRow=5)
```
![スクリーンショット 2024-04-05 001807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324032/3bc65f43-e0f7-9a45-4db1-2bd2a58d91a5.png)

部分構造の異なる化合物のリスト(バーチャルライブラリ)を作成することができました。

# 終わりに
BRICSを用いた化合物のフラグメント化とフラグメントを組み合わせることで化合物のバーチャルライブラリーを作成しました。

BRICSについて詳しく知りたい方は論文があるので、そちらを参考にしてみてください。
https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/cmdc.200800178

# 参考
https://future-chem.com/rdkit-brics/
Virtual Box/Alma Linux ダウンロード③

Virtual Box/Alma Linux インストール③

Virtual BoxとAlma Linuxのダウンロードに思いのほか手間取ったので備忘のため記録。

Virtual BoxにAlmaLinuxを入れる

1.Virtual Boxを起動して新規ボタンを押下。

![スクリーンショット 2024-04-14 001906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875259/27072034-ca4b-cf27-6671-f65763730c07.png)

2."名前"をわかりやすいもの(画像ではAlmaLinuxを入力)にして、"ISOイメージ"にダウンロードしたAlmaLinuxを指定して"次へ"を押下。

![スクリーンショット 2024-04-14 002047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875259/d3a61345-637a-e2ec-60b4-0f6df5739acf.png)

3.2までの作業が終わったら以下画面に遷移するので"光学ドライブ"を選択してダウンロードしたAlmaLinuxを設定する。
![スクリーンショット 2024-04-14 003130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875259/6bf3546a-2acb-5af4-9dd0-4ce23a3283cf.png)


※この手順を飛ばして起動をすると以下画像のように怒られるので注意。

![スクリーンショット 2024-04-14 003047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875259/1409422d-7e02-5c1d-5221-52e8c968c06f.png)

4.光学ドライブの設定が完了したら"起動"を押下
　ALMALINUX9.3画面が出てきて言語設定を"日本語"にして"続行"を押す。

![スクリーンショット 2024-04-14 003600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875259/095fcc85-50c9-9ddc-142d-d5f959ce2d0e.png)


5."インストール先"を選択して"完了"を押下。

![スクリーンショット 2024-04-14 003733.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875259/b744fc12-9eb0-2b3a-e9e7-8dfadc36a718.png)
![スクリーンショット 2024-04-14 003712.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875259/f78a9b43-acab-8430-df39-5fdce381fd26.png)

6.root(管理者)アカウントパスワードを設定。

![スクリーンショット 2024-04-14 003837.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875259/0b6baacc-1a40-b054-bb02-d83df5154bca.png)
![スクリーンショット 2024-04-14 004019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875259/37ba041b-3c2a-cfbc-bba5-a3be04803bb6.png)

7.設定が終わったらインストール開始ボタンを選択できるようになるので押下。
※画像を撮り忘れた。。。

![スクリーンショット 2024-04-14 003733.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875259/bd74c4dc-64c6-04e2-e133-576dde2eea48.png)

8.完了したらCLIの画面に遷移するのでこれでVirtual BoxへAlmaLinuxのインストールは完了。

![スクリーンショット 2024-04-14 004928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875259/f587f13f-2b6d-bab0-61d6-f2c300ee6ca8.png)

![スクリーンショット 2024-04-14 005046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875259/84361a64-5503-7367-6cf2-c53eebb3b36e.png)
WordPressでカクヨムやなろうのルビ記法を使えるようにする

## やりたかったこと
WordPressで`|文字《ルビ》`をルビタグに置き換えたい。

## できたコード
```functions.php
function convert_ruby_strings($content) {
    $pattern = '/\|(.+?)《(.+?)》/';
    $content = preg_replace_callback($pattern, function($matches) {
        $base_text = isset($matches[1]) ? $matches[1] : '';
        $ruby_text = isset($matches[2]) ? $matches[2] : '';
        return '<ruby><rb>' . $base_text . '</rb><rt>' . $ruby_text . '</rt></ruby>';
    }, $content);
    return $content;
}
add_filter('the_content', 'convert_ruby_strings');
```

とりあえずこれで、WordPress本文に入力した`|文字《ルビ》`がちゃんと<ruby><rb>文字</rb><rt>ルビ</rt></ruby>と表示されるようになる。
【MyBatis-Plus】QueryWrapper、QueryChainWrapper、LambdaQueryWrapper、LambdaQueryChainWrapperの比較

## 機能の比較

|  | QueryWrapper | QueryChainWrapper | LambdaQueryWrapper | LambdaQueryChainWrapper |
|:-:|:-:|:-:|:-:|:-:|
| カラム名のメソッド参照 | × | × | ○ | ○ |
| チェーンクエリの使用 | × | ○ | × | ○ |

## コード例

```java:QueryWrapper
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", username);
User user = this.baseMapper.selectOne(queryWrapper);
```

```java:QueryChainWrapper
QueryChainWrapper<User> queryWrapper = new QueryChainWrapper<>(this.baseMapper);
User user = queryWrapper.eq("username", username).one();
```

```java:LambdaQueryWrapper
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getUsername, username);
User user = this.baseMapper.selectOne(queryWrapper);
```

```java:LambdaQueryChainWrapper
LambdaQueryChainWrapper<User> queryWrapper = new LambdaQueryChainWrapper<>(this.baseMapper);
User user = queryWrapper.eq(User::getUsername, username).one();
```

### 参考ページ
https://www.cnblogs.com/yl97/p/14833688.html
【Optuna】LightGBMTunerの使い方が微妙に変わったのでメモ


# 概要

LightGBMTunerを使うとLightGBMで簡単にOptunaを使ったハイパラチューニングができる。

...という記事を以前投稿した。

https://qiita.com/tetsuro731/items/a19a85fd296d4b87c367

が、最近のOptunaのアップデートによって使い方が少し変わったのでここにまとめておく。

ちなみにOptuna内部で行われているベイズ最適化の原理についても以前記事としてまとめたので、興味のある人はこちらも見てね。

https://qiita.com/tetsuro731/items/96df6b923c616080021c

# エラーと解決方法

今までは

```bash 
!pip install optuna
```

で入れた後に

```python
import optuna.integration.lightgbm as lgb
```

とするだけでLightGBMTunerの機能が使えた。
しかし、Optunaのバージョン `3.6.0` 以降はこの機能がoptuna-integration
に移管されたため、これだけだと

```
ModuleNotFoundError: No module named 'optuna'
```

とエラーが出る。

解決方法は単純に

```bash
!pip install optuna optuna-integration
```

のようにoptunaに加えて`optuna-integration`をpipでinstallすればよい。

それか単純に

```
!pip3 install optuna==3.5.0
```

と古いバージョン固定でも大丈夫。
3.6.0での変更内容は以下のrelease noteから詳しく見れる。

https://github.com/optuna/optuna/releases/tag/v3.6.0


# ちなみに

もともと自分はこの変更に気づかず、ある日突然OptunaがこけるようになってしまったためX(Twitter)以下のように呟いた。

https://x.com/tetsuro731/status/1771174758299685112

すると、なんとOptuna開発者の方から直接返信をもらうことができた。

https://x.com/not_522/status/1771186191209271683

「ちゃんと自分で確認しとけよ」という話であるのだが、X(Twitter)やっててよかったーと思った瞬間だった。
感謝。


# まとめ

- Optuna3.6.0でLightGBMTunerの立て付けが少し変わった
- pip install `optuna-integration`で解決
『計量経済学』（有斐閣）実践問題解答例（順次追加）

# 第6章　パネルデータ分析
```
df<-read.csv("data/06_第6章/yamaguchi.csv")
df
glimpse(df)
dim(df)
null_ratio<-colMeans(is.na(df)) #列ごとの欠損値の平均を確認する
null_ratio #欠損なし
#iとtを確認する
library(dplyr)
t_size<-length(unique(df$year))
t_size
i_size<-length(unique(df$pref))
i_size
size<-t_size*i_size
size
#モデル構築
library(fixest) #固定効果モデルに使うモデル
ols<-lm(emp.rate~cap.rate,data=df)
summary(ols)
model1<- lm_robust(emp.rate~cap.rate, cluster = pref, data = df)
summary(model1)
model2<-feols(emp.rate~cap.rate|pref,data=df) #|以下で固定効果と時間効果を指定する
summary(model2,se="cluster")
model3<-feols(emp.rate~cap.rate|year,data=df)
summary(model3,se="cluster")
model4<-feols(emp.rate~cap.rate|pref+year,data=df)
summary(model4,se="cluster")
model5<-feols(emp.rate~cap.rate+age+age.hus+emp.rate.hus+urate|year,data=df)
summary(model5)
model6<-feols(emp.rate~cap.rate+age+age.hus+emp.rate.hus+urate|pref+year,data=df)
summary(model6)
#表にまとめる
msummary(list(ols,model1, model2,model3,model4,model5,model6),
         stars=TRUE)
```

- 固定効果モデルについては、{fixest}というパッケージを用いた。下記のサイトを参考にさせていただいた。https://keita43a.hatenablog.com/entry/2020/12/01/202122
- 表の作成は{msummury}というパッケージを用いた。下記のサイトを参考にさせていただいた。 https://keita43a.hatenablog.com/entry/2020/12/01/202122

# 第7章　操作変数法
```
df<-read.csv("data/07_第7章/ipehd_qje2009_master.csv")
df
glimpse(df)
dim(df)
null_ratio<-colMeans(is.na(df)) #列ごとの欠損値の平均を確認する
null_ratio #inctaxpcが5%欠損している


# IV法 ---------------------------------------------------------------------
library(AER) #IV法のためのパッケージ
#ols
model1<-lm(f_rw~f_prot,data=df)
summary(model1)
#IV
model2<-ivreg(f_rw~f_prot+f_young+f_jew+
                f_fem+f_ortsgeb+f_pruss+
                hhsize+lnpop+gpop+
                f_blind+f_deaf+f_dumb+f_miss|
                kmwittenberg+f_young+f_jew+
                f_fem+f_ortsgeb+f_pruss+
                hhsize+lnpop+gpop+
                f_blind+f_deaf+f_dumb+f_miss,data=df
                )
summary(model2)
msummary(list(model1,model2),stars = TRUE,title = "Table6-1 2SLS Estimation \n of the effect of Protestantism ")

#タイガーストックのF検定
F_model<-lm(f_prot~kmwittenberg+f_young+f_jew+
              f_fem+f_ortsgeb+f_pruss+
              hhsize+lnpop+gpop+
              f_blind+f_deaf+f_dumb+f_miss,data=df)
summary(F_model)
# 過剰識別検定
residuals <- residuals(model2)
df<-df |> mutate(residual=residuals)
model_residual<-lm(residual~kmwittenberg+f_young+f_jew+
                      f_fem+f_ortsgeb+f_pruss+
                     hhsize+lnpop+gpop+
                      f_blind+f_deaf+f_dumb+f_miss,data=df)
library(lmtest)
wald_test_result <- waldtest(model_residual)
wald_test_result
```