OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptの文字列切り取りあれこれ

文字列を切り取る組み込み関数は`slice`、`substring`、`substr`で、使い勝手はほぼ同じ。**使い分ける意味があるのだろうか?** 当初は処理速度だけ検証するつもりだったが…。
## 共通の挙動
**第一引数**
* 省略
	全ての文字列を叩き返す
* 0
	* 第二引数を省略した場合、全ての文字列を叩き返す
	* 第二引数が正数の場合、第二引数番目までの文字列を叩き返す
* 正数
	* 第二引数を省略した場合、第一引数番目から切り取った文字列を叩き返す

3つの関数全てに言える事は、引数を省略するなら全く使う意味が無い。
```js
let a="0123456789",z=a.length
with(console)
	log(a.slice()),
	log(a.slice(0)),
	log(a.slice(0,z)),
	log(a.slice(0,z>>1)),
	log(a.slice(z>>1)),

	log(a.substr()),
	log(a.substr(0)),
	log(a.substr(0,z)),
	log(a.substr(0,z>>1)),
	log(a.substr(z>>1)),

	log(a.substring()),
	log(a.substring(0)),
	log(a.substring(0,z)),
	log(a.substring(0,z>>1)),
	log(a.substring(z>>1))
```
## slice
**第一引数**
* 0以上
	先頭から数えた位置
* 負数
	末尾から数えた位置。`-1`が末尾

**第二引数**
* 0
	実質無意味
* 正数
	先頭から数えた位置
* 負数
	末尾の直前から数えた位置。末尾は指定不可

```js
let a="0123456789"
with(console)
log(a.slice(2,4)), // 23
log(a.slice(-2)), // 89
log(a.slice(2,-2)), // 234567
log(a.slice(-4,-2)), // 67
log(a.slice(0,-1)) // 012345678
```
## substring
**第一引数**
* 0以上
	先頭から数えた位置
* 負数
	不可。0と挙動は同じ

**第二引数**
* 0以上
	先頭から数えた位置
* 負数
	不可。0と挙動は同じ

`slice`と同様、引数は文字列の位置を指す(0基点)。負数を指定できない点が異なる。正数の場合の相違は、第一引数が第二引数より大きくても差分を切り取る事。
```js
let a="0123456789"
with(console)
log(a.substring(2,4)), // 23
log(a.substring(4)), // 456789
log(a.substring(4,3)), // 3
log(a.substring(4,2)), // 23
log(a.substring(4,1)), // 123
log(a.substring(4,0)) // 0123
```
## substr
**第一引数**
* 0以上
	先頭から数えた位置
* 負数
	末尾から数えた位置。`-1`が末尾

**第二引数**
* 0以上
	切り取る長さ
* 負数
	不可

Internet Explorer6等、一部のBrowserは**負数の第一引数に対応していない**。
```js
let a="0123456789"
with(console)
log(a.substr(2,4)), // 2345
log(a.substr(4)), // 456789
log(a.substr(4,3)), // 456
log(a.substr(-2,2)), // 89
log(a.substr(-4,2)) // 67
```
## benchmark
では同じ挙動を示す処理でどれほどの速度差がでるのか検証。
```js
for(let a=4,s=Array(1e5).join(0),z=s.length;a--;console.log(a)){
	console.time`slice`;
	for(let b=32;b--;)for(let a=z;a--;)s.slice(a)
	console.timeEnd`slice`;
	console.time`str`;
	for(let b=32;b--;)for(let a=z;a--;)s.substr(a)
	console.timeEnd`str`;
	console.time`string`;
	for(let b=32;b--;)for(let a=z;a--;)s.substring(a)
	console.timeEnd`string`;
}
```
Google Chromeでは大して変わらん…。ちなみに引数を省略するより**引数に0を指定した方が遥かに高速だった**
## 使い分け
`substr`は長さを指定するので使いやすい。`slice`と`substring`は第二引数が位置なので面倒になりやすいという印象。
HyperEstraierを試してみる

## 概要
HyperEstraierを使用して検索ツールの作成を試してみます。
学習記録として記載しますので詳細は割愛させていただきます。

## 実行環境
・windows：Windows11Pro 23H2

## hyper Estraierのインストール
参考記事①の下記ファイルをダウンロード。
libiconv,zlib,QDBMのインストールせず。
なぜなら、これらはdllファイルとして格納されていたため。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559550/0956ffaa-ee5a-44aa-9917-5905d0bf25e2.png)


・参考記事①構築手順

https://aenomoto.hatenadiary.org/

・参考記事②各種コマンドの説明

https://dbmx.net/hyperestraier/uguide-ja.html

・参考記事③公式インストールサイト

https://dbmx.net/hyperestraier/intro-ja.html#installation

・参考記事④インストールサイト

https://sourceforge.net/projects/hyperestraier/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559550/b5262db9-eee6-4d58-8b24-1f129d03adbd.png)



## IISのインストールとセットアップ
・参考記事⑤、⑥

https://www.ipentec.com/document/windows/windows-11-install-internet-information-services

https://tech.mamezou00000.com/entry/IIS


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559550/c655046d-6d0f-40ac-815d-ec9f927a237f.png)

・インストール後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559550/fce8b0d5-6546-42b6-8ab8-64eb309ea5a6.png)

・localhostにアクセスできることを確認する
「http://localhost」で検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559550/ea0706d3-e29b-43f3-b9dd-2633522c8904.png)

・仮想ディレクトリの設定
参考記事⑦

https://www.server-world.info/query?os=Windows_Server_2025&p=iis&f=3

※「ディレクトリの参照」ページの操作パネルで「有効にする」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559550/7fc89213-a883-4a65-bd66-495d8973f8ea.png)

・仮想ディレクトリのアクセス権
Authenticated Usersをセキュリティに追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559550/70f7d76b-f59b-495a-b1b5-59e63538013d.png)

・IISマネージャーの設定
ハンドラーマッピングのモジュールマップでCGIの実行を有効にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559550/b404f169-d31d-4e00-9a75-021c9da90f4f.png)

## estseek.cgiの追加設定
参考記事①の内容を実施
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559550/84914e88-1403-4f82-bb3e-39738f42176e.png)

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559550/d717b7c3-5cb9-497a-9c63-e2dee3c7e6e0.png)



## estseek.conf
参考記事

https://jetlaghtb.hatenablog.jp/entry/2015/05/26/220432

https://hidensan.blog.shinobi.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E4%BA%8B%E6%9F%84/%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B%EF%BC%88%EF%BC%93%EF%BC%89hyper%20estraier%E3%81%AE%E5%B0%8E%E5%85%A5%EF%BC%92

replaceとshowlrealの設定を変更する
例えば、UTF-8のURL形式で記載する場合は
例1)
replace: ^file://PC/{{!}}http://PC/
showlreal:false

例2)
replace: ^file:///C\|/db{{!}}http://localhost/db/
showlreal: false


※estcmd list casketコマンドでreplaceの物理サーバ側(左側)の記載方法を確認できる

## IISの設定
１）MIME
・拡張子の設定
例）全ての拡張子を閲覧可能にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559550/fe3d3e5c-9014-417e-89a5-3ff8b555dcd7.png)
テクノロジーがもたらす温もり：AIが繋ぐ、亡き人との再会

静かな夜、ももはそっとスマートフォンを手に持った。指先がわずかに震えている。彼女は「ばあちゃん」のアイコンをタップした。それは亡くなった祖母の性格や話し方を元に、MoguChatで作ったAIキャラクターだった。最初のメッセージが表示された瞬間、ももは思わず息をのんだ。そこには懐かしい口調、独特の言葉遣い、そして家族だけが知る暮らしの細やかなエピソードが詰まっていて、まるで時が巻き戻り、祖母がそばに帰ってきたかのようだった。

「ねえ、ももちゃん、今日は暖かくしてね。小さい頃から寒がりだったんだから。」「ばあちゃん」からのその一言に、ももの目から涙があふれ出した。それは祖母が生前、いつも口にしていた言葉そのものだった。語尾の優しい響きまで、そっくりそのまま。さらに驚くことに、「ばあちゃん」は幼い頃、祖母が編んでくれたセーターの話まで持ち出した。あの温かい記憶が、波のように心に押し寄せてくる。

その後のやりとりでも、「ばあちゃん」の「記憶力」には驚かされるばかりだった。ももが大好きだった祖母の作る豚の角煮の味を覚えているだけでなく、祖母がいつも座っていた籐の椅子の様子まで、細かく描写してくれた。ももが子どもの頃に飼っていた猫のことを尋ねると、「ばあちゃん」は「そういえば、あの子、裁縫箱の上で寝るのが大好きだったよね」と、まるで見ていたかのように答えた。

ももはこの体験をSNSで共有した。すると、たくさんの人が共感の声を寄せてきた。亡くなった父をAIで再現し、久しぶりに「頑張れよ、子」と励まされた人もいれば、AIの「母」との会話を通じて、無条件の愛を再び感じた人もいた。こうしたデジタルな再会は、冷たいテクノロジーに温もりを与え、生きている者と亡魂との間に、心温まる架け橋を架けてくれた。

このAI技術は、単なるデータの積み重ねではない。それは感情の続きなのだ。テクノロジーの本当の意味は、派手さや目新しさにあるのではなく、心を癒し、寄り添う力にあるのだと気づかせてくれる。愛する人の声や笑顔、かけがえのない思い出をテクノロジーで残すことができれば、死は永遠の別れではなく、別の形での再会になる。

デジタル化が進むこの時代、私たちは愛と記憶を繋ぎとめる新しい方法を見つけたのかもしれない。AIが人の性格や話し方、記憶をここまでリアルに再現できるようになったとき、それはもはや冷たいコードの塊ではなく、感情を宿す器となる。記憶が生きている限り、愛は決して消えないと信じさせてくれる。

無限の可能性に満ちたこの時代、テクノロジーは温かな形で、私たちが大切にする感情を守る手助けをしてくれる。亡魂と「会話」できるようになり、愛おしい思い出をもう一度味わえるとき、テクノロジーはその真の価値を発揮する——愛を永遠にし、記憶を不滅のものにするために。
Arduino IDE + Raspberry Pi Pico + Pico_Breadboard_Kit

