OmniAICreator/Qiita-1.07M huggingface dataset:
systemctl に自作サービスを追加

`/etc/systemd/system` 配下に serviceファイルを作成する。
書き方は [末尾のリンク](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/using_systemd_unit_files_to_customize_and_optimize_your_system/con_unit-file-structure_assembly_working-with-systemd-unit-files "RedHatサイトへ") を参考に。

```shell
# cat /etc/systemd/system/redmine.service
[Unit]
Description=Redmine server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/root/redmine-5.0.7
ExecStart=/usr/local/bin/bundle exec /root/redmine-5.0.7/bin/rails server -e production
TimeoutSec=300
ExecStop=/bin/kill -WINCH ${MAINPID}

[Install]
WantedBy=multi-user.target
```

`systemctl` コマンドで制御できるようになる。
```shell
# systemctl status redmine
○ redmine.service - Redmine server
     Loaded: loaded (/etc/systemd/system/redmine.service; disabled; preset: disabled)
     Active: inactive (dead)
```

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/using_systemd_unit_files_to_customize_and_optimize_your_system/index

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files#sect-Managing_Services_with_systemd-Unit_File_Create

https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff

systemd.service(5)
systemcd.exec(5)
WireGuardで除外リストの作り方

参照サイト
https://www.reddit.com/r/WireGuard/comments/awudup/how_to_exclude_local_network_packets_from/?rdt=58492

WireGuardではトンネルを通過させるネットワークを指定するが、
トンネルを通過させないネットワークは指定できない

# AllowedIPsに入力するネットワークを求める
https://www.procustodibus.com/blog/2021/03/wireguard-allowedips-calculator/

# AllowedIPsに貼り付ける
```config:wg0
AllowedIPs = 0.0.0.0/4, 16.0.0.0/6
```

上記で指定のネットワークはWireGuardのトンネルを通さないで直接アクセスできるようなる
Vueのデータバインディング

## はじめに

初めまして、Vue.jsを学び始めた初心者の方向けに、Vueの基本からComposition APIについて掘り下げていきたいと思います。
この記事では、Vueの基本的な概念や気づきを共有し、特にデータバインディングに焦点を当てて説明します。

## Vueとは
さっくりですがVueについて簡単に説明します。
Vueは、JavaScriptのフロントエンドフレームワークの1つで、MVVM(Model-View-ViewModel)パターンをベースにしたライブラリです。
以下に、Vueの特徴を記載します。
1. シンプルで学習しやすい
    ・ Vueは直感的な構文を持ち、JavaScriptとHTMLを組み合わせることができます。初心者でも扱いやすいのが特徴
2. 軽量で高速
    ・ Vueは小さなサイズのライブラリで、高速な動作を提供します。これにより、ページの読み込みやレンダリングが迅速に行える
3. コンポーネントベース
    ・ Vueはコンポーネントベースの開発を重視しており、UIを小さな再利用可能な部品に分割できます。これにより、効率的な開発が可能
4. リアクティブなデータバインディング
    ・ データの変更が自動的にビューに反映されるため、手動でDOMを操作する必要がありません。これにより、開発プロセスがスムーズになります。

## Vueのデータバインディング: Composition APIとOptions APIの比較
データバインディングは、Vue.jsにおける重要な概念です。Vue.jsでのデータバインディングに関するComposition APIとOptions APIの比較を通じて、両者の違いについて簡単に説明します。

### 使用環境
フロントエンドフレームワーク: Vue.js 3.2.13 （Composition APIを使用）
スクリプト言語: TypeScript 4.5.5
スタイル言語: CSS (Scoped styling)

### Options API
Options APIはVue.js 2.xで主に使用されていました。
以下は、Options APIを使ったデータバインディングの例です。
```vuejs
<script>
export default {
  data() {
    return {
      inputValue: '', // 入力値を保持するデータ
    };
  },
};
</script>

<template>
  <div class="data-binding-example">
    <!-- 入力フィールド -->
    <input v-model="inputValue" placeholder="何か入力してください" />

    <!-- 入力値の表示 -->
    <p>入力した値: {{ inputValue }}</p>
  </div>
</template>
```
Options APIを使用する場合、dataオブジェクト内にinputValueを宣言して、その後v-modelディレクティブを使って入力フィールドとバインドします。
### Composition API
Composition APIはVue.js 3.xで導入された新しいAPIです。
以下は、Composition APIを使ったデータバインディングの例です。
```vue
<script setup lang="ts">
import { ref } from "vue";

const inputValue = ref(""); // 入力値を保持するリアクティブな変数
</script>

<template>
  <div class="data-binding-example">
    <!-- 入力フィールド -->
    <input v-model="inputValue" placeholder="何か入力してください" />

    <!-- 入力値の表示 -->
    <p>入力した値: {{ inputValue }}</p>
  </div>
</template>
```
Composition APIを使うことで、コードを機能ごとにまとめることができ、再利用性やメンテナンス性を向上させることができます。

![アドベントカレンダー 5日目.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2544275/df64ffd2-5009-58ee-7e3a-32f340c815ef.gif)

上記GIFはComposition APIを使用して作成したものです。
入力内容が自動的にビューに反映される様子がわかりますね！

## まとめ
Vue.jsの基礎からComposition APIに焦点を当ててデータバインディングを説明しました。Composition APIを使用することで、コードを機能ごとにまとめ、再利用性やメンテナンス性を向上させることができます。Options APIとComposition APIの比較を通じて、プロジェクトの規模や開発ニーズに応じた適切なAPIの選択が重要であることも理解できました！
【AWS】グローバルインフラストラクチャ

# AWSグローバルインフラストラクチャとは
リージョンにあるアベイラビリティーゾーン上で、グローバルレベルのAWSサービスを運用するためのプラットフォーム。

# リージョンとは
クラウドサービスを構築する環境・場所の基本的な単位で、国や地域ごとに管理されている。日本には東京と大阪がある。リージョンの選択は任意だが、エンドユーザーが最も早くアクセスできるリージョンを選択するのが一般的。なお、各リージョンで利用可能なマネージドサービスに差がある場合もあるので注意。

複数のリージョンにわたってシステム構成も可であり、**マルチリージョン構成**という。マルチリージョン構成のメリットは以下である。

* グローバルな環境下でもサービスの要件に応じてリージョンを組み合わせることができる。
* 災害対策ができる。

:::note info
**エンドユーザー**
サービスの最終的な消費者
:::

# アベイラビリティゾーンとは
アベイラビリティゾーンは複数のサーバからなる1つ以上のデータセンタで構成されている。データセンタが複数あることで、1つが落ちてもサービスに影響が及びにくく、冗長性を高く保つことができる。

:::note info
**冗長性**
耐障害性を高めるためにシステム全体を二重化して予備のシステムを用意することを冗長化、冗長化によって信頼性や安全性が向上した状態を冗長性という
:::

# エッジロケーション
**CloudFront**などのコンテンツ配信ネットワーク(CDN)サービスの接続ポイントとして利用。送信した画像などをキャッシュすることで、地理的に離れたユーザにもより早くコンテンツを届けることができる。

:::note info
**CDN**
数多くのキャッシュサーバーなどで構成されたプラットフォームを用いることにより、Webサイト上のコンテンツを迅速にエンドユーザーに届けるための仕組み
:::


# 参考
https://www.youtube.com/watch?v=nNWdBqdbn9w&t=93s
https://www.sbbit.jp/article/cont1/51576
https://ntt.com/bizon/glossary/e-c/cdn.html
https://tenshoku-careerchange.jp/column/1603/
AWSの基本・仕組み・重要用語が全部わかる教科書
完全無料で画像を崩さず大サイズ（10MB以上）のPDFを翻訳し論文作成の効率を上げる

論文や本などの大きなメモリのPDFを翻訳したい場合どうしますか。

今回はMicrosoft　edgeの機能とDocTranslatorというGoogleの翻訳サービスを用いて完全無料で大きなサイズのPDFを翻訳する方法をお伝えします。

Google翻訳は便利ですね。PDFファイルも翻訳できます。ただし10MB以上の大容量のPDFファイルは翻訳ができません。

この場合どうすればよいでしょうか。結論から言いますとMicrosoftedgeの印刷機能でPDFを分割すればできます。（その手間が嫌な人はChatGPTに課金してくださいturboで使えます）

論文や本などの大きなメモリのPDFを翻訳したい場合、私は以下の方法をとります。

①Microsoft Edgeの印刷機能でPDFを分割する
②DocTranslatorで各ファイルを翻訳する
③ILovePDFで各ファイルを結合する

具体的な手順は、以下のとおりです。

Microsoft Edgeを起動し、翻訳したいPDFファイルを開きます。
①画面右上の「印刷」をクリックします。
②「印刷」ダイアログで、「ページ」タブをクリックします。
③「範囲」で「ページ」を選択します。
④「開始ページ」と「終了ページ」に、翻訳したいページの範囲を入力します。
④「OK」をクリックします。

すると、指定したページのみのPDFファイルが作成されます。

ILovePDFでも分割できますが分割で一枚ずつになってしまいます。何枚も翻訳していくのは少し面倒なのでmicrosoftの機能を使います。

その後以下のサイトで翻訳すれば画像が崩れずできます。

①作成したPDFファイルをDocTranslatorにアップロードします。
②翻訳したい言語を選択します。
③「翻訳」をクリックします。

