OmniAICreator/Qiita-1.07M huggingface dataset:
LT初挑戦からわかったこと

お疲れさまです、みやもとです。

今年は初めてLTに挑戦して以降、計5回登壇した年になりました。
以前の記事に書いた通り人見知りのあがり症なので勇気のいることではありましたが、挑戦してみた感想やわかったことを書いてみようと思います。

# LT参加したイベント

まず最初に参加したのがLINE Developers Communityのオンラインイベントでした。

https://linedevelopercommunity.connpass.com/event/311378/

直前にLINEBOTに関する記事を書いたりLINE Developers Communityのオフラインイベントに参加したりしていたからか、何かしゃべりません？とお誘いいただいたのがきっかけです。
オンラインだし顔を出さなくて良さそうということで参加しました。
正直なところ緊張はしましたし上手く話せたとも思えませんでしたが、無事に終えられてすごくほっとしたのを覚えています。

そこからしばらくは聞き専でイベント参加していたのですが、半年ほどしてHACK.BARの勉強会で初めてオフラインの登壇に挑戦。

https://hackbar.connpass.com/event/328565/

挑戦できたのは主催のお店の方とある程度顔なじみになっていたこと、参加人数がそれほど多くなかったことが大きいです。
過去に経験したCOBOLに関する話をしたら思ったより反応が良かったので、ここでちょっと調子に乗ったかもしれません。

そのあと３連チャンでCOBOLをネタにしてLT登壇しました。

https://genki-dev.connpass.com/event/332623/

https://kobe-sannomiya-dev.connpass.com/event/332096/

https://hackbar.connpass.com/event/335859/

本当は最初の１回で終わる予定だったのですが、あれこれ書いているうちに1回でしゃべり切れない量になってしまって分割しました。
喋れなかった部分をお蔵入りにするのもなんかもったいないな…せっかく書いたし…で全部話すまでは登壇しよう！となった結果が3か月連続登壇。
しばらくは登壇いいや、という感想になりました。

# やってみてわかったこと
ここからはLT登壇してわかったことを簡単に。

## 見やすいスライドを作るのって難しい
登壇が決まってほぼ間違いなく必要になるのがスライド作り。
いざ作ろうと思うと結構悩むことになりました。

何をしゃべりたいか、テーマに関する下調べもなのですが<b>どんなスライドが見やすいか？というのが自分ではいまいちわからない。</b>
文章を必要最低限に抑えてイラストを多めにする方がいいのか、喋る内容をある程度しっかり書いた方がいいのか。
ある程度好みで分かれるとはいえ、なるべくなら見やすいものにしたいと思うとああでもないこうでもないと頭を抱えることになります。
私は書いてないことをしゃべろうと思うと頭が真っ白になって自滅するタイプなので、ほぼ表示内容＝LT内容になる文字の多いスライドを作っているのですが、字がみっちり詰まったスライドはたぶん見ていて面白いものではないな…と思います。

ちなみにスライド関連で使っているのは以下です。

### Googleスライド
たぶんおなじみのオンラインプレゼンテーション作成ツール。
[Canva](https://www.canva.com/)も使ってみようと試みましたがどうにも機能を使いこなせずほったらかしになっています。
文章とちょっとしたアニメーションぐらいなら十分。

https://docs.google.com/presentation/

### いらすとや
説明不要のフリー素材ですね。
文章の隙間にちょっとツッコミを入れたりするのに使わせてもらっています。

### Napkin.ai
文章からそれに合うプレゼンテーション用イラストを生成してくれるAIサービスです。
いらすとやだとしっくりこない内容とか、文章の補足をしたいけど字で書くと長いな…というようなところで対象の部分をコピペしてイラスト生成することが多いです。

https://www.napkin.ai/

### ドクセル
ドキュメント共有サービスです。
Compassの資料はGoogleスライド不可なのを知って慌てて登録しました。
イベントが終わった後、使ったスライドをPDF化して共有するのに使っています。
PDF化するため、アニメーションを入れたところはスライドコピーしてアニメーション前・アニメーション後のページに分けてから変換してます。

https://www.docswell.com/

## 案外やさしく聞いてもらえる
恥ずかしながら<b>登壇＝「素人質問で恐縮ですが」みたいなプロ質問に答えなければならない</b>のでは…と恐怖していたのですが、存外みなさまやさしく聞いてくださってました。
たまに答えにくい質問があっても、正直に「ちょっとはっきりしたことはわからなくて…」と前置きした上で自分の思うところを伝えていれば問題なく済みました。
済んでたと思います。

## 登壇したこと自体がネタになる
オフラインイベントだと特に登壇後に声をかけていただいたり、交流パートで話を振ってもらえたりしました。
勉強会で知り合った方が「登壇することで交流のきっかけができるからどんどん登壇するのが良い」とおっしゃっていたのを実感した形です。
あと運営の方からすごくほめてもらえて一時的に自己肯定感が上がりました。

# 登壇しやすい条件とは？
あくまで私の感覚ですが、同じように登壇を呼びかけられても気軽に応じられる場合とかなり躊躇する場合があります。
以下、個人的に登壇の心理的ハードルが低くなる条件を書き出していきます。

## オンライン登壇
顔出しが無い、聞く側と同じ空間に居合わせないという点だけでもかなりハードルが低いです。
あがり症で視線を感じるとそれだけで言葉が出にくくなってしまうので、それを意識せずに済むことでやってみてもいいかなと思えます。

## 少人数のイベント
見られる人数が多くなればなるほど緊張度が上がるので、だいたい10人程度までを目安にして登壇可否を判断しています。
知り合いが含まれている率が高ければさらにハードルが下がります。

## 運営メンバーとの交流がある
イベント自体の雰囲気にもよりますが、運営のメンバーと交流があると「ちょっと頑張ってみようかな…」となりやすいです。
LTに限らず、「この人が運営しているイベントならおかしなことにはならないだろう」という信頼からくる安心ですね。
個人の失敗の範疇であればなんかやらかしても励ましてもらえるだろうという心理的安全性（？）は大切です。
axiosでnullableなパラメーターを作成する

## 達成したいこと
axiosでGETする際のパラメーターの要素を値があるときは指定する、ないときは指定しないようにしたい。

## 通常の書き方
```
const getSomeThing = async (param3?: string) => {
  // パラメーターを作成
  const params = {
    param1: 'param1',
    param2: 'param2',
    param3: param3
  }

  const res = await axios.get('url', { params })
  return res
}
```
このままだと引数で渡されたparam3がnullの時にaxiosのリクエストではparam3がnullで指定されてしまいます。
そもそもparam3がないときは指定しない方が予期せぬ挙動を防げると思います。

## こう書けばいい
```
const getSomeThing = async (param3?: string) => {
  // レコード型にする
  const params: Record<string, string | undefined> = {
    param1: 'param1',
    param2: 'param2'
  }
  // param3があるときだけ指定される
  if (param3) {
    params.param3 = param3
  }

  const res = await axios.get('url', { params })
  return res
}
```

パラメーターをレコード型にします。
TypeScriptでは`Record<Key, Type>`となります。
Typeをstring or undefindにすることにより、後からパラメーターを付与することができます。

## 最後に
TypeScriptのレコード
https://typescriptbook.jp/reference/type-reuse/utility-types/record

axiosのパラメーター指定
https://axios-http.com/ja/docs/req_config

TypeScriptのレコード型いい感じに使っていきたいですね。
【Vision Pro】Vision Proを使って実機検証する

## はじめに
今年の6月 ついに日本でもVision Proが発売されました。

Vison Proに心を躍らせて、購入された方も少なくないのではないでしょうか？
その中でも、Vison Proで開発をしたいと思っている人もいるかと思います。

そのため、この記事では、Vision Proを使って実機検証する方法を解説したいと思います。



## PCに直接接続する方法
![developer.apple.com_jp_visionos_resources_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/cc42d3ed-8552-fa70-ffe2-b557dca47f2d.png)

Vision ProとPCを直接接続するには、**[Developer Strap](https://developer.apple.com/visionos/developer-strap/)** なるものが必要になります。

現在、Developer Strapは以下の条件の方々が購入することができます。

> + Apple Developer Program or Apple Developer Enterprise Programのメンバー
> + 対象となる国または地域に拠点を置くApple IDをお持ちの方

つまり、Developer Strapを購入するには、Apple Developer Programの年間登録料 99米ドル払っていないといけないみたいです....

PCに直接接続するのは、お金かかりすぎるようですが、
リモート接続もできるので、あまり気にする必要ななさそうです。

## WiFi経由でリモート接続する方法
ここからは、WiFi経由でリモート接続する方法 についで解説しようと思います。

### 0. 前提条件
WiFi経由でリモート接続するために以下の状態になっていることを確認してください！

+ PCとVision Proがネットワーク（同じWiFi）に繋がっていること
+ PCとVision Proが同じiCloudアカウントでログインされていること

### 1. Vision ProのDeveloper Modeをオンにする

`Vision Proの設定 > プライバシーとセキュリティ > デベロッパーモード` から
Developer Modeをオンにするにしてください！

Developer Modeをオンにすると、再起動を求められるので、再起動をしてDeveloper Modeを有効化します！

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/f7b98d97-91f1-37f5-445c-fadc4f4a80cc.png)


### 2. PCとVision Proをペアリングをする

`Vision Proの設定 > 一般 > リモートデバイス` を開き
ペアリング準備完了 と表示されていたら、Vision Proの準備完了です！

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/6c070676-2151-2326-5786-40eb0baca690.png)

