OmniAICreator/Qiita-1.07M huggingface dataset:
[Python].envの環境変数取り出すのに毎回loadenvするの面倒だよね。って話

# 余談
社会人デビューから早1年、、何を学んだかな、、うーむ。
新入社員の子たちにすぐ追い越されそうで怯える毎日ですが（盛った）、そろそろコードにまつわる記事とかTipsを投稿したいなと思い、この記事を書いた次第です。

# きっかけ　
個人開発で```.env```に格納された環境変数を取り出すだけでも、いちいち```dotenv```モジュールimportしてこうやって、、って調べながら実装すると非常に面倒だなと感じました。
なので、たった数行のコードですが簡単に```.env```を操作するための関数を実装したので紹介させてください！

# 本題
今回の実装は環境変数の**ロード**と**セット**の2パターンで実装しました。

### 同階層のモジュールからの呼び出し
同階層に```.env```と以下に示す```env.py```を配置し、さらに```env.py```を実行する```moduleA```モジュールも同階層であるパターン。
```
.
├── moduleA.py
├── env.py
└── .env
```

```Python:env.py
import os
import dotenv


def load_env(env_param_key: str) -> str:
    """Function to make getting a env param from .env file easier.
    Args:
        env_param_key (str): env param key name what you want to get.
    Returns:
        env_param_body (str): body of env param.
    """
    dotenv_path = os.path.join(os.path.dirname(__file__), ".env")
    dotenv.load_dotenv(dotenv_path)
    env_param_body = os.environ.get(env_param_key)
    return env_param_body


def set_env(env_param_key: str, env_param_body: str) -> None:
    """Function to make adding env param to .env file easier.
    Args:
        env_param_key (str): env param data what you want to set.
        env_param_body (str): env param data what you want to set.
    """
    f = dotenv.find_dotenv()
    dotenv.set_key(f, env_param_key, env_param_body)
```


```Python:moduleA.py（env.pyを呼び出す）
import env


def main():
    # 環境変数のセット
    env.set_env("IAM", "IRONMAN")

    # 環境変数のロード
    result = env.load_env("IAM")
    print(result)


if __name__ == "__main__":
    main()
```
```bash
$ python moduleA.py
>> IRONMAN
```

### ネストしたモジュールからの呼び出し
設計によっては以下のようにネストしたモジュールから使用したい場合もあるかと思います。
```
.
├── env.py
├── .env
└── dirA
   └── dirB
       └── moduleB.py
```

その場合は呼び出し元で少し工夫をしてあげる必要があります。具体的には```sys.path```にパスを追加する必要があります。
```Python:moduleB.py（env.pyを呼び出す）
import sys
sys.path.append("env.pyが存在するディレクトリの絶対パス")

import env


def main():
    # 環境変数のセット
    env.set_env("IAM", "BLACKPANTHER")

    # 環境変数のロード
    result = env.load_env("IAM")
    print(result)


if __name__ == "__main__":
    main()

```
```bash
$ python moduleB.py
>> BLACKPANTHER
```

# まとめ
初めてコードにまつわる投稿をしたので緊張しますが、すこしでも勉強になった or 使えるかもとおもっていただけたら幸いです。ご指摘もいただけると幸いです！ここまで読んでいただき、ありがとうございました！！！
無制限のフォントと機能を備えたPixellab APK無料ダウンロード

**Pixellab: モバイルユーザー向けの強力なグラフィックデザインアプリ**

### はじめに
Pixellabは、簡単にグラフィックを作成および編集できる多機能なモバイルアプリです。ロゴ、ソーシャルメディアの投稿、YouTubeのサムネイル、その他のデジタルデザインの作成に広く使用されています。Androidユーザー向けに提供されており、シンプルながらも強力なインターフェースと多くのツールを備え、創造性を高めることができます。

### Pixellabの特徴
1. **テキスト編集とカスタマイズ**  
   Pixellabでは、さまざまなフォント、スタイル、影、エンボス、3Dテキストなどのエフェクトを使用してテキストを追加・編集できます。

2. **ステッカーと図形**  
   ステッカー、図形、絵文字をデザインに追加でき、視覚的に魅力的でインパクトのある作品を作成できます。
 https://pixelabapks.com/pixellab-extra-dark/
3. **背景の削除と編集**  
   背景を削除したり、単色、グラデーション、画像と置き換えることが可能です。

4. **レイヤーベースの編集**  
   プロフェッショナルなデザインツールと同様に、Pixellabは複数のレイヤーをサポートし、異なる要素を個別に管理・編集できます。

5. **インポートとエクスポート機能**  
   画像をインポートし、透明度を調整し、高解像度で最終デザインをエクスポートできます。

### Pixellabの使い方
1. **ダウンロードとインストール**  
   PixellabはGoogle Playストアで利用可能です。ダウンロードしてデバイスにインストールしてください。

2. **新しいプロジェクトを作成**  
   アプリを開き、空白のキャンバスまたはテンプレートを選択し、テキスト、画像、図形を追加します。

3. **デザインをカスタマイズ**  
   利用可能なツールを使用して、フォント、色、背景、エフェクトを調整し、オリジナルのデザインを作成します。

4. **保存と共有**  
   デザインが完成したら、PNGまたはJPEG形式でエクスポートし、ソーシャルメディアで共有したり、プロジェクトに活用したりできます。

### なぜPixellabを選ぶのか？
- **ユーザーフレンドリーなインターフェース** – 初心者でも簡単に操作可能。
- **軽量で高速** – 重いデスクトップソフトウェアとは異なり、モバイルデバイス上でスムーズに動作。
- **無料で多機能** – 主要な機能のほとんどが無料で利用可能。

### まとめ
Pixellabは、モバイルデバイスでプロフェッショナル品質のデザインを作成したい人に最適なアプリです。コンテンツクリエイター、ソーシャルメディアマネージャー、または単にグラフィックデザインが好きな人にとって、便利で多用途なソリューションを提供します。ぜひPixellabを試して、創造力を発揮してください！
TCP輻輳制御（bbr2）とdevcontainer のエラー（Error: unexpected end of parent stream）

## サマリ
* Windows のTCP輻輳制御アルゴリズムはデフォルトでcubicです
* bbr2に変更することでスループットを上げることができます
* ただし，devcontainer 環境が Error: unexpected end of parent stream エラーで落ちることがあります
    * Rancher Desktop 最新版です

## 詳細
現在確認中です。
全く関係なさそうな理由だったので，とりあえずメモ...
Windows環境でClaude CodeをMCPで利用する方法

# Windows環境でClaude CodeをMCPで利用する方法

## はじめに

Claude Codeは、Anthropicが提供するAIコーディングアシスタントであり、Linux/Mac環境に対応しています。しかし、Windowsで利用する場合にはWSL（Windows Subsystem for Linux）を活用することで実行可能になります。本記事では、WSLを利用してWindows環境でClaude Codeを動作させる方法を解説します。

---

## 1. Node.jsのインストール

Claude CodeはNode.jsを必要とするため、まずWSL上にNode.jsをインストールします。

```bash
$ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
$ sudo apt install -y nodejs

$ node -v
v20.19.0
$ npm -v
11.0.0
$ which node
/usr/bin/node
$ which npm
/usr/bin/npm
```

この手順により、Node.jsおよびnpmが正しくインストールされ、WSL内で利用可能になります。

---

## 2. Claude Codeのインストール

次に、Claude CodeのMCPサーバをインストールし、WSL上で起動できるように設定します。

```bash
$ sudo npm install -g @anthropic-ai/claude-code
$ claude
```

上記のコマンドを実行すると、Claude Codeのアカウント紐付けが求められます。指示に従ってログインを完了させてください。

---

## 3. Claude DesktopからWSLのClaude Codeを利用する

Claude DesktopアプリからWSL上のClaude Codeを利用するために、設定ファイル`claude_desktop_config.json`を編集します。

**設定ファイルの編集**

ファイルの保存場所: `C:\Users\<ユーザー名>\AppData\Roaming\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "claude_code": {
      "command": "wsl.exe",
      "args": ["claude", "mcp", "serve"],
      "env": {}
    }
  }
}
```

この設定により、Claude DesktopからWSL上のClaude Code MCPサーバを呼び出せるようになります。

---

## 4. Claudeアプリの設定

WindowsのディレクトリをWSL環境に適切にマウントするために、Claude Code MCPに対してマウント情報を明示的に伝える必要があります。

**システムプロンプトに追加する設定例:**

```prompt
* Claude Code MCP runs on Windows WSL, so the Windows directory is mounted under /mnt.
(Example)
Windows: "C:\\Users\\<ユーザー名>\\Desktop"
WSL: "/mnt/c/Users/<ユーザー名>/Desktop"
```

この設定を行うことで、Windowsのディレクトリ構造がWSL上で適切に認識され、Claude Codeをスムーズに利用できるようになります。

---

## まとめ

本記事では、Windows環境でClaude Codeを利用するための手順を解説しました。

1. **WSLにNode.jsをインストール**
2. **Claude Code MCPサーバをWSLにセットアップ**
3. **Claude DesktopアプリからWSL上のClaude Codeを呼び出せるように設定**
4. **Windowsのディレクトリマウント情報を明示的に指定**

これにより、WindowsユーザーでもWSLを活用してClaude Codeを快適に利用できるようになります。ぜひ試してみてください！

## 参考
https://note.com/ymtk00/n/n88620d4e6236
https://qiita.com/masachaco/items/ad9f568da1ee647fbe92
新しいセキュリティソフトの開発案

現在、セキュリティソフトを利用している一ユーザーとして、今後の開発の一助となればと思い、新しいセキュリティの考え方「Hopeware」について提案させていただきます。

Hopewareとは、従来のマルウェアに対する「遮断」「除去」ではなく、攻撃を“受け流し”、その悪意を“善意ある行動”へと転換するという新しいセキュリティ思想です。

