OmniAICreator/Qiita-1.07M huggingface dataset:
【Cloudflare】XXXX.cloudflareaccess.comのサブドメインを変更する方法

あまり需要はないかもですが，個人的に気になったことだったのでメモ．

個人で利用中のCloudflareにて，メールアドレスやらアカウント名やらを変更する機会がありました．

そこで，Cloudflare Access認証画面のサブドメイン（画像赤枠部分）も一緒に変えようと思ったのですが，その変更方法がわからず時間を浪費してしまいました．

![Screenshot 2025-01-24 at 19.19.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1483756/62ad3133-2bed-e5c8-8bc6-2cd782a21910.png)

変更できなくても特段大きな支障はないと思いますが，自分と同じように困っている方の一助となれば幸いです．

## URLのドメイン変更方法
まずは認証画面のURLを変更します．特に変更していなければ認証画面に表示されているドメインと同一のものがURLとして使用されていると思います，

画面上のドメインだけ変更したい場合は，[画面上のドメイン変更方法](#画面上のドメイン変更方法)の項目をご確認ください．

1. Cloudflareにアクセスして，左側のタブから「Zero Trust」をクリック．
2. 同様に左側のタブの一番下にある「Settings」をクリック．
3. 下記画面の「Custom Pages」をクリック．

    ![Screenshot 2025-01-24 at 19.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1483756/4a189099-ce5f-77c1-2b0d-ecd7dcd29637.png)

4. 画面上部に「Team domain」という項目があり，ここがCloudflare Accessで使用されるドメインとなっているようです．これを編集することで認証画面のURLが変更されます！

    ![Screenshot 2025-01-24 at 19.13.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1483756/d870828d-6607-7b26-9174-1eb823230552.png)

## 画面上のドメイン変更方法
続いて画面上に表示されるドメインの変更方法です．
URLを変更した下記画面（Zero Trust -> Settings -> Custom Pages）の一番下に「Login page」という項目があり，これをクリックします．

![Screenshot 2025-01-25 at 8.28.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1483756/7b207105-5c7a-d430-3b29-e4a39292d3f3.png)

すると認証画面を編集可能な画面に遷移します．ここの「Your Organization's name」のところを変更することで，画面上のドメインが変更されます！

![Screenshot 2025-01-25 at 8.56.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1483756/007e90e9-7e7f-e98f-9304-5affedfc469f.png)

なお，表示されている通りロゴや背景色の変更なども可能なようです．

## 参考
- Team domainに関するdocumentがあったので共有します↓

https://developers.cloudflare.com/cloudflare-one/faq/getting-started-faq/#whats-a-team-domainteam-name
OpenAI Operator：未来を変えるAIエージェント

# OpenAI Operator – AIエージェントの革命的瞬間
---

想像してみてください。あなたのやるべきことリストが魔法のように自動で完了する世界を。飛行機の予約が必要ですか？完了。食料品の注文を忘れましたか？対応済み。友達とのグループチャット用のミームを作りたい？簡単です。これらはもう単なる空想ではありません。OpenAIが開発した「Operator」は、デジタル世界とのインタラクションを変革するAIエージェントであり、私たちの日常に革新をもたらします。  
2025年現在、AIエージェントという言葉自体は新しくありませんが、「Operator」によってOpenAIは自動化体験を新たな次元へと押し上げました。このブログでは、Operatorの概要、その仕組み、生活をどのように変えるのかについて詳しく解説します。

---

## 目次
1. [OpenAIのOperatorとは？](#openaiのoperatorとは？)
2. [Operatorの仕組み](#operatorの仕組み)
3. [Operatorの操作方法](#operatorの操作方法)
4. [Operatorへのアクセス方法](#operatorへのアクセス方法)
5. [実際の使用例](#実際の使用例)
6. [安全性とプライバシー](#安全性とプライバシー)
7. [Operatorの未来](#operatorの未来)
8. [結論](#結論)
9. [よくある質問](#よくある質問)

---

## OpenAIのOperatorとは？

# OpenAI Operator – AIエージェントの革命的瞬間

YouTube: [OpenAI Operator 概要を動画で確認](https://youtu.be/CSE77wAdDLg)

**Operator**は、ブラウザを活用してタスクを実行するAIエージェントです。まるでデジタルアシスタントがウェブページを「見て」人間のように「操作」しているかのような感覚です。クリック、スクロール、入力、自己修正など、さまざまな操作を自律的に行えます。

ChatGPTに似たインターフェースを備えたOperatorは、フォーム入力、食料品の注文、アポイントメントの予約などの反復タスクを処理します。さらにOpenAIがフィードバックを収集して技術を洗練していくことで、Operatorの能力は拡大し、個人や企業にとって欠かせないツールとなるでしょう。

---

## Operatorの仕組み

Operatorの核となるのは、OpenAIの先進的な**Computer-Using Agent（CUA）モデル**です。このモデルは、ボタンやメニュー、テキストフィールドといったグラフィカルユーザーインターフェース（GUI）と人間のようにインタラクションするよう設計されています。専門的なAPIに頼ることなく、ウェブサイトを操作してタスクを実行できます。

以下は、Operatorの基本的な仕組みです。

### 1. **知覚**
Operatorはスクリーンショットを撮り、コンピュータの現在の状態を把握します。

### 2. **推論**
「チェイン・オブ・ソート」と呼ばれる推論技術を活用し、複数の手順を計画します。必要に応じて結果に基づいて動的に適応します。

### 3. **行動**
仮想のマウスとキーボードを使用してクリック、スクロール、入力などの操作を実行します。パスワード入力やCAPTCHA対応などの敏感なアクションではユーザーの確認を求めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/77904ab4-9c09-93e8-cb4d-11d8168b8733.png)

---

## Operatorの操作方法

Operatorは、シンプルなタスク記述で利用できます。

1. **タスクを説明する**  
   「レオの店でガーリックブレッドを注文して」や「フィレンツェのレストランを予約して」と指示するだけで、Operatorが自律的にタスクを完了します。

2. **制御を保つ**  
   ログインや支払いの詳細入力などのセンシティブな操作では、Operatorはユーザーに操作を引き継ぐよう求めます。

3. **複数のタスクを同時処理**  
   Operatorは複数のブラウザタブを開いているかのように、同時に複数のタスクを処理できます。

---

## 実際の使用例

### 生産性向上
- **ショッピング**: オンライン購入の自動化、割引検索、価格比較、配送追跡。
- **予約**: レストラン、フライト、ホテル、イベントチケットの予約。
- **請求支払い**: 定期支払いやサブスクリプションの管理。
- **カレンダー管理**: アポイントメントのスケジュール設定やリマインダー送信。

### マーケティングと広告
- **市場調査**: 顧客レビューや競合情報の収集。
- **ソーシャルメディア管理**: 投稿のスケジュール設定やエンゲージメントの分析。

### テクニカルサポート
- **コード取得**: GitHubやStackOverflowからコードスニペットを取得。
- **エラートラブルシューティング**: コーディングエラーへの対応。

---

## 安全性とプライバシー

OpenAIはOperatorの設計において安全性とプライバシーを最優先しています。

- **ユーザー制御**: センシティブな操作では必ず確認を求めます。
- **データプライバシー**: データ収集をオプトアウトでき、ブラウジングデータをワンクリックで削除可能。
- **セキュリティ対策**: 悪意のあるウェブサイトを検出して回避。

---

## Operatorの未来

Operatorは、技術が進化するにつれてさらなる可能性を秘めています。

- **マルチタスク処理**: より長く複雑なワークフローの処理。
- **IoTデバイスとの統合**: スマートホームデバイスの制御。
- **グローバル対応**: 多言語や地域対応の拡大。
- **AI駆動型意思決定**: データ分析や洞察の提供、推奨アクションの提案。

---

## 結論

Operatorは単なるAIエージェントではなく、未来の一端を垣間見ることができるツールです。日々忙しいプロフェッショナルや企業経営者にとって、生活を効率化し、作業を自動化する強力な武器となるでしょう。

同時に、これほど強力なエージェントの開発には、プライバシーやセキュリティに関する課題も伴います。技術革新と倫理的なバランスを取りながら進むことで、Operatorのようなエージェントが真にポジティブな影響をもたらすことが期待されます。

---
LogicAppsとHybridRunbookWorkerで複数台の仮想マシンを操作する

### 初めに
皆さんこんにちは、クラウド環境の運用をする上で仮想マシンへ一度にスクリプトを実行したいことって結構ありますよね。例えば、ソフトウェアの設定を変更したいとか、サーバー内のテキストファイルをプッシュしたいとか・・・。今回はLogicAppsを使ってそんなお悩みを解決します。
ぼちぼち詳しい内容を書いていきます

## 流れ
#### LogicAppsとHybridRunbookWorkerで複数台の仮想マシンを操作する
+ [構成図](#構成図)
+ [処理フロー](#処理フロー)

#### [LogicAppsでTableStorageからサーバーリストを取得してみる](https://qiita.com/pienhalifax/items/f4b4d1a3de132fd344c3)
説明：TableStorageにサーバーリストを作成しておき取得したサーバーリストを配列に加工します。LogicAppsのBicepでの構築と各種設定を同時に進めていきます。

+ TableStorageから仮想マシンのリストを取得する
    + TableStorageを用意する
    + LogicAppsを用意する（Bicep）
    + TableStorageから仮想マシンのリストを取得する
    + 仮想マシンのLinuxサーバーだけにフィルタしてみる

#### サーバーリストを使用してLogicAppsからHybridRunbookWorkerを起動する
説明：Automationと仮想マシンをBicepでデプロイして、前段で配列に格納したサーバーリストを使用してHybridRunbookWorkerを起動するようにワークフローを改良していきます。
+ 仮想マシンのリストを使用してRunbookを起動する
    + AutomationAccountを用意する
    + 仮想マシンのリストを使ってLogicAppsからAutomationAccountをキックする

#### Runbookを作成するLogicAppsのワークフローを読みやすく改良してエラー処理を実装する。
説明：ここまで作成したワークフローを読みやすく改良したり、エラー処理を導入したりしてより実用的なワークフローへとしていきます。
+ エラーハンドリングを実装する
    + 各コネクタのリトライ設定をする
    + HybridRunbookWorkerのステータスに応じて処理を分ける
    + Runbookの出力に合わせて処理を分ける
    + TableStorageに実行結果を戻す
+ ワークフローを読みやすくする
    + 変数定義化する
    + 起動するサーバーごとに引数を渡す

## 構成図
今回構成していくイメージはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678759/064b78f7-bbbd-5d29-386d-f667496ba8eb.png)

Azure Logic Apps ー Azure Table Storage
+ Table Storage内に仮想マシン一覧のリストを作成しておき、一覧を取得してきます
+ 実行結果をTable Storageへ返します

Azure Logic Apps ー Automation Account
+ Logic AppsからHybrid Runbook Worker Jobを作成します
+ 実行結果をAzure Logic Appsへ返します

## 処理フロー
処理フロー図を以下に示します。
※記事を記載していく中で、更新していく可能性があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678759/19a049d0-baef-b587-b75a-8d72c97b3238.png)
学習記録アプリをアップデート

# はじめに
JavaScriptとJQueryの区別もつかない初学者が
苦しみながらReactでアプリを開発し、新しい技術に感動した記録です

# 使用技術
・React
・VITE
・SUPABASE
・Firebase
・Jest
・react-testing-library
・GithubActions

大量すぎる知らない単語と出会い
インプットとアプトプットを繰り返して学習記録アプリを作成しました。
作成したアプリはgithubで公開しています。

https://github.com/ccc-chi/recordsAppV2

# 開発について
新しい技術にめちゃくちゃ感動したので、初心者なりの感想を添えておきます。機能の説明ではなくほぼポエムです。

## SUPABASE
### バックエンドが爆速で爆誕
学習の記録をデータベースで管理するために使用しました。
管理画面のUIも分かりやすくて良い。
API通信もかなり簡単にできて良い。
自分で作ったアプリがデータベースを操作できることに感動しました。

## Firebase
### ローカルデータが爆速でWEBへ公開
ページを公開するといえばサーバーをレンタルして、という知識しかなかったので、デプロイって？え、これだけでWEBに公開されちゃうの...とかなり感動しました。初めてのデプロイ当日は嬉しくて知人にURLを送りつけ、学習記録を追加してもらいました。

## Jest
### 簡単にテストできるから安心してコード書ける
自分の経験になりますが、後任者にいかに伝わるコードが書けるか、と頭を悩ますことが多く、ちょっとした変更でJSが動かなくなることも、そしてそのデバッグ作業も大変な思いをしました。
Jest使えば未然に防げたバグがいくつかあったなあ、と。
導入も簡単だし、テストも単純に書けばそんなコストでもないのかも。
テストって大事！テストの実行結果も、いろいろ教えてくれるのがいいですね。

## React Testing Library
### ユーザーが使うようにテストできる
JestとRTLがいまいち掴めなくて、下記の記事が大変参考になりました。

https://qiita.com/ossan-engineer/items/4757d7457fafd44d2d2f

クリックやテキスト入力など、ユーザーが実際に行うようnテストができるのはすごいですね。今後も使っていくとより感動しそうです。

## GithubActions
### プッシュで全部やってくれる。すごく気が利いてる
YAMLファイルに書いておけば、自動でテスト・ビルド・デプロイを実行してくれるってすごい。考えた人すごい。
YAMLファイルの作成に苦労しましたが、エラーがgithubでしっかり確認できるところも良かったです。初心者にやさしい！

# 開発を通して
たくさんの技術者の努力によって魔法みたいな便利さが叶えられていて、自分が身近に触れるアプリにも同じ技術が使われてるかもしれないと思うとワクワクした。
今はまだ小さなアプリしか作れないけど、「誰にでも使いやすい優しい仕組み」を考えて、「誰かの役にたつツール」を作りたいと思った

# おわりに
取り組み始めた時は聞いたことがない単語ばかりで、理解することにとても苦労しましたが、どれも素晴らしい技術ばかりで、感動しました。
よりもっと使いこなせるようになりたいです

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
Grove-GPS Air530Zの使い方(Air530は記事に当てはまりません)

試しに購入して使用してみた結果、少しクセがあったので
# おねがい
 Air530Zであることです。
# 前提
マルツで販売されているモジュールです。
 Air530とAir530Zが搭載されたモジュールGROVEがあるようです。今回使用しているのは**Z**がつくものです。
 
# コマンドについて
　仕様書に書いているコマンドはPCAS以外送信できません。
 
 https://c.vue2.cn/attachment/20211221165407683_Air530定位模块使用手册V2.0.pdf

 正確にいうと送信してもAir530が処理しません。
 PCASのコマンドは少ないのでそれだけあまり設定できません。
 このサイトも参考になります

 https://wiki.luatos.com/chips/gnss/air530z.html

 # Galileo ガリレオは受信しない!?
  あくまでも私が試した分では受信しませんでした。→もしかしたら**Air530**なら受信できるのかもしれません。
  商品ページにガリレオが受信できると書いてありますが、受信できません。
  よくわからないんですが、搭載チップAT6558はそもそもBD、GL、GP、QZSSのみしか対応していないようです。
  またSBASの同じように受信しません。　受信しても0,0(方位、仰角)で使用できません
  
  受信できるんですかね？　誰か詳しい人教えてください！
  # 参考用
NMEAメッセージは以下のように送信されます
プロトコルNMEA0183です。
起動直後
```NMEA0183:start
$GPTXT,01,01,02,MA=CASIC*27
$GPTXT,01,01,02,IC=AT6558R-5N-32-1C580901*13
$GPTXT,01,01,02,SW=URANUS5,V5.3.0.0*1D
$GPTXT,01,01,02,TB=2020-03-26,13:25:12*4B
$GPTXT,01,01,02,MO=GBR*25
```
チップはAT6558R5N32のようです。(Air530Z)
北斗衛星はBDで送信されます。従って、U-centerで北斗は表示できません
なぜかQZSS(みちびき) PRN193とPRN197を受信します。
もしかしてL1C/A以外の信号を受信?
![Sky_view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994157/ee7d936b-1b03-30af-e284-10486460bb1b.png)
![CN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994157/1c9cf7ae-e751-e742-b280-84e51c94a573.png)
(PRN193であるみちびき初号機は運用終了してますよね? なんで...)→そもそもみちびきではないのか?
この調子だと25/02/01に打ち上げ予定(25/01/27現在)であるみちびき6号機受信するのか楽しみですね。
**Air530Z**が対応しているQZSSは193~197で196は受信できません。

25/01/31追記 現在のFIX状況
![スクリーンショット 2025-01-31 141428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994157/05d5c22d-dcff-19d6-9e3c-b31b7b5cd562.png)
25/02/02追記 現在のFIX状況
![スクリーンショット 2025-02-02 191233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994157/47cfe540-27e9-09ec-e92c-bac1b5604842.png)
これからプロジェクトマネージャーを目指す人へ

# プロジェクトマネージャーは指揮者

プロジェクトマネージャー（以下PM）とは、プロジェクトの目標を達成するために、計画、実行、管理を担う役割です。PMのミッションは、

> チームの力を最大限に引き出し、プロジェクトを成功へと導くこと。

具体的には、以下のような活動を通じてプロジェクト全体を推進します：

- プロジェクト計画の策定とスケジュール管理
- リソースの割り当てと調整
- チーム間のコミュニケーションの促進
- リスク管理と問題解決
- ステークホルダーとの調整や報告
- プロジェクト終了後の振り返りや成果物のレビュー

PMは、チームが一丸となってゴールを達成できる環境を整える「オーケストラ指揮者」のような存在と言えるでしょう。

## このガイドを書いた背景

日本ではプロジェクトマネージャーという職種の認知度が徐々に高まっていますが、未だその役割や重要性が十分に理解されていない場面も多くあります。

私自身、プロジェクト管理における課題を数多く経験してきました。その中で得た学びを共有することで、これからPMを目指す方や現役のPMに役立つ情報を提供できればと考えています。

この記事では、プロジェクトマネージャーとして重要だと考えるポイントを、自分の経験をもとに解説します。この内容が、プロジェクトマネージャーの理解やスキル向上に少しでも役立てば幸いです。

# プロジェクトマネージャーに必要な要素

## 1. 探求心を持とう

PMは多岐にわたる知識やスキルが求められます。その中でも特に重要なのは、プロジェクトの成功に直結する「顧客ニーズ」と「チームメンバー」に対する探求心を持つことです。

### 顧客ニーズを理解するための視点

PMはプロジェクトの最終的な受益者である顧客の課題や期待を深く理解する必要があります。たとえば、プロジェクトの進行中に以下のような視点を持つことが求められます。

- 顧客はどのような課題を抱えているのか？
- 提供する成果物が顧客にどのような価値をもたらすのか？
- 顧客の期待を超えるためには何が必要なのか？

### チームメンバーに寄り添う姿勢

また、PMはプロジェクトを実行するチームメンバー一人ひとりの強みや価値観、モチベーションを理解することも重要です。

- 「**このメンバーのスキルをどのタスクに活かすべきか？**」
- 「何がこのメンバーのモチベーションを高めるのか？」
- 「どのようにすればチームが力を最大限に発揮できるか？」

日々のコミュニケーションや観察を通じて、こうした疑問を解消することで、より強いチームを構築できます。

## 2. 素早く、的確に決断する力

PMの仕事は多くの場合、意思決定の連続です。プロジェクトの進行中には、次のような難しい選択に直面することがあります。

- 限られた予算やリソースをどこに優先配分するか？
- 不測の事態が発生した際、どのように対応するか？
- **チーム内で意見が対立した場合、どの方向に舵を切るか？**

そのような状況では、「ひたすら考える」ことが大切です。たとえば、以下のようなプロセスを経て意思決定を行います。

1. 問題の本質を理解する
2. 利害関係者やチームメンバーの意見を収集する
3. 情報を整理し、選択肢を比較検討する
4. 最善だと思われる選択肢を選び、実行する

意思決定にはリスクが伴いますが、しっかりと考え抜いたプロセスがあれば、結果がどうであれ次につながる財産となります。

## 3. 円滑なコミュニケーションをデザインする

PMは、プロジェクトに関わるさまざまなステークホルダーと関係を築く必要があります。そのためには、単なる情報伝達者ではなく、「良きリーダーシップを発揮できるコミュニケーター」になることが求められます。

### チーム内で信頼を育む方法

チームが一丸となって働ける環境を整えるために、次のようなポイントに注意しましょう。

- 定期的に進捗確認の場を設ける
- メンバーの意見やアイデアを積極的に引き出す
- トラブルが発生した場合には迅速に介入し、解決をサポートする

### ステークホルダーと良好な関係を築く

一方、顧客や経営層などの外部ステークホルダーとの関係構築も重要です。特に以下の点を意識してください。

- 現状や課題を明確に伝える
- 適切なタイミングで進捗報告を行う
- 相手のニーズや期待に応じた柔軟な対応を心がける

## 4. ビジョンを共有し、チームを鼓舞する

プロジェクトの成功は、PMの情熱がどれだけチームや関係者に伝わるかによって大きく左右されます。

たとえば、プロジェクトの背景や目的を説明する際に、ただ事実を並べるのではなく、次のように語ることでチームの士気を高められます。

- プロジェクトが解決する社会的課題や意義を伝える
- 成果物がもたらすポジティブなインパクトを具体的に説明する
- プロジェクトの達成がチームや個々人にもたらす成長やメリットを共有する

情熱を持ってプロジェクトに取り組み、その熱意を絶えず周囲に伝えることで、プロジェクト全体が活性化します。

# 最後に

探求心、決断力、コミュニケーション力、ビジョン共有の4つのキーワードを中心に、プロジェクトマネージャーとして重要だと思うポイントをまとめてみました。

PMとしてのスキルやマインドは日々の経験を通じて磨かれていくものです。この内容が、少しでもあなたの成長のヒントになれば嬉しいです。

プロジェクトマネージャーを目指す皆さんが素晴らしい成果を生み出せることを願っています！
Bashスクリプトでプロセス監視 -> Dockerコンテナでコマンドを自動実行を実現する方法を考えてみた


## 背景
この記事では、指定したプロセスの監視を行い、すべてのプロセスが終了した後に特定のコマンドをDockerコンテナ内でバックグラウンド実行するBashスクリプトについて紹介します。

このスクリプトがなぜ必要になったかというと、
OOMを避けるために今動いているプロセスが止まったら、別プロセスを実行したい！
でもずっと、プロセスが終わるのを休日も物理的に監視し続けるのは非現実的！
みたいな感じで、スケジューラーのようなものを考えてみたのがキッカケです😎
備忘録として、スクリプト例を以下に記します。

## スクリプト例：
ファイル名 : `monitor_and_run.sh`
```bash
#!/bin/bash


# 監視するプロセスのPID
PID1=31515 #任意のPID
PID2=35036 #任意のPID

# Dockerコンテナ名
CONTAINER_NAME="my_container"

# 監視が終わったら実行するコマンド
COMMAND_TO_RUN="pyenv activate myenv && cd /workspace/project/src && ./hello.sh"

# フラグ管理
PID1_COMPLETED=false
PID2_COMPLETED=false

# ログ用のタイムスタンプ関数
timestamp() {
    date "+%Y-%m-%d %H:%M:%S"
}

# 監視ループ
while true; do
    # PID1の存在確認
    if ! $PID1_COMPLETED; then
        if ps -p "$PID1" > /dev/null 2>&1; then
            echo "[$(timestamp)] [INFO] Process with PID $PID1 is still running."
        else
            echo "[$(timestamp)] [INFO] Process with PID $PID1 has completed."
            PID1_COMPLETED=true
        fi
    fi

    # PID2の存在確認
    if ! $PID2_COMPLETED; then
        if ps -p "$PID2" > /dev/null 2>&1; then
            echo "[$(timestamp)] [INFO] Process with PID $PID2 is still running."
        else
            echo "[$(timestamp)] [INFO] Process with PID $PID2 has completed."
            PID2_COMPLETED=true
        fi
    fi

    # 両方のPIDが終了したらコマンドを実行してループを抜ける
    if $PID1_COMPLETED && $PID2_COMPLETED; then
        echo "[$(timestamp)] [INFO] Both processes have completed."
        echo "[$(timestamp)] [INFO] Executing command in container '$CONTAINER_NAME'."

        # Dockerコンテナ内でコマンドを実行（バックグラウンドで実施）
        if nohup docker container exec "$CONTAINER_NAME" bash -c -i "$COMMAND_TO_RUN"; then
            echo "[$(timestamp)] [INFO] Command executed successfully in container."
        else
            echo "[$(timestamp)] [ERROR] Failed to execute command in container."
        fi
        break
    fi

    # 1分待機
    sleep 60
done

exit 0
```

### 実行コマンド
```bash
#実行したディレクトリ配下に指定のログファイルを出力する
nohup ./monitor_and_run.sh > test.log 2>&1 &
```

## つまづいたポイント
- 今回最終的に実行する`hello.sh`は中でpythonコマンドを実行するので、pyenvの仮想環境をアクティベートさせて実行する必要がありました。
- そこでつまづいた点として、bashの`-i`オプションがないとインタラクティブモードにならずシェルの設定ファイル(~/.bashrcなど)が読み込まれないので、環境変数のパスが通らずpyenv環境でpythonが実行されませんでした...。

## 注意点
- 任意のプロセスID (PID) は、スクリプト実行前に正しいPIDを取得してください。
- スクリプト内のコマンドは、適宜環境に合わせて編集してください。
- 実行前に`chmod`コマンドなどで実行権限を付与してあげて下さい。

## まとめ
私自身の備忘として残しましたが、どなたかの参考になれば幸いです。
Python で画像を表示する(2)

## 導入
今回は Web を使って画像を表示します。

## 前提
例によって仕事で普段使うようなフレームワークは面倒で嫌なので、Reflex というライブラリを使います。

## 準備
始めに Reflex をインストールします。
```
$ pip install reflex
```

適当なワークディレクトリを用意して reflex 用のプロジェクトを作成します。
```
$ reflex init
```
プロジェクトの種類を聞いてくるので blank (空っぽ)を選べば良いです。

表示したいイメージ (sample.png) はプロジェクトディレクトリ内の assets に置きます。

## 実行
```
$ reflex run
```
としたら、web ブラウザで http://localhost:3000/ にアクセスします。
デフォルトの画面が表示されたら OK です。

## 修正
当然ですがデフォルトで用意されたソースでは画像は表示してくれないので、
プロジェクトディレクトリにある project_name/project_name.py を修正します。

なんかディレクトリ名が冗長な気がするけども、今は気にしないでおきます。
```
def index() -> rx.Component:
    # Welcome Page (Index)
    return rx.container(
        rx.color_mode.button(position="top-right"),
        rx.vstack(
            rx.heading("Welcome to Reflex!", size="9"),
            rx.image(
                src="/sample.png",
                width="auto",
                height="auto"
            ),
            rx.text(
                "Get started by editing ",
                rx.code(f"{config.app_name}/{config.app_name}.py"),
                size="5",
            ),
            rx.link(
                rx.button("Check out our docs!"),
                href="https://reflex.dev/docs/getting-started/introduction/",
                is_external=True,
            ),
            spacing="5",
            justify="center",
            min_height="85vh",
        ),
        rx.logo(),
    )
```
このように rx.image(...) をねじ込んで保存します。
reflex はソースファイルを修正すると Web 画面のほうに即反映してくれます。

ただし reflex 実行中に assets 配下のファイルを変更しても即反映はしないようです。
reflex を Ctrl + C で一旦止めて、もう一度 reflex run すれば OK でした。

## 動作確認
「Welcome to Reflex!」の下に sample.png が表示されました。

## 次回(?)
これだけではあまりにつまらないので、テキストボックスとボタンを配置して
テキストボックスに入力したイメージをボタン押下で表示するとかやってみると良いかも知れません。

暇を持て余していたら続きをやるかも知れません。
AIは私たちをダメなプログラマーにしている

先日、redditのプログラミングコミュニティで興味深い議論を見つけました。「**AI Is Making Us Worse Programmers（AIは私たちをダメなプログラマーにしている）**」というちょっと挑発的なタイトルのスレッドなのですが、実際に読んでみると、AIツールの活用について示唆に富む意見が多く投稿されていました。普段からGitHub Copilotなどを使用している身として、この議論から得られた知見と、私自身の経験を共有したいと思います。

下記のような記事の書いています

https://qiita.com/yonaka15/items/794d3a7ee41537733f6c

https://note.com/yonaka15/n/nd76154758b61


## はじめに

最近のプログラミング環境では、AIツールの存在が当たり前になってきています。私の周りでも、GitHub Copilotやその他のAIコーディングアシスタントを日常的に使用している開発者が増えてきました。確かに開発の速度は上がりますが、同時に新たな課題も見えてきています。特に気になるのは、AIツールとの関わり方によって、私たち開発者の成長機会が大きく変わってくるという点です。

## AIツールとの付き合い方：代替から協働へ

AIツールとの付き合い方には、大きく分けて二つのアプローチがあると思っています。一つは「代替アプローチ」で、できるだけ多くの作業をAIに任せようとするもの。もう一つは「協働アプローチ」で、AIと人間が互いに学び合いながら成長していくというものです。

最初はAIに任せっきりにする代替アプローチに魅力を感じていたのですが, 実際に試してみると意外な落とし穴がありました。コードの品質が安定しない、予期せぬバグが発生する、そして何より、自分自身の技術力が伸びにくいという問題です。そこで今は、協働アプローチを意識的に実践しています。

## 実践的な活用モデル

私は、AIツールを以下のような形で活用しています：

### 支援型の活用

プログラミングの文脈で具体的に説明すると、たとえばテストコードを書く際のアプローチです：

```javascript
// まず人間が設計を考える
describe('UserAuthentication', () => {
  // AIに基本的なテストケースの生成を依頼
  test('should validate user credentials', () => {
    // AIが提案したテストケースを人間が確認・修正
  });
});
```

このアプローチでは、テストの設計は人間が行い、具体的なテストケースの実装をAIがサポートします。そして最終的なレビューと調整を人間が行うことで、品質を担保しています。

### 拡張型の活用

データ変換処理のような定型的なコードでは、このようなアプローチを取っています：

```javascript
// 人間が基本的な構造を定義
const transformUserData = (rawData) => {
  // AIに変換ロジックの提案を依頼
  const transformedData = {
    id: rawData.userId,
    displayName: `${rawData.firstName} ${rawData.lastName}`.trim(),
    email: rawData.userEmail.toLowerCase(),
    metadata: {
      createdAt: new Date(rawData.created).toISOString(),
      lastLogin: rawData.lastLoginDate || null
    }
  };
  
  // 人間が追加のバリデーションやビジネスロジックを実装
  validateUserData(transformedData);
  return transformedData;
};
```

## 効果的な活用のためのガイドライン

議論のなかで以下のようなガイドラインが提案されています：

### シニア開発者向けのアプローチ

AIツールを「アイデアの検証用プロトタイピングツール」として活用します。新しい機能の実装方法を考えるとき、まずAIに複数のアプローチを提案してもらい、それぞれの長所・短所を検討します。最終的な実装は必ず自分で行いますが、この過程で様々な実装パターンに触れることができ、技術の幅が広がります。

### 初学者向けのアプローチ

AIツールを「学習補助」として使うことを推奨しています。具体的には：

- AIが生成したコードを「なぜそうなるのか」理解することから始める
- 生成されたコードを手動で書き直してみる
- エラーメッセージの意味をAIに説明してもらい、デバッグの過程を学ぶ

## 品質管理とレビュープロセス

AIが生成したコードをレビューする際は、特に以下の点に注意を払っています：

### セキュリティとパフォーマンス

認証・認可のロジックや、データベースのクエリ最適化など、重要な部分はAIに任せきりにせず、必ず人間が詳細にレビューします。例えば：

```javascript
// AIが生成したクエリの例
const users = await db.query(
  'SELECT * FROM users WHERE status = ?', 
  [status]
);

// 人間が最適化したバージョン
const users = await db.query(
  'SELECT id, name, email FROM users WHERE status = ? LIMIT 100', 
  [status]
);
```

### コードの一貫性

プロジェクトの命名規則や設計パターンとの整合性を重視しています。AIは文脈を完全には理解できないので、ここは人間の判断が重要です。

## まとめ

AIツールは確かに強力な開発支援ツールですが、それを「代替」ではなく「協働」のパートナーとして活用することで、より大きな価値を生み出せると考えています。特に：

- AIと協働することで、私たち自身の技術力も向上させられる
- 適切な活用モデルを選択することで、品質と効率の両立が可能
- チーム全体の成長につながる使い方を意識する

という点を意識することで、AIツールをより効果的に活用できると考えています。

## 参考資料とリンク

GitHub公式のベストプラクティスガイド: https://docs.github.com/copilot/using-github-copilot/best-practices-for-using-github-copilot
Visual Studio CodeでのCopilot活用ガイド: https://code.visualstudio.com/docs/copilot/prompt-crafting

また、この記事のきっかけとなったRedditの議論（https://www.reddit.com/r/programming/comments/1i846fr/）も読んでみてください
Twilioで話した内容を書き起こしてみよう

# はじめに
備忘録2本目です。
今回はTwilioで購入した050番号宛に発信して、話した内容をGoogle chatのスペースに書き起こす処理を作っていきます。

# Google chatのスペース作成
Google Chat側の準備をしていきます。まずはスペースを作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946173/986e8a91-0418-8fc1-31c5-9512598c926f.png)

次にスペースのWebhookを作成します。アプリと統合から適当な名前を付けて2個作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946173/ddb01675-5a3e-829c-9452-3afdb22b3f11.png)

作成したら、縦三点リーダーをクリックして各WebhookのURLをコピーします。

# Twilio側の処理作成
スペースの準備が終わったらTwilio側の準備をしていきます。
最初にFunctionを使って処理を書いていきます。
baseURLには、先ほどコピーしたWebhookのURLを使用します。
```Node.js
exports.handler = async function(context, event, callback) {
  const axiosA = require('axios');
  const axiosB = require('axios');
  const instanceA = axiosA.create({
    baseURL:'Webhook1のURL',
    headers:{}
  });

 const instanceB = axiosB.create({
    baseURL:'Webhook2のURL',
    headers:{}
  });

  if(event.Track === 'outbound_track')
  {
    await instanceA.post('',{text:JSON.parse(event.TranscriptionData).transcript})
  }else{
    await instanceB.post('',{text:JSON.parse(event.TranscriptionData).transcript})
  }

  return callback(null);
};
```

Functionを作成し終わったら縦三点リーダーからFunctionのURLをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946173/097f63a6-0944-299e-16c6-7e71328e5034.png)

次にTwimlを作成していきます。statusCallbackUrlにはFunctionのURLを使用します。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Start>
    <Transcription statusCallbackUrl="FunctionのURL" track="both_tracks" name="test" languageCode="ja-JP"/>
  </Start>
  <Say voice="Google.ja-JP-Wavenet-C">始まります。</Say>
  <Pause length="60"/>
  <Say voice="Google.ja-JP-Wavenet-C">残り2分。</Say>
  <Pause length="60"/>
  <Say voice="Google.ja-JP-Wavenet-C">残り1分。</Say>
  <Pause length="60"/>
  <Say voice="Google.ja-JP-Wavenet-C">終了。</Say>
</Response>
```
Google CloudのText-to-Speechを利用して、Sayで囲まれた文字を音声化しています。ほかにも様々な種類の音声があるので、好きなものを選んでください。
https://cloud.google.com/text-to-speech/docs/voices?hl=ja

最後に処理を電話番号に紐づけます。
A call comes inはTwiml Binを選択し、作成したTwiml名を選んでセーブします。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946173/71801787-41b9-89a4-d2f6-6ad2b1015860.png)

以上で準備完了です。


# 動作確認
050番号に発信して、気象予報のニュースを聞かせましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946173/4e52aca8-7cc1-664b-c81f-6759e6c9e148.png)
ニュースの内容がスペースに書き起こされました。
Power Platform のソリューションをAzure DevOpsのGitでバージョンを管理する

# 1.PowerPlatformで新しいソリューションを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/bffc4e1b-a38a-a596-df2e-bb90465a8a10.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/d2cd5e2c-b208-3991-a214-794a1a49bec9.png)


# 参考サイト
https://www.geekfujiwara.com/tech/powerplatform/5617/
factory_botインスタンスを作成するコマンド

>### Build strategies
`build`、`create`、`attributes_for`そして`build_stubbed`という`factory_bot`はいくつかの異なるビルド戦略を持っています。
>factory_bot supports several different build strategies: build, create, attributes_for and build_stubbed:

```rb
# 保存されないUserモデルインスタンスを返します
# Returns a User instance that's not saved
user = build(:user)

# 保存されるUserインスタンスを返す
# Returns a saved User instance
user = create(:user)

# 例えばUserインスタンスをビルドするために使用する属性のハッシュを返します
# Returns a hash of attributes, which can be used to build a User instance for example
attrs = attributes_for(:user) # モデル名を入れることで構成する属性のハッシュが返される

# パターン一致割り当てとruby3.0のサポートで統合する
# Integrates with Ruby 3.0's support for pattern matching assignment
attributes_for(:user) => {email:, name:, **attrs} # **この部分で統合されるのだろう

# 定義されたすべての属性を消したオブジェクトが返ってくる
# Returns an object with all defined attributes stubbed out
stub = build_stubbed(:user)

# 上のメソッドのどれかにブロックを渡すことは以下のオブジェクトが返される
# Passing a block to any of the methods above will yield the return object
create(:user) do |user|
  user.posts.create(attributes_for(:post)) # ブロックでさらに複雑な生成ができるようだ
end
```
### `build_stubbed`と`Marshal.dump`
>build_stubbed and Marshal.dump

` build_stubbed`で作成されたオブジェクトは`Marshal.dump`でシリアライズ化されないことに注意して下さい。`factory_bot`はこれらのオブジェクトにシングルトンメソッドを定義しているからです
>Note that objects created with build_stubbed cannot be serialized with Marshal.dump, since factory_bot defines singleton methods on these objects.

https://thoughtbot.github.io/factory_bot/using-factories/build-strategies.html
# 感想
生成する際の手法を戦略敵にやるからストラテジーと呼ぶのかな
SymbolよりObjectの方が良い説

## Symbol等について
SymbolというのはJavaScriptにおいて常に一意のシンボルを生成できるやつで、カプセル化等ができたり、弱い情報隠蔽ができるそうです。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Symbol

Objectというのは、言うまでもないですかね...
様々なキー付きコレクションで複雑な状態を保存するやつです。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object

## 共通点
Symbolといえば常に一意のデータを取得できることですが、実はObjectも同じことができます。
```js
Symbol() == Symbol() //false
({}) == ({}) //false
```
ということで立場が逆転しSymbolは不要になりました。
## メリット
### 1. 文字数短縮
`Symbol()`と書かずに`({})`と書くだけで済みます。
### 2. 情報量を豊富にできる
Symbolは文字列のみしか持たせられないのに対し、Objectはなんでも保存できます。
例えばこのようにしたり。
```js
const symboly_obj = {
    type: "StateSymbol",
    at: "script.js, Root"
};
```
なんならこの中にオブジェクトを入れられます(当たり前体操定期)
### 3. ガーベージコレクションが使える(激アツ)
Objectはプリミティブ型じゃなく、参照されない場合自動で消えます。(これをガーベージコレクションと言います。)

例えばシンボルとデータ(Map)があるとします。
```ts
const symbolMap: Map<symbol, object> = new Map;
symbolMap.set(Symbol(), {data: "aaa"});
```
こんな感じのデータ。

しかしSymbolは常に一意のデータを返すので渡しまくらないとこのマップの中身にアクセスできません。
万が一(じゃないかも)Symbolを無くした場合、何もしなければ永遠にゴミが残りますToT
まあ`keys`を活用すれば消せないこともないけど面倒くさい...

**_そこでObject!!!!!_**

オブジェクトはWeakMapを使うことが出来ます！！！！
WeakMapはキーがオブジェクトのみで、そのオブジェクトがガーベージコレクションで消えたらそれに関連付けられたデータが一緒に消えます！！！！！
エコにデータを消せます！！！！！！！
いいね！！！！！

それにMapは取得の計算量が`O(n)`なのに対しWeakMapは`O(1)`で取得できます！！！！！！

#### デメリット
えー、WeakMap、WeakSetはキー・内容を列挙できません。
## 結論
- SymbolはObject(`({})` or `{}`)に入れ替えよう！
- 都合がよければ`WeakMap`・`WeakSet`を使おう！
before(:suite)はcofigureだけ

# RSpec configurationだけでしか`before(:suite)`フックは動作しない
すでに初期化されいる定数`StringIO::VERSION`。
`before(:suite)`フックは RSpec configurationオブジェクトだけサポートします。
exampleグループで登録されたこの`before(:suite)`フックは無視されるだろう
>*********/ warning: already initialized constant StringIO::VERSION
WARNING: `before(:suite)` hooks are only supported on the RSpec configuration object. This `before(:suite)` hook, registered on an example group, will be ignored. Called from *********.rb:5:in `block in <top (required)>'.

# `before`と`after`フックは実行するグループ内か`RSpec.configure`ブロックで定義する
`before`と`after`フックを直接実行するexampleグループまたはグローバルな`RSpec.configure`ブロックで定義できる。exampleの状態はフックには影響しない。
>before and after hooks can be defined directly in the example groups they should run in, or in a global RSpec.configure block. Note that the status of the example does not affect the hooks.

# `before(:suite)`はインスタンス変数を設定できない
インスタンス変数の設定は`before(:suite)`でサポートされていない
>WARNING: Setting instance variables are not supported in before(:suite).

https://rspec.info/features/3-13/rspec-core/hooks/before-and-after-hooks/#:~:text=before%20and%20after%20hooks%20can,supported%20in%20before(%3Asuite)
rex0220 計算式プラグイン テーブル期間計算

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、テーブルに2ヶ月ごとの期間を設定する例です。

# 概要

開始日と終了日で指定された期間を2ヶ月ごとに、テーブルに設定します。

- テーブル行数：　開始日と終了日から必要な行数を算出
- 期間開始日：　開始日と行番号から算出
    - 最小は、開始日
- 期間終了日：　終了日と機関開始日から算出
    - 最大は、終了日


![2025-01-24_17h33_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/feb42026-3578-b116-be55-fa80d693ada4.png)

# 計算式プラグイン設定

- テーブル：　開始日と終了日から月数/2を算出
- 期間開始日：　日付を秒数に変換して、TR_MAX で大きい方を取得
    - ※TR_MAX 関数は、行単位の最大値。MAX 関数は、テーブル全体の最大値
- 期間終了日：　日付を秒数に変換して、TR_MIN で小さい方を取得
    - ※TR_MIN 関数は、行単位の最小値。MAX 関数は、テーブル全体の最小値

![2025-01-24_17h41_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/bd4239e5-e709-87f4-c5d3-5e33fccc3fc0.png)

```.js
OPTION: 

// テーブル SUBTABLE
ROUNDUP(DATE_DIFF(
  DATE_ADD(開始日,-1,"month"),
  DATE_ENDOF(終了日,"month"),
  "months")/2
)

// テーブル.#:番号 NUMBER
ROWNO(テーブル)+1

// テーブル.期間開始日 DATE
TR_MAX(
  開始日,
  DATE_STARTOF(
    DATE_ADD(開始日,ROWNO(テーブル)*2,"month"),
    "month","X"
  )
)

// テーブル.期間終了日 DATE
TR_MIN(
  終了日,
  DATE_ENDOF(
    DATE_ADD(期間開始日,1,"month"),
    "month","X"
  )
)
```
統計検定1級　統計数理　2024　問4

![T4-P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/3afbff69-b885-2976-4aca-c716eb5323ea.jpeg)
![T4-P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/df856ecb-226d-193a-b790-2f837bdb2019.jpeg)
環境変数を簡単に管理！Node.jsでの`.env`ファイル活用ガイド


# 環境変数を簡単に管理！Node.jsでの`.env`ファイル活用ガイド

Node.jsプロジェクトで環境変数を管理する際、`.env`ファイルは非常に便利です。この記事では、`.env`ファイルの基本から実践的な使い方、注意点までを解説します。

---

## `.env`ファイルとは？

`.env`ファイルは、環境変数（Environment Variables）を記述して管理するためのファイルです。例えば、以下のような用途で使用されます：

- **APIキーやパスワードの管理**  
- **開発・テスト・本番環境ごとの設定切り替え**  
- **コードの可読性とセキュリティ向上**

---

## なぜ`.env`ファイルが必要？

### **1. セキュリティ向上**
APIキーや機密情報をソースコード内に直接書くと、リポジトリに含まれてしまうリスクがあります。`.env`ファイルを使うことで、これらを別途管理できます。

### **2. 環境ごとの柔軟な切り替え**
開発環境と本番環境で設定が異なる場合でも、`.env`ファイルを切り替えるだけで簡単に対応可能です。

### **3. 可読性向上**
設定をコードから分離することで、コードがシンプルになります。

---

## Node.jsでの`.env`ファイルの使い方

### 1. `.env`ファイルを作成する
まず、プロジェクトのルートディレクトリに`.env`ファイルを作成します。

```bash
touch .env
```

### 2. `.env`ファイルに環境変数を記述
以下のように、キーと値のペアで記述します。

```dotenv
# コメント行
API_KEY=your_api_key_here
DB_HOST=localhost
DB_PORT=5432
DEBUG=true
```

### 3. 必要なライブラリをインストール
Node.jsでは、`.env`ファイルを読み込むために[`dotenv`](https://github.com/motdotla/dotenv)ライブラリを使用します。

#### インストールコマンド
```bash
npm install dotenv
```

### 4. `.env`をコードで読み込む
以下のように、`dotenv`を使って環境変数を読み込みます。

#### 実装例
```javascript
// dotenvをインポートして使用
require('dotenv').config();

// .envファイルの値を取得
const apiKey = process.env.API_KEY;
const dbHost = process.env.DB_HOST;
const dbPort = process.env.DB_PORT;

console.log(`API_KEY: ${apiKey}`);
console.log(`DB_HOST: ${dbHost}`);
console.log(`DB_PORT: ${dbPort}`);
```

#### 実行結果
```bash
API_KEY: your_api_key_here
DB_HOST: localhost
DB_PORT: 5432
```

---

## `.env`ファイルを使う際の注意点

### **1. `.gitignore`に追加する**
`.env`ファイルをバージョン管理システム（Gitなど）に含めないように、`.gitignore`に以下を追加します。

```gitignore
.env
```

これにより、`.env`ファイルがリポジトリにコミットされるのを防ぎます。

### **2. 機密情報の暗号化も検討**
非常に重要な情報（例: クレジットカードAPIキー）は、`.env`に記載せず、よりセキュアな方法（例: クラウドの秘密管理サービス）を利用することを検討してください。

---

## 実践例: 簡単なExpressアプリでの`.env`活用

以下は、Expressアプリケーションで`.env`を使用する例です。

### ファイル構成

```
my_express_app/
├── app.js
├── .env
└── package.json
```

#### `.env`

```dotenv
PORT=3000
API_KEY=supersecretapikey123
```

#### `app.js`

```javascript
require('dotenv').config();
const express = require('express');

const app = express();
const port = process.env.PORT || 3000;
const apiKey = process.env.API_KEY;

app.get('/', (req, res) => {
  res.send(`Your API Key is: ${apiKey}`);
});

app.listen(port, () => {
  console.log(`Server is running on http://localhost:${port}`);
});
```

#### 実行コマンド

```bash
node app.js
```

#### 実行結果
ブラウザで `http://localhost:3000` にアクセスすると、以下のように表示されます。

```
Your API Key is: supersecretapikey123
```

---

## `.env`ファイルの活用で開発を効率化！

- 機密情報や設定を管理するのに`.env`ファイルは最適です。
- `dotenv`ライブラリを使えば、Node.jsプロジェクトで簡単に環境変数を読み込めます。
- `.env`ファイルを使う際は、必ず`.gitignore`に追加して公開されないように注意しましょう。

ぜひ、あなたのNode.jsプロジェクトで`.env`ファイルを活用してみてください！
動画編集初心者が陥りがちな失敗とAIで解決する方法

はじめに
動画編集を始めたばかりの初心者が直面する失敗は少なくありません。
「操作が複雑」「どのエフェクトを選べばいいかわからない」「効率的に作業が進まない」など、多くの悩みが存在します。
しかし、AIツールを活用することで、こうした問題を簡単に解決できるようになるんです！。
本記事では、初心者が陥りがちな失敗と、それをAIでどのように解決できるのかをわかりやすく解説していきます。

初心者が陥りがちな動画編集の失敗例
初心者が陥りがちな動画編集の失敗には、いくつかの種類があります。
まずは、カット編集で時間がかかるという点です。
初心者にとって、不要な部分を削るカット編集は意外と時間と手間がかかる作業です。
そのため、どの部分を残し、どの部分を削るべきか判断に迷うことが多く、効率が悪くなりがちです。
次に、色調補正が難しいという点が挙げられます。
色調補正は、動画全体の雰囲気や印象を大きく左右します。
しかし、適切な明るさやコントラストを調整するのは初心者にはハードルが高い作業です。
また、テロップや字幕の配置が不自然という点も挙げられます。
テロップや字幕は視認性が重要ですが、配置やフォント選びで失敗すると視聴者にとって読みづらくなります。
また、動画全体のデザイン性を損なう場合もあります。
最後に、エフェクトの使いすぎという点が挙げられます・
「多くのエフェクトを使えばプロっぽく見える」という風に考え、過剰にエフェクトを使ってしまうことで、逆に視聴者にとって見にくい動画になってしまうケースがあります。

AIが解決する初心者の悩みとおすすめのツール
AIツールを利用することで解決する動画編集初心者の方の悩みは複数あります。
まずは自動カット編集で動画編集を効率化できるという点が挙げられます。
AI搭載の編集ツールは、自動で重要な場面を検出し、不要な部分をカットしてくれます。
たとえば「Adobe Premiere Pro」のAuto Reframe機能や「Runway」のシーン検出ツールを使えば、初心者でもプロ並みの編集が可能です。
さらに、AIによる自動色調補正が挙げられます。
色調補正が苦手な場合でも、AIは動画全体を分析し、最適な明るさやコントラストを自動調整します。
特に「DaVinci Resolve」のAIカラーマッチ機能は、複数のクリップを一貫したトーンに仕上げるのに最適です。
次に、字幕やテロップの自動生成が挙げられます。
AI字幕ツールを活用すれば、音声を自動でテキスト化し、字幕を生成することができます。
「VEED.io」や「Otter.ai」などのAIツールを使うと、音声認識精度が高く、初心者でもスムーズに字幕を追加可能です。
また、視認性を考慮したフォントや配置もAIが提案してくれます。
最後に、エフェクトの最適化が挙げられます。
AIは、視聴者にとって心地よいバランスのエフェクトを提案します。
たとえば、「Final Cut Pro」のスマートエフェクト機能では、動画のテーマやスタイルに合ったエフェクトを自動的に適用することができます。

AIで効率的にスキルアップするコツ
AIで効率的にスキルアップするコツとして、まずは無料ツールを試してみることが挙げられます。
「Runway」や「VEED.io」などの無料プランを活用し、自分に合ったツールを探してみましょう。
次に、チュートリアルを活用してみましょう。
多くのAIツールは公式サイトやYouTubeで使い方ガイドを公開しています。
これを見ながら操作を覚える効率的に動画編集を進めることができます。
最後に、まずはシンプルな編集から始めることが重要です。
最初はカット編集や字幕追加など基本的な作業にAIを使い、徐々に高度な編集に挑戦しましょう。

まとめ
動画編集初心者が陥りがちな失敗も、AIツールを活用すれば効率的に解決することができます。
特に自動カット編集や色調補正、字幕生成といった機能は初心者にとって強い味方です。
そこで、最初は無料ツールを試し、少しずつ編集スキルを磨いていきましょう。

おわりに
いかがでしたでしょうか？
本記事でご紹介したツールのほかにも、UniFabオールインワンがおすすめのツールとして挙げられます。
UniFabオールインワンはたった１本のソフトをダウンロードするだけで動画高画質化、ノイズ除去、手ぶれ補正、SDR動画をHDRに変換する機能など、動画編集に役立つ機能をすべて利用することができます。
AI動画編集ツールに興味を持たれた方は、ぜひ公式サイトから概要をチェックしてみてくださいね！
Komo.aiを使用したタスク管理について

# はじめに
グループDです。
今回はエンジニアやプログラマーが抱えがちな悩み
「**プロジェクトの遅延とタスク管理**」について
Komo.aiを活用し、どのように解決させるのか書いてみました。

https://komo.ai/

# Komo.aiとは
AIを活用した検索エンジンで即座に信頼性の高い情報を提供してくれます。主な機能は以下の3点。

・**チャット**
特定のトピックについて深く掘り下げたり、ディスカッションを行うことも可能。

・**検索**
広範なデータベースから情報を取得し、正確で関連性のある結果を提供してくれる。
ユーザは多様なトピックに関する詳細な情報を迅速に取得できる。

・**エクスプロア**
コミュニティで話題になっている最新ニュースを閲覧。複雑な概念の解説等を得ることができる。

# 本題
ここからはこのKomo.aiを使って、成果物を期限通りに出すシナリオの具体例を示し、「**プロジェクトの遅延対策とタスク管理**」について役立つポイントを教えてもらいました。
今回は複数のタスクを用意し、タスクの優先順位とその理由について書いてもらうことにしました。

Komo.aiに以下を入力します。
```
あなたのチームは、新規バージョンをリリース予定で、リリース日は12日後に迫っています。タスク優先度と理由を述べてください。以下は主なタスクです。

1.バグ修正
・ログイン画面のデザイン不備(お客さんからの注意)
・1機能でタイムアウトエラー発生(お客さんからクレームあり)
・ユーザ情報更新時にDBエラーが発覚(単体テスト時に発覚)

2.新機能開発
・ユーザープロフィールにアイコンをセットできるようにしたい(お客さんからの期待度大)
・アプリ起動時にポップアップメッセージを表示させたい(お客さんからの期待度小)
・テストケースの作成＆追加(テストケース不十分)

3.既存機能の変更
・新規ユーザー登録時にメンバー全体に通知が行くようにしたい(短時間でいけそう)
・ユーザー情報変更時に履歴が見れるようにしたい(別機能で実装済み)
・削除したユーザー情報を復活できるようにしたい(長時間必要)

4.ドキュメント作成
・ユーザ向けの仕様解説書作成(リリース4日前には完成させたい)
・開発者向けの設計書更新(リリース後でも可)
・ユーザ向けのFAQ作成(リリース2日前には完成させたい)
```

Komo.aiからの返答は以下になります。


|タスク名|優先度|理由|
|:-|:-|:-|
|1機能でタイムアウトエラー発生|高|顧客からのクレームがあり、ユーザ体験に直接影響するため、即時対応が必要です。|
ログイン画面のデザイン不備|高|顧客からの注意があり、アプリの第一印象にかかわるため、早急に修正が必要です。|
ユーザー情報更新時にDBエラーが発覚|中|単体テストで発覚した問題であり、ユーザのデータ管理に影響を及ぼすため、優先的に解決すべきです。|
ユーザプロフィールにアイコンをセットできるようにしたい|中|顧客からの期待度が高く、ユーザーエンゲージメントを向上させるために、リリース前に実装したいです。|
ユーザー向けの仕様書解説書作成|中|リリース4日前には完成させる必要があり、ユーザへの情報提供に重要です。|
ユーザー向けのFAQ作成|中|リリース2日前に完成させる必要があり、ユーザーサポートの向上に寄与します。|
新規ユーザー登録時にメンバー全体に通知が行くようにしたい|中|短時間で実装可能であり、チームのコミュニケーションを改善するため、早めに対応します。|
テストケースの作成＆追加|低|テストケースが不十分ですが、リリース後でも対応可能なため、優先度は低めです。|
アプリ起動時にポップアップメッセージを表示させたい|低|顧客からの期待度が小さく、他の重要なタスクに比べて優先度は低いです。|
ユーザー情報変更時に履歴が見れるようにしたい|低|別機能で実装済みのため、優先度は低いですが将来的に完全の余地があります。|
削除したユーザ情報を復活できるようにしたい|低|長時間必要であり、リリース後の対応が必要です。|
開発者向けの設計書更新|低|リリース後でも対応可能で、優先度は低いです。

この優先順位に基づき、リリースまでの12日間でタスクを効率的に進めることが重要です。

# 得られた回答で分かるタスク管理のポイント
・顧客からのクレームがあるものは最優先
・顧客からの期待度が優先される
・リリース日前に終わらせるべきものは期間が短いものから
・別機能で実装されたものは新規開発ではないため、優先度は低い
・リリース後でも対応可能なタスクは後回し

本題は以上とします。

# 最後に
今回の目的は生成AIを活用して、エンジニアやプログラマーが抱えがちな悩みである
「**プロジェクトの遅延とタスク管理**」について具体例を交えつつ優先度のポイントを教えてもらいました。
生成AIについて触れることがあまりなかったので個人的には良い刺激になったかと思います。以上、グループDでした。
生成AIを使って業務改善できるのかやってみた(Google Gemini編)


こんにちは！エンジニアのCです:penguin:
今回は社内で生成AIについての勉強会があり
チームで業務課題を洗い出し
生成AIを使って改善できるのか検証してみました！


## 業務課題
あるPOSレジシステムの操作マニュアルが分かりにくいので
更新・改善したいが、作業時間が膨大になってしまう。
その為生成AIを使用して時短したい。


## 使用ツール・選定理由

**Google Gemini**

https://gemini.google.com/?hl=ja

【選定理由】
・システムのマニュアルという常に時代に合わせたアップデートが必要になるものの作成において、Googleの最新かつ高精度な検索結果を学習データとして使用している強みがあること。
 
・画像、音声、動画等、複数のデータを処理できるマルチモーダル生成AIかつ、Googleの他のサービスとのシームレスな連携が可能なため、今後、YouTube動画でのマニュアルを作成する等、様々な選択肢を視野に入れることが可能になると思ったため。


## 実践結果

#### ●Aさんの場合
元のマニュアルを読み込ませ、
初めて使用する人を対象にマニュアルの訂正をお願いしました。

【改善前】
![【元マニュアル】第一章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/d3387054-d3f4-d33a-8477-271c9ef83fab.png)


【改善後】
![【改善後】第一章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/644c8b88-5190-2b01-b6a0-de42051c3a74.png)


---
#### ●Bさんの場合
元のマニュアルを段落ごとに分け
「綺麗な文章に作り替えて」という指示で作成しました。
意識した点は、～です～ます等の語尾の統一、丁寧な文章へ作り替えを指示。
「またPOSレジ画面のイメージ図を作成して」という指示で画像生成も行いました。

【改善前】
![【元マニュアル】第二章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/98a6eb20-9e83-2654-ff17-a419d79a38b2.png)


【改善後】
![【改善後】第二章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/ff8fe93f-e044-68bd-bce1-264fc7925749.png)



---
#### ●Cさんの場合
元のPDFを画像にした上で改良しました。
与えた指示は下記の通りです。
```
この画像のマニュアルを初めて見る方にもわかりやすいように
・重要な部分や見出しは色や強調を使う
・不要な情報は削る
上記を踏まえて見やすくしてください
他にも気をつけるべき箇所があれば改善してください
マークダウン記法で出力してください
```
また他に改善できることはあるかと質問した際に「フローチャートを載せるのはどうか？」と提案されたので、PlantUMLで出力しました。

【改善前】
![【元マニュアル】第三章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/00b59ea8-5992-def5-78ed-83dfe186f333.png)



【改善後】
![【改善後_01】第三章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/75d03bfc-b1d2-da17-53b1-5a885cdb31dd.png)

![【改善後_02】第三章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/1d0d9a9a-5b9c-29ef-cd5f-1e6dd061904e.png)





---
#### ●Dさんの場合
元マニュアルのファイルを選択し、「この操作マニュアルを改善したい」というプロンプトからスタート。
FAQの充実という部分は元のマニュアルに足りていないところと感じ、「この章の内容でFAQを充実させたい」とアイデアを求めました。
また、「より見やすくするアイデア」を求め、見出しのレイアウトやカラーを改善。
製品の画像をアップロードし、「POSレジの操作マニュアル作成において特筆すべき内容をこの画像を参照して作成」と求めました。

【改善前】
![【元マニュアル】第四章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/4d687023-ea3a-1060-307e-300c805208eb.png)




【改善後】
![【改善後】第四章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/2655edda-765e-e7a8-91d7-1400bebf264c.png)


【使用例】
![【スクショ02】第四章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/9e7ce753-ec12-4748-7d21-796c175b4984.png)





## 感想
実際にGoogle Geminiを使用してみて
メリットとデメリットをまとめてみました。

**メリット**
・無料でもそれなりに活用できる(お試しするには十分)
・マルチモーダルAIとして画像認識に強い 
・結果として画像出力もできる
・その他のGoogle関連のサービスとの連携が容易(ただし基本的には有料プラン)

**デメリット**
・Geminiに出す指示は、他の生成AIサービスと比べて明確な指示が必要であると感じた
・セキュリティ面の担保のためには有料で利用する必要


## まとめ
Google Geminiは無料かつ比較的使いやすいため
生成AIを使ったことがない人でもとっかかりやすいのでオススメです:thumbsup:


※おまけとして勉強会で使用したプレゼン資料をおいておきます。
こちらも生成AI(Prezi AI)を使用して作成しました:sparkles:

https://prezi.com/view/JA1RWIIGnJ9MMB2b7vnb/


以上、Cでした:penguin:
好きなYoutubeチャンネルの最新動画を埋め込む方法

# はじめに
私はNotionを使う上で、好きなチャンネルの最新動画を表示させるページを作りたいなと思いました。理由は、Youtubeを開いて動画を見ると、次々に表示される面白いコンテンツを回遊してしまい、時間を取られてしまう事が大きかったからです。

せっかくNotionで自分のタスクを管理できるようになったのに、娯楽の時間(Youtubeを見る時間)を管理できていないな？と感じたため、**自分の好きなチャンネルの動画のみの最新動画を表示させるページがあったらないいな**と思いました。ただ、普通にYoutubeの動画のリンクをコピペしても、その動画が埋め込まれるだけで、最新の動画が投稿されても、その埋め込みは更新されません。

そこで、私はLVMFCという**Youtubeの最新動画を自動的に表示してくれるページ**を作成しました！そこでは、**URLを少しいじって埋め込む**だけでページを開くたびに常に最新動画が表示される様になります！

ここからの記事は、**Notionのみならず自身のブログなどにYoutubeの最新動画を埋め込む方法としても使える**ので、最後まで見ていってください！

# 埋め込み方法(忙しい方向け)
```txt:埋め込みURL
https://www.youtube.com/embed?listType=search&list=[先頭2文字をUUにしたチャンネルID]
```
これを埋め込むだけです！

# 埋め込み方法(じっくり解説)
今回は私の最推しである、える/Elu【にじさんじ】の最新動画を埋め込む方法を解説します！▽(是非動画や配信を見てみて！)
https://www.youtube.com/@Elu

## 1. チャンネル名の下にある"more"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727019/e8196696-224e-b0f7-0d25-0b91c92be4ec.png)

## 2. 下にスクロールして、"Share channel"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727019/ba0af1fa-40f6-640a-bfb4-6a7ddc2614d1.png)

## 3. "Copy Channel ID"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727019/e00fa300-01af-7fce-ba31-309a181f9090.png)
これで、最新動画を埋め込みたいYoutubeチャンネルのチャンネルIDを取得する事ができます！

## 4. 先ほどの埋め込みURLに入れて、"list=UU"に変える
```txt:埋め込みURL
https://www.youtube.com/embed?listType=search&list=UUYKP16oMX9KKPbrNgo_Kgag
```
:::note warn
警告
※先頭二文字をUCからUUに変えるのを忘れずに！
:::

ここまでで作成したURLを埋め込む事で、常に埋め込み動画は最新のものが表示されるようになります！

# ここからはLVMFCのお話
LVMFCは私の造語で、Latest Videos from My Favorite Channelsの略になります！要は、好きなチャンネルの最新動画を表示するページになります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727019/bf6bf9a0-ee40-3540-599c-900631bf24b9.png)
※2024/10/9時点でのLVMFCのスクショ

おそらく、私のテンプレのリンクへ飛ぶと、違う動画が表示されていると思います！これは、最新の動画を自動で取得して表示してるからです！▽

https://organized-shrine-897.notion.site/LVMFC-Latest-Videos-from-My-Favorite-Channels-11894061fe248082910dd83951eb3748

モニターの大きさや画面の倍率によりますが、6つぐらいがスクロールしなくて良いので最適だと思います！

動画を再生する際は、**動画にカーソルを合わせ、右上の｢↗｣マークを押せば大画面で動画が流れる**ようになります！

**本当に自分の好きなチャンネルの更新だけをチェックできる**ので、**ついつい他の動画を見る事も無くなる**事は、大きなメリットだと思います！

是非使って見てください！

## お持ちのNotionページに埋め込む場合
埋め込みたい位置に
```txt:埋め込み方
/emb
```
と入力して先ほど作成したURLを埋め込むだけで完了です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727019/4d5f1250-82d4-eef8-7012-50dc2a844c02.png)

# 終わりに
もっとNotionの面白い使い方を探求したいな🐰

# 参考
https://techmemo.biz/web-cheat-sheet/youtube-channel-latest-embed/
https://developers.google.com/youtube/player_parameters?hl=ja#Manual_IFrame_Embeds
タスク管理を効率化出来るAIを調べてみた（Backlog、Notion、ClickUp）

こんにちは、Aです。
今回は「スケジュール管理におけるAIサービスの利用」という点で活用できそうなサービスの一部を調べてみました。
スケジュール管理に活用するアイデアと、それぞれのメリット・デメリットを解説します。

## 概要
この記事では以下のAIサービスに関しての説明します。
#### Backlog(https://backlog.com/ja/)
#### Notion(https://www.notion.com/ja)
#### ClickUp(https://clickup.com/)

## 各サービスの活用例
## 1. Backlogでのスケジュール管理

### 活用アイデア
- **課題（タスク）の要約** 
 AIにタスクの内容とそれに関連するコメントを分析させ、重要なポイントをまとめた要約を生成
- **課題の検索・整理** 
 AIに質問をすることで、タスク管理ツールに記録されたデータをもとにした回答
- **資料（Wiki）からの情報抽出・要約** 
 AIに質問するとWiki内の該当情報を検索し、要点を抽出して提供
- **ドキュメント作成** 
 プロジェクトの進捗状況や課題リストのデータをもとに、AIが構造化された報告書を生成

## 2. Notionでのスケジュール管理
### 活用アイデア
- **文章の添削や校正** 
 誤字脱字やつづりのミスをAIによるチェックで短時間で修正可能
- **文章の要約** 
 長文の資料やWebサイトの記事をAIによる要約を生成
- **アイデア出し** 
 Notion AIのブレインストーミング機能を利用することでキーワードやテーマを投げるだけで、アイデアを提案

## 3. ClickUpでのスケジュール管理
### 活用アイデア
- **プロジェクト管理の簡素化** 
 プロジェクトのワークフローや振り返りの作成、新規プロジェクトのスケジューリングなどの自動化が可能
- **ミーティングやチャットのスレッドを要約** 
 タスクの更新、タスクのアクティビティ、タスクのコメントスレッド全体にわたる簡潔な情報が生成
- **スケジューリングとタイムライン管理** 
 タスクの所要時間、最適な担当者、最も効率的な実行順序を分析することで、プロジェクトのタイムラインを最適化

## 各サービスのメリット・デメリット
### Backlog
#### メリット
 - *ガントチャート機能で全体像を把握可能*
  チーム全体のスケジュールを視覚的に把握できる。
- *プロジェクト管理特化* 
  複数プロジェクトを横断的に管理できる機能が豊富。
- *日本語対応* 
  国内企業向けのツールとして、日本語で使いやすいUI。
#### デメリット
- *柔軟性に欠ける*
  プロジェクト管理に特化している分、個人の細かいスケジュール管理には向いていない。
- *初期学習コスト*
  ガントチャートや詳細な機能を使いこなすには慣れが必要。
### Notion
#### メリット
- *柔軟性が高い*
  タスク管理以外にもナレッジ管理やドキュメント作成に活用可能。
- *シンプルなUI* 
  データベースやカレンダーをドラッグ&ドロップで操作可能。
- *コラボレーション機能が豊富* 
  コメントやリアルタイム編集機能でチームメンバーとスムーズに連携。
#### デメリット
- **高機能ゆえの設定の手間** 
  自由度が高い反面、使い始める際に時間がかかる。
- **依存リスク** 
  重要なデータを一箇所に集約するとサービス停止時の影響が大きい。
### ClickUp
#### メリット
- *タイムトラッキングに特化* 
  タスクごとの正確な時間管理が可能。
- *データ分析機能が豊富* 
  生産性の向上やリソース配分の見直しに役立つ。
- *シンプルで直感的な操作** 
  スケジュール管理に特化したシンプルなUI。
#### デメリット
- *プロジェクト全体の管理には不向き*
  個々のタスクや時間管理に特化しているため、プロジェクトの全体像を把握しづらい。
- *多機能ツールとの連携が難しい* 
  他のツールとの連携が少ない場合がある。
- *日本語対応していない*
　AIへの質問は日本語で可能だが、基本言語は英語。 

## 各サービスの活用例
### Backlog
- *AI要約により要点の把握やスケジュール調整を容易に*
![ai-summary-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/8b5f9d39-3a04-15c9-918a-995973ad1c9b.png)

### Notion
- *スケジュールを文字列で期限などを記載しNotionAIにガントチャートにしてと依頼するだけでチャートの生成が可能*
![20230301135706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/312b6b85-dbee-699f-3dec-94c1189dafac.png)

### ClickUp
- *タスクの進捗確認などをAI補助によって簡易的に確認*
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/f5694b04-fe36-5d70-d343-09f736d2c014.png)
 
## 結論
- **プロジェクト全体を見渡したい場合**: **Backlog**が最適。
 ガントチャートやファイル共有、Wikiの整備など
- **柔軟性と統合力を重視する場合**: **Notion**を活用。
任意のアプリと連携可能でPDFや画像から解析したデータを利用可能
- **時間管理や生産性向上に特化したい場合**: **Clockup**が効果的。
AIに問いかけるだけで管理者はかんたんにタスクの進捗状況を確認可能

利用する目的やチームの規模、業務スタイルに応じてツールを使い分けることで、より効率的なスケジュール管理を実現できます。
以上、Aでした。
押したパネルの色を変更する

今回はパネルを押すと色を変える方法について書かせていただきます。

まずは`Galleryコントロール（縦でも横でも可）を配置して折り返しを5`とします。
`Itemプロパティ`にはおなじみの`Sequence`を利用して
```
Sequence(25)
```
としてテンプレートに`Labelコントロール`を配置、大きさをマス目いっぱいにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/12094612-ebad-d950-2551-5d6bbb3f87d9.png)

そして`Labelコントロール`の`OnSelectプロパティ`に
```
UpdateContext({locPush:ThisItem.Value})
```
と記述して

`Labelコントロール`の`Fillプロパティ`には適当に
```
If(locPush=ThisItem.Value,RGBA(253,222,207,0.5),RGBA(0, 0, 0, 0))
```
と記述することで
パネルを押すと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/75954b3d-9b58-363f-fedd-fe159d0b0014.png)
こんな感じになる。

これをうまく利用してGalleryの後ろに絵を持ってくることで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/14dd75f1-b065-7188-8837-bae014db9d3f.png)
このようなＫＹアプリを作成することができる！
【TryHackMe】Dig Dug：Walkthrough

