OmniAICreator/Qiita-1.07M huggingface dataset:
Active Recordとは？RailsのORMでデータベース操作をシンプルにする仕組みを解説！

# はじめに
Railsの強力な特徴の一つである**Active Record**は、データベースとのやり取りを簡素化するORM（オブジェクトリレーショナルマッピング）ライブラリです。Active Recordを使うと、SQLを直接書かなくても、オブジェクト指向の方法でデータベースを操作できるため、Rails開発における生産性が向上します。

この記事では、Active Recordの仕組みを詳しく説明し、データベース操作の具体例を交えながらそのメリットを解説します。

# ORM（オブジェクトリレーショナルマッピング）とは？
ORMとは、オブジェクト指向プログラミングとリレーショナルデータベースを統合するための手法です。通常、データベースは**テーブル、行、列**という形式でデータを管理しますが、プログラムの中では**クラス**と**オブジェクト**としてデータを扱います。この違いを埋めるために、ORMはデータベース上のテーブルやレコードを、プログラムの中のクラスやオブジェクトに対応させる技術です。

Active Recordは、Railsで採用されているORMライブラリであり、以下のような役割を果たします。

- **テーブルとモデルの対応**: データベースのテーブルは、Railsのモデルクラスと対応します。
- **レコードとオブジェクトの対応**: データベースの1つのレコードは、モデルクラスの**インスタンス**（オブジェクト）として扱われます。
- **SQLの自動生成**: Active Recordは、データベース操作に必要なSQLを自動で生成してくれます。

# Active Recordの基本的な仕組み
### 1. モデルとテーブルの対応
Active Recordでは、データベースのテーブルがモデルクラスに対応します。例えば、`articles`というテーブルがある場合、`Article`モデルがそのテーブルを操作します。

```ruby
class Article < ApplicationRecord
end
```
この`Article`クラスは、デフォルトで`articles`テーブルと結びついています。Railsの命名規則により、**単数形のモデル名が複数形のテーブル名**にマッピングされます。

### 2. レコードをオブジェクトとして操作
データベースの1つ1つのレコードは、モデルのインスタンスとして操作されます。例えば、`articles`テーブルのレコードを取得すると、それが`Article`オブジェクトとして扱われます。

#### レコードの作成
新しい記事をデータベースに作成する場合、Active Recordを使って以下のように行います。

```ruby
article = Article.new(title: "First Article", content: "This is the content.")
article.save
```
ここで、`Article.new`メソッドを使って新しい`Articleオブジェクト`を作成し、`save`メソッドを呼び出すことでデータベースに保存されます。内部的には、以下のようなSQLが生成されます。

```sql
INSERT INTO articles (title, content) VALUES ('First Article', 'This is the content');
```

# Active Recordの利点
### 1. SQLの自動生成
Active Recordは、プログラマが直接SQLを書かなくても、ORMを通じて必要なSQLを自動的に生成します。これにより、開発者はデータベースの複雑なクエリを気にせず、コードのロジックに集中できます。

### 2. データベースに依存しない開発
Active Recordは、異なるデータベース（例えばMySQL、PostgreSQL、SQLiteなど）にも柔軟に対応しています。コードを変更せずに、異なるデータベースに移行することができるため、アプリケーションの移植性が高まります。

### 3. Railsとシームレスに統合
Active Recordは、Railsと緊密に統合されており、フォームやビューと簡単に連携できます。例えば、form_forやform_withを使ってフォームを作成すると、モデルと自動的に連携し、データベース操作をスムーズに行えます。

# まとめ
Active Recordは、RailsにおけるORMの中心的な役割を担い、データベースとオブジェクト指向プログラミングの世界を橋渡しします。SQLを意識することなく、直感的なメソッドを使ってデータベース操作を行えるため、開発効率が向上します。ORMの仕組みを理解することで、Railsのデータベース操作がより効率的で効果的になるでしょう。

