OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub CodespacesでNode-REDを実行する方法

　世の中には、FlowForge、Siemens MindSphere、Prescient Devices、krysp.io などのNode-REDのサービスがたくさんあります。また、ソフトウェアコードをクラウドにデプロイする方法に精通している場合は、PaaS たはWeb IDE環境を使用してNode-REDフローエディタを実行することもできるでしょう。この記事では、Web IDE環境の1つであるGitHub CodespacesでNode-REDを実行する方法を紹介します。

# GitHub Codespacesとは?
　GitHub Codespasesは、GitHubに統合されたWeb IDEであり、GitHubアカウントを使用して使用できます。最近、すべてのユーザがCodespases環境を月60時間無料で使用できるようになりました。本時間の間、2つのCPU、4GBのメモリ、および32GBのストレージを利用可能です。Codespasesはコード開発だけでなく、Node-REDのような一時的なアプリケーションの実行にも適しています。

# CodespacesでNode-REDを実行する手順
　下記GitHubリポジトリにNode-RED用のCodespacesテンプレートを用意しました。

https://github.com/kazuhitoyokoi/node-red-codespaces

　以下は、このテンプレートの使用方法に関するステップバイステップの手順です。

## 1. GitHubアカウントを作成する
　GitHubアカウントを持っていない場合は、まず以下のURLからGitHubアカウントを作成してください。

https://github.com/signup
   
　アカウントに登録するには、メールアドレス、パスワード、ユーザ名などの情報を入力する必要があります。

## 2. GitHub Codespacesのタイムアウト時間を延長する
　デフォルトでは、Codespacesが用意した環境は30分で終了します。この時間はNode-REDのフローを開発するには短すぎるため、ユーザの設定URLからタイムアウト時間を延長します。

https://github.com/settings/codespaces#default-idle-timeout-header

　テキスト入力エリアに最大値の240分を入力します。
<kbd>![default-idle-timeout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/576e3f85-6cfb-c84b-61d7-4b8692bbe371.png)
</kbd>
## 3. GitHub Codespacesに移動する
　Node-REDテンプレートリポジトリにアクセスすると、右上隅に「Use this template」という緑色のボタンが表示されます。このボタンをクリックすると、選択可能な2つのオプションが表示されます。ここで「Open in a codespace」を選択して、Codespacesでテンプレートリポジトリを開きます。
![open-codespaces.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/2683af28-7446-c166-5ec9-74fc075c3239.png)
## 4. Node-REDフローエディタを開く
　約1分後、この環境は自動的にNode-REDをダウンロードして起動します。Node-REDフローエディタを使用する準備が整うと、ダイアログが右下隅にポップアップ表示されます。
![open-in-browser_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/a2099064-10de-fde2-793f-fd8963933531.png)
　緑色のボタン「ブラウザーで開く」をクリックすると、ブラウザの別のタブが開き、Node-REDフローエディタが表示されます。この環境では最初にプロジェクト機能のダイアログを開きます。プロジェクトの構成をスキップするには、右下隅にある「後にする」ボタンをクリックします。
![flow-editor_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/cdd441a1-985a-0404-36eb-335b7e79bcc7.png)
　これで、Node-REDフローエディタですごいフローの開発を始めれるようになりました。
心の貧しさ指標

big dataでなくても、社会情報を整理していると、時々、なんらかの指標を仮定して計算してみると、比較検討に役立つことがある。　


# 心の貧しさ指標　

近寄らない方が良さそうな方を判別する指標を作ろうと思った。

メディアに振り回されている人には近寄らない方がいいのは経験則です。


メディア情報に反応し、現地、現場、自分以外の３つ以上の当事者情報（メディア経由を除く）を当たろうとしない場合を、貧しさ５とする。　

メディア情報によらずに、現地、現場、自分以外の３つ以上の当事者情報（メディア経由を除く）にだけ基づき、メディア情報に言及しない場合を貧しさ０とする。　


|心の貧しさ|メディア情報|現地、現場、複数の当事者|
|--:|--:|--:|
|5|1|0|
|4|1or0|2 or 1|
|3|1 or 0|2 or 1|メディアーその他＝1
|2|1 or 0|3 or 2| メディアーその他＝２
|1|1 or 0|4 or 3|メディアーその他＝３
|0|0|5|

例えば、Twitterで、一つ一つのつぶやきに対して、その人の貧しさ分布を集計し、どのような分布になっているかで、心の貧しさを測るようにする。　

１割か２割、心の貧しさが５があるくらいなら、問題はない。　

上だけに偏っているのはやや危険。　
なるべく、近寄らない。　

立場によって見えるものが違う　仮説


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

JIS安全色

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


技術を極める。近寄りたい人。近寄りたくない人。三分類、五集合。

https://qiita.com/kaizen_nagoya/items/aefd732bcd2518b93ae3
Node.js向けTypeScript環境のボイラープレートを作った

# はじめに
TypeScriptのアプリを作り始めるたびに毎回同じようなパッケージをインストールしてtsconfig.json書いてESLintの設定書いて、vscodeの設定を書いて…ってやって時間を使うのが面倒になってきたので、必要最低限のスタート環境用のボイラープレートを作ってみました。

# いきなり成果物
https://github.com/masaminh/boilerplate-node-typescript

* Node.js 16用としてv16.0.0のタグをつけてあります。

* 以下のものが使える状態になってます。
  * TypeScript 4.8
  * ESLint (Airbnbスタイル)
  * Jest

Airbnbスタイルにしているのは完全に私の好みです。
pipenv/pyenvでPython3.*をインストールするとBUILD FAILEDになる(macOS 11+)

### BUILD FAILED!
macOSで`brew`で入れた`pyenv`で`Python 3.*`をインストールしようとすると失敗する(`pipenv`の環境構築で`pyenv`でインストールしようとしても当然同じエラーが出る).

(MacBook Pro 2019, macOS 12.6, Intel Core i7)

```shell
$ brew install pyenv
...
$ pyenv install 3.7.10

python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.10.tar.xz...
-> https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tar.xz
Installing Python-3.7.10...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 12.6 using python-build 1.2.27)

...

make: *** No targets specified and no makefile found.  Stop.
```


