OmniAICreator/Qiita-1.07M huggingface dataset:
関数電卓の選び方（統計機能編）

## お勧めされがちなカシオES機にも弱点が
今日もXからネタを拾って記事にしてみる。

https://x.com/NTT_hold/status/1925515987098734614

fx-375ESAを買ったところ、統計量を出す操作が煩雑だというお悩み。
確かに、統計量を確認したいだけなのにこれだけの操作をするのは面倒である。

統計モードで統計量を確認する方法として、各関数電卓はどのような方法を用意しているだろうか。

## カシオClassWiz（初代・CWとも）
画像はfx-JP500CW取扱説明書から
![stat1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/408108b8-a1e4-4bc9-ba2e-6f6bef1354c6.png)
1変数、2変数とも統計量一覧が用意されている。
ただし、6行表示のため見づらい。

## シャープ複数行機
画像はEL-509T取扱説明書から
![stat2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/0985cef7-ed44-40f8-bc01-247a5007cd7c.png)
![stat3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/210e3f11-09cc-450a-a0ae-6e53b8101b2b.png)
ClassWizと同様に統計量一覧が用意されており、こちらは4行表示のためより見やすい。
2変数の場合、統計量一覧は以下の6画面。
- n, $\bar{x}$, sx, s<sup>2</sup>x
- σx, σ<sup>2</sup>x, ∑x, ∑x<sup>2</sup>
- xmin, xmax, $\bar{y}$, sy
- s<sup>2</sup>y, σy, σ<sup>2</sup>y, ∑y
- ∑y<sup>2</sup>, ∑xy, ∑x<sup>2</sup>y, ∑x<sup>3</sup>
- ∑x<sup>4</sup>, ymin, ymax

表示できる統計量はClassWizと全く同じだが、シャープ機の方が種類別にまとまっていて把握しやすい。

## カシオES機
画像はfx-375ESA取扱説明書から
![stat4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/f8315e26-347a-4aad-9442-7bd73d9cd024.png)
[SHIFT][1]（STAT）を押した後、サブメニューを経由して統計量の文字を表示させ、[=]で値を表示する。
今回紹介する関数電卓の中で、カシオ・キヤノン2行機と同様に操作が煩雑。

## キヤノン複数行機
画像はF-789SG使用説明書から
![stat5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/68d07e5e-5e6c-4fc0-97f5-24b5be5234ca.png)
サブメニューを経由する点はカシオES機と同じだが、STATメニューを出す方法が[Apps]キーのみとなっているため、[SHIFT]を押さなくて済む分、手順が軽減されている。

## 2行機
画像はカシオfx-290A取扱説明書
![stat6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/d9384ba8-0815-4a35-9525-9953da069144.png)

画像はキヤノンF-715SG/SA使用説明書
![stat7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/317989df-492c-42df-89ea-cc5c40317678.png)

どちらの機種も、カシオES機のサブメニュー相当（S-VAR/S-SUM/S-PTS）をキー操作で呼び出し、矢印キーと数字キーを使って統計量の文字を選択、[=]で値を表示させる。

最大・最小値を呼び出すS-PTSはキヤノン機にしかない。

なお国産モデルはないが、シャープ2行機は各統計量がキー機能として用意されているため、[ALPHA][統計量文字]で直接文字を入力でき、[=]で値を表示できる。
キーに限りがあるため、直接表示できる統計量はカシオやキヤノンの2行機より少なくなっている。
![stat8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/36098ffa-1107-4203-a141-548f74cd40f2.jpeg)

## 1行機
1変数統計のみ搭載。
各統計量がキー機能として用意されており、直接、あるいは[2ndF]/[SHIFT]前置のキー操作をすることで表示することができる。
![f605g_el501t.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/2329c66a-7f90-4263-b532-7295e9cd5302.png)

## 統計機能をよく使う人は統計量一覧のある機種がお勧め
指数入力の関係でClassWiz CW機は勧めないと再三過去記事で書いているが、統計量一覧に関しては前モデルの初代ClassWizと同等のものが搭載されているため、統計機能をよく使う人にとってはカシオES機より便利に使えるだろう。

ただし、統計量一覧の見やすさではシャープ複数行機がさらに上をゆく。数式入力に関しては低解像度がデメリットになっているものの、統計量一覧は4行にとどめて表示する分、見やすくなっている。並び順も自然だ。
今回取り上げなかったが、TIの複数行機も統計量一覧が4行表示で見やすくなっている。

統計機能を多用する人はこれらを踏まえて機種選択するとよいだろう。
AWS CloudFront キャッシュポリシーのチューニングベストプラクティス【パフォーマンス＆コスト最適化】

# AWS CloudFront キャッシュポリシーのチューニングベストプラクティス【パフォーマンス＆コスト最適化】

## はじめに

AWS CloudFrontは、グローバルCDNとしてWebサイトやAPIの高速化に寄与するサービスです。

中でも「**キャッシュポリシー**」は、**CloudFrontの挙動とオリジンへの負荷、さらにはAWS WAFなどの課金にも直接影響する重要な構成要素**です。

本記事では、CloudFrontのキャッシュポリシーを**パフォーマンス・コスト・運用性**の観点からチューニングするためのベストプラクティスを紹介します。

---

## キャッシュポリシーとは？

CloudFrontが
- 何をキーとしてキャッシュするか
- どれくらいの期間キャッシュするか
- クエリ/Cookie/ヘッダーをどう扱うか

などを定義する設定です。

---

## 基本構成と項目説明

| 設定項目 | 役割 | よくある設定値 |
|----------|------|----------------|
| TTL (Time to Live) | キャッシュの生存期間 | default=86400, min=60, max=31536000 |
| クエリ文字列 | キャッシュキーに含めるクエリ | None / All / Include List |
| Cookie | キャッシュキーに含めるCookie | None / Include List |
| HTTPヘッダー | キャッシュキーに含めるヘッダー | None / Include List |
| 圧縮 | Gzip/Brotli圧縮対応 | Enabled |

---

## チューニングベストプラクティス

### 🔧 1. 静的コンテンツは極力キャッシュする

対象：JS, CSS, 画像, Webフォント など

- キャッシュポリシー：`CachingOptimized`（または同等のカスタム）
- TTL：86400秒以上推奨
- Cookie/クエリ/ヘッダー：含めない（None）

```plaintext
Behavior: /static/*
→ 高速表示 + オリジン負荷削減 + WAFリクエスト数も削減
```

---

### 🔧 2. 動的APIエンドポイントはキャッシュしない

対象：POST API, 認証系、パーソナライズ要素あり

- キャッシュポリシー：`CachingDisabled`
- TTL：0
- Cookie/クエリ/ヘッダー：必要最小限

```plaintext
Behavior: /api/*
→ 毎回オリジンへリクエスト、キャッシュ非活用
```

---

### 🔧 3. 言語別・地域別ページの分離（国際対応）

対象：`Accept-Language`, `CloudFront-Viewer-Country` ヘッダー

- キャッシュキーに必要なヘッダーを含める
- カスタムキャッシュポリシーを利用

```plaintext
例：日本語/英語ページを分離してキャッシュ
```

---

### 🔧 4. ファイル名にハッシュを埋め込み、キャッシュ長期化

対象：JS/CSSなど頻繁に更新される静的ファイル

- ファイル名例：`app.83cc0fe.js`
- `max-age=31536000, immutable` などと組み合わせてキャッシュ破棄不要に

---

## キャッシュポリシー適用例（Terraform）

```hcl
resource "aws_cloudfront_cache_policy" "optimized" {
  name = "MyOptimizedPolicy"

  default_ttl = 86400
  max_ttl     = 31536000
  min_ttl     = 60

  parameters_in_cache_key_and_forwarded_to_origin {
    cookies_config {
      cookie_behavior = "none"
    }

    headers_config {
      header_behavior = "none"
    }

    query_strings_config {
      query_string_behavior = "none"
    }

    enable_accept_encoding_brotli = true
    enable_accept_encoding_gzip   = true
  }
}
```

---

## モニタリングと改善

- CloudFrontの`CacheHitRate`（CloudWatch）を監視
- S3アクセスログ＋Athenaでキャッシュミスのパターンを解析
- キャッシュキーを複雑にしすぎない（分散しすぎ注意）

---

## まとめ

- キャッシュポリシーはCloudFrontの性能とコストに直結する
- 静的コンテンツは積極的にキャッシュ、有効期限は長めに
- 動的APIはキャッシュしない
- キャッシュキーに含める要素は最小限が原則
- CloudFront + WAF連携時はキャッシュによりWAF課金も最適化できる

---

## 参考リンク

- [CloudFront キャッシュポリシー公式ドキュメント](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html)
- [CloudFront CachingOptimized ポリシーの解説](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html)
Reactについて


## はじめに
Reactについて今までは感覚的に使い方を覚えてきましたが、一度基礎から見直して理解を深めようと思いました。
今回はその備忘録です。

## Reactとは？
Meta（旧Facebook）によって開発されたオープンソースのフロントエンドJavaScriptライブラリで、2013年にオープンソースとして公開されました。Reactにはいくつかの特徴があります。

**1. コンポーネントベース**
コンポーネントベースのアーキテクチャにより、小さな部品（コンポーネント）を組み合わせることで複雑なUIを構築、管理することができます。

**2. 仮想DOM**
通常のDOM（Document Object Model）を操作する場合、処理が遅いため、大量に更新する際はパフォーマンスが落ちてしまいます。Reactでは、通常のDOMをコピーした仮のDOMを使用し、差分検出によって変更のあった箇所だけを更新することでレンダリングを高速化し、効率的にUIの更新ができます。

**3. 宣言的なUI**
「UIをどう操作するか」ではなく、「状態に基づいて、どのようなUIを表示するか」を宣言的に記述することで、状態が変わる際にUIの更新が自動的に処理されます。宣言的な記述によってコードが直観的に理解しやすくなり、コードの可読性や保守性に繋がります。下記はその一例です。

``` react
import React, { useState } from 'react';

function Sample() {
  const [showText, setShowText] = useState(false);

  return (
    <div>
      <button onClick={() => setShowText(true)}>表示する</button>
      {showText && <p>こんにちは！</p>}
    </div>
  );
}

export default Sample;
```

