OmniAICreator/Qiita-1.07M huggingface dataset:
【C#】EfCoreで「System.Text.Json.JsonException. A possible object cycle was detected.～」エラーの解決方法


## はじめに

EFCore で公式のチュートリアルにしたがって多対多のリレーションを実装している際にうまくデータを読みだせない現象が発生しました。

https://learn.microsoft.com/ja-jp/ef/core/modeling/relationships/many-to-many

その際に表示されたエラーメッセージは下記です。

```
System.Text.Json.JsonException: A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32.
Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles.
```

## 環境

- Windows11
- .net
- ASP.net Core Web API
- EfCore

## コード

読み出し部分

```csharp
    [HttpGet("{id}")]
    [ProducesResponseType(200)]
    [ProducesResponseType(404)]
    public ActionResult<User> Get(int id)
    {
        var user = _context.Users
            .Include(u => u.Skills)
            .FirstOrDefault(o => o.Id == id);

        if (user == null)
        {
            return NotFound();
        }

        return user;
    }
```

なんの変哲もない GetAPI です。

モデル

```csharp:User.cs
public class User
{
    [Required]
    public int Id { get; set; }

    [Required]
    public string Username { get; set; } = string.Empty;

    [Required]
    public string Description { get; set; } = string.Empty;

    public List<Skill> Skills { get; } = [];
}
```

```csharp:Skill.cs
public class Skill
{
    public int Id { get; set; }

    public string Name { get; set; } = string.Empty;

    public List<User> Users { get; } = [];
}
```

## 原因

お互いが参照しあっていたため循環参照になりシリアル化の際にエラーが発生していました。

同じような現象は多く発生しているようで、下記のような質問を StackOverflow で見つけました。

https://stackoverflow.com/questions/38815800/include-property-but-exclude-one-of-that-propertys-properties

## 修正方法

シリアル化の際にお互いを参照している部分のうち、片方のプロパティを無視するように設定を変更しました。

```diff_c_sharp:Skill.cs
+using System.Text.Json.Serialization;
public class Skill
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;

+    [JsonIgnore]
    public List<User> Users { get; } = [];
}
```

`[JsonIgnore]`のアノテーションを追加する事でシリアルの際に無視されるようになります。

## おわりに

EFCore は使いこなすと開発の強い助けになるため、今後も使っていきたいです。

この記事が皆様のコーディングライフの助けになれば幸いです。

## 参考

https://learn.microsoft.com/ja-jp/ef/core/modeling/relationships/many-to-many

https://learn.microsoft.com/ja-jp/ef/core/querying/related-data/serialization

https://stackoverflow.com/questions/38815800/include-property-but-exclude-one-of-that-propertys-properties
図解で分かる！Pythonを始める前に最低限知っておきたいTips

私がプログラミングに入門したときに、そういえばこの辺よく分からなかったなという点を思い出してまとめてみました。

良かったら参考にしていただけると嬉しいです。でも完璧に覚える必要はありませんので、流し読み程度に。


## 「Pythonの始め方」みたいな記事が大量にある
同じ言語に対して、なぜこんなにも始め方の記事があるのだろうと思いました。

結論、それは**作業環境**が沢山あるからでした。

- VScode
- Pycharm
- Jupyter Notebook
- Jupyter Lab
- Google Colab

などなど、いろんな環境でPythonを動かすことができるんです。

もちろんこの作業環境の分、ネットには記事があって、これがややこしい原因の1つかなと思います。

特にこだわりがない人は「Python VScode 環境構築」あたりで調べればいいかと。

手軽に始めたい人はGoogle Colabもおすすめです。これはGoogleアカウントさえあれば始めることができます。

あと、この辺を調べているときに**IDE**という文字を見かけることがある人がいるかもしれません。

これは統合開発環境と言って、開発に必要なものが詰め込まれている便利な奴です。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/85b8b859-dd7e-45c5-b5d3-5397e50bec18.png width=80%>

## ファイルにはパスという概念が存在する
プログラミングを始める前までは、何気なくフォルダをクリックして、ファイルをダブルクリックして開いていました。

プログラミングではこのフォルダとファイルの構造を意識する必要があります。

:::note info
フォルダのことをディレクトリと言ったりします。
:::

![図解 - 2025-04-24T054808.209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/d289e65c-dfce-4a03-a8a2-4dc6f22479c3.png)

例えば、dir1がデスクトップにあって、file1を指定したい場合、プログラミングでは以下のように書きます。

~~~
C:\Users\ユーザー名\Desktop\dir1\dir2\file1.py
~~~

これは絶対パスと言って、**最上位に位置するディレクトリ（ルートディレクトリ）から、対象のファイルまでの道順(階層構造)を記述する方法**になります。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/03d8c5a2-a7a2-43dc-8dde-693aae5f0f2c.jpeg width=70%>

もう1つ相対パスというものがあります。相対パスは**現在作業しているディレクトリ（カレントディレクトリ）を基準にして、対象ファイルまでの道順を記述する方法**になります。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/64645353-98d3-419f-ab37-03687ee97ed6.jpeg width=70%>



## パスを通すって何のこと
Pythonをインストールするときに「パスを通す」という言葉を目にすると思います。

パスを通すとは、**ファイル名を指定するだけで実行できるようにすることです。**

プログラムを実行したい場合、場所を指定したり、その場所に移動することで実行できますが、毎回となると面倒なのでパスを通します。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/3ddc4d0c-8e74-492f-befa-2021979a8b1c.png width=80%>

具体的には以下の手順でパスを通します。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/59bade87-1e16-4b0f-ad58-dd121b26ae73.png width=50%>



![5fc887e6308a-20250214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/dfe4a56e-4864-4e52-991a-21bc9948d5c4.png)



![57e1b7209c8a-20250214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/ea58295b-2bba-4ad2-b8fd-4cf6353019f4.png)

![cfc162798c51-20250214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/0112f52e-453d-4e83-b05d-3348d9c82abd.png)

**絶対パス**で記入してあげてください。

## おわり
最後までお読みいただきありがとうございました。
プログラミング入門の一助となれば幸いです。

「図解で学べる」を意識して書籍を書いています。
こっちも良かったらチェックしてね！


https://zenn.dev/python_academia/books/eabcc6b22afff5

https://zenn.dev/python_academia/books/6df147d8b82939
【Xcode】シュミレーターが見つからないエラー「Unable to find a destination matching the provided destination specifier」の解決法



### ✅ 背景

FlutterアプリをiOSシミュレータで実行しようとしたら、こんなエラーに遭遇：

```
Unable to find a destination matching the provided destination specifier:
{ id:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX }
```

`flutter run` してもシミュレータが見つからず、ビルドに失敗。もちろんsimulatorアプリではシュミレーターは起動している。
`xcrun simctl list` ではシミュレータが Booted 状態になっているのに、Flutterはそれを見つけられない。
ChatGPTに聞いても解決せず、色々調べて解決したのでChatGPTに記事を書かせることでメモする。

---

### 🔍 原因

Xcodeのビルド設定において、**Release構成（またはProfile構成）の `Supported Platforms` が `iphoneos` に設定されていた**ことが原因。

- `iphoneos` は**実機用**
- `iOS` は**シミュレータ＆実機両対応**

Flutterは、デバッグ時でも一部 `Release` 設定を参照するケースがあり、これが**ターゲットの不一致エラー**を招いていた。

---

### 🛠 解決方法

#### 1. Xcodeでプロジェクトを開く

```bash
open ios/Runner.xcworkspace
```

#### 2. Build Settings を開く

- 左側で「Runner」ターゲットを選択
- 中央タブで「Build Settings」をクリック
- 「All」「Levels」を選択
- 右上の検索バーで `Supported Platforms` を検索

#### 3. 各ビルド構成で `Supported Platforms` を以下に設定：

![Screenshot 2025-04-23 at 23.32.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794078/0e17d919-7b31-49e3-a21c-2c5b7e729025.png)


| Configuration | 正しい値 |
|---------------|----------|
| Debug         | `iOS`    |
| Profile       | `iOS`    ✅ ← ここが `iphoneos` だとNG |
| Release       | `iOS`    ✅ ← ここが `iphoneos` だとNG |

> 💡 値が見つからない場合は「+」ボタンで `SUPPORTED_PLATFORMS` を手動追加も可能。

---

### 🧼 変更後に実行すべきコマンド

```bash
flutter clean
flutter pub get
flutter run
```

またはシミュレータUUIDを指定する場合：

```bash
flutter run -d <シミュレータのUUID>
```

UUIDは `xcrun simctl list devices` で確認。

---

### 🎉 結果

無事にFlutterアプリがiOSシミュレータ上で起動！

---

### 🔚 おまけ：この問題に気づきにくい理由

- `Debug` 構成だけ見ても、実は `Release` の設定がビルド時に影響するケースがある（Flutter特有）
- Flutterは自動的に最後に使ったシミュレータIDを再利用しようとする
- `SUPPORTED_PLATFORMS` はXcodeのバージョンによって見え方が変わる（Xcode 14以降で顕著）

