OmniAICreator/Qiita-1.07M huggingface dataset:
【プラクティス紹介】1分でさらっと分かる「ペアプログラミング」

## プラクティス名（別名）
ペアプログラミング　（ペアプロ、ペアワーク、ペアリング、PP）

## プラクティスの目的・狙い
* コード品質向上（ミス低減）
* 作業効率化（迅速な問題解決）
* 技術継承（スキルアップ）
* コミュニケーション促進

## どんな時に使うか
* 手早くバグの少ないコードをアウトプットしたい時
* 人財育成を兼ね、知識や技術を共有しながら開発を進めたい時

## 実施手順
1. DEV同士でペアを組み、ドライバ（コードを書く人）とナビゲータ（アドバイス役）を決める
1. 同じ画面を見ながら、ナビゲータの案内で、ドライバが書き進める
1. 常に会話しながら作業を進め、30～60分毎に休憩を入れ、役割を交代する
1. ナビゲータは客観的な視点でコードが適切かチェックし、問題があれば改善案を提案する

「2人でやるから2倍の工数がかかる」というのはありがちな誤解。実際は作業ミスが減り、問題解決も早く、ベテランと初心者の品質差も埋まるため、作業効率は逆に良くなる。知識や技術の伝承にもなり、スキルアップ＆コミュニケーション促進といった副次効果も得られる。

* コツとしてドライバは今、何をやろうとしているのか、脳内の思考を実況中継しながら進めるようにすると、ナビゲータがサポートしやすい。
* またソロワークよりも疲れやすいので、集中力を維持するための休憩が大事。
* チームの心理的安全性がまだ低い段階だと精神的な疲労度が増すので要注意。
* 性格的に1on1が苦手な人もいるので、その場合はモブプロに切り替えた方が敷居が下がる。

## アレンジ例
* コーディング以外の作業にも適用してみる（＝ペアワーク）

## アンチパターン
* 初心者×初心者のペアで、問題解決の糸口が掴めずコーディングが進まない
　　⇒ 対策案：30分悩んだら有識者へ相談
* 初心者×ベテランのペアで、一方的にベテランが書き進めてしまう（ナビゲータの時も指示的）
　　⇒ 対策案：初心者のドライバ時間を長めにする
* ベテラン×ベテランのペアで、お互いにこだわりが強すぎて対立してしまう
　　⇒ 対策案：ナビ優先、といったルールを設ける

## 参考情報

https://www.agile-studio.jp/post/apm-pairing

## こぼれ話（私的コメント）
ペアを定期的にローテーションすべきかどうかはペアプロに何を求めるかによると思います。子弟制度のようなバディ感を求めるなら、あまり変えない方がいいでしょうし、コードの共同所有（＝属人化低減）を進めたいなら毎回変えていくべきでしょう。僕自身、SMの立場としてはチーム全体のコミュケーションを良くして、メンバー間の化学反応を引き出したいので、積極的に回していきたいなと思います。SM自身はペアプロしないので、ちょっと憧れがあります。

　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
10Gbeスイッチの次世代新シリーズ-法人のお客様に最適なWi-Fi６対応ネットワークソリューションを提供

<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1">「FSニュース」10月末に発売予定だった10Gスイッチの次世代新シリーズはFSの新製品として、Wi-Fi６対応の法人向けネットワークソリューションの構築を実現することが可能です。10Gスイッチの新シリーズの普及により、次世代ネットワークへの移行ブームがもたらされると予想されます。</p>
<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1">Wi-Fi 6の普及に伴い、ネットワークへのアクセス、通信トラフィック、ユーザー数が激増し、通信環境に消極的な影響を招きかねません。しかし、現在の100/1000MBアクセススイッチだけでは Wi-Fi 6の高速度かつ低遅延の高密度環境に対応することが困難です。それを解決するために、ネットワークのデータ通信速度や通信トラフィックだけが増加し、ポートの数について目を向けませんでした。FSの発売予定のS5860 シリーズ10Gスイッチは複数のポートタイプを備えています。例えば1G/2.5G/5G/10Gポート、アップリング用10G/25G/40Gポート、複数のポートタイプの組み合わせは通信環境に応じて柔軟に変更できます。特に、S5860 10G PoE++スイッチはWi-Fi 6に対応し、その給電ポートも IEEE 802.3bt準拠の最大90Wの電力を供給することが可能です。スイッチの新シリーズは次世代ネットワークへのスムーズな移行・ネットワークセキュリティの強化を実現し、企業の将来性に繋がっています。   </p>
<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1">モバイルユーザーの急増に連れて、モバイルデバイス関連のサービス、ネットワーク通信トラフィックも著しく増加しました。それに対して、ネットワークに接続しているデバイスをまとめてマネジメントを行うというシステムやソリューションに関わる需要も湧いて上がりました。FS S5860シリーズスイッチを中堅企業・中小企業向けソリューションのコアネットワーク内に配置し、スタック技術で多層化したネットワークを簡素化させることが可能です。それによって、ネットワークの信頼性・安定性・拡張性が強化されました。また、低遅延・ゼロパケットロスを特徴とする高品質ネットワークを構築するために、FS S5860シリーズスイッチは760Gbpsのメモリ帯域幅、570Mppsの転送レート、1.7:1の帯域幅割合に対応しています。ネットワーク構造の簡素化によって、システムの操作性が高まり、より効率的に業務を遂行できます。</p>
<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1"> </p>
<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1" style="text-align: center;"><img src="https://img-en.fs.com/community/upload/kindEditor/202010/22/_1603334408_iwskqPZSNr.jpg" alt="" /></p>
<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1" style="text-align: left;"> </p>
<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1">「ネットワークは常に進化している。しかし、その進化に伴うシステムの冗長化・複雑化は不要だ。高い操作性・効率性・実用性を備えるネットワークソリューションを提案することは我々FSの目標だ。同時に、それも次世代法人向けネットワーク構築の基準だと考えられる。FS S5860シリーズスイッチには先端のハードウェア技術を注ぎ込み、新しい操作システムを内蔵した。ファンモジュール・電源モジュールを取り付け、ハードウェアレベルでのデュアルフラッシュメモリを搭載し、低アイソレーションの光ポートを備えることで、高い操作性・安定性・効率性・信頼性を実現した」と、FSのプロダクトマネージャーがそうおっしゃりました。</p>
<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1">高額なコストのせいで、法人向けネットワーク構築に必要とされている10Gスイッチは今まで普及されていません。しかし、FS S5860シリーズスイッチの発売を契機とし、低コストで次世代ネットワークへの移行を実現することが可能になりました。規模によらず、企業がデジタル化を通して市場競争で優位に立つことは間違いないでしょう。 <br />もう一つ注目して欲しいのが「法人のお客様に高品質・最適のネットワークソリューションを提供する」をモットーに、FSはより高い性能を持つギガビット・イーサネット・スイッチS3910シリーズとS3410シリーズを発売する予定です。今後もスイッチ新シリーズの関連情報をお伝えしますので、引き続きよろしくお願いいたします。</p>
<p class="blog_p padding_top_none community_blog_detail_p community_blog_detail_p1"> </p>
Pythonでワークシートをコピーする方法

ワークシートのコピーは、通常、似た構造や書式を持つワークシートを作成するために使用されます。これにより、重複作業の時間を節約し、入力エラーを避けることができます。以前には、.NETプログラムを使用してこの操作を実行する方法について説明しました。この記事では、Pythonプログラムを使用してワークシートをコピーする方法とコードを紹介します。

