OmniAICreator/Qiita-1.07M huggingface dataset:
オペアンプとCMOSインバーターでニューラルネットワークを作るメモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/c721c689-e1cd-8baf-3ab7-7ee015a7f6c4.png)
MathWorks - MATLAB/Simulinkで

```
function Vout = CMOS_inverter(Vin, Vdd)
    % 定数の設定 (Setting constants)
    V_Tn = 1.0;  % NMOSのしきい値電圧 (Threshold voltage for NMOS)
    V_Tp = -1.0;  % PMOSのしきい値電圧 (Threshold voltage for PMOS)

    % 定数の設定 (Setting constants for mobility and oxide capacitance)
    mu_n = 600e-4;  % NMOSの移動度 (Electron mobility for NMOS)
    mu_p = 300e-4;  % PMOSの移動度 (Hole mobility for PMOS)
    C_ox = 3.45e-3;  % 酸化膜容量 (Oxide capacitance)

    % NMOSとPMOSのWとLを定義 (Define W and L for NMOS and PMOS)
    W_n = 10e-6;  % NMOSのチャンネル幅 (Channel width for NMOS)
    L_n = 2e-6;   % NMOSのチャンネル長 (Channel length for NMOS)
    W_p = 20e-6;  % PMOSのチャンネル幅 (Channel width for PMOS)
    L_p = 2e-6;   % PMOSのチャンネル長 (Channel length for PMOS)

    % βnとβpの計算 (Calculate βn and βp)
    beta_n = mu_n * C_ox * (W_n / L_n);
    beta_p = mu_p * C_ox * (W_p / L_p);

    % しきい値電圧Vthの計算 (Calculate Vth based on the provided formula)
    Vth = (Vdd + V_Tp + sqrt(beta_n / beta_p) * V_Tn) / (1 + sqrt(beta_n / beta_p));

    % ゲインの計算 (Calculate gain using the provided formula)
    gmp = 1e-3;  % PMOS transconductance (S)
    gmn = 1e-3;  % NMOS transconductance (S)
    rop = 10e3;  % PMOS output resistance (ohms)
    ron = 10e3;  % NMOS output resistance (ohms)
    gain = (gmp + gmn) / (1/rop + 1/ron);

    % ロジスティック関数を使ったCMOSインバーターの出力 (CMOS inverter output using logistic function)
    Vout = Vdd * (1 / (1 + exp(-gain * (Vth - Vin))));
end
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/6e8667ae-b115-24c8-e8f3-f76cce1a796f.png)


メモ　理想ではない比較器

```
import numpy as np
import matplotlib.pyplot as plt

# 非理想的比較器のモデル関数
def non_ideal_comparator(v_in, v_th, hysteresis=0.1, slope=10):
    """
    非理想的比較器の動作をモデル化
    v_in: 入力電圧
    v_th: しきい値電圧
    hysteresis: ヒステリシス幅
    slope: 遷移のスロープ (大きいほど理想的)
    """
    # ヒステリシスを考慮
    lower_th = v_th - hysteresis / 2
    upper_th = v_th + hysteresis / 2

    # 遷移をスムーズにするためにシグモイド関数を使用
    output = 1 / (1 + np.exp(-slope * (v_in - upper_th)))  # 上限方向
    output -= 1 / (1 + np.exp(-slope * (v_in - lower_th)))  # 下限方向
    return output

# パラメータ設定
v_th = 2.5  # しきい値電圧 (例: 2.5V)
hysteresis = 0.2  # ヒステリシス幅 (例: 0.2V)
slope = 20  # スロープ (遷移の急さを調整)
v_in = np.linspace(0, 5, 500)  # 入力電圧 (0Vから5Vの範囲)

# 非理想的比較器の出力を計算
output = non_ideal_comparator(v_in, v_th, hysteresis, slope)

# プロット
plt.figure(figsize=(8, 4))
plt.plot(v_in, output, label="Non-Ideal Comparator Output")
plt.axvline(v_th, color="red", linestyle="--", label="Threshold Voltage (V_th)")
plt.axvline(v_th - hysteresis / 2, color="blue", linestyle="--", label="Lower Threshold")
plt.axvline(v_th + hysteresis / 2, color="green", linestyle="--", label="Upper Threshold")
plt.title("Non-Ideal Comparator Model")
plt.xlabel("Input Voltage (V_in) [V]")
plt.ylabel("Output")
plt.grid()
plt.legend()
plt.show()
```
キャリアブレイク中のライフスタイル見直し①　睡眠

# 健康
健康に過ごすには今までと同じでは駄目で、努力をしてやっと現状がキープ出来る年齢になってきました。さりとて健康を手に入れようとすると、生活習慣の見直しが必要です。これは、働いているとなかなか出来ません。そこでキャリアブレイク中は健康をテーマにライフスタイルの見直しをしています。

# 睡眠
健康において一番大事な要素。それが睡眠だと思います。人間は1/3～1/4ぐらいは寝て過ごします。睡眠が最適でないと健康では過ごせません。では睡眠における最適な時間は何時間でしょうか？これに関しては調べた限り明確でした。健康について調べると結構意見が割れるものも多いですが、睡眠時間に関してはわりと明確に7時間以上が良いとされていました。

# 働いている時の睡眠時間
自分は働いている間はほぼほぼ固定で0:30～6:30が睡眠時間でした。正確には寝室に行くのがこの時間で実際に寝るのは1:00近いことも多かったです。つまり5時間半から6時間が自分にとっての平均睡眠時間で、これは多分20年ぐらい大きく変わってないと思います。言ってしまえば慢性的な睡眠不足です。

# 寝ている時間
ということでキャリアブレイクしたら7時間は寝ようと思っていました。働いている状態で寝る時間を増やすのはかなり厳しく、何かを辞める決断が必要です。休憩時間、勉強時間、趣味時間などを削るのは少なからずストレスもあります。実際もっと寝ようと思ったことは何度もありますが、結局実現出来ませんでした。

# 起きる時間
また、今まで6:30に起きていたのは、自分が起きたい時間ではなく、出勤という必然性からの逆算です。これからは、寝る時間も、起きたい時間も自分の都合で決められます。7時間睡眠は絶対にしようと思いました。なんとなく朝方生活のにしようかなとは思っていました。

# 時間決定
とりあえず、なんとなく、0:00-7:00ぐらいが分かりやすいかなと思ったのですが、夜1人の時間が欲しいと思うことは多かったし、朝方の方が健康にも良さそうです。なので、23:00-6:00にしようかなと思いました。ただ自分は朝6:00から毎週月曜日に読書イベントに参加しています。そうなるともう少し早く起きた方が良いかなと思って、一旦22:30-5:30を睡眠時間に設定しました。

# 寝床につく時間
22:30を寝る時間にして、実際にベッドに行く時間を22:30にすると当たり前ですが、すぐは寝れません。基本22:00にはベッドに行ってそこから30分を睡眠前読書時間にしました。これでもやっぱり少し遅くなることも多いですが、実際に寝る時間の最低30分前にベッドに行くことは必須ですね。

# 寝る時間を早めたこと
寝る時間を変えた時、すぐにその時間のリズムが作れるかは不安でしたが、すぐは寝れなくても、目をつぶって横になっていれば、いつの間にか寝れました。そして、寝る時間を変えたことでやはり色々変わったことがあります。例えばTVを見る時間が激減した、マンガを読む時間が減った、昼寝をしなくなったなどです。

# まとめ
という感じでまず、睡眠時間を見直しました。朝方になってどうかというと、自分的には快適です。まだ1ヶ月なので何とも言えない部分もありますが、起きるの辛いと思う日は以前よりかなり減りました。もし可能なら働き出してもこの時間に変えたいと思ってはいますが、実際どうなるかは何とも言えません。寝足りない時は7:00ぐらいまで寝ることも出来るの結構大きなメリットだなと思います。
これだけ抑えておけばOK！Android Studioショートカット集

# はじめに
Android Studioの最低限抑えておくべきショートカット集を記載していく。
※Xcodeの最低限押さえておくべきショートカット集は[こちらを参照](https://qiita.com/H_Stephen/items/e88d800869e690716b60 "これだけ抑えておけばOK！Xcodeショートカット集")

# 環境
・Mac OS Sequoia 15.2
・Android Studio Koala | 2024.1.1

# ショートカット集
## 編集系
・超基本
| ショートカットキー | 意味 |
|:-:|:-:|
| Cmd＋S   | 保存  |
| Cmd＋X   | カット  |
| Cmd＋C   | コピー  |
| Cmd＋V   | ペースト  |

・知っておくと便利
| ショートカットキー | 意味 |
|:-:|:-:|
| Cmd＋/   | 選択行のコメントアウト  |
| Docコメントをつけたいメソッドに移動し、/** + Enter  |　Docコメントの簡易的な雛形生成  |
| Cmd + Z   | アンドゥ(元に戻す)  |
| Cmd＋Shift＋Z   | リドゥ(アンドゥの逆)  |
| Option⌥ + Command⌘ + L  | 選択行の改行やインデント整理  |

## 移動系
| ショートカットキー | 意味 |
|:-:|:-:|
| Cmd + Click   | 定義元へ移動  |
| メソッドやクラスにカーソルを当てるだけ   | 定義元のリファレンスを表示してくれる  |
| Opt + Command + ←   | ジャンプ前のファイルに移動  |
| Opt + Command + →| ジャンプしたことのある次のファイルに移動  |

※1. 現在開いているファイルをファイルツリー上で表示する場合は以下"Select Opened Fileのアイコン"を選択する
　コードを追っているときに使う時がある
![スクリーンショット 2024-12-16 23.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/445dcc27-7326-faaa-ed34-f05d7a8fcc00.png)

※2. メソッド一覧を表示する場合は、"Structure"を選択する
![スクリーンショット 2024-12-16 23.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/7c470dca-ac36-3e21-b688-b13a68b22348.png)

## ビルド系
| ショートカットキー | 意味 |
|:-:|:-:|
| Clean Project	デフォルトでは未割り当て | クリーン  |
| Rebuild Project デフォルトでは未割り当て   | ビルド  |
| control + R   | 実行 |

## 検索系
| ショートカットキー | 意味 |
|:-:|:-:|
| Cmd + F   | ファイル内検索  |
| Cmd + G   | ファイル内検索の次にフォーカスを移動  |
| Cmd + Shift + G   | ファイル内検索の前にフォーカスを移動 |
| Shift x 2   | プロジェクト内のファイル検索  |
| Shift + command + G   | Grep (Find in Files)  |
| Control + Option + H  | Call Hierarchy（呼び出し階層を開く）  |
環境構築で躓いた時に試すこと

環境構築は、Readmeを読むだけで構築できることが理想的ですが、パソコンの設定やOSによってうまく行かないことが多々あります。
プロジェクトの担当者に聞くのは、最終手段です。
今回は、環境構築で詰まった時に試していることをまとめます。

## エラーメッセージを読む
エラーメッセージを読むことで、解決のヒントを得ることができます。
もし英語で出力された場合は、その文章を翻訳したり、エラー文を検索することでヒントを得ることができます。
※ChatGPTに、社内の情報を入力することは、情報漏洩のリスクがあるため気をつけましょう。
大体の場合、エラー文が次に何をするべきかを教えてくれます。

## ドキュメントを読む
まず、関連するドキュメントが存在するかを確認します。
前任者が行ったトラブルシューティングが記載されている場合、それが解決のヒントになることがあります。

## 最初から試す
ファイルが見つからない場合や、起動が必要なものを起動していない場合など、手順に誤りがないかを疑います。
入力すべきコマンドを再度入力し直すことで解決する場合があります。
また、最初から環境構築の手順を見直すことで、うまくいくこともあります。

## 必要なライブラリやツールを確認する
Dockerのバージョンが古い場合や、指定されたNodeのバージョンがインストールされていない場合があります。
また、依存関係が原因で動作しないこともあります。

## 他に動いているプロジェクトがあるかを確認する
Dockerを使用している場合、以下のコマンドを入力することで、他のプロジェクトが動いているか確認できます。
```
$docker ps
```
また、Dockerのコンテナやイメージを削除することで解決することもあります。
フロントエンドの場合、使用するポートが他のプロジェクトで既に使われていることがよくあります。
その場合、一度すべてのプロジェクトを停止してから再度試すと、解決することがよくあります。
パソコンを再起動することも試す価値があります。

## 環境変数が設定されているかを確認する
環境変数が正しく設定されていない場合、当然ながら起動できません。
プロジェクトが進むにつれて環境変数が変更された場合、手順書が更新されていないとこのような問題が発生します。
もし、環境変数が原因であれば、直接プロジェクトの担当者に聞くしか解決できないと思います。

## 担当者に質問する
質問する時は、相手に状況をわかりやすく伝えてることが重要です。
自分が働いている環境では、AWSに関する技術的なお問い合わせについて、ガイドラインを読んでから質問するように指示されています。
少し難しいと感じるかもしれないですが、質問力が求められます。

https://aws.amazon.com/jp/premiumsupport/tech-support-guidelines/

## まとめ
環境構築に失敗した場合、メモを残しておくことで、次に環境構築を行う人のためのトラブルシューティングになります。

## 最後に
ドキュメントのありがたみを感じます。
PukiWikiをGitHub Pagesで運用するために静的サイト生成プラグインをつくった

# はじめに
PukiWikiをGitHub Pages上で公開しようと思い、静的サイトとして生成するためのプラグインをつくったのでそれを使ってウィキを静的化する。

## 環境
- Windows 11 23H2
- XAMPP v3.1.1
- PHP 8.1
- PukiWiki 1.5.4

## pukistatic.inc.php

https://github.com/PTOM76/PukiWiki-Plugins/blob/main/pukistatic.inc.php

ライセンス: MITライセンス

# 技術的な話
- すべてのページをPukiWiki内部の関数を呼んでHTML化するわけではなく、プラグインから無理やりページにアクセスして生成させる
- index.phpへ一時的にPKWK_READONLYの定数を設置し、閲覧専用として静的化させる → 編集ボタンなどの静的化した際、ややこしいので除去しておく

## 困った点
- スペースが含まれるページは生成されなかった
  - なかなか無理やりだが、スペースを+に置き換えることで解決
- ページの検索ができない → ページ一覧のjsonを生成すればなんとか...?

# 静的化の方法

https://github.com/PTOM76/PukiWiki-Plugins/blob/main/pukistatic.inc.php

1. ダウンロードしたファイル（pukistatic.inc.php）を`plugin/`に配置
2. ブラウザなどから`/?cmd=pukistatic` へアクセスすると生成
3. `pukistatic/` へ出力される

pukistatic/の中身をGitHub Pagesなどへコミット＆プッシュすることで公開できる。

## 設定
```php
// (公開する場合、)アップロード先のURL
define("PUKISTATIC_URL", ""); // 空の場合はそのまま

