OmniAICreator/Qiita-1.07M huggingface dataset:
【転職活動】面接・課題まとめ

# はじめに
今年は初の転職を経験しました。
技術系の面接や課題をこの機会に振り返っておきたいと思います。
私の場合、データ分析系とエンジニアの２軸で面接を受けていましたので少し特殊かもしれません。少しでも参考になれば幸いです。


# 一般的な面接
- かんたんに自己紹介して
- 転職活動の軸は
- あなたの長所と短所は
- 一番苦労したプロジェクトは
- この活動は一人でやったんですか
- 休日何していますか
- どのように勉強していますか
- 参考にしている技術サイトはありますか
- 入社してやりたいことは & 今の会社ではできないんですかのコンボ
- 周りからはどんな人だと言われますか
- このプロジェクトが立ち上がった背景を教えて
- この取り組みを入社後の上長にどのように提案しますか
- リーダー経験ありますか

# 技術面接
- N+1問題意識していますか
- この脆弱性について教えてください
- 非同期処理中の画面の実装方針を提案してください
- あなたにとってアジャイルとは
- お客さんとどのようにプロジェクトを進めますか
- 提出した技術課題の説明
- 教えられる範囲でいいのでこのプロジェクトで扱った手法について説明して
- ペアプロでどのようなフィードバックを受けたことがありますか
- ペアプロで相手に指摘する際はどのようにしますか

# 技術課題
- RDBの設計
- 統計分野のプログラム実装
- RESTAPIの実装とテスト実装

# おわりに
自社に合いそうかの判断をするために人となりを知る質問をしていたり、募集ポジションの水準を満たしているかの判断をするために技術面接をしていたりしていたのだと思います。
スタートアップ系は即戦力を欲しているので、技術面接や課題がしっかりめな印象でした。
ブラウザ拡張機能でHTTPリクエストを操作する

# 概要

これは[初心者のブラウザ拡張機能 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/browser-extension)の20日目の記事です。

ブラウザ拡張機能でHTTPリクエストを操作してみます。

# やること

Mozzilaのサイトの例をもとに特定のHTTPリクエストをキャッチして別のURLへとリダイレクトさせます。

なおソースコード自体は下記のものを使用しますが、`manifest.json`の書き方など一部変えたほうが良い点を記載します。

