OmniAICreator/Qiita-1.07M huggingface dataset:
LOGを整理するVBA

```
Option Explicit
Public currentSheet As Object, currentRow As Long

Sub ParseLogFile()
    '=============================================
    'ログファイルを解析してExcelシートを作成するマクロ
    '=============================================
    
    Dim fs As Object, ts As Object
    Dim excelApp As Object, newWorkbook As Object
    Dim currentSheet As Object, currentRow As Long
    Dim logFilePath As String, line As String
    Dim sectionName As String, currentItem As String
    Dim itemCounter As Long, lineParts() As String
    
    'ログファイルパスの取得（B1セル指定）
    logFilePath = ThisWorkbook.Sheets(1).Range("B1").Value
    
    'ADODB.Streamオブジェクトの作成（UTF-8対応）
    Dim stream As Object
    Set stream = CreateObject("ADODB.Stream")
    stream.Charset = "utf-8"
    stream.Open
    stream.LoadFromFile logFilePath
    
    '新しいExcelアプリケーションの起動
    Set excelApp = CreateObject("Excel.Application")
    Set newWorkbook = excelApp.Workbooks.Add
    excelApp.Visible = True
    
    '初期設定
    Set currentSheet = Nothing
    itemCounter = 0
    
    'ログファイルの行処理
    Do Until stream.EOS
        line = Trim(stream.ReadText(-2))
        
        'セクションの判定（==== セクション名 ====）
        If Left(line, 4) = "====" And Right(line, 4) = "====" Then
            sectionName = Replace(Replace(line, "====", ""), " ", "")
            CreateNewSheet newWorkbook, sectionName
            currentRow = 1
            
        End If
        
        '小項目の判定（== 項目名）
        If Left(line, 3) = "== " Then
            itemCounter = 0
            currentItem = Trim(Replace(line, "==", ""))
            If currentRow > 2 Then currentRow = currentRow + 1
            
            '小項目ヘッダーの作成
            With currentSheet
                .Range("A" & currentRow & ":B" & currentRow).Interior.Color = RGB(0, 0, 255)
                .Range("A" & currentRow) = "No."
                .Range("B" & currentRow) = currentItem
                .Range("A" & currentRow & ":B" & currentRow).Font.Color = RGB(255, 255, 255)
                currentRow = currentRow + 1
            End With
        End If
        
        '通常行の処理
        If Left(line, 2) <> "==" And Len(line) > 0 Then
            itemCounter = itemCounter + 1
            With currentSheet
                .Range("A" & currentRow) = itemCounter
                .Range("B" & currentRow) = line
                .Range("A" & currentRow & ":B" & currentRow).Borders.LineStyle = 1
                currentRow = currentRow + 1
            End With
        End If
    Loop
    
    stream.Close
    Set stream = Nothing
End Sub

Sub CreateNewSheet(wb As Object, sheetName As String)
    '=============================================
    '新しいシートを作成するサブルーチン
    '=============================================
    On Error Resume Next
    wb.Sheets(sheetName).Delete
    On Error GoTo 0
    
    Dim newSheet As Object
    Set newSheet = wb.Sheets.Add(After:=wb.Sheets(wb.Sheets.Count))
    newSheet.Name = sheetName
    
    Set currentSheet = newSheet

End Sub
```
【営業→エンジニア】1年経った今、改めて振り返る

## はじめに
この記事に興味を持っていただきありがとうございます！
セゾンテクノロジーの村上です:grinning:

2回目の投稿となる今回は、
セゾンテクノロジー本配属から１年がたったこのタイミングで、
ふりかえりをしてみようと思います。

社内の方々にはもちろんのこと、
**異業種からのIT業界転職について興味のある方**にも
機会があれば、読んでいただきたいです。
今回は、技術的ではない内容になっています。

※記事の内容はあくまでも個人の感想なので、その点ご了承ください:bow:

