OmniAICreator/Qiita-1.07M huggingface dataset:
[Python] 社員一覧表からIME登録用の辞書ファイル作成

## きっかけ
職場には人事部がEXCELで作成してる下記のような社員一覧表があり、月１月初に人事部から各部署へ送付される。

私は社内のITサポート職なので、メールで人名を打つのに加えて、機材表やライセンス表などの管理のために名前を正確に入力する必要がある。
その表の氏名を使ってフィルターかけたりする作業が発生するからです。

打ち間違えや変換ミス、さらには漢字で入力するので、特殊な漢字などはなかなか変換できない。

なので、このEXCELをPythonで変換して、辞書ファイルを作成して、IMEに一括で登録しちゃおう！って算段です。

## サンプルデータ

| 社員番号 | 氏名（全角） | ｶﾅ氏名（半角） | 雇用形態 | 所属部署 | 役職 | 備考 |
|----------|-------------|---------------|----------|----------|------|------|
| 1001     | 山田 太郎  | ﾔﾏﾀﾞ ﾀﾛｳ   | 正社員    | 営業部    | 課長 |       |
| 1002     | 佐藤 花子  | ｻﾄｳ ﾊﾅｺ   | 契約社員  | 総務部    | 係長 |       |
| 1003     | 鈴木 一郎  | ｽｽﾞｷ ｲﾁﾛｳ | 正社員    | 開発部    | 主任 |       |
| 1004     | 高橋 次郎  | ﾀｶﾊｼ ｼﾞﾛｳ | 派遣社員  | 人事部    |      |       |
| 1005     | 田中 美咲  | ﾀﾅｶ ﾐｻｷ   | アルバイト | 広報部    |      |       |

※兼務している人もいるので重複データがある。（重複削除する必要あり）

## 完成コード
~~~Python
import openpyxl
import unicodedata
import jaconv
import sys

def main():
    # ドラックアンドドロップされたファイルのチェック
    if len(sys.argv) >= 2:
        excel_file = sys.argv[1]
    else:
        excel_file = '社員一覧表.xlsx'
    
    # EXCELを開いてアクティブなシートを選択
    wb = openpyxl.load_workbook(excel_file)
    ws = wb.active

    # 1行ずつB列とC列の値を取得し、それぞれ処理を行う
    with open('人員リストの辞書登録用テキストファイル.txt', 'w', encoding='utf-16') as f:
        for row in ws.iter_rows(min_row=2):  # 1行目はヘッダーなので除外
            c_hankana = row[2].value
            b_kanji = row[1].value
            if b_kanji is not None and c_hankana is not None:
                if check_unique_name(b_kanji):
                    c_zenkana2 = hankana_to_zenhira2(c_hankana)
                    f.write(f'{c_zenkana2}\t{b_kanji}\t人名\n')
                else:
                    pass

# 半角カタカナを全角ひらがなにして頭の２文字を取得
def hankana_to_zenhira2(text):
    text = unicodedata.normalize('NFKC', text)    # 全角カタカナに変換
    text = jaconv.kata2hira(text)    # ひらがなに変換
    return text[:2]    # 最初の2文字のみ抽出

# 名前の重複チェック あればFalse なければTrue
name_list = [] # 関数内で保持する為、関数外で宣言
def check_unique_name(name):
    if name in name_list:
        return False
    else:
        name_list.append(name)
        return True

if __name__ == '__main__':
    main()

~~~

## 概説
使ってるデータは、漢字の氏名とｶﾀｶﾅの氏名のみ
雇用形態や部署などは使ってないです
辞書のユーザーコメントに入れる案はあるけど未実装
人名の最初のよみ２文字で変換すると漢字の氏名が変換されます。
　例：やま → 山田　太郎

辞書登録用ファイルを生成するだけですので、生成されたファイルを手動で辞書登録する必要があります。

### 使用するライブラリ
- openpyxl
- unicodedata
- jaconv
- sys

#### openpyxl
PythonでExcelを操作する

https://pypi.org/project/openpyxl/

https://qiita.com/mathlive/items/20078f4b31273c180f51

#### unicodedata
半角カタカナを全角カタカナに変換する

https://docs.python.org/ja/3.13/library/unicodedata.html

https://qiita.com/Ryo-0131/items/984b5ae2c7b046e8c1d5

#### jaconv
カタカナをひらがなに変換

https://github.com/ikegami-yukino/jaconv

https://qiita.com/shakechi/items/d12641d6cad01479785f

#### sys
Exe化して、そのExeにExcelファイルをドラックアンドドロップして実行する仕組みを実装したため

https://docs.python.org/ja/3.13/library/sys.html

https://qiita.com/jp0003menegi/items/fbf407af7d294c09481a

## 所感
重複データあっても、辞書登録する際に重複データは弾かれるので不要っちゃ不要
Pythonはループが楽だなぁ～
Reactのrenderを理解する

renderについての理解のために記事にしました。

# render()メソッドとは？

Reactのクラスコンポーネントを使うとき、必ずと言っていいほど定義されるのがrender()メソッドです。基本的には、以下のような形でJSXを返すことでUIを定義します。
```Typescript
class MyComponent extends React.Component {
  render() {
    return (
      <div>
        <h1>Hello, React!</h1>
      </div>
    );
  }
}
```

このrender()メソッドが返すJSXが、実際にDOMツリーへと変換され、ブラウザに描画されます。一方、関数コンポーネント（function MyComponent() { ... }）では、render()メソッドを明示的に書く必要がありませんが、関数コンポーネントの戻り値も同様にJSXを返す点で本質は同じです。

# ReactがUIを更新する仕組み

**1. ステートやプロパティの変更**

Reactコンポーネントが再レンダーされる最大のきっかけは、propsまたはstateに変更があったときです。たとえば、以下のように状態を更新すると、自動的にコンポーネントが再レンダーされ、新しい状態に基づいてUIが更新されます。
```Typescript
class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  increment = () => {
    this.setState({ count: this.state.count + 1 });
  };

  render() {
    return (
      <div>
        <p>{this.state.count}</p>
        <button onClick={this.increment}>Increment</button>
      </div>
    );
  }
}
```

**2. 仮想DOM（Virtual DOM）**

Reactは更新が必要になると、まず**仮想DOM（Virtual DOM）**上で更新後の状態を反映したツリーを作成します。仮想DOMは、JavaScriptのオブジェクトとして軽量に扱われるため、ブラウザの実際のDOMを直接操作するよりもパフォーマンス面で効率的です。

**3. 差分（diff）を比較して必要な部分だけ更新**

Reactは、更新前の仮想DOMと更新後の仮想DOMを比較し、変化した部分だけをブラウザのDOMに反映します。これにより、ページ全体を再描画するのではなく、最小限の操作で画面を更新できるため、パフォーマンスが向上します。


# 再レンダーを制御する方法

Reactが勝手に再レンダーしてしまうのは便利な反面、パフォーマンスに影響が出る場合があります。そこで、特定の状況で再レンダーを防ぎたい場合は、以下のような方法を使います。

**shouldComponentUpdate()メソッド (クラスコンポーネント)**

親コンポーネントからのpropsや自身のstateに変化があっても、条件によっては再レンダーをスキップできます。

**React.memo() (関数コンポーネント)**

propsに変化がない場合、コンポーネントの再レンダーをスキップします。メモ化によって、前回のレンダー結果を再利用します。

**PureComponent (クラスコンポーネント)**

shouldComponentUpdate()で浅い比較（shallow compare）を自動的に行うクラス。特に処理を追加しなくても、propsやstateが変化していなければ再レンダーをスキップします。

これらの機能を使いこなすことで、必要なときだけrender()が呼ばれるようにし、高パフォーマンスを維持できます。

# render()の注意点

副作用を入れないこと: render()メソッドは、あくまでUIを返すためのもの。データの取得やDOM操作などの副作用は、componentDidMountやuseEffectなどのライフサイクルメソッド・フックで行うのが基本です。

複数の要素を返す場合: ルート要素は1つでなければなりません。複数要素を返したい場合は、親要素でラップするか、Reactの<Fragment>を使用します。

ステートの直接変更は避ける: this.state.count = 10のように、直接ステートを書き換えても再レンダーはトリガーされません。必ずthis.setState()を使って更新しましょう。

# まとめ

Reactにおけるrender()メソッドは、UIの描画を担当する中心的な存在です。再レンダーがいつ、どのように行われるのかを理解することで、コンポーネントの設計やパフォーマンス最適化をスムーズに進められます。

render()はJSXを返すメソッド（または関数コンポーネントの戻り値）で、仮想DOMと連動してUIを更新する

propsやstateが更新されると、自動的に再レンダーが行われる

shouldComponentUpdate()やReact.memo()などを使うことで、不要な再レンダーを防止できる
OMCB034A(869,整数)

https://onlinemathcontest.com/contests/omcb034/tasks/11848

