OmniAICreator/Qiita-1.07M huggingface dataset:
LaravelのEloquentについて概要を理解する

# 背景 🖼️
業務でバックエンドの実装をすることが増えてきました。
復習のために今回はLaravelのEloquentについてまとめます。

https://books.mdn.co.jp/books/3221303041/

こちらの本で今は勉強しています。

# Eloquentとは 🐳

LaravelのORM(オブジェクトリレーショナルマッピング)です。
データベースとコードを紐付けます。
データベース接続を隠蔽し、脆弱性に対応でき、必要なデータのCRUD（Create:登録、Read:参照、Update:更新、Delete:削除）ができます。

```php:LaravelのEloquentを使用しないコード
<?php
// データベース接続情報
$host = 'localhost';
$db   = 'example_db'; // データベース名
$user = 'username';   // ユーザー名
$pass = 'password';   // パスワード
$charset = 'utf8mb4';

// PDOでデータベースに接続
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
    throw new PDOException($e->getMessage(), (int)$e->getCode());
}

// booksテーブルから全ての本を取得
$sql = "SELECT name FROM books";
$stmt = $pdo->query($sql);

// 各本の名前を表示
while ($row = $stmt->fetch()) {
    echo $row['name'] . "<br>";
}
?>

```

```php:LaravelのEloquentを使用したコード
<?php

use App\Models\Books;

$books = Book:all();
foreach($books as $book) {
    echo $book->name;
}
```

Laravelを使用したするコードでコード量が大幅に減ります。
また、セキュリティも強化されます。

素のPHPでの記述だと以下のようにすることができ、[SQLインジェクション](https://www.ipa.go.jp/security/vuln/websecurity/sql.html)のリスクがあります（実際は[プリペアドステートメント](https://www.ipa.go.jp/security/vuln/websecurity/sql.html#:~:text=1%2D(i)%2Da%20SQL%E6%96%87%E3%81%AE%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%81%AF%E5%85%A8%E3%81%A6%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%80%82)で対応できます）。

```php
// ユーザー入力を直接SQLに組み込む（危険）
$userInput = $_GET['book_name'];
$sql = "SELECT * FROM books WHERE name = '$userInput'";
```

## Eloquentモデルクラス 🐘
MVCで言う所のM(Model)に当たります。

Eloquentモデルクラスはデータベースのテーブルと紐づきます。
デフォルトではクラス名のsnakeケースかつ複数形の名前のtableに紐付きます。
```php

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    // デフォルトでは 'books' テーブルと紐づく
}
```

# 最後に
概要レベルですが要点は掴めたと思っています。
次回は以下について書こうと思います。

- リレーション（hasOne、hasMany、belongsTo）
- Eloquentとクエリビルだの違い

# 参考 ✨

https://books.mdn.co.jp/books/3221303041/

https://laravel.com/docs/11.x/readme

https://qiita.com/shiiotaka/items/b82c3be16c795cfd47e4

https://blog.cloudsmith.co.jp/2021/06/481/#toc5
KSMでセキュアにしたパラメーターストアをタスクの環境変数に指定できない

## 背景

ECSのタスクにDBの情報を環境変数として設定しようとした。
その際、情報はSSMのパラメーターストアに保存。
（DBのパスワードはKMSで暗号化し、他は暗号化せずに保存)

しかし、そのパスワードだけ取り込む際にエラー。

インフラのデプロイ方法はCDKで書いて、`cdk synth` でcfnテンプレートファイルを出力しcfnのgitsyncでgithubと同期している。

## エラー内容
cloudformationのイベントの状況理由に書かれていたエラー内容
```text
Failed to create changeset. Couldn't call cloudformation for stack: app-stack and changeset: cloudformation-auto-sync because of a validation error. 
The error was Parameters [/app/POSTGRES_PASSWORD] referenced by template have types not supported by CloudFormation.
 (Service: AmazonCloudFormation; Status Code: 400; Error Code: ValidationError; Request ID: ; Proxy: null)
```

指定した SSM パラメータが CloudFormation テンプレートでサポートされていない型を持っている場合に発生する。

## 行ったこと

ECSのタスク実行ロールにKMSの権限を付与してみた。

しかしうまく行かない。
↓
次にコードを変えてみた。

```ts
    secrets: {
      POSTGRES_PASSWORD: ecs.Secret.fromSsmParameter(
          ssm.StringParameter.fromStringParameterName(
            this,
            "DBPasssword",
            "/itrender/POSTGRES_PASSWORD"
          )
        ),
        }
```

上記のようにはじめは書いていたが、`fromStringParameterName` はKMSで暗号化していないものだけらしい。

`valueForSecureStringParameter` がKMSで暗号化しているパラメーターを取得できるらしいが現在非推奨。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ssm.StringParameter.html

代わりに`SecretValue.ssmSecure()`を使える、と書いてるがどのようにしても`fromSsmParameter`の引数の型と`SecretValue.ssmSecure()`の返り値の型が合わない。
↓
記事を発見。

https://github.com/aws/aws-cdk/issues/9793

皆もうまく行っていない。

さらに`SecretValue.ssmSecure()`は少数のリソースでしかサポートされていないとか、、、

クローズされているが未解決らしい。

## 回避策

DB情報はsecret managerを使う。
そこからパスワードなりdbnameなりusernameなりを参照するのが吉。

(CDKで書くとタスク実行ロールにsecret managerから取得するロールとかは自動で追加されるので楽〜)
Flutter > flutter clean > flutter pub get で解決できない、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/11a04a31-015c-6077-9248-fb5c25bfabf9.png)

# はじめに
前回の [Flutterサンプル](https://qiita.com/magic10r/items/b89dfc2c45eb5b71241b) に続き、Flutter の2歩目を進むため、"ちょっとした"サイズのアプリを作ってます。
今回は、他のパッケージも利用するため、パッケージをインストールしてから `import xxx` するのですが、初心者らしくインポートエラーから抜け出せなくなって悔しかったのでメモします。

# 開発環境
- OS : Windows 11 Pro
- Flutter : 3.24.3
- Dart : 3.5.3
- Cursor(IDE) : 0.42.3
- Android Studio : Koala Feature Drop | 2024.1.2

# 問題
`> flutter clean` `> flutter pub get` を実行しても、インポートエラーが解決しない

# 手順
- `flutter_dotenv` パッケージを利用するため、`> flutter pub add flutter_dotenv` コマンドでインポート
- `flutter_dotenv` が読み込む .env ファイルを作成
- pubspec.yaml ファイル に .env ファイルを assets として登録
- `flutter_dotenv` パッケージを利用する main.dart ファイルに インポートを記載
    - `import 'package:XXX/flutter_dotenv.dart';`
- IDE の Dart から「darturi_does_not_exist」のメッセージで、インポートエラー（波線）
    - `import 'package:XXX/flutter_dotenv.dart';`
- インポートエラーは、先人たちの教えから `> flutter clean` `> flutter pub get` を実行
    - 変わらず、インポートエラー
    - ・・・（何回も繰り返し）
- IDE の再起動
    - 変わらず、インポートエラー
- OS の再起動
    - 変わらず、インポートエラー
- また、戻って `> flutter clean` `> flutter pub get` を実行
    - 変わらず、インポートエラー
    - ・・・（何回も繰り返し）

# 解決
`await dotenv.load(fileName: '.env');` と、`flutter_dotenv` **パッケージを利用するコード書いたら解決**
コードで利用してあれば、IDE(Dart) もわかってくれるみたいです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/a0f4af3a-210b-8ab6-27a5-030a100d9bed.png)

# おわりに
- コードの切りが悪い時にエラーを気にし過ぎてはダメですね
- こんな事にハマってイライラした自分が情けないし、悔しいし、、、
import時にモジュール名やクラス名でのアンダースコアを合計2つ使用することに関する注意点

## 概要

```py
from my_projec_t.utils import function
```
のようなアンダーバーを2つ使った名前のフォルダ(親ディレクトリ)からインポートしようとするとエラーが発生したのでメモにまとめました。

---

## 問題の原因

Pythonでは、モジュール名やクラス名を定義する際にアンダースコア（`_`）を使用することがありますが、特にアンダースコアを2つ使用することには注意が必要です。以下にその理由をまとめます。

1. **名前マングリングの影響**
アンダースコアを2つ使用する名前は、Pythonの名前マングリングの対象となります。この機能は、クラス内部で定義されたメソッドや属性名に特別な処理を施し、外部からアクセスできなくするものです。例えば、`__my_variable`という名前は、実際には`_ClassName__my_variable`として扱われるため、外部からのアクセスが難しくなります。
2. **特殊なシステムレベルの解釈**
アンダースコア2つで始まり、かつ2つで終わる名前（例：`__name__`）は、Pythonの特別なシステム変数やメソッドを示すために予約されています。これらの名前は、Python内部で特別な処理を受けるため、開発者が独自に定義することは推奨されません。
3. **モジュールのインポートエラー**
アンダースコアを2つ使用すると、名前解決の際に意図したモジュールやクラスが正しくインポートできないことがあります。これにより、ModuleNotFoundErrorなどのエラーが発生し、プログラムの実行に支障をきたす可能性があります。

