OmniAICreator/Qiita-1.07M huggingface dataset:
【AutoHotkey v2】#include を自動化する

コードが増えてきたのでファイルを分割したのだが、ファイルを増やす度に#includeを追加するのが面倒くさい。

```autohotkey:index.ahk
#Requires AutoHotkey v2.0

#include *i C:\Users\smicle\AutoHotkey\src\system.ahk
#include *i C:\Users\smicle\AutoHotkey\src\key\composite.ahk
#include *i C:\Users\smicle\AutoHotkey\src\key\disable.ahk
#include *i C:\Users\smicle\AutoHotkey\src\key\swap.ahk
#include *i C:\Users\smicle\AutoHotkey\src\util\execute.ahk
#include *i C:\Users\smicle\AutoHotkey\src\util\move.ahk
```

### ディレクトリ構造

```
AutoHotkey/
 └src/
 ｜└key/
 ｜｜└composite.ahk
 ｜｜└disable.ahk
 ｜｜└swap.ahk
 ｜└util/
 ｜｜└execute.ahk
 ｜｜└move.ahk
 ｜└system.ahk
 └index.ahk
```


## ループを用いてincludeするコードを書いてみた

```AutoHotkey:index.ahk
#Requires AutoHotkey v2.0

Loop Files, A_WorkingDir "\src\*.ahk", "R" {
  #include *i A_LoopFilePath
}
```

うまく読み込まれない…

```AutoHotkey:index.ahk
#Requires AutoHotkey v2.0

Loop Files, A_WorkingDir "\src\*.ahk", "R" {
  MsgBox A_LoopFilePath
}
```

`MsgBox`ではちゃんと表示されるのにincludeしようとすると上手く読み込まれない…


## #include はスクリプトの実行前に実行されるため、ループなどの一部に使用することはできません

とのことです。


## includeするファイルを自動的に作成し、それを読み込む事で擬似的に再現できるらしい

予め`include.ahk`を設置します。

```AutoHotkey:index.ahk
#Requires AutoHotkey v2.0

Create_Includes_File

#include *i include.ahk


Create_Includes_File() {
	path := A_WorkingDir "\include.ahk"

	currentIncludes := FileRead(path, "`n UTF-8")
	newIncludes := Create_Includes_List()

	if (currentIncludes != newIncludes) {
		Write_Includes_File(path, newIncludes)
	}
}

Create_Includes_List() {
	includes := "#Requires AutoHotkey v2.0`n`n"
	Loop Files, A_WorkingDir "\src\*.ahk", "R" {
		includes .= "#include *i " A_LoopFilePath "`n"
	}
	return includes
}

Write_Includes_File(path, includes) {
	_file := FileOpen(path, "w`n")
	_file.Write(includes)
	_file.Close()
	Reload()
	Exit()
}
```

```autohotkey:include.ahk
#Requires AutoHotkey v2.0

#include *i C:\Users\smicle\AutoHotkey\src\system.ahk
#include *i C:\Users\smicle\AutoHotkey\src\key\composite.ahk
#include *i C:\Users\smicle\AutoHotkey\src\key\disable.ahk
#include *i C:\Users\smicle\AutoHotkey\src\key\swap.ahk
#include *i C:\Users\smicle\AutoHotkey\src\util\execute.ahk
#include *i C:\Users\smicle\AutoHotkey\src\util\move.ahk
```


内容としては冒頭の`index.ahk`と同様のコードを`include.ahk`という名前で作成しincludeするようにしています。
無限に再帰しないよう`include.ahk`の中身とループで作成したincludeを比較し、値が一致していない場合のみ`include.ahk`の中身を書き換えて再度実行します。
ファイルが増えたり名前が変わったりした場合だけ2回実行される感じです。


## まとめ

#include が動的に実行されないので、include用ファイルの作成と読み込みを1つにまとめることになりました。
多少ごちゃついてますが基本的には変更しないので問題ないかなという感じです。


## 参考文献
[How to batch import ahk scripts using 'Loop Files'? - AutoHotkey Community](https://www.autohotkey.com/boards/viewtopic.php?t=116070)
[Loop - 構文と使用法｜AutoHotkey v2](https://ahkscript.github.io/ja/docs/v2/lib/Loop.htm)
[#include / #IncludeAgain - 構文と使用法｜AutoHotkey v2](https://ahkscript.github.io/ja/docs/v2/lib/_Include.htm)
Databricksのカスタム計算

以前、こちらの記事を書きました。

https://qiita.com/taka_yayoi/items/bfe7db810dc80fa38c59

久々にマニュアルを見たらタイトルが変わっていました。**カスタム計算**(Custom Calculations)に。

https://docs.databricks.com/aws/ja/dashboards/datasets/custom-calculations

以前の計算メジャーは存在しています。新たに**計算ディメンション**が追加され、それらをまとめてカスタム計算という名前になったというわけです。(日本語訳が若干微妙なのは承知ですが、他の訳が考えつきません…)

で、計算メジャーと計算ディメンションが何かと言いますと:

- **計算メジャー:** 総売上高や平均コストなどの集計値。レコードグループに対して集計関数が動的に適用されて集計値が計算されます。
- **計算ディメンション:** 年齢グループのように、各レコードにCASE文などを適用して新たなカラムが動的に生成されます。

試してみます。

ダッシュボードのデータタブにアクセスすると、以前は計算メジャーだったところがカスタム計算に変化しています。
![Screenshot 2025-05-08 at 16.37.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1bfd1443-f685-45de-ac22-9626255d2bbd.png)

以下のように設定して、計算メジャーを作成します。しかし、以前は`try_divide`も無かった気がします。
![Screenshot 2025-05-08 at 16.39.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c32ff89e-40e4-43c4-b7ea-63997c746514.png)

計算メジャーが追加されました。
![Screenshot 2025-05-08 at 16.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e071a158-1e86-48af-8ed0-b9ddaa910c82.png)

次に計算ディメンションを作成します。

- **名前**: distance_group
- **コメント**: trip_distanceのグルーピング
- **式**:

```sql
CASE
   WHEN trip_distance < 1 THEN '<1'
   WHEN trip_distance >= 1 AND trip_distance < 5 THEN '1–5'
   WHEN trip_distance >= 5 AND trip_distance < 10 THEN '5–9'
   WHEN trip_distance >= 10 THEN '10+'