### 修正済みのPythonのバージョン
どうやら[AppleがCLangの仕様を変更してCPythonと非互換になったらし](https://stackoverflow.com/questions/71577626/issues-installing-python-3-8-10-on-macos-12-3-monterey)く, `Python 3.*`については以下のマイナーアップデートでそれぞれ[修正されているらしい](https://issueantenna.com/repo/pyenv/pyenv/issues/2284). 

|Python|Version|
|------|-------|
|3.7   |3.7.13 |
|3.8   |3.8.13 |
|3.9   |3.9.11 |
|3.10  |3.10.3 |

### brew版pyenvはバージョン対応が遅い

そこで`Python3.8.13`を入れようとしてみる.
```
$ pyenv install 3.8.13
python-build: definition not found: 3.8.13

See all available versions with `pyenv install --list'.

If the version you need is missing, try upgrading pyenv:

  cd /Users/-/.pyenv/plugins/python-build/../.. && git pull && cd -
```
ぐぬぬ. 存在しないと言われてしまった. 実際, インストール可能なバージョンを表示してみると
```shell
$ pyenv install -list
...
3.8.6
3.8.7
3.9.0
3.9-dev
3.9.1
...
3.9.8
3.10.0
3.10-dev
...
```
見事に欲しいバージョンがインストール不可になっている. `pyenv`の[バージョンが古い場合](https://stackoverflow.com/questions/43993714/why-is-python-3-6-1-not-available-in-pyenv)もあるらしいのでアップデートしようとするが, 既に最新版が入ってると出てしまう.


```shell
$ brew upgrade pyenv
Warning: pyenv 1.2.18 already installed
```

どうやら, `brew`版の`pyenv`は[バージョン対応が遅い](https://stackoverflow.com/questions/62169855/homebrew-pyenv-cant-install-python-3-8-3-despite-i-already-have-it-installe)らしい. 

### `pyenv-installer`で`pyenv`をインストールし直す

そこで, `brew`で入れた`pyenv`を一旦削除し, `pyenv-installer`で`pyenv`をインストールし直してみる.

https://github.com/pyenv/pyenv-installer

```shell
$ brew uninstall pyenv
...
$ curl https://pyenv.run | bash
$ exec $SHELL
$ pyenv update
```
そして上述の`Python3.8.13`をインストールする.

```shell
$ pyenv install 3.8.13
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.8.13.tar.xz...
-> https://www.python.org/ftp/python/3.8.13/Python-3.8.13.tar.xz
Installing Python-3.8.13...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.8.13 to /Users/-/.pyenv/versions/3.8.13
```
これでやっとインストールすることができた. pyenvの環境構築は毎回失敗している気がする.
ros ros2 メモ

# ros

20.04に Noetic を入れる参考。

http://wiki.ros.org/ja/noetic/Installation/Ubuntu

私のせいですがうまくいかなかった↓

https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e

# ros2

20.04に Noetic を入れていた場合のros2インストール参考。
Galacticを入れたから置き換える。

https://qiita.com/porizou1/items/53053ce806304fd71f06

# 切り替え

.bashrc に function を追加して、コマンドで切り替える方法

https://qiita.com/ousagi_sama/items/9301b9834a6fd0cfab04

# トラブル対応
## hyper-v 容量増やす

https://qiita.com/nakat-t/items/87d0ae049a5e0b57e469

## ロックプロセス終了方法

https://mebee.info/2021/05/26/post-34983/
【Git】リポジトリ名を変更する方法

## リモート側の作業

リポジトリの設定画面からリポジトリ名を変更します。  

![スクリーンショット 2022-11-12 22.32.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/c3625029-995e-fc81-afba-d060380803e2.png)

## ローカル側の作業

以下のコマンドを実行してローカルの設定を変更します。  

```zsh
$ git config remote.origin.url
変更前のリポジトリ名

$ git remote set-url origin https://github.com/新ユーザー名/新リポジトリ名.git

$ git config remote.origin.url
新リポジトリ名
```
CourseraでGoogle プロジェクト管理 プロフェッショナル認定証を取得した

## これはなんなのだ

https://jp.coursera.org/professional-certificates/google-project-management

- Google Project Management: Professional Certificate 
  - Googleが展開しているキャリアアッププログラムのうちの一つ。
  - 他にはITサポート、データアナリティクスなどがるが、単独、順不同で受講可能。
- MOOCs（Massive Open Online Course またはMassive Open Online Courses）
  -  インターネット上で受講できる大規模な開かれた講義のこと。 
- 2022年時点で言語は英語のみ（字幕やスクリプトはある）
  - 分からなければプライドを捨ててGoogle翻訳へぶち込めばOK。 
- 動画と講義とそれに対する課題、演習、試験及び実習。
- 全学習コンテンツを終えると認定証がもらえる。
  - PDFの修了証書とCreadyのバッチが貰える。

## きっかけ
- 英語を学ぶのではなく、英語を使って何かを学んでみたいと思った。
- 海外と日本でのプロジェクトマネジメントの違いを知りたくなった。
- Certification と Cetificateの違いを確認してみたかった。[^1]

[^1]: 大まかにはCertificationは試験で取得する資格で、Cetificateはトレーニングや課題提出によって得られる資格、ということで理解した。個人的にはCetificateの場合、Cetificationに比べて日本では評価がされにくいのではないか、と感じる。少なからず科挙の影響を受けている試験大好きな日本人の性質かもしれない。

## 取得してみて
- PDFの修了証書は自身のCourseraの設定言語で記載される。日本語で設定すると機械翻訳みたいな微妙な翻訳になるので、言語設定を英語にした方が見栄えの良い修了証書が貰える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/70cb29d6-3fb4-ac15-8652-49cd6e69694a.png)

- サブスクリプション形式、つまり期間によって課金されるので早めに終わらせるのが良い。
  - 無料期間が1週間あるが、その期間に終わらせようと思っても途中で進めなくなるので、修了証書が欲しければ最低1か月分の課金が必要。
    - 終了後も自動的課金が止まることは無いので、課金を止める必要がある。
    - 課金を止めても修了証書はなくならない。
    - とは言え、念の為にダウンロードしておく方が安心。
- 他人と課題を採点しあう実習があるが、明らかに問題文、指示内容を読んでいない提出物が多い。
  - 「Google翻訳を使ってはならない」という類の試験ではないので、辞書を引くとか翻訳ツールを使うとかすればいいのに、それすらしない受講者が多いのには驚いた。
    - 海外ではそれが当たり前なのか？
    - 受講者の名前から国籍を判断したが、日本人だけではなく、海外の受講者の課題を見る事の方が大半。（日本人はほとんど居なかった）
    - 日本人はとても真面目で丁寧なのでは？、と改めて思った。
    - 英語が不自由と言われている日本人の方がどうにかして読んでいる傾向があった。
    - 日本人の英語力は世間で言われているほどには酷くはないのでは？と思った。
    - とは言え、英語圏のガチ勢にはやはりかなわないので勉強は必要。。。
  - 繰り返すが、本当に大半の受講者は問題文を読まない。そんなプロマネでは必ずプロジェクトは炎上するので、後々のプロジェクトチームを救う為にもそう言う課題は心を鬼にして却下することをお勧めする。
    - 日本人は控えめで、遠慮がちな人が多いので。 
- 課題やワークが多いので、試験だけでパスするのに慣れている日本人にはいい勉強、経験になるのかもしれない。
  - 後半になればなるほどグループワークへ参加する人が減っている気がする。
    - おそらく途中で脱落していると思われる。
    - この程度のワークショップを克服できないようであればプロジェクトの完遂など不可能なのではないだろうか。。。
- 資格の知名度はなく、（言語が英語であることを除けば）難易度も難しくはないので、この資格を武器にするのは少々厳しい気がする。
  - とは言え、他にメインスキルがあった上で「プロジェクトマネジメントも分かってますよ」と示す分には十分有用。
    - もしくはキャリア初期の段階の人とか。
    - あとは自己啓発を目標管理に掲げなければならない人とか。
    - 修了証書が出るのでお得。
  - やっぱりGoogleの知名度は抜群。
    - 話のネタにはなる。
- 修了するとCAPM(PMI)とProfessional Scrum Master I(PSM I)の割引券を貰えた。
  - CAPMには興味が無かったが、スクラムマスターには興味があったのでありがたく利用させて頂いた。
  - 2023年3月追記。PSM Iに合格した。その記事はまた2023年のアドベントカレンダーで書きます。（覚えていたら）
    - 書きました。Professional Scrum Master I (PSM I) を取得した #資格 - Qiita https://qiita.com/tatsu_sekine/items/65c4ba1f8f724b03f172 
  - 2025年3月追記。CompTIA Project+にも合格すると追加で称号を貰えました。 Google Project Management Certificate & CompTIA Project+ dual credential を取得した #資格 - Qiita https://qiita.com/tatsu_sekine/items/cf9b3d0ece8cde385b37
【耳タコ】変数と関数の命名について上司に指摘された２つのポイント

初めまして。
今年度新卒でSier企業に入社したhirotoです。

今回は全てのエンジニアの耳にタコができるほど取り上げられている、変数や関数の命名についてです。
入社して半年ほど経ち、上司にレビューをしていただく中でご指摘された2つのポイントを備忘録としてまとめたいと思います。

<h1>1. 抽象的な単語を使うべからず</h1>
これは当たり前すぎることかもしれませんが、関数の命名に抽象的な単語を使ってしまっていました。
<br><br>
抽象的な単語の例としては、「<b>check</b>」や「<b>validation</b>」や「<b>calc</b>」などが代表的かと思います。

コードを書いているときの私は、可読性などお構いなしでノリノリになってしまう傾向がありました。
私がレビュー以前に書いていたコードには、上記のすべての単語を使ってしまっており、
「コードを見ても何の処理を行っているのかが分からない」と言われてしまいました。

これらの抽象的な単語を使わない代わりに、「<b>isEmpty</b>」や「<b>extractTitle</b>」などの具体的な命名をすることで
<b>関数名から何の処理を行っているのかを明確にする</b>ことが大切だと学ぶことができました。

<h2>2. 一行で書くことが正義とは限らない</h2>
私は何でもかんでも、短く処理を実装することがかっこいいと思っていました。
<br><br>
私が突っこまれたコードは下記のような複合条件式でした。
<br>
<code>if 0 < day <= 31 and 0 <= hour <= 24:</code>
<br><br>
コードを書いた私としては、これくらいなら読めば理解してもらえるだろうと思って書いてしまいました。

です赤の他人がこのコードを見ると、理解するのに時間がかかったり、
正しく理解されないことがあるといったご指摘を受けました。

この対処法としては、<b>複合条件を避けてあえてifをネストさせる</b> (ネストが深くなり過ぎないように注意する) ことや、
さらに可読性といった面では何の処理を行いたいのかを明確にするために、<b>関数化して名前を付ける</b>ことでレビューが行いやすくなるといったことが学べました。

<h1>まとめ</h1>
今回の件では、レビューに掛かる時間の削減や保守性を担保するために

可読性というものがどれほど大事かを学ぶ良い経験ができました。

Qiitaを見ていて同じような事を書かれている記事を何度も拝見したことがありますが、
実際に当事者になってみると自分もやらかしてしまっていましたので、
今回は自分の為の備忘録として書かせていただきました。

初めての投稿ということもあって、情報量も少なく拙い文章だったかと思いますが
今後はQiitaを学んだことをアウトプットする場として活用していこうと思いますのでよろしくお願いします。

最後までご覧いただきまして、ありがとうございました。
AWS IaC向けのVSCodeリモートコンテナ

# IaC用のローカル開発環境のコンテナ

- AWS CloudFormation、terraformを実行する環境が欲しいと思い、リモートコンテナ用のDockerfileとdevcontainer.jsonを作成しました
- ベースとしているのは、以下のGitHubの情報
    - https://github.com/toricls/aws-amplify-sns-workshop-in-vscode
    - https://gist.github.com/gsweene2/aa4229c163d500965e5674ee4418bf7a
    - https://gist.github.com/ssugimoto/132e0785212be58b0c0a6b4b7b42bc91

## インストールされる言語、ツール
- aws-cli , terraform, rain , node , python, java8(amazon correto 8)

- 2022-11-12 時点インストールされるバージョン
```
root ➜ /workspaces $ python --version
Python 3.9.15
root ➜ /workspaces $ aws --version
aws-cli/2.8.8 Python/3.9.11 Linux/5.4.72-microsoft-standard-WSL2 exe/x86_64.debian.11 prompt/off
root ➜ /workspaces $ brew -v
Homebrew 3.6.10-11-gb683beb
Homebrew/homebrew-core (git revision d38f0f7b60a; last commit 2022-11-12)
root ➜ /workspaces $ node -v
v16.18.1
root ➜ /workspaces $ npm -v
8.19.2
root ➜ /workspaces $ terraform --version
Terraform v1.3.4
on linux_amd64
root ➜ /workspaces $ rain -v
Rain v1.2.0 linux/amd64
root ➜ /workspaces $ java -version
openjdk version "1.8.0_352"
OpenJDK Runtime Environment Corretto-8.352.08.1 (build 1.8.0_352-b08)
OpenJDK 64-Bit Server VM Corretto-8.352.08.1 (build 25.352-b08, mixed mode)

```

## 使い方
- GitHubリポジトリ
    - https://github.com/ssugimoto/aws-cli-local-container
- README.md, [README.ja.md](https://github.com/ssugimoto/aws-cli-local-container/blob/develop/README.ja.md) に記載しています
Node.js で ERR_OSSL_EVP_UNSUPPORTED と言われた

[ERR_OSSL_EVP_UNSUPPORTED についての最新の記事はこちら](https://push.co.jp/articles/node-js-err-ossl-evp-unsupported)

Node.jsのバージョンをアップデートすると、Vue.js(Nuxt)アプリのビルド時にこれを言われるようになった。
```
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
```

## 前提・環境
- Node.js v18
- Vue 2
- Nuxt 2



## 解決法
### 一時的な解決方法
以下のコマンドを叩く。そうすればとりあえずすぐ動く。
```
export NODE_OPTIONS=--openssl-legacy-provider
```

以下のようにnpm run dev や buildの前につけるのもアリ。

開発環境の場合:
```
NODE_OPTIONS=--openssl-legacy-provider npm run dev
```

ビルドの場合:
```
NODE_OPTIONS=--openssl-legacy-provider npm run build
```

### ファイルに記述する方法
.zshrcに以下を記述する
```
export PATH="/Users/HOGE_USER/nuxt/HOGE_PROJECT/.npm-global/bin:$PATH"
export NODE_OPTIONS=--openssl-legacy-provider
```
（私のPCではnuxtというディレクトリに入っているのでこう記述しています。）

sourceで反映させるのを忘れずに（忘れた)
```
source .zshrc
```

※ これ、別のプロジェクトでやったら反映しなくなりました。なんでだろう。。。

## おわりに
公式によると、この記事で上げたような解決策は一時的な対応として必要だが、公式でいずれちゃんと対応してくれるらしい。
【Circleci】Circleci用のRspecのデータベースの定義

# database.yml.ciの作成
開発環境でテスト用のDBをdbという名称のコンテナで動かし、Circleciでの自動テストのDBのイメージを別途.circleci/config.ymlに記述する場合、Circleciのテストで以下のようなエラーが起こることがある。

```
Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)
```
これはdbというホスト名が定義されていないため生じるものであり、Circleciでのテスト用にdatabase.ymlを用意する必要がある。
そこで、以下のファイルを.circleci配下に作成する。

```yml:circleci/database.yml.ci
test:
  adapter: mysql2
  encoding: utf8mb4
  pool: 5
  username: root
  password: password
  database: appname_test
  collation: utf8mb4_general_ci
  host: 127.0.0.1 #ホストがlocalhostになるように定義している。
