OmniAICreator/Qiita-1.07M huggingface dataset:
CSR/SSR/SSGの違いを整理してみた

# はじめに
Web フロントエンドの世界では、ページの描画方法として「CSR」「SSR」「SSG」という大きく分けて3つの戦略があります。  
それぞれの仕組みや使いどころを整理してみました。

---

## 🧩 各レンダリング方式の概要

| 略称 | 正式名 | 実行タイミング | HTML生成場所 | 特徴 |
|------|--------|----------------|---------------|------|
| **CSR** | Client Side Rendering | ブラウザ上で実行時に描画 | クライアント | SPAに最適・API取得もクライアントで行う |
| **SSR** | Server Side Rendering | リクエストごと | サーバー | 毎回最新のHTMLを返す・柔軟性あり |
| **SSG** | Static Site Generation | ビルド時のみ | サーバー（ビルド環境） | 一度だけHTML生成・超高速配信が可能 |

---

## 🖥 CSR（Client Side Rendering）

### 特徴
- HTML には最低限の構造のみが含まれており、JavaScript が実行されて初めて画面が描画される。
- すべての処理がクライアント（ブラウザ）で行われる。

### メリット
- 初期表示後のページ遷移が非常に高速
- インタラクティブ（＝操作に即座に反応）」で「動的（＝状態が変わる）な UI に強い 
<向いている機能>
  - 簡易的なTODOリスト（サーバーを介さないので、即座にリストに追加されるなど）
  - モーダルの表示・非表示
  - カレンダーで日付を選んで予定を追加 



### デメリット
- 初回表示が遅い（HTML がすぐ見えない）
- SEO に弱い（検索エンジンが JS 実行しないと中身が見えないことがある）

---

## 🌐 SSR（Server Side Rendering）

### 特徴
- ユーザーがページにアクセスするたびに、サーバー上で HTML を生成して返す。
- React コンポーネントがサーバー側で毎回実行される。

### メリット
- ページの初期表示が速い（HTML がすぐ届く）
- SEO 対策に強い
- ユーザーごとの動的ページに最適

### デメリット
- リクエストごとにサーバー処理が必要なので、スケーラビリティを考慮する必要がある
- サーバーへの負荷が大きくなる可能性がある

---

## ⚡️ SSG（Static Site Generation）

### 特徴
- `next build` 時に React コンポーネントを実行し、HTML を静的に生成しておく(Next.jsでの話)
- ビルド後は CDN に配信され、リクエストごとの処理は不要

### メリット
- 表示が爆速（CDN キャッシュで提供）
- サーバーレスでスケーラブル

### デメリット
- コンテンツが古くなる可能性がある
- データ更新には再ビルドが必要(ISRというNext.jsの一定時間ごとに自動で部分的に再ビルドする機能で解決できることもある )

---

## 🧪 比較表まとめ

| 項目 | CSR | SSR | SSG |
|------|-----|-----|-----|
| 初期表示速度 | 遅い | 速い | 爆速 |
| SEO 対応 | 弱い | 強い | 強い |
| リアルタイム性 | 強い | 強い | 弱い（再ビルド必要） |
| スケーラビリティ | 高い | 低い | 高い |
| インフラコスト | 低い | 中〜高 | 低い |


---

## 💬 補足：ISR（Incremental Static Regeneration）とは？

Next.js 独自の機能で、SSG に「再生成」の柔軟性を追加したものです。  
一定時間ごとに自動で静的HTMLを再生成したり、APIからの指示で再ビルドをトリガーできてりします。

---

## 🚀 まとめ
フロント技術のキャッチアップをする中でざっくりとですが、概念や用途を整理してみました！
間違いがあれば、教えて頂けると幸いです。
  
Next.js やモダンWebアプリケーションでは、用途に応じて **CSR / SSR / SSG / ISR** を適切に選ぶことがとても重要です。  
チームやプロジェクトの要件に応じて、最適なレンダリング方式を選びましょう！

---
ステートレス・ステートフル

# はじめに
現代のシステム設計において、「ステートレス」と「ステートフル」の概念を理解することは極めて重要です。
ということを多くの記事で拝見しますが、そもそもこの2つの概念は何か、両者の基本的な定義から、具体的な使用例をまとめました。
この概念が理解できると、セッション管理など、他の場面で応用できます。ここで押さえておきましょう。

## ステートレス (Stateless)とは
各リクエストが独立して処理され、サーバーは前回のリクエスト情報を保持しない設計のことを指します。
各リクエスト（HTTPリクエストなど）は独立して処理され、サーバーはクライアントの状態を記憶しません。
<br>
ここでいう**状態**とは、サーバーがクライアント（ユーザーや端末）に関する行動やデータを記憶している情報のことを指します。
ステートレスとは、「状態を保持しない」という状態で、相手のことも相手が過去にしたことも覚えていないことを言います。
<br>
**イメージ**：一見さん
![Image 2025-04-05 at 12.01.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907600/a3166c5f-922d-4efe-8139-76e8afda29e2.jpeg)

この例では、お客（クライアント）が注文をオーダーし、店員（サーバー）がそれを受け取り返事をしています。
日常世界においては、店員はこの後もお客のリクエスト（オーダー）を覚えていますが、ステートレスはそうではありません。
お客が数分前にオーダーした内容を店員に確認すると、店員は過去のオーダー内容を覚えていないと返事をします。
店員側では過去の記憶はなくなるので、お客が誰で何のことを言っているのかわからないという事態になります。
このように、一回の会話ごとに内容が完結し、後に記憶されず常に一見さん状態なのがステートレスなのです。
<br>
実際にこのような状態が日常的にあると困ってしまうものですが、サーバーは1人だけを相手にしているわけではなく、不特定多数の人を相手にします。そのため、リクエストを受け付ける度に前回の記憶を思い出す作業を行なうと、それだけ労力を使うことになります。
私たちも1対1の会話ではスムーズにコミュニケーションを取れますが、一度に複数の人から話しかけられると対応に困ってしまうのと同じなのです。
<br>
このように、1回の会話ごとにコミュニケーションが完結することで以下のことが可能になります。<br>
**① スケールアウトしやすい**
サーバーやシステムの規模を拡張して処理能力を上げることを意味します。
サーバーが状態を保持しないということは、リクエストを記憶しておく必要がないため、どのサーバーで処理しても結果は同じになります。仮にサーバーが状態を記憶していた場合、その記憶を別場所にコピーする手間（コスト）がかかってしまいます。その手間（コスト）がないため、その分素早く対応できるのです。

※サーバーを増やすことによって、大量のリクエスト・アクセスを裁くことができるようになります。

**② ロードバランサーによる振り分けの高速化**
私たちがリクエストを送ると、そのリクエストをどのサーバーで処理するか、調整してくれる機能をロードバランサーは持っています。どのサーバーで処理しても結果が同じであるならば、ロードバランサーは単純に空いているサーバーにリクエストを割り振るだけで済むので、対応が早くなります。

**※ロードバランサーのイメージ**
![Image 2025-04-05 at 14.06.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907600/a7e51afc-34d9-41df-9ee3-cc5b6d18d54e.jpeg)


**③障害に強くなる**
ステートレスでは、状態を持たず、リクエストごとに必要な情報をすべて含めるため、どこかに前回の情報を記憶しておく必要がありません。そのことにより、仮にサーバーがダウンしても、セッション情報（前回の記憶）が失われないため、サーバー障害による影響が少なくなります。


## ステートフル (Stateful)とは
サーバーがクライアントの状態（前回の会話の内容やその人の情報）を保持することを指します。前回の記憶が残っている状態です。これが「状態を保持する」という状態です。
この場合、サーバーがクライアントの情報を記憶することになるため、その分ステートレスな場合に比べメモリやリソースを消費することになります。

**イメージ**：常連客
![Image 2025-04-05 at 12.14.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907600/31d6eeb8-ce2e-4448-ad86-beeb223decec.jpeg)

お客のオーダーを受け付けると、このお客のこととオーダー内容を記憶します。これにより、例えば、数日前に来店していた場合、前回の記憶を辿ってお客特有の好みを把握し、新たな提案ができます。前回のことを記憶しているため、コミュニケーションを円滑に進めることができるようになります。

状態を持つことにより、以下のようなことが可能になります。

**① 毎回データを送る必要がない**
サーバーが状態を覚えているため、毎回データを送る必要がなく、パフォーマンスが向上する場合があります。
例えば、ログインしたユーザーが過去に注文したものを記憶することで、ユーザー自身が過去に注文した商品や日時を確認することができます。

**② 複雑な処理ができる**
ログイン状態を保持したり、ネットショッピングにおいて商品購入手続きを円滑に行えるようになったりします。
状態を一元管理しているため、その情報を活用した処理ができるようになります。

**③ リアルタイム処理に適している**
リアルタイムでのビデオ通話やゲームサーバーなど、継続的な接続が必要な場面で効果を発揮します。


# まとめ
今回はステートレスとステートフルのそれぞれの特徴を解説しました。2つの選択はトレードオフで、ステートレス設計はスケーラビリティとシンプルさを実現でき、ステートフル設計はパフォーマンスとユーザーにとってメリットの多い機能を提供します。このような特徴を押さえたうえで、システムを設計していきましょう。

最後までお読みいただき、ありがとうございました。