END
```

![Screenshot 2025-05-08 at 16.41.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/faa8ef6f-8304-4d8a-a783-135c29440bdd.png)

計算ディメンションは動的に生成される列としてスキーマに追加されます。
![Screenshot 2025-05-08 at 16.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/61f365de-1b9d-41af-9f48-e99b07776667.png)

なお、この時点ではテーブル上に計算ディメンションは表示されません。
![Screenshot 2025-05-08 at 16.43.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/92b349bc-7409-4b22-a297-3195238745cc.png)

キャンバスタブに移動してビジュアライゼーションを追加してきます。テーブルを追加すると、計算ディメンション`distance_group`が表示されます。
![Screenshot 2025-05-08 at 16.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c93bd0c5-6dcb-4196-becf-7b95e46199fe.png)

計算ディメンションでの集計も可能です。
![Trip Distance by Pickup Zip (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8951ff3f-ba65-4f97-98be-92760ae4b1ba.png)

計算ディメンションで集計した結果に基づいて、計算メジャーを計算することもできます。
![visualization.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/77b2be54-f613-4448-b192-768141207520.png)

様々な切り口で可視化を行うシーンで毎回クエリーを書き換えるのは手間なので、柔軟にロジックを組み合わせることができるカスタム計算をご活用ください！

### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Playwrightを使ってLPのスクリーンショットを取る

# ことはじめ
LPのチェックのためにVisualRegressionTestを導入したい！
でも表示しただけでスクリーンショット取ると画像が読み込まれていない！（Lozad.js使ってる）
画像を全部表示してスクリーンショットを取ろう！

```
test("スクリーンショット",async({ page, browserName})=> {
  test.setTimeout(120000);  // timeoutの時間を変更
  await page.setViewportSize({  // 画面サイズを変更
    width: 1920,
    height: 1080,
  });
  await page.goto(jsonData.url,{
    waitUntil:"domcontentloaded",
  });
  
  //imgタグの入っていないpictureタグを列挙し、それぞれの位置までスクロール
  const pics = await page.$$('picture:not(:has(img))');
  for(const pic of pics){
    await pic.scrollIntoViewIfNeeded();
  }

  //スクリーンショット取得（ぶらうざべつにｈ）
  await page.screenshot({
    path: `tests/screenshot/actual_${browserName}.png`,
    fullPage: true,
  });
});
```
なぜNetflixやAppleはRustとPostgreSQL、Icebergを使うのか？注目のデータスタックを解説

> 「現代のデータインフラ構築には構造的な変化が起きています。」
> 

LinkedIn、Apple、Netflix、Tencentなど、最先端のテック企業が選ぶデータ技術には、ある共通点があります。それは、リアルタイムかつ拡張性のあるパイプラインを実現するために、**Rust**、**PostgreSQL**、**Amazon S3**、**Apache Iceberg** を基盤として採用しているということです。

本記事では、これらの技術がなぜ注目されているのか、そして**RisingWave**がそれらをどのように統合しているのかを解説します。


## 🚀 Rust：パフォーマンスと安全性を両立する言語

Rustは、システムプログラミングの世界で急速に支持を集めている言語です。

- Stack Overflow 2024：最も支持された言語（83%）
- crates.io における1日あたりのダウンロード数：42,712
- 活発なコミュニティ：`r/rust`（322k）、`r/learnrust`（31k）、`r/rust_gamedev`（40k）
- AWS、Dropbox、Cloudflareをはじめ、各種データベースベンダーが採用

Rustは、メモリ安全性とゼロコスト抽象化を実現しながら、並行処理にも強く、スケーラブルなデータエンジンの実装に最適な言語です。
![Rust：パフォーマンスと安全性を両立する言語](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945294/e84218a3-5b84-4823-95b1-abcf38be4474.png)



## 🐘 PostgreSQL：信頼と拡張性に優れたSQLエンジン

PostgreSQLは、従来のOLTPデータベースを超えて、現代のデータスタックにおける「共通言語」として進化しています。

- DB-Engines 2024：3年連続「DBMS of the Year」受賞
- Stack Overflow 2024：48.7%の開発者が使用
- Spark、Flink、dbt、BIツールと高い互換性
- TimescaleDBやRisingWaveなどの次世代DBの基盤

PostgreSQLは成熟性と拡張性を兼ね備え、多くのデータ駆動型アプリケーションにとって理想的なリレーショナルレイヤーとなっています。
![PostgreSQL：信頼と拡張性に優れたSQLエンジン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945294/e1156de5-3741-4d82-bcc3-ba84ab7818d1.png)



## ☁️ Amazon S3：クラウド時代のデータストレージ標準

Amazon S3は、単なるストレージサービスを超えた「クラウドインフラの中核」です。

- 保存されているオブジェクト数：350兆以上
- 秒間リクエスト数：1億回超
- 耐久性：99.999999999%（11ナイン）
- 対応プロバイダ：MinIO、Cloudflare R2、DigitalOcean、IBM Cloudなど

高い可用性、スケーラビリティ、低コスト、API互換性により、S3は現代の分析・AI・ETL基盤に不可欠な存在となっています。
![Amazon S3：クラウド時代のデータストレージ標準](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945294/ff21c0f4-d658-4472-940e-c601bb085bb9.png)



## ❄️ Apache Iceberg：オープンデータレイクの新標準

Icebergは、大規模分析データの管理方式を再定義しつつあります。

- 採用企業：Netflix、Apple、AWS、Adobe、LinkedIn、Tencent、Pinterest
- エコシステムの拡大：Databricks（Tabularを買収）、Snowflake（Polaris Catalogを発表）、Dremio（Hybrid Iceberg Catalogを展開）
- 対応エンジン・サービス：Trino、BigQuery、Flink、StarRocks、Redpandaなど
- 特徴：バッチとストリーミングの統合、ゼロETL、オープンなデータ管理

Icebergは、単なるファイル形式ではなく、**ベンダーロックインを回避しながらシステム間の相互運用性を高めるオープンな契約モデル**として支持を集めています。
![Apache Iceberg：オープンデータレイクの新標準](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945294/66268722-1e73-4367-bfa3-af7fe9a60484.png)

## 💡 RisingWaveで統合された未来型データ基盤

[**RisingWave**](https://www.risingwave.com/) では、これらの技術スタックを1つのストリーミングデータベースに統合しています。

- **Rust**：高速かつ安全なデータ処理エンジンのコア
- **PostgreSQLプロトコル**：開発者にとって親しみやすく、エコシステムとの互換性も高い
- **S3**：スケーラブルかつ低コストなクラウドストレージ
- **Iceberg**：リアルタイムと履歴データの統一管理を可能にするテーブル形式

これにより、開発者はPostgreSQL風のSQLを使って、ロックインなしでリアルタイムデータをストリーミング・保存・分析できます。
ファッション最適化(日記)



##  目的関数の定義（Objective Function）

$$
\text{Score} = \frac{\text{Comfort} \times \text{Reaction Weight}}{\text{Price} \times \text{Wear Time}}
$$

### 🔸 各変数の意味

| 項目      | 記号表現 | 値の例                      | 備考              |
| ------- | ---- | ------------------------ | --------------- |
| 快適さ     | $C$  | $C \in \{10,\ 25,\ 50\}$ | 小さいほど不快、大きいほど快適 |
| 相手の反応重み | $R$  | $R \in \{0,\ 50,\ 100\}$ | 相手の評価に基づく重み付け   |
| 価格      | $P$  | $P \in [5000,\ 15000]$   | 円単位             |
| 着用時間    | $T$  | $T \in [5,\ 30]$         | 分単位             |

---

##  目的関数の数式展開

$$
\text{Score}(C, R, P, T) = \frac{C \cdot R}{P \cdot T}
$$

* **最大化したい：** $\text{Score}$
* **固定・選択パラメータ：** $C, R$ はユーザーや相手によって変化（ヒューリスティック or フィードバックにより変動）
* **設計可能な変数：** $P, T$ は比較的自分で調整可能なコストや条件（制約付き）

```Python
# -*- coding: utf-8 -*-
# Program Name: objective_function_P1000_T10.py
# 固定された価格と着用時間に基づいてスコアを計算する（快適さと反応の組み合わせ）

import pandas as pd

# --- 固定パラメータ / Fixed parameters ---
P = 1000   # 価格（円） / Price in yen
T = 10     # 着用時間（分） / Wear time in minutes

# --- 可変パラメータ / Comfort & Reaction levels ---
comfort_values = [10, 25, 50]         # 快適さ C
reaction_weights = [0, 50, 100]       # 反応重み R

# --- スコア関数 / Objective function ---
def compute_score(C, R, P, T):
    return (C * R) / (P * T)

# --- 計算 / Compute all combinations ---
results = []
for C in comfort_values:
    for R in reaction_weights:
        score = compute_score(C, R, P, T)
        results.append({
            'Comfort (C)': C,
            'Reaction (R)': R,
            'Price (P)': P,
            'Wear Time (T)': T,
            'Score': round(score, 6)
        })

# --- 結果表示 / Display result table ---
df = pd.DataFrame(results)
df_sorted = df.sort_values(by="Score", ascending=False)

from IPython.display import display
print("Score results (P = 1000 yen, T = 10 min):")
display(df_sorted)

```
MYSQLの起動の際のエラーの備忘録

## エラー詳細

MySQLを起動しようとしたら以下のようなエラーが出た。

```
Mysql.server start
Starting MySQL
.... ERROR! The server quit without updating PID file (/opt/homebrew/var/mysql/xxxxx.pid)
```

色々な解法を試してみたがどれもうまくいかなかった。


 ### 試したこと
 #### エラーファイルの削除
 ```　
 cd /opt/homebrew/var/mysql/
 rm xxxxx.err
 ```
起動しようとすると新しいファイルが作成される。


 #### 裏で動いているMySQLのPID削除
```
ps aux | grep mysql
sudo kill -9 PID
```
消した側から新しいのが出てきて解決しなかった...



## 最終的に解決した方法

errファイルの中に以下の文があった。
```
[ERROR] [MY-012574] [InnoDB] Unable to lock ./ibdata1 error: 
```

なのでこれで検索をかけるとプロセスの削除が必要らしい。
```
ps -efw | grep -i mysql
sudo  pkill mysqld
```

これを行った後無事に起動できた。
おそらくPID経由だとしっかり削除できていなかったんだと思う。
yarn v1 から pnpm への移行

# この記事について

yarn v1 を使っていたリポジトリの更新に際して pnpmへ移行した話
(n番煎じですが手順を整理するためアウトプット)

# 背景

yarn はすでに v4 が出ており、v1 から移行することが推奨されている

![Screenshot 2025-05-08 15.29.24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1666407/2f649401-01fe-4b37-8604-d35d3a819939.jpeg)


https://github.com/yarnpkg/yarn

# 試行錯誤

とりあえず、最新の yarn へ移行を試みた

https://yarnpkg.com/migration/guide

yarn install → Resolution step でしばらく待たされてエラー


どうやら yarn は v1 と v2 以降では大きく仕組みが異なっているらしい
(v2以降、node_modules を使わないPnP方式を採用)

https://yarnpkg.com/features/pnp

これに対応していないパッケージが使えないなどの制限があり、引っかかった模様

# そして pnpm へ

更新されない v1 を使い続けるわけにもいかないので、他の選択肢を検討

使いやすさ、安定性の面から pnpm を選択

https://pnpm.io/ja/

以下記事の比較が見やすく分かりやすかったです

https://qiita.com/syukan3/items/0e3560bf0e2ae715f5d1

早速動かしてみる

```sh
# pnpm インストール (今回は mise を利用)
mise use pnpm

# yarn.lock から pnpm-lock.yaml を生成
pnpm import

# 不要になった yarn.lock は削除
rm ./yarn.lock

# node_modulesも一新
rm -rf ./node_modules   # install 後 pnpm prune で良かったかも
pnpm install

# 利用パッケージ内の deprecated な依存を教えてくれた
> WARN  X deprecated subdependencies found: <package>@<version>

# 古いパッケージを調べてアップデート
pnpm outdated
pnpm add <package>

# 脆弱性チェック
pnpm audit
```

WARN, auditで見つけた脆弱性等について

package.json で overrides することで対応

```json:package.json
{
  "pnpm": {
    "overrides": {
      "<package>": "^<version>",
    }
  },
}
```

pnpm 強制 (npm, yarn を禁止)する設定も入れてみた

```json:package.json
 "scripts": {
    "preinstall": "npx only-allow pnpm",
    ・・・
  },
