OmniAICreator/Qiita-1.07M huggingface dataset:
FlashPrintをmacOS Sequoiaにインストールする方法

Flashforge製の3Dプリンターを使っている方にはお世話になっているFlashPrintですが、
最新のmacOS Sequoiaには対応していません。

しかし別PCの古いOSをアップデートしても、元々入っていたアプリは動作する謎な状況でした。


[![スクリーンショット 2025-01-22 4.44.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7132/54fea84f-10a3-33ab-060f-55c960c22f23.png)](https://after-support.flashforge.jp/flashprint/)

ちなみにFLASHFORGE JAPANはただの代理店で、配布バージョンも古いので公式を見にいくようにしましょう。
（公式v5.8.7に対してFLASHFORGE JAPANはv5.8.5）

https://flashforge.com/pages/software-flashprint

macOS Sequoiaだと **レガシーインストーラパッケージ** と表示されて先に進めません。
![スクリーンショット 2025-01-22 5.09.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7132/fa491bec-85c2-1b3b-b353-f18e0e2d3617.png)

インストールするには、.pkgファイルを右クリックして、**パッケージの内容を表示**で中身を開きます。
![スクリーンショット 2025-01-22 5.10.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7132/4b18065b-48f3-b9cd-defb-9e738492e263.png)

Contnts/**Archive.pax.gz** をダブルクリックで解凍します
![スクリーンショット 2025-01-22 5.11.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7132/1543a4a4-7c84-7590-ccfc-9075dbf333a2.png)

この場所ではそのまま開けないので、**FlashPrint 5.app** を適当なディレクトリー（アプリケーションとか）に移動させると開けます。

![スクリーンショット 2025-01-22 5.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7132/2ce707e7-d72a-cc93-3e81-97bffab35b0a.png)
Web素人がVueのtutorialをやってみる その4 (Step9/15 ～ Step11/15 まで)

# 概要
[前回](https://qiita.com/tak_y07/items/ebdb3925cc4143e09753)に引き続きVueのチュートリアルをやっていきます。

今回からVueCopilotにお越し頂いております。
ウラでちょこちょこ質問していますが本記事では出番無し...
![{AAC0FDBC-698C-4BBF-A89B-C27625036CA0}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759711/4c3f22e8-d4cb-6ae1-bd54-db8afb204e3a.png)


# Step9
ライフサイクルについて

### ライフサイクル
Vueコンポーネントが生成されてから描画されて破棄されるまでの一連の流れのこと。
[この図](https://ja.vuejs.org/guide/essentials/lifecycle)を見るに、create(作成), mount(描画), update(更新), unmount(破棄) の4つのステージがあって、それぞれに beforeXXX とXXX-ed の計8つの**ライフサイクルフック**というオプションがある。

ライフサイクルフックに関数を登録して自動で実行させることができる。

```Step9.Vue
<script>
export default {
  // ...
	mounted(){
    this.$refs.pElementRef.textContent = "Good Morning"
  }
}
</script>

<template>
  <p ref="pElementRef">Hello</p>
</template>
```

結果
templateの初期の文字列がmountedの内容で置き換わっている
![{0C34BDF8-7D55-4E33-91EA-BCB42479A6B0}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759711/65628cf1-6e83-5da0-93a8-8d9bcc086622.png)

上記コード内の`$refs`については[ここ](https://kyoblogs.com/vue%E3%81%AErefs%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%82%92%E8%AA%AC%E6%98%8E%E3%81%99%E3%82%8B/)が参考になった。

# Step10
ウォッチャー（watchオプション）について

プロパティの変更に伴って処理を実行させる仕組み。これだけ聞くとComputedとの違いが分からなかったが[ここ](https://bayashi.net/wiki/vue-vuejs/vue-new-vue-instance-computed-methods-watch)の説明が腑に落ちた。

GPTにも聞いてみた回答は以下。
| 特徴                  | `computed`                                            | `watch`                                                |
|-----------------------|-------------------------------------------------------|-------------------------------------------------------|
| **主な目的**          | 新しい値をリアクティブに計算（派生データの生成）。      | 特定のデータの変更を監視して副作用（処理）を実行。      |
| **キャッシュ**         | **キャッシュされる**（依存するデータが変わるときのみ再計算）。 | キャッシュされない（データが変更されるたびに実行）。   |
| **主な用途**          | - 他のデータに基づいて新しい値を計算する場合。           | - データ変化時の非同期処理や手動処理。                 |
| **コードの実行タイミング** | 必要なときのみ（遅延実行）。                             | 即座に実行（リアルタイム監視）。                       |
| **値をリターン** | **する** | **しない** |

```watch構文例.js
  watch: {
    // 関数名を監視対象のプロパティ名と同じにする
    // 第一引数に変更後の値を, 第二引数に変更前の値を受け取る
    propertyName(newValue, oldValue) {
      console.log(`new value is: ${newValue}`)
    }
  }
```

# Step11
コンポーネントのインポートについて

コンポーネント = 単体のVueファイル。
import文で別コンポーネントをインポートして、componentsオプションに登録するとインポート先の値を参照できるようになる。

```main.vue
<script>
// ChildCompは'./ChildComp.vue'のエイリアス
// Python脳なので子コンポーネントの中を見て「どこまでインポートするの？」と面食らった
// JSも勉強しましょう
import ChildComp from './ChildComp.vue'
export default {
  components: {
		ChildComp
	}
}
</script>

<template>
  <ChildComp/>
</template>
```

```ChildComp.vue
<template>
  <h2>A Child Component!</h2>
</template>
```

結果
![{B2F634B0-DF50-4779-813C-1CA9528BD2F1}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759711/6e36fd49-3f84-75ff-a366-65281113f488.png)

# 続く
次回で完了の見込みです。
JSの勉強も並行しているので時間がかかりましたが、どうにか完了できそう。
GoogleMeetの議事録作成がラクになる！文字起こし＆議事録作成

:::note warn
2025/5/9現在、GoogleMeetに搭載のGeminiで文字起こしできるようになりました。
ここで紹介のサービスを使わずとも必要な情報が取得できます。
不便だった過去こんな回避をしていたんだという程度でご覧ください。
:::


ちょっと、使ってみていいなと思ったので記事にします。
他にも類似サービスあるので、こんなことができるようになったんだなと感じてもらえれば幸いです。

GoogleMeetを活用する機会は、完全に定着していると思います。
最近、GoogleMeetで待望の日本語文字起こし機能が使えるようになりました。（私が知らなかっただけで、前からかも...）

今回は、この機能を最大限活用できるChrome拡張機能「meetXcc」をご紹介します。


https://www.meetxcc.com/ja/jp/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/8350d228-2056-6bdc-d02f-156523bc9b49.png)


この拡張機能を導入するだけで、会議の文字起こしから議事録作成までの工程が大幅に効率化できます。

## meetXccの主な特徴

- GoogleMeetの日本語文字起こしを活用
- Chrome拡張機能で簡単導入
- 月10回まで無料で利用可能
- マインドマップや会議中のサマリー表示も可能

## 文字起こしの例

取得できる文字起こしデータ

```
(10:15 AM) yamada.t: では、第2四半期の営業報告会議を始めたいと思います。
まず、佐藤さんから東日本エリアの状況を報告お願いします。

(10:16 AM) sato.k: はい、承知しました。
東日本エリアの第2四半期の実績について報告させていただきます。
売上は前年比108%と好調で、特に新規開拓案件が順調に進んでいます。

(10:17 AM) tanaka.m: すみません、質問してもよろしいでしょうか。
新規開拓は具体的にどのような施策が効果的だったのでしょうか。

(10:17 AM) sato.k: はい、主に2つあります。
1つ目は、オンライン商談の強化です。移動時間を削減できたことで、
商談件数を1.5倍に増やすことができました。
2つ目は、既存顧客からの紹介プログラムの整備です。

(10:18 AM) yamada.t: なるほど、良い取り組みですね。
この紹介プログラムは他のエリアでも展開できそうですか？

(10:18 AM) sato.k: はい、実際の運用方法やインセンティブの設計について
資料にまとめていますので、共有させていただきます。

(10:19 AM) suzuki.h: 大変参考になりました。
西日本エリアでも類似の課題を抱えていたので、
ぜひ展開を検討したいと思います。
```

これをインプットにClaudeで議事録を作成すると

```md
# 議事録：第2四半期営業報告会議

## 基本情報
- 開催日時：2025/01/22 10:15-10:19
- 参加者：山田T（議長）、佐藤K、田中M、鈴木H
- 所要時間：4分

## アジェンダ一覧
1. 東日本エリアの営業実績報告 (10:15-10:19)
   - 主な発言者：佐藤K
   - 議論の要点：売上実績、新規開拓施策の成功事例

## 議題：東日本エリアの営業実績報告
検出時刻：10:15
議論時間：4分

### 議論の発端
- 山田Tより、第2四半期の営業報告会議の一環として、東日本エリアの状況報告が要請された

### 主な議論内容
- 佐藤Kの報告
  - 売上実績：前年比108%
  - 新規開拓案件が好調
  - 成功要因：
    1. オンライン商談の強化（商談件数1.5倍増）
    2. 既存顧客からの紹介プログラムの整備

- 田中Mの質問
  - 新規開拓における具体的な効果的施策について確認

- 鈴木Hのコメント
  - 西日本エリアでも類似の課題があり、施策展開を検討したい意向

### 決定事項
- 決定内容：東日本エリアの紹介プログラムを他エリアへ展開検討
- 決定理由：西日本エリアでも類似の課題があり、すでに効果が実証されている
- 考慮された選択肢：特になし（成功事例としての採用）

### 次のアクション
- [ ] 紹介プログラムの展開検討資料の共有
  - 担当者：佐藤K
  - 期限：未定
  - 目的：他エリアでの展開検討のため、運用方法とインセンティブ設計の詳細を共有

### 補足情報
- 営業施策の効果：
  - オンライン商談による移動時間削減
  - 紹介プログラムの体系化
- 他エリアへの展開可能性が確認された
```

## 効果的な活用方法

### 1. 基本的な文字起こし
拡張機能を導入後、会議を開始するだけで自動的に文字起こしが始まります。日本語対応により精度が大幅に向上し、より正確な議事録作成が可能になりました。

### 2. 生成AIとの連携で更なる効率化
文字起こしデータを生成AI（ChatGPTなど）に入力することで、より整理された議事録を作成できます：
- 要点の効率的な整理
- 議題ごとの分類
- アクションアイテムの抽出

### 3. 無料枠の効果的な活用法
月10回の無料枠を最大限活用するためのポイント：
- 重要度の高い会議への優先的な活用
- 類似サービスとの併用
- 短時間会議での効率的な利用

## 注意点
データをサーバーへ送信する仕様のため、社内のセキュリティポリシーや規約との適合性を事前に確認することをお勧めします。

## まとめ
GoogleMeetの日本語文字起こし対応により、meetXccの実用性が格段に向上しました。月10回の無料枠でも十分な活用が可能です。まずは試験的に導入して、業務効率化にお役立てください。
Apriltagと工事写真

# Apriltagを使用した画像編集自動化スクリプト

この記事では、Pythonを使用してApriltagを検出し、画像を自動編集するスクリプトを解説します。主に**PIL**、**pandas**、**pupil_apriltags**ライブラリを活用しており、建築現場での写真管理の効率化に役立つ内容です。あらかじめapriltagと対応する写真をリストにしておいて写真内にapriltagを検出したら対応する工事看板を挿入するだけです。

## スクリプト概要

このスクリプトは以下の流れで処理を行います：

1. 画像フォルダの選択
2. 物件名の取得
3. Apriltagの検出
4. 対応する画像の貼り付け
5. 編集済み画像の保存

## 必要なライブラリ

以下のライブラリを使用しています。事前にインストールしてください。

```bash
pip install pillow numpy pandas pupil_apriltags
```

## コード解説

### 1. 画像フォルダの選択

```python
import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()
initial_dir = r"Z:\(06)photo"
directory = filedialog.askdirectory(title="Select Image Folder", initialdir=initial_dir)
root.destroy()
print("選択されたフォルダ:", directory)
```

`tkinter`を使用してGUIでフォルダを選択します。

### 2. 物件名の取得

```python
bukken_name = ""
current_dir = directory
while True:
    parent_dir = os.path.dirname(current_dir)
    if parent_dir == current_dir:
        break
    folder_name = os.path.basename(current_dir)
    if "　" in folder_name:
        bukken_name = folder_name.split("　")[0]
        break
    current_dir = parent_dir
bukken_name += "様邸"
print("物件名:", bukken_name)
```

フォルダ構造から物件名を抽出します。

### 3. Apriltagの検出

```python
from pupil_apriltags import Detector

detector = Detector(families='tag36h11')

for image_file in image_files:
    img_pil = Image.open(os.path.join(directory, image_file))
    img_np = np.array(img_pil)
    gray = Image.fromarray(np.uint8(img_np)).convert('L')
    gray_np = np.array(gray)
    detections = detector.detect(gray_np)
```

`pupil_apriltags`を使用してApriltagを検出します。

### 4. 対応する画像の貼り付け

```python
for detection in detections:
    for n in range(len(id_list)):
        if str(id_list[n]) == str(detection.tag_id):
            sc_image_path = os.path.join(sc_directory, f"{sc_image_file_list[n]}.jpg")
            break

    if os.path.exists(sc_image_path):
        sc_img = Image.open(sc_image_path)
        # 画像編集処理（リサイズ、テキスト追加など）
        img_pil.paste(sc_img_resized, paste_position)
```

検出されたIDに対応する画像を貼り付けます。

### 5. 編集済み画像の保存

```python
output_path = os.path.join(output_directory, f"edited_{image_file}")
img_pil.save(output_path)
```

編集済みの画像を保存します。

## 使用例

1. スクリプトを実行します。
2. 画像フォルダを選択します。
3. 処理が完了すると、編集済み画像が`kokuban`フォルダに保存されます。

## 注意点

- Apriltagが検出できなかった画像は`failed_images.txt`に記録されます。
- フォルダ構造や画像ファイル名の規則に依存している部分があるため、環境に合わせて調整が必要な場合があります。

この記事が役立った場合は「LGTM」をお願いします！ 😊
１０日目一旦のchroma-dbアプリ完成



# ChromaDBとStreamlitで作るドキュメント管理システム

## はじめに
ChromaDBを使用してMarkdownファイルを管理し、Streamlitで簡単に操作できるUIを提供するシステムを作成しました。FastAPIをバックエンドに使用し、効率的なドキュメント管理を実現します。

## 環境
- Python 3.9
- ChromaDB 0.6.0
- FastAPI
- Streamlit
- その他の依存関係は`requirements.txt`に記載

## ディレクトリ構成
```
chroma-test-project/
├── data/
│   └── chroma_db/          # ChromaDBのデータ保存ディレクトリ
│       ├── chroma.sqlite3  # メタデータ保存用SQLite
│       └── {collection_id}/# 各コレクションのデータ
│           ├── data_level0.bin
│           ├── header.bin
│           ├── length.bin
│           └── link_lists.bin
├── src/
│   ├── api/                # バックエンド
│   │   └── app.py         # FastAPI アプリケーション
│   └── ui/                 # フロントエンド
│       └── streamlit_app.py# Streamlit UI
└── requirements.txt        # 依存パッケージ
```

## 主な機能
1. コレクション管理
   - コレクション一覧表示
   - コレクションの削除（確認ダイアログ付き）

2. ドキュメント管理
   - Markdownファイルのアップロード（複数ファイル対応）
   - ドキュメントの検索
   - ページネーション付き一覧表示
   - CSVエクスポート

3. システム情報
   - APIサーバーの状態表示
   - 接続情報の表示

## 実装で苦労したポイント

### 1. ChromaDBのバージョン対応
- v0.6.0での仕様変更への対応
- コレクション操作のAPIの変更
- エラーハンドリングの改善

### 2. Streamlitの状態管理
- 削除確認ダイアログの実装
- セッション状態の適切な管理
- ページのリロードタイミング

### 3. ファイル処理
- 複数ファイルのアップロード処理
- エンコーディング対応
- メタデータの適切な管理

### 4. エラーハンドリング
- FastAPI側でのエラー捕捉
- Streamlit側でのエラー表示
- ユーザーフレンドリーなメッセージ

## 学んだこと

### 1. アーキテクチャ設計
- バックエンド（FastAPI）とフロントエンド（Streamlit）の分離
- データ永続化（ChromaDB）の適切な設計
- ディレクトリ構造の重要性

### 2. ChromaDBの特性
- コレクション名の制約（英数字のみ）
- データの永続化の仕組み
- 埋め込みベクトルの扱い

### 3. Streamlitのベストプラクティス
- セッション状態の効果的な使用
- UIコンポーネントの適切な配置
- ユーザー体験の向上テクニック

### 4. エラー処理の重要性
- 適切なエラーメッセージの設計
- エラーの階層的な処理
- ユーザーへのフィードバック

## 使い方

1. 環境のセットアップ
```bash
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate
pip install -r requirements.txt
```

2. サーバーの起動
```bash
# FastAPIサーバー（ローカルホストのみ）
uvicorn src.api.app:app --reload --host localhost

# Streamlit UI（別ターミナルで）
streamlit run src/ui/streamlit_app.py --server.address localhost
```

## 今後の改善点
1. 認証機能の追加
2. ドキュメントのバージョン管理
3. より高度な検索機能
4. バッチ処理の最適化
5. UIのカスタマイズ機能

## まとめ
ChromaDBとStreamlitを組み合わせることで、使いやすいドキュメント管理システムを構築できました。特にStreamlitの柔軟なUI構築能力とChromaDBの効率的なデータ管理機能の組み合わせが効果的でした。

## 参考資料
- [ChromaDB公式ドキュメント](https://docs.trychroma.com/)
- [Streamlit公式ドキュメント](https://docs.streamlit.io/)
- [FastAPI公式ドキュメント](https://fastapi.tiangolo.com/)
Amazon SageMaker Studio のコードエディタの使い方

Amazon SageMaker Studio のコードエディタは、機械学習の開発を効率的に行うための強力な統合開発環境 (IDE) です。SageMaker Studio は、データの前処理、モデルの訓練、デバッグ、デプロイなど、機械学習のすべてのワークフローをサポートします。コードエディタはその中核的な部分で、Python や R、Jupyter ノートブックなど、さまざまな言語やツールを使った開発をサポートします。

ここでは、SageMaker Studio のコードエディタを使うための基本的な手順と主要な機能について説明します。

### 1. SageMaker Studio にアクセスする
まず、AWS マネジメントコンソールから SageMaker Studio にアクセスする必要があります。もしまだ SageMaker Studio がセットアップされていない場合は、セットアップガイドに従ってインスタンスを作成してください。

### 2. 新しいエディタを開く
SageMaker Studio にログイン後、以下の手順でコードエディタを開きます。

1. **左側のナビゲーションパネル** から「Studio」を選択します。
2. エディタに直接移動するには、「File」メニューから「New File」を選択したり、左上の「+」アイコンをクリックして新しいファイルを作成します。
3. 必要に応じて、エディタの上部にある **タブバー** から開いたファイルを切り替えたり、複数のファイルを同時に表示したりできます。

### 3. コードエディタの基本的な機能

SageMaker Studio のコードエディタは、一般的なエディタ機能に加えて、機械学習の開発に特化した便利な機能を提供します。

#### 1. **シンタックスハイライト**
Python、R、SQL、YAML など、さまざまなプログラミング言語に対応しており、コードの構文が色分けされることで視認性が向上します。

#### 2. **インテリセンス (コード補完)**
コード補完機能があり、変数名や関数名の入力時に候補が表示されます。これにより、コードの記述が効率的に行えます。

#### 3. **コードの自動インデント**
Python や他の言語では、インデントが重要です。エディタは自動的にインデントを調整し、コードが適切に整形されるようにサポートします。

#### 4. **エラーチェックとリンティング**
コードにエラーがある場合、エディタ内で警告やエラーメッセージが表示されます。これはコードのデバッグを迅速に行うために非常に便利です。例えば、Python では `pylint` や `flake8` を使用してコードの品質をチェックできます。

#### 5. **ファイルナビゲーション**
エディタには、プロジェクト内のファイルを簡単にナビゲートできる **ファイルエクスプローラー** が組み込まれています。左側のペインに表示されるファイルツリーから、目的のファイルを素早く見つけて開くことができます。

#### 6. **バージョン管理 (Git)**
Git を使用してバージョン管理ができます。エディタ内からリポジトリをクローンしたり、変更をコミットしたりすることができます。また、GitHub や GitLab との統合も可能です。

### 4. ノートブックの使用

SageMaker Studio では、Jupyter ノートブックを使ってインタラクティブにコードを実行することができます。ノートブックはデータの分析やモデルのトレーニングに非常に便利です。

- ノートブックを作成するには、エディタ内で「New Notebook」を選択します。
- ノートブックのセルにコードを書き、実行して結果を確認できます。
- ノートブックの結果（例えば、グラフやテーブル）をすぐに確認できるため、データ分析やモデルの評価に非常に便利です。

### 5. ターミナルの利用

SageMaker Studio では、エディタ内にターミナルを開いて、コマンドラインで操作を行うことができます。これにより、必要なパッケージのインストールやシステム設定の確認など、通常の開発環境と同じように作業ができます。

- 新しいターミナルを開くには、エディタ内の「Terminal」メニューから「New Terminal」を選択します。

### 6. カスタマイズと拡張機能

SageMaker Studio のエディタには、多くの拡張機能が組み込まれており、さらにカスタマイズできます。

- **拡張機能のインストール**: エディタの「Extensions」メニューから拡張機能をインストールできます。例えば、Jupyter ノートブックを強化するための追加機能や、コード品質を保つためのツールが利用可能です。
- **テーマの変更**: エディタの外観を変更したい場合は、設定からテーマを変更できます。暗いテーマや明るいテーマが選べます。

### 7. データサイエンスと機械学習のツール統合

SageMaker Studio は、機械学習の開発に特化したツールとの統合が進んでいます。以下のツールをコードエディタ内で直接利用できます。

- **SageMaker Studio Notebooks**: データ分析やモデル学習に最適な Jupyter ノートブックが統合されています。
- **SageMaker Experiments**: 実験の追跡と管理ができます。コードエディタ内で直接実験を開始し、結果を確認することができます。
- **SageMaker Debugger**: モデル訓練中のデバッグ情報を表示することができます。
- **SageMaker Model Registry**: トレーニングしたモデルのバージョン管理やデプロイが可能です。

### 8. コードエディタでのデバッグ

SageMaker Studio には、デバッグツールが組み込まれています。コードエディタ内でブレークポイントを設定して、実行時のデータや状態を確認することができます。

- **Python Debugger (pdb)** を使用して、ステップ実行や変数の監視を行うことができます。
- エディタ内で直接デバッグを行い、エラーの原因を素早く特定できます。

### 9. 統合された AWS リソースへのアクセス

SageMaker Studio は AWS サービスと密接に統合されているため、データやモデルの保存、S3 バケットへのアクセス、SageMaker のインスタンスやエンドポイントへのデプロイがシームレスに行えます。コードエディタ内から直接これらのリソースを操作できます。

### まとめ

Amazon SageMaker Studio のコードエディタは、機械学習の開発を効率化するために必要なツールと機能が豊富に揃っています。コード補完、エラーチェック、Git の統合など、一般的な開発環境と同様の使い勝手を提供し、さらに機械学習に特化した機能を組み込むことで、データ分析からモデル訓練、デプロイまでの一貫したワークフローをサポートします。

SageMaker Studio を最大限に活用するためには、これらの機能を理解し、プロジェクトに最適な方法で組み合わせることが重要です。
Databricksの予測的最適化システムテーブルの活用

こちらの機能の存在を知っていましたが、きちんとマニュアル読んでいませんでした。

https://docs.databricks.com/ja/optimizations/predictive-optimization.html

> 予測的最適化(Predictive Optimization)により、Unity Catalog マネージドテーブルのメンテナンスオペレーションを手動で管理する必要がなくなります。

`OPTIMIZE`、`VACUUM`、`ANALYZE`オペレーションのメリットがあるテーブルを特定し、自動でオペレーションを特定する機能です。

注意点として、自動でオペレーションが実行するので課金(DBU: Databricks Units)が発生します。当然、これらは監視すべき事項となります。その助けとなるのが[予測的最適化システムテーブル](https://docs.databricks.com/ja/admin/system-tables/predictive-optimization.html)となります。[クエリのサンプル](https://docs.databricks.com/ja/admin/system-tables/predictive-optimization.html#example-queries)があるので、実行してみます。

# 過去30日間に予測的最適化によって使用された推定DBU

**推定DBU**となっているのは、[こちら](https://docs.databricks.com/ja/admin/system-tables/predictive-optimization.html#delivery-considerations)に記載があるように、複数オペレーションの比率が概算であることによります。消費DBU自体は正確なものとなります。

```sql
SELECT SUM(usage_quantity)
FROM system.storage.predictive_optimization_operations_history
WHERE
     usage_unit = "ESTIMATED_DBU"
     AND  timestampdiff(day, start_time, Now()) < 30
```
![Screenshot 2025-01-22 at 9.17.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/55ba4ef1-2b54-d24e-c4a5-5fa96cfdd663.png)

# 過去30日間で予測的最適化による費用が最も多いテーブル

```sql
SELECT
     metastore_name,
     catalog_name,
     schema_name,
     table_name,
     SUM(usage_quantity) as totalDbus
FROM system.storage.predictive_optimization_operations_history
WHERE
    usage_unit = "ESTIMATED_DBU"
    AND timestampdiff(day, start_time, Now()) < 30
GROUP BY ALL
ORDER BY totalDbus DESC
```

予測的最適化によるコストがテーブルごとに表示されます。

![Screenshot 2025-01-22 at 9.19.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6779b2aa-d3cb-00f9-a3f7-76b48fabf313.png)

# 予測的最適化のオペレーションが最も多いテーブル

```sql
SELECT
     metastore_name,
     catalog_name,
     schema_name,
     table_name,
     operation_type,
     COUNT(DISTINCT operation_id) as operations
FROM system.storage.predictive_optimization_operations_history
GROUP BY ALL
ORDER BY operations DESC
```

テーブルごと、オペレーションごとの回数が表示されます。

![Screenshot 2025-01-22 at 9.20.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4a99b7b6-581c-1315-af0e-72d814f6d832.png)

# 予測的最適化オペレーションの成功率

```sql
WITH operation_counts AS (
     SELECT
           COUNT(DISTINCT (CASE WHEN operation_status = "SUCCESSFUL" THEN operation_id END)) as successes,
           COUNT(DISTINCT operation_id) as total_operations
    FROM system.storage.predictive_optimization_operations_history
 )
SELECT round(successes / total_operations * 100, 1) || "%" as success_rate
FROM operation_counts
```
![Screenshot 2025-01-22 at 9.22.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/73eb99e6-2242-2d34-da17-579b129be4fa.png)

# ダッシュボードの作成

これらのデータをまとめることで、予測的最適化オペレーションの概要を把握することができます。

![Screenshot 2025-01-22 at 9.23.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6fd2428a-c6ac-7b43-5d2b-90e10ff69b89.png)

ご活用ください

### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
PDM・PLMシステムあれこれ

## PDMとPLMの違い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/413d0e64-25da-46b4-81d1-52b559b34f8e.png)

## PDMの基本機能
### オブジェクト管理
情報をオブジェクトで管理する。
(右のデータイメージの1つ1つの要素がオブジェクトと考える)

### バージョン管理
データの最新情報、変更履歴(バージョン)を管理する。

### 状態管理
データの状態(ステータス)を管理する。

### 構成管理
データ同士の構成情報)をコントロールする。
いわゆるBOM(Bill Of Materials、部品表)と呼ばれるもので、
BOMに関連させる形で様々なデータを管理する。

### 変更管理
データ変更時のプロセスをコントロールする。

### アクセス管理
データへのアクセス権をコントロールする。

**【データイメージ】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15241/a64ccf3d-4479-4d66-9b0e-0a72a5aa3f8c.png)


## 用語
### IGES(アイジェス)
異なるCADシステム間で汎用的にデータを扱うことができるファイル形式のことである。
CAD/CAMの導入時には、サポートしているかどうかが選定基準になることがある。

### stp(ステップ)
IGESと同じ役割。CADファイルの中間データ。

### マルチCAD
社内だけでも、１つのCADを使っているということは少ない。
平均2.7種類のCADを使っているらしい。
複数のCADに対応できることを言う。
ServiceNow＞テーブル（リスト画面）の操作（小ネタ）

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# 目的
- リスト画面のソートの仕方を学ぶ
    - 任意のフィールドの値でソートする
    - 完全一致ではないワードでソートする
    - 設定したソートを取りやめる

# 操作方法
### 任意のフィールドの値でソートする
- 任意のフィールドでソートしたい値を右クリック＞Show Matchingを押下
- ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/54a4e8de-631f-001f-d7e2-122050827668.png)

### 部分一致ではないワードでソートする
- ※部分一致と完全一致とは
    - 検索条件: "cat"
        - "cat" → 一致（完全一致）
        - "category" → 一致（部分一致）
        - "dog" → 不一致
- 虫眼鏡ボタンを押下してフィールド値の下に検索ボックスを出す
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/9c765cd1-22f5-3d3a-3499-aec9cf1fc591.png)
- 前提：通常のワードで検索すると完全一致で検索される
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/3acf7c55-166f-5ad5-fd5d-4013a783d856.png)

- 部分一致で検索したい場合は、検索ワードの先頭に「*」を入力
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/25c062cb-a6c3-862f-193a-1628d84125fc.png)

### 設定したソートを取りやめる
- フィルター右のAllと記載されているテキストをクリック
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/68617474-cfd4-7042-5cbf-ac9a7f5b6929.png)
Python3における機械学習入門

こんにちは、齋藤です。
今回はPythonを用いて機械学習を行うための基礎となるライブラリに関して簡単に紹介したいと思います。

## 1. Pythonの環境構築
機械学習を始める前に、Pythonの環境を構築しましょう。
最初に、次のようなツールを使用するのが便利です。

- **Anaconda**: 簡単にPythonのディストリビューションを構築できる環境。
- **pip**: さまざまなライブラリを簡単にインストールできるパッケージ管理ツール。

```bash
# Pythonとpipのインストール
$ sudo apt-get install python3 python3-pip

# 必要なライブラリのインストール
$ pip3 install numpy pandas matplotlib scikit-learn
```

## 2. Pythonで使用する主要ライブラリ
Pythonには、機械学習に有用な多くのライブラリが揃っています。ここでは、使用量が多い主要なものを紹介します。

### 2.1 NumPy
NumPyは、数値計算やマトリクス操作を支援するライブラリです。メモリ入りの計算やベクトル操作に有用です。

#### NumPyで出来ること
- 高速な数値計算
- ベクトル操作
- 行列操作
- 線形代数計算

```python
import numpy as np

# 一線陣列の作成
array = np.array([1, 2, 3, 4])
print(array)
```

### 2.2 Pandas
Pandasは、数学的なデータを処理するためのライブラリです。特にデータフレームやCSVファイルの読み込みに便利です。

#### Pandasで出来ること
- CSVファイルの読み込みや書き出し
- データのクリーニングや修正
- データの分析や結合
- 行列やテーブル操作

```python
import pandas as pd

# CSVファイルの読み込み
data = pd.read_csv('data.csv')
print(data.head())
```

### 2.3 Matplotlib
Matplotlibは、データをプロットするためのライブラリです。固定のグラフの作成が可能です。

#### Matplotlibで出来ること
- グラフの描画
- ヒストグラムや散布図の作成
- データのプロット

```python
import matplotlib.pyplot as plt

# グラフ描画
plt.plot([1, 2, 3, 4], [10, 20, 25, 30])
plt.show()
```

### 2.4 Scikit-learn
Scikit-learnは、機械学習の主要な機能を揃えたライブラリです。回帰分析や分類、クラスタリングなどの構造が実装されています。

#### Scikit-learnで出来ること
- 回帰分析
- 分類モデルの構築
- クラスタリング
- データの分割や比較

```python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# データセットの読み込み
iris = load_iris()
X, y = iris.data, iris.target

# データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# モデルの構築
model = RandomForestClassifier()
model.fit(X_train, y_train)

# 予測結果
predictions = model.predict(X_test)
print(predictions)
```


## 3. おわりに
Python3における機械学習は、複雑な設定や知識が必要な場合もあります。
ただ、簡単なものであればこの記事に記載のあるライブラリ等を使用すれば簡単に触れることができます。
自分のやりたいことに適したライブラリを使用して、機械学習に触れてみましょう。
IBM i でGitコード管理：02:ローカルリポジトリの作成と操作

[01:Gitの基礎](https://qiita.com/gomAnomalocaris/items/5e81ec559926bd7c1c0d)の続きです。

Gitロカールリポジトリーの作成から基本操作について

## Git ロカールリポジトリを作成する
以下のコマンドを実行するとそのディレクトリーにGitのローカルリポジトリーが作成されます。
```
git init
```

確認してみます。
まず、素のディレクトリーを作ります。
```
md git_goma
```
状態は、、このようにフォルダーは空です。（隠しファイル表示オンにしています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d5b46516-ccb2-14d5-871e-24670c4c09ec.png)

次にGit ローカルリポジトリーを作成
```
git init
```

Initialized empty Git repository in D:/git_goma/.git/　というメッセージが出て、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/45b92d57-666f-fde4-568d-d7ec876f5447.png)

※おっとここで、Gitクライアントでなくwindowsコマンドプロンプトだったことが判明(^^;問題なさそうなのでこのまま続けます。
ディレクトリーに **隠しフォルダー .git が作成されます**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/2ab738fd-5e81-190a-7cfa-87d5aa38929f.png)

.gitフォルダーの中は・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/55cd073c-e311-d9c5-c3bd-4c0f34a2f91a.png)

このフォルダー（＝Gitのワークツリーと同義（？））にファイルを置くとGit管理下に置かれる。直後はuntrackedのステータスになる。

ファイルごとのステータスは、
```
git status
```
で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d8136ccb-2ab8-a39b-5092-166990aa5933.png)
上記で作成したファイルが Untrackedなのが分かります。

※書き方記事は参考の章に記載しました。


***Gitクライアントで見ると、フォルダーが (maser)と表示されます。***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/f440ef4d-cf7f-3b10-02eb-290f106f7823.png)


***Git管理にしたくないファイルがある場合、.gitignore ファイルを作成しファイル名を記述する。***

※書き方記事は参考の章に記載しました。

## すてきな記事たち

下記記事を参考にさせていただいてます。感謝♪

[[Git] .gitignoreの仕様詳解](https://qiita.com/anqooqie/items/110957797b3d5280c44f)
Git 2.18頃の記事のようですが基本はあまり変わっていないでしょう・・

[Gitで現在の状態や変更箇所を確認する方法（diff,log）＋.gitignoreについて](https://qiita.com/eric50905/items/4a0cd49d79e45a6bff34)

## 

・・・続く
動画や配信などで著作物の音楽等を検知するAIについて調べてみた

こんにちは、齋藤です。
YouTubeやTwitchといったプラットフォームでは、動画や配信内で使用される音楽の著作権を保護するために、AIを活用した音楽検知技術が広く使われています。
この記事では、その仕組みや技術的な背景について調べたことを書いてみます。

## 音楽著作物検知の目的

音楽著作物を検知する主な目的は以下のようなものがあげられます。

1. **著作権保護**：クリエイターや音楽権利者の利益を守る
2. **収益分配**：広告収益を正確に権利者に分配
3. **プラットフォームの法的リスク軽減**：違法使用による法的トラブルを回避


## 技術的背景

音楽著作物を検知するAIの背後には、以下のような技術が活用されています。

### 1. 音響指紋（Acoustic Fingerprinting）

音響指紋は、音楽や音声データを特徴的なパターンに変換して、それをデータベースと照合する技術です。この技術は、次のような動作が存在します

1. **音声データの特徴抽出**：
   音声を短いフレームに分割し、周波数成分や時間情報を分析。これにはFFT（高速フーリエ変換）やスペクトログラムなどが使用されます。

2. **ハッシュ化**：
   抽出された特徴をデータベース内のエントリと比較可能なユニークなハッシュ値に変換します。

3. **データベース照合**：
   プラットフォームが保有する膨大な音楽データベースと照らし合わせて一致するパターンを検索します。

代表的な例として、Shazam※1で使用されている技術が挙げられます。
※1 Shazam(シャザム)は、Appleが保有するアプリケーションソフトウェア

### 2. 機械学習とディープラーニング

近年では、音響指紋技術に加え、機械学習やディープラーニングが用いられています。
特に、以下のようなモデルが活用されています

- **畳み込みニューラルネットワーク（CNN）**：
  音声スペクトログラムからパターンを学習し、特定の音楽の特徴を識別します。

- **リカレントニューラルネットワーク（RNN）やLSTM**：
  音楽の時間的な依存関係を解析するために使用されます。

これらのモデルは、音楽のテンポ、メロディー、ハーモニーなどの要素を高精度で分析することができます。

### 3. クラウドコンピューティング

YouTubeやTwitchのような大規模プラットフォームでは、毎日膨大な量のコンテンツがアップロードされています。これをリアルタイムで分析するために、クラウドコンピューティングが利用されています。

- **ストリーミング分析**：リアルタイムで配信データを処理する。
- **分散コンピューティング**：データの並列処理を行い、高速な照合を実現する。

Google CloudやAWS、Microsoft Azureなどがこの分野でよく使用されます。



## 実際の仕組み：YouTube Content ID

YouTubeでは、特に**Content ID**と呼ばれるシステムがこの技術を支えています。

1. **音楽権利者がデータベースに楽曲を登録**：
   音楽レーベルや権利者が自分の楽曲の音響指紋を登録します。

2. **動画の音声をスキャン**：
   アップロードされた動画の音声部分をContent IDシステムが解析し、音響指紋を生成します。

3. **一致判定**：
   音響指紋がデータベース内の楽曲と一致する場合、その情報に基づき以下のアクションが取られます：
   - 動画の収益化をブロックまたは制限。
   - 広告収益を権利者に分配。
   - 著作権侵害の警告を発行。

## Twitchの取り組み

Twitchでは、特にライブストリーミング中の音楽検知が課題となっています。Twitchは以下のような方法で音楽検知を行っています：

1. **Audible Magicとの連携**：
   TwitchはAudible Magicという音楽認識技術を採用して、配信中に流れる音楽を特定しています。

2. **クリップ削除**：
   違法に使用された音楽が含まれる配信クリップを自動的に削除する仕組みを導入しています。

3. **DMCA対応**：
   DMCA（デジタルミレニアム著作権法）に基づき、著作権者からの申し立てに対応しています。


## 音楽検知技術の課題

音楽検知技術は非常に高度ですが、以下のような課題も存在します：

1. **誤検知のリスク**：
   バックグラウンドノイズや類似した音楽による誤検知。

2. **リアルタイム処理の負荷**：
   ライブ配信中の高精度な検知には、膨大な計算リソースが必要です。

3. **権利者の未登録楽曲**：
   データベースに登録されていない楽曲は検知できません。

4. **国際的な著作権の違い**：
   各国の著作権法に対応する仕組みの複雑さ。


## まとめ

YouTubeやTwitchで使用される音楽著作物検知のAI技術は、音響指紋やディープラーニングなどの高度な技術に支えられています。これらの技術により、クリエイターや権利者の利益が守られる一方で、誤検知やリアルタイム処理の負荷といった課題も存在します。

## 参考
YouTube Content IDに関する公式ドキュメント
https://support.google.com/youtube/answer/2797370

Shazamの音響指紋技術に関する論文

Audible Magicの公式サイト
https://www.audiblemagic.com/
Excel VBAのあれこれ

### VBAマクロの互換性チェック
Microsoft Office Code Compatibility Inspectorというツールで調べられる

### プロシージャを呼び出すときに()をつけるかどうか
その命令(プロシージャ)が何か値を返して、かつその値を使う場合には、()を付ける必要がある 
以下のページが詳しい
http://officetanaka.net/excel/vba/beginner/07.htm

### SetとLet
・Setを使うとき 
　オブジェクト型の変数への代入で必要 
・Letを使うとき 
　省略可能だが、オブジェクト型以外(StringやLong)の変数への代入で必要 

 ### モジュール
・標準モジュール
　Javaのstaticクラスみたいなもの、newできない
・クラスモジュール
　Javaの普通のクラスみたいないもの
・ユーザフォーム
　クラスモジュールのフォーム版で、画面機能

### その他
・With Applicationで、Excel本体を指すオブジェクトを取得する
・.Calculation = xlManual　自動再計算をしない
・Visual Basic Editorを開く alt + F11
・マクロメニュー表示 alt + F8
・ステップ実行 F8
・ブレイクポイントまで実行 F5
・コードの整合性をチェックする デバッグ⇒VBAProjectのコンパイル
Javaで「テキストフィールドのサイズをピクセル単位で設定する」の動作を確認してみた。

# 概要

Javaで「テキストフィールドのサイズをピクセル単位で設定する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/tutorial/jtextfield/index5.html

# 実装

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

```JSample5_1.java
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JPanel;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.Dimension;

class JSample5_1 extends JFrame{
  public static void main(String args[]){
    JSample5_1 frame = new JSample5_1("MyTitle");
    frame.setVisible(true);
  }

  JSample5_1(String title){
    setTitle(title);
    setBounds(100, 100, 600, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTextField text1 = new JTextField();
    text1.setPreferredSize(new Dimension(500, 50));
    JTextField text2 = new JTextField("Hello");
    text2.setPreferredSize(new Dimension(500, 50));
    JTextField text3 = new JTextField("Hello", 35);
    text3.setPreferredSize(new Dimension(500, 50));
    JTextField text4 = new JTextField("Hello", 35);
    text4.setPreferredSize(new Dimension(500, 10));

    JPanel p = new JPanel();
    p.add(text1);
    p.add(text2);
    p.add(text3);
    p.add(text4);

    Container contentPane = getContentPane();
    contentPane.add(p, BorderLayout.CENTER);
  }
}
```

以下のコマンドを実行しました。

```
$ javac JSample5_1.java 
$ java JSample5_1 
```

実行結果は以下の通りでした。

![Screenshot from 2025-01-22 08-05-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/f04f9173-4b32-84e5-9436-55e2f804eece.png)

# まとめ

何かの役に立てばと。
TanStack QueryのisLoadingとisPendingの違い

## isLoading

- クエリが最初に実行されている間にtrueになる状態
- 初回のデータフェッチ中にtrue
- キャッシュにデータがない状態で新しいクエリを実行している場合に使用。
- 一度データがキャッシュされれば、その後のリフェッチでは isLoading は false になります。


## isPending
- クエリが「現在進行中のリクエストを持つ」場合に true になる状態。
- 初回のフェッチだけでなく、キャッシュされたデータがある場合でもリフェッチ中に true。
- リフェッチ中でも既存のデータがすでに画面に表示されている状態をサポート。


## 違いのまとめ
| 状態 | isLoading | isPending |
|:-:|:-:|:-:|
|初回フェッチ| `true`  | `true`  |
|キャッシュなしのリフェッチ   | `true`  |`true`   |
| キャッシュありのリフェッチ  | `false`  | `true`  |
| キャッシュデータ表示中のリフェッチ  | `false`   |  `true` |


## 使い分け
初回のデータ取得中かどうかを確認するなら isLoading を使用。
キャッシュデータが画面に表示されているが、バックグラウンドで更新中かどうかを確認するなら isPending を使用。
ServiceNow＞テーブルをExcelにエクスポートする

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# 目的
- 表示されているテーブルをExcelに落としたい

# 方法
### リスト画面の場合
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/16be339b-ae84-0f6a-b5e2-ef33508c229a.png)
- フィールド名（カラム名）を右クリック＞Export＞Excelを押下して落とせる


### 関連リストの場合
- フォーム画面＞関連リストの場合
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/24ea2c71-ae8c-1938-7d63-157a84cc4378.png)
- 関連リストのフィルター横の太文字を右クリック＞Open new Windowを押下
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/5fa33ded-c822-3e7c-8984-2393f1765c5c.png)
- リスト画面が表示されるので見出し「リスト画面の場合」と同様の手順で落とす
    - ※フォーム画面のレコードでソートされる場合もある
paizaラーニングレベルアップ問題集の「代入演算1」をやってみた。

paizaラーニングレベルアップ問題集の[代入演算1](https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__arithmetic_substitution_op_boss)をやってみました。
- - -
###### 問題
https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__arithmetic_substitution_op_boss
- - -
###### C
```c
#include <stdio.h>

int main() {
	int n = 0;
	n += 3286;
	n *= 4736;
	n %= 12312;
	printf("%d\n", n);
	return 0;
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	int n = 0;
	n += 3286;
	n *= 4736;
	n %= 12312;
	cout << n << endl;
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		int n = 0;
		n += 3286;
		n *= 4736;
		n %= 12312;
		Console.WriteLine(n);
	}
}
```
- - -
###### Go
```go
package main
import "fmt"

func main() {
	n := 0
	n += 3286
	n *= 4736
	n %= 12312
	fmt.Println(n)
}
```
- - -
###### Java
```java
public class Main {
	public static void main(String[] args) {
		int n = 0;
		n += 3286;
		n *= 4736;
		n %= 12312;
		System.out.println(n);
	}
}
```
- - -
###### JavaScript
```js
let n = 0;
n += 3286;
n *= 4736;
n %= 12312;
console.log(n);
```
- - -
###### Kotlin
```kotlin
fun main() {
	var n = 0
	n += 3286
	n *= 4736
	n %= 12312
	println(n)
}
```
- - -
###### PHP
```php
<?php
	$n = 0;
	$n += 3286;
	$n *= 4736;
	$n %= 12312;
	echo $n, PHP_EOL;
?>
```
- - -
###### Perl
```pl
my $n = 0;
$n += 3286;
$n *= 4736;
$n %= 12312;
print "$n$/";
```
- - -
###### Python3
```py
n = 0
n += 3286
n *= 4736
n %= 12312
print(n)
```
- - -
###### Ruby
```rb
n = 0
n += 3286
n *= 4736
n %= 12312
p n
```
- - -
###### Scala
```scala
object Main extends App{
	var n = 0
	n += 3286
	n *= 4736
	n %= 12312
	println(n)
}
```
- - -
###### Swift
```swift
var n = 0
n += 3286
n *= 4736
n %= 12312
print(n)
```
- - -
###### 出力結果
```
128
```
Bearというノートウェア

Bearはマークダウン対応のMacOS/iOSのノートウェア

プライベートなメモからナレッジ、マニュアルまであらゆるをBearにアウトプットしている。
ブログのソースはすべてBearからマークダウンやhtml形式にエクスポートしている。

## ノートウェアの要件

- ノートウェアに求める個人的な要件としてサクッと書いてサクッと辞書的に検索できたら良い。
- 余計な機能は不要。後は自分でなんとかするから。

そんなUXにフィットするのがBear。

## ノートを残す意義

新たに仕入れる情報は検証がついて回るけど、成功・失敗体験を綴ったノートは自分の環境にフィットしたナレッジなので、自環境において再現精度が高いのは言うまでもなく、適宜アップデートするので自分だけの最新・最高のナレッジとなる。この価値を体験できるからいつまでも続けられる。

## スタイル

使い始めて約4年。ほぼ毎日何かしら書くので1,000件以上貯まっているけど、その中でスタイルも固まってきているので私のスタイルを紹介。

![image 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/7835da49-e549-9fba-764d-4effcc2bcaa7.png)

0. 新規ノートを作ったらプレーンテキストで作成日時のタイムスタンプを入れてくれる

1. タイトル書く
   基本#(h1)で装飾するけどなにを装飾をしようがノート先頭がタイトル

2. 後で引っ掛けやすかろう思いついたタグを書く
   #bear #ブログ

3. アイコンイメージを入れる
   ![](image%203.png)<!-- {"width":150} -->![image 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/2e2c030a-3cc9-e465-52ad-a3b3769795c9.png)

   後からビジュアルで索引になるし、アイコンはかわいくてモチベが上がる

4. ラインを入れたらあとはマークダウンでフリーフォーマット

{ この記事の目的を書く }

{ ## (h2)アウトライン見出しを書く }
{ h2の下にラインを入れるのがマイルール }
…

{ ### 　(h3)さらに見出し刻む }
h3以降は見出しにインデントを入れるのがマイルール、見やすい

{ ### 　(h3)さらに見出し刻む }
…

{ #### 　　(h4)さらにさらに見出し刻む }
…

## UI

書くも探すも異常なほど軽快
- スクショの一番左のペインは #タグ を階層管理でビジュアライズしてくれるが使ってないので折りたたんでいる。ちなみにタグは #タグ/サブタグ のようにネストすることで階層管理できる。が、整理整頓に時間を費やすのは不毛。タグはノートを開いたときにドメインを把握するくらいで良いと思っている。
- スクショ真ん中ペインが重要。更新日付の降順で並べている。ワードを検索すれば精度の高いものから順にサクサクとフィルタしてくれる。ここで索引的にアイコンイメージが活きてくる。
- エディタはフルマークダウンで画像とかファイルとかなんでもコピペで張り付けてアーカイブできる。なにより軽快さが超優秀。すぐ書きたくなる。

## アプリ同期
iCound同期なので、MacとiPhoneで常時スイッチ可能

## safariプラグイン
Bearアプリを入れたら、iPhone/safariのアクションシートにBearが追加されてwebページをまるっとマークダウン変換してBearにアーカイブしたり、タイトル付きリンクを埋め込ませることができる。

## エクスポート

ブログはマークダウンか、htmlエクスポートする
マニュアルはPDFエクスポートする

## おしいところ

- Mac/iOSアプリのみで、web版、windows版がない。web版は欲しい。Bear使うためだけにMac持ち出すことが多い。
- デバイス同期とかスキンは有償プラン(2.99/月)。
  しかしながら、物理的にノート買っていると思ったら高いとは思わない。
  むしろ無償で広告とか付きだしたら途端にUXが損なわれそうでいまがちょうどいい。
【自分用】cloudformationテンプレートで条件分岐

CloudWatchAlarmでlinuxとwindowsでMetricMathの計算方法が異なるため条件分岐させる方法
'''
Parameters:
  PlatformType:
    Type: String
    AllowedValues:
      - Linux
      - Windows
    Default: Linux
    Description: "The platform type (Linux or Windows)"

Resources:
  PlatformSpecificAlarm:
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "Platform-Specific-Replica-Ratio-Alarm"
      AlarmDescription: "Triggers when the replica ratio falls below threshold, based on the platform type."
      Metrics:
        # Linux用メトリクス
        - !If
          - IsLinux
          - Id: replicasReadyLinux
            MetricStat:
              Metric:
                Namespace: "Kubernetes/ContainerInsights"
                MetricName: "replicas_ready"
                Dimensions:
                  - Name: ClusterName
                    Value: !Ref EKSClusterName
                  - Name: Namespace
                    Value: "my-namespace"
                Period: 60
              Stat: "Average"
            ReturnData: false
          # Windows用メトリクス
        - !If
          - IsWindows
          - Id: replicasReadyWindows
            MetricStat:
              Metric:
                Namespace: "AWS/Windows"
                MetricName: "windows_replica_ready"
                Dimensions:
                  - Name: ClusterName
                    Value: !Ref EKSClusterName
                  - Name: Namespace
                    Value: "my-namespace"
                Period: 60
              Stat: "Average"
            ReturnData: false

        - Id: replicasDesired
          MetricStat:
            Metric:
              Namespace: "Kubernetes/ContainerInsights"
              MetricName: "replicas_desired"
              Dimensions:
                - Name: ClusterName
                  Value: !Ref EKSClusterName
                - Name: Namespace
                  Value: "my-namespace"
              Period: 60
            Stat: "Average"
          ReturnData: false
        - Id: replicaRatio
          Expression: "replicasReady / replicasDesired * 100"
          Label: "Replica Ratio (%)"
          ReturnData: true
      EvaluationPeriods: 1
      Threshold: 90
      ComparisonOperator: "LessThanThreshold"
      TreatMissingData: "breaching"

Conditions:
  IsLinux: !Equals [ !Ref PlatformType, "Linux" ]
  IsWindows: !Equals [ !Ref PlatformType, "Windows" ]
'''
【シェル】expectを用いてsshで実行したコマンドの終了ステータスを取得する方法

## 想定されるケース
・sshしてコマンドを実行するところまで自動化したい
・公開鍵認証ではなく、パスワード認証になっている（非推奨）
・パスワード認証も自動で突破したい
・expectを採用するしかない
・sshで実行したコマンドの戻り値を、シェル内で使用したい

こんな限られた場面・環境でシェルの作成を余儀なくされた...。
そんなあなたのために書き残します。（当然筆者も含まれます）

## 結論
以下のようなコードを書けば実現できます。

```bash
#!/bin/bash

expect -c "
set timeout 10
spawn -noecho ssh ${USER}@${REMOTE_HOST} \"${COMMAND}\"
expect \"assword\"
send \"${PASSWORD}\"
interact
exit [lindex [wait] 3]
"
echo $? # ${COMMAND}の終了ステータスが出力される
```

## ポイント

以下の記述が大事なところです。

`exit [lindex [wait] 3]`

・`[ ]`：コマンド置換。`$( )`と同様コマンドの実行結果に置換される。
・`exit`：expectコマンドを終了するの意です。
・`lindex`：関数。`lindex [配列] [index]`と引数を指定して記述すると、indexに対応する配列の要素を取得できる。
・`wait`：少しややこしいので、manコマンドの記述を見てみましょう。

```
spawnされたプロセス(あるいは、名前つきのプロセスがなければ現在のプロセス) が終了するのを待つ。
wait は、通常4つの整数のリストを帰す。
最初の整数は、終了を待ち構えているプロセスの pid である。
2つめの整数は、関連するspawn idである。
3 つめの整数は、オペレーティングシステムエラーがあれば -1、 そうでなければ、0である。 
3 つめの整数が 0 であれば、4 つめの整数はspawnされたプロセスからのリターン コードである。
3 つめの整数が -1 であれば、4 つめの整数はオペレーティングシステム によって設定された errno の値である。グローバル変数 errorCode も設定される。
```

**結局、ややこしいわ**

というわけで、要点だけまとめてみました。

・ **spawnされたプロセスの終了後に通常4つの整数のリストを帰す**
・ **4つめの整数はspawnされたプロセスからのリターンコードである**

これで、少しは理解が進んだのではないでしょうか。

## コマンドをもう一度眺める

ここで`exit [lindex [wait] 3]`をもう一度見てみましょう。
以下のような流れで変換されていきます。

```
exit [lindex [wait] 3]

↓  waitがコマンド置換されて配列に置き換わる。4番目に終了ステータスが入っている。

exit [lindex (pid spawnid OSerr exitcode) 3]

↓  lindex関数もコマンド置換され、4番目の要素（index=3）である終了ステータスを取得し置き換わる。

exit "exitcode"
```

## 最後に

最初に述べたように、想定されるケースはかなり狭いです。
sshでは鍵認証を使用すべきで、パスワード認証を自動化するためにexpectを用いること自体非推奨です。
（そもそもパスワードの扱いに困ります。平文でどこかに記載するなんてのは厳禁です。）

「構成・環境の変更なんて今更できない！制約がある中でなんとかしないといけないんだ！」という方のある種"特効薬"になれば幸いです。

ここまで読んでいただきありがとうございました。
［ServiceNow］Form Layoutを使用する

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# Form Layout
- フォーム（データ入力画面）のレイアウトやフィールドの配置を設定する機能

# 使用方法
- 任意のテーブルのレコードを開く
    - 例としてIncidentテーブルを使用
- 画面上部の灰色の個所を右クリック＞Configure＞Form Layoutを押下
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/5c160e2d-35ec-9b91-e040-9e0677188eac.png)
- From Layout画面が表示される![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/4038239a-e0e5-3c8a-e3fd-b2357d221391.png)
- 画面上部のAvailableとSelectedの２つの枠から画面表示の有無を変更できる
- 現在使用されているView、セクション、関連リンクを確認できる
[Unity]Riderでデバッグ機能を使う時プロジェクトが勝手に追加起動される

# 概要
UnityのプロジェクトをRiderで編集している時、デバッグ機能を実行しようと虫アイコンのボタンを押すと

![スクリーンショット 2025-01-22 7.06.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/a59b4009-dde2-8982-1d03-fbe49c7f4db1.png)

```
It looks like another Unity instance is running with this project open.

Multiple Unity instances cannot open the same project.
```

このようなエラーが表示されて同じプロジェクトを勝手に開こうとすることがあります（二重には開けず結局は閉じられます）
# 本文
虫アイコンボタンの左側が **「Unityの起動」** になっているかもしれません。**「Unityエディターにアタッチ(Attach to Unity Editor)」** に切り替えるとこの問題は起きなくなります。


![スクリーンショット 2025-01-22 7.10.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/bcb17b5c-735c-00eb-d463-6ec382495aa2.png)
GitリモートリポジトリをGitHubからCodeCommitに引っ越しする

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/1afcbf49-6dcb-f2a8-890a-3d9a78e776e0.png" alt="git" width="232">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/ae009ff9-53b1-5afc-7963-b9e2f2daa214.png" alt="githuhb" width="192">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/e5d9e46b-4082-8bbd-f510-e5c01fa879de.png" alt="codecommit" width="80">

Githubリモートリポジトリをブランチやコミット履歴を含めてまるごとCodeCommitにお引っ越しする手順。
引っ越しにはリポジトリのブランチ・タグ、コミット履歴など全てのリファレンスを含んだバックアップであるbareリポジトリを利用する。

## bareリポジトリとは

**リポジトリの構成管理**

* ブランチ・タグ、コミット履歴など全てのリファレンスを含む、サーバーサイドの構成管理リポジトリであり完全バックアップである。管理対象のファイル実態は持たない。
* `git clone --bare`オプションで`bare`リポジトリをクローンできる。
* `git clone --mirror`オプションでも`bare`リポジトリをクローンできる。--bareとの違いは文字通りリモートリポジトリと同期するように設計されていて、.git/configはmirror=trueである。よってデフォルトでは全リファレンスをpushするし、`git remote update`では全リファレンスを追跡する

> **--mirror**
> Set up a mirror of the source repository. This implies --bare. Compared to --bare, --mirror not only maps local branches of the source to local branches of the target, it maps all refs (including remote-tracking branches, notes etc.) and sets up a refspec configuration such that all these refs are overwritten by a git remote update in the target repository.
> 
> ソースリポジトリのミラーを設定します。これは --bare を含意します。--bare と比較して、--mirror はソースのローカルブランチをターゲットのローカルブランチにマッピングするだけでなく、すべてのリファレンス（リモート追跡ブランチ、ノートなども含む）をマッピングし、これらのリファレンスがターゲットリポジトリの git remote update によって上書きされるように refspec 設定を行います。
[Git - git-clone Documentation](https://git-scm.com/docs/git-clone#Documentation/git-clone.txt---mirror)

## non-bareリポジトリとは

**リポジトリのワークスペース**

* チェックアウト済のブランチ・タグのコミット履歴とファイル実態で構成されるクライアントサイドのワークスペースである。
* いつもの`git clone`は`non-bare`リポジトリ。

## 引っ越し手順

CodeCommitでリポジトリを作成して、IAMユーザにCodeCommitのプッシュできるポリシーとSSH公開鍵を登録しておく

```sh:sh
# GitHubからbareリポジトリをクローンする
git clone --mirror git@github.com:path/to/reponame.git

#  push先をCodeCommitのリポジトリに変更
cd ./reponame.git && git remote set-url --push origin ssh://git-codecommit.ap-northeast-1.amazonaws.com/path/to/reponame

# 全てのリファレンスを移行先にプッシュする(--mirror)
# (clone --mirror により、configのmirror=true状態のため、オプションなしでも全リファレンスはプッシュされる)
git push --mirror
```
kindind(k8s in docker in docker)の環境を作成する

# kindind(k8s in docker in docker)の環境を作成する

## 背景

k8sマジでわからんので軽く環境欲しいなと思っていた。
dind(docker in docker)をdocker blogで目にしたので、kind in dindの環境構築を作ってみた。

## directory

```terminal
tree .
.
├── Makefile
├── compose.yaml
└── dockerfile

1 directory, 3 files
```

```compose.yaml
services:
  kind:
    container_name: kind_container
    privileged: true
    build:
      context: .
      dockerfile: dockerfile
    tty: true
    restart: on-failure:3
```

```dockerfile
FROM docker:dind

# kind
RUN apk add curl && \
    curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.26.0/kind-linux-arm64 && \
    chmod +x ./kind && \
    mv ./kind /usr/local/bin/kind && \
    kind version

# kubectl
RUN curl -LO "https://dl.k8s.io/release/v1.32.0/bin/linux/arm64/kubectl" && \
  curl -LO "https://dl.k8s.io/release/v1.32.0/bin/linux/arm64/kubectl.sha256" && \
  echo "$(cat kubectl.sha256)  kubectl" | sha256sum -c && \
  chmod +x kubectl && \
  mkdir -p ~/.local/bin &&\
  mv ./kubectl /usr/local/bin/kubectl && \
  kubectl version --client --output=yaml
```
開発環境からインターネット越しのMySQLホストを安全に接続する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/3c4a33ef-328d-4d30-d476-003b74e64dc8.png" alt="linux" width="144">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/6c51e529-ef99-61ed-ad99-75457f2be8fc.png" alt="mysql" width="156">

データ依存な事象の検証のために、開発環境からインターネット越しのMySQLホストにsshトンネルで接続する。特にプライベートなRDSに接続するとき。

sshで`トンネル用のローカルTCPポート` → (インターネット) → `sshホスト` → (イントラネット) → `データベースホスト`へのsshトンネルを確立させて、アプリケーションからは`localhost:トンネル用のローカルTCPポート`をデータベースホストにみたて接続する。

## sshトンネル

### データベースがsshホスト上にある場合

sshホストmysql.host:22にssh接続し、ローカルのTCPポート:13306への入力を、sshホストからみたlocalhost:3306(=ループバック)に転送する

```sh:sh
ssh -N -L 13306:localhost:3306 -p 22 -i ./id-rsa.pem user@mysql.host
```

### データベースが踏み台sshホストの先にある場合(RDS)

sshホストbation.host(EC2):22にssh接続し、ローカルのTCPポート:13306への入力を、sshホストからみたmysql.host(RDS):3306に転送する

```sh:sh
ssh -N -L 13306:mysql.host:3306 -p 22 -i ./id-rsa.pem ec2-user@bation.host
```

- 前提として`bation.host` から `mysql.host`にインバウンド許可していること
- `13306:{データベースホスト}:3306`のホスト名はインターネットフェイスなDNSアクセスだとグローバルIPなのでファイアウォールで弾かれる（挙動としては応答なしで延々と捕まる・固まる）

## アプリから接続

ローカルホスト:sshトンネルポートをデータベースホストとする

```php
database_host = 'localhost:13306';
```

## 付録

```bash
ssh
	-N # リモートコマンドを実行しない＝ターミナルを開かない＝トンネル専用
	-L {ローカルホストのバインドポート}:{フォーワード先のホスト}:{フォワード先のポート}
	-p {sshホストのポート} 
	-i {ssh鍵ファイル}
	{ユーザ名}@{sshホスト}
```

`フォーワード先のホスト`は`sshホスト`からみたネットワーク名
他サイト 外部サイトを画面遷移せずに開く　同じサイトで表示する方法

# 他サイト 外部サイトを画面遷移せずに開く　同じサイトで表示する方法

### HTMLタグのiframeを利用した埋め込みを使用します。
以下コードです。
```javascript
<iframe
    src={url}{/*参照するURL(外部でも内部でも)*/}
    title={title} {/*別に特段必要な部分ではないですが、iframeタグで表示した内容のラベル*/}
    sandbox="allow-scripts allow-same-origin"{/*参照先のURLでの操作等細かい設定*/}