https://www.onlinedoctranslator.com/ja/

翻訳がある程度の枚数で分かれていてもよい人はここまでで十分です。続いては１つのファイルにまとめます。

その後以下のサイトでPDFを結合します。

https://www.ilovepdf.com/ja/merge_pdf

大きなサイズのファイルの完成です。
Pythonで「論理演算子の使い方」の動作を確認してみた

# 概要

Pythonで「論理演算子の使い方」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/if/index6.html

# 実装

以下のファイルを作成しました。
```sample.py
num = 8
print(bool(num < 10 or num > 40))
num = 24
print(bool(num > 10 and num < 40))
old = 24
print(bool(not old < 20))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
True
True
True
```

# まとめ

何かの役に立てばと。
Wireshark, HTTPs

<!--
2023/11/24
-->
[picoCTF][Forensics][WebNet0]

## Writeup
* pcapファイルなので、Wiresharkで読み込み。
webパケットに絞り込み。中身は暗号化されている。
![screenshot 28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/0314a17c-6dc6-c198-b19e-81e6ccd43fae.png)
<br>

* 鍵ファイルの読み込みを実施
`Edit` `Preferences` `Protocols` `TLS`
RSA keys list `Edit…`で鍵ファイルを登録する。
![screenshot 21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/9f3f83bf-6f1c-c9dd-478f-01dfb2297861.png)
![screenshot 29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/c4e83926-5103-e5a5-2d63-dc4b7476f1f2.png)
<br>

* 復号された。
![screenshot 30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/31718dcb-4c7e-8f55-6fb6-a75a64eaf5e0.png)
<br>

* `Follow` `TLS Stream`を確認。
これは正解ではないようです。
![screenshot 33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/d08f83ef-4a82-fe37-1693-69dd814f993a.png)
<br>

* `Follow` `HTTP Stream`を確認。
画像を確認すれば良さそう。
![screenshot 34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/2c3a97a2-6524-7060-267f-26afe757cf9e.png)
<br>

* 画像を出力して、確認。
謎の画像。
![screenshot 35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/6056fed1-0e4e-183f-f680-dc09e25acfd4.png)
![screenshot 36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/0af6a16f-8212-0f22-838f-3053cf0468a9.png)
<br>

* `exiftool`でファイル情報を確認。
![screenshot 37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/78c0a6fb-d69e-0a98-2fd3-49b526c29009.png)
<br>

* 以上です。
ST7735SとILI9163Vの最小限の初期化を比較して遊ぶ


目的
カラー液晶のテスト


![o_cop831.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2fa72b12-d045-bc72-3b6b-7777c2c4032f.jpeg)


![o_cop832.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1f83da42-c4b4-e951-a13c-82ed2b60162d.jpeg)


ST7735S

```c++


//液晶の初期化処理
void NA_ST7735_P::TXDT144TF_ST7735S_Init(void)
{

  //----------  ST7735S Reset Sequence  --------//

  GPIO_RESET(1);//LCD_RESET=1;

  delay(1); //Delay 1ms

  GPIO_RESET(0);//LCD_RESET=0;

  delay(1); //Delay 1ms

  GPIO_RESET(1);//LCD_RESET=1;

  delay(120); //Delay 120ms

  LCD_Write_CMD(0x01);//SOFTWARE RESET
  delay(50);

  LCD_Write_CMD(0x01);//SOFTWARE RESET
  delay(50);

  LCD_Write_CMD(0x11);//SLEEP OUT
  delay(200);

  LCD_Write_CMD(0x29);//display on
  delay(100);

  LCD_Write_CMD(0x3a);//Interface pixel format
  LCD_Write_Data(0x05);//16bit mode
  delay(100);

  LCD_Write_CMD(0x36);//RGB-RGR format
  LCD_Write_Data(0x08);//RGB mode
  delay(100);

} //TXDT144TF_ST7735S_Init



```

ILI9163V

```c++


//液晶の初期化処理
void NA_ST7735_P::TXDT144TF_ST7735S_Init(void)
{

  //----------  ST7735S Reset Sequence  --------//

  GPIO_RESET(1);//LCD_RESET=1;
  delay(1); //Delay 1ms

  GPIO_RESET(0);//LCD_RESET=0;
  delay(1); //Delay 1ms

  GPIO_RESET(1);//LCD_RESET=1;
  delay(120); //Delay 120ms

  LCD_Write_CMD(0x01);//SOFTWARE RESET
  delay(50);

  LCD_Write_CMD(0x01);//SOFTWARE RESET
  delay(50);

  LCD_Write_CMD(0x11);//SLEEP OUT
  delay(200);

  LCD_Write_CMD(0x29);//display on
  delay(100);

  LCD_Write_CMD(0x36);//RGB-RGR format
  LCD_Write_Data(0x00);//RGB mode
  delay(100);

  LCD_Write_CMD(0x3a);//Interface pixel format
  LCD_Write_Data(0x55);//16bit mode
  delay(100);

} //TXDT144TF_ST7735S_Init



```
wslでnerves その36

# 概要
wsl(wsl2じゃない)でnervesやってみる。
qemu(x86_64エミュレータ、ラズパイじゃない)でやってみた。
生成したnerves_livebook.imgを、QEMUで起動してテストしてみた。
linux周りを、調査する。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/eb9203cf-7550-461c-696b-93ca48512c18.png)


# 実行結果

```
$ Toolshed.cmd("cat /proc/mounts")

/dev/root / squashfs ro,relatime 0 0
devtmpfs /dev devtmpfs rw,nosuid,noexec,relatime,size=1024k,nr_inodes=504672,mode=755 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /tmp tmpfs rw,nosuid,nodev,noexec,relatime,size=404064k 0 0
tmpfs /run tmpfs rw,nosuid,nodev,noexec,relatime,size=202032k,mode=755 0 0
/dev/rootdisk0p1 /boot/grub vfat ro,nosuid,nodev,noexec,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/rootdisk0p4 /root ext4 rw,nodev,relatime 0 0


$ Toolshed.cmd("cat /proc/uptime")

6634.86 6507.95

$ Toolshed.cmd("cat /proc/cpuinfo")

processor	: 0
vendor_id	: AuthenticAMD
cpu family	: 15
model		: 107
model name	: QEMU Virtual CPU version 2.5+
stepping	: 1
microcode	: 0x1000065
cpu MHz		: 2390.493
cache size	: 512 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm rep_good nopl cpuid extd_apicid pni cx16 hypervisor lahf_lm svm 3dnowprefetch vmmcall
bugs		: fxsave_leak sysret_ss_attrs null_seg swapgs_fence amd_e400 spectre_v1 spectre_v2
bogomips	: 4780.98
TLB size	: 1024 4K pages
clflush size	: 64
cache_alignment	: 64
address sizes	: 40 bits physical, 48 bits virtual
power management:


$ Toolshed.cmd("cat /proc/meminfo")
MemTotal:        4040632 kB
MemFree:         3800688 kB
MemAvailable:    3835508 kB
Buffers:           23788 kB
Cached:            96248 kB
SwapCached:            0 kB
Active:           109868 kB
Inactive:         105888 kB
Active(anon):      84552 kB
Inactive(anon):    52448 kB
Active(file):      25316 kB
Inactive(file):    53440 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                12 kB
Writeback:             0 kB
AnonPages:         95720 kB
Mapped:            62188 kB
Shmem:             52456 kB
KReclaimable:       7472 kB
Slab:              12140 kB
SReclaimable:       7472 kB
SUnreclaim:         4668 kB
KernelStack:        1036 kB
PageTables:          756 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     2020316 kB
Committed_AS:     190324 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        1100 kB
VmallocChunk:          0 kB
Percpu:              188 kB
DirectMap4k:       14196 kB
DirectMap2M:     4182016 kB

$ Toolshed.cmd("cat /proc/sysrq-trigger")

cat: can't open '/proc/sysrq-trigger': No such file or directory

```

以上。
もくもく会の有用性