たとえば、ランサムウェアのような攻撃を無力化したうえで、ユーザーに「寄付や社会貢献の選択肢を提示する」など、攻撃行為を教育的・建設的な体験へと変える構想を含んでいます。

本提案は非営利・匿名での共有を目的としております。もし少しでもご興味をお持ちいただけましたら、添付の画像をご覧いただけますと幸いです。

また、chatGPTにてアイディアを纏めたものなので、色々と稚拙で実現性の薄いものであるかもしれませんがマルウェア製作者達とのいたちごっこを終わらせたいという思いの元考えてみました。
プログラミングに関しては全く知識のない素人が考えたものなので、見苦しいものであったらごめんなさい。


よろしくお願いします。
![IMG_6323.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4044329/c52d2302-c9c0-4234-b157-3f6aa5b0e77f.png)
![IMG_6324.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4044329/d69646d9-c414-464d-83c5-88a34467e7aa.png)
![IMG_6325.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4044329/8c5e99b6-3831-4603-82c0-19898c13a4cd.png)
![IMG_6326.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4044329/7f9bee3d-5a48-404f-ac12-ab8d28ef7659.png)
Android 動画字幕の初歩

この記事では、Androidで動画字幕を実装する際の初歩の知識で調べたことをまとめる。
サンプルのリポジトリは[こちら](https://github.com/hmiyado/AndroidSubtitlePlayground)。

## 前提

- media3
- 字幕ファイルのフォーマットは WebVTT

## 字幕の読み込み

### 字幕ファイルが映像と別に提供されている場合

字幕の読み込みは次の通り（[Android Developers](https://developer.android.com/media/media3/exoplayer/media-items?hl=ja#sideloading-subtitle)）。

```kotlin
val subtitle = MediaItem.SubtitleConfiguration
        .Builder(subtitleUrl.toUri())
        .setMimeType(MimeTypes.TEXT_VTT)
        .setLanguage("en")
        .setLabel("English")
        .build()

val mediaItem = MediaItem.Builder()
    .setUri(videoUrl)
    .setSubtitleConfigurations(listOf(subtitle))
    .build()

player.setMediaItem(mediaItem)
```

### 字幕ファイルがHLSで動画ストリームと同時に提供されている場合

HLSを読み込むと同時に、字幕も内部的に読み込んでくれる。
HLSの読み込みについては次の通り（[Android Developers](https://developer.android.com/media/media3/exoplayer/hls?hl=ja)）。

```kotlin
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(hlsUri))
// Prepare the player.
player.prepare()
```

## 字幕の表示・非表示

字幕の表示・非表示の切り替えUIと、字幕UIの2つを自作するかどうかでいくつかのパターンがある。

### media3-uiですべてまかなう場合

`setShowSubtitleButton`を使う（[Android Developers](https://developer.android.com/reference/androidx/media3/ui/PlayerView#setShowSubtitleButton(boolean))）。

```kotlin
PlayerView(c).apply {
    this.player = player
    setShowSubtitleButton(true)
}
```

### 字幕の表示・非表示の切り替えUIを自作する場合

`PlayerView`に対して、表示・非表示の設定を伝える必要がある。
2つの方法がある。

字幕UI自体の表示・非表示を切り替える場合は、 `subtitleView`にアクセスする。

```kotlin
PlayerView(c).apply {
    subtitleView.visibility = if(isSubtitleVisible) {
        View.VISIBLE
    } else {
        View.GONE
    }
}
```

または、そもそもデータソース上から字幕を消すことで、結果的に字幕を非表示にすることもできる。

```kotlin
player.trackSelector?.parameters?.let { params ->
    val preferredLanguage = if(isSubtitleVisible) {
        listOf("en")
    } else {
        emptyList()
    }

    player.trackSelector?.parameters = params.buildUpon()
        .setPreferredTextLanguages(*preferredLanguage.toTypedArray())
        .build()
}
```

### 字幕UIを自作する場合

字幕UIを自作する場合は、字幕の内容を取得する必要がある。
字幕ファイルの提供フォーマットがなんであれ、ExoPlayerは内部的に字幕データをパースして保持している。

字幕ひとつひとつは `Cue` という単位で管理されている。
playerにListenerを設定することで、適当なタイミングで`Cue`を取得できる。

```kotlin
player.addListener(object: Player.Listener {
    override fun onCues(cueGroup: CueGroup) {
        super.onCues(cueGroup)
        Log.d(":memo:", cueGroup.cues.joinToString("\n") {
            "[${it.position}]L${it.line}:${it.text}"
        })
    }
})
```

ListenerでCueが取得できたら、あとはそのデータを使ってUIを表示すればよい。
0からエンジニアになるまでの記録【Day4】

:::note info
この記事は未経験からフルタイムで仕事をしながら2025年12月までにエンジニアとして転職することを目標に学習している筆者の記録です。初心者として理解しやすい言葉でまとめるように意識して書いています。同じような状況の方がもしいらっしゃれば、一緒に頑張りましょう🔥エンジニア転職まで残り282日！
:::

## 3/24に学んだこと👩‍💻
現在プログラミングブートキャンプに参加し、laravelでインスタのクローンアプリを作成中。
今週いっぱいで今のクラスが終了するので、アプリ完成目する予定。
今日はフォローボタンの実装。
     
***
### フォローボタン実装の流れ

1\. migration
データベースに新しいテーブルを作成
✍️忘れていたこと
`php artisan migrate:rollback` 
Laravelのマイグレーション（データベースの変更）を 1つ前の状態に戻すコマンド
`php artisan migrate:status`
Laravel の マイグレーションの適用状況を確認するコマンド

2\. model

3\. relationships
Follow.php, User.php

4\.Controller
FollowController

5\.view or Route


## 理解が足りない部分、復習事項📖
- [ ] 今夜の授業のコードを読み下す
- [ ] 授業の復習動画視聴
- [ ] 上記の内容を今回の記事に追記する
comelangに並列処理の銀の弾丸が入りました。

```
int main(int argc,char** argv)
{
    var li = new come_mutex<list<int>*%>([1,2,3]);

    var thread2 = come {
        sleep(3);
        var it = li.lock();

        it.to_string().puts();

        li.unlock();
    }

    var thread = come {
        li.sync() {
            it.add(4);
        }
        li.sync() {
            it.add(5);
        }
    }

    come_join(thread);
    come_join(thread2);

    return 0;
}
```

syncは自動でlock, unlockします。ただ、メソッドブロック中はbreak, continue, returnできないため、lock, unlockを用意してます。多数の値やbreak, cotinue, returnが起こる場合, lock, unlockしてください。

この機能は正直Rustのパクリです。この機能は並列処理のエレガントな答えで、組み込みのOSでのタスク間処理でも使えると思います。要するに同一メモリに多数のスレッドやタスクからアクセスがあった場合不正なメモリアクセスが起こるので、変数単位でmutexがあれば、大丈夫ということです。

トロンの並列処理も素晴らしいですが、この言語機能はもっとすごいかもしれません。
C++やRubyやgoなどもミューテックスはありますが、変数単位でなく、自分でメモリの安全性を考えながらコードを書かないといけないため、不正なメモリアクセスが起こってしまいます。

Rustはやっぱりすごいと思います。ちょっとお袈裟ですが、これは並列処理の銀の弾丸だと思います。
comelangでも拝借させてもらいました。
まあ、他の言語でもちょっとの工夫でこのようなクラスは作れると思います。C++では簡単に書けますね。組み込みでもC++使うことが多くなってきたので、そのようなミューテックスのクラスを作ればOSのタスク間で変数を共有する場合でも競合が起きないと思います。
株式会社の重要会議

## はじめに
　株式会社の重要会議についてまとめてみました。

　株式会社の意思決定機関としては以下の会議が代表的なものです。

## 株主で組織する「株主総会」
　株主総会は株式会社の最高意思決定機関である。その会社の株主で構成され、基本的に株主は所有する株式の数に応じた議決権を有している。株主総会は定期株主総会、臨時株主総会があり、年１回以上の開催が義務付けられている。通常年１回の定期株主総会が開かれる。議題は、取締役や監査役の選任や解任、定款の改廃、予算・決算の承認など。
※定款・・・株式会社などの組織の根本的な規則を定めたもので、組織の憲法と言われている。

## 会社活動の意思を決定する「取締役会」
　取締役会は、株主総会で選任された取締役で構成される。経営全般にわたる基本方針を決定する法で定められた意思決定機関。半数以上の取締役の出席で成立し、その過半数の賛否で議案が決せられる。

## 実質的に会社を動かす「常務会」
　常務会は重役会議・最高経営会議などとも呼ばれ、一般的には常務以上の取締役で構成される。法で定められた機関ではないが、実質的には、常務会が会社を動かしているといわれる。




## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
・秘書検定集中講義2級 改訂版 単行本 – 2012/3/1
公益財団法人 実務技能検定協会 (編集)
p.196-197
正規表現をちょこっとだけ試してみました

ノベルワークスのとっしー([@tossy](https://x.com/A1vbzr4SVP8))です.

正規表現, ムズカシイですよね....
呪文のような見た目に思わず後退りしてしまいます.
しかし, vscodeで文字列検索する時などに, やはりあったら便利だなと思うこともあります.
今回は僕が実際に使っている超簡単な正規表現について, 備忘録的な感じで記事を書こうと思います.
もしこの記事が何かの役にったら幸いです.

# "a"と'a'のマッチ

pythonやjavascriptなどの最近の言語では, 文字列はダブルクォート(")かシングルクォート(')で囲んで表すことが多いです.
変数で宣言して使うこともあれば, 次のように関数の引数に直接渡すこともありますね.

```js
greet("hello")
```

しかし, 人によってはシングルクォートで書くこともあるかもしれません.

```js
greet('hello')
```

もちろん, greet("hello")もgreet('hello')も同じ結果になります.

では, greet関数に文字列(hello)を代入しているプログラムを文字列検索したい場合はどうすればいいでしょうか.

通常の文字列検索であれば, ダブルクォートとシングルクォートの二つ場合に分けて検索する必要がありそうです. 
しかし, ここで正規表現が活きてきます.

ポイントは, 「キャプチャ」と「後方参照」です.

パターンは以下のように書きます.

```
greet\((["'])hello\1\)
```

解説します.
まず, このままではみにくいのでいくつかの部品に分けてみます.

`greet` `\(` `(["'])` `hello` `\1`  `\)`

これらの部品のうち, 次の部品は単純な文字列マッチです.
`greet` `\(` `hello`  `\)`
 丸括弧は正規表現では特殊な文字の扱いなので, エスケープをして文字の丸括弧だというのを明示する必要があります.

残った２つの部品 `(["'])` と `\1` は今回のキモです.
`(["'])`と`\1`はそれぞれ「キャプチャ, 文字クラス」と「後方参照」の意味を持ちます,
以下で解説します.

### キャプチャについて
マッチした文字を記憶する機能です. これは後の**後方参照**で使用します.(グループ化の機能もありますが今回は割愛します)
丸括弧`()`で囲って使います.

### 文字クラス
文字のいずれかと一致するパターンを作成します.
角括弧`[ ]`で囲って使います.

たとえば, `[abc]`だと, 文字 `a` `b` `c`にマッチします.


### 後方参照について
前にキャプチャした文字列を再利用してマッチに使うことができます.
キャプチャした文字は左から順番に番号が付けられ, 順に記憶されます.
\1 や \2 のように \数字 を用いて参照することができます.

例えば, `([ab])([ab])-\2\1`は`aa-aa`や`ab-ba`などにマッチします.

# 本題に戻って...

「キャプチャ」「文字クラス」「後方参照」が分かると, 今回の例の正規表現がなぜこのようになっているのかが分かってくるのではないでしょうか.

```
greet\((["'])hello\1\)
```

文字クラスで`"'`を指定し, それをキャプチャします. さらに, 後方参照`\1`によって以前キャプチャした文字と同じものをマッチさせることで, `"hello"`か`'hello'`がパターンの対象になります.

これで, `greet("hello")` と `greet('hello')`の両方にマッチする正規表現ができました.

これは, ""や''などの, 人によって表記揺れがあるものを検索する時に便利です. (ちゃんとルールやシステムなどで統一化したいところですが...)

他にも使いやすそうな正規表現を見つけたら, また記事にしようと思います.
SalesforceでFlex プロンプトテンプレートを設定しよう

本橋孝昭です

今回はFlexテンプレートについて解説します

参考Trailheadはこちら

https://trailhead.salesforce.com/ja/content/learn/projects/quick-start-create-prompt-builder-flex-template/build-a-flex-prompt-template?trail_id=become-an-agentblazer-innovator

今回は取引先責任者に「興味ある商品」（InterestedProduct__c）選択リスト項目を作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/dc9d34d8-c221-407d-bbd7-408b961429cc.png)

商品に「商品の種別」（ProductType__c）選択リスト項目を作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/972b8bfc-f802-49c4-8823-fc90370b5268.png)


今回生成する内容は
「取引先責任者に挨拶メールを作成する。その時に取引先責任者の「興味ある商品」（InterestedProduct__c）選択リスト項目の値と商品の「商品の種別」（ProductType__c）選択リスト項目の値が一致する商品一覧を示す」

という設定を行います


## プロンプトビルダーを作成

まずはプロンプトビルダー作成をします

プロンプトテンプレート種別は「Flex」

ソースは取引先責任者オブジェクトと商品オブジェクトを設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/97f163f2-43dd-4afe-b4ae-da3cce016dda.png)

これでプロンプトテンプレートを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2ab44cad-fe39-4fce-b84e-3c8b9cc3cb65.png)


しかしこれでは
「その時に取引先責任者の「興味ある商品」（InterestedProduct__c）選択リスト項目の値と商品の「商品の種別」（ProductType__c）選択リスト項目の値が一致する商品一覧を示す」
という設定はできません

では、どうすればいいか。
フローを作成してプロンプトテンプレートの取り組みます


## フローを作成

以下のフローを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/943d6a18-8afe-4ae9-b8bf-15546f28ef35.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f1e9dbd0-9d5c-435e-8dfc-94f144860a10.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e92f0703-8e4d-487c-a675-2e9b30c2a322.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e51d27b5-a97e-4124-b6df-3c79a41db1ed.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a3438dcd-1f7d-4bc9-8348-1d1c20454f9f.png)

## プロンプトビルダーを修正

プロンプトビルダーから先ほど作成したフローを選択しプロンプトビルダーを設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f63b9fc6-461f-42f0-9abb-312436f663f6.png)


こちらで
「その時に取引先責任者の「興味ある商品」（InterestedProduct__c）選択リスト項目の値と商品の「商品の種別」（ProductType__c）選択リスト項目の値が一致する商品一覧を示す」
という設定が完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/dc857b78-9df4-480b-86ff-56e67e78fea5.png)
[メモ] OpenBlinkの実装を整理したい