## JSX(Javascript XML)について
Reactのコンポーネントを記述する際、ほとんどの場合JSXで書かれています。JSXはJavaScriptの拡張構文で、JavaScriptのファイル内でHTMLのような構文が書けるようにするものです。下記のコードのように、JavaScriptのコードの中でタグを直接書くことができます。

```jsx
const text = <h1>Hello World!</h1>
```

また、中括弧{}を使用することで、JavaScriptの式を埋め込んで動的に生成することができます。

```jsx
const name = '田中';
const text = <p>こんにちは、{name}さん</p>;
```

JSXはブラウザで実行されないので、実行前にBabelなどのトランスコンパイラを利用して通常のJavaScriptに変換しています。

```jsx
const text = <h1>Hello World!</h1>
```

上記のコードがトランスコンパイラで通常のJavaScriptに変換されると、下記のコードになります。

```javascript
const text = React.createElement("h1", null, "Hello World!");
```

JSXはReactの宣言的な記述に大きく関わっており、コードの可読性、保守性などに貢献していることが分かります。

## まとめ
Reactについて振り返りましたが、感覚的に理解していた部分が思っているより多かったと気付くことができました。現在のフロントエンド開発ではReactを使用して開発することが多いので、感覚的に理解している部分を減らしていきたいです。

