OmniAICreator/Qiita-1.07M huggingface dataset:
【UiPath Apps】UiPath AcademyのレガシーサンプルをWindows11で動かしてみた（2/2)

## サマリー
学習を兼ねて修正を行ったUiPath AcademyのAppsのサンプル「UiPath Bank Teller Application」について、さらに改良を加えてみました。

UiPath Studioを使って開発をしたことはあるけれど、Appsは初心者の方向けの記事です。

## 環境
作成していた時期は2025年2月です。
UiPathはコミュニティエディション、Studioは2025です。
PCのOSはWindows11です。

## 変更した内容
### 主な変更
- 日本語化しました
- Defer Process（ローン繰延）ページのAt Risk（リスク有無）を別のコンテナーに移動し、3列にしました
- カスタムリストの中の各テキストに、商品名等のラベルを追加しました
- カスタムリストに表示された行をクリックすると、繰延ローンの情報がテキストボックスに自動的に入力されるようにしました

改修後
![改修後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053584/8662d49b-9487-479a-a6db-0b73fa9e4fb3.png)
改修前
![改修前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053584/aff10f3e-59b9-4320-a7f5-b2879bbcb1e7.png)

### 細々した変更
- 入力欄のツールチップやラベルに説明を追加しました。ユーザー側のオペレーション要員教育の工数を減らす目的です
- Defer Months（繰延月数）は、整数のテキストボックスにしました。手入力の際、整数以外を入力できないようにするためです
- アイコンが設定されていないボタンにもアイコンを追加しました。これは、問い合わせ時の情報の混乱を減らし、ボタン名称でも「〇〇アイコンのボタン」でも通じるようにすることを目的としています。しかしながら、アイコンサイズが小さいことから、別の工夫が要りそうです
- テキストボックスに色を付けました。カテゴライズ目的です
- テキストの文字が、バインドすると斜体字、無効化すると灰色文字になるのは解除できませんでした。バインドを使用せずに、ジョブが終了した時点で出力引数をテキストに代入する方法は実現できました。しかし、見た目の点を除けば、バインドを使用したほうが良いように感じます
- ボタンを押したとき、入力欄が空ならエラーポップアップを出すようにしました
- 繰延できない普通口座（ACCOUNT）を繰延しようとすると、エラーポップアップを出すようにしました

## 苦労した点
テキストボックスのValue属性に値をセットする場合、WriteOnlyでした。
- できない×　テキストボックスのValue属性←ほかのテキストボックスのValue属性
- できる〇　テキストボックスのValue属性←プロセスの出力引数もしくはアプリの変数

カスタムリストにプロセスのデータテーブル型の出力引数をバインドする場合、列名をThisRowに書きます。列名がBALANCE（残高）の場合は以下の書き方です。
```ThisRow("BALANCE").ToString```
ThisRowはカスタムリストの外からは参照できません。
各行処理アクティビティを思い浮かべるとしっくりきました。

Apps開発画面は、30秒にいちど自動保存されます。エクスポート機能を使ってバックアップができますが、Undoできるとありがたいです。

## Appsの利用シーンをイメージ
UiPath Appsに適している業務として、以下のような特徴を持つものが考えられます。

- 処理量はそれほど多くない
- 結果によって上長へのエスカレーションが必要
- 一件ずつ検索や確認が求められる

既に単純な操作を大量に処理する業務は自動化が進んでいる一方で、さらなる効率化が求められる状況では、プロセスのみの実行よりも柔軟な対応ができるUiPath Appsを利用することで、期待に応えることができそうです。
🚀 Macにrbenvをインストール

Ruby のバージョン管理には `rbenv` を使うのが便利です。以下の手順に沿ってセットアップしていきましょう。

---

### 1. Homebrew を最新の状態に更新

Homebrew のインストールがまだの場合は以下の記事を参考にインストールします。

https://qiita.com/nobumory/items/dad4a7fe0c9cc408f531

Homebrew 本体と、利用可能なパッケージ情報（Formula）を最新にしておきます。

```bash
brew update
```

---

### 2. rbenv をインストール

次に、Ruby のバージョン管理ツール `rbenv` をインストールします。

```bash
brew install rbenv
```

---

### 3. rbenv の動作確認

正しくインストールされたか、バージョンを確認しましょう。

```bash
rbenv --version
```

---

### 4. インストール可能な Ruby バージョンを確認

`rbenv` を使って、どのバージョンの Ruby がインストール可能かをチェックします。

```bash
rbenv install --list
```

例えば、こんな感じで出てきます：

```
3.1.7
3.2.8
3.3.7
3.4.2
```

---

### 5. 最新の Ruby をインストール

表示された中から、最新バージョン（例：3.4.2）をインストールします。

```bash
rbenv install 3.4.2
```

---

### 6. 使用する Ruby バージョンを設定

#### システム全体（グローバル）で使うバージョンを指定する場合：

```bash
rbenv global 3.4.2
```

#### プロジェクトごとに個別設定したい場合は、カレントディレクトリで指定：

```bash
rbenv local 3.4.2
```

---

### 7. シェル設定ファイルを編集（rbenv 初期化）

`.zshrc` に rbenv の初期化コードを追加して、インストールした Ruby を使えるようにします。

```bash
vi ~/.zshrc
```

以下の1行を追加：

```bash
# rbenv の初期化（インストールした Ruby を有効化）
eval "$(rbenv init -)"
```

---

### 8. シェルを再起動して設定を反映

```bash
exec $SHELL -l
```

---

これで Ruby のセットアップは完了です🎉
2024年プログラミング言語シェア率比較表


2024年のプログラミング言語シェアについては、様々な指標がありますが、主要な調査に基づいた概算値を示します。これらの数値は調査方法や対象範囲によって異なることをご了承ください。

## 主要プログラミング言語のシェア (2024年)

## TIOBE Index (2024年前半)
| 順位 | 言語 | シェア率 |
|------|------|---------|
| 1 | Python | 15-16% |
| 2 | C | 13-14% |
| 3 | C++ | 12-13% |
| 4 | Java | 10-11% |
| 5 | C# | 6-7% |
| 6 | JavaScript | 3-4% |
| 7 | SQL | 2-3% |
| 8 | Go | 1.5-2% |
| 9 | PHP | 1.5-2% |
| 10 | Swift | 1.5% |

## GitHub での使用率 (2024年前半)
| 順位 | 言語 | シェア率 |
|------|------|---------|
| 1 | JavaScript | 24-25% |
| 2 | Python | 16-17% |
| 3 | Java | 8-9% |
| 4 | TypeScript | 8-9% |
| 5 | C++ | 6-7% |
| 6 | PHP | 5-6% |
| 7 | C# | 5% |
| 8 | C | 4-5% |
| 9 | Go | 3-4% |
| 10 | Ruby | 2-3% |

## Stack Overflow Developer Survey (2023-2024)
| 順位 | 言語 | 使用開発者の割合 |
|------|------|-----------------|
| 1 | JavaScript | 65% |
| 2 | HTML/CSS | 55% |
| 3 | SQL | 50% |
| 4 | Python | 48% |
| 5 | TypeScript | 38% |
| 6 | Java | 30% |
| 7 | C# | 27% |
| 8 | Bash/Shell | 26% |
| 9 | C++ | 20% |
| 10 | PHP | 18% |
| 11 | Go | 14% |

## 分野別シェア率

### モバイル開発
| 言語/フレームワーク | シェア率 |
|-------------------|---------|
| Kotlin (Android) | 25-30% |
| Swift (iOS) | 20-25% |
| Flutter/Dart | 15-20% |
| React Native | 15-20% |

### クラウド・DevOps
| 言語 | シェア率 |
|------|---------|
| Python | 30% |
| Go | 15-20% |
| JavaScript/TypeScript | 15% |
| Bash/Shell | 10-15% |
## 注意点
- これらの数値は複数の調査を統合した概算値です
- 特定の分野（ウェブ、データサイエンス、組み込みなど）によって言語のシェアは大きく異なります
- 多くの開発者は複数の言語を使用しているため、合計が100%を超えることがあります

Golangに関しては、特にクラウドインフラ、マイクロサービス、DevOpsの分野で着実に成長しており、全体的なシェアとしては約3-4%程度ですが、特定の業界では10%以上のシェアを持っています。
ネットワークセキュリティとVPN技術に関する理解：プロキシサーバとIPsecの仕組み

## はじめに
本記事では、ネットワークセキュリティの基本技術としてよく利用されるプロキシサーバと**VPN（仮想プライベートネットワーク）**に関する内容をまとめ、応用情報技術者試験の対策として役立つ情報を提供します。特に、IPsecを利用したセキュアな通信経路の確立と、それに関連する機器（ルータ、ファイアウォール、スイッチ）の動作について説明します。

試験対策として重要なポイントは、プロキシサーバを使った通信経路の管理や、VPN経由でのセキュアな通信を行うための技術的な仕組みをしっかりと理解することです。これらの技術がどのようにネットワークのセキュリティを保護しているのかを把握しましょう。

## 1. ネットワーク経路とプロキシサーバ経由の通信
・外出先や営業所からインターネットにアクセスする際、プロキシサーバ経由で行う：
外出先のNPC（ネットワーク端末）がインターネットにアクセスする際、プロキシサーバを経由して、インターネット上のWebサーバにアクセスします。プロキシサーバは、アクセスする際に中継役を果たし、セキュリティやアクセス制限を管理します。

## 2. VPN（仮想プライベートネットワーク）
・インターネットVPNとIP-VPN：
インターネットVPNは、インターネットを介してセキュアな通信を確立するための手段です。通信はIPsec（IP Security）などを使用して暗号化され、外部の攻撃者からデータを保護します。

