OmniAICreator/Qiita-1.07M huggingface dataset:
情報処理安全確保支援士試験 試験対策

## 概要
情報セキュリティマネジメント試験＆応用情報技術者試験合格者なら、数日の準備でどうにかなる、と思う。

## 参考書
知識はこれを1〜2周したらたぶん充分。

徹底攻略 情報処理安全確保支援士教科書 令和5年度 徹底攻略シリーズ

https://www.amazon.co.jp/gp/product/B0BGNZ71G7/

## 視聴覚教材
理解しきれなくても大丈夫（きちんと理解できたときにはたぶん合格レベルに到達している）。
どのくらいひねった or 素直な問題が出るかを理解する上で有用。

Udemy: 【令和4年春版】受験前の総仕上げに最適！「情報処理安全確保支援士試験：過去問題演習」

https://www.udemy.com/course/2022r04h_sc/

## 問題集
試験開始時刻までに（または当日の休み時間を活用して）終わらせたら合格最低点はどうにか取れる、と思う。

2023　情報処理安全確保支援士「専門知識＋午後問題」の重点対策

https://www.amazon.co.jp/gp/product/B0BLSL6ZCY/


## 合格後
情報処理安全確保支援士として登録すべきかしないべきか、それが問題だ。
fdisk

```
[linuxstudy@localhost ~]$ sudo fdisk /dev/sda1 -l

Disk /dev/sda1: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト

[linuxstudy@localhost ~]$ sudo fdisk /dev/sda1 
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x02e5f22d.

コマンド (m でヘルプ): l

 0  空              24  NEC DOS         81  Minix / 古い Li bf  Solaris        
 1  FAT12           27  Hidden NTFS Win 82  Linux スワップ  c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 隠し C: ド c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux 拡張領域  c7  Syrinx         
 5  拡張領域        41  PPC PReP Boot   86  NTFS ボリューム da  非 FS データ   
 6  FAT16           42  SFS             87  NTFS ボリューム db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux プレーン  de  Dell ユーティリ
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
 9  AIX ブート可能  4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
 a  OS/2 ブートマネ 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad ハ eb  BeOS fs        
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT            
 f  W95 拡張領域 (L 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC  
11  隠し FAT12      56  Golden Bow      a8  Darwin UFS      f1  SpeedStor      
12  Compaq 診断     5c  Priam Edisk     a9  NetBSD          f4  SpeedStor      
14  隠し FAT16 <32M 61  SpeedStor       ab  Darwin ブート   f2  DOS セカンダリ 
16  隠し FAT16      63  GNU HURD または af  HFS / HFS+      fb  VMware VMFS    
17  隠し HPFS/NTFS  64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
18  AST SmartSleep  65  Novell Netware  b8  BSDI スワップ   fd  Linux raid 自動
1b  隠し W95 FAT32  70  DiskSecure Mult bb  隠し Boot Wizar fe  LANstep        
1c  隠し W95 FAT32  75  PC/IX           be  Solaris ブート  ff  BBT            
1e  隠し W95 FAT16  80  古い Minix     

```
Nuxt3でyarn generateの結果は.outputに生成される

- Github Actionsを使ってNuxt3で作ったアプリケーションの静的コンテンツをs3のバケットに同期しようと思った時に、どのディレクトリを指定するか戸惑ったので調べてみました。
- **結論は、.outputディレクトリでもdistディレクトリでもどっちでもokです。**

## 目次
- Nuxt3ってなに？
- Nuxt2とNuxt3の静的コンテンツの生成場所の違い
- おわりに

## Nuxt3ってなに？
Nuxt3は、Nuxt.jsフレームワークの最新バージョンで、Vue.jsをベースとしてウェブアプリケーションを開発するためのフレームワークです。Nuxt3はNuxt2の後継バージョンであり、多くの新機能や改善が行われています。

https://nuxt.com/

Nuxt3は、Nuxt2に比べてパフォーマンスの向上、Vue3のサポート、Viteの採用、Nitro Engineの導入、開発者体験の向上、ディレクトリ構造の改善、モジュールとプラグインの改良、静的サイト生成の改善など、多くの新機能と改善が行われています。これにより、Nuxt3は高速で効率的なウェブアプリケーション開発を支援しています。


## Nuxt2とNuxt3の静的コンテンツの生成場所の違い
今回のテーマにもありますが、Nuxt2とNuxt3では、静的サイト生成の際の出力ディレクトリが異なります。

#### Nuxt2
Nuxt2では、yarn generateまたはnpm run generateコマンドを使用して静的サイトを生成すると、生成された静的ファイルはdistディレクトリに格納されます。このdistディレクトリは、Webサーバーにアップロードするか、ホスティングサービスにデプロイすることができます。

#### Nuxt3
Nuxt3では、yarn generateまたはnpm run generateコマンドを使用して静的サイトを生成すると、生成された静的ファイルは.outputディレクトリに格納されます。これはNuxt3の新しい標準です。
しかし、Nuxt3ではdistディレクトリにシンボリックリンクが作成され、このリンクを介して.outputディレクトリの内容にアクセスできます。これは、Nuxt2から移行してきた開発者が混乱しないように、以前の標準であるdistディレクトリを引き続き使用できるようにするためです。

https://nuxt.com/docs/guide/directory-structure/output

#### 補足
・シンボリックリンクについて
シンボリックリンクは、ファイルやディレクトリへの参照として機能する特殊なファイルです。この場合、distは実際のディレクトリではなく、outputディレクトリへのシンボリックリンクとして機能します。これにより、distを開くとoutputディレクトリの内容が表示されます。要するにNuxt3では、実際の静的ファイルは.outputディレクトリにあり、distはその内容に簡単にアクセスするための参照リンクであると理解できます。これらの設定は、通常、ユーザーが直接触るものではなく、これらの設定はNuxt3の内部コードで行われています。

#### Nuxt3においてs3にオブジェクトを同期させる際に、distを指定しましたができました。
上記の説明どおりです。
```yml:actions.yml
run: aws s3 cp --recursive --region ap-northeast-1 ./dist s3://バケット名 --acl public-read
```

## おわりに
- Nuxtと調べるとNuxt3ではなくNuxt2の記事が出てくることが多いので、Nuxt3と検索しましょう。
- よく引っかかります。
応用情報技術者試験に合格するまでにしたこと

2022年4月に行われた応用情報技術者試験にこの度合格したので使用した教材や学習方法について解説や合格のコツを書いていきたいと思います。
(てっきりを投稿したつもりだったのですが、下書きに残ったままだったので今さら投稿です)

アウトライン
1)基礎知識の定着
2)午前対策
3)午後対策
4)本番想定の模試
5)仕上げ（試験前日）
6)合格までに要した時間
7)まとめ

## 1)基礎知識の定着
まず初めにやることは全体をざっくり理解することです。
なので時間をかけずにどんどん進めていきました。

使用した教材はキタミ式の教材です。
2周しました。1週目はすべての章末問題を解き、2週目は1週目で間違えた問題のみ解きました。

ある程度は理解することを意識して解いていました。しかし、深堀をしすぎると時間もかかってしまうので
暗記すべき知識は暗記するしかないと割り切ることが重要かなと思います。

## 2)午前対策
ひたすら過去8年分の問題を[応用情報技術者試験ドットコム](https://www.ap-siken.com/apkakomon.php)で解きました。集中して解くのもいいですが、一問に対する回答時間は短いので隙間時間を活用して量を解くとよいです。同じ問題がたびたび出題されるので重要なポイントがだんだんわかってきます。

わからない問題に関しては答えを理解し、問題に関する周辺知識も調べておくとかなり理解がはかどります。
（暗記しても受かると思いますが、そもそも受かることは目的ではなく知識をつけて業務に活かすことが大切なので今後のためにもやっておくといいと思います。）

## 3)午後対策
ここが一番重要な部分です。どのサイトでも午後が難関だといわれています。実際難しいです。
特に記述が必要とされているのでなんとなくの理解では答えられない部分が多くなります。

対策としては本番選択する大問をあらかじめ決めておき、その大問の過去問を徹底して解きました。
初めはわからないことが多いので時間は決めずに解けるまで時間を使いました。

ただし、本番選択した大問が難しい場合があるので余裕のある方は予備の分野を１～２問準備していくといいと思います。自分は予備で２分野準備していきました。

また記述が多々あるので丸暗記で勉強してきた人はここで苦労すると思います。（なので午前対策は暗記はやめた方がいいです。。。）わからないことがあるときはテキストの解答だけでなく、インターネットで調べたりして根本の部分から調べて理解するとかなりいいと思います。試験対策だけでなく業務でも役に立つと思います。

なお使用教材は過去問が乗っていいればなんでもいいと思います。自分は過去問＋[応用情報技術者試験ドットコム](https://www.ap-siken.com/apkakomon_pm.php)で対策を行いました。

## 4)本番想定の模試
午前対策、午後対策がある程度進んだら早めに本番想定の模試or過去問を時間を測って解きました。
できれば試験の開始時間も合わせるなどのこともして自分がどのくらいの点数を取れるのか確認しましょう。２，３回やると自分の足りない部分だったりがわかるので、この後はひたすら弱点対策を行いました。

もちろん何回も解くことは忘れずに合格点を取るまで繰り返しました。

## 5)仕上げ（試験前日）
前日は仕上げのみで新しい問題や過去問には手を付けず、今までの問題で間違えた部分を徹底して解きました。

## 6)合格までに要した時間
大体以下の時間かかりました。
1)基礎知識の定着　　　　40時間
2)午前対策　　　　　　　30時間　
3)午後対策　　　　　　　40時間
4)本番想定の模試　　　　30時間　
5)仕上げ（試験前日）　　10時間
合計 150時間

