OmniAICreator/Qiita-1.07M huggingface dataset:
windows + ReactNative,Expoでiosアプリを開発してみる その1

# はじめに
本稿は初心者エンジニアがWindows環境でiosアプリを開発するものです。
かなりフランクに書こうと思っています。
初心者を言い訳にしたくないですが、わかりづらかったら大変申し訳ないです。
ただ少しでもこの記事が役に立つことを願って書きます。

# どんなアプリか？
NW構成図を見たらわかると思いますが、かなりシンプルな作りとなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998945/b45e0691-3802-5dd1-9b36-454ca21c7f89.png)
〇使用コードエディター
　・VScode
〇フロントエンド
　・Node.js
　・ReactNative
 　・Expo
  　・TypeScript
　※私用携帯がiPhoneのため、Windowsで開発時エミュレーターはExpoを利用
〇バックエンド
　・CloudFlare Workers(API Callに利用)
 　・CloudFlare D1(Database)
　・TypeScript
 　・drizzle(SQL作成してくれるすごいやつ)

こんな感じです。
まだ開発中のため、変更はあるかもしれませんが。

# 前提条件
お使いのiPhoneにExpo.goをダウンロートしておきましょう。
iPhoneのQRコードリーダーで読み取ると書かれているコードがiPhone上でどのように動くのかわかるすんごい代物です。

# 環境構築
フロントエンドの環境構築でかなりてこずった・・
公式ドキュメント最強ってことですね。

# 1.まずはNode.jsのインストールから
こちらhttps://nodejs.org/ja/

インストールが完了したら以下のコマンドをVScodeのターミナルにて実行してバージョンを確認する。
(バージョンがわかればインストールは無事に完了)

```Nodeのバージョン確認コマンド
node -v
```
実行結果
```
v20.12.0
```
このように表示されるはずです。

# 2.Expoの新しいプロジェクトを作成
こちらのコマンドをターミナルにて実行する。
```
npx create-expo-app@latest
```
そうするとTemplateも含めたExpoのフォルダが作成されるはずです。
完了したら、Expoを動かしてみましょう。
以下のコマンドをターミナルにて実行する。
```
npx expo start
```
そうするとターミナル上にQRコードが作成されているはずです。
iPhoneのQRコードで読み取ってみると・・・
TemplateのコードがiPhoneにて動作しているのがわかると思います。


一旦はここまでにしておきます。
ちなみにQRコード読み取りまでは公式ドキュメントを参考に(というかその通りに)やってみただけです。
こちらです。https://docs.expo.dev/get-started/introduction/

続きも書きますが、基本的には公式ドキュメントに沿って書いていくので、早く開発したい！という方はリンクの公式ドキュメントからやっていけば結果は同じかと思います。。。

つたない文章ですが、ここまで読んでくださりありがとうございます。
完成するまで書き続けますので、どうぞよろしくお願いいたします。
「改訂新版 良いコード／悪いコードで学ぶ設計入門」を読んで

# はじめに
「改訂新版 良いコード／悪いコードで学ぶ設計入門―保守しやすい 成長し続けるコードの書き方」を読みました。

https://gihyo.jp/book/2025/978-4-297-14622-1

昨年転職をして環境が変わり、同じ言語でも採用されているアーキテクチャが全然違うことを肌で感じつつ、改めて腰を据えて設計について基本からしっかり学び直したいなと思ったのが本書を読み始めた経緯です。

なお2025年の抱負の一つとして、月に1冊技術書を読むことを個人的な目標として掲げており、1月分がこの本でした（ちょっと足が出ましたが…）。

# 全体的な所感
本の中で、質の悪いコードにより作り出される悪い状況を総称して「悪魔」と呼んでおり、言葉の使い方に若干の抵抗を感じながらも最後まで読みました。

ですが、全体としては読んでとても良かったと思います。

まず、実際のプロダクションコードに取り入れられそうな考え方が多く見られた点が良かったです。

例えば、「継承より委譲を」という考え方や「インターフェイス設計」に関する考え方など。
この辺りは、後ほどもう少しだけ詳細を書きます。

次に、後半にかけての設計に臨む上でのメンタリティの部分。
開発者にとっての資産は「技術力」であり、レガシーコードはその成長を妨げる大きな弊害となり得る。
加えて、いきなり最良の設計には辿り着かないので、とにかくスモールステップで手を動かそう、という話。

そして、自分の1回の小さな追加・変更も、積み重なると取り返しがつかないレベルにまでコード全体を腐敗させ得る、という「割れ窓理論」の話。

当たり前のことだとは思いますが、改めて言われるとハッとしました。
日々心掛けていきたいと思います。

# 参考になった箇所のピックアップ
### 関心の分離
よく言われる事ですが、ソフトウェア設計においては「関心の分離」をすべきであるという話。
ここでの「関心」とはソフトウェアの機能や目的のことであり、目的毎にモジュールを独立させ、他の関心事と分離すべきであるという考え方。

### 目的駆動名前設計
上記の具体例として挙げられていた User クラスの話が参考になりました。

よく使われがちな User クラス。
これ自体が、複数の目的を無理やり一つに閉じ込めた「関心が混在したモデル」であるという話。

ユーザーという概念は非常に曖昧で、その中に「アカウント」「プロフィール」「法人／個人の区分け」など多くの関心事が一緒くたになっています。

ユーザーという「存在」ではなく、「目的」を主眼とすべきであるという内容に、ハッとしました。

また、巨大なデータクラスは、あらゆるユースケースで使われてしまうので、さながらグローバル変数の様相を帯びてしまう。

そもそもソフトウェアは仮想現実の世界であり、何らかの「目的」を実現するために組み上げられているもの。
無理に存在を表現しようとするのではなく、目的に即したモデリングをすべきであるという点は肝に銘じようと思いました。

### 継承より委譲を
「継承」はかなり注意深く扱わないと、あっという間に関心が混在してしまう。
そのため、基本的には利用を推奨しないという話は耳が痛い内容でした。

継承の問題点は、サブクラスがスーパークラスの構造に酷く依存してしまう点。

何重にも継承されてしまうと、関心はあちこち混ざり合い、手が付けられなくなります。

そうではなく、委譲を行いコンポジション（組み合わせ）構造にすべし。
利用したいクラスをスーパークラスとして継承するのではなく、private なインスタンス変数として呼び出すと良い、という話でした。

これも日々問題を痛感しているところなので、肝に銘じておきたいと思いました。

### 尋ねるな、命じろ
呼び出し側で複雑なハンドリングを行うのではなく、呼び出されるメソッドの側で複雑な制御を行うべしという話。
基本的なことですが、重要だと思ったのでピックアップしました。

### インターフェイスと実装の分離
上記にも通ずる話ですが、インターフェイスとしてメソッドの仕様を外部に公開した上で、実装詳細とは分離すべしという考え方です。
これも基本的な考え方だとは思われますが、その大事さを再認識させられました。

例えば開発者が何らかのメソッドを使用したいとして、逐一内部仕様まで読み解いてから使用可否を判断するのではなく、インターフェイスとして定義された目的に即して使用を決める。
そうすることで、余計な認知負荷を減らすことができ、また変更容易性も高まる、という話です。

なお自分が前職で使用していた Go 言語などには　interface 型が存在しますが、Ruby にはありません。

代用としては、「ダックタインピング」が紹介されていました。

ダックタイピングは参照記事を載せるに留まり、詳細は割愛しますが、改めて意識していこうと思います。
https://qiita.com/shimgo/items/9d9fbab1e3a7c4343f7b
（ダックタイピングの概要：特定のクラスと結び付かない暗黙的なインターフェイスの定義で、振る舞いに着目する考え方。）

# おわりに
色々と参考になるところはあったものの、他の方の書評を読んでいると賛否ある部分もあるようです。
私自身も、書かれていたことをそのまま鵜呑みにするのではなく、今後も他の技術書を読み、実際に手を動かしながら考えを深めていきたいと思います。

自分自身の振り返り用として書いた部分も大きいですが、少しでも読んでくださった方の気付きになりましたら幸いです！では！
Mac に Nodebrew で Node.js をインストール

# Mac に Nodebrew で Node.js をインストール

## Nodebrew のインストールとセットアップ

### インストール
```sh
$ brew install nodebrew
```

### セットアップ
```sh
$ nodebrew setup
```
実行すると、以下のように表示されます。