[リクエストのリダイレクト](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/Intercept_HTTP_requests#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88)

# 具体的なソースコード

上記URLではv2の`manifest.json`を使用しているため`v3`へ変更したものを記載します。

```json:manifest.json
{
    "browser_specific_settings": {
        "gecko": {
          "id": "the-town-sample-httprequest@example.com"
        }
    },
    "manifest_version": 3,
    "name": "init-extention",
    "version": "0.1",
  
    "description": "HTTPリクエストへの介入のサンプル",
  
    "icons": {
      "48": "icons/icon-48.png"
    },

    "background": {
        "scripts": ["background.js"]
      },
  
    "permissions": [
        "webRequest", 
        "webRequestBlocking"
    ],

    "host_permissions": [
        "https://developer.mozilla.org/*"
    ]
}  
```

`browser_specific_settings`および`host_permissions`を追加しています。

# 拡張機能実行時の注意点

Mozzilaのサイトで紹介されている通りに拡張機能を実行しても正常に動作しない場合があります。
多くの場合はブラウザがキャッシュを持っていて、リダイレクト先の画像（カエルの画像）が表示されないというものです。

そのため`F12`キーで開発者ツールを表示してキャッシュを無効化して試します。

![キャッシュ無効化](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/bab2401a-7968-f030-a8fb-0c0c92bdf842.png)
ターミナルコマンド : [新卒時代に戻って学び直すシリーズ]

# 基本的なターミナルコマンド一覧

## 📂 **ディレクトリ操作**
- pwd
    - 現在の作業ディレクトリを確認する
- cd ~(チルダ-)
    - ホームディレクトリに移動する
- cd ..
    - 現在のディレクトリから一つ上の階層に移動する
- ls
    - ファイルやディレクトリの一覧を表示するときに使うコマンド
- mkdir
    - ディレクトリを作成すること
- touch
    - ファイルを作成すること
- mv 移動したいファイル ./移動したいディレクトリ
    - ファイルを移動させる
    - ./というのは、現在の作業ディレクトリ
- mv リネームしたいファイル リネームした後のファイル
    - ファイル名を変更できる
- code .
    - VSCodeを開く
026 AI屋さんの　LLMにトークン全文入力　GEMINI2.0 flash-thinking




026 AI屋さんの　LLMにトークン全文入力　GEMINI2.0 flash-thinking


gemini2.0のモデルに　思考強化の　モデルが追加されたので
一括比較できるように　webアプリを作りました。

お試し期間中なので　お試ししましょう。
そもそも設問が難しすぎて　回答が妥当かすでにわかりませんが
何か回答してくれいます。

文学、芸術、法律、取説など　元ネタを全文入力すれば
もっと差が出るかもしれませんね。
事前学習済みの内容だけでも　もちろんokです。






![スクリーンショット 2024-12-22 9.40.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/ca9d90bc-2f8c-25de-b3f8-a9251be70f8e.png)







https://cloud.google.com/vertex-ai/generative-ai/docs/thinking-mode


https://ai.google.dev/gemini-api/docs/thinking-mode?hl=ja


現時点では、お試し期間なので
諸々、お気をつけください。

![スクリーンショット 2024-12-22 9.51.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/efe6ee9a-552d-cb2c-17bd-1f4c6d7e310b.png)



---


gemini 2.0 flash, flash-thinking　比較サイト　はこちら


https://st.bono0.com/gemini2

---





目次

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


今回も無事に　gemini2.0の　比較ができました。
　全機能解禁が楽しみですね。
　あとは、マルチモーダル出力系　などなど
　単品を繋いで作っていたアプリが
　ワンストップで高い次元で完成している　イメージですかね。
　課金モードのタイミングも気になります。
まずは、おめでとうございます。


ー続くー
Androidのアップデート対応でIllegalAccessError

Androidのアップデート対応のため、Gladle、JDK、ライブラリ等のバージョンアップを行ってる作業中に表示されました。
```
java.lang.IllegalAccessError: superclass access check failed: class org.jetbrains.kotlin.kapt3.base.javac.KaptJavaCompiler cannot access class com.sun.tools.javac.main.JavaCompiler (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.main to unnamed module
```
内容的にJDKやライブラリのバージョンに原因があると思い。1つ1つコンパイルして確認しましたが、どれも違っており原因はKotlinのバージョンが`1.9.0`だったことが原因でした。
`1.9.0 -> 1.9.21`に変更することで無事コンパイルできました。
Kotlin`1.9.0`で必ずこのエラーが起きるわけでは無いことと、Kotlin version を変えたら毎回`Clrean Project`しなければいけなくて解決に時間がかかりました。



参考

https://stackoverflow.com/questions/77628445/java-lang-illegalaccesserror-superclass-access-check-failed-class-org-jetbrain
Rを学びたい Step21 幾何分布

## はじめに
Rを学びたのStep21です。今回は幾何分布に関して学んでいきます。

## 幾何分布って何？？
幾何分布とは、ベルヌーイ試行（成功または失敗しかない独立した試行）が繰り返される中で、初めて成功するまでの試行回数を記述します。

例えば：
　    ・コインを投げて表が出るまでの回数
	　・ダイスを振って「1」が出るまでの回数


```math:
\begin{align*}
P(X = k) &= (1-p)^{k-1} p \quad \text{(幾何分布の確率質量関数)} \\

k & : \text{成功する試行の回数} \quad (k = 1, 2, 3, \dots) \\
p & : \text{各試行における成功確率} \\
1-p & : \text{失敗の確率} \\
\\
(1-p)^{k-1} & : \text{最初の } k-1 \text{ 回は失敗する確率} \\
p & : k \text{-回目で初めて成功する確率。}
\end{align*}
```


## Rで学ぶ。
あるコインを投げたとき、表が出る確率は  p = 0.3  です。このコインを何回か投げて、初めて表が出るまでの試行回数を考えます。この試行回数は幾何分布に従うとする。この時の幾何分布と累積分布関数（CDF）をplotしなさい。

```r
# Parameter settings
p <- 0.3   # Success probability
k <- 1:20  # Number of trials (k)

# Probability Mass Function (PMF)
pmf <- dgeom(k - 1, prob = p)  # R's dgeom requires k-1

# Cumulative Distribution Function (CDF)
cdf <- pgeom(k - 1, prob = p)

# PMF Plot
plot(k, pmf, type = "h", lwd = 2, col = "blue",
     main = "Probability Mass Function (PMF) of Geometric Distribution",
     xlab = "Number of Trials (k)", ylab = "Probability",
     ylim = c(0, max(pmf) * 1.2))
points(k, pmf, pch = 16, col = "blue")
grid()

# CDF Plot
plot(k, cdf, type = "o", lwd = 2, col = "red",
     main = "Cumulative Distribution Function (CDF) of Geometric Distribution",
     xlab = "Number of Trials (k)", ylab = "Cumulative Probability",
     ylim = c(0, 1))
points(k, cdf, pch = 16, col = "red")
grid()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/fd54c5f4-3b3a-6c3a-94e0-65275b1de0c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/4259cd76-82f8-5674-9da0-00b04439b33e.png)
【Linux】alias(エイリアス)設定

# ■環境
　・CentOS9

# ■現状
ls -lコマンドを入力すると、%Yが表示されない。
なので、ls -lのエイリアスとして、「ls -ls --time-style=+"%Y/%m/%d %H:%M:%S"」を設定していこうと思う。

# ■目的
ls -lコマンドを入力したときに、タイプスタンプが「%Y/%m/%d %H:%M:%S」で表示されること。
```
ll
合計 0
-rw-r--r-- 1 root root 0  7月  1 23:00 fileA.log
-rw-r--r-- 1 root root 0  8月  1 23:00 fileB.log
-rw-r--r-- 1 root root 0  9月  1 23:00 fileC.log
-rw-r--r-- 1 root root 0 10月  1 23:00 fileD.log
```
このままだと「％Y」が表示されない。
```
ls -ls --time-style=+"%Y/%m/%d %H:%M:%S"
合計 0
0 -rw-r--r-- 1 root root 0 2024/07/01 23:00:00 fileA.log
0 -rw-r--r-- 1 root root 0 2024/08/01 23:00:00 fileB.log
0 -rw-r--r-- 1 root root 0 2024/09/01 23:00:00 fileC.log
0 -rw-r--r-- 1 root root 0 2024/10/01 23:00:00 fileD.log
```
ls -lコマンドを入力して、↑の表記になればＯＫ。

# ■手順
**1．以下のコマンドを入力して、エイリアスを設定する。**
```
alias ll='ls -ls --time-style=+"%Y/%m/%d %H:%M:%S"'
```
⇒エラーとならないこと
```
ll
合計 0
0 -rw-r--r-- 1 root root 0 2024/07/01 23:00:00 fileA.log
0 -rw-r--r-- 1 root root 0 2024/08/01 23:00:00 fileB.log
0 -rw-r--r-- 1 root root 0 2024/09/01 23:00:00 fileC.log
0 -rw-r--r-- 1 root root 0 2024/10/01 23:00:00 fileD.log
```
⇒「％Y」が表示されること

このままだとOSを再起動すると、↑の設定が消えてしまうので、
.bashrcというファイルを編集していきます。
（.bashrcファイルが何かは参考URLを参照）

**2．.bashrcにエイリアスを定義する**
以下のコマンドを入力し、.bashrcファイルを開く。
```
vi ~/.bashrc
```
⇒エラーとならないこと
#iを入力し、コマンドモードからインサートモードに移行して、以下を記述し、
```
alias ll='ls -ls --time-style=+"%Y/%m/%d %H:%M:%S"'
```
:wqで保存する。
⇒エラーとならないこと

**3．OSを再起動し、設定が読み込まれたことを確認する。**
以下のコマンドを入力し、OSを再起動する。
```
reboot
```

**4．設定の反映を確認する。**
ファイルがあるディレクトリまで行って、以下のコマンドを実行する。
```
ll
合計 0
0 -rw-r--r-- 1 root root 0 2024/07/01 23:00:00 fileA.log
0 -rw-r--r-- 1 root root 0 2024/08/01 23:00:00 fileB.log
0 -rw-r--r-- 1 root root 0 2024/09/01 23:00:00 fileC.log
0 -rw-r--r-- 1 root root 0 2024/10/01 23:00:00 fileD.log
```
⇒エラーとならないこと
無事設定が反映されていました。
```
cat ~/.bashrc | grep alias
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias ll='ls -ls --time-style=+"%Y/%m/%d %H:%M:%S"'
```
ちなみに、設定自体は消えていませんでした。

<font color="blue">再起動後、設定が反映されていない場合、</font>項番5に進む。

**5..bash_profileに.bashrcを読み込ませる**
以下のコマンドを入力し、.bash_profileファイルを開く。
```
vi ~/.bash_profile
```
⇒エラーとならないこと
#iを入力し、コマンドモードからインサートモードに移行して、以下を記述し、
```
source ~/.bashrc
```
:wqで保存する。
⇒エラーとならないこと

# ■参考ＵＲＬ

https://qiita.com/ydah/items/18d242b632e5486fe912

https://traincat.net/blog/neko/archives/000334.html

https://www.odin.hyork.net/write/write0804.html
コンテナとは？

# はじめに
ソフトウェア開発の現場で、「Docker」や「コンテナ」という言葉を耳にする機会が増えてきました。「開発環境の共有が簡単になる」「ローカル環境を汚さずに開発できる」といった話を聞いたことがある方も多いのではないでしょうか。
この記事では、そんな便利なコンテナ技術の基本的な概念から、実際の活用まで、わかりやすく解説していきます。

# コンテナとは
## コンテナの基本概念
コンテナとは、アプリケーションの実行に必要な環境を、独立した一つのパッケージとして扱う仮想化技術です。その特徴は、環境を問わずアプリケーションの実行環境を自由に持ち運べることにあります。

具体的には、コンテナエンジンを介して、OSの基本環境（カーネル）を複数のコンテナで共有します。これにより、以下のようなメリットが生まれます。

- 不要なリソースの削減
- アプリケーション実行環境の軽量パッケージ化
- 実行環境からの分離

## 仮想化=コンテナ化？
コンテナは仮想化技術の一種ではありますが、仮想化する=コンテナ化する訳ではありません。

ここでは詳しく言及しませんが、仮想化にはホスト型・ハイパーバイザー型・コンテナ型と主に三つの種類があり、コンテナはあくまでその一種となります。
コンテナはDockerやKubernetesなどのコンテナエンジンを用いて、アプリケーションを実行するための領域を複数に分割して利用するものです。

![コンテナ.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546781/4b80d635-a85a-c640-4890-d49d55717f29.png)

ざっくり他に比べての特徴をまとめるとシステム資源の負担は小さく、可搬性は高いが、OSは限られることが特徴になります。

## コンテナを導入するにあたって
### メリット
コンテナを利用することで得られる具体的なメリットには次のようなものがあります。

- リソースを効率的に使える
コンテナではゲストOSを必要としないため、システムリソースの消費を抑えることができ、処理も高速に行えます。
これにより、システム全体のリソース効率が向上し、運用コストの削減につながります。

- 移行しやすい
コンテナはハードウェア環境やOSに依存せず独立して動作するため、どの環境に移行しても一貫した動作を保証できます。
これにより環境構築や移行にかかる工数が大幅に削減され、開発からデプロイまでの工程が効率化され、より迅速なリリースサイクルの実現が可能になります。

### デメリット
コンテナのデメリットとされる部分は次のようなものが挙げられます。

- ホストOSに依存する
コンテナはホストOSのカーネルを共有する設計となっているため、仮想マシンのように異なるOSを自由に選択することはできません。つまり、同一サーバー上でWindowsとLinuxを併用するような柔軟な環境構築は難しいです。

- 運用の複雑化
アプリケーションごとに独立した環境をコンテナとして細分化できることは大きな利点ですが、その反面、運用するコンテナの数が増加すると管理の複雑さも増していきます。
この課題はKubernetesなどコンテナオーケストレーションツールを使うことによってカバーしていく必要があります。

# おわりに
コンテナ技術は現代のソフトウェア開発において、もはや必須と言える技術となっています。開発者だけでなく、インフラエンジニアにとっても重要なスキルの一つとなっています。
仮想化技術は初見では複雑に感じるかもしれませんが、Dockerのような身近なコンテナ技術から始めることで、徐々に理解を深めていくことができます。この記事が、皆さんのコンテナ技術への第一歩となれば幸いです。
Three.jsで3Dの矢印を作りました！

# 今回はThree.jsで3Dの矢印を作ってみました。
３Ｄの矢印を作成します。javascript、CSS、HTMLを使います。

## HTML＆JavaScript＆CSS
これを矢印を描画したい箇所に記載します。
```
<html>
<head>
<title>Three.js矢印テスト</title>
<style>
.animation-container {
width: 360px;
height: 200px;
margin: 0 auto;
padding: 0;
position: relative;
background-color: #ffffff;
}

.animation-canvas {
display: block;
width: 100%;
height: 100%;
}
</style>
<script type="importmap">
  {"imports":
    {"three":
      "https://cdn.jsdelivr.net/npm/three@0.167.0/build/three.module.js"
    }
}
</script>
<script type="module">
import * as THREE from "three";

const container = document.getElementById('animation-arrow');

// シーンの作成
const scene = new THREE.Scene();

// カメラの作成
const camera = new THREE.PerspectiveCamera(75, container.clientWidth / container.clientHeight, 0.1, 1000);
camera.position.z = 5;

// レンダラーの作成
const renderer = new THREE.WebGLRenderer({
  antialias: true
});
renderer.setSize(360, 200); // 固定サイズを設定
renderer.setClearColor(0xffffff); // 背景を白に設定
container.appendChild(renderer.domElement);
renderer.domElement.classList.add('animation-canvas');

// 矢印の形状を定義
const arrowShape = new THREE.Shape();
arrowShape.moveTo(0, -1);
arrowShape.lineTo(0.4, -0.6);
arrowShape.lineTo(0.2, -0.6);
arrowShape.lineTo(0.2, 1);
arrowShape.lineTo(-0.2, 1);
arrowShape.lineTo(-0.2, -0.6);
arrowShape.lineTo(-0.4, -0.6);
arrowShape.lineTo(0, -1);

// 立体形状の矢印を作成
const extrudeSettings = { depth: 0.5, bevelEnabled: false };
const geometry = new THREE.ExtrudeGeometry(arrowShape, extrudeSettings);
const material = new THREE.MeshPhongMaterial({ color: 0xff0000 });
const arrow = new THREE.Mesh(geometry, material);
arrow.scale.set(4.2, 1.8, 3);
arrow.rotation.set(Math.PI / 1, 0, 0);
scene.add(arrow);

// 点光源の追加
const pointLight = new THREE.PointLight(0xffffff, 1, 100);
pointLight.position.set(0, 3, 5);
scene.add(pointLight);

// 環境光の追加
const ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);

// 矢印のアニメーション設定
renderer.setAnimationLoop((time) => {
    arrow.rotation.y = time / 1000;
    renderer.render(scene, camera);
});

