OmniAICreator/Qiita-1.07M huggingface dataset:
Javaで学ぶアルゴリズム -二分探索（.binarySearch ver.）

# 二分探索

https://qiita.com/_mi/items/bf5748e52b0d7696d48d

上記のロジックは `java.util.Arrays` にあるのでそれを使うとよいです。

メソッドの仕様はJavaDocに詳細に書いてくれてますね。多少意訳すると以下のような感じ。

- 指定された int 配列から、指定された値をバイナリ検索アルゴリズムで検索する
- 呼び出す前に、任意のキーで配列はソートされている必要がある（ソートされていない場合、結果は意図したものにならない）
- 配列に指定された値を持つ要素が複数ある場合、どの値を返すかは保証しない
- 配列内に指定された値がある場合はそのインデックスを返すが、存在しない場合はその値が次に挿入されるべき位置を負の数で返す

https://docs.oracle.com/javase/jp/8/docs/api/java/util/Arrays.html#binarySearch-int:A-int-


# 実行環境

- JUnit 5
- Java 8

# テストコード

```java:BinarySearchTest.java
public class BinarySearchTest {

	@DisplayName("正常系テスト")
	@ParameterizedTest(name = "No.{index}: {0}を探すとインデックス{1}を返す")
	@CsvSource(value = {
			"-1, -1",
			"1, 0",
			"7, 3",
			"16, -9",
			"29, 14",
			"31, -16"
	})
	void testNormalBinarySearch(int target, int expected) {
		// ソート後の配列 { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29 };
		int[] array = { 23, 7, 1, 5, 11, 3, 29, 21, 13, 27, 15, 25, 19, 9, 17 };
		assertThat(BinarySearch.SortAndBinarySearch(array, target), is(expected));
	}

	@DisplayName("配列が空である場合、-1を返す")
	@Test
	void testEmptyArray() {
		int[] sortedArray = {};
		assertThat(BinarySearch.SortAndBinarySearch(sortedArray, 13), is(-1));
	}

	@DisplayName("要素が複数存在する場合、最初に見つかったインデックスを返す")
	@ParameterizedTest(name = "No.{index}: {0}を探すとインデックス{1}を返す")
	@CsvSource(value = {
			"-1, -1",
			"2, 1",
			"4, 4",
			"5, -6",
			"6, 6",
			"7, 10"
	})
	void testWithDuplicateElements(int target, int expected) {
		// ソート後の配列 { 1, 2, 2, 4, 4, 6, 6, 6, 7 };
		int[] array = { 6, 6, 4, 1, 6, 2, 4, 2, 7, };
		assertThat(BinarySearch.SortAndBinarySearch(array, target), is(expected));
	}
}
```


# 二分探索アルゴリズム

```java:BinarySearch.java
import java.util.Arrays;

public class BinarySearch {

	/**
	 * 配列をソートし、二分探索を実行するメソッド。
	 * ソートしたarray内でtargetを探し、そのインデックスを返す。
	 * 見つからない場合はキーが挿入されるべき位置を示すためのインデックスを「負の数」にして返す。
	 *
	 * @param sortedArray 探索対象のソート済み配列（昇順）
	 * @param target 探索する整数値
	 * @return targetのインデックス、見つからない場合は-1を返す
	 */
	public static int SortAndBinarySearch(int[] array, int target) {

		// 1. 配列をソートする
		Arrays.sort(array);

		// 2. 二分探索を行う
		return Arrays.binarySearch(array, target);
	}
}
```
０から始めるGitHub Project

### **はじめに**  
チーム開発でissue駆動・チケット駆動で開発しているけど、  
どのissueを誰がやっているのか分からない 🤔  
どのくらい進んでいるのか分からない 
正直、新しいシステムは導入したくない 💻  
そんな経験、ありませんか？

そんなみなさんにお勧めしたい**GitHub Project**というGitHubの機能があります 🚀  
GitHub Projectを使うと、スクラム開発にも似たワークフローが簡単に実現できちゃうんです！  
最初はちょっと難しそうに感じるかもしれませんが、試してみるだけで、あっという間に楽しく管理できるようになります！ 🎉

---

### **1. GitHub Projectとは？**  
GitHub Projectは、リポジトリ内でタスクを整理して進捗を追跡できる便利なツールです ✅  
ボード形式でチケット（issue）を管理できるので、進行中のタスクや誰がどのタスクを担当しているのかを、みんなで簡単に確認できます。

- **タスクの可視化**: 「To Do」「In Progress」「Done」など、カスタマイズ可能なカラムを作成して進捗を一目で管理 📊  
- **チームの連携**: チームメンバーを簡単に追加して、誰がどのタスクを担当しているのかが一目で分かります 👥  
- **自動化と統合**: GitHub Actionsや他のツールと連携すれば、ワークフローの自動化が可能に！ ⚙️

---

### **2. GitHub Projectの設定方法**

#### **ステップ1: GitHubリポジトリを作成**  
まずはGitHubでリポジトリを作成しましょう！  
作成後、プロジェクトボードを設定する準備が整います 🔧

#### **ステップ2: Projectタブを開く**  
リポジトリページの上部メニューにある「Projects」タブをクリック 🖱️  
「New Project」を選んで、新しいプロジェクトを作成します。  
![スクリーンショット 2024-12-04 9.43.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644890/23cc2d10-2698-924d-e230-1f17c6ee8c1f.png)

#### **ステップ3: プロジェクトボードを作成**  
新しいプロジェクトに名前をつけ、テンプレート（例: Kanban）を選択 📝  
ボードのカラム（To Do、In Progress、Doneなど）を追加し、タスクを整理しやすくします 📋  
![スクリーンショット 2024-12-04 9.44.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644890/e4393776-8b06-7759-ee1f-520d58db8633.png)

#### **ステップ4: Issueを追加**  
作成したIssueをドラッグして、進行中のカラムに移動！  
これで進捗を一目で確認できます 👀 また、担当者を割り当てることもでき、誰が何をやっているのかも簡単にチェックできますよ 🔍  
![スクリーンショット 2024-12-04 9.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644890/eec25a49-b011-ffec-55e2-13c41499310d.png)

#### **ステップ5: カスタマイズ**  
自分のチームの作業フローに合わせて設定をカスタマイズしてみましょう！ ✨

- **ワークフローの設定**: Issueが閉じられると自動でボードのタスクも閉じる、などの自動化が可能です ⚡  
  例えば、PRが完了したら特定のカラムに自動で表示される設定もできます 🧑‍💻  
![スクリーンショット 2024-12-04 9.45.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644890/407005b0-b316-0261-2fb9-ef67ed5065e5.png)

- **インサイトの設定**: さまざまなプロジェクトの状態を確認できるインサイトも活用して、チームの進捗やパフォーマンスを把握しましょう 📊  
課題の進捗度合いなどを図としてみることができるので、モチベーションにも繋がります💪  
![スクリーンショット 2024-12-04 9.51.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644890/ddae1600-82aa-3ebe-5244-842d26c5b4e5.png)  
![スクリーンショット 2024-12-04 9.56.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644890/eac819d9-1e9c-4d2c-83da-6c573f0c0969.png)

---

### **3. GitHub Project活用のポイント**

- **進捗管理**: カラムを使ってタスクの進行状況をビジュアルに管理できます！タスクがどの状態にあるのか、誰が担当しているのかすぐに把握できるので、チームの状況が一目瞭然に 🔄
- **チームでの共有**: チーム全員がリアルタイムで更新できるので、情報共有がサクサク進みます 💬
- **自動化**: GitHub Actionsと連携して、プルリクエストが作成されるたびに自動でタスクが進行するようにするなど、手間が減りますよ ⚙️

---

### **まとめ**  
GitHub Projectを使えば、タスクの進捗が見やすくなり、整理も簡単！  
新しいシステム導入に対して不安があるかもしれませんが、始めてみればその便利さにきっと驚きます 🌟  
さあ、チーム開発をもっとスムーズに、楽しく進めるために、GitHub Projectを試してみましょう！ 🚀
Cloud Run functions × TypeScript 開発をしよう！【開発環境：Node.js 実行環境】

# はじめに
この章では以下の内容について説明します。
- バージョン管理ツールを使った、ローカルマシンにNode.js実行環境を構築する方法
- Cloud Run functionsのランタイムに対応したNode.jsのバージョンの選択

---