```
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

### パスを通す

```sh
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
```

## Node.js のインストール

### インストール可能なバージョンを確認
```sh
$ nodebrew ls-remote
```

### 最新の安定版をインストール
```sh
$ nodebrew install stable
```

### 特定のバージョンをインストール
```sh
$ nodebrew install v22.13.1
```

### インストール済みのバージョン一覧を確認
```sh
$ nodebrew list
```

## 使用するバージョンを設定
```sh
$ nodebrew use v22.13.1
$ node -v
$ npm -v
```

以上で、Mac に Nodebrew を利用して Node.js をインストールする手順は完了です。
コンポーネントだけで値をコピーしたりBoolを反転したりするための覚書

いまいち覚えきれないのでメモ
下記を組み合わせることでFluxを使わずに値のコピーなどが行える。
代償として可読性がかなり悪くなるので過信は禁物。

ValueCopy
ValueSourceからDriveTargetに値をコピーする
https://wikiwiki.jp/resonaito/Transform/Drivers/ValueCopy

ValueDriver
ValueSourceの値をDriveTargetに反映する。
EnabledをFalseにすると止まるのでFluxで書くより扱いやすいかも。
https://wikiwiki.jp/resonaito/Relations/ValueDriver

ValueMultiDriver
一つの値をまとめて複数個所に反映したい場合使う
https://wikiwiki.jp/resonaito/Relations/ValueMultiDriver

BooleanValueDriver
FalseValueとTrueValueを設定することで
値がTrueの時にFalseに設定するといったBool値の反転が行える。
https://wikiwiki.jp/resonaito/Transform/Drivers/BooleanValueDriver
【Bolt.new】ファミコン風ポートフォリオの作成


# はじめに

Bolt.new を使って、ファミコン風ポートフォリオを作成しました。無料枠でどの程度のアプリが作成できるか試してみます！

# Bole.new とは

Bolt.new は、モダンな Web アプリケーションを迅速に構築するための軽量かつ高性能なフレームワークです。シンプルな設計と柔軟なカスタマイズ性を備えており、初心者から上級者まで幅広い開発者に対応しています。

# 作成物

作成物はこちらになります。

https://luxury-banoffee-905505.netlify.app/

![スクリーンショット 2025-02-03 220624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603981/021c4bed-5b7b-7c7c-9a50-2cf01595fb5f.png)

ファミコン風と入力したら、ファミコンゲーム機っぽい物が作成されました。
電源ボタンを押下すると、ポートフォリオが表示され（起動のエフェクトあり）、A ボタンや B ボタンでポートフォリオを選択できます。START を押すとどこかの Github のページに飛びます。（無料枠の上限に達して設定できなかった....）

# Bolt.news でできること

## フルスタック開発

Bolt を使用することで、フレームワークを用いて簡単な Web アプリケーションやコンポーネントを作成することができます。今回は、Next.js でアプリを作成しました。
![スクリーンショット 2025-02-03 215736.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603981/568c2192-1927-8451-90a4-0c04791a028e.png)
以下のフレームワークや言語であれば、簡単に初期プロジェクトを作成することが可能です。

- Astro
- Vite
- Next.js
- NativeScript
- Nuxt.js
- Slidev
- Vue.js
- Svelte
- Remix
- TypeScript
- React
- Remotion
- Angular
- Qwik

## 容易なデプロイ

画面右上の「Deploy」ボタンを押下すれば、誰でも簡単にデプロイすることが可能です。ボタンを押下すると、左のチャット欄にデプロイ先の URL が表示されます。アプリケーションは Netlify 上で公開されます。
![スクリーンショット 2025-02-03 220444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603981/0f1f3483-2170-0cf8-1bf9-8f130cf053a3.png)

# Bolt.news の無料枠

### Bolt.new の料金プラン

| プラン名       | 価格（月額） | 概要                                                                             |
| -------------- | ------------ | -------------------------------------------------------------------------------- |
| **Personal**   | Free         | - 無料で基本機能を利用可能<br> - 月 100 万トークン使用可能                       |
| **Pro**        | $20 ～ 200   | - 月 1000 万トークン～ 1 億 2000 万トークン使用可能                              |
| **Teams**      | $30 ～ 210   | - 月 1000 万トークン～ 1 億 2000 万トークン使用可能<br> - 複数メンバーで使用可能 |
| **Enterprise** | 要問い合わせ | - 大規模な開発向け                                                               |

無料枠だと、1 ヶ月の上限に加えて、1 日に使用できるトークン数にも上限があります（15 万トークン）。今回のファミコン風ポートフォリオの場合だと、5 ラリーで 1 日の上限に達しました。意外と多くトークンが消費される印象です。

# さいごに

Bolt.new には、プロンプトの提案機能があったり、バグの修正機能もあったりするので、それらの機能も使ってアプリの改善していきたいです。
他の AI ツールとは比較するのも面白そうです。以上です！
Spring Boot 多環境開発におけるプロファイル分類とspring.profiles.groupの利用

# Spring Boot 多環境開発におけるプロファイル分類と`spring.profiles.group`の利用

Spring Boot の多環境開発において、`application.yml`を有効に使用するための分類化は重要です。特に、`spring.profiles.group`を使用すると、複数のプロファイルをグループ化して管理できるので、コードを準備する際にとても便利です。この記事では、この機能を使用した有効な設定方法を解説します。

## `application.yml`の基本設定

さずめて、一般的な`application.yml`の構造を見てみましょう：

```yaml
spring:
  profiles:
    group:
      dev: ["dev-db", "dev-cache"]
      prod: ["prod-db", "prod-cache"]
```

この設定は、プロファイルグループを制御するために使用されます。`dev`プロファイルには`dev-db`と`dev-cache`が含まれ、`prod`プロファイルには`prod-db`と`prod-cache`が含ます。

## 個別の設定ファイル

これらのプロファイルの設定を個別の`application-*.yml`に分類することができます。この例を見ていきましょう。

### `application-dev-db.yml`

```yaml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/dev_db
    username: dev_user
    password: dev_password
```

### `application-dev-cache.yml`

```yaml
cache:
  type: redis
  host: localhost
  port: 6379
```

### `application-prod-db.yml`

```yaml
spring:
  datasource:
    url: jdbc:mysql://prod-db-server:3306/prod_db
    username: prod_user
    password: prod_password
```

### `application-prod-cache.yml`

```yaml
cache:
  type: redis
  host: prod-redis-server
  port: 6379
```

## プロファイルの切り替え

プロジェクトを起動する際に、この設定を使用したプロファイルを指定することができます。例えば、`dev`プロファイルを使用する場合：

```bash
java -Dspring.profiles.active=dev -jar myapp.jar
```

これにより、`dev-db`と`dev-cache`のプロファイルが同時に適用されます。

## YMLファイルでプロファイルを切り替える方法

プロファイル切り替えは`spring.profiles.active`を`application.yml`に直接設定することでも実現できます。

```yaml
spring:
  profiles:
    active: dev
```

この設定により、プロファイル`dev`が自動的に適用されます。ただし、環境によって変更が必要な場合は、コマンドラインコードを使用する方が優先されます。

## まとめ

`spring.profiles.group`を使用することで、複数のプロファイルを簡単に管理し、さらに環境に対する設定を完全に分離することができます。これは、大規模プロジェクトの開発や運用において非常に有用な方法です。
Macでファイルの関連付けを設定する方法（duti コマンド）

### duti とは？
`duti`（Developer's Default Uniform Type Identifier） は、Mac のデフォルトアプリケーションをターミナルから設定するためのコマンドラインツールです。特定の拡張子に対して、開くデフォルトアプリケーションを設定できます。

### インストール
```sh
brew install duti
```

### 拡張子の関連付けを調べる

特定の拡張子がどの UTI（Uniform Type Identifier）に関連付けられているかを調べるには、以下のコマンドを使用します。

```sh
duti -x .json
```

このコマンドを実行すると、`.json` ファイルを開くデフォルトのアプリケーションのバンドルIDが表示されます。

### ドットファイル（例: `.gitignore`）の UTI を調べる

```sh
mdls -name kMDItemContentType .gitignore
```

このコマンドを実行すると、`.gitignore` ファイルのUTI（Uniform Type Identifier）が表示されます。

### ファイルの関連付けを変更する

特定のファイルを Sublime Text 4 で開くように設定するには、以下のコマンドを使用します。
ファイルを単一で開く場合は、Sublime Text が便利でお気に入りです。

```sh
duti -s com.sublimetext.4 public.plain-text all
duti -s com.sublimetext.4 public.data all
```

拡張子を指定して設定する場合:

```sh
duti -s com.sublimetext.4 .css all &&
duti -s com.sublimetext.4 .csv all &&
duti -s com.sublimetext.4 .d.ts all &&
duti -s com.sublimetext.4 .env all &&
duti -s com.sublimetext.4 .ini all &&
duti -s com.sublimetext.4 .js all &&
duti -s com.sublimetext.4 .json all &&
duti -s com.sublimetext.4 .jsonc all &&
duti -s com.sublimetext.4 .lock all &&
duti -s com.sublimetext.4 .map all &&
duti -s com.sublimetext.4 .md all &&
duti -s com.sublimetext.4 .mjs all &&
duti -s com.sublimetext.4 .php all &&
duti -s com.sublimetext.4 .scss all &&
duti -s com.sublimetext.4 .sql all &&
duti -s com.sublimetext.4 .test.js all &&
duti -s com.sublimetext.4 .test.ts all &&
duti -s com.sublimetext.4 .ts all &&
duti -s com.sublimetext.4 .tsx all &&
duti -s com.sublimetext.4 .txt all &&
duti -s com.sublimetext.4 .xml all &&
duti -s com.sublimetext.4 .yaml all
```

### `.html` の関連付け設定が失敗する問題

以下のコマンドで `.html` を Sublime Text 4 に関連付けようとすると、エラーが発生することがあります。

```sh
duti -s com.sublimetext.4 .html all
```

エラーメッセージ:

```
failed to set com.sublimetext.4 as handler for public.html (error -54)
```

`sudo` を付けても解決しない場合、システムの保護機能によって `public.html` が特定のアプリケーション（通常は Safari や Chrome）に固定されている可能性があります。

#### 回避策

`.html` ファイルを Sublime Text 4 で開く場合は、手動で Finder から設定することを検討してください。

1. `.html` ファイルを右クリック
2. **情報を見る (Get Info)** を選択
3. **このアプリケーションで開く** の項目を **Sublime Text** に変更
4. **すべてを変更** ボタンをクリック

これで `.html` ファイルを Sublime Text で開くように設定できます。

### まとめ

- `duti -x .ext` で拡張子の関連付けを調査
- `mdls -name kMDItemContentType ファイル名` で UTI を調査
- `duti -s <バンドルID> <UTI> all` でファイルのデフォルトアプリケーションを設定
- `.html` の関連付け変更は Finder から手動設定するのが安全

`duti` を活用すれば、ターミナルから効率的にファイルの関連付けを管理できます。
トグルボタンをscss使って作ってみた

## はじめに
inputタグの radioボタンを使った実装に対してトグルボタンになる様なスタイルを当てる練習をしてみました。

~~若干、位置調整が上手にできてない部分がありますが、~~ おおよそやりたい事ができたのでメモを残そうと思います。

## 作ったもの
<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="jENRozq" data-pen-title="Untitled" data-user="Yoshi2885" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/Yoshi2885/pen/jENRozq">
  Untitled</a> by Yoshi2885 (<a href="https://codepen.io/Yoshi2885">@Yoshi2885</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

## 追記(修正)
元々、scss内で、
```scss
.toggle-input {
  possition: absolute;
  opacity: 0;
  width: 0px;
  height: 0px;
}
```
としている箇所がありました。
これでは、inputの要素が`0px`で存在し続けていて、ボックス内のテキストに約１文字分スペースが入った様になってしまい右にずれてしまっていました。

これを、
```scss
.toggle-input {
  display: none;
}
```
に変更しています。
これにより、要素が完全に非表示になり、いい感じの位置に`hoge`, `fuga`のテキストが表示される様になったので修正しました。


## 解説
外枠のWrapperが背景にあり、inputのcheckedをトリガーに四角い要素がスライドします。

scssでは、
```scss
  &:has(#fuga:checked)::before {
    transform: translateX(60px);
  }