// ウィンドウリサイズ対応
window.addEventListener('resize', function() {
    const width = 360; // 固定サイズ
    const height = 200; // 固定サイズ
    renderer.setSize(width, height);
    camera.aspect = width / height;
    camera.updateProjectionMatrix();
});
</script>
</head>
<body>
<div id="animation-arrow" class="animation-container">
</div>
</body>
</html>
```

renderer.setSize(360, 200);で、サイズを固定しています。
arrow.scale.set(4, 1.8, 3);の値を変更すると、矢印の大きさを変更することができます。
また、スマホなどで見た時の対応（ウィンドウリサイズ）として、 const width = 360;、const height = 200;で、固定サイズを設定しています。

### それではまた！
ディフィー・ヘルマン鍵共有 (Diffie-Hellman Key Exchange) の群論による説明

## 群論的基礎

ディフィー・ヘルマン鍵共有は群論の枠組みで説明すると、以下の要素を利用します。

### 1. 有限巡回群 \( G \)
- 群 \( G \) は有限集合であり、乗法演算に関して閉じています。
- 特に、群 \( G \) は素数 \( p \) を法とする既約剰余類群 $$\(\mathbb{Z}\/p\mathbb{Z})^*\$$で構成されます。
- \( G \) の元に対する群演算は「乗法」とし、元の逆元も存在します。

### 2. 生成元 \( g \)
- $$\( g \in G \) は \( G \) の生成元（巡回群の構造をもつ）で、以下の性質を満たします：$$
  $$\[
  G = \{ g^0, g^1, g^2, \dots, g^{|G|-1} \} \mod p
  \]$$
 $$ ここで \( |G| = p-1 \) は群の位数です。$$

### 3. 離散対数問題
- $$\( g^x \mod p \)$$ を計算することは効率的に可能ですが、逆に $$\( g^x \mod p \)$$ が与えられたときに$$ \( x \)$$ を見つけるのは計算量的に困難です。これがアルゴリズムの安全性を支える鍵となります。

---

## アルゴリズムの詳細

### 1. 公開された群と生成元の設定
大きな素数pとGの生成元gを準備します。

### 2. 秘密値の選択
- **アリス**はランダムな整数aを選びます。
- **ボブ**はランダムな整数bを選びます。

### 3. 公開値の計算
- アリスは $$\( A = g^a \mod p \)$$ を計算し、ボブに送信します。
- ボブは $$\( B = g^b \mod p \)$$ を計算し、アリスに送信します。

### 4. 共通鍵の計算
- アリスはボブから受け取ったBを用いて次を計算します：
  $$\[
  K_{\text{Alice}} = B^a \mod p = (g^b)^a \mod p
  \] $$
- ボブはアリスから受け取った \( A \) を用いて次を計算します：
  $$\[
  K_{\text{Bob}} = A^b \mod p = (g^a)^b \mod p
  \]$$

群論におけるべき乗の結合法則により、次が成立します：
$$\[
K_{\text{Alice}} = K_{\text{Bob}} = g^{ab} \mod p
\]$$

---

## 具体例: 実際の計算

以下の値を使用します：
- $$\( p = 23 \): 群の法（素数）$$
- $$\( g = 5 \): 群の生成元$$
- $$アリスの秘密値 \( a = 6 \)、ボブの秘密値 \( b = 15 \)$$

### 手順

1. **アリスの公開値**:
  $$ \[
   A = g^a \mod p = 5^6 \mod 23 = 15625 \mod 23 = 8
   \] $$

2. **ボブの公開値**:
  $$ \[
   B = g^b \mod p = 5^{15} \mod 23 = 30517578125 \mod 23 = 19
   \]$$

3. **共通鍵の計算**:
   - アリス側：
    $$ \[
     K_{\text{Alice}} = B^a \mod p = 19^6 \mod 23 = 47045881 \mod 23 = 2
     \]$$
   - ボブ側：
     $$\[
     K_{\text{Bob}} = A^b \mod p = 8^{15} \mod 23 = 35184372088832 \mod 23 = 2
     \]$$

$$したがって、アリスとボブは共通鍵 \( K = 2 \) を共有します。$$

---

## 安全性の理論

- **離散対数問題の難しさ**:
  $$\( g^a \mod p \) と \( g^b \mod p \) を観測しても、$$
  $$秘密値 \( a \) または \( b \) を特定するのは現実的に難しいです。$$

- **Diffie-Hellman問題の困難性**:
  $$\( g^a \mod p \) と \( g^b \mod p \) を知っていても、$$
  $$直接 \( g^{ab} \mod p \) を計算するのは困難です。$$

---
【Rustのまほう2】#21 bevy_simple_text_input


# bevy_simple_text_input

前回はキーボード入力を扱い、キーイベントの読み取りについて説明しました。私のゲームでもテキストボックスはあるのですが、キーイベントを直接扱わず、bevy_simple_text_inputというクレートを使っています。

https://github.com/rparrett/bevy_simple_text_input

bevy_simple_text_inputはテキストボックス1個だけのシンプルなクレートです。UIについては [bevy_egui](https://github.com/vladbat00/bevy_egui) や [bevy_iced](https://github.com/tasgon/bevy_iced) のようなより高度なUIツールキットも検討したのですが、ゲームの場合はどうせゲームの機能に合わせた独自のデザインのUIコンポーネントを自分で作ることになりますし、将来のバージョンアップに備えてeguiのような大きなクレートへの依存は避けたかったので、bevy_simple_text_inputを選びました。


# テキストボックスの生成

bevy_simple_text_inputの使い方は簡単です。まずは`TextInput`コンポーネントを`spawn`で生成します。これは`Node`などのコンポーネントを必須とするUIコンポーネントなので、`Node`の`width`や`border`などで外観を調整できます。また、`TextInputTextFont`でフォントを指定したり、`TextInputValue`で入力テキストの初期値を指定できます。以下は私が書いた、ゲームでユーザー名を入力するテキストボックスをspawnする実際のコードです。

```rust
parent.spawn((
    Node {
        width: Val::Px(200.0),
        border: UiRect::all(Val::Px(5.0)),
        padding: UiRect::all(Val::Px(5.0)),
        ..default()
    },
    BorderColor::from(BORDER_COLOR_ACTIVE),
    BackgroundColor::from(BACKGROUND_COLOR),
    TextInput,
    TextInputTextFont(TextFont {
        font: assets.dotgothic.clone(),
        font_size: 40.,
        ..default()
    }),
    TextInputTextColor(TEXT_COLOR.into()),
    TextInputSettings {
        retain_on_submit: true,
        ..default()
    },
    TextInputValue(config.player_name.clone()),
));
```

# 入力されたテキストの読み取り

入力されたテキストを読み取るには、以下のように`TextInputValue`コンポーネントから文字列を取り出すだけです。

```rust
fn start_game(
    ...
    text_input_query: Query<&TextInputValue>,
    ...
) {
    ...
    
    let TextInputValue(text_input) = text_input_query.single();
    config.player_name = text_input.clone();

    ...
}
```

ごくシンプルなクレートなので、最悪Bevy本体のバージョンアップについてこなくても、私が自力でなんとかできるだろうという目論見です。でも bevy_simple_text_input は Bevy 0.15 リリース直後に 0.15 に対応していました。ありがたいですね。
【Rustのまほう2】#20 キーボード入力

そういえばユーザー入力をちゃんと取り扱っていなかったので、ここではまずはキーボードからの入力を取り扱います。マウスからの入力は少し説明することが多いので……。


# ButtonInputリソース

キー入力は比較的簡単です。「リソース」の回で、Bevyの要素は、全体でひとつしかないものは「リソース」、複数あるものはエンティティになると説明しました。このうち、キーボード入力はリソースになっています。

キーボード入力を読み取るには、`ButtonInput<KeyCode>`リソースを読み取ります。たとえば、私が作っているゲームではタブキーを押すとインベントリ(アイテム欄)が開くのですが、その操作を扱う`toggle_inventory`システムを定義して、`keys: Res<ButtonInput<KeyCode>>`というシステムパラメータを読み取るようにします。あとは、`keys.just_pressed`を呼べば、そのフレームで指定したキーが押されたかを判別できます。

```rust
fn toggle_inventory(
    keys: Res<ButtonInput<KeyCode>>,
    ...
) {
    if keys.just_pressed(KeyCode::Tab) {
        ...
    }
}
```

`ButtonInput`にはほかにも、そのフレームでキーが離されたかを調べる`just_released`と、指定したキーが押されたままになっているかを調べる`pressed`があります。キャラクターの移動のようにキーを押し続ける操作の場合は`pressed`のほうを使えばいいでしょう。また、複数のキーを指定して調べる`any_pressed`なんかもあります。



# キーイベント

テキストボックスへの文字入力などでどのキーが押されたのかをしりたいときに、すべてのキーに対して`just_pressed`で調べるのは無理があります。そういうときはキーボードイベントを参照すると、どのキーが押されたのかを順番にイベントとして取得することができます。以下はチートブックから拝借したサンプルコードです。「イベント」の回で説明したように、`EventReader`でイベントを読み取ることができます。キーボードイベントの場合は`EventReader<KeyboardInput>`というシステムパラメータを定義すればOKです。

```rust
fn keyboard_events(
    mut evr_kbd: EventReader<KeyboardInput>,
) {
    for ev in evr_kbd.read() {
        match ev.state {
            ButtonState::Pressed => {
                println!("Key press: {:?} ({:?})", ev.key_code, ev.logical_key);
            }
            ButtonState::Released => {
                println!("Key release: {:?} ({:?})", ev.key_code, ev.logical_key);
            }
        }
    }
}
```

# 参考文献

https://bevy-cheatbook.github.io/input/keyboard.html


# 話は変わりますが
記事のストックが底を尽いて、ひとりアドベントカレンダーへの記事投稿が遅れ始めました！やばい！
【UiPath】TryCatchのCatchブロックは下位の例外からキャッチする

タイトルの通り、UiPathではCatchブロックは下位の例外からキャッチする。この時、Catchブロックを置く順番は特に影響しない。
以下の例ではTryブロックでスローした`System.IO.FileNotFoundException`は、「Exception ⇒ SystemException ⇒ IOException ⇒ FileNotFoundException」と継承されるクラスなので、最も下位の例外である`System.IO.IOException`ブロックでキャッチされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/f0a06020-5b13-9f2b-16f5-92c1a53c6640.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/5c213473-c9f6-4206-2a69-7ef86302b9c6.png)

前述の通りCatchブロックを置く順番は特に影響しないので、以下のように入れ替えても同じ結果になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/f79f9582-36cd-6a2d-d874-9d6b31eb4ba2.png)

ちなみにGPT-4君に尋ねると「Catchブロックは上から順に評価される」と回答が返ってきたが、これは誤り。VB.Netでは上から順に評価される仕様なので、それに引っ張られているのだろう。

>Catchブロックの選択ルール
・例外は上位クラスよりも下位クラスでキャッチされる
例外が複数のCatchブロックに該当する場合、特定の例外にマッチするCatchブロックが優先されます。
より汎用的なクラス（上位クラス）のブロックは、特定の例外（下位クラス）のブロックが存在しない場合に実行されます。
・Catchブロックは上から順に評価される
TryCatchアクティビティのCatchブロックは、定義された順番に評価されます。
最初にマッチしたブロックが実行され、それ以降のブロックはスキップされます。

### 下位の例外をキャッチしたくない場合は？

`System.IO.IOException`は拾ってほしいが`System.IO.DirectoryNotFoundException`など下位の例外は拾ってほしくない。そういう場面があるかはわからないが、そんな時はCatchブロック内でexception変数の情報を見て判断する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/69fcc0f4-ec81-48f6-4d7a-9c181a0bb095.png)

`System.IO.IOException`だけ拾いたければ、Catchブロックを`Exception`の一つに絞り、`exception.GetType`メソッドで例外の型を確認して`System.IO.IOException`の場合だけ分岐で処理を分ければいい。この形なら下位の`System.IO.DirectoryNotFoundException`等が流れてきてもて`System.IO.IOException`の分岐には流れない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/1e3f3bbd-1c15-6cfe-ba22-833a88f26a34.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/fd249cb3-cf67-805a-a7bd-8f50a0064d7e.png)

## 参考
https://qiita.com/mayasy_RPA/items/0d574ab53e113b5f9261

## 動作環境
UiPath.System.Activities v24.10.7
GraphQLとは

## GraphQLとは
GraphQLは**APIのクエリ言語です。**
「クエリ」という単語を聞くとSQLみたいなものを想像しがちですが、実態は関数の実行を通して、データの取得や操作などのリクエストを行います。
一言で言うと「クライアントとサーバー間のデータ問い合わせに特化した言語」となります。

## GraphQLの誕生背景
GraphQLの詳細を語る前にREST APIについて簡単に解説します。
### REST APIとは
REST（Representational State Transfer）の原則に基づいて設計されたAPIのことです。Webシステムを外部から利用するためのプログラムの呼び出し規約(API)の種類の一つです。
RESTの原則は以下のものになります
- アドレス可能性
    - URIを使ってリソースに対して一意のアドレスを割り当てること
- 統一したインターフェース
    - HTTPプロトコルという標準化されたインターフェース(GET、POST、PUT、DELETEなど)を使うことで、アプリケーション間での相互運用性を高めること
- ステートレス状態
    - サーバがクライアントのコンテキストや状態を保持しないため、セッションIDやログイン状態などはクライアント側で管理する
- 接続性
    - クライアントとサーバが論理的に通信可能であること
    - サーバーは、クライアントがより多くのリソースを動的に検出できるように、表現でハイパーリンクを送信することによってこれを実現する

### GraphQLとは
GraphQLは、複雑化するモバイルやWebアプリのニーズに応えるために設計されました。
REST APIでは、エンドポイントごとに取得するデータが固定されているため、**過剰なデータ取得や不足が課題となることがありました。**
GraphQLはこの問題を解決するために、クエリごとに**必要なデータを指定できるようになっています。**


## GraphQLの特徴

### クエリ言語としての柔軟性
GraphQLでは、フロントエンドが必要なデータを明示的に指定できるため、APIで固定されているデータの過不足が解消されます。

### 型システムによる安全性
GraphQLはスキーマで型を定義します。これにより、クライアントとサーバー間の通信が型安全になり、デバッグが容易になります。

### 単一のエンドポイント
GraphQLではすべてのリクエストが1つのエンドポイントを通じて処理されます。異なるリソースを取得する際でも一つのエンドポイントへのリクエストで済みます。

REST APIとの比較

|特徴|REST API|GraphQL|
|:--|:--|:--|
|データアクセス|リソースを定義する複数のURLエンドポイント|単一のURLエンドポイント|
|データ取得|エンドポイントごとに取得するデータが固定されている|必要なデータをクエリで指定可能|
|過剰なデータ取得の有無|過剰または不足が発生する可能性|必要なデータのみ取得|
|型システム|通常は型がない|強力な型システムを持つ|

## GraphQLの基本構文
クエリ: データを取得する操作
```graphql
query {
  user(id: "1") {
    id
    name
    email
  }
}
```


ミューテーション: データを更新・作成・削除するための操作
```graphql
mutation {
  createUser(input: { name: "Alice", email: "alice@example.com" }) {
    id
    name
  }
}
```


サブスクリプション: リアルタイム更新を受け取るための操作
```graphql
subscription {
  messageAdded {
    id
    content
    sender {
      name
    }
  }
}
```

 
## GraphQLのアーキテクチャ
### スキーマ
データの型や返す値の型を定義するところです。以下の例は、ユーザーと投稿のスキーマ定義です。
```graphql
type User {
  id: ID!
  name: String!
  posts: [Post]
}