## 要約
- OpenBlink実装を整理して拡張性や移植性を高めたいと考えているので思いつきを書き留めておく
- 理想の姿としてはmruby/cのように、#ifdefによる条件コンパイルで機能を切り替えられたり、HALを変える事で各デバイスに対応できるような実装を目指したい
- サンプルコードは分離させる

## 各リポジトリ
### 概要
- openblink: NordicSoC向けのOpenBlink実装
- openblink-demo-m5: M5(ESP32)向けのデモ実装
- openblink-demo-mdbt50q-db-40: MDBT50Q-DB-40基板向けのデモ実装
- openblink-webide: ウェブブラウザ上で動作する開発環境のコンセプト実装

### 各リポジトリの進め方で思っているところ
- openblink: 機能追加を行う前に実装を整理したい
- openblink-demo-m5: 超積極的に機能追加を進めて、その成果をOpenBlink開発にフィードバックしつつ、既存のM5プロジェクトに組み込みやすいような形でM5向けPlatformIOライブラリ(Arduino, ESP-IDF)を作りたい
- openblink-demo-mdbt50q-db-40: 必要に応じて機能追加も行う
- openblink-webide: 実装を整理してから、mrbcコンパイラメッセージの表示やエラーハンドリング、Slot選択対応、nRF/M5でサンプルコードの切り替え、コード保存、WebSerial対応などを実装しつつUIを作りたい

## なぜやるのか？
書き込み対象のマイコンが変わったとしても開発ツールや転送ツールの互換性を保てるようにしたい。
敢えて基本的な機能に絞って実装している状態の今のうちに（機能追加を行う前に）実装を整理しておきたい。

### OpenBlinkの機能拡張アイデア（案）
- バイトコード転送
  - LZSS圧縮
  - 電子署名
  - 接続時の認証機能を実装しやすい実装とする
- コンソール接続
  - エラーハンドリング
  - テレメトリだけでなくコマンドを送信できるようにする（双方向にする）
- ステータス読み出し
  - BluetoothLEのNegotiatedMTU(MTU Exchange)
  - OpenBlinkやmruby/cのバージョン情報
  - mruby/cのコンパイル情報(サポート機能など)
  - mruby/c VMの動作状況
  - SoC名 (nRF52840, M5など)
  - デバイスのニックネーム(開発・転送ツールに表示される)
  - 最大転送可能バイトコード長
  - Rubyでサポートされているクラス・メソッド一覧
- 通信
  - BluetoothLE
  - LTE, NTN
  - Wi-Fi
  - USB-CDC(有線シリアル接続)
  - UART, I2C, SPI, CAN, LIN, DSI, PSI, SENTなど各種有線通信規格
- バイトコード保存/読出
  - NVS
  - TF Card
  - ExternalFlash(SPI NAND等)
- reLoad要求制御
- 動作するSoC
  - Nordic nRF52
  - Nordic nRF54
  - Nordic nRF91
  - M5StampS3 (ESP32)
  - 可能な限りすべてのM5デバイス

### OpenBlinkの機能拡張で迷っているところ
アプリケーションによって異なるコードをOpenBlinkに実装するのか、サンプル実装の提供までとするのか？
- セキュリティ関係
  - 接続時の認証機能を実装（作品の目的用途や通信手段に依って求められる機能が異なるため）
  - バイトコード転送時の暗号化
  - リプレイ攻撃への対策
  - ダウングレード攻撃への対策
- 自動復元
  - 動作不良となるバイトコードを誤って書き込んでしまった場合に自動的に初期化する（動作不良の原因の確実性の高い切り分けが難しい、製品開発者の意図しない初期化が発生してしまう）

### サンプル実装でやりたいこと
- 「mruby, mruby/c Common I/O API Guidelines and Community-developed Libraries」への準拠

## OpenBlinkコア部分の実装をgit submoduleで組み込む形にしたい

### 現在：マイコン毎に異なるOpenBlink実装となっている
```mermaid
flowchart TB
  subgraph "openblink Repo."
    subgraph "mrubyc Repo."
      VM1["mruby/c(VM)"]
    end
    Blink1["OpenBlink(nRF向け実装)"]
    Task1["Task(Ruby)"]
    RTOS1["RTOS"]
    MCAL1["Nordic MCAL"]
  end
  subgraph "openblink-demo-m5 Repo."
    subgraph "mrubyc Repo."
      VM2["mruby/c(VM)"]
    end
    Blink2["OpenBlink(M5向け実装)"]
    Task2["Task(Ruby)"]
    RTOS2["RTOS"]
    MCAL2["ESP32 MCAL"]
  end
``````

### 目指したい：OpenBlink実装は共通で、git submoduleにより組み込み
```mermaid
flowchart TB
  subgraph "openblink-demo-nrf Repo."
    subgraph "openblink Repo."
      Blink1["OpenBlink"]
    end
    subgraph "mrubyc Repo."
      VM1["mruby/c(VM)"]
    end
    Task1["Task(Ruby)"]
    RTOS1["RTOS"]
    MCAL1["Nordic MCAL"]
  end
  subgraph "openblink-demo-m5 Repo."
    subgraph "openblink Repo."
      Blink2["OpenBlink"]
    end
    subgraph "mrubyc Repo."
      VM2["mruby/c(VM)"]
    end
    Task2["Task(Ruby)"]
    RTOS2["RTOS"]
    MCAL2["ESP32 MCAL"]
  end
