OmniAICreator/Qiita-1.07M huggingface dataset:
Tailwind CSS v4.0 での module.exports 非推奨によるエラーの対処法

## **エラーの概要**

Tailwind CSS v4.0 以降では、`tailwind.config.js` の設定で **ES Modules（ESM）** を使用することが推奨される。
そのため、従来の **CommonJS（CJS）** の `module.exports` を使っていると、エラーが発生する。

### **エラーメッセージの例**

```
SyntaxError: Cannot use import statement outside a module
```

または、

```
TypeError: module.exports is not a function
```

## **原因**

Tailwind CSS v4.0以降では、設定ファイル `tailwind.config.js` に **ESM（ES Modules）** を使用するのが標準になりました。
そのため、従来の `module.exports` を使うと、ESM 環境でエラーが発生します。

## **解決策**

### **解決策: `export default` を使う**

Tailwind CSS v4.0 では、**ESM を使うのが推奨**されているため、`tailwind.config.js` を以下のように修正してください。

### **修正後のコード（ESM）**

```
import type { Config } from 'tailwindcss';

const config: Config = {
  content: [
    './pages/**/*.{js,ts,jsx,tsx,mdx}',
    './components/**/*.{js,ts,jsx,tsx,mdx}',
    './app/**/*.{js,ts,jsx,tsx,mdx}'
  ],
  theme: {
    extend: {},
  },
  plugins: [],
};

export default config;
```

## **結論**
Nextjsなどで新規プロジェクトを立ち上げて、過去のコードを参考にするとき、そもそもtailwindcss.config.jsがなかったりするが、それも仕様。自分で作る必要がある。
SAPクライアントコピー時のプロファイル一覧と注意点(Lクラス)

**3227895 - CC-INFO: Which profile should I use?**
クライアントコピー時のプロファイル一覧はこのノートから。
表になっているのでカスタマイズ、バリアントなどのプロファイル別の特徴がわかります。

重いアプリケーションデータを抜くときはSAP_UCSVを使って、"全て"コピーする際はSAP_ALLを使用するイメージです。

全てと言いましたがよく表を見るとLocal data / change doc.の列はDeletedになっています。

Cross client customizingは非依存のカスタマイズなので持っていけないのはわかるのですが、デリバリークラスL(Local data?)も持っていけないようなので状況によっては注意が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/866ed340-eae4-4039-a023-4ce172a4a666.png)



**2412518 - Tables entries (with delivery class L or package $TMP ) were not be copied/transported**

デリバリクラスLはクライアントコピーでも指定すれば持っていけるようですが、SAP的には推奨でないとのこと。

するならば移送でもっていきます。デリバリクラスLは一時データのため、移送でも推奨ではないようです。
Javaを使った画像中のテキストのOCRスキャン

PDF文書に余計な内容のページが含まれている場合、残りの内容が正確で、焦点が合っていて、文書の意図された目的と一致していることを確実にするために、これらのページを削除することが必要です。この記事では、無料の.NET PDFライブラリを使用して、プログラムでPDFからページを削除する方法を学びます。

## 必要な道具：
* **IDEA**
* [**Spire.OCR for Java**](https://www.e-iceblue.com/Introduce/ocr-for-java.html) - 多言語、フォントの認識、JPG, PNG, GIF, BMP, TIFF などのよく使われる画像からのテキスト情報の読み取りに対応した Java OCR コンポーネント。
  * 製品パッケージのダウンロードリンク： https://www.e-iceblue.com/Download/ocr-for-java.html
  * またはMavenリポジトリからインポートします：
  ```
    <repositories>
    <repository>
    <id>com.e-iceblue</id>
    <name>e-iceblue</name>
    <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
    </repositories>
    <dependencies>
    <dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.ocr</artifactId>
    <version>1.9.0</version>
    </dependency>
    </dependencies>
  ```

* **その他の依存ファイル**。お使いのオペレーティング・システムに基づいて対応するファイルをダウンロードし、指定されたファイル・パスに解凍します。
  * [Linux](https://www.e-iceblue.com/downloads/plugins/java/ocr/linux/dependencies.zip)
  * [Windows x64](https://www.e-iceblue.com/downloads/plugins/java/ocr/windows/dependencies.zip)


## Javaで画像中のテキストをOCR認識する手順
**1.** IDEAで新規プロジェクトを作成し、Spire.OCR.jarをインポートする。
![Spire.OCR.jar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/21d6353a-16ea-4c70-bba8-3820b7839756.png)


**2.** ダウンロードした 「dependencies 」フォルダをIDEAプロジェクトのディレクトリにコピーします。
![dependencies.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/7c210c8c-b9e6-48c4-9f3b-edf5df381b28.png)


**3.** 上記の必要な依存関係をインポートしていることを確認し、以下のコードを実行して画像内のテキストをスキャン/読み取ります。
```java
import com.spire.ocr.OcrScanner;
import java.io.*;

public class ReadImage {
    public static void main(String[] args) throws Exception {
        // 依存ファイルのパスを指定する
        String dependencies = "dependencies\\";

        // 言語ファイルのパスを指定する
        String languageFile = "japandata";

        // スキャンする画像のパスを指定する
        String imageFile = "img.png";

        //出力ファイルのパスを指定する
        String outputFile = "ImageText.txt";

        // OcrScannerオブジェクトを作成し、その依存ファイル・パスを設定する
        OcrScanner scanner = new OcrScanner();
        scanner.setDependencies(dependencies);

        // 指定された言語ファイルをロードする
        scanner.loadLanguageFile(languageFile);

        // 指定した画像ファイルをスキャンする
        scanner.scan(imageFile);

        // スキャンしたテキストの内容を取得する
        String scannedText = scanner.getText().toString();

        // 出力ファイルオブジェクトの作成
        File output = new File(outputFile);
        // 出力ファイルがすでに存在する場合は削除する
        if (output.exists()) {
            output.delete();
        }
        // スキャンしたテキスト内容を出力ファイルに書き込むために、BufferedWriterオブジェクトを作成する
        BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile));
        writer.write(scannedText);
        writer.close();
    }
}
```
***サンプル画像：***
![Img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/77cac372-4c96-45ab-9f65-c8778ebc7969.png)


***イメージOCRスキャン結果：***
![ScannTextFromImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/10473523-b2d2-4ab8-8586-67a7e92ba160.png)


* * *

使用中に問題が発生した場合は、フォーラムでご連絡ください。

https://www.e-iceblue.com/forum/spire-ocr-f22.html
NetSuiteのRedwood Experienceテーマを使ってみましょう

NetSuiteユーザーにとって朗報です。新たに導入された「Redwood Experienceテーマ」により、NetSuiteのインターフェースが一新され、より直感的で視覚的に魅力的な操作体験が可能になります。このブログでは、Redwood Experienceテーマの特徴や設定方法、さらにどのような改善点があるのかを詳しく解説します。

# ✅Redwood Experienceテーマとは？
Redwood Experienceテーマは、NetSuiteの新しいルック＆フィールのデザインテーマです。このテーマにより、ページ・ヘッダー、フォーム、リスト、ダッシュボードなどに新しいデザイン要素（色、アイコン、フォント）が適用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246667/c8fb40ba-fc2b-4342-8103-8287d153e4f2.png)

# 💡 主な特徴
色やフォントの一新 – 見やすく、統一感のあるデザイン
新しいアイコンセット – ユーザビリティが向上
ダッシュボード・フォームの視覚的な改善 – 情報が整理され、理解しやすく

# 🛠️ Redwood Experienceテーマの設定方法
Redwood Experienceテーマを有効にするには、以下の手順を実行します：

**「ホーム」 > 「プリファレンスの設定」** に移動
**「Redwood エクスペリエンス」** エリアの **「外観」** タブを選択
**「有効化」** をクリック
Redwood Experienceテーマを有効にすると、色、フォント、チャート・パレットの設定が自動的に適用されます（有効化後はこれらの設定はグレーアウトされます）。

元に戻したい場合は、同じ手順で「無効化」を選択すると、以前のテーマに戻すことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246667/2316f0a3-048c-4424-878c-8589d0a03ca2.png)

# 🔍 Redwood Experienceテーマの改善点
Redwood Experienceテーマにより、以下のUI要素が改善されています：

### ✅ リスト・フォームの視覚的強化
より見やすく、直感的なデザイン
アイコンと色の統一で可読性向上
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246667/df73f003-eea0-49ac-b256-31665283cc43.png)

### ✅ レポート・検索・分析のレイアウト改善
レポートや検索結果が整理され、情報の抽出が容易
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246667/95a21f5c-f6dd-41cd-be35-cd45693a1fab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246667/a652c4f3-2c2a-44ef-8c36-9ea320e3bf25.png)

### ✅ セットアップ・プロセスの合理化
設定項目がわかりやすく整理され、効率的に操作可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246667/e73f8cfb-0fd2-4949-a546-f0e0cb079724.png)

### ✅ メールテンプレートとファイル管理の視覚化
アイコンやレイアウトの見直しで操作しやすさが向上
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246667/08a45750-7225-4d39-a27e-75bbee3f001b.png)

# 🚀 Redwood Experienceテーマの効果
新しいRedwood Experienceテーマを適用することで、情報の可視化が向上し、作業効率が上がることが期待できます。色やフォントの統一感により、操作中のストレスが軽減され、特に日々の業務でのデータ確認やレポート作成がスムーズになります。