// ウィキページ以外で静的化する相対パス
define("PUKISTATIC_PATHES", 
	[
		"cmd=list",
		"cmd=filelist",
		"cmd=search",
		"cmd=rss",
	]
);
```

# 最後に
GitHub Pagesは無料で利用できるのでサーバー費用を気にせずにPukiWikiを公開できる。ただし静的化したいるため、編集などといった操作はできず、ウィキとしての利用はできないので、使わなくなったウィキのアーカイブとして静的化して公開することや個人用のブログに利用するなどを想定しました。
vimでコピペしたときに末尾のwindows改行コードを消す方法

## TL;DR
visualモードで`normal $x`
```vim:
'<,'>normal $x
```

## 説明
コードをクリップボード経由でぺたって貼るときがあります。
そのときに、windowsの末尾改行コード`^M`が入ってしまい邪魔でした。

1. `v`でvisualモードに入って消したい改行を選択する
1. コマンドモードで選択範囲に`normal $x`をかけると、
visualモードで、normalモードの操作で$(末尾)の一文字削除(x)する処理になるので改行コードだけ消せます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/1a96ab04-bc28-cae7-f67d-0d358e37d3ea.png)


## 終わりに
これ読んで思いつきました。年内に読み切りたい。

https://tatsu-zine.com/books/practical-vim
例）ポートフォリオのために、TableauでNetflixの映画ランキングと視聴数を分析

転職活動でやっていたことはこちらの記事に書きましたが、その具体的な内容について今回、共有します

https://qiita.com/riicon72/items/394baafe97c38d00fdcb

tableauで勉強のために分析したポートフォリオを作りました✨


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/51914c53-8423-2b1c-c291-ee4b39aec529.png)


# データ
https://www.kaggle.com/datasets/risakashiwabara/netfllix-weekly-views-data

# 内容
🇰🇷 squid game
🇺🇸 Stranger Thinfs
🇮🇳 RRR 

期間：　2021年7月4日〜2024年1月7日までのデータ
内容：　週ランキングと視聴者数の比較
使用したツール：tableau
このデータにした理由：作者による独断と偏見です。


## 詳細
🇰🇷　4週間で1億4200万世帯が視聴し、日本をはじめ、米国、ブラジル、フランス、など世界94カ国で”今日の総合TOP1”を獲得するという当時のNetflix史上最大の記録を出した大ヒットシリーズ。

🇺🇸 米国で最もストリーミングされたテレビ番組で、全4シーズンで520億分という視聴時間を記録した。

🇮🇳　日本でも話題になっていたインド映画のRRRは、インド映画史上最高額の制作費をかけた作品﻿で全世界で興行収入1億6000万ドル（約220億円）を超えた﻿と言われている。

## 結論と感想
🇰🇷　はNetflix史上最大の記録というだけあり、ランキング１位を長期間キープしている。視聴数も桁違いになっていることが読み取れる。
tableauは、慣れるまで難しいが、画像も入れることができとても見やすいEDAになった。
KindでKind作ってKindで指定するんだって

# 背景
GPTで小さいRESTサービスなんて作り放題な時代になりました
「無尽蔵に出来るREST管理といえば、難し気で避けてたkubernetesじゃないだろうか
[kind](https://kind.sigs.k8s.io/)ならWSL2内の[docker-ce](https://docs.docker.com/engine/install/)にするっと入るじゃないか」
この記事は、そんなkindとの出会い後、いきなり洗礼を受けた人の失敗の記録です
同じ勘違いをする少数派の同士に捧げます

## 環境
- Windows 11 Pro for Workstations 23H2
- WSL 2.3.26.0
- ubuntu 24.04.1 LTS (Windowsストア版）
- Docker version 27.3.1, build ce12230

# kind 公式通りに進める
- kind展開後、[公式の先頭](https://kind.sigs.k8s.io/)から素直に進めていきます
```
> kind create cluster
> kind get clusters   #名前省略時のデフォルト クラスター名はkind
kind　　　　　         #kindという名前のクラスターが出来ている
> kind delete cluster 
```
kindコマンドでkindクラスターを操作するなんて、手順を残したときに、ややこしすぎるから違う名前にしたくなるのが人情ではないでしょうか
```
> kind create cluster --name kind-2
> kind get clusters 
kind2
```
なるほど。でも、コマンドで直接打っちゃ記録が残らない。設定ファイル（マニュフェストファイル）をgit管理があるべき姿だ　くらいは思うのが自然な流れではないでしょうか
--configをつければ設定ファイル（マニュフェストファイル）が指定できるので
```
>kind create cluster --config=kind-cluster.yaml
```
と、打てばよくて
あとは、この↓サンプルkind-cluster.yaml に希望クラスタ名を書いておけば良いハズなので
```
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
```
サンプルのyamlも、クラスタ名が「Cluster」というヒネリのない名前になってる、、、
これを「kind-2」に書き換えて・・・・・・


はイケません
name: kind-2　を1行追加するのが正解です

# KindでKind作ってマニュフェストファイルの種類もKindで指定
 少し進むと、そこは DeplymentとかServiceとかマニュフェストファイルの種類を書く場所だと分かるのですが、先入観＋謎エラーメッセーに捕らわれると、案外ハマりました
Kind: Cluster　の 「kind」は、「kubernetes kindの　kind」でなく「中学英語で出てくる 種類の意味の kind」とのことです。せてめて「kinds」にしておいてくれたら個人的には「親切」を感じだのですが、それは先人達の決められたことでございます

この記事が同士に届くことを祈っています

では、よいk8sライフを
Go言語のデメリットって結局なんなの？

# はじめに
Go言語はシンプルで明示的なコードという点を非常に重要視している言語であると言えます。
言語の方向性の違いという面で`Python`や`Ruby`に比べて書きにくいと感じてしまう事が多々ある人も少ないくない事でしょう。

本記事では一般的にGo言語で「デメリットと言われている点」について深掘りして話をできればと思います。

# 一般的に言われるデメリット
- 例外処理がない
- 三項演算子がない
- 継承ができない
- 関数オーバーロードがない
- 演算子オーバーロードがない

以下ではこれらについて解説します。


## 例外処理がない
### 例外処理とは？
例外処理とは、プログラムの実行中に発生する予期せぬエラーや異常な状況を処理する仕組みです。多くのプログラミング言語では、`try`、`catch`、`finally`などのキーワードを使用してエラーをキャッチし、適切に対処します。

:::note info
### goのエラー処理と例外処理
以下のようなエラー処理を行うがこれは**例外処理とは全く異なるもの**である。
```go
result, err := someFunction()
if err != nil {
    return err
}
```
#### パニック（panic）とリカバー（recover）
Goには、例外的なエラー処理として`panic`と`recover`があります。これを利用することで、例外のような動作を再現することが可能です。

:::

### デメリット(例外処理がないことでの)
- 冗長なコードが発生しやすい
- ネストが深くなり、可読性が下がる場合がある
- すべてのエラーを明示的に処理しなければならないため、些細なエラーが冗長に扱われることがある

### メリット(例外処理がないことでの)
- エラーを無視できない
- コードの可読性が向上




## 三項演算子がない
### 三項演算子とは？
三項演算子は、条件に基づいて値を選択する簡潔な方法です。多くの言語で `condition ? valueIfTrue : valueIfFalse` の形で使用されます。

:::note info
### Goでの代替方法
goでは以下のように条件分岐を使って複数行で書かれている。
```go
var result string
if age >= 18 {
    result = "大人"
} else {
    result = "未成年"
}
```
:::


### デメリット(三項演算子がない)
- コードが少し冗長になる
- 簡単な条件判断でも複数行が必要
### メリット(三項演算子がない)
- コードの明確さ
- 複雑な条件判断が容易


## 継承ができない
### 継承とは？
継承は、あるクラスの特性と振る舞いを別のクラスが引き継ぐオブジェクト指向プログラミングの概念です。

:::note info
### Goでの代替方法
Goでは継承の代わりに、以下のような方法が使われます。
1. インターフェースの使用
2. コンポジションの使用
:::


### デメリット
- 既存のコードの再利用が制限される
- オブジェクト指向プログラミングにおける典型的な継承パターンが使えない
- 共通のコード共有が複雑になる可能性がある

### メリット
- クラス継承による深い階層が排除され、シンプルな設計を強制する
- 継承による複雑な依存関係を避けられる





## 関数オーバーロードがない
### 関数オーバーロードとは？
関数オーバーロードは、同じ名前で異なる引数の型や数を持つ関数を定義できる機能です。

:::note info
Javaなどの場合は以下のようにオーバーロードができる
```java
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
```

Goでは、関数オーバーロードの代わりに以下の方法を利用して柔軟な関数呼び出しを実現します
1. 異なる名前の関数を使う
2. 空インターフェース（interface{}）を使う
3. ジェネリクスを使う（Go 1.18以降）
4. 可変長引数を使う
:::


### デメリット(関数オーバーロードがない)
- 同じ機能の関数に異なる名前をつける必要がある


### メリット(関数オーバーロードがない)
- 型安全性
- コードの明確さ


## 演算子オーバーロードがない
### 演算子オーバーロードとは？
演算子オーバーロードは、ユーザー定義型に対して標準的な演算子（+, -, *など）の動作をカスタマイズする機能です。

### デメリット(演算子オーバーロードがない)
- 柔軟性の欠如
- コードが冗長になる可能性

### メリット(演算子オーバーロードがない)
- コードの明確さ
- 動作が予測可能(動作が保証される)

# これらはデメリットではない
結局のところGoは以下の３点の理由があるため、他の言語と比べてこれらの問題があるのではないでしょうか？
1. 明確さの追求：コードの意図を常に明示的に表現する
2. シンプルさの重視：不必要な複雑さを排除する
3. 一貫性の確保：予測可能で理解しやすいコードを書く

# おわりに
他言語をベースにして考えていくとGoでは息苦しさを感じることもあるかも知れません。しかしながら、実際には堅牢で読みやすいコードを書くための洗練された設計であると言え、これはGoの良さであると考えています。

**Goに入れば郷に従え**ってことですね。
最初に「あい」を学ぶことば日本語でプログラミング入門（ステップ３ プロデルの場合）

# はじめに
本記事シリーズは母国語のプログラミング言語が存在するという文化的価値をアピールするためのもので、プログラミング一般の入門を意図するものではありません。ステップ３としては、実用的な日本語プログラミング言語では第２世代に入る「プロデル」で「あい」を学んでいきます。ついでにプログラミングの妙を遊ぶというお題となります。

## プロデル
プロデルは、日本語に近い語順で記述できる、オブジェクト指向の中間コードコンパイラ言語です。中間コードは共通言語ラインタイム(CLR)[^1]で、.NETアプリケーションと同じ実行環境で動きます。実装言語はC#。インタプリタ版もあります。
プロデル言語を.NET CoreのCLR中間コードにコンパイルするバージョンとしてスミレがあり、Webアプリケーションの次世代実行環境であるのWebAssemblyアセンブリ言語をコンパイル出力するようにしたスミレ畑があります。


## プロデルの入手方法
プロデル(Windows版)を下記の公式サイトからダウンロードできます。

https://produ.irelang.jp/downloads/


# お題のソースコード

```mind:ai.rdr
あいとは
    人や物事を大切に思う心。
