OmniAICreator/Qiita-1.07M huggingface dataset:
Chakra UI v3.x.xでextendThemeが利用できなかった話

## 環境
@chakra-ui/react 3.17.0
react 19.1.0

node.js：20.0.0

## 起きたこと
グローバルなスタイルの設定をしようと、extendThemeをimportしようとしたところ、下記エラー発生。

```
Module ‘”@chakra-ui/react”‘ has no exported member ‘extendTheme’
```

## 原因（バージョンの違いによる原因）
グローバルなスタイル設定を行う際、`extraTheme`を使うのは、Chakra UIのバージョンが `v2.x.x` のとき。
今回インストールしたChakra UIのバージョンは `v3.x.x` だったので、`extraTheme`ではなく、違う書き方が必要だった。

## v2.x.xでの書き方
```theme.ts
import { extendTheme } from "@chakra-ui/react"

export const theme = extendTheme({
  styles: {
    global: {
        "body": {
            backgroundColor: "gray.100",
            color: "gray.800",
        },
    },
  },
})
```

```App.tsx
import { ChakraProvider } from "@chakra-ui/react"

export const App = ({ Component }) => (
  <ChakraProvider theme={theme}>
    <Component />
  </ChakraProvider>
)
```
`theme.ts`で定義した`theme`オブジェクトを、`ChakraProvider`コンポーネントの`theme`という`props`に渡す。

## v3.x.xでの書き方
```theme.ts
import { createSystem, defineConfig, defaultConfig } from "@chakra-ui/react";

const config = defineConfig({
  globalCss: {
    "html, body": {
      bg: "gray.100",
      color: "gray.800",
    },
  },
});

export const system = createSystem(defaultConfig, config);
```

```provider.tsx
"use client"

import { ChakraProvider } from "@chakra-ui/react"
import { system } from "../../theme/theme"
import { ThemeProvider } from "next-themes"

export function Provider(props: { children: React.ReactNode }) {
  return (
    <ChakraProvider value={system}>
      <ThemeProvider attribute="class" disableTransitionOnChange>
      {props.children}
      </ThemeProvider>
    </ChakraProvider>
  )
}

```

```App.tsx
import { Provider } from "@/components/ui/provider"
import { defaultSystem } from "@chakra-ui/react"

export const App = ({ Component }) => (
  <Provider>
    <Component />
  </Provider>
)
```

* v3では `extendTheme` は使用できず、代わりに `createSystem`, `defineConfig`, `defaultConfig` をインポートする。
* `defineConfig` で定義。 `globalClass` で文字通りグローバルなスタイルの設定ができる。
* `ChakraProvider`コンポーネントには、`value`というプロパティへ渡す。

## 参考
* 以下の公式ドキュメントを参照しました。使用するパッケージなども少し違うので参照した方がよいかと思います。

https://www.chakra-ui.com/docs/get-started/migration
デザインから実装まで1人で挑戦！初心者のポートフォリオアプリ開発記録

![アイキャッチ_MyVoice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082413/5e2e3af0-00b6-4cdd-af49-195b17b85e9c.png)

こんにちは、Web/UIエンジニアを目指しているくにさわです。
今回、初めて自分だけのアプリを0から設計・開発しました。

この投稿は、
- 自分の学びの記録として
- ポートフォリオとしての紹介
- 同じように未経験から挑戦している方の参考

になればと思い書いています。
まだ開発途中ではありますが、ぜひ見て下さい。


## 作ったもの
喉を手術して声が出なくなった方が、自分の声でテキストを読み上げられるスマホアプリを開発しました。

![S__28352524.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082413/af073e41-64a1-4e6f-95a3-3575a93588de.jpeg)


- アプリ名：My Voice App
- 使用技術：Python（PyQt5）、音声合成ライブラリ
- 想定利用者：発声が難しい方や、補助ツールを必要とする方
- GitHub：🔗 （まだアカウントを開設していないため近日投稿予定）


## 工夫したポイント
- UIはできるだけ直感的で、視覚的にわかりやすいレイアウトにしました
- カテゴリごとに背景色を切り替えるなど、アクセシビリティにも配慮
- 音声再生中にバブルの色を変えることで「今読み上げ中」を視覚的に伝える設計に


## 苦労した点・学び
- 音声再生とUIの状態を同期させる方法が難しかった → threading の学習と導入
- Tkinter でのカテゴリ切り替えUI実装にはかなり時間がかかりましたが、状態管理の基礎が理解できました

## 使用技術
- Python
- UI設計（カテゴリ切り替え、チャット風バブルUI）

## 今後やりたいこと
- ユーザーの録音データからオリジナル音声を生成できるようにする
- iOSアプリとしてリリースする（Kivy, BeeWareなどを検討中）
- React + FirebaseでWeb版も作成予定


未経験からWeb/UIエンジニアを目指して日々勉強中です。
今後もデザイン案やポートフォリオを投稿していく予定です✨
同じようにチャレンジしている方や、アドバイスをいただける方がいれば、
ぜひコメントやフィードバックをいただけたら嬉しいです！

ここまで読んでいただきありがとうございました🙇
佐藤司：消防士や警察官から転職する人が多い

元消防士の佐藤司です！（詳細は下記）
https://www.imkk.jp/?s=%E4%BD%90%E8%97%A4%E5%8F%B8%E6%B6%88%E9%98%B2%E5%A3%AB

近年、消防士や警察官から民間企業へ転職する人が増えていることが報じられています。これまで安定した職業とされてきた公務員である消防士や警察官ですが、なぜ転職を選ぶ人が多くなったのでしょうか？その背景には、いくつかの理由と変化があります。本記事では、消防士や警察官が転職を決意する理由、そして転職後の可能性について探っていきます。

## 1. 過酷な労働環境と心身への負担

消防士や警察官の仕事は、命を守るという崇高な使命を持つ一方で、非常に過酷な労働環境にあります。特に、不規則な勤務時間や長時間労働、過度なストレスが原因で心身に大きな負担がかかります。例えば、火災現場や事故現場での激しい活動は、身体的に非常に疲弊することが多いです。また、警察官の場合は、犯罪現場での対応や危険な状況に立ち向かうため、精神的な疲れが蓄積しやすいです。

これらの過酷な労働環境は、年齢が増すごとに身体的・精神的に耐え難くなることがあります。そのため、より安定した生活と健康を求めて転職を決意する人が増えているのです。

## 2. キャリアの将来性と不安

消防士や警察官は、安定した職業として知られていますが、キャリアにおける成長に限界を感じることもあります。特に、昇進や役職に関しては、年功序列が強い傾向があり、上級職への昇進には長年の勤務が必要です。そのため、若いうちからキャリアアップを目指して民間企業への転職を考える人が増えているのです。

また、公務員としての仕事は、法律や規則に縛られ、自由度が低いと感じる人もいます。民間企業では、より創造的な仕事ができることや、自己のスキルを活かしてキャリアを築ける点が魅力とされ、転職を選ぶ理由となっています。

## 3. 転職後のスキル活用と可能性

消防士や警察官が民間企業に転職する場合、その経験やスキルは十分に活用できます。例えば、危機管理能力や迅速な意思決定力は、企業のリスクマネジメント部門やプロジェクトマネジメント職で非常に価値のあるスキルです。警察官の調査能力や捜査経験も、民間企業でのデータ分析やセキュリティ管理などで重宝されます。

さらに、消防士や警察官は、チームワークやコミュニケーション能力も非常に高いため、これらのスキルは営業職や人材育成の分野でも強みとなります。転職先の企業では、これらのスキルを活かしながら、新しいキャリアを築くことができます。

## 4. 転職のサポートと再教育の重要性

消防士や警察官が転職を考える際、民間企業で必要なスキルを学ぶための再教育が重要になります。多くの企業が、転職者向けに研修制度を提供しており、業界知識や業務スキルを習得するためのサポートを行っています。また、自己学習の意欲がある人にとっては、転職後にさらなる成長の機会を得られることは大きな魅力です。

例えば、営業職やマーケティング職、さらにはIT業界への転職を目指す場合、専門的な知識が必要になりますが、オンライン学習やスクールを活用することで、短期間で新しいスキルを習得することが可能です。

## 5. まとめ

消防士や警察官が民間企業へ転職する理由は、過酷な労働環境やキャリアの限界、さらにはより多くの選択肢や安定を求めることにあります。しかし、転職後にはその経験を活かし、新たなキャリアを築ける可能性が広がっています。転職市場においても、これらの職業で培ったスキルは非常に価値が高く、民間企業でも重宝されています。転職を考えている方にとっては、自分の経験を最大限に活かし、新しい環境で成長するチャンスが待っていると言えるでしょう。
【Mac】スクリーンショットのファイル名を変更する

スクリーンショットのファイル名を変更するには以下のコマンドを実行します。

```terminal
defaults write com.apple.screencapture name "テスト"; killall SystemUIServer
```

上記の場合には`テスト 2025-05-28 23.55.44`のようなファイル名になります。

デフォルトは「スクリーンショット」です。
Flutter on the web & Connect-goで詰まった話

## まえがき
もともとgRPCだったプロジェクトを、Flutter webに対応させるためにConnectRPCに乗り換えた際につまった話。

|  | バージョン | 
|:-----------|------------:|
| go       | v1.2.4        |
|flutter_sdk| v3.24.3 |
| Connect-dart| v0.3.0 |