```
として、#fugaがcheckedになったとき`::before`の要素を移動させる様に記述しました。

htmlは、
```html
<div class="wrapper">
  <label for="hoge" class="toggle-label">
    <input type="radio" name="hoge" id="hoge" class="toggle-input" checked />
    hoge
  </label>

  <label for="fuga" class="toggle-label">
    <input type="radio" name="hoge" id="fuga" class="toggle-input" />
    fuga
  </label>
</div>
```
としましたが、
```html
<div class="wrapper">
  <input type="radio" name="toggle" id="hoge" class="toggle-input" checked />
  <label for="hoge" class="toggle-label">hoge</label>

  <input type="radio" name="toggle" id="fuga" class="toggle-input" />
  <label for="fuga" class="toggle-label">fuga</label>
</div>
```
でもよかったかもしれません。

## 最後に
CodePenを記事に埋め込みたかっただけだろ。って言われそうですが、
初めてこの様なアウトプットの出し方を挑戦してみました。

基本的にReactでフロントエンドを作成しているので、
htmlタグのclassとか久しぶりにtypeしたような気がします。
CodePenで動かしながらコーディングしてみましたが、サジェストが出ないとタイポしまくりで、英語勉強しよう。。。と思うなどしました。。

デザイン自由に当てられるスキルはまだないので、少しずつ練習していきたいと思います。
今回は、ON/OFF切り替えの様なトグルボタンを作りましたが、次は３個以上の要素でも同じようにスライドするようなアニメーションをつけられる様にしてみようかなと思います(多分)。
情報量基準と予測誤差に基づくモデル選択指標の使い分け

統計モデルや機械学習モデルの選択において、AICやBICなどの**情報量基準**と、RPE（相対予測誤差）などの**予測性能ベースの指標**は、それぞれ異なる役割を果たします。本記事では、AIC、BIC、HQIC、RPEの概要を整理し、それぞれのユースケースに触れた上で、**特にAICとRPEの違い**に着目した使い分けのポイントを具体的に示します。
※この記事は、ChatGPTの出力を基に作成しています。

---

## **1. 各情報量基準の基本概要と特徴**

### **AIC（赤池情報量基準）**
- **目的**：モデルの**予測精度**を重視する。
- **数式**：  
  $\\text{AIC} = -2 \\log L + 2k$
  - $\\text L $：モデルの対数尤度（適合度）  
  - $\\text k $：モデルのパラメータ数  

**特徴**：
- 適合度が良いほど小さな値を取る。
- **過剰なパラメータに対するペナルティが弱め**のため、**予測性能を優先する**ユースケースに適しています。
- データ数が増加しても、必ずしも真のモデルに収束しないため、予測精度は高いが一致性（Consistency）はないとされます。

**ユースケース**：
- 小規模から中規模のデータで、**将来のデータに対する予測精度を重視する場面**（特に回帰分析や時系列モデルなど）。

---

### **BIC（ベイズ情報量基準）**
- **目的**：モデルがデータにどれだけよく適合し、かつシンプルであるかを重視。
- **数式**：  
  $\\text{BIC} = -2 \\log L + k \\log n$
  - $\\text n $：データ数  

**特徴**：
- 大きなデータ数において真のモデルに収束する**一致性を持つ**。
- **AICよりもペナルティが強い**ため、シンプルなモデルを選びやすい。
- 予測性能よりも、**モデルがデータ生成過程を正しく表現しているかどうか**を重視。

**ユースケース**：
- 大規模なデータセットで、**データの生成過程を正確に理解することが重要な場面**（特に統計的な推論）。

---

### **HQIC（ハンナン＝クイン情報量基準）**
- **目的**：時間系列や中規模のデータセットで、AICとBICの中間的なバランスを取る。
- **数式**：  
  $\\text{HQIC} = -2 \\log L + 2k \\log(\\log n)$

**特徴**：
- ペナルティ項が $\\log(\\log n) $ でスケールするため、AICとBICの中間の強さ。
- 中規模データで安定した性能を発揮しやすい。

**ユースケース**：
- **時間系列モデル**や、中程度のサンプルサイズにおいて**予測性能とモデルの妥当性のバランス**を考慮したいとき。

---

### **RPE（相対予測誤差）**
- **目的**：モデルの**実際の予測性能**を評価する。
- **基本的な数式**：

  $\\text{RPE} = \frac{\sum_{i=1}^n(y_i-\hat{y_i})^2}{\sum_{i=1}^n(y_i-\bar{y})^2}$

**特徴**：
- 分母に平均モデル（常に平均値を予測するモデル）の誤差を取ることで、モデルの予測性能が平均モデルと比較してどれだけ優れているかを評価。
- **情報量基準のように理論的な仮定に依存しない**ため、機械学習や実務における予測性能評価に適している。

**ユースケース**：
- **将来の未知データに対する予測が主な目的**の場合に用いられます。特に、機械学習モデルや回帰モデルの性能をテストデータ上で評価する場面でよく使われます。

---

## **2. AICとRPEの違いと使い分け**

### **AICとRPEの本質的な違い**
| **特性**        | **AIC**                                         | **RPE**                                               |
|----------------|------------------------------------------------|------------------------------------------------------|
| **評価方法**   | モデルの対数尤度とパラメータ数による情報量基準 | 実際の予測誤差を直接評価する                         |
| **適用範囲**   | 主に統計モデルや時系列モデル                   | 機械学習、回帰、テストデータを用いた予測モデル       |
| **予測性能**   | データの適合度から**間接的に予測性能を評価**   | **直接的に予測誤差**を評価                           |
| **理論的特性** | 理論的根拠に基づいた一貫した評価が可能         | 分割方法やテストデータ次第で結果が異なる可能性あり   |
| **過適合のリスク** | 過適合のリスクがあるが、柔軟性が高い           | 適切にデータを分割すれば過適合を効果的に防げる       |

---

### **AICとRPEの使い分けのポイント**
- **AICを使うべき場合**
  - 統計モデルや時系列モデルで、**小規模から中規模のデータに対して将来のデータ予測が重要**な場合。
  - 理論的根拠に基づいたモデル選択が求められる場面。
  - 訓練データ内のモデル適合度を重視したい場合。

- **RPEを使うべき場合**
  - 実際の**未知データに対する予測性能を直接評価**したい場合。
  - 機械学習やデータサイエンスにおいて、**テストデータを用いてモデルの実用性を評価**する場面。
  - クロスバリデーションを通じて、過適合を避けながらモデル選択を行いたい場合。

---

## **3. 結論：実務での選択基準**

1. **統計的推論や小規模データ分析** → **AIC、BIC、HQIC**が有効  
   特に、モデルの構造そのものや真のモデルの一致性が重要な場合はBIC、バランスを取りたいならHQICを選びましょう。

2. **未知データに対する予測性能が重要な場面（実務や機械学習）** → **RPE**を活用  
   実際にテストデータを用いて予測誤差を評価し、モデルのパフォーマンスを判断します。

3. **併用が効果的な場合**  
   例えば、AICやBICで候補モデルを絞り込み、その後RPEで実際の予測性能をテストデータ上で確認することで、より信頼性の高いモデル選択が可能です。

---

**実務におけるアドバイス**  
データ分析の目的や、データの特性によって適切な基準が異なります。情報量基準は理論的なモデル選択に有効ですが、実際の運用では**RPEを補助的に使う**ことで、より実用的なモデル選びができるでしょう。
Pythonのバージョン管理をanyenvからasdfに変える手順

こんにちは。
先日Pythonのバージョン管理をanyenvからasdfに変えたので手順を書いておきます。
メモレベルですが、書き残しておくとどなたかの役に立つかと思いブログにしました。

## 本記事執筆時の環境

- Amazon Linux 2023

## anyenvの削除

anyenvとasdfが同居してるとどうなるか読めないので削除しておきます。
まず、anyenvからpyenvを削除します。

```shell
anyenv uninstall pyenv
```

次にanyenvをディレクトリごと削除します。

```shell
rm -rf .anyenv
```

初期化ファイルのどこかにパスを通す記述があるはずなのでこれを削除します。
私の場合は、`.bash_profile`に記載していたのでこれらを削除します。

```shell
vi ~/.bash_profile
```

この2行を削除します。

```shell
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
```

## asdfのインストール

公式ページの手順に従います。

https://asdf-vm.com/ja-jp/guide/getting-started.html

本記事ではAmazon Linux 2023で検証しているので、Homebrew・Pacmanは使用できません。
`公式ダウンロード`を実行します。

```shell

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0
```

`3. asdfのインストール`のBash&Gitに倣って設定`~/.bashrc`を編集
編集後、`source ~/.bashrc`で変更した設定をロードいます。

### Pythonの準備


asdfにPython追加します。

```shell
asdf plugin add python
```


あとは、asdfでPythonをインストールしていきます。

```shell
asdf install python 3.11.6
asdl local python 3.11.6
```

以上で完了です。
Android フォンから Outlook に連絡先を転送する方法

Outlook で Android フォンの連絡先をインポートまたはコピーしたいですか? その場合は、この記事に従えば、Android から Outlook に連絡先をインポートする簡単で迅速な方法がわかるので、適切な場所にいます。この記事を読み、最後のページまで詳細を確認してください。


## Android フォンの連絡先を Outlook に転送する必要があるのはなぜですか?

• Android フォンから Outlook に連絡先を移動すると、さまざまな利点があります。
• Outlook を使用すると、すべての連絡先を 1 か所で管理できるため、連絡先データの管理、検索、更新が簡単になります。
• オフィスのコンピューター、タブレット、2 台目の電話など、Outlook アカウントにサインインするどのデバイスからでも、どこからでも Outlook の連絡先にアクセスできます。
• Outlook との統合により、Teams、Word、Excel などの他の Microsoft 365 ツールを使用する場合でも、計画と通信が簡単になります。
• Outlook の連絡先があると、電話がデータを紛失した場合にバックアップのレベルがさらに高まります。 • 強力なセキュリティ対策には、Outlook や Microsoft 365 の保護機能や多要素認証などがあり、連絡先データの保護に役立ちます。
• メールと連絡先の統合により、他の場所でメールや携帯電話を探す必要がなくなり、コミュニケーションが簡素化されます。

### 手動アプローチの適用に関する制限 -

Android フォンから Outlook への連絡先の移動は簡単ですが、注意すべき制限がいくつかあります。

ファイル形式のサポート -

Android の連絡先は vCard または CSV 形式で保存できますが、Outlook では直接サポートされていません。変更が必要になる場合があります。

連絡先の数 -

一度に移動できる連絡先の最大数は、一部の手法によって制限される場合があります。たとえば、特定のプログラムを使用してエクスポートする場合、選択できるのは限られた数だけです。

複数の連絡先 -

特に既に連絡先がある場合、変換中に Outlook に重複した連絡先が表示されることがあります。

地形図 -

すべてのタッチポイントが情報を完璧に送信できるわけではありません。たとえば、特殊なフィールドや特定のデータは、Outlook と Android と互換性がない場合があります。

これらの問題を最小限に抑えるために、移行前に連絡先をバックアップし、公式ツールまたは信頼できるサードパーティのプログラムを使用してプロセスを効率化することを検討してください。

## Android フォンから Outlook に連絡先を転送する別の方法 -

Android から VCF ファイルをエクスポートしたので、Outlook は VCF ファイルを処理できないため、それらを Outlook データ ファイル タイプに変換する必要があります。これを実現するには、ソリューションを使用する必要があります。
このツールは「WholeClear <p><a target="_blank" rel="noopener noreferrer" href="https://www.wholeclear.com/converter/vcf-to-pst/"><strong>VCF から PST へのコンバーター</strong></a></p>と呼ばれます。このアプリケーションを使用すると、Android VCF 連絡先ファイルを Outlook PST 形式にエクスポートできます。どの電話からでも、連絡先を簡単に Outlook に転送できます。



さらに、生産性を向上させる優れたソフトウェア機能も提供します。たとえば、すべての連絡先の詳細をプレビューした後、vCard ファイルを Outlook のグループにインポートできます。さらに、データの整合性を維持しながら、連絡先の写真を含むすべてのデータを一括で転送できます。



### Android VCF ファイルを Outlook に移動する手順 -

VCF ファイルから PST へのコンバーター ソフトウェアをダウンロードして開く必要があります。

vCard 連絡先ファイルをツールに追加するには、[ファイルまたはフォルダーの追加] をクリックします。

vCard ファイルを移動するには、[CSV] オプションを選択します。

VCF 連絡先ファイルを PST に転送するには、[エクスポート] ボタンをクリックします。

[保存] をクリックして手順を終了します。

#### 最後のコメント

このブログの目的は、Android フォンから Outlook バージョンに連絡先を移動する方法を教えることです。Android から Outlook に連絡先をインポートするには、さまざまな方法があります。最も効果的な方法を使用できます。このページを読んで、完全な手順を概説しているので、回答をコンピューターにダウンロードできます。さらにサポートが必要な場合は、当社の技術専門家にご相談ください。
【AWS】「なぜこの設定をしているのか？」その疑問を解消するために学んだこと

# 🚀 ハッカソンで気づいたAWSとネットワークの重要性

## はじめに  
RareTECHの名物イベント **「ハッカソン」** に参加した際、AWSを使ってインフラ構築をしました。  
本や動画、Qiitaの記事を活用しながらAWSのサービスや設定方法を学び、サービスごとの設定手順を覚えていきました。  

しかし、いざ構築に取り掛かると **「なぜこの設定をしているのか？」** という疑問が浮かび、AWSの知識だけではなくネットワークの基礎を理解することが重要だと痛感しました。  

---

## 🔍 設定の意味を理解することが大事  
AWSの設定を調べながら進めていましたが、次第に以下のような疑問を抱くようになりました。

- 🧐 **CIDR表記やルーティングテーブルは本当にこれで正しいのか？**  
- 🤔 **ネットの情報通りに設定したけど、そもそも意味は？**  
- 🌐 **AWSという目に見えない環境で、どの設定がどこに関連しているのか？**  

これらの疑問を解決するためには、**単に設定を覚えるのではなく、その背景にあるネットワークの理論を理解することが重要** だと気づきました。

---

## 📚 ネットワークの基礎を学ぶと理解が深まる  
「オンプレミスの知識を学べば理解が進むのでは？」と考え、**CCNA（Cisco Certified Network Associate）** の学習を始めました。  

また、**パケットトレーサー（パケトレ）** を使ってネットワークをシミュレーションすることで、以下の点が理解できるようになりました。  

- 🏷 **IPアドレスの割り当て** → サブネットへのIPアドレスの振り分け方  
- 🔄 **ルーティング設定** → ルータ間でパケットがどのように転送されるか  
- 🔐 **ACL（アクセス制御リスト）の理解** → AWSのNACLやセキュリティグループとの関連  

このように、**ネットワークの仕組みを学ぶことで、AWSの設定が以前よりも明確に理解できるようになりました。**  

---

## 🎓 実際の学習法とリソース  
パケトレにハマり、「この設定をするとどうなる？」「このケーブルは何のため？」と好奇心を持って学びました。  
並行して **CloudTechの動画** も活用。AWSの設定方法だけでなく、その背後にあるネットワークの仕組みまで詳しく解説されており、理解が深まりました。  

### 📌 おすすめ学習リソース  
- 🎥 **CloudTech**（オススメ）  
  [AWSの設定方法とネットワーク理論を学べる+AWS資格試験対策](https://kws-cloud-tech.com/)  
- 📖 **Udemy**  
  [【超絶入門】CCNA対策 Packet Tracerで学ぶ ハンズオン講座](https://www.udemy.com/course/ccna-packet-tracer/)  
- 🌐 **CCNAの学習サイト**  
  [CCNAイージス](https://www.infraexpert.com/info/ccnaz7.html)  

---

## 🔄 AWSとCCNAにおけるネットワーク構成の比較  
パケトレで実際にルーティングを設定した場合、AWSのルートテーブルでは **「あの作業をやるのね」** と言った感じにイメージしながら設定する事ができました。  

| **CCNAで学ぶネットワークの要素**   | **AWSでの対応サービス**        | **説明**  |
|--------------------------------|--------------------------|---------------------------|
| **IPアドレスの割り当て / サブネット** | **VPC（仮想プライベートクラウド）** | AWSではVPC内にサブネットを作成し、IPアドレスを割り当てる。オンプレでは手動で設定。 |
| **ルーティング**                | **ルートテーブル**        | AWSのVPC内でサブネット間や外部ネットワークとのトラフィックを制御。オンプレと同じ概念。 |
| **ACL（アクセス制御リスト）**     | **NACL（ネットワークACL）**  | サブネット単位でトラフィック制御を行う。オンプレのACLと同様の役割を果たす。 |
| **ファイアウォール（内部）**      | **セキュリティグループ**    | インスタンス単位でアクセス制御を行う。オンプレのファイアウォールと同様の働き。 |
| **インターネット接続（ゲートウェイ）** | **インターネットゲートウェイ（IGW）** | VPCとインターネット間のトラフィックをルーティング。オンプレのゲートウェイと類似。 |

---

## 🏆 学習の進め方  
私が実践した学習ステップは以下の通りです。

1. 📖 **ネットワークの基礎を学ぶ**（CCNAやパケットトレーサーを活用）  
2. 🛠 **AWSの基本設定を学ぶ**（VPC、サブネット設計、セキュリティ設定）  
3. ✋ **実際に手を動かしながら学ぶ**（CloudTechやUdemyの教材を活用）  
4. 🚀 **小さなAWSプロジェクトを構築して実践する**  

---

## 💡 まとめ  
AWSでインフラを構築するには、**単にサービスごとの設定方法を学ぶだけでなく、その背後にあるネットワークの仕組みを理解することが重要**   

現在は、GUIで簡単に機器設定ができる時代で、知識がそこまで深くなくても作業できることもあります。  
また、**「ググれば解決！ChatGPTに聞く！」** というのも、確かに良い方法かとおもいます。  

しかし、**そもそも“何をググればいいか”が分からなければ、調べることすらできませんよね？**  

例えば、AWSのALB（Application Load Balancer）でリクエストが通らない場合、  
「ALB エラー」と検索しても適切な答えが見つからないことがあります。  
しかし、  

- 🔍 **セキュリティグループの設定ミス？**  
- 🔄 **ターゲットグループのヘルスチェック？**  
- 📡 **ルートテーブルの問題？**  

といった **ネットワークやLinuxの知識** があれば、適切な検索キーワードが思いつき、解決に近づけます。  

私は「ハッカソンで最終デプロイできない…」と3日間悩んだことがあります。  
しかし、最終的に見つけたQiita記事には **すでに知っていたこと** が書かれていて、「なんだ、これか」と拍子抜けしました。  

ハッカソンを通じて、**イメージだけで進めるには限界がある** ことを痛感しました。  
そして、**オンプレ環境の知識は今でも非常に役立つ** ことを実感しました。  


ネットワークが苦手だったのは、イメージができなかったから。  
しかし、実際に学び、パケトレやAWSを手を動かすことで「何がどう関連しているのか」が少しずつ分かるようになりました。  
この経験が、私のネットワーク/クラウド学習を大きく前進させたと感じています！
DeepSeekロカールにインストール（AWSLinux編)



## 環境の準備

- **操作システム**: Amazon Linux 2023  
- **ストレージ計画**: データディスクを`/mnt/data`にマウント。  
- **ハードウェア要件**: NVIDIA GPU (基本ドライバのインストールが必要)

---

## 一、ディレクトリ構成の規画

下記のコマンドで標準化されたアプリケーション用ディレクトリを作成します。

```bash
# 標準化アプリケーション用ディレクトリ作成
sudo mkdir -p /mnt/data/{apps/{cuda,ollama},cache/dnf,tmp}