```
これをプログラムとして実行してみます。プロデルの場合、サブルーチン的な概念を「手順」と呼んでおり、それを定義宣言する際にも「手順」というワードが必要になります。
実行エントリポイントのコード「あい」は手順の定義より手前に記述します。

```
人は　　「自分や自分以外の人間、」
物事は　「もろもろの物や事柄などを」
大切は　「大事に思っている心のありようのことで、漢字では[「]愛[」]と表記します。」

あい。

【人】や【物事】を【大切】に思う心手順
    「[人][物事][大切]」を表示
終わり。

あい手順
    人や物事を大切に思う心
終わり。
```


#  お題のソースコード実行結果
実行結果です。実行環境はプロデルデザイナです。

![prodelai1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/169693b7-dc8f-27fd-4456-a83710a85e28.png)



# おわりに
いかがでしたでしょうか？わたしはわが国に母語によるプログラミング言語が存在することを誇りに思っております。言語は文化。こんにちの日本語のポップスやアニメソングなどが海外でそのまま歌われるような近況を鑑みますと、純然たる技術基盤として超強力な米欧発プログラミング言語勢と存在意義を争うこともなく、日本語の文化として海外でも日本語プログラミング言語の愛される日が来るのやもしれません。

[^1]: Common Language Runtime, CLR は.NETアプリケーションを実行するための仮想機械
TerraformでProxmox VEのLXCを払い出す

# はじめに
こんにちは たそ(@taso_int)です。
普段ははてなブログで技術ブログを投稿しております。
良かったら見てください。
https://taso-int.hatenablog.com/archive

今回はアドベントカレンダーということで、Proxmox VEについて書こうと思います。
本当はもうちょい凝ったものを出したかった…
Proxmox VEの説明については省略します。
仮想環境を提供できるプラットフォーム的なものです。

今回TerraformにProxmoxプロバイダーがあるので、それを利用してLXCを作成したいと思います。
LXCだけでなくVMも作成することが可能です。

今おうちK8sを作成しようとしていて、ノード数をTerraform側で制御出来たら面白いなと思った次第です…

## 環境

- Proxmox VE v8.2.2
- Terraform環境
  - WSL(Ubuntu 22.04.3 LTS)
  - Terraform(v1.9.8)
  - Proxmox Provider(3.0.1-rc6)

WSLからProxmox VEに対してTerraformを動かすイメージを持っていければと思います。

## Proxmox プロバイダー

https://registry.terraform.io/providers/Telmate/proxmox/latest/docs

- proxmox_vm_qemu（VM）
- proxmox_lxc（LXC）

仕組みとしてはProxmox側でAPIが提供されているので、それを利用しているものだと思われます。
今回は２番目のLXCを作成するリソースを利用したいと思います。
またドキュメントではTerraform用のProxmoxユーザーとロールを作成する必要がありますが、私しか使わないためrootで実施します。

## Terraform コード類
Terraform初心者なので、かなり簡易なつくりになっています。

<details><summary>main.tf</summary>

```tf
terraform {
  required_providers {
    proxmox = {
      source  = "Telmate/proxmox"
      version = "3.0.1-rc6"
    }
  }
}

provider "proxmox" {
  pm_api_url      = "https://192.168.137.100:8006/api2/json"
  pm_user         = "root@pam"
  pm_password     = var.pm_password
  pm_tls_insecure = true
}

resource "proxmox_lxc" "k8s_node" {
  for_each    = var.nodes
  target_node = "taso" # Proxmox側ノード名
  vmid        = each.value.vmid
  hostname    = each.value.hostname
  ostemplate  = "local:vztmpl/vzdump-lxc-100-2024_11_18-00_37_13.tar.gz" #普通のコンテナイメージでも可
  cores       = 2
  memory      = 2048
  swap        = 512
  password    = var.lxc_password

  rootfs {
    storage = "local-lvm"
    size    = "10G"
  }

  network {
    name   = "eth0"
    bridge = "vmbr0"
    ip     = each.value.ip
    gw     = "192.168.137.1"
  }
}