IP-VPNは、専用線を使ってセキュアな通信を行います。一般的により高い信頼性とセキュリティを提供します。

・IPsecの仕組み：
IPsecは、インターネットVPNで利用されるセキュアな通信を提供するための技術で、通信を暗号化するための**ESP（Encapsulating Security Payload）と、認証と暗号化を管理するIKE（Internet Key Exchange）**を使用します。

## 3. IPsecとその動作
・ESP（Encapsulating Security Payload）：
暗号化と認証を提供し、データのセキュリティを保護します。インターネットを通過するデータのペイロード（実際のデータ部分）を暗号化し、データ改竄を防ぎます。

・IKE（Internet Key Exchange）：
IKEは、IPsecトンネルを確立するために使用されるプロトコルで、セッション鍵を安全に交換し、暗号化に使用します。また、通信開始時にセキュアなチャネルを確立し、その後のデータ通信で利用する暗号化アルゴリズムや認証方式を決定します。

## 4. プロキシサーバとセキュリティ
・プロキシサーバの役割：
プロキシサーバは、外部との通信を中継する役割を果たします。例えば、外出先のNPCがインターネットにアクセスする際、プロキシサーバを通じてアクセスすることにより、セキュリティ管理やキャッシュ管理が行われます。

HTTPS通信の場合、プロキシサーバは通常中間者攻撃を防ぐためにSSL/TLSインターセプト（中間者攻撃防止のためのSSL証明書を使った復号）を使用することがあります。

## 5. VPN経由のアクセスとIPsecルータ
・IPsecルータ：
IPsecルータは、IPsecを使用して安全なVPN接続を提供します。通信する際、暗号化されたパケットを受け取り、復号してから目的地に送信します。通信内容はインターネットを経由してもセキュアです。

ESPとIKEを使い、セキュリティを確保するためのトンネルを確立します。

・インターネットVPN経由でのアクセス：
IPsecルータがセキュアな通信経路を提供し、外部のネットワークとの接続を暗号化します。

インターネットを経由しても、セッション鍵を使って通信を暗号化し、外部の攻撃者からデータを保護します。

## 6. ネットワーク機器とセキュリティ技術
・FW（ファイアウォール）とL3SW（レイヤ3スイッチ）：
FW（ファイアウォール）は、ネットワークの境界でトラフィックのフィルタリングを行い、セキュリティを強化します。

L3SW（レイヤ3スイッチ）は、ネットワーク層でのルーティングを担当し、送信元と宛先のIPアドレスに基づいてデータを適切な経路に振り分けます。

・セキュリティ対策：
プロキシサーバやファイアウォール、VPNルータを利用することで、外部からの攻撃や不正アクセスを防ぎ、安全な通信環境を確保します。

## 7. まとめ
・ネットワークセキュリティでは、プロキシサーバやVPN、IPsecなどの技術を駆使して、通信内容を暗号化し、安全なデータ通信を確立することが重要です。

・IPsecルータを使うことで、インターネットVPNを経由してセキュアな通信を行い、ESPでデータの暗号化、IKEでセッション鍵の交換を行います。

・プロキシサーバは、外部とのアクセスを中継し、セキュリティを高める役割を果たします。
【メモ】reduceとは？

# 基本構文
```
array.reduce((累積値, 現在の要素, 現在のインデックス, 配列全体) => {
  // 処理内容
}, 初期値);
```

+ 累積値（acc とか total と書かれる）→ 前回の結果（蓄積された値）
+ 現在の要素（cur）→ 今処理している要素
+ 初期値 → reduce の最初の 累積値 として使われる

## 例①：配列の合計を求める

```
const numbers = [1, 2, 3, 4];

const sum = numbers.reduce((acc, cur) => {
  return acc + cur;
}, 0);

console.log(sum); // 10
```

acc は最初は 0。
　→ 1回目：0 + 1 → 1
　→ 2回目：1 + 2 → 3
　→ 3回目：3 + 3 → 6
　→ 4回目：6 + 4 → 10

 ### 例②：オブジェクトの配列から合計を取る

 ```
 const items = [
  { name: "apple", price: 120 },
  { name: "banana", price: 80 },
  { name: "orange", price: 100 }
];

const totalPrice = items.reduce((acc, item) => acc + item.price, 0);

console.log(totalPrice); // 300
```

#### 例③：配列から頻度表を作る
```
const fruits = ["apple", "banana", "apple", "orange", "banana", "apple"];

const count = fruits.reduce((acc, fruit) => {
  acc[fruit] = (acc[fruit] || 0) + 1;
  return acc;
}, {});

console.log(count);
// { apple: 3, banana: 2, orange: 1 }
```

acc をオブジェクトとして使って、各フルーツの出現回数をカウントしている

##### reduce を使うべき場面

+ 合計値や平均を出したいとき
+ 配列からオブジェクトを作りたいとき
+ 配列を加工して別の形に変換したいとき（カスタムな集計）

###### わかりやすくするコツ

+ 最初は for や forEach で同じ処理をしてみてから reduce に書き換えると理解が早い
+ 初期値をしっかり決める（配列やオブジェクトでもOK）
バックエンド技術選定（Golang Vs Node.js）

# Golang vs Node.js の比較と選定アプローチ

## 主な違い

### 言語と実行環境
- **Go (Golang)**: 静的型付け、コンパイル言語。Googleが開発したシステムプログラミング向け言語。
- **Node.js**: JavaScript（動的型付け、インタープリタ言語）のサーバーサイド実行環境。

### パフォーマンス
- **Go**: 
  - コンパイル型でネイティブコードを生成するため高速
  - 並行処理（goroutines）に優れている
  - メモリ効率が良い
- **Node.js**: 
  - シングルスレッド・イベント駆動型アーキテクチャ
  - I/O集約型タスクに強い
  - 計算集約型タスクではパフォーマンスが落ちる可能性がある

### 開発速度と学習曲線
- **Go**: シンプルな文法と標準ライブラリが充実しているが、新しい言語のため学習が必要
- **Node.js**: JavaScriptの知識があれば始めやすい、npmの豊富なパッケージエコシステム

### 用途
- **Go**: マイクロサービス、CLIツール、高性能バックエンド、システムプログラミング
- **Node.js**: Webアプリケーション、APIサーバー、リアルタイムアプリケーション

## 技術選定のアプローチ

### プロジェクトの要件に基づいて選定

1. **高いパフォーマンスが必要な場合** → Go
   - 低レイテンシが求められるシステム
   - 大量データ処理
   - 高トラフィックを処理するサービス

2. **迅速な開発が必要な場合** → Node.js
   - プロトタイピング
   - フロントエンドとバックエンドで同じ言語を使いたい場合
   - 開発チームがJavaScriptに精通している場合

3. **同時処理が多い場合** → Go
   - 多数の同時接続を処理するシステム
   - マイクロサービスアーキテクチャ

4. **I/Oバウンドなアプリケーション** → Node.js
   - ストリーミングアプリケーション
   - リアルタイム通信が必要なアプリ

5. **DevOpsツールやCLIアプリケーション** → Go
   - シングルバイナリにコンパイルできる利点
   - 依存関係の少なさ

最終的な選定では、チームのスキルセット、プロジェクトのタイムライン、スケーラビリティの要件、および将来のメンテナンス性を考慮することをお勧めします。
「AtCoder Beginner Contest 237B - Matrix Transposition」メモ

## 問題
AtCoder Beginner Contest 237

https://atcoder.jp/contests/abc237/tasks/abc237_b

## 考察
`ans`という`h*w`の二次元配列を0で初期化して用意する。次に$ans_{ji}$に$a_{ij}$を代入する。このとき、$ans_{ij}$と$a_{ji}$だとうまくいかないので注意する。
## ACコード
```py
h,w=map(int,input().split())
a = [list(map(int, input().split())) for _ in range(h)]

ans = [[0]*h for i in range(w)]

for i in range(h):
    for j in range(w):
        ans[j][i] = a[i][j]


for b in ans:
    print(*b)
```
【React】returnを書き忘れて表示されない話【JavaScript】


## はじめに

