OmniAICreator/Qiita-1.07M huggingface dataset:
データ標準化の取り組みまとめ

はじめての投稿です。
本当は技術的な投稿をしたいのですが、まずは学習した内容を備忘録的に投稿してQiitaに慣れたいと思います。

本当稿では、データ標準化の取り組みについて学習したことを少しずつアウトプットしていきます。（本当稿を少しずつ修正していきます）

１．GTFS

GTFSについて、学習したことを記載します。

GTFSは交通データの標準フォーマットで、交通データをGTFSのフォーマットに沿わせることでGoogle Mapsの公共交通機関の検索の対象となることが可能です。

GTFSは「General Transit Feed Specification」の略で、直訳すると「一般的な交通フィード仕様」です。公共交通機関のスケジュールと地理情報を標準化されたフォーマットで表現するための仕様で、これにより、公共交通データをさまざまなアプリケーションで利用できるようになります。

GTFSは主に以下の情報を含むテキストファイルのセットで構成されています：

routes.txt: 路線情報
trips.txt: トリップ情報（運行ルートに沿った各運行の詳細）
stop_times.txt: 各停留所での到着・出発時刻
stops.txt: 停留所の位置情報
calendar.txt: 運行スケジュール（曜日や休日の運行情報）
agency.txt: 交通機関の情報

GTFSのデータは、Google Mapsなどの地図サービスや交通機関のアプリで利用されており、旅行者が公共交通機関を利用する際の計画を立てやすくしています。GTFSはオープンフォーマットであるため、多くの開発者がアクセス可能であり、公共交通機関の効率的な利用を促進しています。
[Terraform] AWSコンソールで削除されたリソースが原因でDestroyできない場合の対処法

## 前書き
Terraformを使用してインフラを管理していると、一部のリソースがAWSコンソール上で削除されてしまい、Terraformの terraform destroy が失敗することがあります。この記事では、そのような状況に陥った際のいくつかの解決方法と、それぞれの具体的なコマンドを紹介します。

## 問題の概要
Terraformは管理対象のリソースを terraform.tfstate ファイルで管理しています。しかし、AWSコンソールなどで手動削除されたリソースがあると、Terraformが状態を正しく認識できず、削除時にエラーが発生することがあります。

## 解決策 ①: terraform state rm コマンドを使用する
Terraformの state rm コマンドを使用することで、手動削除されたリソースを terraform.tfstate から削除できます。これはTerraformの管理対象からリソースを外す方法です。

手順
１. まず、エラーの原因となっているリソースを特定する
```bash
terraform plan
```

２. 問題のリソースをTerraformの状態管理から削除する
```bash
terraform state rm aws_instance.example
# aws_instance.example の部分は、エラーで表示されているリソース名に置き換えてください
```

３. その後、通常通り terraform destroy を実行できる
```bash
terraform destroy
```
## 解決策 ②: terraform import で再登録する
AWSコンソールで削除されたリソースがまだ必要な場合は、 terraform import を使ってTerraformの管理対象に再登録できます。

手順
１. まず、対象のリソースをTerraformにインポートできるか確認する
```bash
terraform state list
```

２. AWSのリソースIDを確認し、Terraformにインポートする
```bash
terraform import aws_instance.example i-xxxxxxxxxxxx
# i-xxxxxxxxxxxx は、AWS上の実際のリソースIDに置き換えてください
```

３. その後、 terraform destroy が正常に動作するか試す
```bash
terraform destroy
```

## 解決策 ③: terraform refresh
Terraformの状態ファイルを最新の状態に更新することで、問題が解決する場合があります。

手順
１. terraform refresh コマンドを実行する（Terraform v0.15 以前の場合）
```bash
terraform refresh
```
※Terraform v1.0以降では refresh は非推奨になり、 terraform apply に統合されました。

２. terraform apply を実行し、削除されたリソースを再作成する
```bash
terraform apply
```

## 解決策 ④: 手動で terraform.tfstate を編集する（最終手段）
terraform state rm で対応できない場合は、 terraform.tfstate を直接編集することもできます。ただし、手作業での編集はリスクが伴うため、事前にバックアップを取ることをおすすめします。

手順
１. terraform.tfstate のバックアップを作成する
```bash
cp terraform.tfstate terraform.tfstate.bak
```

２. terraform.tfstate を手動で開き、削除されたリソースに関連するエントリを削除する

３. 修正後、 terraform apply または terraform destroy を再実行する
```bash
terraform destroy
```

## まとめ
Terraformで管理しているリソースがAWSコンソールで削除された場合は、まず state rm や import で対応し、それでも解決しない場合は refresh や tfstate の編集を検討すると良いでしょう。
お役に立てれば幸いです。
「Rust から WebAssembly にコンパイル」を webpack 5 に対応

# 内容
　MDN のチュートリアルページに従って Rust で WebAssembly を作ってみようとしたところよくわからないエラーで頓挫。そこでなんとか動くようにしてみました、という話です。
 
# きっかけ
　MDN Web Page の「Rust から WebAssembly にコンパイル」
 
 https://developer.mozilla.org/ja/docs/WebAssembly/Guides/Rust_to_Wasm
 
に従い操作を進めたところ、最後の 'npm run serve' コマンドでエラーになりました。
```
% npm run serve
...
ERROR in ../pkg/hello_wasm_bg.wasm
Module parse failed: Unknown element type in table: 0xNaN
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
...
```
# エラーの原因
　エラーメッセージを頼りにいろいろ検索してみたところ、どうやら Rust の v1.82 以降と webpack 4 の相性がよくないらしいです。

 https://github.com/rustwasm/wasm-bindgen/issues/4211#issuecomment-2447799119 

# 解決策
　webpack 4 のままでも回避策はあるらしいのですが、現行バージョンの webpack 5 に対応する方が前向きかなと思います。
　まずは 'package.json' を直して webpack 5 対応にします。それに伴い 'webpack.config.js' も修正が必要になります。
 　具体的には以下の通り。
  
```json:package.json
{
  "scripts": {
    "serve": "webpack-dev-server"
  },
  "dependencies": {
    "hello-wasm": "^0.1.0"
  },
  "devDependencies": {
    "webpack": "^5.98.0",
    "webpack-cli": "^6.0.1",
    "webpack-dev-server": "^5.2.1"
  }
}
```
```javascript:webpack.config.js
const path = require("path");
module.exports = {
  entry: "./index.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "index.js",
  },
  mode: "development",
  devServer: {
    static: {
      directory: path.join(__dirname, "/")
    }
  },
  experiments: {
    asyncWebAssembly: true
  }
};
```
　webpack のバージョンなどは適当に変更しても大丈夫かと。
　'webpack.config.js' の 'experiments:' 部分ですが、これを入れないと
以下のようなエラーが出ます。エラーメッセージに従って 'asyncWebAssembly: true' を設定しました。

 ```
 ERROR in ../pkg/hello_wasm_bg.wasm 1:0
Module parse failed: Unexpected character '' (1:0)
The module seem to be a WebAssembly module, but module is not flagged as WebAssembly module for webpack.
BREAKING CHANGE: Since webpack 5 WebAssembly is not enabled by default and flagged as experimental feature.
You need to enable one of the WebAssembly experiments via 'experiments.asyncWebAssembly: true' (based on async modules) or 'experiments.syncWebAssembly: true' (like webpack 4, deprecated).
 ```

# まとめ
 無事 Rust で作った 'hello_wasm' が動きました。
grub.cfg の大きさ問題

## environment block too small. 対策
* 本日は grub.cfg の大きさ問題確認を続けています。
* /boot/grub/grub.cfg は vi で　編集できるのでしょうか？
```
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
```
* 早速横紙破りと叱られるところです。触らぬなんとかに祟りなし。

## /etc/default/grub を確認する。
* /etc/default/grub は簡素でした。
* これなら　update-grub しても問題ないはず（というか規定動作として行われているはず？）。
* べき等性が有るか分かりませんが、多分物騒なコマンドにはならないので実行しちゃいます
* これで起動しなかったらこの原稿の後半は別のPCで書きます。
```
update-grub                                               [15:15:23]
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.11.0-21-generic
Found initrd image: /boot/initrd.img-6.11.0-21-generic
Found linux image: /boot/vmlinuz-6.11.0-19-generic
Found initrd image: /boot/initrd.img-6.11.0-19-generic
Found linux image: /boot/vmlinuz-6.8.12-060812-generic
Found initrd image: /boot/initrd.img-6.8.12-060812-generic
Found linux image: /boot/vmlinuz-6.5.0-35-generic
Found initrd image: /boot/initrd.img-6.5.0-35-generic
Found linux image: /boot/vmlinuz-6.2.0-25-generic
Found memtest86+ 64bit EFI image: /boot/memtest86+x64.efi
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done
```
## 答え合わせしてみる。
* 
update-grub 実行後、再起動してエラーは出なくなりました。
* 何だそんなことか？ということですが、 ブート周りのトラブルシュートは本当に根気がいるのでやりたくないです。時間がかかるし手がかりは少ない。動けばラッキーみたいなことが横行しているので、コンナモノツカエルカヨってなるシビアな現場に持っていけないものが多い。そういう意味で安全ではない製品がいっぱい。

* 
時間かけていろいろ聞いて回ったけど、結局 update-grub が適切に実行されていなかった？だけではないかという。なんともお粗末でした。

* 電源を完全に切って再起動したら、また出ました orz.

## grub.cfg が 16kbyteを超えているか？
```
root # >>> ls -lh /boot/grub/grub.cfg                                                 -rw-rw-r-- 1 root root 13K  3月 31 20:41 /boot/grub/grub.cfg
```
 13K ですね。超えてません。