次は、PCで、Xcodeを開き、`Window > Devices and Simulators` を開くと、
ペアリングできる状態になっているので、`Pair` ボタンを押しペアリングの設定を始めます！

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/d2a5a0c0-d747-bb02-5994-dce96d1763d0.png)


`Pair` ボタンを押すと Vision Pro側に 6桁の数字が表示されるので、Xcode側に入力することで、ペアリングが完了します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/4128deb5-8a31-1c03-8c4d-7ba1f6358cef.png)


### 3. Vision Proでビルドする
ペアリングできたら、iPhoneのビルド同様に、Vision Proでビルドします！
ビルド先が、ペアリングしたVision Proになっていることを確認して、▶️ ボタンを押すとビルドできます！

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/597b1db5-871a-3f96-7ef2-2dd57d425340.png)

## まとめ

この記事では、Vision Proを使って実機検証する方法を解説しました、

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaに記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
小さく始めるWebのアクセシビリティ改善

## これは何

これからWebのアクセシビリティ改善を始めたい人向けに、個人的に小さく始められておすすめの改善ポイントをまとめてみました。

## はじめに：小さく始めるポイント

個人的に以下のポイントを押さえると着手しやすいかもと思います。

### 簡単に見つけられるポイントを改善する

例えば、[axe DevTools](https://chromewebstore.google.com/detail/axe-devtools-web-accessib/lhdoppojpmngadmnindnejefpokejbdd)など、アクセシビリティチェッカーを使って簡単に見つけられるものがおすすめです。

以下のようなポイントを自動チェックできます

- 背景色と文字色のコントラスト比が低い
- 画像に代替テキストがない画像
- リンクにテキストがない（アイコンリンクなど）
- フォームにラベルがない

また、ページを上からTabキーで移動してみて、以下のような箇所がないかを見つけるのも始めやすくておすすめです

- リンクやボタンなのにフォーカスできない
- 表示されていない要素にフォーカスしてしまう
    - 開閉メニューの閉じている時など
- フォーカスの位置がどこにあるかわからない
    - `outline: none`などでフォーカスインジゲーターを消してしまっている場合

### 改善の影響範囲が広すぎない

例えば、「ロゴの色を使っているボタンのコントラスト比改善」となると、関係者や出現範囲が大きくなってしまいます。

まずは特定範囲内で完結する箇所などから始めて、少しずつ規模を大きくしていくのが進めやすいと思います。

## 個人的におすすめの改善ポイント

### アイコンに適切な読み上げがない

アイコンに適切な読み上げの指定がないと、何も読み上げられなかったり、Webフォントの場合はkeyとして指定している単語が読み上げられてしまいます。

特にアイコンのみのリンクやボタンの場合は、それを押すと何が起こるのか？がわからなくなってしまうので重要なポイントです。

読み上げに指定したい内容がテキストとして並んでいる場合は、読み上げ内容が重複してしまうので指定しなくて大丈夫です。

```html:アイコンフォントの例
<div>
    <span class="material-symbols-outlined">
        search
    </span>
    <span class="sr-only">検索</span>
</div>

<style>
  .sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
  }
</style>
```

```html:svgの例
<svg aria-label="検索" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img">
    <path d="hogehoge"></path>
</svg>
```

### 画像に適切なalt指定がない

装飾としての画像でaltの指定がない場合は、`alt=""`を追加するだけです

情報を持つ画像なら、altに画像から読み取れる情報や画像で伝えたい情報を追加してあげましょう

```html:画像の例
<img alt="画像から読み取れる情報" src="icon-hogehoge.png" />
```

### リンクやボタンがdivになってる

こういうやつです

```js:divでできているリンク
<div onClick="location.href='https://example.com';">リンク</div>
```

divでリンクやボタンを実装すると、キーボードでのフォーカスや操作などの`<a>`や`<button>`には用意されている機能が使えないので、`<a>`や`<button>`に変更するだけでキーボードでの操作しやすさが向上します。

```js:リンクの例
<a href="https://example.com">リンク</a>
```

```js:ボタンの例
<button onClick="hoge()">ボタン</button>
```

### 背景色と文字色のコントラスト比が低い

:::note warn
場合によっては影響範囲が広いので、小さく始められないかもしれないです
:::

[axe DevTools](https://chromewebstore.google.com/detail/axe-devtools-web-accessib/lhdoppojpmngadmnindnejefpokejbdd)などのアクセシビリティチェックツールで簡単に見つけられます。

すでにカラーパレットが用意されていて、コントラスト比を確保できる利用可能な色があればそれを使いましょう。



### ボタンやリンクにフォーカスした時のインジゲーターがない

:::note warn
場合によっては影響範囲が広いので、小さく始められないかもしれないです
:::

大体はaやbuttonに`outline: none`が指定されているのが原因です。
`reset.css`の場合は範囲が大きくなりますが、一部に指定されているだけならすぐ対応できます。

もし影響範囲が大きすぎる場合はページやセレクタなど範囲を絞って`outline: unset`などでオーバーライドするのが良いと思います。

### フォームにラベルが紐づいていない

フォームにラベルが紐づいていない場合、それぞれのフォームの入力内容がわかりづらくなります。
また、プレースホルダーがラベルになっていると、入力中や入力後にラベルが読めなくなってしまいます。

すでにラベルがある場合は、for属性でフォーム要素のidと関連付けることで紐づけることができます。
ラベルがない場合はラベルを追加して紐付けましょう。

```html:例
<label for="name">名前</label>
<input type="text" id="name" name="name">
```
キャリアブレイク中は自由時間も大事

キャリアブレイク前に有休消化期間がありました。ちょっとしたラッキーで少し長めにもらえたので丸1ヶ月は、特に勉強もなしにして兎に角自由に過ごすことにしました。結果的にこの期間を作ったことは正解だったと思います。

# 自由期間でやったこと
[自由期間でやったこと](https://binnmti.hatenablog.com/entry/2024/11/01/091705)は、「ライススタイルの見直し、読書、家計簿、職安、知り合いと会う、勉強会、身の回りで気になったことを積極的にやる、習い事、アウトプット、息子関係、ゲーム」などです。とても楽しかったし、習い事とか普段できないことが出来たのは良い経験になりました。自由期間は暇をつぶす期間ではなく、それなりに忙しくしていました。

# 自由期間も忙しい
特に出社もしないと曜日感覚はどんどん薄れていきます。自分はそれまでスケジュール管理はかなり適当でした。そもそも働いていると１週間に何人も会ったり、空いた時間でやれることもたかが知れているので、記憶とかメールとかで十分管理出来てしまいます。でも自由期間は友達と積極的にあったり、突発的にイベントを申し込んだりすることも多く、それを覚えておくキャパシティも限界を超えてしまいました。

# スケジュール管理
自分は自分のスケジュール管理にツールなども特に使っていませんでした。でも友達と会う日もすぐに分からなくなりそうで、Googleカレンダーを積極的に使うようになりました。多くの人は既にご存じだと思いますがｗ、カレンダーを見ればスケジュールが全部書いていあるのってとっても便利です！プライベートでも毎日積極的にカレンダーをみるようになりました。

# イベントはその前の時間から始まっている
そういうスケジュール管理をしつつ、身の回りの細かいことをこなしていくのは結構面倒です。突発的にやろうと思っていることが、次の日イベントや友人に会う予定が入っていると、すぐのびのびになったりします。時間が決まったことに参加するのってその前の時間から心理的な拘束時間があることに改めて気づきました。そしてやろうとしていたことが容易にできなくなったりすると不安も生まれてきました。

# 自由だからこそ出来ないことの焦り
もちろんそれも含めて楽しめれば良いんですが、自分は折角の自由時間が取れたのにやりたいことがやれないと、不安になるタイプだったようです。例えば働いていると冷蔵庫によく分からないものが溜まってきているのをまとめて捨てたいと思ったら、多分、土日にやろうと思います。でも土日にイベントが入っていると、結局次の週になり、それが気づいたら１ヶ月続いてということはよくありました。それ自体は、はぁーと思いつつ、ストレスまでは感じていなかったですが、自由期間で同じような状況になると何もやってないなと焦ってしまう瞬間がありました。

# キャリアブレイク中は自由時間も大事
こういったことが昨日の[時間割を作ったこと](https://qiita.com/binnmti/items/3e7c4a407f5e5f8f4b24)につながります。実際時間割があることで、細かく時間が空いた時でも、何をやれば良いかに迷わないことは大きいです。もし自由時間に不安を感じていなくて、勉強期間に初めて不安を感じていたらもう少しダメージが大きかったと思います。実際11月は意識してイベントは減らしました。慣れてきたら少しづつ増やす気ではいます。当たり前ですが、遊ぶことも大事ということですね。
Fedora41 Live Diskにて遊ばう(其の壹)

さて、実は思ひ立って、当方の愛機のR8270にFedoraを又入れ直す事にして、Fedora41をやっとの思ひで入手した次第です。何しろ、現状導入軟件である所のFedoraは29版。折角落とした軟件も、Braseroの旧版では何故かDVDに焼けやしなひ…。ので、秋葉原の旧知の所でisoを落とした上、円盤にイメージを焼き込みます。但し、先方では光学媒体からの起動は出来ず、帰宅してからの起動試験となる訳で寿司。
![1000063049.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961748/92e9ea2d-61d5-8648-d3d3-462d6128b766.jpeg)
先ずは愛機に。此の光駆は、実は過去秋葉原で購入した、9mm厚のDVD超級駆動力(九州松下電器製)です。愛機は購入時には光駆やらWi-Fiは登載されて居らず、自力で購入・装着したものです。光駆は其れを支へる金具すら自作したのでした(此等に付ひては後日お話しやうと思ひます)。先ずは光駆に光学媒体を取付け、此処から起動可能にする必要が有ります。
![1000063051.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961748/a7946955-fe3a-5377-7d3b-81627cf1c225.jpeg)
さて、愛機には実は起動時にスペースキー押下で、各種の設定やら起動駆動力設定やらが可能で、之を用ひると、イカなる接続されて居る駆動力からも起動可能になるのです。之を用ひ、光駆からの起動を設定・起動します。
![1000063294.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961748/56feadb8-52da-8cb9-fb63-0904579645e7.jpeg)

![1000063304.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961748/9a5ece45-cf84-5c88-4cbe-e919a6af7451.jpeg)
**此の起動にはかなりの時間が掛かります…。**
![1000063306.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961748/cd4e8f1c-74f6-bdbe-4e92-6ded1de84b40.jpeg)
**暫くは画面が全く光らなひ時間が続き**、其れからFedora41としての濺が顔を覗かせて…で、此奴はかなり長く画面に居座る訳ですな。
![1000063065.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961748/3ed848fa-0dc8-7c38-3b91-db5f918dff2a.jpeg)
…で、之の後で何をしてるか気になる方は、鍵盤左上[Esc]を押下して下さひ。すると、其処で処理されて居る数多の服務がずっと滝の如く流れて行きます。途中何度か長く処理が入り、
![1000063310.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961748/6b804e69-9f50-1990-ba91-853cc80384c1.jpeg)
**画面が止まります**。一等最後には、GNOME服務の処理が始まり、之が*か〜な〜り*長く続きます。そして**唐突に画面は真っ暗に**。
![1000063151.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961748/f6580f87-6e3a-ef03-88c2-deaa8c476562.jpeg)
之が暫く続くと、愈々、本OSの顔である、**GNOME**が其の姿を現すのでした…駄菓子菓子、此処で油断してはいけません。之は"**Live DISK**"、未だ機体そのものにOSは導入されて居らず、其の導入を促す画面窓が出ました。
![1000063229.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961748/696d8cfe-e2ca-3c7f-0ce5-cfd234cce0c8.jpeg)
此処では取り敢〜えず、右に有る"**No Now**"を選択し、導入は先送りと致しませう。
今回は此処迄。次回は、地域と言語の設定のお話です。では又次回の更新迄。
Win11で環境変数をいじってたらPowerShellでコマンドが動作しなくなった件

今回起きた問題についてドンピシャな内容がなくてちょっと苦労したので、言語化して自分の学びにするとともに、同じ問題を抱えている人の解決または原因をつぶすきっかけになればと思いこの記事を作成しました。

# 結論

環境変数 `PATHEXT` を削除してしまっていた。
なので以下の値を再設定した。
`.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH`

# 問題発生の経緯

## 1. luaを導入していた

Windows11上でNeovimの環境を整えている際にプラグイン導入関係でluaとluarocksを入れようとしていた。しかしNeovimプラグイン側ではluaは認識されていたがluarocksは認識されなかったためlua関係のファイルを削除してやり直していた。

## 2. 環境変数をいじった

luarocksのインストールが完了した際に表示されたコンソール画面をよく読んでみると、この環境変数を設定して！って言われたので追加した。

## 3. 元に戻そうとしてタイトルの問題が発生

それでも読み込まれないので設定した環境変数をもとに戻した（つもり）ところで、いろんなコマンドが使えなくなっていた。 `cargo` `winget` `wsl` などをためしたが「そんなコマンドやらバッチファイルはあらへんで」みたいなエラーしか出なくなってしまった。
![failed to run `cargo` and `winget`](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091467/f001d30e-5c3e-f913-46cc-90ae572524fa.png)



# 試したこと

## 1. 環境変数 `PATH` の確認

正しく通っているか以下の要素を確認も問題なさそうだった。
- PowerShell 上で `$env:PATH` を打って確認
- タスクバー上の検索ボックスで「システム環境変数の編集」→ 「環境変数」をクリックしてGUI上で確認
- 使いたい `PATH` が追加されているか
- 余計な文字がないか（ `"` や `'` など）

## 2. PowerShell の再インストール

`winget` が使えないので GitHub からインストーラをダウンロードして、リペアと削除からの再インストールを実行。しかし解決せず。

## 3. コマンドプロンプトでコマンドを実行

こちらではなぜか PowerShell で使えなかったコマンドが使えた。
![Succeeded at the command prompt](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091467/1ec0c2e1-0315-95cf-756f-ba0683eaedea.png)


# 解決の糸口: 拡張子付きでコマンドを打った

私の環境では `where` コマンドを実行する際に `.exe` をつけないとちゃんと動作しないことを思い出したため、使えないコマンドに対して拡張子付きで実行したらどうなるか試した。

`cargo.exe` や `winget.exe` などではエラーメッセージは出ずに一瞬だけ別のウィンドが表示され、`wsl.exe` では別のウィンドで使用しているディストリビューションが起動できた。

ここで、「拡張子付きでコマンドを実行するとそのコマンドが別ウィンドで実行されるのではないか」という説を立てた。

# 解決へ

先ほどの説について「powershell コマンド実行 別ウィンドウが開かれる」で調べると、以下の記事が見つかった。

https://itasuke.hatenablog.com/entry/2017/11/27/145839

こちらの記事の最後のほうに環境変数の `PATHEXT` についての説明があり、この環境変数に設定した拡張子を持つファイルは拡張子なしで実行できる、すなわち `ファイル名.exe` ではなく `ファイル名` で実行できるとのことだった。

この `PATHEXT` について、luarocksの設定をするときに `.LUA` を追加してと言われたのを思い出した。その時は、最初のインストールのために `PATHEXT` を新規に作成し、再インストールのために環境変数を元に戻そうとして削除した。

そこで、自分の環境変数を確認して、`PATHEXT` を改めて作成し `.EXE` を設定するとコマンドが実行できるようになり、晴れて問題を解決することができた。

どうやら `PATHEXT` のデフォルト値は `.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH` のようなのでこれを設定して問題解決とした。

# 振り返って

luaとluarocksの設定の際に、既存のものとは別に `PATHEXT` を作ったことで環境変数が重複してしまって動かなくなり、焦って削除してしまったことでややこしくなってしまった。

問題解決ができて良かったのだが二つ疑問がある。
1. `PATHEXT` が設定されていないにも関わらず、 PowerShell では実行できないのにコマンドプロンプトでは実行できたのか
1. なぜ拡張子付きで実行すると別ウィンドが起動し、そこで実行されるのか

あと疑問ではないが、 `PATHEXT` をデフォルト値に戻したのはいいものの実は必要なものが抜けていてその時にエラーが出ないかが心配。

# この経験から学んだこと

- 環境変数を追加するときは、すでに存在していないか確認する
- コマンドのパスを通すには `PATH` と `PATHEXT` の二つが関係している
    - パスを通すことについてはこの Qiita の記事に詳しく乗っているので、問題が起きた時には参考にしようと思う。  

https://qiita.com/sta/items/63e1048025d1830d12fd
野球チーム作成botをSlackでつくったお話

![qtta1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784193/9a9e828b-a508-4528-c9cf-b4ea5d9ce32a.jpeg)

先日ハッカソンに参加した。
ポンコツ非エンジニアは無力すぎた。なんの役にも立たなかった。
よく参加したなぁ！おい！
ひとりツッコミをいれてみる。

## ひとりリベンジ
ハッカソンの時、生成AIを使って、自分の好きな野球チームを作る！というアイデアになった。
例えば、大阪桐蔭出身者のみのチームとか、打率が高いチームとか、守備力高いチームとか。

ハッカソン当日の私の役目は「人力ハルシネーション探知機」と化していた。

その話はさておき、Makeで出来るんじゃないかとハッカソン当日も戦ってみたけど、できなかったのが悔しいので改めて試してみた

## Makeで作ってみる
Makeはノーコードで開発できるサービスです。
直感的に操作できるので、私のようなポンコツ非エンジニアでも何かしらつくれちゃいます。
それでも失敗はたくさんあります。
基本的には無料でつくれますが、たくさん使うと課金しないといけなかったりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784193/991b9704-237b-f288-00bf-99b1936d1a1d.png)
https://www.make.com/en

私は何かしら作ろうと考えた時はMakeで試すことが多いです。
Makeは使えるサービスがたくさんあるので、とても便利だなぁと思います。

### Slackでオウム返しをつくる
まずはオウム返しをつくります。
生成AI突っ込んで動作しなかったら何が悪いのかまったく分からんからです。

### 必要なもの
・Slackアカウント: MakeでAPIアクセス用にSlackアプリを作成し、トークンを取得します。
・OpenAIアカウント: OpenAIのAPIキーを取得します。
・Makeアカウント: ワークフローを設定するためのアカウント。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784193/992dbc91-e957-23c0-4cc8-b83b1dd16097.jpeg" width=70%>

出来ました！

ハッカソンの当日も、先にオウム返しから作ればよかったなと思いました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784193/20d8dc58-f4f6-1531-eac7-648d90fcf8f6.jpeg" width=50%>

こんな感じ。一番下の「Limit」は返ってくるリストの内容になってるので、1つにすると、一番最初のテキストが戻ってきます。

この間に生成AIモジュールを設定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784193/9c670888-c009-66c3-814c-5a5cdcd59f04.jpeg" width=50%>

## 続くクレジットエラー
OpenAIには課金してるので、支払い設定が出来ていると思ってました。
ただ、出てくるエラーがクレジットのことばかり。どんな毛守銭奴やねん！！と思ってたけど、APIを使うのは別会計のようでクレジット設定したらすんなりエラーは消えました。

私のような人が世の中に数人はいるかと思うので、みなさんAPIとChatGPT課金は別なので気を付けてください。

OpenAIの設定はこんな感じです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784193/c3da0d2e-a58a-2e75-dcfc-ca5089d344b2.png" width=50%>

プロンプトは
-----------------------------------------------
- あなたは日本プロ野球の選手で打順をつくる人です。
- テーマに沿ってプロ野球の打順を作成してください。

- ただし、必ず9人で打順を組んでください。
- データはhttps://npb.jp/bis/teams/を使用してください。
- 打順ごとに必ず改行してください。
- 作成したチーム名も作ってください。
出力形式
1番（ポジション）:背番号：球団：選手名
2番（ポジション）:背番号：球団：選手名
3番（ポジション）:背番号：球団：選手名
4番（ポジション）:背番号：球団：選手名
5番（ポジション）:背番号：球団：選手名
6番（ポジション）:背番号：球団：選手名
7番（ポジション）:背番号：球団：選手名
8番（ポジション）:背番号：球団：選手名
9番（ポジション）:背番号：球団：選手名
-----------------------------------------------

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784193/fb475252-7375-4ff6-50c5-9c650c6a10cf.png" width=70%>

なかなかのチームを作ってくれた。
スピードスターというなら、周東は入れて欲しいと切に願う。
ヤクルトなら並木だ。
杉本って脚はやかったっけね？とたくさん謎は残るけど、これもまた楽しいものだと思う。

おもしろいので、LINE Botでも作ってみたいなぁと思ったけど、OpenAIの課金が怖いので公開はできないのでおもしろくないから、GPTsで作ってみようかな。


一応、作りたいものはできたんやけど、一抹の不安としては
- "Watch Public Channel Messages"が合ってるか否か
- 上記モジュールのLimit設定

Limit設定を多くすると、送られてくるメッセージの数が増えてしまうので、おそらく何かしら間違ってるかもしれない。

これを読んで気になった方がいらっしゃれば是非教えてもらいたい。

こうして人頼みにするから一向に成長しないんだなぁと分かってはいます。はい。
自分の考えのまとめ方

## 前置き
自分の考えてることを人に伝えるのって難しいですよね。
私はアウトプットがすごく苦手なので、なかなか伝えたいことが伝わらずに四苦八苦することが多いです。

そんな私ですが、ふと仕事中同僚にしたアドバイスが、人に何かを伝えたいときのノウハウとして便利！
と好評だったので記事にしてみます。
当時のシチュエーションとしては、設計書作りで複雑な処理の補足文を書いているところだったのですが、
口頭で説明するときにも資料を書くときにも応用できると思います。

## 本編
コツはただ1つだけです。
自分が把握している情報を全て書き出すことです。

何について伝えたいのか、どういう経緯があるのか、どんな理由があるのか、
思いついた情報を全て適当に書き並べます。
文だけでよければメモ帳に、図が欲しかったらExcelなどに書き殴ります。

全部書き出したら、似ている情報を近くに固めます。
同じようなことを書いてる行があったら近くに寄せて、
「経緯」「理由・根拠」「やりたいこと」などのカテゴリごとに寄せます。
足りない情報があったら調べなおしましょう。

ここまでやれば、知るべき・伝えるべき情報は全て揃っているので、
あとは説明するのに必要な部分だけを抜き出します。
そうすれば自ずと、最小の情報量でわかりやすい説明になるはずです！
ぜひ試してみてください。
Laravelのポリシーとガード：RailsのPunditとの比較

### はじめに
LaravelとRailsは、それぞれ人気のあるWebアプリケーションフレームワークであり、開発者に多くの便利なツールを提供しています。その中でも、アクセス制御の仕組みはアプリケーションのセキュリティを確保するために重要です。Laravelではポリシーとガードを利用し、RailsではPunditを使うことでアクセス制御を実現します。本記事では、Laravelのポリシーとガードの基本を解説し、RailsのPunditと比較しながら、その違いや利用シーンを見ていきます。

### Laravelのポリシーとは？

#### ポリシーの基本

Laravelのポリシーは、特定のモデルに関連する認可ロジックをカプセル化するクラスです。ポリシーを利用することで、コントローラの中で煩雑になりがちな認可ロジックを整理することができます。

#### ポリシーの作成

ポリシーは、以下のコマンドで作成します：

```
php artisan make:policy PostPolicy --model=Post
```

このコマンドにより、`app/Policies/PostPolicy.php`というファイルが生成されます。この中に各アクション（例: view, update, delete）に対応する認可ロジックを記述します。

### ポリシーの登録

ポリシーを適用するには、`AuthServiceProvider`に登録する必要があります：

```php
protected $policies = [
    \App\Models\Post::class => \App\Policies\PostPolicy::class,
];
```

### ポリシーの利用

コントローラ内でポリシーを利用するには、`authorize`メソッドを使用します：

```php
public function update(Request $request, Post $post)
{
    $this->authorize('update', $post);
    // 更新処理
}
```

これにより、`PostPolicy`の`update`メソッドが呼び出され、認可がチェックされます。

### Laravelのガードとは？

#### ガードの基本

ガードは、Laravelにおける認証ドライバの設定です。例えば、アプリケーションに複数のユーザータイプ（管理者、一般ユーザーなど）が存在する場合に、それぞれの認証ロジックを定義できます。

#### ガードの設定

`config/auth.php`ファイル内でガードを設定します：

```php
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],
```

#### ガードの利用

現在のガードを切り替えるには、以下のように指定します：

```php
Auth::guard('api')->check();
```

これにより、API用の認証が有効になります。

### RailsのPunditとは？

#### Punditの基本

Punditは、Railsアプリケーションで利用される認可ライブラリです。Laravelのポリシーと同様に、モデルごとの認可ロジックを整理する役割を果たします。

#### Punditのインストール

Punditを使用するには、Gemfileに以下を追加します：

```
gem 'pundit'
```

その後、`bundle install`を実行します。

#### Punditのポリシー作成

ポリシーを生成するには、以下のコマンドを使用します：

```
rails g pundit:policy Post
```

これにより、`app/policies/post_policy.rb`が生成されます。

#### Punditの利用

コントローラ内でPunditを利用するには、以下のようにします：

```ruby
def update
  @post = Post.find(params[:id])
  authorize @post
  # 更新処理
end
```

このコードは、`PostPolicy`の`update`メソッドを呼び出します。

### LaravelとRailsの比較

| 機能 | Laravel | Rails |
|:-----------|------------|------------|
| 認可ロジック | ポリシーを利用 | Punditを利用 |
| 認証管理 | ガード（複数ガードが可能） | Deviseや他のGemを利用可能 |
| 設定の柔軟性 | 高い（ガードを自由に定義可能） | Gemやモジュールで拡張可能 |
| コードの分離性 | 高い（認可ロジックを分離） | 高い（ポリシーに分離） |

### まとめ
Laravelのポリシーとガードは、認可と認証の仕組みを柔軟かつ強力にサポートします。一方、RailsのPunditも認可ロジックの分離を可能にし、読みやすいコードを実現します。それぞれのフレームワークでの設計思想を理解し、適切に活用することで、セキュアなアプリケーションを効率的に構築できるようになるでしょう。
「サクラエディタ」に今来た私が試したこと（ChatGPT先生と共に）

# はじめに
この記事は、[サクラエディタ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/sakura-editor) の８日目の記事となります。

アドベントカレンダのリストを見ていて「サクラエディタ使ってみよう」と、
今サクラエディタに来た者の記録です。

# 基礎知識の取得
いつものようにChatGPT4o先生に聞いてみる。
![スクリーンショット 2024-12-15 14.19.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/adbc9580-153e-2940-f55c-30d8093f15b8.png)
![スクリーンショット 2024-12-15 13.29.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/7f8aa13e-0ba2-0dba-f945-7032363b9066.png)
「情報源」のボタンを押すと、本家のページをまとめてくれた様子。
「エディッター」ではなく「エディタ」が正しいのね。「ッ」も「ー」もなしが正しい。失礼しました。
https://sakura-editor.github.io/
# 動かしてみる
早速ダウンロードして使わせてもらおう！
と思ったら、Macだった。今書いてるパソコンは・・・。詰んだか。
と、[サクラエディタ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/sakura-editor) をぼーっと見ていたら、
@yaju(やじゅ)さんの有難い記事を発見。
[MacでサクラエディタをWhisky経由で動かす方法サクラエディッタをMacで](https://xn--qiita-xra.com/yaju/items/280adb1d13b411e114c3)
 M1のMacbookで動いた！ありがとうございます。

![スクリーンショット 2024-12-15 13.58.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/7308cfe3-2002-a41b-f46e-77e91b023a12.png)

# マクロ機能を試す
エディッタといえばマクロ機能だよね、というわけで、マクロの生成をChatGPTに依頼してみた。
![スクリーンショット 2024-12-15 14.09.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/e946c480-927f-983e-0f39-91ecc52fb8b0.png)
![スクリーンショット 2024-12-15 14.09.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/7c4ee2b4-f612-d74e-2dc0-a405bf3ae324.png)
![スクリーンショット 2024-12-15 14.11.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/e51e999b-dfeb-944b-8a02-6ee35b48eea8.png)


これは花？　メニューにも「ツール」→「マクロ」→「マクロの設定」は無いなあ。ChatGPT先生のハルシネーションか。

というわけで、ファイルにして、「ツール」「名前を指定してマクロを実行」で選択して、実行してみた。
![スクリーンショット 2024-12-15 14.11.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/2cb83cc1-dd04-2e10-34a6-966da5bc63f1.png)

１３行目を削除するとエラーがなくなりました。
![スクリーンショット 2024-12-15 16.05.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/695ee46a-6e69-fd45-6300-a08832dce87e.png)


以上、簡単ですが、「サクラエディタ」に今来た私が試したこと（ChatGPT先生と共に）、でした。
PyotpでPythonでワンタイムパスワードを発行しよう

# 0.ワンタイムパスワードとは？
アカウントにログインする時、「認証アプリの番号を入力してください」
みたいなメッセージを見たことありませんか？
この番号が、今回の本題である
「**ワンタイムパスワード**」です。
今回はこれの仕組みやPythonでの実装方法を書こうと思います！

# 1.仕組み
"認証アプリを登録する際に、秘密鍵を発行し、その秘密鍵と時間を計算することでワンタイムパスワードが生成されている。"

って言っても、あんまり分からないじゃないですか。
なので簡単な例えをどうぞ。

## 例え話「サーバーとクライアントの2つの種」
「サーバーとクライアントは環境が違っても全く同じ育ち方をする
特殊な種(秘密鍵)を持っています。植え始めた時間が違っても途中から育ち始めます。」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930283/a51fb577-47fd-63e1-ade0-c521039604ed.png" width="50%">
(緑のやつが種です)
「サーバーはクライアントに種の育ち具合を聞くことで本人かそうでないかを判別しています。」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930283/e5d42ae2-6a04-c28e-8e00-52e5c5db780f.png" width="50%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930283/866ffd28-942b-5862-1d7f-e41668cdb7bb.png" width="50%">
どうですか？理解してもらえたでしょうか。こんな感じで例えで考えるとわかりやすいかもしれません！
# 2.実際に使ってみよう！
## 事前準備
```bash
pip install pyotp qrcode
```

## サンプルコード
```python:otp.py
import pyotp
import secrets
import qrcode
import base64

secret = base64.b32encode(secrets.token_bytes(10))  # 例えでいう、種
totp = pyotp.TOTP(secret)   # サーバー側の、木

qrcode.make(totp.provisioning_uri()).save("QR.png")

print(f"The secret is {secret}!")
while True:
    answer = input("What is the number? > ")
    if totp.verify(answer): # サーバー側の木と一致するか確認
        print("Collect!")
    else:
        print("Incollect!")
    break
```
QR.pngが生成されるので、それを認証アプリで読み取ったらOKです！

# 最後に
この記事が面白かったり、参考になったら
いいね、コメントおねがいします！
最後まで読んでいただきありがとうございます！
バージョン管理ツール mise 使ってみた

# 概要

バージョン管理ツールに mise を導入してみました。
代わりに asdf を消しました。
どんな感じで導入したかのメモです。


:::note info
補足
以前 asdf を使う記事を書いたのですが、
mise の方がパフォーマンス・セキュリティー的によいとのことなので移行しました。
- [バージョン管理ツール asdf 使ってみた #asdf - Qiita](https://qiita.com/murakami-mm/items/2d63177dc8ea002a847b#asdf-%E3%82%92%E5%B0%8E%E5%85%A5)
:::

# 環境

- Mac M1
- MacOS: 15.1.1
- シェルはzshを利用

# 本題

では、 asdf を消して mise を入れていきます。

## asdf の削除

今までありがとう asdf 🙏

### やったこと

もともと homebrew 経由で入れていた

1. `~./zshrc` から下記の行を削除
      ```diff:~/.zhsrc
      - . /opt/homebrew/opt/asdf/libexec/asdf.sh
      ```
1. homebrew 経由で入れていたので下記を実行
      ```shell
      brew uninstall asdf
      ```

## mise を導入

消したからには入れないといけない :fire:

- インストール方法は公式より
  - https://mise.jdx.dev/installing-mise.html#homebrew
  - https://mise.jdx.dev/installing-mise.html#zsh

### やったこと

homebrew と zsh を利用

1. mise をインストール
      ```shell
      brew install mise
      ```
1. 下記を実行
      ```shell
      echo 'eval "$(mise activate zsh)"' >> "${ZDOTDIR-$HOME}/.zshrc"
      ```

## mise で ruby のバージョン管理

必要なバージョンのrubyをインストールしてみる

- インストール方法は公式より
  - https://mise.jdx.dev/lang/ruby.html#usage

### やったこと

1. 最新バージョンを確認(この時は3.3.6だった)
      ```shell
      mise latest ruby 
      ```
1. ruby 3.3 をグローバルで使うようにした
      ```shell
      mise use -g ruby@3.3
      ```
1. asdf と変わらず `.tool-versions` を使えるらしいので、各プロジェクトの設定は特に必要なし
  - https://mise.jdx.dev/lang/ruby.html#ruby-version-and-gemfile-support

# おわりに

所感としては、 asdf より実行する必要のあるコマンドが少なかったです。また、移行も簡単でした。
パフォーマンスやセキュリティーの観点でも mise の方が良さそうなので、これからも使っていきたいと思います。

- mise と asdf の比較:
  - [Comparison to asdf | mise-en-place](https://mise.jdx.dev/dev-tools/comparison-to-asdf.html)
1号機で作成したMariaDBの情報を介して、2号機のTFTDisplayに温度、湿度、気圧、照度の情報を表示させる【１号機の設定】。

■１号機の設定。仮想環境にもcgsencerの導入が必要。
```
source ~/vpy/bin/activate
```
python3 -m pip install -U cgsensor

１．まずは　テーブルに情報を書き込む python作成。 room_env_disp.py で保存。
```
#!/usr/bin/env python3
import cgsensor  # インポート
import datetime
import mysql.connector
bme280 = cgsensor.BME280(i2c_addr=0x76)  # BME280制御クラスのインスタンス, i2c_addrは0x76/0x77から選択
bme280.forced()  # Forcedモードで測定を行い, 結果をtemperature, pressure, humidityに入れる
print('気温 {}°C'.format(bme280.temperature))  # 気温を取得して表示
print('湿度 {}%'.format(bme280.humidity))  # 湿度を取得して表示
print('気圧 {}hPa'.format(bme280.pressure))  # 気圧を取得して表示
tsl2572 = cgsensor.TSL2572()  # TSL2572制御クラスのインスタンス
tsl2572.single_auto_measure()  # 条件を自動で調整しながら1回測定を行い, luxに結果を入れる
print('明るさ {}lux'.format(tsl2572.illuminance))  # 明るさを取得して表示

temp = '{}°C'.format(bme280.temperature) 
humi = '{}%'.format(bme280.humidity)
air_p  = '{}hPa'.format(bme280.pressure)
illumi = '{}lux'.format(tsl2572.illuminance)

# db connect
def main():     
# mysql connect 
   cnt = mysql.connector.connect(
   host='miyamodb',
   port='3306',
   db='miyamodb',
   user='miyamo',
   password='miyamoXXXX',
   charset='utf8'
   )
　 db = cnt.cursor(buffered=True)

# query table update run
    sql = 'UPDATE room_env SET temperature = %s, humidity = %s, air_pressure = %s, illuminance = %s, upd_datetime = now()  where id = 1';
    data_env = (temp, humi, air_p, illumi)
    db.execute(sql,data_env)
    sql = 'commit';
    db.execute(sql)

# select
    sql = 'SELECT * FROM room_env';
    db.execute(sql)
    
# display 
    rows = db.fetchall()
    print('room_env update：',rows)

# cursol end
    db.close()
# close
    cnt.close()

if __name__ == "__main__":
    main()
```
２．仮想環境で実行
```
source ~/vpy/bin/activate
```
room_env_disp.py　実行で　うまくＤＢのテーブルに書きこめたぞ。

３．cronに登録 5分毎に実行。　いけた。
```
sudo crontab -e
```
*/5 * * * * cd /home/pi/ && /home/pi/vpy/bin/python room_env_disp.py >> /tmp/cron.log 2>&1
Pythonで利用するデータの型一覧

Pythonのデータ分析でよく使うデータ型：基礎から応用まで
Pythonは、データ分析において非常に強力なツールとして広く利用されています。その魅力の一つに、多様なデータ型を柔軟に扱える点が挙げられます。本記事では、Pythonのデータ分析で頻繁に利用されるデータ型について、その特徴や具体的な使用例を交えて解説します。

Pythonにおけるデータ型の基礎
Pythonのデータ型は、大きく分けて数値型、文字列型、論理型、そしてPython特有のオブジェクト型に分類されます。

### 1\.数値型
int: 整数型。通常の整数値を表します。
```python:
a1 = 1
print(type(a1))
```
実行結果
```
<class 'int'>
```
float: 浮動小数点型。小数点を含む数値を表します。
```python:
a2 = 1.14
print(type(a2))
```
実行結果
```
<class 'float'>
```
complex: 複素数型。虚数を含む数値を表します。
```python:
a3 = 3 + 4j
print(a3)
print(type(a3))
```
実行結果
```
(3+4j)
<class 'complex'>
```
実部と虚部を分けて表示させる場合、以下の結果になる。
実部
``` python: 
print(a3.real)
print(type(a3.real))
```
実行結果
```
3.0
<class 'float'>
```

虚部
``` python:
print(a3.imag)
print(type(a3.imag))
```
実行結果
```
4.0
<class 'float'>
```

### 2\.文字列型
str: 文字列型。文字の並びを表します。
```python:
s = 'finance'
print(s)
print(type(s))
```
実行結果
```
finance
<class 'str'>
```


### 3\.論理型
bool: 真偽値型。TrueまたはFalseの値を取ります。


``` python:
a = 100
b = 200

print(a < b)
print(type(a < b))

```
実行結果
```
True
<class 'bool'>
```

```python:
a = 100
b = 200


print(a > b)
print(type(a > b))

```
実行結果
```
False
<class 'bool'>
```



### 4\. オブジェクト型
list: リスト型。順序付きの要素の集合を表します。
リストの最後がカンマ（,）で終了しても動作します。
```python:
list = ['Google', 'Amazon',  'Facebook','Apple','Microsoft',]
print(list)
print(type(list))
```

実行結果
```
['Google', 'Amazon', 'Facebook', 'Apple', 'Microsoft']
<class 'list'>
```


tuple: タプル型。不変の順序付きの要素の集合を表します。
リストと同様、タプルの最後がカンマ（,）で終了しても動作します。
```python:
tuple = ('Google', 'Amazon',  'Facebook','Apple','Microsoft',)
print(tuple)
print(type(tuple))
```

実行結果
```
('Google', 'Amazon', 'Facebook', 'Apple', 'Microsoft')
<class 'tuple'>
```
dict: ディクショナリ型。キーと値のペアの集合を表します。
```python:
dict = {'GOOG':'Google',
        'AMZN ':'Amazon', 
        'META':'Facebook',
        'AAPL':'Apple',
        'MSFT':'Microsoft',
        }
print(dict)
print(type(dict))
```

実行結果
```
{'GOOG': 'Google', 'AMZN ': 'Amazon', 'META': 'Facebook', 'AAPL': 'Apple', 'MSFT': 'Microsoft'}
<class 'dict'>
```

set: セット型。重複のない要素の集合を表します。
```python:
set = {'Google', 'Amazon','Facebook','Apple','Microsoft','Google','Apple',}
print(set)
print(type(set))
```

実行結果
```
{'Facebook', 'Microsoft', 'Amazon', 'Google', 'Apple'}
<class 'set'>
```

DataFrame: pandasライブラリで利用される、表形式のデータ構造です。
```python:
import pandas as pd
df = pd.DataFrame({"a":[1, 2, 3],
                   "b":[4, 5, 6]
                   })
print(df)
print(type(df))
```

実行結果
```
   a  b
0  1  4
1  2  5
2  3  6
<class 'pandas.core.frame.DataFrame'>

```


Series: pandasライブラリで利用される、1次元配列のようなデータ構造です。

```python:
import pandas as pd
df = pd.Series({"a":[1, 2, 3],
                "b":[4, 5, 6]
                   })
print(df)
print(type(df))
```

実行結果
```
a    [1, 2, 3]
b    [4, 5, 6]
dtype: object
<class 'pandas.core.series.Series'>

```

データ分析では、扱うデータの種類によって適切なデータ型を選択することが重要です。




### まとめ
Pythonのデータ分析では、様々なデータ型が利用されます。
データの分析、特性に合わせて適切なデータ型を選択することで、
より効率的かつ正確な分析を行うことができます。


本記事では、Pythonのデータ型の基礎と、pandasにおけるデータ型の扱いについて解説しました。
/usr/lib/tmpfiles.d/tmp.confを見てみよう

# はじめに
https://qiita.com/aiz4ryhe/items/ffe947962c5828f191b2

この記事を書いたときに参照したファイル`/usr/lib/tmpfiles.d/tmp.conf`のここの部分
```
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d
```

「vってなんだ？」と思ったので調べてみる

# 結論
- 色んな設定がある
    - マニュアル見れば全部書いてある
- `v`なら「ディレクトリがなければ作る」の意


# マニュアルを見よう
### マニュアルを見よ（`# See tmpfiles.d(5) for details`）と書かれている

```
   Type
       The type consists of a single letter and optionally an exclamation
       mark.

       The following line types are understood:
       （中略）
      v
           Create a subvolume if the path does not exist yet and the file
           system supports this (btrfs). Otherwise create a normal directory,
           in the same way as d.
```
##### 訳：
パスがまだ存在せず、ファイルシステムがこれをサポートしていれば、サブボリュームを作成する（btrfs）。そうでない場合は、dと同じ方法で通常のディレクトリを作成する。

※dと同じ方法・・・Create a directory if it does not exist yet.
WSL2 + VSCode 環境構築の流れ

# はじめに
WSL2とVSCodeの連携環境を構築する際の流れをメモにしました。

## 1. 全体的な流れ
・WSL2事前準備(BIOS、Windowsの機能有効化)
・WSL2インストール
・WSL2環境にUbuntuインストール
・VSCodeインストール
・Ubuntuパッケージ最新化
・VSCode連携

## 2. WSL2事前準備
###  2.1. BIOSの仮想化支援技術の有効化
  Intelの場合 : VT-xの有効化
  AMDの場合   : AMD-Vの有効化

###  2.2. 「Windowsの機能」の有効化
  以下の2つの機能を有効化
　・Linux用Windowsサブシステム
　・仮想マシンプラットフォーム

　WSL2は(裏で)Hyper-Vの機能を使うものの「Windowsの機能」で「Hyper-V」の有効化は行わなくても利用可能。

　以下の機能の有効化も不要。
　・Windowsハイパーバイザープラットフォーム
　・コンテナー

## 3. WSL2インストール
###  3.1. 実施環境
  以下のいずれかの環境でインストール実施
  ・管理者モードのPowerShell
  ・管理者モードのコマンドプロンプト

###  3.2. インストール
  wsl --install 

###  3.3. インストール
  wsl --set-default-version 2

###  3.4. WSLのバージョン確認(Version 2を確認)
  wsl --status

## 4. WSL2環境にUbuntuインストール
###  4.1. インストール
  wsl --install -d Ubuntu

###  4.2. 確認
  wsl -l -v

###  4.3. Ubuntuの起動
  wsl -d ubuntu

## 5. VSCodeインストール
###  5.1. インストール
  以下からダウンロードしてインストール
   https://code.visualstudio.com/Download

###  5.2. WSL拡張のインストール
  ・VSCodeでView → Extensionsを選択。
  ・検索窓でWSLを検索。
  ・Microsoft社が提供している「WSL拡張」をインストール。

## 6. Ubuntuパッケージ最新化
###  6.1. Ubuntuの起動
  wsl -d ubuntu

###  6.2. パッケージの最新化
  sudo apt update
  sudo apt -y upgrade

## 7. VSCode連携
 ・Ubuntu側で対象ディレクトリに移動し、
 　「code .」を実行。
 ・Windows側のVSCodeが上記ディレクトリに
 　マッピングされた状態で起動。

# 参考資料
@zaburo(zaburo)
WSL2 + Ubuntu + VSCodeでの開発環境構築
https://qiita.com/zaburo/items/27b5b819fae2bde97a3b

penpenメモ
VT-X、AMD-V、Hyper-V、WSL、WSL2の違い
https://penpen-dev.com/blog/vt-x-amd-v-hyper-v/
Python/BAT を使ったフォルダ削除とアプリランチャー.exe の作成方法

```ninjatrader_starter.py
import os
import subprocess

# Clear NinjaTrader cache
os.system('del /q "%USERPROFILE%\\Documents\\NinjaTrader 8\\cache\\*.*"')
os.system('for /d %F in ("%USERPROFILE%\\Documents\\NinjaTrader 8\\cache\\*") do rd /s /q "%F"')

os.system('del /q "%USERPROFILE%\\Documents\\NinjaTrader 8\\db\\cache\\*.*"')
os.system('for /d %F in ("%USERPROFILE%\\Documents\\NinjaTrader 8\\db\\cache\\*") do rd /s /q "%F"')

# Launch NinjaTrader
subprocess.Popen(r'"C:\Program Files\NinjaTrader 8\bin\NinjaTrader.exe"')
```

```
python -m pip install pyinstaller
pyinstaller --onefile --icon="C:\Program Files\NinjaTrader 8\bin\NinjaTrader.ico" ninjatrader_starter.py
```

### bat ver.
```
del /q "%USERPROFILE%\Documents\NinjaTrader 8\cache\*.*"
for /d %%F in ("%USERPROFILE%\Documents\NinjaTrader 8\cache\*") do rd /s /q "%%F"

del /q "%USERPROFILE%\Documents\NinjaTrader 8\db\cache\*.*"
for /d %%F in ("%USERPROFILE%\Documents\NinjaTrader 8\db\cache\*") do rd /s /q "%%F"

"%ProgramFiles%\NinjaTrader 8\bin\NinjaTrader.exe"
```

https://github.com/aizwellenstan/ninjatrader_starter
2024年に見つけた厄介な初心者コード ワースト3位

# はじめに
2024年のコードレビューの中で個人的に見た、プログラミング言語によらない厄介なコードと対処法、そして伝え方の記事です。

# 3位 if文ネスト多重層
select文を知らなくて、if文を100個並べて書くとかは見たことがあったのですが、ネストを2桁層重ねる人は初めて見ました。

```C#: C#
string today = "5"; // 今日の日付

if (today.Contains("1"))
{
    if (today.Contains("2"))
    {
        if (today.Contains("3"))
        {
            if (today.Contains("4"))
            {
                ...
                Console.WriteLine("success");
                ...
            }
        }
    }
}
```
しかもコードを動かしても一番深いところまでは行けませんでした。

## 対処法と伝え方
まずはどのような __意図__ があったのか聞き取りを行います。
次に実際に __一緒に動かしてみて__ 、最深部までいかないことを確認してもらいます。
そして現状のコードの __問題点__ を伝えます。今回の場合だと、以下の通りです。
- コードの可読性が低い (他の人が理解しやすくすることが重要)
- 複雑なif文は、修正する際にバグを生む原因になりやすい
- 将来的に条件を変更・追加する際に、どこを修正すればいいのか分かりにくい

コード作成者には必要な条件の部分だけ切り出して、以下の改善策提案し、 __実際に書いてもらい__ ました。

```C#: ガード節
string today = "5"; // 今日の日付

if (!today.Contains("1")) return;
if (!today.Contains("2")) return;
if (!today.Contains("3")) return;

Console.WriteLine("success");
```

最後に、コードを書いたら「実際に動かして確認する」よう念押ししました。
コードを書くことに満足して書いたコードを実際に動かさないことが常な人もいます。

# 2位 グローバルな変数i,j,k
グローバル変数名がi, j, kだった時は、一度画面から目を離しました。
グローバル変数を使われると、どこでどんな影響があるか分からず無闇に使ってほしくないのですが、for文で使いがちな変数名i, j, kが使われると、もうコードの動作意図の範囲が分かりません。

## 対処法と伝え方
グローバル変数の便利さとスコープの重要性を一緒に再確認して、プログラミングでは慣習的にfor文でi, j, kを利用しがちなので、せめて変数名を変えるよう伝えました。
慣習なのでプログラミング経験の浅い初心者が知らなかったとしても仕方がないとは思います。

# 1位 今までの処理は関係ない
長い関数の処理を順に上から辿っていって、やっと最後まで来たと思ったら今までの処理は全く関係なく、Falseを返されていた時は「お前の存在がFalseじゃ」と私の頭の中のおじいさんが言っていました。

## 対処法と伝え方
コードの確認指示と削除要請を行いました。

# おわりに
2024年は色々なコードを見る経験で自分の精神力が鍛えられて勉強になりました。
2025年も自分が成長しつつ、成長させていきたいです。
jupyternotebook OSError(161): Not available, docker(204) python(49)

LLM(Large Language Model) Calendar 2024
https://qiita.com/advent-calendar/2024/llm
13日目の記事です。

jupyternotebook error

```
!pip install -U pip

OSError                                   Traceback (most recent call last)
Cell In[3], line 2
      1 # python 3.10.12
----> 2 get_ipython().system('pip install -U pip')
      3 get_ipython().system('pip install -U transformers')
      4 get_ipython().system('pip install -U bitsandbytes')

File /lib/python3.12/site-packages/IPython/core/interactiveshell.py:2653, in InteractiveShell.system_piped(self, cmd)
   2648     raise OSError("Background processes not supported.")
   2650 # we explicitly do NOT return the subprocess status code, because
   2651 # a non-None value would trigger :func:`sys.displayhook` calls.
   2652 # Instead, we store the exit_code in user_ns.
-> 2653 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))

File /lib/python3.12/site-packages/IPython/utils/_process_emscripten.py:11, in system(cmd)
     10 def system(cmd):
---> 11     raise OSError("Not available")

OSError: Not available
```

```python 
!pip install -U transformers
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
Cell In[2], line 3
----> 3 get_ipython().system('pip install -U transformers')
      4 get_ipython().system('pip install -U bitsandbytes')
      5 get_ipython().system('pip install -U accelerate')

File /lib/python3.12/site-packages/IPython/core/interactiveshell.py:2653, in InteractiveShell.system_piped(self, cmd)
   2648     raise OSError("Background processes not supported.")
   2650 # we explicitly do NOT return the subprocess status code, because
   2651 # a non-None value would trigger :func:`sys.displayhook` calls.
   2652 # Instead, we store the exit_code in user_ns.
-> 2653 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))

File /lib/python3.12/site-packages/IPython/utils/_process_emscripten.py:11, in system(cmd)
     10 def system(cmd):
---> 11     raise OSError("Not available")

OSError: Not available
```
SPOフォームカスタマイズの話（中編）

この記事は、Power Apps Advent Calendar 2024 12月23日担当分の記事です。

https://qiita.com/advent-calendar/2024/powerapps

今回のAdvent Calendarでは、Power AppsによるSharePointフォームのカスタマイズの話をします。
12月23日は前編、中編、後編のうちの中編になります。
前編では通常のキャンバスアプリとの違いについて記載しましたが、中編では主に注意点について記載します。

### 選択したアイテムをフォームへ表示
通常のキャンバスアプリでは、ギャラリーコントロールで選択されたレコードを編集フォームに表示させるため、編集フォームのItemプロパティに以下式を書きます。
```
ギャラリーコントロール.Selected
```
一方、カスタマイズフォームでは、編集フォームのItemプロパティに以下式を指定します。
```
SharePointIntegration.Selected
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/4557d446-ae92-1d59-098c-9cae5d9065e7.png)
これにより、リストで選択されたアイテムを編集フォームに表示できます。

### 動作検証時の注意点
カスタマイズフォームは、通常のキャンバスアプリと違ってギャラリーコントロールは不要となりますが、このSharePointIntegration.Selectedは一つ注意点があります。
SharePointIntegration.SelectedはPower Apps Studio上で値を確認できません。
実際にPower Apps Studio上で確認した場合、ID=1のレコードが表示、または空の状態になります。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/56356f62-26f5-9b98-3374-e816d850c41e.png)
そのため、実際の動作確認はフォームを公開してリスト上で行う必要があります。

通常のキャンバスアプリの場合は、ギャラリーコントロールは編集フォームと同じアプリ内に存在しているため、Power Apps Studioでも編集フォームに表示できるのに対して、カスタマイズフォームの場合は、選択されたレコードはSharePointリスト（アプリ外）から取得することになるため、Power Apps Studio上では確認不可と考えます。

### フォームを閉じる
通常のキャンバスアプリではフォームを閉じる処理は無く、ブラウザから✕ボタンを押せば済みましたが、カスタマイズフォームの場合は、フォームを閉じる処理が必要です。
フォームを閉じるのは、RequestHide関数を使います。

公式ページでは以下記載があります。

>すべてのフォームの OnSuccess 式に必ず RequestHide() を含めてください。
>これを忘れると、SharePoint はフォームを非表示にするタイミングを認識できません。
>また、フォームが表示されロジックを実行できる間にすべてのコードが実行できるようにRequestHide()を呼び出した後は重要なコードを実行しないでください。

https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/sharepoint-form-integration#customize-the-default-form

つまり、編集フォームのOnSuccessプロパティにRequestHide関数を指定する必要があります。
しかも、RequestHide関数を呼び出した後は重要なコードを実行しないとあるので、SubmitForm関数（データソース登録・更新時はOnSuccessプロパティの内容が実行されるので）の後の処理は注意が必要です。

### 関数指定時の注意点
データソースをSubmitFormとPatchの両方で更新する際には注意が必要となります。
SharePointIntegrationコントロールのOnSaveプロパティと編集フォームコントロールのOnSuccessプロパティに、以下のように関数を指定すると、Patchの前にRequestHideが実行され、エラーとなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/1530d3ae-ddb4-8e3d-adcb-49b535a35b7a.png)


そのため、OnSaveプロパティのSubmitFormの後には何も処理を記載せず、OnSuccessプロパティにPatch、RequestHideを順番に指定することで、エラーが改善されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/ce311a90-818c-742b-78c7-70f80e90b276.png)

### まとめ
中編では、選択したアイテムをフォームへ表示した際の動作検証の注意点、フォームを閉じる際の関数指定時の注意点について、記載しました。
後編は、カスタマイズフォームの複製に関する内容になります。
【勉強記録】独学の勉強スケジュールの組み方

# はじめに
こんにちは！アメリカに住みながら独学でソフトウェアエンジニアを目指しているものです。
実は先日2カ月間いっていたアメリカの語学学校が終わました。
その2カ月間はソフトウェアエンジニアになるための勉強がメインというよりは英語の学習の合間に継続して勉強することのみを意識していたためそこまでタイトなスケジュールは組まないようにしていました。

しかし、月曜日から本格的に勉強をはじめるにあたって時間スケジュールを組みなおしたので、私のように独学かつフルコミットしてソフトウェアエンジニアを目指しているかたの参考になれば幸いです。
なお、まだソフトウェアエンジニアになれているわけではないので参考程度に見てください

私の現在の状態
- 4カ月独学で勉強継続(そのうちの2カ月は語学学校に行きながらやっていました)
- 現在勉強時間530時間程度。簡単な勉強時間や記録を毎日つけています
- 2カ月毎日Qiitaの投稿とGitHubへのpushとpullrequestを継続

# 勉強スケジュール
現在ソフトウェアエンジニアになるための勉強をはじめて約4カ月がたちましたが独学はとても難しくただ勉強すればいいというものではありません。私が意識していることを書いていきたいと思います

### 勉強してどのようなことがしたいのかを自覚する
独学で挫折する方のほとんどが、「プログラミングを勉強しよう！そのためには、、、」という目標の立て方をするような気がします。
プログラミングという手段がゴールとなってしまっているので、私生活でモチベーションが下がったとき等にあきらめてしまうのだと思います。
自分が達成しようとしているゴールを強く意識し、それを実現するためには、、、と目標からの逆引きをするのが一番効率的だと思います。


### 必要な勉強量を意識する
巷ではソフトウェアエンジニアになるためには、勉強時間は最低1000時間必要といわれています。
1000時間といわれれば、平日で1日8時間勉強し、土日に3時間程度勉強できればそこまで難しくないゴールだと思います。
漠然と時間数に圧倒されないことがまずは重要です。
その後、何を勉強するかをyoutubeやサイトで探しましょう。ここで軽い気持ちでソフトウェアエンジニアになろうとしている方は心がおられると思いますが、そのような覚悟で1000時間以上の学習は難しいと思うので自分の覚悟を確認するという意味でも確認するのがいいと思います。
ちなみに私が行った内容と今後の予定を箇条書きで書いていきます

#### 今まで勉強した内容
- HTML (youtube)
- CSS (youtube)
- HTMLとCSSを使用して模写をする
- web入門(図解からまるわかりwebの技術しくみを読んでみた)
- Javascript(youtube)
- 3つの技術を使用して寿司だのようなタイピングゲームと数字あてゲーム
- Git,GitHubの基礎(Git&GitHubの教本)
- QiitaCLI(Qiitaの記事をCLIで投稿する機能。CLI操作になれるのでおすすめ)
- Linux(Linuxコマンド200本ノック)
- データベース(おうちでまなべるデータベースのきほん)
- SQL(Progate,おうちでまなべるデータベースのきほん)
- Rubyの入門書「ゼロから始めるRuby超入門」
- Rubyの初級~中級「たのしいRuby」
- Rubyのアウトプット50問ほど(現在進行中)


#### 今後やる内容
- Ruby on rails
- REST API
- AWS
- Docker
- Kubernetes
- Terraform
- Linuxの応用
- CI/CD
- Webの仕組み
- Internetの仕組み
- Gitの応用
- Linter
- test
- セキュリティ
- TCP/IP
- リーダブルコード(コードをきれいに書くコツが書いてある)
- React 
- Next.js
- SPA

### スケジュール通り行かなくても自分を責めない
これは意外と思われる方もいるかもしれません。例えば8時に起きて勉強を始める予定が10時に起きてしまった場合多くの人は、寝坊してしまった自分が情けなくなく思い自分を責めてしまうと思います。
独学の場合は、そんなことがあっても気にせず継続させることのほうが重要なのです。
もし寝坊したとしても、勉強以外にとっている時間を削ればいいだけです。その日の勉強総量が減ったとしても、長い目で見ればその日だけなので切り替えて、少しでもいいからその日は勉強しましょう。
今まではしてきませんでしたが、今回からは寝坊したときように8時に起きたパターン以外にも9時や10時に起きたときの勉強スケジュールを組んでおきました。事前にくる困難を想定して置くとダメージが少ないと思います

### 勉強効率がよいのは朝。難しい内容は朝に持ってくる
私は午前中の2時間、お昼から夕方、夜と3段階で勉強する内容を分けてそれぞれ、新しく学ぶ内容、コードなどの実践、そこまで比重が重くない勉強と分けています。
午前中と午後の間には筋トレや英語の勉強、夕方から夜まではご飯を作るなど勉強がずっと続かないようなスケジュールを組むようにしています。
詳しいスケジュールが気になる方はコメントいただければ幸いです。
【PowerApps】メール文作成アプリを作ろう（前編）

# PowerApps AIハブでカスタムプロンプトを作成する方法

PowerApps に新しく追加された **AI プロンプト**機能を利用すれば、日常業務の効率化をさらに進めることができます。本記事では、**「AI ハブでカスタムプロンプトを作成」** する方法について説明します。

この記事は以下の2部構成です：
1. **AI ハブでカスタムプロンプトを作成（前編）** ← 今回はこちら
2. **アプリへの適用（後編）**

---

## **カスタムプロンプト作成の流れ**

1. **PowerApps 詳細メニュー**から「AI プロンプト」を開く。
2. 独自のプロンプトを作成。
3. 入力値を変数として設定し、テストを実行。
4. 出力結果を元にプロンプトを調整。

---

## **手順詳細：PowerApps AI ハブでプロンプトを作成**

### **1. AI プロンプトを開く**

1. PowerApps の画面左メニューから、**「詳細」**をクリックします。
2. **「すべて見る」**を選択し、**「AI プロンプト」**をクリックします。
   - **「独自のプロンプトを作成する」**オプションが表示されます。
   - 以下のような画面が表示されます：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/d09274cc-62e6-01c2-a1f9-4e5ee2e42c99.png)


---

### **2. プロンプトの作成**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/be226b18-9805-e968-219c-b473da2cb6e5.png)

1. **独自のプロンプト**をクリックすると、プロンプト作成画面が表示されます。
   - プロンプト部分に AI にお願いしたい文章を記入してください。
   - 例: 「先方へのメール文を作成してください。」


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/9d02210f-13a6-5519-af6e-460c99f37762.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/e9c8f563-e6f6-bedf-9c3f-9ce4d1d7ef66.png)



2. **プロンプト内容に変数を使用する**場合、画面右側の「入力」セクションで変数を設定します。

---

### **3. 入力値の設定**

1. **「入力」セクション**で、以下を設定します：
   - 入力の名前（例: 「先方の名前」「自分の名前」など）。
   - **テキスト型**で変数を作成。
   - サンプルデータを入力するとテストがしやすくなります。
   - 例: 
     - 入力名：「先方の名前」
     - サンプルデータ：「斎藤太郎」
     
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/131d7d2b-8c2e-93c7-dd52-a6e3c1fd9528.png)


---

### **4. プロンプトへの変数追加**

1. プロンプト部分に、作成した変数を挿入します。
   - 画面右上の「＋追加」から、作成した変数を選択できます。
   - 変数を挿入したプロンプト例：
     ```
     先方へのメール文を作成してください。
     シチュエーション：{シチュエーション}
     先方の名前：{先方の名前}
     自分の名前：{自分の名前}
     ```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/3311fec6-4e72-6905-ba71-26eb200abc61.png)


---

### **5. プロンプトのテスト**

1. **「プロンプトのテスト」**ボタンをクリックし、出力結果を確認します。
2. 以下のようなフォーマルなメール文が生成されます：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/a6b5985a-2d5a-317b-9019-6b8c1361d4f9.png)


---

### **6. 結果を元にプロンプトを調整**

- 出力結果が意図したものに近いか確認します。
- 必要に応じてプロンプト内容を修正し、再度テストを行います。

---

### **7. 最後は名前を変更＆保存**

- プロンプトの名前を変更しましょう。
- 変更後は忘れず「カスタムプロンプトを保存」！！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/d3f98b6a-3f5a-2bf9-e416-3c0dcd969c38.png)

---

## **まとめ**

PowerApps の AI ハブでプロンプトを作成することで、業務に必要なカスタム AI アクションを実現できます。今回は**カスタムプロンプトの作成**までを説明しました。次回の記事では、作成したプロンプトをアプリケーションに統合する方法を解説します！

次の記事もお楽しみに！
GitHubのEnvironmentsで環境変数をシンプルに管理する

CI/CDワークフローで、環境変数をGitHub SecretsやVariablesから設定する際、これまで環境ごとに`ENV_DEV`や`ENV_PROD`のような変数を使用して分岐処理を行っていたのですが、GitHubの「Environments」機能を使うことでシンプルにできたので共有します。

## 従来の方法: 環境ごとの分岐処理
以下のように、ブランチごとに異なる環境変数を設定するために条件分岐を使用していたのですが、この方法だと環境の増加に伴い条件分岐が複雑化し、メンテナンスが煩雑になる課題がありました。

```yml
  build-and-push:
    runs-on: ubuntu-latest
    env: 
      REGION: ${{ vars.REGION }}
      IAM_ROLE_TO_ASSUME: ${{ vars.IAM_ROLE_TO_ASSUME }}

    steps:
      - name: Set environment variables
        run: |
          if [[ "${{ github.ref }}" == "refs/heads/develop" ]]; then
            echo "ENV=${{ vars.ENV_DEV }}" >> $GITHUB_ENV
          elif [[ "${{ github.ref }}" == "refs/heads/staging" ]]; then
            echo "ENV=${{ vars.ENV_STG }}" >> $GITHUB_ENV
          else
            echo "ENV=${{ vars.ENV_PROD }}" >> $GITHUB_ENV
          fi
```

## 新しい方法: Environmentsの活用
GitHubの「Environments」機能を使用することで、条件分岐を排除し、ワークフローを簡潔に記述できます。

### Environmentsの設定方法

1. Environmentの作成
   GitHubリポジトリの「Settings」タブを開き、「Environments」を選択します。各環境(`dev`, `stg`, `prod`など)を作成します。

   ![Environments設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/27fa11f8-4152-4b16-39e1-4cfa163e2a99.png)

2. 変数の登録  
   - 秘密にすべき変数: `Environment secrets`に登録(AWS認証情報など)
   - 公開しても問題ない変数: `Environment variables`に登録(環境識別用の`ENV`など)

## Environmentsを活用したワークフロー
Environmentsを利用すると、以下のようにシンプルなワークフローを記述できます。

```yml
  build-and-push:
    runs-on: ubuntu-latest

    # 環境ごとのEnvironmentsを選択
    environment: ${{ github.ref == 'refs/heads/develop' && 'dev' || github.ref == 'refs/heads/staging' && 'stg' || 'prod' }}
    
    env: 
      REGION: ${{ vars.REGION }}
      IAM_ROLE_TO_ASSUME: ${{ vars.IAM_ROLE_TO_ASSUME }}
      ENV: ${{ vars.ENV }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ${{ env.REGION }}
          role-to-assume: ${{ env.IAM_ROLE_TO_ASSUME }}
          role-session-name: GitHubActions
          role-duration-seconds: 3600

      - name: Login to ECR
        uses: aws-actions/amazon-ecr-login@v2

      - name: Build Docker Image
        run: docker build --build-arg ENV=${{ env.ENV }}
```