OmniAICreator/Qiita-1.07M huggingface dataset:
#8.Web三層構造について復習

# はじめに
最近、Railsを学ぶなかでPumaというサービスについて学びました。
PumaとはHTTPプロトコルに対応できるWebサービスとしての役割とRubyを実行することができる役割を持つサービスで、学習していく中でWebアプリケーションについて忘れているところがあるなぁと思ったので、今回は初心に戻ってWebアプリケーションの動作フローについて復習も兼ねて記事にしてみました。

# Web三層構造の動作フロー
基本的には以下の通りWebサーバー⇒アプリケーションサーバー⇒データベースサーバーという三層で構成されており、処理は以下の画像の通りになると思います。

※Pumaについて学んだのですがPumaのアイコンで良いのがなかったので画像には記載してないです。
　しかもPumaって発音がプーマではなくてピューマなんですね。

![image (57).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/1aeb3639-c6ce-64c9-72ca-236685febd17.png)


**➀HTTPプロトコルを使用してWebサーバへリクエストを送る。**

Webサーバーを使用しなくてもHTTPプロトコルをサポートしているアプリケーションに対しては
直接リクエストを送ることは可能だが、ポート番号の指定やセキュリティ面の危惧、その他にもWebサーバーを経由しないときよりも高負荷になるといったデメリットがあるので基本はWebサーバーを用いた三層構造を推奨。

**➁動的なデータのリクエスト処理を要求する。**
Webサーバー単体としては静的なデータ（決められた画像や文字）をレスポンスとして返すことは可能。
しかしクライアントのリクエストに応じて、リアルタイムでデータ生成や更新がされる動的なデータを返すことはできないのでAPPサーバーに処理を要求する。
Webサーバーがバックエンドのサーバーに処理を任せることをリバースプロキシともいう。

**➂データベースへ処理に必要なデータを要求**
APPサーバーでデータを処理する際、必要となるデータをデータベースから取得するように要求する。

**④データベースサーバーからAPPサーバーへデータを送信。**
データベースからAPPサーバーへデータを送信。

**⑤APPサーバーで処理を行う**
データベースから得たデータを基にAPPサーバーが処理を行う。
これにより➀でリクエストされたデータに対してのレスポンスデータ作成されるのでWebブラウザ上に表示させる。

**⑥レスポンスデータをWebブラウザに表示する**
⑤で作成したデータをWebブラウザに表示する。

といった感じですかね。

APPサーバー内のサービスの中でもHTTPプロトコルに対応していないphp-fpmやUnicornなどのHTTPプロトコルをサポートしているものがあり、HTTPプロトコルをサポートしているUnicornやPumaは最悪Webサーバーを経由しなくても通信は可能です。
※基本はWebサーバーを経由する設定を推奨

# まとめ

久しぶりにWebの3層構造について復習しました。

やはり動作フローなどを図として自分で整理するのはアウトプットとしてとても効果的だなと思いました。
こういう基本的な部分は資格勉強や本などで勉強することが多いのですが、
どうしても「あれ、これってどういうフローで動作してるんだっけ？」ってなることがあります。
こういった基本的な部分はしっかり頭に定着させておきたいですね。
Next.jsを簡単にAndroid化

## 前書き
Next.jsで作成したウェブアプリを、オフライン環境で利用したり、Androidアプリとして公開したいと思ったことはありませんか？筆者も同じ経験があります。
この記事では、「サクッと始めたい」方々向けに、簡潔で分かりやすい手順を解説します。細かい技術的な詳細については、必要に応じて調べてください。
# 本編
## 用意するもの
以下の環境がない人は事前に準備してください
- Next.js プロジェクト
筆者はデフォルトでやっています
- Android studio
必要なライブラリなどは準備のセクションで書きます

## インストール
capacitor(以降この記事ではcapと略します)をインストールします
capはNext.jsやvue.jsなどをAndroidやiOSアプリ化できます
iOSアプリ化にはMacが必要です
```:cmd
npm i @capacitor/core
npm i -D @capacitor/cli
```
capを初期化します
```:cmd
npx cap init
```
NameはAndroidアプリの名前になります
Package IDは[トップレベルドメイン].[会社名].[アプリ名]で決めます
トップレベルドメインは○○○.comみたいなcomの部分です
capacitor.config.tsファイルで設定内容は閲覧できます
その際、ついでに一行変更します
```ts:capacitor.config.ts
import type { CapacitorConfig } from "@capacitor/cli";

const config: CapacitorConfig = {
  appId: "com.example.app",
  appName: "test-android",
  webDir: "out", // publicからoutにする
};

export default config;

```
next.config.tsにoutput設定をします
```ts:next.config.ts
import type { NextConfig } from "next";

const nextConfig: NextConfig = {
  output: "export", // これを追加
};

export default nextConfig;
```
その次にビルドします
```:cmd
npm run build
```
反映させます
```:cmd
npx cap sync
```
アプリ化するプラットフォームを選びます
今回はAndroidのみなのでandroidをインストールします
```:cmd
npm install @capacitor/android
npx cap add android
```
Android Studioを起動させ、ビルドします
```:cmd
npx cap open android
```
ここまで行ったら普段通りbuildするだけで十分です
https://yowayowa-engineer.com/run-device-apk/
さんの記事でできると思います
![Screenshot_2024-12-21-16-29-53-608_com.example.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924611/c34aa55b-4d99-462d-7ef7-90fcc4b07fdf.jpeg)
最終的にはこんな感じになってます
## 終わり
終わり！
テスト118

