OmniAICreator/Qiita-1.07M huggingface dataset:
Mesa3.xによる経済循環モデル

## はじめに
現代貨幣理論(MMT)は、よくモデルがないと批判される。
そこで、MultiAgentでMMTに則った経済循環モデルを作成しようと思う。
MultiAgentを書くのには、Mesa/Pythonが比較的簡単のようだ。
MultiAgentのプログラムを書くには、少々癖のある書法になる。
しかも、Mesa2.xからMesa3.xにバージョンアップで書き方が少し変わってくる。
Mesa3.xに慣れる意味もあるので、企業、政府のみの簡単なモデルをMesa3.1で構築する。

なお、以下のソースは、jupyter上で作動する。


## Agentの作成
まずは、Mesaをimportして、MoneyAgentを作成する。
Agentにはunique_idが自動的に付くので、=1を政府、>1を企業とする。
最初に、企業は、最初に金貨0枚で、価格が金貨1万枚の商品を持つものとし、
政府は、100万枚の金貨を持ち、ランダムに企業を選定して、商品を買い上げる。
その際、売上の1/10を売上税として徴収するので、売上から税額を引いておく。

```python
import mesa

class MoneyAgent(mesa.Agent):
    def __init__(self, model):
        super().__init__(model)
        self.tax    = 0
        self.wealth = 0
        if self.unique_id == 1:
            self.wealth = 1000000
    
    def exec(self):
        price = 10000
        if self.unique_id == 1:
            other_agent = self.random.choice(self.model.agents.select(lambda a: a.unique_id > 1))    
            if other_agent is not None:
                other_agent.wealth += price
                tax = price // 10
                other_agent.tax    += tax
                other_agent.wealth -= tax
                self.wealth -= price
        else:
            pass
```

## モデルの作成
次に、モデルを作成する。num_agentsの数だけAgentが作成される。
step()により、Agentで定義されたexec()を実行する。
tax()により、各企業から売上より分けられていた税額を徴収する。

```python
class MoneyModel(mesa.Model):
    def __init__(self, n):
        super().__init__()
        self.num_agents = n
        MoneyAgent.create_agents(model=self, n=n)

    def step(self):
        self.agents.do("exec")
        
    def tax(self):
        sum_tax = 0
        for a in model.agents:
            sum_tax += a.tax
            a.tax = 0
 
        for a in model.agents.select(lambda a: a.unique_id == 1):
            a.wealth += sum_tax 
```
## 実行
まず、Agentを10個作成するので、政府は1個、企業は9個出来る。
model.step() で、政府はランダムに選んだ企業から商品を買い上げる。
model.tax()　で、政府は企業から税額を吸い上げる。

```python
model = MoneyModel(10)
for _ in range(30):
    model.step()
    
print("徴税前")
print([a.wealth for a in model.agents])    # 金貨の枚数
print([a.tax    for a in model.agents])    # 税額
print("徴税後")
model.tax()
print([a.wealth for a in model.agents])    # 金貨の枚数
print([a.tax    for a in model.agents])    # 税額
```
徴税前
[700000, 63000, 18000, 9000, 18000, 81000, 27000, 9000, 27000, 18000]
[0, 7000, 2000, 1000, 2000, 9000, 3000, 1000, 3000, 2000]
徴税後
[730000, 63000, 18000, 9000, 18000, 81000, 27000, 9000, 27000, 18000]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]


## おわりに
Mesa3.xの日本語解説が殆どないので、お役に立てただろうか。
朗報：2年以上放置されているWindowsのバグ（RDP再接続した時に、キー入力ができなくなる）の暫定対処方法みつかる！

# 困っている事

Windowsのリモートデスクトップ接続してVSCodeやSlackを使用する
↓
リモートディスクトップを切断する
↓
再度接続する
↓
VSCodeやSlackでキー入力ができない

Githubにissueとしてもあがっている

https://github.com/microsoft/vscode/issues/167556


このissueが作成されたのが2022年11月なんですが、未だに解決されていません。

# 暫定対処方法

このissueをずっとウオッチして解決を待ち望んでいたんですが、未だに解決していません。

しかし、[IME CompatibilityオプションをONにすると直る](https://github.com/microsoft/vscode/issues/167556#issuecomment-2655646466)という中国の方のコメントをみつけました。

Windowsの設定で、時刻と言語 > 言語と地域 を開きます。
日本語の欄の・・・をクリックして言語のオプションを開きます。
Microsoft IMEの　・・・をクリックして、キーボードオプションを開きます。
全般をクリックします
互換性をOnにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/0c0f62ba-736c-47d5-9460-fdccf72fcacd.png)

この設定で不具合は解消されました。

わたしの場合はこの暫定対策で解消されました。

# 感想

暫定対策ですが、ずっと困っていたので、解消されてよかったです。

この問題は、IMEの関する不具合で、日本語や中国語などのIMEを使用していると発生するようです。
SlackやChromなども影響があり、WebViewとIMEに関する何らかの問題っぽいですが、根本解決してほしいですね。
【ABC395】AtCoder Beginner Contest 395【C++】

### コンテスト名
AtCoder Beginner Contest 395

### コンテストURL
https://atcoder.jp/contests/abc395

### 開催日
2025/03/01 21:00-22:40

---

## [A: Strictly Increasing?](https://atcoder.jp/contests/abc395/tasks/abc395_a)
**解法**
- 問題文通りに判定する
```cpp:ABC395A.cpp
#include <iostream>
#include <vector>
using namespace std;

int main(){
    int n;
    cin >> n;

    vector<int> A(n);
    for(int i=0; i<n; i++){
        cin >> A[i];
    }

    for(int i=1; i<n; i++){
        if(A[i]<=A[i-1]){
            cout << "No" << endl;
            return 0;
        }
    }

    cout << "Yes" << endl;
    return 0;
}
```

## [B: Make Target](https://atcoder.jp/contests/abc395/tasks/abc395_b)
**解法**
- 問題文通りに実装する
```cpp:ABC395B.cpp
#include <iostream>
#include <vector>
using namespace std;

int main(){
    int n;
    cin >> n;

    vector<vector<char>> G(n, vector<char>(n));
    for(int i=0; i<n; i++){
        int j = n + 1 - i - 2;

        if(i>j){
            continue;
        }

        if(i%2==0){
            for(int a=i; a<=j; a++){
                for(int b=i; b<=j; b++){
                    G[a][b] = '#';
                }
            }
        }else{
            for(int a=i; a<=j; a++){
                for(int b=i; b<=j; b++){
                    G[a][b] = '.';
                }
            }
        }
    }

    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cout << G[i][j];
        }
        cout << '\n';
    }

    return 0;
}
```

## [C: Shortest Duplicate Subarray](https://atcoder.jp/contests/abc395/tasks/abc395_c)
**解法**
- `map<int, int>` に各値の直近の出現位置を記録する
```cpp:ABC395C.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;

int main(){
    int n;
    cin >> n;

    vector<int> A(n);
    for(int i=0; i<n; i++){
        cin >> A[i];
    }

    map<int, int> M;
    int minv = n + 1;
    for(int i=0; i<n; i++){
        if(M.count(A[i])){
            minv = min(minv, i-M[A[i]]+1);
        }

        M[A[i]] = i;
    }

    if(minv>n){
        cout << -1 << endl;
    }else{
        cout << minv << endl;
    }

    return 0;
}
```

## [D: Pigeon Swap](https://atcoder.jp/contests/abc395/tasks/abc395_d)
**解法**
- 3 つの `vector<int>` に記録し、巣にいる鳩をすべて移動させる種類 2 の操作に対応する
```cpp:ABC395D.cpp
#include <iostream>
#include <vector>
using namespace std;

int main(){
    int n, q;
    cin >> n >> q;

    vector<int> H(n), V(n), S(n);
    for(int i=0; i<n; i++){
        H[i] = i;
        V[i] = i;
        S[i] = i;
    }

    int num, a, b;
    for(int i=0; i<q; i++){
        cin >> num;
        if(num==1){
            cin >> a >> b;
            a--;
            b--;
            
            H[a] = V[b];
        }else if(num==2){
            cin >> a >> b;
            a--;
            b--;
            
            swap(V[a], V[b]);
            swap(S[V[a]], S[V[b]]);
        }else if(num==3){
            cin >> a;
            a--;

            cout << S[H[a]]+1 << '\n';
        }
    }
}
```
データベース・データウェアハウス・データマートの違いと必要性を専門外の人に伝える

# はじめに
今回は、新シリーズで、ChatGPTに専門用語を専門外の人に分かりやすく説明する時のロープレ台本を作成してもらいます。

データ関連に明るくない田中部長に対して、データベースとデータウェアハウス、データマートの違いを明らかにしたうえで、その必要性をデータ担当の鈴木さんに説明してもらいます。
※この記事は、ChatGPTの出力を基に作成しています。

---

### **登場人物（架空）**  
- **田中部長**（営業部の部長、データには詳しくないが、効率化には興味がある）  
- **鈴木**（データ担当、できるだけ分かりやすく説明したい）  

---

#### **1. 田中部長の疑問**
🧑‍💼 **田中部長**:  
最近「データウェアハウス」とか「データマート」っていうのを聞くんだけど、正直な話、よくわからないんだよね。ウチの営業データってもうパソコンで見られるよね？それだけじゃダメなの？  

---

#### **2. データベースの説明**
👩‍💻 **鈴木**:  
そうですね。今、営業のみなさんが見ているデータは、「データベース」というものに入っています。これは、会社で日々の仕事に使うデータを保存する場所です。例えば、顧客リストとか、受注の記録とかですね。  

🧑‍💼 **田中部長**:  
ふむふむ、じゃあ、それを見ていれば十分じゃないの？  