```
MacOSでVPN使用時にグローバルIPアドレスが変更されない場合の解決方法

# 背景
- MacbookPro(M1)でVPNに接続したが、グローバルIPアドレスがVPNに接続する前と変化しない問題が発生。
- グローバルIPアドレスが変わっていないということはVPNにつながっていないということ。

# 解決方法
- MacOSにはネットワークの優先順位設定が存在するので、VPNの優先順位を一番上にすることで解決。

1. 設定>ネットワークを開く
2. 「サービスの順序を設定...」を押下
3. VPNの設定を一番上に設定
4. 以下のコマンドでグローバルIPアドレスを確認

```
$ curl inet-ip.info
```

# 参考
https://support.apple.com/ja-jp/guide/mac-help/mchlp2711/15.0/mac/15.0

https://taishon.jp/mac-vpn/
textlint ドキュメントのルールにどうぞ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/d2ee1fbe-d8aa-4044-890d-210d48447f49.png)

## はじめに

今回はプロジェクトで利用する事になった [textlint-ja](https://github.com/textlint-ja) のメモです。
"LT会" 用に「スライドモード」で記載します。
※lint 系はいろいろとありますね

---

## textlint-ja とは？

- **textlint** は JavaScript で動作するテキスト校正ツール
- **textlint-ja** は、日本語の文章をチェックするためのプラグインやルールセットを含む
- lint ツールのように、文章の品質を自動チェック＆修正可能

---

## なぜ textlint-ja を使うのか？

- **文章の統一性** を保つ（例：「下さい」or「ください」）
- **誤字脱字のチェック** を自動化
- **レビューコストを削減**
- **CI/CD に組み込める** ので、自動チェックが可能

---

## textlint-ja のセットアップ

```sh
# Node.js が必要
npm init --yes
npm install textlint
```

## 基本的な使い方

1. ルール設定（`.textlintrc`）
   ```json
   {
     "rules": {
       "preset-ja-technical-writing": true
     }
   }
   ```
2. Lint を実行
   ```sh
   textlint sample.md
   ```

---

## 導入したルール

- npm install textlint-rule-preset-ja-spacing
    - スペース周りのスタイル
- npm install textlint-rule-preset-ja-technical-writing
    - 技術文書向け。「漢字のみが続く最大の長さ」とかも変更
- npm install textlint-rule-spellcheck-tech-word
    - 技術用語

---

## CI/CD に組み込む

GitHub Actions を使う場合の設定例（`.github/workflows/textlint.yml`）

```yaml
name: textlint

on: [push, pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'
      - run: npm install
      - run: npx textlint "**/*.md"
```
---

## サンプルエラー出力

```
  3:16  error  文末が"。"で終わっていません。                   ja-technical-writing/ja-no-mixed-period
  5:1   error  漢字が6つ以上連続しています: 環境構築手順書作成  ja-technical-writing/max-kanji-continuous-len
  5:9   error  文末が"。"で終わっていません。                   ja-technical-writing/ja-no-mixed-period
```

---

## おわりに

プロジェクトでは`README`をはじめ、いろいろなドキュメントを作ります。
みんな日本人でも"ですます調"だったり、"である調"だったりとバラけます。
ダイバーシティーなプロジェクトであれば尚更。
コードと同じようにドキュメントの記載を統一するためにも、ぜひ導入してください！

---

**参考（感謝）**

- [textlint-ja](https://github.com/textlint-ja)
- [日本語は非常に難しいナリ〜というお話](https://qiita.com/kiririmode/items/539def22783d737470ad#textlint-rule-spellcheck-tech-word)
- [textlintおすすめルールまとめ](https://qiita.com/tsubasa_k0814/items/23a7e0511616d5470625)
- [textlintのセットアップ&使い方](https://qiita.com/uhooi/items/02c269da914b77a029a6)
- [俺俺textlintルールを検討してみた](https://qiita.com/k8uwall/items/3c29ef2dce153e13bd1d)
GTC2025 現地参加レポート（渡航準備、現地会場、食事事情編）


# GTC2025 現地参加レポート（渡航準備、現地会場、食事事情編）

こんにちは、今回は NVIDIA GTC2025@SanJose に現地参加してきた経験を、主に渡航準備と現地での体験を中心にレポートします。今回Kyndryl Japanでは普段AIサービスに関わる5名がNVIDIA GTC2025に参加しました。
> GTCはGPU Technology Conferenceの略で、NVIDIAが開催する、GPUを中心とした最新のAI・グラフィックス・HPC（高性能計算）・デジタルツイン・ロボティクスなどの技術に関する国際会議です。

---

## ✅ 申し込み編

GTC開幕前日のトレーニング（有料ワークショップ）と、GTC本会期の入場パスをセットで申し込みました。申し込みは NVIDIA の公式 GTC サイトから簡単に行えます。

---

## ✈️ 出発編

### ▶ 航路

会場はサンノゼの「San Jose McEnery Convention Center」。最寄り空港はノーマン・Y・ミネタ・サンノゼ国際空港（SJC）ですが、日本からの直行便がほとんどないため、今回はサンフランシスコ国際空港（SFO）を利用しました。

東京〜サンフランシスコ間は複数の航空会社が直行便を運航しており、スケジュールの選択肢が多く、航空券も比較的リーズナブルでした。

### ▶ 空港からシリコンバレーへのアクセス

SFOからサンノゼまでは Uber や Lyft などの配車アプリで約1時間。荷物が多い出張やスムーズな移動を優先する場合はこちらがおすすめです。

費用を抑えたい場合は、BART + Caltrain を使うルートもあります（所要時間：約1.5〜2時間）。

---

## 🏨 宿泊編

トレーニングから参加するため、3/15〜3/21の6泊で宿泊を計画。1月上旬にGTCの申し込みを行いましたが、GTC公式サイト経由では全日程予約できるホテルが見つからず、最終的に個別に宿を確保しました。

会場周辺のホテルは1泊10万円超という価格帯に跳ね上がっていたため、会場から車で10分圏内のSantana Rowのホテルに宿泊。

> 🌟 Santana Row はサンノゼの高級ショッピング街で、石畳の道や街路樹が美しい“映える”エリア。レストランやカフェも充実していて快適でした。最寄のショッピングパークではUNIQLO,GAP,ZARAなど日本でよく見かけるお店や、フードコートなどもあり、日常生活に困ることは一切なかったです。

![IMG_8737.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2561874/21f8fc39-869d-4329-8586-20bf2eca1f12.jpeg)


---

## 🏢 会場構成

- **Keynote**：SAP Center（大型アリーナ）
- **Sessions / Exhibition**：
  - San Jose McEnery Convention Center
  - San Jose Civic
  - Montgomery Theater
  - San Jose Marriott
  - Hilton San Jose

会場は複数の建物に分かれており、セッションや展示はそれぞれのテーマごとに分散して行われていました。

![IMG_8730.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2561874/99d82a85-7e98-47e5-a098-991d1d1e5635.jpeg)

![IMG_8641.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2561874/1544d7f5-a74f-4796-a845-3e3ed6260553.jpeg)

![IMG_8714.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2561874/c8f3da84-4f37-4a7c-bf8f-c21edaa637a8.jpeg)



---

## 🍽️ 食事事情

- **朝食**：提供なし  
- **昼食**：GTC Park にて配布（大行列あり）
- **夕食**：Exhibitionで軽食を配布、アルコール類をDrink Ticketを受け取り可能

内容は、冷たい or 常温のブリトーやサンドイッチ、ポテチ、ブラウニーといった軽食中心。温かいメニューが少しでもあると嬉しかったのですが…。

**飲み物（コーヒー・水・お湯）は常時会場内で提供**されていた点はありがたかったです。

![IMG_8663.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2561874/b7dfd97c-0911-4f72-89e7-6173284cb202.jpeg)

---

次回は、実際に参加したセッションや、注目技術（Agentic AI、Vector Search など）に関するレポートをお届けします！

📌 ご参考になれば嬉しいです。
[Julia]VSCにおけるWSL2でのJulia　環境構築～サンプルコード実行まで

## はじめに

　データ分析や機械学習などに利用できるプログラムとして、Juliaがあると知った。
　以下３点のメリットから今後利用することがあるかもしれないので、備忘録として初歩的なことから欲しかった資料をまとめていく。
　[1]Pythonと同じようにライブラリを利用できる
　[2]実行速度がC言語よりも速い
　[3]PythonやC言語と連携することもできる

## 環境構築
### 1. VSCからWSL2のターミナルを起動
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/5f232017-9b46-4ecc-ad9e-be3dbac79c56.png)

### 2.最新のJuliaのバージョンを確認する

 githubのリリースページを見て、ダウンロードするためのバージョンを確認する。
 https://github.com/JuliaLang/julia/releases
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/a403ec8d-371a-4645-aeb5-a68f28c38906.png)

### 3. ダウンロードおよび環境変数設定

　参考資料[3]をもとに、ターミナル上でコマンドを実行していく。
　コマンドのバージョン部分について、２で確認したバージョンに変更すること。

## サンプルコードの実行
### 1.サンプルコード作成

test.jlを作成し、以下コードを入力
```
print("Hello World!")
```

### 2.実行

#### juliaを起動
```
julia
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/47126497-7c5c-410a-9e1e-b371300bbdf3.png)