```

結果、特に問題なく動作しました

## 所感

- yarn v1 から v4 へ移行するより pnpm へ移行するほうが簡単だった
- 既存構成をほぼそのまま使えるのでストレスがない
- (体感)パッケージのダウンロードが早くなって快適
Gitのコミット差分から必要なファイルだけを抜き出してZIP化する方法

## はじめに

新しく追加したファイルや、更新したファイルだけをまとめて渡したいときはありませんか？  
すべてのファイルを送るのは容量が大きくなってしまいますし、手間もかかりますよね。  
そんなときは、Gitのコマンドを使うことで、コミット間の差分ファイルだけを自動で抜き出し、ZIPファイルにまとめることができます。

## こんな場面で便利です

- チームメンバーに「この変更分だけ送ってほしい」と頼まれたとき
- サーバーに差分だけアップロードしたいとき
- バックアップやレビュー用に、変更ファイルだけをまとめたいとき

## 手順

### 1. コマンド一つで差分ファイルをZIP化できます

以下のコマンドを使用します。

```
$ git archive --prefix=archive/ <ブランチ名> `git diff --name-only <前のコミット> <後のコミット> --diff-filter=d` -o archive.zip
```

#### コマンドの解説

- `git diff --name-only <前のコミット> <後のコミット> --diff-filter=d`  
  追加・更新されたファイル名だけをリストアップします（削除されたファイルは除外されます）。

- `git archive --prefix=archive/ <ブランチ名> ... -o archive.zip`  
  指定したファイルだけを、`archive/`フォルダにまとめてZIP化します。

### 2. 実行例

例えば、`abc1234` から `def5678` までの差分を抜き出したい場合は、次のように入力します。

```
$ git archive --prefix=archive/ main `git diff --name-only abc1234 def5678 --diff-filter=d` -o archive.zip
```

- `main` はブランチ名です。必要に応じて変更してください。
- `archive.zip` という名前でZIPファイルが作成されます。

## まとめ

この方法を使うことで、余計なファイルを含めず、必要な差分だけを簡単にまとめて渡すことができます。  
「すべて送るにはデータ量が多過ぎ！」と感じたときは、ぜひこの方法をお試しください。
flatseal で Flatpak アプリの権限変更

Discord を Flatpak でインストールしてしばらく使ってましたが、いつの間にか任意の位置からのファイルアップロードができなくなってしまっていました。
Flatpak のセキュリティの設定によるものだそうです。

設定を変更するには、flatseal を使います。

# 環境

- Ubuntu 24.04 LTS
- flatseal 2.3.1
- Flatpak 1.16.0
- Discord 0.0.94

# インストール


Flatpak をインストールした状態で、以下のコマンドでインストールができます。


```
$ flatpak install flatseal

```


インストール後、メニューから呼び出せるようになります。

# 設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/14484dfa-33c7-4701-b6b0-4eb82b0a58b7.png)

Discord の権限を変更します。この場所かな?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4884c85e-33a7-4a55-9651-96adb93fc85a.png)
A2Aプロトコルについてキャッチアップする#1 サーバー側エージェント

https://google.github.io/A2A/

## 概要
MCPを補完するプロトコルであって、エージェント同士が協働するためのプロトコルとのこと。

## 疑問
- 全く見知らぬエージェント同士が協働するようになるのか？
- 契約などお金関連はどう解決する？
- セキュリティ上の懸念は？使って良いエージェント一覧を提供する形になるか？→MCPとあまり変わらないような🤔
- サーバーエージェントにはタスク実行に対する拒否権はあるのか？

## Specificationを読み進める

> The A2A protocol has three actors:
>
>- User The end user (human or service) that is using an agentic system to accomplish tasks.
>- Client The entity (service, agent, application) that is requesting an action from an opaque agent on behalf of the user.
>- Remote Agent (Server) The opaque ("black box") agent which is the A2A server.

サーバーがローカル実行前提のMCPの仕様とは異なり、こちらは"Remote"であることを明言している。

### Agent Card

https://google.github.io/A2A/specification/agent-card/

JSON形式で所定の場所にAgent Cardを公開すると、サーバーエージェントになれる模様。

Agent Cardの項目に、認証の項目があった。この辺りで、サーバーエージェント利用に係る契約情報が渡るのかも。

```json
  // Authentication requirements for the agent.
  // Intended to match OpenAPI authentication structure.
  authentication: {
    schemes: string[]; // e.g. Basic, Bearer
    credentials?: string; //credentials a client should use for private cards
  };