## 推奨事項
モジュール名やクラス名では、アンダースコアを1つだけ使用するか、アンダースコアを使わずに意味のある名前を付けることを推奨します。

- 成功例: `my_project`（アンダースコア1つ）
- 失敗例: `my__project`（アンダースコア2つ）

このルールを守ることで、Pythonの名前解決の問題や不具合を避けることができます。適切な命名規則を用いることは、コードの可読性や保守性を高める上でも重要です。


### 補足

その他のパターンとしては

```py
#エラーなし
from my_project.utils import function

#エラーなし
from myproject.u_til_s import function
```

だったので、最初のフォルダ名の部分のみ、アンダーバーを合計2つ使わないことを意識すれば良いと思われました。
木dpについて【競技プログラミング】

# はじめに
- また、新しいdpに出会ってしまいました。ちなみに、出会い系サイトは[こちら](https://atcoder.jp/contests/dp/tasks)になります。
- 今回は、木dpです。木とは何か？については、[過去の投稿](https://qiita.com/kei_tnk/items/82582c67d4c82bf700d8)で説明しています。

# 木dpの考え方について
- 木において1つの頂点を根として設定することがある。このとき、根以外の頂点は、根に向かう経路をただ1本持つ。このとき、その頂点を「子」と考えると、根に向かう経路上に隣接する頂点を「親」と呼ぶ。
- ある頂点iから、頂点iの親に向かう辺を削除し、頂点iを根とする木を考えると、その木は頂点iを根とする部分木と呼べる。
- ここまで書けば、想像つくと思うけど、頂点iを根と見なした部分木における解をdp[i][何かの状態]として、元々の根が頂点0の時、最終的にdp[0][･･･]が解となる。
- このような考え方だから、木dpは[メモ化再帰](https://qiita.com/kei_tnk/items/163880eb2dff19222315)で解くのが定番っぽいね。

# 問題例
- サイトで出会った木dpは[これ](https://atcoder.jp/contests/dp/tasks/dp_p)です。
- 問題の内容はシンプルです。
    - 各頂点を「白」または「黒」に塗ることが出来ます。
    - 隣り合う頂点同士を「黒」に塗ることは出来ません。
    - 頂点を塗るパターンはいくつあるか。(mod 1000000007)
- 今回も生成AIに教えを請うことにしました。標準入力部分はうまく伝えられなかったから、自作しました。
- メモ化dp配列[node][0/1]は、頂点nodeを根とした部分木について、頂点nodeを白(0)または黒(1)に塗ったときの塗るパターン数です。
- 再帰関数dfs(node,parent)は、頂点nodeを根と見なす部分木における解をdp[node][0]とdp[node][1]に書き込む関数です。また、parentはnodeから見た親の頂点です。
- 初期値として、dpの全ての値を1としておきます。
```swift
// import Foundation -- 不要なのでコメントアウト

/// 標準入力対応は自作
let n = Int(readLine()!)!
var edges:[(Int,Int)] = []
for _ in 0..<n-1 {
    let ab = [readLine()!.split(separator:" ").map{Int($0)!}].map{($0[0],$0[1])}[0]
    edges.append(ab)
}

let MOD = 1000000007

func solveTreeDP(_ n: Int, _ edges: [(Int, Int)]) -> Int {
    var graph = [[Int]](repeating: [], count: n)
    for (u, v) in edges {
        graph[u - 1].append(v - 1)
        graph[v - 1].append(u - 1)
    }

    var dp = [[Int]](repeating: [1, 1], count: n)

    func dfs(_ node: Int, _ parent: Int) {
        for neighbor in graph[node] {
            if neighbor == parent {
                continue
            }
            dfs(neighbor, node)
            dp[node][0] = (dp[node][0] * (dp[neighbor][0] + dp[neighbor][1])) % MOD
            dp[node][1] = (dp[node][1] * dp[neighbor][0]) % MOD
        }
    }

    dfs(0, -1)
    return (dp[0][0] + dp[0][1]) % MOD
}

// let n = 5 // 頂点数の例 -- 生成AIの作った入力例
// let edges = [(1, 2), (1, 3), (3, 4), (3, 5)] // 辺の例 -- 生成AIの作った入力例

print(solveTreeDP(n, edges))
```
- 再帰呼び出し後のメモ化配列の計算は2種類あります。
    - dp[node][0] = (dp[node][0] * (dp[neighbor][0] + dp[neighbor][1]))
        - 頂点nodeの色が白いときは、子neighborの色は白と黒の両方が可能です。
    - dp[node][1] = (dp[node][1] * dp[neighbor][0])
        - 頂点nodeの色が黒いときは、子neighborの色は白のみです。
- dfsの大元の呼び出しは、根(node:0)に対するものですが、根に親はないので、親を-1(頂点番号に存在しないインデックス)としています。
- 解答は、根の色が黒い場合と白い場合の合計となっています。
- これで提出すると、150ms程度でACでした。

# さいごに
- [前回の投稿](https://qiita.com/kei_tnk/items/0179562c6e272c999b90)に続いて、生成AIを頼ってしまいました。生成AIは解答だけでなく簡単な解説までしてくれてます。
- 全くの初心者だと、簡単な解説だけじゃ意味不明だろうけど、今回で言えば、グラフ理論における木やdpの初歩を知っていれば、生成AIの解説がなくても、コードだけ見れば何がやりたいか分かる。
- これまでは、初めての解法に出会ったとき、誰かの書いた分かりやすい解法を探すのが大変だったけど、これからは生成AIに解き方を教えて貰えばいいのかな？
- 生成AIが最初に大打撃を与える職業は学校の先生な気がしてきた。
マルチコアCPU

## はじめに
1日1項目1時間学ぼうの会
今回学んだ内容は**マルチコアCPU**についてです。

## マルチコアCPUとは
複数の処理コア（コア）を1つのプロセッサ（CPU）内に持つCPUのことです。従来のシングルコアCPUと比べて、マルチコアCPUは複数の作業を並列処理できるため、処理能力が向上します。

## コア（Core）とは
コアは、CPU内で実際に計算を行うユニットです。
各コアは独立してプログラムの指令を実行できるため、複数のコアがあれば複数の処理を同時に実行できます。

## マルチコアCPUの特徴
コアごとに独立した命令を同時に処理でき、並列処理が可能。
「クアッドコア（４コア）」「ヘキサコア（６コア）」「オクタコア（８コア）」
このコアを多く備えていれば備えているほど同時並行で行える処理作業の数が増える。
コアが複数あることで同時により可能となる。
日常生活で例えると料理しながら洗濯をして掃除ができるような感じ。

## メリット
並列処理が可能：
複数のアプリやタスクを同時に実行する際に効果を発揮します（例：ゲームしながら動画配信）。

パフォーマンス向上：
ソフトウェアがマルチスレッドに対応していれば、複数のコアを使って高速に処理を終えられます。

応答性の向上：
WebブラウザやOSのバックグラウンドタスクが並列処理され、ユーザー操作がスムーズに。

## デメリット

単一の処理速度は向上しない：
すべてのソフトウェアがマルチコアに最適化されているわけではなく、1つのコアしか使用しないケースもあります。

電力消費の増加：
コアが増えると、同時に消費電力も上がるため、冷却が重要になります。

## 代表的な用途

### ゲームとグラフィック処理：

Dゲームの描画では、物理演算や光の反射などを同時に処理する必要があり、マルチコアCPUでこれらの処理を並列実行することでリアルタイム描画を実現できる。

### AI・機械学習

AIモデルのトレーニングでは、大量のデータを処理する必要があり、CPUの複数コアを使って並列処理を行います。
ディープラーニングでは、各コアが別々のデータバッチをトレーニングすることで全体の学習時間を短縮できます。

### 自動運転車・IoT

自動運転では車両のセンサーが取得した膨大なデータ（カメラ映像、LiDAR、GPSなど）を同時に処理し、リアルタイムでの運転判断を行います。
IoTデバイではスマート家電やウェアラブル端末で、マルチコアCPUが効率よくデータを処理し、応答時間を最小化します。

## まとめ
昨日学んだクロック周波数と共にマルチコアCPUもCPUの性能に大きく影響を与えます。
シングルスレッドのアプリケーションではクロック周波数が高いほど処理速度が向上するが、動画編集やゲームなどのマルチスレッドアプリケーションではコアの数が多いほど効率的に処理できる。
クロック周波数とマルチコアは、それぞれ異なる用途で重要な役割を果たしますことがわかった。

## 参考
https://www.aps-web.jp/academy/amp/8214/

https://shop.applied-net.co.jp/blog/app_news/15288/

https://miraiyotch.com/cpu-multi-core/
高校中退ニートがセキュリティコンサルになるまで

# 高校中退ニートがセキュリティコンサルになるまで

## 高校中退、そしてニート卒業

とある事情により高校を中退したのですが、その後バイトはしていたものの、特に将来したいこともなく淡々と日常を送ってました。
これだ！と思える目標もないまま、何もしていないのはそろそろ不味いなと思い、正社員雇用で病院の介護士となりました。

数年かけてニート卒業です。

## 夜の病院生活

病院での仕事は３交代制の月10回夜勤で、ほぼ夜勤専属みたいな形で働いていました。
意外と夜の病院って慣れてしまうと怖くないのに驚きました。
唯一怖かったのは、足の骨が折れてるはずなのに、廊下を歩いてたおばあちゃんです。この時ばかりは冷や汗をかきました。

ある程度経った頃、仕事で新たに覚えることも無くなりもっと向上心を持って成長していける環境に移りたいと思うになりました。

そんな時、友人に「ITは稼げる」という話をされ、かっこいいー！と思ったのでとりあえずITパスポートを１ヶ月で取りました。
取り終えたあと御局様から理不尽なあれこれをされ辞めることを決意。
ITパスポートを持ってIT業界に転職しました。
不正入国はしてないので安心してください。

## 底辺SES時代
IT業界に転職出来たとはいえ、未経験だったので現実は甘くありませんでした。
転職したのは、年収250万円で、同期の半分がコールセンターに行くようなSESでした。

案件は完全にガチャで、私はたまたまインフラの運用保守案件に入れたので運が良かったです。
ここでセキュリティをかじりつつ、上司に素敵な指導を受け、成長させていただきました。

1年ほど働きつつ、IPA資格の応用情報以下全てを取得しました。(基本情報、セキュマネ等)
学習を進める中でセキュリティをしっかりとやりたくなったので、応用情報とセキュリティの業務経験1年を武器にちょっと規模の大きいSESに転職しました。

## ちょっと規模の大きいSES時代
ここでは念願のセキュリティ案件に配属され、周りにCISSPがちらほらいる環境に行くことが出来ました。
実務でもセキュリティを学びつつ、約1年でCompTIA Security+、CISSP、CompTIA CASP+、CISA、CISMに合格しました。

資格を取得していく中で「セキュリティコンサルになりたい」と思うようになりました。
ここでは転職することは考えておらず、セキュリティコンサルに近い案件を得る為に何をすべきかを考え、そのためには資格取得が最短だと考えました。
というのも、コンサルになるためには業務経験と知識(=資格)の両方が必要となりますが、業務経験に関しては焦ったところで何も変わらないので、業務外でできる資格取得に注力するしかないと考えたからです。
セキュリティの基礎的な資格をメインに取得することを決め、体系的なセキュリティ知識を会得することを意識し個人学習を進めていきました。

### 転職の転機
知人からLinkedInというアプリがセキュリティ業界の情報収集に役立つというのを聞き、インストールしてみました。
転職しようと思ってはいなかったのですが、突然BIG4の人事の方からカジュアル面談のお誘いがあり、もともとセキュリティコンサルに興味があったため試しにお話を聞いてみることになりました。
その流れでいつの間にか採用面接を受けていて、なんと最終面接まで突破してしまいました。
最終面接まで進む中で自分のキャリアややりたいことを見つめ直す時間を持つようになり、より高いプロフェッショナル意識を持ってセキュリティ課題に対峙できるコンサルタントになりたいという気持ちが大きくなっていきました。

だがしかし人生そんなに甘くありません。
最終面接で役員OKが出て内定オファーを出しますと言われた後に、やはり学歴と職歴がダメと人事ブロックを受け、不採用という結果になってしまいました。

かなり落ち込みましたが、彼女が出来たので転職を続けてみることにしました。

### 転職活動は甘くない
BIG4がダメなら日本の企業を応募すればいいよねと思い有名なエージェント経由で事業会社やセキュリティに強いSIer等に応募しました。
BIG4の最終面接で役員OKが出たにも関わらず、全て書類で落ちました。
正直調子に乗っていたので、日本では、学歴や職歴がまともでないと転職は難しいのだなと知り落ち込みました。

### 日本企業がダメなら
ある日のこと、XでGAFAMのポジション募集のツイートが流れてきました。
セキュリティのポジションで積極採用しているとのことだったのでダメ元で応募してみることにしました。
書類を出したら何故か通り、一次面接も通り、日系企業は学歴職歴で書類落ちになってしまうけど、外資企業は気にしないのねと浮かれてたら二次面接で普通に落ちました。

### そしてセキュリティコンサルに

ある日のこと（2度目）、LinkedInにてとあるセキュリティコンサルの求人を見つけました。
詳細を拝見したところ、CISSP、CISAが歓迎要件、セキュリティ大好きなことが必須要件ではありませんか。
これは私を求めてるに違いないと確信し、応募。
計7人と面接をし、如何にセキュリティが大好きで頑張れるかを熱弁することで最終的に内定をいただくことが出来ました。

晴れて11月よりセキュリティコンサルになります。
やったね。

# さいごに

まず長い転職活動を通して感じたことは、未経験からでもセキュリティコンサルになれるということです。
セキュリティ業界は人手不足かつ、これから発展していく業界です。
そのためセキュリティの実務経験と資格、コンサルとして最低限のコミュニケーション能力を身につければ誰でもなれると感じました。

また、これから転職活動をされるみなさんに伝えたいことは諦めないで自分を信じて進んで欲しいということです。
難しいことにチャレンジしようとする時、必ずと言っていいほど否定してくる人が現れます。
私は、お前にはCISSPは取れないから勉強をやめろであったり、コンサルになるには10年以上はかかる等、様々な否定の言葉を言われました。

いま同じようになるのが難しいと言われている職種に挑戦しようとしている方も、今後同じようなことを言われると思います。
しかし、否定的なことを言う人のことは無視していいです。諦めなければ必ず実現できるので安心してください。

高校中退していてもセキュリティコンサルになれたので、きっと皆さんならもっと容易になれると思います。

この記事が誰かの励みになれば幸いです。
Minecraft統合版での衝撃吸収を貫通するダメージについて

## 問題
Minecraft統合版にて、プレイヤーの衝撃吸収をそのままに体力だけ減らすと
クライアントの体力表示にズレが生じる
(サーバーでは体力のみ減少するが、クライアントでは衝撃吸収が減っているように見える)

## 結論

普通に体力を減らしてクライアントに送信するだけだとうまくいかない。
なのでダメージ処理、つまり体力の増減処理をする前にクライアント側の**衝撃吸収を0にした後**、処理を実行します
```plantuml
participant Client
participant Listener
entity Entity

title 衝撃吸収貫通ダメージを与える場合\n(体力: 20 衝撃吸収: 10)
Entity --> Listener: ダメージイベント
Listener -> Client: UpdateAttributesPacket\n(体力: 20 衝撃吸収: 0)
Entity -> Entity: ダメージ処理\n体力に 5 ダメージ
Entity -> Client: UpdateAttributesPacket\n(体力: 15 衝撃吸収: 10)
```

## 原因
**クライアントのせいだった。**
なぜかクライアント側で勝手にダメージ計算されて衝撃吸収に肩代わりされているみたい

## あとがき
初めてのQiita記事でしたがいろんなMarkdown書式があって書いていて楽しかったです(シーケンス図とか)
少し短めでしたが誰かの助けになれば幸いです
私はこの問題のせいで6時間をドブに捨てました
ECRでリポジトリを更新する方法

## はじめに
ECR（Amazon Elastic Container Registry）にコンテナイメージをプッシュした後、イメージを更新する際には、リポジトリの更新に特別な手順が必要なのか、それとも同じリポジトリ名でそのままpushすれば良いのか迷うことがありました。この記事では、実際に試して確認した結果を記録します。

## 結論
同じリポジトリに、同じ名前でpushするだけで問題ありませんでした。通常、ECRにコンテナイメージをpushする際には、次のようなコマンドを使用します。このコマンドを再度実行するだけで、イメージを上書きすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984024/a6c59ad1-a48f-8dad-a36e-915750cdc5ea.png)

タグを変えることでイメージを識別しやすくなります。しかし、latestタグを使い続けても問題ありません。リポジトリにはイメージの履歴が残り、常に最新のイメージがlatestとして更新されます。

![スクリーンショット 2024-10-23 21.46.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984024/4ce1c876-ff9a-705f-2d5b-732f5f374634.png)
Supabaseのorganizationとproject作成方法

ここでは、Organization、projectの作成方法を手順化します。
前提条件: 
* Supabaseのアカウントが作成されていること
* Organization、projectが作成されていない状態であること
 
### organizationの作成について
##### ① Dashboard画面を表示し<font color="red">New organization </font>をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/8889bb5e-d64a-257c-e405-5c4912ddee31.png)
※ organizationが作成されていない状態でNew projectをクリックしても同じものが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/aa941643-245c-e303-2048-a9d279f45530.png)

##### ② organization作成画面が表示されるので、各項目を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/2bb1bc0e-086e-64f0-0a4e-45e025aa1fbe.png)

Name: 個人使用(勉強用)であれば、任意で設定する
Type of organization: 個人使用(勉強用)であれば、Personalを設定する
Plan: 個人使用(勉強用)であればFreeをで充分だと思うのでこちらを設定する

全て設定後に<font color="red">Create organization </font>をクリックする
（Nameが未入力の場合、エラーが表示されるので入力漏れがないようにする）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/28cfdb18-3141-390f-7c3a-90b8bd6d3e70.png)

##### ③ project作成画面が表示されるが、organizationの作成を確認するためCancelをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/d69518ec-351b-d9f0-7bd1-7fdc76670892.png)

作成したorganizationが表示されていれば、正常に作成できている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/bbde042c-fcf0-f3f2-099d-6ee438442356.png)

### projectの作成について
##### ① organizationを作成した状態で、Dashboardを表示する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/4231eb94-65bb-77af-53d9-3b7a1c84640c.png)

##### ② project作成画面を表示する
方法は以下の二通り、どちらも同じproject作成画面が表示される

・パターンA
1. 画面左上のNew projectをクリック
2. クリック後に表示される、ドロップダウンメニューからprojectを作成したいorganizationを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/4912f5c8-0cb0-0d9e-c562-f72493122b2a.png)