$X=-a+b+c,Y=a-b+c,Z=a+b-c$と置いた場合、以下が言えます。
　$XYZ=2^{100}$ $…①$
　$(a,b,c)=(\frac{Y+Z}{2},\frac{Z+X}{2},\frac{X+Y}{2})$ $…②$

$①$より、$X,Y,Z$はすべて$2$のべき乗であるので、
　$X=2^x,Y=2^y,Z=2^z$ $…③$
と置きます。
$①,③$より、
　$x+y+z=100$ $…④$
が言えます。

$②$より、$a,b,c$すべてが整数であるためには、$X,Y,Z$がすべて偶数、またはすべて奇数であることが条件です。
言い換えると、$x≠0$かつ$y≠0$かつ$z≠0$、または$x=0$かつ$y=0$かつ$z=0$です。

$④$より$x=0$かつ$y=0$かつ$z=0$にはならないので、$X,Y,Z$はすべて偶数であることがわかります。
よって、$x,y,z≧1$です。

ここで、
　$x'=x-1$ $(x'≧0)$
　$y'=y-1$ $(y'≧0)$
　$z'=z-1$ $(z'≧0)$
と置くと、
　$x'+y'+z'=97$ $…⑤$
になります。

$⑤$は$97$個のボールを$3$つの箱に入れる問題と同じなので、解は
　${}_9{}_9C_2=4851$
になります。

https://qiita.com/msykkb/items/4d4d930ff0812a39151b
Cloudflare Pagesでプレビュー機能を使っている場合に環境変数を設定するときの注意点

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965739/0c795911-8c15-37ab-5104-f3fba1bb6570.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965739/73842e60-3c16-454d-6d0e-7c3fbcaad0e8.png)

本番環境とプレビュー環境で環境変数をそれぞれ設定する必要があるので注意。
設定画面で上記画像の様に環境を変更できるので、各環境で環境変数を設定すればいい。

私はこれに気づかず、本番環境だけで環境変数を設定しており、プレビュー環境で環境変数を参照できずデプロイが失敗し続けて困ったので、備忘として投稿。
033 AI屋さんの　マルチモーダル出力　LLMにトークン全文入力　Gemini




033 AI屋さんの　マルチモーダル出力　LLMにトークン全文入力　Gemini

マルチモーダルLLMの　出力もマルチモーダル開始ですね。
知らぬ間に始まっていました。
薄らお知らせがあって、全く気づきませんでした。
LLM業界も　雨後の筍　目が離せません。



音声ファイルも画像ファイルも　文字のプロンプトだけで
LLMが直接作ってくれます。
音声ファイルは、英語・日本語　混在でもokです。
声色も感情移入バッチリで、声優さんもビックリです。
画像も複数枚、同時に作成してくれます。


LLMひとつで、別の画像生成AIも音声合成AIも無しでいけそうです。
base64で出力されるので、プロンプトはトークン満杯です。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/f96b9f16-c5cc-5286-f09d-a249017fe0cc.png)


---
---

目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7




まずは、試験運用版で、

　マルチモーダル　入力（文字、音声、画像、動画）
　マルチモーダル　出力（文字、音声、画像）
 
完成です。おめでとうございます。




ー続くー
「逆転ポインタ法によるガーベジコレクタ」を可視化してみた


## 逆転ポインタ法について
@UtakoSaeki(佐伯 詩子)さんが逆転ポインタ法の記事を書かれています。

https://qiita.com/UtakoSaeki/items/60521bf46e6eb83fbda4

おお、懐かしい〜と思って、Javaで実装してみました。

## 過程を画面に表示してみた

このアルゴリズムですが、文章で読んでも、なかなか理解できません。
『これは、絶対、アニメーションのようにして見せた方が、面白いし理解も早いぞ』と思いました。

STEPボタンを押す毎に、１ステップずつ画面に表示するプログラムをJavaのSwingを使って作ってみました。

![gc-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339875/88f9bbb4-ab2b-74b4-eef6-87644d2b51cd.png)


こんな画面です。

１ステップずつ画面コピーをとっていると、大変なので、省略しますが、最終的に以下のようになりました。

![gc-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339875/114e1cf8-ebec-8dee-75a9-f07cb4cc379a.png)

背景がグレーのセル(cons)が、使われていたセルです。
背景がオレンジ色のセルは、GCされた箇所を表しています。


## ４パターンのGC過程のアニメーションができます。

```Lisp: パターン１
(list (quote a) b)
```

```Lisp: パターン２
(let ((a 1) (b 2)) (list a b))
```

```Lisp: パターン３
((a . 1) (b . 2) (c . 3))
```

```Lisp: パターン４
((a 1) (c 2 3))
```

## 佐伯さんの記事によるとハノイの塔もできるそうです。

私はやった事はありませんが、以下のように書かれていましたのでできるのでしょう

> 有名なハノイの塔の問題はかなり簡単にスタック無し再帰を実現できる
練習問題です


## 詳しい画面コピーが見たい方は、こちらを参照ください。

https://zenn.dev/clazz/books/07e2c45b8d9478


逆転ポインター法は、メモリーが少ない時に有効な方法だそうです。
興味を持って頂けたら幸いです。
.NETのお勉強6_ミドルウェア使ってみる

# 概要
AmazonLinux2023インスタンス上にコンテナで.NETを利用したサーバをたてる
そのお勉強メモ6

ミドルウェアを使ってみる

# グローバルなミドルウェア
どのルートであっても必ず通るようになるミドルウェア
xx.xx.xx.xx/helloにアクセスして、コンテナログに「GlobalMiddleware start」と「GlobalMiddleware end」が出力されていればok
``` Program.cs
var app = builder.Build();
app.UseMiddleware<GlobalMiddleware>(); // これ追加
app.MapGet("/", () => "Hello, World!");
app.MapControllers();
app.Run();
```

``` src/Middleware/GlobalMiddleware.cs
public class GlobalMiddleware
{
    private readonly RequestDelegate _next;

    public GlobalMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        Console.WriteLine("GlobalMiddleware start");

        await _next(context);

        Console.WriteLine("GlobalMiddleware end");
    }
}
```

# 特定ルートにだけ適用するミドルウェア
ついでに、Program.csにミドルウェアがまとまらないようにミドルウェア適用用のクラス作ってみる
``` Program.cs
var app = builder.Build();
app.RegisterMiddlewares(); // これ追加
app.MapGet("/", () => "Hello, World!");
app.MapControllers();
app.Run();
```

``` Middleware/MiddlewareFactory.cs
public static class MiddlewareFactory
{
    public static void RegisterMiddlewares(this IApplicationBuilder app)
    {
        MiddlewareFactory.RegisterGlobalMiddleware(app);
        MiddlewareFactory.RegisterHelloMiddleware(app);
    }

    private static void RegisterGlobalMiddleware(IApplicationBuilder app)
    {
        app.UseMiddleware<GlobalMiddleware>();
    }

    private static void RegisterHelloMiddleware(IApplicationBuilder app)
    {
        // /helloから始まるルート全部に適用
        app.UseWhen(
            context => context.Request.Path.StartsWithSegments("/hello", StringComparison.OrdinalIgnoreCase),
            appBuilder => {
                appBuilder.UseMiddleware<HelloMiddleware>();
            }
        );
    }
}
```

``` Middleware/HelloMiddleware.cs
public class HelloMiddleware
{
    private readonly RequestDelegate _next;

    public HelloMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        Console.WriteLine("HelloMiddleware start");

        await _next(context);

        Console.WriteLine("HelloMiddleware end");
    }
}
```

# その他メモ
#### 拡張メソッド
.NETではなくC#の言語機能で、既存のクラスに新しいメソッドを追加する機能だそう
Traitみたいなものか？
MiddlewareFactoryの関数をapp.RegisterMiddlewares()という呼び出し方ができているのはこれのおかげ
this修飾子をつけると、その後に設定したクラスに対して新しいメソッドを追加できる

#### ルート、アクション指定の処理指定方法
・useWhen以外にMapWhenもある
・Controller/Actionごとに設定するActionFilterというのもあるらしい

使い分けとか、動きの違いとか追って調査したい
ざっくりActionFilterの書き方こんな感じ
``` .cs
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class HelloController : ControllerBase
{
    [HttpGet]
    [HelloMiddlewareFilter] // これ
    public string index() => "Hello index";
}
```

でも、ミドルウェアも完全パス指定できるらしい
どうしたもんだろう
``` .cs
app.UseWhen(
    context => context.Request.Path.StartsWithSegments("/hello"),
    appBuilder => {
        appBuilder.UseMiddleware<HelloMiddleware>();
    }
);
```

# 雑記
ここまで勉強してみて思ったけど、すごいlaravelに似てる
DIだし、まだやってないけどORMもあるみたいだし、ミドルウェアあるし
割と理解しやすいかも？
C#とPHPの言語の差はかなり感じるけど
POをコピーして作成する

①「ME22N」で入って、既存PO番号で検索する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/23ac6cff-bb7f-c66e-2b09-45108ed62262.png)