# 概要

TryHackMe「Dig Dug」のWalkthroughです。

https://tryhackme.com/r/room/digdug

# Task1

## **Q1**.*Retrieve the flag from the DNS server!*

DNSサーバーとしてターゲットマシンを指定し、DNSへリクエストを送信するとTXTレコードからフラグを入手できました。

```
$ dig @10.10.33.97 givemetheflag.com

; <<>> DiG 9.19.19-1-Debian <<>> @10.10.33.97 givemetheflag.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45094
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;givemetheflag.com.             IN      A

;; ANSWER SECTION:
givemetheflag.com.      0       IN      TXT     "flag{0767ccd06e79853318f25aeb08ff83e2}"

;; Query time: 239 msec
;; SERVER: 10.10.33.97#53(10.10.33.97) (UDP)
;; WHEN: Fri Jan 24 03:01:36 EST 2025
;; MSG SIZE  rcvd: 86
```

**A**.**flag{0767ccd06e79853318f25aeb08ff83e2}**
App EngineのファイアウォールとIdentity-Aware ProxyによるIPアクセス制御の違い

## はじめに
App EngineのファイアウォールとIdentity-Aware Proxy (IAP) のアクセス制御リスト (ACL) は、どちらも送信元IPアドレスのアクセス制御を提供しますが、結局どの場合にどっちを使った方が良いんだろう？ということが分からなかったので整理してみました。