## UEFI に用意したパーティションの大きさ？？
* データ用にOSをインストールしていないM.2をつなげてあります。
```
1. Run `lsblk` to verify partition sizes.
2. Check for swap partitions that might have been created incorrectly.
3. Inspect log files for more details on where the error occurred.
```
* EFIパーティーション設定がされていましたが、フォーマットがされていませんでした・・・
* FAT32でマウントが出来ません。もしかしてこれが原因？
* gparted でフォーマットして様子を見ましょう。　
* 再起動しても変わらない・・・   update-grub も駄目？

## 調査は持ち越し・・・
* ログも出ない、再起動も時間がかかる、流れるメッセージが速すぎて追えない・・・
* サーバならシリアルコンソールが使えるんですが、ただのデスクトップですから・・・
* grub-editenv で修正出来るのでしょうか？？
```
root # >>> grub-editenv /boot/grub/grub.cfg list                     [21:52:27]
grub-editenv: エラー: invalid environment block.

```
* やはり何かが壊れているようです・・・？？
* grub.cfg を矛盾なく切り取って編集する気力。
【SQLServer】ログオントリガーで利用端末を制限する方法

# 背景
SQLserver認証を使ってデータベースの利用者を制限している
IDとパスワードを知っていれば誰でもアクセスできる状態になっている

# 対策
ログオントリガーを使って利用できる端末IPを制限する

# 設定手順
以下のようなクエリを作成して実行する
今回の例ではSQLserver認証でtestuserを使ってログオンする場合、127.0.0.0以外からのアクセスを拒否するトリガーを作成する
```
CREATE TRIGGER [connection_limit_trigger] ON ALL SERVER FOR LOGON AS 
BEGIN 
IF 
    CONNECTIONPROPERTY('auth_scheme') = 'SQL' 
    AND SYSTEM_USER = 'testuser' 
    AND CONVERT(nvarchar(max), CONNECTIONPROPERTY('client_net_address')) <> '127.0.0.1'
    ROLLBACK;
END;
GO
```

### 説明
`CREATE TRIGGER [connection_limit_trigger] ON ALL SERVER FOR LOGON`
サーバーレベルでログイン端末を制限するログオントリガーを作成する

`CONNECTIONPROPERTY('auth_scheme') = 'SQL' `
認証スキームがSQLserver認証であることを確認する

`SYSTEM_USER = 'testuser' `
ログオンしようとしているユーザーが"testuser"であることを確認する

`CONVERT(nvarchar(max), CONNECTIONPROPERTY('client_net_address')) <> '127.0.0.1'`
クライアントのIPアドレスが 127.0.0.1（ローカルホスト）でないことを確認する
【記事紹介】bitlocker2john徹底解説：BitLocker暗号化ボリュームの解析手順を学ぼう

# 【記事紹介】bitlocker2johnの使い方徹底解説：BitLocker暗号化ボリュームの情報を抽出するには？

Windowsに標準搭載されているディスク暗号化機能「BitLocker」。セキュリティを高める手段として多くの企業やユーザーが利用していますが、万が一パスワードや回復キーを失念してしまうと、データにアクセスできなくなるというリスクもあります。

そんな時に使えるのが「bitlocker2john」というツールです。これは、パスワード解析ツール「John the Ripper（JtR）」と組み合わせて、BitLockerで保護されたボリュームからパスワードクラッキング用のハッシュデータを抽出するツールです。