## 目次
- [はじめに](#はじめに)
- [「本配属から１年」という表現について](#「本配属から１年」という表現について)
- [ふりかえり](#ふりかえり)
    - [経歴](#経歴)
    - [大切だと感じた点](#大切だと感じた点)
    - [これから](#これから)
- [おわりに](#おわりに)

### 「本配属から１年」という表現について

本題に入る前に、記事の冒頭で「本配属から１年」という表現をしている理由を説明します。それは、本配属となるまでの約半年間、「**育成ファーム**」というプログラムを受けてきたからです。

:::note info
「育成ファーム」とは
当社独自の採用の試みとして立ち上げられた、エンジニア未経験もしくは経験の浅い方を対象にした育成プログラムの事。
:::

> ①基本情報技術者資格の取得  
> ②Javaを使用したWebアプリケーションの作成

「育成ファーム」の目標として掲げられていた上記の2つを、ITに関する知識ゼロ、コードを書いた経験ゼロの状態から3～4ヶ月かけて達成しました。

## ふりかえり

私自身の経歴を共有した後、大切だと感じた点をふりかえろうと思います。

### 経歴

簡潔にまとめるとこのような感じになります。

<table>
  <caption>経歴</caption>
    <tr>
      <td>大学時代</td> <td>文系。教育学（社会科）専修。（教員免許は持っていません）</td>
    </tr>
    <tr>
      <td>新卒から約3年間</td> <td>住宅営業。東京・神奈川を中心に活動。</td>
    </tr>
    <tr>
      <td>現在</td> <td>ソフトウェア開発エンジニア</td>
    </tr>
</table>

私から言うのもなんですが、少し変わっていると思います。
だからこそ、先に触れた育成ファームというプログラムに私は惹かれました。
同じような境遇で入社した同期の存在が、今も非常に大きいですし、モチベーションの1つにもなっています。

### 大切だと感じた点

このような私が、改めて「当たり前だけど大切だよな」と感じたことをいくつか紹介します。

---------------------------------------

①**自己管理**

それはそう、と思われるかもしれません。ただ、在宅がメインのワークスタイルに変化したことで、より重要性が増しました。

チームとしては、毎日実施するデイリースクラムで今後の作業計画やスプリントゴールに対する進捗の確認・整理をできるような形になっています。

個人として取り組んでいることとしては、前職からのクセでもありますが、Outlookのカレンダーにひたすら「スモールゴール」と「今日やること」とを、デイリースクラム前までに書き込むという作業をしています。
（なので、チーム員のカレンダーを横並びで表示すると、私だけカレンダーがパンパンになっています・・・💦）

---------------------------------------

②**正直さ**

私の指す正直さには、2つの意味があります。  

1つは、「わからないことを伝える」ということです。会議での議題や話している内容について、頭にクエスチョンマークが浮かんだときは、理解できるところと理解できないところを線引きしたうえで、すぐにメモしてまとめて伺うようにしていました。  

もう1つは、「自分に正直になる」ということです。この点は前職での反省があったからこそ感じているところで、私の持つ意見とは異なるものが出たとき、受け流すのではなくぶつかっていくように心がけています。
（対立させたいということではなく、○○という考えもあると提示するイメージです。）

---------------------------------------

③**レスポンス**

②と重複する点もありますが、議題に対して感じたことを自分の言葉で伝えることは、オンライン会議が100％に近い今、より大切だと感じました。YesならYes、NoならNo、少し論点がずれていたとしても構わない、くらいの気持ちでレスポンスをするように心がけています。

また、細かな点で言えば、"slackでスタンプを押す"であったり、"会議開催が送られてきたとき、参加の可否を返信する"ということも意思表示の方法として必ず行うようにしています。

---------------------------------------

④**段取り力**
これは、前職の経験が1番活かされていると断言できます！営業時代には、お客様とその他業者の方々のスケジュールを管理して、次の打合せに必要なものを調整するように努めていました。そのため、現在も会議までに事前準備が必要な内容や、期日までに実施しなければならない事項を、個人のOneNoteなどを使用して管理する習慣ができています。

プロジェクトのタスクでチームメンバーとやり取りをする際にも、5W1Hを意識した行動をするようにしています。

---------------------------------------

### これから

上記の点を踏まえて、私自身が課題だと今感じていることは「**積極性**」です。行動より先に考えることを優先してしまう性格でもあるため、行動に移すまでに時間がかかってしまうことが今の私の課題だと思っています。

「**気になること、できるかもと思ったことには手を挙げてみる**」

これを意識して取り組んでいこうと思います。

現時点、チームが新たに担当することになった製品の主担当に挑戦している最中です。

## おわりに

以上が、この1年間のふりかえりです。
前職の経験があるからこそ、重要さを感じた内容もありましたし、その経験が糧となっていることも実感しています。
また、今現在挑戦させてもらえる環境で働いていることのありがたさも感じています。

この記事のどこかで、「確かになぁ」「自分も忘れがちだから気にしてみよう」など感じていただければ嬉しいです。

これからも、1年ごとにふりかえりの記事を書いてみようと思っています:thumbsup:

自ら環境を変えて挑んだ1年間、多くの方々に助けていただきました。
本当にありがとうございます。  
まだまだ力不足な点もあると思いますが、引き続きよろしくお願いいたします！
Laravel で欠落したリクエスト データを処理する

⚠️: 海外の記事をchatGPTで要約しただけのもの、主に自分用

## はじめに
Laravelでリクエストを受け取る際、特定の入力データが不足していることがあります。例えば、APIエンドポイントに期待されるパラメータが送信されなかった場合、デフォルト値を設定したり、エラーハンドリングを行う必要があります。

この記事では、Laravelでリクエストデータが不足している場合の対処方法について解説します。

---

## `filled()` と `missing()` メソッド
Laravelには、リクエストデータが存在するかどうかを簡単にチェックする便利なメソッドが用意されています。

### `filled()` メソッド
`filled()` メソッドを使用すると、リクエストの特定のキーが空でないかどうかを判定できます。

```php
if ($request->filled('email')) {
    // 'email' がリクエストに存在し、空ではない場合の処理
}
```

### `missing()` メソッド
`missing()` メソッドを使用すると、特定のキーがリクエストに含まれていないかどうかを判定できます。

```php
if ($request->missing('email')) {
    // 'email' がリクエストに含まれていない場合の処理
}
```

---

## デフォルト値の設定
Laravelでは、リクエストデータが存在しない場合にデフォルト値を設定する方法があります。

```php
$email = $request->input('email', 'default@example.com');
```

上記のコードでは、`email` がリクエストに存在しない場合、デフォルトの `default@example.com` が使用されます。

---

## バリデーションの活用
リクエストデータの不足を防ぐために、バリデーションを活用することも重要です。

```php
$request->validate([
    'email' => 'required|email',
]);
```

このバリデーションを適用すると、`email` フィールドがリクエストに含まれていない場合、エラーが発生します。

---

## まとめ
- `filled()` と `missing()` を活用してリクエストデータの有無をチェック
- `input()` のデフォルト値を利用して安全にデータを取得
- バリデーションを活用して必須データのチェック

これらの方法を適切に使うことで、Laravelのリクエストデータの取り扱いをより堅牢にできます。


## 元記事
Webコーダーからフロントエンドエンジニアに半年で転職成功するぞ！という意気込み記事

# 今年の目標は、自社開発のWeb系企業にフロントエンドエンジニアとして転職です。

取り組んだ学習や成果物を報告していこうと思います。
僕はプログラミング未経験ではありません。
(ゼロからの未経験の方には参考にならないかもしれません、すみません。)

## 軽い自己紹介
現在25歳で、大手IT企業のグループ会社でWebコーダーをしております。
3年目なので、まだまだではありますがゼロから始めるよりはアドバンテージが多少あると思っています。

## 普段の業務
HTML,CSS,JavaScript(jQuery)を使って静的なWebページを作っています。

### 使ってるJavaScriptの動き
- アコーディオン
- スムーススクロール
- タブ切り替え
- modal
- その他ライブラリの使用

Web制作に必要なJavaScriptは使ってますが、ほとんど決まったような書き方なので基本文法や用語の理解が全く足りてませんでした。
そこで1月はこのような勉強をしました。

## 1月に学習したこと
2025年1月は、JavaScriptの基礎固め、ハンズオンでの簡易アプリ制作、Reactの触りを勉強をしました。(次の記事で詳しく書きます。)

## 2月すること
- React,TypeScriptの学習(複数教材で学習予定)
- ハンズオンでReact,TypeScriptを使ったアプリ制作

今のところ、「JavaScriptってこういうのができるのかー」「自分で処理の流れ作れるようになってきたぞ」「自分、あまりにも基礎が足りてなかったな」っていうのが実感として分かってきたので楽しいです。

  
引き続き頑張ります。
amplifyを初めて使う人が動画などを表示できなかった時に見る記事

# 結論

![スクリーンショット 2025-02-12 13.15.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303906/95cef401-3bf5-471c-b82e-f804289f3b0c.png)

「リライトとリダイレクト」設定において、デフォルトで動画を200で返す設定になっていないので、
拡張子を追加しよう。

※動画以外の場合も同じ
Codewars 7 kyu Remove anchor from URL

7 kyu Remove anchor from URL
https://www.codewars.com/kata/51f2b4448cadf20ed0000386/train/python
Complete the function/method so that it returns the url with anything after the anchor (#) removed.

# Verbalization
1. If there is no #, return url (use if "#" in url: )
2. Search the index number of #. (use url.index(#))
3. Select words from first index to one before index of # (use[0:i(ndex of #)])

# Code 
```py
def remove_url_anchor(url):
    if "#" in url: 
        return url[0:url.index("#")]
    else:
        return url
```

# Reference
- How to remove all characters after a specific character in python? 
  https://stackoverflow.com/questions/904746/how-to-remove-all-characters-after-a-specific-character-in-python
- Check if a word is in a string in Python
  https://stackoverflow.com/questions/5319922/check-if-a-word-is-in-a-string-in-python

#other solution
```py
def remove_url_anchor(url):
  return url.split('#')[0]
```
Laravel `Request` チートシート  

⚠️: 海外の記事をchatGPTで要約しただけのもの、主に自分用

---

# 💡 Laravel `Request` チートシート  

## 📝 **すべての入力データを取得**  

```php
// 配列として取得
$input = $request->all();

// コレクションとして取得
$input = $request->collect();
```  

## 🔍 **特定の入力値を取得**  

```php
// キーを指定して取得（デフォルト値付き）
$name = $request->input('name', 'Sally');

// 配列の入力に「ドット」記法でアクセス
$productName = $request->input('products.0.name');

// クエリ文字列の値のみ取得
$name = $request->query('name');

// JSON入力の値にアクセス
$name = $request->input('user.name');
```

## 🔠 **型付きの入力値を取得**  

```php
// 文字列（トリム付き）
$name = $request->string('name')->trim();

// 整数
$perPage = $request->integer('per_page');

// 真偽値（boolean）
$archived = $request->boolean('archived');

// 日付（Carbonインスタンス）
$birthday = $request->date('birthday');

// 列挙型（enum）
use App\Enums\Status;
$status = $request->enum('status', Status::class);
```

## 🏷️ **動的プロパティで入力にアクセス**  

```php
$name = $request->name;
```

## 📌 **入力データの一部を取得**  

```php
// 指定したキーのみ取得
$credentials = $request->only(['username', 'password']);
```

## ❓ **入力の存在チェック**  

```php
// 特定の入力があるか確認
if ($request->has('name')) {
    // …
}

// 入力が存在する場合にクロージャを実行
$request->whenHas('name', function (string $input) {
    // …
});
```

## 🔄 **リクエストデータを追加・変更**  

```php
// 追加のデータをマージ
$request->merge(['votes' => 0]);
```

---

## 元記事

https://x.com/Akr4mKhan/status/1888603415707779354
LaravelでEnumを活用したルート定義の最適化

⚠️:海外の記事をChatGPTで要約しただけのもの、主に自分用

---

# LaravelでEnumを活用したルート定義の最適化  


## 🎯 Laravelのルート定義 × Enum のメリット  

LaravelはPHPのEnum機能をルート定義に直接統合できるようになり、以下のメリットがあります。  

✅ **可読性向上**: ルート定義がより直感的に  
✅ **型の安全性**: Enumを使うことでミスを防ぐ  
✅ **コードの簡潔化**: ルート定義でEnumの値をそのまま使用可能  

## 🏗️ ルート定義でEnumを使う例  

例えば、`prefix()` にEnumを渡すことで、コードがシンプルに書けます。  

```php
enum RouteSection: string
{
    case Admin = 'admin';
    case Client = 'client';
    case Public = 'public';
}

Route::prefix(RouteSection::Admin)
    ->group(function () {
        // 管理者向けのルート
    });
```

**ポイント:**  
🔹 Enumの値を直接ルートに渡せるので、定義ミスを防げる  
🔹 IDEのオートコンプリートが効くので、開発が楽になる  

## 🏢 マルチポータルアプリでの活用例  

例えば、学生・教員・管理者向けに異なるドメインを持つポータルがある場合、以下のように整理できます。  

```php
<?php

namespace App\Routing;

use App\Http\Controllers\Portal;

enum PortalType: string
{
    case Student = 'student.university.edu';
    case Faculty = 'faculty.university.edu';
    case Admin = 'admin.university.edu';
}

enum PortalSection: string
{
    case Dashboard = 'dashboard';
    case Resources = 'resources';
    case Profile = 'profile';
}

// 学生向けポータルのルート設定
Route::domain(PortalType::Student)
    ->middleware(['auth', 'student'])
    ->group(function () {
        Route::get('/', [Portal\StudentController::class, 'index'])
            ->name(PortalSection::Dashboard);
        Route::get('/materials', [Portal\ResourceController::class, 'index'])
            ->name(PortalSection::Resources);
        Route::get('/profile', [Portal\ProfileController::class, 'show'])
            ->name(PortalSection::Profile);
    });

// 教員向けポータルのルート設定
Route::domain(PortalType::Faculty)
    ->middleware(['auth', 'faculty'])
    ->group(function () {
        Route::get('/', [Portal\FacultyController::class, 'index'])
            ->name(PortalSection::Dashboard);
    });
```

### 📌 ここがポイント！  
🔹 `PortalType` でドメインをEnum化し、ルートを整理  
🔹 `PortalSection` でルート名をEnum化し、誤入力を防ぐ  
🔹 ミドルウェアも適切に適用できる  

## 📖 まとめ  

Laravelのルート定義にEnumを活用すると…  

✅ ルート設定が整理され、構造が明確に  
✅ 型の安全性が高まり、ミスを防げる  
✅ コードの可読性・保守性が向上  

## 📝 元記事  

[Route Definition Enhancements in Laravel with Enum Integration](https://laravel-news.com/route-enum-integration)  

---
[べき乗法と特性方程式]Pythonで行列の最大固有値と固有ベクトルを求める方法

# はじめに
べき乗法(Power Method)は、数値解析において行列の最大固有値と対応する固有ベクトルを効率的に求める手法です。特性方程式を解くことで、固有値を理論的に検証する方法も紹介します。今回はPythonを用いて具体的なコードとその解説を行います。
# プログラム概要
以下の内容をPythonで実装します。
1. べき乗法を用いて行列の最大固有値と固有ベクトルを求める
1. 特性方程式を解いて理論的に固有値を確認する
# べき乗法の実装
```py:Power_Method.py
import numpy as np

def power_method(A, x0, epsilon=1e-1, max_iterations=3):
    """
    べき乗法を用いて行列の最大固有値と固有ベクトルを求めます。

    Args:
        A: 行列。
        x0: 初期ベクトル。
        epsilon: 許容誤差。
        max_iterations: 最大反復回数。

    Returns:
        最大固有値と固有ベクトルのリスト。
    """
    x = x0
    lambda_old = 0
    k = 0
    eigenvalues = []  # 固有値のリスト
    eigenvectors = []  # 固有ベクトルのリスト

    while k < max_iterations:
        y = A @ x
        lambda_new = y[1]  # 固有値の推定
        x = y / y[1]  # 固有ベクトルを正規化

        eigenvalues.append(lambda_new)
        eigenvectors.append(x)

        if abs(lambda_new - lambda_old) <= epsilon:
            break
        lambda_old = lambda_new
        k += 1

    return eigenvalues, eigenvectors

# 使用例
A = np.array([[9, 4], [4, 3]])  # 行列 A
x0 = np.array([1, 1])  # 初期ベクトル

eigenvalues, eigenvectors = power_method(A, x0)

# 計算結果の表示
x1_1 = round(eigenvectors[0][0], 3)
x1_2 = round(eigenvectors[1][0], 3)
x1_3 = round(eigenvectors[2][0], 3)
lambda_1_3 = round(eigenvalues[2], 3)

print(f"(1) x1(1) = {x1_1}")
print(f"(2) x1(2) = {x1_2}")
print(f"(3) x1(3) = {x1_3}")
print(f"(4) lambda1(3) = {lambda_1_3}")
```
# 実行結果
```
(1) x1(1) = 1.857  
(2) x1(2) = 1.986  
(3) x1(3) = 1.999  
(4) lambda1(3) = 10.945  
```
# 特性方程式で固有値を検証
べき乗法で得られた最大固有値が正しいか、特性方程式を解いて確認します。
コードはこちら↓
```py:characteristic_equation.py
import numpy as np

# 行列 A を定義
A = np.array([[9, 4], [4, 3]])

# 特性方程式を解いて固有値を求める
eigenvalues = np.linalg.eigvals(A)

# 最大固有値を求める
max_eigenvalue = max(eigenvalues)

# 最大固有値に対応する固有ベクトルの1番目の要素を求める（𝑥2=1と仮定）
x2 = 1
x1 = (max_eigenvalue - 3) * x2 / 4

# 結果を出力
print(f"(5) |𝜆1| = {round(max_eigenvalue, 3)}")
print(f"(6) x1 = {round(x1, 3)}")
```
# 実行結果
```
(5) |𝜆1| = 11.0  
(6) x1 = 2.0
```
# まとめ
- べき乗法は行列の最大固有値と対応する固有ベクトルを反復計算で求める方法
- 特性方程式を解くことで固有値を正確に求めること

このプログラムは数値解析の基本的な学習に役立ちます。応用として、より高次元の行列や他の固有値計算法を実装することも可能です。最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！
ollama serveエラー時の対処法（備忘録）


# エラー文

```
> ollama serve
Error: listen tcp 127.0.0.1:11434: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
```

## エラーの説明

このエラーメッセージは、Ollamaが使用しようとしているポート（11434）が既に使用中であることを示しています。具体的には：

- `listen tcp 127.0.0.1:11434`: Ollamaは localhost（127.0.0.1）の11434ポートでリッスンしようとしています
- `bind: Only one usage of each socket address ... is normally permitted`: このポートは既に他のプロセス（この場合は自動起動されたOllama）によって使用されているため、新しく使用することができません

## 原因

このエラーの主な原因は、Windowsのスタートアップに登録されたOllamaが自動的に起動され、既にポート11434を使用しているためです。

1. Windows起動時に自動的にOllamaが起動
2. 手動で`ollama serve`コマンドを実行
3. 同じポートを使用しようとして衝突が発生

# 対処法

以下の手順で問題を解決できます：

1. **現在実行中のOllamaを停止する**
   - タスクトレイのOllamaアイコンを右クリック
   - 「Quit Ollama」を選択

   ![Ollamaのタスクトレイアイコン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/c8ee62e6-fe04-4ea0-a2f2-a2a40a05314b.png)

   ![Quit Ollamaの選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/bd2ffc3d-95b5-4b2b-bd9b-4609a89f8f62.png)

2. **スタートアップからOllamaを削除する**
   - 以下のパスにあるOllamaのショートカットを削除します：
   ```
   C:\Users\【ユーザ名】\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
   ```
   
3. **システムの再起動**
   - Windows を再起動して、変更を完全に反映させます
   - 再起動後、Ollamaが自動的に起動しないことを確認

# 確認方法

1. システム再起動後、タスクトレイにOllamaのアイコンが表示されていないことを確認
2. `ollama serve`コマンドを実行し、エラーなく起動することを確認

# トラブルシューティング

上記の手順を実行しても問題が解決しない場合は、以下を確認してください：

1. タスクマネージャーでOllamaのプロセスが実行されていないことを確認
2. `netstat -ano | findstr :11434`コマンドを実行して、ポート11434が使用されていないことを確認
3. 必要に応じて、Ollamaを完全にアンインストールして再インストール
MQTT.js: パブリック MQTT ブローカーに wss で接続

ブローカー　wss://broker.hivemq.com:8884/mqtt

トピック　testaa/topic

## Publish

```js:publish.js
const mqtt = require('mqtt')

// WebSocket エンドポイント
const brokerUrl = 'wss://broker.hivemq.com:8884/mqtt'

// MQTT クライアントの作成
const client = mqtt.connect(brokerUrl)

client.on('connect', () => {
  console.log('Connected to MQTT broker')

  // メッセージをパブリッシュ
  const message = 'Good Afternoon Feb/12/2025'
  client.publish('testaa/topic', message, (err) => {
    if (!err) {
      console.log('Message published')
    } else {
      console.error('Publish error:', err)
    }
    client.end() // 接続を閉じる
  })
})

client.on('error', (err) => {
  console.error('Connection error:', err)
})
```

実行コマンド

```bash
export NODE_PATH=/usr/lib/node_modules
node publish.js
```

## Subscribe

```js:subscribe.js
const mqtt = require('mqtt');

// WebSocket エンドポイント
const brokerUrl = 'wss://broker.hivemq.com:8884/mqtt'

// MQTT クライアントの作成
const client = mqtt.connect(brokerUrl)

client.on('connect', () => {
  console.log('Connected to MQTT broker')

  // トピックをサブスクライブ
  client.subscribe('testaa/topic', (err) => {
    if (!err) {
      console.log('Subscribed to testaa/topic')
    }
  })
})

client.on('message', (topic, message) => {
  console.log(`Received message on ${topic}: ${message.toString()}`)
})

client.on('error', (err) => {
  console.error('Connection error:', err)
})
```

実行コマンド

```bash
export NODE_PATH=/usr/lib/node_modules
node subscribe.js
```

## 他の　パブリック MQTT ブローカー

次でも確認しました。

```js
const brokerUrl = 'wss://mqtt.eclipseprojects.io:443/mqtt'
```
beforeEachでrender関数を使った時のact()エラーを解消する。

## actエラー
React Testing Library の act() 警告（warning）は、「テスト実行時にコンポーネントの状態（state）を変更する処理が発生したが、それが act() でラップされていない」場合に出るものです。
基本的には、テストコードとコンポーネントコードの両方で「非同期に状態が変わる処理があるとき」や「ユーザー操作をトリガーとして状態変更が起こるとき」に、適切にラップされていないと act() warning が出やすくなります。
renderは内部的にactを実行する仕様になっていますが、beforeEachの中に入れると別スコープとなるためactの警告が発生します。

警告の出るコード
```TypeScript
    describe('モーダル画面', () => {
      beforeEach(() => {
          render(
              <TestRender />
          );
      })


      test(`登録ボタンをクリックしたらモーダル画面が表示される`, async () => {
        // ...
      });

      test(`×をクリックしたらモーダル画面が閉じる`, async () => {       
        // ...
      });
```


## actを使うことでエラー解消
renderそのものをactを入れることで、ステート更新が完了するまで処理を待つことができます。

```TypeScript
    describe('モーダル画面', () => {
      beforeEach(async () => {
        await act(async () => {
          render(
            <TestRender />
          );
        });
      });

      test(`登録ボタンをクリックしたらモーダル画面が表示される`, async () => {
        // ...
      });

      test(`×をクリックしたらモーダル画面が閉じる`, async () => {       
        // ...
      });
```

## その他のactエラー解決方法
各テストでrenderする。この場合はテストのスコープでrenderする(内部的にactする)ためエラーは出ません。
```TypeScript
    describe('モーダル画面', () => {

      test(`登録ボタンをクリックしたらモーダル画面が表示される`, async () => {
        render(
            <TestRender />
        );
        // ...
      });

      test(`×をクリックしたらモーダル画面が閉じる`, async () => {
        render(
            <TestRender />
        );
        // ...
      });
```

## そもそも
コンポーネント内で正しくasync、await処理ができていればマウントする時にactエラーは出ません。
act関数を使わなくても良いコードを目指したいですね。🤖
改めて「PDF」って、なんだっけ？

### はじめに
普段、何気なくPDFファイルを利用している方は多いと思いますが、後輩や新人に「**PDFって、何ですか？**」と聞かれたら、あなたなら何と答えますか？当たり前のように使っているツールほど、説明が難しいものです。今回は、「PDFとは何か？」というテーマで、PDFの特徴、メリット・デメリット、主な用途などを解説していきます。
※この記事は、ChatGPTの出力を基に作成しています。

### **PDFとは？**
**PDF（Portable Document Format）** は、**アドビ（Adobe）社が開発した電子文書のファイル形式**です。  
最大の特徴は、**どの環境（PC、スマホ、タブレット、異なるOS）でも同じレイアウトで表示・印刷できる**ことです。  

例えば、**WordやExcelのファイルは開くソフトやバージョンによって表示が変わることがあります**。  
しかし、PDFならフォント、画像、文字の位置、色、レイアウトなどが固定され、意図したとおりに表示されます。  

---

## **PDFの特徴**
### **1. レイアウトが崩れない**
- WordやExcelは、開く端末やソフトによってフォントやレイアウトが変わることがありますが、**PDFはデザインが固定されている**ため、どこで開いても同じ見た目になります。  

### **2. どんなデバイスでも閲覧可能**
- **PC（Windows・Mac）、スマホ（iPhone・Android）、タブレットなど、どんな端末でも表示できる。**  
- PDFリーダー（Adobe Acrobat Reader など）がインストールされていれば、簡単に開ける。  

### **3. セキュリティが高い**
- **簡単に編集できない**ため、契約書や請求書などの正式な書類に向いている。  
- **パスワードや暗号化を設定できる**ため、重要な情報を保護できる。  

### **4. テキスト・画像・リンクを含められる**
- 文字だけでなく、**画像・図表・リンク・動画・電子署名**などを埋め込むことができる。  
- 電子書籍やプレゼン資料、論文、マニュアルなどに向いている。  

### **5. 圧縮してファイルサイズを小さくできる**
- 画像や文字のデータを**圧縮して軽量化**できるため、メールやクラウドでの共有に便利。  

---

## **PDFの主な用途**
**✅ ビジネス文書**
- **契約書・請求書・領収書・申請書**
  - 変更されると困る書類に最適。
  - 電子署名を使って、紙の書類の代わりに利用できる。

- **会社案内・プレゼン資料**
  - どんなデバイスでも同じレイアウトで見られるため、相手に伝わりやすい。

**✅ 教育・学術**
- **論文・学習資料**
  - 書式を統一し、きれいにレイアウトされた文書を配布できる。

- **マニュアル・説明書**
  - 図や画像を多く含む文書でも、崩れずに表示できる。

**✅ Web・デジタル活用**
- **WebページをPDFとして保存**
  - 参考資料や証拠として保存しておくことができる。

- **電子書籍（eBook）**
  - PDF形式の本や資料をスマホやタブレットで読むことができる。

---

## **PDFの作成・編集方法**
**🔹 PDFの作成方法**
- **Word・Excel・PowerPointからPDFとして保存**
  - Microsoft Officeの「名前を付けて保存」→「PDF形式」で簡単に作成できる。

- **スキャナーで紙の文書をPDF化**
  - 紙の資料をデジタルデータに変換できる。

- **オンラインツールで変換**
  - **「Smallpdf」「Adobe Acrobat」** などを使えば、Web上でPDFに変換できる。

**🔹 PDFの編集方法**
- **Adobe Acrobat（有料）** を使うと、PDFのテキストや画像を直接編集可能。
- **無料のオンラインツール**（Smallpdf、iLovePDF など）でも、簡単な編集が可能。
- **PDFにコメントや注釈を追加**できる機能がある。

---

## **PDFと他のファイル形式の違い**
| ファイル形式 | 特徴 | 主な用途 |
|-------------|------|---------|
| **Word（.docx）** | 文字入力や編集が自由 | 文書作成、レポート |
| **Excel（.xlsx）** | 表計算やグラフ作成が可能 | データ管理、財務表 |
| **PowerPoint（.pptx）** | スライド形式でプレゼン可能 | 企画書、プレゼン |
| **JPEG/PNG（画像）** | 画像データのみ | 写真やスクリーンショット |
| **PDF（.pdf）** | レイアウトが固定され、編集しにくい | 契約書、説明書、カタログ |

---

## **PDFのメリット・デメリット**
### **✅ メリット**
- ✅ **レイアウトが崩れない**
- ✅ **どんな端末でも開ける**
- ✅ **セキュリティが高い（編集・改ざんが困難）**
- ✅ **電子署名・パスワード保護が可能**
- ✅ **画像・テキスト・リンクを含められる**

### **❌ デメリット**
- ❌ **編集しにくい（特別なソフトが必要）**
- ❌ **複雑なデザインのPDFはサイズが大きくなる**
- ❌ **無料で高度な編集をするのが難しい（有料ソフトが必要なことが多い）**

---

## **まとめ**
📌 **PDFは、どんなデバイスでも崩れずに表示できる「万能な文書フォーマット」**  
📌 **契約書やマニュアル、プレゼン資料などの正式な文書に最適**  
📌 **編集は難しいが、その分セキュリティが高い**  

**ビジネスや学習の場で非常に便利なフォーマットなので、上手に活用しましょう！** 🚀
PWA（Progressive Web Apps）とは？



+ [PWA（Progressive Web Apps）とは？どう凄いのか、導入するメリットは](https://www.profuture.co.jp/mk/column/what-is-progressive-web-apps)
+ [PWAとは？Webサイトを「ほぼアプリ化」する方法](https://pantograph.co.jp/blog/production/pwa.html)
+ [Salesforce:アプリのようにさくさく動くWebサイトを実現する「Progressive Web App（PWA）」](https://www.salesforce.com/jp/blog/how-to-build-progressive-web-app/)
+ [Microsoft Edge:Progressive Web Apps の使用を開始する](https://learn.microsoft.com/ja-jp/microsoft-edge/progressive-web-apps-chromium/how-to/)
+ [Microsoft Edge:プログレッシブ Web アプリのデモ](https://learn.microsoft.com/ja-jp/microsoft-edge/progressive-web-apps-chromium/demo-pwas)
+ [安全で使い勝手の良いアプリをPWAで、有効なAPIは2つ](https://xtech.nikkei.com/atcl/nxt/column/18/00450/101500006/)
classicを使えばユーザ自身でページレイアウトを上書き（変更）できる？


+ [Disable change my display / Customize my pages to force users to use standardize](https://ideas.salesforce.com/s/idea/a0B8W00000GdW6EUAV/disable-change-my-display-customize-my-pages-to-force-users-to-use-standardize)


# 【アイデア】表示の変更/ページのカスタマイズを無効にして、ユーザーに標準化の使用を強制する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/78926f6b-eb98-4061-a54f-78b73bf639b7.png)

経験豊富なユーザーに GUI をカスタマイズする機能を提供するのは良いことですが、新しいユーザーが「自分のディスプレイを変更」設定をいじって、ユーザー インターフェイスが変更されたためにその後のトレーニング マテリアルに従えなくなったというサポート ケースがいくつかありました。ある例では、営業担当者が見積もり関連リストを非表示にした後、見積もりを作成できなくなりました... そうです... ユーザーは愚かです ;) 「個人設定: 自分のディスプレイを変更」を有効/無効にできるようにできますか? セットアップ > アプリ設定 > カスタマイズ > ユーザー インターフェイスのチェックボックスを使用してはいかがでしょうか? 


>これを解決する手段を提供してください! ユーザーのページ設定を「カスタマイズ解除」する解決策を見つけるために、チケットを何度も何度も繰り返し、何時間も費やしました。これは、ユーザーの権限をさらに強化するための素晴らしい試みであることは理解しています。しかし、これは失敗の大きな原因です。私たちの組織では、ユーザーが手探りで操作しす​​ぎる可能性がある設定を無効にできるようにしたいと考えています。
Renesasビルド作業　概要説明

## 概要
Renesasのボードを使ってモデルを学習させる際の一連の流れを記載します。
基本的には公式ドキュメントを参考にすればいいのですが、一部詰まりやすい箇所やどの資料を参考にすればいいのかについて初学者であるとやや混乱してしまいます。
そこでこの記事はそれらをまとめた内容となります。
なお作業の詳細な内容は公式ドキュメントを読み込んでいただくのを前提としてこの記事では参照すべき資料と作業時の要点にフォーカスを当てた内容となります。
予めご了承ください。

検証ボード
・Kakip
・RZ/V2L-EVKIT

## はじめに
Kakipについては公式サイトを確認しセットアップを行う。
必要な機材、SDカードへの書き込みを含めて以下の公式ドキュメントが参考になる。

https://yds-kakip-team.github.io/techdoc/jp/

## Renesas RZ/Vとは？
Renesas RZ/Vシリーズについて理解を深める。
> 高いAI推論性能と低消費電力を両立したルネサス独自のAIアクセラレータ「DRP(Dynamically Reconfigurable Processor)-AI」を内蔵したマイクロプロセッサ(MPU)

> AI Accelerator:DRP-AI
ルネサス独自の「高い性能と低消費電力」、「進化に対応できる柔軟性」の両方を兼ね備えたAIアクセラレータ「DRP-AI」

https://www.renesas.com/ja/products/microcontrollers-microprocessors/rz-mpus/rzv-embedded-ai-mpus?srsltid=AfmBOoq2r3yAXlVDbEUrkY6XbtjFh2Ki8CdamRPIQ2fRNOL0uss4kxm7

### 日本語版

https://www.renesas.com/ja/key-technologies/artificial-intelligence/ai-tool-drp-ai-tvm#overview

### 英語版

https://www.renesas.com/en/key-technologies/artificial-intelligence/ai-tool-drp-ai-tvm?srsltid=AfmBOorD0yMWHi1iRfo8V1IpbLUYNzVCDXzntj8SQ_tID4F864jauwD-

今回扱うボードにはKakipがRenesas RZ/V2HがRZ/V2L-EVKITにはRZ/V2が搭載されている。
シリーズの違いでダウンロードするファイルが違うので作業前に該当するシリーズの確認を行うこ。

## 今回目的とする作業
・ビルド
ボードを動かすのに必要なファイルのダウンロードからビルドの実行までを行う。
またビルド後はSDカードにファイルを移植する。
Kakipでの移植の際は既にあるデータを上書きしなくていいようにSSHを利用してSCPもしくはrsyncコマンドを利用して移植を行う。
なおrsyncコマンドを使う際は実行時の影響が非常に大きいため注意して扱う。

## イメージ
動画での作業の流れ

https://www.youtube.com/watch?v=CPeE2q3TdOY&t=436s

PNGでの作業イメージ

https://github.com/renesas-rz/rzv_drp-ai_tvm/blob/main/img/deploy_flow_V2H.png

Ubuntu PCを利用して必要なビルドを行う。
なおWindows11+WSL2の組み合わせで問題なくできるためWindowsユーザーでもビルドは可能である。
Ubuntuのバージョン違いによるエラーが発生することがあるのでドキュメントのバージョンに従う。
（2025/2/7時点ではUbuntu20.04にてビルドが正常に実行可能であった。）

## ビルド方法
KakipではRZ/V2HをRZ/V2L-EVKITではRZ/V2Lのビルドが必要となる。
ダウンロードするファイルを間違えないように注意をする。

https://renesas-rz.github.io/rzv_ai_sdk/5.00/getting_started.html

## ビルド完了
ONNXモデルを使う際はこちら

https://renesas-rz.github.io/rzv_drp-ai_tvm/compile_your_own_model.html

TensorFlowを変換する際の方法はこちら

https://github.com/onnx/tensorflow-onnx
【ネットワーク】IPアドレスのネットワーク部とホスト部について

# はじめに
こんにちは。アメリカで独学でエンジニアを目指している者です。
IPアドレスは、コンピュータやネットワーク機器が相互に通信するために使用される識別番号です。このIPアドレスは「ネットワーク部」と「ホスト部」に分かれており、それぞれの役割を理解することが、ネットワーク設計やトラブルシューティングにおいて重要です。本記事では、IPアドレスのネットワーク部とホスト部の違い、計算方法、そしてネットワークアドレスとブロードキャストアドレスについて詳しく解説します。


### ネットワーク部とは
ネットワーク部は、そのIPアドレスが属する ネットワーク（サブネット） を表します。同じネットワーク部を持つデバイス同士は、ルーターを介さずに通信できるのが一般的です。

* 例: `192.168.1.0/24` の場合、最初の 24ビット がネットワーク部になります。
* つまり、`192.168.1.1` ～ `192.168.1.254` のアドレスを持つデバイスは 同じネットワークに属する ことになります。

### ホスト部とは
ホスト部は、同じネットワーク内での個々のデバイスを識別する部分です。各デバイスには ユニークなホスト部 が割り当てられます。

* 例: `192.168.1.0/24` の場合、ホスト部は 最後の8ビット（1オクテット）。
* `192.168.1.10` と `192.168.1.20` は、同じ `192.168.1.0/24` のネットワークに属するが、それぞれ異なるホストとして識別される。


### ネットワークアドレスの定義
ネットワークアドレスは、そのネットワーク全体を表すアドレスであり、ホスト部がすべて「0」 になっているIPアドレスです。
このアドレスは、実際のホスト（PCやサーバー）に割り当てることはできません。

* 例: `192.168.1.0/24` の ネットワークアドレス は `192.168.1.0`
* 1`0.0.0.0/8` の ネットワークアドレス は `10.0.0.0`

#### ネットワークアドレスの役割
ネットワークアドレスは、以下のような用途で使われます。

1. ルーティング情報の識別
  * ルーターはネットワークアドレスを使って、どの経路で通信を送るか判断します。
2. ネットワークの区切りを定義
  * 192.168.1.0/24 と 192.168.2.0/24 は、異なるネットワークとして識別される。


### ブロードキャストアドレスの定義
ブロードキャストアドレスは、そのネットワーク内の すべてのホストに一斉にデータを送信するための特別なアドレス です。
このアドレスは、ホスト部がすべて 「1」 になっています。

* 例: `192.168.1.0/24` の場合、ブロードキャストアドレス は `192.168.1.255`
* `10.0.0.0/8` の場合、ブロードキャストアドレス は `10.255.255.255`
* ブロードキャストアドレスは、ネットワーク内の全ホストに同時にメッセージを送る際に使用されます。

### IPアドレスの計算方法

ネットワークアドレスとブロードキャストアドレスを求める手順を例を用いて説明します。

#### 例1: `192.168.1.0/24` の場合

- **ネットワークアドレス**: `192.168.1.0`
- **ホスト範囲**: `192.168.1.1` ～ `192.168.1.254`
- **ブロードキャストアドレス**: `192.168.1.255`

#### 例2: `10.0.0.0/16` の場合

- **ネットワークアドレス**: `10.0.0.0`
- **ホスト範囲**: `10.0.0.1` ～ `10.0.255.254`
- **ブロードキャストアドレス**: `10.0.255.255`

### ネットワーク部が同じ場合の通信について

一般的に、ネットワーク部が同じIPアドレス同士は、ルーターを介さず直接通信が可能です。

#### **同じネットワーク部の通信**

- `192.168.1.10/24` と `192.168.1.20/24` は同じネットワーク (`192.168.1.0/24`) 内にあるため、ルーターなしで通信可能。

#### **異なるネットワーク部の通信**

- `192.168.1.10/24` と `192.168.2.20/24` は異なるネットワークに属しているため、ルーターを経由しないと通信できません。

### まとめ

- **IPアドレスはネットワーク部とホスト部に分かれる**
- **ネットワークアドレスはホスト部がすべて `0` のアドレス**
- **ブロードキャストアドレスはホスト部がすべて `1` のアドレス**
- **同じネットワーク部のホスト同士はルーターなしで通信できる**
Python ディレクトリ構造のガイドライン (cline-rule sample)


# 目的

Python プロジェクトにおけるディレクトリ構造と、パッケージの設定に必要なファイルの書き方についてのガイドラインをまとめる。
この資料は Cline の助けになるよう、議論、技術的な詳細、技巧的な表現は避け、シンプルな説明で構成される。

## 用語

- module: Python ファイル (`.py`) 1 つに対応する、Python コードの基本単位。
- import(ing): ある module のPythonコードが、別の module が公開する機能を使えるようにするための処理。
- import path: import する module を検索するパスのリスト。
- package: submodule, subpackage を階層的に含むことができる module.
- regular package: `__init__.py` を含むディレクトリである、通常の package. より特殊な `namespace package` と区別して呼ばれる。
- namespace: コード上の名前と、オブジェクトを対応づける仕組み。

See [Python3.13 用語集](https://docs.python.org/ja/3.13/glossary.html).

## 使用するツール

- プロジェクト管理: uv
- テスト: pytest
- 静的解析: ruff
- リンティング: pre-commit

## ディレクトリ構造

以下のディレクトリ構造をベースに、Python プロジェクトを構築する。
`pyproject.toml` にパッケージ情報を記載するため `setup.py` は作成しない。

```plaintext
project-name/
├── CHANGELOG
├── docs
│   ├── changelog.rst
│   ├── conf.py
│   ├── index.rst
│   ├── Makefile
│   ├── readme.rst
│   └── ...
├── examples
│   ├── example1.py
│   └── ...
├── .gitignore
├── LICENSE
├── pyproject.toml
├── README.md
├── src
│   └── public_package_name
│       ├── __init__.py
│       ├── sub_package_name1
│       │   ├── __init__.py
│       │   ├── module_name1.py
│       │   └── ...
│       ├── sub_package_name2
│       │   ├── __init__.py
│       │   ├── module_name2.py
│       │   └── ...
│       ├── module_name3.py
│       └── ...
├── tests
│   ├── __init__.py
│   ├── test_integration1.py
│   ├── test_integration2.py
│   └── ...
└── uv.lock
```

ディレクトリ構造に関する議論は以下を参照。
- [src layout vs flat layout](https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/)
- [ionel's codelog - Packaging a python library](https://blog.ionelmc.ro/2014/05/25/python-packaging/#the-structure%3E)

## `__init__.py` の書き方

### `__init__.py` を必ず配置する

Python の regular package は `__init__.py` ファイルを含むディレクトリであると想定される。
特別な理由が無い限り、すべてのディレクトリに `__init__.py` ファイルを配置する。

### `__init__.py` の内容

`__init__.py` はパッケージがインポートされるときに暗黙的に実行され、加えて `__init__.py` で定義されているオブジェクトが、パッケージの名前空間に追加される。
`__init__.py` にはパッケージのインポート時に実行したい初期化処理、および外部に公開したいオブジェクトを定義する。

サブパッケージのインポートは相対パスを使い `from .sub_package_name import object_name as object_name` のように記述する。
一方で `from .sub_package_name import *` は使用すべきでない。
`__all__` および `__version__` は使用しない。

```python
from .sub_package_name1 import Class1 as Class1
from .module_name3 import function_name1 as function_name1
# ...

# if necessary, write initialization code here. 
# (e.g., add paths, environment variables to system)

```

## example scripts の書き方

パッケージの使い方を示すためのスクリプトは `examples` ディレクトリに配置する。
`src` で定義したパッケージをインポートするためには、以下のコマンドで、パッケージをローカルにインストールする必要がある。

```bash
uv pip install -e .
```

インストールしたパッケージは、 `__init__.py` が適切に設定されていれば、以下のようにインポートできる。

```python
from public_package_name import Class1
from public_package_name import function_name1
```


## TODO

- [ ] `pyproject.toml` の書き方
- [ ] import に関するエラー文への対処
  - https://qiita.com/u943425f/items/bd94a30b52c9296e942d#本題自作モジュールのimportで発生するエラーを解消する
    - `python -m <module>` オプションで実行する、など。
ElixirでリストをEnum.mapで処理する際に、直前の要素値や履歴を参照したい時にどうするか

ElixirでリストをEnum.mapで処理する際に、典型的によく起こる、直前の要素値や履歴を参照したい時にどうするかを紹介します。

## 問題

次のようにリストを`Enum.map/2`でパイプライン処理することはよく行うと思います。

```elixir
list
|> Enum.map(& ...)
|> Enum.map(fn v -> ... end)
...
```

`Enum.map/2`で記述する関数は、要素の値を参照して結果を返す関数を書きます。たとえば、要素の値を2倍したいときには次のようにします。

```elixir
list
|> Enum.map(& &1 * 2)
...
```

ここで問題にしたいのは、関数の中で1つ前の要素を参照したい、あるいは、リストのその前の要素値の履歴を参照したいというような場合です。このときには単純な `Enum.map/2` ではプログラミングできません。では、どのようにプログラミングしたら良いのでしょうか？

## 解決例

`Enum.scan/3` を用いると、リストの履歴を積み上げたリストを作ってくれます。

```elixir
iex> Enum.scan(1..5, [], &[&1 | &2])
[[1], [2, 1], [3, 2, 1], [4, 3, 2, 1], [5, 4, 3, 2, 1]]
```

ただし、逆順に並んでしまうのですよね。そこで、`Enum.reverse/1`をかけます。

```elixir
iex> 1..5 |> Enum.scan([], &[&1 | &2]) |> Enum.map(&Enum.reverse/1)
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]
```

素晴らしい。あとは、`Enum.reduce/3` を使います。直前の値を用いて計算するような関数の例として、たとえばフィボナッチ数列を求めてみましょう(ただし初項は除く)

```elixir
iex> 1..10
...> |> Enum.scan([], & [&1 | &2])
...> |> Enum.map(&Enum.reverse/1)
...> |> Enum.map(fn l -> 
...>   Enum.reduce(l, 0, fn
...>     _, {fn1, fn2} -> {fn1 + fn2, fn1}
...>     _, f0 -> {1, f0}
...>   end)
...> end)
...> |> Enum.map(&elem(&1, 0))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
```
ユーザー辞書で類義語を登録する(SPSS Modeler データ加工逆引き13-7)

# ユーザー辞書で類義語を登録する

![スクリーンショット 2025-02-04 13.26.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/858bc072-c6f8-eaf6-c069-4479bdfe021c.png)

この記事はSPSS Modeler Premium Ver18.6から追加された日本語テキスト機能を利用して書いています。SPSS Modeler Professionalをお使いの方はアップグレードするかPython連携を用いて実現します。

Python連携を紹介する記事はこちら

https://qiita.com/harrowharrow16/items/248ff8fe3879b63e7ae3

## 1.想定される利用目的

・抽出されたコンセプトの時点で表記の揺れを正規化する

## 2.ストリームとデータのダウンロード

ストリーム

https://github.com/yoichiro0903n/blue/raw/refs/heads/main/synonym.str

## 3.サンプルストリームの説明

![スクリーンショット 2025-02-04 11.38.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0d2c70f6-a841-85f0-2075-e74a18a4154b.png)

a.入力データは以下の通りです。

![スクリーンショット 2025-02-04 11.51.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9bffb418-37dc-6cd9-ade7-8157454da648.png)

b.[テキストマイニング]ノードを編集します。[IDフィールド]と[テキストフィールド]を以下の通り選択します。

![スクリーンショット 2025-02-04 11.39.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9caae9b2-18b8-13fd-a522-027abf145d8f.png)

[モデル]タブを編集します。[抽出結果を利用して...]を選択します。

![スクリーンショット 2025-02-04 11.40.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6bd2486b-5ba5-c375-be79-96fcb5306678.png)

[実行]します。画面右上のドロップダウンリストから辞書[リソースエディター]を呼び出します。

![スクリーンショット 2025-02-04 11.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1f3832c4-68c3-c7e4-d15d-f95594e83608.png)

左上の辞書が３つアクティブになっていることを確認します。

![スクリーンショット 2025-02-04 11.41.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/14bbde2f-4161-9b19-04d1-ca2abdec3d2c.png)

ユーザー辞書[ローカルライブラリー]のみを表示させます。

![スクリーンショット 2025-02-04 11.42.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/50f60723-b880-032f-e8c6-b47af6a6ccc4.png)

画面下部の類義語エリアで以下のように[代表語]を[プリンター]として[類義語]に[printer,プリンタ,印刷機,複合機]を登録します。

![スクリーンショット 2025-02-04 11.48.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/21ae2160-ce63-7e8e-51de-b44fa5f4ab04.png)

[リソースエディター]から[カテゴリーとコンセプト]に戻します。辞書が更新されたのでコンセプトが黄色く反転しています。
![スクリーンショット 2025-02-04 11.50.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a6590f59-1c9b-597d-9e73-7f83745c2e15.png)

[抽出]ボタンを押します。表記揺れが正規化され、原文では異なっていてもコンセプトは[プリンター]で認識されます。

![スクリーンショット 2025-02-04 11.50.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5b2a10ca-0722-b38c-299f-cc47921438a3.png)


#### 注意事項

表記揺れは必ずしも辞書で整えず、カテゴリに編成する際まとめたり、ストリーム上で処理することも可能です。目的と効率を考えて方法を選択します。

ローカル辞書を保存するにはインタラクティブセッション終了時に以下の[更新]を選択します。
チームメンバーと辞書を共有するにはライブラリに任意の名前をつけて公開/管理します。
![スクリーンショット 2025-02-12 11.45.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fc54c544-335b-4fe9-953f-f7afc6bab8a2.png)



## 4.参考情報

#### Python連携によるテキストマイニング

https://qiita.com/harrowharrow16/items/248ff8fe3879b63e7ae3

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008
Gitを使う上での選択肢

Gitを学習する際に選ばなければならない選択肢はいくつかあります。目的や環境によって異なりますが、主な選択肢をカテゴリごとに整理しました。

---

### ① **Gitのインストール方法**
- **公式サイトからダウンロード**（[Git公式](https://git-scm.com/)）
- **パッケージマネージャーを利用**
  - macOS: `brew install git`
  - Linux: `sudo apt install git` / `sudo dnf install git`
  - Windows: Chocolatey (`choco install git`) / Scoop (`scoop install git`)

---

### ② **使用するGitの操作方法**
- **コマンドライン（CLI）**
  - `git init`, `git add`, `git commit`, `git push` などを手動で入力
  - メリット: 高い柔軟性、トラブルシューティングしやすい
  - デメリット: 最初は学習コストが高い
- **GUIクライアント**
  - [GitKraken](https://www.gitkraken.com/), [Sourcetree](https://www.sourcetreeapp.com/), GitHub Desktop など
  - メリット: 直感的に操作できる
  - デメリット: コマンドの知識が身につきにくい
- **IDE統合**
  - VS Code, IntelliJ, Eclipse などに内蔵されたGit機能を利用
  - `git` コマンドを直接打たずにバージョン管理可能

---

### ③ **Gitのホスティングサービス**
- **GitHub**
  - 世界最大のGitホスティングサービス、オープンソースに強い
- **GitLab**
  - 自社でホスティング可能なCI/CDに強いプラットフォーム
- **Bitbucket**
  - Atlassian製、JIRAとの連携が強力
- **自社サーバー（オンプレミス）**
  - `git init --bare` を使い、SSH経由で管理

---

### ④ **リポジトリの運用戦略（ブランチ戦略）**
- **Git Flow**
  - `main`（または `master`）と `develop` を中心に `feature`, `release`, `hotfix` ブランチを管理
- **GitHub Flow**
  - `main` ブランチに `feature` ブランチを作成し、プルリクエスト（PR）でマージ
- **GitLab Flow**
  - 環境ごと（開発、ステージング、本番）にブランチを用意
- **Trunk Based Development**
  - `main` ブランチに直接マージし、短期間でデプロイ

---

### ⑤ **マージ戦略**
- **Merge commit (`git merge`)**
  - ブランチの変更をコミットごとに残して統合
- **Fast-forward merge**
  - 履歴を直線的に保つ（`git merge --ff-only`）
- **Squash and merge**
  - 複数のコミットを1つにまとめてマージ（`git merge --squash`）
- **Rebase (`git rebase`)**
  - ブランチの履歴を整理しながら統合

---

### ⑥ **コミットメッセージのルール**
- **自由形式**
  - 適当に `fix bug` などを書く
- **コミットメッセージ規約を採用**
  - [Conventional Commits](https://www.conventionalcommits.org/)（`feat: add login button` など）
  - [Gitmoji](https://gitmoji.dev/)（`✨ feat: add login button` など）

---

### ⑦ **リモートリポジトリとの連携方法**
- **HTTPS**
  - `git clone https://github.com/user/repo.git`
  - 簡単だが、毎回認証が必要
- **SSH**
  - `git clone git@github.com:user/repo.git`
  - 事前にSSHキーを設定する必要があるが、一度設定すれば便利
- **Git Credential Manager（GCM）**
  - 認証情報を保存し、HTTPSでも再認証不要にする

---

### ⑧ **変更履歴の管理方法**
- **コミットをやり直す**
  - `git commit --amend`
- **履歴を整理する**
  - `git rebase -i`
- **変更を取り消す**
  - `git reset --hard`（完全削除）
  - `git revert`（取り消しコミットを作成）
- **特定のファイルだけ戻す**
  - `git checkout <commit_hash> -- file.txt`

---

### ⑨ **トラブルシューティング方法**
- **ブランチを間違えて作業した**
  - `git stash` で変更を一時退避し、正しいブランチに移動
- **間違えて `git push` した**
  - `git push --force`（注意！）
- **過去の状態に戻りたい**
  - `git reflog` で過去の状態を確認し、`git reset --hard` で戻る
- **コンフリクトが発生**
  - `git merge` の際に `<<<<<< HEAD` の部分を手動で修正し、再コミット

---

### ⑩ **CI/CDとの連携**
- **GitHub Actions**
  - GitHub上でCI/CDを構築
- **GitLab CI/CD**
  - `.gitlab-ci.yml` を使ってパイプラインを設定
- **Jenkins, CircleCI, Travis CI**
  - 外部のCIツールを利用

---

### **まとめ**
Gitを学習する際に選ぶべき選択肢はたくさんありますが、最初は以下の流れを意識すると良いでしょう：

1. **CLI or GUI** を選ぶ（CLI推奨）
2. **Gitのホスティングサービス** を決める（GitHubが一般的）
3. **ブランチ運用ルール** を選ぶ（GitHub Flowがおすすめ）
4. **マージ戦略** を理解する（Fast-forward + Squash and merge）
5. **変更履歴の管理方法** を学ぶ（`commit --amend`, `rebase`, `reset`）
6. **コンフリクト解決** を実践する
7. **CI/CD連携** まで学ぶと実務で活用しやすい

どの選択肢を選ぶかはプロジェクトやチームの方針によりますが、最初は **基本的なGit操作 + GitHub** を学ぶのがベストです！
サーバーにさくっとリモート接続する

# はじめに
過去記事で書いたLinux(ubuntu)に対してwindowsPCからVScodeを通して
リモート接続する簡単な手順書です。

# VSCODEで拡張機能をインストール
Remote Developmentを拡張機能の検索から探してインストールしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003510/84265f54-762c-505c-4db6-24d0451dd407.png)


# クライアントPC側でやる動作
(1)SSHが入っているかを確認する。
`ssh -V`でバージョンが出てくれば大丈夫です。最近はデフォルトで入っているはずですが、もし入っていない場合はOpenSSH Clientをインストールしてください。
コマンドでも可能ですが、設定のオプション機能からもインストール可能です。

(2)鍵を作成する。
```
ssh-keygen -t rsa -b 4096
```
上記コマンドで通常ホームディレクトリに.sshフォルダが作成されるかと思います。
中身はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003510/ff2e0788-aecd-a875-a6f4-df1a8b49adf3.png)

id_rsaが秘密鍵でid_rsa.pubが公開鍵です。

# リモート側へ公開鍵を送る
```
ssh-copy-id -i ~/.ssh/id_rsa.pub [リモートユーザー]@[リモートサーバーのホスト名]
```

上記のコマンドで転送するのですが環境によっては遅れない場合があります。その場合は以下手順で直接鍵をサーバー上に作成します。

(1)クライアントPC側で以下コマンドを実行します。
```
cat ~/.ssh/id_rsa.pub
```

(2)`ssh-rsa AAABBBBうんたらかんたら～`みたいなのが表示されると思います。それがカギの中身なのでそれをコピーします。

(3)リモート側で以下コマンドを実行します。
```
mkdir -p ~/.ssh
echo "ssh-rsa AAABBBBうんたらかんたら～（公開鍵の内容コピペ）" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
```

(4)configを編集します。
基本的にはホームディレクトリにあるかと思うので"C:\Users\ユーザー名\.ssh\config"をエディタで開き、以下のように記述します。
```
Host エイリアス(testとかなんでもいい）
    HostName ホストIP
    User ユーザー名
    Port 22
    IdentityFile "C:\Users\ユーザー名\.ssh\id_rsa"
```

#完了
以上で作業が完了しました。アイコンをクリックすると設定したエイリアスが表示されているかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003510/82f04c9e-8fc5-67d8-cbaf-6de23e510f84.png)

赤枠の部分のアイコンを押すと別ウィンドウでリモート接続できます。
矢印マークを押すとそのまま現在のウィンドウで開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003510/007dc6bf-8ef0-472f-c81e-4f42be6b26a1.png)

SAMBAなどを利用してgit連携などを行うやり方とかもできますが、
特段理由がない限りはSSHを使用するのがよさそうです。
Cognos Analytics データ・テーブル

# 概要
Cognos Analytics のデータ・テーブルを簡単にご紹介します。

# 参考情報
Cognos Analytics データ・テーブル
https://www.ibm.com/docs/ja/cognos-analytics/12.0.0?topic=reporting-data-tables

# データ・テーブル
「データ・テーブル」をキャンバスに配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/3d056f32-15e1-824c-90c5-a9ac1336457a.png)

以下のアイテムをデータ・テーブルに配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/5dff0de1-0d34-4d1c-cab9-5810b53d2f58.png)

グループ化および要約で以下の選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/85283fbd-161d-b5cc-6888-119f47618b48.png)

展開/省略がさくさく出来る！これは素晴らしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/884ee803-c2ea-e70f-2f19-b57ab95accd1.png)

でも良い事ばかりではない。鍵を開けても、ヘッダーの細かなカスタマイズは出来ない。テキストの配置やレポート式の埋め込み等NG。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/66eefabb-7941-bd7a-71d4-eacb9b318c62.png)

本体セルのプロパティも同様。ドリルスルーも出来ないので注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/16554caf-2b6f-027c-b265-1cd501607c93.png)

カスタム・インディケーターとは何か、以下のように設定してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/f751ddb0-7445-bcb1-53f1-e1b44912e5c0.png)

数字ではなく、インディケーター表示になった。こういう機能はある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/9953efc4-6107-387e-03cf-a9e4377da4e2.png)
Gitを学ぶ上での選択肢

Gitを初めて学ぶ人が、順番に考慮すべきことを並べました。学習を進める際に、この順番で考えるとスムーズに理解できます。  

- ステップ ①：Gitを使える環境を整える
- ステップ ②：リポジトリの作成と基本操作を学ぶ
- ステップ ③：リモートリポジトリと接続する
- ステップ ④：ブランチを使って並行開発する
- ステップ ⑤：チーム開発を意識したGitの運用を学ぶ
- ステップ ⑥：履歴の管理と修正を学ぶ
- ステップ ⑦：高度な使い方を学ぶ（必要に応じて）


---

### **ステップ ①：Gitを使える環境を整える**  
✅ **Gitのインストール方法を決める** 
▼選択肢
1. 公式サイト
2. パッケージマネージャー（Homebrew, apt, etc.）  

✅ **Gitをどのツールで操作するか決める**  
▼選択肢
1. CLI
2. GUIクライアント（GitKraken, Sourcetree）
3. IDE統合（VS Code, IntelliJ）  

---

### **ステップ ②：リポジトリの作成と基本操作を学ぶ**  
✅ **ローカルリポジトリを作る**  
- `git init` を実行してリポジトリを作成  

✅ **ファイルの変更を記録する流れを学ぶ**  
- `git add` → `git commit` の基本操作  

✅ **変更履歴を確認する**  
- `git log`, `git status`, `git diff` で履歴を確認  

---

### **ステップ ③：リモートリポジトリと接続する**  
✅ **ホスティングサービスを選ぶ**（GitHub推奨）  
- GitHub / GitLab / Bitbucket など  

✅ **リモートリポジトリの設定方法を学ぶ**  
- `git remote add origin <URL>`  

✅ **リモートへプッシュ & プル**  
- `git push` / `git pull` / `git clone` の使い方を理解  

---

### **ステップ ④：ブランチを使って並行開発する**  
✅ **ブランチの基本を学ぶ**  
- `git branch` / `git checkout -b feature-branch`  

✅ **ブランチを切り替える**  
- `git switch` / `git checkout`  

✅ **ブランチの統合方法を学ぶ**  
- `git merge`（マージコミットを残す）  
- `git rebase`（履歴を整理しながら統合）  

---

### **ステップ ⑤：チーム開発を意識したGitの運用を学ぶ**  
✅ **ブランチ戦略を理解する**  
- GitHub Flow（基本） / Git Flow（大規模） / Trunk Based Development（モダン）  

✅ **プルリクエスト（PR）とコードレビューを学ぶ**  
- GitHubでプルリクを作成・マージする方法  

✅ **コンフリクト解決を学ぶ**  
- `<<<<<< HEAD` が出たときの対応方法  

---

### **ステップ ⑥：履歴の管理と修正を学ぶ**  
✅ **コミットの修正・変更**  
- `git commit --amend`（直前のコミット修正）  

✅ **間違えた変更の取り消し方法**  
- `git reset`（履歴を巻き戻す）  
- `git revert`（取り消しコミットを作る）  

✅ **過去の履歴を整理する**  
- `git rebase -i`（履歴の書き換え）  

✅ **変更を一時的に退避する**  
- `git stash`（変更を保存して後で適用）  

---

### **ステップ ⑦：高度な使い方を学ぶ（必要に応じて）**  
✅ **マージ戦略の選択**  
- Fast-forward / Squash and merge / Rebase  

✅ **タグを使ってバージョン管理する**  
- `git tag` を使って特定のバージョンを記録  

✅ **CI/CDとの連携**  
- GitHub Actions / GitLab CI など  

---

### **まとめ：学習の流れ**
**1. Gitをインストールし、使うツールを決める**  
**2. 基本のリポジトリ操作を学ぶ（add, commit, log）**  
**3. リモートリポジトリと連携する（push, pull）**  
**4. ブランチを使った開発を学ぶ**  
**5. チーム開発で必要なプルリクエストやレビューを理解する**  
**6. コミット履歴の管理や修正を学ぶ**  
**7. 必要に応じて高度な使い方を学ぶ（タグ、CI/CD）**  

この順番で進めれば、Gitの基礎から応用までスムーズに学習できます！
Linux(Ubuntu,CentOS)で不正アクセスをブロックする方法

# 1. Fail2ban のインストール

Debian/Ubuntu の場合:
```
sudo apt-get update
sudo apt-get install fail2ban
```
CentOS/RHEL の場合:
```
sudo yum install epel-release
sudo yum install fail2ban
```

# 2. Fail2ban の設定
Fail2ban のデフォルト設定は /etc/fail2ban/jail.conf にありますが、直接編集せずに上書き用の /etc/fail2ban/jail.local を作成するのが推奨されます。この場合、

```
nano /etc/fail2ban/jail.local
```

Fail2ban は、起動時に自動的に /etc/fail2ban/jail.conf とその上書きファイルである /etc/fail2ban/jail.local（存在する場合）を読み込みます。そのため、特に設定ファイル名をどこかに登録したり、指定したりする必要はありません。


たとえば、SSH に対する保護設定は以下のようになります。
※ログファイルのパスはディストリビューションによって異なります（Debian/Ubuntu では /var/log/auth.log、CentOS/RHEL では /var/log/secure ）。

``` /etc/fail2ban/jail.conf
[sshd]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log    ; Debian/Ubuntuの場合（CentOS/RHELでは /var/log/secure）
maxretry = 5
bantime  = 600    
```

# 3. サービスの再起動

設定を変更したら、Fail2ban サービスを再起動して新しい設定を反映させます。
```
sudo systemctl restart fail2ban
```

# 4. 動作確認

設定が正しく読み込まれているか確認するには、次のコマンドを使用します。
```
sudo fail2ban-client status sshd
sudo fail2ban-client status recidive
```

これにより、SSH jail の状態やブロック対象の IP などが表示されます。
Gitの学習ステップ

Gitを学習するステップは、初心者から上級者までのレベルに応じて段階的に進めると効果的です。以下のステップに沿って学習を進めてみてください。  

🔰 1. Gitの基本概念を理解する 
🛠 2. Gitの基本操作を習得する
🌍 3. リモートリポジトリ (GitHub, GitLab, Bitbucket) を使う
🌿 4. ブランチとマージの概念を理解する
⚠️ 5. コンフリクト (競合) の解決を学ぶ
📝 6. より高度なGitの使い方を習得する
📢 7. チーム開発におけるGitのベストプラクティスを学ぶ

---

### **🔰 1. Gitの基本概念を理解する**  
まずはGitが何なのか、どのように動作するのかを理解しましょう。  
- **Gitとは？** バージョン管理システムで、ソースコードの変更履歴を管理できる  
- **ローカルリポジトリとリモートリポジトリの違い**  
- **コミットとは？**  
- **ブランチの概念**  

📖 **学習方法:**  
- 公式サイト: [https://git-scm.com/]( https://git-scm.com/ )  
- YouTubeの解説動画を見る  
- 簡単なイラスト付きの記事を読む  

---

### **🛠 2. Gitの基本操作を習得する**  
実際にGitをインストールし、コマンドラインやGUIツールを使ってみましょう。  
💡 **やること:**  
1. Gitをインストール  
2. `git init` でリポジトリを作成  
3. `git add` でファイルをステージング  
4. `git commit` で変更を保存  
5. `git log` で履歴を確認  

📖 **学習方法:**  
- Gitのチートシートを使う [https://education.github.com/git-cheat-sheet-education.pdf]( https://education.github.com/git-cheat-sheet-education.pdf )  
- 実際に小さなプロジェクトを作って試す  

---

### **🌍 3. リモートリポジトリ (GitHub, GitLab, Bitbucket) を使う**  
ローカルだけでなく、リモートリポジトリと連携できるようになりましょう。  
💡 **やること:**  
1. GitHubでアカウント作成  
2. `git clone` でリポジトリを取得  
3. `git push` で変更をリモートにアップロード  
4. `git pull` で最新の変更を取得  
5. `git remote` でリモート設定を確認  

📖 **学習方法:**  
- GitHubの公式チュートリアル [https://docs.github.com/ja/get-started]( https://docs.github.com/ja/get-started )  
- 友人とGitHubで小さなプロジェクトを共有してみる  

---

### **🌿 4. ブランチとマージの概念を理解する**  
チーム開発ではブランチを使うことが必須なので、これを習得しましょう。  
💡 **やること:**  
1. `git branch` で新しいブランチを作成  
2. `git checkout` でブランチを切り替え  
3. `git merge` で変更を統合  
4. `git rebase` の基本を学ぶ  

📖 **学習方法:**  
- 実際に自分のプロジェクトで `feature-branch` を作ってマージしてみる  
- ブランチ戦略 (Git Flow, GitHub Flow) について学ぶ  

---

### **⚠️ 5. コンフリクト (競合) の解決を学ぶ**  
チーム開発で避けられないのが「コンフリクト」です。  
💡 **やること:**  
1. わざと同じファイルを編集して `git merge` を試す  
2. `git status` で競合を確認  
3. 手動で修正し `git add` & `git commit`  

📖 **学習方法:**  
- チュートリアルを見ながら競合を解決する練習をする  
- `git mergetool` の設定を試してみる  

---

### **📝 6. より高度なGitの使い方を習得する**  
ある程度慣れてきたら、より高度なテクニックを学びましょう。  
💡 **やること:**  
1. `git stash` で一時的に変更を保存  
2. `git cherry-pick` で特定のコミットだけ適用  
3. `git bisect` でバグの原因を特定  
4. `git reflog` で過去の状態に戻す  

📖 **学習方法:**  
- より高度なGitの書籍を読む  
- 実際に問題が起こったときに調査して試す  

---

### **📢 7. チーム開発におけるGitのベストプラクティスを学ぶ**  
最後に、チーム開発で役立つスキルを身につけます。  
💡 **やること:**  
- Gitのコミットメッセージの書き方を学ぶ  
- `git flow` などのブランチ戦略を理解する  
- PR (Pull Request) の作り方を学ぶ  

📖 **学習方法:**  
- 企業の開発ルールを参考にする  
- GitHubのオープンソースプロジェクトを見て勉強する  

---

### **📌 まとめ**
| ステップ | 学習内容 |
|----------|---------|
| 1. 基本概念 | Gitとは何か？ |
| 2. 基本操作 | `init`, `add`, `commit`, `log` |
| 3. リモート連携 | `push`, `pull`, `clone` |
| 4. ブランチ | `branch`, `checkout`, `merge` |
| 5. コンフリクト解決 | `status`, `mergetool` |
| 6. 高度な技術 | `stash`, `cherry-pick`, `reflog` |
| 7. チーム開発 | コミットメッセージ、PR、Git Flow |