```
# config.ymlの編集
また、それに伴い、database.yml.ciの内容をCircleciでのテスト用のコンテナのdatabase.ymlにコピーしなくてはならないので、.circleci/config.ymlのワークフローにも以下の追記を行う。
```yaml:.circleci/config.yml
  rspec:
    docker:
      - image: cimg/ruby:3.0.0-node
        environment:
          RAILS_ENV: test
          DB_USERNAME: root
      - image: circleci/mysql:5.6
        environment:
          - MYSQL_DATABASE: appname_test
          - MYSQL_ROOT_PASSWORD: password
          - MYSQL_ROOT_HOST: 127.0.0.1
    working_directory: ~/appname
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}-{{ checksum "yarn.lock" }}
            - v1-dependencies-
      - run:
          name: update bundler
          command: |
            gem update --system
            gem install bundler -v 1.10.6
      - run: bundle install --jobs=4 --retry=3 --path vendor/bundle
      - save_cache:
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}-{{ checksum "yarn.lock" }}
          paths:
            - ./vendor/bundle
      - run: cp .circleci/database.yml.ci config/database.yml
      #　↑このコードを追記。
      - run: bundle exec rails db:create RAILS_ENV=test
      - run: bundle exec rails db:schema:load RAILS_ENV=test
      - run:
          name: yarn Install
          command: yarn install
      - run: bundle exec bin/webpack
      - run:
          name: RSpec
          command: bundle exec rspec
```
PowerShellでAzure 設定と操作例

# はじめに
PowerShellからAzureを操作するための設定を行う覚書です。

### PowerShellのインストール
下記のサイトを参考にインストールを行います。

https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.2#installing-the-msi-package

### Azモジュールのインストール
インストールしたPowerShellを管理者で実行して下記のコマンドを実行します。
```powershell:Azモジュールのインストール
Install-Module -Name Az -AllowClobber
```
実行後に対話に答えていくとモジュールがインストールされます。
### Azureへの接続
PowerShellからAzureへの接続を構成するために下記のコマンドを実行します。
```powershell:Azureへの接続
Connect-AzAccount -DeviceCode
```
実行するとURLとパスコードが表示されるので、ブラウザからアクセスしてパスコードを入力します。
> WARNING: To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAA to authenticate.

その後ブラウザからユーザー名やパスワードを入力してログインするとPowerShellからAzureにアクセスできるようになります。
例えば下記のようなコマンドでサブスクリプションを表示することができます。
```powershell:サブスクリプションの一覧を表示
Get-AzSubscription
```

### Azureからのログアウト
PowerShellからAzureへの接続を切断するために下記のコマンドを実行します。
```powershell:Azureからのログアウト
Disconnect-AzAccount
```

## PowerShellでできること

PowerShellで試しにVMを作成して、消すまでのサンプルスクリプトです。前提としてログインしているユーザーアカウントが権限を持っている必要はあります。

```powershell:PowerShellでできること
# 東日本リージョンに新しいリソースグループを作成
New-AzResourceGroup -Name rg-test -Location japaneast
# 上記リソースグループ内に新しいVMを作成(VMのユーザー名とパスワードを求められます)
New-AzVM -ResourceGroupName rg-test -Name vmtest01 -SubnetName sn-test
# 作成したVMの状態を確認
Get-AzVM -Name vmtest01 -status
# 作成したリソースグループごと全て消去
Remove-AzResourceGroup -Name rg-test
```

# おわりに
PowerShellはとっつきにくい印象を持っていましたが、意外と簡単にAzureの操作が自動化できそうです。これらのスクリプトはAzure Portalのクラウドシェルからも実行できるので、コピペするだけでお手軽に再現性の高い環境構築ができるので便利に感じました。
AccessのVBAでコマンドプロンプトのコマンド実行（コマンド実行結果の取得についても）

# やり方

まず『コマンドプロンプトを使う為のクラス』が使えるように参照設定。
```Windows Script Host Object Model```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ebb61b93-bce6-5f6d-895e-7401f0ad37f1.png)

```vb:サンプルコード
'コマンドプロンプトを使う為のクラス。
Dim wsh_shell_ As New IWshRuntimeLibrary.WshShell

