OmniAICreator/Qiita-1.07M huggingface dataset:
[Django]distinctメソッド

https://se-memorandum.com/django-distinct/

参照記事↑
## `distinct()` メソッドの役割

- `distinct()` メソッドは、クエリセットから重複するオブジェクトを削除します。
- 具体的には、同じオブジェクトが複数回結果に含まれることを防ぎ、一意なオブジェクトのみを残します。

## `distinct()` メソッドの実装

例えば、フィルタリングの結果として同じオブジェクトが複数回含まれることがあります。この場合、`distinct()` メソッドを使用して重複するオブジェクトを削除します

・例①
```
from django.db.models import Q

def get_unique_users(search_query=None, active_only=True):
    """
    条件に一致するユーザーを取得し、重複を排除します。

    :param search_query: 検索キーワード（名前またはメールアドレスに部分一致）
    :param active_only: アクティブなユーザーのみを取得するか
    :return: 重複を排除したユーザーのクエリセット
    """
    # ベースクエリセット
    queryset = User.objects.all()

    # アクティブユーザーのみを絞り込む
    if active_only:
        queryset = queryset.filter(is_active=True)

    # 名前またはメールアドレスに検索キーワードが含まれるユーザーを絞り込む
    if search_query:
        queryset = queryset.filter(
            Q(name__icontains=search_query) | Q(email__icontains=search_query)
        )

    # 重複を排除して返す
    return queryset.distinct()
```

・例②
```
    def get_queryset(self):
        search_form = ContractSearchForm(self.request.GET or None)

        if search_form.is_valid():
            # 検索条件をセッションに保存
            self.request.session['contract_search_data'] = self.request.GET.copy()
        # 以下、クエリセットの取得ロジック
        else:
            # フォームが無効の場合、セッションからデータを取得して再生成
            initial_data = self.request.session.get('contract_search_data', {})
            search_form = ContractSearchForm(initial_data)
        queryset = Contracts.objects.all().order_by(*self.ordering)
        today = timezone.now().date()

        if search_form.is_valid():
            filters = search_form.cleaned_data
            if filters.get('name'):
                queryset = queryset.filter(name__icontains=filters['name'])
            if filters.get('project_name'):
                queryset = queryset.filter(project__name__icontains=filters['project_name'])
            if filters.get('client_name'):
                queryset = queryset.filter(project__client__name__icontains=filters['client_name'])

            # 日付に基づくフィルタリング
            query = Q()
            if filters.get('period_before'):
                query |= Q(start_date__gt=today)
            if filters.get('period_during'):
                query |= Q(start_date__lte=today, end_date__gte=today)
            if filters.get('period_after'):
                query |= Q(end_date__lt=today)
            if filters.get('period_undefined'):
                query |= Q(start_date__isnull=True) | Q(end_date__isnull=True)
            queryset = queryset.filter(query)

        return  queryset.distinct()
```
GAS（Google Apps Script）とJavaScriptの変数のライフサイクルは異なります

### 一言で要点を説明：GASの変数は、スクリプトが実行されるたびにリセットされます。

これは、JavaScriptの感覚でGASを書く際にハマりやすい落とし穴です。StackOverflowのこの投稿（<https://stackoverflow.com/a/24732037>）にもあるように：
>Global variable will be evaluated at each execution of a script, so not just once every time you run your application. Global variables CAN be changed in a script…

調査の結果、実際にはグローバル変数だけでなく、すべての変数が実行時にリセットされることが判明しました。

その背景にある原理は、GASの実行環境であるV8ランタイムがステートレス（stateless）として設計されているためです。スクリプトが実行されるたびに環境が初期化され、大まかな流れとして、まずグローバルスコープのコードが実行され、その後メイン関数が実行されます。実行が終了するとすべてのメモリが解放されるため、すべての変数がリセットされると理解できます。

### ステートレスの例（JavaScript）
ステートレスな関数は、外部の変数に依存せず、また外部の変数を変更しません。その実行結果は完全に内部変数によって決まります。

```javascript
const c;

function add(a, b) {
    return a + b;
}
```

### ステートフルの例（JavaScript）
ステートフルな関数は、変数の値を保存または変更したり、外部変数に依存します。

```javascript
let count = 0;
function increment() {
    count += 1;
    return count;
}
```

GASでの関数実行時のグローバルコードの挙動
以下のコードを例に説明します：

```javascript
const test = 0;

function A() {
    Logger.log("Function A executed, test = " + test);
}

function B() {
    Logger.log("Function B executed, test = " + test);
}

function all() {
    A();
    B();
}
```

all()を実行する場合、GASの実行ロジックは以下のように動作します：

1. 実行環境の初期化
スクリプトが実行されるたびに、グローバルスコープ内のコード（例：const test = 0;）が再実行され、初期化されます。

2. all()の実行
all()関数内でA()とB()が呼び出されます。これらの関数は同じ実行環境内で動作するため、グローバル変数testの値はA()とB()の間でリセットされることはありません。

つまり、スクリプトの実行中、グローバル変数は1度だけ初期化されます。ただし、スクリプトを再実行すると、グローバル変数は再度リセットされます。

## 結論
GASのグローバル変数はステートレスであり、スクリプト実行ごとにリセットされます。複数回の実行間で変数値を保持する必要がある場合、公式ドキュメントでは以下の使用を推奨しています：
- PropertiesService（プロパティストレージ）
- Googleスプレッドシートなどの外部データソース
Regional Scrum Gathering Tokyo 2025 にオンライン参加してみた