## 7)まとめ
自分はギリギリで合格したので、もっと時間をかけて勉強した方がいいと思いました。。。
【react × Typescript ×Firebase】Firebaseからデータの取得

# Firebaseからデータの取得
## ユーザーパスワードで条件を絞り、該当するコレクションをすべて取得
```react:login.tsx
    // ボタンクリックで取得
    const onClickButton = async (value: boolean) => {
        if (value) {
            // コレクションを指定
            const usersRef = collection(db, "users");
            // フィールドの条件を指定
            const q = query(usersRef, where("username", "==", userName), where("password", "==", password));
            // 取得したものをスナップショットに格納
            const querySnapshot = await getDocs(q);
            // 取得したものを表示
            querySnapshot.forEach((doc) => {
                console.log("Document data:", doc.data());
            });
        }
    };
```
Docker環境でNginxのaccess logをファイル保存しようとしてハマった話

# 環境
Docker: 4.20.1
Nginx: 1.23

## 記事の要約
パフォーマンスチューニングを行うために[alp](https://github.com/tkuchiki/alp)というツールを用いてaccess logを解析してエンドポイントごとの実行時間を測ろうとしていたが、Nginxの.confのlog出力先を変更しても保存されずに四苦八苦した話。結論としては、Dockerのデフォルト設定でNginxのlogファイルに[シンボリックリンク](https://wa3.i-3-i.info/word1151.html)が設定されており、シンボリックリンクを解除したところ正常に保存される様になった。

# 目次
[Nginxのaccess_logの出力先の変更](#nginxのaccess_logの出力先の変更)
[シンボリックの削除](#シンボリックの削除)





# Nginxのaccess_logの出力先の変更
Nginxの設定は**etc/nginx/nginx.conf**で変更できる。
下記の様に変更することでlogの出力先を変更可能。（一般的な保存先は **/var/log/nginx/access.log**）
```etc/nginx/nginx.conf
http{
    access_log <File PATH>;
}
        
```
保存先を変更して実行し直してみてもファイルに保存されずに標準出力に出てきてしまっている...？
Docker Desktopで該当ファイルを探して **ls -l** してみたところ、-> **/dev/stdout**となっていることが確認できた。

```terminal
# ls -l var/log/nginx
total 0
lrwxrwxrwx 1 root root 11 May 23 08:51 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 May 23 08:51 error.log -> /dev/stderr
}
        
```
この矢印こそが[シンボリックリンク](https://wa3.i-3-i.info/word1151.html)が設定されているという表示らしい。シンボリックリンクは他の記事でさまざま説明があるので詳細は割愛するが、ポインタの様なものらしい。
つまり、出力先がリンクされてしまっているせいで、**/var/log/nginx/access.log** に出力しても**sdtout**に横流しされる設定になっているということだ。

# シンボリックの削除
[シンボリックリンクの編集](https://s-port.shinwart.com/tech-column/kawatama03/#%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)の記事を参考にした。
どうやら **unlink <ファイル名>** で削除できるらしいので早速やってみた。（cdコマンドで階層移動していることに注意）

```terminal
# unlink access.log
# ls -l
total 0
lrwxrwxrwx 1 root root 11 May 23 08:51 error.log -> /dev/stderr
```
unlinkによってシンボリックリンクの設定が削除されたことが確認できる。
これでDocker image（このあたりの用語にあまり詳しくないのですが、Containerから再構築する必要はないはず）を再起動すればlogが保存される様になっているはず！！

# 終わりに
今回はDocker環境におけるNginxのlog保存周りについて調査を行った。
Docker難しい...。
3選@Power PlatformにおけるAIイノベーション(Microsoft Build Japan 2023感想)

### はじめに
6/27～28に開催されたMicrosoft Build Japanにて、 **「Power PlatformにおけるAIイノベーション」** をオンライン視聴しました。感想を簡単に共有します。

https://info.microsoft.com/JA-ADAI-CATALOG-FY23-06Jun-28-Microsoft-Build-Japan-Day2-SREVM14500_Catalog-Display-Page.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/02a510a2-10fb-0152-ac91-914ea01ea70a.png)

https://www.microsoft.com/cms/api/am/binary/RW16GD8


### ① Power PlatformとAIの関係は？
Power PlatformにおけるAI・Copilotは、 **ノーコード(自然言語)でローコード(関数)を作る技術** ともいえる。

関数に抵抗を感じる非エンジニア層にとっては、ハードルが下がる。例えば、Power Appsでの日付・時刻の表示形式指定はText関数を使う必要があるが、サンプルを掲示すればAIがText関数の中身を生成してくれる。

「プロローコーダー」にとっては、時短になる。繰り返し作成するものや、サンプルデータの追加が簡単にできる。5件のサンプルデータが入っている状態で「あと5件増やして」と伝えるだけ。

### ② 人間に求められる役割は？
人間が担当するのは、 **システムアーキテクトの領域** だと感じた。アプリ単体を作ることは、AIでどんどん簡単になっていく。アプリやサービスをどう連携させるか、全体の構成を設計できる人が求められる。

今回のセッションでは、空調修理点検業務をPower Platformで効率化する、というシナリオで、AI・Copilotを取り入れたデモが行われた。管理者・フィールドエンジニア・顧客のそれぞれが、何を使ってどんなことができるようになるのか、裏では何が動いていてデータはどう流れるのか、などの設計図が明示された。こういった設計図が描ける人の存在価値がより一層高まると感じた。

### ③ Power Virtual Agentsは要らない子？
生成AIの急速な普及により、Power Virtual Agentsでチャットボットを作る必要性がなくなっているのでは、と考えていたが、そんなことなかった。

Power Virtual Agentsは、 **Webサイトを指定したChatGPT・BingAI** っぽく扱える。カンバセーションブースター機能で既存の社内FAQサイトを指定すれば、そのサイト内で情報を検索して応答してくれる。社内コンシェルジュみたいになる。トピックを細かく設定しなくてもOK。

### おわりに
スピーカーの方がおっしゃっていたとおり、今回のMicrosoft Buildは「AI・Copilot祭り」でした。オンラインで視聴できるPower Platform関係のセッションは1つだけ… オフライン会場ではハンズオンでAI・Copilot機能を体験できるセッションがいくつかあり、大盛況だった模様です。次回はオフライン会場に乗り込みたい！

https://note.com/anpanda_44075/n/n6e48f5857228
アサーションルーレットとは

## アサーションルーレット

:::note
**プログラムのデバッグやテストにおいて、アサーションをランダムに有効化または無効化することを指す場合に使われる用語**

アサーションはテストコードやデバッグの目的で使用される
→特定の条件が満たされていることを確認するため
:::

開発者は実際の運用環境でのパフォーマンスの低下やリソースの浪費を避けるために、本番環境ではアサーションを無効化することがある
***

### アサーションの有効化と無効化の状態がプログラムの実行ごとにランダムに切り替わる状況を指す


- 同じコードを実行してもアサーションが有効な場合と無効な場合が交互に発生するため、結果が不安定になる可能性がある

- プログラムの挙動やバグの特定に課題を引き起こす可能性がある

### デバッグやテストの場合
アサーションを一貫して有効または無効にすることが重要
【ChatGPT無】質疑応答Promptで小説を書こうとしたが喧々諤々……久しぶりに続けたら

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

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

　今回は、以前に、
[【ChatGPT無】質疑応答で、ユーザーのやりたいことを支援する？プロンプト](https://qiita.com/kabumira/items/5cef7f2a33bcea996119)
　で、サンプルとして、
　　小説を書こうとしましたが、
　　　タイトル案で喧々諤々。

　それを久しぶりに
　　続けてみました。

>本セッションの履歴から、小説に関しての私の答えを出してください。

　と、入力。
　その結果
　　（番号がありましたけど、カット）
```Text: 回答
以下は、本セッションにおいて小説に関するあなたの回答の抜粋です。

「ファンタジー」と回答されました。
「異世界で、ナーロッパ風の世界です」と回答されました。
「主人公は、もうすぐ40歳のサラリーマン男性。職を転々としています」と回答されました。
「佐藤八郎太」という名前を指定されました。
「街なかで、男女高校生四人とすれ違いざまに、足元に魔法陣が広がった」と回答されました。
「へっ、魔法陣！？」という反応がありました。
「冒険、その際の魔法の修行かな」と回答されました。
「王城からの逃亡」と回答されました。
「冒険者ギルドで冒険者登録を行ない、商業ギルドで馬車を購入。御者として、ランドルフという借金奴隷を購入する」と回答されました。
「王都の脱出を目指す」と回答されました。

以上が、小説に関するあなたの回答の一部です。ご要望がございましたら、適宜修正や追加を行いますので、お知らせください。
```

　続けて、
　　あらすじを
　　　書き出してもらおうと
>これを踏まえて、書き直してください。

>《タイトル：異世界転生 〜魔法陣に巻き込まれた40歳サラリーマンの冒険物語〜》
>
>第1章：魔法陣の奇跡
>
>ある日、忙しいサラリーマンである佐藤八郎太は通勤中に不思議な光景に遭遇する。街中で歩いている高校生たちの足元に突如として魔法陣が広がったのだ。
>
>「へっ、魔法陣！？」八郎太は驚きながらもその光景を目に焼き付ける。
>
>彼の周りには四人の高校生たちが立っており、彼らもまた魔法陣に巻き込まれた様子だった。
>
>やがて魔法陣が消え去り、八郎太と高校生たちは異世界へと転生してしまったのだ。
>
>第2章：異世界への転生
>
>八郎太と高校生たちは異世界で目を覚ます。彼らはナーロッパ風の世界に迷い込んだのだ。
>
>混乱しながらも、彼らは周囲を見渡す。そこには不思議な魔法の力が満ちているのを感じた。
>
>「このままでは王城の追っ手に捕まってしまうかもしれない。私たちは冒険者として生きていくしかないのかもしれない」と八郎太は考える。
>
>第3章：冒険者としての修行
>
>八郎太と高校生たちは冒険者ギルドを訪れ、冒険者としての登録を行う。彼らは魔法の修行や戦闘技術の向上に励みながら、この異世界で生き抜くための準備を始める。
>
>商業ギルドで馬車を手に入れ、旅の道具や食料を調達する。さらに、彼らは借金奴隷であるランドルフを御者として雇う。彼は前衛職の大盾使いであり、パーティの防御担当として頼もしい存在となる。
>
>第4章：禁断の王都へ
>
>八郎太たちは王都への脱出を目指す。しかし、彼らを追いかける王城の追っ手や、自身の力量の不安が彼らを襲う。
>
>果たして、彼らは王都への道を切り拓き、この異世界で新たな生活を築くことができるのか？
>
>《次回予告》
第5章：王都の闇
王都への脱出に成功した八郎太たちは、そこで闇の陰謀に巻き込まれていく。次なる試練が彼らを待ち受けている中、彼らは団結し、王都の闇を打破するために立ち上がる！
>
>以上が、あなたの要望に基づいて書き直した小説の書き出しです。ご要望がありましたら、適宜修正や追加を行いますので、お知らせください。

　まさか、
　　ここまで出してくるとは
　　　思っていませんでした。

　まぁ、
　　タイトルを決定した覚えもないし、
　　　王都脱出が、王都への脱出に
　　　　なっているのは、
　　　　　困りものですが。
***
　これは、
　　ChatGPTが
　　　多少、賢くなっている、
　　　　ということかもしれませんね。

　みなさんも、
　　過去のチャットを
　　　見直してもいいかもしれません。
VPN接続するとvagrantでnfsでマウントされたフォルダがハングする問題

ほぼ自分の覚え書き。解決してしまえば何てことはないのはITあるある。
## 現象
・vagrantで仮想環境を構築する
　↓
・vagrant内でWindowsフォルダをnfsでマウントしている
　↓
・VPN接続するとマウントしたフォルダがハングする
　↓
・ついでに言うとVPN接続した状態で`vagrant up`すると最初からマウントされない
　↓
・なんでだ

## 調べたこと
・まずVagrantfileの書式とかプロトコルはいの一番に疑った
→とはいえプロジェクトで提供されてるものだし問題があったら誰か声をあげるだろうよ

・仮想環境の設定で見落としがあるか
→これも一緒じゃろうて

・Windows側の設定に不備があるのか？
→これはもう知識とカンで調べまくったけどピンとくるものはなかった

・ファイアウォールか？
→実はこの一歩手前の段階でnfsでのマウントそのものができない問題があり、それはESET ENDPOINT Securityが許可していなかった。今回もそれかと思って疑ったがどうもピンとくるものがなかった。

## 解決方法
一言でいってしまえばプロトコルを変えてしまえばよかった。
具体的なVagrantfileの書式（一部抜粋）は以下の通り
```
## これが提供された初期状態
#config.vm.synced_folder "../..", "/vagrant" , type: "nfs" 

## rsyncでも接続するがWindow->仮想環境の片方向同期なのでイマイチ
## さらにリアルタイム同期するには[vagrant up]したところで[vagrant rsync-auto]しないとダメ
## しかも[vagrant rsync-auto]を実行するとサーバ起動状態になってプロンプトが返ってこない
#config.vm.synced_folder "../..", "/vagrant"  , type: "rsync", rsync__auto:true, rsync__exclude:".git/"

## Sambaにしたら双方向リアルタイム同期になったのでこれにした
config.vm.synced_folder "../..", "/vagrant"  , type: "smb", smb_username:"WindowsログインユーザID", smb_password:"Windowsログインパスワード"
```
## windows10でのSamba有効化
[コントロールパネル]->[プログラム]->[プログラムと機能]にある[Windowsの機能の有効化または無効化]クリックして立ち上がった小窓で[SMB 1.0/CiFSファイル共有のサポート]（画像）をクリック
![0c05641403ef269ecee4b4a4c04b8e35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75602/c62bf867-de50-673f-4ca6-79d0670d13ba.png)

## 原因について
よくわからんけどnfsってMac|Linux用のフォルダマウントプロトコルらしいからWindows上にインストールされたVPN接続アプリ（FortiClient）だとトンネリングで問題があるんじゃない？知らんけど。

## 雑感
今時はMacOS前提で環境構築する事が多いのでWindowsだと見えないところで問題が噴出しまくるという症例のひとつ。nfsなんてなんとなくは聞いたことあるなあくらいでMac|Linux専用とか知らなかったし。そもそもここに書いたのも何日も悩み苦しんだ上で霊感が舞い降りてたまたま解決しただけで理由とかよくわからぬ。
AWS CLIのすすめ

DBエンジニアの嫁と息子が大好きなだいちです。
ティアキンをやりつつこの間発表された、任天堂オンラインでファイアーエムブレムの封印の剣が配信されたことで僕の心は大きく揺らいでます。
GBアドバンスで初めてプレイしたゲームって懐かしすぎますよね。

## はじめに
AWSを利用するときですが、多分大抵の人がマネジメントコンソールを利用しているかと思います。
僕自身も、よく利用しています。使いやすいしわかりやすいですよね。
長くAWSを利用しているとナレッジも溜まってくると思います。
色んな媒体に色んな手順を纏めたりしているかと思いますが、ここでよくあるのがマネジメントコンソールのUIが変わっていて若干手間取ってしまうこと。
ちょっと調べればすぐに解決することのほうが多いとは思いますが、個人的にこのちょっと調べればが若干面倒くさいなと感じています。
せっかくナレッジがまとまっているんだからナレッジだけで完結したい（いつ見ても大丈夫というのは理想かと思いますが、）。
そんな思いをきっかけでCLIを[利用してRDSのバージョンアップ](https://qiita.com/dai_chi/items/40c9cd5fd1117114f9eb)を実施したりもしました。
この記事ではAWS CLIの魅力を知見が浅い僕ですが伝えていきたいと思います。

## AWS CLIとは
AWS CLI（Command Line Interface）は、AWSサービスをコマンドラインから操作するためのツールです。AWS CLIを使用すると、スクリプトを通じてAWSサービスを自動化したり、AWS Management Consoleで行う手作業を省略したりすることができます。

### AWS CLIのメリット
1. 自動化
AWS CLIを使用すると、AWSサービスの操作をスクリプト化して自動化することができます。これにより、手作業でのミスを防ぎ、一貫性を保つことができます。

2. 効率性
AWS CLIは、一度に複数の操作を行うためのバッチ処理をサポートしています。これにより、大量のリソースを効率的に管理することができます。

3. 柔軟性
AWS CLIは、AWS Management Consoleで提供されているすべての機能に加えて、一部の高度な機能を提供しています。これにより、より複雑なタスクを実行することができます。

4. ポータビリティ
AWS CLIは、Windows、Mac、Linuxなど、さまざまなオペレーティングシステムで動作します。これにより、どの環境からでもAWSサービスを操作することができます。

# AWS CLIのデメリット
1. 学習曲線
AWS CLIはコマンドラインツールであるため、GUIベースのAWS Management Consoleに慣れている人にとっては、最初は学習が必要です。

2. エラーハンドリング
コマンドラインからの操作は、エラーメッセージの解読やトラブルシューティングが必要な場合があります。

3. セキュリティ
AWS CLIを使用すると、認証情報（アクセスキーとシークレットキー）をローカルマシンに保存する必要があります。これらの情報の管理と保護は、セキュリティ上重要です。

## 個人的に感じているメリット
先日記事にもしてますが、ナレッジを纏めるのが楽になりました。しかもほぼ更新の手間も省けているはず。
はず、というのはこの先の未来で見返したときにどう感じるか次第というところにつきます。
記事はこちら→[AWS CLIでRDSのバージョンアップをやった話](https://qiita.com/dai_chi/items/40c9cd5fd1117114f9eb)

また、実際にナレッジをみて手を動かすときにコマンドのコピペをするだけで済むとも思っています。
初見のコマンドはたとえナレッジにまとまっていたとしても若干どうなるのかわからないというのもあるかと思いますが、
その場合はすぐにサービスに影響を及ぶような環境では実施せずに、検証すればいいだけです。

## どうやって使うのか？
1. AWS CLIのインストール
まず、AWS CLIを使用するには、インストールする必要があります。AWS CLIはWindows、Mac、Linuxの各オペレーティングシステムで利用可能です。公式のAWS CLIユーザーガイドには、各プラットフォームに対する詳細なインストールガイドが含まれています。

2. AWS CLIの設定
次に、AWS CLIを設定する必要があります。これには、AWSアカウントの認証情報（アクセスキーとシークレットキー）をCLIに提供する作業が含まれます。以下のコマンドを使用して設定を開始します。

```
aws configure
```

これにより、以下の情報を入力するように求められます：

- AWS Access Key ID
- AWS Secret Access Key
- Default region name
- Default output format

## 3. AWSサービスの操作

設定が完了したら、AWS CLIを使用してAWSサービスを操作することができます。以下に、いくつかの基本的なコマンドを示します。

- S3バケットの一覧表示

```
aws s3 ls
```

- EC2インスタンスの起動

```
aws ec2 run-instances --image-id ami-0abcdef1234567890 --count 1 --instance-type t2.micro --key-name MyKeyPair --security-group-ids sg-903004f8 --subnet-id subnet-6e7f829e
```

これらは一部の例ですが、AWS CLIはサポートされているAWSのサービスを操作することができます。

## まとめ
CLIとなるとハードル高く感じるかもですが、僕自身も初見のコマンドに対しては使うとどうなるのかわからないことから不安を覚えますが、しっかりと理解して利用すると自分が想定する動きをしてくれるので、まずはしっかりと検証して動きを理解することが大事だなと思います。
まぁ僕自身がVimを利用しているのもあってCLIへの抵抗がないというのもありますが、マネジメントコンソールしか利用したことない人はぜひともリソースの情報を取得するからでも試してみてください！

## 参考
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html
【Flutter】AsyncNotifier で 初期化処理を共通するときは気をつけよう



### この記事で伝えたいこと
- state を更新するときは安全に更新できているかしっかり確認しよう


## AsyncNotifier.build / Retry 時に全く同じメソッドを使用
もちろん同じメソッドを使用しても問題ない実装もございますが、今回の例ではマズイです。

**ホームページ**
```dart
class HomePage extends ConsumerWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final state = ref.watch(asyncTodosProvider);
    return Scaffold(
      body: state.when(
        data: (data) => ListView.builder(
          itemBuilder: (context, index) => ListTile(
            title: Text(data[index].description),
          ),
          itemCount: data.length,
        ),
        error: (e, s) => Center(
          child: TextButton(
            onPressed: () {
              ref.read(asyncTodosProvider.notifier).fetchTodo();
            },
            child: const Text('Retry'),
          ),
        ),
        loading: () => const CircularProgressIndicator(),
      ),
    );
  }
}

```


**riverpod_generator で実装した AsyncNotifier部分**
```dart:todo.dart
@riverpod
class AsyncTodos extends _$AsyncTodos {
  Future<List<Todo>> fetchTodo() async {
    final todos = // List<Todo> を取得
    return todos;
  }

  @override
  FutureOr<List<Todo>> build() async {
    return fetchTodo();
  }
}
```
↑の実装では、エラーをキャッチしてくれない場合があります。その状況と原因はわかりますか？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2552610/b4e891c6-30c9-610e-5159-c5711084aa21.jpeg" width="100%">

### fetch の再試行時にエラーが発生
`AsyncTodos.fetchTodo`は内部的に `try-catch`や`AsyncValue.guard`を使用していないためエラーをキャッチしてくれません。


## 初期化の fetchTodo と 外部から呼ばれる fetchTodo を分離しよう
外部から呼び出せないプライベートなメソッド： `_fetchTodo`
外部から呼び出せるため、`AsyncValue.guard`でエラーハンドリングするメソッド: `fetchTodo`


```dart:todo.dart
@riverpod
class AsyncTodos extends _$AsyncTodos {
  Future<List<Todo>> _fetchTodo() async {
    final todos = // List<Todo> を取得
    return todos;
  }

  @override
  FutureOr<List<Todo>> build() async {
    return _fetchTodo();
  }

  Future<void> fetchTodo() async {
    state = await AsyncValue.guard(_fetchTodo);
  }
}
```


### なぜ`_fetchTodo`では、`AsyncValue.guard`を使用していないのか
実は build 関数内で呼ばれるメソッドは、内部的に `AsyncValue.guard`で実装されているのです。

https://github.com/rrousselGit/riverpod/blob/da4909ce73cb5420e48475113f365fc0a3368390/packages/riverpod/lib/src/async_notifier/base.dart#L512


### 安全に AsyncValue を使いこなしましょう！

## 参考
https://docs-v2.riverpod.dev/docs/providers/notifier_provider
【2023年7月利用可能】GASを使用してGoogleDrive上の画像をTweetする

GASを使用してtwitterで画像をツイートするコードを備忘録として残します。
twitter APIは今年に入って多くの改変（主に改悪）をしていますが、こちらは2023.6.29現在、Freeプランでツイート可能です。

すでに文章のみでのツイートはできる前提での記事になりますので、そちらについては以下のわかりやすい記事がございますので、そちらを参考にしてください。

https://qiita.com/k7a/items/e6a456bec26b4e667c47

以下はやっていくことのイメージです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479876/bd62aebd-fdbf-ee6e-ceb8-18d979fc02eb.png)

ポイントは2つあって
#### 1.Base64への変換が必要
#### 2.アップロード先とツイート先のapiが違う

以下、コードです
```
function tweetWithImage() {
  var value = '******'; // Replace with your tweet message
  
  // Upload the image and get its media ID
  var mediaId = uploadImageFromDrive();

  // Check if the image upload was successful
  if (mediaId) {
    // Tweet with the uploaded image
    const url = "https://api.twitter.com/1.1/statuses/update.json";
    const payload = {
      "status": value,
      "media_ids": mediaId
    };
    const options = {
      'method': 'post',
      'payload': payload,
      'muteHttpExceptions': true
    };
    makeRequest(url, options);
  }
}

// Upload an image from a Google Drive URL to Twitter and return its media ID
function uploadImageFromDrive() {
  var imageFile = DriveApp.getFileById("******"); //https://drive.google.com/file/d/******/view 
  var base64Data = Utilities.base64Encode(imageFile.getBlob().getBytes())


  const url = "https://upload.twitter.com/1.1/media/upload.json";

  const service = getService();
  const mediaUploadParams = {
    'method': 'post',
    'payload': { 'media': base64Data },
    'muteHttpExceptions': true
  };

  const res = service.fetch(url, mediaUploadParams);
  const result = JSON.parse(res.getContentText());

  if (result && result.errors && result.errors[0] && result.errors[0].code === 324) {
    console.log('Error: Unsupported media type. Please ensure the image is in a supported format (JPEG, PNG, GIF).');
    return null;
  }

  if (result && result.media_id_string) {
    return result.media_id_string;
  } else {
    console.log('Image upload failed.');
    console.log(res.getContentText()); // Log the response content text for debugging
    return null;
  }
}

function makeRequest(url, options) {
  const service = getService();
  const res = service.fetch(url, options);
  const result = JSON.parse(res.getContentText());
  console.log(JSON.stringify(result));
}
```

chatGPTがくれたコードを少しかえてもってきたのでやや冗長ですがこれでうまくいきました
適宜******を本文と画像のID(https://drive.google.com/file/d/******/view)にかえてください
chatGPTがBase64への変換をやってくれず苦労しました、

参考　
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10253949515
https://note.com/kadoyu/n/naa35ff9f945f
https://www.noelcafe.com/blog/entry_010157/
PostgreSQLでpostgresコマンドを実行したらサーバー設定ファイルが認識していなかった

# 経緯
PostgreSQL上で、password_encryptionパラメータを確認したかったので、
postgresコマンドを使おうとしたら、
「postgresはサーバー設定ファイルの場所が認識できません。
--config-fileまたは-Dオプションを指定する、あるいはPGDATA環境変数を設
定する必要があります。」
で怒られてしまったので、備忘録として残しておくことにしました。

※英語表記では以下のような出力になります。
「postgres does not know where to find the server configuration file.
You must specify the --config-file or -D invocation option or set the PGDATA environment variable.」

### 実行コマンド
/usr/pgsql-15/bin/postgres -C password_encryption

# 環境情報
OS：Oracle linux 8(8.7)
DB：PostgreSQL 15(15.2)

# 公式ドキュメント
公式ドキュメントを確認すると、
「postgresは起動時にデータ領域の場所を知る必要があります。デフォルトはありません。」と
記載があったため、-Dオプションなどで指定しないといけないようです。

# やってみた
/usr/pgsql-15/bin/postgres -C password_encryption -D /data/
scram-sha-256

無事に出力することができました。

### 番外編
今回はpostgresユーザで実行しましたが、rootユーザから環境変数を引き継がずにスイッチすると
カレントディレクトリが/rootとなってしまいます。
その状態でpostgreコマンドを実行すると、正常に出力はされるものの
/root配下でログを書き込むような動作をするので権限がないと警告が出ます。

/usr/pgsql-15/bin/postgres -C password_encryption -D /data/
LOG:  42501: could not change directory to "/root": Permission denied
LOCATION:  resolve_symlinks, exec.c:321
scram-sha-256

なので、ちゃんと環境変数をしっかりと引き継いでおくと、気持ち悪い状態には
ならないので頭の片隅に置いておくとよいです。

# 参考情報
【公式ドキュメント】
https://www.postgresql.org/docs/15/app-postgres.html
Auth0 User情報を取得するPowerShellスクリプト

下記サイトを参考にしています。1つのスクリプトで実施できるようになったので備忘録として残します。
https://future-architect.github.io/articles/20221130a/


実行環境		Windows Server 2019
PowerShellバージョン	5.1.17763.3770


★スクリプトのコード
```
$client_id =  "API Explorer Application　の　Client ID"
$client_secret =  "API Explorer Application　の　Client Secret"
$api =  "Auth0 Management API　のIdentifier(https://ドメイン名.jp.auth0.com/api/v2/)"

$body = @{
    client_id = "$client_id"
    client_secret = "$client_secret"
    audience = "$api"
    grant_type = "client_credentials"
}
$gettoken = Invoke-RestMethod -Method Post -Uri "https://ドメイン名.jp.auth0.com/oauth/token" -ContentType 'application/json' -Body ($body|ConvertTo-Json)
$token = $gettoken.access_token

Invoke-RestMethod -Method Get -Uri "https://ドメイン名.jp.auth0.com/api/v2/users" -Headers @{Authorization="Bearer $token"} >>users.txt
```

★元記事からの変更点
取得したtokenをoutput.txtに出力するのではなく、変数として取り込み1つのスクリプトで実行できるようにした。
具体的には以下の通り。
・11行目で取得したTokenを変数「gettoken」(適当に命名したもので他の名前でも可)に代入。
・access_token以外にもscope等今回の処理には不要な情報も取れるので、12行目で「access_token」のみを取得し、変数「token 」(これは元記事の変数名そのまま)に代入している。

★11行目で取得されるTokenの内容
{"access_token":"ey(長いので省略)oW40w","scope":"read:client_grants(他多数あり省略)update:client_credentials","expires_in":86400,"token_type":"Bearer"}
CloudFront Functions でドメインのリダイレクト

`example.jp` で提供していた Web サービスのドメインを `example.com` に変更したい場合、古いドメイン `example.jp` に来たリクエストを新しいドメイン `example.com` にリダイレクトさせる仕組みを CloudFront Functions を使って作ったら簡単だったという話。

## CloudFront Functions とは
CloudFront Functions は、CDN のエッジ環境で JavaScript 関数を実行できる機能。

類似の仕組みに Lambda@Edge があるが、Lambda@Edge と比べると CloudFront Functions の方が安くて速くて簡単である代わりに制約が多い、というのが雑なイメージ。(以下の記事が詳しい)

https://qiita.com/AkitoTsukahara/items/db090519602c49940aaf

Lambda@Edge も触ってみたが、実行 Role に信頼関係の設定追加が必要だったり、Distribution との関連付けの際にバージョン番号を発行しないといけなかったり、少し手間がかかるところがあった。

今回のような「特定のルールに従ってリダイレクトさせる」だけであれば CloudFront Functions で問題ない。

## 作っていく
### Distribution の作成
Distribution の作成方法の詳細は割愛するが、ひとつ注意点としては、ダミーでも Origin を指定する必要があるので空の S3 バケットを作成して指定した。

### Function の作成と関連付け
CloudFront のメニューの「Functions」から適当な名前の関数を作成して下記コードを書いて保存する。

``` javascript
function handler(event) {
    return {
        statusCode: 301,
        statusDescription: 'Moved Permanently',
        headers: {
            'location': { value: 'https://example.com' + event.request.uri }
        }
    }
}
```

「Test function」して問題なさそうであれば「Publish function」する。

作成した関数を Distribution と関連付けるには、関数のページの「Associated distributions」からでもできるし、Distribution の Behavior の設定からでもできる。

関数の実行タイミングは今回は「Viewer request」に設定した。

### ドメインと証明書の設定
Distribution に Alternate domain names を追加して ACM で発行した証明書を割り当てたり、DNS の設定を変えてリクエストが CloudFront に向かうようにしたり。このあたりもよくあるやつなので詳細は割愛する。

## 動作確認
``` console
$ curl -I https://example.jp/foo
HTTP/2 301 
server: CloudFront
date: Thu, 29 Jun 2023 00:00:00 GMT
content-length: 0
location: https://example.com/foo
x-cache: FunctionGeneratedResponse from cloudfront
(以下略)
```

問題なく動作していそう。
仮想マシンとDocker：その違いと使用シーンについて


## 1. はじめに：仮想マシンとDocker

アプリケーションのデプロイと管理を容易にするために、仮想マシンとDockerが広く使用されています。しかし、これらはアーキテクチャと機能の違いから、それぞれ特定のシナリオで優れたパフォーマンスを発揮します。

![DockerとVM (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/d4ebd32d-9a9b-7d77-647d-2fd2ff9178d9.png)


## 2. 仮想マシンとは何か

仮想マシンは物理ハードウェアの上に、仮想化ソフトウェアまたはハイパーバイザーを使用して複数の異なるOS環境を実行する技術です。各仮想マシンは、オペレーティングシステムとその上で実行されるアプリケーション、サービスのすべてを含む完全なシステムとして動作します。しかし、それぞれの仮想マシンが個々のOSを必要とするため、システムリソースの使用効率はDockerよりも低くなります。

## 3. Dockerとは何か

Dockerは、ソフトウェアとその依存関係を一つのパッケージ、すなわちコンテナにまとめます。そして、DockerはホストシステムのLinuxカーネルを共有するため、コンテナは高速に起動し、軽量な運用が可能です。コンテナ内のアプリケーションは、その実行に必要なライブラリと依存関係を含むため、開発環境から本番環境まで一貫した動作を実現します。

Dockerコンテナは、Linuxカーネルの特定の機能（特に名前空間とコントロールグループ）を使用して、プロセスとリソースの隔離を提供します。コンテナは、その中で実行されるプロセスが他のプロセスと独立して動作するかのように見せるために、これらの機能を使用します。

「プロセス」とは、コンピュータのOSがプログラムの実行を管理するための仕組みで、実行中のプログラムのインスタンスを指します。プロセスはそれぞれ独立したメモリ空間を持ち、一連の手続きやタスクを実行します。システム内で複数のプロセスが同時に実行されることが一般的です。

「リソース」とは、システムがプロセスの実行に必要とする各種の要素を指します。これにはCPU時間、メモリ、ネットワーク接続、ディスクIOなどが含まれます。これらのリソースは限られているため、OSはこれらをプロセス間で適切に割り当てる必要があります。

コンテナはそれぞれが独立したOS環境を持つように見えますが、実際にはすべてのコンテナが同じホストOSのカーネルを共有しています。コンテナに必要なのは、アプリケーションが動作するために必要な最小限のOSの部分だけなので、コンテナは一般的に仮想マシンよりもはるかに軽量です.

この設計は、コンテナの起動時間を短縮します。なぜなら、OS全体をブートするのではなく、必要なプロセスだけを開始すればよいからです。また、メモリ上の占有領域も少なく、スケーラビリティも向上します。

したがって、Dockerコンテナが共通のカーネルを共有することで、それぞれのコンテナはより軽量で、迅速に起動することが可能になります。一方、仮想マシンは各々が完全なOSを含むため、それぞれの起動と実行にはより多くのリソースと時間が必要となります。

## 4. 仮想マシンとDockerの比較

- **システムリソースの使用：** DockerはホストOSのカーネルを共有するため、仮想マシンよりも大幅に少ないリソースを使用します。仮想マシンはそれぞれが完全なゲストOSを必要とするため、CPU、メモリ、ストレージの消費が大きくなります。
  
- **ポータビリティ：** DockerコンテナはOSのカーネルを共有するため、開発環境からテスト環境、本番環境へとスムーズに移行することができます。一方、仮想マシンはハードウェアとOSの互換性を保証するための追加の調整が必要です。

- **起動時間：** Dockerコンテナはカーネルを共有し、システムリソースが少ないため、起動は非常に高速です。一方、仮想マシンは完全なOSを起動するため、起動時間が長くなります。

- **セキュリティ：** 仮想マシンはゲストOSが分離されているため、他の仮想マシンから隔離された環境を提供します。一方、Dockerコンテナはカーネルを共有するため、その隔離レベルは仮想マシンよりも低い可能性があります。

### 仮想マシンが重くなる理由

仮想マシンが「重い」と感じる理由はいくつかありますが、主な理由は以下のとおりです。

##### 完全なOSの実行:
 仮想マシンは完全なOSを実行するため、そのために必要な全てのリソース（CPU、メモリ、ディスクスペースなど）を確保しなければなりません。これは、ホストマシンのリソースを大量に消費するため、全体的なパフォーマンスに影響を与えます。

##### ハイパーバイザーのオーバーヘッド: 
仮想マシンはハイパーバイザー（仮想化ソフトウェア）を介してハードウェアリソースにアクセスします。この間接的なアクセスは、パフォーマンスにオーバーヘッドを生じさせ、仮想マシンの動作を遅くさせます。

##### 起動時間:
仮想マシンはフルのOSを起動する必要があります。OSが全てのサービスとプロセスをロードするのには時間がかかるため、新しい仮想マシンを起動するのには相応の時間がかかります。

一方、Dockerコンテナはこれらの問題を回避します。コンテナは共有カーネルを使用し、完全なOSの代わりにアプリケーションが実行するのに必要な最小限の環境を提供します。これにより、リソース使用量と起動時間が大幅に減少します。また、DockerはOSレベルでの仮想化を使用するため、ハイパーバイザーのオーバーヘッドを避けることができます。これが、Dockerが「軽量」である主な理由です。






## 5. 使用シーンの選択

仮想マシンはそれぞれが完全なOS環境を提供するため、異なるOSで動作するアプリケーションを同時に実行する必要がある場合や、強固な隔離が必要な場合に適しています。

一方、Dockerはアプリケーションのデプロイ、スケーリング、移植性に優れています。開発者はコードをDockerコンテナにデプロイすることで、それがどの環境でも一貫した動作をすることを確信できます。また、マイクロサービスアーキテクチャを採用している場合、Dockerは各サービスを独立したコンテナとして運用するのに理想的な選択肢となります。

以上が仮想マシンとDockerの概要とその使用シーンについての解説です。これがDockerへの理解の一助となれば幸いです。
【PHP8.0】名前付き引数でソースコードをわかりやすくする

# はじめに
`PHP8.0`から導入された**名前付き引数**について、業務中レビューを頂いて知りました。
忘れないように備忘録として。。

https://www.php.net/manual/ja/functions.arguments.php#functions.named-arguments:~:text=10-,%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%8D%E5%BC%95%E6%95%B0,-%C2%B6

# 使い方
```php
// 関数
function test(string $name, int $age) {}

// 名前付き引数を使わず呼び出し(パターン1)
test('テスト', 20);
// 名前付き引数を使わず呼び出し(パターン2)
$userName = 'テスト';
$userAge = 20;
test($userName, $userAge);

// 名前付き引数を使って呼び出し
test(name: 'テスト', age: 20);
```
名前付き引数を使う方法は、**関数が受け取る引数の名前**に**コロン**を付けて値を渡すだけです。
```
function test（test関数が受け取る引数の名前: 値);
```
また名前付き引数を使う場合、引数の順番を変えることもできます。
```php
// どちらでもOK
test(name: 'テスト', age: 20);
test(age: 20, name: 'テスト');
```

# まとめ
名前付き引数を使うことで、関数呼び出しで値を直接渡したい際に、よりわかりやすいコードとなると思います！
わかりやすいソースコードの実装の一つとして使っていきたいと思います！
IBM Cloud Functionsを利用してCISの送信元IPアドレス変更をSlackへ通知する

# はじめに

IBM Cloud Functionsを利用してCISの送信元IPアドレス変更をSlackへ定期的に通知する方法を紹介します。

スクリプト(bash)で実行した例は下記記事で紹介しておりますのでご参照ください。

IBM Cloud CISの送信元IPアドレス変更を検知する
https://qiita.com/aktech/items/f6cf0a9771c26c117825

今回はサーバーレスのFunctionsを用いる例となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329464/59137fdf-98a5-0d77-3d94-8d4cecccc534.png)




# Functions アクション(Action)の設定

Python3.11環境を選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329464/cd5ce4fd-e643-15de-e083-13b67aac72ec.png)


```console:cis-ip-check-action
import sys
import requests
import json

def main(params):
    try:
        url = "https://api.cis.cloud.ibm.com/v1/ips"
        url_slack = "https://hooks.slack.com/services/xxxxxxxxx/xxxxxxx/xxxxxxxxxxxxxxxxxxxxx"
        r = requests.get(url)
        if r.status_code != 200:
            return {
                'statusCode': r.status_code,
                'body': {'message': 'Error processing your request'}
            }
        elif r.json()["result"]["etag"] == "38f79d050aa027e3be3865e495dcc9bc":
            body = {'username':'CIS IP Check','icon_emoji':':warning:','text':'There is no difference.'}
            response = requests.post(url_slack,data=json.dumps(body))
            return {
                'body': {'message': 'There is no difference.'}
            }
        else:
            body = {'username':'CIS IP Check','icon_emoji':':warning:','text':'There is a difference. CIS IPS has been changed.'}
            response = requests.post(url_slack,data=json.dumps(body))
            return {
                'body': {'message': 'There is a difference. CIS IPS has been changed.'}
            }
    except requests.ConnectionError:
        return {
            'body': {'message': 'break.'}
        }

```

CISの送信元IPアドレスリストが変更となった場合、APIから応答されるetagが変更になることを前提としたコードになります（2023/06/29時点で応答されるetagは"38f79d050aa027e3be3865e495dcc9bc"です）

# Functions トリガー(Trigger)の設定

トリガー > 作成 > トリガー > Periodic (時刻に基づいてアクションをトリガーします)

今回は、22:00 JST(10:00 PM)、23:00 JST(11:00 PM)、00:00 JST(12:00 AM) に実行する例です。
(Functionsの画面から定期実行間隔を指定可能。Cron構文での指定可能）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329464/e302b5d9-9f9a-7e9f-1366-6ae75c7ddc5c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329464/c86e9f42-48e2-1700-34fb-60b99482bb22.png)


# 実行結果(トリガーによる定期実行)

Functionsで指定した時間にSlackへ定期通知ができていることを確認した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329464/d5ebc757-742e-8eef-f36f-87a2db299ad0.png)



# 実行結果(コードの動作確認)

コードを設定する画面で手動起動して動作確認することも可能

下記画面で起動ボタンを押すと、右側に結果が表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329464/825122cd-90f2-6944-8706-fb7bd29c4491.png)



# 参考URL

IBM Cloud Functions からPythonで Slack にメッセージをPostする
https://qiita.com/c_u/items/5399b5bef20158787ca2
【vim】基本的なコマンド一覧

# はじめに
ファイルの作成・編集・保存ができる`vim`コマンド。
何度使ってもすぐに忘れてしまうので、備忘録として、、、

# ファイルを作成／編集する
```
vim ファイル名
```
指定したファイルが存在すれば、ファイルを開き、
ファイルが存在しなければ、新しく作成しファイルを開きます。

# テキストを入力する
`vim`ではファイルを開いただけでは入力はできません。
テキストを入力するには、`vim`を**コマンドモード**から**入力モード**に切り替えないといけません。
**入力モード**にするには以下のようなコマンドを打つ必要があります。
| コマンド | 内容 |
|:-:|:--|
| i | カーソルが当たっている部分の前から入力 |
| a | カーソルが当たっている部分の後ろから入力 
| I | カーソルが当たっている行の先頭から入力 |
| A | カーソルが当たっている行の末尾から入力 |
| o | カーソルが当たっている行の下に改行し入力 |
| O | カーソルが当たっている行の上に改行し入力 |

入力した文字を削除する場合は**BackSpaceキー**を、入力モードを終了する場合は**escキー**を入力します。

# vimを閉じる
入力が終わりファイルを保存したり、保存せず閉じたりするには**コマンドモード**で以下のようなコマンドを打つ必要があります。
| コマンド | 内容 |
|:-:|:--|
| :q | 保存せずに終了（編集した場合は破棄するかの確認が有） |
| :q! | 保存せずに終了 |
| :w | 保存 |
| :wq または ZZ | 保存して終了 |

# その他コマンドモードで使えるコマンド
コマンドモードで**文字を削除**したり、**行をコピー**したり、**カーソルを移動**したりすることもできます。

### ー 削除
| コマンド | 内容 |
|:-:|:--|
| x | カーソル位置の文字を削除 |
| D | カーソル位置から行末までを削除 |
| C | カーソル位置から行末までを削除し入力モードにする |
| dw | カーソル位置から単語の最後までを削除 |
| cw | カーソル位置から単語の最後までを削除し入力モードにする |
| daw | カーソルが当たっている単語をスペースを含んで削除 |
| dd | カーソルが当たっている1行を削除 |

※`d`はdelete、`c`はchangeと覚える！

### ー コピー＆ペースト
| コマンド | 内容 |
|:-:|:--|
| yy | カーソルが当たっている1行をコピー |
| yw | カーソル位置から単語の最後までをコピー |
| yaw | カーソルが当たっている単語をスペースを含んでコピー |
| P | カーソル位置の前にペースト |
| p | カーソル位置の後にペースト |
### ー 移動
| コマンド | 内容 |
|:-:|:--|
| w | カーソルが当たっている次の単語の先頭に移動 |
| b | カーソルが当たっている前の単語の先頭に移動 |
| e | カーソルが当たっている単語の最後に移動 |
| 0 | カーソルが当たっている行頭に移動 |
| $ | カーソルが当たっている行末に移動 |
| gg | ファイルの先頭に移動 |
| G | ファイルの最後の行に移動 |

# まとめ
他にもコマンドはたくさんありますが、まずは基本から！
もっとたくさんのコマンドを使えるように、たくさん活用します！
Create the Quick Action


+ Make sure the status field exists

 SETUP --> OBJECT MANAGER --> Job Application --> Fields & Relationships

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/252bf52c-c09c-6df8-0019-3b191223fd7c.png)


+ Create the Quick Action

SETUP --> OBJECT MANAGER --> Candidate --> Buttons, Links, and Actions --> New Action 


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8ceba282-4a87-7136-16aa-5eac346aa7b6.png)

# Check the contents of the package

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/adbdc50e-2849-b127-ceaf-ee6ea803d6ca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3d7369f7-f394-4747-096e-094255e3f420.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5a4fcf1c-be7e-2fe3-e2f7-a8eb80383e7a.png)
AIググるくんをリリースしました🙌

ChatGPT とGoogle検索を組み合わせたAIググるくんを作りました！

今まで最新の情報にはアクセスできないから…とまだChatGPTを使ってなかった方に使ってみていただきたいです〜

![A9781699-1BD2-4091-8083-7C3242568720.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18761/e0d82d54-0e5b-759e-11cc-c0602641a739.jpeg)

![4EBDA136-BB63-4EF6-BEE5-95B7AB0BF1D3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18761/91abc3db-0a4f-daea-37d6-960212956015.jpeg)

お友達になってハッシュタグと一緒に感想を聞かせてください。

LINE Add Friend
https://lin.ee/5iCYJXS


![71DAAC96-F6AB-47FC-9C40-9C63BFC3C8CD.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18761/59fe4fa7-8234-1b96-e047-57c9a4212950.jpeg)
サーブレットのURLパターン

# サーブレット
サーブレットとはWebサーバーがWebブラウザからリクエストを受けた際にAPサーバー内にあるlogicプログラムを呼び出し結果を受けとりJSPを指定してWebブラウザに結果を返却するものである。

サーブレットは自分自身のプログラム内に自分自身のURLパターンを指定することが出来る。
方法としてはアノテーションを用いて
~~~serv.java
@WebSerblet(urlPatterns={"/testserv"})
~~~
このように記述することで
``http://サーバー名:ポート番号/rootディレクトリ/サーブレットが指定した名前``
でアクセスすることが可能になる。
指定しない場合はサーブレットのファイル名がサーブレットのurlになるがセキュリティ上少し変更を加えることが推奨されている。
Service Cloud

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

+ [Service Cloud Console](https://qiita.com/Keiji_otsubo/items/4d86b509b94af0ffa92b)

# Contract Line Item

+ [サービス契約品目を参照する標準フィールドが 1 つあります。サービス契約標準オブジェクトの資格の関連リストにこのフィールドの列を追加しようとすると、このフィールド名が表示されないのはなぜですか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000074s894)


この仕様が影響していると思うけど

NOTE You can’t create custom list views for contract line items.

Guidelines for Working with Contract Line Items
https://help.salesforce.com/s/articleView?id=sf.service_contracts_line_item_creating.htm&type=5


# We've reported the problem to Customer Support with error ID: 1340665357

+ [Unable to add User profile to Service Cloud Console](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UtsEY)

:::note
Please check this article.

Error 'We had trouble processing the request. We've reported the problem to Customer Support' when a Profile has been assigned to a Lightning Console App
https://help.salesforce.com/s/articleView?id=000384036&type=1

こちらの記事をご確認ください。

エラー「リ​​クエストの処理に問題が発生しました。プロファイルが Lightning コンソールアプリケーションに割り当てられている場合の問題をカスタマーサポートに報告しました。
:::
数式フィールドのエラー



# 数式は正しいにも関わらずエラーが出る場合

+ [I am having a problem creating a validation rule](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000075vzTVSAY)

:::note alert
Incorrect parameter type for operator '<'. Expected Date, received Number.  
:::

設定している場所では使えない関数の可能性がある


+ [Error: Incorrect parameter type for function 'CASE()'. Expected , received Text](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X6mpJ)

Example 4 (fails):

```
CASE ( TEXT ( Episode__r.Site__c ) , $Label.Label_PR_WB , "A" , "B")
```

# 住所フィールドが機能しない。

+ [Formula Field Review](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ahz21)

州が長い名前でなく、CAとかの略称だったから？
【合格体験記】ITIL4ファンデーションの申込から当日まで

# はじめに

ITIL4は試験自体はそこまで難しい試験ではありませんが、受験料がPS5並の値段なので、なんとしても1回で合格したいですよね！

今回はこれからITIL4を受けようと思っている方向けに、
試験の申し込み方法や私が行った勉強方法などをまとめました！

# 目次
* 試験概要
* 試験申し込み(テストセンターで受験する場合)
* 使用した参考書・問題集
* 勉強方法
* 受験当日について

# 試験概要

受験料： 54230円(バウチャー使用)
試験時間： 60分
問題数： 40問
合格点： 26/40点

# 試験申し込み(テストセンターで受験する場合)
試験の申込はプロメトリック社のサイトからできますが、
事前にバウチャーを購入することで、通常の受験料よりも1万円以上安く受験することができます！
AWS等の資格と違い、試験日の29日前からの変更・キャンセルは1,188円（税込）の手数料が発生するので、試験日の決定には注意してください！

https://itstrategy.jp/p-voucher

https://www.prometric-jp.com/examinee/test_list/archives/9

# 使用した参考書・問題集
**公式テキスト**
試験申し込み時に貰える参考書です。全体的に文章が少し読みづらいですが、
公式が出していることもあり、試験はこの参考書の内容からしか出題されないので、
合格を目標とするなら参考書はこの1冊だけでも十分だと思います！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/cdd435da-7cfc-0964-3d41-0c8f198afe4d.png" width="300">

**ITIL 4の基本 図解と実践**
ITIL公認の参考書です。本のタイトル通り、プラクティスの図解と実践(ソリューション例)について詳しく書かれています。試験に合格するだけであればソリューション例まで覚える必要はないですが、ITILの知識を実務に生かすための参考書として購入しました。ITIL合格のための参考書としては詳しすぎる気がしますが、ITILの概念を学ぶための本としてはおすすめです。

https://www.amazon.co.jp/%E3%80%90ITIL4%E5%85%AC%E8%AA%8D%E3%80%91ITIL-4%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%9B%B3%E8%A7%A3%E3%81%A8%E5%AE%9F%E8%B7%B5-%E4%B8%AD-%E5%AF%9B%E4%B9%8B/dp/429611252X

**クラムメディア**
有効期限30日間で6000円と少し高額の問題集です。約260問が収録されています。
英語の問題を直訳しているため、日本語が変な問題もありますが、実際の試験にかなり近い問題が収録されています。各問題に解説はないですが、他のユーザが問題の解説や解き方に関するコメントを残してくれています。

https://www.crammedia.com/ITIL-V4-Foundation-Exam/p/247/261

**「ITIL4 問題集」と検索して一番上に出てくる無料問題集**
試験前日に念押しで実施しました。内容はクラムメディアと同じ問題が多かったです。
文章はクラムメディアよりはましな日本語ですが、解説がなく、他ユーザのコメントもないため本当に答えがあっているのかが分からないです。

https://www.jpnshiken.com/exam/ITIL-4-Foundation-JPN-itil-4-foundation-exam-itil-4-foundation%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88-11007.html

# 勉強方法
大まかな勉強の流れとしては、
①問題集を解く→②問題集で出てきた単語を参考書で確認する→③問題集を解く
のサイクルで勉強しました。

最初は公式テキストを読んでから問題集を解こうと思っていましたが、テキストを読んでもどこが重要なのかよく分からず頭に入ってこなかったため、先に問題集から初めてある程度、頻出単語を抑えてからテキストや参考書を読むようにしていました。結果的に、先に頻出単語を抑えたことで、テキストの内容がすんなり理解できるようになっていたので問題集 → 参考書の順番で勉強して良かったです。

勉強期間は2週間弱・総勉強時間は25時間程度で、
最終的に問題集を2週、参考書は重要そうな箇所を重点的に読み込んだ状態で試験に臨みました。

# 試験当日について
試験当日は試験開始時刻の15分前集合なので、それまでに会場に到着していないと受験ができない可能性があるため注意してください。

試験(40問)を解き終わった後、終了ボタンを押すと、アンケート回答の画面に移動します。このアンケートは日本語で受験しても英語で表示されます。私はアンケートがあることを知らず、英語も苦手なので、いきなり英語の問題が出題されたと勝手に思い込み、気づくまで1人で焦っていました。

アンケート回答後は試験画面に合格・不合格の結果が表示され、会場を出る頃には登録したメールアドレスにスコアレポートが届き点数も分かるので、試験結果が発表されるまでの緊張感は味合わなくてすみます。

# ざっくり記事まとめ
* 試験の申込はバウチャーを利用するとお得。
* 受験料は高いが試験の難易度はそこまで高くない。
* 参考書は試験申込時に貰える公式テキストのみで十分。(合格するだけなら)
* 先に問題集から始めたほうが参考書の内容が頭に入りやすい。(個人差あり)
* 試験後のアンケートに注意

# さいごに
最後までご覧いただきありがとうございました。
この記事がITIL4取得のための参考になれば幸いです！
Core Web Vitalの新しい指標INP（Interaction to Next Paint）について

Interaction to Next Paint（INP）という指標を来年2024年3月から採用すると発表がありました。

https://web.dev/inp/

導入が遅れる可能性や先駆けて英語圏のサイトだけという可能性はありますが、対策をしておかないと場合によってはSEO順位に影響を及ぼしかねません…。

何をすればいいのかを本記事をきっかけに検討してもらえると嬉しく思います！

:::note info
【この記事をおススメしたい人】
・INPについて知らないSEO担当者や開発者
:::

## INP（Interaction to Next Paint）ってなに？
[FID(First Input Delay)](https://web.dev/fid/)に変わって導入される新しい[CWV（Core Web Vital）](https://web.dev/vitals/#core-web-vitals)の指標です！

ユーザーがページで行った全てのインタラクションに対して待ち時間を計測して、ページの応答性を評価するものです。

:::note info
ユーザーのインタラクションというのは、クリック・タップ、キーボードの操作のことです！
:::

## FIDとINPの違い
FIDはユーザーがページに訪問して最初のインタラクションだけだったのに対して、INPはユーザーが行ったすべてのインタラクションを計測するようです。

:::note info
ホバーやスクロールは計測の対象にはならないようです。
キーボード操作によって発生するイベントがスクロールを発生させた場合も計測対象ではないとのこと。

> Hovering and scrolling does not factor into INP. However, scrolling with the keyboard (space bar, page up, page down, and so forth) involves a keystroke, which may trigger other events that INP does measure. Any resulting scrolling is not factored into how INP is calculated.

https://web.dev/inp/#whats-in-an-interaction
:::

## 【まとめ】　Core Web Vitalの新しい指標INP
まだ少し先だとは思いますが、大規模サイトでは集計用のscriptタグの読み込みなどの影響でインタラクションへの影響も少なからずあると思います。

いきなる全てを対応することは難しいと思うので、できるところから少しずつ対応していくことをオススメします！
記事の作成するにあたり参考にした記事の中にINPに対する改善のヒントも掲載されていたので参考にしてみてください！

## 参考記事

https://web.dev/inp/
環境変数を設定したのに読み込まなかった件

<h3>秘密鍵と公開鍵を環境変数に設定したら環境変数が設定されていませんというエラーが出てしまった時</h3>

```card.js
const pay = () => {
  const payjp = Payjp(process.env.PAYJP_PUBLIC_KEY);　//この部分の記述
  const elements = payjp.elements();
  const numberElement = elements.create('cardNumber');
  const expiryElement = elements.create('cardExpiry');
  const cvcElement = elements.create('cardCvc');
  
  //省略

window.addEventListener("load", pay);
```

上記のコードのように、Payjpにカード情報を送ってトークンを生成するようにJAVAの記述をしたら今まで公開鍵を直接コードに組み込んでいた時はうまくいっていた決済機能が、”環境変数が設定されていません”というエラーが出るようになってしまった。
![環境変数エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310854/9f9d9538-8404-2387-8dc1-7883fee3c107.png)

<h3>結論</h3>
ブラウザに古いJavaScriptのコード情報が保持されていたため、正しく設定したはずのコードが読み込まれていないだけだった。
javascriptの該当のファイルに改行や

`console.log("test")`
等を入れてファイルを編集すると、新しいファイルを読み込んでくれる。

<h3>環境変数への設定方法</h3>

ターミナルにて
`vim ~/.zshrc`　
 iを押してインサートモードに移行し、下記を追記する。既存の記述は消去しない。

```
export PAYJP_SECRET_KEY='sk_test_*************'
export PAYJP_PUBLIC_KEY='pk_test_*************'
```

編集が終わったらescキーを押してから:wqと入力して保存して終了

ターミナルにて `source ~/.zshrc` を実行し、.zshrcを読み込み直して、追加した環境変数を使えるようにする。

環境変数が正しく設定できているかを `rails c`　でコンソールを起動して確認する。

```ターミナル

ENV["PAYJP_SECRET_KEY"]
=>"sk_test_*********************"
ENV["PAYJP_PUBLIC_KEY"]
=>"pk_test_*********************"
```
設定した通り返り値が返ってきていたらOK



環境変数を設定したターミナルにて、 `rails s` でサーバーを起動して確認する。

サーバーサイド（コントローラー）から環境変数を呼び出せるようにコードを編集する。

```app/controllers/orders_controller.rb
#省略
def pay_item
   Payjp.api_key = ENV["PAYJP_SECRET_KEY"]
   Payjp::Charge.create(
     amount: order_params[:price],
     card: order_params[:token],
     currency:'jpy'
   )
end
```
これまで直接秘密鍵を指定していたところを、環境変数に置き換えた。

次にクライアントサイド、JavaScriptファイルの公開鍵を環境変数から読み込むように設定する。
`webpacker`を用いることで呼び出せる。ターミナルにて下記のコードを実行

```ターミナル

% touch config/initializers/webpacker.rb

```

VScodeにて下記のファイルの記述を変更

```config/initializers/webpacker.rb
Webpacker::Compiler.env["PAYJP_PUBLIC_KEY"] = ENV["PAYJP_PUBLIC_KEY"]
```

```app/javascript/card.js
const pay = () => {
const payjp = Payjp(process.env.PAYJP_PUBLIC_KEY);
  // 省略
```

これで、環境変数を呼び出せるようになった。サーバーを再起動して動作確認を実行する。

今回はこの作業の最終段階の確認でエラーが起きて2日ほど悩んだ。
メンターに相談して、 `console.log('test')` を追記しただけでエラーが解決したので目から鱗でした。
[Python]Mecubなしで固有名詞をテキストから取得するには

Amazon Web Services (AWS) には、テキストから固有名詞を抽出するためのサービスであるAmazon Comprehendを使用することができます。また、日本語を含む多数の言語がサポートされています。

以下はPythonとBoto3 (AWS SDK for Python)を使用して、Amazon Comprehendを利用してテキストから固有名詞を抽出する例です：

```python
import boto3
import json

def extract_entities(text):
    comprehend = boto3.client(service_name='comprehend', region_name='your_region_name')
    response = comprehend.detect_entities(Text=text, LanguageCode='ja')
    return response['Entities']

def filter_proper_nouns(entities):
    proper_nouns = [entity for entity in entities if entity['Type'] in ['PERSON', 'LOCATION', 'ORGANIZATION', 'COMMERCIAL_ITEM', 'EVENT', 'DATE', 'QUANTITY', 'TITLE']]
    return proper_nouns

text = "ここに解析したいテキストを入力します。"
entities = extract_entities(text)
proper_nouns = filter_proper_nouns(entities)

for noun in proper_nouns:
    print(noun['Text'])

```

このスクリプトでは、まずcomprehend.detect_entitiesメソッドを使用してテキストからエンティティを抽出します。その後、filter_proper_nouns関数を使用してエンティティのリストから固有名詞をフィルタリングします。

なお、固有名詞としてフィルタリングするエンティティのタイプは、PERSON（人名）、LOCATION（地名）、ORGANIZATION（組織名）、COMMERCIAL_ITEM（商品名）、EVENT（イベント名）、DATE（日付）、QUANTITY（数量）、TITLE（役職名）となります。

your_region_nameは利用しているAWSのリージョン名を指定します（例えばus-west-2など）。また、LanguageCodeは解析するテキストの言語を指定します（日本語の場合はja）。

以上のコードを使用すれば、日本語のテキストから固有名詞を抽出することができます。

ただし、AWS Comprehendは使用料が発生しますので、その点はご注意ください。