```
</details>

<details><summary>variables.tf</summary>

```tf
variable "pm_password" {
  description = "Proxmox API password"
  type        = string
  sensitive   = true
}

variable "lxc_password" {
  description = "Password for LXC container"
  type        = string
  sensitive   = true
}

variable "nodes" {
  description = "Configuration for LXC nodes"
  type = map(object({
    vmid      = number
    hostname  = string
    ip        = string
  }))  
  default = {
    "master" = {
      vmid     = 101
      hostname = "k8s-master"
      ip       = "192.168.137.10/24"
    }
    "node1" = {
      vmid     = 102
      hostname = "k8s-node1"
      ip       = "192.168.137.11/24"
    }
    "node2" = {
      vmid     = 103
      hostname = "k8s-node2"
      ip       = "192.168.137.12/24"
    }
  }
}

```
</details>

## 試してみる
初回実行は`Terraform init`が必要になります。

またパスワードを環境変数に登録します。
```
export TF_VAR_pm_password=<Proxmox側のパスワード>
export TF_VAR_lxc_password=<LXCで設定するパスワード>
```
`Terraform apply`を実行します。

`Apply complete!`がでれば成功ですね。

UIでも作成されています。起動する必要はありそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269290/de41eee4-0fb4-d217-4653-f81f43761cce.png)


## 改善ポイント
以下改善したいポイントで機能として追加したいです。

- node側のノード数を増やせる設計(Countとかで増やせるのが理想)
- Terraformのモジュール化（かっこよさそう）
- IP周りの管理（NetBoxと組み合わせてアドレスを管理する）

# 最後に

ここまで読んでいただきありがとうございました。
おうちK8sを完成して、K8sの勉強をしたいと思います。
Azure Data Factory でコピーアクティビティを使用して差分更新を行う方法


# はじめに
Azure Data Factory を利用するユーザーにとって、頻繁に使用されるコピーアクティビティ。今回、差分更新を一括で実施する必要が生じたため、その方法を調べました。本稿では、その結果を備忘録としてまとめています。

# 内容
※注意：コピーアクティビティの基本的な追加手順については割愛しています。
### 差分更新の設定方法
Azure Data Factory のコピーアクティビティには、直接的な差分更新の設定項目はありません。そのため、動的コンテンツを利用して式を記述する必要があります。

***設定手順***
コピーアクティビティの「最終変更日時でフィルター」という項目に、以下のような式を記載します。これにより、差分更新を行うことが可能になります。

今回は、デイリーバッチ処理を想定として以下の式を使用しました。
```
@formatDateTime(addDays(pipeline().TriggerTime, -1), 'yyyy-MM-ddTHH:mm:ss')
```

***設定例***
以下の画像の赤枠部分に、上記の式を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3340799/59d36ec6-8843-498d-efc0-db04b5e9cf1f.png)

### 他のバッチ処理時間に応じた設定例
マイクロソフト公式ドキュメントには、動的コンテンツの例が紹介されています。以下の表を参考に、任意のバッチ処理時間を設定することができます。

| 繰り返し          | 動的コンテンツ                                                                                      |
|-------------------|-----------------------------------------------------------------------------------------------|
| 分単位            | `@formatDateTime(addMinutes(pipeline().TriggerTime, -<your set repeat minute>), 'yyyy-MM-dd HH:mm:ss')` |
| 1 時間ごと         | `@formatDateTime(addHours(pipeline().TriggerTime, -<your set repeat hour>), 'yyyy-MM-ddTHH:mm:ss')`    |
| 毎日              | `@formatDateTime(addDays(pipeline().TriggerTime, -1), 'yyyy-MM-ddTHH:mm:ss')`                        |
| 週単位            | `@formatDateTime(addDays(pipeline().TriggerTime, -7), 'yyyy-MM-ddTHH:mm:ss')`                        |

これらの例を参考にすることで、任意のバッチ時間に応じた差分更新処理が可能になります。

# まとめ
Azure Data Factory を使用することで、差分更新を活用した効率的で自動化されたデータ転送が可能になります。適切な差分検出ロジックを設計し、コピーアクティビティと動的コンテンツを組み合わせることで、安定した運用が期待できます。また、作業負荷の軽減や運用コストの最適化にもつながるため、ぜひ活用してみてください。

# 参考文献
https://learn.microsoft.com/ja-jp/fabric/data-factory/tutorial-incremental-copy-files-last-modified-date
TermuxとNgrokを使って自宅サーバーを公開した（まだできてない）

## TermuxとNgrokでAndroidで自宅サーバーを公開する方法

最後までできていません。お許しを
できたらすぐに更新したいと思います。

## はじめに

外で、ちょっとしたAPIを作りたいなと思った時に、すぐに作れるよう、

家で余っている古いAndroidタブレットをサーバー化し、ngrokで外部ネットワークに公開した。

::: note
ポート解放なし・パソコンをサーバー化するより省電力！
:::

### 筆者の環境
Androidのシステム：Android 6.0.1
Ngrok：無料版

## Termuxのインストール

https://play.google.com/store/apps/details?id=com.termux&hl=ja&pli=1

Termuxアプリのインストール。
通常のアプリと同じようにインストールする。

OSバージョンが古すぎて、Google Storeで、インストールできなかったので、APKファイルをダウンロードして、手動インストールした。

## 必要なものをインストール

Termuxでは、パッケージのインストールに`pkg`を使う。
```
pkg install openssh
pkg install iproute2
pkg install tree
pkg install git
```
とりあえず、よく使うものをインストール。
\
上から、
* SSH
* ネットワークの状態を確認する
* tree コマンド
* git コマンド

最後に、
```
pkg update
pkg upgrade
```

## SSHから触れるようにする

タッチパネルのキーボードは嫌なので、sshでiPadから触ることにした。

sshのアカウントを設定してから、`iproute2`でipアドレスを特定し、
iPadのa-shellから、ssh接続。

この記事を参考にした。↓

https://qiita.com/Maki-HamarukiLab/items/05ccabba68703a7d7892

::: note
a-shellとは、iOSで動くターミナルアプリ。
ローカルについては権限がほとんどなく、何もできないが、
SSHを使えるのが強い
ちなみに、ローカルでPythonを動かせたりする
:::

## Node.jsでHello World

iPadから、ssh接続できたら、
とりあえず、Webサーバーを建てたかったので、
僕の一番よく知っているNode.jsをインストール。
```
pkg install nodejs
```

パソコンから`JavaScript`で`Hello World`をちょこっと書き、
GitHub経由で、サーバーに移す。

```
git clone https://github.com/*******/******
```

最後に、サーバー起動！
```
node app.js
```

`Hello World`のプログラム参考↓
``` js app.js 
const http = require("http");

const server = http.createServer();

server.on("request", function (req, res) {
  res.writeHead(200, { "Content-Type": "text/plain" });
  res.write("Hello World");
  console.log("リクエストがきたよ");
  res.end();
});