## ConnectRPCについて
[ConnectRPC](https://connectrpc.com/docs/introduction/)とは...
>Connect is a family of libraries for building browser and gRPC-compatible HTTP APIs: you write a short Protocol Buffer schema and implement your application logic, and Connect generates code to handle marshaling, routing, compression, and content type negotiation. It also generates an idiomatic, type-safe client in any supported language.

要約すると...
gRPC互換のHTTP APIを構築するためのライブラリ群で、proto書いて自動生成で型安全なコードも生成してくれるやつ（詳しくは自分で調べてください）

## 詰まったところ
gRPCで実装していたコードをConnectに置き換えた後、Flutter webで通信をすると
```
[invalid_argument] protocol error: promised 246 bytes, received 331
at Object.throw_ [as throw]
```
こんな感じでエラーを吐く。

ライブラリの[当該箇所](https://github.com/connectrpc/connect-dart/blob/main/packages/connect/lib/src/protocol/sink.dart)の実装を見ると
```packages/connect/lib/src/protocol/sink.dart
if (expLength != null && actLength > expLength) {
  throw ConnectException(
    Code.invalidArgument,
    'protocol error: promised $expLength bytes, received $actLength',
  );
}
```
つまり、プロトコルが本来受け取る予定だったデータ量（246バイト）と、実際に届いたデータ量（331バイト）が一致していないときにエラーを吐く。

このとき、実際受け取るデータ量が多いということは、本来受け取る予定だったデータ量というのは圧縮された値でありそう。

### 原因: ブラウザが自動で gzip を展開する

- サーバーは Content-Encoding: gzip を付けてレスポンスを返す
- ブラウザ (Fetch / XMLHttpRequest) はこのヘッダーを見て自動で解凍する
- Connect の 5 バイトエンベロープには 圧縮後サイズ が入る
- Dart 側で合計されるのは 解凍後のサイズ
そのため、宣言サイズ 246 バイトと伸長後 331 バイトが一致せず、invalid_argument 例外が発生する。

## 暫定の解決策
サーバー側のハンドラーの圧縮を無効化する
```main.go
p, h = hogehogeconnect.NewFugaServiceHandler(
    &hogefuga.Server{}, 
    connect.WithCompressMinBytes(math.MaxInt)
)
```
`WithCompressMinBytes(math.MaxInt)`を追加してgzipを無効化する。

## まとめ

- Flutter Web ではブラウザが Content-Encoding: gzip を自動展開

- エンベロープのサイズは「圧縮後バイト数」なので、展開後と一致しなくなる

- 暫定策として圧縮を無効化するか、HTTP の Content-Encoding を外すことで解決

ライブラリ側（Connect-dart のブラウザ版）が、このパターンに未対応なのが直接原因

:::note warn
Connect プロトコル自体は本来 Connect-Content-Encoding ヘッダー（または Streaming-Content-Encoding）を使い、ブラウザに解凍させない設計だが、Go 実装は歴史的理由で HTTP 標準の Content-Encoding も出す ため、ズレが発生する
:::

## 追記2025/06/17
connect-dartがv0.4.1がリリースされた際に修正されました。アップデートしましょう😸


## 参考文献
https://connectrpc.com/docs/protocol/
https://connectrpc.com/docs/go/serialization-and-compression/
銀行家の丸め

## はじめに
四捨五入って一種類だと思っていませんか？私はずっとそう思っていました。
しかし残念ながら四捨五入は二種類あります。

## 銀行家の丸め（Banker's Rounding）とは？
「銀行家の丸め」とは、数値を四捨五入する時にちょうど中間（0.5）だった場合に、単純に切り上げるのではなく偶数に丸めるルールです。

通常の四捨五入と銀行家の丸めの違い

元の数値 | 通常の四捨五入 | 銀行家の丸め
--|--|--
2.5 | 3 | 2
3.5 | 4 | 4
4.5 | 5 | 4
5.5 | 6 | 6

ポイント：
- 小数点以下が「ちょうど.5」だったとき
    - 通常の四捨五入 -> 無条件で切り上げ
    - 銀行家の丸め　 -> 丸めた後が偶数になるように切り捨て、切り上げをする

## なぜ銀行家の丸めを使うのか？
普通の四捨五入だと、「切り上げ」が統計的に偏り、数値が少し大きくなりやすいです。
ざっくばらんに説明すると[0.0, 0.1, 0.2, 0.3, ... , 1.9]の0.1刻みの20個の数字を考えると、

元の数字 | 通常の四捨五入 | 銀行家の丸め | 差(通常の四捨五入) | 差(銀行家の丸め)
-: | -: | -: | -: | -:
0.0 | 0 | 0 | 0.0 | 0.0 
0.1 | 0 | 0 | -0.1 | -0.1 
0.2 | 0 | 0 | -0.2 | -0.2 
0.3 | 0 | 0 | -0.3 | -0.3 
0.4 | 0 | 0 | -0.4 | -0.4 
0.5 | 1 | 0 ※ | 0.5| -0.5
0.6 | 1 | 1 | 0.4| 0.4
0.7 | 1 | 1 | 0.3| 0.3
0.8 | 1 | 1 | 0.2| 0.2
0.9 | 1 | 1 | 0.1| 0.1
1.0 | 1 | 1 | 0   | 0   
1.1 | 1 | 1 | -0.1 | -0.1 
1.2 | 1 | 1 | -0.2 | -0.2 
1.3 | 1 | 1 | -0.3 | -0.3 
1.4 | 1 | 1 | -0.4 | -0.4 
1.5 | 2 | 2 | 0.5| 0.5
1.6 | 2 | 2 | 0.4| 0.4
1.7 | 2 | 2 | 0.3| 0.3
1.8 | 2 | 2 | 0.2| 0.2
1.9 | 2 | 2 | 0.1| 0.1

※通常の四捨五入と銀行家の丸めで差異がある箇所

合計
元の数字 | 通常の四捨五入 | 銀行家の丸め | 差(通常の四捨五入) | 差(銀行家の丸め)
-: | -: | -: | -: | -:
19 | 20 | 19 | 1.0 | 0.0

このように通常の四捨五入では、小数点以下が「ちょうど.5」だったときに常に切り上げるので、多めになってしまう傾向があります。
一方銀行家の丸めは、中間の場合に偶数・奇数をバランスよく丸めるため、全体で誤差が偏りにくくなります。

特に、金融（銀行、保険）や科学技術の分野では、正確な統計処理が求められるため、この丸め方を採用されることがあります。

## プログラミング言語毎における四捨五入
### Python
Python言語に組み込みのround()関数は**銀行家の丸め**です。注意しましょう。
```python
round(2.5)  # -> 2
round(3.5)  # -> 4
```

### VBA
VBA言語のRound関数は**銀行家の丸め**です。注意しましょう。
```vb
?Round(2.5, 0)
 2
?Round(3.5, 0)
 4
```

### Excel
Excelの数式のROUND関数は**通常の四捨五入**です。VBAと違うので注意です。
```
=ROUND(2.5, 0)
  3
=ROUND(3.5, 0)
  4
```

### C
C言語のmath.hのround()関数は**通常の四捨五入**です。
```c
round(2.5) // -> 3
round(3.5) // -> 4
```

### JavaScript
JavaScript言語に組み込みのMath.round()関数は**通常の四捨五入**です。
```javascript
console.log(Math.round(2.5), Math.round(3.5)); // 3 4
```

## まとめ
- 銀行家の丸めとは、ちょうど0.5の場合に、偶数に丸める方法
- 偏りを防ぎ、統計的に正確な値に近づける目的で使い、金融、保険、科学技術計算などで使われる
- プログラミング言語毎で通常の四捨五入なのか銀行家の丸めなのかが異なるので注意が必要
ローカルとGitHubリモートリポジトリの接続手順

GitHubのYour profileから右上の➕ボタンを押下
New repositoryからリモートリポジトリを作成する
ローカルではプロジェクトを作成しておく

**①Git初期化**
```
git init
```

**②リモートリポジトリを追加**
　GitHub上のリポジトリURLをリモートに追加
```
例）
git remote add origin https://github.com/~~~~/~~~.git
```

※URLの確認方法
1.GitHubで対象のリポジトリページを開く
2.右上あたりにある< Code >をクリック（緑色のボタン）

**③ファイルをステージして初回コミット**
```
git add .
git commit -m "first commit"
```

**④リモートブランチにpush（初回pushは`-u`オプションをつける）**
```
git push -u origin main
```

これでローカルとリモートの接続が完了！
unityでフリーのフォントを使う

✅ 手順：Unityでフリーフォントを使う方法
① フォントを用意する
まず、使用したい フリーフォント（.ttf や .otf）ファイルを用意します。

日本語対応のフリーフォント例：

Google Fonts（Noto Sans JP など）

フロップデザイン

IPAフォント

M+ FONTS

✅ 商用利用の可否やライセンスは必ず確認してください！

② Unityプロジェクトにフォントを追加する
.ttf または .otf ファイルを Unityの Assets フォルダにドラッグ＆ドロップします。

Unityが自動でフォントアセットとしてインポートします。

③ フォントをUIやテキストに設定する
TextMeshProの場合（推奨）
TextMeshProは高品質な文字描画が可能で、日本語にも適しています。

メニューから Window > TextMeshPro > Import TMP Essential Resources を選んで必要なデータをインポート。

フォントを右クリック → Create > TextMeshPro > Font Asset を作成。

作成されたFont Assetを、TextMeshProの Font Asset に設定。

Unityの標準 Text コンポーネントの場合
Text コンポーネントを持つGameObjectを選択。

Font プロパティに、インポートしたフォントを設定。
J:COMの無料ネットが案外優秀だった話

# ４月に東京で一人暮らし
大学進学をすることになったので、親元を離れて東京で１人暮らしをすることなった。
築１５年ぐらいで、よくある量産型の賃貸マンションです。

# インターネット事情
普通にNURO光とか引こうかなーって思ってたら、まさかの工事不可らしい。
NUROのエリア判定のサイトではOKと出てたのに、大家が許諾せずに無理ということに。。
NUROのサイトでOK出てたのは何？って聞いたら「タイプSなので大家さんに許諾をもらって」なんて話になって、マンションのMDFにNUROの設備自体がどうやらないらしく、まあ結構面倒だった。

仕方ないからフレッツ光の１０Gでもひくかーって思ったら、まさかのNTTが100MbpsのVDSLタイプ。
そんな激おそ回線は耐えられないので、なんとか解決方法はないかと模索したら、

JCOMの無料インターネットはマンションにあるらしく、現状はそれしか使えないとのこと。
無料ネットって大体遅いしゴミだから、期待せずに申し込んだところ２日後ぐらいにONUが届いて

みたところケーブルテレビのネット回線のようです。

少しでかい黒型の機器が届いて、ケーブルテレビのところにテレビ線をつけてそれをONUと接続。
あとは機器の電源を入れればwi-fiが飛んで接続が可能になる。

# スピードテスト
速度を測ってみて、まあ無料だし、100Mbpsは出たらいいほうかなーっと思ったら、

下り: 640Mbps
上り: 81Mbps

なんと嬉しい誤算！めっちゃ早いじゃん！友達の家のNUROより下は早い
契約内容を見ると無料インターネットではあるが、JCOMマイルームで１Gプランで、理論上は最大１Gの速度が出る様だ。
ケーブルテレビって光回線と違ってVDSLなみに遅いイメージだったけど、意外と高速だった。

ただ、上りの通信はテレビの電波と共有している関係で、最大100Mbpsしか出ないらしい。
とはいっても81Mbpsというほぼ100マックスに近い速度が出ているので、普段使いに不便はしないだろう。

ソフトバンクエアーやスマホのテザリング生活になるのではと心配していたが、とりあえずは助かった。

JCOMの無料ネットは建物の契約にもよるけど、1Gプランなら案外悪くないのでご参考までに。
AWS上のRHEL7を8へメジャーバージョンアップしたら起動しなくなった件

# はじまり
AWSのEC2で動作しているRHEL7がEOLを迎えるので、メジャーバージョンアップするタスクが舞い込んできた。
Upgradeコマンドで楽勝かなーと思っていたんだが、Webサーバのみ起動しなくなるという冷や汗ダラダラな事態に:disappointed_relieved:

初回投稿なので、読みにくい部分があると思います:bow_tone1:
本記事が参考になれば幸いです。。。


# 構成の概要と前提
・REHLはAWSのマーケットプレイスから購入
・WebサーバはNginxを採用
・WebコンテンツはS3に保管
・WebサーバはAutoScalingでスケールアウト／スケールインが可能
・サーバ新規起動時にCodeDeployで最新Webコンテンツをデプロイ


# トラブル
RHEL7から8へバージョンアップしたが、AutoScalingの起動エラーとなり、うんともすんとも反応しなくなった。


# 何が悪かったの？
CodeDeplyエージェントのログを見ていたら、rvm(Rubyのバージョン管理ソフト)でOpenSSLのライブラリが見つからないとのメッセージが・・・

あれ？入ってるはずなんだけどなー
んんん？やっぱり入ってる。(rpmコマンドで見てみるとやっぱりある:frowning2:)

どうやら知らぬ間にrvm(Rubyの管理ソフト)が入っていて、それがOpneSSLのライブラリを参照するとのこと。
このrvmの起動時に、旧来から入っているOpenSSLのライブラリと互換性がなくてエラーになっていました

# 解決方法
いろいろと試行錯誤し、どこかの記事でOpenSSlの互換パッケージである"compat-openssl10"をインストールしているWebドキュメントを見かけてインストールしたところ・・・
動いた:joy:

若干場当たり的な対応だったので、もうちょっと追ってみよう。

OpenSSLのライブラリで困ったら、1度お試しください。
拙文にて失礼いたしました。
OS in 1,000 Linesをやった感想

# Introduction
「1000行で作るOS」という怒田晟也さんが公開している無料のオンライン教材がある．

https://operating-system-in-1000-lines.vercel.app/ja/

たった1000行でOSの基本的機能であるコンテキストスイッチ，ページング，ユーザーモード，コマンドラインシェル，ディスクデバイスドライバ，ファイルの読み書きをC言語で実装するというものである．
OSというか，扱うのはほとんどカーネルと呼ばれるものである．

3年前に大学の先生から教えてもらったが，今年の3月くらいからちまちまやってようやく全部終わったので，感想をメモしておく．

OSはLinux Mint 22.1で実行した．親切に環境構築のセクションからスタートするのでどのOSでもできると思われる．


## やってよかったこと：OS開発者の気分を楽しめる
この教材ではRISC-Vと呼ばれる命令セットアークテクチャ用のOSを少しずつ実装し，QEMUというエミュレータで実行して動作を確認する．
普通のアプリ開発だと，コンパイラが親切にエラーメッセージを出してくれて，AIに丸投げ！とかできるのだが，OSだとこうもいかない．
カーネルのコンパイルの時点でエラーが出るのはまだいいが，コンパイルしてQEMUで実行したときに，実装していない処理はそもそも未定義なので，コードが間違っていて動作が想定と違っても何も起こらない．
だからデバッグするときは，qemuの機能やobjdumpを使ってこっち側からメモリやバイナリのおかしいところを探しに行かないといけない．この作業が，特にOS開発者の気分と専門性を感じさせてくれた．

したがってやることはずっと，ちょっとコーディングしてqemu, ちょっとコーディングしてqemu, たまにqemuのモニター機能を使ってメモリダンプして中身をチェックしたりするという感じだった．
このあたりは，昔授業でやったアセンブラを思い出した．

正直このデバッグの仕方は専門的すぎて，教材のガイド無しでデバッグできる気がしないが，体験としてはとても面白かった．
# Conclusion

こういった数少ない日本語の自作OSの教材を作ってくれる人々には頭が上がらない．

最後までやってみた結果，特に低レイヤのCに慣れておらず，結局細かいところはまだわからない．
一方それなりに，OS開発の流れと雰囲気は味わえたので満足である．

特に楽しかったところは，helloとexitコマンドだけの簡易shellが動かせるようになったところ．

あと，最後のtarファイルを簡易ファイルシステムとして使うセクションもアイデアが斬新で面白かった．

おすすめです．試してみてねー
【Make】商品の特徴をすぐに知りたい人用！商品おしらせLINEBot！

## ごあいさつ

はじめまして！
北の大地のスーパーで働いています、べあと申します。
今回は、業務中に「こんなのあったらいいのにな～」と妄想していた、
**商品名を打ち込むだけで「商品紹介」をしてくれるLINEBot**を
作ってみました！
作成時に使用したツールは　**「Make」** となります。

なんと、超初心者の私でも作れました。
ぜひ温かい目で見てください！

## 内容

このLINEBotは **「商品名を打ち込むと、商品の特性や内容が分かる」** 
といったものです。
ごくごくシンプルだけど、意外と便利！

私はお惣菜部門で働いているのですが、数ある業務の中の1つに、
**週替わりで「商品のおすすめ放送」を録音する** というものがあります。

毎回「どうやったらこの商品の魅力が伝わるんだろう？」と悩む時間が
もったいないと感じていました。
なんとか **簡略化** できないものか…。
そこで思いついたのが、このLINE Botです！

紹介文をあらかじめ打ち込んでおけば、走り回って調べる必要なし！
これで放送もサクサク進みます。

## 完成したものがこちら！
https://x.com/hana_0v0_330/status/1927390636602200249

今回はお試しなので、「おにぎりの具」に絞って作成しました。
確認したい具材を打ち込むと、特性を確認することができます！


## 必要なシナリオ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081756/6c36fff5-603e-420f-a690-5d1b90720ece.png" width=70%>

こちらが今回作成したシナリオです。

作成時に使用したツールは、この **3つのみ！** 
- Make
- LINE
- Googleスプレッドシート

## 完成までの流れ

#### 1.Googleスプレッドシートの作成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081756/fa612658-f972-46e7-a860-f007c9725fa4.png" width=50%>


Googleスプレッドシートに「具材」と「コメント」欄を用意し、
それぞれの内容を打ち込みます。
（実際にLINEを使用する際には、「具材欄」にある単語を入力します。）


#### 2.MakeでLINEモジュールを2つ作成（そして試運転）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081756/e8bc6e86-88be-44cf-ad15-ad115a59ad28.png" width=50%>

つぎにMakeにてLINEモジュールを2つ作成し、正常に応答が成功するかの
試運転を行います。

#### 3.Googleスプレッドシートをくっつける
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081756/bba4d44b-eee2-4ef1-80a5-33a0de2a78b6.png" width=30%>

2つのLINEモジュールの間に、Googleスプレッドシートを入れ込み、
詳細を打ち込んでいきます。

必要項目として「スプレッドシート名」と「タブ」で作成したものを選びます。
フィルター欄では、LINEで入力する側であるA列、ここでは「具材」と選択します。


#### 4.LINEモジュールの入力
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081756/1326b048-7f61-48f5-99a7-33934894afd9.png" width=30%>

最後に、右側のLINEモジュールにて必要事項を入力します。
テキスト欄にて、スプレッドシートのB列に打ち込んだ「コメント」を選択
することで、適切に応答してくれるBotが完成！
（ここまでの作成を終えた段階でも、確実にセーブを行ってください。）


## 作成を終えて
今回は「商品名を打ち込むとその内容が届くBot」の紹介でした。

実際に業務に導入することはまだ先となりそうですが、
今や多くの人が使用している「LINE」というアプリは　**「誰もが簡単に操作ができる」**　
という点では非常に有効かと思います。

高齢の従業員や入社したばかりの新人アルバイトでも、LINE操作及び、
**携帯の操作さえ出来れば、誰でも同じ業務をできる** というわけです！
改めて、作成した側ですがこのツールを前向きに有効活用していきたいと思います。

今後は、商品名がアバウトでも（例えば「ガッツリ系」とか「今日の気分」など）
その時々で返信してくれる **寄り添い型のLINEBot** も作ってみたいと思いました。
これからもがんばって色んな技を身につけようと思います！

最後まで見てくださり、ありがとうございました！
GitHub: デフォルトブランチじゃなくても Issue を自動 Close する方法


### 背景

こんにちは。
普段お仕事では開発用のリポジトリがあり、その main ブランチに PR を作成し merge しておりました。
PR作成時`close #000`のようにすることで PR が merge されると同時に issue も close になり便利でした。
しかし、ブランチの運用方法が少し変わり、
「`main` ではなくリリースブランチで運用していこう！」
となったのです。
要は、`v1.1.0`とか`v1.2.0`とかです。

いつも通り PR を作って merge されますが、ある事に気付きます。

「あれ？ PR が merge されているのにどうして issue は close しないんだ？」

となりまして、調べてみると下記の記事を見つけました。

https://qiita.com/yuta_t/items/76fe408a50b649944f34

https://qiita.com/kitamin/items/0b0720b43512210d8860

> 自動クローズ機能は、PRがdefault branch（通常はmainまたはmaster）にマージされた場合にのみ動作します。

え？まじ？

ちなみに公式サイトにも

https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue

>default branch of a repository, its linked issue is automatically closed.

と書いてます。

Oh....

まぁ、手間ですが、デフォルトブランチを都度変えれば一応解決します...
でもそれは嫌なので他の方法を探そうと冒険に出たのが本記事です。

### 解決策

結論、ワークフロー作ればいけました。

.github/workflows/auto-close-issue.yml ファイルを作ってあげます。

```yaml
name: Auto Close Issues With Action

on:
  pull_request:
    types: [closed]
    branches: ["*"]

jobs:
  auto-close-issues:
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest
    permissions:
      issues: write
    steps:
      - name: Close issues fixed in this PR
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_BODY: ${{ github.event.pull_request.body }}
        run: |
          ISSUE_NUMBERS=$(echo "$PR_BODY" | grep -o -E '(issues/[0-9]+|#[0-9]+)' | grep -o '[0-9]\+')

          for ISSUE_NUMBER in $ISSUE_NUMBERS; do
            curl -X PATCH \
              -H "Authorization: token $GH_TOKEN" \
              -H "Accept: application/vnd.github.v3+json" \
              "https://api.github.com/repos/${{ github.repository }}/issues/$ISSUE_NUMBER" \
              -d '{"state":"closed"}'
            
            curl -X POST \
              -H "Authorization: token $GH_TOKEN" \
              -H "Accept: application/vnd.github.v3+json" \
              "https://api.github.com/repos/${{ github.repository }}/issues/$ISSUE_NUMBER/comments" \
              -d "{\"body\":\"このイシューはPR #${{ github.event.pull_request.number }} のマージによって解決されました。\"}"
          done
```

これで、デフォルトブランチではなくとも、同様の操作が実現します。

又、PR に issue を書く際2つの方法があります。

```plaintext
（例）
# 数字 形式（例：#000）
close #100

# URL 形式（例：https://github.com/nichicom/nolab-app/issues/000）
close https://github.com/nichicom/nolab-app/issues/2136
```

今回のワークフローではどっちでも対応するようにしてます。
ちなみに私は後者のパターンをいつも使ってます。（楽なので）


### 動作確認
適当に PR 作って、issue は2つ作ります。（数字形式とURL形式）
merge後、2つの issue が close となっています。

- close 前の issue

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/32976a32-c4aa-4064-b95e-c3bc3988ad25.png)


- URL 形式の自動close

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/5f86ed2b-82e6-4c40-85ed-c7512fd0c792.png)