👩‍💻 **鈴木**:  
日々の業務には問題ないですが、例えば「この1年間でどの地域の売上が一番伸びた？」とか、「どの商品のリピート率が高い？」といった**分析**をしようとすると、データベースだけでは大変なんです。  

🧑‍💼 **田中部長**:  
え、なんで？データはそこに全部入ってるんでしょ？  

---

#### **3. データウェアハウスの説明**
👩‍💻 **鈴木**:  
確かにデータはありますが、データベースは「毎日の仕事を回すための仕組み」なので、過去のデータをまとめたり、大きな分析をするのには向いていないんです。  
そこで、データを「整理して保管する倉庫」を作ります。それが「データウェアハウス」です。  

🧑‍💼 **田中部長**:  
へぇ、倉庫？  

👩‍💻 **鈴木**:  
はい、イメージとしては、「データベース」が営業のための「冷蔵庫」だとすると、「データウェアハウス」は会社全体の「大きな食品倉庫」みたいなものです。  

🧑‍💼 **田中部長**:  
なるほど…でも営業チームが欲しいのは、営業データだけでしょ？会社全体のデータは関係なくない？  

---

#### **4. データマートの説明**
👩‍💻 **鈴木**:  
そこがポイントです！データウェアハウスは、会社全体のデータをまとめる大きな倉庫ですが、その中から「営業チームが使いやすい形にした棚」を作ることができます。それを「データマート」と言います。  

🧑‍💼 **田中部長**:  
ほう、棚？  

👩‍💻 **鈴木**:  
はい！例えば、大きな倉庫にはいろんな食材が入っていますよね。でも、営業チームが欲しいのは「お弁当の材料だけ」とか「飲み物だけ」とか決まっていますよね？  
なので、営業専用の「データの棚（データマート）」を作ることで、営業チームに必要な情報をすぐに取り出せるようになるんです。  

🧑‍💼 **田中部長**:  
なるほど！じゃあ、データベースは「冷蔵庫」、データウェアハウスは「倉庫」、データマートは「営業用の棚」って感じか！  

---

#### **5. データウェアハウスなしでデータマートは作れる？**
🧑‍💼 **田中部長**:  
ところでさ、データウェアハウスを作らずに、いきなり営業向けのデータマートだけ作れないの？営業のデータさえあれば十分なんだけど。  

👩‍💻 **鈴木**:  
いい質問ですね！確かにデータウェアハウスなしでデータマートを作ることもできます。でも、その場合、営業データだけを**直接データベースから取る**ことになるので、いくつか問題が出てきます。  

🧑‍💼 **田中部長**:  
どんな問題？  

👩‍💻 **鈴木**:  
例えば、営業データだけ取り出しても、「マーケティングの広告データ」や「カスタマーサポートの対応履歴」といった、他のデータと組み合わせた分析が難しくなります。  
また、データベースから直接データを取ると、分析のたびに営業システムの動作が重くなったり、データの整合性が崩れたりする可能性もあります。  

🧑‍💼 **田中部長**:  
つまり、データマートだけ作ると、将来的に困るってこと？  

👩‍💻 **鈴木**:  
そうですね。最初は良くても、分析したいデータが増えてくると「やっぱりデータウェアハウスが必要だった…！」というケースがよくあります。  

🧑‍💼 **田中部長**:  
なるほど…それなら、最初からちゃんと倉庫（データウェアハウス）を作っておいた方が安心だな。  

---

#### **6. じゃあ、これからどうすればいいの？**
🧑‍💼 **田中部長**:  
じゃあ、これからどうやったらいいの？いきなり「データウェアハウスを作れ」って言われても、なんだか大変そうだけど…。  

👩‍💻 **鈴木**:  
そうですよね。まずは**営業チームが本当に欲しいデータを整理する**ことから始めましょう。たとえば、売上の推移を見たいのか、顧客ごとの購買履歴を分析したいのか、そういったニーズをはっきりさせるのが第一歩です。  

🧑‍💼 **田中部長**:  
なるほど、現場の声を聞いて、どんなデータが必要かを洗い出すわけね。  

👩‍💻 **鈴木**:  
はい！その上で、データをどこから集めるのか、どのツールを使うのかを決めていきます。まずは小さく始めて、少しずつ整備していく形が現実的ですね。  

🧑‍💼 **田中部長**:  
よし、じゃあまず営業チームと話して、どんなデータを見たいか整理するところから始めよう！  

👩‍💻 **鈴木**:  
いいですね！一緒に進めていきましょう！
今更ですが、pearのAuth.phpを最終php7.3使用時エラー修正

現在ではあまり使われない、PearのAuth.phpをPHP7.3で使うとFatal　syntax error, unexpected ‘new’ (T_NEW)と言うエラーが出たので、サイト参考に修正しました。（覚書き）。
```
    function &_factory($driver, $options = '')
    {
        $storage_class = 'Auth_Container_' . $driver;
        include_once 'Auth/Container/' . $driver . '.php';
        //$obj =& new  $storage_class($options);//ここを修正&を消す。
        $obj = new  $storage_class($options);
        return $obj;
    }

```
以上です。
参考サイト：https://wp-doctor.jp/blog/2021/09/08/php7-%E3%81%A7syntax-error-unexpected-new-t_new%E3%81%8C%E5%87%BA%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/
【備忘録】numpy.r_とnumpy.c_

# numpy.r_とnumpy.c_
- r_は配列をAxis=0（行、縦）方向に結合
- c_は配列をAxis=1（列、横）方向に結合。ってか拡張？少しくせがある。

# numpy.c_の基本的な使い方
- ２つの１D配列を列方向に結合する。
入力：
- ![{AB87FBFB-59CD-46D6-9C26-6B521F9F1323}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4020495/a64e976d-5e58-40be-919b-4fc9b68702c9.png)
出力：
![{7A0E2195-9E54-43FE-9A1D-766333AD186A}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4020495/58c7343c-53cd-4fa8-936e-40e33ae667e7.png)
hidden と spanのdisplay:none

# はじめに
JavaScriptでのみ利用する値をHTML上に保持したい。
そういう場合、私はhiddenを利用していました。
```html
<input type="hidden" id="XXXX" name="XXXX" value="YYYY">
```
https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/hidden

ある日、spanでも似たようなことできるよー、と教えて頂き別の手法を知ったので残します。

# 別の手法
spanタグにCSSでdisplay:noneを付与する。
```html
<span id="XXXX" style="display:none">YYYY</span>
```
https://developer.mozilla.org/ja/docs/Web/HTML/Element/span

# ポイント
1.spanは、インライン要素（divはブロック要素）
2.display:noneは、要素の表示を無くし、レイアウトに影響を与えない。

https://developer.mozilla.org/ja/docs/Web/CSS/display

# 更に別の手法
hidden属性 でもいいのでは？ とコメントを頂き、初めて知ったので早速パターンを追加！
コメントをくださった @junerさん、有難うございます！

https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/hidden

```html
	<span id="XXXX" hidden>YYYY</span>
```
```html
	<span id="XXXX" hidden="">YYYY</span>
```
```html
	<span id="XXXX" hidden="hidden">YYYY</span>    
```

# 更にバージョンアップ
更にカスタム属性も使えば自由度が増すのでは？というコメントを頂いて、更にバージョンアップ！
@ffgogfb454 さん コメント有難うございます！

https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/data-*

https://developer.mozilla.org/ja/docs/Learn_web_development/Howto/Solve_HTML_problems/Use_data_attributes

```html
<span id="XXXX" hidden data-a="YYYY" data-b="ZZZZ"></span>
```
```javascript
const xxxx = document.querySelector("#XXXX");
xxxx.dataset.a; // "YYYY"
xxxx.dataset.b; // "ZZZZ"
```
【個人開発】Next.js15でフリーランス向けの勤怠管理サービスを作りました

こんにちは
フリーランスエンジニアのshutaです。

今回、フリーランスのための勤怠管理サービスを公開したので紹介させていただきます。

![スクリーンショット 2025-03-02 17.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304831/a4f8cd21-d664-404d-9bb5-7014ed594ab9.png)
URL：https://www.free-attendance.com/


# なぜ作ったのか
* フリーランスとして業務委託で働いている上で、勤怠管理をしたい
* 案件別の勤怠管理や、1日の中で複数回に分かれた勤怠管理をしたい
* Next.js(AppRouter)で作成したポートフォリオとして紹介できるサービスを作りたい
* 自分で１からサービスを作ることで技術力を高め、実務に役立てたい

# 使用技術
<dl>
  <dt>フロントエンド</dt>
  <dd>Next.js15(AppRouter)</dd>
  <dt>バックエンド</dt>
  <dd>Prisma</dd>
  <dd>ServerComponet</dd>
  <dd>ServerActions</dd>
  <dd>RouteHandlers</dd>
  <dt>インフラ</dt>
  <dd>Vercel</dd>
  <dd>Neon</dd>
</dl>
個人開発のため、実装コスト・インフラコストを最低限に収めるために最小限の構成で開発しました。<br/>
また、Next.jsの理解を深めるためでもあったのでParallel Routes + Intercepting Routesでのモーダル実装を含め、Next.jsの新しい機能をできるだけ幅広く取り入れて実装しました。

# 機能紹介
### 打刻機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304831/a618f224-4606-43ea-b8c4-22140c981064.png)
開始/終了ボタンで簡単に打刻することができます。
また、勤務時間が一定以上の場合は休憩時間を入力することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304831/7eddfb27-5445-473f-8ab1-721ea17f31cd.png)


### 勤怠管理
![slide-image-3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304831/fed004e1-cd68-4984-a6fd-031e883e454c.jpeg)
![slide-image-4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304831/b188e160-bbfc-474f-a751-247b5d73a034.jpeg)
勤怠履歴の確認・編集をすることができます。