# ディレクトリの用途
# /mnt/data/apps/cuda      - CUDA Toolkit主プログラム
# /mnt/data/apps/ollama    - Ollamaモデルストレージ
# /mnt/data/cache/dnf      - DNFパッケージマネージャーキャッシュ
# /mnt/data/tmp            - 一時ファイル保存用
```

---

## 二、環境変数の設定

CUDA ToolkitとOllamaの環境変数を設定します。

```bash
# CUDA環境の設定
echo 'export CUDA_HOME=/mnt/data/apps/cuda' >> ~/.bashrc
echo 'export PATH=$CUDA_HOME/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc

# Ollama環境の設定
echo 'export OLLAMA_MODELS=/mnt/data/apps/ollama/models' >> ~/.bashrc
echo 'export TMPDIR=/mnt/data/tmp' >> ~/.bashrc

# 設定を透過させる
source ~/.bashrc
```

---

## 三、DNFの設定の最適化

DNFパッケージマネージャーの設定を変更します。

```bash
# DNF設定ファイルの変更
sudo tee /etc/dnf/dnf.conf <<'EOF'
[main]
gpgcheck=1
installonly_limit=2
clean_requirements_on_remove=True
best=True
skip_if_unavailable=True
keepcache=1
cachedir=/mnt/data/cache/dnf
EOF
```

---

## 四、NVIDIAドライバのインストール

```bash
# CUDAリポジトリの追加
sudo dnf config-manager --add-repo=https://developer.download.nvidia.com/compute/cuda/repos/amzn2023/x86_64/cuda-amzn2023.repo