以下にそれぞれの特徴と違いを説明します。

### App Engineのファイアウォール
1. **役割**:
   - App Engineのファイアウォールは、アプリケーションへの外部からのトラフィックを制御します。
   - IPアドレスやCIDR範囲に基づいてアクセスを許可または拒否できます。

3. **適用範囲**:
   - ルールはApp Engineアプリケーション全体に適用されます。
   - すべてのリクエストに対して適用され、アプリケーションのエントリーポイントでフィルタリングされます。

4. **例**:
   - 特定のIPアドレスからのアクセスのみを許可する。
   - 特定のIPアドレス範囲からのアクセスを拒否する。

### Identity-Aware Proxy (IAP) のACL
1. **役割**:
   - IAPは、Google Cloud上のアプリケーションやリソースへのアクセスを認証および認可します。
   - ユーザーのアイデンティティに基づいてリソースへのアクセスを制御します。

3. **適用範囲**:
   - IAPは、HTTP(S)ロードバランサを介してアクセスされるアプリケーションやリソースに適用されます。
   - アプリケーションの個々のパスやエンドポイントに対して細かい制御が可能です。

4. **例**:
   - 特定のGoogleアカウントを持つユーザーのみがアクセスできるようにする。
   - 特定のGoogleグループのメンバーのみがアクセスできるようにする。