type Post {
  id: ID!
  title: String!
  content: String!
  author: User
}
```

### リゾルバ

スキーマで定義されたフィールドに対して実際のデータを返すロジックです。
```typescript
const resolvers = {
  Query: {
    user: (parent, args, context) => {
      return context.db.getUserById(args.id);
    },
  },
};
```

## デメリット

- 学習コスト
スキーマ設計やリゾルバの実装には学習が必要となる。
- パフォーマンスの課題
複雑なクエリによるサーバー負荷の増加の可能性がある。
- キャッシングの難しさ
RESTに比べてキャッシュ管理が複雑。


## 終わりに
GraphQLは名前は聞いたことあるけど…と言う方向けに概要を抑えられるようまとめてみました。
読んでいただきありがとうございました！

## 参考記事
https://graphql.org/learn

https://qiita.com/tsubasa_k0814/items/c6ef7e3c668007f920a6

https://qiita.com/masato44gm/items/dffb8281536ad321fb08
Webページの任意のJSを停止させる方法（デベロッパーツールでできます）

# はじめに
プログラミング学習中の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

今開いているブラウザのページで、どんなJSファイルが読み込まれているか知る方法・任意のJSファイルの読み込みを停止させる方法の共有です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/e6bb1b7a-8490-5013-62e2-2b85ce13ffb7.png)

# 結論
デベロッパーツールにて、ネットワークタブを使用するとできます！

# 手順
1. デベロッパーツールを開く
1. JSでフィルターする
    1. 一覧を絞り込んで見やすくするためです！ 
1. ブロックしたいJSファイルで右クリックする
1. `Block request URL`をクリックする
1. ページをリロードするとブロックされた状態で表示されます！

![Screenshot 2024-12-22 at 7.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/ef246592-dd05-2caf-ab08-9a6d15f04121.png)

# おまけ ドメインのファイルまとめてブロック
対象ファイルを含む**ドメインからのファイルをまとめてブロック**したい場合、`Block request domain`を選択すると可能です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/173cd26c-b513-3f89-1798-f6c604dab3bd.png)


# おわりに
お読みいただきありがとうございました。
デベロッパーツールの学びについてご共有でした。
どなたかの参考になれば嬉しいです。
強化学習における「価値ベース学習」と「ポリシーベース学習」をバスケットボールで例える

 # **強化学習**（Reinforcement Learning, RL）
 エージェントが環境と相互作用しながら、目標を達成するために最適な行動を学ぶ機械学習の一分野。その中でも、価値ベース学習（Value-Based Learning） と ポリシーベース学習（Policy-Based Learning） は、強化学習で累積報酬を最大化するための2つの主要なアプローチです。

## 強化学習の基本構造
強化学習は、以下の要素で構成されています。

**エージェント（Agent）**
学習を行う主体。環境から状態を観測し、行動を選択します。

**環境（Environment）**
エージェントが行動を行う場で、エージェントの行動に応じて報酬と次の状態を提供します。

**状態（State, 𝑆）**
現在の環境の状況を表します。例：ロボットの位置やゲーム画面のフレーム。

**行動（Action, A)**
エージェントが選択できる動作や選択肢。例：右に移動する、ジャンプする。

**報酬（Reward, R)**
行動の結果として得られるフィードバック。
目標は、この報酬の累積値を最大化すること。

## 価値ベース学習（Value-Based Learning）とは？

### 基本の考え方
- 状態Sや状態と行動のペアQ(s,a)の**価値**を計算し、最も価値が高い行動を選ぶ手法
- [どの様態や行動が将来的に得られる報酬が大きいか]を計算する事に重点を置いている。

### 例：バスケの試合
**状態と行動**
状態ｓ：プレイヤーが現在いる位置を表す
- s1：フルースロー付近にいる状態
- s2：ゴール下にいる状態
- s3：スリーポイントラインにいる状態

行動a:プレイヤーが選べる選択肢
- a1 : シュートを打つ
- a2 : 味方にパス
- a3 : ドリブルし、別の位置に移動する

行動価値（Ｑ値）を考える
状態ｓ1にいる場合の各坑道の価値を計算する
- Q(s1,a1)=7 ゴール下へドリブル　→　得点チャンスがＵＰ
- Q(s1,a2)=4　その場でシュート →　得点確率が中程度
- Q(s1,a3)=6　パス　→　見方が良いポジションでシュートできる可能性

最適な行動
Q(s1,a1)が最も高いので、**ゴールしたへドリブル**するを選ぶ 


## ポリシーベース学習（Policy-Based Learning）とは？
### 基本の考え方
- 「行動を選ぶ確率（ポリシー）」を直接学習する手法です。
- 状態sにおいて、行動aを選ぶ確率を表すポリシーπ（a|s）を学習する

### バスケの試合
**状態と行動**
状態ｓ；フリースローライン付近にいる状態
行動a
- a1:シュートを打つ
- a2:味方にパスする
- a3:どり物して別の位置に移動する

**ポリシーを考える**
状態s1にいる場合、以下の確率で行動を選択
- P(a1|s1) = 50% シュートを選ぶ確率
- P(a2|s1) = 30%　パスを選ぶ確率
- P(a3|s1) = 20%　ドリブルを選ぶ確率

**行動選択**
50%の確率でシュートを選び、30％の確率でパスを選ぶ

### 価値ベース学習（Value-Based Learning）
状態や行動の価値を計算し、それを基に最適な行動を選ぶ。
バスケでは「得点できる期待値」を計算し、最も期待値が高い行動を選択します。
常に安全な選択を行い、確率的に失敗しそうな行動を選ばない。そのため、探索が弱い

:::note info
期待値の行動を選び続けるため、未知の行動を試さない。
その結果、未来の事を考えずに今見えている現状の最適解を求める短期てな戦略になりやすい 
:::


### ポリシーベース学習（Policy-Based Learning）
行動を選ぶ確率を直接学習し、柔軟に行動を選択。
バスケでは「シュートの確率70%、パスの確率20%」のように確率で行動を選びます。

:::note info
期待値の低い行動をとる場合があるため、これが長期的なメリットをもたらす可能性がある。
例えば、スリーポイントシュートの確率は低いが得点が高いため、この選択によって試合に勝利する可能性もある。
とはいえ、短期的に悪い選択を取る可能性があり、行動が安定せず、不安定な結果になる場合がある。
:::


<table>
  <caption>価値ベース（Value-Based）とポリシーベース（Policy-Based）の比較</caption>
  <thead>
    <tr>
      <th>項目</th>
      <th>価値ベース（Value-Based）</th>
      <th>ポリシーベース（Policy-Based）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>行動選択方法</td>
      <td>最大価値の行動を選ぶ（決定論的）。</td>
      <td>確率的に行動を選ぶ。</td>
    </tr>
    <tr>
      <td>保守性</td>
      <td>保守的（短期的に最適な行動を選びがち）。</td>
      <td>リスクを取る可能性がある（長期的な視野）。</td>
    </tr>
    <tr>
      <td>探索の柔軟性</td>
      <td>低い（新しい行動を試しにくい）。</td>
      <td>高い（リスクを取って新しい選択肢を試せる）。</td>
    </tr>
    <tr>
      <td>安定性</td>
      <td>高い（予測可能で一貫した行動）。</td>
      <td>低い（行動が確率に基づき変動する）。</td>
    </tr>
    <tr>
      <td>短期と長期の視点</td>
      <td>短期的な最適解を求める。</td>
      <td>長期的な視点で探索を行う。</td>
    </tr>
    <tr>
      <td>失敗のリスク</td>
      <td>失敗の可能性が低い（安全な行動を選ぶ）。</td>
      <td>確率的に「悪い行動」を選ぶこともあるが、成長の余地がある。</td>
    </tr>
    <tr>
      <td>ゴール</td>
      <td>「どの状態でどの行動を選ぶべきか」の戦略を最適化していく</td>
      <td>「各状態や行動がどれだけの価値を持つか」を学ぶ</td>
    </tr>
  </tbody>
</table>
【UiPath】「エラー」よりも「エラーにならないバグ」を防ぐためのセレクター

時と場合にもよるが、「エラー」よりも「エラーにならないバグ」のほうがたいてい怖い。例えば毎日ウェブからデータを取得して蓄積するロボットがあったとして、「ある日突然エラーになって止まりました」よりも「いつかはわからないですけどある日から間違った値を取得してました」のほうがリカバリーするのが難しい。

例として、以下のウェブサイトから毎日「日経225先物」の「高値」を取得して記録するロボットを作るとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/c79855f7-1d97-f660-db66-c68480fd2bc3.png)

「Ui Explorer」で画像の赤枠で囲まれた要素を選択すると、行番号・列番号を基にしたセレクターが設定される。この設定では行番号と列番号で要素を特定できるが、例えば新しい先物の種類が追加されて行が増えたり、列の順番が変わったりして表のレイアウトが変更されると、エラーにはならないものの、意図しない場所の値を取得してしまう可能性が高い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/cf9c5606-50bb-75a4-184a-42d768d5e01c.png)

こういったケースでは行番号・列番号よりも行名・列名を指定したほうがよいだろう。この設定であれば、表のレイアウトが多少変更されても意図した値を取得することができるし、表から「日経225先物」の行が消えた時はちゃんとエラーになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/bf776dff-f5b1-3d96-038d-442365f29b3e.png)

頻繁に更新されるウェブサイトでもなければ、行番号・列番号を残したままで行名・列名を追加したセレクターでもよいかもしれない。変更には弱くなるが、正確性は上がるだろう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/4dc2f0aa-d9b3-8d32-f9ea-f6f53fe321b5.png)

## 動作環境
UiPath Studio 2025.0.157
起業するならElixirシリーズSTEP24. なぜスタートアップの技術選択としてElixirなのか

https://qiita.com/Yoosuke/private/bf23a90a047bd122d28c

前回のIT戦略の続きとして、Elixirがスタートアップの技術選択として優れている理由について、経営者の視点から解説していきます。そして長々書くと読まれないので、端的に書いておきます。Elixirの良さを多くの人に知ってもらいたい。w

あと、最後にお知らせもあるので是非最後まで読んでくださいね。

## 1. Elixirの主要な特徴とビジネス価値

### 信頼性と可用性
- **耐障害性（フォールトトレランス）**
  - システムの一部が故障しても全体は継続稼働
  - 自動復旧機能による高い可用性
  - ダウンタイムの最小化

- **分散システムのサポート**
  - 複数サーバー間での自動負荷分散
  - スケールアウトが容易
  - 地理的な分散システムの構築が可能

### パフォーマンス
- **並行処理の高い性能**
  - 大量のユーザーリクエストを同時処理
  - リアルタイム処理に最適
  - 効率的なリソース利用

- **低レイテンシー**
  - 応答速度の高速性
  - メモリ使用効率の良さ
  - バックグラウンド処理の効率化

## 2. スタートアップにとってのメリット

### 1. 開発効率
- **高い生産性**
  - 簡潔で読みやすいコード
  - 豊富な標準ライブラリ
  - 効率的なテスト環境

- **保守性**
  - 関数型プログラミングによる予測可能性
  - モジュール性の高さ
  - コードの再利用性

### 2. コスト効率
- **インフラコストの最適化**
  - 少ないサーバーで高いパフォーマンス
  - 効率的なリソース利用
  - スケーリングの柔軟性

- **運用コストの削減**
  - 監視の容易さ
  - トラブルシューティングの効率
  - 自動復旧機能による運用負荷低減

## 3. ビジネスニーズへの適合性

### リアルタイム処理要件
- チャットシステム
- IoTデバイス管理
- リアルタイム分析
- ストリーミングサービス

### 高トラフィック対応
- eコマースプラットフォーム
- SNSサービス
- ゲームサーバー
- 決済システム

## 4. 技術的な優位性

### 1. Phoenix Framework
- **高い生産性**
  - 迅速なAPI開発
  - リアルタイム機能の容易な実装
  - 充実した開発ツール

- **最新技術への対応**
  - WebSocket対応
  - GraphQL対応
  - マイクロサービス対応

### 2. Erlang VMの強み
- **実績ある基盤技術**
  - 通信業界での30年以上の実績
  - 99.999999%の可用性実現
  - 大規模分散システムでの実績

## 5. 人材面での考慮点

### 1. 採用市場
- Ruby開発者からの移行が容易
- 関数型プログラミングへの注目度上昇
- 技術コミュニティの成長

### 2. 学習曲線
- Ruby似の親しみやすい文法
- 充実したドキュメント
- アクティブなコミュニティ

## 6. 成功事例

### 海外事例
- Discord（コミュニケーションプラットフォーム）
- Pinterest（画像共有サービス）
- PagerDuty（監視サービス）

## 7. 導入検討のポイント

### 1. 適している領域
- リアルタイム処理が必要なサービス
- 高い信頼性が求められるシステム
- スケーラビリティが重要なアプリケーション
- マイクロサービスアーキテクチャ

### 2. 検討すべき課題
- 初期の学習コスト
- エコシステムの成熟度
- 採用市場の規模
- 既存システムとの統合

## まとめ：Elixirを選択する理由

Elixirは以下のような要件を持つスタートアップに特に適しています：

1. **高い信頼性が必要**
   - ミッションクリティカルなサービス
   - 24/7の可用性要件
   - データの整合性が重要

2. **スケーラビリティが重要**
   - 急成長を想定
   - 大規模ユーザー基盤
   - グローバル展開

3. **開発効率を重視**
   - 迅速な市場投入
   - 継続的な機能追加
   - 保守性の確保

と、ここまでつらつら書いてきましたが、スタートアップの成長フェーズに応じて、Elixirは柔軟に対応できる技術基盤を提供できていて、初期の開発効率から、スケールフェーズでの信頼性まで、ビジネスの成長に合わせた価値を提供できる技術選択だと思っています。

さぁ、こんなElixir、どこで学べるの？と思った貴方に朗報です。

## お知らせ

日本で唯一、Elixirについて現役のElixirエンジニア講師が教えてくれる教室があります。

内容は、Elixirをプロダクションに採用してる企業が企業研修として導入しているものと同じレベルでElixirだけでなく、Agileな開発やGitを使ったバージョン管理など、現場で使えるエンジニアを育成するプログラムになっています。

え？初心者は難しいのでは？と思った貴方にさらに朗報です。今なら初心者歓迎キャンペーンを行なってますので、ぜひ無料説明会に参加してみてください。

https://elixir.college/
LaTeXの「割り切らない」記号について

　これは以下の記事について勝手に補足するものである．

> LaTeX での「割り切る」記号
> https://blog.miz-ar.info/2018/03/latex-divides-symbol/
 
　LaTeXで「$p$が$q$を割り切る」という式を書きたいとき，数式環境内で
```LaTeX
p \mid q
```
と書けば，$p \mid q$が出力される．しかし，「$p$が$q$を割り切らない」と書きたいとき，いくつかの問題が生じる．まずはalign環境で以下のコードを出力してみる（このときmathtoolsおよびamssymbパッケージを読み込んでいるものとする）．
```LaTeX
p \not\mid q \\
p \nmid q \\
p \mathrel{\not |} q
```
　すると結果は次のようになる．
 
 ![スクリーンショット (138)2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967696/21b34ab4-9288-44b9-b220-2b9fd781d0fb.png)
 
　\not\midを使うと斜線が大きくずれてしまい，\nmidは斜線が短く，\mathrel{\not |}は$p$の右に余分な空白が空いてしまう．現在の TeX Live 2024 に含まれるパッケージ等では（おそらく）最適なコマンドは実装されていない．
 　結論から言うと，これに対する解決策はプリアンブル部に以下を挿入することである．
 ```LaTeX