# 依存コンポーネントのインストール
sudo dnf install -y dkms kernel-devel kernel-modules-extra

# NVIDIAドライバパッケージのインストール
sudo dnf install -y nvidia-driver nvidia-driver-cuda
```

---

## 五、CUDA Toolkitのインストール

```bash
# インストーラーのダウンロード
cd /mnt/data/apps/cuda
wget https://developer.download.nvidia.com/compute/cuda/12.6.3/local_installers/cuda_12.6.3_560.35.05_linux.run

# 静的インストール
sudo ./cuda_12.6.3_560.35.05_linux.run \
  --toolkit \
  --toolkitpath=/mnt/data/apps/cuda \
  --samples \
  --samplespath=/mnt/data/apps/cuda/samples \
  --silent
```
### インストールの確認

```bash
nvcc --version
nvidia-smi
```
---

## 六、Ollamaサービス

システムサービス用のコンフィグファイルを作成します。

```bash
# Ollamaインストール
curl -fsSL https://ollama.com/install.sh | sh
mkdir -p /mnt/data/apps/ollama
# systemdサービスファイルの作成
sudo tee /etc/systemd/system/ollama.service <<'EOF'
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
Environment=OLLAMA_MODELS=/mnt/data/apps/ollama/models
Environment=NVIDIA_VISIBLE_DEVICES=all
Environment=CUDA_VISIBLE_DEVICES=0
ExecStart=/usr/local/bin/ollama serve
Restart=always
User=ec2-user

[Install]
WantedBy=multi-user.target
EOF

# サービスを有効化して起動
sudo systemctl daemon-reload
sudo systemctl enable ollama
sudo systemctl start ollama
```

---

## 七、デプロイ確認


# Ollamaを使用したAIモデルの操作方法

このブログでは、Ollamaを使用してAIモデルを管理および実行する方法について紹介します。具体的な例を使用して、モデルのプル、リスト表示、および実行方法を示します。

## 1. モデルのプル
まず、以下のコマンドを使用してOllamaのリポジトリから`deepseek-r1:7b`モデルをプルします：

```bash
ollama pull deepseek-r1:7b
ollama list
```
## 2. 会話モードで起動
```bash
ollama run deepseek-r1:7b
```

---

## 注意事項

1. **ストレージ規画**: 将来的な拡張を容易にするため、LVMの使用を推奨します。
2. **GPUモニタリングの設定**: プロダクション環境ではGPUの監視が重要です。

```bash
sudo dnf install -y nvidia-smi top
```

3. **一時ディレクトリの定期クリーニング**: 不要な一時ファイルを定期的に削除します。

```bash
find /mnt/data/tmp -type f -mtime +7 -delete
```
Laravel でマイグレーションテーブル名をカスタマイズする方法

# はじめに

Laravel のマイグレーションを実行すると、デフォルトではデータベースに`migrations`というテーブルが作成され、実行済みのマイグレーションが管理されます。
しかし、プロジェクトによってはこのテーブル名を変更したいケースもあるかと思います。
本記事では、Laravel の設定を変更することでマイグレーションテーブルの名前を任意にカスタマイズする方法をご紹介します。

なお、この記事を書くにあたっては、以下の環境で動作確認を行っています。

- Laravel v11.41.3
- PostgreSQL v17.2

# マイグレーションテーブル名のカスタマイズ手順

まず、Laravel プロジェクト内の`config/database.php`を開きます。
ファイル内には以下のような記述があると思います。

```php
    /*
    |--------------------------------------------------------------------------
    | Migration Repository Table
    |--------------------------------------------------------------------------
    |
    | This table keeps track of all the migrations that have already run for
    | your application. Using this information, we can determine which of
    | the migrations on disk haven't actually been run on the database.
    |
    */

    'migrations' => [
        'table' => 'migrations', // ここを任意のテーブル名に変更する
        'update_date_on_publish' => true,
    ],
```

この 'migrations' キーに対応する連想配列内の table の値を、任意のテーブル名に変更します。
例えば、以下のように設定することでテーブル名を`custom_migrations`に変更できます。
```php
    'migrations' => [
        'table' => 'custom_migrations', // テーブル名をカスタマイズ
        'update_date_on_publish' => true,
    ],
```

次に、以下のコマンドでマイグレーションを実行します。
※ 新規 Laravel プロジェクト作成時に生成されるデフォルトのマイグレーションファイルが対象となります。

```shell
php artisan migrate
```

![スクリーンショット 2025-02-03 20.45.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/bf9a5bd7-05a3-75b0-0eb2-54d281cba1d6.png)

DB を確認すると、従来の migrations テーブルではなく、上記で指定した custom_migrations テーブルが作成されていることが確認できます。

![スクリーンショット 2025-02-03 20.45.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/0575ef64-906e-2629-c721-9374c3939e3a.png)


# 終わりに

公式ドキュメント上でマイグレーションテーブル名のカスタマイズ方法が見つからなかったため、今回の方法を備忘録としてまとめました。
また、過去に実装したLaravel v9プロジェクトの頃から同様の挙動が確認できていました。
この記事が皆様の開発の参考になれば幸いです。
Mediapipeで動画のオブジェクト検出を試してみる

## はじめに
今回はMediapipeを使って動画ファイルのオブジェクトを検出してみたいと思い、試してみた結果を備忘録として残します。

## 事前準備
まず、Googleが準備している学習済みのモデルが[オブジェクト検出タスクガイド](https://ai.google.dev/edge/mediapipe/solutions/vision/object_detector?hl=ja&_gl=1*t2mnnd*_up*MQ..*_ga*MTQyNzY5MTA0OS4xNzM4NTc5NzAy*_ga_P1DBVKWT6V*MTczODU3OTcwMi4xLjAuMTczODU3OTcwMi4wLjAuMTY0ODk2NzkwNQ..)
にあるので、これを使用します。僕は **fficientDet-Lite0 モデル（推奨）** のEfficientDet-Lite0（float 32）を使いました。
また、Googleが[サンプルコード](https://github.com/google-ai-edge/mediapipe-samples/blob/main/examples/object_detection/python/object_detector.ipynb)を準備していますので、これを参考にしました。

## 実装してみる
Google Colaboratory上でPythonを使って実装しました。
まずは事前準備でDLしたEfficientDet-Lite0（float 32）モデルを指定します。
```python
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

model_path = '/content/drive/MyDrive/efficientdet_lite0.tflite'
```

```python
import cv2
from mediapipe.tasks.python import vision
from google.colab.patches import cv2_imshow