### プロジェクト管理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304831/9438bbf4-8f8c-4edd-99c1-a0a4fff1de97.png)
勤怠管理を行うプロジェクトを複数作成することができます。

# 今後の展開
現状は勤怠管理に関する最低限の機能のみとなっているので、Excel出力など機能追加を行なっていく予定です。
より多くの方に使っていただけるサービスにしていきたいので、要望・フィードバック等いただけたら大変嬉しいです。

# 最後に
今回はじめて1からWebサービスを開発しましたが、エンジニアとして大変良い経験になりました。
今後も今回のサービスの開発を継続的に行なっていくことに加え、別のサービスの開発も行っていきたいとも思っています
ここまでお読みいただきありがとうございました。
平均値を計算するときに内包表記を利用する

# データクラスの一覧から平均値を計算する

データクラスの一覧から値の平均値を計算する方法を調べました。
出来る限り短い書き方は２つの方法があると思います。

* 内包表記 + sum & len
* 内包表記 + numpy.mean

内包表記を利用すると１行で書けるので短くなります。

## 動作確認サンプル

以下のサンプルで動作確認しました。

```python
import numpy as np
from dataclasses import dataclass

@dataclass
class MyData:
    id: str = ''
    value: int = None

def get_dummy_list() -> list[MyData]:
    """
    データデータの一覧を取得する。
    :return: ダミーデータ一覧
    """
    rows: list[MyData] = list()
    rows.append(MyData('id1', 1))
    rows.append(MyData('id2', -5))
    rows.append(MyData('id3', 3))
    rows.append(MyData('id4', 0))
    rows.append(MyData('id5', -2))
    return rows

def main():
    # ダミーデータを取得する
    dummy_list = get_dummy_list()

    # （方法１）
    # 内包表記とsumを利用して合計値を計算する
    sum_value = sum([data.value for data in dummy_list])

    # 個数を計算する
    sum_count = len(dummy_list)

    # 平均値を計算する
    mean_value = sum_value / sum_count
    print('平均', mean_value)

    # （方法２）
    # 同じことを numpy.mean で実現できる
    mean = np.mean([data.value for data in dummy_list])
    print('平均', mean)

    # 番外編
    # 0を抜いて計算する
    mean = np.mean([data.value for data in dummy_list if data.value != 0])
    print('0を抜いた平均', mean)

if __name__ == '__main__':
    main()
```
実行結果
```
平均 -0.6
平均 -0.6
0を抜いた平均 -0.75
```
command not foundのエラー

## 発生事象
`ubuntu`上に`volta`をinstallしてバージョンを確認しようと`volta -v`を実行したところ、以下のエラーメッセージが表示された。

```bash
volta: command not found
```

## 対処法
`exec $SHELL -l`または`source ./bashrc`を実行後に、改めて`volta -v`を実行する。

## 備忘録メモ
### 1.コマンドを確認するために以下を実行
```bash
which -a [任意のコマンド(今回はvolta)]
```
:::note info
補足
whichコマンドは指定したコマンドの絶対パスを返す。
-aは環境変数のPATHにある全ての実行ファイルを表示するもの。
:::

また`echo $PATH`でも確認できます。
環境変数`$PATH`は***コマンドを探すフォルダの一覧***を保持している。

コマンドが実行できるならばパスが表示されるはずですが今回は表示されていなかった。

### 2.bashの設定ファイルで環境変数($PATH)の確認
1で絶対パスが表示されないときは実行ファイル等が入っているフォルダに`$PATH`が設定されているか確認します
→bashの設定ファイルである`~/.bashrc`を確認する

:::note warn
注意
そもそも実行ファイル等が入ったフォルダが見当たらないという場合は再度installを行いましょう
:::

今回確認してみるとなんと設定されていた...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3814555/4bc6191e-46d4-45d9-84ba-8a2e3df581c7.png)

ではなぜ`volta -v`で`command not found`をくらったのか

***結論***
`.bashrc`ファイルがbashシェルの起動のたびに読み込まれるファイルだから。

↓
`.bashrc`の内容を変更したところで即座に変更を反映してくれるわけではないみたいで、設定を反映するにはbashシェルの再起動が必要。
ログアウトしてログインすればよいが、毎回ログアウトするのは面倒。

**ログアウトせずに変更を反映する方法が以下2つ**

①新しいシェルを起動
```bash
exec $SHELL
```

②sourceコマンドを使用
```bash
source ~/.bashrc
```
:::note
補足
sourceはスクリプトや設定ファイルを現在のシェルで実行するためのコマンド
:::

上記を行うと無事に`volta -v`が実行できた。

## おわり
最後まで見ていただきありがとうございました。
個人開発の環境構築をしたときに流していたところを理解しようとまとめてみました。

## 参考
https://qiita.com/iwaseasahi/items/6e00883ccd0864ede17e
https://engineer-ninaritai.com/linux-which/
https://qiita.com/YumaInaura/items/00437e6ab14d96adb71f
https://iifx.dev/ja/articles/11466157
https://envader.plus/article/249
https://oxynotes.com/?p=5418
AWSにクレジットカード登録ができない

## 状況：クレジットカードの情報登録はできるが、未検証のまま
私の場合、持っているクレジットカードはau pay、メルペイ、Vプリカのみでした。
クレジットカード発行を待つのも時間がかかるので作りたくありませんでした笑


クレジットカード登録後、下記の状態でした。
![クレカ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4025083/57308cb9-e8dc-4643-87ed-2a9729c56688.png)


検証を行っても、下記の表示のみ。
![スクリーンショット 2025-03-02 13.18.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4025083/319d1592-149d-479b-baf8-214a23fbd23d.png)

