OmniAICreator/Qiita-1.07M huggingface dataset:
✨Chromeをいっしょにキラキラさせよ✨：起動オプション🚀Seleniumと組み合わせちゃおっ💖

# Google Chrome 起動オプション（引数）

Google Chromeにはさまざまな起動オプション（引数）があって、使い方次第でブラウジング体験をカスタマイズできるのよね〜✨。ここで紹介するのは、「ブラウジングライフをキラキラさせる秘密のスパイス」みたいなものだよ😉💖。よく使うオプション、いくつかピックアップしてみたよ！

## イチオシ✨オプション一覧

1. **`--incognito`**: 
これを使えば、Google Chromeを秘密モードで起動できるの。履歴やクッキーが残らないから、ショッピングのサプライズやプレゼント探しにバッチリ！
2. **`--disable-extensions`**: 
拡張機能を全部オフにしてChromeを起動するわよ。トラブルシューティングやパフォーマンスのテストに使えるよ！
3. **`--start-maximized`**: 
Chromeを最大化状態で起動するの。これで毎回ウィンドウサイズをいじる手間が省けるわ！

4. **`--kiosk`**: 
これを使うと、Chromeがキオスクモードで開くの。フルスクリーンで表示されて、ユーザーが他のアプリやデスクトップにアクセスできなくなるから、公共の場所や展示会にぴったりよ。

5. **`--disable-gpu`**: 
GPU（グラフィックス処理装置）を無効にしてChromeを起動するわ。グラフィックス関連の問題をトラブルシューティングするときに便利み。

6. **`--user-data-dir=パス`**: 
Chromeに別のユーザープロファイルを使わせるために、このオプションを使ってね。複数のプロファイルで色々試したい時におすすめ！

7. **`--no-sandbox`**: 
セキュリティ機能の一つであるサンドボックスを無効にしてChromeを起動するの。ただし、セキュリティリスクが高まるから、開発やテスト目的以外では使わない方がいいよ！

## ハウツ～
使い方は、ショートカットやコマンドラインにこれらの引数を追加するだけ。
例えば、`chrome.exe --incognito`って感じで使ってみてね。ゆるふわなキミもガチめなキミも、ブラウジングスキルでバッチリキメて💫！

ほかにも、開発者ツールを自動で開くオプションや、特定のページを起動時に自動で開くオプションなど、調べてみるといろいろとあるんだよ😉
でも、オプションを使う時は、リスクもあるから気をつけてね。特にセキュリティに関わるオプションは、必要な時以外は使わない方がいいカモ💡🔒。
Seleniumで使うなら、オススメはheadlessモードだけど、うまく動かないサイトも多いし、語ると長くなるから今日はココマデ💥💥💥
**キミが使ってるオススメのオプションが有ったらコメントで教えてね💖**

## 参考文献
https://chromium.googlesource.com/chromium/src/+/master/chrome/common/chrome_switches.cc
【C#】 配列の要素を割合（確率）で取得する

:::note info
2024/02/11
頂いたコメントをもとに修正しました。
ありがとうございます。
:::



こんな配列の要素から以下のルールに則った割合で出力したい。
```csharp
new[] { "A", "B", "C", "D", "E" }
```
| 文字 | 割合 (%) |
|--------------|------|
| A       | 10   |
| B       | 20   |
| C      | 40   |
| D    | 20   |
| E    | 10   |

## 環境
dotnet8
xunit

## コード

```csharp
public class Raito
{
    private readonly string[] _hoges;
    private readonly int[] _weights;
    private readonly Random _random;

    public Raito(string[] hoges, int[] weights)
    {
        if (hoges.Length != weights.Length)
        {
            return;
        }

        this._hoges = hoges;
        this._weights = weights;
        this._random = new Random();
    }

    public string RandNumber()
    {
        var randomValue = _random.Next(_weights.Sum()) + 1;

        var selectedNumber = "";

        for (var i = 0; i < _hoges.Length; i++)
        {
            if (randomValue <= _weights[i])
            {
                selectedNumber = _hoges[i];
                break;
            }

            randomValue -= _weights[i];
        }

        return selectedNumber;
    }
}
```

## テスト

```csharp
    [Fact]
    public void TestRaito()
    {
        var n = 1000000;
        var hoges = new[] { "A", "B", "C", "D", "E" };
        var weights = new[] { 10, 20, 40, 20, 10 };
        var raito = new Raito(hoges, weights);

        var expectedProbabilities = new Dictionary<string, double>
        {
            { "A", 0.1 },
            { "B", 0.2 },
            { "C", 0.4 },
            { "D", 0.2 },
            { "E", 0.1 }
        };

        var actualCounts = new Dictionary<string, int>();

        for (int i = 0; i < n; i++)
        {
            var result = raito.RandNumber();
            if (!actualCounts.ContainsKey(result))
            {
                actualCounts[result] = 0;
            }

            actualCounts[result]++;
        }

        foreach (var kvp in actualCounts)
        {
            var actualProbability = (double)kvp.Value / n;
            var expectedProbability = expectedProbabilities[kvp.Key];
            // 0.1%までの誤差なら許容
            Assert.InRange(actualProbability, expectedProbability - 0.001, expectedProbability + 0.001);
        }
    }
```
MarkdownのプレビューとPDF変換結果にローカル描画したPlantUMLの図を埋め込む(VSCode + Docker)

## はじめに

Markdown内のPlantUMLの図をローカルサーバで描画して、プレビューやPDFエクスポート結果に埋め込む方法をまとめました。

※PlantUMLの単体ファイル(.pu)のプレビュー・エクスポート手順は既に記事にされている方がいましたので割愛します。

本記事では下記の形式のMarkdownをプレビュー・エクスポートします。
~~~md:Markdown例
# Title

## Fig

```plantuml
@startuml
Bob->Alice: Hello
@enduml
```
~~~

エクスポート結果
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329977/fad7cc0a-cf71-4c56-686d-1f6db3fe3bf5.png)

## 環境

インストール手順は省略します。

- VSCode
- VSCode 拡張機能
  - [Markdown Preview Enhanced](https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced)
  - [Markdown PDF](https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf)
- Docker
- Docker Compose

## ローカルPlantUMLサーバの起動

適当なディレクトリに下記の内容の`docker-compose.yml`ファイルを作成します。

```yaml:docker-compose.yml
version: '3'
services:
  plantuml-server:
    image: plantuml/plantuml-server
    container_name: plantuml-local-server
    ports:
      - "8080:8080"
```
`docker-compose.yml`ファイルを配置したディレクトリで下記のコマンドを実行します。
```shell
$ docker-compose up -d
```

参考: [VSCode+DockerでPlantUMLの環境を構築する](https://qiita.com/odayushin/items/4bdf0f8144afc9a86cee)

## VSCode設定

下記の拡張機能設定を追加します。

```
# Markdown Preview Enhanced
"markdown-preview-enhanced.plantumlServer": "http://localhost:8080/svg/"

# Markdown PDF
"markdown-pdf.plantumlOpenMarker": "```plantuml" 
"markdown-pdf.plantumlCloseMarker": "```"
"markdown-pdf.plantumlServer": "http://localhost:8080"
```

## プレビュー・エクスポート手順

Markdownファイルを開いた状態でコマンドパレットから以下のコマンドを実行します。

```
# プレビュー
> Markdown: Markdown Preview Enhanced: Open Preview

# エクスポート
> Markdown PDF: Export (pdf)
```

## まとめ

Markdown PDFのデフォルト設定だとコードブロック内のUMLを認識してくれないので困っていました。(コードブロックを外すと今度はプレビューが認識してくれない...)

Markdown PDFのUML開始・終了マーカー設定を変更することで、一般的な記法でプレビューとエクスポートを両立する方法の紹介でした。

## 参考

https://qiita.com/odayushin/items/4bdf0f8144afc9a86cee

https://github.com/yzane/vscode-markdown-pdf/issues/162
wolframに掲載されているハート曲線の描画コマンド

https://mathworld.wolfram.com/HeartCurve.html

```
r=1-sin(theta)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/e8be1ca7-ede0-2467-6648-ef681a259f4a.png)

```
(x^2+y^2-1)^3-x^2y^3
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/5dfb813d-3ffa-a4f5-994f-538380243d9c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/5421dcb6-392b-c856-2972-629175c9c5d9.png)

```
x=sin(t)cos(t)log(|t|), y=|t|^0.3sqrt(cos(t))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/903fc00f-859b-9f5a-c4d5-17658f057d7b.png)

```
x^2+(y-(2(x^2+|x|-6))/(3(x^2+|x|+2)))^2-36をプロット，x=-0.2..0.2, y=-2.3..-1.7
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/2f30b7d6-273f-be06-9744-ac08a1bc37b1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/1dffcde6-d5ae-73bb-1512-892614fe03d5.png)

```
r(t)=2-2sin(t)+sin(t)|cos(t)|^0.5/(sin(t)+1.4)を極プロット
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/20411d63-5cae-3655-847a-6eb659cdbafd.png)