BaseOptions = mp.tasks.BaseOptions
ObjectDetector = mp.tasks.vision.ObjectDetector
ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ObjectDetectorOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    max_results=5,
    running_mode=VisionRunningMode.VIDEO)

cap = cv2.VideoCapture('/content/drive/MyDrive/test.MP4')

video_file_fps = cv2.CAP_PROP_FPS
with ObjectDetector.create_from_options(options) as detector:
  ret, frame = cap.read()

  while ret:
    frame_timestamp_ms = cap.get(cv2.CAP_PROP_POS_MSEC)
    mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)
    detection_result = detector.detect_for_video(mp_image, int(frame_timestamp_ms))

    annotated_image = visualize(np.array(frame).astype(np.uint8), detection_result)
    cv2_imshow(annotated_image)

    ret, frame = cap.read()

cap.release()
cv2.destroyAllWindows()
```
visualize()は、githubのコードをそのまま使いました。

## 結果
今回使用した動画ファイルは、以前、ETロボコンに参加したときの動画ファイルを使いました。
![スクリーンショット 2025-02-03 205045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/e5dd3132-410f-79b3-57be-3df1133df2e4.png)

人（person）と椅子（chair）が検出されていますね。精度は5割程度なので、少し低いのかな。使用しているモデルの精度が低いのと、動画ファイルも解像度が小さいのでまずまず期待通りなのかなと。
もう少し精度高めのモデルを使ったり、使用する動画ファイルの解像度をUpすればさらに精度も上がるんじゃないかと思います。
AtomS3 LiteでLチカ

## 2月4日の夜は名古屋のオアシス21へ

2月4日と5日、名古屋でTechGALA関連のイベントとして、オアシス２１で「MAKERS OASIS」が開催されます。このイベントに、ギャル電で講師役（？）で参加するということで、会いに行こうと思っています。
オアシス２１は、職場から歩いて3分ぐらいのところにあるため、仕事終わりにサクッと行けちゃいますｗ

https://x.com/La_zlo/status/1885903091498918258

https://x.com/GALDEN999/status/1881181802259501368

このMAKERS OASIS、中でいろんなイベントがごちゃまぜになっていて、正直よくわかっていません（笑）
ただ、👇のイベントに参加して、ギャル電に会いたい！！というだけですｗｗｗ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952925/29e3fc27-fd85-acd0-cb13-07c4be6153f4.png)

## 「光るもの」を作る

ということで、条件の１つである【なにか「光るもの」を身に着けてる人】をクリアするため、パパっと作ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952925/e48fd797-d908-839f-a665-4d8bc63c4f51.png)

ハードは、AtomS3 Lite、ちょうどLチカ用のコードを埋め込んである…と思って久しぶりに起動してみたら、なんか動かん。。。
ソースを開いてみたけど、なんかそれらしきファイルも見当たらないので、仕方なしに作り上げました。ざっと30分ぐらい。これぐらいなら、30分で作れる程度には、UiFlow2も使えるようになってきましたｗ

## ただファームアップがうまく行かない

実際、コードを組んでデバイスにＤＬしようとすると、ファームウェアをアップデートしろというメッセージが表示されまして。まぁ、確かにしばらく触ってなかったので、仕方ないか……と思い、ファームをアップしようとするのですが、書き込みができません。なんどやってもエラー。

こちらは、かれこれ2時間ぐらい悩みました💦

結果、デバイス側のリセットボタンを押してから焼いたところ、正常に最新ファームで更新されまして、無事にUiFlow2からコードがＤＬできるようになりました。

## 実装！

写真なので、チカチカすませんが、ちゃんと点滅しますし、ボタン操作で止めることもできます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952925/bac21381-a204-b0e5-f6da-a52c234f83f1.png)
PMBOK原理・原則：チームリーダーシップを学ぶ

PMBOKとチームリーダーシップについて、現場での実践を意識してまとめてみました。
当たり前に思える原理・原則も、実践は意外と難しいもの。でも、チーム全員で少しずつ前に進んでいけたらと思います。

![マインドマップ (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/07ac6278-97ab-9cf6-cda8-4c65c8f80efa.png)


## はじめに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/51a3a796-ea3d-0cd3-b830-33801dd39c09.png)

- PMBOK(プロジェクトマネジメントの標準ガイド)において、プロジェクト成功のカギを握るのが「チームリーダーシップ」。
- 当たり前だけれど、実践するのはなかなか難しい。
- 本記事では、PMBOKの原理・原則に寄り添いながら、チームリーダーシップを発揮するためのポイントを、「現場と理想のギャップ」に配慮したゆるっとした視点でまとめます。

## 1. PMBOKが大事にする“チーム”の概念
- **目標共有**：プロジェクトのゴールを明確にし、メンバー全員が共有する。
- **役割と責任の明確化**：スコープ管理やWBSによって、誰が何をやるかはっきりさせる。
- **コミュニケーション**：情報を適切に交換する場を設計し、メンバー間の連携を促進。
- **リスク管理**：問題が起きたときにどう動くか事前に備え、みんなで対処できる仕組みを作る。

## 2. チームリーダーシップとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/e68a9fee-fb61-5e7c-3a84-b37a68791101.png)

- **方向性を示す**：チームにビジョンを提示し、共通のゴールへ導く。
- **巻き込み力**：メンバーをエンゲージし、自発的な動きを引き出す。
- **信頼構築**：リーダーが独りよがりにならず、メンバー同士がお互いをフォローし合う環境を作る。

### 2.1. PMだけがリーダーじゃない
- チーム全員が“小さなリーダーシップ”を発揮することで、主体的に動けるチームが育つ。

## 3. 現場と理想のギャップ事例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a15e0e5d-05ca-c104-157b-271c1370407e.png)

- **余裕がない問題**：計画やドキュメンテーションを理想通りにやるのは難しい。
- **チーム構造の複雑さ**：外注やフリーランスとの混成チームで、共通認識を作るのが大変。
- **上層の意思決定や組織構造**：縦割り体制でリーダーだけが奮闘し、チームが巻き込まれない。

## 4. ゆるっと実践ヒント
1. **ミニPM意識**：メンバー各自が進捗管理や問題共有を自主的に行う。
2. **ポジティブ共有会**：進捗会議だけでなく、称賛ポイントを共有してモチベアップ。
3. **ファシリテーションのローテーション**：会議の進行や議事録担当を持ち回りにして、全員がリーダーシップを体験。
4. **小さな成功体験を重ねる**：プロトタイプやテスト段階での達成を祝うと、チーム全体の士気が上がる。
5. **ヘルプを求める勇気**：リーダーが「助けて」と言える環境づくりも大切。

## 5. まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/dcdf2db6-2aa8-23f8-acb4-e62866a978cf.png)

- PMBOKの原理・原則は、一見“当たり前”に見えるが、それを現場で実行するのは難易度が高い。
- チームリーダーシップは、“一人のカリスマ”ではなく“みんなで作り上げていくもの”。
- 現場の状況に合わせてゆるっとアプローチを取り入れ、少しずつ理想と現実の差を埋めていこう。

**当たり前こそが奥深い！ 一歩ずつ実践して、共通の目標を達成する“いいチーム”を目指しましょう。**
[Linux] ハードリンクとシンボリックリンク_コマンド_ln

# ハードリンクとシンボリックリンクの違い
| 項目 | ハードリンク| シンボリックリンク|
|:--|:--|:--|
| 指し示す対象 | 元のファイルのデータブロック | 元のファイルのパス |
| 元ファイル削除時の影響 | データは残る | リンクは残るが無効 |
| 異なるファイルシステム間で作成可能か | 不可 | 可 |
| ディレクトリへの適用 | 不可 | 可 |
| 作成方法 | `ln <元ファイル> <リンク名>` | `ln -s <元ファイル> <リンク名>` |
| ファイルの`inode`番号 | 同じ | 異なる |
| ls コマンドでの表示 | 同じ inode 番号を持つ | パーミッションの先頭に「l」が表示 |

# lnコマンド
~~~terminal:ln
$ ln [オプション] リンク元(実体) リンクファイル
~~~

|オプション|由来|説明|
|:--|:--|:--|
|default|link|ハードリンクの作成|
|`-s`|symbolic link|シンボリックリンクの作成|

# ハードリンクの例
~~~terminal:sh
$ echo "Hello" > original.txt
$ ln original.txt hardlink.txt
$ ls -li
123456 -rw-r--r-- 2 user user 6 Feb 2 12:00 original.txt  
123456 -rw-r--r-- 2 user user 6 Feb 2 12:00 hardlink.txt  
~~~

# シンボリックリンクの例
~~~terminal:sh
$ ln -s original.txt symlink.txt
$ ls -li
123456 -rw-r--r-- 1 user user 6 Feb 2 12:00 original.txt  
654321 lrwxrwxrwx 1 user user 12 Feb 2 12:01 symlink.txt -> original.txt  
~~~

# Ping-t

全般
- [3234_ln](https://mondai.ping-t.com/question_subjects/31/question_sessions/31232403/progressing_questions/478592411)
- [3701_ハードリンク, シンボリックリンク](https://mondai.ping-t.com/question_subjects/31/question_sessions/32725104/progressing_questions/501357396)

ハードリンク
- [3551_ハードリンク](https://mondai.ping-t.com/question_subjects/31/question_sessions/31602419/progressing_questions/484263618)
- [3642_ln](https://mondai.ping-t.com/question_subjects/31/question_sessions/31140772/progressing_questions/477192458)
- [3652_ln](https://mondai.ping-t.com/question_subjects/31/question_sessions/31763145/progressing_questions/486763777)
- [34598_ハードリンク](https://mondai.ping-t.com/question_subjects/31/question_sessions/32527688/progressing_questions/498427180)

シンボリックリンク
- [3546_シンボリックリンク](https://mondai.ping-t.com/question_subjects/31/question_sessions/30205245/progressing_questions/462752073)
- [3550_ln -s](https://mondai.ping-t.com/question_subjects/31/question_sessions/30552498/progressing_questions/468099716)
- [3552_ln -s](https://mondai.ping-t.com/question_subjects/31/question_sessions/30205245/progressing_questions/462752071)
PHPで「PHPのプログラムの中でコメントを記述する」の動作を確認してみた。

# 概要

PHPで「PHPのプログラムの中でコメントを記述する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/php/ini/index4.html

# 実装

以下のファイルを作成しました。

```sample.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>
<?php
/* 作成日 2024/10/27
   作成者 hogehoge
   Version 3.5 */