```vb

Sub GetHTML()

Dim url As String
Dim http As Object
Dim html As String

url = "https://weather.yahoo.co.jp/weather/" ' 取得したいURLを入力
Set http = CreateObject("MSXML2.XMLHTTP")

http.Open "GET", url, False
http.send
html = http.responseText


With ThisWorkbook.Sheets("HTML")

    .Range("A1").Value = html
    
End With

End Sub

'Dim str As Strin
'str = driver.ExecuteScript("return  window.location.href;")


'SELECT *
'FROM Table_A
'WHERE NOT EXISTS (SELECT *
'                  FROM Table_A
'                  INNER JOIN  Table_B
'                  ON Table_A.Field_A = Table_B.Field_C
'                  AND Table_A.Field_C = Table_B.Field_F)

'表A{列A+列B}<>表B{列C+列D}
'表Aに存在して､表Bに存在しない表Aのデータを抽出するSQL文のサンプルを教えてください
'SELECT A.*
'FROM TableA A
'LEFT JOIN TableB B ON A.id = B.id
'WHERE B.id IS NULL;
AIで子供の歌を作ってみました

Suno AIで、子供への歌を作ってみました^ ^

![IMG_6607.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531581/edfd1159-08ae-7337-e87d-5196ab6283b8.jpeg)


子供への歌　童謡　かんちゃん連呼
と指示入れるだけ。3分で出来ました！
皆さんも作ってみてください^ ^

https://suno.com/song/cc079e38-9a4d-482f-a9de-152fb89db8ba

https://suno.com/song/eac81926-4391-434d-a845-b7c91d3651c8

 Suno AIはこちら

 https://aismiley.co.jp/ai_news/about-sunoai-how-to-explanation/
『入門 監視』第三章 メモ

# はじめに
[前回](https://qiita.com/posiposi/items/6572a45588ff612a087e)に引き続き第三章についても読了したのでメモしていきます。

# 項目まとめ
## 3-1 どうしたらアラートをよくできるか
アラートは二種類が存在する。
1. 緊急性の高いアラート
文中では、`誰かを叩き起こすためのアラート`と呼称
2. 参考としてのアラート
緊急性は高くないがアラートが来たことを誰かが確認する必要のあるアラート

### 3.1.2 手順書を書こう
大変示唆的な文章がありました。
```
アラートに対応する修復手順がコピーアンドペーストできるくらいにシンプルなコマンドなら、
手順書のあり方がおかしくなっている兆候です。
```
私の経験では手順書作成において、ついマイクロな部分まで言及してしまうことがありますが注意しておきたいですね…

### 3.1.4 アラートを削除し、チューニングしよう
```
うるさいアラートによって、人々は監視システムを信用しなくなり、さらにはすっかり無視してしまうようになります。
```
これも耳が痛くなる指摘ですね。
現職においても重要性は高くないけれど、頻度の多いアラートがあったりします。
上述の通り、「またか」という感じで各メンバーが他のアラートを見落とすという事態があったり…
```
アラートに鈍感になってしまうほどたくさんのアラートを受け取ると、アラート疲れを発症します。
長期間のアラート疲れを起こして、メンバーは燃え尽きてしまうでしょう。
```
結果的に疲労が重なり、離脱や離職につながると述べられています。
アラートのメリットを享受できず、それどころかデメリットとして顕在化してしまうということでしょうか。
これらを防ぐためにヒアリングや調査に基づいた、定期的なチューニングが重要そうです。

### 3.1.6 自動復旧を試そう
復旧作業が既知かつドキュメントに沿って行うだけなら、その部分については自動化を検討することが推奨されています。

一般的に分かりやすいのは __コードとして実装して監視システムにそれを実行させることです。__

これによって多くの部分で不要なアラートに困らず、エンジニアが本来行うべき必要のある、より重要な作業に集中できます。

もちろん __自動復旧できなかったトラブルについてはアラートを送ることが必須です！__

## 3.2 オンコール

### 3.2.1 誤報を修正する
100%正確な監視は不可能に近い、ただしそこを目指すことは重要です。

対応として下記が文中では挙げられています。
- オンコール担当が前日に送られたすべてのアラート一覧を作成する
- 上記一覧の各アラートをどのように改善できるか、アラートから削除できないかを検討する

### 3.2.2 無用の場当たり的対応を減らす
```
監視自体は何も修復してはくれません。
何かが壊れたら、あなたがそれを直す必要があります。
```
上記についても対応方法が述べられています。
- オンコール担当者は場当たり的対応をしていない時間に、システムの回復力や安定性向上の作業に取り組む
- オンコールで収集した情報に基づいて、次週スプリントの計画として改善事項を組み込む

### 3.4 振り返り
個人的には本章で最も印象に残った項です。
```
インシデントが発生した後は、インシデントに関する議論の場を常に設けるべきです。
何が問題で、なぜ派生して、再発防止のためにチームでどう対応していくのかを議論しましょう。
```
インシデント以外の事象に対してもそうですが、振り返りは必須であると述べられています。
また、チームの構築にも関連しそうな部分は下記。
```
振り返りにはよくない習慣があることに私は気づきました。
それは誰かを非難するという文化です。
※中略
インシデント発生後の対応が誰かを非難するものになるなら、内部に潜む本当の問題を改善することは
絶対にできません。
```
もはや一般的な言葉になった感じもありますが、`心理的安全性`を背景にした記述のように思えます。

似たような事例としては航空機事故の調査対応が挙げられますね。

なんでも航空機事故の事故調査結果を、民事訴訟の証拠として採用することは法律で禁じられているのだとか。(ソースを忘れてしまったので、絶対ではないかもですが…)

こうすることで心理的安全性を生み出し、事故当時の状況を再現できる証言を集めて、同一事故を繰り返さないように徹底しているようです。

アラートも危機対処という意味では同義に感じるので、見習っていきたいものです。

# おわりに
気になった箇所の要約になったので全項目を網羅する形にならず申し訳ありません。

とはいえ、現職で即座にやれることも多そうです。

私はインフラ側が専門ではないのですが、それでも協力できることはありそうです。

例えば、
- 不明点や気になった点を積極的に専門のメンバーに伝える
  - 100%アラートを目指す行動
- 他メンバーのインシデント対応に __感謝の意を伝えて心理的安全性を確保しつつ__、自分自身でも対応できるように知見共有を依頼する

このあたりはこれからも意識してやっていこうと思えた、大変参考になる素晴らしい章でした！

それではまた別の章のメモでお会いしましょう。

ここまでお読み頂きありがとうございました。
オブジェクト指向Cコンパイラ comelangでpiccolo_os v1.1が動きました

piccolo os v1.1が動きました。タイマー割り込みでタスクのスケジューリングもやっている
みたいです。一応cortex-mのCPUを勉強してPICCOLOの勉強もしました。
まあ、comelangはOSも作れるってことで。
しかし、Cコンパイラを作っていくと、Cが弱点を直すように改良されているのがわかります。
C11でだいぶ並列処理用の機能が入ってます。

"__c11_atomic_thread_fence"
"__c11_atomic_signal_fence"
"__c11_atomic_store"
"__c11_atomic_load"
"__c11_atomic_exchange"

あたりです。割と柔軟というか、実用的に細かく並列処理が可能だと思います。
マシーンに近いところでコード書く場合は使うと便利かもしれません。
使い方はAIに聞いてください。

comelangもgoのような並列処理を行いますが、こちらもサポートしてます。
チャネルよりこちらを使ったほうがいいかもしれません。

まあ、こんなのサポートして誰得？って感じはしますけど、僕は一応勉強のためにも実装しているので、特に意味は考えてません。
ポートフォリオ作成時メモ　part13 ~ ERR_EMPTY_RESPONSE問題解決の為にトライした8つの事 ~

## はじめに
こんにちは、未経験からエンジニア転職を目指しているものです。
オンラインスクールで本格的に学習して7ヶ月目に入りました。
PHP,Laravelを学習しポートフォリオを作成中です。
今回は、Postモデルに紐づいているMapInfoモデルのリレーションの問題を解決するためにトライした内容を整理しました。

## 概要
Laravel Sailを使った開発環境で、Google Maps APIを利用して地図を描画しました。
新規投稿作成画面に、地図情報が反映されるようになりましたが、
PostモデルとMapInfoモデルが紐づいた事で、以下の問題が発生しました。

- **投稿した内容が、投稿一覧に反映されず、ERR_EMPTY_RESPONSEが発生**

今回は、その問題を解決するためにトライした8つの事を紹介致します。

具体的にどのように解決したかは、下記を参照下さい。

https://qiita.com/pila-suzuki/items/0ed118a814ee09e69a6a

## トライ①: PostController.phpのindexメソッドを変更
- 実行内容: コントローラーの動作確認用に単純な文字列を返すreturn "Post Index is working."を設定
- 結果: 正常に表示された
- 考察: PostController自体に問題がないことを確認。この時点で問題 の範囲がビューかデータベースに絞られた

## トライ②: マイグレーションファイル、モデル、データベースが一致しているか確認
- 実行内容: マイグレーションとモデル構造の整合性を確認
- 結果: 一致しており問題なし
- 考察: モデルやマイグレーションに問題がないため、エラーの原因が他にあると確定

## トライ③: ルート設定の確認
- 実行内容: ルート設定とリクエストURLの確認
- 結果: 問題なし
- 考察: ルートの設定が正しいため、エラー原因はルート外にあると判明

## トライ④: ネットワークタブでの解析
- 実行内容: ブラウザのデベロッパーツールでリクエストとレスポンスを確認
- 結果: ステータスコード302やリクエストサイズ0 Bが確認された
- 結びつき: リダイレクトやタイムアウトが発生している可能性を示唆し、データベースやビューの問題を特定する必要性が浮上

## トライ⑤: ビューの最低限の内容でテスト
- 実行内容: 最小限のHTMLのみでindex.blade.phpを作成してテスト
- 結果: 表示されない
- 結びつき: ビューではなくデータ取得や関連付けの問題が原因と判明

## トライ⑥: Postモデルのfillableやguardedの確認
- 実行内容: モデルに渡されるデータが適切か確認
- 結果: 問題なし
- 結びつき: モデルの設定が原因ではないことを確認

## トライ⑦:データベースにデータが存在するがERR_EMPTY_RESPONSEが発生
- 実行内容: $mapInfo->activity_location ?? 'データなし'で関連データの確認。
- 結果: 一部関連データが存在せずエラーを引き起こしていると判明。
- 結びつき: データ関連付けが不完全である可能性を指摘。

## トライ⑧: ページネーションの影響を調査
- 実行内容: ページネーションを無効化してデータ取得。
- 結果: ページネーションに問題なし。
- 結びつき: ページネーション設定は問題ではないため、データ量の問題ではない事を推測


## まとめ
上記トライを実施したことで、原因がデータ関連付け辺りにある事が判明しました。
結果的に、問題の原因はEager Loadingと関連付けデータの不完全性にありました。
関連データの取得方法を状況に応じて調整することが重要だと実感しました。

最後まで、ご視聴頂きありがとうございます。
話題のDiscord掲示板Distopiaについて調査してみた

# 話題のDiscord掲示板Distopiaについて調査してみた

みなさんDiscord掲示板って普段利用してますか？私は全然使っていません

今回公開サーバーを作るにあたって色々なDiscord掲示板があるのを知りました。

その中でも最近リリースされたDistopiaという掲示板の存在を知りました。

インターネットにも記事が載ってないので今回は私がレビューしようと思います。

https://distopia.top/

## 運営理念

運営さんによると、この掲示板は規制を極端になくした掲示板らしいです。

組織的な犯罪やDistopiaの順位を上げるための不正スクリプト以外では基本削除されないらしいです。

私のサーバーは少し過激な一面があるのでここら辺は安心ですね。

## 独自仕様

Distopiaには独自仕様がいくつかあるようです。

その一つがアクティブレートです。

詳しい仕組みは非公開らしいですが、サーバーごとにVCやチャットのアクティブ度を独自に統計してサーバーのアクティブ度を数値として算出してるらしいです。

ランキングトップのサーバーは600万とかでおどろきました。

私のサーバーも上位になれるように頑張りたいです。

## プレゼント企画

定期的なプレゼント企画もやっているようです。

商品はNitroらしいです。

私も登録後に応募してみようと思います。

## 技術面

こういうサイトは大体Next.jsなどで出来ていると思っていたのですが、DistopiaはSvelteKitで出来ているらしいです。

そしてデータベースの管理はPrisma Clientを使っているらしいです。

もっと詳しい質問をしようとしたのですが、詳しいコードなどの話は流石に断られてしまいました。

Distopiaはアクティブレートなど秘密にしたい部分が多いのでOSSにはしないようです。

## 今後

Distopiaのサーバー登録数は私が調査した中だと少ないほうです。

しかしリリースして間もないサービスなのでここからDisboardなどと並ぶようなサービスになる可能性もあります。

私も今後に期待しようと思います。

よろしければ皆さんもDistopiaのサイトを一度覗いてみてください

https://distopia.top/
【Power Apps】アプリからWeb APIを呼び出す方法＆ユーザー定義型の活用

# Power AppsからWeb APIを呼び出す方法と応答の活用

Power AppsのアプリからWeb APIを呼び出す方法を2つ紹介します。
APIの応答はユーザー定義型を活用するととても便利なので、こちらについても紹介します。

この記事は [Microsoft Power Apps Advent Calendar 2024](https://qiita.com/advent-calendar/2024/powerapps) シリーズ1 12月20日 担当分の記事です。

## 画像を表示するAPI

### 猫画像API

https://sasami-axis.hatenablog.com/entry/2024/12/08/062149#%E7%8F%BE%E5%9C%A8%E6%99%82%E5%88%BB%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8BPower-Automate-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B

こちらの記事で知った面白APIです。

画像コントロールのImageプロパティに設定したり、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/16ccd834-072a-8dbc-a43c-eb0b7654d01b.png)

リッチテキストエディタやHTMLテキストに画像埋め込みしたりすることで画像表示が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/fbe685c1-5594-a177-6ecd-beb99fd582d4.png)

### QR code API

ギークさんが以前紹介していた[QR code API](https://goqr.me/api/)をアプリから実行する方法です。

https://www.youtube.com/watch?v=2WBVyQpMpuU

Power AutomateでOneDriveコネクタのURLからのファイルのアップロード＆パスによるファイルコンテンツの取得を用いてQRコード画像を取得しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/bdcf7dcf-0626-e3b8-b37d-77ea8261e979.png)

もちろん画像コントロールでもQRコードを表示できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/11a0f730-df37-de6a-e016-5c005069821b.png)

## オブジェクトを返すAPI

私の知る限りPower Apps単独ではオブジェクトを返すAPIは実行できなさそうなので(カスタムコネクタなど除く)、Power Automateを用いてAPIを呼び出します。

なおユーザー定義型という試験段階機能を利用しておりますので、利用の際にはご注意ください。

https://youseibubu.com/apps/user-defined-type1

### HTTP(有償)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/8f8dd36a-2b8e-2f3a-811d-6b9d34125549.png)

有償ライセンスが必要ですが、HTTPアクションを用いてGET要求を行うのが正攻法です。

[動画: APIの実行デモ]

フロー作成、Power Appsに取込後、以下のユーザー定義型をApp.Formulasに設定。

```
ZipCodeDef := Type({
    message: Text,
    results: [{
        address1: Text,
        address2: Text,
        address3: Text,
        kana1: Text,
        kana2: Text,
        kana3: Text,
        prefcode: Text,
        zipcode: Text
    }],
    status: Number
});
```

動作プロパティにこちらを設定することで郵便番号APIを実行することができます。

```
Set(_ZipCode, ParseJSON(郵便番号.Run("2520318").response, ZipCodeDef).results)
```

### OneDriveコネクタを利用(無償だがGETのみ)

前述のギークさんが紹介している方法でもGET要求のみAPIを実行することができます。
詳しくは以下の記事のシリーズをご覧ください。

https://powerplatformnikki.com/sakeapp2

### 元記事

https://powerplatformnikki.com/powerappswebapi/
【自習】AWS S3 ①

PMする上で必要になってきたのでおさらい

https://docs.aws.amazon.com/s3/?icmpid=docs_homepage_featuredsvcs

## AWS S3とは？
クラウド上のハードディスクみたいなもの。データの倉庫。  
画像、動画は容量が大きいから、EC2のサーバー内ではなく、S3に分けて保存して取り出したりする。
静的ファイルを置いておいたらそれを取り出して静的ページを表示できたりもするらしい。

## S3の主な特徴
1. **高い耐久性と可用性**  
   - データは複数のデータセンターに冗長化されて保存され、耐久性は99.999999999%（11 9's）。
   - 高可用性により、いつでもどこからでもデータにアクセス可能。

2. **スケーラブルなストレージ**  
   - 保存容量に制限がなく、大量のデータ（数ペタバイト以上）もスムーズに扱える。

3. **柔軟なアクセス管理**  
   - バケット（データの保存単位）ごとにアクセス権限を設定可能。
   - 公開/非公開の切り替えやユーザー単位での制御が可能。

4. **複数のストレージクラス**  
   - データの利用頻度や用途に応じてストレージクラスを選択可能。
     - **S3 Standard**: 頻繁にアクセスするデータ向け。
     - **S3 Intelligent-Tiering**: アクセス頻度に応じてコストを最適化。
     - **S3 Glacier**: アーカイブ用にコストを抑えたストレージ。

5. **REST APIとSDK対応**  
   - プログラムやツールを利用して、データの操作や管理が簡単に行える。

## 料金体系
**従量課金制**で、以下の要素に基づいて課金される。

#### **1. ストレージ料金**
保存するデータ量に応じて課金されます。
- **S3 Standard**: $0.023/GB（最初の50TBまで）
- **S3 Glacier**: $0.004/GB（最初の50TBまで）

#### **2. リクエスト料金**
データへのアクセスや操作（アップロード、ダウンロードなど）の回数に応じて課金。
- 例: GETリクエスト10,000回あたり $0.0004

#### **3. データ転送料金**
外部ネットワーク（インターネット）へのデータ送信は課金対象。
- 最初の1GB: 無料
- 以降: $0.09/GB


古いデータを自動で削除するライフサイクルポリシーを設定できるらしい。

## AWS S3のメリットと注意点

#### **メリット**
- **スケーラブルで柔軟**: 大量のデータを簡単に管理可能。
- **高耐久性とセキュリティ**: データ消失リスクが極めて低い。
- **料金が柔軟**: 必要な分だけ支払うため、コスト効率が良い。

#### **注意点**
- **料金が予測しづらい**: データ転送やリクエスト料金を含めると、予想以上のコストになる場合がある。
- **学習コスト**: 初心者にとっては設定や運用に慣れるまで時間がかかる。

## 感想
大量にリクエストされたら料金が跳ね上がってしまうのか。無限りダイレクトでリクエスト処理書いてしまったら大変なことになりそう。対策としてCloudFrontとかIAMとかCloudWatchとかも使っていくらしい。
LINEとGASで写メ日記投稿サイト構築メモ（途中）

LINEとGASとWPで写メ日記サイトを構築するメモ
※文章は途中です。構築は完了しました！

### イメージ
公式ラインに登録してもらう
　↓
独自フォーム作成し、ユーザー登録してもらう（フォームからWPユーザー登録）
　↓
管理者がWPのアプリケーションパスワード設定して、登録者へお知らせ
　↓
ユーザーが公式LINE→「日記」のメッセージ送信でID付GoogleフォームURL自動送信
　↓
リンクからGoogleフォーム起動し、日記投稿
　↓
WPへ投稿される

### メリット
・ユーザー登録が簡単（アプリケーションパスワードの設定は必要）
・WPを整えておけばGoogleフォームから投稿できる
・費用があまりかからない
・投稿のタイムラグが少ない（postieよりも即反映される）
・Googleフォームで色々と制限を設定できる（画像サイズや枚数、文字数等）

### 用意するもの
１）LINEデベロッパー
https://developers.line.biz/console/
プロバイダー作成して、Messaging APIチャンネル作成

２）公式LINEアカウント
https://account.line.biz/login
公式ライン作成し、Messaging APIを利用する

https://tech-lab.sios.jp/archives/33512
https://qiita.com/cog1t0/items/08fa37b7ef1f946e1024
↑このURLが最新でとても細かく説明しているので参考にする

３）スプレッドシート、Googleフォーム
スプレッドシート＋Googleフォームをリンクさせ、スプレッドシートに「ユーザー」シートを追加、
このシートで投稿ユーザーの管理を行う
GASはスプシに２つ＋ユーザー登録用HTML、こちらはデプロイしておく（Webhookで必要）
フォームの方に１つ（WP投稿用）…デプロイ不要だが、フォーム送信時のトリガー設定必要

４）ワードプレスサイト
今回、テーマはTCDが無料で配布しているGLUEを利用する
ここだけお金がかかる。（サーバー代とドメイン代…年１万円位）

５）LINEとGASとWPユーザー登録画面を連携させる
ユーザー登録画面、ユーザー存在チェック、ユーザー登録したけどアプリケーションパスワードが設定されているかチェックを　実装する

６）WP REST APIとGASを使ったWPへの投稿
仕組みはここを参考に構築
https://motoki-design.co.jp/wordpress/wordpress-rest-api/
画像投稿の仕組み、画像投稿後Googleドライブから削除する仕組みも作る

７）ワードプレスを装飾する
いいねボタン実装とか
テンプレートのカスタマイズ等


## １）、２）、３）は参考サイトを元に構築する

### LINEとGASとWPユーザー登録画面を連携させる
公式LINEから「日記」を入力
↓
ユーザー管理しているスプシに該当LINE IDがあるかチェック
無い場合、ユーザー登録フォームのURLを付けてメッセージを返す
ブラウザからルータにID・パスワードがあっているのにログイン出来ないときの対処

表題の事象ではまったので備忘録として

セキュリティの問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/de94f9ec-997b-d3b1-7332-a74a6a752312.png)

このサイトに対する権限で、必要な権限を開放する
adbでMetaQuestから動画キャプチャを取得する方法

adbでMetaQuestから動画キャプチャを取得する方法です。
わかっていれば迷うことがないので、メモがてら記事にしました。

# 前提
- Meta Horizon OS v72

# コマンド
1. 取得したいファイルの確認
    1. adb shell ls sdcard/Oculus/VideoShots
2. 取得
    1. adb pull sdcard/Oculus/VideoShots/com.oculus.vrshell-yyyyMMdd-HHmmss-0.mp4 ./
【Power Apps】SetFocus関数とは、使い方

**SetFocus関数**について概要を説明した後、活用例として郵便番号検索を行う方法を紹介します。

## 関数説明・構文(一部Learnより引用)

### SetFocus関数

> 入力フォーカスを特定のコントロールに移動します。

*[公式より引用](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-setfocus)*

```
SetFocus(コントロール)
```

## 使い方

動作プロパティで使用すると設定したコントロールにフォーカスするだけの関数です。

### 制限がなくなりました

https://x.com/PowerPlatform4/status/1764595834338050415?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1764595834338050415%7Ctwgr%5E4ebd2b3d5a00457adab11eaf98dba98c75e96b09%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Fpowerplatformnikki.com%2Fwp-admin%2Fpost.php%3Fpost%3D5237action%3Dedit

https://x.com/PowerPlatform4/status/1869026885147279824?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1869026885147279824%7Ctwgr%5E4a58f745bf3de93a544a8e1c2320ff1bda80e0c9%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Fpowerplatformnikki.com%2Fwp-admin%2Fpost.php%3Fpost%3D5237action%3Dedit

この記事の検証中に、これまで制限されていた編集フォームなどのフォーカスに対応していることに気が付きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/429efb9f-8920-3adc-8c6b-e46828433f7a.png)

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-setfocus#limitations

Learnは未更新ですが、編集フォーム、コンテナー内のコントロールにフォーカス可能であることを確認しました。モダンコントロールもフォーカス可能です。

これでかなりSetFocus関数が使いやすくなりましたね。

## 活用例

### 郵便番号検索

住所登録でよくある郵便番号の上三桁を入力すると、下三桁のテキストボックスにフォーカスするやつを実装してみます。

上三桁を入力するとSetFocusで下三桁にフォーカスするだけです。ちゃんと実装するならバリデーションチェックなど入れましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/50f8f9d2-c90f-1215-c5c3-b1c604d16a8c.png)

https://powerplatformnikki.com/validationcheck

ついでに[郵便番号検索API - zipcloud](https://zipcloud.ibsnet.co.jp/doc/api)を使用して住所の詳細を取得してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/8f130981-0cdc-60ab-f6cc-5354f5c288f6.png)

### アプリをキーボード操作

実はテトリスでSetFocus関数を使用していました。
キーボード操作を可能にすることで素早い画面入力を可能にしています。

https://powerplatformnikki.com/tetrapps/#toc7

### 元記事

https://powerplatformnikki.com/setfocus/
【TS】ConditionalTypeについて

### 基本
- 型のif文

```ts:
// Tの型がUの型に代入できれば、T型になる
// Tの型がUの型に代入できなければ、numberになる
type ConditionalType<T, U> = T extends U ? T : number;

