OmniAICreator/Qiita-1.07M huggingface dataset:
エンジニアの転職　世の中の素晴らしい福利厚生-今の会社は本当に一番ですか?-

# わたしの自己紹介
1社目：テストをする人　350万円
2社目：SE　430万円
3社目：AWSに関わる人　600万円

:::note info
3社目で大きく**年収**が上がりました。
:::
趣味：節約（風呂なし4万5000円、半額弁当生活）
資格：AWS SAA、TOEIC 700点オーバー

# 世の中の素晴らしい福利厚生
## いまの会社が一番というのはもう少し待ってください。
### リモートワーク
<img width="600" src="https://prcdn.freetls.fastly.net/release_image/30679/32/30679-32-46ad0ba69ca1e2250ad026f71069342a-2512x1464.png?format=jpeg&auto=webp&quality=85%2C65&width=1950&height=1350&fit=bounds">

[PRTIMES引用](https://prtimes.jp/main/html/rd/p/000000032.000030679.html "PRTIMES")

9-18時で会社に出社して仕事をするというものは**現在のトレンド**ではありません。
現在の**素晴らしい**会社は**フルリモートワークフルフレックス**にシフトしています。
1社目…ノーカウント（コロナ流行る前）
2社目…**週5出勤**
3社目…週の4日リモートワークで1日だけ出社（**ハイブリッド型**）

:::note info
わたしは週5リモートよりも無駄話とか一緒にご飯食べる時間が好きなので
週5よりも週3,4の方が好きです。
:::

年収と出勤には相関関係がある！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959011/d2dbce08-bd03-3639-585d-1645dd856d63.png)
[PRTIMES引用](https://prtimes.jp/main/html/rd/p/000000043.000045379.html "PRTIMES")

:::note warn
リモートがいいか悪いかは**議論するつもりは一切ありません**
が、少なくとも私は通勤時間を勉学やブログ更新の時間に充てることができるので重宝しています。
:::
Face to Faceの割合が多いということはすなわち現在の主流の**DXに遅れをとっている**
とイコールだと考えています。

#### リモートワークの注意点
奥様は決してあなたの**召使い**ではありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959011/0c0a07af-299c-cbcd-7f67-38d4873aaa67.png)
[PRTIMES引用](https://prtimes.jp/main/html/rd/p/000000049.000018041.html　
"PRTIMES")
上記のグラフはコロナ離婚を考えているカップルの調査です。
コロナ禍において女性が圧倒的に男性よりも**ストレス**を感じています。
「家にいるのに育児を**一切しない**」
がストレスのほとんどだそうです。

自分が空いた時間は奥様に

:::note 
・ココアやお茶を出す
・簡単な料理を作る
・送り迎えを担当する
:::
など実施されてみてはいかがでしょうか。

#### リモートワークでサボるのは悪くない
**残りの37%は嘘をついているか、超真面目くんと思っています**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959011/a965aa84-eab9-dfb2-70c0-2bca29e4e639.png)
[ITMedia引用](https://www.itmedia.co.jp/business/articles/2007/11/news027.html　
"ITmedia")
常に集中し続けることは人間には**無理**です。
スマホを見て気分転換することも
散歩をして気分転換することも
dマガジンで雑誌を見ることも
**どれも大事です**

:::note 
我々、従業員が上司から求められていることは8時間馬車馬のように働くことではありません。
**８時間分以上の成果**を求めています。
:::

### 社食
美味しいご飯がすぐに安く（福利厚生）食べることが出来る。
わたしは客先常駐を経験した時に社員とnot社員で**値段が異なる**状況に遭遇して
二度と**客先常駐はしたくない**と思いました。

:::note warn
完全に線引きをされて
わたしには人間として扱われていないように思いました。
:::

社食ドットコムという素晴らしいサイトがあるので是非ご覧ください。
[社食ドットコム](https://shashoku.com/　
"ITmedia")

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959011/829e2462-00f0-f218-306b-141197488451.png)
[ポトフ　無料（楽天）](https://news.mynavi.jp/techplus/article/20170724-rakuten/　
"楽天")

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959011/7d867a6f-eb1d-8557-4a8e-24e44818b92a.png)
[カンパチ丼　250円（楽天）](https://news.mynavi.jp/techplus/article/20170724-rakuten/　
"楽天")

:::note alert
間違っても社食が美味しそうだったのにという
転職理由はやめましょう
:::

### クラブ活動
会社がお金を出してくれて活動することが出来る。
職場で絡む機会がないおじさんやお姉様とも知り合うことができ、
仕事で話す時も休日を共にしているのですごく親しみやすいです。

:::note 
わたしは陰キャ出無精なので、こういう活動すごく嬉しいです。
:::

ダンス部やヨガ部、バスケ部やe-sport部など様々な活動がある会社もあるみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959011/e82a335e-ddc6-239a-c93e-8ccdfed37177.png)
[Microsoft クラブ活動）](https://www.microsoft.com/ja-jp/mscorp/mid-career/benefit.aspx
"クラブ活動")
【VSCode】VSCodeを手探る


# 前書き
この記事は、東京大学工学部電子情報工学科/電気電子工学科の後期実験「大規模ソフトウェアを手探る」のレポートとして作成されました。この実験では、全容が把握できないほど膨大なソフトウェアの内部を読み解き、機能拡張やバグ修正を試みます。私たちは、普段よく使うpopularなエディタであるVisual Studio Code(VSCode)を対象にしました。

# 実装した機能

今回の実験では2つの機能を実装しました。それぞれの機能については別のページで詳しく説明していますので、そちらをご参照ください。

