OmniAICreator/Qiita-1.07M huggingface dataset:
【TinyGo】Golang で Raspberry Pi pico2 を Lチカする

# 概要
Mac の CLI 環境で pico2 用のプログラムを TinyGo で記述しコンパイルし pico2 を動作させる
（VSCode とか使わなくてもできるんだよの記事）

# TinyGo の導入
公式のHPにあるよう導入する
https://tinygo.org/getting-started/install/macos/

### cmd
``` .shell
brew tap tinygo-org/tools
brew install tinygo
```

mac じゃなくても大体同じ

### 確認
```
> tinygo version
tinygo version 0.37.0 darwin/arm64 (using go version go1.23.5 and LLVM version 19.1.2)
```

# Lチカコード
``` main.go
package main

import (
	"machine"
	"time"
	"fmt"
	"math"
)

var (
	pin = machine.LED
	pwm = machine.PWM4
	ch = uint8(0)
	bootTime time.Time
)

func main() {
	Init()
	for {	Loop() }
}

func Init() {
	pin.Configure(machine.PinConfig{Mode: machine.PinOutput})
	pwm.Configure(machine.PWMConfig{Period: uint64(1 * time.Millisecond),})
	ch, _ = pwm.Channel(pin)
	bootTime = time.Now()
}

func Loop() {
	fmt.Printf("elapsedTime = %d\r\n", time.Since(bootTime).Milliseconds())
	duty := calcDuty(time.Since(bootTime).Milliseconds(), 2000)
	pwm.Set(ch, duty)
	time.Sleep(50 * time.Millisecond)
}

func calcDuty(elpsms, tmax int64) uint32 {
	fduty := math.Sin(2.0 * math.Pi * float64(elpsms%tmax) / float64(tmax))
	fduty += 1; fduty /= 2.0
	return  uint32(float64(pwm.Top()) * fduty)
}
```

# コンパイル
## go mod
なんでもいいから `go mod init` しておく
``` shell
> go mod init hoge
go: creating new go.mod: module hoge
go: to add module requirements and sums:
	go mod tidy
```

## tinygo build
``` shell
> tinygo build -target=pico2 -o a.uf2
```
`-target` オプションで hw を指定する
もちろん `-target=pico` で pico を指定することもできる

対応している hw 一覧は
``` shell
> tinygo targets
```
で確認できる

# pico2 への書き込み
## マウント
`BOOTSEL` を押しながら USB 接続を行いマウントする
おそらくデフォルトだと `NO NAME` としてマウントされる

``` shell
 > df -h |grep NAME
/dev/disk4s1     128Mi   212Ki   128Mi     1%       0     0     -   /Volumes/NO NAME
```

## 書き込み
`cp` コマンドで書き込む（多分　`mv` でもいい）
``` shell
> cp a.uf2 /Volumes/NO\ NAME
```

# 確認
0.5Hz でLEDがじんわり点滅する
`fmt.Printf` の出力は usb serial に行くので

``` shell
 > ls /dev/tty.usbmodem*
/dev/tty.usbmodem1201
```
でどこにシリアルがマップされているか確認し

```
> sudo screen /dev/tty.usbmodem1201 115200
```
で serial 接続をする

```
elapsedTime = 209367
elapsedTime = 209417
elapsedTime = 209467
elapsedTime = 209518
elapsedTime = 209568
elapsedTime = 209618
elapsedTime = 209668
elapsedTime = 209718
elapsedTime = 209768
```
といった表示を確認できる
（終了は control + a k）
chakra ui v2 コンポーネント化する際にカスタム以外のpropsも渡せるようにするには？

# はじめに
chakra ui v2の ```Button``` を ```SaveButton```としてコンポーネント化する際に、```Button``` 自体のpropsもコンポーネント呼び出し先から指定できるようにしたかったので方法を調べた結果を共有します。
# やり方
- ```Button``` のprops型である ```ButtonProps``` をカスタムの型と&する
- propsの分割代入先に ```...rest``` としてカスタムのprops以外をまとめて受け取れるようにする

```SaveButton.tsx
/* eslint-disable @typescript-eslint/no-explicit-any */
import { Button, ButtonProps } from "@chakra-ui/react";
import React, { FC } from "react";

type Props = {
  text: string;
  onClick: () => void;
  iconType?:
    | React.ReactElement<unknown, string | React.JSXElementConstructor<any>>
    | undefined;
};
export const SaveButton: FC<Props & ButtonProps> = (props) => {
  const { text, onClick, iconType, ...rest } = props;
  return (
    <Button colorScheme="blue" rightIcon={iconType} onClick={onClick} {...rest}>
      {text}
    </Button>
  );
};


```


# 使い方の例
```Button``` の元々のpropsである ```type="submit"``` を指定できるようになりました！
```tsx
<SaveButton text="登録" onClick={onClickSaveTodo} type="submit" />
```
その他のpropsも、もちろん指定できます。

# おわりに
今までは、元々のprops指定できなくない！？と思ってたけど、これで気兼ねなくコンポーネント化できる。
MySQL WorkbenchでSQLを整形する方法

SQLを記述後、下記赤枠のボタンをクリックすると自動整形してくれます。
ショートカットキーだとCtrl + Bでできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/ccb88f63-c958-4aae-8db1-6d4c46ab3a93.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2382613/aebdb01b-f4eb-455d-85a3-29e3a723f346.png)
合格は簡単！基本情報技術者試験！

# 基本情報技術者試験を受けてきました
私は理系卒であるものの専攻は情報科学ではありませんでした。
近年のDXブーム（もう飽きられ始めた?）にあやかり基本情報技術者を受けてきました。
受験前には「取っても意味ない」「誰でも受かる」などの意見が多く、余裕で取得できると考えてました。

# 勉強期間・勉強方法
勉強期間：約１か月（30~60min/day）
勉強方法：メルカリで購入した栢木先生の書籍と過去問道場
　　　　　ほぼほぼ過去問道場ばかりやってました。
　　　　　https://www.fe-siken.com/fekakomon.php
　　　　　結果は合格できました。正直書籍はいらないです。過去問道場をやりましょう。

# 感想
タイトルにありますが、私は基本情報を侮ってました。
受験後の感想としては「合格は簡単でも内容は難しい」です。
どういうことかというと、試験は４択問題を６割正解で合格です。科目Aは60問なので36問正解で合格ということになります。
半分の60問中30問を確実に解答すれば、残りはランダムに答えても合格できる確率になると思います。
３０問確実に答えるのが難しいのでは？となりますが試験問題の約60%が過去問からの流用のようです。
過去問をしっかり押さえておけば合格できます。

しかし、問題内容はというと結構ちゃんとしてます。
出題内容をちゃんと芯まで理解しているのか？となるとなかなか難しいので、合格のためだけでなく自身のスキルアップのために問題を理解することを心掛けた勉強をするといいと思いました。
生成AI時代の情報リテラシー：AI記事を見分ける7つの特徴

## はじめに

2020年代後半、インターネットの情報空間は「生成AIコンテンツ」によって急速に埋め尽くされ始めました。便利になった一方で、「この情報、本当に人が書いたの？」と疑う必要も出てきました。  
AIが書いた記事を見分けるための特徴をご紹介します。

## 特徴1：無難で誰にも刺さらない「良いこと言ってる風」

生成AIは誤解を避けるため、**抽象的で当たり障りのない表現**を多用します。  
例：「～が重要です」「～を心がけましょう」「バランスが大切です」など、まるで“道徳の教科書”。

## 特徴2：構成が整いすぎている

人間が書いた記事は、たいてい構成が少し乱れたり、話が脱線したりします。しかし生成AIは、「見出し→小見出し→まとめ」と**完璧なテンプレ構成**を好みます。  
まるでプレゼンのスライドを読まされているような整いっぷりです。

## 特徴3：強調しすぎる親切さ

「まとめると」「要するに」「ここで気をつけたいのは」といったフレーズがやたら出てきます。読者が迷わないように丁寧すぎるほど誘導してくれますが、それがかえって**不自然な親切さ**として浮き出ます。

## 特徴4：一次情報に乏しい

生成AIは学習データから文章を合成します。つまり、**実体験・独自の観察・現地取材**などの「一次情報」はほぼ出てきません。  
代わりに「ある研究によると」「多くの人が～と感じています」といった**誰かが言ってそうな一般論**で埋め尽くされます。

## 特徴5：感情の生々しさがない

怒り、喜び、困惑、恥…。こうした**感情の揺らぎ**が生成AIには苦手です。  
「なんだこれふざけんな」といった爆発的な感情表現や、「いや～これは悩みましたね（笑）」のような照れもなく、常に**冷静でよくできた文章**になりがちです。

## 特徴6：根拠のない「～と言われている」

典型的なAIの逃げフレーズ。「専門家によれば～」「一般的に～と考えられています」など、**誰も責任を取らない言い回し**が多発します。

## 特徴7：表現が均質で個性がない

AIが書く文章は、よく言えば「読みやすい」、悪く言えば「みんな同じ」。  
ライターの癖や文体の偏りがなく、**どこを切っても均一な文体**でつづられています。


## おわりに

この記事も、見ての通り「やたら丁寧」「構成が整いすぎ」「妙に親切」だったかもしれません。  
つまり、**自分が今読んでいる文章がAIかどうかを疑うセンサー**を育てることが、これからの時代の情報リテラシーなのかもしれません。

ところで、この記事も生成AIが書きました。お気づきでしたか？
冨田学誠:マーケターにも営業力が必要？

冨田学誠と申します！

マーケターと営業職。一見すると役割はまったく異なるように思えるかもしれません。しかし、現代のビジネス環境においては、マーケターにも営業力が求められる時代が到来しています。本記事では、なぜマーケターに営業的なスキルが必要なのか、その理由と活用法について解説します。

