OmniAICreator/Qiita-1.07M huggingface dataset:
VueUseのuseStorageとシリアライズ処理

## はじめに

Vue環境で開発をしていると、VueUseはもう欠かせないものになって来ました。

今回は、その中でもブラウザのストレージ（LocalStorageやSessionStorage）を扱う`useStorage`関数に注目し、特にデータのシリアライズ処理について深掘りしていきたいと思います。

## 使い方
以下のように、keyとなる文字列と、localstorageに保存する値を渡してあげると、毎回setItemやgetItemを書く必要がなくVueのrefのような使い方ができるようになります。

なので、watchをかけたり、値を直で代入することもできます。localStorageは処理が色々なところに散在しがちなのでuseStorageを使うことでかなりスッキリした書き方ができます。

``` ts
const example = useStorage('key', value);
```

https://vueuse.org/core/useStorage/

## シリアライザー
### シリアライザーとは？
大体のケースは上記の書き方で解決できますが、一つ引っかかることがあります。
localStorageにはオブジェクトをその形のまま保存することができないんです。

値を入れても、[object Object]が保存されてしまいます。

``` ts
const userData = {
  name: "田中",
  age: 25,
  hobbies: ["読書", "旅行"]
};

localStorage.setItem("user", userData); // '[object Object]'
```

シリアライザーとは、このようなプログラム上のデータ（オブジェクトや配列など）を保存や転送できる形式（主に文字列）に変換する仕組みのことです。

普段のlocalStorageの使い方だと以下のような形になります。

``` ts
// シリアライズ（データ → 文字列）
const serialized = JSON.stringify(userData);
localStorage.setItem("user", serialized);
// {"name":"田中","age":25,"hobbies":["読書","旅行"]}

// デシリアライズ（文字列 → データ）
const stored = localStorage.getItem("user");
const deserialized = JSON.parse(stored);
console.log(deserialized.name);  // "田中"
```

### useStorage

useStorageでは、以下のようなインターフェースでシリアライザーを定義しています。

```typescript
export interface Serializer<T> {
  read: (raw: string) => T
  write: (value: T) => string
}
```

1. `read`: ストレージから読み取った文字列を、適切な型に変換
2. `write`: JavaScriptの値をストレージに保存可能な文字列に変換

## シリアライザーの実装
VueUseは、以下の型に対する標準的なシリアライザーを提供しています。

https://github.com/vueuse/vueuse/blob/main/packages/core/useStorage/index.ts

- boolean
- number
- string
- object
- map
- set
- date
- any

例えば、booleanのシリアライザーは以下のように実装されてますね。

```typescript
boolean: {
  read: (v: any) => v === 'true',
  write: (v: any) => String(v),
}
```

特に興味深いのは、MapやSetのシリアライザーです。

```typescript
map: {
  read: (v: any) => new Map(JSON.parse(v)),
  write: (v: any) => JSON.stringify(Array.from((v as Map<any, any>).entries())),
},
set: {
  read: (v: any) => new Set(JSON.parse(v)),
  write: (v: any) => JSON.stringify(Array.from(v as Set<any>)),
}
```

`JSON.stringify`では直接シリアライズできない特殊なデータ構造を、配列経由で変換する工夫もされてそうです。Mapの処理では`entries`を使ってたりしてますね。

https://qiita.com/Procrustes5/items/48b88443f9df928dbb9a

## カスタムシリアライザー

オブジェクトを入れるためだけではなく、enumを使っていて書き込む値と読み取る値を異なったものにしたいときもあり、独自のデータ型を扱う場合は、カスタムシリアライザーを実装することができます。

例えば、以下は座標データを扱うカスタムシリアライザーの例です。

```typescript
interface Point {
  x: number;
  y: number;
}

const pointSerializer: Serializer<Point> = {
  read: (raw: string) => {
    const [x, y] = raw.split(',').map(Number);
    return { x, y };
  },
  write: (value: Point) => `${value.x},${value.y}`
};

// こんな感じでかけます
const position = useStorage('position', { x: 0, y: 0 }, localStorage, {
  serializer: pointSerializer
});
```

## おわりに
型安全も、エラーハンドリングも容易にできるようになるので、useStorageのシリアライザーは非常にありがたいですよね。
これからもバンバン使っていきたいところですね~
【合格体験記】AWS Certified Security - Specialty（SCS-C02）に合格しました

先日 AWS Certified Security - Specialty に合格しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385302/c04abaa3-b55f-4031-8798-9939b4c243c8.png)

勉強したことなどを書きます。

# 前提
- 2024年10月にSAA、2024年11月にDVAに合格しています。
- AWSの利用経験は1年くらい。

# 勉強内容
[CloudTech](https://kws-cloud-tech.com/)の該当問題（全385問）を2周しました。具体的には以下の流れで学習を進めました。
- 1日2~30問解き間違えた問題はチェックしておき、次の日に再チャレンジする。
- わからない単語、サービスが出てきたときはchatGPTに質問する。
    - 「Security Hub, GuardDuty, Configの違いは？」など
    - 完全に理解する必要はなく、その選択肢が正解である理由が何となくわかるレベルになればOKだと思います。
- CloudTechの解説を読んで理解できなかった場合も、問題文をコピーしchatGPTに解説してもらう。

# 試験当日
170分で65問を解くのですが、30問目くらいから集中力が無くなってきて最後15問くらいは問題文が頭に入らなくなっていました。。
15:30くらいに退出。20:00には結果が出ていました。

# 所感
- CloudTechと同じ/似た問題が10問くらいありました。（チートだろ）
- 65問ぶっ通しで解く練習をして長文に慣れておいた方がよさそう。
ABC386Eを解いた【二項係数】



筆者はレート800前後の茶～緑コーダ

ABC386当日にACできなかったE問題を解いていく
    
https://atcoder.jp/contests/abc386/tasks/abc386_e

# 実装コード

二項係数が10^6以下というのはK>N-Kの場合もあるようでそのときは総XORから、該当しない項をサイドXORして取り除く必要があったみたい。

```python:main.py
from bisect import bisect_left, bisect_right, insort_left, insort_right
from collections import defaultdict, Counter, deque
from functools import reduce, lru_cache
from itertools import product, accumulate, groupby, combinations
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N, K = rLI()
    A = rLI()
    ret0 = 0
    if K>N-K:
        ret0 = reduce(lambda a,b:a^b,A)
        K=N-K
    print(max(reduce(lambda a,b:a^b, c,initial=ret0) for c in combinations(A,K)))
if __name__ == '__main__':
    main()

```

# まとめ

XORの処理を軽量化するのがメインかと思もっていたが
二項係数の特殊な場合を考慮するのが本丸だった。
LinuxMint21.3にnvidiaのドライバーを入れようとして詰まったときの解決方法

久しぶりにPCを設定し直してドライバーを入れようとしたらすんなり入らず数時間ほど詰まったので備忘録を兼ねて。

# 検証環境
OS: LinuxMint21.3
GPU: NVIDIA GeForce RTX 3060
# 手順
### Nouveau（デフォルトのオープンソースドライバ）の無効化
`/etc/modprobe.d/blacklist-nouveau.conf`に以下を記述したファイルを作成
```
blacklist nouveau
options nouveau modeset=0
```
変更を適用して再起動
```
sudo update-initramfs -u
sudo reboot
```
### ドライバアンインストール
余計なものが入ってたら消す
```
sudo apt-get purge nvidia* -y && sudo apt-get autoremove -y
```
### ドライバインストール
リポジトリの追加と更新
```
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update -y
```
* ドライバーマネージャーから入れる場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973539/9193d3e8-0335-d6ff-65a3-dcd0b1117d27.png)
ドライバを選択して「変更を適用」を押下するとインストールできる。
インストール中にエラーが発生した場合はドライバをアンインストールして他のものを入れる。
正常に入れられたら再起動する。

* コンソールから入れる場合
インストール可能なドライバを出力
  ```
  ubuntu-drivers devices
  ```
  出力された候補からドライバをインストールして再起動する
  ```
  sudo apt install nvidia-driver-XXX -y
  sudo reboot
  ```

### 確認
以下のコマンドでインストールできているかを確認する。
```
nvidia-smi
```

これでバージョンなどの情報が出力されたならインストールは完了。
ここまではよく見る手順だが、なぜかうまくいかずにドライバを消しては再インストールを繰り返して全滅してしまったので解決法を探ることに。

# `NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver.`と出たら…
grubに設定を追加する。
`/etc/default/grub`を編集して`GRUB_CMDLINE_LINUX_DEFAULT`に以下のように値を追記する。
```
GRUB_CMDLINE_LINUX_DEFAULT="pci=realloc=off"
```
※すでに設定されている値があったら半角スペースでつないで値を追記する。
```
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=realloc=off"
```
設定を反映させて再起動
```
sudo update-grub
sudo reboot
```