- [機能1 : Open Definition to Side](https://qiita.com/joietaking/items/0102df8ab66c08b23a82)


- [機能2 : View Tree](https://qiita.com/Htanos/items/def67d6a27c95b3c87c2)

# ビルド方法
>使用したOSはUbuntu20.04です。

まずは、[公式のソースコード](https://github.com/microsoft/vscode)をローカルに落とします。

次に、ビルドについては基本的には公式の[How to Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute)の通りに行えばできますが、ここでは詰まったところを記しておきます。

まず、npmを
```
$ sudo apt install npm
```
でインストールすると、
```
EACCES: permission denied, access '/usr/local/lib'
```
というエラーメッセージが出たため、nvm経由で次のようにNode.jsをインストールしました。ここで、nvmもしくはNode.jsのバージョンが古いと後にエラーが起きたため、最新のものをインストールします。
```
# nvmをインストール
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
# nvmが正常にインストールされていることを確認
$ command -v nvm

# 最新バージョンをインストール
$ nvm install -lts

# nvmのversion 0.35.3
# nodejsのversion v16.18.0
```
次に、nvmを用いてyarnをインストールします。
```
$ nvm use　v16.18.0
$ npm install -g yarn
```
これで、ビルドに必要な道具はすべて揃えました。最後に、作業するディレクトリに移り、次のようにビルドコマンドを打ち込むとビルドできます。
```
# build
$ cd 2022-06-vscode
$ yarn

# run VSCode on ubuntu
$ ./scripts/code.sh
```

# 感想
- 今回、大規模ソフトウェアを手探るという実験を通してVSCodeという世界的にpopularなオープンソースプロジェクトに関わったことは非常に貴重な経験でした。はじめは膨大な量のファイル、コードに圧倒されましたが、根気強く手探っていくことで少しずつコードの意味を理解していくことができました。全容が把握できないほど大きなソフトウェアを探り、理解する中で、多くの学びと根性が身についたように思います。([jiang](https://github.com/jiang222kt))

- VSCodeの実装を読むことで、MVCへの理解が少し深まったとともに、今まで使ったことがなかった機能にふれることができ、とても有意義な実験にすることができました。
しかし、VSCodeのソースコードが膨大過ぎて深いところまで理解することができなかったことは残念なので、ぜひ自主的にVSCodeのソースコードを読んでみようと思えました。([tanomitsu2002](https://github.com/tanomitsu2002))
[React×TypeScript]型 'xxx | undefined' を型 'xxx' に割り当てることはできません

React.js×TypeScriptでの実装中に、`型 'xxx | undefined' を型 'xxx' に割り当てることはできません。`というエラーにぶち当たった。

これは、undefinedを制限し、安全な型を子コンポーネントに渡すことで解決できる。

# 起きたエラー

例えば以下のような構成で`Parent.tsx`から`Child.tsx`にPropsで値を渡す場合を考える。

```
.
├── Parent.tsx
└── Child.tsx
```


```react:Parent.tsx
import { useEffect, useState } from 'react';
import Child from './Child';

export type User = {
  name: string;
  age: number;
  birthplace: string;
};

const Parent = () => {
  const [inputUser, setInputUser] = useState<User>();
  return (
    <>
      <div>{/* 入力フォーム(ここでsetInputUserするイメージ) */}</div>
      <Child user={inputUser}></Child>
    </>
  );
};

export default Parent;

```

```react:Child.tsx
import { User } from './Parent';

type Props = {
  user: User;
};

const Child = ({ user }: Props) => {
  return (
    <>
      <div>{user.name} </div>
      <div>{user.age} </div>
      <div>{user.birthplace} </div>
    </>
  );
};

export default Child;
```

`Parent.tsx`で定義した型Userを`Child.tsx`でもimportし、Propsの型として利用しているが、`Parent.tsx`のuseStateで管理しているしている`inputUser`はundefindになりうるため、`Parent.tsx`から`Child.tsx`へデータを渡そうとしている箇所で型エラーとなる。

- VSCodeでのエラーメッセージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1481264/b2307c7d-6010-57c2-a820-3aedb4b949a7.png)

エラーメッセージには`型 'User | undefined' を型 'User' に割り当てることはできません。`と表示される。

# 解決策

論理 && 演算子を利用することで、`<Child>`には、undefinedではないデータ`inputUser`を渡すことができる。

```react:Parent.tsx
return (
    <>
      <div>{/* インプットフォーム */}</div>
      {inputUser && <Child user={inputUser}></Child>}
    </>
  );
```

- VSCodeでも見てもundefinedのユニオンが消えている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1481264/4f790212-0034-8630-86de-48e2daf3cbe7.png)
【DevContainers】Featureの使い方

## 使用方法

`.devcontainer/devcontainer.json`に`features`を設定することで使用できます。  
以下のように使用するfeatureを指定します。  

```json:.devcontainer/devcontainer.json
"features": {
  "ghcr.io/user/repo/go": {},
  "ghcr.io/user/repo1/go:1": {},
  "ghcr.io/user/repo2/go:latest": {},
  "https://github.com/user/repo/releases/devcontainer-feature-go.tgz": { 
        "optionA": "value" 
  },
  "./myGoFeature": { 
        "optionA": true,
        "optionB": "hello",
        "version" : "1.0.0"
  }
}
```

featureによって設定できるオプションに違いがあります。  
[devcontainers/features](https://github.com/devcontainers/features)で管理されているものはそれぞれのディレクトリ内で確認できます。

https://github.com/devcontainers/features/tree/main/src
macOS Ventura で FreeFEM を build するときの留意点

MacBook Air M1 (macOS Ventura) にて FreeFEM Ver. 4.10 をソースコードから build する際のメモ．
基本的には以下のURLに従えば build できるけれど，何点か留意点あり．

https://doc.freefem.org/introduction/installation.html

1. gsl はソースからではなく`brew install gsl` した．
2. gfortran-11 の代わりに gfortran-12 を使う．
```
./configure --enable-download -enable-optim CC=clang CXX=clang++ F77=gfortran-12
    FC=gfortran-12 --prefix=/where/you/want/to/have/files/installed
```
3. PETSc/SLEPc の build は省略．
4. make install すると /usr/local/bin に書き込みを行おうとするので，`make install DESTDIR=<PATH>`
5. $DESTDIR/bin/ffglut にパスを通しておく．
【QGIS】JAXA Earth APIプラグインを使って衛星データを表示する

## はじめに
この記事は#30DayMapChallenge2022 9日目の記事です。
テーマはSpaceです。
QGISを使ってJAXAの衛星データを地図上に表示してみます。

![image](https://raw.githubusercontent.com/tjukanovt/30DayMapChallenge/main/images/flyers/30dmc-2022.png)

https://30daymapchallenge.com/

## QGISとは
フリーでオープンソースの地理情報システム
ほとんどのUnixプラットフォーム、Windows、macOS上で動作する

## 事前準備

既にインストール済みのQGIS（バージョン3.22.3）を使います。
QGISを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/13c801a9-4ba2-7996-cb45-16f32c999cd1.png)


### JAXA Earth API Pluginインストール
JAXAの衛星データをQGISで表示することができる「JAXA Earth API Plugin」を利用します。
上のメニューバーの「プラグイン」から、「プラグインの管理とインストール」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/9a96bf75-332b-8142-89c0-a6f3e59e89c0.png)

JAXA Earth API Pluginを検索し、「インストール」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/497f1fba-950e-3187-e23c-ba39c25650dc.png)


インストールが完了すると、画面上にJAXA Earth API Pluginが表示されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/9e4fd832-8a03-13c0-b4b9-194a25044d42.png)

## データ表示
Select Datasetから利用したいデータを選び、Loadをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/6bdf51cb-6155-58f7-847a-23a65323a163.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/1dd79a22-6337-7aa7-c9e8-fe82b7b7ce17.png)

表示されました！
数回クリックするだけで衛星データを地図上に表示できるのはすごいですね(^o^)丿

MIERUNEさんの公式Youtubeでは使い方を詳しく紹介しています。

<iframe width="1280" height="720" src="https://www.youtube.com/embed/t4yX5mC21n0" title="QGISオンラインセミナー　JAXA APIを使ってみよう" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 参考文献
https://www.mierune.co.jp/news/posts/ba7ffdzh0?lang=ja

https://plugins.qgis.org/plugins/qgis-jaxa-earth-plugin-master/
『サイバーセキュリティプログラミング第2版』の読書メモ (1)

『サイバーセキュリティプログラミング第2版』の読書メモを少しずつ記していきたい。

https://www.oreilly.co.jp/books/9784873119731/

# 3.1 UDP を用いたホスト発見ツール

ホスト発見に使用する仕組みについて。
![fig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960096/ae389b80-1bad-9cc3-acfd-b81cbe1ff3bd.png)
UDPパケットを送信先ホストの宛先ポートXに送信した際に、送信先でポートXが閉じていると ICMP パケットを送信してくる。

このとき ICMP ヘッダに設定されるコードとタイプの値は以下のように定義され、送信元に対して UDP のポートXが閉じていることを伝えてくれる。

```
CODE=3: Destination unreachable (宛先到達不能)
TYPE=3: Port unreachable (ポート到達不能)
```

もしも送信先ホストのポートXで UDP を受け付けるサービスが動作していると上記の ICMP パケットは送信されない。

…という仕組みを逆手にとり、**送信先ホストの UDP パケットを送信して上記のようなコード・タイプの ICMP パケットが返ってくるかどうかを観察すれば、送信先が存在しているかを判定することができる**。これがこの章で解説される「ホスト発見ツール」のポイントである。

ただし、**ここで忘れてはならないのはサービスで使われないようなポートを選んでやること**である。ウェルノウンポートのようなサービスでよく使われるポート番号を使ってしまうと送信先ホストが存在するのかどうか判定するのが困難となる。

サンプルコードでは "65212" という通常はシステムで動的かつ一時的にしか使用されないポート（エフェメラルポート）を使用している。（P62 の udp_sender 関数を参照のこと）
外部サーバからAppSyncにcurlコマンドでリクエストを送る（APIキー）

# 概要
  この記事では、AppSync を外部サーバから叩く際の curlコマンド例を紹介します。

# 前提条件
  - AppSync が用意されていること
  - AppSync にカスタムドメインが紐づけられていること

# コマンド例
## Query
### コマンド
```shell
curl -s "https://<カスタムドメイン>/graphql" \
-H "Content-Type: application/graphql" \ 
-H "x-api-key: <APIキー>" \ 
-d '{ "query": "query MyQuery { getData(id: "id1") { column } }" }'
```

### 設定値の説明
  - MyQuery：クエリの名称。自由に設定可。
  - getData：AppSyncで設定しているクエリの名称。
  - id：取得したいデータの主キーの名称。
  - id1：取得したいデータの主キーの値。
  - column：取得したいデータのカラム名。

### AWS CloudShell の場合
  - CloudShell を使用する場合は、クエリ内のダブルクォーテーションの前に「\」をつける必要があります。
```shell
$ curl -s "https://<カスタムドメイン>/graphql" \
-H "Content-Type: application/graphql" \ 
-H "x-api-key: <APIキー>" \ 
-d '{ "query": "query MyQuery { getData(id: \"id1\") { column } }" }'
```

## Mutation
### コマンド
```shell
$ curl -s "https://<カスタムドメイン>/graphql" \
-H "Content-Type: application/graphql" \ 
-H "x-api-key: <APIキー>" \ 
-d '{ "query":"mutation MyMutation($input1: CreateDataInput!) 
{ createData(input: $input1) { id column } }", 
"variables": { "input1": { "id": "id1", "column": "data" } } }'
```

### 設定値の説明
  - MyMutation：ミューテーションの名称。自由に設定可。
  - CreateDataInput：AppSyncで設定しているミューテーションの名称。
  - createData：AppSyncで設定しているミューテーションの名称。
  - id：登録したいデータの主キーの名称。
  - id1：登録したいデータの主キーの値。
  - column：登録したいデータのカラム名。
  - data：登録したいデータの値。
  
  下から2行目の``{ id column }``は戻り値です。ほしい値を設定してください。

# おわりに
  自身が試したいと思ったときに Query の例は見つけられても Mutation の例が見つからなかったので今回記事を書きました。

  ```shell
  -d '{ "query": " <ここ> " }'
  ```
  「ここ」と記載した箇所は、基本的に AppSync のコンソール画面の「クエリ」と同じですので、画面上でクエリを作成してから「ここ」の箇所にペーストしてお使いいただければ楽だと思います。
ページネーションレイアウト

## 初めに
前回はページネーションの実装について投稿しましたが今回はレイアウトについて投稿していきます。
すでに'kaminari'をGemfileに入れている方は　新たに'bootstrap4-kaminari-views'を入れてviewページの記述の所を見て貰って構いません。
まだ、'kaminari'をGemfileに入れていない場合は上から順にやって頂けたら幸いです。

## Gemfile
まずGemfileに
```
gem 'kaminari','~> 1.2.1'
```
 ```
gem 'bootstrap4-kaminari-views'
 ```
上記の記述を入れてあげます。
記述をしたら忘れずに

```
bundle install
 ```
をしましょう。
bundle installをしたら次にkaminariの設定ファイルを作成する為に下記のコマンドをターミナルに打ち込みます。
```
$ rails g kaminari:config
```
最後に、kaminariが利用するテンプレートを作成してあげます。
```
$ rails g kaminari:views default
```
これで準備は完了です。


## 次にControllerに記述
例としてindexで記述しています。
```app/controllers/books_controller.rb
def index
  @books = Book.page(params[:page]).per(9)
end
```
上記のようにpage(params[:page]).per(9)を付け足してあげます。
補足でper(9)は何を意味しているかと言うと、per(1ページで表示したい件数)と言うことになります。
自分自身で表示したい件数を決めて頂けたら結構です。

## 次にViewに記述
```app/views/books/index.html.erb
〜省略〜
      <% if book.image.attached? %>
        <%= image_tag book.image, size:"200x120" %>
      <% end %>
  　　　　　　　　　　　<%= book.title %>
　　　　　　　　　　　</div>
    　<%= paginate @books, theme: 'twitter-bootstrap-4' %>
   </div>
```
上記のように表示させたいviewの所に<%= paginate @books, theme: 'twitter-bootstrap-4' %>を入れてあげる事により下記の写真のようにレイアウトが出来ると思います。
日本語設定については別途に投稿してあるので是非参考にしてみて下さい。

![スクリーンショット 2022-11-09 22.16.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952785/a1a76205-0b6a-9044-eb7e-e29067d50832.png)
ラストのまほう　第22話『他のゲームをみてみる』

いまさらですが、WASM-4ではどんな表現ができるのか、他の人はどんなゲームを作っているのか、他のWASM-4製ゲームを調査してみたいと思います。WASM-4製ゲームの多くは、公式サイトのこのページに掲載されています。ちなみにプルリクエストを送れば自分のゲームをこのコレクションに入れてくれるそうです。


https://wasm4.org/play

ここでは、主にプラットフォーマー系ゲーム、アクションゲームの類を主に見ていきたいと思います。そのほかにも私が気になったゲームも見てみます。

## antcopter

https://wasm4.org/play/antcopter

頭のプロペラで少し飛ぶことができるアリ（？）くんを操作するプラットフォーマー。ゲームとしての完成度が高いです。


## spunky

https://wasm4.org/play/spunky

コインを集めてゴールへ。カメラの位置が固定で画面端にくると次の画面に切り替わるタイプではなく、プレイヤーキャラクターが中心に来るように連続的にスクロールするタイプ。

## wired

https://wasm4.org/play/wired

垂れ下がったヒモを別のところにつなげたりできる、パズル要素の強いプラットフォーマー。面白そうなんですが、最初のところの仕掛けからすでによくわからなくて私は先に進むことができてないです。

## strikeforce

https://wasm4.org/play/strikeforce

ボタンで弾を発射できる。ロックマンっぽい？青と黄色を使っていてゲームボーイっぽくない配色で画面が見やすいです。

## Hammer Joe

https://wasm4.org/play/hammer-joe/

これたぶん元ネタはマリオブラザーズの対戦のやつだ！　白、緑、茶色をうまく使っていて色使いがきれい。

## Platformer Test

https://wasm4.org/play/platformer-test/

WASM-4作者のブルーノ兄貴が作ったプラットフォーマーのサンプル。


# Maze

https://wasm4.org/play/maze

３D迷路を歩き回れます。4色しか使えないのに、ディザリングで濃淡を表現して、テクスチャやフォグ表現まで実装されていますね。すごい。

# Pocket Dust

https://wasm4.org/play/pocket-dust

いわゆるセルオートマトンで粉や液体の振る舞いをシミュレーションするやつ。有名どころだと「粉遊び」とか、Noitaもこのセルオートマトンを応用したゲームですね。

# The Legend of GEML: Awakening

https://wasm4.org/play/the-legend-of-geml-awakening

ゼルダのような見下ろし型のゲーム。ドット絵がふんだんに使われています。

# 言語の統計

ところで、WASM-4はさまざまな言語でゲーム開発ができるわけですが、ゲームジャムでどの言語を使ったかというアンケートの結果がこのページに載っています。

https://wasm4.org/blog/jam-2-results/

一番人気は Zig で、それに AssemblyScript　や Rust が続くという感じのようです。Zigが使いやすいようなので、Zigも気になりますね。


# 次回予告

ゲームはひとりで遊ぶのもいいですが、他のプレイヤーとの交流的な要素があると盛り上がったりするんですよね。直接対戦とはいかずとも、スコアラインキングで競えるみたいな仕組みができないか試行錯誤してみます。

https://qiita.com/hiruberuto/private/fb75ded8a73a9451d628
CO2センサ SCD41  を ESP32 で動作確認

CO2センサ SCD41 のモジュールを Taobao で入手しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d91068be-3bfb-fe43-9682-beba2507c581.png)

ESP32 を使って動作確認をしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/78eb5dc6-df15-da3e-015e-217ad9e48be0.png)

