OmniAICreator/Qiita-1.07M huggingface dataset:
Excel VBA 从某一指定行开始，循环插入空白行，并向其中插入数据

从第二行开始，向下按照B列的值循环插入数据
如果符合条件1，或者条件2，则将数据集合1s的数据逐个插入下面的单元格中，
如果符合条件2，或者条件3，或者条件4，则将数据集合2s的数据逐个插入下面的单元格中
```
Sub 根据条件循环插入数据()
    i = 2
    数据集合1s = Array("数据1-1", "数据1-2", "数据1-3", "数据1-4")
    数据集合2s = Array("数据2-1", "数据2-2", "数据2-3", "数据2-4", "数据2-5", "数据2-6", "数据2-7")
    Do
        Select Case Cells(i, "B")
            Case "条件1", "条件2"
                For Each 数据集合1 In 数据集合1s
                    Rows(i + 1).Insert shift:=xlShiftDown
                    Cells(i + 1, "C") = Cells(i, "C")
                    Cells(i + 1, "B") = Cells(i, "B")
                    Cells(i, "A") = 数据集合1
                    i = i + 1
                Next 数据集合1
                Rows(i).Delete
                
            Case "条件1", "条件2"，"条件3"
                For Each 数据集合2 In 数据集合2s
                    Rows(i + 1).Insert shift:=xlShiftDown
                    Cells(i + 1, "C") = Cells(i, "C")
                    Cells(i + 1, "B") = Cells(i, "B")
                    Cells(i, "A") = 数据集合2
                    i = i + 1
                Next 数据集合2
                Rows(i).Delete
                
        End Select
        Debug.Print i
        If i Mod 2000 = 0 Then
            Debug.Print i
        End If
    Loop While Cells(i, "C") <> ""
End Sub
```
Dockerグループ（非sudo）のユーザが `sudo rm -rf` する


# これはなに

戒めです。環境構築芸人を自称しながらこんなことに5年気づかないとは。。。

**追記**: KVM + Dockerすればええやんというアドバイスをいただきました。試してみます。

# 想定される状況

あなたはラボのサーバ管理者です。一般権限のユーザから、Docker Composeが使いたいとの依頼がありました。