---

### 📝 おわりに

Xcodeはちょいちょいこういうエラーに遭遇するので厄介だが、しぶとく頑張っていくしかないかあ。
ChatGPT記事執筆ありがとう。

### 記事執筆
全てChatGPTであることをご承知おきください。

---
windows11で、sketchup6 その77

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
ズームせよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ee189d32-5772-426b-b255-9d62f09e62c2.png)

# サンプルコード

```
def zoom
	Sketchup.active_model.active_view.zoom_extents 
end

```

以上。
Github ActionのSetup Node.js and cacheで Cache service responded with 422が返される

# はじめに
Github Actionを使用してfirebaseにデプロイするCD環境を構築しようとした際につまづいた点をまとめました。

# 問題
githubの公式の ```setup-node``` アクションを使用して、Node.js環境をセットアップしようとしたのですが下記のような422エラーが返ってきました。
```
jobs: # 実行されるジョブの集まり
  build: # ビルド処理を行うジョブ
    name: build # ジョブの表示名
    runs-on: ubuntu-latest # ジョブを実行する仮想環境の種類 (最新のUbuntu)
    steps: # ジョブ内で実行されるステップ(処理単位)
      - name: Checkout code # ステップ名: コードのチェックアウト
        uses: actions/checkout@v2 # リポジトリのコードを仮想環境にダウンロードするアクション
      - name: Setup Node.js # ステップ名: Node.jsのセットアップ
        uses: actions/setup-node@v2 # Node.js環境をセットアップするアクション
        with: # アクションに渡すパラメータ
          node-version: "18" # Node.jsのバージョンを18に指定
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779353/319f1e2d-268a-4d88-884d-002312abfd0d.png)



# 解決方法
```@v2``` ではなく ```@v4``` を使用する。
```
actions/checkout@v2
↓
actions/checkout@v4
```
```
actions/setup-node@v2
↓
actions/setup-node@v4
```
Githubのissueで見つけたのですが、```@v2``` は廃止されたバージョンに依存しているため、現在は ```@v4``` にアップグレードされているようです。

https://github.com/actions/setup-node/


# おわりに
エラーの内容をそのままコピペして検索すると、上記の解決策にたどり着けました。
くよくよ考えず、他の人が解決していることを信じてすぐ検索していきたいと思います。

# 参考
https://docs.github.com/ja/actions/use-cases-and-examples/building-and-testing/building-and-testing-nodejs#specifying-the-nodejs-version
上書きしてしまったユーザー環境変数（Path）を元に戻す方法

こんにちは、arcadia13です。
誤って、自分のPCのユーザー環境変数（Path）を上書きするというアホなことをやらかしました。今回その対処法を備忘録を兼ねて残します。


##  経緯

- Python環境（pyenvによる）を整えようとして、PowerShellで下記コマンドを実行

```powershell
$tmp = "pyenv用のパス先"
[Environment]::SetEnvironmentVariable("Path", "$tmp", "User")
```
- このコマンドが、既存の環境変数に対して「追加」する処理だと勘違いした状態で実行してしまった


## 本手法の前提条件

- Win10 or Win11であること
- このコマンド実行したPowerShellを**閉じていない**こと（閉じていたらアウト）

## 手法

### 開いているPowershellの環境変数情報の確認

```powershell
$Env:Path
# 以下に結果が表示される
```
ここに表示されるのは、開いているPowershellが**今使用している**環境変数の情報です。Powershellを開いた状態だと、たとえ環境変数を変更してもそれが適用されません。変更適用には、PowerShell自体を閉じる必要があります。場合によってはPC自体を再起動しないと適用されません。今回はこれを利用します。


### 表示結果をコピーする

マウスなどで表示結果をすべて選択してCtrl+C。


### コピーした環境変数を用いて下記を実行

```powershell
$tmp = "表示結果をコピペする"
[Environment]::SetEnvironmentVariable("Path", "$tmp, "User")

```

### 一度PowerShellを落とし、もう一度立ち上げる

コマンドなどを確認して、環境変数が正常に戻っているか確認する


## 今回の問題点
- 事前に、削除してOKな自作環境変数などで予行練習していなかったこと
    - 自分のPC環境しか影響がないとはいえ怠っていました
- コマンドの処理内容を詳しく把握していなかったこと

## 対処法
- コマンドの挙動をよく調べ実行する
- 定期的に環境変数のバックアップをとる



# 参考
https://kinakobanana.hatenablog.com/entry/2021/10/24/004046

## まとめ
上書きした環境変数を元に戻す方法を、備忘録もかねてまとめました。

## 終わりに
自分の至らなさの結果ですので反省しています。
こんな経験は初めてだったので焦りました。
ただ、今回はPowerShellを閉じていなかったことが幸いしました。
焦りそうな場面こそ、無理やりにでも冷静さを取り戻す、不必要に焦らない訓練が必要だなと思いました。
Kaggleチーム仲間募集

【Kaggleチーム仲間募集】これから一緒に取り組んでくれる方を探しています！
こんにちは！databankです。

Kaggleに挑戦してみたいと思い、
一緒に学び合いながら取り組める仲間を募集しています！

まだ参加するコンペは決めていないので、
まずはチームを作って、相談しながら決めましょう！

募集内容
コンペ未定（チームで決めたいです）

活動ペース：週7時間程度（1日1時間くらい）

使用ツール：Python

自己紹介
Python歴：3ヶ月

Kaggle経験：未経験

挑戦したいこと：Kaggleの進め方に慣れること、データ分析力アップ

こんな方を歓迎します
Kaggle初心者・未経験者

こまめに連絡を取り合って進められる方

互いにサポートし合いながら学びたい方

興味ある方へ
この記事にコメント、またはX（@databan20758744）までDMでご連絡ください！
Linux + EasyEffectsで高級ヘッドホンや真空管アンプをエミュレートする！？

## はじめに

ヘッドホンマニアにとって、理想の音楽体験とは何か。高級ヘッドホンや高級アンプを買い揃えて、いろいろな音を楽しめたらどんなに良いことか。しかし、予算の都合上現実的ではありません。
しかし、**イコライザ等によるデジタル補正**で、今あるヘッドホンのポテンシャルを最大限に引き出すことができるのです。

この記事では、**Linux環境におけるEasyEffectsの活用法**を中心に、ChatGPTなどのAIを使った**周波数特性の補正テクニック**までを紹介します。

---
## 最近の音楽再生環境の進化

- 音楽配信サービスはすでに**HiFi対応（24bit/96kHzなど）**が当たり前に
- CD音質（44.1kHz/16bit）では物足りなさを感じる人も増えてきた
- DAC（Digital-to-Analog Converter）の性能も向上しており、**USBやBluetoothでも高品質な再生が可能**になった

今や、高級CDプレーヤーよりも、むしろPCやスマホから音楽を鳴らす方が、理論上良い音が出ます。
つまり…その計算能力で、高音質で、かつ、自由に**音が創れる**時代に突入していると言えます。

---
## ヘッドホンと周波数特性の関係

どんなに高価なヘッドホンでも、**すべての音域を完璧に鳴らすわけではありません**。特に中音域が凹んでいたり、低音や高音が強調されている“Vシェープ”の特性を持つモデルや、高音だけが強く低音域が弱いモデルも少なくありません。

せっかくちょっと良いヘッドホンを買ったのに、ちょっとがっかり。そんな時は、イコライザ（EQ）を使ってその弱点を補えば、**本来の性能をグッと引き出せる**のですが、この調整が意外と難しい。よくある「ジャズ向け」「ロック向け」などのプリセットを使うと、逆に音が崩壊することも。
オーディオの素人が、それも自分の使っている機種に合わせた調整なんて事出来ません。
が、今はAIがそれをやってくれる時代が到来しています。
デジタル最強のAI×アナログ音響機器という掛け算が新たな音楽体験を切り開いてくれます。

---

## Linux + EasyEffectsが最強な理由
私は普段UbuntuLinuxを使っています。その強みはOSレベルでかなり細かくいろいろな事が設定できる点です。具体的には次のようなメリットがあります。


### 1. システム全体にEQをかけられる
EasyEffectsは**PipeWireを前提にしたリアルタイムDSPツール**です。これにより、**OS全体の音にエフェクトをかけることが可能**。Spotify、YouTube、ローカル再生すべてに適用できます。

### 2. 高精度な周波数制御
Graphic EQやParametric EQを選べば、**周波数やQ値（帯域幅）を自由に設定できる**ため、プロレベルの補正が可能です。しかもリアルタイムで変更・保存が可能。

### 3. 軽量で高性能
GUIで直感的に使える上、CPU負荷も軽いため、**ラップトップでも高精度な補正が可能**。

---

## EasyEffectsでのイコライザ設定手順

1. 以下のコマンドでEasyEffectsをインストール：
   ```bash
   sudo apt install easyeffects
   ```
2. アプリケーションメニューから起動（UbuntuではGUIで起動可能）
3. 「エフェクトを追加」から「イコライザ（GraphicまたはParametric）」を追加
4. 「Frequency characteristics ヘッドホン名」で検索し、周波数特性を探す
   - 参考：https://www.audiosciencereview.com/
5. ChatGPTにグラフを読み込ませ、「どの周波数をどう補正すべきか」聞く
6. 返ってきた補正値をEasyEffectsに入力 or `.json`ファイルとしてインポート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/513c72e6-de72-48ca-943e-fb79f8cd6639.png)


---

## 実際に使ってみた：MDR-Z1Rでの体験

私SONYのフラッグシップヘッドホン**MDR-Z1R**を使用中。音場と解像度は抜群だが、**中音域が凹んでおり、ボーカルが引っ込みがち**なのが気になっていました。

ChatGPTに周波数特性グラフを読み込ませて補正値を出力してもらい、EasyEffectsでその通りに設定。すると、

**一気に中音域が明瞭になり、ボーカルの艶やかさと前への出方が激変した！**

もはや、**更に良いヘッドホンに“買い替えたような変化”** といっても過言ではないのです。

---

## 新しい音楽体験の時代へ

- 昔は「木製ハウジング」や「真空管アンプ」など、**機器の“味”を楽しむ時代**だった
- その度に、うん十万円のお金が財布から飛んでいった
- しかし今は、それを**デジタルで擬似的に再現できる**
- 高精度なDACと一つの優れたヘッドホンさえあれば、**“機材の味”はすべてイコライザやエフェクトで作れる時代**になった
- そんな**専門的で繊細な設定をChatGPTなどの生成AIサービスが変わりに出力**してくれる
- **「このヘッドホンを別のヘッドホンっぽく」** などの指示で、いい感じに補正値をサジェストして設定値を出力してくれる

もしかしたら、これからのオーディオからはこういった味が消え、純粋なスペックを追い求める時代へ来たのかもしれません。
音圧や音の解像度(シェープ)が純粋に高いモデルが強く、一聴すると味気ない機器を上手くイコライザで調整して楽しくする時代が来たのかも、そんなある種の恐ろしい体験でもありました。

---
## おわりに
Linux + EasyEffects は、**オーディオ愛好家にとって最強の自由度と再現性をもたらすツール**です。

もちろん、WindowsでもEqualizer APO + Peaceなど代替手段はありますが、**Linux環境の柔軟性と軽快さはやはり抜群**。

ヘッドホンのポテンシャルを最大限に引き出すその第一歩として、ぜひあなたもEasyEffectsで“音の再定義”を体験してみてください！
Railsアプリ開発で初めて「エンティティ抽出とER図設計」をやってみた話

#  Railsアプリ開発で初めて「エンティティ抽出とER図設計」をやってみた話

こんにちは。
Railsエンジニア転職を目指してWebアプリを開発中の者です。

この記事では、**初めて「エンティティ抽出」と「ER図設計」に取り組んだ過程**を  
自分なりの学びや気づきとあわせてまとめます。

---

## 前提：どんなアプリを作っているか？
テーマは「生活に役立つアプリ」です。 
複数の情報を記録・検索・振り返ることができる構成になっています。

---

## 1.エンティティってなに？

### ✔ エンティティとは？
> アプリの中で「保存しておきたい情報のまとまり」のこと  
→ データベースにテーブルとして保存される

たとえば今回のアプリでは、次のようなエンティティが浮かびました。

| エンティティ名 | 意味 |
|----------------|------------------|
| User           | アプリを利用するユーザー情報 |
| Item           | 検索・記録の対象となる情報単位 |
| Record         | ユーザーが記録する履歴データ |
| Bookmark       | お気に入りとして保存する中間データ |
| Notification   | 通知設定のデータ |

---

## 2. エンティティの属性（カラム）を定義する

次に、「この情報には何が必要か？」を考えて属性（カラム）を洗い出しました。

例：`users` テーブルのカラム

| カラム名 | 型 | NULL可 | デフォルト | 説明 |
|----------|----|--------|------------|------|
| name     | string | NO | - | 表示名 |
| email    | string | NO | - | ログイン用 |
| encrypted_password | string | NO | - | Devise用 |
| notification_enabled | boolean | NO | true | 通知ON/OFF |

このように全エンティティについて表形式でまとめました。

---

## 3. テーブル同士の関係（リレーション）を整理する

次に、エンティティ間の関係を確認します。

例：

- `User` has_many `Records`, `Bookmarks`, `Notifications`
- `Item` has_many `Records`, `Bookmarks`
- `Record` belongs_to `User`, `Item`

---

## 4. ER図を作る準備を始めた
まだER図そのものは作成していませんが、
エンティティやリレーションを整理したことで、図にできる手前の状態までは整いました。

現在は以下のような関係性を想定しています
```
User ──────┐
           │
        Record
           │
Item ──────┘

User ───< Bookmark >── Item
User ───< Notification
```
Mermaidを使用しました。


## 学び・気づき

- 最初は「何がエンティティなのか」すらよくわからなかったけど、
  「名詞で考える」「何を保存したいか」で整理できた。
- テーブル同士の関係を考えるのが一番楽しかった（＝アプリの流れが見えた）。
- カラム定義のとき、「NULLを許可するか」「デフォルト値をどうするか」に迷ったが、将来の拡張性を考える良い機会になった。

---

## エンティティを洗い出す作業について
アプリ全体の「何を扱うか」「どんな情報を持たせるか」を整理する大切な第一歩。
まだER図はこれからですが、
エンティティとカラム、関係性の洗い出しを通じて、
「このアプリで何を実現するのか」がだんだんハッキリしてきた実感があります。
このあと、以下のようなステップに進んでいく予定です。
```ruby
rails g model # モデルを作る
rails db:migrate # データベースを作る
rails db:seed # ダミーデータを登録する
```

引き続き、勉強を続けていきます。
c# ref 構造体のメンバ関数でSpan<T>を受け取るときは拡張関数にしよう

# こういう書き方したいよね
param T[]って配列なのでヒープに乗りパフォーマンス低下。[神のサイト](https://ufcpp.net/blog/2022/2/params-span/)。
stackallocを使って以下のようにすれば大丈夫。
```c#
Hoge(stackalloc T[]{t0,t1,t2});
Hoge(stackalloc T[]{t3,t4});
```
# ref構造体のメンバ関数では無理
拡張関数はstatic関数なのでいけるっぽい。
```c#
using System;
class Program
{
    public static void Main()
    {
        Span<int> span = stackalloc int[] { 1, 2, 3 };
        new TestRefStruct().A(span);// ここだけエラー
        new TestRefStruct().ExA(span);
        new TestClass().A(span);
        new TestStruct().A(span);
    }
}
public ref struct TestRefStruct
{
    public void A(Span<int> arg)
    {

    }
}
public static class ExTestStruct
{
    public static void ExA(this TestRefStruct ts,Span<int> arg)
    {

    }
}
public class TestClass
{
    public void A(Span<int> arg)
    {

    }
}
public struct TestStruct
{
    public void A(Span<int> arg)
    {

    }
}
```
# C#11ではできるっぽい
コメントで教えてもらいました。
c#11以降ではscoped引数にすることで上の呼び出しが可能になるよ
```c#
public ref struct TestRefStruct
{
    public void A(scoped Span<int> arg)
    {
    }
}
```
ゲーム上に意図していないオーバーレイが出る

# 経緯

疲れて帰ってきてゲームをしようとしたら、勝手に意図していないPCのパフォーマンスモニタが、オーバーレイとして表示されるようになっていた。
それだけならまだしも、それによって描画がバグったり、起動しなくなるソフトウェアがあった。(具体的にはBlueStacks)

実際のオーバーレイは以下の画像のとおりである。
レンダリングAPI(OGLやD3D9、D3D11等)、GPU・CPUのクロック数や温度などが表示されていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328036/695fd20c-e119-4dc3-9fba-8148575597af.png)

# 今回の場合の解決策
ASUS の GPU Tweak III が悪さをしていた。
OSDをオフにすると良い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328036/e7added5-3903-42b9-b965-642369d7f2c5.png)

以上。
久しぶりに「何もしてないのに壊れた」……アンスコしてやろうかな……
やっぱりAfterburnersしか勝たんか……

## 参考
https://www.reddit.com/r/ModernWarfareII/comments/ylifoq/how_to_turn_this_off_not_the_info_on_the_upper/
競プロ日記#25/04/23

# アルゴ式-[和が K 以上のペア](https://algo-method.com/tasks/381)
- 2変数と見せかけて片方を固定して固定しているN回のforの中でK - A[i]に二分探索を仕掛けに行く。
```
int main() {
  int N, K; cin >> N >> K;
  vector<int> A(N);
  for (int i=0; i<N; i++) cin >> A[i];

  // 配列 A を昇順にソートする
  sort(A.begin(), A.end());

  long long count = 0;
  for (int i=0; i<N; i++) {
    // 二分探索
    int left = 0, right = N;
    while (left!=right) { // 解が求まるまで
      // left と right の 中点 mid をとる
      int mid = (left+right)/2;
      if (A[mid]>=K-A[i]) { // もし A[mid] >= B[i] ならば答えは left 以上 mid 以下
        right = mid; // 範囲を狭める
      }
      else { // そうでなければ答えは mid+1 以上 right 以下
        left = mid+1; // 範囲を狭める
      }
    }
    count += N - left;
  }

  cout << count << endl;
  return 0;
}
```
# アルゴ式-[何番目の重さ？](https://algo-method.com/tasks/399)
- シンプルな二分探索で実装はできた。
- ただ、出力内容が「left」だと1だけ余分に増えた値になる（答えが「0,1,2,3,4」なのに「1,2,3,4,5」）
もちろん出力の値を「left - 1」にすればACになったのだがこうなる原因が具体的にわからなかった。
→GPT先生に聞いたら俺のコードはleftの終端が大なりで終わるようになっているから。つまりi = 0でA[0]が1の場合の「1 2 4 5 7 8」の例だとW[mid]がA[0](=1)より大きい2の位置(添え字でいうと1)で終わるようになっているかららしい。言われてみれば確かに（てか自分で実装してるんだからわかれよ（笑）というかソートしたものと元のやつを扱ってるから頭がこんがらがった）
```
int main() {
    long long N;
    cin >> N;
    vector<long long> W(N);
    for (long long i = 0;i < N;i++){
        cin >> W[i];
    }
    vector<long long> A(N);
    for (long long i = 0;i < N;i++){
        A[i] = W[i];
    }
    sort(W.begin(), W.end());
    for (long long i = 0;i < N;i++){
        long long left = 0;
        long long right = N;
        
        while (left != right){
            long long mid = (left + right) / 2;
            if (W[mid] > A[i]){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        cout << left - 1 << endl;
        
    }
}
```

# アルゴ式-[段階評価](https://algo-method.com/tasks/671eed91313e9d35)
- 割とシンプルな二分探索問題。ここに来てやっと簡単な二分探索を使いこなせるようになった感
```
int main() {
    int N,K;
    cin >> N >> K;
    vector<int> A(N);
    for (int i = 0;i < N;i++){
        cin >> A[i];
    }
    vector<int> B(K);
    for (int i = 0;i < K;i++){
        cin >> B[i];
    }
    sort(B.begin(), B.end());
    for (int i = 0;i < N;i++){
        int left = 0;
        int right = K;

        if (A[i] >= B[K-1]){
            cout << K << endl;
            continue;
        }
        
        while (left != right){
            int mid = (left + right) / 2;
            if (B[mid] > A[i]){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        cout << left << endl;
    }
}
```
カシオClassWiz CW関数電卓のクローン機、ついに現わる

## deliがやってくれました
deli（得力）がカシオClassWiz CWのクローン機、D999CN Proを発売したようです。
CNの型番が付く通り、中国版であるfx-999CN CWを模倣したものと考えられます。

https://www.nbdeli.com/products/productinfo/49619.html

レビューを見る限り、基本的な精度（内部桁数）はdeliのクローンが上、ただし答がπになる積分の例題でカシオ機より精度が悪かったようです。

https://tieba.baidu.com/p/9654716947

いやー、これ試してみたいですね。
レビューに指数入力のことは書かれてませんが、指数入力が改良されてたらオリジナルよりこちらを買いたくなってしまうのでは。

カシオよ、初代ClassWizの販売を打ち切ったのは模造品対策だったのですか？
本当にその判断は正しかったのでしょうか。
Cursor エディタの Microsoft 拡張を使わないC/C++ 対応

# 急いでいる人のために

## Windows
1) Cusorから`Microsoft の C/C++拡張`をuninstall
2) `http://adoxa.altervista.org/global/` から Win32用 binariesをダウンロード
3) ダウンロードしたzipを解凍。ここでは解凍したフォルダ名を `gnuglobal` に変更
4) `gnuglobal` フォルダを `C:\Program Files` 内に移動
5) `PATH` 環境変数に `C:\Program Files\gnuglobal\bin` を追加
6) Cursorに `sailsxu.gtags` 拡張を入れる
7) ここでCursorを再起動(PATHの有効化)
8) **初回**、および、**関数・変数を追加・変更・削除した適当な時**に プロジェクトルートから`gtags.exe`を実行してインデックス作り直す。これで、関数ジャンプができるようになります
9) 次のgtags作業ファイル名を.gitignoreにいれておくとよいと思います
    ```
    GPATH
    GPOS
    GRTAGS
    GTAGS
    ```
