OmniAICreator/Qiita-1.07M huggingface dataset:
2023/4/11主にITとかセキュリティの記事

話題のAIと一緒にハッキングしてみた(4/8)
https://qiita.com/schectman-hell/items/4bde18246976632b07a5

【注意】セブン銀行を語るフィッシング詐欺が報告される(4/8)
https://iphone-mania.jp/news-532042/

AIは個人情報を盗む能力がある＝専門家が警鐘(4/9)
https://sputniknews.jp/20230409/ai-15608864.html

調整能力が出世のカギだった日本企業に今必要なのは「変わり者」【江上剛コラム】(4/9)
https://news.yahoo.co.jp/articles/b8d854c45e52fa87ce8bb5d00c2bd3ba1da2eb48

2022年、グーグルがブロックした不適切な広告は50億件オーバー(4/8)
https://www.gizmodo.jp/2023/04/google-ad-5billion.html

狙われる病院　急務のランサム対策(4/10)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/040400141/

日本発技術で「海のDX基盤」構築、NEDOの経済安保重要技術育成が始動(4/10)
https://xtech.nikkei.com/atcl/nxt/column/18/01537/00771/

マイナカード「ほぼ全国民」普及も使う機会なし、デジタル本人確認の民間利用を阻む壁(4/10)
https://xtech.nikkei.com/atcl/nxt/column/18/02420/040600002/

MWC 2023、韓国勢はAI・ロボットに重点 高性能メモリ技術やアライアンスで勝負(4/10)
https://xtech.nikkei.com/atcl/nxt/mag/rob/18/00006/00122/

実にくだらない「守り8割・攻め2割」の議論、所詮はIT部門の予算ではないか(4/10)
https://xtech.nikkei.com/atcl/nxt/column/18/00148/040400277/

業種横断AIスタートアップの業界地図、大企業との資本提携相次ぐ(4/10)
https://xtech.nikkei.com/atcl/nxt/column/18/02416/040300002/

ドコモと楽天が火花　通信インフラ群雄割拠(4/10)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/040500142/

常駐技術者を「安く使う」悪弊　春闘の季節にIT部門は改めよ(4/10)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/033000136/

売り場検索にソニーの新技術　客の位置捉えるビーコンを大幅削減 カインズ(4/10)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/033100128/

QUIC（Quick UDP Internet Connections）(4/10)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/040400139/
【用語】EC2

# EC2
仮想サーバを提供するAWSサービス。
作成したSubnet内に配置する。
EC2仮想サーバのことを、**インスタンス**と呼ぶ。
**公式:** https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html

## インスタンスタイプ
ユーザが指定するEC2のスペック。
CPU、ストレージ、メモリ、ネットワークキャパシティから構成される。
各構成要素は文字列で表現される。
例)t1.micro、g5g.xlarge等
**公式:** https://aws.amazon.com/jp/ec2/instance-types/https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instance-types.html

### 構成要素
- **t4g.medium**で考える。
#### インスタンスファミリー
用途別に指定するインスタンスタイプの分類。
インスタンスタイプの先頭1文字で表現される。
用途は、「汎用」「コンピューティング最適化」「メモリ最適化」「ストレージ最適化」「高速コンピューティング」に分類される。

- 該当箇所
<font color="red">**t**</font>4g.medium 
先頭の「<font color="red">**t**</font>」

#### インスタンス世代
インスタンスの世代。
インスタンスタイプの先頭2文字目で表現される。
数字が大きいものほど新しい世代。

- 該当箇所
t<font color="red">**4**</font>g.medium 
先頭から2番目の「<font color="red">**4**</font>」

#### 追加機能
追加する機能。
インスタンスタイプの先頭3文字目〜ピリオド直前までの文字で表現される。

- 該当箇所
t4<font color="red">**g**</font>.medium 
先頭から2番目の「<font color="red">**g**</font>」

#### インスタンスサイズ
インスタンスタイプごとに決められたインスタンスのスペック。
nanoが最小で、micro→medium→small→large→xlarge→・・・の順番でサイズを設定する。

- 該当箇所
t4g.<font color="red">**medium**</font>
ピリオドより後の「<font color="red">**medium**</font>」
                                                 
## AMI
EC2の元になるテンプレート。
EC2インスタンスのイメージ構築に必要なOS、管理情報などがまとめられている。
**公式:** https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AMIs.html

## EBS
ECSのデータを保存するブロックストレージ。
EC2につけたり外したりすることで使用する対象を選択できる。
**公式:** https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AmazonEBS.html

### ブロックストレージ
ブロックという単位でデータを保持するストレージ。

### ボリュームタイプ
EBSの種類。
料金や処理速度などの違いが存在する。
EBS作成後も増設は可能だが、ディスクサイズを減らすことはできない。
**公式：** https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volume-types.html

### セキュリティグループ
EC2インスタンスに設定できる仮想ファイヤーウォール。
**公式：** https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-security-groups.html

### キーペア
公開鍵と秘密鍵のペア。
作成したEC2インスタンスに公開鍵を指定した場合、秘密鍵を保有するユーザのみがそのEC2インスタンスに接続できる。
**公式：** https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html
nodemonでC++ファイルの変更を検知してコンパイル・実行する

nodemonを.cppファイルのウォッチャーとして使いたかったため。
Windowsではpackage.jsonのscriptでダブルクォーテーションをエスケープしないと複数のコマンド（コンパイルとexeファイルの実行）を実行できないことに注意。

## nodemonのインストール
```batch:cmd
npm install -D nodemon
```

## package.jsonと監視対象のcppファイル
```json:package.json
{
  "name": "nodemon-cpp-file-watching",
  "version": "1.0.0",
  "description": "",
  "main": "main.cpp",
  "scripts": {
    "watch": "nodemon --watch ./ --ext cpp --exec \"g++ main.cpp -o main && main\""
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "nodemon": "^2.0.22"
  }
}
```
```cpp:main.cpp
#include <iostream>
using namespace std;
int main() {
  cout << "Hello World" << endl;
  return 0;
}
```

## 実行
``` batch:cmd
npm run watch
```

## 実行結果
```
> nodemon-cpp-file-watching@1.0.0 watch
> nodemon --watch ./ --ext cpp --exec "g++ main.cpp -o main && main"

[nodemon] 2.0.22
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): **\*
[nodemon] watching extensions: cpp
[nodemon] starting `g++ main.cpp -o main && main`
Hello World
[nodemon] clean exit - waiting for changes before restart
```

## main.cppを変更
```cpp:main.cpp
#include <iostream>
using namespace std;
int main() {
  cout << "Hello Brand New World" << endl;
  return 0;
}
```

## 結果
```
> nodemon-cpp-file-watching@1.0.0 watch
> nodemon --watch ./ --ext cpp --exec "g++ main.cpp -o main && main"

[nodemon] 2.0.22
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): **\*
[nodemon] watching extensions: cpp
[nodemon] starting `g++ main.cpp -o main && main`
Hello World
[nodemon] clean exit - waiting for changes before restart
[nodemon] restarting due to changes...
[nodemon] starting `g++ main.cpp -o main && main`
Hello Brand New World
[nodemon] clean exit - waiting for changes before restart
```
Dexie.jsで始めるIndexedDB

## Dexie.jsとは
Dexie.jsは、IndexedDBのラッパーライブラリであり、**JavaScriptでデータベースを簡単に扱えるようにするためのツール**です。

## IndexedDBとは
Web Storageの一種であり、JavaScriptでデータベースを扱うことができます。オブジェクト指向データベース(OODB)で、JavaScriptで表現可能なオブジェクト（論理値、数値、文字列、date、オブジェクト、配列、正規表現、undefined、null）や画像データなども保存できてしまいます。

5MBくらいまでであれば localStorage や sessionStorage のような WEB Storage API を使うことで実装できますが、大量のデータを扱うのには不向きです。そこで、大量のデータをブラウザ上で扱えるように IndexedDB という仕組みを作りました。ただ、IndexedDBのAPIは使いにくく複雑なため、Dexie.jsが開発されています。

## Dexie.jsのユースケース
Dexie.jsは、Webアプリに最適なツールです。クライアント側で大量のデータを扱う場合や、オフラインでもアプリが動作させたい場合にDexie.jsを活用します。例えば、カレンダーアプリでイベントを追加する場合や、タスク管理アプリでタスクを追加する場合などです。

## Dexie.jsの特徴
IndexedDBのAPIをより簡単に扱えます。また、Promiseベースなので、非同期処理を扱えます。ただ、IndexedDB に依存しているため、IndexedDBの仕様に則って動作させます。

## 記述
例えばタスク管理アプリを作成する場合、Dexie.jsを使用してデータベースを作成することもできます。以下は、Dexie.jsを使用してタスクデータを格納するオブジェクトストアを作成する方法です。
```js
import Dexie from 'dexie';

// DBを作成
const db = new Dexie('TaskDatabase');

// ストアを定義
db.version(1).stores({
  tasks: '++id,name,completed'
});

// タスクを追加する関数
const addTask = async (task) => {
  try {
    await db.tasks.add(task);
  } catch (error) {
    console.log(error);
  }
};

// タスクを取得する関数
const getTasks = async () => {
  try {
    const tasks = await db.tasks.toArray();
    return tasks;
  } catch (error) {
    console.log(error);
  }
};

// タスクを更新する関数
const updateTask = async (task) => {
  try {
    await db.tasks.update(task.id, task);
  } catch (error) {
    console.log(error);
  }
};

// タスクを削除する関数
const deleteTask = async (taskId) => {
  try {
    await db.tasks.delete(taskId);
  } catch (error) {
    console.log(error);
  }
};
```
まずはDexieオブジェクトを作成し、タスクを格納するためのオブジェクトストアを定義しています。その後、タスクを追加・取得・更新・削除する関数を定義しています。