'実行結果保持用。
Dim shell_result_ As IWshRuntimeLibrary.WshExec

'フォルダーを作成するコマンド。
Dim command_ As String
command_ = "mkdir C:\Users\d\Desktop\bat\test"

'コマンド実行して結果を保持。
Set shell_result_ = wsh_shell_.Exec("%ComSpec% /c " & command_)

'結果確認。
Debug.Print shell_result_.ExitCode
```

```ExitCode``` 以外にも下記のようなものが取得できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1b6b8c71-0019-a4ea-5b00-4410415b4744.png)

# Run()

WshShellには ```Run()``` という関数もある。

| 関数名 | コマンドプロンプト画面 | コマンド実行結果取得 |
|--|--|--|
| Run() | 表示されない | できない |
| Exec() | 表示される | できる |

# 蛇足

『もしコマンドが失敗したらユーザーに通知 or メール通知 or ログ出力』
という要件が後から追加されることがある。

個人的には最初からExec()で作っておいた方がいいかなあって思う。

# 参考サイトさん

https://www.sejuku.net/blog/89852

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2251
Microsoft Access for Microsoft 365 MSO (バージョン 2209 ビルド 16.0.15726.20068) 32 ビット
待ったなし！ いますぐAzure IoTのルート証明書を確認せよ！（2023年2月期限）

> ■2023/1/8追記
> 本件に関連する登壇資料を公開しました。
> [待ったなし！ いますぐAzure IoTのルート証明書を確認せよ！](https://speakerdeck.com/matsujirushi/dai-tutanasi-imasuguazure-iotnorutozheng-ming-shu-woque-ren-seyo)
> ■2023/1/19追記
> 登壇の動画が公開されました。
> [待ったなし！ いますぐAzure IoTのルート証明書を確認せよ！](https://youtu.be/4kf8BkS86oM)
> また、登壇時に回答できなかった件を調べてツイートしました。
> https://twitter.com/matsujirushi12/status/1616037573855686660
> ■2023/3/21追記
> Azure IoT Centralの変更期間を追記しました。

すでにご存じのとおり、Azure IoT HubとAzure IoT Hub Device Provisioning Serviceのサーバ証明書（のルート証明書）が変更されます。

https://techcommunity.microsoft.com/t5/internet-of-things-blog/azure-iot-tls-critical-changes-are-almost-here-and-why-you/ba-p/2393169

対応期限が迫ってきたので、改めて日本語で注意喚起しておきます。

# なにが行われるの？

2023年2月15日～2024年2月15日に、Azure IoT Hub/Azure IoT Hub Device Provisioning Serviceのサーバ証明書のルート証明書が順次変更されます。

* Azure IoT Hub ... 2023年2月15日～2023年10月15日
* Azure IoT Hub Device Provisioning Service ... 2024年1月15日～2024年2月15日
* Azure IoT Central ... 2023年5月15日～2023年10月15日

# なにも対処しないとどうなるの？

なにも対処しないと、**2023年2月15日以降、デバイス/サービスがAzure IoT Hub/Azure IoT Hub Device Provisioning Serviceに接続できなくなる**可能性があります。

# なにをすればいいの？

2023年2月15日までに、

1. Azure IoT Hub/Azure IoT Hub Device Provisioning Serivceに接続するデバイス/サービスに、（Baltimore CyberTrust Rootルート証明書と共に）DigiCert Global Root G2ルート証明書を追加
1. マイクロソフトが用意しているテスト用のAzure IoT Hub/Azure IoT Hub Device Provisioning Service（g2cert.azure-devices.net/g2-cert-dps.azure-devices-provisioning.net）に接続できることを確認
1. 全てのデバイス/サービスに変更を反映

してください。

# FAQ（というか気になること）

## Q1. Azure IoT Centralも対象？

デバイス接続部分はAzure IoT Hub/Azure IoT Hub Device Provisioning Serviceを使っていることから、対象と思います。
Azure IoT CentralのREST APIに関しては既にDigiCert Global Root G2なので影響無いです。

## Q2. Azure Digital Twinsも対象？

ほとんど使っていないので知らないです...。知見ある方、是非コメントください。
N 分木(多分木)を二重連鎖木にしてオフセット配列表現するメモ

N 分木表現をデータサイズ小さくシリアライズしたい...

たとえば二分木(binary tree)ですと, 木構造を配列で表現は容易です.

https://en.wikipedia.org/wiki/Binary_tree#Arrays

implicit にする(木構造の情報の配列を持たない)ことも可能です.
レイトレでの BVH データ構造によく使われていました(~2015 年くらいまで. 今でも主流なんじゃろか)
implicit で, 子のノード数が固定な N 分木(e.g. 4 分木)などにも適用することができますが, 使われないノードが増えるなどして無駄が多くなります.

木構造を単純な 1D 配列にすることで, シリアライズや GPU での処理などがやりやすくなります.

しかし複数の子で構成される N 分木(多分木. たぶん... 木? :thinking: ではない)ですとどうしたらよいでしょうか.

## 二重連鎖木

二重連鎖木というのがあります(child-sibling tree)など呼び名はさまざまのようです.

https://ja.wikipedia.org/wiki/%E4%BA%8C%E9%87%8D%E9%80%A3%E9%8E%96%E6%9C%A8

ただあんまり実生活や学校のデータ構造授業では取り扱われない... カモ?

これにより木構造を二分木で表現することができます.

### 配列表現

pxrUSD の USDC(バイナリ表現)で使っていて知りました.

流石に implicit に表現は無理ですが, child, sibling のビットと, ジャンプオフセット配列(次のノードへのオフセット)があれば木構造を復元できます!

pxrUSD のコードだとわかりにくい感がありますので, TinyUSDZ のコードを参考にするとよいでしょうか.

https://github.com/syoyo/tinyusdz/blob/6a5f435b39f69ed418d4844336add7623483770c/src/crate-reader.cc#L3753

(child, sibling ビットは負の値で表現)

木構造から配列へのコンバートもそれほど難しくはありません. みなさんも考えてみてくださいネ.
Elixir/Nerves衛星を打ち上げる日

この記事は[「#NervesJP Advent Calendar 2022」](https://qiita.com/advent-calendar/2022/nervesjp)第1日目の記事です．

また初出はSWEST24のEmbLTです．

https://speakerdeck.com/zacky1972/nerveswei-xing-woda-tishang-geruri

ゆるい感じを醸し出して後続へのプレッシャーを避けるために，仮にこの状態で投稿しておきます．後で追記するかもです．

追記: 2023年10月〜2024年2月の研究期間で北九州産業学術推進機構(FAIS)の衛星データにかかる新技術開発事業の助成を受けて株式会社ダイモンとともにFPGAとNervesの衛星への応用に関する研究開発プロジェクトを行います．

https://zacky1972.github.io/blog/2023/10/02/FPGA-Nerves.html
導入が進むTreasure Dataとは?

![トレジャーデータ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/e5839a2a-84c5-117f-2e19-b780868ede1f.png)

## 概要
「データを制するものはビジネスを制す」

上記、有名なフレーズがあるようにビジネスではデータ活用による顧客マーケティング活動が進んでいます。データ活用に欠かせないソリューションはCDPとなります。

CDPとはプライベートデータを収集/加工/統合するデータ基盤です。(※公開データ：DMP)

そこで今回はTreasure Data CDPを紹介します。

## Treasure Data CDPとは?
データ収集/集計/加工/分析へのBI連携が可能なCDPです。
他のCDPとの比較して大きくリードしている点はコネクタの量です。コネクタとは他のシステムと連携するための入口と出口となります。コネクタが既に存在していればAPI連携など開発が必要なくなりデータ連携が容易になります。トレジャーデータには既に「500以上の連携コネクタ」が存在しておりHUB通して連携が可能となります。

![s-1637x770_v-fms_webp_deab2d14-c4d7-4a99-85d5-683c39970131 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/57f25dce-931f-07f8-a093-1e5979b2ffa2.png)


画像引用：Treasure Data CDP

## Treasure Data 導入で可能となること
データにあるユーザーに対してセグメントを切ってWEB広告、メルマガ、プッシュ通知などのマーケティングアプローチが行えるようになります。

特に、3つ目の外部ツール連携の容易性は、他のCDPと比較しても大きな特徴となります。
CDPによってはデータ連携都度開発が必要になるケースもありますが、Treasure Dataには500を超えるデータ収集先・活用先のコネクターが既に開発・実装済みとなっており、シームレスに連携が可能です。
データ連携対象の外部ツールが多い企業は特にメリットを感じやすいかと思います。

## Treasure Dataが可能とする施策
前述の通り、Treasure Dataは外部ツールとの連携が強みの一つであり、あらゆる施策に繋げる事が可能です。

また、BI分析ツールとの連携も容易で下記内容が実現可能です。

・経営データの可視化

・データマーケティング

・業務効率化

他記事で紹介しているBigqueryとの違いについては

初期開発コストと運用面の違いになります。

## 最後
開発スピードと他システムとの連携は高度な分析を実現するのには欠かせません。

是非、参考にしてみてください。
【MacOS Ventura】OSアップデート後VSCodeで「ソース管理プロバイダーが登録されていません」と表示される

MacOS Venturaにアップデート後、VSCodeで"No source control provides registered(ソース管理プロバイダーが登録されていません )"と表示されていた。その解決方法に関するメモを記す。
※2022/11/12 Sat 時点

### 【環境】　
- MacBook Pro(Apple M1)
- macOS Ventura バージョン 13.0.1
- VSCode Version: 1.73.1 (Universal)

### 【事象】
 - VSCodeのソース管理（Source Controle）で、Gitが認識されず、以下のメッセージが表示される
     - "No source control provides registered"
 - ターミナルからGitのコミットやプルはできるが、VSCodeのソース管理のところからは操作ができない状態

### 【解決までに試したこと】
- Homebrewで brew doctorを実行して、表示された以下を実行

```
Warning: No developer tools installed.
Install the Command Line Tools:
  xcode-select --install