関数・enum・structやマクロなどの定義へのジャンプできるようになりました。
（注：上記設定だけでは変数へのジャンプはできません）

TODO: llvm構成

## macosx
1) Cusorから`Microsoft の C/C++拡張`をuninstall
2) `brew install global`
3) Cursorに `sailsxu.gtags` 拡張を入れる
4) **初回**、および、**関数・変数を追加・変更・削除した適当な時**に gtagsコマンドを実行してインデックス作り直す (C/C++ソースが `src` フォルダにあるとしたら、プロジェクトルートで `gtags -C src` を実行)
5) 次のgtags作業ファイル名を.gitignoreにいれておくとよいと思います
    ```
    GPATH
    GPOS
    GRTAGS
    GTAGS
    ```

# 解説

MSのC/C++拡張の代わりに gtags を使用します。完全に代わりにはならないと思いますが、関数や変数名をクリックしての移動などには問題なく使えます。

gtagsでシンボルへのジャンプ情報インデックスを作成しています。そのインデックスを解釈するCursorの拡張で、sailsxu.gtagsを使っていますが、他のgtags拡張でもよいと思います。
MCPサーバーとQiita自動投稿ツールの構築・運用まとめ

# 概要
本記事では、Model Context Protocol (MCP) Python SDKを用いたMCPサーバーの構築、およびQiita APIを利用した自動記事投稿ツールの実装・運用方法についてまとめます。