#### 対象ファイルの存在を確認
　対象ファイルがあることを確認する。存在しない場合はディレクトリを移動するか、作り直す。
```
 readdir()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/1cc84cfc-c4d5-42cd-9345-c075a6098c4e.png)

移動する必要がある場合、以下コマンドを実行して対象フォルダにいることを確認する。
```
cd("移動先のディレクトリ")
pwd()
```


#### 実行
printに入力した文章が表示されたら成功。
```
include("test.jl")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/e176ac42-a3c7-426d-b44b-778b4a7a4054.png)



## 参考資料
[1]SB Technology, 『コラム：【入門編】Julia言語とは？成り立ちからメリット・デメリットまでを解説』, https://www.softbanktech.co.jp/corp/hr/recruit/articles/97/
[2]Udemy メディア, 『【入門編】プログラミング言語Juliaの特徴、メリット・デメリットを解説』, https://udemy.benesse.co.jp/data-science/data-analysis/julia.html
[3]suisuiso, 『WSL2でJuliaを使う』,https://zenn.dev/suisuiso/articles/0f17352d4fa055
PHPのパスワードハッシュ化と認証の仕組み

## **はじめに**

パスワードをハッシュ化してデータベースに保存すると、認証時にどのように比較しているのか疑問に思ったことはありませんか？ 特に **bcrypt** では、同じパスワードをハッシュ化しても毎回異なる値になるため、単純な比較 `===` では認証ができません。

この記事では、PHPの `password_hash()` や `password_verify()` を使った適切なパスワードのハッシュ化・認証方法について解説します。

## **前提**

PHPの関数を使って説明します。

## **ポイント**

1. **bcrypt でハッシュ化すると、ソルト（Salt）やアルゴリズム情報が含まれる**
2. **ハッシュ化されたパスワードとの比較には `password_verify()` を使用する**

## **ハッシュ化の仕組み**

### **bcrypt のハッシュ構造**

`password_hash()` を使うと、次の情報が含まれたハッシュが生成されます。

```
$2y$10$K7Qv/N9UimTzM5vL.1GbOebvWSNITC2FNYwOv.Jp6LhAhlW3ZrU4q
```

| 部分 | 説明 |
| --- | --- |
| `$2y$` | **bcryptの識別子** |
| `10$` | **コスト（計算回数）**（2^10 = 1024回） |
| `K7Qv/N9UimTzM5vL.1GbOe` | **ソルト（Salt）** |
| `bvWSNITC2FNYwOv.Jp6LhAhlW3ZrU4q` | **ハッシュ化されたパスワード** |

**重要なポイント**

- **毎回異なるソルトが含まれるため、同じパスワードでも異なるハッシュが生成される**
- **アルゴリズム情報も埋め込まれるため、認証時に適切な方法でハッシュを再計算できる**

## **認証時のパスワード比較方法**

ソルトやアルゴリズム情報が毎回異なるため、単純な `===` 比較では認証できません。 そこで `password_verify()` を使うことで、保存されたハッシュ情報を元に **入力パスワードを同じ方法でハッシュ化** し、比較を行います。

### **コード例**

```
// パスワードをハッシュ化して保存
$originalPassword = "my_secure_password";
$hashedPassword = password_hash($originalPassword, PASSWORD_BCRYPT);

// ユーザーがログイン時に入力
$inputPassword = "my_secure_password";

// `password_verify` で比較
if (password_verify($inputPassword, $hashedPassword)) {
    echo "認証成功！";
} else {
    echo "認証失敗！";
}
```

`password_verify()` は、保存されているハッシュ情報を解析し、適切なソルトとアルゴリズムを使用して入力されたパスワードを再ハッシュ化し、比較します。

## **単純なハッシュ関数（md5, sha256 など）との違い**

`md5()` や `sha256()` のような単純なハッシュ関数では、同じパスワードは常に同じハッシュになります。

```
$hashedPassword = hash("sha256", "my_secure_password");
$inputPassword = hash("sha256", "my_secure_password");

if ($inputPassword === $hashedPassword) {
    echo "認証成功！";  // 成功するが、脆弱
}
```

**bcrypt の `password_hash()` は、毎回異なるソルトを加えるため、単純な比較ができません。** そのため、`password_verify()` を使用して適切に検証することが重要です。

## **まとめ**

✅ bcrypt の `password_hash()` は、**ソルトとアルゴリズム情報を含むため、毎回異なるハッシュを生成** する

✅ パスワード比較には **`password_verify()` を使用** し、保存されたハッシュの情報を元に適切に検証する

✅ `md5()` や `sha256()` のような単純なハッシュ関数ではなく、**bcrypt を使用することでセキュリティを向上** できる

パスワードの安全な管理のために、適切なハッシュ化と認証方法を理解し、実践していきましょう！
【フロントエンド】Web Speed Hackathonでボロボロになっただけの話