```

-  VSCodeでGitを有効にする
　 2-1. Extentions(拡張機能)から "@buildin Git"を入力する
![スクリーンショット 2022-11-12 20.42.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633798/7bad0ccf-0d66-7616-c66f-8d7d59007d9e.png)
 2-2. Gitを有効にするを押下する

いくつかサイトを調べていて「Gitを有効にするといい」ことは分かったが、@buildin と入れないと検索結果に表示されず、焦った。
AWS Lambdaで.NET Core 3.1から.NET 6に移行したときにやったこと

# はじめに

AWS Lambdaで.NET6がサポートされました。ですが.Net Core 3.1のMicrosoftのサポート期限が2022/12/13まで、AWS Lambdaにおける.Net Core 3.1のランタイムサポートは2023/1/20までとなっており、.NET Core 3.1から.NET 6への移行が必要になりました。
やってみると、項目によって`net6.0`だったり`dotnet6`だったりと、意外と紛らわしかったので忘れないようにメモしておきます。

# やったこと

## ターゲットフレームワークの変更

まずは言わずもがなですが、プロジェクトファイルのターゲットフレームワークを変更します。

```diff_xml:***.csproj
-    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
```

## aws-lambda-tools-defaults.jsonの修正

AWS Toolkit for Visual Studioのテンプレートを使っている場合は、こちらのファイルがあるはずなので修正。

```diff_json
-   "framework": "netcoreapp3.1",
+   "framework": "net6.0",
```

function-runtimeを指定している場合は以下も修正が必要です。

```diff_json
-   "function-runtime": "dotnetcore3.1",
+   "function-runtime": "dotnet6",
```

## SAMテンプレートの修正

SAMテンプレートを使っている場合は以下の通り修正します。

```diff_json:serverless.template
-         "Runtime": "dotnetcore3.1",
+         "Runtime": "dotnet6",
```

## CodeBuildのImage変更

ビルドにCodeBuildを使っている場合は、Imageによってデフォルトでインストールされているランタイムが違います。詳しくは以下のURLを参照してください。
<https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/available-runtimes.html>

以下はCloudformationテンプレートのCodeBuildの部分の差分です。

```diff_yaml
-         Image: aws/codebuild/amazonlinux2-x86_64-standard:3.0
+         Image: aws/codebuild/amazonlinux2-x86_64-standard:4.0
```

ちなみにImageを変えたくない場合は、.NET 6を手動でインストールすることで対応することもできます。以下のURLの「dotnet-install scripts」のリンクからインストール用のスクリプトをダウンロードし、CodeBuild上で実行することでインストールが可能です。

<https://dotnet.microsoft.com/ja-jp/download/dotnet/6.0>

```shell:buildspec.yml
chmod +x dotnet-install.sh
dotnet-install.sh -c 6.0
dotnet --info
```

## Lambdaデプロイコマンドの修正

CodeBuildでlambdaのデプロイコマンドを使っている場合は、以下の通り修正します。

```diff_shell:buildspec.yml
- dotnet lambda deploy-serverless --framework "netcoreapp3.1"
+ dotnet lambda deploy-serverless --framework "net6.0"
```

## NSwag関連の修正

NSwagを利用している場合は、以下の部分を修正。

```diff_xml:****.csproj
- 	<Exec Command="$(NSwagExe_Core31) run nswag.json /variables:ProjectPath=$(MSBuildProjectFullPath)" />
+ 	<Exec Command="$(NSwagExe_Net60) run nswag.json /variables:ProjectPath=$(MSBuildProjectFullPath)" />
```

```diff_json:nswag.json
-   "runtime": "NetCore31",
+   "runtime": "Net60",
```

## NuGetパッケージの更新

.NET 6に対応していないバージョンがある場合は更新が必要です。

## その他影響箇所の修正

以下のURLを参照し、該当箇所があれば修正。

<https://learn.microsoft.com/ja-jp/aspnet/core/migration/31-to-60?view=aspnetcore-7.0&tabs=visual-studio>
キャリア２０年の電気系エンジニアが買おうかどうか悩みに悩んでいるガジェット

# 目的
買おうかどうかずーっと悩んでいるガジェットを紹介してみようと思います。いつかリミッターが外れたときにでも買おうかなーと思っているけども、踏み切れない。そういうものを集めてみました。同じく踏み切れない方々の背中を押す、もしくは欲しい物リストの項目を増やすことにでもつながれば幸いです（笑）。カッコ内の数字は欲しい物リストに入れて眠らせている期間（2022年11月時点）です。

# [TourBox NEO](https://www.amazon.co.jp/dp/B08YJBBYKN/?coliid=I15D290FC2E5US&colid=38ZBKMOHO8AXG&psc=1&ref_=lv_ov_lig_dp_it) （悩５ヶ月）
最近、左手デバイスが気になってしょうがない。でもねぇ、CAD使うわけじゃないからいらないんだよなぁ、と思いつつもあったらなにか使うかもな。なんかそんな気にさせるのがTourBox NEO。まあ見た目はかっこいいし、いろいろできそうな気がするがノリだけで買うには高い、高すぎる。いやぁ踏み切れないなぁ。

# [Razer Tartarus V2](https://www.amazon.co.jp/dp/B0787HCJ96/?coliid=I2HZD2FCC5L398&colid=38ZBKMOHO8AXG&psc=1&ref_=lv_ov_lig_dp_it) （悩３ヶ月）
これまた左手デバイス。ジョイスティックがいい感じだなと感じる。でも、Mac用のキーカスタマイズのソフトがダメそうで、Karabinerとか入れないといけないかもしれない。でも、なんか変なものバックグラウンドで走らせて全体の動作重くしてもねぇ、という理由から購入に踏み切れず。まあそもそもマクロ機能を活かせるようライフスタイルだろうか？こういう場面で使えそう、という具体的な事例が浮かんだら買うかも。

# [e元素 ６１キー キーボード](https://www.amazon.co.jp/dp/B09DVMLQRC/?coliid=IW33XL7K6LLN&colid=38ZBKMOHO8AXG&psc=1&ref_=lv_ov_lig_dp_it) （悩６ヶ月）
安いんだから買えばいいじゃないか、と思われるかもしれないが今使っているkeychronのキーボードも気に入ってるので、そこにキーボードを足すのはあまりに冗長過ぎる。でも、この６１キーというミニマルな感じと値段に魅力を感じて、はや半年。まあ買ってもいいんだけど、邪魔になるくらいなら止めておくか。そんな葛藤。

# [Insta360 Link](https://www.amazon.co.jp/dp/B0B826KS4B/?coliid=I1JWUA1L9YA3I4&colid=38ZBKMOHO8AXG&psc=1&ref_=lv_ov_lig_dp_it) （悩２ヶ月）
ジンバル付きの4k Webcam。おっとすごそうじゃないか、と思ったがZoomの会議やるのにそんな高画質いるか？というか相手が鮮明に見えるならいいけど、自分が配信したところで自分は見れないし、そもそも相手が4kで表示できる環境にないかもしれない。いやぁ、全くもって冗長な感じがするが、製品コンセプト的には好きなんだよなぁ。

# [Anker Soundcore Liberty 4](https://www.amazon.co.jp/dp/B0BB1PFCS3/?coliid=IRQHN4GAV9GDO&colid=38ZBKMOHO8AXG&psc=1&ref_=lv_ov_lig_dp_it) （悩２週間）
最近発売されたらしいAnkerのワイヤレスイヤフォン。ノイズキャンセリングがよいらしい。ちょっとそそられるものがあるが、今持っている三千円のAirPods Proにインスパイアされたイヤフォンも別に文句ない。多分ノイズキャンセリングは無い、でも音が聞ければよいので事足りている。ノイズキャンセリングはすごそうなんだけど実際いらないかもなぁ、という迷いがあって買えない。そして、もうちょっと足してAirPods Proの本物買った方が良いかも？そんなこと考え始めたらますます買えない。

# [Amazon Echo Studio](https://www.amazon.co.jp/dp/B07NQDQWW6/?coliid=I206Y0EM0JPYMK&colid=38ZBKMOHO8AXG&psc=1&ref_=lv_ov_lig_dp_it)（悩５ヶ月）
割とAmazon Echo使ってます。音楽聞いたり、天気予報聞いたり、割と生活の一部として使っている方だと思います。Echo Studioは音質がすごくいいのだとか。そりゃまあ音質がよかったら最高でしょう。でも、Echo Dotでも割と音いいな、って思ってしまうやつがEcho Studioの価値を感じられるだろうか？なんか今の生活に対しては冗長だなぁ、きっと。そしてこれ以上Amazon Echoを増やしてもねぇ。家中の音声データまる抜かれよ。

# [Razer DeathStallker V2 Pro](https://www.amazon.co.jp/dp/B0BJ2S9ZPH/?coliid=I1G2K8JR43YJI4&colid=38ZBKMOHO8AXG&psc=1&ref_=lv_ov_lig_dp_it) （悩３ヶ月）
Razerのオプティカルスイッチを使ったキーボード。きっとまあ素晴らしい打感なんでしょう。キーボードは使う頻度が高いし、それなりに投資してもいいかなと思っているんですが、３万は高い。今のKeychronは赤軸で打感最高！それを超えるのか？超えてもちょっとじゃない？それにしては価格差大きすぎない？そんなこんなで悩み続けている。同じ値段ならRealforceとか買ってみようかな、とか考え始めるとますます買えない。

# 最後に
もう年末ですね。多分Amazonでもセールが始まるのでしょう。でも、先週くらいからうっすら値上がりしてるんだよなぁ。そしてセールになったら元の値段に戻るわけでしょ？そして30%オフとか言うわけ？いやそういうやり方どうなのよ。ちゃんとしろよAmazon。なので、セールすら自分の背中を押す理由にならない。やっぱり必要性を感じてから買うのが一番か、と思いまた眠らせるんでしょうね。もし上記のアイテムを買った方がいましたら教えて下さい、その素晴らしさを。
CesiumJS入門

## はじめに
この記事は#30DayMapChallenge2022 12日目の記事です。
テーマはScaleです。
Cesiumを使って地球儀を表示してみます。

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

https://30daymapchallenge.com/

## CesiumJSとは
世界クラスの3D地球儀と地図を作成するためのオープンソースのJavaScriptライブラリ

## Cesium ionトークン取得
全球の衛星画像と実世界の3Dコンテンツを使うために、Cesium ionのアカウントを作成して、トークンを取得します。
アカウント作成は[こちら](https://cesium.com/ion/signup/)から
非商用の個人プロジェクト、研究、非営利の教育活動目的であれば無料です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/ec74f04f-01b3-d24d-f34a-a0568df49699.png)


Access Tokensのタブをクリックすると、デフォルトのトークンを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/6445e893-f6d5-95c3-075a-1793d6052ca4.png)

CesiumJSの設定方法として以下の2つがあります。今回はCDNを使います。
- CDNからインポートする
- npmでインストールする

## 地球儀を表示


```index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8" />
        <title>サンプル</title>
        <link href="style.css" rel="stylesheet" />
        <!-- Include the CesiumJS JavaScript and CSS files -->
        <script src="https://cesium.com/downloads/cesiumjs/releases/1.99/Build/Cesium/Cesium.js"></script>
        <link href="https://cesium.com/downloads/cesiumjs/releases/1.99/Build/Cesium/Widgets/widgets.css" rel="stylesheet" />
    </head>
    <body>
        <div id="cesiumContainer"></div>
        <script src="main.js"></script>
    </body>