# 参考・画像引用元URL
https://qiita.com/DProSchool/items/c48ce9beae449e39ef4c
https://otonan-syusyoku.work/archives/1569
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031900052/062400004/
https://qiita.com/mtakehara21/items/efcbbc3ba58a62c10eb6
https://www.kagoya.jp/howto/it-glossary/network/loadvalancer/
Scheduled Flow and Subflow Superbadge Unit



https://trailhead.salesforce.com/content/learn/superbadges/superbadge_scheduled_and_subflows_sbu



# 毎日の予約確認フローを作成する

毎日、逃した予定をチェックする新しいフローを構築します。 

何もしないで検証ボタンをクリック

:::note alert
We can't find an active flow named 'Daily Appointment Check'.
:::

:::note alert
The 'Daily Appointment Check' flow isn't configured with the specified flow trigger type.
:::

:::note alert
We can't find the 'Daily Appointment Check' flow with the correct filter conditions.
:::

前のフローの時の条件がいる？


# サブフロープログラム数と参加者ステータスを作成する - サブフロー

プログラム参加管理を効率化するためにサブフローを作成し、親フローを更新して新しいサブフローを呼び出します。 

何もしないで検証ボタンをクリック

:::note alert
We can't find an active flow named 'Program Count and Participant Status - Subflow'.
:::

これも自動翻訳を読んでも？ですねぇ。

:::note alert
The 'Weekly Program Participant Check' flow has unnecessary elements.
:::

まだ消せってこと？


# プログラム参加者更新フローを作成する

前のチャレンジで作成したサブフローを使用して、レコードトリガーフローを作成します。

何もしないで検証ボタンをクリック

:::note alert
We can't find an active flow named 'Program Participant Updated'.
:::
vscode のファイルタブ多段表示

VisualStudio とかではファイルタブの多段表示できるのに VSCode ではできないんかな…
できたら便利なのに…
と思っていたらありました！

せっかくなので書き残しておきます