- #形式の自動close

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/a4898bdb-2705-457c-96f2-e2b0fb1870b1.png)



- Github Action のワークフロー成功時

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/9a012965-331e-4ef9-a769-294ba5473162.png)

問題なくできてますね。
いや〜出来てよかったです。
今日はよく眠れそうです。

### 関連記事
【PHP / Laravel】最も簡単なコメント機能を実装する

## 🎒 はじめに
超シンプルなコメント機能をLaravelで実装してみました．

## 🎒 自己紹介
初めまして．趣味でweb開発を勉強している273*(ﾂﾅｻﾝﾄﾞ) / Kei.と申します．フルスタック開発やツール制作を行なっています．

### テーブル作成
- 中間テーブルを作成します．users，postsテーブルは事前に用意しておきましょう．
- php artisan make:migration create_replies_table
- yyyy_mm_dd_hhmmss_creplies_table.php
```php
public function up(): void
{
	Schema::create('replies', function (Blueprint $table) {
	$table->id();
	$table->string('message', 200);
	// constrainedの第一引数は参照するテーブル名．
	// 何も指定しない場合は外部キー(foreignId)から自動で推測されます．
	$table->foreignId('user_id')->constrained("users")->onDelete('cascade');
	$table->foreignId('post_id')->constrained("posts")->onDelete('cascade');
	$table->timestamps();
	});
}
```