</html>
```

```style.css
body {
    padding: 0;
    margin: 0;
    overflow: hidden;
    height: 100%;
}
#cesiumContainer {
    display: flex;
    width: 100%;
    height: 100%;
}
```

```main.js
// Cesium ionのアクセストークン
Cesium.Ion.defaultAccessToken = 'your_access_token';

// Cesium ViewerをcesiumContainerというIDのHTML要素に初期化
const viewer = new Cesium.Viewer('cesiumContainer', {
    terrainProvider: Cesium.createWorldTerrain(),
});
// 初期表示時のカメラ位置
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(138, 29, 25000000),
});
```

defaultAccessTokenに取得したアクセストークンをセットします。
カメラの初期位置は日本が上に来るようにしてみました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/a03d0275-9af0-d7d1-d621-996ac3455586.png)

地球儀を表示できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/096f7fb6-dc1f-9568-c0ab-c214ae83e4f0.png)

マウスを使うとぐりぐりズームできます。

## 参考文献
https://cesium.com/platform/cesiumjs/

https://cesium.com/learn/cesiumjs-learn/cesiumjs-quickstart/
mainブランチでgit pull出来ない時の簡単な解決法

以前、mainブランチでgit pullをするとYour configuration specifies to merge with the ref “ブランチ名” from the remote, but no such ref was fetched.と出てしまい最新コミットを取得できない問題が起きました。

このエラー自体初めて遭遇したのでよく見てみると別ブランチがmainのリモートブランチになっていました。

ブランチの変更の際に切り替わっていない段階で変にコミットやらプッシュやらをしてしまったことが原因だと思いますが、そこまで大変な思いをせずに解消できましたので、お困りの方は参考にしてみてください。

## 解決法
めちゃくちゃ簡単です。
以下の手順でgitを操作していきましょう。

### 1. 最新のコミットを取得する
    git fetch
最後にgit pullをして最新コミットを取得しますが、ここでは念のためです。
### 2. mainブランチのリモートブランチを解除する
    git branch --unset-upstream
ココが重要です。

おそらくorigin/mainと本来なっていなければいけない部分が **別のリモートブランチに切り替わっているか、上手く接続できていないからgit pullが出来ていない** ので、リモートリポジトリとの接続を一度解除します。

### 3. mainブランチとorigin/mainを接続する
    git branch -u origin/main
ローカルのmainブランチとリモートのorigin/mainを接続します。
### 4. 最後にgit pullをして確認
    git pull
git pullをして「Your configuration specifies to merge with the ref “ブランチ名” from the remote, but no such ref was fetched.」のエラーが出力されず、 **最新コミットを取得もしくは「Already up to date.」** と表示されればOKです。

### まとめ
gitはミスをするとやっかいなので一度まとめてみました。
ココがおかしいなと感じるところがありましたら、コメントにて教えてください。
４０代おっさんStreamlitを学ぶ

## 本記事について

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

## Streamlit

treamlitとは、PythonでWebアプリケーションを作成するためのフレームワークです。

データサイエンティストやAIエンジニア向けに開発されており、バックエンド開発の知識がなくてもPythonのコードを数行書くだけで、気軽にデモ用のアプリを作成することができるのが特徴です。

### Streamlitインストール

```bash
pip3 install streamlit
```

### 確かめる

```bash
streamlit hello
```

自分ははじめてだったのでメールアドレス求められました。

サイトにアクセスできれば大丈夫です。

### Text elements

フォルダを作り
`app.py`を作成

```python
import streamlit as st
st.write('利樹大好き')
```

streamlitを実行

```bash
streamlit run app.py
```

ダブルコーテーションでも文字が表示できます。（Magic）

```python
import streamlit as st
st.write('利樹大好き')
"利樹大好きだよ～～ン"
```

```python
import streamlit as st
st.title('利樹が大好きすぎる件について') # タイトル
st.markdown('## 利樹が大好きすぎる件について') # マークダウン記法

st.code('a = 123', language='python') # コード記法
```

### Data display elements

```python
import streamlit as st
import pandas as pd

csv = pd.read_csv('dummy.csv') # csv読み込み適当なの入れました

df = pd.DataFrame(csv)

st.dataframe(df) # streamlitにてWEB上に
```

json

```python
import streamlit as st
import pandas as pd