# まえがき
「[はじめに](https://qiita.com/KyongminS/items/9d3a3ce7d5803d132bae#%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%AA%E3%81%84%E3%83%84%E3%83%BC%E3%83%AB)」でも書いたように、**Dockerは使用しません**。
僕はDockerを使うやり方も行っていましたが、ローカルの方が圧倒的に楽に動かせる上に、実行速度とビルドの時間が明らかに早くなったのでDockerを使わずローカルマシンのみで動かしています。
個人開発想定ということもあってDockerでいちいち環境構築するのも面倒なので、ローカルマシーンに直に環境構築していきます。手元で node 使えた方が何かと便利ですしね。

### 余談
上述と似たようなことをフロントエンドのプロと思われる方がXで呟いておりました。~~ひょっとして自分先見の明ある？~~

https://x.com/mizchi/status/1860921036524376516

# nvmを利用したNode.jsのインストール
https://github.com/nvm-sh/nvm

nvmとは **Node Version Manager** の略で、その名の通り Node.jsのバージョン管理マネージャーです。
Node.jsのバージョンを簡単に切り替えられるツールになります。

MacOSの場合、Homebrew経由でインスコするのは推奨されておりません。公式のガイド通り curl を使ってnvmをダウンロードしていきましょう。

> Homebrew installation is not supported. If you have issues with homebrew-installed nvm, please brew uninstall it, and install it using the instructions below, before filing an issue.

```bash:ダウンロードスクリプトの実行
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
```

```bash:~/.zshrcのリロード
source ~/.zshrc
```

```bash:ダウンロード確認
nvm -v
# 0.40.1 とかでたらOK
```

基本これで問題なくいけると思われますが、詰まった方は以下をご覧くださいませ。

https://github.com/nvm-sh/nvm?tab=readme-ov-file#troubleshooting-on-macos


### Cloud Run functions での Node.js バージョン最適解
さて、nvmをダウンロードしたところでどのバージョンのNode.jsをインスコするかですが、以下のサイトを確認しましょう。

https://cloud.google.com/static/functions/docs/concepts/execution-environment?hl=ja#node.js

Node.jsのLTSである v22 のランタイムが 2024/12/4 日現在まだプレビュー版になっております。

![スクリーンショット 2024-12-04 2.01.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/c1cb7489-8b5b-842f-dfbc-861f16be8fd0.png)

Node.js v20 でも問題ない？という話ですが、以下のドキュメントを見ると Node.js v20 のランタイムが非推奨になる予定日が **2026-04-30** と結構先になっており、しばらくは問題なさそうです。

![スクリーンショット 2024-12-04 1.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/dc1b9ed8-f1ee-8dd6-886b-f0d0bbcc53d3.png)


https://cloud.google.com/functions/docs/runtime-support?hl=ja#node.js

ということで Node.js v20 のランタイムを利用しましょう。
nvm上で Node.js v20 をダウンロードします。

```bash:提供しているバージョンの確認
nvm ls-remote

# v20.18.1   (Latest LTS: Iron) <- これを使う
```

```bash:Node.js v20 のインスコ
nvm install v20.18.1
```

```bash:インスコ確認
node -v

# v20.18.1
```

これにて Node.js環境の設定は終了です。
次回はTypeScriptの環境構築について説明します。
Amazon Nova Reelで動画生成してみた！

## はじめに
re:invent盛り上がってますね！
本日のKeynoteでAmazonが提供する新しい基盤モデル、Amazon Novaが発表されました！

https://aws.amazon.com/jp/blogs/aws/introducing-amazon-nova-frontier-intelligence-and-industry-leading-price-performance/

現地ラスベガスで撮影した写真
![IMG_7464.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875372/7810b5fc-c93f-a9e6-cc9d-690978ad546a.jpeg)

## コンソールで確認してみた
コンソールを見てみると、Novaが追加されていました！Novaの中にも複数のモデルがあります。
詳細はAWS公式の情報か、詳しく説明されている方のブログをご覧ください^^
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875372/a63a14fc-528f-80fa-6685-76c0b32fc4f9.png)
その中でも今回は、動画が生成できるVideoモデルのNova Reelをさわってみました！

## 動かしてみた！
プレイグラウンドからさわってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875372/fe6aff05-90ee-d60f-f539-4fd26a219de3.png)

生成された動画を保存するためのS3バケットが必要なので、作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875372/05044873-e461-9f7f-2819-51bc4fbc3069.png)

確認ボタンをクリックするだけでバケットが作成されました。
では、実際に動画を生成してもらおうと思います。
プロンプトに生成して欲しい動画の内容を入力して実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875372/98d0f748-1015-7eb7-6c21-611b73643828.png)

生成された動画がこちら
![output (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875372/4cbedc64-eeeb-e3ed-32c3-dcb57662292a.gif)

## もっと欲しい動画に近づける
推論イメージで画像をアップロードすると参照して動画を生成してくれます。
実家の愛犬をアップロードして実行します！
※画像のサイズは1280×720かつ10MB以下でないとエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875372/d3f44c64-f8fc-bf97-ee7a-47772fac4483.png)

