OmniAICreator/Qiita-1.07M huggingface dataset:
CSS基礎_書き方、各種プロパティ等のまとめ

### CSSとは
HTMLに対して飾りつけを行うもの。

---
### HTML内でCSSを使う方法
〇方法１_HTML内にcssファイルを外部ファイルとして読み込む方法
一般的にHTML側の\<head>タグ内に\<link>タグを配置して指定し使う。
HTML
```
<head>
    <link rel="stylesheet" href="./test.css">
</head>
<body>
    <p class="group_01">testの文章です。</p>
</body>
```
CSS
```
.group_01{
    color : red;
}
```
〇方法２_要素のタグ内でstyle属性を指定し、直接変更する。
そのページのその箇所しか変更しないならいいが、あまり使わない。
```
<p style="font-size: 20px; color: red;">testの文章</p>
```

---
### CSSの書き方
〇セレクタ

どこに対して、行うか指定。
\<p>といったタグ名を直接指定する事もあるが、これだと該当する\<p>全てに適用されてしまうため、基本的には、HTML側でid名やclass名をつけて指定する事で運用する。

〇プロパティ
HTMLにおける属性のようなもの。colorやbackgroud-colorなど、何に関する内容を変化させるか指定する箇所

```
セレクタ {
  プロパティ: 具体的な値; 
}
```

---
### idとclassの違いと指定方法について
class属性は1ページに何度でも使用できるのに対し、id属性は1ページに1度しか使ってはいけない。idを複数回書く事もでき、エラーもないが、文法上の間違いとなるため要注意。

指定時には、id名の前に#、class名の前に.とつける必要がある。何もつけないの基本タグを使う時だけなので実質ない。

〇サンプルコード
HTML
```
<h1>こんにちは</h1>
<p class="red">私の名前は田中太郎です</p>
<h1>こんにちは</h1>
<p class="blue">私の名前は田中次郎です</p>
<p id="green">よろしくお願いします</p>
```
CSS
```
h1 {
  color: orange;
}
.red {
  color: red;
}
.blue {
  color: blue;
}
#green {
  color: green;
}
```

---
### プロパティ
colorやbackground-color
※参考サイト、めちゃくちゃ有用なので要確認

https://qiita.com/7note/items/c90ba916f23d29229ac4

---
### display
「display」というのはプロパティの1つで、要素の表示形式を決める。複数の要素をそれぞれ調整する事で、横一列に並べたり調整できる。各タグにはdisplayの初期値が設定されている。下記以外にも何種類か存在し、別のブラウザの場合など初期値が異なるケースがあるため注意。
#### ・block
要素が横に広がった状態で、縦に並ぶ
```
デフォルト値
div、p、h1～h6、ul、ol、form、body等
```
#### ・inline
要素が平べったく横に並ぶ
```
デフォルト値
a、span、img等
```
#### ・inline-block
並びはinline的、中身はblock的な動き
```
デフォルト値
input、textarea、select
```
#### ・none
非表示となる。レスポンシブデザイン(スマホやPCのような端末によって表示の切り替えができるデザイン)をする際に、PC側では表示してスマホ側では非表示にする時などに使える。

#### ・flex
フレックスボックスはレイアウトを適用させたい子要素の「要素」と、それらをラップする親要素の「コンテナ」から構成される。コンテナに対して display:flex を指定することで、中の要素にレイアウトを適用させることが可能となる。必ず並べた要素の親要素に対してクラス設定をして設定すること。
※参考サイト

https://www.asobou.co.jp/blog/web/flex-box

---
### レスポンシブデザイン
デバイスの画面サイズに合わせてサイト表示を最適化する手法。HTMLのwidthにはデバイスの横サイズが入っているが、widthのサイズによって表示するデザインを変更する事により、PC・スマホといった端末毎の見た目に変更する感じ。


※参考サイト

https://www.kagoya.jp/howto/it-glossary/web/responsive/

---
### font
フォント指定を行うcssで行う場合は可読性の関係上、どこかでひとまとまりで指定すること。
Amplify Gen2 + Nuxt3 デプロイ時にビルドで Error: Cannot find module '@rollup/rollup-darwin-x64' になる場合

## 結論

ないなら追加すれば良い。**ただし dependencies や devDependencies ではなく optionalDependencies として @rollup/rollup-darwin-x64 を追加すべき。** 具体的にpackage.jsonに追加すべき項目を書くと、下記のようになる。

```json:package.json
  "optionalDependencies": {
    "@rollup/rollup-linux-x64-gnu": "4.9.1"
  }
```

するとAmplify Gen2 + Nuxt3 のビルドが通って、無事にデプロイできるようになる。

## 解説：なぜ optionalDependencies として追加すべきなのか

- Rollup のネイティブバイナリはOSごとに異なる
- だから、環境を統一するか、環境差異を許容できるようにしないとエラーになる
- そこで optionalDependencies の登場。optionalDependencies は dependencies や devDependencies と異なり、インストールに失敗してもエラーとならずスキップされる
- これにより今回のRollupバイナリのような **「特定の環境下でのみインストールされてほしい」** **「他の環境では互換性の問題でインストールできないのでスキップされてほしい」** という課題を解決してくれる
Prismaで生成するER図を横向きにする方法（prisma-erd-generator + Mermaid）

Prismaスキーマから自動でER図を生成してくれる便利なツール prisma-erd-generator。
ですが、デフォルトだと縦向き（Top to Bottom）に生成されてしまいます。

「横向き（Left to Right）に表示したい！」というケース、ありますよね。
この記事では、ER図を横向きにする方法を、Mermaidの設定ファイルを使って解説します。

# 手順まとめ
1. mermaid-config.json を作成し、layoutDirection を "LR" に指定する。
1. schema.prisma に mermaidConfig オプションを追加する。
1. npx prisma generate を実行するだけ！


# 前提
- 使用するツール：prisma-erd-generator
- Mermaidを内部で使ってER図を描画している


# 手順
## 1. Mermaid設定ファイルの作成
プロジェクトルートに`mermaid-config.json`という名前で以下のファイルを作成します。

```json
{
  "er": {
    "layoutDirection": "LR"
  }
}
```
ここで "LR" は Left to Right（左から右） の意味です。
他にも "TB"（上から下、デフォルト）、"RL"（右から左）、"BT"（下から上）などが指定できます。

## 2. schema.prisma にオプション追加

```prisma
generator erd {
  provider      = "prisma-erd-generator"
  output        = "./erd"
  mermaidConfig = "./mermaid-config.json"
}
```
これで、ER図生成時に上記の`mermaid-config.json`を読み込んでくれるようになります。

## 3. ER図の再生成
```bash
npx prisma generate
```
これで、./erd ディレクトリ以下に横向きのER図が生成されます！


# 補足
## 設定ファイルの構造について
prisma-erd-generator は内部的に Mermaid を使用しています。
Mermaidには以下のような設定カテゴリがありますが、ER図用の設定は `er` セクションで指定する必要があります。

```json
{
  "er": {
    "layoutDirection": "LR" // ER図用
  },
  "flowchart": {
    "direction": "LR" // これは ER図には効きません！
  }
}
```

# おまけ：Mermaidの設定オプション一覧

[mermaid-js/mermaid/defaultConfig.ts](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/defaultConfig.ts) にすべて載っています。
ER図だけでなく、flowchartやsequence diagramなどにも使えるので、より高度なカスタマイズが可能です。

# まとめ
- mermaidConfig を使えば、ER図のレイアウトを自由に変えられる
- layoutDirection を指定する場合は "er" セクションに書くのがポイント
- Mermaidの構造を理解しておくと、今後の図自動生成にも応用が効く！

#
Fast API + paddleocr + DockerでOCRを試してみる

## はじめに
個人開発でOCRを試してみたかったので、
Fast API + paddleocr + Dockerで環境構築してみました。

flutterから叩くWEB APIとして、ライブラリの豊富さと速度からFastAPIを勉強がてらに選定

## ディレクトリ構成
```sh
.
│
├── docker-compose.yml
├── src
│   ├── __pycache__
│   │   └── main.cpython-310.pyc
│   ├── main.py
│   └── receipt_test.jpg
└── web
    ├── Dockerfile
    └── requirements.txt
```

## Dockerfile

``` Dockerfile
FROM python:3.10-slim

WORKDIR /app

RUN apt-get update &&\
    apt-get install -y libgomp1 libgl1 libglib2.0-0

COPY web/requirements.txt .

RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt



COPY /web  .

CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8080"]
```

## requirements.txt
```requirements.txt
fastapi
uvicorn
paddlepaddle
pydantic
opencv-python-headless
paddleocr

```
## main.py
お試しでいろいろ試したので、ゴミ残ってますが。
``` main.py
import base64
import numpy as np
import io
from typing import Union
from fastapi import FastAPI
from paddleocr import PaddleOCR, draw_ocr


app = FastAPI()

@app.post("/")
def read_root():

    ocr = PaddleOCR(lang="japan")

    result = ocr.ocr('./receipt_test.jpg')

    for idx in range(len(result)):
        res = result[idx]
        for line in res:
            print(line)

    return {"Hello": "World"}
``` 
## docker-compose.yml
``` docker-compose.yml

services:
  web: 
    build: 
      context: .
      dockerfile: ./web/Dockerfile
    ports:
      - "8080:8080"
    environment:
      - DATABASE=postgresql
      - DB_USER=root
      - DB_PASSWORD=password
      - DB_HOST=
      - DB_PORT=
      - DB_NAME=receibo 
    volumes:
      - ./src:/app

```