・パターンB
projectを作成したいorganizationのNew Projectをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/fc9e18a9-e50b-2840-d126-316bfb56b197.png)

次の画面が表示されることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/0694075a-3489-75f0-896d-ceab9c9abb5d.png)

##### ③ 各項目を設定し、<font color="red">Create new project </font> をクリックする

**入力項目の説明**
* Project name : 作成するプロジェクトの名前を指定します。任意で設定してください
* Database Password : データベースにアクセスするためのパスワードを設定する部分です。ここに入力されたパスワードを使用して、Postgresデータベースにアクセスできます
* Region : データベースがホストされる地域を選択します。地域は、ユーザーがアクセスする場所に近いものを選ぶことでパフォーマンスの向上が期待できるようです

入力例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/18aca868-e6d3-b8f4-0d40-1fcdac7cb438.png)

画面遷移があり、しばらく待つと次のような画面表示になればprojectが正常に作成できている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/cb9c9f70-950b-3c63-5abf-015e092bc3a6.png)

以上で、organizationとproject作成は完了です。
Gitをコマンドをメモする

# 概要
勉強のためにGitをインストールしたけど
使ってないとすぐコマンドを忘れそうなのでメモすることにした。

# ユーザ名・メールアドレスの設定

Gitをインストールした後にすぐユーザ名・メールアドレスを設定。