/>
```

※ **iframeタグ自体の設定できる値詳細につきましては別途検索ください。**

## 参照できるURLと参照できないURLがある
実際にURLの値を設定して参照できるかどうか確認もできますが、以下サイトで確認することで簡単に確認できます。(参照できないURLを設定した場合、iframeタグで外部サイトが表示されるはずの領域に、「example.comからアクセスを拒否されました」※example.comは入力したurl、と表示されます。)
URL確認サイト(ヘッダー等を調べる)→https://securityheaders.com/

このサイトで **x-frame-options** というヘッダーが設定されているもしくは値がある場合、基本的にアクセスできません。
例えば、
- 食べログ、Qiita
→https://tabelog.com/
x-frame-optionsがSAMEORIGINに設定されているため、アクセスできません。
- ホットペッパー
→https://www.hotpepper.jp/
x-frame-options自体設定されていないので、iframeタグで参照できます。

- facebook
→https://www.facebook.com/
x-frame-optionsがDENYに設定されているため、アクセスできません。

※正確には、SAMEORIGINが設定されている場合、アクセスできる可能性は存在します。
基本可能ではないので、詳細は省きますが、
SAMEORIGINとなるエンドポイントにアクセスすることができればiframeでの参照ができます。
ただSAMEORIGINであれば、許可するというのはiframeのみではなく多くの場所で使用されているため、そのSAMEORIGINにアクセスできるのはセキュリティ的に問題があるため、基本的にはアクセスできません。
参照するサイトの開発に携わるものだけが、可能と考えてもらっても大丈夫だと思います。facebookのサイトならfacebookのサイト開発に携わっているもの

もしくは特定のurlのみ参照可能とするALLOW-FROM uri (Deprecated)にて自分のサイトが許可されていれば、参照可能かもしれません。deprecatedのなので、ちゃんとサポートしていない可能性はありますが。


## そもそもなぜx-frame-optionsが設定されているのか
**クリックジャッキング** を防ぐためです。詳細な記事を後日記載するので、詳細が気になる方はクリックジャッキングで検索ください


## どんなサイトが設定されていないか
特に、Wordpressであるとか関わらず、開発時デフォルトで設定が入っているものではないので、設定を入れない限りはそもそも設定すらされていません。
googleやfacebookのサイトには設定がされていることから、セキュリティの意識が高い企業もしくは、有識者を雇っている会社は設定をされているのだと思います。
※ **ちなみにQiitaはこの設定がされているため、セキュリティの対策をしっかりされていることがわかります。**

## セキュリティと利便性は表裏一体
外部サイトにアクセスさせたいが、戻るボタンでしか、基本的に元のページに戻れないため、画面遷移させたくない、ためiframeを使用しているが、この技術は、クリックジャッキングのように悪用もできるため、対策は必要と思いつつも、画面遷移せずに外部サイトを参照させるようなサイトを作成できるので、対策されると少し困るなという思いがあります。代替の解決策等ございましたら、コメントいただけますと幸いです。
ちなみに、工数削減と、APIで取得できる項目が限られている、もしくは足りないため、iframe使用に至ったため、APIを使用してデータ取得や、登録処理を行うというのは、選択肢に入っていません。
マイクロマシーン-マイクで遊ぶ(H743)


x 過去ログを見よ!!!


目的
秋月電子(秋葉原)で売っている。
ICマイクで遊ぶ。

いろいろ
ICマイクの振動子がすごく、軽量ために
超音波(ソニックウェーブ)まで特性がフラット
でも、人間の音声や楽器は、最低1kHzもあれば、
足りるので、オーバースペックで余計な音を拾いやすい。
ローパスフィルターが必要。
(だれに向かって、何を言っているかわからない? !!!　いみふ)
(音スイッチ代わりに使うには、多重平均　まだ未定)


結果
----

![Screenshot from 2025-01-22 06-09-24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/95f4fbb7-33fe-ed1b-8c7d-65195aa22a5e.jpeg)


![image_original(3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1878bf2b-a8bd-5618-a3b5-a12dc2599cc0.jpeg)


プログラム
----

```c++