## この記事の内容
- 認定スクラムマスターの資格維持のためという意識低い理由で「[Regional Scrum Gathering Tokyo 2025](https://2025.scrumgatheringtokyo.org/)」にオンライン参加したら、思いの外学びが多かったという話

## この記事が役立ちそうな人
- スクラムマスターの資格を持っているけど、イマイチ活かせていない方
- Regional Scrum Gathering などのイベント参加に興味があるけど、ちょっとお値段も高くて躊躇している方

## 私について
- 認定スクラムマスター資格保持2年目
- 育休明け1年目のワーママ。育休中は完全に仕事から離れていたので、1年で資格再認定に必要なポイントを稼ぐ必要が出てきた（※）

※ 認定スクラムマスターの資格更新のためには、２年間で20時間分の学習等のアクティビティを認定組織に申請・登録する必要がある

## Regional Scrum Gathering Tokyo (REGT) とは？
スクラムに関する各地域の自発的な集まりの東京版。世界中からたくさんの人が参加する。会場参加の他にオンライン参加がある。

私が11月にイベントの存在に気づいて申し込んだ時には既に会場参加は6.6万円というチケット価格にも関わらず売り切れ。オンラインチケットしかないという人気ぶりだった。

## オンラインから見ていた会場の様子
そんな理由もあってオンライン参加だったのですが、お金の問題がクリアできるならできるだけ会場参加した方が良いのでは？というのか感想。以下、感想や会場参加をおすすめしたい理由を挙げていきます。

### 世界中の一流の人の講演が聞けるのすごい
国際的なイベントなので、世界中から色々な方がスピーカーとして登壇します。
同時通訳もオンラインならクリアに聞こえるので、英語でのセッションも問題なく参加できました。
ただ、会場にいると海外の登壇者の方に通訳の方のヘルプも借りながら質問できたようです。貴重な機会でちょっと羨ましくなりました。

### 企業ブース行ってみたかった
会場ではスポンサー企業の方々がブースを出されていたようです。ノベルティやアジャイル開発お役立ちグッズを色々配布されていたようなのですが、私が特にみてみたかったのは書籍販売(?)をされていた企業の方。

![books.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393888/3000d71f-c559-9e15-80f8-e01c460fed16.png)

アジャイル開発に関する書籍って、本屋にもなかなか並んでいないので（ネット書店のおすすめ以外で）知らない本に出会えるのはなかなかありがたかったです。画像参考に調べてみます。

### ワークショップ参加したかった
REGTではイベント期間を通じて様々なセミナーが開催されるのですが、ワークショップ形式のものがかなりありました。オンラインでも参加できるようにもちろん配慮されていましたが、それでもオンラインでは参加しづらかったのも事実。

とある時間は（OSTの時間なので仕方がないのかもしれませんが）全てのセミナーがワークショップだったので、非常に興味のあるコンテンツだったものの、参加を遠慮してしまいました... :cry: 次回があればここは頑張りたいです。

![スクリーンショット 2025-01-10 9.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393888/b47ac5a2-3845-36eb-6d3f-fc38146cff51.png)

### ためになる情報いっぱい流れてきた
当然ながら、登壇者はみなさんアジャイル/スクラムの優れた実践者であり、教育普及にも関心のある方なので、優れた書籍の紹介とか、気軽に参加できるコミュニティの情報とか、役に立つ情報が色々流れてきました。

個人的に、特にためになったのがこちら。

https://www.youtube.com/channel/UCUcKR5NviFsfUgbVSEGncqg

今回聞けなかったセミナーも含め、様々なアジャイル/スクラムに関するビデオがアップロードされている`YouTube`チャンネルだそうです。しかも「一人で見るのは大変（寂しい）よね！」ということで、それらの試聴会の情報まで案内してくれました :laughing: 

### Discordで繋がれた
当日はDiscordのコミュニティもオープンしていたので、参加者がたくさんDiscord上で自己紹介されていました。 Xアカウントがわかった方はこっそりX上でフォローさせていただきました... :smile: 

私は神奈川県民なので、地元神奈川県でのイベントの案内もあったのがありがたかったですTT

https://www.scrumfestkanagawa.org/

当日はランチも会場で食べられたみたいなので、会場でランチやWSで交流しながら友達もできたと思うと、羨ましい限りです。

### とはいえ、会場に行くなら託児が欲しいなあ...!
そんなこんなで、会場に行きたいなあという思いに駆られた私。韓国など近隣の国でも開催されているので会場に行ってみたいなという思いはあるものの、やはりワーママが参加するには会場に託児が欲しいと思いました。

去年参加を諦めたのもまだ育休中で保育園に入れられていなかったからだし、海外のイベントに参加するなら、海外で一時保育を探すのは至難の業なので、会場の託児がやはり欲しい！

小さい子供がいるゲストの方も登壇しやすくなると思うので、ぜひ主催者の方にはご一考いただきたいです。

## 感想まとめ：楽しかったのでソウル大会に行っちゃおうかな ^^
とはいえ、今回初参加して`Regional Scrum Gathering`絶対行くなら会場参加！という思いを新たにしたので、次は会場で参加したいです。
私は韓国に住んでいたことがあるので、里帰り気分で韓国の大会にでも行っちゃおうかな...という気分になりました :star:
それまでにアジャイル/スクラムに関して色々な人と話せるように仕事頑張るぞーというモチベーションにもつながり、とても良い機会となりました。
ARPってなに？ 🤔🔰 ネットワーク初心者のためのやさしい解説

こんにちは！😊

ネットワークの勉強をしていると、必ず出てくる「**ARP**」という言葉。

最初は「？？？」と感じてしまうかもしれません。😅

しかし、ご安心ください！ARPは、ネットワークを理解するための基礎となる、とても重要な概念です。

この記事では、**ARP** について、初心者の方にも分かりやすく、そして具体例をたくさん交えながら丁寧に解説してまいります。


### 対象読者

* ネットワーク初心者🔰の方
* ARPについて知りたい方
* ネットワークの勉強で「IPアドレス」と「MACアドレス」の違いに悩んでいる方


### 記事の目的

* 会社の業務でネットワークを学ぶことになりましたが、教科書を読むだけではなかなか理解が進まず、アウトプットの場としてQiitaに投稿することにしました。
* この記事を通して、ARPの基礎知識をしっかりと理解し、ネットワークの仕組みを学びたいと考えています。


### 1. ARPとは？ 🤔

ARPは、 **Address Resolution Protocol** の略で、日本語では **「アドレス解決プロトコル」** と呼ばれています。

**「プロトコル」** とは、コンピュータ同士が通信を行う際のルールのことで、ネットワークの世界における共通言語のようなものです。

ARPは、 **IPアドレス** から **MACアドレス** を調べるためのプロトコルです。

**IPアドレス** と **MACアドレス** の違いに混乱してしまう方もいるかもしれません。
簡単に説明すると、

* **IPアドレス**: インターネット上のコンピュータの住所🏡のようなものです。
* **MACアドレス**: ネットワークカード (コンピュータをネットワークに接続するための部品) に割り当てられた、世界で一つだけの固有の番号🔑のようなものです。

ネットワークでデータを送る際には、IPアドレスとMACアドレスの両方が必要になります。

ARPは、 **「このIPアドレスのコンピュータのMACアドレス、知っていますか？」** と尋ねるためのプロトコルです。


### 2. ARPの役割 🤔

ARPは、ネットワーク通信をスムーズに行うために、とても重要な役割を担っています。

ARPがなかったら、どうなるでしょうか？ 🤔

例えば、あなたが友達に手紙✉️を送りたいとします。

あなたは、友達の名前と住所🏡を知っています。

しかし、郵便番号📮を知りません。

この場合、手紙は友達に届きませんよね？😥

ARPは、ネットワークの世界🌐における郵便番号📮のような役割を果たしています。

IPアドレス (住所) だけでは、データ (手紙) を正しい宛先 (コンピュータ) に届けることができません。

ARPを使ってMACアドレス (郵便番号) を調べることで、データを確実に届けられるようになるのです。


### 3. ARPの仕組み 🔄

ARPは、ARPリクエストとARPレスポンスという2つのメッセージ💬をやり取りすることで、MACアドレスを調べます。

1.  **ARPリクエスト**: 送信元のコンピュータは、調べたいIPアドレスを指定して、ネットワーク内にARPリクエストをブロードキャスト (みんなに聞こえるように送信📢) します。
    * 「このIPアドレスのMACアドレス、誰か知っていますかー？」🗣️
2.  **ARPレスポンス**: 指定されたIPアドレスを持っているコンピュータは、自分のMACアドレスを返信します。
    * 「はーい！ 私のMACアドレスはコレです！」🙋‍♀️
3.  **MACアドレスの取得**: 送信元のコンピュータは、ARPレスポンスからMACアドレスを取得し、データを送信することができます。
    * 「ありがとう！ これでデータを送れます！」😊


### 4. ARPテーブル 🗄️

ARPは、一度調べたMACアドレスを覚えておくために、ARPテーブルと呼ばれる表を使っています。

ARPテーブルには、IPアドレスとMACアドレスの対応表が保存されています。

次回同じIPアドレスにデータを送るときには、ARPテーブルを参照することで、再度ARPリクエストを送信しなくても、MACアドレスを知ることができるんですね。

例えるなら、友達の住所と郵便番号をメモ📝しておいて、次回手紙✉️を送るときには、メモを見ればすぐに宛先が分かる、みたいな感じですね。 😉


### 5. プロキシARP 🤖

プロキシARPとは、ルータ📡 (ネットワークを繋ぐ機器) が、他のコンピュータの代わりにARPレスポンスを返す機能です。

少しややこしいかもしれませんが、例え話で説明します。

例えば、マンション🏢に住んでいるAさんが、Bさんに手紙✉️を送りたいとします。

しかし、Aさんは、Bさんの部屋番号🚪を知りません。

そこで、Aさんは、管理人さん👨‍💼に「Bさんの部屋番号、知っていますか？」と尋ねます。

すると、管理人さんは、Bさんの代わりに、「Bさんの部屋番号は○○号室です」と答えます。

Aさんは、管理人さんから教えてもらった部屋番号を使って、Bさんに手紙を送ることができます。

この管理人さんの役割が、プロキシARPです。

プロキシARPを使うことで、異なるネットワークにいるコンピュータ同士でも、ARPを使ってMACアドレスを調べることができるようになります。


### 6. まとめ

今回は、ARPについて、初心者の方向けに解説しました。

ARPは、IPアドレスからMACアドレスを調べるためのプロトコルで、ネットワーク通信をスムーズに行うために不可欠なものです。

この記事を通して、ARPの基礎知識を理解し、ネットワークの仕組みについて興味を持っていただけたら幸いです😊。


**参考文献**

* ARP - Wikipedia
* ARPとは？ - アドレス解決プロトコル - NTT東日本
* ARP（アドレス解決プロトコル）とは - IT用語辞典 e-Words
ロードマップジェネレーターを作った

お客さんにプロジェクトのロードマップをお見せする時に、今まではPower Pointで図形を組み合わせて作成していました。
ただあまりにも面倒だったので、良い感じにロードマップが生成されるWebアプリを作成しました。

# ざっくりまとめ

- タスクに開始日・終了日・バッファを入れると、タイムラインに追加される
- 作成したタスクはLocalStorageに保存する
- 作成したロードマップは画像で出力できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631074/4944b0cf-03ed-cd80-f5e6-7a72e75ab027.png)

https://tomodakengo.github.io/visual-roadmap/

# 技術スタック

https://github.com/tomodakengo/visual-roadmap

- NextJS
- TailwindCSS
- DnD Kit
- html-to-image

## 工夫した箇所

### 色を自由に選択できる

ビジュアル重視でいきたかったので、タスク選択時に自由に色を選択できるようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631074/d4c49bd3-2bd6-c607-1bef-f82028da6540.png)

### タスクの期間とバッファ期間を区別できる

ロードマップを作成する時に、きっちり開始日と終了日を定めず、バッファを前後に設けることが多かったので、バッファ期間を視覚的に分かりやすくしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631074/51887cbc-b665-6e8a-baa1-2bc4012ec496.png)

### 長期のロードマップの場合は月単位・四半期単位で表示される

デフォルトは日付単位で表示されますが、プロジェクトが長くなると日付が読めなくなります。
日付の文字が小さくなりすぎる場合は、月単位や四半期単位に自動でヘッダーが切り替わるようにしました。

```typescript:components/Timeline/Timeline.tsx
  const viewType = useMemo((): TimelineViewType => {
    if (scale >= 30) return "day";
    if (scale >= 10) return "month";
    return "quarter";
  }, [scale]);
```

```typescript:utils/timelineUtils.ts
switch (viewType) {
            case 'day':
                // 毎日の線（細い線）
                gridLines.push({
                    position,
                    label: formatDayLabel(currentDate),
                    type: currentDate.getDate() === 1 ? 'major' : 'minor'
                });
                currentDate.setDate(currentDate.getDate() + 1);
                break;

            case 'month':
                // 月の始まりのみ
                if (currentDate.getDate() === 1) {
                    gridLines.push({
                        position,
                        label: formatMonthLabel(currentDate),
                        type: 'major'
                    });
                }
                currentDate.setDate(currentDate.getDate() + 1);
                break;

            case 'quarter':
                // 四半期の始まり
                if (currentDate.getDate() === 1 && [0, 3, 6, 9].includes(currentDate.getMonth())) {
                    gridLines.push({
                        position,
                        label: formatQuarterLabel(currentDate),
                        type: 'major'
                    });
                }
                currentDate.setDate(currentDate.getDate() + 1);
                break;
```

# 感想

今回はCursorを使ってベースとなるコードを書いてもらいました。
その後、エラーになった個所や細かい文言を人力で修正しました。
結果として、構想から2時間ほどでデプロイすることが出来ました。

私自身、NextJSは浅く何も分かっていないので、こういったAIを活用してコードの組み立て方を学んでいけるのはとてもありがたいなと思いました。

## おまけ

四半期の表示が1月はじまりで固定なので、可変に出来ればと考えています。
また今は自動で日付・月・四半期が切り替わりますが、ドロップダウンから選択することで変えられるようにもしたいです。

今は困っていないので、困ったら機能追加しようと思います。
6日目



