OmniAICreator/Qiita-1.07M huggingface dataset:
CHATGPT-APIの利用料金・制限の備忘録

## この備忘録を作った背景
GPTを用いてpdf論文(英語)から、図とかの説明も入ったパワポの自動作成アプリを作ろうと思い立つ(python)。
- pdfの処理にはpymyupdf
- テキストの要約にはGPT
- パワポの作成にはpython-pptx

を使用

GPTの利用にはAPIが必要。

GPT-4のサブスクをしていたらAPIも使い放題だと思っていたが、
とんだ勘違いだったので、
(Qiitaの練習もかねて)備忘録として残す

## GPT-4(およびplugin)とAPIの利用料金は別物

- GPT-4(およびplugin)を使う場合月20ドルかかる（現在は3時間に25回会話できる）
- APIを使う場合は使った量に応じて金額が決まるらしい

## GPT-4(およびplugin)を使う場合
Chat-GPTの3.5は無料で使えるが、4やpluginを用いるときは月20ドルかかる。
3.5と4の違いやpluginについては多分いろんな人が説明してるので詳細は割愛。

### 一応サブスクの方法を書いておく
まず以下にアクセス
[Introducing chatGPT](https://openai.com/blog/chatgpt)


ログインをしてここをクリック
<img width="500" alt="gpt4-1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685065/256f2183-3125-81fb-173f-fae02a1a56d4.png">

ここをクリックして
<img width="500" alt="gpt4-2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685065/0a5325cd-25e1-31f6-928e-f202dbb6f183.png">

この画面からサブスクの登録
<img width="200" alt="gpt4-3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685065/0f571b19-5507-f306-8019-ed2b1945f239.png">




## APIの利用料金と制限
APIを使用すると使用したトークン数によって支払い料金が決まる

#### ①まずはAPIキーを発行する
まず以下にアクセスしてログイン
[Introducing chatGPT](https://openai.com/blog/chatgpt)

"API"をクリックして
<img width="500" alt="gpt4-4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685065/dff4e4f8-1d93-7e81-e50a-cd3c2333169d.png">

"View API keys"をクリック
<img width="500" alt="gpt4-5" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685065/9bb1a307-a964-969d-6f8b-1612de86ba0e.png">

"Create new Secret key"をクリックすればAPIが発行できる。このAPIをpythonコードに張り付ける
<img width="500" alt="gpt4-6" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685065/cbd7379a-a872-1b43-1e78-a9035341c9fd.png">



#### ②支払い方法を登録する
"Billing"の"over view"から支払い方法を登録する。登録しなくても月5ドルまでは使える？
<img width="500" alt="gpt4-7" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685065/ef4d9e88-6968-19a1-a21e-6c0a9e21e6eb.png">


#### ③値段の確認
モデルによって値段が変わる。例えばDavinciの利用は$0.1200/1K tokens。
詳細は以下リンクから
[APIの利用料金](https://openai.com/pricing)



#### ④利用制限を掛ける
"Billing"の"usage limits"ここから「毎月のAPI利用料金の上限」を設定できそう
<img width="500" alt="gpt4-8" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685065/a989194c-150e-a331-d264-2f904c4d8493.png">


#### ⑤利用状況をチェックする
"usage"から「毎月のAPI利用料金」を確認できる
<img width="500" alt="gpt4-9" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685065/3d664781-2f36-37f3-c594-c2bfafc01b1d.png">

#### ⑥1分あたりの上限数を確認する
"Rate limits"1分あたりの上限数を確認できる
RPM（1分あたりのリクエスト数）とTPM（1分あたりのトークン数）
支払い設定前はこれがすごく少ない
例えばgpt-3.5-turboの場合
支払い設定前はRPM 3      TPM 40,000
支払い設定後はRPM 3,500  TPM 90,000
<img width="500" alt="gpt4-9" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1685065/e1473881-f862-4553-0f75-8d5058b67805.png">
個人的JavaScriptのこれだけは覚えとけ！

# 個人的JavaScriptのこれだけは覚えとけ！
### あくまで個人的なメモ
まだ曖昧なとこも記録


## 即時関数
* jsファイルの最初に定義する
* これを定義しないとグローバルが汚れる、、？
* 他のjsファイルで定義できる変数名を奪っちゃう、、？
```
(() => {
  //ここにクラスやインスタンスを定義する
})
```

## DOM
* `document`
全てのHTML要素
### よく使うdocumentに続くやつ
* `getElementById`,`getElementByTagName`
HTMLのIDやタグを指定
* `querySelector('id')`,`querySelectorAll('タグ')`
HTMLのさまざまな要素を指定

※この2つの違いがピンときていない



## e
* イベントオブジェクト
* targetとかcurrentTargetを持ってる
* targetはイベント発生元の要素
* currentTargetはイベントリスナーが登録された要素

例1
* divタグだけがありそのdivタグにイベントリスナーを登録しクリックした場合は、どちらも同じdivを取ってくる

例2
* divタグの子要素にinputタグがあって、同じくdivタグにイベントリスナーを登録し次はinputタグをクリックすると、targetはdivを取ってきて、currentTargetはinputを取ってくる



## クラス
* Rubyと似てる
* 引数名に決まりはないが、`obj`か`object`
* constructor関数はインスタンス生成時に呼び出される、Rubyでいうinitialize関数みたいな
* クラス内でconstは使えない
* クラス内で定義した関数内なら使える
* インスタンスで定義したものを呼び出すときは`obj.変数名`
* クラス内で関数を呼び出すときは`this.関数名`
* クラス内の変数はconst要らない`変数名(){}`
```
class 大文字から始まる単語{
  constructor(obj){
  //定義したい関数や処理など
  変数名(){
  }
}
```

## インスタンス
* クラス外に記述（クラス内でconst使えないため）
```
const 変数名 = new クラス名({
  キー: 値
})
```
特徴量エンジンKaskadaの宣言型クエリ言語 Fenl~述語関数 ifとwhen

# はじめに

先日、以下の記事を発表しました。

https://qiita.com/yoshiyuki_kono/items/7dc7bdad5e02ff986f5d

新しいテクノロジーに触れる時はいつでも楽しいものです。
中でも新しいプログラミング言語（のパラダイム）を学ぶことは、特別に楽しいことです。

ということで、まだまだ勉強中ですが、公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。

本稿情報のソースとして、下記ドキュメントを参照ください。

https://kaskada.io/docs-site/kaskada/main/fenl/fenl-faq.html#choosing-between-when-and-if

# Fenlの述語関数：`if`と`when`
Fenl は 2 つの述語関数を提供します。

##  `if`

関数`if(condition, value)`は、`condition`が `true` の場合は`value`を返し、それ以外の場合はすべて`null`を返します。
関数実行の結果は、標準の連続性ルールに従います。たとえば、 `value`と`condition`が両方とも連続値であれば結果は連続値となり、それ以外の場合は結果は離散値になります。

## `when`
関数`when(condition, value)`は、値が生成されるたびに `value`の 値を返します。の結果は常に離散的であり 、一連の時間で値が生成され、値が生成されます。`condition``true``when``condition``true`

## 典型的な使われ方

これらの関数は、さまざまな方法で値をフィルタリングします。`if` は値を `null` に置き換えることによってフィルタリングするのに対し、`when` は値が生成される一連の時刻を制限することによって値をフィルタリングします。 

Kaskada の計算エンジンはテーブル形式であるため、`if` のパフォーマンスが `when` のパフォーマンスよりも優れている場合があります。`if` は単純な変換規則として適用できますが、`when` では新しいテーブルを構築することになるからです。

別のケースとして、行数が非常に少ないテーブルに対して、後続のオペレーションに対する計算処理を適用できる場合には、'when'の性能が勝る可能性があります。


一般的なガイドラインとしては、値の置換には if を使用し、値のフィルター処理には when を使用します。

たとえば、`if`と`else`を使用して、以下のように値をクリーンアップします。

```javascript
Event.duration | if($input > 0) | else(0)
```

以下は、`when`クエリによって返された行をフィルタリングする例です。

```javascript
Event | when(Event.kind == "conversion")
ヘッドレスCMS入門：初心者向けガイド

## 1. ヘッドレスCMSとは何ですか？
ヘッドレスCMSは、データ管理部分と表示部分が分離された新しい種類のCMS（コンテンツ管理システム）です。この「ヘッド」（表示部）を取り除き、「体」（データ管理部）だけを残すことから、ヘッドレスCMSと呼ばれます。

## 2. ヘッドレスCMSの特徴は何ですか？
ヘッドレスCMSの一番の特徴は、ウェブサイトだけでなく、スマートフォンアプリ、スマートウォッチ、IoTデバイスなど、さまざまなデバイスやプラットフォームに対応可能なことです。これは、コンテンツがAPIを通じて取得され、表示するデバイスは自由に選べるからです。

また、フロントエンド（表示部）とバックエンド（データ管理部）が分離されているため、ウェブデザインやプログラミング言語を自由に選択することができます。

## 3. ヘッドレスCMSのメリットは何ですか？
- 多様なプラットフォーム対応: さまざまなデバイスやプラットフォームにコンテンツを表示できます。
- 技術選択の自由度: 好きなウェブデザインやプログラミング言語を使用できます。
- スケーラビリティ: 需要に応じてリソースを増減できるので、トラフィックの変動に柔軟に対応できます。

## 4. ヘッドレスCMSのデメリットは何ですか？
- フロントエンドの開発負担: フロントエンドの開発は全て自分たちで行う必要があります。これには時間とコストがかかります。
- SEO対策: ヘッドレスCMSでは、SEO（検索エンジン最適化）対策も自分たちで行う必要があります。
- プレビュー機能の制限: 記事を公開前に確認するのが難しい場合があります。

## 5. ヘッドレスCMSはどのように進化していくのでしょうか？
ヘッドレスCMSは、IoTのような新技術とともに進化しています。さまざまなデバイスでのコンテンツ表示が可能になるとともに、新たなプログラミング言語やフレームワークを追加するのが容易になります。また、Jamstackというモダンなウェブ開発アーキテクチャと相性が良く、これを利用して更に効率的なウェブ開発が可能となっています。

## 6. ヘッドレスCMSを使うと何ができるの？
ヘッドレスCMSを利用すると、ウェブサイトだけでなく、スマートフォンアプリやスマートウォッチ、さらにはIoTデバイスなど、多種多様なプラットフォームにコンテンツを配信することができます。例えば、ブログ記事、商品情報、ニュースリリースなどのコンテンツを一元的に管理し、それらをユーザーがどのデバイスからでもアクセスできるようにすることが可能です。

また、フロントエンドのテクノロジーを自由に選択できるため、最新のフレームワークやライブラリを活用して、ユーザー体験に優れたアプリケーションを開発することもできます。

## 7. まとめ
ヘッドレスCMSは、その自由度と多様性、スケーラビリティにより、デジタルマーケティングの世界に新風を吹き込んでいます。しかし、その採用にはフロントエンドの開発コストやSEO対策など、いくつかの考慮点があります。それらを理解し、ヘッドレスCMSが提供する利点を最大限に活用することで、効率的かつ効果的なコンテンツ配信が可能になるでしょう。
OverflowBoxを活用して、分割ラインに親のpaddingを無視させる

下記のようなレイアウトはデザイナーより依頼されることは多い。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332865/6c6b2b7b-983c-d554-36c8-3696db6a9c59.png" width="300">

灰色のdividerが本体のpaddingを受け付けないことがわかる。
普通に書くと、下記のようになる。特に青色の部分は複雑になると、コードが読みづらい。
```dart
Column(
    children: [
        Padding(...) // 青色の部分
        divider,
    　　 Padding(...) // 青色の部分
　　　　　divider,　
    ]
),
```

そこで、`OverflowBox`を活用すると、paddingは全体で共通化されることになり、コードがすっきりになる
```dart
Padding(
    padding: ...
    child: Column(
        children: [
            ... // 青色の部分
            SizedBox(height: 5, 
                child: OverflowBox(maxHeight: 5, child: divider)
            ),
            ... // 青色の部分
            SizedBox(height: 5, 
                child: OverflowBox(maxHeight: 5, child: divider)
            ),
        ]
    )
    
)
```

`OverflowBox`の外を`SizedBox`で囲まないと、overflowになってしまうので、要注意
wsl デフォルトディストリビューションを付け替える方法

# 本記事の内容
NAMEの欄で使用しているディストリビューションを変更します。要するに

これを
```powershell
PS C:\Windows\system32> wsl --list --verbose
  NAME                   STATE           VERSION
* docker-desktop         Stopped         2
  Ubuntu-22.04           Running         2
  docker-desktop-data    Stopped         2
```

こうします
```powershell
PS C:\Windows\system32> wsl --list --verbose
  NAME                   STATE           VERSION
  docker-desktop         Stopped         2
* Ubuntu-22.04           Running         2
  docker-desktop-data    Stopped         2
```
# 一覧
|コマンド|用途|
|--|--|
|wsl --list --verbose|ディストリビューション一覧取得|
|wsl --set-default ディストリビューション名|デフォルトのディストリビューションを変更します|
|wsl -d ディストリビューション名|一時的にディストリビューションを変更して使用します|

# コマンド

環境 windows11
Powershell
## ディストリビューションの一覧を確認する

```powershell
wsl --list --verbose
```

実行結果

```powershell
PS C:\Windows\system32> wsl --list --verbose
  NAME                   STATE           VERSION
* docker-desktop         Stopped         2
  Ubuntu-22.04           Running         2
  docker-desktop-data    Stopped         2
```

## デフォルトディストリビューションを付け替える

```powershell
PS C:\Windows\system32> wsl --set-default ubuntu-22.04
```

確認結果
```powershell
PS C:\Windows\system32> wsl --list --verbose
  NAME                   STATE           VERSION
* Ubuntu-22.04           Running         2
  docker-desktop-data    Stopped         2
  docker-desktop         Stopped         2
```

付け替えられています。

## 一時的に切り替える方法

```powershell
PS C:\Windows\system32> wsl -d Ubuntu-22.04
```

# 参考 
**WSLを使用できるようにする方法**

こちらの素晴らしい記事の通りに行いました。Ubuntu 22.04を使用しています。
https://qiita.com/rubytomato@github/items/a290ecef2ea86ea8350f
技術研修でTODOアプリを作った ( Rails ✕ GraphQL ✕ React )

# やったこと
4月に中途入社した[株式会社mofmof](https://www.mof-mof.co.jp/)の研修でTODOアプリを作りました。

前職では主にLaravelとVueを触っていて、
研修前の段階ではRails、React共にチュートリアルクリア！程度のレベル感でした。

↓作ったやつ
![スクリーンショット 2023-05-30 12.12.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3081679/e9d51241-2d59-d3b4-f1ce-02cd3164cbf0.png)

# 使用技術 / サービス
- Docker
- Ruby on Rails
    - Vite Ruby
    - GraphQL Ruby
    - RSpec
- GraphQL
    - GraphQL Code Generator
- React
    - Apollo Client
    - Chakra UI
    - React Hook Form / Zod
- TypeScript
- Sidekiq
- Heroku
- Amazon S3
- CircleCI

# 機能
- ユーザー/管理者のマルチ認証
- ユーザー/管理者の一覧
- TODOのCRUD
- TODOの期限通知
- TODOのCSVインポート/エクスポート
- 画像のアップロード
- その他オプション機能

# よかったこと

### mofmofの基本技術スタックを学べた
mofmofでは、Rails ✕ GraphQL ✕ Reactの組み合わせを採用することが多いらしく、
案件に入る前に一通り試せた事で不安がかなり解消されました。
特にGraphQLはほぼほぼ未知の段階から、基本的な機能は不安なく実装できる所まで学べたのでよかったです。

### PaaS & CI/CDを触れた
前職ではデプロイ先にVPSを使用することが多く、CI/CDもほぼ触ったことがない状況でした。
今回、Herokuの環境構築やCircleCIの導入を行えたことでだいぶハードルが下がりました。

### 設計について深く考える機会になった
今までは設計に関するレビューをもらえる機会が少なかったのですが、
今回の研修では、各機能の詳細設計部分から全体の設計までしっかりとレビューしていただけました。
定例MTGでは、深掘りして相談したり議論する時間を取っていただいた事で、楽しく深く考えることができてとても良い機会になりました。

### モジャイルを体験できた
mofmofでは、スクラムをカスタマイズした「モジャイル開発」という開発手法を採用しています。
研修でもこの手法に近い進行をすることができ、案件に入った際のイメージを持ちながら進めることができました。

スクラムとモジャイルについて
https://www.mof-mof.co.jp/blog/column/what-is-scrum

# もう1ヶ月あったらやりたいこと / 改善点
今回は実装に必要な部分を都度都度キャッチアップしていたので、
一度体系的に学んだ上で、他の実装方法がないか全体の見直しと+αの実装をしたいなーと思っています。
半年〜1年後くらいに見直してみるのも面白そうな気がしています。

また、ユーザーストーリーの調整やストーリーポイントの見積もり等、
アジャイルに関する反省も多かったので今後に活かして行きたいです。

# 最後に
技術研修期間を2ヶ月用意していただけたことで、落ち着いてキャッチアップすることができました。
実務経験有りでも長めの研修期間をとっていただけるのは、安心感がありとてもありがたかったです。
来月からはOJT形式で案件に入る予定なので、引き続き頑張っていきたいと思います！

また、社内では週1テックトークや、業務時間内で個人開発/自己学習できる制度等が用意されているので、
積極的に活用してスキルアップしていきたいです！
「上司にはミスをして欲しい」という新入社員の本音が納得の理由だった

今年の新入社員と話しているときに、「あー、上司はもっとミスをしてもいいのかもな。」と思ったことがあったので共有します。

<br>
<br>

この記事の内容は、次の通りです。
- 上司あるいは先輩は、新入社員の前でミスをすることによって、彼らを安心させることができます。
- ただし、これは大きなミスをして、周りに迷惑をかけろという意味ではありません。
- 小さいミスはオープンにしていこうぜ！ってことです。

# 不完全な人間は人を安心させる
「先輩方って、みなさん凄いできる方じゃないですか」

唐突に、新入社員のE君はそう言いました。

「そうかな。でも、それは経験があるからだよ。E君もすぐにみんなと同じくらい活躍できるようになると思うよ。」

「そんなの無理ですよ。なんだか…R先輩のようになれる気がしないです。」

彼のいう、R先輩はうちの会社の中でもダントツで早く昇進している私の後輩だ。私も階級ではすでに抜かれてしまっている。

「あ～…たしかにRさんは凄い人だね。でも、実はRさんも最初は失敗続きだったんだよ。」

「えー、そうなんですか？あんなに完璧な仕事をするのに？」

「今はね。実は君が入社する少し前だって、顧客のデータをあやまってメールで…って、あまりこういう話はするもんじゃないな…」

「意外でした。A先輩でも失敗したりするんですね。」

<br>
<br>

そこで、私は彼の言葉に違和感を覚えました。当たり前ですが、ミスをしない人間はいません。新入社員の彼らにとって、我々先輩は完璧な存在とされているのではなかろうか、と思ったのです。

<br>
<br>

「俺は、そんなに活躍してないけどね」

「まぁそうですね」

「（そうなのかよ）」

「でも先輩だって、すごいと思いますよ！」

「ありがとう。今日も設計が甘いって怒られたよ。」

「ちょっと聞いてました（笑）。まぁでもそのおかげで話やすいですよ！」

「それはよかった。今も2人で飲みに来ているわけだしね。」

<br>
<br>

私はふと、「まぁでもそのおかげで」というのはどういうことなのか気になった

「なぁ、さっきの…」

<br>
<br>

「ラストオーダーの時間です。」

若い女の店員がこちらを見ていた。

「（もうそんな時間なのか、これ以上遅くなるワケにもいかないか…）」

「あ、私はいいです。E君は最後になんか飲む？」

「いえ、私も大丈夫です！」

<br>
<br>

そして、会計を済ませ、たわいもない会話をしながらE君と別れた。

<br>
<br>

しかし、家に帰ってからも「まぁでもそのおかげで」が私の中でひっかかっていた。

<br>
<br>

# 「まぁでもそのおかげで」とはどういう意味だったのか

気になっているからといって、今さら、あの時の話をすることはできません。私は、飲みの席の話は覚えてないことにしているからです。

なので、自分なりに解釈するしかないのですが、そういえば、私にも同じような経験があるなと思いました。「上司がミスをしていると安心したなぁ」っと。

<br>
<br>

例えば、教育係の先輩が風邪で休んだとき「先輩だって人間なんだから風邪くらいひくよな」と安心したし、部長が役員に「お前ら！何年やってきてるんだ！」って怒られてるのをみて「部長でも怒られることあるんだ」と思ったものです。

そして、私は今でも部長クラスの上司は完璧な存在だと思ってしまっているなぁと思いました。何でも教えてくれるし、自分だけでは解決できない課題にも、最高のアドバイスをくれる。

「いやー。うちの部長マジで凄いわ！」と私も思っちゃってるんですよね。「なんだか自分とは違う人だなぁ」と。

<br>
<br>

なるほど、これか、とその時に思いました。

<br>
<br>

# ミスがメリットになることがある
話は変わりますが、私の先輩に一人とても厳しい方がいます。どんなプロジェクトでも果敢に挑戦しながらも、無駄なリスクは取らない。絶えず自分自身とチームに高い基準を求めていました。

ある日、先輩はプロジェクトで大きな失敗をし、多額の損失を被ってしまいます。しかし、それで彼への信頼がなくなったのかというと、そうではありません。むしろその逆で、彼が素直に失敗を認め、メンバーにリカバリーをお願いしたとき、それまで恐縮していたメンバーからの信頼がより深まったと言うのです。

<br>
<br>

子育てにも同じような話があります。

厳格な父親をもった子どもは、その期待に応えることができず、自分の能力に悩んでいました。ある日、子は友人と一緒に禁止されていた場所に行き、問題を起こしてしまいます。委縮する子に、父親は怒るわけではなく、笑ってこう言ったそうです。

「お前は本当に俺の子だな！俺もお前くらいの時に同じことをやったよ！当時、叔父にバカみたいに怒られたものさ！」

<br>
<br>

子は驚きました。

「父さんも同じことを？」

父親の方針は変わりませんでしたが、その1件以降、子は父親に委縮することなく勉学にはげむことができたということです。

<br>
<br>

これらは、自分よりも上位の人間のミスがいい方向に転がるいい例です。むしろ、それがあって成功する性質のものだといえます。

<br>
<br>

# 完璧じゃないことに意味がある
話は、後輩の「まぁでもそのおかげで」に戻ります。

彼にとって、私は相談しやすい先輩なのでしょう。私が完璧な存在ではないと分かっているから、立場の違いはあれど「あの人は自分とは違う、だから全然参考にならない」とは思われていないと思います。

私としても、純粋に後輩に頼られるのは嬉しいです。

<br>
<br>

『こういうのって大事だなぁ』と思ったわけですよ。

<br>
<br>

**

<br>
<br>

「まぁ、でも上司が失敗したら気が楽になりますよ。ぶっちゃけ、失敗して欲しいなって思うときもあります。」

この気持ちを誤解を与えずに的確に表現するのは難しいのですが、そういうことです。

<br>
<br>

「先輩！全社宛にメール送っちゃってますよ！」

「ぇ…あ、やべぇ！」

<br>
<br>

まぁ、ミスし過ぎるのも、あまり良くないと思います。

<br>
<br>

以上です。
Azureを使ってAzure Arcで接続されたサーバー上でスクリプトを実行させる

### Custom Script Extensionをインストールする

VMの拡張機能としてCustom Script ExtensionをインストールすることでAzure Arcで接続されたサーバー上でスクリプトを実行することが可能です。
スクリプトはAzure Blob Storageに格納されたものか、対象のVMからルーティング可能な場所であれば実行することができます。今回はAzure Blob Storageに格納したスクリプトを実行します。

![customscript1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/134735cb-f7d0-7267-7d80-81e29a4aab8a.png)
![customscript2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/ceb1e428-ec4c-3887-1a85-f5578b592f63.png)

この拡張機能を使うことで一回だけ行いたいタスクをAzureから簡単に実行させることができます。定期実行したいものはタスクスケジューラやAzure AutomationのHybrid WorkerExtensionなど別の方法がよいでしょう。いずれにしてもローカルの端末にログインすることなく、Azureから操作できてしまう点が便利です。
細かな制限事項は以下参考のMicrosoftドキュメントをご確認ください。

### 参考
- [Windows でのカスタムのスクリプト拡張機能](https://learn.microsoft.com/ja-jp/azure/virtual-machines/extensions/custom-script-windows)
- [How to Run Custom Scripts on Azure Arc Enabled Servers](https://www.thomasmaurer.ch/2020/07/how-to-run-custom-scripts-on-azure-arc-enabled-servers/)
Migration authtoken.0001_initial is applied before its dependency account.0001_initial on database 'default'.

djangoでmigrateしていると

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration authtoken.0001_initial is applied before its dependency account.0001_initial on database 'default'.
というエラーが出た。

~~~Python:settings.py
INSTALLED_APPS = [
    'account.apps.AccountConfig',
    # 'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
    'pms_api',
    'rest_framework',
    # 'rest_framework.authtoken',
    'storages',
]
~~~

rest_framework.authtoken が悪さしてるっぽいので、コメントアウトしてマイグレーションすると通る
済んだらコメントアウトを消すこと。
Ruby silver 模擬問題解説4

Ruby silverの模擬問題を抜粋して解説をしていきます。

下記コードの出力を4択から選ぶ問題になっています。
```
score = 50
battle = score < 70 ? "勝ち" : "負け"
p battle
```

1.“勝ち”
2.エラーになる
3.“負け”
4.true

まず、1行目で変数scoreに50を代入します。
```
score = 50
```
次に、2行目で[三項演算子](https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html)を使ってif文をスリムに書いています。
その結果をbattleという変数に代入してます
```
score < 70 ? "勝ち" : "負け"
```
通常のif文だとこのように書かれます。
```
if socore < 70
  "勝ち"
else
  "負け"
end
```
次に、3行目でbattleを出力してますので結果として“勝ち”が表示されます。
解答としては、１番になります。
Resteasy

まずはWildflyへのデプロイ方法としては、Mavenパッケージを使用してWildflyへデプロイするのがいいと思います。

WildflyでMavenパッケージを利用するには、プロジェクトルートのpom.xmlに以下を追加します。

<plugin>
  <artifactId>maven-wildfly-plugin</artifactId>
  <version>2.0.0</version>
  <configuration>
    <hostname>127.0.0.1</hostname>
    <serverConfig>standalone-full.xml</serverConfig>
    <filename>jaxrs-resteasy.zip</filename>
  </configuration>
  <executions>
    <execution>
      <id>deploy</id>
      <phase>install</phase>
      <goals>
        <goal>deploy</goal>
      </goals>
    </execution>
    <execution>
      <id>undeploy</id>
      <phase>clean</phase>
      <goals>
        <goal>undeploy</goal>
      </goals>
    </execution>
  </executions>
</plugin>

プロジェクトルートで次のコマンドを実行してMavenを使ってWildflyへのデプロイを行います。

mvn wildfly:deploy

この時点で、Wildflyのデプロイ完了です。その後、Wildfly上でOpenapi-generator-cliコマンドを使用して生成されたjaxrs-resteasyを起動するには、次のコマンドを実行します。

java -jar jaxrs-resteasy.jar -Djboss.as.management .binding.address=127.0.0.1

上記のコマンドを実行すると、jaxrs-resteasyが起動し Wildfly上で動作するようになります。

Wildfly上で任意のjaxrs-resteasyを起動するには、コマンドラインから上記のコマンドを実行するか、Mavenプロジェクトのpom.xmlに新しいプラグインを追加する必要があります。追加したプラグインを使用してJARファイルを実行するとWildfly上で動作します。以下は追加した例です。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.1.2</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>
                    org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
                </mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

上記記載したプラグインを使用して実行する場合、次のコマンドを実行してjaxrs-resteasyを実行します。

mvn jar:jar
mvn exec:java -Dexec.args="-Djboss.as.management.binding.address=127.0.0.1"

このように、Wildfly上でOpenAPI-generator-cliコマンドで生成されたjaxrs-resteasyを起動することができます。
Qiitaデビュー

前職パン職人の私が、半年ほど前に友人の会社の元始めたこのお仕事。
全く知識がない状態で始め、現状はflutterでdartを使いアプリのUIを作れるようになった程度。　

効率よくスキルや知識を身につける目的（他にもあるが）とし、
「３ヶ月でアプリを一人でリリースするところまでやってみろ」と
本日仰せつかったので、その戦いの記録をここに残していこうと思う。　

何をするにも初めてで完全に手探りだが、まずはQiitaの投稿テストも併せてここまでとする。
SQLiteからPostgreSQLに変更する方法

##  概要
RailsアプリケーションをHerokuにデプロイを行う矢先、HerokuにSQLiteに対応していない事に気づき、PostgreSQLに変更致しました。その手順を紹介させて頂きます。

## 手順
### ステップ1: PostgreSQLをインストール
まずはじめに、PostgreSQLをシステムにインストールします。Macの場合、Homebrewを利用してインストールできます。
```bash
brew install postgresql
```

### ステップ2: Gemfileを更新する

次に、RailsアプリケーションのGemfileを更新します。`sqlite3`の代わりに`pg`（PostgreSQL）のgemを使用します。

```ruby:Gemfile
gem 'pg'
```

Gemfileを更新したら、以下のコマンドで新しいgemをインストールします。

```bash
bundle install
```

### ステップ3: database.ymlを更新する

`config/database.yml`ファイルを更新して、PostgreSQLデータベースを指すようにします。
以下に例を紹介させて頂きます。今回はアプリケーション名をmyappとさせて頂き、開発環境のデータベース名はmyapp_development、テスト環境のデータベース名はmyapp_testとします。
補足として、my_app_developmentやmy_app_testでも、Rubyの命名規則として問題ありません。

**1つ目の設定**

こちらは、ローカルでの開発とテストでは特定のデータベースユーザーとパスワードを使用し、本番環境（Heroku）ではDATABASE_URLを使用するシナリオを想定しています。

```yaml:config/datebase.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['DATABASE_USERNAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  host: <%= ENV['DATABASE_HOST'] %>

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  url: <%= ENV['DATABASE_URL'] %>

```
**2つ目の設定**
こちらは、全ての環境（ローカル開発、テスト、本番）で特定のデータベースユーザーとパスワードを使用し、本番環境（Heroku）では加えてDATABASE_URLを使用するシナリオを想定しています。

```yaml:config/datebase.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: myapp_development
  username: <%= ENV['DATABASE_USERNAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  host: <%= ENV['DATABASE_HOST'] %>

test:
  <<: *default
  database: myapp_test
  username: <%= ENV['DATABASE_USERNAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  host: <%= ENV['DATABASE_HOST'] %>

production:
  <<: *default
  url: <%= ENV['DATABASE_URL'] %>
```
`一般的には、Herokuを使った本番環境ではDATABASE_URLを使用し、それ以外の環境では独自のユーザー名とパスワードを使用する1つ目の設定が良いと思います。`しかし、どのような環境を持っているのかなど、どの設定が適切か場合によると思います。

### ステップ4: データベースを作成する

新しい設定でデータベースを作成します。

```bash
rails db:create
```

### ステップ5: マイグレーションを実行する

最後に、データベースのマイグレーションを実行します。

```bash
rails db:migrate
```
以上の手順で、RailsアプリケーションのデータベースをSQLiteからPostgreSQLに変更することができます。
Error: Unable to resolve module ./Libraries/Components/DatePicker/DatePickerIOS from ~node_modules/react-native/index.js: 

# Xcode 14.1にダウングレードして `Unable to resolve module ./Libraries/Components/DatePicker/DatePickerIOS` エラーを解決する

エラーに直面することは開発者の日常生活の一部ですが、この記事では特に混乱を招く可能性のある一つ、`Unable to resolve module ./Libraries/Components/DatePicker/DatePickerIOS` エラーについて説明します。これはReact Nativeを使用してアプリを開発している場合に出会う可能性があります。

## 問題のエラー

以下のようなエラーが表示された場合、解決策が必要です:
```
Error: Unable to resolve module ./Libraries/Components/DatePicker/DatePickerIOS from /Users/~/node_modules/react-native/index.js:
```

このエラーメッセージは、特定のモジュール、ここでは`DatePickerIOS`が見つからないことを示しています。これは通常、該当のモジュールが削除されたか移動された場合に発生します。

## 解決策: Xcodeを14.1にダウングレードする

解決策として、Xcodeをバージョン14.1にダウングレードすることを推奨します。これにより、適切なリンクが再度機能し、エラーが解消される可能性があります。

### ダウングレード方法

1. 最初に、現在のXcodeアプリを削除します。Finderを開き、`Applications`ディレクトリに移動してXcodeをゴミ箱にドラッグします。

2. 次に、Apple Developerサイトから過去のXcodeバージョンをダウンロードします。[ここ](https://developer.apple.com/download/more/)をクリックして、Xcodeのバージョン14.1をダウンロードしてください。

3. ダウンロードが完了したら、ダウンロードしたXcode-x.x.x.xipファイルをダブルクリックして解凍します。

4. 解凍した後、新しいXcode.appを`Applications`ディレクトリにドラッグします。

5. 最後に、ターミナルを開き、次のコマンドを実行してXcodeのバージョンを確認します:

```bash
$xcodebuild -version      
Xcode 14.1
Build version 14B47b
アンドロイドのリリースに苦労した😅

# Flutterのアンドロイドリリースに苦労した

### 問題

アプリを使うためにFirebaseのGoogle認証サービスを使っていましたが、アプリのログインができないとリジェクトされました。Play Storeに提供していたログイン情報のパスワードを変更したり、テスト用のアカウントを別に作って提供してみたが、以下の内容が含まれているメールが返ってくるだけ...

<font color="red">問題: ログイン認証情報が無効または不完全である</font>
<font color="red">お客様のアプリにアクセスするために必要な有効なデモ / ゲスト アカウントまたは有効なユーザー名とパスワードが提供されていません。</font>

### 結論

結論としては firebaseコンソールに本番用SHAキーを追加してなかったからです。
<font color="gray">~~ログイン認証情報間違ってないじゃん...~~</font>

### 設定方法


1.「Google Play Console => リリースしたいアプリ => 設定 => アプリの完全生 => アプリの署名」から「SHA-1 証明書のフィンガープリント」と「SHA-256 証明書のフィンガープリント」を確認する

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121042/4bee2433-b24a-2e72-a399-4310819a1dc1.png)

2.「Firebaseコンソール => プロジェクト概要 => プロジェクトの設定 => Androidアプリ => フィンガープリント追加」にGoogle Play Consoleで確認した「SHA-1」と「SHA-256」で確認したkey情報を入力する

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121042/8b3cbfd9-5d1d-ae64-4786-30c87bd2550a.png)

以上の方法で本番用のSSH key設定をしたらリリースできました🎉🎉🎉
LangChainドキュメントのまとめページ

こちらも絶賛勉強中なのでまとめていきます。

# 全体

- [\[翻訳\] LangChainにようこそ](https://qiita.com/taka_yayoi/items/f855a9d6eba41e6b723c)
- [\[翻訳\] LangChainで使用するコンセプト](https://qiita.com/taka_yayoi/items/2f537069c5a196ef91b1)
- [\[翻訳\] LangChainのクイックスタートガイド](https://qiita.com/taka_yayoi/items/805fbbfcf3276b06b4c9)
- [\[翻訳\] なぜLangChainなのか？](https://qiita.com/taka_yayoi/items/b979f0b6982d95e2675f)

# プロンプト

- [\[翻訳\] LangChainにおけるプロンプトのコンセプトガイド](https://qiita.com/taka_yayoi/items/6860127b4f7950365694)
- [\[翻訳\] LangChainにおけるプロンプトのGetting Started](https://qiita.com/taka_yayoi/items/7f655dd053ddf03dd43d)

# プロンプトテンプレート

- [\[翻訳\] LangChainにおけるプロンプトテンプレートのGetting Started](https://qiita.com/taka_yayoi/items/3effed7c88dd3d2f4a85)
- [\[翻訳\] LangChainのチャットプロンプトテンプレート](https://qiita.com/taka_yayoi/items/688438ff8ec58cbbfe8f)

# LLM

- [\[翻訳\] LangChainのLLM](https://qiita.com/taka_yayoi/items/8d7d2d279b46e8f574b6)


# ユースケース

- [\[翻訳\] LangChainにおけるドキュメントに対するQ&Aのコンセプトガイド](https://qiita.com/taka_yayoi/items/8f3251b44f4a6c7f5c64)
- [\[翻訳\] LangChainにおけるドキュメントに対するQ&AのPythonガイド](https://qiita.com/taka_yayoi/items/aa9c53bd0fb97e0a4513)
- [\[翻訳\] LangChainのSQLDatabaseChain](https://qiita.com/taka_yayoi/items/7759f31341b91bc707f4)

# LCEL

- [\[翻訳\] LangChain Expression Languageを使い始める](https://qiita.com/taka_yayoi/items/f09678fe6dcd57c8d2b3)

# LangGraph

- [\[翻訳\] LangGraphのマルチエージェントシステム](https://qiita.com/taka_yayoi/items/f25835e123a251ab102a)

# LangMem

- [\[翻訳\] エージェントの長期記憶のためのLangMem SDK](https://qiita.com/taka_yayoi/items/ed6123e4166a8390f6f5)

# Databricksインテグレーション

- [\[翻訳\] LangChainのDatabricksインテグレーション](https://qiita.com/taka_yayoi/items/073057f869a0c5cecd78)
- [\[翻訳\] LangChainによるDatabricksでサービングされているLLMの呼び出し](https://qiita.com/taka_yayoi/items/6c6e0744de5681f21d96)
GitHubActionsで放置されたIssueをSlack通知してみた

# はじめに

気づかずに長期間Issueが放置されている経験は一度はあると思います。
最近GitHubActionsを触っており、せっかくなので放置されてるIssueを通知してくれるGitHubActionsを作成してみました。

# 概要

一定期間放置されてるIssueに「inactive」ラベルを付与し、そのラベルが付与されたIssueはSlack通知されるようになります。

# 使用するAciton

GitHubのMarketplaceに一定期間放置されているIssueやPRに対してラベルの付与やクローズなどが実行できる便利なActionがあるので使用します。
https://github.com/marketplace/actions/close-stale-issues

# 放置されたIssueへラベルを付与する

リポジトリ内で「.github/workflows/add-label.yaml」を作成します。

![スクリーンショット 2023-05-23 23.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330132/a8e08dac-ce6a-405e-f21b-8dbff5ca1d38.png)

add-label.yaml内に以下を記載します。

```yaml
name: Add label to inactive issues
on:
  schedule:
    - cron: "0 0 * * *" # UTC表記 毎朝9時の実行

jobs:
  add-label:
    runs-on: ubuntu-latest
    steps:
      - name: add-label
        uses: actions/stale@v5
        with:
          repo-token: ${{ secrets.SAMPLE_TOKEN }}
          stale-issue-label: "inactive"
          days-before-issue-stale: 1
          days-before-issue-close: -1
          days-before-pr-stale: -1
          days-before-pr-close: -1
```

各パラメーターの説明は以下の通りです。

`repo-token`
Personal Access Tokenを発行し、secretsにSAMPLE_TOKEとして設定しています。

`stale-issue-label`
Issueがdays-before-issue-stale で設定した日数を超えてた場合、指定したラベルを付与できます。

`days-before-issue-stale`
Issueを放置してもいい日数を設定します。

`days-before-issue-close`
設定した日数を過ぎるとIssueをクローズできますが、今回はクローズしないので-1を設定します。

`day-before-pr-stale`
PRを放置してもいい日数を設定しますが、今回は不要なので-1を設定します。

`days-before-pr-close`
設定した日数を過ぎるとPRをクローズできますが、今回はクローズしないので-1を設定します。

実際にdays-before-issue-stale日数が経過するとIssueに「inactive」のラベルが付与されます。

![スクリーンショット 2023-05-23 22.33.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330132/9dcae0a0-1124-8b71-bb42-5c028b2e1328.png)

# Slackへ通知する

追加でリポジトリ内で「.github/workflows/notify.yaml」を作成します。

![スクリーンショット 2023-05-23 23.31.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330132/0408f577-6334-5d7d-27a7-90e00089363b.png)


notify.yaml内に以下を記載します。

```yaml
name: Slack notify
on:
  issues:
    types:
      - labeled # ラベル付与がトリガー
jobs:
  notify:
    if: github.event.label.name == 'inactive'　# inactiveのラベルが付与された場合のみ実施
    runs-on: ubuntu-latest
    steps:
      - name: notify
        uses: tokorom/action-slack-incoming-webhook@main
        env:
          INCOMING_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
        with:
          text: Issueが長期間放置されてます。
          attachments: |
            [
              {
                "fields": [
                  {
                    "title": "Issue URL",
                    "value": "${{ github.event.issue.url }}"
                  }
                ]
              }
            ]
```

実際にIssueに「inactive」のラベルが付与されるとSlackへ通知されます。
今回はIssueのURLだけというシンプルな通知ですが、いろいろ工夫できそうです。

![スクリーンショット 2023-05-24 0.17.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330132/b6647cad-5984-e7fc-e98c-db3a4932f9cd.png)

# おわりに

ほんの遊び心で作ってみましたが、便利なActionが色々とあるので実際の業務でも活用できそうです。
今回も閲覧ありがとうございました！
Herokuへのデプロイ手順

## 概要
Herokuへのデプロイ手順について記述させて頂きます。
具体的なHerokuへのデプロイ手順は、以下の手順で実施します。

## 準備
### Heroku CLIのインストール
まずはじめに、Heroku CLIをインストールします。Heroku CLIはコマンドラインからHerokuのアプリケーションを管理するためのツールです。

```bash
$ brew install heroku/brew/heroku
```
## 手順(GithubにプッシュしてHerokuに自動デプロイする場合)
上記、Heroku CLIをセットアップした後に、以下にステップを示します。

### 1. Gitを使用して変更をコミット
まずは、ローカルの作業ディレクトリで変更をコミットします。

```bash
# 変更をステージングする
git add .
```

### 2. ステージングした変更をコミット
git commit -m "Your commit message"
2. GitHubに変更をプッシュします

次に、変更をリモートのGitHubリポジトリにプッシュします。

```bash
# GitHubのリモートリポジトリに変更をプッシュする
git push origin master
```

### 3. Herokuにログインします

Heroku CLIを使用してHerokuにログインします。

```bash
heroku login
```

### 4. データベースのマイグレーションを実行

Herokuでデータベースのマイグレーションを実行します。

```bash
# Herokuでデータベースのマイグレーションを実行する
% heroku run -a your-app-name rails db:migrate
```
`your-app-name`はHeroku上で作成したアプリケーションの名前に置き換えて下さい。
これらの手順を行うと、アプリケーションがHerokuにデプロイされます。
何か問題があれば、以下に記述している、Herokuのログを確認方法を用いてご確認下さい。

## 手順(Herokuに直接デプロイする場合)
私は、以下の方法は使用してない為、一応記述させて頂いておりますが、手順に何か間違いがある場合が御座います。その際はお伝え頂けると幸いです。

### 1. Herokuへのログイン

次に、Heroku CLIを使用してHerokuへログインします。

```bash
$ heroku login
```

### 2. Herokuアプリの作成

アプリケーションのディレクトリに移動して、新しいHerokuアプリケーションを作成します。
今回はアプリケーション名を`my-project`とします。

```bash
$ cd my-project/
$ heroku create
```

### 3. Herokuにデプロイ

次に、作成したアプリケーションをHerokuにデプロイします。

```bash
$ git push heroku master
```
私の場合は、GitHubのリポジトリのmainブランチにプッシュして自動でデプロイされるよう設定していたので、git-flowを行い、リモートへプッシュ致しました。

### 4. データベースのマイグレーション

最後に、データベースのマイグレーションを実行します。

```bash
$ heroku run rake db:migrate
```
## 確認
### エラーチェック

デプロイに成功したか確認します。もし何らかの問題が発生していた場合、次のコマンドでHerokuのログを確認することができます。

```bash
$ heroku logs --tail
```
ブランディングの一環として会社のロゴアニメーションを（勝手に）作ってみた

2024年に創立20周年を迎える弊社のブランディングの一環として、「勝手に」コーポレートロゴのモーションロゴを作ってみました。

# 目的
リビン・テクノロジーズ株式会社の視覚的なアイデンティティを向上させる目的で、他社とは異なる動きやアニメーションを持つモーションロゴを作成し、競争の激しいビジネス環境で差別化を図るための手段として活用する。

# モーションロゴを作るメリット
モーションロゴは、動画やウェブサイトなどのメディアコンテンツで使用され、独自性とプロフェッショナリズムを強調する効果的な手段となります。
具体的には以下の5つが考えられます。
1. 目立つ存在感を与える：アニメーション化されたロゴは、スタティックなロゴよりも存在感を与えることができ、そのブランドが活発であることを連想する可能性があります。

2. 視聴者の記憶に残る：アニメーション化されたロゴは、動きを通じて視聴者の脳に刻まれやすく、印象的なイメージを残すことができます。それにより、視聴者がブランドをより良く覚えてくれる可能性が高くなります。

3. ブランドの個性を表現する：アニメーション化されたロゴは、ブランドの個性を表現するための有効な手段です。動きやアニメーションのスタイルを選択することで、ブランドの持つ特徴や価値観を表現することができます。

4. ブランドの先進性をアピールする：アニメーション化されたロゴは、ブランドの先進性をアピールすることができます。これにより、視聴者はブランドが常に進化し、最新のトレンドに敏感であることを感じる可能性があります。

5. ソーシャルメディアでのシェアが促進される：アニメーション化されたロゴは、ソーシャルメディアでのシェアにも適しています。動画フォーマットのため、視聴者は動画を再生して、ブランドのイメージをより深く理解することができます。

# 表現したかったこと
弊社のミッションは、
**Webテクノロジーの力で世界を変える！「我々にしかできない」「我々だからこそできる」世の中にまだ無いサービスを作り出すテクノロジーカンパニー。**
です。

弊社のロゴタイプ、シンボルマークともに丸みはなく先鋭的、都会的な印象で、回路図のようにも見えます。これをモーションに落とし込むと例えば以下の3つの例のような動きがいいのではないかと推測します。　　

### A）モーションロゴにテクノロジー感とモダンさを反映させる
例えば、ロゴが現れる際に回路図が形成されたり、光が伝わるような効果を持たせることができ、ロゴの要素が組み合わさって最終的なロゴマークが形成されるといった表現を加えることで、製品開発の過程や技術的な側面を表現できます。

### B）イノベーションやクリエイティビティを強調する要素を盛り込む
ロゴが表示される際にコードが組み立てられる様子を表現する。また、ロゴ要素が互いに連携し合ってソフトウェアの動作やデータのフローを表現することで、技術的な専門知識や高度なソフトウェア開発能力をイメージさせる。

### C）ダイナミズムとクリエイティブな要素を取り入れる
例えば、ロゴが表示される際にデジタルなエフェクトや動きを加え、ロゴ要素が相互に関連し、情報のフローが視覚的に表現されることで、マーケティングの戦略的な視点やデータ駆動のアプローチを強調する。

今回は上記のA）の案から2パターンを作成しました。
#### A-1）LVNというロゴタイプを回路図のように光が伝わるにアニメーション

https://youtu.be/_pprZaJKIic

#### A-2）シンボルマーク（LとTの文字を模した）を回路図に見立ててマークが出来上がるアニメーション

https://youtu.be/Fm7DigRsEFc

今回はコーポレートロゴのアニメーションを「勝手に」作成しましたが、正式に作成する機会があればよりストーリーテリングな長尺なものにも挑戦したいと思います。
【Xcode】CocoaPods,Carthage使用時の.gitignoreファイル

# はじめに
CocoaPods,Carthage使用時の.gitignoreファイルについて調べ直したのでメモ
考え方や作るアプリによって違ってくると思いますが目安として

# CocoaPodsの場合
### 共有しないもの
#### Pods/ ディレクトリ
リポジトリのサイズが大きくなり、クローンやフェッチの時間が増加する可能性があるので共有しない｡
#### .xcworkspace ファイル
pod installを実行すると.xcworkspace ファイルが生成されるので共有しない
### 共有するもの
#### Podfile
#### Podfile.lock
共同開発のときお互いにもってないとバージョンが変わって作業できないので共有するべきもの


#### という理由で.gitignoreは
```
# CocoaPods
/Pods/
*.xcworkspace
```
となる


# Carthageの場合
### 共有しないもの
#### Carthage/ディレクトリ
容量が大きく
```
carthage bootstrap --platform iOS
```
したときに作成されるため共有しない
### 共有するもの
#### Cartfile
#### Cartfile.resolved
この2つはCocoaPodsのPodfileとPodfile.lockみたいなものでプロジェクトの依存関係とバージョンを定義していますので共有する

#### .gitignoreは
```
# Carthage
Carthage/Build
```
となります

# 終わりに
間違っているところがあったらご指摘いただけると幸いです!

# 参考

https://guides.cocoapods.org/using/using-cocoapods.html


https://github.com/github/gitignore/blob/main/Swift.gitignore

https://qiita.com/kasajei/items/8c9ba3030c3eae736e89
[SwiftUI]NavigationViewがiPadだと真っ白

# 概要

NavigationViewを使って実装し、iPadで動作確認したらこんなことに。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352230/44785a24-403e-3a1e-e303-35daa29b767e.png)


左上のアイコンを押したらiPhoneの時に表示されるViewが出てきます。

# **環境**

Xcode : 14.3

Swift : 5.8

SwiftUIを使用

# 原因

iPhone とiPadでNavigationViewには表示の仕方に差異があるため

# 解決策

```swift
NavigationView{

	//Contents

}.navigationViewStyle(StackNavigationViewStyle())
```

このように

**.navigationViewStyle(StackNavigationViewStyle())**

をつけてあげることでうまくいきます。

# **まとめ**

iPhoneとiPadの互換性を意識すると気にすることがかなり多くなりますね。。

いいね、ブックマーク、フォローしていただけると勉強の励みになりますので是非お願いします。😉

- 追伸　--

Twitterで日々の学習風景を投稿してます。

[@Ren_yello](https://twitter.com/Ren_yello)

## 参考にさせていただいたサイト様

https://developer.apple.com/forums/thread/127682
OSSポリシーをGitHubのパブリックリポジトリに公開した話

# 本記事が目指すこと
- 前回の記事[OSSポリシーを策定し施行された話](https://qiita.com/dai_zamurai/items/8423604a2d6d201e4154)で取り上げた弊社のOSSポリシーが本日(2023年5月30日)公開されたので、この日を記念し簡単に紹介する
- CC0ライセンスとしてOSSポリシーの全文を公開しているため、私が他社事例を参考にしたように、誰かの参考になれば嬉しい

# 注意
- 投稿時点(2023/5/30)での情報に基づくため、今後は内容が変更されている可能性があります
- なお、本記事は筆者が所属する会社と関係なく、個人の記事であることをご了承ください

# 背景
- 筆者は、ちゅらデータ株式会社に務める会社員であるが、就業時間中に職務としてのdbt-coreのOSS活動を始めた（OSS活動自体が初めての経験）
- CLAの署名に関して承認フローが制定されておらず、不便さや曖昧さを感じたため、弊社で他社事例を参考にOSSポリシーを策定した
    - OSSポリシーをなぜ策定することになったかについては以下の記事を参考
        - [dbt-coreにおけるOSS活動ことはじめその1 ~ CLAの話 ~](https://qiita.com/dai_zamurai/items/6811e1d4ca9e2fad1ca7)
        - [OSSポリシーを策定し施行された話](https://qiita.com/dai_zamurai/items/8423604a2d6d201e4154)

# 本編
弊社のOSSポリシー(以下、本ポリシーと呼ぶ)を公開した。全文は以下で確認できる
- https://github.com/churadata/oss-policy/blob/main/OSS-POLICY.txt

本ポリシーはCC0ライセンスとして公開されているため、自由に引用、参考にしていただいて構わない。誰かの参考になれば嬉しい

なお、本ポリシーは、主に[READYFORのOSSポリシーを公開しました](
https://tech.readyfor.jp/entry/2022/09/01/120000)を参考に作成されたものである。この場を借りて感謝申し上げたい。
ほとんど同じ内容であるが、主な違いとして本ポリシーは「**職務におけるOSS活動のうち、特に既存のOSSに対してコントリビュートすること**」を対象としている

- 本ポリシーを策定するにあたり、エンジニア側の要望は以下の2点だった
    1. 許諾を取らずとも、CLAに自分自身で署名できるようになること
    1. 著作権をエンジニアに譲渡すること
 - 上記の要望を満たすポリシーとしてREADYFORのポリシーは適用範囲が広かったため、最低限の内容に絞った
    - 例：READYFORのポリシーで定められている「当社OSSの公開・管理」などは本ポリシーでは定めていない

そのため、本ポリシーの第4条1.(1)
> （1）	OSS活動のため、OSSの管理機関に対して、自らが作成した職務著作（機密情報を含む場合を除く）を提供する場合

に定める以外の場合については、CLA、著作権の譲渡の双方ともに認められていない
（具体的には、上長の明示的な指示に基づかず、職務中にOSS活動を実施することなどは認められない）

今後、必要なケースが生じた場合にはOSSポリシーとして追記する可能性もあるが、弊社の場合、現状ではこの最低限の内容で問題ないと思われる

# まとめ
既存のOSSにコントリビュートする上で必要な最低限のOSSポリシーを紹介した。CLAや著作権の取り扱いで困っている企業にとって助けになれば嬉しい

# 終わりに
ちゅらデータでは、クレイジーな仲間を募集しているでござる
データエンジニア、もしくはSE系からデータエンジニアになりたい方がいればぜひ、御仁の力量に応じたグレード（ジュニア/ミドル/シニア）にて、応募するでござる

https://herp.careers/v1/churadata/T6Oag1FxE34V
[翻訳] LangChainにおけるプロンプトのGetting Started

[Getting Started — 🦜🔗 LangChain 0\.0\.184](https://python.langchain.com/en/latest/modules/prompts/getting_started.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

このセクションにはプロンプトに関する全てが含まれています。プロンプトは、言語モデルに引き渡される値です。この値は、(LLM向けの)文字列あるいは(チャットモデル向けの)メッセージのリストとなります。これらのプロンプトのデータタイプは比較的シンプルですが、それらの構築はそうではありません。ここでのLangChainの訴求価値には以下があります:

- 文字列のプロンプトとメッセージプロンプトの標準的インタフェース
- 文字列プロンプトテンプレートとメッセージプロンプトテンプレートの(使い始めるための)標準的なインタフェース
- サンプルセレクター: 言語モデルが従うプロンプトにサンプルを挿入する手法
- 出力パーサー: 言語モデルが情報を出力するフォーマットとしてプロんtぷとに対する指示を埋め込む手法と、出力文字列をフォーマットにパースする手法

文字列プロンプト固有のタイプ、チャットプロンプト固有のタイプ、サンプルセレクター、出力パーサーに関する詳細なドキュメントがあります。

ここでは、シンプルなプロンプトを用いて使い始める際の標準インタフフェースのクイックスタートをカバーします。

# PromptTemplates

PromptTemplatesはプロンプトの値を構築することに責任を持ちます。これらのPromptTemplatesはフォーマッティング、サンプル選択などを行うことができます。ハイレベルでは、これらは基本的にはプロンプトを構築するための`format_prompt`を公開するオブジェクトです。内部では**いろいろなこと**が行われます。

```py
from langchain.prompts import PromptTemplate, ChatPromptTemplate
```

```py
string_prompt = PromptTemplate.from_template("tell me a joke about {subject}")
```

```py
chat_prompt = ChatPromptTemplate.from_template("tell me a joke about {subject}")
```

```py
string_prompt_value = string_prompt.format_prompt(subject="soccer")
```

```py
chat_prompt_value = chat_prompt.format_prompt(subject="soccer")
```

# `to_string`

これは、(生のテキストを期待する)LLMに値を渡す際に呼び出されます。

```py
string_prompt_value.to_string()
```
```
'tell me a joke about soccer'
```

```py
chat_prompt_value.to_string()
```
```
'Human: tell me a joke about soccer'
```

# `to_messages`

これは、(メッセージのリストを期待する)チャットモデルに値を渡す際に呼び出されます。

```py
string_prompt_value.to_messages()
```
```
[HumanMessage(content='tell me a joke about soccer', additional_kwargs={}, example=False)]
```

```py
chat_prompt_value.to_messages()
```
```
[HumanMessage(content='tell me a joke about soccer', additional_kwargs={}, example=False)]
```
要素同士を重ねて表示する方法

こんには！
今回は要素同士を重ねて表示するレイアウトについて
書いていこうと思います💭

今回紹介するのは
**position: absolute;** と**position: relative;** です！

## position: absolute;とは？

HTMLの要素同士は通常は重なって表示されることはありません。
しかし、position: absolute;を使うと要素同士を重ねて表示させることができます。

サイト全体の左上の部分を基準として、そこからの位置をtopとleftを用いて指定してあげます。　　
また、rightやbottomを併用することも可能です。


#### 実際に例を挙げると。。。


```index.html
  <body>
      <div class="box1">box1</div>
      <div class="box2">box2</div>
  </body>
```

#### position指定なしの場合
``` style.css
.box1{
  background: orange;
  width: 300px;
  height: 300px;
}

.box2{
  background-color: aqua;
  width: 300px;
  height: 300px;
}
```
![スクリーンショット 2023-05-30 111215.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335067/87c8a77b-3b3e-78d2-f6ca-15f200f5aa1f.png)


こんな感じになります。


#### positionを指定ありの場合
```stile.css
.box1{
  background: orange;
  width: 300px;
  height: 300px;
  position: absolute;
  top: 50px;
  left: 70px;
}

.box2{
  background-color: aqua;
  width: 300px;
  height: 300px;
  position: absolute;
  top: 120px;
  left: 140px;
}
```
![スクリーンショット 2023-05-30 112532.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335067/0dcea6ca-f113-1bf5-65c4-5a288b5843e6.png)


こんな感じで画面の左上を基準としてbox1とbox2を重ねて表示させてあげることができました。

## 基準位置の変更
  position: absolute;の基準位置はサイト全体の左上部分ですが、この基準位置を変更することも可能です！

基準としたい親要素に**position: relative;** を指定すると、その要素の左上部が基準位置になります。


#### box1を基準位置にして要素を重ねた場合
```style.css
.box1{
  background: orange;
  width: 300px;
  height: 300px;
  position: relative;
}

.box2{
  background-color: aqua;
  width: 200px;
  height: 200px;
  position: absolute;
  top: 30px;
  left: 30px;
}
```

![スクリーンショット 2023-05-30 114055.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335067/8af7c6cf-9c78-36bb-48cc-7de3d8ea6ab6.png)

こんな感じでbox1の左上を基準としてbox2が配置されるようになりました。
  

今回は簡単な重ね方ですが、この方法を使っていろんなレイアウトができるかなって思います！

そんなに出番はないかもしれないけど　　
引き出しとして覚えておきたいレイアウトの一つでした✨


今回はこのへんで！
ありがとうございました。
pywinautoで子要素配列や子孫要素配列から特定の要素を検索する

# 結論
`findbestmatch.find_best_control_matches`という関数で検索できます。

# 環境
- pywinauto 0.6.8

# 状況
Windows Media Playerのファイルリストから特定のファイル名の要素を検索します。
今回は赤枠のファイルリストの中にある「有本和仁」というファイル名の要素を検索します。
![pywinautoWMP01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/21cc34d9-7bea-448a-ca19-0e851bfe7021.png)

<details><summary>赤枠内にある全ファイル名リスト(折りたたんでます。)</summary>

```
安東健由
安東小都音
井垣真次
井垣美里
浦川成十郎
浦川徳子
永田ふみ子
永田正教
永浜幸徳
永浜峰
越智いずみ
越智裕治
塩瀬彰男
塩瀬智加子
河口亜紀子
河口和法
鎌刈絢友
鎌刈由紀
萱沼謙一
萱沼祐美子
岩井紗代子
岩井雄一
岩瀬多美
岩瀬武
宮村千鳥
宮村忠輔
玉井菊
玉井到
金川貴久
金川小紅
栗栖伽羅
栗栖亘
古谷久遠
古谷隆
江川貴子
江川新右衛門
江頭志能舞
江頭杪
高坂ちずる
高坂貴理人
国岡美智代
国岡碧海
国本たまき
国本春太
佐久間伊吉
佐久間伊瀬
阪野亜紀
阪野貴彦
三矢孝浩
三矢千代子
小金丸夏江
小金丸銀雅
小沢千穂
小沢明人
松原博康
松原稔江
上野しずよ
上野八五郎
植村絢士
植村美晴
菅紀仁
菅瀧
西口初穂
西口比呂
青井史
青井庄蔵
前野真悟
前野蘭
曽我鎌太郎
曽我君
竹本康夫
竹本万亀
中沢紬
中沢勇治
長山真寛
長山萩
鶴田文朗
鶴田弥恵子
天野啓子
天野章人
田崎きよ子
田崎松葉
畠中憲信
畠中連
板倉珠美
板倉重則
肥後三香
肥後内蔵助
斧円
斧俊夫
平林寛次
平林芹
米津小都音
米津達五郎
桝美夏
桝裕二
蜜田亀造
蜜田月江
木野村作蔵
木野村雪絵
柳生渚
柳生優心
有本雛
有本和仁
```
</details>

# 解説
方法はいくつかあるかと思います。
この記事では以下の手続きで要素を検索しました。
- 赤枠で囲んでいる部分(ListBox)をコントロールとして取得。
- ListBoxの子孫要素配列を`descendants`関数で取得。
- 子孫要素配列から`findbestmatch.find_best_control_matches`という関数を使用して「有本和仁」という要素を検索。

# コード
```py
from pywinauto import Application
from pywinauto import findbestmatch

if __name__ == '__main__':
    # Windows Media Playerを起動
    app = Application(backend='uia')
    app.start(cmd_line='C:\Program Files (x86)\Windows Media Player\wmplayer.exe')
    
    # ListBoxの子孫要素を取得
    dialog = app[u'Dialog']
    descendants = dialog['詳細ウィンドウListBox'].descendants()
    
    # 「有本和仁」という要素を検索(結果は配列として返ってくる)
    best_matches = findbestmatch.find_best_control_matches('有本和仁', descendants)
    
    # 返ってきた要素を選択する
    best_matches[0].select()
```

実行後、要素にフォーカスが当たっていることが確認できます。

![pywinautoWMP02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/c3249d03-e297-c57b-3c5d-d72cd8007b90.png)

以上です。

# 参考

https://juu7g.hatenablog.com/entry/Python/rpa/pywinauto/introduction#%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB

https://qiita.com/nobu-maple/items/51901b2e27e4448f102b

https://pywinauto.readthedocs.io/en/latest/code/pywinauto.findbestmatch.html
PHPインストール（8.1）とxdebugの設定（vscode）

本記事は以下の環境で動作確認しています。

```
OS: macOS Venture 13.3.1
Chip: Apple M1 Pro
```

前提として、[homebrew](https://brew.sh/index_ja) は導入済み。

### PHP8.1のインストール

インストールコマンドは、以下。
```shell
brew install php@8.1
```

確認。
```shell
which php
```
> /opt/homebrew/opt/php@8.1/bin/php

### xdebugの導入

以下記事が参考になります。

https://qiita.com/suin/items/84c0479054809f058f07

php.ini ファイルの確認。
```shell
vim /opt/homebrew/etc/php/8.1/php.ini
```
> zend_extension="xdebug.so"
### launch.jsonを定義してデバッグ実行
vscodeのプロジェクトディレクトリで`launch.json`を定義。
![Screenshot 2023-05-30 at 11.00.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650571/691b0877-3ce0-34f2-aab5-b54653ea6018.png)

`launch.json`
```json
"configurations": [
    {
      "name": "Listen for Xdebug",
      "type": "php",
      "request": "launch",
      "port": 9003
    },
]
```

ブレイクポイントを設定し、`F5`キーでデバッグ開始も動作していない模様。
ちなみにブレイクポイントは、vscode extensionで[PHP debug](https://marketplace.visualstudio.com/items?itemName=xdebug.php-debug)を導入していないと設定できません。

### 既存プロジェクトで確認

[こちら](https://qiita.com/shota_tanaka/items/e9465be2986fe9482e87)で作成したsymfonyプロジェクトを使用。

https://qiita.com/shota_tanaka/items/e9465be2986fe9482e87

任意のコントローラを作成。: `src/Controller/InfoController.php`
`phpinfo()`を埋め込みます。
```php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class InfoController extends AbstractController
{
    /**
     * @Route("/info", name="get_info")
     */
    public function getInfo(): Response
    {
        phpinfo(); // 情報確認。
        return new Response();
    }
}
```

[https://127.0.0.1:8000/info](https://127.0.0.1:8000/info)

`⌘ + f`で`xdebug`を検索。

|  Xdebug  | | |
| ---- | ---- | --- |
|  Version  |  3.2.1  | |
|  Step Debugger  |  Disabled  | [docs](https://xdebug.org/docs/step_debug) |
| xdebug.client_port | 9003 |

`step debugger`の設定値が`disabled`なので必要な設定を[ドキュメント](https://xdebug.org/docs/step_debug)を参照して確認します。

### php.iniを修正

必要な設定が確認できたら、`php.ini`ファイルを修正します。

```ini
xdebug.mode=debug
xdebug.start_with_request=yes
```

### 動作確認

プロジェクトを再起動して動作確認します。
```shell
symfony server:start
```

![Screenshot 2023-05-30 at 11.15.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650571/5e4c1fa6-36e1-1943-9c2f-5340f146229e.png)
[NVM]WindowsでNVMに乗り換えたときに既存のNodeを完全に消したい

# 結論
- アプリと機能からNodeをアンインストールしなさい
- C:\Users\<User>\AppData\Roaming直下のnpmとnpm-cacheを削除しなさい
- C:\Users\<User>\.npmrcを削除しなさい

## これは割と個人用メモです。
yarnが入らずに少し沼りました。
GA(遺伝的アルゴリズム)をUnityで実装しようとした話 #1

# はじめに
今回のお話はGA(遺伝的アルゴリズム)というのを先生に聞いて、実装してみたくなったから挑戦してみた話です。
見様見真似で実装したので至らない点もあるかと思いますが、見ていただけますと幸いです。
とても内容が多いため 
**GW中に取り組んだ#1** と
**GW明けに取り組んだ#2**で記事を分けます。

#1
* GAの内容と実装内容         
* GW中にやってみたこと
* GW中に実装できなかったこと

#2
* 前回の内容とその解決法の話
* 完成形

という感じで記事を進めていきます。

ほんとは5月中盤くらいには投稿したかった...
内容自体は5月中盤くらいにはできてたんだけど忙しすぎて記事が書けなかった...

GitHubリンク

https://github.com/komugikoShimizu/GA


# GAの内容と実装内容
まず遺伝的アルゴリズムの基本的な内容として
* 乱数値で生成したもの内容同士を交配していき、最適解に近いものを導き出す。

というものです。

内容が遺伝していくから「遺伝的アルゴリズム」と覚えています。
遺伝的アルゴリズムの詳しい内容についてはここでは説明しないので気になった人は調べてみてください。

遺伝的アルゴリズムの流れとして

**1.初期集団の作成**
親となる複数のデータをランダムに作成する
**2.適応度の評価**
各データがどれくらい優れているか評価する
**3.選択**
評価の高いデータが生き残るようにする
**4.交叉**
選択されたデータの特徴を持つ子供データを作成する
**5.突然変異**
子のデータに変化をあたえ、より良い評価のデータが作成される可能性を作る
**5終了時、継続条件を満たしているなら2に戻る**

といったようになっています。

今回はこれを用いて **10×10のマスに10個ランダムにアイテムを作成し、最適に近い形で取り切る**　ことを目指しました。
# GW中にやってみたこと
まずは形から　ということで
 
1.初期要素作成(乱数値10個 × 4つ)
2.適応度評価(アイテムを取得するたびスコア+1、取り切った際に残り歩数分の点数を加算)
3.選択(上位2つを次世代とし、インデックスを保存する)
4.交叉(乱数値2つを生成し、親要素2つから2点交叉を行う)
5.突然変異(5で割り切れるときに値をランダムに入れ替える)

と実装してみました。

どんな実装になったのかを詳しく知りたい方はこちらをご覧ください。

https://github.com/komugikoShimizu/GA/blob/main/Scripts/GA_Before.cs

実際にログを出してみると、変わっていく様子を見ていくことができて楽しかったです。
ランダムで突然変異しているわけではないのですが、そこ以外はほぼその通りに実装しました。
基本的なところまでは実装できたのですが、何点か問題があり、とても完成といえるものではありませんでした。

# GW中に実装できなかったこと
大きな失敗点として
* 2点交叉を採用していたが、似た個体のみが生成され良い個体がほぼ生まれない
* この突然変異の状態では、ほぼ変化が生まれず親を超えうる個体を生成しづらい
といったことが挙げられます。

この様な問題点があることまでは突き止められたのですが、それを解決する良い方法が浮かばず、GW明けに先生に相談してみることにしました。

そうして相談をしてみたところ
* もっと交叉数を増やしてみてはどうか
* 突然変異の数or発生数を増やすべきではないか
* 要素を分割し、それぞれを遺伝的アルゴリズムで実装したらいいのでは

といったことを聞くことができました。
この後は実際にそれを取り入れた結果を記述していきます。

#2→　

https://qiita.com/komugikoShimizu/items/b3fb43a907175a45cc9d
VSCodeでmatplotlibを使おうとするとクラッシュする

## 問題
matplotlibのpyplotを使おうとするとカーネルがクラッシュする。

## 環境
vscode version: 1.78.2
OS: Windows_NT x64

## 解決法
matplotlibとnumpyのパッケージをアップデートしたら直った。
[翻訳] LangChainにおけるプロンプトのコンセプトガイド

[Prompts \| 🦜️🔗 LangChain](https://docs.langchain.com/docs/components/prompts)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note
[Python Guide](https://python.langchain.com/en/latest/modules/prompts.html)
[JS Guide](https://js.langchain.com/docs/modules/prompts/)
:::

モデルをプログラミングする新たな方法は、プロンプトを通じたものです。「プロンプト」はモデルへの入力を指します。この入力は多くの場合ハードコードされず、複数のコンポーネントから構築するのがほとんどです。PromptTemplateはこの入力の構築に責任を持ちます。LangChainはプロンプトの構築と取り扱いを容易にするための、いくつかのクラスと関数を提供します。

ドキュメントのこのセクションは4つに分割されます。

**PromptValue**

モデルへの入力を表現するクラスです。

**Prompt Templates**

PromptValueの構築に責任を持つクラスです。

**Example Selectors**

多くの場合、プロンプトにサンプルを含めることが有効です。これらのサンプルは、ハードコードすることができますが、動的に選択できるとさらにパワフルなものとなります。

**Output Parsers**

言語モデル(とChatモデル)はテキストを出力します。しかし、多くの場合、単なるテキストではなく、より構造化された情報を取得したいと考えることがほとんどです。ここで出力パーサーが役に立ちます。出力パーサーは、(1)モデルに対してどのように出力をフォーマットするのかを指示し、(2)希望するフォーマットに出力をパース(必要であればリトライを含む)することに責任を持ちます。

# 詳細

- [Prompt Value](https://docs.langchain.com/docs/components/prompts/prompt-value)
- [Prompt Template](https://docs.langchain.com/docs/components/prompts/prompt-template)
- [Example Selectors](https://docs.langchain.com/docs/components/prompts/example-selectors)
- [Output Parser](https://docs.langchain.com/docs/components/prompts/output-parser)
JDBC接続のやり方

環境構築
---
職業訓練校の授業ではPostgleSQLを使っていたが、自習では、MySQLの練習もしていこうと思います。

<h5>まずMySQLをDLしていく。</h5>
1.MySQLの公式ホームページに行きダウンロードをクリックし、ページ下のほうにあるMySQL Communityをクリックする。(無料DBだから)
2.MySQL Installer for Windowsをクリックし、サイズを選びDLする。
3.DLを進めていき、root paswordを設定する
4.初期設定は特にいじらずDL完了。

<h5>次は、JDBCドライバをDLしていく。</h5>
1.MySQL コネクタと検索し、JDBC Driver for MySQL (Connector/J)を選択し、
初期設定が、Select Operating System : microsoft windowsとなっているので、platform independentを選択肢し、DLする。(プラットフォーム独立モデル)
2.DLファイルを開くと、mysql-connector-j-8.0.33.jarが入っているので、これを
/tomcat/9(使っているバージョン)/libファイルの中に移動する。

<h5>環境変数設定</h5>
1.環境変数設定をひらき、PATHに新規追加で、MySQL.exeがあるパスを設定する。

(自分の場合は、C:\Program Files\MySQL\MySQL Server 8.0\bin)
2.CMDを開いて、mysql -u root -pと打って開けるかを確認する。
```
C:\Users\ユーザ名> mysql -u root -p
```

パスワードを入力して、Welcome~と表示されると、接続成功。
```
C:\Users\ユーザ名 > mysql -u root -p
Enter password: ****
Welcome to the MySQL monitor.  Commands end with ; ~省略~
mysql >
```
<h5>Eclipceを使っている場合</h5>
1.JDBCを使いたいJavaファイルを右クリックして、ビルドパス > 外部アーカイブの追加を選択して、JDBCドライバを選択する。


基本操作
---
<h4>DDLの場合</h4>
<h6>DBに接続する</h6>
DriverManagerを使ってJDBCドライバを管理する。

```
Connection con = DriverManager.Connection(URL, ユーザー名, パスワード);
```
MySQLを使う場合のURLは、下記を記述する。

```
jdbc:mysql://localhost/DB名
```
変数conには、DBの接続情報が代入される。

<h6>ステートメントを生成する</h6>

```
Statement stmt = con.createStatement();
```

<h6>SQLを実行</h6>

```
int count = stmt.executeUpdate(SQL文);
```
変数countに、SQL文を何行更新したかのカウントを代入している。

<h6>リソースの開放</h6>

```
stmt.cloce();
con.close();
```
解放時は、順番を逆にして閉じていく必要がある。

※JDBC4.0(Java SE6)以降からは、Class.forName()の記述が不要になった。※

<h4>DMLの場合</h4>
DBに接続して、ステートメントを生成する。

```
Connection con = DriverManager.Connection(URL, ユーザー名, パスワード);
Statement stmt = con.createStatement();
```

<h6>SQLを実行</h6>

```
ResultSet　rs = stmt.executeQuery(SQL文);
```
ResultSetオブジェクトに検索結果を保持する。

<h6>検索結果などを扱う繰り返し処理</h6>

```
while(rs.next()){
  System.out.println(rs.getInt("id"));
}
```
取得したい列名や列番号をgettrメソッドの中に記述する。
※列番号は、１から記述する※
getterメソッドは、欲しい値が定義されているデータ型のgetterを記述する。

<h6>リソースの開放</h6>

```
rs.close();
stmt.cloce();
con.close();
```
ここまでが一連の流れ。

PreparedStatement
---
基本操作ではステートメントの生成をStatementを使って行っていたが、PreparedStatementを使ったほうがセキュリティ的にも性能的にもよい。

INSERT文を使って使用してみる。
```

String[] names = {田中,佐藤,山田}
int[] ages = {20,25,30}

Connection con = DriverManager.getConnection(URL, ユーザー名, パスワード);
PreparedStatement ps = 
                  new PreparedStatement("INSERT INTO student VALUES(?,?"));
for(int i = 0; i < names.length; i++){
  ps.setInt(1,names[i]);
  ps.getString(2,ages[i])
}
```
※コードが見にくくならないように例外処理は省略しています。※

トランザクション処理
---
トランザクション設定をする。

```
Connection con = DriverManager.getConnection(URL, ユーザー名, パスワード);
con.setAuttoCommit(false);
```

このコードを記述することによって、オートコミットを解除する。

コミットしたい場合は、

```
con.commit();
```
処理を記述した後に、commitメソッド呼び出す。

ロールバックしたい場合は、

```
con.rollback();
```
rollbackメソッドを呼びだす。

まとめ
---
DAOクラスを作ることによって、様々でDBで動かせるので、プラットフォーム依存をなくすことができる。