```

### Agent-to-Agent Communication
https://google.github.io/A2A/specification/agent-to-agent-communication/#core-objects

クライアントエージェント側でタスクを作成し、サーバーエージェントがステータスを決定する。
タスク作成時に任意のセッションIDを設定することで、タスクを後で実行させたり、対話しながら情報を渡したりできるようになる。`reject the request`とあるのは、サーバー側でリクエストを拒否できるのかな👀
タスク完了後にも、同じセッションIDを使用すればコンテキストを引き継いで次の作業を行える模様。

## Tutorialを読む
Specificationを一通り読んだが、上記`疑問`の最後の項目以外は未解決なので、Tutorialも読んでみる。

https://google.github.io/A2A/tutorials/python/1-introduction/

Tutorialでも、得られる情報はサーバーを作るところが中心のよう。

## ここまででわかったこと
- 全く見知らぬエージェント同士が協働するようになるのか？→ おそらくそのとおり
- 契約などお金関連はどう解決する？ → サーバー側のAgent CardにあるAuthenticationによって、エージェント事業者同士で契約する形になるのかも？
- セキュリティ上の懸念は？使って良いエージェント一覧を提供する形になるか？　→ 現状では該当する情報はなし。ただし、認証フリーで作った悪意のあるサーバーエージェントを利用させられて問題が起こることも考えられるので、何らかのガードレールは必要かも
- サーバーエージェントにはタスク実行に対する拒否権はあるのか？ → これはありそう
MP3対応、アップルミュージックのダウンロード方法！

こんにちは！  
Apple Musicの曲をPCに保存したい、MP3で一括ダウンロードしたい――そんなニーズに応える最新の方法をご紹介します。

本記事では、人気ツール「[MusicFab Apple Music Converter](https://musicfab.dvdfab.org/apple-music-converter.htm)」を使って、Apple Musicの楽曲を高音質MP3でPCに無料保存する手順を丁寧に解説します。

---

## Apple Music公式のダウンロードについて

Apple Musicでは、iTunesやApple Musicアプリを通じて楽曲をダウンロードできますが、これはあくまでオフライン再生用です。  
**DRM(デジタル著作権管理)** の制限により、MP3ファイルとして端末に自由保存・再生することはできません。

---

## MusicFabでMP3一括ダウンロードするメリット

- **DRM解除・MP3変換対応**  
- **一括で複数曲・アルバムを高速変換**  
- **オリジナル品質そのまま保存可能**  
- **シンプルな操作で初心者OK！**

---

## MusicFab Apple Music Converterの使い方

以下に基本的な手順をまとめます。

1. **公式サイトからダウンロード・インストール**  
   👉 [MusicFab Apple Music Converter製品ページ](https://musicfab.dvdfab.org/apple-music-converter.htm)

2. **MusicFabを起動し、Apple Musicにログイン**

3. **ダウンロードしたい曲・アルバム・プレイリストを選択**

4. **出力形式で「MP3」を選択**

5. **「ダウンロード」ボタンをクリックし、一括変換開始**

変換が完了したら、指定したフォルダにMP3ファイルが保存されます。


## 無料で使える？

MusicFabは無料体験版があり、一部楽曲は完全無料でMP3変換できます。  
に入った場合は有料版で全機能・制限保存が可能です。

- **無料体験版**：曲数や変換時間に制限あり  
- **製品版**：一括変換＆高速保存  

無料版の詳しい使い方や手順解説、下記ガイドページを参考にしてください。

👉 [Apple MusicをMP3でPCにダウンロードする方法まとめ](https://musicfab.dvdfab.org/how-to-download-apple-music.htm)

---

## 注意事項

- 変・保存した音楽ファイルは**私的利用の範囲**でお楽しみください。
- 著作権者の許諾なしに音源の再配布や公開は法律違反となるので絶対にお控えください---

## まとめ

Apple Musicの好きな楽曲をPCに高音質MP3で保存する、  
**MusicFab Apple Music Converter** が最も簡単で便利な方法です。  
無料体験も用意されてので、ぜひ一度試してみてください！

---
CloudRunでIdentity Aware Proxyを有効化させる時に詰まったところ

# 状況
下の参考に載せている色々な記事でIAPを有効化しても、認証の画面が出てこず、困っていた。

# 原因と解決策
### ブラウザのキャッシュやCookieが残っていた
- 過去に認証済みのCookieが残っていると、認証画面が表示されない場合がある
- キャッシュの削除をする必要がある

### Cloud Run側で「未認証アクセスを許可」していた
- 認証の設定をオフにする必要がある
- これが有効なままだと、IAPを経由せずにアクセスできてしまう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/56f39212-b53e-4f49-bde4-b8cc3cdf5944.png)

### アクセス経路がIAPを通ってない
- ロードバランサー経由でしかアクセスできない様にする
- デフォルトのHTTPSエンドポイントURLからアクセスしてしまうと、IAPを経由しない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/b9f901a7-5b7f-4e3a-a46b-9c04b456c69d.png)


# 参考
https://zenn.dev/google_cloud_jp/articles/cloudrun-iap
【蔭山公望の主観】 Webマーケティング→エンジニア学習のすすめ

蔭山公望です！

Webマーケターとして日々業務に取り組む中で、「技術的な知識があればもっと効率的に動けるのに」と感じたことはありませんか？  
今、マーケターがエンジニアリングを学ぶことで、仕事の幅が大きく広がり、価値ある人材として重宝される流れが加速しています。

---

# なぜマーケターがエンジニアリングを学ぶべきなのか？

## 現場で求められる「技術的な理解力」

広告のタグ設定、GA4やGTMの実装、LPの修正など、マーケティング業務には多くの技術的要素が含まれています。  
たとえば、HTMLやCSSの知識があれば、ページ修正を外注せずに対応でき、スピードとコストの両面でメリットがあります。

## ツールを「使う側」から「設計できる側」へ

マーケティングツールを使いこなすだけでなく、その仕組みまで理解できるようになることで、業務の自動化やAPI連携といった発展的な対応も可能になります。  
「どう動くか」だけでなく、「なぜ動くのか」を理解することで、より本質的な改善提案ができるようになります。

---

# 習得すべき基本スキルとは？

## HTML・CSS・JavaScriptの基礎

Webページの構造や動きの理解に不可欠な言語です。広告のLP修正やバナー表示条件の調整など、日常業務にも直結します。

## SQL（データベース操作言語）

GoogleアナリティクスやBIツールだけに頼らず、自らデータを抽出・分析する力がつきます。レポーティングや施策評価の質が大きく変わります。

## 自動化・ノーコードツールとの連携

ZapierやMake（旧Integromat）などの自動化ツールは、ある程度の技術的理解があると、業務効率化の強力な武器になります。

---

# エンジニア学習がもたらす3つの価値

## 1. スピードと柔軟性の向上

ちょっとした修正を社内で完結できることで、タイムロスがなくなり、施策のPDCAも早く回せます。

## 2. デジタルスキルの相乗効果

マーケティング知識×テクノロジー知識の掛け算は、差別化されたスキルセットになります。データドリブンな戦略立案にも強くなります。

## 3. キャリアの拡張性

「マーケもわかるエンジニア」「技術にも強いマーケター」は、企業から高く評価されます。副業や独立にもつながるスキルです。

---

# どうやって学ぶべきか？おすすめの学習方法

- オンライン学習サービス（Progate、Udemy、ドットインストール など）
- 実務で学ぶ：簡単な修正や分析から、実際に手を動かして覚える
- エンジニアと積極的に関わる：社内の開発者に教わるのも効果的

---

# まとめ：マーケティングに強い“技術人材”を目指そう

マーケターがエンジニアリングを学ぶことで得られるメリットは計り知れません。単なるツール利用者から、ビジネスとテクノロジーをつなぐ橋渡し役へ。  
今後ますますデジタルが進化する中で、こうしたスキルを持つ人材は圧倒的な価値を発揮します。まずは小さく学び始めてみる。それが、あなたのキャリアを大きく変える第一歩になるはずです。



※ちなみに蔭山公望ってどんな人？
https://www.yashima.ac.jp/univ/search.php?cx=018445184455329177551%3Avmoy3blekgo&cof=FORID%3A10&ie=UTF-8&q=%E8%94%AD%E5%B1%B1%E5%85%AC%E6%9C%9B&sa.x=0&sa.y=0#gsc.tab=0&gsc.q=%E8%94%AD%E5%B1%B1%E5%85%AC%E6%9C%9B&gsc.page=1
ファイル名を指定して実行 でメッセージボックス表示する謎テク

## はじめに
近年はファイル名を指定して実行を用いたPC初心者向けの攻撃が流行りつつあるらしいですね。
ユーザー自身が実行しているのでセキュリティ的にいろいろ突破しやすいのだとか。
PC上級者の皆様は大丈夫だと思いますが、ファイル名を指定して実行をする際にはよく注意する必要がありますね。

今回は持ってる知識でファイル名を指定して実行からメッセージボックスを表示できそうだったので試してみました。
やっていることは非常に単純ですが、一部応用すれば何かに活用できるかもしれません。

## 使用条件
- 特に設定を変更していない市販の新しめのWindowsPCを使用する（Windows7SP1以降なら多分大体できる）
- 設定や権限、セキュリティソフトなどでアプリケーションの実行を阻害していない
- ユーザーディレクトリ直下にa.cs、a.exeがないこと（上書きされ削除されます）
- 37字程度の文字列をメッセージボックスで表示できる

## 前提情報
- 「ファイル名を指定して実行」はWin+Rキーで表示されるアレ（英語環境だと「Run」）
- 「ファイル名を指定して実行」は標準で260文字までのコマンドを実行できる
- コマンドプロンプトは「cmd /C コマンド」のように実行するとコマンドを実行して閉じる
- csc.exeはプリインストールされている.NET Framework4.0のC#コンパイラ

## やり方
以下のコードを「ファイル名を指定して実行」欄に張り付けて実行します。
```bat
cmd /C cd %USERPROFILE%&echo namespace P{class P{static void Main(){System.Windows.Forms.MessageBox.Show("あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆ");}}}>a.cs&%windir%\Microsoft.NET\Framework\v4.0.30319\csc.exe /target:winexe a.cs&start /wait a.exe&del a.cs a.exe
```

ちょうど260文字です。
「あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆ」とメッセージボックスで表示されます。

## 説明
260文字で以下のようなことをしています。
1. メッセージボックスを表示するC#コードをファイルに書き込む
1. コンパイルして実行
1. メッセージボックスを閉じたら関連ファイルを削除

上のワンライナーは以下のように分解できます。

### コマンドプロンプトで以降のコードを実行して閉じる
```bat
cmd /C 
```

### フォルダ移動：ファイル出力可能フォルダに移動
```bat
cd %USERPROFILE%
```
%USERPROFILE% は C:\Users\ユーザー名 を指す環境変数です。
基本的にはファイル出力できるフォルダです。


### コード部：メッセージボックスを表示するC#コードをファイルへ出力
```bat
echo namespace P{class P{static void Main(){System.Windows.Forms.MessageBox.Show("あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆ");}}}>a.cs
```
メッセージボックスを表示する最低限のC#のコードをファイルにa.cs書き込んでいます。

### コンパイル部：csc.exeでc#のコードをexeへとコンパイル
```bat
%windir%\Microsoft.NET\Framework\v4.0.30319\csc.exe /target:winexe a.cs
```
%windir% は C:\Windows を指す環境変数です。
WinFormsアプリケーションを作る際は /target:winexe のオプションを指定する必要があります。

### 実行：exeを実行する
```bat
start /wait a.exe
```
start は /wait オプションを付けると実行したものの終了まで処理を待ちます。

### 後始末：出力したコードと実行ファイルを削除する
```bat
del a.exe a.cs
```
delコマンドは複数のファイルを削除できます。

## C#のコード部を見やすくしたもの
```csharp
namespace P{
    class P{
        static void Main(){
            System.Windows.Forms.MessageBox.Show("メッセージ内容");
        }
    }
}
```
任意のC#コードにすることでいろいろなことができます。（短すぎて大したことはできませんが）
.NET Framework4.0でコンパイル可能だと多分これ以上は短くできないと思います。
名前空間usingせずにメッセージボックス表示したの初めてかも。

## ちなみにVBScriptだと
```bat
cmd /C cd %USERPROFILE%&echo MsgBox "メッセージ内容">a.vbs&start /wait a.vbs&del a.vbs
```
コンパイルしなくていいので短いですね。
187文字のメッセージを表示できます。
VBScriptは古くセキュリティホールが度々見つかったりしているので無効化している人も多いと思います。
また2027年頃にはデフォルトで無効化されるようです。

## まとめ
- これ自体には特に使いどころはないし多分もっといい手段がある
- ファイル名を指定して実行でも実行ファイルを作って実行できる
- C#書けるとその辺にあるデフォルトの市販PCで簡単に実行ファイル作れる
- レジストリいじるともう少し長いものを実行できるらしい
- 悪用しないように
SREにおけるIaC化の意義

# SRE本におけるインフラコード化の意義

## はじめに

Site Reliability Engineering（SRE）の実践において、**Infrastructure as Code（IaC）**は、信頼性の高いサービス運用を実現する上で極めて重要な基盤です。以下に、SREの文脈で語られるインフラコード化の意義について整理します。

---

## 1. 信頼性と一貫性の向上

- 手作業によるインフラ構築は属人化しやすく、ヒューマンエラーの原因となる。
- IaCにより、**どの環境でも同じ設定を適用できるため再現性が高い**。
- 開発、テスト、本番環境間で構成のずれをなくし、**一貫した運用を実現**。

---

## 2. 変更管理と監査の強化

- Gitなどのバージョン管理ツールと組み合わせることで、**すべての変更履歴が記録される**。
- 誰が、いつ、何を変更したのかが明確になる。
- SREが重視する「**変更は小さく、頻繁に、安全に**」という原則と高い親和性を持つ。

---

## 3. 障害復旧とスケーラビリティ

- 構成をコードで保持することで、**障害時にも迅速に再デプロイが可能**。
- 同一のコードを使ってスケーリングや冗長構成の自動化ができ、**耐障害性を高める**。

---

## 4. テストとCI/CDとの統合

- IaCはCI/CDパイプラインに組み込むことができる。
- これにより、**インフラ変更もアプリケーションと同様にコードレビューやテストを経てデプロイ**される。
- サービスの可用性・信頼性を保ちながら運用を自動化。

---

## 5. 運用効率とチーム間の協調

- IaCは**再利用可能なモジュールやテンプレート**として整備でき、構築工数を削減。
- 標準化されたコードにより、**複数チーム間での連携がスムーズ**に。
- 作業の属人化を避け、**スケーラブルな運用体制**を構築可能。

---

## 実践例

- **GCP**: Deployment Manager / Terraform
- **AWS**: CloudFormation / Terraform / CDK
- **マルチクラウド**: Pulumi や Crossplane など

---

## まとめ

インフラのコード化は、SREが掲げる「可用性」「信頼性」「変更の安全性」「自動化」のすべてに通じる実践であり、**高信頼なサービス運用の基盤**となる。SRE文化のなかでIaCを積極的に導入・推進することは、継続的な改善とスケーラブルなシステム運用において欠かせない要素である。
【Power Automate】基本的な日時処理のテクニック！

# はじめに
Power Automateでは日時処理が必要なシーンがたくさん出てきます！
「前日のデータ取得」や「リマインド送信」、「期間でのフィルター」などなど...
本記事では Power Automate でよく使用される日時処理に関するテクニックを解説していきます！

### よく使う日付関数まとめ:mag_right:
| 関数 | 使用例 | 説明 |
|:-:|:-:|:-:|
| utcNow()  |  utcNow() |  現在のUTC時刻を取得 |
|  addDays() |  addDays(utcNow(), -1) |  日付の加算・減算 |
| formatDateTime()  |  formatDateTime(utcNow(), 'yyyy/MM/dd') |  日付フォーマットの変換 |
| convertTimeZone()  | convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time')	 |  タイムゾーン変換 |
| dayOfWeek()  |  dayOfWeek(utcNow()) |  曜日（0:日曜〜6:土曜）取得 |

## 基本の処理：日時の形式変換
いちばんよく使う形式だと思います。
日付を任意のフォーマットに整形することで、表示やファイル名に使えます。
```
formatDateTime(utcNow(), 'yyyy-MM-dd')
//出力結果➡ 2025-05-08
```
```
formatDateTime(utcNow(), 'yyyy/MM/dd HH:mm:ss')
//出力結果➡ 2025/05/08 06:24:49
```
```
formatDateTime(utcNow(), 'MM/dd/yyyy')
//出力結果➡ 05/08/2025
```
```
formatDateTime(utcNow(), 'yyyy年MM月dd日')
//出力結果➡ 2025年05月08日
```


## 基本の処理：「前営業日」を取得する

「新しいステップ」で **タイムゾーンの変換** を設定。
基準は **(UTC)協定世界時** で設定されているので **(UTC+09:00)大阪、札幌、東京** にタイムゾーンの変換を設定する必要があります。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/2b49a180-ea8e-4f7e-a36b-9c182ffe0d84.png)

タイムゾーンの変換ができたら、前営業日を取得したいステップで以下の関数を設定します。
今回は分かりやすく表示させるため、変数の設定に関数を入れています。

```
formatDateTime(addDays(body('タイム_ゾーンの変換'),-1),'yyyy/MM/dd')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/64fff615-2cbd-4541-831a-e0d94db10653.png)