```
x=16sin(t)^3, y=13cos(t)-5cos(2t)-2cos(3t)-cos(4t)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/f12e6fc0-9cdd-a9a5-10b9-51768df336b1.png)

```
x^2+(y-(x^2)^(1/3))^2-1をプロット，x=-1.4..1.4, y=-2..2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/1c90ef73-7df2-9ec4-a4dd-9a68455d7750.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/6f71b794-9eaf-89a3-5a50-cf2906592c28.png)

```
x=-2^0.5(sin(t))^3, y=2cos(t)-(cos(t))^2-(cos(t))^3
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/e8d72db9-c0ba-654b-ebd9-c33a0d7a1158.png)
初めて terraform import した。

## 問題

Terraform Cloudを使用している。
Terraform job 外で作成された IAM role をterraform のモジュール内で追跡したい。

## 解決方法

[terraform import](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role#import)を使用する。

ローカルマシンで以下のコマンドを走らせた。

$ `terraform import module.<module-name>.aws_iam_role.<role-name-in-tf> <existing-iam-role-name`


結果、Terraform Cloud上の `<module-name>`内に、`<role-name-in-tf>`という名前で IAM role が追跡されているのを確認できた。
【Java】競技プログラミングにJavaを使っていいの？

# はじめに
競技プログラミング (競プロ) でよく使用されるプログラミング言語といえばC++やPython (pypy) などが挙げられるでしょう。そう、競プロでJavaを使用するのはどちらかといえばマイノリティーに分類されます。
とはいえ、この記事にたどり着いたという事は、何かしらの理由で競プロでJavaを使う事を検討しているのではないでしょうか。実は私も数年前、同じ立場にいて、そのうえでJavaで競プロを始める事を選んだ人間です。
そこで、この記事では、実際に競プロでJavaを使っていて感じた事を解説していきたいと思います。「競プロでJavaを使ってみても大丈夫かな」と不安になっている方に届きますように。

※競プロといっても色々なサイト・大会がありますが、ここでは筆者がメインで参加しているAtcoderに絞った話をします。

# 目次
・筆者について
・私がJavaを選んだ理由
・実際にJavaを使ってみてどうか
・結論


# 筆者について
・競プロ歴5年 (アクティブに参加し始めたのはここ2年くらい)
・競プロでの使用言語: Java
・Atcoderレート帯: 緑

以上はすべて2024年2月現在における情報です。

# 私がJavaを選んだ理由
シンプルに「Javaしかプログラミング言語を知らなかった」からです。経緯としては、プログラミングやってみたい → 有名だからJavaやってみるか → 競プロっていうものがあるらしいぞ → あれ、あまりJavaはメインではないらしい？→まあ他に言語しらないしいいか、の流れですね。そのため、もしかしたら「Javaを選んだ」というより「Javaしか選べなかった」の方が近いかもしれません。ただし、Javaは有名な言語だから、言語自体の解説記事は多いし、著しく不便な事はないだろう、という予想はありました。
ただ、動悸が雑だったとはいえ、一応レート緑になるまで競プロをやっているので、ある程度Javaの使い心地は分かっているつもりです。

# 実際にJavaを使ってみてどうか
結論から言いますと、「別にJavaを使っていても問題はない」です。当たり前の事ですが、Atcoderでのコンテストは選択肢にあるどの言語を使ってもAC (正解) できるように問題が作られています。そのため、「Javaを使っていたから問題が解けなかった」という事はないはずです。
ただ、もちろん気を付けなければいけない事は数点あります。

### 1. Atcoder公式のAtcoder Libraryを使えない。
例えばC++を使う場合、Atcoder公式が提供しているAtcoder Libraryを使う事が出来ます。これは、競技プログラミングでよく使われる様々な便利な関数が入った便利なライブラリです。しかし、このライブラリはJava版の提供はありません。そのため、公式ライブラリを使いたい場合はC++を使う方が便利でしょう。
※有志の方が作ってくださったJava版Atcoder Libraryは公開されています (https://github.com/NASU41/AtCoderLibraryForJava)。

### 2. 解説に書いてあるサンプルコードが読めない
コンテスト終了後、各問題に対しての解説記事が公式から公開されます。しかし、そこに書いてあるサンプルコードはほぼ全てC++ (たまにpythonで併記)で書かれていて、Javaで書いてあるものは見たことがありません。それもそのはず、Atcoderのコンテストでは過半数の人がC++を使っており、Pythonの使用割合は1~2割、Javaにいたっては5%以下となっています。さすがにそれで公式解説でJavaが使用される事はないですよね。
ただし、これは「サンプルコードが読めない」というだけであって、解説記事自体は言語に関係なくアルゴリズムの解説をしてあるので読むことができます。むしろ、サンプルコードを読んで満足せず、自分で実装をしてみるモチベがわく…といえばむしろメリットかもしれません(?) 例え実装で困ったとしても、十中八九他の参加者がすでにJavaでACできるコードを提出しているため、そのコードを参考にする事が出来ます。
また、言語が違うとはいえJavaとC++の文法は似ているため、サンプルコードを「何となくこんな感じかな」と眺める事はできます。

### 3. 言語仕様、言語の特性でのメリット・デメリット
これは、どの言語にもいえる事ですが、言語によってできる事・できない事があります。
Javaを使うメリットとしては、言語自体の解説記事が多い事です。競プロ界隈でこそ使用者数が少ない言語ですが、界隈外を見れば多くの人が使用している言語です。そのため、初心者用学習サイト、初心者用解説記事、などもたくさんあります。そのため、Javaはすごく始めやすい言語、と言えるでしょう。また、業務でのプロダクト開発でもよく利用されている言語のため、競プロで培った知識を業務で活かしやすいとも言えます。
もちろん、逆にJavaだからこそできない事もあります。例えば、JavaはC++に比べると実行時間が長いため、実行時間ぎりぎりアルゴリズムを実装した際やヒューリスティック系のコンテストに参加した際に、C++ではACできてもJavaではTLE (実行時間制限超過) してしまう可能性があります。
他にも、Pythonでは整数int型に最大値がない事を利用して、ごり押しで解ける問題が過去にありました (ネタバレ防止のためどの問題か明言は避けます)
このように、「(言語名)を使っていたらこの問題楽に解けたのに…」となってしまう可能性はあります。ただし、これはどの言語にも言える事です。また、繰り返しになりますがAtcoderでのコンテストはどの言語を選択してもACできるようになっているので、Javaを使っていたせいで詰んでしまう、という事はありません。

# 結論
以上で述べた通り、Javaで競プロに参加する事には何の問題もないです。そのため、「競プロを始めてみたいけどJavaはダメなのか…」「Javaなら使えるのに、C++を新しく学ばなければいけないのか…」となっている人がいたら、私は「十分Javaで始めて大丈夫だよ」と言うでしょう。「始めるハードルを高くするくらいならJavaで始めた方がいい」というのが私の考えです。
しかし、Javaがマイナーな言語であるため、様々な注意点があるのは事実です。そのため、もし競プロをC++で始めるという選択肢があるのならC++の方をおすすめしますし、Java未学習の人にわざわざJavaはおすすめしません。
TerraformでEC2を起動

前回の<a href="https://qiita.com/k_jun_gorira/items/b457128b5df3c5ac9aec" target="_brank">Terraform環境構築</a>の続きとなります。
Terraformの開発が始められることを確認するためにEC2を起動してみます。
### 1.tfファイルを作成
・「<b>main.tf</b>」ファイルを作成する
・ファイルにEC2を起動するためのコードを記述する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/071bae8c-8f41-8f06-554c-5ce7313ea31b.png)
</br>
amiはマネジメントコンソールで確認する。
今回はAmazon Linux 2を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/fe55d817-137a-3558-c38b-9afa1dff4b4f.png)
</br>
instance_typeはマネジメントコンソールで確認する。
今回はt2.microを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/4fb02e20-bd85-4cda-f7b9-6d12aca295e7.png)
</br>
完成したコード
```python
provider "aws" {
  profile = "hoge"
  region = "ap-northeast-1"
}