ユーザ名の設定
```gitコマンド
git config --global user.name <ユーザ名>
```

ユーザ名の確認
```gitコマンド
git config --global user.name
```

メールアドレスの設定
```gitコマンド
git config --global user.email <メールアドレス>
```


メールアドレスの確認
```
git config --global user.email
```

# リポジトリの初期化
下記のコマンドを実行することにより
リポジトリの初期化を行い、隠しディレクトリで「.git」が作成される。
```
git init
```

ステータスの確認
下記のコマンドでファイルの変更状況やステージングエリアの状態を確認できる。
```
git status
```


# ワーキングツリーからインデックス(ステージ・エリア)に追加
Gitは変更したソースをコミットする前
ワーキングツリーからインデックスに追加する必要がある。
その時に使用するコマンドが「git add」になる。
「単品ファイル」「複数ファイル」「ディレクトリ全体」等それぞれコマンドで指定できる。

単品ファイル
```
git add <ファイル名>
```

複数ファイル
```
git add <1ファイル名> <2ファイル名>
```

ディレクトリ全体
```
git add .
```


# コミット
コミットする場合は下記のコマンドを実行する。
「-m」オプションを指定してコメントを記載できる。
コミットした際はハッシュ値(コミットID)が付与される。
```
git commit -m <コメント>
```

コミットの履歴を確認したい場合は下記のコマンドを実行

```
git log
```


# ブランチ操作

ブランチの作成
```
git checkout -b <作成するブランチ名>
```

ブランチの切り替え
```
git checkout <切り替えるブランチ名>
```

ブランチのマージ
```
git merge <マージ元のブランチ名> 
```
ndnSIMをインストールするスクリプト

```
#!/bin/bash
#ndnSIM & ns-3 インストール方法 Ubuntu Linux 20.04
# Update and install dependencies
sudo apt update
sudo apt install build-essential libsqlite3-dev libboost-all-dev libssl-dev git python3-setuptools castxml git

sudo apt install gir1.2-goocanvas-2.0 gir1.2-gtk-3.0 libgirepository1.0-dev python3-dev python3-gi python3-gi-cairo python3-pip python3-pygraphviz python3-pygccxml 
sudo pip3 install kiwi
# Clone ndnSIM and NS-3
mkdir ndnSIM
cd ndnSIM
git clone https://github.com/named-data-ndnSIM/ns-3-dev.git ns-3
git clone https://github.com/named-data-ndnSIM/pybindgen.git pybindgen
git clone --recursive https://github.com/named-data-ndnSIM/ndnSIM.git ns-3/src/ndnSIM


# Build NS-3 and ndnSIM
cd $HOME/ndnSIM/ns-3
./waf configure --enable-examples --enable-tests
./waf

```
A === !null と A !== null は全然違う

## はじめに
Typescript のバージョンアップをしたら、A === !null にエラーが出ていました。
軽い気持ちで、フンフンとなおしてリリースしました。
その後に、バグ報告が！
自分じゃないところかなと思っていたら、まさかの私の箇所。
反省の意味も込めて、記事書きます。

## 結論
A === !null と A !== null は全然違う
メロンとメロンパンぐらい違う。
蟹とかにパンぐらい違う。
理髪店と理容室くらい違う。
とにかく違う。

## A === !null とは
!null は JavaScript の論理否定演算子（!）を使った表現で、null を否定した結果が true になります。

null は falsy な値であり、!null は true になります。
つまり、A === !null は A === true と同じ意味になります。
これは、「A が true と等しいか」をチェックしています。

## A !== null とは
A !== null は「A が null ではない」ことを確認するための条件です。つまり、この式は A が null 以外のどんな値でも true になります。

## 違い
A === !null は、「A が true と等しいかどうか」を確認しています。
A !== null は、「A が null ではないかどうか」を確認しています。

## 実際のコード
```
let A = true;

console.log(A === !null);  // true  -> Aは true なので、A === true と等しい
console.log(A !== null);   // true  -> A が null ではないため true

A = null;

console.log(A === !null);  // false -> A は null なので、A === true は false
console.log(A !== null);   // false -> A は null なので false
```

そもそも判定するものが違いますね・・・

## まとめ
まず、少しコードを変えただけと思っても、テストは必ず必要です。
今回の件もリリース前にしっかり動作確認すれば潰せたかもしれない。
テスト大事 ★
Jetson NanoにVNC環境を用意する

# この記事について
nVidiaのJetson Nano(初代)にVNCサーバをインストールしてWindowsからGUIにアクセスできる様にします。
いくつか記事はあるのですが、自分ではそれなりにハマったので、自分用のメモです。

# Jetson Nano側の設定
## VNC Servcerのインストールとパスワード設定

### 環境確認。
最初に環境確認。TeraTerm経由等ではなくて、Jetson NanoのGUI上のTerminalから確認する事。
$ env | grep DISPLAY
ここで、DISPLAY=:0と返るか、DISPLAY=:1と返るか覚えておく。

### VNCサーバのインストール。
sudo apt update
sudo apt install tigervnc-common tigervnc-standalone-server tigervnc-scraping-server

### VNCサーバのパスワード設定。
Would you like to enter a view-only password (y/n)? と聞かれるが、nでよい。
vncpasswd

### テスト起動。
先の手順で表示されたDISPLAY番号に変更する事。Jetson NanoのGUI上のTerminalから確認する事。
x0vncserver -display :1 -passwordfile ~/.vnc/passwd

### テスト接続。
Windows側からは、VNCのビューワソフトであれば何でも良いです。
USB接続してる場合、IPが192.168.55.1、Portが5900で、Passwordがvncpasswdで入力した文字列で接続できます。
出来なければ、ここまでで何かが間違ってます。

### 自動起動設定。

起動時によみこむ起動ファイルを作成します。
sudo vi /etc/systemd/system/x0vncserver.service

中身は以下。日本語で書いてある所を書き換えて下さい。またDISPLAY番号も先と同様に書き換えて下さい。
さらに、10秒の遅延を入れるのが流行っている様ですが、私の環境では10秒では追いつかず、30秒にしています。

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target
After=network.target remote-fs.target nss-lookup.target
After=x11-common.service 

[Service]
Type=forking
User=ユーザ名
Group=所属グループ
WorkingDirectory=/home/ホームディレクトリ
ExecStart=/bin/sh -c 'sleep 30 && /usr/bin/x0vncserver -display :1  -rfbport 5900 -passwordfile /home/ホームディレクトリ/.vnc/passwd &'

[Install]
WantedBy=multi-user.target

自動起動設定、つまりデーモンとして起動する様に設定します。

最初に、デーモンを再読み込みしないとスタートも有効化も出来ません。
$ systemctl daemon-reload

次に、テストとして手動でVNCをデーモンとして起動してみます。
sudo systemctl start x0vncserver.service

手動で起動した後、エラーが出ていないかのチェック。
$ sudo systemctl status x0vncserver.service

VNCが一覧にあるかどうか、のチェック
$ systemctl list-units | grep vnc

ここまで無事にできた所で、VNCサーバの自動起動を有効化
$ sudo systemctl enable x0vncserver.service 

ここでOS再起動かけます。

再起動後、まずJetson NanoのGUIでログインして(そうでないとVNCは使えない)。

自動起動した後、エラーが出ていないかのチェックします。
$ sudo systemctl status x0vncserver.service