※ストアはテーブルのようなものです。

|++id    |オートインクリメントな主キー   |
|----------|--------------------------|
|name  |タスク名を格納するためのフィールド       |
|completed|タスク完了状況を示すブール値|

#### データ追加(add/bulkAdd)
```js
db.notes.add({
  title: "タイトル",
  body: '本文',
  tags: ["IndexedDB", "Dexie.js"],
  updated_at: new Date()
});
```

#### データ更新(update)
```js
let id = 2;

db.notes.update(id, {
  body: '本文を更新',
  updated_at: new Date()
});
```

#### データ追加/更新(put/bulkPut)
```js
db.notes.put({
  id: 2,
  title: "タイトル",
  body: '本文',
  updated_at: new Date()
});
```

#### データ全件取得
```js
db.notes
    .toArray()
    .then(function (notes) {
      console.log(notes);
    });
```

#### データ削除(delete/bulkDelete)
```js
let id = 1;
db.notes.delete(id);
```


### 参考
https://qiita.com/yamayamasan/items/a4297e724b86f4a00fd2
かっこいいタスク管理用markdownを作成

# 概要
かっこいいタスク管理用markdownを書いてくださいと
chatGPTに聞いて、良さげだったので忘れないようにメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711148/922c37ec-33f6-8f68-7925-b32a8035a9ec.png)



# 実装

```markdown
# タスク管理 🚀

## 今週のタスク 📅

### 🔥 高い優先度
- [ ] 🔴 タスク1: プロジェクトAの報告書を提出する
- [ ] 🔴 タスク2: クライアントBとのミーティング準備
- [x] 🔴 タスク3: 重要なメールをチェック・返信する

### 🟡 中程度の優先度
- [x] 🟠 タスク4: 週次チームミーティングに参加する
- [ ] 🟠 タスク5: プロジェクトCの更新を確認する

### 🟢 低い優先度
- [ ] 🟢 タスク6: オフィスの整理整頓
- [x] 🟢 タスク7: スケジュール管理ツールの更新

## 今月の目標 🎯
1. **プロジェクトA** の完了
2. **プロジェクトB** の進捗を50%まで進める
3. 新しいスキルを習得する

## 長期的な目標 🌟
- [ ] 🏆 目標1: 昇進する
- [ ] 🏆 目標2: 業界でのリーダーシップを発揮する
- [ ] 🏆 目標3: 自己啓発のための書籍を定期的に読む
```


# 見え方
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓


# タスク管理 🚀

## 今週のタスク 📅

### 🔥 高い優先度
- [ ] 🔴 タスク1: プロジェクトAの報告書を提出する
- [ ] 🔴 タスク2: クライアントBとのミーティング準備
- [x] 🔴 タスク3: 重要なメールをチェック・返信する

### 🟡 中程度の優先度
- [x] 🟠 タスク4: 週次チームミーティングに参加する
- [ ] 🟠 タスク5: プロジェクトCの更新を確認する

### 🟢 低い優先度
- [ ] 🟢 タスク6: オフィスの整理整頓
- [x] 🟢 タスク7: スケジュール管理ツールの更新

## 今月の目標 🎯
1. **プロジェクトA** の完了
2. **プロジェクトB** の進捗を50%まで進める
3. 新しいスキルを習得する

## 長期的な目標 🌟
- [ ] 🏆 目標1: 昇進する
- [ ] 🏆 目標2: 業界でのリーダーシップを発揮する
- [ ] 🏆 目標3: 自己啓発のための書籍を定期的に読む
【Docker】docker compose run でポートをホスト側に割り当て可能にする

## `--service-ports`

`--service-ports`を使用することで`compose.yml`に記述した`ports`を適用することができます。

```terminal
$ docker compose run --service-ports --rm service bash

$ docker container port container-name
3000/tcp -> 0.0.0.0:3000
6006/tcp -> 0.0.0.0:6006
```

`--service-ports`を使用しないと`ports`は無視されます。

```bash
$ docker compose run --rm service bash

$ docker container port container-name
# 何も出力されない
```
ngrokのLinux版をWSL2(Ubuntu)に導入する

# はじめに
ngrokのLinux版をWSL2(Ubuntu)に導入する方法を紹介します。

```:環境
    WSL2
    Ubuntu 20.04.5 LTS
    ngrok version 3.2.2
```

### [ngrok](https://ngrok.com/)とは
オープンソースのリバースプロキシツールであり、ローカルホスト上で実行されているWebサーバーを公開するためのトンネリングサービス。つまりngorkは、ローカルホスト上で動作しているアプリケーションを外部のインターネットからアクセス可能にしてくれるツールである。ちなみに、読み方は「エングロック」です (nginx的な...)。

## インストール
1. Ubuntu環境のため、https://ngrok.com/download からLinux版をダウンロードする
1. 圧縮ファイルのあるディレクトリ(デフォルトのままであれば "C:\Users\[ユーザ名]\Downloads")をUbuntuの/usr/binへ移動する
このタスクを実行するには、WSLを使用してUbuntuのターミナルを開く必要がある。次に、以下の手順を実行して、ファイルを移動できる。

    1. Ubuntuのターミナルを開き、移動先のディレクトリに移動するために以下のコマンドを実行する。
    `cd /usr/bin` 
    1. 移動したいファイルがあるフォルダーに移動するために以下のコマンドを実行する。
    `cd /mnt/c/Users/[ユーザ名]/Downloads`
    このコマンドは、Windowsのダウンロードフォルダーに移動する。ダウンロードフォルダーのパスが異なる場合は、そのパスに応じて変更すること。
    1. 移動したいファイルを、以下のコマンドを使用して移動する。
     `sudo mv [ファイル名] /usr/bin/`
　　 ここで、[ファイル名]は移動したいファイルの実際のファイル名に置き換える。今回であれば、ngrok--v3-stable-linux-amd64.tgzとなる。

1. 移動した圧縮ファイルを展開する
※もちろん、展開してから移動してもよいが、今回は先に移動してから展開する方法を取る。
`tar xvf ngrok-v3-stable-linux-amd64.tgz`
1. 圧縮ファイルを削除する
`sudo rm ngrok-v3-stable-linux-amd64.tgz`
1. ngrokへアクセスできることを確認する。
`ngrok version`
`ngrok version 3.2.2`
1. ngrokが展開されたら、ngrokの管理画面のsetup & Installationに記載されている以下のコマンドを実行
`ngrok authtoken [token]`

## アクセス方法
`ngrok http [port]`
80番ポートを外部に公開する場合は`ngrok http 80`になる。
下記の画面が表示されるので、アクセスURLからブラウザでアクセスする。
```:ngrok実行結果
ngrok                                                       (Ctrl+C to quit)              
Announcing ngrok-rs: The ngrok agent as a Rust crate: https://ngrok.com/rust              
Session Status                online               
Account                       XXXXXXXX (Plan: Free)                          
Version                       3.2.2                                         
Region                        Japan (jp)                                    
Latency                       30ms                                          
Web Interface                 http://127.0.0.1:4040                         
Forwarding                    https://XXXXXXXX.ngrok-free.app -> http://localhost:80                                                                           
Connections                   ttl     opn     rt1     rt5     p50     p90                                               
                              0       0       0.00    0.00    0.00    0.00  
```
- Web Interfaceで示されたhttp://127.0.0.1:4040 は、作成したトンネルの利用状況を閲覧できるコンソールです。トンネルを通したHTTP通信の全情報を閲覧できるため、デバッグ時にも役立ちます。
- Forwardingで示されたhttps://?????.ngrok-free.appが外部向けのURLです。ここへの接続がhttp://localhost:80にトンネリングされています。

## おわりに
同じ過ちを皆に繰り返してほしくないので、ngrokを触った背景を述べる。(ngrokとは直接関係ないのでここでサイトを閉じても大丈夫) 一言でいうと一か月間Herokuを利用できなくなってしまったからだ。Herokuでwebアプリをデプロイしようと思い、クレジットカードの登録をしていたのだが、英語の注意書きをよく見ずにクレジットカードの登録を削除した結果、利用できなくなった。(笑) ngrokを触るきっかけにはなったけど。焦らずに注意書きにはしっかり目を通そう。
## 参考記事
https://www.nalabo.net/blog/2022/04/09/1292
https://qiita.com/mininobu/items/b45dbc70faedf30f484e
https://qiita.com/RayDoe/items/8a68f40d165819b82463
doveconf

●doveconf
Dovecotの設定内容を表示できるコマンド。「conf.d」配下の複数のファイルに渡る設定内容をコマンド1つで設定全体を確認でき、標準以外の設定だけを表示することも可能。

■コマンドの書式
doveconf [オプション]

主なオプション