②「伝票概要オフ」を押して、「購買発注」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/f3b63efd-de3e-59bf-0661-996da7506e0b.png)

③下記の画面で「実行」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/73f4d20c-dce4-3d23-30e5-aeb1ed689419.png)

④白い「登録」ボタンを押して、詳細明細はなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/3474b99d-79e9-7aa6-8105-b6154da0819e.png)

⑤登録したい明細を選択し、「採用」ボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/98bf6f7c-3a11-2ff6-2d57-805106f931c2.png)


⑥上の「保存」ボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/7cbbc080-2200-a9b3-f16c-6f046eccc989.png)

⑦下に登録できたアラートが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/91109408-661d-9eae-18fb-e91b8e7e54b3.png)
C#でIoTプログラミング on ESP32 #2 - RGBLED1

今回はオンボード上のRGBLED（NeoPixel）を操作したいと思います。
オンボード上のRGBLEDはNeoPixel（WS2812C）となっています。
WS28xx用のパッケージを導入することで簡単に制御することができます。

パッケージの導入は[前回の記事](https://qiita.com/linyixian/items/53768ac741ce858758a7)を参照してください。

## ハードウェア
・Freenove ESP32-S3-WROOM Board
　（他のボードでも動作するかもしれませんが、LEDの型番が違う場合コードの一部を修正する必要があります。）

## 導入するパッケージ
・nanoFramework.iot.Device.Ws28xx.Esp32
　（Esp32が付かないパッケージもありますが、これはEsp32以外のボード向けになります。）

 ## プログラミング
・新規プロジェクトを作成します。プロジェクト名は「ESP32S3_RGBLED」としました。

・コードを入力する前にパッケージは導入してください。

・コードは次のようになります。
 ```C#:Program.cs
using Iot.Device.Ws28xx.Esp32;
using System.Drawing;
using System.Threading;

namespace ESP32S3_RGBLED
{
    public class Program
    {
        public static void Main()
        {
            const int count = 1;    //LEDの数　オンボードLEDが対象なので１
            const int ledPin = 48;  //LEDを接続しているGPIO番号

            Color[] rainbow = { Color.Red,          //配列に点灯パターンを登録 
                                Color.Orange, 
                                Color.Yellow, 
                                Color.Green, 
                                Color.DarkCyan, 
                                Color.DarkBlue, 
                                Color.Purple, 
                              };    

            //接続しているLEDの型番によって変わります。Ws2812b,Ws2815b,sk6812など
            Ws28xx led = new Ws2812c(ledPin, count);
            
            BitmapImage img = led.Image;

            while (true)
            {     
                foreach (Color color in rainbow)
                {
                    img.SetPixel(0, 0, color);      //順番に色を設定
                    led.Update();                   //設定した色を反映　アップデートしないと色が変わらない
                    Thread.Sleep(1000);             //1秒待機
                }
            }
        }
    }
}
 ```

 ・制御方法は SetPixel(x座標,y座標,色) を指定して、表示をアップデートすることでLEDを様々な色で光らせることができます。Ws28xxクラスは複数のLEDを制御できるようになっています。x座標,y座標を指定することで順番にLEDの色を指定することができます。


 別の機会に複数のLEDを制御するプログラムを紹介したいと思います。
後輩のためのFigma入門（目次）

# 後輩のためのFigma入門

後輩のためにFigmaについて書いた講座の目次です。

- Step1 Figmaの登録の仕方
- Step2 図形に触れてみよう
- Step3 テキストボックスに触れてみよう
- Step4 図形を使いこなそう
- Step5 枠線を極めよう
- Step6 影を極めよう
- Step7 色を極めよう
- Step8 Material Thema Builderの導入

### Step1 Figmaの登録の仕方
https://qiita.com/ko-tarou/items/991d47a209efbd3194dd

### Step2 図形に触れてみよう
https://qiita.com/ko-tarou/items/c61550c2a3edb7bbabfc

### Step3 テキストボックスに触れてみよう
https://qiita.com/ko-tarou/items/9cf545ed708fe0aea911

### Step4 図形を使いこなそう
https://qiita.com/ko-tarou/items/1c434e21f9f078832083

### Step5 枠線を極めよう
https://qiita.com/ko-tarou/items/58a14354018c36d03650

### Step6 影を極めよう
https://qiita.com/ko-tarou/items/3f63f6376ff88040799b

### Step7 色を極めよう
https://qiita.com/ko-tarou/items/c444c1be072750237b26

### Step8 Material Thema Builderの導入
https://qiita.com/ko-tarou/items/17a38713fda5c5170997
Laravel9以降で使えるルーティングの書き方

# Laravelの可読性を向上させるRoutingの書き方

Laravelのルーティングを書く際に、可読性を向上させ、不要なコントローラーを増やさない工夫をする方法を紹介します。

## 従来の書き方
どのバージョンでも使用できるLaravelのルートを定義する際に、以下のように記述することが多いでしょう。

```php
Route::get('/api/version/store', 'App\Http\Controllers\Api\VersionsController@store');
```

この方法でも動作しますが導入しているバージョンがLaravel9以降の場合、ルートが増えていくと管理が難しくなり可読性も下がってしまいます。

## 可読性を向上させる書き方
次のように、`Route::middleware` や `Route::prefix` を活用し、ルートを整理することで、可読性が向上します。

```php
use App\Http\Controllers\User\AdminController;
use App\Http\Controllers\User\UserDetailController;

Route::middleware(['auth', 'operation', 'can:isSupport'])
    ->group(function () {
        Route::get('/user/admin/index', [AdminController::class, 'index']);
        Route::prefix('user/user_detail')
        ->controller(UserDetailController::class)
        ->group(function () {
            Route::get('/index', 'index');
            Route::post('/update', 'update');
        });
    });


```

## この書き方のメリット

1. **可読性の向上**

   - 各ルートがグループ化されることで、どのルートがどのコントローラーを扱っているのかが一目で分かるようになります

2. **重複コントローラーの防止**

   - 似た処理をするコントローラーが増えてしまうのを防ぐことができます
   - 「このコントローラーとこのコントローラーの処理はほぼ同じでは？」と気づくことで、統一した設計が可能になります

3. **管理しやすい構造に**

   - 一番上にコントローラーを定義することで、似たような名前のコントローラーを作成してしまうのを防ぐことができます
   - ルートが整理され、全体の構造が明確になります

4. **保守性の向上**

   - コードが整理されることで、新しいメンバーがプロジェクトに参加した際にも理解しやすくなります
   - 変更が発生した場合も影響範囲が明確になり、修正が容易になります

5. **セキュリティの強化**

   - `Route::middleware` を活用することで、特定のルートに認証や権限チェックを組み込むことができます
   - これにより、管理画面や機密情報に関わるルートのアクセス制御が簡単に実装できます

## その他の便利な書き方

### `Route::resource` を活用する

RESTfulなルーティングをシンプルに記述する場合、`Route::resource` を使用するのも有効です。

```php
use App\Http\Controllers\UserController;

Route::resource('users', UserController::class);
```

これにより、`index`, `show`, `create`, `store`, `edit`, `update`, `destroy` の7つのアクションが自動的にルートに紐づきます。

### APIルートの整理

APIルートをグループ化して管理する場合、以下のように `Route::prefix('api')` を利用すると見やすくなります。

```php
Route::prefix('api')->group(function () {
    Route::get('users', [UserController::class, 'index']);
    Route::post('users', [UserController::class, 'store']);
});
```

## まとめ

Laravelのルーティングを整理することで、コードの可読性を向上させ、管理のしやすい構造を作ることができます。特に、`Route::middleware` や `Route::prefix`、`Route::controller` などを活用することで、グループ化して見やすくするのがおすすめです。

また、`Route::resource` や `APIルートの整理` などのテクニックを活用することで、さらに効率的で保守性の高いルート設計が可能になります。

ぜひ、実際のプロジェクトで試してみてください！
PythonでExcelのセルをマージする

エクセルのセルの結合は、エクセルのデータ処理や表デザインの一般的な操作です。例えば、表のヘッダーを作成する場合、ヘッダーが列をまたぐようにするために複数のセルを結合し、より人目を引き、美観を良くすることがよくあります。また、データを分類する際、同じカテゴリのデータをより視覚的に一体化させ、区別しやすくするために、同じカテゴリのセルをマージすることがあります。この記事では、Pythonを使ってExcelで指定した行、列、セル範囲をマージする方法を紹介します。
* [PythonでExcelの指定された行をマージする](#pythonでexcelの指定された行をマージする) 
* [PythonでExcelの指定された列をマージする](#pythonでexcelの指定された列をマージする) 
* [PythonでExcelの指定されたセル範囲をマージする](#pythonでexcelの指定されたセル範囲をマージする)

## Python Excelライブラリのインストール
本記事では[**Spire.XLS for Python**](https://www.e-iceblue.com/Introduce/xls-for-python.html)ライブラリが必要です。以下のpipコマンドで直接インストールできます：
> pip install Spire.XLS

また、以下のリンクから製品パッケージをダウンロードし、ローカルパスからインストールすることもできます。

https://www.e-iceblue.com/Download/Spire-XLS-Python.html

## PythonでExcelの指定された行をマージする
1. `Workbook.LoadFromFile()` メソッドを使用して、Excel サンプル・ファイルをロードします。
1. `Workbook.Worksheets[]` プロパティを使用して、指定されたワークシートを取得します。
1. **`Workheet.Rows[index].Merge()`** メソッドを呼び出して、Excel で指定された行をマージします。
1. `Workbook.SaveToFile()` メソッドを使用して、結果ファイルを保存します。
```python
from spire.xls import *
from spire.xls.common import *

# エクセル文書の読み込み
workbook = Workbook()
workbook.LoadFromFile("sample.xlsx")

# 最初のワークシートを取得する
sheet = workbook.Worksheets[0]

# 最初の行をマージする
sheet.Rows[0].Merge()

# 結果文書を保存する
workbook.SaveToFile("MergeRow.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
```

## PythonでExcelの指定された列をマージする
1. `Workbook.LoadFromFile()` メソッドを使用して、Excel サンプル・ファイルをロードします。
1. `Workbook.Worksheets[]` プロパティを使用して、指定されたワークシートを取得します。
1. **`Workheet.Columns[index].Merge()`** メソッドを呼び出して、Excel で指定された列をマージします。
1. Workbook.SaveToFile() メソッドを使用して、結果ファイルを保存します。

```python
from spire.xls import *
from spire.xls.common import *

# エクセル文書の読み込み
workbook = Workbook()
workbook.LoadFromFile("sample.xlsx")

# 最初のワークシートを取得する
sheet = workbook.Worksheets[0]

# 最初の列をマージする
sheet.Columns[0].Merge()


# 結果文書を保存する
workbook.SaveToFile("MergeColumn.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
```

 
## PythonでExcelの指定されたセル範囲をマージする
Excelでは、指定した行や列をマージするだけでなく、以下の手順で指定したセル範囲をマージすることもできます：
1. `Workbook.LoadFromFile()` メソッドを使用して Excel サンプル・ファイルをロードします。
1. `Workbook.Worksheets[]`プロパティを使用して、指定されたワークシートを取得します。
1. **`Worksheet.Range[].Merge()`** メソッドを呼び出して、Excel で指定されたセル範囲をマージします。
1. Workbook.SaveToFile() メソッドを使用して、結果ファイルを保存します。

```python
from spire.xls import *
from spire.xls.common import *

# エクセル文書の読み込み
workbook = Workbook()
workbook.LoadFromFile("sample.xlsx")

# 最初のワークシートを取得する
sheet = workbook.Worksheets[0]

# セルB2:D5をマージする
sheet.Range["B2:D5"].Merge()

# 結果文書を保存する
workbook.SaveToFile("MergeCells.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
```

Excel でのマージセルの適切な使用は、より見やすい表のレイアウトとデータの明瞭な提示につながります。Spire.XLS for Python ライブラリは、セルのマージ解除や、Excel ワークブック、ワークシート、行、列、セルに対するさまざまなその他の操作もサポートしています。詳細については、次を参照してください：

https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Spire.XLS-for-Python-Program-Guide-Content.html
テスト時のcookieとsessionを取得する

コントローラー内部をテストする
  > Testing controller internals

# session,flash,cookieを書くだけで使える
特定の主張に加えて、常備されたテスト・ユニットに使えるいくつかのコレクションに対して簡単なアクセスできます。それらのコレクションは以下の通りです。
   >In addition to these specific assertions, you also have easy access to various
   collections that the regular test/unit assertions can be used against. These
   collections are:

`session`:セッション内で保存されるオブジェクト
   >*   session: Objects being saved in the session.
   
`flash`:セッションに現在保存されているフラッシュオブジェクト
   >*   flash: The flash objects currently in the session.
   
`cookie`:リクエスト上でユーザーへ送られるCookie
   >*   cookies: Cookies being sent to the user on this request.

これらコレクションは他のどのハッシュ同様に使用できる
   >These collections can be used just like any other hash:
  
    >   assert_equal "Dave", cookies[:name] # makes sure that a cookie called :name was set as "Dave"
       assert flash.empty? # makes sure that there's nothing in the flash

コレクションの上で、特定のアクションがリダイレクトした完全なURLは`redirect_to_url`で利用可能です。
   >On top of the collections, you have the complete URL that a given action
   redirected to available in `redirect_to_url`.
### ハッシュのように使用できる
同じコントローラ内でのリダイレクトに対して`follow_redirect`を呼び、リダイレクトを追い、他のアクションコールしてアサートすることもできる。
   >For redirects within the same controller, you can even call follow_redirect
   and the redirect will be followed, triggering another action call which can
   then be asserted against.

### sessionとcookieの変数を操る
sessionとcookieの変数を操る
> Manipulating session and cookie variables

時々テストのためsessionとcookie変数を設定する必要がある。これを行うにはsession、cookieコレクションに対して値を割り当てるだけです
   >Sometimes you need to set up the session and cookie variables for a test. To
   do this just assign a value to the session or cookie collection:
  
       session[:key] = "value"
       cookies[:key] = "value"
       
テストに対してcookieをクリアするには、cookieコレクションをクリアするだけです。
   >To clear the cookies for a test just clear the cookie collection:
  
       cookies.clear

https://github.com/rails/rails/blob/1dcfe2316b4b239e2cf6cadd4efb7af4b4345e35/actionpack/lib/action_controller/test_case.rb#L327C2-L360C22
paiza Bランク・スキルチェック見本問題の覚書（長テーブルのうなぎ屋）


こちらの練習問題を解いてみました。

https://paiza.jp/works/mondai/b_rank_skillcheck_sample/long-table_00

成績としては、二度誤答した後に正解でした。

最終的なコードは以下のとおりです。

短くコンパクトにやるのはスキル的に無理なので、実直に手作業の手順を模倣しています。

```C
#include <stdio.h>
int main(void){
    char buf[100];
    int group, zaseki_num;
    fgets(buf, sizeof(buf), stdin);
    sscanf(buf, "%d %d", &zaseki_num, &group);

    // 座席リストを生成
    // 空席は0、そうでなければ1とするため、0で初期化しておく
    int zaseki[100];
    for(int i = 0; i < zaseki_num; i++) {
        zaseki[i] = 0;
    }

    // 実際の問題を解く本体はここから
    
    int sum = 0; // 最終的に答えを収納する変数

    // グループ数分処理を繰り返す 
    for(int i = 0; i < group; i++) {
        // 入力を受けとる
        int ninzu, start;
        fgets(buf, sizeof(buf), stdin);
        sscanf(buf, "%d %d", &ninzu, &start);

        int flag = 1; // 全員座れるかチェック用のフラグ（初期値を1（座れる）とする）
        // ひとりずつ座れるかチェックする
        for(int j = 0; j < ninzu; j++) {
            // startは1始まりだけど、座席リストの添え字は0始まりなので、マイナス1する
            // 座席は円卓になっていて、zaseki_num番目の次は1番目の席なので、
            // 剰余計算で値をループさせる
            // （考えるのがめんどいなら、普通に最終値に達したら0に戻すif文を書いてもよい）
            int tmp = (start - 1 + j) % zaseki_num;
            // 座席が空いていなければ、フラグを倒して、今回のグループの処理終了
            if(zaseki[tmp] != 0) {
                flag = 0;
                break;
            }
        }
        
        // フラグが生きていたら、全員座れることを意味する
        if(flag == 1) {
            // 全員座れることがわかってから、座席リストを更新する
            for(int j = 0; j < ninzu; j++) {
                int tmp = (start - 1 + j) % zaseki_num;
                zaseki[tmp] = 1;
            }
            // 最終的な答えは、座れたグループの人数を加算する
            sum += ninzu;
        }
        
    }

    // 出力して終了
    printf("%d\n", sum);
}
```

1度目の誤答でどこを修正したかは忘れました。

2度目の誤答の後、入力値を確認したら、座席がループすることを忘れていたのに気づき、座席リストの添え字をループ化させて、正答でした。

座席数が4席なら、1 -> 2 -> 3 -> 4 -> 1 -> 2 -> ...となる。
つまり、ループして5番目の席は、`5 % 4 = 1`で求められる。
ループして6番目の席も`6 % 4 = 2`となり、剰余でループした座席番号を求められる。

（最終的にはオリジンをずらす必要があることに注意）

# 終わりに

安易にフラグを使う癖があるので、そこをなんとかしたいなあと思いました
Djangoを使用した顧客管理システムの作成

## はじめに
DjangoとはPythonで実装されたWebアプリケーションフレームワークです。Djangoを使うと、コンテンツ管理システムやWikiからソーシャルネットワーク、ニュースサイトなど、高品質なWebアプリケーションが簡単に、少ないコードで作成できます。

今回はDjangoを使って、簡単な顧客管理システムを作っていきます。
## 設計と環境構築
### 作業内容
まずは簡単に作業内容を確認していきます。
1. 要件定義
    * 必要な機能を確認し、モデルやデータベースの構造設計
    * 例：顧客モデル、商談履歴モデル、カテゴリモデル
2. 環境構築
    * Djangoプロジェクトを作成
    * 必要なライブラリをインストール
    * アプリケーションの作成と設定

### 要件定義
ここでは必要な機能を確認していきます。今回作成するの顧客管理システムなので、最低限以下のような機能は必要かなと思いました。
* 顧客情報管理
    * 顧客の登録、編集、削除
    * 顧客名、メールアドレス、電話番号、住所などの基本情報
* 商談履歴管理
    * 顧客ごとに商談履歴を記録
    * 商談のタイトル、日付、内容、担当者などの情報を管理
* カテゴリに分類
    * 顧客カテゴリやタグで分類可能にする
    * VIP顧客、見込み客、既存顧客など
* 検索とフィルタリング
    * 顧客名やカテゴリでの検索
    * タグや登録日でのフィルタリング
* ダッシュボート
    * 顧客数や商談数を一目で確認できる画面
    * シンプルな統計情報を表示
### 環境構築
Djangoのプロジェクト作成と必要ライブラリのインストールを行っていきます。
#### Djangoのインストールとプロジェクト作成
```:Djangoのインストール
pip install django
pip install django-filter
django-admin startproject crm_project
```
これでDjangoのプロジェクトcrm_projectと必要ライブラリdjango-filterのインストールが完了です。
#### アプリケーションの作成と設定
先ほど作成したcrm_projectに移動して、プロジェクト作成時に作成されたmanage.pyを使用してアプリケーションを作成します。
```:アプリケーションの作成
cd crm_project
python manage.py startapp crm_app
```
次に作成したアプリケーションの設定を行っていきます。crm_project/crm_project内のsettings.pyにアプリケーションの登録を行います。
```:crm_project/crm_project/settings.py
...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'crm_app.apps.CrmAppConfig',#追加
]
...
LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_TZ = True
...
```
INSTALLED_APPSに作成したアプリケーションを記述し、LANGUAGE_CODEとTIME_ZONEを日本と東京に設定しました。
これで、アプリケーションの登録と設定が完了です。

次回、モデル作成を行っていきます。

1つ目：Djangoを使用した顧客管理システムの作成
https://qiita.com/tomo0227/items/cc893ea4e8e6cfb6ad77
2つ目：顧客管理システムのモデル作成
https://qiita.com/tomo0227/items/11f6a262ee1da183fd70
3つ目：顧客管理システムのCRUD機能の実装
https://qiita.com/tomo0227/items/054c974e104f81ea82db
4つ目：商談履歴管理システムの作成
https://qiita.com/tomo0227/items/7b9934ab4bc36cdcd4e8
5つ目：
https://qiita.com/tomo0227/items/a86f7bf038e87be11892
int配列型にある要素の中にある最大値を見つける方法

# はじめに
　現在IT学校の訓練生となりJavaを勉強しております。スッキリわかるJava入門を教科書にして学んでおりますが、だんだんと複雑になってきました。特にfor文に入り始めてからそれを感じています。なので一旦学んだ内容を解説することで、頭を整理していきたいと思います。今回はint配列型の中にある変数達の最大値を表示させる方法を解説します。
##  最大値を表示させるコード
	public static void main(String[] args) {
		int[] scores = {20,30,40,50};
		int count = 0;
		for (int i = 0; i < scores.length; i++) {
			count = Math.max(count, scores[i]);
			}
		System.out.println(count);
		}
	}
　これを実行すると最大値の５０が表示されます。一つずつ紐解いていきます。
 ```
 int[] scores = {20,30,40,50};
 ```
int配列型を定義しつつ初期化を同時にしている、コードです。これでint配列型のscoresに２０、３０、４０、５０のint型の変数が初期化されました。scores[0]をSystem.out.printlnすると２０と表示されます。
```
int count = 0;
```
intを定義してcountという変数名に０を代入しています。for文の外側に定義することによってスコープ（変数の寿命がfor内で終わらなくなる）が発生しません。
```
for (int i = 0; i < scores.length; i++) {
```
for文の実行順は決まっています。左から順に評価されます。まずintを定義し０を代入します。次にi < scores.lengthが評価されます。一週目の時点ではiに代入されている数字は０です。scores.lengthのlengthは長さという英単語です。この場合の長さというのはint配列に入っている変数の数となります。２０、３０、４０、５０が入っているのでlengthは４となります。i < scores.lengthはi < 4 と読むことができます。iに入っている０が４になるまでfor文は繰り返されます。i < scores.lengthが評価された後はforの中にあるブロックが実行されます。
```
count = Math.max(count, scores[i]);
```
Math.maxは二つの値を比べて大きい方をcount代入します。for文の外にcountを定義して０を代入していました。scores[i]はscores[0]で２０となります。一週目の時点ではcountは０なので０と２０が比べる対象になります。countには２０が代入されました。そしてfor文の最後にあるi++(インクリメント)でfor文のiに１がプラスされます。二週目がスタートしますが一週目とは違いiは０ではなく１になっています。scores[1]には30の変数が入っているのでMath.maxでは一週目に代入された２０とscores[1]にある、３０を比較し結果的に３０が代入されます。これをscores.lengthに入っている変数の数だけ比較して繰り返していきます。
繰り返しの終了時には`System.out.println(count);`を実行させることにより、最大値が表示されることになります。
## 最小値の出し方
	public static void main(String[] args) {
		int[] scores = {20,30,40,50};
		int count = scores[0];
		for (int i = 0; i < scores.length; i++) {
			count = Math.min(count, scores[i]);
			}
		System.out.println(count);
		}
ちなみにこれが最小値を表示させるソースコードです。countにscores[0]（int型）を代入することによって、scoresの最初に格納された値２０をcountに入れられます。そしてMath.minに最小値を代入させるようにします。これで最小値を表示させるプログラムにアレンジできました。
# 終わりに
短いコードですが説明は長くなってしまいました。これからも理解が怪しかったらこうしてアウトプットしていこうと思います。
ポリモーフィック型ウイルスとは何か？

## ポリモーフィック型のウイルスとは
ウイルスはその発見方法として、パターンマッチングによる方法がとられる。
それを回避するのがこのウイルスの特徴。
コードに暗号鍵で自信を暗号化することで、ウイルス特有のパターンを回避することで、発見されにくくする方法。
また、ミューテーション型ウイルスともいわれる。
これを発見するには、ヒューリスティック法やビヘイビア法などの行動検知型の手法をとる必要がある。

## ヒューリスティック法,ビヘイビア法
ヒューリスティック法→マルウェア特有の動きがみられるかを検知する方法
ビヘイビア法→サンドボックスを用意して、実際に起動させ、挙動を監視する方法
DityのRerank設定について

## はじめに

DifyでRAGを使う場合、検索設定を次の３つから選択することになります。

- ベクトル検索
- 全文検索
- ハイブリッド検索

ハイブリッド検索とは文字通り、ベクトル検索と全文検索とをハイブリッドで行うため、こちらの方が精度が高くなります。ハイブリッド検索が推奨値となります。そして、ハイブリッド検索を選択すると、次に「ウェイト設定」と「Rerankモデル」が選択できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/bc7e0f1f-3456-339a-8fad-cc10af59af40.png)

## ウェイト設定

ウェイト設定のウェイトとは重みのことです。なぜか訳を「重み設定」とせずに「ウェイト設定」と訳しています。何のウェイトかといえば、ベクトル検索で使われる「セマンティック優先度」と、全文検索で使われる「キーワード優先度」のこととなります。単にベクトル検索と全文検索を行うだけでなく、ウェイトを考慮した上で検索した方が、精度をあげることができます。

セマンティック優先度とキーワード優先度の重みの付け方は諸刃の剣です。つまり、セマンティック優先度を高く設定すれば、キーワード優先度は低くなり、逆にセマンティック優先度を低く設定すれば、キーワード優先度は高くなります。

どの程度の重み加減にするといい塩梅になるのかついては、少し話が難しくなりそうです。

## Rerank設定

精度をよくしたい場合は、「ウェイト設定」ではなく「Rerank設定」をすることになります。ウェイト設定よりもRerank設定の方が検索の精度が高くなります。Rerank設定にすれば、重みを付けたハイブリッド検索は行ってくれないが、その代わりに、再順位付けを行うようになります。

Rerank設定の場合、Rerank専用のモデルを別途指定する必要があります。プルダウンメニューからRerankモデルの一覧が表示されない場合は、Rerank用のモデルのAPI-KEY設定ができていません。

OpenAIのAPI-KEY設定を行っただけでは、Rerank用のモデルは使えるようになりません。OpenAIはそもそも、Rerank用のモデルを提供していないためです。新たに、Rerank用のモデルを提供しているプロバイダーからAPI-KEYを取得して設定する必要があります。

どこのプロバイダーがRerank用のモデルを提供しているのかについては、下記の赤線部分を見れば分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/0c1e0732-0040-207b-f9ab-d5e15bd5e9f4.png)

提供しているプロバイダーの数はそれ程多くはありません。迷ったならCohereを選択するといいようです。Cohereが提供しているモデルが一番精度が高くて有名なためです。Cohereのモデルは無償で提供されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/39a06f58-0744-7edd-b36f-19e37779cc57.png)


「rerank-v3.5」は最新のモデルでv3.0よりも精度が上がっています。推論が強化されているようで、多言語にも対応しています。100以上の言語に対応しており、当然日本語にも対応しています。最新のモデルで試した場合は「rerank-v3.5」を選択することになります。

## Cohereとは

RAGを使うにあたって、なぜ、Rerank用のモデルが必要になるのかといわれれば、LLMのモデルだけでは高い精度が担保できないためです。LLMにはハルシネーション（幻覚）を発生させる弱点を持っています。LLMのモデルに更にRerankのモデルを組み合わせることで、ハルシネーションを抑制することができるようになります。

CohereはOpenAIほど知名度は高くはないが、カナダに拠点を持つスタートアップ企業で、特にRAGに向けたモデルの開発に力を入れています。また、OracleやNVIDIAなどが出資しており、OpenAIの有力なライバルと目されているようです。

https://cohere.com/

## 埋め込みモデルとは（補足）

RAGを使う場合、LLMとは別に埋め込みモデルを選択することになります。Rankモデルともまた異なります。埋め込みモデルはデータを数値ベクトルに変換する際に利用されるモデルです。

OpenAIのAPI-KEYを登録すると３つの埋め込みモデルが選択できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/760a602d-6671-55ba-30a1-f6f46076cc27.png)