csv = pd.read_csv('dummy.csv') # csv読み込み適当なの入れました

df = pd.DataFrame(csv)

st.dataframe(df) # streamlitにてWEB上に

json = df.to_json(orient="records") # ヘッダーがある場合

st.json(json) # jsonデータを表示
```

### Chart elements

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

df = pd.DataFrame(
    np.random.randn(20, 3),
    columns=['a', 'b', 'c']
)

st.line_chart(df)
```

## 参考

https://www.udemy.com/course/python-fastapi
[EKS] Podに対してSecurity Groupを適用する前にしておく準備について

## What's This

EKSにおいて、Podに対してSGを適用する場合、いくつか準備が必要です。
設計前、作業前に知っておくと、検証がスイスイ進むのではないかという内容です。
簡易なメモです。

## ノードにt3系は使用できない

ドキュメントにある通り、Pod単位でSGを適用したい場合には、ノードにt3系は使用できないです。

> pods のセキュリティグループは、m5、c5、r5、p3、m6g、c6g、および r6g インスタンスファミリーを含む、ほとんどの Nitro ベースの Amazon EC2 インスタンスファミリーでサポートされています。t3 インスタンスファミリーはサポートされていません。サポートされているインスタンスの詳細なリストについては、GitHub で「limits.go」ファイルを参照してください。ノードは、そのファイルで一覧表示されているインスタンスタイプのうち、IsTrunkingCompatible: true を含むものである必要があります。

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/security-groups-for-pods.html

以下limits.goで`IsTrunkingCompatible`がtrueになっているc5.largeに変更して再度検証したところ、適用できました。
https://github.com/aws/amazon-vpc-resource-controller-k8s/blob/master/pkg/aws/vpc/limits.go

ちなみに、サポートされていないファミリー(`a1.medium`)で適用するとこんなエラーが出ます。

```
│ Error: error creating EKS Node Group (`cluster名前`:`Node Group 名前`): InvalidParameterException: [a1.medium] is not a valid instance type for requested amiType `hogehoge`
│ {
│   RespMetadata: {
│     StatusCode: 400,
│     RequestID: "`hogehoge`"
│   },
│   ClusterName: "`cluster名前`",
│   Message_: "[a1.medium] is not a valid instance type for requested amiType `hogehoge`",
│   NodegroupName: "`Node Group 名前`"
│ }
│ 
```

検証が結構進んだ段階でこれを知った場合、今更ノードのタイプを変更したくないなあ…ということもあるのではないかと思い、記しました。
まあただ、t3系を本番で運用することもあんまりないのかなとは思いますが…

## CNI プラグインを有効にする必要がある

### CNIのバージョンは1.7.7以降である必要がある

> 次のコマンドで、現在の Amazon VPC CNI plugin for Kubernetes のバージョンを確認します。
> kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3
出力例を次に示します。
> v1.7.6
> Amazon VPC CNI plugin for Kubernetes バージョンが 1.7.7 より前の場合は、プラグインを 1.7.7 以降に更新してください。詳細については、「Amazon VPC CNI plugin for Kubernetes アドオンの更新」を参照してください。

### CNI Amazon VPC CNI アドオンを有効にする

> Amazon VPC CNI アドオンを有効にして pods のネットワークインターフェイスを管理するには、aws-node DaemonSet で ENABLE_POD_ENI 変数を true に設定します。この設定が true になると、クラスター内の各ノードについて、アドオンで値が vpc.amazonaws.com/has-trunk-attached=true のラベルが追加されます。VPC リソースコントローラーは、1 つの特別なネットワークインターフェイスを作成してアタッチします。これは、トランクネットワークインターフェイスと呼ばれ、説明は aws-k8s-trunk-eni です。
> kubectl set env daemonset aws-node -n kube-system ENABLE_POD_ENI=true

自分はterraformで以下のようにラベル付けを行いました。

```
      labels = {
        "vpc.amazonaws.com/has-trunk-attached" = "true"
      }
```

が、環境によってはコマンドベースでやった方が確実かもしれません。

```
kubectl set env daemonset aws-node -n kube-system ENABLE_POD_ENI=true
```

確認
```
kubectl describe daemonset -n kube-system aws-node | grep ENABLE_POD_ENI
      ENABLE_POD_ENI:                         true（なら有効）
```

## EKSクラスターのIAMロールに AmazonEKSVPCResourceController マネージドポリシーを追加する必要がある

> pod のセキュリティポリシーを使用して pod 変更へのアクセスを制限している場合は、eks-vpc-resource-controller および vpc-resource-controller Kubernetes サービスアカウントは、psp が割り当てられた role に対して Kubernetes ClusterRoleBinding で指定する必要があります。デフォルトの Amazon EKS の psp、role、および ClusterRoleBinding を使用している場合、これは eks:podsecuritypolicy:authenticated ClusterRoleBinding です。例えば、次の例に示すように、サービスアカウントをセクション subjects: に追加します。

まあこれは元々ついてた、ということもあるかと思いますので、改めて追加することもあんまりないのかなとは思いますが、一応。

## Reference

・https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/security-groups-for-pods.html
・https://www.grugrut.net/posts/202107250958/

参考にさせていただきました。ありがとうございます。
CentOS 8 StreamからOracle Linux 8に移行する

# CentOS 8 Stream → Oracle Linux 8 移行

仕事で、CentOS 8 StreamからOracle Linux 8に移行する都合があり、その際に作成したマニュアルの一部をこちらに公開することにしました。

# Oracle Linux8への移行

レポジトリベースをOracle Linuxへと変更する。

```bash
repobase=http://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64/getPackage
```

Oracle Linuxのrpmをインストールする。

```bash
wget \
  ${repobase}/redhat-release-8.3-1.0.0.1.el8.x86_64.rpm \
  ${repobase}/oraclelinux-release-8.3-1.0.4.el8.x86_64.rpm \
  ${repobase}/oraclelinux-release-el8-1.0-9.el8.x86_64.rpm
```

centos-stream-releaseを削除する。

```bash
sudo rpm -e --nodeps centos-stream-release
```

ダウンロードしておいたOracle Linuxのレポジトリ関連のRPMをインストールする。

```bash
sudo rpm -ivh *.rpm
```

ociregionファイルを作る。

```bash
sudo touch /etc/dnf/vars/ociregion
```

CentOS 8 Streamのレポジトリを削除する。

```bash
sudo dnf remove centos-stream-repos -y
```

レポジトリリストを確認する。

```bash
sudo dnf repolist
```

パッケージをOracle Linuxのものに入れ替える。

```bash
sudo dnf --refresh distro-sync -y
```

Oracle Linux 独自の Kernel（Unbreakable Enterprise Kernel）をインストールする。

```bash
sudo dnf install kernel-uek -y
```

# kernel-mlをインストールする。

新しいハードウェアを使っていると、どうしてもデバイスドライバの都合、新しいカーネルを使わないと起動できないという場面に遭遇する。
そこで、以下にOracle Linux 8で、現在のMainlineである、Linux 6.0.xのカーネルをインストールする手順を記載しておく。


レポジトリのインストール

```bash
sudo dnf install -y https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
```

Main Stream(6.0)のカーネルをインストールする

```bash
sudo dnf --enablerepo=elrepo-kernel install -y kernel-ml
```

grub.cfgを作り直す。

```bash
sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
```

起動時のカーネルのメニューを確認する。

```bash
sudo grub2-editenv list
```

grub.cfgファイルの存在を確認する。

```bash
sudo ls -l /etc/grub2-efi.cfg
```

リンク先のファイルの存在があるか、確認する。

```bash
sudo ls -l /boot/efi/EFI/redhat/grub.cfg
```

新しくインストールしたkernel-mlが起動時に選択されるようにする。

```bash
sudo grub2-set-default 0
```

再起動させる。

```bash
sudo reboot
```

現在のカーネル関係のパッケージを確認する。

```bash
sudo rpm -qa | grep "^kernel"
```

古いカーネルをアンインストールする。

```bash
sudo dnf remove kernel
```

kernel-toolsをアンインストールする。

```bash
sudo dnf remove kernel-tools
```

デフォルトのカーネルを設定する。

```bash
sudo vi /etc/sysconfig/kernel
```

以下のように書き換える。