`nvidia-smi`で情報が出力されるようになってたら今度こそインストール完了。
ProxmoxのホストとVMを物理的にお引越ししてみた

# あらすじ
元々ProxmoxをインストールしていたマシンをWindowsマシンに転用することになり，お家に余っていたマシンにSSDを載せ替えることでお引越ししようとした．

# 環境
- 旧マシンにてProxmoxをインストールし運用していた
- M.2 SSDにVM等を，SATA SSDにホストを入れていた

# 作業内容
### 1. SSDを付け替える
ここでは，とりあえずホストをインストールしたSSDおよびVMのデータなどを配置しているSSDがあればそれも含めて全て付け替えた

### 2. 移転先マシンを起動して動作確認
~~動作を確認して，LVMで認識できているかを確認する．認識できていなければ，適宜`lvscan`など実行して認識させる．（参考:https://qiita.com/TsutomuNakamura/items/93c6333c8dd32aeb197a など)~~

今回は起動時点で認識できていたので，このステップは難なくクリア．以前ホストを再インストールして，VMの入ったSSDを後から追加したときはこれらの設定が必要だった．

ただし，この時点ではもちろんネットワークには出られないので，ディスプレイに接続してコマンド操作する必要がある．

### 3. interfaceの設定を変更する
続いて，ネットワークに接続できるようにNICなどのインターフェースの内容をマシンに合わせて上書きする必要がある．まず，マシンに乗っているネットワークインターフェースの名前を確認する．
```
sudo ip addr
:
:
2: eno1 ....[ipアドレスなどの情報]
```
今回は，eno1を使用した．（enpから始まるものもあったが，ネットワークに出られなかった．）

名前を確認したら，interfacesを書き換える．IPアドレスも固定設定するならついでにやっておくと良い．接続する予定のネットワークの空いているアドレスを割り振るようにして，ゲートウェイも合わせて変更しておく．今回は，同じネットワークなのでアドレス関連はそのままにしている．
```
sudo vi /etc/network/interfaces
```
``` vim
iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.15.128/24
        gateway 192.168.15.1
        bridge-ports eno1 <-ここを先ほど確認した名前に変更する
        bridge-stp off
        bridge-fd 0
```
細かい内容はWikiを参照．（https://pve.proxmox.com/wiki/Network_Configuration )

変更できれば，`sudo ifreload -a`を実行して，設定を再読み込みする．ここで，適当にゲートウェイにpingを打つなどして通れば設定は完了しているだろう．（インターネットに出たい場合は，1.1.1.1などに打って返ってくればおそらく問題ない）


### 4. SSHできるか確認する
ここまでくれば，あとは他の端末からSSHできるかどうかを確認すれば良い．SSHを導入する設定はここでは省略する．

# まとめ
載せ替えても，基本的な設定を変更すれば問題ない．ただし，クラスタ組んでたり色々カスタムしてる場合は不明．できればやりたくない．
Rails is not currently installed on this system. To get the latest　version, simply type:

以下のようなコメントが出た場合

    $ Rails is not currently installed on this system. To get the latest 　　　　　　version, simply type:

    $ sudo gem install rails
    
    You can then rerun your "rails" command.


バージョン確認したところとて、コマンドも実行できない。
    
    $ rails -v

順番を確認するらしい

    $ which -a rails
    /usr/bin/rails
    /Users/your-name/.rbenv/shims/rails

これだとエラーが出る
⭐️ターミナル再起動

これで順番が入れ替わる
    
    $ which -a rails
    //順番が入れ替わる
    $ /Users/username/.rbenv/shims/rails
      /usr/bin/rails


これだとrailsコマンドが実行される

    $ rails -v
出力

    Rails 8.0.1
PDFの差分を出力するシェルスクリプト

| A | B | Diff |
| :---: | :---: | :---: |
| ![a_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/a77c6cb4-a197-3573-436d-274fb9b92594.png) | ![b_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/bd29ec79-efb9-9294-9b40-8dd32ea21892.png) | ![diff_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/66e6e054-7114-8173-e103-234dbcee0f4d.png) |
| ![a_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/d34b13c4-825b-ce79-dc96-41a527befd56.png) | ![b_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/49514f6d-8590-6c40-df38-51f4ebc7af9e.png) | ![diff_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/4ad63bc8-d542-1b07-a9f9-a1889898f4af.png) |

<details>
<summary>mask.png</summary>

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/de928d8a-1531-d7f1-30ba-618081de33f3.png)

</details>