ここで問題なければ、WindowsからVNC ビューワで接続できるはず。
【AWS SCS-C02一発合格！】セキュリティ超初心者がAWS SCSにたった2週間で合格した話

## はじめに
こんにちは、uiroleです！
この度、セキュリティ超初心者がAWS Security Specialityに無事一発合格できました！
今回はその振り返りとどうやって勉強したか等を書いていこうと思います。

### 【この記事の対象者】
- AWS SCSを受験する人・受験を検討している人
- AWS認定資格に興味がある人

### 【この記事を読んで得られること】
- AWS SCSの効率的な勉強法(当社比)
- AWS SCSで実際に出題された問題の傾向

### 【本章の前に軽く自己紹介】
◆学部卒(非情報系)
◆新卒でSIerに入社3年目で、AWS案件歴は3ヶ月。
◆取得資格
| 資格名 | 取得日 |
|:-----------|:-----------|
| 基本情報技術者 | 2021年11月  |
| AWS クラウドプラクティショナー | 2023年2月 |
| AWS ソリューションアーキテクトアソシエイト | 2023年7月 |
| AWS ソリューションアーキテクトプロフェッショナル | 2024年3月 |
| AWS デベロッパーアソシエイト | 2024年3月 |
| AWS sysOps Administrator アソシエイト | 2024年4月 |
| AWS Security Speciality 　☆NEW!!☆ | 2024年10月 |


:::note info
sysOpsAdministratorアソシエイトを取得するまでは、業務ではインフラにもAWSに携わったことはありませんでした。
:::


## AWS Security Specialityとは？
専門的なデータ分類と AWS のデータ保護メカニズム、データ暗号化方法と実装するための AWS メカニズム、および安全なインターネットプロトコルを実装するための AWS メカニズムについての理解が問われる試験。

- 試験時間：170 分
- 問題数：65問
- 料金：300 USD

https://aws.amazon.com/jp/certification/certified-security-specialty/


## 勉強方法と勉強期間
https://kws-cloud-tech.com/

使用した問題集はCloudTechのみで、この問題集に385問問題があるので、正答率が90%になるまで勉強しました。
勉強期間は2週間ですが、2週間の内訳としては以下となります。
平日：約3時間
休日：約4時間
合計：約50時間

:::note info
まずは**いきなり問題を解いてみて、分からないところは調べていく**というスタイルが個人的には効率よかったと思います。
:::
:::note info
問題と答えを暗記するのではなく、なぜこの選択肢は違っていて、この選択肢を選ばなければいけないのかを全ての選択肢に対して言えるようにすることが合格の鍵だと思いました。
:::


## 受験スケジュールと結果発表
試験時間は170分ですが、1時間半ほどで終わり、80分ほど残して退出しました。
そして意外と気になる結果通知の時間ですが、19時過ぎにメールが来て、スコアレポートも確認できました。

|| 時間|
|:-----------|:-----------|
| 試験開始| 10:00 |
| 試験終了| 11:30 |
| 結果通知| 19:10 |


## 実際試験を受けてみて
Cloudtechで解いた問題に似ている問題も5~10問ほど出ましたが、それ以外のところが難しく、試験中は正直落ちたかと思っていました。

### 出題が多かった問題
- DDoS攻撃
  https://qiita.com/uirole/items/d1295e200fdd20f786fd
- セキュリティグループとネットワークACL
- 暗号化キー
- SCP(StringLikeとStringNotLike・DenyとAllowの選択)
- ログの記録
- ルートユーザーの保護
- GuardDuty




## 終わりに
この記事が役に立てば嬉しいです。
少しでもこの記事がいいなと思っていただけたら、ぜひいいねボタンをお願いします！
PyInstallerでexe化したときの自分の位置のパス取得について

## 概要

PyInstallerでPythonスクリプトをexe化すると、ファイルの参照方法が変わるようです。

通常の.pyファイルでは__file__を使って実行中のスクリプトのパスを取得できますが、exe化した場合にはsys.executableで実行ファイルのパスを取得しないと、同じフォルダに置いてあるファイルを参照できなくなるようでした。

## 対策法

これを防ぐために、以下のコードで自分がPyInstallerで実行されているかどうかを判別する必要がありました。

```py
import os
import sys


def fetch_base_path() -> str:
    """基準パスを取得する関数"""
    # PyInstallerで実行されているかどうかをチェック
    if getattr(sys, "frozen", False):
        # EXEの実行ファイルのパスを取得
        return os.path.dirname(sys.executable)
    else:
        # スクリプトの実行ファイルのパスを取得
        return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        
# 使用例
# ベースパスを取得
#base_path = fetch_base_path()
```
#69　Add Xdebug to existing PHP container projects

## Introduction

I found out there are many outdated setup articles which may not work for the Xdebug 3.1.X version. Therefore I jot down the setup of PHP with Xdebug and docker.

## Setup

edit dockerfile to install xdebug

``` Dockerfile
RUN pecl install xdebug && docker-php-ext-enable xdebug
```

copy xdebug config to php config folder

``` ini
[xdebug]
xdebug.mode=off
xdebug.start_with_request = yes
xdebug.client_host = "host.docker.internal"
xdebug.idekey="VSCODE"
```

In `docker-compose.yml`, add `host.docker.internal` to `extra_hosts` as follow

``` yml
services:
    app:
      extra_hosts:
        - host.docker.internal:host-gateway
```

open vscode and create a launch.json file
make sure the attribute `pathMappings` is set correctly.

If you have installed the Remote Development extension from Microsoft, you may face an issue that the breakpoint does not work because of the wrong `pathMappings`.

``` json
"the path of project in container":"${workspaceFolder}"
```

After you `Attach to Running Container`, your vscode is "working" inside the container and your `pathMappings` should be like this.

``` json
"${workspaceFolder}":"${workspaceFolder}"
```

Things should be working right now and you can try adding breakpoints to check whether the process is broken correctly.

## Explaination

extra_hosts:

- it adds hostname mappings to the container network interface configuration. Entries will be added to the container `/etc/hosts` file

host.docker.internal:

- Docker has defined a special magic DNS, `host.docker.internal`, that every service on the host can be accessed from the container at `host.docker.internal`

host-gateway:

- A special string which points to the host gateway.

Now we know `host.docker.internal:host-gateway` in `extra_hosts` is going to map `host.docker.internal` to the host's gateway which the container can connect the services running from outside.

## To sum up

It seems that there are not many articles and blogs discussing the Xdebug with docker, so it is a memo to remind myself if I need to have the same setup in the future.
PDFのバージョンを下げる無料ソフト「CubePDF」

## はじめに
業務で利用していたソフトの一つで非常に便利でした。
今は別の案件で使わないので削除ついでに備忘録として記事としております。

PDFにバージョンが存在してバージョンが新しいと使えない機能（業務ではTCPDFの実装）があり、バージョンを下げる必要がありました。

いろいろインストールしましたが一番シンプルでかつ無料で使いやすかったので
もしPDFのバージョンを変えたい際に参考にしてみてください。

## インストール

インストールサイトはCubePDFと検索すればいろいろ出てきますが
ここにも貼っておきます。

https://www.cube-soft.jp/cubepdf/

## 使い方（超ざっくり）
　
#### PDFを印刷する画面までいきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/21b66deb-2406-9ff9-a32b-9c295c730d04.png)

#### CubePDFをインストールしてあればここで送信先にCubePDFがあるので選択して保存を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/5579da13-9bba-8965-5e90-306b7e5187fc.png)

#### CubePDFが立ち上がったら保存先やPDFのバージョンを選択して保存を押下でバージョンの変換ができる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/7cbd387e-3016-c919-4fef-336b6e857014.png)


すごいシンプルかつ使いやすいのでぜひぜひ！
#68　【C#】他ウィンドウを操作する(事前準備)

## 概要

C# .NET Framework で他ウィンドウの操作を試してみようと思います。
題材として、Windows11 で追加されたエクスプローラーのタブ機能に干渉し、C＃からエクスプローラーのタブを開いてみます。
今回はその事前準備として、実装に必要な情報の調査を行います。

## 調査

C# で特定ウィンドウを操作する際に必要な処理は大きく以下の2つです。
①ウィンドウを取得する
②ウィンドウにメッセージを送信する

これらの実行のために、ウィンドウ、メッセージの情報を調査する必要があります。

### Spy++ を起動する