※この記事は[KANGEN](https://kangen-holdings.co.jp/)の梅干しとにらめっこがお送りします。
※この記事は、約3分で読むことができます_(:3 」∠ )_

## :hatching_chick:はじめに
とある勉強会にて **「Web Speed Hackathon2025」** というものが開催されると聞きつけ、（現場のソースコードの速度改善もしたかったので）勉強も兼ねて攻撃力0の状態で参加→ボロボロになったお話です。

:::note warn
**この記事の対象者**
- Web Speed Hackathonを初めて聞いた方。参加したことがない方。
- **悲しいですがこの記事から表示速度改善に関する知見は得られません。**
他にできる学生や一般の方がたくさんいるので、そちらを検索してください
_(:3 」∠ )_ﾊﾟﾀｯ
:::

## Web Speed Hackathonってなに？
サイバーエージェントさんが採用イベントも兼ねて2日間にわたり開催している大会です。
ホームページや動画サイトの課題ソースコードを、Gitで取り込みいかに速度を改善したかを点数化し、競い合う大会です（詳細は参考サイトをどうぞ）
応募枠は「学生枠」「一般枠」の2種類があります。審査やランキングは両方混合で競い合います。

**もし受けたくなったら？**
・学生さんの場合 → サイバーエージェントさんのホームページから参加登録
・一般の方の場合 → connpassというサイトから参加登録
※オンラインもしくは現地参加ができます(現地枠は抽選で決定)

ちなみに、今年は「ある動画サイトの改善」がテーマでした。
ご参考：[Web Speed Hackathon 2025](https://www.cyberagent.co.jp/careers/students/career_event/detail/id=31182)
　　　　　⇧参加資格等もこちらをご参照ください。

## 感想
- 採点できる環境構築がわからない！
    - こちらについては、よく見るとREADMEファイルに懇切丁寧に書いてありました（運営の皆様ありがとうございます！）
    - 公式のソースコードを自身のGitにコピー→ローカル環境へclone→ブランチ作成→PRを作成(作成すると、公式のツールでデプロイ環境ができる)→デプロイ環境のurlを公式のissueに登録という流れでした
- こんなに作りこんだ課題で競技するのか！という興奮（ソース自体がすごい勉強になる）
- 本当に画面描画から何もかもが遅い！逆にすごい！
- 解き始める → 、、、あれ？何もわからないぞ。。。（焦り）
    - TypeScriptの構文云々ではなく、**何が処理を重くしているのかがわからない状況。調べながら修正しても、なかなかスコアが上がらない**
- 終盤 → 学生がほぼ上位にいるんだが、学生たち凄すぎないか？！
- 常時 → 運営の方々が優しい。質問したらすぐ答えてくれる！
- 終了後 → レギュレーションチェックで1位以外いなかった。。そんなこともあるの？

:::note info 
**レギュレーションチェックとは？**
禁止の項目に該当した、テストが通らなかった、修正の段階でバグを作ってしまった等によって、審査対象外になってしまうようです。
**（レギュレーションチェックに引っかかった＝ずるでは決してないです！）**
:::
### 大会後の運営の方による問題の解説など、本当に勉強になりました！参加して良かった！

## 結果
1200満点中2桁のスコアでした_(:3 」∠ )_ﾊﾟﾀｯ

3桁出している方に尊敬の念しか出てこなかった。

## ひどい点なのに記事にした理由
**正直ものすごい恥ずかしい**のですが、来年に向けて一念発起するために恥をさらしてみました。

**来年はしっかり準備して臨みます！**

## 受けるにあたって最低限必要な知識やツール
気になった方へ必要そうなものを。。
- Githubのアカウント
- Gitを使用するための知識
- TypeScriptの書き方
- Discoad
- 当日installが必要なものは、公式が早めに共有してくれました

## 試合するために準備したらよいこと
- **(一番大事)** 歴戦の猛者達がたくさん記事を上げているので、そちらを参考にしてください_(:3 」∠ )_
- 速度改善の基礎の勉強に良いと聞き、購入した本
⇒「[Webフロントエンドハイパフォーマンスチューニング](https://www.amazon.co.jp/dp/4774189677)」
- 過去の出題を解いてみるのもありかと！
    - 公式様のGit：https://github.com/orgs/CyberAgentHack/repositories?language=&q=web-speed-hackathon&sort=&type=source

## 最後に:hatching_chick:
最後までご覧頂きありがとうございました！
ボロボロでしたが、参加したことは後悔していません。

**今回1位の方は本当におめでとうございます！:confetti_ball:**
**大会の運営の方々も本当にお世話になりました！**

来年は、きちんと勉強して臨みたいと思います！

次はもっと点とるぞ！　**Web Speed Hackathon2026！！**

**以上、梅干しとにらめっこでした。**
Laravel（基礎）の理解

## **はじめに**

最近はご無沙汰なPHPフレームワークのLaravelをまた1から勉強し直して、これは理解しておいた方がいいなと思うものをピックアップして備忘録として残しておきます。

## **Laravelのメリット・デメリット**

### **メリット**

- **Eloquent ORM**や**artisanコマンド**で自動でコードを生成してくれる部分で開発効率が高い。
- **MVC（Model-View-Controller）アーキテクチャ**で役割が明確になっているので、保守性が高い。
- セキュリティ面も**CSRF**（クロスサイトリクエストフォージェリ）や**XSS**（クロスサイトスクリプティング）、**SQLインジェクション**の対策が充実している。
- 他のフレームワーク（CakePHPやSymfonyなど）と比べると、Laravelの情報量が豊富で、コミュニティやサポートが充実している。

### **デメリット**

- 他のフレームワーク（Slim, Lumenなど）と比較すると、パフォーマンスが遅いと感じることがある。

## **MVCとは**

MVCアーキテクチャは、アプリケーションを**Model**, **View**, **Controller**という3つの役割に分けて管理します。これによりコードが分かりやすく、保守性も向上します。

| 役割 | 意味 | 役割 | ディレクトリ |
| --- | --- | --- | --- |
| **M** | **Model** | データベースのリレーションなどの設定 | /database/ |
| **V** | **View** | UI（ユーザーインターフェース）の設定 | /resources/views |
| **C** | **Controller** | サーバー処理の設定 | /app/Http/ |

これにより、アプリケーションの構造が整理され、各部分の責任が明確になります。

## **デフォルトディレクトリの階層と役割**

Laravelのプロジェクトには、複数の重要なディレクトリが含まれています。以下はその代表的な構造です：

```
/project-root
├── app/               # アプリケーションの主要なコード
│   ├── Http/          # HTTPリクエストに関連するコード（コントローラ、ミドルウェアなど）
├── database/          # データベース関連（マイグレーション、ファクトリ、シーディング）
│   ├── factories/     # データベースのファクトリ
│   ├── migrations/    # データベースのマイグレーションファイル
│   └── seeders/       # データベースのシーダー
├── resources/         # ビュー、言語ファイル、アセット
│   ├── views/         # Bladeテンプレート
├── routes/            # アプリケーションのルーティング
│   ├── web.php        # ウェブのルート設定
│   └── api.php        # APIルート設定

```

他にもさまざまなディレクトリがありますが、こちらは特に使用頻度の高いものです。

## **Blade**

**Blade**はLaravelのテンプレートエンジンで、簡潔で表現力豊かな記述が可能です。ビューを構築するためのPHPコードをHTMLに埋め込むことができます。条件分岐やループなどの基本的な構文が簡単に使えるため、効率的にUIを構築できます。

## **Eloquent ORM**

**Eloquent ORM**は、Laravelが提供するオブジェクトリレーショナルマッピングの機能です。これを使うことで、**データベース操作をシンプルなオブジェクト指向の記述で行える**ようになります。

- SQLを書かずにデータの取得、保存、更新、削除が可能です。
- データベースのレコードは、モデルクラスを通じて操作します。
- 例えば、`User` モデルを使って、データベースからユーザー情報を簡単に取得したり保存したりできます。

```
// ユーザーの全てを取得
$users = User::all();

// 新しいユーザーを作成
$user = User::create(['name' => 'Alice', 'email' => 'alice@example.com']);

// ユーザーを更新
$user->name = 'Bob';
$user->save();
```

## **マイグレーションについて**

**マイグレーション**は、データベースのスキーマ（構造）をバージョン管理するための仕組みです。マイグレーションファイルを使うことで、チーム開発の際にも、どのようにデータベースのテーブルやカラムを変更したかを簡単に管理できます。

`php artisan make:migration` コマンドでマイグレーションファイルを作成し、`php artisan migrate` でマイグレーションを適用します。

例:

```
// マイグレーションファイル
Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamps();
});

```

## **Laravelのアーキテクチャ**

Laravelは、**MVCアーキテクチャ**を採用しています。これにより、**Model**, **View**, **Controller**が明確に分離され、役割が分かりやすくなり、保守性や拡張性が向上します。また、Laravelは非常にシンプルで柔軟なルーティングや依存性注入（DI）、ミドルウェア、リクエストライフサイクルなどが組み込まれており、開発者が効率よくアプリケーションを構築できる環境を提供します。

## **まとめ**

今回はLaravelとはどういうものかを浅く広く理解しました。

今後はそれぞれをより深掘りして理解を深めていこうと思います。
AWSの基本用語集

# aws ecsとは
aws ecsとはコンテナ化されたアプリケーションを簡単にデプロイ、管理、スケールすることができることのサービスである。

# コンテナとは
アプリケーションとそれに依存関係があるものを1つにまとめてどの環境でも動くようにするようにした技術のこと。
## コンテナのメリット
### 開発環境の統一
コンテナはホストマシンの影響を受けないため、ホストマシンによる開発環境の違いがなくなる。
### スケーラビリティ
コンテナを増やすだけで簡単にアプリをスケールすることができる。
### CICDのとの互換性
コンテナをそのままテストし、そのまま本番環境にデプロイできる。
# スケーリングとは
システムの利用者の数に応じて、サービスの規模を拡大・縮小することができる技術のことである。
(`スケーラビリティ`＝`スケールのしやすさ`)
# コンテナオーケストレーションとは
どのコンテナをどのサーバーに配置するのかを自動で管理・運用してくれるサービスのこと。
# ECSの基本構造
![スクリーンショット 2025-03-24 231312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750795/0ac8c04d-8245-4bee-b2c3-350ac48480d7.png)

## Clusterとは
TaskとServiceの集合体のこと。
## Serviceとは
Serviceの役割
・Taskの維持管理
・スケーリング
・負荷分散
・アップデートとデプロイ
## Taskとは
コンテナをデプロイするための最小単位のこと。
必ずしもServiceに属さなくてもいい。
### Task定義とは
Taskを作成するための設計書のこと。
# EC2とFargateの違い
## EC2とは
サーバー管理が必要
OSや設定の自由度が高い

## Fargateとは
サーバーレスのため管理が簡単
OSや設定の自由度が低い
# ECRとは
コンテナイメージを格納・管理・デプロイするためのサービス
コンテナイメージレジストリの一種

# コンテナイメージレジストリとは
コンテナイメージのバージョン管理やアクセス管理のサービスのこと
[備忘録]useEffectについて理解する①

# はじめに

最近Reactを勉強中です。
useEffectについて学んだことを残します。

## そもそもReactコンポーネントがどうあるべきか

useEffectの使いどころを理解するために、Reactコンポーネントがどうあるべきかをまとめます。
以下の公式ドキュメントを参照しました。
https://ja.react.dev/learn/keeping-components-pure
ドキュメントの冒頭には以下のような記載があります。

>コンポーネントを常に厳密に純関数として書くことで、コードベースが成長するにつれて起きがちな、あらゆる種類の不可解なバグ、予測不可能な挙動を回避することができます。

また、以下のようにも書かれていました。
>React は、あなたが書くすべてのコンポーネントが純関数であると仮定しています。つまり、あなたが書く React コンポーネントは、与えられた入力が同じであれば、常に同じ JSX を返す必要があります。

Reactは、コンポーネントは常に純粋関数であるという前提で作られているようです。
純粋関数とは、以下の特徴があります。
- 同じ入力に対しては常に同じ結果を返す
- 引数のみを参照し、外部で宣言された変数を読み書きしない（状態を変更しない）

例えば、以下の例は、`Counter`コンポーネントの外部の `count` を変数を読み書きしています。
```jsx
let count = 0; // 外部の変数（グローバル変数）

function Counter() {
  count++; // 外部の変数を変更（副作用）
  console.log(`Count: ${count}`);

  return (
    <div>
      <p>Count: {count}</p>
    </div>
  );
}

export default Counter;
```
これにより、複数の `Counter` コンポーネントを使った場合、 `count` が共有され、予期しない動作になることが考えられます。
通常、各 `Counter` コンポーネントは独立して動作し、それぞれの `count` が個別にカウントアップされることを期待すると思います。

Counter 1: 0 → 1
Counter 2: 0 → 1

しかし、グローバル変数 `count` を共有しているため、すべての `Counter` が同じ `count` を参照 するため以下のようになります。

Counter 1 → count が増加 (0 → 1)
Counter 2 → count はグローバルなので、Counter 1 と共有されてしまう (1 → 2)

このように、純粋関数でなくなることで、どのような結果が返ってくるかが予測不可能になり、バグを生みやすいコードになります。

また、このような、計算する過程でシステムの状態に変更を加えたり外部との入出力を行うことは、関数の主な作用である計算結果を計算する以外の作用であることから**副作用**と呼ばれます。
ファイルシステムの変更、HTTP呼び出し、状態変更、ログ出力、DOMの取得なども副作用に含まれます。

## どんな時に使うものか

[公式ドキュメント](https://ja.react.dev/learn/keeping-components-pure#where-you-_can_-cause-side-effects)に以下のように記載がありました。
>React では、副作用は通常、イベントハンドラの中に属します。イベントハンドラは、ボタンがクリックされたといった何らかのアクションが実行されたときに React が実行する関数です。イベントハンドラは、コンポーネントの「内側」で定義されているものではありますが、レンダーの「最中」に実行されるわけではありません！ つまり、イベントハンドラは純粋である必要はありません。
>
>いろいろ探してもあなたの副作用を書くのに適切なイベントハンドラがどうしても見つからない場合は、コンポーネントから返された JSX に useEffect 呼び出しを付加することで副作用を付随させることも可能です。これにより React に、その関数をレンダーの後（その時点なら副作用が許されます）で呼ぶように指示できます。ただしこれは最終手段であるべきです。

イベントハンドラもしくは`useEffect`を使用することで、関数コンポーネントを純粋に保ちつつ副作用を処理できる、レンダリングの最中に副作用処理をすることを避けられ、上記の予期しない動作を防げるということのようです。

イベントハンドラではユーザーのクリック、ホバーなどのアクションに応じてプログラム変更できますが、
`useEffect`は、特定のアクションではなく、コンポーネントが描画（レンダリング）されたタイミングで実行する処理を指定するために使います。さらに、依存関係を指定することで、特定の状態やプロパティが変更されたときに実行することもできます。

例えば、HTTP呼び出しは副作用なので、コンポーネントが表示されることとは関係なく行われるべき処理です。
useEffectを使用すると、画面が更新される「描画」の後にその処理を実行することを指定できるので、Reactコンポーネントと外部システム（ネットワークやサードパーティのライブラリなど）をうまく同期させることができます。

ここまででお腹いっぱいなので、分けます。
続きは以下。
[useEffectについて理解する②](https://qiita.com/minoura_a/items/9eef8cf4c9a9df70244d)

# 参考

https://ja.react.dev/learn/keeping-components-pure
https://ja.react.dev/learn/synchronizing-with-effects
既存テーブルへのカラム追加

# はじめに
とあるプロジェクトでテーブルへのカラム追加をしようとした時に、既に作成されていたテーブルのマイグレーションファイルを書き換えて追加しようとしてしまったので、今後同じミスをしないように書き留めておこうと思います。

使用環境→Laravel：mysql

# 問題点
既にあるテーブルを書き換えると、php artisan migrateの対象にならなかったり、Laravelが知らないうちに書き換わることで不都合が生じてしまうようです。


# テーブルへのカラム追加
まず、代替となるマイグレーションファイル「alter」を作成します。
1行目はdocker環境を使用しているためphpコンテナにアクセスしています。2行目は既存のテーブル「sample_files」を対象としたファイル、「alter_sample_files」を作成するコマンドです。
```
docker compose exec php bash
php artisan make:migration alter_sample_files --table=sample_files
```

作成されたマイグレーションファイルを編集していきます。
upとdownのそれぞれに、今回追加したいカラムである「folder_id」と「member_id」を追加します。

```php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('sample_files', function (Blueprint $table) {
            $table->after('key', function($table){
                $table->unsignedInteger('folder_id')->nullable()->comment('フォルダID');
                $table->unsignedInteger('member_id')->nullable()->comment('会員ID');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('sample_files', function (Blueprint $table) {
            $table->dropColumn('folder_id');
            $table->dropColumn('member_id');
        });
    }
};
```



# 確認

次のように、マイグレーションを実行して作成したテーブルを反映させます。成功すれば、テーブルにカラムが追加されているはずです(php my admin等で確認)。
```
php artisan migrate
```

念のため、一度ロールバックして期待通り元に戻るか確認
```
 php artisan migrate:rollback --step=1
```

# 終わりに
DB操作はそこまで詳しくないですが、間違った方法で行ってしまうと面倒な事態に発展してしまうと思います。
不慣れな操作を行うときは、それがどういうことなのかしっかり理解してから行うように心がけたいです。
PCで快適に使える関数電卓を開発！「S-Calc」の誕生秘話

# なぜ市販の関数電卓ではダメなのか？
## エンジニアが仕事で使える関数電卓「S-Calc」を開発した話

### 🚀 はじめに
私はこれまで市販の関数電卓を愛用していました。しかし、**エンジニアや研究者が仕事で使うには、どうしても不便な点がある** と感じることが多かったのです。

そこで **「それなら自分で作ろう！」** と思い立ち、Windows向けの高機能関数電卓「S-Calc」を開発しました。

本記事では、
- **なぜ市販の関数電卓では不便なのか？**
- **S-Calcがどう解決するのか？**
- **開発時に苦労したポイント**

について紹介します。

---

## 📌 市販の関数電卓の問題点

市販の関数電卓は、**手軽に計算できて便利** です。
しかし、エンジニアや研究者が**実務で使うには足りない点**がありました。

### ❌ 計算履歴が残らない
関数電卓では、 **過去の計算結果を呼び出して再利用** できないことが多いです。
> 例えば、**「さっきの計算、どうやったっけ？」** と思っても、一度クリアすると確認できません。

### ❌ カスタム関数を登録できない
仕事では、 **よく使う計算式を自分用に登録して再利用したい** ことがよくあります。
> 例えば、材料の強度計算、電子回路の特定計算など、**毎回同じ計算を手打ちするのは非効率** です。

### ❌ 物理定数・数学定数の管理が面倒
エンジニアリングの計算では、**π や 重力加速度 g などの定数** を頻繁に使います。
> しかし、市販の関数電卓では **定数のカスタマイズができない** ことが多く、入力のたびに手打ちする必要があります。

### ❌ キーボード操作ができない
PCで作業しているときに、 **キーボードでサクッと計算できる** 関数電卓が欲しくなります。
> しかし、市販の電卓は物理ボタン操作が前提のため、PC作業とスムーズに連携できません。

---

## 💡 解決策：「S-Calc」を開発！

こうした問題を解決するために、 **Windows関数電卓「S-Calc」** を開発しました。

### ✅ **S-Calcの特徴**

1. **計算履歴の保存・呼び出し**
   - 過去の計算結果を一覧表示し、再利用可能
   - 間違えた場合でも履歴から修正可能

2. **カスタム関数の登録・利用**
   - よく使う計算をカスタム関数として登録可能
   - 数式を一度登録すれば、ワンタッチで計算

3. **物理定数・数学定数を自由に設定**
   - 独自の定数を登録し、計算時にすぐ呼び出し
   - TSVファイルで定数をエクスポート・インポート可能

4. **PCでの快適なキーボード操作**
   - ショートカットキー対応で素早く計算
   - 数式をコピー＆ペーストして利用可能

---

## 🛠 開発の苦労ポイント

### **1. 計算エンジンの設計**
計算の正確性を確保するため、オープンソースの `xFunc` をベースにしつつ、**独自の改良を加えました**。

### **2. データ管理（履歴・定数）**
履歴や定数データをどの形式で保存するか悩みましたが、
> - **定数・カスタム関数・履歴はSQLiteデータベース** で管理
> - **定数・カスタム関数はTSV形式で外部保存可能**

とすることで、データの再利用性を高めました。

---

## 🎯 まとめ

市販の関数電卓では実現できなかった **「仕事で本当に使いやすい関数電卓」** を目指して、S-Calcを開発しました。

✅ **計算履歴の保存**
✅ **カスタム関数の登録・利用**
✅ **物理定数の自由設定**
✅ **キーボード操作に対応**

Windowsで **エンジニアや研究者がストレスなく計算できる環境** を提供します！

🔗 [S-Calc公式サイト](https://itechem.jp/scalc/)

---

## 💬 フィードバック歓迎！
S-Calcを使ってみた感想や、**「こんな機能が欲しい！」** という要望があれば、ぜひコメントで教えてください！
Excel VBA 将其他表的范围的值按顺序填入插入；清除剪贴板

    
将其他表的范围的值按顺序填入插入，并涉及清除剪贴板
该示例将Date表里面L2到L25范围的值，按顺序插入到计算表的D列。
具体动作为：首先取得Date表中L2到L25的范围值，
之后将范围值用For Each循环，并从第2行开始，逐行复制计算表里面的每行的值，
然后将循环到的Date表里面的值写入到被复制的D列
最后的时候删除多复制的一行即可，删除时清楚剪切版的内容，释放空间（感觉然并卵）

为了防止程序卡住，可以以每执行2000行打印一条数据看一看，这样就能知道是否程序还在工作（被注释掉的 If i Mod 2000 = 0 的部分）
```
Sub InsertData()
    i = 2
    Dim wsDate As Worksheet
    Set wsDate = ThisWorkbook.Worksheets("Date")
    Data0s = wsDate.Range("L2:L25").Value
    col = "D"
    '画面更新暂停
    Application.ScreenUpdating = False
    Do
        For Each Data0 In Data0s
            Rows(i + 1).Insert shift:=xlShiftDown
            Range(Cells(i, "A"), Cells(i, "G")).Copy
            Cells(i + 1, 1).PasteSpecial
            Cells(i, col) = Data0
            i = i + 1
        Next Data0
        Rows(i).Delete
    	'清除剪切板内容
        Application.CutCopyMode = False
        DoEvents
        Debug.Print i
'        If i Mod 2000 = 0 Then
'            Debug.Print i
'        End If
    Loop While Cells(i, "A") <> ""
    '画面更新恢复
    Application.ScreenUpdating = True
    End Sub
```
JavaScriptで「数値を指定の基数の形式で文字列に変換する(toString)」の動作を確認してみた。

# 概要

JavaScriptで「数値を指定の基数の形式で文字列に変換する(toString)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/javascript/number/index2.html

# 実装

以下の通りブラウザのディベロッパーツールで実行できました。

![Screenshot from 2025-03-24 21-06-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/752a7507-6fbc-4995-88f1-49f560498dbd.png)

# まとめ

何かの役に立てばと。
Excel VBA根据条件随机抽取符合条件的数据

有存放抽取用数据的数据表，还有用于制作数据的当前表
此程序先用Select找到判断条件，之后进入符合判断条件的Case，
然后在该Case内设置抽取数据用的数据表的值的范围的行号，之后生成范围内随机数（随即行号），
再用随机数（行号）从数据表中抽出值
```
Sub 根据条件随机设置数据()
    Dim iMax As Double
    Dim iMin As Double
    col = "L"
    For i = 1 To 1000
        Select Case Cells(i, "K")
            Case "条件1"
                iMax = 4
                iMin = 2
                ret = Format(Fix((iMax - iMin + 1) * Rnd + iMin), "0")
                Cells(i, col) = ThisWorkbook.Worksheets("数据表名").Cells(ret, "A")
            Case "条件2"
                iMax = 5
                iMin = 2
                ret = Format(Fix((iMax - iMin + 1) * Rnd + iMin), "0")
                Cells(i, col) = ThisWorkbook.Worksheets("数据表名").Cells(ret, "B")
            Case "条件3"
                iMax = 41
                iMin = 2
                ret = Format(Fix((iMax - iMin + 1) * Rnd + iMin), "0")
                Cells(i, col) = ThisWorkbook.Worksheets("数据表名").Cells(ret, "C")
        End Select
    Next i
End Sub
```
这种做法的一个问题是，有多少个条件，就需要在数据表中放多少列
#0076（2024/03/24）データベース設計における関数従属の種類と具体例

# データベース設計における関数従属の種類と具体例

データベース設計では、「関数従属」という概念が重要です。関数従属はデータの冗長性を避け、正規化を適切に行うために必要な知識です。この記事では、「完全関数従属」「部分関数従属」「推移的完全関数従属」を具体例とともに解説します。

---

## 🔹 関数従属とは？

関数従属（Functional Dependency）とは、「ある属性（または属性の集合）が決まれば、他の属性が一意に決まる」関係のことを指します。以下では、その具体的な種類を解説します。

---

## 🔹 完全関数従属（Full Functional Dependency）

完全関数従属とは、「複合キーのすべての属性を用いて初めて、他の属性が一意に決定できる状態」を言います。

### 具体例

次のテーブルを考えます。

| 受講者番号 | 講義番号 | 成績 |
|------------|----------|------|
| 001        | A01      | 80   |
| 001        | A02      | 85   |
| 002        | A01      | 75   |

- この場合、「受講者番号」と「講義番号」の複合キーにより「成績」が決定されます。
- 「受講者番号」だけや「講義番号」だけでは成績を特定できず、両方が必要です。
- このとき、「成績」は複合キーに完全関数従属しています。

---

## 🔹 部分関数従属（Partial Functional Dependency）

部分関数従属とは、「複合キーの一部だけで他の属性が決定できる状態」を言います。これは好ましくない従属関係であり、正規化によって解消すべき対象です。

### 具体例

次のテーブルを考えます。

| 社員番号 | 部署コード | 部署名 |
|----------|------------|--------|
| 1001     | D01        | 営業部 |
| 1002     | D01        | 営業部 |
| 1003     | D02        | 開発部 |

- 上記のテーブルは、複合キーとして「社員番号」「部署コード」を想定しています。
- しかし、「部署名」は「部署コード」だけで特定可能です。
- つまり、「部署名」は複合キーの一部（部署コード）だけに従属しているため、部分関数従属となります。

### 部分関数従属の問題点

- データの重複が発生し、更新の不整合が生じる可能性があります。
- これは第2正規形で解消する必要があります（別テーブルに分離）。

---

## 🔹 推移的完全関数従属（Transitive Functional Dependency）

推移的完全関数従属とは、「主キーに依存する非キー属性が、さらに別の非キー属性を決定する」という間接的な関数従属関係を指します。これも正規化によって解消する必要があります。

### 具体例

次のテーブルを考えます。

| 社員番号 | 社員名 | 部署コード | 部署名 |
|----------|--------|------------|--------|
| 1001     | 佐藤   | D01        | 営業部 |
| 1002     | 鈴木   | D01        | 営業部 |
| 1003     | 田中   | D02        | 開発部 |

- 「社員番号」が主キーであり、「部署コード」が社員番号に関数従属しています。
- しかし「部署名」は「部署コード」に依存しているため、「社員番号」→「部署コード」→「部署名」という推移的関係が生じます。
- この推移的完全関数従属は第3正規形で解消されるべきです。

---

## 🔹 正規化による解消方法

上記の問題を解決するには、正規化を行います。

- 第1正規形：全ての属性が単一の値を持つ。
- 第2正規形：部分関数従属を解消（部分的に従属している属性を別テーブルへ）。
- 第3正規形：推移的完全関数従属を解消（間接的な従属を別テーブルへ）。

### 正規化後のテーブル例（第3正規形）

社員テーブル
| 社員番号 | 社員名 | 部署コード |
|----------|--------|------------|
| 1001     | 佐藤   | D01        |
| 1002     | 鈴木   | D01        |

部署テーブル
| 部署コード | 部署名 |
|------------|--------|
| D01        | 営業部 |
| D02        | 開発部 |

---

## 🔹 まとめ

データベース設計では関数従属を理解し、適切な正規化を実施することで冗長性や不整合を防ぎ、整合性の高いデータベースを構築できます。
WindowsでのUbuntuダウンロード後の初期設定(AWSEC2用も)

# Ubuntuダウンロードまでのながれ
[前回の記事を参照](https://qiita.com/gnoraimu724/items/257b03c72d9969ffefa7)

# Ubuntuをwindowsターミナルから開けるようにする
ubuntuのアプリアイコンクリックして開いても良いのですが、このあとサーバ管理やwindowsもいじったりすることを考えるやはりターミナルから開けるほうが便利なので今のうちにやっておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461603/6237a42f-4db0-4e24-914e-0c579fbd2d03.png)
パワーシェルを開いて上の方にある→マークから
設定>スタートアップ>既定のプロファイル>Ubuntuを設定します

# 初期ディレクトリを設定する
```
explorer.exe .
```
を打って、Ubuntuの親ディレクトリが開くのでパスをコピーして
設定>スタートアップ>Ubuntu>開始ディレクトリ　に先ほどコピーしたパスをペーストします。
これで起動時に、Ubuntuが親ディレクトリにいる状態で開くことができるようになります。

## AWS EC2pemファイルを設定する

.pemファイルをコピーし、
Ubuntu側で
```
explorer.exe .
```
で開いた親ディレクトリ内に先ほどコピーしたtemファイルを張り付ける

```
ls -l
```
でファイル内を確認すると、先ほど張り付けたファイルが確認できます。


```
sudo chown ユーザー名:ユーザ名 pemファイル名.pem
```
でrootユーザから指定したユーザに移動します。
以上で設定は完了です。

# VScode上で作業する方法
vscodeとRemotedevelopmentをインストールします。
その状態でUbuntu側で以下のコマンド
```
code .
```
でVScodeで開けます。
toLocaleString() vs 正規表現 - 3桁区切りの最適解はどっち？

Paizaの問題「大きな数の3桁区切り」で試行錯誤！
最初は正規表現で頑張ったけど、実は toLocaleString() の方がスマートだった！？
技術メモとしてまとめておくよ。

## <br>問題の概要

入力: 超デカい整数 
出力: 3桁ごとにカンマを挿入した文字列

※位の小さい方から 3 けたごとにカンマ区切りで出力
※Nの桁数は 3 の倍数とは限らない

例:
入力: 12345678901234567890
出力: 12,345,678,901,234,567,890

https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_boss

## <br>解法①: 正規表現 + `replace()`
```js
console.log(input.replace(/\B(?=(\d{3})+(?!\d))/g, ","));
```
解説
`\B` → 先頭を除く位置にマッチ（\b の逆）
`(?=(\d{3})+(?!\d))` → 3桁ごとの数字のグループが一回以上繰り返されている、次が数字じゃない（＝３桁数字グループの間）位置にマッチ。

`.replace(..., ",") `でカンマを挿入

メリット: 柔軟にカスタム可能
デメリット: 正規表現ミスるとバグりやすい（僕も最初、先頭にカンマ入る事故発生💀）


## <Br>解法②: toLocaleString()
```js
console.log(BigInt(input).toLocaleString());
```
解説
`toLocaleString()` → ロケール対応 で数値をフォーマット
`BigInt` 必須 →（`Number` 型では処理できない大きな数を扱いたい場合、`BigInt` を使う必要がある）

メリット: 簡潔 & 国際対応OK
デメリット: カスタマイズ性低め
## <br>まとめ
汎用性なら正規表現
お手軽 & 国際対応なら `toLocaleString()`

[僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/03/24/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc-%e5%a4%a7%e3%81%8d%e3%81%aa%e6%95%b0%e3%82%923%e6%a1%81%e5%8c%ba%e5%88%87%e3%82%8a%ef%bc%81%e6%ad%a3%e8%a6%8f%e8%a1%a8%e7%8f%be-v/)

## <br><br>おまけ
```js
const rl = require('readline').createInterface({input: process.stdin});

rl.on('line',(input) => {

    function addCommas(num) {
    // 数字を文字列にしてから逆順にし、処理後に逆転させる
    let str = num.toString().split('').reverse().join('');
  
    let result = [];
  
    for (let i = 0; i < str.length; i++) {
    if (i > 0 && i % 3 === 0) {
      result.push(',');  // 3桁ごとにカンマを追加
    }
    result.push(str[i]);  // 現在の数字を追加
    }

    // 最後に文字列を逆順にして元に戻す
    return result.reverse().join('');
        
    }

    console.log(addCommas(input));  
    rl.close(); 
});
```
Excel VBA 从某一行开始，逐行向下插入空白行，并写入随机日期

从第二行开始，向下随机插入日期
按照千分之二的概率插入，插入行数为1-5行随机
```
Sub 随机插入日期()
    i = 2
    iMax1 = 1000
    iMin1 = 1
    iMax2 = 5
    iMin2 = 1
    fstDate = #1/1/2022#
    lstDate = #12/31/2025#
    Do
        ret1 = Format(Fix((iMax1 - iMin1 + 1) * Rnd + iMin1), "0")
        If ret1 = 10 or ret1 = 11 Then
            ret2 = Format(Fix((iMax2 - iMin2 + 1) * Rnd + iMin2), "0")
            For ii = 1 To ret2
                Rows(ii + 1).Insert shift:=xlShiftDown
                cells(ii + 1,"A") = CStr(Format(Int(lstDate - fstDate + 1) * Rnd + fstDate, "yyyyMMdd"))
            Next ii
        End If
        
        
        i = i + 1
        
    Loop While Cells(i, "A") <> ""
End Sub
```
- ret1用于随机生成1-1000的数值，在Do-While里，如果生成的值位10或者11，则进行插入计算（千分之2的概率）
- ret2用于随机生成1-5的插入次数，生成完成后，由下面的For进行循环插入
- i用于记录数据处理的初始行
- 持续循环的条件为：当前单元格不为空，即：当前单元格不为空，则进行下一次循环
- xlShiftDown为插入方向向下