resource "aws_instance" "test_instance" {
    ami = "ami-05b37ce701f85f26a"
    instance_type = "t2.micro"
}
```
### 2.terraform init
・ソースディレクトリで「<b>terraform init</b>」コマンドを実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/dd8c9a87-b1fb-1e1f-da55-2ce7b90c9154.png)
</br>
・コマンド実行後、terraformの初期化が完了する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/2e00f745-a184-91dd-9b78-48c4aaa39abb.png)
### 3.terraform apply(EC2を起動する)
・ソースディレクトリで「<b>terraform apply</b>」コマンドを実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/46bd90ac-5b3b-68d3-47ff-085de0feb1ec.png)
</br>
・確認メッセージが表示されたら「<b>yes</b>」を実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/149180f8-2fba-78ae-3207-71d9f3f82086.png)
</br>
・コマンドが正常終了することを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/520025c2-192f-2fe8-f68a-969b9bed7186.png)
</br>
・マネジメントコンソールでEC2が起動されていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/5765f7e9-fec3-15cf-b4cc-117348786de9.png)
### 4.terraform destroy(EC2を削除する)
・ソースディレクトリで「<b>terraform destroy</b>」コマンドを実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/6031a4df-1732-a1d6-dbe5-d36b36e21a5b.png)
</br>
・確認メッセージが表示されたら「<b>yes</b>」を実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/65252aee-7fd7-7255-d381-399f7ecbcee7.png)
</br>
・コマンドが正常終了することを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/2f19d17f-e35f-dfa6-3d46-ae7a95a7165f.png)
</br>
・マネジメントコンソールでEC2が終了されていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690862/df55b141-afc5-1cf4-1d5b-cacac6458687.png)

以上
【Apache】様々なURLの書き換え（リダイレクト＋プロキシ）

# はじめに

Apacheの[リバースプロキシ機能](https://qiita.com/nkojima/items/7a8dd5c5e1d3c032178c)については以前に記事にまとめましたが、ApacheのURLの書き換え（rewrite）機能を初めて本格的に使ったので、備忘録として記事をまとめてみました。

なお以下の設定内容については、技術評論社の[Apacheポケットリファレンス](https://www.amazon.co.jp/dp/4774142239)を参考にしました。

# 注意点

* 本記事に出てくる`aaaaa.ne.jp`や`bbbbb.ne.jp`はドメインの一例です。

# 単純なリダイレクト

* 単純なリダイレクトの場合、マッチさせたいURLのパターン（`^/index.html$`）に続けてリダイレクト先のURLを書きます。

|元のURL|リダイレクト先URL|
|---|---|
|http://aaaaa.ne.jp/index.html|http://bbbbb.ne.jp/index.html|

```text:httpd.confの設定内容
RewriteEngine On
RewriteRule  ^/index.html$ http://bbbbb.jp/index.html [L,R]
```

# 新しいパラメーターを付けてリダイレクト

* 新たに`id=123`という固定的なパラメーターを付ける場合、以下のようにパラメーターをベタ書きするだけでパラメーターを付けられます。
* `[L,R]`というオプションフラグは、`L`が「ここで書き換え処理を終える」、`R`が「リダイレクト処理」となります。

|元のURL|リダイレクト先URL|
|---|---|
|http://aaaaa.ne.jp/index.html|http://bbbbb.ne.jp/index.html?id=123|

```text:httpd.confの設定内容
RewriteEngine On
RewriteRule  ^/index.html$ http://bbbbb.ne.jp/index.html?id=123 [L,R]
```

# パラメーターを保持してリダイレクト

* `id=123`というパラメーターを保持してリダイレクトする場合、以下のように正規表現を組み合わせてパラメーター部分とマッチさせて、リダイレクト先URLにマッチした部分（`$1`）を付加すればOKです。


|元のURL|リダイレクト先URL|
|---|---|
|http://aaaaa.ne.jp/index.html?id=123|http://bbbbb.ne.jp/index.html?id=123|

```text:httpd.confの設定内容
RewriteEngine On
RewriteRule  ^/index.html(.*)$ http://bbbbb.ne.jp/index.html$1 [L,R]
```

# パラメーターを保持しつつ、新たなパラメーターを付けてリダイレクト

* 「パラメーターを保持してリダイレクト」と似ていますが、パラメーターとマッチした部分（`$1`）の後ろに新たなパラメーターを「?」を付けた上で付け加えるのがポイントです。
  * `QSA`というオプションを付けることで、クエリ文字列部分を追加することができます。
  * ちなみにApacheのリファレンスにおいて`QSA`フラグは「qsappend」と書かれているので、「Query String Append」の略が`QSA`のようです。

|元のURL|リダイレクト先URL|
|---|---|
|http://aaaaa.ne.jp/index.html?id=123|http://bbbbb.ne.jp/index.html?id=123&name=nkojima&type=test|

```text:httpd.confの設定内容
RewriteEngine On
RewriteRule  ^/index.html(.*)$ http://bbbbb.ne.jp/index.html$1?name=nkojima&type=test [QSA,L,R]
```

# パラメーターを保持しつつ、新たなパラメーターを付けた上で、別のURLに転送する

* リダイレクトではなくリバースプロキシ機能を使って別のURLに転送する場合は、`P`というオプションフラグを付けます。
  * それ以外の設定については、リダイレクト処理と同じとなります。
* この設定だとリバースプロキシとなるため、ブラウザのアドレスバー上のURLは`http://aaaaa.ne.jp/index.html?id=123`のままとなります。

|元のURL|転送先URL|
|---|---|
|http://aaaaa.ne.jp/index.html?id=123|http://bbbbb.ne.jp/index.html?id=123&name=nkojima&type=test|

```text:httpd.confの設定内容
RewriteEngine On
RewriteRule  ^/index.html(.*)$ http://bbbbb.ne.jp/index.html$1?name=nkojima&type=test [QSA,L,P]
```

# 参考URL

* [ApacheとTomcatを連携させる](https://qiita.com/nkojima/items/7a8dd5c5e1d3c032178c)
* [RewriteRule Flags - Apache HTTP Server Version 2.4](https://httpd.apache.org/docs/2.4/rewrite/flags.html)
jotaiのuseAtom()で更新関数の型がnever

状態管理ライブラリjotaiを使ってみて、最初にはまったところのメモ
## やりたいこと
useAtom()を使って値を更新
```react
const [loading, setLoading] = useAtom<boolean>(loadingState);

return (
    <Button onClick={() => setLoading(!loading)}>button</Button>
  );
```
すると型 'never' には呼び出しシグネチャがありません。と言われる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2553351/f10378c9-ff39-9bbe-f7df-ef508de749ce.png)

neverだ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2553351/87121638-8835-ac62-d3ac-f02155ad1e16.png)


## 結論
型を書かない
```react
const [loading, setLoading] = useAtom(loadingState);
```
なんでかな
競プロ用の開発環境を何も考えずに爆速で欲しければGitHub Codespacesを使おう

## はじめに

最近になってGitHub Codespaces最強じゃん、というのに気づき、競プロ環境もこれでいいんじゃない？と思って書く。

環境構築で面倒になって辞める人間が50%ぐらい(当社比)いるので、本格的な環境がこれだけ手軽に準備できるのはかなりいいんじゃないと思っている。
また仕組み上ブラウザで完結するので、PCはもちろんのことタブレット端末でも行けるはず。


## 手順

まず手順から。

- 下記にアクセスをする
https://github.com/mo124121/atcoder-pypy-runtime-environment

:::note warn
2024/6/9現在、ABCでの利用が禁止されている機能を持ったバージョンのatcoder-toolsを同梱するコンテナイメージを利用しています。
コンテスト中の利用はお控えください。
詳細はこちら：https://info.atcoder.jp/entry/llm-abc-rules-ja
:::


- create codespaceを押す(github accountがなければ先にsign upしよう）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522928/7db05441-e922-cea2-a85e-12a1fc71ae5c.png)

- 待つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522928/5f992166-7fed-7a97-be73-6d1ecb3993af.png)

- できた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522928/d4992488-40a8-7aa4-2bb8-2fcd23a6fa04.png)

以上で、定番のVisual Studio CodeでPythonを動かす環境が手に入るし、すべてブラウザで完結する。
そして、実際に裏でlinux OSが動いているので、デバッグ等もちゃんと動くし、各種拡張機能も追加できる。

## 仕組み

GitHubが提供しているサービスにCodespacesという開発環境をクラウドで提供する仕組みがある。今回はそれを利用して、私が以前作成したPython(PyPy)の実行環境として定義した内容に基づき、開発環境を起動している。
私が作成した、とはいうものの、実際に起動される環境はアカウントごとに個別なため、相互に干渉することはなく、自分だけの環境として動作させることができる。

https://github.co.jp/features/codespaces

## 注意点

### 利用時間に上限がある

GitHubのfreeアカウントは、実質60時間/月分Codespacesを利用することができる。なので、この時間を超過してしまうと利用ができなくなることが予想される。
(120h*core/monthまで使えるが、最小のインスタンスが2coreから)
https://docs.github.com/ja/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts
https://docs.github.com/ja/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#pricing-for-paid-usage

従い、この環境をベースにAtCoderなどのコンテストに出る場合、コンテスト直前は残量を確認しておこう。下記みたいな形で確認ができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522928/fd650de4-5d2a-9c7c-fb75-1d1adcb98200.png)

https://docs.github.com/ja/billing/managing-billing-for-github-codespaces/managing-the-spending-limit-for-github-codespaces

ただまあ、60時間もできたのならすごいことだと思うし、それだけできる人ならPCを買ってセットアップするコストや苦労は十分乗り越えられるんじゃないかと思う。

また、つけっぱなしでも勝手にシャットダウンしてコストセーブしてくれる機能もあるので、やらかしの心配も少ない。

### 使い込むなら知識が必要

使わないと30日たつとデフォルトで消える挙動のため、そのあたりの仕様をちゃんと理解をして利用する必要があるほか、この環境を改変などをしたくなってくると、gitの知識をはじめ環境を定義しているdevcontainerやdocker、linuxについて理解を深めていく必要が出てくる。
ただ、このあたりはまず動くものがあって、そこからちょっとづつやっていく分には比較的ハードルが低いと思うので、気になるところから手を付けていけばいいんじゃないかと思う。


## 終わりに