// 文字リテラル型はstring型に代入できるので"apple"型になる
type TrueType = ConditionalType<"apple", string>;

// string型は文字リテラル型に代入できないのでstring型になる
type FalseType = ConditionalType<string, "apple">;


// 考え方はT型の変数がU型の変数に代入できるかどうか

let str: string = "";
let apple: "apple" = "apple";

str = apple;  // 代入OK（文字リテラル型はstring型に代入できる）
apple = str;  // 代入エラー（string型は文字リテラル型に代入できない）
```


### オブジェクト型で使う

#### 特定のプロパティを持っているかどうか
```ts
// nameプロパティを持つオブジェクトであればstring型、なければnumber型
type ConditionalType<T> = T extends { name: string } ? string : number;

// string型になる
type TrueType1 = ConditionalType<{ name: string }>;
type TrueType2 = ConditionalType<{ name: string; age: number }>;

// number型になる
type FalseType1 = ConditionalType<{ name: number }>;
type FalseType2 = ConditionalType<{ age: number; gender: string }>;
type FalseType3 = ConditionalType<string>;
```


#### 特定のプロパティをもっているかどうかを確認し、もっていればそのプロパティの型を返す
- `infer R`はanyのようなもの
- ↑の例ではstring型のnameプロパティをもっているかどうかをチェック
- `infer R`を使うことで、**型はによらずnameプロパティを持っているかどうかのみ**チェックできる


```ts
// nameプロパティをもっているかどうかをチェック
// もっていたらnameプロパティにセットされている型を返す
// もっていなければnumber型を返す
type ConditionalType<T> = T extends { name: infer R } ? R : number;