・-n　デフォルト以外の設定を表示
・-c　設定ファイルを表示。デフォルトは/etc/dovecot/dovecot.conf
WiresharkでProxyサーバー向け通信を解析


:::note warn
技術的に新しい内容が含まれている訳ではなく、初歩的な内容です
:::

クライアントからProxyサーバー向け通信をWiresharkで解析する際のフィルタリング方法を紹介する

・Proxy設定したが想定通り通信できていないため原因究明したい場合
・Proxyサーバー経由での通信内容を確認したい場合（アクセスログ解析）

## Wiresharkでの解析手順

1. CONNECT Methodのみを表示して解析したい宛先通信を特定する
2. 該当通信の送信元ポート番号を確認しフィルタリングする


## 通信を解析する際に有効なWiresharkフィルタリング


CONNECT Methodのみを表示する
（実際に流れる通信の大半であるHTTPS通信は暗号化されており内容を確認することができないため、最初にProxyサーバーへ送信するHTTP CONNECT Methodに含まれる情報を参照する）
```
http.request.method == CONNECT
```

TCP 宛先Port番号でフィルタリング
（全てのProxy通信が表示されるため、CONNECT Methodで該当通信を特定した方が解析しやい）
```
tcp.dstport==8080
```

TCP 送信元Port番号でフィルタリング
```
tcp.srcport==xxxxx
```

宛先URLでフィルタリング（「宛先FQDN:宛先ポート番号」の形式で指定）
```
http.request.uri=="xxx.com:443"
```

TCP RSTパケット（Connectionを切断している情報を確認したい場合）
```
tcp.flags.reset==1
```

## Wireshark画面に宛先URLを表示する

取得したキャプチャーファイルをWiresharkで解析する際に、
どの宛先にアクセスしたか可視化するために「http.request.uri」を列に表する

1. Wireshark表示画面の列(No./Time/Source/Destination/Protocol/Length/Infoが表示されているバー）を右クリック
2. 列の設定
3. 画面下の＋ボタンで項目を追加
4. 種別をCustomを選択
5. フィールドにhttp.request.uriを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329464/4893457c-8e86-33c3-3dd8-76c80e3906c8.png)


例えば、キャプチャーファイルの中からアクセス先(Request URL)の一覧を取得したい場合、
キャプチャーした画面を全選択＆コピーしてExcelに張り付けした上で、
データフィルター(空白セルを表示しない)することにより追加した列にRequest URLのみを一覧表示することも可能です。



## TCPストリーム番号でフィルタリング

Wireshark上で該当通信を選択した状態で、メニューから分析 > 追跡 > TCPストリーム を選択
TCP 送信元Port番号でフィルタリング（tcp.srcport==xxxxx）と同様の解析ができる



## 参考リンク

Download Wireshark
https://www.wireshark.org/download.html
QNAPのNASにcloudflaredを載せた時の備忘録

# 前提

sshが使える前提です。
TS-453D
QTS 5.0.1.2346 Build 20230322

# 手順

## cloudflaredの準備

### バイナリのダウンロード
- `uname -a`でアーキテクチャを調べる
```sh
[username@QNAP453D ~]$ uname -a
Linux QNAP453D 5.10.60-qnap #1 SMP Wed Mar 22 18:12:13 CST 2023 x86_64 GNU/Linux
```

-  公式から適切そうなバイナリをダウンロードする
 
https://github.com/cloudflare/cloudflared/releases

```
$ wget https://github.com/cloudflare/cloudflared/releases/download/2023.3.1/cloudflared-linux-amd64
$ chmod  755 cloudflared-linux-amd64
$ mv cloudflared-linux-amd64 cloudflared
```

### cloudflared側の設定をする

https://akaimo.hatenablog.jp/entry/2022/12/18/154458

を参考に進める。ただし、管理画面を外から触りたいわけではなかったのでDNS登録はスキップ。
記事の設定が済んだら、Zero trust側の設定画面からmigrationする。必須ではないですが、設定をWebからできるようになるのでやっておくと楽。
他にもいろいろあるが、割愛。(主にLANの中に入るための設定)
唯一、今回作ったトンネルのPrivate NetworkとしてアクセスしたいLANのIP範囲を設定しておく。例えば、`192.168.0.1/24`など

### 手動で起動してみる

```sh
cloudflared tunnel --config /share/homes/admin/.cloudflared/config.yml run
```

## NAS再起動時に一緒にトンネルも起動させる

https://wiki.qnap.com/wiki/Running_Your_Own_Application_at_Startup

を参考に、autorun.shの編集をした。
手動で起動したときのコマンドをそのまま記載した形。

# 備考

systemdが使えない等制限が多いので、CloudflareのWebコンソールに表示されるセットアップスクリプトが使えません。結構めんどくさいかも。
出力結果を簡単に見やすく表示する方法（pprint）

paizaのスキルチェックでコードを書いていると、
途中結果を確認をしたいと感じることが多くあります。
その際に長い2次元配列などは横に長く表示されてしまい、見づらいことがあります。
今回はそれを簡単に見やすくする方法について説明します。

　
まずは何の工夫もなく、長い list をそのまま出力するコードです。

```Python
test_list = [["11111111", "22222222", "33333333"], ["aaaaaaaa", "bbbbbbbb", "cccccccc"], ["one", "two", "three"]]

print(test_list)
```

実行結果はこちら

```Python
[['11111111', '22222222', '33333333'], ['aaaaaaaa', 'bbbbbbbb', 'cccccccc'], ['one', 'two', 'three']]
```

結果は見づらいです。

　
続いて、`for`文を使って結果を見やすく表示するコードです。

```Python
test_list = [["11111111", "22222222", "33333333"], ["aaaaaaaa", "bbbbbbbb", "cccccccc"], ["one", "two", "three"]]

for i in range(len(test_list)):
    print(test_list[i])
```

実行結果はこちら

```Python
['11111111', '22222222', '33333333']
['aaaaaaaa', 'bbbbbbbb', 'cccccccc']
['one', 'two', 'three']
```

二次元配列が1行ずつ表示され、見やすくなったと思います。
ただし「毎回`for`文を書いたりせずに簡単に見やすく表示したい」と、私は感じていました。
そんな時に便利な機能が用意されていることを知りました。

　
便利な機能とは、`pprint`モジュールを使う方法です。
以下のコードで説明します。

```Python
# pprint モジュールを import
import pprint

test_list = [["11111111", "22222222", "33333333"], ["aaaaaaaa", "bbbbbbbb", "cccccccc"], ["one", "two", "three"]]

# pprint.pprint()で出力
pprint.pprint(test_list)
```

実行結果はこちら

```Python
[['11111111', '22222222', '33333333'],
 ['aaaaaaaa', 'bbbbbbbb', 'cccccccc'],
 ['one', 'two', 'three']]
```

先ほどの`for`文を使った場合と同様に、
二次元配列が1行ずつ表示され、見やすくなったと思います。
これが通常の`print`文を使うのとほぼ変わらずに実現できるので是非ご活用ください。

:::note info
配列の横幅が短い場合は、改行が想定通りにならないこともあります。
その際には「width」で幅を指定することで、出力幅を変更することができます。(デフォルトは80)

`pprint.pprint(【出力対象】, width=【width指定】)`
:::
参考にしたい記事のMarkdownを調べたい！


参考にしたい記事のURL末尾に`.md`を付与することでMarkdownを調べることができる

---

参考にしたい記事
https://qiita.com/dev_makino/items/d5ae153e69099d2bb226

Markdownを調べる
https://qiita.com/dev_makino/items/d5ae153e69099d2bb226.md

## 追記

↓Qiitaのデフォルト機能として備わってました...!!
記事左側の三点リーダを押下 > 「Markdownで本文を見る」を押下
Powershellのコマンドレットを調べる3つの方法


<hr>

**Powershellのコマンドレット**を調べる方法には、主に以下の3つがあります。
ご参考ください。

<hr>

※**コマンドレット**について
　✅PowerShellで使用されるプログラムのこと
　✅動詞-名詞の命名規則に従い、**.NET Framework**で実装される
　✅**パイプライン機能**と組み合わせることで、効率的に複雑なタスクが実行できる

<hr>

**入力補完**

Powershellでは、途中まで入力したコマンドレットを補完する機能があります。
**Tabキー**を押すか、**Ctrl + Space**を押すことで、途中まで入力したコマンドが補完されます。

<hr>

**コマンドレットの検索**

**Get-Command**を使ってコマンドレットを検索できます。
**ワイルドカード(＊)**　を使用することで、検索範囲を広げることができます。
さらに、-Nounや-Verbオプションを指定して名詞部分や動詞部分を検索できます。-Moduleオプションでモジュールを指定することで、モジュールで提供されているコマンドレットを確認できます。


````
PS> Get-Command -Noun Item
　#Itemという名詞部分を持つコマンドレットを検索し、一覧表示する。
　 例えば、ファイルやフォルダを操作するコマンドレット（Get-Item, Set-Item, Remove-Itemなど）が表示される。

PS> Get-Command -Noun Item -Verb Get
　#名詞部分がItemであり、動詞部分がGetのコマンドレットを検索し、一覧表示する。

PS> Get-Command -Module Selenium
　♯Seleniumモジュールに含まれるコマンドレットを検索し、一覧表示する。
````