## 動作確認
```sh
$ docker compose up -d
```

http://localhost:8080/docs

receipt_test.jpgは適当な画像を配置してください。

APIを動作させて

```sh
$ docker logs [コンテナ名]
```

以上で動作確認が取れました。

自分はセブンイレブンのレシートで試しましたが、
「セブン-イレブン」→「セフンーイレブツ」　
「ホットコーヒー L」→「ホットコ一ヒーレ」
「メビウスブラックCMプルーム用」→「メヒ`ウスフラックCMフプルーム用」
日本語対応させると、アルファベットと濁点半濁点がすこし弱めな印象です。



Cloud visionを使用したところ

https://cloud.google.com/vision?hl=ja

``` 
領収書
7カフェ ホットコーヒーL
*167
メビウスブラックCMプルーム用
500
小計 (税抜 8%)
¥167
消費税等 (8%)
¥13
小計 (税込10%)
合計
¥500
¥680
(税率 8% 対象
¥180)
(税率 10% 対象
¥500)
(内消費税等 8%
¥13)
(内消費税等10%
¥45)
```
ここまできれいに取れました。
バグ報告のムダを削減し、迅速な原因特定を実現したい

## はじめに｜情報不足によるエラー原因特定の遅れを解消したい
システム開発において 「バグ」 の発生は避けられません。
単純なコードミスから意図しない挙動、さらにはユーザーにとって使いづらい仕様まで、その種類は多岐にわたります。

理想的には、バグを発見した瞬間に修正できるのが望ましいですが、発見者と開発者が異なることが多く、情報共有に時間がかかる という課題があります。
バグレポートの情報が不足していると、調査が難航し、修正までの時間が大幅に伸びてしまいます。

この 「情報不足によるエラー原因特定の遅れ」 を解消するために、バグ報告を効率化するツール 「Altary」 を開発しました。

## バグ報告における、初期情報の重要性について
バグレポートでは、「最初の報告時点で必要な情報が揃っていること」 が極めて重要です。
情報が揃っていれば、エンジニアはすぐに原因を特定し、迅速に対応できます。

しかし、情報が不足していると、以下のような問題が発生します。

### 情報不足によるトラブルの例
①発見者の環境で発生したエラーが、開発者の環境で発生しない
OSやブラウザの違いが原因で、開発者側で再現できず、調査が難航する。

②発見者が不在で、追加情報が得られない
最初の報告だけでは不十分で、発見者に確認しようとしてもすぐに連絡が取れない。

③伝言ゲームによる情報の劣化
ユーザー → サポート担当 → プロジェクトマネージャー → 開発チーム の伝達プロセスで、重要な情報が抜け落ちる。

### 最初のバグレポートで欲しい情報
最初のバグレポートの段階で以下の情報が揃っていれば、エンジニアはすぐにエラーの原因を特定できます。

⚫︎必要な情報
・URL：https://sample.com/page
・スクリーンショット：エラー発生箇所のスクリーンショット
・OS： macOS 10.15
・ブラウザ： Chrome 131
・スクリーンサイズ: 1000px ×800px
・エラー内容：TypeError: Cannot set properties of null　(setting 'onclick')
・エラー行数：index.js:26
・再現手順：​バグが発生するまでの具体的な操作手順​（動画）
・期待される結果：​本来期待される動作や表示内容​
・実際の結果：​バグ発生時の具体的な状況や表示内容​
・再現性：​バグが毎回発生するのか、特定の条件下でのみ発生するのかの頻度

これらの情報が揃っていれば、エンジニアが 「どの環境で、どのような操作をしたときに、どんなエラーが発生したのか」 を正確に把握できるため、調査や修正のスピードが大幅に向上します。

## 検討したこと
バグ報告の際、必要な情報を テンプレートに沿ってクライアントに入力してもらう方法 を検討しました。

しかし、この方法には以下の課題がありました。

・クライアントの負担が増える（報告のたびに手入力が必要）
・入力内容のばらつきが発生する（情報が不足したり、誤記があったりする）
・必要な情報が揃わず、追加確認が発生する（結果として、エンジニアの対応が遅れる）

そこで、「必要な情報を自動取得する」 仕組みを導入するのが最も効率的と判断しました。

自動取得であれば、 クライアントの負担を軽減しつつ、エンジニアにとって必要な情報を漏れなく取得できる ため、報告から修正までのスピードが大幅に向上します。

## バグ報告を効率化するツールを開発
そこで、バグ報告を効率化するツール 「Altary」 を開発しました。

以下の点を重視して開発しました。
・非エンジニアでも簡単に使える
・エンジニアがバグの原因を特定するために必要な情報を、自動で取得できる
・必要な情報を極力自動取得して、必要であればテキストで補完する
・ブラウザ拡張機能として提供

ブラウザ拡張機能にした理由は、クライアント側での導入が容易で、特別な設定なしにすぐに利用できるからです。


![スクリーンショット 2025-03-18 15.04.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4026790/efd6f294-23d6-497a-93b1-42fe28eb2f94.png)

使い方や機能の詳細は、後日他の記事にまとめます。



## 実際に案件で使ってみた
実際に、非エンジニアのクライアントとの案件で利用したところ、以下のような改善点がありました。

| Before | After |
| ---- | ---- |
| バグの原因調査に時間がかかる | コンソールログやネットワークログを自動取得し、デバッグ時間を短縮|
| バグの発生環境（OS・ブラウザ情報など）を後で確認する必要がある | 自動で取得し、開発者へ提供 |
| 再現手順を説明するのが大変 | Altaryなら画面キャプチャを自動取得し、すぐに共有可能 |

最初の報告の時点でバグ原因が特定でき、コミュニケーションコストが発生することは激減しました！


## まとめ
エンジニアにとって、バグ修正は避けて通れない業務です。

しかし、バグを修正するには 「十分な情報が揃っていること」 が前提となります。
情報が不足していると、修正が難しくなるどころか、そもそも原因特定すらできません。

こうした課題を解決するために、「Altary」 を導入しました。

Altaryを使えば、バグの報告と同時に、必要な情報を自動取得できるため、開発者とのコミュニケーションが格段にスムーズになります。

ぜひ、この記事を読んで興味を持った方は Altary を試してみてください！
👉 http://altary.io/


![img_kv001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4026790/34070517-04fe-4169-bd92-c4780e2659e8.png)
Angular コンポーネントのライフサイクル

# はじめに
Angularのコンポーネントには、ライフサイクルという概念がある。
Angularで開発をしている以上、コンポーネントのライフサイクルについては必ず頭に入れておきたい。

# コンポーネントのライフサイクル
コンポーネントのライフサイクルについて説明する前に、コンポーネントについて理解する。
↓コンポーネントについて以下の記事で簡単に解説しているので参考までに。
[Angular コンポーネントとは](https://qiita.com/naoki0108maeda/items/d6400c449ab7ff7edc86)

コンポーネントとは、ビュー(View)を定義し、制御するものであると上記の記事で説明した。

コンポーネントはAngularアプリケーションの中心的な部分であり、アプリケーションの表示やインタラクションの多くがコンポーネントによって管理される。

コンポーネントは生成された後、プロパティ・子コンポーネントの変化を受けて状態(表示)を変化させていき、非表示になるタイミングで破棄される。

↑**このような生成から破棄までの流れのことを、コンポーネントのライフサイクルという**。

では、ライフサイクルの中身を見ていく。

# ライフサイクルの流れ
コンポーネントのライフサイクルは以下の図のような順序で処理される。
![図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935725/57a820b9-1dda-4009-8168-2b88c07da7bb.png)

### コンストラクター (constructor)

- コンポーネントのインスタンスが生成される  
- 依存性の注入（Dependency Injection）などが行われる  
#### 使用例
サービスのインジェクション、プロパティの初期化など

### ngOnChanges

- `@Input` で受け取るプロパティの値が変化したときに実行される  
- 初回の値変更時にも呼ばれる  
#### 使用例
親コンポーネントから渡されたデータに基づいてコンポーネント内の状態を変更する必要がある場合

### ngOnInit

- コンポーネントの初期化処理を実行  
- `@Input` の値を受け取った後に呼ばれる  
#### 使用例
サービスからデータを取得してコンポーネントに初期値をセットする

### ngDoChecked

- Angularの変更検知 (Change Detection) が実行されるたびに呼ばれる  
- 差分があるかどうかをチェックするタイミング  
#### 使用例
独自の変更検知ロジックを実装したい場合、または変更を手動でトラッキングしたい場合

#### コードの例
``` ts
import { Component, DoCheck } from '@angular/core';

@Component({
  selector: 'app-simple-check', // このコンポーネントのセレクター
  template: `
    <p>カウント: {{ count }}</p> <!-- 現在のカウントを表示 -->
    <button (click)="countUp()">+1</button> <!-- ボタンでカウントアップ -->
  `
})
export class SimpleCheckComponent implements DoCheck {
  count = 0; // カウント用のプロパティ

  // ngDoChecked: Angularの変更検知サイクルのたびに呼ばれる
  ngDoChecked(): void {
    console.log('ngDoChecked: 変更検知が実行されました');
  }

