OmniAICreator/Qiita-1.07M huggingface dataset:
【書評】TCP/IP技術入門

## 読んだ本

https://gihyo.jp/book/2024/978-4-297-14157-8

## 感想

TCP/IP関連の本はいつか読まないとなと思っていたら新しい本が発売されていたので読んでみた。
TCP/IPモデルをベースに（OSI参照モデルからしっかり復習できるので安心）、それぞれの層の役割から、具体的にどんなことを行っているかが詳しく解説されている。
最新の本なのでQUICなどの新しいプロトコルについて解説が含まれているのと、シミュレータを使った具体的な挙動の確認まで理解できるのはありがたかった。
一番いいなと思ったのが、歴史的な経緯を含めた解説があったことだ。この点はなかなかネットなどでキャッチアップするのが難しい内容なのに、今後出てくる新しい技術を理解するためにはすごく重要な点だと思っている。

## おすすめの人

- TCP/IPについて学ぼうかなと思っている人（基本情報レベルは知っている前提）

## 次に読むなら

- 未読だが有名な「マスタリングTCP/IP」ぐらいだろうか。ハードルは高そうなので本屋でチラ見してみようかな。

## 読んだときのメモ

- osi参照モデル→理論的正しさ
- tcp/ip階層モデル→実用的レイヤー分け
分散トレーシングのコレクタ

分散トレーシングの勉強をしてるとコレクタという単語に時々遭遇する。各サービスとバックエンドの間に入るものらしいというのはわかったが、一方で分散トレーシングのライブラリの使い方とかを読んでいるだけだと、文中にコレクタが出てこない。どういう代物なのか調べた。

# コレクタとは
コレクタは各サービスとバックエンドの間に入って、トレースのサンプリングやフィルタリング、バックエンドへの送信のリトライ処理などを行ってくれる。小規模な環境ならトレースを直接、全件バックエンドに送っても問題にならないが、サービスの数やリクエスト数が増えてくるとデータ量も大きくなるので、途中でサンプリングして件数を減らしてやる必要がある。
また、開発者が関心があるのは問題がなかったトレースではなく、エラーが発生したケースやレイテンシが非常に大きいケースなどの異常なケースのみだと思われるので、問題ないトレースはフィルタしてやって異常なトレースだけバックエンドに送信して可視化する。

# コレクタのお試し
このページをやるととりあえずOTELのコレクタを実行させて、トレースを送りつけることはできる。
* https://opentelemetry.io/docs/collector/quick-start/
ただコレクタの設定の細かい話(フィルタとか)はやってないし、送信元も何か適当なサービスを作ったのではなくシミュレータなのであまり参考にはならない。
Apsara Conference 2024（Alibaba Cloud）大会に参加した

Apsara Conference 2024（アリババクラウド）に参加しました。
アリババクラウドが2024/9/19〜21に中国・杭州で開催される年次イベント「Apsara Conference 2024」に参加しました。
![スクリーンショット 2024-10-05 20.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/f58dfc5d-d810-8c6e-76e6-7daf033cceba.png)

普段の仕事ではAWS、Azure、GCPを利用する機会が多く、今回、世界ランキング4位のアリババクラウドのイベントに参加できたことを嬉しく思っています。今年は、特に人工知能（AI）やクラウドコンピューティングに関連する技術が注目されています。業界の専門家と直接対話できたことは、とても貴重な機会となりました。

## 今年のテーマは「GenAI（生成AI）」
![WechatIMG29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/821a26ad-fc01-d115-a449-b20e14fa23f6.jpeg)
![WechatIMG30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/ed6c9c2e-b798-c711-2d56-332a9913b787.jpeg)
![WechatIMG31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/ef0d7006-3c61-548f-64a2-74e3b7b92f12.jpeg)
![WechatIMG36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/5f426aba-f633-e225-e0b0-2e8fc7672bb9.jpeg)
![WechatIMG37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/f4451b26-5753-0a3c-8dda-00607afa0168.jpeg)
rails newコマンドでのエラー対処

# 背景

初めてローカル環境で、Rails アプリケーションをつくろうとして、``Rails new`` コマンドを叩いたらいきなり躓いたので、メモ。

OS：Windows
使用しているアプリケーション：VSCode

# 1. ``': No such file or directory

``` :出現したエラー
（略）``': No such file or directory - git config init.defaultbranch (Errno::ENOENT)
```
### 解決策

特定のファイル内に存在する「`` ` ``」が、原因で発生していることが分かった。エラー文から、ファイルを特定できたため、当該ファイルの「`` ` ``」をすべて「'」に変更した。


https://qiita.com/TK_WebSE/items/f0a9cbd6e2b3431694bc

# 2. invalid byte sequence in UTF-8

``` :出現したエラー
Failed to load C:/Users/ユーザー名/.gemrc, invalid byte sequence in UTF-8
```

### 解決策

ファイルがUTF-8ではないことが原因かと思い、ファイルをメモ帳で開き、UTF-8で保存しなおしたところ、このエラーは解消された。（なお、これが上手くいかなくてもプロジェクトは作成された。）

# 3. Failed to build gem native extension.

``` :出現したエラー
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
C:/Ruby33-x64/lib/ruby/gems/3.3.0/gems/psych-5.1.2/ext/psych        
C:/Ruby33-x64/bin/ruby.exe extconf.rb
checking for pkg-config for yaml-0.1... not found
checking for yaml.h... no
yaml.h not found
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
（略）
To see why this extension failed to compile, please check the mkmf.log which can
be found here:

C:/Ruby33-x64/lib/ruby/gems/3.3.0/extensions/x64-mingw-ucrt/3.3.0/psych-5.1.2/mkmf.log
```
（なお、これが上手くいかなくてもプロジェクトは作成された。）

### 解決策

mkmf.logを確認したところ、以下の記載があった。

```
package configuration for yaml-0.1 is not found
```

以下のサイトの記述から、ruby3.2.0以降では、LibYAMLのインストールが必須になっているということを知った。

https://book-reviews.blog/ruby-3.3.0-install-error/

以下のサイトに準じて対応することでエラーが解決された。

https://www.ryozen-sc.com/brands/official/news/128


1. 以下のサイトから、`https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libyaml-0.2.5-2-any.pkg.tar.zst`をダウンロード
https://packages.msys2.org/packages/mingw-w64-x86_64-libyaml
　
2. ファイルを解凍
　
3. ``"（ファイル解凍場所）\mingw-w64-x86_64-libyaml-0.2.5-2-any.pkg\mingw64\include\yaml.h"``を、``"(Rubyをインストールした場所)\Ruby32-x64\include\ruby-3.3.0"``にコピー
※ インストールしたRubyのバージョンによりパスが異なる
　
4. ``"（ファイル解凍場所）\mingw-w64-x86_64-libyaml-0.2.5-2-any.pkg\mingw64\lib"``内の``libyaml.a``と``libyaml.dll.a``を、``"(Rubyをインストールした場所)\Ruby33-x64\lib"``にコピー
　
 5. もう一度rails newコマンドにトライ!（エラー解消！！）

ここでno such file エラーが出現する場合は、コピー先に誤りがないか確認する。


# おわりに

ProgateやGitHub Codespacesでしか、コードを書いていなかったこともあり、エラーにおびえました。先人のお知恵のおかげで何とか次に進めそうです。感謝申し上げます。
[tips][cpp][problemSolver] int型で使用する大きな数の例

# int型で使用する大きい数

c++のint型で使用する大きい数として、

```
const int MAX = 1000000007;
```

です。

最近は`1000000007`ではなく、`998244353`へ置き換えられているようです。

```
const int MAX = 998244353;
```

# 番外編

## `998244353`の性質

以下を満たすaとその演算に対して、次のことが保証されます。

```math
\{a \mid a \in \mathbb{Z}, a < 998244353 \}
```

- 足し算の結果が64bit未満に収まる
- 掛け算の結果が64bit未満に収まる

また、この素数は次の性質も持ちます。

- `998244353`は畳み込み計算がしやすい NTT-friendly な素数である
便利なバッチファイルについて

### はじめに
今回は、仕事で使用していて便利だと思ったバッチファイルについて記載します。


## １. バッチファイルとは
バッチファイルとは、Windows環境で実行できるコマンド列を記述したテキストファイルのことです。バッチファイルは拡張子が「.bat」であるため、BATファイルとも呼ばれます。

バッチ処理とは複数のコマンドを順次実行することを指します。つまり、バッチファイルに上からコマンドを書いていけば、その順番で実行されるということです。頻繁に実行する処理の一連の流れをバッチファイルに記述しておけば、いつでもまとめてその処理を実行できます。

バッチファイルの操作はコマンドプロンプトで行うため、マウスを利用した処理は不可能です。しかし、逆にマウスを使わないのであれば大抵の処理は実現します。

## 2.  検証
Googleの検索ページを自動で開くバッチファイルを作成してみます。
コードには以下を記載します。

```batch:google.bat
@echo off
start chrome.exe https://sample.com/sample.html
exit /b
```
各行の説明を以下に記載します。
```
@echo off 
```
上記では、バッチファイルの実行時にコマンドを画面に表示させないために記載します。

```
start chrome.exe https://sample.com/sample.html
```
上記では、開きたいページを指定しています。

```
exit /b
```

上記では、バッチファイルを終了させるために記載しています。


<br>
保存したファイルをダブルクリックで開いてみると、以下のようにGoogleの検索ページを表示することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629115/dcba158d-fe15-faf1-49e7-b8f5dd011d3e.png)



## 3.  まとめ
今回はGoogleの検索ページを表示する機能だけを作成しましたが、これを応用することで作業効率が高めることができると思うので色々活用してみようと思います。


##### 参考
https://it-trend.jp/development_tools/article/32-0040
【解決方法】Wayland環境にて、正常にマルチディスプレイが動作しない問題

KDE Plasmaをインストールしたら何故かマルチディスプレイが正常に動作しなかったのでメモ

# 環境
Arch Linux 2024.10.01
KDE Plasma 6.1.5 (Wayland)