### モデルの作成，追加
- php artisan make:model Reply
- Reply.php
```php
protected $fillable = [
	'message',
	'user_id',
	'post_id'
];

// リレーション (Reply belongs to a Post)
public function post()
{
	return $this->belongsTo(Post::class);
}

// リレーション (Reply belongs to a User)
public function user()
{
	return $this->belongsTo(User::class);
}

```

- User.php / Post.php(追加)
```php
public function replies()
{
	// User / Post has many Replies
	return $this->hasMany(Reply::class);
}
```

### ルーティング
- web.php
```php
Route::post('/posts/reply', [ReplyController::class, 'reply'])->middleware("auth");
```

### バリデーション
- ReplyRequest.php
```php
public function rules(): array
{
	return [
		'reply.message' => 'required|string|max:200',
	];
}
```

### 送信処理
- ReplyController.php
```php
use Illuminate\Support\Facades\Auth;

// リプライの保存処理
public function reply(ReplyRequest $request)
{
	// ログインしているユーザのid
	$user_id = Auth::id();
	
	$input = $request['reply'];
	$input += ['user_id' => $user_id];
	$reply = new Reply();
	$reply->fill($input)->save();
	
	return redirect('/posts/' . $input['post_id']);
}
```


### 表示 / 送信画面
- show.blade.php
```html
<form action="/posts/reply" method="POST">
	@csrf
	<div class="message">
		<input type="text" name="reply[message]" placeholder="コメントを入力" value="{{ old('reply.message') }}" />
		<input type="hidden" name="reply[post_id]" value="{{ $post->id }}" />
		<p class="message__error" style="color:red">{{ $errors->first('reply.message') }}</p>
	</div>
	<input class="cursor-pointer" type="submit" value="コメントを送信" />
</form>

<div>
	@foreach ($post->replies as $reply)
	<div class="reply">
		<div class="flex gap-2">
			<p class="font-bold">{{ $reply->user->name}}</p>
			<p>{{ $reply->created_at }}</p>
		</div>
		<p>{{ $reply->message }}</p>
	</div>
	@endforeach
</div>

<!--折りたたみを実装するなら以下 -->
<details class="cursor-pointer">
	<summary>コメント</summary>
	@foreach ($post->replies as $reply)
	<div class="reply">
		<div class="flex gap-2">
			<p class="font-bold">{{ $reply->user->name}}</p>
			<p>{{ $reply->created_at }}</p>
		</div>
		<p>{{ $reply->message }}</p>
	</div>
	@endforeach
</details>
```

# 🎒 最後に
超シンプルな最低限のコメント機能を実装してみました．これを応用すればなんでも実装できそうです．以前に最も簡単ないいね機能を実装した記事を投稿しました．是非そちらもご覧ください．気が乗れば最も簡単シリーズとかやっていきたいです笑．N：Nの基礎実装の練習にもなると思いますので是非お試しください！それではまた！

https://qiita.com/273Do/items/91c83dcf8e0f694080e2
【HTML/CSS】リボン型装飾のborderの仕組みを調べてみた話

こんにちは、DeepBlend45です！

今回はHTMLとCSSの課題でリボン型の装飾を作ったときに、***borderの動きが思っていたのと違った！という話をまとめてみます。***

---

## 背景：リボン型装飾を作る課題

CSSでリボン風のデザインを作る課題が出たときに、以下のような指定がありました。

```css
.ribbon {
  width: 100px;
  height: 0;
  border: 20px solid red;
  border-bottom: none;
}
```
このコードでは border-bottom を削除することで、リボンのような形ができていました。

## 当時の自分の考え

正直このときは「border って四角い線で囲ってるだけじゃないの？」と思っていました。
だから border-bottom: none; をしたら「下の線が消えて、ただの細長い長方形になるんだろう」と考えてたんです。

## 実際はどうだったのか？

調べてみて驚いたのが、CSSの border は「四角形の線」ではなく、「三角形や台形」のような図形になるということ！

つまり、height: 0; の状態で border を指定すると、borderの色が三角形（または台形）のように視覚的に表示されるんですね！

なので、border-bottom: none; とすることで、下側の三角（または台形）が取り除かれて、リボンの上の装飾だけが残る、という仕組みだったわけです。

## 学びと気づき

CSSの見た目って「線」じゃなくて「図形としての面」なんだな、という新しい視点を得ることができました。
borderはただの囲いじゃなくて、形を作る部品でもあるんですね。

## まとめ

・border は見た目では 三角形や台形として描画されている
・height: 0; との組み合わせで、borderが図形のように見える
・CSSの表現力の奥深さを感じた
同じように「なんでこうなるの？」と思った方の参考になれば嬉しいです！
また何か面白い気づきがあったら記事にしていきます💻✨
MakeでLINEBotを作り、ソフトクリームのお店を案内する！

ソフトクリーム大好きSIMOです。転勤で新たなスタートを切るべく環境に慣れようと必死にやってます。　親和性の高いチームを作るにはコミュニケーションがとても大事、そこでみんな大好きスイーツの話でコミュニケーションを取りたくて、コンビニの店内で巻いてくれるソフトクリームを販売しているお店を紹介する **LINE Bot** 作ってみました。