## 1. MCPサーバーの構築
- MCP公式SDK（modelcontextprotocol, mcp）を利用
- `from mcp.server.fastmcp import FastMCP` でサーバーインスタンス作成
- @mcp.tool() デコレータでツール（例: Qiita投稿）を登録
- サーバー起動は `if __name__ == "__main__": mcp.run()` でOK

## 2. Qiita投稿ツールの実装
- MCPツールとして `post_qiita_article` を実装
- 引数は「記事データファイルパス（str）」または「記事データ本体（dict）」両対応
- .envにQIITA_TOKENを保存し、API認証に利用
- 記事データはQiita API仕様（title, body, tags, private等）に準拠

## 3. テスト・運用
- テストコードや送信データ、スクリーンショットは用途ごとにディレクトリ分離（TestCodes, QiitaArticles, Screenshots等）
- MCP InspectorやClaude Desktopからサーバーを呼び出し、ツール経由で記事投稿可能

## 4. 参考
- MCP Python SDK: https://github.com/modelcontextprotocol/python-sdk
- Qiita API: https://qiita.com/api/v2/docs#post-apiv2items

---

この記事は自動生成・自動投稿の検証用です。
CursorのMCP ServersでMCP configuration errorsが出力される

## 事象

Cursor > Preferences > Cursor Settingsから、MCPのタブを表示すると以下のようなエラーが出てしまっていた。

![スクリーンショット 2025-04-24 1.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/7302e4a7-75d7-4279-8349-30fbc250cad2.png)

## 原因

MCPサーバーの設定が無いと表示されるようで、プロジェクトの設定とglobalの設定でとりあえず何かMCPサーバーを登録したり、空の設定ファイルを置くことで回避できました。

## globalの方に空設定ファイルを置く方法

右上の`+ Add new global MCP server`を押下し、以下を貼り付け

```mcp.json
{
  "mcpServers": {}
}
```

## プロジェクトの方に空設定ファイルを置く方法

`.cursor/mcp.json`というファイルを作成し、以下を貼り付け

```mcp.json
{
  "mcpServers": {}
}
```

これで回避することができました！
もちろん、globalとprojectそれぞれにMCPサーバーを登録しても解決できます。
演算処理

# 演算処理
## 数値チェック
指定した変数が数値か否かをチェックする
~~~
'------------------------------------------------------------------------------
' 数値チェック
'------------------------------------------------------------------------------
Public Function F_CheckNumeric( _
        ByVal aCheck As Variant) As E_RET
    Dim wkRtn As E_RET: wkRtn = E_RET_NG
    
    If IsNull(aCheck) <> True Then
        Select Case VarType(aCheck)
            Case vbDecimal, vbByte, vbInteger, vbLong, vbLongLong
                wkRtn = E_RET_OK
            
            Case vbSingle, vbDouble, vbDate
                wkRtn = E_RET_OK_1
            
            Case vbString
                If IsNumeric(aCheck) = True Then
                    wkRtn = E_RET_OK_2
                End If
        End Select
    End If
    
    F_CheckNumeric = wkRtn