手順自体があまりにも簡単なので、思いのほか書くこともなかった。
環境構築、しんどいばかりで1ミリも楽しくないので、そういうところは全部省いて、プログラミングをぜひ楽しんでほしい。
E資格の勉強方法6選！試験前の勉強対策やおすすめの覚え方

E資格は難易度が高いと言われたり、落ちてしまったという声も多いです。
そこで今回はE資格のベストな勉強方法をいくつか解説していきたいと思います。
<h2>まずE資格とは</h2>
E資格（AI技術者検定）は、AI（人工知能）技術に関する深い理解と実践的な技能を証明するための資格であり、日本ディープラーニング協会（JDLA）によって運営されています。この資格は、AI技術の基礎から応用まで幅広い知識が求められるため、合格するためには自分に合う効果的な勉強法が必要です。
<h2>ただE資格を勉強するだけでは良くない</h2>
独学で適当にE資格の勉強をしてみたり、動画や適当に決めたJDLA認定プログラムで学んだ気になってしまうのはとても危険です。<br>
自分が何が不得意でE資格の中でなんの知識が分かっていないのかを把握したり、きちんとE資格の範囲全てを理解していないと到底合格できないでしょう。<br>
闇雲に勉強するだけでは安定的な合格は得られないので、きちんと自分に合う勉強方法を見極めましょう。
<h2>E資格の効果的な勉強方法6選</h2>

![E資格の効果的な勉強方法6選](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686535/ad427210-8759-764d-ddee-a16dcd7b60f9.jpeg)

それでは早速E資格に効果的な勉強の方法を6つ紹介します。
<h3>1.まずは基礎知識を理解しよう</h3>
E資格の試験では、AIプログラミングやディープラーニングに関する基礎知識をしっかりと理解することが重要です。また数学（特に線形代数、微分積分、確率統計）の基礎知識も、ディープラーニングのアルゴリズムを理解する上で不可欠です。これらの基礎知識を身につけるために、専門書やオンライン講座を活用しましょう。また、PythonなどのAIプログラミング言語にも慣れ親しんでおくことが大切です。
これらの基礎知識は動画でも学べますが、事前知識について学べるJDLA認定プログラムを選ぶとさらに良いでしょう。<br><br>

[おすすめJDLA認定プログラムはこちら](https://ai-kenkyujo.com/ai-e-shikaku/ "おすすめJDLA認定プログラムはこちら")
<h3>2.公式テキスト・教材を購入する</h3>
JDLA公式が推奨するテキストや教材を活用のもE資格の勉強では非常に効果的です。JDLA公式がおすすめしているテキストは試験範囲に沿って作られており、試験で求められる知識点を網羅的に学習することができます。
<h3>3.E資格の例題を解く</h3>
E資格の問題の傾向を掴むには、過去問や例題を解くのが手っ取り早いです。しかし、実はE資格の過去問については公開が禁止されています。
しかしJDLA公式サイトでは一部の過去問が公開されていたり、特定のJDLA認定プログラムではオリジナルの例題を解かせてくれる講座もあるのでそこで挑戦してみましょう。

[例題があるJDLA認定プログラム](https://ai-kenkyujo.com/ai-e-shikaku/ "例題があるJDLA認定プログラム")

<h3>4. 実践的なプロジェクトに参加する</h3>
基本的な知識を身につけた後は、実際にAI開発のプロジェクトに参加してみるのも良いでしょう。Kaggleのコンペティション参加や、自分でテーマを設定してプロジェクトを進めるなど、実際に手を動かす経験を積むことで、学んだ知識を深め、実践的なスキルを養うことができます。
E資格では開発の時の知識や環境などの問題も出るので、そのジャンルへの勉強にもなるでしょう。

<h3>5. グループ学習・勉強会の活用</h3>
E資格は一人で学習を進めるよりも、同じ目標を持つ仲間と一緒に学習することでモチベーションを保ちやすくなります。また、互いにE資格の知識を共有することで、自分では気づかなかった視点や目線の知識を得ることができます。<br>オンラインやオフラインで開催される勉強会やセミナーに積極的に参加し、知識の吸収だけでなく共有や理解度を深めることにも注力しましょう。

<h3>6. 定期的に自己テストを行う</h3>
定期的にこれまでの学習内容を振り返り、自己評価を行うことも重要です。特にE資格の中でも苦手と感じる分野は、重点的に取り組み、理解を深めるようにしましょう。自分自身で小テストを作成するか、学習グループ内で問題を出し合うのも良いですね。特に弱点が克服されたかどうかをチェックすることで、安定して勉強の効果を得ることができます。

基本的にはこの6つの勉強方法を重視してE資格受験に向けて学習すると良いでしょう。

<h2>E資格を勉強する時のコツ</h2>
ここではE資格を勉強する際に、さらに気をつけた方が良いポイントをコツとして解説していきます。
<h3>メンタルケアと休息</h3>

![メンタルケアと休息](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686535/26462773-5084-acca-0625-d460daaf2883.jpeg)

E資格は難易度が高いので、長期的に勉強して挑む人がほとんどです。また、「E資格を受験する」と周りや家族に話した場合、勉強について何度も聞かれたりするでしょう。<br>
しかし効率よく勉強するには適切な休息とメンタルケアを怠らないことも大切です。過度なストレスは学習効果を下げる原因となるので、リラックスできる趣味の時間を設けたり、十分な睡眠をとることが重要です。
勉強に切羽詰まりすぎないためにも、事前にスケジュールを考えておくと良いでしょう。

<h3>不得意な分野は徹底的に勉強しよう</h3>
E資格に合格したいと言っても、全ての範囲について満遍なく勉強する必要はありません。
自分が苦手の分野をピックアップして、重点的に理解度を深めていきましょう。

<h2>E資格試験の直前におすすめな勉強方法</h2>
E資格試験の数週間前からは、試験に特化した対策を自分で練って勉強を強化しましょう。特に重要な公式や概念をまとめたシートを作成し、毎日のように復習することで記憶が定着していきます。<br>
また、時間を計ってオリジナルの例題を解く練習を行うことで、E資格試験の時間配分や問題へのアプローチ方法を身につけることができます。

<h2>E資格の勉強方法についてまとめ</h2>
E資格の合格はAI技術者としての一つのステップであり、得られる知識とスキルは将来のキャリアにとても価値があります。上記の勉強方法を参考にしながら、自分に合った学習計画を立て、着実にE資格の知識を積み重ねていきましょう。また、挑戦する過程で生じる困難や壁に直面した際は、それを乗り越えた先に大きな成長が待っているということを忘れずに、前向きな姿勢を保ち続けてください。
フロントエンドの技術選定LTまとめ

# はじめに

https://findy.connpass.com/event/306714/

こちらに参加してきたので資料のまとめと個人的にへぇ～と思ったポイントを
メモ程度に記載しました😎
フロントエンド学びたい誰かに刺されば幸いです！

# RemixでWeb標準を学んだ1年間
メイン資料

https://speakerdeck.com/nkzn/first-year-with-remix

補足資料

https://shopify.engineering/migrating-our-largest-mobile-app-to-react-native
- Remix触ってると自然とWeb標準を学ぶことになる、どうせ学習コスト払うならRemixで！
- MDN読む機会が増えた
- でかい企業に買収されるとビックバンリリースしなくなる
- SSRの難点は？

> SSRと相性の悪いUIライブラリを使うと、環境構築が大変というのがありました。
> MUIに慣れているのでMUIを使ったのですが、あんまり相性が良くないです。
> 基本的にはtailwindcss等を使うと、問題が起きづらいです。

# フロントエンドをViteからNext.jsに書き換えた話 〜パフォーマンス編〜
メイン資料

https://dev.henry.jp/entry/replace-vite-with-nextjs
- 業界のトレンドとしてNext.jsが上がっていたのでリプレイス
- ページの初期表示（FCP）が大幅に改善
- データ以外のレイアウトが先に高速表示されるためユーザー体験向上につながった
- 開発の手を止めないために平行開発し、いつでもNext.jsを落とせる状態にした

# 一休レストランで Next.js App Router から Remix に乗り換えた話
メイン資料

https://speakerdeck.com/takonda/migration-from-next-app-router-to-remix
- Remixが提供するWeb標準APIの恩恵が大きかったので採用
- メモリ使用量が1/4に！
- コールドスタートが半分に！
- ちなみにバックエンドはPython→Rustで書き直した

https://user-first.ikyu.co.jp/entry/2023/12/25/132215


# Next.js App Router を例に考える、技術選定・技術との距離感
メイン資料

https://speakerdeck.com/izumin5210/findy-2024-01-24

補足資料

https://speakerdeck.com/izumin5210/findy-2023-10-04
- 技術選定の理由付けをしっかり
- モダンだからこれ！ではなくプロダクト・チームの今や未来との整合性を
- 決定的な差がなければ「距離を取る」

# おわりに
今回参加してみて、RemixがHotなことがよくわかりました。笑
RemixのPhilosophyは一言で言うと **「Web標準と和解せよ」** 
Web標準を学習し、自分自身も拡張性のあるエンジニアになりたいと思うLTでした😌
Findyさん、ありがとう

記事を読んでくださった方は、是非弊社開発課のXもフォローしてね😘
毎日エンジニアに向けた情報発信を行っていますのでよしなに🤗

https://twitter.com/tech_cin


# 参考リンク

https://remix.run/docs/en/1.19.3/pages/philosophy
CEFの話

こんにちは。E-kan株式会社の藤尾です。

過去に「RIBとFIBがよく分からないよ～！」ということでまとめたことがあったのですが

> RIBとFIBについて | E-kan株式会社 by 藤尾菜摘
> https://www.wantedly.com/companies/e-kan/post_articles/347150?utm_source=t.co&utm_medium=share&lang=ja 

CCNPのテキストにちゃんと書いてありました！
当時、調べても分かりづらく悩んだのですが、ちゃんと文章でまとまっていましたね。

で、後でまとめたいと思っていたCEFについても記載があったので、備忘録も兼ねてまとめます。

## 普通のルーティング
**プロセススイッチング：** パケットが着信するたびにルーティングテーブルやARPテーブルを検索する。他の転送方式に比べると遅い。

**ファストスイッチング：** その宛先の最初の転送時のルーティングテーブルやARPテーブル情報をキャッシュに保存し、同じ宛先のものが来た時にキャッシュを参照する。キャッシュを利用することで高速に転送させることができる。


## CEF(Cisco Express Forwarding)
ファストスイッチングでは、キャッシュに登録されていない宛先が大量に来た場合は都度プロセススイッチングを行うことになり効率が下がる。

CEFではプロセススイッチングを行わず、ルーティングテーブルからあらかじめFIBというテーブルを作成しておき、ARPテーブルからは隣接テーブル(Adjacency Table)を作成する。
このFIBと隣接テーブルはあらかじめ紐づけされていて、データプレーン(パケットの転送処理を行う部分)に作られるため１度の検索で転送に必要な情報が取得できるため高速処理ができる。

RIB＝ルーティングテーブル なので、つまりRIBをもとにFIBは作られる。
FIBはRIBの情報だけでなく転送に必要な情報を保持するためのデータベースである。
(前回疑問への答)

---------------------------------------

CEFの話、まとめてみたら思った以上にシンプルでした。
前回CEFの話をした時に保存先として出てきたCAMの話もCCNPのテキストでスイッチングの部分で出てきていたので次はスイッチングの話をまとめておきたいと思います。


## 最後までお読みいただき、ありがとうございます！
イーカンは世界中のエンジニアとともに、ワクワクしたITの未来を作り上げることを楽しみにしています。

新しいテクノロジーとアイデアをブレンドして、もっと便利で効率的なソリューションを世界へ届けることに情熱を注いでいます。

イーカンの目指す未来は、テクノロジーの進化が生活やビジネスに影響を与えて、社会をポジティブな方向に進めていくことです。世界中のエンジニアのビジョンや目標をサポートし、共に成長できることを期待しています！

最新情報やイベントについては、弊社ウェブサイトやSNSアカウントを通じてご案内していきますので、ぜひご覧ください。
エンジニアの皆様との新たな出会いに感謝し、これからも一緒に未来を切り拓いていけることを楽しみにしております。

私たちとともにITの発展を追求していきましょう！

[E-kan株式会社　イーカンカブシキガイシャ]
ウェブサイト：https://e-kan.tokyo/
採用サイト：https://en-gage.net/e-kan/
Twitter：https://twitter.com/EkanTw
Facebook：https://www.facebook.com/ekan0507
AT Protocol 覚書

面白いおもちゃが急に出てきたので調べ事を雑に残しておく
apiを使うのに面倒な手順も（今は）不要だしapi利用制限も緩そうなので暇なときに遊ぼう
※気が向いたら綺麗に書き直す
```
from atproto import Client
from atproto_client.models.app.bsky.feed.get_timeline import Response

client = Client()
client.login('{メールアドレス or ユーザ名}', '{パスワード}')

# 普通の投稿
client.send_post(text='postテスト')

# 画像付き投稿
with open('test.jpg', 'rb') as f:
    img_data = f.read()

client.send_image(text='画像付きpostテスト', image=img_data, image_alt='test')

# タイムライン取得
res: Response = client.get_timeline()

print('ユーザ名：' + res.feed[0].post.author.display_name)
print('投稿時間：' + res.feed[0].post.record.created_at)
print('ポスト：' + res.feed[0].post.record.text)
print('いいね回数：' + str(res.feed[0].post.like_count))
print('リプライ回数：' + str(res.feed[0].post.reply_count))
print('リポスト回数：' + str(res.feed[0].post.repost_count))
```
超基本的なことは出来たので次は画像の取得周りをこねこねしてみよう

参考：https://atproto.blue/en/latest/
Eclipseでスクラッチブックを使ってみる

# 1. はじめに
* Eclipseで開発をする時に簡易な動作確認をしたい

# 2. 開発環境
* Eclipse All In One
* Java

# 3. スクラッチブックの新規作成
* Javaの実行/デバッグ > スクラッチブック・ページを選択する
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/f51bdc82-be8e-32e6-ec98-cbfa3f6d45c2.png)

# 4. スクラッチブックの使い方
## 4.1. 事前準備
* import文がある場合はコードではなく、右クリックから設定置く必要がある
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/52276a7c-ba3d-c0f9-835f-9a57e8c1631a.png)