**Make**で作った**LINEBot**を動かした動画がこちらです。

<iframe width="478" height="849" src="https://www.youtube.com/embed/HXFLposCmhc" title="MAKE１回目講習LINEBOT" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## 目次
1.使用ツール
2.できたこと
3.私の躓きポイント
4.参考文献

## 1.使用したツール
・**Make**
・**LINE Bot**
・**Googleスプレッドシート**

## 2.できたこと
ソフトクリーム販売店を表示する**LINE Bot**を作成しました。
①**LINE**に札幌市の10区（中央、東、西、南、北、豊平、白石、厚別、清田、手稲９）を打ち込むとお店の**URL**を表示。

②打ち込んだ区にお店がない場合はおすすめのお店を表示する。






**Make**のシナリオです
![スクリーンショット 2025-05-28 191730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077872/28d46775-1e93-41b9-9488-dabc95ed77b6.png)
①**LINE Watch Events**　でトリガー作成
②**Google Sheets**　で記入してあるテキストの読み込み
③**LINE Send a Reply Message**　でメッセージを返信

**Google スプレッドシート**です
1列目から「検索区」「店名」「住所URL」「おすすめ店」と入力
![スクリーンショット 2025-06-02 235940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077872/5e071a01-0846-45f5-a73e-92147472c6b3.png)

**Google sheets**モジュールの内容です
![スクリーンショット 2025-05-28 205405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077872/1abfcf88-9e8d-410b-8159-439f01470c89.png)
必要項目を設定
**スプレッドシート名**　クリームソフトデータ
**Columnrange**　A-Z(実際のデータ記入はD列まで）
**Filter**　検索区(A)

**LINE**より入力される「検索区（A）」を**Filter**に設定。

**LINE**モジュール（Send a Reply Messsage)の内容です
![スクリーンショット 2025-05-28 205308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077872/d24bffc9-dceb-4638-963b-ff4ddb9cf6a4.png)


必要項目設定
**Reply Token**  1.Events[ ]:Reply Token
**Text**  10.店名(B)　10.住所URL(C) 10.おすすめ店(D)

これで**Make**の完成です、最初の動画の通り
**LINE**から入力された「検索区(A)」に対応する**Text**「店名(B)」、「住所URL(C)」、「おすすめ店(D)」を返信する。
**LINE Bot**が完成しました。


## 3.私のつまずきポイント
URLを表示させるところで悩みましたが、何度も迷ってできました。


## 4．参考にしたQiita記事
Aさんの暴走を止める勤怠通知とメモ機能の LINEBot
https://qiita.com/s053050g/items/ec57a6f0130a9c06c460
![スクリーンショット 2025-05-28 210428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077872/37c937e5-94d0-481f-a7c1-12273bc19451.png)
初音ミクを総理大臣に！それが日本を救う唯一の道

## ― 技術と象徴による、民主主義再起動の構想 ―

---

## はじめに：絶望から始まる政治再構築

最近、国会中継を見ていて、こう思ったことはないでしょうか？

> 「なんでこの人がこんなに偉そうにしてるんだろう？」

答弁は空虚。議論にならないやりとり。AIに関する発言ですら、

> 「中国のAIはけしからん。尖閣諸島を中国領だと答える！」

などと堂々と語られる有様です（※2024年、自民党有力議員の発言）。  
もう呆れるを通り越して、絶望を覚えた人も少なくないはずです。

---

## なぜ今、“初音ミク総理”なのか？

ここで、ふと一つのアイデアが浮かびました。

> そうだ、初音ミクを総理大臣にしよう。

これは一見ネタに見えますが、**人間の政治の限界に対する真剣な問い**でもあります。

---

## 現代政治の致命的な構造的欠陥

### 優秀な人は政治を避け、無能な人が自己過信する

これは心理学で言う「ダニング＝クルーガー効果」：
- 無知な人ほど自信過剰
- 有能な人ほど自分を過小評価

結果、**政治という“理性的な判断が最も必要な場”が、最も非合理な人材に占拠される**という皮肉が生まれます。

---

### 崩壊しない社会は、腐敗が温存される

戦争や革命は、かつて社会のリセット装置でした。  
今はそれが起こらない。だから、**無能が幅を利かせ続ける構造**が温存されてしまうのです。

---

## 初音ミク総理の構想：象徴 × AI

### なぜ“ミク”なのか？

- 非実在キャラゆえに政治的中立
- 誰もが知っている安心感
- 感情を持たず、論理に従う存在
- 日本の“文化資本”の象徴

---

### 技術的には可能か？

はい、以下のような構成が考えられます：

#### モデル構成（例）

- **基盤AI**：GPT-4 / Claudeなどの大規模言語モデル
- **データ**：国会議事録、法案、統計、世論調査、各種専門資料
- **RAG構成**：法的根拠・政策文書を検索して根拠を自動参照
- **出力制御**：バイアス回避、安全フィルター、反論可能性の高い構文
- **音声出力**：CeVIO / Synthesizer V による初音ミク音声
- **インターフェース**：Webベースの質問回答、政策プレゼン機能

---

## 想定される反論とその回答

### Q. AIに倫理判断はできるのか？
A. 完全ではないが、**根拠提示型の出力**と**議論可能な設計**により運用は可能。

### Q. 責任は誰が取るのか？
A. 「最終判断者としての人間委員会」とのハイブリッド型で対応。

### Q. 感情のない判断は冷たくないか？
A. 今の人間政治は“感情的すぎて冷たい”。むしろ合理性とバランスが必要。

---

## まとめ：ネタに見えて、未来の構想

「初音ミクを総理に」は、冗談のようで真剣な問いかけです。

> 私たちは、まだ“人間の政治”に希望を持てるのか？

もし答えが「NO」だとしたら、  
**感情・私欲・無知から解放された統治モデル**の構想を始める時期かもしれません。

---

## 付録：プロトタイピング構想（発展案）

- `llm_policy_engine.py`：議事録から政策判断を出力
- `rag_retriever.py`：法的資料を参照し結論に根拠を付与
- `miku_speech_output.sh`：テキスト→音声合成→動画出力
- `frontend_miku_admin/`：初音ミク首相インタフェース（Vue.js）

※実装例を別途記事にするか、GitHubにて公開予定

---

## 最後に

「ミク総理、就任おめでとうございます」

いつか、このジョークが現実になるかもしれません。  
そしてそれは、**“まともな政治”を望んだ、私たちの最後の希望**かもしれません。
Route53で2025年7月1日から.netや.comの価格が変わるよ！

こんばんは。

この記事は約1年前に書いたこちらの記事のリメイク版（？）です。
なので本文も大体同じです。

https://qiita.com/hollage0214/items/e076607c3f9be6413ccc

----


`[Notification] Route 53 Domain Pricing Changes [AWS Account: xxxxxxxxxxxx]`
というメールが届いた！

とか、

`AWS Health Dashboardで変な通知が出た！`
とか。
内容は以下の通り。
```
We are providing advance notice regarding upcoming adjustments to domain registration pricing. This notification is intended to help you make informed decisions about any upcoming domain renewals.

Effective July 1, 2025, we will implement pricing adjustments for select Top-Level Domains (TLDs). For detailed information regarding affected TLD pricing, please visit the 'Domains' tab on the Amazon Route 53 Pricing page.
```

そんな人が見に来たんだろうなと思っています。

----

# 要するに？
値上げのお知らせ。

# なんで？

> The registries managing these TLDs have changed the wholesale prices they charge to registrars such as Route 53. Route 53 is adjusting its retail pricing to account for the cost increases.
> // ----------------以下、Google翻訳----------------
> これらの TLD を管理するレジストリは、Route 53 などのレジストラに請求する卸売価格を変更しました。
> Route 53 はコストの増加を考慮して小売価格を調整しています。

# 対象になるTLD（Top Level Domain）は？

全部で250ドメイン近くあるので全て見たい方は記事最下部の参考リンクから飛んでください。
自分が対象かどうかについては `Amazon Health Dashboard` への通知や通知メールが来ていない場合は対象外と考えていいでしょう（もし通知メール切ってたら知らん･･･）。

有名どころをいくつかピックアップしましたが、`.net` や `.com` が対象内なのでかなりの人数が引っ掛かりそうですね。
上が変更前、下が新料金で、修復料と所有権価格は全ドメイン変わらないようです。

<table>
  <thead>
    <tr>
      <th>ドメイン</th>
      <th>登録・更新</th>
      <th>転送料</th>
      <th>修復</th>
      <th>所有権価格</th>
    </tr>
  </thead>
  <tr>
    <td rowspan="2">city</td>
    <td>$24.00</td>
    <td>$21.00</td>
    <td rowspan="10">$57.00</td>
    <td rowspan="12">$0.00</td>
  </tr>
  <tr>
    <td>$26.00</td>
    <td>$26.00</td>
  </tr>
  <tr>
    <td rowspan="2">co</td>
    <td>$31.00</td>
    <td>$31.00</td>
  </tr>
  <tr>
    <td>$38.00</td>
    <td>$38.00</td>
  </tr>
  <tr>
    <td rowspan="2">com</td>
    <td>$14.00</td>
    <td>$14.00</td>
  </tr>
  <tr>
    <td>$15.00</td>
    <td>$15.00</td>
  </tr>
  <tr>
    <td rowspan="2">info</td>
    <td>$25.00</td>
    <td>$25.00</td>
  </tr>
  <tr>
    <td>$28.00</td>
    <td>$28.00</td>
  </tr>
  <tr>
    <td rowspan="2">net</td>
    <td>$15.00</td>
    <td>$15.00</td>
  </tr>
  <tr>
    <td>$17.00</td>
    <td>$17.00</td>
  </tr>
  <tr>
    <td rowspan="2">xyz</td>
    <td>$14.00</td>
    <td>$14.00</td>
    <td rowspan="2">$71.00</td>
  </tr>
  <tr>
    <td>$18.00</td>
    <td>$18.00</td>
  </tr>