server.listen(8080);
console.log("server listen...");
```

では、このWebアプリケーションを外部公開していく。


## ngrokで公開する

### ngrokとは
ポート解放なしで、ローカルなアプリケーションを外部に公開できる。

無料版でも意外と使えるので、マイクラのサーバー立てる時とかにも使えそう。

::: note
公式ドキュメントにマイクラみたいなゲームサーバーを公開できるよと書いてたよ
:::
### インストール

termuxにインストールをするのは、
いいのを見つけたので、これを使ったらすぐにインストールできた。

https://github.com/Yisus7u7/termux-ngrok

### Ngrokのアカウントの作成

https://ngrok.com/

で、サインアップして、
ダッシュボードの`YourAuthToken`から、トークンをコピーしておく。

### トンネリング開始
```
npx ngrok authtoken [コピーしたトークン]
```

これで、認証情報を保存。

公開したいWebサーバーを起動して、
```
ngrok http [ポート番号]
```

これで、外からアクセスできるURLを示してくれるので、それにアクセスして、

Hello Worldと出たら成功なのだが、
出なかった

なにやら、トンネリングは成功しているものの、
Ngrok Clientから自作Webアプリにアクセスできないらしい

http://localhost
で、動いてるかを確認しろとのこと

```
crul http://localhost
```
早速、手動でGET requestを送ると、
ちゃんとHello Worldが動いた

Ngrok側の不具合らしい
とりあえず再インストールしたができなかった

今の所、この問題が解決せず詰まっている。
できたら更新する予定。
日頃使っているキーボード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821686/50ee8109-6084-a071-a11f-fc07c08dfae0.png)

## 本体
rk61 RGB
Aliexpressで1万円以下で買える無線キーボード、アマゾンでも買えるが多少高い

### キー
キーはRoyalKludge独自のCherryMX系
赤、茶、青から選択可能
赤の体感はGateron赤と遜色がないレベル、というかほぼ差がない
強いて言えばキーストローク時にコスコスといった擦れる音が大きいような気がするレベル
ホットスワップ対応

### サイズ感
60%(61Key)のいいところは取り回しの良さ
なんですが、このコめちゃめちゃに重いです
理由は空洞音を抑えるために基盤とプレートの間にフォーム材が充填されてその重さが大きいです
その分、音の響き方は同価格帯と比べると群を抜いて良いです

### 接続性
接続方式はBluetooth, 有線(TypeC), 無線(付属ドングル)
バッテリーは大体1週間程度持ちます
オートスリープからの復帰も早くて良いです

### カスタマイズ性
公式のソフトを入れればLEDのカスタマイズやマクロ、リマップなんかもできます
本体に保存されるので、一度設定すればどこでもその設定を使えるのもGOOD

中華なので多少の歪みがある個体もあるそうです
うちのコは大丈夫でした。

### カスタマイズ
このキーボード、写真に写っている僕のやつはキーキャップもキースイッチも置き換えてます
スイッチはGateron Milky Yellow Pro V3
重めの打鍵感とコトコト感がかなり心地よいです
なれないうちは重いので長時間やってると疲れるかも
50pf / min:2.0mm / max:4.0mm 

キーキャップはアリエクで買った安いやつ
材質はPBTでザラザラしててデフォルトのABSより感触が良いです
印字が手前にあるので上からの見た目は無刻印でかなりおすすめ
悪い点を上げるとするならばLEDがキースイッチ後方にあるのに印字が前なので最手前の列のキーはほぼ光ってないです
起業するならElixirシリーズSTEP18.財務戦略

https://qiita.com/Yoosuke/private/606bc7938b488ce90a6d

こちらの続きです。

経営戦略、事業戦略、機能戦略ときたら最後、財務戦略です。

戦略多すぎですよね。僕もこんなに戦略作らないといけないの？と思っています。
起業フェーズと経営フェーズでは全然、スキルセット違うなと改めて思います。
また、これだけ多くの戦略を作るには一人じゃ無理なので、この辺りをお願いできる人を入れる必要があります。

## 財務戦略
それでは、早速財務戦略についてみていきましょう。と言っても、ここはやはり、CFOが必要な分野だと思います。しかし、CFOと話しをするにも、知ってないと会話できないですよね。という基本的なところをここでは抑えておきましょう。

財務戦略の基本的な要素について、スタートアップの経営者の視点から解説していきましょう。

## 財務戦略の基本的な要素

### 1. 資金調達（ファイナンス）
- 事業成長に必要な資金をどのように調達するか
  - エクイティファイナンス（株式発行による資金調達）
  - デットファイナンス（借入金による資金調達）
  - その他（補助金、助成金等）
- 各調達方法のメリット・デメリットを理解し、成長フェーズに応じた最適な調達手段を選択

### 2. キャッシュフロー管理
- 事業継続に必要な現金の確保
- 売上入金サイクルと支払いサイクルの管理
- 運転資金の適切な見積もりと確保

### 3. 財務KPIの設定と管理
- 売上総利益率（粗利率）
- 営業利益率
- EBITDA（金利・税金・償却前利益）
- フリーキャッシュフロー
- 月次固定費

### 4. 投資判断
- 設備投資や人材採用などの投資判断基準の設定
- ROI（投資収益率）の計算と評価
- 投資の優先順位付け

## スタートアップ経営者として最低限押さえるべきポイント

1. **資金ショートを防ぐ**
   - 常に向こう6ヶ月分の運転資金を確保
   - 週次での現金残高管理
   - 資金繰り表の作成と定期的な更新

2. **投資家との対話**
   - 財務諸表（PL/BS/CF）の基本的な理解
   - 事業計画における財務計画の策定
   - 資金調達における適切な企業価値評価

3. **税務・会計の基礎知識**
   - 会計期末の決算対応
   - 税務申告の基本的な理解
   - 監査対応の準備

## CFOを採用する際のポイント

1. **求められるスキルセット**
   - 財務戦略の立案・実行能力
   - 資金調達の経験
   - 管理会計・財務会計の知識
   - ビジネスパートナーとしての戦略的思考力

2. **採用のタイミング**
   - シリーズA以降の資金調達を検討する段階
   - 月商1億円を超える規模に成長した段階
   - 管理部門の体制構築が必要になった段階

3. **初期段階での代替案**
   - 経験豊富な税理士・会計士との顧問契約
   - パートタイムCFOの活用
   - 財務・経理の実務経験者の採用

財務戦略は事業の持続的な成長を支える重要な要素です。完璧な理解は難しくても、基本的な考え方を押さえることで、CFOとの効果的な協業が可能になります。また、事業規模に応じて段階的に体制を整備していくことで、無理のない形で財務機能を強化するこができます。

CFOが必要なタイミングは正直、正解は無いと思っています。最初からいた方がいいに決まってますw
ただ、最初から参加してくれる優秀なCFOを探すのは無理だと思います。よほど、知っているか自分が連続企業で成功してるかなど、なので弊社では外部のパートナーCFOに現在はお願いしてます。

もし、CFOをやりたいという方いましたら、ぜひお声がけください。
Clojure: DuctでRSSリーダーを作る - Ductとは

![advent_calendar_2024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/f4cd8ce0-6352-a1d8-4cae-f39dd44f4def.png)

[*Advent Calendar 2024 Day 19*](https://qiita.com/advent-calendar/2024/clojure)

昨日まで `Ring` を用いてTodoアプリを作ってきました。

今日からはClojureのフレームワークである、`Duct`を用いてRSSリーダーを作っていきます

https://github.com/duct-framework/duct

:::note warn
前提
- Javaがインストールされていること
- leiningenがインストールされていること
:::

## プロジェクトセットアップ

シンプルなDuctのセットアップは簡単にできます

```bash
$ lein new duct <your project name>
```

ただ、追加の機能を指定してセットアップすることもできます

- `+api`
    - APIを作成するのに便利なミドルウェアとハンドラーを追加
- `+ataraxy`
    - Ataraxyルーターを追加
- `+cljs`
    - ClojureScriptのコンパイル環境とホットリロード機能を追加
    - フロントエンド用のClojureScriptをビルドするためのツール（例: shadow-cljs）をセットアップ。
- `+example`
    - サンプルハンドラーを追加
- `+heroku`
    - Herokuへのデプロイに必要な設定を追加
- `+postgres`
    - PostgreSQLを使用するための依存関係とデータベースコンポーネントを追加
- `+site`
    - Webサイト向けのミドルウェア、favicon、WebJars、その他便利なツールを追加
- `+sqlite`
    - SQLiteを使用するための依存関係とデータベースコンポーネントを追加

今回は `api` と `ataraxy` を指定してセットアップします

```
$ lein new duct clojure-rss-reader +api +ataraxy
```

試しに起動してみます

```
$ lein run
Retrieving duct/database.sql.hikaricp/0.4.0/database.sql.hikaricp-0.4.0.pom from clojars
Retrieving duct/database.sql/0.1.0/database.sql-0.1.0.pom from clojars
...
(省略)
...
24-12-17 00:14:47 oookamasashinoMacBook-Air.local REPORT [duct.server.http.jetty:13] - :duct.server.http.jetty/starting-server {:port 3000}
```

どうやら `3000`portで起動できたようです

まだルーティングを設定していませんが、リクエストを送ってみます

```bash
$ curl localhost:3000           
{"error":"not-found"}
```

`404`ですがレスポンスが帰ってきました

これでプロジェクトがセットアップできました。

## 構成

プロジェクトをセットアップすると、以下のようになっていると思います

```
clojure-rss-reader/
├── README.md
├── dev
│   ├── resources
│   │   └── dev.edn
│   └── src
│       ├── dev.clj
│       └── user.clj
├── project.clj
├── resources
│   └── clojure_rss_reader
│       ├── config.edn
│       └── public
├── src
│   ├── clojure_rss_reader
│   │   ├── handler
│   │   └── main.clj
│   └── duct_hierarchy.edn
└── test
    └── clojure_rss_reader
        └── handler