VisualStudioのインストールフォルダ配下に、`spyxx.exe`、`spyxx_amd64.exe`があります。32bitのPCでは前者を、64bitのPCでは後者を起動してください。
自分の場合はここでした。
`C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\`

#### 見つからない場合

コンポーネントのインストールが必要です。
VisualStudio のメニューバー -> ツール -> ツールと機能を取得... を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/870d2494-11e5-4260-10e3-c11a498c5ee7.png)

[個別のコンポーネント]タブで以下を選択してインストール
-   [デバッグとテスト]  > [C++ のプロファイル ツール] 
-   [開発作業]  > [C++ コア機能]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/ec6195a3-408a-77d9-5723-b925adec729c.png)


### ウィンドウの情報を確認する

Spy++ を起動するとこのような画面になるので、上部メニューから双眼鏡マークのウィンドウ検索ボタンを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/0b4d4ee1-7df2-03d6-b5a7-e3c78ca291fa.png)

画像のようにウィンドウ検索というポップアップが出るので、ファインダーツールのところにある照準マークみたいなのを、調査したい対象のウィンドウ(今回はエクスプローラー)までドラッグ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/fd852590-bc9a-1fc1-7947-96bb1360af68.png)

すると、ポップアップ内のハンドルやクラス名の部分が自動入力されるので、ハンドルの欄を削除してOK選択

検索に成功すると、Spy++のウィンドウツリーで、ヒットしたウィンドウにフォーカスが当たった状態となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/f52fd431-1327-e73c-af8b-8113a1806566.png)


ウィンドウは階層構造のため、この時点ではまだ目的のウィンドウの 子 または 親ウィンドウを選択してしまっている可能性があります。
今回使用するのはエクスプローラー全体のウィンドウです。ウィンドウツリー右クリック→[強調表示]を使用してお目当てのウィンドウを探し、[プロパティ...]を選択するとウィンドウの情報が見られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/1eef22c9-8d57-574b-97e4-14a1b528a605.png)

このクラス名が実装の際に必要となります。
ここまでで、①ウィンドウを取得する のための調査は完了です。

### メッセージの情報を確認する

ウィンドウ情報の取得のときと同様に、Spy++のウィンドウツリーで目的のウィンドウを右クリックし、今度は[メッセージ]を選択します。すると、このような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/c8eeeaa7-ae39-443f-0f56-5788990d116d.png)

この状態で、エクスプローラーを操作してみると、エクスプローラーが受信してるメッセージが大量に表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/d4291e9c-031f-158e-8402-1286676bde29.png)

では、エクスプローラーで新規タブを開いたときにどんなメッセージが発生しているか確認してみます
エクスプローラーでCtrl + T でタブを追加したところ、このようなメッセージが飛んでいるのが確認できました。(関係ないログが多いのでSpy++のログオプションでフィルタかけてます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/c166c56a-8059-dc27-8e7a-1a07dd1ee8a3.png)

ウィンドウのときと同じように、右クリック→[プロパティ...]で内容を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/7204968f-152e-d0ff-6d8b-5dd6ffc16e53.png)


この、メッセージ番号(0111)と、wParam, lParam が②ウィンドウにメッセージを送信する のために必要な情報です。
以上で、②の調査も完了です。

## 次回について

次は、実際にC#からエクスプローラーのウィンドウにメッセージを送信し、タブを追加してみたいと思います。
実務向け：ファイル操作から権限設定まで実務で使えるLinuxコマンド7選

## はじめに
Linux環境での操作は、ほとんどの場合コマンドラインインターフェース（CLI）で行われます。

CLIでは、キーボードでコマンドを入力し、さまざまなタスクを効率的にこなすことができます。

特に実務では、ファイル操作やディレクトリの移動、検索、アクセス権の設定など、日常的に使われるコマンドがたくさんあります。

今回は、Linuxで実務でよく使う7つの基本コマンドを整理し、自分への備忘録としてまとめていきます。

## 知識整理
Linuxのコマンドはシンプルですが、適切に使うことで作業効率が飛躍的に向上します。

以下は、特にシステム管理や開発において役立つコマンドです。

それぞれのコマンドの用途や使い方を理解し、スムーズな操作ができるようにすることが重要です。

また、過去の記事でも障害対応時に役立つLinuxコマンドを紹介していますので、ぜひ参考にしてください。

https://qiita.com/free-honda/items/2f45a7f378b19a990c78

## 実務でよく使うコマンド7集

### 1. ``ls``

ファイルやディレクトリの一覧を表示するコマンド。ファイルの状態やアクセス権なども確認できます。

```bash
ls -l
```

長い形式で詳細情報付きのリスト表示を行います。ファイルのパーミッション、所有者、サイズ、最終更新日などが確認できます。

### 2. ``cd``

ディレクトリを移動するための基本コマンド。ファイル操作の前には、目的のディレクトリに移動することが必要です。

```bash
cd /path/to/directory
```

指定したディレクトリに移動します。絶対パスや相対パスで指定できます。

### 3. ``grep``

ファイル内で特定の文字列を検索するコマンド。ログファイルの解析や設定ファイルの内容確認など、データの検索時に重宝します。

```bash
grep 'search_string' filename
```

指定した文字列を含む行を表示します。オプションを付けることで、正規表現を使った高度な検索も可能です。

### 4. ``cat``

ファイルの内容を表示するコマンド。特定のファイルの内容を一気に確認したいときに使います。

```bash
cat filename
```

ファイル全体を表示します。複数のファイルを連結して表示することもできます。

```bash
cat filename | grep 'search_string'
```

さきほどの、``grep``コマンドと組み合わせて使うと便利です。

### 5. ``diff``
2つのファイルの違いを比較するコマンド。コードや設定ファイルの変更点を確認する際に使用します。

```bash
diff file1 file2
```

ファイル間の差分を表示し、変更箇所を視覚的に確認できます。パッチファイルの生成にも利用可能です。

```bash
diff -s file1 file2
```

通常は、ファイル間の違いがある場合にのみ出力されますが、-sオプションを使うと、ファイルが同じ場合にも「ファイルは同一である」というメッセージが出力されます。

### 6. ``cp``

ファイルやディレクトリをコピーするコマンド。バックアップやファイルの複製時に使用します。

```bash
cp source_file destination_file
```

指定したファイルを別の場所にコピーします。ディレクトリ全体を再帰的にコピーします。ディレクトリごとコピーする場合に使います。

```bash
cp -r source_directory destination_directory
```

通常のcpコマンドでは、コピー先に同じファイルが存在する場合、そのファイルを上書きしますが、-iオプションを付けることで、上書き前に確認のプロンプトが表示されます。

```bash
cp -ip source_file destination_file
```

また、-pオプションを組み合わせることで、ファイルのタイムスタンプやアクセス権限を保持したままコピーすることが可能です。

### 7. ``chmod``
ファイルやディレクトリのアクセス権を変更するコマンド。ユーザーやグループの権限を適切に設定するために必要です。

```bash
chmod 755 filename
```

ファイルの権限を変更します。例えば、755は所有者に読み書き実行権限を与え、他のユーザーには読みと実行の権限のみを与える設定です。

## まとめ
Linux環境での作業を効率化するためには、基本的なコマンドをしっかりと理解し、活用することが重要です。

今回紹介した7つのコマンドは、ファイル管理や検索、アクセス権の設定など、日々の業務で必須となるものばかりです。

これらをマスターすることで、ターミナル上での操作がスムーズになり、作業の効率化が短縮できます。

## 関連記事

https://qiita.com/free-honda/items/2f45a7f378b19a990c78

https://qiita.com/free-honda/items/e58b6750dba27107889f
TFSで他人のチェックアウトを取り消す方法（tf undoが失敗する場合）

VisualStudio.com改めAzure DevOpsでTFSサーバを建てていて、チェックアウトしたまま従業員などが退職するなどしてTFSのユーザアカウントを消してしまうと、単純なtf undoではチェックアウトを取り消せない問題が発生します。

# おさらい（TFSにアカウントが残っている場合の手順）
TFSアカウントを消していない場合は以下の方法が使えます。
```bat
tf undo /collection:"コレクション" /workspace:"ワークスペース";"ユーザー" "取消ファイルサーバーパス"

（配下のフォルダやファイル全てに…という場合は/recursiveオプションを付ける）
tf undo /recursive /collection:"コレクション" /workspace:"ワークスペース";"ユーザー" "取消ファイルサーバーパス"