\newcommand{\notmid}{\mathrel{\ooalign{$\mkern-5mu\not$\crcr$|$}}}
 ```
　これによって p \notmid q とすることで以下のような結果が得られる．
 
![スクリーンショット (139).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967696/67b008d4-5e80-402b-eb6f-44064da2feff.png)

　少々解説を挟むと，\mathrel{#1} は#1を関係演算子とするコマンド，\ooalign{#1\crcr#2} は#1と#2を重ねるコマンドである．また，\mkern は水平方向のスペースである（ここで用いたmuという単位は \mkern の他に \mskip や \mspace で使うことができるが，\hspace 等で使用することはできない）．これについてはこちらの記事を参考にさせていただいた．

 > TeXで同人誌を作ってみた。（マクロ）
 > https://yamaimo.hatenablog.jp/entry/2019/10/05/200000

 　なお，TeX Live 2025 以降で何らかのパッケージにこのようなコマンドが追加される可能性も0ではないので，その場合はそのコマンドの使用を推奨する．
　
   
  2024/12/28 追記: \caption{} 内の数式環境で\notmid を使うと "Illegal parameter number in definition of \reserved@a" というメッセージを残してエラーが発生した．これはどうやら\caption{} 内で\cite{}, \ref{}, \overrightarrow{} 等を使用すると同様に発生するエラーらしく，\notmid の場合は\crcr が問題となっているようである．その場合は以下のように\notmid の前に\protect を記述すればよい（これは他のコマンドでも大方同様である）．
  ```TeX