今回ご紹介するOmomukiの記事  
👉 [bitlocker2john を使って BitLocker 暗号化ボリュームの情報を抽出する方法](https://omomuki-tech.com/archives/790)  
では、初心者にもわかりやすくbitlocker2johnの使い方を解説しています。

---

## 🔍 記事の内容概要

この記事では、bitlocker2johnとJohn the Ripperを使って、BitLockerで暗号化されたドライブから情報を抽出し、復号を試みるまでの流れが詳しく説明されています。主な内容は以下の通りです：

- **BitLockerとは何か？**  
  Windowsのディスク暗号化機能の概要とその仕組み。

- **bitlocker2johnとは？**  
  BitLockerボリュームからJtR用ハッシュを抽出するためのツール。

- **インストール手順**  
  Kali Linuxなどの環境でのbitlocker2johnの取得方法。

- **コマンドの実行例と解説**  
  実際の `.vhdx` ファイルなどから情報を抽出する具体的なコマンド例。

- **John the Ripperでの解析方法**  
  抽出したデータをJtRに渡し、辞書攻撃や総当たりを行う手順。

- **注意点と法的・倫理的配慮**  
  本ツールは合法的に所有・管理するデバイスに対してのみ使用すべきであることの明記。

---

## 🌟 記事のおすすめポイント

- **初心者にも安心の丁寧な説明**  
  導入から実行まで、コマンドも含めて親切に解説されています。

- **実際の活用例に基づく内容**  
  理論だけでなく、具体的なファイル形式や想定シナリオが紹介されているので実践に役立ちます。

- **セキュリティツールの理解が深まる**  
  John the Ripperなど他のツールとの連携方法も学べ、セキュリティ知識が広がります。

---

## 👨‍💻 こんな方におすすめ

- BitLockerに関するセキュリティ研究をしている方  
- パスワードリカバリやフォレンジックに関心のある技術者  
- John the Ripperを実践的に活用してみたいセキュリティ初学者  
- 自社や組織の内部監査ツールとして導入を検討している方

---

## 🔗 記事を読む

👉 [bitlocker2john を使って BitLocker 暗号化ボリュームの情報を抽出する方法](https://omomuki-tech.com/archives/790)

BitLockerの解析方法やbitlocker2johnの活用に興味がある方は、ぜひチェックしてみてください。ツールの正しい理解と使用方法を知ることは、セキュリティリスクを回避する上でも大きな力になります。
#0089（2024/03/31）データベースのACID特性

## データベースのACID特性について

データベースの信頼性を保つ上で重要な概念に「ACID特性」があります。これはデータベースのトランザクション処理が持つべき特性をまとめたもので、以下の4つの性質の頭文字から構成されています。

---

### ACID特性の概要

| 略語 | 意味（日本語）       | 意味（英語）       |
|------|----------------------|--------------------|
| A    | 原子性               | Atomicity          |
| C    | 一貫性               | Consistency        |
| I    | 独立性・分離性       | Isolation          |
| D    | 永続性・耐久性       | Durability         |

---

### 1. 原子性（Atomicity）

トランザクションが複数の処理から構成される場合、それらの処理はすべて成功するか、すべて失敗するかのどちらかとなり、一部だけ成功することはありません。

- **具体例**：銀行の振込処理で送金処理と入金処理がどちらも完了するか、どちらも実行されないかのどちらかになること。

---

### 2. 一貫性（Consistency）

トランザクション実行前後でデータベースが矛盾しない状態を保つことです。

- **具体例**：口座間の送金後、送金元と送金先の合計金額が変わらないこと。

---

### 3. 独立性・分離性（Isolation）

同時に複数のトランザクションが実行される場合でも、それぞれのトランザクションが互いに干渉せず、独立して実行されることです。

- **具体例**：複数ユーザーが同時に銀行口座を操作しても、それぞれの操作が相互に影響を与えず正しく処理されること。

---

### 4. 永続性・耐久性（Durability）

トランザクションが一度コミット（成功）した場合、その結果がシステムの障害などによって失われないように永続的に記録されることです。

- **具体例**：銀行の振込処理が成功した後、サーバが障害を起こしても送金記録が消えず、後から参照できること。

---

### ACID特性の重要性

ACID特性を守ることで、データベースの信頼性や整合性を確保できます。銀行システム、在庫管理システムなど重要なデータを扱うシステムでは特に重要となります。

一方で、高い性能が求められる場合や、分散型データベースなど一部のNoSQLでは、ACID特性の一部を緩和し、性能向上を図ることもあります。

---
#0088（2024/03/31）NoSQLのまとめ

## NoSQLの体系的なまとめ

データベースにはリレーショナルデータベース（RDB）以外にもさまざまな種類が存在します。これらは一般に「NoSQL（Not only SQL）」と呼ばれ、用途や特性に応じて以下のように分類できます。

---

### 1. キー・バリューストア型（Key-Value Store）

キーと値の単純な組み合わせでデータを管理する方式です。

#### 特徴
- 非常にシンプルで高速。
- 柔軟な構造で自由にデータを格納。
- キャッシュや高速な読み書きが求められる用途に適しています。

#### 具体例
- **Redis**（キャッシュやリアルタイム処理）
- **Amazon DynamoDB**（高スケーラビリティ）

---

### 2. ドキュメント指向型（Document Store）

データをJSONやXMLなどのドキュメント形式で格納・管理するデータベースです。

#### 特徴
- 柔軟なスキーマを持ち、データ構造の変更に強い。
- 複雑で階層的なデータ構造を保存可能。
- Webアプリケーションなどでよく使用されます。

#### 具体例
- **MongoDB**（人気が高く、多くのアプリで利用）
- **CouchDB**（同期機能やモバイル向けに特化）

---

### 3. 列指向型（Wide Column Store）

データを列単位で格納し、分析や集計処理に適した構造を持つデータベースです。

#### 特徴
- 大量データの分析や処理を高速化。
- 分散環境における高いスケーラビリティ。
- ビッグデータ処理や時系列データ解析向け。

#### 具体例
- **Apache Cassandra**（分散環境で高可用性）
- **Apache HBase**（Hadoopエコシステムに特化）

---

### 4. グラフ型（Graph Database）

ノード（頂点）とエッジ（辺）の関係でデータを管理し、データ間の複雑な関係性を効率的に処理します。

#### 特徴
- データ間の関係性に特化。
- ネットワーク状の複雑な関係の処理に最適。
- SNSやレコメンデーション機能に適用されます。

#### 具体例
- **Neo4j**（代表的なグラフDB）
- **Amazon Neptune**（AWS提供のグラフDBサービス）

---

### データベース種類の比較まとめ

| 種類           | 特徴                        | 用途例                              | 具体例                |
|----------------|-----------------------------|-------------------------------------|-----------------------|
| キーバリュー型 | シンプル、高速              | キャッシュ、セッション管理          | Redis, DynamoDB       |
| ドキュメント型 | 柔軟なデータ構造            | Webアプリ、モバイルアプリケーション| MongoDB, CouchDB      |
| 列指向型       | 大量データ分析に最適        | ビッグデータ、時系列データ分析      | Cassandra, HBase      |
| グラフ型       | 複雑な関係性を高速処理      | SNS、レコメンド、ネットワーク分析  | Neo4j, Amazon Neptune |

---
VOICEVOXをPythonから適度に設定して利用する

# 何番煎じか分かりませんが

VOICEVOXをPythonから使います。話す速度や前後の無音部分の長さの調整、ピッチ調整などGUIでの設定をPython中でもできるというだけです。

# コード

```python voicevox.py
import requests
from pathlib import Path

def voicevox(text, output_path, speaker=2, speedScale=1):
    url = "http://localhost:50021/audio_query"
    params = {"text": text, "speaker": speaker}  
    timeout = 15
    query_synthesis = requests.post(url, params=params, timeout=timeout)
    json = query_synthesis.json()
    json['speedScale'] = speedScale
    json['prePhonemeLength'] = 0.3 #前に0.3秒の無音を追加
    json['postPhonemeLength'] = 0.3 #後に0.3秒の無音を追加

    response = requests.post(
                "http://localhost:50021/synthesis",
                params=params,
                json=json,
            )
    out = Path(output_path)
    out.write_bytes(response.content)


if __name__ == '__main__':
    text = "音声合成のためのサンプルコードです。VOICEVOXアプリケーションまたはVOICEVOXエンジンが起動している状態で実行すると、ずんだもんのノーマルスタイルで「これはサンプルボイスです」という音声が生成されsample.wavとしてカレントディレクトリ内に保存されます。"
    voicevox(text, "voicevox.wav")
    
"""英語から意味は察してください
'speedScale': 1.0,
'pitchScale': 0.0,
'intonationScale': 1.0,
'volumeScale': 1.0,
'prePhonemeLength': 0.1,
'postPhonemeLength': 0.1,
'pauseLength': None,
'pauseLengthScale': 1.0,
'outputSamplingRate': 24000,
'outputStereo': False,
"""


```
VB.NETでテキストボックスの自動改行を実装する

## 背景と目的
なぜ自動改行が必要なのか？

テキストボックスで入力を行う際、特定の条件で自動的に改行を入れたいケースがあります。例えば、

- 指定した文字数ごとに改行を入れたい（チャットアプリやメモ帳など）

- 句読点や括弧が行頭にこないように調整したい

- 手動での改行は許可せず、自動的に整った文章を作成したい

通常の TextBox コントロールでは、Wordのような適切な改行処理は備わっていません。そのため、
プログラムでルールを決めて、自動的に改行を行う処理が必要になります。

### 本記事で実装する機能

今回の実装では、以下のような機能を備えた自動改行処理を作成します。

✅ 入力テキストの監視（リアルタイム処理）
- TextChanged イベントを使い、ユーザーが入力するたびに処理を実行

✅ Enterキーを無効化
- 手動での改行を禁止し、プログラムでのみ改行を制御

✅ 一定の文字数ごとに自動改行を挿入
- 例）50文字ごとに改行を入れる

✅ 句読点や括弧が行頭にこないように調整
- 「（【『 などが行の先頭にこないようにする

✅ バックスペースの処理を最適化
- 改行の削除時に違和感のない動作をするように調整


## 第1章：テキストボックスの監視方法と基本的な改行処理

### TextChanged イベントを使った入力監視

テキストボックスの内容が変更されたときに、自動的に処理を行うには TextChanged イベントを使用します。

```vb
Private Sub Textbox1_Changed(sender As Object, e As EventArgs) Handles Textbox1.TextChanged
    ' ここで入力内容を処理する
End Sub
```

これにより、ユーザーがテキストを入力するたびにイベントが発生し、処理を実行できます。

### 手動改行の無効化

手動で改行されると制御が難しくなるため、KeyPress イベントを使って Enter キーを無効にします。

```vb
Private Sub Textbox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Textbox1.KeyPress
    If e.KeyChar = ChrW(Keys.Enter) OrElse e.KeyChar = ChrW(Keys.LineFeed) Then
        e.Handled = True ' 改行キーを無効化
    End If
End Sub
```

### 文字数ごとの改行挿入

一定の文字数ごとに改行を入れるには、文字列を分割しながら処理する関数を作成します。

```vb
Private Function InsertLineBreaks(input As String, maxChars As Integer) As String
    Dim result As New List(Of String)()
    Dim currentLine As New System.Text.StringBuilder()
    Dim maxChars As Integer = 50 ' 一行当たりの最大文字数を設定
    
    For i As Integer = 0 To input.Length - 1
        ' テキストボックス内の文字を一文字ずつ変数に追加する
        currentLine.Append(input(i))
        
        ' 現在の行が最大文字数に達した場合
        If currentLine.Length >= maxChars Then
            ' リストに現在の行の文字列を追加する
            result.Add(currentLine.ToString())
            currentLine.Clear()
        End If
    Next

    ' 残った文字列を追加
    If currentLine.Length > 0 Then
        result.Add(currentLine.ToString())
    End If

    ' 結果を改行で連結して返す
    Return String.Join(vbCrLf, result)
End Function
```

次の章では、句読点や括弧の調整について解説します。
【Python】ノートPCのCPUでMusicGenを量子化して動かす

# やること＆結論
+ MusicGenをノートパソコンのCPUで動かし、音楽を生成する。モデルを量子化してみる。
+ 量子化する意味はなかった。10秒の音楽で生成時間100秒。30秒の音楽は5分くらいかかる。

# 使用したモデル

https://huggingface.co/facebook/musicgen-small

# 環境

CPU: Ryzen 5 5500U, Mem: 16GB
Win11, Python 3.10.6, torch 2.4.1

# コード

https://huggingface.co/facebook/musicgen-small

ソース元そのままです。必ず仮想環境を作ること。適当な空のフォルダを作り、一行ずつコマンドプロンプトに張り付け実行する

```bat
python -mvenv venv
venv\scripts\activate.bat
pip install --upgrade pip
pip install --upgrade transformers scipy
```


```python run.py
from transformers import pipeline
import scipy
import torch
import time

start = time.time()

synthesiser = pipeline("text-to-audio", "facebook/musicgen-small")

# モデルを量子化する意味はない
#synthesiser.model = torch.quantization.quantize_dynamic(
#    synthesiser.model, {torch.nn.Linear}, dtype=torch.qint8
#)

music = synthesiser(
    "lo-fi music with a soothing melody", 
    forward_params={"do_sample": True, "max_length":512} #256: 5秒、512:10秒、デフォルト30秒
)

scipy.io.wavfile.write("musicgen_out.wav", rate=music["sampling_rate"], data=music["audio"])

print(time.time() - start)
```

実行時は仮想環境に入って
```bat
C:\Users\user\Desktop\music_gen>venv\scripts\activate.bat
(venv) C:\Users\user\Desktop\music_gen>python run.py
```
# 時間

forward_paramsのmax_lengthを指定しない場合30秒の音声ファイルが5分程度で出力される。
"max_length":512おおよそ10秒の音声ファイルの出力に108秒
"max_length":256おおよそ5秒の音声ファイルの出力に41秒
量子化しても1秒も変わらなかった。これはSmallモデルなのですでに量子化されているのか、プログラムに誤りがあるのか何なのか不明。

# 出力

Qiitaはwav,mp3,webmをアップロードできないらしい。
新幹線などのフリーWi-Fiが繋がらない

# とりあえず結論
- DNS設定を解除してください

# 少し詳細
## 問題
- 新幹線や鉄道のフリーWi-Fiに繋げたいが，認証のポップアップが出て来ず，接続完了ができない

## 原因
- 僕の場合は，DNSを8.8.8.8に設定していたのが悪さをしていました

## 解決方法
- DNS設定を解除しました
[Joke]北斗の拳エンコード・デコード

なんでも、ファイルを北斗の拳表現にエンコード・デコードするプログラムを書いてみました。

例えば、0x01というコードがあるとすると、それは、0b00000001なので、1=あ、0=たに対応させて、「あたたたたたたた」となります。下位ビットから見るので。

"あ"を"0"、"た"を"1"に置き換えると、下位ビットが先頭に来る一つの2進数を表すファイルを扱うようになります。

このプログラムは、ファイル名に`enhokuto`という文字列が含まれていたら、エンコード、含まれていなかったら、デコードをします。そのため、`ln -s enhokuto.py dehokuto.py`として、シンボリックリンクをしてお使いください。

enhokuto.pyは、file.hokutoという北斗の拳ファイルを出力します。

dehokuto.pyは、file.hokuto.resultという、北斗の拳ファイルをデコードした元ファイルのコピーを出力します。

```python:enhokuto.py
#!/usr/bin/python3
import sys

def enhokuto(mem):
    s=""
    for i in mem:
        for k in range(8):
            s+="あ" if not i&(1<<k) else "た"
    return s

def dehokuto(s):
    d=[]
    b=0
    for k in range(len(s)):
        if s[k]=="た":
            b=b|(1<<(k%8))
        if k%8==7:
            d+=[b]
            b=0
    return d

if __name__=='__main__':
    if len(sys.argv)<2:
        exit(-1)


    if "enhokuto" in sys.argv[0]:
        f=open(sys.argv[1],"rb")
        src=enhokuto(list(f.read()))
        f.close()

        f=open(sys.argv[1]+".hokuto","w")
        f.write(src)
        f.close()
    else:
        f=open(sys.argv[1],"r")
        mem=dehokuto(f.read())
        f.close()

        f=open(sys.argv[1]+".result","wb")
        f.write(bytes(mem))
        f.close()
    f.close()
```

#### 実行例

```
$ echo "test">test
$ cat test
test
$ ls
dehokuto.py@  enhokuto.py*  test
$ ./enhokuto.py test
$ ls
dehokuto.py@  enhokuto.py*  test  test.hokuto
$ cat test.hokuto
ああたあたたたあたあたああたたあたたああたたたあああたあたたたああたあたああああ
$ ./dehokuto.py test.hokuto
$ ls
dehokuto.py@  enhokuto.py*  test  test.hokuto  test.hokuto.result
$ cat test.hokuto.result
test
```
PythonからJuliaを呼び出して積分を計算する方法


## はじめに

本記事では、**PythonからJuliaを呼び出して積分を計算する方法**と、**Pythonのみで積分を行う方法**の両方を解説します。

特に以下のような方におすすめです：

- Python環境からJuliaの数値計算ライブラリを使いたい方  
- PythonとJuliaのハイブリッド活用に興味がある方  
- 数値積分（例：$\int_0^1 x^2 dx$）をPythonとJuliaの両方で比較したい方  

本記事では、実際に動くコードとその実行結果を交えながら、シンプルかつ実用的な形で解説していきます。

それでは、まずPythonコードの全体像からご紹介します。

---

### Pythonコード

```python
from julia import Julia
jl = Julia(compiled_modules=False)

from julia import Main
from scipy import integrate

# --- Julia側で数値積分（∫₀¹ x² dx） ---
Main.eval("""
import Pkg
Pkg.add("QuadGK")
""")

Main.eval("""
using QuadGK
result, err = quadgk(x -> x^2, 0, 1)
""")

# Juliaから結果取得
julia_result = Main.eval("result")
julia_error = Main.eval("err")

print(f"[Julia] Integral of x^2 from 0 to 1 = {julia_result:.6f} (error estimate: {julia_error:.2e})")

# --- Python側で数値積分 ---
def f(x):
    return x**2

python_result, python_error = integrate.quad(f, 0, 1)

print(f"[Python] Integral of x^2 from 0 to 1 = {python_result:.6f} (error estimate: {python_error:.2e})")
```

結果

[Julia] Integral of x^2 from 0 to 1 = 0.333333 (error estimate: 0.00e+00)
[Python] Integral of x^2 from 0 to 1 = 0.333333 (error estimate: 3.70e-15
EPGstationをCloudflare Tunnelに対応させる


# 前提条件

次の準備が全て問題なく終わっていることを確認してから進める。

- Cloudflareにドメインを登録していること
- Cloudflare Tunnelが何なのか分かっていること
- Cloudflare Accessの設定が一通り終わっていること
- EPGstationの設定が終わっていること
:::note alert
すべてのセットアップが終わるまでEPGstationを起動してはいけません。
外部からアクセスできるようになり非常に危険です。
:::

# 証明書の作成

ドメインの項目から、 SSL/TLS → オリジンサーバー → 証明書の作成 で証明書を作成する。

秘密鍵と公開鍵をそれぞれ保存する。

![https___qiita-image-store_s3_ap-northeast-1_amazonaws_com_0_69399_ce39b93f-c10a-4cbf-bbe4-cadd9135bb84.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69399/98779ffb-33a5-4cfa-933f-660042c8a1dd.png)


# 証明書をEPGstationにセット

config.ymlの下記の設定を書き換える

```yaml
# port: 8888 # <= コメントアウトして無効化
mirakurunPath: http://127.0.0.1:40772
```

直下に下記の項目を追加する。portとsocketioportを同じにするのがポイント。

```yaml
https:
    port: 8443
    cert: 'C:\\Users\\hogehoge\\pub.pem' # <= 公開鍵を指定
    key: 'C:\\Users\\hogehoge\\priv.crt' # <=秘密鍵を指定
    socketioPort: 8443
```

# Cloudflare Tunnel/Accessの設定

詳しい説明は割愛。

`https://localhost:8443` をルーティングするようにする。

**ルーティングの準備ができたらCloudflare Accessの設定を必ず設定して自分以外アクセスできないようにすること。**
WSL2でAzure Container Registry(ARC)のコンテナイメージからファイルを取り出す

# 前提
- Windows で WSL2 がインストール済みで、Docker も利用可能であること

# 手順
- WSL2 のシェルで操作
1. Azure にログイン
    - `az login`
    - 表示される URL をブラウザで開いて認証するなど
    - サブスクリプションも必要に応じて選択
1. ACR にログインする
    - `az acr login --name <ACR名>`
1. Docker コマンドでイメージを pull する
    - `docker pull <ACR名>.azurecr.io/<リポジトリ名>:<タグ>`
    - ポータルの ACR の画面からも確認可能
1. イメージを pull できているか確認
    - `docker images`
1. コンテナを起動(イメージから直接ファイルを取り出せないため)
    - `docker run -it -d --entrypoint bash <さっき確認したイメージID>`
    - ID を控えておく
    - とりあえず bash を起動させコンテナがすぐ終了しないようにする
1. ファイルを取り出す
    - `docker cp <コンテナ起動時のID>:<コンテナ内のファイル> <コピー先>`
    - 例: `docker cp <コンテナ起動時のID>:/app/test-backend.jar ./test-backend.jar`
    - コンテナ内のファイルは Dockerfile でビルド時にコピーしていることが多いはｚ
1. コンテナ停止
    - `docker stop <コンテナ起動時のID>`
1. 必要に応じて WSL2 から Windows 側にファイルコピー
    - `cp ./test-backend.jar /mnt/c/temp/`
【SQLserver】テーブル圧縮手順

# 背景
長期間使っているシステムで、特定のトランザクションテーブルに対する読み込みの遅さや
テーブルのサイズの増加によって、ディスクを圧迫されるなどの課題が出てきた

# 原因
データの増加によるディスク読み込み量の増加

# 対策
テーブル圧縮を実施する

# 圧縮手順
### 1. テーブルサイズの確認
下記のクエリで圧縮前テーブルサイズを確認できる
```
SELECT 
    t.name AS 'テーブル名',
    SUM(p.rows) AS '行数',
    SUM(a.total_pages) * 8 / 1024 AS '割り当て領域(MB)',
    SUM(a.used_pages) * 8 / 1024 AS '使用済み領域(MB)',
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 / 1024 AS '未使用領域(MB)'
FROM 
    sys.tables t
JOIN 
    sys.indexes i ON t.object_id = i.object_id
JOIN 
    sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE
	t.name = 'テーブル名'
GROUP BY 
    t.name
ORDER BY 
    '未使用領域(MB)' DESC;
```
実行結果
![スクリーンショット 2025-03-31 135744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756373/6f4606c5-f34d-4f07-a665-6fcae5bdec7f.png)


### 2. ページ圧縮
下記のクエリでページ圧縮を実行する
（圧縮にはページレベルの圧縮と行レベルの圧縮があるが、一般的にページ圧縮のほうが圧縮率が高いらしい）
```
ALTER TABLE 
    [スキーマ名].[テーブル名] REBUILD PARTITION = ALL
WITH
    (DATA_COMPRESSION = PAGE)
```

### 3. 圧縮結果確認
テーブルサイズが圧縮されていることを確認する
![スクリーンショット 2025-03-31 140004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756373/9754a4e8-cf2b-43ed-a0a5-17da9b57be27.png)
ディスク上のサイズが75MBから46MBに圧縮されたため読み込み量が少なくなった
レンタル鯖でSQLを模似的に公開した話(ポエム)

# レンタル鯖でSQLを模似的に公開した話(ポエム)

### 動機
無料枠などを気にせず自由に使えるリレーショナルデータベースが欲しい！
できれば無料で！

そんな時に、在学中はレンタルサーバーの料金が、クレカなし(学生だからね)かつ無料というのを見つけました。


https://prtimes.jp/main/html/rd/p/000000114.000076849.html

本当にありがたいです。大人になったら恩返しをしなければいけませんね。

有名なGCやAWSは無料枠がある程度ありますが、クレカ登録が必須なので、学生は手が出しづらいです。

### 問題点

問題点はあくまでもレンタルサーバーであるということです。VPSだったら当たり前にできるようなポート解放ができないので、Webサービスなどに利用することは基本できません。
最初は、SSHを繋いで開発サーバーとして利用したりAIの学習を長時間するのに利用しようかと思っていました。

### ちょっとした工夫

もどかしいのが、WordPress用のインフラとしてMariaDBが初めから提供されていることです。
そこで、WordPress用のAPI作成機能を使って、SQLサーバーのラッパーを作成するというアイデアを思いつきました。
phpはほとんど知らず、興味もないのでAIにコードを書かせました。

あとは、SQLインジェクションをどう防ぐかです。

### SQLインジェクション対策

まずは、内部を透明化するためにログ機能を用意しました。ログを取っておいたら何かあった時に気づきやすいです。

logテーブルを用意して、タイムスタンプ・実行したクエリ・リクエストの詳細(ipアドレスなど)を保存しておきます。

次に、ランダムな文字列で構成したトークンを必要とします。これで基本破られることはないでしょう。

### おわりに

セキュリティが少し不安ですが、無事DBを手に入れることができました。
私たち学生に投資してくださった大人たちに感謝しつつ、これを使ってたくさんアプリを開発していきたいと思います。
社内で“速読会”を開催してみたら、とても良かった話

こんにちは。  
今回は、社内で勉強会として「速読会」を開催してみたので、そのレポートをお届けします！

## そもそも速読会って？

きっかけは、ログラスさんの速読会に関する記事を見たことでした。
詳細は以下

https://note.com/yuusuke_o/n/nc3898296553d

https://note.com/takumi_shihoya/n/neeacbdcf2bdf

個人的に友人と試してみたら思いのほか良くて、これは社内でもやってみよう！ということで、社内の UIUX タスクチームの勉強会で実施してみました。

## 速読会の進め方

やることとしては上記ブログに書いてある通りですが、簡単にいうと以下の流れです。

1. 読みたい本を各自で持参
2. 2 人 1 組のペアを作る
3. 1 冊の本を 15 分で読む
4. 2 分半でお互いに内容を説明し合う
5. 本を交換し、もう 1 冊を 15 分で読む
6. 再び 2 分半で説明し合う

ポイントは、人に説明することを前提に読まないといけないことだと思います。  
説明できるだけの理解・落とし込みが必要なので理解が深まります。

## 参加者のリアルな声

- 思ったより 15 分で読めるもんなんだ
- 積読してた本を消化する良いきっかけになった
- 脳がめちゃくちゃ疲れる！
- 本によって向き不向きがあるかも
  - 一貫して同じメッセージを伝えているような本は速読に向いてそう
  - 学習本などは難しそう

## 開催してみての気づき

他に僕自身が感じたメリットはこちらです。

#### **準備がいらない！**

定期的に勉強会を開催していますが、準備が必要なのがネックになっていました。メンバーの業務状況によっては、勉強会の準備どころではないことも多いので、こうした全く準備が不要な形式はとても良いと思いました。

#### **インプットとアウトプットの同時トレーニング**

短時間で内容を読み取り、それを相手に伝えるというプロセスが、とても良いトレーニングになると思いました。
限られた時間で要点を掴み、わかりやすく伝える力は、まさにビジネスに直結する重要なスキルです。
短時間でのインプット＆アウトプットは、脳にちょうど良い負荷がかかる、実践的なトレーニングだと感じました。

#### **ブルーライトから解放される**

個人的にですが、ブルーライトから一次的に離れられるのも良いなと思いました笑

## まとめ

今回初めて社内で速読会を実施してみましたが、想像以上に好評でした！  
勉強会のネタが尽きたときにもぴったりなので、今後も定期的に取り入れていきたいと思います。

気軽に始められて、アウトプット力や集中力も鍛えられる速読会、あなたのチームでも試してみてはいかがでしょうか？
個人的備忘録：PythonのFlaskにハマったので、自分用のメモ書きとしてアウトプットしてみた

## はじめに
Flaskは、Pythonで書かれた軽量なWebアプリケーションフレームワークです。

:::note info
**シンプルな構造と柔軟性を持ち、学習用途から本番環境まで幅広く利用されています。**
:::

この備忘録では、Flaskの基本的な使い方を中心に、開発時によく使う設定や機能についてまとめています。

## 書こうと思ったきっかけ
小規模なWeb APIやフォーム送信機能を素早く試したいと考えたときに、Flaskが最適であると感じました。特にバックエンドの構造を学び直す際に、Flaskのシンプルさが理解の助けになったため、忘れないように個人メモとして記録しています。

## Flaskの特徴
- 軽量で学習コストが低い
- ルーティングやテンプレート機能が標準で備わっている
- 拡張が豊富（例：Flask-Login, Flask-WTF, Flask-CORS）
- 最小構成での起動が可能

**参考文献**

https://aiacademy.jp/media/?p=57

## 最小構成のサンプルコード
```python
from flask import Flask

app = Flask(__name__)

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

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

## よく使うルーティングパターン
```python
@app.route('/hello/<name>')
def hello_name(name):
    return f'Hello, {name}!'
```

## テンプレートを使う（Jinja2）
```python
from flask import render_template

@app.route('/welcome')
def welcome():
    return render_template('welcome.html', user="User")
```

`templates/welcome.html`
```html
<h1>ようこそ、{{ user }}さん！</h1>
```

## フォーム送信を受け取る
```python
from flask import request

@app.route('/submit', methods=['POST'])
def submit():
    data = request.form['data']
    return f'送信された内容: {data}'
```

## 実行方法
```bash
export FLASK_APP=app.py
export FLASK_ENV=development
flask run
```

## まとめ
Flaskは、Web開発の入り口としても、プロトタイピングのツールとしても非常に優れたフレームワークです。

:::note warn
***Pythonの文法に馴染みがある方であれば、直感的に使いこなすことができるはずです。***
:::

将来的には、Flask拡張機能の使い方や大規模構成のベストプラクティスも学んでいきたいと考えています！
【ChatGPT＋4o Image Generation】を使えば、DALL-E3では出てこなかった画像が出てきます、というお話｡


　どうも、カーブミラーです。

　今回は、4o Image Generationを使えば、DALL-E3では出てこなかった画像が出てきます、というお話です。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はあります。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　まずは、ニュースです。

　サムが悲鳴を上げてます😅
　　[サム・アルトマンポスト](https://x.com/sama/status/1906210479695126886?t=JptNKMxXJdofdDLrXSWPvA&s=19)
***（ChatGPT翻訳）***
お願いだからちょっと画像生成おさえてくれない！？
マジでこれはヤバい…うちのチーム、寝かせてあげて…！
***

　まぁ、わかります。
　　この4o Image Generationは
　　　これまでのDALL-E3とは
　　　　隔絶な進化を遂げていて
　　　　　面白いほどに
　　　　　　Promptに忠実なのだから。

　　しかも、
　　　世界中で
　　　　愛されている
　　　　　スタジオジブリ風の画像が
　　　　　　出てくるとあれば。

　　サムさえも
　　　X-Twitterのプロフィールの
　　　　アイコンを
　　　　　ジブリ風に変えてますから。

　でも
　　DALL-E3の絵も捨てがたいんです。

　　だからそういう人は
　　　GPTsのDALL-Eを
　　　　使いましょう。

　　これまでの
　　　Promptが
　　　　そのまま使えます。
***
　では、【本題】です。

　今回は、
　　4o Image Generationを使えば、
　　　DALL-E3では出てこなかった
　　　　画像が出てきます、というお話｡

　これまで
　　DALL-E3では、
　　　苦労していた画像が
　　　　ありますよね。

　例えば、
　　炬燵（こたつ）です。

　　単純なんですが
　　　とても苦労しても
　　　　ガチャ要素がありました。

　ところが
　　4o Image Generationでは
　　　苦労はいらなくなりました。

　“こたつ”と書けば
　　出てきます。

　いくつか
　　ごらんいただきましょう。

“こたつ（みかんを食べる女性）”
![1743396058409.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/14e18960-1f85-4483-afdf-0e95f509e822.jpeg)

“ジェンガ（スタート時）”
![1743396111758.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/688e6d5e-e8f5-4488-b3a7-0f96514c038c.jpeg)

“十二単衣（立ち姿）”
![1743396084913.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/2f5a300d-8ccc-4e9f-bdcc-b679779b03c8.jpeg)


　これらは
　　確認されているだけですが、
　　　単純な単語や
　　　　ちょっと加えただけの
　　　　　画像です。

　DALL-E3で出なかったのは
　　GPT-4oが知っていても
　　　DALL-E3が知らなかったから。

　だから
　　出なかった。

　しかし、4o Image Generationは
　　GPT-4oが知っているものを
　　　描くことが可能なのです。

　もちろん、
　　GPT-4oが知らないものも
　　　あるでしょう。

　それでも
　　伝える苦労は減るはずです。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
***
　PS 
　　画像のダウンロードですが、
　　　PNGだったのが
　　　　WebPに戻りました。
エンジニア1年目を振り返る| 1年目で得た学び5選！

## はじめに
僕は新卒で入社した1年目を終えたばかりのエンジニアです。
2025年の4月からは2年目に突入します。

最初は右も左も分からず、「ついていけないんじゃないか」と不安に思うことも多かったですが、1年を通して少しずつ成長を実感しています!

本記事では、エンジニア1年目を振り返り、これから1年目を迎える方に向けて、1年目で得た学び5選を共有したいと思います。

## 1年目で得た学び5選

### 1. 質問することを恐れない

僕も陥りがちですが、「これくらい1人でこなせないと。。」「上司の業務を邪魔しちゃ悪いな。。」といった気持ちから質問を遠慮するということはありませんか？

もちろん、自力で考える力も大切ですが質問するということはもっと大切です。
質問を遠慮した結果、取り返しのつかないミスをしてしまっては元も子もないですし、質問をすることで作業時間短縮にも繋がります。<br>
ですので、1年目は上司に嫌われるくらい質問するべきだと考えます。

ただ、質問する時は以下の点を意識することが大切です。
- **初めに「今お時間よろしいでしょうか？」**（○分程度を付けているとより良い）
- **結論から話す**
- **メモを取る**
- **なるべく自分なりの意見を添える**
- **感謝の意を示す**

上記を意識することで、効果的にコミュニケーションを取ることができます。<br>
エンジニアの質問内容は難しい上、僕は自分なりの意見を添えるということが苦手なので、**質問前に文章で聞きたいこと・考えをまとめてから**質問を行っていました。

自分なりの意見を添えるということは、上司の回答の負担も減らすことができ、頭の中の整理にも繋がるため1番大事なことだと思います。

### 2. 報連相はしっかりと

2つ目は「報連相」です。<br>
1年目の社員に求められるものは技術力ではなく、**円滑なコミュニケーションと仕事を進める姿勢**です。

どんなに優れたスキルがあっても、報告・連絡・相談が適切にできていなければ、業務の進行に支障をきたします。

例えば、「進捗が遅れているのに報告しない」「分からないことを相談せず自己判断する」といった行動は、チームに迷惑をかけるだけでなく、自分自身の成長の機会を逃すことにも繋がります。

また、「報告」と聞くと完了したことだけを伝えがちですが、**途中経過や課題を共有する**ことも重要です。

```md
「〇〇を試しましたが、〇〇の点で詰まっています。次に〇〇を試そうと思っています」
```
という風に伝えることで、適切なアドバイスを受けやすくなり、結果的に仕事がスムーズに進みます。

報連相を意識し、適切なタイミングでコミュニケーションを取ることで、信頼関係が築かれ、仕事が円滑に進むようになると考えています。

### 3. 休みの日は仕事のことを考えない

この1年で仕事を続けていくには**休みの日はしっかり休む**ということが大切だと学びました。<br>
仕事をする中で、ある問題に直面した際に解決せず退勤するということが何度かありました。

モヤモヤしたまま退勤し、納期も迫っている中で焦りもあるとなると、休みの日まで仕事のことを考えてしまい精神的に疲れてしまいます。

しかし、そういった状況でも**意識的に仕事と距離を置く**ことが大切だと感じました。

実際に、休みの日に仕事のことを考え続けても、すぐに解決策が見つかるわけではなく、むしろ焦りや不安が増すばかりでした。<br>
一方で、仕事からしっかり離れてリフレッシュすることで翌営業日にスッキリした頭で考え直せることが何度かありました。

このことから、オンとオフの切り替えを大事にしながら、**無理なく仕事を続けること**が1年目にとって大事なことだと考えています。

### 4. 全てを完璧に理解しようとしない

エンジニアとして働き始めると、学ぶ量が多すぎて頭がパンクしてしまいそうになります。
特に、プログラミングの世界では新しい技術が次々と出てくるため、「キャッチアップし続けないと置いていかれるのでは？」という不安を感じることも多いです。

しかし、大事なことは「**目の前の仕事に必要なことから学ぶこと**」です。<br>
例えば、初めて触るフレームワークやツールについて、全体像を理解しようとするよりも、まずは業務で使う範囲を押さえることを優先した方が効率的でした。<br>
分からないことは一旦「**こういうものなんだな**」と割り切って考えることも重要です。

このことから、「今やっているタスクをこなすために、どこまで理解すれば良いか？」を考え、完璧を目指さずに「使いながら学ぶ」姿勢が重要だと感じました。

### 5. 他の人と自分を比べすぎない

1年目で同期がいれば、その人と自分を比べてしまいがちです。
優秀な同期がいることで、「自分はまだまだだな」と落ち込むこともあると思います。

しかし、「自分の成長ペース」と「他人の成長ペース」は違うのが当たり前です。<br>
特に、元々経験がある人や、得意分野が違う人と比べてしまうと、自信を無くしてしまうこともあります。

他の人と比べて負けたくないからモチベーションが上がるという人は良いですが、そうではなく自分を下げてしまうという人は「少し前の自分」と比べてみてはどうでしょうか？

前まで全く分かっていなかった内容・業務を今では難なくこなせていると**少しずつでも自分が成長していることに気付けます**。

ですので、他の人と比較するよりも自分の成長にフォーカスすることが大切だと考えています。

## まとめ
1年目は「**何もできないのが普通**」です。
最初は不安だらけでも、学び続けることで少しずつできることが増えていきます。

これからエンジニア1年目を迎える方にとって、本記事が少しでも参考になれば幸いです！
僕もまだまだ未熟者ですが、日々学びを増やして精進していきます！
CursorにおけるDatabricks MCPサーバーの活用

[Cursor](https://www.cursor.com/ja)良いですよね。そして、[MCP](https://docs.cursor.com/context/model-context-protocol)(Model Context Protocol)も気になっています。

https://zenn.dev/cloud_ace/articles/model-context-protocol

AI界のUSB-Cとな。

しかし、気になっているだけでは理解が進まないので実際に動かしてみようと思いネットを検索したら、すでにDatabricks MCPサーバーがいくつか公開されていました。

https://github.com/JustTryAI/databricks-mcp-server

https://github.com/RafaelCartenet/mcp-databricks-server

2つ目の方をCursorから使えるようにしてみます。

# 事前準備

アクセスするDatabricksワークスペースの以下の情報を収集しておきます。

- Databricksワークスペースのホスト名
- パーソナルアクセストークン
- SQLウェアハウスのID

# MCPサーバーの設定

`uv`がない場合はインストールします。

```sh
# MacOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
```

```sh
git clone https://github.com/RafaelCartenet/mcp-databricks-server.git
cd mcp-databricks-server
uv venv
source .venv/bin/activate
uv pip install -r requirements.txt
```

# Cursorの設定

```sh
touch ~/.cursor/mcp.json
```

Cursorのメニューの**設定 > Cursorの設定 > MCP**で **+ Add new global MCP server** をクリックして、以下のように設定します。私の場合は、`/Users/takaaki.yayoi/Workspace/databricks_mcp/mcp-databricks-server`に上のMCPサーバーを構成しています。

```json
{
    "mcpServers": {
        "databricks": {
            "command": "uv",
            "args": [
                "--directory",
                "/Users/takaaki.yayoi/Workspace/databricks_mcp/mcp-databricks-server",
                "run",
                "main.py"
            ],
            "env": {
                "DATABRICKS_HOST": "https://<Databricksワークスペースのホスト名>.cloud.databricks.com",
                "DATABRICKS_TOKEN": "<パーソナルアクセストークン>",
                "DATABRICKS_SQL_WAREHOUSE_ID": "<SQLウェアハウスID>"
            }
        }
    }
}
```

MCPサーバーが設定されました。

![Screenshot 2025-03-31 at 10.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bfaac484-dd52-4114-a391-334a1e014f51.png)

# 動作確認

チャットでDatabricksのデータに関する質問をしてみます。

![Screenshot 2025-03-31 at 10.34.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/07e833ee-c936-4721-bc53-d1e588b032c9.png)

![Screenshot 2025-03-31 at 15.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8ad8a3e0-2d59-4407-be25-29d8b13d0766.png)

![Screenshot 2025-03-31 at 15.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/061ad5e3-14a6-4446-82fa-2ebfeb93f73e.png)

これって、まさにUSBでお馴染みのプラグアンドプレイですね。面白い

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
whileで処理するより、パターンを|(パイプ)にまとめた方が見やすくなる話

# 【PowerShell】`while`で処理するより、パターンを`|(パイプ)`にまとめた方が見やすくなる話

こんにちは。サーバエンジニア1年目です。  
日々、PowerShellで業務効率化を試しているのですが、
今回は「**ループ処理じゃなくても複数の条件をまとめて処理できる**」という発見があったので、備忘録としてまとめてみました。

これまでは「複数の条件でデータを抜き出すにはループしかない」と思っていましたが
もっとシンプルに書けるやり方を紹介します

---
## やりたいこと
1か月分の日々のログがあって、2/1, 2/2, 2/3のみを抽出したい
``` log.

2/1,aaa
2/2,bbb
2/3,ccc
2/4,ddd
2/5,eee
```

↓抽出後
```結果.
2/1,aaa
2/2,bbb
2/3,ccc
```
---
## よくある書き方：`while`で1行ずつ処理するパターン


```powershell:while文の例.
$dates = @("2/1", "2/2", "2/3")
$lines = Get-Content "C:\logs\access.log"
$index = 0

while ($index -lt $lines.Count) {
    $line = $lines[$index]
    foreach ($date in $dates) {
        if ($line -like "*$date*") {
            Write-Output $line
            break
        }
    }
    $index++
}
```

このように、対象の日付を配列にまとめて1行ずつ確認する書き方は、これまでよく使っていました。
ですが、ループが重なっていて、あとから見返したときにちょっと分かりづらくなることもありました。

## スッキリした書き方：パターンを変数にまとめて一気に処理
```powershell:今後こう書きたい.
$pattern = '2/1|2/2|2/3'
Get-Content "C:\logs\access.log" | Select-String -Pattern $pattern
```
この方法を知って、「えっ、こんなに簡単にできるの？」と感動しました。
処理の意図がひと目でわかりやすいですし、日付を追加・削除するときも $pattern を書き換えるだけでOKです。

## なぜこの書き方が良いのか？
コードが短く、読みやすい

条件の追加・削除が簡単

ロジックが直線的でわかりやすい

Select-String を使うことで、さらに後続処理にもつなげやすい(ここ重要)

## おまけ：抽出したあとに処理を追加することも可能です
```powershell
$pattern = '2/1|2/2|2/3'
Get-Content "C:\logs\access.log" |
    Select-String -Pattern $pattern |
    ForEach-Object {
        $_.Line.ToUpper()
    }
```
たとえば上の例では、抽出したログをすべて大文字に変換しています。
このように、パイプ（|）を使えば、次の処理へ簡単につなげることができます。

## まとめ
これまで私は「一つの処理の中で複数の条件を使いたいときは、ループで一つずつチェックするしかない」と思い込んでいました。
ですが、今回のようにパターンを1つにまとめて Select-String を使えば、処理をもっと簡単に書けることがわかって、とても勉強になりました。

初心者なりに、こうした小さな工夫を積み重ねて、今後ももっと読みやすく、わかりやすいコードを書いていけるようになりたいと思います。
[世界一美しい数式] オイラーの等式の導出までの流れ

## オイラーの等式とは

$\mathrm{e}^{\mathrm{i}\pi}+1=0$ という等式のことです。世界一美しい数式とも呼ばれています。 

## 美しさの理由

- **円周率**$\pi$は「円における円周の長さ÷直径」などで定義され、その値は$\pi=3.141592\cdots$（無限に続く）です。
- **ネイピア数**$\mathrm{e}$は、「指数関数の微分が自分自身と一致するときの底
（つまり、$(\mathrm{e}^{x})^{\prime} = \mathrm{e}^{x}$となる）」などで定義され、その値は$\rm{e}=2.71828\cdots$（無限に続く）です。
- **虚数**$\rm{i}$ は$\sqrt{-1}$で定義され、数直線上にすらなく、感覚的には存在しない数のような気がします（それに対して、$\pi$と$\rm{e}$は数直線上にあります）。

これらの全く関係のないようにみえる3つの要素を組み合わせた後に、極めて一般的な数である1を足すだけで、何もないことを表す「0」になるのです。すごい！

[書籍：オイラーの贈物 人類の至宝e^iπ=-1を学ぶ (吉田 武)](https://www.amazon.co.jp/dp/448601863X)にも、`数学において最も重要な定数であるネイピア数eと円周率π、さらに、虚数単位iが見事に調和結合した極めて印象的な式`と記されています。

## オイラーの等式の導出までの流れ

オイラーの等式の導出の流れが、[同じ書籍](https://www.amazon.co.jp/dp/448601863X) に示されています。内容はそこまで難しくなく、順に理解していけば、必ず結論までたどり着くことができると思います。オイラーの等式を理解できたときは感動しました。

書籍の内容は素晴らしいのですが、オイラーの等式にたどり着くまでの流れの全体感が分かる地図のようなものがあればもっと良いと思って作ってみました（数学的な厳密さは多少犠牲にしています）。

それがこちらです。

![オイラーの等式.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571330/c7c6c080-58f4-4f57-9bbd-d4dbff83cfad.png)

一見関係ない下の4つが組み合わさって、黒色の箱で示したオイラーの等式「$\mathrm{e}^{\mathrm{i}\pi}+1=0$」になるのはやっぱり美しい。

- 青色: 三角関数や円周率関係
- 赤色: 微分積分関係
- 緑色: ネイピア数関係
- オレンジ色: 虚数関係

## 参考
[こちらの記事](https://qiita.com/koher/items/05a31a8ca28653dc4bdb)もとても面白かったです。
もしも円周率が$\pi$=円周÷直径=$3.14\cdots$ではなく、
$\tau$=円周÷半径=$6.28\cdots$で定義されていたら、オイラーの等式

$\mathrm{e}^{\mathrm{i}\tau}=1$

のようになります。
ホテルの問い合わせへの返信をGPTで生成する

# はじめに
妻がやっているホテルの問い合わせ対応について、GPTで返信内容を生成すること試みる。

# 手法の検討
GPTを使ってホテルへの問い合わせの返信内容を自動生成するには、ホテルの独自情報を上手くGPTに与える必要がある。
代表的な方法としてプロンプトで毎回ホテル情報を渡す方法とRAG（情報検索付き生成）がある。

## プロンプトでホテル情報を渡す
タイトルそのまんま。以下のようなイメージ
```plaintext
ホテル情報：
- ホテル名：ランタンホテル
- チェックイン：14:00、チェックアウト：12:00
- アーリーチェックイン：当日の空き状況によって可能（追加料金あり）
- 朝食：無料で含まれています（6:30〜10:00）
- 空港送迎：有料で手配可能（要予約）

お客様からの質問：「アーリーチェックインは可能ですか？」

→ 上記の情報に基づき、自然な返信文を日本語で作成してください。
```

✅ メリット：
実装が簡単
ファイルの情報をメンテナンスするだけでOK

⚠️ デメリット：
情報量が多くなると、プロンプトに入りきらなくなる（GPT-3.5で4,000トークン、GPT-4で8,000〜128,000まで可能）

## RAG（情報検索付き生成）
RAGは「情報を全部渡すのではなく、必要な部分だけ探して渡す」というアプローチ。
この「探す（検索）」部分を、ベクトル検索（例：FAISSやWeaviate）で行う。

具体的なフローとしては、以下のようになる。
ホテルの詳細情報をあらかじめベクトルデータに変換（埋め込み）
問い合わせが来たら、最適な情報を検索
検索結果＋問い合わせをGPTに渡して、自然な返信を生成
これにより、GPTは「記憶してない情報」でも検索して答えることができる。

こんなときに有効：
情報量が多い（何百ページ分など）
問い合わせの内容が多様・自由形式
部屋ごとの違い、周辺観光地情報、スタッフの紹介など

![スクリーンショット 2025-03-31 5.43.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136239/28ad5b85-0b06-4c3e-aff4-cbc9b505045e.png)

## どっちを使う？
今回想定している情報量だと前者の方法で十分そうだが、一旦両方試して比較してみる。
また、いずれの手法にせよ、ホテル情報を自然言語でまとめたものは必要になるのでその準備を進める。

# ホテル情報をまとめる
既にまとまっているホテル情報として、以下があった
* 問い合わせ対応のテンプレートがスプレッドシートにある
  * ![スクリーンショット 2025-03-31 5.41.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136239/cc8dac3d-94a6-45d6-b665-aa17f4c04985.png)
* FAQがWebサイトにある
  * https://neo-hospitality.com/ja/faq

ので、一旦これらをGPTに投げて、ホテル情報を上手く抽出してもらうことにする。
いい感じに結果が得られた↓
![スクリーンショット 2025-03-31 5.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136239/79f2e44a-086a-48fc-b2ee-6dc088d93e84.png)

# 問い合わせへの回答を生成してみる
今回は「空港からホテルまでの移動手段を教えてください。また、無料の送迎サービスはありますか？」という問い合わせへの返信を行うケースで試してみる。

## プロンプトにホテル情報を全て入れる方法
### プロンプト
```
以下はLantern hotelに関する情報です。
~~~
~~~

お客様からの問い合わせ：
「~~~~~~~」

この情報に基づき、丁寧で温かみのある日本語の返信文を作成してください。
```

### 得られた結果
いい感じの回答。
![スクリーンショット 2025-03-31 6.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136239/65b3c7e0-0f68-4ec6-8b6c-96ea8a46b56a.png)

## RAGを活用して必要な情報のみをプロンプトに入れる方法
※ ベクトル化の手法等はGPTに聞いたもののをそのままコピペして試したので割愛
### プロンプト
上位のホテル情報を全て入れる方法と基本同じで、RAGで関連チャンクとして検索された情報のみを渡す形に変更。

### 得られた結果
先の方法と大きく変わりがない。結果としてプロンプトがほぼ同じわけなので当然か。
![スクリーンショット 2025-03-31 10.45.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136239/ee08c119-495b-40e6-885f-2dec52ed169f.png)

↓関連チャンク（検索結果）
```
- 送迎サービス: 空港送迎をご希望の場合は、4人乗り車で500,000ドンの料金で手配可能です。便名・到着時間・荷物の数を事前にご連絡ください。ドライバーは空港の所定の場所でネームボードを持ってお待ちしております(空港の出口は１箇所のみとなっております)。万が一ドライバーと合流できない場合や移動中に何かあった場合は、メールや電話で当ホテルのフロントスタッフまでお気軽にご連絡ください。。
- 空港からのアクセス: 空港からの移動には、MaiLinh（緑）やVinasun（白）のタクシーが安全で便利です。運賃は約220,000ドンです。個人タクシーのGrabアプリの利用も可能で、そちらは約150,000ドンです。ご滞在中のタクシー手配はフロントにて承ります。
- 空港からホテルまでのバス路線: バスでのアクセスも可能です。152番（5:15〜19:00, 20分間隔, 5,000VND）または109番（5:30〜22:15, 50分間隔, 15,000VND）をご利用ください。いずれも空港国内線のBターミナルからの乗車になります。下車はNew Worldホテル周辺で、そこから徒歩3分ほどで当ホテルです。スーツケース等の大きな荷物がある場合はもう一つの切符を買う必要があり、乗車賃は2倍になります。
```

# まとめ
必要な情報が多くないのであればプロンプトに全て突っ込んでしまった方が楽。一方でAPIを使う場合はプロンプトが長いと料金が上がってしまうのと、そもそもプロンプトに入れられないほどの情報量を扱いたい場合はRAGが有効そう。
アリババクラウド、Qwen2.5-Omni-7Bをリリース - エンドツーエンドのマルチモーダルAIモデル

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/alibaba-cloud-releases-qwen2-5-omni-7b-an-end-to-end-multimodal-ai-model_602095?spm=a2c65.11461433.0.0.4ee35355bCemAJ)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# Qwen2.5-Omni-7B: 統合型エンドツーエンドのマルチモーダルAIモデル

![Qwen_spring](https://yqintl.alicdn.com/66e2e2c23593b249a466ff410728329c573ad89b.png)  
*generated by chat.qwen.ai*

Alibaba Cloudは、Qwenシリーズの統合型エンドツーエンドのマルチモーダルモデル「Qwen2.5-Omni-7B」をリリースしました。包括的なマルチモーダル認識のために独自に設計されたこのモデルは、テキスト、画像、音声、動画といった多様な入力を処理し、リアルタイムでテキストや自然な音声応答を生成することができます。これにより、スマートフォンやラップトップなどのエッジデバイス向けに最適化されたマルチモーダルAIの新しい基準が確立されました。コンパクトな7Bパラメータ設計でありながら、Qwen2.5-Omni-7Bは妥協のないパフォーマンスと強力なマルチモーダル機能を提供します。このユニークな組み合わせにより、特にインテリジェントな音声アプリケーションにおいて、俊敏でコスト効率の高いAIエージェントを開発するための理想的な基盤となっています。例えば、このモデルは視覚障害のあるユーザーが環境をナビゲートするのに役立つリアルタイムの音声説明を提供したり、動画の材料を分析して段階的な料理指導を行ったり、顧客のニーズを本当に理解できるインテリジェントなカスタマーサービス対話を実現するために活用できます。

このモデルは現在、[Hugging Face](https://github.com/QwenLM/Qwen2.5-Omni) および [GitHub](https://github.com/QwenLM/Qwen2.5-Omni) でオープンソースとして公開されています。また、[Qwen Chat](https://chat.qwen.ai/) やAlibaba CloudのオープンソースコミュニティであるModelScopeでもアクセス可能です。過去数年間で、Alibaba Cloudは200以上の生成AIモデルをオープンソース化してきました。

## 創造的なアーキテクチャによる高性能

Qwen2.5-Omni-7Bは、すべてのモダリティ（形態）で顕著なパフォーマンスを発揮し、同規模の専門的な単一モダリティモデルに匹敵します。特に、リアルタイム音声インタラクション、自然で堅牢な音声生成、そしてエンドツーエンドの音声指示の遵守において新たなベンチマークを打ち立てています。その効率性と高性能は、革新的なアーキテクチャに由来しています。これには以下が含まれます：

- **Thinker-Talker Architecture**：異なるモダリティ間の干渉を最小限に抑えるために、テキスト生成（Thinker経由）と音声合成（Talker経由）を分離することで高品質な出力を実現します。
- **TMRoPE（Time-aligned Multimodal RoPE）**：ビデオ入力と音声をより適切に同期させるための位置エンベディング技術で、一貫したコンテンツ生成を可能にします。
- **Block-wise Streaming Processing**：低遅延の音声応答を可能にし、シームレスな音声インタラクションを実現します。

[Qwen2.5-Omni-7B sets a new standard for optimal deployable multimodal AI for edge devices](https://youtu.be/762UIspGICA)

## コンパクトなサイズにもかかわらず優れたパフォーマンス

Qwen2.5-Omni-7Bは、画像-テキスト、動画-テキスト、動画-音声、音声-テキスト、テキストデータなど、広範で多様なデータセットで事前学習されており、タスク全体で堅牢なパフォーマンスを確保しています。革新的なアーキテクチャと高品質な事前学習データセットにより、このモデルは音声コマンドの遵守において純粋なテキスト入力に匹敵するパフォーマンスを達成しています。視覚、音響、テキスト入力を認識し、解釈し、推論する能力を評価するOmniBenchのようなタスクでは、Qwen2.5-Omniは最先端のパフォーマンスを示します。

さらに、Qwen2.5-Omni-7Bはインコンテキスト学習（ICL）を通じて、堅牢な音声理解と生成能力において高いパフォーマンスを発揮します。また、強化学習（RL）による最適化後、Qwen2.5-Omni-7Bは生成の安定性が大幅に向上し、注意のミスアライメント、発音エラー、不適切な一時停止が大幅に減少しました。

![bar](https://yqintl.alicdn.com/75799520aef3bf2e45ba69dc364382e577b33227.png)

Alibaba Cloudは昨年9月にQwen2.5を発表し、今年1月には[Qwen2.5-Max](https://www.alizila.com/alibaba-clouds-qwen2-5-max-secures-top-rankinks-in-chatbot-arena/)をリリースしました。これはChatbot Arenaで7位にランクされ、他のトップクラスの独自LLMと肩を並べる卓越した能力を示しました。また、Alibaba Cloudは、高度な視覚理解と長文コンテキスト入力処理のための[Qwen2.5-VLおよびQwen2.5-1M](https://www.alizila.com/alibaba-cloud-releases-latest-ai-models-for-enhanced-visual-understanding-and-long-context-inputs/)もオープンソース化しています。

この記事は元々、Crystal Liuによって執筆され、[Alizila](https://www.alizila.com/alibaba-cloud-releases-qwen2-5-omni-7b-an-end-to-end-multimodal-ai-model/)に掲載されました。
フェード効果付きスライドショーをタイマーで作る


## 動画も公開しました
こめIndexのエラー対策ためIsBlank関数で空のテーブル判定をしていましたが、
正しくはIsEmptyで判定しなくてはいけませんでした。
動画も修正して再公開しました。
<iframe width="560" height="400" src="https://www.youtube.com/embed/Om849_DHGFs?si=DntHrVaZAnZlVzSd" 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>

▼画面のOnVisibleプロパティ
```java
ClearCollect(imagelist,データソース);//リストをコレクションに格納
Set(_count,1)//カウンタをリセット
```

配置するコントロールは最小構成で
画像２つ、図形（白四角で背景）１つ、タイマー２つです。

それぞれの設定を以下に記します。

## Timer_1

▽ディスプレイ
▼期間(Duration)
3000//3秒・フェードの時間

▼自動開始オン
▼繰り返しオフ
▼自動一時停止オフ

▽詳細設定
▼OnTimerEnd
```java
Set(_timer2start,false); //タイマー2のstart用変数をfalse
Set(_timer2start,true);  //タイマー2のstart用変数をtrue
If(
    _count < CountRows(col_image), 
    //カウントがコレクションのレコード数より小さい時、カウントを1増やす
    Set(
        _count,
        _count + 1
    ),
    //カウントがコレクションのレコード数以上の時、カウントを1にする
    Set(
        _count,
        1
    )
);

```

▼OnTimerStart
```java
If(
    _count < CountRows(col_image),
    //▽カウントが画像の枚数未満だったら_image2に次のレコードを準備
    Set(
        _image2,
        //▽このIfはアプリ起動時のIndex関数のエラー回避
        If(
            !IsEmpty(col_image),
            //Index関数でコレクションから次のレコードを取得
            Index(
                col_image,
                _count + 1
            )
        )
    ),
    //▽カウントが画像の枚数以上になったら_image2に一番初めのレコードを格納
    Set(
        _image2,
        //▽このIfはアプリ起動時のIndex関数のエラー回避
        If(
            !IsEmpty(col_image),
            //Index関数で一番初めのレコードを取得
            Index(
                col_image,
                1
            )
        )
    )
)
```

▼Start
```java
_timer1start
```


## Timer_2
▽ディスプレイ
▼期間(Duration)
3000//3秒・画像表示時間
▼自動開始オフ
▼繰り返しオフ
▼自動定置時停止オフ


▽詳細設定
▼OnTimerEnd
```java
Reset(Timer_1);         //タイマー１をリセット
Set(_timer1start,false); //一度変数をfalseにする
Set(_timer1start,true);  //変数をtrueにしてタイマー1をスタート
```
▼Start
```java
_timer2start
```


## Image_1
▽Image
```java
If(!IsEmpty(imagelist),Index(imagelist,_count).jpg.Large
```

▽Transparency
```java
Timer_1.Value/Timer1_1.Duration //タイマー１が進むと透明になる
```
## Image_2
▽Imageプロパティ
```java
_image2.jpg.Large //タイマー１のOnTimerStartプロパティで設定
```

▽Transparency
```java
1-Timer1_1.Value/Timer1_1.Duration //タイマー1が進むと出てくる
```

以上で設定は終了です。

Image_1で表示している画像をTimer_1の経過時間で透明にしていき、
次の画像を表示しているImage_2を逆に透明から表示していきます。

![スライドショー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/50d824d6-7a0e-498c-b25c-03a12c71fafc.gif)
うまくいけばこのようにフェード効果付きのスライドショーが表示されます。
ぜひお試しください。
個人的備忘録：PythonのDjangoにハマったので、自分用のメモ書きとしてアウトプットしてみた

## はじめに
DjangoはPythonで書かれた高機能なWebフレームワークです。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

認証機能や管理画面、ORMなどが標準搭載されており、素早く堅牢なWebアプリケーションを開発するのに適しています。

## 書こうと思ったきっかけ
Flaskと比べて、Djangoは機能が多く設計も独特なため、最初に使ったときは戸惑いました。

チュートリアルを一通り終えた後、実際にアプリを作っていく中で気づいたことや、よく使うコマンド・設定を備忘録としてまとめておきたいと思いました。

## Djangoの特徴
- 管理画面（Admin）が最初から用意されている
- 認証、ユーザー管理、メール送信などの機能も内蔵
- データベースとのやり取りはORM（Object Relational Mapping）で簡単
- 設定が分かりやすく、プロジェクト単位で管理しやすい
- 豊富な公式ドキュメントと活発なコミュニティ

## よく使うコマンド
```bash
# プロジェクト作成
django-admin startproject myproject

# アプリ作成
python manage.py startapp myapp

# サーバー起動
python manage.py runserver

# マイグレーション作成と実行
python manage.py makemigrations
python manage.py migrate

# 管理ユーザー作成
python manage.py createsuperuser
```

**関連記事**

https://qiita.com/free-honda/items/6a55e83ac275cf67f9e4

## ファイル構成（例）
```
myproject/
├── manage.py
├── myproject/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── myapp/
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   ├── views.py
│   └── urls.py
```

**関連記事**

https://qiita.com/free-honda/items/b489cfab873861392de0

## まとめ
Djangoは最初からたくさんの機能が使えるため、プロトタイピングから本番運用まで幅広く活用できます。

:::note warn
**習得のハードルは少し高めですが、慣れると作業効率が格段に上がります。**
:::

特に管理画面や認証機能の自動生成などは、業務システムのような用途で非常に便利です。

今後もDjangoで実践しながら学びを深めていきたいと思います！