[`pdfdiff`](https://github.com/u1f992/pdfdiff)というシェルスクリプトを作りました。入力したPDFの各ページを比較し、

- 追加した箇所を緑色
- 削除した箇所を赤色
- その他変更した箇所を黄色

で強調した画像を出力します。それぞれのピクセル数も出力するので、後続の処理でフィルタするとよいでしょう。

マスク画像で特定箇所の変更を無視することも可能です。

LaTeXなどを用いて執筆された、相互参照を多用する大規模な文書では、一部分を変更するだけで文書全体に影響が及ぶ可能性があります。変更箇所がどこか別の箇所から参照されている場合はもちろんのこと、たとえその部分自体に参照がなくても、文章の長さが変われば後続の段落やページ番号がずれ込み、結果的に索引や目次が変化することもあり得ます。LaTeXの典型的な組版フローでは、参照を正しく解決するために文書全体を複数回タイプセットします。このような仕組み上、文書の一部だけを切り出して最終的なレイアウトを反映させることは、原理的に困難といえます。一方、色校修正や増刷修正などのケースでは、修正前後の出力を比較し、差分を明らかにする必要があります。`pdfdiff`は、そのような場面での利用を目的としたスクリプトです。

[callas pdfToolbox](https://www.callassoftware.com/en/products/pdftoolbox)の検版機能を拝見し、簡単なものであれば自作できるのではないかと感じて作ってみました。Adobe Acrobatにも比較機能はありますが、自動組版との相性を考えると、コマンドラインで利用しやすい形にまとめるのは有用だと考えています。当初は既存のツール、特にImageMagickの`compare`を活用すれば目的を達成できると考えていましたが、まさにこれといえる出力を得ることはできませんでした。

まだまだ改善の余地はあり、使いながら直していくつもりです。
【Jest環境エラー】ReferenceError: TextEncoder is not defined

## はじめに
React+TypeScriptの環境をViteで作成し、Jestをインストール後、
`npm run test`でテストする際に`ReferenceError: TextEncoder is not defined`というエラーが発生しました。

当エラーの解決法についてご紹介します。

## 参考記事
https://www.dhiwise.com/post/how-to-resolve-the-error-textencoder-is-not-defined-jes

## 解決方法
``` react
// jest.setup.tsに下記を追加
global.TextEncoder = require("util").TextEncoder;

// TextEncoderがすべてのテストでグローバルに使用できるようになる
```

## 原因
jest環境は、テスト用にブラウザのような環境をシミュレートするように設計されています。ただし、TextEncoderやTextDecoderなど、ブラウザ固有のオブジェクトがすべてデフォルトで含まれているわけではありません。そのため、これらのオブジェクトに依存するテストを実行するとエラーが発生する可能性があるようです。

TextEncoderは、文字列（UTF-8）をエンコードしてUint8Arrayとして扱うためのWeb APIです。

## まとめ
Jest環境でテストしていて初めて遭遇したエラーでした。

これからどんどんテストを書いていってテスト実行時のエラーにも慣れていきたいです。
ESP32でH/Lの変化を高速に検出するなら割り込みよりポーリング

# 背景
ESP32だけでクロック信号を読み取ろうとしたら、外部割り込みで全然間に合わないことが発覚。
色々調べているうちにESP32なら外部割り込みを使わない方が速いと分かった。

# 参考記事
https://github.com/MacLeod-D/ESp32-Fast-external-IRQs

# 普通は外部割り込みの方が都合が良いんですが...
信号のHigh,Lowを検出してその瞬間から処理をさせようとした場合、外部割り込みを使うのが普通です。
ざっくりですが、信号の変化を検出する方式の特性はこんな感じです。
* 外部割り込み
  マイコンが信号の変化を見張ってくれる方式。変化があったときにお知らせしてくれる。
  プログラムで信号を見張る必要が無いので、その間は「別の処理をすることができる。
  
* ポーリング
  プログラムで信号の変化(H→L or L→H)を見張る方式。それ以外のことが何もできない。
　もしくは「別な処理」と「信号の変化を見る」を交互に行うこともできるが「別な処理」をする分、信号の検出が遅れる

でも、これは「CPUが1個」の場合です。

# ESP32はDual CPUなので、そうはならない！

ESP32はDual CPUなので、前述の内容を覆すことができます。

## ESP32のDual CPUでのポーリング

以下のような構成にすると、割り込み処理より高速に信号の変化を検出できます。
・Dual CPUをフル活用するために、FreeRTOSでマルチタスクを使う
・CPU0(WiFi用処理など重要な処理を実行するCPU)で、「別な処理」を行う。
・CPU1(Arduinoなどのプログラムを実行するアプリ用CPU)は、「信号の変化を見る」専用処理とする。

最初に書いた参考URLの記事では、信号の変化発生から検出までの時間はそれぞれ以下となっています。
・外部割り込みの場合：8.94us=8940ns
・DualCPUでのポーリングの場合：176ns

単純計算ですが、8940/176 ≒ 50.79、つまり検出速度は50倍以上ポーリングの方が速いことになります。

# まとめ
実際には3.6MHzぐらいの信号を漏れなく検出できるようになるとのことですから、かなり速くなりますよ。

なお、この記事は、[【札幌現地+オンライン開催】力強くブログを108記事アウトプットする日の 20241229](https://forceoutput.connpass.com/event/339151/)のブログの一つとして書きました。
参加した皆さん、お疲れ様です！
(ローカル環境の)PostgreSQLを外部から接続するときの注意点

pgadminなど、外部からPostgreSQLに接続しようとして接続できない場合、いくつかの設定ファイルで設定値を追加、変更の必要があります。以下の設定例に従って値を変更してみてください。

:::note alert
この設定例は、セキュリティを考慮しないPCのローカル環境を想定した設定例です。それ以外の環境で設定する場合、マニュアルで適切な設定方法を確認してください。
:::

# PostgreSQL 設定ファイルの変更

PostgreSQL サーバーがリモート接続を許可するように設定を変更します。
PostgreSQL の設定ファイル (postgresql.conf) を開き、listen_addressesはデフォルトでは localhost になっているため、を以下のように設定します
```
listen_addresses = '*'
```

# pg_hba.conf の編集

pg_hba.conf ファイルを編集して、リモートクライアントの接続を許可します。
```
host    all             all             0.0.0.0/0            md5
host    all             all             ::/0                 md5
```
上の行がIPv4アドレス、下の行がIPv6のアドレスの設定です。設定は順番に
- host: TCP/IP 接続を許可する
- all (データベース): すべてのデータベースへの接続を許可
- all (ユーザー): すべてのユーザーによる接続を許可
- 0.0.0.0/0（::/0）: すべての IPv4(IPv6) アドレス範囲
- md5: パスワード認証方式

# PostgreSQL サービスの再起動
上記設定を行い、サービスの再起動を行います。
```
sudo systemctl restart postgresql
```
Deep Learning for Coders with fast and PyTorch

# 昨今のAIの活躍
現在ではいろんなところでAIが使われている。
- chatgpt
- github copilot
- レコメンデーションシステム

これらの仕組みに興味を持ったため、AIについて学習してみることにした。

# AIに関する職業の色々と学習方法
5年前の動画ですが、AIエンジニアがどういったものか発信している動画を見つけました。
気になる方はチェックしてみてください。

- KENTA / 雑食系エンジニアTV
    - [データサイエンティストとAIエンジニアとリサーチャーの違い](https://www.youtube.com/watch?v=obvIMtqaHfI)
    - [AIエンジニアへジョブチェンジするための戦略について](https://www.youtube.com/watch?v=DVH-jvDPk5s)

以下は上記動画の要約です。

- データサイエンティスト
    - コンサル的要素が強く、技術専門というよりPM的な業務がメインになってくる
    - 上流だとモデル設計・顧客折衝を行い、下流だと設計通りにモデル構築を行うこともある
    - データサイエンティストの業務の一部として、AIエンジニアがあるイメージ
    - キャリア的には過去の経験が溜まっていないと使い物にならないので、独り立ちするまでに時間がかかる
- AIエンジニア
    - 機械学習モデルを構築し、パラメーター調整などを行う
    - データ整理も大事な仕事（９０％くらいが前処理って言われている）
        - 自然言語処理：名寄せ（カタカナ、漢字を使った同じ単語の集約）
        - 点在しているデータの集約（SQLを使ったり）
    - モデル構築以前として、前処理の知見がかなり必要
    - モデル使用の知見
        - PyTorchで効率よくコードを実装できる
        - 論文を読んで実装する（先端な会社は、業務時間の10~20％はこの作業を行うらしい）
    - 大体２〜３年で前処理・モデル使用の知見を蓄えることを目指す

おすすめの学習法
- oreillyを読んでみる
- kaggleでコードを読み、わからないところを都度調べる（これが一番おすすめ）
- 英語に抵抗がない初学者は、[fast.ai](https://www.fast.ai)がおすすめ


# Deep Learning for Coders with fast and PyTorchについて
[fast.ai](https://www.fast.ai)で取り扱っている[学習用のチャプター](https://course.fast.ai)を書籍にまとめたのが、
Deep Learning for Coders with fast and PyTorchとなる。
そこでAI学習のとっかかりとして、上記書籍をやってみることにした。

※ 上記の書籍を行うには、環境構築が必要です。
自分は下記の通り行いました。

 - python 実行環境
     - [Paperspace](https://www.paperspace.com)で月$10のサブスクリプション

書籍の推奨実行環境（本より抜粋）
- [Kaggle Notebooks](https://www.kaggle.com/docs/notebooks)と[Paperspace](https://www.paperspace.com)を使用する

>【原文】How do I get started?
>(中略)
>The entirety of every chapter of the book is available as an interactive Jupyter Notebook.
>(中略)
>We’ll mainly use Kaggle Notebooks and Paperspace Gradient...
>(中略)
>We strongly suggest not using your own computer for training models in this course, unless you’re very experienced with Linux system adminstration and handling GPU drivers, CUDA, and so forth.

# Chapter 1 メモ
機械学習にはラベル付が非常に大事である

入力データからラベルを取得する方法として、主に二点が使用されている
- ディレクトリ名
    - 最も一般的なのは、親ディレクトリの名前をラベルとして使用する方法
- ファイル名
 
画像を機械学習にかける際、処理前のインプット画像を224pxの正方形にリサイズして使用する
- 224という値は伝統的に決まっているらしい
- サイズを大きくすれば精度は上がるが、必要なGPUと金額が増加する

ClassificationとRegressionの違い
- Classificationはクラスもしくはカテゴリを予測する際に使用される
    - 例）dog, catなどのラベルからインプット画像が何に該当するのか予測する
- Regressionは数値の予測に使用される
    - 気温や緯度軽度など

- 機械学習に使用するデータは、学習用データ(train)と検証用データ(validate)に分けられる
    - 前者は、training set と呼ばれる
    - 後者は、validation set と呼ばれる
    - データセットを与えた時、指定した割合に応じて自動で学習データと検証データに分けてくれる機能もある
        - fast.aiライブラリのvalid_pctがこれにあたる
- 学習モデルが、データの傾向よりもデータそのものを記録し始めたとき、大抵予測精度が悪くなる
    - これをoverfittingという
- 機械学習のアーキテクチャにはさまざまな種類があるが、resnetというのが大体の場合うまくいく
    - 早くて正確
    - レイヤは34くらいがちょうどいいらしい
        - 多いと学習に時間がかかるし、overfittingに陥りやすい
- modelには事前学習済みのものと、そうでないものがある
    - 事前学習済みのモデルは、ネットからダウンロードして使用できる場合がある
    - 使用できるなら、事前学習済みを使用した方がいい
        - 構築の手間がない
        - コストがかからない
        - ほとんどの人はどのモデルを使うかよりも、何ができるかに興味があるため
- 本来トレーニングされた用途とは別のタスクに事前学習モデルを使用することは、transfer learningという
- 機械学習と深層学習は以下の違いがある
    - 機械学習：データを学習するプログラムを定義することを指す
    - 深層学習：機械学習の一種であり、ニューラルネットワークを多数の層によって構築するプログラムを指す


(以上第一章終了)
HTML　チートシート　爆速プログラミング

# タイトル　Heading
★h1（優先度高い）〜 h6（優先度低い）まで
```markdown
<h1>タイトル</h1>
```
# 段落　paragraph
★ひとかたまりの文字
```markdown
<p>Qitaで記事を書いてエンジニア能力を向上させる。</p>
```

# 改行　break

```markdown
<p>Qitaで記事を書いてエンジニア能力を向上させる。<br>
疲れたら休憩しよう</p>
```

# 項目　unorderedList
```markdown
<ul>
    <li>野球</li>
    <li>サッカー</li>
    <li>バスケ</li>
</ul>

//出力例
・野球
・サッカー
・バスケ
```

# ランキング　orderdList
```markdown
<ol>
    <li>Aさん</li>
    <li>Bさん</li>
    <li>Cさん</li>
</ol>

//出力例
1. Aさん
2. Bさん
3. Cさん
```

# 項目名　説明　descriptionList
```markdown
<dl>
    <dt>名前</dt>
    <dd>Aさん</dd>
</ol>

//出力例
名前:
    Aさん
```

# リンク　ancor
★リンク先に遷移　別タブ遷移
★リンクをクリックすると電話をかけられる
```markdown
<a href="aaa.co.jp" taret="_blank">

<a href="tel:000-0000-0000"></a>
```

# 画像　image
```markdown
<img src="ファイルパス/画像名" alt="画像の説明">
```

# 強調　emphasis
★文字が斜体になる　osによって変わらないことも
```markdown
<em>プログラミングを学習しよう</em>
```

# 表（テーブル）　table
```markdown
<table>
<thead>
<tr><th>プログラミング言語</th><th>難易度</th><tr>
</thead>
<tr><td>PHP</td>★★★</td></tr>
</table>

//出力例
プログラミング言語　難易度
PHP　　　　　　　　★★★
```

# 連絡先（住所など）
```markdown
<address>
<p>東京都港区</p>
<p><a href="tel:000-0000-0000">000-0000-0000</a></p>
</address>
```
ElixirChipとElixirChip Liteで超低消費電力・高性能の世界へ

ElixirChipとElixirChip Liteに関する技術的ポエムを書いてみました．

ElixirChip構想を最初に表明したのは， @piacerex さんです．実は @piacerex さんがQiita記事でElixirChipを書く前から，私も独自プロセッサによるElixirアクセラレーションの可能性には気づいて秘密裏に研究を進めていたのですが，当時の私は事業性を見出していなかったので，大々的に発表する気になれず，細々と個人的に研究を進めていたのみでした．が， @piacerex さんのElixirChip構想の発表により，事業性があるんだということを思い知らされて，俄然やる気が出て， @piacerex さんに近づき，当時転職活動をしようとしていた @Ryuz さんを @piacerex さんにご紹介して引き抜いてもらい，並行して関連特許も出願して，ElixirChipについての研究を本格的にスタートしました．

ElixirChipについては，Interface 2024年10月号別冊付録のFPGAマガジン特別版No.3のコラムに書かせていただきました．Kria KR260を用いて，積和演算について，理論上，最高速クロック周波数で駆動することに成功し，高い電力あたり性能を達成しました．その後の検証で，消費電力を実測し，実証した電力あたり性能としては254GOPs/Wを達成しました．これは同程度のプロセスルールであるIntel Xeon E3-1285 v6に対して，24.2倍の電力あたり性能です．

さて，従来CPUでも，Elixirを導入することで，30倍の電力あたり性能を達成できます．下記事例では，300基の従来CPUを必要とするウェブ・アプリケーションを従来CPU10基に抑えることができたという報告です．

https://paraxial.io/blog/elixir-savings

これらを合わせると，726倍の電力あたり性能を達成できそうな計算になります！

最先端のプロセスルールとAIアクセラレータを採用したFPGAであるAMD Versalシリーズで実現したら，もっと高い電力あたり性能を追求できそうです．

さらに，最先端のプロセスルールでASIC化することで，さらにさらに高い電力あたり性能を追求できそうです．

どのくらいまでいけるんですかね．楽しみです．

さて，ElixirChip Lite という構想も， @piacerex さんの発案によるものです．ElixirChip Liteという構想は，ElixirChipでなくても，携帯電話や自動運転車のプロセッサなど，電力あたり性能の良さそうなプロセッサ向けにElixirによる最適化を行うという構想です．

最近，私が研究しているところで言うと，電力あたり性能の高いApple SiliconやルネサスエレクトロニクスDRP-AIシリーズなどで，ElixirChip Liteを実現すると良いのではないかと思います．

https://qiita.com/zacky1972/items/34ff853daebaf24761a4

https://qiita.com/zacky1972/items/5c92779e2bac7ab631e8

今後の予測では，AIの大規模化に伴い，データセンターの電力需要が急激に伸びるそうですが，ElixirChipとElixirChip Liteで，電力需要の伸びを抑制し，さらには減少させるくらいのインパクトを持たせることで，ゼロカーボン達成に貢献できると良いなと思っています．
GNU Artanis 紹介

GNU Artanis（グヌー アルタニス）は、GNUプロジェクトの一部として開発された、Scheme言語に基づく軽量かつ柔軟なウェブアプリケーションフレームワークです。Artanis は GNU Guile を使用して構築されており、以下のような特徴を備えています。

## 特徴
- 軽量で高速
  - Scheme ベースで設計されているため、シンプルかつ効率的な動作が可能です。リソースの消費を抑えながら、高速な処理を実現します。

- 柔軟なルーティングシステム
  - URL ルーティングの設定が簡単で、直感的なコードで複雑なアプリケーションを構築することができます。

- RESTful 設計のサポート
  - RESTful な API を簡単に実装できるため、モダンなウェブ開発のニーズに応えます。

- コルーチンによる非同期処理
  - 非同期I/Oをサポートしており、高負荷環境でも効率的な処理が可能です。

- カスタマイズ可能
  - 開発者のニーズに応じて、柔軟に拡張やカスタマイズができる設計になっています。

## 主な用途
- 小規模から中規模のウェブアプリケーションの開発
- API サーバの構築
- 自動化ツールやマイクロサービスの実装
- コミュニティとサポート
- GNU Artanis はオープンソースソフトウェアであり、自由に利用・改良が可能です。コミュニティを通じて、開発者同士がサポートし合い、新しい機能の追加やバグ修正を進めています。


## コードの見た目はどうなるのか

```scheme
(use-modules (artanis artanis))
(init-server)
(get "/hello" (lambda () "hello world"))

;; run it
(run #:port 8080)
```

```bash
curl localhost:8080/hello
==> hello world
```

## GNU Artanis 1.0.0 のビルド方法

私のビルド方法は Ubuntu 24.04 に基づいています。ただし、この投稿に従って、お好みのディストリビューションで実行することも可能です。

### 依存関係
以下のコマンドを使用して必要な依存関係をインストールしてください：

```bash
sudo apt install texinfo guile-3.0 guile-3.0-dev build-essential automake git
sudo apt install autoconf libtool libmariadb-dev-compat libmariadb-dev libnss3
sudo apt install libnss3-dev gettext redis redis-server libcurl4-openssl-dev
```

Artanis-0.6の重要な依存関係とそのバージョンは以下の通りです：

- guile-3.0.9
- guile-dbi-2.1.8
- guile-dbd-mysql-2.1.8
- guile-curl-0.9
- guile-redis-2.2.0
- guile-json-4.7.3

この記事では MariaDB を選択しているため、guile-dbd-mysql をインストールする必要があります。

### ビルド依存関係

#### guile-dbi-2.1.8 と guile-dbd-mysql-2.1.8

以下は guile-dbi-2.1.8 および guile-dbd-mysql-2.1.8 のビルド手順です。この2つの依存関係は同じリポジトリ内にあるため、連続してビルドします。

```bash
git clone https://github.com/opencog/guile-dbi.git
cd guile-dbi
git checkout guile-dbi-2.1.8
cd guile-dbi
./autogen.sh
./configure --prefix=/usr
make -j5
sudo make install
ldconfig
cd ..

git checkout guile-dbd-mysql-2.1.8
cd guile-dbd-mysql
./autogen.sh
./configure --prefix=/usr
make -j5
sudo make install
sudo ldconfig
guile-curl-0.9
```

#### guile-curl-0.9

以下は guile-curl-0.9 のビルド手順です：

```bash
git clone https://github.com/spk121/guile-curl.git
cd guile-curl
git checkout v0.9
./bootstrap && ./configure --prefix=/usr
make -j5
sudo make install
sudo ln -s /usr/lib/guile/3.0/extensions/libguile-curl.* /usr/lib/
sudo ldconfig
```

Debian/Ubuntu 環境では、ソフトリンクを作成する必要があります。そうしないと、ライブラリが認識されない可能性があります。

#### guile-redis-2.2.0
以下は guile-redis-2.2.0 のビルド手順です：

```bash
git clone https://github.com/aconchillo/guile-redis.git
cd guile-redis
git checkout -b 2.2.0
autoreconf -vif
./configure --prefix=/usr
make -j5
sudo make install
sudo ldconfig
guile-json-4.7.3
```

以下は guile-json-4.7.3 のビルド手順です：

```bash
git clone https://github.com/aconchillo/guile-json.git
cd guile-json
git checkout -b 4.7.3
autoreconf -iv
./configure --prefix=/usr
make -j5
sudo make install
sudo ldconfig
```

#### Artanis-1.0.0 のビルド
以下はArtanis-0.6のビルド手順です：

```bash
wget -c https://ftp.gnu.org/gnu/artanis/artanis-0.6.tar.gz
tar xf artanis-0.6.tar.gz
cd artanis-0.6
./autogen.sh # このステップを省略するとconfigureスクリプトが生成されません
mkdir -p build
cd build
../configure --prefix=/usr
make -j5
sudo make install
```

### テスト
テストを実行するには、以下のコマンドを使用します：

```bash
make test
```
Microsoft 365付帯のPower Platformライセンス：開発と実行の違いを解説

# Microsoft 365付帯のPower Platformライセンスの調査
Microsoft 365開発者プログラムをアクティブ化し、E5ライセンスに含まれる各種プラン「Power Apps for Office 365(Plan 3)」「Power Automate for Office 365」「Power Virtual Agents for Office 365」は、必要な人に対して最小限設定するため、Power Apps for Office 365 プランについて調査を行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/4c750bb3-5346-fda2-64ee-ae3a05dad6ae.png)

調査の結果、Power Apps for Office 365プランを付与しなくても、Power Apps開発者ポータル( https://make.powerapps.com/ )にはアクセスでき、アプリの作成、プレビュー実行、アプリの公開など、開発に必要な一連の作業は行えることが分かりました。しかし、アプリを公開後に通常の実行を行うと、「Power Appsプランが必要です」というエラーが発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/64db53d7-d49d-5884-723f-33115e569079.png)

調査結果のまとめ
・**開発時**：Power Appsプラン **不要**
・**実行時**：Power Appsプラン **必要**

現時点では上記の挙動が確認されていますが、ライセンスの考え方として開発時にもPower Appsプランが必要かどうかを明確に確認する必要があると考えました。

# Microsoftテクニカルサポートの正式見解

Microsoftテクニカルサポートに問い合わせた結果、以下の回答を得ました。
> Power Apps ライセンスの判定はアプリの通常再生時に行われます。
そのため、ライセンスを付与していない状態でも特段制限なくアプリの編集およびレビュー画面での再生が行えてしまう事象については、正常な動作でございます。
あくまでアプリを通常利用するタイミングでライセンスの判定がなされ、ライセンスが付与されていないユーザーに対しては、該当のメッセージが表示される動作となっております。

# まとめ
Microsoftテクニカルサポートによる正式見解を踏まえた結果、挙動の確認を以下のようにまとめました。
| 製品 | 開発時 | 実行時 |
|:-----------|------------:|:------------:|
| Power Apps       | 不要        | **必要**         |
| Power Automate| **必要**      | **必要**       |
| Copilot（旧Power Virtual Agents）       | **必要**        | 不要         |


## Power Apps
開発時には、アプリの作成やデバッグ実行（プレビュー実行）はライセンスがなくても実施可能です。また、アプリの公開も行えます。ただし、公開したアプリを実行するにはライセンスが必要で、ライセンスがない場合は以下のエラーが発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/a846af6c-3810-bf49-fee1-7c5985e6124b.png)

## Power Automate
開発時には、ライセンスがない場合は以下のエラーが発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/f1a99e33-2b39-7b3a-24ed-f7c44072b2bc.png)

実行時には、Power Automateフローは基本的に「フロー作成者の権限で動作する」という特性があるため、結果的にライセンスが必要となります。厳密に言うと、フローの中でも「インスタントクラウドフロー」については、フロー作成者の権限以外で動作させることが可能ですが、その場合でも何らかの形でライセンスが必要になるため、結果としては変わりません。

## Copilot Studio
前提として、Copilot Studioを使用するには有償ライセンスが必要です。Copilot Studioの開発ページを開くと、以下の画面のように試用版ライセンスの入手が案内されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/d60d1eb9-5ac6-3764-c0c7-4613ed446e17.png)

ただし、Microsoft 365 E5ライセンスのPower Virtual Agentsプランを選択している場合、Teams上でCopilot Studioアプリを起動できます。ただし、この場合に開発できるのはシナリオベースのチャットボット（以前のPower Virtual Agents相当）に限られ、AIベースのチャットボットは作成できません。

このようにして作成した（シナリオベースの）チャットボットは、ライセンスを持たないチームメンバーでも利用が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/51f78e22-b7e3-182f-44dd-c30307a3dea9.png)
Honoに関する自分なりの理解

最近目にすることが増えた[Hono](https://hono.dev)についてのメモです。

# 概要

- 軽量なWebアプリケーションフレームワークです。
- 開発者はCloudflareの日本人エンジニアの方です。Cloudflare上の便利に使えるWebアプリケーションフレームワークがなかったことから自作とのこと。
- Web標準のRequestとResponseを入出力とするfetch関数をエントリポイントとしているため、あらゆるJavaScriptランタイムで動作が可能です。実際にCloudflare Workersをはじめとして、AWS Lambda、Fastly、Deno、Bun、Node.jsで動作します。

# 様々なランタイムでの動作イメージ

HonoのエントリポイントはWeb標準のfetch関数です。各ランタイムで利用する場合は、専用のアダプターを挟んでランタイムのエントリポイントからfetch関数のインタフェースへの変換を行います。

## Cloudflare Workers

Cloudflare Workersの場合、元々Workerのエントリポイントとして期待されるのがfetch関数を持つオブジェクトであるため、特別なアダプターなしでHonoを利用できます。

![cf.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/c9f88284-22ea-dde7-f29e-093c716fab4f.png)

https://hono.dev/docs/getting-started/cloudflare-workers

## AWS Lambda

AWS Lambdaの場合、Lambdaのエントリポイントからfetch関数のインタフェースに変換する専用のhandlerを挟む形で利用します。

![lambda.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/4ef2c82a-a22f-c86d-1b1d-3e232a92f065.png)

https://hono.dev/docs/getting-started/aws-lambda

## Node.js

Node.jsの場合、ランタイム自体にはHTTPS/HTTPのリスナーがないため、専用のリスナーを前段において利用します。

![node.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/fc1de73c-d706-4f80-6347-78e14c9bab5e.png)

https://hono.dev/docs/getting-started/nodejs

# まとめ

どのWebアプリケーションフレームワークでもコアの部分がやっていることは下記です。

1. HTTPS/HTTPのリクエストをリスンすること
1. 受信したリクエストを適切な実装モジュールにルーティングすること
1. 実装モジュールに対して、リクエストのコンテキスト情報と、レスポンスのための入れ物を提供すること

Honoでは、1.はコアモジュールとしては提供しません。各種ランタイムが用意するリスナー機能を利用するか、オプショナルなアダプタとして提供します。2.は独自の高速なルーティング機能の実装を提供します。3.はWeb標準のfetch関数をエントリポイントとして提供します。これらの工夫により、様々なランタイムで動作する軽量で高速なWebアプリケーションフレームワークを実現しています。
AuroraDB フェイルオーバーテストやってみた

# フェイルオーバーテストの手順

以下は、Auroraクラスタでフェイルオーバーテストを行うための手順です。リーダー（Reader）インスタンスを追加する場合のプロセスも含めています。

---

## 手順

### 1. リーダーの追加（必要に応じて）
1. **Amazon RDS コンソール**にログイン。
2. Aurora クラスタを選択。
3. 「**アクション**」→「**リーダーの追加**」を選択。
4. 必要な設定（インスタンスタイプ、AZ、ストレージオプションなど）を指定してリーダーインスタンスを作成。
![reader追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/fd5b4316-aec7-166b-c1d6-ede1b9b783e3.png)
5. リーダーインスタンスが作成され、ステータスが「available」になるまで待つ。
![reader追加確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/f57400b0-3614-ade6-0529-856155a27226.png)

---

### 2. AWSコンソールでクラスタを選択
1. **Amazon RDS コンソール**にログイン。
2. 左側メニューの「**データベース**」をクリック。
3. フェイルオーバーをテストするAuroraクラスタを選択。

---

### 3. フェイルオーバーを開始
1. クラスタを選択した状態で「**アクション**」ボタンをクリック。
2. 「**フェイルオーバー**」を選択。
![failover1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/c1f0f0da-982a-680e-e855-2d365cb89844.png)
3. 確認ダイアログが表示されるため、「**実行**」をクリックしてフェイルオーバーを開始。
![failover2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/86839ad5-61bf-0003-c1d4-8a670a5fb1d8.png)


---

### 4. 昇格の確認
1. フェイルオーバーが実行されると、以前のリーダーインスタンスがライターとして昇格します。
2. クラスタのステータスを確認し、以下を確認します：
   - **新しいライター:** 以前のリーダー。
   - **新しいリーダー:** 他のリーダーインスタンス、または必要に応じて新たに設定される。

![failover後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/5fa96487-32e6-9354-247e-28b2c39b422e.png)
Laravel Sanctumのlast_used_atを自動更新しない設定にして、DB負荷を軽減する

## はじめに

本記事では、Laravel Sanctumで`last_used_at`の自動更新を無効化する方法について解説します。デフォルトでは、Sanctumはアクセストークンの使用時に`last_used_at`を自動的に更新しますが、これを防ぎたい場合の手順を示します。
特に、`last_used_at`を使用していない高トラフィックの環境では、DBへの負荷軽減が期待できます。

### 環境

- PHP 8.2.3
- Laravel 10.48.25

## 手順

### カスタムモデルを作成

`Sanctum\PersonalAccessToken`クラスを継承したカスタムモデルを作成し、`last_used_at`が更新されないように設定します。

```php:App\Models\PersonalAccessToken
<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Casts\Attribute;
use Laravel\Sanctum\PersonalAccessToken as SanctumPersonalAccessToken;

class PersonalAccessToken extends SanctumPersonalAccessToken
{
    protected function lastUsedAt(): Attribute
    {
        return Attribute::make(
            set: function (mixed $value): void {
                return;
            },
        );
    }
}
```

### AppServiceProviderで登録

次に、`AppServiceProvider`内で作成したカスタムモデルをSanctumに登録します。これにより、`last_used_at`の自動更新が無効化されます。

```php:App\Providers\AppServiceProvider
<?php

declare(strict_types=1);

namespace App\Providers;

use App\Models\PersonalAccessToken;
use Illuminate\Support\ServiceProvider;
use Laravel\Sanctum\Sanctum;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class);
    }
}
```

## 結果

### 変更前

デフォルトの挙動では、アクセストークン使用時に`personal_access_tokens`テーブルの`last_used_at`が更新されます。
```
2024-12-28T22:54:02.895405Z	   25 Prepare	select * from `users` where `users`.`id` = ? limit 1
2024-12-28T22:54:02.895736Z	   25 Prepare	select * from `users` where `users`.`id` = ? limit 1
2024-12-28T22:54:02.895839Z	   25 Execute	select * from `users` where `users`.`id` = 1 limit 1
2024-12-28T22:54:02.896110Z	   25 Close stmt	
2024-12-28T22:54:02.897823Z	   25 Prepare	update `personal_access_tokens` set `last_used_at` = ?, `personal_access_tokens`.`updated_at` = ? where `id` = ?
2024-12-28T22:54:02.897992Z	   25 Prepare	update `personal_access_tokens` set `last_used_at` = ?, `personal_access_tokens`.`updated_at` = ? where `id` = ?
2024-12-28T22:54:02.898010Z	   25 Execute	update `personal_access_tokens` set `last_used_at` = '2024-12-29 07:54:02', `personal_access_tokens`.`updated_at` = '2024-12-29 07:54:02' where `id` = 1
2024-12-28T22:54:02.901085Z	   25 Close stmt	
2024-12-28T22:54:02.940796Z	   25 Quit	
```

### 変更後

上記の手順を実施した後、`last_used_at`の自動更新がなくなり、以下のように更新クエリが実行されなくなります。
```
2024-12-28T22:56:12.968722Z	   27 Prepare	select * from `users` where `users`.`id` = ? limit 1
2024-12-28T22:56:12.968979Z	   27 Prepare	select * from `users` where `users`.`id` = ? limit 1
2024-12-28T22:56:12.969116Z	   27 Execute	select * from `users` where `users`.`id` = 1 limit 1
2024-12-28T22:56:12.969498Z	   27 Close stmt	
2024-12-28T22:56:12.999318Z	   27 Quit	
```

## まとめ

この記事では、Laravel Sanctumで`last_used_at`の自動更新を無効化する方法について解説しました。具体的には、以下の手順を実施しました。

1. `Sanctum\PersonalAccessToken`を継承したカスタムモデルを作成し、`last_used_at`の更新ロジックを上書き
2. `AppServiceProvider`でカスタムモデルをSanctumに登録

これにより、アクセストークンの使用時に`last_used_at`が自動的に更新される問題を防ぐことができます。
【Webアプリ】簡単に駅名標が生成できるWebアプリの紹介！【Sigene 駅名標ジェネレータ】

# はじめに
今回の記事では、私が最近見つけたSigene 駅名標ジェネレータの使い方を紹介します！

# 「Sigene 駅名標ジェネレータ」ってなに？

https://tr246.github.io/Sigene/

「Sigene 駅名標ジェネレータ」は、JR東日本で使われている駅名標を元に自分だけの独自の駅名標を作れるサイトです！
ただ文字を打って設定していくだけで簡単にオリジナルの駅名標が作れちゃいます！

# １.駅名標設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685120/e2643e88-2923-3e43-dcca-8f531e32b6e0.png)

「駅名標設定」では、作る駅名標のサイズを「筐体タイプ」から選択できます！
さらに駅名標を点灯するかどうか、
ナンバリングや4か国語表記を表示するかどうか、
右側に分岐を作るかどうか、
左側に分岐を作るかどうか、
さらに黒として使う色が設定できます！

基本的には画像のような設定で良いと思います！

# 駅名・ナンバリング

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685120/6a4d86ad-7729-0f6c-34fb-42eb63bd5d1e.png)

「駅名・ナンバリング」では、この駅名標を置く駅の名前を設定できます！
基本的には入力していきますが、中国語と韓国語では、入力欄をクリックするとGoogle翻訳が開けるボタンが出てきて、そこからGoogle翻訳を開くと、「駅名 日本語(漢字)」に入力した文字が翻訳できます！
正直めちゃくちゃ使いやすくできてて感謝しかないです！
またスリーレターコードが設定できたり、ナンバリングを設定できたりします。ナンバリングは画像のように「英字 数字」と入力すればきれいに出力されます！

# 右駅・左駅(右駅上・右駅下・左駅上・左駅下)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685120/8b868a2c-d8ba-c9a3-4a64-c23bb48e54bd.png)

ここでも先ほどと同じように駅名を設定できますが、ここには中国語や韓国語を入力する欄はありません。
最初の「駅名標設定」で右分岐または左分岐を選択すると「上」や「下」が追加されます！

# 特定都市区内表記
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685120/6753bc00-fe87-eaad-6ffa-cd53290bd4da.png)

「特定都市区内表記」ではその名の通り特定都市区内表記を追加できます！私はこの機能を使っていませんが、実際に東京にある駅の再現などには使えそうです！
文字の設定だけでなく、塗りつぶすか否かの指定もできます！
特定都市区内表記についてはこのサイトを見ればわかると思います！

https://ja.wikipedia.org/wiki/%E7%89%B9%E5%AE%9A%E9%83%BD%E5%8C%BA%E5%B8%82%E5%86%85#:~:text=%E7%89%B9%E5%AE%9A%E9%83%BD%E5%8C%BA%E5%B8%82%E5%86%85%EF%BC%88%E3%81%A8%E3%81%8F%E3%81%A6%E3%81%84%E3%81%A8%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%EF%BC%89%E3%81%AF,%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E6%84%8F%E5%91%B3%E3%81%99%E3%82%8B%E3%80%82

# ラインカラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685120/06d1b6f1-3b3b-1222-9572-d53ea8d39552.png)
「ラインカラー」では帯同士の間、真ん中の色を設定できます！薄めの色にすると良いと思います！

# 完成！
こうしてできた駅名標がこちらです！
![駅名標_朱雀坂.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685120/7e06de90-57e2-88b8-e5c6-5ca4c0219f79.png)
素人でも簡単にリアルな駅名標が作れる「Sigene 駅名標ジェネレータ」、ぜひお試しください！！！
WSLをインストールする

【目的】
新規PCにWSLをインストールする必要があったのでついでに備忘録を作成する

【環境】
Windows11 (HOME)

### 目次
[1. 機能の有効化](#1-コントロールパネルにて機能を有効化する)
[2. WSLのインストール](#2-wslをインストールする)
[3. エラーが発生した場合](#3-wslインストール時にエラーが発生した場合)

### 1. コントロールパネルにて機能を有効化する
「コントロールパネル」>「プログラム」>「プログラムと機能」>「Windowsの機能の有効化または無効化」にて
・「Linux用Windowsサブシステム」
・「仮想マシンとプラットフォーム」
にチェックを入れてOKを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819870/e99e13fe-b125-e5ed-69f6-8893c5bd3552.png)


### 2. WSLをインストールする
ターミナルにて以降のコマンドを叩いていく
```terminal:terminal
$ wsl --install
```

WSLのインストールが完了したらディストリビューションをインストールする。
インストール方法はいくつかあるが以前紹介したものとは別の方法で行う。
以前の方法は[こちら](https://qiita.com/tuna_/items/9a0f6529a00d1338c563 "WSLにて新規ディストリビューションを作成する")

以下のコマンドにてインストールできるディストリビューション一覧が表示される
```terminal:terminal
$ wsl --list --online
```

以下のコマンドにてディストリビューションをインストールする
```terminal:terminal
$ wsl --install <Distribution Name>
```
`wsl --list --online`にて表示されたディストリビューション名を`wsl --install Ubuntu-24.04`のように指定する

インストールが完了し、WSLが起動できるとユーザ名とパスワードの入力を求められるので任意のユーザ名/パスワードを入力する
```
Enter new UNIX username: 
New password:
Retype new password:
```

`Installation successful!`
と表示されたら終了！

### 3. WSLインストール時にエラーが発生した場合
コントロールパネルの設定が完了しているのに以下のエラーが表示された場合
```
Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS.
```
PCを再起動し、BIOSに入る（PC起動直後にF2キーを押す※メーカーによってはキーが異なる）

virtualizationをenabledに変更する。
BIOSについては機種によって異なるため、各自自力で頑張っていただきたい、、、
知識不足で申し訳ないです、、、、
DRP-AI日記その6 DRP-AIシリーズの研究の今後の展望についての技術的ポエム

DRP-AIシリーズの研究の今後の展望について技術的ポエムを書いてみました．

DRP-AIシリーズ・Kakip

- [DRP-AI日記その1 なぜDRP-AIシリーズに取り組むのか](https://qiita.com/zacky1972/items/3ebf021cab1e972890f8)
- [DRP-AI日記その2 Kakipを起動してみた](https://qiita.com/zacky1972/items/438ddc192fc499fb697c)
- [DRP-AI日記その3 Kakipネットワーク等初期設定](https://qiita.com/zacky1972/items/ab6a176f0ad481473f71)
- [DRP-AI日記その4 Elixirのインストール](https://qiita.com/zacky1972/items/922176433e54046b8338)
- [DRP-AI日記その5 OpenBLASを実行してみる](https://qiita.com/zacky1972/items/02be10d1acc013a499d2)

## DRP-AIシリーズについて

DRP-AIシリーズは，ルネサスエレクトロニクスのAIアクセラレータです．高い電力あたり性能が売りです．

## DRP-AIシリーズに特化したBLASを構築する

DRP-AIシリーズに特化したBLASを構築すると，様々なOSSをアクセラレートできるので良いと思います．可能ならば，OpenBLASにコードを寄贈するのが良いのですが，ルネサスエレクトロニクス次第かなとも思います．

コード最適化の研究者としても，DRP-AIシリーズに特化したBLASを構築することは大変興味をそそられます．

## Apple Accelerate Frameworkを参考にしてDRP-AIシリーズに特化した高速化ライブラリを構築する

Apple Accelerate Frameworkというものがあります．

https://developer.apple.com/jp/accelerate/

これを参考にしながら，DRP-AIシリーズに特化した高速化ライブラリを構築するのは，コード最適化の研究者として大いに興味をそそられます．

なお，BLASはApple Accelerate Frameworkの一部を形成しています．

## DRP-AIシリーズに特化したNxバックエンドを構築する

NxはElixirの機械学習基盤ライブラリです．Nxでは，Nxバックエンドを各種アクセラレータ向けに定義することができます．

前述の高速化ライブラリを活用して，DRP-AIシリーズに特化したNxバックエンドを構築できると良いですね．

## DRP-AIシリーズに特化したONNXライブラリを構築する

Elixirの標準ONNXライブラリであるOrtexでは，どうもNxバックエンドの機能を活用してくれないっぽいです．そこで，DRP-AIシリーズに特化したONNXライブラリを構築すると良いかなと思いました．

## DRP-AIシリーズ向けのBumblebeeアクセラレーションを検討する

BumblebeeはHugging Faceの機械学習ライブラリをElixirで使えるようにしたものです．前述のNxバックエンドとONNXのアクセラレーションに加えて，さらなるBumblebeeのアクセラレーションを検討します．

## DRP-AIシリーズ向けVulkanライブラリを構築する

Vulkanは汎用3Dグラフィックライブラリです．VulkanでDRP-AIシリーズを活用することを検討してみても良いかと思いました．

## 謝辞

本研究は北九州産業学術推進機構(FAIS)の令和6年度宇宙関連機器新技術開発事業の助成を受けた．
iPhone&iPadでElixirを動かす

iPad&iPhoneでElixirを動かす手順です

# iSHをインストール
App StoreでiSH Shellをインストールしてください

![IMG_0033.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/3ddae087-baa7-baf6-0e85-9ab81326880d.png)

# iSH起動とElixirインストール
- iSHのアイコンをタップして起動
- Elixirのインストール
  - `# apk add elixir`
- iex起動してプログラムを打つ
  - 例 `iex > Enum.sum(1..10)`
  - 55 と表示します

iPhone
![IMG_0032.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/eeb1b39f-8d42-36ae-f941-4458ea27bd10.png)

iPad
![IMG_0023.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/50107354-a422-20de-52cd-df68b0c5d759.png)

以上です
SlackとTodoist連携でタスク管理を効率化！設定手順を解説

## はじめに
本記事では「SlackとTodoistの連携」および「Slackから新規タスクを起こす方法」を紹介します。

プライベートで2人体制の開発チームを作ることになり、チャットツールにSlackを採用しました。Slackには「リスト」というタスク管理に使える機能があるようですが、有料プランのため採用しませんでした。

そのため、無料の代替手段としてTodoistにチーム・プロジェクトを作成した上、SlackとTodoistを連携させ、Slack上でTodoistにシームレスにタスクを連携させる手法を採用することとしました。

なお、画面の指示に従うだけの箇所は手順説明を省いています。
予めご認識ください。
## 前提
Slack上にワークスペースが作成済みであること。

## 手順（Todoist側）
### PJ用のTodoistアカウントを作成しログイン
https://todoist.com/ja

### チームを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/3df0aa5b-66a1-3e5e-2ab6-80ac8a1db356.png)

### メンバーをチームに招待
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/1b3ae5df-2f02-3c62-261d-96510a54b8dd.png)

### プロジェクト作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/f9c5f864-ad4e-e274-302a-17252bdd4cd9.png)

## 手順（Slack側/連携）
https://w1735205246-new270483.slack.com/oauth?client_id=2158851650.22911382853&scope=commands&user_scope=identify&redirect_uri=https%3A%2F%2Ftodoist.com%2Fslack%2Foauth&state=&granular_bot_scope=1&single_channel=0&install_redirect=&tracked=1&response_type=code&team=

## Slack上からTodoistにタスクを登録する
```
// Slackチャンネルのメッセージ欄で下記を実行
/todoist [タスク名] #[PJ名] [期日] +[担当者名]

// 期日の指定方法(抜粋)
HH:mm         //今日の何時まで
今日
明日
明後日
今週末
来週          //来週の同じ曜日まで
来週の[]曜日
MM/dd
MM/dd HH:mm
YYYY/MM/dd
```
## 最後に
小数人開発でSlack×Todoistは便利かと思いますので、タスク管理方法に悩まれている方は一度試してみてください。
Pythonのパッケージ取得

# はじめに
Pythonのパッケージを取得、削除するまでの一連の操作をまとめる。

## Pythonのパッケージを検索
Python Package Index(PyPI)のサイトから検索が可能。

https://pypi.org/

## pipコマンド

コマンド|意味
---|---
pip install [パッケージ名]|インストール
pip install -U [パッケージ名]|アップグレード
pip install [パッケージ名]==[バージョン]|バージョン指定インストール
pip list|リスト
pip show [パッケージ名]|パッケージの情報
pip -V|pipのバージョン
pip uninstall [パッケージ名]|アンインストール
pip install -U pip|pip自体のアップグレード
React基礎

**React基礎文法
ReactはコンポーネントベースのJavaScriptライブラリで、ユーザーインターフェースの構築に使用されます。以下に、Reactの基本的な文法と概念を説明します**。

# 1. JSX (JavaScript XML)

JSXは、HTMLに似た構文でReactコンポーネントを記述するためのJavaScript拡張機能です。

```jsx
import React from 'react';

function App() {
  return (
    <div>
      <h1>Hello, React!</h1>
    </div>
  );
}

export default App;
```

# 2. コンポーネント

ReactのUIはコンポーネントで構成されます。コンポーネントは関数またはクラスとして定義できます。


関数コンポーネント
```jsx
function Welcome(props) {
  return <h1>Hello, {props.name}!</h1>;
}
```

クラスコンポーネント
```jsx
import React, { Component } from 'react';

class Welcome extends Component {
  render() {
    return <h1>Hello, {this.props.name}!</h1>;
  }
}
```

# 3. Props

Propsは、コンポーネント間でデータを渡すための仕組みです。
```jsx
function Greeting(props) {
  return <h1>Hello, {props.name}!</h1>;
}

function App() {
  return <Greeting name="John" />;
}
```

# 4. State

Stateは、コンポーネント内で変更可能なデータを管理するために使用されます。クラスコンポーネントと関数コンポーネントの両方で使用できます。

クラスコンポーネントのState
```jsx
class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  increment = () => {
    this.setState({ count: this.state.count + 1 });
  };

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.increment}>Increment</button>
      </div>
    );
  }
}
```

関数コンポーネントのState (Hooks)
```jsx
import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}
```

# 5. イベントハンドリング

Reactではイベントハンドラを使用して、ユーザーの操作を処理します。

```jsx
function Button() {
  const handleClick = () => {
    alert('Button clicked!');
  };

  return <button onClick={handleClick}>Click me</button>;
}
```

# 6. 条件レンダリング

条件に基づいて異なるコンテンツをレンダリングします。
```jsx
function Greeting(props) {
  if (props.isLoggedIn) {
    return <h1>Welcome back!</h1>;
  }
  return <h1>Please sign in.</h1>;
}
```

# 7. リストのレンダリング

配列データをリストとして表示する方法です。
```jsx
function ItemList(props) {
  const items = props.items;
  return (
    <ul>
      {items.map((item, index) => (
        <li key={index}>{item}</li>
      ))}
    </ul>
  );
}

function App() {
  const fruits = ['Apple', 'Banana', 'Cherry'];
  return <ItemList items={fruits} />;
}
```

# 8. ライフサイクルメソッド

クラスコンポーネントでは、コンポーネントのライフサイクルに応じてメソッドを実行できます。

componentDidMount: コンポーネントがマウントされた後に呼ばれる。

componentDidUpdate: 更新後に呼ばれる。

componentWillUnmount: アンマウント前に呼ばれる。

```jsx
class Timer extends React.Component {
  componentDidMount() {
    console.log('Timer started');
  }

  componentWillUnmount() {
    console.log('Timer stopped');
  }

  render() {
    return <div>Timer is running</div>;
  }
}
```

以上がReactの基本的な文法です。
少しでも役に立てば嬉しいです。
Ghosttyのキーバインドを初期化したい

# 概要

Ghosttyのキーバインドを一旦すべてunbindしてから、好きに設定したかった。

# 手順

以下を設定ファイルに記述する。
あとは[公式リファレンス](https://ghostty.org/docs/config/keybind/reference)を見てお好きに設定してください。

```:~/.config/ghostty/config
keybind = clear
```

# 以下、古い記述

```sh
ghostty +list-keybinds | cut -d= -f-2 | xargs -I{} echo "{}=unbind" >> ~/.config/ghostty/config
```

# 解説

`ghostty +list-keybinds` で現在のキーバインド設定をすべて出力し、設定を `unbind` に置換している。

```:キーバインドの設定フォーマット
keybind = trigger=action
```

# 結果

以下のように、すべてのキーバインドが無効化される。  
あとは[公式リファレンス](https://ghostty.org/docs/config/keybind/reference)を見てお好きに設定してください。

```:~/.config/ghostty/config
keybind = super+page_up=unbind
keybind = super+ctrl+equal=unbind
keybind = super+physical:four=unbind
keybind = super+shift+down=unbind
keybind = super+shift+w=unbind
keybind = super+shift+left_bracket=unbind
keybind = super+alt+i=unbind
keybind = super+w=unbind
keybind = super+physical:eight=unbind
keybind = super+alt+right=unbind
keybind = shift+up=unbind
keybind = super+down=unbind
keybind = super+enter=unbind
keybind = super+t=unbind
keybind = super+c=unbind
keybind = super+shift+right_bracket=unbind
keybind = super+physical:one=unbind
keybind = shift+left=unbind
keybind = super+equal=unbind
keybind = shift+page_up=unbind
keybind = super+physical:three=unbind
keybind = super+physical:zero=unbind
keybind = super+right=unbind
keybind = super+d=unbind
keybind = super+ctrl+down=unbind
keybind = shift+end=unbind
keybind = super+plus=unbind
keybind = super+q=unbind
keybind = super+home=unbind
keybind = super+ctrl+left=unbind
keybind = alt+left=unbind
keybind = super+ctrl+up=unbind
keybind = super+left=unbind
keybind = super+shift+up=unbind
keybind = shift+right=unbind
keybind = super+comma=unbind
keybind = super+shift+comma=unbind
keybind = super+minus=unbind
keybind = shift+page_down=unbind
keybind = ctrl+tab=unbind
keybind = super+a=unbind
keybind = alt+right=unbind
keybind = super+shift+enter=unbind
keybind = super+alt+down=unbind
keybind = super+ctrl+f=unbind
keybind = super+ctrl+right=unbind
keybind = super+alt+shift+j=unbind
keybind = shift+down=unbind
keybind = ctrl+shift+tab=unbind
keybind = super+n=unbind
keybind = super+alt+left=unbind
keybind = super+page_down=unbind
keybind = super+alt+shift+w=unbind
keybind = super+alt+up=unbind
keybind = super+left_bracket=unbind
keybind = super+physical:nine=unbind
keybind = super+right_bracket=unbind
keybind = super+end=unbind
keybind = super+shift+j=unbind
keybind = super+shift+d=unbind
keybind = super+zero=unbind
keybind = super+physical:five=unbind
keybind = shift+home=unbind
keybind = super+physical:seven=unbind
keybind = super+up=unbind
keybind = super+k=unbind
keybind = super+physical:two=unbind
keybind = super+physical:six=unbind
keybind = super+v=unbind
```
ExcelだけでXMLを生成！Power Queryを使ったシンプルな方法

## はじめに
データをXML形式に変換する必要があるとき、Excelだけで完結できたら便利だと思いませんか？  
この記事では、Excelに内蔵されている**Power Query**を使って、簡単なデータをXMLに変換する方法を解説します。特別なツールやプログラミング知識は不要です！

---

## この記事の対象
- **対象読者**: エンジニアや非エンジニア問わず、Excelでデータを管理している方。
- **この記事を読むと分かること**:
  - Power QueryでシンプルなXMLを生成する方法。
  - 再利用可能なワークフローの構築方法。

---

## データ例
今回は以下のようなシンプルなデータを例にします：

| ID  | 名前   | 年齢 |
|-----|--------|------|
| 1   | 山田太郎 | 30   |
| 2   | 鈴木花子 | 25   |
| 3   | 佐藤健   | 40   |

### 目標のXML
このデータを以下のようなXML形式に変換します：

```xml
<Rows>
    <Row>
        <ID>1</ID>
        <名前>山田太郎</名前>
        <年齢>30</年齢>
    </Row>
    <Row>
        <ID>2</ID>
        <名前>鈴木花子</名前>
        <年齢>25</年齢>
    </Row>
    <Row>
        <ID>3</ID>
        <名前>佐藤健</名前>
        <年齢>40</年齢>
    </Row>
</Rows>

```

## 手順

###  1.  データをPower Queryに取り込む

1. **Excelにデータを入力する**
   - 上記の表をExcelシートに入力します。
2. **Power Queryを開く**
   - Excelの「データ」タブ → 「テーブルまたは範囲から取得」をクリック。
   - Power Queryエディターが開きます。

------

### 2. データ型を確認

Power Queryで、各列のデータ型を以下のように設定します：

- **ID** → 数値型 (`Number`)
- **名前** → テキスト型 (`Text`)
- **年齢** → 数値型 (`Number`)

※ データ型を変更するには、列の上部をクリックし、「データ型」を選択します。

------

### 3. カスタム列を追加してXML構造を作成

1. 「列の追加」タブをクリック → 「カスタム列」を選択。
2. 新しい列名を「RowXML」とし、以下の式を入力します：

```
"<Row>" &
"<ID>" & Text.From([ID]) & "</ID>" &
"<名前>" & [名前] & "</名前>" &
"<年齢>" & Text.From([年齢]) & "</年齢>" &
"</Row>"
```


**結果例**（RowXML列の内容）:

- 1行目の出力：


  ```xml
<Row>
    <ID>1</ID>
    <名前>山田太郎</名前>
    <年齢>30</年齢>
</Row>
  ```

### 4. 全行を結合してXML全体を作成

1. 「ホーム」タブ → 「詳細エディター」をクリック。
2. 以下のコードを追加して全体のXMLを生成します：

```
let
       ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
       変更された型 = Table.TransformColumnTypes(ソース, {{"ID", type number}, {"名前", type text}, {"年齢", type number}}),
       追加されたカスタム = Table.AddColumn(変更された型, "RowXML", each 
           "<Row>" &
           "<ID>" & Text.From([ID]) & "</ID>" &
           "<名前>" & [名前] & "</名前>" &
           "<年齢>" & Text.From([年齢]) & "</年齢>" &
           "</Row>"
       ),
       結合されたXML = Text.Combine(追加されたカスタム[RowXML], ""),
       最終XML = "<Rows>" & 結合されたXML & "</Rows>"
   in
       最終XML
```

### 5. 結果をExcelに戻す

1. 「ホーム」タブ → 「閉じて読み込む」をクリック。
2. 作成されたXMLをExcelシートにロードします。生成されたXMLが1つのセルに出力されます。

------

## まとめ

- ExcelだけでXMLを生成するには、Power Queryが非常に便利。
- 特別なツールやスクリプトが不要で、簡単に再利用可能なワークフローを構築できます。
- この方法を使えば、あらゆるデータ形式をXMLに変換し、クラウドやシステム連携で活用できます。

------

## 応用例

- **大規模データの処理**: データが増えてもPower Queryが自動的に処理。
- **異なる形式への変換**: Power Queryを使えば、JSONやCSV形式への変換も可能。