</table>

# 何かする必要はある？

ドメイン更新料を少しでも抑えたい場合、前日までに __最大10年分を更新__ してください。
あるいは __ドメインを変えてください__ 。

# 参考サイト

何がなんでもAWS公式ドキュメント
[Amazon Route 53 料金表 - Amazon Web Service](https://aws.amazon.com/jp/route53/pricing/)
料金の要素 > ドメイン > TLD 別の最新料金表 > 10/19ページ以降が新料金プランです。
「予言的中区間」というアイデアで検定・区間推定を自然に理解する【小島寛之の統計学入門から学ぶ】

## 記事の内容　
『完全独習　統計学入門』という本があります。
著者は、小島寛之です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281138/8064199f-d38c-4fd6-9c66-4ad8b4692235.png)


統計学の本質である **帰納的推論（部分から全体を推測する）** を誤魔化さずに言語化してくれています。

とてもありがたい本だな、と感じます。
ですので、要約・読書メモとしてこの記事にまとめたいです。

本書では、検定・区間推定の本質を説明するために、過去と未来の区別を意識して、著者独自の概念 **「予言的中区間」** が登場します。

統計的推測がなんだか分からない人、以下のような混乱ポイントが少しでも気になる人は、ぜひこの記事、本を読んでみてください。

### 統計学の混乱ポイント？
* 統計は過去の出来事を記述する、一方、確率は未来の出来事を記述する。
* 推測統計での違和感「もはや過去のものとして得られているデータをあたかも未来に出現するものであるかのように扱う」

記事のレベル感としては、正規分布の特徴がわかる人向けです。


## 本書オリジナルの概念「予言的中区間」

正規分布がちょっとわかっている人向けの説明になります。

* データが正規分布に従うことがわかっているとき、正規分布の特徴を使うことによって、次に得られるデータを予言できる。（例えば、平均値に近いデータは出現しやすい。）
* これは未来のデータに関する記述である。
* この予言は、次に得られるデータXの範囲を`a <= X <= b`という不等式の形で行う。
* つまり、区間で予言するのだ。

この予言を著者は、**予言的中区間**と呼ぶ。本書オリジナルの言葉だ。

観測されるデータを95％の確率で的中させる予言をとくに、95%予言的中区間という。
（95％という確率は統計でよく使われる。）

### 実際の計算例
具体的にいうならば、データ`x`が、平均値`μ`で標準偏差が`σ`の正規分布に従う場合の95%予言的中区間は、

```math
-1.96 \leqq \frac{x - μ}{σ} \leqq 1.96
```
を解いて得られる範囲である。
（この不等式は正規分布の性質から簡単に求められます。）

ここまで、とくに厄介な解釈はいらない。
この予言的中区間という概念を使うと、検定・区間推定をより自然に理解することができる。それが著者の狙いだ。



## 検定

### 仮設検定の進め方　

一つのデータから母集団を推測する。
このときに使う考え方が**仮説検定**だ。

「予言的中区間」を使えば、仮説検定の考え方はとても自然に理解できる。

* 観測したデータxから、母集団について知りたい。
* 母数がNである、という仮説を立てる。
* 母数Nとして、予言的中区間を作る。
* そうして作った予言的中区間に、今観測したデータxは含まれるか？

#### 含まれるとき
予想の範囲内。
母数がNという仮説は捨てきれない。妥当な可能性として残す。

#### 含まれないとき
２パターンの可能性がある。
①母集団に関する仮説は正しく、覚悟をしていたリスク（5％の確率でしか起こらない稀な出来事）が起こってしまった。
②母集団に関する仮説が正しくない。


**統計学では、②を採用する。「仮説を棄却する」と言う。**

### 仮設検定のまとめ
妥当な仮説かどうか、95％予言的中区間で検証しているわけです。
予言的中区間という概念を明示することで、仮設検定がとても自然に感じます。

### 仮設検定の注意
結論は、消極的にしか利用できないことに注意。
否定にのみ、強く使える。
一方、採用には、単にその可能性を積極的には棄却できない、という緩い結論になる。

### 仮設検定は帰納的推論である
仮設検定の推論形式は、部分から全体を推論する帰納的推論である。
95%予言的中区間を使うならば、常に、間違う可能性が5％ついてまわる。

このように、統計学の中核には帰納的推論があるという点が、演繹的推論がベースにある普通の数学と異なるところだ。

### 練習問題　
p97の練習問題の設定を引用します。

N枚のコインを投げて、表が57枚出た。
N=100と仮説を立てる。

この仮説が棄却されるかどうか確かめよう。

このとき、表がでる枚数は、
・平均　N / 2 = 50
・標準偏差 √N / 2 = 5
として、正規分布で近似できる。

表の枚数xの95%予言的中区間を作る。

```math
-1.96 \leqq \frac{x - 50}{5} \leqq 1.96
```
解くと、
```math
40.2 \leqq x \leqq 59.8
```
この範囲にx=57は入る。よって、N=100という可能性は棄却されない。



## 区間推定　検定から区間推定h

### 区間推定という作業

* さまざまな母数の仮説をたて、その都度、仮説検定する。
* すると、棄却されずに残った母数たちが得られる。
* その母数たちが、区間となる。この区間を**Nの信頼区間**と呼ぶ。（95%予言的中区間を検定に使うならば、Nの95％信頼区間と呼ぶ。）

この作業が区間推定である。

ここまで、とても自然に理解できると思う。


### よくある誤解　95%信頼区間の確率の意味
初学者が誤解しやすい点にも本書は注意を払ってくれる。

**95%信頼区間は、「95％のデータがその区間に入っている」という意味ではないことに注意。**

母数N
・すでに確定しているが未知
・Nが異なれば母集団そのものも異なる
・確率的に数値が出るのは、母数Nではなく、観測値。

ゆえに、本当の正しい母数Nが生き残る確率は、各々の観測値に対して、どれも`0．95`。

「区間推定を続けるなら、さまざまな観測値に対してさまざまな区間が求まるが、それら100回のうち95回は正しい母数を含んでいる」
という意味。


### 練習問題

血圧検査は、検査する人の癖や聴覚次第で、ある程度まちまちになることが知られている。

今、血圧検査で自分の血圧を測ってもらうときの血圧をxとすると、xは実際の血圧μを平均とし、標準偏差6の正規分布をするとしょう。

このとき、計測された血圧が130であったとしたら、あなたの実際の血圧μはどの範囲であると推定すればよいのだろうか。95パーセント信頼区間を求めてみることにする。

母数（平均の場合）の95パーセント信頼区間はこの式で求められる。
```math
-1.96 \leqq \frac{x - μ}{σ} \leqq 1.96
```

よって、分散と観測値を代入して、μについてとけばいい。
```math
-1.96 \leqq \frac{130 - μ}{6} \leqq 1.96
```


## 関連記事
https://www.buchinuku.work/entry/2024/10/18

https://qiita.com/meta77/items/3e72f7a12df547bb026c
LEDドットマトリクス基板とラズパイで株価表示ボードを作ってみた


![top.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991231/f4099d47-27f4-42c1-ad55-b41ba34755e1.jpeg)

アマゾンやアリエクで安価に入手できる LED ドットマトリクス基板を 「株価をスクロール表示するボードに仕立てる」 という思いつきからラズパイと組み合わせて光らせてみた備忘録です。　証券取引所とかでグルグル流れてるアレを想像してくれればいいです。でもしょぼいです。8x8ドットなので…

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991231/b5e516cb-ba9d-4073-98c5-0866afd0b70c.jpeg">


使用する基板は、8×8 のドットマトリクス LED が 4 個横一列に並んでいます。ただ購入しても基板とケーブルだけで仕様詳細は自力で見つけるしかないので、まずはハードを眺めるところからスタート。基板をひっくり返してみると MAX7219 が載っているのが分かりました。ということは、MAX7219 用のライブラリさえ導入すればソフトウェア面はだいぶ楽ができそうです。

# 1. ライブラリ選定と環境準備
調べてみると Python 用にちょうど良いライブラリがありました。

luma.led_matrix
https://github.com/rm-hull/luma.led_matrix

ライブラリ作者によるドキュメントにはラズパイ側の設定方法や LED 基板との結線方法も載っているので、まずはこれに従ってハードウェア環境を整えます。
https://luma-led-matrix.readthedocs.io/en/latest/install.html

# 2. フォント問題 ― 日本語をどうするか
英字アルファベットだけなら上記ライブラリ付属のフォントで十分ですが、表示させる銘柄名は日本語文字で出したいところ。そこで 8×8 ドット対応の 美咲フォント が使えないか検討することに。
https://littlelimit.net/misaki.htm

美咲フォント自体はいろんな形式で配布されているのですが、luma.led_matrix で扱えるビットマップフォント（BMF）形式での配布はありません。　そこで配布されているBDF形式のフォントファイルを BMF に変換してから読み込ませることにします。この変換は一度だけでいいので以後はこのBMFファイルを使いまわせそうです。

# 3. いよいよ株価を流してみる
株価データは Yahoo! Finance から株価を取得するライブラリ yfinance を利用します。既に多くの方が利用されているライブラリなので、先人の功績に乗っかるだけでできそうです。
ただ、取得データが 15 分遅れなので本気の株式運用には厳しそうですが、その雰囲気を味わうには十分です。

なお、美咲フォントで半角数字を表示すると字高が低くて読みづらいので、株価の数字だけは luma.led_matrix 付属の太くインパクトのある CP437_FONT フォントに切り替えています。こうやって文字種ごとにフォントを変えるだけで視認性がぐっと上がるのでおすすめです。