* importするものを追加しておく
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/3cc80ee8-f02b-f479-dcdd-b361468dda1e.png)

## 4.2. サンプルコード
```Java:
List<String> list = Arrays.asList("a", "b", "c");

// Listに含む場合
System.out.println(list.contains("a"));

//Listに含まない場合
System.out.println(list.contains("z"));
```
## 4.3. 実行方法
* 実行するコードを選択して、右クリックから実行を選択する
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/85c70f2a-8d85-d4d3-430f-9c5b12478ddd.png)

# 5. 参考文献

https://sw-dev-blog.symmetric.jp/archives/10
Zabbixの通知で詰まったら。

## 概要

Zabbixの通知設定でつまづいたのでメモ

## 通知が動くまでの流れ。

- ホストごとのトリガーが発行される。
- トリガーアクションが実行される。
- トリガーアクション・ユーザーに紐づいたメディアタイプに応じて通知される。

## 見るところ

レポートの「アクションログ」を見る。
メディアタイプの設定が間違っているくらいなら、ここに情報が載っている。エラーメッセージに応じて、検索してやれば大体解決する。

## なんのログも出ない

トリガーアクションに設定した通知対象のユーザーが、ホストに対する権限がないと、なんのログも残らない。
かなり行き詰まった。

通知対象のユーザーをユーザーグループに所属させ、ユーザーグループに対して、「ホストの権限」を設定する。

ホストの権限がないと、そもそもアクションログすら残らないので、ガチで詰まります。
Apache JMeterのテストシナリオから環境変数やシステムプロパティを参照する

# What's？

タイトルのとおり、Apache JMeterのシナリオから環境変数やシステムプロパティを参照するにはどうしたら？ということで調べてみました。

# ユーザー定義変数とBeanShell

環境変数やシステムプロパティは固定値なので、ユーザー定義変数として見るのがよさそうです。

[Component Reference / Configuration Elements / User Defined Variables](https://jmeter.apache.org/usermanual/component_reference.html#User_Defined_Variables)

取得方法は、BeanShellを使うことになりそうです。

[Functions and Variables / __BeanShell](https://jmeter.apache.org/usermanual/functions.html#__BeanShell)

つまり、ユーザー定義変数の値に対して環境変数であれば

```java
${__BeanShell(System.getenv("環境変数名"))}
```

として、システムプロパティであれば

```java
${__BeanShell(System.getProperty("システムプロパティ名"))}
```

とすればよさそうです。

# サンプル

試しに、HTTPリクエストのホスト名とポート番号を変数にして

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/b38bde39-a101-6499-92c1-ab7c37499631.png)

これらをそれぞれ環境変数およびシステムプロパティから取得するようにしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/89500808-4d92-08b8-f66a-b27bc7452908.png)

こうですね。

```java
${__BeanShell(System.getenv("TARGET_HOST"))}
```

```java
${__BeanShell(System.getProperty("target.port"))}
```

設定方法ですが、環境変数はまあいいとして、システムプロパティはどうすればいいのかな？と思ったのでヘルプを見て見ます。

```shell
$ bin/jmeter -?
```

`-D[システムプロパティ名]=[値]`で良さそうです。

```shell
        -D, --systemproperty <argument>=<value>
                Define additional system properties
```

つまり、今回のサンプルならこんな感じですね。

```shell
$ TARGET_HOST=localhost bin/jmeter -Dtarget.port=8080
```

# 確認環境

```shell
$ bin/jmeter --version
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
    _    ____   _    ____ _   _ _____       _ __  __ _____ _____ _____ ____
   / \  |  _ \ / \  / ___| | | | ____|     | |  \/  | ____|_   _| ____|  _ \
  / _ \ | |_) / _ \| |   | |_| |  _|    _  | | |\/| |  _|   | | |  _| | |_) |
 / ___ \|  __/ ___ \ |___|  _  | |___  | |_| | |  | | |___  | | | |___|  _ <
/_/   \_\_| /_/   \_\____|_| |_|_____|  \___/|_|  |_|_____| |_| |_____|_| \_\ 5.6.3

Copyright (c) 1999-2024 The Apache Software Foundation

```
複数キーワードgrep