# 管理者
わかる、環境構築めんどくさいよね、Dockerじゃないと動かせない環境とかあるし。（[NGC](https://www.nvidia.com/ja-jp/gpu-cloud/)とか、[Optuna](https://github.com/optuna/optuna)使うときのPostgreSQLささっと立ち上げたいときとか[^1]）
Dockerグループに入れるだけなら、管理者権限渡すわけではないし、まあ、ええやろ。。。
というわけで

```bash
sudo usermod -aG docker sudou
```

# 須藤さん！？

何を思ったか一般ユーザさん、以下のコマンドを実行してしまいました。

```bash
docker run -v /:/root_of_host alpine rm -rf /root_of_host
```

サーバは無事死にました。。。[^2]

# じゃあどうすれば

真に管理者権限（ぽいもの）を渡さないDocker Compose（のようなもの）があれば良いんですけどね。
たとえば以下が候補ですが、私の中ではまだ答えがないです。（だれかいい案あったらコメントください）（あと3年位前の知識なので、間違ってたら修正コメントください）

- [Singularity](https://sylabs.io/): スパコンユーザにはなじみ深いソフトですね。docker pull, run, execあたりは代替できそう。でもsudoないとbuildできない、singularity composeは微妙だった印象。
- [podman](https://podman.io/): そもそも非root用なのか？Docker Desktopが有料化された時の退避先という印象。~~筆者はインストールでこけた~~
- [Docker Rootless mode](https://docs.docker.jp/engine/security/rootless.html): Docker公式の非root版だ！と意気揚々と試したんですが、NFSマウントされたディレクトリをマウントできないという致命的な仕様があり、断念した記憶。
- [enroot](https://github.com/NVIDIA/enroot): 名前だけ知ってて試したことがない。composeあんのかな？


[^1]: 選定に悪意はないです
[^2]: 一応動作確認のために野良のWSLで叩いてみたんですが、`/mnt/c`の下が全削除されて危うく死ぬところでした。`$Recycle.Bin` の時点で気づいて何とか助かった。。。
M语言（PowerQuery）指令内部使用的函数

0. 类型转换
    ```
    转换成Text型：Text.From(转换值)
    从Date型取得年：Date.Year(日期值)
    从Date型取得月：Date.Month(日期值)
    从Date型取得日：Date.Day(日期值)
    ```
    https://learn.microsoft.com/ja-jp/powerquery-m/date-functions
    
    <br>

0.  将不同的列连在一起，形式为：列1_列2_列3
    ```
    Text.Combine({[列1], [列2], [列3]}, "_")
    ```
Widgetの再構築

## 🤔Think
古いFlutterの本ですが、参考になる書籍を読んでいて、最近はアプリのパフォーマンスについても勉強してます。

[amazonのリンク](https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6-Flutter-%E7%9F%B3%E4%BA%95%E5%B9%B8%E6%AC%A1-ebook/dp/B082XQ81FH/ref=reads_cwrtbar_d_sccl_2_17/355-4012499-6828019?pd_rd_w=Hy9f8&content-id=amzn1.sym.22885f79-b5f7-44ae-b657-682d1e5aee76&pf_rd_p=22885f79-b5f7-44ae-b657-682d1e5aee76&pf_rd_r=3MRZX668303EPGHQS2Z8&pd_rd_wg=lyg6K&pd_rd_r=bf078b48-e8cd-4690-ae4d-9d9351b8663d&pd_rd_i=B082XQ81FH&psc=1)

[rebuild 再構築](https://api.flutter.dev/flutter/widgets/Element/rebuild.html)について調べて考えてみた。

公式の長い解説は翻訳しながら見てみてください。

### 再構築を抑える方法について
公式に長い文章の中にも書いてありましたが、昔のFlutter本に書いてあった内容だと

- `setState()`メソッドを呼ぶと以下の現象が起きる
    - Widget Treeの再構築
    - Element Tree参照変更
    - RenderObjectの差分検証

少ないWidgetTreeの場合は、大した問題にならないとのことですが、巨大なWidget Treeになると無視できないそうです。この再構築を抑えることができると、パフォーマンスが改善されそうだと本に書いてありました。

つまり、StatefulWidgetを使いすぎたらダメってことでしょうね。`setState()`メソッドが呼ばれるたびに、無駄に再描画されてアプリのパフォーマンスが下がってします。

私の感覚だと、作っていたアプリの画面が固まってしまったことがありました。setStateの使いすぎで、画面が何度もrebuild 再構築されたことが原因だったのだろうと思いました。

パフォーマンスを落とさないようにするには、不要なrebuildを防ぐために、キャッシュするなどが効果的だそうです。`const`つけるとか、StreamBuilderを使うとか。

## 最後に
昔購入した古い本でしたが日本語の情報で体系的に書かれているものはあまりないのでありがたいと思いました。
DAX IF代替SWITCH

#### DAX好像没有SWITCH,因此需要用if else赋予不同条件的方式来模拟SWITCH

```
if [条件列1] = "条件1" or [条件列1] = "条件2" or [条件列1] = "条件3" then "值1" 
else if [条件列1] = "条件4" or [条件列1] = "条件5" or Text.Contains([条件列1],"包含的条件") then "值2" 
else if [条件列1] = "条件6" or [条件列1] = "条件7" or [条件列1] = "条件8" or [条件列1] = "条件9" then "值3" 
else ""
```
- Text.Contains()有些像LIKE，用于判断字符串中是否存在某些值的函数
SvelteのderivedとVueのcomputedの違いとは？

## はじめに
私はVueの開発者ですが、最近業務でsvelteを書くことも多くなってきています。
その中で、svelteの`derived`はどんな場面で使うといいのかについて色々悩んでました。

使ってみるとVueの`computed`と似たような感触があったため、今回はこの二つを比べてみたいと思います。

## 反応性の基本概念
まず、それぞれのフレームワークがどうやって反応性を実現しているか見てみましょう。

Svelteは、コンパイル時に反応性を解決するアプローチを取っています。

具体的に言うと、Svelteではビルド時にコードを解析し、どの変数がUIに影響するかを特定します。そして単純な変数への代入（`count = count + 1`など）が反応性のトリガーになります。変数が更新されたときに必要なDOM更新を行うコードが自動生成される感じです。

その一方、Vue.jsは実行時に依存関係を追跡する*プロキシベース*の反応性システムを採用しています。Vue 3ではJavaScriptのProxyオブジェクトを使用して、プロパティへのアクセスと変更を渡します。

レンダリング中にアクセスされたプロパティを記録し、それらの依存関係を作成して、プロパティが変更されるとそのプロパティに依存しているすべての箇所（コンポーネントやcomputed、watchなど）を再評価します。

``` mermaid
flowchart TD
    subgraph "Svelte"
        S1[コードの解析] --> S2[変数の変更を検知するコードを生成]
        S2 --> S3[変数への代入]
        S3 --> S4[生成されたコードが実行、DOM更新]
    end

    subgraph "Vue"
        V1[Proxyオブジェクトを作成] --> V2[レンダリング中にアクセスされたプロパティを記録]
        V2 --> V3[プロパティの変更]
        V3 --> V4[依存している全てのコンポーネントcomputedなどを再評価]
    end
```

## Svelteの`derived`ストア

`derived`ストアは、他のストアから値を派生させるために使用されます。

元のストアが更新されると、`derived`ストアも自動的に新しい値を計算します。このストアの値が変わったら、それを使って新しい値を計算するよって感じですね。

以下のような書き方です。

```javascript
import { writable, derived } from 'svelte/store';

// ストアを作成
const count = writable(0);

// ストアからから派生したストアを作成
const doubledCount = derived(count, $count => $count * 2);
```

`derived`は宣言的に値がどのように変換されるかを定義します。

同期的、非同期両方サポートしていて、依存するストアが更新されると自動的に値が更新されます。
また、入力値が変わらなければ再計算されないメモ化（キャッシュ）の特徴もあります。

## Vueの`computed`

`computed`は、他のリアクティブなもの（refとか）から新しい値を計算するための機能です。
依存する値が変わると自動的に再計算されます。

基本的にはこんな感じで使います。

```javascript
import { ref, computed } from 'vue';

const count = ref(0);
const name = ref('John');

// 一つのソースから
const doubledCount = computed(() => count.value * 2);

// 複数のソースから
const greeting = computed(() => {
  return `Hello, ${name.value}! Count: ${count.value}`;
});
```

`computed`は値がどのように計算されるかを定義します。

依存する値が変更されるまで再評価されず、依存関係が変更されない限り計算結果はキャッシュされます。

## 主な違い

### アプローチの違い
Svelteの`derived`はストアから新しいストアを作成するためのもので、Vueの`computed`は反応性データから派生した値を計算するためのものです。

### 使用コンテキストの違い
`derived`はSvelteのストアの一部で、通常はコンポーネント外で定義されます。

一方、`computed`はVueのコンポーネントのライフサイクルに密接に関連しており、通常はコンポーネント内で定義されます。

## おわりに
普段使っているフレームワークの内部までちゃんと理解すると、バグなどに遭遇した時にも対応しやすくなる気がしますね！
Playwright MCP セットアップガイド: バージョン不一致問題の解決法

このガイドでは、Playwright MCPの正しいセットアップ方法と、特にバージョン不一致の問題を解決する方法を説明します。すべての手順は実際に検証済みの方法に基づいています。

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">MicrosoftのPlaywright MCP使ってみた！！！<br>キャッチアップとかこれでイケるかも！<br>セットアップは癖があります！Configは下記です<br>---<br>&quot;playwright&quot;: {<br>&quot;command&quot;: &quot;node&quot;,<br>&quot;args&quot;: [<br>&quot;C:/Prj/playwright-mcp/cli.js&quot;<br>],<br>&quot;env&quot;: {<br>&quot;PLAYWRIGHT_WS_ENDPOINT&quot;: &quot;ws://localhost:3181/&quot;<br>}<br>} <a href="https://t.co/DmxHSzbFg8">https://t.co/DmxHSzbFg8</a> <a href="https://t.co/ajbxWEO7q4">pic.twitter.com/ajbxWEO7q4</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1904118477167984672?ref_src=twsrc%5Etfw">March 24, 2025</a></blockquote> 

## 問題: バージョン不一致エラー

Playwright MCPを使用する際、サーバーとクライアントのバージョンが一致していない場合、「428 Precondition Required」エラーが発生します。このエラーは以下のようなメッセージを表示します：

```
Error: browserType.connect: WebSocket error: ws://localhost:xxxxx/ 428 Precondition Required
╔════════════════════════════════════════════════════╗
║ Playwright version mismatch:                       ║
║   - server version: v1.51                          ║
║   - client version: v1.52                          ║
║                                                    ║
║ If you are using VSCode extension, restart VSCode. ║
║                                                    ║
║ If you are connecting to a remote service,         ║
║ keep your local Playwright version in sync         ║
║ with the remote service version.                   ║
║                                                    ║
║ <3 Playwright Team                                 ║
╚════════════════════════════════════════════════════╝
```

## 解決策: クライアント・サーバー方式のセットアップ

この問題を解決するための検証済みの方法は以下の通りです：

### 1. 特定バージョンのPlaywrightサーバーを起動

まず、特定のバージョン（例：1.51）のPlaywrightサーバーを起動します：

```bash
npx playwright@latest run-server
```

この例では以下のような出力が表示されます：
```
Listening on ws://localhost:3181/
```

表示されたWebSocketエンドポイントをメモしておきます。

### 2. MCPクライアント設定を調整

次に、MCPの設定を以下のように変更して、ローカルで実行しているPlaywrightサーバーを使用するよう設定します：

```json
{
  "mcpServers": {
    "playwright": {
      "command": "node",
      "args": [
        "C:/Prj/playwright-mcp/cli.js"
      ],
      "env": {
        "PLAYWRIGHT_WS_ENDPOINT": "ws://localhost:3181/"
      }
    }
  }
}
```

この設定では以下のポイントが重要です：

- `command`を`node`に変更
- `args`にローカルのPlaywright MCPの`cli.js`へのパスを指定
- `env`セクションに`PLAYWRIGHT_WS_ENDPOINT`を追加し、サーバーのWebSocketエンドポイントを指定

## package.jsonのバージョン調整

さらに、`package.json`でPlaywrightのバージョンを明示的に設定することで問題を解決できます：

```json
"dependencies": {
  "playwright": "1.51",
  "@playwright/test": "1.51"
}
```

gitの差分からわかるように、Playwrightのバージョンを1.52.0-alpha-2025-03-21から1.51に変更することで問題が解決しました。

## まとめ

Playwright MCPを使用する際にバージョン不一致の問題が発生した場合は、以下の手順で解決できます：

1. 特定バージョンのPlaywrightサーバーを別プロセスで実行
2. MCPクライアント設定をクライアント・サーバー方式に変更
3. 必要に応じてpackage.jsonのバージョンを調整

この方法を使えば、バージョン不一致によるエラーを解消し、Playwright MCPをスムーズに使用できます。

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
家計簿アプリを作る＃２１

![スクリーンショット 2025-03-24 195035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/65c1670c-79a1-4a76-a1ad-7842d95536f2.png)
メインコンテンツの中には、ToolbarとOutletというものがあります。
OutletでHome,Report,NoMatchコンポーネントを呼び出してました。

![スクリーンショット 2025-03-24 195238.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/822b398f-57ce-455d-86f8-88613f6838a6.png)
Toolbarは、ヘッダーとメインコンポーネントの間にある余白にあたります。
OSINTとは？ストー〇ーとの違いから学ぶ“正しい情報収集”入門

 
 
みなさん、こんにちは！今日は、OSINT（オープンソース・インテリジェンス）について、ちょっと変わった視点からお話しします。
# OSINTって何？
まず、「OSINTって何？」って思う方もいると思うので、簡単に説明します。
OSINTとは、オープンソースの名の通り公開されている（オープン）情報源（ソース）を使って、いろんなことを調べる技術や手法のこと。
たとえば、ニュース記事、SNSの投稿、公共データベース、衛星画像など、誰でもアクセスできる情報源からデータを集めて分析するんです。
企業がライバル会社の動きをチェックしたり、ジャーナリストが事実を確認したり、セキュリティのプロが怪しい動きを見つけたりするのに使われます。まるで「探偵」みたいですよね。

# あれ？もしかしてストーカーと似てる…？
さて、ここで本題！OSINTとストーカーって似てませんか？
ストーカーといえば、特定の誰かに執着して、その人の情報を集めまくる人ですよね。行動を監視したり、個人情報をゲットしようとしたり…。
うん、確かにOSINTも「情報を集める」って意味では似てますね！
でも、ちょっと待ってください。もちろんここには決定的な違いがあるんです。


# OSINTとストーカーの違い
### 目的  
OSINT：セキュリティ強化や調査、研究など、合法的で役立つ目的のために使われます。  

ストーカー：個人的な執着や悪意で、自分勝手な理由で動きます。

### 情報源  
OSINT：公開情報だけを使います。SNSで本人が公開した投稿とか、誰でも見られるデータベースとかね。  

ストーカー：盗み見たり、ハッキングしたり、ゴミ箱を漁ったり…違法な手段も平気で使っちゃう。

### プライバシー  
OSINT：プライバシーを侵害しないよう、法律や倫理を守るのが基本。  

ストーカー：プライバシーをガン無視して、法律すら破ることも。

つまり、OSINTは「ルールを守るスマートな探偵」、ストーカーは「ルールを無視する迷惑な追跡者」なんです。似てるようで全然違う！

逆に最強のストーカーが目覚めて最強の「探偵」になったら、、、日本のセキュリティ界がもっと明るくなるかもしれないですね



ここで、もっとわかりやすくOSINTを「探偵」、ストーカーを「ガチ恋勢」と例えてみましょう、こんなシーンを想像してみてください。

## シーン1：デジタル探偵（OSINT）の活躍
ある日、デジタル探偵はクライアントから「ライバル企業の新商品を調べて！」と依頼されます。探偵は颯爽とパソコンを開き、企業の公式サイト、プレスリリース、SNSの公開投稿をチェック。さらに、公開データベースからヒントを見つけ、「お！新商品の発売が近いぞ！」と推理。
クライアントに報告すると、「素晴らしい！ありがとう！」と大絶賛。ニヤリと笑って、「公開情報を使っただけですよ」と謙遜。カッコいい！

## シーン2：過剰なファン（ストーカー）の失態
一方、過剰なファンは、大好きなアイドルの私生活に夢中。アイドルのSNSをチェックするのはまだマシな方で、ゴミ箱をあさったり、家の前で待ち伏せしたり、しまいには盗聴器を仕掛けたり…。
アイドルは「怖い！」と警察に通報。ファンはあえなく逮捕され、「アイドルが好きだっただけなのに…」と涙目。



ね？OSINTは公開情報を賢く使って社会に貢献する「探偵」、ストーカーはプライバシーを踏みにじる「過激なガチ恋勢」。
情報収集という点では似てるけど、やってることが天と地ほど違います！

## OSINTの大事さと正しい使い方
最後に、OSINTのすごさと注意点を少し真面目に。
OSINTは、セキュリティや調査に超便利なツールなんです。たとえば、サイバー攻撃の兆候を見つけたり、災害時に情報を集めたり。でも、使うなら倫理と法律を守るのが鉄則！具体的には：

・公開情報だけを使う  

・プライバシーを尊重する  

・法律を破らない  

・情報を悪用しない

これを守れば、OSINTは社会を良くする強力な味方になります。
この制約を付けた中でどれだけの情報を集められるのか？ゲームみたいでワクワクしませんか？
## まとめ
OSINTとストーカーは、「情報を集める」という点でちょっと似てるけど、実は全然別物。
OSINTはルールを守り、公開情報でスマートに活躍する「探偵」
ストーカーはルールを無視して迷惑をかける「過激なガチ恋勢」
この違いを笑いながら覚えて、OSINTを正しく使えば、あなたもデジタル探偵気分を味わえるかも！
ただし！！！！くれぐれもストーカーのような末路はたどらないように！
【git】push時に毎回パスワード入力を求められる

# はじめに
GitHubリポジトリへpushする際に、毎回ユーザ名とパスワードを入力していました。
面倒だと感じたため、備忘録として記事にします。

# 問題
`git push origin main`コマンドを実行した後、毎回ユーザ名とパスワードを入力していました。
入力せずにコマンドを実行したいと考えていました。

```bash
$ git push origin main
# コマンドを実行後、入力を求められる
Username for 'https://github.com': ユーザー名
Password for 'https://asa129@github.com':パスワード
```

# 解決方法

以下の手順でSSHキーを登録、リモートリポジトリのURLを変更することで解決しました。
1. SSHキーを作る
2. SSHエージェントの起動
3. 公開鍵のコピー
4. GitHubに公開鍵を追加
5. リモートリポジトリのURLを変更

### ①SSHキーを作る
```bash
$ ssh-keygen -t ed25519 -C "GitHubアカウントに登録しているメールアドレス"

# キーの保存場所を聞かれる、デフォルト設定のままEnter
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/test/.ssh/id_ed25519): 

# パスフレーズの設定、デフォルト設定のままEnter(セキュリティを高めたい場合は入力する)
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

### ②SSHエージェントの起動
```bash
$ eval "$(ssh-agent -s)"
# 秘密鍵をSSHエージェントに追加
$ ssh-add ~/.ssh/id_ed25519
```

### ③公開鍵のコピー
```bash
# 公開鍵を表示、コピーする
$ cat ~/.ssh/id_ed25519.pub
```

### ④GitHubに公開鍵を追加
* プロフィールアイコンから`Settings`を選択
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/ca5755fa-0c31-49a8-9718-4fddab8c5c37.png)

* `SSH and GPG keys`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/70822c09-2fe4-4a77-b74e-26fd71a95bb2.png)


* `New SSH Key`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/d4086a7a-520e-4588-8429-5a48c5d261df.png)

* 任意のタイトルを入力、③でコピーした公開鍵を貼り付け、`Add SSH Key`を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/2c5986cc-a12b-4710-9973-357054b6b90f.png)

### ⑤リモートURLの変更
```bash
# 現在のリモートリポジトリ情報を確認
$ git remote -v

e.g)
origin  https://github.com/asa129/react-router-lesson.git (fetch)
origin  https://github.com/asa129/react-router-lesson.git (push)

# リモートリポジトリのURLを変更
$　git remote set-url origin リモートリポジトリURL（SSH）

# 変更後のリモートリポジトリ情報を確認
 $ git remote -v
e.g)
origin  git@github.com:asa129/react-router-lesson.git (fetch)
origin  git@github.com:asa129/react-router-lesson.git (push)
```

SSHのURLは登録したいリポジトリの`Code`から`SSH`を選択でコピー可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993509/f459010d-cb60-4298-a96e-9d477637c69e.png)

### ⑥接続テスト
```bash
$ ssh -T git@github.com
```
`Hi ユーザー名! You've successfully authenticated,~`のメッセージが出れば成功

# おわりに
面倒だといいながら1週間後回しにしてました。
三層アーキテクチャとは？ コントローラクラス・サービスクラスの使い分け

## 三層アーキテクチャとは？ コントローラクラス・サービスクラスの使い分け

- 三層アーキテクチャは、ソフトウェアの設計パターンの一つで、システムを3つの層に分けて管理する方法です。このアーキテクチャは、システムを効率的に開発・保守するために有用です。さらに、三層アーキテクチャにおけるコントローラクラスとサービスクラスの使い分けについても解説します。
※この投稿の最後に三層アーキテクチャを使った実践的な開発が学べるUdemyのリンクを貼っていますのでご参照ください。

---

## 三層アーキテクチャの構成

三層アーキテクチャは、システムを次の3つの層に分けて構築します。

### 1. **プレゼンテーション層（Presentation Layer）**

- **役割**: ユーザーインターフェース（UI）を担当します。ユーザーからの入力を受け取り、結果を表示します。
- **例**: Webアプリケーションの`Controller`、モバイルアプリケーションのUI部分。

### 2. **ビジネスロジック層（Business Logic Layer）**

- **役割**: アプリケーションのビジネスルールやロジックを処理します。データの計算や業務ルールの実行を行います。
- **例**: ビジネスロジックを含む`Service`クラス。

### 3. **データアクセス層（Data Access Layer）**

- **役割**: データベースとのやり取りを担当し、データの永続化（保存、更新、削除）を行います。
- **例**: `Repository`クラスや`DAO（Data Access Object）`。

---

## コントローラクラスとサービスクラスの使い分け

### コントローラクラス（Controller）

コントローラクラスは、主にユーザーからのリクエストを処理し、適切なサービスを呼び出して結果を返す役割を担います。プレゼンテーション層に属し、UIとビジネスロジック層をつなぐ役割を果たします。

- **主な役割**:
    - ユーザーリクエストの受け取り。
    - サービス層へのリクエストの委譲。
    - 結果をUIに返却。
- **使い分けのポイント**:
    - ビジネスロジックは含めず、リクエストの処理や結果の返却に集中します。
    - HTTPリクエストの処理、URLマッピングなどを行います。

### サービスクラス（Service）

サービスクラスは、ビジネスロジック層に位置し、実際のアプリケーションの処理を行います。サービスクラスは、コントローラから渡されたリクエストに基づき、データの加工、計算、検証などを行い、最終的な処理結果を返します。

- **主な役割**:
    - アプリケーションのビジネスロジックを実装。
    - 複雑な処理や複数のデータソースを扱う場合に利用。
- **使い分けのポイント**:
    - コントローラからの入力を受け取り、実際のロジックを実行します。
    - 例えば、データの計算や、データベースからの情報取得など、実際の処理が含まれます。

---

## 三層アーキテクチャのメリット

### 1. **疎結合**

- 各層が独立しているため、1つの層を変更しても他の層に影響を与えにくい。
- 部分的な修正が可能で、システム全体への影響を最小限に抑えることができます。

### 2. **保守性の向上**

- 各層が明確に分かれているため、コードの管理がしやすく、保守が容易になります。
- エラーやバグのトラブルシューティングが効率的に行えます。

### 3. **再利用性**

- ビジネスロジックやデータアクセス層は他のシステムやプロジェクトにも再利用可能です。
- 例えば、異なるアプリケーションで同じデータ操作を行いたい場合、サービス層を使い回すことができます。

### 4. **スケーラビリティの向上**

- 各層が独立しているため、必要に応じてスケールアップやスケールアウトが可能です。
- 例えば、データベース層だけをスケールアウトすることができます。

### 5. **テストのしやすさ**

- 各層を個別にテストできるため、ユニットテストが容易です。
- モックを使用して、各層を独立してテストできるため、開発中の品質を高く保つことができます。

---

## 三層アーキテクチャのデメリット

### 1. **パフォーマンスの低下**

- 各層を通じてデータやリクエストをやり取りするため、オーバーヘッドが増え、パフォーマンスが低下することがあります。
- 特に小規模なシステムでは、このオーバーヘッドが無駄に感じる場合があります。

### 2. **設計の複雑化**

- システムを3層に分けることで、設計が複雑になります。
- 小規模なシステムでは、余分な層を追加することでコードが冗長になることがあります。

### 3. **開発コストの増加**

- 各層を分けることで、設計や実装にかかる手間が増えるため、開発コストが増加します。
- 特に小規模なプロジェクトでこれを導入すると、逆に効率が悪化する可能性もあります。

### 4. **運用の難易度の増加**

- 複数の層が異なるサーバやコンポーネントに分かれる場合、運用や監視が複雑になります。
- 障害時のトラブルシューティングや、各層のデプロイメントが手間となる場合があります。

---

## まとめ

**三層アーキテクチャ**は、システムをプレゼンテーション層、ビジネスロジック層、データアクセス層に分けることで、**疎結合**や**保守性の向上**を実現します。**コントローラクラス**はユーザーからのリクエストを処理し、**サービスクラス**はビジネスロジックを実行します。この設計パターンにより、システムの拡張性や再利用性が向上しますが、**パフォーマンスの低下**や**開発コストの増加**といったデメリットも存在します。

このアーキテクチャは、大規模で長期間運用されるシステムに特に有用ですが、小規模なシステムに対しては過剰な設計となることもあるため、用途に応じて適切な選択を行うことが重要です。

↓以下で三層アーキテクチャを使った実践的な開発ができます！
https://www.udemy.com/course/web-jqbn/?referralCode=4F8975CC5648B888F05D
---
windows上にUbuntuを導入する際に起きたエラーとその解決

# windows上でUbuntuを動かす
windows上でUbuntuのような異なるOSを動かすことを"仮想化"と呼びます。
今回はWLS(Windows System for Linux)です。

他にも仮想化には次のようなものも存在ます

仮想化の種類ーーーーーーーーーーーーーーーーーーーーーーーーーー
🔹 フル仮想化 (Full Virtualization)
物理PCの上で、まったく別のOSを動かす。
例: VMware, VirtualBox, Microsoft Hyper-V など。
✅ 長所: 完全に独立した環境を作れる。
❌ 短所: 高負荷、パフォーマンスが下がる。

🔹 コンテナ型仮想化 (Container Virtualization)
仮想マシンではなく、ホストOSのカーネルを共有して軽量な仮想環境を作る。
例: Docker, LXC など。
✅ 長所: 軽量で高速。
❌ 短所: ホストOSと同じ種類のOSしか動かせない。

🔹 WSL (Windows Subsystem for Linux)
Windows の中で Linux 環境を動かす。
WSL 2 では 仮想化技術 を使い、軽量な Linux カーネルを動かしている。
✅ 長所: Linux のツールを Windows で使える。
❌ 短所: 完全な Linux 環境ではない。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

### 仮想化を許可する
デフォルトでwindowsは仮想化を許可しない状況になってます。なのでこれを変更します。
[Linux用Windowsサブシステム]と[仮想プラットフォーム]にチャックをつけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461603/1880fcfb-9040-42bc-9268-07fb086d419f.png)

### MicrosoftStoreからUbuntuをダウンロードする
今回は最新バージョンをダウンロードしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461603/eac52e5f-fc1c-49a1-aea6-0d2393387d96.png)
これを開くとターミナルが開くので指示に従えば大丈夫です。

# 課題(エラー)と解決
[windowsの機能の有効化と無効化]に「仮想プラットフォーム」の項目が出ず、無視してUbuntuをダウンロードすると以下のようなエラー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461603/218139bb-cef9-4103-97f8-432416ec5d79.png)

仮想プラットフォームの制限がBIOSでできるようなのでまずはそこの確認。
BIOSで有効化になっているかどうかはタスクマネージャのCPUの右下から確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461603/57768587-36ed-4fc1-94fa-a233fcca45bf.png)
....?有効化できてました。他に問題がありそう。