実家の柴犬はミックスなので素材が微妙なところですが、庭に雑草が生えてアップロードした写真が動き出しました！
![output (1) (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875372/4ba77fdf-661c-f8cd-29ee-9150e1b5ade6.gif)

## おわりに
柴犬？芝生？という感じにはなりましたが、かわいい犬が駆け回っているリアルな動画が作成されました！
プロンプトを工夫したり調整すればもっと良くなる気がします！
実行時間は4分ほどの短時間で、欲しい動画が簡単に作れるのでとても魅力的な基盤モデルです(^^)b

とにかく使ってみたい！という気持ちでブログを書いたので、これからじっくり調べていこうと思います！

re:invent初参加、英語全くできない私ですが、現地の方たちとの交流も経験と思い挑戦しています！残りの時間も楽しみながら学びます！
最新版プログラムを入手するスクリプト

プログラムをアップデートする際に、わざわざブラウザを開きそのプログラム(ソフトウェア)の提供元やGitHubのWebページにアクセスしてダウンロード&インストールするのが面倒だと感じたことはありませんか？  
今回はそんな方(Macユーザー限定)向けに、ターミナル上でプログラムアップデートを完了できるスクリプト、[latest](https://github.com/alpineyahoo/latest) のご紹介です。

https://github.com/alpineyahoo/latest

# TLDR
上記のGitHubのページをご覧になって頂ければ、インストール方法や使用方法をご確認頂けます。
## GitHubから New Release をダウンロードする場合
GitHub は GitHub API を提供しており、GitHubで公開されているプロジェクトの New Releases は API を利用してダウンロードURLを取得することができるので、このスクリプトはこれを利用しています。
## `repos.json` の内容とその編集
`repos.json`を編集して自分が高頻度で利用するソフトウェアの登録ができます。↓例:
```sh:repos.json
{
  "direct": {
    "RemNote": "https://backend.remnote.com/desktop/mac"
  },
  "github": {
    "Kitapp": "johnlindquist/kitapp",
    "Manager": "Manager-io/Manager",
    "acreom": "Acreom/releases",
    "balenaEtcher": "balena-io/etcher"
  },
  "webpage": {
    "Mendeley": "https://www.mendeley.com/download-reference-manager/macOS"
  }
}
```
JSONの中身の説明:  
`github`セクションには`登録名:プロジェクトURLの一部`で`key:value`登録ができます。　　
`direct`セクションでは`value`に直接ダウンロード可能なURLを登録できます。  
`webpage`セクションでは`value`にダウンロードURLを含むWebページのURLを登録できます。このスクリプトはその指定されたWebページからソフトウェアのダウンロードURLを探してきます。`github`では確実にダウンロードURLを取得できる反面、`webpage`ではWebサイトの仕様により上手く行かないことがあります。
## 注意点
`~/Downloads/*.pkg`, `~/Downloads/*.dmg`は自動的にマウント・インストール・削除されますので、`~/Downloads`に未処理のPkg, DMGファイルがある場合は対応が必要です。(あるいはスクリプトに手を加えて`~/Downloads`ディレクトリ以外のディレクトリをスクリプトが利用するように設定する必要があります)。
## 類似のプロジェクト
バイナリファイルのダウンロード・インストールができる [eget](https://github.com/zyedidia/eget) というツールがあります。

https://github.com/zyedidia/eget

## スクリプトの改善について
スクリプトを利用して頂いた方の中でバグや改善点にお気付きの方は是非ご連絡下さい。
ネットワークデバイス名に別名を付ける

# やり方 (Debian系)
```:/etc/network/interfaces
auto enp0s3
iface enp0s3 inet manual
    pre-up ip link set $IFACE up name net0
    post-down ip link set $IFACE down

auto enp0s8
iface enp0s8 inet manual
    pre-up ip link set $IFACE up name net1
    post-down ip link set $IFACE down
```
`manual` 設定になってるのは他の箇所の都合なので、たぶん `dhcp` とか `static` でも行ける。
気がする。
知らんけど。

あと、Redhad系は知らん。
すまん。
でも似たようなことできる気がするから、参考にはなるんじゃないかな？
知らんけど。

とにかくこれで、以降は `enp0s3` の代わりに `net0` 、`enp0s8` の代わりに `net1` が使える。
`ip addr` で見るとこんな感じ。
```:ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    ...
2: net0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:30:cf:5d brd ff:ff:ff:ff:ff:ff
    altname enp0s3
    inet 192.168.101.45/24 brd 192.168.101.255 scope global dynamic net0:0
       valid_lft 573sec preferred_lft 573sec
    inet 192.168.101.9/24 scope global secondary net0
       valid_lft forever preferred_lft forever
    inet6 fd17:625c:f037:a865:a00:27ff:fe30:cf5d/64 scope global dynamic mngtmpaddr
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe30:cf5d/64 scope link
       valid_lft forever preferred_lft forever
3: net1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br-vlan state UP group default qlen 1000
    link/ether 08:00:27:91:6c:0e brd ff:ff:ff:ff:ff:ff
    altname enp0s8
    inet6 fd17:625c:f037:a865:a00:27ff:fe91:6c0e/64 scope global dynamic mngtmpaddr
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe91:6c0e/64 scope link
       valid_lft forever preferred_lft forever
4: net0.10@net0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-mgmt state UP group default qlen 1000
    ...
```
元の名前が `altname` となっていて、もちろんそちらも同様に使える。
上記設定の後で
```:/etc/network/interfaces
auto net0:0
iface net0:0 inet dhcp
iface net0:0 inet6 auto
```
こんなんやってDHCP有効にしたり、net0/net1 でVLAN (`net0.10@net0`) やらブリッジ (`br-mgmt`) の設定したり、keepalivedで使ったり (`192.168.101.9/24`) と、まあ普通にデバイスとして使える。

# 余談
あちこちの設定ファイルにネットワークデバイス名書かなきゃいけないけど、「予測可能な名前」って環境によって変わるから、仮想マシンで練習した設定を実マシンに持っていくとき全部書き換えとかやってらんねーってことで、「一つ目」「二つ目」でわかる別名をつけたかった。
だけど、ネットで探しても udev のruleいじるとか根本的なのばかり出てきて、ちょっと別名付けたいだけにしてはえらくハードなのばかりしか出てこない。
いろいろ見てるうちに「これもう ip link でなんかできないの？」って気がしてきたので man 見たらビンゴだった。
本当は慣れ親しんだ `eth0`、`eth1` にしたかったんだけど、[この記事](https://qiita.com/liqsuq/items/bb2d9d3bebc49bc80d0e "令和の時代にネットワークデバイス名をeth*にする")の警告見て諦めた。
net0/net1 という名前もぶっちゃけ eth* を引きずってるだけで別に制約じゃないので、用途とか繋がってるネットワークがわかるような名前にするとよさそう。
ChakraUI v3 + Vite + Reactの環境構築

# はじめに

ChakraUI v3のドキュメントが若干分かりづらいので環境構築をまとめます

# 環境構築方法

基本的にはドキュメント通りに勧めていきます。

https://www.chakra-ui.com/docs/get-started/frameworks/vite

```
$ npm create vite
✔ Project name: … sample-chakra
✔ Select a framework: › React
✔ Select a variant: › TypeScript

Scaffolding project in /home/jinwatanabe/workspace/tmp/sample-chakra...

Done. Now run:

  cd sample-chakra
  npm install
  npm run dev

$ cd sample-chakra
$ npm i
$ npm i @chakra-ui/react @emotion/react
$ npx @chakra-ui/cli snippet add
$ npm i -D vite-tsconfig-paths
```

次に`tsconfig.app.json`を直します

```json:tsconfig.app.json
{
  "compilerOptions": {
    "target": "ES2020",
    "useDefineForClassFields": true,
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
    "module": "ESNext",
    "skipLibCheck": true,

    /* Bundler mode */
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": true,
    "isolatedModules": true,
    "moduleDetection": "force",
    "noEmit": true,
    "jsx": "react-jsx",

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true,
    "paths": {
      "@/*": ["./src/*"]
    }
  },
  "include": ["src"]
}
```

Viteプロジェクトで使えるように`vite.config.ts`を直します

```ts:vite.config.ts
import react from "@vitejs/plugin-react"
import { defineConfig } from "vite"
import tsconfigPaths from "vite-tsconfig-paths"

export default defineConfig({
  plugins: [react(), tsconfigPaths()],
})
```

`main.tsx`でProviderを使って実際にAPPの中でChakraUIを使えるようにします

```tsx:main.tsx
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { Provider } from './components/ui/provider'
import App from './App'

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <Provider>
      <App />
    </Provider>
  </StrictMode>,
)
```

実際にChakraUIが表示されるか`App.tsx`を修正します

```tsx:src/App.tsx
import { Button, HStack } from '@chakra-ui/react'

function App() {

  return (
    <HStack>
      <Button>Click me</Button>
      <Button>Click me</Button>
    </HStack>
  )
}

export default App
```

サーバー起動して表示されれば成功です

```
$ npm run dev
```

[localhost:5174](http://localhost:5173)にアクセスする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/6f9d3d6c-2bcb-a724-b30e-59211e23b837.png)

# おわりに

何度も調べるときは記事にしましょう
Clojureの基本構文 - 特殊フォームその２

![advent_calendar_2024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/f4cd8ce0-6352-a1d8-4cae-f39dd44f4def.png)

[*Advent Calendar 2024 Day 7*](https://qiita.com/advent-calendar/2024/clojure)

## 基本構文

3つの基本についてまとめています

1. リテラル
1. 関数の定義と呼び出し
1. 特殊フォーム

**3. 特殊フォーム** についてまとめています

昨日は`def`についてまとめたので、今日は続きから書いていきます

### 2. 特殊フォーム

特殊フォーム（Special forms）は、Clojureコンパイラによって直接解釈されます

#### if

```clojure
(if test then else?)
```

`test` の評価が真の場合、`then`が評価され、`else`が定義されている場合は、`else`が評価され、定義されていないときは `nil` を返す

```clojure
(if true        ;test
  "Trueの場合"   ;then
  "Falseの場合") ;else?
;; => Trueの場合
```

#### do

```clojure
(do 式1 式2 式3 ... 式N)
```

渡された式を左から順に評価され、最後の式の評価結果が全体の結果となる

```clojure
(do
  (println "Hello,")
  (println "World")
  (+ 1 2))
;; => 3
```

ここでは、2つの `println` は標準出力はされますが（副作用)、最後の`(+ 1 2)`の結果の`3`が返されます

#### let

```clojure
(let [ binding* ] expr*)
```

`let`はローカルなスコープで変数を設定するために使用される構文です。

```clojure
(let
 [x 1]
  (+ x 2))
```

ここでは、`x`という名前に`1`を割り当て、`(+ x 2)`で、`1 + 2`をしています

#### quote

```clojure
(quote form)

; 短縮記法
'(form)
```

`quote`は、`form`を評価せずにそのまま返します
これによって、**コードをデータ**として扱うことができます

```clojure
(quote (+ 1 1))
; (+ 1 1)

'(+ 1 1)
; (+ 1 1)
```

#### var

```clojure
(var symbol)
```

指定されたシンボルの`var`を返します

```
(def x 42)

(var x)
; #'todo.core/x
```
UIデザイン学習の1歩目　「ウェブデザイン技能検定」についてポイントをまとめてみた。【学習編】

### 学習の第1歩として、UIに関連する資格について調べてみた。
UIデザインに関する資格を調べると色彩検定やHTML5プロフェッショナル認定等の幾つかの資格が候補として挙がってきましたが、
今回私はその候補たちの中から「ウェブデザイン技能検定(3級)」を選びました。
理由は社内の奨励資格だったということと、初学者が学ぶ際にベースとなる知識から得られるという点で選定しました。

この記事では、実際にウェブデザイン技能検定を学習をしてみて分かった学習のポイントについてまとめたいと思います。
※3級はどなたでも受験可能ですが、2級は受験資格に2年以上の実務経験が必要です。


### 出題形式
試験は学科試験と実技試験の両方あり、両者の得点率がそれぞれ70点以上で合格となります。
試験時間は学科試験45分、実技試験60分です。
学科試験については、「正誤問題」と「選択問題(正しいものを選択)」の2種類の出題形式となり、
実務試験は、予め用意されているコードを見て指示に従い修正するという出題形式となっています。


### 出題内容とポイント
ウェブデザイン技能検定3級の試験細目は10分野あり、学習する中で感じたそれぞれのポイントとなる内容をまとめました。

なお、細目や試験概要は公式サイトの以下ページにて確認可能です。

[ウェブデザイン技能検定公式サイト：試験要項](https://www.webdesign.gr.jp/application/items/)



 実技については毎回ほとんど同じような内容の問題が出題されるので、対策としては公式で公表されている過去問を見て作業イメージをつけるのが良さそうです。

[ウェブデザイン技能検定公式サイト：過去問題の公表](https://www.webdesign.gr.jp/measures/publication/)



###### 1.インターネット概論
インターネットとは何か？というWEBデザインを学ぶ上での基礎的な知識について扱います。
OSI参照モデルに関して、第3層に値する情報はどれか？という選択問題が出題されることが多いので、こちらは覚えておいた方がよいです。

また、HTTP/HTTPS、FTP/SFTPの違いを問われることが多いので、暗号化技術を採用したプロトコルについても抑えておくと良さそうです。

###### 2.ワールドワイドウェブ(WWW)法務
WEB関連の仕事に従事する際に必要となる知的財産権や産業財産権等の権利を扱います。
主に、著作権や商標登録に関する出題が多いイメージです。

個人情報の取り扱いについても基本的な考え方を抑えておくとGood。

###### 3.ウェブデザイン技術
HTML/CSSとは何か？という基礎的な部分から、主要な要素の記載方法を扱います。

実技でもHTML/CSSの知識を問われる問題が出題されるため、HTMLにおけるa要素を使ったリンクの設定方法や、CSSでの色の指定方法・マージン/パディングなどの基本的な考え方は抑えておくとよいと思います。

###### 4.ウェブ標準
ウェブアプリやサイトを開発する際の標準となるルールや規約を決める、「標準化団体」に関する内容を扱います。

HTMLやCSSの仕様を標準化する「W3C」という団体について主に理解できていれば問題ないかと思います。(過去問を見たところそこまで出題量も多くない様子…)

###### 5.ウェブビジュアルデザイン
ウェブデザインのビジュアル部分を作成する際に必要となる、レイアウトに関する知識や色彩、画像フォーマットの種類/特徴について扱います。

GIF/JPEG/PNGに関する出題が多い傾向で、それぞれ「使える色数」「透過の可否」「可逆性/非可逆性の分類」は抑えておけるとよいかと思います。

色彩に関しては光の三原色の表現方法と、補色の関係性について理解できていればGood。


###### 6.ウェブインフォメーションデザイン
インターフェースデザインやユーザビリティを向上させるために必要な知識を扱います。
ウェブ制作者がサイト設計時に情報を整理するためのサイトマップや、サイトに訪れたユーザーのためのナビゲーションなど、

インフォメーションデザインに必要な要素に関する出題が多いイメージです。

###### 7.アクセシビリティ・ユニバーサルデザイン
アクセシビリティに関しては「JIS X 8341-3:2016」という規格に関する内容がよく問われます。
規格で定められている文面の穴あき部分を回答する形式なので、一通り読んでおくとよいです。

また、ユニバーサルデザインは「障害の有無に関係なく全ての人に使いやすい」を目指しているという部分を理解できているか問われる問題が多い感覚です。


###### 8.ウェブサイト設計・構築技術
ウェブサイトを実際に開発する際に必要となる手順・フローについて扱います。
細目にある「コミュニケーション」→「企画」→「プランニング」→「サイト設計」→「サイト構築」の各フェーズが何をするものなのかを理解できていればよいかと思います。

###### 9.ウェブサイト運用・管理技術
ウェブサイトを効率的に開発するために使われるシステムや、サイト分析に関係する用語について問われることが多いです。

CMS(Content Management System)とは何の略称か？ページビューとは何の情報のことか？などの用語を抑えておけるとよいと思います。

###### 10.安全衛生・作業環境構築
ウェブ関係の仕事に従事する際に必要となる、主に健康面に関する適切ね衛生管理・作業環境の知識を扱います。
「画面と部屋の明るさの差をなるべく無くして作業する」ということや、「休憩をこまめに挟んで体に負担が無いように気を付ける」といった基本的なことが問われることが多いので、

そのあたりの一般常識があれば特段対策は不要に感じました。


### 学習してみた感想
一通り内容を学習してみた結果一言で言うと、「ウェブデザインを学ぶすべての人に必要となる基礎的な情報を網羅的に習得することができる検定」だと思います。

ウェブ関連の業務に従事する人が必要となるセキュリティ面の話から、著作権等の法務領域を含め基礎的な知識を幅広く取り扱うため、UIデザインに興味のある人以外にも広く役に立つ知識が得られると感じました。

もちろん、HTMLやCSSといったフロントエンド開発に必要な言語に関する知識についても扱いますが、コーディングの知識といった点で言うとそこまで深くは扱わない印象です。
UIデザインの観点で言うと、ウェブに関する基礎的な内容からユーザビリティやアクセシビリティに関する内容の学習ができるのでその点が有益と思いました。

### 最後に
まだUIについては学習し始めたばかりですが、ウェブデザイン技能検定の学習を通して入り口となる基礎的な内容を学ぶことができました。
受験はこれからですが、同じようにUIデザインを学びたい方やこれから受験を考えている方のお役に立てば幸いです！
UIデザイン学習の1歩目　「ウェブデザイン技能検定」についてポイントをまとめてみた。【決起編】

### こちらの記事について
UIデザインに興味はあるけれど専門知識や実務経験は無い…
そんな初学者の私がUIについて学んだ内容や、学びの第1歩として「ウェブデザイン技能検定」の学習を通して気づいたポイントを記事にまとめたいと思います。

同じようにUIデザイン初学者の方に読んでいただき、少しでも学習の参考になりましたら幸いです。

なお、こちらの記事は【決起編】【学習編】と分かれております。今後、学習後の成果として【成果編】についても追加で投稿できればと思っています。



### なぜUIデザインについて学習しようと思ったのか
もともとサイトやアプリのデザインに興味があったという点が大きいですが、
文字の配置・ボタンの大きさといった画面上の「見た目」の部分を工夫することで、ユーザーの使い心地やそのサイトのイメージ改善に寄与できる点に面白みを感じたから。
という単純な理由です。

また、ユーザーの考えや動きを逆算し、実際にその通りにユーザーが使うように行動を誘導できるという点もUIを扱う上での面白い点だと思います。

(大学時代に心理学について学んでいたこともあり、こうした人間の心理や思考に関わることを考えるのが好きなので興味を持ったのかもしれません。)



### そもそもUIとは何か？
UIとは、「ユーザー」＋「インターフェース」のという言葉の頭文字をとった略称です。

ユーザーとシステムやサービスとの間のインターフェース、つまり懸け橋となって間を取り持つ接触点のことをUIという言葉で表します。


### ではUIデザインとは何か？
前項の説明でなんとなく皆さんお分かりかと思いますが・・・・
UIデザインとは、老若男女/障害の有無問わず万人がサービスやシステムを初見でも簡単に利用・操作できるようにするために、
ユーザーとの接触点(インタフェース)となる部分を工夫し構築する(デザインする)ことを指します。


　例えば…
　ある資格の受験を申し込もうとした際にどこから申し込み画面へ進めるのかよく分からず、受験自体のモチベーションが下がった経験はないでしょうか？(私はあります。。。)
　こうしたユーザーが直感的に操作できず困ったり、イライラしたりしないようにするためにはUIデザインを考慮したサービス作りが重要になります。
　
ユーザーが「使いやすかった」という良い体験が出来ることが「また利用したい」という気持ちに繋がり、企業の利益にも寄与するということになります。
自分が設計したデザインによってユーザーが満足したり、不満が起きたりなどの反応が得られることって面白いですよね。
そういったユーザーに対して「影響」を与えられるという点が、UIデザインの面白さだと思います。


### UIデザインを極めると何が嬉しいのか？
##### ①ユーザビリティの向上

当然ですが前項までも記述した通り、ユーザビリティが向上することがまず大きな利点として挙げられます。ユーザビリティが向上することで、よりサービス使いやすくなりユーザーの満足度を高めることができます。

 

##### ②企業のイメージ向上
もう1つの利点として、デザインにもこだわることでそのサービスを提供している企業のブランドイメージを向上させ、他サービスとの差別化を図ることが出来ます。
サイトのデザインまでこだわっているサービスだと「そのサービス自体の内容や質までしっかりこだわっているのでは？」とユーザーは考え、
サービスや企業への期待度が大きく変わってくると思います。

### まとめ
まずは「UIとは何か？」という部分のご紹介をさせて頂きました。

次回の記事で「ウェブデザイン技能検定」について取り上げ、出題内容等から私がポイントと感じた点についてご紹介します！
「パスを通す」ってなんぞ

## はじめに
プログラミングや開発環境を設定する際によく耳にする「パスを通す」という言葉。この記事では、以下の内容について詳しく解説します。

- パスとは何か  
- パスを通すとはどういうことか  
- パスを通さないとどのような問題が起こるのか  


## パスとは？
パス（Path）とは、ファイルやディレクトリ（フォルダ）の場所を示すものです。オペレーティングシステム（OS）がプログラムやファイルを見つけるための「住所」ともいえます。

- **絶対パス**: ルートディレクトリから目的のファイルまでの完全な経路。  
  例: `/usr/local/bin/python`  
- **相対パス**: 現在の作業ディレクトリから目的のファイルまでの相対的な経路。  
  例: `../bin/python`

### PATH環境変数とは？  
`PATH`は、シェルやOSがプログラムを探す際に利用する「検索するフォルダの一覧」を保持する環境変数です。
OSはコマンドが実行されると、そのコマンドを探しに行きます。
しかし、全てのフォルダを探しに行っていたらかなり時間がかかります。
そこで、PATH環境変数というものを用意し、そこに登録されているフォルダのみを探しに行くことで効率良く探すことができるようになります

#### PATH環境変数の中身（例: Unix系システム）
```bash
echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
※各ディレクトリはコロン（:）で区切られています
```


### パスを通すとは？
「パスを通す」とは、プログラムの実行ファイルが存在するディレクトリをPATH環境変数に追加することを意味します。これにより、ディレクトリを明示せずにプログラムを実行できるようになります。
#### 具体例
実行可能ファイルのあるディレクトリが /usr/local/myapp/bin だと仮定
このままだと、次のようにフルパスを指定しないと実行できません。

```bash
/usr/local/myapp/bin/myapp
```
しかしパスを通すことで、単に `myapp` と入力するだけで実行可能になります

パスを通す際はこのように書くことでPATH環境変数に追加することができます
```bash
export PATH=$PATH:/usr/local/myapp/bin
```

## パスを通さないと困ること
### プログラムが実行できない
前述の通り、パスを通さないと実行可能ファイルのフルパスを毎回指定しなければならないため、手間が増えます。
特に複数のプログラムを組み合わせるスクリプトでは、各プログラムのフルパスを書く必要が出てきます。

### コマンドが見つからないエラー
コマンドが存在していても、PATHに含まれていない場合、次のようなエラーが発生します

```bash
myapp: command not found
```
おそらく環境構築時によく見かけるエラーではないでしょうか。
このエラーが出た場合はまずパスが通っているか疑うのが良いかと思います


## 実際にパスを通す方法
### 一時的にパスを通す
シェルセッション内でのみ有効。セッション終了時にリセットされるため、次回新たにシェルを起動した際には元に戻っている

```bash
export PATH=$PATH:/path/to/directory
```

### 永続的にパスを通す
**こっちの方がよく使います。**
シェルの設定ファイルを編集して永続的に設定します。

Bashの場合
- ~/.bashrc または ~/.bash_profile を開き、下記を追加
```bash
export PATH=$PATH:/path/to/directory
```
- 設定を反映する
```bash
source ~/.bashrc
```

Zshの場合
- ~/.zshrc を編集し、Bashと同じ手順で追加します

## まとめ
パスは、プログラムやファイルの位置を示す「住所」のようなもの。
パスを通すことで、プログラムをフルパスを指定せず簡単に実行することができるようになります。
`command not found`に出会えたらまずは出会いに感謝し、落ち着いてパスを通すようにしましょう。
コンテンツファイルのプレビューの問題


**使っているクラウドなどの小ネタ Advent Calendar 2024 16日目**


プレビュー用にPDFを生成しているようですね。知らなかったです。


>コンテンツファイルが Salesforce にアップロードされると、アプリケーションがファイルコンテンツの PDF バージョンを生成し、その PDF からオンラインプレビュー用の SVG バージョンのファイルが生成されます。

>これはすべてにおいて発生するわけではなく、プレビュープロセスは常に改良されています。次に挙げる Office および全般的なファイルの機能には、コンテンツプレビューの表示で問題が発生する可能性があることが判明しています。

+ [コンテンツファイルのプレビューの問題](https://help.salesforce.com/s/articleView?id=000387545&type=1)

:::note
以下のヘルプを読んでみると、Salesforce側でPDFを生成していますね。この時にはやはりExcel等で設定されている印刷設定を使っているかもしれません。しかい断定できるかは不明な感じです。

 コンテンツファイルが Salesforce にアップロードされると、アプリケーションがファイルコンテンツの PDF バージョンを生成し、その PDF からオンラインプレビュー用の SVG バージョンのファイルが生成されます。 

https://help.salesforce.com/s/articleView?id=000387545&type=1

以下の質問を読むとどうも日付のフォーマットはSalesforce側の設定を参照しているみたいなので、厳密にファイルの設定とも言い切れない感じです。

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ahL9PSAU
:::

:::note
Excel以外にWordファイルも上げてみましたが、表示が大幅に崩れてしまったため、印刷設定のみが関係するわけでもないようです。

レイアウトを気にする場合は、PDFでアップロードする運用にした方が安全かと思いました。
:::
取り組む時のルールについて

この記事は、[適応型ソフトウェア開発 アドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/adaptive-software-development) の 5日目です。

## 適応型ソフトウェア開発に取り組むときのルール

どんなフレームワークにもルールはある。

それにこのフレームワークでは、「状態」という今までは触れてこなかった指標をベースに開発を進めていくことになるため、さぞ複雑なルールが存在するのだろうと筆者は考えていた。

しかし、書籍を読む限り全くそうではない。
これがまた私の思考的にうれしい一致だった。

## 簡単なルール × 豊かな人間関係 = 圧倒的な適応力

唯一のルールは、この方程式を意識して満たすことだけだった。

簡単なルールをチーム内で作り、チームは家族であると言わんばかりに豊かな人間関係を構築すること。

この２つを形成することによって、圧倒的な適応力を身に着けることができる。

これがフレームワークを取り扱う上での、唯一のルールだった。

もちろん、細かいプラクティスは存在するが、鉄のおきてはこれだけである。


## 実際に取り組んだ

実際にチームで取り組むにあたって、筆者のチームでは難しいルールと豊かな人間関係を有したチームだった。

難しいルールというのは、複雑に入り組んだ商材を取り扱っているのに、その商材にミスマッチなフレームワークを選んでしまったことで、ルールに縛られている現状があったことだ。

また、すでに豊かな人間関係を手にしていた理由は、そんな状況下でも必ず振り返りを毎週欠かさずに行っていたり、Good&Newという心理的安全性を高めるための施策を毎日繰り返し行っていたことがポイントだった。

難しいルールを破棄することで、適応型ソフトウェア開発で求められるルールを順守することができる形を形成することができた。


実際、このルールは非常に受け入れやすく、チーム内でもみんなが何だかほっこりする良いルールだったと思う。

このルールを守りながら、私たちは適応型ソフトウェア開発にのめりこんでいくことになった。
スクラムとの違いは何か

この記事は、[適応型ソフトウェア開発 アドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/adaptive-software-development) の 4日目です。

## スクラムとの違い

適応型ソフトウェア開発とスクラムの明確な違いは何か。

それは、完了の定義にあると考えている。


## スクラムの場合
チームで定めた完了の定義や成果物のリリースをもって、完了とするケースが多いと思う。

実際に、そのタスクをリリースするまでに必要な相対見積もりをとり、ストーリーポイントという見かけの数字を用いて、見通しを測っていく。

このリリーススパンをどれだけ集中して早く進められるのかを突き詰めるのがスクラムフレームワークの良いところだと個人的には考えている。


## 適応型ソフトウェア開発の場合
適応型ソフトウェア開発の場合、まず創るものがわからないところからスタートする。

そのため、明確な完了の定義や成果物のリリースまで到底届かないところから始めることが前提になっている。

その結果、重視するのは完了の見通しではなく、「状態」変化までの見通しだ。

### 状態変化までの見通し
この「状態」という概念が適応型ソフトウェア開発では最も重要なものになる。

「状態」は３つの言葉で示される。

それは、学習・思案・協調の３点だ。

### 学習・思案・協調
この３つそれぞれの「状態に至る」ことをタスク完了の定義とすると、イテレーションが回り始める。

この時、状態変化する際には何かしらのアウトプットが発生することを期待していることが多く、
そのアウトプットを出すまでにかかる見通しをチームに開示しながら進めていく。

この状態変化にかかるスパンをどれだけ早く回していけるのかを突き詰めるのが、適応型ソフトウェア開発の神髄なのかもしれない。


## スクラムと適応型ソフトウェア開発で違うことは少ない

計画を立て、見通しを大切にし、案件を高速で振り返りながら進むというプロセスには、違いはない。

明確に違うのは、タスクに対する切り口の違いでしかない。

この切り口の違いを正しく認識し、適切に行使できるかできないかがアジャイル開発におけるフレームワークの選定基準の１つなのかもしれない。
Python の unittest で Mock を使用しテストの幅を広げる

## はじめに

ユニットテストにおいて、外部依存性（データベース、API、ファイルシステムなど）の分離は重要な課題です。
Python の `unittest.mock` は、このような依存性を効果的にモック化するための強力なツールを提供します。

https://docs.python.org/ja/3/library/unittest.mock-examples.html

この記事では、外部 API を呼び出すクラスのテストを例に、`unittest.mock` の実践的な使い方を詳しく解説します。

## テストターゲット

次のような処理でユーザー情報を取得するクラスのテストを実装することを考えます。

```python
import requests

class UserService:
    def get_user_data(self, user_id):
        response = requests.get(f"https://example.com/users/{user_id}")
        return response.json()
```

※ 以前紹介した Requests ライブラリを使用してみました

https://qiita.com/pokapu/items/2ba221568a59ef6f72de

### テストの課題

対象の API が叩き放題であれば、おそらく下記の記事に沿ってテストを実装すれば実現は可能です。

https://qiita.com/pokapu/items/902dfb190264a7fc0e2a

しかし通常は下記のような課題があります。

- テストの実施にネットワーク接続が必要になる
- API の応答が遅いため、テストに時間がかかる
- API によっては、API コール時に課金される可能性がある
- テストの安定性と再現性の低下が懸念される

API の呼び出し部分はモック化し実際には呼び出さないようにして、API の仕様に沿ってダミーのレスポンスを返すようにできないでしょうか ?

## モックテスト

`unittest.Mock` を使用することで、API を呼び出している `requests.get` の振舞いを Mock に置き換えることができます。
下記のコードをご確認ください。

```python
import unittest
from unittest.mock import Mock, patch

class TestUserService(unittest.TestCase):
    @patch("requests.get")
    def test_get_user_data(self, mock_get):
        # モックのレスポンスを設定
        mock_response = Mock()
        mock_response.json.return_value = {
            "id": 1,
            "name": "Test User",
            "email": "test@example.com",
        }
        mock_get.return_value = mock_response

        # テスト実行
        service = UserService()
        result = service.get_user_data(1)

        # 検証
        self.assertEqual(result["name"], "Test User")

        # APIコール検証
        mock_get.assert_called_once_with("https://example.com/users/1")
```

### `@patch` デコレータの詳細

`@patch('requests.get')` は、テストメソッド内で `requests.get` メソッドをモックに置き換えます。

主な特徴：

- テストスコープ内でのみモックが有効
- テストメソッドの第 2 引数としてモックオブジェクトが渡される
- テストメソッド終了後に自動的に元の関数に戻る

### `return_value` の活用

置き換えたメソッドの振舞いは、`test_get_user_data` メソッドの第 2 引数 `mock_get` を変更することでエミュレートできます。
今回の場合、`return_value` にダミーの値を設定することで、`get` メソッドの戻り値をテスト用のものに加工しています。

## エラーケースのテスト

エラーを擬似的に発生させるには、Mock に `side_effect` を設定します。
下記のように記載することで、`requests.get` の実行時に例外を発生させられます。

```python
@patch("requests.get")
def test_api_error_handling(self, mock_get):
    # HTTPエラーをシミュレート
    mock_get.side_effect = requests.exceptions.HTTPError("Not Found")

    service = UserService()

    with self.assertRaises(requests.exceptions.HTTPError):
        service.get_user_data(999)
```

## まとめ

`unittest.mock` を使用することで、下記が実現できます。

- 外部依存性からテストを分離
- 高速で安定したユニットテストの実装

今回は一部の例のみをご紹介しましたが、入門サイトを見ると様々なケースへの対応方法が記載されていますので、一度確認してみてはいかがでしょうか ?

https://docs.python.org/ja/3/library/unittest.mock-examples.html
OpenSSHのバージョン差異で私だけSSH接続ができなかった問題

## 概要
サーバにSSH接続を試みたところ、接続に失敗。
メンバーに試してもらうと、同じpemを使用して接続に成功したためローカル環境依存だとはわかった。
しかし、エラーメッセージからは何が原因か判断できず解決に時間がかかったお話。

## 結論
[OpenSSHのリリースノート](https://www.openssh.com/txt/release-8.9)を確認すると、
OpenSSH 8.8以降はデフォルトでRSAのSSH接続が無効になっていた。

一時的な回避策としては、下記オプションを設定することで接続が可能。（非推奨）
```
ssh -oHostKeyAlgorithms=+ssh-rsa -oPubkeyAcceptedAlgorithms=+ssh-rsa {接続先}
```

さらに、~/.ssh/configにこの設定を追加することで、
SSHコマンド実行時に設定が不要になる。（非推奨）
```
Host {接続先}
  HostKeyAlgorithms=+ssh-rsa
  PubkeyAcceptedAlgorithms=+ssh-rsa
```

## 経緯
サーバ接続時に下記エラーが発生。
```
ssh -i ~/.ssh/XXX.pem {接続先}
sign_and_send_pubkey: no mutual signature supported
{ユーザ名}@{接続先IPアドレス}: Permission denied (publickey).
```

Permission Deniedを鵜呑みにしてしまったため、見当違いの調査を行なってしまった。

また、自社のメンバーに接続を試してもらった所、
接続に成功したため逆に謎が深まった。

解決したきっかけは別サーバにて接続を試した際に、
下記のエラーが出力されたため。
```
ssh -i ~/.ssh/XXX.pem {接続先}
Unable to negotiate with {接続先IP} port XXXX: no matching host key type found. Their offer: ssh-rsa,ssh-dss
```

OpenSSHのバージョンが原因で自分だけ接続できないことがわかった。　
[OpenSSHのリリースノート](https://www.openssh.com/txt/release-8.9)

OpenSSHのバージョンを確認し、バージョンが8.8以降であることを確認。
```
ssh -V
OpenSSH_9.7p1, LibreSSL X.X.X
```

一時的な対応として、`-oHostKeyAlgorithms=+ssh-rsa -oPubkeyAcceptedAlgorithms=+ssh-rsa`を加えることで無事接続成功。
```
ssh -oHostKeyAlgorithms=+ssh-rsa -oPubkeyAcceptedAlgorithms=+ssh-rsa {接続先}
```

## まとめ
ssh-keygenコマンドで`-t rsa`はしない。
既存の鍵がRSAの暗号化方式の場合、置き換えを検討する。
この回避策は暫定対応とすること。
2024 年 11 月 15 の障害の覚え

**使っているクラウドなどの小ネタ Advent Calendar 2024 15日目**



+ [2024 年 11 月 15 日に複数の Salesforce インスタンスで発生したサービス障害に関するご報告](https://help.salesforce.com/s/articleView?id=003876113&type=1)

気になるところ。SSOでは接続できたとの投稿がXにあったけど私のドメインにログインすれば問題なかったみたいですね。今後の対応としては覚えておいた方がいいかもしれません


>最初の障害発生時、影響を受けたユーザーは Salesforce にログインできないか、どのサービスにもアクセスすることができませんでした。ご利用の機能によっては、一部のお客様に、メール-to-ケースの配信エラーなどの影響がさらに生じていた可能性があります。

>また、Hyperforce インスタンスをご利用の一部のお客様においては、本障害の影響を受けた Salesforce のログインプールにリクエストが送信された場合、login.salesforce.com サイトからログインできない問題が発生した可能性があります。なお、この変更は Hyperforce 環境には適用されないため、Hyperforce インスタンス自体には影響がありませんでした。**ユーザーは、[私のドメイン] から直接ログインすることができました。**

ログインのところでエラーになっていたので、Trust Siteを見ても正常になっていたということですね。

# 過去の障害

+ [複数の Salesforce インスタンスで発生したサービス障害のまとめ](https://qiita.com/Keiji_otsubo/items/d11363a52934bfdace05)
C言語で簡単に実装できる整数キーの連想配列

# はじめに

C言語の標準ライブラリには、連想配列は存在しない。
一般的な連想配列の実装にはハッシュテーブルや平衡二分探索木があるが、それぞれ以下の欠点がある。

* ハッシュテーブル
  * 格納するデータが少ない場合でも、ハッシュ関数が返しうるデータの種類数を長さとする配列が必要になる
  * 格納された要素の走査がしにくい
* 平衡二分探索木
  * 実装が面倒・複雑で、エンバグしやすい

そこで、本記事では、要素の走査がしやすく、かつ簡単に実装できる連想配列を提案する。

# こんなときに便利！

* 連想配列に格納された要素を走査して処理を行いたいとき
* 格納する要素数に合ったメモリ消費量で要素を管理したいとき

# アルゴリズム

二分木を用意する。
非負整数のキーを受け取る。
ニ分木の根からスタートし、以下の法則で木を降りていく。
その際、無いノードは作成する。

* 現在のキーが `0` である場合、現在居るノードに要素を格納する
* そうでない場合、現在のキーを2で割った値を新しいキーとして、子に移動する
  * 現在のキーを2で割った余りが `0` の場合は、左の子に移動する
  * 現在のキーを2で割った余りが `1` の場合は、右の子に移動する

木のノードとそこに要素を格納するキーの関係は、以下のようになる。

![0～9のキーに対応するノード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/551b09d8-e7f2-3d3f-273f-6efe19ca367e.png)

このアルゴリズムではキーを非負整数としているが、キーが負の整数の場合は符号を反転して別の木に格納することで、一般の整数に拡張できる。

# 実装例

```c
/* 連想配列の実装に用いる */
#include <stdlib.h>

/* デモ用 (連想配列の実装には用いない) */
#include <stdio.h>
#include <string.h>

/* 木のノードを表す構造体 */
struct map_node {
	/* 連想配列に格納するデータ (今回は整数) */
	int value;
	/* ノードの子へのポインタ */
	struct map_node* next[2];
};

/*
木の根を表すポインタへのポインタ node と、要素を取得するキー key を受け取る。
キーに対応するデータへのポインタを返す。
*/
int* map_get(struct map_node** node, unsigned int key) {
	/* ノードが無い場合は、作成する */
	if (*node == NULL) {
		/* ノードを作成し、データを 0、子へのポインタを NULL で初期化する */
		*node = calloc(1, sizeof(**node));
		/* 作成に失敗した場合、終了する */
		if (*node == NULL) exit(1);
	}
	/* キーが 0 なら、このノードに格納されているデータを返す */
	if (key == 0) {
		return &(*node)->value;
	}
	/* 子に移動する */
	return map_get(&(*node)->next[key & 1], key >> 1);
}

/*
以下の形式のクエリを受け付ける。
set x y : キー x に値 y を格納する
get x   : キー x に対応する値を出力する
exit    : 終了する
*/
int main(void) {
	struct map_node* map = NULL;
	char query[8];
	while (scanf("%7s", query) == 1) {
		if (strcmp(query, "set") == 0) {
			unsigned int key;
			int value;
			if (scanf("%u%d", &key, &value) != 2) return 1;
			*map_get(&map, key) = value;
		} else if (strcmp(query, "get") == 0) {
			unsigned int key;
			if (scanf("%u", &key) != 1) return 1;
			printf("%d\n", *map_get(&map, key));
		} else if (strcmp(query, "exit") == 0) {
			break;
		}
	}
	return 0;
}
```

# 効率

キーに対応するノードを特定するためにたどるノードの数は、キーのビット数程度である。
よって、キーの最大値を $N$ として、$O(\log N)$ でキーに対応するノードを特定できる。
キーに対応するデータのポインタを取得し、それを用いて読み書きを行う方式なので、データの取得も設定も探索コストは同じである。

一方、キーとノードの関係の図を見るとわかる通り、このアルゴリズムではキーに対応しないノードが発生する。
そのため、全てのノードにデータを格納する平衡二分探索木よりはメモリ効率が悪いと考えられる。

# 格納されている要素の走査

このアルゴリズムでは要素をニ分木に格納するため、DFSなどにより木のノードを走査することで、要素を走査できる。
ただし、走査の順番は素直な昇順・降順などにはならない。
また、キーに対応しないノードや、まだ対応するキーを用いたアクセスがされていないノードもあるため、別途 valid フラグを用意したり、使わない (無効な) 値で初期化したりするなど、有効な値が格納されたノードとそうでないノードを見分けられるようにしておかなければならない。

# 使用例

:::note warn
ネタバレ注意！
:::

以下にこのアルゴリズムを使用した提出へのリンクを示す。

* 成功例：[ABC329 F - Colored Ball](https://atcoder.jp/contests/abc329/submissions/58114067)
* 失敗例：[ABC379 G - Count Grid 3-coloring](https://atcoder.jp/contests/abc379/submissions/60013646)
3秒で提案？！AIが叶える冷蔵庫の食材からお弁当メニュー提案機能をRailsで実装！

# はじめに

この記事は、株式会社スピードリンクジャパン Advent Calendar 2024 の4日目の記事です。

https://qiita.com/advent-calendar/2024/slj



こんにちは！社会人１年目の石川です。
まずは、この記事を開いていただきありがとうございます！
現在、私はRailsを使ってAI機能を組み込んだサイトの開発をしています。開発を進める中で、「AIってすごいな…！」と驚かされることが多々ありました。
そこで今回は、そのAIの力を借りて、「お弁当メニューを提案してくれる機能」をRailsで作ってみたので、その過程を皆さんに共有したいと思います！

# 目次
1. [お弁当提案機能を作った理由](#お弁当提案機能を作った理由)
2. [開発環境](#開発環境)
3. [機能の説明](#機能の説明)
4. [実装の詳細 ](#実装の詳細)
6. [まとめ](#まとめ)

# お弁当提案機能を作った理由
「なんでお弁当提案？」と思われた方もいるかもしれませんので、少しだけ背景をお話しします。
私は毎週日曜日に一週間分のお弁当を作り置きしています。学生時代、老人ホーム用の食事を調理するアルバイトをしていたり、大学の栄養学の授業を履修していたりと、昔から「食」への興味は大きい方でした！そして、料理も好きです！
ただ…毎週お弁当を作り続けていると、「冷蔵庫の中身は大体同じだなぁ…」「これ、また同じメニューだ」と飽きてしまうことも多く、次第に新しいアイデアを考えるのが負担になってきました。
そこで、「AIに助けてもらおう！」と思い立ちました。**冷蔵庫の余り物から簡単にメニューを提案してくれるAI機能があれば、毎週のお弁当作りももっと楽しくなるはず！** そんな思いで、この記事を書いています！
最後まで読んでいただければ幸いです。
# 開発環境
- **Ruby**: 3.2.2
- **Rails**: 7.1.3.4
- **データベース**: MySQL 8.4.2
- **AI**: OpenAI API
- **CSSフレームワーク**: Tailwind CSS
- **コンテナ化**: Docker
# 機能の説明
作成したお弁当提案機能について概要を説明します！
#### 1. 食材を入力
使いたい食材を入力欄に記入します。複数の食材を使いたい場合はカンマ区切りで入力します。
例: 鶏肉, ほうれん草, 卵
#### 2. 味の好みを選択
和風、洋風、中華の中から好みに合うものを選択します。
#### 3. オプション設定
ヘルシー、節約、時短の3つのオプションから重視したいものを選択します。複数選択も可能です。
#### 4. 提案を生成
「提案を生成」ボタンを押すと、AIが以下の情報を含むメニューを提案します。
- メニュー名
- 主な食材
- 簡単な調理方法
- 調理時間
以下の画像が実際の画面です！
##### 入力画面
![お弁当メニュー提案](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787308/c88a2f48-1282-b9b1-2d28-178c959e8ba7.png)
##### 提案結果画面
![お弁当メニュー提案結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787308/83488306-815e-d1d5-5fc6-66ed465f7a4f.png)
# 実装の詳細
以下に主要な部分の実装詳細を紹介します。
##### 入力フォーム部分（view）
ユーザーが使用する食材や味の好み、オプションを入力するフォームです。
- `form_with`を使用してデータを送信
- 入力欄、チェックボックスなど、ユーザーが直感的に操作できるUIを提供
##### リクエスト処理と結果の受け渡し部分（controller）
フォームから送信されたデータを受け取り、AIへのリクエストを処理です。
Formクラスを使用してプロンプトを生成し、OpenAIのAPIを呼び出します。生成された結果をビューに渡します。
- create メソッド内で入力データを整形し、AdForm を利用してAIから提案を生成
- 結果が存在する場合はビューに渡し、結果がない場合はエラーメッセージを表示
##### 提案結果部分（view）
APIから返却された結果を整形して表示します。
- 各メニュー名、使用した主な食材、調理方法、調理時間をリスト形式でわかりやすく表示する
##### プロンプト（yml）
AIにリクエストを送る際のテンプレートを定義します。
- ユーザーの入力を動的に挿入し、AIが理解しやすい形式でプロンプトを構築
##### ロジック部分（formクラス）
ユーザーの入力データを整形し、プロンプトを生成します。
APIへのリクエストを送信し、返却された結果を解析します。
generateメソッドでプロンプトを生成し、APIリクエストを送信します。
- 結果の解析には正規表現を使用し、データを構造化して整形
# まとめ
本記事では、お弁当メニュー提案機能の実装について説明しました。プロンプト生成や結果の解析部分を工夫することで、応用範囲を広げることも可能です。今回は最低限の基本機能しか実装しませんでしたが、さらなる改良を加えることでより実用的な提案が実現できると考えています。
今後の展望として、食材の旬や流行を考慮したメニューや、これまでの提案メニューをリスト化する機能、買い物リスト生成機能などをつけたいと思いました！
最後まで閲覧いただきありがとうございました！
【基本情報】独学マラソン 線形探索 Day 28

:::note worn
この記事は自分用の備忘録です。
:::

## 線形探索（linear search）とは
端から順番に探す方法
配列[30, 60, 90]があって、60を探すときに
1番目：30 60ではない
2番目：60 60と一致　終了
みたいな感じ

```linearSearch.ts

type SearchParams = {
  array: number[];
  target: number;
};

function linearSearch({ array, target }: SearchParams): number {
  for (let i = 0; i < array.length; i++) {
    if (array[i] === target) {
      return i;
    }
  }
  return -1;
}
```

でもこれだと、毎回ループの最初に配列の長さをチェックしてしまう
現代のCPU的には条件分岐をなるべく削減するほうがいいらしい

そこで、ループに入る前に配列の最後にスプレッド構文でターゲットの値を追加しておいて、無限ループをさせると効率良く探索できる

セントリー法と呼ばれている

```sentinelLinearSearch.ts
type SearchParams = {
  array: number[];
  target: number;
};

function linearSearchWithSentinel({ array, target }: SearchParams): number {

  const sentinelArray = [...array, target];

  let i = 0;
  while (true) {
    if (sentinelArray[i] === target) {
      return i < array.length ? i : -1;
    }
    i++;
  }
}

```
これなら値が見つかったら即returnするし
値が元の配列に存在しなくても、最後に追加した分が必ず見つかるから
-1がreturnされる

例えば、配列のサイズが1兆（10^12）で毎回条件分岐（`i < array.length`）を行うと、1回ごとの処理が少なくても、その影響が累積して大きくなってしまう

配列をループで回すときにはわずかな処理も莫大になるかもしれないので気をつけよう



# 感想
無駄がないコードって気持ちいい

# 参考

https://wa3.i-3-i.info/word111109.html

https://trends.codecamp.jp/blogs/media/terminology371
API Connectのコンシューマー・カタログについて

# API Connect v10.0.8 LTSについて
API Connectは、2024年6月に新しいLTS v10.0.8をリリースしました。以前のLTS v10.0.5からv10.0.6、v10.0.7というCDリリースが提供されていましたが、これらで提供された機能を取り込む形で新しいLTS v10.0.8がリリースされています。現時点でv10.0.8.1がリリースされており新機能は[こちら](https://www.ibm.com/docs/ja/api-connect/10.0.8?topic=overview-whats-new-in-latest-release-version-10081)で確認できます。
新しい機能としては以下のようなものが提供されています。
+ APIガバナンス
+ APIディスカバリー
+ AIゲートウェイ機能(v10.0.8.1から)
+ Async APIの作成、インポート
+ コンシューマー・カタログ
+ などなど

この記事では、その中でもコンシューマー・カタログについて紹介します。

# コンシュマー・カタログとは？
コンシューマー・カタログは、API利用者が公開されているAPIの確認、APIを利用するアプリケーション管理、サブスクライブ、テストするための簡易的なWebポータルです。コンシューマー・カタログは、使用するリソースが少なく、素早く基本的なAPI情報へのアクセスを提供します。 
コンシューマー・カタログは、基本機能のみで十分な小規模なAPIカタログや社内ユーザーに適しています。

コンシューマー・カタログでは、組織名の変更や新しいメンバーの招待などのコンシューマー組織管理機能がなく、見た目のカスタマイズ等ができない制約があります。その他の制約事項は[こちら](https://www.ibm.com/docs/ja/api-connect/10.0.8?topic=catalogs-consumer-catalog-developer-portal-considerations)に情報があります。

# コンシューマー・カタログの設定
コンシューマー・カタログは全てのカタログでデフォルトでONに設定されており、APIマネージャーのカタログ設定から、URLを確認することができます。コンシューマー・カタログをOFFにすることも可能です。
左メニューの「管理」から該当するカタログを選択します。
「カタログ設定」タブをクリックし、「ポータル」を選択すると、コンシューマー・カタログのURLを確認できます。
![スクリーンショット 2024-12-03 15.09.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121209/364184d9-ff28-9b96-02b6-252a108b56b3.png)

# コンシュマー・カタログを確認してみる
URLからコンシューマー・カタログにアクセスができます。
トップページは非常にシンプルな見た目で、カタログに登録されている製品を確認できます。サインインが必要とのメッセージも確認できます。
![スクリーンショット 2024-12-03 15.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121209/bc430f91-f9b7-b43a-0794-67d46115df35.png)

右上の「アカウントの作成」からアカウント作成も可能です。
![スクリーンショット 2024-12-03 15.20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121209/461b36c6-3256-9100-52d9-73c203f74af0.png)

サインインすると、APIを利用するアプリケーションを作成でき、APIキーの発行、確認ができます。
![スクリーンショット 2024-12-03 15.22.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121209/cd61a6fe-976a-01d2-7e04-ea12c90ca7d7.png)

アプリケーション作成後は、API利用に必要なサブスクライブができるようになります。
![スクリーンショット 2024-12-03 15.23.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121209/f153d104-a545-88b7-921a-fc49e34d51fb.png)

また、API製品からテストも実施することができます。
![スクリーンショット 2024-12-03 15.40.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121209/e6880cc9-7f6b-89ec-ae00-601938436722.png)

# まとめ
API Connect最新のv10.0.8LTSで追加されたコンシューマー・カタログをご紹介しました。簡易的な開発者ポータルですが、API確認、APIキー発行、テストといったポータル機能に必要な機能は提供しています。
基本機能のみで十分というときに使える機能です。
Niebloid の導入と廃止

# Niebloid とは？

Niebloid とは、 `std::ranges` の元になったライブラリ [range-v3](https://github.com/ericniebler/range-v3) の作者である Eric Niebler さんの名前をもじった、C++ における「ADL(argument dependent lookup)を引き起こさない関数テンプレートのような何か」を指す言葉です。

この niebloid という概念は C++20 にて暗黙的に導入され、 C++26 で廃止されることになりました。一体何があったのでしょうか。

# Niebloid の導入

C++20 では `<algorithm>` ヘッダに既存のアルゴリズムと同名のものが `std::ranges` 名前空間以下に追加されました。
```cpp
namespace std {

  template <class I>
  auto reverse(I, I);  // #1

  namespace ranges {

    template <class I, class S>
    auto reverse(I, S);  // #2

    template <class R>
    auto reverse(R&&);

  }  // namespace ranges

}  // namespace std
```
このとき以下のような呼び出しを行うと、#1 と #2 のいったいどちらが呼び出されるのでしょうか。

```cpp
template <class R>
void func(R&& r) {
  using namespace std::ranges;

  reverse(begin(r), end(r));  // std::ranges::reverse を呼んでほしい
}
```
もし `begin(r)` や `end(r)` の型が `std` 名前空間になければ、見えている関数は `std::ranges::reverse` だけなのでそちらが呼び出されますが、`std` 名前空間に含まれている場合は ADL によって `std::reverse` も候補に入り、もし２つの型が同じならば #1 の関数が優先されてしまい、これは意図通りではありません。

もしここで `reverse` が関数オブジェクトとして実装されていたとすれば、 ADL は関数や関数テンプレートに対してしか働かないので問題は解決しますが、かといって C++ 標準規格としては今まで通り関数テンプレートとしてアルゴリズムを規定したいという思いがあり、そこで niebloid が導入されました。(明示的に niebloid という語が規格に導入されたわけではありませんが)

# Niebloid の廃止

こうして導入された niebloid ですが、各処理系がそのような特殊な機能を用意したわけではなく、結局のところ関数オブジェクトとして実装されていました。[^1]
[^1]: MSVC では niebloid をわざわざコピー・ムーブ不可としてオブジェクトとしての使用を禁じていました

そして関数オブジェクトではないかもしれないことによるデメリットとして、関数オブジェクトを引数に取る関数には niebloid を直に渡せないことがあります。

```cpp
// std::ranges::distance は niebloid なので…

// 動かない「かも」しれないコード
auto x = std::views::transform(r, std::ranges::distance);

// 「正しい」呼び出し
auto y = std::views::transform(r, [](auto&& v) { return std::ranges::distance(v); });  
```

これらのことから標準化委員会も niebloid とするデメリットの方が大きいと考えたようで、C++26 では前述のアルゴリズムたちを関数オブジェクトとすることになりました。[^2]

[^2]: [P3136R0 Retiring niebloids](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3136r0.html)

# あとがき

多くのユーザーにとってこの変更は気づかないほど些細なものです。
しかし C++26 からは `std::ranges` 以下の関数群を気兼ねなく関数オブジェクトとして引数に投げられますね。

嬉しい！

# 参照

https://brevzin.github.io/c++/2020/12/19/cpo-niebloid
AWS 基礎からのネットワーク&サーバー構築

# 書籍

https://bookplus.nikkei.com/atcl/catalog/23/04/06/00757/

# ネットワークの構築

## 手順

## 1. IP アドレス範囲の選定

**パブリック IP アドレス** (グローバル IP アドレス)：

ネットワークで利用する IP アドレス。
好き勝手に設定することは出来ず、**ICANN**という団体が一括管理している。

**プライベート IP アドレス**：

パブリック IP アドレスとは反対に、ネットワークで利用されない IP アドレス。
誰にも申請することなく自由に使うことができる。
社内 LAN やネットワークの実験などに用いる。

**ネットワーク部**：

IP アドレスを 2 進数に変換した際の「共通ビット部分」で、同じネットワーク内に属するアドレスを識別。
例：192.168.1.0 ~ 192.168.1.255 の場合、「192.168.1」。

**ホスト部**

IP アドレスのうちネットワーク内の各端末（ホスト）を識別する部分。
同じネットワークに属するホスト間では、この部分が一意である必要がある。
192.168.1.0 ~ 192.168.1.255 の場合、「0~255」。

**CIDR 表記**

IP アドレスを 2 進数で表記したとき、「ネットワーク部のビット数」を「/ビット長」で示す方法。
192.168.1.0 ~ 192.168.1.255 の場合、「/24」。

**サブネットマスク表記**

「ネットワーク部のビット数」だけ 2 進数の「1」を並べ、残りは「0」で埋めて示す方法。
192.168.1.0 ~ 192.168.1.255 の場合、「/255.255.255.0」。

## 2. VPC の作成

**VPC**：

AWS 上に構築するプライベートなネットワーク空間。

## 3. VPC をサブネットに分割

**サブネット**：

VPC などの 1 つの大きなネットワークをより小さな部分に分割したもの。
下記のような目的がある。

1. ネットワークの効率化
2. セキュリティの向上
3. トラフィックの分離

**パブリックサブネット**：

インターネットに接続できるサブネットのこと。
Web サーバーなどを配置する。

**プライベートサブネット**：

外部(インターネット)から直接アクセスされないサブネットのこと。
DB サーバーなどを配置する。

## 4. インターネットゲートウェイのアタッチ

**インターネットゲートウェイ**：

サブネットをインターネットに接続するために利用される。

## 5. ルートテーブルの設定

**ルートテーブル**：

ネットワーク内でデータがどこに送られるべきかを決定するためのルールを定義した表のこと。
サブネットに対して設定する。

例：

| 宛先(Destination) | ターゲット(Target)                     |
| ----------------- | -------------------------------------- |
| 10.0.0.0/16       | local                                  |
| 0.0.0.0/0         | igw-xxxxx (インターネットゲートウェイ) |

# サーバーの構築

## 手順

## 1. EC2 インスタンスの作成

## 2. セキュリティグループの設定

**ファイアウォール**：

通してよいデータだけを通して、それ以外を遮断する機能。

**パケットフィルタリング**：

IP アドレスとポート番号など、パケットに付随する各種情報を見て、通過の可否を決める仕組み。
「特定の IP アドレスを送信元とするパケット以外を除外する」ように構成すれば、接続元を制限できる。

**セキュリティグループ**：

実世界ではルーターやサーバー、もしくは専用のファイアウォール機器がパケットフィルタリングを構成するが、AWS では、インスタンスに対して構成するセキュリティグループがこの機能を担当する。
CSVデータが読み込めない/予期しないEOFがあります(SPSS Modeler データ加工逆引き12-7)

# CSVデータが読み込めない/予期しないEOFがあります

![スクリーンショット 2024-11-25 16.15.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d42119e0-a0eb-af7b-3241-5ce3fc12b719.png)

## 1.想定されるトラブル

・CSVを含むテキストデータの読み込み時にエラーが起きる
   
## 2.ストリームとデータのダウンロード

ストリーム

https://github.com/yoichiro0903n/blue/raw/refs/heads/main/csv_eof.str

データ

https://github.com/yoichiro0903n/blue/blob/main/sample1.csv

## 3.サンプルストリームの説明

![スクリーンショット 2024-11-25 16.15.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1a56e719-8a33-89cd-21cf-d53a853ac770.png)

a.[可変長ファイル]ノードを編集します。

![スクリーンショット 2024-11-25 17.33.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9eb82b19-b2b4-ca30-3ef7-edd242abadaa.png)

#### エラーの確認

[テーブル]ノードを実行します。

![スクリーンショット 2024-11-25 16.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/caa92746-9f43-4827-765b-234efdac3722.png)

#### 原因特定のためにCSVファイルをエディタで表示

疑わしい箇所はセル内の折り返しと2行目の文字列[S'pore]にある記号です。実際には後者が原因になっています。

![スクリーンショット 2024-11-25 16.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2f24edc5-69ea-6016-9d25-cd7d672b5cab.png)

#### 問題を解決する

b.[可変長ファイル]ノードを編集します。[単一引用符]を[テキストとして含む]に変更します。

![スクリーンショット 2024-11-25 16.19.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/14fed7be-7fc5-90b7-d92d-1d1f41b5c10f.png)

[テーブル]ノードを実行します。

![スクリーンショット 2024-11-25 16.20.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8abb7f5e-395a-32f8-2c30-a42bbab68113.png)

#### 注意事項

テキストファイルが読み込めない場合や桁ずれする場合の要因は今回のような文字列に含まれる特殊な文字（カンマや空白、引用符）か、セル内の折り返しです。これをエディタで探索、置換するなどして対処します。

## 4.参考情報

#### 可変長ファイルノード

https://qiita.com/416nishimaki/items/8b84eb92da0b9426eb18

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008
【Suno AIでつくった楽曲】声でつながるAIとの対談: 挿入曲 #5【動画 3分45秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![01 YouTube再生中の画像 Suno AI _ 声でつながるAIとの対談_ 挿入曲 #5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/9e0f7b03-9f76-f977-eba0-948cdaf0c769.png)




* # 動画URL
    * https://youtu.be/a1O1urFbmpU

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】声でつながるAIとの対談: 挿入曲 #5【動画 3分45秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-12-02(月)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲を WAV で出力してから、動画編集いたしました。

“声でつながるAIとの対談”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghOpTHU0rmfXSgjqV1_j6Eao
👆の挿入曲としてつかう予定です。

ぜひ聴いてみてください。
そして、ぜひみなさんも、ご自身の対談、番組、コンテンツのために楽曲をつくってみてください！

作曲日:
2024-11-25(月)

Suno AI 契約の種類:
Pro Plan

Suno AI Version:
v4

楽曲の正式名称:
声でつながるAIとの対談: 挿入曲 #5 - AI Voice Talks: Minimal Melody #5

Suno AI Library URL:
https://bit.ly/AI-Voice-Talks-Minimal-Melody-05

Custom Mode: On

Audio Inputs: Not Used

Instrumental:


---


Suno AIへの指示文章( プロンプト/Prompt ): Custom Modeの場合は”Style of Music”を指定します。


🇬🇧English

Hip hop[Jazz][Piano][Ballad][220 Seconds][Break][Outro]


🇯🇵日本語訳

[ヒップホップ][ジャズ][ピアノ][バラード][220秒][ブレイク][アウトロ]


---


Suno AI 公式URL
https://accounts.suno.ai


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


　・“声でつながるAIとの対談”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOpTHU0rmfXSgjqV1_j6Eao


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/4eTHlPP