\caption{$p \protect\notmid q$}
  ```
　また，以下のように\DeclareRobustCommand を用いれば最初から強固な（\protect 無しで\section{} や\caption{} 内で使用できる）コマンドを定義できる．
```TeX
\DeclareRobustCommand{\notmid}{\mathrel{\ooalign{$\mkern-5mu\not$\crcr$|$}}}
```
Playwrightのエミュレーター機能について

# playwright.config.ts の記述について

playwright.config.tsにて以下の様なprojectを定義します。

```tsx
    {
      name: 'mobile',
      testMatch: 'testMobile.spec.ts',
      use: { ...devices['iPhone 13 Pro'] },
    },
```

上記はテストでiPhone 13 Proエミュレーターを使用する場合の記述です。

# テストの動作

例えば、以下の様なテストファイル”testMobile.spec.ts”があったとします。

```jsx
import { test } from '@playwright/test';

test('input fields', async ({ page }, testInfo) => {
  await page.goto('/');
  await page.locator('.sidebar-toggle').click();
  await page.getByText('Forms').click();
  await page.getByText('Form Layouts').click();
  await page.locator('.sidebar-toggle').click();
  const usingTheGridEmailInput = page.locator('nb-card', { hasText: 'Using the Grid' }).getByRole('textbox', { name: 'Email' });
  await usingTheGridEmailInput.fill('test@test.com');
  await usingTheGridEmailInput.clear();
  await usingTheGridEmailInput.fill('test@test.com');
});
```

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

```jsx
npx playwright test tests/testMobile.spec.ts --project=mobile
```

すると、以下のような画面でテストすることができます。

![名称未設定.jpg](https://prod-files-secure.s3.us-west-2.amazonaws.com/e02a7c36-3d50-4be6-95c4-29a0ad0a7254/cd0726df-e07f-4c6e-99f7-b6170cf2f5b3/%E5%90%8D%E7%A7%B0%E6%9C%AA%E8%A8%AD%E5%AE%9A.jpg)

# testInfoによる分岐

以下の様に、testInfoを使用することで、使用するエミュレーターによるif文も使うことができます。

```jsx
import { test } from '@playwright/test';

test('input fields', async ({ page }, testInfo) => {
  await page.goto('/');
  if (testInfo.project.name === 'mobile') {
    await page.locator('.sidebar-toggle').click();
  }
  await page.getByText('Forms').click();
  await page.getByText('Form Layouts').click();
  if (testInfo.project.name === 'mobile') {
    await page.locator('.sidebar-toggle').click();
  }
  const usingTheGridEmailInput = page.locator('nb-card', { hasText: 'Using the Grid' }).getByRole('textbox', { name: 'Email' });
  await usingTheGridEmailInput.fill('test@test.com');
  await usingTheGridEmailInput.clear();
  await usingTheGridEmailInput.fill('test@test.com');
});
```
Javaで「日時を比較する(compareTo)」の動作を確認してみた

# 概要

Javaで「日時を比較する(compareTo)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/calendar/index5.html

# 実装

以下のファイルを作成しました。

```testCalendar4.java
import java.util.Calendar;