echo "こんにちは。";  # 画面に出力
?>
</p>

</body>
</html>
```

以下のコマンドを実行しました。コメントの記述がすっとばされました。

```
$ php sample.php 
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>
こんにちは。</p>

</body>
</html>
```

# まとめ

何かの役に立てばと。
ReactとNext.jsで作るメモ帳アプリ：inputやtextareaのデータをフォームなしでデータベースに送信する

## はじめに
こんにちは。Reactの学習のために簡易なメモアプリを作ることにしたのですが、せっかくなので趣味の競馬で使えるような競馬特化メモアプリを作成することにしました。
競馬とは勝負の世界。馬券購入締め切りの直前まで１分たりとも無駄にすることはできません。そんな中いちいち登録ボタンを押さないとメモを登録できないような実装では、時間をロスし当てられるレースも外してしまいます。「あと１分あれば当てれてた」なんて言い訳とはおさらばしましょう。
## debounceでリクエストを調整する
今回の実装では、inputタグやtextareaタグの値をuseStateで管理し、メモが更新されるたびにデータベースに送信します。しかし、一文字一文字変更があるたびにリクエストを送信すると、リクエストが過多になってしまいます。そこで、lodashのdebounce機能を使い、入力から一定時間が経過した後にリクエストを送信する方法を採用しました。
### debounceとは？
debounceとは、特定の関数が頻繁に呼び出されるのを防ぐための技術であり、最後のイベントが発生してから一定時間が経過した後にのみ関数が実行されます。
#### debounceの使い方
まず、lodashをインストールします
```
npm install lodash
```
次に、Reactコンポーネント内でdebounceを呼び出します
```page.js
import { debounce } from 'lodash';
```
### 実装
textareaタグの設定
```page.js
<textarea name="comment" value={comment} onChange={(e) => handleChange(e, item.id)} className={styles.commentBox}></textarea>
```
onChangeで呼び出す関数
```page.js
const handleChange = debounce(async (e, id) => {
      const { name, value } = e.target;
      try {
          const response = await fetch('/api/update-data', {
              method: 'POST',
              headers: {
                  'Content-Type': 'application/json',
              },
              body: JSON.stringify({ id, fieldName: name, fieldValue: value }),
          });
          const result = await response.json();
      } catch (error) {
          console.error('Error updating data:', error);
      }
  },500);
  ```
  
  実際に動かしてみると
  ![debounce.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755437/01e94990-d795-6970-f34e-afc39f91ca05.gif)
  
一文字ごとにリクエストが送信されていないことがわかる
![スクリーンショット 2025-02-03 16.54.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755437/22dfca55-0072-cfec-a8ca-cf7cb29bde84.png)

無事フォームなしでinputやtextareaのデータをデータベースに送信することができました！
Dockerを使ってClickhosueを導入しよう！

# はじめに
Clickhouseというdbをご存知ですか？あまり知られていないと思いますが、dockerを使って簡単に導入できるので手順を紹介します。


# 手順
## フォルダ構成
フォルダ構成は以下です。
```
tree
.
├── Dockerfile
└── docker-compose.yml
```

treeコマンドがない場合は、macの場合以下コマンドで取得可能です。
```
brew install tree
```

.Dockerfile
```
FROM clickhouse/clickhouse-server:latest
```
以下コマンドでDockerfileをビルドしてください。
```
docker build . -t clickhouse
```

.docker-compose.yml
```
services:
  db:
    image: clickhouse
    container_name: clickhouse_container
    ports:
      - 8123:8123


```

以下コマンドでコンテナを起動してください。
```
docker-compose up -d
```

以上。

# コンテナ確認
以下コマンドでコンテナにアクセスしてください。
```
docker exec -it clickhouse_container /bin/bash

clickhouse client

show databases;
```

以下出力になればOK
```
   ┌─name───────────────┐
1. │ INFORMATION_SCHEMA │
2. │ default            │
3. │ information_schema │
4. │ system             │
   └────────────────────┘