End Function
~~~
## ビットチェック
数値の内で、指定したビットがONとなっているかをチェックする。
一部一致か完全一致の指定あり
~~~
'------------------------------------------------------------------------------
' ビットチェック
'------------------------------------------------------------------------------
Public Function F_CheckBitOn( _
        ByVal aNum As Long, ByVal aCheck As Long, _
        Optional ByVal aMask As Long = &H0, _
        Optional ByVal aChkSpec As E_CHECK = E_CHECK_OR) As Boolean
    Dim wkRet As Long
    Dim wkMask As Long
    
    If aChkSpec = E_CHECK_OR Then
        wkRet = ((aNum And aCheck) > 0)
    Else
        wkMask = aMask
        If wkMask = &H0 Then
            wkMask = aCheck
        End If
        
        wkRet = ((aNum And wkMask) = aCheck)
    End If
    
    F_CheckBitOn = wkRet
End Function
~~~
配列処理

# 配列処理
## 配列追加
指定した配列に追加変数を設定する。
追加位置指定あり。
~~~
'------------------------------------------------------------------------------
' 配列追加
'------------------------------------------------------------------------------
Public Function F_GetArrayAdd( _
        ByRef aRtnAry As Variant, _
        ByVal aAdd As Variant, _
        Optional ByVal aIdx As Long = D_IDX_END) As Boolean
    Dim wkRtnAry As Variant: wkRtnAry = aRtnAry
    
    Dim wkIdx As Long: wkIdx = aIdx
    Dim wkIStt As Long, wkIEnd As Long, wkICnt As Long
    
    '配列がある場合
    If IsArray(wkRtnAry) = True Then
        '現在の配列から調整
        wkIStt = LBound(wkRtnAry)
        wkIEnd = UBound(wkRtnAry)
        If wkIdx < D_IDX_START Then
            wkIdx = wkIEnd + 1
        End If
        
        '終了位置チェック
        If wkIdx > wkIEnd Then
            ReDim Preserve wkRtnAry(wkIStt To wkIdx)
        '開始位置チェック
        ElseIf wkIdx < wkIStt Then
            ReDim wkRtnAry(wkIdx To wkIEnd)
            
            '配列再設定
            For wkICnt = wkIStt To wkIEnd
                S_SetItem wkRtnAry(wkICnt), aRtnAry(wkICnt)
            Next wkICnt
        End If
    '配列がない場合は新規作成
    Else
        '開始位置調整
        If wkIdx < D_IDX_START Then
            wkIStt = D_IDX_START
            wkIdx = D_IDX_START
        Else
            wkIStt = wkIdx
        End If
        
        '値ありなら開始位置再調整
        If IsEmpty(wkRtnAry) <> True Then
            wkIStt = wkIStt - 1
            If wkIStt < D_IDX_START Then
                wkIStt = D_IDX_START
            End If
        End If
        
        '配列を生成
        ReDim wkRtnAry(wkIStt To wkIdx)
        
        '元の値を先頭に設定
        S_SetItem wkRtnAry(wkIStt), aRtnAry
    End If
    
    S_SetItem wkRtnAry(wkIdx), aAdd
    
    aRtnAry = wkRtnAry
    F_GetArrayAdd = True
End Function
Public Function F_ReturnArrayAdd( _
        ByVal aArray As Variant, _
        ByVal aAdd As Variant, _
        Optional ByVal aIdx As Long = D_IDX_END) As Variant
    Dim wkRtnAry As Variant: wkRtnAry = aArray
    
    F_GetArrayAdd wkRtnAry, aAdd, aIdx:=aIdx
    
    F_ReturnArrayAdd = wkRtnAry
End Function
~~~
変数処理

## 変数処理
# アイテム設定
オブジェクトとオブジェクト以外を判定し、戻り値に設定する
~~~
'------------------------------------------------------------------------------
' アイテム設定
'------------------------------------------------------------------------------
Public Sub S_SetItem( _
        ByRef aRtn As Variant, _
        ByVal aItem As Variant)
    If IsObject(aItem) <> True Then
        aRtn = aItem
    Else
        Set aRtn = aItem
    End If
End Sub
~~~
M_Common：各種定義

# 共通処理の各種定義
~~~
'##############################################################################
' 共通処理
'##############################################################################
' 参照設定          |   ―
'------------------------------------------------------------------------------
' 共通バージョン    |   250504
'------------------------------------------------------------------------------

'==============================================================================
' 公開定義
'==============================================================================
' 定数定義
'------------------------------------------------------------------------------
Public Const D_POS_START As Long = 1
Public Const D_POS_NONE As Long = D_POS_START - 1
Public Const D_POS_NOW As Long = D_POS_NONE - 1
Public Const D_POS_END As Long = D_POS_NOW - 1

Public Const D_IDX_START As Long = 1
Public Const D_IDX_NONE As Long = D_IDX_START - 1
Public Const D_IDX_NOW As Long = D_IDX_NONE - 1
Public Const D_IDX_END As Long = D_IDX_NOW - 1
Public Const D_IDX_ALL As Long = D_IDX_END - 1

Public Enum E_RET
    E_RET_NG = 0
    E_RET_OK
    E_RET_OK_1
    E_RET_OK_2
End Enum

Public Enum E_CHECK
    E_CHECK_NONE = 0
    E_CHECK_OR
    E_CHECK_MATCH
End Enum

Public Const D_LEN_FULLPATH_MAX As Long = 256

Public Const D_MARK_INVALID As String = "―"

'==============================================================================
' 内部定義
'==============================================================================
~~~
【SadServers】Copliotを使った学習記録①

こんばんは。
どこかの初級エンジニアです:baby_tone1::v_tone1:


YouTubeを見ていたところ「SadServersの問題をAIに解いてもらい、
入力するだけでも学習になる」という動画を見たので実際にやってみます。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

:arrow_down:問題文を要約したものが下記になります:arrow_down:

「テストプログラムが不要になり、ログファイル /var/log/bad.log への
継続的な書き込みでディスクが圧迫されています。

この問題を解決するためプログラムを特定して終了しましょう。
その際ログファイルのサイズが変化しないかを確認しましょう。

「ソリューションを確認」ボタンで実行されるスクリプト
/home/admin/agent/check.sh を活用可能です。」

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

これをWindows標準で内臓されている、Copilot君に解いてもらいました:alien:
:arrow_down:実行結果は以下の通りです:arrow_down:

1. 「ログファイルへの書き込みプロセスを特定する」
スクリプト /home/admin/agent/check.sh を実行してみましょう。
もしかすると、このスクリプトはログファイルを
継続的に書き込むプロセスを見つけて終了する助けになるかもしれません。
同時に、以下のコマンドを活用してプロセスを調査できます
［lsof /var/log/bad.log］ログファイルを開いているプロセスを確認。
［fuser -v /var/log/bad.log］どのプロセスがログファイルを使用しているか特定。

2. 「プロセスを終了する」
ログファイルを書き込んでいるプロセスを特定したら、以下を試してください。
プロセスID(PID)を使用して［kill -9 [PID] ］で強制終了。
サービスとして実行されている場合は、［systemctl stop [サービス名]］を使用して停止。

3. 自動実行を防止する
不要なプログラムが再起動しないようにするには、以下を実行してください。
［systemctl disable [サービス名] ］で自動起動を無効化。

4. ログファイルのサイズ変化を監視
プロセスを停止した後、［tail -f /var/log/bad.log］を再度実行して
ログファイルのサイズが変化しないか確認してください


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

\ありがとうCopilot君:alien:/
教えてもらった内容の1.のコマンドを入力している時に
「あれ、lsof実行結果のプロセス名ってどこの事だっけ」となりまして
すかさずCopilot君に質問しました。


:arrow_down:実行結果は以下の通りです:arrow_down:

lsof コマンドの出力でプロセス名は、COMMAND 列に表示されます。
この列は、そのプロセスがどのプログラムやコマンドによって
実行されているかを示しています。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

\ありがとうCopilot君:alien:/


2.のプロセスIDについては、まんま「PID」の表記だったため問題なく
その他に不明点もなかったので、順序通りにコマンド入力しました:fist_tone1:

すべて入力し終わり、「私の解決策を確認する」を押してみました
すると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691693/87e98c01-360b-444a-9cf3-4db240fcc4fa.png)

AIを駆使して初めてクリアしました！:baby_tone1::point_up_tone1:
（ほとんどCopilot君のおかげ）

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

他の設問もあるみたいなので、少しずつ学習していきたいですね:pencil2:
では、おやすみなさい～:crescent_moon:
まずはProxmoxVE化

前回までの内容

https://qiita.com/shimeji_k/items/13f45d4556ca028e51a6

## まずはこんな感じの環境遷移
これが
![第一弾.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/f5f751b7-060d-4336-990f-9244661f854c.png)

こうなって
![第一弾-第二弾.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/db007279-0b63-4ea4-a116-03adf5367cf1.png)