# 解決方法
Nvidiaのドライバでは、デフォルトでDRM (Direct Rendering Manager[^1])が無効になっている場合があります。
有効化するためにはカーネルパラメータ[^2]に`nvidia-drm.modeset=1`を追加する必要があります。

:::note
変更後に再起動が必要です。
:::

### grubの場合
`/etc/default/grub` を編集する。
```diff_ini:/etc/default/grub
...
GRUB_DISTRIBUTOR="Arch"
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet"
- GRUB_CMDLINE_LINUX="zswap.enabled=0 rootfstype=ext4"
+ GRUB_CMDLINE_LINUX="zswap.enabled=0 rootfstype=ext4 nvidia-drm.modeset=1"
...
```
:::note
zswap.enabledやrootfstypeは関係ありませんので、無視して構いません
:::

### systemd-bootの場合
以下のコマンドでエントリのファイルを探します。
```bash
$ ls /boot/loader/entries
2024-10-05_10-42-39_linux-fallback.conf
2024-10-05_10-42-39_linux.conf
```
自分はarchinstallを使用してArch Linuxをインストールしたため、エントリのファイル名がインストールした日付になっています。(ファイル名は環境によって違います)
対象のエントリファイルを編集し、`options`の行の最後に`nvidia-drm.modeset=1`を追加します。
```diff_conf:/boot/loader/entries/2024-10-05_10-42-39_linux.conf
title   Arch Linux (linux) 
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
-options root=PARTUUID=(略) zswap.enabled=0 rw rootfstype=ext4
+options root=PARTUUID=(略) zswap.enabled=0 rw rootfstype=ext4 nvidia-drm.modeset=1
```

### その他のブートローダー

以下のページを参照し、パラメータに`nvidia-drm.modeset=1`を追加します。

https://wiki.archlinux.org/title/Kernel_parameters


[^1]: https://en.wikipedia.org/wiki/Direct_Rendering_Manager
[^2]: https://wiki.archlinux.org/title/Kernel_parameters
（IAM関連の知識整理）

# IAM関連の知識整理

## AWSアカウント
（いってみれば請求単位。）
一般的にAWS以外だと「アカウント」＝「ユーザー」＝「人」のイメージだが、AWSはそうじゃないので、初心者は要注意。
・個人に紐づくものではない。

## IAMユーザー
人。
こっちが一般的な「アカウント」のイメージ。
（語弊あるが、・個人に紐づくもの、のイメージに近い。）

## IAMロール
- IAMポリシー群をまとめたもの。
- （（　IAMロールをエンティティ（IAMグループ、IAMユーザ）にアタッチする？　））
- IAM Roleの使い方は、概ね2通り。
    - AWSリソース（EC2やLambdaなど）にアタッチして使う
    - IAM Userや他のIAM Roleから"AssumeRole"（Roleの引き受け）をして使う
- 「コンソールログインのためのパスワード」、「Access Key」、「Secret Access Key」といったものは発行できません。


## IAMポリシー 　★一言で言えば「許可リスト」

- IAMポリシーはJSON形式でAWSリソースへのアクセス権限を設定するドキュメント



## プリンシパルエンティティ　　＝　プリンシパル（Principal） ＝IAMアイデンティティともいう
- IAMユーザ、IAMグループ、IAMロールのこと。
- IAMアイデンティティともいう。

## IAM


▼参考サイト▼
　https://qiita.com/Batchi/items/a2dde3d2df27568cc078
　　↓　要するにこういうこと。
- リソースベース　＝（IAM以外）
    - S3バケットポリシー
    - VPCエンドポイントポリシー
    - SNSのtopic policy
    - などがある。

- IDベース（＝IAM）　
    - インラインポリシー
    - 管理ポリシー（※推奨）　
        - AWS管理ポリシー
        - カスタマー管理ポリシー

<table>
    <tr>
        <th>○○ベース<br>　=つまりIAMかIAM以外か。</th>
        <th colspan="3">ポリシーの種類</th>
    </tr>
    <tr>
        <td rowspan="5">リソースベース　＝IAM以外</td>
        <td colspan="2">S3バケットポリシー</td>
    </tr>
    <tr>
        <td colspan="2">VPCエンドポイントポリシー</td>
    </tr>
    <tr>
        <td colspan="2">SNSのtopic policy</td>
    </tr>
    <tr>
        <td colspan="2"> IAM ロールの信頼ポリシー ※これはIAMなので混乱しますね。。</td>
    </tr>
    <tr>
        <td colspan="2">などなど　※他にもあるかは調べてません</td>
    </tr>
    <tr>
        <td rowspan="3">IDベース＝IAMのこと</td>
        <td colspan="2">インラインポリシー</td>
    </tr>
    <tr>
        <td rowspan="2">管理ポリシー<br>※推奨</td>
        <td>AWS管理ポリシー</td>
    </tr>
    <tr>
        <td>カスタマー管理ポリシー</td>
    </tr>
</table>




## IDベースとリソースベースの違い
- リソースベース　＝ IAM以外のこと。
　　例：　S3のバケットポリシー、VPCエンドポイントポリシー、SNSのtopic policy　など

- IDベース　   ＝ IAMのこと


## IDベース
- いわばIAMのこと。
- 「誰がどのリソースに対して○○できる」

## リソースベース
- 例えばS3のバケットポリシー。「このリソースに対して誰が○○できる」
- インラインポリシーをリソースにアタッチする

## 管理ポリシーとインラインポリシーの違い
IAMポリシーには
インラインポリシー
管理ポリシー

の２種類がある。

※おそらく、マネージドコンソールでの表示では、
　　許可を追加　　＝　管理ポリシーの追加
  インラインポリシーを作成　　＝　そのままだが、インラインポリシーの追加　を指している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568345/52a12753-3076-fbfc-ce33-6f425e642edf.png)


### インラインポリシー
- 埋め込み型
- 「ポリシー」単体では存在できず、プリンシパルエンティティと1対1の関係にある。
- 基本的に管理ポリシーの方が推奨されているけど、逆に意図しない形でアクセス権の付与や変更が行われないようにしたい場合には、インラインポリシーを使用するのが良しとされているようです。

### 管理ポリシー　＝管理ベース
- スタンドアローン型。
- 「ポリシー」単体として存在できて、複数のプリンシパルエンティティにつけたり外したりできる。
- 通常は管理ポリシーの利用が推奨されている
    - 1対多の関係でプリンシパルエンティティにアタッチできる
    - ポリシーの変更時にはアタッチ済みのプリンシパルエンティティすべてに反映される
    - ポリシーの変更をバージョン管理できる
- 管理ポリシーには、さらにAWS管理ポリシーとカスタマー管理ポリシーがある。

#### AWS管理ポリシー	
予めAWSによって用意されている管理ポリシー。大まかに各AWSサービスごとにフル権限と読み取り権限が用意されている。

#### カスタマー管理ポリシー	
利用者が独自に作成する管理ポリシー。ジェネレータで作成するか手書きで作成する。

↓　上記を受けて、、、
↓

## 例えばEC2(アプリ）からS3バケットにアクセス許可あたえる方法は２つ
-
【C#】Blazorで簡単な電卓を作成した話

## 初めに

C#でフルスタックなWebアプリを作成することができるBlazorで簡単な電卓を作成しました。n番煎じで目新しいことはありませんが読んでいただけると幸いです。

作成したコードはGithubからダウンロードしてローカルで実行することができます。

https://github.com/KM5075/BlazorCalculatorApp

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783169/f4ae99ae-8f75-13b4-eeaf-59928df84dc3.png)

## ポイント

こちらのアプリのポイントとしてはbUnitを用いて単体テストを実装したことです。
実装してあるのは加算のパターンのみですが、仮にロジックに手を入れたとしても既存箇所への影響を簡単に確認することができます。

## おわりに

簡単なアプリですがBlazorを使用して電卓アプリを作成することができました。
(ひとまず単純なケースしか動作を確認していないのでバグっていそうな気がしますが。。。)

画面上で表示する値を直接変更できるなど魅力がたくさんあると感じました。
練習がてらいろいろなアプリを作成して、習得していきたいです。
Laravel SailでphpMyAdminを使えるようにしてみた

:::note info
前提
+ Laravel Version11 with Sail
+ Docker for Windows Desktop
+ WSL2 + Ubuntu
:::

## 概要
Laravelのドキュメントに書かれているそのままの方法で開発環境を立ち上げてもphpMyAdminが使えず、MySQL Workbenchとか使ってみたけど、使い慣れたphpMyAdminを使えるようにしてみた。