<hr>

**ヘルプの利用**
コマンドレットの説明や使い方は**Get-Help**で調べることができます。
また、コマンドレットに-?のパラメータを付けると、情報を調べることができます（ただし英語）。
-Detailedや-Fullオプションを使って、表示される情報量や内容を指定できます。

````
PS> Get-Help Get-ChildItem
 #Get-ChildItemコマンドレットに関するヘルプ情報を表示。

PS> Get-Help Get-ChildItem -Detailed
　#-Detailedパラメータを付けることで、コマンドレットの基本的な説明だけでなく、
　　使用可能なパラメータ、各パラメータの説明、さらに使用例など、より包括的な情報を取得できる。

PS> Get-Help Get-ChildItem -Full
　#Get-ChildItemコマンドレットに関する最も包括的なヘルプ情報を表示します。
  -Fullパラメータを付けることで、コマンドレットの説明、使用可能なパラメータ、
  各パラメータの説明、使用例、関連するコマンドレットやトピックなど、すべての情報を取得できます。

PS> Get-ChildItem -?
 #Get-ChildItem コマンドレットに関するヘルプ情報を簡潔に表示します。
  -? パラメータを使用することで、コマンドレットの基本的な説明や使い方をすばやく確認できます。
````
※Get-ChildItemは、ディレクトリ内のファイルやフォルダを一覧表示するために使用されるコマンドレット

以上がPowershellのコマンドレットを調べる3つの方法でした。
renderにデプロイするときにrack-mini-profilerで詰まった話

# 目的
Railsでアプリ作ったとき、renderへあげるまでがめんどくさくて後回しにしてました。
今日は少ししか時間がないけど、それぐらいならできるかと思って上げ始めたらbuildできなくて意外に時間かかったのでメモ


# 今回やること

今回の目標は1つ！
* githubリポジトリをrenderにデプロイする


# 環境
* windows 10
* ruby 3.0.4
* rails 6


# いざ出陣

基本、renderでリポジトリを指定したら、pushしたタイミングで勝手にrenderへデプロイされます。（設定していれば）
アプリ側に問題があるとBuildできないんだけど、そうなった...

結論、開発環境でインストールしている `rack-mini-profiler` を本番環境でもインストールすればで来ました。

```sh:Gemfile
group :production do
  gem "pg", "~> 1.4"
  gem 'rack-mini-profiler', '~> 2.0'    # これを追加
end
```

 `rack-mini-profiler` はSQLの発行回数や処理時間、ビューレンダリング時間などを計測できるそうなので、画面左上に出てくる時間を消したときに開発環境にはいれたのかな('_'?)
覚えてないのやばすぎ。
良くわからないけど、デプロイできたのでOK。

# 余談
次何するか決めかねてる。することはあるんだが...
ユーザーテーブルとコミュニティテーブルで、
ユーザーをコミュニティに入れて、マイページで表示してみようかな。

コミュニティが多いときにページを分けるやつやりたい。
まーたフロント。あ、ちょっとミドルバックか。
wordpressをサブディレクトリで動かすのにハマってしまった

# 始めに
既に稼働中のWordPressのサイトをEC2へ引っ越しする過程で環境構築していて躓いたので、その備忘録です。

## 開発環境
EC2,RDS,Apache(2.4),WordPress

## 実現したいこと
example.com/wp/ でアクセスした時にwordpressのサイトが表示される。
※サブディレクトリ名を wp とします。

## ハマったこと
/wp/でアクセスした時に、wordpressの一部のページは表示されるけど、サイト内の別ページに飛ぼうとすると「404」になってしまう。。。

apacheのドキュメントルートや、WordPressのURLの設定周りを色々触るも解決できず、chatGPTさんに聞いてみたら割とサクッと解決してくれました。

## 結論
下記3つの設定を見直す必要がある！
①WordPressのURLの設定
②.htaccessファイルの設定
③Apacheの設定

### ①WordPressのURLの設定
管理画面にすら入れなかったので、直接編集しました。
```php
// wp-config.php に以下を追記 
define('WP_HOME','https://example.com/wp/');
define('WP_SITEURL','https://example.com/wp/');
```

### ②.htaccessファイルの設定
Apacheが正しくリダイレクトするようにするためのものです。
```apache
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wp/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp/index.php [L]
</IfModule>
```
### ③Apacheの設定
Apacheが.htaccessファイルを読み込むことができるようにするためのものです。
これを追加して、Apacheを再起動してください。
```apache
<Directory "/var/www/html/hp">
    AllowOverride All
</Directory>
```

# 終わりに
chatGPTさんが偉大ということです。
中々大変だった開発環境構築

# 当初思い描いていた未来
:::note info
手順が社内サイトにページとして残されているから楽勝楽勝！
一日作業だぜぃ！

**目的**
MacでクローンしたプロジェクトをParallelsDesktopのWindows11に構築したIISでASPを動かそう！
:::
# 立ちはだかる壁
:::note warn
**予感**
おや？　環境ごとに色んなページが存在しているぞ……？
こいつは、Windows用だし。こいつはMacIntel版だな……
そうそう、MacM1版。これよこれよ。あれ、なんかMacM1版のページ多いな……
:::
:::note alert
**遭遇**
IISで動かすはずなのに、IISはセットアップしないんだ。ふーんへえ、、、
あれ、うごかないな……　内部エラーになってしまったぞ！！
:::

# 相棒どうすればいいんだ
![スクリーンショット 2023-04-10 235112.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322151/bffdf692-fe72-2549-be4b-19d3c3fdd2e1.jpeg)
うーん。パーミッションエラーは非常に怪しいと思っていた！
なんてったって、クローンした場所はMacな訳だし、なんならリードオンリー状態だったからね！

# 結局やったこと
・権限周りかなと思って、Parallelsの設定からMac側の共有フォルダーにクローンしたフォルダーを追加して、権限に読み書きを与えてみた。
　→改善せず。
・エラーログを見ると一部のXMLファイルが読み込めないということになっていた。
　→XMLファイルはBOM無しのUTF-8であることがルールだったが、BOM付きのものがチラホラある。
・BOMを無くしてリトライ。
　→改善せず。
・読み取れなくなっているXMLの中身の内、コメント部分が文字化けしていた。
　UTF-8でもSJISでも文字化け。何だったんだろう。
　→文字化け部分を削除してリトライ。
　　→ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!

# 所感
複数ある構築ページごとに微妙にやっていることが違っていて、これは大変だ！
と思った。その中でもスムーズに解決に向けて一直線に向かえたページがあったので
これを推して推して推しまくることにする。
文字化けしているのがコミットされているのはどうしたもんか(ﾟДﾟ;)
【受験記】駆け出しエンジニアが5日でクラウドプラクティショナーを突破した方法

# はじめに
AWSクラウドプラクティショナーを受験して合格したので、その中でもう少しこうやって勉強すればよかったなどの情報を記事にしたいと思います。

# 受験のきっかけ
現在エンジニアを目指しているのでポートフォリオの作成、デプロイなどでAWSの知識は必須になると思うので受験を決めました。

# 学習内容
### 参考書
・[AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=pd_bxgy_img_sccl_1/357-2928442-3898263?pd_rd_w=EWiYn&content-id=amzn1.sym.bc57a5ab-9f02-4944-8c5c-9e1696e0d32c&pf_rd_p=bc57a5ab-9f02-4944-8c5c-9e1696e0d32c&pf_rd_r=2686Y14XTND12Z0Y2CRX&pd_rd_wg=QuGf6&pd_rd_r=f2564706-d1cd-492a-862e-406a3e60bb85&pd_rd_i=4797397403&psc=1)

緑本と呼ばれている上記の参考書を使用しました。参考書はこれで間違いないと思います。
最初はこれを1周してAWSの全体的な概要を押さえることから始めました。僕の場合このあとすぐ問題に触れたのですが思ったより頭に入っていなかったのでもう1周して計2周しました。
参考書にある問題は全て理解して解けるようにした方がいいと思います。