ProxmoxVEを入れたことによって
![第一弾-第二弾のProxmox化.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/8e72b631-5365-4bc0-8a3d-615f5bd10fb2.png)
こんな感じになりました

TrueNas管理画面とWindows10（開発用）は別のEthernetのアダプターをブリッジして
自宅用ネットワークに接続してましたけど

ここまででも十分ですよね。普通、、、

でも満足できなかったのですよ
せっかくProxmoxを入れたのだからクラスター化してみるのがいいかな？と思いましたので
![第一弾-第二弾のProxmox化.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/e14b9490-8a20-4a9d-a6fd-4e521ec53d40.png)

増やしてみた！

### そしてマイグレーションというものを知る
ProxmoxVEはマイグレーションという機能があるっぽい。
従来ならVMイメージのバックアップをとってそれを別のVMに展開という知識しかなかったので
マイグレーションで別のサーバーに移動できるというのが斬新！！
ただ、マイグレーションも時間がかかってしまうしダウンタイムが発生してしまう。

ダウンタイム無しでサーバー間を移動できる
**ライブマイグレーション**って使ってみたくない？
どうもダウンタイム無しで別サーバーへの移行が可能みたいですよ！
そのためにはCephやiSCSIといったものが有用。

なので、Cephについての勉強を開始
あとは持っているデバイスの整理を始めることになります。

## こんな感じにしてみたい！！！
そして素人設計でこんな感じになる？？？
![第一弾-考え中.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/410da927-19a0-4093-bb40-54533a99d7ef.png)
こうしてみたい！
本当にできるのかな・・・・

最初から理想を追いすぎている感がまっくす

次回

https://qiita.com/shimeji_k/items/33a551f1b7da209e844f
MacでLenovo TrackPoint keyboard2(JIS)でIntelliJ IDEAとAndroid Studioでスクロールが効かないへの対策

Bluetooth接続では事象発生
USBドングルでの接続にしたところ解決


海外でWindowsでLenovo scrollみたいなのを解除すれば、聞くようになるという話があったが、聞くようにはならなかった。
自己紹介

初めまして。
どこかの初級インフラエンジニアです。

需要はないかと思いますが、これまでの経歴を書き綴りたいと思います:pencil2:


案件：福祉系サイトの運用保守・ヘルプデスク　1年半
①ユーザサポート対応（電話・メール）
②ID管理（putty経由でLinuxサーバにアクセス）
③ログ調査（管理者権限でシステムにログインし調査）
④障害対応（一次切り分け）
→運用保守の経験しかなく、今後は構築・設計にも挑戦したいと思っています。

資格：全商情報処理検定3級、LPIC-1
→現在はping-tでLPIC-201の学習を進めています:muscle_tone1::baby_tone1:



Qittaでは学習した内容を、復習もかねて記していきたいと思います。
どうか暖かく見守ってください:pray_tone1:
ジェイレン・ブランソンのNBAクラッチエリートへの台頭: ニックスのプレーオフ進出の鼓動決意と衝撃のシーズン

<img src="https://www.cool114.com/images/domain_logo.png"alt="online free sports streaming - cool tv">
NBA の高強度かつ一か八かの環境では、重要なときにそれをやり遂げることが、優れた選手と単なる優れた選手を区別するものです。そして2024-25シーズンには、ジェイレン・ブランソンが後者のグループの中で確固たる地位を確立した。最近、NBAクラッチプレイヤー・オブ・ザ・イヤー賞のファイナリストとなったブランソンは、ニューヨーク・ニックスの冷静な鼓動として頭角を現し、勝負どころでの冷静さと冷血な殺人本能でチームを勝利に導いている。
ブランソンがダラスの脇役からニューヨークの人気者へと変貌したことは、感動に他ならない。彼のテンポコントロール、ショットメイキング、試合がかかっているときの落ち着きこそが、彼がファンのお気に入りであり、ビッグアップルのクラッチタイムのレジェンドである理由なのです。
クラッチを支配する: ブランソンのビッグモーメントの輝き
現代のNBAにおける選手の「クラッチ」とは何でしょうか？ブランソンもブザービーターの役割を果たしましたが、それはブザービーターを作ることだけではありません。それは、試合の最もプレッシャーのかかる時間でパフォーマンスを発揮し、回復力を持ち、プレッシャーの下でも完璧に実行することです。
ブランソンのクラッチ統計がすべてを物語っている。彼は第4Q得点、2分以内でのフィールドゴール成功率、そして接戦でのアシストにおいて常にリーグトップの一人である。勝負どころでの彼の冷静さは、今年ニックスを最も困難な勝利に導き、重要な場面でチームが頼れる頼りになる選手となった。
ブランソンのオールスター認定とマイルストーン
ブランソンはクラッチに加えて、賞賛も積み上げている。彼は 2025 年の NBA オールスター ゲームのスターティング ラインナップに名を連ね、リーグ全体での彼の評判にうなずきました。さらに印象的なのは、彼はフランチャイズ史上最速で5,000得点を達成したニックであり、フランチャイズのレジェンドであるパトリック・ユーイング、バーナード・キング、カーメロ・アンソニーを破ったことだ。
努力と根性で生きるグループにとって、ブランソンは勤勉で謙虚で競争心が強いニックスの文化を究極的に体現している。
ニックスのプレーオフへの野望はブランソンの冷静なリーダーシップによって促進される
ニックスがプレーオフ進出を目指す中、変化をもたらすためにブランソンのリーダーシップが求められるだろう。イースタン・カンファレンスのより競争の激しい状況では、クローザーの存在が、次のラウンドに進むか、早く帰国するかの違いとなる可能性があります。彼の経験、落ち着き、そして接戦で確立された実績により、ニックスは上位の対戦相手に対して特別なアドバンテージを得ることができます。
ファンは第4Qでさらなる英雄的な活躍を期待しており、おそらくブランソンがこの調子を維持すればプレーオフでの濃厚な走りを期待している。
クールなテレビであらゆる瞬間を高解像度で視聴
プレーオフが近づくにつれ、視聴者は中断やサブスクリプション、複雑なサインインなしですべての試合を視聴できる信頼できるサイトを探しています。そこで Cool TV が役に立ちます。高解像度のライブ NBA ライブ ブロードキャスト Web サイトとして<a href=https://www.cool111.com/> (고화질 NBA 라이브 중계 사이트)</a>、Cool TV は、お気に入りのチームを鮮明に途切れることなく視聴したいバスケットボール ファンにとって最適な場所です。
ケーブルがないのですか？問題ありません。 Cool TV では、インターネット上でスポーツの試合を無料で視聴する方法を視聴者に示しています。コンピューター、タブレット、またはモバイルで視聴している場合は、ジェイレン ブランソンの試合を勝利に導いたプレーとニックスのプレーオフでの活躍を息をのむような HD で見ることができます。
Cool TV の特徴は、ファンのエクスペリエンスへの献身です。非常にクリアなストリームからリアルタイムの更新、複数のカメラアングルに至るまで、プラットフォームはアクションの 1 秒も見逃さないことを保証します。 NBA プレーオフの戦い、KBO リーグの白熱した試合、国際サッカーなど、Cool TV は完全なスポーツ体験を無料で提供します。
最終回の感想: ブランソンの遺産はまだ始まったばかり
ジェイレン・ブランソンの2024-25シーズンは、逆境に直面したときのリーダーシップ、タフネス、そして実行力の教育となった。クラッチ・プレーヤー・オブ・ザ・イヤーのファイナリストに選ばれたことは、単なる名誉ではなく、彼がニックスとリーグ全体にとっていかに重要な存在になったかを認めるものでもある。
ニックスがポストシーズンの激しいプレーに備える中、Cool TV のようなプラットフォームのおかげで、世界中のファンが視聴することになります <a href=https://www.cool111.com/>(쿨티비)</a> 、高解像度で完全に無料で提供されます。熱心なニックスのファンでも、単にクラッチ バスケットボールが好きな人でも、これほど視聴するのに最適な時期はありません。
ブランソンの物語はまだ終わっていない。実際、プレーオフが近づいているので、それはまだ始まったばかりなのかもしれない。
例外についての基礎知識備忘録 feat.2年目エンジニア

# はじめに
2年目になって初めて本格的にJavaを用いた開発業務に携わることになったのですが、研修以来Javaの学習はおざなりだったので、例外についての知識が結構抜けていました。
そこで例外処理についての基礎知識を本記事に残しておこうと思った次第です。

# 例外について
## 例外とは何か
Javaにおける「例外（Exception）」とは、プログラム実行中に発生する異常な状態のことです。
例：ゼロ除算、ファイルが存在しない、nullアクセスなど。

Javaでは、エラーが起きた瞬間に「例外オブジェクト」が生成され、throwで投げられ、catchで受け取って処理します。
Javaの例外処理は「問題が起きた時に、どう対応するか」を明示する仕組みです。

## 基本構文
<details open><summary>try-catch-finally の基本構文</summary>

```rb
try {
    // 問題が起きそうなコード
} catch (Exception e) {
    // エラーが発生した場合の処理
} finally {
    // 成功しても失敗しても最後に実行(後処理などに使う)
}
```