```

少しこれを解説します

### `/dev`

これは開発環境用の設定やコードを配置するディレクトリ

例えば、REPLの初期化用コードを置いたり、開発用の設定（データベース設定）などを置いたりする場所です

### `/resources`

構成ファイルや、静的リソースを格納するディレクトリ

例えば、データベース情報、ログ設定、環境変数などアプリケーションに必要な設定値を置けます

### `/src`

アプリケーションの本体の実装を置くディレクトリ

### `/test`

アプリケーションのテストコードを置くディレクトリ

### まとめ

|ディレクトリ|役割|
|----|----|
|`/dev`|開発環境専用の設定|
|`/resources`|アプリケーションの設定、静的リソース|
|`/src`|アプリケーションのコード|
|`/test`|テストコード置き場|

これらのディレクトリ構成を適切に活用し、効率よく開発を進めることができます
テストの指標（カバレッジ編）

# はじめに
先日、テスト指標について話題に上がりました。
テスト密度、バグ検出率など色々ありますが、まずはカバレッジについて纏めていきます。


# カバレッジ(網羅率)
カバレッジとはテストが実施された割合です。

### C0：命令網羅（ステートメント・カバレッジ）
全ての命令文が実行されるようにテストする。
命令文が呼ばれないケースは含まない。
```c#
if (x && y) { // (1)
    if (z) { // (2)
        GetData(); // (A)
    }
}
```
のような場合、処理(A)が呼ばれるケースのみ実施すればよい。
つまり
| No. | x | y | z | 備考 |
|:-:|:-:|:-:|:-:|:-:|
| 1 | true | true | true | 分岐(1)に入る ⇒ 分岐(2)に入る ⇒ 処理(A)が実行される |

のケースを実施すれば、命令網羅したことになります。

### C1：分岐網羅（ブランチ・カバレッジ）
全ての分岐を通るようにテストする。
分岐がTrue、Falseの場合の網羅なので、分岐条件の網羅はしない
例えば
```c#
if (x && y) { // (1)
    if (z) { // (2)
        GetData(); // (A)
    }
}
```
のような場合、分岐(1)(2)に入る/入らないを網羅すればよい
つまり
| No. | x | y | z | 備考 |
|:-:|:-:|:-:|:-:|:-:|
| 1 | true | true | true | 分岐(1)に入る ⇒ 分岐(2)に入る |
| 2 | true | true | false | 分岐(1)に入る ⇒ 分岐(2)に入らない |
| 3 | false | true | true | 分岐(1)に入らない |

のケースを実施すれば、分岐網羅したことになります。


### C2：条件網羅（コンディション・カバレッジ）
個々の条件式の真偽を、それぞれ含むようにテストする。
それぞれを網羅するが、複合条件の網羅はしない
例えば
```c#
if (x && y) { // (1)
    if (z) { // (2)
        GetData(); // (A)
    }
}
```
のような場合、x、y、zのtrue/falseをそれぞれ網羅すればよい
つまり
| No. | x | y | z | 備考 |
|:-:|:-:|:-:|:-:|:-:|
| 1 | true | true | true |  |
| 2 | true | true | false | No.1、No.2でzのtrue/falseを網羅 |
| 3 | true | false | true | No.1、No.3でyのtrue/falseを網羅 |
| 4 | false | true | true | No.1、No.4でxのtrue/falseを網羅 |

のケースを実施すれば、条件網羅したことになります。

### MCC：複合条件網羅（マルチコンディション・カバレッジ）
個々の条件式の真偽を、全ての組み合わせでテストする。
条件をすべて網羅する
```c#
if (x && y) { // (1)
    if (z) { // (2)
        GetData(); // (A)
    }
}
```
のような場合、x、y、zのtrue/false全パターンを網羅すればよい
全パターンを書き出すと
| No. | x | y | z | 備考 |
|:-:|:-:|:-:|:-:|:-:|
| 1 | true | true | true |  |
| 2 | true | true | false |  |
| 3 | true | false | true |  |
| 4 | true | false | false |  |
| 5 | false | true | true |  |
| 6 | false | true | false |  |
| 7 | false | false | true |  |
| 8 | false | false | false |  |

のケースとなります。
3～8は分岐(1)に入らない為、分岐(2)の判定は行われません。
つまり
| No. | x | y | z | 備考 |
|:-:|:-:|:-:|:-:|:-:|
| 1 | true | true | true |  |
| 2 | true | true | false |  |
| 3 | true | false | true |  |
| 4 | false | true | true |  |
| 5 | false | false | true |  |

を実施すれば、複合条件網羅したことになります。


### その他
他にも「行カバレッジ」や「関数カバレッジ」と言うものなどがありますが、指標にしにくいので割愛します。
* 行カバレッジ
テストで実行した行の割合（テスト密度に似ているが少し違う）
* 関数カバレッジ
テストで実行した関数の割合
エンジニア特有のやる気低下、まあ仕方ないよね

# はじめに
「やる気が出ない……」  
このフレーズを心の中でつぶやいた経験が少なくないはず。  
でも、それってエンジニアとして働いていれば避けられないことなのかもしれません。  
この記事では、エンジニア特有のやる気低下の理由を挙げて、エンジニアが「まあ仕方ないよね」と開き直れる手助けになったり、非エンジニアがエンジニアの理解を増進できるきっかけになればいいなと思って書きます。

# エンジニア特有のやる気が出ない理由

## 勉強し続けるプレッシャー
「新しいフレームワーク？また出たの？昨日覚えた技術が古くなるの、速すぎじゃないですか？」
エンジニアは常に新しい手法や技術を学び続けなければならない職業。これは楽しい反面、いつまでも勉強をし続けなくては行けないプレッシャーがあったり、周囲のエンジニアと自分のスキル差を感じて、自己評価が下がることも。また、業務と学習の両立が難しく、キャリアへの不安がやる気を削ぐこともあります。

## 分かりやすい結果が出るまで時間がかかる
「頑張ってバグを直したけど、ユーザーには何も見えないし、チームにもあまり評価されない。達成感ってどこ？」
エンジニアは「目に見えない成功」を地道に積み重ねることも多い職業。だからこそ、気づかれない努力も多く、やる気が薄れがちです。

## 細かすぎる問題ばかりで気力を失う
「0.1秒の改善に3時間かける...この繊細さ、芸術家の域では？」
細かい修正が続くと、大きな目標や仕事の意義を忘れてしまうこともあります。また同じバグが何度も再発し、イライラしてやる気が削がれるときも。

## コードレビューでダメ出しを受ける
「コードレビュー、もはや心のライフ値がゼロです...」
レビューは成長のチャンス。でも、批判的なコメントばかりだと、自分自身を否定された言葉ではないとは分かっていてもモチベーションが下がってしまうのも事実。

## 技術以外のタスクが多すぎる
「なぜドキュメントの整備がこんなに面倒くさいんだろう？」
エンジニアリングそのものよりも、会議や資料作成に追われると、やる気が低下します。また、要件や仕様が曖昧なまま進める必要があるプロジェクトは、迷いや無駄な作業が増えてストレスになります。

# おわりに
「あるある！」と感じる部分があれば、それはエンジニアとして働く上での“職業病”みたいなものなのかもしれません。
大切なのは、やる気が出ない原因を理解して、「まあこんなもんか」と軽く流すこと。そうすれば、次のやる気が出るタイミングを迎える準備ができるはずです。
やる気がないときは無理せず休むのもスキルのひとつ。焦らず、自分のペースでいきましょう！
他にもエンジニア特有のやる気低下の原因がありましたら、コメントください！
【Python】PydanticUserErrorの原因は、モジュールをフィールドとして誤認識していたためだった...

# 概要
FastAPIのアプリをAWS Lambdaで動かそうとしたら以下のエラーが発生しました。
解決方法を紹介します。

> [ERROR] PydanticUserError: A non-annotated attribute was detected: `os = <module 'os' (frozen)>`. All model fields require a type annotation; if `os` is not meant to be a field, you may be able to resolve this error by annotating it as a `ClassVar` or updating `model_config['ignored_types']`.


## 解決方法
エラーメッセージから察するに、Pydantic（=データモデルの定義とバリデーションを簡単に行うためのツール）がクラスの属性として`os`モジュールを誤って認識してしまっているのが原因。

具体的には、以下のように、2回モジュールをインポートしてしまっていました。

```py
import os
from pydantic import BaseModel

class MyModel(BaseModel):
    import os  # これが原因でエラーが発生する

    name: str
    age: int
```

この場合、Pydanticが`os`モジュールをフィールドとして誤認識し、型注釈がないためエラーが発生していたのだと思われます。

`import os`を1回だけにしたらエラーは無くなりました！
ユニバーサルリンク対応(サーバサイド)

DynamicLinksが終了するため、自前でユニバーサルリンクに対応させたので、その時のメモです。
サーバサイドは最低限以下をやる必要があります。

1. ディレクターやアプリ担当者とアプリで起動させるURLを決める
    * スマートフォン内でどのURLがタップされた時に、アプリを起動するかを決めます
1. 「apple-app-site-association」ファイルを作成してサーバに配置する
    * 設置場所 ```https://example.com/.well-known/apple-app-site-association```
    * 必ず ```/.well-known/``` の配下に「apple-app-site-association」のファイル名で配置します
    * AppleのCDNがアクセスできるよう、IP制限や認証での制限に注意しましょう(特にステージング環境)

apple-app-site-associationの内容
```
{
  "applinks": {
    "details": [
      {
        "appIDs": [
          "***********"
        ],
        "components": [
          {
            "/": "/item/detail/*"
          },
          {
            "/": "/news/*",
            "exclude": true,
            "commentt": "newsのアプリでの起動を廃止"
          }
        ]
      }
    ]
  }
}
```

「appIDs」は ```<チームID>.<バンドルID>``` です。
カンマ区切りで複数設定する事もできます。

上記の場合は
```https://example.com/item/detail/99```
のような商品詳細ページのURLをスマホでタップすると、アプリがインストールされている場合アプリで起動します。
アプリ側でURLとパラメータの「99」を取得して表示すべき画面を判断します。

componentsには複数指定できるので、細かく制御する事ができます。
以下のような設定が出来ます。

|設定項目 |説明 |
|---|---|
|"#":"" |フラグメントの指定 |
|"/":""	|パスの指定|
|"?":{"":""} |クエリパラメータの指定 |
|"exclude":true	|trueで設定すると該当の条件は発動しない |
|"comment":"" |	コメント |

やる事は意外とシンプルです。
細かく追及していくと、色々と工夫しないといけないところは出てきますが、基本はコレだけです。

参考：https://developer.apple.com/videos/play/wwdc2019/717
Sequence Makerでコンマ区切りのデータを分割する

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerを使ってデータ取得していると、複数のデータがコンマなどで区切られて送られてくる場合があります。今回はこれをいい感じに分割する方法を紹介します。なお、Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## 例えばこんなデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/21b98726-4ed8-cb77-85c6-dc8edb118f02.png)

測定値がコンマで区切られています。このままではExcel上で扱いずらいので、各セルに分割したいところです。

## 方法1：Sequence Makerの「区切り文字で分割」を使う
Sequence Makerには区切り文字で分割する機能があります。リボンタブのオプションにある「区切り文字で分割」に✅を入れるだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/ed9a7756-87d2-c6fd-d3c8-6473fc215000.png)

そして実行すれば、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/3d58efdb-283c-ae58-d947-eedb788bddf2.png)

ほらできた。ちなみに区切り文字は詳細設定の出力オプションでカスタマイズ可能です。デフォルトでは「,」「;」「/」の3種類で分割されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/b5603861-d2ce-3c6b-206c-5a7795860470.png)

## 方法2：専用コマンドで分割する
上記の方法とほぼ一緒ですが、出力オプションでやると個々人のパソコンで✅を入れてもらわないとなりません。それだと困る場合があるので、区切り文字で分割する専用コマンドを入れておきます。「#SPLIT(ON)」と書いておくだけでOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/92befd98-2f1c-72ec-990e-103d229815b9.png)

## 方法3：ExcelのTEXTSPLIT関数を使用する
TEXTSPLIT関数を使用すると、コンマなどの区切り文字のデータを簡単に分割できます。以下の例ではF3のセルに「=TEXTSPLIT(D3,",")」という関数を入れて分割しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/c7a9dfbf-d05a-79c8-bac5-e3b63d099efe.png)

TEXTSPLIT関数のスゴイところは、なんと！分割したデータを縦方向にすることもできます！以下の例ではF3のセルに「=TEXTSPLIT(D3,,",")」という関数を入れて分割しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/e26a5b8b-1771-8382-377f-940138ec5fe4.png)

その他のオプションはネットなどで検索してみてください。

https://excel-ubara.com/excel1/EXCEL690.html

::: note alert
TEXTSPLIT関数は、Excel for Microsoft 365で使用できる関数です
:::

365なんて使ってねぇよ！という方は代替方法もあるにはあります。