#!/bin/bash

# キーワードが記載されたテキストファイルのパス
keywords_file="keywords.txt"

# 対象ディレクトリ
target_dir="/path/to/target_directory"

# 結果を保存するディレクトリ
output_dir="/path/to/output_directory"

# テキストファイルからキーワードを読み込み、grepを実行して結果を保存する関数
search_keywords() {
    local keyword="$1"
    local output_file="$output_dir/result_$keyword.txt"
    grep -r "$keyword" "$target_dir" > "$output_file"
}

# キーワードファイルを読み込み、それぞれのキーワードに対して検索を実行
while IFS= read -r keyword; do
    search_keywords "$keyword"
done < "$keywords_file"
文系卒1年目が3週間で、AWSクラウドプラクティショナーに合格した勉強法

# 受験前の経験値
私立文系大学を卒業後、2023.4月にSIerに新卒入社。2023.6月、パッケージ製品の導入プロジェクトにアサイン後、業務内容としては、設計～実装、会議の進行、調整等を行ってきました。
AWSについては、4月の研修時に動画で学習したものの、実務内で今まで触れたことはありませんでした。

# 勉強方法
まず、学習教材として用いたのは以下の3つ。
- 書籍
    - 図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書 
      (https://amzn.asia/d/4JBiI3N)
- YouTube 
    - AWS資格対策講座　(http://www.youtube.com/@AWS_course)
- Udemy
    -この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集
     (https://www.udemy.com/course/aws-4260/)

## 学習順序
学習開始が年末の仕事納めからだったため、初期段階は学習時間を多めに取ることができました。

まず、「図解即戦力 Amazon Web Servicesのしくみ」を3日程度で読み、AWSサービスの全体観を理解しました。読了後、Udemy過去問を用い、1つだけ過去問を解き、出題問題形式を掴みました。
その後、上記YouTubeプレイリストを3日間でインプット後、Udemyで過去問を解きつつ、不明点を再度インプットという流れで学習しました。

年が明けてからは、過去問を中心に学習を進め、過去問内で不明点がある度に、調べ、苦手分野は自分で図解して、まとめておくことを繰り返しました。

最終的に、過去問の基本レベルは8割を取れていましたが、本番レベルは6割程度で若干不安が残るまま試験を受けました。

# 試験を受けてみて
資格勉強の過程で得た知識により、業務で拾える単語が増加し、会話の解像度を上げることができたと感じます。
本来は、この業務の理解度を上げることが資格勉強の目的で、資格取得は手段であるべきですが、勉強するうちに合格が目的になっていました。

AWSサービスだけでなく、ITの基礎知識をより習得するために、ここからは4月の応用情報合格を目指します。
GitHub のプライベートレポジトリから macOS 版 RStudio に git clone する

### RStudio で公開鍵を準備

1. Tools > Global Options… > Git/SVN > Create SSH key… > SSH key type: ED25519 > Create > Close
2. View public key から公開鍵をコピー

### Web ブラウザで下準備

3. github.com にログイン > Settings > SSH and GPG keys > New SSH key > Key に公開鍵をペースト > Add SSH key
4. git clone したいレポジトリ > Code > Local > SSH > git@… をコピー

### RStudio でプロジェクトを作成

1. Project: (None) > New Project… > Version Control > Git > Repository URL に git@… をペースト, Project directory name を記入 > Create Project
Selenium / Python : クリックしないと出てこないドロップダウンの中のli要素（さらに a要素で括られてるけど）の選択

## １．目的
Excelファイルにある情報をグループウェアのCybozu office（クラウド版）のスケジュールに自動で登録したい。

## ２．やりかた
Excelから情報を取り込む部分は省略。Seleniumでスクレイピングしてテキストボックスなどに記載する方法は、色々資料があるので、これも先人におまかせ。

## ３．この記事の主題
スケジュール登録をする時に、予定の見出しがドロップダウンで選択できるが、アプリ版では Tableタグで定義されていたものが、クラウド版では　liタグ で定義されるようになっていた。
なお、liタグの子要素としてさらにaタグが入ってるので、プログラム上はaタグを探す形になっています。

そこで、この辺りの記事も参考にしながら、やってみたもの一筋縄ではいかず、色々試したところ、最終的には選択できるようになったので、その例。
https://qiita.com/Colours/items/d8be0626a4f46a3a2460

## ４．実際の方法
この辺りは、とりあえず標準的なもので。
```
from selenium import webdriver
from selenium.webdriver.support.select import Select 
from selenium.webdriver.common.by import By
```
Cybozu officeにログインして、スケジュールの入力ページまで遷移
```
site_address = "http://*****.cybozu.com/o/ag.cgi?"　#*****は各社で指定
driver = webdriver.Chrome()
driver.get(site_address)
#ログインとかはこのあと適当に xpathで指定して　send_keys で。

#2024/1/1の誰か(***の番号)のスケジュールページを開く
site_address =  "http://*****.cybozu.com/o/ag.cgi?page=ScheduleEntry&UID=***&GID=***&Date=da.2024.1.1"
driver.get(site_address)
```

ここからが、この記事の本題。そしてハマったところ。
１．まずドロップダウンリストを表示させるために、dropdown_buttonをclick
２．出てきたリストから、目的のliタグ（今回は aタグ）を探して、 click

文字にすると簡単ですし出来てみたら当然なんですが、ウェブサイトのソースコードではli要素が直接見えるので、そのままliタグ（今回は aタグ）をClickしようとして、エラーではじかれていました。人間が作業するときと同じ手順を踏んだらできたという話。

```
drop_down = driver.find_element(By.CLASS_NAME,"dropdown_button")
drop_down.click()

date_menu = "休暇"  #ここはリストにある（定義済みの）項目。
#xpathで指定した項目を定義。date_menuの文字が入っている aタグを定義。
xpath = "//a[contains(text(),'" + date_menu + "')]"

#xpathで指定した項目を探して、click
drop_down_body = driver.find_element(By.XPATH,xpath)
drop_down_body.click()
```

***
以上、そんなに必要はないかもしれませんが、いろんなサイトの情報にお世話になったので、フィードバックとして記事にしておきます。
なお実際のコードには、適当なタイミングで time.sleep(1) など、ウェイトを入れています。
【ST言語ことはじめ】CASEでフラグ管理っぽいことをしてみた【箸休め】

## はじめに

この記事では、ST言語のCASE文を使用してビットフラグによる条件分岐を試みます。プログラミングの自由度は広がりそうですが、フラグの管理などでトラブルを誘発しそうなデザインなので、実用の際は最新の注意が必要になりそうです。

:::note warn
フラグ管理っぽいことをST言語でやってみようという実験です。安全や実用性に関しては考慮していない点はご注意をお願いします。
:::

### 使用機材

|   |機種など   |
|:---:|------|
|PLC  |Q02CPU, QX41, QY41P, Q62P, Q38B    |
|アプリ  |GX Works 2    |

I/O割り付けは[こちら](https://qiita.com/so2/items/0f0cab2e324179718b89 "I/O割り付け表")を参照してください。

## ビットフラグを条件に使用するCASE文の例

以下の例では、進行状況などの状態をビットフラグ風に管理し、そのフラグに応じてCASE分で出力状況を制御しています。

```st
IF X1 THEN
        M0 := TRUE;
END_IF;

IF M0 AND X91 AND X93 THEN
   D0 := D0 OR 16#1; (* 2#0001; *)
END_IF;

IF D0 = 16#1 AND X90 THEN
    D0 := D0 OR 16#2; (* 2#0010; *)
END_IF;

IF D0 = 16#3 AND TS1 THEN
    D0 := D0 OR 16#4; (* 2#0100; *)
END_IF;

IF D0 = 16#7 AND X91 THEN
    D0 := D0 OR 16#8; (* 2#1000; *)
END_IF;

IF D0 = 16#F AND X92 THEN
    D0 := D0 OR 16#10; (* 2#00010000; *)
END_IF;

IF D0 = 16#1F AND X90 THEN
   D0 := D0 OR 16#20; (* 2#00100000; *)
END_IF;

IF D0 = 16#3F AND TS2 THEN
   D0 := D0 OR 16#40; (* 2#01000000; *)
END_IF;

IF D0 = 16#7F AND X91 THEN
    D0 := D0 OR 16#80; (* 2#10000000; *)
END_IF;

IF D0 = 16#FF AND X93 THEN
    D0 := D0 OR 16#100; (* 2#000100000000; *)
END_IF;

CASE D0 OF (* D0のフラグをもとに出力を振り分け *)
    0: YA0 := FALSE; YA1 := FALSE; RST(TRUE, T1); RST(TRUE, T2);
    1: YA0 := TRUE;
    3: OUT_T(TRUE, TC1, 10);
    7: YA0 := FALSE;
    15: YA1 := TRUE;
    31: YA0 := TRUE;
    63: OUT_T(TRUE, TC2, 30);
    127: YA0 := FALSE;
    255: YA1 := FALSE;
    511: D0 := 0; M0 := FALSE;
END_CASE;
```

ビットフラグは16進数とORなどを用いて管理しています。一方でCASE分では条件に１０進数しか使えないため、数字の置き換えが必要になります。
この変換作業が発生するために、CASE文でプログラムミスが発生する可能性がかなり高くなってしまうデザインです。

:::note info
アドレス指定を用いることで以下のような表記が可能です。
```diff_smalltalk
- D0 := D0 OR 16#8; (* 2#1000; *)
+ D0.3 := TRUE;
```
:::

:::note warn
OUT_T(TRUE, TC2, 30);
第一引数をTRUEとすることで、SETを使用した時と同じような状態になっています。第一引数はM1などのビットデバイスを使い、M1のON, OFFでタイマーの起動とリセットを制御したほうが良さそうです。
:::

## まとめ

この記事では、ST言語のCASE文とビットフラグを用いることで、複雑な条件分岐ができるようになりました。ただし、10進数と２進数や16進数との読替が発生するため、プログラムミスの発生が十分起こり得るデザインです。実用性は疑わしいので、利用の際には十分に検討と注意をお願いします。
【ST言語ことはじめ】ビットデバイスをCASEで使ってみる【箸休め】

## はじめに

この記事では、ST言語のCASE文を使用してビットデバイスの状態を条件に組み込む方法について解説します。通常、CASE文では整数値のみが条件として使用できますが、ビットデバイスの状態を反映することも可能です。具体的な方法を以下で説明します。

### 使用機材

|   |機種など   |
|:---:|------|
|PLC  |Q02CPU, QX41, QY41P, Q62P, Q38B    |
|アプリ  |GX Works 2    |

I/O割り付けは[こちら](https://qiita.com/so2/items/0f0cab2e324179718b89 "I/O割り付け表")を参照してください。

## ビットデバイスを条件に使用するCASE文の例

以下の例では、ボタンなどの状態を反映するためにビットデバイスをCASE文の条件として使用しています。

```st
CASE K1X0 OF
    1: Y71 := TRUE;                   (* 0001 ボタン０のみON *)
    2, 3 : Y72 := TRUE; Y71 := FALSE; (* 0010 or 0011 ボタン１がON, ボタン０がONまたはOFF *)
    4..7 : Y73 := TRUE; Y72 := FALSE; (* 0100 -> 0111 ボタン2がON *)
ELSE
    Y71 := FALSE;
END_CASE;
```

CASE文は通常、整数値や列挙型のみを条件として受け入れますが、ビットデバイスを直接条件として使用することはできません。入力デバイスが連続している場合にのみ、ワードデバイスと扱うことでCASE文の条件として扱うことができます。
ただし、接続端子が変更になるなどした場合に整合性をとることが難しいかもしれません。

:::note info
条件に整数値が使えるといってもK1や16#，8#などの接頭辞はつかえません
:::

## まとめ

この記事では、ST言語のCASE文を使用してビットデバイスの状態を条件に組み込む方法を解説しました。ビットデバイスを利用することで、ボタンなどの状態を柔軟に条件として組み込むことができます。この方法を活用して、より複雑な制御を実現しましょう。
JSON Server の自動採番する id が整数から文字列に変わってた

# はじめに
モバイルアプリなどのサンプルを作成している際、通信先の Web API を JSON Server で立てている方も多いかと思います。
以前に正常に動作していたサンプルが、久しぶりに触ったら動かなくなっていたので原因探りました。

結論として、JSON Server の挙動が 0 系列と 1 系列で変わった、というのが判明しました。

# そもそも JSON Server とは
Web API で返して欲しいデータを JSON ファイルで定義しておき、インストールした `json-server` コマンドの引数として渡して起動するだけで簡易的な Web API（CRUD 操作に対応）が用意できるというツールです。

```zsh: JSON Server による Web API の起動
% json-server data.json 
JSON Server started on PORT :3000
Press CTRL-C to stop
Watching data.json...

(˶ᵔ ᵕ ᵔ˶)

Index:
http://localhost:3000/

Static files:
Serving ./public directory if it exists

Endpoints:
http://localhost:3000/messages
http://localhost:3000/cats
http://localhost:3000/users
```

上記の例では、エンドポイントである `/messages`, `/cats`, `/users` に対応したデータ形式の定義が data.json にあり、これらのリソースへの CRUD 操作が用意されています。

簡単ですね。

## JSON Server の変更点
いろいろ細かい変更点がある（たとえば、用意するデータは JSON5 フォーマットが使えるようになったとか）ようですが、一番影響度の大きいのが id 列の扱いです。

## バージョン 0 系列
id プロパティを指定せずに JSON を POST すると、新規リソースに対して自動的に**連番の整数**が採番されます。
そのため、Web クライアント側のプログラムでは id を `Int` 型などの整数型で扱うようにプログラムを作成します。

## バージョン 1 系列
id プロパティが**文字列**に変更され、POST 時には id にランダムな？文字列（公式ドキュメント上はどんな文字列なのかは触れられていない）の値が設定されます。
なお、JSON Server の 0 系列用に作成しておいた JSON ファイル（id が整数）を JSON Server 1 系列で利用すると、以下のような挙動となります。

### GET でリソースを取得
- id の値がダブルクォートで囲まれて返される

### POST で新規リソースを登録
- 既存の id の値がダブルクォートで囲まれる
- 新規リソースの id はランダムな？文字列が登録される

### 例
```json:用意していた JSON ファイルの一部（id が数値）
{
  "messages": [
    {
      "id": 1,
      "icon": "info.circle",
      "headline": "共用部の掃除について",
      "body": "入居者の皆様\n10月28日に、業者による共用部の掃除があります。",
      "created_at": "9/27/2022, 9:00 AM"
    },
```

```json:GET リクエストで返された JSON の一部（id がダブルクォートで囲まれた文字列）
[
  {
    "id": "1",
    "icon": "info.circle",
    "headline": "共用部の掃除について",
    "body": "入居者の皆様\n10月28日に、業者による共用部の掃除があります。",
    "created_at": "9/27/2022, 9:00 AM"
  },
  ```

```json:POST で新規作成されたリソース部分抜粋（id がランダムな文字列）
{
  "id": "412c",
  "headline": "トイレのドア開けて",
  "body": "ドアが壊れました。\nトイレからでられないので、大家さんに連絡して開けてもらってください！",
  "icon": "sos.circle",
  "created_at": "2/9/2024, 10:51:17 AM"
}
```

### 影響
たとえば、Swift で以下のようなコードを書いていると、JSON Server の 1 系列では id の型が合わずに実行時エラーが発生します。

```swift:JSON の形に合わせたつもりの構造体（id を整数前提で定義）
struct Message: Identifiable, Codable {
    let id: Int? // "412c" などの文字列に変換できずにエラー
    let icon: String
    let headline: String
    let body: String
    let createdAt: String
}
```

# まとめ
JSON Server の 0 系列を利用していた場合は、id が整数である前提のコードを記述していることがほとんどかと思われます。
その場合は、0 系列のバージョン指定して JSON Server をインストールすると良いでしょう。

```zsh:バージョンを指定した JSON Server のインストール
sudo npm install -g json-server@0.17.4
```

# 参考
- [GitHub - typicode/json-server](https://github.com/typicode/json-server)
- [Using integers for IDs created "Not found" error in JSON server - Stack Overflow](https://stackoverflow.com/questions/77798989/using-integers-for-ids-created-not-found-error-in-json-server)
Laravelでchunkメソッドを使ってみよう！

* 大量のデータを取得
* 取得した大量のデータを加工しないといけない

というような場合に役に立つメソッドが**chunk**です。

# chunkメソッドでできることは
[リファレンスこちら](https://readouble.com/laravel/5.7/ja/queries.html)

大量のデータを小分けして取得することが可能です。

何万件ものデータを一括で取得すると、
* Out of Memoryを起こす
* レスポンスが遅くなる
* パフォーマンスが低化する

恐れがあります。
こちらを回避できるメソッドです。

例）1万件のデータを取得するとき
chunkで一度に取得する件数を100件と設定すると
100件 × 100回　でデータを取得するようになります。

# 記述例
**基本的な記法**
```php
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
    foreach ($users as $user) {
        // ここに処理を記述
    }
});
```
第1引数に1チャンクで扱うデータ数を決めます。
第2引数をクロージャとし、1チャンク内で行う処理を記述します。


**条件を満たすもののみ取得する場合**
```php
$getProducts = collect();

$query->chunk(100, function ('users') use (&$getUsers) {

		// ライセンス条件を満たしたuserを取得する関数
		$result = $this->checkLicence($users);
		
		// このチャンク内で取得したものを格納
		$getUsers = $getUsers->merge($result);
});
```

このようにデータを取得すると、メモリを節約しパフォーマンスを低下させずに大量のデータを扱えるようになります。
ただし、一度に取得するデータ数の設定は多すぎても少なすぎてもパフォーマンスが低下する恐れがあります。
下記2点注意してお使いください。

**一度に取得するデータ数の設定が多すぎる場合**
* そもそもchunkを使う意味がなくなってしまう

**一度に取得するデータ数の設定少なすぎる場合**
* 1000件のデータに対してchunkの引数に1を設定した場合
	* 1件 × 1000回　になるのでDBへの負担が大きくなる
最低限わかるLatex講座

# はじめに

これは、24年度執行委員会内で開催されたLatex講座の記事です。
公開範囲は、執行委員会内と新歓で来てくれた人に限定します。ご協力お願いします。

# latexとは

latex以下のような特徴のこんな感じの文章を作るものです。

|  |  |
| :- | - |
| latexとは | Wordみたいに文書を作成するもの |
| latexの特徴 | HTMLのようなテキストベースで編集して文書を作成する |
| Latexを使うメリット | 覚えれば楽、先生の心象が良くなりがち<br>テキストベースなので環境にOSなどに依存せずに同じ文書を作れる |

Latexに慣れておくことでレポートなどを楽に書くことができるので、いまのうちに慣れておくと良い。


#
Copilot Studio の生成 AI 機能で正式に日本語がサポートされました


# はじめに

URL を指定したり、ファイルをアップロードするだけで、独自の生成 AI チャットボットを作成できる、Copilot Studio の生成 AI 機能について、これまでいくつか Copilot Studio の記事を書いてきました。それらの記事の中で、日本語でもそれなりに動作する旨についても触れてきました。

https://qiita.com/Takashi_Masumori/items/77c3f1bcce188f0df869

https://qiita.com/Takashi_Masumori/items/74fac18e0ce57216c10a

ただ、厳密には日本語に対応していませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a7453c27-1d8b-38b6-c91d-c38e05ad07ba.png)

しかし、この度、日本語にも対応したようです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e43da166-7288-fa22-314b-3fe57ac4dfa4.png)

そのため、改めて設定、動作確認してみました。

# 設定

まず、念のためですが、作成にあたって、UI/UX は特に変わっていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c66579b3-0d40-e783-ee03-cabccb6b6d95.png)

以前と同じように Web サイトやファイルを追加してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/820caa46-ba46-0f33-d949-c4f6d26dcc6f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ce4bcdae-5c41-75ff-497c-cb8ca0b77c4d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/0aa87d8e-fc49-dd0c-1b7e-6ef819c24f88.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/615b39db-3923-d8f8-10d3-34eaafe64b47.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ae8a2ebd-1019-f457-0399-d0f78d012816.png)

# 動作確認

## 公開 Web ページ

まず、私のブログに書かれている内容を聞いてみます。以前もそれなりの精度で動きましたが、よりいい感じになっている気がします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/33e22ed2-30f7-0b4e-8266-0fc57222c41d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/0c622217-3be8-a96f-03ad-acbcefb58ba1.png)

## SharePoint サイト内のファイル

ちゃんと回答できていますし、また、リンクをクリックするとファイル自体を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/847db21d-7410-e5f2-2e9e-8dbf967cd3b2.png)

こちらも同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/aa7767c3-fa3b-9d94-0862-fb4d410102e3.png)


## 直接アップロードしたファイル

以前は異なるファイルに関する情報が返ってくることがありましたが、今回はちゃんと回答が返ってきました。ただ、こちらの場合、リンクをクリックしてファイルを直接開くことは出来ないようです。Dataverse 上にファイルが格納されているからだと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b00e973a-ae7e-f2c1-6da5-be5ec260475e.png)