### 参考
1. [【PHP】Docker環境にphpMyadminを導入する](https://qiita.com/Yuya2218/items/bf20efa6977cf0fbe89f)
1. [phpmyadmin - Official Image | Docker Hub](https://hub.docker.com/_/phpmyadmin?tab=description)



## 参考1.の方法で試して見た
docker-compose.ymlに以下の内容を追加してみました。

```shell:docker-compose.yml（一部抜粋）
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - db
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS=db
      - PMA_USER=db_user
      - PMA_PASSWORD=db_password
    ports:
      - "8080:80"
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions
```
だけど、db名やホスト名やアカウント、パスワードは変える必要がありそうだったので
```shell:docker-compose.yml（一部抜粋）
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - mysql
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS=mysql
      - PMA_USER=sail
      - PMA_PASSWORD=password
    ports:
      - "8080:80"
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions
```
としてみて
```shell:コマンド
./vendor/bin/sail up --build
```
立上げ直してみたけど、phpMyAdminの画面を開くと接続エラーになった。

で、参考2.に書かれていた内容を張り付けてみた。
```shell:docker-compose.yml（一部抜粋）
  phpmyadmin:
    image: phpmyadmin
    restart: always
    ports:
      - 8080:80
    environment:
      - PMA_ARBITRARY=1
```
で、再度sailを起動しなおして
```shell:コマンド
./vendor/bin/sail up --build
```
phpMyAdminの画面を開いてパスワードなどを入力してみるが駄目だった。

なので、先ずは、Dockerの画面でMySQLのコンソールからMySQLにログインしてみた。
```shell:MySQLコンソールでの実行コマンド
mysql -h mysql -P 3306 -u sail -p
```
パスワードを入力し、問題なく接続できた。

そこで気づいたのが、MySQLなどはSailの環境下で動いているということ。
なので、
```shell:docker-compose.yml（一部抜粋）
    phpmyadmin:
      image: phpmyadmin
      restart: always
      ports:
        - 8080:80
      environment:
        - PMA_ARBITRARY=1
      networks:
        - sail
```
として
```shell:コマンド
./vendor/bin/sail up --build
```
sailを再起動して、再度phpMyAdminの画面を開きホスト名やID/Passを入力してみたところ接続できた。
これだと、毎回ID/Passなど入れる手間があるので、
```shell:docker-compose.yml（一部抜粋）
    phpmyadmin:
      image: phpmyadmin
      restart: always
      ports:
        - 8080:80
      environment:
        - PMA_ARBITRARY=1
        - PMA_HOSTS=mysql
        - PMA_USER=sail
        - PMA_PASSWORD=password
      networks:
        - sail
```
とした。

で、参考1.の方法についても
```shell:docker-compose.yml（一部抜粋）
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - mysql
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS=mysql
      - PMA_USER=sail
      - PMA_PASSWORD=password
    ports:
      - "8080:80"
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions
    networks:
      - sail
```
で、接続できた。

Sailで動かしているなら、これが必要でした。
```shell:docker-compose.yml（一部抜粋）
    networks:
      - sail
```
【O'Reilly】実践 Selenium WebDriverを読んで

# 始めに

前の記事と同じく個人的な都合で自動テストに詳しくならないといけないので今回はSeleniumの本を読んでみました。

https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5-Selenium-WebDriver-Satya-Avasarala/dp/4873116953/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=37P91S19EZ6Z0&dib=eyJ2IjoiMSJ9.T7453pEbh63qvbQV2fHeJM50-H0yvoaLz439Y9ZOxb34p-qe3DY9Vjh0zDWviIC0Y5p91aiGvkwpx0VfYPWij3DZ4DCdyewcbzFRajIZTuqjUwWFt9IaXgmw2-A9rjwdhKYYmh_abkbJiENSXL5DX8B6uHz7OZAwMGFOA0l8dFPfOaqhYu_jwpdnP__MIacWrqywB7KgQXO-2Wgj-M2uLid1qb1wliuIVKQblDB3uuVgvbL8nCloZwTXQJTFglwypOVxfHny51vM22kwTZGzsq4Aig3syNKwk8F2qzxhbLc.dNRyo5SMoSnNyOHQAyT8VIQT8m1DdFbA8ZPEwjrNzBc&dib_tag=se&keywords=selenium+%E6%9C%AC&qid=1728124384&sprefix=selenium+%E6%9C%AC%2Caps%2C155&sr=8-5

# **簡単にこの本ってどんなものなの？**

JavaでSeleniumの基礎からCIや運用を絡めた応用までを解説しています。

また付録でPythonによるSeleniumの構築方法も解説しています。

しかし内容が2014年なので、Seleniumのバージョンや現代の考え方とは大きく違います。

# **どんな人が読むべきだと思う？**

以下の人が読むべきだと思います。

- 2010年代のレガシー環境を知りたい方
- JavaでSeleniumを学びたい方
- バージョン2系のSeleniumを知りたい人
- RemoteWebDriverを知りたい人
- 現代と過去の差分をする力があって、Seleniumを勉強したい人
- JenkinsとSeleniumの連携を知りたい人

逆に読まなくていい人はこんな感じです。

- Seleniumの公式ドキュメントが読める人(むしろ公式ドキュメントを読んだ方がいい…)
- Java以外の言語でSeleniumを勉強したい人
- 最新バージョンのSeleniumを勉強したい人
- 仕事などの技術選定でPlaywrightなどSelenium以外の選択肢がある人

# **本の内容について詳細解説**

## **1章**

Seleniumの基本的な使い方を解説しています。

特に高度な使い方をしなければここで本編9割終了します……

## 2章

Actionクラスなどの応用的なAPIの解説しています。

しかし現Seleniumのバージョンでは消えている機能もありす

## 3章

Web Driverの機能解説しています。

ブラウザのCookieやセッションなどをSeleniumで操作する方法について解説されています。

## 4章

以下ブラウザのDriver解説しています。

- Fire Fox
- IE
- Chrome
- Safari

## 5章

WebDriverのライフサイクルを解説しています。

大規模設計する時に役に立ちそうです

## 6章

SeleniumによるファイルのI/O操作を解説しています。

ぶっちゃけファイルのI/O操作言語であれば既存機能使えばいいかなと思います….

## 7章

Seleniumをリモート環境で実行できるようにする機能について解説しています。

## 8章

Selenium Gridについての解説です。

## 9章

PageObjectパターンの解説です。

ぶっちゃけ処理を汎用関数に分けるだけです。

## 10章

Appniumの解説です。

## 付録A

各種CIツールにSeleniumを動かす方法について解説しています。

解説対象のCIツールはJenkinsとSauceLabsです。

2014年の本なので時代が分かります…

## 付録B

SeleniumをPythonで動かす方法を解説しています。
Oracle VM VirtualBox上で箱庭を動かしてみる

## はじめに
普段、Linuxを仕事で使用していてLinuxの操作にはある程度慣れているものの、自宅の環境はWindowsマシンしかないので、ちょっとした調べものなどのためにOracle VM VirtualBoxでゲストOSをUbuntu22.04を使ってLinux環境を構築しています。
今回は、Ubuntu22.04 on VirtualBox上で箱庭を動かしてみようと思い、試行錯誤した結果を残しておきます。

## 環境
ホストOS：Windows 10 Home Edition 
プロセッサ：Intel(R) Core(TM) i3-7100U CPU 2.40GHz
メモリ：4.00 GB
ゲストOS：Oracle VM VirtualBox + Ubuntu 22.04 LTE

## Unityのインストール
まずは箱庭上でDroneシミュレータを動かしてみたいと思ったので、以下のページを参考にUnityをインストールしました。基本的には以下の手順通りに進めればOKです。
https://docs.unity3d.com/hub/manual/InstallHub.html?_ga=2.195680107.639920199.1676446634-1175729548.1657247594#install-hub-linux

## PX4を使ったドローンシミュレーション環境のインストール
次にドローンシミュレーション環境のインストールを行います。参考にしたページは以下になります。
https://github.com/toppers/hakoniwa-px4sim

この手順通りに従ってインストール作業を進めていたところ、トラブル発生。。。
もともと20GBでHDDを作成していたため、HDD容量が足りなくなってしまいました。。。

以下のページを参考にHDDの容量を拡張しました。
https://qiita.com/kalafinalice/items/77947e99bb21330065b4

とりあえず、20GB→40GBに変更しました。これでも少ないような気がしますが。。。
```>"VBoxManage.exe" modifyhd Ubu22.vdi --resize 40960```

この拡張により無事、PX4を使ったドローンシミュレーション環境をインストールできました！

## Unityを使ったドローンシミュレータのインストール
Unityを使ったドローンシミュレータのインストールを行います。参考にしたページは以下になります。
https://github.com/toppers/hakoniwa-unity-drone-model

## ドローンシミュレータを起動してみる
ターミナルを3つ開く必要がありそうです。

■ターミナルA
```$ cd hakoniwa-px4sim/px4/PX4-Autopilot```
```$ bash ../sim/simstart.bash```

■ターミナルB
```$ cd hakoniwa-px4sim/hakoniwa```
```$ bash run.bash```

まず上記のように、二つのターミナルでコマンドを入力します。
そうすると以下のようなエラーがターミナルAに出続けます。これは出続けても問題ないです。
ERROR [simulator_mavlink] poll timeout 0, 111

次に別のターミナル（ターミナルC）に以下のコマンドを入力します。
■ターミナルC
```$ cd hakoniwa-unity-drone-model```
```$ bash ./plugin/activate_app.bash DroneAppLinux```

![Virtualbox_drone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/1b07c533-ce73-cc5d-3373-5101209d11aa.png)

無事に起動できました！ここで左上のSTARTボタンを押下します。
ですが、この環境ではボタンが押せない。。。

topのコマンドを見てみると
![Virtualbox_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/b5e799cb-4ccf-0042-2f95-999b682def4a.png)
のようにCPUがほぼ100%になっていますね。
そもそもホストOSのスペックが低いのと、さらに仮想環境で負荷の高いシミュレータを動かそうとしているので当然ですね。
シミュレータを動かすときはもっとスペックの高いPCを使うことをおススメします。
termux + qemuで非rootのAndroidにDebianをインストールする


## 準備
適当なVNCviewerとtermux(F-droid版)をあらかじめインストールしておく。
## パッケージのアップデート
起動後パッケージをアップデートします
```
pkg update
pkg upgrade
```

## 必要なパッケージのインストール
qemuとか必要なパッケージをインストール
```
pkg install wget x11-repo
pkg install qemu-utils qemu-system-x86-64-headless
```

## termuxの設定
termuxが途中で落ちないように設定
```
termux-wake-lock
```

## ISOのダウンロード
今回は非力な端末でも動くようDebianを使います。Androidは基本ARMですが、**必ずx86_64用のISOを選びます**
```
mkdir debian
cd debian
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.7.0-amd64-netinst.iso
```

## qemuディスクの作成
とりあえず16GBにしましたが環境に合わせて。
```
qemu-img create -f qcow2 debian.qcow2 16g
```

## ISOを起動
メモリは2048MBにしました。こちらも環境に合わせて
```
qemu-system-x86_64 -m 2048 -boot order=d -cdrom debian-12.7.0-amd64-netinst.iso debian.qcow2
```
するとこんな感じのが出ると思います。
```
VNC server running on 127.0.0.1:5900
```
適当なVNC viewerで接続してください。

:::note warn
注意
デバイスによっては起動が遅くVNCを接続してもしばらく何も表示されない場合があります。
:::

## 結論
環境のせいかもだが遅い。実用に耐えない。
Limboとか使った方が幸せになれる。
qemuをx86_64からarmにしたら早くなるかもしれない(使えるOSは減るが)
人に伝わる説明をするには

# はじめに

これまで、質問に対して回答したときに「何を言っているのかわからない」と言われたことが何度かあります。
そんな自分を変えたい！と思い、今井むつみさんの「「何回説明しても伝わらない」はなぜ起こるのか？」という本を読んだので、重要だなって思ったところをまとめていきます。

https://bookplus.nikkei.com/atcl/catalog/24/04/22/01363/

# まとめ

## 第1章

第1章では、何回も説明したら伝えることができるのか？という問題提起を行っている。

人の中にはそれぞれのスキーマが存在する。
スキーマとは、生まれ育ち、経験、知識などから作られるフィルターのようなものである。

人はこのスキーマを通じて、外からの情報を自分の中に取り入れるため、同じ説明であっても受け取り方は人によって異なってしまう。

例として、「猫」という言葉を聞いた時、ある人は錆柄の野良猫、ある人は真っ白な飼い猫、ある人はトムとジェリーのトム、といったようにそれぞれ想像するものが違う。みたいなこと。

## 第2勝

第2章では、説明が伝わらない原因を解説していた。

人間には様々なバイアスが存在するため、人によって認知が異なる。
そのためAさんにとっては正しいことでも、Bさんにとっては間違っているといったことも引き起こされる。

また、人間は忘れやすい＋記憶が曖昧になってしまうということもあり、以前話した内容を参照するような説明であっても、人によって認識が異なる可能性がある。

## 第3章

第3章では、どのように説明したら人に伝えることができるのか解説していた。

相手の立場や知識などのスキーマ（前提知識のようなもの？）を考えて説明することで、相手に伝えることができる。

それに加えて、説明を伝えるテクニックとして具体と抽象を行き来して説明し、いま自分がどっちの説明をしているのかを伝えることが大事である。

また、伝えるではなく、同意が欲しい場合は、「なぜ必要か？」「なぜやるのか？」など理由を伝えることによって感情を動かすことで、同意の可能性が上がる。

## 第4章

第4章では、説明が上手な人が何をやっているのかということを説明していた。

達人から学ぶとき、表面的な形だけ学ぶのではなく、どう捉えて、何を気を付けて、どう振舞っているかを知ることが大事である。
（これはコミュニケーションとか関係なく）

# おわりに

簡単にいうと、説明をする相手のことを考えて説明しましょう。ってことを言ってた。
知識、立場、バイアスがあることを意識しようって感じ。

今回この本を読んだ中で一番大事だと思ったことは、本筋ではないが、第4章のまとめで書いたことである。
これは人から何かを学ぶうえで、とても大事な考え方だと感じた。
Raspberry Pi AI Cameraを５以外のモデルで動かす

## はじめに
2024年9月30日に発売開始となった、Raspberry Pi AI Cameraを早速入手しましたので、動かしてみました。
日本では、スイッチサイエンスに少し入荷したのを確認しましたが、すぐに売り切れとなったようです。

[公式ガイド](https://www.raspberrypi.com/documentation/accessories/ai-camera.htm)のGetting Startedには、Raspberry Pi 4 Model B または、Raspberry Pi 5 向けと書いてありますが、**少し変更** すれば、Raspberry Pi Zero 2 W や Raspberry Pi 3 Model B+ などでも使えると書かれています。
残念なことに、どこをどう変更すれば良いかまでは書いてありませんでした。

私は、Raspberry Pi Zero 2 Wで動かすことができましたのでTipsとして共有いたします。

## 実際のポイント

基本的に、[公式ガイド](https://www.raspberrypi.com/documentation/accessories/ai-camera.htm)のGetting Startedに沿って作業を進めていけば良いですが/boot/firmaware/config.txtを下記のように編集することで動くようになりました。imx500のFirmwareをインストールした後に、直すのがスムースかと思います。（動かないことを確認した後でも良い）

### /boot/firmaware/config.txtの変更
1. カメラを自動認識させる、下記の行をコメントアウト
    #camera_auto_detect=1 
2. imx500を[all]セクションで定義
    dtoverlay=imx500

どうやらこの二つが公式ガイドでほのめかされていた少しの修正のようです。

Raspberry Pi 5も一緒に買っていたのですが、電源の手配を怠り、先にzero 2 Wをセットアップすることにしたのですが、カメラが悪いのか設定が悪いのか切り分けができず結構な時間を費やしてしまいました。

当然のことながら、Raspberry Pi 5では、公式の手順通りですんなりと動かすことができました。カメラ周りの動作はzero 2 Wも５もあまりスピード感は変わりませんでしたが、それ以外の動作は段違いで5が早いので、後処理をいろいろするのであればやはり5が欲しくなると思います。

ご参考になれば幸いです。
Djangoプロジェクトでの画像保存とデータ入力

# はじめに
Djangoプロジェクトで画像アップロード機能を実装する中で、画像保存とデータ入力の両方がうまくいかないという問題に直面しました。特に、画像フィールドが必須であるにもかかわらず保存できないことや、エラーメッセージがテンプレートに表示されない状況が発生しました。また、フォーム送信後に404エラーが表示され、サーバー側での処理を確認する必要があると思いました。
この課題に取り組む中で、以下の重要なポイント3点を考えました。



## 1.フォームのバリデーション設定の確認:
画像フィールドが必須であるが、フォームクラスで正しく設定されているか確認しました。required=Trueが設定されており、バリデーション自体には問題がないことを確認しました。

```django:movies/forms.py
from django import forms
from .models import YourModel

class YourForm(forms.ModelForm):
    class Meta:
        model = YourModel
        fields = ['image']  # 画像フィールド
        widgets = {
            'image': forms.ClearableFileInput(attrs={'required': 'True'}),
        }
```


この設定では、required=Trueが設定されているため、画像が必須であるはずです。
しかし、実際にフォームを送信してみると、画像フィールドが空の状態でもエラーが表示されないことに気付きました。この時、最初は別のフィールドが原因かと思い、全体のバリデーションの流れを確認しました。


## 2.ビューでのレスポンス処理の見直し:
次に、views.pyでのフォーム処理を見直しました。最終的に,フォーム送信後にエラーメッセージを表示する代わりにリダイレクトが行われていたことが原因であることが分かりました。
このリダイレクトによってエラーメッセージが表示されず、404エラーが発生していたことに気づき
問題を解決するヒントになりました。

```django:users/views.py
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import login
from django.views import View
from movies.models import UserMovieRecord  # moviesアプリケーションからモデルをインポート

def home(request):
    records = UserMovieRecord.objects.filter(user=request.user)  # ログインしているユーザーのレコードを取得
    return render(request, 'users/home.html', {'records': records})

class SignupView(View):
    def get(self, request):
        form = UserCreationForm()
        return render(request, 'users/signup.html', {'form': form})

    def post(self, request):
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('home')  # 会員登録後のリダイレクト先を指定
        return render(request, 'users/signup.html', {'form': form})

```

## 3. メディアファイルの投稿設定の見直し:
バリデーションエラーは解決しましたが、画像の保存処理がうまくいったにもかかわらず、メディアファイルの投稿ができない問題が残りました。これがなぜ発生しているのかを再度見直すことにしました。 
urls.pyでメディアファイルの設定が不足していることに気付きました。具体的には、プロジェクト全体でメディアファイルを正しく送信するために、以下の設定を追加する必要がありました。

```MovieChallenge/urls.py
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('users/', include(('users.urls', 'users'), namespace='users')), 
    path('movie/', include(('movies.urls'), namespace='movies')),  
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```
アプリケーション間でメディアファイルの設定が必要だと思っていたのですが、実際にはプロジェクト全体で設定することが必要だと気づきました。この経験は勉強になり、今後の開発でも柔軟に考えていこうと思います。

# まとめ

Djangoプロジェクトにおいて、画像アップロード機能を実装する際に、いくつかの課題がありしました。まず、画像フィールドがrequired=Trueと設定されているにもかかわらず、フォーム送信時にエラーが表示されないことが判明しました。この問題を解決するために、views.pyのレスポンス処理を見直すと、エラーメッセージを表示せずにリダイレクトしていたことが原因でした。修正後、エラーが正しく表示されるようになりました。
次に、画像が保存できてもメディアファイルの投稿ができない問題が残りました。urls.pyでメディアファイルの設定を見直した結果、プロジェクト全体間での設定が必要であることに気づきました。この経験を通じて、開発において柔軟な視点を持つ重要性を再確認しました。
要件定義で学んだこと

# はじめに

開発もしたことない新卒webエンジニアが、研修明けから要件定義に放り投げられて学んだことの備忘録。

# 大事だと思ったこと

## 認識の齟齬がないように気を付ける

私が参画した案件はモバイルアプリを作成する案件で、案件内でいくつかのチームに分かれていました。
アプリ側のチーム、管理画面を作るチーム、インフラのチームなどなど...

そのチーム間で認識の齟齬が起こってしまうことが何回かありました。
具体的には、
- 名称が同じだけど指示している対象が違う
- チーム間で仕様が異なる
- 片方のチームでしか把握していない要求が存在する

などです。
またチーム間だけでなく、お客さんとの認識にも齟齬が生まれてしまうこともありました。

### 疑問点を感じたらすぐに聞く（聞ける環境を作る）

当たり前のことかもしれませんが、疑問点を感じたらすぐに聞くことが大事です。
要件定義フェーズでは基本的にネットで調べて解決するようなことがないので、聞くしかありません。
疑問点を放置してしまうと、修正範囲がどんどん広がってしまいとても大変です。

また、疑問点を聞けるするような環境を作ることも大事です。
私の案件では毎日2回30分程チーム内でのミーティング、週4回30分程チーム間でのミーティングがありました。
疑問点や聞きたいことがある場合、これらのミーティングのGoogleカレンダーのメモに議題を追加するというルールになっています。
slackで直接聞くよりも気楽であるため、新参者の自分にとってはとてもありがたかったです。

### チーム間で統一する

チーム間で同じ単語だけど、違う対象を指しているということがありました。
これを解決する方法としては、単語の定義をはっきりと明確化させることが大事です。

案件の用語集のようなものを作ることも一つの手だと思います。

また、チーム間で異なるドキュメントに同じものを重複して記載していることもありました。
ドキュメントをまとめて管理するなど対策する必要があります。

### 議事録を残す

ミーティングでの決定事項やTODOを共有できるように議事録を残す。
以前決まったことを再度話すと時間の無駄となってしまうので、それを防ぐために議事録を作成することが大事です。

社内の議事録は基本的に決定事項やTODOを残すもの、社外（お客さん）との議事録は言ったことの証拠とするもの。
議事録の目的が少し異なるので意識して議事録をとるようにしていました。

## 目的を意識する

作成するドキュメントや、要件の目的が大事です。
これらは手段の一つであり、目的を達成するために作るものであるため、目的から外れたものを作成してしまうと手戻りが発生してしまいます。

### ドキュメントには複数の目的がある場合がある

業務フロー図の作成時、これがお客さんにシステムを理解してもらうために作っているものだと思っていました。
その目的自体は間違っていなかったのですが、それに加えてシナリオテストの設計をする際にインプットとして使うドキュメントでもあるという指摘を頂きました。

全体のドキュメント関連図があればそれを基に、自分が作成しているドキュメントが何に使われるのか意識して作成することが大事だと思います。

### 「何をやりたいか」ではなく「なぜやりたいか」を意識する

これは様々な場所で言われ続けていることだとは思いますが、whyから要件を詰めることが大事だと思います。
提示される要件によっては、具体的に「これがやりたい！」というものがありますが、よくよくなぜやりたいのか理由を聞くと、他の手段で実現するほうがよいということがありました。
システムは悩みや要望を解決するために作ることを忘れちゃいけないなと思いました。

逆に誰かに説明する時も、なぜやりたいかを最初に説明し、それを実現するためにこういう手段をとりたい、という説明をすると聞き手が受け取りやすくなります。

## 要件を絞ることも大事

要件定義のフェーズが進むにつれ、どんどん要件が増え収拾がつかなくなってしまいます。
要件定義の終盤で見積もり立てたら、当初の予算に収まりきらないなんてことも...

フェーズの初期段階では要件を増やしていくことは大事だと思いますが、ある程度期間がたってからは減らしていくような作業も必要なのではないかと思います。

### 運用を意識する

受託開発の場合、運用を行う人物が誰なのか意識することも大切です。
業務を行う頻度や難易度、誰がそれを行うのか考えると、現実問題としてその業務を遂行できないということも考えられます。

そのような業務、要件は思い切って切ってしまう。もし今後必要であるならば追加開発を行うといった考えをすることが大事だと思います。

### 後続に響く

ウォーターフォールで開発を行っている場合、数か月後、数年後の自分が泣くことになります。画面数を増やしてしまったばかりにテスト項目が増えてしまうなど、ちゃんと後のことも考えて計画をすることが大事です。
Podman関係プロセスの文字化け 「vfkitの莉ョウ繝槭す繝り繧オ繝シ繝薙」が解読できたので記録しておく

ある日、Macのアクティビティモニタをなにげなく見るとーーー
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403229/9d85e9ae-d581-76b4-103b-ccb21965405d.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403229/5bbe0a69-1b61-885e-ca1b-993d147031a3.png)

ﾁｬｽﾓﾊｧｰﾜ｣｡
なんじゃこりゃ。しかし見覚えのある化け方をしている。復元できるかもしれない。

文字化けテスター
https://tools.m-bsys.com/dev_tools/char_corruption.php
というサービスを見付けたので、試してみた。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403229/9cd76fc9-be72-6048-3723-a3b4b8c837f0.png)

「仮想マシンサービス」と言いたかったらしい。
『vfkitの仮想マシンサービス』。これが答えだ。
~~誰か暇な人、PodmanプロジェクトにPullReq送っといて~~
コメントで教えてもらいました。Appleのローカライズが原因だそうです。Appleさんなんとかしてください。
AmazonLinuxでERR_CONNECTION_REFUSED解消

# 【事象】
AWSのEC2のAmazonLinuxでインスタンスを作成した。
その後、Apacheインストール・起動とFirewallを起動し
PHPファイルを実行しようとした。
(PHPインストール・PHPファイルは配置済み・PHP実行の設定済み)

PHPファイルの中で```echo```していたため、ブラウザ(Chrome)で表示させようとした。
しかし、ブラウザで以下のエラーが表示された。

```ERR_CONNECTION_REFUSED```

# 【改善策】
①. sshでAmazonLinuxに入り、以下を実行する。
```
$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --reload
```
・参考：https://repost.aws/ja/knowledge-center/ec2-instance-hosting-unresponsive-website

・引用：
```ファイアウォールが実行中の場合は、ポート 80 とポート 443 で接続が許可されるように次のコマンドを実行してファイアウォールを設定します。```

sshでの作業はここまでで終了。

②. AWSにログインする。

③. ```ネットワーク & セキュリティ```の```セキュリティグループ```をクリックする。

④. ```セキュリティグループ名```に```default```の他にもう一つあるので、そのチェックボックスにチェックする。
下に```インバウンドのルールを編集```というボタンが出てくるのでクリックする。

⑤. ```タイプ```の```HTTP```を以下のように変更し、```ルールを保存```をクリックする
・プロトコル：TCP
・ポート範囲：80
・ソース：0.0.0.0/0

# 【結果】
もう一度ブラウザでPHPファイルのURLを確認したところ、表示に成功した。

# 【原因】
・httpを有効にしていなかった。
・⑤のソースが0.0.0.0/0になっていなかったことにより、アクセスが許可(公開)されていなかった。
AMIとスナップショットって何が違うねん！

## 題名の通り
いやほんまに何が違うねんって感じ、ほんまに

## 結論
AMI：サーバ内のデータ＋ミドルウェア＋OS情報
スナップショット：サーバ内のデータ

要はスナップショットはデータだけ、AMIはデータとインストールしたミドルウェアとOSの構成情報（ログ設定、ホスト名など）もセットでコピーする。

以上
Word内の画像サイズを一括で変更してしまおう

# Wordで画像並べてみたけど、、、

**うまく収まらない！
サイズ一括で変更できなくて手間！！！**

なんですよね、、、

例えばWordで論文なり何なり文書を作成しているときに、画像サイズを揃えて並べるじゃないですか。

**そんなときに、画像を一括で処理するVBAがありえん便利なのです。**

ある程度パッケージ化されていた方が~~パクリ~~学びやすいし、アレンジもしやすいと思うので、

今回は**Wordの文書内の画像を一括で指定サイズの正方形にする**スクリプトを紹介しようと思います！！！


* **一括で指定倍率に拡大する**
は今後作成します


# Wordの文書内の画像を一括で指定サイズの正方形にする

なぜ正方形？なぁぜなぁぜ？と思う方いると思います。

**、、、仕事で必要だったからです！！！**

こんな使い道の狭すぎるマクロを書くの、自分だって不本意なんですよ。
ただ、備忘録的に残しておくと何かの役に立つのではないかと思ってます。

今回の要件は、
* もとは長方形の画像
* 縦横の短いほうに合わせて正方形にする
* 縦横の長いほうは中央で切り取る
* サイズを指定する
です

申し訳ないのですが、今回のスクリプトはかなり簡便なので、行内図すべて含みます。画像以外に図形がある場合はそれも対象になります。


# では早速コードです
コピペしてください。

word内での図形設定にあるサイズ(mm)と、バックグラウンド処理で使われるサイズ(point)が違うみたいで、補正してます。


```vb
Sub size_square()
'
' 1 mm = 2.85 ポイント
'
  Dim Image As Object
  Dim size As Double
  
  '画像のサイズを入力
  size = InputBox("size (mm) : ") * 2.85

  For Each Image In ActiveDocument.InlineShapes
    If Image.Type = wdInlineShapePicture Then
      '縦横の大小で場合分け
      If Image.Width = Image.Height Then
      '縦横の長さを揃えるために両端をcropする
      ElseIf Image.Width > Image.Height Then
        With Image.PictureFormat
          .CropLeft = (Image.Width - Image.Height) / 2
          .CropRight = (Image.Width - Image.Height) / 2
        End With
      'こちらも同じく
      Else
        With Image.PictureFormat
          .CropTop = (Image.Height - Image.Width) / 2
          .CropBottom = (Image.Height - Image.Width) / 2
        End With
      End If
      '縦横比を固定
      Image.LockAspectRatio = msoTrue
    'サイズを変更
    Image.Width = size
    End If
 Next Image
End Sub
      
```


今回は私の都合で敢えて正方形にした上でサイズを変更しましたが、そのままの縦横比を固定してサイズを変更したい場合は下のようにすればいいです！！




```vb
Sub size()
'
' 1 mm = 2.85 ポイント
'
  Dim Image As Object
  Dim size As Double
  
  '画像のサイズを入力
  size = InputBox("size (mm) : ") * 2.85

  For Each Image In ActiveDocument.InlineShapes
    '縦横比を固定
    Image.LockAspectRatio = msoTrue
    'サイズを変更
    Image.Width = size
 Next Image
End Sub
      
```


# おわり
簡単でしたね！

次回はサイズはそのままでzoomするスクリプトをご紹介します。
今までMySQLを使っていると思っていたらSQLiteだった話

# 何がおきた？
RDSでMySQLを設定し、EC2にMySQLをインストールし、`.env`に諸々書いたのに認識してくれない。
(定かではないがなぜか`.env.local`に向いている？)

# 原因
本番環境(EC2)で`.env`を作っていなかった！
そもそも`.gitignore`を理解していなかった！（ローカルで`.env`に本番設定を書いていただけだった。）

# 解決
1. SSH接続をし、プロジェクトのディレクトリ内で`cp .env.example .env`を実行
2. `sudo vim .env`で変数を本番用に書き換える（`:wq`で保存してvimを終了）
3. `php artisan key:generate`で新たなキーを生成
4. `sudo chmod -R 777 storage`
    `sudo chmod -R 777 bootstrap/cache`で権利を変更
5. `php artisan config:clear`
    `php artisan cache:clear`でキャッシュクリア

俺の場合これで新たに`.env`の`MySQL`を認識してくれて解決しました。

# 余談
`.gitignore`に追加したファイルは本当に無視されるんですね。
今まで「GitHubには`.env`とか見えないけどきっと裏側ではpushされてるんだろ。んでEC2にpullする時に、隠された`.env`もpullされてるんだろうな」とか考えていました…。
また一つ勉強になりました。

あと正しくRDSのMySQLに接続できたことでTablePlusでも接続できました！ヤッタネ！
ステートレス/ステートフルについて

## ステートレスとは
状態（ステート）の管理をしない（レス）通信のこと。
ここでいう「状態」は大方セッション管理のことだと思っておけばよい。なので、ステートレスというのは、 __アクセスごとにリクエストの中身を記憶しない、ここが独立した通信__ のことを指す。

### 例：HTTPプロトコル
googleのサイトをユーザAが閲覧しブラウザを閉じてから、５分後に再度同じサイトにアクセスしたとしても、サイト側はさっき閲覧したユーザAであることを知らないままウェブサイトのコンテンツを配信する。

## ステートフルとは
状態（ステート）の管理をする（フル）通信のこと。
つまり、 __アクセスごとにリクエストの中身を記憶し、過去の動作をもとに現在の処理を行う通信__ のことを指す。わかりやすいのはセッション管理を行っているプロトコル。

### 例：SSHプロトコル
SSHは言わずもがな、サーバへの通信を実施する際にサーバとアクセス元との間でセッションをはり、ユーザがどこの誰なのかという情報を保持したまま接続する


以上！
童話でわかるプロジェクトマネジメント読んでみた#２

前回投稿↓した記事の続きです。

https://qiita.com/Yuudai746623631/items/13e2a120a86f03e7f6b5

プロジェクトマネジメント学習の一環として、
「童話でわかるプロジェクトマネジメント」を拝読させていただきました。

以下、個人学習メモ#2を共有いたします。

## みんな（プロジェクトメンバー）が分かるようにゴールを設定する
本書ではゴール設定の重要性について、以下のような記載がございます。

>チームで仕事をする場合、
もしゴールや目標が曖昧だと、同じ言葉や内容でも「発言者」や「聞き手」によってとらえ方が違ってしまいます。
みんながバラバラでは、チームとして機能しません。

ど正論です。
自分自身もゴール設定が分からず、やるべきことが分からないこと多くあります。
（メンバー間には知識・経験の差があり、「とはいえ、、」の部分がありますため、
決して文句ではありません。）

みんなが分かるようになっているかどうか、
現在の目標について「SMART」および「5W1H」の観点でチェックしてみましょう。

#### SMARTの法則

- Specific ・・・　具体的でわかりやすい
- Measureable　・・・　達成可能で、数字になっている
- Attainable　・・・　達成可能で、現実的になっている
- Relevant　・・・　プロジェクトでなすべきことや成果になっている
- Timely　・・・　期限明確になっている

#### 5W1H
- When ・・・　いつ
- Where ・・・　どこで
- Who ・・・　誰が
- What ・・・　何を
- Why ・・・　なぜ
- How ・・・　どのように
初めてAlibaba Cloudを触ってみたら簡単過ぎて感動だった

# はじめに

10月2日 Alibaba Cloud 主催のAIハンズオンセッションに参加してきました。

https://lu.ma/k1g1tsaq

参加者はエンジニア問わずAIやCloud技術に関心のある20人ほどでした。
クラスルーム形式で、久しぶりの学校感が懐かしかったです。
ハンズオンの題材は「カスタマーサクセス業務を代行するRAGアプリ構築」というエンジニアでもそうでない方でも親しみやすい非常に良い題材でした。

# Alibaba Cloud Model Studioを動かしてみる

こちらのURLよりModel Studioを起動してみます。

https://bailian.console.alibabacloud.com/

先ずは利用するモデルを選定します。
ここで非常に便利なのが、Playground!!
ひとつの画面で複数のモデルの出力の違いを確認することができます。
言語を変えたり質問の内容や難易度を変えて、どのモデルが最適か確認してみます。
個人的にAlibaba Cloudのコンソール画面が非常に見やすいことに感動しました。
![Screenshot 2024-10-02 at 19.11.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168714/498a8258-7dad-ea85-dfc3-fab520db2d69.png)

# 外部データ更新
一般的にLLMモデルでは事前に学習したデータソース以上の情報を回答することができません。
例えば今回のカスタマーサクセスのお題で言うと、「iPhone16」は最新機種にあたり、学習時点でまだ情報が公開されていないため、回答出来ないという問題があります。
このような時にRAGは有効であり、外部データベースにファイルを格納します。
ステップは非常に簡単です。
1. Data Managementからファイルをアップロードする
1. Data Application > Knowledge Base Indexから検索や分析を可能にするために、ファイルをベクトル形式で保存する

![Screenshot 2024-10-02 at 19.22.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168714/5e623a44-38d4-d188-b593-291d0b68a06b.png)

# RAGアプリを動かしてみよう！
もう完成ですw
早速RAGアプリを使ってみましょう。
基本的にはデフォルトのまま動作確認が可能です。
"Knowledge Retrieval Augmentation"をOnにすることで、先ほどアップロードしたファイルの情報を踏まえた情報を的確に回答することができるようになります。
更に右上の "Publish"ボタンで簡単にRAGアプリを公開することができます。
![Screenshot 2024-10-02 at 19.26.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168714/5152c684-08db-5350-558b-61b914afba5c.png)

# まとめ
物凄く直感的に利用しやすくてびっくりしました。
上記のように簡単にファイルをアップロードして、ベクトルデータベースを管理してくれるのは運用がシンプルです。
社内に眠っている過去のナレッジ資料などを全てデータベースに格納して、社内Wikiなどにするのも非常に良いなと感じました。
一切手順で迷子になることはないですし、本当にRAGもLLMも分からない人が時々つまづいてもいましたが最後までハンズオンをやり切れていたことは非常にすごいことです。

# コミュニティの紹介
今後もAlibaba Cloudやハンズオンの情報などに関心がある方へコミュニティの紹介です。

## AliEaters - Alibaba Cloud Developers Community
かわいいアリクイのキャラクターのコミュニティです。
このコミュニティはAlibaba Cloudを上手に使うためのノウハウの共有を目的にしています。
乾杯🍻で始まり、乾杯🍻で終わるアットホームなコミュニティです。

https://alibabacloud.connpass.com/

## MeltingHack - 東京を拠点とする非営利国際ハッカソンコミュニティ
現在世界中で350人以上が加盟するコミュニティです。
多様なバックグラウンドを持つ人々が、ハッカソンを中心に短期間のプロトタイピングやワークショップを通じて実践的な技術を習得し、アイデアを形にすることを支援しています。

https://lu.ma/meltinghack
朝会のすすめ

## 朝会の密度とプロジェクトの成功率が比例する
これまで数々の開発プロジェクトに参加してきたが、朝会の密度とプロジェクトの成功率が比例する傾向にあることが見えてきたので考察しようと思う。

## 朝会とは
朝会とはその名の通り、毎朝の会議を指し、スクラムガイドの「デイリースクラム」に相当する。

朝会の目的は以下のようなものがある。
- 各自の作業報告
- 作業分担の最適化
- 課題解決

## 朝会のルール
過去の経験から上手くいった時のルールを紹介する。

### チーム全員参加
特別な理由がない限りチームの全員が参加する。
全員が全員分の作業状況を聞いていたらそれだけ時間を要し、一見無駄に思えるが意外とそうでもない事が多い。
逆に考えると、時間の無駄にならないように工夫することが重要

### 批判をしない
心理的安全性を確保するためにとても重要

## まとめ
ここまで朝会の重要性を説明したが、朝会は開発チームのチーム力を上げる効果がある。
チーム力が上がるとプロジェクトの成功率が上がることになるため、私は朝会をおすすめする。
.NET8のBlazorで404ページを作成する方法

## 概要

Blazorで404ページを作成する方法を調べてみた。
記事に書いているが、懸念事項が多く、あまり参考にはならないと思われる。

## プロジェクトの構成

プロジェクトテンプレート：Blazor Web App
フレームワーク：.NET 8.0
Interactive render mode：Auto
Interactivity location：Per page/component

※レンダーモードは「InteractiveServerと未指定（SSR）」のみを想定

## 方法

下記の記事の方法を試したところ成功した

https://qiita.com/gushwell/items/734149b6e672cb1fa8f6

大雑把にまとめると、下記の手順でよい。

①Program.csのapp.UseStaticFiles()の直前に下記を追加
```
app.UseStatusCodePagesWithRedirects("/statuserror/{0}");
```
※app.UseStaticFiles()の直前に書く根拠はわからない。
　「asp.net core ミドルウェア 順序」あたりで調べたらわかるかも。。

②StatusError.razorを追加

```
@page "/statuserror/{Status}"

<h3>エラーが発生しました</h3>

<h3>ステータスコード:@Status</h3>

@code {
    [Parameter]
    public string Status { get; set; }
}
```

## 懸念事項

最大の懸念は404以外のステータスでも、StatusError.razorに遷移してしまうことだと思う。
具体的にどういう状況で、404以外のステータスが発生し、かつ、StatusError.razorに遷移するのか、
既存のエラーハンドリングの挙動が変わることはあるのかが気になる。

404ページを設定した後に、「@rendermode InteractiveServer」の画面でボタンをクリック処理で例外をスローした場合、画面下にMainLayoutの「id="blazor-error-ui"」の内容が表示された。これは問題なさそう。

もう1つの懸念は、SSRの画面でフォームを送信した場合だ。（この方法はログイン画面でのみ使用する）
ソース上はrazorファイル上のメソッドが呼ばれているように見えるが、実際は、Razorファイル上のメソッドに対応するPOSTのAPIが自動作成されている。このメソッドで例外が発生した場合はどうなるのだろうか？
このメソッドがで例外が発生したときにMainLayoutの「id="blazor-error-ui"」の内容が表示されないので、自分のPJでは、このメソッド内はすべてtry-catchで囲っいて、例外発生時にエラー画面に遷移するようにしている。そう考えると問題なさそう。

プロジェクトにAPIを追加して、そのAPIが500とか401とかを返却した場合に困りそうな気はする。そもそも、自分のPJの構成ではAPIを使用しないので、気にしなくてよさそう。

あとは、未承認のときに存在する画面に遷移しようとして、未承認のとき用の画面表示が優先されるのか、StatusError.razorへの遷移が優先されるのかは検証が必要だと思う。

それと、試しに存在しない静的ファイルにアクセスしたら、StatusError.razorが返却された。まあ、それはそうだ。そしてHTTPステータスコードは302（リダイレクト）になっていた。まあ、困りはしないかな。。調査の時に302になってるのを見て、あ、これは存在しないページ（ファイル）にアクセスしようとして、リダイレクトされたんだなって気が付きにくいのが懸念ではあるかも？

ほかにも見落としがいくらでもありそう。

そして、ここまでの内容で、周りを納得させることができるだろうか。。

## 参考

https://qiita.com/gushwell/items/734149b6e672cb1fa8f6

https://github.com/dotnet/aspnetcore/issues/48983
【AtCorder】 初心者必見　RE (runtime error) の対処法 Python

**Python**って最近の大学、特に理系の学部では低学年次のうちから教養課程として学ぶことが増えてきています。　筆者も１年生に授業がありました（必修で二コマも．．．）
これを機にプログラミングに興味を持ち、**AtCorder**を始めました。
この記事は~~pythonの初心者~~、AtCorderの初心者向けです。

先日、AtCorderの問題[ABC204-C](https://atcoder.jp/contests/abc204/tasks/abc204_c "ABC204 C問題 Tour")を深さ優先探索の[解説記事](https://qiita.com/myumura/items/141dafed1f34b03413f9 "Pythonで深さ優先探索（DFS）をとっても簡単に説明してみる")を見ながらコードを書いていました。
背景理論を学ぶ→コードを学ぶ→コードを書く→入力例でOK→提出→**RE**

![{0320B886-FD75-4014-9A96-5D8C5BF9C3AC}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559768/148be472-ee62-265c-a15a-a1d64bda81a8.png)
RE！？　なんだよそれ！！　しかも33個は通っている。

ということでPythonにおける **RE**（**runtime error**）について対処法を書きます。

# RE
:::note warn
Pythonに用意されている[**RuntimeError**(組み込み例外)](https://docs.python.org/ja/3.14/library/exceptions.html)とは違います。
:::
**RE**とは **runtime error**(実行時エラー) の略称のことで、プログラムを実行した際に生じるエラー全般を指します。
## エラーの原因
結論のみを言うと**再帰関数の実行回数の上限**である1000回を超えたためでした。

### 解決策
```python
import sys
# 再起回数の上限を3000にする
sys.setrecursionlimit(3000)
```
[問題](https://atcoder.jp/contests/abc204/tasks/abc204_c "ABC204 C問題 Tour")では最大2000回再帰処理を行うとありました。
pythonのデフォルトの再帰関数の実行回数は1000回でした。これのせいで通らなかったんですね。

### RecursionError(再帰処理エラー)
再帰処理回数の上限を超えると
「<font color="red">RecursionError</font>: maximum recursion depth exceeded」というエラーが吐かれます。
そしてこのエラーは再帰処理以外でも起こる可能性があります。
``` elif ```を極端に多く使った場合
```python
if a_1:
elif a_2:
   .
   .
   .
elif a_1000:
   .
   .
   .
else:
```
カッコを極端に多用した場合
```python
((((......(a)+1)+1)+1)......)
```
どのような仕組みかはわかりませんが、このようなコードを書くことはないので一安心でしょう。
`for`文や`while`文の繰り返し処理については上限がないので心配しなくていいですね。

# まとめ
* **再帰処理回数の上限**はデフォルトで1000回
* 上限を設定するには[コード](#解決策)を貼る
* 再帰処理以外でもRecursionErrorは起こる
【ExcelVBA】シート名を変更するVBAソースコード

# はじめに
シート名を変更するVBAソースコードを調べ、実装、テストしました

## ソースコード
ソースコードは以下の通りです。

```
Sub rename_test()
    Dim sheet_name As String
    sheet_name = Worksheets(2).Name
    If sheet_name = "test1" Then
        sheet_name = "名簿"
        Worksheets(2).Name = sheet_name
    End If
End Sub

```

# 最後に
意外と簡単でした
AndroidエンジニアのためのXcodeショートカット

# はじめに
今回は、AndroidStudioでよく使うショートカットのXCode版を紹介していきます
### 本文

読み出し先検索
---
AndroidStudioでは、関数などの実行箇所や実装箇所を探すのにはcmd+clickですが、XCodeではcmd+Clickが使えるのは関数などの実装箇所のみで実際に呼び出している場所を探すのには該当関数を選択した状態でctr+cmd+shift+hを押す必要があります。
押しづらい上に覚えにくいので、SideBarにある虫眼鏡アイコンからCall Hierarchyで検索する方も多いみたいです。

File検索
---
AndroidStudioではShift2回押しでファイルを検索できますが、XCodeではshift+cmd+oでプロジェクト内のファイル検索ができます

コード整形
---
AndroidStudioではcmd+opt+Lでファイル内のコードを整形できますが、XCodeではctr+Iで整形することができます
### 最後に
備忘録としての役割が非常に強いですが、どなたかのお役に立てれば幸いです
AndroidStudioで意外と知られてないショートカットを紹介する記事も書いていますので、興味のある方はぜひ
https://qiita.com/ryuji_sato/items/45b291238a85ca09e1db
Spring Securityについて理解する①（DelegatingFilterProxy、FilterChainProxy、SecurityFilterChain）

## セキュリティーフィルターの流れ
以下のフィルターチェーンの流れがSpring Securityの基本的な認証・認可処理のベースとなっている。
またこの「フィルターチェーンを通じて、セキュリティチェックが順番に実行され、最終的にリクエストがサーブレットに届く流れ」を`ダウンストリーム`という。

①クライアントからリクエストが送られてくる
②フィルターチェーン（Filter0,Filter1,Filter2）を通る
③サーブレット（Javaアプリケーション）に到達
④サーブレットがレスポンスを作成し、クライアントに返却
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790294/df6424dd-e0c0-816a-fd3e-555273fa0462.png)
>[Architecture](https://docs.spring.io/spring-security/reference/servlet/architecture.html)


## DelegatingFilterProxy、FilterChainProxy、SecurityFilterChain

### DelegatingFilterProxy
- `Tomcatなどのサーブレットコンテナのフィルターチェーン`と`SpringのApplicationContext内のフィルターチェーン`を橋渡しする役割を持ち、サーブレットコンテナが受け取ったリクエストをSpringのセキュリティフィルターに委譲する
- Springの`Bean`として定義されたフィルターをサーブレットコンテナから動的に呼び出すための代理人のようなもの
- サーブレットコンテナに依存しない形で、セキュリティのフィルターの設定や管理をSpringの中で柔軟に行うことができるため、DIによる依存性注入が可能となる
- つまり以下の図でいう`Bean Filter0`が実際のセキュリティチェックやその他の処理を行う

※Spring開発では、アプリケーション内で使うオブジェクト（サービスクラスやDAOなど）を手動で作るのではなく、Springが自動的に作ってくれる仕組みがあり、その`自動的に作られたオブジェクト`を`Bean`と呼ぶ。

>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790294/6340f199-d56a-8307-ef00-fe618ec110f9.png)
>[Architecture](https://docs.spring.io/spring-security/reference/servlet/architecture.html)

#### Bean Filter
Springでは、フィルターも含めて、必要なオブジェクト（サービスクラスやDAOなど）はすべて`ApplicationContext`、によって管理され、その管理されたオブジェクトを`Bean`と呼ぶ。

※ApplicationContextとはSpringフレームワークが提供する依存性注入（DI）の仕組みを管理するコンテナです。
Springでは、アプリケーションの各コンポーネント（サービス、リポジトリ、フィルターなど）をBeanとして定義し、それらの依存関係などを管理できる。

### FilterChainProxy
- 下記で説明する`SecurityFilterChain`内に含まれるセキュリティ関連のフィルター（認証フィルター、認可フィルター、CSRFフィルターなど）を順番に管理し、リクエストに対して適切なセキュリティ処理を実行する管理人のような役割
- 上記で出てきた`DelegatingFilterProxy`から処理を任される
- 下図がSpring Securityでよく使われる一般的なパターン

>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790294/9a23f12e-f73c-2bdd-67e8-95fff348f7c4.png)
>[Architecture](https://docs.spring.io/spring-security/reference/servlet/architecture.html)


### SecurityFilterChain
- セキュリティフィルター（認証フィルター、認可フィルター、CSRFフィルターなど）のグループのようなもの
- 上記で出てきた`Bean Filter`の集まりのようなもの

## 参考
以下のSpring Securityの公式ドキュメントを参考にしました。
[Architecture](https://docs.spring.io/spring-security/reference/servlet/architecture.html)
013 AI屋さんの　LLMとfletとdockerとcloud runと私


AI屋さんの　LLMとfletとdockerとcloud runと私


LLMに２００万トークン全文入力　追加学習ずみの専門分野特化のLLMの作り方

今回はwebアプリの部分を　flet に置き換えです。
flet は　flutter(≒google)　由来の　次世代技術のwebアプリで、
flutterは、HTML,CSS,各種言語　の次世代　代替品です。



完成イメージ図


![スクリーンショット 2024-10-05 11.15.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/6e2a51f7-c0be-92ae-4635-e8b458402ce2.png)


flet で見た目もweb屋さんの市販品相当を実現可能ですので、
例えば、コンシューマーアプリを作るならば、
全文入力追加学習済みLLMと組み合わせて

　１、居酒屋のメニュー全部入れて、「AIオススメ　大宴会　居酒屋システム」や
　２、観光地とレストラン情報を全部入れて、「AIコンシェルジュ　デートプランナー」や
　３、百貨店の外商顧客向け、「AI黒執事　オートクチュール特別注文部」等
 
全てのお客様の全てのご要望に即時回答します。
ここまでくるとマネーの匂いがしてきそうな気がします。
誰でも（？）簡単に作れます。



https://flet.dev

https://flutter.dev

flet は　flutter(≒google)　由来の　次世代技術のwebアプリで　なおかつ、
pythonのみ（Dartなし）で開発可能、
ブラウザ以外の　スマホ、タブレット、パソコン　などのネイティブアプリもいけます。



概要
大規模言語モデルのwebアプリを クラウドのサーバーレスでデプロイする
最小構成の資料です。
　 gemini
　 flet（今回ここ）
　 docker
　 cloud run
だけで作れちゃいます。
雛形で一度デプロイできれば、あとは簡単です。

既知の組み合わせで構成されています。
応用は自由自在です。



https://flet-ghc4uieygq-an.a.run.app


https://
flet-ghc4uieygq-an.a.run.app



パソコン向けローカルアプリの図


![スクリーンショット 2024-10-05 8.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/37d8a1a3-b3b9-b6d9-2a4f-a0f7383b5bc6.png)





実際の開発は、flet　起因の記載のみで
文字列入力の文字列出力の　薄皮一枚、薄っぺらのwebアプリです。
２００万トークン全文入力、追加学習済み大規模言語モデルは、
第一回で作成した　webAPIを利用しています。
全ての開発済みアプリは、API経由で叩いています。
中身は、どれで作っても一緒です。

それ以外は、従来通りです。

docker 関連

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

さらに、前回　dockerHUB　からのデプロイも実行できていますので
クラウドのサーバーレスも、そこのイメージを　run　しますので、
コマンド　gcloud　無しでデプロイできます。
webのボタンをポチポチだけで　cloud run　を設定できます。

docker run -d -p 8080:8080 bono0/st

イメージを　プッシュ・プル　出来れば　勝ったも同然です。




目次

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



今回も無事に　fletにて
　AI屋さんの　LLMとfletとdockerとcloud runと私
　LLMに２００万トークン全文入力　追加学習ずみの専門分野特化のLLMの作り方
デプロイ完成です。　おめでとうございます。




ー続くー
Ubuntu 24.04 に valkey をインストール（OS標準）

# はじめに

Ubuntu24.04にvalkeyを標準インストール

## サポート

universe

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.1 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo

# apt update; apt install -y valkey-server
... 略
```

### 各種確認

```shell-session
# apt info valkey-server
Package: valkey-server
Version: 7.2.5+dfsg1-2ubuntu4~24.04.1
Priority: optional
Section: universe/database
Source: valkey
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Lucas Kanashiro <kanashiro@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 172 kB
Provides: valkey
Pre-Depends: init-system-helpers (>= 1.54~)
Depends: valkey-tools (= 7.2.5+dfsg1-2ubuntu4~24.04.1)
Homepage: https://valkey.io
Download-Size: 49.2 kB
APT-Manual-Installed: yes
APT-Sources: http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages
Description: Persistent key-value database with network interface
```
童話でわかるプロジェクトマネジメント読んでみた#1

プロジェクトマネジメント学習の一環として、
「童話でわかるプロジェクトマネジメント」を拝読させていただきました。

本書を読んでみて、
日頃の業務は忙しく、ついつい場当たり的な対応をしてしまいますが、
全体像をつかんで仕事に取り組む重要性を感じております。

童話ベースでの書籍ということもあり、
初心者向けの内容になっておりますが、童話とPMが上手く紐づけられており、
単純な読み物としても手に取ってみる価値はあると思います！

以下、個人学習メモ#1を共有いたします。

## 日常業務（繰り返し業務）とプロジェクトは違う
そもそもプロジェクトとはなにか。

> プロジェクトとは、今までやったことがない、特別な仕事です。（独自性・新規性）
普段やっている仕事を繰り返す「ルーチンワーク」ではありません。

【日常業務】
すでに実績のある作業であり、下記のようなフローで対応する。

　ー　作業計画⇛実行⇛評価⇛改善　（PDCA）

【プロジェクト】
これまでに実績がなく、目標や実施内容を事前に検討して行う作業。
下記のようなフローで対応する。

　ー　立ち上げ⇛作業計画⇛実行⇛終結

 　※　プロジェクト進行に伴い、立ち上げ・計画には適宜修正が入る。

## プロジェクト立ち上げのポイント
日常業務とプロジェクトの一番の違いは、やはり「立ち上げ」の部分かと思います。
「立ち上げ」では、実績がなく詳細不明のプロジェクトの目標や取り組み内容を検討し、周囲と合意する必要があります。以下、「立ち上げ」の検討観点になります。

 - プロジェクトの目的（なんのためにするか）
 - ゴール（何をもって成功とするか）
 - 最優先事項（スケジュールか、コストか、品質か）
 - プロジェクト体制（どんな人材・組織編成か）
 - プロジェクト進捗記録・管理方法
 
少々ざっくりとしていますが、
実際に「立ち上げ」を主導する場合には他案件の過去資料等が参考になるかもしれません。

## プロジェクト計画中のマネジメントポイント
「立ち上げ」が完了したら、下記観点に漏れがないようプロジェクトを計画していきます。

- プロジェクト全体管理
- スコープ
- スケジュール
- コスト
- 品質
- 資源
- コミュニケーション
- リスク洗い出しとその対策
- 調達
- ステークホルダー

:::note info
上記はPMBOK(第6版以前）における、
プロジェクトマネジメントに関する知識エリア分類
:::
Linux AWKによる文字列加工

標準入力、または、引数で指定されたファイルを読み込み、パターンにマッチした行に対してアクションを実行します。
1. 基本構文
awk 'pattern { action }' input_file

AWK標準入力、または、引数で指定されたファイルを読み込み、パターンにマッチした行に対してアクションを実行します。

2.前処理/後処理付きのテキスト処理
awk 'BEGIN { ... } pattern { action } END { ... }' input_file

awk 'BEGIN {テキストを読む前に行う処理} /pattern/ {テキスト１行に対して行う処理} END {テキストを読み終わった後に行う処理}' <filename>

BEGINブロックのみとENDブロックは任意ブロックであるため、省略可能、いずれかのみ使うことも可能。

3.特殊変数($0, 1 ...n)

  $0:　その行の全内容
 
  $1:  1つ目のフィールド（デフォルトの区切り文字はスペース）
  
  $2:  2つ目のフィールド
  
4.pattern
pattern を省略するとすべての行に対して action を行います。actionを省略するとprint $0の内容をプリントする。

patternの形は普通の条件式と正規表現の2種類があります。正規表現の場合は「//」で囲む。
正規表現を使う場合のオペレーター：
  ~  : あるパターンにマッチする
  !~ : あるパターンにマッチしない

5.使用例：
cat hoge.txt | awk '$1 ~ /^ab/ {print $2}'
意味：hoge.txtの全行に対して、1フィールド目の頭がabの行のみ2桁目をプリントする

cat hoge.txt | awk '$1 !~ /^ab/ {print $2}'
意味：hoge.txtの全行に対して、1フィールド目の頭がabでない行のみ2桁目をプリントする

cat hoge.txt | awk '$1 == "ab" {print $2}'
意味：hoge.txtの全行に対して、1フィールド目がabの行のみ2桁目をプリントする

cat hoge.txt | awk -f 1.awk
意味：awkのコードを記述したファイルを利用して、hoge.txtに対して文字列加工を行う。

cat hoge.txt | awk 'BEGIN { print "Hello World"} {print $2}'
意味：一行目を読み込む前にHello Worldを出力してから、全行に対して2つ目のフィールドを出力する。

cat hoge.txt | awk '{print $2}　END { print "Thank you"}'
意味：全行に対して2つ目のフィールドを出力してから、Thank youを出力する。
【生成AI入門　LangChain×OpenAI API】レスポンスをストリーミングで表示することでUX向上

OpenAI APIのレスポンスをストリーミングで受信し、ログ出力するコードです。
[前回の記事](https://qiita.com/Ogaga/items/d9ecf1696ed4100e89e0)のコードを改良しています。

# コード全体
``` python
import os
import env
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI



# OpenAIのAPIキーを設定
os.environ["OPENAI_API_KEY"] = env.OPENAI_API_KEY

# OpenAIのインスタンスを作成
model = ChatOpenAI(model="gpt-4o-mini", max_tokens=50)


messages = [
    SystemMessage(content="日本語でチャットをしてください。ハルシネーションを起こさないで。"),
]


# チャットの実行
print("Chat with GPT-4o-mini. Type 'exit' to end the conversation.")
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        break
    if not user_input:
        print("メッセージを入力して下さい。")
        continue
    messages.append(HumanMessage(content=user_input))
    chunks = []
    print("AI: ",end="")
    for chunk in model.stream(messages):
        chunks.append(chunk)
        print(chunk.content,end = "", flush=True)
    print()
```


## 前回から差分

### モデルをストリーミングで呼び出し、結果を順次表示

まず主な差分はストリーミング機能の追加です。

```python

    chunks = []
    print("AI: ",end="")
    for chunk in model.stream(messages):
        chunks.append(chunk)
        print(chunk.content,end = "", flush=True)
    print()
```

その他の差分は以下です。

### APIキーの環境設定化
前回はハードコーディングしていましたが、環境設定にしました。
```python
import env
# OpenAIのAPIキーを設定
os.environ["OPENAI_API_KEY"] = env.OPENAI_API_KEY
```

### GPT4からGPT4o miniに変更
安いから。

``` python
model = ChatOpenAI(model="gpt-4o-mini", max_tokens=50)
```


誰かの参考になれば幸いです。