OmniAICreator/Qiita-1.07M huggingface dataset:
STLINK-V3 MODSに標準ピッチアクセスしたい


STマイクロ純正のデバッグアダプタである[STLINK-V3 MODS](https://www.st.com/ja/development-tools/stlink-v3mods.html)(以降V3MODSと表記) は [STLINK-V3 SET](https://www.st.com/ja/development-tools/stlink-v3set.html)(以降V3SETと表記)と同等の機能を持ちながら1000円強という安価が魅力です。ボードへの実装を主な用途としているようで、USB以外のコネクタはついていません。このV3MODSに標準ピッチアクセスできるようにしようというのが今回の目的です。専用基板の作成用として設計データを[git公開](https://github.com/hwtronics/STLINK-V3-HWMOD)している方がいますが(見栄えもよいです)、私は市販されている部材とハンダ付けで簡易に対応することにしました。

##STLINK-V3製品ラインナップの簡易比較

| | [V3SET](https://www.st.com/ja/development-tools/stlink-v3set.html) | [V3MODS](https://www.st.com/ja/development-tools/stlink-v3mods.html) | [V3MINI](https://www.st.com/content/st_com/ja/products/development-tools/hardware-development-tools/hardware-development-tools-for-stm32/stlink-v3mini.html) |
| -------------------------------:|:-----:|:------:|:------:|
| 調査時のDigi-Key価格[JPY]                | 4189  | 1051   | 1241   |
| サイズ                           | 大    | 小     | 小     |
| 仮想COMポート(VCP)               | 〇    | 〇     | 〇     |
| USBブリッジ(UART,I2C, CAN, GPIO) | 〇    | 〇     | ×      |
| 標準ピッチのピンヘッダ搭載         | 〇    | ×      | ×      |
| STDC14コネクタ搭載                | 〇    | ×(*1)  | 〇     |
| STDC14 to STDC14 flat cable付属  | 〇    | ×      | 〇     |

*1. ハンダ付け用のパッドはあり

##V3MODS 選定理由
上表からわかるように、標準ピッチアクセスしたいならV3SET を買えばよいです。私は既にV3SETを所有しているのですが、移動時等、別の場所で使用するために小型のものを追加したいと考えました。USBブリッジ機能が不要ならV3MINIでもよいですが、ユーザーマニュアルに *"32-pin edge connector for STLINK-V3MODS"* との記載があり、V3MINI ではエッジコネクタは全く利用できないのかもしれません(未確認)。V3MINIで標準ピッチアクセスするならSTDC14用フラットケーブルのコネクタからピッチ変換すればよいと思います。今回、私はSTDC14 での接続を必要としておらずV3MODSを選びました。

##必要となるものの準備
**対象者**
・ハーフピッチ(1.27mm)のハンダ付けでも心折れない人→自信がない人は事前に訓練しましょう([参考](https://qiita.com/himeshima/items/dbe2ece38f75d910d6de))

**必要となるもの**
・1.27→2.54mm 32ピン ピッチ変換基板 ※V3MODSが15.24mm幅であり、両サイドに単列L字型ピンヘッダを置く必要があります。
　例：[aitendo 127S1507D32A](https://www.aitendo.com/product/18835)
・1.27mmピッチ 単列L字型ピンヘッダ
　例：[aitendo PH127SL-A](https://www.aitendo.com/product/19518)
・2.54mmピッチ 単列ストレート型ピンヘッダ
　例：[aitendo PH254S-B6](https://www.aitendo.com/product/1798)

上記の部材費としては300円程度で済みます。(USBケーブルや、ターゲットボードとの接続に使用するケーブルは別途必要です。)
ピンヘッダは片側16ピン x 2 の計32ピンあればよいのですが、カットする際に損傷するリスクがあるので多めにあると安心です。(特に1.27mmピッチのピンヘッダは慎重にカットしましょう)

##作業のポイント
1. L字型ピンヘッダを固定する場所
 　V3MODSを隙間なく挟み込む必要があります。→隙間が大きいとハンダで繋ぐのが困難になります。

1. ハーフピッチ(1.27mm)のハンダ
　 隣のピンとショートしたり、付近の部品をハンダで焼いてしまわないように注意しましょう。(※隣り合わせのNo.26&27ピンはGNDなので繋がっています)

##32-pin edge connectorのピンアサイン
[STマイクロ公式サイト](https://www.st.com/ja/development-tools/stlink-v3mods.html#documentation)より入手可能なユーザーマニュアル(UM2502)より抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678534/2ed6222d-46c0-b77e-a9e6-c84ab744235d.png)

##完成
STLINK-V2搭載しているSTM32F4 DiscoveryボードにあえてSTLINK-V3を繋ぐの図(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678534/d681f993-8034-7cd3-f80e-60c6fd01baa0.png)

##V3SETとのサイズ感比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678534/0a5d3ed6-ee10-04ef-2829-27760345877c.png)
【Apple Inc.】iCloudには気をつけろ！

## 前置き

私は、どちらかというと敬虔なApple信者です。
MacBook, iPhone, iPadも持っていますし、Apple musicにも入っています。
Appleが出している商品、サービスに、絶大な信頼を置いています。

### ただ、iCloudだけはいただけない。。

今回、iCloudに関してApple Supportの方とお話して、
衝撃的な回答をいただいたので、記事にしました。
（Appleのことは、今でも大好きです。※重要）

## iCloudには、注意した方が良い

### iCloudとは、、、

**iCloudは、あらゆるApple製デバイスに組み込まれています。
つまり、写真、ファイル、メモなど、あなたのものすべてが安全に
保存され、最新の状態に保たれ、あなたがどこにいてもアクセス
できるようになるということです。誰でも5GBのiCloudストレージを
無料で利用でき、パワフルな新機能とより大きなストレージ容量を
利用したい場合は、いつでもiCloud+にアップグレードできます。**

これだけ見ると、iCloud+に契約すれば、
iPhoneやMacbookの内蔵SSDに入りきらない
写真、フォルダを大量（最大２TB）に保存できると思いませんか？

## そう思ったそこの貴方。ちょっと待ってください！

実は、iCloudを使ってクラウド上にデータを保存するには、
一度本体（iPhone,iPad,Macbook)の内蔵SSDを経由する必要があるのです。

私は最初、以下のような仕組みでiCloudが利用できると思っていました。

```
保存したいフォルダや写真を直接、iCloudに転送、保存できる。
（内蔵SSDの容量は気にせずにデータの出し入れができる　＝　最高じゃないか！）
------------------------------------------------
【保存したいフォルダ、写真】 → → → iCloud
```

Apple Supportの方に聞いてみると、実際のiCloudの仕組みは以下の通りです。


```
１回機器本体のSSDにデータ（保存したいフォルダや写真）を置かないと、iCloudに転送、保存ができない。
-----------------------------------------------------------------------------------
【保存したいフォルダ、写真】　→ → → 【本体（iPhone,iPad,Macbook)内蔵のSSD】 → → → 【iCloud】
```

### ↑これって意味ある？？？

この話をApple Supportの方から聞いた瞬間に、
何のためのクラウドストレージかわからなくなりました。

こっちは、内蔵SSDの容量がないから、iCloud＋契約して
内蔵SSDに直接入らないフォルダや写真をiCloudに入れようとしているのに、
そのiCloudに入れるためには、内蔵SSDの容量が必要って。。
正直、訳がわからないです。。

例えば、外付けSSD（2TB)の調子が悪いので、
一旦外付けSSDの中身を別の場所に退避させたい。
でも内蔵SSDは128GBや256GBしかない場合、ほぼ詰みです。

チマチマ、内蔵SSDの容量開けて、空いた容量に外付けSSDの中身を写して、最後にiCloudに保存ということもできなくはないですが、現実的ではないですし、めんどくさいですよね。。

## 結論

iCloudには気をつけてください。
意外に、私と同じ勘違いをしている人がいるかもしれません。

詳しい人からすると、こんなこと常識だろという感じかもしれませんが、
個人的に、かなり衝撃的な内容だったので今回記事に残しました。

実際に、iCloud＋契約して、使ってる方はどういう使い方されているのか
気になるので、よければコメント欄にて教えてください。

ご拝読いただきありがとうございました。
HasuraのGitHub Deployment機能を使ってデプロイ作業（migrate, metadata apply）を自動化する


Hasuraとは何？という方はこちらを読んでいただけると幸いです。

https://qiita.com/sho-hata/items/2dbd41be42662007071e

## Hasura GitHub Deployment(Beta)の概要

Hasuraでは、マイグレーション履歴やパーミッション等の情報をメタデータとして保持しています。
手元のメタデータをサーバーに反映させるには、hasura CLIを使って`migrate apply`や`metadata apply`といったコマンドを流す必要があります。

稼働しているHasuraサーバーに対してメタデータを反映させるには、以下のような運用が考えられます。

- 手動でHasura CLIを使って`hasura`コマンドを流す
- `<version>.cli-migrations-<version>`[タグのついたDockerイメージ](https://hub.docker.com/r/hasura/graphql-engine)を使用して、コンテナ起動時にmetadata情報が読み込まれるようにして自動化
- サーバレス関数を使ってHasura CLIを動かすなどして、なんとかしてパイプラインに組み込んで自動化

ただ、いずれの方法もどこかで運用に難があり、ベストプラクティスとはあまり言えません。

ここで、Hasura GraphQL Engineのクラウド版にて、**GitHub Deployment機能**が追加されました。

https://hasura.io/docs/latest/graphql/cloud/projects/github-integration.html

GitHub上のリポジトリ・ブランチを指定してHasura Cloud上のプロジェクトと連携させることで、`git commit`にフックしてディレクトリ内のマイグレーション情報やメタデータ情報を自動的に反映させることができます。

この機能は現在`Beta版`として公開されており、無料で使用できます。
## 動作
:::note
この機能の使い方は、公式ドキュメントにも記載されています（英語）。
:::

### 動作環境
<img src="https://img.shields.io/badge/ Hasura Cloud-2.0.10-1EB4D4.svg?logo=hasura&style=plastic">　

### GitHubアカウントをHasura Cloudに紐づける
Hasura Cloudのプロジェクト設定から、[Git Deploy] → [Linked GitHub Account]
![Screenshot 2021-10-30 12.51.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/0d1a6ffc-056f-588d-3a43-ca45e58f749f.png)

すると、認証を求められるので、GitHubアカウントにHasura Cloudアプリをインストールします。
ここで、リンクするリポジトリの制限ができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/af03211c-3b6b-56c3-abc8-d0fabc46eb15.png">

### デプロイ設定
インストールすると、GitHubアカウントとHasura Cloudプロジェクトが紐づけられます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/a53502d8-4e67-cccc-d509-3d16713a2032.png" width=50%>
ここで、

- 連携するリポジトリ
- 連携するブランチ
- Hasuraのメタデータが置かれているディレクトリ
- Deployment Mode

を設定します。

Deployment Modeでは、Automatic / Manualから選ぶことができます。

- **Automatic**: ターゲットとなるブランチのcommitにトリガーして、自動的にデプロイを行う
- **Manual**: デプロイは自動的にトリガーされない。手動で[Deploy Now]を押すことで、最新のコミットの状態でデプロイが行われる。

### デプロイ
ターゲットとなるブランチ(今回の例ではmaster)に変更をpush/mergeすると、自動的にデプロイパイプライン処理が走ります。
※Deployment Modeを「Manual」にした場合は手動

![スクリーンショット 2021-10-30 11.44.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/aabcb281-62dc-0da6-263b-d57cf9b0ecea.png)

進行状況はHasura Cloud上で確認でき、[メタデータファイルのパース]、[メタデータ・マイグレーションの適用]、[ヘルスチェック]等のステップに分かれていることがわかります。

もし各段階で何らかの不整合が起こった場合、その時点でのステップで処理は中断されます。失敗の詳細はログに吐かれているので、そこから原因解明するになります。
![スクリーンショット 2021-10-30 13.45.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/aad12da7-ac74-e1ba-1d2d-dbcf536970b5.png)


## おわりに
リポジトリ連携設定をしてしまえば簡単にデプロイパイプラインを構築できるため、GitHubでプロジェクト管理している場合のHasuraのCI/CDとして、これからのスタンダードになっていくかなと感じました。かなり便利な機能なので、筆者が業務で使用しているGitLabとも連携してほしいところです。
そして最後に。こちらはまだBeta版の扱いのため、細かな仕様上の問題やバグがあることが予想されます。見つけた場合はissueやdiscussionで報告していきましょう。
LightGBMの木の構造を可視化する


学習済みのLightGBMの中身をさっと見たいときに出来ることとして、以下の2点を紹介します

- 個々の木の描写
- 木々の構造をデータフレームに変換


# 準備

``` python
import lightgbm
import pandas as pd
import palmerpenguins

# version >= 3 が必要
print(lightgbm.__version__)

# dataの読み込み
df = palmerpenguins.load_penguins()
df.shape # (344, 8)

# 見やすいように若干使用データを修正する
X = df.drop(['species', 'island', 'flipper_length_mm'], axis=1)
X['sex'] = X['sex'].astype('category')
y = df['flipper_length_mm']

# 学習の実行
lgb = lightgbm.LGBMRegressor(n_estimators=2, num_leaves=8)
lgb.fit(X, y)
```

### 環境
lightgbmのバージョン3以上が必要です。Google colabでは`pip install lightgbm -U`で新しいバージョンのものを入れる必要がありました（2021年10月現在）。

また、後述のグラフの可視化の際にはgraphvizが必要です。

### データ
今回はpalmerpenguinsのデータを使います。ペンギンかわいい。
`pip install palmerpenguins`でインストールできます。

https://github.com/mcnakhaee/palmerpenguins

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665792/c9cfa552-29de-fa0d-a765-7513e48ee9cb.png" width="500">



全部で344行8列のデータセットです。各列の詳細などは以下を参照ください。

https://allisonhorst.github.io/palmerpenguins/


### 学習
flipper_length_mm（羽の長さ）をtargetにした回帰を、sklearn APIを使って行います。
どんな感じで可視化できるのかイメージしやすいよう、木の数を2つ、木あたりの葉の数を8つに設定して学習します。


# 1. 木の描写
 ``` python
lightgbm.plot_tree(lgb, tree_index=0);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665792/68a17bcc-c532-d016-44ef-d84e97effe5c.png)

`lightgbm.plot_tree(booster, tree_index)`で結果を図示できます。tree_indexを省略すると一つ目の木が描写されます。

木が深いと見づらそうですが、自分で中身を確認するための可視化としては十分に思えます。人に見せる用のグラフを作成する場合は以下などを参考に作りたいところです。

- [LightGBM/XGBoostのtree構造可視化メモ - Qiita](https://qiita.com/dyamaguc/items/70d4ce3548d49a6256fa)
- [Pythonでしか描けない美しいデシジョンツリー（決定木）をlightGBMでも描こう！ - Qiita](https://qiita.com/hima2b4/items/b356e688ebdabc393da8)


# 2. データフレームに変換
``` python
lgb.booster_.trees_to_dataframe()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665792/0ff8f75e-48e9-a556-f18b-8a8c67aa52cb.png)


`trees_to_dataframe()`で、木の構造をデータフレームにまとめてくれます。各列の持っている情報は以下の通りです。

- **tree_index**: 何本目の木か
- **node_depth** ~ **decision_type**: 見たまんま
    - **node_index**はSがsplit、Lはleafを意味する（たぶん）。先頭の数字はtree_indexと同じ
    - 特徴量がcategoryだとdecision_typeが`==`になるっぽい(9行目) 。threshholdは数字のままだった。カテゴリ名を表示してくれまいかと期待したけど。残念。
- **missing_direction**, **missing_type**: 欠損値について
    - lightgbmだと`zero_as_missing=True`で0を欠損値に指定することができて、その情報がmissing_typeには入ると思われ
- **value**: そのノードでのpredicted valueに学習率を掛けたもの
- **count**: そのノードに入るレコードの数
    - 根ノードには全部入るので344だし、0-S1+0-S2も344になる


ぱっと思いつく使い方としては、
LGBMは最初の方の木に入っている特徴量が重要なので、関心がある特徴量が最初に出てくるのはどの木か見る、とか。
2つの特徴量が同じ木にばかり出てくるなら相互作用ありそうだな、とか。
これを使って特徴量重要度がどう計算されているのか理解したり、とか。

色々使えそうな気はします。使い慣れたpandasで返してくれるのがありがたいです。


# 参考
https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.plot_tree.html#lightgbm.plot_tree

https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.Booster.html#lightgbm.Booster.trees_to_dataframe
Reactチートシート（実践参照）

はじめて触った感想はたのしい。
ただTODOアプリを作っただけですが。
フロントを自分の武器にしていきたいな。
深いとこまで勉強して更新します。

# 基本的内容

## これまでのJavaScript

- レンダリングコストが高い、コードの複雑化
<br>→モダンJSでは仮想DOMを操作し、差分を出してからDOMに反映
- １つのJSファイルにすべての処理を記載していた
<br>→ファイルを分けるようになったが、どこの変数を使っているのかなどわかりにくい
<br>→npm/yarnなどのパッケージマネージャーを使用
- ES2015が機能追加が多くあり、近代JSの転換期と呼べる

## モジュールバンドラーとは
**複数のjs(css/image)ファイルを1つにまとめたもの**
JSファイルは細かく分けたほうが効率はいいが、本番用にビルドする際に1つのファイルにまとめる

## トランスパイラとは（BABEL）
**新しいJavaScriptの記法を古い記法に変換してくれる**
開発は新しい方でやって、実行するときに古い記法に変換してくれる

## SPAとは（Single Page Application）
- モダンJSはSPAが基本
- HTMLは1つのみでJSで画面を書き換える
- メリットは画面遷移がスムーズにできる
- コンポーネント分割が容易になることで開発効率がアップする

## 基本メモ
- コンポーネント名の頭は大文字
- reactのコンポーネントはわかりやすいようにjsxファイルにしてあげる。jsファイルでもエラーにはならない。
- HTMLのタグ内ではキャメルケースで記載
- JSXではclassではclassNameとなる
- mapなどでループしてレンダリングする場合は、keyを指定してあげる
- 一つのタグですべてをかっこてあげる必要がある→フラグメントで囲む必要があったりする

## Propsとは？？

コンポーネントにわたす引数のようなもの

## Stateとは？？

各コンポーネントが持つ状態。Stateが変更されると再レンダリングされる。
HTMLを再描画ではなく、コンポーネントの再レンダリングがポイント。

stateの共通化をする方法は、stateのリフトアップ（一番基本）、Redux、recoilなどがある

## useEffect()とは？？

第2引数を取ることができる、その引数が変わったときだけを見る事ができる

```javascript
useEffect(() => {
    一回目に動く処理
}, []);
```

## useContextとは？？
stateのバケツリレーを回避できる。
stateでわたさなくても。データレイヤーから取得できる

## Reactが再レンダリングする条件

①stateが更新されてコンポーネント
②propsが更新されてコンポーネント
③再レンダリングされたコンポーネント配下の子要素は再レンダリング
※ステートが再レンダリングされたときのみ、再レンダリングされるような仕組みを作れるのがmemo、useCallback、useMemo

## カスタムフック
- 共通化できる、共通化するときはカスタムフックもしくはコンポーネント化する
- 名前は先頭にuseをつける

## CSSのあてかた

- InlineStyle注意点
①ーで書かず、キャメルケースに変換する

- CSSモジュール
①書き方はCSSで書く
手順はCSSファイルをかく→モジュールファイルでインポートする→classNameでクラスを当てる

- StyledJsx
JSの中にCSSをかいていくようなイメージ
CSSのような書き方ができる

- StyledComponents(人気上位みたい)

- Emotion
Node.jsでDeepl APIをたたいて、日本語翻訳をLINE Botに出力

##はじめに
翻訳APIにはgoogleやMicrosoftのものなど
いろいろあるみたいですが
今回は**Deepl API**を使用します。

Deepl APIをNode.jsで叩く記事はあまりなかった印象でした。


今回は、この[記事](https://qiita.com/tomosukesan/items/b4c34713f1f709d856e8)の続きのような感じです。

https://qiita.com/tomosukesan/items/b4c34713f1f709d856e8


流れとしては、下記の通りです。
1. LINEのメッセージを受け取る
2. 格言APIで英語の文章を取得
3. 取得した文章をDeepl APIに渡す
4. 翻訳された結果をLINEのメッセージに出力


##Deeplへの登録
Deeplへの登録やAPIキーの場所などはこちらを参照しました。

https://insource-mkd.co.jp/staff-blog/29452.html

##Deeplのnpmをインストール
deeplのnpm（Node Package Manager）があるのでそれをインストール

https://www.npmjs.com/package/deepl

ターミナル上で任意のフォルダに移動し`npm install deepl --save`を実行。特になにも起こりませんが、大丈夫なはずです。

上記サイトの「**Usage**」を参考に、下記コードを作成しました。

##全体像のコード
```javascript
'use strict';

//格言APIを叩ける
const axios = require('axios');
//DeeplのAPI
const translate = require("deepl");

const express = require('express');
const line = require('@line/bot-sdk');
const PORT = process.env.PORT || 3000;

const config = {
    channelSecret: 'XXXXXXXX', // LINEシークレットチャネル
    channelAccessToken: 'XXXXXXXX' // LINEアクセストークンチャネル
};

const app = express();

app.post('/webhook', line.middleware(config), (req, res) => {
    console.log(req.body.events);

    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

const client = new line.Client(config);

//LINEのメッセージを受けると実行される関数
async function handleEvent(event) {
  let text_ja = '';　　//ここに出力する日本語を格納する
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }
  const res = await axios.get('https://api.adviceslip.com/advice');
  const text_en = res.data.slip.advice; //任意のAPIから獲得した英語の格言を格納
  console.log(text_en);
  
  translate({
    free_api: true, // ← フリープランのみ記載
    text: text_en,
    target_lang: 'JA',
    auth_key: 'XXXXXXXX', // ここにDeeplのAPIキーを入力
  })
    .then(result => {
      text_ja = result.data.translations[0].text; //Deeplで翻訳された文章をtext_ja変数に格納
      console.log(text_ja);
      client.replyMessage(event.replyToken, {
        type: 'text',
        text: text_en +'\n'+ text_ja //英語の格言と、日本語に翻訳されたものがLINEで通知される
      });
    })
    .catch(error => {
      console.error(error)
    });
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);
```


##おわりに
Deepl APIをNode.jsを使って出力しているケースがそう多くなかったので結構手間がかかりました...。

とても綺麗なコードとは言えませんが、
スコープの知識がもっと深ければうまくできる方法はありそうです。

少しでもお力になれれば幸いです。
FastAPIで作るWebアプリ - Body validation

今回はFastAPIのRequest BodyのValidationについてです。

【過去記事】
[Python Asyncio入門](https://qiita.com/sand/items/0e445a13d81d20ea33c3)
[Aiohttpで作るSimple Web Server - Qiita](https://qiita.com/sand/items/971c851598ff59c1c905)
[Starletteで作る Simple Web Server - QIita](https://qiita.com/sand/items/dd622ce4f9249399974c)
[FastAPIで作るWebアプリ - 基本](https://qiita.com/sand/items/bba0913fe4504c612b3a)
[FastAPIで作るWebアプリ - validation](https://qiita.com/sand/items/85068532388826258df4)
[FastAPIで作るWebアプリ - Body validation](https://qiita.com/sand/items/470b33d7539713432090)
[FastAPIで作るWebアプリ - Form validation](https://qiita.com/sand/items/207f306bdacdc0fb9571)

[FastAPI 公式サイト](https://fastapi.tiangolo.com/ja/)


# 1.基本的なBody関数

```python:body1.py
from fastapi import Body, FastAPI

app = FastAPI()

@app.post("/items/")
async def create_item(name: str=Body(...), price: float=Body(...)):
    return {"name": name, "price": price}
```


「[FastAPIで作るWebアプリ - validation](https://qiita.com/sand/items/85068532388826258df4)」で述べたようにクエリパラメータの場合は<b>Query()</b>関数が使われますが、リクエストボディの場合は<b>Body()</b>が用いられます。

**(補足2022/07/22）**
(...)はPythonの値で**Ellipsis**と呼ばれています。
**PydanticとFastAPI において、Ellipsisは値の指定が必須であることを表現するために使われています。**
[Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/)


プログラムを起動します。

```
uvicorn body1:app --reload
```

以下の正常なデータをRequestします。

```
curl -X 'POST' 'http://localhost:8000/items/' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"name": "Hanako", "price": 12.5}'
```

サーバ側は200 okで、クライアント側は以下のメッセージを受け取ります。

```
{"name":"Hanako","price":12.5}
```


# 2.Pydantic modelsでスマートな検証
**Pydantic** はデータ検証のためのPythonライブラリです。Pythonのtype hintが使われます。
前に取り上げたプログラムを再掲載して、より詳細な説明を加えます。

```python:body2.py
from fastapi import FastAPI
from typing import Optional
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

@app.post("/items/")
async def create_item(item: Item):
    return item
```

* まずすべての基本となるBaseClassをimportします。
* 次に、それを継承する、われわれのClassであるItemを定義します。Itemの任意のプロパティはtype hintをもちます。これを基にPydanticは送られてきたBodyの検証を行います。
* 最後に引数item のtype hintにItemを指定します。FastAPIはRequestのBodyが型Itemを持っていると知っていて、検証を行います。

以下の正常なデータをRequestします。

```
curl -X 'POST' 'http://localhost:8000/items/' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"name": "Hanako", "price": 12.5}'
```

サーバ側は200 okで、クライアント側は以下のメッセージを受け取ります。

```
{"name":"Hanako","description":null,"price":12.5,"tax":null}
```

以下のエラーデータをRequestしてみます

```
curl -X 'POST' 'http://localhost:8000/items/' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"name": "Hanako", "price": "abc"}'
```

サーバ側は422 Unprocessable Entityを出力し、クライアント側には以下のエラーメッセージを送ります。

```
{"detail":[{"loc":["body","price"],"msg":"value is not a valid float","type":"type_error.float"}]}
```

これは個人的には結構スマートな機能だと思います。

今回は以上です。
Ubuntuが黒画面でカーソルが点滅するだけになったら

# 現象
真っ黒な画面にカーソルが点滅するだけで、OSログイン画面がでなくなった。

# 対応
1. `ALT + CONTROL + F2`を押下
1. プロンプトが立ち上がるのでrootログイン
1. startx

# 自分の事例
var/logsに大量のログがあり、ディスク容量が枯渇していた模様。
logをtailで覗いたところ、大量の「ファイルを開きすぎです」が出力されていた・・・。
iOS15 Navigation Bar TitleのFont / Colorの設定方法

iOS15でNavigation Barの背景色が透明に変わましたが、付随してタイトルの文字色の設定も少し手こずったのでメモしておきます。

## 該当箇所
![スクリーンショット 2021-10-30 13.15.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505421/c0862e54-5067-69ce-5190-43a34afdc698.png)

## 手順

- Navigation ControllerのBarを選択
![スクリーンショット 2021-10-30 13.33.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505421/00704a0c-7d70-e4f5-ef7a-fa928c9a15ed.png)

- `Appearances`　> `Standard`, `Scroll Edge`
![スクリーンショット 2021-10-30 13.25.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505421/0988edec-683a-e940-09df-21d1dfd63db7.png)

- 下のTable Viewが一番上に来ているとき、`Scroll Edge Text Attributes`が適用
- それ以外のとき（少しでもスクロールしているとき）は、`Standard Text Attributes`が適用
- Titleを`Inherited`ではなく、`Custom`にして、Title　Font　/ Colorをそれぞれに設定する

![スクリーンショット 2021-10-30 13.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505421/5afb5863-244a-0d7e-dca5-f67c24a1fbd6.png)
TypeScriptを基本からまとめてみた【1】【環境構築】

##TypeScriptとは

- TypeScriptは、JavaScriptを拡張して作られたプログラミング言語で、2014年頃にMicrosoftによって開発・発表された。

- TypeScriptで書かれたコードをコンパイルするとJavaScriptのコードに変換されるため、JavaScriptファイルが実行できる環境ならすぐに使えて、JavaScriptライブラリもTypeScriptから使用できるなど、互換性の高さが特徴。

- TypeScriptは、大人数のプログラマーが開発に携わる場合でもエラーを防ぎやすいように設計されて、変数のデータ型をあらかじめ決められることや、1つの関数定義で異なるデータ型の引数を処理できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/df4b8bd0-4e46-6b73-2fb6-281b7761c66c.png)

##webpackとは

公式サイト : [webpack](https://webpack.js.org/)

- webpackは、JavaScriptなどの複数のモジュールをひとつにまとめるツール。
- webpackを使うことで、複数のjsファイルをひとつのjsファイルにまとめたり、複数のsassファイルをひとつのsassファイルにしたりできる。

#####※ モジュールとは、プログラム内のJavaScriptファイル（以下：jsファイル）やsassファイルなどのこと。

##ビルドとは

ビルドとは、プログラミング言語で書かれたソースコードにバグ(異常)がないかを解析し、バグがなければソースコードを機械語に翻訳・リンクし、実行可能ファイルに変換して組み立てること。1つの作業のことを指すのではなく、解析から実行可能ファイルを組み立てるところまでの一連の流れのことを指す。
単一なソースコードのプログラムであればコンパイルするだけでいいが、複雑な仕組みのソフトウェアは、多くのソースコードを使って構成されていて、それらをリンクして組み合わせるという作業が必要になる。この、コンパイルからリンクまでの一連の作業をまとめてビルドと言う。

##Node 環境の確認とインストール

```
1.Homebrewのバージョンを確認
brew --version

2.インストールされていなければ実行
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

3.nodebrewのインストール
brew install nodebrew

4.nodeの安定バージョンをインストール
nodebrew install stable

5.nodebrewのバージョン一覧を確認
nodebrew ls

6.インストールしたバージョンを指定して切り替える
nodebrew use v14.15.3

7.nodeのパスを通す
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zprofile'

8.ターミナルの再起動

9.nodeとnpmのバージョン確認
node -v
npm -v
```

##TypeScript 環境の構築

```
1.開発用ディレクトリの作成
mkdir ~/<YOUR_DEV_DIR>/ts-basic

2.npmの初期化
npm init

3.関連パッケージのインストール(※)
npm install --save-dev typescript ts-loader webpack webpack-cli webpack-dev-server

4.webpack.config.jsの作成と設定

5.tsconfig.jsonの作成と設定
tsc --init
```

#####※ 実行時にgyp: No Xcode or CLT version detected!のエラーが出たら
Mac OSに入っているXCodeのバージョンと、コマンドラインツールのバージョンが合っていないという理由で怒られているので、以下手順でコマンドラインツールのバージョンをアップデートする。

sudo付きのコマンドはMac OSのパスワード入力が必要。 
4.を実行すると、コマンドラインツールをインストールするか聞かれるので、
同意して進める。

```
sudo rm -rf $(xcode-select -print-path)
sudo rm -rf /Library/Developer/CommandLineTools
sudo xcode-select --reset
xcode-select --install
xcode-select -p
```

5.の実行結果が/Library/Developer/CommandLineToolsでなければ
sudo xcode-select -switch /Library/Developer/CommandLineToolsを実行する。
インストールが完了したら、「3.関連パッケージのインストール」のコマンドを再実行する。
##参考サイト

[【お知らせ】新講座開講 - これからTypeScriptを始める全ての人たちへ【日本一わかりやすいTypeScript入門】]
(https://www.youtube.com/watch?v=kd8VH10jXwc&t=658s)
[【日本一わかりやすいTypeScript入門】tsconfigとWebpackの設定を理解して環境構築]
(https://www.youtube.com/watch?v=qSHlXcSces8&t=642s)
[TypeScriptを入門者向けに解説！JavaScriptとの違いや勉強法までわかりやすく]
(https://udemy.benesse.co.jp/development/system/typescript.html)
[webpackとは？使い方と導入するメリットをわかりやすく解説]
(https://goworkship.com/magazine/how-to-webpack/)
[ビルドとは？仕組みや流れを解説]
(https://pecopla.net/web-column/build-system)
AWS 認定クラウドプラクティショナーを自宅でオンライン受験した話し

# 初めに
この記事は過日AWS認定クラウドプラクティショナー(CLF-C01)試験をオンラインで受験したので、その準備と感想を記載したものです。

###オンライン受験した理由
近隣のテストセンター（一か所のみ）を検索するが、ほとんど開催していなくて、なかなか自分の都合に合わせられないことから、自宅受験一択な感じでした。
自宅受験した方の記事を参考にしたところ、何もない部屋があれば可能（風呂場で受験した方もいましたね）と書いてありましたので、自分の部屋を整理整頓するのも兼ねてトライすることに。

###受験に向けて学習したこと
 9月にクラテクに入会、永久会員となったことで資格取得を決意。
ただし、SAAレベルには程遠いのでCLFから入るため、ハンズオンのEC2講座までを。
他には、Udamyで以下を購入
・この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）
・これだけでOK! AWS認定クラウドプラクティショナー試験突破講座（豊富な試験問題290問付き）
やり方としては、模擬試験を繰り返しインプットするスタイルでした。

###受験申込
10月までに取得することを決めていたので、29日（金）をXデーとました。
申込後に「システムテスト」実施するように書かれていたので、手持ちのPCで確認。
マイク、スピーカー、Webカメラのチェック、パスするとネットワークのチェックが自動的に進みました。

###試験環境
Internet-[auひかり]---[ホームゲートウェイ]---[Switch]---[PC:Windows10]

###試験日当日
試験自体は11:45～、その30分前にチェックイン可能となりました。
チェックイン前に、もう一度システムテストを実施。
すると、ネットワークエラー（75%）で止まること数回💦
こうなるとパニックですね、Switchを外してルーターに直結したり、PC再起動したり。
原因不明ですが、Switchを元に戻し再トライすることで事なき得ました。
もう模擬問題集を眺める余裕はありませんね、チェックインまで待ちました。

その後チェックイン、スマホを使って身分証明書の送信、受験する部屋の写真を4枚撮影して送信しました。
しばらくすると、試験監督からチャット連絡がありチャットで注意事項の確認、問題なければWebカメラ越しに〇をポーズ。このやり方って斬新で良いですね。
ほかに、写真確認後にHUBとメガネのチェック。これがPC内蔵Webカメラだと面倒でした、外付けWebカメラが使えない状態だったのでPCを持ちながらHUBを見せたりしていました。
開始時間前に準備がスムーズに終わったようなので、11:45を待たずに試験に突入しました。

###試験について
テストセンターで受験する画面と同じでした、ボタンの配置などを考えるとモニターが広いと使い辛い気がしました。私は14インチワイドのPCでしたので、画面は丁度よい感じでしたね。
あと、いつも思うけど、なんでフォントは明朝なのかなーと(笑)

試験は90分でカウントダウンタイマースタート、30分くらいで65問目まで進みました。
残り60分で2回の見直しを行いますが、25分くらいを残して終了。
結果がでるまで心臓バクバクですね、身体に悪いです💦

###試験を終えて
結果の画面に「合格」の表示はありましたが、その後はメールで案内など無くて、見間違えていないかなど不安でした。
が、夜になって結果より先にCredkyからバッジの案内メールが届いて一安心。
自宅でオンライン受験は地方在住者には有り難い仕組みです、コロナ禍で取り組まれた新スタイルだと思いますので続けて欲しいです。
試験開始までの準備（部屋の整理整頓、要外付けWebカメラ）ややり方など覚えましたので、次回以降もオンライン受験を選択したいと思います。
[メモ]N次元配列。

## 一次元

```python
M = [0, 1, 2]
print(M[0])
# 0
# N^1=3
```

## 二次元

```python
M = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
print(M[0][1])
# 1
# N^2=9
```

## 三次元

```python
M = [[[0, 1, 2], [3, 4, 5], [6, 7, 8]], [[0, 1, 2], [3, 4, 5], [6, 7, 8]], [[0, 1, 2], [3, 4, 5], [6, 7, 8]]]
print(M[0][1][2])
# 5
# N^3=27
```

## 四次元

```python
M = [[[[0, 1, 2], [3, 4, 5], [6, 7, 8]], [[0, 1, 2], [3, 4, 5], [6, 7, 8]], [[0, 1, 2], [3, 4, 5], [6, 7, 8]]], [[[0, 1, 2], [3, 4, 5], [6, 7, 8]], [[0, 1, 2], [3, 4, 5], [6, 7, 8]], [[0, 1, 2], [3, 4, 5], [6, 7, 8]]], [[[0, 1, 2], [3, 4, 5], [6, 7, 8]], [[0, 1, 2], [3, 4, 5], [6, 7, 8]], [[0, 1, 2], [3, 4, 5], [6, 7, 8]]]]
print(M[0][1][2][0])
# 6
# N^4=81
```
【Unity】BioIKの使い方を調べてみた

# はじめに
人間やロボットの関節の角度を指定した座標に目標オブジェクト座標が到達するように自動で計算してくれるIK（逆運動学）のAssetはFinalIKが有名ですが、先日のUnityStationで@chikutaさんがBioIKを紹介されていました。
使い方を調べたところ、READMEに翻訳をかけてみると変な文章になったり、FinalIKに比べて圧倒的に情報が少ないため、調べて記事として掲載することにしました。
※サンプルシーンを見れば使い方を理解できるよー、って方は見る必要がない記事だと思います。自分はFinalIKと使い方が少し違うので、直ぐに理解できなかったです。

UnityStationのBioIK説明LT

https://youtu.be/LlQX-BVLeRg?t=9092

* @chikutaさんに直接色々質問していたら、GitHubにソースコードを公開して頂けました。本当にありがとうございます！

https://github.com/chikuta/unity_urdf_avatar


# IKアセット
FinalIKと比べると格安なので、FinalIKをセールで買えていない人は検討してみては如何でしょうか？

### BioIK 
* $22
* URDFに対応している？←対応方法調査中


https://assetstore.unity.com/packages/tools/animation/bio-ik-67819

### FinalIK
* $99
* ボーンに対応している
 
https://assetstore.unity.com/packages/tools/animation/final-ik-14290

# 右腕を動かす場合の基本的な流れ

1. モデルのrootにBioIKコンポーネントをアタッチする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/1747bf76-2a85-6fcd-c65b-080d23737f72.png)

1. Gizumosを可視化する
→BioIKで制御できる部分が可視化できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/afcc0d0f-4e19-00f5-245f-55baa0188175.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/d126cc83-9835-625a-0658-a2c3c43b4b18.png)

1. 可動させたいオブジェクトを選択してAddJointを押す。今回は右肩
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/41a90f5a-d229-d390-d2a5-2bbda20351b3.png)



1. 動かしたい回転方向"*Motion"のEnableを押す。今回はxyz全て選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/45d2c068-c42f-f066-3774-c8b913cc3250.png)

1. 稼働域の設定が必要な場合はLowerLimit UpperLimitに下限、上限角度を設定し、指定不要の場合はConstrainedを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/c42b4d03-62f8-bd9c-20f5-bde3732f531d.png)

1. ターゲットの座標に合わせたいオブジェクトを選択し、AddObjectiveからAddPositionを選択し、適当にターゲットオブジェクトを生成し、TargetTransformにアタッチする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/12784952-dd90-502b-29c6-5f30ba7b91db.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/b3409731-32cd-c63f-6420-0fc8d7a7a97c.png)

1. 再生ボタンを押し、Sceneビューでターゲットを動かすと、ターゲット位置に合わせようと先ほど設定した関節が動作する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/005a36f2-ad4f-bac0-e936-44406f4e2435.png)

1. その他関節も調整する
以下動画で可動域等の設定を行っています。
<iframe width="560" height="315" src="https://www.youtube.com/embed/EvzOXUjTK34" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

以上
【学習記録⑩】算出プロパティを用いてテキストフォーマットを適用する！

# はじめに
Vue.jsを最近勉強し始めたので学んだ文法などを備忘録としてメモしていこうと思います。
今回は算出プロパティを用いてテキストフォーマットを適用してみます。
Vue.js 2ではfilterを用いて行うのが一般的だったようですがVue.js 3からはfilterはなくなり、算出プロパティか関数で行うことが推奨されているようです。

https://v3.ja.vuejs.org/guide/migration/filters.html

ちなみに算出プロパティと関数(methods)の違いについては学習記録①にて簡単に解説しています。

https://qiita.com/Ooooooomin_365/items/ed5a206b201bedc6a3fd#computed%E3%81%A8methods%E3%81%AE%E9%81%95%E3%81%84

## サンプルコード
それでは算出プロパティを用いて出力される文字にテキストフォーマットを適用してみましょう。
今回は出力される文字を大文字にしてみたいと思います。

```vue:Morning.vue
<template>
  <div>
    <div>{{ greetMessage }}</div>
    <div>{{ greetMessageToUpperCase }}</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      greetMessage: "Good Morning!",
    };
  },
  computed: {
    greetMessageToUpperCase() {
      return this.greetMessage.toUpperCase();
    },
  },
};
</script>
```

```vue:App.vue
<template>
  <div>
    <morning></morning>
  </div>
</template>

<script>
import Morning from "./components/Morning.vue";

export default {
  components: {
    Morning
  },
};
</script>
```

`Morning.vue`の算出プロパティ`greetMessageToUpperCase`が今回のテキストフォーマットを表しています。
（Vue.js 2だとfilters内に任意の関数を書き、その引数で任意の値が指定できるのですが、算出プロパティの場合はそれぞれの値ごとに作る必要があるのかな...？）

## 結果
以下のように`greetMessageToUpperCase`を適用した部分が大文字になっています。
![pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/136a5e11-0f20-0cd7-50f4-9763b9431952.png)

# おわりに
今回は算出プロパティを用いたテキストフォーマットについて学びました。
次回は複数の同じ内容をまとめる`mixin`についてまとめていこうと思います！
【Swift】バーコードリーダーの検出エリアを設定

Swiftでバーコードの検出エリアを実装する方法。

またユーザーにもエリアが分かりやすいように枠線のUIViewも表示する。

## 実際に書くコード

```swift
import AVFoundation

// 背面カメラと読み込む情報を繋ぐためのオブジェクト
let session = AVCaptureSession()

//出力用のメタデータのオブジェクト
let output = AVCaptureMetadataOutput()
session.addOutput(output)

//outputの設定(delegateの設定)
output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)  
//ouputの設定(何を検出するか JAN=EAN)
output.metadataObjectTypes = [.ean8, .ean13] 

let x: CGFloat = 0.1
let y: CGFloat = 0.4
let width: CGFloat = 0.8
let height: CGFloat = 0.2

//検出エリアの設定
output.rectOfInterest = CGRect(x: y,y: 1-x-width,width: height,height: width)

//captureを開始
session.startRunning()

```

`import AVFoundation`を忘れないようにしましょう。

ただこのままだとバーコードの読み込み範囲が画面から分かりにくいので、範囲を示す枠線のviewも表示させる。

```swift
let x: CGFloat = 0.1
let y: CGFloat = 0.4
let width: CGFloat = 0.8
let height: CGFloat = 0.2

//枠線の表示
let loadArea = UIView()
loadArea.frame = CGRect(x: view.frame.size.width * x, y: view.frame.size.height * y, width: view.frame.size.width * width, height: view.frame.size.height * height)
loadArea.layer.borderColor = UIColor.red.cgColor
loadArea.layer.borderWidth = 4
loadArea.layer.cornerRadius = 6
loadArea.clipsToBounds = true
self.view.addSubview(loadArea)
```

これで`rectOfInterest`と同じ場所に赤い枠が表示されるようになります。

## 参考

https://developer.apple.com/documentation/avfoundation/avcapturesession

https://developer.apple.com/documentation/avfoundation/avcapturemetadataoutput

https://dev.classmethod.jp/articles/ios-avfoundation-avcapturemetadataoutput-ean13-ean8/

## おすすめ情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
ScrollableなComposableでコンテンツをレイアウトいっぱいに表示させる方法

`verticalScroll`　/　`horizontalScroll`、`LazyColumn`　/　`LazyRow` などの Scrollable な Composable の中では、コンテンツのサイズが定まらないため `fillMaxSize` などを使用してレイアウトいっぱいに何かを表示させることができません。

例えばリストで空の表示を画面いっぱいに出したいとして以下のようなコードを実装してもテキストは真ん中に表示されません。

```kotlin
@Composable
fun Sample() {
    LazyColumn(
        modifier = Modifier.fillMaxSize()
    ) {
        item {
            Box(
                modifier = Modifier.fillMaxSize(),
                contentAlignment = Alignment.Center
            ) {
                Text(text = "Empty state")
            }
        }
    }
}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/c33d7f4e-0a0f-5c8e-2ced-2c3fa53095e5.png" width="200px" />


AndroidView の `ScrollView` の場合は `android:fillViewport="true"` を使ってレイアウトいっぱいに表示させていました。



Compose ではこの場合に `BoxWithConstraints` で外側から Composable のレイアウトのサイズを渡すことで表現することができます。


```kotlin
@Composable
fun Sample() {
    BoxWithConstraints {
        val width = maxWidth
        val height = maxHeight
        LazyColumn(
            modifier = Modifier.fillMaxSize()
        ) {
            item {
                Box(
                    modifier = Modifier.size(width, height),
                    contentAlignment = Alignment.Center
                ) {
                    Text(text = "Empty state")
                }
            }
        }
    }
}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/06316e9e-6567-ab22-1ad6-3636a1c238ef.png" width="200px" />


`BoxWithConstraints` を使うことで Composable がとりうるサイズを取得できるのでとても便利です。
「Requested runtime is not available for this stack」エラーがruntime.txtを削除したら直った話

###出現したエラー
HerokuにPythonで書いたアプリをデプロイしようとしたら「Requested runtime is not available for this stack」エラーが出て、詰まりました。
### 情報収集
ネットで検索すると様々な原因と解決策が出てきました

1. runtime.txtの記法は正しいか？
→ `python-3.8.12`と書いていました。pは小文字で、間にハイフンを付けていますから間違っていないはずです

2. 指定したバージョンはサポートされているか？
→https://devcenter.heroku.com/articles/python-support#specifying-a-python-version
を参考にしました。`python-3.8.12`は対応しているはずです
（2021年10月当時です。今は変わっているかもしれません）

3. Python buildpackは最新か？
→https://devcenter.heroku.com/articles/python-support#checking-the-python-buildpack-version
を参考に一度ビルドパックをクリアして`heroku/python`を入れ直しましたが、エラーは直りませんでした

4. Stackを変更してみるのはどうか？
元々のstackが`Heroku-20`だったので、`Heroku-18`に変更してみましたが、やはりエラーは直りませんでした

###思わぬ解決策
手詰まりになったので、https://devcenter.heroku.com/articles/python-support#checking-the-python-buildpack-version
を読んでいると、気になる記述がありました
>By default, newly created Python apps use the python-3.9.7 runtime

「あれ？　これバージョン指定しなくてもよくない？」
試しに僕は__runtime.txtを削除__してみました

するとデフォルトの`python-3.9.7`がインストールされて、無事デプロイ出来ました！
`python-3.9.7`で動くアプリケーションなら、runtime.txtを削除するのも手ですね
Kubernetes The Hard Way On VirtualBox でCSRが発行されない問題を解決

最近kubernetesの勉強のため、Kubernetes The Hard Way On VirtualBox をやってます。
その中の、`TLS Bootstrapping Worker Nodes`でハマったところが２つあるので内容をまとめます。

https://github.com/mmumshad/kubernetes-the-hard-way

# Bootstrap Token の expiration を未来日に変える

### Step 1 Create the Boostrap Token to be used by Nodes(Kubelets) to invoke Certificate API

Github 上のソースでは expiration が既に過去日になっているので、未来日に変更します。
過去日になっているとクラスターに参加できなくなります。
このことはソースのすぐ下に書いてあるんですが、見落としがちなので注意します。

```shell
master-1$ cat > bootstrap-token-07401b.yaml <<EOF
...
  # Expiration. Optional.
  expiration: 2021-03-10T03:22:11Z <- ここを未来日に
...
EOF
```

# rotate-server-certificates オプションを追加する

### Step 6 Configure Kubelet Service

次は`worker-2`側でkubeletのユニットファイルを作成するところで、オプションが一つ抜けているので追加します。
このオプションがなくても、`worker-2`はクラスターに参加できるんですが、`csr`が発行されないため、そのあとにmasterから`kubectl logs <pod_name>`を実行しても証明書エラーになります。
PRは出てるみたいなんですが、まだマージされてないです:head_bandage:

```shell
worker-2$ cat <<EOF | sudo tee /etc/systemd/system/kubelet.service
...
  --rotate-certificates=true \\
  --rotate-server-certificates=true \\ <- ここを追加
...
EOF
```
Pythonで開発をするための準備

いざPythonで開発をしてみようと思った時に準備したまとめ。
# 環境

- OS: macOS 12.0.1
- Shell: zsh

#1. Pythonのバージョン確認
Macには標準でPython2とPython3がインストールされています。
過去の経緯などでPython2を使う必要がある人もいることを考慮してくれているのだろうか。
これから触り始めるのでここではPython3向けに進めます。

```:python3
$python3 --version
```
これでバージョンが調べられます。


```:結果
Python 3.8.9
```

ちなみに、Python2のバージョンを調べたい時はpython3の部分をpythonに変えればOK。

#2.Pythonライブラリのアップデートとインストール
PyPI(Python Package Index)からライブラリをインストールするためにpipといるツールを使用します。

ターミナルからpipコマンドを実行するのですが、使用している環境ではpipはcommand not foundになります。この環境ではpipではなくpip3というコマンドを使います。
とりあずインストールされているパッケージを確認します。

```:pip
$pip3 list
```
```:結果
Package    Version
---------- -------
pip        20.2.3
setuptools 49.2.1
six        1.15.0
wheel      0.33.1
WARNING: You are using pip version 20.2.3; however, version 21.3.1 is available.
You should consider upgrading via the '/Applications/Xcode.app/Contents/Developer/usr/bin/python3 -m pip install --upgrade pip' command.
```

早速WARNINGが出ました。
要はpipのバージョンが古いですよ、ということです。書かれているコマンドでバージョンアップしてあげればWARNINGも消えます。

```
$python3 -m pip install --upgrade pip
```
再度リストを表示するとpipもバージョンアップしています。WARNINGも出ません。

```
Package    Version
---------- -------
pip        21.3.1
setuptools 49.2.1
six        1.15.0
wheel      0.33.1
```

#3. Requestsモジュールのインストール
pipをバージョンアップしたので、モジュールのインストールもしてみたいと思います。
HTTP通信をするためのRequestsモジュールをインストールします。

```:Requestsモジュールのインストール
$pip3 install requests
```
実行するとインストールが始まります。
最後に以下の文章が表示されればインストール完了。

```
Successfully installed certifi-2021.10.8 charset-normalizer-2.0.7 idna-3.3 requests-2.26.0 urllib3-1.26.7
```

以降は必要に応じて同様の手順でモジュールを追加していきます。

#4. パッケージインストール時のWARNING
pipのバージョンアップやモジュールインストールの際に以下のようなWARANINGが出ることがあります。（XXXはユーザ名）

```
WARNING: The script normalizer is installed in '/Users/XXX/Library/Python/3.8/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
```
スクリプトはインストールできたけど、~/Library/Python/3.8/binにパスが通っていない、ということを言われてます。
なのでパスを通します。現在macOSのシェルはzshが標準になっているので、zshでパスを通します。
この場合、編集するファイルは~/.zshrcになります。
vi等で.zshrcを開いて

```
export PATH="/Users/XXX/Library/Python/3.8/bin:$PATH"
```

を追記して保存。
保存したらターミナルの再起動がsourceコマンドで反映させるのを忘れずに。

#参考
以下のサイトを参考にしています。

- [PythonのRequestsモジュールの使い方【初心者向け】](https://techacademy.jp/magazine/19195)

- [pip/pip3のパッケージインストール時にWARNINGが出るときの対応](https://www.exceedsystem.net/2020/09/29/1321/)
Unityでのデータのセーブ/ロード方法

Unityでのデータ保存方法について。
[ここ](https://light11.hatenadiary.com/entry/2019/10/07/031405)とか[ここ](https://qiita.com/JunNishimura/items/05745bea6f0a2bb6f0b9)
とかを見ながら自分なりに残しておく。
バージョンは2020.3.12f1

## 保存場所
Pathは

 * Application.persistentDataPath
 * Application.temporaryCachePath

のどちらかを通常は選択する。
Application.persistentDataPathは一般的なファイル保存のための場所。ゲームのセーブ等はこちら。
Application.temporaryCachePathは消される可能性があるため、キャッシュとして利用する。ランキングデータの一時保存等か。。

上の方はUnityEngine.iOS.Device.SetNoBackupFlag()でiOSのクラウド同期の有無を設定可能。
AndroidはSDカードへの保存をどうするかを指定出来て、PlayerSettingsのOther SettingsからWrite Permissionの設定で。

PlayerPrefsというUnityの標準機能はアプリの設定情報程度なら使えそう。

## 実際の保存方法

基本的にはシリアライズしたデータをバイナリで保存するのが一番汎用性が高そう。
JSONでも良いが、JSONの場合は暗号化とかしないと改変が非常に簡単。
（軽く調べるとAesEncryptとかでそれほど手間をかけずに暗号化は出来そう）
バイナリも解析できるが、どこまで頑張る必要があるか次第。

というわけで以下のクラスを保存するというのを実際にやってみる。
とりあえず座標位置をセーブしてみる。
setter/getterが面倒なのでPublicにしている

セーブ対象クラス

```C#:SaveData
[System.Serializable]
public class SaveData {
    public float x;
    public float y;
    public float z;
}
```

セーブデータを扱うクラス

```C#:SaveManager
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;

public class SaveManager  {
    private string SaveDirPath;
    public void DataSave(SaveData sdata, string fpath, string fname) {
        // バイナリで保存
        BinaryFormatter bf = new BinaryFormatter();
        string saveFilePath = System.IO.Path.Combine(fpath, fname);
        using (FileStream file = File.Create(saveFilePath)) {
            bf.Serialize(file, sdata);
        }
    }

    public SaveData DataLoad(string fpath, string fname) {
        string loadFilePath = System.IO.Path.Combine(fpath, fname);
        if (!File.Exists(loadFilePath)) {
            Debug.Log("No Load Data. " + loadFilePath);
            return null;
        }
        BinaryFormatter bf = new BinaryFormatter();
        SaveData sdata;
        using (FileStream file = File.Open(loadFilePath, FileMode.Open)) {
            sdata = (SaveData)bf.Deserialize(file);
        }
        return sdata;
    }
    public SaveData CreateSaveData(Vector3 pos) {
        SaveData sdata = new SaveData();
        sdata.x = pos.x;
        sdata.y = pos.y;
        sdata.z = pos.z;
        return sdata;
    }
}


```

ファイルの保存場所はこのクラスで
`private string SaveDirPath = Application.persistentDataPath`
のようには取得出来ない。

> UnityException: get_persistentDataPath is not allowed to be called from a MonoBehaviour constructor

のようなエラーが出るのでMonoBehaviourを継承したクラスでAwakeで取得するといいエラーが出なかった。
今回は実際にプレーヤーコントロールを行っているクラスで設定して渡すようにしてやった。

```C#:Platformer2DUserContro
SaveManager saveManager = new SaveManager();
string SaveDirPath;

 private void Awake()
{
    //略
    SaveDirPath = Application.persistentDataPath;
}
private void Update()
{
    //略
    if (Input.GetKey(KeyCode.P)){
        SaveData sdata = saveManager.CreateSaveData(this.transform.position);
        saveManager.DataSave(sdata,SaveDirPath,"test.sv");
    }
    if (Input.GetKey(KeyCode.O)){
        SaveData sdata = saveManager.DataLoad(SaveDirPath,"test.sv");
        Vector3 pos= new Vector3(sdata.x,sdata.y,sdata.z);
        this.transform.position = pos;
    }
}
```

とりあえず、これで自キャラの位置をクイックセーブ、ロードのような形が出来たのでとりあえずはOK。
raspberry pi 1 model bで、navit その10

#概要

raspberry pi 1 model bで、navitやってみる。
3.5inch,tftを付けてみた。

#参考にしたページ。

https://qiita.com/lovebeer/items/8ff94504d3203527b41e



#設定

```
git clone https://github.com/goodtft/LCD-show.git
cd LCD-show
sudo ./LCD35-show

```

#写真

![DSCN0551.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8775dfda-c2c5-4e60-a090-9a322b99f65c.jpeg)

#結果

タッチスクリーンも、動きます。


以上。
AWS yumでハマった　Could not retrieve mirrorlist



AWSでyumでapacheを入れようとしてハマったメモです。
おそらく物凄いレベルの低い記事。（インフラ周り苦手。。）

#１．環境

InternetGateway →　VPC　→  publicサブネット　→ EC2(linux)

ネットワークACLルール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095609/0e5111f5-af07-019b-1c30-fbe8bab1634d.png)

#２．エラー内容

ルートになってからyumでinstall

```sh
[ec2-user@ip- ~]$ sudo -i
[root@ip- ~]# whoami
root
[root@ip- ~]# yum install httpd
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd

Could not retrieve mirrorlist https://amazonlinux-2-repos-us-east-2.s3.us-east-2.amazonaws.com/2/core/latest/x86_64/mirror.list error was
12: Timeout on https://amazonlinux-2-repos-us-east-2.s3.us-east-2.amazonaws.com/2/core/latest/x86_64/mirror.list: (28, 'Connection timed out after 5000 milliseconds')
```

#３．原因
アウトバウンドは開けてるのにな。。
インバウンド関係あるのかな？
って思って全部開けてみたら通りました。

#４.対処法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095609/45d0ffbe-829f-7b77-d8ea-ddd5fee77cf7.png)


```sh
[root@ip- ~]# yum install httpd
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                               | 3.7 kB     00:00
amzn2extra-docker                                        | 3.0 kB     00:00
(1/5): amzn2-core/2/x86_64/group_gz                        | 2.5 kB   00:00

～略～
Installed:
  httpd.x86_64 0:2.4.51-1.amzn2

Dependency Installed:
  apr.x86_64 0:1.7.0-9.amzn2
  apr-util.x86_64 0:1.6.1-5.amzn2.0.2
  apr-util-bdb.x86_64 0:1.6.1-5.amzn2.0.2
  generic-logos-httpd.noarch 0:18.0.0-4.amzn2
  httpd-filesystem.noarch 0:2.4.51-1.amzn2
  httpd-tools.x86_64 0:2.4.51-1.amzn2
  mailcap.noarch 0:2.1.41-2.amzn2
  mod_http2.x86_64 0:1.15.19-1.amzn2.0.1

Complete!
```


何番が必要だったんだろ。。
全部開けっ放しもイマイチですねー。

#５.おまけ

アパッチ立ち上げて稼働確認

```sh
[root@ip- ~]# systemctl start httpd
[root@ip- ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2021-10-30 01:51:21 UTC; 14s ago
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095609/32ff0fc0-5654-6550-6b22-b7c14c9d9cd6.png)
raspberry pi 1 model bで、navit その9

#概要

raspberry pi 1 model bで、navitやってみる。
Xを、おかしくしたので、desktop環境をlxdeに、してみる。

#設定

/etc/X11/xinit/xinitrc

```
. /etc/X11/Xsession


#. /etc/X11/Xsession
exec startlxde


```

#写真


![DSCN0550.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e4b4caa6-975e-1704-52d8-f9e155ff4c66.jpeg)


以上。
typescript環境開発時のエラー（初心者向け）

# 概要

備忘録がてら、Typescript を使った React 開発環境を構築する時に発生したエラーと対策をメモします。

# 手順

1. プロジェクトを作るフォルダに移動する
1. 下記コマンドを実行する

```
npx create-react-app . --tempalte typescript
```

# エラー発生

上記の設定で`npm start``を実行すると、下記のエラーが発生

```
Could not find a declaration file for module ‘react’.
```

原因を確認すると、どうも React が Typescript で書かれていないため、型提供が必要とのこと。<br>
下記コマンド実行することで解消しました。

```
yarn add -D @types/react
```

# 参考資料

[こちら](https://qiita.com/waniwaninowani/items/7ea8b4eacab296758c19)の記事を参考にしました。
TypeScript*アロー関数の型定義*

まずは関数の型から

```tsx
const Index = ({    }:引数の型):返り値の型 => {
return (
   ここが返り値で引数を使ったりもする
 )
}
```

次は変数宣言の型

```
let Index:変数の型 =  x
```

返り値の型はReact系列だとvoidかJSX.Elementを明示的に付けるくらいしかない。
引数の型はType Propsでゴリゴリ付けることになる。
変数の型はそのまま型を入れるだけ。

##通常の型
数字：number
文字列：string
条件分岐：boolean

##ボトム型
- 何もない=利用できない：null
- 関数は動くけど返り値を返さない：void
- そもそも値を持たない：never
- 初期化されていない：undefined

正直ボトムは全部知らなくていいし覚えなくていいと思う。

それで簡単なことを当然のようにやらなければ凄いこともできない。
Next.jsの特殊型で言うと

- GetStaticProps(記事一覧表示取得のimportで付ける型)
- GetStaticPaths(記事ページ表示のimportで付ける型)

需要のあるmapメソッドの型は
・map：StringConstructor

useStateで使う型は
・React.Dispatch<React.SetStateAction<普通の何かが入る>>

型がanyとか入ってなかったりするとESLintやサーバーがゲロ警告吐きまくる。
今までJavaScriptはぐちゃぐちゃのスライムみたいなイメージだったがTypeScriptは箱みたいなイメージだ。

依存関係の環境で型検査の厳格強度も変わるので全ての環境が一致すると断言できない。
MacBook Pro (14-inch, 2021)がきたー！セットアップを実施

今回の記事はプログラムコードは含まれていないが、今の所問題なく動いていることを報告するためにアップした。

2021年10月19日、Apple storeで注文したMavBook Pro (14-inch, 2021)が、10月27日、到着した。プロセッサは Apple M1 Pro、メモリは 16GB、ストレージは 512GB SSD。税込み ¥239,800 也。高い！　OSは、macOS Monterey  (Version 12.0)。初期設定後、即座に、12.0.1 にアップデート。
第一印象は、M1 MacBook Airと比べて、厚いし重い。M1 MacBook Air と同じ環境を作るべく、ソフトをインストールしテストランをかけたが、問題なく動く模様。
ただし、気になることが。M1 MacBook Air で作成した Python プログラムを実行し、処理時間を計測したところ、MacBook Proのほうが若干遅い。まあ、YouTube で公開されているベンチマークテストをみても、シングルコアでのスコアはほぼ同じ（Pro のほうが若干スコアは高い）なので、しょうがないか。本当は少し早くなることを期待していたのだが残念。重い処理になれば早くなることを期待。
画面の綺麗さとスピーカーの音の良さは前評判通り。また USB-C (Thunderbolt-4) 端子が３つ、両側に分かれて配置されているのがうれしい。MagSafeも復活したが、自宅で使用する際は、27-inch4K モニタに接続するため、USB-C Doc を介するので、そちらから充電するため、ありがたみはない。

![IMG_0139.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/460b8827-46b7-c519-8f9f-c63fa93784f2.jpeg)

![IMG_0140.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/c2ba35e7-08c9-ce00-907b-66abfc13de53.jpeg)

![IMG_0141.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/d27140f4-ea13-8279-7a41-c7ef16b79088.jpeg)


インストールしたものは以下の通り。これらは、それぞれの Web サイトよりダウンロードしてインストールした。

+ Google Chrome
+ Firefox
+ Google日本語入力
+ Microsoft 365
+ CotEditor
+ Visual Studio Code
+ Google Earth Pro
+ Homebrew

Homebrew はインストール後、以下の指示にしたがって ```.zprofile``` を更新し使用可能となる。

```
=> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/xx/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run `brew help` to get started
```

Homebrewが有効になったらこれを使って以下をインストール。

+ brew install gcc
+ brew install ghostscript
+ brew install gmt

Cはすでに入っているが、gfortranを使いため gcc をインストールしている。
また C や gfortran を使うために必要な、```Command Line Tools``` は自動でインストールしてくれる。これがHomebrew のインストール中か gcc のインストール中かは忘れてしまった（失礼）。

メインで使う Python 環境については、pyenv も使えるようになったようだが、ここは M1 MacBook Air で使用実績のある Miniforge3 を使うことに。インストールは、[自分の記事であるこちら](https://qiita.com/damyarou/items/f0e0b4026bdda94df46f)に従い実施。

インストール時点で Python のバージョンは、3.9.7 である。
```Conda install xxx```  でインストールしたモジュールは以下の通り。関連するものは自動でインストールされる。最近は PIllow は matplotlib と一緒にインストールされるようだ。

+ numpy
+ scipy
+ matplotlib
+ seaborn
+ pandas
+ scikit-learn
+ openpyxl
+ cartopy
+ jupyter
+ jupyterthemes

Jupyter はnotebookとlabがあるが、私は好みでいまだに notebook を使っている。
JUpyter notebook の設定は、```jt -l``` で使用できるテーマを確認。

```
jt -l
Available Themes: 
   chesterish
   grade3
   gruvboxd
   gruvboxl
   monokai
   oceans16
   onedork
   solarizedd
   solarizedl
```

私の場合は、oceans16 が気に入っているので、以下で oceans16 を選択し、パラメータのセッティングも行う。

```
jt -t oceans16 -fs 12 -ofs 12 -cellw 1200 -lineh 120 -N -T
```

以　上
iTerm2 で Mac の bash を新しくする方法

## install bash 5

```ruby
which bash   # /bin/bash

echo $BASH_VERSION # 3.2とか

brew install bash

/usr/local/bin/bash -l

echo $BASH_VERSION $SHELL        # 5.1になった

```

## Setup iTerms

デフォで /bin/bash を開くので、 `/usr/local/bin/bash -l` にする

login shellは /bin/bash
command は任意
custom command は何のことやらわからない。

```
/usr/local/bin/bash -l
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24737/8ea4be51-9e78-c024-8ad5-b5965fc865ba.png)
ラングトンのアリを描いてみた

### ラングトンのアリ

[ラングトンのアリ(Wiki)](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%82%B0%E3%83%88%E3%83%B3%E3%81%AE%E3%82%A2%E3%83%AA)によれば、以下の単純なルールを繰り返して描いたものとのこと。

> * 白いマスにアリがいた場合、90°右に方向転換し、そのマスの色を反転させ、1マス前進する。
> * 黒いマスにアリがいた場合、90°左に方向転換し、そのマスの色を反転させ、1マス前進する。

この手の図形はフラクタル幾何学的な繰り返しパターンを想像しますが、以下のようにn=10000程度まではほとんどランダムで、それ以降になると突如規則性が出来てある方向に道のようにまっすぐ伸びて行きます。何故そうなるかは分かっていないようです。

ちなみにこの道が出来始めてからはn=104の周期で黒のマスが12個ずつ増えていくことが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/57bf99a6-372f-d13f-c69b-4ca7538a5db9.png)

このことはEuler Project P349を解くのに役に立ちます。