```

# 参考
[ClickHouse Server Docker Image](https://hub.docker.com/r/clickhouse/clickhouse-server/)
MacからUSBにVentoyをインストールする

# 筆者について

```
name → Koki Teramoto
age → 18
language → ja_JP, en_US
```

# 本編

今回はUSBをさまざまなOSのインストーラーに変えてします素敵なブート用USBを作成します！…という題名をつける予定だったのですが、VentoyはオフィシャルにMacには対応していません。ということで、これを解決したという話です。

## UTMはUSBをブリッジ接続できる

これはびっくりだったのですが、実はUTM上のVMにはUSBデバイスをブリッジ接続できます。ということで、今回はこの機能を使ってVM上のLinuxを使ってUSBメモリにVentoyをインストールしていきたいと思います。

## 前提条件

動作環境は以下のとおりです。

- Arch Linux ARN aarc64

## Ventoyの関連ファイルをインストール

Venotyの関連ファイルをダウンロードして解凍します。僕はもうこれ一回きりだと思ったのでそのままDownloadsフォルダに置いてます。

https://www.ventoy.net/en/doc_start.html

## UTMのブリッジ接続

右上のアイコンからUSBメモリを選択すると、USBデバイスをブリッジ接続してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/2b3de22c-7501-d922-100f-84309cc9aa0b.png)

そのままついでにラベルを確認しておきましょう。

```bash
$ lsblk

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    1 28.9G  0 disk
├─sda1   8:1    1 28.8G  0 part
└─sda2   8:2    1   32M  0 part
sr0     11:0    1 1024M  0 rom
vda    253:0    0   32G  0 disk
├─vda1 253:1    0  512M  0 part /boot
├─vda2 253:2    0    2G  0 part [SWAP]
└─vda3 253:3    0 29.5G  0 part /
```

僕の場合は`/dev/sda`ですね。

## Ventoyのインストール

そのままVentoyをインストールしましょう。

```bash
sudo sh Ventoy2Disk.sh -i /dev/sda
```

ちなみに僕の場合は以下のようなエラーが出ました。

```
./tool/ventoy_lib.sh: line 381: mkfs.vfat: command not found
127 retry ...
```

その場合は`dosfstools`というパッケージをインストールしてからリトライしてください。

```bash
sudo pacman -S dosfstools
```

# 最後に

実はもうちょっとしたらとあるものが届いてこのUSBを使う予定なんですよね。記事をぜひ楽しみにしておいてください。
サーバーサイドレンダリングとサーバーコンポーネントの違いとは

サーバーサイドレンダリングとサーバーコンポーネント
SSRと似た用語として、Reactには「サーバーコンポーネント」があります。SSRではWebページのHTML自体をサーバー側で生成しますが、サーバーコンポーネントではコンポーネント単位の仮想DOMまでをサーバー側で生成してクライアント側に送り、それを元にクライアント側で描画します。対して、クライアント側で仮想DOMの生成から描画までをすべて行う（今までの）コンポーネントは「クライアントコンポーネント」です。

## つまり、コンポーネント単位でクライアントに送って描画する（仮想DOMを送る）のがServerコンポーネント

https://codezine.jp/article/detail/17953?p=2

サーバーコンポーネントというのは、コンポーネント（部品）ごとに「見た目の設計図（仮想DOM）」をサーバー側で作って、その設計図をクライアント（ブラウザ）に送って、クライアント側で実際の画面（HTMLなど）を作る、という仕組みのことです。

### 具体的には…

- **SSR（サーバーサイドレンダリング）**  
  サーバーがWebページ全体のHTMLを作って送ります。ブラウザはそれをそのまま表示するので、ページがすぐに見えるという特徴があります。

- **サーバーコンポーネント**  
  こちらは、ページ全体ではなく、各コンポーネント単位で「仮想DOM」と呼ばれる、コンポーネントの構造や内容を表した設計図（JavaScriptのオブジェクト）をサーバー側で作ります。  
  その設計図は、実際のHTMLそのものではなく「どういう部品があって、どんな順番で並ぶか」を表したものです。  
  クライアント側では、その設計図を受け取ってから実際に画面を描く（HTMLに変換して表示する）ので、必要な情報だけを効率よく送ることができます。

### 子供向けの例え

例えば、LEGOブロックでお城を作るときのことを考えてみてね：

- **SSRの場合**  
  サーバーが完成したお城そのものを作って、その写真をあなたに送るようなものです。あなたはその写真を見て、お城だとわかりますが、後から動かしたり変更したりはできません。

- **サーバーコンポーネントの場合**  
  サーバーが「お城を作るためのレゴブロックの配置図」を作って、それをあなたに送ります。あなたはその配置図を見ながら、自分で実際にブロックを組み立ててお城を作るので、途中で部品を変えたり、動かしたりすることができるかもしれません。

このように、サーバーコンポーネントでは、サーバー側で各部品の「設計図」を作って送ることで、クライアント側で効率よく画面を作成できる仕組みになっている、ということです。
Claude.aiをつかって画像内の文字を正確に抽出する方法を見つけました

例えば、[こちら](https://www.anthropic.com/research/alignment-faking)のブログですが、グラフィカルな解説部分が、画像になっています。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/60517399-00e0-c395-e856-2e38e9cf7e7a.png)

Claudeはマルチモーダルに対応しているので、画像を添付した状態で「文字を抽出して」というと文字を抽出してくれますが、日本語で要約して回答したり、**元の文章を正確に抽出する** のは、意外と難しいと感じていました。

以下は、Claude.aiを使って「添付画像から文字を抽出して」と依頼した際の結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/8b00ff33-c3ff-9619-4084-8c981107d89c.png)


原文そのままを正確に抽出したいときってありますよね？それを解決する方法を編み出しました。

方法は、「 **HTMLで再現させる** 」です！

本投稿の先頭の画像を添付して「**添付画像をHTMLで再現して**」と依頼した際の結果がこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/18674c51-6466-aee5-5782-d94dfcb327c3.png)

**感動！！！**

（注：右側が画像をもとに生成したHTMLを、プレビューした状態です。Claude.aiのArtifactsという機能です）

アイコンがちょっと違うとか省略されてるとかはありますが、文字列は完璧です。

追加で、「日本語に翻訳して」と依頼すると、レイアウトを維持したまま日本語になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/22880e8d-d164-ed91-cf5e-0bec9959f985.png)

わかりやすーい！（というか、そんな野蛮な例だったのね。。）

---

これができれば、英語のプレゼン資料とかもレイアウトを維持したまま日本語にできますね！

[AWS re:Invent 2024 - [NEW LAUNCH] Amazon Nova understanding models (AIM395-NEW)](https://www.youtube.com/watch?v=KEzL6VywPBQ)より

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/f94b3ac1-41a5-06a6-f842-108b67e3a8a2.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/4a49e254-01a8-1496-50aa-cdef5b81b79d.png)

（日本語にする前にレート制限が来てしまった。。課金するか悩む。。）
#0034（2024/02/03）SQL, psql, cqlsh の違い

# SQL, psql, cqlsh の違いについて


## SQL（Structured Query Language）

- **概要**  
  SQL は、リレーショナルデータベースの操作や管理を行うための標準的なクエリ言語です。  
  データの抽出、挿入、更新、削除、スキーマの定義など、あらゆるデータベース操作に用いられます。

- **特徴**  
  - ANSI/ISO によって標準化されている  
  - MySQL、PostgreSQL、Oracle、SQL Server、SQLite など、多くのリレーショナルデータベースで採用されている  
  - 基本的な構文は共通しているが、データベースごとに拡張や文法の差異が存在する

- **用途**  
  データベースに対するクエリの記述、データ操作（CRUD 操作）、データ定義（DDL）、データ制御（DCL）など

## psql

- **概要**  
  psql は、**PostgreSQL** 用の対話型コマンドラインツール（シェル）です。  
  PostgreSQL データベースに接続し、SQL コマンドを実行するための専用クライアントとして利用されます。

- **特徴**  
  - PostgreSQL に特化しており、PostgreSQL 固有の拡張機能やメタコマンド（例: `\d` でテーブル一覧の表示）が利用可能  
  - インタラクティブに SQL クエリの実行、スクリプトの実行、データベース管理ができる  
  - PostgreSQL の設定確認やデバッグ、管理作業に便利なツール

- **用途**  
  - PostgreSQL データベースへの接続と管理  
  - SQL クエリの実行および結果の確認  
  - データベーススキーマの確認や変更、システム管理作業

## cqlsh

- **概要**  
  cqlsh は、**Apache Cassandra** のための対話型コマンドラインシェルです。  
  Cassandra が採用するクエリ言語である CQL（Cassandra Query Language）を実行するために利用されます。

- **特徴**  
  - SQL に似た文法を持つ CQL を使用するが、Cassandra の分散アーキテクチャに合わせた設計となっている  
  - Apache Cassandra の特性（分散データベース、スケーラビリティ、可用性）に合わせたコマンドやオプションが用意されている  
  - インタラクティブシェルとして、データの操作、クラスターの状態確認、スクリプトの実行などが可能

- **用途**  
  - Apache Cassandra クラスターへの接続と管理  
  - CQL を用いたデータの取得、挿入、更新、削除  
  - キースペースやテーブルの定義、変更


## SQL, psql, cqlsh の比較

| 項目              | SQL                                    | psql                                   | cqlsh                                 |
|-------------------|----------------------------------------|----------------------------------------|---------------------------------------|
| **定義**          | リレーショナルデータベース操作の標準クエリ言語 | PostgreSQL 用の対話型コマンドラインツール | Apache Cassandra 用の対話型コマンドシェル  |
| **対象データベース** | 一般的なリレーショナルデータベース            | PostgreSQL                           | Apache Cassandra                      |
| **使用するクエリ言語** | SQL                                   | SQL（PostgreSQL の拡張を含む）           | CQL (Cassandra Query Language)         |
| **主な用途**      | データの抽出・操作・定義                  | PostgreSQL の管理、クエリ実行             | Cassandra の管理、CQL クエリ実行          |

---

## まとめ

- **SQL** は、リレーショナルデータベース全般で使用される共通のクエリ言語です。  
- **psql** は、PostgreSQL 専用の CLI ツールで、SQL を用いてデータベース管理やクエリの実行が行えます。  
- **cqlsh** は、Apache Cassandra 用の対話型シェルで、CQL を使用してデータ操作やクラスター管理を行います。

それぞれのツールや言語は、対象とするデータベースの種類や設計思想に基づいており、用途に応じて使い分けることが重要です。
#0033（2024/02/03）scpコマンドとrsyncコマンド

# scp コマンドと rsync コマンドの違い

ファイルの転送や同期を行う際に、Linux/Unix 系システムでは `scp` と `rsync` の2つのコマンドがよく利用されます。  
この記事では、それぞれの特徴や使い分けについて、わかりやすく解説します。

---

## 概要

- **scp (Secure Copy)**
  - SSH を利用した暗号化転送のための単純なファイルコピーコマンド
  - 一度の転送でファイルを丸ごとコピーするシンプルな仕組み

- **rsync (Remote Sync)**
  - 差分転送アルゴリズムを利用して、更新された部分のみを転送する効率的な同期ツール
  - ローカル間、リモート間、またはその両方でファイルやディレクトリの同期が可能

---

## 主な特徴と機能の違い

| 項目                  | scp                                      | rsync                                         |
|-----------------------|------------------------------------------|-----------------------------------------------|
| **転送方式**          | ファイル全体を転送                       | 差分転送（変更部分のみ）                       |
| **速度・効率**        | 転送するたびに全ファイルをコピーするため非効率的 | 更新された部分だけを転送するので高速かつ効率的    |
| **再開機能**          | 途中で中断した転送の再開機能は基本的になし      | 転送の途中で中断しても、再開が可能               |
| **圧縮**              | オプションで SSH 圧縮機能を利用可能          | 圧縮オプション（-z）により転送データ量を削減可能   |
| **用途**              | 単純なファイルコピー                      | バックアップや大規模なディレクトリ同期に最適      |
| **オプションの豊富さ** | オプションは比較的少ない                   | 多数のオプション（除外パターン指定、パーミッション維持など）が利用可能 |

---

## 詳細な解説

### scp コマンド

- **用途と使い方**
  - SSH プロトコルを利用して、リモートホストとの間で安全にファイルをコピーする。
  - シンプルな構文で使いやすく、以下のようなコマンドで利用する：
    ```bash
    scp local_file user@remote_host:/path/to/destination
    ```
- **メリット**
  - シンプルで直感的な操作が可能
  - SSH のセキュリティをそのまま利用できる

- **デメリット**
  - 毎回全ファイルを転送するため、大きなファイルや大量のファイルの場合は非効率
  - 中断後の再開がサポートされていない

### rsync コマンド

- **用途と使い方**
  - ローカルとリモート間、もしくはリモート同士でファイルやディレクトリの同期を行う。
  - 差分転送により、更新された部分だけを転送するため、転送量を大幅に削減できる。
  - 典型的な利用例：
    ```bash
    rsync -avz local_directory/ user@remote_host:/path/to/destination/
    ```
- **メリット**
  - 差分転送による高速・効率的な同期が可能
  - 途中で中断しても再開可能（`--partial` オプションなど）
  - 多彩なオプションにより、ファイルの権限や所有者情報、シンボリックリンクなども適切に同期できる

- **デメリット**
  - オプションが豊富なため、初めは使い方がやや複雑に感じることもある
  - シンプルな単一ファイルのコピーでは、scp と比べて若干オーバーヘッドがある可能性がある

---

## どちらを使うべきか？

- **単純なファイルコピーや少量のファイル転送**
  - シンプルさと手軽さを求める場合は `scp` が適しています。

- **大規模なディレクトリ同期や定期的なバックアップ**
  - 転送量を最小限に抑えたい、または中断後の再開機能が必要な場合は `rsync` が有利です。

---

## まとめ

- `scp` は、SSH を利用した**シンプルなファイルコピー**コマンドであり、手軽に安全な転送を実現します。
- `rsync` は、**差分転送**を利用して効率的にファイルやディレクトリの同期を行い、再開機能や圧縮機能など、より多機能なツールです。

用途や転送するファイルの規模、ネットワークの状態に応じて、適切なコマンドを選択することが重要です。
np.arrray（行列）を覚えやすく。

#一次元　dim はディメンションの意味
print(data.ndim)

#要素数は５つ
print(data.size)

#２つの次元に６つの要素を入れる。
#縦が行、横が列
data2 = np.array([[1, 2, 3], [4, 5, 6]])
print(data2)

#次元が２次元（２ディメンション）ということ。

data2.ndim

#要素数が６　ということ。
data2.size

#行（２）列（３）とわかる。
data2.shape

行はーーーー
列は串刺し

で覚える？？