# Dataiku Docs Converter プロジェクト概要

## 1. ディレクトリ構成
```
dataiku-docs-converter/
├── Dockerfile          # Dockerコンテナ設定
├── requirements.txt    # Pythonパッケージ依存関係
├── .env               # 環境変数（APIキー等）
├── src/               # ソースコード
│   ├── main.py        # メインスクリプト
│   ├── scraper.py     # スクレイピング機能
│   ├── markdown_converter.py  # Markdown変換機能
│   └── link_fixer.py  # リンク修正機能
└── data/              # 出力データ
    ├── scraped_pages/ # スクレイピング結果
    ├── markdown_files/ # 変換後のMDファイル
    └── *.log          # 実行ログ
```

## 2. ワークフロー
```mermaid
graph TD
    A[開始] --> B[スクレイピング]
    B --> C[JSONファイル生成]
    C --> D[Markdown変換]
    D --> E[リンク修正]
    E --> F[終了]

    subgraph スクレイピングフェーズ
    B --> B1[ページ取得]
    B1 --> B2[メニュー解析]
    B2 --> B3[リンク抽出]
    B3 --> B1
    end

    subgraph Markdown変換フェーズ
    D --> D1[Azure OpenAI初期化]
    D1 --> D2[HTML→MD変換]
    D2 --> D3[ファイル保存]
    end

    subgraph リンク修正フェーズ
    E --> E1[相対パス検出]
    E1 --> E2[絶対URL変換]
    E2 --> E3[ファイル更新]
    end
```

## 3. 実行結果
- スクレイピング：
  - 収集したURL数: 1,222件
  - 出力: `data/scraped_pages/pages_info_[timestamp].json`

- Markdown変換：
  - 処理したファイル数: 1,222件
  - 成功率: 100%
  - 出力: `data/markdown_files/*.md`

- リンク修正：
  - 処理したファイル数: 1,222件
  - 成功率: 100%
  - 出力: 既存MDファイルの更新

## 4. 使用ツールの解説

### スクレイピング（scraper.py）
- **使用ライブラリ**: 
  - `requests`: HTTPリクエスト
  - `BeautifulSoup4`: HTML解析
- **主な機能**:
  - 再帰的なページ探索
  - メニュー構造の解析
  - JSON形式でのメタデータ保存

### Markdown変換（markdown_converter.py）
- **使用ライブラリ**:
  - `markitdown`: HTML→Markdown変換
  - `Azure OpenAI`: テキスト処理
- **主な機能**:
  - HTML内容の構造化抽出
  - Markdown形式への変換
  - メタデータの付加

### リンク修正（link_fixer.py）
- **使用ライブラリ**:
  - `urllib.parse`: URL処理
  - `re`: 正規表現処理
- **主な機能**:
  - 相対パスの検出
  - 絶対URLへの変換
  - ファイル内容の更新

### 実行環境（Dockerfile）
- Python 3.10ベース
- 必要なパッケージの自動インストール
- ボリュームマウントによるデータ永続化
- 環境変数による設定管理
Terraformのコメントの書き方について

# はじめに

どうも、@to-fmakです。最近、弊社におけるTerraformのコーディングルールをアップデートしました。その際に決定したコメントの書き方について、この記事で共有したいと思います。

## Terraformのバージョン

現在、Terraformのバージョンは`1.9系`を使用しています。

# Terraformにおけるコメントの書き方

Terraformでは以下の3種類のコメントスタイルがサポートされています。

- `#`
- `//`
- `/* */`

```txt:公式ドキュメントより抜粋
The Terraform language supports three different syntaxes for comments:

    # begins a single-line comment, ending at the end of the line.
    // also begins a single-line comment, as an alternative to #.
    /* and */ are start and end delimiters for a comment that might span over multiple lines.

The # single-line comment style is the default comment style and should be used in most cases. Automatic configuration formatting tools may automatically transform // comments into # comments, since the double-slash style is not idiomatic.
```

https://developer.hashicorp.com/terraform/language/syntax/configuration

公式ドキュメントに記載されている通り、`#`が最も一般的なスタイルです。

# 弊社でのコーディングルール

弊社では、以下のルールでコメントの書き方を使い分けています。

- `/* */` (複数ブロックの注釈)
  - 複数のコードブロックを1つの塊として扱う場合、最初のコードブロックの上に`/* */`を使用してコメントを記述する
- `#`(複数行の注釈)
  - 複数行のコードに対する注釈を付ける場合、該当コードの上に`#`を使用する。この際、対象コードの前後に改行を入れ、可読性を確保する
- `#`(単一行の注釈)
  - 単一行のコードに対する注釈の場合、該当コードの右側に`#`を使用する。ただし、コードが長い場合はコードの上に記述する
- `//`(一時的なコメントアウト)
  - 一時的に無効化するコードには、`//`を使用してコメントアウトする

```hcl:例
/*
 * ネットワーク設定
 */
resource "aws_vpc" "example" {
  cidr_block = "172.16.0.0/16"

  tags = {
    Name = "tf-example"
  }
}

resource "aws_subnet" "example" {
  vpc_id            = aws_vpc.example.id

  # ciderとazの設定
  cidr_block        = "172.16.10.0/24"
  availability_zone = "us-east-2a"

  tags = {
    Name = "tf-example" # nameタグ
    // TmpName = "sample" # 一時的な設定
  }
}

/*
 * XXX設定
 */
 ...
 ...

```

# コーディングルールを決めた理由

- 一般的なスタイルに準拠
  - `#`が最も一般的であるため、基本的にコードに注釈を付ける際は`#` を使用する
- 可読性の向上
  - 複数のコードブロックを1つの塊として扱う際は`/* */`を使うことで、`#`と区別しやすくなり、全体の可読性が向上する
- 一時的なコメントアウトの明確化
  - `//`を使用することで、通常のコメントと区別がつきやすくなる。コメントアウトは基本的に一時的に無効化するコードに使用するため、長期的に残さない前提である

# おわりに

今回は、Terraformにおけるコメントの書き方と、弊社のコーディングルールについて紹介しました。
コーディングルールは、チーム内で合意することが重要であり、必ずしも正解が一つだけというわけではありません。この記事が、皆さんのルール策定の参考になれば幸いです。

# 参考URL

https://developer.hashicorp.com/terraform/language/syntax/configuration

# エンジニア募集

Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています！！
ぜひお気軽にカジュアル面談へお越しください！！

https://gakken-leap.co.jp/recruit/
circuitjsの作法 その30

# 概要
circuitjsを調査してみた。
練習問題やってみた。

# 練習問題
リレーで、Dラッチを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ce36aa71-b8db-386b-d4f8-ef8d93938fb4.png)

# ネットリスト

```
$ 1 0.000005 10.20027730826997 50 5 50 5e-11
178 448 336 448 432 6 1 0.2 0 0.05 1000000 0.02 20 0.015 0.005 0
178 560 336 560 432 6 1 0.2 0 0.05 1000000 0.02 20 0.015 0.005 0
178 672 336 672 432 6 2 0.2 0.000004999799010094096 0.05 1000000 0.02 20 0.015 0.005 0
178 848 336 848 432 6 2 0.2 1.0049394519926944e-10 0.05 1000000 0.02 20 0.015 0.005 0
R 304 96 240 96 0 0 40 5 0 0 0.5
g 416 432 416 448 0 0
g 528 432 528 448 0 0
g 640 432 640 448 0 0
g 816 432 816 448 0 0
w 304 96 320 96 0
w 320 96 320 160 0
w 320 160 352 160 0
w 320 160 320 192 0
w 320 192 352 192 0
w 432 192 432 240 0
w 432 240 416 240 0
w 416 240 416 336 0
w 528 336 528 160 0
w 432 160 528 160 0
w 320 96 448 96 0
w 560 336 560 96 0
w 448 96 560 96 0
w 672 336 672 304 0
w 672 304 736 304 0
w 576 512 752 512 0
w 640 272 768 272 0
w 640 272 640 336 0
w 752 512 832 512 0
w 736 304 816 304 0
w 816 304 816 336 0
w 768 272 848 272 0
w 848 272 848 336 0
g 704 432 704 448 0 0
g 880 432 880 448 0 0
162 720 128 720 176 2 default-led 1 0 0 0.01
162 896 128 896 176 2 default-led 1 0 0 0.01
w 720 176 720 336 0
w 896 176 896 336 0
w 560 96 720 96 0
w 720 96 720 128 0
w 720 96 896 96 0
w 896 96 896 128 0
w 432 432 432 480 0
w 432 480 464 480 0
w 464 480 656 480 0
w 656 480 688 480 0
w 688 480 688 432 0
w 832 512 864 512 0
w 864 512 864 432 0
s 352 160 432 160 0 1 false
w 464 432 464 512 0
w 464 512 576 512 0
w 496 448 496 304 0
w 496 304 448 304 0
w 448 304 448 336 0
w 496 448 544 448 0
w 544 448 544 432 0
s 352 192 432 192 0 1 true
x 390 127 407 130 4 24 D
x 394 231 409 234 4 24 T


```

以上。
ニュートン法と準ニュートン法

## 1. ニュートン法

目的関数 $f: \mathbb{R}^n \to \mathbb{R}$ の最小化を考えます：

```math
\text{minimize} \quad f(x), \quad x \in \mathbb{R}^n
```

ニュートン法による更新式：

```math
dx = -[\nabla^2 f(x)]^{-1} \nabla f(x)
```

ここで、$\nabla f(x) \in \mathbb{R}^n$ は勾配、$\nabla^2 f(x) \in \mathbb{R}^{n \times n}$ はヘッセ行列を表します。

# 準ニュートン法

## 1. 準ニュートン法の基本概念

ニュートン法は二階微分（ヘッセ行列）を必要としますが、これは以下の理由で計算コストが高くなりがちです：
- 高次元の場合、ヘッセ行列の計算が非常に高い
- 行列の記憶容量が $O(n^2)$ 必要
- 各反復で行列の逆行列計算が必要