### 問題集
・[AWS認定資格 無料WEB問題集&徹底解説](https://aws-exam.net/clf/clf_question.php)

次に無料で使用できるこちらの問題集を使用しました。正直、参考書のみだと問題演習量が全然足りないので追加で他の問題集は使用した方がいいとおもいます。
この問題集は、一問回答するごとにその答えと色々なユーザーのコメントが見れるのでアウトプットには最適だと思います。答えを覚えるのではなくしっかり解説を理解して、理解できなかったところはその都度参考書に戻って調べるというのを繰り返しました。
こちらは計2周しました。

・[この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-4260/)

最後にかなり評判の高いUdemyの問題集を使用しました。こちらは有料ですがしっかりアウトプットすることができれば確実に合格することができると思います。
この問題集は基礎と本番の2種類に分かれていて、どちらも本試験と同じ形式で学ぶことが可能になっています。
基礎編が特に大事でこの問題を全て理屈から理解できればギリギリですが合格ラインには届くと思います。その後に本番編を解くのですが、こちらはかなり難しくなってるのでUdemyが提供する合格ラインには届かなくても大丈夫だと思います。
ですが基礎編にはない問題や解説があったりするので理解するのはとても大切です。
最終的にこちらの問題集は3周して本試験に挑みました。

# 最後に
試験を受けてみた感想ですが、今回は5日と短い勉強期間で受験することになりましたがUdemyの問題集がなければこの短期間での合格はできなかったと思います。意外と細かいとこまで問われるので応用問題をしっかり押さえると言うよりは基礎をとことん押さえるのがいいと思いました。
AWS公式のホワイトペーパーからも出題されるのでしっかり押さえておきました。
結果的に、問題集をどれだけ反復できるかが合否を決めると思います。
簡単にうるう年を計算する

忘れたくないのでメモメモ
コードはこちら
```php:
<?php
function isLeapYear($y) {
    return checkdate(2,29,$y);
}

if (isLeapYear(2014)){
    echo"閏年です。";
}
```

ポイント
- checkdate関数は指定された日付が存在するかどうかを判断し、true、falseで返す。
コマンドプロンプト「type」　WindowsでLinuxコマンド「cat」のようにテキストファイルをまとめて出力する

**typeコマンドの概要と使用例**

Windowsのコマンドプロンプトで、Linuxの『cat』コマンドのように複数のテキストファイルをまとめて出力するには、『type』コマンドを使用します。以下のような構文を使って、複数のファイルを連結して出力できます。

下記のコマンドは、file1.txt、file2.txt、およびfile3.txtという3つのテキストファイルの内容を連続して出力します。

```
type file1.txt file2.txt file3.txt
```

また、出力結果を新しいファイルに保存する場合は、以下のようにリダイレクト（>）を使用します。

```
type file1.txt file2.txt file3.txt > output.txt
```
これで、file1.txt、file2.txt、およびfile3.txtの内容が連結され、output.txtという新しいファイルに保存されます。

<hr>

**すべてのテキストファイルを連続して出力する「type ＊.txt」**

「type ＊.txt」 コマンドは、カレントディレクトリ内のすべてのテキストファイルを連続して出力します。このコマンドは、ワイルドカード (*) を使用します。

例えば、カレントディレクトリにfile1.txt、file2.txt、file3.txtという3つのテキストファイルがある場合、以下のコマンドを実行すると、これらのファイルの内容が連続して出力されます。

```
type *.txt
```
また、出力結果を新しいファイルに保存する場合は、リダイレクト（>）を使用します。

```
type *.txt > output.txt
```
これで、カレントディレクトリ内のすべてのテキストファイルの内容が連結され、output.txtという新しいファイルに保存されます。
【Network】Packet Tracerでルーターの動作検証

# ルーターについて
複数のネットワークを繋げてくれる機器です。
ルーターを使用する事で、異なるネットワークでも通信する事が出来ます。
`OSI参照モデル`のレイヤー3(ネットワーク層)で扱われます。

# デフォルトゲートウェイについて
外部ネットワークに通信する際の中継先となります。
内部ネットワーク内に宛先が存在しない場合に、`デフォルトゲートウェイ`に通信が転送されます。`デフォルトゲートウェイ`を経由して、外部ネットワークとのやり取りを行っています。

# Packet Tracerを使用して、実際に検証
目的は外部ネットワークの通信する事とし、下記構成で検証します。
※ルーター以外の設定は既に完了しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/f4a97b12-5f3e-d1ae-0620-f476f2c2d6ab.png)
ルーターにIPアドレスの設定を行います。
下記のようなコマンドを実施します。(GigabitEthernet0/1も同様に実施)

```:IPアドレスの割り当て
Router>enable
Router#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#
Router(config)#interface gigabitEthernet0/0
Router(config-if)#ip address 192.168.0.254 255.255.255.0
Router(config-if)#no shutdown

Router(config-if)#
%LINK-5-CHANGED: Interface GigabitEthernet0/0, changed state to up

%LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0, changed state to up
```

上記設定後に、外部ネットワークに通信出来る事を確認致しました。
![network2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/8640497d-b2d2-0716-17a0-042de53c162f.gif)
うまく設定出来ていない場合は、外部ネットワークと通信出来なかったです。
例えば、デフォルトゲートウェイの設定がうまく行えていない場合は送信先が見つかりませんでした。
今回pingコマンドで疎通確認を行いましたが、ターミナル上ではTimeoutと表記されておりました。
![network3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/d5cd98fe-45d7-b624-310e-f113e89d6166.gif)
ケース別：AI検索ツールを用いた論文調査について

## はじめに

最近、AIを用いた論文を調べるツールが出ています。
どのような場合にどのツールを使えば良いか、自分なりにケース別に整理してみました。
(※まだBingチャットが利用できていません・・)
なお、今回紹介するツールは全て**無料**で使うことができます。
今回は 「**Find literature on insects and AI（昆虫とAIに関する文献を探す）**」というマニアックな文献を探したいモチベーションでツールの違いを見ていきます。

### ●どのように深堀りしていくか迷っている場合：Perplexity
[Perplexity](https://www.perplexity.ai/)は対話型の対話型のAI検索エンジン。
対話型なので結果を見ながら試行錯誤することが出来ます。

google chromeの機械翻訳機能を使った結果です。画面上位に要点がリストとして表示され、画面下位にソースのリストが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684711/182c1bf7-227c-5129-9031-de2c6b598235.png)

更に画面をスクロールし、リストの下に質問の候補が出て、深堀りの参考になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684711/6e4ccc42-8ead-88a8-46ee-9c3e3abf3d41.png)

### ●論文リストが知りたい場合：Semantic Scholar
[Semantic Scholar](https://www.semanticscholar.org/)機械学習を活用した学術文献検索サービス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684711/6074d961-51bd-8236-9187-6f878a82d0a4.png)

検索結果は以下のようになります（※こちらも機械翻訳結果です）
「TLDR」と記載されているところには、論文の要約が記載されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684711/9283392b-9969-216d-6f77-96da0497f213.png)

### ●気になった論文の概略を知りたい場合：SciSpace
[SciSpace](https://typeset.io/)は論文読解をサポートしてくれるツールです。
例えば、Semantic Scholarで「A NEW GENUS OF FLEA FROM NEW GUINEA , WITH NOTES ON CONVERGENT EVOLUTION（ニューギニアからのノミの新属、収斂進化に関する記録）」という論文が気になったとします（どういう内容の論文なんでしょう・・:joy_cat:）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684711/7c27219d-df90-ec18-713f-8a70334624fb.png)

この論文をPDFとしてダウンロードし、検索窓にアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684711/87af455c-4c74-db08-adef-9bea0cd9fd20.png)

「この論文を2行で説明してください」や「この論文の貢献は何ですか」ということをチャットで尋ねて、論文の内容理解を助けてくれます。論文のタイトルにあるように「ノミ」に関する要約が出力されています。
（※chromeの拡張機能の[SciSpace Copilot](https://chrome.google.com/webstore/detail/scispace-copilot/cipccbpjpemcnijhjcdjmkjhmhniiick)が登場しました）

### ●気になった論文の関連論文が知りたい場合：Connected papers
[Connected papers](https://www.connectedpapers.com/)では、視覚的なグラフで接続された論文を調べることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684711/f51efd71-7f36-527e-9d07-90ae8e22be74.png)

例えば、先程と同じこの論文名を検索画面に入力し、クリックをすると、このようなネットワーク図が表示されます。
「ノミ」の近くの論文として「ダニ」に関する論文が距離が近いことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684711/7d5cdf2e-e086-437f-7734-3004e1df5236.png)

### ●参考情報：今回上手くいかなかった場合：ChatGPT(GPT3.5モデル)
プロンプトの勉強不足かもしれませんが、全く「ノミ」に関係ない結果が出てきました。
（GPT4の場合やプロンプトを変えると精度が変わるかもしれません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684711/1c44abd7-6fa9-76e0-099d-f29574316de9.png)

## 今後
* まだ「Bing」のAIチャットが試せていないので、試してみたいと思います。