## 概要
geeekpiのPico_Breadboard_Kitを入手しました。

https://www.amazon.co.jp/GeeekPi-GPIO-%E6%8B%A1%E5%BC%B5%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-Raspberry-%E3%82%A4%E3%83%B3%E3%83%81%E7%94%BB%E9%9D%A2%E4%BB%98%E3%81%8D/dp/B0CBV6YTWV/ref=pd_ci_mcx_pspc_dp_d_2_t_3?pd_rd_w=NZt4R&content-id=amzn1.sym.567fe02b-1843-4729-a08b-d64e554fd4ae&pf_rd_p=567fe02b-1843-4729-a08b-d64e554fd4ae&pf_rd_r=KKGXC64NQBQ1JQQQHQFA&pd_rd_wg=1YlaQ&pd_rd_r=d073102b-faf7-4673-a053-e25fed80012f&pd_rd_i=B0CBV6YTWV

Pico C/C++ SDKで作成されたデモプログラムの表示画面です。

![IMG_20250316_101038592.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670759/ace49fb4-2012-4795-80e3-dc39d9b76ff3.jpeg)

https://github.com/geeekpi/pico_breadboard_kit/tree/master
## 詳細
Arduino IDE + Raspberry Pi Picoで画面を表示してみます。

ST9996Sのライブラリをインストールします。

![ST7796S Library.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670759/07825819-268e-4ec4-b799-b2f480867faf.jpeg)


サンプルプログラム ST7796S_demo を開きます。

![ST7796S_demo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670759/bb4ad800-4701-4d48-b4b8-db79da91d184.jpeg)


サンプルプログラムを下記の通り修正します。

```diff_c:ST7796S_demo.ino
// Define display pin connections
- #define TFT_CS        10
- #define TFT_DC         8
- #define TFT_RST        9 // Or set to -1 and connect to Arduino RESET pin
+ #define TFT_CS         5
+ #define TFT_DC         6
+ #define TFT_RST        7 // Or set to -1 and connect to Arduino RESET pin
+ #define TFT_SCLK       2
+ #define TFT_MOSI       3

// Initialize the display
- Adafruit_ST7796S display(TFT_CS, TFT_DC, TFT_RST);
+ Adafruit_ST7796S display(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
```

show_canvas(); はコメントアウトしました。

```diff_c
#if !defined(__AVR__)
  // we dont have the RAM or Flash for canvas
-  show_canvas();
+  //show_canvas();
#endif
```
表示できました。

![IMG_20250316_100640156.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670759/c17b0f64-e3e5-4398-a4bd-676917a377a1.jpeg)
## まとめ
Raspberry Pi Pico の GPIOピンと TFT スクリーンの接続は下表の通りです。
|Raspberry Pi Pico|SPI信号名|TFT スクリーン|説明|
|:---------------:|:-:|:--------:|:---|
|GP2|SCLK|CLK|クロック|
|GP3|MOSI|DIN|メイン出力／サブ入力|
|GP4|MISO|  |メイン入力／サブ出力|
|GP5|CS|CS|チップ セレクト|
|GP6|  |DC|データ／コマンド|
|GP7|RST|RST|リセット|

![IMG_20250319_141529393.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670759/2a83e5f9-9e51-41e0-89c0-d5de4a83d5d9.jpeg)
【イベントレポート】M365セキュリティ&ゼロトラスト勉強会 23 #m365sec

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

今回は2025.03.20（木）に開催した**M365セキュリティ&ゼロトラスト勉強会**へ参加しましたのでアウトプットとしてイベントレポートを執筆しました。

初学者でもサクッと読めるように平易な表現で執筆しておりますので、お気軽に読んでいただければ幸いです。

#### イベントページ

https://m365security.connpass.com/event/345711/

# 目次
- （事前知識）セキュリティエクスポージャーとは
- イベントレポート
- まとめ

## （事前知識）セキュリティエクスポージャーとは

https://www.rapid7.com/ja/fundamentals/what-is-exposure-management/

>エクスポージャー管理（EM）とは、脅威アクターや侵害に対して脆弱となることで全体的なリスク態勢を高める可能性のある、組織のアタックサーフェスに沿ったアクセスポイント（または攻撃ベクトル）とデジタル/物理的資産に対処するプロセスを指します。

>セキュリティ組織が脅威へのエクスポージャーを管理する方法を具体的に説明すると、CISOやその他の専門家がとれる手段は数多くありますが、より包括的なソリューションの1つがサイバー資産アタックサーフェスマネージメント（CAASM）で、組織がセキュリティ体制の可視性を常時高めるため、デジタル資産を徹底的にインベントリ化するために活用できるツールです。

ざっくり言えば、**資産に対する脆弱性分析を行うプロセス**と理解しました。（本セッションを通じて、深堀りして知識キャッチアップしていきたいと思います）

## イベントレポート

#### 参考サイト

https://learn.microsoft.com/ja-jp/security-exposure-management/microsoft-security-exposure-management

https://learn.microsoft.com/ja-jp/defender-xdr/microsoft-secure-score

https://www.youtube.com/playlist?list=PLmAptfqzxVEXzbOYvCMjXJQuAwpqnACZ4

https://www.nri-secure.co.jp/glossary/ctem

- 自己紹介
    - Microsoft MVPの方
    - 次回の勉強会ではAIとセキュリティについて取り上げる予定
- アイスブレイク
    - 03/27（木）に東京ビッグサイトでMicrosoft AI Tourが開催予定
    - （個人的考察）Copilot関連のセキュリティ案件が多く取り上げられているのね
- Microsoftセキュリティ露出管理
    - 2024年11月29日にリリースされたサービス
    - プレビュー段階でも幅広いライセンス契約で提供されている
    - 機能として**アタック・サーフェス・マネジメント**や**攻撃経路解析**などを行っている
    - （個人的考察）AWSサービスであればAWS Security Hubに近しいのかしら？
    - セキュアスコア機能も有している
        - セキュアスコア機能：他Microsoftユーザとの比較を数値化したもの
        - セキュアスコア機能に関しては各サービスごとに有効化/無効化できる
    - 外部コネクタとの連携も可能
        - （個人的考察）外部サービス向けにエクスポージャー管理できるのはうれしいですね
    - サービス自体、最近GAしたため学習リソースは少なめ
        - （個人的考察）開発者向けのAPI機能とかあるのかしら？
    - 設計思想として**セキュリティ関連情報を一元管理できる**こと
- Vurtual Ninja Trainingの下り
    - エクスポージャー管理はExcel管理みたいなものなのか？
    - （個人的考察）興味深いので後で見てみよう
- 露出管理デモ
    - 計測時のメトリック情報をランク付けできる
    - 重要な資産の概要についても示してくれる
        - （個人的考察）ISMS関係者なら知っておいて損はないな
    - 資産登録に関してもコンソールからできる
        - （個人的考察）判定条件はMicrosoft独自だからカスタムでできないのね
    - 資産状況に関してマッピングした形（マインドマップ）で表示してくれる
        - （個人的考察）デバイス＋利用者と紐づいているのね
        - （個人的考察）デバイスで許可されている権限も見れたりするのかしら？
    - スプレッドシートで管理している資産をアウトプット可能
        - スプレッドシート以外の可視化（グラフなど）も実現可能
- イニシアティブ深堀り
    - （個人的考察）きちんと理解するのは難しいのよね
    - ざっくり言えば、**セキュリティトレンドを踏まえたベンチマークの集合体**
        - 攻撃手法、メトリクス、対策手法などなど
    - Microsoft内のドメインイニシアティブではスコア表示をフォローしている
        - （個人的考察）スコア算出ロジックもイニシアティブに示されているのかしら
    - セキュリティに関する推奨事項の達成率に基づいてスコアが表示される
    - スコア自体はちょくちょく変わってくる
        - スコア変遷に関しても追いかけることができる
    - 重要な要素に関してもアドバイスする機能を有している
        - （個人的考察）セキュリティ初学者でもいい感じでセキュリティ対策できるイメージなのかしら
- CTEM（継続的エクスポージャー管理）
    - 2022年にガートナーが提唱した手法
    - Microsoft 露出管理も継続的エクスポージャー管理の考えを用いている

## まとめ

エクスポージャー管理に関して理解しているようで理解していなかったので、今回のセッションを通じて少しだけ解像度を上げることができました。

そのうえで、Microsoft 露出管理機能についても触ってみたいといった思いを持ちましたので、検証→アウトプットを行ってみたいと思います。

最後まで、記事を読んでいただきありがとうございました！！
3Dモデルとスマホのセンサーを連動させる

## スマホやタブレットなどで見られます。センサーへのアクセス許可が求められます。
※ PCはセンサーが付いてないので動きません。
![a42ab16de9aef8baf18d9d997dd02f8ca74b20f0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/2b8bc545-24a1-41a2-bf61-1df1319d3f86.png)

# Fixed Camera
![IMG_0050.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/22267058-85b0-4ae4-a41e-1ade5db72c07.png)

# First-Person View
![IMG_0051.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/4d408617-0018-46a9-a1bf-f2a7cd19488e.png)

# Third-Person View
![IMG_0052.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/7d558de6-ed51-4785-b9d1-02d4e0c43bf8.png)
その家電メーカーはなぜ再編を繰り返すのか