# 参考文献
[Railsガイド Active Record の基礎](https://railsguides.jp/active_record_basics.html)
Android StudioでPlantUMLを使ってシーケンス図を書いてみる

# はじめに
今回は前回AndroidStudioでPlantUMLを使えるようにしたのでシーケンス図を書いてみましょう
### 本文
まず、新規でPlantUMLを先制するとデフォルトで下記の状態で作成されます
![スクリーンショット 2024-10-19 6.44.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638092/10222026-13c4-5f1b-70c3-fff342e26e4d.png)
startumlとendumlで囲んだところが上から順にシーケンス図として構成されていきます。
また、やり取りを表示したい時の矢印は左右どちら向きでも記述することができ、ハイフンの数も指定はありません

autonumberを使うことで自動的にメッセージに番号が付与されます。
何かしら記述にミスが発生するとプレビューが下記のようになるので一発でわかります。
![スクリーンショット 2024-10-19 6.48.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638092/a679033b-6f7e-c99c-be53-dbe86cb21e4b.png)

### 最後に
次は宣言する分類子を紹介していこうと思います
どなたかのお役に立てれば幸いです
楽譜を描画したい！ part2 [四分音符]

今回は音符を表現してみます
# 四分音符
少し斜めにした楕円と棒を組み合わせた記号です

```js
function note(){
  stroke(0,0,0);
  fill(0,0,0);
  push();
  translate(width / 2, height / 2);
  rotate(2.6);
  ellipse(0, 0, 26, 18);
  pop();
  push();
  translate(width / 2, height / 2);
  strokeWeight(4);
  line(11, -5, 11, -100);
  pop();
  strokeWeight(2);
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907325/8bcbc5f7-094d-2698-6546-c188fa7f763b.png)
このようになりました。

八分音符とかは次やってみます！
M5NanoC6、スレーブI2Cで「A」を受信して遊ぶ。



目的
I2Cのテスト


いろいろ
ネットを見ているとM5NanoC6を買ってきて、直ぐに使える、
便利なアプリが全然ないと書いてあったが
便利なアプリは、自分で作るんです。「エエエェェーーー」
おもに通信系が「全然」足りないみたい。
買ってすぐ「アンテナ」にする、アプリとか
アンテナてなんじゃー、送信機、受信機もアンテナに
含まれるのか?「エエエェェーーー」
ノンコード、ローコードでI2Cで無線で送受信
もしくは、接点情報の送受信

結果

![o_coq524.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c7ba198e-30e3-4a64-eab9-e5cb07abbbbf.jpeg)

![o_coq525.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d566b002-b338-2141-7056-3b3c7d255e48.jpeg)


プログラム

受信 I2Cスレーブ M5NanoC6

```c++


//I2C_READ_A_V1_M5NanoC6_1


//インクルド
#include <Arduino.h>
#include <Wire.h>


//初期化
void setup() {

  //シリアルの初期化処理
  Serial.begin(9600);

  //i2cの初期化
  Wire.begin( (0x80)>>1 );      //I2Cスレーブアドレスの設定
  Wire.onReceive(receiveEvent); //データが来ると呼ばれる関数

} //setup


//メインループ
void loop() {
  delay(1); //ダミー
} //loop


//レシーブイベント
void receiveEvent(int howMany) {

  char c = Wire.read(); //I2C受信データの読み込み

  Serial.print(c); //一文字送信する。

} //receiveEvent


```

送信 I2Cマスター M5Stamp S3

```c++


//I2C_PUT_A_M5S3_1


//インクルド
#include <Arduino.h>
#include <Wire.h>


//初期化
void setup() {

  Wire.begin();    //I2Cの初期化

} //setup


//メインループ
void loop() {

  //'A'転送
  Wire.beginTransmission( (0x80)>>1 );
  Wire.write('A');
  Wire.endTransmission();
  delay(1000); //1秒待つ

} //loop

```
Dockerがコンテナを起動できないエラー(ポート番号のほかプロセスによる使用)

Dockerでコンテナを起動できないという事象が発生しました。
＃忘備録のためまとめています。

# 1. エラー内容
Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3913943/6ba90ae5-40c9-7851-9323-2782325807bc.png)

このエラーメッセージは、ポート番号がすでに使用されているためDockerがコンテナを起動できないことを示しています。具体的には、laravel8-tutorial-mysql-1コンテナがポート番号3306を使用しようとしたところ、すでに他のプロセスがこのポート番号を使用しているため、Dockerがコンテナを起動できなかったということです。

# 2. 原因として
ポート番号3306のコンテナを正規終了させなかったことと考えられる。

# 3. 解決策
## 3.1 使用されているポート番号を調べる
powershellから次のコードを実行すれば使用されているポート番号を調べることができます。
`Get-NetTCPConnection -State Listen` 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3913943/87758665-83a5-9970-4819-561cfd2aba06.png)
（上記のようになっているはず）
## 3.2 ポート番号を閉じる
同じくpowershellから次のコードを実行すれば使用されているポート番号を閉じることができます。
`Stop-Process -Id (Get-NetTCPConnection -LocalPort <ポート番号> -State Listen).OwningProcess -Force`
（この辺のシェルについては、具体的に何をどうしているのかあんまりわかっていません。勉強のためにgoogle先生かchatGPTに聞いて学習した内容を後程追記します・・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3913943/2282f1ad-4565-10f9-c127-c1d23f754f2b.png)
（コマンドが間違っていない限り特にメッセージ等出力されないようです）

# 4. 終わりに
ポート番号ってなんすか？？っていう状況のまま、Dockerでlaravelの環境構築を実施しました。個人開発によるDockerのハンズオン学習が狙いです。初心者の皆さん、一緒に頑張っていきましょう！
自作OS~edk2のbuildでエラーが出た話~

⚠️ この投稿は「[ゼロからのOS自作入門](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AEOS%E8%87%AA%E4%BD%9C%E5%85%A5%E9%96%80-%E5%86%85%E7%94%B0-%E5%85%AC%E5%A4%AA/dp/4839975868)」のうまくいかなかったところの解決先備忘録になります。ぜひ本書を購入して詰まった場合はこちらを試してみてください。

## 事象
edk2をインストールしてbuildを実行したところ以下のエラーが出た
```
build.py...
: error 7000: Failed to execute command
make tbuild [/home/tokage94/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/MikanLoaderPkg/Loader]


build.py...
: error F002: Failed to build module
/home/tokage94/edk2/MikanLoaderPkg/Loader.inf [X64, CLANG38, DEBUG]

Failed -
Build end time: 00:59:24, Oct.19 2024
Build total time: 00:00:01
```
→ CLANG38がないとのこと

## 解決方法
そもそもUbuntuのバージョン24でやっていたのが間違いだった。（CLANG38はバージョン18.04か20.04で動作する）
そのためMicrosoft Storeから18.04を落としてもう一回やり直した
→ 成功
（公式のGitにそう書いてあるからその通りにやれという話だった、、、ドキュメントはちゃんと読もう）

多分バージョン18.04か20.04じゃなくても`ansible_provision.yml`の中のInstall部分を変えればうまくいくのかな？（試していないからわからないけど）
```
- name: Install LLVM 14
  apt:
    name: llvm-14-dev
    state: present
```
googletransはpython 3.13で使えないらしい

# はじめに
pythonで、googletransを使えるようにしたい！

# 経緯
ここ一週間でpythonを始めました。そこでgoogletransを使って色々コードを書いてみようとしたところ、上手く処理されませんでした。

# 現状
最新のpython、バージョン3.13を脳死でインストールしました。とりあえず最新のものを入れておけばよかろうとね。

```python
from googletrans import translator
#処理↓
```
のように書いても、なぜか実行できません。



# 対応策

そこで、python 3.13について調べているとこのようなすんばらしい記事が...


https://qiita.com/t3tra/items/152b6023e47c5b09bffe#pep-594-%E5%8F%A4%E3%81%84%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E5%89%8A%E9%99%A4


この記事の「重要な削除項目」では、「cgi」という項目がpythonの最新バージョンで使えないようになっているとのことでした:open_mouth:

確かに先ほどのgoogletransを実行すると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953952/981e5683-01e3-a767-958a-9ae00d191eaf.png)

画像のように「cgi」をインポートしようとします。が、python 3.13では「cgi」は利用できないため、処理が実行されないということだと思われます。

なので、「cgi」が使えるバージョンのpythonをインストールしました。今回は何となく3.12にしました。

# googletransのバージョンも確認
googletransのバージョンがもし「3.0.0」だと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953952/7fcd7802-325d-d65a-a944-259791330900.png)

このようなエラーが出るかもしれません。バージョンが古いがゆえに、上手くAPIから情報をしゅとくできないのでしょうか...

これも対応策としては

```python
pip install googletrans==3.1.0a0
```

このバージョンのgoogletransをインストールすることで解決出来ました。

# まとめ
googletransが実行できなくてずっとモヤモヤしていました。とりあえずスタートラインに立つことができましたね:sweat_smile:

この記事がお役に立てれば幸いです。
【イベントレポート】スクラムカンファレンスの歩き方 （2024年10月18日 20:00-21:30）

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！
本日参加した「スクラムカンファレンスの歩き方」を通じて、新たな発見がありましたので、アウトプットとして技術ブログにまとめたいと思います！

:::note info 
本記事はTimee主催の[スクラムカンファレンスの歩き方]に関するイベントレポートとなります。

イベントURL：

https://timeedev.connpass.com/event/332053/

:::

# 目次
1. 読んでもらいたい方
1. 参加したきっかけ
1. イベント概要
1. セッショントーク
    - ゲスト講演「RSGTの歩き方」 @ 川口 恭伸さん
    - タイミー講演①「スクラムフェスの歩き方」@ 吉野 正義 さん
    - タイミー講演②「GSGの歩き方」@ 坂上 摩畝さん
1. 懇親会
1. まとめ
1. 参考サイト

## 読んでもらいたい方
- スクラムマスターについて興味関心がある方
- スクラムについて知りたい方
- スクラムに関するイベント情報を知りたい方

## 参加したきっかけ
参加したきっかけとして３点あります。

1. 「スクラム」に関する解像度を上げたかった
1. スクラムマスターとして活躍されている方とのコミュニケーションを図りたかった
1. タイミー本社がどうなっているのか知りたかった（すごくきれいでした！）

## イベント概要

>── 「一人ひとりの時間を豊かに」を掲げるタイミーが発信するTech勉強会
株式会社タイミーは「一人ひとりの時間を豊かに」をビジョンに掲げ、日々の開発を行っています。 今回のテーマは「スクラムカンファレンスの歩き方」です。 様々なカンファレンスがオフラインに回帰し、また多くの出会いや交流を生み出す、あの熱量が帰ってきています。スクラムカンファレンスも日本ではRSGTや各地域のスクラムフェスが盛り上がっており、スクラムの知見が広く共有されています。また、海外でもGlobal Scrum Gatheringなどが開催されており、盛り上がりを見せています。今回はそんなスクラムカンファレンスを最大限楽しむ為に「スクラムカンファレンスの歩き方」を開催します。 ゲストに一般社団法人スクラムギャザリング東京実行委員会の代表理事である川口恭伸（@kawaguti）さんをお招きして、RSGTの歩き方を教えて頂きます！ タイミーからはスクラムフェス神奈川の運営を務める吉野 正義と会社の制度を利用して今年のGlobal Scrum Gatheringに参加した坂上 摩畝が登壇し、それぞれのイベントの歩み方をお話します！

スクラムコミュニティ内で活躍されている方々のお話を聞きながら、「スクラムってなんだ？」を参加者と議論しあう、魅力たっぷりのイベントでした！（5分ほど遅れての参加でした）

## 登壇者発表

### ゲスト講演「RSGTの歩き方」 @ 川口 恭伸さん

https://speakerdeck.com/kawaguti/rsgt-walk-through

本セッションでのお話を聞いて見つけた、新たな発見として3点ありました！

1. 自己組織化が進んでいる組織は**一人一人が当事者としてコミットしていける**
    - 自己組織化が進んでいない組織だと、マネージャー（指示役）が一人一人に対してあれこれ指示を出す必要があるが、自己組織化が進んでいる組織だと、一人一人が**コミットするために何を行う必要があるのか**を考え、活動するようになります
1. 新規参入者がコミュニティになじむためには**適切な段階を踏んでいく（正統的周辺参加）**
    - コミュニティ/プロジェクトにおいて、「新規参入者がいかになじんでいくか」が重要となりますが、なじむために、ベテランとして「どのようにフォローしていくか、水準を作っていくかが」重要だと理解しました
1. **歩くときは右足と左足を交互に出す（超重要）**

### タイミー講演①「スクラムフェスの歩き方」@ 吉野 正義 さん

https://speakerdeck.com/rakuraku0615/si-nosukuramuhuesunobu-kifang

本セッションでのお話を聞いて見つけた、新たな発見として**無理はせず、一歩を踏み出していくことの大切さ**です！未知の世界に飛び込むことで、今までと見える風景が変わっていくのかなと感じました。

### タイミー講演②「GSGの歩き方」@ 坂上 摩畝さん

本セッションでも、GSGへの参加を通じて、**一歩を踏み出すことの大切さ**をお話しされていました！そのなかで、「イベントを通じたキャッチアップを行うには、一人で参加することが重要」と話されていたので、「確かに！」とうなずきました。


## 懇親会
セッショントーク後の懇親会では、スクラムマスターとして活躍されている方と「チームマネジメントの方法」や「プロダクト開発を通じてどのように価値を発揮していくか」についてコミュニケーションを図ることができました。

## まとめ
本イベントを通じて、「スクラム」に関する解像度が上がったと個人的に感じています。あわせて、今後エンジニアとしてより面白いキャリアを歩むために「アジャイル開発」に関する知識キャッチアップも行っていきたいと強く感じました！そのうえで、キャッチアップ活動を通じて得た新たな発見について記事としてアウトプットしていきたいと思います！

## 参考ブログ
参加したイベントに関するブログを投稿されている方がいらっしゃいましたのでリンクとしてまとめておきます！
私も、もっとアウトプット活動を行っていきたいと思いました！

[「スクラムカンファレンスの歩き方」に参加してきました](https://ozaki25.hatenadiary.jp/)
[スクラムカンファレンスの歩き方に参加してきた](https://aki-m.hatenadiary.com/entry/2024/10/18/234030)

最後まで記事を読んでいただきありがとうございます👍
読んでみて「良かった」と思ったら、「ハートボタン」と「ストック」をしていただけますと、泣いて喜びます！
コードレビューを依頼されやすくするには

# 概要

- 私がコードレビューをする際に気を付ける点をあげます
    - 実務では typescript がメインです
    - 「コード」を題材に扱ってますが、設計書のレビューなど、レビューと名のつくもの大抵に共通して言えることだと思います
- コードレビューの仕方によっては, それが原因でチームの空気が悪くなることもあります. チームの空気を悪くせずにコードレビューを行うことは生産性を担保することにもつながる大事な要因
- 「コードレビュー = ダメ出し」みたいな感覚を、レビューイへ与えないようにするにはどうするべきなのか、個人意見のまとめ

# ポジティブなフィードバックも忘れない

- あるあるですね. 単純に精神的な不安定さがかなり軽減します
- 「何ができていないか」を指摘しがちですが「どこまではできているか」は伝え忘れてしまうもの. 感情のない AI ですら,「何は正しかったか」というフィードバックがないと成長しないんです. 単なる感情論ではなく、「どこまではできているか」という点数を、点数を出さずに相手に伝えるための表現です
- また、レビュワーが知らなかったことを伝えるのもよきです

具体例

- 効率的な処理ですね！さらにパフォーマンスを鑑みて、--- してみて下さい
- この変数 **だけ** , 現在のままでは後から見た時に ,,,
- こんなふうに処理実現できるですね!!! :eyes: 

:::note info
自然と褒めるのがめちゃ上手い人もいますよね. もてそう
:::

# 「指摘する」というより「気づかせる」

- 自身の行動に対して、受動的に改善点に気づくのと、能動的に改善点に気づくのであれば、後者の方が心理的にプラスですし、記憶に定着しやすいのでその後の実力向上にも繋がります
- ただ、人によっては気づくのに時間がかかったりするのが難点ではあります

具体例

UI の修正が入った際に、説明欄にどこを修正したかだけ書いて、具体的にどう変化したかのキャプチャがなく、私としては (どう変化したのか、どうせ作業する時のついでにキャプチャ載せといて欲しい) と思っており

> 動作確認したついでに、変化内容のキャプチャメモっときますね

と、PR にコメントで載せておいたところ、そのうち PR 発行者が説明欄に貼ってくれるようになりました。

:::note warn
具体例は「遠回しの指摘」になりうるので, 関係性のよってはあまり理想的な例ではないかもです
:::

:::note warn
これに関しては「理想論」に近いので、全てが能動的に気づかせるのは時間かかって現実的ではないです.
:::

# レビュイーが判断すべきことを増やさない, 残さない

- 端的に言えば、「対応しないといけないの？別にいいの？」とレビューイに思わせないこと
- 「ほんとはここはこうしたほうがいいんだが、やれって言うには些細すぎるしな,,,」という動機から、つい「〜してみてもいいですね」なんて言い方をしてしまいがちですが、そのコメントを受け取る側は対応に困ります。「判断する」という思考リソースをいたずらに増やさないこと。
    - もちろんチーム内の言葉の文化にもよります。「〜してもいいですね」が、実質 MUST 対応で浸透してるならそれでいいと思います。
    - ただ、新規参画メンバーはそんなこと知らなったり、長くいるメンバーでも実は曖昧だったりするので、はっきりどっちの対応か伝えるようにすべきというのが個人意見です。
- 自分がコード品質管理のポジションを担っている以上、この修正は「今してほしい」or 「タスク化して後でまとめてしよう」かを明確に伝えましょう

:::note warn
でもつい判断まかせちゃいがちだよね. わかる
:::

# 客観的判断に基づいた意見を出すように意識

- 「このままでは **わかりにくい** ので」や「**読みにくい**」は、主観に基づいた意見のように見えます
- 実際、それは**自分だけが思っている**可能性があります. 他の人が見た時や、将来の自分が見た時も納得できるような、客観的根拠と主にコメントするとよい
- もし主観的な意見の場合、その旨も一緒に伝えるとよき

具体例

```typescript
const isShow = ... // <- 何を show するかどうかのフラグなのかわからないので、 isShowBtn と明示的な名前にしてください

interface ComponentProps {
  setData: (data: unkown) => void // <- Component の Props で イベントハンドラーは on* という命名規則が通例です (React がどっかで資料出してます)
}
```
または、コメント時に

> 個人的な感覚で恐縮ですが、...

と添える

# とりあえず全てのコメントにリアクションしとく

- コメントでなくとも、 :thumbsup: や :bow: :tada: あたりを残すだけでも印象かなり変わります. コードレビューに限った話ではなく、slack 等の社内コミュニケーションにおいても同じですが

# 結論

仲良く開発したいが、仲良しこよしで終わらず、互いに切磋琢磨したい
css gridレイアウトが思い通りに適応できなかった

# 背景

gridレイアウトに初挑戦したが、めちゃめちゃ初歩的なことで躓いたので備忘録として残します。

# gridレイアウトとは

マス目状の領域を用意して、子要素を配置する機能となんとなく理解した。

https://qiita.com/kura07/items/e633b35e33e43240d363

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_grid_layout/Basic_concepts_of_grid_layout

# 上手くいかなかった例

box1の位置に、すべてのdiv要素が押し込まれる形になってしまった。

```css:css
.link-box {
  display: grid;
  column-gap: 2rem;
  grid-template-rows: 1fr 1fr;
  grid-template-columns: 2rem 1fr;
  grid-template-areas:
    "box1 box2"
    "box1 box3";
  .box1 {
    grid-area: box1;
  }
  .box2 {
    grid-area: box2;
  }
  .box3 {
    grid-area: box3;
  }
}
```

``` html: html
<%= link_to @shop.link1, class: "link-box" do %>
  <% if @shop.link1 %>
      <div class="box1"><span class="fa-duotone fa-solid fa-link fa-size"></span></div>
      <div class="box2"><%= @shop.link1_comment %></div>
      <div class="box3"><%= @shop.link1 %></div>
  <% end %>
<% end %>
```

# 原因

以下の記事に記載があるように、「直接の子要素」がアイテムとみなされるため、``if``-``end``で囲われた範囲が一つのアイテムとみなされていた。

> アイテム
コンテナの子要素です。コンテナの直接の子要素は基本的にすべてアイテムになります。
> ```html:
><div style="display:grid;"> <!-- コンテナ -->
>	<div></div> <!-- アイテム-->
>	<p></p> <!-- アイテム -->
>	<section> <!-- アイテム -->
>		<div></div> <!-- これはアイテムではない -->
>	</section>
></div>
>```

https://qiita.com/kura07/items/e633b35e33e43240d363

# 修正内容

div要素それぞれが、コンテナの直接の子要素となるように修正した。

``` html: html
<% if @shop.link1 %>
  <%= link_to @shop.link1, class: "link-box" do %>
      <div class="box1"><span class="fa-duotone fa-solid fa-link fa-size"></span></div>
      <div class="box2"><%= @shop.link1_comment %></div>
      <div class="box3"><%= @shop.link1 %></div>
  <% end %>
<% end %>
```
自作OS~WSLでQEMUを使う~

⚠️ この投稿は「[ゼロからのOS自作入門](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AEOS%E8%87%AA%E4%BD%9C%E5%85%A5%E9%96%80-%E5%86%85%E7%94%B0-%E5%85%AC%E5%A4%AA/dp/4839975868)」のうまくいかなかったところの解決先備忘録になります。ぜひ本書を購入して詰まった場合はこちらを試してみてください。

## 下準備
1. https://sourceforge.net/projects/vcxsrv/ からXサーバーをダウンロードし、本に従ってインストール
2. 以下を順に入れる（OS名とか自分で入れたいのであれば書き換える）
```
$ sudo apt install qemu-kvm
$ sudo apt install dosfstools
$ qemu-img create -f raw disk.img 200M
$ mkfs.fat -n 'HOGE OS' -s 2 -f 2 -R 32 -F32 disk.img
$ mkdir -p mnt
$ sudo mount -o loop disk.img mnt
$ sudo mkdir -p mnt/EFI/BOOT
$ sudo cp /mnt/c/BOOTX64.EFI mnt/EFI/BOOT/BOOTX64.EFI
$ sudo umount mnt
```
※ `$ sudo mount -t drvfs C: /mnt/c`に関して、自分はwindowsCドライブ直下にEFIファイルを入れていたからマウントしています

## 結果
ウィンドウが出た後、1分ほど待ったらHello. world!が出た
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230737/703e40a9-7d9c-98aa-edc0-d39c0e872c3c.png)


## トラブルシュート
ディスクイメージをQEMUで起動しようとしたら以下のエラーが出た
確かにそんなものを$HOME配下に入れた覚えはない
```
MESA: error: ZINK: failed to choose pdev
glx: failed to create drisw screen
qemu-system-x86_64: -drive if=pflash,file=XXXX/OVMF_CODE.fd: Could not open 'XXXX/OVMF_CODE.fd': No such file or directory
```

**解決**
公式gitに答えが書いてあった
```
$ sudo apt update
$ sudo apt install git
$ cd $HOME
$ git clone https://github.com/uchan-nos/mikanos-build.git osbook
```
アソシエーションについて【備忘録】

### テストでコメントくれた方ご教授有難う御座いました（削除しました）
##############################################################

フリマアプリのコードを書いています。
アソシエーションで1体多、他対他はありましたが、**一対一**は初めてなので残しておくつもりで書きました。

アソシエーションはお互いのmodelsに記述する。
1体1の時は親（何にも依存しない単独存在可）のほうに**has_one** を記述し、子のほうに**belongs_to**を記述する。

```ruby
app/models/user.rb #ユーザーは複数itemsを販売しaddresses(発送先住所)は1つ。Buyer_recordは1つ。
has_many :items
belonds to :address
has_many :buyer_record

app/models/item.rb　
has_one :buyer_record
belongs_to :user
has_one :addresses

app/models/buyer_record
belongs_to :item
has_one :addresses
belongs_to :user

app/models/addresses #userとアソシエーション必要？
belongs_to :buyer_record
belongs_to :items
has_one :user
```
[tips:cpp][ProblemSolver] 広義単調増加数列の生成

※tipsはちょっとした実装をまとめていくものです。

# 広義単調増加数列

サクッと広義単調増加数列を作りたい時。

```math
\{ A_i \in \mathbb Z\ \mid A_1<= A_2 <= A_3 \cdots <= A_N\}
```

こういうのを生成する実装。上限値をMとするとこんな感じ。

`M = 3`、`N = 5`として、$1 <= A_i <= 3$となる数列を生成します。

```cpp
using namespace std;
#include <iostream>

int N = 5;
int M = 3;
void dfs(vector<int> &A) {
  if (A.size() == N) {
    // 数列
    for (int i = 0; i < A.size(); i++)
      cout << A[i];
    cout << endl;
    return;
  }

  // 1.末尾の値を取得
  int prev_last = 0;
  if (A.size() == 0) {
    prev_last = 1;
  } else {
    prev_last = A.back();
  }

  // 2.末尾の値以上にする
  for (int i = prev_last; i <= M; i++) {
    // トラックバック
    A.push_back(i);
    dfs(A);
    A.pop_back();
  }
  return;
}

int main() {
  vector<int> A; // 空の配列
  dfs(A);
  return 0;
}
```

output
```cpp
11111
11112
11113
11122
11123
11133
11222
11223
11233
11333
12222
12223
12233
12333
13333
22222
22223
22233
22333
23333
33333
```

補足
<details><summary>広義単調増加の制約なしの場合(loopの初期値を1にするだけ)</summary>

```cpp
using namespace std;
#include <iostream>

int N = 5;
int M = 3;
void dfs(vector<int> &A) {
  if (A.size() == N) {
    // 数列
    for (int i = 0; i < A.size(); i++)
      cout << A[i];
    cout << endl;
    return;
  }

  for (int i = 0; i <= M; i++) {
    // トラックバック
    A.push_back(i);
    dfs(A);
    A.pop_back();
  }
  return;
}

int main() {
  vector<int> A; // 空の配列
  dfs(A);
  return 0;
}
```

</details>
【Next.js】useSelectedLayoutSegmentの使い方

## `useSelectedLayoutSegment`とは

`useSelectedLayoutSegment`を使用すると現在のレイアウトセグメントが取得できます。
異なるレイアウトに基づいてコンポーネントの表示を切り替えることができます。

## 使い方

`useSelectedLayoutSegment`を使用するには、まずNext.jsのコンポーネント内でインポートします。

```jsx
import { useSelectedLayoutSegment } from 'next/navigation';
```

次に、このフックを呼び出して、現在のレイアウトセグメントを取得します。

```jsx
const segment = useSelectedLayoutSegment();
```

この`segment`は、現在のレイアウトセグメントを表す文字列です。これを使用して、条件に応じたコンポーネントのレンダリングを行うことができます。

## 例


```jsx
'use client'
 
import Link from 'next/link'
import { useSelectedLayoutSegment } from 'next/navigation'
 
export default function BlogNavLink({
  slug,
  children,
}: {
  slug: string
  children: React.ReactNode
}) {
  const segment = useSelectedLayoutSegment()
  const isActive = slug === segment
 
  return (
    <Link
      href={`/blog/${slug}`}
      style={{ fontWeight: isActive ? 'bold' : 'normal' }}
    >
      {children}
    </Link>
  )
}
```

この例では、`segment`の値に応じて、`Link`のスタイルを変更しています。
投稿 110 PostgreSQL 2024/10/18

本日の勉強時間　1H

PostgreSQLは、拡張性とSQL準拠を強調するフリーでオープンソースの関係データベース管理システム。

アプリケーションで頻繁にデータを更新する必要がある場合は、PostgreSQL の方が適しています。 ただし、頻繁にデータを読み取る必要がある場合は、MySQL の使用をお勧めします。
ssh ログオンした状態で Raspberrypi OS の対話的初期設定を終わらせる

# ssh ログオン時の問題

「RaspberryPi OS Lite を CUI でインストールしてヘッドレスでログイン」
https://qiita.com/nanbuwks/items/263e21451d230deeb62c
の設定をした後に、ssh でログオンした状態で

```
$ sudo raspi-config
```
としようとしても、

```
 1 System Options       Configure system settings                                       
```
あたりをしようとしたら、
```
 There was an error running option L1 Locale           
```
というエラーが出てうまく行かない。
```
$ sudo dpkg-reconfigure locales
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
```

# リアルコンソールで走っている初期設定プログラム

調べてみると、キーボード設定がリアルコンソールで走っている。

```
$ ps -auxww | grep config
root      1055  3.1  3.3  21388 14640 tty8     S+   07:15   0:09 /usr/bin/perl -w /usr/sbin/dpkg-reconfigure -p critical keyboard-configuration
```
これは /usr/lib/userconf-pi/userconf-service が動作しているため。


systemctl  を見てみると、
```
 userconfig.service   (略)     loaded activating start     start User configuration dialog
```
となっていて、

`/lib/systemd/system/userconfig.service`
の中身が以下のようになっている。

```
[Unit]
Description=User configuration dialog
After=systemd-user-sessions.service
Before=lightdm.service
[Service]
Type=oneshot
ExecStart=/usr/lib/userconf-pi/userconf-service
StandardInput=tty
Restart=on-failure
TTYPath=/dev/tty8
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
[Install]
WantedBy=multi-user.target
```

なので、 userconf-service や dpkg-reconfigure を kill しても復活してしまう。

# 初期設定プログラムを ssh 上で行う

この問題に対処するためには、以下のようにする。

一旦サービスを停止。

```
$ sudo systemctl stop userconfig.service
```

そのうえで、`/usr/lib/userconf-pi/userconf-service` を適当にコピーして、以下の箇所をコメントアウト。
```
    if [ -t 0 ]; then
        chvt "$VT"
    fi
```
この下にも、chvt を行っているところがあるのでそこもコメントアウト。


書き換えたスクリプトを実行し、終わらせます。

再起動すれば、初期設定プログラムが再度走ることがなくなります。
「まみ うりう いっしゅー すきー」はUniversal Dependenciesで書けるのか

「まみ うりう いっしゅー すきー」(mami, uri=u issjuː sïkiː)という文に、たまたま触れる機会があったのだが、正直、悩みこんでしまった。私(安岡孝一)の感覚としては、名詞「まみ」を代名詞「うり」で受け直しているのだから、「うり」が形式目的語で、「まみ」が目的語のように思える。その方針で、何とかUniversal Dependenciesで書いてみよう。

```
# text = まみ うりう いっしゅー すきー
1	まみ	_	NOUN	名詞-普通名詞-一般	_	6	obj	_
2	うり	_	PRON	代名詞	_	6	expl	_	SpaceAfter=No
3	う	_	ADP	助詞-格助詞	_	2	case	_	_
4	いっ	_	NUM	名詞-数詞	_	6	nummod	_	SpaceAfter=No
5	しゅー	_	NOUN	名詞-普通名詞-助数詞可能	_	4	clf	_	_
6	すきー	_	VERB	動詞-一般	_	0	root	_	_
```

![irav.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/a6100f64-4504-2940-a4c0-280c03d7a3df.png)

ただし、下地理則は、この事象を左方転移(left dislocation)とみなしているので、だとすると「まみ」をdislocatedで、「うり」をobjで繫いだ方が適切かもしれない。うーむ、難しいなあ。
～未経験・知識なしでセキュリティエンジニアになる人！～『{Level5}MySQL 学習開始！システムエンジニアらしいターミナル画面にワクワク！』

こんばんは！IT未経験からセキュリティデフエンジニアになる！itoshinです。

今日からデータベースに触れる、SQLの操作に入りました。
まず、データベースってなに？

### データベース（DB）とは
+ 『コンピュータに蓄積されたデータの集合』のこと
+ 無造作に集められたものではなく、”目的”を持って蓄積したデータ群
+ しばしば文脈によって、広義的に、狭義的に解釈されることがある
+ 1.データを蓄積する箱 2.DBMS（データベース管理システム）を含めたもの　3.前述の2とこれにアクセスする検索アプリを含めたもの

### DBMS(DataBase Management System)とは
+ データベースの妥当性や整合性のチェック
+ 複数のユーザが使用する場合の権限管理
+ 複数のユーザがデータを変更しようとした場合に起こり得る矛盾の回避
+ 『データベースを正しく運用、データを安全に保管するためのソフトウェア』

今回私が学習開始したMySQLもDBMSの一種です。

### データベースの種類はどんなものがあるか
+ 主流となっているリレーションデータベース(RDB)
+ データがツリー構造でアクセスが簡単な階層型データベース
+ 階層型データベースの発展型のネットワーク型データベース
+ XML形式のデータを格納でき、タグ形式でデータを表現できるネイティブXMLデータベース
+ 名前の通りデータをキー項目/値のセットで管理するKey-Value型データベース

主流のRDBと、クラウドで利用されることが多いKey-Value型データベースは押さえておきたい
ここからは主流のRDBについて触れていく

###RDB（リレーショナルデータベース）とは
+ Excelのワークシートのような表形式でデータを格納する。これをテーブルという
+ テーブルに格納されている各データをレコードという
+ レコードに含まれるそれぞれの項目をフィールド、またはカラム（列）という
+ 関連するレコードごとに、異なるテーブルに分割して情報を管理できる
+ 複数のテーブル内のそれぞれのレコードを識別（関連付け）するためのキー（主キーと外部キー）がある
+ 主キーと、それに関連する他のテーブルに用意された参照用のキーが外部キー

### RDBの種類
+ 現在最も利用されてる商用DBの『Oracle』
+ Windows環境でシェアが高い『Microsoft SQL Server』
+ パフォーマンスの高さが評価される『MySQL』
+ MySQLから派生したDBでLinuxでの標準採用が増加『MariaDB』
+ 国内での人気が高いオープンソースDB『SQLite』
+ Microsoft Officeに含まれる個人用途のDB『Microsoft　Access』

MySQLはOracle社に買収された過去がありながらもサービスを潰されなかったというのだから、それだけの価値を見出されたのかもしれませんね。
買収されたMySQLを尻目に派生させてMariaDBが生まれた歴史も面白い！
以降は私が学ぶMySQLについてアウトプットしていきますよ！

### MySQLの構造
+ 無償のDBMS。複数のデータベースを配置できる
+ データベースの中身はテーブル、DB用の索引機能であるインデックス、レコードの見せ方を表現するビューで構成される
+ 初期装備されているデータベースが4つ（infomation_schema, mysql, performance_schema, sys）。これらはMySQLの動作に関わるため削除やレコードの保存先にしてはならない！
+ データベースを操作するためのツールが６つ（mysql, mysqladmin, mysqldump, mysqlimport, mysqlcheck, mysqlshow）。
+ よく使うのがmysql(mysqlクライアント)。入力コマンドをMySQLに伝え、結果を人間に分かりやすく表示してくれるツール
+ mysqladminはデータベースの作成/削除をはじめ、管理系操作を司るツール
+ mysqldumpはデータベースの内容をテキストファイルとして出力するツール
+ mysqlimportはテキストファイルをデータベースにインポートするツール
+ mysqlcheckはデータベースの検査や修復、最適化を行うツール
+ mysqlshowはデータベース、テーブル、カラムの情報を取得するツール

ここまでで記事制作1時間50分
そろそろ眠いのと、この後はターミナル（パワーシェル）でのコマンド操作なので、説明（見せ方）を工夫したいな。
よって今日はここまで。おやすみなさい！
自作OS~hello worldを出力してみる~

⚠️ この投稿は「[ゼロからのOS自作入門](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AEOS%E8%87%AA%E4%BD%9C%E5%85%A5%E9%96%80-%E5%86%85%E7%94%B0-%E5%85%AC%E5%A4%AA/dp/4839975868)」のうまくいかなかったところの解決先備忘録になります。ぜひ本書を購入して詰まった場合はこちらを試してみてください。

## 事象
USBに`BOOTX64.EFI`を入れたものの起動できない

## やったこと
1. secure bootをdisable
2. USB BOOTの優先順位を一番上

## 使用端末
1. Frontier
2. TOSHIBA dynabook

## 解決策（Frontier）
設定→詳細オプション→回復→PCの起動をカスタマイズで再起動しUSBを起動したところうまくいった

## 解決策（TOSHIBA dynabook）
BIOSのアップデートをしたらうまくいった
AWS のリソース削除がちょっとだけ便利になる方法

AWS のマネジメントコンソールでリソースを削除する際に「削除してもよいですか？」の確認ダイアログが表示されますが、"**削除**"や**リソース名**などの文字列を入力すると削除ボタンが活性化して、削除ができるようになる場合があります。

・S3 のファイルを削除する場合の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759747/564e68e8-01e9-36e7-bd5b-0fe344c94013.png)

・IoT Core のデバイス（モノ）を削除する場合の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759747/8e9815a7-63ef-d066-ae19-2a9479c666ca.png)

素直にキーボードで文言を入力しても良いのですが、マウスで文字列を選択して入力エリアまでドラッグすると簡単に文字列の入力ができます。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759747/d00fad35-d960-b668-a094-47a38374b0f4.gif)

マウスだけで完結しますので、長いリソース名の入力を要求された場合は特に重宝するかと思います。
メモ：github actions上でuvでタスク実行するときの最低限のyaml

# 概要
GitHub Actionsでuvを使用する方法についてのメモです。uvコマンドをGitHub Actionsで実行するための基本的なyamlファイルを考察しました。

# YAMLファイル

このYAMLファイルは、mainブランチにプルリクエストが出された際にpytestを実行するためのものです。
作成にあたっては、[uvの公式ガイド](https://docs.astral.sh/uv/guides/integration/github/)を参考にしています。

```yaml
name: PythonTest

on:
  pull_request:
    branches:
      - main  # ここでPRをトリガーするブランチを指定

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4

    - name: Install uv
      uses: astral-sh/setup-uv@v3
      with:
        enable-cache: true

#    - name: Set up Python
#      uses: actions/setup-python@v5
#      with:
#        python-version-file: '.python-version'  # 使用するPythonのバージョンを指定

#    - name: Install dependencies
#      run: uv sync --all-extras --dev

    - name: Run tests
      run: uv run task test
```

以下は、ステップの概要です。

- リポジトリのクローン
- uvのインストール
- Pythonのインストール（現在はコメントアウト）
- uv環境への依存関係のインストール（現在はコメントアウト）
- pytestの実行（uv run task testを使用してtaskipy経由で実行）

taskipyの設定は、pyproject.tomlに以下のように記述されています。

```toml:pyproject.toml(抜粋)
[tool.taskipy.tasks]
test = "pytest"
```

# QA
## Pythonのインストールとuv syncは必要？
現時点では不要のようです。コメントアウトしてもGitHub Actionsで問題なく実行できました。uvの公式ガイドにはPythonのインストールとuv syncが記載されていたため、最初は一応記述しましたが、ローカル環境ではuv runを実行するだけで、pyproject.tomlからPythonのバージョンや依存関係を自動的に読み取ってくれるので、いらないのではと思いました。試しにコメントアウトしたところ正常に動作しました。ただし、キャッシュの影響も考えられるため、もう少し様子を見たいです。

## Taskipyのタスクも設定できますか？
可能なようです。Run testsステップで`uv run task test`が正常に実行されています。もちろん、`uv run pytest`のように直接コマンドを書いても問題ありません。テスト以外にも`uvx ruff check .`なども実行可能です。`uv publish`が実行できるかは試していませんが、試したいです。PyPIにこのコマンドで公開できると便利そうです。

taskipyを使用するかどうかについては、使用することでworkflowのYAMLファイルとpyproject.tomlでコマンドを二重管理せずに済むため、利点があると考えています。ただし、YAML内でコマンド情報が完結しないため、それを嫌うケースも考えられます。

# 結論
github actionsでのuv利用について、uvのインストールが完了すれば、ローカル環境と同じ感覚でuvコマンドを記述できるため、非常に快適そうでした。
Docker CLIのためにTask（Go Task Runner）をインストールし、タスク管理を簡素化する

こんばんは。

今日は「Docker CLIのためにTask（Go Task Runner）をインストールし、タスク管理を簡素化する」について説明いたします。

Docker CLIのためにTask（Go Task Runner）をインストールし、タスク管理を簡素化するためのプロセスは次の通りです。Taskを使うことで、Taskfile.ymlを作成して、Dockerの操作をスクリプト化したり、Docker CLIをカスタムコマンドとして定義することができます。

以下は、Taskをインストールし、Docker CLIをTaskで管理する手順です。

# Taskのインストール

まず、Taskをインストールします。TaskはGoで書かれたTask Runnerで、各種タスクを簡単に実行するために使用できます。

## MacOS / Linux の場合:

```bash
sudo sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d
```

## Windowsの場合 (Chocolateyを使用):

```bash
choco install task
```

## Homebrewでインストール (MacOS, Linux):

```
brew install go-task/tap/go-task
```

# Taskfileの作成

Taskがインストールされたら、プロジェクトディレクトリにTaskfile.ymlという名前のファイルを作成します。このファイルに、Docker CLIを使ったコマンドを定義します。

例えば、以下のようにTaskfile.ymlを設定します。

Taskfile.ymlの例
```yaml
version: '3'

tasks:
  build:
    desc: Build a Docker image
    cmds:
      - docker build -t myapp .

  run:
    desc: Run the Docker container
    cmds:
      - docker run -d --name myapp-container myapp

  stop:
    desc: Stop the running Docker container
    cmds:
      - docker stop myapp-container
      - docker rm myapp-container

  logs:
    desc: Display logs from the container
    cmds:
      - docker logs -f myapp-container

  clean:
    desc: Remove all stopped containers and dangling images
    cmds:
      - docker system prune -f
```

# Taskコマンドの実行

Taskfileに定義されたタスクは、以下のように簡単に実行できます。

## Dockerイメージをビルドする:

```bash
task build
```

## コンテナを実行する:

```bash
task run
```

## コンテナを停止する:

```bash
task stop
```

## コンテナのログを表示する:

```bash
task logs
```

## 不要なコンテナやイメージをクリーンアップする:

```bash
task clean
```
# 必要に応じたTaskfileのカスタマイズ

Taskfile.ymlは、必要に応じてカスタマイズできます。たとえば、環境変数の使用、依存関係タスクの設定、動的コマンド実行など、柔軟なタスク管理が可能です。

環境変数を使用した例

```yaml
version: '3'

tasks:
  build:
    desc: Build a Docker image
    vars:
      IMAGE_NAME: myapp
    cmds:
      - docker build -t {{.IMAGE_NAME}} .

```

# まとめ

これでTaskをインストールし、Taskfileを使用してDocker CLIのタスクを自動化する基本的な環境が整いました。このセットアップにより、Dockerの一般的な操作をTask経由で管理できるため、複雑なコマンドをシンプルに実行できるようになります。

今日は以上です。

ありがとうございました。
よろしくお願いいたします。
ハッシュ関数とは？仕組みと暗号化との違いをわかりやすく解説！

# はじめに
ハッシュ関数という言葉を聞いたことがある方も多いかもしれません。ハッシュ関数は、セキュリティ分野だけでなく、データベースやアルゴリズムの最適化でも広く使われています。本記事では、ハッシュ関数の仕組みや具体例を交えながら解説し、暗号化との違いについても説明します。

# ハッシュ関数とは？
ハッシュ関数とは、**任意の入力データを固定長のデータ（ハッシュ値）に変換する関数**です。特徴的なのは、入力がどれだけ長くても、常に一定の長さの出力を返す点です。また、同じ入力に対しては常に同じハッシュ値を返しますが、異なる入力に対してはできるだけ異なるハッシュ値を返すように設計されています。

### ハッシュ関数の特徴
- **固定長の出力**：入力データの長さに関わらず、出力されるハッシュ値は常に一定の長さです。たとえば、SHA-256というハッシュ関数は、どんなに大きなデータでも256ビットのハッシュ値を生成します。

- **同じ入力は常に同じハッシュ値を返す**：同じデータをハッシュ関数にかけると、毎回同じ結果が得られます。

- **微小な変化で大きく異なるハッシュ値**：入力データがほんの少しでも変われば、出力されるハッシュ値は大きく異なります。これを「Avalanche効果」と呼び、ハッシュ関数の重要な特性です。

- **一方向性**：ハッシュ関数は「一方向性」を持っており、ハッシュ値から元の入力データを復元することは基本的にできません。

### ハッシュ関数の具体例
例えば、以下はSHA-256を使って文字列をハッシュ化した例です。

```ruby
require 'digest'

input = "hello world"
hash_value = Digest::SHA256.hexdigest(input)

puts hash_value
# => b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
```
同じ「hello world」という入力は常に同じハッシュ値を生成しますが、1文字でも違うとまったく異なる結果になります。

```ruby
input = "hello worlD"
hash_value = Digest::SHA256.hexdigest(input)

puts hash_value
# => 519fd0f684972f4eaa0946cc880198619d11c1f2f026d8f84ab080ad54f72c1a
```
このように、入力が少し変わっただけでもハッシュ値は大きく変化します。

# ハッシュ関数の用途
### 1. データの整合性確認
ハッシュ関数は、ファイルやデータが改ざんされていないか確認するために使われます。例えば、ダウンロードしたファイルのハッシュ値を比較することで、途中でデータが壊れていないかを確認できます。

### 2. パスワードの保存
パスワードをそのまま保存するとセキュリティリスクが高いですが、パスワードのハッシュ値を保存することで安全性が向上します。ユーザーがログインする際には、入力されたパスワードをハッシュ化し、保存されたハッシュ値と比較します。

### 3. ハッシュテーブル
ハッシュ関数は、データ構造の効率化にも役立ちます。ハッシュテーブルは、キーと値のペアを効率よく管理するために使われ、ハッシュ関数によって高速な検索が可能になります。

# ハッシュ関数と暗号化の違い
ハッシュ関数と暗号化は、データを変換する技術という点で似ていますが、目的や仕組みは大きく異なります。

|特徴|	ハッシュ関数|	暗号化|
| ---- | ---- | ---- |
|一方向性	|一方向（元のデータに戻せない）|	双方向（復号して元に戻せる）
|目的	|データの整合性確認、要約生成	|機密データを第三者から守ること
|復元可能性	|不可能（不可逆）	|可能（復号キーを使えば元に戻せる）
|用途	|パスワード保存、データの改ざん防止	|機密性の高いデータの保護（通信や保存）

# 暗号化とは？
暗号化は、**データを第三者に見られないようにするために、元のデータを変換する技術**です。暗号化されたデータは、特定の鍵を使って再び復号することが可能です。たとえば、Webサイトの通信を保護するHTTPSは、暗号化を使用しています。

### 暗号化の例：AES
```ruby
require 'openssl'

# 暗号化の設定
cipher = OpenSSL::Cipher::AES.new(128, :CBC)
cipher.encrypt
key = cipher.random_key
iv = cipher.random_iv

# データの暗号化
encrypted = cipher.update("secret message") + cipher.final

# 復号の設定
decipher = OpenSSL::Cipher::AES.new(128, :CBC)
decipher.decrypt
decipher.key = key
decipher.iv = iv

# 復号
decrypted = decipher.update(encrypted) + decipher.final
puts decrypted  # => "secret message"
```
この例では、暗号化と復号ができることが分かります。暗号化はデータの保護が主な目的であり、元に戻す（復号する）ことが可能です。

# ハッシュ関数と暗号化の使い分け
- **ハッシュ関数**は、元に戻す必要がないデータ、つまり「確認」や「検証」を目的とする場合に使われます。たとえば、パスワードの保存やデータ改ざんの防止に利用されます。

- **暗号化**は、データの「保護」を目的とし、第三者がデータを読めないようにしながらも、後で元に戻せる必要がある場合に使われます。例として、機密情報のやり取りや安全な通信が挙げられます。

# ハッシュ関数のセキュリティ問題
ハッシュ関数が万能というわけではなく、弱点も存在します。例えば、**衝突攻撃**と呼ばれる、異なるデータから同じハッシュ値を生成する攻撃が問題になることがあります。そのため、ハッシュ関数の選定は慎重に行う必要があります。現在では、SHA-256やSHA-3のようなより安全なアルゴリズムが推奨されています。

# まとめ
ハッシュ関数は、データを固定長のハッシュ値に変換する不可逆的な技術であり、主にデータの整合性確認やパスワードの保存に使われます。暗号化との違いは、ハッシュ関数が一方向性で元に戻せない点にあります。一方、暗号化はデータの保護が目的で、復号可能なものです。

適切なハッシュ関数や暗号化手法を選び、データの保護やセキュリティを強化しましょう。

# 参考文献
[[暗号技術入門] ハッシュ関数](https://tex2e.github.io/blog/crypto/cryptography-hash-functions)
paizaラーニング問題集「【全探索 3】+1, -1, '1'+, +'1'」を解いてみた

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__lucky_number

▼考え方

この問題を解くために私が考えた内容1.～3.を以下に示します。

1.占い師が宣言したN個の自然数X_1,...,X_Nのうち、2つを選びます。2重のfor文を使用することで、すべての組合せを求めることができます。

2.選ばれた2つの自然数に対して、題意の通り操作を行います。操作はGet_min_diffabs関数で行います。

2.1.選ばれた2つの自然数に対して、題意の通り合計25回(5*5)の操作を行います。題意にある"おこなわなくても良い"は、0を加算するとします。

3.Get_min_diffabs関数から返却された最小値の中から、さらに最小値を求め、ラッキーナンバーとして出力します。

▼コード
```py
# 考え方2.
def Get_min_diffabs(A,B):

    # A,P_A: 選ばれた2つの自然数の1つ目, その自然数の操作後の数
    # B,P_B: 選ばれた2つの自然数の2つ目, その自然数の操作後の数

    # diffabs: 操作を1回実施した後の、2つの数の差の絶対値を格納する変数
    diffabs = 0

    # min_diffabs: diffabsの最小値を格納する変数
    min_diffabs = 1100000

    # 考え方2.1.
    for i in range(5):
    
        for j in range(5):
            
            if i == 3:
                P_A = int(XP[3]+str(A))
            elif i == 4:
                P_A = int(str(A)+XP[3])
            else :
                P_A = XP[i]+A

            if j == 3:
                P_B = int(XP[3]+str(B))
            elif j == 4:
                P_B = int(str(B)+XP[3])
            else:
                P_B = XP[j]+B

            diffabs = abs(P_A - P_B)
                
            if diffabs < min_diffabs:
                min_diffabs = diffabs

    return min_diffabs

########## 処理0(準備) インプット,リスト定義 ###########

N = int(input())

X = [0]*N

# XP: 自然数X_1,...,X_Nに対する操作を定義するリスト
XP = [0,1,-1,'1']

# tmp_lucky_numbers: 選ばれた2つの自然数に対して操作をすべて実施した後の、2つの数の差の絶対値の最小値を、順番に格納していくリスト
tmp_lucky_numbers = []

for i in range(N):
    X[i] = int(input())

########## 処理1 ラッキーナンバーの計算、出力処理 ###########

# 考え方1.
for i in range(N):
    for j in range(i+1,N):
        # 考え方2.
        tmp_lucky_numbers.append(Get_min_diffabs(X[i],X[j]))

# 考え方3.
print(min(tmp_lucky_numbers))
```
状態遷移図とアクティビティ図の違い

なお、「ステートマシン図」や「状態マシン図」は、UMLでの状態遷移図の呼称で、基本的には同じ意味らしい。

### 違うところ

|  | 状態遷移図 | アクティビティ図 |
| --- | --- | --- |
| 四角 | 状態/ステート | アクティビティ（動作を記述） |
| 矢じるし | 遷移（条件を記述） | フロー（フローチャートと同様） |

こうやって解釈することもできる：

|  | 状態遷移図 | アクティビティ図 |
| --- | --- | --- |
| 状態 | 四角（ステート）に記述 | 四角（アクティビティ）に記述してもいい*1 |
| 動作 | 矢印に記述してもいい*2 | 四角（アクティビティ）に記述 |

*1: アクティビティは動作の記述が趣旨。動作の一環として状態管理をしてもいい。
*2: 矢印には、条件の記述が必須だが、動作の記述は必須ではない。動作は、時間管理に影響を及ぼさないものに限る。

### 同じところ

| フロー | タイミング |
| --- | --- |
| 矢印にたどって時間が進み、矢印をさかのぼることはない。 | 矢印を超えるときは、一瞬。 |
【基本情報】独学マラソン LTE Day 18

リスクを取らないことが最大のリスク

:::note worn
この記事は自分用の備忘録です。
:::

# 5G時代にLTEってまだ使われてんの？

https://news.yahoo.co.jp/articles/2fdf26026de92456ea628d7d32ba4b1302655b86

どうやらまだ完全5Gにはならないらしい

# LTEについて深ぼる
### 概要
LTE (Long Term Evolution)は4G通信規格の主要技術
3Gから大幅に速度と安定性を向上させた通信技術
LTEの登場で、動画のストリーミングや高品質な音声通話が可能になった

### 技術
- MIMO (Multiple Input Multiple Output)方式を使い、複数のアンテナの同時使用で通信の高速化を実現
- パケット交換方式なので、効率が良い
- 3GPPというモバイル通信技術の標準化を行う国際的な組織で策定された規格

### 課題
4K動画やARなど通信データ量が多いコンテンツは辛い
遅延が許されない遠隔医療やFPSとかでも辛い

# 5Gについて深ぼる

### 概要
5Gは、第5世代移動通信システムで、LTEの次世代規格  
超高速通信、低遅延、高密度接続を実現する通信技術  
自動運転やスマートシティ、VR/ARなど新たな産業を支える基盤

### 技術
- **Massive MIMO**を採用し、数十本以上のアンテナを使った大容量通信が可能
- **ミリ波とサブ6GHz**を利用し、高速な通信と広範囲のカバーを両立
- **ネットワークスライシング**で、用途に応じた仮想ネットワークの分割が可能

### 課題
- インフラ整備にコストがかかる
- ミリ波は電波の伝播距離が短く、建物内や地方でのカバーが難しい
- 消費電力が増大し、環境負荷の問題も懸念される


# 感想
結局通信が速くなっても処理をするプログラムがスパゲッティーコードで重たい処理になっていたら時間かかっちゃうから、パフォーマンスチューニング大事

# 参考

https://www.itmedia.co.jp/mobile/articles/1609/14/news057.html
ネットワークトラブル：VMware WorkstationのVMware DHCP serviceが外部ネットワークにつながってしまった

■事象
VMware WorkstationのVMware DHCP serviceが外部ネットワークに対して有効になってしまう事例があった。（原因は不明）
その結果、外部ネットワーク（今回は職場のネットワークの広い範囲）で障害が発生した。

■対処
仮想ネットワークエディタの「デフォルトに戻す」ボタンで解決。

■経緯等
VMware WorkstationやVMware PlayerがインストールされたPCでは、VMware DHCP serviceが自動起動で動作しています。VMware DHCP serviceはホスト内の仮想マシンのためのサービスなので、VMnet1（ホストオンリー）やVMnet8（NAT）にのみ設定可能で、外部接続用のVMnet0（ブリッジ）に対しては設定できないはずですが、先日、VMnet0に対してもVMware DHCP serviceが有効になってしまっていたPCがあり、いわゆる野良DHCPサーバとなってしまっていて、外部ネットワーク（今回は職場のネットワーク）で障害が発生してしまいました。

なぜ、そのような状態となってしまったかの原因は分かりませんでしたが、仮想ネットワークエディタに「デフォルトに戻す」という便利なボタンがありましたので、そのボタンを押すことで問題解消しました。（＋OS再起動はしたかもしれません。）

■問題発生時の状態等

各VMnetとVMware DHCP serviceの関係のイメージ

（通常のPC）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3913661/3b007138-b36c-f8b0-a056-1a4098ec7f29.png)

（今回問題になったPC）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3913661/922bc4e5-cc90-90a8-0381-251c15182435.png)

レジストリ
※設定は vmnetdhcp.conf 等のファイルにもあるようで、どちらが（両方？）使われているのかよくわかりません。。

（通常のPC）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3913661/465bb55d-f478-7668-1ec5-18e6ad904eaf.png)


（今回問題になったPC）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3913661/3c624cef-6765-5c7c-9cb6-652cb962687e.png)


■このような状態になってしまった原因（推測）
レジストリを直接設定するようなことはしていないため、VMware Workstationのバージョンアップ（17.x⇒17.5）をした時になってしまったのではと推測しています。
Symbol サーバをデバッガ上で実行

# Symbol サーバをデバッガ上で実行

## gdb インストール

gdb が入っていないと思うので、インストールします。

```bash
sudo apt install -y gdb
```

## タスクの追加

デバッグ前にビルドと `server.lock` ファイルを削除するタスクを `.vscode/tasks.json` に追加します。

```.vscode/tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "Symbol 構成",
            "command": "ninja publish",
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            "dependsOn": [
                "CMake: 構成"
            ],
            "problemMatcher": [],
            "detail": "ビルド前の `ninja publish` コマンド"
        },
        {
            "type": "shell",
            "label": "CMake: デバッグ前ビルド",
            "command": "rm -rf server.lock",
            "options": {
                "cwd": "${workspaceFolder}/build/data"
            },
            "dependsOn": [
                "CMake: ビルド"
            ],
            "problemMatcher": [],
            "detail": "デバッグ前の server.lock 削除"
        },
    ]
}
```

## デバッグ構成の作成

`.vscode/launch.json` を作成します。

```.vscode/launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Symbol サーバー デバッグ",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceRoot}/build/bin/catapult.server",
            "args": [],
            "environment": [],
            "cwd": ".",
            "stopAtEntry": false,
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "miDebuggerPath": "/usr/bin/gdb",
            "preLaunchTask": "CMake: デバッグ前ビルド",
        }
    ]
}
```

## デバッグ

実行とデバッグから作成した構成を選択して、実行ボタンを押すとデバッグ実行出来ます。

![image-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622558/d1f13334-14b0-c787-b233-6d6bdc61c10e.png)

ブレークポイントも機能します。

![image-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622558/9d9658e9-8d4a-3de7-d347-ba33f532c29c.png)
M5Stack core MP135でNervesを使う方法

# はじめに

M5Stackのcore MP135でNervesを使えるようにしました。

# Nerves Livebook(始めての方)

SDカードに書き込んで使えるNerves Livebookのイメージを公開しています。

https://github.com/masahiro-999/nerves_livebook/releases

```nerves_livebook_core_mp135.zip```をSDカードに書き込んで起動します。

LAN接続しているPCから
https://nerves.local
を開きます。
パスワードは nerves　です。

これで、Livebookが使えます。
circit.i2cなどもインストール済みなので、Livebookでそのまま遊べます。

# 補足
fwupをPCにインストールして、```nerves_livebook_core_mp135.fw```を使って書き込んだ方が、SDカードのサイズに合わせてパーティションが作られ、書き込み時間が10秒くらいと爆速なので、実はお勧めです。
Windowsの場合、fwupは管理者権限のコマンドプロンプトから実行してください。権限がないと、SDカードが無いと言われます。

# Livebookのカスタマイズ

Nerves LivebookにはCircuits.GPIOなど使いそうなモジュールは導入されてますが、使いたいものを入れる場合は、ファームウエアを作る必要があります。
次の方法で可能です。Elixirのmixが動作する環境を用意して実行してください。

```bash:手順
$ git clone https://github.com/masahiro-999/nerves_livebook
$ cd nerves_livebook
$ export MIX_TARGET=m5stack_core_mp135
(モジュールの追加などをします)
$ mix deps.get
$ mix firmware
$ mix burn
```

# Nervesのプロジェクト作成(応用編)

基本的に、ラズパイ等でNervesを使う方法と同じ手順です。
mix.exsの修正と、MIX_TARGET=m5stack_core_mp135とするところが違いです。

```bash:手順
$ mix nerves.new hello_nerves
$ cd hello_nerves
(mix.exsの修正2か所)
$ export MIX_TARGET=m5stack_core_mp135
$ mix deps.get
(機能追加などをします)
$ mix firmware
$ mix burn
```

mix.exsの修正箇所(
```diff_elixir:mix.exs
     :osd32mp1,
     :x86_64,
     :grisp2,