# まとめ

今回は、Copilot Studio の生成 AI 機能で正式に日本語がサポートされたため、改めて設定、動作確認してみました。かなりいい感じに動いており、もちろん、簡単に作成できるため、市民開発者の方が、独自データを利用した、簡単な生成 AI FAQ チャットボットを作成したい場合、こちらを利用するのが良いかと思います。もちろん、プラスアルファで、特定の入力があった際に独自の処理、例えば何らかの自動化を行わせるようにすることなども可能です。

Copilot Studio の生成 AI 機能で正式に日本語がサポートされたことで、改めて、独自の生成 AI チャットボットの作成が民主化された (誰にでもできるようになった) と感じており、今後、Copilot Studio を通じて、どのような独自の生成 AI チャットボットが作成されていくのか、とてもわくわくしています。
雑メモ


複数ファイルを一つにまとめたいときのシェル。
```
#!/bin/bash

# 結合するファイルがあるディレクトリのパス
sourceDir="/path/to/your/directory"

# 出力ファイルのパス
outputFile="結合結果.txt"

# 出力ファイルが既に存在する場合は削除
if [ -f "$outputFile" ]; then
    rm "$outputFile"
fi

# 指定されたディレクトリ以下の全てのファイルを結合
find "$sourceDir" -type f -print0 | while IFS= read -r -d '' file; do
    echo "Processing: $file"
    cat "$file" >> "$outputFile"
    echo "" >> "$outputFile"
done

echo "Done."


```
[Windows] 超簡単Pythonローカル環境構築 [WinPython]