class testCalendar4{
  public static void main(String args[]){

    Calendar calendar1 = Calendar.getInstance();

    System.out.println("日時1を2006/05/08 09:45:10に設定します");
    calendar1.set(2006, 4, 8, 9, 45, 10);

    Calendar calendar2 = Calendar.getInstance();

    System.out.println("日時2を2006/05/11 12:58:15に設定します");
    calendar2.set(2006, 4, 11, 12, 58, 15);

    int diff = calendar1.compareTo(calendar2);

    if (diff == 0){
      System.out.println("日付1と日付2は同じ日時です");
    }else if (diff > 0){
      System.out.println("日付1は日付2より進んでいます");
    }else{
      System.out.println("日付1は日付2より遅れています");
    }
  }
}
```

以下のコマンドを実行しました。
```
$ java testCalendar4 
日時1を2006/05/08 09:45:10に設定します
日時2を2006/05/11 12:58:15に設定します
日付1は日付2より遅れています
```

# まとめ

何かの役に立てばと。
起業するならElixirシリーズSTEP23. IT戦略 - スタートアップにおける技術選択の重要性

https://qiita.com/Yoosuke/items/551a9165983d02bcd2ac

続きです。

さて、このシリーズ、Elixirシリーズなので、そろそろシリーズタイトルに向けて収束していこうと思いますw（PAY.JPの方はどうなった？と思っている皆さん、安心してください。最後の回に改修を予定してます。間に合えば、、、）

## IT戦略 - スタートアップにおける技術選択の重要性
ということで、ここまで起業フェーズから始まり、経営フェーズでやる事多い、考える事多い問題をつらつらと書いてきましたが、まさにこれから起業する場合において、IT戦略において技術選択の重要性についてポイントを押さえておきたいです。

なぜなら、スタートアップにおいて、IT戦略は単なる技術的な選択ではなく、ビジネスの成功を左右する重要な経営戦略の一つです。特に、現代のデジタルビジネスにおいては、技術選択が事業の競争力や成長速度に直接的な影響を与えます。以下にポイントを列挙しておくので参考程度にあぁ、こういう事も考えておいた方が良いのねと眺めてみてください。

### 1. IT戦略の重要性
#### ビジネスへの影響

##### スピード
- 市場投入までの時間
- 機能追加・改善の速度
- スケーリングの容易さ

#### コスト

- 開発コスト
- 運用コスト
- 保守コスト
- 人材採用コスト

#### 品質

- システムの信頼性
- セキュリティ
- パフォーマンス
- スケーラビリティ

### 2. 技術選択の基準
#### 1. ビジネス要件との適合性

- 事業の成長速度への対応
- スケーラビリティ要件
- セキュリティ要件
- コスト制約

#### 2. 技術的な評価基準

- 性能と安定性
- 開発効率
- 保守性
- セキュリティ機能
- スケーラビリティ
- コミュニティの活発さ

#### 3. 人材面の考慮

- 採用のしやすさ
- 育成コスト
- チーム構築の容易さ
- 技術コミュニティの存在

### 3. スタートアップにおける技術スタック選択
#### 1. 初期フェーズでの考慮点

- 開発スピードの重視
- 最小限の運用負荷
- 柔軟な変更対応
- コスト効率の重視

#### 2. スケールフェーズでの考慮点

- パフォーマンスの最適化
- システムの信頼性向上
- セキュリティの強化
- 運用効率の向上

### 4. 現代のスタートアップに求められる技術要件
#### 1. マイクロサービスへの対応

- サービス間通信
- 分散システム管理
- 独立したデプロイ
- 障害の局所化

#### 2. クラウドネイティブ

- コンテナ化対応
- オートスケーリング
- サーバーレス対応
- クラウドサービス活用

#### 3. リアルタイム処理

- WebSocket対応
- イベント処理
- ストリーム処理
- 並行処理

#### 4. データ処理

- 大規模データ処理
- リアルタイム分析
- キャッシュ戦略
- データ永続化

### 5. これからの技術選択のポイント
#### 1. 長期的な視点

- 技術の成熟度
- コミュニティの持続性
- アップデート頻度
- サポート体制

#### 2. エコシステム

- ライブラリの充実度
- ツール群の整備状況
- 関連技術との親和性
- 開発者コミュニティ

#### 3. 新技術への対応

- AI/ML対応
- IoT対応
- エッジコンピューティング
- ブロックチェーン

ここまで、ざっと見てきましたが、これからの起業でIT考慮する際の技術選択は以下の要素を総合的に満たせていた方が有利に働くと考えてます。

### ビジネスの俊敏性

- 迅速な開発
- 柔軟な変更対応
- 市場投入の速さ

### 技術的な堅牢性

- 高い信頼性
- 優れたパフォーマンス
- 強力なセキュリティ

### 運用の効率性

- 低い運用コスト
- 容易な保守性
- スケーラビリティ

そして、このような要件を満たすプログラミング言語や技術スタックの一つとして、Elixirは技術選択の１つとして検討されています。次回はいよいよ、このシリーズの集大成としてElixirの特徴をお届けします。
起業するならElixirシリーズSTEP22.アライアンス戦略

https://qiita.com/Yoosuke/items/8015d5f85d858f490973

こちらの続きです。

経営戦略、事業戦略、機能戦略、財務戦略、コーポレートガバナンス、人材マネジメント、IRと書いてきました。次は、アライアンス戦略について書いて行きます。

ここからは、オプションみたいなもので絶対やったほうが良いとかそういう訳ではありません。が、常に選択肢として考えておきたい事ですし、準備も必要になるので、準備をすべきことを知っておいて損はありません。

## アライアンス戦略

アライアンス（事業提携）は成長を加速させる重要な戦略オプションです。アライアンスについて、特に若い企業が事業スピードを加速させる為に知っておきたい事を書いておきます。

アライアンスといっても、種類や目的が色々あります。僕も感覚的にやっていた事があるのですが、それが通用するのも最初のうちで、ちゃんと戦略的に狙ってすべきです。

### 1. アライアンスの基本的な種類
#### 資本提携

- 株式持合い
- 資本参加（マイノリティ投資）
- 合弁会社の設立
- M&A（完全子会社化）

#### 業務提携

- 販売提携（販路活用）
- 技術提携（ライセンス供与）
- 製造提携（生産委託）
- 共同研究開発
- 人材交流

僕の過去多くしてきた失敗は、資本提携系のアライアンスを検討する際に、会計がしっかりしてないと、大変な事になるです。いや、当たり前だろ？と思うかも知れませんが僕はこのあたりは起業当初から会計士さんだけは先に依頼して、お金周りはしっかりやろうと頼んでいたのですが、いざ蓋を開けてみると、会計士さんがいい加減な処理をしていた為に、このタイミングで問題が発見されるなどが起きました。

なので、起業準備の際にはCFOまでは行かなくとも、会計について見極めできるレベルの知識または、下手にケチって安いからお願いするなどせずにちゃんとした会計士さんや税理士さんを雇った方が良いです。

さて、横道にそれましたが、以下アライアンス戦略を検討する際に抑えておきたいポイントを列挙しておきます。

### 2. アライアンスの目的と効果
#### 主な目的

- 経営資源の補完
- 不足するリソースの獲得
- 既存リソースの有効活用
- コア技術の強化

#### 市場参入の加速

- 新規市場への早期参入
- 販路の拡大
- ブランド力の獲得

#### リスク分散

- 開発コストの分散
- 市場リスクの軽減
- 投資負担の軽減

#### 競争力強化

- 規模の経済の実現
- 技術力の向上
- サービス領域の拡大

### 3. アライアンスパートナーの選定
#### 選定基準

- 戦略的適合性
- 企業理念・ビジョンの共有
- 事業戦略の補完性
- 成長戦略の一致

#### 組織的適合性

- 企業文化の親和性
- 意思決定スピード
- コミュニケーションスタイル

#### 能力的適合性

- 技術力・ノウハウの補完
- 市場における競争力
- 経営資源の充実度

### 4. アライアンス推進のステップ
#### 1. 準備フェーズ

- 自社の強み・弱みの分析
- アライアンス戦略の立案
- 候補先の選定とアプローチ

#### 2. 交渉フェーズ

- 秘密保持契約（NDA）の締結
- 基本合意書（MOU）の作成
- デューデリジェンス
- 本契約の締結

#### 3. 実行フェーズ

- プロジェクトチームの組成
- 具体的な協業計画の策定
- KPIの設定
- 進捗管理体制の構築

### 5. アライアンスマネジメントの重要ポイント
#### 1. ガバナンス体制

- 意思決定プロセスの明確化
- 責任範囲の明確化
- 定期的な経営会議の開催
- 利益相反の管理

#### 2. コミュニケーション

- 情報共有の仕組み構築
- 定期的な進捗報告
- 課題解決の場の設定
- 担当者レベルの関係構築

#### 3. 成果管理

- 目標達成度の評価
- KPIのモニタリング
- 改善策の検討・実施
- 成果の可視化

こんな感じでしょうか、という事で相変わらず、やる事多すぎ問題ですね。
ここまで見てきて、やはり起業フェーズから経営と移行するにあたり、ますます一人じゃ難しいですよね、考える事や準備や実行やらたくさんの事をしなければならないので、経験も必要ですし、ドメインの知識ももちろん必要ですし、実は起業の成功確率は若くして起業するより、ある程度の業界知識（ドメインの知識）や人脈持った人の方が高いようです。

ただ、AIが急激な進化をとげてる現在は、ゲームチェンジが起きやすい時かなとも思っています。でも油断は禁物でAIのゲームチェンジはR&Dを戦略的に取り入れた技術系のスタートアップなら良いですが、サービス系は参入障壁が下がっている為、競争が激化していき、資本投下量が勝ち負けに影響を及ぼす状態になったら若くてリソースが少ない企業に勝ち目は無いです。
windowsでiverilog その170

# 概要　
windowsでiverilogやってみた。
自作cpu、見つけたので、調査してみた。
テストベンチやってみた。

# 参考にしたページ

https://qiita.com/Takaraya/items/8ffade382a0759f86739


# サンプルコード

```
module test;
	reg clk;
	reg reset;
	wire [3:0] acc;
	wire [3:0] mem_out;
	SimpleCPU u(.clk(clk), .reset(reset), .acc(acc), .mem_out(mem_out));
	initial
	begin
		clk = 0;
		forever #5 clk = ~clk;
	end
	initial
	begin
		reset = 1;
	#10
		reset = 0;
	#100
		$finish;
	end
	initial
	begin
		$display("Time            ACC  MEM[0]");
		$monitor(" %d %b %b", $time, acc, mem_out);
	end
endmodule

```

# 実行結果

```
>vvp a.out
Time            ACC  MEM[0]
                    0 0000 0101
                   15 0101 0101
                   25 1000 0101
                   35 1000 1000
sc0.v:70: $finish called at 110 (1s)