// type TrueType1 = string
type TrueType1 = ConditionalType<{ name: string }>;

// type TrueType2 = "KEN"
type TrueType2 = ConditionalType<{ name: "KEN"; age: number }>;

```


## Distributive Conditional Types 
- `T`にユニオン型が渡って来た時の Conditional Typesのこと
- 返す型はユニオン型をそれぞれチェックした結果

```ts
// Tがユニオン型かどうかなので、この部分は通常のConditional Typesと変わらない
type DistributiveConditionalTypes<T> = T extends "apple" ? boolean : number;

// type SampleType1 = number | boolean
type SampleType1 = DistributiveConditionalTypes<"apple" | "banana">;

// type SampleType2 = number
type SampleType2 = DistributiveConditionalTypes<"orange" | "banana">;

// type SampleType3 = number | boolean
type SampleType3 = DistributiveConditionalTypes<"apple" | "banana" | "orange">;
```
ラズパイ始めるならこれを買え！

# ラズパイ初心者向けガイド

ラズパイを始めるにあたって、どのモデルや周辺機器を選べば良いのか、
迷っている方に向けて、役立つ情報をまとめました！
困ってる方のお役に立てれば幸いです。

## 1. ラズパイのおすすめモデル

### **Raspberry Pi 4**
- **おすすめポイント**
  基本的に何でもできるモデルです
  ブラウジング、電子工作、プログラミング、メディアセンター、ネットワーク関連など、幅広い用途に対応しています
- **特長**
  - 高性能
  - 小型で省電力
  - 自宅サーバーやメディアセンターとしても活用可能
- **価格帯** 
  約5,000円〜（モデルや容量によって異なる）

### **Raspberry Pi 5**
- **おすすめポイント**
  より高性能なモデルが必要な場合に
  AI、マシンラーニング、高度なサーバー用途に適しています
- **特長**
  - M.2接続対応（SSD等の高速ストレージが使用可能）
  - Raspberry Pi 4より高速で強力なパフォーマンス
  - 高度なタスク処理やPC代替としても利用可能
- **価格帯**
  約8,000円〜

### **Raspberry Pi Zero 2 W**
- **おすすめポイント**
  コンパクトで省電力なラズパイ
  性能は低めですが、IoTや小型プロジェクト、電子工作に最適です
- **特長**
  - 小型で超低消費電力
  - Linuxの軽量ディストリビューションが動作可能
  - 価格が安く、入門者向け
- **価格帯**
  約2,000円〜

### **Raspberry Pi 400**
- **おすすめポイント**
  ラズパイとキーボードが一体化したPC型
  デスクトップPCやサブPCとして活用したい方に最適です
- **特長**
  - キーボードと一体化しており、すぐに使用可能
  - 安定したパフォーマンス
  - おしゃれで場所を取らない
- **価格帯**
  約8,000円〜

---

## 2. 必要な周辺機器

### **電子工作パーツセット**
- **おすすめポイント**
  ラズパイを使った電子工作を楽しむために便利です
  多彩なパーツとチュートリアルが揃っているので、初心者でも安心です
- **内容例**
  センサー、LED、モーター、ジャンパーワイヤー、ブレッドボード、など

### **ラズパイ専用カメラ**
- **おすすめポイント**
  ラズパイ専用のカメラモジュールは小型で、
  ペット監視カメラやDIYプロジェクトにぴったりです
- **特長**
  - USBカメラよりも小型で取り付けやすい

### **ケースとファン**
- **おすすめポイント**
  ラズパイは熱を持つので　特にPi4やPi5には冷却が必要です
  ケースは基板を保護する役割も果たします
  ヒートシンクを用意するとさらに冷却できます
- **おすすめケース**
  - 通気性が良く、ファン付きのもの

### **ストレージ（SDカード、SSD、HDD）**
- **おすすめポイント**  
  OSのインストールに必要なSDカードや、
  大きなデータ保存用のSSD/HDDを準備しましょう
  SDカードはClass 10以上推奨
- **おすすめサイズ**  
  - SDカードは16GB以上（32GBや64GBも選択肢）
  - ストレージとして、SSDやHDDも使用可能

### **マウスとキーボード**
- **おすすめポイント**  
  ラズパイをPCのように使いたい場合、マウスとキーボードが必要

---

## 3. おすすめショップ

### **スイッチサイエンス**
- **特徴**  
  エレクトロニクスパーツやラズパイ関連商品が豊富
  初心者向けセットやチュートリアルも充実しています
- **公式サイト**  
  [https://www.switch-science.com](https://www.switch-science.com)

### **KSY**
- **特徴**  
  ラズパイの公式代理店　高品質なハードウェアや新しいモデル、パーツが揃っています
  - **公式サイト**  
  [https://raspberry-pi.ksyic.com/](https://raspberry-pi.ksyic.com/)

### **秋月電子**
- **特徴**  
  電子工作を中心にしたパーツショップ
  ラズパイ関連アクセサリも豊富で、店舗でも購入可能です
- **公式サイト**  
  [https://akizukidenshi.com](https://akizukidenshi.com)

### **マルツ**
- **特徴**  
  店舗数が多く、実物を確認して購入できます　特に店舗で直に見て選びたい方に便利です
- **公式サイト**  
  [https://www.marutsu.co.jp/](https://www.marutsu.co.jp/)

---

## 4. まとめ

ラズパイを始めるには、まず自分の目的に合ったモデルを選ぶことが大切です。
初心者ならRaspberry Pi 4やZero 2 Wで、
より多機能なサーバー用途やAI用途を考えている場合は
Raspberry Pi 5を選んだ方が無難です。
周辺機器などとしては、
電子工作パーツセットやカメラ、冷却用ケースを準備すると、より楽しく遊べます。
購入する際には、上記のショップを参考にして、
気になるアイテムを手に入れて見ましょう！
プロダクト開発に「スタイルガイド」を取り入れてみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535909/2924c02f-dc7c-3906-7a02-44f02c4681af.png)

みなさん、こんにちは！
ポーラ・オルビスホールディングスのITプロダクト開発チームでプロダクトオーナーをしている志村です。

この記事では、UIUXデザインを勉強中の私が、UI検討フェーズで「スタイルガイド」を取り入れてみたら、プロジェクトにどのような効果をもたらしたか、についてご紹介します。

※本記事は [株式会社ポーラ・オルビスホールディングス Advent Calendar 2024](https://qiita.com/advent-calendar/2024/pohd) の22日目の記事です。ITプロダクト開発チーム以外の方々からも多くの記事が投稿されていますので、ぜひご覧いただけると嬉しいです！

# 導入に至った背景
当チームでは、プロダクトオーナーやエンジニアがそれぞれの担当領域でUIの検討を行っています。  明確なルールがない状態で各々が検討を進めていくうちに  、全体の統一感が欠けてしまいました。それを機に、デザインの手戻り修正や「これでいいのか？」と担当者の不安感が強まることが増えてきてしまっており  、このような課題を解決するために「なにかルールを作ろう、ガイドラインを作ろう！」という判断になりました。

# スタイルガイドとは
皆さんは「スタイルガイド」とは何かご存じでしょうか？
「スタイルガイド」とは、Webサイト制作やアプリ開発などにおいて、文字の色やフォントなどのあらゆるデザイン要素について、ルール（スタイル）を定義したものになります。
「デザインガイドライン」や「デザインシステム」のように置き換えられることもあるようですが、本記事ではスタイルを定義する部分的な「スタイルガイド」とします。

# スタイルガイドをどこに作るか
まず初めに「スタイルガイドをどこに作るか」を検討しました。
ググってみると、プロジェクトごとで様々でしたが、まずはチーム全体で共有しやすいFigma  上で作成しました。というのも、我々のチームではFigmaというブラウザベースのデザインツールでUIを設計しているため、同じデザインファイル内に作成することで、「リアルタイム性」と「一元管理」に長けていると思ったためです。今もなお、Figma内にありますが、大きな不満もないので、UIの検討に利用しているデザインツール内で作成したら良いと感じています。

# スタイルガイドで何を定義するか
次に「スタイルガイドで何を定義するか  」を検討しました。
曖昧で手戻り  が発生していた「共通して利用するスタイル」を最優先で定義し、検討を進める中で共通化できそうなスタイルは都度追加して定義しています。
「共通して利用するスタイル」には、カラー、ボタンデザイン、ラベルデザイン、ハイライトデザインの4つがあり、中でもカラーは、サービスロゴで用いるカラーコードと共通にすることが決まっていたので、早々にスタイルガイドで定義しました。
 

ボタンやラベル、ハイライトのデザインは一部表現を変えていますが、参考までに以下のように定義しました。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535909/ac62b944-eac7-3340-ba3a-1404a02f5901.png)

 

# スタイルガイドを使って感じたメリット
実際にスタイルガイドを作り、運用してみて感じたメリットをまとめてみました。

・一貫性の確保
以前に比べ、色やフォント、パーツのデザイン要素が統一されたことで一貫性が保たれていました。異なるメンバーがデザインを検討しても、サービス全体の統一性を出すことができています。

・効率化
UIを検討するメンバーは、スタイルガイドに基づいたテンプレートやコンポーネントを使用することで、ゼロからデザインを作成する必要がなくなっています。  これによりデザイン作成の時間が短縮されています。

・コミュニケーション向上
スタイルガイドはメンバー間の共通言語として機能してきています。「~に似た」「~に寄せた」のような表現から、デザインの意図や仕様が明確になり、コミュニケーションの齟齬が減少しました。

# スタイルガイドを使って感じたデメリット
せっかくなので、デメリットと感じた部分もまとめてみようと思います。

・維持管理の負担
一度作成したら終わり、ではないため、プロダクトの成長に合わせて更新し続けなければいけません。継続的なリソースが必要になり、特に大規模開発では大きな負担になることがあるかと思います。

とはいえ、プロジェクトを進める上で、ネックとなりうる「迷い」を吸収できるという点では、大変意味のある手引きかと感じています。

# 最後に
UI検討フェーズの途中でスタイルガイドを導入した結果、プロジェクトにどのような効果があったかを紹介しました。
スタイルガイドの導入により、デザインの一貫性が保たれ、効率化が進み、コミュニケーションが向上しました。一方で、維持管理の負担というデメリットもありますが、プロジェクトの「迷い」を減らすために非常に有効な手段であることがわかりました。
今後は定期的な見直しやフィードバックの収集を欠かさずに行い  、スタイルガイドの効果を最大限引き出し、プロジェクト全体の品質と効率をさらに向上させたいです。
webアプリ「太陽系散歩」 を作りました

# 自己紹介

今回初めて記事を投稿させていただきます、**「折る宇宙」技術部**です。

現在は拠点をnoteに置いており、主に天文に関する情報発信を行っております。
詳しい自己紹介は、こちらをご覧ください↓
https://note.com/fold_space/n/n0d0db441d9a7

こちらのQiitaは**土曜・不定期**での更新を予定していますが、**noteは毎週日曜朝に更新**しておりますので、noteもぜひご覧ください。

私の、天文以外の特技である、プログラミングに関する情報をこちらに投稿していく予定です。
今回は、私が現在開発しているアプリ「太陽系散歩」に関する記事になります。
# 「太陽系散歩」とは
簡単に言うと、惑星の軌道を縮小して、地図上に表示してくれるアプリです。

任意の場所・縮尺で表示できる「シミュレーションモード」と、
現在地から実際に「太陽系を散歩」できるゲームモードを展開しています。

もともと、天文台に惑星の距離感を実感できる散歩コース、のようなものがある(ところもある)のですが、
どこでも手軽に散歩できたら便利だよなぁと思い、今回開発を決意しました。
# 使い方
百聞は一見に如かず、ということで、実際に使ってみましょう。
お時間のある方は、ぜひ下のリンクをクリックしてみてください↓
https://oruuchu.github.io/PlaneWalk/

そうすると、黒いトップ画面が現れるかと思います。
上のボタンをクリックするとシミュレーションモード、
下2つのどちらか(それぞれ縮尺が異なります)を選ぶとゲームモードになります。![スクリーンショット 2024-11-19 192354.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916826/9b906955-e727-5934-9145-65821ec3e37b.png)

ここからは、モードごとで操作が異なります。
## シミュレーションモード
1. 地図上の太陽を置きたい地点をダブルクリック
2. 縮尺が何億分の一か入力(例:2億分の一にしたい場合→「2」と入力)
3. 惑星軌道が表示される
![スクリーンショット 2024-11-19 203531.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916826/20d26904-8b77-18e6-7968-842d2dc8bc14.png)
## ゲームモード
ゲームモードはいくつか注意点がありますので、必ずご確認ください。

1. 位置情報・通知を許可(ブラウザの設定を「すべて拒否」にしている方は設定画面をご確認ください)
2. 通知が来たことを確認　→移動を開始する
3. 一定距離歩くと通知　→マップが更新
惑星によってはクイズも出てきて、データ特典がgetできます。お楽しみに!
![ゲームモード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916826/76e40012-debd-9ace-d33c-50a2d92dd95f.jpeg)

:::note warn
※iOSをご利用の方は、PWAでのインストールが必要です。ブラウザ下部中央のボタン→アプリとしてインストール　を選択してください。
コチラを参考に↓
https://welcome.nostr-jp.org/tutorial/pwa-install.html
:::
:::note alert
webアプリという特性上、ページを開いている間しか通知が来ないという欠点があります。しかし、歩きスマホは絶対にしないでください。
画面ON状態でポケットに入れておき、
通知が来たら確認というのを強く推奨します。
:::

追記：ver2.1へのアップグレードが完了し、マップ上で惑星が公転するようになりました。ぜひ、惑星の公転速度を比べるのも楽しんでみてくださいね!

# 今後の展望
今後、
- AR技術を導入して、惑星の大きさも実感できるようにする
- ストーリーモードの導入 ⇒ 天文に興味があまりない人向け

等の制作も考えていますのでお楽しみに。
【自習】AWS EC2

PMする上で必要になってきたのでおさらい

https://docs.aws.amazon.com/ec2/?icmpid=docs_homepage_featuredsvcs

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/5090d6ee-f1c7-89b4-a140-a40ec28ad68b.png)

## AWS EC2とは
AWSが提供する **自由にカスタマイズ可能な仮想サーバー**。
必要なときにすぐにサーバーを作成し、使い終わったら停止や削除が可能。柔軟性が高く、あらゆる規模のプロジェクトに対応できる。

カスタム性の高いレンタルサーバーみたいなものと理解しておく。

## 料金
1. **インスタンスタイプ**  
   - 例: **t2.micro**（無料枠対象）  
     - 月750時間まで無料（1年間）。
     - CPUやメモリのスペックに応じて料金が異なる。

2. **利用時間**  
   - 従量課金制（使った分だけ支払う）。
   - 例: t2.micro インスタンス = 約0.01ドル/時間。

3. **データ転送量**  
   - 外部ネットワークへのデータ送信は課金対象。
   - 初期無料枠: 1GBの送信が無料。

## Xserverとの比較

| 項目                | **AWS EC2**                             | **Xserver**                       |
|---------------------|-----------------------------------------|-----------------------------------|
| **カスタマイズ性**   | 高い（OSやソフト自由に設定可能）        | 限定的（WordPressなど特化）       |
| **料金体系**         | 従量課金制（使った分だけ支払い）        | 固定料金（月額制、安心感あり）   |
| **スケーラビリティ** | 簡単に拡張（スペック変更・台数追加）    | 固定プラン内での利用に限定        |
| **運用管理**         | 自己管理（セキュリティ含む）           | サーバー側が管理（初心者向け）   |
| **向いている用途**   | 大規模サービス、学習や検証             | 中小規模のWebサイト、ブログ       |


- **AWS EC2を選ぶべき場合**:
  - 大規模サービスを構築したい。
  - 自由なサーバー設定を行いたい。
  - プログラミングやインフラの知識を伸ばしたい。

- **Xserverを選ぶべき場合**:
  - 手軽にWordPressサイトを作成したい。
  - サーバー管理にあまり時間をかけたくない。
  - 毎月のコストを固定したい。

## 感想
Amazon LinuxはEC2に載せたOSであり、それを更新したいという依頼の意味がわかった。EC2を新たに最新のOSで作成して載せ替えるということだと思う。
【TypeScript】type-challenges 中級編 9・Deep Readonly 解説

## お題
オブジェクトのすべてのパラメーター（およびそのサブオブジェクトを再帰的に）読み取り専用にする型`DeepReadonly`を実装する。

## やりたいこと
```ts
type Example = {
  x: {
    a: 1
    b: 'hi'
  }
  y: 'hey'
}

