OmniAICreator/Qiita-1.07M huggingface dataset:
R6.12.26現在1日1回は目を通したいもの

# OSI参照モデル
L1:物理層（ケーブルや電波の物理部分）
L2:データリンク層（データを正確に送受信する、フレーム）
L3:ネットワーク層（通信経路を決める、パケット）
L4:トランスポート層（データを正確に届ける、セグメント）
L5:セッション層（通信の開始・管理・終了を担当）
L6:プレゼンテーション層（データの形式を整える）
L7:アプリケーション層（ユーザーと直接やり取りする）

**L2はMACアドレスを使用してノードを識別**
**L4はポート番号を使用してアプリケーションを識別**
※ポート番号はデバイス上のどのサービス（アプリケーション）と通信するか決めるもの、IPアドレスと同時に通信される

# ポート番号
HTTP:80
DNS:53
DHCP:67,68
SMTP(メール送信）:25

# PowerShell
**tracert（トレサート）**
ネットワークの通信経路を調べるコマンド
パケットが通過する中継ルーターを一覧表示し遅延やエラーが発生しているのか特定するのに役立つ

**netsat（ネットスタット）**
ネットワークの状態や統計情報を表示するコマンド
現在のTCP/IPの通信状況を表示する

# Entra ID
Microsoftが提供するクラウド型
ID管理とアクセス制御サービスで下記4点に優れている
- ユーザー管理
従業員や顧客のIDを一元管理
- シグナルサインオン（SSO）
1回のログインで複数アプリにアクセス可能
- 多要素認証（MFA）
パスワード+追加認証でセキュリティ強化
- アクセス制御
条件付きアクセスで安全なリソース利用

:::note info
オンプレミス社内ネットワーク管理に優れているActiveDirectryと一緒に使用する場合、ハイブリット環境の活用となる。クラウドだけで解決するならAzureのみで良い。ハイブリット環境になることにより、クラウドサービスの利点を取り入れつつオンプレミスのセキュリティを維持できる
:::

#  Webアクセス管理ソリューション
企業や組織がWebシステムを安全かつ効率的に使用したい時に使われる（IceWallなど）

:::note info
ソリューションを使わなくても既にクラウドサービスに認証サービスは提供されている。しかし企業が様々なサービス（クラウドやオンプレシステムなど）を併用している場合、それらの環境を統一してくれる認証基盤として機能する。
また1つの認証基盤だけでは管理が難しいオンプレの古いシステムや独自の認証プロコトルを使用するサービスも統一的に管理してくれる。

そのように複数のクラウドやオンプレミスが混在している環境、または柔軟なカスタマイズや高度なセキュリティ要件が必要な場合にこのようなソリューションがあると良い
:::

# 認証プロトコル
クラウドサービスやソリューションは認証プロトコルという技術を使い認証・認可をしている。
- Kerberos（ケルベロス）
大規模な企業社内ネットワークで使われる、セキュリティが高い
- OAuth（オース）
SNSやクラウドサービスで使われる、ソース・データへのアクセスが得意なプロトコル。認可。分散型サービスと相性が良い。
- RADIUS（ラディウス）
企業VPNやリモワで使われる、Kerberos程セキュリティは高くないがインターネット接続の管理など外部からのアクセス認証を得意としている
- SAML（サムル）
Webベージやアプリでよく使われる。企業でもクラウド認証したいときに使用される。SSOを実現するために使用されるプロトコル。
- SSL/TLSハンドシェイク
HTTPで使用される。現在のインターネットにおけるセキュリティの基盤。特にオンラインショッピングや金融サービスなどセキュリティが重要な場面で不可欠な技術
「はりの弾性方程式を証明して下さい。」をAI先生に聞きました。

・何が何だか、わかりませんでした。私の聞き方が悪いようです。
　もっと適確にかも。地道？するしかありませんか。

# ChatGPT先生へ
>(回答抜粋)

上記のsympyのソースコードを教えて下さい。結果も。
```python
```
>データ分析の制限に達しました。

# Gemini先生へ
>(回答抜粋)

上記のsympyのソースコードを教えて下さい。結果も。
```python
from sympy import symbols, Function, Eq, dsolve

# 記号と関数の定義
E, I, x = symbols('E I x')
y = Function('y')(x)
M = symbols('M') # Mを定数とみなす

# 微分方程式の定義
equation = Eq(E * I * diff(y, x, 2), M)

# 微分方程式の求解
solution = dsolve(equation, y)

# 解の表示
print("\n微分方程式の解:")
print(solution)

# Mをxの関数とした例 (M = x)
M_func = x
equation_func = Eq(E * I * diff(y, x, 2), M_func)
solution_func = dsolve(equation_func, y)
print("\nM = x の場合の微分方程式の解:")
print(solution_func)
```
```
微分方程式の解:
y(x) == C1 + C2*x + M*x**2/(2*E*I)
M = x の場合の微分方程式の解:
y(x) == C1 + C2*x + x**3/(6*E*I)
```

# copilot先生へ
未



# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342) 　開発環境

# いつもと違うおすすめです。
#### wikipedia
paiza.ioでc# その15

# 概要
paiza.ioでc#、やってみた。
練習問題やってみた。

# 練習問題
AtCoderを解け。
N個の整数値を受け取り、一度の操作ですべての数を2で割る。割り切れなくなるまで割っていった時、何回割ることが出来るか？

# サンプルコード

```

using System;

public class Hello {
    public static void Main() {
        int min = 100;
        int n = int.Parse(Console.ReadLine());
        string line = Console.ReadLine();
		string[] lines = line.Split(new string[] {
			" "
		}, StringSplitOptions.None);
        for (int i = 0; i < n; i++)
        {
            int a = int.Parse(lines[i]);
            int c = 0;
            while (a > 1)
            {
                if (a % 2 == 1)
                    break;
                c++; 
                a >>= 1;
            } 
            min = Math.Min(min, c);
        }
        Console.WriteLine(min);
    }
}

```

# 成果物

https://paiza.io/projects/9-P4NhN-pNzFfzeBxz9ANw


以上。
WSLgで同じキーが複数送信される

WSLgの環境下で、コントロールキー付きの文字を入力すると、同じキーが何度も送信される事象が発生。
X WindowsのAutorpeatが原因だった。
以下の手順で解決した(多分)

`xset`のインストール
```
sudo apt-get install x11-xserver-utils
```
なおChatGPTには`x110-utils`を入れろと言われたが、そこには`xset`は入っていなかった。

autrepeatの無効化
```
xset r off
```

以上で完了。

問題なさそうなら、設定に書いて永続化する。
```
echo "xset r off" >> ~/.xprofile
```

## 追記
autorepeatないと、キー押しっぱなしでカーソル移動できないのでとても不便ということが発覚。

一方、auto repeatを復活させても、同じ症状は再現しなくなっていた。
`x11-server-utils` か `x11-utils`が何かいい感じにしてくれているのかもしれない。
AP結果発表！

<!-- AP結果発表！ -->

## はじめに

秋の応用情報技術者試験を受けていました。今日が結果発表なので、合格したかどうかを確認したいと思います。

## 結果

合格発表(2024/12/26の12:00)後にIPAのウェブサイトで確認をしたところ、無事合格していました。

午前が80.00点、午後が78.00点で意外と余裕を持っての合格でした(午前午後どちらも60点以上で合格)。

午前の分野別の得点は以下の通りでした。

- ストラテジ系：18.75/25.00
- マネジメント系：10.00/12.50
- テクノロジ系：51.25/62.50

ストラテジ系が比較的低かったようでした。

## 感想・やったこと

受験後の自己採点とかはしませんでした。というかすぐに問題用紙を処分した気がします。自己採点をして不合格かもしれないという不安にかられるのが嫌だったんですね。昼休憩中にも解答速報をチェックしたりはしませんでした。

午前は以前合格していた基本情報技術者試験と内容がかぶる事があったので、それを活かして勉強していました。特に[過去問道場](https://www.ap-siken.com/apkakomon.php)をよく利用していました。ここの問題を一周し、間違えた問題は記録して復習、という形で学習を進めました。

午後問題に関してはかなりFEとは毛色の違う問題だったので、対策書を買って対策をしました。また、経営や監査の問題に関しては国語力で殴れることがあったので、共通テスト国語を思い出しながら解きました。

午後の解答した大問は以下の通りです。選択に関しては国語力が使えるものと、プログラミングや開発の経験が活かせる大問を選びました。

- 1.情報セキュリティ
- 3.プログラミング
- 4.システムアーキテクチャ
- 5.ネットワーク
- 11.システム監査

## おわりに

しっかり一回の受験で合格することができてよかったです。

今後は応用情報技術者試験を合格していることで一部の試験が免除になるような試験などを受験し、さらに取得している資格を増やしていきたいと思います。

ではまた。
vscode devcontainer + podman desktop on windows

## はじめに
この記事は，Windows で vscode の devcontainer を使うための記事です。
コンテナとして podman desktopを使います。
（書きかけ）

# 概要

## 設定
### Windows の設定
https://github.com/containers/podman/blob/main/docs/tutorials/podman-for-windows.md

上記サイトのガイド通りにします。
私は rootless の設定にしました。

### WSL2 の設定
https://podman-desktop.io/docs/podman/accessing-podman-from-another-wsl-instance

Podman のコンテナが動くWSL2環境は専用のもの（デフォルトで podman-machine-default ）で，普段使う環境とは別物です。
リモート環境にあるpodmanにWSL環境下で接続するため，上記サイトのガイド通りにします。

### vscode の設定

とりあえず設定値だけですが以下のようになります（これはrootless用です）。
WSL2の設定をちゃんと行えば要らなかったかも...

```
@ext:ms-vscode-remote.remote-containers

Dev › Containers: Docker Path
Docker (or Podman) executable name or path.

/usr/local/bin/podman-remote-static-linux_amd64

Dev › Containers: Docker Socket Path
Docker socket path. Used, e.g., when connecting to a Dev Container with the devcontainer.json in a Docker Volume.

/mnt/wsl/podman-sockets/podman-machine-default/podman-user.sock
```

## 後日談
快適に使えていたのですが，AWS CDKでコンテナのビルドをdevcontainerなしで行おうとして，Dockerに戻ってしまいました。
devcontainer 環境下に移行して，もう一度ちゃんと環境構築してみたいと思います。

Rancher Desktopとも比較できるといいなぁ（時間がない）
テトレーション（tetration）の剰余計算

### テトレーション（tetration）

テトレーションは余りなじみのない言葉ですが[ハイパー演算子とクヌースの矢印（高校数学の美しい物語）](https://manabitimes.jp/math/1370)に分かりやすい説明があります。要はハイパー演算子の$n=4$の場合で、階乗を繰り返す操作になります。
**クヌースの矢印**を用いると以下のように表されます。

```math 
\begin{align}
& 2 \uparrow \uparrow 3 = 2^{2^2} = 2^4 = 16\\
&漸化式にすると  \\
& a \uparrow \uparrow n = a ^{a \uparrow \uparrow (n-1)} \ \ \ \cdots (1) \\
& 表されます
\end{align}
```
実際の数はとてつもなく大きくなってしまうので、この剰余計算を行います。

### テトレーションでaが素数の場合

**【例題１】$2027 \uparrow \uparrow 2027 $ の下８桁を求めよ**

指数部の剰余計算に以下のオイラーの定理（整数論）を使いたいので、まず$a$が素数の場合を考えます。

```math 
\begin{align}
& n を自然数，a をn と互いに素な正の整数としたとき\\
&\large a ^{\phi(m)}= 1 \pmod m\\

\end{align}
```
式（１）にこの定理を適用してプログラムにします。$\phi(m)$は**sympy**の**totient**関数を使いました。
```python 
import sympy as sp

def tetration(a,n,M):
  if M <= 2 or n == 1: 
    return pow(a,n,M)
  return pow(a,tetration(a,n-1,int(sp.totient(M))),M)
M = 10**8
print(tetration(2027, 2027, M))
# 24536083
```
このプログラムでは$M$の**totient**を次々にとって2になるまで続けるのですが**24回**再帰呼び出しが行われます。

### totientの代わりにカーマイケルのラムダ関数を使う

要はtotient(m)は$a$を何乗したら$\pmod m$で１になるかを求めるのですが、必ずしも最小値ではないようです。そこで[巷で話題のカーマイケル数・カーマイケルの定理について](https://tsujimotter.hatenablog.com/entry/carmichael-number)を参考にして**totient**の代わりに「カーマイケルのラムダ関数」を使ってみます。

定義はやや分かりづらいですが、幸いSympyにはカーマイケルのラムダ関数を計算してくれる**reduced_totiont**関数がありましたのでそれを使うと**10回**で収束しました。
それほど大きな改善ではありませんが、覚えておくと良いかもしれません。

```python 
from sympy.functions.combinatorial.numbers import reduced_totient
M = 10**8
L = [M]
while True:
  M = reduced_totient(M)
  L.append(M)
  if M <=2: break
print(len(L), L)
# 10 [100000000, 5000000, 250000, 12500, 2500, 500, 100, 20, 4, 2]
```

### テトレーションでaが2の場合

ここで、なぜいきなり$a=2$の場合になるかと言うと、[アッカーマン関数(Wikikedia)](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%83%E3%82%AB%E3%83%BC%E3%83%9E%E3%83%B3%E9%96%A2%E6%95%B0)によれば

```math 
\begin{align}
& アッカーマン関数はクヌースの矢印表記を用いると、\\
&\large A(m,n) = 2 \uparrow ^{m-2}(n+3)-3\\
& と表せるので例えば \\
& A(4,4) =  2 \uparrow \uparrow7-3 \\
& とテトレーションの形にできるので \\
&  2 \uparrow \uparrow n \pmod m \\
&  \\
\end{align}
```
が計算できれば**アッカーマン関数**の剰余計算もできることになります

**【例題１】$2 \uparrow \uparrow 7 $ の下８桁を求めよ**

以下の方針で解いて行きます。

1. $M=m \times 2^k$というように2のべき乗とそれ以外に分ける
1. $m$は2と互いに素なので前と同様に$\phi(m)$を次の法として漸化式を続けその答えを$y$とする
1. $2^q \equiv 0 \pmod {2^k} ただしq \ge k$

ここから以下の連立合同式を中国剰余定理を使って解く

```math 
\begin{align}
& x = y \pmod m \\
& x = 0 \pmod {2^k}\\
& これを満たすxがM=m \times 2^kを法として存在する
\end{align}
```
これをプログラムにすると以下になります。中国剰余定理を解くのは**sympy**の**crt**を使っています。また指数部の剰余を求めるのは、今回はあまり差がなかったので**totient**を用いています。

```python 
import sympy as sp
def sep2a(M):   # M = m * 2^k
  fct = sp.factorint(M)
  k = 0 if 2 not in fct else fct[2]
  return M // 2**k, k

def tet2(n, M):
  if n == 0: return 1 % M
  m, k = sep2(M)   # M = m * 2^k
  y = pow(2,tet2(n-1,int(sp.totient(m))), m)
  return sp.ntheory.modular.crt([m, 2**k],[y, 0])[0]

M = 10**8
n = 7
print(f"tetration(2,{n},{M}) = {tet2(n, M)}")
# tetration(2,7,100000000) = 8948736
```

（開発環境：Google Colab）

この考え方は以下のProject Eulerの問題を解くのに役に立ちます。
* Problem 188: Hyperexponentiation
* Problem 282: The Ackermann Function
振り返り 何が最も大事か

様々な手法がある振り返りで何において最も大事か

それは    「参加するマインド」だと思う
私が振り返りで特に意識しているのは以下だ
- 全体のゴール/アウトカムを共有する  
- 各アクションの前提やインプットを明確にする
- 各アクションで期待するアウトプットを明確にする

---
#### 全体のゴール/アウトカムを共有する

ふりかえりにおいても最も重要なことは参加者が会議のゴールを認識し
会議の結果どのようなアウトカムが望まれているかを共有して参加することだ。

これさえあれば小手先の手法などはなんとでもなる
先ずは会議の結論として何を求められているのかがわからないと参加者の思考は迷走してしまう。
それぞれが自分なりのアウトカムをイメージしてしまっては議論のポイントがどんどんずれてしまう。

そのためこの会議でのゴールは何で、そのうえでゴールを達成して生まれる成果アウトカムをすり合わせておく。
ふりかえりゴールとして改善策を出すということがあるとして、
改善策をなんのために出すのか、何を優先するのか、を明確にしないと的確な策は出せず
ぼんやりとした定型的な施策が生まれやすくなる。


####  各アクションの前提やインプットを明確にする
ふりかえりには様々な手法があり、それぞれ特徴があるが
ふりかえりそのものも含めて流れが存在する。
あるアクションの結果が次のアクションのインプットになる
よくあるスプリントのふりかえりであれば、そのスプリント内でリリースした機能や成果
スプリントゴールの達成状況を確認した後、その結果をインプットにふりかえりを開始することがよくある
何かのアクションの結果が次のアクションインプットなるのだ
ファシリテーターは各アクション間のインプット/アウトプットの流れを意識して進める必要がある


#### 各アクションで期待するアウトプットを明確にする
ファシリテーターが期待する内容とアウトプットが異なることもよくあることだ
実際に作業して気づいたことを出してほしいのに、やったことをただ羅列されることなどあるあるだろう
前項で述べたようにアクションのアウトプットが次のインプットになる関係上、
ファシリテーターの企図しない内容のアウトプットはノイズにやすい。
そういった場合は複数の例を上げるなど、参加者に何をしてほしいか明示していく。
気を付けてほしいのは、ファシリテーターは意見を選別矯正するのではなく、あくまでも粒度や方向性
を指し示す程度に指示をしていくことだ。
ファシリテーターが強権的になるとメンバが委縮して意見が出にくくなったり、
意見の多様性が失われていくことになる

---

### 会議体の構築の構築も大事だ

会議体の構築で重要になるのは目的にあった環境を構築することだ
ふりかえりなど参加を促す場合は誰がが画面を開いてそこにファシリテーターが意見を
追記していく形ではなく、各自それぞれが書くことができるツールを用意した方がよい
誰かの画面で記載していく場合だと記入者の速度に支配され、記入中は意見を出さない/出せないことがよく起こる
物理的な付箋やツールを用いるべきだ
また、ブレストなどの意見を出すフェーズと議論をするフェーズを分け、考える時間を明確にした方が参加しやすい
例えば、10分間自主ワークで付箋に意見を書き出す、その後10分間で議論をするといったような形だ。
議論中はそちらに集中して意見が出せないし、人によって考えをまとめることに時間がほしい人もいる
いかに発言しやすい環境を作るかが重要になって来る
　
また、より議論に参加を促すには発言させることも重要である。誰かが書いてあることを読み上げるのでは無く
自分の考えを話させることを強制することでより参加が促進される
だれかがやってくれるという意識から自発性が生まれてくるのだ。
意見を出すのが苦手な人なら精度や粒度はおいておいて数を出すことから始めることも一つだ。


### ふりかえりのふりかえり
ファシリテーターはふりかえりをしてみたらその内容についてふりかえることも重要だ
ふりかえりのアウトカムは達成できたのかインプットアウトプットの流れはスムーズだったのか
会議の中で意見を出すことが大変になっていないかなどなど
このふりかえりを行い次の会ではやり方を変化させて行くことも重要だ。
うまくいっていても同じことを続けていると参加者も慣れてきて新たな意見が出にくくなったりする
ふりかえりを別視点で観察してみてガラッとやり方を変えたり、ワンタイムで別の手法を試すことも手だ


#### 以下は私が実際にやってみたスプリントふりかえりの流れになる

    
    スプリントの実績確認
        スプリント内で完了したタスクを全員で確認しあい
        全員で達成度合いを確認する
        ここでスプリントゴールの達成を判断する

    タイムライン＋ＹＷＴ
        タイムライン
            そのスプリントで行ったイベントやできごと、印象に残っていることを時系列にならべる

        やったこと
            タイムラインに対して自身の行ったことを書き出していく
            ここではタスクを書き出すのではなく、工夫したことだったり、特に印象に残っていることを出していく

        わかったこと
            ここではやったことからの発見やできなかったことを出して見る

        次やること
            次のアクションを全員で話あう


全体として目新しいものは使用していなかった
しかし、上で述べたことを実践していたためか不思議と詰まることが少なかった
手法よりもやりざまが重要だと特に感じたものだった
結局のところふりかえりの手法よりどう参加するかである
この雑文が読んだ方の何かの助けになれば何よりである
iRICでインストールしたMiniconda3環境にライブラリを追加する方法

# はじめに
現在公式で配布されているpythonで書かれたソルバーに関しては、必要なライブラリはインストール時に、一緒にインストールしているためライブラリの追加は必要ありません。

2024/12/26現在デフォルトでインストールされているライブラリは以下です。
```text
numpy=1.26.4
numba=0.59.1
scipy=1.13.1
gdal=3.6.2
h5py=3.11.0
pandas=2.2.2
matplotlib=3.8.4
requests=2.32.2
beautifulsoup4=4.12.3
pyproj=3.6.1
```

今回紹介するのは独自で開発しているソルバーや、別途配布されているソルバーでこの他に必要なライブラリがある場合に行う操作となります。

例えば私が個人で配布している以下のソルバーを使うのには必要な操作です。

[iRIC_3D_polygon_generator](https://github.com/starfieldKt/iRIC_3D_polygon_generator) (追加で"Numpy stl"が必要)

# この記事の対象
この記事は、iRICをインストールした際に、一緒にインストールしたMiniconda環境を使用している方を対象にした記事です。
iRICインストール時にMinicondaをインストールせず、既存の環境を使用している方は対象外です。既存環境を利用されたい方は以下のマニュアルをご確認ください。

https://iric-gui-user-manual.readthedocs.io/ja/v4_jp/01_install.html

# 方法
iRIC上で動くpythonのソルバーはデフォルトで`iric`という仮想環境で実行されます。
そのため作業は、仮想環境`iric`を有効化して、その環境にライブラリをインストールするという流れになります。

## 仮想環境の有効化
スタートメニューから 「Anaconda Prompt (miniconda3)」を起動します。

以下のコマンドを実行します。

```
conda activate iric
```

以下のようにプロンプトの先頭が(base)から(iric)になれば成功です。

![2024-12-26_14h25_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/2f15d670-9643-ac46-12c7-a91550431883.png)

## ライブラリのインストール

### メジャーなライブラリに関して
以下のようなコマンドで任意のインストールしたいライブラリを追加します。

```
conda install [ライブラリの名前]
```

例えばNumpyをインストールしたい場合は以下のようになります。

```
conda install numpy
```

コマンドを実行するとバージョンなどの確認のあと、インストールするか聞かれるので`y`を入力してインストールを実行します。
この時すでに最新版がインストールされていれば以下のように表示されます。

```
# All requested packages already installed.
```

### 公式チャンネルで配布されていないライブラリに関して

ただし、先ほどのコマンドではインストールできないライブラリもあります。

例えば"Numpy stl"もAnaconda公式チャンネルでは配布されていませんが、conda-forgeというチャンネルでは配布されています。
その場合は以下のように配信先を指定してあげることでインストールできます。

```
conda install -c [チャンネルの名前] [ライブラリの名前]
```
例
```
conda install -c conda-forge numpy-stl
```
「FreeCADのマクロで、全要素の色を赤色にするマクロを教えて下さい。」をAI先生に聞きました。　all element -> color red あきらめました。

・質問中

https://forum.freecad.org/viewforum.php?f=16&sid=de98cc2b161187b329b94d652494f99b


# Gemini先生へ
>(回答抜粋)
python省略

上記のコードが終了しません。修正コードをお願いします。
>(回答抜粋)
python省略

文字が赤色になりません。修正コードをお願いします。
>(回答抜粋)
```python
import FreeCAD
import FreeCADGui

def set_all_objects_color(color):
    """ドキュメント内の全てのオブジェクトの色を設定します。"""
    doc = FreeCAD.ActiveDocument
    if doc is None:
        return

    for obj in doc.Objects:
        try:
            if hasattr(obj, "ViewObject") and obj.ViewObject is not None:
                if hasattr(obj.ViewObject, "ShapeColor"):
                    obj.ViewObject.ShapeColor = color
                if hasattr(obj.ViewObject, "LineColor"):
                    obj.ViewObject.LineColor = color
                if hasattr(obj.ViewObject, "FaceColor"):
                    obj.ViewObject.FaceColor = color
        except AttributeError:
            pass
        except Exception as e:
            print(f"オブジェクト {obj.Name} の処理中にエラーが発生しました: {e}")

    FreeCADGui.updateGui()

red = (1.0, 0.0, 0.0)
set_all_objects_color(red)
```
あきらめました。


# ChatGPT先生へ
>(回答抜粋)
>注意
>・スケッチや特殊なオブジェクトに適用できない場合があります。その場合は追加の条件分岐を組み込む必要があります。
```python
import FreeCAD

# 現在のアクティブなドキュメントを取得
doc = FreeCAD.ActiveDocument

if doc is None:
    print("アクティブなドキュメントがありません。")
else:>
    # ドキュメント内のすべてのオブジェクトを取得
    for obj in doc.Objects:
        if hasattr(obj, "ViewObject") and obj.ViewObject:
            # ViewObjectが存在する場合、ShapeColorを赤色に設定
            obj.ViewObject.ShapeColor = (1.0, 0.0, 0.0)  # RGB値で赤色
    print("すべてのオブジェクトの色を赤色に設定しました。")
```
<class 'AttributeError'>: 'Gui.ViewProviderDocumentObject' object has no attribute 'ShapeColor'
>...修正版コード

あきらめました。
情報処理安全確保支援士、AWS SCS受験結果

■情報処理安全確保支援士
午前Ⅰ：免除
午前Ⅱ：88/100(合格基準：60%以上)
午後：56/100(合格基準：60%以上)
結果：不合格

■AWS Security Speciality
736/1000(合格基準：75%以上)
結果：不合格

今まで資格試験対策の勉強するときは、ただとにかく机に向かえばいい、それだけで100点、と自分に言い聞かせて効率度外視でだらだらやってしまっていたが、難易度が高めの試験に合格するためには効率と集中力の質を追求しないと合格は難しいと感じた。
情報処理安全確保支援士試験の午後問題は、大門4つのうち1つがWebの脆弱性系の問題、1つがセキュアプログラミング系の問題でその2つに関しては知識が全くなく捨てることを決めていたため、知識不足を踏まえると不合格は当然の結果だったと思う。

■今後の資格受験予定
年の瀬なので来年の目標を書きます。
1月
　Nutanix Certified Professional - Multicloud Infrastructure (NCP-MCI) 6.5（予約済み）
　Nutanix Certified Professional - Multicloud Automation (NCP-MCA) 6.5（予約済み）
　Nutanix Certified Services Core (NCS-Core)（NCP-MCI合格後に受験可能）
　Nutanix Certified Professional- Unified Storage (NCP-US)（バウチャーが余ったら受験）
2-4月：ネットワークスペシャリスト対策
4月
　ネットワークスペシャリスト
5-10月：情報処理安全確保支援士対策
10月
　情報処理安全確保支援士
11月-：AWS Security Speciality対策、社内バウチャーが出次第申込
M2マック　GPU使用方法メモ

# 個人的に早く終わった方法まとめます
調べて実行できた手順まとめてます。
まだまだ初学者なので変な言い回しありましたらご指摘お願いします。
参考資料は最後にあります。
 
### 01 アナコンダのインストール（mac用）
https://www.anaconda.com/download/success

### 02 インストールが終わったらコンソールで確認
```bash
$ conda -V
```
conda 24.9.2
conda versionが表示でOK

### 03 baseについて
インストールが終わると下のように表示されます。
```bash
(base)name@mac $
```
baseはAnacondaの標準仮想環境。
使用しない方がいいみたいです。
ということで仮想環境ビルドします。

### 04 仮想環境
仮想環境は、
```bash
$ conda create -n 仮想環境名
```
この方法だとpythonの最新バージョンになります。
<br>
そのため、バージョン指定して、
```
$ conda create -n 仮想環境名 python==x.x.x
```
とすることで問題なく使用できます。
参考までに！
私の環境では、3.10.16でインストールして利用できました。

### 05 コマンド系
・仮想環境有効化
```bash
$ conda activate 仮想環境名
```
・仮想環境無効化
```bash
$ deactivate
```
・ライブラリのインストール
（環境破壊の原因となるので、conda installは使用しない方がいいらしい）
その他必要なライブラリも適宜インストール
```bash
pip install tensorflow-macos tensorflow-metal
conda -c inatall apple tensorflow-deps
```

### 06 最後に確認
お借りしたコードで(参考)
```python
import tensorflow as tf

gpu = len(tf.config.list_physical_devices('GPU'))>0
print("GPU is", "available" if gpu else "NOT AVAILABLE")
```
availableが表示されれば、問題なく使えます。

### ここから検証
windows環境で簡単にgpuを使用する方法があったので、Macでも使用できるか検証しておきます。
```bash
$ conda search tensorflow
```
出力結果にgpuはなさそうです。
```bash
Loading channels: done
# Name                       Version           Build  Channel             
tensorflow                    2.10.0 eigen_py310he68639e_0  pkgs/main           
tensorflow                    2.10.0 eigen_py38hd746a99_0  pkgs/main           
tensorflow                    2.10.0 eigen_py39h0cb48d0_0  pkgs/main           
tensorflow                    2.11.0 eigen_py310h6363ca7_0  pkgs/main           
tensorflow                    2.11.0 eigen_py38h9a6d513_0  pkgs/main           
tensorflow                    2.11.0 eigen_py39h384437f_0  pkgs/main           
tensorflow                    2.12.0 eigen_py310h205ab9b_0  pkgs/main           
tensorflow                    2.12.0 eigen_py311h689d69b_0  pkgs/main           
tensorflow                    2.12.0 eigen_py38h4f56085_0  pkgs/main           
tensorflow                    2.12.0 eigen_py39h767e93f_0  pkgs/main           
tensorflow                    2.17.0 cpu_py310h18e2dce_0  pkgs/main           
tensorflow                    2.17.0 cpu_py311h18e2dce_0  pkgs/main           
tensorflow                    2.17.0 cpu_py312h18e2dce_0  pkgs/main           
tensorflow                    2.17.0 cpu_py39h18e2dce_0  pkgs/main    
```
windows環境用に一様置いておきます
```bash
$ conda install tensorflow=バージョン=gpu・・・
```
これで一発ビルドできるみたいです、
深層学習はwindows環境の方が楽そうですね。

## 参考
https://qiita.com/ktokey/items/7ee9c112198a6b0b5709
https://qiita.com/Kaitolab/items/63b709fb893bbd207ec2
https://zenn.dev/datasciencekun/articles/74b764515ca246
railsのdeviseでuser agentもtrackする

## 0. 前提
deviseが導入済み
devise trackableを導入済み

## 1. カラムの追加
今回はusers tableとします
current_sign_in_ip, にならい、current_とlast_と2つ作成します

```
add_column :users, :current_sign_in_user_agent, :string
add_column :users, :last_sign_in_user_agent, :string
```

### 2. config/initializers/devise.rbに追加
ファイル作ってもいんですけど、今回はdeviseを設定した直後にします
```
Devise.setup do |config|
  # ~~~
end

module DeviseExt
  module Models
    module Trackable
      def self.required_fields(klass)
        super + [ :current_sign_in_user_agent, :last_sign_in_user_agent ]
      end

      def update_tracked_fields(request)
        super
        old_current, new_current = self.current_sign_in_user_agent, extract_user_agent_from(request)
        self.last_sign_in_user_agent = old_current || new_current
        self.current_sign_in_user_agent = new_current
      end

      protected

      def extract_user_agent_from(request)
        request.user_agent
      end
    end
  end
end

Devise::Models::Trackable.prepend DeviseExt::Models::Trackable

```

## 3. 動作確認
```
Started POST "/users/sign_in" for ::1 at 2024-12-26 14:04:44 +0900
Processing by Devise::SessionsController#create as HTML
  Parameters: {"authenticity_token"=>"[FILTERED]", "user"=>{"email"=>"[FILTERED]", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"}
  User Load (1.4ms)  SELECT "users".* FROM "users" WHERE "users"."email" = 'test@example.com' ORDER BY "users"."id" ASC LIMIT 1 /*action='create',application='OidcServer',controller='sessions'*/
  TRANSACTION (0.2ms)  BEGIN /*action='create',application='OidcServer',controller='sessions'*/
  User Update (1.6ms)  UPDATE "users" SET "sign_in_count" = 2, "current_sign_in_at" = '2024-12-26 05:04:44.812636', "current_sign_in_user_agent" = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', "last_sign_in_user_agent" = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', "updated_at" = '2024-12-26 05:04:44.812949' WHERE "users"."id" = 1 /*action='create',application='OidcServer',controller='sessions'*/
  TRANSACTION (1.4ms)  COMMIT /*action='create',application='OidcServer',controller='sessions'*/
Redirected to http://localhost:3000/
Completed 303 See Other in 302ms (ActiveRecord: 4.5ms (2 queries, 0 cached) | GC: 6.1ms)
```
Linux で Slint にカメラの映像を表示する(rscam 編)

# はじめに

[Linux で Slint にカメラの映像を表示する](https://qiita.com/task_jp/items/685beaa68de5ba8b9b16) という記事で、[gstreamer-rs](https://crates.io/crates/gstreamer) を利用したカメラ対応を試しました。

今回は v4l2 のラッパークレート [rscam](https://crates.io/crates/rscam) を利用して、Slint 上にカメラ映像を表示したいとおもいます。

# rscam の使い方

[rscam のドキュメント](https://docs.rs/rscam/0.5.5/rscam/index.html) の最初に、以下のサンプルコードが記載されています。

```rust
let mut camera = rscam::new("/dev/video0").unwrap();

camera.start(&rscam::Config {
    interval: (1, 30),      // 30 fps.
    resolution: (1280, 720),
    format: b"MJPG",
    ..Default::default()
}).unwrap();

for i in 0..10 {
    let frame = camera.capture().unwrap();
    let mut file = fs::File::create(&format!("frame-{}.jpg", i)).unwrap();
    file.write_all(&frame[..]).unwrap();
}
```

とっても簡単ですね。

# Slint アプリの作成

色々やり方はありますが、一番馴染みのある以下のように作成しました。

```console
$ cargo generate slint-ui/slint-rust-template
```

プロジェクト名は `slint-rscam` とします。

## フロントエンド

```qml:ui/app-window.slint
export component AppWindow inherits Window {
    title: "RS Camera";
    preferred-width: 800px;
    preferred-height: 600px;
    background: black;
    in property <image> viewfinder <=> viewfinder.source;
    viewfinder := Image {}
}
```

シンプルに Image を１つ置き、その `source` をバックエンド側から設定できるように（プロパティの作成と設定を）しています。

## バックエンド

```rust:src/main.rs
use std::{error::Error, thread};
use rscam::{Camera, Config};

slint::include_modules!();

fn main() -> Result<(), Box<dyn Error>> {
    let ui = AppWindow::new()?;
    let app_weak = ui.as_weak();

    let mut camera = Camera::new("/dev/video0").unwrap();
    camera
        .start(&Config {
            interval: (1, 10),
            resolution: (1280, 720),
            format: b"RGB3",
            ..Default::default()
        }).unwrap();
    
    thread::spawn(move || {
        loop {
            let frame = camera.capture().unwrap();
            let mut pixel_buffer = slint::SharedPixelBuffer::<slint::Rgb8Pixel>::new(frame.resolution.0, frame.resolution.1);
            pixel_buffer.make_mut_bytes().copy_from_slice(&frame[..]);
            app_weak.upgrade_in_event_loop(|app| {
                app.set_viewfinder(slint::Image::from_rgb8(pixel_buffer));
            }).unwrap();
        }
    });

    ui.run()?;

    Ok(())
}
```

別スレッドでカメラから画像を取得してはフロントエンドに設定しています。

# おわりに

gstreamer に比べて、シンプルで高速に動作するカメラの使い方を紹介しました。

すべてのソースコードはこちらです。

https://github.com/task-jp/slint-rscam
Keytarについて詳しくなりたい

# はじめに
pnpm installの際にkeytarエラーが発生したことがきっかけとなり、本記事を書くことなりました。
個人的なモヤモヤ解消したいがために、keytarについて調査したことを簡単に以下まとめています。

# Keytarとは何か？
一言で言うと「システムキーチェーンを扱うためのNode.jsモジュール」です。
>キーチェーンとは？（AIに聞いてみました）
>>パスワードや暗号化キーなどの機密情報を安全に保管するための、ソフトウェアまたはハードウェアの仕組みです。 オペレーティングシステムやアプリケーションによって実装方法は異なりますが、共通の目的は、ユーザーが個々のパスワードを覚える必要性を減らし、セキュリティを向上させることです。﻿



macOS、Linux、Windowsといった様々なOSのキーチェーンにアクセスするためのクロスプラットフォームのNode.jsモジュールです。 これにより、アプリケーションはプラットフォーム固有のキーチェーンAPIを意識することなく、安全にパスワードやAPIキーなどの機密情報を保存、取得、削除できます。 
各OSでは以下のキーチェーンシステムを利用している模様です。
- macOS: Keychain
- Linux: Secret Service API/libsecret
- Windows: Credential Vault

## Keytarのインストール

```bash
npm install keytar
```
または

```bash
yarn add keytar
```

インストール後、keytarをインポートして使用できます。

```javascript
const keytar = require('keytar');
```

:::note warn


Linux環境では、libsecretが必要になる場合があります。ディストリビューションによってインストール方法は異なりますが、Debian/UbuntuとRed Hat系を例として記載しておきます。

**Debian/Ubuntu**
```bash
sudo apt-get install libsecret-1-dev
```
**Red Hat系**
```bash
sudo yum install libsecret-devel
```
**Arch Linux**
```bash
sudo pacman -S libsecret
```

:::
### 主要な関数
keytarは、パスワードの保存、取得、削除、検索を行うための主要な非同期関数を提供します。 全ての関数はPromiseを返し、エラーが発生した場合はrejectされます。

**getPassword(service, account)**
指定されたserviceとaccountに対応するパスワードを取得します。パスワードが見つからない場合はnullを返します。

**setPassword(service, account, password)**
指定されたserviceとaccountにパスワードを保存します。既存のエントリがあれば更新し、なければ新規に作成します。

**deletePassword(service, account)**
指定されたserviceとaccountに対応するパスワードを削除します。パスワードが見つからない場合はfalseを返します。

**findCredentials(service)**
指定されたserviceに対応する全てのアカウントとパスワードを取得します。配列[{ account: 'foo', password: 'bar' }]として返します。

**findPassword(service)**
指定されたserviceに対応するパスワードを取得します。アカウントは不要な場合に便利です。パスワードが見つからない場合はnullを返します。

### 使用例
以下、keytarの基本的な使用方法を簡単に書いてみました。
内容としてはhoge-appというサービスとhoge-userというアカウントにパスワードを保存し、取得後に削除しています。

```javascript
const keytar = require('keytar');

async function main() {
  const service = 'hoge-app';
  const account = 'hoge-user';
  const password = 'hoge-secret-password';

  try {
    await keytar.setPassword(service, account, password);
    console.log('パスワードが保存されました。');

    const retrievedPassword = await keytar.getPassword(service, account);
    console.log('取得したパスワード:', retrievedPassword);

    await keytar.deletePassword(service, account);
    console.log('パスワードが削除されました。');
  } catch (error) {
    console.error('エラーが発生しました:', error);
  }
}

main();
```



## まとめ
- keytarは、Node.jsアプリケーションでシステムのキーチェーンを安全に操作するツール
- クロスプラットフォームの互換性とシンプルなAPIにより、開発者は簡単に機密情報を管理できる
- Linux環境ではlibsecretが必要になるケースがあることにも注意したい
AzureMonitorとLogAnalytics

# Azure MonitorとLog Analytics
この2つはMicrosoft Azureの監視とログ管理に関連するサービス。システムの運用状況を可視化し問題を迅速に検出・解決するためのツール。これらのサービスを使うことで運用効率の向上やシステム障害の迅速な解決が可能になる

## Azure Monitor
Azure MonitorはAzureリソースやオンプレミス環境、その他クラウド環境のパフォーマンスと可能性を監視するための統合サービス

### 主な機能
**1.データ収集**
- メトリック:CPU使用率、ディスク使用率などの数値データ
- ログ:アプリケーションログ、イベントログ、診断データなど

**2.可視化**
ダッシュボードを作成してリソースの状態をリアルタイムで確認できる

**3.アラート**
異常が検出された場合、通知を設定可能（メール、SMS、Webhookなど）

**4.分析**
収集したデータを基にトラブルシューティングや最適化おための洞察を提供

**5.自動化**
アクションルールや自動スケールを設定して問題の解決やリソースお効率化を自動化

### 対応範囲
- Azure VM、App Services、KubernetesなどAzureリソース
- オンプレミス環境や他クラウドプロバイダーのリソースも監視可能（エージェントをインストールする必要あり）

## Log Analytics
Log AnalyticsaはAzure Monitorの中核となる機能でログデータを収集・保存し、高度な分析を行うプラットフォーム

### 主な機能
**1.データ収集**
- Azure Monitorから送られるログやメトリックを統合的管理
- オンプレミスや他クラウドからのデータも収集可能

**2.クエリ言語**
- データを柔軟に検索・分析するためのクエリ言語
例：CPU使用率が特定の闘値を超えるVMを検索する

**3.診断とトラブルシューティング**
- アプリケーションやインフラの問題を特定するために詳細な分析を提供

**4.長期間のデータ保持**
- データを長期間保持してトレンド分析やコンプライアンス目的で利用可能

## 両者の関係
**Azure Monitor**
広範囲の監視プラットフォームでありLog analyticsをその一部として利用する

**Log Analytics**
Azure Monitorが収集したログデータを分析・視覚化するためのツールとして機能する

## どんな場面で使われるか
**1.アプリケーション監視**
- Azure Monitorでアプリのパフォーマンスをリアルタイム監視

**2.セキュリティ監視**
- ログデータを収集し不正アクセスや異常なアクティビティを検知

**3.コスト最適化**
- リソースの使用状況を分析し非効率なリソースの特定やスケール調整
【Web】プロキシサーバ

# はじめに
こんにちは！アメリカで独学でソフトウェアエンジニアを目指しているものです。
現在Webについて勉強していますが、本日はその中でもプロキシサーバについて説明していこうと思います。
名前は聞いたことあるけど何だっけとなってしまったのでこれを機に記事を書こうと思いました

## プロキシサーバーとは

プロキシサーバーは、クライアントとサーバーの中間でデータの中継・転送を行い、クライアントの代理として通信を行うサーバーです。これにより、クライアントとサーバーが直接通信を行うのではなく、必ずプロキシサーバーを介して通信が行われます。

### プロキシサーバーの分類

プロキシサーバーは大きく分けて以下の2種類に分類されます。

- フォワードプロキシ (Forward Proxy)
- リバースプロキシ (Reverse Proxy)

それぞれの特性や役割は異なり、運用目的や環境に応じて使い分けられます。

---

## フォワードプロキシ (Forward Proxy)

### 概要

フォワードプロキシとは、クライアントの“代理”として外部のサーバーにリクエストを送るプロキシサーバーです。一般的に「プロキシサーバー」と呼ぶ場合、多くはフォワードプロキシを指します。社内LANや特定のネットワーク環境で、外部サイトへのアクセスを管理・制限する目的や、キャッシュ機能を利用した高速化などによく利用されます。

### 主な役割・メリット

#### アクセス制限・フィルタリング

- 社内ネットワークや学校で、不適切なサイトや危険なサイトへのアクセスを制限します。
- フォワードプロキシを通すことで、管理者は誰がどのサイトにアクセスしたかを記録しやすくなります。

#### キャッシュによる高速化

- フォワードプロキシはキャッシュ機能を持つことが多く、頻繁にアクセスされるコンテンツをプロキシサーバー側に保存しておくことで、次回のリクエスト時にプロキシサーバーから直接配信可能です。
- これにより、ネットワーク帯域の節約やレスポンス時間の短縮が実現します。

#### プライバシー保護

- フォワードプロキシを利用することで、クライアントの実際のIPアドレスを隠し、外部サーバーに直接通知されないようにします。
- 匿名性を向上させたい場合に利用されます。

#### 内部ネットワークのセキュリティ強化

- クライアントが外部にアクセスする際、フォワードプロキシを必ず経由させることで、通信の監視や制御が容易になり、セキュリティが向上します。

---

## リバースプロキシ (Reverse Proxy)

### 概要

リバースプロキシはサーバー側に配置され、外部からのリクエストを“代理受信”するプロキシサーバーです。クライアントは通常、リバースプロキシの存在を意識することはありません。表向きには「リバースプロキシ自体がウェブサーバー」のように振る舞い、実際のコンテンツはリバースプロキシの背後にいるサーバー群が提供します。

### 主な役割・メリット

#### ロードバランシング（負荷分散）

- リバースプロキシで複数のバックエンドサーバーにリクエストを振り分け、負荷を均等に分散します。
- 大規模なウェブサービス運用では欠かせない機能です。

#### セキュリティ対策

- クライアントから直接バックエンドサーバーにアクセスさせず、サーバー構成やIPアドレスを隠蔽します。
- 不正アクセスやDDoS攻撃を防ぐためのフィルタリング機能も設定可能です。

#### SSL/TLS終端 (SSL Offloading)

- HTTPS通信の暗号化・復号処理をリバースプロキシで行うことで、バックエンドサーバーの負荷を軽減します。
- SSL証明書を一元管理できるため、運用効率が向上します。

#### キャッシュによる高速化

- リバースプロキシはキャッシュ機能を利用して、静的コンテンツを効率的に配信します。
- バックエンドサーバーの負荷を減らし、クライアントへの応答速度を向上させます。

#### コンテンツルーティング

- リクエストのURLやヘッダー情報に基づいて、適切なバックエンドサーバーに振り分けることが可能です。
- マイクロサービス環境や多言語対応サイトでの柔軟な運用を支援します。

---

## フォワードプロキシとリバースプロキシの対比

| **項目**            | **フォワードプロキシ**                                     | **リバースプロキシ**                                      |
|---------------------|-------------------------------------------------------|--------------------------------------------------------|
| **役割**           | クライアントの代理で外部にアクセスする                     | 外部からのリクエストを受けるサーバーの代理               |
| **配置場所**       | クライアント側のネットワーク境界                           | サーバー側（サービス提供側）のネットワーク境界           |
| **利用目的**       | アクセス制限、キャッシュ、高速化、プライバシー保護など     | 負荷分散、セキュリティ強化、SSL終端、キャッシュなど       |
| **対象**           | 内部ネットワークから外部への通信                           | 外部クライアントからサーバーへの通信                     |

---

## まとめ

プロキシサーバーは、通信経路の中継点としてさまざまなメリットをもたらします。

- **フォワードプロキシ**:
  - クライアントの代理として、アクセス制限やキャッシュによる高速化、プライバシー保護などを実現します。
- **リバースプロキシ**:
  - サーバー側の代理として、負荷分散やセキュリティ強化、SSL終端など、高負荷・高セキュアなサービス提供に欠かせない存在です。
保険について3

## 初めに
皆さんこんにちは、大野です。
今回は前回紹介した保険の説明の続きです。

※前回も説明しましたが、保険商品の内容は保険会社によって細部が違います。当記事だけで納得しないでご自分でも調べてください。

## 将来の資金不足に備える生命保険の種類
将来の資金不足に備えるための生命保険には、主に「個人年金保険」「養老保険」「学資保険」の3つが挙げられます。それぞれの内容について解説します。

## 個人年金保険
個人年金保険は、国民年金や厚生年金といった公的年金を補うために、個人が任意で加入する私的年金のひとつです。60歳や65歳等、所定の年齢まで保険料を払込み、契約時に定めた受取開始時期になったら、一定期間または終身にわたって年金を受取ることができます。公的年金だけでは老後の生活が不安な場合は、個人年金保険に加入することで、将来の生活資金にゆとりを持つことができます。

## 養老保険
養老保険は、死亡保障と貯蓄の両方を兼ね備えた保険です。契約時に定めた保険期間中に、被保険者が死亡または保険会社所定の高度障害状態になった場合は、死亡保険金が支払われます。また、何事もなく保険期間が終了した場合には、満期保険金を受取ることができます。

保険期間には「年満了」と「歳満了」の2種類があり、死亡保険金と満期保険金は基本的に同じ金額です。保険料は、貯蓄性がある分、掛け捨てタイプの生命保険と比べると割高になる傾向があります。

## 学資保険
学資保険は、主に子どもの教育費を準備することを目的とした、貯蓄性のある保険です。基本的には保護者が契約者となって加入し、子どもの進学のタイミング等、契約時に定めた時期に、祝金や満期保険金を受取ることができます。多くの学資保険では、契約者である保護者が死亡または保険会社所定の高度障害状態になった場合、以後の保険料を払込まなくても満期保険金等を受取れる保険料払込免除特約があります,


今回はここまで
キリがいいので今回はここまでです。また次回で続きの説明をしたいと思います。次回で保険商品の紹介は最後になります。

以上、大野でした。
保険について2

## 初めに
皆さんこんにちは、大野です。
今回は前回紹介した保険の説明の続きです。

※前回も説明しましたが、保険商品の内容は保険会社によって細部が違います。当記事だけで納得しないでご自分でも調べてください。

## 病気やケガに備える生命保険の種類
病気やケガに備える生命保険には、医療保険やがん保険をはじめ、さまざまな種類があります。それぞれの特徴を以下で解説します。

## 医療保険
医療保険は、公的医療保険制度だけではまかなえない医療費をカバーするための保険です。公的医療保険を利用した場合の自己負担分の補填の他、入院時の差額ベッド代や食事代、先進医療の技術料のような、公的医療保険制度が適用されない費用を補うこともできます。

医療保険には、保険期間の違いによって「終身医療保険」と「定期医療保険」、貯蓄性の有無によって「掛け捨て型」と「積み立て型（貯蓄型）」等の種類があり、保障内容や給付金額、保険料は、保険会社や保険商品によっても異なります。

## 女性向け医療保険
女性向け医療保険とは、一般的な医療保険よりも、女性特有の病気による入院・手術に対する備えを手厚くしている医療保険です。女性特有の病気の例としては、乳がんや子宮がんの他、子宮筋腫、卵巣のう腫等が挙げられます。また、切迫流産や切迫早産、帝王切開、妊娠高血圧症候群等、妊娠・出産時のリスクに備えることも可能です。

## 引受基準緩和型医療保険・無選択型医療保険
持病や既往症がある人向けの医療保険として、申込時の告知項目が少ない引受基準緩和型医療保険と、告知なしで申込める無選択型医療保険があります。いずれの保険も、持病や既往症があっても加入しやすい反面、一般的な医療保険に比べて保険料が割高で、加入後一定期間は保障が制限される場合もあります。特に、無選択型医療保険は、引受基準緩和型医療保険よりもさらに保険料が割高です。

ただ、持病や既往症があっても、健康状態によっては一般の医療保険に加入できるケースもあります。そのため、持病等がある場合は、まず一般の医療保険に加入できないかを確認し、次に引受基準緩和型、最後に無選択型の順で検討を進めていくのが良いです。

## がん保険
がん保険は、がんに特化した保障を設けている保険です。がんと診断された際やがんの治療のための手術を受けた際等に、その内容に応じて給付金を受取ることができます。主な保障内容は、がんと診断された際に受取れる「がん診断一時金」、公的医療保険制度対象の手術・放射線治療・抗がん剤治療を受けた際に受取れる「がん治療給付金」、がんの治療を目的とした入院の際に受取れる「がん入院給付金」等です。

また、がん保険には、保障が一生涯続く「終身がん保険」と、10年、15年等、保険期間があらかじめ決まっている「定期がん保険」があります。

## 就業不能保険
就業不能保険は、病気やケガのために長期間働けず、収入が減少してしまうリスクに備える保険です。保険会社所定の就業不能状態になった場合に、一時金あるいは毎月定額で給付金を受け取ることができます。保険会社所定の就業不能状態とは、一般的に、「病気やケガの治療のための長期入院」「医師の指示による在宅療養」「障害等級1級または2級」等を指します。

## 介護保険
介護保険は、介護が必要になった際、公的介護保険ではまかないきれない経済的負担のリスクに備える保険です。保険会社所定の介護状態になった場合に、一時金や年金形式で給付金を受取ることができます。保険会社所定の条件を満たせば、年齢に関係なく給付が受けられ、受取った給付金の使い道は自由なので、介護施設の利用料や介護食代、おむつ代、住まいのバリアフリー改築費等の他、介護のために休職した場合の生活費にあてることも可能です。

## 今回はここまで
まだまだ続き長くなるので今回はここまでです。また次回で続きの説明をしたいと思います。

以上、大野でした
【Ruby】独自に例外クラスを定義する

# カスタム例外
- 独自に定義する例外クラス
- 多くの場合はStandardErrorを継承する

## 定義
- 例外クラスを継承する
```rb
class StatusError < RunTimeError; end
class IdError < StandardError; end
```

- デフォルトメッセージを設定する
```rb
class FileError < StandardError
  def initialize(message = 'ファイルエラーが発生しました')
    super(message)
  end
end
```
## 呼び出す

```rb
raise FileError
#=> FileError: ファイルエラーが発生しました
```

- デフォルトメッセージの設定と呼び出しを同時に行う場合は下記のように書く
```rb
raise FileError.new("ファイルエラーが発生しました")
```


## メリット
- エラー内容が直感的に分かりやすくなり、デバッグしやすくなる
```
RuntimeError: "...."
RuntimeError: "...."
RuntimeError: "...."
```
```
StatusError: "...."
IdError: "...."
FileError: "...."
```
# 参考

https://product.st.inc/entry/2020/12/04/110528
windowsのCドライブの容量を空ける

### アプリ消す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/852cae42-23f1-6c36-2fe0-e48b932805b4.png)


### ディスククリーンアップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/2b80302f-3180-98f8-ebde-88d7f01264e5.png)

### windowsアップデートの残骸ファイルを削除

管理者権限でcmd
スキャン
Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore
フォルダのクリーンアップ
Dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase

コンポーネントストアは、Windowsの更新プログラムや機能を管理するために使用されるフォルダ（通常 C:\Windows\WinSxS）です

使用されていないWindowsの更新プログラムやコンポーネントを削除します。
生成AI（RAG）を使ったQAチャットボット「KCLUKN（クラックン）」をリリースしました！


## はじめに
皆さん、こんにちは。
KDDI CCoE（※1）の坂井です。

※1：CCoE = Cloud Center of Excellence の略称。
　自社内のクラウド利用推進をさまざまな形で支援・牽引する専任組織を指す。
※2：本記事は個人の見解であり、組織の公式見解とは一切関係はありません。


みなさん、日々の業務の問い合わせ対応に悩んだことはありませんか？  

現在CCoEでは、社内のクラウド利用を支援するために、環境整備や問い合わせ対応を行っています。しかし、問い合わせが増えるにつれて、こんな課題が出てきました。

- 問い合わせ対応に時間がかかりすぎて、他の業務が圧迫される
- 即時に回答できない場合があり、利用者がフラストレーションを感じる
- 特定の有識者への依存が強く、対応が属人化してしまう

これをなんとかしないとと思い、私たちは、QAチャットボット、その名も「KCLUKN（クラックン(※3)）」をリリースしました！
※3：KDDI Cloud Useful Knowledge Navigatorの略称

リリースに至った背景や取り組みの過程等を中心にご紹介できればと思います。

---

## 背景
### 直面していた問題
問い合わせ対応で抱える問題を具体的に挙げると、

- **CCoEの負担増大**: 問い合わせ対応に時間とコストがかかってしまう
- **利用者の不満**: 回答が遅く、迅速な解決ができない
- **属人化**: 問題の解決方法が特定の有識者に依存している

### 解決したいこと
このような状況を改善するため、以下を目指しました。

**1. 問い合わせ対応の効率化**
**2. 利用者が迅速に回答を得られる環境の構築**
**3. 上記1.2.を実現することで、CCoE全体の負担を軽減**

---

## 解決策: 生成AI（RAG）の導入
採用したアプローチは、生成AIのRAGを活用したチャットボットの構築です。
### RAGとは
RAGとは「Retrieval Augmented Generation」の略称で、生成AIの仕組みを強化するための方法です。具体的には、自社だけに蓄積された情報などをLLM（大規模言語モデル）に取り込んで回答させる技術のことです。


### 試用したモデル
生成AIとして以下のモデルを試用しました。


- **Claude-3 Sonnet**
- **Claude-3 Haiku**
- **Claude-3.5 Sonnet**
- **GPT-4o**

### モデル選定のポイント
利用するモデルについては、以下を重視し選定しました。
- **Claudeモデル**
    - 社内ではAWSを利用しているユーザが多く、Amazon Bedrockで利用可能
    - QAなどのリアルタイムコンテンツ生成に特化

- **GPT-4oモデル**
    - 日本語における性能向上
    - 自然で一貫性のあるテキスト生成

---
ここまでは、生成AIを使ったチャットボットの導入のよくある話かと思いますが、
CCoEでは、評価に関する取り組みに重点をあて、以下の２ステップで評価を行いました。



## モデル評価に関する取り組み
チャットボットのモデルを選定する過程で、先ほど挙げた４つのモデルから最終的に採用するモデルを選定する取り組み（評価）を「ステップ１」と「ステップ２」に分けて行いました。

 - ステップ１：**定量評価**により、モデルを「4つ」から「2つ」の選定
 - ステップ２：**定性評価**により、最終的に採用するモデルを１つに選定

### ステップ１：Ragasツールを活用した定量評価
「Ragas」という評価ツールを使いました。「Ragas」の特徴は、評価指標として複数のメトリクスを数値化するツールとなります。今回は、複数のあるメトリクスのなかでも、ユーザの利用に直接影響のある「Answer Relevance」というメトリクスの数値を軸に比較しました。

 - Answer Relevance（適切性）: 生成された回答が元の回答にどれだけ適切か

#### 定量評価の結果
結果として、4つのモデルのうち「Claude-3 Haiku」と「GPT-4o」が高評価であると結論が出ました。


### ステップ２：社内の有志30名によるフィードバックによる定性評価
定量評価による比較検討に加え、実際の使用感による評価を大切にしたく、社内から有志30名を募り、チャットボットを試用してもらいました。

それぞれのモデルに対し、同様の質問をしていただき、回答されるレスポンス速度や回答内容の充実度などを人が判断し評価を行うやり方となります。

実際に利用いただく「人」にフォーカスし、

具体的には以下の観点でスコアやフィードバックを頂きました。

#### 評価項目（4段階評価）
- 回答のレスポンス速度
- 回答の理解しやすさ/自然さ
- 回答の適切さ
- おすすめ度（周りにおすすめしたいか）

#### フィードバック内容（自由記載）
- ポジティブフィードバック
- ネガティブフィードバック
- 改善提案

#### 定性評価の結果
結論として**GPT-4o**を採用しリリースしました。定性評価を踏まえた総評は以下の通りです。

##### 両モデルの採択可否/考察
- GPT-4o：**回答の適切さと自然さを両立**していると評価でき、採用に値すると判断
- Claude-3 Haiku：**レスポンス速度は高評価**だが、簡潔な回答が適切さを欠く結果となり、AIチャットボットには向かないと判断

## 評価に関する振り返り
今回、定量評価と定性評価という２ステップにて評価を実施しました。

最終的に**GPT-4o**を採用しリリースすることとしましたが、定性評価の考察からもわかる通り、両モデルの評価が明確に分かれる結果となりました。
**Claude-3 Haiku**はモデルの特性上、レスポンスが早く端的な回答を出力するのが特徴となり、その結果が顕著に表れた形と考えております。

また、モデルの特性を考慮した場合、**Claude-3.5 Sonnet**の方がAIチャットボットとして適切であると考えており、**GPT-4o**と**Claude-3.5 Sonnet**による定性評価を行えば、また異なった結果となる可能性もあると考えております。

---

## まとめ
RAGを活用した効率化に向けた取り組みはまだ始まったばかりです。

現時点ではPhase1という位置づけとしており、今後更なるアップデートを検討しております。
今回は「GPT-4o」選定しましたが、最近でも各ハイパースケーラーから様々なモデルがリリースされているため、すぐに最新モデルを試せるようなプラットフォームの要素も取り入れていきたいと考えております。

これらの取り組みは、CCoEが社内でのクラウド活用をさらに促進する基盤となりました。この記事が、同じ課題を抱える皆さんの参考になれば幸いです！
3つの認証系整理

## 3つの認証
①認証プロトコル：技術的なルールや仕組み
（例：OAuth、SAML、OIDC）
②クラウドサービスの認証：クラウド環境での認証の仕組み
（AWS IAM、Azure AD）
③IceWallの認証：具体的な製品で社内やクラウドの認証を一元化するためのソリューション

[例]
Googleサービスを利用する際「Googleでログイン」は認証プロトコル（例：OAuthまたはOUDC）を使っている
会社でAWSを使う場合、アクセスにはクラウドサービスの認証（AWS IAM）が必要
同じ会社で社内ポータルやクラウドアプリケーションの認証を一元管理したい場合はIceWallのようなソリューションが導入されSAMLやOIDCを使ったSSOを実現している

## 認証プロトコル
ユーザーやシステムが自分が誰であるかを証明するための技術的な仕組みや手順。認証そのものの仕組み（プロトコル）であり具体的なサービスやツールではない。クラウドサービスや認証ソリューションがこれらのプロトコルを活用している。

[例]
OAuth：アプリケーション間で認証情報を共有するためのプロトコル（Googleアカウントでログイン）
SAML：企業のシグナルサインオン（SSO）でよく使われるXMLベースの認証プロトコル
OpenID Connect（OIDC）：OAuth2.0に基にした、モバイルやWebアプリに適した認証

## クラウドサービス
クラウド環境でユーザーやシステムがリソースにアクセスする際に、認証が必要になある仕組み。クラウドサービスの利用者（ユーザー、アプリ、システム）が安全にアクセスできるように設計されている。シグナルサインオン（SSO）や多要素認証（MFA）などプロトコル（SAMLやOAuthなど）を使って認証を行う。クラウドの特性としてリモートアクセスや分散した環境に最適化されている。

[例]
AWS IAM：AWSリソースへのアクセスを管理する認証と認可の仕組み
Microsoft Azure AD：クラウドとオンプレミスの統合認証基盤として機能する
Google Workspace：Gooleのクラウドサービスでのユーザー認証

## IceWall
NTTデータが提供する認証ゲートウェイソリューション。主に企業向けに提供されている。実際に動作するソフトウェア製品であり企業内システムやクラウド環境の認証を簡素化する。認証プロトコル（例：SAML、OIDC）を活用しているが独自の管理機能やカスタマイズ性がある
プリザンターのサーバスクリプトで添付ファイルの扱いをちょっとラクにする

## はじめに
プリザンターのサーバスクリプト、modelで取得出来る添付ファイルの項目はJSON文字列がそのままセットされているため若干扱いが面倒・・・。毎回`JSON.parse`で変換するのは地味に手間がかかるので、拡張サーバスクリプトを使用して、一括で変換するテクニックを紹介します。

## 実装の中身
まずは、格納されているデータを見てみます。
```json
[{"Guid":"47BFA611B94B4703865019110F4B3DFD","Name":"ED-038-datasheet.pdf","Size":1520972,"Deleted":true,"HashCode":"23pz2IFY4jenPCGgU7L2ci8Z/Uth2eReoBer8Sm+wVQ="}]
```
普通のJSONです。これなら素直にパースできますね。`model`のプロパティやそのものを直接触ると面倒なので、Attachmentsなプロパティだけを`model_attachments`という変数を作ってそちらにセットしてみます。
サーバスクリプトの条件は「画面表示の前」や「行表示の前」にセットすればOKです。他の場所でも`model`にアクセス出来る条件ならどこでも使えます。

```js
const regex = new RegExp('^Attachments');
let model_attachments = {};

for (const [key, value] of Object.entries(model)) {
    if (regex.test(key)) {
        model_attachments[key] = JSON.parse(value || '[]');
    }
}
```

`AttachmentsA～Z`と`Attachments001～999`のうちページに表されているもの(=`model`に含まれているもの)だけが、`model_attachments`にセットされます。表示されていないものを触りたいときは`view.AlwaysGetColumns`を使って対象を追加する方法も吊しのまま使えるようになっています。

## 拡張サーバスクリプトにしてみた
それぞれのサイトに追加していくもの面倒なので、拡張サーバスクリプトにして組み込んでみました。
条件は、「画面表示の前」と「秒表示の前」にしていますが、必要に応じて追加・変更してみてください。

```json:ModelAttachmentsParse.json
{
    "Name": "modelの添付ファイルのJSONをオブジェクトに変換する",
    "BeforeOpeningPage": true,
    "BeforeOpeningRow": true,
    "Body": "// Write an arbitrary script."
}
```
```js:ModelAttachmentsParse.json.js
let model_attachments = {};
let success_parse = false;
//エラーが出ると面倒なのでtry-catchで囲っておく
try {
    const regex = new RegExp('^Attachments');
    for (const [key, value] of Object.entries(model)) {
        if (regex.test(key)) {
             model_attachments[key] = JSON.parse(value || '[]');
        }
    }
    success_parse = true;
} catch(e) {
    success_parse = false;
    context.Error(e.Stack);
}
```
拡張サーバスクリプトはエラーを吐くと全部が止まってしまって面倒なので、try-catchで囲っています。また、正常に実行されることを確認するために、`success_parse`に実行に成功したかどうかを`true/false`でセットしています。

## まとめ
サーバスクリプトでの添付ファイルの扱いをちょっとしたサーバスクリプトで簡単にしてみました。この方法、実は別の項目でも応用が利くのですが、それはまた別の機会に紹介します。
カメラモジュール届きました。監視カメラにしていきます。

１．カメラモジュール届きました。監視カメラにしていきます。カメラ自体はSonyですね。裏箱にはIMX708 12-megapixel sencerと表記されてます。
![IMG_0059.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433305/18181273-4b35-763a-3023-3a9ebf102550.jpeg)

２．配線やり直して、自作の台を作って、以下のように構成しました。　
![IMG_0069.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433305/1934aeef-25e0-b366-2dd7-5cdaf3c19f98.jpeg)
VSCodeでPythonのバージョンを変更できなかった時にGPTに聞いてみた

VSCode（Visual Studio Code）のPython設定は、プロジェクトや環境ごとに柔軟に切り替えられるように設計されています。その設定概念を以下に分かりやすく解説します。

---

## 1. **Pythonのバージョンを指定する仕組み**
VSCodeは、Pythonのバージョンや環境（システムのPython、仮想環境、Anacondaなど）を指定して使用できます。この設定は次の2つの部分で管理されます：
- **ワークスペース設定（プロジェクトごとの設定）**
- **グローバル設定（VSCode全体の設定）**

Pythonの実行環境を切り替えるために、以下の2つを理解しておくと便利です：

### **インタープリタ（Python Interpreter）**
- **インタープリタとは**：Pythonのプログラムを実行するためのソフトウェア（Pythonのバージョンや環境）。
- **VSCodeのインタープリタ設定**：ステータスバー（画面下部）から選択することで、どのPythonを使うか指定できます。

---

## 2. **仮想環境（venv）とは**
仮想環境（venv）は、特定のプロジェクト専用のPython環境を作成する仕組みです。
### **仮想環境の利点**
- 他のプロジェクトと独立してPythonバージョンやライブラリを管理できる。
- システム全体のPythonに影響を与えず、依存関係が衝突しない。
  
### **具体例**
1. **システムに複数のPythonバージョンがある場合**  
   仮想環境を使うことで、特定のプロジェクトに必要なバージョンを指定可能（例：Blender用に3.11.9を選ぶ）。

2. **複数のプロジェクトで異なるライブラリを使う場合**  
   プロジェクトAでは`numpy 1.21`、プロジェクトBでは`numpy 1.23`のようにバージョンを分けられる。

---

## 3. **VSCodeでの仮想環境の設定と管理**
### **仮想環境を作成する方法**
1. **ターミナルを開く**（Ctrl+`）。
2. **仮想環境を作成**  
   ```
   python -m venv myenv
   ```
   - `myenv`は仮想環境の名前。任意の名前に変更可能。
   - 作成した仮想環境はプロジェクトフォルダ内に保存される。

3. **仮想環境をアクティブにする**
   - Windows:
     ```
     .\myenv\Scripts\activate
     ```
   - macOS/Linux:
     ```
     source myenv/bin/activate
     ```

### **VSCodeで仮想環境を選択する**
1. **ステータスバーを確認**  
   画面下部にPythonのインタープリタ（例: "Python 3.11.9"）が表示されている部分をクリック。

2. **インタープリタを選択**
   - 表示されるリストから、作成した仮想環境を選ぶ（`myenv`など）。

3. **自動的に認識されない場合**
   - 仮想環境のパスを手動で指定する。  
     ワークスペース設定に以下を追記（`.vscode/settings.json`）:
     ```json
     {
       "python.pythonPath": "myenv/Scripts/python"
     }
     ```

---

## 4. **Python 3.12と3.11.9を切り替えられる理由**
新しく仮想環境を作成したことで、以下のような動作が可能になったと思われます：
- VSCodeが複数のPython環境を認識し、それをステータスバーで切り替えられるようになった。
- 仮想環境ごとにPythonのバージョンを指定できる。

---

## 5. **まとめ**
VSCodeでは、**インタープリタ**と**仮想環境**を使い分けることで、プロジェクトに最適なPython環境を構築できます。

- 仮想環境（venv）はプロジェクト専用のPython環境を作るツール。
- ステータスバーや設定ファイルでPythonバージョンや環境を簡単に切り替え可能。
- Blenderで使用する3.11.9に合わせた環境を、各プロジェクトで柔軟に設定可能。
AWS Athenaのローカルエミュレータを作りたかった

# 紆余曲折ありましてPostgreSQLを卒業することになりました

本題からずれるので詳細は割愛しますが、これまでPostgreSQL管理していたデータを別のストレージで管理する必要が出てきました

管理対象のデータの性質は以下の通り
- サービスが成長すればするほどデータ量が大幅に増加する
- ユーザー操作はReadしか行われない
- データは挿入か削除のみで更新が行われない

# 移行先

管理対象のデータの性質を考えると、大量のデータを扱うことができるスケーラブルなストレージと強力でスケールする検索エンジンを兼ね備えたDBがほしい。

検討の結果、検索エンジンとしてAthenaを使うこととなりました

# PostgreSQL

Amazon AthenaはOSSであるtrinoを利用して実装されている検索エンジンです。検索エンジンでしかないので、これだけではPostgreSQLの代替になりません。

代替探しという意味で、PostgreSQLの内部を分解してみると以下のように書けます（正確にPostgreSQLのアーキテクチャを表現しているわけではありませんが、PostgreSLl => Athenaの移行を理解する上では十分です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625409/317c69eb-2e9e-0df4-83e1-7795716c5b57.png)

対して、Athenaは同様に分解すると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625409/40793a5f-4e2e-bd54-2d18-1d03779c3a1c.png)

つまり、PostgreSQLの代替としてAthenaを利用するためにはデータを貯めておくストレージとスキーマ情報などを保存するカタログの二つを別で用意する必要があります。

それらを補うと以下のような構成になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1625409/2838d183-59cb-a4e3-7980-f7908b6b9269.png)

# ローカル環境の選択肢

ローカル開発環境を作るにあたって、選択肢は以下の二つがありました。

1. LocalStackを使う
1. 自作する

LocalStackを利用すればかなり簡単にローカル環境を手に入れられるわけですが、今回はコスト面で自作することとしました

# ローカル開発環境作成

AWS謹製のDockerイメージなどが公開されていればいいのですが、残念ながらAthenaもGlue Catalogも、S3ですらそのようなものはありません。（今回は登場しませんが、Glue Jobに関しては謹製のDockerイメージが存在します）
そこで、必要なコンポーネントをOSSで用意するか一から自作する必要があります。

AWSサービスとOSSとの対応は次の通りです。
| AWSサービス | OSS |
| ---- | ---- |
| Athena |[Trino](https://trino.io/) |
| Glue Catalog | [HIVEメタストア](https://hive.apache.org/) |
| S3 | [MinIO](https://min.io/) |

そして、実際に作成したシステムが以下になります。
[リポジトリ](https://github.com/lapinChiro/local-athena/)

client_serviceはとりあえず何か必要だったので作成した、程度です。
全くもってAthenaのインターフェースになっていません。
対応するPRお待ちしております
GASでReactアプリを作ったけど、お蔵入りした話

# はじめに
技術者として、課題があると飛びついて解決してしまうものの、要件を重め受け止めすぎていて、そこまで必要ではなくて結局使われなかったということは、よくあると思います。そういう悲しいお話です。他山の石としていただければ。

# 要件
- とある舞台のイベントの席を、有料席として予約したい
- 席は最前列の10席で３回実施、つまり時間差で延べ30席
- 料金は、1席あたり1,000円で、当日現地払い
- それ以外の席は、予約なしで無料
- 予約システムの運用は無料で
    - （システム開発者の作業代金も無償で）


# 私の要件の解釈
- 新幹線や飛行機の席の予約のように、席の並びの絵があって、そこを１つずつポチポチ選んで、予約
- すでに誰かが予約済の場合は、[済]とか表示されていて、選べない
- 予約のために、氏名と連絡先を入れてもらって、Form登録
- 確認のため、本人にメールが飛ぶ
- スマホユーザーが大半
- （無償で働くけど自分の勉強や広告になればいいか）


# 実装方法
- Google Apps Script（GAS）の、ウェブアプリを作成
- ウェブアプリを、React・TypeScriptで
- 予約情報は、Google Spread SheetをDB代わりに


# 作ってみた
メインの予約部分はこんな感じでできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/1b4885c5-315e-fccc-d02a-ee431d69135b.png)


- 青い椅子のアイコンはボタンで、選択すると色が変わる
- ２席までしか選べないように
    - 全席予約を防止、２席という数字は調整可
- 予約済みの場合は、選べないように
- Reactで開発して、GAS上で実現

ここまで来てふと我に返り・・・

# 課題（といか解釈時の検討漏れ）
## 1. キャンセルをどうするか問題
これがとても大きい。

- 普通にキャンセルしたいときはどう運用するか
- 当日ドタキャンされたら、一番いい席が空いてしまう
    - 演者の気持ち:arrow_heading_down:
- キャンセルもせず、予約しても来ない（No Show）
- 先に多めに予約しておいて、必要な部分は後でキャンセルしようという人
    - いちおう２席でガードをかけても、何度も繰り返せばできちゃうか
    - そこまで厳密にガードをかけるべきか

キャンセルもシステムでできるようにするためには、ログインのような仕組みが必要になります。それは、システムを作る上でもめんどくさいけど、使う人もめんどくさい。それをこれから追加で作るか・・・？

キャンセルの仕組みを作ったとしても、どうせいろいろな課題は残り、結局手運用が結構かかる。

## 2. 誰がメンテするの問題
作った私以外は、システム関係者は誰もおらず、GASという言葉すら知らないと思う状況。勝手に私が先走っただけでした。

なので、バグやら何かの変更があったら、私が動かないといけない。~~メンテ嫌い。~~


# いっぽうGoogle Formsを使うことを考えてみると
- 予約が10席に達したらすぐ、Formsの文面を書き換えて、「売り切れました」と締め切らないといけない
- 書き換えが間に合わず予約が10席を超過してしまった場合に、「ゴメンナサイ」をメールか何かで個別に連絡しないといけない
- キャンセルはメールで受け付けなければならない
- その他、システムを作ったときのキャンセル問題はそのままある

# GASアプリ vs Formsで、Formsに軍配
つまりこういう図式になったということ。そして結果は、Formsを採用に。

**GASアプリ＋開発者負荷＋キャンセル問題　vs　Forms＋運用負荷＋キャンセル問題**

GASアプリの場合は、（１日で作ったとはいえ）複雑性とバグの潜在可能性、変更の可能性、それらは開発者の私しか対応できない。

Formsの場合は、追加の運用負荷もあるけど、エンジニアでなくても対応はできるレベル。作るのも超簡単。

というわけで、Formsで単純な方がいいよねという判断になりました。

そもそも私も、これからキャンセルの仕組みを追加で作るとしたら、作り終わっても諸々課題が残るとわかっているので、モチベーションがわかない。


# まとめ
結果的にお蔵入りになってしまいましたが、被害としては私の１日空回りだけで済んだので、よかったです。技術的な勉強（GASのReactアプリ、Material UI等）もあったし、必要十分な要件定義・設計をしろという勉強にもなりました。

勢いあまってシステムを作ってしまったけど誰も使わないというのは、エンジニアあるあるだと思いますので、みなさん、走り出す前にちょっと止まってお気をつけて。

ではよきバランス感覚を持った開発者ライフを。
LAPLAS SCOREを2.82から3.07まであげるのに約2ヵ月かかった話

# 自己紹介
フリーランスでエンジニアをしているさわらと申します。普段はTypeScriptやPHPなどの言語での開発案件に携わる傍らメンター業なども行っております。

# 背景
2024年11月1日、LAPLASに登録してみました。機械学習技術によるスコアリングで自分の技術力や市場価値を測れるとのことだったので測ってみたところ、
![IMG_20241226_045813.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490265/3dc2f2fe-3aed-6322-914d-8c055aaec4cb.jpeg)
2.82というなんだか微妙な結果。
メンターとしてプログラミングを教えていたりするので、今年中には、最低でも中央値の3.0は超えたいなと思い、とりあえず、Githubでいわゆる草活をすることにしました。
# 施策の詳細と実績
草活を続けたところ無事に3.07まで引き上げることに成功しました。（途中、技術力スコアの算出方法がv2に変わったりして画面が違います）

![1000000698.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490265/6f4951cf-fc25-8664-a50f-bc029edb79a4.jpeg)

スコア改善のために、やったことはシンプルで、Githubに100Days10minCodeという学習記録や日々の活動を積み上げるようなリポジトリを作成し、地道にcontributionを続けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490265/8a4565c1-6ae3-a9d6-f92d-64ad8320b9d1.png)

工夫した点としてはSlackに今日のcontribution数を自分あてに通知することで、忘れがちな「今日の作業をpushする」を忘れないようにしました。(それでも何日かpush忘れがあります)

これまでは、ほぼ焼野原だったため普段からマメにcontributionしている人よりは効果が高かったかもしれません。

# まとめ
そんなわけで、LAPLAS SCOREを2.82から3.07まであげた話をさせて頂きました。余談になりますが、100Days10minCodeを続けて、まだ50日程度しか経っておりませんので、まだまだ続ける予定です。興味がある人は、ぜひ、一緒にGithubで学習記録を付けて、ゆるく楽しみながら勉強しませんか？

リポジトリのリンクを貼っておきます。
[100Days10minCode](https://github.com/oga114/100Days10minCode)