:point_right:設定方法：

https://qiita.com/___knm___/items/3d6f4c6a64f196006989


### 結論
- **App Engineのファイアウォール**はIPアドレスに基づいてアプリケーション全体へのアクセスを制御します。
- **IAPのACL**はユーザーやグループのアイデンティティに基づいて、HTTP(S)ロードバランサ経由のアクセスを制御します。

よりユーザーレベルで柔軟にアクセス制御したい場合やIPアドレス以外の制御もしたい場合はApp Engine、全てのユーザーに対してIPアドレスのみをしたい場合はファイアウォールを適用すると良いのかなと思います。

### 参考サイト
https://cloud.google.com/appengine/docs/flexible/understanding-firewalls?hl=ja

https://qiita.com/hirosait/items/5269f52dbea44dabc402

https://cloud.google.com/iap/docs/enabling-app-engine?hl=ja

https://cloud.google.com/beyondcorp-enterprise/docs/securing-app-engine?hl=ja
TwilioでAPI Keyを作成、SMSを送信

# はじめに
諸事情により、記事を公開するアカウントを変更しました。
自分が手順を忘れないように、備忘録として取りまとめます。
今後は不定期的にTwilio関連、その他諸々の記事を更新していこうかなと思っています。


# Twilio API Keyの作成方法
まずはAPI Keyを作成します。
Account trust hubへ移動し、API keys&tokensを開きます。
![スクリーンショット 2025-01-16 10.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946173/2672bbe4-8e73-ae51-46be-7958e8d357d9.png)
![スクリーンショット 2025-01-16 10.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946173/3d234d3b-1236-4c13-0de4-d78498021d2d.png)


Create API keyから作成して、SIDとSecret keyをコピーしてメモか何かに保存します。

![スクリーンショット 2025-01-16 10.47.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946173/d5d5d030-3d5c-722b-9508-cdc519fcd3b0.png)
![スクリーンショット 2025-01-16 10.49.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946173/2a5269bb-9d2c-59fc-de34-f19ea2903328.png)

Secret keyは後から参照不可能なので、必ずコピーしておきましょう。
あとは作成したSIDとSecret keyを利用してSMS送信します。

```Node.js
const twilio = require("twilio"); 
const accountSid = 'TwilioのアカウントSID。ACから始まる文字列';
const apiKey = 'コピーしたAPI Key作成時のSID。SKから始まる文字列';
const apiSecret = 'コピーしたSecret';
const  client  = twilio (apiKey,apiSecret,{ accountSid: accountSid });

client.messages
  .create({
    body: 'これはテストです。Twilioをよろしくお願いします。',
    to: '送り先の電話番号',
    messagingServiceSid: 'MGから始まる文字列',
  })
  .then(message => console.log(message.sid));
```

# 参考サイト
SMS送信方法
https://www.twilio.com/docs/messaging

API Key作成方法、使い方
https://www.twilio.com/docs/iam/api-keys