OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】Docker環境で.envがリアルタイムに反映しない時の解決方法

## 結論
```yaml:docker-compose.yml
laravel:
    env_file:
      - ./.env
```
docker-compose.ymlで上記のようなenv_fileでの.env参照(Composeの環境変数)をやめるでした。
https://docs.docker.jp/compose/environment-variables.html

## 経緯
Laravelを5年くらい使ってますが、なぜか毎回コンテナを作り直さないと.envが反映されないという
聞いたことがあるような、無いような~~超不便~~環境に悩まされてました。
当然、下記は試していました。[^1]
```
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
composer dump-autoload
php artisan clear-compiled
php artisan optimize
php artisan config:cache
php artisan key:generate
rm -f bootstrap/cache/config.php
```
参考
https://qiita.com/Ping/items/10ada8d069e13d729701
https://qiita.com/ponsuke0531/items/1a665c68d12a74a29a42

## 暫定対策
唯一envを反映させることができるコマンド
```
docker compose down laravel nginx
docker compose up -d laravel nginx
```
→ビルドではなく、コンテナの再構築だけなので、30秒くらいで反映できるが、頻繁にテストしたい時などその時間すら惜しい状況。。。


## 気づいたきっかけ
一部bladeファイルを使っている箇所があるのですが、そこはなぜかリアルタイムに反映されていました。
そこから全てではない→そこに糸口がありそうと思い、色々調べたところ、
- bladeは都度php-fpmが再起動して、envを読み直している
- Composeの環境変数として渡すと、Laravelのアプリケーションは初回ブート時に.envを使って初期化を完了させてしまう

ということがわかりました。

## 注意点
```yaml:docker-compose.yml
laravel:
    env_file:
      - ./.env
```
の便利どころは`docker compose up -d`した時などでLaravelの外で.envを参照したい時です。
そういった使い方をしていると、問題が出てきてしまうので、それ用の環境変数はそれぞれ作成する形に変えるか、上記のまま利用するしかないです。

[^1]: 自分が調べた限りだと、LaravelのDocker環境で.envがリアルタイムに反映しない対策としてComposeの環境変数に言及した記事はなかったです。
Python dataclassについて

# 使い方

```Python
from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

p = Person("Alice", 30)
print(p)
```
```sh
Person(name='Alice', age=30)
```

# 何が嬉しいか？

いくつかの特殊メソッドが自動生成されます。