# 環境

- Arduino 1.8.19 portable 化済
- Linux Ubuntu 22.04 LTS Desktop Ja



# 接続
GND,VCC,SDA,SCLをそれぞれ接続しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d0677de2-9b46-3e93-1e61-6d64d37483c2.png)

# ライブラリインストール

今回は Sensirion 公式のライブラリを使いました。

Sensirion I2C SCD4x をライブラリマネージャからインストールします。依存している Sensirion Core もインストールされます。

# サンプルプログラム

「ファイル」-「スケッチ例」-「カスタムライブラリのスケッチ例」-「Sensirion I2C SCD4x」-「exampleUsage」
を使います。

実行。

```
Serial: 0x9C6EB7073BFF
Waiting for first measurement... (5 sec)
Co2:929	Temperature:27.97	Humidity:44.34
Co2:905	Temperature:28.02	Humidity:44.84
Co2:902	Temperature:27.99	Humidity:45.40
Co2:905	Temperature:27.90	Humidity:45.94
Co2:906	Temperature:27.84	Humidity:46.42

```

測定できました。

https://sensirion.com/jp/products/product-catalog/SCD41/SCD42
名前衝突 とは

## 勉強前イメージ

ドメイン的な話？
ドメイン名が被っちゃう的な？

## 調査

### 名前衝突 とは