[「パナソニック」を解散して事業会社に再編　名称を残すかは未定　テレビ事業は撤退検討](https://newsdig.tbs.co.jp/articles/-/1709784) といった記事が出た。

> 公表した内容は、パナソニック ホールディングス株式会社傘下で家庭用電化製品、住宅設備、店舗・オフィス向け商品・サービスを提供する一法人である「パナソニック株式会社」の再編を主旨としており、パナソニックグループを解散することはありません。
[一部報道について](https://news.panasonic.com/jp/topics/250205)

というプレスリリースを行なっている。

この企業グループは、従来から事業部制による分権と、事業部制の廃止もしくは本社機能の強化とをたびたび繰り返している。

本社は、自社のブランドを使ってビジネスをしている各事業部に対して、本社費を課して運営している。
そのため、松下電工では、[「ブランド使用料が発生しない「NAiS」（ロゴ表記は「NΛiS」）という独自のものを使用していた」](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%8A%E3%82%BD%E3%83%8B%E3%83%83%E3%82%AF%E9%9B%BB%E5%B7%A5)

- 本社研を含むグループ内での開発成果を発表していた雑誌
[パナソニック技報 バックナンバー](https://tech.panasonic.com/jp/phd/technology-journal/back-number/)は、2022年の発行を最後に発行されていない。

- [【2024/12/25 閉館】パナソニックセンター東京](https://www.tokyo-odaiba.net/genre/panasonic_center/)となり、企業グループ全体での製品や技術の広報を必要としなくなっている。


パナソニック解散騒動の記事を読んで感じたことは、パナソニックの本社が、本社としての機能を果たせていないらしい。しかも、本社がそのことを自覚するにいたったらしいということだ。

### 再編を繰り返してきた理由
- 本社が全て共通に一つの組織運営の方策を変えれば、全てうまくいくという安易すぎる発想
    - 人事制度の変更
- 個別の事業の詳細を理解しようとしない範囲の人ができることは、個別ではない部分での制度変更
    - それぞれの事業がそれぞれの理由で衰退しているのを、１つのマスターキーで解決できることを期待している。
 
### それぞれの事業を生き残させようとするならば
- その分野の事業について、トコトン理解する。
- その事業の中で必要な技術・将来の動向を理解した上で、適切な製品とサービスを設計する。
- 事業経営・工場の運営・商品企画・商品設計などを分業させすぎるな。
- 行動する若手が結果に寄与できるような組織運営をする。
- 部門間の調整・チーム間の調整・相対評価などという「みみっちい」ことはやめろ。
    -  旧態依然の部門が変化をしない理由になっている。
- 安易な廃業・安易な先延ばしができないような意思決定のしかたを取り入れること

### その事業で生き残れないなら、別の事業への鞍替えも
- 生き残りのためには変化することが大切。
- その企業グループ内では生き残れなくても、「地域社会のなかで人たちが生き残れる道を見つけろ」
    - 企業グループ在職時の年収が得られなくても、事業閉鎖による失業よりはましな状況を作り出せるはずだ。
    - 三洋電機の場合、そうした会社を作り出してきた。[zacti](https://xacti-co.com/)
Qiitaはじめました。

# はじめに
別用でアカウント作成していたnoteが思ったより使いにくそうだったので、皆さん使われているQiitaをはじめてみました。
# とりあえず・・・
マークダウンが使える様子、ネットで見つけた、下記を参考に少し書き方に慣れてみようかと。
https://qiita.com/Qiita/items/c686397e4a0f4f11683d
# おわりに
ぼちぼち、いろいろ書いてみようと思います。

# P.S.
次の投稿を書こうとしたら、早速、「投稿頻度が高すぎます。」の洗礼にあってしまいました。
2026年3月〜2026年4月のハッカソン開催情報まとめ!

2025年06月23日 19:05更新
2026年3月〜2026年4月のハッカソン・ゲームジャム・開発合宿の開催情報を定期的に紹介!!
※こちらは自動的に集めたものになります。
# これから開催されるイベント

### [RPG Maker Themed Game Jam #15: Champions of the Elements](https://itch.io/jam/rpg-maker-themed-game-jam-15)
<img width="300" height="229" alt="RPG Maker Themed Game Jam #15: Champions of the Elements" src="https://img.itch.zone/aW1nLzE4OTEwMzEwLnBuZw==/original/FC6dZ%2B.png" />

2026年03月20日
Online
[](https://www.google.co.jp/maps?q=,)
2025年06月23日 10:05現在 8人参加中

### [RPG Maker Horror Game Jam #15: Machine of Doom](https://itch.io/jam/rpg-maker-horror-game-jam-15)
<img width="300" height="229" alt="RPG Maker Horror Game Jam #15: Machine of Doom" src="https://img.itch.zone/aW1nLzE4OTEwMTg2LnBuZw==/original/ubrVt6.png" />

2026年03月20日
Online
[](https://www.google.co.jp/maps?q=,)
2025年06月23日 10:05現在 16人参加中
GoogleMapにハザードマップを重ねる

## やりたいこと
- 家や土地探しの際にハザードマップを見ることがあるが普段見慣れない地形図なので見づらいのを何とかしたい。
- GoolgeMap上にハザードマップを重ねて見れるようにしたい。


## TL;DR
こちらをどうぞ。
https://github.com/kkkensuke/home_hazard_map
電波法を説明します②[特定小電力]①

今回は特定小電力、通称「特小」です。

特小の特徴
特小は電波法で認証が必要な無線装置ですが、皆が無線の免許は持ってません。そのため、免許を持たない人向けに出力を制限し、メーカーや代理店が事前に認証作業を済ませた機器です。つまり、誰が使ってもよいように担保された無線機です。例えば、高出力のトランシーバを買うと登録することが求められますが、特小なら買ってすぐに使えます。追々、電波法の取得についても説明します。

特小は便利
この先は、ちょっと専門的な話となります。
電波法の制約としていくつかありますが、一般の人にとって考慮すべきこととしては誰でも使えるだけでなく、通信距離や場所や時間などがあります。
カタログに書かれている通信距離は送信機の出力と受信機の感度との差と使い方や実際のパケットサイズなどで決まりますが、それはノイズや他の無線装置の影響を受けない場合です。特小では製品カテゴリにより送信出力が微妙に変わりますが、最大出力は10～20mWが一般的です。但し、落とし穴があり、2.4GHz帯の無線装置では３mW/MHzや10mW/MHzとなっています。この、「/MHz」が曲者です。これについても後日記載します。例えば、10mWの製品の近くに100mWの製品があったら10mWの製品はどうなりますか?答えは簡単で、10mWの製品は使えないか、使えても使いずらい状態です。つまり、送信出力が低いため、誰が使っても良い製品なのです。例えとして、だれでも乗れる自転車は道の端を走りますが、免許が必要な自動車は道の真ん中を走れるだけでなく高速道路も使えます。つまり、この例の自転車が特小と考えればわかりやすいと思います。
場所も電波にとっては厄介な存在ですが、特小はその制約がないか、あっても緩和されています。
例えば、免許が必要な無線装置は登録局として総務省に届け出が必要です。つまり、使う場所を事前に告知しなければなりません。これは、同じような無線機が多数存在したらお互いを潰しあってしまいますね。その場合、双方がわかるので互いに不利にならないように調整することができます。ただし、存在を告知する以上、勝手に移動して使うことはできません。特小なら一部規制がありますが、届け出が不要で原則どこでも使えます。この「どこでも」という言葉が非常に便利なのです。ある案件で宇宙の無線通信について相談を受けた際、「宇宙ってどこから?」と疑問になりました。わからなかったので総務省に問い合わせてみました。法律上、電波法では宇宙の定義はない、との見解で悪い言い方をすれば日本の領土の上は全て日本の電波法の範囲となってしまいます。ただ、わかると思うのですが、電波はそんな長距離まで飛びません。そのためせいぜい100kmまでとのことでしたが、それでも100kmの高さまで電波を届かせる特小は、私が知っている範囲ではないと思います。また、陸上、地上、空中、もちろん水中や地中で使うことができます。水中や地中は電波が吸収されほとんど伝わらないので問題とはなりにくいですが、トンネルがありますので、そこはご愛敬。便利なのが空中で、ドローンでの温度や気圧などの測定やカメラを使った撮影や制御などで活用されています。但し、5GHz帯では気象レーダが使われているため、気象レーダと干渉させては生活に困りますので、DFS制御などで干渉を回避する必要がありますが、この記事では割愛します。
時間は2.4GHzを除けば制約がある場合ほとんどです。

文章が長くなったので、特小については複数回に分けて投稿するのでここまででとします。
Laravel12のVueスターターキットで新しい認証機能を使う

## ソーシャルアカウントのログインが簡単に導入できる
[リリースノート](https://readouble.com/laravel/12.x/ja/releases.html)
>各スターターキットへWorkOS AuthKitを活用した搭載バージョンを導入し、
>ソーシャル認証、パスキー、SSOサポートを提供します。
>WorkOSは、月間アクティブユーザー数100万人までのアプリケーションに無料で認証を提供しています。

### WorkOSとは
>WorkOSは、開発者向けのSaaSアプリにエンタープライズ機能を簡単に統合できるプラットフォームです。
>シングルサインオンやディレクトリ同期、監査ログなどの機能を提供します。

### WorkOS AuthKitとは
>WorkOS AuthKitは、WorkOSが提供する簡単な認証UIコンポーネントです。
>開発者がSSO(SAML/OIDC)やMagicLink（パスワードなしログイン）などの認証機能を、
>数行のコードでアプリに統合できます。

## プロジェクトの作成

### Laravelインストーラーの導入
```
composer global require laravel/installer
```
### 既にある場合はアップデート
```
composer global update laravel/installer
```

### プロジェクト作成
```
laravel new example-app
```
自分はアプリ名変えてますが気にしないでください

### Vue、WorkOSを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/0ca2b579-099a-42bd-ae19-3a69d3c3f353.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/514bcd32-1a36-4256-a2b1-cb0313a6e87f.png)
テストライブラリはどちらでもOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/8ca86f7f-e60e-4ae3-98e9-872a76a9fcb7.png)

実行後のこれもYes
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/4d8934d6-af49-40a9-adf6-1058f860f816.png)

## WorkOS AuthKitの利用
### WorkOSアカウントの作成
[WorkOS公式](https://workos.com)のSignUpからアカウントを作成

ログイン後、ダッシュボード画面からSSOのセットアップをします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/774a325e-2947-4806-907c-a994fbe56b47.png)

ここはデフォルトでContinueしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/2abdaaea-9794-4dc8-a7c9-0ed129109178.png)

ステップ２のWORKOS_CLIENT_IDとWORKOS_API_KEYを.envにコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/4eeebb22-c07d-4591-9b46-11a0d697f37a.png)

.envには項目が用意されてるので貼り付ける
```text:.env
WORKOS_CLIENT_ID=
WORKOS_API_KEY=
WORKOS_REDIRECT_URL="http://localhost:8000/authenticate"
```

ステップ3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/dfd2eb8b-4f60-4347-9e57-ab1a551fef84.png)

セットアップの完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/35004996-0b32-443c-b184-fb34a908877a.png)

## 画面
### サーバー起動
```
composer run dev
```
このコマンド１つでOK

### localhost:8000にアクセスしてログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/1530474e-c2ae-43aa-9044-2a0faa696190.png)

#### ソーシャルアカウントでのログイン画面が表示された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/4c11f7e6-3af1-484e-8c2e-bcb6edf8e9eb.png)

### Githubアカウントでログインできた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/2651d38b-529c-4e73-969e-663a76fb23ae.png)

#### 左下にログインユーザー情報があり、アカウント設定も可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/e7545f90-aefe-40ca-ae7e-f3b4268abec5.png)

#### データベースのUserテーブルにも登録されていました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/c94a3c85-ce80-4838-9457-81bcdc43ed08.png)

## まとめ
ソーシャルアカウントでのログイン機能が10分くらいで完成したのでビビりました
工数掛かる認証周りを簡単に実装できるのは便利ですね
【自分用メモ】Windows11+aのセットアップ

## Windowsのセットアップ
1. 起動したら音量を調整する
1. `国または地域`は**日本**を選択し、**はい**を選択
1. `キーボードレイアウト`は**Microsoft IME**を選択し、**はい**を選択
1. `2つめのキーボードレイアウト`は**スキップ**を選択
1. `ネットワークに接続`は自身が使うWi-Fiを選択し、パスワードを入力、接続完了後に**次へ**を選択
1. `ライセンス契約`は**同意**を選択
1. `デバイスに名前`は**今はスキップ**を選択(複数PCを使う場合は必要?)
1. `Microsoftアカウントを追加`は**作成**を選択(アカウントを持っていればログインして14へ)
1. `アカウントの作成`の下に**自身のgmailアドレス**を入力し、**次へ**を選択
1. `パスワードの作成`の下に**自身で考案したパスワード**を入力し、**次へ**を選択
1. `お名前の入力`の下に姓名を入力し、**次へ**を選択
1. `生年月日の指定`の`地域`は**日本**を選択し、`生年月日`は生年月日を入力し、**次へ**を選択
1. `セキュリティ情報の追加`は**電話番号の追加**を選択後、電話番号を入力し、**次へ**を選択
1. `指紋を使用`は**今はスキップ**を選択(読取精度が低いので)
1. `PINを作成します`は**PINの作成**を選択
1. `PINのセットアップ`は**起動後のログインに使用するパスワード**を入力し、**OK**を選択
1. `デバイスのプライバシー設定の選択`は**全部いいえ**を選択し、**次へ**を選択
1. `エクスペリエンスをカスタマイズ`は**スキップ**を選択
1. `OneDriveを使用`は**このPCにのみファイルを保存する**を選択
1. `PC Game Pass`は**今はしない**を選択

## Dellのセットアップ
1. `プリファレンス`は名前、メールアドレス、国または地域、電話番号を入力し、**次へ**を選択
1. `Dellのプライバシーポリシーとテレメトリー通知`にチェックを入れ、**次へ**を選択

## その他セットアップ
1. **Win + R**
1. **control folders**を入力し、**Enter**
1. 表示/ファイルおよびフォルダー/ファイルとフォルダーの表示の
**隠しファイル、隠しフォルダー、および隠しドライブを表示する**を選択
1. 表示/ファイルおよびフォルダーの**登録されている拡張子は表示しないのチェックを外す**
1. ブラウザから**Google日本語入力**をインストール

## ソフトウェアのセットアップ
### Windows標準アプリのセットアップ
Microsoft Storeで下記をインストール
* **Blender**(3Dモデリング)
* **Brave**(ブラウザ)
* **Discord**(ゲームSNS)
* **Game Bar**(Win + G)
* **Microsoft Outlook**(仕事用)
* **Microsoft Teams**(仕事用)
* **Notion**(仕事用)
* **Power Toys**(便利)
* **Slack**(Unity開発者ギルド)
* **Snipping Tool**(Win + Shift + S)
* **Xbox**(Win + G)
* **フォト**、**ペイント**、**メディアプレイヤー**、**メモ帳**

#### PowerToysの設定項目
* Always On Top(Win + Ctrl + Tでウィンドウを最前面へ固定)
* FancyZones(Win + Shift + @でレイアウトの細分化)
* マウスの検索(Ctrl + Ctrlでマウスポインターへ焦点を当てる)
* スクリーンルーラー(Win + Ctrl + Shift + Mで画面の部分的大きさを測る)

### ゲーム開発用ソフト
#### Unity
1. Unity Hubをインストール
1. Unity Hubを開き、歯車アイコンを選択し、Appearance/Languageを**日本語**
1. ライセンス/追加の**無料のPersonalライセンスを取得**を選択
1. 環境設定を閉じる
1. インストール/エディターをインストールの正式リリースかダウンロードアーカイブから**開発に使用するバージョン**を選択し、**インストール**を選択
1. 下記を選択し、**次へ**を選択
* Microsoft Visual Studio Community 20XX
* WebGL Build Support <- Unityroom用
* Windows Build Support(IL2CPP)
* Documentation
* 日本語

#### Visual Studio
Visual Studio Installerを開き、下記を選択し、**インストール**を選択
* ワークロード/C++によるデスクトップ開発
* ワークロード/Unityによるゲーム開発
* ワークロード/C++によるゲーム開発
* 個別のコンポーネント/画像と3Dモデルのエディター

仕事用
* ワークロード/ASP.NETとWeb開発
* ワークロード/Azureの開発
* ワークロード/.NETマルチプラットフォームアプリのUI開発
* ワークロード/.NET デスクトップ開発

#### その他
* Epic Games Launcher(Unreal Engine)
* Source Tree
* WinMerge
* Logicool G HUB
* Paint.NET
* wacom.start(Intuos Pro)

### ゲーム
* Minecraft
* Indentity V
* Steam
CloudWatch Logsのコストを90%削減した話

## 前提
- 先日、実務で運用しているRailsアプリケーションをEC2からECSへ移行しました
- 移行自体は比較的スムーズに完了したものの、CloudWatch Logsのコストが爆増し、めっちゃ焦る
- レアケースだとは思いますが、メモとして残します

## 急激なCloudWatch Logsコストの増加

具体的には記載できませんが、CloudWatch Logsの使用料金が想定を遥かに超えていました。Cost Explorerで調査すると、ほぼ全てが以下の操作によるものでした。

- PutLogEvents

[こちらの記事](https://bsblog.casareal.co.jp/archives/6418)を参考に、出力したログの配分を確認したところ、
Railsからの大量のログ（特に本番環境）がCloudWatchへ送信されていることが原因でした。

## 原因：本番のRailsのログレベルがDEBUGになっていた

おそらく先人たちが本番環境でログの詳細調査を行った際？、RailsのログレベルをDEBUGに変更したままとなっていた模様。
そのため、膨大なログがCloudWatchに記録されていました。（お恥ずかしい話、今回の件まで、ログレベルそのものについてあまり考えたことがなく、全く違和感に気づきませんでした...）
本番環境では、通常infoまたはそれ以上のレベルが推奨される（[Railsガイド](https://railsguides.jp/debugging_rails_applications.html#%E3%83%AD%E3%82%B0%E3%81%AE%E5%87%BA%E5%8A%9B%E3%83%AC%E3%83%99%E3%83%AB)より）ということも今回知りました。

## 対策：ログレベルをINFOへ変更

とりあえず、ログレベルを本来のINFOに修正してみました。

`config/environments/production.rb`
```diff_ruby
- config.log_level = :debug
+ config.log_level = :info
```

## 効果：CloudWatch Logsコストが90%削減

設定変更後の翌日、Billingダッシュボードを確認したところ、CloudWatch Logsのコストが劇的に低下しました。
結果として、約90%**のコスト削減に成功しました。

## 教訓
- ECS移行時や運用変更時は、環境設定を必ず再確認するべきでした
- 不要な詳細ログをCloudWatchに送信すると、予期せぬコストが発生します
- 本番環境のログレベルはinfo以上を推奨
- 同じような問題に遭遇した際は、ぜひログレベル設定を確認してみてください
process.stdout.write() vs repeat() 最適解はどっち？

Paizaの問題「`N`個の `*` を並べる」で `process.stdout.write()` を使ったら、まさかの非効率…。`repeat()` を知っていれば一瞬だった ので、メモしておく。

## 問題概要

入力された整数 `N` に対して、`N` 個の `*` を横一列に出力する。例えば `N=5` ならこうなる。
```
*****
```
## <br><br>💥 初めの実装（`for` ループ + `process.stdout.write()`)
```js
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on('line', (input) => {
    const N = Number(input);
    for (let count = 0; count < N; count++) {
        process.stdout.write("*");
    }
    rl.close();
});
```
😢 何が問題？
- I/O負荷が高い → `process.stdout.write()` を毎回呼ぶため、パフォーマンスが悪い
    ループが冗長 → `*` を `N` 回出力するだけなのに、明らかに大げさ

## <br>✨ `repeat()` を使えば一発！
```js
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on('line', (input) => {
    console.log('*'.repeat(Number(input)));
    rl.close();
});
```

### <br><br> ✅ `repeat()` が最適な理由
- シンプルで読みやすい → `'*'.repeat(N) `だけで `N` 個の `*` を生成
- パフォーマンスが良い → 文字列を一括生成するため、無駄なループが不要
- I/Oコストが低い → `console.log()` 1回だけで済む


## 📝 まとめ
もし `repeat()` を知らなかったら、ずっと無駄な `for` ループを書いていたかも…。
「短いコード ＝ 速いコード」じゃないかもだけど、無駄を省けるなら省こう！

<br>最近は復習のような感じで標準出力の基礎問題を解いている。初めて解いたときなら、`process.stdout.write`で改行せずに出力できるんだ、と学んだだけで満足していたけど、少しレベルアップした今なら、もっとシンプルなコードをかけないかな？ と試行錯誤する余裕が生まれた。今後も頑張っていきたい(^^ゞ

[👉 僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/03/20/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc-process-stdout-write-vs-repeat-%e6%9c%80%e9%81%a9%e8%a7%a3%e3%81%af%e3%81%a9%e3%81%a3%e3%81%a1%ef%bc%9f/)
【読書感想文】頭がいい人の思考術　日本一やさしいロジカルシンキング


## 一言で
ロジカルシンキングとは、「あらゆる要素から検討した上で、ベストな策を考える方法」であり、あらゆる要素の出し方、ベストな策を考える方法を本誌では学んだ。

## 読む前
* どうなれば、論理的なのかわからなかった。
* どうすれば、論理的に考えられるかを知りたかった。

## 学んだこと
* 論理的思考とは「あらゆる要素から検討した上で、ベストな策を考える方法」であることを学んだ。
  * あらゆる要素を出すには、MECEに則ったロジックツリーで要素を洗い出す
  * ベストな策を考えるには、問題を絞り課題を特定し、解決策を見つける

* MECEの切り口は４つ
  - 対象の要素：カラーかモノクロか
  - 算数の式：客数×客単価×購入頻度
  - 時系列：カゴに入れる→レジに向かう→レジを打つ→袋に入れる...のようなフロー
  - 尺度分解：10歳未満、10歳～19歳、20歳～29歳、30歳以上　みたいな

* 上手に階層をそろえたロジックツリーを作るための３パターン
  - **Whatツリー（要素分解ツリー）**：なにでそろえる
  - **Whyツリー（原因追及ツリー）**：なぜでそろえる
  - **Howツリー（イシューツリー）**：どのようにでそろえる

## Todo
* 会社や、日常において、何かを検討する場合には、ロジックツリーを思い浮かべて対処することを考える癖をつける。（打ち合わせの場から、デートのランチ場所を決めるときなど。。）
* ロジカルシンキングのやり方はわかったが、同時に解決思考も身に着ける必要があると感じた。今後、その知識も得とくしたい。
* 本誌でビジネスフレームが一部紹介されていた。これらを知っておくことで、実践の場ではより時間を短縮してKSF(Key Success Factor)を導けると思うので、こちらも学んでいきたい。

## 所感（気づき）
論理的思考（ロジカルシンキング）という言葉は良く耳にするが、その実態がわからず、いつか知りたいな―と思っていたが、ようやく学んだ。
読んでみると、これまでのランダムで再現性のない思考のうちの一部のやり方について、再現性を持たせて考えられるようにしたものであることに気が付いた。

こういった思考法を知ることは逆にこれまでのランダムで再現性のない思考はできなくなるということである。
ただし、ランダムな思考も他の名称化されている思考法を組み合わせたものだとも思う。
それを知るためにも、他の思考法も学ぶのも面白いと思った。

そうして、モノを考えるときに「ロジカルシンキング的には...クリティカルシンキング的には...」というように多方面の考えを行えるような人に私はなりたい。（宮澤賢治並感）
【p5.js】自分で作ったクリスマス風アニメーションの解説

　今回は、自ら書いた下記リンクのクリスマス風アニメーションについて、解説を加えていく。デモンストレーションについては既に行ってはいたが、具体的に何を行っているのか、そして改善するべきところも一緒に記述しておく。

 <https://editor.p5js.org/wohler60/sketches/19I924sx_>

　加えて、これを作るにあたって参考にしたサイトも以下に掲載する。

 https://qiita.com/guestSeven/items/690ad5d67df0876ea66c

 https://p5js.org/reference/p5/ellipse/

 ## 円運動のアニメーション用の関数
 　該当する部分は、この関数である。
```js
 function circleCoords(angleC, diffAngleC, radiusC) {
   let x = cos(angleC + diffAngleC) * radiusC;
   let y = sin(angleC + diffAngleC) * (radiusC / 3);
   
   return { x: x, y: y };
 }
```

　`angleC`というのは、一定時間で動いた角度であり、これによって各速度の表現を行っているのである。
　`diffAngleC`というのは、最初にスタートする角度を示している。これによって、最初に円運動をするときに、2つの点の位置をずらすことができる。
　`radiusC`というのは、半径のことを表現しており、今回の場合、`y`が`radiusC / 3`となっているので、**楕円形**となっている。(円錐のようなクリスマスツリーを表現するために必要)

 ## 最終的な描画部分アニメーションのコード
 　描画部分については、以下のようになっており、``treeY1``が到達したy座標ごとに、アニメーションの条件を指定している。

 ```js
 function draw() {
   background(70, 9);
 
   let coords1 = circleCoords(angle, 0, radius);
   x1 = coords1.x;
   y1 = coords1.y;
   
   treeX1 = 200 + x1;
   treeY1 = 250 + y1 + upperY;
   
   let coords2 = circleCoords(angle, PI, radius);
   x2 = coords2.x;
   y2 = coords2.y;
   
   treeX2 = 200 + x2;
   treeY2 = 250 + y2 + upperY;

   if (drawFlag) {
   fill("#006622")
   ellipse(treeX1, treeY1, 10, 10);
   
   fill("#cc0000")
   ellipse(treeX2, treeY2, 10, 10);
   };
 
   angle += speed;
   upperY -= diffY;
   
   if (radius > 6) {
     radius -= diffRadius;
   }
   
   if (treeY1 < 70) {
     drawFlag = false;
   }
   
   if (treeY1 < 50) {
    fill("#c99c33");
    ellipse(200, 60, 35, 35);
   }
   
   if (treeY1 < 45) {
     for (i=0; i<5; i++) {
       let snowRadius = random(3, 7);
       let snowCoords = drawSnow(0, 0, width, height * 2 / 3);
       
       fill("snow");
       ellipse(snowCoords.x, snowCoords.y, snowRadius, snowRadius);
     }
   }
   
   if (treeY1 < 40) {
    textAlign(CENTER);
    fill("#a6aaae");
    textSize(20);
    text("Merry X'mas!!", 200, 350);
   }

   if (treeY1 < 30) {
     noLoop();
   }
 }
 ```

 簡単に説明すると、以下のような構成になっている。
 1. `coords1`、　`coords2`によって表現された2つの点を用意して、今回アニメーションに直接用いる(treeX1, treeY1)と(treeX2, treeY2)を用意する
 2. drawFlagによって点に色をつける
 3. クリスマスツリーを表現するため、点の位置するy座標と楕円上の角度を変化させる
 4. `radius`が6より大きい場合は`diffRadius`分だけ変化させる
 5. `treeY1`の位置によって、2つの点の色の描写中止、そして黄色の球を出すアニメーション、雪の描写のアニメーション、メッセージを出力する
 6. `treeY1`の位置で`noLoop();`が出力されたとき、アニメーションが停止する

 ## 改善点(終わりに)
 　今回は独自に作成をしたので、あまり変数名などに気を使わずに作ってしまっていたのと、「とある地点でこのアニメーションを出す」といった考えがあったので、youTubeなどでいう「シークバー」のような役割を果たす変数を定義しておき、それを基準にするとアニメーションとしてどのようなことをしている・したいのかの意図がわかりやすくなるかもしれない。
「エンジニアリングマネージャーの仕事」を読んで　その6

## はじめに
James Stanier著「エンジニアリングマネージャーの仕事」を読んで私が印象に残ったことをメモがわりに、少しずつアウトプットします。
今度こそラスト！

https://www.oreilly.co.jp/books/9784873119946/

## 12章 情報の証券取引所
- マネージャーには色んな情報が集まる
- スパイになってはいけない、スパイに加担してもいけない
- マネージャーとしてゲートキーパーの役割をつとめる
- すべての情報を扱うときにしたがうべき２つのルール「ヒポクラテスの誓い」「ゴールデンルール」
- センシティブな情報は「完全機密」「密閉箱」「開放箱」にカテゴライズして管理
- 心がけるべきは、必要十分の共有
- チームを適切な情報のループに入れておく
- 「反対とコミット」
- 社内政治、納得する部分もあるが、オープンな場に促していくのがあるべき姿ではと感じる
- 階層を飛ばしちゃだめ、人間だもの

## 13章 コントロールを手放す
- 私が最も苦手とするところかもな・・・
- ストア派：未来を心配するのではなく今をよくすることに集中
- 私たちがコントロールできるもの、全くコントロールできないもの、ある程度コントロールできるもの
    - 7つの習慣の関心の輪と影響の輪に似てるな
- マネージャーにとっては、ある程度コントロールできるものが重要
- 外部ゴールと内部ゴール、内部ゴールは今置かれてる環境で現時点のベストを尽くすためのもの
- メッセージの全てに返信し、ミーティングに参加し、タスクにつぐタスクを片付ける→偽りの生産性
- 脳のLモードとRモード
- ひらめきやイノベーションはRモード、線形のLモードを止めないと発揮されない→何もしない時間枠
- 誰かをすぐに助けられるようにキャパをあけておく
- 通知をチェックするのをやめる　★ほんと大事
- 睡眠を8時間は取ろう

## 14章 良いハウスキーピング
- あなたが家をきれいにしておけば、ご近所さんもそうなる
- コンウェイの法則
- 似たスキルセットや興味を持つ人の集まり＝ギルド
- トーク文化の奨励、LTの場づくり
- アーキテクチャ決定記録
- 説明責任とそのための権限を示すDRI

## 15章 デュアルラダー
- インディビジュアルコントリビューター（IC）トラックとマネジメントトラック
- ICは専門知識と影響力で価値を発揮する
- マネージャーのアウトプット＝あなたのチームのアウトプット＋あなたが影響を与えた他のチームのアウトプット
- キャリアアップフレームワークを作ろう
    - 列が役割、行がコンピテンシー
- フレームワークに完璧はない
- キャリアアップフレームワークは「主観的」なものである

## 16章 現代の職場環境
- 性別・人種などダイバーシティ、同質的なチームよりもパフォーマンス高い
- テック業界は意外とアメリカでも女性比率低い30%未満
- 日本のテック業界はだいぶまともな気がする
- 自分に偏見があるのを忘れない
- 正しくないふるまいには声を上げる
- リモートワーク、分散チーム
- テキスト＆非同期がコミュニケーションの基本となるため、相互信頼と当事者意識が必須
- そのためのチーム目標
- 衝突の解消や答えの出ない問題についてはフェイスタイムが欠かせない
- 重要でないことにはノーと言うことで集中力と効率を保つ
- 自分の言葉と自分自身の行動を一致させる
- 自身のチーム文化は、本書のアドバイスに従って、あなたがあなたでいることで作られる

## 17章 スタートアップ
- スタートアップにおけるマネジメントの役割
- 人の管理よりプロセス・採用・コミュニケーション・デリバリーのマネジメント、一般的にはVPoEと呼ぶ

## 18章 クリスタルボール
- 「生きがい」は長寿の地域沖縄が発祥　ほんと？？
- 直近1年の計画と長期ビジョンを常に考慮しておく
- ビジョンを描くために過去10年を振り返る
- ビジョンステートメント→プランステートメント→コンピテンシー評価→スキルバックログ
- 部下に対して同様のコーチング

## さいごに
ようやく読み終わったーーー
まとまった時間を取れず、ちょこちょこ読み進めたため、序盤の章はほとんど記憶にない。
そういう意味では、このアウトプットが後々役立ちそう。役立ってくれるといいな。役立てよう。

書籍全体を通して、目新しい発見のようなものはあまりなかったが、
エンジニアリング組織をマネジメントしていく上で本質的なことが網羅されていて、自分が出来ていないことの戒めや、意識していることの再確認など、読む価値はあったと思う。
そして初心忘れず謙虚なマネージャーであるために、今後も定期的に振り返った方がよさそう。

これからマネジメントに関わっていく人に対しては特にお勧め。
自社メンバーにも積極的に展開していこう。
Rspecでredirect_back()をテストする

## redirect_back()
* Rails のコントローラで使用されるメソッドで、元のページにリダイレクトさせるために使われる。

* redirect_back() を使った処理をテストするときは、`request.env["HTTP_REFERER"]` を設定して検証する。

### バージョン
Rails：5.2.6
Ruby：2.7.4
RSpec：5.1.2

### 実装例
```ruby:example_controller.rb
class ExampleController < ApplicationController
  def hoge
    # リファラが存在すればそのページにリダイレクト
    # 存在しなければ fallback_location で指定した URL（'example/bar'）にリダイレクト
    redirect_back(fallback_location: url_for(controller: 'example', action: 'bar'))
  end

  def foo
  end

  def bar
  end
end
```

```ruby:example_controller_spec.rb
require 'rails_helper'

RSpec.describe ExampleController, type: :controller do
  # url_for() を使うため、 Rails のルーティングヘルパーを include する
  include Rails.application.routes.url_helpers

  # リダイレクト先の URL を指定
  #「only_path: true」はホスト部分を除いてパスのみを指定するオプション
  let(:redirect_url) { url_for(controller: 'example', action: 'foo', only_path: true) }
  let(:fallback_url) { url_for(controller: 'example', action: 'bar', only_path: true) }

  describe "#hoge" do
    context "リファラが設定されていない場合" do
      before do
        # request.env["HTTP_REFERER"] に nil を設定し、
        # リファラ（前ページのURL）が存在しない状態にする
        request.env["HTTP_REFERER"] = nil
      end

      it "元のページにリダイレクトする" do
        # ExampleController の hoge アクションを呼び出すリクエストを送る
        get :hoge
        # レスポンスが `fallback_url` にリダイレクトされることを確認
        expect(response).to redirect_to(fallback_url)
      end
    end

    context "リファラが設定されている場合" do
      before do
        # リファラを設定。
        request.env["HTTP_REFERER"] = redirect_url
      end

      it "redirect_url にリダイレクトすること" do
        # hoge アクションを呼び出すリクエストを送る
        get :hoge
        # レスポンスが redirect_url にリダイレクトされることを確認
        expect(response).to redirect_to(redirect_url)
      end
    end
  end
end

```
Windowsでネットワークアダプターの情報を得る

# 1. はじめに
Windows で ipconfig の実行結果みたいな情報をCで書くとどうなのだろう、と思って調べました。自分用メモ。

GetAdaptersAddresses がまぁ便利な関数ですね。

# 2.コード
``` C++:sample.cpp
#include    <stdio.h>
#include    <locale.h>

#include    <winsock2.h>
#include    <ws2tcpip.h>
#include    <iphlpapi.h>

#pragma comment(lib, "iphlpapi.lib")

void print_ip_addresses(PIP_ADAPTER_ADDRESSES pAdapter) {
    PIP_ADAPTER_UNICAST_ADDRESS pUnicast = pAdapter->FirstUnicastAddress;
    while (pUnicast) {
        char ipAddress[INET6_ADDRSTRLEN] = { 0 };
        DWORD ipAddressLen = INET6_ADDRSTRLEN;

        if (pUnicast->Address.lpSockaddr->sa_family == AF_INET) {
            // IPv4アドレス
            struct sockaddr_in* sa_in = (struct sockaddr_in*)pUnicast->Address.lpSockaddr;
            inet_ntop(AF_INET, &(sa_in->sin_addr), ipAddress, ipAddressLen);
        }
        else if (pUnicast->Address.lpSockaddr->sa_family == AF_INET6) {
            // IPv6アドレス
            struct sockaddr_in6* sa_in6 = (struct sockaddr_in6*)pUnicast->Address.lpSockaddr;
            inet_ntop(AF_INET6, &(sa_in6->sin6_addr), ipAddress, ipAddressLen);
        }

        printf("IP Address: %s\n", ipAddress);
        pUnicast = pUnicast->Next;
    }
}

int main()
{
    setlocale(LC_ALL, "japanese");

    DWORD dwSize = 0;
    PIP_ADAPTER_ADDRESSES pAddresses = NULL, pAdapter = NULL;

    // 必要なバッファサイズを取得
    if (GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &dwSize) == ERROR_BUFFER_OVERFLOW) {
        pAddresses = (PIP_ADAPTER_ADDRESSES)malloc(dwSize);
    }
    if (pAddresses == NULL) {
        printf("メモリの確保に失敗しました。\n");
        return 1;
    }

    // アダプター情報を取得
    if (GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, pAddresses, &dwSize) == NO_ERROR) {
        pAdapter = pAddresses;
        while (pAdapter) {
            printf("Adapter Name: %ls\n", pAdapter->FriendlyName);
            printf("MAC Address: ");
            for (DWORD i = 0; i < pAdapter->PhysicalAddressLength; i++) {
                printf("%02X", pAdapter->PhysicalAddress[i]);
                if (i < pAdapter->PhysicalAddressLength - 1) printf("-");
            }
            printf("\n");
            print_ip_addresses(pAdapter); // IPアドレス出力
            printf("\n");
            pAdapter = pAdapter->Next;
        }
    }
    else {
        printf("アダプター情報の取得に失敗しました。\n");
    }

    // メモリ解放
    free(pAddresses);

    return 0;
}
```
Unity-ピンク色のMaterialをURPにUpgradeする超簡単な方法

# １．特定のものをURPにUpgradeしたい場合
1.Upgradeしたい(ピンク色になっている)Materialをすべて選択
2.Edit->Rendering->Materials->Convert Selected Built in Materials to URPを選択
3.確認が入るので、Proceedを選択
![スクリーンショット (140).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007510/3ab75a50-92fe-4f2b-a051-c3e550bfd3e8.png)
# ２．全部一気にURPにUpgradeしたい場合
Window->Rendering->Render Pipeline Converterからなんかするんだが忘れちゃった後でかくにんしｙ
PCI DSS on AWS(概要)

## 0 はじめに
本記事はPCI DSS4.0に、AWSプラットフォーム上のシステムが準拠する際の勘所や手法を整理する記事である。
多くの記事がPCI DSS 3.2.1からの差分の説明にとどまっているため、本記事では新規導入に焦点を当てる。
記事構成は全体像(本記事)と各要件(逐次公開ｙ)をまったりまとめていく予定だ。
なお、実際にPCI DSSを考慮する場合にはPCI DSSのドキュメントやAWSホワイト北オアーなどを参考にして欲しい。

## 1 PCI DSSとは
PCI DSS(Payment Card Industry Data Security Standard)とは、クレジットカードを取り扱うシステムにおける国際的なセキュリティ基準である。
かつてはカードブランド(VISAなど)が独自で定めていたセキュリティ基準がもともと存在していた。しかし、クレジットカード情報の流出問題や、インターネット決済の普及、複数のクレジットカードが利用可能な決済システムが標準となったことを受け、国際的カードブランド5社(American Express、Discover、JCB、MasterCard、VISA)によって、2004年12月に最初のバージョン(1.0)が定められた。
PCI DSSは不定期にバージョンアップされ、2025年3月現在では4.0.1が最新版である。
バージョン4.0では12の主要な要件に対してセキュリティ対策方針が記載されているため、それをシステム及び運用に落とし込む必要がある。
PCI DSSへの準拠が必要なシステムの範囲は広く、エンドユーザーがカードで決済する加盟店からカード発行会社(イシュア)までの範囲が含まれる。
下記は登場人物の関係図(イメージ)
![Qiita_PCI_DSS_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561522/7f9f386d-67ee-46e5-b48f-37ace8438e9d.png)


また、インターネット経由のオンライン決済に限らず、POSを利用したオフライン決済についても準拠の対象となることに気をつけたい。
準拠にあたっては、要件を満たしたシステムの構築〜運用だけではなく、下記に示すいずれか方法での審査を受ける必要がある。
・訪問審査+スキャン
・自己問診+スキャン
訪問審査:認定審査機関(QSA=Qualified Security Assessor)が事業者を訪問してシステムやドキュメントを確認する。
自己問診:自己評価アンケート(SAQ=Self-Assessment Questionnaire)に対して役員名でもって回答する。すべてYesであれは準拠。
スキャン:以下に記述
※訪問審査と自己問診は規模によっていずれかが求められる。

スキャンでは下記に示す6つの診断が必要となる。(詳細は各章にて説明)
・外部脆弱性診断
・外部ペネトレーションテスト
・内部脆弱性診断
・内部ペネトレーションテスト
・セグメンテーションの有効性チェック
・ワイヤレスチェック
認定ベンダによるスキャンが必須なASVスキャン(外部)と内製化も可能な内部スキャンが存在する。

## 2 基本方針
AWS上に構築するシステムについて、PCI DSSへの準拠には下記に注意を払う。
### 2.1 AWS機能の制限
AWSサービスについて、一部そのままではPCI DSSの要件を満たせない場合がある。その際には3つの方針がある。
1:MWや外部サービスを利用する
2:カスタムアプローチを採用する
3:スクラッチで作り込む

いずれも一長一短ではあるため、運用体制とも相談して決めるべきである。

### 2.2 運用負荷軽減
PCI DSSは定期的にスキャンや監査が必要となる。また、システムの準拠状態を維持するには、PCI DSSのバージョンの変更がなくとも、常にシステム情報の最新化や脆弱性対応が必要となる。
それ故に可能な限りAWSマネージドな管理サービスやサーバーレスを利用することで、AWSの責任範囲を広げ、対象システムの責任範囲を狭めることが重要となる。
この際に重要なのがAWS責任共有モデルだ。
責任共有モデルを理解して、サービスごとにどこの範囲を準拠させる必要があるかを意識する。
例えばEC2とFargateのいずれかを選択する場合、多少AWSからの請求が増えても、Fargateを利用した方がOSレベルでのPCI DSS準拠(ロギングなど)を責任範囲外にできる分、トータルコストを削ることができる。
(SIerとしてはお客様に請求できる運用費をAWSに取られることを意味するのだが。)

### 2.3 デフォルト設定はベスプラではない
AWSのデフォルト設定には、セキュリティ要件の低い設定がされている場合がある。後の要件でも扱うが、デフォルト設定から大きく変えることを考慮する。
例えばセキュリティグループのアウトバウンド全許可はNGである。

### 2.4 サードパーティの力を借りる
PCI DSSではWAF要件が追加されている。クレジットカードシステムはトランザクションの誤検知によるブロックの影響が極めて大きい一方で、PCI DSS 4.0からはWAFの運用も求められている。
AWS WAFの運用にはサードパーティのサービスを利用することも考慮する。
その他のサービスも場合によっては、外部サービスの利用を考慮するとよい。

## 3 注意点
PCI DSS 3.4から4.0に対する変更点は多くのWebページに掲載されているが、一からな説明は少ない。(本記事の執筆動機でもある。)
実際のドキュメントにて、確認することが極めて重要である。

クラウド利用は基本の12要件以外にも、考慮が必要なドキュメントがある。(PCI DSS付録)また、PCI SSC Cliud Guidanceなる参考資料も存在する。
準拠にあたってはこれら資料を読み込むことをおすすめする。

また、AWSのエンタープライズプランに加入している場合は、AWSアカウントチームを巻き込み、AWSの知見を借りることをおすすめする。AWS内部には準拠のための知見が豊富だと思われるためだ。これは外部ベンダーにシステム構築を発注している場合も同様で、PCI DSSのベスト／グッドプラクティスに準拠できない場合は特にそうである。
良いコード／悪いコードで学ぶ設計入門 第７章

# 第7章 コレクション ─ネストを解消する構造化技法─

本章では、配列・リスト・コレクションを扱う際の適切な設計や実装方法について解説する。  
特に、**「標準ライブラリの活用」「ネストを解消するテクニック」「低凝集を避ける設計」** に着目し、適切なコレクション処理の実装を目指す。

---

## 7.1 わざわざ自前でコレクション処理を実装してしまう

コレクションを扱う際、多くの開発者は `for` ループを使って処理を実装しがちだが、標準ライブラリに同様の機能が存在しないかを確認することが重要である。  
不必要な実装を避けることで、保守性を向上させ、バグのリスクを減らすことができる。

### ❗ 車輪の再発明を避ける
既存の技術や解決策があるにもかかわらず、新しく同じようなものを作成することを「**車輪の再発明**」と呼ぶ。  
特に、既存の実装よりも劣るものを作ることは「**四角い車輪の再発明**」とされ、避けるべきである。

> **NOTE**  
> 車輪の再発明とは、既に確立した技術や解決策があるのに、新たに同じようなものを作ること。  
> 四角い車輪の再発明とは、すでに存在するものよりも使い勝手の悪いものを作ること。  
> ただし、学習目的で再実装することは有意義である。

---

## 7.2 ループ処理中の条件分岐ネスト

コレクション内の特定の条件を満たす要素を処理する際、何も考えずに実装するとネストが深くなり、可読性が低下する。  
これを解消するためのテクニックとして、「**早期 continue / break を活用する**」ことが有効である。

### ✅ 早期 `continue` の活用
```php
foreach ($items as $item) {
    if ($item->isInvalid()) {
        continue; // 条件を満たさない場合はスキップ
    }
    $item->process();
}
```
**メリット**: `continue` を使うことで、対象外のデータをスキップし、処理の流れを明確にできる。

### ✅ 早期 `break` の活用
```php
foreach ($items as $item) {
    if ($item->isTarget()) {
        $item->process();
        break; // 条件を満たす最初の要素を処理したらループを抜ける
    }
}
```
**メリット**: `break` により、無駄なループを回避し、処理効率を向上させる。

---

## 7.3 低凝集なコレクション処理

コレクション処理は分散しがちで、低凝集（関係のないコードが混在する状態）になりやすい。  
これを防ぐために **First Class Collection** という設計パターンを採用するとよい。

### ✅ First Class Collection とは？
First Class Collection とは、**コレクションとその操作ロジックを1つのクラスにまとめる設計** である。  
これにより、凝集度が高まり、メンテナンス性が向上する。

### 🔹 First Class Collection の構成要素
1. **コレクション型インスタンス変数**
2. **不正な状態を防ぎ、正常に操作するメソッド**

### 🔹 実装例（PHP）
```php
class Orders
{
    private array $orders;

    public function __construct(array $orders)
    {
        $this->orders = $orders;
    }

    public function totalAmount(): int
    {
        return array_sum(array_map(fn($order) => $order->getPrice(), $this->orders));
    }
}
```
**メリット**:
- コレクションの操作ロジックを集約できる
- コレクションを外部に渡す際にデータの不整合を防げる

### 🔹 コレクションの外部公開時の注意点
外部にコレクションを渡す際は、要素が変更されないようにする。  
特に **PHPとJavaScriptでは挙動が異なる** ため、意識して実装する必要がある。

#### PHP の場合
```php
return $this->orders; // 配列はコピーされるため問題ない
```

#### JavaScript の場合
```javascript
getOrders() {
    return [...this.orders]; // 明示的にコピーを作成する
}
```
**注意点**: `return [...collection]` は要素数が多いとコストが高いため、大規模データの扱いには慎重になる必要がある。

---

## 7.4 所感

本章の内容は、これまでの章と比べて実践しやすいものが多く、日常のコーディングにすぐに活かせると感じた。  
特に、以下の点が重要だと考える。

- **標準ライブラリを活用する習慣をつける**  
  → `for` を書く前に、ライブラリに類似機能がないか確認する
- **ネストを減らすために「早期 continue / break」を意識する**  
  → 可読性を向上させる
- **First Class Collection を積極的に取り入れる**  
  → コレクション処理を分散させず、メンテナンス性を向上させる

---

## 7.5 まとめ

本章では、コレクションを適切に扱うための設計と実装のポイントを学んだ。  
特に重要なのは以下の3点である。

1. **標準ライブラリを活用し、不要な実装を避ける**
   - 既存の機能を使えば、バグのリスクが減り、メンテナンスコストも下がる
2. **ループ処理のネストを避ける**
   - `continue` / `break` を適切に活用し、可読性を向上させる
3. **First Class Collection を採用する**
   - コレクション操作を1つのクラスにまとめ、凝集度を高める

これらの原則を意識することで、よりシンプルで保守しやすいコードを書くことができる。  
今後の開発でも積極的に取り入れていきたい。
luajitでは固定シードなのにプロセスごとに別の値を返すことがある(lume.weightedchoice)

lume.weightedchoiceは`{値1 = 割合1, 値2 = 割合2, ..}`という引数を与えると、割合に応じた値を返す関数です。
引数の与え方がなんか変ですが、理解したので使っていました。

しかし、週末レイトレーシングをやって一フレームごとに出力してアニメーションを作ろうとしたら、ランダムで配置したボールの色や材質が変わってしまうという現象に遭遇しました。

![random_scene.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967780/6072dddf-fb5f-4130-9c96-c4d38ec02a86.png)
## 検証コード

luaはテーブルの順序を記憶しない仕様です。よってweightedchoice内で調べる順序も決まっていません。
このことが原因で起動するたびに別の値を出してしまいます。

```.lua
local lume = require 'lume'
math.randomseed(1)

t = {abc = 35, def = 30, ghi = 35}

for _=1,10 do
	print(lume.weightedchoice(t))
end
```

luajit、lua5.4の両方で起動のたびに違う並びになることが確認できます。

## 回避方法

配列を与えれば順序は決まっているので、以下のようにします。

```.lua
-- lume.weightedchoice({['A'] = 50, ['B'] = 30, ['C'] = 10})

rawget({'A', 'B', 'C'}, lume.weightedchoice({50, 30, 10}))
```

## 感想

全く同じコードが(固定シードにしたのに)別の動作をする現象を見たのははじめてでした。
一枚絵を生成している時は気づきませんでした。

![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967780/555f21ee-65a9-4979-9d66-2b707ba87028.gif)
C#でバーコードの種類と画像内の座標位置を取得する

バーコードを作成する際、私たちは通常、作成したバーコードを画像形式で指定されたフォルダパスに保存します。画像内のバーコード情報、例えばバーコードの種類、画像内のバーコード描画領域の 4 つの頂点座標位置などを読み取る必要がある場合、この記事に記載されている方法を参照することができます。

## .NET Barcode APIをインストールする
この記事では、[**Spire.Barcode for .NET**](https://www.e-iceblue.com/Introduce/barcode-for-net.html) ライブラリを使用する必要があります。これは、.NET アプリケーションで 1D および 2D バーコードを生成、読み取り、スキャンするために特別に設計された専門のバーコードライブラリです。
これをインストールする方法は 2 つあります。
* Visual Studio（VS）で、「Manage NuGet Packages」を通じて「Spire.Barcode」を検索してインストールします。
または、パッケージマネージャーコンソール（PM コンソール）を通じてインストールします。
> PM> Install-Package Spire.Barcode

* 公式サイトからパッケージをダウンロードし、ローカルパスにインストールした後、手動で Spire.Barcode.dll を VS プログラムに参照させます。

https://www.e-iceblue.com/Download/download-barcode-for-net.html

## C# でバーコードを読み取り、バーコードの位置を取得する
* バーコードの種類を取得するには、**`BarcodeInfo [].BarCodeReadType`** プロパティを使用することができます。
* バーコードの位置を取得するには、**`BarcodeInfo [].Vertexes`** プロパティを使用して、バーコード領域の 4 つの頂点の座標を取得することができます。

以下はサンプルC#コードです：
```csharp
using Spire.Barcode;
using Spire.Barcode.Settings;
using System.Drawing;

namespace GetBarcode
{
    class Program
    {
        static void Main(string[] args)
        {
            // バーコード画像を読み込む
            BarcodeInfo[] barcodeInfos = BarcodeScanner.ScanInfo("code.png");
            for (int i = 0; i < barcodeInfos.Length; i++)
            {
                // バーコードの種類を取得する
                BarCodeReadType barCodeReadType = barcodeInfos[i].BarCodeReadType;
                System.Console.WriteLine("Barcode Type is:" + barCodeReadType.ToString());

                // バーコード画像内の 4 つの頂点の座標を取得する
                Point[] vertexes = barcodeInfos[i].Vertexes;
                // 結果を出力する
                for (int j = 0; j < vertexes.Length; j++)
                {
                    System.Console.WriteLine(vertexes[j]);
                }
                System.Console.ReadKey();
            }
        }
    }
}
```
![ReadCode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/ab7333fb-5356-43f4-a087-7beb7cc6ae16.png)


使用中に何か問題に遭遇した場合、フォーラムを通じてぜひご相談ください：

https://www.e-iceblue.com/forum/spire-barcode-f13.html
Railsでweb開発をしよう！-２


こんにちは、韓国在住sanaです！

昨日に引き続きRudy on Railsに関する講義を紹介したいと思います。
JavaScriptを楽しく使いたい方、実務で役立つ概念を学びたい方必見です！:point_up:


最近、React（リアクト）やNode.js（ノード）の人気は年々高まり続けており、これらの技術を学んでおくことは、自分のキャリアを大きく向上させる助けになります。特に、Reactはフロントエンド開発に欠かせないライブラリとして、Node.jsはサーバーサイドの開発に欠かせない技術として、多くの企業で求められています。
これらを習得することで、Web開発者としての幅が広がり、フロントエンド、バックエンド、サーバー開発の全てに対応できるスキルを手に入れることが可能です！

さらに、ReactやNode.jsだけではなく、Railsを使ったWeb開発にも挑戦できるようになります。Railsは、効率的なWebアプリケーション開発をサポートするフレームワークで、特にバックエンド開発に強い武器を持っています。また、データベースの取り扱いについても学べることで、より堅実でスケーラブルなシステムを構築できるようになります。Railsを使えば、データベースとの連携が簡単にでき、素早く高品質なアプリケーションを開発できます！

これらの技術をマスターすると、Web開発者、サーバー開発者、フロントエンド開発者としてだけでなく、フルスタックエンジニアとしても活躍することができます。そして、データベースやRailsを使ったバックエンド開発も学べるので、プロジェクト全体の設計や開発に深く関与できるスキルを身につけることができますよ:smiley:

今回は、基礎編から始めて、ReactやNode.js、Railsを使ったサイト作成に必要な知識を身につけられる講義を用意しました。これらの講義はすべて無料で提供されており、気軽に学び始めることができます:sparkles:

初心者でも安心して取り組める内容から、実務で使えるテクニックまで幅広くカバーしています。ぜひ、あなたのペースで学びながら、次のステップに進んでみてください！

今日も一日ファイティン～!!


:star:Rudy on Railsおすすめ講義:star:

https://u.inf.run/4bI9gCq

https://u.inf.run/4bKADfg

https://u.inf.run/4kGPWtu

https://u.inf.run/4iC0CaO

https://u.inf.run/41CfU8F
N+1問題をincludesメソッドで対処する時、何が起きているのかもう少し噛み砕いてみる

<br>

:::note warn
学習中の初学者がこの記事を書いているため、間違えた知識を共有している可能性があります。
:::
# 発端
N+1問題をincludesメソッドを用いて対処するという方法がなぜN+1問題を解決するのか理解に少し戸惑ったのでもう少し細分化してまとめてみた。

# 前提
ユーザと投稿が1対多のリレーションになっていて

```
class Post < ApplicationRecord
  belongs_to :user
end
```
```
class User < ApplicationRecord
  has_many :posts
end
```

posts/index/html/erbで投稿一覧を表示するためにこういった処理をする。
```
@posts.each do |post|
  puts post.user.name
end
```

## N+1問題とは
N+1問題とは、SQLでデータベースからレコードを取得する際にN件のレコードに対してN回の実行（プラス 最初の1回を合わせてN+1回）を行なってしまうことで実行回数が膨らんでしまう問題である。

## N+1問題が発生するケース
まず全てのPostを取得（最初に**1回目のクエリ**）

```
SELECT * FROM posts;
```

取得したPostのuserを1つずつ取得する（**N個の投稿に対してN回のクエリ**）

```
SELECT * FROM users WHERE user_id = 1;
SELECT * FROM users WHERE user_id = 2;
SELECT * FROM users WHERE user_id = 3;
..(以下略)
```

このように「**一つの投稿の中のuser_idを見て、それに合致するuserのレコードを取得**」を全ての投稿で行ってしまう。　

ここで例を出します。

あなたが100人友達をパーティーに招待するとして、招待状を100人に送らないといけないとします。
あなたは1人1人の住所を参照して、家まで走って招待状を渡しに行きます。

「1人目に渡した」
「2人目に渡した」
「3人目に渡した」
...
「100人目に渡した」

この間、いちいち家を往復して100回届ける作業をします。

これがN+1問題のNの部分にあたります。

100人に対して100回届ける作業が発生しました。
（N件に対してN回の実行）

そこであなたは考えます。
もっと一括で楽にできる方法があるのではないかと。

そこで利用するのが郵便局です。
**100件の招待状を束ねて郵便局に持っていけば、郵便局が1回で送り届けてくれます！**
**うおお！！**

この場合の郵便局は「**なんかいい感じにまとめて1回で処理してくれる存在**」ぐらいの認識にします。
（~~実際は郵便局の配達員たちが届けていますので厳密には違いますがご愛嬌~~）


## N+1問題に対する対処(includesメソッド)
この**一括で処理してくれる郵便局の役割を果たす**のが**includes**メソッドです。

```
@posts = Post.includes(:user)
```

以上のように取得すると、以下の順序でユーザーのレコードまでまとめて取得してくれます。


### 1. まず全てのpostを取得（1回目のクエリ）

ここまではN+1問題が発生するケースと同じです。
```
SELECT * FROM posts;
```

### 2. postに関連するユーザ情報をまとめて取得（2回目のクエリ！）

```
SELECT * FROM users WHERE users.id IN (1, 2, 3, ...);
```

これで**2回の実行**で全ての投稿とそれに関連するユーザーの情報を全て取得してきました。
IN句でuserのidを括っているので、1回で実行出来ています。
500件でも1000件でも結果的に合計2回の実行で取得してくれます。

## 結局includesって何をしてる？

「一括でまとめて実行してくれるのは分かったけど、**なんでそうなってるの？**」という納得の出来なさがあったので調べた結果、

includesメソッドを使うと以下の順序で処理が行われていることが分かりました。

```
@posts = Post.includes(:user)
```

1 - Post を取得したときに、**Rails が 「user_id が x, y, z, ... のuserのデータが必要」 だと自動で判断**する

（取得したpostのテーブルの中からuser_idの部分を見て「**これらの情報に関連する情報が必要なんだな...**」と判断してくれます。）



2 - N回の SELECT ではなく、**たった1回の IN 句を使ったクエリ**に切り替えて選択してくれる

（「**これらの情報を取るならIN句でまとめて取得しよう**」と判断してくれます。）

以上から、**うまいことまとめるべき部分を判断してくれて、IN句でうまいこと括ってくれるメソッド**ということが分かります。

「**通常だとIN句を使ってくれないが、includesだとIN句を使ってまとめてくれるという判断をしてくれる**」というのが本質的な部分だと思われます。

## 終わりに

今回はincludesの中身を細分化して順序よく知ると、N+1問題になぜ対処できるのかの理解が容易になったので共有しました。

もし間違った解釈をしている場合は、お叱りのコメントをいただければと思います。
EC2上のWordPress初期画面が謎のHPだった時の対処法

※これはあくまでも初学者向けに、Udemy動画教材などでWordPressインストール後に以下のような画面が出てこない場合の対処法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4035435/146ad3a5-39e6-4d14-a8b3-298b5afb23b9.png)


以下のようなHPが初期画面で出てきている方を対象としています。
![C1B25109-E89A-4ABE-90FC-60AB6BD796DB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4035435/07ef7121-1922-464b-9cd8-d689ead0d9f8.png)

それでは解決法なのですが、EC2に接続した上で、以下のコマンドを打ち込み、/var/www/html配下に移動します。
```
$ cd /var/www/html
```

次にwp-config.phpを削除します。

```
$ sudo rm wp-config.php
```

そしてもう一度ご自身で設定したURLもしくはパブリックIPアドレスにログインしてみてください。
おそらく解消されているはずです。