## throw と throws
throw：実際に例外を投げる
<details open><summary>throw 例</summary>

```rb
throw new IllegalArgumentException("引数が不正です");
```
<br>
throws：メソッドの定義で「例外が起こるかも」と宣言する
<details open><summary>throws 例</summary>

```rb
public void readFile(String path) throws IOException {
    // ファイルを読み込む処理
}
```

## Checked例外 vs Unchecked例外
Checked例外：コンパイル時にcatchまたはthrowsが必須の例外
例：Checked例外	IOException, SQLException	コンパイル時にcatchまたはthrowsが必須
<details open><summary>Checked例外</summary>

```rb
try {
    FileReader reader = new FileReader("test.txt");
} catch (IOException e) {
    e.printStackTrace();
}
```
<br>

Unchecked例外：実行時のみ発生する例外、catchは任意（設計ミス系）
例：NullPointerException, IllegalArgumentException
<details open><summary>Unchecked例外</summary>

```rb
String str = null;
System.out.println(str.length()); // NullPointerException（catch不要）
```
## 独自例外
プロジェクトによっては「自分専用の例外」を作ることもある。
<details open><summary>独自例外クラス 例</summary>

```rb
public class MyAppException extends Exception {
    public MyAppException(String message) {
        super(message);
    }
}
```

<details open><summary>使い方 例</summary>

```rb
public void validateUser(String name) throws MyAppException {
    if (name == null || name.isEmpty()) {
        throw new MyAppException("ユーザー名が未入力です");
    }
}
```

## 参考リンク
###### Java公式ドキュメント(例外処理)
https://docs.oracle.com/javase/tutorial/essential/exceptions/

#######
gitコマンド

PUSHのためのSSH作成から！！

# SSHキーの作成（メールアドレスはGitHubに登録してるやつ）
ssh-keygen -t edXXXXX -C "アドレス"

# 公開鍵の確認（↓この内容をGitHubにコピペして登録）
cat ~/.ssh/id_edXXXXX.pub


コミットまでの流れ
# 1. 新しいリポジトリに移動
cd /Users/パス

# 2. Git初期化（ローカル）
git init

# 3. すべてのファイルをステージング
git add .

# 4. コミット（メッセージを忘れずに！）
git commit -m "初回コミット"

# 5. リモートリポジトリを登録（間違いのないURLで！）
git remote add origin gitsshURL

# 6. 初回push（mainブランチで）
git push -u origin main
【エラー】ImportError: dlopen(..._mysql.cpython-39-darwin.so, 0x0002):  Library not loaded: /opt/homebrew/opt/mysql/lib/libmysqlclient.24.dylib について

### はじめに
ログが消えてしまい、再度環境構築しようとしたところ大変なことになったので覚えてるところまでかきます。ぬけおちていたらすみません。
以下は自分用の備忘録ですが、同じように `MySQL 8.0.42` `mysqlclient==2.0.3` の組み合わせを使っていて M1 Mac（Apple Silicon）で苦戦している方の参考になれば幸いです。

### MySQLとmysqlclientのバージョン

<table>
  <tbody>
    <tr>
      <td>MySQL</td> <td>8.0.42</td>
    </tr>
    <tr>
      <td>mysqlclient</td> <td>2.0.3</td>
    </tr>
  </tbody>
</table>

※`brew`を使用してインストールしています。

### 発生したエラー

```text
ImportError: dlopen(..._mysql.cpython-39-darwin.so, 0x0002): 
Library not loaded: /opt/homebrew/opt/mysql/lib/libmysqlclient.24.dylib
```

意味としては
**libmysqlclient.24.dylibが存在しないよー**
ってことです。

`mysqlclient==2.0.3`は`MySQL 8.0.24`頃のlibmysqlclient.24.dylib を探しているけれども
今使っている環境にはlibmysqlclient.21.dylibしかない。

この問題の解決方法として以下の2つの方法を考えました。


## 解決方法その1　mysqlclientをアップグレードする
シンプルな方法としてmysqlclient をアップグレードする。
```terminal
pip install --upgrade mysqlclient
```

でも、今回は「環境を汚したくない」ので以下の方法を選択。

## 解決方法その2　mysqlclientをインストールし直す
```bash
# MySQLビルド環境のパスを通す
export PATH="/opt/homebrew/opt/mysql@8.0/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/mysql@8.0/lib"
export CPPFLAGS="-I/opt/homebrew/opt/mysql@8.0/include"
```

```bash
# 仮想環境を削除
rm -rf .venv
```

```bash
# 仮想環境を再構築
pipenv install --dev
```

```bash
# 仮想環境に入る
pipenv shell
```

```bash
# 念のためもう一度 export（仮想環境に入ると上書きされる可能性があるため）
export PATH="/opt/homebrew/opt/mysql@8.0/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/mysql@8.0/lib"
export CPPFLAGS="-I/opt/homebrew/opt/mysql@8.0/include"
```

```bash
# mysqlclientのアンインストール
pip uninstall mysqlclient -y
```

```bash
# setuptoolsのバージョンを下げる これをしないとmysqlclientがインストールできない
pip install "setuptools==60.0.0"
```
```bash
# 2.0.3をインストールする
pip install --no-cache-dir --force-reinstall mysqlclient==2.0.3
```
```bash
# setuptoolsを元のバージョンに戻す
pip install "setuptools==78.1.0"
```

無理矢理ですがこれでrunserverできるようになりました！

### おまけ
毎回 export が面倒な場合は`.zshrc`に以下を追記しておくと便利です！
```bash
echo 'export PATH="/opt/homebrew/opt/mysql@8.0/bin:$PATH"' >> ~/.zshrc
echo 'export LDFLAGS="-L/opt/homebrew/opt/mysql@8.0/lib"' >> ~/.zshrc
echo 'export CPPFLAGS="-I/opt/homebrew/opt/mysql@8.0/include"' >> ~/.zshrc
source ~/.zshrc
```
【Obsidian】URIでノートを開く方法

## 絶対パスでノートを開く

以下のように記述するとノートへの絶対パスを指定して開けます。

```text
obsidian://open?path=ノートへの絶対パス
```

## タイトルを指定して開く

ノートのタイトルを指定して開くには以下のようにします。

```text
obsidian://open?vault=vault名&file=ノートタイトル
```

## openコマンドで開く

```terminal
open "obsidian://open?path=ノートへの絶対パス"
```

```terminal
open obsidian://open?vault=vault名&file=ノートタイトル
```

## 参考

https://help.obsidian.md/Extending+Obsidian/Obsidian+URI
Pythonでkintoneのレコードを一括取得・更新・追加する方法

# Pythonでkintoneのレコードを一括取得・更新・追加する方法

こんにちは、今回は**Pythonを使ってkintoneのデータを操作する方法**をご紹介します！

前回はレコードを取得する方法を解説しましたが、今回はそれに加えて、**レコードの更新と追加もPythonでできる方法**をまとめて紹介します。

---

## 🔧 事前準備

kintoneのデータをPythonから操作するには、以下の情報が必要です。
下記のリンクを参考にしてください！
https://qiita.com/reo_python_spy/items/45da1bb039494952de02



## ✏️ レコードの更新（PUT）

既存レコードのフィールドを変更したいときは、`record.json` に対して `PUT` メソッドを使います。

```python
def update_kintone_record(record_id):
    url = f'{BASE_URL}/k/v1/record.json'
    headers = {
        'X-Cybozu-API-Token': API_TOKEN,
        'Content-Type': 'application/json'
    }
    field_data = {
        "顧客名": {"value": "株式会社アップデート"},
        "電話番号": {"value": "03-0000-0000"}
    }
    update_data = {
        "app": APP_ID,
        "id": record_id,
        "record": field_data
    }
    update_response = requests.put(url, headers=headers, json=update_data)
    return update_response.json()
```

### 使用例：
```python
response = update_kintone_record(1234)
print(response)
```

---

## ➕ レコードの追加（POST）

新しいレコードを追加するには、`record.json` に対して `POST` メソッドを使います。

```python
def add_kintone_record():
    url = f'{BASE_URL}/k/v1/record.json'
    headers = {
        'X-Cybozu-API-Token': API_TOKEN,
        'Content-Type': 'application/json'
    }
    field_data = {
        "顧客名": {"value": "株式会社アップデート"},
        "電話番号": {"value": "03-0000-0000"}
    }
    add_data = {
        "app": APP_ID,
        "record": field_data
    }
    add_response = requests.post(url, headers=headers, json=add_data)
    return add_response.json()
```

### 使用例：
```python
response = add_kintone_record()
print(response)
```

---

## ✅ まとめ
- **レコード更新**：`PUT` メソッドでID指定してフィールドを更新
- **レコード追加**：`POST` メソッドで新規レコードを作成

---

## 📢 最後に
kintoneのAPIはシンプルですが、繰り返し処理やデータ整形を理解することで、業務自動化やバックエンド連携が可能になります！