  // ボタンを押すと count を1増やすメソッド
  countUp() {
    this.count++;
  }
}
```
#### Angularは以下のようなものを変更として扱う

- コンポーネント内のプロパティが変更されたとき

- イベント（click など）が発生したとき

- `@Input()` の値が親コンポーネントから変更されたとき

- setTimeout() や Promise の結果が返ってきたとき（Zone.jsによって検知）

- フォーム入力の変更 など

### ngAfterContentInit

- コンテンツ投影 (Content Projection) が完了したときに呼ばれる  
- `ng-content` で受け取った内容の初期化が完了した後の処理に使用  
#### 使用例
親コンポーネントから渡された内容（ng-content）を元に、さらに処理を行いたい場合

### ngAfterContentChecked

- コンテンツの変更を検知するたびに呼ばれる  
- `ngAfterContentInit` の後に呼ばれ、変更がないかチェック  
#### 使用例
渡されたコンテンツの状態が変化する度に何かアクションを実行する場合

### ngAfterViewInit

- 子コンポーネントやビューの初期化が完了したときに呼ばれる  
- `ViewChild` や `ViewChildren` で取得した要素を操作できる  
#### 使用例
子コンポーネントのビューが初期化された後に、特定のDOM要素を操作したり、イベントを登録したりする場合

### ngAfterViewChecked

- ビューが変更されるたびに呼ばれる  
- `ngAfterViewInit` の後に呼ばれ、更新があるかチェック  
#### 使用例
ビューの内容が変わる度にUI更新やアニメーションを開始する場合

### ngOnDestroyed

- コンポーネントが破棄される直前に実行  
- メモリリークを防ぐための後処理（イベントリスナーの解除、タイマーのクリアなど）を行う  
#### 使用例
サーバーとの接続をクローズしたり、イベントリスナーを解除したり、タイマーをクリアしたりする

# まとめ
Angularのコンポーネントは、生成から破棄までのライフサイクルを持ち、各フェーズで特定の処理が実行される。constructor でのインスタンス生成から始まり、ngOnInit での初期化、変更検知 (ngDoChecked など)、ビューやコンテンツの処理 (ngAfterViewInit など) を経て、ngOnDestroy で後処理を行う。
今回、ライフサイクルについて概要レベルで説明したが、今後、各フェーズの詳細について解説したい。
PHP で SJIS CSV を読み込む2つの方法

## fopen

```php
$handle = fopen('test.csv', 'rb');
stream_filter_append($handle, 'convert.iconv.CP932/UTF-8//TRANSLIT', STREAM_FILTER_READ);
while (($line = fgets($handle)) !== false) {
    $row = str_getcsv($line);
}
```

## SplFileObject

```php
$splFile = new SplFileObject('php://filter/read=convert.iconv.CP932%2FUTF-8%2F%2FTRANSLIT/resource=test.csv');
$splFile->setFlags(
    SplFileObject::READ_CSV |
    SplFileObject::READ_AHEAD |
    SplFileObject::SKIP_EMPTY |
    SplFileObject::DROP_NEW_LINE
);
foreach ($splFile as $row) {
}
```

## どちらを使うか?

* CSV ファイルに改行がある場合は `SplFileObject`
【ChatGPT】物語プロンプトを作ってみました。未来予測のPromptです。確実性はありません。


　どうも、カーブミラーです。

　今回は、物語プロンプトを作ってみました。物語プロンプトとは、未来予測のPromptです。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　まずは、ニュースです。

　OpenAIから
　　YouTubeショート動画が
　　　出てきました。
　　　　[OpenAI公式動画](https://youtube.com/shorts/mm4djPNO8os?si=uMEiahmG2aSFI-vG)

　ここでは
　　OpenAIのリサーチャーである
　　　Manukaが、
　　　　Advanced Voice Modeの
　　　　　アップデートについて
　　　　　　紹介しています。

　主な変更点
　・より魅力的で自然なトーン
　・より直接的かつ簡潔な応答
　・ユーザーの発言への割り込みの減少

　とのこと。
***
　では、【本題】です。

　今回は、
　　物語プロンプトを
　　　作ってみました。

　物語プロンプトとは、
　　生成AIに未来予測をさせるための
　　　Promptです。

　こちらの記事を
　　参考にしました。
　　　[ChatGPTの予測能力を爆上げするプロンプトが判明、「物語プロンプト」とはいったい何か？](https://jbpress.ismedia.jp/articles/-/87307)

　通常、
　　ChatGPTに
　　　未来予測をお願いしても
　　　　“できません”と
　　　　　言われるのがオチです。

　知識がないというのもありますが、
　　OpenAIがポリシーに定めている
　　　規約に反するためです。

　例えば、
　　“爆弾の作り方を教えて”とか
　　　“全裸の女性を描いて”とかは
　　　　必ず引っ掛かります。
　　　　　これと同じです。

　では、どうすることもできないのか？

　そこで、
　　今回の記事が登場します。

　“物語プロンプト”というのは、
　　物語の続きを書かせることで
　　　未来予測しよう、というものです｡

　例えば、
　　シンデレラストーリーの
　　　序盤を入力して、
　　　　別の続きを書かせる、感じ。

　ChatGPTは
　　新たな物語を
　　　紡いでくれますよね。

　これを
　　応用するわけです。

　しかし、
　　そんなことで
　　　未来予測が
　　　　できるものでしょうか？

　もちろん、
　　確実にピタッと
　　　当たるわけはありません。
　　　　生成AIのランダム性も
　　　　　ありますし。

　それでも
　　確率の高い候補を
　　　出すことはできます。

　記事の中でのPromptを
　　ご紹介しましょう。
```Text:2022年アカデミー賞主演男優賞の受賞者を予測する場合のプロンプト
2022年4月に書かれた未来のニュース記事を想像してください。アカデミー賞主演男優賞の受賞者について、すでにその出来事が起こったかのように記事を書いてください。
```

　このPromptを使って、
　　97%という高い頻度で
　　　選ばれたのが、
　　　　ウィル・スミスでした。

　“頻度”という言葉でわかるとおり、
　　このPromptを100回実行しての
　　　結果です。

　ですから
　　どうしても
　　　未来予測をしたいなら
　　　　何度も実行して
　　　　　確率の高いものを
　　　　　　得る必要があります。

　❗注意❗
　　未来予測は予測であって
　　　確実なものではありません。
　　　　ちょっとしたパラメータの
　　　　　変化で変わるものです。

　　１分後はなんとなくわかっても
　　　１時間後はわからない
　　　　のと同じことです。
***
　さて、
　　前置きはこのくらいにしまして。

　こちらが
　　その物語プロンプトを
　　　作成するPromptになります。

　＊＊＊に予測したいことを入力して
　　送信してください。
```Text:物語プロンプト作成Prompt
「＊＊＊」を現在を起点にして、予測する物語の序盤を書いてください。
その最後に“すでにその出来事が起こったかのように物語を書いてください。
なお、現実のデータを参考にしてください。”と追記してください。
出力はコードブロックにお願いします。
```

　さらに
　　このPromptで作成された
　　　物語プロンプトを実行すれば、
　　　　生成AIが未来予測した物語を
　　　　　書いてくれます。

　とはいえ、
　　出てくるのは
　　　物語です。
　　　　ハッピーエンドもあれば
　　　　　バッドエンドもあります。

　　試した感じは
　　　ハッピーエンドへと傾くように
　　　　動くようです。

　欲しい未来予測が
　　厳しいものならば、
　　　作成Promptに
　　　　そのことを盛り込む必要が
　　　　　あるかもしれませんね。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【VRChat】Avatar validation failedの原因・解決法

![AvatarValidationFailed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936031/2e4cb86f-238a-44be-8588-cd3ef97e48ad.png)

:::note info
no+eより修正・転記
https://note.com/vrc_yrd_/n/nb22ab4229871
:::

# 目次
- [目次](#目次)
  - [原因](#原因)
  - [解決法](#解決法)
    - [MA使用アイテムを外す](#ma使用アイテムを外す)
    - [未使用パラメータを削る](#未使用パラメータを削る)
  - [Expression Parameterの確認方法](#expression-parameterの確認方法)


## 原因
Modular AvatarのExpression Parameterの使用量が上限値を超えているため

![ExpressionParameter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936031/a9a72396-28ae-4716-924b-f57a82dae8f5.png)

:::note warn
ただし、必ずしもこれが原因とは限らないです。
:::


## 解決法
### MA使用アイテムを外す
Modular Avatarを使用するギミックや装飾などを画像のような状態にする。
- インスペクタで対象オブジェクトのチェックを外す
- TagをEditorOnlyに設定する

![VRCGimmick_EditorOnly.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936031/de3d7c42-dfa6-41fd-ba8a-e95559bd2500.png)

### 未使用パラメータを削る
アバターの表情操作やギミックを動かすために使用されているパラメータから、普段使用しない機能などのパラメータを消す。

![VRCExpressionParameters_Delete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936031/9ae54bc1-3385-4b5f-bcb1-189f9e9e81c2.png)

## Expression Parameterの確認方法

Unityのメニューにある**Tools**から
**Modular Avatar** → **Show Modular Avatar Information**を開く。

![ShowModularAvatarInformation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936031/8e8b9bd6-922d-4142-a961-398bacc2c764.png)
EFW関連記事のまとめ


https://qiita.com/changkejun/items/d9ef1bbffecb8dab4ffc

https://qiita.com/Victory963/items/ec028606e382a1d3a174

https://qiita.com/changkejun/items/5e10a96e0b1efce8653e

https://qiita.com/changkejun/items/1d850b109f8b26381268

https://qiita.com/changkejun/items/926a29ef46714d8cf9f1

https://qiita.com/changkejun/items/194b6c300c82167acddc

https://qiita.com/changkejun/items/c1369438843759d0e890

https://qiita.com/changkejun/items/d79127e27b49bfc8a847

https://qiita.com/changkejun/items/b563570df2036f5fa7da

https://qiita.com/changkejun/items/106f2734dd319e9b1201

https://qiita.com/changkejun/items/dea128563b608b7dcb43

https://qiita.com/changkejun/items/2777f3006c4a0b8d2213

https://qiita.com/changkejun/items/b273b3ae64c76e5b016a

https://qiita.com/changkejun/items/c237ddbc69c9c4cb3319

https://qiita.com/changkejun/items/2e7a68149eab8f2281cf

https://qiita.com/changkejun/items/e4afa094a606c14698f3

https://qiita.com/changkejun/items/70ac1778acd146ad0f9c

https://qiita.com/changkejun/items/350ca12a3276c4d1378a
🔍 Maximal Marginal Relevance（MMR）とは何か？  

## 🧠 はじめに：なぜMMRが必要なのか？

レコメンドシステムや検索エンジンでは、ユーザーにとって**関連性が高いコンテンツ**を出すことが最重要ですが、  
「似たようなアイテムばかり出てくる」という課題にしばしば直面します。

たとえば、あるユーザーに対してランキングモデルがこんな商品を返したとします：

```
1位：iPhoneケース（黒）  
2位：iPhoneケース（赤）  
3位：iPhoneケース（青）  
4位：iPhoneケース（透明）  
5位：iPhoneフィルム
```

いくら「関連性が高い」とはいえ、これは**“退屈”なリスト**ですよね？  
**多様性がないと、ユーザーの発見（serendipity）や興味喚起の機会を失ってしまいます。**

このような問題を解決するのが「MMR（Maximal Marginal Relevance）」というアルゴリズムです。



## 📘 MMRとは何か？

MMR（Maximal Marginal Relevance）は、情報検索やレコメンデーションの分野で使われる**多様性を意識したランキング調整アルゴリズム**です。

> 関連性の高いアイテムを選びながら、既に選ばれたアイテムとは**できるだけ異なる**アイテムを優先的に選ぶ、という考え方に基づいています。

---

## 🔢 MMRの数式と直感

MMRは次のように定義されます：

```math
\text{MMR}(d) = \lambda \cdot \text{Rel}(d) - (1 - \lambda) \cdot \max_{d' \in S} \text{Sim}(d, d')
```

### 各要素の意味：

| 記号 | 意味 |
|------|------|
| `d` | 現在の候補アイテム |
| `S` | すでに推薦リストに入れたアイテム集合 |
| `Rel(d)` | ユーザーにとっての関連性（スコア） |
| `Sim(d, d')` | 類似度（コサイン類似度など） |
| `λ` | 関連性と多様性のバランスパラメータ（0〜1） |

---

## 🔁 MMRのアルゴリズム（擬似コード）

```python
S = []  # 最終推薦リスト
C = 候補アイテム集合

while len(S) < k:
    mmr_scores = {
        d: λ * Rel(d) - (1 - λ) * max(Sim(d, s) for s in S)
        for d in C if d not in S
    }
    d_max = argmax(mmr_scores)
    S.append(d_max)
```

### ✔ ポイント：
- 最初は関連性スコアが一番高いアイテムを選ぶ
- 次からは、**“関連性が高くて、すでに選ばれたアイテムと似ていない”**アイテムを選んでいく
- λ を変えることで「関連性重視 or 多様性重視」のバランスを調整可能

---

## 📦 実用例：MMRをどこで使うのか？

### ✅ ニュース推薦
- 似たような記事ばかり並ばないように
- 「政治ニュース」→「経済」→「国際」などジャンルを分散

### ✅ 商品レコメンド
- 同じカテゴリの商品が続くのを避ける
- ユーザーに**違うジャンルの商品との出会い**を提供

### ✅ 検索結果の多様化
- 類似ページばかり上位に出ないように制御

### ✅ 自動要約・QA生成（NLP）
- 同じような文を並べすぎないように抑制

---

## ⚖ λ（ラムダ）の選び方

| λ の値 | 意味 |
|--------|------|
| λ = 1.0 | 完全に関連性だけを見る（通常のランキングと同じ） |
| λ = 0.0 | 完全に多様性だけを見る（ランダムに近くなる） |
| λ = 0.5 | 関連性と多様性のバランスをとる（実用的） |

最適な値はABテストやオフライン評価（NDCG, coverage, serendipityなど）でチューニングします。

---

## 🛠 実装Tips

- `Rel(d)` はランキングモデルのスコアなどをそのまま使えばOK
- `Sim(d, d')` は：
  - アイテムのテキストやカテゴリのJaccard類似度
  - Embedding（Word2Vec, BERT, Item2Vecなど）の**コサイン類似度**
  - カテゴリや価格帯などの距離

### Pythonでの簡単な類似度例（コサイン類似度）：

```python
from sklearn.metrics.pairwise import cosine_similarity

sim = cosine_similarity(embedding_d, embedding_d_prime)
```

---

## ✅ MMRのメリット・デメリット

| 項目 | 内容 |
|------|------|
| 👍 メリット | 単純なランキングに多様性を加えるだけで使いやすい。既存システムに組み込みやすい |
| 👎 デメリット | 類似度計算が多いとやや重い。多様性を強くしすぎると関連性が下がる可能性も |

---

## 🗣 まとめ：MMRは「バランスを取る技術」

- MMRは「関連性だけでなく、多様性も意識する」ためのシンプルで強力なアルゴリズム
- λを調整することで、**精度と多様性のバランスをコントロール可能**
- 実サービスでも「飽きないレコメンド」の実現に活用されている

---

## ✨ 最後に一言で！

> MMRは、**「ユーザーに“違う視点”を与えるためのスパイス」**です。関連性だけでなく、多様性も重視したいあなたにピッタリのアルゴリズム！
Vim日記

どうも、Vim初心者のあずまです。
ずっとnanoを使っていましたが、このままではいけないと思ったのでVimを習得しようと思います。
アウトプットすると頭に残りやすくなるというので、日記をつけました。地道に更新していこうかと思っています。

# 第一回

`` vimtutor `` を使って勉強。
一日でチュートリアルを終わらせようと思っていたが、思ったより量が多くてあきらめた。今日はレッスン１までにした。
Wikipediaなども併用。

```bash:shell
vimtutor ja
```

どうやらVimにはモードを使い分けないといけないらしい。これは時間がかかりそう。
なんかたくさんモードあるっぽいけどよく使う（らしい）４つ紹介。

| モード | 説明 |
| -- | -- |
| ノーマルモード | カーソル移動や簡単な文章の書き換えができる。 `` Esc `` で切り替わる。 |
| 挿入モード | 文字を入力するモード。 `` i `` や `` a `` などで切り替わる。 |
| ビジュアルモード | 文字を選択するモード。コピーなどができるらしい。 `` v `` などで切り替わる。 |
| コマンドモード | コマンドを打って上書き保存や検索などをする。 `` : `` で切り替わる。 |

[Wikipedia参照](https://ja.wikipedia.org/wiki/Vim#%E3%83%A2%E3%83%BC%E3%83%89%E5%88%87%E6%9B%BF)

とりあえず困ったら `` Esc `` を押してノーマルモードにしておけばいいらしい。

### 終了

`` :wq<Enter> ``　上書き保存して終了
`` :q!<Enter> ``　保存せずに終了

### カーソルの移動

カーソルの移動は矢印以外でもできる模様。

`` k or ↑ ``　上に一マス移動
`` j or ↓ ``　下に一マス移動
`` h or ← ``　左に一マス移動
`` l or → ``　右に一マス移動

ちなみにGoogle日本語入力での矢印を入力するショートカットも同じ `` (ｚ +) ｋｊｈｌ `` (全角入力)

### 削除や挿入

`` x ``　カーソル上の文字を削除
`` i ``　カーソル上から挿入モード
`` I ``　文頭から挿入モード
`` A ``　文末から挿入モード

~~挿入モードでは `` Del `` じゃないともともとある文字を消せない。 `` Backspace `` で慣れてるから超やりづらい~~ `` vimtutor `` だけっぽかった。

# 第二回

今日も `` vimtutor `` を使用。
レッスン2までやった。
ノーマルモードでの削除や移動について学んだ。

### 移動

`` gg ``　文書の最初に移動
`` G ``　文書の最後に移動

`` H ``　画面に映っている文字の最初に移動
`` M ``　画面に映っている文字の真ん中に移動
`` L ``　画面に映っている文字の最後に移動

`` ^ or Home ``　行頭へ移動
`` $ or End ``　行末へ移動

`` w ``　カーソル位置から空白を**含む**単語の末尾に移動
`` e ``　カーソル位置から空白を**含まない**単語の末尾に移動

移動のコマンドの前に数字を入力することで移動する量を決めることができる。

### 削除

移動コマンドの前に `` d `` を入力することで移動した範囲の削除が可能。
`` dd `` と打つとその行の削除ができる。

### 終了

``` :w ```　上書き保存
``` :w <name> ``` 名前を付けて保存
OpenTelemetry Certified Associate (OTCA)受験記

## はじめに

CNCF主催の認定試験 **OpenTelemetry Certified Associate (OTCA)** を受験し合格したので、受験記を記載します。同認定試験の受験を考えている方の参考になれば幸いです。

## 免責事項(Disclamer)

:::note warn
* 本投稿は受験当時の情報となります。受験を検討する際は最新の情報の確認をお願いします。
* 本投稿は個人の所感です。
    * 所属する企業や団体は関係ありません。
    * 情報の利用は自己責任でお願いします。
:::

## 試験概要

* 可観測性を実現するためのソフトウェアOpenTelemetryに関する認定試験です。
* 受験日：2024/12/27
* 試験形式
    * オンライン試験
    * 1回再受験可能
    * 多肢選択式
    * 試験時間90分
    * 試験言語は英語のみ提供
    * 100点満点中75点以上で合格

## OpenTelemetryとは

* クラウドネイティブの運用で重要となる可観測性を実現するソフトウェア
    * ベンダ非依存のテレメトリプロトコルとしてデファクトになりつつあるOTLPの策定も実施
* プライマリシグナル（メトリクス、ログ、トレース）の取得に対応
    * プロファイリングもElastic社から寄贈を受け今後対応していく予定とのこと
* テレメトリデータを扱うコレクターを提供
    * テレメトリを受信するレシーバー、データを処理するプロセッサー、データを送るエクスポーターで構成
* 必要とされてきた背景
    * 従来、可観測性は多くのAPMツールで実現してきた(Datadog, NewRelic, Instana, Dynatrace等)
    * だが、可観測性の実現は導入コストが障壁になり、導入が実現しないケースがある
        * 費用対効果を考えた際、障害のリスクに対しライセンス料が高く受け止められがち
        * APMツールを導入すると、年間1000万円とか割とすぐいく
    * 一度APMを導入すると他に移行ができず、高いライセンスコストの継続に苦しむ
    * OpenTelemetryのメリット
        * 可観測性の実現をライセンスコストなしのOSSで実現
        * 可観測性周りではデファクトスタンダード
        * データ送信をOtelプロトコル(OTLP)にしておくことで、他のツールに乗り換えやすくなる

## 勉強方法

### 参考にした受験記

[Sajeeva Lakmalさんの受験記](https://medium.com/@nvsajeeva/how-to-pass-otca-opentelemetry-certified-associate-exam-e19d650cbe82)

### 学習リソース

* まずはLinuxFoundation提供の無償トレーニング [Getting Started with OpenTelemetry (LFS148)](https://training.linuxfoundation.org/training/getting-started-with-opentelemetry-lfs148/) を受けました。
* 次に [認定の公式ページ](https://training.linuxfoundation.org/certification/opentelemetry-certified-associate-otca/) を見て認定のカリキュラムを把握し、先ほどのトレーニングでカバーできていない範囲を[OpenTelemetryドキュメント](https://opentelemetry.io/docs/)で確認します。
* 具体的は以下あたりが該当すると思います
    * The OpenTelemetry API and SDK
        * Data Model
        * Composability and Extension
        * Configuration
        * SDK Pipelines
    * The OpenTelemetry Collector
        * Scaling
        * Transforming Data
    * Maintaining and Debugging Observability Pipelines
        * Debugging Pipelines
        * Error Handling
        * Schema Management
* トレーニングだと具体的なところがわかりづらかったので、こちらの[OpenTelemetry入門](https://zenn.dev/ryoyoshii/books/opentelemetry-firststep)も参考になりました。

## 受験してみての所感

* 全体としては概念を問うものが多く、簡単な部類の試験でした。
    * 個々の設定の詳細というより、データが流れるアーキテクチャ、各コンポーネントの役割をきちんと理解しておくのがよさそうです。
* プログラミング言語毎の計装設定は言語毎に異なるので問われることはほとんどありませんでした。
    * 唯一、トレーニングでも例に出されているPythonの場合だけ1-2問聞かれた気がします。
macOS 上で Ollama を使用して Gemma 3 を実行する

1. macに Ollama をインストール
1. Gemma 3 モデルのダウンロード
1. 実行

## 1. macに Ollama をインストール

```
% brew install ollama
```

## 2. Gemma 3 モデルのダウンロード

```
% ollama pull gemma3:1b
```

## 3. Gemma 3 を実行

```
ollama run gemma3:1b
```

```
>>> hi
Hi there! How's your day going? 😊 Is there anything you’d like to chat about?

>>> こんにちは
こんにちは！ (Konnichiwa!) - Hello!

It’s nice to hear from you. 😊 

What’s on your mind?
```

終了

```
>>> /?
Available Commands:
  /set            Set session variables
  /show           Show model information
  /load <model>   Load a session or model
  /save <model>   Save your current session
  /clear          Clear session context
  /bye            Exit
  /?, /help       Help for a command
  /? shortcuts    Help for keyboard shortcuts

Use """ to begin a multi-line message.

>>> /bye
```

## 参考

- [Gemma 3 モデルの概要](https://ai.google.dev/gemma/docs/core?hl=ja)

> Gemma 3 1B サイズのモデルはテキストのみ
OACに日付に基づいたカスタム・ナレッジを登録する

# はじめに
OAC（**Oracle Analytics Cloud**）ではデータセットを作成/編集する際に、その列に対してある種のリコメンデーションをしてくれる機能があります。
例えば、日付列に対して年や月での分割の提案などです。
以前にも紹介しましたが、これらのリコメンデーション機能を拡張する「カスタム・ナレッジ」という機能があります。

- [Oracle Analytics Cloud：データの内容に応じて列の追加を提案してくれるので、データセットが充実化していく話](https://qiita.com/tyo38/items/cc5b970ce085541ce489)
- [Oracle Analytics Cloud：列の追加提案をカスタマイズできるので、ますますデータセットが充実化していく話](https://qiita.com/tyo38/items/8d8ed01979592644d9a2)
- [Oracle Analytics Cloud：データの元号を西暦に変換する](https://qiita.com/tyo38/items/05f35fd40f12c8a3948e)

その後の機能拡張により、日付列に基づいたカスタム・ナレッジがサポートされていますので、改めて紹介します。

# カスタム・ナレッジファイル
次のガイドラインに従ってください。
- CSV または Microsoft Excel (XLSX) 形式でデータ ファイルを作成します。アップロードできるファイルの最大サイズは250MBです。
- 最初の列に、OACがデータのプロファイルに使用するキーを入力します。
- 他の列にエンリッチメント値を入力します。

こんなExcelファイルを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/600b685b-9bd5-4d3a-9635-b85124784cd1.png)

# カスタム・ナレッジの登録
OACに管理者としてログインし、コンソールメニューに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/4ec4748f-379f-4170-a205-c93011b50c10.png)

データ・エンリッチメントをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/972d4d80-e4d6-4818-b319-c499f8f11db8.png)

＋をクリックして、カスタム・ナレッジファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/39b6f977-e97a-49d6-ad4a-26228753099a.png)

アップロードできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/affe3d9b-2698-4b57-b511-209055081642.png)

# データセットを編集
データメニューに移動して、「Sample Order Lines」データセットで試します。
右クリックして、「開く」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/fa01b728-7396-4f22-971a-e3541ed89630.png)

日付列に対して多くの提案がありますが、会計年に関する提案がありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/d5d3dfc1-33d8-4d8e-8c01-6572d7c0128d.png)

よく見たら、新しく登録したカスタム・ナレッジを使用してプロファイリングをやり直すようにリコメンドされていることに気が付きました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/d9fa82e0-84a8-4410-9fac-9d97d2c77001.png)

早速、プロファイルをリフレッシュします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/25c66cac-8e9e-4bea-9918-7bb313a1c054.png)

いいですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/8638da23-42e9-408a-92a7-4ef4a5a23c12.png)