## 参考資料
[React](https://ja.react.dev/)

## **採用拡大中！**

アシストエンジニアリングでは一緒に働くフロントエンド、バックエンドのエンジニアを募集しています！  
少しでも興味ある方は、カジュアル面談からでもぜひお気軽にお話ししましょう！

お問い合わせはこちらから↓  
[https://official.assisteng.co.jp/contact/](https://official.assisteng.co.jp/contact/)
【Cloud Composer × Airflow】DAGのcron設定を理解する！

## はじめに

AirflowをCloud Composer上で運用する場合、DAGのスケジュールを `cron` 形式で指定する機会がほとんどです。

慣れていないと、、、

> cronの書き方が毎回あやふやになる  
> 「0 9 * * *」って、何時に実行だっけ？  
> Cloud ComposerだとUTCで動くんだっけ？  

こうした疑問やつまづき、誰もが一度は経験するはずです。  
本記事では、**Cloud Composer × cron** をテーマに、Airflowのスケジューリングを完全に理解できるようまとめます。

---

## DAGの基本的なcron構文

Airflowでは、DAG定義に以下のように `schedule_interval` を指定します。

```python
from airflow import DAG
from datetime import datetime

dag = DAG(
    dag_id="sample_dag",
    start_date=datetime(2024, 1, 1),
    schedule_interval="0 9 * * *",  # 毎日 9:00 に実行
)
```

### cron構文の基本

```
分 時 日 月 曜日
```

例えば：

| cron式        | 意味                             |
|---------------|----------------------------------|
| `0 9 * * *`   | 毎日 午前9時（UTC）              |
| `30 15 * * 1` | 毎週月曜 午後3時30分（UTC）       |
| `0 */6 * * *` | 6時間おき（0時, 6時, 12時, 18時） |

---

## Cloud Composerとタイムゾーン

Cloud Composer/Airflowでは**cronがUTC基準**で評価されます。

### よくあるミス：

- `"0 9 * * *"` → これは **JSTの18:00** に実行されます！
- JST（日本時間）で朝9時に動かしたいなら → `"0 0 * * *"`（UTCの0時＝JSTの9時）

### 対応策①：UTCのまま書く（最も安定）

```python
# 例：日本時間 9:00 に動かす
schedule_interval="0 0 * * *"  # UTCで0時
```

### 対応策②：DAG側で明示的にタイムゾーン指定（Airflow 2.x）

```python
from pendulum import timezone

dag = DAG(
    dag_id="japan_dag",
    start_date=datetime(2024, 1, 1, tzinfo=timezone("Asia/Tokyo")),
    schedule_interval="0 9 * * *",  # JST 9時に実行される
)
```

> Cloud Composer 2.x では `pendulum` ベースのタイムゾーン指定が安定します。

---

## よく使うcronパターン集（JST対応）

| 実行したい時間（JST） | cron式（UTC）      |
|------------------------|--------------------|
| 毎日 9:00              | `0 0 * * *`        |
| 毎日 23:00             | `0 14 * * *`       |
| 毎週月曜 8:00          | `0 23 * * 0`       |
| 毎月1日 10:00          | `0 1 1 * *`        |
| 平日毎日18:00          | `0 9 * * 1-5`      |
| 毎時30分               | `30 * * * *`       |
| 3時間ごと              | `0 */3 * * *`      |

---

## テスト時の注意点：start_dateとcatchup

```python
dag = DAG(
    dag_id="test_dag",
    start_date=datetime(2024, 1, 1),
    schedule_interval="0 0 * * *",
    catchup=False  # ← これが重要！
)
```

### `catchup=True` だと何が起こる？

- DAG登録時から現在までの**過去全実行スケジュール分**が実行されてしまう
- 初回テスト時は `catchup=False` を推奨！

---

## Cloud Composerにおける注意点

✅ cron式はUTC前提で記述すること  
✅ 必要に応じて `start_date` に `tzinfo` をつけること  
✅ 開発中のDAGでは `catchup=False` にする  
✅ スケジュールの実行タイミングは**「終了時刻＝そのスケジュール分のデータを処理する」という仕様**に注意！

---

## おわりに

Airflow/Cloud ComposerでのDAG管理において、**cronとタイムゾーンの理解**は極めて重要です。  
「日本時間で何時に動くんだっけ？」という疑問を、この記事で解消できれば幸いです。

---

## 参考リンク

- [Apache Airflow 公式ドキュメント](https://airflow.apache.org/)
- [Cloud Composer (Google Cloud)](https://cloud.google.com/composer)
- [cron 表現の書き方（crontab.guru）](https://crontab.guru/)

---
SQLパイプラインをGUIで整理！Dataformのすすめ（BigQueryユーザー向け）



## はじめに

最近、チーム内のSQL管理が煩雑になってきたな……と感じています..

- SQLが個人PCやNotionに散らばっている
- データ変換処理の実行タイミングが不明確
- Airflowやdbtは少しハードルが高い

そんなときに便利なのが、**Dataform（by Google）** です。  
この記事では、BigQueryを使っている組織に向けて、Dataformの概要・メリット・導入方法をわかりやすく紹介します。

## Dataformとは？

**Dataform** は、SQLで書かれたデータ変換処理を「モジュール化・自動化・可視化」できるツールです。  
Googleが提供しており、**BigQueryに特化**しています。

### 特徴まとめ：

| 機能             | 内容                                                |
|------------------|-----------------------------------------------------|
| SQLのモジュール化 | 同じ処理を複数箇所で再利用可能に                    |
| DAGによる可視化   | テーブルの依存関係をグラフィカルに表示               |
| 自動実行          | 定期実行スケジューラーをGUIで設定                     |
| Git連携           | SQLの変更履歴・レビューが可能                         |
| GUI中心           | dbtよりも学習コストが低く、導入しやすい              |

## dbtとの違いは？

| 比較項目   | dbt           | Dataform      |
|------------|----------------|----------------|
| UI/UX      | CLI中心        | GUI中心        |
| データ基盤 | 複数DB対応     | BigQuery専用   |
| 難易度     | やや高め        | わかりやすい   |
| ターゲット | エンジニア向け  | 分析者もOK     |

> dbtは強力なツールですが、「BigQuery＋非エンジニア」チームにはDataformが最適なケースもあります。

## 使ってみた（サンプル）

### プロジェクト構成の例：

```
/definitions
  ├─ sources/
  ├─ models/
  ├─ includes/
  └─ assertions/
```

### 例：SQLモデル

```sql
config {
  type: "table",
  tags: ["sales"]
}

SELECT
  user_id,
  SUM(order_amount) AS total_amount
FROM
  ${ref("raw_orders")}
GROUP BY
  user_id
```

### DAG（依存関係グラフ）

Dataformでは、SQLの依存関係を自動で解析し、以下のようなDAGが可視化されます。

```
raw_orders → summary_orders → dashboard_data
```

## 導入ステップ

1. [Dataform公式サイト](https://dataform.co) でプロジェクト作成（GoogleアカウントでOK）
2. BigQueryの接続設定を行う
3. SQLモデルを作成し、依存関係をrefでつなぐ
4. スケジューラーで定期実行設定
5. GitHub連携してレビュー体制を整備（任意）

## 導入して良かったこと

✅ 処理の流れが一目で分かるようになった  
✅ SQLがチームでレビューできるようになった  
✅ 手作業やcronによる運用を削減できた  
✅ データ資産が「設計図」として残るようになった  

## まとめ

Dataformは、「SQLを使ったデータ整形・ETL処理」をチームで効率化するための強力なツールです。

- BigQueryを利用している
- Airflow/dbtまでは不要
- GUIで簡単に始めたい

そんなチームに、Dataformは非常にフィットします。

## おまけ：こんなチームにおすすめ！

- SQLが属人化しているが、エンジニア以外も関わっている  
- データ変換の履歴管理やレビューを整備したい  
- 分析業務の「前処理」をスケールさせたい

## おわりに

Dataform、実際に触ってみると「めちゃくちゃ簡単に始められて、効果が大きい」ツールです。  
PoCから始めてみることをおすすめします。

## 補足

- 公式サイト：[https://dataform.co](https://dataform.co)  
- GitHub連携解説 → 別記事予定
完全ノーコードで、紙書類のスキャンデータから必要な情報だけを抽出する生成AIアプリを5分で作ってみた【ChatGPT】

無料のノーコード生成AI開発ツール（[ADFI生成AI](https://adfi.jp/ja/ga)）で、紙書類のスキャンデータから必要な情報だけを抽出する生成AIアプリを作ってみました！

これまで、OCRでは、紙書類の全ての文字を抽出してデータ化してしまうので、必要な情報だけ抽出することができませんでした。

この生成AIアプリを使えば、必要な情報だけを紙書類のスキャンデータから一発で抽出することができます！
しかも、手書き文字や外国語もOKです！

**これで、紙書類を手入力する作業は、この世から消滅ですね！**

作成手順は、以前の記事「[【RAG】自社データを使って回答する生成AIチャットをノーコードで作る手順【ChatGPT】](https://qiita.com/umapyoi/items/8daad620f58fb7528509)」で解説しています。

![アプリ概要.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/4f551d8c-d250-44cc-8294-d3ad2fbaa042.png)

# 試したデータ
紙の請求書をスキャンしたデータで試してみました！
（本物の紙の請求書なので、個人情報は赤字で伏せています）

invoice_20220809.pdf：1枚のみの請求書のPDF
invoice_20220502.pdf：3枚の請求書を1ファイルにまとめたPDF

![領収書.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/a246b456-92bd-4dc8-b9cf-2b325de56016.png)

# 情報抽出AIアプリ
無料のノーコード生成AI開発ツール「[ADFI生成AI](https://adfi.jp/ja/ga)」で、わずか5分（初期セットアップ時間を除く）で作成しました。

作成手順の記事：[【RAG】自社データを使って回答する生成AIチャットをノーコードで作る手順【ChatGPT】](https://qiita.com/umapyoi/items/8daad620f58fb7528509)

![アプリ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/69abbff7-73b6-45f1-b682-74e78ba27096.png)

### 利用手順
エクセルファイルで、抽出項目リスト（抽出したい項目のリスト）を作成します。
１列目（必須）：抽出する項目名。
２列目（オプション）：その項目をドキュメント内で特定するための補足情報。

![項目リスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/7cde1b21-605c-40cf-a284-8f5227410f33.png)

「抽出項目リスト名」に好きな名前を入力した後、「ファイルの選択」をクリック。
先ほど作成したエクセルファイルのリストを選択します。

![アプリ２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/a37320f0-64c4-4296-a143-15a442ca6be9.png)

「アップロード」をクリックすると、抽出項目リストのアップロードが実行されます。

![アプリ３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/125c9a8a-3b9d-41c6-aa43-b05a218ba390.png)

次に、アップロードした抽出項目リストのラジオボタンを選択した状態で、「ファイルの選択」をクリックします。
情報抽出したい紙書類のスキャンデータ（PDFまたは画像）を選択します。
![アプリ４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/f087d642-3ebb-4874-b299-961970ca0993.png)

「情報抽出を開始」をクリックすると、選択したスキャンデータから情報を抽出します。
![アプリ５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/1e44cda8-3ce9-43da-891b-06ab676d20b5.png)

抽出結果のCSVファイルをダウンロードします。


# 実行結果
### 1枚のみの請求書のPDF
全て完璧にデータを抽出できました。
請求書には請求元の会社名と請求先の会社名が記載されていますが、抽出項目リストの2列目で指定した通り「請求書の宛名の社名」を正しく抽出していました。
また、複数個所に記載されている「合計金額」も、正しく抽出されています。
アルファベットと数字が混ざっている「処理番号」も正確でした。

![領収書の抽出結果１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/18947ccd-e2e8-49c0-b547-ab2361fe6ad9.png)

### 3枚の請求書を1ファイルにまとめたPDF
こちらも、3枚の書類全てを完璧にデータを抽出できました。100％正確です！
なお、抽出結果のCSVファイルには、1ページ目から順に各項目の抽出結果が記載されていました。


![領収書の抽出結果２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/c90897a5-e55a-41cf-b5c7-6ad6ef358d3a.png)

# かかった費用

このAIエージェントの費用はどのくらいかというと、開発費は０円！
なんと、AI開発ツールである[ADFI生成AI](https://adfi.jp/ja/ga)は無料で利用できるので、お金をかけずに生成AIアプリを作成できます！

ランニング費用としては、ChatGPT（OpenAI API）の使用量に応じて、OpenAI APIの利用料が発生します。
使用する生成AIモデルの種類や、情報抽出するデータ量でトークン数が変わってくるため、どのくらい費用がかかるか一概には言えません。

あくまでも参考の数字ですが、
今回のPDFの情報抽出で計測したところ、2ファイルのPDF（合計4ページ）の情報抽出を行って、料金は、0.01ドル（＝約1.4円）でした、
つまり、紙書類1ページあたり、約0.35円で情報抽出できる計算になります。

仮に、1か月間に1000枚の紙書類を情報抽出したとしても月350円ですので、激安ですね！
🌟 Vol.8.18〜8.20 総まとめ：Struts2 テンプレート最適化・UI共通化設計編（共通レイアウト構築と動的UI出し分け）

Struts2ベースのJSP設計において、保守性・再利用性の要となるのが ***共通レイアウトの設計とテンプレート分離の最適化*** です。

このシリーズでは、Vol.8.18〜Vol.8.20 にかけて以下の実務的テーマを段階的に掘り下げました。

---

### ✅ 対象記事とポイント
### 📘 Vol.8.18：【Struts2】JSP構造のテンプレート最適化と共通レイアウト
🔗 https://qiita.com/juehara-crypto/items/8ba6ac7b1810c623d978

`<s:include>` や `header.jspf` を活用した共通化アプローチ

ヘッダ・フッタの部品化により、画面構造の一貫性と修正性を強化

ページ全体のテンプレート構成を見直す第一歩
---

### 📗 Vol.8.19：【Struts2】テンプレートの再利用応用
🔗 https://qiita.com/juehara-crypto/items/fdd403f97ff8900c6683

- レイアウト共通化の実践パターン

- `<c:if>` による UI 出し分けで、管理者／一般ユーザー向けに柔軟対応

- 既存のテンプレート構成をベースに動的な画面変化に対応
---

### 📘 Vol.8.20：【Struts2】テンプレート設計の完成形
🔗 https://qiita.com/juehara-crypto/items/87c087d862db3a9a1467

- baseTemplate.jsp をベースにしたページ種別テンプレート分離

- 一覧／フォーム／認証画面など、用途に応じたテンプレート再利用設計

- 共通レイアウトの「モジュール化」と「階層設計」の集大成
---
### 📌 このシリーズで得られる実務力
| スキル          | 内容                                        |
| ------------ | ----------------------------------------- |
| 🧱 テンプレート再利用 | 共通構造の再利用でコード重複を削減し、保守性UP                  |
| 🧩 動的UI制御    | `<c:if>` / `<c:choose>` による条件付きレイアウト切替    |
| 🧭 ページ種別設計   | 一覧／入力画面／詳細表示など、UI目的ごとにテンプレート分離            |
| 🧰 構造のモジュール化 | `baseTemplate` + セクション別include による柔軟な拡張構成 |

---
LoRaはなぜ“届かない”ときがある？ RSSIの誤解と電波の気まぐれを解説！

# LoRaはなぜ“届かない”ときがある？ RSSIの誤解と電波の気まぐれを解説！

こんにちは

今回は、LoRa（Long Range）の RSSI/SNR について話をしたいと思います。

LoRaは、IoTや環境センサなどで活用される「遠くまで届く」無線技術です。  
しかし実際に使ってみると、

- **「昨日は届いたのに、今日はダメ…」**
- **「RSSIは足りてるのに受信に失敗する」**
- **「-138dBmを下回るとダメって本当？」**

といった疑問やトラブルに直面することがあります。

この記事では、そうした「LoRaの不安定さ」に対する誤解を解きほぐし、  
**RSSIやSNRの実際の意味・LoRaの通信成功の条件**について、やさしく解説していきます。

> 📝この記事では、筆者が使用しているLoRaモジュール「LRA1」の挙動を前提に解説しています。一部のLoRa製品では「RSSIしきい値（RSSI Threshold）」を設定できる仕様も存在しますが、LRA1では明示的なしきい値設定はなく、**復調可能な限り受信を試みる設計**になっています。

---

## 「RSSIしきい値」は絶対じゃない

たまに、次のような質問をもらうことがあります：

> ❓「RSSIが -138dBm を下回ると、通信できなくなるのですが、これは仕様ですか？」

答えは **製品によります**。  
LoRaモジュールの中には、「RSSIしきい値（RSSI Threshold）」という設定項目を持ち、  
一定以下の信号を自動的に無視するよう設計されているものもあります。  
この場合、「この値を下回ると通信できなくなる」と感じるのも自然です。

一方で、筆者が使用しているLoRaモジュールでは、そうしたしきい値設定は用意されておらず、**可能な限り受信を試みる**設計になっています。

たとえば、SX1276チップが公称する **受信感度の目安** はだいたい -137〜-140dBm程度。  
これはあくまで**受信が難しくなる“境界”の目安**であって、  
明確な「カットオフ（絶対受信不可）」という仕様ではありません。

実際には、**-137dBmでも失敗することがあれば、-139dBmで成功することもある**など、  
通信成立はSNRや環境条件に強く依存します。

つまり、「-138dBm」は**“受信成功率が下がり始めるライン”**と考えるのが適切で、  
この値そのものが仕様で定められた「しきい値」だと誤解しないことが大切です。

---
## LoRa通信は確率で成立している

無線通信は本質的に「確率で成立する」ものです。  
Wi-Fiや携帯電波でも、「バーが立ってるのに途切れる」経験はありますよね。

LoRaも同様で、

- **RSSI（信号強度）**
- **SNR（信号対雑音比）**
- **SF（Spreading Factor）**
- **BW（Bandwidth）**
- **CR（Coding Rate）**

などのパラメータと環境条件が合わさって、  
**成功率が上がったり下がったりする**仕組みになっています。

---
## RSSIだけじゃ足りない、SNRがカギ

LoRaは「微弱な信号でも受信できる」ことが特徴ですが、  
実際の受信成功を左右するのは、**RSSIだけではなくSNRも重要**です。

| 値 | 意味 | 傾向 |
|----|------|------|
| **RSSI** | 信号の“強さ” | 強いほど受信しやすいが、ノイズ次第では失敗も |
| **SNR** | 信号とノイズの“差” | 高いほど読み取りやすく、LoRaでは-20dBも許容可 |

たとえば──

- **RSSI = -138dBm／SNR = +10dB** → 成功する可能性は高い  
- **RSSI = -130dBm／SNR = -15dB** → 成功率はむしろ低い

> 🔍 LoRaではSNRが -20dB に近づくと、いかに信号が強くても失敗しやすくなります

ただ、大抵はRSSIが低下するとSNRも低下する傾向なのは変わりません。

---

## 実は地下でもLoRaは届く！？でも…

筆者は自宅でLoRaWAN環境を実験的に運用しており、  
**RCの地下室に設置したLoRa端末**でも問題なく定常的に通信がきています。

このとき、RSSIやSNRが周囲の環境に影響されて、
**時間とともに大きく変動する現象**が観察されました。
**いずれ別の記事で、実測データとあわせて詳しく紹介する予定です。**

---

## -138dBmってどれくらい弱い？

この数字、実際には驚くほど微小な電力です。

- **電力：1.58 × 10⁻¹⁷ W（ワット）**
- **電圧（50Ω換算）：約 0.126μV**

つまり、LoRaは「針が落ちる音どころか、電子のため息レベルの信号」を聞き取っているイメージです。

一般的なLoRaデバイスの出力は 20mW です。
$20\mathrm{mW} \div (1.58 \times 10^{-17}\mathrm{W}) = 1.26 \times 10^{15}$

なんと、受信器では 1260兆分の1のパワーになっていますが、聞き分けられるってことです。
ちょっと凄いと思いませんか？

---

## 結論：LoRaは不確実。でも設計しがいがある！

LoRa通信は、こうした不確実性を前提に

- **パラメータを調整して成功率を高める**
- **リトライや冗長性を加えて信頼性を確保する**
- **「届かなかったとき」も織り込んだ設計をする**

といった工夫が必要です。

**この“ちょっと不確実なものをどう扱うか”がLoRaの面白さ**であり、  
プロトコル設計者の腕の見せどころでもあります。

---

## 観測と工夫がLoRaを制する

LoRaは“確率で届く通信”です。  
成功するか失敗するかは、ちょっとした環境変化に左右されます。

でもそれは、単なる弱点ではありません。  
観察して工夫すれば、**むしろ“設計の楽しさ”を味わえるポイント**になります。

> 📡「ギリギリ届いた！」  
> そんなときの感動こそ、LoRaの魅力かもしれません。

>🎀「“RSSIだけ見てたらハマった！”って人、意外と多いかも…？
>LoRaともっと仲良くなれるヒントになったらうれしいなっ📶」

---

## 🔗 関連リンク

- [LoRaWANとP2Pの違いとは？](https://blog.shachi-lab.com/005_lora_lorawan_vs_p2p)
- [湿度が102%!? センサの換算ミス体験談](https://blog.shachi-lab.com/009_humidity_over100)
- [しゃちらぼブログ](https://blog.shachi-lab.com)
- [GitHub：@shachi-lab](https://github.com/shachi-lab)

---

## 📨 ご質問・フィードバックはこちらへ

- X（旧Twitter）：[@shachi_lab](https://x.com/shachi_lab)
- GitHub IssuesでもOKです！
生成AIアップデート（2025/5/12週）

[週刊生成AI with AWS](https://aws.amazon.com/jp/blogs/news/weekly-genai-20250512/)

## Amazon Bedrock Guardrails がクロスリージョン推論をサポート

`ガードレールは、Amazon Bedrockでホストされているもの、自己ホストモデル、ApplyGuardrail APIを使用してBedrock外のサードパーティモデルなど、あらゆる基盤モデルに適用でき、一貫したユーザエクスペリエンスを提供`

クロスリージョン推論のサポートにより、トラフィックの急増時に複数の AWS リージョンにわたって計算リソースをシームレスに活用できます。



## AWS Transform for mainframe が一般提供開始

メインフレームアプリケーションを大規模にモダナイズするための初のエージェント型 AI サービスです。COBOL、CICS、DB2、VSAM などの IBM z/OS Db2 上に構築されたレガシーアプリケーションの最新クラウド環境へのモダナイゼーションを数年から数ヶ月に短縮します。

![{D1557D03-6A2E-45E7-843D-0C0E0558F3DE}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/024a5b10-434a-480a-8296-18f25af08b18.png)

[引用](https://aws.storylane.io/share/gccxe8tuwt4m)

`ドキュメンテーション機能`：
メインフレームアプリケーションの技術と機能性に関する包括的なドキュメントを作成します。
機能、プログラムロジック、データフローに関する重要な知識を保持します。


![{4E783670-3455-41C9-A454-BA664773848C}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/2d298cf3-e88a-45f8-ade3-471fcd3f8830.png)


[引用](https://aws.amazon.com/jp/blogs/news/accelerate-the-modernization-of-mainframe-and-vmware-workloads-with-aws-transform/)




## AWS Transform for VMware が一般提供開始
大規模な VMware モダナイゼーションを簡素化する初のエージェント型 AI サービスです。
大規模言語モデル、グラフニューラルネットワーク、および AWS のエンタープライズワークロード移行における深い経験を活用しています。

`検出`
AWS Transform は、AWS Application Discovery Service コレクターを使用して VMware 環境を自動的に検出します。

`プロビジョニング`
接続先AWSアカウントの情報など入力

`デプロイ`
移行プロセス。MGNを設定し、EC2への移行を開始
iOS向けおすすめAndroidエミュレーター5選【2025】

iOSデバイスでAndroidアプリを実行したい方のために、2025年最新のおすすめAndroidエミュレーターを5つご紹介します

✅ iOS向けAndroidエミュレーターおすすめ5選（2025年版）

## 1. LambdaTest

[LambdaTest](https://www.lambdatest.com/?utm_source=qiita&utm_medium=organic&utm_campaign=may_23&utm_term=android_emulator_ios&utm_content=blog)は、クラウドベースのAIネイティブテストプラットフォームで、5000以上のデバイスとOSの組み合わせでモバイルアプリのテストが可能です。

主な特徴:

- さまざまなAndroid OSバージョンでのアプリテストをサポート
- 3Gや4Gなどのネットワーク条件をエミュレート可能
- リアルタイムでのバグの特定と修正が可能
- 地理的な位置情報を利用したテストが可能
- 異なる画面サイズや解像度でのレスポンシブテスト
- ワンクリックでのバグ報告機能
- テスト結果の包括的なレポートを提供
- 実際のデバイス環境でのテストが可能

使用手順:

- LambdaTestアカウントを作成し、ログインします。
- ダッシュボードで「Real Time」を選択します。
- Virtual Mobile」セクションでアプリをアップロードし.
- デバイスとOSバージョンを選択して「Start」をクリックします。

## 2. iNDS Emulator

iNDS Emulatorは、iOSデバイスでNintendo DSゲームをプレイするためのエミュレーターで、脱獄不要で利用できます。

主な特徴:

- Nintendo DSゲームのプレイが可能
- マルチプレイヤー機能、カスタマイズ可能なコントロール、ゲームの保存とロード機能
- ユーザーフレンドリーなインターフェース
- サードパーティ製コントローラーのサポート
- .nds、.zip、.rarなどのファイル形式に対応
- チートコードのサポート、カスタマイズ可能なグラフィック設定、フルスクリーンモード
- 定期的なアップデートによるバグ修正と新機能の追加

注意点:

- バッテリーの消耗が早く、デバイスの過熱の可能性があります。
- インターフェースに慣れるまでに時間がかかる場合があります。
エミュレーターの高負荷により、パフォーマンスが低下する可能性があります。

## 3. Dalvik Emulator

Dalvik Emulatorは、Myriadグループによって開発されたiOS向けのエミュレーターで、iPadやiPhoneでの安定したパフォーマンスを提供します。

主な特徴:

- Androidアプリをスムーズに実行可能
- Javaソースコードから生成されたDEXファイル形式を使用
- ジャストインタイムコンパイルにより、高速なパフォーマンスを実現
- 幅広いアプリやゲームとの互換性

注意点:

- インストールプロセスが複雑で、ストレージ容量を多く消費します。

## 4. iAndroid

iAndroidは、iOSデバイスでAndroid環境をエミュレートするための人気のあるエミュレーターで、iPhone、iPad、iPod Touchで動作します。

主な特徴:

- Cydiaから入手可能で、脱獄不要
- iOS 5以降のデバイスと互換性あり
- Google Playストアの機能を体験可能
- 定期的なバグ修正とアップデート

注意点:

- 初心者には操作が難しい場合があります。
- バッテリーの消耗が早くなる可能性があります。


## 5. Appetize.io

Appetize.ioは、Webブラウザ上でモバイルアプリを実行できるエミュレーターで、ダウンロード不要でiOSやAndroidアプリをテストできます。

主な特徴:

- Webブラウザで直接アプリを実行可能
- 共有可能なリンクの生成
- 追加のプラグイン不要
- 縦向きおよび横向きの両方に対応
- タッチジェスチャーやユーザーインタラクションのシミュレーション
- すべての主要なブラウザと互換性あり

注意点:

- アプリ起動時にスマートフォン設定がデフォルトになるため、好みに合わない場合があります。

## 結論

Androidエミュレーターは、アプリ開発やテストのための制御された環境を構築するのに役立ちます。iOS向けのAndroidエミュレーターの利用可能性により、iOSデバイスでAndroidアプリを楽しみたいユーザーの体験が大きく向上します。

本記事では、iOS向けの主要なAndroidエミュレーターを紹介し、それぞれの主な機能と欠点について解説しました。多くのエミュレーターは、リアルタイムテスト、アクセシビリティ評価、パフォーマンス分析といった利点を提供します。しかし、実際のデバイス環境を完全に再現する点では制限があります。

また、LambdaTestのようなクラウドベースのエミュレーターも紹介しました。これは、コスト効率が高く、スケーラブルで、簡単にアクセスできるテスト環境を提供します。
究極のYouTubeダウンローダー - ssyoutube.onlineを覗いてみよう

YouTube動画をオフラインで頻繁に視聴する方なら、信頼できる <a href="https://ssyoutube.online">youtube downloader</a> の重要性を既にご存知でしょう。オフライン学習用の教育コンテンツ、プレイリスト用のミュージックビデオ、後で参照するためのチュートリアルなど、YouTube動画のダウンロードは今や一般的なニーズとなっています。そこでssyoutube.onlineの出番です。わずか数クリックでYouTube動画をダウンロードできる、高速で使いやすいソリューションです。

**ssyoutube.onlineとは？**

ssyoutube.onlineは、YouTube動画をデバイスに直接保存できる無料のWebベースのYouTubeダウンローダーです。ソフトウェアのインストールや登録、アカウントの作成は不要です。動画のURLを貼り付け、フォーマットと画質を選択するだけでダウンロードできます。とても簡単です。

**ssyoutube.onlineの主な機能**

**1.高速ダウンロード：**
このプラットフォームは速度に最適化されており、ユーザーは煩わしい遅延なしに動画をすばやくダウンロードできます。

**2. 多様なフォーマット：**
MP4、WEBM、さらにはMP3などの音声フォーマットなど、様々なフォーマットから選択できるため、多用途に使えるYouTubeダウンローダーです。

**3. HD画質：**
元の動画の画質に応じて、720p、1080p、さらには4Kでコンテンツをダウンロードできます。

**4. モバイル対応：**
ssyoutube.onlineはモバイルデバイスでもシームレスに動作するため、外出先でも便利です。

**5. 広告なし、スパムなし：**
多くの無料ツールとは異なり、このサイトはユーザーエクスペリエンスをすっきりと整え、邪魔にならないようにしています。

**ssyoutube.onlineの使い方**

**1.** YouTubeにアクセスし、ダウンロードしたい動画のURLをコピーします。

**2.** ブラウザを開き、ssyoutube.onlineにアクセスします。

**3.** 入力ボックスにURLを貼り付け、「ダウンロード」ボタンを押します。

**4.** 希望のフォーマットと画質を選択します。

**5.** クリックすると、ファイルをデバイスに直接ダウンロードします。

これは、オンラインで利用できるYouTubeダウンローダーツールの中で最もシンプルで使いやすいものの1つです。

**ssyoutube.onlineを選ぶ理由**

YouTube動画をダウンロードできるツールは数多くありますが、ssyoutube.onlineは信頼性と速度で際立っています。ポップアップ広告が表示されたり、怪しいサイトにリダイレクトされたりすることはありません。使いやすさ、セキュリティ、効率性を重視するユーザーにとって、このYouTubeダウンローダーは最適な選択肢です。

**まとめ**

コンテンツオンデマンドの時代において、ssyoutube.onlineのような効率的なYouTubeダウンローダーを利用できるかどうかは大きな違いです。学習、娯楽、仕事など、どのような目的で動画を保存する場合でも、このツールを使えば迅速かつ簡単に作業を完了できます。

次回YouTubeから動画をダウンロードする必要があるときは、ssyoutube.onlineを試してみてください。きっとあなたの頼りになるYouTubeダウンローダーになるかもしれません。
📘 Vol.8.20：【Struts2】テンプレート設計の完成形 〜 ページ種別テンプレート／共通レイアウトのモジュール化と階層設計 〜

Struts2におけるJSPテンプレートの設計を、***実務レベルの再利用性と保守性***を前提に最適化する「完成形」をご紹介します。
Vol.8.18〜8.19の内容をベースに、「ページ種別ごとのテンプレート分離」や「共通レイアウトの継承設計」といったプロジェクトで役立つ構成パターンを解説します。

---

### ✅ 本記事で扱う内容
- ページ種別（一覧／フォーム／認証系など）ごとのテンプレート階層設計

- 共通ベーステンプレート `baseTemplate.jsp` の導入

- `<s:include>` による柔軟な UI 出し分け

- ロール別ヘッダ・メニューの差し替え設計（一般／管理者）

---

### 📁 ディレクトリ構成例（実務パターン）

```bash
/WebContent/
├── common/
│   ├── baseTemplate.jsp      # 共通レイアウトのベース
│   ├── header.jspf           # 共通ヘッダー部品
│   ├── footer.jspf           # 共通フッター部品
│   ├── menu_user.jspf        # 一般ユーザー用メニュー
│   ├── menu_admin.jspf       # 管理者用メニュー
│
├── template/
│   ├── listTemplate.jsp      # 一覧表示画面用テンプレート
│   ├── formTemplate.jsp      # 入力フォーム画面用テンプレート
│   ├── authTemplate.jsp      # 認証画面（ログインなど）テンプレート
```

---

### 🛠 テンプレート階層のポイント

| 観点                | 内容                                         |
| ----------------- | ------------------------------------------ |
| 📌 ページ種別テンプレート化   | 用途に応じてテンプレートを明確に分離（一覧／フォーム／認証）             |
| 📌 共通テンプレート継承     | 各テンプレートが `baseTemplate.jsp` をベースに構成        |
| 📌 includeによる分離設計 | `<s:include page="..."/>` で部品化したUIを柔軟に組み込み |
| 📌 ロール別出し分け対応     | `<c:if>` などで、セッション中の権限ごとに動的UIを出し分け         |
---

### 💡 応用シナリオ（実務展開例）
- サイト全体メンテナンス時に専用テンプレートで切り替え

- モバイル／PC のテンプレートを User-Agent 判定で自動切替

- ライト／ダークモードの動的テンプレート切替（フロント制御併用）

---

### 🔄 関連記事
- [📘 Vol.8.18：【Struts2】JSP構造のテンプレート最適化と共通レイアウト〜 <s:include> / header.jspf / 共通テンプレート構成の実務設計 〜](https://qiita.com/juehara-crypto/items/8ba6ac7b1810c623d978)

- [📗 Vol.8.19：【Struts2】テンプレートの再利用応用 〜 レイアウト共通化 × 動的UI部品の出し分け設計 〜](https://qiita.com/juehara-crypto/items/fdd403f97ff8900c6683)

---

### 🔜 次回予告
次回 ***Vol.9.0*** からは、Struts2の ***バリデーション／コンバージョン処理** をテーマに進めていきます。
`validate()` メソッドや `validation.xml`、`conversion.properties` を活用した、***実務で使える入力チェック＆変換の基本と応用パターン***を取り上げていきます。

---
配列の要素を取捨選択できる ruby のメソッド

Ruby のメソッドで配列から特定の条件に合う要素を選択する系のメソッド3つ。
# `select` メソッド

特定の条件に**合致する**要素のみを返すメソッド。

```ruby
ingredient = [にんじん, りんご, バナナ, 豚バラ肉, ぶなしめじ, ピーマン, 桃]

# select メソッドで果物のみ抽出 (フルーツ美味しいもんね)
ingredient.select { |ing| ing.fruit? }
# => [りんご, バナナ, 桃]
```

# `reject` メソッド

特定の条件に**合致しない**要素のみを返すメソッド。
裏を返せば、条件に合致した要素を除くことができるメソッド。

```ruby
ingredient = [キャベツ, ほうれん草, バナナ, パプリカ, 鶏肉, みかん]

# reject メソッドで野菜のみ抽出 (野菜嫌い)
ingredient.reject { |ing| ing.vegetable? }
# => [バナナ, 鶏肉, みかん]
```

# `partition` メソッド

上記の `select` メソッドと `reject` メソッドを一挙にやってくれるメソッド。
条件に合致する要素の配列と、条件に合致しない要素の配列とを返す。

```ruby
ingredient = [ふぐ, 毒リンゴ, ぶどう, ヘビ, 納豆]

# partition メソッドで毒の有無で分別 (納豆は腐っているだけで、毒はない)
ingredient.partition { |ing| ing.poison? }
# => [[ふぐ, 毒リンゴ, ヘビ], [ぶどう, 納豆]]
```

# 参考サイト

- selectメソッドの[公式リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/select.html)
- rejectメソッドの[公式リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/reject.html)
- partitionメソッド[の公式リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/partition.html)
個人的な資格の受かり方~HTML5プロフェッショナル認定試験 レベル2~

## 1. はじめに
社会人3年目のエンジニアがHTML5プロフェッショナル認定試験レベル2（Ver2.5）に合格したので、使用した参考書や問題集、勉強方法などをまとめてみたいと思います。
レベル1に合格したときの記事はこちらから↓↓
[個人的な資格の受かり方~HTML5プロフェッショナル認定試験 レベル1~](https://qiita.com/t_tsuru/items/ae0e32881740be5bdd5a)

## 2. 受験した理由と受験前の印象
今回レベル2を受験しようと思った理由としては次の2点です。
<ul>
    <li>業務でJavaScriptを触る機会があるが、いまいちソースの読み方がわからない</li>
    <li>レベル1を取得できたので、レベル2も取得しておきたい</li>
</ul>

まず1点目ですが、普段の業務内容としてはJavaを触る機会がダントツで多く、JavaScriptもたまに触るといった感じです。
そしてJavaScriptを触るたびに思っていたのが、
「function(){}の中でさらにfunction(){}を記述する形で、関数の中で新たに関数を定義している？」、
「constとlet、varが違うのは分かるけど、letとvarって何が違うの？」、
「const 〇〇 = function()のように変数宣言する形で関数を定義している？なんで？」
のように、Javaとは感覚が違っていて分からないことだらけでした。
そこでレベル1を取得したこともあり、良い機会なのでJavaScriptの勉強がしたいと思い受験を決めました。

レベル1を受験してから日が浅く、頻度は低いですが業務でJavaScriptに触れることはあったので、受験前の印象は悪くなかったです。
強いて言えば、レベル1と比べて本番の問題数が減っているにもかかわらず試験時間は長くなっているので、そこだけは少し不安でした。

## 3. 使用した参考書
今回の資格勉強で使用した参考書、問題集を紹介します。

<table>
    <tr>
        <th>参考書</th>
        <td>
        HTML5プロフェッショナル認定試験レベル2 対策テキスト&問題集 <br>
        Ver. 2.5対応版 <br>
        発行：株式会社 マイナビ出版（2022/11/16 初版第1刷発行）
        </td>
    </tr>
    <tr>
        <th>問題集</th>
        <td>
        HTML5プロフェッショナル認定試験レベル2 スピードマスター問題集 <br>
        Ver. 2.0対応 <br>
        発行：株式会社 翔泳社（2022/1/25 初版第2刷発行）
        </td>
    </tr>
</table>

まず参考書については、レベル1の資格勉強をしていた時に使っていたものと同じシリーズという理由で選びました。
相変わらず字が大きく、説明も丁寧で読みやすかったです。
特に参考書の前半部分ではコードの記述例が多く載っていて、自分の手元で実際に書いてみることができたので、動きがイメージしやすく、モチベアップにもなりました。
後半部分の少しややこしい範囲も、コードの記述例が載っていたり、各オブジェクトの持つプロパティが整理されていたりと勉強しやすい印象でした。

続いて問題集ですが、参考書だけでは埋めきれなかった知識も補うことができました。
特にレベル2の参考書はレベル1のものと比べて載っている問題が少なかったので、問題集の方で数をこなせた効果は大きかったと思います。

## 4. 勉強方法
参考書と問題集を使って、どのように勉強していたかを紹介したいと思います。

<ol>
    <li>
    参考書1周目<br>
    まず初めに、ひとまず参考書を軽く1周読みました。<br>
    コード例を自分の手元で動かしてみたりしつつ、慣らすところから始めました。
    </li>
    <li>
    参考書2周目<br>
    2周目は覚える気持ちで読みました。<br>
    といっても、すべて暗記しないと次のページに行けないというようなガッツリしたものではなく、覚える「気持ち」です。<br>
    1周目読んでた時こんなのあったな～くらいの気持ちで読みました。
    </li>
    <li>
    問題集スタート<br>
    参考書を2周読み終わったところで問題集に手を付け始めました。<br>
    もともと業務でJavaScriptを触っていることもあり、問題が何一つ分からないような感じではなかったです。<br>
    少しずつ進めながら間違えた問題は解説をしっかり読み、同時に参考書も確認して何が間違っていたのかをはっきりさせるようにしていました。
    </li>
    <li>
    参考書と問題集の繰り返し<br>
    ここまで来たら、あとは参考書と問題集をひたすら繰り返していました。<br>
    自分の場合、夜は眠くて参考書は読んでいられないので、「夜は問題集を解いて朝は参考書を読む」のように夜と朝に勉強時間を取る流れが取り組みやすかったです。<br>
    最終的に参考書は4周くらい、問題集は3周くらいしたと思います。
</ol>

また、レベル1を受けたときに細かいところまで出題される印象を受けたので、参考書を読むときはそのあたりも意識していました。
例えば、File APIにはloadイベントとloadendイベントがあり、それぞれ以下の場合に発火するようになっています。

<ul>
    <li>
    loadイベント：ファイルの読み込みが<b>正常に終了したとき</b>に発火
    </li>
    <li>
    loadendイベント：<b>成功・失敗に関わらず</b>、ファイルの読み込みが終了したときに発火
    </li>
</ul>

このようなイベントはFile API以外にもあるのでややこしかったのですが、できる限り区別がつくようにしていました。

## 5. 結果と受験後の印象
問題を全て解き終わったときは8割くらい取れている感覚があったんですが、結果は合格点を2点だけ上回っての合格でした。
不正解があと1問あれば落ちていたかもしれないので、合格できてほっとしています。
受験後の印象としては、参考書と問題集をやっておけば本番で完全に初見の問題はほぼ無かった気がします。
また、試験時間にも余裕をもって解き終えることができました。

今回はギリギリの合格ではありましたが、受験にあたって勉強したことで、JavaScriptの理解度はかなり上がった実感があります。
やはり業務で実際に使っている分野の勉強をすると、成果を感じやすくモチベーションも上がります。
HTML5プロフェッショナル認定試験としては以上になるので、他の資格にも挑戦していきたいと思います。
Linux ローカライズ

# ローカライズ

アプリケーションを異なる国、地域に対応させるプロセス。

https://qiita.com/AsahinaKei/items/ae5a6c53f12abafa2e93#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%A9%E3%82%A4%E3%82%BA%E3%81%A8%E3%81%AF

## 代表的なロケール

ロケールを表す文字列は以下のフォーマットで定められている。

```text:ロケールのフォーマット
言語_国.エンコーディング
言語_地域.エンコーディング
```

| ロケール | 説明 |
|:-|:-|
| `C`、`POSIX`| 伝統的な POSIX 標準<br>ASCII |
| `ja_JP.UTF-8` | 日本語（日本）<br>UTF-8 |
| `ja_JP.shiftJIS` | 日本語（日本）<br>シフトJIS |
| `en_US.UTF-8` | 英語（アメリカ）<br>UTF-8 |
| `en_GB.UTF-8` | アメリカ（イギリス）<br>UTF-8 |

※ `UTF-8` は `utf8` でも良い


## 環境変数

ロケールには **カテゴリ** が存在し、[環境変数](https://qiita.com/AsahinaKei/items/22d9fae93cabfbf137ee#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0) を用いて設定が行われる。

設定値は `LC_ALL` が最も優先度が高く、他の設定値を上書き（無効化）することができる。

| カテゴリ | 説明 | 優先度 |
|:-|:-|:-|
| `LC_ALL` | すべてのカテゴリを一括設定（**最も優先される**） | **高** |
| `LC_CTYPE` | 文字の分類（文字種、マルチバイトなど比較、分類の規定） | - |
| `LC_COLLATE` | 文字列の並び順（ソート順）<br>collate=照合する、比較する | - |
| `LC_TIME` | 日付・時刻の表示形式 | - |
| `LC_NUMERIC` | 数値の表示形式 | - |
| `LC_MONETARY` | 通貨の表示形式 | - |
| `LC_MESSAGES` | メッセージの言語（エラーメッセージなど） | - |
| `LANG` | すべてのカテゴリを一括設定（**デフォルト値**） | **低** |

## `$ locale`

```console:現在のロケール設定を確認する
$ locale 
```

```console:設定可能なロケールを一覧表示する
$ locale -a
```

```console:設定可能な文字コードを一覧表示する
$ locale -m
```

## `$ iconv`
international conversion

```console:文字コードを変換する（from to）
$ iconv -f 変換前 -t 変換後 ファイル
```

```console:使用可能な文字コードを一覧表示する
$ iconv -l
```

# タイムゾーン

[システムクロック](https://qiita.com/AsahinaKei/items/210968ca8af2323c3c32#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF) は （Universal time coordinated：協定世界時）で動作しており、表示される日時はローカルタイム（現地時刻）に変換されてユーザーに表示される。

このとき **タイムゾーン** がローカルタイムの変換に使われる。

## `/usr/share/zoneinfo/`

タイムゾーンがバイナリファイルとして保存されているディレクトリ。世界中のタイムゾーンが保存されている。

## `/etc/localtime`

現在のシステムが使用しているタイムゾーン情報を保持するファイル。

通常、`/usr/share/zoneinfo/` 配下のファイルのコピー、もしくは [シンボリックリンク](https://qiita.com/AsahinaKei/items/8d43c366f061a27ad670#%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF) が配置される。

```console:シンボリックリンクの設定
$ ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

`/usr/share/zoneinfo/` ファイルを差し替えることで、システムのタイムゾーンを変更することができる。

## `/etc/timezone`

現在のタイムゾーン（例：`Asia/Tokyo`）などがテキスト形式で保存されたファイル。

主に Debian 系ディストリビューションで使用される。

## `TZ`

[環境変数](https://qiita.com/AsahinaKei/items/22d9fae93cabfbf137ee#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0)。

プロセスに対して一時的に適用されるタイムゾーンを指定することができる。

```console:一時的にタイムゾーンを変更してコマンドを実行する
$ TZ=タイムゾーン コマンド
```

## `$ tzselect`

対話形式でタイムゾーンを **選択できる** [スクリプト](https://qiita.com/AsahinaKei/items/615316c04d32b34e9fa8)。

あくまでも「どのタイムゾーンを設定すると良いか」が表示されるだけであり、設定自体は行われない。

```console:自身に適したタイムゾーンを対話形式で確認する
$ tzselect
```

## `$ tzconfig`

:::note alert
古いコマンドのため非推奨
:::

`/etc/timezone` と `/etc/localtime` の両方に設定を行うコマンド。

現在では以下のコマンドが代わりに使用される。

```console:対話形式で /etc/localtime と /etc/timezone を設定s
$ sudo dpkg-reconfigure tzdata
```

# `$ timedatectl`

https://qiita.com/AsahinaKei/items/210968ca8af2323c3c32#-timedatectl
Atcoder 解答例 ABC 061 B - Counting Roads

#ABC 061 B - Counting Roads 解答例
問題は[こちら](https://atcoder.jp/contests/abc061/tasks/abc061_b)

```C++
#include <iostream>
#include <string>
#include <map>
#include <cstring>
using namespace std;

int main() {
    int N;
    int M;

    // 都市の番号が格納される
    // 同じインデックス同市の都市がつながる
    int a[51];// 要素数:M
    int b[51];

    // 各都市から伸びる道路の本数を格納(都市の番号は1以上)
    int rdHist[51]; // 要素数:N
    memset(rdHist, 0, sizeof(rdHist));

    cin >> N;
    cin >> M;

    for (int i = 1; i <= M; i++) {
        cin >> a[i];
        cin >> b[i];
    }

    // 各都市から伸びる道路の本数をカウント
    for (int i = 1; i <= M; i++) {
        // a,bは1以上
        rdHist[a[i]]++;
        rdHist[b[i]]++;
    }

    // 各都市から伸びる道路の本数を出力
    for (int i = 1; i <= N; i++) {
        std::cout << rdHist[i] << std::endl;
    }

    return 0;
}
```  
各変数の取りうる範囲をしっかりコードにコメント残した方がいいかも(ミスるため)
スミレ畑、やってみた。 その8

# 概要
日本語プログラミング言語、スミレ畑、見つけたので、やってみた。
練習問題やってみた。

# 練習問題
湯婆婆を書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2581dba6-df1a-4f57-b7b4-95dd90e0cbf1.png)

# サンプルコード

```
「契約書」を　出力する
改行する
「甲は油屋当主として、乙を油屋に雇用することを」を　出力する
「契約し、労働に伴う対価の支払いを右の通り、約定する。」を　出力する
「なお、一日の労働の対価は金百円とする。」を　出力する
改行する
「甲　油屋当主　湯婆婆」を　出力する
改行する
「乙」を　出力する
改行する
「契約書だよ。そこに名前を書きな。」を　出力する
改行する
「名前は」と聞いて名前とする
「フン。」を　出力する
名前を　出力する
「というのかい。贅沢な名だねぇ。」を　出力する
改行する
名前2は、名前の(1から名前の文字数までの乱数)文字目
「今からお前の名前は」を　出力する
名前2を　出力する
「だ。いいかい、」を　出力する
名前2を　出力する
「だよ。分かったら返事をするんだ、」を　出力する
名前2を　出力する




```

# 実行結果

```
契約書
甲は油屋当主として、乙を油屋に雇用することを契約し、労働に伴う対価の支払いを右の通り、約定する。なお、一日の労働の対価は金百円とする。
甲　油屋当主　湯婆婆
乙
契約書だよ。そこに名前を書きな。
フン。腹美恵子というのかい。贅沢な名だねぇ。
今からお前の名前は恵だ。いいかい、恵だよ。分かったら返事をするんだ、恵
```

以上。
グラフィック関連の用語備忘録

# はじめに
自分が忘れそうなグラフィック関連の用語をまとめた記事です。
自分が忘れそうな用語という基準で選定した用語しか載っていないので、参考になるものが多くはないと思います。
また、間違っている情報が載っていた際には指摘してくださると助かります。

# ラスタライズ
ベクター形式のデータ(よく使うデータでいえば svg拡張子のデータとか)を画像化(ドット絵のような感じ)する処理のことを**ラスタライズ**と呼ぶ
ラスタライズされた後の画像を**ラスター形式**と呼ぶ

ベクター形式の画像は ズームしても線のまま
ラスター形式の画像は ズームするとドットが見える

# 深度バッファ（Zバッファ）
英語では depth buffer / z buffer
画像の奥行を保存する領域のことを言う。
特定のピクセルに対してそのピクセルの奥行の情報を返してくれる

イメージとしては
```cs
float[][] depthBuffer = new float[1980][1080];

// 任意のピクセルに対して奥行を返す
float GetDepth(int pixelX, int pixelY)
{
    return depthBuffer[pixelX][pixelY]
}
```

参考にしたサイト:
https://nn-hokuson.hatenablog.com/entry/2018/02/08/194943

# 深度バッファ法
深度バッファを用いて見えない3Dオブジェクトを描画しないようにする方法のこと

参考にしたサイト:
https://e-words.jp/w/Z%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E6%B3%95.html
📗 Vol.8.19：【Struts2】テンプレートの再利用応用 〜 レイアウト共通化 × 動的UI部品の出し分け設計 〜

### ✅ 概要
本記事では、Vol.8.18で構築した**共通テンプレート構造**をベースに、さらに一歩踏み込んで「**テンプレート再利用の応用パターン**」について解説します。画面種別・ユーザー状態・ページ機能に応じたUIの出し分けや、テンプレートレベルでの共通化技法にフォーカスします。

---

### 🎯 対象読者
- Struts2ベースで複数画面構成のJSP設計を最適化したい方
- ヘッダー/メニュー/フッターの出し分けを行いたい方
- テンプレート構造を拡張しつつ保守性を高めたい方

---

### 🧱 基本構成の再確認（Vol.8.18）
```jsp
<%@ include file="/common/header.jspf" %>
<s:include value="%{bodyPage}" />
<%@ include file="/common/footer.jspf" %>
```
---

### 💡 再利用応用パターン①：ログイン状態による出し分け

```jsp
<c:choose>
  <c:when test="${sessionScope.user != null}">
    <jsp:include page="/common/menu-loggedin.jspf" />
  </c:when>
  <c:otherwise>
    <jsp:include page="/common/menu-guest.jspf" />
  </c:otherwise>
</c:choose>
```
- 利用シナリオ：ログインユーザーか否かでメニュー構造を変更

- 実装効果：テンプレート構造を維持しつつ動的切替が可能
---
### 💡 再利用応用パターン②：ページ種別ごとのタイトル・CSS切り替え
```jsp
<c:set var="pageTitle" value="${pageScope.title != null ? pageScope.title : '共通タイトル'}" />
<title><c:out value="${pageTitle}" /></title>

<link rel="stylesheet" href="/css/common.css" />
<c:if test="${pageScope.specialCss != null}">
  <link rel="stylesheet" href="/css/${specialCss}" />
</c:if>
```
- 利用シナリオ：詳細画面だけ別スタイル適用 など

- 実装効果：柔軟なレイアウト調整が可能

---
### 🧩 応用パターン③：bodyPage変数の切り替えによる柔軟な画面切替
Actionクラスから以下のように ***bodyPage*** を動的に設定：

```java
bodyPage = "/view/UserManagementScreen.jsp";
```
テンプレートではそれを `<s:include value="%{bodyPage}"/>` で呼び出し。

- 実装効果：テンプレート側を修正せず画面だけ切り替え可能

---
### 🏗 応用パターン④：共通テンプレート構造 × ロール別表示制御
```jsp
<c:if test="${sessionScope.user.role == 'ADMIN'}">
  <s:include value="/admin/tools.jspf" />
</c:if>
```
- 実装効果：管理者向けの専用機能を共通テンプレート内に組み込み可能
---

### ✅ 実務ポイントまとめ
| 技法                            | 内容       | メリット       |
| ----------------------------- | -------- | ---------- |
| `<s:include>` × 変数            | 動的画面読込   | 再利用性・柔軟性向上 |
| `<c:choose>`                  | 条件分岐表示   | 状態依存UI切替   |
| `header.jspf` / `footer.jspf` | レイアウト共通化 | 修正時の保守効率化  |
| 共通CSS/JS構成                    | 表示の統一感   | デザインブレ防止   |


---

### 📌 参考リンク
### 🔄 関連記事
- [📘 Vol.8.18：【Struts2】JSP構造のテンプレート最適化と共通レイアウト〜 <s:include> / header.jspf / 共通テンプレート構成の実務設計 〜](https://qiita.com/juehara-crypto/items/8ba6ac7b1810c623d978)

- [📘 Vol.8.20：【Struts2】テンプレート設計の完成形 〜 ページ種別テンプレート／共通レイアウトのモジュール化と階層設計 〜](https://qiita.com/juehara-crypto/items/87c087d862db3a9a1467)

- [📗 Vol.8.14：【Struts2】フォーム部品の共通化・再利用 〜 入力UIの部品化で保守性UP！〜](https://qiita.com/juehara-crypto/items/1d1437d0782f3ece08af)

- [📗 Vol.8.15：【Struts2】状態に応じたUI出し分け制御 〜 ログイン状態・権限・入力内容による表示切替 〜](https://qiita.com/juehara-crypto/items/9306b1b0ca0053bd0eb6) 

---

### 🔜 次回予告
次回 [Vol.8.20](https://qiita.com/juehara-crypto/items/87c087d862db3a9a1467) では、***テンプレートベースでのUI設計パターンの完成形***として、よりモジュール化されたテンプレート管理法や、ページ種別テンプレート分割（BaseTemplate.jsp など）を紹介します！

---
【Vuetify3】v-card-titleを中央寄せにする

## d-flexとjustify-centerをclassに指定する
```vue
<v-card>
    <v-card-title class="d-flex justify-center">
        タイトルです
    </v-card-title>
</v-card>
```
通常、要素を中央に寄せたい時は`justify-center`のみで機能してくれるので、個人的に少し沼りましたが、`d-flex`を追加すると素直に真ん中に来てくれます。

## 参考
↓いつもお世話になってます。

[Vuetifyの基本](https://zenn.dev/bbled/books/vuetify3_book/viewer/sec1_8_card#%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%82%84%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E4%B8%AD%E5%A4%AE%E3%82%84%E5%8F%B3%E3%81%AB%E5%AF%84%E3%81%9B%E3%82%8B)
-3/2と-3>>1は違う

v>>kのような右シフトは、よくv/=2^kを高速に計算する小技として説明させる場合があります。実際に、JDKのソースにも、2で割る代わりに1ビット右シフトするようなコードがあります[^1]。

Javaの右シフトには、>>と>>>の使い分けはあるものの、1ビット右シフトすれば、2で割ることと同じと思っていました[^2]。

# C言語の仕様と処理系依存

たまたま算術シフトと論理シフトを振り返っていて、C言語に関して勘違いしていたことが分かった。

[ビットシフトの落とし穴 - 算術シフトと論理シフト](http://proger.blog10.fc2.com/blog-entry-62.html)

C言語には、右シフトは>>しかないが、なんとなくむかし（16ビット？）のころは常に0が入ったような気がする。（今となっては確認できない）
でも、singed intとunsinged intと明確に分けているのだから、signed intの場合は算術シフトで、unsigned intの場合は論理シフトとなるのが自然ではないか。（gccやVC++ではそうらしい）
C言語の仕様としては、負の数の右シフトについて規定はないので、処理系依存となる。
x86アセンブラレベルのニーモニックは、sar（算術）とshr（論理）が用意されている。なお、左シフトはsalとshlの両方があるが、どちらも同じ動作。

-3/2について、C99より前は-2となるか-1となるか処理系依存。
C99から-3/2は-1と0方向への切り捨てが仕様となった。

# Javaの除算演算子 /の仕様

C99と同様に0方向と明確になっています。

[15.17.2 Division Operator /](https://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.17.2)

> Integer division rounds toward 0.
> 整数除算は結果を 0 方向に丸める。

# -3>>1のビット値

-3を2進数で表現して、右に1つシフトするので、結果が-1でなく-2なのは当然の結果に見えます。

`-3 = 0xFFFF_FFFD = 0b1111_1111_1111_1111_1111_1111_1111_1101`
`-3>>1 = 0xFFFF_FFFE = 0b1111_1111_1111_1111_1111_1111_1111_1110 = -2`
`-1 = 0xFFFF_FFFF = 0b1111_1111_1111_1111_1111_1111_1111_1111`

# 仮想マシン仕様

せっかくなので、シフト関連のJVM仕様を見たら、ishl、ishr、iushrと3種類用意されている。さすがにiushlのような意味のないものはないです。

[ishl](https://docs.oracle.com/javase/specs/jvms/se6/html/Instructions2.doc6.html#ishl)
[ishr](https://docs.oracle.com/javase/specs/jvms/se6/html/Instructions2.doc6.html#ishr)
[iushr](https://docs.oracle.com/javase/specs/jvms/se6/html/Instructions2.doc6.html#iushr)

# シフトビットの規定

[INT34-C. 負のビット数のシフトやオペランドのビット数以上のシフトを行わない](https://www.jpcert.or.jp/sc-rules/c-int34-c.html)

実は順番は逆で、ビット全探索のソースを書いていたところ、いつも2秒以内のような制限下では、int型で十分なので、`1 << n`のように書いていましたが、nが31以上のときにオーバーフローします。`1L << n`としないといけないのですが。
その際に、32ビット左シフトしたら0になると思ったら、1でした。
`1 << 30 = 1073741824`
`1 << 31 = -2147483648`
`1 << 32 = 1`

なんだか20年前に同じことを話していたことを思い出して、確認してみる。

# シフト演算子の仕様

int型だとビット幅は5ビット（0x1F）しか有効でないので、32 & 0x1F=0のため、値は変わらない。

[15.19 Shift Operators](https://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.19)

> If the promoted type of the left-hand operand is int, only the five lowest-order bits of the right-hand operand are used as the shift distance. It is as if the right-hand operand were subjected to a bitwise logical AND operator & (§15.22.1) with the mask value 0x1f. The shift distance actually used is therefore always in the range 0 to 31, inclusive.
> もしその左辺オぺランドの昇格された型が int であるならば，その右辺オぺランドの下位5ビットだけをシフト幅として使用する。 それはその右辺オペランドが，マスク値 0x1f を用いたビット単位のAND演算子 & (15.22.1)に従うかのようにとする。 したがって，実際に使用するシフト幅は0から31までの範囲とする。

[^1]: 例えばArrays.binarySearch0の中で、`int mid = (low + high) >>> 1;`というい記述がありますが、やりたいことは`int mid = (low + high) / 2;`ですが、`>> 1`でなく、`>>> 1`なのは、low + high>0x7FFF_FFFFとなり負の数となっても、論理シフトならば上位（符号）ビットに0が入って、正の数に戻ってくるので、`(low + high)/2`では負の数のままで問題となるのでしょう。
[^2]: 負の数aのa>>kなんて書くことはないので、無意識に避けていたのかも。
CORDICアルゴリズム

# はじめに
１億回、三角関数を呼び出して、
・標準ライブラリ
・マクローリン展開による近似
・CORDICアルゴリズムによる近似
の計算速度について比較しました。

# 環境
MacOS 13.4.1
Processing 4.2
MacBookPro(Apple M1 Pro)

# 標準ライブラリ
```java
final int COUNT = 100000000;

void setup() {
  float sum=0;
  float start = millis();
  for (int i = 0; i < COUNT; i++) {
    float angle = map(i, 0, COUNT, -PI, PI);
    sum += sin(angle);
  }
  float time = millis() - start;

  println("Sin: " + time + " ms");
  println("dummy sum: " + sum);
}
```
```
Sin: 396.0 ms
```

# マクローリン展開
```java
final int COUNT = 100000000;

void setup() {
  println("=== Taylor Series Benchmark ===");

  float sumTaylor = 0;
  float startTaylor = millis();
  for (int i = 0; i < COUNT; i++) {
    float angle = map(i, 0, COUNT, -PI, PI);
    sumTaylor += sinTaylor(angle);
  }
  float timeTaylor = millis() - startTaylor;

  println("TaylorSin: " + timeTaylor + " ms");
  println("Taylor dummy sum: " + sumTaylor);
}

float sinTaylor(float x) {
  while (x > PI) x -= TWO_PI;
  float term = x;
  float sum = term;
  for (int i = 1; i <= 4; i++) {
    term *= -x * x / ((2 * i) * (2 * i + 1));
    sum += term;
  }
  return sum;
}
```
あれ？速すぎない？標準ライブラリより速いんだけど。おかしいな。
```
=== Taylor Series Benchmark ===
TaylorSin: 393.0 ms
```

# CORDICアルゴリズム
CPUやライブラリは高度に最適化されており、CORDICという、シフト演算や減算の繰り返しで、近似解を求めるアルゴリズムで動いているそうです。初めて知りました。
Processingで実装した結果は、標準ライブラリの３倍遅くなりました。ソフトウェア（しかもJava）でやってるので、遅くなって当たり前ですが、目安にはなると思います。
・atanテーブルによる高速化
・固定小数点を使った高速化

```java
final int ITERATIONS = 20;
final int FP_SHIFT = 16;
final int FP_ONE = 1 << FP_SHIFT;
final int K_FP = 39834;  // ≈ 0.607252935 * 65536（Q16.16で定数計算）

// atan(2^-i) in Q16.16 format, precomputed for 20 iterations
int[] atanTableFP = {
  51471, 30385, 16054, 8145, 4091, 2045, 1023, 512,
  256, 128, 64, 32, 16, 8, 4, 2,
  1, 1, 0, 0
};

void setup() {
  int sum = 0;
  float start = millis();
  for (int i = 0; i < 100000000; i++) {
    int angleFP = floatToFP(map(i, 0, 1000000, -PI, PI));
    sum += cordicSinFixed20(angleFP);
  }
  float t = millis() - start;
  println("CORDIC fixed-point (20 steps): " + t + " ms");
  println("sum: " + sum);
}

int floatToFP(float x) {
  return (int)(x * FP_ONE);
}

float fpToFloat(int x) {
  return x / (float)FP_ONE;
}

int cordicSinFixed20(int theta) {
  boolean flip = false;
  if (theta > floatToFP(HALF_PI)) {
    theta = floatToFP(PI) - theta;
    flip = true;
  } else if (theta < -floatToFP(HALF_PI)) {
    theta = -floatToFP(PI) - theta;
    flip = true;
  }

  int x = K_FP;
  int y = 0;
  int z = theta;

  for (int i = 0; i < ITERATIONS; i++) {
    int dx = x;
    int dy = y;
    if (z >= 0) {
      x = x - (dy >> i);
      y = y + (dx >> i);
      z = z - atanTableFP[i];
    } else {
      x = x + (dy >> i);
      y = y - (dx >> i);
      z = z + atanTableFP[i];
    }
  }

  return flip ? -y : y;
}
```

標準ライブラリの3倍遅い。
```
CORDIC fixed-point (20 steps): 1236.0 ms
```


# インライン化やテーブル化

逆に遅くなりました。
スミレ畑、やってみた。 その7

# 概要
日本語プログラミング言語、スミレ畑、見つけたので、やってみた。
練習問題やってみた。

# 練習問題
じゃんけんを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/37bcbb3a-3e5a-4b6c-a730-72c14523d873.png)


# サンプルコード

```

「じゃんけん　　0, グー 1, チョキ  2, パー　　」を　出力する
「番号は」と聞いて数1とする
改行する
数2は　0から2までの乱数
数1が　0と　等しく　かつ　数2が　0と　等しい　なら
　　「グーとグーで、あいこ」を　出力する
他で数1が　0と　等しく　かつ　数2が　1と　等しい　なら
　　「グーとチョキで、あなたの勝ち」を　出力する
他で数1が　0と　等しく　かつ　数2が　2と　等しい　なら
　　「グーとパーで、あなたの負け」を　出力する
他で数1が　1と　等しく　かつ　数2が　0と　等しい　なら
　　「チョキとグーで、あなたの負け」を　出力する
他で数1が　1と　等しく　かつ　数2が　1と　等しい　なら
　　「チョキとチョキで、あいこ」を　出力する
他で数1が　1と　等しく　かつ　数2が　2と　等しい　なら
　　「チョキとパーで、あなたの勝ち」を　出力する
他で数1が　2と　等しく　かつ　数2が　0と　等しい　なら
　　「パーとグーで、あなたの勝ち」を　出力する
他で数1が　2と　等しく　かつ　数2が　1と　等しい　なら
　　「パーとチョキで、あなたの負け」を　出力する
他で数1が　2と　等しく　かつ　数2が　2と　等しい　なら
　　「パーとパーで、あいこ」を　出力する
そして


```

# 実行結果

```
じゃんけん　　0, グー 1, チョキ  2, パー　　
パーとパーで、あいこ
```

以上。
geminiに問い合わせて rust-lang のプログラムを作ってみた

## 動機
さきごろ、[Gemini Code Assist によるコーディング支援が無償で利用可能に](http://qiita.com)なる記事を知りました。

以前から、AI でプログラミングってどうするの？と疑問というか不思議に思ってたのですが、ググると沢山の記事がでているようです。

ですので、試しに [gemini web app](https://gemini.google.com/app/) を相手に会話してみることにしました。

お題「rust-langで eframe, egui を用いてランダムに発生した点列を表示するプログラムを作ってください。」

ものの数秒というで回答が返ってきました。Cargo.tomlの設定から簡単なフローの説明。そしてソースコード

しかし、コンパイルが通りません。バージョンを指定しながら、古い知識でコーディンしているようです。

間違いを指摘したら、修正に加えて範囲外の点についてクリッピングを実施するという機能を加えて返答してきました。

その後、rng.gen()の型推論の問題、App trait に name() 関数が無くなった指摘をしてようやく実行できるコードになりました。

ラベルを日本語で書いていたので英字にして実行しました。

最後、「無事実行できました。eguiはそのままでは日本語フォントを表示できないので英字にして使わせてもらいます。ありがとうございました。 」を御礼したら、
> 無事実行できたとのこと、良かったです！
>
>おっしゃる通り、egui はデフォルトでは日本語フォントを含んでいないため、そのままでは>日本語が正しく表示されません。英字でのご利用、ありがとうございます。
>
>もし今後、日本語表示が必要になった場合は、カスタムフォントをロードする方法があります。eframe の CreationContext を利用して、日本語フォントファイル（例：Noto Sans JPなど）を組み込むことで対応可能です。

などと、日本語を表示する際の参考をいただきました。

## 気がついたこと
指摘にたいして「ご指摘ありがとうございます！大変申し訳ありません。」とかリアクションするんです。なにげに、いいですね。

## 結論
gemini は、実際にプログラミング -> コンパイル - >実行をしていないようです。
なので、eguiの様な、更新の早い(加えて互換性を気にせず更新する)ようなものを相手にするのは苦手の様です。エラーを伝えて繰替えせば対応できるので、おおまかな雛形を作るのに役立ちそうです。

また、途中でソースも改良しているので、作成したコードの修正もしてくれるかも？

あと、コード作成を誰かと共同でできるのはありがたいですね。

ためしに、「今、作ったソースを bevy を使うよう変更してください 」なんて投げたら、
eframeを使わない、コードが返ってきました。

今後はわかりませんが、一見どうどうとした、かなりの不思議ちゃんですね。
内容によっては、かなり苦労しそうなので、自分で書くところとの折り合いが鍵になりそうです。
Geminiでバイオリンを使う魔法少年を描いてみた。

# 概要

Geminiでバイオリンを使う魔法少年を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
聖なるバイオリンを使う魔法少年を描いてください。
```

![聖なるバイオリンを使う魔法少年_20250523.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/5a1e553a-f588-4427-93c7-861c8e29171a.png)

# まとめ

何かの役に立てばと。