- [はみ出た時に多段表示にする](#はみ出た時に多段表示にする)
- [ピン止めで多段表示にする](#ピン止めで多段表示にする)

# はみ出た時に多段表示にする
ファイル名のタブが　vscode　の横幅に収まりきらないときに、多段表示にします

1. Ctrl + , で設定を開く
2. 「wrap tabs」といれWrap Tabs にチェックを入れる
![wraptabs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873715/4d37177d-b624-4c2a-a32f-ea4e17784f57.png)
    

# ピン止めで多段表示にする
ピン止めするだけで多段表示にしてくれます

1. Ctrl + , で設定を開く
2. 「Pinned Tabs On」と入力し、Pinned Tabs On Separate Row にチェックを入れる
![pinnedtabs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873715/baac9424-8449-4f73-b006-985655e6d7b8.png)
3. ピン止めしたいファイルを開いた状態で Ctrl + K,Shift + Enter でピン止めができる


# 参考
https://qiita.com/taqumo/items/568eec33f0c93bd5f616
https://qiita.com/12345/items/844082add474af68d9fa
Next.js個人備忘録③：Next.jsでの開発に向けて、Tailwind CSSの基本を簡単にまとめてみた

## はじめに
Tailwind CSSは、近年人気が高まっているユーティリティファーストなCSSフレームワークです。

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

従来のようにCSSファイルでスタイルを定義するのではなく、HTMLに直接スタイルを付けられるため、デザイン作業のスピードアップが期待できます。

## 書こうと思ったきっかけ
ITスクールの制作課題で「短期間で見栄えのするUIを作りたい」と思ったことがきっかけです。

***CSSの記述量を減らしながらデザインの自由度を保てるTailwind CSSを知り、その仕組みを自分用にまとめておくことにしました。***

## Tailwind CSSとは？
Tailwind CSSは、ユーティリティファーストなCSSフレームワークで、HTMLに直接クラス名を記述することでスタイルを適用していくのが特徴です。

https://tailwindcss.com/

一般的なCSSのようにクラスを定義してから使うのではなく、既に用意された小さなスタイル単位（ユーティリティクラス）を組み合わせてUIを構築します。

**参考文献**

https://qiita.com/Yuki_Oshima/items/708986d62ea3a773d6a5

https://blog.cloudsmith.co.jp/2023/02/330/

### 特徴
- **ユーティリティファースト**：細かいスタイルごとにクラスが存在。
- **HTML直書きでスタイリング**：CSSファイルをあまり書かずに済む。
- **再利用性が高く、メンテしやすい。**
- **モダンなデザインがすぐできる。**
- **カスタマイズ性が高い**（tailwind.config.jsで設定可能）。

### 例：Tailwindでボタンを作る
```html
<button class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">
  クリック
</button>
```

## まとめ
Tailwind CSSは、HTMLを見ただけでスタイルの概要がわかるほど直感的で、習得すれば制作スピードも上がります。

:::note warn
***クラスの意味を理解しながら使うことで、CSSの設計力も自然と身についていくと感じました。***
:::

今後はtailwind.config.jsを活用したカスタマイズや、コンポーネント設計にも挑戦していきたいです！
Amazon MQとは？Amazon SQSとの違いについて



AWS上でメッセージング機能を提供するサービスには、**Amazon MQ**と**Amazon SQS**があります。用途が似ているようで異なるこの2つのサービス。違いを端的に整理します。

---

### ✅ Amazon MQとは？

**Amazon MQ**は、**Apache ActiveMQ や RabbitMQ**といった**オープンソースのメッセージブローカーをマネージドで提供するサービス**です。

- **従来のメッセージングプロトコル（JMS, AMQP, STOMPなど）に対応**
- アプリケーション変更を最小限に抑えてクラウド移行可能
- FIFO（先入れ先出し）、Pub/Sub（発行・購読）どちらのパターンにも対応

---

### ✅ Amazon SQSとは？

**Amazon SQS（Simple Queue Service）**は、**完全にマネージドなスケーラブルなキューイングサービス**です。

- 分散アーキテクチャに適した**クラウドネイティブなサービス**
- RESTベースのAPIで操作
- **標準キュー（高スループット）**と**FIFOキュー（順序保証）**が選べる

---

### 🔍 Amazon MQとSQSの違い（一覧）

| 比較項目 | Amazon MQ | Amazon SQS |
|----------|-----------|------------|
| 基盤技術 | ActiveMQ / RabbitMQ | AWS独自 |
| プロトコル | JMS, AMQP, MQTTなど | HTTP(S) API |
| 主な用途 | オンプレ移行・既存システムとの連携 | サーバーレス・マイクロサービス |
| 運用管理 | 一部管理必要（接続・構成） | 完全マネージド |
| メッセージ順序保証 | ○（設定可能） | FIFOキューで対応 |
| スケーラビリティ | 制限あり（インスタンスサイズに依存） | 自動スケーリング対応 |

---

### 📝 まとめ

- **既存のミドルウェアを活かしたい** → Amazon MQ  
- **クラウドネイティブに構築したい** → Amazon SQS

システムの特性や要件に応じて、適切なサービスを選びましょう。

---
【Ruby】Enumerableモジュールについて理解を深めたい！

# Enumerable は何をしてくれるモジュール？

Rubyの Enumerable モジュールは、map, select, find, take などの便利な配列風メソッドを提供してくれるモジュールです。

# どういう時に使う？

Railsを使っていたら使う機会がないと思うのですが、以下の場合に使用するのかなと思っています。

1. 自作のクラスを「配列っぽく」使いたいとき
1. データを逐次処理・フィルタ・変換したい時
1. クラスの中の配列っぽいデータにメソッドを委譲せずに使いたいとき

スクリプトを実行する時やバッチ処理を実行する時に使えるかな？くらいの感覚だと思っています。

## 1. 自作のクラスを「配列っぽく」使いたいとき,クラスの中の配列っぽいデータにメソッドを委譲せずに使いたいとき

`Enumerable`を使用しない場合

```rb
class Alphabet
  attr_reader :alphabet

  def initialize
    @alphabet = ("A".."Z").to_a
  end
end

a = Alphabet.new
p a.alphabet.map(&:downcase)           # => ["a", "b", ..., "z"]
```

`Enumerable`を使用する場合

```rb
class Alphabet
  include Enumerable

  def each
    ("A".."Z").each { |ch| yield ch }
  end
end

a = Alphabet.new
p a.map(&:downcase)           # => ["a", "b", ..., "z"]
```

`Enumerable`を使用すると、インスタンスに対して`map`メソッドを使用することができるようになります。

## 2. データを逐次処理・フィルタ・変換したい時

`Enumerable`を使用しない場合

```rb
class Counter
  attr_reader :counter

  def initialize
    @counter = (1..Float::INFINITY).to_a
  end
end

c = Counter.new
p c.counter.lazy.select(&:even?).first(5)  # => [2, 4, 6, 8, 10]
```

`Enumerable`を使用する場合

```rb
class Counter
  include Enumerable

  def each
    (1..Float::INFINITY).each { |i| yield i }
  end
end

counter = Counter.new
p counter.lazy.select(&:even?).first(5)  # => [2, 4, 6, 8, 10]
```

Float::INFINITYを使用する場合の処理を書きやすくなったかな？

:::note warn
`Enumerable`を使用しない場合は無理やり書いてます。（実行したら、止めない限りずっと処理が続きます。）
:::

# まとめ

簡単にしか書かなかったですが、`Enumerable`モジュールを使用することで、ちょっと簡単にループ処理が書けるようになったりするっぽいです。

制約として、`each`メソッドをインクルードしたクラスに定義する必要がありますが、`each`メソッドをカスタマイズすることで価値が上がるモジュールなのかなと感じました。

い
cronでminecraftサーバー起動のbat処理がうまく動作しないときの対処法

### 概要  
cronからFabric製Minecraftサーバーを自動起動しようとした際、`screen`上でサーバーが正しく起動しない事象が発生した。手動で実行する際は成功するにも関わらず、cronや他ディレクトリから実行すると失敗する。この原因と対処方法について記録する。

---

### 現象  
以下のcronジョブを設定。

```
0 21 * * * /home/ubuntu/survival/restart.sh
```

このジョブは `screen` 上でFabricサーバーを起動するシェルスクリプトである。  
スクリプトを `/home/ubuntu/survival` ディレクトリ内で手動実行すれば正常に起動するが、`/home/ubuntu` など別ディレクトリで実行すると起動しない。

---

### 原因  
Java製のMinecraftサーバーは、実行時の「**カレントディレクトリ（作業ディレクトリ）**」に依存して、modsやconfig、worldデータなどを読み込もうとする。  
スクリプト内で `cd` を明示しないと、cronなどでの実行時には意図しないディレクトリ（例: `/`や`/home/ubuntu`）から起動されるため、必要なリソースが見つからず異常終了する。

---

### 対処法  
スクリプト内で `cd` を明示的に指定する。

```bash
#!/bin/bash

# 設定
SCREEN_NAME="fabric-server"
JAR_FILE="fabric-server-mc.1.20.1-loader.0.16.10-launcher.0.11.2.jar"

# サーバーディレクトリへ移動
cd /home/ubuntu/survival || exit 1

# すでにscreenが存在する場合は何もしない
if screen -list | grep -q "$SCREEN_NAME"; then
    echo "The server is already running in screen session: $SCREEN_NAME"
    exit 1
fi

# サーバーをscreenで起動
echo "Starting Fabric server in screen session: $SCREEN_NAME"
screen -dmS $SCREEN_NAME java -jar $JAR_FILE nogui

echo "Fabric server started successfully."
```

必要であれば、cron用に `PATH` や `JAVA_HOME` をスクリプト内で明示することも検討する。

---

### 補足：cron環境での注意点

- cronは非常に最小限の環境変数しか持たない  
- `.bashrc` や `.profile` に記載されたPATHは反映されない  
- `screen` や `java` コマンドがパスで解決できない場合があるため、絶対パスで記述するか、環境変数を設定すること
エンジニア歴3ヶ月目の定点観測

## はじめに
初めまして、UX/UIデザイナーとして活動しているKikoといいます。
デザインエンジニアになることを目標に、今年の1月からReactの勉強を始め、エンジニアとしての学習を始めて3ヶ月が経ちました。

簡単な自己紹介はこちらです
https://qiita.com/kikotkk/items/b702b6c3a227690eeec6

## 3ヶ月目にやったこと
- React + TypeScriptでミニアプリを開発
- Supabaseの導入とデータベースの基本操作を習得
- コードの読み書きに慣れるため、課題をこなすときに意識的に調べて考える習慣をつけた
- 学習ログをX(Twitter)に記録してモチベーションを維持

## できるようになったこと
- map関数やUseStateなど、Reactの基本的な構造に慣れてきた
- エラーに対する耐性がつきエラーメッセージを手がかりに自力で解決できる場面が増えた
- 状態管理やフォーム処理など実務で必要そうな処理にも少しずつ触れ始めた
- Chakra UI楽しい！

## 苦戦したこと・反省点
- TypeScriptの型に対する理解がまだ浅く、型エラーに悩むことが多かった
- 公式ドキュメントの読み方が分からず時間を浪費することも多い
- 考える前に手を動かしてしまい後から設計ミスに気づくことも多いにある

## 来月の目標
今は開発駆動でそろそろ個人開発がスタートするので、これが醍醐味でもあるし一番の大きな目標だったので頑張ろうと思います。


- 単語帳アプリの開発に着手し、語源による自動カテゴリ分け機能を実装
- Supabaseを使った認証やデータ保存を試す
- コードの設計やリファクタリングを意識して、可読性の高いコードを書く
- TOEICに向けた英語の学習も平行して進める

---

3ヶ月目は「少しずつ自走できるようになってきた」感覚が持てた月でした。
引き続き焦らず丁寧に、一歩ずつ進んでいきたいと思います。
Greenplumはどこへ行った？

# はじめに
[PostgreSQL Conference Japan 2024](https://www.postgresql.jp/jpug-pgcon2024)でGreenplumという名前が複数回出てきました。そういえば以前[PostgreSQLとGreenplum両方に共通の拡張](https://github.com/knu/postgresql-plruby/)があったような、、、ということで、ちょっと調べてみました。

# 結論
まだあります。

https://greenplum.org/

でもオープンソースではありません。

オープンソースとしての後継はこちら。

https://cloudberry.apache.org/

ついこの間、[Apacheの下でincubatingになった](https://cloudberry.apache.org/blog/cloudberry-database-enters-the-apache-incubator)[^incubating]ので、こんな記事でも意味はあるかな、と。

[^incubating]: "incubating"する人が"incubator"でして、ほら、これ、キュゥべえですよね。ということで、Cloudberry も「魔法少女」になったと理解すれば、まあ大体合ってます。まともな説明は[本家](https://incubator.apache.org/)を読もう！

# 詳細
時系列的に追いかけてみました。の前に、「そもそもGreenplumって一体何だよ」という人のために[^for]。
[^for]: そんな人はそもそもこの記事に辿り着かない気がしますが、、、Greenplum違いで間違ってこのページに来てしまった人には意味があるでしょうか。

**GreenplumとはPostgreSQLを元に開発されたRDBMSで、並列処理に強みがあります。** えっ？PostgreSQLにも[パラレルクエリ](https://www.postgresql.jp/document/16/html/parallel-query.html)とかあるよね？ですか。確かに今はその通りなのですが、9.5まではそうではなかったのです。そういう「PostgreSQLって悪くはないけど、ちょっとここが足りないよね」という需要に応えるものです。

気を取り直して、以下、時系列的に追いかけてみました。

## Greenplum（会社）のGreenplum（製品）
製品名と会社名が同じという、まあ、よくあることかと思います。会社ができた年ははっきりしませんが、2005年くらいかな。こんな牧歌的な時代もあったのですね。

## EMCの〜
2010年に Greenplum（会社）が EMC に買収されます[^VMWare]。今 EMC って言われても分からないかもですが、それは Dell に買収されたからです。EMC はストレージの会社でしたから、今の Dell のストレージ部門がそれなのかな、と思います。Dell のストレージ製品なら今の人でも分かるのではないかと、、、

[^VMWare]: 実はこれより前に EMC が VMWare を買収しているらしいです。この VMWare って後で出てくるその VMWare でして、これをまともに追いかけ始めると何が何だか、、、個人的には EMC が RSAセキュリティ を買収したことは知っていましたけど。

## Pivotalの〜
2012年に Pivotal として EMC から独立します。（2013年と書いてある場合もあるので、2012年に「独立するよ」という発表があって、2013年に「独立したよ」ということなのかもしれません。大勢に影響なしということで、これ以上深入りはしませんが[^taisei]。）会社としてはGreenplumが主力製品だったっぽいです。
[^taisei]: 面倒になっただけ:sweat_smile: でも、大勢に影響しないのは確かかな。

## VMWareの〜
Pivotal が VMWare に買収されました。この VMWare はみなさんもよくご存知のあの VMWare です。説明不要ですよね[^setumei]。買収されたのは2019年か2020年と資料によってブレがあります。（もしかしてこちらも2019年に買収発表して、2020年に買収完了、とかあたりでしょうか。大勢（以下同文））
[^setumei]: やはり面倒になっただけ:sweat_smile::sweat_smile: 

## Broadcomの〜
VMWare が2023年に Broadcom に買収されましたので。これは皆さん、（Greenplum とは関係なく）ご存知でしょう。
この後、2024年に Greenplum のソースコード公開をやめる、という発表があって、今に至ります。
買収に買収が重なってますから、「Greenplum が主力製品」ということはもうないのでしょう。Tanzu の一機能みたいな位置付けになっていて、Tanzu の方針としては云々、みたいなことがあったのかなと思います。（単なる私の憶測ですが）

## そして Cloudberry へ
Greenplum のソースコード公開終了に対して、終了前のものから派生させてできたのが Apache Cloudberry[^cloudberry] です。「今までオープンソースだったのが急にそうでなくなったので、自分たちで後継となるオープンソースを作ってしまおう」という最近よく見かける流れかと。
[^cloudberry]: "cloudberry"で検索すると違うものが出てきますので（違うものしか出てこない？）、"Apache Cloudberry"で検索してください。

# おことわり

この文章の内容は、筆者が所属している会社・団体とは一切関わりがありません。いわゆる「自主的な研究の成果の発表」というものです。

あと、構想4ヶ月(うち実働数時間)、制作数十分の「大作」なので、（時系列の部分に限らず）時期の表現が微妙なのは気にしないでください。
個人開発　Habitica-外部連携　運用設計　バックアップ・リストア設計

# バックアップ・リストア設計の目的
システムのデータの損失や破損を防止し、障害発生時にデータを復旧することを目的とする。

# インプットとなる資料

概念設計
https://qiita.com/RYA234/items/675442e8a2acc17c0f3e

# 成果物 バックアップ方針
具体的な製品に依存しないバックアップの方針を決めます

## バックアップ対象　

#|バックアップ種別|配置場所|バックアップデータ|種別|容量|備考
--|--------------------|----------------|--------------------------|------|------|------
1|データ|DBサーバー|DBデータ|DB|5GB|特になし





## バックアップ間隔
#|バックアップ種別|バックアップ間隔|バックアップ完了想定時刻|容量|
--|--------------|---------------|---------------------|----
1|データ|週次|５分|5GB


## バックアップ先
#|配置場所|バックアップサーバディスク|テープ|遠隔地|
--|------------|---------------------------------------|--------|---------|
1|データ||〇| | |



## リストア可能範囲
#|バックアップ種別|範囲|リストア想定時間|
--|------------------------|------|------------------------|
1|データ|障害直前|5分


# 詳細設計部分

## バックアップコマンド
```bash
# bashで実行する

docker-compose exec -it  postgre_task  bash -c  "pg_dump -Fc  postgres > /src/backup/`date +%Y%m%d`.dump"

```

## リストアコマンド
```bash
# bashで実行する
docker-compose exec -it  postgre_task  bash -c "pg_restore -d postgres -Fc /src/backup/20250406.dump"

```

## スケジュールコマンド
本項目ではまだ記述しません。


# 参考書籍：
・設計運用の教科書　4.4バックアップ/リストア 
・システム設計の謎を解く　5.3設計の側面　3.2バックアップ/リストア p225
・内部構造から学ぶPostgreSQL 設計・運用計画の鉄則　第八章バックアップ計画
Microsoft365の従業員割引

# Microsoft365の従業員割引
最近、会社のセキュリティが厳しくなって、個人のパソコンでMicrosoft Officeが使えなくなってしまった。今まではコロナで在宅勤務が多かったので大目に見ていただけ、という事だ。まー当然だよね、仕方がない。というわけで、個人のOfficeを購入することに。オジサンはケチなので、諦め悪くMicrosoftのサイトを何かないかと徘徊していると、従業員割引があるのを見つけた。学割はあちこちで紹介されてるのに、従業員割引はあまり情報が無いようなので共有。
会社でMicrosoft365(MS365)を使っている場合、その会社の従業員がMicrosoft365 Personal、Microsoft365 Familyの割引を受けられる特典がある。サブスクリプション料金が30%割引に。しかも **毎年**。サブスクなので、すでに定価で契約してしまった人も更新時に切り替えられるのではないかと思う。なんと、サブスクを継続すれば、割引は退職後も有効とのこと。つまり **永年** 割引。Familyプランがあることを考えると、親子兄妹の誰かは会社員がいてもおかしくないから日本人のほとんどが割引を受けられるのではないだろうか。太っ腹と言うか、囲い込みと言うか。

概要

https://www.microsoft.com/ja-jp/workplace-discount-program/employer-resources

申し込みはこちら。

https://www.microsoft.com/ja-jp/workplace-discount-program

ここに会社のメールアドレスを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/13676542-cc7c-40fb-91ce-81995ae01ad6.png)

会社のメールアドレスをフォームに入れると、審査されて、OKならリンクの貼ったメールが送られてくる。おお安くなってる。👏
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/17bf8352-98d1-436d-95fc-514b16a52153.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/c6b6d341-de66-451a-8177-f36dd98eb6da.png)

カードで支払いを終えると、MS365のサイトでデスクトップ版がダウンロード可能に。👏
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/1cd4e6e5-a743-4dec-bb8e-532e7b7c5c40.png)

フィッシング詐欺が怖い向きは、あらかじめMicrosoftアカウントとカード情報を公式ホームページで紐づけておく。紐づけておけば、メールのリンクからカード情報を入れる必要がなくなる。

# Microsoft365開発者プログラム
Microsoft365開発者プログラムというのもある。こちらは無料。ただし使えるOfficeはWEB版だけ。Azureを使った開発を想定している。

https://learn.microsoft.com/ja-jp/office/developer-program/microsoft-365-developer-program

# その他
上記の次にお得だったのは、楽天。いつもやっているのかはわからないが、ポイントで15%の還元がある。キャンペーンや買い方によってはさらに数%のポイント還元がある。価格は公式サイトと同じ。
[Vue]Mock Service Workerを使ったAPIモックの導入方法

# Vue + Vite で MSW を使った API モック環境の構築

開発中にバックエンドAPIがまだできていなかったり、安定していなかったりする場面、ありますよね。
バックエンドを待たずとも、モックを使ってフロントエンドだけドンドン進めていきたいですよね！

そんな時に便利な[**MSW (Mock Service Worker)**](https://mswjs.io/) 
**Service Worker を使ってブラウザ上で通信を横取り（intercept）し、APIレスポンスをモックできる** 強力なライブラリです。
今回は、Vue 3 + Vite プロジェクトにおいて、MSWを使ったモック環境の作り方をご紹介します。


## 1. パッケージのインストール

まずは開発用依存としてMSWをインストールします。

```bash
npm install msw --save-dev
```

## 2. モックハンドラの定義

MSWはハンドラーと言って、`src/mocks/handlers.js` または `handlers.ts` にAPIレスポンスの定義を記述します。
記述も公式にサンプルもあり、直感的に書けるよな内容になっているので、モックを返すだけなら困ることはないです。

```ts
import { http, HttpResponse, passthrough } from 'msw'

export const handlers = [
  http.get('/hello', () => {
    return HttpResponse.json({
      message: 'Hello, world!',
    })
  }),

  // その他のGETリクエストを処理
  http.get('*', ({ request }) => {
    const url = request.url

    // 静的ファイル（画像やCSSなど）は通す
    if (url.match(/\.(png|jpg|jpeg|css|js|json)$/)) {
      return passthrough()
    }

    console.warn('[MSW] モックされていないGETリクエスト:', url)
    return HttpResponse.json({ error: 'このリクエストはモックされていません' })
  }),
]
```

ポイント：

- `http.get('*')` を使って、想定外のリクエストもキャッチ。
- 静的ファイル（画像やCSS等）は `passthrough()` を使ってモック対象から除外。

> MSWがfetchやXMLHttpRequestによるリクエストをすべてインターセプトするため、静的ファイル（例：画像やJSONなど）へのアクセスもモック対象とMSWが誤解してしまうことがあるため、最後の砦（fallback）としてワイルドカードで設定しています。


## 3. モックサービスワーカーの初期化

次に、Service Worker を使ってハンドラを有効にします。`src/mocks/browser.ts` を作成します。

```ts
import { setupWorker } from 'msw'
import { handlers } from './handlers'

// ブラウザ用のService Workerをセットアップ
export const worker = setupWorker(...handlers)
```

## 4. 開発モード限定でモックを有効化

アプリの起動時に、MSWのセットアップを行います。  
以下のような `enableMocking()` 関数を作成し、`main.ts` や `main.js` で呼び出します。

```ts
async function enableMocking() {
  if (import.meta.env.MODE !== 'mock') {
    return
  }
  const { worker } = await import('./mocks/browser')
  return worker.start()
}
```

> `import.meta.env.MODE` で vite のモードを判別できます（通常は `development`、`production` ですが、ここでは `mock` モードを追加）。


## 5. モックモード専用の起動スクリプトを追加

`package.json` に以下のようなスクリプトを追加して、モック用に vite を起動できるようにします。

```json
{
  "scripts": {
    "dev:mock": "vite --mode mock"
  }
}
```

これで以下のコマンドでモック環境が立ち上がります：

```bash
npm run dev:mock
```

---

## 6. Service Worker ファイルの生成

MSWを初めて使うときは、Service Worker ファイルを生成する必要があります。

```bash
npx msw init public/ --save
```

このコマンドで `public/mockServiceWorker.js` が生成され、Viteの開発サーバー経由で読み込まれるようになります。


## まとめ

- MSWを使えば、ブラウザ上で実際の通信をせずにAPIをモックできる
- `vite --mode mock` のようなカスタムモードと組み合わせることで、**開発・モック・本番**を柔軟に切り替えられる
- 静的ファイルは `passthrough()` で除外し、余計なモック干渉を防げる


## 参考リンク

https://mswjs.io/

https://vitejs.dev/guide/env-and-mode.html
Geminiでブレイカーを描いてみた。

# 概要

Geminiでブレイカーを描いてみました。

# 実装

プロンプトは以下の通りです。

```
炎の斧を使うブレイカーを描いてみてください。
```

![炎の斧を使うブレイカー_20250405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/24e4bf6e-ab7f-453c-8e59-b55968617db3.png)

```
氷の斧を使うブレイカーを描いてください。ロープレ風でお願いします。
```

![氷の斧を使うブレイカー_20250406.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/3345b707-ec7f-448c-a050-c76e99d111b3.png)

```
電撃の斧を使うブレイカーを描いてください。
```

![電撃の斧を使うブレイカー_20250406.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/742aba2e-3886-4013-a818-e1021fc940dc.png)

```
光の斧を使うブレイカーを描いてください。
```

![光の斧を使うブレイカー_20250406.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/b5f6ef30-a8dc-4aae-b191-982aeac16c71.png)

```
水の斧を使うブレイカーを描いてください。 ロープレ風でお願いします。
```

![水の斧を使うブレイカー_20250406.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/47b5c2f5-b5ed-4fc6-973c-c3d1f02729ff.png)

なかなか興味深い画像ばかりです。

# まとめ

何かの役に立てばと。
配列を扱う関数のまとめ

# 配列を扱う関数
配列を扱う関数は様々ありますが、一部をまとめます。
この関数を使用することで、新しい関数の作成が容易になったりします。

## map
元の配列に対し、関数を適応して新しい配列を作成する関数です。
もとの配列は変更されない。
```js
const array = [1, 2, 3, 4, 5];
const double = array.map((number) =>  number * 2 );
console.log(double); // [2, 4, 6, 8, 10]
```
mapは、例えばリスト内の数値をすべて2倍にするなど、配列の各要素を変換する際に非常に便利です。

## filter
もとの配列に対し、条件に合致するものを取り出して、新しい配列を作成する関数です。
もとの配列は変更されない。
```js
const array = [1, 2, 3, 4, 5];
const twe = array.filter((number) =>  number == 2);
console.log(twe)  // [2]
```
この例では、配列から「2」のみを抽出しています。filterは特定の条件に合った要素だけを集めたいときに使います。

## foreach
各要素に対し、関数を適応するが新しい配列は作成しない。
主に副作用（表示や更新など）を実行するために使用する。
新しい配列は作成されない
```js
const array = [1, 2, 3, 4, 5]
const each = array.foreach((number) => { 
    console.log(number); // 1 2 3 4 5
})
```
forEachは、例えば配列の要素をコンソールに出力したり、別の処理を行ったりする場合に役立ちます。

## find
条件に合うもので最初のもののみを取得する。
出力されるものは一つのみ
```js
const array = [1, 2, 3, 4, 5]
const find = array.find((number) => number > 3)
console.log(find) // 4
```
findは、条件を満たす最初の要素を探すときに便利です。例えば、配列から最初に「3より大きい数」を見つける場合に使います。

## some
条件に合うものがあれば true を返し、なければ false を返す。
```js
const array = [2, 4, 6, 8, 10]
const some = array.some((number) => number / 2 == 0 )
console.log(some); // true
```
someは、条件に合う要素が配列に1つでも存在するかどうかを確認したいときに使います。

## every
すべての要素が条件に合っている場合に true を返し、そうでない場合は false を返す。
```js
const array = [2, 4, 6, 8, 10]
const every = array.every((number) => { number > 0 && number / 2})
console.log(every) // true
```
everyは、例えばすべての要素が「正の数」かどうかをチェックしたいときに便利です。

## 結論

配列操作のメソッドは、JavaScriptでの開発において非常に重要なツールです。それぞれのメソッドには特定の目的と用途があり、状況に応じて使い分けることができます。これらをうまく活用することで、コードの可読性と保守性を高めることができます。
Flow Optimization Superbadge Unit



+ コレクションフィルター
+ スケーラブルな自動化
+ ユーザーエクスペリエンス 

https://trailhead.salesforce.com/content/learn/superbadges/superbadge_flow_optimization_sbu


# スタッフ推奨フローを更新する

スタッフ推奨フロー を更新して複雑さを軽減し、効率を高めます。 

何もしないで検証ボタンをクリックする

:::note alert
The 'Staff Recommendation' flow contains unneeded elements.


「スタッフ推奨」フローに不要な要素が含まれています。
:::

フローをみたら既にエラーがある。意味がわからんな。

:::note alert
Values assigned to “MatchThisBook” aren’t saved to the database. To update the record that launches the flow, assign values to $Record fields.

「MatchThisBook」に割り当てられた値はデータベースに保存されません。フローを起動するレコードを更新するには、$Record フィールドに値を割り当てます。
:::

:::note alert
The 'Staff Recommendation' flow does not contain the expected element. Make sure the new element applies criteria to the collection, and then outputs only the items that meet the criteria.


「スタッフ推奨」フローには、予期された要素が含まれていません。新しい要素がコレクションに基準を適用し、基準を満たすアイテムのみを出力することを確認してください。
:::

?

:::note alert
The 'Staff Recommendation' flow still triggers on non-relevant records. Make sure to allow only records where the Favorite_Genre__c field is populated to trigger the flow.


「スタッフの推奨」フローは、関連性のないレコードでも引き続きトリガーされます。フローをトリガーするには、Favorite_Genre__c フィールドに値が入力されているレコードのみを許可するようにしてください。
:::

元から存在するエラーは解消してないけど、合格。意味が全く理解できません。次はもう違うフローみたいだし...


# 予約注文数フローを更新する

要件に応じて、Book Order Countフローを更新します。


何もしないで検証ボタンをクリックする

:::note alert
The loop in the 'Book Order Count' flow is not optimized for processing record updates.


「Book Order Count」フローのループは、レコード更新の処理用に最適化されていません。
:::


翻訳された日本語を読んでも意味が分からないですね、なんかおかしい。何がしたいのかがさっぱり理解できませんね。今回もフローの設定と言うよりは英語が理解できるかが問われているだけですね。分からん。

予約済みがtrueかどうかを数えている？

An existing Book Order Count flow uses an Apex action to get a collection of the Id, Preordered, and Quantity values of all book line items for each book order

:::note alert
We can't find an assignment that increments flow variable varUpdatePreorderedCount with the correct quantity of preordered books.


フロー変数 varUpdatePreorderedCount を、予約注文された本の正しい数量で増分する割り当てが見つかりません。
:::

？？？　どうしろと？

:::note alert
The loop in the 'Book Order Count' flow is not optimized for processing record updates.
:::

全く意味が分かりません。

:::note alert
We can't find the 'Book Order Count' flow with the correct initial criteria.


正しい初期基準を持つ「Book Order Count」フローが見つかりません。
:::

英文の意味が理解できないので、総当たりで条件を変更


# 書籍注文フローの QA タスクの作成を更新します

要件に応じて、書籍注文フローの QA タスクの作成を更新します。

何もしないで検証ボタンをクリックする

:::note alert
We can't find the expected adjustment to the 'Create QA Task for Book Order' subflow that assigns a task to the QA team.


QA チームにタスクを割り当てる「ブックオーダーの QA タスクの作成」サブフローに期待される調整が見つかりません。
:::
[Unity] GameWindowの解像度を切り替える

ChatGPTもGeminiもCopilotも、何度か質問を繰り返してもリフレクションで何とかしようとしてうまくいかなかったのですが、
Editor,GameWindow,Resolutionでググったらすぐ出てきました。

```
#if UNITY_EDITOR
    PlayModeWindow.SetCustomRenderingResolution(1024, 1024, "1024x1024");
#else
    Screen.SetResolution(1024, 1024, false);
#endif
```
AIで行き詰ったらたまにはググれということですね。

ちなみに現時点(04/16/2025)でAIに聞くと、多くが下記のようなコードを教えてくれました。
推奨しないコードですが、困った人がググったときにこの記事にたどり着きやすいように、一応置いておきますね
```DO_NOT_USE.cs
#if UNITY_EDITOR
using UnityEditor;

public class GameViewResolutionChanger
{
    public static void SetGameViewSize(int width, int height)
    {
        // GameViewのサイズを設定
        var group = UnityEditorInternal.GameViewSizes.instance.currentGroup;
        var index = FindSizeIndex(group, width, height);
        
        if (index == -1)
        {
            AddCustomSize(group, width, height);
            index = FindSizeIndex(group, width, height);
        }
        
        SetSize(index);
    }

    private static int FindSizeIndex(UnityEditorInternal.GameViewSizeGroup group, int width, int height)
    {
        for (int i = 0; i < group.GetBuiltinCount() + group.GetCustomCount(); i++)
        {
            var size = group.GetGameViewSize(i);
            if (size.width == width && size.height == height)
                return i;
        }
        return -1;
    }

    private static void AddCustomSize(UnityEditorInternal.GameViewSizeGroup group, int width, int height)
    {
        group.AddCustomSize(new UnityEditorInternal.GameViewSize(UnityEditorInternal.GameViewSizeType.FixedResolution, width, height));
    }

    private static void SetSize(int index)
    {
        var gameViewType = typeof(EditorWindow).Assembly.GetType("UnityEditor.GameView");
        var gameView = EditorWindow.GetWindow(gameViewType);
        var sizeField = gameViewType.GetProperty("selectedSizeIndex", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
        sizeField.SetValue(gameView, index);
    }
}
#endif
```
Next.js個人備忘録①：ReactベースのNext.jsを初めて学習！基本機能と使い方を記事にまとめてみた

## はじめに
Next.jsは、Reactをベースにしたフレームワークで、サーバーサイドレンダリング（SSR）や静的サイト生成（SSG）など、柔軟なレンダリング方式を提供してくれるのが特徴です。

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

個人開発・チーム開発のどちらでも活用されており、SEOやパフォーマンスにも強い影響を与える技術です。

## 書こうと思ったきっかけ
受講中のITスクールで取り組んでいるハッカソンにおいて、Next.js を採用することが決まりました。それに伴い、自分でもキャッチアップが必要となったため、基本的な概念から導入手順までを整理する目的で、この記事を作成しました。

## 基本構成と特徴
- Reactベースのフレームワーク
- SSR（サーバーサイドレンダリング）対応
- SSG（静的サイト生成）対応
- API Routes でバックエンド機能も一部実装可能
- 自動ルーティング（pages ディレクトリ構成）
- TypeScript, Tailwind CSSなどとの統合が容易

## 導入手順（初回）
```bash
npx create-next-app@latest my-next-app
cd my-next-app
npm run dev
```
これで `localhost:3000` でアプリケーションが立ち上がります。

## ディレクトリ構成（例）
```
my-next-app/
├── pages/
│   ├── index.js
│   └── about.js
├── public/
├── styles/
├── components/
└── next.config.js
```

## サーバーサイドレンダリング（SSR）
`getServerSideProps` を使うと、ページがリクエストされるたびにデータを取得して表示できます。
```js
export async function getServerSideProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();
  return { props: { data } };
}
```

## 静的サイト生成（SSG）
ビルド時にデータを取得するには `getStaticProps` を使います。
```js
export async function getStaticProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();
  return { props: { data } };
}
```

## API Routes（バックエンド的な使い方）
`pages/api/hello.js` のようにすると、簡単なAPIエンドポイントを定義できます。
```js
export default function handler(req, res) {
  res.status(200).json({ message: 'Hello from API!' });
}
```

## まとめ
Next.jsは、Reactをさらに発展させて、より本番向けのWebアプリケーション開発に特化したフレームワークです。

:::note warn
***SSRやSSGなどの高度な機能を簡単に使えることから、これからのフロントエンド学習・実務には必須のツールだと感じています。***
:::

今後は、認証（NextAuth.js）やCMS連携（例：microCMS）などの応用例についても試してみたいと思っています！
gh コマンドでPR作る→Webで表示する→マージする

# はじめに
最近、GitHub の ghコマンドを利用し始めました。
その中で、PR作る → WEBで表示する → マージする → をよくするので使っているコマンドをご紹介します。

ghコマンドを使っていなく、あー、便利そう！って思うきっかけになれば幸いです。

# ghコマンドの勝手に思っている基本構成
この考えで、コマンドを覚える苦手感を減らしています。

```
gh 対象 操作
```

# PRを作るコマンド

```ghc-cmm
gh pr create
```

# 作ったPRをブラウザで表示するコマンド
```ghc-cmm
gh pr view --web
```

# 作ったPRをマージするコマンド
```ghc-cmm
gh pr merge
```
# 公式リファレンス

https://cli.github.com/manual/gh
個人的備忘録：ECS Fargateで発生する CannotPullContainerError の原因と対処法をまとめてみた

## はじめに
Amazon ECS Fargate を使ってアプリケーションをデプロイする際、コンテナイメージの取得に失敗し `CannotPullContainerError` が発生することがあります。

:::note warn
**このエラーは、ECS が ECR（Elastic Container Registry）からコンテナイメージを pull できないときに起きるものです。**
:::

この記事では、エラーの原因と対処法を自分用に整理しておきます。

## 書こうと思ったきっかけ
友達との開発で ECS + Fargate を使ったアプリケーションのデプロイを行っていた際、このエラーで5分以上足止めをくらいました。

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

単純な `push` の漏れや `tag` の不一致が原因だったので、今後同じことを繰り返さないよう備忘録として残します。

---

## エラー内容
Amazon ECS Fargate でタスクを実行した際に、以下のようなエラーが発生することがあります：

```
CannotPullContainerError: pull image manifest has been retried 1 time(s):
failed to resolve ref xxx.dkr.ecr.ap-northeast-1.amazonaws.com/reverse-proxy-django-nginx:latest: not found
```

同様のエラーが `reverse-proxy-django-app:latest` についても発生している場合、以下の原因が考えられます。

---

## 主な原因

1. **ECRにイメージが存在しない**  
   指定されたリポジトリに `latest` タグの付いたイメージが存在しない

2. **Docker push を忘れている**  
   ビルド後に ECR への push をしていない

3. **リポジトリ名の誤り**  
   ECS のタスク定義で指定している名前が間違っている

4. **タグ名のミスマッチ**  
   `latest` ではなく `v1.0.0` などのタグしか存在しない

---

## 対処方法

## 1. ECR の確認

AWS CLI または AWS コンソールで、以下のコマンドで確認します：

```bash
aws ecr describe-images \
  --repository-name reverse-proxy-django-nginx \
  --region ap-northeast-1

aws ecr describe-images \
  --repository-name reverse-proxy-django-app \
  --region ap-northeast-1
```

## 2. `latest` タグつきイメージの push

これらが存在しない場合は、Docker イメージを build して、ECR に push します：

```bash
# ログイン
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxx.dkr.ecr.ap-northeast-1.amazonaws.com

# ビルド
docker build -t reverse-proxy-django-nginx .

# タグづけ
docker tag reverse-proxy-django-nginx:latest xxx.dkr.ecr.ap-northeast-1.amazonaws.com/reverse-proxy-django-nginx:latest

# push
docker push xxx.dkr.ecr.ap-northeast-1.amazonaws.com/reverse-proxy-django-nginx:latest
```

`reverse-proxy-django-app` についても同様に実行します。

## 3. ECS タスク定義の確認

ECS の task definition で指定しているイメージ URI に誤りがないか確認します。

---

## 補註

- `latest` タグは Docker build 時に明示的に付けないと ECR に push されません
- 将来的には、明確なバージョンタグ (`v1.0.0` など)を利用するのが正確です

---

## まとめ
今回のエラーは Docker イメージの push 漏れやタグ名のミスといった、基本的な操作ミスに起因していました。

- ECR 上にあるべきイメージを確認し、正しいタグ名で push すること。
- タスク定義の内容も見直して、リポジトリ名とタグの一致を確保すること。

今後は build → tag → push の流れをシェルスクリプト化し、再発防止につなげていきたいと思います！
AtCoder Beginner Contest 400(ABC400)振り返り(初参加)

## はじめに

AtCoder Beginner Contest(ABC)初参加ということで、ABC400に参戦しました。
慣れない(本来この時間は既に寝ている)環境の中、今回は2問解きました。

今回はC++で挑戦しました。

## 概要

- AtCoder Beginner Contest 400に参加した
- 数学教養不足
- A問題はボーナス問題
- B問題は法則性を見つけ出してどうにかAC(正解)
- C問題以降、今の私には無理
- 圧倒的数学教養不足

## A - ABC400 Party

ABC400回記念問題が多かったのですが、これもそのうちの一つです。
読み解くのに若干時間がかかりましたが、これは明らかにボーナス問題でした。ありがたい。

<details><summary>ABC400 A 提出コード</summary>

```cpp:A.cpp
// A - ABC400 Party
#include <bits/stdc++.h>
using namespace std;

int main() {
  int A;
  cin >> A;

  if (400 % A <= 0) {
    cout << 400 / A << endl;
  } else {
    cout << -1 << endl;
  }
  return 0;
}
```

</details>

何故`==`じゃなくて`<=`なのかは聞かないでください。眠かったんです。多分。

## B - Sum of Geometric Series

今回は400回記念であると同時に、数学祭りでもありました。
自分の数学素養の無さが露呈してしまい、再履修が必要かな、と思いました。

入力例1から法則性を導き出して、どうにかAC獲得。
pow関数の返し値がdoubleということで、doubleを使って行うようにしました。
表示がe表記になってしまったので、std::fixedとstd::setprecision(0)を使っています。

<details><summary>ABC400 B 提出コード</summary>

``` cpp:B.cpp
// B - Sum of Geometric Series
#include <bits/stdc++.h>
using namespace std;

int main() {
  int N, M;
  cin >> N >> M;

  double sum = 1;
  for (int i = 1; i <= M; i++) {
    sum += pow(N, i);
  }
  if (sum > 1000000000) {
    cout << "inf" << endl;
  } else {
    cout << fixed << setprecision(0);
    cout << sum << endl;
  }
  return 0;
}
```

</details>

## C問題から先

ここから先、問題文だけは見ましたが、今の私にはちょっと理解不能です。
数学祭りだとやはり厳しいですね。

## まとめ

今回のコンテストで数学素養が足りないのを痛感したので、まずは数学の勉強から始めようと思いました。
あと、ABCやDaily Trainingには引き続き出来うる限り参加します。場数を踏むのも大切ですから。
windows11で、sketchup6 その52

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
プラグインのテスト、見つけたので、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a8a81e09-3103-4460-9033-402ea88a628c.png)



# サンプルコード

```

require 'sketchup.rb'

class ToolTests
	def activate
		puts "activate called"
	end
	def deactivate(view)
		puts "deactivate called"
	end
	def draw(view)
		puts "draw called"
	end
	def getExtents
		puts "getExtents called"
	end
	def getMenu(menu)
		puts "getMenu called"
	end
	def onCancel(reason, menu)
		puts "onCancel called"
	end
	def onKeyDown(char, rpt, flags, view)
		puts "onKeyDown called"
	end
	def onKeyUp(char, rpt, flags, view)
		puts "onKeyUp called"
	end
	def onLButtonDoubleClick(flags, x, y, view)
		puts "onLButtonDoubleClick called"
	end
	def onLButtonDown(flags, x, y, view)
		puts "onLButtonDown called"
	end
	def onLButtonUp(flags, x, y, view)
		puts "onLButtonUp called"
	end
	def onMouseEnter(view)
	end
	def onMouseLeave(view)
	end
	def onMouseMove(flags, x, y, view)
	end
	def onRButtonDoubleClick(flags, x, y, view)
		puts "onRButtonDoubleClick called"
	end
	def onRButtonDown(flags, x, y, view)
		puts "onRButtonDown called"
	end
	def onRButtonUp(flags, x, y, view)
		puts "onRButtonUp called"
	end
	def onReturn(view)
		puts "onReturn called"
	end
	def onUserText(text, view)
		puts "onUserText called"
	end
	def resume(view)
		puts "resume called"
	end
	def suspend(view)
		puts "suspend called"
	end
end

if( not file_loaded?("tooltests.rb") )
	plugins_menu = UI.menu("Plugins")
	plugins_menu.add_item("ToolTests") { 
		Sketchup.active_model.select_tool ToolTests.new 
	}
end





```

以上。
DatabricksにMeta Llama 4がやってきました！

こちらの発表です。

https://www.databricks.com/blog/introducing-metas-llama-4-databricks-data-intelligence-platform

Llama 4の特徴は:

> - 標準ベンチマーク全体での高品質な出力
> - MoEアーキテクチャのおかげで推論が40%以上高速化され、トークンごとにモデルの重みの一部のみをアクティブにすることで、よりスマートで効率的な計算が可能に。
> - より長いコンテキストウィンドウ（最大100万トークンをサポート）、これにより長い会話、より大きなドキュメント、より深いコンテキストが可能に。
> - 12言語をサポート（Llama 3.3の8言語から増加）
> - 推論コストの削減

とにかく動かしてみます。AWSのTokyoリージョンのワークスペースにアクセスします。

先日の[Claude 3.7 Sonnet](https://qiita.com/taka_yayoi/items/9ccf1949933936a28264)の隣に**Llama 4 Maverick**が！

![Screenshot 2025-04-06 at 6.33.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/76ff54f6-3d3b-482d-a524-9d8da57603b7.png)

とりあえず、AI Playgroundで。

![Screenshot 2025-04-06 at 6.34.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/eb5e154b-9829-455f-b641-66d209abcc9e.png)

元記事で紹介されているようにノートブックからも動かします。

```py
%pip install -U -qqqq mlflow openai
dbutils.library.restartPython()
```

サービングエンドポイントにアクセスするので、[シークレット](https://docs.databricks.com/aws/ja/security/secrets)に格納してある[パーソナルアクセストークン](https://docs.databricks.com/aws/ja/dev-tools/auth/pat)およびエンドポイントのURLを設定しておきます。

```py
import os

DATABRICKS_TOKEN = dbutils.secrets.get("demo-token-takaaki.yayoi", "pat")
DATABRICKS_BASE_URL = 'https://' + spark.conf.get('spark.databricks.workspaceUrl') + '/serving-endpoints/'
print(DATABRICKS_BASE_URL)
```

MLflow Tracingも動かします。

```py
import mlflow
mlflow.openai.autolog()
```

```py
from openai import OpenAI

client = OpenAI(api_key=DATABRICKS_TOKEN, base_url=DATABRICKS_BASE_URL)

chat = client.chat.completions.create(
  messages=[
  {
    "role": "system",
    "content": "あなたはAIアシスタントです"
  },
  {
    "role": "user",
    "content": "大規模言語モデルについて教えてください"
  }
  ],
  model="databricks-llama-4-maverick",
)

print(chat.choices[0].message.content)
```
```
大規模言語モデル（だいきぼげんごモデル、英: large language model、LLM）は、大量のテキストデータで訓練された統計的言語モデルであり、単語の並びから次に出現する単語を予測して、自然言語処理タスクを実行するように設計されている。大量のパラメータ（数億から数千億の重み）を持つトランスフォーマー・アーキテクチャの人工ニューラルネットワークを使用している。膨大なデータで訓練されているため、大規模言語モデルは多様な言語パターンを保持しているように見える。さらに、事前訓練済み言語モデルは、特定の下流タスク（感情分析など）において、少量のタスク固有のデータでファインチューニング（少量のデータで追加の訓練）を行うことで、モデル全体をタスク固有のデータのみで訓練するよりも、はるかに優れたパフォーマンスを発揮する。

2023年現在、一般に公開されている大規模言語モデルには、Llama、Falcon、Mistral、ChatGPTなどがある。大規模言語モデルは、チャットボット、文章の要約、翻訳、文章生成など、幅広い用途に使用できる。ただし、偏見の拡大、誤情報の拡散、雇用への影響、著作権で保護された素材の不正利用など、社会的リスクを軽減するために、大規模言語モデルがどのように開発・使用されるべきかについて、懸念が表明されている。
```

![Screenshot 2025-04-06 at 6.55.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e7722e73-8161-4409-8d7e-1871c5d411b3.png)

新しいモデルに驚いている暇が無いほど、新モデルや新技術がすごいスピードで出てきてますが、それらを学び活用する能力が今後はさらに求められることになりそうです。頑張って勉強&実践します。

そして、元記事には以下の予告も:

> - Llama 4 Scout – 最大1000万トークンの長いコンテキスト推論に最適
> - 高スケールバッチ推論 – 本日バッチジョブを実行、近日中により高いスループットサポートが追加予定
> - マルチモーダルサポート – ネイティブビジョン機能が近日登場

お楽しみに！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
画面の結果を受け取る

画面を閉じた時に前の画面の結果によって処理を分ける方法をメモします。`ActivityResultContracts.StartActivityForResult`を使用します。
Activity → Activityの遷移で結果を受け取る方法です。

呼び出し元
```kotlin
class MainActivity : AppCompatActivity() {

    private val launcher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result ->
        when (result.resultCode) {
            RequestCode.OK.id -> {
                // 成功処理
            }
            RequestCode.CANCEL.id -> {
                // 処理がキャンセルされた
            }
            RequestCode.FAILED.id-> {
                 // 処理成功
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            launcher.launch(intent)
        }
    }
}
```

呼び出し先
```kotlin
class ResultActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        button.setOnClickListener {
            try {
                if (false) {// なんらかの条件の時
                    setResult(RequestCode.CANCEL.id)
                    finish()
                }


                setResult(RequestCode.OK.id)
                finish()
            } catch (e: Throwable) {
                setResult(RequestCode.FAILED.id)
                finish()
            }
        }
    }
}
```
リクエストコード
``` kotlin
enum class RequestCode(val id: Int) {
    ALL(1000),
    CANCEL(1001),
    FAILED(1002),
}
```

呼び出し先で`finish`する際に処理の判断によって`setResult`の中身を変えています。
結果の判断方法として`Activity.RESULT_OK`や`Activity.RESULT_FIRST_USER`がありますが、こちらはコードの処理の意図がわかりにくいため、成功・キャンセル・失敗の値を自分で作成して使用します。



#### 参考リンク

https://developer.android.com/training/basics/intents/result
別のシーンで名前を表示させたい

## GameManagerに入れる

名前を変数で管理しているので、シーン変更した時にわかりやすいようGameManagerに保存します

---
* 名前変数を追加
```
public string playerName;
```

* 名前入力後の格納
```
GameManager.instance.playerName = myName;
```
* 別のシーンで使う
```
string name = GameManager.instance.playerName;
```
ゲームの入力制御を状態管理で分ける


## 名前を入力中に他のスプリクトが「Enter」を拾ってしまう -> 入力のバッティング
「ゲーム状態」をGameManagerで一旦管理して、スクリプトごとに「この状態の時だけ動く」と制限をかけた。

### 名前を入力する際に後ろの吹き出しの入力を止める方法


---
### まずゲーム全体の状態を管理する

新しいスクリプトex)GameManagerを作成して、以下のようにする
```
public enum GameState
{
    Playing,    // 普通の状態（探索とか）
    Naming,     // 名前入力中
}

public class GameManager : MonoBehaviour
{
    public static GameManager instance; // どこからでもアクセスできるようにする

    public GameState gameState = GameState.Playing;

    void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject); // シーンをまたいでも保持
        }
        else
        {
            Destroy(gameObject); // ダブり防止
        }
    }
}
```

### コードの説明
```
public enum GameState
{
    Playing,    // 普通の状態（探索とか）
    Naming,     // 名前入力中
}
```
ここはゲームの状態を分けるための**型**を作成
* enum GameDtateとは
　名前付きの数字
 ```
 // 実際にはこういう数字が割り当てられてる
Playing = 0,
Naming  = 1
```
なので**比較演算子**などで使用が可能

* Awake()メソッド
　初期化の処理
 ```
 void Awake()
{
    if (instance == null) // 初めて作られたかチェック
    {
        instance = this; // このオブジェクトを自分自身として登録
        DontDestroyOnLoad(gameObject); // シーンを切り替えても消えないようにする
    }
    else // すでに１つあったら、２つ目を破棄
    {
        Destroy(gameObject);
    }
}
```

---
### GameManagerスクリプトの使い方
最初はPlayingにしておいて、名前を入力する際に
```
GameManager.instance.gameState = GameState.Naming;
```
を設定する
生成AI活用の進化戦略：構成フェーズで捉える業務自動化のロードマップ

## はじめに

生成AIが登場し、「使うこと」自体が目的化していた初期フェーズから、
いまや「どう構成し、何を自動化し、どう再利用するか」が問われる時代に突入している。

この記事では、生成AIの活用を「業務への浸透段階」と「構成の成熟度」で整理し、構成ロードマップに落とし込んで紹介する。

---

## 活用フェーズと構成進化マップ

生成AI導入の現場で起こる進化は、以下の5つのフェーズに分類できる：

| フェーズ | 目的 | ユーザー体験 | 得られる成果 | 構成上の注目点 |
|----------|------|----------------|----------------|------------------|
| **1. 試行期（黎明）** | ユーザーにAIとの対話を経験させる | 手動入力、毎回考える | 業務ニーズの可視化、言語化支援 | UI、プロンプト自由度、対話ログ |
| **2. 定型化期（成長）** | パターン化された処理を再利用可能に | テンプレ選択式、ペルソナ指定 | 処理の標準化、属人性の排除 | プロンプト保存、パラメータ化、バリエーション設計 |
| **3. 観測期（機能）** | 利用ログから業務パターンを抽出 | よく使う構成が見えてくる | 自動化候補の抽出、利用分析 | エージェントごとの使用頻度、目的別分類、モニタリング基盤 |
| **4. 自動化期（転換）** | 人が触らずともAIが業務を実行 | 通知ベース、非同期処理へ移行 | 対話レス自動処理、時間短縮 | Function/API統合、定期トリガー、例外時のみ介入 |
| **5. 転写期（抽象）** | 他業務/部署/ドメインへの再構成 | ユニバーサルな業務モデル化 | 組織横断のナレッジ資産化 | 汎用テンプレート、設計パターン化、再利用指針 |

---

## 技術を抽象化して捉える：再現性ある構成のために

| 要素 | 技術名の例 | 抽象化された役割 |
|------|--------------|------------------|
| 対話インタフェース | チャットUI, Voice Agent | ユーザー入力の取得面、要求の形式化 |
| 意味処理 | LLM, Embedding | 入力の解釈・再構成、知識化 |
| 振る舞い制御 | ペルソナ, Instruction | 出力の文体・方針の定義 |
| 実行処理 | Function, API, Workflow | 処理の自動化、結果の返送 |
| 状態保存 | プロンプト保存, Memory | 処理の再利用性、構成の蓄積 |
| モニタリング | ログ分析, Insights | 利用傾向の可視化、改善点の発見 |

---

## こう使う：真似できる構成アプローチ

### ステップ1：「練る構成」をあえて毎回やらせる

現在の構成では、あえて自動保存や構成テンプレート化を導入せず、
ユーザーに毎回ペルソナや指示を手入力してもらう設計としている。

これは単なる“未実装”ではなく、**明確な戦略的意図**に基づいた判断である。

> **手動で構成を練る＝ユーザーに業務構造を再解釈させる設計**

- 書き直すこと：業務手順を言語化・整理すること  
- 試行錯誤すること：曖昧な判断基準を明示化すること  
- 比較すること：より良い業務フローを考察すること  

この“あえての不便さ”こそが、業務改善の余白であり、
構成の質を上げるプロセスである。

完成を急がず、**業務の本質に向き合う時間を残すUX設計**──  
これが、手動フェーズの最大の価値である。

---

### ステップ2：「保存」と「選択式UI」で反復性をつくる

- ユーザーが練った構成をテンプレ化  
- UI上で選べるようにすることで運用可能な形に昇華

---

### ステップ3：「利用ログ」を取る設計にしておく

- 誰が・いつ・どの構成を使ったかを記録  
- → パターンの濃淡や頻度を元に、自動化可能性を可視化

---

### ステップ4：「定型化された処理」を非対話で起動

- FunctionやLogic Appsなどに切り出して“裏で実行”  
- → チャットUIを使わず業務処理が完了

---

### ステップ5：「他業務に転写可能な構成」を抽出

- 「この構成、他の部署でも使える？」という問いで精査  
- → ペルソナや出力形式だけ変えて、再利用可能構成へ

---

## 最後に：今後進むべき進化とは？

### 自分専用、自社専用──“育てるエージェント”の時代へ

「今年はエージェントの年」と多くのメディアが語る中で、  
本質的な分岐点は「与えられた汎用エージェントを使うか」「自分たちで構成するか」にある。

> **真の自動化は、“他人のエージェントに合わせる”ことではなく、  
> “自分の業務に合わせてエージェントを練り上げる”ことから始まる。**

- ペルソナを定義し  
- プロンプトを調整し  
- モデルを選び  
- 対話の流れを改善し  
- 業務ごとに専用の流れを組み  
- よく使われるものをテンプレート化し  
- 定型化したものは非対話で自動処理に昇華する

このプロセスを経て構築されたエージェントは、単なる「対話ツール」ではなく、  
**“企業の業務構造をそのまま写し取った、自律的な業務装置”**になる。

それは他社には真似できない。オンリーワンのAIエージェントだ。

生成AI活用の未来は「持っていること」ではなく、  
**“どう育て、どう業務と溶け合わせていけるか”**にある。
iPhoneのショートカットを使用して素早く通知機能付きのメモを作る

# 目的
忘れないようにと思ってメモを取ろうとしてもロックを解除してアプリを開いてと手間が多いですよね。。
冬の時期はマスクもしていて面倒。
そこで、ロック解除せずにメモを作る機能を「ショートカット」という標準アプリを用いて作ろうという話です。

# 要件
- iPhoneで「ショートカット」、「リマインダー」のアプリがあること
- iOS16以上(ロック画面をカスタマイズできること)

## やり方
1. ショートカットアプリを開く
1. 左下のショートカットを押す
1. 右上の「＋」を押して新規ショートカットを作成
1. 「アクションを追加」をクリックし、検索欄で、「リマインダー」を検索する
1. スクロールし、「新規リマインダー」をクリック
1. 追加されたスクリプトの文章を選択し、以下のようにする
    1. リマインダー　-> 「毎回尋ねる」(キーボード上の部分を横にスクロール)をクリック
    1. メモ ->そのまま
    1. 通知なし -> 通知
    1. 午後2:00 -> 「毎回尋ねる」をクリック
1. 上部の「新規リマインダーを追加」部分を押して名前を変更
1. 右上の完了をクリック
1. 作成したものを左上に移動させる
1. ホーム画面に戻り背景を長押して「＋」ボタンを押してウィジェットを追加
1. 「ショートカット」のアプリを探し、先ほど作ったアプリを選択してウェジェットを追加する
1. 完了

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/3913d1dc-36d6-4d5b-bea0-cbb1af9aa9be.png" width=23% >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/3f35c135-1cff-4aa0-b2d1-96490aa824d2.png" width=23% >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/cde4b3c7-45be-420c-91c6-4f59f667d719.png" width=23% >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/526d83b6-d374-498b-9f1f-7e02d776f6a6.png" width=23% >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/39bfb3df-9e84-4595-994c-4a15c6994ff9.png" width=23% >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/92a5c7bb-c11c-406d-b1c4-3e9f6e33c945.png" width=23% >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/6ff73fad-bc26-42d2-9855-ed3906b56de6.png" width=23% >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/794864c1-63ab-4c7b-afbc-146d3fd55a47.png" width=23% >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/6783c2ef-b7d3-41d9-9550-98b320b06925.png" width=23% >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/ae83387a-c0f0-4a78-bd56-aab48bd5eb95.png" width=23% >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/09b8bcc9-ab12-48b9-af72-14124a8f1d9a.png" width=23% >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/87079529-c3f3-4589-8629-83a2856d5406.png" width=23% >

このようにすることで、ロック状態でもショートカットのウィジェットをクリックし、内容と時刻を入力して通知付きメモを作成することができます。
画面ロックしていてもできるので便利です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/0f485f2f-2511-4802-a6bd-ef0fb31add06.png" width=23%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/80bb5463-db7e-4ae2-9705-8c26e52c5819.png" width=23%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/e90055d8-221c-43e6-8f39-3d56cd8174b8.png" width=23%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478972/14cd82b4-260d-4230-924d-8c52ad0b2777.png" width=23%>

## その他
他にも「ショートカット」を使えばロック画面を解除せずに色々とできます！
個人的には背景を毎日変更する機能がおすすめです。
pythonで任意の桁の値を取る

## 最初に概要

この記事はプログラミング初心者がモチベーションを保つために１日に学んだことなどをひたすらに書いていくものです。

多分qiitaを見ている多くの人には全く意味のないものですが温かい目で見てくださると何よりです。

## 任意の桁の値を取得

任意の桁の値はインデックス[]で取得します。
整数部は一の位、十の位、百の位がそれぞれ[-1], [-2], [-3]、小数部は小数点第一位、第二位、第三位がそれぞれ[0], [1], [2]に相当しています。

つまり以下のように取得できます。

```python
sum = 56.7231
n = str(sum)
n_a , n_b = n.split('.')

print(n_b[2])
# 3

print(n_a[-1])
# 6

print(n_b[0])
# 7
```

となります。
ちなみになぜn.splitで整数部と小数部で分けるのかというと小数点の{.}の部分が文字列のまま入ってしまうからだと判明しました。
納得