type Result = DeepReadonly<Example>;

// Result
type Result = {
  readonly x: {
    readonly a: 1
    readonly b: 'hi'
  }
  readonly y: 'hey'
}
```

## 解答
``` ts
type DeepReadonly<T> = keyof T extends never 
  ? T
  : { readonly [K in keyof T]: DeepReadonly<T[K]> };
```

## 解説
### 処理の流れ
- `keyof T extends never ? T : ...`
`keyof T`が`never`であれば`T`をそのまま返す条件分岐
- `{ readonly [K in keyof T]: DeepReadonly<T[K]> }`
Mapped Typesを使用し、`keyof T`が`never`になるまで再帰的に処理を行う

### keyof Tがneverを返すタイミングはいつ？
`T`が**プリミティブ型・リテラル型**の場合に`never`が返される。

### Readonlyとは...
https://qiita.com/yuto99999/items/63956cda534df8706bc1

### keyofとは...
https://qiita.com/yuto99999/items/dcc234f3e25a5393a2ab#keyof%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%A8%E3%81%AF

### Mapped Typesとは...
https://qiita.com/yuto99999/items/dcc234f3e25a5393a2ab#mapped-types%E3%81%A8%E3%81%AF

## 参考記事
https://github.com/type-challenges/type-challenges/issues/187

## 今回の問題
https://github.com/type-challenges/type-challenges/blob/main/questions/00009-medium-deep-readonly/README.ja.md
block.callをしなくてもyieldで呼び出す

### ブロックを引数にすることで違う処理ができる
```rb
irb(main):018* def greeting_ja(&block)
irb(main):019*   texts = ["おはよう", "こんにちは", "こんばんは"]
irb(main):020*   greeting_common(texts, &block)
irb(main):021> end
=> :greeting_ja
irb(main):022* def greeting_en(&block)
irb(main):023*   texts = ["good morning", "hello", "good evening"]
irb(main):024*   greeting_common(texts, &block)
irb(main):025> end
=> :greeting_en
irb(main):026* def greeting_common(texts, &block)
irb(main):027*   puts texts[0]
irb(main):028*   puts block.call(texts[1])
irb(main):029*   puts texts[2]
irb(main):030> end
=> :greeting_common
irb(main):031* greeting_ja do |text|
irb(main):032*   text * 2
irb(main):033> end
おはよう
こんにちはこんにちは
こんばんは
=> nil
```
* ブロックを引数にすることで`texts[1]`が二回実行される

```rb
irb(main):034* greeting_en do |text|
irb(main):035*   text.upcase
irb(main):036> end
good morning
HELLO
good evening
=> nil
```
* ブロックが呼ばれて大文字にされている

```rb
irb(main):008* def greeting(&block)
irb(main):009*   puts 'おはよう'
irb(main):010*   text =
irb(main):011*   if block.arity == 1
irb(main):012*     yield 'こんにちは'
irb(main):013*   elsif block.arity == 2
irb(main):014*     yield 'こんに','ちは'
irb(main):015*   end
irb(main):016*   puts text
irb(main):017*   puts 'こんばんは'
irb(main):018> end
=> :greeting
irb(main):019* greeting do |text|
irb(main):020*   text * 2
irb(main):021> end
おはよう
こんにちはこんにちは
こんばんは
=> nil
```
* yieldの意味を知らない

https://qiita.com/masatom86650860/items/e10f7d5e0de147ddcc53

```rb
irb(main):022* greeting do |text_1, text_2|
irb(main):023*   text_1 * 2 + text_2 * 2
irb(main):024> end
おはよう
こんにこんにちはちは
こんばんは
```

https://gihyo.jp/book/2017/978-4-7741-9397-7

#### arity -> Integer[permalink][rdoc][edit]
>メソッドが受け付ける引数の数を返します。
>ただし、メソッドが可変長引数を受け付ける場合、負の整数
>-(必要とされる引数の数 + 1)

https://docs.ruby-lang.org/ja/latest/method/Method/i/arity.html#:~:text=arity%20%2D%3E%20Integer,%E3%81%AE%E6%95%B0%20%2B%201

### 感想
```rb
irb(main):001* def greeting(&block)
irb(main):002*   yield "こんに", "ちは"
irb(main):003> end
=> :greeting
irb(main):004* greeting do |block|
irb(main):005*   block * 2
irb(main):006> end
=> "こんにこんに"
irb(main):007* greeting do |block, block2|
irb(main):008*   block * 2
irb(main):009*   block2 * 2
irb(main):010> end
=> "ちはちは"
irb(main):011* greeting do |block, block2|
irb(main):012*   puts block * 2
irb(main):013*   puts block2 * 2
irb(main):014> end
こんにこんに
ちはちは
=> nil
```
putsをしないと上書きされるらしい
【VSCODE】Prettierの自動改行される一行の長さを変える

## 手順

#### 1. PrettierのSettingsを開く。
#### 2. `Print Width`を検索フォームに入力
#### 3. デフォルトが`80`になっているので任意の数値に変更（360とか）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/95533dfd-a85d-42e3-13c6-924f5712b96a.png)

## ショートカット手順
#### 1. cmd + ,ショートカット起動
#### 2. `@ext:esbenp.prettier-vscode Prettier: Print Width`を検索フォームに入力

## config.jsで設定
共有設定にする際に利用
```js:prettier.config.js
module.exports = {
    printWidth: 360,
};
```
不動産・建築の情報流路のデジタル産業インフラをつくっています


## はじめに

トグルホールディングスの新谷です。AI開発の責任者をしています。

「不動産」「建築」「金融」というまちづくりの3大要素を、AIを活用してひとつの統合基盤へと結実させる――。
私たちトグルホールディングスは、かつて存在しなかった新種の「デジタル産業インフラ」を創り上げることをミッションとするスタートアップです。

私たちが向かう世界では、**<font color="#00cccc">不動産・建築・金融を取り巻く情報空間が、どのような形を成しているのか</font>**、その紹介ができればと思います。

## 地図が「地球」を映しはじめた

近年、地図アプリケーションは飛躍的な進化を遂げています。
これは、デバイスや通信技術に加え、データのクオリティ、さらにはアプリケーションの発展の影響が大きいです。
もはや地図は、原始としての<font color="#00cccc">**「位置関係図」から「地球を映す立体情報空間」へ**</font>と変貌を遂げてきています。私たちはデジタルツインをこのように捉えています。

## デジタルツインの発展により起きる変化

これまで、不動産といえば地図、建物といえば図面、いった形でバラバラに管理されていました。
ただ、不動産や建築の情報は必ず、ある「場所」に依拠しています。
この事実が意味するのは、今来のデジタルツインの発展により、<font color="#00cccc">**不動産・建築の情報は</font>**、それぞれ高次元のデータのまま、<font color="#00cccc">**地図上に同居していく**</font>ことが予想される、ということです。

敷地にかかる法令制限の確認や、地盤・高さの把握、さらには建築設計まで、全てが地図上で行われる未来も近いと考えます。

これら変化は、私たちのミッションである、「不動産・建築・金融をひとつにまとめる新しいデジタル産業インフラをつくる」の道中に起きている必然的な出来事だと言えます。


## トグルがつくるプロダクト

私たちは、「街の“未来”を描く地図」を開発しています。

![plateau_mini.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924699/e7493029-c3ed-dad7-1d7b-d9d1aca7a23a.gif)

![vc_lite.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924699/deba15d3-546f-9447-0477-5451d3a9a614.gif)



<font color="#00cccc">**「3D地図を上空から眺め、都市の概況を把握。開発余地のある領域を見つけ、その場に建つべき建物をAIで計算する。それは街の”未来”を見ることだ」**</font>
動画は [こちら](https://drive.google.com/file/d/1ug6iTwzTWMXZ_IvIsTKoZqxDDfbC0A79/view?usp=drive_link
)

コア技術となるのは、建築基準法を遵守した最大・最適な建物プランを自動作成するAI技術です。
この技術によって、デジタルツインという場で、<font color="#00cccc">**街の現在と未来をなめらかに繋いで**</font>います。

![Plateau_digital_twin.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924699/84e46fdc-0326-7a40-7424-edef8bfd89da.gif)


このように、PLATEAUデータをはじめ、国土交通省や国土地理院など、さまざまなGISデータや3Dデータを取り込み、独自のAI技術と掛け合わせることで、抜本的に新しいプロダクトを生み出しています。


## まちづくりにおける、情報流路のインフラをつくる
建築は、単純に「建物をつくる」行為ではありません。
それは「街」という巨大な情報空間の中から条件を導き、法や条例に適合させながら、人間や自然の未来の営みをデザインする、極めて複雑なプロセスです。

新しい建物が街に建っていくーー。
このプロセスの中で、<font color="#00cccc">**街の情報空間と、人の思案に基づく未来のデザイン、そしてリアルを、何度も行き来**</font>します。
私たちが目指すデジタル産業インフラは、このサイクルをなめらかにつなぎ、都市開発や不動産業務を一元的かつ合理的に進めるための「<font color="#00cccc">**流路**</font>」となることを見据えています。

## 最後に
もしこの世界観に共鳴していただいた方は、ぜひ一度ご連絡ください。
私たちが創ろうとしているのは、まったく新しいデジタル産業インフラです。
共に、すべてのまちと、まちをつくる人たちの”未来”を描いていきましょう。

MISSION: すべてのまちと、まちをつくる人たちのために

[採用情報はこちら](https://misty-individual-91e.notion.site/a032bd5cb5d94939b1d1584b57f8c99b)
yieldとは


```rb
irb(main):001* def greeting
irb(main):002*   puts 'おはよう'
irb(main):003*   puts 'こんばんは'
irb(main):004> end
=> :greeting
irb(main):005> greeting
おはよう
こんばんは
=> nil
```

```rb
irb(main):007* greeting do
irb(main):008*   puts 'こんにちは'
irb(main):009> end
おはよう
こんばんは
=> nil
```
### 渡されたブロックを実行するためにはメソッド内でyieldを使います。
```rb
irb(main):001* def greeting
irb(main):002*   puts 'おはよう'
irb(main):003*   yield
irb(main):004*   puts 'こんばんは'
irb(main):005> end
=> :greeting
irb(main):006* greeting do
irb(main):007*   puts "こんにちは"
irb(main):008> end
おはよう
こんにちは
こんばんは
=> nil
```
### ブロックで呼び出した側の処理をyieldで実行させる
```rb
irb(main):001* def greeting
irb(main):002*   puts 'おはよう'
irb(main):003*   yield
irb(main):004*   yield
irb(main):005*   puts 'こんばんは'
irb(main):006> end
=> :greeting
irb(main):007* greeting do
irb(main):008*   puts "こんにちは"
irb(main):009> end
おはよう
こんにちは
こんにちは
こんばんは
=> nil
```

### yieldの隣に渡すことでブロックの引数になる
```rb
irb(main):001* def greeting
irb(main):002*   puts 'おはよう'
irb(main):003*   text = yield 'こんにちは'
irb(main):004*   puts text
irb(main):005*   puts 'こんばんは'
irb(main):006> end
=> :greeting
irb(main):007* greeting do |text|
irb(main):008*   text * 2
irb(main):009> end
おはよう
こんにちはこんにちは
こんばんは
=> nil
```
```rb
irb(main):001* def greeting
irb(main):002*   puts 'おはよう'
irb(main):003*   text = yield 'こんにちは', 12345
irb(main):004*   puts text
irb(main):005*   puts 'こんばんは'
irb(main):006> end
=> :greeting
irb(main):007* greeting do |text, other|
irb(main):008*   text * 2 + other.inspect
irb(main):009> end
おはよう
こんにちはこんにちは12345
こんばんは
=> nil
```
https://gihyo.jp/book/2017/978-4-7741-9397-7

#### inspect -> String[permalink][rdoc][edit]
オブジェクトを人間が読める形式に変換した文字列を返します。

https://docs.ruby-lang.org/ja/latest/method/Object/i/inspect.html#:~:text=inspect%20%2D%3E%20String,%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82
Pythonを基礎から学ぶその9　日時を扱う

この記事は、[JavaとPythonを基礎から学びたい私のための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aruhitonocalendar)の21日目の記事です。


## datetime
datetimeはPythonで日付や時刻を使えるようにするもののようです。
標準ライブラリなのでインストール不要です
```
import datetime as dt
print(dt.datetime.now())
```
結果:2024-12-21 04:47:53.656946
現在時刻を取得するには以下のように書くそうです。秒数に関しては、小数点第６位まで出力されています。ただ、現在時刻と9時間ほどのずれがあるようです。調べてみたところ、出力される時間は協定世界時(UTC)のもののようで、ロンドンと同じ時間でした。
そのため、日本の時刻を出すときは
```nowtime.py
import datetime as dt
UTCtime=dt.datetime.now()
jptime=datetime.time(hour=UTCtime.hour+9,minute=UTCtime.minute,second=UTCtime.second)
print(jptime)
```
結果:2024-12-21 14:25:45
こんな感じで、UTC+9の時間にしてあげることで日本の時間を出すことが可能でした。ちなみにdatetime.timeと書くことで、任意の時間を設定可能です。
日付のほうが、時間帯によっては１日のずれが生じる可能性があります。
日本の正しい日付を出すためには
```py
import datetime as dt
UTCtime=dt.datetime.now()
if UTCtime.hour>=13:
    jpdate=dt.datetime(UTCtime.year,UTCtime.month,UTCtime.day+1,UTCtime.hour+9,UTCtime.minute,UTCtime.second)