ターミナルで直接コマンドを打つ方法
```
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
これをwindowsのターミナルで実行して再起動！

Ubuntuを起動してみると、成功しました。

# まとめ
今回はwindows上でubuntuを動かすための準備と発生したエラーの対処の流れを備忘録的に書いてみました。
結局UI上に仮想プラットフォームの表示が出ない理由はわかりませんでしたが、コマンドから仮想プラットフォームを有効化することでUbuntuが導入できることを確認しました。

追記
仮想プラットフォームの使用が想定されてないPC,特に学校で売っているPCやメモリがマザーボードと一体化しているタイプの教育用ノートPCでは表示されないという報告があったため制限されていた私のノートPCもこれに当たる可能性があるようです。
Certified Backstage Associate (CBA)受験記

## はじめに

CNCF主催の認定試験 **Certified Backstage Associate (CBA)** を受験し合格したので、受験記を記載します。同認定試験の受験を考えている方の参考になれば幸いです。

## 免責事項(Disclamer)

:::note warn
* 本投稿は受験当時の情報となります。受験を検討する際は最新の情報の確認をお願いします。
* 本投稿は個人の所感です。
    * 所属する企業や団体は関係ありません。
    * 情報の利用は自己責任でお願いします。
:::

## 試験概要

* IDP(内部開発者ポータル)、サービスカタログソフトウェア Backstageに関する認定試験です。
* 受験日：2025/1/8
* 試験形式
    * オンライン試験
    * 1回再受験可能
    * 多肢選択式
    * 試験時間90分
    * 試験言語は英語のみ提供
    * 100点満点中75点以上で合格

## Backstageとは

* IDP(内部開発者ポータル)を実現するためのソフトウェア
    * プラットフォームエンジニアリングの構成要素
    * 要は開発者向けの便利ページ
* サービスやAPIをサービスカタログとして登録することで、社内のアセット管理ができる
* Backstageのメリット
    * サービス間の依存性を表現することで、改修影響を確認
    * サービスに関するドキュメントを関連付けることで、新規着任者のオンボーディングを容易に
* 以下のような技術スタックを用いているので、画面UIのカスタマイズの際のReact設定を問われたりします。　
    * 画面UIを更新してプラグインを含める：React
    * Backstageバックエンド：Node.js
    * プロジェクト全体：Typescript（プログラミング言語）

## 勉強方法

### 参考にした受験記

[Sajeeva Lakmalさんの受験記](https://medium.com/@nvsajeeva/how-to-pass-cba-certified-backstage-associate-exam-6f761c395313)

### 学習リソース

* まずはLinuxFoundation提供の無償トレーニング [Introduction to Backstage: Developer Portals Made Easy (LFS142)](https://training.linuxfoundation.org/training/introduction-to-backstage-developer-portals-made-easy-lfs142/) を受けました。
* 次に [認定の公式ページ](https://training.linuxfoundation.org/certification/certified-backstage-associate-cba/) を見て認定のカリキュラムを把握し、先ほどのトレーニングでカバーできていない範囲を[Backstageドキュメント](https://backstage.io/docs/overview/what-is-backstage)で確認します。
* Backstageはカリキュラムと公式ドキュメントの対応がわかりづらいので、カバーできていない範囲の洗い出しが大変かもしれません。
* [Backstage Demo](https://demo.backstage.io/)が提供されているので、画面の雰囲気を掴むためにアクセスしてみるといいと思います。

### 学習のポイント

* 画面UIの編集のために設定すべきファイルが多くあるので、ディレクトリ構成を描いてみると分かりやすくなると思います。参考までに私が描いたものを載せておきます（間違いがあったらゴメンナサイ）。

    ```
    packages/
    └app/src/                      #フロントエンド用ディレクトリ
    　└components/
    　　└catalog/EntityPage.tsx     # エンティティページ（個々のコンポーネント画面等）に表示するタブの中身の設定
    　　└Root/Root.tsx              # 画面の基本表示を司るRootコンポーネント関連。サイドバーの編集はここで行う
    　└theme
    　　└myTheme.tx                 # カスタムテーマ
    　└App.tsx                      # フロントエンドに登録するプラグインのエントリーポイント、テーマの編集
    
    └backend/src/                   # バックエンド用ディレクトリ
    　└plugins/                     # プラグイン毎の設定ファイル置き場
    　　└kubernetes.ts
    　└index.ts                     # バックエンドに登録するプラグインのエントリーポイント
     ```

## 上記でカバーしきれず本番で戸惑った項目

* 時間が経って見返したので、自分でも内容が把握しきれていません。キーワードの参考としてお使いください。
    * backstage設定の上書きを環境変数で行う方法
    * backstage-cliでの新規プラグイン作成
    * backstage-cliでのインタラクティブテスト
    * backstage-cliでのbackstageアップデート
    * エンティティページでのタブの追加の仕方、特定のエンティティがある場合だけ表示
    * Reactコンポーネントを作成するとリターンされるものは
    * locationの手動登録 画面から登録できる？
【備忘録】オブジェクト指向入門

# はじめに

3/22・23に開催されたPHPerKaigi2025の成瀬さんのセッションを機会にアーキテクチャの基本について学ぼうと思ったのがきっかけです。

以下のポストしたのですが、

https://x.com/rinn_miya/status/1904013220509343746

ありがたいことに、易しい内容から難しい内容までリプをいただき、教えていただいたことを学んだアウトプットとして、備忘録を残します。（※自分なりの言葉で言い直したり解釈・理解でメモしています。）
（他業界からIT業界に転職した身として、こうして親切に教えていただける機会があるのは、ITならではだなぁと感じています。本当に感謝しかありません。）

# 記事
- [オブジェクト指向入門](https://speakerdeck.com/nrslib/oop1)

# 内容

オブジェクト指向（Object-Oriented Programming：OOP）とは抽象化の技法のこと。

## プログラムに関しての抽象化
- 「情報量の多いプログラム＝面倒と感じる」例でcsvのコードあり、確かに読み込まないと何をしているのかわからない。

- 抽象化
>思考における手法のひとつで、対象から注目すべき要素を重点的に抜き出して他は無視する方法である。
>資料より抜粋

- 大事なところだけ見て、それ以外は気にせず物事をシンプルにとらえる技の考え方と理解
- 具体的に記述しているコードに関しては、変数化して抽象化する。この時にデータとそのデータを手続きを分けて考えてしまうと、うまく抽象化できなくなる

>データと手続きをまとめよう
>資料より抜粋

- 上記の考え方がクラス


## カプセル化

>抽象化した結果、XxxConverterクラスに「データ」と「処理」が隠蔽された
>必要な知識は newしてRunをCallするだけ
>隠蔽=カプセル化
>資料より抜粋


- めちゃくちゃ分かりやすい。クラスの中には「どんなデータを使うか」「どうやって処理するか」が入っていて、でも中身の詳細は外から見えない、使う側は「どう使うか」さえ分かれば良いとい状態ってことかな。データ（状態）と処理（ふるまい）をひとつのクラスにまとめて包めている状態にしている。（カプセル化）
「面倒なことはカプセル化」することが大事。

## 条件分岐

- 確かに・・・。条件分岐が多いとより複雑に感じる。これを解消するためにメソッドを抽象化すると良いみたい。

>条件分岐＝複雑さ
>プログラムを複雑でなくしたい＝条件分岐を減らしたい
>資料より抜粋

- メソッド名や呼び出し方が共通で、共通のインターフェースまたは親クラスを持っている。使う側は「中身の違い」を考えなくて良いこれを呼ぶだけで自動的に適切な振る舞いをすること

>同じ処理を持つ似たようなものとして抽象化して利用すること
>ポリモーフィズム化
>資料より抜粋

>オブジェクト指向とは何か
>カプセル化とポリモーフィズムを利用した抽象化
>資料より抜粋

- カプセル化（＝データと処理を1つにまとめること）＋ポリモーフィズム（＝同じ操作で違うふるまいをさせること）を組み合わせて、複雑なモノをわかりやすく・使いやすく抽象化する設計手法か。

# まとめ
- 資料拝見しつつ、自分なりに言葉を付け足して備忘録として残せたので、普段使用しているけど、うまく言語化できていなかったところが、鮮明になってスッキリです。
材料力学「等分布荷重で、左がローラー端で右が固定端の時の荷重項を教えて下さい。」をAI先生に聞きました。

・???ChatGPT先生が二人。途中からもう一人先生が現れました。
・以下と同じ形式。**最初から以下の先生に聞けばよかった。**
[「(2015)平成27年一級建築士試験学科Ⅲ（建築構造）〔Ｎｏ．２〕」単純梁の等分布荷重で、左がローラー端で右が固定端をsympyのBeamでやってみた。(作図は、こちらあります。)](https://qiita.com/mrrclb48z/items/2a275292aa08f5ca6a52)

# ChatGPT先生へ
・質問リストの追番は無視して下さい。１個ずつです。途中の回答表示は省略しています。
```
# 質問リスト
1. 等分布荷重で、左がローラー端で右が固定端の時の荷重項を教えて下さい。  
2. 上記のsympyのソースコードで教えて下さい。  
3. 別にシンボリックな計算結果を表示して下さい。具体的な数値は不要です。  
4. シンボリックな計算結果をmathjaxソースとコピー貼り付けできるテキストの、２つに分けて下さい。  
5. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。 1行目に、# 質問リスト　の文字を出力して。  
```
```
最後の質問もふくめて。
```
・含めてもらえませんでした。

#### 最初の先生
・「Beam Load Analysis」表示が折りたたまれていました。
```python
import sympy as sp