Name Collision ともいわれており、組織内のネットワークで利用してるドメイン名とDNSで利用しているドメイン名が衝突してしまうことを指します。
内部に閉じたネットワークだと既存のドメインと被らない形で、社内のサーバや機器などにホスト名やドメイン名をつけることが多くありました。
しかし、 [新gTLD](https://qiita.com/miyuki_samitani/items/d2a6224728535bde3df4) で新しく1000以上のドメインが使われるようになりました。
そのため新gTLDが導入される前から使われていたドメイン名が新gTLDと被ってしまうことが発生すると
DNSの名前解決が変わってしまったり、通信ができなくなってしまったりすることが可能性としてあります。
セキュリティ的にも意図せず外部へ通信が行われたりして情報漏洩が発生してしまうことも想定されます。

新gTLD とは初めて2000年に新gTLDが募集されて以降、2003年・・2012年1月から5月末にかけて実施され、受理されたものが 新gTLD です。

## 勉強後イメージ

ドメイン同士が衝突するわけじゃなくて
ドメインと内部ドメインが衝突するのね。

## 参考

- [名前衝突(Name Collision)とは](https://www.nic.ad.jp/ja/basics/terms/name-collision.html)
- [名前衝突問題 (Name Collision)](https://www.jpcert.or.jp/tips/2014/wr142201.html)
底辺から paiza のスキルチェックで A 問題を突破するまで。

日々頑張っているが自分の壁を突破できなくて苦しんでいる方々、
分かります、心中察します。

底辺自慢では、私も負けません(笑)。
私のスペックですが、こんな感じです。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/b987a400-cb36-117d-01d4-36c38dc58b44.png)
去年から atcoder はタイムアタック方式での腕試しは、一旦置いておくことにしました。

理由はシンプル、**"挫折した"** から(笑)。
だけどコードに向き合うのは嫌いじゃないので
記事をポロポロ書いてました。

そんな時に一冊の本に出合いました,[**コチラ**](https://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E7%9A%84%E6%80%9D%E8%80%83%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F%EF%BC%81-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88AtCoder%E5%85%A5%E9%96%80-%E5%A4%A7%E6%A7%BB-%E5%85%BC%E8%B3%87-ebook/dp/B0B6MLQ43C/ref=sr_1_2_sspa?crid=2QFYSRBCBTWR6&keywords=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E7%9A%84%E6%80%9D%E8%80%83%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88atcoder%E5%85%A5%E9%96%80&qid=1667996605&qu=eyJxc2MiOiIwLjczIiwicXNhIjoiMC43NSIsInFzcCI6IjAuNTkifQ%3D%3D&sprefix=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E7%9A%84%2Caps%2C155&sr=8-2-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFTWjBSNjJMTTIwS1cmZW5jcnlwdGVkSWQ9QTA5ODA0Mzc0WlU2UUZMNk9IWFUmZW5jcnlwdGVkQWRJZD1BM0lRTDcwMVNYTEZLMSZ3aWRnZXROYW1lPXNwX2F0ZiZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU=)です。

少しずつ、読みながら、読んだ内容を頭で転がしながら
疑ってみたり、自分なら どのようにアプローチするか考えなおしたり、
日々考えていると、変化が出てきました。

**時間を掛ければ** 書籍の章末問題の C 問題, D 問題
が少しずつ解けるようになったのです。
no hint で解けたときは思わず叫びます(笑)。

早解きは素晴らしいですし、憧れますが、
まずは時間にとらわれず、じっくり問題と自分に向き合い、
一歩ずつ積み上げる事の方が大事であることが分かりました。

やはり、息長く続ける事が秘訣なのですが、
私なりの長く続ける極意は **完璧を求めない** 事にあると思います。
出来なくても良い、明日また頑張ろう。

でもなぜ今できないのか、何が足りないのか、
自問自答は、自分が潰れない範囲で必要だと思います。

"悩んで、調べて、絵をかいても分からない。。"
"んー、ま いっか(笑)"
"よく寝て、明日またやろう"

#

最初は例題のみを中級編まで読破、最初は何を言ってるか分からなくても OK.
日々、考える習慣があると、そのうち例題が自力で解けるようになります。

アルゴリズムが板についてきたら章末問題を 2 , 3問、挑戦します。
次の周では、 1 問でも良いので多く章末問題を解く。
良いのです、少しずつで。

慣れてきたら上級編の例題にも
手を伸ばしましょう。

ある程度の所まで行くと、atcoder 以外で力を試したくなります。
私は paiza に挑戦し、 A 問題が運よく解けました。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/4e96ab3a-c0f4-1fb6-1de9-b5a9fa235482.png)
書籍は、冒頭に紹介したモノに限らず、
自分に合うものでも良いと思います。

ポイントは自分と問題に向き合い続ける事です。

因みに、どのように私が Atcoder の問題と向かっているかは
過去の自分の記事を見て頂き、参考としてください。

冒頭の書籍に出会ったのは今年の 8 月。
日々 向き合ってハヤ 3 カ月で paiza に挑戦!!。
自分は、この短期間で少し変われたと思います。

毎日、少しずつ一緒に成長しましょう!!!
#

因みに有識者による paiza のスキルチェックに関する考察は、既に数多くあります。

https://sugaryo1224.hatenablog.com/entry/2017/07/31/235622

https://lanlib.com/2021/04/04/%E5%B0%B1%E6%B4%BB%E3%81%AE%E8%A9%B1%E3%81%A8paiza%E3%81%AEs%E3%83%A9%E3%83%B3%E3%82%AF%E3%81%8C%E5%85%A8%E3%81%8F%E6%84%8F%E5%91%B3%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%84%E3%81%86/

Negative な意見もあるとは思いますが、
今の自分を超えたのであれば素直に喜んで良いと思います。
十分に満喫したら、冷静になりましょう。
如何なる状況でも現在地は通過点なのですから。

失敗しても自分を責めない。
むしろ、労ってはどうでしょうか。

"よくぞ挑戦した!, 今日はもう十分! また明日頑張ろう!!"

本記事が少しでも 苦しみ、悩んでいる人の心の癒しになれば幸いです。
VBAで緯度経度から距離を計算する。

# はじめに
　緯度経度をもとに２点間の距離（※メートル）を求めるものです。
　今回紹介するものは、以下の要素で計算しています。
　・GRS80（長半径：6378136.6、扁平率：1/298.257222101）
　・Lambert_Andoyerの公式

```vb
Option Explicit

Global Const a As Double = 6378136.6 ' 長半径
Global Const f As Double = 1 / 298.257222101 ' 扁平率

'//////////////////////////////////////////////////////////////////////////////////
'// ArcCos計算用関数                                                             //
'////////////////////////////////////////////////////////////////////////////////// 
Function arcCos(x As Double)
  If x <= -1 Then
    arcCos = 4 * Atn(1)
  ElseIf x >= 1 Then
    arcCos = 0
  Else
    arcCos = Atn(-x / Sqr(-x * x + 1)) + 2 * Atn(1)
  End If
End Function

'//////////////////////////////////////////////////////////////////////////////////
'//　距離計算関数　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　  //
'////////////////////////////////////////////////////////////////////////////////// 
Function Lambert_Andoyer(t1 As Double, g1 As Double, t2 As Double, g2 As Double)
  Dim U1, U2
  Dim x As Double, dP As Double
  
  If t1 - t2 = 0 And g1 - g2 = 0 Then
     Lambert_Andoyer = 0
  Else
     t1 = t1 * 4 * Atn(1) / 180
     t2 = t2 * 4 * Atn(1) / 180
     g1 = g1 * 4 * Atn(1) / 180
     g2 = g2 * 4 * Atn(1) / 180
  
     U1 = Atn((1 - f) * Tan(t1))
     U2 = Atn((1 - f) * Tan(t2))
     x = arcCos(Sin(U1) * Sin(U2) + Cos(U1) * Cos(U2) * Cos(g1 - g2))
     if x = 0 then
        Lambert_Andoyer = 0
     else
        dP = f / 8 * ((Sin(x) - x) * (Sin(U1) + Sin(U2)) ^ 2 / Cos(x / 2) ^ 2 - (Sin(x) + x) * (Sin(U1) - Sin(U2)) ^ 2 / Sin(x / 2) ^ 2)
        Lambert_Andoyer = a * (x + dP)
     end
  End If
End Function
```
#
計算する場合、以下のようにデータを渡す
Lambert_Andoyer(緯度１,経度１, 緯度２, 経度２)
※引数は10進数で渡す必要があります。
　351236N→ 35.21
　351236S→-35.21
　1351236E→ 135.21
　1351236W→-135.21
```vb
Sub test()
    MsgBox (Lambert_Andoyer(35, 135, 35, 136) & "m")
End Sub
```


# さいごに
国土地理院での計測値は下図の通り。
VBAでの計算値は91287.7827298676mなので、6mm程度の誤差があった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394814/60bbf05b-3acd-63bc-6f62-b639b8c32f8e.png)


# 参　考
地図投影法――地理空間情報の技法　著者：政春　尋志（国土地理院基本図情報部長）
【js-yaml】カスタムタグを追加する【Node.js】


## 最初に
yamlファイルでカスタムタグを使用している場合は、loadする際にその型情報を定義しないとエラーになります。
- カスタムタグを使ったyamlの例
```
'---\n test: !NewCustomType\n'
```
- エラー例: 
```
"errorMessage":"YAMLException: unknown tag !<NewCustomType>
```

定義のしかたを知ったのでメモしておきます。

**🌱 環境**
- node: `v16.17.0`
- js-yaml: `4.1.0`



## 結論
定義するにはshcemaというオプションに型情報を渡せばよさそうです。
```js
const yaml = require('js-yaml')
const customType = new yaml.Type(
  '!NewCustomType',  // ここに使用するカスタムタグ名を定義
  { kind: 'mapping' }
)
const customSchema = yaml.DEFAULT_SCHEMA.extend([customType])
yaml.load('path/to/yamlfile', {schema: customSchema}) // ここで定義したschemaオプションをつける
```

**補足**
stackoverflowなどでschemaの設定方法を探すと`DEFAULT_SCHEMA.extend()`ではなく`yaml.Schema.create()`を使っているものが出てきますが、Schema.create()はもう使用できないみたいでした。
参考: [TypeError: yaml.Schema.create is not a function](https://stackoverflow.com/questions/72436041/typeerror-yaml-schema-create-is-not-a-function)

## 参考
参考にさせていただきました
- [js-yaml](https://github.com/nodeca/js-yaml)
- [js-yaml issue - Custom tag definition in schema config does not work #520](https://github.com/nodeca/js-yaml/issues/520)


以上
AWSソリューションアーキテクトアソシエイト忘備録(暫定11月分)

目的として
AWSソリューションアーキテクトアソシエイトの資格取得のため、また、知識を蓄えて案件参画時に活かせるようにしたい！！
ということで、いつでも見返せるように以下にまとめる(量が多いため検索して該当の部分を参照できることをひとまず目的とする)



# 複数リージョンのS3バケット上にデータを保持し、それらのデータをバージョン管理するためのソリューション
　⇒複数のリージョンでバージョン管理を行うS3バケットをそれぞれ作成してリージョン間のレプリケーションを有効にする



# 人為的なミスが原因でファイルを削除してしまった場合にどのような方法で復旧するかのソリューション
　⇒S3には過去の履歴を保持しておくバージョニング機能があるため有効にしておくことにより古いバージョンのファイルも復元可能であり最適解となる


# オンプレミスシステムからクラウドシステムへのデータバックアップに関するソリューション
　⇒StorageGatewayのファイルゲートウェイの利用によりオンプレミス環境にソフトウェアアプライアンスという形でVMを導入することでNFSやSMBプロトコルを使ってS3ストレージをマウント可能
　⇒オンプレミス環境のVMにデータをキャッシュするため低レイテンシーでのデータアクセス実現


# 目標復旧時間が３時間、目標復旧時点は24時間である最も低コストで実現可能なアーキテクチャの選択
　①日次でRDSのスナップショットを作成しバックアップリージョンでも起動可能にしておく
　②Route53を利用してリージョン間でAPIのエンドポイントをフェイルオーバーする
　　⇒①②を組み合わせることにより最適解となる


# 大量のデータに対して定期的なアクセスが発生し、データは複数のＥＣ２インスタンスからアクセスされる場合のソリューション
　⇒複数のEC2インスタンス上でマウントすることで共有ファイルシステムとして利用できるEFSが最適解


# 利用者のクリックをトリガーにストリーミングデータを準リアルタイムに分析し、データ分析のバッチ処理を最低限の開発及び運用不可で実行するソリューション
　①Lambda利用によりユーザのクリックをトリガーバッチ処理実行可能
　②準リアルタイムのストリーミングデータ解析にはKinesisDataFirehouseが最適
　　⇒①②を組み合わせることにより最適解となる



# 毎月決まったタイミングにリソースが不足してアプリケーションの性能が低下の恐れがあるパターンにおいての特定のタイミングで高パフォーマンスを実現できるように拡張可能なソリューション
　⇒スケジュールに基づいて拡張するようにEC2 Auto Scailingのスケーリングポリシーを設定することによりCPU使用率が100％に達する前に対処可能であり最適解となる


# 大量のデータに対して定期的なアクセスが発生し、データは複数のＥＣ２インスタンスからアクセスされる場合のソリューション
　⇒複数のEC2インスタンス上でマウントすることで共有ファイルシステムとして利用できるEFSが最適解


# 利用者のクリックをトリガーにストリーミングデータを準リアルタイムに分析し、データ分析のバッチ処理を最低限の開発及び運用不可で実行するソリューション
　①Lambda利用によりユーザのクリックをトリガーバッチ処理実行可能
　②準リアルタイムのストリーミングデータ解析にはKinesisDataFirehouseが最適
　　⇒①②を組み合わせることにより最適解となる


# 毎月決まったタイミングにリソースが不足してアプリケーションの性能が低下の恐れがあるパターンにおいての特定のタイミングで高パフォーマンスを実現できるように拡張可能なソリューション
　⇒スケジュールに基づいて拡張するようにEC2 Auto Scailingのスケーリングポリシーを設定することによりCPU使用率が100％に達する前に対処可能であり最適解となる


# Key-Value型のデータベースを使用した突発的なスパイク処理が発生するトランザクションに対応可能なソリューション選択
　① Key-Value型のデータベースであるNoSQLのDynamoDBが適する
　②スパイク負荷に最も素早く対応するのはLambda(Fargate、EC2AutoScailingよりも優れる)が適している
　　⇒①②を満たすことにより最適解となる



# アプリケーション層の処理がボトルネックとなっているソリューション
　⇒リソースが十分かどうかをSQSキューの長さを見て判断してSQS内のメッセージを遅延なく処理できるようにアプリケーション層のEC2をスケーリングすることが最適解となる


# 複数のインスタンスからアクセス可能かつ、高解像度のRAWファイル(向か光の画像データであり比較的ファイルサイズが大きい)を取り扱うために大容量のデータに対して高速処理を実現できるソリューション
　①FSx for Lustreはスケーラブルかつ複数インスタンスからアクセス可能な高速なストレージを提供するフルマネージド型サービスであるため最適解となる
　②FSx for LustreはEFSより処理速度面で優れる
　　⇒①、②よりFSx for Lustreの利用が最適解となる



# ピーク時のI/Oが1000IOPSのパフォーマンスを満たし、かつ最も低コストなストレージ選択
　⇒EBS汎用SSD(gp2)はボリュームサイズによってベースラインのIOPSが決まるため最適解となる


# 大容量のファイルに対して低レイテンシで高速かつ同時に複数のEC2インスタンスからアクセス可能なアーキテクチャで移動コストを抑制できるパフォーマンスの高いストレージ選択
　⇒EFSは分散型のストレージで複数のEC2から同時にアクセスすることにより全体のスループットを高められ、低レイテンシを実現するため最適解となる



・
・
・
1週間毎を目安に随時更新していきます！
Web3の世の中の誤解について

今日は、Web3の話題を上げたいと思います。

ネット上では、Web3について沢山の人がNoteや記事とかで書かれてるので皆さんも目にした事とか、読んだことがあるかと思います。
初めて聞いたという人は、スグWebについてググって読んでみてください。自分なりに簡単そうな記事で問題ないです。

* Web3の基本的な流れは、中央集権から分散管理へ
    * ・Web1.0：1989-2005年（ホームページの時代）
        * →アップされた記事を読み形のReadメインの時代
    * ・Web2.0：2005－現在（SNS・クラウド時代）
        * →SNSなどにより読むだけでなく、様々な人が気軽に発信する、双方向性の時代
    * ・Web3：現在～　（ブロックチェーンの時代）
        * →Web2.0では、GAFAMなどの中央集権的な状態から、誰もデータを保有しない、データ自体は、個々人が管理する時代

という定義です。

Web3とは、ブロックチェーンの概念の登場により、情報をセキュアに個々人で管理する事ができる仕組み。そして、ブロックチェーンでよく言われるDecentralized(分散型）の世界を指します。

最近では、NFT使った仕組みもWeb3と言われてます。

**今日、僕が伝えたかったのは沢山の人達がWeb3を間違って認識してるという事です。更に怖いのはネットで著名な人とか著名なCTOとかも含めて沢山の人たちが間違って認識しているという事。**

何が間違っているかと言うと、ブロックチェーンを構築する時には、Decentralizedが**マスト**という事を忘れてしまってるという事です。
**ブロックチェーンは、オープン化してないと意味がありません。**
オープン化してないとDecentralizedされません。
何故かというとオープン化して第3者が自由にデータを呼び出したり、更新したり、セキュリティレベルを変更できるからDecentralizedが担保できます。Decentralizedされてないと中央集権型のままです。オープン化してないと、ブロックチェーンは従来型のDatabaseとほぼ同じです。

そして怖いのがクローズ型ブロックチェーンで構築されたNFTを世の中に煽られて高価で購入してる人たちが沢山います。クローズ型ブロックチェーンのNFTで中央集権型のままだと、そこの運営会社が運営をやめてしまえば全てがなくなってしまいます。従来型のモバゲーさんとかグリーさんのカードの取引のRMTと同じ事をしてるにも関わらず、NFTだからと高価な金額で取引されてます。
非常に恐ろしく感じます。

**皆さんに覚えておいてほしいのは、**
１．Web3の提案や仕事に関わる時に、オープン型ブロックチェーンにする必要があるという事を覚えておいて欲しいです。
２．クローズ型ブロックチェーンのNFTを投資で購入するのは、やめておきましょう。
（投資でなくトレーディングであれば瞬間的な利益はあげれるので個人で判断ください）
最近、特にFBとかで間違ったWeb3の話しが目を引くし、誤った投資に導かれない様にしてほしいです。

日頃、沢山のBuzzワードを見ると思いますが、表面的な言葉だけでなく、本質的な部分まで踏み込んで理解して見るのが良いと思います。

# 最後に
今後も続けていきますので、フォロー、イイね、シェアお願いします。
下記、説明会もご参加下さい。
[エンジニア年収アップ講習(転職サポート付き！)　無料説開会　12月6日　19時開催](https://cto-can-be.hp.peraichi.com/)
Dataverseの計算式列

現在プレビュー段階ではありますが、Dataverseのテーブルで計算式列というものを作成することができます。
今までは、キャンバスアプリだとアプリ側で関数を使ったり、モデル駆動型アプリだとビジネスルールを使ったりして、計算やロジックの設定を行っていましたが、この計算式列を使うと列のデータの種類として数式や関数を設定できます。
実際に作ってみましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/5cb7406f-9fe8-4d99-5ae1-295cd5fb6405.png" width=40%>


https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/formula-columns

# 計算式列の設定方法
1. Power AppsのDataverseを開き、対象のテーブルを選択します。
テーブルの詳細画面、左上の「新規」＞「列」をクリックします。
(もしくは画面右下の＋ボタン)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/534e0870-3c05-6bdb-e881-9cd14e7aaf3a.png)


2.画面右に「新しい列」が表示されるので表示名を入れ、データの種類で「計算式」を選択します。
これが計算式列ですね！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/83e46568-287f-2cdf-08b7-4238476e6d80.png" width=50%>


すると計算式を入力する欄が出てきます。ここに入力できるのはPower Fxと呼ばれるPower Platform共通の関数です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/7a24d7b2-fefc-c9b1-ce5a-e1d26021cba9.png" width=50%>

Power Fxの一覧は以下にまとまっています。いろんなことができますね。
https://learn.microsoft.com/ja-jp/power-platform/power-fx/formula-reference

計算式列で扱えるのはスカラー関数です。
[計算式列で使える関数](https://qiita.com/skuramoto/items/8533ddfc0afa54b152aa#%E8%A8%88%E7%AE%97%E5%BC%8F%E5%88%97%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E9%96%A2%E6%95%B0)

例えば、この列に日付を自動で格納できるようにしてみましょう。
UTCToday()を入れてみます。
※ここの計算式は作った後でも編集できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/eef25dba-aeda-f3c3-b04b-6d7e29e0cfc0.png" width=50%>

忘れずに高度なオプションのスキーマ名は入れましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/c7d30e90-0956-1829-3622-59650ce2309e.png" width=50%>

# 動作確認
例えばモデル駆動型アプリにこの列を追加します。
計算式列は編集できないので鍵マークがついてますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/97f1f38d-6d9d-d948-5ff4-91603ba37720.png)


実際のアプリを起動して、追加されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/a9faf736-292b-8539-eef6-856c0d064f5c.png)


データを入力して、保存ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/d9f124be-363c-2a26-c65f-e21d6187d907.png)

そうすると、自動で計算式列の「注文確定日」は当日の日付が自動で入力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/4e405a08-62ec-41a7-7814-6ec5d3e48161.png)


# 計算式列で扱えるデータ型
今回は日付を扱いましたが、他にも計算式列で扱えるデータ型がいくつかあります。
Power Fxを使っていろいろできそうですね。
- テキスト
- 10 進数
- はい/いいえ (ブール値)
- 日付


# 計算式列で扱える関数型
計算式列で扱える関数型も決まっています。
- 10 進法
- 文字列
- ブール値
- オプション セット
- 日時 (TZI)
- 日時 (ユーザー ローカル) (他のユーザー ローカル値および DateAdd 関数との比較に限定)
- 日時 (日付のみ) (その他の日付のみの値と DateAdd 関数との比較に限定)
- 通貨
- 整数、10 進数

# 計算式列で使える関数
Power Fxも全部使えるわけではなく、扱えるのはスカラー関数です。
以下に使える関数を挙げます。
Abs
And
Average
Blank
Char
Concatenate
DateAdd
DateDiff
Day
EndsWith
Exp
Hour
If
IfError
Int
IsBlank
IsError
ISOWeekNum
IsUTCToday
Left
Len
Ln
Lower
Max
Mid
Min
Minute
Mod
Month
Not
OR
Power
Replace
Right
Round
RoundDown
RoundUp
Second
Sqrt
StartsWith
Substitute
Sum
Switch
Text *
Trim
Trunc
TrimEnds
Upper
UTCNow
UTCToday
Value *
Weekday
WeekNum
Year

# まとめ
ビジネスルールのような数式・関数でルールを設定するデータ型：計算式
この機能非常に便利です。駆使してアプリの幅を増やしましょう！
MacSec 概要調べ

MacSec IEEE 802.1X:2020 単語帳

https://qiita.com/kaizen_nagoya/items/d8dd16819b4c4e759496

で本文を読み始めた。　


WAN暗号化もシンプルに！ MACsecの提供価値

https://www.netone.co.jp/knowledge-center/blog-column/knowledge_takumi_152/


MaCsec(Media Access Control Security)について

https://www.juniper.net/documentation/jp/ja/software/junos/security-services/topics/topic-map/understanding_media_access_control_security_qfx_ex.html

 MACsec の暗号化設定

https://www.cisco.com/c/ja_jp/td/docs/sw/lanswt-access/cat3750-xswt/cg/007/swcfg/swmacsec.html



情報セキュリティ技術動向調査
タスクグループ報告書 (2010 年上期)

https://www.ipa.go.jp/files/000014132.pdf



## RFC

RFC 3394: Advanced Encryption Standard (AES) Key Wrap Algorithm

https://www.rfc-editor.org/rfc/rfc3394.txt

RFC 5649: Advanced Encryption Standard (AES) Key Wrap with Padding Algorithm

https://www.rfc-editor.org/rfc/rfc5649.txt

  MAC address randomization       draft-zuniga-mac-address-randomization-00

https://datatracker.ietf.org/doc/html/draft-zuniga-mac-address-randomization-00



# 参考資料


情報セキュリティ白書2022

https://www.ipa.go.jp/ikc/our_activities/rs_03.html

ななんと、MacSecについて書いてない。泣）

AUTOSAR教材作成３年計画, AUTOSAR(19)

https://qiita.com/kaizen_nagoya/items/84d8f1ecbbe7af7803af
CPythonに'&&', '||'を追加してみた

# 1. はじめに

この記事はeeic2022の3年後期実験「大規模ソフトウェアを手探る」の4班の成果報告の記事です。

CPythonのビルドが済んでいない方は、先に以下の記事を参考にしてください。私たちの班が書いた記事です。

https://qiita.com/bnn877/items/8b197df99aea0c3cc56e

また、Cpythonにインクリメントも追加してみたい方は以下の記事を参考にしてください。こちらも私たちの班が書いた記事になっています。

https://qiita.com/LEEANHUA/items/fcedb7b8ceeca7c2fd3e





# 2. 実行環境

Ubuntu 20.04.5 LTS
Python 3.10.8






# 3. こんな方におすすめ

C言語 → '&&', '||'
Python → 'and', 'or'
この使い分けがごっちゃになるという方におすすめです。

この記事通りの変更を施せば、CPythonでどちらの表現も使えるようになります。





# 4. /Grammar/Tokens   (変更1)

コメントで示した行を書き加えることで、新たな演算子を定義します。
演算子の順番は関係ありません。
```
ELLIPSIS                '...'
COLONEQUAL              ':='
AND_AND                 '&&'     # 追加
OR_OR                   '||'     # 追加
```
`make regen-token`を実行することで、Token(演算子)として正式に定義されます。(後述)





# 5. /Grammar/python.gram   (変更2)

コメントで示した行を書き加えることで、'&&'という演算子に「かつ」を意味する機能を与えます。
'and'と同じ機能にしたいので、'and'に関する記述から演算子だけを書き変えた記述を加えればいいです。
ショートカットキー`Ctrl+F`で文字検索すると該当箇所がすぐに見つかります。
```
conjunction[expr_ty] (memo):
    | a=inversion b=('and' c=inversion { c })+ { _PyAST_BoolOp(
        And,
        CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)),
        EXTRA) }
    | a=inversion b=('&&' c=inversion { c })+ { _PyAST_BoolOp(            # 追加
        And,                                                              # 追加
        CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)),     # 追加
        EXTRA) }                                                          # 追加
    | inversion
```

同様にして、'||'という演算子にも「または」を意味する機能を与えます。
```
disjunction[expr_ty] (memo):
    | a=conjunction b=('or' c=conjunction { c })+ { _PyAST_BoolOp(
        Or,
        CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)),
        EXTRA) }
    | a=conjunction b=('||' c=conjunction { c })+ { _PyAST_BoolOp(        # 追加
        Or,                                                               # 追加
        CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)),     # 追加
        EXTRA) }                                                          # 追加
    | conjunction
```
`make regen-pegen`を実行することで、正式に機能が付与されます。(後述)
これにてソースコードの変更は終了です。





# 6. 再ビルド

ターミナルにてCPythonのソースコードがあるディレクトリに移動し、以下のコマンドを順に実行します。
`$ make regen-token`
`$ make regen-pegen`
`$ make`
`$ make install`





# 7. デモ

ビルドしてできたディレクトリに移動すると、<strong>「bin」</strong>というディレクトリがあります。
その中に入ると<strong>「python3」</strong>というファイルがあるので、それを実行します。
私の場合は「~/2022cpython/bin/python3」となっています。
![and_or.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950220/7ba78d7d-01f7-bdeb-4bae-27a85e98f653.jpeg)
たしかに'&&', '||'が追加されていることがわかります。




# 8. 最後に

CPythonの文法を変更するにあたってこちらのサイトが非常に役立ちました。ぜひ読んでみてください。

https://devguide.python.org/developer-workflow/grammar/index.html
基本情報　予約可能レコードのみ表示

# 予約時　選択可能なレコードのみ表示

__基本情報の試験予約がとにかくやりづらい！！！！！！__

ITの資格を申し込むサイトのシステムがまずゴミ
ほんと日本のIT業界は嘆かわしいですね。（by 底辺エンジニア）

いちいちスクロールするのが嫌なので
とりあえずchromeの拡張機能でできそうなことが

![スクリーンショット 2022-11-09 20.51.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960074/7caf6c87-bfce-b0c0-8c50-91b3e71e05f6.png)


こいつを

![スクリーンショット 2022-11-09 21.07.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960074/1e1667ad-8d9f-0f7a-8851-568f239ed3fd.png)

こう

chromeの拡張機能自体の解説は他の方がやられていますのでそちらは割愛

参考までに
<https://qiita.com/RyBB/items/32b2a7b879f21b3edefc>

https://qiita.com/RyBB/items/32b2a7b879f21b3edefc


<br>
<br>
<br>
<br>

ではソースコード

## ソースコード


```js:content.js
//なくてもいいよ
console.log("拡張機能が読み込まれました");

// テーブル選択
var tableArea = document.getElementsByClassName("table-area");

// 存在していいのかのフラグ
var existFlag;

for (i = 0; i < tableArea.length; i++) {
    existFlag = false;
    // 選択できる時は時間の下が青くなるので今回はそれで判断する
    // 青色部分の一行取ってくる
    // table-area > table > tbody > tr[1]
    var tdList = tableArea[i].children[0].children[0].children[1];
    // 先頭だけご希望の会場の〜があるため
    if (tdList == undefined) {
        var tdList = tableArea[i].children[1].children[0].children[1];
    }
    for (let index = 0; index < tdList.childElementCount; index++) {
        // 色が水色のセルがあったれ存在価値のある行
        if (tdList.children[index].bgColor == "#99CCFF") {
            existFlag = true;
        }
    }
    if (!existFlag) {
        // br削除
        tableArea[i].nextElementSibling.remove();
        
        // 選択できないテーブルを削除
        tableArea[i].remove();
        
        // 削除した分
        i--;
    }
}
```

<br>
<br>
<br>
<br>

一応manifestも

```json:manifest.json
{
    "name": "Prometric Reserve Extension",
    "version": "1.0.0",
    "manifest_version": 2,
    "permissions": [
        "fontSettings"
    ],
    "description": "Prometric Reserve Extension",
    "content_scripts": [
        {
            "matches": [
                "https://j6.prometric-jp.com/Reserve/SelectPlace*"
            ],
            "js": [
                "content.js"
            ]
        }
    ]
}
```
<br>
<br>
<br>

基本情報技術者試験、受けてみようと思い立ったものの
申し込みめんどくさすぎて後回しにしすぎた、、、
<br>
午前試験は予約できたけど、午後試験予約できない
→ __キャンセル不可＆＆返金不可__

<br>
気をつけてください、<br>
千葉から群馬まで行きたくなければ、、、<br>
<br>
みなさんは余裕を持って予約しましょう:thumbsup:
Moe TTSをWindows上で動かす

# はじめに
MOE-TTSという文章読み上げAIが公開されました。
ウェブ上で使えるものですが、ローカルでの実行も出来たので、インストール～起動までの手順を記録しておきます。

[→リンク：Moe TTS](https://huggingface.co/spaces/skytnt/moe-tts "MoeTTS")

# 起動までの手順
## 必要スペック
特に指定はないが、NVidia製のグラボがあると高速化可能

## 必要ソフト
* CUDA toolkit 11.7（最新は11.8だが、pytorchが対応していない）
* Anaconda
* git

## 手順
### ソースコードの入手
```
git lfs install
git clone https://huggingface.co/spaces/skytnt/moe-tts
```

### conda環境の設定

```
conda create -n moe python=3.10
conda activate moe
```

### python関連のインストール
pytorchのインストールコマンドを入手します。
[PyTorch](https://pytorch.org/)←こちらから自分の環境を選択し、Conda用のインストールコマンドを作成する

コマンド例
```
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
```

### 依存モジュールのインストール
取得したソースコードのうち、requirements.txtから以下の３行を削除する
```
torch
torchvision
torchaudio
```

以下のコマンドを実行
```
pip install -r requirements.yxy
```

### 初回実行
ソースコードのディレクトリに移動し、以下のコマンドを実行
```
pip install -r requirements.txt
```
初回は関連ファイルのダウンロードが発生するため、時間がかかる。
以下のような表示が出たら完了。表示されたURLにアクセスしましょう。
```
Using cache found in C:\Users\super/.cache\torch\hub\bshall_hubert_main
Running on local URL:  http://127.0.0.1:7860

To create a public link, set `share=True` in `launch()`.
```

### 二回目以降の起動
二回目以降は以下の手順のみ
```
conda activate moe
python app.py --device=cuda
```

## うまくいかない場合
 cuda関連で失敗する場合は、CPUでの動作も可能。上記手順からの変更点は
* pytorchの個別インストールを行わない
* requirements.txtからtorch関連を取り除かない
* 実行時、--device=cudaを付けない
～←は全角チルダで、〜←は波ダッシュ

# きっかけ
自分の上司が、作ったプログラムをテストしてもらう際に試験チームの方でエラーになる(テスト通りに行かない)と返されてしまったという

# 原因
テストコードを書く時点で〜（波ダッシュ）と～（全角チルダ）をデータベースに反映するテストコードを記述した際に正規化し忘れたらしい
というかこれ見た感じ全然わかんねえ。。

# まとめ
終始違いがわからない。ちなみにMacで「から」と検索すると波ダッシュ、Windowsだと全角チルダらしい。
UniCodeはそれぞれ
`U+E3809C`波ダッシュ
`U+EFBD9E`チルダ　
みなさんもどうかお気をつけてください。。

# 参考にしたサイト
[レコチョクのエンジニアブログ](https://techblog.recochoku.jp/7538)
[テキスト処理ツール](https://so-zou.jp/web-app/text/encode-decode/)
OptionParserでElixirスクリプトの引数を解析

Elixirスクリプトを書く際に引数を受け付けたい場合があります。[OptionParser]を知っていると気軽に引数の解析ができて便利です。

Elixirスクリプトについては先日別の記事にまとめました。

https://qiita.com/mnishiguchi/items/4a4e6d5dd1432e6168c1

## System.argv/0で引数を取得

Elixirスクリプトの中で[System.argv/0]を実行すると渡された引数のリストを取得できます。

Elixirスクリプトでない環境で実行すると引数がないのでいつも空リストが帰ってきます。

```elixir
iex

iex> System.argv()
[]
```

試しに渡された引数をプリントするだけのElixirスクリプトを書いてみます。

```bash
❯ cat <<-EOF > ./toukon.exs
System.argv()
|> Enum.each(&IO.puts/1)
EOF

❯ elixir toukon.exs --foo --bar=1
--foo
--bar=1
```

Elixirスクリプトの中で実行すると引数が空白で分割されたリストで帰ってきます。


## OptionParser.parse!/2で引数を解析

[OptionParser.parse!/2]は引数のリストを解析し、あらかじめ宣言された名前と型に基づいて値を取り出します。設定を緩くすることもできますが、[公式ドキュメント][OptionParser]によると`:strict`モードが推奨されています。特に理由がなければ`:strict`モードを使うのが賢明です。

現時点で5つの方がサポートされています。

### boolean型

```elixir
iex> parse_boolean_option = &OptionParser.parse!(&1, strict: [hello: :boolean])

iex> parse_boolean_option.([])
{[], []}

iex> parse_boolean_option.(["--hello"])
{[hello: true], []}

iex> parse_boolean_option.(["--no-hello"])
{[hello: false], []}

iex> parse_boolean_option.(["--hello=true"])
{[hello: true], []}

iex> parse_boolean_option.(["--hello=false"])
{[hello: false], []}

iex> parse_boolean_option.(["--hello=0"])
** (OptionParser.ParseError) 1 error found!
--hello : Expected type boolean, got "0"
    (elixir 1.14.0) lib/option_parser.ex:275: OptionParser.parse!/2
    iex:13: (file)
```

### count型

```elixir
iex> parse_count_option = &OptionParser.parse!(&1, strict: [hello: :count])

iex> parse_count_option.(["--hello"])
{[hello: 1], []}

iex> parse_count_option.(["--hello", "--hello", "--hello"])
{[hello: 3], []}
```

### string型

```elixir
iex> parse_string_option = &OptionParser.parse!(&1, strict: [hello: :string])

iex> parse_string_option.(["--hello", "foo"])
{[hello: "foo"], []}

iex> parse_string_option.(["--hello=foo"])
{[hello: "foo"], []}

iex> parse_string_option.(["--hello"])
** (OptionParser.ParseError) 1 error found!
--hello : Missing argument of type string
    (elixir 1.14.0) lib/option_parser.ex:275: OptionParser.parse!/2
    iex:23: (file)
```

### integer型

```elixir
iex> parse_integer_option = &OptionParser.parse!(&1, strict: [hello: :integer])

iex> parse_integer_option.(["--hello", "0"])
{[hello: 0], []}

iex> parse_integer_option.(["--hello=0"])
{[hello: 0], []}
```

### float

integer型と同様。


## 検証用Elixirスクリプト

引数を受け取り、解析し、結果をプリントするElixirスクリプトを書いてみます。

```bash
❯ cat <<-EOF > ./toukon.exs
  System.argv()
  |> OptionParser.parse!(
    strict: [
      aisatsu: :string,
      year: :integer,
      debug: :boolean
    ]
  )
  |> IO.inspect()
EOF

❯ elixir toukon.exs --aisatsu 元気ですかーーーーッ！ --year=4 --debug
{[aisatsu: "元気ですかーーーーッ！", year: 4, debug: true], []}
```

[System.argv/0]: https://hexdocs.pm/elixir/System.html#argv/0
[OptionParser]: https://hexdocs.pm/elixir/OptionParser.html
[OptionParser.parse!/2]: https://hexdocs.pm/elixir/OptionParser.html#parse!/2

## ご参考までに

https://qiita.com/piacerex/items/e0b6e46b1325bb931122

https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd

https://qiita.com/piacerex/items/e5590fa287d3c89eeebf
物事の基本を理解する

これも社員に良く言ってた言葉です。
「基本を理解しなさい」
近年、プログラム言語は、凄い種類になってきてます。

COBOL,C,Fortran,Pascal,VB,VC,ASP,Perl,PHP,Java,Ruby....

こんなに数多くのプログラミング言語を覚えるのは、至難の業だと思いませんか？
これを読んでるエンジニアの人は、幾つの言語が解るのでしょうか？

同時にシステムに関わるミドルウェアも幾つも存在します。
DBだけでも、Oracle,MySQL,Postgres,Cyboze,SQLite....
因みに僕は、上記の言語,DBは一通り全てわかります。

何故わかるのか。

それは、基本を理解しているからです。
基本さえ理解してれば、言語やツールの種類が変わっても、直ぐに理解できます。
先ずは、何故、プログラムが動くのかをしっかり理解するのは、とても大事です。

表面的な事だけで無く、深くふかーく基本を理解して欲しいです。そこは、OSだからといって、理解を止めないで、何故、これは、動くのか？をしっかりと深く深く疑問に思って、調べて理解する。

・Windowsは、どういう仕組みで動くのか。
・Webサーバーは、どういう仕組みで動くのか。
・DBは、どういう仕組みで動くのか。

例えば、変な話ですが、WindowsでExcelで作られたファイルは、何故、ダブルクリックでExcelが起動し、そのデータが表示されるのでしょうか。

プログラミングの範囲だけでなく、コンピュータが動く仕組みについて理解して下さい。

そうすれば、新しいを言語やミドルウェアと出会った時も、ある程度すぐに理解できます。

現在は、インターネットが普及した事により、その言語についての情報やサンプルコードまで、検索サイトで検索すれば、沢山の情報が簡単に取得できます。

個人的な意見ですが、基本を理解するひとつの良い方法は、C言語を勉強する事。C言語で、Windowsプログラム（MFCは使わないで直接、WindowsAPIでコーディング）や、Socketプログラミングをしてみるのが良いと思います。

深く深く本質を最後まで追及して、しっかりと基本を理解するの本当に大事です。
Wowza + WebRTC + Opus + Wowzaサンプルページで正しく視聴できるようにするには

# はじめに

WowzaがWebRTCに対応しているので

```
Camera(H.264/G.711) -> Wowza(H.264/Opus) -> webrtc-examples
```

で視聴確認を行った。その際エラーが出て視聴が行えず、対応に時間を要したのでメモとして残しておく。
なおCameraはH.264/G.711を配信しているのでWowzaにてトランスコード設定(G.711→Opus) を実施している。

※最初は「Wowza(H.264/AAC)」にしてて「あれ？音が出ないぞ？」となり「Wowza(H.264/Opus)」にした経緯もあったりなかったり。

# 何故Opus？

以下に記載があるが現時点ではOpusがオススメなのと、WebRTCの設定画面では「only」という記載があったことも関係している。

https://www.wowza.com/docs/webrtc-workflows-in-wowza-streaming-engine

# webrtc-examples とは？

WowzaのWebRTC関連ページ(公式)を見ていくと紹介されているサンプル。
実行してブラウザでアクセスするとWebRTCのpublishやplayが試せる。

![webrtc-examples.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236186/c5a3cb73-4d86-f997-10ef-7fa2abd65b8f.png)

# トランスコード設定

Wowzaのトランスコード設定で本記事に関係するAudio設定だけを以下に抜粋する。

![Wowza_transcodesettings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236186/6c50b56e-8a1d-21c7-59f0-08d564da7ae6.png)

※ここでは設定が「Audio Codec」、「Audio Bitrate」のみである点に注目。


# エラーの内容

webrtc-examplesで必要情報を入力し、いざPlay!と思ったら以下のエラーメッセージが出た。

```
PeerConnection Error: Failed to execute 'setRemoteDescription' on 'RTCPeerConnection': Failed to set remote offer sdp: Failed to set remote audio description send parameters for m-section with mid='audio'.
```

webrtc-examplesのサンプル上では以下のように。

![webrtc-examples_with_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236186/dfa007fe-28b0-59ea-8d9a-bfc0dd696237.png)

この時のSDPの内容は以下の通り。(本記事に関係する部分だけ抜粋)

```
m=audio 9 RTP/SAVPF 96
a=rtpmap:96 OPUS/8000/1
```

"OPUS/8000/1" の部分は "コーデック/サンプリングレート/チャンネル数" と思われる。

それを踏まえ(?)エラーメッセージを基に調べて行くとどうやらサンプリングレート：48000Hz、チャンネル数：2(ステレオ)じゃないとダメということが分かった。

ただし先述の「トランスコード設定」では「Audio Codec」、「Audio Bitrate」のみ。
さらに次はトランスコード設定でサンプリングレートとチャンネル数を指定する方法を調べる。
すると、、、

# トランスコード設定(サンプリングレートとチャンネル数)

先述の「トランスコード設定」で設定した内容は以下のようにXML形式で保存されている。

```Text:/usr/local/WowzaStreamingEngine/transcoder/templates/transcode.xml
<Encode>
        <Name>MyTransCodeName</Name>
        <Enable>true</Enable>
        <Description>Copy of: 720p</Description>
        <StreamName>mp4:${SourceStreamName}_mycamera</StreamName>
        <Audio>
                <Codec>Opus</Codec>
                <Bitrate>16000</Bitrate>
        </Audio>
</Encode>
```

これを以下のように修正するとよいようだ。(\<Resample> ～ \</Resample>を追加)

```Text:/usr/local/WowzaStreamingEngine/transcoder/templates/transcode.xml
<Encode>
        <Name>MyTransCodeName</Name>
        <Enable>true</Enable>
        <Description>Copy of: 720p</Description>
        <StreamName>mp4:${SourceStreamName}_mycamera</StreamName>
        <Audio>
                <Codec>Opus</Codec>
                <Bitrate>16000</Bitrate>
                <Resample>
                        <Enable>true</Enable>
                        <SampleRate>48000</SampleRate>
                        <Channels>2</Channels>
                </Resample>
        </Audio>
</Encode>
```

保存した後、Wowzaを再起動して配信＆視聴を実施すると先述のエラーメッセージが出ることなく無事に視聴ができた。またSDPも以下のように変わっていた。

```
m=audio 9 RTP/SAVPF 96
a=rtpmap:96 OPUS/48000/2
```

# 最後に

* なぜデフォルトが8000/1？
* なぜUIで設定できない？？

不思議である。
４０代おっさんFastAPIを勉強する

## 本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

## getでFastAPIを動かす

```python
from fastapi import FastAPI

app = FastAPI()

@app.get("/") # getで / にアクセスがあったら下の関数を実行
async def index(): # asyncで非同期処理を実装できる
    return {"message": "利樹大好き"}
```

サーバー起動(main.py)

```bash
uvicorn main:app --reload
```

{"message":"利樹大好き"}

となっていれば成功

local hostに`/docs`をつけると
ドキュメントが見られる。
Swagger UIが使われている。
FastAPIはSwagger UIを自動生成している。

local hostに`/redoc`をつけると
redocベースのドキュメントが見られる。

## パスパラメーター

```python
from fastapi import FastAPI

app = FastAPI()

@app.get("/name/{name}") # {name}の部分がパスパラメーター
async def name(name): # パスパラメーターの部分が変数として渡される
    return {"name": name}
```

### 文字列型で受け取る

```python
from fastapi import FastAPI

app = FastAPI()

@app.get("/name/{name}")
async def name(name: str): # string型で受け取っている。
    return {"name": name}
```

これが仮に

```python
from fastapi import FastAPI

app = FastAPI()

@app.get("/name/{name}")
async def name(name: int): # int型で受け取っている。
    return {"name": name}
```

{"detail":[{"loc":["path","name"],"msg":"value is not a valid integer","type":"type_error.integer"}]}

とエラーが出る。

＊string型にしていると数字の1を入れても、文字列の1として見てしまう
　また複数`@app.get("/name/")`があった場合は順番に注意

## クエリパラメーター

URLの？以降の物

`https://twitter.com/search?q=Python&src=typed_query`

&でつなげることができる

```python
from fastapi import FastAPI

app = FastAPI()

@app.get("/name/")
async def name(name: str, number: int): # =''でデフォルトの値
    return {
        "name": name,
        "number": number
    }
```

`http://127.0.0.1:8000/name/?name=あっきー&number=2`

にすると

{"name":"あっきー","number":2}

と表示される

＊クエリパラメーター設置してもし`?name=あっきー&number=2`がない場合はエラーになる。

```python
from typing import Optional # インポート
from fastapi import FastAPI

app = FastAPI()

@app.get("/name/")
#  Optional[] = Noneで必須項目でなくなりエラー回避できる。
async def name(name: Optional[str] = None, number: Optional[int] = None): 
    return {
        "name": name,
        "number": number
    }
```

{"name":null,"number":null}
になる。

## 参考

https://www.udemy.com/course/python-fastapi