みなさんこんにちは！
弊社ダイヤモンドファンタジーでは、月に3〜4回、会議室で[MOKU-MOKU WORKSHOP](https://diamond-f.connpass.com/)（もくもく会）を開催してます。

もくもく会自体に参加したことが無い方もいらっしゃると思うので、私が運用＆参加してみて感じた有用性について書こうと思います。

# なぜ開催しているのか
開催理由は、以下の4点です。

- 福利厚生
- 学習効率の向上
- 新しい出会い（人、情報）

# メリット
メリットはたくさんああります。
- **自宅より学習効率がよい**
周りもみんな学習しているので、学習環境として最高です。
- **相談しやすい**
特に、同じジャンルの学習をされる方がいれば、その場で相談できます。
- **新しい情報が手に入る**
全員、やってきたことや今やってることが少しずつ違うので、思わぬ収穫も。
- **軽食もある**
多くのもくもく会で、軽食が用意されてます。

# デメリット
デメリットは、そんなに無いです。
- **移動時間がかかる**
当然ですが、移動時間がかかります。
しかし、それを大きく上回るメリットがあります。

# 実際の内容
弊社で開催しているもくもく会の内容をご紹介します！
## イメージ
弊社もくもく会のイメージは、こちらです！
![IMG_20231024_091910_370.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/462fc4a4-ddcd-a9d9-924c-579027f32f6f.jpeg)
楽しそうですね😃
DALL-Eを利用して作ったのですが、まさに私がイメージしているものになりました👍
## 軽食
弊社でご用意している軽食は、こちらです！
![-c7ucmo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/902c60bf-08e9-bc33-1f13-da424fd26e52.jpeg)
弊社では、できるだけ健康的な軽食をご用意してます。
内容が若干変わることもありますが、基本はお茶、Base Bread、BE KINDです。
（定期的に内容を見直す予定）

## スケジュール
スケジュールは以下の通りです。
 時間 | 内容  | 備考 |
|:------------ |:--------------|:------------|
| 19:30 | 開場 | 到着したら、自由にスタート |
| 20:00 | 本日やることの共有 | 当日中に終わらなくてOKです！ |
| 20:15 | もくもく開始 | 適宜、雑談しながら楽しくもくもく |
| 21:30 | 成果報告 | 途中までの成果報告でも大丈夫です:thumbsup: |
| 22:00ごろ | 解散 | 雑談をしながら、ご都合にあわせて |

## 実際に運用＆参加した感想
- **集中しやすい**
人にもよるとは思いますが、周りがみんな集中しているので、私は集中しやすいです。
- **学習効率の高さを体感できる**
言葉で表現しにくいのですが、自宅でやるよりも、学習効率の高さを感じます。やはり学習の空気である、というのが大きいのだと思います。
- **時間が過ぎるのが早い**
2時間ちょっとありますが、もうこんな時間？と思うこともしばしば。集中できている証拠ですね。
- **お互いに情報交換できる**
現在取り組んでいる内容とか、良かった点、困っている点、疑問点などを聞くと、とても勉強になりますし、いい刺激を得られます。また、それに関して知っていることがあれば、その場で解決します。
- **カフェより良い**
まさに学習のための環境であり、軽食もあるので、カフェやファミレスよりいいです。
カフェでやるのが好きな方もいらっしゃるとは思いますが、長時間の座席確保はお店や他のお客様のご迷惑になることもあるので、できれば用意された場所の方がいいと思います。

# まとめ
今回は、もくもく会について情報を共有させていただきました。
まだ参加したことが無い方は、一度参加してみることをおすすめします:smiley:

[株式会社ダイヤモンドファンタジーのもくもく会](https://diamond-f.connpass.com/)は、以下の通り。

- 技術に関することなら、テーマは自由💻✨
- 電源あります🔌✨
- 書籍での学習もOK📚✨
- 軽食あります！🥐☕✨

**これまでの学習テーマ：**
Webサービス、スマホアプリ、インフラ、IoT、AI、機械学習、web3、資格の学習
TypeScript, Rust, Java, Python, PHP, javascript
React, Spring, Django, Laravel
ビジネス本の読書

など、みなさん様々なテーマで学習してらっしゃいます。

一緒にもくもく＆雑談しながら、スキルアップしましょう💪！！
AivenのAWS向けセルフサービスBYOC（Bring Your Own Cloud）自動化により、Time-to-Valueを加速します。

<font color="Grey">*[Accelerate time-to-value with Aiven’s self-service Bring Your Own Cloud (BYOC)[ automation for AWS](https://aiven.io/blog/accelerate-time-to-value-with-byoc)の翻訳です。*</font>

2023年11月27日

#AivenのAWS向けセルフサービスBYOC（Bring Your Own Cloud）自動化で価値実現までの時間を短縮

複雑で長いインフラ設定プロセスは、もはやアプリケーション開発者の障害ではありません。

Aivenのお客様の多くは、世界中のAWSリージョンでAivenのサービスを展開しています。これらのお客様の開発者から、AWS上でエンタープライズ・アプリケーションを構築するのは時間がかかり複雑であること、また、イノベーションに集中するために労力を割き、インフラの設定、デプロイ、管理にはあまり労力を割きたくないという声を聞いています。


これらの開発者の多くは、アプリケーションのデータレイヤーを構築するためにオープンソースのデータインフラ技術を利用することを選択した。Aiven Platformが提供するようなマネージド・オープンソース・サービスは、展開の柔軟性を提供し、単一のベンダーへの依存を最小限に抑え、多くのプロプライエタリ・ソフトウェア・テクノロジーに関連するソフトウェアの取得とメンテナンスのコストを排除し、全体的なコストの削減につながるため、人気の高い選択肢となっています。


[BYOC](https://aiven.io/blog/optimize-your-cloud-data-infrastructure-spend-with-byoc)は、マネージド・オープンソース・サービスを検討している多くの顧客にとって、ますます人気の高い選択肢となっている。この背景には、AWS のようなクラウド・プロバイダーと提携する際に確立したインフラ・ガバナンスとデータ主権戦略を維持し、コスト管理のために締結した複数年の購入コミットメントを消費したいという顧客のニーズがあります。顧客にとっては柔軟性がすべてだが、BYOCオプションの中には、開発者がデータ・サービスを管理するためのカスタム環境の構成、デプロイ、管理の計画に最大4週間を費やす必要があるものもあり、その柔軟性にはこれまでコストがかかっていた。


Aivenの新しいAWS向けセルフサービスBYOC自動化により、企業の開発者はセルフサービス技術を使用して、Aivenのマネージド・データ・サービスをAWS環境で実行するために必要なカスタム・クラウド・インフラストラクチャ・フレームワークを確立することができます。自動化された設定とデプロイプロセスは、通常1時間未満で完了し、カスタムクラウドインフラストラクチャフレームワークを構築する従来の方法よりも99%高速であるため、サイクルタイムを短縮し、開発者の時間をイノベーションに集中させることができます。


## データのためのカスタム・クラウド


お客様は[Aiven管理コンソール](https://console.aiven.io)からセルフサービスBYOCワークフローにアクセスします。Aivenサービスを実行したいAWSリージョン、希望するネットワーク範囲、Aivenが提供するTerraformスクリプトを使用して作成したAWS Role ARNなど、いくつかの設定変数を提供すると、BYOCオートメーションはAivenサービスを実行するためのカスタムクラウド環境をお客様のAWSアカウント内に構築し、デプロイします。完了すると、お客様はAivenマネージド・データ・サービスをカスタム・クラウド環境に展開する準備が整います。


もちろん、BYOCモデルで運用するAivenのお客様は、24時間365日の監視とアラート、プロアクティブなメンテナンスとアップグレード、99.99%の可用性SLAなど、Aivenの開発者向けツールのメリットを享受できます。


## 最大35%のコスト削減


AivenのBYOCモデルは、AWSのようなクラウドプロバイダーと大量購入のコミットメントを結んでいるお客様が、Aivenのサービスで必要なインフラストラクチャーのコストを、交渉による割引を利用して加速度的に購入コミットメントを相殺、または消費することを可能にします。現在、BYOCモデルで稼働しているAivenのお客様は、Aivenの標準モデルと比較して平均35%のコスト削減を報告しています。お客様のコスト削減額は、クラウド・プロバイダーとの交渉による割引額によって異なる場合があります。


## 価格と可用性


AivenのAWS自動化のためのセルフサービスBYOCは、AivenがサポートするすべてのAWSリージョンの資格のあるお客様を対象としたアーリーアベイラビリティを開始しました。Aivenのアカウントマネージャーは、BYOCがお客様の組織に適しているかどうかを判断するお手伝いをいたします。


BYOCモデルでは、Aivenのサービス価格にはインフラストラクチャとマネージドサービスの2つのコンポーネントがあります。お客様は、Aiven for Apache Kafka®やAiven for PostgreSQL®のようなカスタム・クラウドやAivenデータ・サービスを実行するために使用するインフラ・サービスに対してAWSに直接支払います。お客様は、購入しアクティブに消費された各データサービスの月額マネージドサービス料金をAivenに直接支払います。各Aivenマネージド・データ・サービスは1時間あたりの価格です。


## 開始方法


AWS向けセルフサービスBYOCオートメーションへのアクセス、またはAivenサービスの詳細については、アカウントマネージャーを通じてAivenにお問い合わせいただくか、Aivenコンソールの[Bring Your Own Cloudページ](https://docs.aiven.io/docs/platform/concepts/byoc)からお問い合わせください。
軽深演習 #3 世田谷一家殺害事件

### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 3日目の記事です。
演習形式をとっているので、ぜひ　回答を試みてください。

### 前提知識　対象や射は何でもいい　[グロタンディーク](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AC%E3%82%AF%E3%82%B5%E3%83%B3%E3%83%89%E3%83%AB%E3%83%BB%E3%82%B0%E3%83%AD%E3%82%BF%E3%83%B3%E3%83%87%E3%82%A3%E3%83%BC%E3%82%AF)

圏論を理解するためには、前提知識が全くないというわけにはいきません。それで今まで、ボンカレーの言葉、圏論の定義覚えて貰いました。今度はグロタンディークの言葉です。軽深（かるしん　なんちゃって圏論）なので、この言葉をかなり曲解します。**何でもいい** に一人歩きしてもらいます。[軽深演習 #2](https://qiita.com/zanjibar/items/7af89a25f48a292ca240)で圏の定義を紹介しました。その定義に、対象と射がありますが、グロタンディークが言うように、何でもいいのです。前提条件はありません。私たちが何か考える場合、ほとんどの場合、前提条件があります。前提条件があることは実際上、課題を解決する場合に無いと困りますが、一旦、前提条件を取り払ったほうがいい場合も多いです。圏論は、極めて抽象的ですが、**何でもいい**として前提条件を疑ってみる能力を養ってくれます。

### 演習　世田谷一家殺人事件の公開手配に使える技術には、指紋以外にどんなものがありますか？

世田谷一家殺人事件の犯人を捕まえたいと私は思っています。想像上の犯人像を作って手配をしていますが、証拠として。指紋が得られているのですから、指紋情報の公開による手配をしてもいいのではないでしょうか？　指紋照合のソフトウェアは、オープンソースがいくらでもあるでしょう。その指紋データ形式に沿った情報を公開すれば、証拠写真による公開手配なみの効力がある気がします。使える証拠なら**何でもいい**と考えてみましょう。指紋以外にどんなものがありますか？
AWS CDKでLambda Function URLsを試したい

# 概要
- AWS CDKでAPI Gateway + Lambdaの構成を作ったことは何度かあったのですが、Lambda Function URLsを試したことがなかったのでやってみました。
- 前提条件
    - CDK v2
    - Node.js v18.18.2
    - TypeScript v5.3.2

# Lambda Function URLs(Lambda 関数 URL)とは
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-urls.html

Lambdaをhttpsから実行するには、API Gateway + Lambdaの構成にしてエンドポイントを作成することがよくありますが、Function URLsではLambdaがエンドポイントを作成してくれます。

### API GatewayとLambda Function URLsの違い
簡単にいうと、API Gatewayの方が複雑な設定ができます。
API Gatewayでできることとして例えば、、
- httpsだけでなくwebsocketをサポートしている
- カスタムドメインが設定可能
- API Keyで認証できる

単純にLambdaをhttpsから実行したいだけであれば、Lambda Function URLsの方が簡単に設定することができます。

また、API Gatewayの最大のタイムアウト時間は29秒ですが、Lambda Function URLsの場合はタイムアウトはなく、Lambda関数のタイムアウト（最大15分）という制限になるので、Lambda関数の実行時間が長くてAPI Gatewayでタイムアウトしてしまうような処理はLambda Function URLsを使うと良いかもしれません。

# やってみる

まずは[公式のドキュメント](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-typescript.html)の通りに`cdk init`します。

```shell
mkdir test-project
cd test-project
cdk init app --language typescript
```

`cdk init`できたので、リソースの定義をしていきます。

```typescript
import * as cdk from "aws-cdk-lib";
import {
  Function,
  Runtime,
  Code,
  FunctionUrlAuthType,
} from "aws-cdk-lib/aws-lambda";
import { Construct } from "constructs";

export class TestProjectStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Function
    const fn = new Function(this, "MyFunction", {
      runtime: Runtime.NODEJS_18_X,
      handler: "index.handler",
      code: Code.fromAsset("./src"),
    });

    // Function URL
    const fnUrl = fn.addFunctionUrl({
      authType: FunctionUrlAuthType.NONE,
    });
  }
}

```

`addFunctionUrl()`でFunction URLsを設定します。
`authType`はデフォルトでは`AWS_IAM`なので、今回は`NONE`にします。


関数の中身も書きます。適当に`Hello world`を返すだけの関数にします。
```typescript
export const handler = async () => {
  return "Hello World";
};
```

これでFunction URLsが作成され、`Hello world`が返ってきました。やったね🥺

ちなみに、`authorization`というヘッダやクエリパラメータはをつけたらこのように取得できます。

```typescript
  // headers受け取り
  const header1 = event.headers.header1;
  const header2 = event.headers.header2;
  // クエリパラメータ受け取り
  const param1 = event.queryStringParameters.param1;
  const param2 = event.queryStringParameters.param2;
```

# 参考

https://www.serverlessguru.com/blog/aws-lambda-function-urls-vs-amazon-api-gateway
Power Automate から Logic Apps を発火させよう

好きな技術、好きなアプリ、好きな言語はありますか。Power Automate はとても有名だと思います。単体でアドベントカレンダーが成立するほどに…

https://qiita.com/advent-calendar/2023/powerautomate

コミュニティも多数存在するほどに…

https://qiita.com/MiyakeMito/items/d98a9a63d73754bc38c6

## PowerAutomate と Logic Apps 何が違うの？

そんな Power Automate にそっと添えられている存在があります。Logic Apps です。去年書いた記事です。

https://qiita.com/e99h2121/items/a69e40d016f5df01b061#azure-logic-apps-%E3%81%A8-power-automate

おさらい:

> Power Automate も Azure Logic Apps も、「ワークフロー」を開発できるツールであるところは共通です。いずれでも SaaS アプリケーションやエンタープライズ アプリケーション を利用する際にGUI ベースで容易に構築することが可能です。

> しかし大きな違いは想定ユーザー。Power Automate は会社内の一般従業員、Logic Apps は開発者を主に想定しているとのこと。Logic Apps ではワークフローを GUI 以外にもコード（JSON 形式）で作り込みでき、Visual Studio Code のような統合開発ツールからデプロイすることが可能です。

> B2B シナリオの利用シーンにも対応したワークフロー を作成することができ、Power Automate よりも複雑な構成を作り込むことが可能です。


## Power Automate から Logic Apps を呼び出す


光と陰な両者、というかフロントとバック、これ、Power Automate から Logic Apps を呼び出すこともできるのです。

https://learn.microsoft.com/ja-jp/azure/logic-apps/call-from-power-automate-power-apps


下ごしらえ。my-Playground-temp という名でエクスポートしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/4b41dae2-5e58-02a2-aa3f-12ecfee97bda.png)

と Power Automate 側から my-Playground-temp が発見できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/3386d0a8-374f-2bc5-0496-fadc189631fe.png)

発火させるで～。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/8e23dc24-233c-aa4b-9f4b-4d8f84be9ff5.png)

成功しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/2af9f123-368a-23be-5177-5d325caf4fc2.png)

以下、Logic Apps が Running していることがご覧いただけます。これ [人事システム「COMPANY」のバッチ処理の裏(側) の話 #トラブルシューティング - Qiita](https://qiita.com/e99h2121/items/d9a83a6e47a53dcfbfbd) を思い起こすとバッチ処理を超簡単にぽちっとできるとおもうよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/5dc52814-fb04-2ff7-8f2b-89cc3ea81fe4.png)

## つづく

好きな技術、好きなアプリ、好きな言語はありますか。仕事で好きな技術に携われるって幸せですね。推し活がてらアドベントカレンダー Logic Apps にまつわる話のこの 3 日目、Power Automate の日陰の存在のように見えて実は功労者たる Logic Apps の小話でした。つづく。
Stable Diffusionでポケモン風キャラを作ってみた

## はじめに
今回、ポケモン風キャラ特化のStable Diffusionがあると聞いて試してみました！
想像より簡単なコードなので、精度はどうなるのか気になるところです！

<br>

## 使用モデル、環境
今回使うモデルは、Hugging Faceにあった[こちら](https://huggingface.co/lambdalabs/sd-pokemon-diffusers)のモデルを使うことにします！
実行環境は、**Google Colab**になります！

<br>

## ライブラリのインストール
Google Colabを開いたら、まずはじめに使用するライブラリのインストールをしていきます！

```python:colab
!pip install diffusers==0.12.1  #バージョンが古いとエラー吐きます
!pip install transformers scipy ftfy
```
コラボでの実行なので、pipの前に`!`をつけ忘れないようにしましょう！！

<br>

## いよいよ実行...!?
では、ライブラリのインストールもできたのでいよいよ実行していこうと思います！
まずは以下のコードを記入してください！

```python:colab
import torch
from diffusers import StableDiffusionPipeline
from torch import autocast

pipe = StableDiffusionPipeline.from_pretrained("lambdalabs/sd-pokemon-diffusers", torch_dtype=torch.float16)  
pipe = pipe.to("cuda")

prompt = "soothing cat" #ここにプロンプトを入力してください！
scale = 10
n_samples = 1 #ここの数字を変えることで、出力枚数が変わります！


# Sometimes the nsfw checker is confused by the Pokémon images, you can disable
# it at your own risk here
disable_safety = False

if disable_safety:
  def null_safety(images, **kwargs):
      return images, False
  pipe.safety_checker = null_safety

with autocast("cuda"):
  images = pipe(n_samples*[prompt], guidance_scale=scale).images

for idx, im in enumerate(images):
  im.save(f"{idx:06}.png")
```

promptでお題を書くことによって、出力される絵が変わる仕組みとなっています！
ちなみに、prompt部分を訳すと、”癒し系猫”🐈
主が猫大好きなので作ってみてもらうことにしました（笑）

<br>

ってことでとりあえず実行...!

<br>

![スクリーンショット 2023-12-03 4.22.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529811/b948db9f-5f99-4723-28dd-70012448e17e.png)

<br>
あれ、？どうやらエラーが出たようですね。
エラー文を読んでみると、どうやらこのコードはGPU環境で実行する必要があるとのこと。

<br>
<br>

そこで、Colabの実行環境をGPUに変更することに！!


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529811/8681ea52-8fa8-cdcb-9aa8-6ffc217bd78a.png" width= "400px" >

<br>

ランタイムを再起動し全てのセルを再実行すると、、、

<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529811/53b2302e-9cf2-e21a-7a86-e330ba0395a9.png" width= "350px" >

<br>
<br>

フォルダにこのような画像が出力されました！！🎉
なんかニャースとペルシアンを足して２で割ったような感じで癒し系かはわからないですが、ポケモンらしさは再現できてるのではないでしょうか...？
<br>


## 生成形AIにGPUが必要とされる理由
ここで、なぜ先ほどCPU環境で実行した際にエラーが出たのでしょうか？
実は、ディープラーニングにおいて基本的には中間層の数が多くなるほど複雑な判断ができるようになります。そのためには大規模な計算が必要となりますが、GPUは並列処理を得意としており、同じような計算を高速で繰り返すことができます。こうした処理性能が、高速な並列処理を求められるディープラーニングに向いているのです。


<br>

## 終わりに
今回は実際にポケモンのようなキャラ作りができるStable Diffusionを試してみました！
Hugging Faceなどを見ると面白くて簡単なモデルがたくさん転がっているので、興味のある人はぜひ触ってみてください☺️
実際に使った「ライブ配信サイトでも作ってみない？」1日目

# めっちゃ簡単にライブ配信サイトを作ってみよう
今回のライブ配信は「1対多」を想定しています。
あといわゆる配信プラットフォームというよりは、ある特定のプロモーションに対しての配信...つまりは文化祭のライブ配信とかに向いてるような物を想定しています。

というのも、これは実際に文化祭の為に開発を行い使用した物だからです。

# WebRTC...？
ライブ配信システムについては色々な方法があります。
よく使われるのはHLSストリームとかでしょうか。しかし、これを自前で実装（NginxやApacheは使う予定がなかった）するやり方はちょっとめんどくさそうでした。そこで、WebRTCという技術が登場します。

WebRTCというのは、ブラウザやモバイルアプリからリアルタイムで通信することを目的としたものです。

...と、言葉で説明するのはとても簡単ですが、実際にそれを実装するのはまたまた大変です。

## P2PとSFU
WebRTCにはP2PとSFUの2種類の通信方法があります。
P2Pは聞いたことがある人も多いかもしれませんが、Peer to Peerの略で、簡単なシグナリングサーバーを用意すれば、あとは動画配信をするユーザーと配信を見るユーザーが通信を始めるみたいな感じのやつです。
P2Pはそれぞれのユーザーが直接通信をするため、サーバーに負荷がかかりません。
しかし、P2Pで1対多の通信をしようとすると、配信するユーザーに対していくつものコネクションが張られるため、配信するユーザーのパソコンやネット回線に負荷がかかってしまいます。

配信パソコンの負荷は何とかなると思いましたが、今回のネットワーク回線はなんとセルラー通信を予定しており（というよりはWi-Fiが届かない場所での配信だった為）、P2Pでの配信は諦めました。

そしてもうひとつのSFUというのは、SFUサーバーというものが各ユーザーの通信をまとめて処理する為、多くの人が配信を見にきても負荷がかかるのはSFUサーバーということになる...みたいなものです。

https://sora.shiguredo.jp/knowledge

（わぁ、こんなところにわかりやすい記事が）

ということで、今回の配信サービスはWebRTC SFUを使用したライブ配信と決まりました。

# じゃあWebRTCを実装してみろよ
と...WebRTCの実装方法について調べてみました。
さっぱりでした。

というわけで無念ですがここで終わらせていただきます。

# `つながるをもっと簡単に。`

https://skyway.ntt.com/ja/

困っていた私に、NTTが一筋の光を見せてくれました。
それが、SkyWayです。

```
SkyWayは、ビデオ・音声・データ通信機能をアプリケーションに簡単に実装できる
SDK&APIです。ビデオ会議や、オンライン診療、遠隔ロボットなど、リアルタイムな
コミュニケーションを実現します。
```
(引用: SkyWay公式ページ)

というわけで、SkyWayを使えばもしかしたら配信サービスが作れるかもしれない！となりました。

# Welcome to SkyWay
今日はSkyWayのアカウントを作って、プロジェクトの準備をしてみましょう。

https://console.skyway.ntt.com/signup/

こちらからSkyWayアカウントを作成することができます。
まずは作りましょう。
次に「プロジェクト」という物を作ります。
プロジェクトの名前はなんでもいいと思います。今回は「QiitaAdvent23」とかにでもしておきました。
（ここら辺はうろ覚えなので画面の指示に従ってください。）

![IMG_6452.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/1855e721-e885-5da6-3dee-e5602a7a3537.jpeg)

こんな画面になったかなと思います。
そしたら右上より「アプリケーションを作成」を押してアプリケーションを作成しましょう。
機密情報があるのでシークレットキーとかはちゃんと隠しておきましょう。

ここまでできたらあとはコーディングするだけです。
とりあえず今回はSkyWayとかの概要だけ紹介して終わりにします。

# Next...
というわけでNTTにヘコヘコしながらSkyWayを使った旅が始まります。
もちろんSoftBankやKDDIのことも忘れてません。このシリーズの最後の方でなんと主要3キャリアがみんな出てきます。胸熱展開！

次回は早速コーディングからです。では〜

（ちなみに、基本的にサンプルプロジェクトに準拠していきます。）
息抜きしたいし「ノベルゲームでも作ってみない？」n日目


Q. なにこれ
A. これは体調不良のツケがまわった息抜きの記事です。

# 息抜きにノベルゲームでも作ってみない？
ノベルゲームっていいですよね。
というわけで作っていきましょう。（？）

この記事ではノベルゲームの作成の流れを雑に紹介していますが、それ以外のゲームだったりの開発の手順にも近かったりします。

# ノベルゲームに必要なもの
- ストーリー
- 画像
- 音楽
- プログラミング

## ストーリーの作り方
まずはどんなストーリーかを大雑把に考えましょう。
そうですね...学園ラブコメ的なものにしましょう。

ちなみにここでの根底がちゃんとできないと後で後悔します。

## 画像の作り方/集め方

まずはフリー素材と呼ばれるモノを集めましょう。
もし足りなければ自分で書きましょう。

## 音楽の作り方/集め方

これまたフリー素材と呼ばれるものを集めていきましょう。
もしなければ作曲も厭わないようにしてください。
ただし、作曲は時間がかかります。し、センスも問われます。頑張りましょう。

## プログラミングとは？
ゲームを作るには「ゲームエンジン」というものを主に用いられます。
例に挙げられるのはUnityとかUnreal Engine、Godotとかですね。

今回はノベルゲームを作るので、ノベルゲーム特化なエンジンがいいですよね。

### ノベルゲーム特化なゲームエンジン
ノベルゲーム特化でも、様々なゲームエンジンがあります。
ティラノビルダーやLight.VN、吉里吉里やRen'PyやSuika2...

一部のエンジンでは、容易にスマホ版開発ができたり、スポンサーさんと協力することでコンシューマー機にも移植できたり...

私のおすすめはRen'Pyです。

Ren'PyはPythonの知識があれば、ある程度は余裕で書き始められます。

ただまぁどのエンジンを使うのかは、好みの問題なので、自分で調べてみてください。

# では実際に作っていきましょう。
まずは共同開発者を2〜3人ほど集めましょう。
1人で全て作ってもいいのですが、自分が作ったものは綺麗に見えてしまうので、他人の目を借りることでより良いものができると思います。

## まずはストーリーを作りましょう。
まずは主軸を決めます。
学園ラブコメであれば、彼女がいない主人公が、ある日突然女の子に告白されて、その女の子と付き合うことになるとかですかね。これが主軸となります。
そしてさらにその主軸に沿ったカレンダーでも作りましょう。
何日目にどんなイベントが起こるか...何日目でどんな選択肢が出てくるか...などなどです。
これを書き出しておくだけで、残りのゲーム制作進捗度が目に見えやすく、開発も進みやすくなるでしょう。

次に、そのストーリーに沿ったキャラクターを作りましょう。
キャラクターには名前や性格、ちょっとした過去のストーリーでもつけておきましょう。
ここら辺のキャラクターの詳細はストーリーを描きながら追って追加したりしても全然いいと思います。
むしろ、ストーリーを書きながらキャラクターを作っていく方が、キャラクターの性格がストーリーに沿っていているかを確認しやすいです。

では、ストーリーを書いていきましょう。

...

あれ、ストーリーは？

あ、ないらしいです。

## 画像を集めましょう。

「画像」と呼ばれるものには、大体の場合でBG画像とキャラクター画像の2種類があります。
BG画像は背景画像のことで、キャラクター画像はキャラクターの立ち絵のことです。

### BG画像
ストーリーを考えている中で「こんな場所でこんなことが起こる」というのを考えていると、自然と「こんな場所の画像が欲しいな」と思うことがあると思います。
そういう時は、その場所の画像を探してみましょう。
色々なフリー素材サイトもありますし、もしよければ自分で写真を撮ってもいいですね。
絵に自信があるなら自分で描いてもいいかもしれません。

### キャラクター画像
実はこれはかなり大変です。
というのも、キャラクターのフリー素材はもちろんあるにはあるのですが、自分の想像しているキャラクターとは違う場合が多いからです。
「じゃあ自分で描けよ」という話なのですが、これがまた絵心がない人間にはきついんですよね。（涙目）

![無題69_20231202174024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/62a3f6d6-287c-391a-08fe-682fe0af05b5.png)

> ...（・ω・）

自分で描けるならそれに越したことはありません。もしダメなら友人や絵師さんに依頼でもしてみてください。

## 音楽を集めましょう。
音楽はフリー素材が多いです。
どんどん探してみてください。

## プログラミングをしましょう。
ノベルゲームにおけるプログラミングは「選択肢の表示」と「画像の表示」と「音楽の再生」とかですかね。
ノベルゲーム用のエンジンを用いて作成されたプロジェクトであれば基本的にプログラムを多く書く必要はありません。
また、それらはGUIベースでのプログラミングだったり、そのエンジン専用の言語で書くことが多く、簡単に書くことができます。

じゃあなんでQiitaに書いてるんだろうな。

## テストプレイをしましょう。
これは絶対です。

で、ノベルゲームならやって欲しいんですけど、「テキストを口に出しながら」テストプレイをしてみて欲しいです。
これは、テキストを口に出すことで、そのテキストが自然に聞こえるかどうかを確認するためです。
あとは誤字脱字などに気が付きやすくなります。

## 配信してみましょう。
テストプレイなどをして問題がなければ配信してみましょう。

無料ゲームであれば自身のホームページや`itch.io`、`ふりーむ！`などで配信することをおすすめします。
ここら辺は配信料が無料だったり、無料ゲームの配信が多いので、無料ゲームを配信するのには向いています。
ただ、自身のホームページで配信するときは、そのホームページに対してPVを集める必要があります。

有料ゲームであれば`Steam`や`EpicGamesStore`などで配信するのもいいでしょう。
ただ、これらの配信ストアは1ゲームあたり$100の配信料がかかり、もし売れなければその配信料は返金されません。
ちゃんと売れるかどうかを見極めてから配信することをおすすめします。

## まとめ

もしこれからあなたがゲームを作ろうとしているのなら「桜井政博のゲーム作るには」をみることをお勧めします。
桜井さんはみなさんご存知のスマブラを開発されていた方で、その方がYouTubeでゲーム作りなどにおけるノウハウ的なものを公開しています。
普通に無料で見れるのすごいぐらいなんでみてみてください。

それでは。

...

ほんとになんでこの記事を書いたんだ...？

と、というわけで...「ノベルゲームでも作ってみない？」

...いやあんまお勧めしないわやっぱ。ゲームは遊んでこそなんぼよ。
去年もやったけど「DiscordBOTでも作ってみない？」3日目

# そういえばビルドビルド言ってるけど何のビルド？
そうでしたねぇ...ちゃんと説明してませんでした...
今回は「Gitで管理されているArduinoプロジェクト」の管理としましょう。

## Git？
流石に説明不要だと思いますが、プログラムとかのプロジェクトを管理するためのもので、変更履歴が全て保存され、バージョン管理が容易にできる物です。
また、コマンドひとつでソースコードを自分のパソコンにダウンロードしてくれる(Clone)ので、複数デバイス・複数人での開発でも重宝されるサービスとなっております。
よくGitとGitHubがごっちゃになっちゃいますが、Gitはバージョン管理ソフト、GitHubはGitのレポジトリを保存できるサーバーを提供しているものって感じです。

...なんか説明が適当になっちゃった気がするので気になる人はGitで調べて見てください。

## Arduino？
マイコンです。
なんと、このアドベントカレンダーでも記事を書いているのでぜひご確認ください。

# コマンドを実行するコマンドを作ろう（？）

Q. この男...何を言っているのかわからない...
A. そうだな...でも、そういうことなんだよ...

なお、ここからの記事ではGitの最低限の知識があり、すでにレポジトリが作成されていることを前提としています。

（シェル）コマンドを実行する（スラッシュ）コマンドを作っていこうというわけです。

## どうやってPython上からシェルコマンドを実行するの？

様々な方法がありますが、今回は`subprocess`を使用します。

```py
>>> import subprocess
>>> subprocess.run(["uname"])
Linux
CompletedProcess(args=['uname'], returncode=0)
```

subprocessではこんな風にシェルコマンドを実行することができます。
結構簡単ですね。

## じゃあ、これをスラッシュコマンドに組み込んでみよう

```py:main.py
import subprocess
from subprocess import PIPE

...

@bot.slash_command()
async def git(interaction: nextcord.Interaction):
    pass

@git.subcommand()
async def status(interaction: nextcord.Interaction):
    process = subprocess.run(["git", "status"], stdout=PIPE)
    await interaction.response.send_message(embed=nextcord.Embed(
        title="Git Status Result",
        description=f"```sh\n{process.stdout.decode('utf-8')}```"
    ))

...
```

**あーー！！！ちょっとまって！！！**

私の前回のアドベンドカレンダーを見た人はもうわかりますよね？

https://qiita.com/nattyan_tv/items/d0d8e7258c3b150fb08a

そうです、`subprocess.run`は同期処理です。
なので、やっぱりここは非同期処理にしないといけません。

なので早速ですが`subprocess`を捨てて`asyncio.create_subprocess_shell`を使ってみましょう。

```py:main.py
### これらは削除かコメントアウト ###
# import subprocess
# from subprocess import PIPE

import asyncio
...

@git.subcommand()
async def status(interaction: nextcord.Interaction):
    process = await asyncio.create_subprocess_shell("git status", stdout=asyncio.subprocess.PIPE)
    stdout, stderr = await process.communicate()
    await interaction.response.send_message(embed=nextcord.Embed(
        title="Git Status Result",
        description=f"```sh\n{stdout.decode('utf-8')}```"
    ))

...
```

結構変わってきましたね。
まず、`subprocess.run`が`asyncio.create_subprocess_shell`になりました。
それによって、渡すコマンドがリストから文字列になりました。
そして、`stdout`が`asyncio.subprocess.PIPE`になりました。
そして、`process.stdout.decode('utf-8')`が`stdout.decode('utf-8')`になりました。

これで、非同期処理に対応したコマンドができました。

![スクリーンショット 2023-12-02 231521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/7acd98cd-ff46-d418-1d21-b7aaa8f47ea4.png)
実際に実行するとこのようになります。

# もうすぐだね...！

あとは簡単ですね、コマンドの中身を入れ替えるだけです。
...じゃあそのコマンドってどんな感じなんでしょうか。

と言うわけで次回から割り込み企画「何でもかんでもコンソールでやってみない？」を始めます。

コンソールで実行できればこんなふうな外部からの操作ができたりうんぬんかんぬん...

# あとがき
まだ書き途中だったのに公開されちまった...ミスだぜ！
去年もやったけど「DiscordBOTでも作ってみない？」2日目

# もうちょっとBOTらしくしよう

前回記事の状態では、空のBOTが出来ただけでした。

```py:main.py
...

bot = commands.Bot()

@bot.slash_command()
async def greet(interaction: nextcord.Interaction):
    await interaction.response.send_message('はーいこんにちは。')

if __name__ == '__main__':
    ...
```

このようにすることでとりあえずBOTにスラッシュコマンドを作ることができます。

これで一回起動させてみましょう。

![スクリーンショット 2023-12-02 223728.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/7f508206-85d2-df6a-3126-4f0331ea97e3.png)

このようなスラッシュコマンドが作れます。

で、今の状況だとBOTが正常に起動してるのかどうかがちょっとわかりにくいですよね。
そこで、BOTが起動したら起動メッセージを表示するようにしましょう。

これには[イベントハンドラ](https://qiita.com/nattyan_tv/items/70b49ad785fcca39df54)を使用します。

```py:main.py
...

bot = commands.Bot()

@bot.slash_command()
async def greet(interaction: nextcord.Interaction):
    await interaction.response.send_message('はーいこんにちは。')

@bot.event
async def on_ready():
    print('起動しました。')

if __name__ == '__main__':
    ...
```

これで起動時に`起動しました。`と表示されるようになりました。

# テキストで返さないでほしいな...

BOTだけが送れるEmbedというものがあります。
なんかBOTを使ってるとよく見るやつですね。

基本的にBOTはテキストを返すよりEmbedを返した方が見栄えもいいし、使いやすいです。


```py:main.py
...

@bot.slash_command()
async def greet(interaction: nextcord.Interaction):
    await interaction.response.send_message(embed=nextcord.Embed(
        title="Greet Result",
        description="Hello, world!"
    ))

...
```

さっきの「はーいこんにちは。」ってのを少し改造してみました。

![スクリーンショット 2023-12-02 224651.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/54ba3d25-7682-104b-0336-89f7ddc799e6.png)

お、これでよりBOTらしくなってきた。

# サブコマンドを作ってみよう

さっきのコマンドは`/greet`というコマンドでしたが、これを`/greet hello`とか`/greet bye`とかにしたいですよね。ね？

このように、コマンドの後ろにさらにコマンドをつけていったものをサブコマンドと言って、上記の例のように、何かのコマンドの後ろにさらにコマンドをつけていくことで、より細かいコマンドを作ることができます。

では、実際にサブコマンドを作ってみましょう。

```py:main.py
...

@bot.slash_command()
async def greet(interaction: nextcord.Interaction):
    pass

@greet.subcommand()
async def hello(interaction: nextcord.Interaction):
    await interaction.response.send_message(embed=nextcord.Embed(
        title="Greet Hello Result",
        description="Hello!"
    ))

@greet.subcommand()
async def bye(interaction: nextcord.Interaction):
    await interaction.response.send_message(embed=nextcord.Embed(
        title="Greet Bye Result",
        description="Bye!"
    ))

...
```

![スクリーンショット 2023-12-02 225223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/5704622c-2d46-3752-077b-6fcb00ee4f6d.png)

というわけで、基礎はこれでOKですね？

もしわからないことがあったら、[公式ドキュメント](https://docs.nextcord.dev/en/latest/)とか[私のアドベンドカレンダー](https://qiita.com/advent-calendar/2022/nattyantv)を見てみてください。
これをみておけばDiscordのBOTはある程度作れるようになると思います。

# じゃあ、次は中身だね！

というわけで、次回は実際にBOTの中身を作っていきます。
去年もやったけど「DiscordBOTでも作ってみない？」1日目


Q. なにこれ
A. 去年のまとめ。

# 去年もやったけどDiscordBOTでも作ってみない？

というわけで全てを略すなら去年のアドベントカレンダーを見てみてください。

https://qiita.com/advent-calendar/2022/nattyantv

# Discordとは？
簡単に言えばグループ型SNSです。まぁこれも去年言いましたね〜！

# そもそもこういうBOTにおける役割とは？
DiscordやSlack、TeamsにおけるBOTというのは主に「色々なユーザーの作業効率化や娯楽」または「特定のユーザーに向けた機能の提供」かなと思っています。

前者であれば、「Discordにこんな機能欲しいよね〜」みたいなものを実現していったりする感じのもので、多くのBOTはこちら側に属すと思います。

後者であれば、ビルドをDiscordからコマンドひとつで行えるようにしたり、毎回開発者に聞いて手動で答えていた今日のNightly BuildのURLなどを教えてくれるようにしたり。主にPublicではなくPrivate的に使われるのはこちらですね。

今回作成していくのは後者の方で、開発チーム内で利用できる便利なBOTみたいな感じです。

# じゃあ何を作るか？
先ほどもちらっと説明させていただきましたが、今回は開発チーム内で利用する便利BOTを作っていきます。
具体的な実装機能としては「コマンドひとつでビルドを行う」「最新のビルドリソースのダウンロード」「サーバーの起動」などとなります。
というかこれの開発結果がまるまる私の研究に使われていくのでちゃんとやります（？）

# まずは開発環境のセットアップ！

## 前提

全部書くとこれまた長くなってしまうのでSDGsします。

https://qiita.com/nattyan_tv/items/2f5bc9d3b65d9bfcd066

と

https://qiita.com/nattyan_tv/items/e39cd136d4dbc70a8964

からDiscordのBOTのトークンの取得まで行ってきてください。

トークンは`.env`というファイルに下記のように書いておいてください。

```env:.env
BOT_TOKEN=BOTのトークン
```

## 材料

Python3.10 (3.8以上)

pip install nextcord python-dotenv

```py:main.py
import os

import nextcord
from dotenv import load_dotenv
from nextcord.ext import commands

load_dotenv()

bot = commands.Bot()

if __name__ == "__main__":
    token = os.getenv("BOT_TOKEN")
    if token is None:
        print("TOKENが設定されていません。")
    else:
        bot.run(token)
```

## レッツ起動！

`python main.py`で試しに起動してみましょう。

Discordを開いてみて、BOTのアカウントがオンラインになっていれば、トークンなどの設定は正常にできています。

# これでBlank Botはできました。

次回はまずBOTらしくするところから始めましょう。
マイコン使って「IoT機器でも作ってみない？」3日目

# 今度こそスマホからLEDを光らせてみよう！

前回はESP32上でWebサーバーを建てて、スマホからアクセスできるようにしました。
今回はそのWebサーバーにアクセスして、LEDを光らせてみましょう。

# 動作原理

```cpp
void httpHandleRoot() {
  server.send(200, "text/html", "<h1>ESP32 Web Server</h1><div>" + (String)(millis() / 1000) + " seconds elapsed since ESP32 was started.</div>");
}
```

こちらについて覚えてますか？

これは、`/`というパスにアクセスされた際に実行される関数です。

そう、関数なんです。

ということは...？
ここにLEDを光らせる処理を入れれば...？

# LEDを光らせる

```diff_cpp:main.ino
  #include <WiFi.h>
  #include <WebServer.h>

+ #define LED_PIN 23

  WebServer server(80);

  const char* ssid = "SSID";
  const char* password = "PASSWORD";

  void setup() {
+   // Pin Initialize
+   pinMode(LED_PIN, OUTPUT);

   ...

    // WebServer Initalize
    server.on("/", httpHandleRoot);
+   server.on("/led_on", httpHandleLedOn);
+   server.on("/led_off", httpHandleLedOff);
    server.onNotFound(httpHandleNotFound);
    server.begin();
    Serial.println("HTTP server started");
  }

  ...

  void httpHandleRoot() {
-   server.send(200, "text/html", "<h1>ESP32 Web Server</h1><div>" + (String)(millis() / 1000) + " seconds elapsed since ESP32 was started.</div>");
+   server.send(200, "text/html", "<button onclick=\"location.replace('/led_on')\">ON</button><br><button onclick=\"location.replace('/led_off')\">OFF</button>");
  }

+ void httpHandleLedOn() {
+   digitalWrite(LED_PIN, HIGH);
+   server.send(200, "text/html", "LED ON<br><a href='/'>BACK</a>");
+ }
+
+ void httpHandleLedOff() {
+   digitalWrite(LED_PIN, LOW);
+   server.send(200, "text/html", "LED OFF<br><a href='/'>BACK</a>");
+ }

  void httpHandleNotFound() {
    server.send(404, "text/html", "<h1>404 Not Found</h1>");
  }
```
ベースは昨日のコードと同じですが、`/led_on`と`/led_off`というパスにアクセスされた際にLEDを光らせたり消したりする処理を追加しました。

# スマホからアクセスしてみる

<iframe width="315" height="315" src="https://www.youtube.com/embed/Uvii-mcQ528?si=lv95GEJVY21JnOuO" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

[スマホでLEDを光らせるサンプル - YouTube](https://www.youtube.com/watch?v=Uvii-mcQ528)

うまくいきましたね！

# まとめ

ね、簡単でしょ？

ESP32を使うことで意外と簡単にIoT電子工作ができるようになります。
例えばサーボモータとか使ったりすれば、簡易SwitchBotとか作れちゃいますね。

では、そのESP32は捨てないで持っておいてほしいです。

というわけで、「IoT機器でも作ってみない？」
マイコン使って「IoT機器でも作ってみない？」1日目

# はじめに

Arduinoを用いて電子工作でもしようとしましたが、その手元にあるArduinoは一回タンスにしまって、秋月か千石でESP32を買ってきてください。

# 今日は何〜

ESP32を用いて、簡単な電子工作でもやってみましょう（そのためのセットアップから何から何まで。）

# 前提知識

ESP32というのはマイコンと呼ばれるものの一種で、あの有名なマイコンであるArduinoと同じような感じです。
そのため、Arduinoを使ったことがある人は比較的簡単に使いこなせると思います。
ただ、ESP32独特なものや、今回は「C++」って感じで書いていくので、C++の知識があるともしかしたら理解が早くなるかもしれないです。

# 材料

- ESP32
- ブレッドボード
- その他配線用のなんか

# 作り方

## セットアップ

電子回路の作り方は省略します。専門外です。
とりあえず2番ピンにLEDを接続しておきましょう。ちゃんと抵抗も忘れないでね。

まずは、Arduino IDEをダウンロードしましょう。
[ここ](https://www.arduino.cc/en/software)からダウンロードできます。今回はレガシーエディタを使っていきますね。

そしてArduino IDEを起動出来たら、`ファイル`→`環境設定`(または`Ctrl + ,`)を開きます。

そして追加のボードマネージャーのURLに`https://espressif.github.io/arduino-esp32/package_esp32_index.json`を入力してOKを押します。

![スクリーンショット 2023-11-27 224459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/ab92ba1a-f679-ae33-8f75-c4126840f8df.png)

次に`ツール`→`ボード`→`ボードマネージャー`を開きます。
`esp32`と検索して、`esp32`をインストールします。

![スクリーンショット 2023-11-27 224557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/6cb0fd3f-5957-1af1-25f6-40e4b61aabda.png)

インストールができたら、`ツール`→`ボード`から`ESP32 Dev Module`を選択します。

これでまずはセットアップは完了です。

## プログラムを書く

とりあえずプログラムでも書いてみましょう。

```cpp
void setup() {
  pinMode(2, OUTPUT);
}

void loop() {
  digitalWrite(2, HIGH);
  delay(1000);
  digitalWrite(2, LOW);
  delay(1000);
}
```

これを書いて、ESP32に書き込んでみましょう。
書き込む際は`ツール`→`シリアルポート`からESP32が接続されているポートを選択してください。

書き込んだらどうでしょう！
多分LEDが1秒ごとに点滅していると思います。

はい、ではお遊びはここまでです。

こんなのArduinoでも同じことができるのでなんの意味もないです。

では、`ESP32`の特徴とは何でしょうか。

# ESP32の特徴
ESP32には、WiFiやBluetoothが搭載されています。
これにより、WiFiやBluetoothを使った通信が可能になります。
これがArduinoとの大きな違いです。

じゃあWi-FiやBluetoothを使ってみたいと思います。
ので、まずは家に帰ってきて、ネット回線をちゃんと契約してWi-Fiにつながるようにしておきましょう。

# まとめ

ESP32を使って、簡単な電子工作をしてみました。
というわけでプロローグでした～！
「協同」で変えるシステム障害対応のポイント3点!

ご覧いただきありがとうございます。**7年間、1000件以上システム障害の分析**をした私がポイントをぎゅっと3点にまとめてお伝えします！
システム障害対応で重要なのは **「協同」** です！
この協同の説明とこれを実現するためのポイント３点をご説明いたします！

※出版した書籍[「3カ月で改善！システム障害対応 実践ガイド」](https://www.amazon.co.jp/dp/479817890X?ref_=cm_sw_r_cp_ud_dp_51MEPC7CJ62TV464XTYW)のポイントとなります。
2023年9月29日の[BPStudy#193〜システム障害は突然に](https://bpstudy.connpass.com/event/295305/)内容に類似します、ご了承ください。


# どんな人にお勧め？
**SIer所属でシステム障害対応を普段行っている方**
例えば、
- 全体の統括・管理を行う方
- 原因調査・暫定復旧を行う方
- 影響調査・顧客連絡を行う方

**SIerに発注し、システム障害対応の委託している方**
- 連絡を受けエンドユーザーへ連絡をする方
- 暫定復旧に関する判断をする方

運用設計やシステム設計や改修でシステム障害が発生しないようにできるのが一番ですが、特に金融、通信、官公庁などは設計の変更・改修は難しく、発生後のプロセスをよりよくすることで、決済やネット利用などITサービス利用者への影響を極小化したい方。

# システム障害対応を変える「協同」とは？

**開発チーム と ユーザー企業 が助け合いながらシステム障害対応にあたること。** です

　そうは言っても、社内が縦割りで難しい、、、とか、お客様がそんな風に接してくれない、、、など、様々な事情がおありだと思います。それでも、協同、助け合いを、システム障害対応のスタンダードにしていきたいです。

　なぜなら、ITサービスを作るときは、会社の内外問わず、多くの関係者で開発されます。そうやって出来たITサービスでの障害は、多くの関係者で協力し合いながら対応したほうが、エンドユーザーへのサービス影響を最小化できると考えているからです。


# 協同を実現するためのポイントは!?


## ポイント①:システム視点ではなくサービス視点
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473422/c6a31d65-fa39-61cf-909f-c5abf7412126.png)


　私は金融システムを10年以上保守運用をしていて、10年前からなかなか改善できないなーと思うことがありました。
　それは、**どれだけ改善を重ねてもお客様より「情報足りない、情報発信が遅い」** と言われてしまうことです。7年1000事例からわかったことは、「サービス視点ではなくシステム視点となっているからだ」ということです。
　私たちはやはり **“システムが復旧したか、システムで何が起きたか”** という視点で動いてしまい、
お客様は“サービスが復旧したか、サービスで何が起きたか”という視点で話している。この視点のずれによってお客様からは

**「（サービスを復旧するための）情報が足りない、（サービスを良い状態に保つには）情報発信が遅い」**  ということが理解できておらずずれ続けている、、、ということです。

## ポイント②:事象ではなくアクション起点
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473422/5d551b6d-27c0-e6cd-6d09-eaf6f00c4f3a.png)


・２つ目：事象ではなくアクション： 
　私はシステム障害対応の改善をしていたので、過去のシステム障害の事象を整理して、対策を考えて・・・とずっとずっとやっていました。
　ただ結局 **「事象って様々だし、対処も変わるからやってもイタチごっこ」** という感じになっていました。ここで私が見つけたポイントは「事象」ではなく「アクション」に注目する事です。
　ここでいう「アクション」は「暫定復旧」「顧客連絡」などで、サーバの再起動や、Webページに掲載するなどと思ってください。
　分析を進めていると、 **システム障害対応ときに実施している「アクション」はだいたい似通ってきてこれを整理すると収束に向かっていくこと** がわかりました。
　また、システム障害対応ができる人と、できない人の差は **「アクション候補が頭に浮かんで、そのどれを選ぶかの判断情報がどこにあって、判断基準をもっているか」** ということがわかりました。
　これを補うためびに都度都度、管理者・マネージャーやベテランが頭にあるアクション候補をもとに、メンバー宛に「この再起動の準備しといて」と指示をしたり、「この情報集めて」という判断情報を集めるように指示をして、その結果を受けて、再起動の指示をする、などしているのではないでしょうか。

## ポイント③:情報の量ではなく情報の質
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473422/1dd072ba-5194-1dad-f124-e5bd52b6328d.png)

　最後に **システム障害時には「不必要な情報を集めすぎる傾向にある」** とわかりました。
　誰かに「なんでもいいから情報頂戴」と言われたことはあるのではないでしょうか？もしくは皆様も「なんでもいいから情報頂戴」といったことあるのではないでしょうか？
・・・ちなみに私はめちゃめちゃあります。

　このように情報を要求するのは「何等か糸口をつかもう」とする行動なのはわかるのですが、情報を提供する方は負担が多くなりますし、受け取るほうも多くの情報を受け取ると混乱を方がいます。
　できれば事前に **「どんな情報がほしいか」を決めておいて、その取得方法・基準などを決めておくともう少し落ち着いて皆さん行動できます。**

是非、アクションの候補をもとに、どんな情報がどのような基準で見ればよいか、をもとに情報を集めるようにしていきましょう！


以上、「協同」で変えるシステム障害対応のポイント3点!説明しました！少しでもご興味持って頂けたら幸いです！
他にも　**[情報発信ブログやコミュニティ](https://ops.co-troubleshooting.com/landingpage/summary?utm_source=qi&utm_medium=post&utm_campaign=3point)** などやってます！ご興味持って頂けたらご覧ください～
【ネットワーク】初心者のためのTCP/IPモデルの各階層の役割とプロトコル説明

## 概要
前回の記事はTCP/IPモデルの大まかな流れについて説明をしました。
今回はTCP/IPモデルの各階層の役割とプロトコルについて説明をしていきます。
前回の記事は下記のものになります。
こちらの記事を読んでからの方が理解しやすいと思います。
是非、こちらも読んでみてください。

https://qiita.com/nakamura_slj/items/f4b3626833181110408c

## 対象とする読者
* ネットワークの基礎から学びたい人
* 前回の記事を読んだ人
* これからIT業界で仕事をしようと考えている人
* CCNAの資格を取ろうとしている人

# TCP/IPモデルの各階層の役割と主なプロトコル
それでは早速説明を始めようと思います。

### アプリケーション層
Webサイトや電子メールなど、インターネット上で提供されているサービスとデータのやり取りをする階層です。
利用される主なプロトコルは下記のものとなります。

| プロトコル | 説明 |
|:---------|:-----------|
| HTTP     |インターネット上のWebサイトを閲覧する際にサーバとクライアント間の通信で利用|
| SMTP     |メール送信に利用|
| POP3     |メール受信に利用|
| IMAP     |メール受信に利用|
| TELNET   |リモートでサーバなどにログインする際に利用|
| FTP    　　　　|ファイル転送に利用|

### トランスポート層
アプリケーション層で利用されるプロトコル間での通信制御をする。
上位層のプロトコル間通信の橋渡し役として主に**TCP**または**UDP**を利用する。
TCPはデータの信頼性を重視するが、UDPは通信速度を優先します。
※TCP：データの信頼性を保証するプロトコル
※UDP：通信速度を優先するプロトコル

### インターネット層
エンドツーエンドの通信を制御します。
インターネット層で利用される主なプロトコルは下記のものとなります。

| プロトコル | 説明 |
|:---------|:-----------|
| IP     |IPアドレスを使用して送信元から宛先までデータを配送する|
| ICMP     |宛先までのルートが使用可能かどうかの確認などを行う|
| IGMP     |データのマルチキャスト送信で宛先の端末のグループ制御する|
| IPsec     |暗号化通信を行う|
| ARP   |IPアドレスからMACアドレスを取得する|
| RARP    　　　　|MACアドレスからIPアドレスを取得する|

※IPアドレス：TCP／IPネットワーク上でPCなどの機器の場所を特定するために使用されるインターネット層の識別子のこと
※MACアドレス：ネットワークインターフェースカード（NIC）に割り振られているリンク層で使用される固有の識別子のこと

### リンク層
直接接続されている機器同士の通信制御します。
インターネット層から渡されたIPパケットを処理して、電気信号に変換してケーブルに送ります。
利用される主なプロトコルは下記のものとなります。

| プロトコル | 説明 |
|:---------|:-----------|
| イーサネット     |ほとんどのLANで使用されているプロトコル（次回の記事で解説）|
| PPP     |2台の機器を接続して通信を行うためのプロトコル|
| SLIP     |RS-232などのシリアル回線からTCP/IPネットワークに接続するためのプロトコル|

※IPパケット：トランスポート層のデータにIPヘッダを付加したデータのこと

# 最後に
以上となります。
今回はTCP/IPモデルの各階層の役割とプロトコルについて簡単に説明しました。
次回はリンク層の説明で出てきた**イーサネット**について説明しようと思います。