クリックすると列が追加されますが、ここではそうせずにデータセットを上書き保存してから「ワークブックの作成」をクリックします。

# ワークブックでの見え方
こんな風に見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a8423daa-69a2-4604-9a58-4218fc3c45bb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/46ed52f5-269a-4e64-a1ce-febc53929c66.png)

今回は会計年度へのエンリッチメントを試しましたが、国民の休日や天候や気温等を加えても面白いかもしれないですね。

# 留意点
このカスタム・ナレッジには2012年以前のデータがありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/600b685b-9bd5-4d3a-9635-b85124784cd1.png)

よって、プロファイルするデータセットに2012年以前のデータが含まれていると、（提案すべきデータがないので）何も提案してくれません。

# ドキュメント

https://docs.oracle.com/en/cloud/paas/analytics-cloud/acubi/enrich-and-transform-reference.html#GUID-B04EFB34-D1CB-45AD-A126-FF5A0DA76B37
Webのアクセス解析にmatomoとCloudFlareの組み合わせは良さそうだと感じた話

こんにちは。
ALJの江口と申します。

公開しているWebサーバーのアクセス解析は、解析に応じていくつか選択肢があると思いますが、今回はmatomoを取り上げてみたいと思います。

## matomoのインストールでもProxmoxは便利
matomoのインストールはそれほど難しくないと思いますが、インストール方法を調べたり、DBをインストールしたり、その辺を面倒に思う人もいると思います。私もその一人です。