https://www.patent-and-marketing.com/2023/07/17/textsplit%e3%81%ae%e6%a9%9f%e8%83%bd%e3%82%92excel2013%e4%bb%a5%e9%99%8d%e3%81%ae%e3%82%a8%e3%82%af%e3%82%bb%e3%83%ab%e3%81%a7%e5%ae%9f%e8%a3%85%e3%81%99%e3%82%8b/

## まとめ
TEXTSPLIT関数が無かった頃は、いろいろな関数を組み合わせたりしてデータを分割していました。それが今ではTEXTSPLIT関数一発で完了です。便利な世の中だなぁ。データ処理をする際には非常に便利な関数なので、ぜひ使いこなしてみてください！
<details>タグを使ってアコーディオンメニューを作る

# はじめに
学んだことを忘れないように備忘録として残しています

## detailsタグとは
**detailsタグ**は、クリックでコンテンツを表示・非表示にできるHTMLのネイティブ機能です。JavaScriptを使わずに簡単なアコーディオンメニューを作成できます。



## 使い方
1.detailsタグで全体を囲う
2.summaryタグ内に折りたたみ可能なヘッダー部分を記述


<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="pvzRJLr" data-pen-title="Untitled" data-user="vccpppsz-the-flexboxer" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/vccpppsz-the-flexboxer/pen/pvzRJLr">
  Untitled</a> by 柏木菜南 (<a href="https://codepen.io/vccpppsz-the-flexboxer">@vccpppsz-the-flexboxer</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>




## メリットとデメリット
### 【メリット】
- JavaScriptが不要
- 主要ブラウザ（最新のChrome, Firefox, Edge, Safari）はすべて対応
- 記述量が少なく、基本機能をすぐに利用可能

### 【デメリット】
- 見た目や動作の細かい制御（例えばアニメーション）には不向き
- 単一開閉の実装が必要: 複数のdetailsタグを使う場合、一度に一つしか開けない挙動を作るには追加の工夫が必要
- IEなど古いバージョンのブラウザでは動作しない場合がある


## JavaScriptを使う場合のメリットとデメリット
### 【メリット】
- 細かい制御が可能(開閉時にアニメーションを付ける。同時に開けるアコーディオンの数を制限するなど）
- 古いブラウザでも問題なく動作させられる

### 【デメリット】
- コードが複雑化


## まとめ
用途に応じた使い分けをしましょう！
- 簡易的なアコーディオン: detailsタグを使う
- 高度なカスタマイズが必要: JavaScriptを使う
はじめてのデータモデリング講座２（演習問題６つ）

https://qiita.com/uekkie/items/c6c23fb440cfc1d7edb3

以下は、データモデリングの演習に適した要件例です。これらの要件をもとに、イベントやリソースの抽出、対照表の設計の練習に使います。

## 演習.1
- スマホアプリでタスク管理システムを作成する。  
- ユーザーはタスクを作成し、期限、優先度、カテゴリを設定できる。  
- タスクは完了状態に変更可能で、進捗状況が一覧で確認できる。  
- ユーザーはタスクをチームで共有し、メンバーごとに担当者を割り当てられる。  
- 各タスクにはコメント機能があり、進捗状況を記録できる。  


## 演習.2  
- 図書館では本を管理することができる。  
- 本にはタイトル、著者、ジャンル、出版年を登録できる。  
- 会員は本を借りることができるが、貸出期間は14日間である。  
- 会員が本を返却しない場合、延滞料金が発生する。  
- 図書館は各本の貸出履歴を記録し、特定の本が現在貸出中かどうかを確認できる。  


## 演習.3  
- スポーツクラブでは施設を予約することができる。  
- 施設にはジム、プール、スタジオの3種類があり、それぞれ利用可能な時間帯が異なる。  
- 会員は予約時に利用したい施設と日時を選択する必要がある。  
- 施設の利用状況は管理者がリアルタイムで確認できる。  
- 予約時間が終了後、利用者の満足度を記録することができる。  


## 演習.4  
- コンサートチケット販売システムではイベントを登録することができる。  
- イベントには開催日、会場、チケット料金、座席数が設定されている。  
- ユーザーはイベントを検索し、チケットを購入することができる。  
- チケット購入時には座席番号が割り当てられる。  
- 購入済みのチケットは払い戻しができない。  


## 演習.5  
- 飲食店の予約管理システムを構築する。  
- レストランはテーブルを登録し、それぞれの収容人数を設定できる。  
- 顧客は日付と時間、人数を指定して予約を行うことができる。  
- レストランは予約を承認またはキャンセルすることができる。  
- 予約が完了すると、確認メールが顧客に送信される。  


## 演習.6  
- オンラインマーケットプレイスで商品を販売するシステムを作成する。  
- 出品者は商品を登録し、価格、説明、カテゴリを設定できる。  
- ユーザーは商品を検索し、カートに追加して購入できる。  
- 購入後、システムは出品者と購入者の間で発送情報を管理する。  
- 商品のレビューと評価を購入者が投稿できる。
WindowsのWSL2でIdris2のコンパイル環境・実行環境を整える（2024年12月現在）

こんにちは｜こんばんは。カエルのアイコンで活動しております @kyamaz :frog: です。

## はじめに
以前のエントリで『[macOSでIdris2のコンパイル環境・実行環境を整える](https://qiita.com/kyamaz/items/20dd334180a3225e5107)』を投稿しました。Idrisは型駆動開発を促進するために設計されたプログラミング言語で、型が言語の第一級構成要素となる言語です。型を関数に引数として渡すことができ、数値、文字列、リストなどの他の値と同じように関数から返すことができるように設計されています。
Idris には、バージョン１系とバージョン２系があり、バージョン１からバージョン２へ破壊的な仕様変更がありました。本稿ではバージョン２系である Idris2 を扱います。
Idris については、:frog: が尊敬する κeenさんが、Idris入門の記事をnoteに書かれておりますので、詳しくは次の記事を是非ご覧ください。

https://zenn.dev/blackenedgold/books/introduction-to-idris


## idrisのインストール
本稿では、Idris2をWindowsのWSL2環境にインストールしてコンパイル環境・実行環境を整える方法を紹介します。Idris2の公式には、macOSが中心に紹介されておりますので、WindowsやLinuxへのインストール方法の情報が少ないため、本稿で取り上げます。

Idris2をインストールするには幾つかの方法がありますが、WindowsのWSL2、Linuxにインストールするには「ソースコードからインストールする」方法が有用です。

### ChezScheme と必要ライブラリのインストール
ビルドツールとして ChezScheme が必要です。また、`libffi` も必要となりますので、apt でインストールします。また、ソースコードをビルドするための環境は前提とします。

```bash: 必要パッケージのインストール
$ apt install chezscheme libffi-dev
```

### ソースコードの取得とビルド
適当なワークフォルダ（$HOME/work)にソースコードをダウンロードしてビルドします。

```bash: GitHub からの取得
$ cd $HOME/work
$ git clone https://github.com/idris-lang/Idris2.git 
```

```bash: Idris2 のビルド
$ cd Idris2
$ make bootstrap SCHEME=scheme
$ make install
```

`SCHEME` で ChezCheme のコマンドを指定します。暫く待つとビルドが終了します。`make install` のデフォルトでは `$HOME/.idris2/bin` にインストールされます。PATHを通すようにしてください。

（参考）インタラクティブのコマンドidris2ではシェルのヒストリ機能のような上下キーによる入力支援がされていないので、`rlwrap` を使うように勧められています。`rlwrap idris2` で実行するとコマンドヒストリが使えます。

### コマンドの実行

```bash: コマンドの実行
$ idris2
     ____    __     _         ___
    /  _/___/ /____(_)____   |__ \
    / // __  / ___/ / ___/   __/ /     Version 0.7.0-1316f5842
  _/ // /_/ / /  / (__  )   / __/      https://www.idris-lang.org
 /___/\__,_/_/  /_/____/   /____/      Type :? for help

Welcome to Idris 2.  Enjoy yourself!
Main>
```

うまく動作しているようです。


## おわりに
本稿では、Idris2の動作環境を整えました。この環境で試して頂くエントリも寄稿したいと思います。ご一読いただきまして有り難うございます。

（●）（●） Happy Hacking!  
/""　＿＿""＼
はじめてのデータモデリング講座１

なにができるようになっていたらデータモデリングできていると言えるか？

**テーブル間の関係をつくること**

データとデータの関係があれば、データの関係を使って演算できるようになる。

参考図書

https://amzn.asia/d/5m5ocJg

## T字型モデリングでできること

- 一定の方法論に基づいてデータモデリングを行うことができるようになる
- データモデリングの代表パターンを活用することができる


## データモデリングの手順

1. エンティティをつくってみる
1. エンティティを分類する
1. エンティティ間の関係を作る
1. 個体が集合として正しいか調べる
1. 事実と対比する


## エンティティをつくってみる
- 情報を仕訳する／単語を転記する

## エンティティを分類する
- 情報を分類する

## エンティティ間の関係を作る
- E-R型／E-E型／R-R型／再帰

## 個体が集合として正しいか調べる
- 部分集合（区分コード）／多値（OR、AND）

## 事実と対比する

- 業務の流れを実現できるか？
- エンティティ間の関係から隠れた事実を発見できるか？


エンティティの分類
- E：イベント（「日時」のある「出来事・行為」）
- R：リソース（イベント以外のもの）

## エンティティの関係
### E-R型
- 行為者（resource）が行為・出来事（event）に関与する
- 基本的に「1対多」しかない

### E-E型
- 選考・後続の関係（1対多）
    - 「受注してから請求する」
- 対応表（多対多）
    - 受注と請求に組み合わせの関係がある場合
        - 複数の受注を1本の請求にする
        - 1本の受注を複数の請求にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/1921c64e-f55e-afc5-4db1-02cba0362fae.png)

### R-R型
- 対照表（多対多）しかない
- 対照表はイベントになることが多い
    - 「従業員」「部門」との県警の対照表で「配属」
- 対照表は制約の可能性を広げる
    - 「顧客」と「商品」の対照表は業務上何と呼べばいいか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/f14cdce9-e5ec-da71-c30f-224e1b41f32a.png)