CohereのAPI-KEYを登録すると７つの埋め込みモデルが選択できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/bb7e9058-a782-cb8c-a185-a21a8aa4c423.png)

OpenAIの埋め込みモデルは、「ada-002 → small → large」とバージョンアップしていっているようで、largeが一番性能がいいことになります。どれを選択したらいいか迷った場合は、largeをとりあえず選択しておけば問題ないかと思います。ただし、largeの場合、1Kトークンあたり＄0.00013のコストがかかり、smallの場合は、 1Kトークンあたり＄0.00002コストがかかることになります。

Cohereではナレッジで読み込みデータが英語である場合は「embed-english-v3.0」を選択し、英語以外であれば「embed-multilingual-v3.0」を選択します。日本語であれば「embed-multilingual-v3.0」を選択することになります。
【ネットワーク】TCP/IP アプリケーション層

# はじめに
こんにちは。アメリカで独学でエンジニアを目指している者です。
現在ネットワークについて学んでいるのですが、その中でも本日はTCP/IPのアプリケーション層について見ていきたいと思います

## アプリケーション層の役割
アプリケーション層は、具体的なアプリケーション同士がやり取りを行う際に使用されるプロトコルを定義する層です。
この層のプロトコルは、トランスポート層が提供するサービス（TCPやUDPによる信頼性やポート番号による宛先識別など）を利用し、メール送受信、ファイル転送、Web閲覧、名前解決など、さまざまな機能を実現します。