準ニュートン法は、ヘッセ行列を直接計算する代わりに、勾配の情報から徐々にヘッセ行列（の近似）を構築していきます。

### 更新式の基本形

```math
dx = -B_k^{-1} \nabla f(x_k)
```

ここで：
- $B_k$ はヘッセ行列 $\nabla^2 f(x_k)$ の近似
- $B_k$ は対称性と正定値性を保持するように更新

## 2. セカント条件

準ニュートン法では、以下のセカント条件を満たすように $B_{k+1}$ を更新します：

```math
B_{k+1}s_k = y_k
```

ここで：
- $s_k = x_{k+1} - x_k$：位置の変化
- $y_k = \nabla f(x_{k+1}) - \nabla f(x_k)$：勾配の変化

この条件は、一次の差分近似から導かれる自然な要請です。


## 3. 代表的な更新公式

### BFGS法
最も広く使われている準ニュートン法の一つです。

```math
dB = - \frac{B_k s_k s_k^T B_k}{s_k^T B_k s_k} + \frac{y_k y_k^T}{y_k^T s_k}
```

または、逆行列の直接更新形式：

```math
H_{k+1} = (I - \rho_k s_k y_k^T)H_k(I - \rho_k y_k s_k^T) + \rho_k s_k s_k^T
```

ここで $H_k = B_k^{-1}$, $\rho_k = 1/(y_k^T s_k)$ です。


### BFGS法の特性

BFGS法は以下のような優れた特性を持ちます：

1. **正定値性の自動的な保持**
   - 初期行列 $B_0$ が正定値であれば、更新後も正定値性が自動的に保持される
   - 修正ニュートン法のような明示的な正規化が不要
   - Wolfe条件を満たすライン探索を行えば $y_k^T s_k > 0$ が保証され、正定値性が維持される

2. **効率的な実装**
   - 逆行列の直接更新形式により、$O(n^3)$ の逆行列計算を回避可能
   - 行列-ベクトル積の計算が主要な計算コスト

3. **優れた収束特性**
   - 局所的な超線形収束性を持つ
   - 実用的な収束速度と数値的な安定性のバランスが良好

これらの特性により、BFGS法は実践的な最適化問題において広く使用されています。特に、以下のような状況で効果的です：
- ヘッセ行列の計算が困難または高コストな場合
- 問題の規模が中程度（数百〜数千変数）の場合
- 目的関数が十分滑らかな場合

### L-BFGS法
Limited-memory BFGS法は、完全な行列を保存せず、過去 $m$ 回分の $(s_k, y_k)$ ペアのみを保持します：

- 記憶容量: $O(mn)$ ($n$ は変数の次元)
- 行列-ベクトル積の計算量: $O(mn)$
- $m$ は通常 3〜20 程度

更新には two-loop recursion アルゴリズムを使用：

```math
\begin{align*}
q &\leftarrow \nabla f(x_k) \\
\text{for } i &= k-1, k-2, ..., k-m \\
\alpha_i &= \rho_i s_i^T q \\
q &\leftarrow q - \alpha_i y_i \\
r &= H_0^k q \\
\text{for } i &= k-m, ..., k-1 \\
\beta &= \rho_i y_i^T r \\
r &\leftarrow r + s_i(\alpha_i - \beta)
\end{align*}
```

ここで $r$ が最終的な探索方向となります。


### セカント条件とKLダイバージェンス

実際、BFGS更新式は以下のKLダイバージェンス最小化問題の解として導出できます：

```math
\min_{B_{k+1}} D_{KL}(B_{k+1} || B_k) \quad \text{subject to} \quad B_{k+1}s_k = y_k, \quad B_{k+1} = B_{k+1}^T
```

ここで、行列のKLダイバージェンスは以下のように定義されます：

```math
D_{KL}(B_{k+1} || B_k) = \text{tr}(B_{k+1}B_k^{-1}) - \ln\det(B_{k+1}B_k^{-1}) - n
```

この最適化問題は、新しい近似ヘッセ行列 $B_{k+1}$ が:
1. セカント条件を満たし
2. 対称性を保持しつつ
3. 前回の近似 $B_k$ からの情報理論的な意味での「距離」を最小化

することを要求しています。

興味深いことに、KLダイバージェンスの順序を逆にした最小化問題：

```math
\min_{B_{k+1}} D_{KL}(B_k || B_{k+1}) \quad \text{subject to} \quad B_{k+1}s_k = y_k, \quad B_{k+1} = B_{k+1}^T
```

を解くと、DFP (Davidon-Fletcher-Powell) 法の更新式が導出されます。
circuitjsの作法 その29

# 概要
circuitjsを調査してみた。
リレー回路で、Dフリップフロップ回路を見つけたので、やってみた。

# 参考にしたページ


https://kanade-k-1228.github.io/Lab/Computer/RelayComputer/Day5_DFF/


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7f203d72-2978-fb43-84d4-3c0aea8c8566.png)


# ネットリスト

```
$ 1 0.000005 10.20027730826997 50 5 50 5e-11
178 1008 336 1008 432 6 1 0.2 0.16187937265497457 0.05 1000000 0.02 20 0.015 0.005 1
178 464 336 464 432 6 2 0.2 0 0.05 1000000 0.02 20 0.015 0.005 0
178 624 336 624 432 6 2 0.2 0 0.05 1000000 0.02 20 0.015 0.005 0
178 784 336 784 432 6 3 0.2 0.00000499989994100768 0.05 1000000 0.02 20 0.015 0.005 0
R 304 96 240 96 0 0 40 5 0 0 0.5
g 432 432 432 448 0 0
g 592 432 592 448 0 0
g 752 432 752 448 0 0
w 304 96 320 96 0
w 320 96 320 160 0
w 320 160 352 160 0
w 320 160 320 192 0
w 320 192 352 192 0
w 320 96 448 96 0
162 1104 336 1104 384 2 default-led 1 0 0 0.01
s 352 160 432 160 0 1 false
x 358 133 375 136 4 24 D
x 360 226 405 229 4 24 CLK
g 976 432 976 448 0 0
g 1104 384 1104 400 0 0
s 352 192 432 192 0 1 true
w 528 96 560 96 0
w 976 336 976 304 0
w 1104 304 1104 336 0
w 432 160 432 336 0
w 592 336 592 192 0
w 432 192 592 192 0
w 464 336 464 96 0
w 448 96 464 96 0
w 464 96 528 96 0
w 1008 336 1008 304 0
w 976 304 1008 304 0
w 1008 304 1104 304 0
w 608 432 608 480 0
w 688 432 688 480 0
w 608 480 688 480 0
w 576 480 608 480 0
w 576 480 576 96 0
w 560 96 576 96 0
w 624 320 624 336 0
w 624 320 560 320 0
w 560 320 560 480 0
w 560 480 448 480 0
w 448 480 448 432 0
w 624 320 832 320 0
w 832 320 832 336 0
w 816 432 816 480 0
w 736 336 752 336 0
w 736 336 736 480 0
w 496 432 496 512 0
w 496 512 736 512 0
w 736 480 736 512 0
w 736 512 816 512 0
w 816 512 816 480 0
w 640 432 640 448 0
w 640 448 544 448 0
w 544 448 544 336 0
w 544 336 544 320 0
w 512 320 544 320 0
w 512 320 512 336 0
w 992 432 992 464 0
w 672 336 672 288 0
w 944 464 992 464 0
w 880 336 880 288 0
w 768 432 768 464 0
w 768 464 720 464 0
w 720 464 720 96 0
w 576 96 720 96 0
w 864 432 864 464 0
w 672 288 672 256 0
w 944 256 944 464 0
w 656 432 656 448 0
w 656 448 704 448 0
w 704 448 704 288 0
w 704 288 880 288 0
w 784 336 784 256 0
w 672 256 784 256 0
w 784 256 944 256 0
w 864 464 928 464 0
w 928 464 928 304 0
w 928 304 976 304 0

```

以上。
レシピ管理アプリ『Recipedia』の開発ストーリーと技術スタック