//ser_mic_stm32h743_1


//インクルド
#include <Arduino.h>


//初期化
void setup() {

  pinMode(A1, OUTPUT);  //gpio init
  digitalWrite(A1, HIGH);

  //シリアルポートの初期化
  Serial.begin(9600);

}  //setup


//メインループ
void loop() {

  //電圧を入力する(3.3Vを4096に分解した値)
  analogReadResolution(12);  //センサーの分解度4096
  int s = analogRead(A0);    //センサーの値

  //電圧を温度に変換 ex 20.0 -> 200 温度の十倍を出力
  int Voltage = (s * 3300) >> 12;  // s = s * 3300 / 4096 電圧こと

  //文字列に変換する
  char data[16];                 //出力用文字列
  data[5] = 0;                   //終端記号
  data[4] = '0' + Voltage % 10;  //小数点の値
  Voltage = Voltage / 10;
  data[3] = '0' + Voltage % 10;  //小数点の値
  Voltage = Voltage / 10;
  data[2] = '0' + Voltage % 10;  //小数点の値
  Voltage = Voltage / 10;
  data[1] = '.';                 //小数点の区切り
  data[0] = '0' + Voltage;       //整数1桁目(1の位)

  //整数.小数点3桁で表示 ex 1.650
  Serial.println(data);

  //2msの待ち
  delay(2);

}  //loop



```