addDays で取得したい日数分の加算・減算を行います。
`-1` の部分は加算もしくは減算したい日数分を入力します。
2日後を取得したい場合は `2` になります。

formatDateTime で日付の書式設定を行います。

設定ができたら一度保存をしてテストを行ってみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/3af19190-f061-408e-a93c-6ae7333004dd.png)

タイムゾーンの出力結果を基準に、-1日されて出力されています。
こちらは日単位で加算・減算を行っていますが `addHours` で時間単位で取得することも可能です。

:::note info
タイムゾーンの変換で協定世界時から日本のタイムゾーンに合わせて設定していますが、`addHours`関数を使用して以下のように+9時間をすることで日本時間に合わせることも可能です。
`addHours(utcNow(), 9)`
:::

:::note warn
年や月単位での加算・減算を行う関数はありません。
こちらの取得方法についてはまた別途記事を作成予定です。
:::

## まとめ
簡単ではありますが、PowerAutomate を初めて使う人がよく戸惑いやすい
日時処理について解説していきました。
最初は基準時刻が協定世界時（-9時間）になっているので
そこで戸惑う人も多かったのではないでしょうか？
今回ご紹介したのはとても基本的な一例になりますので、
さまざまな関数を応用して、日時処理テクニックをマスターしていってください！
他の日時処理テクニックについても随時記事を作成予定です！
document.getElementByIdが面倒くさいというお話


:::note info
もちろんJavaScriptのお話です。
:::


皆さんは、こう思ったことがあります。

`document.getElementById`**って書くのめんどくせぇ…！**

そんなあなたに、`el`関数をあげましょう。
```javascript
function el(id) {return document.getElementById(id)};
//1行の方が楽だと思う
```
これを使えば、「どきゅめんとーうんたらかんたら」と書く面倒くささから開放されます！よかったね！

# elValue関数

皆さんは、こうも思ったことがあります。

**いやわかったけどさ、**`el(id).value`**って書くのすらめんどくせぇ…！**

そんなあなたに、`elValue`関数をあげましょう。
```javascript
function elValue(id) {return el(id).value};
// el関数も併用できればめっちゃ短く終わる
```
これを使えば、「えるばりゅーうんたらかんたら」と書く面倒くささから開放されます！よかったね！

***

それだけです。

# 終わりに

みんなもこの2つの関数を使って良いプログラマーライフを！
ペントミノをExact cover問題として解く（その４）

[前回の投稿](https://qiita.com/masa0599/items/35b5f10014f3b9eb485a)でペントミノをExact cover問題と考えpythonの[DLX package](https://pypi.org/project/dlx/)を使って2339個の解答を得ることが出来ました。

今回はペントミノのボードの形を変えてもボードのデータを変更するだけで、同様に解けることを確認します。

### サイズの違う長方形のボード

これらは単純にX,Yを変更するだけです

#### 長方形（２０ｘ３）

```python
X, Y = 20, 3
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/fe596f50-4c4a-4c2e-b5ba-f8a220079793.png)

#### 長方形（１５ｘ４）

```python
X, Y = 15, 4
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/b5659d0e-307e-4737-9a92-6b68cf634596.png)

#### 長方形（１２ｘ５）

```python
X, Y = 12, 5
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/a2dba3d6-8232-4345-b15b-a6e1a5a4a124.png)

### ボードの中央に４個の穴がある場合

これは8x8のボードを作って中央の４個のセルを除くだけでOKです。

```python
X, Y = 8, 8
boardset = {(x,y) for y in range(Y) for x in range(X)} - {(4, 4), (3, 3), (3, 4), (4, 3)}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/7e31af73-457a-4786-93f7-0ba6cda23f69.png" width=60%>

### 十字架

一見難しそうですが、縦長と横長の長方形と和集合を作りました。

```python
X, Y = 9, 14
boardset = {(x,y) for y in range(8,10+1) for x in range(X)} | {(x,y) for y in range(Y) for x in range(3,5+1)}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/b559fce5-0ecd-47d9-8b10-aca0ddf615de.png" width=60%>

### （まとめ）ペントミノの各ボードの解答の総数とユニークな解答の数

|Board |Solution |unique |
|:---:|---:|---:|
|長方形 20x3 |8 | 2|
|長方形 15x4 | 1472| 368|
|長方形 12x5 | 4040| 1010|
|長方形 10x6| 9356 | 2339 |
|正方形 8x8-4| 520| 65|
|十字架 | 42 | 21 |

（開発環境：Google Colab）
ペントミノをExact cover問題として解く（その２）

前回の[（その１）](https://qiita.com/masa0599/items/7d5aa1318149f4ad9edf)ではペントミノの解を総当りで求めるコードを作成しました。

今回は高速化するために使うExact cover問題にとそれを解くpackageのPyPIのDLXについて説明します。

> （参考）[Exact cover (Wikipedia)](https://en.wikipedia.org/wiki/Exact_cover#Pentomino_tiling)の考え方

 ### 4. Exact cover問題の考え方

 [Exact cover#Detailed example](https://en.wikipedia.org/wiki/Exact_cover#Detailed_example)で示されている例を示します。
 ```math
 \begin{align}
 &全体集合 X = \lbrace 1,2,3,4,5,6,7 \rbrace のとき\\
 &その部分集合 \\
 &A = \lbrace 1,4,7 \rbrace \\
 &\color{red} {B = \lbrace 1,4 \rbrace} \\
 &C = \lbrace 4,5,7 \rbrace \\
 &\color{red} {D = \lbrace 3,5,6 \rbrace} \\
 &E = \lbrace 2,3,6,7 \rbrace \\
 &\color{red} {F = \lbrace 2,7 \rbrace} \\
 &のうち共通要素を持たず和集合がXになる \\
 &\color{red} {集合\lbrace B,D,F  \rbrace をExact \ cover}と呼びます\\
 & \\
 \end{align}
 ```
### 5 Exact cover問題を解くPyPIのDLXの説明

PyPIのDLXを使ってこの例題を解いてみます

[PyPIのDLX](https://pypi.org/project/dlx/)packageはKnuthの[dancing links](https://en.wikipedia.org/wiki/Dancing_Links)アルゴリズム(Algorithm X)を実装したものす。

アルゴリズムに関しては以下のリンクに解説がありますが、ここではブラックボックスとして利用します。

> [Knuth's Algorithm XとDancing Linksの解説](https://japlj.hatenadiary.org/entry/20090902/1251901464)

こおDLX packageはちょっとクセがあるので使用法を詳細に説明します。

1. DLXのmoduleをインストールする
1. 列(column)のデータを作る(DLX)
1. 行(row)のデータを作る(appendRow)
1. 問題を解く(solve)
1. 答えを得る(getRowList)

#### 5.1. DLXのmoduleをインストールする

```python 
!pip install dlx
```
#### 5.2. 列(column)のデータを作る(DLX)

* DLXに渡す列データは[(列名0, 0), (列名1, 0),..]の形式（0はcover必須の列を表す）
* 次のappendRowで渡すデータは列名ではなくて列index(0スタート)なので、その関係を示す辞書(colidx)を作っておく
* 答えは「列名リスト」で得られるので「列名リストー＞集合名」の辞書の形式で部分集合ssetを定義

```python
columns = [(x,0) for x in [1,2,3,4,5,6,7]]
print(f"columns = {columns}")
colidx = {c[0]: i for i, c in enumerate(columns)}    # column index
print(f"colidx = {colidx}")
sset = {(1, 4, 7): 'A', (1, 4): 'B', (4, 5, 7): 'C', (3, 5, 6): 'D', (2, 3, 6, 7): 'E', (2, 7): 'F'}
dlx = DLX(columns)
# columns = [(1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (7, 0)]
# colidx = {1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6}
```

#### 5.3. 行(row)のデータを作る(appendRow)

各行のデータをappendRowを使って入れていきます。ここで要注意なのが指定するのは**列名ではなくて列index**だと言うことです。したがってcolidxを使って変換してrowを作ります。

```python 
for sdata, sname  in sset.items():
  row = [colidx[i] for i in sdata]
  print(f"row = {row}")
  dlx.appendRow(row)   # add row