Udemyで某React入門講座( https://www.udemy.com/course/modern_javascipt_react_beginner/ )を見ながらToDoアプリを作っていたとき、**リストが表示されない**という現象に出くわしました。  
`console.log`でデータもちゃんとあるのに、**画面に何も出ない**……。けどエラーも出ないので、解決に時間がかかりました。

---

## 起きたこと：`.map()` でリストが表示されない

以下は、問題が起きた当時のコードです。

```jsx
export const IncompleteTodos = (props) => {
  const { todos } = props;

  return (
    <ul>
      {todos.map((todo, index) => {
        <li key={index}>
          ~何らかの処理~
        </li>;
      })}
    </ul>
  );
};
```

## 正解コード①

ちなみにこれは動きます

```jsx
export const IncompleteTodos = (props) => {
  const { todos } = props;

  return (
    <ul>
      {todos.map((todo, index) => (
        <li key={index}>
          ~何らかの処理~
        </li>
      ))}
    </ul>
  );
};
```
## 正解コード②

答えは単純で、returnを書き忘れていました。
```jsx
export const IncompleteTodos = (props) => {
  const { todos } = props;

  return (
    <ul>
      {todos.map((todo, index) => {
        return (                         //明示的
        <li key={index}>
          ~何らかの処理~
        </li>
      )})}
    </ul>
  );
};
```

明示的にreturnを書くと正解コード②になります。
今回の返り値は1行なので、returnを省略することができます。
ゆえに正解コード①は暗黙のreturnとなっています。

問題のコードでエラーメッセージがないのは、返り値のない関数（`.map()`の返り値は`undefind`）と認識されたからでした。

## 振り返り
React、というよりJavaScriptは複数の書き方があって読みづらいですね…
いろんな記法、パターンを勉強して身に着けておいたほうがよさそうです
JavaScriptで予約語、keywordを変数として使用

JavaScriptでは予約語やkeywordを識別子(変数名)に使える状況が多々あります(過言)。どういう事でしょうか?

## 予約語
識別子として使用不可なものは `break`,`case`,`catch`,`class`,`const`,`continue`,`debugger`,`default`,`delete`,`do`,`else`,`export`,`extends`,`false`,`finally`,`for`,`function`,`if`,`import`,`in`,`instanceof`,`new`,`null`,`return`,`super`,`switch`,`this`,`throw`,`true`,`try`,`typeof`,`var`,`void`,`while`,`with`。
それに加え厳格("use strict")な場所で使用不可になるものは `let`、`static`、`yield`。
`let`は`let`や`const`で宣言する時とclass定義内でも予約語。
`static`はclass定義内でも予約語。
`yield`はGenerator関数本体でも予約語。
```js
//let
function _(){var let=0}
function _(){let let=0}//error
function _(){const let=0}//error
function _(){"use strict";var let=0}//error
class _{constructor(){var let=0}}//error
//yield
function _(){var yield=0}
function*_(){var yield=0}//error
function _(){"use strict";var yield=0}//error
//static
var static=0;
function _(){"use strict";var static=0}//error
class _{constructor(){var static=0}}//error
```
`await`は非同期関数内やmodule内で予約語。
```js
function _(){var await=0}
async function _(){var await=0}//error
```
```html
<script type=module>
var await=0//error
</script>
```
## 特別な識別子
`arguments`、`as`、`async`、`eval`、`fom`、`get`、`of`、`set`はkeywordでなくても、ある文脈で特別な意味を持つ

## 実践編
```js:of祭り
let of=[of=>of=>of];
for(of of of)of(of)(of);

for([]of[]);
for([]of[,]);//error
```
```js:async祭り
let async=async function async(async=async=>async){return++async}
```
```js:object
//化石Browserでは動作しかねる
let a={let:0,var:0,const:0,function:0,return:0,
	do:0,for:0,while:0,break:0,continue:0,
	with:0,if:0,else:0,try:0,catch:0,finally:0,
	switch:0,case:0,default:0,
	class:0,extends:0,debugger:0,super:0,
	new:0,delete:0,in:0,instanceof:0,void:a=>a,
	throw:0,export:0,import:0,true:0,false:0,this:0,null:0
};
a.void(0);
a.let++;a.if++;a.this++;
```
何が優先されるかな?
```js:with祭り
with({if:a=>console.log(a)})if(1);
with({do:a=>console.log(a),while:a=>console.log(a)}){do(0);while(0)}
with({typeof:a=>typeof(a)})console.log(typeof(0)=="string");
with({void:a=>b=a,b:1})void(0),console.log(b);
(function*(a){with({yield:a=>console.log(a)})yield(a)})(0);
(async function(a){with({await:a=>console.log(a)})await(a)})(0);
```
## 参考文献
[字句文法](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Lexical_grammar#%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89)
Chrome DevToolsのServiceWorker　

![ServiceWorker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3997611/9a451861-19ca-43a3-9ad2-66df2f80e95c.png)




通知での挙動
'badge'
通知に小さなバッジアイコン（通常は白黒）を表示。スマホや一部ブラウザに対応。badge-icon.png が使われる。

'image'
通知に**大きな画像（バナー）**を表示（上部または中央に表示）。画像は banner.jpg。主にデスクトップ向け。

'requireInteraction'
通知が自動で消えず、ユーザーが操作するまで画面に残るようになる。

'tag'
通知に一意の識別子（タグ）を設定。同じタグの通知が来た場合、古い通知が上書きされる。

'renotify'
'tag' と一緒に使う。通知が上書きされたときにも、再度通知音やバイブを鳴らすようになる。

'silent'
通知音やバイブを鳴らさないようにする（静かな通知）。

'vibrate'
モバイルデバイスなどでバイブレーションをカスタムパターンで鳴らす（例：200ms振動→100ms停止→200ms振動）。

'timestamp'
通知に現在の時刻を表示する。一部ブラウザで「●分前」などが表示されるようになる。

'data'
通知にカスタムデータ（ここではURL）を埋め込む。通知クリック時にそのデータを利用できる。

'dir'
通知のテキストの向きを指定。"rtl"（右から左）なので、アラビア語などが正しく表示される。

'lang'
通知に言語情報を設定（例：日本語）。bodyも日本語にして、ローカライズ通知を作る例。
生成AIエージェントと脳の構造（気になる論文）

論文のタイトル「ADVANCES AND CHALLENGES IN FOUNDATION AGENTS FROM BRAIN-INSPIRED INTELLIGENCE TO EVOLUTIONARY, COLLABORATIVE, AND SAFE SYSTEMS」

Google翻訳による「脳にヒントを得た知能から進化的、協調的、安全なシステムまで、基盤エージェントの進歩と課題」

https://arxiv.org/abs/2504.01990

論文の概要の日本語訳（ChatGPTによる）

 大規模言語モデル（LLM）の登場は人工知能における変革的な転換点をもたらし、高度な推論、強力な知覚、多様な領域における柔軟な行動を可能とするインテリジェントエージェントの実現を促進しました。こうしたエージェントがAI研究や実用化の最前線を担う中、その設計・評価・継続的改善には複雑かつ多面的な課題が横たわっています。本サーベイでは、認知科学・神経科学・計算論的研究の知見を統合し、人間の脳を手本としたモジュール型アーキテクチャの枠組みでインテリジェントエージェントを位置づけ、その全体像を包括的に概説します。

 まず第１部では、エージェントを構成するモジュール基盤に焦点を当て、人間の脳機能との対応を示しながら、記憶、世界モデル、報酬処理、感情様システムなどの中核コンポーネントを体系的にマッピングします。

 第２部では、自己強化と適応的進化のメカニズムを論じ、エージェントが自律的に能力を磨き、動的環境に適応し、AutoMLやLLM駆動の最適化戦略を含む自動化された最適化パラダイムを通じて継続学習を実現するプロセスを探ります。

 第３部では、マルチエージェントシステムにおける協調と進化を考察し、エージェント間の相互作用や協力、社会構造から生まれる集合知を、人間社会のダイナミクスと比較しながら明らかにします。
 
 最後に第４部では、安全・安心かつ有益なAIシステムの構築という喫緊の課題に取り組み、内的・外的なセキュリティ脅威、倫理的アライメント、堅牢性、そして実運用に向けた具体的な緩和策を論じます。

 本サーベイは、モジュラーAIアーキテクチャと異分野の知見を融合することで、主要な研究ギャップや課題、今後の機会を浮き彫りにし、技術的進歩と社会的利益の調和を図る革新を促進することを目指します。なお、本プロジェクトのGitHubリポジトリは以下のリンクからご覧いただけます。

 
 https://github.com/FoundationAgents/awesome-foundation-agents
SQL #4 【JOIN】

# JOINとは
JOIN とはその名の通り**結合**です。複数のテーブルをまとめて、そこから検索を行います。

本来 FROM で指定したテーブルからのみデータを検索しますが、JOIN を使用することにより複数のデータを扱うことができます。

# データの準備
### membersテーブル
|id|name|age|team_id|
|---|---|---|---|
|1|Yamamoto|20|1|
|2|Sato|25|3|
|3|Yamada|16|2|
|4|Tanaka|35|1|
|5|Kato|42|4|

### teamsテーブル
|id|team_name|
|---|---|
|1|BLUE|
|2|GREEN|
|3|RED|

# INNER JOIN（内部結合）
複数のテーブルを共通のキーで結びつけて、両方のテーブルに存在するデータだけを結合します。

### 基本構文
```sql
SELECT カラム名1, カラム名2, ... FROM テーブル名1
  INNER JOIN テーブル名2 ON 結合の条件;
```
1. テーブル1からカラム1、カラム2を取得
2. 結合の条件に従ってテーブル2からも取得
3. 結合

### 具体例
```sql
SELECT * FROM members
  INNER JOIN teams ON members.team_id = teams.id;
```

1. membersテーブルから全てのカラムを取得し、
2. membersテーブルの team_id と teamsテーブルの id を対応させた状態で、
3. teamsテーブルを結合

### 実行結果
|id|name|age|team_id|id|team_name|
|---|---|---|---|---|---|
|1|Yamamoto|20|1|1|BLUE|
|2|Sato|25|3|3|RED|
|3|Yamada|16|2|2|GREEN|
|4|Tanaka|35|1|1|BLUE|

:::note info
**membersテーブルのKatoはどこへ？**
Katoの team_id は 4 だが、teamsテーブルの id に 4 は存在しません！
**内部結合では、条件にマッチするレコードがないものは、結果セットから外れます。**
→ だから Kato は表示されなかったのです。
:::

# OUTER JOIN（外部結合）
内部結合のようにそれぞれのテーブルの指定したカラムの値が一致するものを結合するのに加え、結合条件に一致しない行も含めて結果に出すことができます。

### 基本構文
```sql
SELECT カラム名1, カラム名2, ... FROM テーブル名1
  LEFT(RIGHT) JOIN テーブル名2 ON 結合の条件;
```
- **LEFT JOIN** : 左側のテーブルを軸にして結合
- **RIGHT JOIN** : 右側のテーブルを軸にして結合

### 具体例
```sql
SELECT * FROM members
  LEFT JOIN teams ON members.team_id = teams.id;
```

### 実行結果
|id|name|age|team_id|id|team_name|
|---|---|---|---|---|---|
|1|Yamamoto|20|1|1|BLUE|
|2|Sato|25|3|3|RED|
|3|Yamada|16|2|2|GREEN|
|4|Tanaka|35|1|1|BLUE|
|5|Kato|42|4|NULL|NULL|

:::note info
**Katoが結果セットに含まれている！**
内部結合では表示されなかった Kato が、外部結合では表示されています。
**外部結合では、結合条件に一致しない側のカラムには NULL が入る**
:::

# おまけ
OUTER JOINには LEFT, RIGHTの他に FULL があるが、実行環境によっては非対応の場合もあるので注意が必要です。

# まとめ
:::note info
- **JOIN** は 複数のテーブルを**結合**するもの
- **INNER JOIN** は結合条件に一致するもののみ結果セットに含む
- **OUTER JOIN** は内部結合の働きに加え、一致しない場合は **NULL** として結果セットに含む
:::

# 参考文献
[SQLのJOINを完全に理解する](https://qiita.com/sho19202325/items/04dc93d1e26e05d77bf2)
[SQL素人でも分かるテーブル結合(inner joinとouter join)](https://zenn.dev/naoki_mochizuki/articles/60603b2cdc273cd51c59)
IAMユーザが自身のPWを変更する為に必要な権限を教えて下さい

## 困っていた内容

IAMユーザがマネジメントコンソールより自身のパスワードを変更しようとした所
出来なかった。IAMユーザにはIAMUserChangePasswordというAWS管理のポリシーを付与している。

## どう対応すればいいの?
先ずはIAM ⇒　アカウント設定よりユーザーにパスワードの変更が許可されているか確認

![2025-04-04_17h11_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516945/36f85cae-5681-4c8b-816f-14e0f404f08d.png)

対象のIAMユーザーに以下のポリシーをアタッチ


```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:ChangePassword",
                "iam:GetLoginProfile",
                "iam:UpdateLoginProfile"
            ],
            "Resource": [
                "arn:aws:iam::*:user/${aws:username}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:GetAccountPasswordPolicy"
            ],
            "Resource": "*"
        }
    ]
}
```

上記ポリシーアタッチ後に問題無くPWの変更が可能となりました!
モックAPIを学んだ結果、POSTやPUTの理解が深まった話

## 学習の目的と背景
実務で本番用のAPIを叩かずにモックAPIを使ってPOSTやPUT処理を実装する必要が出てきたため、試して実務で使えるようにしたいと思った

## 使用技術スタック
- React
- TypeScript
- msw (Mock Service Worker) 2.7.3
- axios

## 躓いたポイント
- public ディレクトリの下に mockServiceWorker.js を置く必要があったが、作成しておらず動作しなかった
- 公式ドキュメントを確認する前に、ChatGPTに質問しながら試していたが、古いバージョンの話をされていたためエラーの原因を特定するまで時間がかかった

## 得られた気づきと学び
- 最近はChatGPTなどのおかげで新しいことに対しての学習ハードルは低くなったと感じていますが、全てを鵜呑みにせず公式ドキュメントも確認することが大切
- POSTやPUTを叩いた後にresponseが返ってきて、その結果をフロントに反映させる流れは理解していましたが、フロントからPOSTしたリクエストボディに対してバックエンドで追加の情報(idなど)を与えてフロントにレスポンスとしてreturnできるっていうことを知らなくてこれはすごいと思いました。フロント側でidなど必要な情報を渡した上でPOSTするのだとずっと思っていたので気づけてよかったです。
- stateで管理しているデータとレスポンスの型を揃えておけば、responseされたデータを使ってそのままstateの更新が可能となる。(例 todoリスト全体の状態を管理するstate変数とPOSTしてreturnされるレスポンスの型を揃えておく)

## 参考にした記事
- [公式ドキュメント](https://mswjs.io/docs/migrations/1.x-to-2.x)
【応用情報】既知のエラーデータベース(KEDB : Known Error DataBase)

## 既知のエラーデータベース(KEDB : Known Error DataBase)
　既知の誤りに関する情報を格納するデータベースを、一般に、**既知のエラーデータベース**(**KEDB : Known Error DataBase**)という。KEDBは、問題管理によって作成され、インシデント管理及び問題管理において、新たに発生した問題が過去に発生した問題かどうかの確認に用いられるデータベースである。

## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
令和06-07年 応用情報技術者 試験によくでる問題集【午後】 単行本（ソフトカバー） – 2024/3/22
大滝 みや子 (著)
p.617
SwiftUIボタンの形の不審な枠　解決方法

こちらで紹介したボタンの形ですが、解決方法がございます。

https://qiita.com/yuta317/items/b95aadc3160f36dc312d

原因としてはbuttonStyleを設定していない事です。
コメントで教えて頂きました。

ただ、buttonStyleを設定すると見た目上は確かに不審な枠が消えるのですが、
ボタンのタップ範囲が狭くなってしまいました。


こちらがこのタブの修正後の実装です

![スクリーンショット 2025-03-29 18.54.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/8baa4b8c-ccd3-432c-9b9d-66ad14c89eb3.png)


```.swift
HStack(spacing: 0) {
    ForEach(0..<menuItems.count, id: \.self) { index in
        Button {
            withAnimation {
                selectedTab = index
            }
        } label: {
            HStack(spacing: 0) {
                Spacer()
                Text(menuItems[index].label)
                    .foregroundColor(index == selectedTab ? .black : .gray
                Spacer()
            }.background(.white)
            
        }
        .buttonStyle(.plain)
    }
}

```
`.buttonStyle(.plain)`と`.background(.white)`を追加しました。
Button内のlabelにbackgroundを指定してあげないとタップ範囲がテキスト部のみで、ボタン全体にならないみたいです。
Vue 3での状態管理、Piniaの基本的な使い方まとめ


こんにちは！今回は、Vue 3の公式状態管理ライブラリ「Pinia」の使い方について、初心者の方向けにわかりやすくまとめました。

---

## ✅ 導入手順まとめ

1. **Piniaのインストール**
   ```bash
   npm install pinia
   ```

2. **VueアプリにPiniaを登録**
   ```js
   // main.js に追加
   import { createPinia } from 'pinia'
   app.use(createPinia())
   ```

3. **ストアを作成**
   ```js
   // src/stores/counter.js に追加
   import { defineStore } from 'pinia'

   export const useCounterStore = defineStore('counter', {
     state: () => ({ count: 0 }),
     getters: {
       doubleCount: (state) => state.count * 2
     },
     actions: {
       increment() {
         this.count++
       }
     }
   })
   ```

4. **コンポーネントでストアを使用**
   ```vue
   <!-- src/components/Counter.vue に追加 -->
   <script setup>
   import { useCounterStore } from '@/stores/counter'
   const counter = useCounterStore()
   </script>

   <template>
     <p>{{ counter.count }}</p>
     <button @click="counter.increment">+1</button>
   </template>
   ```

## 🧹 Piniaとは？

PiniaはVue 3用の公式な状態管理ライブラリで、以下のような特徴があります：

- 軽量 & シンプルなAPI
- Composition APIとの高い親和性
- 型安全（TypeScriptとの相性が良い）
- Vue Devtoolsに対応

---

## 🚀 セットアップ

まずはPiniaをインストールして、Vueアプリに導入しましょう。

### 1. インストール（ターミナル）

```bash
npm install pinia
```

### 2. アプリにPiniaを登録（`src/main.js`）

```js
// main.js
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

const app = createApp(App)

// PiniaをVueに組み込む
app.use(createPinia())

// アプリをマウントする
app.mount('#app')
```

---

## 🛠 ストアの作成（`src/stores/counter.js`）

次に、ストア（状態を管理する場所）を作ります。

```js
// stores/counter.js
import { defineStore } from 'pinia'

// ストアを定義（名前は 'counter'）
export const useCounterStore = defineStore('counter', {
  // 状態（state）を定義
  state: () => ({
    count: 0  // カウントの初期値
  }),
  // ゲッター（算出プロパティ）を定義
  getters: {
    doubleCount: (state) => state.count * 2  // countの2倍を返す
  },
  // アクション（状態を変更する関数）を定義
  actions: {
    increment() {
      this.count++  // countを1増やす
    }
  }
})
```

### 各部分の役割

- **state**：リアクティブな状態（data）
- **getters**：算出プロパティ（computed）
- **actions**：状態を変更する関数（methods）

---

## 💡 コンポーネントで使ってみよう（例：`src/components/Counter.vue`）

```vue
<!-- Counter.vue -->
<script setup>
// ストアをインポート
import { useCounterStore } from '@/stores/counter'

// ストアを使う
const counter = useCounterStore()
</script>

<template>
  <div>
    <!-- ストアの状態を表示 -->
    <p>Count: {{ counter.count }}</p>
    <p>Double: {{ counter.doubleCount }}</p>

    <!-- アクションを呼び出すボタン -->
    <button @click="counter.increment">+1</button>
  </div>
</template>
```

`useCounterStore()` を呼ぶだけで、ストアにアクセスできます。とってもシンプル！

---


## 📁 ディレクトリ構成

```bash
src/
├─ stores/
│   └─ counter.js          # ストア定義ファイル
├─ components/
│   └─ Counter.vue         # UIコンポーネント
├─ App.vue
├─ main.js                # エントリーポイント
```

---

## 📝 まとめ

PiniaはVue 3にとって、非常に使いやすく直感的な状態管理ライブラリです。Vuexよりも学習コストが低いため、これからVueを学ぶ方には特におすすめです。
Let's Encrypt で Overleaf Toolkit を HTTPS 化した手順まとめ

こんにちは！今回は、社内で使っている Overleaf Toolkit を **Let's Encrypt** を使って HTTPS 化（TLS化）した際の設定手順をまとめました :memo:

社内運用やプライベートクラウドでも、**TLSで安全にアクセス**したいですよね。本記事では、NGINXによるTLSプロキシ構成を導入し、Let's Encryptの無料SSL証明書を活用してHTTPSを実現したステップを詳しく紹介します。

## :gear: 前提条件

- Overleaf Toolkit（Community Edition）導入済み
- ドメインがある（例：`your-domain.example.com`）
- そのドメインがサーバーのパブリックIPに向いている
- `bin/` や `config/` ディレクトリがある構成になっている
- 80番/443番ポートが空いている or 調整可能

## :rocket: ステップバイステップで HTTPS 化！

### 1. NGINX を使った TLS プロキシ構成の初期化

```bash
bin/init --tls
```

これで以下のファイルが作られます：

- `config/nginx/certs/overleaf_key.pem`
- `config/nginx/certs/overleaf_certificate.pem`

実運用ではこれらを Let's Encrypt の本物の証明書と置き換えます。

### 2. Let's Encrypt の証明書を取得

#### Certbot をインストール（Ubuntu）

```bash
sudo apt update
sudo apt install certbot
```

#### サーバーがポート80で待ち受けていないことを確認

```bash
sudo lsof -i :80
```

#### ファイアウォールでポート80を開放

```bash
sudo ufw allow 80
sudo ufw allow 443
```

#### Certbot 実行（スタンドアロンモード）

```bash
sudo certbot certonly --standalone -d your-domain.example.com
```

成功すると以下に証明書が発行されます：

- `/etc/letsencrypt/live/your-domain.example.com/fullchain.pem`
- `/etc/letsencrypt/live/your-domain.example.com/privkey.pem`

### 3. 証明書ファイルを Overleaf にコピー

```bash
sudo cp /etc/letsencrypt/live/your-domain.example.com/fullchain.pem config/nginx/certs/
sudo cp /etc/letsencrypt/live/your-domain.example.com/privkey.pem config/nginx/certs/
sudo chown ddd3h:ddd3h config/nginx/certs/*.pem
```

### 4. `config/overleaf.rc` を編集

```ini
NGINX_ENABLED=true
NGINX_HTTP_PORT=80
TLS_PORT=443
NGINX_HTTP_LISTEN_IP=0.0.0.0
NGINX_TLS_LISTEN_IP=0.0.0.0
TLS_CERTIFICATE_PATH=config/nginx/certs/fullchain.pem
TLS_PRIVATE_KEY_PATH=config/nginx/certs/privkey.pem
OVERLEAF_PORT=8081  # ポートバッティング回避のため変更
```

### 5. `.env` 設定（HTTPS対応）

```env
OVERLEAF_BEHIND_PROXY=true
OVERLEAF_SECURE_COOKIE=true
```

### 6. `lib/docker-compose.base.yml` の確認

```yaml
services:
  sharelatex:
    ports:
      - "${OVERLEAF_LISTEN_IP:-127.0.0.1}:${OVERLEAF_PORT:-8081}:80"
```

ポート80バインドを避けるため、環境変数で `OVERLEAF_PORT=8081` を設定しています。

### 7. 起動確認

```bash
bin/down
bin/up
```

もしくは、本番運用では以下がおすすめ：

```bash
bin/stop
bin/start
```

## :mag: 確認するポイント

- `https://your-domain.example.com` にアクセスできるか
- 自己署名証明書ではなく、Let's Encrypt の本物の証明書が使われているか
- NGINX がフロントで HTTPS を受け、内部は HTTP になっている構成か

## :repeat: 証明書の自動更新への対応

Let's Encrypt は90日ごとに更新が必要です。自動更新後、証明書を Overleaf ディレクトリに再コピー＆サービス再起動するように、`--deploy-hook` でスクリプトを組むのがおすすめです。

## :tada: おわりに

これで Overleaf Toolkit を安全に HTTPS 化することができました！
 今回の構成は個人用途〜小規模社内ツールでの運用にピッタリです。

今後は Overleaf 上のプライベートプロジェクトも安心して使えるようになりますね :memo:
AzureにおけるMCP実装型ナレッジ基盤の構成設計


## はじめに

本記事は、自然言語による指示を高精度に解釈し、組織内外のナレッジを動的に統合・活用するためのAI基盤として、Azure上におけるMCP（Model Context Protocol）設計を整理したものである。

“技術的には普通”である構成を、意味的・構造的にプロトコル化し再利用可能にすることで、持続可能かつ進化的なナレッジ基盤が成立する。その要となるのが、Cosmos DBによるスケーラブルなRAGと、Durable Functionsによる文脈オーケストレーションである。

---

## 1. 全体構成の思想

- テンプレートも文脈も動的に選定される「意味ドリブンAI」
- MCPは「意味の流れ」の設計思想であり、Durable Functionsがその実行基盤
- Cosmos DBをベースにしたRAG構成によって更新性とスケーラビリティを最大化

---

## 2. アーキテクチャ全体図（構成要素）


```plaintext
[User (Teams, Web, Bot, Power Apps)]
   ↓
[Azure Function（API Gateway）]
   ↓
[RAG Layer - Context & Template Builder]
   ├─ Instruction Embedding（Azure OpenAI）
   ├─ PromptTemplate Search（Cosmos DB）
   └─ RequiredContextKey抽出
   ↓
[Durable Functions Orchestrator]
   ├─ ContextFetcher Functions（非同期分散取得）
   ├─ Prompt統合（テンプレ＋文脈）
   ├─ LLM呼び出し（Azure OpenAI / 外部LLM）
   └─ Output Formatter + Logger
   ↓
[Response → UIに返却]

```

---

## 3. 各レイヤーの詳細

### ● RAG Layer（文脈＋テンプレ構成）

- **Instruction（自然言語）**をベクトル化（`text-embedding-ada-002`）
- **Cosmos DB内のPromptTemplateコレクション**からベクトル検索でテンプレ選出
- テンプレには`required_context_keys`が定義されており、これに応じて文脈を組立

### ● ContextFetcher Functions

- keyに応じたFunctionをDurableで非同期実行（例：`user_profile`、`project_spec`、`product_doc`）
- 各FunctionはFabric, CosmosDB, Searchなどに接続してContext取得

### ● Prompt Builder

- テンプレートにContextを埋め込み、最終プロンプトを構築
- MCP的に構造化されたJSONでLLMへ送信（Instruction, Context, Formatなど）

### ● LLM Dispatcher & Formatter

- モデルはAzure OpenAI（GPT-4 / 3.5） or 任意外部LLM
- 応答はHTML, JSON, Markdown形式で整形し、UIに返却

### ● ロギング・ナレッジ進化

- Instruction＋Prompt＋Context＋応答をCosmos DBに保存
- フィードバックに基づくスコアリングやテンプレ精度改善に活用可能

---

## 4. スケーラビリティと再利用性の観点

| 特性 | 実装アプローチ |
|------|----------------|
| Contextの分散取得 | DurableのActivityファンアウト構成 |
| テンプレート進化 | Cosmos上で管理＋Embeddingで意味選定 |
| Model切替 | Dispatcherで分岐制御可能（API, Azure, 社内LLM） |
| 構成テンプレの再利用 | Activity単位でFunction再利用可能 |

---

## 5. 本構成の意義

- 技術的には既知の構成要素であるが、それを**意味のレイヤーで再設計**した点が本質
- テンプレート・Context・LLM呼び出しのすべてが「文脈ドリブン」で動作
- MCPとは、まさに「普通を再構成する名前」であり、それが可能となった構成である

---

## 結び

本構成は、Azureという商用インフラ上において、構文処理・情報取得・意味合成・応答生成というすべての段階を“意味”で統合可能とした初期実装である。これを足場に、教育、業務、企業間知識連携への応用は容易であり、MCP思想を現実に落とし込んだ代表事例となる。


---
EC2上にwordpressインストール後に「Error establishing a database connection」

# 状況
AWS EC2上に
・Apacheのインストール
・MySQLのインストール
・WordpressのLinux上での初期設定
を終えた状況で
IPにアクセスすると次のような画面になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461603/95e0b630-bf35-40c4-85e2-b9a59b987f0b.png)
これはWebサーバー（例：WordPressやLaravelなど）からMySQLに接続できていない状態です。
# 原因と解決
・この状況になっている場合webサーバにアクセスができているためEC2の設定は問題ないことが多いです。
可能性としてはwordpressのconfigの設定を行っていないかまたは間違っていることが挙げられます
EC2に入った状態で以下のコマンドで設定を確認します
```
nano wordpress/wp-config.php
```

するとこの表記が見えるはずです
```
define( 'DB_NAME', 'databese_name_here' );

/** Database username */
define( 'DB_USER', 'usernamr_here' );

/** Database password */
define( 'DB_PASSWORD', 'password_here' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );
```

ここに正しいpassword/username/databesenameが書き込まれているか、間違いがないか確認しましょう。

最後にApacheとmySQLを再起動してエラー修正終了です。
```
sudo systemctl restart httpd
```
```
sudo systemctl restart mysqld
```
fishからzshに戻す

長らく開発でfishシェルを利用してきました。
恐ろしく軽量で、かつインストールするだけで強力な補完機能が利用できる。そしてカスタマイズも楽ということでとても好きなのですが、多くの方の指摘通り、文法が特殊で扱いづらさがありました。
そこで、fishとお別れしつつ、fishの補完機能などを利用できるzshを目指して移行していきます。その備忘録です。

warpなど、ai + シェルというツールも増えてきている昨今、あまりひつようないのかもしれないd

※macOSに限った記事です。

# 1. fishを削除する。
潔くuninstallしていきましょう。
homebrew経由でインストールしたので、brewコマンドを利用します。
```terminal
brew uninstall fish
```
以下のように出力されるので、その通りに削除していきます。
```terminal
The following fish configuration files have not been removed!
If desired, remove them manually with `rm -rf`:
  /opt/homebrew/etc/fish
  /opt/homebrew/etc/fish/config.fish
```
```terminal
rm -rf /opt/homebrew/etc/fish /opt/homebrew/etc/fish/config.fish
```

configファイルは消えないので、手動で削除します。

```terminal
rm -rf ~/.config/fish
# 確認
ls -la  ~/.config/fish
ls: /Users/<user-name>/.config/fish: No such file or directory
which fish
fish not found
fish
zsh: command not found: fish
```

これで削除完了です。

# 2. zshのカスタマイズ
## oh my zshをインストール
oh-my-zshを利用している方が多く、プラグインも多そうだったのでこちらをインストールしていきます。

https://github.com/ohmyzsh/ohmyzsh

readme記載のcurlコマンドでインストールします。
※実際にインストールする際は上記githubをご覧いただくのが確実です。
```terminal
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
```

この時、新しく`~/.zshrc`ファイルが作成されるとともに、既存の`~/.zshrc`は`~/.zshrc.pre-oh-my-zsh`に変更されます。

新しいファイルにコピーする or 元のファイルから新しいファイルを読み込む形にするか迷いましたが、fishシェルへの切り替えが早く大した量の記述でもなかったため、zshrc.pre-oh-my-zshの内容を新しいファイルの最上部にコピペしました。

## ほか機能pluginをインストール

zsh-syntax-highlightingとzsh-autosuggestionsを入れます。
前者はコマンドを色付けしてくれ、後者が自動補完です。
```terminal
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
```
```terminal
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
```

その後、~/.zshrcのpluginに以下を書き込みます。
（gitはデフォルトで入っているようです。）
```
plugins=(
	git
	zsh-syntax-highlighting
	zsh-autosuggestions
)
```
念の為適用コマンド
```terminal
source ~/.zshrc
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704095/e5edbf4d-ff96-4722-a97c-9e0710c6ab02.png)


補完や色が効くようになりました。

以上です。
うーん、やっぱりfishシェルのシンプルさが良くて戻すかも、、なんて思ったり。
なれの問題でしょうか。

# 参考記事

https://zenn.dev/chamo/scraps/d7d4e3374a0549

http://qiita.com/Meatwo310/items/9efb799b6f96eb4f8583#%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B
iPhone16eを使っていて感じること

iPhone16eを購入して使っています。

https://www.sumahodata.com/iphone16e-kaifuu/

しばらく使ったので感じていることを書いておきたいと思います。

## バッテリー持ちが良い

まず、バッテリー持ちが良いですね。

iPhone16 Proよりも良いように感じます。

Proは、使っていると結構バッテリーが減ってしまう感じがありますが、iPhone16eはそこまでではありません。

これは、ディスプレイのリフレッシュレートが異なるからでしょうか。


## また、iPhone16eは、重量が軽め

また、iPhone16eは、重量が軽めです。

もちろん、iPhone SEやiphone13 miniよりは重いわけですが、最近のスマホの中では軽いほうになると思います。

このため長時間使っていても、手があまり疲れません。

これは、iPhone16eの良いところだと思います。


というか、最近のスマホは、重すぎるなと。

カメラやバッテリーが多いからでしょうか？

220グラム位のハイエンドのスマホが多いですよね。

ケースやガラスフィルムをつけたりすると、250グラムを超えてしまったりします。


これだと、長時間片手で使うには辛いところがあります。


一方で、iPhone16eは、ケースをつけても200グラムを超えてはいないです。

使っていて、軽いと感じますし、少し前のスマホを持っているような感覚になります。

## Apple Intelligenceも使える

また、Appleインテリジェンスも使えるので、文章の作成などに使えます。

この辺は今後さらに改善されていくと思うので、Appleインテリジェンスの改善にも期待したいところです。

## 一部最新ではないけれど

一部の機能は最新のiPhoneとは異なって、最新とは言えないところもあります。

それでも軽くて動作も早くて、バッテリーも持って、アップルインテリジェンスも使える。

最近のスマホとしては、少し不思議な感覚もあるスマホになっています。

カメラ以外は、結構メインに近い感じで使えそうだなぁと感じているところだったりします。

https://www.sumahodata.com/iphone16-dougasatuei/

後は、やはり他のスマホの重さを感じてしまいますね。

スマホは軽いといいなぁと言うのは、iPhone16eを使っていると、感じてしまうというところです。
JSで関数の引数はオブジェクトで渡したい

タイトル通りですが…

通常はJavaScript(TypeScript)で関数に引数を渡す場合、以下のようにします。

```
const hogeFunc = (hogeName: string, hogeValue: number, hogeFlag: boolean) => {
  // なんらかの処理
}

// 関数呼び出し
hogeFunc('hoge', 55, true);
```

引数の数が少なければ、これでもいいかもしれませんが、引数の数がもっと増えた場合やデフォルト引数を使用する場合に問題が出てきます。

例えば以下のような場合です。

```
const hogeFunc = (
  hogeName: string,
  hogeValue: number,
  hogeFlag1?: boolean = false,
  hogeFlag2?: boolean = false,
  hogeFlag3?: boolean= false,
) => 
  // 処理
};

hogeFunc("test", 12345, false, false, true)
```

hogeFlag1、hogeFlag2、hogeFlag3はオプショナル引数なので、省略できます。
でも、「hogeFlag3にtrueを渡したい。hogeFlag1とhogeFlag2はデフォルト値でOK」という場合はhogeFlag1とhogeFlag2にfalseを指定する必要があります。
必要な引数は3つだけなのに5つ全部書く必要があり面倒です。

また、引数の順番も気にする必要があり、上記のように同じ型の引数が並んでいると間違いも起こりやすいです。
上記をオブジェクトで渡すようにすると以下のようになります。

```
const hogeFunc = ({
  hogeName,
  hogeValue,
  hogeFlag1 = false,
  hogeFlag2 = false,
  hogeFlag3 = false,
}: {
  hogeName: string;
  hogeValue: number;
  hogeFlag1?: boolean;
  hogeFlag2?: boolean;
  hogeFlag3?: boolean;
}) => {
  // 処理
};

hogeFunc({hogeName: "test", hogeValue: 12345, hogeFlag3: true});
```

必要な引数だけの指定でよく、オブジェクトのキーのおかげで「このtrueは何のフラグだ？」となることも減りそうです（サンプルなのでhogeFlagという名前ですが、実際にはわかりやすい名前で命名されるはず）

また、引数の順番も気にする必要がなくなります。

個人的には引数が3つまではOK、4つ以上はオブジェクト形式かなと思っています（boolean型のフラグがある場合は特に）
Kindle for PCでライブラリが同期されない問題を解決した話

# Kindle for PCでライブラリが同期されない問題を解決した話

## 概要
Amazonの「Kindle for PC」アプリで、正しくログインしているにも関わらずライブラリが同期されないトラブルに遭遇しました。Amazonサポートの協力もあり、いくつかの手順を踏んで解決したので、備忘録と他の方の参考になればと思い、ここにまとめます。
今回もChatGPT（武志くん）が文書化してくれました。

## 発生した問題
- 正しいAmazonアカウントでKindle for PCにログインしている
- しかしライブラリが同期されず、本が一冊も表示されない
- ネット接続や端末登録にも問題はなさそう

## 試したこと（効果なし）
- アプリ再起動
- PC再起動
- 同期ボタンの手動クリック
- 端末名や登録状況の確認（「コンテンツと端末の管理」画面）
- ネットワーク状態の確認

## 解決に至った手順
最終的には以下のステップで解決しました。

1. **Amazonアカウントのパスワードを変更**
   - これにより、すべての端末が強制的に再ログインを求められ、古いセッションが無効化されます。

2. **Kindle for PCをアンインストール**

3. **関連フォルダを完全削除**
   - 以下の2つのディレクトリを削除：
     ```
     C:\Users\[ユーザー名]\AppData\Local\Amazon\Kindle
     C:\Users\[ユーザー名]\Documents\My Kindle Content
     ```
   - この中には、Kindleのローカルデータベース（例：`book_asset.db` など）が含まれており、壊れたデータキャッシュをリセットする効果があったと考えられます。
   - この「My Kindle Content」フォルダは、Kindleアプリの**オプション画面 > コンテンツ**にある「コンテンツフォルダ」の指定先と一致しています。
   - ※これにより、Kindleアプリが保持していたキャッシュ・設定・ダウンロード済みコンテンツがすべてリセットされます。

4. **Kindle for PCを再インストール**
   - 現時点ではAmazon公式ページにダウンロードリンクが見つかりにくくなっているため、事前にインストーラーを確保しておくとよいです。

5. **Amazonアカウントで再ログインし、端末登録を行う**

→ 結果、ライブラリが正しく同期されるようになりました！

## 補足：サポート対応について
最初に対応してくれたチャットサポートの方はやや機械的な言い回しで、こちらに非があるかのような雰囲気がありました。ただ、後から担当が変わって非常に丁寧に対応してくださり、上記の手順を案内してもらって解決に至りました。

翻訳の関係で少し強く聞こえただけかもしれませんが、最終的には感謝です。

## 考察：なぜパスワード変更が効いたのか？
- 認証トークンの更新により、壊れていたセッション情報がクリアされた可能性
- 古い端末との紐づきや、内部的な競合状態が解消された

## 同じような症状で困っている方へ
このような情報はネット上でもあまり見つからず、かなりピンポイントな対処法だったかもしれません。もし同じように「ログインはできるけど同期できない」と困っている方がいれば、ぜひこの方法を試してみてください。

## 補足：OneDriveとの関係？

今回の件とは直接関係しているかは不明ですが、過去にKindle for PCをインストールした際に、
コンテンツフォルダの保存先が自動的に `OneDrive\Documents\My Kindle Content` に設定されていたことがありました。

その後、保存先をローカルに変更したのですが、もしかするとOneDriveとの関連情報が内部に残っており、
同期やコンテンツ読み込みに悪影響を及ぼしていた可能性も考えられます。

OneDriveの容量を圧迫することもあるので、必要に応じてフォルダの保存先は「オプション」からローカルへ変更することをおすすめします。

## まとめ
- Kindle for PCでライブラリが同期されない場合、**単なる再インストールだけでは解決しない**ことがある
- **Amazonアカウントのパスワード変更＋データ削除＋再インストール**の組み合わせが効果的

少しでも誰かの助けになれば幸いです。
Docker + Nginx でのエラー「"server" directive is not allowed here」の解決メモ

# エラー内容
Dockerを使ってNginxコンテナを起動（docker container run）しようとした際に、以下のようなエラーメッセージが表示されてコンテナが起動しない、という状況に遭遇しました。
```bash
[emerg] "server" directive is not allowed here
```

# エラーの原因
### Nginx設定ファイルの構造ミス
Nginx設定ファイル「nginx.conf」では、特定のWebサイト（バーチャルホスト）の設定を記述する server { ... } ブロックは、必ず http { ... } ブロックの中に記述しなければならないようです。

#### 修正前のファイル
```conf
server{
    Listen 80;

    location / {
        root /var/www;
        index index.html index.htm;
        }
}
```
#### 修正後のファイル
- server ブロックの配置: server { ... } ブロック全体を、http { ... } ブロックの内側に移動させます。
- events ブロックの追加: Nginxの設定には、http ブロックとは別に events { ... } ブロックが必須です。
```conf
events {
    worker_connections 768; # 最小限の値 (適当な値)
}

    http {
        server {
            listen 80; # 小文字にし、セミコロンを追加
            
            location / {
                root /var/www;
                index index.html index.htm;
                }
        }
    }
```

# イメージの再ビルドとコンテナの実行
修正したファイルを保存し、イメージの再ビルドとコンテナを実行します。
```bash
docker image build . -t my-custom-nginx:latest
```

```bash
docker container run -p 8080:80 my-custom-nginx:latest
```

以下のように表示され、Nginxが正常に起動しました🎉
```bash
/docker-entrypoint.sh: Configuration complete; ready for start up
172.17.0.1 - - [06/Apr/2025:06:50:42 +0000] "GET / HTTP/1.1" 200 138 "-" "..."
```
【ABC400】AtCoder Beginner Contest 400【C++】

### コンテスト名
AtCoder Beginner Contest 400

### コンテストURL
https://atcoder.jp/contests/abc400

### 開催日
2025/04/05 21:00-22:40

---

## [A: ABC400 Party](https://atcoder.jp/contests/abc400/tasks/abc400_a)
**解法**
- $A$ が $400$ の約数ならば、 $400$ を $A$ で割った商が $B$
```cpp:ABC400A.cpp
#include <iostream>
using namespace std;

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

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

    return 0;
}
```

## [B: Sum of Geometric Series](https://atcoder.jp/contests/abc400/tasks/abc400_b)
**解法**
- 総和を順番に計算し、 $10^9$ を超えたら打ち切る
```cpp:ABC400B.cpp
#include <iostream>
using namespace std;

int main(){
    int n, m;
    cin >> n >> m;

    long long int sum = 0;
    long long int tmp = 1;
    for(int i=0; i<=m; i++){
        sum += tmp;
        if(sum>1000000000){
            cout << "inf" << endl;
            return 0;
        }
        tmp *= n;
    }

    cout << sum << endl;

    return 0;
}
```

## [C: 2^a b^2](https://atcoder.jp/contests/abc400/tasks/abc400_c)
**解法**
- $2^a$ を全探索し、各 $a$ において条件を満たす $b$ の数を求める
- 重複がないように、 $b$ は奇数の場合のみを考える
- `sqrtl()` を使用する
```cpp:ABC400C.cpp
#include <iostream>
#include <cmath>
using namespace std;

int main(){
    long long int n;
    cin >> n;

    long long int x = 2;
    long long int cnt = 0;
    for(int a=1; a<60; a++){
        long long int y = n / x;
        cnt += (sqrtl(y)+1) / 2;
        x *= 2;
    }

    cout << cnt << endl;

    return 0;
}
```

## [D: Takahashi the Wall Breaker](https://atcoder.jp/contests/abc400/tasks/abc400_d)
**解法**
- ダイクストラ法
- 一つ先の区画が道ならば重み $0$ の辺、一つ先の区画が壁ならば重み $1$ の辺を張る
- 二つ先の区画が壁ならば、重み $1$ の辺を張る
```cpp:ABC400D.cpp
#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;

int main(){
    int h, w;
    cin >> h >> w;

    vector<string> G(h);
    string s;
    for(int i=0; i<h; i++){
        cin >> s;
        G[i] = s;
    }

    int a, b, c, d;
    cin >> a >> b >> c >> d;
    a--;
    b--;
    c--;
    d--;

    vector<int> dx = {1, 0, -1, 0}, dy = {0, 1, 0, -1};
    const int INF = 1e9;
    vector<vector<int>> dist(h, vector<int>(w, INF));
    priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> Q;
    dist[a][b] = 0;
    Q.emplace(0, a, b);
    while(!Q.empty()){
        auto [c, x, y] = Q.top();
        Q.pop();

        for(int i=0; i<4; i++){
            for(int j=1; j<=2; j++){
                int nx = x + dx[i]*j;
                int ny = y + dy[i]*j;
                if(nx<0 || nx>=h || ny<0 || ny>=w){
                    continue;
                }

                if(G[nx][ny]=='#'){
                    if(dist[nx][ny]>dist[x][y]+1){
                        dist[nx][ny] = dist[x][y] + 1;
                        Q.emplace(dist[nx][ny], nx, ny);
                    }
                }else{
                    if(j==1 && dist[nx][ny]>dist[x][y]){
                        dist[nx][ny] = dist[x][y];
                        Q.emplace(dist[nx][ny], nx, ny);
                    }
                }
            } 
        }
    }

    cout << dist[c][d] << endl;

    return 0;
}
```
Flow Data Collections Optimization Superbadge Unit


1. ループを最適化し、コレクションを作成します。
2. 既存のフローから不要なループを排除します。
3. 関連レコードの数に基づいて電子メールの送信を自動化します。


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


# ループと更新操作を最適化する

ループとサブフローで使用するために複数のコレクションを操作します。

何もせずに検証ボタンをクリック

:::note alert
The 'Suspended Account - Opportunity Updater' flow doesn't pass filtered opportunities to the specified subflow.


「停止されたアカウント - 商談アップデーター」フローは、フィルタリングされた商談を指定されたサブフローに渡しません。
:::


# 既存のフローから不要なループを排除する

ループ、決定、割り当て要素を置き換えて、シンプルで効率的な処理を実現します。 

:::note alert
The '30 Day Case Review' flow doesn't contain the appropriate element used to filter cases by its status.

「30 日間のケースレビュー」フローには、ケースをステータス別にフィルタリングするために使用される適切な要素が含まれていません。
:::


# コレクション数に基づいて決定を下す

コレクション内のレコード数に基づいてコレクションを評価する新しいフローを構成します。


何もせずに検証ボタンをクリック

:::note alert
We can't find an active version of the 'Account Industry Change' flow.

:::

サブセット？そんなことどこに書いてある？

:::note alert
The 'Account Industry Change' flow doesn't retrieve the specified subset of records.


「アカウント業界変更」フローでは、指定されたレコードのサブセットは取得されません。
:::

エラーの意味が全く理解できませんね。
仕方ないので削除して同じものを作成。相変わらず意味がないなぁ
【Excel】基本ショートカットキー_1　メモ

## 移動系
**Ctrl + page up**
シート右に移動
**Ctrl + page down**
シート左に移動

**Alt H O M**
移動したいシートを選択して移動
※コピーも可能

**Ctrl + G →移動したいセルを入力**
入力セルにジャンプ

## 選択系
**Ctrl + G　→ Alt + S →　選択したい項目を選びEnter**
数式や空白セル等任意の項目に絞りセル選択することが可能
()内のキーを入力すればショートカットキーで項目選択可能

**Ctrl + スペース（半角入力状態）**
列選択

**Shift + スペース（半角入力状態）**
行選択


## 操作系(基本)

**Alt → E → L、Alt H D S**
シートの削除

**Ctrl + Shift + 5**
パーセント表示に変更

**Ctrl + Shift + 1**
通貨・標準表示に変更

**Ctrl + Shift + 3**
通貨表示に変更
[Next.js] App Router ルーティング方式まとめ

# 概要

この記事では、`Next.js` の `App Router` における基本的なルーティングから動的ルーティング、ルーティンググループ、プライベートフォルダの使い方をまとめています。

## 1. 基本のルーティング

**`App Router`** では、**`app`ディレクトリ配下**のフォルダの構造がそのまま `URL` に反映されます。
- フォルダ名が `URL` のパスとなる  
- コンテンツは `page.tsx` として配置する

例）  
```
app/
 ├─ about/
 │    └─ page.tsx   // => URL: /about
 └─ contact/
      └─ page.tsx   // => URL: /contact
```

このシンプルな方式により、ページ構造とディレクトリ構成が一致し、直感的にルーティングを設計できます。

### 補足：Pages Routerとの違い（従来のルーティング）

`App Router` が導入される以前は `Pages Router` を用いたルーティングが一般的でした。
この従来の方法では、`pages` ディレクトリを使い、ファイルベースでルーティングを行っていました。

例）
```
pages/
 ├─ about.tsx    // => URL: /about
 └─ contact.tsx  // => URL: /contact
```

## 2.App Router 動的ルーティング

`blog/:id` のような動的な URL を生成する必要がある場合、動的セグメントを定義することで、URL の一部を動的に扱うことができます。

たとえば、ブログの記事詳細ページを動的にルーティングする場合は、以下のようなフォルダ構成となります。

```
app/
 ├─ blog/
 │    ├─ [slug]/
 │    │      └─ page.tsx   // => URL: /blog/任意の文字列（例：/blog/nextjs-intro）
 │    └─ page.tsx          // => URL: /blog
 ```

この例では、`[slug]` というフォルダ名が動的パラメーターを示し、URL の `/blog/` 以下の任意の文字列が `slug` として取得されます。

<br>

以下は、`blog/:id` の動的ルーティングのサンプルコードです。
※ Next.js 15 以降、`params` や `cookies` などの API が非同期化されたため、非同期関数（`async / await`）の利用が推奨されます。


```tsx
import React from 'react'

type Params = {
  params: Promise<{ slug: string }>
}

export default async function page({ params }: Params) {
  const { slug } = await params;

  return (
    <div>
      ブログ記事: {slug}
    </div>
  )
}
```

**ポイント**

- コンポーネントの引数として `{params}` を受け取る
- `async` 関数を利用して、Promise を解決
- URL の一部（この例では `slug`）を動的に取得できる

## 3. App Router ルーティンググループ

同一フォルダ内で複数のページを管理しつつ、URL は個別に設定する場合、ルーティンググループを利用します。

これにより、ログインや登録ページなどを一つのグループとしてまとめながら、URL を個別に設定することが可能になります。

**フォルダ構成例**

```
app/
 └─ (auth)/
      ├─ login/
      │    └─ page.tsx   // => /login
      └─ register/
           └─ page.tsx   // => /register
```

この構成により、URL は `/login` および `/register` となり、グループ化による管理が可能になります。

## 4. App Router プライベートフォルダ

URL として公開したくないページを管理する場合は、フォルダ名の先頭にアンダースコア（`_`）を付けることで、該当フォルダ以下のページが URL に反映されなくなります。

**例）**

```
app/
 └─ _test/
      └─ page.tsx
```

上記の例では、`page.tsx` が存在していても、`/test` にアクセスしてもルーティングされず、`404` エラーとなります。プライベートなコンポーネントや一時的な実験用ページを隠す際に有用です。

## まとめ

- **基本**：フォルダ名がそのまま URL に反映される  
- **動的ルーティング**：非同期関数を使い、パラメータを安全に扱う  
- **ルーティンググループ**：関連するページを一括管理しつつ、個別の URL を実現  
- **プライベートフォルダ**：不要なページを URL から除外する
MSP430でPS/2-I2C変換

とりあえずコミットしてみました。

https://github.com/yamori813/msp430_ps2_i2c/tree/main

割り込み処理で不整合が発生するのかI2C処理内でPS/2をいじると落ちるので、PS/2の処理はmainループで行っています。

使用したPS/2のライブラリは16Bitでキーコードを返してきて、下位・上位の順でI2Cのデータにしています。

FreeBSDのmrubyのbsdiicでこんな感じでいじれます。

```ruby
MSPADDR = 0x4a

SETLED = 0
GETKEY = 1

t = BsdIic.new(0)

# NUM Lock LED On
t.write(MSPADDR, SETLED, 2)

usleep 100_000

loop do
  cur = t.read(MSPADDR, 2, GETKEY)
  if cur != nil && cur[0] != 0
    if cur[1] == 0 then
      print cur[0].to_s(16) + "\n"
    else
      print cur[0].to_s(16) + " " + cur[1].to_s(16) + "\n"
    end
  end
  usleep 10_000
end
```

ログはこれです。

```
15
15 80
1d
1d 80
24
24 80
2d
2d 80
2c
2c 80
35
35 80
```

接続したキーボードモジュールと相性があり、ときどき正常に起動しない事があります。キーボードモジュールは起動時に1バイトのデータを送ってくるので、それが受信できていないと起動に失敗しています。

mainループでLPMにしたいのですが、うまくできませんでした。またいつか調べます。

__delay_cycles()はintrinsics.hで定義されていて、引数はlong intなので32Bitです。これはlegacymsp430.hをincludeすると、in430.hがincludeされて、それが読み込みます。ヘッダーを読み込んでいないと、引数がintとして処理されて16Bitを超える直値を渡すとエラーになります。
Atcoder 備忘録_二次元累積和_問題B08

# 概要

- 競技プログラミングを始めてみた。
  せっかくなので１テーマごとに解法と学びをアウトプットしてみる。

## 取り組む内容
- 鉄則本[https://atcoder.jp/contests/tessoku-book] に沿って実施する。
- ![鉄則本.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636949/7525f26c-5077-422b-b6b6-cbfab34ef327.jpeg)
- 言語は Python
- 今回テーマは「二次元累積和」

# 問題文
二次元平面上にN個の点があります．i個目の点の座標は(Xi,Yi) です．「x座標がa以上c以下でありy座標がb以上d以下であるような点は何個あるか？」という形式の質問がQ個与えられるので，それぞれの質問に答えるプログラムを実装してください
なお，入力される値はすべて整数です．

## 制約
- 1≤N,Q≤100000
- 1≤Xi,Yi≤1500
- 1≤ai≤ci≤1500
- 1≤bi≤di≤1500
- 入力はすべて整数

## 出力
Q行にわたって出力してください。i行目には，i個目の質問の答えを出力してください

# 解法
```
N = int(input())

Xi = [0] * N
Yi = [0] * N

for n in range(N):
  Xi[n], Yi[n] = map(int, input().split())

Q = int(input())
Ai = [0] * Q
Bi = [0] * Q
Ci = [0] * Q
Di = [0] * Q

for q in range(Q):
  Ai[q], Bi[q], Ci[q], Di[q] = map(int, input().split())
  
matrix = [[0] * 1501 for i in range(1501)]

for n in range(N):
  matrix[Xi[n]][Yi[n]] += 1
  
for i in range(1501):
  for j in range(1, 1501):
    matrix[i][j] += matrix[i][j-1]
    
for j in range(1501):
  for i in range(1, 1501):
    matrix[i][j] += matrix[i-1][j]

for q in range(Q):
  print(matrix[Ci[q]][Di[q]] + matrix[Ai[q]-1][Bi[q]-1] - matrix[Ai[q]-1][Di[q]] - matrix[Ci[q]][Bi[q]-1])
  
```

# 結果
- AC
- Runtime： 1069 ms
- メモリ：116428 KB

# 振り返り
## 思想
- (ai, bi), (ci, di)区間での点の個数は二次元累積和Sに対して S[ci][di] +  S[ai-1][bi-1] - S[ai-1][di] - S[ci][bi-1]で求められる

## 感想
- マトリックスになると頭のなかでイメージするの中々難しくなる
Mac で再インストールした Nix が使えない

## 現象

Mac mini 上の Nix を一度消して再インストールしようとした。

https://nix.dev/manual/nix/2.18/installation/uninstall

https://nixos.org/download/

```bash
sh <(curl -L https://nixos.org/nix/install)
```

ここで試しに nix-shell を使ってみたところ、下記のエラーが。

```
$ nix-shell -p git
error: Nix daemon disconnected unexpectedly (maybe it crashed?)
```


## 環境

- Mac mini (M1, 2020)
- macOS Sequoia
- Nix 2.28.0


## 解決

[issue#12011](https://github.com/NixOS/nix/issues/12011) や [NixOS Discourse](https://discourse.nixos.org/t/ssl-ca-cert-error-on-macos/31171/5) で解決法が示されている。

まず、下記の場所にシンボリックリンクがあるはずである。

```bash
ls -la /etc/ssl/certs/ca-certificates.crt
```

出力：

```
lrwxr-xr-x 1 root wheel 41 Jul 15  2022 /etc/ssl/certs/ca-certificates.crt -> /etc/static/ssl/certs/ca-certificates.crt
```

しかしこのリンク先ファイルが存在しない。

```bash
$ ls /etc/static/ssl/certs/ca-certificates.crt
ls: cannot access '/etc/static/ssl/certs/ca-certificates.crt': No such file or directory
```

これが理由でデーモンが起動できていない様子なので、正しいファイルへリンクを貼り直してやればよいとのこと。

```bash
sudo rm /etc/ssl/certs/ca-certificates.crt
sudo ln -s /nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt /etc/ssl/certs/ca-certificates.crt
```

動作確認

```bash
$ nix-shell -p hello
this path will be fetched (0.02 MiB download, 0.11 MiB unpacked):
  /nix/store/zh4ha2m108qnkzib36mxchngqj4j13hn-hello-2.12.1
copying path '/nix/store/zh4ha2m108qnkzib36mxchngqj4j13hn-hello-2.12.1' from 'https://cache.nixos.org'...

[nix-shell:~/dotfiles]$ hello
Hello, world!
```

おわり。