# 記号の定義
x, L, w = sp.symbols('x L w', real=True, positive=True)
RA, RB, MB = sp.symbols('RA RB MB')

# 反力とモーメントの式
RA_expr = (3/8) * w * L
RB_expr = (5/8) * w * L
MB_expr = (1/8) * w * L**2

# せん断力 V(x)
V = RA_expr - w * x

# 曲げモーメント M(x)
M = RA_expr * x - (w / 2) * x**2

# 結果の表示
print("反力:")
print("RA =", sp.simplify(RA_expr))
print("RB =", sp.simplify(RB_expr))
print("MB =", sp.simplify(MB_expr))
print("\nせん断力 V(x):")
print(sp.simplify(V))
print("\n曲げモーメント M(x):")
print(sp.simplify(M))
```
#### 途中からの先生
① MathJax（LaTeX）形式
```math
\[
R_A = \frac{3}{8} w L, \quad R_B = \frac{5}{8} w L, \quad M_B = \frac{1}{8} w L^2
\]

\[
V(x) = \frac{3}{8} w L - w x
\]

\[
M(x) = \frac{3}{8} w L x - \frac{w}{2} x^2
\]
```
② プレーンテキスト形式
```
RA = (3/8) * w * L
RB = (5/8) * w * L
MB = (1/8) * w * L^2