-    :mangopi_mq_pro
+    :mangopi_mq_pro,
+    :m5stack_core_mp135
   ]
 
   def project do
@@ -71,7 +72,8 @@ defmodule HelloNerves.MixProject do
       {:nerves_system_osd32mp1, "~> 0.15", runtime: false, targets: :osd32mp1},
       {:nerves_system_x86_64, "~> 1.24", runtime: false, targets: :x86_64},
       {:nerves_system_grisp2, "~> 0.8", runtime: false, targets: :grisp2},
-      {:nerves_system_mangopi_mq_pro, "~> 0.6", runtime: false, targets: :mangopi_mq_pro}
+      {:nerves_system_mangopi_mq_pro, "~> 0.6", runtime: false, targets: :mangopi_mq_pro},
+      {:nerves_system_m5stack_core_mp135, "~> 0.0.7", runtime: false, targets: :m5stack_core_mp135}
     ]
   end
 
```

SDカードを入れてcore MP135を起動すると、LCDにNervesのロゴが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/19b11071-434f-5f5b-d838-717e50aeb4fe.png)

HDMIポートに接続したモニターと、USB接続のキーボードでコンソール操作可能です。
LAN接続していれば、ssh接続も可能です。このあたりは、ラズパイ等と同様です。

# 応援のお願い

M5Stack Core MP135は、発売からまだ1年も経っていないため、知名度は低いかもしれませんが、ケースが付属しているなど、ラズパイとは異なる特徴を持っています。IoTの入門用途としても新たな可能性を秘めているデバイスです。

現在、Core MP135用のLivebookは、本家のリポジトリをForkして運用していますが、利用者が増えることで、本家で公式にサポートされる製品になる可能性があると考えています。もしこのプロジェクトに共感いただける方は、ぜひGitHubで星をつけて応援してください。多くの支持が集まれば、本家でのサポート実現に一歩近づくと信じています。

https://github.com/masahiro-999/nerves_livebook



参考
https://nerves-project.org/
https://github.com/nerves-livebook/nerves_livebook
https://qiita.com/torifukukaiou/items/91441a14dcf66472af39
MacでC#を導入

# はじめに
本記事はMチップのMacbookを利用されている方向けになります。2024年の8月でVisual studio for macがサポート終了となりました。私は最近コンソールアプリケーションに興味があるため、C#の勉強をしたかったので仕方なくVScodeで環境構築をすることにしました。

# 手順
## VScodeのインストール
今回は割愛。

## .NETのインストール
.NETとは、Microsoftが提供しているC#様のフレームワークです。C#は.NETなくして成り立たないと言えるらしいです。以下リンクからインストールできます。
![スクリーンショット 2024-10-18 20.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/db09ce4d-d3a6-7282-decd-d7b2732a588e.png)

[.NETインストールリンク](https://dotnet.microsoft.com/ja-jp/download/dotnet/thank-you/sdk-8.0.403-macos-arm64-installer)

# VScode拡張機能のインストール
以下をそれぞれインストールしてください。
* C#
![スクリーンショット 2024-10-18 20.57.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/f398dfdd-5271-55ff-ef57-bed5a9c4faad.png)

* VS Sharper for C#

![スクリーンショット 2024-10-18 20.58.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/6e40c80a-db05-b07a-c1da-2b51827f7457.png)


以上で準備はおしまいです。

# 参考サイト
* https://www.chickensblog.com/m1-mac-cs-net/
* https://zenn.dev/midoliy/articles/9e3cff958ff89ba151de
aliasを使ってコマンドを短縮する

## 背景
git pushやdocker-composeなどのコマンド毎回打つのはめんどうだな……と思い、先輩から教えてもらったaliasとやらを作成してみる。

**初心者の備忘録として書いておりますので、間違いがある可能性があります。ご了承ください。

## 手順
```
echo $SHELL
```
で自分のシェルを確認。
シェルとはシェルスクリプトのことで、ユーザーの命令とOSに伝えるプログラムです。受付のおねーさんのようなものです。

シェルには「bash」や「zsh」などあります。私はbashデシタ。

```
vi .bashrc
```
vimコマンドで設定ファイルを開く。

```
alias ga='git add .'
```
こんな感じで付け加えればOK

ちなみに私はこんな感じで登録してます。
```
alias dc='docker-compose'
alias gpo='git push origin'
alias gl='git log'
```

## 最後に
コマンドが短縮されてめちゃくちゃ作業効率上がったような気がします。
パフォーマンスカウンタのProcessっぽいデータを「コマンドライン」付で取得

システムのパフォーマンスを分析したいときに、パフォーマンスカウンタを仕掛けるのはよくあることだと思います。  
で、Processの情報を取得するときに、同じ名前のプロセスが複数上がっていて、どれが目的のものか判別できなくて困ることありますよね。

調べてみたら、PowershellのCimInstanceを使うことで、タスクマネージャのコマンドライン列相当のデータをつけて、類似のデータを採取できるみたいです。起動時の引数などで目的のプロセスが判別できるなら、これで解決するかも。

以下の状況において  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/f297c1c7-76f4-8215-2cd0-da368f4b5db4.png)

パフォーマンスカウンタだと、以下のように判別ができないので  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/21da29fa-8654-08a7-ae5f-61d53956398c.png)

以下のように「コマンドライン」付のログをPowershellで取る感じです  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944269/409b0239-be0a-bf54-e9d6-0474dee454b4.png)


簡単に採取スクリプトを組んでみたので、サンプルとして残しておきます。
冒頭の「取得対象のプロセスの名前」～「サンプリング対象」あたりを、目的に応じて書き換えて使用する想定です。

```Powershell:ProcessInfoLogger.ps1