## 代表的なプロトコル
### HTTP (Hypertext Transfer Protocol)
Webページを閲覧するためのプロトコルで、Webブラウザ（クライアント）とWebサーバ間の通信を規定します
主な特徴は以下の通りです
* テキストや画像、動画などのデータ転送
* ステートレス（基本的には通信の状態を保持しない仕組み）
* 現在はHTTP/2、HTTP/3など高速化・暗号化の観点での拡張も進んでいる
### HTTPS (HTTP Secure)
HTTPに暗号化（SSL/TLS）を組み合わせたもので、機密性の高いデータを扱うサイトで主流です。
主な特徴は以下の通りです
* 通信内容の盗聴・改ざん防止
* 現在ではほとんどのWebサービスで利用
### SMTP (Simple Mail Transfer Protocol)
**電子メールを送信**するためのプロトコルです
主な特徴は以下の通りです
* クライアント（メールソフト）からメールサーバへ送信、メールサーバ同士の受け渡しを担当
* 受信には別のプロトコル（POP3やIMAPなど）が用いられる
### POP3 (Post Office Protocol version 3)
**メールを受信**するためのプロトコルで、メールサーバに保存されているメールをクライアントにダウンロードして管理します
主な特徴は以下の通りです
* メールサーバからメールを取得したあと、デフォルトではサーバ上のメールが削除される（設定により変更可能）
* シンプルな仕組みだが、複数端末でメールを同期するのが難しい
### IMAP (Internet Message Access Protocol)
受信メールをサーバ上で管理し、複数の端末でメールを閲覧・操作できるようにするプロトコルです。
主な特徴は以下の通りです
* メールをサーバと常に同期できる
* Webメールなど、複数のクライアント環境で同じメールボックスを扱う場合に便利
### FTP (File Transfer Protocol)
インターネット上でファイルを転送するための代表的なプロトコルです。
主な特徴は以下の通りです
* 大容量ファイルでもやりとりがしやすい
* セキュリティ面を強化するためにSFTP（SSH File Transfer Protocol）やFTPS（FTP over TLS）などの派生も利用されている
### DNS (Domain Name System)
ドメイン名とIPアドレスを相互変換するためのシステム、およびそれを実現するプロトコルです。
主な特徴は以下の通りです
* “www.example.com”のようなホスト名から、“93.184.216.34”のようなIPアドレスを調べる（逆引きもあり）
* 分散型の仕組みで、世界規模のシステムとなっている
### SSH
遠隔地にある機器のコンソール（コマンドライン）にアクセスするためのプロトコルです。
* SSH (Secure Shell) は暗号化を行うため、リモート端末との安全なやり取りが可能となる。