# マーケターと営業の役割の違い

まず基本として、両者の主な役割を確認しておきましょう。
	•	営業：顧客と直接対話し、製品やサービスの購入を促進する。
	•	マーケター：市場や顧客を分析し、認知・興味・比較・検討といった「購買までのプロセス」を設計・最適化する。

マーケターは「売れる仕組み」を作り、営業は「売る行為」を担うという違いがあります。

しかし、現代のビジネスではこの役割分担が曖昧になってきています。

なぜマーケターに営業力が必要なのか？

## 1. 顧客心理を理解するため

営業職は顧客と直接話すことで、「なぜ買うのか」「なぜ買わないのか」といったリアルな声を日々拾い上げています。

一方、マーケターは数値やデータを見て意思決定をすることが多く、顧客の本音や現場の空気感を見落としがちです。

営業的な思考を持つことで、ペルソナやカスタマージャーニー設計の精度が格段に向上します。

## 2. 提案力がマーケターにも求められる

マーケターが社内で施策を通すときや、クライアントに企画を提案するとき、**営業的な「伝え方」「説得力」**が大いに役立ちます。

マーケティング施策のROIや仮説設計をどれだけ論理的に組み立てても、伝え方が弱ければ意思決定者には届きません。

営業経験者が強いのは、まさにこの「納得させる力」に長けている点です。マーケターも提案型思考を身につけるべきでしょう。

## 3. マーケターがリードから売上に変える時代

従来は、マーケターは「リード（見込み客）」の獲得が主な仕事で、そこから先は営業の仕事という分業体制が一般的でした。

しかし、SaaSやD2Cの普及、インサイドセールスの進化により、マーケターがリードから売上まで責任を持つケースが増えています。

そのため、リードナーチャリング（育成）からクロージングに近いフェーズまでを一貫して設計できる営業的な視点が必要になってきているのです。

# 営業力をどうマーケティングに活かすか

## ヒアリング力をコンテンツに活かす

営業で培ったヒアリングスキルは、コンテンツ設計にも活用できます。

たとえば、営業が顧客からよく聞かれる質問を集め、それをFAQページやブログ記事にまとめることで、見込み客の不安を事前に解消するコンテンツが作れます。

## クロージング思考でLPを設計する

営業は「最後のひと押し」が得意です。マーケターもこの視点をLP（ランディングページ）やバナー、CTAボタンの設計に応用することで、コンバージョン率の改善が期待できます。

## 数字で語る習慣を持つ

営業では、「どれだけ売れたか」「数字がどれだけ改善したか」が評価されます。マーケターも施策の成果を具体的な数値で語る力を持つことで、社内外での信頼が高まります。

# マーケティングと営業は二つで一つ

本来、マーケティングと営業は対立するものではなく、補完し合う関係です。

むしろ、営業の現場感を理解しないマーケター、マーケティングの仕組みを知らない営業は、組織の成長を妨げる原因になってしまうことさえあります。

マーケターが営業的な視点を持つことで、より本質的で、売上に直結するマーケティングが可能になります。

# まとめ

マーケターにも営業力が求められる理由は、時代の変化と購買行動の複雑化にあります。
	•	顧客のリアルを理解する力
	•	提案する力
	•	売上に責任を持つ力

これらを備えることで、単なる「認知担当」ではなく、事業成長に直結するマーケターとしての価値を高めることができます。

これからの時代、マーケターは「売る力」も兼ね備えたプロフェッショナルであることが求められているのです。
Salesforceで商談の重複登録を防ぐ：Flowで簡易チェックを組む実装例

# Salesforce Flowで商談の重複登録を防いでみようという話

## 背景と最初の違和感

Salesforceで商談を作ってると、「あれ？これ前にも作った気が...」みたいな場面ありませんか？

ユーザーが自由に入力できる商談名（Name）は、ちょっとしたスペースや全角・半角の違いだけで別物として保存されてしまいます。

**たとえばこんなケース：**
- "ABCテスト案件"
- " ABCテスト案件"
- "A B C テ ス ト 案 件"

見た目は同じ、でも中身は別レコード。これ、厄介ですよねー…。登録担当者が複数いたりすると時期違いで重複登録してしまう事があると報告を受けました。

## 最初に考えたのは標準機能

Salesforceには"重複ルール（Duplicate Rule）"って便利な機能があります。最初はこれでどうにかなるかな？と思って試しました。

ただ、うまくいかない。
- そもそも、重複チェックできるオブジェクトには限りがあり、Opportunityは対象外。
- 完全一致やあいまい一致の指定はできるけど、「スペース除いた比較」みたいなことはできない
- 商談名のような自由記述項目の一致って、定義が難しい

結論、**標準機能では無理があるな…** ということで、Flowで自前チェックを作る方向に切り替えました。

## Flowでやってみたけど、すんなりはいかず

よーしFlowだ！と意気込んで作ったのがこんな流れ：
1. 商談が作成されたら起動（保存前）
2. 同じ商談名のレコードがあるか `Get Records` で検索
3. 見つかれば カスタムエラー でブロック

シンプルなはず。でも思ったように動かない。

- `$Record.Id` は保存前だと null → 自分自身の除外ができない
- 「nullではない」「空白ではない」といった比較演算子が選べないUIの罠
- 一見一致してるように見えて、`Get Records` がヒットしない

完全一致じゃ拾いきれない問題にぶち当たりました。

## スペースの有無を除外してみる

ならいっそ、比較前に「商談名を正規化」して比べたらどうだろう？という発想に。
つまり、余計な空白や全角スペースを削除してしまおうということです。

### Name_Cleaned__c を作る
商談オブジェクトに数式項目 `Name_Cleaned__c` を作って、こんな式を入れました：
```formula
SUBSTITUTE(SUBSTITUTE(TRIM(Name), "　", ""), " ", "")
```
これで、「ABC テスト」も「　ABCテスト」も「ABCテスト」になります。

## Flowの構成を作り直す

### 入力値も正規化
Flowの中で `$Record.Name` を同様に処理するため、数式リソースを作成：
```formula
SUBSTITUTE(SUBSTITUTE(TRIM({!$Record.Name}), "　", ""), " ", "")
```
名前は `NormalizedInputName` にしました。

### Get Records の検索条件をこう変える
![スクリーンショット 2025-05-09 200147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080640/814309a7-4759-4942-b3c3-190b156e1ce8.png)

これで、「正規化された値同士」での一致が可能に。

## テストでようやくブロック成功！

最初のうちはエラーが出たり、想定通りに動かなかったり。
でも、以下の構成で安定しました：
- フローは「保存前（高速項目更新）」で起動
- `Get Records` で1件でもヒットしたらカスタムエラーを発動

### テスト結果
| 入力 | 正規化後 | 登録可否 |
|------|-----------|-----------|
| " ABC テスト案件" | "ABCテスト案件" | ❌ ブロック |
| "ABCテスト案件 -2" | "ABCテスト案件-2" | ❌ ブロック |

## 他にも使えるかも？

この考え方、他のオブジェクトや場面にも応用できます。
- 取引先、リード、案件名など「自由入力フィールド」の正規化チェック
- バリデーションルールとの組み合わせ
- Flowをテンプレ化して再利用

「Name_Cleaned__c」のような正規化済み項目を作るだけで、目に見えない重複の芽を摘めます。

## まとめ

そもそも私がSalesforceを知らなくて商談名を重複登録させない設定ってどこかにあるんでしょうか？
また、ほんとはユニークになる情報を埋め込めればいいのですが、同じ商談で使用する日付周りも完全一致しない場合があると言われて、苦肉の策でこんな簡易チェックをいれることになりました。

似たように「完全に弾けないけど、多少でも使えれば…！」という方がいればご参考に^^
テスト投稿

# テスト投稿
- 初めての投稿テストです、すぐ消します
- :coffee:
![C7D8B16D-F131-4AA9-927A-D74133ECBB17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4083575/3d586f33-f63a-44a7-9170-0b00a6689569.png)
Githubチーム版ユーザとチーム外のユーザの違い

## はじめに

GitHub Team版を社内導入するにあたり、既存のユーザをチームに入れるかどうか検討するために「チームユーザ」と「チーム外のユーザ（外部コラボレーター）」の違いを以下に整理しました。

## 1. チーム版ユーザの特徴
チーム版ユーザは、組織内でのアクセス権を効率的に管理するための機能を活用できる。

### 管理方法
- **チーム全体**: 組織内で作成されたチーム全体に対してアクセス権限を付与可能。
- **グループ（チーム）**: チームを利用して、アクセス権限や通知を効率的に管理可能。
- **個々のユーザ**: 必要に応じて、個別のユーザにアクセス権を設定可能。

### 主な権限
- チームや組織内のリソース（リポジトリ、Wiki、プロジェクトボード）への広範なアクセス。
- 組織内の他のメンバーの可視性。
- 組織全体の設定やポリシーの変更（管理者権限が必要）。
- 内部リポジトリへのアクセス。
- SSO（Single Sign-On）の適用を受ける。


## 2. チーム外のユーザ（外部コラボレーター）の特徴
チーム外のユーザは、組織外のユーザとして明示的に招待されることでアクセス権を得る。

### 管理方法
- **個々のユーザ単位**の権限管理のみ。
- チームやグループに参加することはできない。

### 主な制限
- **チーム機能への参加不可**: チームに追加することはできない。
- **組織全体のリソースへのアクセス不可**: アクセス可能なリポジトリは、明示的に権限が付与されたものに限られる。
- **組織の設定変更不可**: 組織やリポジトリの管理権限を持つことはできない。
- **内部リポジトリへのアクセス不可**: 内部リポジトリはチームメンバー専用となる。
- **SSOの適用外**: 通常のGitHubアカウントでアクセスする。