# 取得対象のプロセスの名前
$targetProcessName = "cmd.exe"

# 出力ファイル
$outFileName = "D:\work\out.csv"

# サンプル間隔(秒)
$samplingTime = 15

# サンプリング対象 (取得するものをコメントアウト)
$samplingProperties = @(
    "ProcessName"
    # ,"Handles"
    # ,"VM"
    # ,"WS"
    # ,"Path"
    # ,"Caption"
    # ,"Description"
    # ,"InstallDate"
    # ,"Name"
    # ,"Status"
    # ,"CreationClassName"
    ,"CreationDate"
    # ,"CSCreationClassName""
    # ,"CSName"
    # ,"ExecutionState"
    # ,"Handle"
    ,"KernelModeTime"
    # ,"OSCreationClassName"
    # ,"OSName"
    # ,"Priority"
    # ,"TerminationDate"
    ,"UserModeTime"
    ,"WorkingSetSize"
    ,"CommandLine"
    # ,"HandleCount"
    # ,"MaximumWorkingSetSize"
    # ,"MinimumWorkingSetSize"
    # ,"OtherOperationCount"
    # ,"OtherTransferCount"
    # ,"PageFaults"
    # ,"PageFileUsage"
    # ,"ParentProcessId"
    # ,"PeakPageFileUsage"
    # ,"PeakVirtualSize"
    # ,"PeakWorkingSetSiz"
    # ,"PrivatePageCount"
    ,"ProcessId"
    # ,"QuotaNonPagedPoolUsage"
    # ,"QuotaPagedPoolUsage"
    # ,"QuotaPeakNonPagedPoolUsage"
    # ,"QuotaPeakPagedPoolUsage"
    # ,"ReadOperationCoun"
    # ,"ReadTransferCount"
    # ,"SessionId"
    # ,"ThreadCount"
    ,"VirtualSize"
    # ,"WindowsVersion"
    # ,"WriteOperationCount"
    # ,"WriteTransferCount"
    # ,"PSComputerName"
)