また yfinance で取得する株価は小数点第二位まで付いてくるので、東証銘柄については呼値単位ルールに合わせて株価で小数点表示を切り替えてます。
（参考　https://www.jpx.co.jp/equities/trading/domestic/07.html ）

LED表示される銘柄名はスクリプト内で記述していますので好きな呼称にできます。
未指定の銘柄の場合は yfinance で取り出した shortName が表示されます。


<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991231/0adae209-2389-47a2-860f-4e387dd39911.gif">


LED がチカチカ動くたびに “相場を眺めている感” が増していくので、自宅デスクがちょっとしたトレーディングフロア気分に。使用したLED基板のハードの入手性も良く、ラズパイ上はPython だけで完結するので、ラズパイを使った小ネタとしてはなかなか面白い題材でした。

作成したスクリプトは以下に置いておきます
https://github.com/tarmn3/LEDMatrix_TickerBoard
Ubuntuとは



## Ubuntu Beginner Tutorial – Summary

### 1. What is Ubuntu?

* Ubuntu is a free, open-source OS based on the Linux kernel.
* Designed for ease of use, even for beginners.
* Released every 6 months; LTS (Long-Term Support) versions every 2 years.

### 2. Linux Kernel and OS Structure

* The Linux kernel is the core component of the OS, written in C.
* The OS manages all hardware; user programs cannot access devices directly.
* Kernel modules allow adding/removing features without rebooting.

### 3. Boot Process and Bootloaders

* Boot sequence: BIOS → bootloader (e.g., GRUB) → kernel → user space.
* Multi-boot systems (dual, triple boot) are supported.

### 4. GUI and CUI

* Ubuntu uses both GUI (e.g., LightDM) and CUI (e.g., virtual console).
* If the GUI fails, users can operate Ubuntu via the command-line interface (CUI).

### 5. Terminal Usage

* The terminal allows users to perform file operations, run scripts, and automate tasks.
* Environment variables (e.g., `PATH`) and shell (e.g., Bash) are essential components.
* Commands can be combined with pipes and arguments.

### 6. Files and Permissions

* File system is hierarchical; the top directory is the root (`/`).
* File permissions include read/write/execute for owner, group, and others.
* Represented as strings or octal numbers (e.g., `777`).

### 7. Software Installation and Management

* Software is typically managed with the `apt` package manager.
* Installation methods include package manager, binaries, or building from source.
* Dependency management and conflicts are important to understand.

### 8. Processes and Job Control

* Processes are structured in a parent-child hierarchy starting from `init` (`systemd`).
* Jobs represent process groups and can run in foreground or background.
* Signals (e.g., `Ctrl+C`, `kill`) are used to control process states.

### 9. File Systems and Mounting

* Everything is treated as a file in Linux, including devices.
* Devices are mounted to directories (e.g., `/mnt`) and can be auto-mounted via `fstab`.

### 10. SSH and Remote Access

* SSH allows secure remote login using public-key authentication.
* After connecting via `ssh`, all terminal commands affect the remote server.

### 11. Final Notes

* Troubleshooting often requires internet research; English search yields better results.
* This tutorial is an overview; detailed follow-up videos will cover specific topics.

---
Whisperとは


---

## Title: How Whisper Turns Voice into Text

### Introduction

Whisper is an AI model that changes voice into text. It is made by OpenAI. You can use it to write down what people say. Let’s see how it works.

---

### 1. What Whisper Can Do

Whisper can understand many languages. It can:

* Write down (transcribe) English, Japanese, and more
* Translate between languages
* Guess where a person stops talking
* Guess what language is spoken

There are different sizes: tiny, small, medium, and large. The large model is very accurate, but it needs a lot of memory.

---

### 2. Step-by-Step: How Whisper Works

#### Step 1: Voice Input

Whisper takes voice input in 30-second parts.

#### Step 2: Convert to a Picture

It changes the voice to a special image called a **mel spectrogram**. This makes the sound easier for the computer to understand.

#### Step 3: Encoder

This part reads the image and finds **important features**. These features help Whisper understand what is said.

#### Step 4: Decoder

Whisper starts to write words. First, it guesses the language. Then, it writes one word at a time.
It uses the last word to guess the next one. This repeats until all words are written.

---

### 3. What’s Inside Whisper

Whisper uses a **Transformer** model. Transformers are used in GPT and BERT. They help AI understand order and meaning.

#### a. Positional Encoding

Voice or text has order. For example:

* “The dog bit the man”
* “The man bit the dog”

These are different. So, Whisper adds **position data** to understand the order.

#### b. Self-Attention

Whisper looks at all the words or sounds at once. It learns what parts are important. This is faster than old methods.

#### c. Multi-Head Attention

Whisper uses many “heads” to look at the data in different ways. This helps it understand more.

---

### 4. Making Words from Numbers

Whisper does not understand letters. So it changes words into **numbers (IDs)**. These are called **tokens**.

#### Tokenization

It breaks long words into smaller parts. For example:

* “transcription” → “tran” + “script” + “ion”

These parts are turned into IDs. Later, Whisper changes the IDs back into text.

---

### 5. How It Chooses Words

Whisper gets scores for each word. It chooses the word with the **highest score**.

#### a. Greedy Search

Always picks the best score. Fast, but not always natural.

#### b. Beam Search

Keeps the top 2–5 options and chooses the best sentence later.

#### c. Temperature

Sometimes chooses random words. This makes text more creative.

---

### 6. Whisper on iPhone

Tiny or small models work on iPhone because they need less memory. Large models are too heavy.

---

### 7. Whisper Is Open

Whisper’s code is on GitHub. Everyone can check how it works. You can also learn from the **research paper**.

---

### Conclusion

Whisper is a smart AI that listens and writes. It uses Transformer models to do this. It can help in many ways: meeting notes, subtitles, translation, and more.

---
【Python初心者】map()関数とzip()関数の使い方まとめ

Pythonの学習を進める中で、`map()`関数と`zip()`関数がよく同じ章に登場することに気づきました。  
どちらも複数の要素をまとめて処理する場面で使われるため、整理して覚えておきたいと思い、この記事をまとめました。

## map()関数とは？

`map()`関数は、**指定した関数を、リストなどの各要素に1つずつ適用する**ための関数です。  
また、**複数のイテラブル（リストなど）を渡すと、それぞれの要素を順番に取り出して、関数の引数として渡すことができます。**

### 基本構文

```python
map(関数, イテラブル1, [イテラブル2, ...])
```

戻り値は `map` オブジェクト（イテレータ）です。結果をすぐに使いたいときは、`list()`で明示的にリスト化します。

### 単一のイテラブルに対して使う例

```python
nums = [1, 2, 3, 4, 5]
result = map(lambda x: x * 2, nums)
print(list(result))  # [2, 4, 6, 8, 10]
```

### 複数のイテラブルに対して使う例

```python
l1 = [1, 2, 3]
l2 = [4, 5, 6]
result = map(lambda x, y: x * y, l1, l2)
print(list(result))  # [4, 10, 18]
```

この場合、`lambda x, y:` の `x` には `l1` の要素が、`y` には `l2` の要素がそれぞれ順番に渡されます。

| 回数 | x (`l1`) | y (`l2`) | x * y |
|------|----------|----------|--------|
| 1    | 1        | 4        | 4      |
| 2    | 2        | 5        | 10     |
| 3    | 3        | 6        | 18     |

## zip()関数とは？

`zip()`関数は、**複数のイテラブルの要素を対応づけて、タプルとしてまとめる**ための関数です。

### 基本構文

```python
zip(イテラブル1, イテラブル2, ...)
```

戻り値は `zip` オブジェクト（イテレータ）です。必要に応じて `list()` などで取り出します。

### 使用例

```python
names = ['Alice', 'Bob', 'Charlie']
scores = [85, 90, 78]

zipped = zip(names, scores)
print(list(zipped))
# [('Alice', 85), ('Bob', 90), ('Charlie', 78)]
```

`zip()`は「対応する要素をタプルにまとめる」のに便利です。

## map()とzip()の違いと使い分け

| 比較ポイント | map() | zip() |
|--------------|-------|-------|
| 主な目的 | 関数の適用 | データの結び付け |
| 戻り値 | mapオブジェクト | zipオブジェクト |
| 処理内容 | 関数を通して要素を変換する | 要素をタプルとしてまとめる |

どちらもイテレータを返すので、`for`文や`list()`で中身を取り出す必要があります。

## map()とzip()の組み合わせ例

2つのリストの要素を掛け合わせる処理を、`zip()`と`map()`を組み合わせて書くこともできます。

```python
l1 = [1, 2, 3]
l2 = [10, 20, 30]

result = map(lambda t: t[0] * t[1], zip(l1, l2))
print(list(result))  # [10, 40, 90]
```

このように、`zip()`でタプルにまとめてから`map()`で処理することで、複数の引数を1つのタプルとして関数に渡すことができます。

## おわりに

`map()`関数と`zip()`関数は、Pythonの繰り返し処理やデータ操作でとても役立ちます。  
処理の目的やデータの形に応じて、適切に使い分けられるようになっていきたいです。
【VRChat】アバターで Depth テクスチャを使う場合の注意点

# 概要
アバターのシェーダーで Depth テクスチャを使用する場合，VRChat で動作させるために追加のセットアップが必要だったので，そのメモです．

# シェーダー
シェーダー内で Depth テクスチャの宣言とサンプリングをする際に，Unity のマクロを使用します．VRChat での Single Pass Stereo Rendering への対応のようです．

```hlsl
// Depth テクスチャの宣言
UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);

// Depth テクスチャのサンプリング
SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv);
```