else:
    jpdate=dt.datetime(UTCtime.year,UTCtime.month,UTCtime.day,UTCtime.hour+9,UTCtime.minute,UTCtime.second)
print(jpdate)
```
こんな感じにすればちゃんと出るはずです。dt.datetimeを使うことで、任意の日付を出すことが可能でした。
また、曜日に関する処理を行うこともできるようです。例えば今年のクリスマスって何曜日だっけ？とか今からちょうど１年後の曜日を見たいときとかに便利です。
```py
import datetime as dt
christmas=dt.date(2024,12,25)
dow=christmas.weekday()
print(dow)
```
結果:2
曜日を数字で返してくれるそうです。月曜日を0として、0から6までの数字で返してくれます。今年のクリスマスは、2なので水曜日です。
dt.dateの部分の日付をいじれば動きます。今から1000年後の日付を出したいなら
```py
import datetime as dt
nowdate=dt.date(3024,12,21)
dow=nowdate.weekday()
print(dow)
```
こんな感じで行けるようです。
曜日名を出したいときは、
```py
nowdate.strftime('%A')
```
を使うとよいようです。今日(土曜日)の場合、これでSaturdayと出すことができます。
# calendar 
calendarを使うと、その名の通りカレンダーを出すことができるようです
```py
import calendar
print(calendar.month(2024,12))
```
結果:
```
   December 2024