# メッセージ
Write-Host "プロセス情報採取中。。。"

# 主処理
while ($true) {
    # サンプル時刻とプロセス情報を取得
    $sampledTime = Get-Date -Format "yyyy/MM/dd HH:mm:ss"
    $cimInstanceProcess = Get-CimInstance -ClassName win32_process -Filter "name = '$targetProcessName'" 

    # 全部出力するとファイル容量が大きくなるので、必要なものだけに絞って出力データ($outData)に入れる
    $outData = @()
    foreach ($process in $cimInstanceProcess ) {

        # サンプル時刻を入力しつつ$outDataRecordを初期化
        $outDataRecord = [PSCustomObject]@{
            SampledTime = $sampledTime
        }

        #プロセスの情報を$outDataRecordに追加
        foreach ($property in $samplingProperties){
            $outDataRecord | Add-Member -MemberType NoteProperty -Name $property -Value $process.($property)
        }

        # $outDataRecordを$outDataに追加
        $outData += $outDataRecord
    }

    # 出力
    $outData | Export-Csv -Path $outFileName -NoTypeInformation -Encoding Default -Append

    # 待ち合わせ
    Start-Sleep $samplingTime
}


```
ReactのSuspenseについて



### 1. Suspenseを使った場合

#### 例: データ取得コンポーネント

```jsx
import React, { Suspense, lazy } from 'react';