V(x) = (3/8) * w * L - w * x

M(x) = (3/8) * w * L * x - (w/2) * x^2
```


# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0


# いつもと違うおすすめです。

#### wikipedia 
#### Qiita


#### Google検索
#### 文献
Microsoft Certified: Azure Data Scientist Associate(DP-100)合格備忘録

### ■受験の目的
Azure Machine LearningおよびAzure AI Foundryのサービスの概要を理解するため。
AI・機械学習の運用におけるライフサイクルを理解するため。
Microsoft Certified: Azure Data Scientist Associate(DP-100)の認定を受けるため。

### ■出題範囲
シラバスはMicrosoft公式から参照します。
https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/dp-100

### ■受験の前提
中級試験の位置づけですが、特に事前に合格が必要な試験などはありません。
DPシリーズですが、他のデータベース関連認定試験とは異なり、AI・機械学習に特化しています。
そのため、受験後の所感としては、AI-900合格レベルのAI・機械学習に関する前提知識は、必要なところです。AI-102は、各AIサービスに関する試験のため、今回はほぼ領域外ですが、SDKサービスクライアントやPythonの知識は、概念として理解していると有利です。

### ■受験のメリット
「分析のための機械学習モデル構築」および「AIアプリを構築するためのモデル構築」を行いたい方には最適な試験です。モデルに関連する「ライフサイクル管理」や「責任あるAI原則に基づくモデル評価」を学習することも可能です。

### ■教材
MicrosoftLearningで学習します。このあたり無料で詳しく体系的に学べるのはありがたいです。
PC端末限定ですが、ラボもあります。
https://learn.microsoft.com/ja-jp/training/courses/dp-100t01
※個人のMicrosoftアカウントがあれば、PCやスマホなどで進捗を同期できるので、いつでも続きから学習できます。

### ■模擬試験
購入しておりましたが、2025年2月の試験改訂以降より、類似問題が出題されていないとのことでしたので、今回情報は載せておりません。

### ■学習期間
筆者の場合、ラーニングを1カ月半ほど学習しております。
前段に添付している資料のほかに2サービスの公式資料全体の内容を把握しておくことをお勧めします。
https://learn.microsoft.com/ja-jp/azure/machine-learning/?view=azureml-api-2
https://learn.microsoft.com/ja-jp/azure/ai-foundry/what-is-ai-foundry


### ■実際の本試験
日本語に対応した試験が発行されていましたので、そちらで受験しています。
全48問の制限時間は100分でした。問題数は毎回変わるのでご注意ください。

以下の内容でした。
全問題：48問
　　L　通常問題：40問
　　L　共通題目で回答後戻れない問題：8問
⇒ケーススタディはありませんでした。

今回受験した印象としては、Learning検索で見つける前提で問題が構成されているように感じました。Learning検索は、画面を分割して使用できるようになっています。この点を考えると大きいモニター画面のある環境を用意した方がよいでしょう。テストセンター受験の方が、トラブルが少なく安心かもしれません。

ポイントとしては、繰り返し検索することが多いため、「＜サービス名＞　＜題目＞」で検索します。やり直す場合は「戻る」ボタンを使い、検索欄を書き換えながらやると再入力を省けるため時間を節約できます。
検索のテクニックとしては、慣れとワードに関連する知識が必要であるため、事前に対象サービスに関するドキュメント全体に目を通しておくと本番で効率的に検索ヒットさせられます。
もちろん、覚えているに越したことはありません。

Learning検索は、以下のMicrosoftLearnのドキュメント内でのみ
https://learn.microsoft.com/ja-jp/

以下は、その他試験中に試行してみた結果です。
・問題文からのコピペはできない。
・Learning内部のコピペはできる。
・Learning内部に限定されたリンクは遷移できる。
・技術ドキュメントのみを検索対象として閲覧できる。
・Learning内部のワード検索は使用できない。

攻略としては、100分という制限時間内に効率よく情報へアクセスできるかが肝となります。そのため準備は怠らず。

7割以上が合格ラインです。
ほぼ7割のスコアで、辛勝という結果でした。
Xの「おすすめ」を消し去る拡張機能を作った

# Xってめっちゃ気が散りません？
特にホーム画面。ついポチっちゃうトレンドとかあって。
情報発信しようと思っても、この気が散りようがおっくうだったんですよね。
![](https://storage.googleapis.com/zenn-user-upload/6a853c800536-20250324.png)

# なので邪魔なやつを消す拡張機能を作りました。
その名もX-Distraction-Remover。
Google Chrome/Microsoft Edge用の拡張機能です。
Xで気が散る部分を静かにして、情報発信に集中できる環境を整えます。
（offにすれば、気が散るモードに戻せます。）
<br>**Removing all distracting features from X.com**

# 具体的な機能
右のカラムのほぼ全てを消して、左のカラムから検索ボタンを消して、
ホーム（他人のポストや広告が満載）から自分のプロフィールページ（自ポストのみ）へ強制リダイレクトします。
プロフィールページ内の「この人とつながる」的なやつも消します。

こんなふうに、**自分の情報発信だけに専念できる環境が手に入ります。**
![](https://storage.googleapis.com/zenn-user-upload/b94831c7a2c2-20250324.png)

# 事前準備
https://github.com/ykishimotoy/X-Distraction-Remover/tree/main
1. 本レポジトリのファイルを、「X-Distraction-Remover」と名付けたローカルのフォルダに保存する。
2. content.jsの1行目のURLを、自分のIDのURLに変更する。（メモ帳とかで開いてもできます。）

# Chromeでの使い方
1. Chromeで下記URLにアクセスする。
chrome://extensions/<br>
3. 右上のデベロッパーモードをonにする。
4. 左上の「パッケージ化されていない拡張機能を読み込む」で「X-Distraction-Remover」フォルダを指定する。

# Edgeでの使い方
1. Edgeで下記URLにアクセスする。
edge://extensions/
3. 左上のデベロッパーモードをonにする。
4. 右上の「展開して読み込む」で「X-Distraction-Remover」フォルダを指定する。

# 余談
9割くらい生成AIが作ってくれました。生成AIステキ。

それと、こんなの主催してます。

https://sapporo-sugoi-ai.connpass.com/event/349822/
データ×AIプロジェクトに関わる職種について

## はじめに
　データ×AIプロジェクトに関わる職種についてまとめてみました。
　

## 職種
データ×AIプロジェクトには、データサイエンティスト、データエンジニア、機械学習エンジニアをはじめとした様々な人が関わる他、SE、施策実行責任者、プロダクトオーナーなど、データ×AI関連ではない職種の人も関係します。

### PM・コンサル
データ×AI活用プロジェクトに関する幅広い知識を持っている。プロジェクトを進めるために必要なことを押さえ、分析における全体設計、メンバー間の調整や橋渡し、進行管理を担当する。

### 機械学習エンジニア
機械学習モデルをシステム化するスキルを持ったエンジニア。データサイエンティストが構築した機械学習モデルの組込み、システム化を行う。

### データサイエンティスト
機械学習を用いてビジネス上の課題を解決するモデルを構築する人。最新の論文に基づいてアルゴリズムの実装を行ったり、フレームワークを用いた分析、レポーティングを行ったりする。定義が曖昧で様々な定義で使われる職種。

### データアナリスト
データの集計と分析を中心に担当し、分析レポートを作成する人。データからインサイトを抽出し、ビジネスにおける意思決定をサポートする。

### データエンジニア
データ分析基盤の構築、整備をする人。データの収集、蓄積、加工のための仕組みを構築して、データ×AI人材がデータを活用しやすい環境を整える。

### BIエンジニア
BIツール構築、運用に関して必要なスキルを持ったエンジニア。BIツールを用いて、ダッシュボードの設計、構築、運用などを行う。






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

## 参考文献
・データ×AI人材キャリア大全 職種・業務別に見る必要なスキルとキャリア設計 単行本（ソフトカバー） – 2022/6/20
村上智之 (著)
p.69-70
Terraform講座：まとめ編

## 今回の記事について
今回は、これまで自分が投稿してきたTerraform講座シリーズの振返りをしたいと思います。このページから全ての講座にアクセスできます！

## 記事の対象と何が出来るようになる？
### 対象
- インフラ開発初心者
- Terraformに興味あるけど、実態が分からない・そもそもどんなメリットがあって使われているか分からない人
- アプリケーションのためのインフラ開発でTerraformを使いたい人
- Terraform使いたいけど、どういうフォルダ構成にすればいいか分からない人

など、Terraformに興味ある・Terraform初心者の方向けの記事となっています！

### 何が出来るようになる？
以下のことが出来るようになります！！

- Infrastructure as Code (IaC) が何なのかが説明できる
- Terraformがインフラ開発で使われている理由を説明できる
- Terraformを使ってインフラ開発環境を整えることが出来る
- リソースのコーディング・およびEC2にSSHで入るインフラを構築できる


## 第1回：IaCって何編
https://qiita.com/aaaaa_326/items/4624fd8b020ce7910ff3

第1回は、インフラ開発をコーディングで始めるにあたって、その一番基礎的な考えとなるIaCについて解説しています！

## 第2回：Terraformって何編
https://qiita.com/aaaaa_326/items/b32621f4cbaa1434d925

第2回は、Terraformについて「メリット」や「コードの簡単な書き方」を紹介しています！

## 第3回：環境構築・フォルダ構成編
https://qiita.com/aaaaa_326/items/74563f1e25c0fdc8d888

第3回は、Terraformの世界に足を踏み入れて、環境構築であったり、おすすめのフォルダ構成について紹介しています！

## 第4回：実際にリソースを作ってみよう編
前編

https://qiita.com/aaaaa_326/items/a82ee52b6d2dd7274c6e

後編

https://qiita.com/aaaaa_326/items/bfb0c9c2a9c55bedfa34

第4回は、前編・後編に分けて、実際にAWSアカウントに対してリソースを構築してみました！
前編：よりインフラに近いリソースの構築に関するハンズオン
後編：EC2を構築してSSHでログインするなど、よりアプリ的なハンズオン
という感じで分けています！

## 第5回：繰り返し処理編

https://qiita.com/aaaaa_326/items/89b319e13447fd72e54b

第5回は、「コードをより本格的に書いていきたい！」人向けの講座になっています。
コードを書く量を減らしてスマートに書くための`count`や`for_each`文について解説しています！


## まとめ
Terraformはインフラ構築に非常に便利なコードです！
自分も使い始めて半年ぐらい経ちましたがまだまだ勉強することが多いです。。。
また、これを機にTerraformに取り組んでくれる方がいると嬉しいです！一緒に頑張っていきましょう！！！
記事を読んでいただきありがとうございました～！！
CursorでIndexing failed～自己署名証明書を信頼させる方法（Linux）

Cursorでプロジェクトを開いた際に、「Indexing failed」というエラーが出ました。調べてみたところ、自己署名証明書を使用している場合、SSLの検証が失敗することが原因のようです。

公式フォーラムにも同様の問題が報告されています。

- https://forum.cursor.com/t/codebase-indexing-error/47635/5

## 解決方法

環境変数`NODE_EXTRA_CA_CERTS`に証明書のパスを指定することで、Cursorに自己署名証明書を認識させることが出来ました。

### 設定手順

1. **自己署名証明書の準備**

   自己署名証明書が複数ある場合は、一つのPEMファイルにまとめておいてください。

   ```bash
   cat cert1.pem cert2.pem > combined_cert.pem
   ```

2. **環境変数の設定**

   `.bashrc`や`.profile`などに以下の設定を追加します。

   ```bash
   export NODE_EXTRA_CA_CERTS=/path/to/combined_cert.pem
   ```

3. **設定の反映**

   ターミナルを再起動するか、以下のコマンドで設定を反映します。

   ```bash
   source ~/.bashrc
   ```

4. **Cursorの再起動**

   最後に、Cursorを再起動すると、正常にIndexingが行われるようになります。

同じ問題で困っている方の参考になれば幸いです。
ブラウザでの動画リワード広告の収益「1再生あたり0.1円程度ですか？」

はじめまして。
スマートフォンとPCで遊べるブラウザゲームを運営しております。

ブラウザで使える動画リワードについて、ご質問となります。

ブラウザゲームのマネタイズとして、
新しく動画リワード広告視聴を最近導入しましたが、
収益額が１再生あたり0.1円程度で困っております。

ブラウザゲーム内では、
20～30秒の動画リワード広告視聴で、ゲーム内通貨の配布をしており、
デイリーで２万人以上が視聴している状況で、母数はある程度あるかと思います。

現在、動画リワード広告の収益額が想定を大きく下回っており、
これが一般的なのか、またよいブラウザで使える動画リワード広告のオススメなどありましたら、
ご教授頂きたく、投稿させて頂きました。

▼動画リワードの収益
スマホ版のeCPM：50円（動画再生1回あたり0.05円）
PC版のeCPM：120円（動画リワード再生1回あたり0.12円）

想定では、動画リワード１回あたり、0.7円くらいは収益あるのかと思っておりました。

個人開発となりますが、アプリで動画リワード広告を導入した時は、
１再生あたりの収益がうろ覚えですが、もっと高かった印象です。

ご質問事項は下記２点となり、
①ブラウザの動画リワード広告は１回再生あたり0.1円程度なのか
②ブラウザで使える動画リワード広告のオススメがあったら教えて欲しい
（現在使用している動画リワード広告のサービス名については、
　ネガキャンになってしまうかもしれませんので伏せさせて頂きます）

もし何か分かる方や
ヒントになることが分かりましたら、ご教授頂けますと非常に嬉しいですm(__)m
よろしくお願いします。
業界未経験からRPAエンジニアになってみて

## はじめに

この記事の対象：業界未経験からIT業界を目指そうと思っている方(悩んでいる方)

RPAエンジニアとしてお客様先で働き始めて9か月経った私の感じたことを、参考になればと思い書いてみます。
他業界から転職してきた私から見た、RPAエンジニアの働き方の、特殊だと感じた部分、これまでの経験が生かせるなと思った部分を挙げてみます。

※RPAとは、ロボティックプロセスオートメーション(Robotic Process Automation)の略で、PC上で行う業務をロボットで自動化するツールです。具体的には、私はBizRobo!というソフトウェアを使用して業務にあたっています。



## この記事で伝えたいこと
私自身、「エンジニア＝特殊な職種で、業務内容もその他の職種とかけ離れている」と思い、0からのスタートのつもりで転職しました。
しかし、実際には想定していたより、これまでの社会人経験が生きたなと感じる場面も多かったです。
なので、IT業界やエンジニアという職種について、過度に恐れる必要はないのかなと思っています。
それと、IT業界といえば残業時間がすごいイメージをもっていましたが、1社かつ1現場(SES)の経験しかありませんが、これまで10時間程度/1か月で収まっているので、良い意味で想像とのギャップがありました。

## 転職した経緯
私は新卒後メーカーの法人営業として働いてきました。そこで使っていたのは電話やFAXがメインで、IT技術とは程遠い仕事をしてきました。
転職の動機としては、自分の手でものを作る立場で仕事をしてみたいと思ったためです。
独学で勉強してみたプログラミングも、面白いなと思ったのも動機のひとつです。
ただ、RPA(BizRobo!)の存在は知らず、カジュアル面談からその存在を知り、未経験でも歓迎とのことでExbrainへの入社を決めました。

## これまでの社会人経験と比較して
私が感じたRPAエンジニアと、これまでの社会人経験(法人営業)の、類似点と相違点をまとめてみようと思います。

### 類似点
* ユーザー対応(お客様対応)
インシデント(障害)発生時や要件定義時には、ユーザー(常駐先の社員さん)とのコミュニケーションは必須となります。
ユーザーさんの意図を汲み取りながら、自分(システム担当側)の意見も通していくコミュニケーション能力が求められます。
　　
ユーザーさんとのやり取りが、少ない時でも1日1回ほどはあるので、常に開発業務をしているわけではなく、人とコミュニケーションに割く時間も結構あります。
　　
* 事務的業務
資料作成やマニュアルに則った定期保守業務には事務的能力が必要とされる。
その他に設計書やテスト結果報告書の作成など、事務的な業務にあてる時間も、それなりにあります。

### 相違点(エンジニアならではだと感じた点)
 *  開発
運用・保守面も考えて、ユーザーさんの要望を反映させながら開発を進めます。見本や参考となるシステムはありますが、最終的には自分の頭で考えて組み上げる必要があります。
　　
頭をひねり、工夫しながら作っていく作業で、奥が深すぎて9か月の経験では何も言えないです。ただ、自分が思い浮かべた動きを実現できた時はとても嬉しいです。
　　
 *  テスト(テストケース作成)
 実際の業務で発生可能性がある様々なケースを想定し、テストケースを作成し、開発したシステムの検証を進めていきます。
 　　
これまでの仕事では、もしものケースを簡単に想定しておくことはあっても、ケースを網羅的に挙げてチェックすることはありませんでした。
システムのリリース後は基本は人の手で動かしたり調整したりしないので、様々なケースを事前に試す必要があるのだと理解しています。
　　
*  インシデント原因調査
インシデント(障害)の調査は、原因を絞り込んでいくことが必要で、論理的にエラー発生原因を特定していく能力が必要とされます。
また、先輩方を見ているとエラー対処の経験も重要で、これまでの経験値が原因特定までの早さに繋がっていそうだなと感じています。

## まとめ
あらためて「業界未経験からIT業界を目指そうと思っている方」に向けて伝えたいこととしては、IT業界やエンジニアとはいっても、業務の全てが特殊で専門性の高い仕事というわけではなく、これまで他業界・他職種で培ったコミュニケーション能力や事務処理能力が生かせる部分もありますよ、ということです。

とはいえ、専門知識が必要とされることに変わりはなく、むしろその専門知識の部分がコアであると日々感じているので、勉強を続けていくつもりです。
長く雑多な文章になってしまいましたが、最後まで読んでいただき、ありがとうございました！

## 補足
私の所属するエクスブレーンDX事業部の採用情報と紹介記事のリンクを貼っておきます。興味がありましたら覗いてみてください。よろしくお願いします！

https://exbrain.recruitment.jp/cr_job_detail/id=644

https://www.wantedly.com/companies/company_2491697/stories
「アーキテクチャって何？」から始まったインターンの学び

サイバーエージェントの育成型インターンに行ってきました
それまでの取り組みと、どのような知見を得たかを書いていこうと思います

今回参加したのはKotlinのCA tech Dojoでした。
これまで、Kotlinでの開発はUIレイヤーしか行ったことが無く、
UIレイヤーのみでアプリ開発をするのが普通だと思っていました。

しかし、今回のインターンを通して様々な知見を得ることができたので、
日記も兼ねて書いていきたいと思います。

### アーキテクチャとの出会い

インターン参加前、僕はUIを自由に作れるようになったことで、
かなりアプリは作れるようになった気でいました。

ある程度作れるようになったら、これから何をすべきか定まらず、
**「目標探し」** を目的に参加しました

そんな中、プロジェクトの先輩方からアーキテクチャという単語を聞き、
大規模なプロダクトを自分で設計することに魅力を感じ、勉強を始めました

そして、インターンが始まる前のメンターさんとの面談の際、
アーキテクチャを軸にインターンに取り組むことに決定しました。

### アーキテクチャ楽しいかも

インターンが開始して4日目ほどで要件がすべて終わり、アーキテクチャを見直すことにしました。

今回はMVVMを採用していたのですが、
そこで、初めてScreen,ViewModel,Repository,Databaseに分ける構造を理解できました。

実装してみると、思ったよりも分かりやすく、
一回作ってしまうことが理解への近道だなーと感じました

### 依存関係を整えよう

インターン7日目、アーキテクチャが整いました。
次にすべきことを聞いたところ、
**「依存関係逆転の原則」** と **「依存性の注入」**
というヒントをもらいました。

そこから、苦しみながらしばらく試行錯誤を行い、
最終的にInterfaceやHiltを導入することができました。

### Testを実装しよう

これもインターン7日目
Hiltが終わったあと、次にすべきことを聞き、Testの存在を知りました。

Testとは、問題と模範解答を用意し、実行することで、
プログラムが正しく想定通りに動いているかを試すことができるものです。

フォルダ構造で少し詰まりましたが、
UITest,RepositoryTest共に実行することができました。

### Testを自動化しよう

これはインターン8日目最終日に行いました。
Testを作成し終わったあと、メンターさんから、
**「GitHub Actions」** の存在を教えてもらいました。

これは、比較的すぐに導入でき、発表前の1時間もかからず、実装することができました。

### まとめ

今回の1weekのインターンで、
**アーキテクチャ・依存関係・CICDの自動化** を学べました。

独学ではなかなか身に付きにくい技術を中心に学んだため、
かなり有意義なインターンになったと感じています。

### さいごに

メンターさんに聞いたインターンがない期間の勉強法を共有します。

・公式ドキュメントを読み漁る
・自分の知る技術をリストアップし、その派生形を調べる
・さまざまなプロダクトのアーキテクチャの選定理由を理解する
Hyper-V上のWindowsServer評価版をライセンス認証する方法

# 結論
* 設定からプロダクトキーの変更ではエラーした。
* そのため、コマンドラインからの設定が必要だった


## コマンド
```ps1
# 現在のバージョンが評価版(ServerStandardEval)であることを確認
1．DISM /online /Get-CurrentEdition