```

以上。
mindの研究 その92

# 概要
mindが、謎なので調べてみた。
AtCoderシリーズ

# 整数 a,b,cと、文字列 s が与えられます。 a+b+c の計算結果と、文字列 s を並べて表示しなさい。

https://qiita.com/ohisama@github/items/2d9f6a1d6c2e8c36b0d6

# 文字列内の、'1' の個数をカウントする

https://qiita.com/ohisama@github/items/0fee81d39b40c14ec5c4


# 二つの整数a,bの積の偶奇を判定する。

https://qiita.com/ohisama@github/items/f51c7618d1d655a947c4

# 文字列Sが、'dream','dreamer','erase','eraser'の組み合わせで作れるかどうかを判定する。

https://qiita.com/ohisama@github/items/d87d526b32982303cdd5

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

https://qiita.com/ohisama@github/items/155a10cde2b504e3f84f

# 1以上N以下の整数のうち、10進法での各桁の和がA以上B以下であるものの総和を求めてください。

https://qiita.com/ohisama@github/items/d267344cd4a4a3b3eef5

# N個の整数の重複しない値の数を求める。

https://qiita.com/ohisama@github/items/962877a3ab0949cb5103

# 10000円札、5000円札、1000円札がある前提で、合計がN枚、Y円になる組み合わせを求める。

https://qiita.com/ohisama@github/items/6b340177b3b9533e5d16

# 座標(0,0)を出発地点とした場合、時刻ti時点で(xi,yi)にいることができるかどうかを判定する。

https://qiita.com/ohisama@github/items/8ec2eb7db59597555edf

# N枚のカードを交互に自身の得点が最大になるように取っていった場合の、二人の得点の差分を求める。

https://qiita.com/ohisama@github/items/0dac7d673c1b0fe9ebc1

# 500円玉、100円玉、50円玉を使ってXX円を支払う方法が何通りあるかを求める。

https://qiita.com/ohisama@github/items/ca8bc7546ea2d546a89d

以上。
【初心者がDDDを理解するまでpart1】ドメイン駆動設計とは？

# はじめに
今回は、ソフトウェア開発の設計手法として注目されているドメイン駆動設計（DDD: Domain-Driven Design)について、学んだことをまとめました。シリーズの第1回目となる本記事では、ドメイン駆動設計が生まれる前の従来の設計手法から、なぜDDDが必要となったのか、その背景と基本的な考え方をご紹介します。

## **1. ドメイン駆動設計が誕生以前の考え方**

### **1.1 従来のソフトウェア設計手法**

ソフトウェア開発はこれまで、主に以下のような設計手法が用いられてきました。

- **機能分割型設計（機能主導型）**：
  - システムを機能ごとに分割し、それぞれの機能を個別に実装する方法。
  - 画面設計やデータ処理ロジックを中心に開発が進められる。
- **データ駆動型設計（データ主導型）**：
  - データベースのスキーマを最初に設計し、そのデータ構造に基づいてアプリケーションを組み立てる方法。
  - データの永続化や取得を重視。

### **1.2 従来の設計手法の問題点**

しかし、これらの設計手法には次のような問題点がありました。

1. **ビジネス要件との乖離**：
   - システムの設計が技術的な観点に偏り、ビジネスの目的やドメイン知識が十分に反映されない。
   - 結果として、ビジネスの変化に柔軟に対応できないシステムになりがち。
2. **複雑性の増大**：
   - 機能やデータを中心に設計すると、システム全体の関係性が複雑化。
   - コードの再利用性や保守性が低下。
3. **コミュニケーションの断絶**：
   - 開発者とビジネス担当者との間で共通言語がなく、要件の誤解や伝達ミスが発生しやすい。

## **2. ドメイン駆動設計の誕生**

### **2.1 ドメイン駆動設計の登場背景**

これらの課題を解決するために、2003年にエリック・エヴァンス氏が著書『**ドメイン駆動設計~エンタープライズアプリケーション開発のための思想と実装**』を発表しました。ここで提唱されたのが**ドメイン駆動設計（DDD）**です。

### **2.2 ドメイン駆動設計の目的**

ドメイン駆動設計の主な目的は、**ビジネスの本質（ドメイン）を深く理解し、それをソフトウェアに適切に反映させること**です。これにより、ビジネス要件の変化に柔軟に対応でき、長期的に価値を提供できるシステムを構築することを目指しています。

## **3. ドメイン駆動設計とは？**

### **3.1 ドメインとは何か**

まず、**「ドメイン」**という言葉について理解しましょう。ドメインとは、**ビジネスが解決しようとしている問題領域や知識の範囲**を指します。例えば、金融、医療、物流など、それぞれの業界やビジネス特有の専門知識やルールがあります。

### **3.2 ドメイン駆動設計の基本的な考え方**

- **ドメインモデルの構築**：
  - ビジネスの専門家（ドメインエキスパート）と開発者が協力して、ドメインの知識をソフトウェア上で表現する。
  - ドメインモデルは、ビジネスの概念やルールをオブジェクトとして定義し、その関係性や振る舞いを明確にする。
- **ユビキタス言語の使用**：
  - ドメインエキスパートと開発者の間で共通の言語（ユビキタス言語）を使用してコミュニケーションを図る。
  - モデルのクラス名やメソッド名にもユビキタス言語を反映させ、一貫性を持たせる。
- **境界づけられたコンテキスト**：
  - 大規模なシステムでは、ドメインを適切な境界で分割し、それぞれのコンテキストごとにモデルを定義する。
  - 各コンテキスト間の関係性を明確にし、依存関係を管理する。

### **3.3 DDDの主な要素**


1. **値オブジェクト（Value Object）**：
   - 不変の値を持ち、識別子を持たないオブジェクト。
   - 例：日付、金額、住所など。
2. **エンティティ（Entity）**：
   - 識別子によって区別され、同一性を持つオブジェクト。
   - 例：ユーザー、注文、商品など。
3. **集約（Aggregate）**：
   - 関連するエンティティや値オブジェクトの集合を一つの単位として扱う。
   - 集約ルートを通じて外部からの操作を制限する。
4. **リポジトリ（Repository）**：
   - 集約を永続化するためのインターフェースを提供。
   - データの保存や取得の詳細を隠蔽する。
5. **サービス（Domain Service）**：
   - エンティティや値オブジェクトに属さない、ドメインの操作を実装。
   - 主にビジネスロジックを含む。

## **4. ドメイン駆動設計のメリット**

### **4.1 ビジネスとの整合性**

ドメインモデルを構築することで、ビジネスの要件やルールがコードに直接反映されます。これにより、システムがビジネスと同じ言語で記述されるため、理解しやすくなります。

### **4.2 変更への柔軟性**

ビジネスは常に変化しますが、ドメイン駆動設計ではドメインモデル自体を改善・拡張することで、変更に柔軟に対応できます。

### **4.3 コードの再利用性と保守性の向上**

明確なモデル設計により、コードの再利用が促進され、保守性が向上します。各コンポーネントが役割に応じて適切に分離されているため、影響範囲を最小限に抑えることができます。

## **5. ドメイン駆動設計が生まれた理由**

### **5.1 ビジネスと技術のギャップの解消**

従来の開発手法では、ビジネス要件が技術的な実装にうまく反映されず、期待した成果が得られないことが多々ありました。ドメイン駆動設計は、このギャップを埋めるために生まれました。

### **5.2 複雑なドメインの管理**

ビジネスが複雑化する中で、その複雑性を適切に管理し、システムに反映する必要性が高まっていました。DDDは、複雑なドメインをモデル化し、その知識をソフトウェアに組み込む手法を提供します。

## **6. まとめ**

ドメイン駆動設計（DDD）は、ビジネスの本質を深く理解し、それをソフトウェアに反映させるための設計手法です。従来の設計手法が抱えていたビジネスとの乖離や複雑性の増大といった課題を克服し、より柔軟で保守性の高いシステムを構築することができます。
見せ算の復習(M-1GP 2023)

# 2024年12月22日18:30～　M-1グランプリ放送
に先立ち、昨年のさや香のファイナルラウンドでやったネタ「見せ算」を復習しましょう！

# 演算規則[^1]
- 同じ数字を見せると0になる。($1見せ1=0$)
- 異なる数字のときは、大きい数字が解となる。($1見せ2=2$)
- $6見せ9=11$
（お互いが生き別れの兄弟と勘違いして近づいて11に見えるため。）
- $2見せ5=1.1$
（お互いが生き別れの兄弟と勘違いして近寄るがよく見ると全然違うことに気付きびっくりして携帯「.」を落としてしまうため。）
- $1見せ100=83$
（あまりにも人数差がありもう逃げても仕方ないと1が腹をくくって100に立ち向かい17人倒すため。）

# Pythonコード
```Python
def show(x, y):
    # 特別なルール
    if (x == 6 and y == 9) or (x == 9 and y == 6):
        return 11
    if (x == 2 and y == 5) or (x == 5 and y == 2):
        return 1.1
    if (x == 1 and y == 100) or (x == 100 and y == 1):
        return 83
    
    # 同じ数字の場合
    if x == y:
        return 0
    
    # 異なる数字の場合、大きい数字を返す
    return max(x, y)

# テスト
print(show(1, 1))   # 出力: 0
print(show(1, 2))   # 出力: 2
print(show(6, 9))   # 出力: 11
print(show(2, 5))   # 出力: 1.1
print(show(1, 100)) # 出力: 83
print(show(3, 7))   # 出力: 7
```
みたところ、0は単位元で、交換法則が成り立つ。

# ※補足
8見せ1や、3見せ2見せ8もあるらしい...[^2]
はたして一般化できるのか、それともできないことを証明できるか？

[^1]: [見せ算とは (ミセザンとは) [単語記事] - ニコニコ大百科](https://dic.nicovideo.jp/a/%E8%A6%8B%E3%81%9B%E7%AE%97)
[^2]: [見せ算（さや香のネタ） - 高精度計算サイト](https://keisan.casio.jp/exec/user/1703486507)
闇落ちしてダークモードの住人になる(白内障)


2023年春。

近日中に白内障の手術を、というぐらいの状態になりました。
白地に文字の画面(白黒画面)では文字がサッパリ読めません。Windows 10の白地に空色の文字とかサイアクです

比較的読みやすいのは黒字に白い字の画面(黒白画面)です。 ということで対策メモ

# Windows
## 高コントラスト・モード
WindowsのUIと標準のアプリを黒白表示にします。アイコン等も黒白表示になって(白内障気味だと)だいぶ見やすくなります。
各アプリに対しては黒白画面にすることを要求しますが、対応はアプリ次第なので変わらないのもあります。

左SHIFT + 左ALT + PrtSrc

を押下すると ピュイ と音が鳴ってダイアログが表示されるので、更に

ALT +Y

押下。
戻すには

左SHIFT + 左ALT + PrtSrc

です。ダイアログ表示無しに ピュイ と鳴って戻ります。

## 拡大鏡
起動・終了は

 Win キー + テンキーの「+」

です。

Windows 11 では画面全体が拡大されマウスの動きに追随します。

Windwos 10 では矩形の領域に拡大表示する従来からの方式です。

# Ubuntu Linux 22.04 LTS
設定でダークモードを選ぶと UI と ファイラー程度は ダークモードになりますが、アプリのほとんどはダークモードになりません。

## FireFox
UIをダークモードに設定します。

肝心の画面はついずいしないのでアドオン DarkReader で全体を強制ダークモードにします。
Webアプリで個別にダークモードが設定できるサイトは DarkReader で個別にダークモードをOFFにします。下記でダークモード設定対応のWebアプリはこのようにします。

## google chrome
強制ダークモードで起動します。
これでUIはダークモードになります。ブックマークバーが黒白になって見やすいです。
しかし、プルダウンメニューは白黒のままです。なんでだろ。


## ダークモード設定可能Webサイト(Linux)
- github
- evernote web
- おーぷん 2ちゃんねる
- google検索 検索のみ。他はアドオン等で対応。

# 上記でもダメなやつ
## google翻訳
2023年4月末頃から DarkReader を使っても翻訳結果部分が白黒で表示されるようになりました。

しょうがないのでコレに関しては emacs 使いなので google-translater.el を使います。

# 追記
2023年5月に白内障手術済