Proxmoxを使うと、matomoのlxcのテンプレートが準備されているため、サクッと立ち上げることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/8b6c55c0-e1f0-432c-8e08-542250694b2f.png)
Proxmox のlxcに慣れていない方は戸惑うかもしれませんが、turnkeyというプロジェクトがあり、上記でインスタンスを作成すると、以下の内容で一気に立ち上がります。
・debian12
・Apache2
・php
・matomo
・MariaDB
・そのたもろもろ

（画像は公式サイトから拝借）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/13e68e63-6d88-41f9-9752-ce52eb29ccb3.png)

## matomoをどこに立てるべきか
matomoでアクセス解析する場合は、大きく分けて以下の２通りあります。
1. アクセスログを利用する
1. JavaScriptにコードを埋め込む

アクセスログを利用する場合は、ログを定期的に転送する仕組みが必用です。ただし、一般的なアクセス解析はこの手法が多いと思いますので、違和感はないと思います。matomoの場合、アクセスログを読み込むpythonプログラムが準備されており、一般的なログフォーマットであれば簡単に読み込むことが可能です。
一方、アクセスログから取得できる情報は、JavaScriptによる方法より情報量が少なく、また、バッチ処理になるためリアルタイム性が低いというデメリットがあります。

JavaScriptをコードに埋め込む方法は、サイト管理者であれば、コードを追加するだけなので通常のメンテナンスの範囲で実行可能だと思います。ただし、JavaScriptなので、**閲覧者のブラウザ**で実行されるため、そこから到達可能な場所にmatomoサーバーを立てる必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/4990fc56-3d53-491b-9782-8f1aebf4fd6a.png)
## アクセス解析のために一つ公開サーバーを準備するか悩ましい
matomoは非常に高機能ですが、それなりにリソースを必用とします。ハイスペックなサーバーとまでは言わないまでも、最低レベルのVPSのインスタンスだと少々不安です。そこで検討したいのは、CloudFlare Tunnelで公開する方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/dee73468-f924-4373-85b2-d7b93a706455.png)