この内容が「これからkintone + Pythonを使ってみたい」という方の助けになれば嬉しいです 🙌

Qiitaへの「いいね」やコメントも励みになります。ありがとうございました！
トレイトとは「型の哲学」である



> _"型とは形ではなく、振る舞いの構造である。"_  

型を定義するとは、何を定義することか？  
データの形式か？ フィールドの構造か？  

Rustはその問いに対して、明確な立場を取る。  
**「振る舞いを定義してこそ、型は意味を持つ」**と。

Rustにおけるトレイト（trait）は、**構造体に振る舞いを宿すための哲学的道具**である。  
それはJavaのinterfaceや、Haskellのtypeclassに通じるが、**静的型付けと言語全体の設計美学と深く結びついている**。

この章では、Rustのトレイトが**“型を語らせる構造”としてどれほど思想的か**を解き明かす。

---

## 「できること」の定義が、型の存在意義を決める

```rust
trait Drawable {
    fn draw(&self);
}
```

この一行は、「Drawableという型は存在しない」が、**「Drawableである振る舞い」は存在する**ことを示す。

Rustでは、型そのものよりも、**型が何を“できるか”を定義することで構造を浮かび上がらせる**。  
トレイトとは、「この型はこういう振る舞いを持つ」という**“可能性の宣言”**である。

---

## トレイト実装は“振る舞いの接続”である

```rust
struct Circle;

impl Drawable for Circle {
    fn draw(&self) {
        println!("Drawing a circle.");
    }
}
```

この実装によって、`Circle` は `Drawable` の“哲学”に同意し、その振る舞いを獲得する。  
言い換えれば、**トレイトは型と振る舞いの間にある構造的契約**である。

---

## なぜ「継承」ではなく「実装」なのか？

Rustは継承をサポートしない。  
代わりに、**振る舞いを“後付けで合成”することを重視する**。

- 継承：構造を上書きする（階層的）  
- トレイト：振る舞いを合成する（横断的）

この違いは、**設計の硬直性を嫌い、構成可能性を重視するRustの思想の表れ**である。

---

## トレイト境界とジェネリクス：型の意味論的拡張

```rust
fn render<T: Drawable>(item: T) {
    item.draw();
}
```

ここで `T: Drawable` は、「Tという型はDrawableでなければならない」ことを明示している。  
これは、**抽象化において意味論的な制限を与えることで、安全性と明快さを両立する設計**である。

トレイト境界は、ジェネリクスを**構文の“自由”から設計の“制約”へと引き戻す構造**でもある。

---

## 自動導出（derive）は“構造的同意”の短縮記法

```rust
#[derive(Debug, Clone, PartialEq)]
struct Point {
    x: i32,
    y: i32,
}
```

`derive` は、その構造体が特定のトレイトの“契約”に合意していることを意味する。  
これは**設計者の意図が、構文の簡略化を通して表現されている**。

Rustはこのように、**設計の哲学的正しさと実装効率を両立させる構文的態度**を取っている。

---

## トレイトは「ポリモーフィズム」ではなく「定義の粒度」である

オブジェクト指向では、ポリモーフィズム（多態性）はしばしば**柔軟さの代名詞**として語られる。  
しかしRustでは、**トレイトによって“何ができるか”が構文上に明確に現れる**。

つまり、**「この関数はこの型に対してこのことしかできない」**という宣言が、**型定義の“振る舞いの粒度”を制御する**。

---

## デフォルト実装は“共通思想”の抽象化である

```rust
trait Greeter {
    fn greet(&self) {
        println!("Hello.");
    }
}
```

トレイトにデフォルト実装を持たせることは、  
**“この振る舞いが大多数に共通である”という設計哲学の明文化**である。

この仕組みは、コード量の削減だけではなく、**設計構造における“共通原理”の集約**でもある。

---

## トレイトオブジェクトと動的分配：意図された柔軟性

```rust
fn show(g: &dyn Greeter) {
    g.greet();
}
```

`&dyn Trait` によって、トレイトを持つ任意の型を動的に扱うことが可能になる。  
ただしこれは **「全体の設計が許容するときのみ」使える柔軟性**であり、  
**“静的保証された抽象”を越えるときの慎重な設計的選択**である。

---

## 結語：型とは形ではなく、可能性の構造である

Rustのトレイトは、**“この型に何ができるか”を設計者に宣言させる構造的契約**である。  
それは抽象のための手段であると同時に、**設計の明示化、責務の分離、安全性の構造化**でもある。

トレイトが語るのは、型の哲学である。  
そしてRustは、**型を“データの形”から“意味と振る舞いの構造”へと進化させた**。

> _"トレイトとは、型に思想を与えるための言語である。"_
Matchの思想：分岐ではなく定義である



> _"すべての分岐は、予測可能でなければならない。"_  

プログラミングにおける「分岐」は、最も古く、最も脆弱な構造のひとつである。  
多くのバグは、「条件が抜けていた」「意図しない状態が混入していた」という分岐の曖昧さから生まれる。

Rustの `match` は、この分岐を根底から再定義する。  
それは「分岐のための構文」ではなく、**「状態を列挙し、必ず処理するための構造」**である。

この章では、Rustの `match` に込められた**構文的強制と設計哲学**を深掘りする。

---

## `match` は「条件分岐」ではない、「網羅宣言」である

```rust
match status {
    Status::Ok => println!("All good."),
    Status::Error => println!("Something went wrong."),
}
```

この構文は、単に `if-else` を置き換えたものではない。  
Rustコンパイラは、`Status` に定義されているすべてのバリアントが `match` されているかを**静的にチェック**する。

未処理のパターンがある場合、**コンパイルエラーになる**。

```rust
// 仮にStatusにWarningが追加された場合、上記コードはコンパイルできなくなる
```

これは、分岐の自由ではなく、**すべての可能性を“設計段階で定義しなければならない”という構文的強制**である。

---

## 曖昧な分岐を“書けないようにする”という設計

Rustは、以下のような“ついうっかり”のロジックを許さない：

```javascript
// JavaScriptの例（意図しないdefault漏れ）
switch (status) {
  case "OK":
    // ...
    break;
  // あれ？ WARNINGの処理書いてなかった…
}
```

Rustではこのような設計の抜け漏れが**発生し得ない**。

すべてのケースが**記述されるか、明示的に`_ =>`で握りつぶされる**。

```rust
match status {
    Status::Ok => println!("OK"),
    Status::Warning => println!("Warning"),
    Status::Error => println!("Error"),
}
```

あるいは明確に意図を示す：

```rust
_ => println!("Unknown"),
```

この違いが、**曖昧なプログラミングと、構造的設計との分水嶺**である。

---

## `match` はデータを“破壊的に展開する”安全な構文

```rust
enum Command {
    Add(i32, i32),
    Subtract(i32, i32),
    Quit,
}

fn execute(cmd: Command) {
    match cmd {
        Command::Add(a, b) => println!("Sum: {}", a + b),
        Command::Subtract(a, b) => println!("Diff: {}", a - b),
        Command::Quit => println!("Goodbye."),
    }
}
```

ここで注目すべきは、`match` が単に分岐しているのではなく、**構造の中の値を安全に“展開”して扱っている**点である。  
**構造体の分解と条件分岐を同時に行い、その整合性がコンパイル時に検証される。**

---

## 条件を書くのではなく、「状態を定義する」構文

従来の `if-else` 構文では、「どの条件が成立するか」を書く。  
だがRustの `match` は、「状態がこうであるなら、こう処理する」という**論理分岐ではなく状態定義**なのだ。

> _「設計者が認識しているすべての世界」を、matchは明示させる。_

これは構文でありながら、**設計者の世界モデルの写像**である。

---

## if let と match：部分一致と全網羅の思想的違い

Rustには `if let` という構文もある。

```rust
if let Some(value) = maybe {
    println!("Value: {}", value);
}
```

これは「特定の分岐だけ扱いたい」というシンプルなケースで便利だが、  
**「他のケースを無視する」ことを意図的に表現する構文**でもある。

対して `match` は、**すべての可能性と向き合う覚悟の構文**である。

---

## match式は“値を返す式”であり、副作用に頼らない

Rustの `match` は式であり、値を返すことができる：

```rust
let result = match operation {
    Op::Add => a + b,
    Op::Sub => a - b,
    Op::Mul => a * b,
};
```

これは、**副作用として処理するのではなく、構造から値を得るという純粋性**を表している。

構造が変わるたびに、出力される値が決まる。  
それは、**条件分岐ではなく“状態と値の写像関係”の宣言**である。

---

## 結語：分岐の構文を設計の構造に変換したRustのmatch

Rustの `match` は、「どれかに当たればよい」という発想を否定する。  
それは、「すべてに対処しなければならない」という**設計倫理を言語構文として強制する仕組み**である。

そしてそのことが、コードの明快さ、将来の変更への強さ、エラー耐性の高さを生む。

> _"分岐を書くな、状態を定義せよ。それがmatchの本質である。"_