これにより、dataclassを使わない場合と比較して、いくつかの利用シーンにおいて記述が少なくて済みます。
例えば、特殊メソッド[`__repr__()`](https://docs.python.org/ja/3.13/reference/datamodel.html#object.__repr__)などを利用したいシーン(printによってobjectの情報を標準出力したいシーン)において、通常のclassでは以下のように自前で実装する必要がありますが、dataclassでは不要です。

```Python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return f'Person(name={self.name}, age={self.age})'


p = Person("Alice", 30)
print(p)
```

```sh
Person(name=Alice, age=30)
```

特殊メソッド `__eq__()` も自動生成されるので、等価比較ができるようになります。

```Python
u1 = Person("Taro", 20)
u2 = Person("Taro", 20)
print(u1 == u2)
```

特殊メソッド `__lt__()`や`__gt__()` も自動生成されるので、大小関係の比較ができるようになります。


```Python
@dataclass(order=True)
class Task:
    priority: int
    name: str
```

```Python
t1 = Task(1, "A")
t2 = Task(2, "B")
print(t1 < t2
```
【ABC407】AtCoder Beginner Contest 407【C++】

### コンテスト名
AtCoder Beginner Contest 407（Promotion of AtCoderJobs）

### コンテストURL
https://atcoder.jp/contests/abc407

### 開催日
2025/05/24 21:00–22:40

---

## [A: Approximation](https://atcoder.jp/contests/abc407/tasks/abc407_a)
**解法**
- $\lfloor \frac{A}{B} \rfloor$ か $\lfloor \frac{A}{B} \rfloor + 1$ のいずれかが答えである
```cpp:ABC407A.cpp
#include <iostream>
#include <cmath>
using namespace std;

int main(){
    int a, b;
    cin >> a >> b;

    int c = a / b;

    if(abs(c*b-a)<abs((c+1)*b-a)){
        cout << c << endl;
    }else{
        cout << c + 1 << endl;
    }

    return 0;
}
```

## [B: P(X or Y)](https://atcoder.jp/contests/abc407/tasks/abc407_b)
**解法**
- $6^2$ 通りを全探索する
```cpp:ABC407B.cpp
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main(){
    int x, y;
    cin >> x >> y;

    int cnt = 0;
    for(int i=1; i<=6; i++){
        for(int j=1; j<=6; j++){
            if(i+j>=x || abs(i-j)>=y){
                cnt++;
            }
        }
    }

    printf("%.10f\n", cnt/36.0);

    return 0;
}
```

## [C: Security 2](https://atcoder.jp/contests/abc407/tasks/abc407_c)
**解法**
- 後ろから考える
- ボタン B を押しすぎてしまった分は、もう 1 周する
```cpp:ABC407C.cpp
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s;
    cin >> s;

    int cnt = 0;
    for(int i=s.size()-1; i>=0; i--){
        if(cnt%10<=(s[i]-'0')){
            cnt += (s[i]-'0') - cnt%10;
        }else{
            cnt += (s[i]-'0') + 10 - cnt%10;
        }
    }

    cout << cnt + s.size() << endl;

    return 0;
}
```

## [D: Domino Covering XOR](https://atcoder.jp/contests/abc407/tasks/abc407_d)
**解法**
- 再帰関数
```cpp:ABC407D.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;

int h, w;
vector<vector<long long int>> A;
unordered_map<int, long long int> M;

long long int dfs(int pos, int mask){
    if(pos>=h*w){
        long long int res = 0;

        for(int  i=0; i<h*w; i++){
            if(!((mask>>i) & 1)){
                int x = i / w, y = i % w;
                res ^= A[x][y];
            }
        }

        return res;
    }

    if(M.count(mask)){
        return M[mask];
    }

    if((mask>>pos) & 1){
        return dfs(pos+1, mask);
    }

    long long int maxv = dfs(pos+1, mask);
    int x = pos / w, y = pos % w;

    if(x+1<h){
        int down = pos + w;
        if(!((mask>>down) & 1)){
            int nmask = mask | (1<<pos) | (1<<down);
            maxv = max(maxv, dfs(pos+1, nmask));
        }
    }

    if(y+1<w){
        int right = pos + 1;
        if(!((mask>>right) & 1)){
            int nmask = mask | (1<<pos) | (1<<right);
            maxv = max(maxv, dfs(pos+1, nmask));
        }
    }

    return M[mask] = maxv;
}

int main(){
    cin >> h >> w;

    A.assign(h, vector<long long int>(w));
    for(int i=0; i<h; i++){
        for(int j=0; j<w; j++){
            cin >> A[i][j];
        }
    }

    cout << dfs(0, 0) << endl;

    return 0;
}
```
Geminiでタンバリンを使う魔法少年を描いてみた。

# 概要

Geminiでタンバリンを使う魔法少年を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
聖なるタンバリンを使う魔法少年を描いてください。
```

![聖なるタンバリンを使う魔法少年_20250525.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/4164f42f-8ba4-4d35-b116-469d1dbb54fb.png)

# まとめ

何かの役に立てばと。
abc252 d

**abc252 d**

https://atcoder.jp/contests/abc252/tasks/abc252_d


# 問題文
 次の{i,j,k}のペアの個数を求める
- i < j < k
- a[i] と a[j] と a[k]は異なる

制約
3 <= N <= 2×10^5
1<= a[i] <= 2×10^5


入力例1
```c
4 
3 1 4 1
```
# 考え方

jを固定してみる
かつ、a[i] < a[j] < a[k]にしてみる

まず入力例1を昇順にかんがえる
```c
1 1 3 4
```

(配列bとする)

### b[0]をjとして考えてみる

 b[0] == 1より小さい数字の数 → 0 {}
 b[0] == 1より大きい数字の数 → 2 {3,4}
 
 0*2で、b[0]をjとしたときのi,j,kの組み合わせは0個
 (b[1]も同じ)

### b[2]をjとして考えてみる

  b[2] == 3より小さい数字の数 → 2 {1,1}
  b[2] == 3より大きい数字の数 → 1 {4}
 
 2*1で、b[2]をjとしたときのi,j,kの組み合わせは2個

### b[3]をjとして考えてみる

  b[3] == 4より小さい数字の数 → 3 {1,1,3}
  b[3] == 4より大きい数字の数 → 0 {}
 
 3*0で、b[3]をjとしたときのi,j,kの組み合わせは0個

_______________________________________

よって0 + 0 + 2 + 0で入力例1の答えは2になります

b[j]以下の数字と、以上の数字の数は累積和でO(1)で求めれます！
```c
ll n;
cin>>n;
vector<ll> a(n);
rep(i,n){
    cin>>a[i];
}
ll z = 200000+1;//最大値
vector<ll> cnt(z+1);//累積和
rep(i,n){
    cnt[a[i]]++;
}
rep(i,z){
    cnt[i+1] += cnt[i];
}
ll ans = 0;
rep(i,n){
    ans += cnt[a[i]-1]*(n-cnt[a[i]]);
}
cout << ans;
```

>https://atcoder.jp/contests/abc252/editorial/3965

kyopro_friendsさんの解説をもとに作ってみました
コードはほぼパクリですが、、
FormsとPower Automateでゲスト招待&棚卸システム作ってみて気づいたこと


# 社内の申請系にFormsをつかうのはアリかとおもう

今年のゴールデンウィーク、特に出かける予定もなかったので、前から気になっていた **Microsoft Forms と Power Automate の連携**を試してみました。  
テーマは「社内の申請システムをノーコードで作ってみる」です。

9回にわたって開発の様子をブログに書いたのですが、この記事ではその中で得た気づきや「やってみて初めてわかったこと」をまとめてみようと思います。

---

## システムの概要

今回作ったのは、**社内でゲストユーザーを招待するための申請フロー**です。

- 申請者がFormsで申請
- 承認者が承認
- 承認されたらゲストがテナントに登録される
- 申請時に90日・180日・360日のいずれかの期限を設定
- 期限が近づくと、延長 or 削除の選択を促すメールが申請者に届く
- 延長されなかったゲストは、期限到達時に自動で削除

という流れです。  
「ちょっとした申請フローなら、これで十分じゃない？」と思えるくらいには動いてくれました。

---

## システムの構成

このシステムは、以下の3つの要素で構成されています。

1. **ゲスト招待申請用のForms（SPOリスト連携版）**
2. **SPOリスト追加をトリガーに、承認とゲスト追加を行うクラウドフロー**
3. **定期実行トリガーで、期限チェックと削除を行うクラウドフロー**

---

## 作ってみて初めて気がついたことっておおいよね
### 🔸 列名を考えるのにCopilot Chatが使えた  
🔗 [その１より](https://mocabrown.com/blog/archives/7535)  
SPOリストの列名を決めるとき、**日本語の列名を箇条書きでCopilot Chatに渡すと、自然な英語名を提案してくれる**のがとても便利でした。

---

### 🔸 SPOリストの必須列は「項目の更新」で上書きしないといけない  
🔗 [その２より](https://mocabrown.com/blog/archives/7571)  
クラウドフローでSPOリストの値を更新するには「項目の更新」アクションを使いますが、**必須列は変更がなくても値を再指定しないとエラーになる**んですね。  
同じ値で上書きするのはちょっと無駄な気もしますが、仕方ない。項目が多いと指定ミスにも注意が必要です。

:::note info
記事の投稿をXに投稿した際に、こちらの技を投稿者の おいしみさんに紹介していただきました。
SPOリストのリスト名をあえて動的に設定することで、必須列を無視させるテクニックです。
　↓
:::

https://qiita.com/songoku/items/2622951092ad5f026424

---
### 🔸 正規表現はOffice Scriptで代用  
🔗 [その２より](https://mocabrown.com/blog/archives/7571)  
クラウドフローには正規表現がないので、**Excel + Office Script をSharePointに置いて、スクリプトでチェック処理**を実装しました。  
今回はゲストのEmailアドレスの妥当性チェックに使いました。

---

### 🔸 承認はタイムアウトも大事  
🔗 [その３より](https://mocabrown.com/blog/archives/7610)  
承認される・却下されるだけでなく、**期限までに何もされなかった（タイムアウト）ケース**も考慮する必要があると気づきました。  
待機時間の指定にはISO 8601形式を使うのですが、これもCopilot Chatに聞いたらすぐわかりました。

---

### 🔸 「ユーザーの作成」ではゲスト登録できない  
🔗 [その４より](https://mocabrown.com/blog/archives/7649)  
ゲストを追加するには、**Graph APIを使う必要がありました**。「ユーザーの作成」アクションではダメなんですね。  
プレミアムコネクタを使わない方針でしたが、ここだけはHTTP要求アクションを使いました。

---

### 🔸 テストを繰り返すので「静的な結果」が便利  
🔗 [その５より](https://mocabrown.com/blog/archives/7673)  
何度もテストする中で、**承認済み状態を再現できる「静的な結果（プレビュー）」**がとても便利でした。  
「なんとなく知ってたけど、ちゃんと使うと便利」ってやつです。

---

### 🔸 ゲストの状態確認には externalUserState  
Graph APIの `externalUserState` を使えば、**招待メールを承諾したかどうか**がわかります。  
「ユーザープロフィールの取得（V2）」でこの列を追加すれば、HTTP要求を使わなくても取得できました。

---

### 🔸 スコープ内のエラーは result 関数で確認  
🔗 [その６より](https://mocabrown.com/blog/archives/7727)  
スコープの中でどこが失敗しているのかを確認するには、**result関数が便利**でした。  
今まで使ったことなかったけど、知っておくと安心。

---

### 🔸 承認処理にはコンカレンシー制御が必要  
🔗 [その７より](https://mocabrown.com/blog/archives/7763)  
複数の承認待ちがあるとき、**コンカレンシー制御をONにしないと順番待ちが発生**します。  
今回のシステムを作った目的のひとつが「承認を使いこなす」だったので、ここは大きな学びでした。

---

### 🔸 ゲスト削除にはUPNじゃなくオブジェクトIDを使う  
🔗 [その８より](https://mocabrown.com/blog/archives/7796)  
Graph APIで削除リクエストを送るとき、**UPNに `#` が含まれているとエラーになる**んですね。  
「ユーザープロフィールの取得」アクションでオブジェクトIDを取得して、それを使えばOKでした。

---

## おわりに

FormsとPower Automateを使った申請システム、**思った以上に実用的**でした。  
ノーコード／ローコードでここまでできるなら、ちょっとした社内業務の自動化には十分アリだと思います。
ああ、なるほどね！と思ってもらって少しでもお役にたてるものであれば良いなと願うばかりです。

---
WSL への online-judge-tools (oj) 導入メモ 2025年5月時点

# はじめに

新しいパソコン（Windows11）で、WSLでonline-judge-tools(ojコマンド)を使えるようセッティングしようとしたら、はまりました。解決策をメモします。環境は以下のとおりです。

- Windows 11
- WSL上のUbuntu 24.04
- Ubuntu上のPython 3.12
- online-judge-tools 11.5.1

# はまった内容3点

1. インストールできない
1. ojが動かない
1. AtCoderにログインできない

それぞれ解決策を書いていきます。


# はまりポイント１：インストールできない

## 現象

~~~
pip3 install online-judge-tools
~~~

を実行しても以下のとおりエラーになる。

~~~
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.
（後略）
~~~

## 原因

WSLをインストールした際のデフォルトのOSは、2024年5月ころからUbuntu 24.04になったようです。Ubuntu 24.04ではPythonのバージョンが3.12です。Python 3.12以降では、システムPythonでは直接pip installを使えないようになっている、らしいです。

## 解決方法

pip3の代わりにpipxを使いましょう。

### ①pipxのインストール

以下を実行します。

~~~
sudo apt update
sudo apt install pipx
pipx ensurepath
~~~

その後、一度ターミナルを閉じるか、source ~/.bashrc を実行して PATH を更新します。

### ②pipxを使ってojをインストール・・・？

この後普通に進めると"pipx install online-judge-tools"としてしまうところですが、それはNGです。次のはまりが発生します。


# はまりポイント２：ojが動かない

## 現象

ojを実行すると以下のようにエラーが出る。

~~~
$ oj --version
Traceback (most recent call last):
  （中略）
ModuleNotFoundError: No module named 'distutils'
~~~

## 原因

Python 3.12にはdistutils モジュールが入っていないためです。Python 3.11以前は非推奨でありながら入っていましたが、Python 3.12以降削除されたらしいです。

## 解決方法

ojだけPython 3.11で動くようにします。

### ①Python 3.11をインストール

~~~
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11 python3.11-venv
~~~

### ②pipx で oj をインストール

~~~
pipx install --python python3.11 online-judge-tools
~~~

※ 誤って既に3.11を指定せずインストールしてしまっている場合は、以下で上書きインストールできる

~~~
pipx reinstall online-judge-tools --python python3.11
~~~

# はまりポイント３：AtCoderにログインできない

## 現象

以下を実行し、ユーザー名とパスワードを入力してもログインができない。ブラウザからならログインできる。

~~~
oj login https://atcoder.jp/
~~~

## 原因

AtCoderがセキュリティ強化をしているため、だと思います。

## 解決方法

以下の素晴らしい記事に書いてあります。
https://kaiyou9.com/acc_and_oj_login_failed/
[vue3] "v-model"をフロントエンドエンジニア1年生が噛み砕く

## はじめに。
v-modelは初心者には優しくないよねっていう話。

今年の4月から、晴れてフロントエンドエンジニアのキャリアがスタートしたわけですが、弊社ではVue3を使って開発をしています。Vue公式ドキュメントは読み漁り、いざ現場のコードを触るわけですが、わからないことだらけです。

私は以前勤めていた会社（某エンジニア育成会社）ではReactを学習していました。
何が違うって、大きく違うのは糖衣構文（シンタックスシュガー）だと思っています。
その糖衣構文のせいで、頭の整理が追いつかなくなるわけです。だって何が起きているか明示的に書かれていないんですから。そんな中から`v-model`を題材にした記事を書いてみましたので、私と同じVueを触り始めたばかりという方にぜひ読んでいただき、共感してもらえたら嬉しいです。

## 優しくない理由
```javascript
<input
① :value="text"
② @input="event => text = event.target.value">
```
上記のコードは何をしているのかすぐにわかりますよね。
① `value`属性に`text`という変数がバインディングされているな〜
② `input`属性は、入力イベントを受け取ってその値を①の`text`に代入しているな〜
うんうん、つまりは`<input>`という一つの要素内でイベントの値とその値の保持をしているんだな〜。こんな感じだと思います。では下記のコードはどうでしょうか？

```javascript
<input v-model="text">
```
おい、何が起きてんだ！って、正直なりませんか？
（私はなりました。なんならこの間やっと理解しました）

## v-modelを理解する
#### 混乱の原因を特定する
`v-bind` `v-on`の両方を使って値を同期しているパターンと、v-modelとでは明らかな記述量の違いで混乱しますよね。確かにシンタックスシュガー（糖衣構文）で簡略化されてコードの量も減って、Vueを完全理解をしている人からしたら可読性が上がるかもしれないけど、初心者からすると端折られすぎて何してるか、**裏で何が起こっているのか**なんてパッと見じゃわかりづらいですよね。

#### 裏で起きていることを理解する
まずは観察をしてみましょう。
```javascript
<input
 :value="text"
 @input="event => text = event.target.value">

<input v-model="text">
```
①何が共通していて、②何が省略されたのかを見つけます。
1. `text`が共通している
2. `@input="event => XX = event.target.value"` が省略されている

それぞれを言語化してみます。

① `text`は`const text = ref()` の変数`text` のことで、リアクティブな値です。
② input要素の入力イベントを`event`引数で受け取り、変数`text`に`event.target.value`を代入しています。

裏で何が起きているのかが明確になりましたね。
②で起きていることのほとんどを省略しているということです。
この**ほとんど**とは、変数`text`に何かを代入するという処理以外は全て端折っているということです。実際には裏で起きていることで、目には見えていないというのが事実ですが。

## 新卒フロントエンジニアの腑に落ちた考え方
```javascript
<input v-model="text">
```
フォーム要素(今回は`<input>`)はユーザーの入力によってイベントが発生します。イベントで得た値を利用する目的でフォーム要素を使いますよね。

つまりは`"event => XX = event.target.value"` という記述はフォーム要素で必ずと言っていいほど書かれるんです。ここで **v-model** というわけなんですよね。

なので、「あ、フォーム要素あるな〜」って見つけて、v-modelが使われていたならば、裏側では`"event => XX = event.target.value"`が行われていて、`v-model="XX"`にイベントで受け取った値が代入されるんだな〜って思ってください。

## 次回、カスタムコンポーネントの `v-model` を噛み砕く
基本的には、v-modelはフォーム要素全般で使用されますよね。
しかし、フォーム要素以外にも使えるようにするカスタムコンポーネントなんてものがあるということで、次回はこの題材を噛み砕こうと思っています。
個人開発を5年続けて気づいた8つの事

Webアプリの個人開発を続けて、気づいたら5年目になっていたので振り返って気づいたことやこうしておけばよかったという反省点などを書いてみたいと思います。技術的な話はあまり含みません。
Googleアナリティクスによるとアプリの累計ユーザー数は3万程度、毎日のユーザー数は100前後と言ったところです。

# まずは始めてみよう
何よりもこれが大事です。普段目にするアプリは出来の良い物ばかりなので、それに負けないようなアプリを作ろう！と意気込むのは悪くないですが、__あまりハードルを上げるとリリースまでたどり着けずに頓挫してしまうでしょう。__ 何より、まだ開発者ではないあなたが急にアプリをリリースしたとして、注目される可能性がそもそも低いです（別口で知名度があるならば話は別ですが）。
最初から大変な労力をかけて、全く使われなかったときの精神的ダメージは計り知れないので、__スモールスタートで少しずつ大きくしていくことを強くお勧めします。__

# 機能の豊富さ≠アプリの出来≠ユーザーの受け
 **機能の豊富さやアプリの出来とユーザーへの受けの良さは意外と一致しません。** 
長い時間をかけて個人的に良いものが出来たと自負したものがSNS（X）で100いいね前後で、数時間でパッと作ったものが数千いいねされたことがあります。
開発者は全てを理解していますが、**機能が豊富という事はつまりその分ユーザーへは認知負荷がかかるという事** で、特にSNSなどのぱっと見の分かりやすさが大事な場所とは相性が悪いです。

また、アプリの出来も場合によっては重要ではありません。
私が初めて作成したWebアプリは平たく言うと幾つかの入力値をもとに簡単な計算を行うだけのもので、エンジニアからすると「それエクセルとかスプレッドシートで良くない？」と口を揃えて言うようなものでした。しかしそれが1000いいね前後され、それがあり今に至ります。
私たちエンジニアからするとあまり理解できない感覚かもしれませんが、スプレッドシートを開いた瞬間もうわからない、という反応を示す人間が世の中には山ほどいます。
そういった人たちのために**あえて使用用途を限定した小規模なアプリを作成する** というのは意外と有効です。
スーパーでただの鶏肉が唐揚げ用鶏肉と名付けて売られているのも、使用用途を限定することで、逆にその用途では考えずに選んでもらえるためという話もあります。
 **何でもできるスーパーアプリではなく、これしかできない最小のアプリで戦いましょう。**

# 自分が一番のユーザーになろう
自分が熱心なユーザーの場合、使っていると自然と「こうしたほうが良くないか？ここが不便だな…」という感想が浮かんできます。あなたが思うという事は、ユーザーはそれ以上に思っている可能性が高いです。また、バグなども見つけることもあるでしょう。小規模なアプリではユーザーが不具合報告や要望を送ってくれる可能性はそう高くありません。不便な場合何も言わずに使わなくなるだけなので、自分がユーザーとなり、自分に意見を出していきましょう。

# スピード感を大切にしよう
個人開発は（私にとっては）仕事ではありません。どちらかと言うと趣味の延長です。不具合の修正や機能の改善を次の土日にやろう、そのまた次でやろう、とどんどん先延ばしにすることが可能です。そうするとあっという間にモチベーションが無くなり、アプリが腐っていきます。また、数少ないユーザーも開発者の対応が遅いとすぐに見放すことでしょう。何をモチベーションに開発を行うかは人それぞれですが、**アプリを育てること自体に楽しみを見出すことが出来れば最強** です。

# コードは綺麗に
これは色んな文脈で何百回も言われていることですが、少し切り口が違います。
よく言われるのは「〇ヵ月前に作成したコードはもはや理解不能、だから少しでも綺麗に」という教訓で、それに関して全く異論はないのですが **それとは別の問題が発生しました。**
何年も開発を行っていると、協力者が現れることもあります。それ自体はとても嬉しい事なのですが、当時はまさか他人にコードが読まれるとは思っておらず、適当な変数名でコメントもほとんど書いていませんでした。業務でコードを書く際は絶対にそんな事はしないのですが、協力者の方から見る私の初めてのコードはそれになるわけです。
**シンプルに恥ずかしいです。誰に読まれても恥ずかしくないコードにしておきましょう。**

# ユーザーを大切に
しばらく開発を行うと、何人かの熱心なユーザーを獲得することがあります。「自分が一番のユーザーになろう」とは言いましたが、場合によっては自分を遥かに凌駕することもあり得ます。開発者は無意識のバイアスがかかるもので、開発者ではない熱心なユーザーである彼らのバイアスの無い意見はとても貴重です。熱心なユーザーを見つけたらSNSで交流を行って見るのも良いでしょう。
また、**匿名での連絡窓口を用意することも重要です。** メールでの窓口などに比べ、圧倒的に連絡を貰える可能性が上がります。ちょっとした表示の不具合レベルなどの話であれば匿名でサッと送っておくか、と言う人は案外多いです。匿名でメッセージを送ることが出来るサービスは様々ありますので、何か一つは検討しても良いと思います。

# SNS戦略
個人開発においてSNS戦略は大切です。ユーザーの獲得のほとんどはSNSを通じてだと思っても良いでしょう。私はXを主に利用しているのでX前提での話となります。
まず、新機能やアプリをリリースした際の**告知ポストには必ず画像を付けてください。** SNSではやはり画像付きの投稿が目を引きます。ユーザーの目に留まる数秒間で「そのアプリで何ができるか」が分かるような画像を添付してください。そこで興味が惹かれない場合、アプリに遷移してくれるはずもありません。
次に、いつ投稿するかも大事です。ほとんどの場合は投稿してから1日以内にインプレッションのピークに到達します。何日に公開するかがユーザーの興味に影響するようなものはタイミングを考えましょう。
また、やはりフォロワーの数は正義です。自分自身のフォロワーがそう多くはなくても、自身のフォロワーの中にフォロワーが多い人が居る場合、その人に拡散されるかどうかでインプレッション数に雲泥の差ができます。そのような場合は、そのフォロワーがポストを読むであろうタイミングで投稿するといったことも考えてください。間違ってもその人が寝ているだろうなというタイミングは避けてください。さもしい作戦ですが、有効です。

# レスポンシブ対応はマスト
ユーザーの流入のほとんどはSNSから来ることから、レスポンシブ対応はほぼ必須と言えます。
多くのユーザーはスマホでSNSを見るため、初見の画面はスマホでの表示になります。そこでPCでの表示が前提のスマホに最適化されていないアプリが表示された場合どうなるでしょうか。**よほど魅力的な機能を持つアプリではない場合、そっと閉じてSNSに戻り、3秒後には記憶から消されるだけでしょう。**
外観はアプリの機能の本質ではありませんが、整っていないといくら中身が良くてもユーザーの興味を引くことすらできなくなるので、最低限の力は入れた方が無難です。


#
以上が私が個人開発を行う中で感じた事や反省した事です。ここまで読んで頂きありがとうございました。
手探りでやって来た5年間ですので、もっとスマートなやり方や、当たり前な内容もあったかもしれませんが、誰かの糧になれば幸いです。
ABC 075 B Minesweeper

# ABC 075 B Minesweeper
問題は[こちら](https://atcoder.jp/contests/abc075/tasks/abc075_b)  

# 回答
```C++
#include <iostream>
#include <string>
#include <map>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

int main() {
    int H;
    int W;

    cin >> H; // 縦 1~51
    cin >> W; // 横 1~51

    string Si[51]; // 縦方向の文字列を格納するための配列(文字列の長さは#)
    char SArr[51][51];

    for (int h = 0; h < H; h++) {
        cin >> Si[h];

        int w = 0;
        // 文字列を文字に分割
        for (auto it = Si[h].begin(); it < Si[h].end(); it++) {
            SArr[h][w] = *it;
            w++;
        }
    }

    // 各グリッドを見ていき、.となっていれば#じゃないマスをカウントする
    for (int h = 0; h < H; h++) {
        for (int w = 0; w < W; w++) {

            if (SArr[h][w] != '#') {
                int count = 0;
                for (int hd = h - 1; hd <= h + 1; hd++) {
                    for (int wd = w - 1; wd <= w + 1; wd++) {
                        if (hd >= 0 && wd >= 0 && hd < H && wd < W) {
                            if (SArr[hd][wd] == '#') {
                                count++;
                            }
                        }
                    }
                }

                SArr[h][w] = count + '0';
            }
        }
    }

    for (int h = 0; h < H; h++) {
        for (int w = 0; w < W; w++) {
            std::cout << SArr[h][w];
        }
        std::cout << std::endl;
    }
}
```
BigQueryでのデータ復元・テーブル差分取得・データ品質チェックのメモ

BigQueryを使用していると、誤ってデータを削除してしまったり、テーブルの差分を確認したい場面があります。

この記事では、以下の3つのシナリオに対応する方法をまとめています。

1. 過去の特定時点のデータを復元する方法  
2. 2つのテーブル間の差分を取得する方法  
3. データ品質や異常値を確認する便利なチェック方法  

---

## 1. 過去の特定時点のデータを復元する方法

### FOR SYSTEM_TIME AS OFを使用したデータの取得

BigQueryでは、`FOR SYSTEM_TIME AS OF`句を使用することで、過去の特定時点のデータを取得することができます。

```sql
SELECT
  *
FROM
  `project_name.dataset_name.table_name`
FOR SYSTEM_TIME AS OF '2020-02-01 10:00:00 Asia/Tokyo'
```

この方法は、データの誤削除や誤更新があった場合に、過去の状態を確認するのに有効です。通常、保持期間は7日間です。

### データの復元手順

1. 現在のテーブルのデータを削除

```sql
DELETE
FROM
  `project_name.dataset_name.table_name`
WHERE
  TRUE;
```

2. 過去のデータを挿入

```sql
INSERT INTO `project_name.dataset_name.table_name`
SELECT
  *
FROM
  `project_name.dataset_name.table_name`
FOR SYSTEM_TIME AS OF '2020-02-01 10:00:00 Asia/Tokyo';
```

### 削除されたテーブルの復元

削除から48時間以内であれば、削除されたテーブルを復元できます。

```bash
bq cp dataset.deleted@1579878000000 dataset.table
```

---

## 2. 2つのテーブル間の差分を取得する方法

`EXCEPT DISTINCT`を使うと、テーブル間の差分を効率的に抽出できます。

```sql
WITH table1 AS (
  SELECT 1 AS a, 2 AS b, 3 AS c UNION ALL
  SELECT 2 AS a, 4 AS b, 6 AS c
),
table2 AS (
  SELECT 1 AS a, 2 AS b, 3 AS c
)

SELECT * FROM (
  SELECT * FROM table1
  EXCEPT DISTINCT
  SELECT * FROM table2
)
UNION ALL
SELECT * FROM (
  SELECT * FROM table2
  EXCEPT DISTINCT
  SELECT * FROM table1
);
```

`FULL OUTER JOIN`よりも手軽に差分を確認できます。

---

## 3. データ品質や異常値を確認する便利なチェック方法

データ分析・運用で役立つ「すぐに使える」便利なチェック方法もまとめます。

### NULL値の確認

```sql
SELECT
  COUNTIF(column_name IS NULL) AS null_count
FROM
  `project.dataset.table`
```

### ユニークキーの一意性チェック

```sql
SELECT
  column_name,
  COUNT(*) AS total_count,
  COUNT(DISTINCT column_name) AS distinct_count
FROM
  `project.dataset.table`
GROUP BY
  column_name
```

### 頻出値（モード）の確認

```sql
SELECT
  column_name,
  COUNT(*) AS cnt
FROM
  `project.dataset.table`
GROUP BY
  column_name
ORDER BY
  cnt DESC
LIMIT 10;
```

### 時系列データの連続性確認

```sql
SELECT
  event_date,
  COUNT(*) AS cnt
FROM
  `project.dataset.table`
GROUP BY
  event_date
ORDER BY
  event_date;
```

### 重複行の抽出

```sql
SELECT
  column1, column2, COUNT(*) AS cnt
FROM
  `project.dataset.table`
GROUP BY
  column1, column2
HAVING
  cnt > 1;
```

これらのチェックを活用すると、異常値の早期発見やデータ整合性の確保に役立ちます。

---

## まとめ

- **`FOR SYSTEM_TIME AS OF`** で過去のデータを取得・復元  
- **`EXCEPT DISTINCT`** でテーブル間の差分を簡単取得  
- 各種クエリでNULL確認、重複チェック、分布確認などが可能  

---

参考記事:  
- [BigQueryであの頃のデータに戻りたい（ただし、1週間前まで）](https://qiita.com/satoru_mag/items/6ea89b589735f81a4c6f)  
- [BigQueryで2つのテーブルの差分を求める方法](https://qiita.com/shiozaki/items/bc8cc9343f13927a778e)
WINDOWS11にGCC導入(備忘録)

## 取得先
https://winlibs.com/

## 配置
インストールは不要。
解凍して任意の場所へ置く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/2d396e74-fd06-41b4-86af-89cae8c54281.png)

## 環境変数
binへpathを通す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/ef376d2f-24a0-442e-a117-5cd202674377.png)

## 動作確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/eeb04bd9-56df-48d6-841e-289c1dd8476e.png)
【セキュリティ】公開鍵暗号方式・共通鍵暗号方式

# はじめに
暗号技術は、通信やデータのセキュリティを守るうえで欠かせない存在です。
私たちがインターネットにアクセスする際に、HTTPリクエストがサーバーに送られます。
しかし、この中身が第三者に見られてしまうと、個人情報を流出することになり、取り返しのつかない被害を受ける可能性があります。そうしたことがないよう、やり取りするメッセージを暗号化する技術が使われています。中でも代表的な暗号方式として、**公開鍵暗号方式**と**共通鍵暗号方式**があります。
本記事では、この2つの違いと仕組み、使い分けのポイントをわかりやすくまとめていきます。


## 暗号
暗号とは、他人に内容を知られないようにするための変換技術です。
元の情報を**平文**と言います。この平文を他人には読めない形である**暗号文**に変換します。
こうすることによって、一見するだけでは何を表しているかわからない文字列になるため、第三者が見ても中身がわからなくなります。

**イメージ**
>![](https://storage.googleapis.com/zenn-user-upload/f104eb826265-20250524.jpeg)
※引用：https://time-space.kddi.com/au-kddi/20220610/3324.html より


## 公開鍵暗号方式
公開鍵暗号方式とは、ペアの鍵（公開鍵と秘密鍵）を使って暗号化・復号を行なう方式です。
この方式では、受信者側があらかじめ自分しか使用することができない秘密鍵を生成し、その秘密鍵から誰もがアクセスできる公開鍵を生成しておきます。その名の通り、「公開」されます。
これにより、誰でもメッセージを送信できますが、そのメッセージを読むことができるのは秘密鍵を持っている受信者に限定されます。
公開鍵暗号方式の本質は、「誰でも送ってこれるけど、自分だけが読める」というしくみなのです。

具体的な通信の流れを見ていきましょう！
**イメージ図**
>![](https://storage.googleapis.com/zenn-user-upload/71cad7842679-20250524.jpeg)
※引用：https://it-trend.jp/encryption/article/64-0089 より

### 通信の流れ
1. 受信者が公開鍵を公開（誰でも取得可能）
2. 送信者がその公開鍵でメッセージを暗号化
3. 暗号化された文章を受信者宛てに送信
4. 受信者だけが持つ秘密鍵で受け取った文章を復号できる

公開鍵で暗号化された文書は、対になる秘密鍵を用いないと復号できないため、第三者による解読が非常に困難になります。
公開鍵暗号方式は、第三者による解読が困難になりますが、データが重くなりがちというデメリットもあります。


## 共通鍵暗号方式
共通鍵暗号方式とは、送信者と受信者が同じ鍵を使って暗号化・復号を行なう方式です。
この方式では、鍵を知っている者同士でしか、暗号文を復号できません。

**イメージ**
>![](https://storage.googleapis.com/zenn-user-upload/8eddb6b6143f-20250524.jpeg)
※引用：https://time-space.kddi.com/au-kddi/20220610/3324.html より

### 通信の流れ
1. 双方で共通鍵を共有しておく
2. 送信者が共通鍵でメッセージを暗号化
3. 受信者が同じ共通鍵で復号

この方式は、処理が高速であるため、大量データの暗号化に向いています。
しかし、同時に鍵の配送が難しいというデメリットもあります。
仮に第三者に共通鍵を盗まれてしまうと、第三者が解読できてしまい、暗号化の恩恵を受けることができなくなってしまいます。


## 実際の使い分け
実際のシステム（例：SSL/TLS）では、両方の暗号方式が使われています。
共通鍵暗号方式は、処理は高速だが、共通鍵の受け渡し方法に課題があります。
一方、公開鍵暗号方式は、共通鍵を安全に渡すことができるが、処理が遅くなってしまうという課題があります。
SSL/TLSといった実際のシステムでは、両方の暗号方式の弱点を補う合うように両方の技術が使われています。

どのように使われているのか、簡単に見ていきましょう！

### 簡略版 SSL/TLS の通信の流れ
>![](https://storage.googleapis.com/zenn-user-upload/d2880c56cf28-20250524.jpeg)
※引用：https://www.bluearrow.co.jp/column/column_ssl1.html より

1. サーバーが公開鍵を送る
・クライアント（例：Webブラウザ）が、サーバー（例：`https://example.com`）にアクセスする
・サーバーは、デジタル証明書付きの公開鍵を送る
2. クライアントが共通鍵を作る
クライアントがランダムな共通鍵（セッション鍵）を生成する
3. 共通鍵を公開鍵で暗号化して送信
クライアントは、その共通鍵を サーバーの公開鍵で暗号化
暗号化された共通鍵をサーバーに送信
4. サーバーが秘密鍵で復号
サーバーは自分の秘密鍵で復号して共通鍵を取得
5. 共通鍵で通信を開始
ここからは、クライアントとサーバーが共通鍵で通信（高速・安全）

このようにして、両者のいいとこ取りをした通信を実現しています。

# まとめ
公開鍵暗号方式と共通鍵暗号方式は、それぞれ異なる特徴と役割を持つ暗号技術です。
公開鍵暗号方式は、「公開鍵」と「秘密鍵」のペアを使って暗号化と復号を行ないます。公開鍵は誰でも取得できる一方、秘密鍵は自分だけが保持します。この仕組みにより、安全な鍵のやり取り（鍵交換）や、デジタル署名などの認証が可能になります。ただし、処理が重いため、大量のデータを暗号化するには向いていません。

一方、共通鍵暗号方式は、暗号化と復号の両方に同じ鍵（共通鍵）を使用します。仕組みがシンプルで処理が高速なため、大量のデータを効率的に暗号化できますが、安全に鍵を相手と共有するためには、事前に安全な経路が必要という課題があります。

そのため、実際のシステム（例えば SSL/TLS）では、まず公開鍵暗号方式を使って共通鍵を安全に共有し、その後の通信には処理の軽い共通鍵暗号方式を使う、というハイブリッドな構成が採用されています。
このように、両者はそれぞれの弱点を補い合いながら、安全で効率的な通信を実現しています。


# 参考・画像引用元URL
https://time-space.com/au-kddi/20220610/3324.html
https://it-trend.jp/encryption/article/64-0089
https://seventh-pitch.com/media/2024/07/11/727/
https://elite-lane.com/common-key-cryptography-and-public-key-cryptography/
https://www.toritonssl.com/about_ssl/ssl.html
https://www.bluearrow.co.jp/column/column_ssl1.html
OCI Generative AI Certified Professional 試験の勉強法

はじめに
---
　Oracle の Generative AI に関する認定資格である、Oracle Cloud Infrastructure 2024 Generative AI Certified Professional に合格することができました。これまでも様々な AI/ML 系試験に合格してきましたが、また少し特徴のある試験かと思いましたので、試験の合格法について記載します。

受験のきっかけ
---
　自分の仕事において、OCIに関係する業務を行うことになり、せっかくならば、ということで受験を考えていましたが、OCI のキャンペーンで、２つの認定試験を無償で受験できるというのをやっており（2025/5/31まで）、その対象に本試験が含まれていたため、受験を決定しました。

学習方法
---
　まず正攻法として、はじめに、Oracle University のトレーニングを実施しました。
[Oracle Cloud Infrastructureのトレーニングと認定資格](https://www.oracle.com/jp/education/training/oracle-cloud-infrastructure/)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822494/b48889c8-65f7-45d6-8974-7acef426f509.png" width=80%>

から [Japanese: Become an OCI Generative AI Professional (2024) 日本語](https://mylearn.oracle.com/ou/learning-path/japanese-become-an-oci-generative-ai-professional-2024-/142598) に行き、

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822494/a7e23dda-1821-4e33-895d-11e8d5818ebe.png" width=80%>

　次のトレーニングプログラムを実施しました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822494/d9a94998-a657-4bfc-81dc-c5f2cb3d1492.png" width=80%>

　特に、このトレーニングコースは、全部合わせても10時間程度で実施できますので、一通りやってみるのがお薦めです。私の場合、他の資格試験により概ね理解していたつもりでしたが、LangChain など、他の試験受験時には出てこなかった内容の理解も求められますので、自信のある方でも、やってみる価値はあると思います。
　仕上げに、練習問題で出題されそうな問題についても把握することが重要です。本番もそうですが、練習問題も日本語ですので、安心して実施してみてください。この試験で間違えた問題について、本編を反復的に確認したり、AI や Qiita などで確認してみるなどすることで、理解が深まります。

試験の感想
---
　練習問題も行ったので、ある程度類似問題が出ることを期待しておりましが、やはりそんなことはありませんでした。もともとの知識＋練習問題で誤った部分を反復学習したことが功を奏し、なんとか合格することができました。65%以上で合格と思って余裕かな？などと思っていると、落ちますので気を付けてください。
　言い忘れましたが、試験はオンライン受験のみです。試験の結果は試験終了直後に出ます。
正直なところ、8割位とれたかなと思っていましたが、結果70%ということで、思ったよりもギリギリで焦りました。試験時間は、90分で40問ですので、まずまず余裕はあると思います。

まとめ（今後受験される方へ）
----------------------
　学習方法で記載しましたが、本試験の場合は、Oracle University のトレーニングを実施するのが一番と思います。あと Generative AI の基礎となる プロンプトチューニング、ファインチューニング、RAG などについては、できるだけ最新知識を勉強しておくと良いと思います。
　AI分野はご存じの通り、非常に流れが速いので、常に最新知識を学んでおくというのは、どの試験を受けるにしても重要な要素と思います。
　受験される方は、是非頑張ってください！！
Typescriptのinterfaceとtypeどっち使えばいいのか問題

# はじめに

Typescriptのいい所は型定義ができる点だと思います。
そんなTypescriptさんで型を作る方法はインターフェースと型エイリアス（以降`interface`と`type`）の二種類があります。
自分はいつも根拠なしに「構造体には`interface`、ユニオン型には`type`」と適当に扱っていたので、しっかりとした理由を基に選択できるようになろうと思い調べることにしました。
良ければ参考にしてください。
間違っていたらコメントで教えてください...

# interfaceとtypeとは

まず`interface`と`type`とはなにか、ちゃんと知っておきましょう。

## interface

`interface`は、型の構造を宣言するものであり、TypeScriptの型システムの中で識別子（名前）を持つ型を定義します。

```
// nameプロパティを持つUser型を定義
interface User {
  name: string;
}
```

## type

`type`は、定義した型にエイリアス（別名）を付け型を定義します。

```
// nameプロパティを持つオブジェクト型を定義し、Userという名前でエイリアス（別名）を作成
type User = {
  name: string;
};
```

# interfaceとtypeの違い

次に違いです。
[サバイバルTypescript](https://typescriptbook.jp/reference/object-oriented/interface/interface-vs-type-alias)様の記事が見やすかったので引用


>|内容|インターフェース|型エイリアス|
>|:--|:--|:--|
>|継承|可能|不可。ただし交差型で表現は可能|
>|継承による上書き|上書きまたはエラー|フィールド毎に交差型が計算される|
>|同名のものを宣言|定義がマージされる|エラー|
>|Mapped Types|使用不可|使用不可|

# interfaceとtypeの使い分け

調べたところ、どうやらこれといった正解はないようで、好みやケースによって決めるのがよさそうです。
なのでここからは、`interface`と`type`の向き不向きについて調べていきます。

## interfaceの利点

1. 拡張が容易
    - `interface`は他の`interface`を拡張できるため、再利用性が高い
2. クラスとの親和性が高い
    - クラスに`implements`を使って適用できるため、オブジェクト指向設計に適している
3. 言のマージが可能
    - 同じ名前の`interface`を複数回宣言すると、自動的にマージされる

## typeの利点

1. 多様な型表現が可能
    - ユニオン型（合併型）やタプル型、プリミティブのエイリアスなど、あらゆる型をひとまとめにして定義できる
2. `&` 演算子を使うことで、複数の型を合成できる
3. `keyof`や`in`、条件型（`extends`）などを駆使して、プロパティの集合を加工する型を生み出せる
4. JSONのようにオブジェクト以外の値にも名前を付けられるため、コードの可読性が向上する
5. 再オープン（マージ）ができない
    - 既存の`type`に同じ名前で新たな宣言を追加するとエラーになる
6. クラスの`implements`には使えない

# 結論：いつ使い分けるか
|目的・場面|おすすめ|理由|
|:--|:--|:--|
オブジェクトの形状を定義し、拡張／マージしたい|interface|extends や宣言のマージが自然に使えるため、設計の柔軟性が高い
ユニオン型・タプル・プリミティブをまとめたい|type|あらゆる型をエイリアスできる汎用性の高さ
クラスに適用してインターフェースとして担保したい|interface|implements に対応しており、オブジェクト指向設計と相性が良い
複雑な型操作（Mapped Types や 条件型）を行いたい|type|型演算に特化した表現力があり、型レベルの高度なロジックを書くのに向いている

# さいごに
オブジェクトの構造やクラス設計を中心に型を扱う場合は`interface`をベースに。
データの状態（状態管理のステータスやタプルなど）を表現する際は`type`を活用するのが良さそうです。

使い分けのルールはチームやプロジェクトのコーディング規約にもよるので、上記を参考に「こういうケースではこれを使う」というガイドラインを一度まとめてみると、開発の一貫性が保ちやすくなっていいかもしれません。

# 参考

https://typescriptbook.jp/reference/object-oriented/interface/interface-vs-type-alias
ビットの計算について


ビット演算
基本的なビット演算
演算 記号 計算ルール 例
論理積（AND） & 両方が1のときだけ1 1010 & 1100 → 1000
論理和（OR） 少なくとも1つが1なら1 1010 1100 → 1110
排他的論理和（XOR） ^ 異なるときだけ1 1010 ^ 1100 → 0110
否定（NOT） ~ すべてのビットを反転 ~1010 → 0101
構造体と共用体について

構造体と共用体について解説してほしい。
構造体（struct） と 共用体（union） は、C言語やC++で使われるデータ構造ですが、それぞれ異なる動作をします。

構造体（struct）
構造体は、異なるデータ型のメンバをまとめて管理するデータ構造です。 各メンバは独立したメモリ領域を持ち、同時にすべてのメンバにアクセスできます。

構造体の特徴
✅ メンバが個別にメモリを持つ ✅ 異なる型のデータをまとめて管理できる ✅ オブジェクトのような使い方ができる

構造体の例
c
#include <stdio.h>

struct Person {
    char name[50];
    int age;
    double height;
};

int main() {
    struct Person p1 = {"Taro", 30, 175.5};

    printf("名前: %s\n", p1.name);
    printf("年齢: %d\n", p1.age);
    printf("身長: %.1f cm\n", p1.height);

    return 0;
}
→ Person 構造体のメンバ (name, age, height) はそれぞれ独立したメモリ領域を持つ。

共用体（union）
共用体は、すべてのメンバが同じメモリ領域を共有するデータ構造です。 そのため、一度に1つのメンバしか保持できないという制約があります。

共用体の特徴
✅ メモリ効率が良い（最大のメンバサイズ分しか確保されない） ✅ 一度に1つのメンバしか値を持てない ✅ 適切に管理しないとデータが破損する可能性がある

共用体の例
c
#include <stdio.h>

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data d;

    d.i = 10;
    printf("整数: %d\n", d.i);

    d.f = 3.14;
    printf("浮動小数点: %f\n", d.f);

    sprintf(d.str, "Hello");
    printf("文字列: %s\n", d.str);

    return 0;
}
→ Data のメンバは同じメモリ領域を共有するため、最後に代入した str の値で上書きされる。

構造体 vs 共用体
項目	構造体 (struct)	共用体 (union)
メモリ領域	各メンバが個別にメモリを持つ	すべてのメンバが同じメモリを共有
メモリ使用量	全メンバの合計サイズ	最大のメンバのサイズのみ
同時使用	すべてのメンバを保持可能	1つのメンバのみ保持
用途	複数のデータを同時に管理	メモリを節約しながら異なる型を扱う
結論:

構造体（struct） は、異なる型のデータをまとめて管理するのに便利。

共用体（union） は、メモリ使用量を最適化したい場面で有効。

どちらも適切に使い分けることで、より効率的なプログラムを作成できます！もしさらに詳しく知りたいことがあれば、気軽に聞いてくださいね🚀
【シリーズすごいぞiQ-F】「いわゆる構造化プログラミング」への道　オマケ3～ラッチラベルで注意すること

## はじめに
ラッチラベルは値が保持されない条件が多く、ラッチデバイスと同じ感覚では使えないので注意が必要です。

私が気付いた範囲で注意点を記事にします。

## プログラム変更時にリセットされる（SM9353ONで回避）
プログラムファイル，FBファイル，グローバルラベル設定ファイルを変更した場合にラッチラベルはクリアされてしまします。

これを防ぐにはSM9353をONにする必要があります。
（SM9353は停電保持されます）

## CPUパラメータ変更でリセットされる

SM9353をONにしていてもCPUパラメータを変更した場合はリセットされます。
プログラムファイルやFBファイルの追加もCPUパラメータ変更となるので注意が必要です。

わたしの場合、運用開始するまで汎用ファンクションブロックを使用していなかったプログラムに汎用ファンクションブロックを追加した事でCPUパラメータ変更となって、ラッチラベルがリセットされてしまいました。
(プログラム設定-FB/FUNファイル設定にSlibFbFileが追加されます）

汎用ファンクション／ファンクションブロックの使用を想定して、最初からプログラム中のどこかに配置しておくという対策も考えられます。

## プログラム中でラッチラベルを使用していないのにラッチラベル領域が減る
FBインスタンスを作成すると16ワード分のラッチラベル予約領域が確保されます。

なので、FX5UJはラッチラベル領域1024ワード固定なのでFBインスタンス64個までしか配置できません。

汎用ファンクションブロックでは予約領域は確保されないですし、~~XMLファイルでファンクションブロックを読み込めば予約領域を変更出来るのではと睨んでいますが、まだ確認出来ていません。~~

**2025/06/02追記 「C:\Program Files (x86)\MELSOFT\GPPW3\SampleData\IEC61131-10XML」内の「sample.xml」を読み込んで見た所、予約領域設定は現在のCPUタイプではサポートされていませんと出力されました。**

メーカーには予約領域を変更できるように代理店を通して依頼していますが届いているかは不明です。


## 全変換への対応について
FX5ではラベルメモリのバックアップは出来ません。

「教えて!GX3号 第76回　プログラム更新前のラベルメモリをバックアップ！」
とありますが、これはFX5シリーズでは対応していません。

FBならVAR_IN_OUTクラスなどでラッチデバイスと関連付けてデバイスで値が保持されるように対策します。

## おわりに
いちおうこれでオマケも含めて「いわゆる構造化プログラミング」への道シリーズを終わりにします。
私も体系的な知識を持っているわけでは無いので、これ以上の発信がノイズにならないか心配になってます。

この記事は2025年の5月に書いているのですが、5月頭にMXコントローラが三菱から発表され、そのマニュアルを参照するとSM9353の様な仕様は無くなっているようです。
メーカーも変な仕様だと考えたのではと想像しています。

## 過去記事一覧
+ [過去記事一覧](https://qiita.com/fujiteruo/items/af2459d320e8109963db)
プレイヤーが操作できない時間を設計することの重要性

Unityでゲームを作っていると、エフェクト演出やUI遷移、敵の行動など「プレイヤーが一時的に操作できない時間」が自然と発生します。

この時間、意識して設計していますか？

「演出が終わるまで何もできない時間」は、ともすればユーザーのストレスになります。一方で、適切に設計された“間”は、ゲームの没入感や納得感を高める重要なファクターにもなります。

本記事では、「操作できない時間」についての考え方と、Unity実装での具体的なコントロール手法を紹介します。

---

## なぜ“操作できない時間”が必要なのか？

操作できない時間が生まれる典型的な場面には、以下があります：

* スキル発動中のエフェクト演出
* マップやUIの切り替えアニメーション中
* リザルト表示やステージ遷移演出
* チュートリアルや強制イベント中

これらの時間は、\*\*ユーザーの操作とロジック処理が競合しないための“安全領域”\*\*です。また、プレイヤーに情報を見せたい／感情を作りたいという演出意図にも関わってきます。

### 演出の“納得感”と“操作制御”は表裏一体

ユーザーは操作できない状態に陥ったとき、その理由が明確ならばストレスを感じません。

* スキル演出中 → 見せ場だから待てる
* UI切り替えが遅いだけ → ストレス

つまり、“操作を奪う”こと自体が悪なのではなく、**その理由がプレイヤーに伝わらないことが悪**なのです。

---

## Unityで操作不能状態を設計する方法

### 1. 透明なUIを出して「入力を吸収する」

* `Canvas` 上に全画面 `Image` を表示し、`Raycast Target` をONにするだけ
* 操作を遮断しつつ、演出はその下で再生可能
* アニメ中のUI連打によるバグ防止にも効果大

### 2. 操作フラグで制御する（注意点あり）

* `isInputEnabled` 的なブール値でガードする方法
* 複数の操作対象があるとき、**制御の責務が分散しやすい**ので設計注意

### 3. DOTweenやCoroutineで待機処理中に一時制御

* 一連の処理の流れの中で `yield return` により待機
* その間に `Input` を遮断する仕組みを併用する

---

## プレイヤーの納得感を高める工夫

### ● 操作不能時間は「短く」「明確に」

* 何秒かかるのか分からない待機はストレス
* `プログレスバー` や `エフェクトの終わりを視覚化` するなどの明示が有効

### ● 操作不能解除のタイミングは“視覚トリガー”で

* アニメ終了時など、明確な“目印”があると納得感が増す
* 逆に、「音だけ鳴って操作可能になる」などは混乱を招きやすい

---

## まとめ：間（ま）をコントロールする設計力が、ゲーム体験を変える

「プレイヤーが操作できない時間」というとネガティブに聞こえるかもしれません。
しかし、これはゲーム設計における\*\*“演出と制御の緩衝材”\*\*でもあります。

* **演出の見せ場を作る**
* **操作と演出の競合を防ぐ**
* **UI連打によるバグや誤操作を防ぐ**

こういった観点で「操作不能時間」をきちんと設計できると、ゲームの体験はより滑らかになり、ユーザーの“納得感”も高まります。

今後、何かの処理中に「プレイヤーの操作を一時的に奪う」場面があれば、ぜひその時間の**意味**と**見せ方**に目を向けてみてください。

---

## ブログでもUnityや個人開発ネタを発信中です！

開発ノウハウやアプリ制作過程、Unity連携系のハマりポイントなど
より深掘りした内容をブログにまとめています。
▶ [https://syunpp.com](https://syunpp.com)

## 公開中のアプリ一覧はこちら！

実際にUnityで開発してリリース済みのアプリ一覧をまとめています。
▶ [https://syunpp.com/公開中のアプリ一覧/](https://syunpp.com/公開中のアプリ一覧/)

## YouTubeショートでもゲーム開発の裏側を公開中！

Unityで制作中のゲームの進捗や演出テスト、実装の様子を
ショート動画でタイムラプス形式にまとめて発信しています。
▶ [https://www.youtube.com/@syunpp\_8413/shorts](https://www.youtube.com/@syunpp_8413/shorts)
製品ライフサイクル（プロダクトライフサイクル）について

## 製品ライフサイクルとは
　製品を市場に投入してから販売活動によって普及、成熟し、やがて落ち込んでその製品寿命が終わるまでの過程を「導入期⇒成長期⇒成熟期⇒衰退期」の4段階で表現した概念。

## 導入期
　先進的な消費者に対し製品を販売する時期。製品の認知度を高める戦略が採られる。この時期は費用が多くかかり、利益が出にくいため投資のキャッシュフローはマイナス状態である。

## 成長期
　市場が活性化し、売上が急激に増加する時期。新規参入企業によって競争が激化してくる。成長性を高めるため広告宣伝費の増大が必要になる。

## 成熟期
　需要の伸びが鈍化してくる時期。他社からのマーケット参入が相次ぎ、競争が激しくなるので製品の品質改良などによって、シェアの維持、利益の確保が行われる。

## 衰退期
　需要が少なくなり売上と利益が徐々に減少する時期。追加投資を控えて市場から撤退することが検討される。

　企業は、製品がライフサイクルのどのステージにあるかによって、適した商品展開の戦略を考える。
どんなインプットも読みやすいHTML+CSSのレポートにするプロンプト文（改

＊2025/5/30更新：
　・プロンプト文をすごく短くしました


## 1. 実行例

どんなインプットでも、左サイドバーに目次がついてきれいなレポートに仕上がるプロンプト文を作りました。いろんな情報を整理するときに役に立ちます。

以下の実行例をご覧ください。


https://x.com/00oichan/status/1926462320781255069


## ２. プロンプト文

１）以下を生成AIに貼り付けます。
２）2回目のチャットで、インプットを追加で貼り付けてください。
３）HTMLが出力されますので、メモ帳などで拡張子を.htmlにしてください。

```
インプットの情報を網羅的に理解して、デジタル雑誌の特集記事を作るイメージで、
洗練された単一HTMLお客様向けのビジネスレポートを作成してください。左サイドバーの固定目次が最重要です。

Appleのサイトやnoteを参考に、ミニマルかつ高品質な静的デザインのレポートを目指してください。
提供情報に基づき、読者が情報を心地よく深く理解できるような非常に読みやすく論理的なコンテンツを生成してください。

【主要構成】
   サイズ：A3横。縦幅は自由。
   表紙: 魅力的なタイトル、概要、ヒーローセクション（テーマに沿った写真を外部URLから探す）。
   左固定目次: 章・節レベルで、該当箇所へページ内リンク。メインコンテンツと重ならないよう配置。
   メインコンテンツ: 
　　章ごとの導入、比較表や事例紹介、全体のまとめ、参考文献リストなど。各章は1000～2000字程度、高品質な画像には500字以上の解説を加えてください。十分な余白を確保。
　　テーマが変わるごとに章や節を分ける。各章・節を枠線で囲み右下にページ番号のデザイン。
　　各章・節タイトルには、シンプルで効果的な長い区切り線でアクセント付け
　　要点は太字やアンダーラインやマーカー、類似する最適な表現を採用し強調する
　　内容に応じて、表やグラフ、フローなどのビジュアル表現を加える。モダンなwebデザインテクニック50などを参考にビジュアル表現を積極的に採用する
　　ビジュアル表現の上部は概要（150文字程度）と下部には解説（1000文字程度で具体的にする）を入れる

【技術・品質】
   セマンティックHTML、効率的なCSS（Flexbox/Grid活用、PC・印刷対応、CSS量抑制）。
   テーマに沿った落ち着いたカラーの選択。WCAG 2.1 AA基準のコントラスト比。
   JTF日本語標準スタイルガイドを意識した、新社会人でも読みやすい平易な文章。
   本文は可読性の高いモダンなゴシック体を採用する

【厳守事項】
   JavaScript、Mermaid、情報隠蔽UI（タブ等）、プロンプト文の書き写しやAI作成を示唆する記述は禁止。
   入力情報にない数値での図表作成禁止。
   レイアウトの重なり（特に目次と本文）絶対防止。
   表の各行左端に番号付け。
   箇条書きは中黒（・）は禁止。箇条書きは番号付きリストにする。
   `cite:`のような参照記載をしないこと。
   入力情報の90%以上を網羅すること。
　表紙を1章にカウントしないこと。

出力形式：
　完全なHTML+CSSコードで出力する。コードをそのまま別のシステムに使用するためコードのみを出力する。冒頭・末文は不要。
　
インプット：
　（次のチャットで指示をしますので、何も出力せずに待機しててください）

```

インプットは、以下がおすすめです。

 １）会議の音声文字起こし
 ２）Deep Researchの結果
 ３）教科書や資格試験のスクショ
 
 

気に入って頂けましたら、「いいね」を押してください。
今後とも、よろしくお願いいたします。

#### ▼ 議事録バージョンはこちらです ▼
https://qiita.com/oichan00/items/004612d2f73dcc48c771


  

#### ▼ プロンプト集を用意しています。ぜひご覧ください ▼

https://qiita.com/tags/nori%e5%bc%8f%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e9%9b%86
【React×TypeScript】学習記録アプリをさらに改良した話

## はじめに
[前回改良を加えた学習記録アプリ](https://qiita.com/higa1234q/items/52d7c5dc85ed20a4284a)に、新規機能を増やしたりUIを改良したりしましたので、その感想文です。

▼前回の記事

https://qiita.com/higa1234q/items/52d7c5dc85ed20a4284a

## アプリ概要
### 1. 主な機能
 * 学習記録（内容と時間数）の登録
 * 学習記録の一覧表示
 * 学習記録の削除
 * 学習記録の編集

![20250522_q3 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4048214/975254a6-d2fa-4c99-9d43-743f1c626f1f.gif)


### 2\. 使用技術
 * 言語：TypeScript(型安全性の担保）
 * フロントエンド：React, Vite, Chakra UI(v2)
 * バックエンド：Supabase
 * CI/CD：GitHub Actions + Firebase Hosting
 * テスト：Jest

## 工夫したポイント
### 1. React Hooksの設計
* 今回は、学習記録の一覧表示や登録、更新、削除を `React` の `custom hook` に分離して管理しました。これにより、ロジックとUIの責務が明確になり、今後機能追加や修正時にも再利用しやすくなったと思います。

### ・作成したcustom hook
　- `useAllStudyRecords`：全件取得とloading状態の管理
　- `useInputStudyRecord`：入力フォームの状態と登録処理
　- `useDeleteStudyRecord`：削除処理と再取得の連携
　- `useUpdateStudyRecord`：既存データの更新処理

* 一方で、学習記録の削除後の、学習記録再取得処理の責務が`App.tsx`にあるのか、hookに持たせるべきか悩みました。
→今回は、**再取得はUI側で制御する**方針にし、テストのしやすさや柔軟性を優先しました。

### 2. Atomic Designの設計
* ボタンやアイコンボタン、モーダル（新規登録ボタンを押すと、入力フォーム画面が開く）などは、Atomic Designの原則に沿って設計しました。 
* 一方で、moleculesとorganismsの違いはいまだ分からず。（今回はモーダルをorganismsとして扱いました）。

### 3. Jest
* 特にSupabaseのDB操作をモック化し、**DBに依存しないテスト環境**を構築しました。  
* 副作用のある処理（登録・削除）では `mockResolvedValueOnce()` を使い、呼び出しごとに違う値を返すようにして、**UIの変化を確認できるように工夫**しました。
```ts
// 例えば削除の場合
mockGetAllStudyRecords
  .mockResolvedValueOnce([
    new StudyRecord("1", "React", 1),
    new StudyRecord("2", "Jest", 2),
  ])
  .mockResolvedValueOnce([
    new StudyRecord("1", "React", 1),　// 削除後はレコードが2→1つへ
  ]);
```
→ これにより、「削除後にリストが減る」といったUI挙動もテストで確認できるようになりました。
* 一方で、1ファイルに全テストを書いていたため、モックの外出しや、`describe` によるグルーピングなど、今後の改善点も見えました。

## その他、作ってみての感想
* 今回もChatGPTが大活躍。前回はJestのテストコードの書き方そのものを聞いたりしていたが、今回はUIとロジックの分離など、設計面や考え方でどうすべきか聞くことが多く、また今度も助けられました。
* 「分からないからと止まるのではなく、手を動かしてみることが大事」だと改めて実感しました。最初はドキュメントが理解できず戸惑っていましたが、実装を進めていく中で徐々に内容が頭に入ってくるようになりました。

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
個人メモ　Rspec の基礎役割

○基本構文　describe/it/expect

・describe
Describeには、テストのグループ化を宣言する

〇〇に関するテストをするよーというイメージ

・it
Itはテストをexampleという単位にまとめる役割をする
It do … endの中のexpectation（期待値とっ実際の値の比較）が全てpassしれば、そのexampleはパスしたことになる


・expect
expect(X).to eq Yで記述するのがエクスペクテーション
読み方は、「XがYに等しくなることを期待する」と読める

expect(1 + 2).to eq 3 は「1 + 2 が 3 になることを期待する」テスト

※to eqの部分はマッチャ（抹茶かな？）と呼ばれる
スミレ畑、やってみた。 その14

# 概要
日本語プログラミング言語、スミレ畑、見つけたので、やってみた。
AtCoder、やってみた。
練習問題やってみた。

# 練習問題
ABC 081 A - Placing Marbles
文字列を受け取り、1の個数をカウントする問題です。


# 投入するソース

```
111
```

# 期待値

```
3
```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/69ee3288-9cca-4b88-82ec-f2e341ec8b96.png)

# サンプルコード

```
入力sは、入力したもの
結果は、0
iを、1から、増やしながら、入力sの文字数回、繰り返す
    もし，入力sのｉ文字目が、「1」ならば
        結果は、結果に、1を、足す
    もし終わり
繰り返し終わり
結果を、出力して改行
```

以上。
【QGIS】写真のEXIFデータを解析し、点シンボルとして読み込む

## 概要
写真に含まれるEXIFのGPS情報を使って、QGIS上に撮影位置を点シンボルとして表示する方法を紹介します。  
QGISプラグイン「QSurveyMapReport」を使用します。


## 検証環境
- OS：Windows 11  
- QGIS：3.32
- プラグイン：QSurveyMapReport v1.00  


## QSurveyMapReportのインストール
###  1.インストールファイルのダウンロード　
以下のリンクより、「QSurveyMapReport.zip」をダウンロードする。

https://github.com/onodera-g/QSurveyMapReport/releases/tag/V1.0.0

### 2. プラグインのインストール
「プラグイン > プラグインの管理とインストール > ZIPからインストール」より、ダウンロードしたZIPファイルを選択し、インストールを実行する。

### 3. プラグインの有効化
QGISを再起動し、「プラグイン > プラグインの管理とインストール」 からQSurveyMapReportを有効化


## 写真のEXIFデータを解析し、点シンボルとして読み込む
リポジトリ内のサンプル写真（`TestData` フォルダ）を例に、以下の手順で操作します。

1. プラグインを起動し、「...」から写真フォルダを指定 
2. 「Make CSV」から、写真データのEXIF情報をCSV出力
3. 「Input Map」から、CSVデータを選択し点シンボルとして読み込む

![439705656-999a6467-b6cd-45b5-9af3-ec75ebf487c1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3259514/71028b15-fd42-44bc-bd8d-5099047ea9ed.png)

![439817026-c0af08d4-817f-490d-8c3d-1c8448938f36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3259514/9d7bf3d0-6e3c-482d-aa38-53ae291c0ee3.png)
React × Supabase で複数チェックボックスの状態を保存する方法

# 問題
チェックボックスを複数チェックし、supabaseに保存したい。
シンプルですが実装は意外と難しかったです。

# 解決方法
ソースコードとコメントは以下になります。

```js
import { useEffect, useState } from 'react';
// supabaseの設定ファイルの説明は割愛
import { supabase } from './lib/supabaseClient';

function WordsPage() {
    type Word = {
        word_id: number;
        word_name: string;
        mastered: boolean;
    }

    const [words, setWords] = useState<Word[]>([]);

    useEffect(() => {
        const fetchWords = async () => {
            const { data, error } = await supabase.from('word').select('*')
                .order('updated_at', { ascending: false, nullsFirst: false })
                .order('created_at', { ascending: false });
            if (error) {
                console.error('Error fetching words:', error.message);
            } else {
                setWords(data);
            }
        }
        fetchWords();
    }, []);

    // idを指定する
    const handleCheckboxChange = async (id: number) => {
        // 該当wordのチェックボックスの状態を反転させる
        // updatedWordsは、masteredフラグが反転された新しいwords配列
        const updatedWords = words.map((word) =>
            // 三項演算子 trueの場合はmasteredフラグを反転し、falseの場合はwordをそのまま返す
            word.word_id === id ? { ...word, mastered: !word.mastered } : word
        );

        setWords(updatedWords);
        const { error } = await supabase
            .from('word')
            // 新しい配列 updatedWordsから、word_id が id のオブジェクトを探し、そのオブジェクトの mastered 値を取得
            // ?. は オプショナルチェイニング：見つからなければ undefined を返す
            .update({ mastered: updatedWords.find(word => word.word_id === id)?.mastered })
            // eq は "equal"（等しい） の略で、Supabase（SQLクエリビルダー）で WHERE 条件 を指定する
            .eq('word_id', id)
            .order('updated_at', { ascending: false, nullsFirst: false })
            .order('created_at', { ascending: false });
        if (error) {
            console.error('Error updating word:', error.message);
        }
    }
    return (
        <>
            <h1>Word List</h1>
            {words.map((item) => (
                <div key={item.word_id}>
                    <div>{item.word_name}</div>

                    // チェックボックスの箇所
                    <label>mastered</label>
                    <input
                        type="checkbox"
                        checked={item.mastered}
                        onChange={() => handleCheckboxChange(item.word_id)}
                    />
                </div>
            ))}
        </>
    )
};

export default WordsPage;
```

# 実際の画面
チェックボックスにチェックを入れて更新しても、その状態が保存されてチェックが反映されている。
![画面収録-2025-05-25-10.36.02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/7039cd67-e36e-4b05-9518-09b153d69bf2.gif)

# 終わりに
チェックボックスの状態を複数管理してデータベースと同期させるのは、一見シンプルですが、
状態管理や非同期処理の扱いが絡むため意外に難しいです。

私が実際にやってみて大事だと感じたのは以下の3点です。

- やりたいことを明確にする
→ どの単語のチェック状態をどう変えたいのか、仕様をはっきりさせる

- ChatGPTに何度も相談する
→ 自分でつまずいたポイントや疑問を細かく質問することで理解が深まる

- 何をやっているかを理解する
→ コードの中で、状態をどう更新し、データベースにどう反映しているかを理解することが肝心

この3つを意識しながら進めると、複雑な機能も着実に実装できるようになります。
Reactアプリケーションをスマホで動作確認するための手順

# ゴール

レスポンシブ対応などのテストのため、スマホを用いてReactアプリケーションを表示したい。


## 前提条件
・デザリングができるスマホがあること
・PCはWindowsPCを想定（Linuxの場合は各種設定やコマンドをLinuxに置き換えてください）

## 手順

### 1.
PCとスマホをデザリングする。


### 2.
PC側の外部からのNode.jsアプリケーションの受信許可設定を行う。

「コントロールパネル」⇒「システムとセキュリティ」⇒「Windowsファイアーウォール」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/bcf27156-ac43-4a0b-9b0b-396a7580cc04.png)

「許可されたアプリ一覧」にNode.jsがありますが、チェックを入れて許可する。



### 3.
Reactプロジェクトを下記コマンドで開始する。

```
$env:HOST="0.0.0.0"; npm start
```
上記コマンドで起動する（同じLAN上のインターフェースを全て許可する。）

プロジェクト起動後は下記コマンドで確認
```
netstat -ano | findstr :3000
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/689b0144-cbec-41f6-b9c4-84576978677b.png)


### 4.
スマホ側でReactプロジェクト起動時に表示されたIPアドレスをブラウザで入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/3a693fef-aa5e-4615-9830-1ddc0517e9c2.png)

無事表示されたら成功（自分は成功でした）
ヘルパークラスのメリット

## はじめに

ヘルパークラスの設計を見て「これって本当に必要？」と感じたことをきっかけに、OOP設計の意図やその価値について理解が深まったので、その学びを整理する。

---

## なぜヘルパークラスは有効なのか？

一見シンプルに見える以下のようなコードにも、しっかりとした設計意図とメリットがある。

```php
<?php

namespace Helpers;

class CrossSiteForgeryProtection {
    public static function getToken() {
        return $_SESSION['csrf_token'];
    }
}
```

### 1. 実装の抽象化

* `$_SESSION` といった低レベルな実装の詳細ではなく、「CSRFトークンを取得する」という目的に集中できる。
* トークンの取得元やセッションの構造が変わってもこのクラス内部を修正するだけで対応できる。

### 2. 可読性の向上

* `getToken()` というメソッド名を見るだけで、「何をしているのか」がすぐに分かる。
* これにより、コード全体の意図が伝わりやすくなり、メンテナンスもしやすくなる。

---

## おわりに

ヘルパークラスは、単なるコードの短縮ではなく、可読性・柔軟性・保守性といったOOPの設計原則を体現するための重要な手段。

自分にはまだ設計力の伸びしろがあると実感。
これからも「なぜこの設計なのか？」という本質を意識しながら、他のプロジェクトにも応用できる技術力を高めていく。
スミレ畑、やってみた。 その13

# 概要
日本語プログラミング言語、スミレ畑、見つけたので、やってみた。
AtCoder、やってみた。
練習問題やってみた。

# 練習問題
ABC 086 A - Product
2つの整数値を受け取り、その積が2の倍数かを判定する問題です。


# 投入するソース

```
1 21 
```

# 期待値

```
Odd
```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e2954943-971b-42cf-b957-1874559c2a89.png)

# サンプルコード

```
abは、入力したものを、「 」で、区切ったもの
//abを、出力
もし、ab(1) % 2が0　または　ab(2) % 2が0　ならば
  「Even」を、出力して改行
そうでなければ
  「Odd」を、出力して改行
もし終わり

```

以上。
C#のNull許容参照型を理解する

## はじめに
開発経験をしたことがある人であれば必ずと言っていいほど通る、NullReferenceException — 「オブジェクト参照がオブジェクト インスタンスに設定されていません」というエラーメッセージ
C#8.0で導入されたNull許容参照型は、この問題に対処するための機能


## なぜNull許容参照型が必要なのか？
従来のC#では、すべての参照型は暗黙的にnullを許容していた
String型やList型などの変数には常にnull値を代入できた
これはコードの柔軟性を高める一方で、意図しないnull参照による実行時エラーも多発していた

以下は実行時にNullReferenceExceptionが発生する
```csharp:test.cs
string name = null;
Console.Writeline(name.Length);
```
小規模なプログラムでは見落としは少ないかも知れ梅が、規模が大きくなると、実行時に初めて発見されるケースもあった

## Null許容参照型の目的
Null許容参照型の主な目的は、コンパイル時にnull参照の可能性を検出し、警告すること

・実行時エラーを減らす
・コードの信頼性を向上させる
・nullの取り扱いを明示的にする
・開発者の意図を明確にする
など、これらの目的がある

## 基本的な構文
実装の方法は、型の後に「?」をつけるだけで、nullを持つ可能性があることを明示する
```csharp:test.cs
string nonNull = "Hello";
nonNull = null; // 警告が出る

string? nonNull = "Hello";
nonNull = null; // Nullを許容してくれる

```

## 実践的なコード例
クラスのプロパティでの使用

```csharp:test.cs
public class Person
{
    public string Name {get; set;}
    public string? MiddleName {get; set;}
    public string LastName {get; set;}
}
```

## どのような場面で使うか
1. 新規プロジェクト
新しく始めるプロジェクトでは、最初からNull許容参照型を有効にすることで、堅牢なコードベースを構築できる

2. APIの設計
メソッドの引数や戻り値がnullを許容するかどうかを明示することで、使用者に対して明確に提供することができる

3. 外部システムとの連携
データベースやWeb APIからのデータは、nullになる可能性があります。こうした場面で、null許容参照型を使う
ことで安全にデータを扱える

## まとめ
Null許容参照型は、C#におけるNullReferenceExceptionとの戦いにおける強力な武器。
この機能を適切に使用することで：

開発効率の向上：コンパイル時にnull関連の問題を発見できる
コードの明確性：変数がnullになり得るかどうかが一目でわかる
アプリケーションの堅牢性：実行時エラーが減少する
チーム開発の効率化：コードの意図が明確になり、レビューしやすくなる
スミレ畑、やってみた。 その12

# 概要
日本語プログラミング言語、スミレ畑、見つけたので、やってみた。
AtCoder、やってみた。
練習問題やってみた。

# 参考にしたページ

https://qiita.com/Mopepe51/items/fe35a9e02f1b07666448

# 練習問題
Welcome to AtCoder
以下の形式で整数 および文字列 が入力として与えられる。
a
b c
s
この入力をもとに、与えられた整数の和 および文字列 を、以下の形式で出力することが求められる。
sum s

# 投入するソース

```
1
2 3
hello
```

# 期待値

```
6 hello
```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8516d81a-c32f-441d-a3b9-47fba2e5767d.png)

# サンプルコード

```
入力aは、整数を入力したもの
入力bcは、入力したもの
入力textは、入力したもの
分割bcは，入力bcを「 」で区切ったもの
「［入力a ＋ 分割bc(１) ＋ 分割bc(２)］ ［入力text］」を出力して改行する
```

以上。
「停止問題」から学ぶ計算の理論入門 ― プログラムが止まるか止まらないかを事前に判定できるのか？

## サマリー

計算可能性理論における最も有名な問題「停止問題」。本記事では、論計舎の川井新氏による講義を元に、初心者でも理解できるように計算論の基本、部分関数の定義、そして停止問題の不可能性証明までを図解・コード例付きで解説します。

---

## 1. 計算の理論とは？

計算論（理論計算機科学）は、「何が計算可能で、何が不可能か」を明らかにする学問分野です。TuringやKleeneが提唱したこの分野では、人間や機械が行う“計算”という行為を厳密に捉えます。

> **本記事の目的**：  
> 停止問題という一例を通して、「計算の限界」について直感的に理解すること。

---

## 2. 関数と部分関数の基礎

「関数」とは、入力に対して出力を返すルールですが、**すべての入力に出力が定義されていない関数**は「部分関数」と呼ばれます。

```text
例：d(x, y) = (x+1) ÷ y （ただし y ≠ 0 の場合）
```

---

## 3. プログラムで関数を計算するとは？

以下のようなプログラムを例に、関数の計算をプログラムで実行する意味を定義します。

```c
least_common_multiple(x, y) {
  int a = 1;
  while (a < x * y) {
    if ((a % x == 0) && (a % y == 0))
      return a;
    else
      a++;
  }
  return x * y;
}
```

---

## 4. 停止問題とは？

### 問題設定

あるプログラム `P` と入力 `x` が与えられたとき、  
「`P(x)` が停止するか否か？」を判定する関数 `halt(p, x)` を定義したい。

### 結論

> そのような関数 `halt(p, x)` は**計算不可能**である。

---

## 5. 停止問題の証明概要

- `halt` 関数が存在すると仮定
- `comp+` という全域関数を定義
- 自己言及的な `diag` 関数で矛盾を導く

```c
comp_plus(p, x) {
  if (halt(p, x) == 1)
    return comp(p, x);
  else
    return 0;
}
```

---

## 6. Turing の洞察と現代的意義

Turing が1936年に提案した「チューリングマシン」は、今も計算理論の基本です。彼は当時まだ存在しなかったコンピュータの本質を、紙と鉛筆で行う人間の計算行為の観察から定式化しました。

---

## 参考文献

- 鹿島亮『C言語による計算の理論』
- S. Barry Cooper『Computability Theory』
- 照井一成『コンピュータは数学者になれるのか？』