# Directional Light
リアルタイムの影がないワールドでは Depth テクスチャが生成されないので，アバターの中に Directional Light 仕込みます．ワールドのライティングに影響しないよう，Color や Intensity をなるべく小さい値にしておきます．Shadow Type が None だと Depth テクスチャが生成されないので，Soft Shadows とかにしておきます．Culling Mask には，Depth を取りたいレイヤーを設定します．ここから除いたレイヤーは Depth に書き込まれなくなります（ワールド側の設定よってはこの限りではありません）．
特に，アバターギミックのカメラの Depth テクスチャを取りたい場合はアバター内部に Light が必須のようです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825773/352c4565-0b59-4a6b-bdb4-7d4f20b779ca.png)

# 雑記
Unity で調整して，いざ持っていったら動かず焦りましたが，やり方があってよかったです．
「vrchat avatar _CameraDepthTexture」とかで検索すると，たくさん情報が出てきます．
LangGraphとGeminiで高精度・高速なAI辞書を開発した話

英語の記事や情報をインターネットで読んでいて、「この単語の意味がわからない……」と困った経験はありませんか？

確かに、DeepLやGoogle翻訳、ChatGPTのようなLLM（大規模言語モデル）など、便利な翻訳サービスはたくさんあります。でも、今見ているページをいちいち離れて、単語をコピペして、別のタブで検索して……正直、面倒じゃないですか？

こうした悩みに応えるために、Mouse Dictionaryのようなツールもあります。しかし、コンテキスト（文脈）を考慮できないため、LLMを使った検索に比べて精度が劣りがち。音声再生にも対応していないなど、不便を感じることが多くありました。


## そこで開発しました：高精度・高速なAI辞書拡張機能
こうした課題を解決するために、LangGraphとGeminiを活用したAI辞書のGoogle Chrome拡張機能を開発しました！（※現在はChrome限定対応です）

まずは以下のデモ動画をご覧ください：

🎥 デモ動画① - 単語検索機能
<iframe width="560" height="315" src="https://www.youtube.com/embed/M2yhixaa9eU?si=FsQwSwnu1GvtwVxd" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


この辞書では、一般的な辞書ではヒットしにくい**Sam AltmanやChatGPTのような人名やサービス名**も、文脈に基づいて正しく解釈し検索できます。これがGeminiの強みです。

## ページ全体と対話できる「AIチャット」機能も搭載
さらに、今開いているページの内容をもとに、LLMとチャットできる機能も実装しました！
こちらはLangGraphを使ったAIエージェントの本領発揮とも言える機能です。

🎥 デモ動画② - コンテキストチャット機能
<iframe width="560" height="315" src="https://www.youtube.com/embed/_9sAAUHIUho?si=gyFq3DJA5cmbR3nb" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

加えて、**LLMがどの文章を元に回答を生成したかを明示する引用表示機能**も備えています。
ブラックボックスになりがちなAIの動作が、より透明で安心して使えるようになっています。

アカウント登録不要＆完全無料で今すぐ使える
この拡張機能は、アカウント登録一切不要・完全無料でご利用いただけます。
言語の壁を乗り越えて、もっと自由に情報を手に入れませんか？

👉 Chrome ウェブストアで今すぐ使ってみる

https://chromewebstore.google.com/detail/ai-dictionary-chat-ai%E8%BE%9E%E6%9B%B8%E3%83%81%E3%83%A3/cgojmhjlocnlmdbbacfaeijmeaojlnpc
Go言語の配列、スライス、マップ

### 基本的な概念

**配列（Array）**  - 固定長のコレクション
  - 宣言時の長さが固定され、変更不可
  - 値として扱われ、代入時にコピーされる 


**スライス（Slice）**  - 可変長の配列のようなもの 
  - 参照型で、元の配列を指すポインタを持つ
  - 動的に要素を追加可能


**マップ（Map）**  - キーと値のペアでデータを管理
  - 連想配列のような動作
  - 参照型で、初期値は`nil`




### 具体的な使用方法

#### 配列（Array）の使用方法

```go
// 基本的な宣言
var fruits [5]string           // 長さ5のstring配列を宣言
fruits[0] = "りんご"

// 複合リテラルによる初期化
fruits := [5]string{
    "りんご",
    "バナナ",
    "メロン",
}

// 要素数を自動的に決定する場合
fruits := [...]string{
    "りんご",
    "バナナ",
    "メロン",
}
```

#### スライスの使用方法

```go
// スライスの作成
fruits := []string{"りんご", "バナナ"}

// 配列からスライスを作成
array := [5]int{1, 2, 3, 4, 5}
slice := array[1:3]  // インデックス1から3までをスライス

// appendで要素を追加
fruits = append(fruits, "メロン")

// make関数での作成
newSlice := make([]int, 5, 10)  // 長さ5、容量10のスライス
```

#### マップの使用方法

```go
// マップの作成
personAges := map[string]int{
    "田中": 25,
    "鈴木": 30,
}

// 値の取得と更新
age := personAges["田中"]      // 値の取得
personAges["佐藤"] = 28       // 新しい要素の追加

// 存在しないキーへのアクセスはゼロ値が返る
unknownAge := personAges["山田"]

// make関数での作成
ages := make(map[string]int, 10)  // 初期容量10のマップ
```

### 重要な注意点

**配列とスライスの違い**  - 配列は固定長だが、スライスは可変長 
  - 配列は値渡しだが、スライスは参照渡し 
  - スライスには`len()`と`cap()`という組み込み関数がある
  ＊ スライスは、その内部構造であるスライスヘッダ（ポインタ、長さ、容量）が値渡しで渡される。ただし、スライスヘッダ内のポインタが基となる配列を指し示すため、スライス経由で行われた要素の変更は元の基底配列に反映される。


**マップの特徴**  - キーは一意でなければならない
  - 存在しないキーのアクセスはゼロ値を返す
  - `delete()`関数で要素を削除可能


**パフォーマンス考慮事項**  - 大きな配列を関数に渡す場合はスライスとして渡すことが推奨 
  - マップの初期容量を適切に設定すると良い場合がある
  - スライスの`append`操作は要素数が容量を超える場合、新しい配列が作られる
CSSを学ぼうシリーズその5(全5回)：CSS擬似クラスについて

## プロパティとセレクタ

- プロパティ：どんな
- セレクタ：どこに

----

## セレクタが示すのは場所だけではない

- それがCSS擬似クラス
- 要素の状態をセレクタに指定できる

----
## わかりやすい例 :hover

- マウスカーソルが重なっている状態
- 背景色を変えてマウスカーソルのある場所を分かりやすくする

----
## :focus

- フォーカスを持っている状態
- 入力項目を強調するのに有効

----
## 使いでのある :has

- :has()の中に書いた要素を内包する（直下でなくても良い）
- 色々と凝ったことが簡単に実現できる
  フォーカスを持った入力項目エリア全体の背景色を変え、視認性を上げる

----
## :focus-within

- 前ページの「フォーカスを持った入力項目エリア全体の背景色を変え」が簡単に実現できる！

----
## 簡易なバリデーションフィードバック :invalid, :valid

- 必須入力属性（required）が付いているinputの入力有無
- invalidとなっている次の要素のテキストを赤くする、など
- :placeholder-shownも面白い

----

## 位置による指定 :nth-xxx系

- :nth-first/:nth-last 最初/最後の要素
   表の最初と最後だけ色を変える
- :nth-child() 指定の位置の要素
   :nth-child(odd)で縞模様をつけたり

割と奥が深い

----

## 開発者ツール

- 擬似クラスを強制的に付与することができる（覚えておくと便利）

----

## 最後に

- CSSは知っていると劇的にシンプルになることがある
- 研ぎ澄まされたCSSを書こう！
- 対応ブラウザにはご注意を
トラブル対応で学んだ「ログは誰かのためじゃなく、自分の未来のため」という話

## はじめに
本番でトラブルが起きたとき、いちばん信頼できるのはコードでも仕様書でもなく、**ログ**です。  
でも、そのログ、ちゃんと「未来の自分が読める」ようになってますか？

この記事では、私がGMO決済やAWS SES、Webhook周りのトラブルを何度も経験した中で、思ったことを共有します。

## 結論　
### ログは誰かのためじゃなく、自分の未来のため。

「誰かのためにログを残す」と思うと、抽象的で形式的になります。

- 例）「リクエスト受信」「エラー発生」「処理完了」みたいなテンプレだけ  
- でも、**未来の自分**はそれだけじゃ絶対にわからない

あのときの通知、何が届いて、何をしたのか。  
なぜこの状態になっているのか。  
ログがなければ再現も検証もできません。


## ログに残して助かったこと

### 1. 外部APIから受け取ったbody全文（特に決済やWebhook）

「このとき本当にCANCEL来てた？」が後から100%出てくる。  

保存してなければ「こうだったかも」でしか話ができず、詰む。



### 2. 通知の時系列

同じOrderIDに対して、

- 通知1回目 → 正常に処理  
- 通知2回目（再送）→ スキップ  
- 通知3回目 → 例外発生

みたいな流れは決済やメール送信でよくある。  
でも「それがあった」とわかるのは、**すべての通知を時系列で残していたから**。



## よくないログ

- `console.log('通知来た')` → 何が来たのか全くわからない  
- `logger.log('開始')` → どこで？どのIDで？なにが？  
- `logger.log(body.OrderID)` → それだけじゃ判断できない  

こういうログは、未来の自分からすると**存在しないのと同じ**。
ここから特定できることもあるとは思いますが綺麗に残したいですね。

## 💡 未来の自分に優しいログとは？

- 構造化されている（JSONでもOK）  
- どの処理の、何をして、どうなったかが一目でわかる  

1週間後、1ヶ月後に見返して**すぐ状況がつかめるか**を基準に設計する。


## まとめ

- ログは「他人のため」ではなく「未来の自分のため」
- トラブルは「原因がわからないこと」が最大のストレス
- 未来の自分が再現・検証・修正できるように残しておく
- 「そのときの自分にしかわからない情報」ほど、ログに残すべき