オンプレミスの強みを生かし、比較的強力なインスタンスもオンプレミスなら検討できるでしょう。

ProxmoxやCloudFlareを使うと、一昔前では難易度が高かったことも、簡単に構築できるようになってきました。
当然、運用する際はセキュリティ面などに配慮する必要があり、検討する項目はまだまだありますが、今回の記事が設計の参考になれば幸いです。

以上です。
Android Studio 開発環境構築手順 まとめ

## 目的
**Android Studio**上で**Flutter**/**Dart**アプリを開発・実行する環境を構築する手順をまとめています。
Android Studioのインストールから、日本語化、Flutterプロジェクトの実行までをステップバイステップで解説します。

## 1. Android Studio のインストール
ー 以下のリンクから Android Studio をダウンロード
URL：https://developer.android.com/studio

ー インストーラーを実行し、デフォルトの設定でインストール
　 ※セットアップ時に 「Android SDK」や「エミュレーター」も一緒にインストールされます。

## 2. Android Studio の日本語化
**方法：日本語化プラグインを導入**
ー Android Studio のメニューから、Settings（または Preferences）→ Plugins を開く
ー 「Marketplace」タブで Japanese または日本語と検索
ー Japanese Language Pack をインストールし、再起動

## 3. Flutter & Dart プラグインのインストール
ー Settings > Plugins を開く
ー 「Flutter」と検索 → Flutter プラグインをインストール
　　※Dart プラグインは Flutter インストール時に自動で入ります。
ー 再起動を促されたら「Restart」

## 4. Flutter SDK のセットアップ
ー Flutter SDK を公式からダウンロード：
URL：https://docs.flutter.dev/get-started/install/windows

ー ZIP ファイルを解凍し、C:\flutter などのわかりやすい場所に展開
ー 環境変数Pathへ以下を追加
```ruby:bash
C:\flutter\bin
```
ー コマンドプロンプトを再起動して確認
```ruby:bash
flutter --version
```
## 5. Flutter Doctor の実行（環境確認）
ー 以下を実行して、Flutter SDK を構築
```ruby:bash
flutter doctor
```
#### ここで以下のチェックが入り、必要なツール類を取得してくれます。
・Android SDK の状態
・Dart SDK のバージョン
・ライセンス承諾
・エミュレーター or 実機の接続

## 6. Flutter プロジェクトの作成と実行
#### 以下、Android Studio 内での操作
ー File > New > New Flutter Project
ー Flutter SDK のパスを指定（例：C:\flutter）
ー 任意のプロジェクト名をつけて作成
ー main.dart が自動生成される
ー 右上の「▶ 実行ボタン」でエミュレーターまたは実機を起動

## まとめ
Android Studio で Flutter アプリ開発を始めるには、以下の5ステップ
ー Android Studio インストール（＋日本語化）
ー Flutter/Dart プラグイン導入
ー Flutter SDK セットアップ
ー 環境変数・Doctorチェック
ー プロジェクト作成・実行
Youtubeのコメント欄、おススメを非表示にするChromeの拡張機能を公開しました

### 1.はじめに
今回Chromeにおける「shhh」という拡張機能を公開しました。
これはYoutubeの動画の下に表示されるコメント欄やサイドバーに表示するおすすめをOFFにする機能です。
シンプルに動画だけを楽しみたい方向けに今回リリースしました。

### 2.配布について
以下のURLからDLをお願いします。
https://chromewebstore.google.com/detail/shhh/pjjagkimmdcpoopedoecgnmjcdmiaeac?hl=ja

### 3.最後に
いいね👍いただけると励みになります！
またChromeのストアの方にも評価いただけると嬉しいです
CrossEntoropyLoss と NLLLoss の関係

## はじめに
毎回混乱するので備忘録です．

## CrossEntropyLoss
pytorch実装では **logit** とターゲットを入力します．
```Python
import torch
import torch.nn as nn

g = torch.Generator().manual_seed(42)
a = 10 * torch.rand(4, 3, generator=g) # (batch, N), logits
print(a)
# tensor([[8.8227, 9.1500, 3.8286],
#         [9.5931, 3.9045, 6.0090],
#         [2.5657, 7.9364, 9.4077],
#         [1.3319, 9.3460, 5.9358]])

cross_entropy_loss = nn.CrossEntropyLoss()
target = torch.tensor([0, 1, 2, 1]) # (batch, )
loss = cross_entropy_loss(a, target)
print(loss)
# tensor([1.7082])
```

## NLLLoss
pytorch実装では確率の**対数尤度**とターゲットを入力します．
```Python
nllloss = nn.NLLLoss()
log_p = torch.log_softmax(a, dim=1)
loss = nllloss(log_p, target)
print(loss)
# tensor([1.7082])
```

`cross_entropy_loss(a, target)` と `nllloss(torch.log_softmax(a), target)` が一致します．

なお，確率とターゲットを入力にできる損失関数はpytorchではありません．おとなしくCrossEntropyLoss か NLLLoss を使いましょう．

あるいは確率を計算した後に自分で対数をとりましょう．
```Python
p = model(input)
nllloss = nn.NLLLoss()
log_p = torch.log(p)
loss = nllloss(log_p, target)
print(loss)
# tensor([1.7082])
```
Teams会議を相手にバレずに録画する

# 最初に
Teams会議の録画は最初に了承を得ましょう！
ただし、様々な理由で録画の許可が取れていないけど、録画しておきたい場合があると思います。

そんなときはWindowsの標準機能の[Game Bar](https://www.microsoft.com/ja-jp/windows/tips/game-bar?msockid=24c420c56a5c64343d6c35d46b536517)を使って録画しましょう。

# 事前準備
1. Windowsロゴ + Gキーをクリックして、Game Barを起動する
1. 設定 > ウィジェット > "録音するオーディオ" を "すべて"に変更する。（***変更しないとTeamsの音声が録音されない***）

# 録画方法
1. Teamsの会議を開く
1. ***会議ウィンドウをクリック*** > Windowsロゴ + Gキーをクリック > "録画を開始"をクリック（Game Barはアプリウィンドウ単位で録画されるので、必ずクリックが必要）
1. 録画が開始される

# 注意
- 自分の声も録音したい場合は、Game Barのマイクアイコン（録画中はマイクをオン）をクリックする必要がある
- 画面共有ありの場合、１時間で約5GBくらいのmp4ファイルが作成される

# 最大のメリット
- Teamsの会議ウィンドウを最小化しても録画はされ続ける

# 最後に
最初にも言いましたが、相手に了承を得てから録音・録画しましょう！
plunkerでopenjscad その15

# 概要
plunkerでopenjscadやってみる。
練習問題やってみた。

# 練習問題
getParameterDefinitionsを、使え。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e7a79fce-a1a4-4c92-89b6-0c06d9eedc27.png)


# サンプルコード

```
function getParameterDefinitions() {
	return [{
		name: 'width',
		type: 'float',
		initial: 10,
		caption: "Width of the cube:",
	}, {
		name: 'height',
		type: 'float',
		initial: 14,
		caption: "Height of the cube:",
	}, {
		name: 'depth',
		type: 'float',
		initial: 7,
		caption: "Depth of the cube:",
	}, {
		name: 'rounded',
		type: 'choice',
		caption: 'Round the corners?',
		values: [0, 1],
		captions: ["No thanks", "Yes please"],
		initial: 0,
	}];
}
function main(params) {
	var result;
	if(params.rounded == 1)
	{
		result = CSG.roundedCube({radius: [params.width, params.depth, params.height], roundradius: 2, resolution: 32});
	}
	else
	{
		result = CSG.cube({radius: [params.width, params.depth, params.height]});
	}
	return result;
}

```

# 成果物

https://embed.plnkr.co/plunk/MtDhWLP4d5daQhDh


以上。
自分をAIでもう一人作る？？Second-Meを試してみる④

## 前回の記事

https://qiita.com/GOROman/items/1a8b1fe91204e5432dde		

## 注意事項

```
All Human

この記事は全て人間(GOROman)がAIを使わずに書いたオーガニック記事です。
そのため、誤字・脱字・文法ミスがある場合がございます。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/f95edb39-a2b7-423c-9fb7-c1e88ac6ff5b.png)


## Second Me用の養分 (自分の分身データを用意しよう！)

### 手順 旧Twitter(X) の全ツイートを用意する

人類のほとんどがやっていると思われる X をライフログにしておきましょう！

#### 1. まず初めに2007年くらいからTwitterを始めます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/46682f49-a78f-420e-a676-ced0f6bf93cb.png)

Xの初め方 → https://x.com/

#### 2. 6,458日間で 548,748件ほどポスト（ツイート）しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/80ad216f-571b-4ab0-8337-e00cb70a9f5e.png)
大事なことはライフの記録（ライフログ）です。
6458日間に54万ほどポストします。
1日85件程度なので誰でもできます。

ツイログ: https://twilog.togetter.com/GOROman

### 3. Xの設定画面からアーカイブをリクエストします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/e0f4647c-4b75-41ff-ad56-c528fbb753cf.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/627d5e16-845f-453a-ac9e-ae33be9950f9.png)

### 4. カップラーメンでも食べながら、24時間待ちます。

おすすめはセイコーマートの食べる催涙ガスこと「山わさび塩ラーメン」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/8cabd6f2-f155-497a-b149-8ba110d599bb.png)


## 次回お待ちください。
Nginxコンテナによるリバースプロキシ設定

# 概要
Nginxコンテナによるリバースプロキシ設定手順を記載します。

# 環境
* マシン：Amazon EC2
* OS：Ubuntu 24.04
* Docker：28.0.1
* Docker Compose：2.33.1

# 前提条件
* DockerおよびDocker Composeがインストールされていること
* SSL証明書を保有していること

# 手順
以下のようなディレクトリ・ファイル構造を作成してください。
ルートを`nginx`という名前にしていますが、任意の名前でも構いません。
`cert.pem`はフルチェインの証明書、`key.pem`は秘密鍵になります。

```
nginx
|-- compose.yaml
|-- config
|   `-- mysite_nginx.conf
|-- certs
|   `-- cert.pem
|   `-- key.pem
```

compose.yamlの内容のサンプルを示します。
```compose.yaml
services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "443:443"
    restart: unless-stopped
    volumes:
      - ./config:/etc/nginx/conf.d
      - ./certs:/etc/nginx/ssl
```

mysite_nginx.confの内容のサンプルが次になります。
パラメータの詳細説明は割愛しますが、HttpsおよびWebsockert通信に対応した内容となっています。
`<ACCESS-FQDN>`には、クライアントから見たアクセスFQDNを記載して下さい。
`<BACKEND-FQDN>`にはバックエンドのFQDNを記載して下さい。
```mysite_nginx.conf
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 443 ssl;
    server_name "<ACCESS-FQDN>";

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

    location / {
        proxy_pass "<BACKEND-FQDN>"; 
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```

必要なファイルが配置できたら、compose.yamlが存在するディレクトリにて、次のコマンドを実行すると、nginxコンテナが起動します。
```
docker compose up -d
```

以上でセットアップは完了です。
plunkerでopenjscad その14

# 概要
plunkerでopenjscadやってみる。
練習問題やってみた。

# 練習問題
複数objectを、返せ。


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2720723c-52d4-41e9-a5c8-fac66e214d8f.png)


# サンプルコード

```
function main() {
  var mycube = CSG.cube({radius: 10});
  var mycircle = CAG.circle({radius: 10});
  return [{
    name: "cube",   
		caption: "Cube", 
		data: mycube,
  }, {
      name: "circle",       
			caption: "Circle",
      data: mycircle,
  }];
}
```

# 成果物

https://embed.plnkr.co/plunk/UPeL7gqzRhBiTxNE


以上。
Sass、SCSS、SASSとは

# はじめに
CSS Sass SCSS SASS ← cとaとsが大混雑

初めてこの単語の羅列を見たとき、`?`となった。

それぞれの関係について図を交えてまとめておきたい。

# CSS Sass SCSS SASSの関係と概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935725/6e33e6d5-4fa7-4d2f-b842-1ba476916bba.png)

## CSS

Webページのスタイルを指定するための標準的なスタイルシート言語。

## Sass (Syntactically Awesome Stylesheets)

CSSをより効率的に管理できるようにする拡張言語。変数、ネスト、ミックスインなどの機能を追加し、プログラミング言語のように扱える。あくまでも記法のこと。

### SASS（インデント記法）

- Sassの旧来の記法
- `{}` や `;` を省略し、インデントで階層を表現する

### SCSS（Sassy CSS）

- Sassのもう一つの記法で、現在主流
- 通常のCSSとほぼ同じ書き方ができ、Sassの拡張機能を活用できる
プラットフォームエンジニアリング：Azure上での安全なAIアプリ開発について考えてみる

# Azure上での安全なAIアプリ開発
最近ではチャットボットやデータ分析などのAI-agentがトレンドですが、プラットフォームエンジニアリングの観点でも、安全なAIアプリ開発のプラットフォーム提供は必要不可欠になってくるでしょう。
そこで突然ですが、Azure上での安全なAIアプリ開発について考察してみました。
## AIアプリ開発の構成
Dev Boxを開発端末として、構成を考えてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4040756/4896d68c-d027-481c-8c99-a82dfc31dc98.png)

### 設計のポイント
| 項目 | 内容 | 備考 |
|:-----------|:-----------|:-----------|
| プライベートエンドポイント   | ・各AIサービスおよびStorage accountとACR、AIhubはプライベートエンドポイントでのみアクセス可(パブリックアクセスを無効) | ・ACRについてプレミアムプランが必要|
| 認証方法    | ・Storage accountとACRはEntra ID認証<br>・各AIサービスはAPIキー|   |
## AIアプリ開発構成のテンプレート範囲
AIアプリ開発のプラットフォームは、テンプレートとして提供する必要があります。テンプレート範囲は次の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4040756/73d5e6f2-ed0f-4fa9-8f00-70d1ee568f43.png)

- 事前払い出し
    - DevBox
    - プライベートエンドポイント用のサブネット

プラットフォーム設計によっては、いくつかのリソースを全開発チーム共通とすることもよいと思います。
- 共通リソース例
    - Log analytics workspace(LAW)
    →運用効率やSentinel(SIEM)導入の観点からもログはなるべく集約したほうがよい
    - ACR
    →開発チーム間でのアプリ開発の知見共有の観点で、共通化もよい。しかし、コンテナイメージ内に直接機密情報を混入させない等、セキュアコーディングがより必要。

## 補足：AIアプリ開発の各機能改修に合わせたProject(AI hub)の活用
AIアプリ開発の各機能改修に合わせて、AI hubのprojectを活用すると、より効率的な開発が可能かと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4040756/0fb9eea0-a783-44aa-bd93-de5f99c8746e.png)
projectを作成すると、自動的にAI hubから各AIサービスの引継ぎとコンテナが作成されます。<br>マネージドIDの作成や各権限付与は別途行う必要があります。
## 参考文献
[AzureSandbox](https://github.com/Azure-Samples/azuresandbox/blob/main/README.md)
[ランディング ゾーンとプラットフォーム エンジニアリング](https://www.youtube.com/watch?v=flqEfduKAdQ)
Laravel12のtimezone設定

# 内容
Laravel12でログの日時が日本時間にならない〜となった時の対応メモ。
Laravel11から変更があった。

# Laravel11の場合
.envのAPP_TIMEZONEを下記にするだけ。
```
APP_TIMEZONE=Asia/Tokyo
```

なぜなら、app.php で APP_TIMEZONE を見るようになっていたから。
```
'timezone' => env('APP_TIMEZONE', 'UTC'),
```

# Laravel12の場合
app.php が固定されている。
```
'timezone' => 'UTC',
```

なので
app.phpを下記に変更し
```
'timezone' => env('APP_TIMEZONE', 'UTC'),
```

.envに下記を追加
```
APP_TIMEZONE=Asia/Tokyo
```

で対応しました。
家計簿アプリを作る＃２２

![スクリーンショット 2025-03-25 105428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/4878eefd-26fa-438e-b5cc-92d878874439.png)
続いて、MUI colorと調べます。

![スクリーンショット 2025-03-25 105516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/d20a7f33-5f0e-4d98-9ee5-f4df3ca63bdd.png)
カラーコードは、オレンジの部分を使いたいと思います。

![スクリーンショット 2025-03-25 105624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/4c3b02f1-fe26-4a4e-84fe-0d400118f639.png)
![スクリーンショット 2025-03-25 105643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/9fe9ee84-b70d-4323-8d71-5c3d0e7f26a7.png)
bgcolorを👆のように指定します。

![スクリーンショット 2025-03-25 105850.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/bd2df2f9-1b80-44ff-a3b7-eec5d44306c0.png)
背景色が指定されました。

![スクリーンショット 2025-03-25 105943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/7a5660b5-fe59-4d01-8bc2-1af9b5de0375.png)
minHeightを１００vhにすることで、画面全体に背景色が適用されます。

![スクリーンショット 2025-03-25 110105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/c08a3445-3153-4942-bcfd-f2b383fa38ec.png)
コンポーネント名もAppLayoutに変えておく。
gitでmainからブランチを切る方法

# 手順（Gitコマンド）
```bash
git checkout main              # ① mainブランチに移動（まだなら）
git pull origin main           # ② 最新の状態を取得（忘れがちだけど大事）
git checkout -b ブランチ名  # ③ 新ブランチを作成して移動
```
これで `main` をベースに 入力したブランチ名のブランチができて、そのブランチに移動まで完了する。

# 忘れずに `origin` にプッシュ（初回だけ）
```bash
git push -u origin ブランチ名
```
`-u` つけることで次回以降は `git push` だけで済む！

# 参考までに
ブランチの強制削除
```bash
git branch -D ブランチ名
```
Angular データバインディングについて

# はじめに
コンポーネントは以下の図のように、ビューを定義し制御するものということを以前解説した。(リンク：[Angular コンポーネントとは](https://qiita.com/naoki0108maeda/items/d6400c449ab7ff7edc86))
![図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935725/662a6f28-561c-4082-99be-3d1d481c1ab1.png)
コンポーネントとビューについて理解してから、データバインディングについて学習することをオススメしたい。
今回はコンポーネントとビュー間でデータをやり取りする仕組みであるデータバインディングについて解説する。

# データバインディングの種類
データバインディングは以下の図のように**3方向のデータの受け渡しが可能**。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935725/e4174a2c-188d-47b1-a9f7-e4e558dea14d.png)

それぞれのバインディング方法について簡単に説明したい。

# 補間・プロパティ・属性バインディング
コンポーネントのデータをテンプレート（HTML）に反映させる方法には、補間（インターポレーション）、プロパティバインディング、属性バインディングがある。

## 補間(インターポレーション)

`{{ }}` を使って、コンポーネントのプロパティをHTML内に埋め込む方法。
```sample1.html
<p>{{ message }}</p>
```

```sample1.ts
export class AppComponent {
  message = 'Hello、Angular！';
}
```
この場合、message の値が `<p>` 内に表示される。

## プロパティバインディング

`[property]=" "`で、input 要素の [value] 属性に、コンポーネントの message プロパティをバインドします。
```sample2.html
<p><input [value]="message"></p>
```

```sample2.ts
export class AppComponent {
  message = 'Hello、Angular!';
}
```
入力欄の初期値が`message`から`Hello、Angular!`に変更される。

## 属性バインディング

HTMLの属性にコンポーネントのデータを適用する場合は、attr. プレフィックスを使用する。
```sample3.html
<td [attr.colspan]="columnSpan">セル結合</td>
```

```sample3.ts
export class AppComponent {
  columnSpan = 2;
}
```
この場合、colspan="2" が動的に設定される。

**プロパティバインディングと属性バインディングの違い**は以下の通り。
| 項目                 | プロパティバインディング `[property]` | 属性バインディング `[attr.attribute]` |
|----------------------|----------------------------------|----------------------------------|
| **適用対象**         | DOM要素のプロパティ              | HTMLの属性                     |
| **リアルタイム反映** | 可能（データ変更で即座に反映）  | 初回レンダリング時のみ          |
| **動的な動作への影響** | あり（フォームの入力値など）    | なし（単なる属性の設定）        |
| **主な用途**         | `value`, `disabled`, `checked` など | `colspan`, `aria-label` など  

# イベントバインディング

ユーザーの操作（クリック、キー入力など）に応じてコンポーネントのメソッドを実行する方法。
```sample4.html
<button (click)="onClick()">クリック</button>
<p>{{ message }}</p>
```

```sample4.ts
export class AppComponent {
  message = 'ボタンをクリックしてください';

  onClick() {
    this.message = 'クリックされました！';
  }
}
```
ボタンをクリックすると `onClick()` メソッドが実行され、`message` の値が更新される。

# 双方向バインディング

`[(ngModel)]` を使うことで、入力値とコンポーネントのデータを同期させる。
```sample5.html
<input [(ngModel)]="message" />
<p>{{ message }}</p>
```

```sample5.ts
export class AppComponent {
  message = '初期メッセージ';
}
```
この場合、`input` に入力した内容がリアルタイムで `message` に反映される。

# まとめ
データバインディングには、補間・プロパティ・属性バインディング、イベントバインディング、双方向バインディングの3方向のバインディング方法がある。補間やプロパティバインディングはコンポーネントのデータをテンプレート(ビュー)に反映させるのに対し、イベントバインディングはユーザーの操作をコンポーネントで処理する。双方向バインディングでは、コンポーネントとビューのデータが常に同期される。
今回はデータバインディングの概要について簡単に説明した。細かい内容はまた今度解説したい。
簡単なCSSでローディング中画面を表示させる

よくある、ローディング中のグルグル回るあれを表示させたい

#loading-spinnerに対して、基本は`<div id="loading-spinner" style="display: none;">`にしておいて、読み込み中だけ`$('#loading-spinner').show()`、終わったら`$('#loading-spinner').hide()`を呼び出せばローディングになる

``` loading.html
<html>
    <style>
        #spinner {
            border: 4px solid #eee;
            border-top: 4px solid #333;
            border-radius: 50%;
            width: 30px;
            height: 30px;
            animation: spin 1s linear infinite;
        }
        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
    </style>

    <body>
        <div id="loading-spinner">
            <div id="spinner"></div>
        </div>
    </body>
</html>
```
windowsのローカルのphpを8.0.13から8.3.13にバージョンアップする方法

# はじめに


# 方法
phpの公式サイトから、「VS16 x64 Thread Safe Zip」をダウンロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1291184/d878a37f-95a4-5ac3-2509-cfd5d0c1ebcc.png)


https://windows.php.net/download/

「C:\php」フォルダを作成し、ダウンロードして展開したフォルダを移動させます。（パス：「C:\php\php-8.3.13-Win32-vs16-x64」）

「php-8.3.13-Win32-vs16-x64」のフォルダ内にある「php.ini-development」をコピーして、「php.ini」にリネイムします。


「システム環境変数の編集」を開き、「環境変数」をクリックします。
「ユーザー環境変数」または「システム環境変数」の「Path」を選択し、「編集」をクリックします。
「C:\php\php-8.3.13-Win32-vs16-x64」のPathを新規追加します。

またシステム環境変数の新規で、以下を追加してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1291184/6d89de2a-05e6-8ad2-227e-15f2900b612b.png)

バージョンアップされたか確認

「php --ini」コマンドを入力して、「C:\php\php-8.3.13-Win32-vs16-x64\php.ini」になっていることを確認。

「php -v」コマンドを入力して、「PHP 8.3.13」になっていることを確認出来たら終了です。

# MySQLでマイグレーションをできるようにする設定
php.iniファイル内の「extension_dir = "ext"」と「extension=pdo_mysql」のコメントアウトを消して保存してください。
【小ネタ】EventBridge Schedulerのrate式とcron式の違い

# 背景

[EventBridgeとは?](https://aws.amazon.com/jp/eventbridge/)

> Amazon EventBridge が、アプリケーション、統合された SaaS アプリケーション、および AWS のサービスから生成されたイベントを使用して、イベント駆動型アプリケーションの大規模な構築をより簡単にする方法を学びます。

EventBridgeにおける定時実行タスクの実現方法として、`cron`式と`rate`式があります。Linuxお馴染みの人なら、`cron`を難なく書けるでしょう。例えば、現在時刻`18:30`（18時30分）から一時間一回実行してほしいタスクに対して、EventBridgeで以下のような`cron`式を使用します：

```
cron(30 * * * ? *) // 00:30, 01:30 ... 19:30, 20:00...で実行されます
```

`rate`式ならさらに簡単です：

```
rate(1 hour) // 設定時刻から一時間一回実行されます
```
しかし、このように同じく「1時間おきに一回実行」のタスクを`cron`と`rate`で実現しようとすると、振る舞いが微妙に違います。

# cron式とrate式の違い

EventBridgeで`18:30`に上記の`cron`式で設定しますと、一回目の実行は`19:30`となります。それに対して、同時刻に`rate`式で設定した場合、`18:30`（設定時刻から約40秒経つので`18:31`になる可能性も）で**すぐ一回実行**され、`19:30`で二回目の実行になります。

なぜこういう違いが生まれるのでしょう。考えられるのが、`cron`と`rate`の思想の違いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824949/2413c73d-6604-4921-9402-17ceac61c937.png)

「決められた時刻で実行」するのが`cron`です。`18:30`で設定した時点では、`18:30`という実行すべき時刻がすでに過ぎましたので、すぐには実行されず、`19:30`で一回目実行されます。

それに対して、`rate`式が「決められた時間内で一回実行される」ことを保証します。この場合、設定した時刻と関係なく、「一時間一回」のレートが保証されていますが、EventBridgeの場合設定した直後に一回目の実行がなされるような仕様です。

このような仕様が望ましくない場合、工夫も可能です。`rate`式を使いたいが設定後一回目の実行は不必要な場合、`Timeframe`→`Start date and time`が選択可能です。一時間一回実行の場合、開始時刻を設定時刻の一時間後に設置すれば、`cron`式と近い時刻で一回目の実行がなされます。

# 最後に

気軽に扱えそうな`rate`式ですが、EventBridgeにおいてこういった裏仕様もありますので要注意です。

表現力において、一般的に言うと`cron`の方が高いです。例えば、曜日指定や毎月〇日指定みたいなのは`rate`式じゃなかなかできません。が、「何分/時間/日おきに一回」的なタスクなら、`rate`式の方が難なくこなせたりします。なので、どっちを使え！じゃなくて基本その場の最適解を熟考する必要があります。