# row = [0, 3, 6]
# row = [0, 3]
# row = [3, 4, 6]
# row = [2, 4, 5]
# row = [1, 2, 5, 6]
# row = [1, 6]
```
#### 5.4. 問題を解く(solve)

入力が終わったらsolveを呼ぶと答えが得られます。答えは複数ある場合もあるのでGeneratorの形で得られます。

#### 5.5. 答えを得る(getRowList)

回答のsolutionはあまり意味のない数なのでgetRowListを使って列名のリスト（列indexではなくて）を取得します。これでも分かりますが、ssetで部分集合の名前に変換して最終解$ ['B', 'D', 'F']$が得られました。

```python 
for solution in dlx.solve():
  print(f"solution = {solution}")
  rowlist = [tuple(sorted(dlx.getRowList(i))) for i in solution]
  print(f"answer data = {rowlist}")
  print(f"answer subsets = {[sset[row] for row in rowlist]}")
# solution = [11, 17, 23]
# answer data = [(1, 4), (3, 5, 6), (2, 7)]
# answer subsets = ['B', 'D', 'F']
```

以上のようにDLX Packageは強力なツールなのですが、マニュアルがほとんどなく、コツが必要なので少し丁寧に説明しました。

[次回（その３）](https://qiita.com/masa0599/items/35b5f10014f3b9eb485a) ではいよいよDLX Packageを使ってペントミノを解いていきます

（開発環境：Google Colab）
[Linux][command] シェル_コマンド履歴参照_history, !

# historyコマンド
- bashシェルで実行したコマンドの履歴を表示する
- コマンド履歴は`.bash_history`ファイルに保存する
~~~terminal
$ history
~~~

# 参考リンク
- [[Linux][command] シェル変数と環境変数_echo, unset, export](https://qiita.com/Jochun/items/6f08588027aee8b07730)

# Ping-t
- [3070_history, .bash_history](https://mondai.ping-t.com/question_subjects/31/question_sessions/32569047/progressing_questions/499039903)
Linux　基本コマンドまとめ

# はじめに
新卒のSE歴1か月がLinuxコマンドをまとめる（自分用）<br>
以下のようにまとめてある。
### コマンド：コマンドの説明
（コマンドの由来）
```
コマンド使用例
```

# 基本的なコマンド（常用コマンド）
### cd:ディレクトリ移動 
(**c**henge **d**irectory)
```
cd ファイル名
```
***
### ls:ディレクトリの内容をリスト形式で表示 
(**l**i**s**t)
```
ls ディレクトリ名
```
***
### mv:ファイルを移動
(**m**o**v**e)
```
mv 移動元ファイル名 移動先ファイル名
```
***
### cp:ファイルやフォルダをコピー
(**c**o**p**e)
```
cp 移動元 移動先
```
***
### mkdir:ディレクトリの作成 
(**m**a**k**e **dir**ectory)
```
mkdir ディレクトリ名
```
***
### touch:ファイルの作成
```
touch ファイル名
```
***
### rmdir:空のディレクトリの削除 
(**r**e**m**ove **dir**ctory)
```
rmdir ディレクトリ名
```
***
### rm:ファイルやディレクトリを削除 
(**r**e**m**ove）
```
rm 名
```
***
### pwd:現在いる位置の表示 
(**p**rint **w**orking **d**irectory)
```
pwd
```
***
### find:ファイルの検索 
```
find -neme ファイル名
```
***
### cat:ファイルの内容を表示 
(con**cat**enate)
```
cat ファイル名
```
***
### grep:指定した文字列がテキスト内に存在した場合その行を抽出する
(**G**lobal **R**egular **E**xpression **P**rint)
```
grep "検索したい文字" ファイル名
```
***
### chmod:ファイルやフォルダのアクセス権の変更 
(**ch**ange **mod**e) 
```
chmod 755 ファイル名
```

chmodの詳しい使い方は以下のURLを参照↓
[Linuxの権限確認と変更(chmod)](https://qiita.com/shisama/items/5f4c4fa768642aad9e06)
***
### chown:ファイルやフォルダのオーナーやグループの変更
(**ch**ange **own**er)
```
chown 変更後のユーザ名 ファイル名
```
***
### man:コマンドのマニュアルを表示 
(**man**ual)
```
man 調べたいコマンド
```
***
***
<br>

# ユーザ管理
useradd:ユーザの新規作成
userdel:ユーザの削除
groupadd:グループの新規作成
groupdel:グループの削除

# 便利なショートカット
| ショートカット | 内容 |
|:-----------:|:------------:|
|     ↓↑| コマンド履歴を順番に表示|
| tab     | フォルダやファイル名の**予測変換**     |
| Ctr+a     |カーソルを**先頭に移動**    |
| Ctr+e      | カーソルを**最後尾に移動**          |
| Ctr+d      | カーソルの位置の文字を削除     |
| Ctr+w    | カーソルの左側の**単語**を削除    |
|Ctr+r|コマンド履歴の中から検索|
***
以上
【初心者必見】React × TypeScript 超かんたん環境構築

Vite を使ってサクッと React × TypeScript の開発環境を作りましょう！
※Windowsで環境構築を行っています

## ✅ 対象者

- JavaScriptの基礎を勉強した人
- Reactの環境構築がよくわからない人
- TypeScriptにも興味がある人


### 1. 前提条件

以下のソフトがインストールされていることを前提とします。

- [Node.js（公式サイト）](https://nodejs.org/)（推奨：18以上）
- npm（Node.jsをインストールすれば同時に使える）
- ターミナル（コマンドライン）
- エディタ（例：Visual Studio Codeが使いやすい）

※バージョン確認するといいかも（npm -v node -v）

### 2. プロジェクトの作成

まずはプロジェクトを作成しましょう。
Visual Studio Codeでターミナルを開き、開発用のフォルダ（例：`dev`）に移動します。

```bash
PS C:\Users\ユーザ名\Desktop\dev
```

その状態で以下のコマンドを実行します。

```bash
npm create vite@latest
```

実行すると、対話形式でいくつか質問されます。

- プロジェクト名：my-react-app（好きな名前でOK）
- フレームワーク：React
- バリアント：TypeScript

以上が完了したら念のため今いるフォルダを確認しておきましょう。

```bash
cd プロジェクト名
```

最後にフォルダを開きます。

```bash
code .
```

### 3. 依存パッケージのインストール

プロジェクトのディレクトリに移動したら、依存パッケージをインストールします。

```bash
npm install
```

### 完成です:blush:

## 📝 お疲れさまでした！

ここまで読んでいただき、ありがとうございました！  
一緒に開発頑張っていきましょう！！！
【Mac向け代替手順】Microsoft Remote Desktopが使えない場合の対応（Microsoft Windows App利用）

# 【Mac向け代替手順】IBM APPでMicrosoft Remote Desktopが使えない場合の対応（Microsoft Windows App利用）

## はじめに

Mac環境において、IBM APP経由で **Microsoft Remote Desktop** をインストールできない不具合に遭遇しました。

代替策として、**Microsoft Windows App** を用いることで、IBM TechZoneで予約した仮想環境へ問題なく接続できたため、その手順を共有します。

---

## 1. TechZoneにて環境を予約

以下のリンクより、対象環境（例: ELM 7.0.3）を予約します。

🔗 [IBM TechZone - ELM Quick Start Collection](https://techzone.ibm.com/collection/ibm-engineering-lifecycle-management-quick-start-collection-to-launch-a-working-environment-703-release/environments)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037860/720829b2-d982-48e4-a4de-f1d4b6e19372.png)

### 入力例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037860/e91ab14e-858f-480c-949a-e1f92951adb1.png)

- **Purpose Description**  
  `To prepare for demos for customers.`

- **Preferred Geography**  
  `any-AP-anyregion-anydatacenter`

入力後、「**SUBMIT**」をクリックしてプロビジョニングを開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037860/5e3956a0-db4f-4796-9a70-759dbef72489.png)

> ⏳ プロビジョニング完了まで数分〜数十分かかります。

---

## 2. Microsoft Windows Appをインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037860/a1498464-489a-434f-a108-ce9dfd276cf4.png)

以下のURLから、**Microsoft Windows App**（Microsoft Remote Desktopの代替）をダウンロード・インストールします。

🔗 [Microsoft Windows App for Mac (App Center)](https://install.appcenter.ms/orgs/rdmacios-k2vy/apps/microsoft-remote-desktop-for-mac/distribution_groups/all-users-of-microsoft-remote-desktop-for-mac)

---

## 3. リモートデスクトップの設定

アプリを起動し、「**Add PC**」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037860/4d58a62f-06ac-4b73-a713-3f5db59fe5f5.png)

以下の情報を入力します：

### 接続先情報

- **PC name**:  
  ※TechZoneから提供される接続先ホスト名を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037860/33e30a78-a6a9-4129-a097-dd61378a2d4c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037860/c61c3098-5d81-4f7e-a303-cdf1b60ad083.png)



設定後、リモート接続が完了すればOKです ✅
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037860/e2f36cbe-a62c-4780-8156-e356e406bb3e.png)

---

## おわりに

Mac環境でIBM APPからMicrosoft Remote Desktopがインストールできない場合でも、  
この方法でTechZoneの仮想環境に問題なくアクセスできます。

同じような状況で困っている方の参考になれば幸いです！

---
### さらに詳しい情報をお探しの方へ 

IBMの最新情報、イベント情報、さらに役立つ資料は、以下のIBM Communityでも発信・格納されています。  

最新のトレンドや有益な情報をチェックするために、ぜひご覧ください！ 

- **ELM (Engineering Lifecycle Management)**: [IBM Community - ELM](https://community.ibm.com/community/user/sustainability/communities/community-home?CommunityKey=f8bc69e0-9d61-4688-939b-018f5f74519e)  

  ELMに関する最新のイベント情報、ナレッジ共有、便利なドキュメントをチェック！
ラストスパートでは帳尻を合わせられない

皆さん、マリオカートってやったことありますか？

余談ですが、マリオカートのテクニックの一つで「ロケットスタート」というのがありまして、スタート前のカウントダウン時に、タイミングよくアクセルボタンを押し始めると、スタートと同時にダッシュ💨することができるというものです！

楽しいですよね、マリオカート :checkered_flag: :race_car:

それでは、そろそろ本題に入ります。

# 皆さん「締め切り」を守れていますか？　

締め切りを守らない人に共通することとして、**「締め切りの概念の相違」** が挙げられます。
一般的に締め切りとは**守らなくてはいけないゴール地点です。**

しかし、締め切りを守らない人は以下のように考えています。
* 見積もりはあくまで見積もりだし、予定どおりに仕事が進むとは限らないでしょ:wink:
* 締め切り目前に、徹夜でも何でもして頑張ることが大切なんだよ:laughing:
* それでもどうしても締め切りに間に合わなかった場合は、その段階でスケジュールを変更してもらうしかないよね:sweat:

上記を見てわかる通り、締め切りを守らない人は **「ラストスパート志向」** なのです。
終わりそうになければ残業でもして終わらせようとしています。

これでは締め切りなんて守れないですよね:disappointed:
また、守れたとしても急いで終わらせるため、ミスがあったり良いことはありません。

「ラストスパート志向」は言ってしまえば、**｢締め切りが守れない人｣に共通する甘い考えです。**  

# 締め切りは絶対に守るもの
大切なことは、スケジューリングの段階から **「締め切りは絶対に守るもの」** という前提でのぞむことです。

すると予定を立てる段階から、次のような真剣なやり方をとらざるを得なくなるはずです。

たとえば現場の上長から **「これ10日でやっといて！」** という仕事が降ってきたときのお話

1\. 「まずはどのくらいかかるかやってみるので、スケジュールの割り出しのために2日ください！」と答えて仕事に取り掛かる（見積もりをするための調査期間をもらう）
2\. その2日をロケットスタート期間として使い、2日で「ほぼ完成」まで持っていく
3\. 万が一、その2日で「ほぼ完成」まで持っていけなかった場合、これを「危機的な状況」と認識してスケジュールの見直しを交渉する

上記で大切なのは **「２」** の **「全力のスタートダッシュ」** をすることです。

10日でやるべきタスクだったら、その2割の2日間で8割終わらせるつもりで、プロジェクトの当初からロケットスタートをかけなければなりません。

初期段階でのミスならば簡単に取り戻せますし、リカバリーの期間を十分に持つことができます。

とにかくこの時期に集中して仕事をして、可能な限りのリスクを排除します。
**考えてから手を動かすのではなく、手を動かしながら考えてください！**

なお、作業を進めていって根本的な方向転換が必要だったら、この時期に行います。

たとえばインフラの構築なら基本設計の変更などが当てはまります。
このままだと懸念材料の残る環境が出来てしまいそうであれば、ここでもう一度ゼロからやり直します。

# まとめ
ぜひ皆さんもプロジェクトでアウトプットを出す際などは、「ラストスパート志向」は極力避けて、計画性をもってクォリティを高めることを心掛けていきましょう。この記事が何かしらの参考になれば幸いです。

ここまで読んでいただきありがとうございました！
(QA) IBM i でILMTによるライセンス管理はできますか？

首記のご質問をいただきました。

## ILMTとは？

IBM License Metric Tool の略で、主に仮想化環境においてIBMソフトウェア（PA製品(MQ, WAS ND等)が対象、IBM i のライセンスプログラム＝AASソフトウェアは対象外です。）の使用ライセンス数量を取得する管理ツールです。
ILMTサーバーはWindows, Linux等で稼働します。IBM i はILMTサーバーにはなれません。

実はIBM i ではILMTクライアントのサポートが長年ありませんでした。割と最近ILMTによる管理が可能となりました。※ILMT V9.2.5.1以降でIBM i クライアントのDisconnecte ScanによるILMTサポートが追加されました。

## IBM i でのILMTの情報？

以下のリンクをご覧ください。
### IBM License Metric Tool 9.2 - supported operating systems
https://www.ibm.com/support/pages/ibm-license-metric-tool-92-supported-operating-systems

※執筆時点では、下記のようなコメントが記載されてます。
```
** Discovery on IBM i is based on disconnected scans, 
a semi-automated procedure for collecting the data 
about hardware and software inventory.
```
※機械翻訳
***IBM i での検出は、ハードウェアおよびソフトウェア インベントリに関するデータを収集するための半自動手順である切断スキャンに基づいています。***

### License Metric Tool サーバーへのスキャン結果の日次転送のセットアップ (切断されたシナリオ)
※上記のようにIBM iほかで切断スキャンの環境でILMTのデータを取得する際のシナリオ例です。
https://www.ibm.com/docs/ja/license-metric-tool/9.2.0?topic=icdsl-step-3-setting-up-daily-transfer-scan-results-license-metric-tool-server

かんたんに言うと、ILMTクライアント（IBM i)を切断モードでILMTのデータ取得するとIBM i 上にILMTのログ（データ）がファイルとして取得できるので、それをILMTサーバーに定期的に送付する必要がある、という事になるかと思います。

### IBM License Metric Tool 9.2.39
https://www.ibm.com/software/reports/compatibility/clarity-reports/report/html/softwareReqsForProduct?deliverableId=973C09D811504160821F103F56DE9E22&osPlatforms=spcrAllValues&duComponentIds=spcrAllValues&mandatoryCapIds=spcrAllValues&optionalCapIds=spcrAllValues

こちらはILMT全般の資料です。
※適時、最新版を参照してください。
[初心者]React環境構築

初心者向けにReactについてと環境構築についてまとめました。

# Reactとは
Reactは**UI（ユーザーインターフェース）構築に特化したJavaScriptライブラリ**です。
- ボタンをクリックすると画面が変わる
- 入力フォームに文字を入れると表示が変わる
    といった「動きのあるWebページ」を作るのに使われます。

# Node.jsのインストール
ReactはNode.jsというフレームワークの上で動きます。
[Node.js公式サイト](https://nodejs.org/ja)にアクセスし、**Node.js（LTS）をダウンロードする**をクリックしてインストールしてください。
インストール後、ターミナル（コマンドプロンプト）で以下のコマンドを入力して、インストールの確認をします。
```bash:bash
node -v
npm -v
```
それぞれのバージョン番号が表示されれば完了です！

# Reactアプリを作ってみよう
1. ターミナルを開く
2. デスクトップに移動し、React用フォルダを作成する
    ```bash:bash
    cd ~/Desktop
    mkdir react-apps
    cd react-apps
    ```

3. プロジェクトを作成する
    以下のコマンドを入力して、Reactアプリのもとを作成します。
    ```bash:bash
    npx create-react-app my-app
    ```
    `my-app`の部分は、好きなプロジェクト名に変えてOK！
    コマンドを実行すると、Reactアプリのフォルダが自動的に作られます。
4. アプリフォルダに移動
    ```bash:bash
    cd my-app
    ```
5. サーバーを起動
    ```bash:bash
    npm start
    ```
ブラウザが自動で開いて、以下のような画像が表示されれば成功です！
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4073103/4b691a41-78bb-4118-aac7-0aa8ce5267e7.png)

# まとめ
今回はReactの概要と環境構築について紹介しました。
React開発のスタートラインに立てましたね！
次は作成したアプリに「文字を表示してみる」「ボタンを押して動かしてみる」といった簡単な機能を追加してみましょう！
【GAS】大量シートのシートリンク作りたいけどめんどくない？

一覧シートを一番左に作って下記を流せばシート名＆リンクのインデックスがいっちょあがり。

```js:
let gssObject = SpreadsheetApp.getActiveSpreadsheet();
let mainSheet = gssObject.getSheetByName("一覧");