Mo Tu We Th Fr Sa Su
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
```
こんな感じで、calendar.monthの()内に入れた月のカレンダーが出てきます。
先ほど学習したdatetimeを用いると、
```py
import calendar
import datetime as dt
print(calendar.month(dt.date.today().year,dt.date.today().month))
```
こんな感じでわざわざ月を指定しなくても自動的に今月のカレンダーを出してくれるものを作ることもできます。
ちなみに１年分を出すこともできるみたいです
```py
import calendar
print(calendar.calendar(2024))
```

# まとめ
datetimeを用いることで、日時や曜日を出すことができる。曜日の計算をすることもできる。
また、calendarを使うことで指定した月のカレンダーを表示可能。
# 参考文献

https://atmarkit.itmedia.co.jp/ait/articles/2406/18/news024.html

https://note.nkmk.me/python-datetime-usage/

https://note.nkmk.me/python-calendar-text-html-list/
GraphQLを1から勉強しなおしてみた ~ サブスクリプション ~

# はじめに
先日に引き続きGraphQLを一から勉強し直していきます。

前回はこちら。

https://qiita.com/mattsu_mocha/items/3a76cb58fbba9fe91b66

# サブスクリプション
リアルタイムでデータの変更をクライアントに通知する。

クライアントはサーバーにサブスクリプションを登録し、データが変更されるとサーバーから自動的に更新情報が送られる。これにより、クライアントは最新のデータを常に受け取ることが可能となる。

サブスクリプションはpub/subシステムをサーバーに持ち、データの更新があるとメッセージが発行され、それをクライアントに通知する。


```graphql:サーバー
type Subscription {
  reviewCreated: Review
}
```
```graphql:クライアント
subscription NewReviewCreated {
  reviewCreated {
    rating
    commentary
  }
}
```

サブスクリプションは1つの操作に対して1つのルートフィールドを持つことしかできない。それぞれの操作に名前をつける必要がある。

```graphql
# NG
subscription {
  reviewCreated {
    rating
    commentary
  }
  humanFriendsUpdated {
    name
    friends {
      name
    }
  }
}

# OK
subscription NewReviewCreated {
  reviewCreated {
    rating
    commentary
  }
}
subscription FriendListUpdated($id: ID!) {
  humanFriendsUpdated(id: $id) {
    name
    friends {
      name
    }
  }
}
```

サブスクリプションはクエリやミューテーションよりも複雑で、特にサーバーを水平スケーリングする場合、各クライアントが特定のサーバーインスタンスにバインドされる必要がある。例えばWebSocketを使用する場合、接続が切れたときに再接続するロジックが必要となる。

 更新頻度がそれほど高くないデータについては、定期的なポーリング（クライアントが一定の間隔でサーバーにリクエストを送信する)、モバイル・プッシュ通知、またはクエリの再取得が必要。

# 参考

https://graphql.org/learn/subscriptions/
「Volta」JavaScriptツール管理システムが優れている

Voltaをセットアップした際の備忘録として記載します。

Voltaは特にNode.js環境の管理に最適化されており、
プロジェクトごとに異なるNode.jsバージョンを簡単に管理できる。
チームメンバー間で一貫したNode.js環境を維持するのにも役立つ。

## 特に優れている点をまとめると
1.速度: Rustで構築されており、非常に高速。
2.クロスプラットフォーム: Windows、macOS、Linuxで動作。
3.プロジェクト固有の設定: package.jsonにNode.jsやnpmのバージョンを指定でき、プロジェクトごとに自動的に切り替わる。
4.簡単なインストールと使用: 1つのコマンドでインストールでき、使い方も直感的。
5.複数のパッケージマネージャーのサポート: npm、yarnなど複数のパッケージマネージャーを管理できる。

ちなみにHomebrewは汎用的なパッケージマネージャーで、様々なソフトウェアを管理できますが、Node.jsのバージョン管理に特化していないです。
Voltaは特にNode.js環境の管理に最適化されているという特徴がある。

## Voltaのインストール方法
#### macOS/Linux
macOS を含むほとんどの Unix システムでは、1 つのコマンドで Volta をインストールできる。
```
curl https://get.volta.sh | bash
```

#### Windows
Windows の場合、Volta をインストールするには、winget を使用することをお勧めしている。
```
winget install Volta.Volta
```

必要に応じて公式サイトよりインストーラをダウンロードしインストールすることも可能。

## Voltaを使ったコマンドの使用
Node.jsをインストール
```
volta install node
```
特定のバージョンのNode.jsをインストール
```
volta install node@22
```
npmやyarnをインストール
```
volta install npm
volta install yarn
```
プロジェクト固有のNode.jsバージョンを設定（プロジェクトディレクトリ内で）
プロジェクトのNodeエンジンとパッケージマネージャーを選択できます。
Node エンジンの正確なバージョンを保存するpackage.jsonので、選択した内容を git にコミットできます。
```
volta pin node@20
```
インストールされたNode.jsのバージョン一覧を確認
```
volta list node
```

## Volta公式

https://volta.sh/
【中編】ゼロから学ぶKEDA：アーキテクチャ・ベストプラクティス解説【コスト削減編】

## はじめに
この記事では、Kubernetesでイベント駆動型スケーリングを実現する KEDA について、基礎から応用（導入）までを解説します。
「KEDAとは何か？」という基本的な疑問に答えるところから始め、KEDAのアーキテクチャやベストプラクティス、さらに実際の導入方法までを 3部構成 で整理し、KEDAの仕組みや運用のポイントを理解できるように構成しています。

【中編】となる本記事では、KEDAのアーキテクチャに焦点を当て、ベストプラクティスについても解説します。

[【前編】ゼロから学ぶKEDA：概要と導入目的](https://qiita.com/kimuchi-system/items/75c6364141701147905a)


## 対象読者
- Kubernetesを学習・導入している方
- KEDAって聞いたことがあるけど、「何をどうスケールしてくれるのかわからない」という方
- 「KEDAの導入に興味はあるけど、どこから手をつければいいかわからない」と悩んでいる方

## KEDAアーキテクチャ

- KEDAは、Kubernetes標準機能である Horizontal Pod Autoscaler (HPA) を活用しつつ、イベント駆動型のスケーリングを可能にする拡張機能を提供します。その大きな特徴は 0↔1スケール を実現することで、HPAの制限を超えた柔軟なPod管理が可能です。（詳しくは[【前編】ゼロから学ぶKEDA：概要と導入目的](https://qiita.com/kimuchi-system/items/75c6364141701147905a)をご覧ください）



---
![スクリーンショット 2024-12-15 16.46.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1471464/2e31fe41-121f-0c31-e6ab-686cea8068a1.png)
上記の画像は[KEDA公式サイト](https://keda.sh/docs/2.14/concepts/#architecture)より引用しています。

### 動作フロー
1. **ScaledObjectに登録**  
   ターゲットやトリガー条件を設定し、KEDAに登録します。
2. **トリガーの監視**  
   KEDAは指定されたトリガーを定期的にチェックし、条件が満たされた場合に動作します。
3. **Podのスケール制御**  
   条件に応じて、HPAを作成し、Podを動的にスケールします。


### 図全体の構成と流れのイメージ

KEDAの内部構造は以下の **3つの主要コンポーネント** で構成され、それぞれが連携してPodのスケーリングを支えています。

| 名前                        | 役割、説明                                                                                                                                 |
|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------|
| **keda-operator**           | - ゼロスケール時にPod数を **0→1**、**1→0** に制御   |
| **keda-metrics-apiserver**  | - Scalerが取得した外部メトリクスをHPAに連携<br> - 実際のスケーリングはHPAが実行（Pod数 **1→n**、**n→1**）                                    |
| **keda-admission**          | - リソース構成をバリデーションし、設定ミスを防止<br> - マニフェストの構成エラーを未然に防ぐ                                                  |

---

### 動作確認コマンド

KEDAの各コンポーネントが正常に動作しているかを確認するには、以下のコマンドを実行します。  
※ KEDAのセットアップ方法については[【後編】](https://qiita.com/kimuchi-system/items/e049508a5421cd7b388b)で詳しく解説します。

```bash
> kubectl get po -n keda