# 変更可能なバージョンに製品版(ServerStandard)があることを確認
2．DISM /online /Get-TargetEditions

# プロダクトキーはKMSクライアントセットアップキー
3．DISM /online /Set-Edition:ServerStandard /ProductKey:AAAAA-BBBBB-CCCCC-DDDDD-EEEEE /AcceptEula

# プロダクトキーはStandard Editionのプロダクトキー
4．slmgr -ipk XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
5. slmgr /ato

# プロダクトキーの認証 ※オンラインならたぶん不要。オフラインなら電話要。
5．slui 4

```
## こちらのサイトを参考にさせてもらいました。
https://fukuromimizuku.com/win/win2019eva_llicense_err/



## WindowsServer2016にての操作方法(前提条件)
* 前提としｔHyper-Vでの操作の場合ホストOSとEditionとVersionを同じにする必要が有るみたいです。
* Powershellの管理者権限でセットアップしました。
* AVMAキーを入力する必要があり

### AVMA キー
https://learn.microsoft.com/ja-jp/windows-server/get-started/automatic-vm-activation?tabs=server2016


### KMSクライアントセットアップキー
https://learn.microsoft.com/ja-jp/windows-server/get-started/kms-client-activation-keys?tabs=server2016%2Cwindows1110ltsc%2Cversion1803%2Cwindows81
【Rails】SQLで検索する

# はじめに
`find_by_sql` メソッドと `select_all` メソッドを使用して、独自のSQLでレコードを検索した記録をまとめます。

# `find_by_sql`
### 実行例
- 引数は文字列だけでなく、配列も指定できる

```
# 引数が文字列
Employee.find_by_sql("select * from employees em inner join companies co on em.company_id = co.id where em.company_id = 1 and co.deleted =false order by co.id DESC limit 1")
  Employee Load (1.4ms)  select * from employees em inner join companies co on em.company_id = co.id where em.company_id = 1 and co.deleted =false order by co.id DESC limit 1