function myFunction() {
  let sheetNmArr = gssObject.getSheets();
  let nmAndLinkRet = [];
  let i = 0;
  sheetNmArr.forEach(function(targetSheet){
    let sheetNm = targetSheet.getName();
    if (sheetNm != "一覧") {
      nmAndLinkRet[i] = [];
      nmAndLinkRet[i][0] = "=ROW()-1";
      nmAndLinkRet[i][1] = sheetNm;
      nmAndLinkRet[i][2] = "=HYPERLINK(\"#gid=" + sid(sheetNm) + "\",\"リンク\")";
      i++;
    }
  });
  // 2行目A列から出力
  mainSheet.getRange(2, 1, nmAndLinkRet.length, 3).setValues(nmAndLinkRet);
}

// シートID取得関数
function sid(sheetName) {
  return gssObject.getSheetByName(sheetName).getSheetId();
}
```

シートID取得関数はGoogleSpleadSheetから`=sid("シート名")`で呼び出してGID取得できるので、`=HYPERLINK("#gid="+sid("シート名"),"リンク")"`でリンク作成することも可能。（ただしGASを読み込む必要があるので、少しラグが発生する）
Delta Lake入門：初心者でもできるテーブル作成＆更新

本記事では、Databricksを初めて使う方に向けて、**Delta Lake**を使ったテーブルの作成・更新・タイムトラベルを体験できるよう、わかりやすくステップバイステップで解説します。