## 参考にした記事
* [岡瑞起さんのnote, 論文を読むときに使えるオススメツール Semantic Scholar と Connected Papers](https://note.com/mizuki_oka/n/n22abe5da4587)
【C#】クラスのプロパティでループする

「プロパティ名 = 値」といったログ出力を行いたかった時に見つけたメソッドです。
便利だったので共有。

# object.GetType().GetProperties()
```c#
using System;
using System.Reflection;

class Program
{
    static void Main(string[] args)
    {
        Fruit fruit = new Fruit(1, "りんご", true);

        PropertyInfo[] properties = fruit.GetType().GetProperties();
        foreach (PropertyInfo property in properties)
        {
            Console.WriteLine("プロパティ名：" + property.Name);
            Console.WriteLine("　　　　　型：" + property.PropertyType);
            Console.WriteLine("　　　　　値：" + property.GetValue(fruit));
            Console.WriteLine("");
        }
    }
}

public class Fruit
{
    public int id { get; set; }
    public string name { get; set; }
    public bool isOrganic { get; set; }

    public Fruit(int id, string name, bool isOrganic)
    {
        this.id = id;
        this.name = name;
        this.isOrganic = isOrganic;
    }
}
```
# 実行結果
```
プロパティ名：id
　　　　　型：System.Int32
　　　　　値：1

プロパティ名：name
　　　　　型：System.String
　　　　　値：りんご

プロパティ名：isOrganic
　　　　　型：System.Boolean
　　　　　値：True

```

# 動作環境
Windows10 22H2 OSビルド 19045.2728
Visual Studio Community 2019
C# 7.3
.NET Framework 4.7.2
VirtualBox に VSCode から SSH リモート接続する

タイトルの通り、VirtualBox に VSCode から SSH リモート接続するやり方についての備忘録です。VirtualBox や VSCode のインストールは済んでいるものとします。
（忘れないように急ぎで書いたのでスクショとかの用意はないですが、いつか追加します）
# SSH用のネットワークアダプターを有効化
Oracle VM VirtualBox マネージャーを開き、対象とする VM を選択（このとき VM は停止させておく）して「設定」->「ネットワーク」->「アダプター2」と進みます。もし「アダプター2」がすでに使用済みであれば「アダプター3」などを適宜選んでください。  
続いて「ネットワークアダプターを有効化」のチェックを入れ、「割り当て」として「ホストオンリーアダプター」を選択したら、右下の「OK」をクリックします。

# openssh-server のインストールと IP アドレスの確認
先ほどの VM を起動し、ターミナルを開きます。以下のコマンドを実行して　openssh-server をインストールします。
```sh
sudo apt update
sudo apt install openssh-server
```
続いて SHH リモート接続のための IP アドレスを確認します。
```sh
ip addr show
```
上のコマンドを実行し、3つ目のところの「192」から始まる IP アドレスをメモしておきます。

# Remote - SSH 拡張機能をインストールして SSH リモート接続
VM は起動したままで、ローカルの VSCode を起動します。拡張機能の「Remote - SSH」をインストールします。インストールできたら、左下の緑のアイコンをクリックし、「Connect to Host...」->「+ Add New SSH Host」と進み、先ほどメモしたIPアドレス ipadr と VirtualBox のユーザー名 username（デフォルトでは vboxuser）を使って次のように入力します。
```sh
ssh ${username}@${ipadr}
```
その後の SSH の構成ファイルの選択はデフォルトで基本的に問題ないはずです。そうしたら再び左下の緑のアイコンをクリックして、「Connect to Host...」から設定したIPアドレスを選択します。これで SSH リモート接続完了です。

参考：[VSCodeで仮想マシン（VM）にSSH接続しターミナルソフトとして使ってみる話](https://zenn.dev/good_engineer00/articles/2d710e20eec0ed)
【SwiftUI】アプリ内でメール画面を表示する

# はじめに
アプリ内からお問い合わせメールを送信できるアプリがあったので、どのように実装しているのか調査しました。
`MFMailComposeViewController`というものを使用しているらしいのでSwiftUIでも使えるようにラップしました。

# 実装
```swift:MailView
import MessageUI
import SwiftUI
import UIKit

struct MailView: UIViewControllerRepresentable {
    @Environment(\.presentationMode) var presentation

    var address: [String]
    var subject: String
    var body: String

    init(address: [String], subject: String, body: String) {
        self.address = address
        self.subject = subject
        self.body = body
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(presentation: presentation)
    }

    func makeUIViewController(
        context: UIViewControllerRepresentableContext<MailView>
    ) -> MFMailComposeViewController {
        let viewController = MFMailComposeViewController()
        viewController.mailComposeDelegate = context.coordinator
        viewController.setToRecipients(address)
        viewController.setSubject(subject)
        viewController.setMessageBody(body, isHTML: false)

        return viewController
    }

    func updateUIViewController(_: MFMailComposeViewController, context _: UIViewControllerRepresentableContext<MailView>) {}
}

extension MailView {
    class Coordinator: NSObject {
        @Binding var presentation: PresentationMode

        init(
            presentation: Binding<PresentationMode>
        ) {
            _presentation = presentation
        }
    }
}

extension MailView.Coordinator: MFMailComposeViewControllerDelegate {
    func mailComposeController(
        _: MFMailComposeViewController,
        didFinishWith _: MFMailComposeResult,
        error _: Error?
    ) {
        $presentation.wrappedValue.dismiss()
    }
}

extension MailView {
    static func canSendMail() -> Bool {
        MFMailComposeViewController.canSendMail()
    }
}
```

# 使い方
```swift:ContentView
import SwiftUI

struct ContentView: View {
    @State var isShowMailView = false
    var body: some View {
        Button {
            #if DEBUG
            // シュミレータでは表示できない
            #else
            if MailView.canSendMail() {
                isShowMailView = true
            } else {
                // MailViewを表示できない
            }
            #endif
        } label: {
            Text("メール")
        }
        .sheet(isPresented: $isShowMailView) {
            MailView(
                address: ["support@sample.com"],
                subject: "サンプルアプリ",
                body: "サンプルアプリです"
            )
            .edgesIgnoringSafeArea(.all)
        }
    }
}
```

:::note warn
**注意**
シュミレーターで表示しようとするとクラッシュします
:::

:::note warn
必ず`canSendMail`でチェックを行ってください
```swift
if MailView.canSendMail() {
    // MailViewを表示できる
} else {
    // MailViewを表示できない
}
```
iPhone標準のメールアプリが使用できない状態だとクラッシュします
:::


# おわり
無事実装することができました。

# 公式ドキュメント
https://developer.apple.com/documentation/messageui/mfmailcomposeviewcontroller
pandasでpivot_tableを用いて、クロス集計とかやってみた


##クロス集計とは：
項目を2つ以上掛け合わせて集計する手法。

・年齢10代、20代 回答数
・男、女、その他 回答数

このような２つの集計があったとして共通する回答数を中心とした掛け合わせた集計のこと。


これからこのcsvを使います。


```python
import pandas as pd
import numpy as np

# テストデータの生成
num_rows = 50
categories = ['cat1', 'cat2', 'cat3']
titles = ['title1', 'title2', 'title3']
comments = ['good', 'bad', 'neutral']

data = {'カテゴリ': np.random.choice(categories, num_rows),
        'タイトル': np.random.choice(titles, num_rows),
        'コメント': np.random.choice(comments, num_rows)}

df = pd.DataFrame(data)

# 集計結果の表示
print(df.groupby(['カテゴリ', 'タイトル']).agg({'コメント': 'count'}))

# CSVファイルとしてデータを出力
df.to_csv('test_data.csv', index=False)
```

```python

df = pd.read_csv("/content/sample_data/test_data.csv")
df["連続"] = df.groupby(["タイトル","カテゴリ"]).cumcount()
```
こんな感じになります。
|カテゴリ|タイトル|コメント|連続|
|---|---|---|---|
|cat2	|title3 |good   |0
|cat3	|title2	|good	|0
|cat1	|title1	|neutral	|0
|cat2	|title2	|bad	|0
|cat1	|title2	|good	|0
|cat1	|title3	|good	|0
|cat3	|title1	|neutral	|0
|cat1	|title2	|bad	|1
|cat3	|title3	|good	|0
|cat1	|title2	|good	|2
|cat1	|title3	|good	|1
|cat3	|title3	|good	|1
|cat2	|title3	|neutral	|1
|cat3	|title1	|bad	|1
|cat2	|title1	|neutral	|0

cumcountはgroupbyでまとめたデータで
コメントが同じものをカウントする。
カウントしたら、連続カラムに値を入れます。

カテゴリとタイトルをgroup化して、コメントが連続しているか数える。
その後に、クロス集計を行います。


## [タイトル、カテゴリ]と[コメント]のクロス！


```python
df = df.pivot_table(index=["タイトル","カテゴリ"],columns="番号",values="コメント",aggfunc="first")
.fillna().reset_index()

#aggfuncはデフォだとmeanが適用される。コメントは数値ではないため、mean以外を指定する必要がある？
#aggfuncで算出方法を指定する。firstやsumなどがある
```


|連続	|タイトル	|カテゴリ	|0|1|2|3|4|5|6|7|8|9|10|11|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|0	|title1	|cat1|neutral|neutral|good|	good|	neutral|	neutral|						
|1	|title1	|cat2|neutral|											
|2	|title1	|cat3|neutral|bad|good|bad|bad|bad|good|neutral|		
|3	|title2	|cat1|good|bad|good|neutral|neutral|good|neutral|bad|neutral|neutral|neutral|good|
|4	|title2	|cat2|bad|good|bad|bad|bad|						
|5	|title2	|cat3|good|good|good|neutral|bad|neutral|good|				
|6	|title3	|cat1|good|good|										
|7	|title3	|cat2|good|neutral|good|good|good|neutral|neutral|				
|8	|title3	|cat3|good|good|	

`pivot_table`が肝
このクロス集計は表index、裏がcolumns、valuesが値。

タイトルとカテゴリをグループ化して、行見出しにする。
valueに設定したのものを横並びにする
グループ化したものが複数ある場合(今回はコメント)、columnsを連続番号としIDみたいに扱う。
グループ化したものを"横一列化"した。
ChatGPTと学ぶシステムアーキテクト試験（午前2）

高度情報技術者試験まで、あと6日ですね。
というわけで、今回は最近流行りのChatGPTを高度情報技術者試験に応用するとどんな感じになるか、試してみました。

今回題材に使ってみたのは、[令和3年度のシステムアーキテクト午前2の問題](https://www.ipa.go.jp/shiken/mondai-kaiotu/gmcbt8000000d5ru-att/2021r03h_sa_am2_qs.pdf)です。

# 試しに問1を解かせてみる
![q1_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66360/aad7d5aa-ddc5-a5e3-ce96-14267b4c4377.png)

そうすると、以下の回答が出てきます。
![q1_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66360/4b38fb38-063b-2e86-1ac9-22583821a0db.png)

おーーーーっ、正解だ！

# 続いて問19を解かせてみる
![q19_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66360/66fd3f2f-9deb-84fb-11e4-13fb552e65bc.png)

ChatGPTの回答はこちら。
![q19_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66360/1787d492-0789-5e50-5491-27d5d99cd4d2.png)

正解は「イ」なので、これは外れです。
AIも間違えることはあるということか。

![q19_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66360/10f5aa77-2f28-2359-7108-557147edc0ba.png)
ちゃんと間違いを認めて謝罪するのは素直だな（笑）、と思ったら今度は向こうが問題を出してきた:open_mouth:

![q19_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66360/65059b9d-ceb6-b63e-c933-fa24df09b457.png)

とりあえず回答すると答えと解説を出してくれたけど、1回目の解説が前の問題の解説のままだ・・・

# とりあえず25問解かせてみた
![25_finished.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66360/505d1d53-05ce-dd10-50ad-fec41b659614.png)

正解数は19問。おーーーーっ、合格だ！自分はギリギリセーフの15問だったので、俺より優秀なのか:sweat_smile:っていうかしっかり勉強しろ俺。

# 超大雑把にまとめてみる
とりあえず、ITが生み出しただけあって、IT分野については普通に優秀ですね。たまに間違えることがあるのでファクトチェックは必要ですが。
ただ、分野によって得意不得意が激しいみたいなので、例えば夏目漱石の「坊ちゃん」について聞いてみたら、デタラメもいいところでした:scream:
![bocchan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66360/dcb534a7-9d90-7009-5451-88bf8c8a2245.png)
[LayoutConstraints] Unable to simultaneously satisfy constraints.〜というログがでて制約がうまいくいかない

# はじめに
Auto Layoutで制約を設定した際にでるログ「[LayoutConstraints] Unable to simultaneously satisfy constraints.」についてのメモ、備忘録です。

# エラーメッセージの意味

まず、エラーメッセージです
```
[LayoutConstraints] Unable to simultaneously satisfy constraints.
	Probably at least one of the constraints in the following list is one you don't want. 
	Try this: 
		(1) look at each constraint and try to figure out which you don't expect; 
		(2) find the code that added the unwanted constraint or constraints and fix it. 
	(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
```
#### 和訳です
```
[LayoutConstraints] 制約を同時に満たすことができません。
	おそらく、以下のリストにある制約のうち少なくとも1つは、あなたが望まないものでしょう。
	これを試してみてください： 
		(1)各制約を見て、どれが期待しないものかを突き止める； 
		(2) 不要な制約を追加したコードを見つけ、それを修正する。
	(注: 理解できないNSAutoresizingMaskLayoutConstraintsが表示された場合は、UIViewプロパティtranslatesAutoresizingMaskIntoConstraintsのドキュメントを参照してください。）

原因
このエラーが起こる原因は、主に以下の2つです。

不適切な制約が設定されている
Viewのサイズが設定されていない、または不適切なサイズになっている
```
# 解決方法

では、このエラーを解決する方法についてです

### 制約の設定を見直す
まず、制約の設定を見直して、矛盾がないか確認してみます。特に、制約の優先度が設定されている場合は、制約同士が競合することがあるので、優先度を適切に設定することが重要です。

### Viewのサイズを設定する
Viewのサイズが設定されていない場合はサイズを明示的に設定することが必要です。
具体的には、Viewに対して適切な制約を設定して、Viewのサイズを固定することが必要です。また、Viewが持つ要素（例えば、ImageViewやLabelなど）のサイズも、適切に設定する必要があります。

### translatesAutoresizingMaskIntoConstraintsをfalseにする
Auto Layoutで制約を設定する際に、UIViewのtranslatesAutoresizingMaskIntoConstraintsプロパティがtrueに設定されている場合、制約の設定が上手くいかないです。そのため、制約を設定する前にtranslatesAutoresizingMaskIntoConstraintsプロパティをfalseに設定します。

例えば、以下のように設定します。

```swift
view.translatesAutoresizingMaskIntoConstraints = false
```
# おわりに
私の場合はコードで制約をつけていてtranslatesAutoresizingMaskIntoConstraints = falseにし忘れていたが原因でした！

# 参考記事
https://wayohoo.com/article/6203
https://teratail.com/questions/46783
https://md.hatenablog.com/entry/2014/09/24/205505
IoTゲートウェイとは

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiixta.com/7_inai_)

# IoTゲートウェイとは
この記事では通常のゲートウェイとIoTゲートウェイを別のモノとして考えます。ゲートウェイの種類の1つにIoTゲートウェイがあるようなイメージですが、__IoTゲートウェイ__ と強調して呼ばれる際には次のような意味があります。

- ゲートウェイ：
異なるネットワーク間の通信を中継する仕組みの総称
- IoTゲートウェイ：
`各端末に取り付けられたセンサーやカメラからデータを取得し、取得したデータをネットワークを通してクラウドやサーバーに渡す`ための機器

# IoTゲートウェイの役割
センサーやカメラ等の情報収集機は、それ単体ではインターネットに接続するための機能を搭載しておらず、ネットワークを介してデータを送ることができません。また、もし個々の情報収集機にネットワークに接続するための機能を搭載しようとすると、コスト、重量、サイズ等様々な面で制約が生じます。そこで登場するのがIoTゲートウェイです。IoTゲートウェイを使用することで、個々のデバイスが取得したデータを収集し、送信先を振り分けてクラウドに送ることができます。そうすることで、__個々のデバイスにインターネットに接続するための機能を搭載させることなくクラウドと接続する__ ことができます。

__IoTゲートウェイをエッジコンピューティング__ として使用するという利用方法もあります。IoTゲートウェイ自体に処理機能を持たせることで、収集したデータすべてをクラウドに送信するのではなく、必要なデータのみを送信することができます。必要なデータのみを送信するため、スピード面、サーバーの容量面等様々な面でメリットがあります。

# 終わりに
前述した通り現在の技術では、センサーやカメラのような情報収集機にインターネットに接続するための機能を搭載するよりも、IoTゲートウェイを使用した方がメリットが大きいのでIoTゲートウェイを使用しています。しかし、技術の進化によって、インターネットに接続するための機能の搭載が、より安価かつ小スペースでできるようになれば、IoTゲートウェイを使用せずに個々の機器から直接クラウドにデータを送信するようになるかもしれません。

最後までお付き合いくださりありがとうございました。
【EC2】「インスタンスの接続性チェックに失敗しました」が表示されステータスチェックが失敗した場合のトラブルシューティング

# 概要
* 運用中のHPを開くと、しばらく待った後に「このサイトにアクセスできません　xxxxxxxからの応答時間が長すぎます。」と出るようになってしまいました。先日まで普通に動いていたのに...
* 今回はそんな状況になった方のために、原因と解決策を記します。

## 前提
* サーバー（AWS EC2インスタンス）
    * OS：Ubuntu 18.04.3 LTS
    * Web Server：Apache/2.4.29

# 発生したこと
* Wordpressで運用中のHPのリンクを開くと、しばらくぐるぐる待たされた後に、こんな画面に!!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/2626af76-fdb1-d4fa-0831-a8b26f35c0cb.png)

* 慌ててAWSのEC2インスタンスを見にいくと、物騒な赤字が見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/43e37652-97b8-3019-ce9d-d8f8268f09ec.png)