```

```
# 引数が配列
Employee.find_by_sql(["select * from employees em inner join companies co on em.company_id = co.id where em.company_id = ? and co.deleted =? order by co.id DESC limit 1", 1, false])
  Employee Load (2.4ms)  select * from employees em inner join companies co on em.company_id = co.id where em.company_id = 1 and co.deleted =FALSE order by co.id DESC limit 1
```

### 結果
- インスタンス化されたオブジェクトの配列を1つ返す
- クエリがレコードを1つしか返さなかった場合にも配列が返される
```
=> [#<Employee id: 1, company_id: 1, first_name: "太郎", ....>]
```

# `select_all`
### 実行例
- 引数は文字列のみで、配列は指定できない
- Rails7までは `connection.select_all`
- Rails8からは `lease_connection.select_all`
```
# 引数が文字列
Employee.connection.select_all("select * from employees em inner join companies co on em.company_id = co.id where em.company_id = 1 and co.deleted =false order by co.id DESC limit 1")
   (1.5ms)  select * from employees em inner join companies co on em.company_id = co.id where em.company_id = 1 and co.deleted =false order by co.id DESC limit 1
```
```
# 引数が配列（エラーが発生する）
 Employee.connection.select_all(["select * from employees em inner join companies co on em.company_id = co.id where em.company_id = ? and co.deleted =? order by co.id DESC limit 1", 1, false])
   (0.6ms)  ["select * from employees em inner join companies co on em.company_id = co.id where em.company_id = ? and co.deleted =? order by co.id DESC limit 1", 1, false]
Traceback (most recent call last):
        1: from (irb):26
ActiveRecord::StatementInvalid (TypeError: wrong argument type Array (expected String))
```
### 結果
- `ActiveRecord::Result` クラスのインスタンスを一つ返す
```
=> #<ActiveRecord::Result:0x000055c6e441b8c8 @columns=["id", "company_id", "first_name", ....], @rows=[[1, 1, "太郎", ...]], @hash_rows=nil, @column_types={}>
```

### 結果の補足
- `to_a`を付けて実行すると各レコードに対応するハッシュを含む配列を一つ返す
```
Employee.connection.select_all("select * from employees em inner join companies co on em.company_id = co.id where em.company_id = 1 and co.deleted =false order by co.id DESC limit 1").to_a
   (1.5ms)  select * from employees em inner join companies co on em.company_id = co.id where em.company_id = 1 and co.deleted =false order by co.id DESC limit 1
```
```
=> [{"id"=>1, "company_id"=>1, "first_name"=>"太郎", ....}]
```

# 参考
https://railsguides.jp/v8.0/active_record_querying.html#sql%E3%81%A7%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B
最新の組み込みシステム技術を習得！FPGAとHILで競争力を高める方法


こんにちは、韓国在住のsanaです！

日本でも、データ回路設計やVerilog FPGAプログラム、MCUポーティング、HIL技術注目されていますか？

隣国の台湾では、特にハードウェア設計や組み込みシステム開発において注目されているみたいです！

これらの技術は、自動車産業/産業機器・ロボティクス/IoT/通信機器・エレクトロニクスなど,日本でも特に高度な技術力を必要とする分野での需要が高く、エンジニアのスキルとしても重要視されていると思います:thinking:


今日おすすめする講義では,[FPGAやVerilogを使ったデータ回路設計、MCUポーティング、HIL技術を活用したシミュレーション・テスト手法]を習得できます:point_up:

次世代技術を駆使した組み込みシステム開発を学びたい方におすすめの講義です！

今日も一日ファイティン～

:star:おすすめ講義:star:
https://u.inf.run/4bXVhZi
https://u.inf.run/41YpRgZ
WSL上ComfyUI環境におけるディスク速度改善に関するメモ

#### WSL上ComfyUI環境におけるディスク速度改善に関するメモ
ComfyUIをWSL上で使用している際、モデルファイルの増加によってシステムディスクの容量が不足する問題に直面することがあります。この記事では、ext4フォーマットのディスクをUbuntu専用として活用し、アクセス速度を5-10倍に向上させる方法のメモです。
#### 背景
WSL上のComfyUI環境では、様々なモデルによってディスクスペースが肥大化し、UbuntuとWindowsが存在するシステムディスクの容量が足りなくなることがあります。その対策として、modelsフォルダを他のディスクにコピーし、シンボリックリンクからアクセスする方法がありますが、アクセス速度が極端に低下し、Fluxなどの巨大なモデルではロードに数十分かかるという問題が発生します。
Windowsからの直接アクセスはできなくなりますが、ディスクをext4でフォーマットしてUbuntu専用にすることで、アクセス速度を大幅に改善できます。
#### 手順
##### 1. ディスクをext4でフォーマット
まず、「ディスクの管理」で対象ディスクの番号を確認します。
![スクリーンショット 2025-03-24 085500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/ca34b430-d7d5-4ca7-a47d-bb20f83561cd.png)

powershell内で管理者権限で、フィジカルドライブにマウント
```
wsl --mount \\.\PHYSICALDRIVE3 --partition 1 --type ext4
```
wsl(ubuntu内で）ディスクをext4でフォーマット

lsblk　を実行し、ターゲットのディスクのデバイス名を確認
```
　MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda   8:0    0 389.8M  1 disk
sdb   8:16   0    12G  0 disk [SWAP]
sdc   8:32   0     1T  0 disk /mnt/wslg/distro
                          /
sdd   8:48   0 931.5G  0 disk
```
この場合はsddなので、このデバイスをext4でフォーマット
```
sudo mkfs.ext4 /dev/sdd
```
※ sdc の部分は実際のデバイス名に置き換えてください！sddとは限りません。
##### ※ この操作は毎回ではなく、最初の一回だけです。
##### ※ コマンドの実行前に、対象ディスクのデータをバックアップしてください。フォーマットするとデータは消去されます。
##### 2. フィジカルドライブをマウント
このディスクはPowerShellから以下のコマンドでマウントできます：
このコマンドは上でも出ましたが、WSLを終了したら、設定したマウントは外れますので、Windowsを起動し直したり、ログオンする毎にマウントし直します。
```
wsl --mount \\.\PHYSICALDRIVE3 --bare
```
ただし、毎回手動ではめんどうなので、以下のようにWindowsログオン時に自動的にマウントするよう設定します。
タスクスケジューラの設定方法

##### Windowsのタスクスケジューラを開く
「基本タスクの作成」を選択
タスク名と説明を入力（例: "WSL-Disk-Mount"）
トリガーを「ログオン時」に設定
操作を「プログラムの開始」に設定
プログラム/スクリプトに wsl を入力
引数に  --mount \\.\PHYSICALDRIVE3 --bare" を入力
「完了」をクリック

##### 3. WSL側での確認と設定
WSL(Ubuntu)で lsblk コマンドを実行すると、マウントされたディスクを確認できます：
lsblk
実行結果の例：
```
　MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda   8:0    0 389.8M  1 disk
sdb   8:16   0    12G  0 disk [SWAP]
sdc   8:32   0     1T  0 disk /mnt/wslg/distro
                          /
sdd   8:48   0 931.5G  0 disk
```
最後の行の sdd が、先ほどマウントしたディスクです。
#### 4. 手動マウント
以下のコマンドでマウントポイントを作成し、ディスクをマウントします：
```
sudo mkdir -p /mnt/mydisk
sudo mount /dev/sdd /mnt/mydisk
```
これで /mnt/mydisk を高速なディスクとして利用できるようになります。
#### 5. 自動マウント設定
起動時に自動的にマウントするため、以下のスクリプトを .bashrc に追加します：
```
# デバイスが見つかったかチェック
# lsblkの出力からヘッダーを除外し、NAMEとSIZEだけを対象にする
DEVICE_NAME=$(lsblk -o NAME,SIZE --noheadings | awk -v size="931.5G" '$2 == size {print $1; exit}')
if [ -n "$DEVICE_NAME" ]; then
  echo "Found device: /dev/$DEVICE_NAME"
  if [ ! -d "/mnt/mydisk/models" ]; then
    echo "Mounting /dev/$DEVICE_NAME to /mnt/mydisk..."
    sudo mount /dev/"$DEVICE_NAME" /mnt/mydisk
  else
    echo "Skip mounting: /mnt/mydisk/models does exist."
  fi
else
  echo "Error: No device found with size 931.5G"
  exit 1
fi
```
#### まとめ
この方法を使用することで、WSL上のComfyUI環境におけるモデルロード速度が5-10倍に向上し、特に大規模モデルを扱う際のロード速度が大幅に改善されます。
　この設定は他のWSL上のAIモデルを使った開発環境にも応用可能です。

### 注意点

もっとスマートなやり方はあると思いますが、とりあえず問題なく動いているので、紹介しました。

ディスクをフォーマットすると既存のデータはすべて消去されます
ext4フォーマットのディスクはWindows側から直接アクセスできません

ディスクサイズは環境によって異なるため、スクリプト内の 931.5G は実際のディスクサイズに合わせて調整してください

Happy ComfyUI-ing!
Flask + uWSGI + Nginxをローカル環境で設定

## 環境
- Ubuntu 24.04
- Python 3.8.20
  - Pythonがインストールされている状態
- nginx-1.26.3
- 推奨される設定状態
  - `sites-available`と`sites-enabled`ディレクトリが存在する
  - `/etc/nginx/sites-enabled/`内の設定ファイルがNginxの設定に組み込まれている

Nginxのインストールや環境設定については下記のページをご覧ください

https://qiita.com/myaX/items/4212e8899a39e6800414

https://qiita.com/myaX/items/527ad2a7b02488aad454

## 手順1：仮想環境の構築
適当なディレクトリ内で仮想環境の構築を行います
```bash
python3 -m venv venv
source venv/bin/activate
pip install -U pip
```

## 手順2：FlaskやuWSGIのインストール
```bash
pip install flask uwsgi
```

## 手順3：Flaskアプリの作成
仮想環境の構築を行ったディレクトリ内で、Flaskの簡単なアプリを作成します
```python:app.py
from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello():
    return 'Hello, uWSGI!'


if __name__ == '__main__':
    app.run()
```

## 手順4：uWSGIの設定
```ini:uwsgi.ini
[uwsgi]
socket = 127.0.0.1:5000
wsgi-file = /path/to/your/app.py
callable = app
master = true
processes = 4
threads = 2
```
- `socket = 127.0.0.1:5000`
  - uWSGIがリクエストを受け取る ソケット の設定
- `wsgi-file = /path/to/your/app.py`
  - uWSGIが実行する FlaskアプリケーションのWSGIファイル を指定
- `callable = app`
  - uWSGIがFlaskアプリケーションをロードする際に、wsgi-file で指定したPythonファイル内の app という名前のオブジェクト を呼び出します
- `master = true`
  - uWSGIのマスタープロセスの有効化
  - マスタープロセスを使うことで、複数のワーカープロセスを効率的に管理し、プロセスの再起動などが容易になります
- `processes = 4`
  - uWSGIが4つのワーカープロセスを起動することを指定
  - これにより、uWSGIはリクエストを並列に処理することができ、複数のリクエストを効率よくさばくことができます
- `threads = 2`
  - 各ワーカープロセスが 2つのスレッド を使用することを指定
  - これにより、各ワーカープロセスが複数のスレッドで並列にリクエストを処理できるようになります。ワーカーの数とスレッド数を適切に設定することで、アプリケーションのパフォーマンスを調整できます

## 手順5：uWSGIの起動
```bash
uwsgi --ini uwsgi.ini
```

## 手順6：Nginxの設定
```conf:/etc/nginx/sites-available/uwsgi_flask
server {
        listen 8080;
        server_name localhost;

        location / {
                # NginxがuWSGIと通信するために必要な設定の読み込み
                include uwsgi_params;
                # uwsgi_passは、Nginxが受け取ったリクエストを uWSGIサーバー（127.0.0.1:5000）に転送する設定
                uwsgi_pass 127.0.0.1:5000;
        }

        # エラーログの記録
        error_log /var/log/nginx/uwsgi_flask_error.log;
        # アクセスログの記録
        access_log /var/log/nginx/uwsgi_flask_access.log;
}
```

## 手順7：sites-enabled/にシンボリックリンクを作成
```bash
sudo ln -s /etc/nginx/sites-available/uwsgi_flask /etc/nginx/sites-enabled/
```

## 手順8：設定の反映
```bash
sudo systemctl reload nginx
sudo systemctl restart nginx
```
`http://localhost:8080`にアクセスすると、`http://localhost:5000`に表示されているページの表示ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021963/a43d46e2-4b83-4a70-bee6-4a93fb43b4e5.png)

## まとめ
以上でFlask + uWSGI + Nginxができました
【Linux】cd(Change Directory)コマンド

## はじめに
Linuxのcdコマンドについてまとめてみました。

## cdコマンド
**cd**(**Change Directory**)コマンドは、カレントディレクトリを変更するためのコマンド。
移動したいディレクトリ名をコマンドの後ろに指定する。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/7076b0ab-c095-46a3-9819-17ac6e3d3f33.png)

ディレクトリを指定しないで使うと、どこにいてもホームディレクトリに戻る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/4848b0d6-1a55-40fb-b097-368cf5e32040.png)




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

## 参考文献
・Linuxの絵本 サーバーOSが楽しくわかる9つの扉 単行本（ソフトカバー） – 2020/1/20
株式会社アンク (著)
p.28