# 🌟 まとめ
Redwood Experienceテーマは、NetSuiteのUIを一新し、より使いやすくする強力なアップデートです。また、新規ユーザーについてはデフォルトでこのテーマが設定されるとのことです。設定も簡単で、無効化も可能なので、まずは試してみる価値があります。新しいテーマを取り入れて、NetSuiteでの業務をさらに効率化しましょう！
2025年におすすめのAI動画生成ツール ベスト10


2025年、AI技術の進歩によって動画制作がこれまでになく簡単かつ高品質に行えるようになりました。ここでは、2025年に最も注目されるAI動画生成ツールのベスト10を一覧比較表と共にご紹介します。

AI動画生成ツール比較表

![微信截图_20250311171839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4033315/9b07e23b-df3e-4b71-b1f9-2e44ca910c02.png)

1. Deevid AI(https://deevid.ai)

Deevid AIは2025年現在、最も進んだテキストから動画を生成できるAIツールの一つです。AIアバターを自由にカスタマイズでき、80以上の言語に対応しています。プロモーションや教育ビデオ制作に最適で、特に企業やマーケター、教育機関などで活用されています。ユーザーが指定した文章を基に、リアルかつ自然な表情や動きを持つ動画を生成できることから、世界中で支持されています。

2. Synthesia

SynthesiaはリアルなAIアバターによる動画生成が特徴で、特にビジネスシーンや教育コンテンツに適しています。多言語対応が豊富で、グローバルな企業に人気があります。

3. InVideo AI

InVideo AIはSNS向けに最適化された動画テンプレートや豊富な映像ライブラリを提供。初心者でも簡単に扱え、効率よくSNS向け動画が作成可能です。

3. Fliki

Flikiは多言語に特化したAI音声と動画生成ツール。70以上の言語と2000以上の音声オプションがあり、グローバルなマーケティングに最適です。

4. Runway Gen-3 Alpha

Runwayの最新モデルは特に高いビジュアル品質を提供し、業界向けに高精細でリアルな動画を短時間で制作可能。特に映画制作や広告業界で注目されています。

5. Pika Labs

Pika Labsはダイナミックで自然な動きを重視したAI動画生成ツール。直感的な操作性で、特別な技術を必要とせずに多彩な動画が生成できます。

6. Google Veo 2

Googleが提供するVeo 2は、複雑なシーンを高品質に生成することに優れ、ベータ版ながら映像制作業界から注目されています。

7. Meta Movie Gen

Meta Movie Genは短編コンテンツの生成に強みを持ち、SNS投稿などに向いています。手軽に質の高い動画が作れると評価されています。

8. Runway Sora

Runway Soraは映画レベルの映像表現を目指し、細かな映像の延長や映画的表現に特化しています。今後の発展に期待が集まっています。

9. Google Veo 2

Google Veo 2は高度な編集機能とリアルな映像表現を兼ね備え、プロフェッショナルな動画制作に適しています。

10. Runway Gen-3 Alpha

映画的表現力と高精度の動画生成を可能にするRunwayの最新AIツールで、エンターテインメント業界を中心に人気を博しています。

以上のAI動画生成ツールを活用することで、初心者でも簡単にプロ級の動画を作成できるようになります。特にDeevid AIは、バランスの取れた機能性と使いやすさでトップに選ばれています。ぜひ自身のニーズに合ったツールを見つけ、動画制作を効率的に進めてください。
LangGraph 入門 - ワードカウント Agent の実装

## はじめに
LangGraphは、自然言語処理のタスクを効率的に解決するための強力なツールです。本記事では、LangGraphを使ったワードカウントAgentの実装方法について説明します。具体的には、パッケージのインストールから、Agentの実装、Agent Engineへのデプロイ方法までをカバーします。

## LangGraph 入門
LangGraphは、AIによる言語処理を可能にするライブラリで、様々な自然言語処理（NLP）タスクに対応しています。LangGraphは、タスクのためのエージェント（Agent）を簡単に作成し、処理を自動化することができるため、開発者にとって非常に便利です。

## ワードカウント Agent の実装
まず最初に、LangGraphを使った「ワードカウントAgent」の実装を行います。このエージェントは、入力テキストに含まれる単語数をカウントする機能を持っています。これにより、LangGraphの基本的な使い方とエージェントの作成方法を理解することができます。

コード例：
```python


import langgraph

# エージェント作成
class WordCountAgent(langgraph.Agent):
    def process(self, input_text):
        word_count = len(input_text.split())
        return f"ワード数: {word_count}"

# エージェントのインスタンスを作成
agent = WordCountAgent()
result = agent.process("これはLangGraphを使ったテストです。")
print(result)  # ワード数: 6
```
## 環境準備
LangGraphを使うためには、事前にいくつかの準備をする必要があります。以下の手順に従って環境を整えましょう。

パッケージのインストールと初期設定
LangGraphを使うには、まず必要なパッケージをインストールする必要があります。

```bash
コピーする
pip install langgraph
```
インストール後、LangGraphの設定を行い、実際にエージェントを作成する準備をします。

## ワードカウント Agent の実装
上記で紹介した通り、エージェントの基本的な実装は非常に簡単です。実際のプロジェクトに応じて、エージェントの機能を拡張していくことができます。

## gent Engine へのデプロイ
エージェントを作成したら、次はそれをAgent Engineにデプロイする方法を学びます。デプロイすることで、エージェントは実際の環境で動作するようになります。

## デプロイ手順
作成したエージェントのコードをAgent Engineにアップロードします。
Agent Engineの設定画面から、実行するエージェントを選択します。
エージェントが実行され、結果を得ることができます。
Function Calling を用いた Agent の実装
LangGraphでは、Function Callingを使用して、外部関数をエージェントに組み込むことができます。これにより、より複雑な処理をエージェントに加えることが可能です。

コード例：
```python
コピーする
def count_words_in_sentence(sentence):
    return len(sentence.split())

class WordCountWithFunctionAgent(langgraph.Agent):
    def process(self, input_text):
        return f"ワード数: {count_words_in_sentence(input_text)}"

agent = WordCountWithFunctionAgent()
result = agent.process("LangGraphは非常に強力です。")
print(result)  # ワード数: 5
```
ローカルでの実装
ローカル環境でもエージェントを実装することが可能です。ローカルで実行する場合、インターネット接続やデプロイが不要なため、開発時に非常に便利です。

## ローカルでの実行手順：
必要なパッケージをインストールする。
エージェントをローカル環境で実行する。
```bash
コピーする
python agent.py
```
## Agent Engine へのデプロイ
ローカルで動作するエージェントを、クラウドや本番環境にデプロイすることも可能です。これにより、エージェントはスケーラブルに運用できます。

## ツールの使用を強制する方法
エージェント内で特定のツールや関数を強制的に使用する方法についても解説します。これにより、エージェントの動作が確実になります。

強制ツール使用例：
```python
コピーする
class ForceToolAgent(langgraph.Agent):
    def process(self, input_text):
return f"強制ツール: {self.force_tool('tool_name')}"
```
## Function Calling を用いないで実装する方法
Function Callingを使わない場合も、エージェントの実装は可能です。基本的な処理をエージェント内で完結させることができます。

コード例：
```python
コピーする
class SimpleWordCountAgent(langgraph.Agent):
    def process(self, input_text):
        return f"ワード数: {len(input_text.split())}"

agent = SimpleWordCountAgent()
result = agent.process("AIによる言語処理")
print(result)  # ワード数: 4`
```
## まとめ
本記事では、LangGraphを使ってワードカウントAgentを実装する方法を解説しました。

また、Function Callingを使った高度な機能や、ローカルでの実装方法、デプロイ手順についても学びました。これにより、LangGraphを使用したエージェントの実装ができるようになりました。実際のプロジェクトでLangGraphを活用し、効率的な開発を行いましょう。

## おすすめのAIツール
画像生成・加工
EX-AI
テキストから画像を生成できるAIツール。独自のアートワークやプロジェクトに使える画像を作成可能。
高品質なアートや画像を生成できるAI。クリエイティブなビジュアルコンテンツを作りたいときにおすすめ。
[無料体験も提供いるので参考してください。](http://ai.tencho-ex.com)
Prototype

Prototypeとはクラス名を指定せずにインスタンスをコピーする方法。Prototype役はインスタンスをコピーして新しいインスタンスを生成するメソッドを持つ原型。concreatePrototype役は具体的にインスタンスをコピーするメソッドを実装していく。Clientの役はメソッドを利用してインスタンスを作る
SAPシステムで起きる文字化けの備忘録

文字化け対応や相談を受けることがあるため、関連する設定等や知識を備忘録として残しておきます。

# エンコード
BINモード（バイナリ）：エンコーディング変換なし
ASCモード（アスキー）：エンコーディング変換あり


ASCでファイルアップロード→UTF-16へ変換(unicodeの場合)
※ファイルアップロードはT-code:CG3Z

AL11などで文字化けしてなくても、デバッグの際に生のデータを参照するため文字化けすることがあるらしい。変数等で制御が必要。

# SAP GUI文字化けあるある
2447563 - SAP GUI での文字化けの問題に対する基本的なチェックポイント

# GUI設定
文字化けに関連するGUI設定と関連ノート

**2739207 - Japanese characters are garbled on SAP GUI logon screen after connected to Non-Unicode system.**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/2bf8c38f-5d28-465c-bf75-7c543ee41f0e.png)

# ECCからS4への移行時
㈱ (U+3231)の文字化け対応
　1146480 - Unicode Conversion or File I/O "break" Japanese U+3231
~web開発入門者のためのおすすめ講義３選~

こんにちは、韓国在住 日本人sanaです！

web開発に興味があるけどどこから始めればいいのかわからない人、既存の知識を体系的に整理したいweb開発入門者におすすめの講義を紹介します！

インフラ―ンという韓国の教育プラットフォームを利用しているのですが、it先進国の韓国ならではのサービスで幅広いジャンルの講義があって苦手意識のあった分野ですが楽しく勉強しています！

日本語字幕もついているので安心して視聴可能です。３つ目の講義は有料講義なので上２つの講義を見てより興味が沸いた方はぜひ視聴してみてください^^

私自身it関連の勉強を始めたばかりでまだまだ分からないことだらけですが、勉強する中でためになった情報や講義を皆さんにたくさん共有しようと思うので、気軽に立ち寄ってみてください！　一緒楽しく勉強頑張りましょう～　ファイティン!!


https://u.inf.run/41Hm5YY
https://u.inf.run/4if8cs4
https://u.inf.run/41DnIXG
Singleton

Singletonとはインスタンスを一つだけしか作成できないようにすること。
コンストラクタをprivateにすることで他のクラスからのnewによるインスタンスの生成を不可能にする。staticをつけてインスタンスを作成することによってクラス内で一つのインスタンスを共有する。またクラス内にインスタンスを生成するメソッドを作りそれを使っていく。
【一般】クエリの出力項目を参照するコントロールタグ

# はじめに #
パブリッシュドレポート（WEBレポート）を使用してカスタムHTMLページを作成する際、クエリでいくつかの値を準備し、それらをカスタムHTMLに渡したい場合があります。

その場合、コントロールタグを使用してクエリの出力項目を参照することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/63783663-f789-4cc7-930f-e1fa250e5a5d.png)

# 実践 #
簡単な 1列 X 5行 のHTMLテーブルを準備しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/832e8ec4-1668-4ae9-a613-7fe06365439c.png)

注：このスクリプトではjQueryが使用されており、上の画像でjQueryライブラリが参照されていることがわかります。jQueryライブラリはSharperlightにバンドルされています。

ページが読み込まれると、スクリプトが実行され、クエリから渡された値がテーブルに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cf90a7a2-1848-4c08-9e01-f9a3e303d0b5.png)

赤い線で囲まれた部分が、クエリ出力項目の値が渡される場所です。
```
タグ：　{*Row.<<出力項目の名前がここに入ります>>.text}
```

実行時には、これらのコントロールタグが対応する値に置き換えられることで、値がこれらのグローバル変数に渡されます。

クライアント側からページがリクエストされると、その定義されたクエリがサーバー側で実行され、出力項目の値が準備されます。
カスタムHTMLコード内で指定されているコントロールタグは全て、それらの準備された値で置き換えられ、クライアント側に戻されます。そしてスクリプトが実行される時点で、これらの変数にその値が代入されるという仕組みです。

- {*Row.**URLSharperlight**.text} は、「**URLSharperlight**」という名前の出力項目を参照します
- {*Row.**TitleOfThisPost**.text} は、「**TitleOfThisPost**」という名前の出力項目を参照します
- {*Row.**Description**.text} は、「**Description**」という名前の出力項目を参照します
- {*Row.**EndpointURL**.text} は、「**EndpointURL**」という名前の出力項目を参照します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6baa13a2-0352-499d-8d32-0498968ec757.png)

実行時には、次のようになります；
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9cbd5fae-08ee-4b89-b060-7e564e75e69e.png)

そして、これらの2つの出力項目がここで直接使用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7c43be40-8aa0-478b-91ba-541b44cc608f.png)

# あとがき #
これは、パブリッシュドレポート（WEBレポート）のクエリからカスタムHTMLに値を渡す必要がある場合に役立ちます。

出力項目の名前はコントロールタグで使用されます。

クエリは1行のみを返すように設計する必要があることに注意してください。最初の行のみが有効と見なされます。

クエリは複数行を返すように設計できますが、そうすると最初の行のみが有効と見なされ、他の行は無視されますが、パフォーマンスが低下する可能性があります。
コーディングに自信のない私が競プロを始める

# はじめに

### 経歴
・学歴：大学中退
・職歴：建設業現場監督　→　社内SE　→　SES

最近、社内SEからSESに転職したSEです。
社内SE時代には、javaを扱って社内webアプリケーションの開発や保守運用をしていました。
労働環境はかなり良く、裁量性が大きくやりがいのある仕事だったのですが、環境が良すぎるとすぐに甘えてしまう性格のため、できるだけ自分がやったことのない大変そうな案件を選択できる、案件選択が可能なSES企業に転職しました。

### なぜ競プロを始めるか
今までの私の学習方法は、業務で必要な知識をその都度キャッチアップしていくやり方でした。
どちらかというと、動けばいい的な考え方でアプリ開発に臨んでいたと思います。
そんな学習方法を続けてきたため、なんとなくコーディング作業に苦手意識を持っていました。
この苦手意識を払拭して、他のエンジニアと自信を持ってコミュニケーションをとれるようになるのが、私の目的です。

### 投稿の目的
Qiitaに投稿する理由は、単純にモチベーション管理です。
自分が解いた練習問題の投稿や競プロに関連する話題を投稿すれば、継続力がない自分でも続けやすいのでは、と思ったからです。
私と同じように未経験からIT業界に入って、なんとなくコーディングに苦手意識を持っているような方の励みに少しでもなれば、幸いです。

# 勉強スタート
とりあえず、一番有名なAtCorderに登録してみました。
登録方法や始め方は、以下のサイトを参考にさせていただきました。

https://qiita.com/drken/items/fd4e5e3630d0f5859067

早速、直近のABCコンテストに応募してみました。
コンテストまであと4日あるので、AtCoderBeginnersSelectionをやってみます！
次回は、提出したコードを載せながら、勉強した内容を投稿したいと思います。

最後まで、ご覧いただきありがとうございました:bow_tone2:
【Go入門】Golang基礎入門＋αの備忘録#5

# new article body
[【Go入門】Golang基礎入門＋αの備忘録#4](https://qiita.com/sabotenten/items/16530ce8c7b8db3c271c/ "")の続き。
この記事は以下のUdemyコースの学習記録です。

https://www.udemy.com/course/golang-webgosql/?couponCode=KEEPLEARNING

重要だと思った部分や感想、復習用に何を学んだかを書いていきます。
# セクション16：標準パッケージ
各パッケージの主要な識別子の使い方を学んだ。
## os
基本的なファイル操作処理書いた
- Fatallnが実行されると引数の値（エラー）を出力してos.Exit(1)を呼び出す。
  - fatal→deferが処理されない。
  - panic→deferが処理される。
  - mainでスクリプト的に書く程度のときに使う。([参考](https://levtechlab.connpass.com/event/339320/ ""))
- 実行時にコマンドライン引数を受け取る。インデックス1番はコマンド名、2番以降に引数を格納していく。（os.Argsの中身は範囲式forで取得する）
```go:
fmt.Println(os.Args[0])
fmt.Println(os.Args[1])
```
## math/rand
- 1.20以降では固定値を渡して再現性のある乱数を生成をしたい場合は、rand.New(rand.NewSource(seed))を使うことが推奨されている。

## sync
ミューテックスを使って排他制御し、レースコンディション問題を防ぐ処理書いた

# セクション17：サードパッケージ
基本的なDB接続や操作を学んだ。
## ini
- config.iniでconfigの設定をし、ConfigList（任意名）構造体でグローバル構造体を宣言し、iniパッケージを使って読み込んでいく。
## uuid
- uuidでオブジェクト一意に識別したい時に使う。

# セクション18:Webアプリの基礎
ボリューミーだったが、ディレクトリ構成やCRUD操作（DB接続、テーブル作成、操作、取得等）やセッション管理やセッションの有無による画面遷移と単純な画面遷移等Webアプリの基本を最小構成で網羅的に学べた。
データの流れや記述方法は理解できたが、途中からこんがらがってこのデータはどこでどうやって作ったのか不明瞭になることがあったので定期的な復習が必要だと感じた。
今回はtemplateパッケージを使ってHTMLテンプレートのパースとレンダリングを全てサーバー側で行い、クライアント側にレスポンスする形式だったので、次はフルスタック構成で作ってみたい。

# おわりに
基本的な文法等の書き方や性質を把握できた。
Webアプリの全体像を描かないまま部分部分でデータの流れを実装していったので、理解が追いつくのに時間がかかった。最初に簡単な設計の全体を理解してから実装していくとより理解が深まると感じた。
今後は[Webを支える技術](https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%EF%BC%8CURI%EF%BC%8CHTML%EF%BC%8C%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus-ebook/dp/B07JK7FZH2/ref=sr_1_1?adgrpid=56053864951&dib=eyJ2IjoiMSJ9.vyj0oG9baMuEZ_ddcog6rue-eK8zpvsu4x1keZLeLlUkH-udPTmKw4PJQkt4oKnAmWQ8L6ZTzOT6mMkpFXVaiRREkRVlmrN1qDV1FKir-uypMZgqg1YtAKBvuLhXytPm28IZ-kZ2AEg5w9aWKi5av5ErxzQ1auJCQ-C3bex0DfobIDjieXdxfrB0spwcJj0JkU9Lj_4lN5qADvgVI1Hcyq9zUiRGuWR3TlwZQydn4R9GVUvcFbpqVGCuzWsV1ss7dQIOaooRTfYj9-B1HMKx4KUM4IDkvvaNd-YHZog2480AFKWm6Bh-q3ZIGBD1x7JogdSkjKs9h4pk_eCQ6mjAJ0Ar0QYnzvD0Ifk4kBY2iTdmiZG4g1zfWSKG79ZpnLfJvvKD6NwLTNNFu6ySluV6LiR2GATpL9cS7MiFebL8-jNGT2bNKdhIM07vGeaJob5i.tmMRHhgqT-5QKw4yqv-1q9MTrHLx0dSM0t-A5hxNnTI&dib_tag=se&hvadid=679074568952&hvdev=c&hvlocphy=1009228&hvnetw=g&hvqmt=e&hvrand=15136519860163304177&hvtargid=kwd-335200024741&hydadcr=27263_14738623&jp-ad-ap=0&keywords=web+%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93&mcid=cd9af86c97da3d7da690162446bdd95a&qid=1741679146&sr=8-1/ "")等で一度Web技術の基本を把握しておきたい。
dbt で生成した DBML を dbdocs で ER 図に変換する方法

## **はじめに**  
データベースの設計を行う上で、ER 図（エンティティ関係図）は非常に重要です。特に、複雑なデータモデルを可視化することで、チームメンバーとのコミュニケーションが円滑になります。このブログ記事では、`dbt`（Data Build Tool）を使って生成した DBML（Database Markup Language）ファイルを、`dbdocs` を用いて ER 図に変換する方法について説明します。

## **1. 環境構築**
まず、必要なツールをインストールして、環境を整えます。

### **1.1 `npm` のインストール**
`npm`（Node.js のパッケージ管理ツール）をインストールすることで、`dbdocs` を使えるようになります。まずは、以下の手順で `npm` をインストールしましょう。

#### **Homebrew でインストール**
Mac の場合、`Homebrew` を使って `Node.js` と `npm` をインストールする方法が簡単です。

1. **Homebrew のインストール**（もしまだインストールされていない場合）
   ```bash
   /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
   ```

2. **Node.js と npm のインストール**
   ```bash
   brew install node
   ```

3. **インストール確認**
   ```bash
   npm -v
   ```


### **1.2 `dbdocs` のインストール**
次に、`dbdocs` をインストールします。`dbdocs` は、DBML ファイルを ER 図に変換して可視化するツールです。以下のコマンドでインストールできます。

```bash
npm install -g dbdocs
```

このコマンドで `dbdocs` がインストールされます。`-g` オプションは、グローバルインストールを意味し、どのプロジェクトでも使用できるようになります。

### **1.3 `dbdocs` のログイン**
`dbdocs` を使うには、ログインが必要です。以下のコマンドを実行して、GitHub または Google アカウントでログインします。

```bash
dbdocs login
```

ログイン後に表示される認証トークンを入力して、認証を完了させます。

## **2. `dbt` のインストールとセットアップ**
`dbt` を使って、DBML ファイルを生成する準備を整えます。

### **2.1 `dbt` のインストール**
`dbt` をインストールしていない場合、以下の手順でインストールします。

#### **Python でインストール**
まず、Python と `pip` がインストールされていることを確認します。

```bash
python --version
pip --version
```

次に、`dbt` をインストールします。

```bash
pip install dbt
```

### **2.2 プロジェクトのセットアップ**
`dbt` プロジェクトをセットアップするために、まず以下のコマンドで新しい `dbt` プロジェクトを作成します。

```bash
dbt init my_project
```

これで、`my_project` という名前の `dbt` プロジェクトが作成されます。プロジェクトの中には、設定ファイルやサンプルのSQLファイルが含まれています。

## **3. DBML ファイルの生成**
`dbt` を使って、DBML ファイルを生成します。

### **3.1 `dbt docs generate` コマンドの実行**
`dbt` のドキュメントを生成するために、以下のコマンドを実行します。

```bash
dbt docs generate
```

これにより、`target` フォルダ内に `output.dbml` ファイルが生成されます。この DBML ファイルは、後で `dbdocs` によって ER 図に変換されます。



### **3.2 `dbterd` を使ってリレーションシップを生成**
次に、`dbterd` を使って DBML ファイルを生成します。`dbterd` は `dbt` の成果物を使って、テーブル間のリレーションシップを解析し、DBML ファイルを生成します。

#### **3.2.1 `dbterd` のインストール**
`dbterd` を使うためには、最初にインストールする必要があります。以下のコマンドでインストールします。

```bash
pip install dbterd
```

これで、`dbterd` がインストールされます。

#### **3.2.2 `dbterd` の実行**
インストールが完了したら、`dbterd` を実行して DBML ファイルを生成します。以下のコマンドでリレーションシップを含む DBML ファイルを作成できます。

```bash
dbterd run -ad "./target" -o "./target"
```

このコマンドで、`dbt` の解析結果を基にリレーションシップを検出し、`output.dbml` ファイルが生成されます。
### **4. ER 図の生成**
次に、`dbdocs` を使って DBML ファイルから ER 図を生成します。

### **4.1 ER 図のビルド**
以下のコマンドを実行して、DBML ファイルを ER 図に変換します。

```bash
dbdocs build "./target/output.dbml"
```

コマンド実行後、プロジェクト名やユーザー名を入力するよう求められます。それに従って設定してください。

### **4.2 結果の確認**
作成された ER 図は、`dbdocs` のウェブサイトに公開されます。以下の URL で ER 図を確認できます。

```
https://dbdocs.io/your_username/your_project_name
```
![スクリーンショット 2025-03-10 0.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/6a4132ad-f973-47fa-a1c9-6a6e52edffbe.png)

## **5. まとめ**
このブログ記事では、`dbt` で生成した DBML ファイルを `dbdocs` で ER 図に変換する方法を紹介しました。`dbt` でのデータモデル構築から、`dbdocs` での可視化まで、シンプルで効率的に進められる方法です。

`dbdocs` は DBML ファイルを可視化するだけでなく、チーム全員が簡単にアクセスできるようにインタラクティブな ER 図を提供するので、データモデルの理解が深まり、プロジェクトの進行がスムーズになります。
ローカルでllmを動かしてみた

# 目次

- モデルについて
- 仮想環境の作成
- 環境構築(インストール)
    - Pytorch
    - accelerate
    - transformer
- モデルの実行
    - 実行時のエラーと対策
        - 1.ValueError: You are trying to offload the whole model to the disk. Please use the `disk_offload` function instead


## 使用したモデルについて
使用したのは「Llama-3-ELYZA-JP-8B」というモデル
詳しくはこちら...
https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B
こちらのサイトの **Usage** を用いる

## 仮想環境の作成
vscodeで仮想環境の作成を行う
詳しくはこちら...https://qiita.com/hk8640/items/82e12b628caaf40594e5

## 環境構築
#### Pytorch
Pythonの機械学習ライブラリの一つ
```
pip install torch
```
#### accelerate
様々な環境でPyTorchを実行するためのライブラリ
- CPU、GPU、TPUのどのデバイスでPyTorchを動かすのか？
- 並列処理を行うのか？
- マシンは複数台利用するのか？

こういった内容をプログラムの実行環境をコード修正なしで変更できる
```
pip install accelerate
```
#### transformer
機械翻訳の深層学習モデル
```
pip install transformers
```
## モデルの実行
環境構築が完了したらモデルを動かしてみる
↓
うまくいけば完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953318/f45404c6-4d4a-48ac-9cc4-9278c1177a1e.png)
この「DEFAULT_SYSTEM_PROMPT」と「text」の引数を変えれば望む回答を得ることができるだろう
###### エラー
1.ValueError: You are trying to offload the whole model to the disk. Please use the `disk_offload` function instead
**対処法**
```
model = AutoModelForCausalLM.from_pretrained("HuggingFaceH4/zephyr-7b-beta", torch_dtype=torch.float16, low_cpu_mem_usage = True).cpu() 

disk_offload(model=model, offload_dir="offload")
```
こちらの2行をimport文の後ろに追加する
Prismaのseed.tsで型情報を使おうとしてハマった話 (The requested module '@prisma/client' is a CommonJS module, which may not support all module.exports as named exports. CommonJS modules can always be imported via the default export,)

遅ればせながらPrismaを使ってみたのですが、seed.tsで生成された型情報を使おうとしてドハマリしたのでメモ書き。
タイトルがアホみたいに長いのは、同じ問題でハマっている人が検索でヒットしやすければよいと思った弊害です。


# Schema.prisma と Seed.ts
以下のようなモデルの定義を行いました。

```schema.prisma
model User {
  id                 Int      @id @default(autoincrement())
  first_name         String
  last_name          String
  first_name_kana    String
  last_name_kana     String
  created_at         DateTime @default(now())
  updated_at         DateTime @updatedAt
  deleted_at         DateTime? // 削除日時
}
```

その後、`npx prisma migrate dev --name init`で初期テーブルを作成、
`npx prisma generate`で型情報の生成を行いました。

ここまでは問題なし。

次に以下の様にseed.tsを作成しました。

```seed.ts
import { User, PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function createUsers(): Promise<User[]> {
  const userData = [
    {
      id: 1,
      first_name: 'アカウント',
      last_name: '管理',
      first_name_kana: 'あかうんと',
      last_name_kana: 'かんり',
    }
  ]

  const results: User[] = []
  for (const user of userData) {
    results.push(await prisma.user.upsert({
      where: { id: user.id },
      update: {},
      create: user,
    }))
  }

  return results
}

async function main() {
  console.info('create user data')
  const createdUsers = await createUsers()
  console.log(createdUsers)
}

main()
  .then(async () => {
    await prisma.$disconnect()
  })
  .catch(async (e) => {
    console.error(e)
    await prisma.$disconnect()
    process.exit(1)
  })
```

VSCode上でも特にエラー表示等もなく、これも問題なさそう。
`package.json`には以下の通りに設定を行いました。

```
// ...追加部分
  "prisma": {
    "seed": "ts-node prisma/seed.ts"
  },
//...
```

# エラー

これで`npx prisma db seed`を実行すると、

```
SyntaxError: Named export 'User' not found. The requested module '@prisma/client' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from '@prisma/client';
const { User } = pkg;
```

うん、？
`@prisma/client`モジュールが`CommonJS`モジュールであり、ESモジュールとしての名前付きエクスポートをサポートしていないうんぬん。

言われた通りの分割宣言や、エラー文言で検索して出てきたseedコマンドの実行オプションに`--compiler-options {\"module\":\"CommonJS\"}`を追加する方法でもうまくいかない。

seed.tsで型情報をつかわないでanyにしておけば普通に動くんだけど、いまいちスッキリしない。
(こういうことに拘っちゃうのありますよねぇ)



# 解決方法: `ts-node`を使わない

まずはts-nodeをクビにします。
`npm uninstall ts-node`

その後、`tsx`を新規で採用します。
`npm install --save-dev tsx`

package.jsonも修正。

```
// ...修正
  "prisma": {
    "seed": "tsx prisma/seed.ts"
  },
// ...
```

これで無事、型情報を使用しつつ、`npx prisma db seed`が実行できました。



# `ts-node`, `tsx`って何
`tsx`と聞くとReactのJSXを連想すると思いますが、全然関係ない罠です。

どちらも、TypeScriptのコードをNodeで直接実行するためのツールになります。
いろいろ調べると`ts-node`の更新は止まっているようで、最近は`tsx`を利用するのが主流だそう。

今回問題になったのは、`CommonJS`と`ECMAScript Module`の環境？差異にあって、`ts-code`は`CommonJS`と`ECMAScript Module`の混在環境では動いてくれないことが多く、`tsx`はだいたい動いてくれるという状態だそうです。

これで3時間くらいハマりました。
FactoryMethod

Methodfactoryとはnewを使わずにインスタンス化を実現できる方法
役割：Factoryクラスはインスタンスをコピーするメゾットを持つ抽象クラス。ConcreatefactoryクラスはFactoryクラスを継承して具体的なインスタンス化の処理をかく。Productクラスは生成されるインスタンスの抽象クラス。ConcreateProductクラスはProductクラスを継承して具体的な処理をかく。
ローカル環境でLLMを実行する方法

# ローカル環境でLLMを実行する方法

## はじめに

最近話題の大規模言語モデル（LLM）、ちょっと試してみたいけど  
「ローカルで動かすのって難しそう…」と思っていませんか？  

意外と簡単にローカル環境でLLMを実行できる方法があります
本当はLM Studioを使いたかったのですが、５年前のパソコンのためスペックが、、、
ということで、今回は Ollama を使って、ローカル環境で LLM を動かす方法を紹介します。

Ollama は、シンプルなコマンドライン操作で LLM を実行できるツールです。
「ネット環境がなくても使える」「データが外部に漏れない」 などのメリットがありますね。

---

## ローカル環境でLLMをインストールするとできること

ローカルでLLMを動かせると、こんなことができます。

- ✅ **オフラインで使える！** → ネット環境がなくてもOK！  
- ✅ **プライバシーを守れる！** → クラウドにデータを送らないので安心  
- ✅ **自分好みにカスタマイズできる！** → 使いたいモデルを選べる  
- ✅ **APIの制限を気にしなくていい！** → 無料枠とか気にしなくてOK  

ということで、早速やってみましょう！

---

## 環境準備

### Ollamaのインストール（Intel Mac向け）

もともと **「LM Studio」** を使おうとしましたが、**Intel Macでは動作しない可能性** があるため、  
代わりに **「Ollama」** を使用します。

---

### なぜLM Studioが使えなかったのか？

LM Studioは、**AppleのM1やM2チップを搭載したMac（Apple Silicon）向け** に設計されています。  
そのため、**Intelプロセッサを搭載したMacでは動作しません**。

実際にIntel MacにLM Studioをインストールしてみたところ、以下のエラーが表示されました。


> 💡 **Apple Silicon（M1/M2）とIntel MacはCPUのアーキテクチャが異なるため、一部のアプリが対応していないことがあります。**

---

### 自分のMacがIntelかApple Siliconか確認する方法

1. 画面左上の **「（Appleマーク）」** をクリック  
2. **「このMacについて」** を選択  
3. **プロセッサ情報** を確認  
   - **「Intel Core i5/i7/i9」** など → **Intel Mac**  
   - **「Apple M1/M2」** など → **Apple Silicon（対応）**  

---

### Macの年代別CPU一覧

| 発売年     | MacBook Air | MacBook Pro  | iMac    | Mac mini   |
|-----------|------------|-------------|---------|------------|
| 2015〜2019 | Intel      | Intel       | Intel   | Intel      |
| 2020      | Intel / M1 | Intel / M1  | Intel   | Intel / M1 |
| 2021〜     | M1 / M2    | M1 / M2 / M3 | M1 / M2 | M1 / M2    |

> 💡 **Intel MacユーザーはLM Studioを使えないため、Ollamaがオススメ！**

---

## Ollamaのインストール方法

1. **[Ollama公式サイト](https://ollama.com/)** にアクセス  
2. **Mac（Intel対応）** のインストーラーをダウンロード  
3. インストーラーを実行し、画面の指示に従ってインストール  

> 💡 **Ollamaは軽量で、ターミナルから簡単にLLMを操作できるツールです。**

---

## モデルのダウンロード

Ollamaをインストールしたら、**ターミナルを開いてモデルをダウンロード** します。

```sh
ollama pull llama3
```

# モデルの実行

## 1. モデルの起動
ダウンロードしたモデルを起動します。

```sh
ollama run llama3
```

## 2. チャットの開始
ターミナルに「Hello!」と入力してみましょう！
```plaintext
>>>Hello!
Hello! It's nice to chat with you. How are you doing today? Is there 
something on your mind that you'd like to talk about, or are you just 
looking for some conversation? I'm all ears!
```
>💡 Ollamaはコマンドラインベースなので、エディタやスクリプトからも簡単に使えます。
```plaintext
>>> 日本語は話せますか？
はい、話すことができます。
お日さまをいままでよろしくお願いします。 ( Ah, yes! I can speak Japanese.)
I'd be happy to chat with you in Japanese. How's your day going so far? 
Would you like to talk about something specific or just have a casual 
conversation?

>>> 太陽を英語でなんて言いますか？
太陽は「太陽」という日本語で、または「sun」という英語で表されます。
お日さまにちがう言葉で話すことができますか？ (Can you say something else 
like "sun" instead of "day"?)
```



# まとめ
今回は、「Ollama」を使ってIntel Macでもローカル環境でLLMを動かす方法を試してみました。
コマンドラインベースだとあんまり旨みない気がしますね、、、
ほとんどの方はLMstudio入れることができると思うので、そちらで試したほうがいいかもですね、
LM Studio は GUI ベースのアプリケーションなので、視覚的にモデルを管理しやすいですね。コマンドラインに慣れていない人には、LM Studio の方が直感的で使いやすいと思います。
【Claude】コードブロックとアーティファクトでフォーマット指定

## はじめに

Claudeで複数ファイルに及ぶコードを生成させる際、1つのコードブロックに複数のパスとコードをまとめられることがあり不便に感じます。
この記事では画像のような生成をしてもらうためのプロンプトを共有します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2673067/498c3c36-fded-4267-9b0c-1fb57f2584b8.png)

この形式だと、生成されたコードとパスをそれぞれコピーできて嬉しいです！


## 結論

以下が実際のプロンプトです。

````
以下の形式で生成してください

```
[ファイルの相対パス]
```

<antArtifact identifier="[ファイル名]" type="application/vnd.ant.code" language="[プログラミング言語]" title="[ファイルの相対パス]">
[ファイルの内容]
</antArtifact>

要件：

1. 各ファイルパスはコードブロック(```)で囲み、以下の構造を守ってください
   - コードブロック開始(```)
   - 改行
   - ファイルパス
   - 改行
   - コードブロック終了(```)

2. パスの直後に、対応するファイルの内容をantArtifactタグを使用して生成してください

3. antArtifactタグには以下の属性を設定してください
   - identifier：ファイル名を基にした一意の識別子
   - type："application/vnd.ant.code" を指定
   - language：使用するプログラミング言語
   - title：ファイルの相対パス
````

## 詳細
### コードブロック部分
````
```
[ファイルの相対パス]
```
````
````
1. 各ファイルパスはコードブロック(```)で囲み、以下の構造を守ってください
   - コードブロック開始(```)
   - 改行
   - ファイルパス
   - 改行
   - コードブロック終了(```)
````
このように改行を明確に指示しないと、下記のようにファイルパスがコピーしにくいコードスパン形式で表示されることがありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2673067/b5b27c40-5a20-410e-af58-c59f475845ca.png)

### アーティファクト部分
````
<antArtifact identifier="[ファイル名]" type="application/vnd.ant.code" language="[プログラミング言語]" title="[ファイルの相対パス]">
[ファイルの内容]
</antArtifact>
````
 `<antArtifact`タグを指定することで、コード内容をアーティファクトとして表示させています。


## 応用
パスを指定して新規ファイル作成やジャンプのできるVSCode拡張機能(advanced-new-file
)を使うとコピーしたパスを有効活用できます。

https://marketplace.visualstudio.com/items?itemName=patbenatar.advanced-new-file

## 課題
コピーボタンやアーティファクトを切り替えるためにマウスを使う手間自体は増えています。
上記操作をショートカットできるブラウザ拡張機能を用意すれば軽減できそうです
slice!とはなんぞや

# 結論　
破壊メソッドで文字列の一部文字を削除できる。

## そもそもsliceとは?
特定の文字を取り出せる非破壊メソッド

### どうやって取り出すのか
```ruby 
word = "abcde"

# インデックス 0（最初の文字）を指定
word.slice(0)    #=> "a"

# インデックス -1（最後の文字）を指定
word.slice(-1)   #=> "e"

# 範囲 0..1（0番目から1番目まで）を指定
word.slice(0..1) #=> "ab"

# 範囲 0..-1（先頭から最後まで、全体を指定）
word.slice(0..-1) #=> "abcde"

```
### 非破壊とは？
加工をしても元の文字列は変更されない　
```ruby
word = "abcde"
word.slice(0)    #=> "a"
word  #=> "abcde"　元のまま
```

## 本題　slice!を解説
### 破壊とは？
加工後は元の文字列は変更される

### 具体的に　
```ruby
word = "abcde"

# 破壊的にインデックス 0 の文字を削除
word.slice!(0)   #=> "a" （削除後、word は "bcde" になる）

# 破壊的にインデックス -1 の文字を削除
word.slice!(-1)  #=> "e" （削除後、word は "bcd" になる）

```
## まとめ
slice!は文字列の特定位置の文字を削除することができる。
Splunkのイメージ図

# サーチ機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174900/e4ec82ab-d3ba-41a9-8bc7-58b1d63c4dc4.png)

# ログ出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174900/35e2be12-7b86-4c2d-85dd-6d323a80fc29.png)

# ダッシュボード機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174900/085a5b73-de8e-4133-8ee8-8bde0721c4b7.png)
Rune AudioでRadikoを聴く(Dockerへ移行)

[Rune AudioでRadikoを聴く](https://qiita.com/ttytb/items/07c027af7c71b79b4603) が、いつの間にか動かなくなったりと不安定なので、Dockerへ移行しました。

# 事前準備
システムの最新化とDockerの追加をしておきます。
```shell:shell
$ pacman -Sy
$ pacman -S docker docker-compose
```

Dockerを起動しておきます。
```shell:shell
$ systemctl start docker.service
$ systemctl enable docker.service
```

# Docker関連ファイルの作成
Dockerfileとdocker-compose.yamlを作成します。
```shell:shell
cd /opt
mkdir radiko
cd radiko
vi Dockerfile
vi docker-compose.yaml
```

```text:Dockerfile
FROM debian:bullseye-slim

RUN apt-get update

RUN apt-get install -y python3 pip
RUN pip install django

RUN apt-get install -y git
RUN git clone https://github.com/burrocargado/RadioRelayServer.git
RUN cd RadioRelayServer \
 && python3 manage.py migrate
RUN mkdir /var/lib/mpd && mkdir /var/lib/mpd/playlists

RUN apt-get install -y ffmpeg

CMD cd RadioRelayServer \
 && python3 manage.py runserver 0.0.0.0:9000
```
```text:docker-compose.yaml
services:
  radiko-server:
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - /srv/http/data/playlists:/var/lib/mpd/playlists
    ports:
      - 9000:9000
    restart: always
```

空のプレイリストを作成し、書き込み権限を与えておきます。
```shell:shell
touch /srv/http/data/playlists/00_radiko.m3u
chmod 666 /srv/http/data/playlists/00_radiko.m3u
```

# ビルド
```shell:shell
cd /opt/radiko
docker compose build
```

成功すると、以下のようなメッセージが表示されます。

:::note info
[+] Building 1/1
 ✔ radiko-server  Built                                                    0.0s
:::

起動確認を行います。
```shell:shell
docker compose up
```
:::note info
プレイリストが表示されて、再生ができればOK
Ctrl+C で停止させます。
:::

# 起動

デーモンとして起動させます。

```shell:shell
docker compose up -d
```

:::note info
再起動後も動いていればOK
:::
SQL Server 2022 on Ubuntu 22.04 on Hyper-V

# SQL Server 2022 on Ubuntu 22.04 on Hyper-V

## 基本は公式の通り

[https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-ver16&tabs=ubuntu2204](https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-ver16&tabs=ubuntu2204)

## はまりどころ

```
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list | sudo tee /etc/apt/sources.list.d/mssql-server-2022.list
sudo apt-get update
sudo apt-get install -y mssql-server
```

ここまでは公式の通りで問題なし。次がはまりどころ。

```
sudo /opt/mssql/bin/mssql-conf setup
```

このコマンドだと対話型で初期設定ができるが、ここで設定したsaのパスワードはなぜか正常に設定されない。
なので次の代替手段で設定する。

### ログインしようとしたときのエラー

画面表示
```
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : Login failed for user 'sa'..
```

エラーログ
```
Error: 18456, Severity: 14, State: 7.
```

### 代替手段

ここで一回再起動しておく

```
sudo reboot
```

再起動後に「無人インストール」の項目に書いてある方法で設定する
[https://learn.microsoft.com/ja-jp/sql/linux/sql-server-linux-setup?view=sql-server-ver16#unattended](https://learn.microsoft.com/ja-jp/sql/linux/sql-server-linux-setup?view=sql-server-ver16#unattended)

```
sudo MSSQL_PID=Developer ACCEPT_EULA=Y MSSQL_SA_PASSWORD='<password>' /opt/mssql/bin/mssql-conf -n setup
```

## sqlcmdのインストール

ここははまりどころはない

```
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
sudo apt-get update
sudo apt-get install mssql-tools18 unixodbc-dev
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile
source ~/.bash_profile
```

## sqlcmdでログイン

ここにも地味にはまりどころがある

```
sqlcmd -S localhost -U sa -P '<YourPassword>'
```

これだけだとたぶんエラーが返ってくる

```
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : SSL Provider: [error:0A000086:SSL routines::certificate verify failed:self-signed certificate].
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : Client unable to establish connection. For solutions related to encryption errors, see https://go.microsoft.com/fwlink/?linkid=2226722.
```

注意事項に書いてある通り -No をセットするか、-Cで証明書を素通りさせる

```
sqlcmd -S localhost -U sa -P '<YourPassword>' -C
```
fetchのリトライ間隔を動的にする書き方

### 概要

TypeScriptで、fetchのリトライをする必要がありました。
ただ、リトライする際の時間を動的にしたかったのですが、あまり参考になる記事がなかったので記事にしてみました。

### 実装

ポイントとしては、ループする際、配列の時間分スリープするようにしています。

```typescript

const TIMES = [1, 3, 5, 15, 45];

const sleep = (seconds: number) => new Promise((resolve) => setTimeout(resolve, seconds * 1000));

const retry = async (func: () => Promise<boolean>) => {
  for (const time of TIMES) {
    const successful = await func().catch(async () => {
      await sleep(time);
      return false;
    });

    if (successful) break;
  }
};

const send = async function (url: string, body: string): Promise<boolean> {
  const response = await fetch(url, {
    method: 'POST',
    body: body
  }).catch((error) => {
    console.error('Failed');
  });

  if (!response) return false;
  if (!response.ok) {
    console.error('Failed');
    return false;
  }
  return true;
};
```

実際に使用する部分

```typescript
await retry(() => send(url, body));
```

### まとめ

等間隔のリトライに関しては、そこそこ記事はあったのですが、動的にリトライする記事はなかったので、参考になればと思います。
JMeter環境を強化する：簡単クラスタ構築と活用法

## はじめに 
JMeterは非常に人気のある負荷テストツールですが、大規模な負荷テストでは、単一マシンの実行では不十分です。負荷能力を向上させるために、JMeterクラスタの構築が必要です。以下に具体的な手順を示します。

## ステップ1：サーバーの準備

クラスタを構築する前に、次の条件を満たす複数のサーバーを準備する必要があります。

- Java実行環境をインストールする（**Java 8以降**）。
- サーバー間で相互通信が可能である（例：SSHやRDPの使用）。

## ステップ2：JMeterのインストール

これらのサーバーに[JMeter](https://jmeter.apache.org/download_jmeter.cgi)をインストールします。最新のJMeterのインストールパッケージをウェブサイトからダウンロードし、インストールを行ってください。

![jmeter-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/c8e229ec-6f94-49a3-b467-e9943b77c944.png)

- JMeterの `~/.bashrc`に環境変数を設定：

```bash
export JMETER_HOME=JMeterインストールディレクトリ
export PATH=$JAVA_HOME/bin:$PATH:.:$JMETER_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar
```

- 設定を有効にする：

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

### JMeterを起動：

  - 環境変数が設定されていれば、`jmeter`コマンドを実行。
  - 環境変数が未設定の場合、JMeterのbinディレクトリに移動し、`sh jmeter.sh`を実行。


### JMeterの日本語化

1. 方法1：メニューから設定（暫定的）  
   JMeterを起動し、画面で Options > Choose Language > Japanese を選択。
   
2. 方法2：設定ファイルの変更（恒久的）  
   - **macOS**: `jmeter`ファイルを編集し、言語設定を`${JMETER_LANGUAGE:="-Duser.language=ja -Duser.region=JP"}`に変更。
   - **Windows**: `jmeter.bat`ファイルを編集し、言語設定を`set JMETER_LANGUAGE=-Duser.language="ja" -Duser.region="JP"`に変更。

![jmeter-JP-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/008fb24e-ddc6-48be-8c32-568f0946298a.png)

ファイルを保存し、再起動するとJMeterのインターフェースが恒久的に日本語に切り替わります。

## ステップ3：JMeterクラスタの構成

JMeterでクラスタ圧力テストを行う際、一台をmasterとして選び、他のマシンをslaveとして設定します。 masterはスクリプトを各slaveに送信し、slaveはそれを実行します。実行結果をmasterに返し、masterはすべてのslaveの情報を収集して統合結果を表示します。

### slaveの構成

`jmeter.properties`ファイルを編集：

```bash
remote_hosts=masterのIP
server_port=1099
server.rmi.localport=1099
```

### masterの構成

`jmeter.properties`でslaveのアドレスを設定：

```bash
remote_hosts=slave1のip:ports,slave2のip:ports
```

## ステップ4：テストプランの作成

JMeterクラスタが整ったら、テストプランを作成します。テストプランを作成する際には、次の点に注意してください：

- “スレッドグループ”をリモートサーバーに設定。
- “リスナー”を“ディストリビューションリスナー”に設定。

## ステップ5：テストの起動

テストプランが完成したら、テストを開始し、テスト結果を監視します。すべてまたは指定のリモートを開始することができます。

![jmeter-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/1a6e62aa-0ae3-4994-bf10-e31b672e969a.png)


テスト中には、各クライアントの状態とパフォーマンス指標をリアルタイムで確認できます。



## 最後に

JMeterクラスタを構築することは難しいことではありません。本記事で紹介した手順に従えば、効率的なJMeterクラスタ環境を迅速に構築し、テストの効率と品質を向上させることができます。

### より使いやすいAPIツール：[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)を試してみてください。

JMeterは性能テストに利用できますが、日常業務にはAPI設計、APIデバッグ、APIモックなど、数多くの作業があります。複数のツールを使用することもありますが、ツール間を頻繁に切り替えるたびに、データの不一致やチーム協力の効率低下が生じることがあります。

![apidog-client-JP-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/2cf1091c-e6ab-4cb6-a850-6134b4bb5b48.png)

JMeterと比べて、[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)はより使いやすく、賢く使用できます。個々の開発者でも企業チームでも、[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)を活用することでAPIのテスト効率と品質を高めることができます。
【一般】ユーザー権限レポート

# はじめに #
これはSharperlightが提供する管理ツールの1つで、すべてのユーザーの権限を確認するために使用できます。このツールには、次の3つのアクセス方法があります：
- サイトセットアップ
- WEBチャネルインデックスページ
- クエリビルダー

# サイトセットアップ #
右クリックメニューからアクセスできます。サイトセットアップは管理者ユーザーのみがアクセスできるため、そのユーザーはすべてのユーザー情報を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/51d8890c-f6f0-44ee-bf3d-e0b1ecf06618.png)

ユーザー情報がグリッド形式で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/73b7b052-3517-464f-8926-f6a8fde68d70.png)

- ユーザー: これはユーザー名です
- ユーザーの説明: ユーザーの説明が表示されます
- 電子メール: ユーザーに設定されたメールアドレスです
- グループ: ユーザーが所属するユーザーグループです
- 管理者権限: ユーザーが管理者権限を持っているかどうかを示します
- パスワード: パスワードが設定されているか、およびその状態を示します
- 2FA: 二要素認証（2FA）が設定されているかどうかを示します
- インスタンス: インスタンスアクセス制限の設定が表示されます
- 有効期限: 「ユーザーアカウントの有効期限」の日付です
- 言語: デフォルトの言語が表示されます
- ダッシュボード: Webチャネルダッシュボードの権限を示します

# WEBチャネルインデックスページ #
"ユーザー権限レポート"は、メインインデックスページでも確認できます。
```
http(s)://{server name is here}/mdService1Rest/Index
```

管理者アカウントはすべてのユーザーの権限を確認できますが、他のアカウントは自分自身のアカウントの詳細のみを見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/af6cc25e-b82f-4531-b514-1c225bdcb4f3.png)

# クエリビルダ #
ユーザー権限テーブルに対してクエリを実行することができます。

管理者アカウントはすべてのユーザーの権限を確認できますが、他のアカウントは自分自身のアカウントの詳細のみを見ることができます。

これは、アプリケーションを管理している人がユーザーのアクセス権限に関するレポートを必要とする場合に役立ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1f97226a-8d3d-4542-9c75-7578b703bc9c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1de9b50a-b66d-4a79-9ff0-4ac2cf815ab5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1e4276fd-c207-4292-81cd-68ec7d4d0c1c.png)

# あとがき #
これが、（管理者である）あなたがビジネスを円滑に運営するのに役立つことを願っています。
医療業界を狙うダークウェブのデータ漏洩の脅威の高まり

近年、医療業界はサイバー犯罪者にとって主要な標的となっています。高度化するサイバー攻撃の増加により、患者の機密データがダークウェブで漏洩・取引されるケースが増え、個人や組織に深刻な脅威をもたらしています。

ダークウェブとは何か？

脅威について詳しく説明する前に、基本的な質問に答えましょう：ダークウェブとは何か？ ダークウェブとは、通常の検索エンジンにはインデックスされていないインターネットの隠れた領域を指します。Tor などの特殊なソフトウェアを使ってアクセスする必要があり、匿名性を保ちながら通信できるため、合法的な使用もある一方で、盗まれたデータの売買など違法活動の温床としても知られています。

医療業界が狙われる理由

医療機関は、個人識別情報（PII）、医療記録、財務情報など膨大で価値の高いデータを保有しています。こうしたデータはダークウェブ市場で高値で取引されるため、医療機関は攻撃者にとって魅力的な標的となります。ハッカーはフィッシング詐欺、ランサムウェア攻撃、サードパーティの脆弱性を悪用して侵入します。

ダークウェブへのデータ漏洩の実際の影響

患者データがダークウェブに流出すると、影響は広範囲に及びます：

個人情報の盗難: 犯罪者は盗まれたデータを使って不正行為を行い、被害者の信用スコアや財政状況を損ないます。

医療詐欺: 盗まれた医療記録を使い、不正な医療サービスを受けたり、薬を手に入れたり、保険金詐欺を行ったりします。

評判の失墜: 医療機関にとってデータ侵害は患者の信頼を失うだけでなく、高額な法的・規制上の費用を引き起こす可能性があります。

脅威への対策

ダークウェブへのデータ漏洩の脅威に対抗するため、医療機関は積極的なセキュリティ対策を講じる必要があります：

強固なサイバーセキュリティプロトコルの導入: システムの定期的な更新、強力なパスワードポリシーの施行、多要素認証の活用。

ダークウェブ監視: ダークウェブ監視サービスを活用し、データが悪用される前に特定・対応します。

従業員教育: フィッシング攻撃の兆候を認識し、日常的に適切なサイバー衛生を実践するためのトレーニングを実施。

インシデント対応計画: データ漏洩に備え、迅速に対応できる構造化されたインシデント対応戦略を整備します。

今後の展望

サイバー脅威が進化する中、医療業界は一層の警戒が求められます。ダークウェブの仕組みを理解し、サイバーセキュリティ体制を強化することで、医療機関は患者データを保護し、信頼を維持できます。攻撃者の一歩先を行くことで、リスクを軽減し、提供する医療サービスの安全性を確保しましょう。

さらに改善したい点や追加したい内容があれば、お気軽にお知らせください！🚀

https://cyble.com/knowledge-hub/what-is-the-dark-web/
RubyMineのヘビーユーザーだった私が、Cursorに乗り越えてよかったこと、慣れないこと

RubyMineを9年使い続けてきた私が最近Cursorに乗り換えました。正直、RubyMineに慣れすぎていたのもあったので、切り替えを迷っていたのですが、周りのエンジニアの方が「Cursorめっちゃいいよ！」と激推しているので、乗り換えてみました。今回は、Cursorに乗り換えてよかったことと、まだ慣れないことを整理してみました。

# Cursorに乗り換えてよかったこと

## AIサポートの柔軟性と精度が高い

RubyMineのAI Assistantも便利でしたが、CursorのAIはより優秀でした。ターミナルのエラー出力などからエラーの特定、修正の提案までやってくれるのは非常に助かりました。
また、Claude 3.7がリリースされた直後に対応していた早さにも感動しました。コードを書く際はClaudeがめちゃくちゃいいですね。
あと、複数箇所の類似した修正を一括で提案してくれる機能はめちゃくちゃ助かってます。

## VSCodeベースで拡張性が高い

CursorはVSCodeをフォークしているため、拡張機能の導入や設定が非常に簡単です。また、多くの開発者が使い慣れているVSCodeライクなUIのおかげで、直感的に操作できる点も魅力的でした。
RubyMineとショートカットキーを全く同じにすることは難しかったですが、VSCodeならではのショートカットなどもあるので、非常に便利でした。
あと、RubyMineは基本Rubyを書くことに特化していますが、VSCodeなら多言語いけるのも魅力的ですね。（RubyMineもプラグインを入れたらある程度は対応できます）

## コード生成・リファクタリングが直感的

コードを選択してCmd+KでAI編集機能を呼び出すと、具体的な指示に基づいてコードを生成・修正できます。差分表示で変更点が明確にわかり、採用するか却下するかを簡単に選べるのも便利です。

# まだ慣れないこと・難を感じていること

## Docker環境での実装に少し難あり

Docker環境でRuby on Railsの開発を行う際、Cursorではまだ若干難しさを感じています。特にDockerコンテナ内のデバッグや環境依存の設定などは、RubyMineほどスムーズにはいかず工夫が必要です。
RubyMineだとDocker環境内でインストールしているRubyやGemfileを指定できますからね。。。そこは少し不便さを感じました。

## コードジャンプ機能はRubyMineが優秀

Railsアプリケーション開発では頻繁に定義元へのジャンプや関連ファイルへの移動をしますが、この点ではRubyMineのほうがかなり優秀です。特に、RubyMineは追加したgemのソースにも飛んでくれるので、「このgemはどんな動作をしてるんだろう」と確認したくなったときにめちゃくちゃ助かってました。
CursorでもRubyLSPプラグインを導入することでコードジャンプができるようになりましたが、精度の部分や利便性ではまだRubyMineには及ばない印象です。

## Git操作はRubyMineのほうが細かくできる

Git操作についても、CursorではGit Graphプラグインを使っていますが、ブランチ管理や細かな履歴操作などについてはRubyMineのほうが直感的で使いやすかったと感じています。

# Cursorにまだ慣れないこと

- Docker環境との連携や設定周りで手間取ることがある
- コードジャンプや定義元への移動などナビゲーション機能はまだ改善余地あり
- Git周りの細かな操作性には課題あり（特にブランチ切り替えや差分確認）

# まとめ
長年愛用したRubyMineからCursorへ乗り換えたことで、AIによるコーディングサポートや拡張性など新しいメリットを享受できています。一方でDocker環境との連携やコードジャンプ・Git操作などではまだ課題も残っています。今後さらにCursor側の改善や自身の習熟度向上によって、このギャップも埋まっていくことを期待しています。同じような境遇の方々にも参考になれば嬉しいです。
確率積分変換と逆関数法

## 確率積分変換（Probability Integral Transform）

確率積分変換とは、確率変数 $X$ の累積分布関数（CDF）を用いて、新たな確率変数を作る方法です。この変換は、任意の確率変数を一様分布に変換することができます。

### 定義
確率変数 $X$ のCDFを $F_X$ とし、次のように新しい確率変数 $Y$ を定義します。


```math
Y = F_X(X)
```


このとき、$Y$ は区間$[0, 1]$上の**一様分布**に従います。つまり、

```math
Y \sim U(0, 1)
```
$$F_Y(y) = y,\ (0 \le y \le 1)$$

$$f_Y(y) = 1,\ (0 \le y \le 1)$$
となります。
### 証明
$Y = F_X(X)$ が $[0, 1]$ 上の一様分布に従うことを確認します。

任意の $Y \in [0, 1]\$ に対して、$Y$ が $y$ 以下になる確率は次のようになります。

```math
P(Y \le y)\ =\ P(F_X(X) \le y)
```


逆関数 $F_X^{-1}$ が存在する場合、$P()$の中身の両辺に逆関数を適用すると

```math
=\ P(X \le F_X^{-1}(y))
```

となり、これは関数$F_X$の定義そのものです。

$$
=\ F_X(F_X^{-1}(y))
$$

逆関数の性質から、$F_X(F_X^{-1}(y)) = y$ となります。したがって、

```math
P(Y \le y) = y
```

これは区間$[0,1]$の一様分布のCDFであるため、$Y$ は $[0, 1]$ 上の一様分布に従うことが分かります。どんな分布も一様分布に従うようになるので、Universality of the Uniformとも言われます。
### 標準正規分布の場合のシミュレーション（確率積分変換）
<iframe width="560" height="315" src="https://www.youtube.com/embed/RI6zmj0ifSs?si=kbELw8M8AntyvYtU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
標準正規分布からランダムサンプルを抽出し、対応する点をPDF、CDFに表示し、CDFの値でヒストグラムを作っています。サンプルサイズは１０００ですが大体一様に分布しているのが分かります。正規分布なので平均周りの値が出やすくなっていますが、CDFで平均周りの傾きが急になっているのでその分ヒストグラムではばらつきます。一時停止して確認してみてください。

### 逆関数法

任意の分布のCDFとその逆関数が分かると一様分布が作れるなら、その逆もできそうです。**逆関数法**は、一様分布から任意の分布のサンプルを抽出する手法です。$Y$を区間$[0,1]$上の一様分布とし、抽出したい分布を$X$とすると
$$
F_X^{-1}(Y)
$$
は$X$に従います。

### 証明

$$
F_X^{-1}(X)\ =\ Y
$$
の両辺に$F_X$を作用させると
$$
X\ =\ F_X(Y)
$$
となるので、$F_X(Y)$は$X$に従います。

### 標準正規分布の場合のシミュレーション（逆関数法）
<iframe width="560" height="315" src="https://www.youtube.com/embed/ybUeWE6zG38?si=jVO3C2P1L69w3RYN" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
一様分布からランダムサンプルを抽出し、対応する点での標準正規分布の逆関数（プロビット）の値をヒストグラムにしています。ちゃんと正規分布しているのが分かります。

### おまけ
<iframe width="560" height="315" src="https://www.youtube.com/embed/GaxFot-65Jk?si=9rO2r2B0dLuj2eXk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
この動画のほうがCDF,PDF,ヒストグラムの対応関係が分かりやすいです。動画後半で正規分布以外の分布のシミュレーションも見れます。すべて一様に分布しているのが分かります。
パソコン入門：パソコンの仕組みを学び直すために、CPU・ストレージ・メモリの基礎知識をまとめてみた

## はじめに

コンピュータの仕組みを理解するうえで、CPU、ストレージ、メモリの役割を知ることはとても重要です。

これらの基本的な概念を押さえておくと、パソコンやスマホのスペックを比較したり、より効率的に使う方法を考えたりするのに役立ちます。

## 書こうと思ったきっかけ

自分の知識を振り返る機会が必要だと感じたため、今回記事としてまとめることにしました。

内容は個人の備忘録程度ですが、ご容赦ください。

## CPU：計算や処理を行う頭脳担当
CPU（Central Processing Unit）は、コンピュータの「頭脳」にあたる部分です。プログラムの指示に従って計算や処理を行い、すべての操作を制御します。例えば、ソフトウェアを動かしたり、データを加工したりする役割を担っています。

CPUの性能は、クロック周波数（GHz）やコア数で決まります。クロック周波数が高いほど処理が速く、コア数が多いほど同時に多くの処理をこなせます。

## ストレージ：データを長期保存しておくための引き出し・本棚
ストレージ（Storage）は、データを長期間保存するための場所です。例えるならば、本棚や引き出しのようなもので、ファイルやアプリケーション、OSなどのデータが格納されています。

ストレージには、HDD（ハードディスクドライブ）とSSD（ソリッドステートドライブ）の2種類があります。
- **HDD**：大容量で安価だが、読み書き速度が遅め。
- **SSD**：高速なデータアクセスが可能で、衝撃にも強いが、HDDよりも高価。

パソコンやスマホのストレージ容量（例：256GB、1TB）は、どれだけのデータを保存できるかを示しています。

## メモリ：ストレージから取り出したデータを置いて作業するための作業台
メモリ（RAM：Random Access Memory）は、一時的にデータを置いておくための作業台のようなものです。ストレージから取り出したデータをここに置いて、CPUがすぐにアクセスできる状態にします。

メモリが大きいほど、一度に多くのデータを扱うことができ、動作がスムーズになります。例えば、メモリが少ないと複数のアプリを開くと動作が重くなりますが、十分なメモリがあるとスムーズに作業ができます。

## まとめ
- **CPU**：コンピュータの頭脳で、計算や処理を行う。
- **ストレージ**：データを長期間保存するための本棚・引き出し。
- **メモリ**：作業中のデータを一時的に置くための作業台。