# まとめ

* アプリケーション層 は、ユーザが直接利用するサービスやアプリケーション同士の通信ルールを定義する層であり、HTTP、SMTP、DNSなど多くのプロトコルが含まれます。
* 上位層であるアプリケーション層のプロトコルは、下位層であるトランスポート層（TCP/UDPなど）のサービスを利用することで、実際の通信を実現します。

次回以降はTCPをより掘り下げた記事を書いていきたいと思います。
🐇【Playwright】テスト実行の便利なコマンド5選

## 📌Playwrightでテストを最適化する！  
テストの実行、**毎回すべて走らせる必要ある？** 🤔  
`--headed` や `--retry=1` などの便利なオプションを使えば、もっと効率的に回せる！


---

## **📌 1. テスト結果を詳細に表示する**

👉 **「どのテストが実行された？」「何が失敗した？」を確認！**

```bash
npx playwright test tests/ticket-purchase.spec.ts --reporter=list
```

✅ **リスト形式で、実行されたテストと結果を詳細に表示！** 🎫

✅ **エラーの特定やデバッグに便利！**

---

## **📌 2. ブラウザを開いてテストを実行する（デバッグ向け）**

👉 **「実際にブラウザが動いている様子を見ながらテストしたい！」ときに便利！**

```bash
npx playwright test tests/ticket-purchase.spec.ts --headed
```

✅ **自動テストがどのように動くか目視で確認！** 🖥️

✅ **クリックや入力の動作をリアルタイムでチェックできる！**

---

## **📌 3. 失敗したテストのみ再実行する**

👉 **「テストが失敗した！ でも全部やり直すのは時間がかかる…」そんなときに！**

```bash
npx playwright test --retry=1
```

✅ **失敗したテストだけ再実行して、効率的にデバッグ！** 🔄

✅ **「たまたま落ちた？」か、それとも「本当にバグ？」かを素早く確認！**

---

## **📌 4. 特定のテストケースだけを実行する**

👉 **「特定の処理だけをピンポイントでテストしたい！」ときに！**

```bash
npx playwright test -g "購入確認ページの表示"
```

✅ **指定したテストケースだけを実行できる！** 🎯

✅ **`-g`（または `--grep`）を使うと、名前に一致するテストを実行！**

---

## **📌 5. テストのステップごとにスクリーンショットを撮る**

👉 **「テストがどこで失敗したのか、画面の状態を見たい！」ときに！**

```bash
npx playwright test --trace=on
```

✅ **テストの各ステップごとにスクリーンショットを撮影！** 📸

✅ **失敗した時の状態をあとから確認できる！**

📌 **テスト実行後に `playwright-report` で詳細を確認できる！**

---

## **🎯 まとめ**

**テストをもっと快適に！** 🦁🎟️

Playwrightには、**効率的にテストを実行するための便利なコマンド** がたくさんある！

今回紹介した **5つのコマンド** を活用して、スムーズにテストを進めよう！ 🚀

### **✅ 便利なコマンド5選**