* 「インスタンスの接続性チェックに失敗しました」と表示されています。
* エエェ、突然なんや(°_°)

# 原因の追求へ...スクリーンショットが役に立つ
* ここ最近、ネットワーク設定やルートテーブル、インターネット接続は特にいじっていないので、問題なさそう。
* ターミナルから入ろうとしても「Operation timed out」で途絶えてしまう。。。
* ということで、まずは、公式サイトにもある通り、EC2インスタンスのシステムログを確認
    * 公式：[ステータスチェックに失敗したインスタンスのトラブルシューティング](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/TroubleshootingInstances.html#InitialSteps)
    * [アクション]、[モニタリングとトラブルシューティング]、[システムログの取得] の順に選択。最後の記録は1ヶ月くらい前だし、特に関係ないメッセージしか残っていませんでした。え、ログで出てこないってどういうこと...
* 次に、EC2のデフォルト設定である「スクリーンショット」を試してみることに。これでEC2インスタンスにアクセスできない場合でも状態を把握できます。
    * 「モニタリングとトラブルシューティング」>「インスタンスのスクリーンショットを取得」を選択。
    * 参考記事:[接続できないEC2へのトラブルシューティング記録【Windows】](https://blog.serverworks.co.jp/troubleshooting_not_connectomg_ec2)
* すると以下の画面が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/c982363b-a35c-55ec-89d8-d59cf97fa39b.png)

* あった、それっぽい原因があったぞ！
* Out of memoryとあるので、ほぼ間違いなくこやつが原因でしょう。メモリ不足が原因でアプリケーションが正常に動作できなくなったのです。
* まずは、インスタンスの再起動をします。再起動することで、一時的にメモリを解放することができるからです。
* すると、、正常にHPが表示されました！まずは、ヤッタァあーー！というところです！
* EC2インスタンスに表示されていた「インスタンスの接続性チェックに失敗しました」も消えました。

# メモリ解放は暫定的な対策。抜本的な解決策は？
* しかし、上記の対策はあくまで一時的なメモリ解放です。今後のことを考えると、月に1回再起動でしのごう！とかより、メモリの増設が適切でしょう。ということで、インスタンスタイプの変更を行います（実施する場合は一応アクセスが少ない時間帯が良いと思われます）。
* インスタンスタイプを変更する際は、まず、インスタンスを停止します。
* その後、以下画面のように、[アクション] -> [インスタンスの設定] -> [インスタンスタイプの変更]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/71df3c7f-6666-599b-e9e6-c0d39ee77a36.png)
* そして、変更したいタイプをプルダウンメニューから選択し「適用」を押します。
    * 小規模なWebサイトでも1GB程度、大規模なWebサイトの場合は2GB以上のメモリが推奨されています。まずは最小構成から始めようってことでt2microから開始したのでした。Wordpressをインストールしてから容量食ったのかもしれません。Wordpressの場合はプラグインやテーマの数にもよるみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/885cd038-2a68-31e6-d08c-b4ec51944de5.png)