# 目次
 - [アプリ開発の経緯](#アプリ開発経緯)
 - [アプリの概要](#アプリの概要)
 - [技術スタック](#技術スタック)
 - [選定理由](#選定理由)
 - [主要機能](#主要機能)
 - [終わりに](#終わりに)
# アプリ開発経緯
**散らばるレシピカードをどうにかしたい！**

　私はスーパーで配布されているレシピ付きフリーペーパーをよく持ち帰りますが、大掃除で保管場所を見直したところ、散乱して整理されていないことに気づきました。
  　そこで『これをアプリで管理できれば便利だ！』と思い立ち、個人的に開発を始めることにしました。
　今年から社内でフロントエンドエンジニアとして働く予定があり、勉強も兼ねています。この記事では、開発を進めながら諸先輩方のアドバイスもいただけたらと思います。
# アプリの概要
　**『Recipedia』の特徴**
 
 ・スーパーなどで配布されるレシピ付きフリーペーパーを一元管理。
 ・料理好きな人や主婦層をターゲット。
 ・クックパッドやクラシルとは異なり、既存のレシピをまとめることに特化。
 ・完成後は地域限定のレシピをユーザー同士でシェアできる機能も検討。

# 技術スタック
・フロントエンド: React-Native（モバイルアプリの開発を簡単に行うため）
・バックエンド: Node.js, PHP（柔軟なAPI構築と既存システムとの連携）
・データベース: MySQL（レシピ情報を効率的に管理するため）
・ネイティブ機能: Objective-C（iOSデバイス向けにネイティブ機能を活用）
# 選定理由
　これらの言語は、これから入る会社で使用することが予定されている言語であり、モダンな言語中心ではあるが、Objective-cのようなレガシー言語も取り入れました。

 # 主要機能
 **レシピカードの撮影と管理**
   ・スマホでレシピカードを撮影し、アプリ内で一元管理。
 **OCRによるテキスト化** 
   ・撮影したレシピ画像から文字情報を抽出。
 **マイページ設計** 
 ・自分専用のページでレシピ情報を整理・閲覧。

 # 終わりに
　これからフロントエンドエンジニアとしてキャリアを進んでいくにあたって自信つけ、今後会社で使用する予定の言語を勉強するために今回アプリを開発していきます。
　進捗状況等をこれから少しずつではあるが記事にして行きますが、この開発について意見やアドバイスがあれば教えてください！よろしくお願いします！

 P.S.
 GithubのURLは載せるべきなのか...？🤔
PineScriptでバックテストを行う方法と注意したい落とし穴

## 概要  
本記事では、TradingViewにおける[PineScript](https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qtf-tradingview)を用いてバックテストを行う手法を解説する。システムトレードにおいてバックテストは戦略の有効性を検証するための重要な工程である。しかし、その実施に際しては注意すべき点が多々存在する。本稿では基本的な実装方法に加え、バックテストに潜む落とし穴についても言及し、誤解のない設計を行うための指針を提示する。  

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qtf-tradingview

## 対象読者  
本記事は以下に該当する読者を対象としている：  
- TradingViewおよびPineScriptに興味を持ち、バックテストを行いたい方  
- システムトレード初心者の方  
- バックテストにおける課題や注意点を知りたい方  

---

## PineScriptを用いたバックテストの基礎  

### ストラテジー型スクリプトの活用  
PineScriptでは`indicator`ではなく`strategy`を用いることで、バックテストが可能となる。`strategy.entry`および`strategy.exit`関数を利用することで、売買シグナルに基づく取引をシミュレートできる。以下は単純な移動平均クロス戦略を用いたバックテストの例である。  

```pinescript
//@version=5
strategy("Moving Average Crossover", overlay=true)

// パラメータ設定
fastLength = input.int(10, title="Fast MA Length")
slowLength = input.int(50, title="Slow MA Length")

// 移動平均の計算
fastMA = ta.sma(close, fastLength)
slowMA = ta.sma(close, slowLength)

// クロス判定
longCondition = ta.crossover(fastMA, slowMA)
shortCondition = ta.crossunder(fastMA, slowMA)

// エントリー・エグジット
if (longCondition)
    strategy.entry("Long", strategy.long)

if (shortCondition)
    strategy.entry("Short", strategy.short)

// チャート描画
plot(fastMA, color=color.blue, title="Fast MA")
plot(slowMA, color=color.red, title="Slow MA")
```  

---

## 実装手順  

1. **スクリプト作成**  
   上記のコードをTradingViewのPineエディタに入力し、保存する。  
2. **チャート適用**  
   作成したスクリプトをチャートに適用することで、バックテスト結果が表示される。  
3. **パラメータの調整**  
   `fastLength`や`slowLength`といったパラメータを調整し、戦略のパフォーマンスを比較検証する。  

---

## 注意したい落とし穴  

### 1. 過剰最適化  
バックテストにおいて、過剰にパラメータを調整する行為（カーブフィッティング）は避けるべきである。過剰最適化された戦略は過去データに特化しすぎており、将来の市場環境に対応できない場合がある。  

### 2. ヒンサイトバイアス  
バックテストの設計において、未来のデータを参照しないようにする必要がある。PineScriptではルックアヘッドバイアスが発生しやすいため、条件設定時には`bar_index`や`ta.valuewhen`を用いてデータ参照が正しい位置で行われていることを確認する必要がある。  

### 3. 手数料とスリッページの考慮不足  
現実のトレードでは手数料やスリッページが結果に大きな影響を与える。PineScriptの`strategy`にはこれらを設定するオプションがあるため、必ず考慮に入れるべきである。  

```pinescript
strategy("Example", commission_type=strategy.commission.percent, commission_value=0.1)
```  

### 4. データ期間の偏り  
バックテストの結果が一時的な市場状況に依存していないか確認するために、十分に長いデータ期間を用いるべきである。また、異なる市場環境でのパフォーマンスを比較するために複数の期間を検証することが望ましい。  

---

## 結論  
PineScriptを用いたバックテストは、戦略の検証において非常に有用な手法である。しかし、バックテスト結果が過信に値するかどうかは、実装方法やデータ選定、リスク管理にかかっている。本記事で挙げた注意点を参考に、信頼性の高いバックテストを行い、実践的なトレード戦略を構築していただきたい。  

皆様のトレードがより良い結果をもたらすことを祈っている。  


---

APIドキュメント：

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qtf-tradingview

---

## 免責事項  

本記事に記載されている内容は、筆者がTradingViewおよびPineScriptを用いて学び得た知識と経験を基に執筆したものである。内容の正確性および完全性については可能な限り配慮しているが、必ずしもその保証をするものではない。  

自動売買Botの構築や運用、またそれに関連する投資活動は読者自身の判断と責任に基づいて行われるべきであり、筆者および本記事を掲載するプラットフォーム（Qiita）は、それによって生じたいかなる損失や損害に対しても一切の責任を負わないものとする。  

特に、トレードに関する意思決定は市場リスクを伴うため、実運用前に十分な検証とリスク評価を行い、必要に応じて専門家への相談を推奨する。  

読者各位の責任において本記事をご活用いただければ幸いである。
PineScriptで独自インジケーターを作成する方法と注意点

## 概要  
本記事では、TradingViewの[PineScript](https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qte-tradingview)を使用して独自インジケーターを作成する方法について解説する。システムトレードにおいて、独自のインジケーターを用いることで、他のトレーダーと差別化された戦略を構築できる。PineScriptは簡潔で強力な言語であり、自由度の高いインジケーターを作成するための基礎を学べる。本記事を通じて、独自インジケーターの作成方法および実装時の注意点を理解していただけるだろう。  

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qte-tradingview

## 対象読者  
本記事は以下の読者を対象としている。  
- TradingViewおよびPineScriptに興味がある方  
- 独自のインジケーターを作成し、トレード戦略を強化したい方  
- システムトレードやアルゴリズムトレードの知識を深めたい方  

---

## PineScriptにおけるインジケーターの基本構造  
PineScriptは、TradingView上で動作するカスタムインジケーターを作成するためのプログラミング言語であり、独自の指標やシグナルを描画するために使用される。PineScriptには、インジケーターの作成に必要な基本的な構造と関数が備わっている。まずは、簡単なインジケーターを作成してみよう。

```pinescript
//@version=5
indicator("Custom Indicator", overlay=true)

// 移動平均の計算
maLength = input.int(14, title="MA Period")
ma = ta.sma(close, maLength)

// 移動平均をチャートに描画
plot(ma, color=color.blue, title="SMA")

// シグナルを表示
plotshape(series=cross(close, ma), title="Cross Signal", location=location.abovebar, color=color.red, style=shape.labelup, text="CROSS")
```

このコードは、単純移動平均(SMA)を計算し、価格がその移動平均をクロスした時にシグナルを表示するインジケーターを作成する。基本的な要素は以下の通りである。  
- `indicator`関数でインジケーター名を定義  
- `input.int`関数でユーザーからの入力を受け付け  
- `ta.sma`関数で移動平均を計算  
- `plot`関数でチャートにインジケーターを描画  
- `plotshape`関数でシグナルを表示  

---

## インジケーター作成時のステップ  
インジケーターを作成する際は、以下の手順を踏むと良い。  

### 1. コンセプトの設計  
インジケーターを作成する前に、まずその目的を明確にする必要がある。例えば、エントリーやエグジットのシグナルを示すのか、トレンドの強弱を測定するのか、単にマーケットのボラティリティを測るのか、目的に応じた設計が求められる。

### 2. 計算ロジックの決定  
インジケーターがどのようなデータを使い、どのような計算を行うかを定義する。PineScriptでは、テクニカル指標に基づく多くの関数（移動平均、RSI、MACD、ボリンジャーバンド等）が用意されているため、必要な計算方法を選択し、それに基づいてロジックを実装する。

### 3. チャートへの描画  
計算結果をチャートにどのように描画するかを決める。`plot`関数を使用してインジケーターを描画し、視覚的に分かりやすいように工夫する。さらに、`plotshape`や`plotchar`関数を用いて、特定のシグナルを可視化することが可能である。

### 4. ユーザー入力の設定  
インジケーターに対してパラメータを動的に変更できるように、`input`関数を用いてユーザー入力を受け付けることができる。これにより、異なる市場条件に応じてインジケーターの設定を変更しやすくなる。

---

## 注意点  

### 1. 計算量とパフォーマンスの最適化  
PineScriptでは、リアルタイムで計算を行うため、インジケーターが複雑になりすぎるとパフォーマンスに影響を与えることがある。特に、過去のデータを大量に参照するような処理を行う場合は、計算量が増大し、チャートの更新速度が遅くなる可能性がある。このため、必要なデータのみを参照するような工夫が求められる。

### 2. シグナルの過剰最適化  
インジケーターを作成する際、過去のデータに対して過剰に最適化することは避けるべきである。過剰最適化は、バックテストでは成功を収めるかもしれないが、実際の市場での動きに適応しきれない可能性が高い。シンプルで堅実なロジックを使用し、過剰に複雑化しないよう注意する。

### 3. 設定値の柔軟性  
インジケーターが特定の市場や時間枠に対して特化しすぎると、他の条件下では効果的に機能しない可能性がある。ユーザーに設定を変更できる柔軟性を提供することで、さまざまな市場状況に対応できるインジケーターを作成することが望ましい。

---

## 結論  
PineScriptを使用した独自インジケーターの作成は、トレード戦略をカスタマイズし、他のトレーダーとの差別化を図るための有効な手段である。インジケーター作成の際は、シンプルで直感的なロジックを意識し、過剰最適化やパフォーマンス低下に注意を払いながら開発を行うべきである。本記事で紹介した手順や注意点を参考に、より効果的なトレードインジケーターを開発していただきたい。


---

APIドキュメント：

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qte-tradingview

---

## 免責事項  

本記事に記載されている内容は、筆者がTradingViewおよびPineScriptを用いて学び得た知識と経験を基に執筆したものである。内容の正確性および完全性については可能な限り配慮しているが、必ずしもその保証をするものではない。  

自動売買Botの構築や運用、またそれに関連する投資活動は読者自身の判断と責任に基づいて行われるべきであり、筆者および本記事を掲載するプラットフォーム（Qiita）は、それによって生じたいかなる損失や損害に対しても一切の責任を負わないものとする。  

特に、トレードに関する意思決定は市場リスクを伴うため、実運用前に十分な検証とリスク評価を行い、必要に応じて専門家への相談を推奨する。  

読者各位の責任において本記事をご活用いただければ幸いである。
PineScriptでアラートを使ったトレードを行う方法と注意点

## 概要  
本記事では、TradingViewにおける[PineScript](https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qtd-tradingview)を用いたアラート機能を活用したトレードの実践方法について解説する。システムトレードやアルゴリズムトレードにおいて、効率的かつ信頼性の高いエントリー・エグジットを実現するための手法を提示するとともに、アラート設定時の注意点についても言及する。  

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qtd-tradingview

## 対象読者  
本記事は以下のような方を対象としている。  
- TradingViewおよびPineScriptに興味がある方  
- システムトレードを試みたい方  
- アラート機能を活用した自動化に関心をお持ちの方  

---

## PineScriptにおけるアラート機能の概要  
TradingViewのアラート機能は、ユーザーが設定した条件に基づいて通知を送信する強力なツールである。特にPineScriptを活用することで、複雑な条件やカスタムロジックを用いたアラートを作成可能となる。アラートはトレードの効率化や感情を排した意思決定に寄与しうる。  

### 主なアラートの用途  
1. エントリーシグナルの通知  
2. エグジットシグナルの通知  
3. 特定のマーケットコンディションの識別  

---

## 実装手順  

### 1. スクリプトの作成  
以下は簡単な移動平均クロスを用いたアラートの例である。  

```pinescript
//@version=5
indicator("MA Cross Alert", shorttitle="MACA", overlay=true)

// 移動平均の計算
fastMA = ta.sma(close, 10)
slowMA = ta.sma(close, 50)

// 移動平均のクロス判定
crossUp = ta.crossover(fastMA, slowMA)
crossDown = ta.crossunder(fastMA, slowMA)

// チャートへの描画
plot(fastMA, color=color.blue, title="Fast MA")
plot(slowMA, color=color.red, title="Slow MA")

// アラート条件の設定
alertcondition(crossUp, title="Bullish Cross", message="Fast MA crossed above Slow MA")
alertcondition(crossDown, title="Bearish Cross", message="Fast MA crossed below Slow MA")

// シグナル表示
plotshape(series=crossUp, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")
plotshape(series=crossDown, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL")
```  

### 2. アラートの設定  
1. スクリプトをチャートに適用する。  
2. TradingViewの「アラート」ボタンをクリックし、新しいアラートを作成する。  
3. 条件欄に`MA Cross Alert`を選択し、`Bullish Cross`または`Bearish Cross`を選択。  
4. 通知方法や頻度を設定する。  

---

## 注意点  

### 1. 過剰最適化への警戒  
アラート条件を作成する際に複雑すぎるロジックを使用すると、過剰最適化に陥る危険性がある。その結果、バックテストでは高い成功率を示しても、実運用においては期待通りの結果が得られないことがある。  

### 2. レイテンシと精度  
アラートはリアルタイムで動作するものの、取引所データの更新頻度やインターネット接続環境によって遅延が発生する場合がある。この点を考慮し、ロジックに適切なバッファを設けることが望ましい。  

### 3. アラート頻度の管理  
頻繁にアラートがトリガーされる場合、ノイズとして扱われやすい。重要な条件に絞ったアラート設定が推奨される。  

---

## 結論  
PineScriptを用いたアラート機能は、トレードの効率化や意思決定プロセスの改善に大いに役立つ。しかしながら、注意深い設計と実装が必要である。本記事で提示した実装例や注意点を参考に、効果的なトレード環境を構築していただきたい。  

読者の皆様のトレードがより洗練されたものとなることを願っている。


---

APIドキュメント：

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qtd-tradingview

---

## 免責事項  

本記事に記載されている内容は、筆者がTradingViewおよびPineScriptを用いて学び得た知識と経験を基に執筆したものである。内容の正確性および完全性については可能な限り配慮しているが、必ずしもその保証をするものではない。  

自動売買Botの構築や運用、またそれに関連する投資活動は読者自身の判断と責任に基づいて行われるべきであり、筆者および本記事を掲載するプラットフォーム（Qiita）は、それによって生じたいかなる損失や損害に対しても一切の責任を負わないものとする。  

特に、トレードに関する意思決定は市場リスクを伴うため、実運用前に十分な検証とリスク評価を行い、必要に応じて専門家への相談を推奨する。  

読者各位の責任において本記事をご活用いただければ幸いである。
brainfuck 0の時だけ実行するコード #2

コード

https://editor.p5js.org/53627891/sketches/1YA4dYJzt

# 0の時だけ実行するコードをjsで書いてみる
```js
if(input == 0){
    //コード
}
```

brainf*ckには、0ではない時に実行できるコードがあります
``,[[-]#コード#]``
なので、==0を!=0に変えて、コードを書いてみます。

```js
let j = false;
if(, !== 0){
    j = true;
}
if(!j){
    //コード
}
```

このままbrainfuckに変えます

```
+        let j = false;
>,[      if(, !== 0){
<->          j = true;
[-]]     }
<[[-]>      if(j){
コード
<]    }
```

最終的に``>,[<+>[-]]<[[-]>コード<]``
とすることで0なら実行するコードができます！
Plugin for converting png to webp format in VSCode or cursor

When I was using Android Studio to develop projects, its built-in function to convert png to webp was a very useful feature.

But recently when I used Cursor to develop a project, Cursor didn't have this feature built-in , so I developed a plugin :fist::fist::fist:


https://marketplace.visualstudio.com/items?itemName=SilongLiu.ToooWebP


This plugin has a built-in cWebp tool library, so you don't need to download cWebp.

:point_right: **Features**
Convert png, jpg, jpeg to webp format images.

ToooWebP has two commands:

- ToWebP: Converts a single image to webp format and deletes the original image.

- ToooWebP: Convert multiple images to webp format and delete the originals.

Support: mac windows and linux
「Dream Machine Image API」を JavaScript SDK（公式）で試す（Text to Image）

以下の記事の中で扱った「Dream Machine」の話です。

●「Luma Dream Machine」公式の JavaScript SDK で動画生成（Text to Video） - Qiita
　https://qiita.com/youtoy/items/8de9def353715c6b4e91

上記ではテキスト入力による動画生成を試しましたが、今回はテキスト入力による画像生成をやってみます。

## 実際に試してみる
公式の情報を見ながら試していきます。

### 公式ドキュメント
「Dream Machine Image API」について、公式のドキュメントは以下になります。

●Image Generation
　https://docs.lumalabs.ai/docs/javascript-image-generation

### 事前の準備
前回と同様、今回も公式の JavaScript SDK を使うので、未インストールの場合はインストールをします。また、環境変数に APIキーを設定する形にします。

自分が試した環境は Mac ですが、以下のように進めました（前回と同じ内容）。

```zsh
npm install lumaai
export LUMAAI_API_KEY=【自分のAPIキー】
```

### 実際に試していく
それでは、コードを準備して実際に試します。
以下の公式サンプルをほぼそのまま使う形でやりました。

```javascript
const fetch = require('node-fetch');
const fs = require('fs');
const { LumaAI } = require('lumaai');

const client = new LumaAI({ authToken: process.env.LUMAAI_API_KEY });

async function generateImage() {
    let generation = await client.generations.image.create({
        prompt: "A teddy bear in sunglasses playing electric guitar and dancing"
    });

    let completed = false;

    while (!completed) {
        generation = await client.generations.get(generation.id);

        if (generation.state === "completed") {
            completed = true;
        } else if (generation.state === "failed") {
            throw new Error(`Generation failed: ${generation.failure_reason}`);
        } else {
            console.log("Dreaming...");
            await new Promise(r => setTimeout(r, 3000)); // Wait for 3 seconds
        }
    }

    const imageUrl = generation.assets.image;

    const response = await fetch(imageUrl);
    const fileStream = fs.createWriteStream(`${generation.id}.jpg`);
    await new Promise((resolve, reject) => {
        response.body.pipe(fileStream);
        response.body.on('error', reject);
        fileStream.on('finish', resolve);
    });

    console.log(`File downloaded as ${generation.id}.jpg`);
}

generateImage();
```

変更した箇所は、プロンプトを「氷と雷と炎のドラゴン、合計3匹が対峙しているシーン」という内容にしたくらいです。

#### 出力結果
上記の内容で試して、得られた結果は以下のとおりです。

https://x.com/youtoy/status/1877393819143999752

雷は出てきてますが、雷のドラゴンは出てないものになりました。

## その他
### API利用状況
前回と今回の API利用の状況を、以下で見てみました。

https://lumalabs.ai/dream-machine/api/usage
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0782bfc1-3927-77c3-b0e1-10a1202f7254.png)

お試しをした時の利用履歴が出ています。
【Agileworks仕様？】マスタ参照ウインドウの表示中に親画面の操作が出来てしまう

## はじめに
Agileworksにはマスタ参照機能があり、
それを使ってマスタ一覧から値を自動入力させることができます。

ただウインドウ表示中に親画面の操作が出来てしまうという仕様（バグ？）があり、
その穴をかいくぐるかのように、ウインドウが開いている状態で項目の手入力や申請ボタンの押下などされるユーザーがいたため、JavaScriptで対応させていただきました。
今回はその内容について記載したいと思います。

## JavaScriptで対応する場合

以下のソースコードを適用すればボタン押下時にマスタ参照ウインドウが開いている場合、
アラートメッセージが表示され、処理が中断されるようになります。

```javascript
WorkflowEvent.addEvent("ボタン名", "回付ルールID", checkOpenWindow);

function checkOpenWindow(){
  // マスタ参照ウインドウが開いているかチェック
  var window = document.getElementById("_XWebCal");
  if(window)
  {
    if(window.style.visibility=="visible"){
      alert("マスタ参照ウインドウを閉じてからボタン操作を行ってください。");
      return false;
    }
  }

  return true;
}
```
画面イメージ
※黒の塗りつぶしが多くて申し訳ないです…

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2258693/27e86cf7-b842-5197-e926-e030e59a9823.png)


## 標準機能で対応する場合
本件についてサポートサイトに問い合わせを行ったところ、
**該当フィールドを編集禁止**とすることで近しい動作が可能かと思われる、との情報をいただきました。

たしかに編集禁止状態でもマスタ参照設定による値の格納は可能なため、
手入力を行わない場合は、編集禁止としておけば無難かと思います。
※手入力を行う場合、この対応ではなくJavaScriptでの対応となります

## さいごに
あまり起こらない事象なはずなので、
内容を周知して運用でカバーするのが個人的には一番だと思います。
FMRを開発していた頃のはなし②

# 配属先
1990年、新卒で入社した配属先は南多摩工場の、「パーソナルシステム事業部第一技術部第二設計課」だった。富士通のパソコンやワープロ「オアシス」と周辺機器などハードウェアの設計開発を生業とする「パーソナルシステム事業部」で、ビジネス向けパソコン「FMR」シリーズのデスクトップモデルの回路設計を担当する「第一技術部」のうち、フラッグシップモデルが「第一設計課」、わが第二設計課はコストダウンモデルの担当だった。
他には、ノートブックモデル担当の第二技術部、「装置設計」と呼ばれ筐体の構造設計やプリント基板の実装設計のようなメカ担当の第三技術部、モデムやLANカードなどオプションカード担当の第四技術部、ワープロ担当のオアシス開発部、コンシューマ向けのFM-TOWNS開発部隊もいた。プリンタや外付けハードディスクドライブなどの周辺機器は、パーソナルシステム事業部(パソ事)の中にあったり、組織変更で「ペリフェラル事業部」に分かれたりしていた。(他所の部署と担当業務について記憶は正確ではないかもしれない)
だいたい4月と10月に全社で組織変更があって、本部事業部部課の名前が変わったり、統廃合されたり、新設されたりしていたが、業務内容は大きく変わることはなく、ただそのたび名刺を作り直すのが大いに無駄だと当時から感じていた。
自分に身近な話をしよう。配属先の第二設計課はコストダウンモデル、エントリーモデル担当なので、回路設計は先行設計している第一技術部の回路図などを流用する。当時、最先端のCPUを使って、NDAが無いと読めないドキュメントで設計している第一技術部はエリート集団に見えて、憧れの存在だった。しかし、さらに隣には、少人数で何をやっているか良くわからない「方式課」という上位存在がいた。「方式」とは「アーキテクチャ」のこと。FMRのアーキテクチャを統括し、なおかつ将来のアーキテクチャを検討する部隊が彼らだった。
# FMR
記事のタイトルにもある「FMR」についてここで紹介しておこう。とはいっても[Wikipediaで解説されている](https://ja.wikipedia.org/wiki/FMR%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA)ので、そちらを読んでもらった方が良いかもしれない。
当時、日本のビジネス向けパソコン市場ではNECのPC-9801ファミリが圧倒的なシェアを誇っていた。ただ、現在のようにパソコンはメーカーが変わっても互換性がある(同じアプリケーションソフトウェアが動く、共通のオプション機器が使える)ということはなく、Windows PCとMacがそうであるように、メーカーが違うと同じソフトが動かなかった。
(例外もあって、例えばエプソンはNEC PC-98シリーズと互換性のあるアーキテクチャを採用していた。そのことでNECから訴えられたりもしていた。要するにメーカーは独自アーキテクチャで「囲い込み」をしていた時代だった)
PC-9801も、富士通のFMRも、CPUは同じIntelの16/32ビットのCPU(と互換のアーキテクチャ)を採用しており、OSもいろいろ選ぶことはできたが、標準的にはMicrosoftのMS-DOS(のちWindows)と共通点も多かった。しかし、I/Oバスアーキテクチャが、PC-98は「Cバス」、FMRは「Rバス」と異なっており、これが独自アーキテクチャたる所以で、拡張スロットを使うオプションカード類はもちろん、I/Oアドレスのマッピングが共通ではないので、ソフトウェアでも互換性を持つことがなかった。
(これも例外があって、MS-DOSのシステムコールのうちハードウエア依存の低いものだけを使うようなプログラムだとか、共通の高級言語で書かれたプログラムなどで、どちらでも動かすことができるものもあった。例えば簡単なMS-DOSのバッチファイルは動くし、サードパーティーのBASICで書かれたプログラムが動いたりはした。コンパイルして機械語レベルになるとまずダメ。いわゆるバイナリ互換性は無かった)
80年代に登場したパーソナルコンピュータは、最初はホビー市場向けに電機メーカーなどの主に半導体事業部からリリースされた。最初は半導体を消費してもらうのが目的で、ホビイストを中心に「マイコンブーム」となった。最初は「パソコン」ではなく「マイコンピュータ」略して「マイコン」と呼んでいた。「御三家」と呼ばれていたのが、NEC、シャープ、富士通で、NECはPC-8001、シャープはMZ-80、富士通はFM-8を皮切りにシリーズ展開していた。実は富士通は中でも後発で、ベーシックマスターというシリーズを展開していた日立の方が先行していた。ただ、「コンピュータの富士通」という知名度と期待値があって後発ながら一気にシェアを拡大した。
ホビー向け中心の8ビットから、80年代後半に16ビットCPUが市場展開されると風向きが変わった。大きな転機は「あのIBM」が市場参入するという海外ニュースがあって、16ビットだけど外部バスは8ビットというIntel 8088を採用したコードネーム「ピーナッツ」、IBM-PCの登場(そしてMS-DOSの採用)によって、実用的な使われ方をするようになり「マイコン」という呼称はいつしか「パソコン」になった。日本にIBM-PCが入り込むのはまだ先になるが、いち早く16ビットパソコンをビジネス向けに展開したNECのPC-9801が覇権を握ることになった。
富士通は、FM-8(と後継のFM-7)というホビー向けとは別に、ビジネスを指向したFM-11の後、FM-16βという16ビットのビジネス機を出したが、βというのが「ベータマックス」を想起させるせい、ではないだろうが、ビジネスパソコン市場の立ち上げには失敗した。ホビーパソコンの方は4096色が表示できる「総天然色パソコン」FM-77AVで一定のヒットとなり、その後一気に32ビットにシフトして、当時珍しかったCD-ROMも標準搭載したFM-TOWNSをリリースして成功を収めた。しかし、こと16ビット機に関しては完全に失敗していた。
当時の富士通も、現在と同様「ITサービスプロバイダ」の大手であったので、顧客が使う端末として自社製のパソコンが必要だった。大型コンピュータの端末装置としてFACOM 9450シリーズという「パソコン」はあったものの、単体で使われることはなく、オフィスオートメーション(OA)機器としてのパソコンにFM-16βの後継を作るため、情報処理部門の中にパーソナルシステム事業部が立ち上げられ、FMRシリーズがスタートした。
STM32FでDCブラシレスモーター用のPWMで非駆動時にLを出す方法

## 開発する環境
DCブラシレスモーターを駆動するため、3つのチャンネルをPWMに設定して使います。
マイコンボードは**NUCLEO-F302R8**、モータドライバ用基板は**X-NUCLEOIHM07M1**を使います。
[CQ出版のサイトから購入しました。](https://shop.cqpub.co.jp/hanbai/books/I/I000346.htm)
モータードライバICはSTの**L6230**が搭載されています。
基板、ボリュームのホルダーは3Dプリンタで作りました。
![IMG_0305.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/a1555e15-d0ab-aa84-68b2-8dd7a8b6d848.jpeg)


## L6230で矩形波駆動する場合に必要なPWM信号
下記のように駆動時はPWM波形、非駆動時はLを出す制御が必要です。
簡単に出せそうですが、非駆動時にLを出すことが容易ではありませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/f8938ca1-67d3-0eea-ac79-a5c3c20f1cce.png)

## 普通にPWMを設定してみる
PWM信号の生成はSTM32F302のTIM1を使用します。
CH1〜3を使って、3相分の信号を作ります。
![スクリーンショット 2025-01-10 11.04.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/05042de4-5452-839a-1ade-99531e7a854e.png)
**CH Idle State**という設定があり、これがきっとPWMを使ってない時の端子の論理なんだろう...と思い、L(Reset)にしました。デフォルトでL(Reset)になってました。

この設定でPWMを動作させるため、HALで定義されている関数を利用します。
CH1を動かすなら下記の通りです。
```
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
```
全体の制御はこんな感じです。
![スクリーンショット 2025-01-10 11.11.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/f5833d21-7295-8f3c-0f55-65e8e26a9eea.png)

時間軸を拡大するとこんな感じ。
![スクリーンショット 2025-01-10 11.12.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/f3c37fc8-e8ca-2c70-0fd9-f2fbbee21a27.png)

そう、**CH Idle State**をL(Reset)にしても、**非駆動時はLになりません**。
CH1ではなく、CH1Nを使えば非駆動時はLになりますが、相補PWM用に用意されている端子機能です。

X-NUCLEOIHM07M1ではモータードライバICにはCH1/2/3が接続されているため、改造して相補PWM用の反転端子を接続する手段もあります。
が、できれば手を加えたくない...ということで、モータードライバICにあったPWMを作る方法を調べました。

## PWM出力端子を非駆動時は強制的にLにする!
PWM用のタイマーを停止すると端子状態はH(Set)になるのは、HALの仕様なのでやむなし。
そこで、タイマーのレジスタを調べると、出力端子を強制的にH、Lにする機能がありました。
CH1とCH2はCCMR1レジスタに、CH3はCCMR2レジスタに端子機能の設定ビットがあります。
これをタイマーを動作させたまま、PWMと強制Lを切り替えれば実現できます。

![スクリーンショット 2025-01-10 11.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/aa82f218-9c81-3c81-64e3-71d1ee027ac0.png)
![スクリーンショット 2025-01-10 11.21.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/7065a599-d5d4-5304-14cf-8e410ab77dc8.png)

## 相切り替えのタイミングで端子機能を変更してみる

無事実現できました！
タイマーは動作させたままでOKです。
CCMRレジスタの変更だとマイコンが変わった時に移植性が悪いので、専用の関数を作った方が良さそうです。

![スクリーンショット 2025-01-10 11.28.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/d24d3f61-a5cb-1664-cd45-83ab39ce9ac6.png)

![スクリーンショット 2025-01-10 11.29.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/12d9484c-6a00-89a7-288a-fdc69f81b806.png)

## 参考になるサイト

このサイトで同じ話題が出ていました。
["Idle State" Not Respected after PWM on STM32](https://electronics.stackexchange.com/questions/611455/idle-state-not-respected-after-pwm-on-stm32)
Kubernetes(EKS)でHost設定したい場合

## はじめに
自分の備忘のため、簡単な内容ですが忘れそうなので記事に

## Host設定（公式情報）
以下はPodでの定義についての言及であり、DeploymentでPodを管理している場合はDeploymentにHost設定を記述する必要があります。
https://kubernetes.io/ja/docs/tasks/network/customize-hosts-file-for-pods/

## DeploymentにおけるHost設定
hostAliases部分に記載します
 
```Yaml:deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
 #以下、Host設定部分
    spec:
      hostAliases:
      - ip: "127.0.0.1"
        hostnames:
        - "foo.local"
        - "bar.local"
 #ここまで
      containers:
      <以下省略>
スピッツの「ロビンソン」をUML図化してみた！

はじめに
こんにちは！現役体操選手のDaitoです！
![IMG_1354 2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956796/bc89350e-6343-f758-353f-aad4df114f9d.jpeg)

今回は、スピッツの名曲 「ロビンソン」 を UML（Unified Modeling Language） で図式化してみました。
「ロビンソン」は、美しい情景と感情が織りなす、解放感と切なさを感じる一曲。その歌詞を シーケンス図 と クラス図 で解析し、歌詞が持つ物語性や感情の流れを視覚的に整理しました。これによって、より深く楽曲の魅力に迫ることができました。


「ロビンソン」のUML解析
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956796/40ff4429-ac73-e4bb-7524-11e61c690564.png)


1. シーケンス図
この図は、歌詞に描かれた時系列の流れを表現しています。
主な登場人物である「オレ」と「キミ」を中心に、物語がどのように進んでいくかを描いています。
シーケンス図のポイント：
	1.自転車を追いかける「オレ」
	•キミが自転車を漕ぐ場面がスタート地点。「河原の道を走る」という情景が視覚的に浮かび上がります。
	2.過去のエピソードを思い出す
	•レコードと「せつなくて」という感情が交錯し、二人の思い出や切なさが蘇るシーン。
	3.二人だけの国を作る
	•想像の中で広がる「二人だけの国」という新しい世界が、「空」や「宇宙風」に象徴されています。
	4.自由への旅立ち
	•最後に「宇宙の風に乗る」という詩的な表現が、解放感と希望を描いています。
 
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956796/2a80c846-9663-66d8-ebd0-9dba0b131a19.png)


2. クラス図
こちらは、歌詞に登場する要素や感情をクラス図として整理しました。
「オレ」と「キミ」を中心に、関連する記憶や感情、そして「空」や「道」といった環境的要素までを視覚化しています。
クラス図の構成：
	•メインキャラクター
	•オレ：追いかける存在であり、肩の荷物を背負っている象徴的な存在。
	•キミ：自由や希望の象徴として描かれ、物語の動きを作り出します。
	•環境
	•空：自由と広がりを象徴する場所。
	•宇宙風：解放感を感じさせる要素。
	•記憶と感情
	•レコードやエピソードが、「せつない」「まぶしい」といった感情を引き起こし、物語に深みを与えています。
	•魔法の世界
	•「二人だけの国」や「ルララ」といった詩的な表現が、現実を超えた想像の世界を作り出しています。

「ロビンソン」のテーマと解釈

これらのUML図を通じて、以下のテーマが浮かび上がります：
1.自由への憧れと現実の葛藤
自転車や空、宇宙風といった要素は、日常から解放されたいという願望を象徴しています。その一方で、「肩の荷物」などの現実的な要素が、自由を求める主人公の葛藤を表現しています。
2.大切な人との絆
キミは、オレにとって希望であり、共に旅立つことで新しい世界を作る重要な存在です。
3.記憶の中の輝きと切なさ
過去のエピソードや感情が、楽曲全体に切なさと温かさを与えています。「まぶしい」と「せつない」という感情が交錯し、物語に深みを持たせています。


まとめ：UMLで広がる歌詞の魅力

スピッツの「ロビンソン」をUML図化することで、歌詞に込められた物語や感情の構造が視覚的に整理され、新たな魅力を発見することができました。
UMLを使えば、他の楽曲や物語も簡単に図解できるので、皆さんもぜひ挑戦してみてください！好きな曲を解析することで、新しい楽しみ方が広がりますよ。
OSWP 受験記(2025年1月)

## OSWP 受験記 (2025年1月)
offsecのOSWPを受験し無事合格したので、勉強方法等を記しておきます。

### BackGround
NWの保守やCSIRT、セキュリティマネジメント等に数年の従事経験あり
現在は脆弱性診断やペネトレーションテストを主サービスとする企業にてPMぽいことをしています。

 
### OSWPについて
早速手抜きですが、Offsecのサイト
https://www.offsec.com/courses/pen-210/
を見ましょう。
"
PEN-210: Foundational Wireless Network Attacks
The Foundational Wireless Network Attacks (PEN-210) course introduces the foundations of wireless network security, exploring common vulnerabilities and exploitation techniques. Learners gain practical experience in a hands-on, self-paced environment allowing them to learn the principles of wireless security assessments.

Learners completing the online training course and passing the accompanying exam earn the OffSec Wireless Professional (OSWP) certification. This wireless security certification demonstrates a learner’s ability to identify and exploit vulnerabilities in 802.11 networks. The OSWP equips penetration testers with specialized skills in wireless security assessment, complementing their knowledge base and making them a valuable asset for organizations.
"
802.11に関して学ぶということですね。

試験ではコースで取り扱われる802.11に関する出題がなされます。

### スケジュール
12/26にコースを購入し、その日中に試験を申し込みました。
新年会と被らないよう慎重に調整した結果、1/7の21:00-24:45の枠で申し込むことにしました。

そして、1/8の13:00にレポートを提出し、23時間後の1/9 12:00頃に合格通知が届きました。
当然ですが、レポートは英語で書く必要があります。ただし、そこまで難しくは有りません。DEEPL先生がなんとかしてくれます。
 
### 試験準備
コースの教材を眺め、チートシートを作成しました。（合計勉強時間は８時間くらい？）
それだけで行けるかな〜とか思っていたのですが、テスト直前で不安になり、tryhackmeを使った演習を行いました。
結果として、私にとってはこのTryHackMeの教材のおかげで合格したと言っても過言では有りません。

取り組んだのはこちら
https://tryhackme.com/r/room/adventofcyber2024
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831981/cf4c53a7-2834-a084-871b-760cdab4f89d.png)

Day11:If you'd like to WPA,press the star key!
というモジュールを直前（２０時くらい？）に取り組みました。

何がお役にたったのかというと、**コマンドを使ったNWへの接続方法を知れたこと**です。

何を言いたいのかもう少しはっきりさせると、OSWPのコースで学べるのは、WEPやWPA2-PSK,Enterprise等のクラックあるいは攻撃手法です。クラックした先の接続手法までは教えてくれません（私が見落としただけかもしれないが、、）
しかし、OSWP ExamGuide
https://help.offsec.com/hc/en-us/articles/360046904731-OSWP-Exam-Guide
を見ると
"Once you have obtained the required wireless keys, you need to connect to the target Access Point (AP) and gain proof file from the http://192.168.1.1/proof.txt 
"
と書いているでは有りませんか。そう、パスフレーズをクラックするだけでは足りず、接続する必要があるのです。

このTryHackMeではwpa-pskの接続手法を学べたので、急いでWPA2-Enterprise版の接続手法をチートシートに追加しました。
 

### 試験当日
3時間45分の試験時間の間で3つのアクセスポイントを攻略します。
１つの課題は必須で、選択問題２つの内１つ（あるいは全部解いても良い）を回答することで合格圏内となります。
一度に一つのシナリオしか起動できませんので、時間配分などには十分注意しましょう。
プルダウンから問題を選び、Readyボタンでactivateするようなイメージです。
このとき、**readyボタンを押してすぐ別のマシンに切り替えることは絶対にやめましょう。**
表示上のマシンと接続するマシンが異なっていることに気づかず問題を解いていたという事態が生じました。

### 最後に
私は今回、OSWPのみを受験したかったため、こちらの「Learn Fundamentals」を$799で購入しました。
クレジットカードの明細を見ると約１３万円....　価値観は人それぞれだと思いますが、私にとっては間違いなくコスパ最悪な試験となってしまいましたので、皆さんはOSCPのついで(Learn Oneとか）に受けるようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831981/802f890b-19ec-7d25-5213-2fe20fb1a84e.png)