| **用途** | **コマンド** | **メリット** |
| --- | --- | --- |
| **詳細なテスト結果を確認** | `--reporter=list` | どのテストが実行されたか詳細に表示 |
| **ブラウザを開いて実行** | `--headed` | テストの動きを目視で確認できる |
| **失敗したテストのみ再実行** | `--retry=1` | デバッグ効率UP！ |
| **特定のテストだけ実行** | `-g "テスト名"` | 重要なテストだけピンポイント実行 |
| **テストのスクリーンショットを撮る** | `--trace=on` | どこで失敗したか視覚的に確認 |

🐼✨ **このコマンドを活用して、快適にPlaywrightテストを書いていこう！** 🎯
phpPgAdminをPostgreSQL 16でちょっと動くようにする方法

## 有志が対応版を作ってくれている様子

https://github.com/ReimuHakurei/phpPgAdmin/releases

## 代わりに `admier.php` を使うのが手っ取り早いかも

PostgreSQL の場合は `localhost:5432` を指定するひつようｇ

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/54f85456-f08b-af3e-4b1a-a5f74415f2c1.png)



## 手で修正する場合

https://github.com/phppgadmin/phppgadmin/pull/108/commits/25041ad6bc440e5587da9aa5842a940eacb237d9


https://github.com/phppgadmin/phppgadmin/issues/109


## 対応

```diff
diff --git a/classes/database/Connection.php b/classes/database/Connection.php
index eb22cd2..c9636b8 100644
--- a/classes/database/Connection.php
+++ b/classes/database/Connection.php
@@ -79,6 +79,7 @@ class Connection {
             case '10': return 'Postgres10';break;
             case '11': return 'Postgres11';break;
             case '12': return 'Postgres';break;
+            case '16': return 'Postgres16';break;
         }

                switch (substr($version,0,3)) {
diff --git a/classes/database/Postgres.php b/classes/database/Postgres.php
index ee19990..a73aca0 100644
--- a/classes/database/Postgres.php
+++ b/classes/database/Postgres.php
@@ -11,7 +11,7 @@ include_once('./classes/database/ADODB_base.php');

 class Postgres extends ADODB_base {

-       var $major_version = 12;
+       var $major_version = 16;
        // Max object name length
        var $_maxNameLen = 63;
        // Store the current schema
```

* classes/database/Postgres16.php を新規作成

```
<?php

/**
 * PostgreSQL 16 support
 *
 */

include_once('./classes/database/Postgres.php');

class Postgres16 extends Postgres {

        var $major_version = 16;

        /**
         * Constructor
         * @param $conn The database connection
         */
        function Postgres16($conn) {
                $this->Postgres($conn);
        }

        // Help functions

        function getHelpPages() {
                include_once('./help/PostgresDoc16.php');
                return $this->help_page;
        }

}
?>
```
統計検定1級　2024　統計応用(理工学)　問4　解説

![P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/74f9f750-31b2-fecc-4b92-92ad4d7f7a57.jpeg)
![P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/623f84a8-c543-2244-157f-709dbcf9f5f5.jpeg)
![P3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/82ca48a6-16c1-b649-6174-1e2c8442a289.jpeg)
![P4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/e62ea233-093f-1dc6-ec72-d46cb56d4c4b.jpeg)
![P5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/e171c895-cb29-6b95-2cdc-1dead975f7b6.jpeg)
JSONとは何かについて改めて整理してみた


# JSONとは何かについて改めて整理してみた