* あとは、インスタンスの開始をクリックしたら、これで完了。非常に楽ですね！
* メモリの確認をする場合は、コマンドラインで`free -h`と打つと、あとどれくらい使えるのかが表示されます。

# 他に考えられる原因
* ついでに調べたので、一応以下がその他に考えられる原因です。
    * ネットワーク設定の問題（セキュリティグループやELBなど）
    * インスタンスの問題
        * ハードウェア障害（ホストの物理的な障害など）
        * ソフトウェア障害（OSやアプリケーションのクラッシュなど）
        * ストレージの問題（ストレージがいっぱい。今回はこれ）
    * ルートテーブルの問題
    * インターネット接続の問題
* ただ、大体の場合はシステムログにヒントがあるのではないでしょうか。
VB.NETでSQLを扱うための基礎（VB.NET）

# SQLサーバーへの接続の基本
![無題ggg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/5271c7e4-1ea2-3e73-5b40-6895bebb46e8.png)
（赤枠）：接続先SQLサーバーとパスワードなどを入力。
（青枠）：接続をオープン。
（黄枠）：SQL操作の実行を完了したら、接続をクローズ。もしSQL操作を完全に終了する場合は、メモリも解除。
※（青枠）と（黄枠）の間で、実行したいSQL構文を記述します。

# SQL構文の実行
## Select構文
![無題hhh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/855906a3-a807-000d-c85c-ddb6923fbc7b.png)
（赤枠）：SQL構文の記述。
（黄枠）：SQLコマンド設定。
（オレンジ枠）：戻り値の取得設定。戻り値が必要な場合、ExecuteReaderを利用して、データ取得を行う。
（青枠）：.net上でのデータテーブル準備。
（緑枠）：データテーブルにSQL上のデータを追加する処理。

## Insert構文
![無題iii.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/d47548a4-a6d1-a94e-aaa7-52eacf04fd09.png)
（赤枠）：Insert構文を記述。
（黄枠）：SQLコマンド設定。SQL上のデータを変えるときは、ExecuteNonQuery()を使う。

## DELETE構文
![無題jjj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/fd93dcd9-d8e8-b2b2-8abb-3d9722daf90d.png)
（赤枠）：DELETE構文を記述。
（黄枠）：SQLコマンド設定。SQL上のデータを変えるときは、ExecuteNonQuery()を使う。

# 注意事項
- この記事は、あくまでSQLサーバーへの接続と、各種構文の書き方の基本を説明した記事になります。「セキュリティ上の問題」「リファクタリング」と言った、ややこしい話はここでは述べていません。
- この記事は、過去、私がプライベートで管理していた情報を整理し、転載した記事です。そのため古い情報が混じっている可能性があります。
- 関連する記事の一覧は[こちら](https://qiita.com/portfoliokns3/items/7c789b7e1ba40500abbb#%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E6%89%B1%E3%81%A3%E3%81%A6%E3%81%84%E3%81%8D%E3%81%9F%E3%81%84%E4%BA%BA%E5%90%91%E3%81%91%E3%81%AE%E8%A8%98%E4%BA%8B)。
※参照先のリンクが切れている場合は、[トップページ](https://qiita.com/portfoliokns3)から確認してください。

# この記事は誰向けの記事か？
- VB.NETでSQLを扱いたいと考えている人

# 本記事における注意事項
- 本記事は、備忘録としてまとめたものになります。
- 他の方の参考になる可能性も踏まえて、一般公開も行なっております。
- また記載内容はすべて、正しい内容が記載されているとは限りません。
- 誤った内容を見つけた場合は、ご指摘をお願いいたします。
データサイエンスのための線形代数 第1回 なぜ線形代数が必要なのか

:::note info
こちらの数学教材[馬同学-線形代数](https://www.matongxue.com/courses/1/)で一通りで勉強して、紙ノートにもメモをしたが、一か月過ぎたら、何だか記憶や理解が薄くなってきていると気づきました。
Haste makes wasteなので、教材から内容の書き写すではなく、**自分の理解を整理すること**で、数学の知識を深めたいと思います。
:::

# なぜ線形代数が必要なのか

宇宙での問題が複雑し過ぎで、現在人類が解明したのがほんの一部だけです。多くの問題が理解すらできず、数学で表現、解決することがそもそも不可能です。
これら問題でほんの一部しか理解・解決できます。この解決できる問題の中で、**大部分は線形問題、また線形問題へ変換できる問題**です。
**線形代数は線形問題を解けるためのツール**です。他のツール例えば**微分積分は、複雑問題を線形問題へ変換するツール**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/2d8705bd-b051-2cda-30fb-fd8dc2cf2bc2.png)


# 複雑な世界

以下の図はPCハードウェアでの風の運動図です。各種機器の存在や気流の相互作用のため、風の運動は非常に複雑になります。ある時点や場所での風の強さや方向を計算する必要がある場合、その難しさが想像できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/cf447ac3-f259-1ec0-9acb-29c22a3f4b3c.png)

# シンプルな線形問題

複雑な世界の問題と比べて、線形問題は非常にシンプルです。簡単な線形問題の対象は、点、線、平面、そして立体といった単純な対象です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/691255e8-0e5e-6d20-b5c4-fb3448a355da.png)

例えば、2本の線の交差点を解けるなら、以下のように方程式を組んで解くことができます。

```math
\begin{equation}
\left \{
 \begin{array}{l}
 a_{11}x_{1} +  a_{12}x_{2} ＝ b_{1}(線1) \\
 a_{21}x_{1} +  a_{22}x_{2} ＝ b_{2}(線2)
 \end{array}
 \right.
 \end{equation} 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/cc5039b5-6c1c-4355-2a7f-3c7f53336fde.png)

# 複雑な問題を線形化

ある複雑な問題では、通常通りの方法では解決できず、発想を転換して問題を簡単に理解できるようにする(`複雑な問題を線形化`)必要があります。
例えば、物体が変動な力の影響を受けて曲線運動をする場合、力の大きさや方向が変化するため、位置の計算に線形方程式を使用することはできません。その場合、「**曲線に直線をフィットさせる**(`以曲代直`)」方法を採用し、曲線を多数の小さな線分に分割し、各小線分を一定方向の直線移動で近似し、最終的にすべての小線分の移動ベクトルを加算して総移動量を得ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/0420c833-0ea2-4584-cf3d-9d7d0b154515.png)

# 顔認識での線形代数

顔認識を例で線形代数の用途を簡単に説明します。顔での特徴子を算出して、三つの数字で表すことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/035d18a6-fafa-53ce-00d9-8d44ef333103.png)

例えば、上の図の男性の特徴子が(150,30,20)、この男性の他の写真をいっぱい集まって、全ての特徴子(123,35,20),(110,32,26)...を算出して、これら点は全ての右の立体での面に所属しています。(線形化)

新しい顔(下の図の女性)が、この男性顔かどうかを判断するために、新しい顔の特徴子を算出して、平面での点かどうかの判断になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/5437bf47-373e-bb04-fe04-9ae0db8c2d59.png)

平面は行列式で表すことができるので、この新しい顔の特徴子(A,B,C)と行列式の関係問題へ変換することで、顔認識を線形代数学の計算に変わります。

# まとめ

これから学ぶ線形代数は、**線形問題を解く**ツールになります。複雑な問題を線形問題に変換するのは、別の数学学科になります。(例:微分積分、確率統計学)


# 参考情報

- Markdownでの数学式の書き方

| No | 参照リンク | 
|:-----------|:------------|
| 1      | [これで完璧 Qiitaでの数式記法](https://qiita.com/DeepTama/items/85470a66972432e14224)   | 
| 2      | [Qiitaの数式チートシート](https://qiita.com/PlanetMeron/items/63ac58898541cbe81ada)   | 
| 3     | [Qiitaでの様々な数式の書き方](https://qiita.com/ttabata/items/92a4a72b042e6a2dbbad)   |