const UserProfile = lazy(() => import('./UserProfile'));

function App() {
  return (
    <div>
      <h1>ユーザー情報</h1>
      <Suspense fallback={<div>読み込み中...</div>}>
        <UserProfile />
      </Suspense>
    </div>
  );
}
```

#### 説明
- `UserProfile`コンポーネントは非同期に読み込まれます。
- `Suspense`の`fallback`プロパティを使って、コンポーネントが読み込まれるまでの間に「読み込み中...」というメッセージを表示します。
- ユーザーは、データが取得されるまでの間、何が起こっているのかを視覚的に理解できます。

### 2. Suspenseを使わない場合

#### 例: データ取得コンポーネント

```jsx
import React, { useState, useEffect } from 'react';
import UserProfile from './UserProfile';

function App() {
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const fetchData = async () => {
      // データ取得の模擬
      await new Promise((resolve) => setTimeout(resolve, 2000));
      setLoading(false);
    };
    fetchData();
  }, []);

  return (
    <div>
      <h1>ユーザー情報</h1>
      {loading ? <div>読み込み中...</div> : <UserProfile />}
    </div>
  );
}
```

#### 説明
- `useState`と`useEffect`を使って、データの取得状態を管理しています。
- データが取得されるまで「読み込み中...」というメッセージを表示しますが、コンポーネントのロジックが複雑になります。
- 非同期の処理が多くなると、コードが冗長になり、可読性が低下する可能性があります。

### まとめ

- **可読性**: Suspenseを使うと、非同期処理の管理がシンプルになり、可読性が向上します。
- **状態管理**: Suspenseでは、非同期の状態を自動的に管理してくれるため、冗長なコードが減ります。
- **UX**: Suspenseを使うことで、ローディング中の状態を簡単に実装でき、ユーザー体験が向上します。