検証後アラートメールが飛んできていて、下記の文章が記載されていた。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
承認の失敗を引き起こす可能性のある一般的な理由は次のとおりです:
* CVV2 セキュリティコードがリクエストされなかった場合、ご利用の銀行が承認を拒否することがあります。ご利用の銀行は、この要件を一時的に解除できる可能性があります。
(以下省略）

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

## 解決方法：じぶん銀行スマホデビットで登録しました
調べてみると「カード会社に電話し、認証を外してもらう」などのやり方もあったのですが、電話苦手なのと認証についてよくわからなかったので、別の方法でできました。

 
私の場合、auじぶん銀行使っていたのでスマホデビットがあったのでそちらを使いました。（発行自体は本当に30秒くらいで登録もできました）

スマホデビットの情報をAWSに登録し、再度検証を行ったところ未検証表示が消え無事に登録できました。


## 一言
丸一日登録に苦戦していました笑
Difyにboto3を変更したカスタムDockerイメージの構築手順



## はじめに
DifyのDockerイメージに特定バージョンのboto3を変更する手順を紹介します。Dockerfileとイメージ名をより意味のある名前に変更し、バージョン管理しやすくする改善を加えています。

---

## 1. Dockerfileの作成
ファイル名を`Dockerfile.dify-api-boto3-1.0.0`に変更（バージョンと機能が分かりやすい命名）

```dockerfile
# Dockerfile.dify-api-boto3-1.0.0
FROM langgenius/dify-api:1.0.0

RUN cd /app/api && \
    pip install \
        boto3==1.35.99 \
        botocore==1.35.99 \
        s3transfer==0.10.4
```

---

## 2. Dockerイメージのビルド
イメージ名を`dify-api:1.0.0-boto3`に変更（ハイフン区切りで統一）

```bash
docker buildx build -t langgenius/dify-api:1.0.0-boto3 -f Dockerfile.dify-api-boto3-1.0.0 .
```

---

## 3. docker-compose.yamlの更新
### 変更点：
- イメージ名を`langgenius/dify-api:1.0.0-boto3`に統一
- サービス間の依存関係とネットワーク設定を確認

```yaml
services:
  api:
    image: langgenius/dify-api:1.0.0-boto3
    # その他の設定は変更なし...

  worker:
    image: langgenius/dify-api:1.0.0-boto3
    # その他の設定は変更なし...
```

---

## 4. コンテナの再起動
データの永続化ボリュームを削除してクリーンな状態で再起動

```bash
docker compose down
rm -rf volumes/
docker compose up -d
```



---

## 注意事項
- 既存のデータが必要な場合はボリューム削除前にバックアップを取得してください
- 本番環境で使用する場合はバージョン番号を適宜変更してください


---

## まとめ
boto3の変更により互換性のあるS3 Storage APIでDifyを運用できるようになります。

---

参考資料：
- [fix: MissingContentLength in boto3 version 1.36.1](https://github.com/boto/boto3/issues/4398)
miseでRubyがinstallできない。

# Problems
[mise](https://github.com/jdx/mise) で[Ruby](https://www.ruby-lang.org/)をinstallができない.

# Solution
```shell
brew install libyaml
```

# Cause

https://www.ruby-lang.org/ja/news/2022/12/25/ruby-3-2-0-released/
> libyaml や libffi のような 3rd パーティのライブラリのソースコードの同梱を廃止しました

Ruby 3.2.0 以降より3rdパーティ生の同梱を廃止しているため.
文字列チェックする際に注意したい正規表現の先頭と末尾

単純に正規表現であるパターンの文字列チェックしたいとき

- 文字の先頭を示す表現は、`^` ではなく `\A`
- 末尾は、`$` ではなく `\z`

とした方が良いことが多い、という話。

`$` は改行(`\n`)も許してしまうことがあるためだ。

`^`と`\A`はそこまでの問題にはならないが、複数行モードで正規表現をかけた場合の挙動が違う。



正規表現なかなか身に付かず、いつもざっとChatGPTに下地をお願いして自分で調べたり、チェックをして修正していたがやたら`^`や`$`を使いがちだなと感じる。
ABC395回答メモ

# 0.はじめに
　緑コーダ復帰後の初戦
　A～Cまでは順調に解けたもののDで苦戦。
　TLEの解決方法が見いだせず、あえなくタイムオーバー。
　茶色に逆戻りしました・・・。


# 1.A - Strictly Increasing?
　リストを2つ目から見ていき、
　参照している値が、一つ前の値以下ならNoを出力して終了
　最後まで参照してプログラムが終了してなければ
　Yesを出力して終了
　
　https://atcoder.jp/contests/abc395/submissions/63243538


# 2.B - Make Target
　たまに見るBの割に難しい問題。
　いい感じの実装方法が分からなかったので、
　問題文をそのまま実装してみました。
　【実装】
　　1.N×Nの2次元リストLを用意し、”.”で初期化
　　2.以下iを１～Nまで繰り返し
　　　-1.変数jにN+1-iをセット
　　　-2.iがj以下の時以下の処理
　　　　-1.ｘとｙをそれぞれ0～ｊまで繰り返し
　　　　　iが奇数なら"#"を偶数なら"."をL[x][y]にセット
　　3.Lを1列ずつ結合して表示して終了

　https://atcoder.jp/contests/abc395/submissions/63265051


# 3.C - Shortest Duplicate Subarray
　問題文はややこしいですが、２つの同じ数の間が一番短い物を調べるだけの簡単な作業。
　まず空の辞書と、変数ans（初期値10の18乗）を用意し、列を先頭から参照
　見ている数字が辞書になければ、その数字をキー、位置を値に登録。
　見ている数字が辞書にあれば、その数字の位置と見ている数字の位置の差+１を求め
　ansをその数とansのうち小さい方で更新しつつ、辞書の値を見ている数字の位置に更新
　最後にansを出力して終了

　https://atcoder.jp/contests/abc395/submissions/63269290


以上
obsidianのフォルダ構成

# 序章
  情報を整理するために使用するツールの目的及び各ツールの整理をした備忘録です．
知識の分け方として単純知識，思考知識，簡単メモ，単純備忘録の四つに大別する．

単純知識：知らない単語の内容や意味，解釈について
思考知識：自分の解釈や他との関連などについて
簡単メモ：タスクやふと思いついた内容
単純備忘録：その日の振り返りなど
ここではobsidianについて記載します．また，メモの取り方はZettelkastenを参考にしたものです．

# 参考・引用文献

# 前提
Notion : 単純知識・database

Obsidian : 思考知識・簡単メモ・単純備忘
- Web記事保存・作成
- dairy

# 目的
  情報管理のために情報整理するため構造を明確にしました．具体的には以下のようなフォルダ構成にしました．
## 構成
```file
.
├─01_regulr_notes
│  ├─2024
│  └─2025
│
├─02_Knowledge
│  ├─10_IT 
│  │  ├─01_OS
│  │  ├─02_AI
│  │  ├─03_Edit
│  │  ├─04_Software
│  │  └─05_Algorithm
│  ├─20_Machine
│  ├─30_Mathematics
│  ├─40_Literature
│  ├─50_Thinking
│  ├─60_Education
│  └─99_Unknown
│
├─03_Courage
│  ├─B3
│  └─B4
│
├─04_ZettelKasten
│  ├─00_IndexNote
│  ├─10_leetingNote
│  ├─20_PermanentNote
│  └─30_References
│
├─05_Output
│  └─Note
├─98_assets
│  └─images
└─99_templates
    ├─input
    ├─note
    ├─output
    ├─systerm
    └─zettelkasten
        ├─leetingNote
        ├─PermanentNote
        └─References
```

# 実装したプラグイン

- Kanban
    - 右サイドバーに表示
- Calender
    - 右サイドバーに表示
- Git
    - データ保存用
- Auto Link Title
- Day Planner
    - 時間別タスク管理用
- DB Folder
- Thino
    - メモをとるため
- Templater
    

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807183/46ee0f91-33a6-49f5-8eb9-846f0dfe072a.png)

必要機能やタスクを右サイドバーでタスクや日程，メモをすぐに取れるよう調整しました．右サイドバーは左のアイコンをドロップ＆ドラックで調整できます．
生成AIツール『Perplexity』を使ってみた

# はじめに

エンジニアのみなさま、日々の学習お疲れ様です。
また本記事まで足を運んでいただき本当に感謝です。

今回は生成AIツールである『Perplexity』について、使い方をまとめてみました。


#  Perplexity（パープレキシティ）とは

Perplexityは、**自然言語処理技術** と **機械学習機能** が実装された **チャットボット型の検索エンジン** です。Google出身のAIエンジニアらによって設立されたスタートアップ企業「Perplexity」によって開発されました。

https://www.perplexity.ai/ja/hub/getting-started#what-is-perplexity

# 使ってみた

### 無料で簡単に利用可能（2025年3月2日時点）

添付アカウントのいずれかを使ってすぐに使える様になります。

![スクリーンショット 2025-03-01 19.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/bad2dd51-f6c9-4825-8235-19f25c370e2e.png)

### 料金プラン

有料プランも約3,000円/月で利用できます。無料との比較はこんな感じ。
個人的には無料でも十分な印象を受けました。

![スクリーンショット 2025-03-01 19.55.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/d0310d36-7f61-420c-be7a-8e2e82a3ce0d.png)

### UI

![スクリーンショット 2025-03-01 19.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/a5130acb-12f6-4a8d-bc7d-b2ade4208c01.png)

めっちゃChatGPTライクです。
複数の推論モデルを選択できるため、サクッと調べたい時は『自動』や『プロサーチ』、大規模なデータ処理と分析は『ディープリサーチ』、高度な推論は『o3-mini』の様に使いわけが出来そうです。

ちなみに推論モデルを『自動』、プロンプトを「webエンジニアの学習ロードマップを教えてください」と入力した時の検索結果はこちら。

![スクリーンショット 2025-03-02 12.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/eec34eef-6c7e-4067-a3e1-8d17ec045710.png)

検索結果の冒頭に引用元が表示されるため、信頼性を確認しやすく、個人的には見やすいと感じました。また、画面右側の画像をクリックすると、関連画像が一覧表示されます。

![スクリーンショット 2025-03-02 12.42.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/836e44aa-9308-4bb9-9484-4ab16b434a56.png)

さらに、プロンプトに関連する候補をいくつか提案してくれるのも便利です。
Google検索でも関連候補が表示されますが、Perplexityはそれに近い使い勝手を提供してくれます。

![スクリーンショット 2025-03-02 12.44.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/a356db5a-f421-470c-9447-f94dd4f2a45e.png)

サイドバーの『発見』をクリックすると、人気のトピックや最新のトレンドを手軽に見つけることができます。

![スクリーンショット 2025-03-02 12.50.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/f65fb684-e2bf-4ac1-9952-449cb77808b6.png)

例えば、気になる記事をクリックし、その記事に対しての背景やユーザーコメントを情報収集し『自分だったらどう考察するか？』みたいな使い方をすると、考える事のトレーニングになり、思考力の向上にも繋がりそうですね。


# さいごに

個人的にはChatGPTより好きです。

生成AIに関連する記事をいくつか投稿しているため、もし興味があれば合わせて読んでもらえると嬉しいです。

https://qiita.com/ho_na/items/759102166e3e06b92aaa

https://qiita.com/ho_na/items/79495ee3ed55f6016998

------


弊社の紹介もさせてください！

### 「日本で一番エンジニアが成長できる会社を創る」

https://prum.jp/

弊社メンバーは日々学習した内容をアウトプットしております！
少しでもご興味を持たれた方は求人を見てみてください！
ご応募もお待ちしております！

### 最後までご覧いただき、ありがとうございました！
「思考のスピード」は型で速くなる

## 思考を加速する「フレームワーク思考法」

仕事：インプット -> 思考 ->　アウトプット

思考のスピードが速い人は「型」すなわちフレームワークを使う

## 「フレームワーク」MECEで全体像を把握する

Mutually Exclusive ダブりなく

Collectively Exhaustive　モレなく

### MECEの切り口

1. 要素分解
    - 世界地図の例のように、ある事象をどういう要素に、どう分割できるかを考えること
2. 因数分解
    - 「売上＝顧客数x単価」というように、ある式を構成する要素を切り口にするという考え方
3. プロセス
    - 手順や順番、時系列に沿って分解してみること
4. 原因と結果
    - その事象を引き起こしている原因を洗い出すという切り口
5. 対立概念
    - 「長所と短所」「強み弱み」「内と外」といった切り口
6. グループ化
    - 全体像が見えていない中で、構成要素をまず洗い出し、似ている要素ごとにまとめていき、グループ化し、全体像を浮かび上がらせるという方法

## 「フレームワーク」ピラミッドで「構造化する」

ピラミッドで段階的に階層構造化する

## 「フレームワーク」課題解決のフレームワーク

事象、課題、解決策

WHYを５回

## ２本の線でフレームワークを作る

- 真ん中で交差する４象限タイプ

- マトリクスタイプ

- グラフタイプ

## 憶測や意見ではなく「事実」をインプットする

書かれていることが、憶測なのか、意見なのか、事実なのか

情報の出所がどこなのか出典を確認する、

いつの情報なのか、他の意見や事実とされているものが無いかなどを調べることが必要

## 事実を捉えるために、「視点」「視野」「視座」を変える

- 視点：「何の、どこをみているか」

- 視野：「見ている範囲」

- 視座：「どの立場、どの場所から見るのか」

## 「タテ」と「ヨコ」の質問で最短で本質にたどり着く

- 「ヨコの質問」：広げる質問

- 「タテの質問」：深掘りをする質問

## 健全に「疑う」ことで手戻りをなくす

1. インプットデータは何か
2. どのようなアプローチを取ったか
3. アウトプットをどう評価しているか

## 数字は「絶対数」だけで捉えない

- 「母数」と比べてどうか
- 「他」と比べてどうか
- 「以前」と比べてどうか

## 深く理解するための手書きの効用

情報を頭の中にしっかり入れるために手書きする
仕事の進め方とPDCA

## 仕事の進め方とPDCA

成果が出たかどうか / 評価に値するかどうかを決めるのは**常に相手**

仕事を進めるにあたっての４つの基本的な考え方

### 相手目線

相手は何を期待しているか？

相手が気にしていることは何か？

相手の立場にたって**想像**すること

### 他者視点

自分の取り組む仕事の関係者と影響範囲を想定する

関係者：どのような人がかかわ関わっているか？

影響範囲：誰に影響を及ぼすか？

前工程 -> あなたの仕事 -> 後工程

### QCDR

Quality：品質

Cost：コスト、予算

Delivery：納期

Risk：リスク

仕事においては、QCDRのバランスをとることが大事

### PDCA

#### Plan / 計画

- 目的：なのためにやるのか
- 目標：何をどの程度（水準）まで、いつまでにやるのか
- 手段：どのような手順で、何を行うのか

自分なりに目的/目標/手段を考え、行動すること

#### Do / 行動、実行

##### 着手前

-　今回の作業で何をどこまでやるのかを整理する
-　定刻に開始できるように必要なもの、環境を準備する

##### 着手中

- 時間を忘れない
- 他のことを思いついたら、メモしておく（思いついた順に着手しない）

##### 着手後

- 目的、目標を踏まえ、水準を満たしているかを確認する
- どの程度時間がかかったかを確認する

#### Check / 検証、評価

試行 -> 経験 -> 省察 -> 概念化 -> 試行

#### Action /　改善

振り返りの予定を計画する

振り返りの視点(KEEP、PROBLEM、TRY)
git diff

## git diff とは

commits, commit, working treeなどの間の変更を表示する

### Comparing with arbitrary commits

```shell
git diff main
```

現在の**branch**と`main`の**branch**を比較する

### --name-only

```shell
> git diff --name-only main
a.txt
b.txt
c.txt
```

変更されたファイルの名前のみを表示する

### --name-status

```shell
> git diff --name-status main
M       a.txt
D       b.txt
A       c.txt
```

変更されたファイルの名前と状態のみを表示する

### --diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

指定したファイルの変更状態のみを表示する

- A:Added
- D:Deleted
- M:Modified
- R:Renamed

なお、大文字は指定、小文字は指定しない

```shell:upper-case letters
> git diff --diff-filter=AM --name-status  main
M       a.txt
A       c.txt
```

```shell:lower-case letters
> git diff --diff-filter=a --name-status  main
M       a.txt
D       b.txt
```

## Reference

https://git-scm.com/docs/git-diff
git alias

## aliasとは

`git status` というコマンドをaliasを設定することにより、 `git st` で使える

## 設定方法

### command

```zsh
git config --global alias.st status
```

### .gitconfigに追加

```zsh
[alias]
	st = status
```

## 例
```zsh
[alias]
	br = branch
	st = status
```

## Reference

https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases
論理設計

## 論理設計のステップ

論理設計は以下の4つのステップからなる

### 1. エンティティの抽出

どんなデータを管理するエンティティ(テーブル)が必要かを明確にする

### 2. エンティティの定義

エンティティ(テーブル)ごとにどんな属性(カラム)が必要かを明確にする

#### エンティティとは? 

システムにおいて管理する必要があるデータのこと

エンティティ(Entity)は日本語で「実体」という意味

具体的には、顧客、社員、店舗のような物理的実体を伴うものもあれば、注文、予約というような概念としてしか存在しないものもある

RDBにおいては、テーブルの名前になるものという理解でもよい

### 3. 正規化

テーブルを分割することでデータの冗長性(ムダ、重複)をなくす

正規形には第1~第5正規形までが存在する

業務では第3正規形までを考えることが多い

#### 第1正規形

「1つのフィールドには1つの値しか含まない」という原則が守られた形

#### 第2正規形

部分関数従属が解消されていて、完全関数従属のみのテーブルになっている形

##### 関数従属性とは

`y = f (x)`というように`x`の値を1つ決めれば`y`の値が1つに決まる関係性のこと

この関係が成立している状態「`y`は`x`に従属するという

このとき記号では「`{x}→{y}`」というように表す

#### 第3正規形

推移的関数従属が解消されている形

##### 推移的関数従属とは

2段階の関数従属がある状態

### 4. ER図の作成

複数のテーブルの関係性(リレーション)を可視化するには、
ER図(Entity Relationship Diagram)を用いる

#### リレーションの種類

外部キーなどによって、同じ意味の列を持つテーブル間には、 関連(リレーション)があり、

テーブル間のリレーションには以下の2種類がある

1. 1対多(1:N)
2. 1対1(1:1)
Snoflakeのデータ保護について　

# 1.金融業界等ではデータ保護が必要不可欠

昨今、データ保護については考えることについて、必要不可欠な存在となっております。
データ分析基盤構築などに、DWHの検討を考えている企業は多いのではないでしょうか

Snowflakeもその中の１つであり、エディションによっては機密データを保護することも可能です。

:::note info
SnowflakeでのBusiness Critical Editionでは高い機密性を確保することが可能
:::

https://docs.snowflake.com/ja/user-guide/intro-editions#business-critical-edition

データ保護にもさまざまなセキュリティ基準があります。
医療業界においては、HIPAAという業界標準のセキュリティ基準が存在します。

:::note info
HIPAA：医療業界向けで、プライバシーと機密性の2つのコア側面を持つ患者の健康情報を保護することに重点を置いています。
:::

今回は、金融業界におけるデータ保護（PCI DSS）について学んでいきます。
SnowflakeのBuisiness Critical Editionでは、この情報セキュリティ基準をサポートしております。

# 2.PCI DSSとは

>> PCI DSS（Payment Card Industry Data Security Standard）とは、クレジットカード会員の情報を保護することを目的に定められた、クレジットカード業界の情報セキュリティ基準

https://www.tis.jp/special/platform_knowledge/pci01/

2004年に国際カードブランドのAmerican Express、Discover、JCB、MasterCard、VISAの5社によって策定されました。
現在は、その５社が共同設立した組織であるPCI SSC（PCI Security Standards Council）によって運営／管理されています。

## PCIの主な目的
取引中のカード会員データの保護
不正防止とデータセキュリティ

## 保護されるデータの種類
支払いカード情報

## PCI-DSSコンプライアンス

### ネットワークの保護
保存されたデータを保護し、デフォルト設定を変更
また、ファイアウォールをインストールする必要があり

### カード所有者のデータを保護する
データ転送を暗号化する

# 3.エディションによっては、PrivateLinkへの接続も可能
Snowflakeとのプライベート接続として、PrivateLinkの接続もサポートしております。
前提条件として、
・VPCリージョンとSnowflakeのリージョンが同一であること
・SnowflakeをBusinessCritical以上のエディションで利用していること

こちらが実際に、SnowflakeとPivatelinkを確立させた有益なブログになります。

:::note warn
警告
３年以上が経過している設定のため、一部変更が生じている可能性があります
:::

https://qiita.com/jnit/items/e143fac5ef276dd8e8f1

もし仮にPrivateLinkについて概要から知りたい場合は、こちらの動画をお勧めします。

https://www.youtube.com/watch?v=ZCOaHCHcppc


## ユースケース

### DHWとBIサーバーの通信

EC2に仮にサーバーを立てているとします。
DWHとBIサーバーとの接続はよくデータ基盤構築にはよく出てくる構成かと思います。

BIサーバーをEC2インスタンスに立てている場合
Snowflakeとの接続をよりプライベートで行いたいかと思います。

そこで、PrivateLinkを使用することで、SnowflakeとBIサーバーとの通信がインターネットゲートウェイを必要とせずに通信が可能になるので、良い構成になるかと思います。
Alfredからシェルを実行可能にする（無料版で）

# 背景
Alfredは有料のPowerpackを使えば入力欄からシェルを実行できるようになりますが、実は、シェルを実行するだけであれば無料版でも無料版のみで実現できます。

# 方法
- 実行したいシェルをapp化して
[Macでシェルスクリプトを .appアイコン化する方法 #MacOSX - Qiita](https://qiita.com/KurosawaTsuyoshi/items/425cd484e8d7759af460)
- alfredからappを実行します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610591/2e259f3b-5e83-4670-9d32-cb0cabb2f0c8.png)
asdfでpoetry 2x にupgradeするときにSetting virtualenvs.prefer-active-python does not existが出る

## エラー
```
Poetry (2.1.1) is installed now. Great!

You can test that everything is set up by executing:

`poetry --version`

Configuring poetry to behave properly with asdf ...
Running: "poetry config virtualenvs.prefer-active-python true".


Setting virtualenvs.prefer-active-python does not exist

Cleanup: Something went wrong!
```

## GitHub Issue

https://github.com/asdf-community/asdf-poetry/issues/54

## 解決策

修正されているので、pluginをupgradeする

```
asdf plugin-update poetry
```

```
asdf install poetry 2.1.1
```

```
You can test that everything is set up by executing:

`poetry --version`

Configuring poetry to behave properly with asdf ...
Running: "poetry config virtualenvs.use-poetry-python false".
```

:tada:
【簡単】ApacheでBasic認証

# はじめに
- ApacheでBasic認証の設定する時のメモとして残します。

# 環境/前提
- Apacheインストール済み
- Apache：2.4.63
- ubuntu：24.04.2

# 内容
## 認証ユーザーとパスワードを設定
- `-c`にすると新規作成だけじゃなくて、上書きも可

```
sudo htpasswd -c /etc/apache2/.htpasswd ユーザー名

# 2回パスワード聞かれるので入力する
New password: パスワード
Re-type new password: パスワード
```

## アクセス権を設定

- `.htpasswd`ファイルをapacheのみがアクセスできるように設定
- `600`：所有者 (ユーザー) に読み取りと書き込みの権限あり。グループと他のユーザーへは権限なしで設定

```
sudo chown apache:apache  /etc/apache2/.htpasswd
sudo chmod 600 /etc/apache2/.htpasswd
```

## Apacheの設定

- `conf`ファイルの設定

```
vim /etc/httpd/conf/httpd.conf

# 以下を入力
<Directory "/var/www/html">//ここはrootを記載
      AuthUserFile /etc/httpd/conf/.htpasswd
      AuthGroupFile /dev/null
      AuthName "Basic Auth"
      AuthType Basic
      Require valid-user
</Directory>

```

- Apache再起動

```
sudo systemctl restart apache2
```

- 該当ページへアクセスして確認する

# まとめ
他にもBasic認証の方法がありますが、Apacheでする方法が簡単だったので、今回はこちらをメモとして残し。CloudflareのWorkersでもBasic認証できるみたいなので、今度はそれを試してみたい。

# 参考
- [Apacheでユーザー認証を行うには（Basic認証編）](https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/698apachebasic.html)
- [Basic認証設定](https://qiita.com/shell/items/5606d37a802e39479036)
【React】MUIのTooltipで文言を改行したい

## 概要
MUIの[Tooltip](https://mui.com/material-ui/react-tooltip/?srsltid=AfmBOorsKJRQn-dvVOjulvrICjWRmzE7wgHlT_L9hnRcgOvJeuKTyYLn)は、ホバーした時に吹き出しを表示させるコンポーネントです。この吹き出しの中で`title`に改行文字を含む値を入れて設定したのですが、Tooltipのコンポーネントに改行用のスタイルをあてても効きません。
というわけで、どうやって改行文字を含む文言のスタイルを当てればいいのかというメモ書きです。

## 前提
* 使用したmui/materialのバージョンは`6.4.6`です。

## 対応方針
[こちら](https://stackoverflow.com/a/68206111)のstackoverflowの回答にある通り、Tooltipのtitleにelementを設定します。実際にtitleに設定できる型はReactNodeになっています。


## 実装サンプル
```react
import { FC } from "react";
import { Button, Tooltip } from "@mui/material";

export const TooltipSample: FC = () => {
  return (
    <div style={{ marginTop: "20px" }}>
      <Tooltip
        title={
          <div style={{ whiteSpace: "pre-line" }}>{`sample1
sample2`}</div>
        }
      >
        <Button variant="contained" sx={{ textTransform: "none" }}>
          tooltip改行テスト
        </Button>
      </Tooltip>
    </div>
  );
};
```

以下のように改行が反映されて表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/eb92bd5e-33d5-4bb5-a177-3e8e23825acd.png"  width="250px">
【勉強記録】Qiita自動投稿＆X自動ポストシステムをGitHub Actionsを使って再現してみた part1

# はじめに

こんにちは。私はアメリカで独学でエンジニアを目指している者です。以前の記事でも取り上げましたが、Qiitaへ投稿しGitHubにもpushするスクリプトと、Linuxのcronを活用した自動投稿機能の組み合わせにより、Qiitaへの投稿を自動化できるのではないかという仮説のもと、GitHub Actionsで実現可能であることを確認し、実際に作ってみました。すべてを一気に解説すると長くなりそうなので、以下の3本立てで記事を構成する予定です。

- システムの仕組み構築（作戦編）
- QiitaおよびGitHubへのpushを行うスクリプト
- Xへの自動ポストを作成するスクリプト

## システム開発に至った背景

2月から3月中旬まで日本に一時帰国するため、これまでのようにPCをすぐに立ち上げて作業できる環境が確保できない可能性がありました。また、限られた勉強時間の中で記事投稿の手間をできるだけ省きたいという思いから、この自動化システムの開発に取り組むことにしました。

まずは、記事投稿の流れを説明する前に、ディレクトリ構成と管理方法についてご紹介します。

### ディレクトリ構成

以下のようにディレクトリを整理しています。

```
ユーザー/
├─ refuge_qiita/
│  ├─ stock1.md
│  ├─ stock2.md
│
├─ qiita_github/  ← GitHubで管理しているリポジトリ
   ├─ public/
      ├─ article1.md
      ├─ article2.md
      ├─ article3.md
```

- **qiita_github/**
  GitHub上で管理しているリポジトリです。
- **refuge_qiita/**
  まだQiitaに投稿していない記事をストックとして保存しておくためのディレクトリです。記事を`qiita_github/`に置くと、どこまで投稿済みかが分かりにくくなるため、別に管理しています。

この方法が最適かは今後の検討課題ですが、現状はこのような形で記事を管理しています。

### 記事投稿の流れ

自動化する前の、手動での投稿手順は以下の通りです。

1. **記事ファイルの移動とリネーム**
   `mv`コマンドを使用して、投稿する記事ファイルを`qiita_github/`に移動します。
   その際、`qiita_github/public`内の最新のファイル（例：article3.md）の番号に1を足した名前（例：article4.md）にリネームし、`npx qiita article4`コマンドでQiitaへ投稿します。
2. **GitHubへのPush**
   `git`コマンドを利用して、変更内容をGitHubにpushします。
3. **記事の共有**
   Qiita上でXボタンをクリックし、記事を共有します。

### 自動化に必要な処理

上記の流れを完全自動化するため、以下の処理が必要です。

1. **記事ファイルの選択と移動**
   `refuge_qiita`から、最も番号が小さいストックファイルを選択し、`qiita_github/public`へ移動します。
   移動後、`qiita_github/public`内の最新のarticle番号に1を足した名前にリネームし、`~/qiita_github`ディレクトリに配置、必要なターミナルコマンドを実行するファイルを作成（済）。
2. **定期実行の設定**
   cronを用いて、毎日決まった時間に上記の処理を自動で実行します。
3. **クラウド上での実行**
   GitHub Actionsの`.github/workflows`を利用し、クラウド上でスクリプトを実行する仕組みを構築します。

## 実装にかけた時間と工夫した点

実際に実装を進める中で、以下の点に取り組みました（全体で約5時間程度の作業でした）。

1. **リポジトリの管理**
   `refuge_qiita/`をGitHub上にPush（公開の必要がないためprivateリポジトリを使用）。
2. **Qiita CLIのセットアップ**
   GitHub Actions上でQiita CLIを実行するため、qiita-cliのインストールコマンドを実行。
3. **認証情報の管理**
   privateリポジトリからファイルを取得するために、PAT（Personal Access Token）が必要。
4. **Qiita記事の情報取得**
   Xに投稿する際、Qiitaの記事URLおよびタイトルを同時に取得する必要がある。
5. **X APIの利用**
   XのAPIを利用するため、X Developerへの登録とTokenの取得が必須。
6. **専用gemの活用**
   X専用のgemを利用して、ymlファイルおよびRubyスクリプトの作成を行いました。

これらの具体的な実装手順については、次回以降の記事で詳細に解説していく予定です。
二文字のドメインを取得する方法

## 短くてカッコいいドメインが欲しい！

### 1. 「.com」はモテモテ、でも高い！
世の中には星の数ほどドメインがあるけど、やっぱり「.com」は大人気。  
「もっともポピュラーなトップレベルドメインどーん！」と気軽に取りに行こうとしたら、たいてい「プレミアム料金」か、すでに取られてるという現実が待っている。  
そこに金の斧銀の斧のような奇跡は起きない。**きつい。**  

### 2. そうだ、.gyにしよう
「なんなら短いのに安くてイケてるのを見つけたい…」とさまよい歩いた結果、  
みつけたのが「.gy」ドメイン。  
- 「.gy」は国別コードで、ちょっとマイナー。  
- そのぶん、**２文字**の空きがそこそこある(かもしれない)。  
- プレミアムじゃないからお財布にもわりと優しい。  

### 3. 総当たりで探してみた
こつこつ手動で探すのは修行僧か！と思ったので、Pythonのスクリプトで**2文字パターン総当たり**。  
「あ、ここ空いてる！」「ここはもう取られてる…」と判定し続ける。  
すると、**十数個**は空いている！  
その中から一番覚えやすいドメインをゲット。  
ほぼガチャ感覚で楽しかった。  

### 4. 取得先
実際に手に入れるのは簡単で、普通のレジストラ(例: [Gandi](https://www.gandi.net/ja/domain/tld/gy))でポチッと購入。  
あとはDNS設定でドキドキするくらい、普通のドメイン取得とほぼ同じ。  

---

> **まとめ**  
> - **短いドメイン欲しい！** → 「.com」は高いor すでに無い  
> - **でも諦めない！** → 「.gy」は2文字もいける  
> - **Pythonで総当たり** → ちょっとした宝探し状態  
> - **手に入れたら** → ドメインを眺めてにやにやできる（自己満足）

気軽に短ドメインを楽しむなら、一度.gyも検討してみるのはアリ！
はしれ！ももちどり

## あそびで「百千鳥」Webフォントで鳥さんが走るアニメーションを作りました

※PCで見た方が速く走っているように見えます

https://codepen.io/sararilfy/pen/vEYgQVa

## 作ったいきさつ

[先月、Adobeから「百千鳥」というバリアブルフォントが発表されました。](https://blog.adobe.com/jp/publish/2025/02/13/cc-design-adobefonts-2502)

このフォントに鳥さんの絵文字が入っているということで、この鳥さんはイラレで召喚でき、文字幅やウェイトを変えることによって鳥さんが動くというものでした。

https://x.com/hamko1114/status/1890401845753049277

この鳥さんでアニメーションできないかな？
と思い立って、「[百千鳥 VF](https://fonts.adobe.com/fonts/momochidori-variable)」のWebフォントを見たところ、「🐦️」の絵文字で鳥さんを召喚(表示)することができた！！！ので、CSSで遊びました！

## ソースコードの詳細


### バリアブルフォントのCSSの扱いとCSSアニメーション

以下記事を参考にして、アニメーションのさせ方もこの記事を参考にしました。

https://ics.media/entry/201008/

鳥さんは[font-variation-settings](https://developer.mozilla.org/ja/docs/Web/CSS/font-variation-settings)というCSSプロパティで、`wght`（font-weight / 太さ）を変えることで動かすことができました。

CSSアニメーションで、足をバタバタさせる速さは0.06秒でめっちゃ速めにしてます（笑）。
[イージング](https://developer.mozilla.org/ja/docs/Web/CSS/animation-timing-function)は`ease`で落ち着きました。（`ease-out`だとなんか違和感がありました。）

```css
.bird-run {
  animation: run-animation .06s ease infinite alternate;
}
@keyframes run-animation {
  from { font-variation-settings: "ital" 0, "wght" 200, "wdth" 120; }
  to   { font-variation-settings: "ital" 0, "wght" 900, "wdth" 120; }
}
```

### アニメーション切り替えのタイミングはJavaScriptで

* 3秒 ズンっズンっズンっと全身でリズム取る
* 2秒走る
* 全身でリズム取りに戻る

の3つのアニメーションを組み合わせがややこしかったので、アニメーションはCSSのClass名で分けて、`setTimeout()`で秒数数えて`.classList.replace()`でClass名を切り替えることにしました。同期は`async/await`で取っています。

```javascript
'use strict';

(async () => {
  await new Promise((resolve) => {
    setTimeout(() => {
      document.getElementById('bird').classList.replace('bird-rap', 'bird-run');
      document.getElementById('bird-cage').classList.add('bird-move');
      resolve();
    }, 3000);
  });
  await new Promise((resolve) => {
    setTimeout(() => {
      document.getElementById('bird').classList.replace('bird-run', 'bird-rap');
      resolve();
    }, 2000);
  });
})();
```


## さいごに感想

`font-variation-settings`をよく知っていなかったので勉強になりました！
お仕事でアニメーション表現の幅が広がるといいなと思います。
ECサイトへのサイバー攻撃による国内クレジットカード情報漏えいインシデントまとめ/2025年1月〜2月公表分

# 概要

- 2025年1月〜2月に公表されたクレジットカード情報漏えいインシデントのまとめです

# notes
- この月間に公表したものなので、各インシデントごとの被害発生期間は別です
- どの程度のインシデントと被害が月ごとに発生しているかの備忘録であり報道記事ではないので、原則として当事者法人等の個別具体的名称は書きません
- 被害に該当可能性のある人には事業者等より個別に連絡があると思われます


# 当月の被害の概要

- 1月に公表されたクレジットカード情報漏えいインシデントはありませんでした
- 2月は、2件のクレジットカード情報漏えいインシデントが国内で公表されました
- 合計で、8,803件ほどのクレジットカード情報について漏えいの可能性があるそうです

# 当月のインシデント

## 1. スポーツ用品販売サイト

### 被害について
- 7,455件のセキュリティコードを含むクレジットカード情報漏えいの可能性があります
- クレジットカード情報の漏えい期間は、2021年4月13日～2024年7月26日とのことです
- 8,257件の個人情報の漏えいの可能性があります

### 経緯・原因等

- 2024年7月26日に、クレジットカード会社より漏えいの可能性の連絡を受けてインシデントが発覚したそうです
- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、当該サイトの脆弱性の放置と推測されます
- また、当該サイトの管理運用においてセキュリティ侵害を検知する仕組みが不足していたか存在していなかったため、被害発生期間が長期化した原因につながったものと思われます

## 2. 食品販売サイト

### 被害について
- 1,348件のセキュリティコードを含むクレジットカード情報漏えいの可能性があります
- クレジットカード情報の漏えい期間は、2021年4月5日～2024年5月28日とのことです
- 個人情報の漏えいについては、上記クレジットカード情報漏えい以外の被害についての言及はありません

### 経緯・原因等

- 2024年5月28日に、警察より漏えいの可能性の連絡を受けてインシデントが発覚したそうです
- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、当該サイトの脆弱性の放置と推測されます
- また、当該サイトの管理運用においてセキュリティ侵害を検知する仕組みが不足していたか存在していなかったため、被害発生期間が長期化した原因につながったものと思われます


# 感想

- 当月のインシデント件数・規模は、近年の傾向としては平均的と思います


# おまけ

## 「クレジットカード・セキュリティガイドライン」

- [経産省：「クレジットカード・セキュリティガイドライン [5.0版]」](https://www.meti.go.jp/press/2023/03/20240315002/20240315002.html)
- [(一社)日本クレジット協会:関連資料](https://www.j-credit.or.jp/security/document/index.html)

## IPA(独立行政法人情報処理推進機構)
- [ECサイト構築・運用セキュリティガイドライン](https://www.ipa.go.jp/security/guide/vuln/guideforecsite.html)

## 個人情報保護委員会
- [個人情報保護委員会](https://www.ppc.go.jp)
    - [個人情報保護委員会 - 個人情報保護法関連法令・ガイドライン等](https://www.ppc.go.jp/personalinfo/legal/)
    - [個人情報保護委員会 - 個人情報保護法相談ダイヤル](https://www.ppc.go.jp/personalinfo/pipldial/)
    - [個人情報保護委員会 - 漏えい等の対応とお役立ち資料](https://www.ppc.go.jp/personalinfo/legal/leakAction/)

## 割賦販売法関連
- [割賦販売法](https://laws.e-gov.go.jp/law/336AC0000000159)
- [割賦販売法施行令](https://laws.e-gov.go.jp/law/336CO0000000341)
- [割賦販売法施行規則](https://laws.e-gov.go.jp/law/336M50000400095)
- [経産省サイト - 割賦販売法](https://www.meti.go.jp/policy/economy/consumer/credit/11kappuhanbaihou.html)

## 経産省
- [クレジットカード・セキュリティ官民対策会議](https://www.meti.go.jp/shingikai/mono_info_service/credit_card_security/index.html)
(2024年4月9日〜)
- [クレジットカード決済システムのセキュリティ対策強化検討会](https://www.meti.go.jp/shingikai/mono_info_service/credit_card_payment/index.html)
(2022年8月4日〜2023年1月20日)
    - [クレジットカード決済システムのセキュリティ対策強化検討会 報告書](https://www.meti.go.jp/shingikai/mono_info_service/credit_card_payment/pdf/20230120_1.pdf)
    - [クレジットカード決済システムの更なるセキュリティ対策強化に向けた主な取組のポイント](https://www.meti.go.jp/shingikai/mono_info_service/credit_card_payment/pdf/20230120_2.pdf)


# フッター

## 仲間を募集しています！

ARIではエンジニア・ITコンサルタント・PM職全方位で仲間を募集しております。
カジュアル面談、随時受付中です！
ご興味ある方はこちらをご覧ください。

https://note.com/ari_hr/n/n4aed9ba75421
Qiitaのアカウントが停止させられた

Qiitaに登録して早々、Qiitaのアカウントが凍結させられ、ログインできなくなりました。
Qiitaのお問い合わせサポートにクレームを伝えたら凍結が解除されて、ログインできるようになりました。
【Android】　build生成時に自動生成



# BuildConfigに追加する


gradle.properties　に下記のようにbuildConfigFieldを使って定義する。

```php:gradle.properties.kts(:app)
  defaultConfig {
    ...

    buildConfigField("String", "KEY", "あいうえお")
  }
```

すると、下記のようにBuildConfigに自動生成される。

```php:BuildConfig.java
  public static final String KEY = "あいうえお";
```

あとは
```php:MainActivity.kt

    val a: String = BuildConfig.KEY

```
というように使用できる。
Androidで動画を長押しで早送りする機能について

掲題の、Youtube等に搭載されている長押しで早送りする機能を作った時に得た知見について記録します。

## 動画再生ページ仕様
BottomSheetBehaviorを用いて動画表示部分を下にスワイプすると、指の動きに画面ごと追従しながら閉じること(詳細は[こちらの記事](https://qiita.com/sefwgweo/items/8dd13ed774925c06617f)の「透明Activityの作り方と活用方法」を参照ください)

## 実装時に起きた問題点
1. 対象となる動画表示画面に対してFragmentで`onLongPress`を早送りとして実装しただけでは、長押し中に少しでも指を上下左右に動かしてしまうと`onLongPress`判定が外れてしまい、早送りしなくなってしまった

1. 上記問題を解消するために、対象の動画表示画面のviewの`setOnTouchListener`でイベントをハンドリングすることで回避できるかを検証した
具体的な簡易コードとしては以下

```kotlin
view.setOnTouchListener { _, event ->
    when (event.action) {
        MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
            // ここにログを貼って、全てのEventについて検証した
            longPressListener.onLongPress(onLongPressing = false)
        }
        else -> {
            // ここにログを貼って、全てのEventについて検証した
        }
    }
    gestureDetector.onTouchEvent(event)
    true
}
```

## 長押し状態が外れてしまう原因
長押し中に少しでも指を上下左右に動かしてしまうと`onLongPress`判定が外れてしまう根本原因は上記の、下スワイプで画面を閉じる仕様が影響していた
上記のコード内で全てのMotionEventに対してログを貼って検証すると`ACTION_CANCEL`に入っていたことがわかりました

`ACTION_CANCEL`が呼ばれるパターンとしてはざっくり以下となっています
- 親Viewによるモーションの奪取
- タッチイベントのキャンセル
- タッチ範囲外への移動
- onTouchメソッドでの処理

今回は対象画面の親Activityで定義した、下にスワイプすると指の動きに画面ごと追従しながら閉じるBottomSheetBehaviorの操作、つまり「親Viewによるモーションの奪取」によって起きていたことが根本原因でした

## 解決した実装

完全に仕様を同じのまま問題を解決した状態で動作させることは難しかったですが、以下のように実装しました。
ポイントとしては、長押し中のスワイプアクションを親Viewに奪われないように`requestDisallowInterceptTouchEvent(true)`を追加します。
また、それだけだと上記仕様の下スワイプで画面を閉じる、が死んでしまうので動画表示画面で下スワイプしたときに外からdownSwipeListenerを与えることでコントロールできるようにしました(下スワイプ時、指の動きに画面ごと追従させる、は実現できていません)
```kotlin
 val gestureDetector = GestureDetector(view.context, object : GestureDetector.SimpleOnGestureListener() {
            private val swipeThreshold = 100
            private val swipeVelocityThreshold = 100

override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
    singleTapListener.onSingleTap()
    return true
}

            override fun onLongPress(e: MotionEvent) {
                longPressListener.onLongPress(onLongPressing = true)
                view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
            }

            override fun onFling(e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
                val diffY = e2.y - e1!!.y
                if (abs(diffY) > swipeThreshold && abs(velocityY) > swipeVelocityThreshold) {
                    if (diffY > 0) {
                        // 下スワイプ検知
                        downSwipeListener.onDownSwipe()
                    }
                }
                return super.onFling(e1, e2, velocityX, velocityY)
            }
        })

        view.setOnTouchListener { _, event ->
        // 親View側で処理を奪ってほしくないので以下を追加
            view.parent.requestDisallowInterceptTouchEvent(true)
            
            when (event.action) {
                MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                    // 指が画面から離れるか、異常を検知したらonLongPressingを終了
                    longPressListener.onLongPress(onLongPressing = false)
                }
            }
            gestureDetector.onTouchEvent(event)
            true
        }
```
DifyでOracle Base Database Service(23ai)を利用する設定手順


## はじめに
本記事では、Difyプラットフォームと[Oracle Base Database Service](https://www.oracle.com/jp/database/base-database-service/)（23aiエディション）を連携させる方法を解説します。クラウド環境における大規模データ処理を想定した設定方法となっています。

## 前提条件
- Oracle Base Database Service 23ai の稼働環境
- 基本的なSQLコマンドの操作知識
- Dockerランタイムの利用可能な環境


## 1. データベース側の設定

### 1.1 接続設定とユーザー作成

sshでOracle Base Database Serviceのコンピュート・インスタンスに接続して、以下コマンドを実行

```sql
$ sqlplus / as sysdba

-- コンテナデータベースへの接続
SQL> alter session set container=<PDB名>;

-- 接続数パラメータ変更
ALTER SYSTEM SET PROCESSES=500 SCOPE=SPFILE;

-- アプリケーション用ユーザー作成
CREATE USER dify IDENTIFIED BY <パスワード>
DEFAULT TABLESPACE users
QUOTA UNLIMITED ON users;

GRANT DB_DEVELOPER_ROLE TO dify;

exit;
```

### 1.2 全文検索用レクサー作成
> **技術ノート**: Difyの現行バージョン(2025年3月2日時点)ではデフォルトで`my_chinese_vgram_lexer`という命名が使用されていますが、今後は変更される可能性があります。
```sql
BEGIN
  CTX_DDL.CREATE_PREFERENCE(
    'my_chinese_vgram_lexer',
    'CHINESE_VGRAM_LEXER'
  );
END;
/
```

## 2. Dify環境の設定

### 2.1 リポジトリの取得
```bash
git clone -b 1.0.0 https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env  # 設定ファイルのテンプレートをコピー
```

### 2.2 環境変数設定
`.env`ファイルの変更箇所：
```env
### Oracle連携設定 ###
VECTOR_STORE=oracle

ORACLE_HOST=<データベースサーバーIP>
ORACLE_PORT=1521
ORACLE_USER=dify
ORACLE_PASSWORD=<設定したパスワード>
ORACLE_DATABASE=<PDB名>
```

### 2.3 Docker Composeの調整
`docker-compose.yaml`のOracle関連設定（外部DB利用時）：
```yaml
services:
  oracle:
    image: container-registry.oracle.com/database/free:latest
    profiles: 
      - oracle-skip  # 外部DB利用時はコンテナ起動をスキップ
    volumes:
      - oradata:/opt/oracle/oradata
    environment:
      ORACLE_PWD: ${ORACLE_PWD:-Dify123456}
```

## 3. システム起動
```bash
docker compose up -d
```

## 4. 動作検証方法
### ログ確認
```bash
docker compose logs -f
```

### Webインターフェース確認
http://localhost:3000 にアクセスし、管理画面が表示されることを確認

## 重要注意事項
1. **セキュリティ設定**
   - ファイアウォールで1521ポートのインバウンド許可
   - パスワードポリシーの遵守（大文字/数字/記号を含む12桁以上）

2. **命名規則**
   - PDB名はインスタンス作成時に指定した名称を使用

3. **パフォーマンス**
   - 初期データ投入時は`PROCESSES`パラメータを適宜調整
   - 表領域の監視を推奨

## お勧めのDify関連記事

[Oracle(OCI)ずくめでDifyしよう！](https://qiita.com/itokazu/items/3c76581fcbf3d022bdb2)
[Dify v1.0.0のSelf-Host版を宇宙最速でデプロイしてみた＠OCI](https://qiita.com/itokazu/items/5762f3a08d96035a68ef)

## まとめ
Oracle Base Database Service 23aiをDifyのバックエンドとして活用することで、エンタープライズレベルの自然言語処理アプリケーションを構築できます。本手順は開発環境向けの設定ですので、本番環境ではセキュリティガイドラインに沿った追加設定が必要です。


---

参考資料：
- [Dify github.com](https://github.com/langgenius/dify.git)
- [Add Oracle23ai as a vector datasource](https://github.com/langgenius/dify/pull/5342)
- [Add search by full text when using Oracle23ai as vector DB](https://github.com/langgenius/dify/pull/6559)
プルリクのフィードバックでのNG例

プルリクフィードバックのNG例


###  この変数は何を意味していますか？

プルリクで質問はダメ。

置き換えるとすれば、こう。

- 省略しすぎなので、フルの単語でお願いします。
- 〇〇と〇〇の両方の解釈があるのでこうしてください。
- コーディング規約にしたがってください。

### 〇〇はしないでください

「ハードコーディングしないでください」ではなく、〇〇にパラメーターを集約してくださいなどという指示に変える。


### そもそもプルリク以前のスタートで間違ってることもある

コーディング規約のすり合わせがチームでできてないならそれはプルリクでやるべきことではない。
プルリクはコミットファイルだけに限られたスコープでのコミュニケーションであり、それを超えるスコープはプルリク以外の場でやるべき。

プルリクへのフィードバックができるほどの腕前ではないなら、3往復くらい会話をしてくれ。
レトロPCのためのBASIC講座９　グラフィック命令とFOR、GOSUB

# 前回のおさらい
前回は、PC-8801の画面要素の１つでテキストスクリーンに関するプログラム例を上げました。

[レトロPCのためのBASIC講座８](https://qiita.com/kawamo55/items/82450d4912d1be9cf500)

# グラフィック命令
今回はグラフィック命令です。
PC-8801のグラフィック画面はカラー画面で６４０×２００ドットの画面で色が８色使えます。
最もかんたんなコマンドがPSET命令で点を打ちます。
PSET (X座標,Y座標),色
色は、０−７までの数値で１が青、２が赤、４が緑を表しており２のn乗値の合成で
０は黒、青と赤で３がシアン、青と緑で５がスカイブルー、赤と緑で６が黄色、青・赤・緑が７で白を意味します。

LINE命令は
LINE (始点X座標、始点Y座標) - (終点X座標、終点Y座標),色
という命令で選が引けます。

#サンプルプログラム

``` ZIZYOU.BAS

100 CLS 3:PCOL=2
110 LINE (0,100)-(639,100),5
120 LINE (320,0)-(320,199),6
130 MINX=-1!:MAXX=1!
140 MINXD=0:MAXXD=639
150 MINY=-1!:MAXY=1!
160 MINYD=199:MAXYD=0
170 FOR P=MINXD TO MAXXD STEP 8
180   X = MINX + P*(MAXX-MINX)/(MAXXD-MINXD)
190   PX = ((MAXXD-MINXD)*X + (MAXXD-MINXD))/(MAXX-MINX)
200   Y = MINY + (X*X)/(MAXY-MINY)
210   PY = (MAXYD-MINYD)*Y/(MAXY-MINY)
220   GOSUB 250
230 NEXT P
240 END
250 PSET (PX-1,PY),PCOL
260 PSET (PX,PY-1),PCOL
270 PSET (PX+1,PY),PCOL
280 PSET (PX,PY+1),PCOL
290 RETURN

```
解説を入れると
１００行目から１６０行目で画面の初期化と定数値を変数に設定して
１７０から２３０目はループ命令のFORでMINXDからMAXXDまでの数値を８づつ増やしながらPに渡しています
その値から二乗値をYとしたグラフを書くための座標計算をしてGOSUB 250で実際にグラフを書くサブルーチンを呼び出しています。
250から290行目はサブルーチンの内容で４つの点を打ってグラフを描画しています。

このように、サブルーチン化することでループ全体を見通しやすくしています。

# 今回の動画
https://youtu.be/QZBlB5I8XGo