例）
tf undo /collection:"https://hogehoge.visualstudio.com/" /workspace:"wkname;username" $/Tools/Test/*.*
```
ここで必要となるコレクションはAzure Devopsの場合はプロジェクトのURLになります。
ワークスペース、ユーザは勿論tf workspaceでも調べられます。
```bat
tf workspaces /collection:"コレクション" /owner:*
```
が、VS2017が入っているのであればTFSサーバにVS2017でログインし、チームエクスプローラでターゲットとなるファイルを右クリックし、「詳細」→「プロパティ」で開けるプロパティ画面の「状態」タブから確認した方がグラフィカルに確認は出来ます。

チェックアウト一覧が見たいのであれば以下のコマンドで実行出来ます。
```bat
tf status /collection:"コレクション" /user:*
```

が、TFSのユーザアカウントをAzure Devopsへのログインユーザ一から（チェックアウト取り消しの前に）除却してしまうと、このtf undoコマンドが以下のようなエラーと共に失敗します。
```
>tf undo /collection:https://hogehoge.visualstudio.com/ /workspace:"wkname;username" $/Tools/Test/*.*
TF14061: The workspace wkname;username does not exist.
```

# どうすればいいか？（TFSにアカウントが残っていない場合の手順）
このようなケースでは、対象となるワークスペース自体を消すことによってチェックアウトを取り消すことができます。
https://stackoverflow.com/questions/37246040/how-can-i-remove-fix-a-ghost-workspace

**1．tf workspacesの実行** 
tf workspacesはXML形式での出力をするとワークスペース毎の詳細な情報が取得できます。よってそれをまず出力します。
```bat
tf workspaces /collection:"コレクション" /owner:* /format:xml

（テキストファイルに出力したい場合）
tf workspaces /collection:"コレクション" /owner:* /format:xml > C:\output.txt
```
 **2．書き出されたXMLの検索** 
エディタで開き、消したいワークスペースとユーザで検索します。
以下のような、消したいワークスペース・ユーザのレコードの塊を見つけ出します。
```xml
  <Workspace computer="PC名" name="wkname" ownerdisp="user" ownerid="5f84b85f-be1f-4a6a-a282-96fee77fab20\useraddress@example.com" ownertype="Microsoft.IdentityModel.Claims.ClaimsIdentity" owner="12345678-90ab-cdef-1234-567890abcdef" owneruniq="12345678-90ab-cdef-1234-567890abcdef">
    <Comment />
    <LastAccessDate>2024-04-23T11:27:49.877+09:00</LastAccessDate>
    <OwnerAliases>
      <string>5f84b85f-be1f-4a6a-a282-96fee77fab20\lunarkx201@gmail.com</string>
      <string>useraddress@example.com</string>
      <string>user</string>
    </OwnerAliases>
  </Workspace>
  ```
この情報から、ワークスペース名とowneruniqの値を取得します。上記の例だとそれぞれ
・ワークスペース：wkname
・owneruniq：12345678-90ab-cdef-1234-567890abcdef
となります。

 **3．ワークスペースの消去** 
当然、このようなユーザが存在しないワークスペースは存在意義がないので、サーバワークスペースを消すコマンドを実行します。
```bat
tf workspace /delete wkname;12345678-90ab-cdef-1234-567890abcdef
```
実行すると、以下のようなメッセージが出るので「Yes」と打ち込んでENTします。
```
削除されたワークスペースは復元できません。
サーバー 'https://hogehoge.visualstudio.com/' のワークスペース 'wkname;12345678-90ab-cdef-1234-567890abcdef' は、11 の保留中の変更を含んでいます。
ワークスペースを削除しますか? (Yes/No)
```
これで消去が可能です。
# 注意点
TFSアカウントがある場合にワークスペース自体の削除をしてしまうと何がおきるかは確認していないので、消去するワークスペースを探す際には十分にご注意下さい。
Unityでnull合体演算子(??)やnull条件演算子(?.)を使うと

# 概要
UnityのC#ではnull合体演算子(??)やnull条件演算子(?.)を使用しても特にエラーが表示されたりすることはありません。ですがこういう事もあったという体験談を共有したいと思います。
# 本文
以下のようなnull合体演算子(??)とnull条件演算子(?.)を使ったコードをUnityEditorで実行すると特に問題はなく思った通りの動きをしてくれました。
```cs
return testList?.Values.Select(data => data.name).ToList() ?? new List<Test>();
```
でもビルドして実機で動かしてみると正しく動作してくれませんでした。

調べてみると、UnityのC#では少し特殊なようでこれらは正常に動作しないこともあるとのことでした:tired_face:

UnityEditor上では正常に動いていてもビルドしたら思った通りに動かないこともありますので頭の片隅に置いておくと幸せになれるかもしれない。というお話でした！:open_hands_tone2:

# 補足
関連記事リンク
[【Unity】Null伝搬(条件)演算子とUNT0008](https://qiita.com/ogix/items/43c8979ab54549826b60)

[動画](https://www.youtube.com/watch?app=desktop&v=Py4N3XrKLzo)
URL のクエリ除去 (JavaScript)

**TL;DR**

```javascript
const url = new URL(location);
url.search = '';

// コンソールで表示
console.log(url.href);

// ブックマークレット向け
history.replaceState(null, '', url); // URL 書き換え
prompt('URL removed search params.', url); // プロンプトで表示 (そのままコピペ可)
```

## モチベーション・背景

GitHub で見出しのアンカーリンクを拾ってると、勝手に `https://github.com/fish-shell/fish-shell/?tab=readme-ov-file#packages-for-linux` と言った感じで、  
クエリー `tab=readme-ov-file` が付くようになっていました。
マークダウンなどドキュメントにメモする際など、割と邪魔なので除去するブックマークレットを用意しました。

```javascript
javascript:{const u=new URL(location);u.search='';history.replaceState(null,'',u)}
```

**ブックマークレット生成用 HTML**
```html
<a href="javascript:{const u=new URL(location);u.search='';history.replaceState(null,'',u)}">Remove queries</a>
```
Polarsの可能性? (数値計算)

# 初めに
Polarsは大規模テーブルデータ処理に強いライブラリとして知られています。同じくテーブルデータに対して使われるPandasよりも大規模データに対して処理が高速です。データサイエンスや機械学習の分野でよく使われています。

そんな優秀なPolarsですが、列指向のメモリフォーマットを使用し、効率的なデータ処理を可能にする**Apache Arrow**というものが組み込まれているので、テーブルデータではなく行列の**列同士の計算**に対しても高速になるのではないかと考え、実験してみました。

https://qiita.com/inoshun/items/752239e89f346fe77f95

## 実験
今回は行が超長い行列の列同士の和をnumpy, pandas, polarsで計算します。
$(10^n, 2)$の行列をnpyとparquet形式で保存した時の容量と、ロード時間、計算時間をそれぞれ測定しました。

### 1. データ容量
| データ容量  | $10^6$        | $10^7$        | $10^8$        | $10^9$        |
|-----------|-------------|-------------|-------------|-------------|
| .npy       | 16 MB       | 160 MB      | 1.6 GB      | 16 GB       |
| .parquet   | 5.3 MB      | 52.9 MB     | 524.7 MB    | 5.24 GB     |

データ容量はparquet形式の方がnpy形式に比べて約$1/2$倍に削減されています。
ただparquetは基本的に2次元データでしか保存できないので、テーブルデータ以外ではnpyに比べて活用できる機会は少ないでしょう。

### 2. ロード時間[s]
| ロード時間[s]| $10^6$    | $10^7$        | $10^8$        | $10^9$   |
|-----------|-------------|-------------|-------------|-------------|
| <font color="blue">numpy</font>| 0.0093 | 0.1276| 1.0480| 18.2100 |
| <font color="orange">pandas</font>   | 0.1072     | 0.2078     | 5.4981    | 78.1901     |
| <font color="red">polars</font>   | 0.0406     | 0.1535     | 0.1535    | 19.5526     |

![load_time.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494482/4e1efcab-456a-5f5e-29b0-419f585a8efc.png)
ロード時間はnumpyとpolarsが同じくらいで、pandasが一番遅い結果となりました。
同じparquetファイルをロードするだけでも、pandasに比べてpolarsの方が圧倒的に速いことがわかります。
ロードする回数があまり多くない状況では、numpyとpolarsの時間差は気にするほどではないと感じます。

### 3. 計算時間(和)[s]
| 計算時間(和)[s] | $10^6$  | $10^7$  | $10^8$  | $10^9$  |
|----------------|-----------|-----------|-----------|-----------|
| <font color="blue">numpy</font>            | 0.0014    | 0.0842    | 4.5350    | 68.5682   |
| <font color="orange">pandas</font>         | 0.0054    | 0.0779    | 9.3288    |     -        |
| <font color="red">polars</font>   | 0.0104     | **0.0473**    | **0.9323**   | **35.1551**|

![compute_time.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494482/d57f3078-8d9e-58f0-dd10-ff78ad58fb72.png)
最後にメインの計算時間です。
予想通りnumpyよりもpolarsの方が約2倍高速であることが確かめられました！
しかし$10^6$データではnumpyの方が速いので、小中規模データではnumpyの方が良さそうです。
＊pandasでは$10^9$データを計算することはできませんでした。

# 結論
予想通り、大規模データではnumpyよりも**polarsの方が計算速度が速い**という結果になりました。
ただ、今回計算したのは単なる列同士の和であり、行列の数値計算のメインである逆行列などでは普通にnumpyの方が速いと思います。なので今回の結果が役に立つような場面は限られていますが、**可能性**というタイトルなので大目に見ていただければと思います。
二次元データなら使えそうな気がするので、画像処理や時系列データなどに活用できないか色々調べてみたいと思います。ここまで読んでいただきありがとうございました。
Open Source Conference 2024 Online/Fall で講演しました

# はじめに
こんにちは、[エンジニアコミュニティ LinuC Open Network （LiON）](https://linuc.community/)の運営事務局に参加させていただいております伊藤です！

今回は、オープンソースの祭典「Open Source Conference 2024 Online/Fall」（10/18,19開催）にて、コミュニティ活用をテーマに講演させていただきましたので、その内容をレポートします。
<br>

![osc_LiON_2024-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810512/27ea8e8d-549d-4b35-d08c-7920bdf9c86c.png)


# 講演内容
LiONの運営を支援いただいているLPI-Japan様の主催セミナーとして、「エンジニアの成長と活躍を促すコミュニティ活用術」というテーマでお話させていただきました。

今回お伝えしたのはこの3点。

1. 自分のためにコミュニティを活用しよう
1. コミュニティ活用のポイント
1. LinuC Open Network コミュニティのご紹介

<br>

「1. 自分のためにコミュニティを活用しよう」では、自身の成長やキャリアアップにおいて、コミュニティに参加し活動することでどのようなメリットや効果が期待できるのか、そのポテンシャルについて解説しました。できる人はやっている、これを知らないのは本当に勿体無いことなのです。

「2. コミュニティ活用のポイント」では、コミュニティのポテンシャルを最大限に活用するために、重要な考え方やスタンスについて解説しました。実際、参加してもあまり上手に活用しきれていない方が多いのではないかと思います。

そして、最後に「3. LinuC Open Network コミュニティのご紹介」ということで、私たちのエンジニアコミュニティについて紹介させていただきました。LiONはLPI-Japan様の強力なサポートのもと、エンジニアにとって魅力的な挑戦機会が充実したコミュニティです。ぜひ、多くのエンジニアの皆様に活用いただけたら嬉しいです。

# 資料ダウンロード
今回のセミナーの資料はこちらからダウンロードいただけます。
https://lpi.or.jp/news/event/page/20241018_01/

# アーカイブ動画
アーカイブ動画がYouTubeで公開されていますので、気になった方はぜひ今からでもご視聴ください。

https://youtu.be/DRB1zSIznrY?si=SjXMo5AYMDMhQyV8


# おわりに
LinuC Open Network コミュニティで、皆様と一緒に活動できることを楽しみにしています！
https://linuc.community/

# 関連ページ
- Open Source Conference 2024 Online/Fall
https://event.ospn.jp/osc2024-online-fall/
- オープンソースカンファレンス2024 Online/Fall（10/18、19）後援・参加のお知らせ | LPI-Japan
https://lpi.or.jp/news/event/page/20241018_01/
- オープンソースカンファレンス2024 Online/Fall（10/18、19）後援・参加のご報告 | LPI-Japan
https://lpi.or.jp/news/event/page/20241018_01_report/
Kaggle Master の私が感動したpythonの可視化ライブラリ ４選

# はじめに

こんにちは。
いつもは、「ちょこっと業務を簡略化したい」をコンセプトに投稿しています
本日は、qiitaとは別で毎日行っているkaggleについてです
kaggle歴は3年。現在kaggle Masterです
毎日kaggleに触れています
理由は、✨**Grandmaster**✨になって何かしらの仕事に繋げたい！
このために、日々努力しています　


# 本題

色々な方のNotebookを見て使えそうな可視化手法を自分でも取り入れた時に、使いやすかった手法を４選紹介します
※コードはどなたでもkaggleのURLを開くことが可能なので、kaggle内でご覧ください　Upvotedもお待ちしています！



## folium.Map()
地図上にマーカーやシェイプなどの地理空間データを簡単にプロットできます。今回は、台湾の地震の震度の強さを色で表し、発生箇所をプロットしています


https://www.kaggle.com/code/risakashiwabara/eda-map-plot

![スクリーンショット 2024-10-22 20.10.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/2c40bf92-f4ea-4ca7-f97d-1823791519cc.png)




## geopandas
地理空間データを扱うためのPythonライブラリで、Pandasのデータフレームに地理的情報を追加したものです。今回は、サンプルデータセット「naturalearth_lowres」を読み取り、別で調べたい国のlistを作成。それをMapとして提示しています

https://www.kaggle.com/code/risakashiwabara/eda-map-plot


![スクリーンショット 2024-10-22 20.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/b827aeaa-bab3-3850-0ae3-b32f3da2122d.png)

## ScalarMappable()
数値データをカラーマップに変換するためのmatplotlibのオブジェクトです。値を特定のカラーマップに対応させ、グラフ上で色として表示する際に使用されます。今回は、プレミアリーグサッカーチームの得点と失点の関係性をグラフにし、試合数別を色として分類しています

https://www.kaggle.com/code/risakashiwabara/eda-scatterplots

![スクリーンショット 2024-10-22 20.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/eea31f38-113f-76b7-4910-2d1f118cadd2.png)




## subplot/marker
subplotは、1つの図（figure）に複数のグラフを配置するために使われます。　markerは、地図上やグラフ上にポイントを表示するための記号です。今回は時系列データにマーカーをつけることと、subplotでマーカーのどれが見やすいか横並びで配置しています。


https://www.kaggle.com/code/risakashiwabara/eda-try-all-markers-available-in-plotgraph


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/245a4d37-872c-8841-5d4f-ae126c01954b.png" width=70%>


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/ceb18213-a34b-5025-2139-232ef5887827.png" width=70%>




# 最後に

見ていただき有難うございました✨
kaggle内に他にも載せているので見てUpvotedしていただけるとありがたいです
お願いします！
皆様の業務でも役立つこと願っています
歴5年のバックエンドエンジニアが初めてiOSアプリを作成・公開して、一ヶ月経った収益がこちらw w w w w w w w w w w w w w

前回の記事からの続きです↓
『歴5年のバックエンドエンジニアが初めてiOSアプリを作成・公開して、一週間経った収益を公開する。』
https://qiita.com/hallelujah_8475/items/0d2ebd776f2ea14fcd40

私は普段フリーランスでGoのバックエンドエンジニアをやっています。

## 結論:point_up:
![スクリーンショット 2024-10-23 20.07.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455017/c8e5c693-6998-32d0-edcf-1c45efea28b4.png)

![スクリーンショット 2024-10-23 20.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455017/229cc259-4844-eac7-1811-0677898f083a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455017/82d0b352-02f8-21ff-31f1-73f2c46a51f1.png)

＿人人人人＿
＞　51円　＜
￣Y^Y^Y￣

## 前回と変わったこと:thinking:
合計のダウンロード数が16で、
日本以外からのダウンロード数が8もありました。

そこに目を付け、
すかさずEnglishモードの追加。
英語でトピックを提案してくれます。

完璧ですね。

これぞグローバルです。

![スクリーンショット 2024-10-23 20.07.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455017/c971dff6-2d3f-4139-1fdd-8cbf115cccd6.png)

![スクリーンショット 2024-10-23 20.09.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455017/73a42224-5dca-a924-e9bc-7f275ffd95d4.png)


## 今後の展望:rainbow:
先月8円だった収益が51円になりました。

大きな進歩です。

少なく見積もっても約6倍。

この調子で推移すれば、
来年の今頃には、
6×6×6×6×6×6×6×6×6×6×6×6で111,015,899,136円稼げる予定です。

![スクリーンショット 2024-10-23 20.19.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455017/06f9cfb6-64ea-583a-89fc-2ddda29b1c47.png)

ChatGPTがそう言っているので間違いないです。
FIREって意外と簡単です。

後々Xで広告を出す予定なので、
その結果も記事にして公開しようと思っています。

それにしても、
本業に尽力する糧となりますね。
【Next.js】You're importing a component that needs useState. It only works in a Client Component, but none of its parents are marked with "use client", so they're Server Components by default.の解決方法

# はじめに
この記事では、Next.jsで`useState`を使用した際に発生したエラーについて解説します。このエラーは、サーバーコンポーネントとクライアントコンポーネントの扱いに関連しています。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::

# 事象
以下のコードでuseStateを使用しようとした際、エラーが発生しました。

```react
import { useState } from "react";

export default function Home() {
  const [state, setState] = useState("");

  return <></>;
}
```
エラーメッセージは以下の通りです。

```
You're importing a component that needs useState. It only works in a Client Component, but none of its parents are marked with "use client", so they're Server Components by default.
```

# 原因
このエラーの原因は、Next.jsのコンポーネントの扱いに関する仕様にあります。useStateはクライアントサイドでのみ動作しますが、Next.jsではデフォルトでコンポーネントがサーバーコンポーネントとして扱われるため、クライアント専用のuseStateが使えなくなります。

参考にした記事では、以下の2つの原因が挙げられています。

>1.サーバーコンポーネントとして動作させたいコンポーネントのファイルの先頭に 'use client' を追加していない場合
2.クライアントコンポーネントとして動作させたいコンポーネントが、サーバーコンポーネントとして扱われている場合 (私はこっちだった)

Next.jsでは、クライアントコンポーネントとして動作させたい場合、ファイルの先頭に`use client`を明示的に追加する必要があります。

https://qiita.com/ponyo_shun0816/items/f862352a81be3a3cd2a4

# 解決方法

エラーを解決するためには、コンポーネントの先頭に`use client`を追加します。

```react
"use client"; //use clientを追加
import { useState } from "react";

export default function Home() {
  const [state, setState] = useState("");

  return <></>;
}
```
これにより、クライアントコンポーネントとして動作し、エラーは解消されました。

# 終わりに
今回のエラー解決を通じて、Next.jsのコンポーネントの仕組みや挙動についてさらに理解が深まりました。

# 参考
『ReactServerComponentsError: 'use client’をソースコード上部に追加しなければ正常にコンポーネントが呼び出せない』

https://qiita.com/ponyo_shun0816/items/f862352a81be3a3cd2a4

『Errorで「It only works in a Client Component but none of its parents are marked with "use client", so they're Server Components by default.」って怒られた』

https://qiita.com/tanimoto-hikari/items/d4ebcc8f141c11601cd2

『You're importing a component that needs useState. It only works in a Client Component, but none of its parents are marked with "use client"』

https://stackoverflow.com/questions/74965849/youre-importing-a-component-that-needs-usestate-it-only-works-in-a-client-comp