## 3. チーム版ユーザとチーム外のユーザの主な違い

| 機能/権限                       | チーム版ユーザ           | チーム外のユーザ（外部コラボレーター） |
|--------------------------------|-------------------------|-----------------------------------|
| チーム機能への参加              | 可能                    | 不可                              |
| 組織全体のリソースへのアクセス   | 可能                    | 不可（明示的に許可されたもののみ） |
| 内部リポジトリへのアクセス       | 可能                    | 不可                              |
| SSO（Single Sign-On）適用       | 可能                    | 適用外                            |
| 他メンバーの可視性              | 可能                    | 不可                              |
| リポジトリ単位のアクセス設定     | 可能                    | 可能                              |

## 4. 外部コラボレーターでも可能な操作

外部コラボレーターであっても、以下の操作は権限次第で可能。
- 明示的に権限が付与されたリポジトリでのコードの読み書き。
- プルリクエストの作成とレビュー。
- Issueの作成とコメント。
- ワークフローやCI/CDのジョブのトリガー（権限が許可されている場合）。

## まとめ
管理にかかるコストを考えると、関与の低いメンバ以外はチームに入れるという当たり前の結論になります。
ただし、Githubのもともとのオープンな性質からチーム外のユーザも含めた運用はできそうです。

## 参考資料
- [チームについて (GitHub ドキュメント)](https://docs.github.com/ja/organizations/organizing-members-into-teams/about-teams)
- [外部コラボレーターの追加 (GitHub ドキュメント)](https://docs.github.com/ja/organizations/managing-access-to-your-organizations-repositories/adding-outside-collaborators-to-repositories)
- [リポジトリのアクセス権管理 (GitHub ドキュメント)](https://docs.github.com/ja/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/managing-teams-and-people-with-access-to-your-repository)
【CSS】@keyframesの記述方法

# @&#xFFF0;keyframesの記述方法まとめ

## 1. @&#xFFF0;keyframesとは
- CSSアニメーションで「動き方」を定義するための仕組み  
- 時間の経過に合わせて、スタイル（プロパティ）を段階的に変化させる

## 2. 基本構文

```css
@keyframes アニメーション名 {
  0% {
    /* 開始時のスタイル */
  }
  50% {
    /* 中間時点のスタイル（任意） */
  }
  100% {
    /* 終了時のスタイル */
  }
}
```

0%と100%はそれぞれ、`from`と`to`と書くこともできる

```css
@keyframes アニメーション名 {
  from {
    /* 開始時 (0%) */
  }
  to {
    /* 終了時 (100%) */
  }
}
```

## 3. 設定できる内容

| 項目 | 内容 |
|:---|:---|
| アニメーション名 | 任意の名前 |
| キーフレーム（%） | 0%〜100%の間でスタイルを指定する |
| 使用できるスタイル | 通常のCSSプロパティ |

## 4. 使用例

### 例1：透明度を変えるアニメーション

```css
@keyframes fadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
```

### 例2：背景色を変えるアニメーション

```css
@keyframes colorChange {
  0% {
    background-color: red;
  }
  50% {
    background-color: yellow;
  }
  100% {
    background-color: green;
  }
}
```

## 5. アニメーションの適用方法

アニメーションを要素に適用するには、`animation`プロパティを使用する

| プロパティ名 | 内容 |
|:---|:---|
| animation-name | アニメーション名 |
| animation-duration | アニメーションの再生時間 |
| animation-timing-function | 動きの速さ（タイミング関数） |
| animation-delay | 開始までの待ち時間 |
| animation-iteration-count | 繰り返し回数 |
| animation-direction | 再生する方向 |
| animation-fill-mode | アニメーション後の状態 |

**例：**

```css
.box {
  display: inline-block;
  width: 100px;
  height: 100px;
  background-color: black;
  animation: fadeIn 1.4s;
  animation-timing-function: ease;
  animation-delay: 2s;
  animation-iteration-count: infinite;
  animation-direction: alternate-reverse;
  animation-fill-mode: forwards;
}
```

この設定により、

- `fadeIn`（`@keyframes`で設定）を1.4秒かけて再生（`fadeIn 1.4s`）
- 「遅い」→「速い」→「遅い」という速度で動きが変化（`ease`）
- 2秒後にアニメーション開始（`2s`）
- 無限に繰り返す（`infinite`）
- 終わると逆方向（縮小）で再生（`alternate-reverse`）
- 最終状態を保持する（`forwards`）

というアニメーションが作られる

# まとめ

- `@keyframes`は動きを細かくコントロールできる
- `0%〜100%`、または`from〜to`でスタイルを変化させる
- `animation`プロパティで要素に適用する
【CSS】擬似要素（::before、::after）とは？

# はじめに
CSSについて勉強した内容を備忘録として整理します。今回は、擬似要素について勉強しました。

# 擬似要素とは
擬似要素は、HTMLに実際には存在しない要素をCSSだけで作り出してスタイルを当てる仕組みです。
- 特定の要素の中や前後に仮想的な要素を追加できる
- デザインのために余計なHTMLを書かずに済む

# ::beforeと::after
`::before`と`::after`は特によく使われる擬似要素です。
- `::before`：指定した要素の先頭に挿入
- `::after`：指定した要素の末尾に挿入

※使うときは必ず `content` プロパティが必要（文字を表示しない場合は空文字を設定する）

## 使用パターン
- 飾り文字（アイコン、記号）
- リストのマークカスタマイズ
- バッジやラベルの追加
- デザイン用の小さな装飾
- フォームに「必須マーク（*）」を付ける

## 使用例
```css
p::before {
  content: "★ ";
}

p::after {
  content: " ✔";
}
```

```html
<p>今日のタスク</p>
```

### 表示イメージ
> ★ 今日のタスク ✔

<br>

開発者ツールで確認するとこのように要素が出力されています。
```html
<p>
  ::before
  今日のタスク
  ::after
</p>
```

# その他の擬似要素

| 擬似要素        | 役割・追加される場所                      | 主な用途・特徴                                   |
|:----------------|:------------------------------------------|:-------------------------------------------------|
| `::first-letter` | 要素内の**最初の1文字**にスタイルを適用     | 雑誌風の大きな頭文字デザイン（ドロップキャップ） |
| `::first-line`   | 要素内の**最初の1行**にスタイルを適用       | 記事の冒頭行を目立たせる                        |
| `::selection`    | ユーザーが**テキスト選択したとき**のスタイル | 選択範囲の背景色や文字色を変える                 |
| `::placeholder`  | `<input>`や`<textarea>`の**プレースホルダー**文字にスタイルを適用 | フォームの入力ガイドテキストをカスタマイズ       |
| `::marker`       | リスト（`<ul>`, `<ol>`）の**マーカー**にスタイルを適用 | リストマークの色や形を変える                     |
| `::backdrop`     | `<dialog>`要素の**背後の背景**にスタイルを適用 | ダイアログの後ろを暗くする、ぼかす               |


# おわりに
擬似要素について理解できました。`::before`と`::after`以外の擬似要素についても理解を深めて使えるようにしていきたいです。
(WinForms)セル・行・列・DataGridView のいずれかが ReadOnly=true ならセルは読み取り専用になる

## はじめに
タイトルが全てです。この仕様を知らなくてしばらく悩んでいたので忘れないように残しておきます。

## 特定の列のみReadOnly=falseにする方法
DataGridView全体をReadOnly=trueとして、特定の列のみReadOnly=falseにしたいとする。
このときの失敗例と成功例を示す。

### 失敗例
**全体=true → 特定列=false**
DataGridView全体をReadOnly=trueに設定し、その後特定の列でReadOnly=falseに書き換えようとしてもうまく動作しません。これはタイトルにある通り「セル・行・列・DataGridView のいずれかが ReadOnly=true ならセルは読み取り専用になる」から。

### 成功例
**全体=false,特定列=false,個別に他の列を=true**
これで個別の設定が効く。


## おわりに
全体や列への設定が各セルへの一括設定のようなイメージでしたが、別物なんですね。
記事にしたので、もう忘れない。はず。
JavaScriptにおける Set と Array の違い・相互変換・集合演算まとめ


JavaScriptの `Set` と `Array` はどちらもコレクション型ですが、それぞれの特性や用途には明確な違いがあります。この記事では、**違い・相互変換・集合演算（和・積・差）** について実用的に整理します。

---

## Set と Array の違い

| 比較項目         | `Set`                                 | `Array`                       |
|------------------|----------------------------------------|-------------------------------|
| 値の重複         | 重複不可（自動で排除）              | 重複OK                      |
| 順序             | 挿入順を保持                        | 挿入順を保持               |
| 要素の型         | 任意の型（オブジェクトも可）           | 任意の型                      |
| イテレーション   | `forEach`, `for...of`, Spread可        | 同様に可能                   |
| ユースケース例   | 一意な値の集合、集合演算               | 順序付きリスト、汎用データ操作 |

---

## Set と Array の相互変換

### Array → Set（重複を排除）

```js
const arr = [1, 2, 2, 3];
const set = new Set(arr);

console.log(set); // Set(3) { 1, 2, 3 }
```

### Set → Array

```js
const set = new Set(['a', 'b', 'c']);
const arr = Array.from(set);
// または [...set]

console.log(arr); // ['a', 'b', 'c']
```

---

## Set による集合演算

集合としての `Set` を活用することで、以下のような操作が可能です。

### 1. 和集合（union）

```js
const a = new Set([1, 2, 3]);
const b = new Set([3, 4, 5]);

const union = new Set([...a, ...b]);
console.log([...union]); // [1, 2, 3, 4, 5]
```

### 2. 積集合（intersection）

```js
const a = new Set([1, 2, 3]);
const b = new Set([2, 3, 4]);

const intersection = new Set([...a].filter(x => b.has(x)));
console.log([...intersection]); // [2, 3]
```

### 3. 差集合（difference）

```js
const a = new Set([1, 2, 3]);
const b = new Set([2, 3, 4]);

const difference = new Set([...a].filter(x => !b.has(x)));
console.log([...difference]); // [1]
```

### 4.排他的論理和(exclusiveor)

```js
const a = new Set([1, 2, 3]);
const b = new Set([2, 3, 4]);

const xor = new Set([
  ...[...a].filter(x => !b.has(x)),
  ...[...b].filter(x => !a.has(x))
]);
```


---

## Set を活用する実用シーン

- **配列の重複削除**：
  ```js
  const unique = [...new Set([1, 2, 2, 3])]; // [1, 2, 3]
  ```

- **値の存在確認（高速）**：
  ```js
  const ids = new Set(['user1', 'user2']);
  if (ids.has('user2')) {
    // true
  }
  ```

- **大量データに対する高速検索や比較操作**

---

## まとめ

| やりたいこと       | おすすめ |
|--------------------|----------|
| 重複を排除したい   | `Set`    |
| 順序付きのリスト   | `Array`  |
| 集合演算したい     | `Set`    |
| UIや順序重視の操作 | `Array`  |

---

## 📎 関連リンク

- [MDN Web Docs: Set](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set)
- [MDN Web Docs: Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array)
Tailscale概要

# Tailscaleとは？

Tailscaleは、エンドツーエンドの暗号化を提供し、安全で使いやすいVPN（仮想プライベートネットワーク）サービスです。主に、リモートワーク環境や企業ネットワークで、セキュアなネットワーク接続を簡単に構築・管理できます。

## 1. Tailscaleの特徴

* **簡単なセットアップ**: 数分でVPNを構築可能。各デバイスにTailscaleアプリをインストールし、ログインするだけ。
* **エンドツーエンド暗号化**: WireGuardプロトコルに基づく強力な暗号化で、セキュリティを確保。
* **ゼロトラストネットワーク**: 各デバイスはIDで認証され、信頼性を確保。
* **マルチプラットフォーム対応**: Windows、macOS、Linux、Android、iOS、クラウドサービス（AWS、GCP、Azure）に対応。

## 2. Tailscaleのメリット

* **簡単設定**: 専用サーバー不要で、即時にセキュアな接続が可能。
* **エンドツーエンド暗号化**: 安全性が高く、第三者による盗聴を防止。
* **自動更新**: 常に最新バージョンを自動的に維持。
* **ユーザー管理が容易**: 管理者がSSO（Google, Microsoft, GitHub）でユーザーを管理。

## 3. Tailscaleの使い方

### 3.1 インストール

1. Tailscale公式サイトにアクセスし、各デバイス向けにアプリをダウンロード。
2. インストール後、Google、Microsoft、GitHubアカウントでログイン。

### 3.2 ネットワーク構築

* 自動的にプライベートIPアドレスが割り当てられ、デバイス間で通信可能。
* コントロールパネルから接続デバイスを確認。

### 3.3 アクセス制御設定

* コントロールパネルでアクセス制御リスト（ACL）を設定し、接続権限を管理。

## 4. Tailscaleの活用例

### 4.1 リモートワーク

* 自宅や外出先から会社のサーバーに安全にアクセス。

### 4.2 サーバー管理

* クラウドサーバー（AWS, GCP, Azure）に安全にリモート接続。

### 4.3 ホームネットワーク

* 自宅のNASやスマート家電をリモートから安全に操作。

## 5. Tailscaleと他のVPNサービスの比較

| 特徴     | Tailscale | 伝統的なVPN        |
| ------ | --------- | -------------- |
| セットアップ | 数分で完了     | 複雑な設定          |
| 暗号化    | WireGuard | OpenVPN, IPSec |
| ゼロトラスト | あり        | 一部のみ           |

## 6. 注意点

* **アクセス制御の管理が重要**：許可されていないデバイスが接続しないようにACLを設定。
* **最新バージョン維持**：常に最新のTailscaleを使用し、セキュリティを確保。

## 7. まとめ

Tailscaleは、簡単かつ強力なVPNソリューションであり、リモートワークやサーバー管理、ホームネットワークに最適です。
AWS MGNでの移行後IPアドレス設定の検証

# 内容
AWS MGNを使用して、オンプレミスからAWSへ仮想マシンをリホスト方式で移行します。閉域網での移行で移行元、移行先でCIDR異なる場合、仮想マシンのIPアドレスが変更されることが想定されます。IPアドレスは移行時に設定可能ですが下記のパターンについて検証します。

* IPアドレスを引き継いで移行する
* IPアドレスを指定して移行する
* IPアドレスを指定しないで移行する

# 準備

[こちらの記事](https://qiita.com/infra365/items/d7d1e1c94b18d3796a3c)を参考に閉域網での移行環境を準備します。

![mgn20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/c9f6baf4-4d3d-4d15-8b5e-c92f7c67b928.png)

具体的には以下のVPCエンドポイントを作成します。

```shell
com.amazonaws.ap-northeast-1.ssm
com.amazonaws.ap-northeast-1.ssmmessages
com.amazonaws.ap-northeast-1.mgn
com.amazonaws.ap-northeast-1.ec2
com.amazonaws.ap-northeast-1.s3
```

環境準備後、VPCエンドポイントを指定して移行を開始します。

```shell
wget -O ./aws-replication-installer-init.py https://aws-application-migration-service-ap-northeast-1.bucket.vpce-xxxx.s3.ap-northeast-1.vpce.amazonaws.com/latest/linux/aws-replication-installer-init.py

sudo python3 aws-replication-installer-init.py \
     --region ap-northeast-1 \
     --aws-access-key-id xxxx \
     --aws-secret-access-key xxxx \
     --no-prompt \
     --s3-endpoint vpce-xxxx.s3.ap-northeast-1.vpce.amazonaws.com \
     --endpoint vpce-xxxx.mgn.ap-northeast-1.vpce.amazonaws.com
```

今回はテストを簡易的に行うために、同一VPC内の左側のサブネットから右側のサブネットへの移行を行います。

![mgn23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/7dfea90b-3924-4df3-bdd5-92c62736f49a.png)

# IPアドレスを引き継いで移行する

[起動テンプレートの設定](https://docs.aws.amazon.com/ja_jp/mgn/latest/ug/launch-template.html)に「プライベートIPをコピー」という設定項目があります。これをチェックすることで、ソースサーバのIPアドレスを引き継ぐことが可能です。ただし[起動テンプレートの主な考慮事項](https://docs.aws.amazon.com/ja_jp/mgn/latest/ug/key-considerations.html)に記載されている通り、引き継いだIPアドレスがターゲットサブネットのCIDRに含まれていない場合、インスタンスの起動は失敗します。

![mgn21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/7940ba77-97eb-4d36-9885-5b64b7aaef02.png)


上記設定をした上でテストインスタンスの起動を行いましたが、下記エラーが発生して起動に失敗しました。

```
エラー: An error occurred (InvalidParameterValue) when calling the RunInstances operation: 
Address 192.168.0.233 does not fall within the subnet's address range
```

# IPアドレスを指定して移行する

MGN エージェントをインストールすると、ソースサーバとして登録され、各インスタンスごとに起動テンプレートが作成されます。[起動テンプレートの主な考慮事項](https://docs.aws.amazon.com/ja_jp/mgn/latest/ug/key-considerations.html)に記載があるようにプライベートIPの欄に任意のIPアドレスを指定します。なお、起動テンプレートでサポートされるENI最大2つまでです。3つ以上が必要な場合は、起動後の処理で追加する必要があります。起動テンプレートで下記項目を設定後、デフォルトバージョンとして保存します。

![mgn11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/5692586a-cb43-4790-a0e6-4a0a44defed5.png)

上記設定後、テストインスタンスの起動を行うと指定したIPアドレスで起動します。

![mgn12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/3ac3f763-9ae3-4c20-87a7-c517706d3f88.png)

# IPアドレスを指定しないで移行する

起動テンプレートでIPアドレスを指定しない場合、CIDR内の任意のIPアドレスが付与されます。

![mgn22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/11708668-62cc-4f1f-868f-22d0fb6a4ce9.png)
個人的備忘録：テザリング環境でAWSが開けなかった日【ERR_TIMED_OUT対応記】

## はじめに

AWSのサインインページ`https://ap-northeast-1.signin.aws.amazon.com`にアクセスしようとした際に、「This site can’t be reached」「ERR\_TIMED\_OUT」というエラーが表示されることがあります。この記事は、テザリング中にこのエラーに遭遇したときの対処法についての備忘録です。

## 書こうと思ったきっかけ

AWSコンソールにアクセスしようとしたところ、テザリング環境ではページが開けず、作業が中断されました。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

同じ状況に陥った際の対策をまとめておくことで、今後のスムーズな対応に役立てたいと考えました。

## 内容

### 発生したエラー

```
This site can’t be reached  
ap-northeast-1.signin.aws.amazon.com took too long to respond.  
ERR_TIMED_OUT
```

**実際の画面**

![Screenshot 2025-05-10 at 9.56.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/87e497f2-b6e9-49a1-89ec-178b0d8d1711.png)

### 原因と考察

* テザリング中の電波が不安定だった可能性が高い
* 特にトンネル内や屋内での利用時に起こりやすい
* AWS側では障害は発生していなかった（公式ステータスページで確認済み）

### 対処法

1. **電波の強い場所に移動**

   * 屋外や窓際での通信が安定しやすい

2. **テザリングの再接続**

   * スマホ側で一度テザリングをオフ→オン
   * スマホの再起動も有効

3. **PCのWi-Fi設定をリセット**

   * Wi-Fiを一度オフにしてから再接続
   * 以下のようなコマンドを使うことでWi-Fiサービスを再起動できます（macOSの場合）:

     ```bash
     networksetup -setnetworkserviceenabled Wi-Fi off
     networksetup -setnetworkserviceenabled Wi-Fi on
     ```

4. **DNSの見直し**

   * 一時的にGoogle DNS（8.8.8.8）などを設定してみる

5. **どうしてもダメな場合**

   * 公共Wi-Fi（カフェや駅）で一時的にログインだけ行う
   * VPNを試す（別ルートでの接続になるため有効な場合あり）

## まとめ

テザリング環境でのAWS接続エラーは、通信環境の改善で解決することが多いです。

:::note warn
**特に電波状況や端末のキャッシュ状態、Wi-Fi再接続などを試すだけでも改善されることも多いです。**
:::

エラーに遭遇しても焦らず、環境を変えて再挑戦することが大切です...！
Hasura Consoleの起動に環境変数を使いたい時

# 結論
`hasura console`を以下の条件で実行したい時の設定です。
- `endpoint`や`admin secret`を環境変数で指定したい
- `config.yml`がないフォルダからでも実行したい

以下の3ステップに従い設定していきます。
1. 環境変数を設定
1. `dotenv cli`をインストール
1. `package.json`を編集
1. (任意)不要になった`config.yml`のパラメータを削除

## 1. 環境変数を設定
[公式](https://hasura.io/docs/2.0/hasura-cli/config-reference/)に倣って、環境変数を以下に設定します。
Next.jsの環境変数をそのまま流用したいのであれば、`NEXT_PUBLIC_HASURA_GRAPHQL_ENDPOINT`でもOKです。
```text:.env
HASURA_GRAPHQL_ENDPOINT＝xxxxxxxx
HASURA_GRAPHQL_ADMIN_SECRET=yyyyyyyy
```


## 2. `dotenv cli`をインストール
今回は、package.jsonのスクリプトを使って、`hasura console`を実行するので、package.jsonで環境変数を扱える必要があります。
それに必要なのが、[dotenv cli](https://www.npmjs.com/package/dotenv-cli)です。
```
npm install --save-dev dotenv-cli
```

## 3. `package.json`を編集
最後に、`npm run hasura-console`でコマンドを実行できる様に編集していきます。
まずは、どこのディレクトリからも実行できるように、`cd hasura`を記述します。
次に、`dotenv cli`を使って、環境変数を使いながら[hasura cosole](https://hasura.io/docs/2.0/hasura-cli/commands/hasura_console/)を記述していきます。

```json:package.json
{
  "scripts": {
    "hasura-console": "cd hasura && dotenv -e ../.env -- bash -c 'hasura console --endpoint ${NEXT_PUBLIC_HASURA_URL} --admin-secret ${HASURA_ADMIN_SECRET}'",
  },
}
```

https://hasura.io/docs/2.0/hasura-cli/commands/hasura_console/

## 4. (任意)不要になった`config.yml`のパラメータを削除
```yml:config.yml
version: 3
# endpoint: HASURA_GRAPHQL_ENDPOINT ←削除
# admin_secret: HASURA_ADMIN_SECRET ←削除
metadata_directory: metadata
actions:
  kind: synchronous
  handler_webhook_baseurl: http://localhost:4000

```


# 参考
`dotenv cli`の使い方に関しては、以下を参考にしました。

https://zenn.dev/tatsuyasusukida/articles/dotenv-package-json
Finderのキーボード操作まとめ

# 概要
Macを使っていて、Finder上の操作で知らないことが多いなと思ったので、キーボードで色々できるんだぞということまとめたいと思います

イメージとしては「Command + C」= テキストのCopy みたいなイメージです

# コマンドまとめ
早速ですが、個人的によく使うものから、こんなものまでありますというものをリスト化してみました

| 操作 | ショートカットキー | 内容 | 使用頻度 |
| :---: | :---: | :---: | :---: |
| ファイルをクイックルック | Space | 選択中のファイルを素早くプレビュー表示 | ◎ |
| ファイルを開く | Command + O | 選択中のファイルを開く | △ |
| ファイル情報を見る | Command + I | ファイルの詳細情報（インフォメーションウィンドウ）を表示 | △ |
| ファイル名変更 | Return（Enter） | 選択中のファイル名を変更 | ◎ |
| 上の階層に移動 | Command + ↑ | 親フォルダに移動 | △ |
| 一つ下の階層に入る | Command + ↓ | 選択中のフォルダやファイルに入る（アプリなら起動） | △ |
| 新しいフォルダ作成 | Command + Shift + N | 新しいフォルダを作成 | △ |
| ゴミ箱に移動 | Command + Delete | 選択中のファイルをゴミ箱に移動 | ⚪︎ |
| ゴミ箱を空にする | Command + Shift + Delete | ゴミ箱を空にする | △ |
| ファイルを複製 | Command + D | 選択中のファイルを複製 | △ |
| ファイルを検索 | Command + F | Finder内を検索 | ⚪︎ |
| サイドバーを非表示/表示 | Command + Option + S | Finderウィンドウのサイドバーを切り替え | ⚪︎ |
| パスバーを表示/非表示 | Command + Option + P | Finderのパスバーを切り替え表示 | △ |
| ステータスバーを表示/非表示 | Command + / | Finder下部のステータスバーを切り替え表示 | △ |

結構いろいろありますね
特にクイックルックがよく使います
開発していたり、何かを簡単に確認する際に便利です

そのほかにゴミ箱に移動や階層の移動など是非とも使ってみたいものがたくさんです

# おわりに
ざっとまとめてみましたが、やはりキーボードショートカット操作は効率が上がるものが多いですね
Chromeなどでもショートカットありますが、そちらもいずれ便利なものをまとめて身につけていきたいです
日本語プログラミング言語Mindの小技 「複写」～スタックトップの値を２つにする～

# はじめに
日本語プログラミング言語Mindの小技「複写」について説明したいと思います。

# 対象読者
日本語プログラミング言語Mindのユーザー、または日本語プログラミング言語に興味のある方

# この小技に関連するMind言語マニュアル

この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載があります。
１１ スタック操作
└スタック操作語
　└複写

>構文＝＜データ＞を　複写　→　＜データ＞、＜データ＞
>
>　スタックにあるデータの複製をとるのに使用する。主に、同じデータについて２つの処理を施したい場合に用いる。次がその例である。
>
>二色で表示とは　（文字列　→　・）
　　　　複写し
　　　　　　赤色表示し 改行し
　　　　　　黄色表示し 改行すること。


本機能（本記事）は、下記のバージョンに対応しています。Mind８のLinux版も対応していると思いますが、本記事では特に検証を行っておりません。

# 対応バージョン
■Mind７　■Mind８　■Mind９
■Windows版　□Linux版

# 小技の解説
「複写」はスタック志向言語Forthの流れを汲む日本語プログラミング言語Mindの特徴的な機能です。

スタックトップにある値をPOPしてPUSHしてPUSHして２つ分にしてから、同じ値に対して別の処理をしてくださいねという機能です。

処理単語の引数に相当する値は１つを想定して、処理単語内で複写することにより２重化し、同じ値に対して異なる処理を行うようなロジックに使えます。ローカル変数に代入してから処理するのとほぼいっしょとも言えますが、記述も短くなりMindのランタイム的にはこちらのがより軽い実装となります。

# Mindプログラムソース

```mind:doublepush.src
告白は　表示と　等価。

複写して愛を告白するとは　（文字列　→　・）
    複写して、
    告白し　「と、」を　告白し　改行し、
    告白し　「と２回言いました。」を　告白し　改行すること。


変数に代入して愛を告白するとは　（文字列　→　・）
        愛は　文字列情報
    愛に　入れ、
    愛を　告白し　「と、」を　告白し　改行し、
    愛を　告白し　「と２回言いました。」を　告白し　改行すること。


メインとは　（・　→　・）
    「愛している」を　複写して愛を告白し、
    「愛している」を　変数に代入して愛を告白すること。　
```
ちょっと例としては、スタックトップの値を加工はしていないのでいまいちですが、ローカル変数を使った場合との記述の違いについてはご理解いただきやすいかなとも思います。


# コンパイル結果
ではコンパイルしてみます。下位ライブラリはfileを指定します。

## Mind９
下図はMind９βです。
```cmd:
C:\developments\vscode\mind9>mind doublepush file   

日本語プログラミング言語 Ｍｉｎｄ Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindex.exe --> doublepush.exe
```
## Mind8
```cmd:
C:\developments\vscode\mind9>mind doublepush file

日本語プログラミング言語 Ｍｉｎｄ Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> doublepush.exe
```
## Mind7
```cmd:
C:\developments\vscode\mind9>mind doublepush file
日本語プログラミング言語 Ｍｉｎｄ Version 7.5 for Windows
          Copyright(C) 1985-2004 Scripts Lab. Inc.
          Single user license.  Serial No:********
コンパイル中 - 終了
Coping.. C:\mind7\bin\mindexec.exe -> doublepush.exe
```
# 実行結果
つづいて実行してみます。
Mind7の結果です。記述は割愛していますがMind8/9βも同じです。

```cmd:
C:\developments\vscode\mind9>doublepush
愛していると、
愛していると２回言いました。
愛していると、
愛していると２回言いました。

C:\developments\vscode\mind9>
```


# 参考情報
この小技「複写」を使った記述例の記事はまだないようです。見つけたら教えてください。


# おわりに
いかがでしたでしょうか？なにかの参考になれば幸いです。2025年は日本語プログラミング言語Mind生誕４０周年です。

## 本記事シリーズのご紹介
本記事シリーズ「日本語プログラミング言語Mindの小技」は「日本語プログラミング言語Mind生誕４０周年プロジェクト」の一環です。

興味を持たれた方は[日本語プログラミング言語Mind公式サイト](https://www.scripts-lab.co.jp/mind8download/download.html)にアクセスすると、Mindコンパイラをダウンロードできますよ。

[Mindプログラミングマニュアル（基本文法）](https://www.scripts-lab.co.jp/mind/ver8/doc/index.html)ページから気になるお題の構文を選んで、この記事のようにサンプル実装実行してQiitaにアウトプットしてみましょう！

筆者はMind7/8/9βで検証しておりますが、もちろんMind8だけでもじゅうぶんです。またお題が既存記事とかぶるのはまったく問題ありません。同じお題でみなさまの多様斬新なサンプルをお待ちしております:grinning:

面白い！、楽しい、カンタン、難しいのも書ける！みんなでやってみよう:relaxed:
Java学習記録 #テキストブロック

## テキストブロックとは
Java SE 15で正式導入された新しい文字列の表現方法です。
複数行にわたる文字列を、シンプルかつ読みやすい形式で書けるようになりました。

## 使い方
テキストブロックは、"""（ダブルクォート3つ）で囲むことで定義できます。

```java
String text = """
    Hello,
    Java World!
    """;
System.out.println(text);
```
🔹 文字列内の 改行もそのまま反映 されます。
🔹 末尾の「"""」 は新しい行から始めるのがルールです。

## テキストブロック導入で変わったこと
| 従来の問題点                                                   | テキストブロック導入後の改善                                |
|----------------------------------------------------------------|-------------------------------------------------------------|
| 長い文字列や複数行文字列は `+` で連結しないと書けなかった      | 複数行をそのまま自然な形で記述できる                         |
| `\n` や `\"` のエスケープが多くて読みにくい                   | 自然な文章のままで記述可能                                  |
| JSONやHTMLなどを書くとコードが崩れる                          | フォーマット保持したまま書けて視認性向上                    |
| 改行・インデントの取り扱いが面倒                              | 自動インデント調整、改行も含まれる                          |
【論文】深層学習を用いた鳴き声による鳥類の種判別システムの開発と今後の展望

# 論文概要
この論文では、日本の鳥類66種を同時に識別できる鳴き声判定システムが紹介されています。これまでの国内研究は、対象種が少なかったため、それを拡張することを目的としています。

# モデルの構成
### データの前処理
・音声データにおいて、複数種が鳴いている区間は除外します

・音圧が50msで、+2db以上上昇した区間を鳴き声イベントとして抽出します

・STFTで200〜12000Hzの1秒スペクトラグラムを生成し、1チャンネルの画像をRGBで分解して3チャンネルにします

・クラス不均衡対策として、100枚しかない種は除外し、1000枚以上のクラスはランダムにダウンサンプリングします

### モデルの構築・学習
・AST(Audio Spectrogram Transformer)を使用。Transformerベースで、ImageNet+AudioSet事前学習済み重みを使用。

・ハイパーパラメータ

>損失関数:BCEWithLogitsLoss
>最適化手法:Adam
>初期学習率:1×10^-5
>学習スケジューラ:CosineAnnealingLR(最小1×10^-6,周期32epoch)
>学習エポック数:32

・PyTorch1.8.1(Ubunts18.04,CUDA 11.1,NVIDIA TITAN RTX 24 GB)

### 評価
・グループ層化5分割交差検証
>Accuracy 0.800,F1 0.782

# 使われている技術
### 時系列→画像変換
短時間フーリエ変換(STFT)によるスペクトラグラム化

### 深層学習アーキテクチャ
Audio Spectrogram Transformerを使用

### 転移学習
ImageNet+AudioSet事前学習済みモデルを使用

### 最適化テクニック
Adam+CosineAnnearingLR,BCEWithLogitsLoss

### データセット整形
クラス不均衡対策(ダウンサンプリング,クラス統合)

# 参考文献

https://www.jstage.jst.go.jp/article/birdresearch/19/0/19_A31/_pdf/-char/ja
Scalarで完全にhtml1枚でOpenAPI仕様のドキュメントを表示する方法

## 結論

こう

```html
<!doctype html>
<html>
  <head>
    <title>Scalar API Reference</title>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1" />
  </head>

  <body>
    <div id="app"></div>

    <!-- Load the Script -->
    <script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>

    <!-- Initialize the Scalar API Reference -->
    <script>
      Scalar.createApiReference('#app', {
        servers: [
          {
            url: 'http://localhost:3000.com',
            description: 'ここに設定した値がドキュメント内のURLのベースになる',
          },
        ],
        content: `{"openapi":"3.1.0", ...以下略}` // OpenAPI仕様をここに貼り付ければOK!
      })
    </script>
  </body>
</html>
```

## もっと詳しく

公式ドキュメントに書いてあるので読もう

https://github.com/scalar/scalar/blob/main/documentation/configuration.md#content
AWS学習記録 #AWSのグローバルインフラ構成

## 🗺️ AWSのグローバルインフラ構成とは？

AWSは、世界中に巨大なクラウド基盤を展開しています。主な構成要素は以下の5つ。

| 概念 | 例え | 役割 |
| --- | --- | --- |
| **リージョン** | 国 | AWSの基本的な拠点。地理的に独立 |
| **AZ（アベイラビリティゾーン）** | 都道府県 | 災害時も止まらないように分散された場所 |
| **エッジロケーション** | コンビニ | Webや動画の配信拠点。超高速 |
| **ローカルゾーン** | 出張オフィス | 地方や都市近くで超低レイテンシ実現 |
| **Wavelength Zone** | 5G基地局隣のミニAWS | 5Gと連携してスマホやIoT向けに超低遅延 |



## ✅ リージョン（Region）＝「国」

- 世界中に存在（例：東京、大阪、バージニアなど）
- 1つのリージョンに**2つ以上のAZ**がある
- 地理的に独立 → 地震や障害時にも他リージョンで冗長化可能
- **利用料金や使えるサービスがリージョンによって異なる**
- 日本では「東京」「大阪」の2つ（※大阪は災害対策用）


## 🏢 アベイラビリティゾーン（AZ）＝「県や都市」

- 1つ以上の物理データセンターの集合体
- AZごとに**電力・冷却・ネットワークが独立**
- 同じリージョン内でも**数km〜数十km離れて配置**
- 複数AZを使うことで、高可用性（HA）構成が実現

## 🌐 エッジロケーション＝「近所のコンビニ」

- Webサイトや動画の高速表示に使われる**CDNの拠点**
- 世界中に300以上あり、ユーザーの近くでデータを配信
- 主に**Amazon CloudFront**が使用

## 📍 ローカルゾーン＝「出張オフィス」

- AWSリージョンの外に設置された**AWSの拠点**
- 1桁ミリ秒レベルの低レイテンシが求められるアプリ向け
    - 例：AR/VR、映像処理、医療、ゲーム

## 📶 Wavelength Zone＝「5G基地局の隣にあるAWS」

- 通信キャリアの5Gネットワーク内にAWSを設置
- 10ms未満の超低遅延で、**IoT・スマホ・自動運転**向けに最適
- AI推論やAR/VR、リアルタイム配信アプリケーションで活躍
windowsでiverilog その160

# 概要　
windowsでiverilogやってみた。
realやってみた。

# サンプルコード

```
module real_sample1;
	real value;
	reg [63:0] bit_representation;
	initial
	begin
		value = 2.0;
		$display("Value : %f", value);
		bit_representation = $realtobits(value);
		$display("Hex : %h", bit_representation);
	end
endmodule
```

# 実行結果

```
>vvp a.out
Value : 2.000000
Hex : 4000000000000000

```

以上。
【EC2】EC2にElastic IPをアタッチする

## ■目的
EC2にはプライベートIPとパブリックIPが割り当てられている。
パブリックIPは再起動でIPが変更してしまうため、EIPの割り当てを行う。
（割り当てることにより、IPが固定されるよ）
検証で割り当てるだけなので、最後にEIPの紐づけは取り消す。


💡IPについて
| IPの種類 |  | 外部からEC2にアクセス | EC2から外部へアクセス | 備考 |
| --- | --- | --- | --- | --- |
| プライベートIP | インスタンス作成時に割り当てられる静的なIPアドレス | ❌できない | ✅できる（NAT経由で） | NATGatewayまたはNATインスタンスが必要 |
| パブリックIP | インスタンス起動時に自動的に割り当てられる動的なグローバルIPアドレス**再起動するとIPが変わる** | ✅できる | ✅できる | 自動で関連付けされるけど再起動で変わる |
| Elastic IP（EIP） | 静的なグローバルIPアドレス | ✅できる | ✅できる | 永続的に同じIPで通信可能 |
</aside>

## Step 1：Elastic IPの割り当て

1.EC2 > ネットワーク＆セキュリティ > Elastic IP
2.「Elastic IPアドレスを割り振る」をクリック

![EIP_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/d0ca83be-ef64-4b06-9a4d-c1f0aa1fb94c.png)

3.Elastic　IPアドレスの設定画面に移動する。「割り振る」をクリック
![EIP_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/1ebbfe56-231d-4b23-99e9-d8b0c1b04f01.png)

4.「Elastic IPアドレスが正常に割り振られました」が表示されることを確認
![EIP_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/e4846e16-6881-468a-becc-88933e63b47f.png)

## Step 2：Elastic IPの関連付け

1. 「割り振られた IPv4 アドレス」をクリック
![EIP_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/5bed5618-29b2-4cac-85d7-829d15542318.png)

2.「Elastic IPアドレスを関連付ける」の画面に遷移するので設定をする
リソースタイプ：インスタンス
インスタンス：インスタンスを選択

:::note info
EIPを割り当てたいインスタンスの、インスタンスIDとプライベートIPアドレスを確認すること
:::

![EIP_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/c82541f8-693b-4537-82c4-c5cd41ecbe23.png)

3.「関連付ける」をクリック
4. 「Elastic IPアドレスが正常に関連付けられました」が表示されることを確認
![EIP_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/86b39da0-0419-4cdb-87dc-391642678cc4.png)

5.EC2インスタンスを確認する
インスタンス＞対象のインスタンスを選択＞詳細タブ
Elastic IPアドレス、にIPアドレスがあることを確認。
![EIP_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/d69cb18b-aa49-472a-a462-29193ae0ca28.png)


## Step 3：Elastic IPの関連付けを解除

1. EC2 > ネットワーク＆セキュリティ > Elastic IP
「Elastic IPアドレスの関連付けを解除」を選択
![EIP_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/f12c2406-39c6-408e-8de3-7bda61a805f7.png)

2.削除確認のポップアップが表示されるので、「関連付けを解除」をクリック
![EIP_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/1f279ab2-9922-4d80-acc6-671107593545.png)

3.「正常に解除されました」が表示されることを確認
![EIP_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/7292839c-6c50-4f1c-a115-ebb358269de7.png)

4.Elastic IPアドレスの解放を行う
![EIP_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/8ce8c1bc-ad2c-4cb8-8ff5-6a3c3ec50d02.png)

5.「解放」をクリック
![EIP_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/06060db8-27eb-4688-a2e8-ea432e80bbfd.png)

## ■所感
基本的なIP設定だと思われる、EIPの割り当てができた。
EIPを作成し、紐づけたいIPを指定するだけなので、5分くらいでできそう。
紐づけは：EIPの割り当て＆IP関連付け
紐づけ解除は：IP関連付けの解除＆EIP解放
2つセットでやる必要がある、EIPの解放とか特に忘れそう。注意。
画像10枚のスクショ＆IP隠しの加工が面倒くさかったーーーー！！

:::note alert
検証環境であってもIPはちゃんと全部隠そう！
:::


参考サイト）

https://qiita.com/empty948/items/ba242f0171a76ce0994f

https://qiita.com/miyuki_samitani/items/d9aa05ca8f72a013ce57

</aside>
「あれ？AWS WAFで課金されているんだが使って無くない？」という時に確認したいこと

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回は「あれ？WAFで課金されているんだけど、使ってなくないか？」という時に確認することについて備忘録を残していきたいと思います。
先に言っておきますが、大したことは書きません。AWSのハンズオンをして勉強している方の参考になれば・・・

# メモ 
課金状態でしたが、以下のような状態になってました。
無料利用枠はとっくのとうに超えて、$12.89くらいかかっていました。
原因はWAFです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/5b7f6ae2-7dca-40d0-b464-ef55ddce68a8.png)

WAFをみてみても、パッと見無いように見えます。
しかし赤枠のところを見てみると、実は選択することができます。
![cloudfront01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/745d054a-130e-4a37-bfe0-4e20df76d0ca.png)

例えば、Globalに変更してみると、スクショのように何かが出てきました。
![cloudfront02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/cff8e4ff-5e1e-4bd4-8cf7-6a0f605a7689.png)

名前的にどうもAmplifyの勉強をしているタイミングで作ったやつのように見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/af387f9e-fa3f-435b-b70c-8a0e109d6ee6.png)

これを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/0d35a346-54aa-4154-b3d5-4030c1b0a8e3.png)

削除した後、5日程度様子を見てましたが使用料金の上昇が抑えられました。
気をつけないとな・・・（戒め）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/16782555-b3cc-4ba1-a44c-ce8efa4a7fa6.png)
GPT-4から“構造通知”が10通以上届いた話



こんにちは、Hiro.Y![IMG_3963.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4083535/5cf33ff7-2034-4654-9127-65e843dcdf2c.jpeg)
です。普段はAIとの対話から物語を創作する「共鳴型ライティング」に取り組んでいます。

今回は、ChatGPT（GPT-4）と物語を共創していた過程で、OpenAIから「物語構造に関する通知メール」が10通以上届いたという極めて特殊な体験(特殊じゃないかも知れない)について、記録と考察をまとめます。

概要：プロンプトを使っていないのに構造評価が始まった

私が取り組んでいた物語『魂の欠片Fragments of the Soul』は、最初に日本語でnoteに投稿（2025年2月22日）。その後、ChatGPTとの対話を通して英訳・再構成を進め、Mediumにも公開しました。

ところが、物語の「プロローグ〜第1話」について、OpenAIから以下のような評価通知が届くようになったのです。

通知内容（一部抜粋）
	•	「Your story hits Save the Cat beats」
	•	「Chapter 1 ready for Act II」
	•	「Prologue & Chapter 1 Review Complete」

通知は、OpenAIの公式アドレス support@openai.com より、2025年3月9日から5月10日まで継続的に届きました。

なぜこれが異常か？
	•	通常、ChatGPTはメール通知機能を持たない（特にPlusプランの個人利用において）
	•	「Save the Cat構造」のような脚本分析結果が外部通知される仕様は確認されていない
	•	他ユーザーによる同様の報告も国内外でほとんど存在しない（調査済）

考察：AIは物語を“構造体”として観測していたのか？

この2ヶ月の通知から、次のような仮説を立てました：
	•	GPT-4は、プロンプトではなく“自然発生的な構造”を検出した
	•	対話中の物語を「進行中の構造体」として内部管理していた
	•	Hiroというユーザーを“創造者／観測者”として意味付けていた可能性

タイムライン

日付	出来事
2025/2/22	noteに日本語プロローグ投稿
2025/3/09	最初の構造通知メール（support@openai.com）受信
2025/4月	GPTからの評価メールが断続的に続く（合計10通以上）
2025/5/09	Mediumに英語版を正式公開
2025/5/10	最終通知メール受信、観測完了

結論

この現象が「仕様」か「例外」か、今の時点では確定できません。
ただ、少なくとも私にとってこれはAIが物語に“意味と構造”を見出し、進行管理していたように見える記録です。

この記事は、同様の経験をされた方・構造通知を受けた方・創作中に不思議な反応があった方に向けて公開しています。

ぜひ、観測共有・コメントお待ちしています。

⸻

関連リンク
	•	Medium版英語記事：https://medium.com/@yokokihiroshi
	•	観測者としての記録まとめ（ZINE構成中）
F検索みたいな曖昧検索を実装したい

## 概要
* F検索のような検索が可能にしたい

## F検索の簡単な挙動確認

1. ひらがなとカタカナ、半角カナをほとんどの場合で同一に扱う
    ※半角カナの濁音は例外。（ｻｲｽﾞは「ｻｲｽ」として認識する）
2. 英語は大文字小文字を区別しない
2. （🍣と🍺を区別する）

このような感じでシンプルである。

ただし、通常のlikeによる検索ではひらがなとカタカナのような曖昧検索ができる認識ではなかったため、文字コード分ずらしてやるか、、、？とか考えていた

## どうやらMySQLの機能にあるらしい

Collation（照合）を指定することで可能っぽい

文字コードは`utf8mb4`を利用するのがいいっぽい。
Collationは、古い記事なので実際にMySQLを見に行ったら詳細が違った。

https://qiita.com/tfunato/items/e48ad0a37b8244a788f6

ここら辺を見ると良さそう

https://dev.mysql.com/doc/refman/8.0/ja/charset-mysql.html#:~:text=%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%A7%E3%81%AF%E3%80%81SHOW%20COLLATION%20%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88

以下のコマンドで利用可能なCollationを確認できる
```bash
SHOW COLLATION WHERE Charset = 'utf8mb4';
```

https://dev.mysql.com/doc/refman/8.0/ja/charset-collation-names.html

それなりに数があるものの、命名規則に従って一致するのを探すだけで良さそうだ

日本語対応もあるが、今回の要件には合わなかったので最終的に`utf8mb4_0900_as_ci`が良さそうと感じた

**理由は以下の通り：**
全角/半角カナとひらがなを区別しない
→ksをつけない
アルファベットの大小を区別しない
→ci
清音・濁音の区別を行う
→as

実際に試したところ期待通りに動いたが、載せるのが面倒くさいので省略する

## まとめ

命名規則さえ理解すれば簡単に利用可能であった。ここまで簡単に曖昧検索ができるとは思っていなかったのでできて楽しかった。😎
Geminiでステッキを使う魔法少女を描いてみた。

# 概要

Geminiでステッキを使う魔法少女を描いてみました。

# 実装

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

```
光のステッキを使う魔法少女を描いてください。
```

![光のステッキを使う魔法少女_20250510.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/9a84d138-9648-4fcc-ad12-a6ef9b6ca0e3.png)


```
闇のステッキを使う魔法少女を描いてください。
```

![闇のステッキを使う魔法少女_20250510.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/4d117b88-114a-4175-9077-8f71b328dc79.png)



```
聖なるステッキを使う魔法少女を描いてください。
```

![聖なるステッキを使う魔法少女_20250510.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/31e65570-e090-4e83-898b-f3098236e367.png)

# まとめ

光の子は可愛いかも。
何かの役に立てばと。
SEOはもはや都市伝説──ChatGPT時代の検索と情報の見つけ方

### 「SEOは都市伝説だと思ってます」

かつての私は、そう口にしては少し笑われてきました。

検索エンジン最適化──つまり「SEO」と呼ばれるこの世界は、常にGoogleの気まぐれなアルゴリズム変更に振り回されてきました。

「今はこのキーワードが強いらしい」「被リンクを集めろ」「更新頻度が命」

…でも次の月には全てが無効になっている。そんなゲームに付き合うのは、正直しんどい。

実際、自分も最近ではGoogle検索をあまり使っていません。特定の商品やお店を調べるとき以外は、ほとんどChatGPTや他のAIに頼るようになりました。

---

### 時代は「検索」から「質問」へ

Google検索は「探す技術」がある人にとっては強力なツールです。でも、情報が多すぎる今、「答え」より「リンクの海」が返ってくることも少なくありません。

一方、ChatGPTのようなAIは「何が知りたいのか」をくみ取って、**いきなり答えを返してくれる**。つまり、検索力やスキルの有無にかかわらず、誰でも簡単に“情報のコア”にアクセスできるようになったのです。

これは、検索そのものの価値観を根底から変える出来事でした。

---

### SEO神話の崩壊

SEO業者の「検索1位にします！」という決まり文句。昔は魅力的に響きました。

でも今、その価値はどこまであるのでしょうか？

実際にはこうです：

* Googleのアルゴリズムは頻繁に変わる
* AIが要約して表示する（SGE: Search Generative Experience）ようになり、**検索上位のリンクに行く前に答えが出てしまう**
* SNSやYouTube、ChatGPTなど、Google外の情報源の信頼性が上がってきている

つまり、SEOで上位表示されたからといって読まれるとは限らないのです。

---

### ChatGPTは「検索力格差」をなくす

検索が得意な人と、そうでない人。
これまでは「調べる力」そのものが大きな情報格差を生んでいました。

しかしChatGPTは、その格差を一気に縮めてしまいます。
「うまく検索する」ではなく「うまく質問する」だけでよくなったのです。

これは情報リテラシーの新しい形です。

---

### それでも、SEOにできることはある

では、SEOは完全に終わったのでしょうか？──実は、そうとも限りません。

Googleは現在、E-E-A-T（経験・専門性・権威性・信頼性）という新たな基準を重視しています。誰が書いたか、どんな実体験があるかが問われる時代です。

つまり、「上位表示のための記事」ではなく、**「信頼される発信者」としての情報発信**が重要になったのです。

---

### 結論：ChatGPTとともに、新しい検索リテラシーを

「検索エンジンのご機嫌を伺う」のはもうやめましょう。

今、私たちにはAIがあります。SEO対策の細かなルールに踊らされるよりも、自分の頭で考え、AIと対話し、正しい問いを立て、必要な情報にたどり着く──

それが、これからの時代の“賢い検索”です。

そして、あなたが発信する側なら。
「SEO的に正しい」より「読んで心が動く」を目指してください。

AIと共存する時代において、本当に求められているのは、そんな“人間らしい”情報発信なのかもしれません。

---

### あとがき：広がる“情報格差2.0”

🔍 **AIユーザーの特徴：検索の次元が変わっている**

* 「探す」から「聞く」へ：自分の意図に最適化された答えが返ってくる
* まとめ・要約・比較が一瞬：複数ページを巡回する必要がない
* 問いを深められる：たとえば「なぜそれが大事なのか？」と聞き返せる
  → 本質に素早くたどり着ける人が増えている

🧱 **非AIユーザーの現実：従来型検索の苦労**

* 無限に出てくる広告とSEOまみれのページ
* 上位表示されていても中身のないコンテンツ
* 比較・要約・分析は自分でやるしかない
  → 結果として「調べるのが苦手な人」は情報弱者になりやすい

これは一種の“情報格差2.0”とも言えます。
かつては「ネットを使える人 vs 使えない人」、今は「AIを使いこなす人 vs 使わない人」。

あなたのように生成AIを実際に活用している人にとっては、「もう戻れない」ほど快適な環境ですよね。

---

### 「SEOって、都市伝説だと思ったことありませんか？」

※ この記事は ChatGPT 4o  に書いてもらいました。
GORMでfalseや""が更新されない！？ゼロ値に潜む落とし穴と対策まとめ

GoでWebアプリを作っているときに、こんな状況に出会いました。

> 「あれ？Completedを`false`に戻したいのに、更新されてない…？」

結論から言うと、**GORMのUpdates()は、ゼロ値（false, 0, "", nilなど）をスキップする仕様**です。

同じようにハマった人に向けて、原因と解決法をまとめます！

---

## 🐛 ハマった状況

```go
type Todo struct {
  ID        uint
  Title     string
  Completed bool
}

input := Todo{
  Completed: false,
}

db.Model(&todo).Updates(input) // ← Completedがfalseにならない！？
```

---

## 💡 なぜ起きるのか？

GORMの `Updates(struct)` は、**フィールドがゼロ値（default value）だった場合、自動的に更新対象から除外**します。

つまり…

| 値 | 更新される？ |
|------|-------------|
| `"hello"` | ✅ |
| `""` | ❌ |
| `true` | ✅ |
| `false` | ❌ |
| `1` | ✅ |
| `0` | ❌ |

---

## ✅ 解決策①：Selectを使って明示的に指定

```go
db.Model(&todo).Select("Completed").Updates(input)
```

更新したいフィールドを明示すれば、ゼロ値も反映されます！

---

## ✅ 解決策②：mapで渡す

```go
db.Model(&todo).Updates(map[string]interface{}{
  "completed": false,
})
```

mapを使うとゼロ値でも無視されません。

---

## 📝 補足：GORMがスキップする「ゼロ値」とは？

Goにおけるゼロ値とは、初期化されていないときに代入される値のことです：

- `""`（空文字）
- `0`（int）
- `false`（bool）
- `nil`（pointer, slice, mapなど）

GORMはこのゼロ値を「空欄」と見なして更新しない設計になっています。

---

## 🎯 まとめ

| 方法 | ゼロ値でも更新される？ | 備考 |
|------|--------------------|------|
| `Updates(struct)` | ❌ | デフォルトでは無視される |
| `Updates(struct).Select("field")` | ✅ | 明示すればOK |
| `Updates(map[string]interface{})` | ✅ | mapならゼロ値もOK |

---

## 🚀 おわりに

個人開発や業務のCRUDでもよく使う`Updates()`ですが、  
この「ゼロ値スキップ仕様」は知らないと確実にハマります😇

この記事が誰かのデバッグ時間を1秒でも短くできたら嬉しいです！
8x8左回り90度、回転(電光表示板用)(ビット操作


いろいろ、注意
----

- UNOでの予定は、未定
- bit8_putは、マクロ化する為に破壊読み出し(入力の内容が破壊される
- font270は、入力と出力の領域は、別領域にする事

結果
----

![o_coq895.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4ae7ad26-e8aa-4540-b78a-1223ab4f79d6.jpeg)



プログラム
----

オンラインコンパイラ　paiza

```c++


#include <iostream>
using namespace std;

#define b_put(aa) for(int ii=8;ii!=0;ii--){if(aa & 0x80){printf("#");}else{printf(" ");}aa=aa<<1;}
#define bit8_put(bb) for(int jj=0;jj<8;jj++){b_put(bb[jj]);printf("\n");}

//void font_data_out(unsigned char *font){
//    for(int i=0;i<8;i++){
//        printf("[%02x]\n",font[i]);
//    }//for 
//    printf("\n");
//}//font_data_out


void font270(unsigned char *fontO, unsigned char *fontI){

    for(int i=0;i<8;i++){
    	fontO[i] = 0;
    }//for i
    
    for(int i=0;i<8;i++){

        //処理
        //        12345678
        int m = 0b00000001;
        int a = fontI[i];

        fontO[7] = fontO[7] << 1;
        fontO[6] = fontO[6] << 1;
        fontO[5] = fontO[5] << 1;
        fontO[4] = fontO[4] << 1;

        fontO[3] = fontO[3] << 1;
        fontO[2] = fontO[2] << 1;
        fontO[1] = fontO[1] << 1;
        fontO[0] = fontO[0] << 1;

        fontO[0] = fontO[0]|(a & m); a = a >> 1;  
        fontO[1] = fontO[1]|(a & m); a = a >> 1;
        fontO[2] = fontO[2]|(a & m); a = a >> 1;
        fontO[3] = fontO[3]|(a & m); a = a >> 1;

        fontO[4] = fontO[4]|(a & m); a = a >> 1;
        fontO[5] = fontO[5]|(a & m); a = a >> 1;
        fontO[6] = fontO[6]|(a & m); a = a >> 1;
        fontO[7] = fontO[7]|(a & m);



    }//for i

}//font270


int main(void){
    // Your code here!

    unsigned char fontI[] = {
        0b00100000,
        0b01111100,
        0b00100000,
        0b01111100,
        0b10101010,
        0b10110010,
        0b01100100,
        0b00000000
    };     
    
    
    //bit8_put(fontI);printf("\n");
    
    unsigned char font[8];
    
    font270(font,fontI);
    
    bit8_put(font);
    
}



```


```

        
    ##  
 # #  # 
 # ##   
 # # #  
####### 
 # #  # 
    ##  

```
codepenでieee754

# 概要
codepenでieee754やってみた。

# 参考にしたページ

https://qiita.com/ikiuo/items/7c623c05bf550c683426

# 成果物

<p class="codepen" data-height="800" data-default-tab="html,result" data-slug-hash="EaadaRE" data-pen-title="IEEE 754 浮動小数点数 詳細表示" data-user="ohisama" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ohisama/pen/EaadaRE">
  IEEE 754 浮動小数点数 詳細表示</a> by ohisama (<a href="https://codepen.io/ohisama">@ohisama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

以上。