```bash
# UPDATEDEFAULT specifies if kernel-install should make
# new kernels the default
UPDATEDEFAULT=yes

#DEFAULTKERNEL specifies the default kernel package type
#DEFAULTKERNEL=kernel-uek
DEFAULTKERNEL=kernel-ml
```
この記事の記述に際しては、[「CentOS 8 を Oracle Linux 8 に切り替える」](https://qiita.com/shakemid/items/673326a114a69cf89791)を参考にさせて頂いた。
著者の@shakemidさんに感謝。
webpack5でstorybookなmswだとjwtがtokenをgeneration出来ない件について

### 結論
必要なmoduleを入れて、webpackにaliasを書いて、
.storybook/preview.jsに下記を追加しましょう。
``` ts
import { Buffer } from 'buffer'
// @ts-ignore
window.Buffer = Buffer
```

### 本文
webpack5が出たんですけども、過去のバージョンと比べて廃止された物がいくつかあるという話です。
そのため、素直にjwtが動かず、結構苦労しました。
※素直に動かそうとすると最初に「stream」でエラーが出て、そのあとに「buffer」でエラーが出て、最後に「crypto」でエラーが出ます。

その他細かい話はあるんですけど、[この記事](https://qiita.com/issei_k/items/f33164a22b8c1dc74a09)がだいぶまとまっていて助かりました。

実行した手順は以下です

1. 下記コマンドを実行
※引用元[この記事](https://qiita.com/issei_k/items/f33164a22b8c1dc74a09)
``` bash
$ yarn add -E -D assert buffer console-browserify constants-browserify crypto-browserify domain-browser events stream-http https-browserify os-browserify path-browserify punycode process querystring-es3 stream-browserify readable-stream readable-stream readable-stream readable-stream readable-stream string_decoder util timers-browserify tty-browserify url util vm-browserify browserify-zlib 
```

2．webpackを編集
今回私はStorybook上で使えればよかったので、Storybook/Mainjsを編集しています。
```ts: .storybook/main.js
module.exports = {
    ...

    webpackFinal: (config) => {
        config.resolve.alias = {
            ...config.resolve?.alias,
            assert: "assert",
            buffer: "buffer",
            console: "console-browserify",
            constants: "constants-browserify",
            crypto: "crypto-browserify",
            domain: "domain-browser",
            events: "events",
            http: "stream-http",
            https: "https-browserify",
            os: "os-browserify/browser",
            path: "path-browserify",
            punycode: "punycode",
            process: "process/browser",
            querystring: "querystring-es3",
            stream: "stream-browserify",
            _stream_duplex: "readable-stream/duplex",
            _stream_passthrough: "readable-stream/passthrough",
            _stream_readable: "readable-stream/readable",
            _stream_transform: "readable-stream/transform",
            _stream_writable: "readable-stream/writable",
            string_decoder: "string_decoder",
            sys: "util",
            timers: "timers-browserify",
            tty: "tty-browserify",
            url: "url",
            util: "util",
            vm: "vm-browserify",
            zlib: "browserify-zlib"
        }
    }
```

3．preview.jsを編集する。
jwtがbufferを使ってるのかよくわからないですが、bufferでもエラーが出ていたので以下で対応です。
参考にした記事ではWebPackに記述して解決してましたが、うまく行かなかったので下記対応をしています。
```ts: .storybook/preview.js
import { Buffer } from 'buffer';

// @ts-ignore
window.Buffer = Buffer;
```

以上です。
React+react-three-fiberで始めるWebGL

# はじめに
私は普段体重管理をスマホアプリで行っているのですが、二次元のグラフがダサい…
とふと感じてしまい「そうだ！今こそWebGLを勉強だ！ただWebGLを直接扱うのは難しそう…」ということでReactからはreact-three-fiberが割と簡単にWebGLを扱えそうだったのでやってみました。

最終的にはかっこいい体重管理グラフの表示を目指しています。
ということで、今回のゴールは以下とします。
* 環境セットアップ
* 簡単な画面を表示　


# 環境セットアップ
まずはNode.jsが必要なのでインストールします。

https://nodejs.org/ja/

本稿作成時点では18.12.1が推奨版だったのでこれをインストールします。
全てインストーラのデフォルト設定でインストールします。

##### インストール結果確認
コマンドプロンプトを立ち上げnodeコマンドからバージョンを確認します。
バージョンが表示されればインストールは正常終了しています。
```
node -v
18.12.1
```
# Reactプロジェクト作成
適当なフォルダからプロジェクト作成コマンドを実行します。
ここではtest-app-frontという名前にします。
```
npx create-next-app test-app-front
```

インストール途中で以下の質問をされるので両方ともYesを選択
```
? Would you like to use TypeScript with this project? » No / Yes
? Would you like to use ESLint with this project? » No / Yes
```

ちゃんと動くかテスト
```
cd test-app-front
npm run dev
```


http://localhost:3000/
にアクセスして以下画面が表示されれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962731/ef902791-7261-819a-de96-0b043eccb6a5.png)

# Three.js導入とコーディング
Three.jsとreact-three-fiber、typescript用の型定義をインストールします
```
npm install three @types/three @react-three/fiber
```

githubのサンプルを参考にindex.tsを実装します。

https://github.com/pmndrs/react-three-fiber

```typescript:index.ts
import type { NextPage } from "next";
import React, { useRef, useState } from "react";
import * as THREE from "three";
import { Canvas, useFrame } from "@react-three/fiber";

const Home: NextPage = () => {
  const Box = (props: JSX.IntrinsicElements["mesh"]) => {
    const ref = useRef<THREE.Mesh>(null!);
    const [hovered, hover] = useState(false)
    const [clicked, click] = useState(false)
    useFrame((state, delta) => (ref.current.rotation.x += 0.01));
    return (
      <mesh
        {...props}
        ref={ref}
        scale={clicked ? 1.5 : 1}
        onClick={(event) => click(!clicked)}
        onPointerOver={(event) => hover(true)}
        onPointerOut={(event) => hover(false)}>
        <boxGeometry args={[1, 1, 1]} />
        <meshStandardMaterial color={hovered ? "hotpink" : "orange"} />
      </mesh>
    );
  };

  return (
    <Canvas>
    <ambientLight />
    <pointLight position={[10, 10, 10]} />
    <Box position={[-1.2, 0, 0]} />
    <Box position={[1.2, 0, 0]} />
  </Canvas>
  );
};

export default Home;
```

# 動作確認
さっそく実行してみましょう。
```
npm run dev
```
を実行してからhttp://localhost:3000/にアクセスします。
こんなオブジェクトがくるくると回転していれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962731/77f0e6bf-c24f-3c47-9b81-0101b36352f6.png)

　クリックすると大きくなったり、マウスを置くとピンクになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962731/8e779fb2-eb40-dd60-a79f-76168f322646.png)

# バージョン情報
* @react-three/fiber": "^8.9.1
* @types/node": "18.11.9
* @types/react": "18.0.25
* @types/react-dom": "18.0.8
* @types/three": "^0.146.0
* next": "13.0.3
* react": "18.2.0
* react-dom": "18.2.0
* three": "^0.146.0
* typescript": "4.8.4
Laravel  7〜9 でMailtrapを利用する方法(3分でわかる記事)

## Mailtrapとは
ローカル環境でメールのやり取りとかをしたい場合に便利なツールです。

## 手順

アカウント作成（GitHub等ですぐに完了）
 → Mailtrap側で簡単に設定
 → Laravelプロジェクトの.env に書き込む


## 上記詳細
まず下記のリンクからアカウントを作成します（自分はGitHubですぐに作成できました）

https://mailtrap.io/

その後、My Inbox(デフォルトで存在する)をクリックし、

![スクリーンショット 2022-11-12 18.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156346/f922d92f-b400-43d5-a2a3-37f9da068656.png)

下記の画面で『cURL』の部分を変更して『laravel7+』にします。

### 変更前(laravelの.env 初期値)
![スクリーンショット 2022-11-13 9.06.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156346/ff26af80-5da3-3e59-bde5-059721412049.png)


### 変更後
![スクリーンショット 2022-11-12 18.30.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156346/d89d7132-aabe-a11c-185c-9c5e080a0557.png)

すると下の方に環境変数が表示されますので、

これをlaravelプロジェクトの.envファイルに書き込みます。

```変更前
MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

```

```変更後(下記はサンプルです)
# mailtrapを利用
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=4649
MAIL_USERNAME=jnfjernfioenfiwer
MAIL_PASSWORD=wejnfjewnfewnfiewfiewoiewnfoeiwnfiw
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
```
これで設定完了です。
virtual box + vagrant + CentOS 　Mac環境構築　（途中）

ディスプレイのサイズは、Virtualboxマネージャー/設定/ディスプレイから

・CentOSインストールでやったこと
・ネットワークの割り当てをブリッジアダプターに変えた。
・インストール開始前に、「ネットワークとホスト名」でオフのとこオンにした
・CPU稼働率が200％超えて焦ったからオーディオの有効を切った。それでもしんどかったら、違う設定の見直しもあるみたい。