---

## 📘 Delta Lakeとは？

Delta Lakeは、通常のCSVやParquetファイルのような"保存するだけの形式"とは違い、**上書き・更新・削除・巻き戻し**などの操作ができる「進化した保存形式」です。

簡単に言うと：

> 💡 Excelで "保存してからやり直す" 機能があると思ってください！

---

## 🚀 この記事でできること

* Deltaテーブルの作成（CSVから）
* データの更新（UPDATE）
* タイムトラベルで過去の状態に戻る

---

## 🛠 Databricksの準備

* Databricks Community Editionに登録（無料）
* ノートブックを新規作成
* クラスターを起動（Pythonが選べる設定でOK）

---

## 🧪 ステップ1：CSVデータを読み込んでDeltaテーブルを作る

まずは簡単なCSVファイル（例：商品一覧）を読み込んで、Deltaテーブルとして保存します。

```python
# サンプルデータ読み込み
csv_path = "/databricks-datasets/retail-org/products/products.csv"
df = spark.read.csv(csv_path, header=True, inferSchema=True)
df.display()

# Delta形式で保存
df.write.format("delta").mode("overwrite").saveAsTable("products_delta")
```

---

## 🛠 ステップ2：データを更新してみよう

たとえば、すべての"price"列を10%アップさせてみます。

```sql
-- SQLモードで実行
UPDATE products_delta SET price = price * 1.1;
```

確認：

```sql
SELECT * FROM products_delta;
```

---

## 🕓 ステップ3：タイムトラベルしてみよう

変更前の状態（Version 0）を見てみましょう：

```sql
SELECT * FROM products_delta VERSION AS OF 0;
```

または、直近2分前のデータを指定して見る：

```sql
SELECT * FROM products_delta TIMESTAMP AS OF current_timestamp() - INTERVAL 2 MINUTES;
```

---

## 💡 よくある質問

| 質問                 | 回答                            |
| ------------------ | ----------------------------- |
| 保存しないとタイムトラベルできない？ | Delta形式に保存すればOK！自動で履歴が残ります    |
| CSVやParquetとの違いは？  | Deltaは更新・削除・履歴参照ができます         |
| Databricks以外でも使える？ | Spark OSSやDremioなど一部ツールでも使えます |

---

## 🧼 おまけ：テーブルを整理しよう

ファイルを最適化したいとき：

```sql
OPTIMIZE products_delta;
```

古いバージョンを削除したいとき（7日保持）：

```sql
VACUUM products_delta RETAIN 168 HOURS;
```

---

## ✅ まとめ

Delta Lakeを使えば、**普通のデータ保存に「安心・便利・やり直し」を追加**できます。

今回覚えておきたいこと：

* `saveAsTable()` → Deltaで保存
* `UPDATE` → 値を上書きできる
* `VERSION AS OF` → タイムトラベル

---

## 🔗 参考リンク

* [Delta Lake公式ドキュメント](https://docs.delta.io/)
* [Databricks Community Edition](https://community.cloud.databricks.com/login.html)
Azure Databricksとは？

# はじめに

Azure Databricksは、Microsoft AzureとDatabricks社が共同開発した、Apache Sparkベースのビッグデータ分析サービスです。本記事では、Azure Databricksの基本概念、アーキテクチャ、操作手順を通して、初学者でも理解しやすい形で紹介します。

---

# 本記事のゴール

* Azure Databricksの全体像を理解する
* クラスタ作成からノートブックの操作までの基本操作を体験
* データの読み込み、加工、保存の簡単なETLを試す

---

# Azure Databricks とは

Azure Databricksは、Apache Sparkベースのクラウドデータ分析プラットフォームであり、データエンジニア、サイエンティスト、アナリストがコラボレーションできる環境を提供します。

* スケーラブルなデータ処理基盤
* ノートブック形式での開発と実行
* Delta Lakeによる信頼性の高いストレージ

---

# Databricks を利用するメリット

* 簡単なUI操作でクラスター管理が可能
* 多言語（Python, SQL, Scala, R）対応
* Sparkベースの高速処理
* Azureサービスとの高い統合性

---

# 基本的な Azure Databricks の操作手順

## クラスターの作成

### クラスターとは

Sparkジョブの実行環境であり、計算ノードの集合体です。DatabricksではUIから簡単に起動・停止が可能です。

### クラスターの作成手順

1. \[Compute] タブを開く
2. \[Create Cluster] をクリック
3. 名前・スペックを入力して作成

## DBFS 内にデータのアップロード

### DBFS とは

Databricks File System。Databricksワークスペースに統合された仮想ファイルシステム。

### データの準備

CSVやParquetファイルを用意します（例：`sample.csv`）。

### データのアップロード手順

1. \[Data] タブ → \[Upload File]
2. ファイルを選択し、`/FileStore/` に保存

## ノートブックの立ち上げ

1. \[Workspace] → \[Create Notebook]
2. 言語（例：Python）を選択
3. クラスターをアタッチし、以下のようにコードを実行：

```python
print("Hello, Databricks!")
```

## データの簡単なETL処理（読み込み→加工→DBへ保存）

### データの読み込み

```python
df = spark.read.csv("/FileStore/sample.csv", header=True, inferSchema=True)
df.display()
```

### データ加工

```python
df_filtered = df.filter(df["column_name"] > 100)
df_filtered.createOrReplaceTempView("filtered_data")
```

### Delta Lakeとして保存

```python
df_filtered.write.format("delta").mode("overwrite").saveAsTable("sample_table")
```

## データベースとテーブルの確認

```sql
SHOW TABLES;
DESCRIBE TABLE sample_table;
```

---

# まとめ

Azure Databricksは、データ処理、分析、AIを一体化したパワフルなプラットフォームです。本記事では、クラスタ作成からノートブック操作、簡単なETL処理まで一連の流れを体験しました。次回はDelta Lakeの詳細や、SQLによる分析について掘り下げていきます。

---

# 参考リンク

* [Azure Databricks ドキュメント](https://learn.microsoft.com/ja-jp/azure/databricks/)
* [Databricks Community Edition](https://community.cloud.databricks.com/login.html)
RuntimeError: Failed to import transformers.modeling_utils because of the following error (look up to see its traceback): [Errno 2] No usable temporary directory found in ['/tmp', '/var/tmp', '/usr/tmp', の対処法

# RuntimeError: Failed to import transformers.modeling_utils because of the following error (look up to see its traceback): [Errno 2] No usable temporary directory found in ['/tmp', '/var/tmp', '/usr/tmp', の対処法

ディスクエラーになっている可能性が高い
基本的には.chacheが原因の可能性が高い


```
du -h --max-depth=1
```
不必要でファイル容量が多いものを削除する
```
122M    ./results
20K     ./prompts
28K     ./scripts
260K    ./src
145M    .
```
上のようにどのディレクトリにどのくらいの容量になっているかがわかる