NAME                                     READY   STATUS    RESTARTS   AGE
keda-admission-7bd8cb458d-chn7q          1/1     Running   0          5d10h
keda-metrics-apiserver-fbd9dc66f-zvcvz   1/1     Running   0          2d16h
keda-operator-859b7bc75c-2grnt           1/1     Running   0          4d
```


## KEDAのベストプラクティス
KEDAを運用する際のベストプラクティスについて解説します。
（詳細は [KEDA公式ドキュメントのベストプラクティス](https://keda.sh/docs/2.16/reference/faq/#best-practices) をご参照ください。）


### 同じターゲットに対して複数のトリガーを使用する
- **設定**: ScaledObject内に複数のトリガーを指定可能です。
- **メリット**:  
   - 異なるトリガーの組み合わせにより、柔軟なスケーリングポリシーを構築できる。
   - ルールを一箇所で管理しやすい。 


### KEDAのScaledObjectと独自のHPAを組み合わせて利用しない
- **理由**: KEDAが内部で作成するHPAと競合するリスクがあるためです。
- **推奨**:  
   CPUやメモリを基準にスケールする場合は、KEDAの **CPUスケーラー** や **メモリスケーラー** を使用しましょう。



## まとめ
次回の[【後編】](https://qiita.com/kimuchi-system/items/e049508a5421cd7b388b)では、KEDAの導入手順や設定例について解説します。

## [【後編】](https://qiita.com/kimuchi-system/items/e049508a5421cd7b388b)に続く
いいね・コメントお待ちしてます！
インフラ/ネットワークの知識1(OSI参照モデル)

# はじめに
n番煎じですが,オンプレミスなインフラ/ネットワークの知識を
OSI参照モデルを軸にまとめていこうと思います.

IPアドレスやらTCP,UDPといった単語は押さえているものの,結局それらがどのような特徴・役割を持っているのか自信をもって説明できる気がしません．
(ネットワーク周りの知識を避けてきた弊害です...)

なので,もしも誰かに「インターネットの仕組みってどうなっているのか詳しく説明して」など言われたならば,お茶を濁すこと間違いなしです.

ということで，目標は
「**インターネットの仕組みを情報の専門家に説明できるレベルにする**」ことにします.

また,単語などについては以下のことを意識してまとめていきたいと思います.
- どのような特徴があるのか
- どのような役割を担うのか
- なぜ存在しているのか
- 簡単な言葉や図を用いて表現すること

冬休みの期間を活かして,インフラ/ネットワーク周りの知識を固めていこうと思います.
# OSI参照モデル
ネットワークの仕組みについて触れる前に,OSI参照モデルについて今回は触れていこうと思います.

そもそも,OSI参照モデルとは何ぞ？？というと
**コンピュータが通信するために利用するネットワークの機能を整理したモデル**となります.

OSI参照モデルでは,ネットワークの通信機能を7つの階層に分けてモデル化しています.

以下,各階層の名称と役割を簡単にまとめていきます.

## 物理層(L1)
ネットワークにおける物理的なもの全てを担っている階層です.

データリンク層から受け取るビット列(0と1で表現されたデータ)を,ケーブルに流せるアナログ波に変換するためのルールを定義しています.

データリンク層と合わせて定義されることが多く,機器としてはハブやリピータがあります.

この層については,今後の記事では触れないです.

## データリンク層(L2)
ネットワークにおいて,隣接する機器と正確に通信するためのルールが定められた階層です.

**物理層の信頼性を確保する**ために存在します.

**フレーム化**という処理に関する方式が定義されています.

送信時は,ネットワーク層から受け取ったパケットをフレーム化して物理層に渡し,
受信時は,物理層から受け取ったビット列をフレームとして認識し,フレーム化と逆の作業をしてネットワーク層に渡します.

次回の記事で触れると思います.

## ネットワーク層(L3)
異なるネットワーク間の通信経路を確保するための階層です.

**パケット化**という処理に関する方式が定義されています.

送信時は,トランスポート層から受け取ったセグメント/データグラムをパケット化してデータリンクに渡し,
受信時は,データリンク層からフレームを受け取り,パケット化とは逆の処理をしてトランスポート層に渡します.

次々回の記事で触れると思います.

## トランスポート層(L4)
通信における信頼性やリアルタイム性など通信品質を提供する階層です.

送信時は,セッション層から受け取ったアプリケーションデータにUDP/TCPヘッダを付加し,UDPデータグラム/TCPセグメントにして,ネットワーク層に渡します.

受信時は,ネットワーク層から受け取ったIPパケットに対して,送信するときとは逆の処理を施してセッション層に渡します.

次々々回の記事で触れると思います.

## セッション層(L5)
通信における開始から終了までの一連の手順を定義した階層です.


## プレゼンテーション層(L6)
データの表現形式を定義している階層です.

## アプリケーション層(L7)
ユーザーが操作するアプリケーションが提供する具体的な機能についての仕様や通信手順を定めた階層です.

L5 ~ L7については,今回の目標にあまり関連しないと思うので記事では触れないと思います.

# 最後に
短いですが,OSI参照モデルの各層について改めて簡単にまとめました.

次回からは各層の深掘り・ネットワークのつながる仕組み等をまとめていきます.

OSI参照モデルの各階層を"アプセトネデブ"と暗記したのは1年ほど前ですが,
今でも鮮明に記憶に残っています.

自分の中でネットワーク周りの知識は(なぜか)苦手意識があるんですが,
心が折れないように頑張っていこうと思います.
キャリアブレイク中のお金③ 年金と健康保険

# 国民年金と国民健康保険の切り替え
昨日の[失業保険の申請の話](https://qiita.com/binnmti/items/8f1ee2af5103781e6b16)で離職票は辞めた次の日にもらえたのですが、一方で失敗したことがあります。ハローワークに離職票を持って行ったその足で、区役所に国民健康保険と国民年金の切り替えに行きました。そこで社会保険の資格喪失証明書とマイナンバーカードが必要だと言われました。でもその時点で資格喪失証明書はありませんでした。会社に電話して聞いたところ近日中にメールで郵送すると言われました。他のアプローチも取れなそうだったので待つことになりました。

# 社会保険の資格喪失証明書
ところが1週間しても社会保険の資格喪失証明書が来ません。問い合わせたらメールは間違いで2週間以内に郵送するのでおそらく来週中と言われました。困ったのはその間に歯医者があったことで、10割負担もしょうがないと思って行ったら来週中に保健書持ってこないと月跨ぎで返金処理が出来なくなると言われてしまいました。それは流石にないと思ったので、結局歯医者は延期しました。

# 年金事務所で保険の証明書？
で、2週間後も結局来なくて、会社に問い合わせたら、郵送は間違いで、社会保険の資格喪失証明書は年金事務所に自分で取りにいけと言われました。なんだそれ。。と思いつつ、ミスが続いているので、本当に「年金」事務所で「社会保険」の資格喪失証明書をもらえるのかなと思いましたが、行ったら無事もらえました。しかもお金がかかるかと思ったら無料でした。

# 年金事務所でもらうのが正解
事務所の人に国民健康保険と国民年金の切り替えするのに年金事務所にもらいに来るのが本当に正解かを聞きました。するとその切り替えは資格喪失証明書が一番手軽で、会社側が何かやってくれることはなく、個人で年金事務所に行く以外はないと言われました。実際この人が言ったことが本当に正解かの保証はないですが多分あっているのでしょう。だったらもっと早く手続き出来たのなあと思いました。

# 国民年金の付加保険料
その後、区役所で無事に国民健康保険と国民年金の切り替えは出来ました。国民年金の切り替えは出来たのですが、ここでまた新しい話が出ました。付加年金を付けますか？と言われました。付加保険料400円で付けられるそうです。これが得か、損かよく分かりません。話を聞く限りは普通の年金は10年もらわないとペイ出来ないのが、付加年金は2年でペイ出来るそうです。得ぽいですが、デメリットがみえないので何とも言えません。でも一旦話を信じて付けておきました。後から調べてもこれは入っておいた方が良さそうでした。

# 国民健康保険の減税申請
国民健康保険の切り替えも出来たのですが、ここでもまた新しい話が出ました。減税申請です。減税をお願いするデメリットはないのか。これも聞く限りはやっておいた方が得そうでした。ただこれはすぐに出来ることではないので後日調べることにしました。今のところ調べた限りでもこれもやっておいた方が得そうでした。

# マイナンバーカード
国民健康保険への切り替えをしたら、もう国民健康保健証はもらえないそうなので、マイナンバーカードだけになりました。国民健康保健証は取っておけとも言われていますが、強制的になくなったので、むしろカードが1枚減って良かったなと思いました。このまま運転免許証も統合出来ればさらに便利です。早くスマホで使えるようにしてほしいなぁ。

# まとめ
引っ越し、結婚、死別、離職。何をするにも社会制度を使うのは面倒です。書かなければいけない書類も多いし、放置しておくと損をするケースが多くなります。でも、過去やってきた作業に比べると今回大分楽になったように感じました。住民票や印鑑も必要なくなっているし、これってもしかしたら、マイナンバーカードのお陰かなと思いました。今後もこの流れは加速してほしいなと思います。