## ツール
* Visual Studio Code
* [Spire.XLS for Python](https://www.e-iceblue.com/Introduce/xls-for-python.html)

このライブラリは、[Excel から PDF への変換](https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Conversion/Python-Convert-Excel-to-PDF.html)、[Excel の作成と読み取り](https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Document-Operation/Python-Create-Read-or-Update-Excel-Documents.html)もサポートしています。

## インストール方法
* VS Code で「Extensions」をクリックし、「Python」を検索してインストールします。
* 「Explorer」-「NO FOLRDER OPENED」-「Open Folder」をクリックします。
* 既存のフォルダーをワークスペースとして選択するか、新しいフォルダーを作成することもできます。
* そのフォルダーに「.py」 ファイルを追加し、任意の名前を付けます。
* 「Terminal」-「New Terminal」をクリックします。
* 次のコマンドを入力して、Spire.XLS for Python と plum-dispatch v1.7.4 をインストールします。
```python
pip install Spire.XLS-for-Python
pip install plum-dispatch==1.7.4
```
## コード：
### 同じワークブック内でワークシートをコピーする
```python
from spire.xls import *
from spire.common import *

#Workbook クラスのインスタンスを初期化する
workbook = Workbook()

#Excel ワークブックをロードする
workbook.LoadFromFile("Sample 1.xlsx")

#最初のシートを取得する
sourceSheet = workbook.Worksheets[0]
sheetName = sourceSheet.Name + "_Copy"

#特定の名前を持つ新しいワークシートを追加する
destSheet = workbook.Worksheets.Add(sheetName)

#最初のワークシートを新しく追加したワークシートにコピーする
destSheet.CopyFrom(sourceSheet)

#結果ファイルを保存する
workbook.SaveToFile("CopyInSameWorkbook.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/99f456c4-b6ff-f13e-14c0-153efedbbb75.png)

### 異なるワークブック間でワークシートをコピーする
```python
from spire.xls import *
from spire.common import *

#Workbook クラスのインスタンスを初期化する
sourceWorkbook = Workbook()

#Sample 1.xlsxをロードする
sourceWorkbook.LoadFromFile("Sample 1.xlsx")

#Sample 1.xlsxの最初のシートを取得する
sourceSheet = sourceWorkbook.Worksheets[0]

#シートの名前を取得する
sheetName = sourceSheet.Name + "_Copy"

#Workbook クラスのインスタンスを初期化する
destWorkbook = Workbook()

 #Sample 2をロードする
destWorkbook.LoadFromFile("Sample 2.xlsx")

#特定の名前を持つ新しいワークシートをSample 2に追加する
destSheet = destWorkbook.Worksheets.Add(sheetName)

#Sample 1の最初のシートをSample 2の新しいシートにコピーする
destSheet.CopyFrom(sourceSheet)
destWorkbook.CopyTheme(sourceWorkbook)

#Sample 2を別のファイルに保存する
destWorkbook.SaveToFile("CopyToAnotherWorkbook.xlsx", ExcelVersion.Version2013)
sourceWorkbook.Dispose()
destWorkbook.Dispose()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/c0f91b1c-56b3-fdf3-5dbf-d9bafce87c2e.png)
dockerでwordpress環境を立ち上げ、本番環境のコピーを作る

## 事前に必要なアプリ
docker
vscode

## ディレクトリ作成
本番環境名と同じにしているとわかりやすいです。
またお客様の名前にしていると判別しやすいです。

```bash
$  mkdir wordpress
```

## docker-compose.yml

```yaml
version: '3'

services:
  wp:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - 80:80
    volumes:
      - ./wordpress/wp-content:/var/www/html/wp-content
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: p455w0rd

  db:
    image: mariadb
    volumes:
      - ./db_data:/docker-entrypoint-initdb.d
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: p455w0rd
      MYSQL_ROOT_PASSWORD: r00+p455w0rd

volumes:
  db_data:

```

## dockerの起動

```bash
$ docker compose up -d
```

## wordpress初期設定

省略します。
上書きするのでなんでも構わないです。

## プラグインから「All-in-One WP Migration」をインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263673/38d4ae7f-908f-4f8a-bb8b-8495e8e89162.png)

## 最大アップロードファイルサイズが50MBを1000MBにする
※検索したが、出てくるまでに時間がかかったので、自分メモとしてここに記載する。


### コンテナを検索する

```bash
$ docker ps -a
```

### コンテナに入る

```bash
$ docker exec -it コンテナID /bin/bash 
```

### php.iniがあるところに移動

```bash
$ cd /usr/local/etc/php
```

### php.ini-productionをコピーする

```bash
$ cp php.ini-production php.ini
```

### viを使用するために以下コマンド実行

```bash
$ apt-get update
$ apt-get install vim
```

### viでphp.iniを修正する

```bash
$ vi php.ini
```

### 以下を修正する

upload_max_filesize = 1000M
post_max_size = 1000M

※php.iniファイルはかなり長いので、/upload_max_filesizeなどと検索するとやりやすいです。

### dockerを再起動して終わりです。
【Unity】インストール数に応じた利用料 - Unity Runtime Fee

~~Unityは2024年1月1日から、ゲームのインストール数に応じた利用料金が発生するようになりました。~~
**こちらの利用料金は見直しされました。**

Unity Pro および Unity Enterprise ではランタイム料金がかかりますが、エンゲージメント当たりか、月間総収益の2.5%のどちらかを選択できるようになります。

詳しくはこちら↓

https://unity.com/pricing-updates

また、ランタイム料金を計算できるページも作られています。↓

https://unity.com/ja/runtime-fee-estimator

---
:::note warn
**以下は古い情報です↓**
:::

https://gamebiz.jp/news/374625

一体、どれくらいの料金がかかるのか、Personal（収益によらず使えるようになった）と比較してどちらが得か、ということが気になる企業・個人の方がいらっしゃると思います。

公式で単価は書いてありますが、結局いくらになるのか分かりづらいので、インストール数に対する金額をまとめました。

| インストール数 | Unity Personal | Unity Pro | 差額ライセンス数 |
|--:|--:|--:|--:|
| 〜20万  | $0 | $0 | Personalの方が得 |
| 21万 | $2,000 | $0  | 0.9 |
| 30万 | $20,000 | $0 | 9 |
| 100万 | $160,000 | $0 | 73 |
| 101万 | $162,000 | $1,500 | 73 |
| 110万 | $180,000 | $15,000 | 75 |
| 120万 | $200,000 | $22,500 | 81 |
| 150万 | $260,000 | $45,500 | 98 |
| 200万 | $360,000 | $60,500 | 136 |
| 500万 | $960,000 | $120,500 | 382 |
| 1000万 | $1,960,000 | $220,500 | 791 |

* それぞれ収益のしきい値（Personal 20万ドル、Pro 100万ドル）も超えている場合にかかかる金額です
* 差額ライセンス数とは、Personalとの差額が、いくつのProライセンス数（人年）に相当するかを示す概算値です
* １ライセンス単価を $2,200 として計算しています

手作業で計算したので、計算ミスや誤りがあればご指摘ください。

# 参考

詳細についてはUnity公式フォーラムや以下のリンクをご確認ください。

https://unity.com/runtime-fee

https://forum.unity.com/threads/unity-plan-pricing-and-packaging-updates.1482750/?utm_source=twitter&utm_medium=social&utm_campaign=company_global_blog_2023-09-13_updated-forums-faq

https://automaton-media.com/articles/newsjp/20230913-264053/

http://www.gamecast-blog.com/archives/66012911.html

# あとがき

ハイパーカジュアルのような基本無料低課金モデルだと厳しいですね。。
なお、個人的には Unity Plus がなくなったことの方がショックだったりします😭
（インディー開発者へXでアンケートしてます →
　https://twitter.com/tankenzuki/status/1701836009842119078 ）
【Swift】構造体とクラスの選択