## Windows OSに干渉しないPython環境を構築したい
　Windows上Pythonを使ってプログラム開発すると複数バージョンのPython環境を共存させたいとかインストールされているライブラリが異なる環境を共存させたくなる。一般的にはvirtualenvを使うと思うが、それを使わず簡単に共存させる方法がある。

## WinPython
　WinPythonは[こちら](https://winpython.github.io/ "WinPython")で公開されているWindows用Pythonディストリビューション。これまで様々なバージョンが公開されている。
 
 ![TopPage.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636689/dcdf441d-7403-53a1-2d21-83ef1837ce6f.jpeg)

こちらは何も設定しなければOSと干渉しないものになるので複数バージョンやインストールライブラリが異なる環境を共存させられる。Overviewにもある通りWindows 8/10（11が書き忘れられている）、オープン、ポータブルで科学的、教育的用途のpythonプログラミング環境である。

![OverViwew_HP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636689/682475c5-d4f2-fe43-181d-edc8f6134a78.jpeg)

このポータブルがローカル環境、科学的が様々なライブラリのプレインストールされたものもあることを意味する。

## コンテンツについて
例えばトップページで紹介されているバージョン3.11.5のハイライトをみると"Jupyterlab-4.0.6, Numpy-1.25, pandas-2.1.1, scipy-1.11.1, scikit_learn-1.3.1, Poetryと記載がある。

これらのファイルはSourceForge, Githubにアップロードされている。対応するsourceForgeサイトが下記。

![sourceForge_3.11.5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636689/18784906-4165-aef2-c7d5-4e6e6ef57108.jpeg)

このWinpython64-3.11.5.0.exeがハイライト記載があるライブラリがプレインストールされているバージョン、Winpython64-3.11.5.0mkl.exeはIntel Math Kernel Library (MKL)を用いてビルドされたnumpy、scipyを含んだバージョン、Winpython64-3.11.5.0dot.exeは最小限のライブラリだけのバージョンである。これらの実行ファイルは自己解凍形式なのでダブルクリックすると解凍される。システムから「解凍できません」というメッセージが出た場合は「詳細」をクリックし説明を表示させれば（あくまで自己責任で）解凍できるようになる。
　解凍したフォルダが下記。ほぼ同じアイコンが並んでいるがWinpython64-3.11.5.0dotではIDLE、Pyzo、WinPythonCommandPrompt.exe、WinPythonInterpreter.exe、WinPythonPowerShellPrompt.exe、WinPythonTerminal.exeくらいしか立ち上がらない。ローカル環境にする場合はWinPythonControlPanel.exeは使わない。
 
![UnzipedFolders2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636689/ce5b5582-7018-98dd-b5ad-eb8ee06e4952.jpeg)


WinPythonのローカル化は各々の環境のみに使えるCommandPrompt、PowerShellが実装されていることによる。これらを使うことで他で解凍された環境から独立させている。各々のCommandPromptよりpip reezeによりインストールされているライブラリを表示すると下記になる。

![pip_freeze2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636689/19667e3a-b0ec-f2d2-5205-1cff2a34c382.jpeg)


プレインストールされているライブラリの違い、numpyにmklが含まれているか否かの違いが確認できる。用途に合わせて使い分ければよい。

## pip利用法
解凍したフォルダをローカル環境として使う場合、pipはそれぞれのフォルダに含まれるWinPythonCommandPrompt.exeを使う。proxy、trusted-hostを設定したい場合は下記内容を含むpip.iniファイルを作成しpython-3.1.5.amd64フォルダに保存すればよい。
```commandPrompt:pip.ini
[global]
proxy = http://proxy.ip:port/
trusted-host = pypi.python.org
               pypi.org
               files.pythonhosted.org
```

あとは通常の使い方通りになる。numpy, scipy, pyQtなどのバージョン変更なども可能である。

## IDEソフト
 Winpython64-3.11.5.0、Winpython64-3.11.5.0mklには設定済みのspyder、VSCodeも含まれているので立ち上げるだけでプログラミングエディターも含まれる。VSCodeは使った経験がないためアドインを追加してもローカル環境が保持されるかは不明。ただ細かい設定不要で使えるのは便利。

 ## まとめ
 　自己解凍するだけでpythonローカル環境を作る方法でした。ローカル環境が構築できるのだからUSBに解凍すれば環境の持ち運びも可能。管理者権限を持たない一般ユーザー権限でもインストール可能である。これらを考えると大変便利な環境が公開されているのだから積極的に使えば良いと思う。