[JSON（JavaScript Object Notation）](https://www.json.org/json-ja.html)は、データを**シンプルなテキスト形式**で表現する**軽量のデータ交換フォーマット**である。人間にとって読み書きが容易であり、機械にとっても解析や生成が簡単なため、さまざまなシステム間のデータ通信に適している。

JSONの基本的な構造は2つある。

1. **名前/値のペアの集まり**（オブジェクト）
2. **値の順序付きリスト**（配列）

これらの構造により、JSONはWeb APIのレスポンスや設定ファイルとして広く活用されている。

参考：[MDN JSONの基本](https://developer.mozilla.org/ja/docs/Learn_web_development/Core/Scripting/JSON)

## JSONはどんなときに使うのか？

### 1. アプリやWebのデータ通信

iOSアプリやWebアプリでは、サーバーと情報をやり取りする際にJSONをよく使う。例えば、天気アプリがサーバーから最新の天気情報を取得する場合、サーバーは以下のようなJSONデータを送信する。

```json
{
  "location": "Tokyo",
  "temperature": 18,
  "weather": "cloudy"
}
```

このデータを基に、アプリは「東京の気温は18度、天気はくもり」と表示する。

### 2. 設定情報の保存

JSONは設定ファイルとしても利用される。例えば、アプリのユーザー設定をJSON形式で保存すれば、次回起動時に同じ設定を適用できる。

```json
{
  "username": "taro123",
  "theme": "dark",
  "notifications": true
}
```

このデータを保存しておけば、アプリ再起動時に「ユーザー名：taro123」「ダークモード」「通知オン」の設定を復元可能。



---

## SwiftでのJSONの使用方法

### 1. JSONのデコード（解析）

`JSONDecoder`を使えば、JSONデータをSwiftのデータ型に変換できる。

```swift
import Foundation

struct Weather: Codable {
    let location: String
    let temperature: Int
    let weather: String
}

let url = URL(string: "https://example.com/weather.json")!

URLSession.shared.dataTask(with: url) { data, response, error in
    guard let data = data else { return }
    
    do {
        let weather = try JSONDecoder().decode(Weather.self, from: data)
        print("場所: \(weather.location), 気温: \(weather.temperature)℃, 天気: \(weather.weather)")
    } catch {
        print("JSONの解析に失敗しました: \(error)")
    }
}.resume()
```

### 2. JSONのエンコード（生成）

SwiftのデータをJSON形式に変換するには、`JSONEncoder`を使用する。

```swift
import Foundation

struct UserProfile: Codable {
    let username: String
    let age: Int
}

let user = UserProfile(username: "taro123", age: 20)

do {
    let jsonData = try JSONEncoder().encode(user)
    if let jsonString = String(data: jsonData, encoding: .utf8) {
        print(jsonString) // {"username":"taro123","age":20}
    }
} catch {
    print("JSONの変換に失敗しました: \(error)")
}
```

---

## まとめ

- **JSONはデータ交換や設定ファイルで広く使われるフォーマット**
- **Swiftでは**\*\*`Codable`\*\***を使うとJSONのエンコード・デコードが簡単**
- **他のデータフォーマットと比較して、用途に応じた選択が重要**

さらに詳しく学ぶなら、以下の公式ドキュメントを参照。

- [JSON.org（公式仕様）](https://www.json.org/json-ja.html)
- [MDN JSONの基本](https://developer.mozilla.org/ja/docs/Learn_web_development/Core/Scripting/JSON)
Brainf*ck方言そーなのかー

命令は「そー」と「なの」「かー」の３つのみ。
それ以外の文字は無視される。

言語で使用する予約語を減らすため、命令はオーダーで指定する。
`[`と `]` 、`+`と`-`のように命令が対照になっていることに着目して、それらをスイッチで切り替える設計にした。

- **そー**：
    オーダーを進める。範囲は0~3、超えたら0に戻る。
- **なの**：
    以下の表のオーダーとスイッチに対応した命令を実行。
- **かー**：
    スイッチ(true/false)切り替え

Brainf*ckと同等の機能をサポートする

|オーダー|スイッチ|Brainf*ck命令|
|-|-|-|
|0|true|`>`|
|0|false|`<`|
|1|true|`+`|
|1|false|`-`|
|2|true|`.`|
|2|false|`,`|
|3|true|`[`|
|3|false|`]`|

# 実装

https://gist.github.com/KajizukaTaichi/59b439d912c5c81ca0d88d6963c2547b
Tailwind CSSの取り入れ方

**Web制作のスピードとデザイン性を両立できるCSSフレームワークといえば、いまや人気急上昇中のTailwind CSS。シンプルかつ柔軟なユーティリティクラスを使うことで、HTMLファイルだけで高速にサイトのスタイリングが可能です。これまでBootstrapなどのコンポーネントベースのフレームワークを使っていた方でも、Tailwind CSSの手軽さと拡張性の高さに魅力を感じるはず。本記事では、Tailwind CSSを導入するメリットや基本的な使い方を紹介します**。

# Tailwind CSSとは？

Tailwind CSSとは、あらかじめ定義された**ユーティリティクラス（utility classes）**を組み合わせるだけでデザインを行えるCSSフレームワークです。ここでいうユーティリティクラスとは、mt-4 (margin-top: 1rem) や text-center (text-align: center) など、特定のスタイルを1つだけ持つ超シンプルなクラスのこと。これをHTMLタグに付けていくだけで、必要なスタイルを適用できます。

一般的なフレームワーク（例: Bootstrap）は、すでに用意されたコンポーネントを使う場合が多いですよね。それに対しTailwind CSSは、要素を細かくスタイリングするための一連の小さなクラスを提供している点が大きく異なります。

# Tailwind CSSを使うメリット

圧倒的なスピード感ユーティリティクラスをHTMLタグに直接書いていくだけなので、CSSファイルを都度編集したり、複雑なコンポーネントをカスタマイズする手間が大幅に削減されます。

一貫性のあるデザインが簡単に実装できるTailwind CSSでは、デフォルトのテーマ（カラーやフォントサイズなど）を設定ファイルで一括管理できます。チーム開発の際も、プロジェクト全体で統一感をもたせやすいのが魅力です。

自由度が高く、コンポーネント化がしやすいプリセットのコンポーネントがない分、自由度が高く、柔軟なUIデザインが可能。ReactやVueなどのフレームワークと併用すれば、独自のコンポーネントを簡単に作成して使い回せます。

CSSの肥大化を抑えられるTailwind CSSには、「PurgeCSS」という不要なCSSクラスを削除する仕組みが組み込まれています。そのため、本番ビルドでは実際に使われているクラスだけが残り、ファイルサイズを最小限に抑えられます。

**基本的な使い方**

# 1. プロジェクトへの導入

Tailwind CSSを使い始めるには、Node.jsの環境が必要です。まずはプロジェクトの初期化をして依存関係をインストールしましょう。
```
npm init -y
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
```

このコマンドを実行すると、tailwind.config.js と postcss.config.js という設定ファイルが作成されます。

# 2. Tailwindの初期設定

Tailwindは基本的に必要なクラスをすべて読み込む形なので、最初はファイルサイズが大きくなりがちです。しかし、PurgeCSSを設定すると、実際に使われたクラスだけをビルド時に抽出してくれます。tailwind.config.jsのcontentセクションに、HTMLや各種フレームワークのテンプレートファイルのパスを指定します。
```javascript
// tailwind.config.js
module.exports = {
  content: [
    "./src/**/*.{html,js,jsx,ts,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
```
# 3. TailwindをCSSファイルに読み込む

Tailwindでスタイリングするために、CSSファイル（例: src/index.css）で必要なディレクティブを読み込みます。
```css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

このファイルをビルド・コンパイルする際に、Tailwindのユーティリティクラスが生成されます。

# 4. HTMLにユーティリティクラスを適用

具体的に、HTMLタグにクラスをどのように割り当てるかを見てみましょう。たとえば、シンプルなボタンを作りたい場合:
```html
<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
  ボタン
</button>
```

わずか数個のクラスをつけるだけで、背景色、ホバー時の背景色、テキストカラー、フォントの太さ、上下左右の余白、角丸などが一度に適用されます。

**カスタマイズとテーマ**

Tailwind CSSは、そのまま使っても十分便利ですが、プロジェクトごとにカラーパレットやフォントなどをカスタマイズできます。たとえば、ブランディングカラーを追加したい場合:
```javascript
// tailwind.config.js
module.exports = {
  // ...
  theme: {
    extend: {
      colors: {
        primary: '#1E40AF',
        secondary: '#9333EA',
        // 好きなだけ追加
      },
    },
  },
  // ...
}
```

こうすることで、
button class="bg-primary text-white"のように、独自の色を簡単に適用できます。

# Tailwind CSSを活用してみよう

Tailwind CSSは学習コストこそ低くありませんが、慣れてしまうとプロトタイプや本番環境でも手早くきれいなUIを作れる強力なツールです。特に以下のようなケースでおすすめです。

**SPAフレームワーク（React, Vue, Angularなど）を使っている**

**コンポーネントベースの開発に慣れている**

**デザインに独自性をもたせたい**

**サイトのパフォーマンスを重視している**

Tailwind CSSを導入することで、細部までこだわり抜いたUIを作りながらも、チーム全体でスタイリングルールを揃えやすくなるのが大きなメリットです。

**まとめ**

**Tailwind CSS**は、ユーティリティクラスを活用するという独特なアプローチで、Web制作の効率化と自由なデザインを両立させる注目のフレームワークです。一度試してみると、その手軽さやカスタマイズ性の高さにハマる方も多いはず。もしBootstrapなどの既存フレームワークに物足りなさを感じていたり、もっとコーディングを効率化したいと考えているなら、ぜひTailwind CSSを導入してみてください。
GeojsonからKML変換

# GeoJSONファイルから特定地域のデータを抽出し、KML形式で保存するPythonスクリプト

## はじめに

このスクリプトは、GeoJSONファイルから特定の地域のデータを抽出し、新しい属性を追加した上でKML形式のファイルとして保存します。地理空間データの加工と変換に活用できます。

## 必要なライブラリ

import geopandas as gpd
import os
import numpy as np


## GeoJSONファイルの読み込み

file_path = r"データフォルダ\土砂災害警戒区域データ.geojson"
gdf = gpd.read_file(file_path)


## データの加工

特定の条件に基づいて新しい属性を追加します。

gdf["name"] = np.where(
gdf["属性A"].isin([1, 3]), "yellow",
np.where(gdf["属性A"].isin([2, 4]), "red", "不明")
)


## 出力先フォルダの設定と作成

output_folder = r"出力先フォルダ\filtered_kml"
if not os.path.exists(output_folder):
os.makedirs(output_folder)


## 抽出する地域名の設定

regions = ["地域A", "地域B", "地域C", "地域D", "地域E", "地域F", "地域G", "地域H", "地域I"]


## データの抽出とKML形式での保存

for region in regions:
filtered_gdf = gdf[gdf['地域カラム'].str.contains(region, na=False)]

if not filtered_gdf.empty:
    output_file = f"{output_folder}\\{region}.kml"
    filtered_gdf.to_file(output_file, driver="KML")
    print(f"{region} のデータをKMLで保存しました: {output_file}")
else:
    print(f"{region} のデータはありませんでした。")


## ポイント

- 具体的な地域名やパス、属性名は実際の環境とデータに合わせて調整してください
- 新しい属性の追加ロジックは、データの内容に応じて適切に設定してください
- KML形式での保存には、geopandasの機能を利用しています

## 注意事項

- 事前にgeopandas, numpy, osのインストールが必要です
- 大容量データの処理には時間がかかる可能性があります
- データの著作権や利用規約を必ず確認してください
GeoJSONファイルから特定地域のデータを抽出

# GeoJSONファイルから特定地域のデータを抽出して保存するPythonスクリプト

## はじめに

このスクリプトは、GeoJSONファイルから特定の地域のデータを抽出し、新しいGeoJSONファイルとして保存するものです。地理空間データの分割処理に活用できます。

## 必要なライブラリ

import geopandas as gpd

## GeoJSONファイルの読み込み

file_path = r"データフォルダ\土砂災害警戒区域データ.geojson"
gdf = gpd.read_file(file_path)


## データの確認

print(gdf.columns)


## 出力先フォルダの設定

output_folder = r"出力先フォルダ"


## 抽出する地域名の設定

regions = ["地域A", "地域B", "地域C", "地域D"]


## データの抽出と保存

for region in regions:
filtered_gdf = gdf[gdf['地域カラム'].str.contains(region, na=False)]

if not filtered_gdf.empty:
    output_file = f"{output_folder}\\{region}.geojson"
    filtered_gdf.to_file(output_file, driver="GeoJSON")
    print(f"{region} のデータを保存しました: {output_file}")
else:
    print(f"{region} のデータはありませんでした。")


## ポイント

- 具体的な地域名やパスは実際の環境に合わせて調整してください
- 大容量データの処理には注意が必要です
- エラーハンドリングを追加することをおすすめします

## 注意事項

- 事前にgeopandasのインストールが必要です
- データの著作権や利用規約を必ず確認してください
WSL1のUbuntu 24.04 - apt upgradeがdpkg, systemd, polkitdの語句を含むエラーで進まない

#### [問題点] WSL1のUbuntu 24.04にて、アップグレード時にエラーが出て、先へ進まなくなった
~~~
$ sudo apt upgrade
      ... 
 dpkg, systemd, polkitdなどの語句を含むエラーメッセージ
 (upgradeが行われずに終了)

(エラーの例)
Failed to take /etc/passwd lock: Invalid argument
dpkg: error processing package systemd (--configure):
 installed systemd package post-installation script subprocess returned error exit status 1
Errors were encountered while processing:
 systemd
E: Sub-process /usr/bin/dpkg returned an error code (1)
~~~

#### [解決] 下記コマンドを(wslの)ターミナルにて打ち込んだところ、その後は問題無くアップグレードできるようになった
~~~bash
cd /bin && sudo mv -f systemd-sysusers{,.org} && sudo ln -s echo systemd-sysusers && cd -
~~~

下記サイトの情報そのままなのですが、あまりにも即効性があったので、メモ代わりに記載します。
(Windows 11, wsl1, 2台で確認しています。うち1台はarm版 parallels desktop)
https://think-t.hatenablog.com/entry/2025/01/25/141248