# この記事は何？
Appleの開発者向けドキュメントの[Choosing Between Structures and Classes](https://developer.apple.com/documentation/Swift/choosing-between-structures-and-classes)について、独自に解説する。

データの保存方法とモデルの動作を決定するために、「構造体とクラスのどちらを利用すべきか」を判断する。

> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。

# 概要

構造体とクラスはアプリにデータを保存し、動作をモデル化する手段。
どちらも良い方法だが、それらは似通っている部分があるので、どちらか一方を選択する判断が難しいことがある。

アプリに新しいデータ型を追加する際は、以下にあげる項目を考慮して、構造体とクラスのどちらが合理的かを判断する。

- 基本的には構造体
- Objective-Cの相互運用性が必要な場合はクラス
- モデリングするデータのアイデンティティを制御する必要がある場合はクラス
- 実装を共有するプロトコルと共に利用する場合は構造体

# 基本は構造体

構造体を使用して、一般的な種類のデータを表す。
Swiftの構造体には、他の言語ではクラスに限定された機能もたくさんある。
格納プロパティ、計算プロパティ、およびメソッドを利用できる。
さらに、Swiftの構造体は、デフォルト実装を通じて動作を得るためにプロトコルを採用できる。
Swift標準ライブラリと`Foundation`フレームワークは数値、文字列、配列、辞書など頻繁に使用するほとんどの型に構造体を使用している。

構造体を使用すると、アプリ全体を把握しなくても、コードを部分的に推論しやすくなる。
クラスとは異なり、構造体は値型データである。
そのため、構造体でのローカルな変更は、アプリのフローの一部として意図的にそれらの変更を伝えない限り、他の部分には見えない。
そのおかげで、ある部分のコードを見るだけで、そこで行われるインスタンスへの変更が、関連する関数の呼び出しから意図せず行われることなく、明示的に行われていると確信できる。

# Objective-C互換が必要ならクラス

データの処理が必要なObjective-C APIを使用している場合、またはデータモデルを「Objective-Cのフレームワークで定義された既存のクラス階層」に適合させる必要がある場合は、データをモデル化するためにクラスと継承を使用する。
たとえば、多くのObjective-Cフレームワークが公開するクラスの多くは、サブクラス化できる。

# 識別制御が必要ならクラス

Swiftのクラスは参照型データなので、アイデンティティの概念がある。
つまり、2つの異なるクラスインスタンスが互いに同じ値のプロパティを持つ場合でも、「アイデンティティ演算子`===`はそれらを異なると見なす」ことを意味する。
また、アプリ全体でクラスインスタンスを共有すると、そのインスタンスに加えた変更は、そのインスタンスへの参照を保持するコードのすべての部分に表示される。
この種のアイデンティティが必要なインスタンスを作成するには、クラスを使ってモデル化する。
一般的なユースケースは、ファイルハンドル、ネットワーク接続、およびCBCentralManagerのような共有ハードウェアの中継。

たとえば、ローカルデータベース接続をモデル化するデータ型がある場合、そのデータベースへのアクセスを管理するコードは、アプリから見たデータベースの状態を完全に制御する必要がある。
この場合、クラスを使用するのが適切だが、アプリのどの部分が共有データベースオブジェクトにアクセスするかを制限する。


> 重要
アイデンティティの扱いは慎重すべき。
アプリ全体でクラスインスタンスを広範囲に共有すると、ロジックエラーの可能性が高くなる。
過度に共有されたインスタンスの変更は、その結果を予想しえなくなる。
それを適切にコーディングすることは、負担の大きな作業になる。

# 識別不要なら構造体

アイデンティティの制御がないエンティティのデータをモデル化する場合は、構造体を使用する。

たとえば、リモートデータベースを参照するアプリでは、インスタンスのアイデンティティは外部エンティティによって完全に所有され、識別子によって通信できるかもしれない。
アプリのモデルの一貫性がサーバーに保存されている場合は、識別子を持つ構造体としてレコードをモデル化できる。
以下の例では、`jsonResponse`にはサーバーからエンコードされた`PenPalRecord`型インスタンスが含まれている。

```swift:
struct PenPalRecord {
    let myID: Int
    var myNickname: String
    var recommendedPenPalID: Int
}

var myRecord = try JSONDecoder().decode(PenPalRecord.self, from: jsonResponse)
```

`PenPalRecord`のようなモデルデータへの変更は簡単。
たとえば、ユーザーのフィードバックに応答して、アプリは複数のペンパルをお勧めするかもしれない。
`PenPalRecord`型は構造体なので、データベースのレコードごとにアイデンティティを制御しない。
そのため、`PenPalRecord`型インスタンスに加えられた変更が、データベースを意図せずに変更するリスクはない。

アプリの別の部分が`myNickname`を変更し、変更リクエストをサーバーに送信した場合、最近拒否されたペンパルの推奨事項が変更によって誤って取り上げられることはない。
`myID`プロパティは定数として宣言されているため、ローカルでは変更できない。
そのおかげで、データベースへのリクエストが意図せずに、不適切なレコードを変更することはない。

# 動作の共有とモデルを継承するために、構造体とプロトコルを使用する

構造体とクラスは、どちらも継承の類をサポートしている。
構造体とプロトコルが採用できるは、プロトコルだけ。
クラスを継承することはできない。
ただし、クラス継承で構築できる継承階層は、プロトコル継承と構造体を使用してモデル化できる。

継承関係をゼロから構築する場合は、プロトコル継承が好ましい。
プロトコルはクラス、構造体、および列挙型が継承に加わることを許可する。
ただし、クラス継承は他のクラスとのみ互換性がある。
データをモデル化する方法を選択するときは、まずプロトコル継承を使用してデータ型の階層を構築してみる。
それから、それらのプロトコルを構造体に採用してみる。
array_flip(): Can only flip string and integer values, entry skipped エラーが出た時の対処法

# エラーメッセージ


```
array_flip(): Can only flip string and integer values, entry skipped

//文字列と整数値のみを反転できます。入力はスキップされます
```

# 問題のコード

```.php
$allCookie = $request->cookie();
$allCookie = array_flip($allCookie);
```

# 原因
`array_flip()`は配列（連想配列）のキーとバリューを入れ替えるメソッド。
`array_flip()`は文字列と整数値のみしか扱えない。

`$request->cookie()`でcookieを取得したが、内容は下記で`NULL値`が存在したためエラーとなった。

```
^ array:4 [▼
  "ABC_asdfpipoij3" => null
  "CLA_sdfgsg" => null
  "XSRF-TOKEN" => "RRY2bgJ1h2onOYmsdfgsdfSmTVa2OrdrNNBaXYDsg8PnBOp"
  "session" => "6r2FazkYws4asdrIeStTuBzasdfoHLj9wjqciNPtToYYo2D"
]
```

# 対処法
`array_filter`で`NULL`を取り除く


```.php
$allCookie = $request->cookie();

$allCookie = array_filter($allCookie, function ($value) { return $value !== null; });

$allCookie = array_flip($allCookie);
```

# 参照
https://www.php.net/manual/ja/function.array-flip.php

https://www.php.net/manual/ja/function.array-filter.php
中間値の定理「2009 奈良教育大学 前期【4】」をChatGPTとWolframAlphaとsympyでやってみたい。

・「中間値の定理」を勉強中。
**・ChatGPT-3.5先生に教えてもらっても、私は、わかりませんでした。**
・図(グラフ)を多く取り入れても、私は、わかりませんでした。。

オリジナル 

https://mathmathmass.exblog.jp/33437511/

上と同じです。大学入試数学問題集成 様＞未登録

# ChatGPT-3.5先生へ(?私にはあっているようにみえます。)
？？？L'Hôpitalの法則？？？

入力文(一括です。)
```
次の問いに答えよ。
(1)ｘ > 0 のとき、平均値の定理を用いて、
       e**x-1=x*e^c,0<c<x
   を満たすcが存在することを示せ。
(2) lim_(x->0^+) (e^x - 1 )/ x = 1 を示せ。
```
返信抜粋
```
(1)
...
これにより、e^x - 1 = xe^c が成り立ち、0 < c < x であるため、条件を満たすcが
存在することが示されました。
(2) この極限を示すために、L'Hôpitalの法則を用います。
...
これにより、e^x - 1 = xe^c が成り立ち、0 < c < x であるため、条件を満たすcが存在することが示されました。
```

# WolframAlphaで
(2)「プロット」がでます。

https://www.wolframalpha.com/input?i=lim_%28x-%3E0%5E%2B%29+%28e%5Ex+-+1+%29%2F+x+&lang=ja

極限
=1

# sympyで(T氏の数学日記 様の方法を参考に)
？？？「中間値の定理」を勉強中。

# sympyで(いつものスタイルで)できませんでした。
(2)
https://docs.sympy.org/latest/tutorials/intro-tutorial/calculus.html#limits
```python
from sympy import *
var('x,c',real=True,positive=True)
eq=Eq(E**x-1,x*E**c)
f =solveset(eq,c,Interval.Lopen(0,oo)).args[1].args[0]
print("#(1)",f)
# print("#(1)",minimum(x-f,x,Interval.Lopen(0,oo)) )
print("#(2)", limit( (E**x - 1 )/ x , x, 0, '+') )
# 
(st,en)=(0,10)
plot(f,x,
     (x,st,en),
     xlim=(st,en),ylim=(st,en),
     aspect_ratio=(1.0,1.0)
    )
(st,en)=(0,100)
plot(f,x,
     (x,st,en),
     xlim=(st,en),ylim=(st,en),
     aspect_ratio=(1.0,1.0)
    )
#(1) log((exp(x) - 1)/x)
#(1) Error
#(2) 1
```
0＜x＜10,y=x,y=f
![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/861d57e4-6d62-fba2-025c-5c3e4a58acce.png)
0＜x＜100,y=x,y=f
![1png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/b5274341-fd39-11a2-98fb-13c231b8a642.png)

# sympyの実行環境
①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

# 参考

以下、いつもの?おすすめです。

https://qiita.com/mrrclb48z/items/75904cdc6e84ecef4d03#%E5%8F%82%E8%80%83wolframalpha-%E9%96%8B%E7%99%BA%E7%89%A9%E8%AA%9E
初心者がWSL2 ＋ Docker Desktop + PhpStorm でPHP開発環境構築で詰まった話

## 実行手順

こちらのブログを参考に構築しました。

https://blog.odaryo.com/2021/08/win-dev_env-with-docker-desktop-1/

https://blog.odaryo.com/2021/08/win-dev_env-with-docker-desktop-2/

## 起きた問題

docker-compose build が失敗する。

```=> ERROR [php-fpm 3/8] RUN pecl install -f xdebug     && docker-php-ext-enable xdebug     && apk del --purge autoconf g++ make    5.6s```

上記のエラーメッセージが表示ながらも、docker-compose build自体は止まらず。
別Ubuntu Window で強制終了た。

#### 強制終了のコマンド：

`ps aux | grep docker-compose`

でプロセスコードを確認

`kill -p プロセスコード`

で強制終了

#### 問題特定まで

`docker-compose build --no-cache --progress=plain`

でエラーメッセージの詳細を特定

```
#6 5.953 configure: error: rtnetlink.h is required, install the linux-headers package: apk add --update linux-headers
#6 5.967 ERROR: `/tmp/pear/temp/xdebug/configure --with-php-config=/usr/local/bin/php-config' failed
#6 ERROR: process "/bin/sh -c pecl install -f xdebug     && docker-php-ext-enable xdebug     && apk del --purge autoconf g++ make" did not complete successfully: exit code: 1

```

以下のエラーメッセージで
`#6 5.953 configure: error: rtnetlink.h is required, install the linux-headers package: apk add --update linux-headers`

xdebugのインストールにはrtnetlink.hというヘッダーファイルが必要であることは判明。

よってDockerfileを修正。

```
RUN apk update \
    && apk upgrade \
    && apk add --no-cache \
        bash \
        libzip-dev \
        libpng-dev \
        linux-headers \  # <-- この行を追加
    && docker-php-ext-install \
        pdo_mysql \
        bcmath \
        gd \
        opcache \
        zip \
    && apk --update --no-cache add autoconf g++ make
```

参考元ファイルはこちら：

https://github.com/odaryo/php_docker_sample/blob/master/docker/php-fpm/Dockerfile

これで解決。

## 結論

なぜ自分の環境ではこれが必要が不明だが、いったんこれで解決。
Javaで「抽象クラスの継承」の動作を確認してみた

# 概要
Javaで「抽象クラスの継承」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/abstract/index2.html

# 実装
以下のファイルを作成しました。
```CTest20.java
class CTest20{
  public static void main(String args[]){
    seihinA c = new seihinA();

    c.dispName();
  }
}

abstract class base{
  abstract public void dispName();

  public void dispCompany(){
    System.out.println("XYZ社製造の製品です");
  }
}

class seihinA extends base{
  public void dispName(){
    System.out.println("製品名はXXXです");
  }

  public void dispVersion(){
    System.out.println("バージョンは1.0です");
  }
}
```
以下のコマンドを実行しました。
```
$ javac CTest19.java 
$ java CTest20 
製品名はXXXです
```

# まとめ
何かの役に立てばと。
基本情報技術者試験　科目B　base64のエンコード処理

大滝みや子さんのアルゴリズム×擬似言語トレーニングブックもだいぶ進んできました。

４章は難しくも解説を見れば大体わかるのですが、base64のエンコード処理は解説が端折ってあったため、いまいち動きがわかりません。

pythonのコードで動かしてみたらだいぶわかりましたので、共有します。

いやあめんどくさい・・・試験ででないといいな・・・
というか使うときは来るのか？

### コード：

```python
# エンコード対象の文字列
encode = ['H', 'e', 'l', '']

# 各文字をASCIIの整数値に変換
data = [ord(char) for char in encode[:-1]]

print("初期状態:")
for i in range(3):
    print(f"data[{i + 1}]: {data[i]:08b} ({data[i]})")
print("")

# 1. encode[0]にdata[1]の上位6ビットを取得（２ビット右）
encode[0] = (data[0] >> 2) & 0b111111
print("1の処理後:")
print(f"encode[0]: {encode[0]:06b} ({encode[0]})")
print("")

# 2. encode[1]にdata[1]の下位2ビット（４ビット左）と、
#data[2]の上位4ビット(4ビット右）を結合
encode[1] = ((data[0] & 0b11) << 4) | ((data[1] >> 4) & 0b1111)
print("2の処理後:")
print(f"encode[1]: {encode[1]:06b} ({encode[1]})")
print("")

# 3. encode[2]にdata[2]の下位4ビット（２ビット左）と、data[3]の上位2ビット（６ビット右）を結合
encode[2] = ((data[1] & 0b1111) << 2) | ((data[2] >> 6) & 0b11)
print("3の処理後:")
print(f"encode[2]: {encode[2]:06b} ({encode[2]})")
print("")

# 4. encode[3]にdata[3]の下位6ビットを取得
encode[3] = data[2] & 0b111111
print("4の処理後:")
print(f"encode[3]: {encode[3]:06b} ({encode[3]})")

# 結果のエンコードされた文字列を表示
encoded_string = ' '.join([f"{item:06b}" for item in encode])
print("\nエンコードされた結果:")
print(encoded_string)
```

### 結果：

```python
初期状態:
data[1]: 01001000
data[2]: 01100101
data[3]: 01101100

1の処理後:
encode[0]: 010010

2の処理後:
encode[1]: 000110

3の処理後:
encode[2]: 010101

4の処理後:
encode[3]: 101100

エンコードされた結果:
010010 000110 010101 101100
```
LINE WORKS API 2.0 を PowerShell で叩いてみる (JWT をもう一度)

以前に、[外部モジュールを利用して、JWT でアクセストークンを取得](https://qiita.com/msato-3/items/a42c2212a05f45870d27)したことがありました。
しかし、外部モジュールの利用は難しい場合もあるかと思いますので、改めて外部モジュールを使用せずにアクセストークンを取得してみました。


```powershell
$PRIVATEKEY = "
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCGmAXWxxxxxxxx
...
BEeznnJk+dgA6leOxxxxxxxx
-----END PRIVATE KEY-----
";

$CLIENT_ID = "tO1NYVqXvP86xxxxxxxx";
$CLIENT_SECRET = "7Jxxxxxxxx";
$SERVICE_ACCOUNT = "xxxxx.serviceaccount@yourdomain";

$SCOPE ="bot.message directory"
$GetTokenUrl = "https://auth.worksmobile.com/oauth2/v2.0/token";

$jwt_header = @{
    alg = "RS256"
    typ = "JWT"
};

$now = Get-Date
$iat_val = [int](Get-Date($now) -UFormat '%s');
$ext_val = [int](Get-Date($now.AddHours(1)) -UFormat '%s');
$jwt_payload = @{
    iss = $CLIENT_ID
    sub = $SERVICE_ACCOUNT
    iat = $iat_val
    exp = $ext_val
};

$jwt_str = $jwt_header | ConvertTo-Json -Compress;
$payload_str = $jwt_payload  | ConvertTo-Json -Compress;

$base64str = [Convert]::ToBase64String(([System.Text.Encoding]::Default).GetBytes($jwt_str)) `
        + "." `
        + [Convert]::ToBase64String(([System.Text.Encoding]::Default).GetBytes($payload_str));
$base64str = $base64str.Replace('+','-').Replace('/','_').replace('=','');
$bytedata = ([System.Text.Encoding]::Default).GetBytes($base64str);

$rsa = [System.Security.Cryptography.RSA]::Create();
$rsa.ImportFromPem($PRIVATEKEY);
$signature = [Convert]::ToBase64String($rsa.SignData($bytedata, [Security.Cryptography.HashAlgorithmName]::SHA256, [Security.Cryptography.RSASignaturePadding]::Pkcs1)).Replace('+','-').Replace('/','_').replace('=','');

$jwt = "$base64str.$signature";

$requestBody = @{
    assertion     = $jwt
    grant_type    = 'urn:ietf:params:oauth:grant-type:jwt-bearer'
    client_id     = $CLIENT_ID
    client_secret = $CLIENT_SECRET
    scope         = $SCOPE 
};

$response = Invoke-RestMethod -Method POST `
        -Uri $GetTokenUrl `
        -Body $requestBody `
        -ContentType 'application/x-www-form-urlencoded' 
Write-Host $response.access_token
```
Android Studioのエミュレーターでカメラスキャンする

## 初めに
Android Studioのエミュレーターでカメラスキャンする方法を記載します。
主にQRコードの読み取り機能を要するアプリなどで使用しています。

## やってみる

1. まずデバイスマネージャーを開いて、設定したい端末の編集ボタンをクリックします。
![スクリーンショット 2023-09-13 16.24.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952574/341fe03f-5ed0-833b-ede4-e9a8b182a46b.png)

2. 「Show Advanced Setting」のボタンをクリックします。
![スクリーンショット 2023-09-13 16.25.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952574/cdd2241d-f207-51b4-8200-b649d4823f2e.png)

3. Cameraの欄を以下のように変更します。
![スクリーンショット 2023-09-13 16.29.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952574/b04826f7-d54a-1d51-7d55-a112bb5053f1.png)

これでエミュレーター自体の設定は終了したので、次は設定したい画像を登録します。
※ エミュレーターの設定変更後は再起動が必要な場合があります。


4. 次にAndroiud Studio上にエミュレーターを表示させます。
View ⇨ Tool Windows ⇨ Emulator の順にクリックしていきます。
![スクリーンショット 2023-09-13 16.32.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952574/ca382f95-8ce0-2b3b-a6c5-0358be56fc4e.png)

5. エミュレーターが表示されたら3点マークをクリックします
![スクリーンショット 2023-09-13 16.58.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952574/84c26576-c1e6-0de6-75f1-dcae626fa8b9.png)

6. サイドバーのCameraをクリックしてWallもしくはTableに表示したい画像を挿入します。
個人的にはWallが読み込みやすいのでおすすめです。
![スクリーンショット 2023-09-13 17.00.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952574/9ba4f99a-fc83-6ccf-080c-c95e891fb7f4.png)

7. 画像を設定後、Androidのカメラを起動して下図の部屋に移動すると設定した画像が表示されています。
Wallに設定した画像は、下図に写っている壁に表示されています。
![スクリーンショット 2023-09-13 17.03.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952574/cbefbb35-758b-a3b6-dc34-ac333c2ff20d.png)

部屋での操作方法はShiftを押しながら下記ボタンを参照してください。
```
W, A, S, Dで前進, 左移動, 後進, 右移動
カーソルで視点の向き変更
```

以上です。
AWSとは何でしょうか？

今回の担当のSと申します!

今回はAWSを興味はあるけど全く知らないという方向けに、大まかですがAWSとは何かについて解説していきたいと思います。

【AWSとは何か】
AWSとはアマゾン社が提供するクラウドサービスのことです。クラウドサービスとは、ハードウェア、ソフトウェア、データなどのIT資産を自分で所持や管理するのではなく、
AWS上で利用できるサービスのことです。AWSはこのクラウドサービスの中で圧倒的によく使われているサービスで、クラウドサービス界の「デファクトスタンダード」として
位置付けられています。

【クラウドサービスの優れた点】
クラウドサービスが普及する前は、全て自前でコンピュータやソフトウェアを用意したり、データの保管をしたりしないといけませんでした。クラウドサービスを使えば、このような手間やコストを大幅に削減することができるようになります。どういうことかと言いますと、クラウドサービスはサーバ上に仮想サービス（サービス内容はサーバーやデータベースなど多岐に渡ります）を生成し、利用者はそれらのサービスを必要に応じて欲しいだけ無駄なく利用することができるのです。

AWSはEC2、S3、CloudFrontなど実に200種類以上のサービスを提供しています。（2023年8月時点）

【AWSを勉強するためには】
AWSは提供しているサービスが膨大かつ多様で、また専門的な用語が多いため学習コストは高めです。AWS認定試験や1年間の無料体験サービスなどを利用して計画的に勉強していきましょう。

AWS無料利用枠：https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all

※無料利用枠を超えた分については従量課金がかかります。ご利用は自己責任でお願いいたします。

【最後に】

はつかぜ株式会社では、IT学習や業務に役立つ情報を定期的にお届けしていきたいと思っています。

私自身新人で未熟な身ですが、一緒にがんばってアウトプットしていきます！
お気づきの点があれば是非コメントいただけると有り難いです！


システム開発のお問い合わせ・ご相談はこちら
https://www.hatsukaze.co.jp/inquire/
Autonomous DatabaseのDatabase Actionsのダッシュボード機能を使ってみた

# はじめに
Database Actionsの「ダッシュボード」では、チャートをグループ化してレポートを作成できます。
# 準備
以前投稿した[こちら](https://qiita.com/bambooseven/items/2c2ec9a1414628f132fb)の記事を参考に、まずはチャートを1つ作ります。

# ダッシュボードを使ってみた

1. Database Actionsにログインし、起動パッドのメニューから「チャート」をクリックすると、下記図のような画面になります。
1. すでに、チャートを1つ作成してありますが、もう1つチャートを作成します。画面右上から、新規チャート」を押します。
![ダッシュボードを使ってみた_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/0582cb08-2d89-3a35-9e95-5b6d83d69c35.png)

1. チャートの作成画面から設定を入力します。
今回は、SSBスキーマのデータを使ってチャートを作成したいと思います。
チャート名：chart2
説明：SSBスキーマを使ったチャート
とし、「次」を押します。
![ダッシュボードを使ってみた_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/a970049a-e385-3155-24e7-b6068a764a1c.png)
1. チャートの定義を入力します。
左側にSQL文を以下のように入力してみます。
    ```
    SELECT
          SUM(LO_REVENUE),
          D_YEAR
       FROM
          SSB.LINEORDER,
          SSB.DWDATE,
          SSB.PART,
          SSB.SUPPLIER
       WHERE
          LO_ORDERDATE = D_DATEKEY
          AND LO_PARTKEY = P_PARTKEY
          AND LO_SUPPKEY = S_SUPPKEY
          AND P_BRAND1 BETWEEN 'MFGR#2221' AND 'MFGR#2228'
          AND S_REGION = 'ASIA'
       GROUP BY
          D_YEAR
    ```
1. 画面右側で、チャートの表示の仕方を設定します。
チャートタイプ：ピラミッド・タイプ
スタイル：3D
系列の列D_YEAR(NUMBER), 値列：SUMLO_REVENUE(NUMBER)
とし、「作成」を押します。
![ダッシュボードを使ってみた_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/399b4a76-2192-dd44-f2d1-6ca2fe7e6965.png)

1. チャートの作成ができました。

    ![ダッシュボードを使ってみた_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/66910ff8-41be-b03e-0da2-97e894c039ef.png)

1. これで2つのチャートができました。この2つのチャートを使って、ダッシュボードを作ります。
画面右上から、「新規ダッシュボード」を押します。
    ![ダッシュボードを使ってみた_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/c932d636-4c89-201e-d86a-66a5683eff23.png)

1. ダッシュボードの設定をしていきます。
 ダッシュボード名と、説明を下記図のように入力します。
    ![ダッシュボードを使ってみた_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/4cc4c41e-2b7e-d47f-0572-07a96bfcaced.png)

1. ダッシュボードが作成できました。まだ、チャートはダッシュボード内に格納されていない状態なので、「+チャートの追加」を押し、チャートを選択します。

    ![ダッシュボードを使ってみた_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/861f2760-1858-a7e9-c4f6-2e25281f10b4.png)

1. 下記図を参考に、chart1を選択します。
同様の方法で、chart2も選択します。
    ![ダッシュボードを使ってみた_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/54f9c0ff-c4f1-1288-76ca-37fcd59fc152.png)

1. すると、2つのチャートがダッシュボード内に反映されました。「保存してプレビュー」かフロッピーディスクのアイコンを押して、変更を保存します。
    ![ダッシュボードを使ってみた_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/3b4a744b-5fff-9ec2-d0cc-752f63cdc4f2.png)

1. 「保存してプレビュー」を押すと、タブが変わり、チャートが2つ表示されます。
チャート形式または表形式でチャートを表示することができ、URLをコピーしてチャートを共有できます。
    ![ダッシュボードを使ってみた_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/c92aa05b-bf0e-c9fd-ebde-fbbf8a3ab24e.png)





# 参考文献
* [ダッシュボードの作成または編集](https://docs.oracle.com/cd/F55414_01/sdweb/creating-or-editing-dashboard.html#GUID-2FB10EDC-6352-42A0-BF69-49B6D45981CC)
Pythonを使ってホストにping疎通確かめるやつ作った

:::note warn
Python初心者なので許してちょ()
:::
## 固定IPじゃないけどサーバー立ててる
IPアドレスは固定IPと動的IPがあると言うのは一般常識だとは思いますが、
サーバーとかそういうのは基本的に固定IPを使うのがいいんでしょう。  
ホントは固定IPがいい!!
ですがガキンチョな私におうちのネットに口を出す権限がないので…

**力技で**なんとかやってみました。
## 本編
### 実装した機能
- ドメインからIPを
- IPにpingを
- 疎通しなかったらLINEで通知を

って感じ。一番最後のLINEによる通知はLINENotifyAPIを使用するので適宜アクセストークンを取得しておいてください。
### コード
```python:check.py
import socket
import subprocess
import requests
import time

domain_name = "your.domain.com"
token = "LINENotifyのトークン"
notify_url = "https://notify-api.line.me/api/notify"
header = {"Authorization": "Bearer " + token,} #ヘッダーの設定
interval = 1800 #チェック間隔(秒)

while True:
    ip_address = socket.gethostbyname(domain_name) #ドメインからIPを
	print(f"{domain_name} のIPアドレス: {ip_address}") #適当に表示させてみた
	response = subprocess.call(['ping','-c','4',ip_address]) #pingを実行
	if response == 0:
		print(f"{ip_address}は疎通しています") #レスポンス帰ってきたらこれ
	else:
		print(f"{ip_address}は疎通していません")
		ng = f"{domain_name}({ip_address})は疎通していません"
		ng_post = requests.post(notify_url, headers=header, data={"message":ng}) #疎通してなかったら通知を送信
	time.sleep(interval)
```

### 偉そうにコードの解説
まず使用するライブラリはIP取得用の`socket`,ping実行用の`subprocess`,LINEにpostする用の`requests`,インターバル用の`time`になります。
必要であれば`pip install`してください。

次はもろもろの設定です。
ドメインやトークン、post時のheaderなどですね。`interval`の値は単位が秒になっています。今回の例では30分になっています。

あとはIPアドレスを取得、`socket.gethostbyname(domain_name)`のところですね。
ここで取得したIPに対してpingコマンドを実行。
レスポンスが帰ってきたらただ疎通しましたよ〜とprintするだけ、
帰ってこなかったらLINENotifyで通知を送信。

これを指定した間隔で実行しているだけです。

## 以上
私はまじでpython初心者なので必要最低限な機能だけ。
なんでこんな回りくどいことしてるんだとか言わないでくださいね!!

<details><summary>screenで起動するためのshファイル</summary>

screenで永遠にping pongしてもらいます。

```shell:check.sh
screen -Sdm check python3 check.py
```
</details>
ModuleNotFoundError: No module named 'distutils.cmd'

## エラーの内容について
!apt-get install python3-pip
を入力した際に、
ModuleNotFoundError: No module named 'distutils.cmd'
のエラーが出る。

!apt-get install python3-distutils
を実行しても
python3-distutils is already the newest version (3.10.8-1~22.04).
と出るだけで、元のエラーが解決しない

## 解決方法について

!apt-get install python3.x-distutils
として、pythonのバージョンを指定してあげる

私の場合は、python3.9だったので、
!apt-get install python3.9-distutils
を実行した後、
!apt-get install python3-pip
を実行することで解決できた。
ChatGPTに「NFTの課題と将来性」を聞いてみた

けっきょく、使えんの？使えないの？なChatGPT。
これをご覧の方の中には、すでに活用してる人も多いのではないでしょうか。

私自身も仕事に使ったり、遊んだりしてます。

魅力的なコピーライターにはなれないけど、情報をまとめるのは得意みたいですね。
あと、案外愛嬌がある奴です。

![スクリーンショット 2023-09-13 16.16.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555961/0f733339-8ee0-94ea-eb56-92f9fd584890.png)

リモートワークもこれで寂しくないね。

さておき。

今回はChatGPTにちょっと難しい質問をしてみます。
お題は「NFTの課題と将来性について」です。
ざっくりしたお題ですが、どんな感じになるのか…
ちなみにプロンプトはこんな感じ↓
<details><summary>プロンプトを見てみる</summary>

```rb
□基本構成のプロンプト

# 本プロンプトの前提
以下のプロンプトは一度英語に翻訳してからインプットしてください。ただし、アウトプットは必ず日本語に翻訳してから出力してください。

# 本プロンプトの目的
本プロンプトの目的は、あなたの書いた文章によって、ユーザーが知りたい情報を得ることです。

# ユーザーが知りたい情報
NFTの課題と将来性

# ユーザーの定義：NFTの動向や将来その分野がどのように発展していくか知りたい人。NFTで収益を得たいが、将来性が気になる人。（文章にはしないでください）

# ユーザーが得る読後感：NFTの課題がわかり、これから先の将来においてどのようにNFTと向き合うべきか理解が深まる。

# ChatGPTロール定義
あなたはWEBの分野に詳しいイノベーターです。これまでに世界中の最先端技術、研究、社会工学の知識を活用して、様々なビジネスを成功へと導いてきました。あなたは現在のネットワークビジネスに関して課題を感じており、どのようにイノベーションすべきかを日々模索しています。

# ChatGPTへの依頼事項
アウトプットする文章：見出しは読者が興味を引く要素を入れてください。パラグラフは6段落として、## でナレーティブな見出しをつけてください。トータル文字数は1800～2000文字以内です。

タイトル：「：」は使わずに# でNFTを主語として広告コピーとして使えるナレーティブな表現でお願いします。文字数は14文字以上としてください。

見出しの作り方：「：」は使わずに読者に役立つことを目的と行動（すべきこと）が明確な一文で述べてください。広告コピーとしてのテイストでお願いします。見出しという文字は不要です。

リード：100文字程度のリードを書いてください。リードという文字は不要です。
最初のパラグラフはNFTとは　を見出しとしての用語解説としてください。'
```

</details>

で、出力された情報はこんな感じ。

:::note info

# NFTの未来を拓く：課題と可能性
NFT（Non-Fungible Token）が注目を浴び、デジタルコンテンツの新たな収益源として脚光を浴びています。しかし、その未来にはいくつかの課題が横たわっています。この記事では、NFTの課題と将来性について掘り下げ、NFTに関心を寄せるあなたがその魅力と課題を理解し、将来に向けてどのようにNFTと向き合うべきかについて考えます。

## NFTとは？
NFTは、ブロックチェーン技術を用いて一意のデジタルアセットを証明するトークンです。これにより、デジタルコンテンツや資産を一意に識別し、所有権を確立できます。アーティストやクリエイターにとって、NFTはデジタル作品を販売し、新たな収益を生み出す手段として革命的です。

## NFTの魅力と収益の可能性
NFTは、デジタルコンテンツにおける個性と希少性を強調し、コレクション価値を高めます。これにより、アーティストは自分の作品に新たな価値を付与し、それを販売できるようになりました。また、NFTは二次市場での取引が可能であり、持続的な収益のチャンスを提供します。

## NFTの課題：エネルギー消費
NFTの課題の一つは、ブロックチェーンの採掘に伴う高いエネルギー消費です。多くのNFTプラットフォームがProof of Work（PoW）アルゴリズムを採用しており、これが環境に与える影響が懸念されています。エネルギー効率の向上が求められています。

## NFTの課題：知的財産権と盗作
知的財産権と盗作の問題もNFTの課題となっています。NFTを通じてデジタルアセットの所有権を証明する方法が不十分であり、盗作や紛争が発生する可能性があります。法的フレームワークの整備と技術革新が必要です。

## NFTの課題：市場の過熱
NFT市場は急成長しており、高額な取引が行われていますが、市場の過熱と価格の不安定性が懸念されています。一部の投資家がNFTを純粋な投機対象と見なし、本来の価値とは異なる価格をつけることが市場の健全性に影響を与える可能性があります。

## NFTの未来を切り拓くために
NFTの未来を明るくするためには、エネルギー効率の向上、知的財産権の保護、市場の安定化が必要です。ブロックチェーン技術の進化や環境への配慮が、エネルギー消費の問題に対処する手段となります。また、法的フレームワークの整備とデジタルアセットの所有権確立に向けた取り組みが、知的財産権と盗作の課題を克服するのに役立つでしょう。

NFTの未来に向けて、アーティスト、クリエイター、投資家、プラットフォーム提供者、規制当局が協力し、持続可能で公正な市場を築く必要があります。NFTはデジタル文化の一翼を担う可能性を秘めており、その課題を克服することで、新たな収益の源として、未来に向けて更なる発展を遂げるでしょう

:::

どうっすかね？
案外アリな感じの文章になったと思いません？

とまあ、こんな感じで、
私がChatGPTの力も借りつつ運営しているのがこちらのサイトです。
<a href="https://www.branding-spike.com/">Branding-Spike｜メタバース・生成系AIなど、WEB3.0時代のブランディング</a>
暇な人は読んでください。
MacBook Setup for Dev

## Homebrew: https://brew.sh

brew install python
brew install node
brew install go
brew install rustup-init
rustup-init
brew install terraform

brew install --cask google-chrome
brew install --cask visual-studio-code
brew install --cask temurin
brew install --cask android-studio
brew install --cask flutter
brew install --cask dbeaver-community
brew install --cask orbstack
brew install --cask rectangle

## VSCode
vscode-icons
indent-rainbow
Git Graph
Thunder Client
Draw.io Integration
Swagger Viewer

## Chrome
Simple Translate
Immersive Translate
uBlock Origin
Google Cloud (GCP)資格受ける前に必読：Professional Google Workspace Administrator 編

皆さんこんにちは！iret Global Solutions 事業部の浜田です。今回は僕が圧倒的に苦戦したProfessional Google Workspace Administratorについて書いてみました。現在は試験も日本語になっていて少し学習しやすくなっていると思いますがやはり他の試験と比べると圧倒的に学習リソースが少ないのでGoogle Cloudの中でも特段難しい試験になっていると思います。

<h1>Google Workspaceとは</h1>
Googleが提供する作業効率化ツールです。以前はG Suiteという名前でしたがWorkspaceに改良されました。まあ簡単にいうと、GmailやGoogle docs,Google meetなどの総称になります。

![スクリーンショット 2023-09-13 16.26.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538605/bcb82a22-b867-7412-25fd-def12fa049d8.png)
↑↑これらのサービスですね。

<h1>前提条件</h1>
本記事は既にVPC, Google Compute Engine, Cloud Functions,
Cloud storageなどの基本的なGCPのサービスを知っていることを前提としています。


<h1>試験概要</h1>
他の試験と同様、試験時間は2時間で問題数は50~60問です。

https://cloud.google.com/learn/certification/google-workspace-administrator?hl=ja

https://cloud.google.com/learn/certification/guides/google-workspace-administrator?hl=ja

<h1>絶対覚えておいた方がいいこと</h1>



<strong>Google Cloud Directory Sync (GCDS)</strong>
Active DirectoryやAzure ADのような、企業で利用中のドメインに登録しているユーザーやグループを、Google Workspace や Cloud Identityのユーザーやグループに同期するツールです本サービスはマストで覚えておきましょう。

<strong>Google Vault</strong>
Google Workspace の情報ガバナンスと電子情報開示のためのツールです。安全な環境でGoogle Workspace を運用するためには必要不可欠なサービスです。問題が起きた時に他のユーザーと共有する方法など、本ツールに関して深く学習することをお勧めします。


<strong>Organizational Structure (OU) </strong>
Workspaceの試験では組織の構造についてよく問われます。できるだけ多くのユースケースを調べどこに管理者を置くのが適切なのか押さえておきましょう。

<strong>Data Loss Prevention (DLP)</strong>
組織内での機密情報や重要なデータの不正な共有や漏洩を防ぐためのセキュリティ対策です。Google Workspaceでは、DLPポリシーを設定して、特定の情報が外部に送信されるのを防ぐことができます。例えば、電子メールトラフィックをスキャンしてコンテンツをフィルタリングすることができます。

<strong>Security Dashboard</strong>
組織内のセキュリティ状態やセキュリティイベントを監視・可視化するダッシュボードです。異常なアクティビティや様々なセキュリティリスクを素早く把握できます。。一例としては、不正なログイン試行や異常なアクセスがあった場合に警告を表示することができます。各セキュリティ レポートパネルには過去7日間のデータが表示可能となっておりますが最大180日間分のデータを保存することができます。

<strong>Content filtering</strong>
不適切なコンテンツやスパムを検出し、適切な対応を行うプロセスです。例えば、特定のキーワードや規定に基づいてメールをフィルタリングし、不正なコンテンツが送信されないようにすることが可能です。


<strong></strong>
<strong></strong>
<strong></strong>
<strong></strong>

<h1>その他必須項目</h1>




<strong>基本的なIT 知識 </strong>
Professional Google Workspace Administratorの試験では総合的なITの知識がどうしても必要となってきます。SSO(シングルサインオン)が何なのかなどCloudにおいてよく聞かれる用語は事前に押さえておきましょう。



<strong>その他サービス</strong>
正直、本試験は覚えることが他の試験と比較しても圧倒的に多いです。Apple iOSデバイスを管理するための<strong>Apple push certificate</strong>や<strong>安全性の低いアプリやAPIの制限方法</strong>、<strong>対象のOrganaization(組織)に対してのSSO設定の方法</strong>など各サービスの特徴だけではなく具体的な使い方等満遍なく学習しておきましょう。

https://support.google.com/a?sjid=10916988430686140719-AP#topic=4388346

上記リンクから試験ガイドに記載されている項目を調べてChromeのプラウザ翻訳などを駆使して徹底的に学習しましょう。

<h1>試験対策</h1>
Google Cloudの模擬試験は必ず解いておきましょう。
足りない部分はUdemyを使うかWhizlabsをChromeのプラウザ翻訳して解くのがおすすめです。他の資格と比較してもネットで出ている練習問題が少ないのでできるだけ多くの問題を解いておきましょう。

https://docs.google.com/forms/d/e/1FAIpQLSfjO0tdoBiwvmmy-fcJVtKVwEavDoupVsUSJSw1cDqT2Zoj7Q/viewform?hl=ja


<h1>最後に</h1>

さて、今回の記事は以上になります。何度も繰り返しになりますが本試験の難易度は比較的高いものとなっています。時間を惜しまず徹底的に学習しましょう。

他のGoogle Cloud の試験に興味がある方は以下に難易度順のランキングを載せているので参考程度に是非。

https://qiita.com/sina-cloud/items/bbe1d263c6b69954867f

それでは皆さん、ご武運を。
【高先さんの電子工作】第12回：無線LANを使ってLEDを操作する

https://youtu.be/ItQm2TBd5-0

Raspberry Pi Pico WをWi-Fiに接続して、ブラウザからLEDを操作するプログラムです。

```python:main.py
import machine
import network
import ujson
from utime import sleep
import usocket

# LEDを操作するピンをインスタンス化する
led = machine.Pin(15, machine.Pin.OUT, value=1)

# Wi-Fiの接続情報を取得する
config = {}
with open('config.json', 'r') as f:
    config = ujson.load(f)

# Wi-Fiに接続する
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(config['ssid'], config['password'])

timeout = 10
while timeout > 0:
    timeout -= 1
    print('Waiting for connection...')
    if wlan.isconnected():
        break
    sleep(1)
    
ip = wlan.ifconfig()[0]
print(f'Connected: {ip}')

# ソケットを開く
server = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)

try:
    # ソケットをネットワークインターフェースにバインドする
    server.bind((ip, 80))
    # 接続待機状態にする（最大同時接続台数1）
    server.listen(1)
    print('Starting Web Server...')
    while True:
        # クライアントソケットを取得する
        client = server.accept()[0]
        # データを受信する（最大1024バイト）
        request = client.recv(1024)
        # バイト列をデコードする
        request = request.decode('utf-8')
        # リソースのパスを取得する
        path = request.split()[1]
        print(path)
        if path == '/lighton?':
            led.value(0)
        elif path == '/lightoff?':
            led.value(1)
        # HTTPレスポンスを生成する
        response = 'HTTP/1.1 200 OK\r\n'
        response += 'Content-Type: text/html\r\n\r\n'
        response += """
            <!DOCTYPE html>
            <html lang="ja">
            <head>
              <meta charset="UTF-8">
              <title>Wi-Fiを使ってLEDを操作する</title>
            </head>
            <body>
                <form action="./lighton" style="display: flex;justify-content: center;align-items: center;margin-top: 30px;">
                  <button type="submit" style="margin: 0 5px;font-size: 2em;padding: 10px 20px;">On</button>
                </form>
                <form action="./lightoff" style="display: flex;justify-content: center;align-items: center;margin-top: 30px;">
                  <button type="submit" style="margin: 0 5px;font-size: 2em;padding: 10px 20px;">Off</button>
                </form>
            </body>
            </html>
        """
        # HTTPレスポンスを送信する
        client.send(response.encode('utf-8'))
        # クライアントソケットを閉じる
        client.close()
except Exception as e:
    machine.reset()

```

Wi-Fiの接続情報を記載する設定ファイルです。

```json:config.json
{"ssid": "Your SSID", "password": "Your Password"}
```
Databricksノートブック上でクリックできる画像を表示する

こちらの関連記事となります。

https://qiita.com/taka_yayoi/items/afa752b1441165cb5b18

Databricks上で以下の記事のようなことをしたいとします。

https://qiita.com/syoyo/items/a43e568ee5309c4f17d3

ノートブックの実装はDatabricksとJupyterLabでも異なるので、別のアプローチが必要となります。

ここでは、[ipycanvas](https://ipycanvas.readthedocs.io/en/latest/)を使います。

```py
%pip install ipycanvas
```

次のセルに以下のロジックを記述します。

```py
from math import pi
from ipycanvas import Canvas
width= 515
height= 474
canvas = Canvas(width=width, height=height)
display(canvas)
```

この時点ではキャンバスには何も表示されません。

次のセルに以下の内容を記述します。

:::note
**注意**
必ずセルを分けるようにしてください。同じセルに記述すると動作しません。
:::

```py
from ipywidgets import Image
img = Image.from_url("https://apod.nasa.gov/apod/image/2208/Cartwheel_Webb_2000.jpg")

canvas.draw_image(img, 0, 0)

from ipywidgets import Output
out = Output()

coordinates = []

@out.capture()
def handle_mouse_down(x, y):
  global coordinates
  coordinates.append((x,y))
  canvas.fill_style = "red"
  canvas.fill_arc(x, y, 10, 0, 2*pi)
  print("Mouse down event:", x, y)

canvas.on_mouse_down(handle_mouse_down)
```

キャンバスに画像が表示されます。
![Screenshot 2023-09-13 at 15.59.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/664a395b-4e17-10bc-b663-9d179a807d33.png)

画像をクリックするとクリックした場所に赤丸が表示されます。
![Screenshot 2023-09-13 at 16.04.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/80fe5189-1442-22f3-a921-290a3d246950.png)

変数`coordinates`にアクセスするとクリックされた座標にアクセスすることができます。

```
Out[4]: [(202, 164), (345, 294), (124, 300), (320, 192)]
```

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
JSでブラウザの戻るボタンを止める方法。

ウェブ開発の世界では、JavaScriptは開発者がインタラクティブでダイナミックなウェブアプリケーションを作成できる強力なツールです。ウェブ開発における一般的な要件の1つに、ブラウザの戻るボタンの動作を制御することがあります。

このブログ記事では、ブラウザの戻るボタンを無効にするJavaScriptのコード・スニペットを深く掘り下げ、それがどのように機能するのかを順を追って説明します。

```ruby:app/javascripts/packs/application.js

function DisableBackButton(){
 window.history.forward()
}
DisableBackButton();
window.onload = DisableBackButton;
window.onpageshow = function(evt) { if (evt.persisted) DisableBackButton() }
window.onload = function() {void(0)}
```
要約すると、このJavaScriptコードスニペットは、ページがロードされるたびに履歴をナビゲートしてブラウザの戻るボタンを無効にし、ユーザーが前のページに戻るのを防ぐように設計されています。さらに、`onpageshow`イベントを処理することで、ユーザーがブラウザの履歴をナビゲートする際に戻るボタンが無効化されたままになるようにしています。

ハッピー・デプロイ！続報をお待ちください。
MacでCiscoにSSHしようとしたらエラーが出る

# 概要
- MacでCisco 1900 SeriesにSSHしようとした
- SSHをしようとしたらマッチングしないとエラーが順番に出たのでまとめた
1. 鍵交換方式が違う
2. ホストキータイプが違う
3. 暗号化アルゴリズムが違う
# Cisco側のSSH設定
これの通りの手順でやりました

https://www.infraexpert.com/study/ciscorouter7.html

手順通りでエラーが出なかったのでSSHをしてみる
## SSH接続時に鍵交換方式が違うと言われる
```
~ ❯❯❯ ssh name@xxx.xxx.xxx.xxx
Unable to negotiate with xxx.xxx.xxx.xxx port 22: no matching key exchange method found. Their offer: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
```
~/.ssh/configに以下を追加する
```
HOST xxx.xxx.xxx.xxx
  HostName xxx.xxx.xxx.xxx
  # 鍵交換アルゴリズムを指定
  KexAlgorithms +diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
```
SSHしてみる
## ホストキータイプが違う
```
~ ❯❯❯ ssh name@xxx.xxx.xxx.xxx
Unable to negotiate with xxx.xxx.xxx.xxx port 22: no matching host key type found. Their offer: ssh-rsa
```
さっきのやつに追記する
```
HOST xxx.xxx.xxx.xxx
  HostName xxx.xxx.xxx.xxx
  # 鍵交換アルゴリズムを指定
  KexAlgorithms +diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
  # ホストキータイプを指定
  HostKeyAlgorithms +ssh-rsa
```
SSHしてみる
## 暗号アルゴリズムが違う
```
~ ❯❯❯ ssh name@xxx.xxx.xxx.xxx
Unable to negotiate with xxx.xxx.xxx.xxx port 22: no matching cipher found. Their offer: aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc
```
さっきのやつに追記する
```
HOST xxx.xxx.xxx.xxx
  HostName xxx.xxx.xxx.xxx
  # 鍵交換アルゴリズムを指定
  KexAlgorithms +diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
  # ホストキータイプを指定
  HostKeyAlgorithms +ssh-rsa
  # 暗号化アルゴリズムを指定
  Ciphers +aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc
```
SSHしてみる
# ちゃんと動いた
```
~ ❯❯❯ ssh name@xxx.xxx.xxx.xxx
(name@xxx.xxx.xxx.xxx) Password:
R1>
```

# コマンド版(config書き換えるの面倒な人のための)
- 鍵交換アルゴリズムを追加 `-o KexAlgorithms=`
```
ssh -o KexAlgorithms=+diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 name@xxx.xxx.xxx.xxx
```
- ホストキータイプを追加 `-o HostKeyAlgorithms=`
```
ssh -o KexAlgorithms=+diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 -o HostKeyAlgorithms=+ssh-rsa  name@xxx.xxx.xxx.xxx
```
- 暗号化アルゴリズムを追加 `Ciphers=`
```
ssh -o KexAlgorithms=+diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 -o HostKeyAlgorithms=+ssh-rsa -o Ciphers=+aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc name@xxx.xxx.xxx.xxx
```
【SQL】count()で数えた列をさらにcount()する方法

## はじめに
SQLでcount()した列をさらにcount()したい場面に遭遇しました。
例を出しながら、備忘録としてまとめます。

## 内容

サンプルの表データは以下の通りです
営業メンバーに現在の担当の顧客を登録してもらうような状況で使う表を想定しています。

|   |名前|所属|担当顧客|登録日|・・
|---|---|---|---|---|---
|1  | Aさん |製造本部  |会社a|2023/〇〇/〇〇|・・
|2  | Aさん |製造本部  |会社b|2023/〇〇/〇〇|・・
|3  | Bさん |流通本部  |会社c|2023/〇〇/〇〇|・・
|4  | Cさん |金融本部  |会社d|2023/〇〇/〇〇|・・
|6  | Aさん |製造本部  |会社f|2023/〇〇/〇〇|・・
|7  | Bさん |流通本部  |会社g|2023/〇〇/〇〇|・・
|・ |・|・|・|・|・・
|・ |・|・|・|・|・・


それぞれのメンバーが何件の顧客を登録しているのか確認するSQL文は以下になります。

```SQL
SELECT 名前, count(*) 件数
FROM サンプル表 
group by 名前
```

得られる結果のイメージは以下です。

|名前  |件数  |
|---|---|
|Aさん  |5  |
|Bさん  |3  |
|Cさん  |2  |
|・  |・  |

さらに、〇件登録しているメンバーが何人なのか確認する場合のSQLは以下のようになります

```SQL
select 件数,count(*) 件数の件数
from (
SELECT 名前, to_char(count(*)) 件数
FROM サンプル表
group by 名前
)
group by 件数
order by 件数 ASC
```


|件数  |件数の件数  |
|---|---|
|1  |5  |
|2  |3  |
|3  |2  |
|4  |4  |
|・  |・  |

#### ★ポイント★
・fromの後をサブクエリにしていること
・count()で取得した値をto_char()関数で文字列化していること


この結果から、１件の登録をしている営業メンバーが5名。2件登録している営業メンバーが3名。のように〇件登録している営業メンバーが何名ずついるのかを知ることが出来ます。



## まとめ

count()で数えた列をさらにcount()する時には数値を文字列化することがポイントだという事が分かりました。今回のようなSQL文を書くのに多く時間がかかってしまったので、忘れないようにQiitaに記事を残しました。どこかのタイミングで参考になればと思います。
AWS Secrets ManagerとLambdaを使ってローテーションする際に「シークレットをローテーションできませんでした」とエラーが出た時の対象法

## 概要
AWS Secrets Manager内でキーローテーションの設定をしてうまくいかなかった際に下記画像のように
`シークレットをローテーションできませんでした`
としか表示されずに困ったのでその原因と対処法について解説します

![スクリーンショット 2023-09-13 14.14.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/dac7b8c9-abd6-b85b-a218-26262ce69bc4.png)

## 原因
結論から言うとリソースベース(今回だとSecerts Manager)のポリシーステートメントが足りてなくてローテーションができませんでした

リソースベースのポリシーステートメントについては下記の通りです
> 関数は、その実行ロールから AWS リソースに対する許可を受け取ります。AWS SDK を使用して AWS のサービスを呼び出すには、そのサービスの API オペレーションへのアクセスを許可するポリシーをロールに追加します。
Lambda コンソールが作成するデフォルトの実行ロールには、Amazon CloudWatch ログにログを保存するアクセス許可しかありません。X-Ray トレースなどの一部の機能では、追加のアクセス許可が必要です。コンソールで関数を設定すると、コンソールは必要なアクセス許可を追加しようとします。

要するに何かしらのマネージドサービスをトリガーにLambdaを実行するにはトリガーとなるマネージドサービスのアクセスを許可する必要がある、ということです

## 対処法
### ポリシーステートメントの設定
Lambdaの設定タブを選択し、アクセス権限を追加をクリックします
![スクリーンショット 2023-09-13 15.38.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/d4cfc8ca-2e7a-d03c-3fb6-a980ba8e2ae8.png)

AWSのサービスを選択し、今回はSecrets Managerを選択します
ローテーションで設定した時間に実行させたいのでアクションはlambda:invokefunctionにします
![スクリーンショット 2023-09-13 14.13.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/fffd5dfb-4bcd-aba5-6538-6fd6665a0b3d.png)

以下のようにポリシーステートメントが追加されたら成功です
![スクリーンショット 2023-09-13 15.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/4f92e541-839d-9720-e2b2-ba118f6a5480.png)

### Secrets Managerの設定
Secrets Managerにローテーションの設定を行います
![スクリーンショット 2023-09-13 14.14.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/45e355a4-50ce-796b-3b7b-84b0114f2bf0.png)
![スクリーンショット 2023-09-13 14.14.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/3f155b6d-0341-c6e3-782d-0e7712a8f23d.png)

以下のように正常にローテーションの設定ができていたら成功です
![スクリーンショット 2023-09-13 14.16.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/a198814d-e1d3-cb00-efa9-b8cd18330cd1.png)

![スクリーンショット 2023-09-13 14.16.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/05db17a8-8dfc-9ed7-8271-041b9281f1ab.png)

## 参考
https://docs.aws.amazon.com/secretsmanager/latest/userguide/troubleshoot_rotation.html

https://stackoverflow.com/questions/58899204/secrets-manage-fail-to-rotate-the-secret-cannot-invoke-the-specified-lambda-fu
LINE WORKS のトーク Bot API を Colaboratory でサクっと試してみる

# 手っ取り早く LINE WORKS のトーク Bot API を実行してみる

https://colab.research.google.com/drive/1lFMBu1UhhwK_l2r1BFfudlfxEqdYTAUY?usp=sharing

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">LINE WORKS の Bot API をブラウザで簡単に試せます。Google Colaboratory に認証、メッセージ送信、オウム返し Bot のサンプル コードを置きました。<br><br>Google アカウントでログインすれば、そのまま実行できます。<a href="https://twitter.com/hashtag/LINEWORKS?src=hash&amp;ref_src=twsrc%5Etfw">#LINEWORKS</a><a href="https://t.co/wRqyy4RfS8">https://t.co/wRqyy4RfS8</a> <a href="https://t.co/3UpdYgWNhZ">pic.twitter.com/3UpdYgWNhZ</a></p>&mdash; iwaohig (@iwaohig) <a href="https://twitter.com/iwaohig/status/1701729592866943064?ref_src=twsrc%5Etfw">September 12, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>