### 再帰
- ある集合の中の集合を構成する
    - ツリー構造
    - 赤伝／黒伝
    - フォロー
- 「再帰表」をつくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/40877ba3-e0b3-ce02-0e8a-4b0f91eb594c.png)


## 個体が集合として正しいか調べる

### 部分集合
- 区分コード
    - コード間に一切交わりがない
    - 「正社員」であり、「パート」ということはない
    - カラムに定義して良い
- 多値
    - 複数の状態を取りうる
        - 「請求先」であり、「支払先」である
        - エンティティに分ける

## データモデリングの原則

### UPDATEをできる限り排除する
- 1つのレコードが様々な業務により様々な更新のされ方をすると、複雑性が上がる
- データの更新を極限まで削るとシンプルになる

### NULLをできるかぎり排除する

- NULLにはINDEXを適用できない
    - 関数INDEXで適用する裏ワザはある
- NULLには複数の意味がある、存在自体が複雑
    - undefined / unknown

### エンティティ間の制約はモデル化する
- コードが減る、パフォーマンスが上がる

## まとめ

エンティティを定義し、分類し、関係を築き、集合としての整合性を確認する。このプロセスを繰り返すことで、現実に即した堅牢なデータモデルを構築できます。
/bin/bash^M: 誤ったインタプリタです

# はじめに
こんにちは。
仮想環境ぶっ壊しマンのBaNanaです！
このネタはしばらく擦っていきます！！
今回は、変なエラーが出てスクリプトが実行できない問題を解決して行きたいと思います。

# 問題と解決
### 環境
Windows 10 Pro 22H2
Oracle VM VirtualBox 7.0
ubuntu 20.04.6

### 問題
スクリプトを実行しようとすると、以下のエラーが発生し、実行できない。
```
/bin/bash^M: 誤ったインタプリタです: そのようなファイルやディレクトリはありません
```
英語だと以下のように表示される
```
/bin/bash^M: bad interpreter' No such file or directory
```

### 解決方法
#### ubuntu上で新しいshファイルを作成してそこにコピペ
ubuntuのテキストエディタで新しいファイルを作成し、そこに貼り付けて名前をつけて保存
#### Windows上でサクラエディタなどの正規表現を用いることができるエディタで改行コードを変換
Windows上で該当ファイルをサクラエディタなどで開き、改行コードを置換。サクラエディタの場合は`Ctrl+r`を押し、`\r\n`を`\n`に置き換える
#### ubuntu上で改行コードを置換するコマンドを実行
```
sed -i 's/\r//' 置換したいファイルパス
```
を実行

### 結果
以上の解決方法のどれかでスクリプトファイルを編集してから、もう一度スクリプトを実行すると成功する

### 原因
ubuntuなどのLinux系OSで用いられている改行コードは`LF(Line Feed)`、Windows上で用いられている改行コードは`CRLF(Carriage Return Line Feed)`である。
今回のエラーは2つのOS間で用いられている改行コードが違うことが原因である。
エラーが起きていたスクリプトファイル(解決方法実行前のもの)で
```
cat -e ファイルパス
```
を実行すると、行末に`^M$`と表示されていることを確認できる。`^M`はCRを表しており、`$`はLFを表している。
ubuntu上でエラーを出さずにスクリプトを実行させる場合は改行コードを全て `$(LF)` に合わせなければならない。
そのため上記解決方法を実行する必要がある。
解決方法を実行し、それが成功した場合は該当の.shファイルの行末が全て `$` になる。

# おわりに
改行コードについては色々と奥が深いようです。
詳しくは参考文献のリンクをご覧ください。
私のubuntuの道はこのエラーから始まったと言っても過言ではありません。
拙い文章でしたがここまで読んでいただきありがとうございました。

# 参考文献

https://wakaru-web.com/device/line-feed-code/

https://webbibouroku.com/Blog/Article/sh-crlf-error
初めてOSS「dify」にコントリビュートした体験

先日、オープンソースソフトウェア（OSS）「dify」に初めてコントリビュートしました。内容は非常にシンプルなもので、Readmeファイル内の「Twitter」という表記を「X」に修正するという軽微な変更でした。しかし、これは私にとって重要な一歩であり、OSS活動に参加する大きな第一歩となりました。

今回はその体験を振り返り、コントリビュート方法を紹介したいと思います。

## コントリビュートの内容

私が行った修正内容は、difyのREADMEファイル内で「Twitter」と書かれていた部分を「X」に変更するというものです。この変更は2023年にTwitterがXという名前にブランド変更したため、古い情報を最新のものにアップデートするための作業です。

この修正自体はとても小さな変更でしたが、それでもGitHubでのプルリクエスト（PR）の作成や、レビューを受ける過程を通じて、OSSコントリビュートの流れを実際に体験することができました。

## コントリビュートの方法

OSSへのコントリビュートは、最初は少し敷居が高く感じるかもしれません。しかし、多くのプロジェクトはコントリビュートの方法についてREADMEや専用のガイドラインを記載しているため、それに従うことでスムーズに貢献することができます。

difyの場合、コントリビュートの方法については[こちらのページ](https://github.com/langgenius/dify/blob/main/CONTRIBUTING_JA.md)に詳細なガイドが記載されています。具体的には以下の手順を踏みました。

### 1. リポジトリをフォークする
まず、difyのGitHubリポジトリを自分のアカウントにフォークします。これにより、自分専用のリポジトリが作成され、そこで作業を行えるようになります。

### 2. クローンする
フォークしたリポジトリを自分のローカル環境にクローンします。これでローカルで変更を加える準備が整います。

```bash
git clone https://github.com/自分のアカウント名/dify.git
```

### 3. 変更を加える
ローカルのリポジトリ内で、README.mdファイルを開き、「Twitter」を「X」に修正しました。

### 4. 変更をコミットする
修正が終わったら、変更をステージングしてコミットします。

```bash
git add README.md
git commit -m "Update 'Twitter' to 'X' in README"
```

### 5. プルリクエストを作成する
自分のリポジトリに変更をプッシュした後、元のdifyリポジトリに対してプルリクエストを作成します。この際、変更内容やその理由を簡潔に説明することが大切です。

```bash
git push origin main
```

そして、GitHub上でプルリクエストを作成します。

### 6. レビューを受ける
プルリクエストが作成されると、プロジェクトのメンテナーがその変更をレビューしてくれます。もし問題があればフィードバックがもらえますので、それに応じて修正を加えることが求められます。

### 7. マージされる
レビューが完了し、問題がなければ、プルリクエストがマージされて変更が反映されます。

## OSS活動への第一歩

今回のコントリビュートは、内容的には非常に小さな修正でしたが、私にとってはOSSに貢献するための大きな第一歩でした。最初の一歩を踏み出すことができたことで、今後さらにOSSに貢献していく自信が湧いてきました。

OSS活動は、他の開発者と協力し、共同で作り上げていく喜びを感じることができる貴重な経験です。もしOSSへのコントリビュートを考えている方がいれば、ぜひ最初の一歩を踏み出してみてください。軽微な修正でも、自分の貢献が他の人にとって役立つことを実感できるはずです。

## 最後に

大抵のOSSプロジェクトには、コントリビュート方法がREADMEや専用のガイドラインに記載されています。difyの場合も、コントリビュートの詳細は[こちら](https://github.com/langgenius/dify/blob/main/CONTRIBUTING_JA.md)で確認できますので、ぜひ参考にしてみてください。

OSSへの貢献は、自分の成長にもつながりますし、他の開発者とつながるきっかけにもなります。これからも少しずつ貢献していきたいと思います。


---

この記事は以下アドベントカレンダーの16日目です。

https://adventar.org/calendars/10036
DialogOpen中にTab移動で親画面にFocusを当てないようにする


# はじめに

子画面(DialogやModalなど)を開いていた状態でTab移動すると、背景の親画面にまでFocusが当たる。

これを今までは、TabIndexなどで制御したり、

子画面内の最後のFocus要素のKeydownEventなどで制御することが多かった。

2023年以降ではInert属性で制御することが増えたので備忘録的にまとめておく。

（Chrome、Edge、Firefoxに加えてSafariが2023年にサポートされた）

Inert　とは(参考記事)

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

この記事より詳しい記事

https://blog.jxck.io/entries/2024-09-26/dialog-element.html

# コード

DialogのOpen時とClose時に親画面のInert属性を制御する

```javascript
const openDialogButton = document.getElementById('open-dialog');
const closeDialogButton = document.getElementById('close-dialog');
const dialog = document.getElementById('dialog');
const mainContent = document.getElementById('main-content');
const overlay = document.getElementById('overlay');

openDialogButton.addEventListener('click', () => {
  dialog.classList.add('open');
  overlay.classList.add('open');
  mainContent.inert = true; // ダイアログ表示時に背景を不活性化
});

closeDialogButton.addEventListener('click', () => {
  dialog.classList.remove('open');
  overlay.classList.remove('open');
  mainContent.inert = false; // ダイアログを閉じたら不活性化を解除
});
```

```html
//略

  <style>
    #dialog {
      display: none;
      position: fixed;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      padding: 20px;
      background-color: white;
      border: 1px solid black;
    }

    #dialog.open {
      display: block;
    }

    .overlay {
      display: none;
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-color: rgba(0, 0, 0, 0.5);
    }

    .overlay.open {
      display: block;
    }
  </style>
  <div id="main-content">
    <h1>Main Content</h1>
    <button id="open-dialog">Open Dialog</button>
    <p>Some text content here...</p>
    <button>Another Button</button>
  </div>

  <div id="overlay" class="overlay"></div>

  <div id="dialog">
    <h2>Dialog</h2>
    <p>This is the dialog content.</p>
    <button id="close-dialog">Close</button>
  </div>
  
//略
```

# まとめ

Inertによって簡単にFocusTrapできるようになった😄。

様々な場面で活用することで、ユーザーエクスペリエンスを向上につながるので、

使いこなしていきたい。💪