OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Basic 6.0の100％互換性 RAD Basicの紹介

# はじめに
これは、[Visual Basic Advent Calendar 2021](https://qiita.com/advent-calendar/2021/vb)の12日目の記事となります。

先月ネタ探しに、Yahooリアルタイム検索でVisual Basic関連で検索していた時に、下記のサイトを見つけました。

https://www.radbasic.dev/

# RAD Basicとは
Carles Royanさんが個人で開発している、Visual Basic 6.0の100%互換に挑戦しているプロジェクトになります。

VB6.0自体のサポートは、Windows10の有効期間内（2025年10月14日）は公式にサポートします。
VB6.0の統合開発環境（IDE）は、2008年4月8日でマイクロソフトの延長サポートが既に終了しており、改善する予定もありません。最近のモダンな統合開発環境（IDE）で、VB6.0が開発できるようになるという意味では、多少のメリットはあるのかな。

【2023/08/01追記】
[RAD Basic vs TwinBasic, Which do you prefer?](https://www.vbforums.com/showthread.php?895421-RAD-Basic-vs-TwinBasic-Which-do-you-prefer/page2)

上記サイトによると「リリースの変更履歴のペースから推測すると、RBが現在のTBの状態に達するまでに10年以上かかる可能性が高く、TBが過去1年間に達成した進歩を考慮すると、おそらくあと1年以内に完全互換に合格する可能性が高い」とのことです。

【2024/02/21追記】
毎月リリースする方向になりました。これによりRBが現在のTBの状態に達するまでの期間が短縮されそうです。

https://docs.radbasic.dev/doku.php?id=rbdoc:resources:release_notes

## Redditのスレッド
Reddit(アメリカ合衆国の掲示板型ソーシャルニュースサイト)で、Carles Royanさんがスレッドを立てています。

https://www.reddit.com/r/visualbasic/comments/mpqgxy/rad_basic_a_100_compatible_visual_basic_6_solution/

## Youtubeの動画
<iframe width="560" height="500" src="https://www.youtube.com/embed/YbcShyhze5g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


【2022/01/10追記】
VB6.0で作成されたプロジェクトをRAD Basicで読み込んで編集するところまで公開されました。
<iframe width="560" height="500" src="https://www.youtube.com/embed/quGzNytp0EU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

【2024/02/21追記】
ユーザーコントロールの作成が公開されました。
<iframe width="560" height="500" src="https://www.youtube.com/embed/iEiO1d2vWzc?si=ILH4NFlAqIGgE5um" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## ダウンロード
https://www.radbasic.dev/download.php

試したくてもダウンロード使用とするには、[Patreon](https://www.patreon.com/join/radbasic)にて、月ごと支払うパトロンになる必要があります。
ごめんなさい、今のところ自分はパトロンにはなっていません。　

# 最後に
こんなプロダクトがあることは知りませんでした。
VB6.0の統合開発環境（IDE）のサポートが切れているとはいえ、使用できないわけではないので不便ながらもそのまま使用しちゃうかな。

VB.NETの進化方針に関しては、Mercury プラットフォームがあるのを知りました。
MicrosoftがやめたVB.NETの言語としての進化は、RemObjects Mercuryが引き継ぐぜっという感じらしいです。

https://blogs.remobjects.com/2021/05/07/mercury/
ボイスチャット入室RTA

こちらは[ITRC Advent Calendar 2021](https://adventar.org/calendars/6368)の12日目の記事です。
前の記事: [@koseiinfratop](https://qiita.com/koseiinfratop)さんの[ラップ？、ラッパー？、サランラップ？となっていた僕がラッパー関数に惚れた瞬間](https://qiita.com/koseiinfratop/items/3326f975b7edf3493275)
次の記事: [蒲生辰巳](https://twitter.com/gamoutatsumi)さんの[denopsで変わったinit.vim](https://zenn.dev/gamoutatsumi/articles/df6b424455e6fe)

前略,突然音声チャットに参加しなければならなくなり走ることにしました

## 環境

- OS: Arch Linux x86_64
- WM: awesome v4.3

## 目標

- 音量調節とミュートを出来るようにする
- 他人に迷惑がかからないようにワイヤレスヘッドセット使用する

## 手順

1. キーマップの確認
2. 設定を記述する
3. bluetoothの設定

## キーマップの確認

`xev`や`xkbcomp $DISPLAY output.xkb`などで確認を行うことが出来ます

以下はoutput.xkbから抜粋

```txt
...
    key <MUTE> {         [   XF86AudioMute ] };
    key <VOL-> {         [ XF86AudioLowerVolume ] };
    key <VOL+> {         [ XF86AudioRaiseVolume ] };
...
```

- 消音: XF86AudioMute
- 音量を下げる: XF86AudioLowerVolume
- 音量を上げる: XF86AudioRaiseVolume

## 設定を記述する

AwesomeWMのrc.luaに追記します

```lua
globalkeys = gears.table.join(
    ...
    awful.key({  }, "XF86AudioLowerVolume", function ()
        awful.util.spawn("amixer sset Master 5%-", false)
    end),
    awful.key({  }, "XF86AudioRaiseVolume", function ()
        awful.util.spawn("amixer sset Master 5%+", false)
    end),
    awful.key({  }, "XF86AudioMute", function ()
        awful.util.spawn("amixer set Master 1+ toggle", false)
    end),
)
```

## bluetoothの設定

bluetoothプロトコルスタックのデーモンのbluezやbluetoothヘッドセットを簡単にセットアップすることができるPipeWireなど必要なものをインストールします

```sh
yay -S pipewire pipewire-pulse bluez bluez-utils
```

[bluetoothの設定](https://wiki.archlinux.org/title/Bluetooth_headset#Configuration_via_CLI)を参考にbluetoothの設定をします

```sh
bluetoothctl

[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on

[NEW] Device 00:1D:43:6D:03:26 Lasmex LBT10
[CHG] Device 00:1D:43:6D:03:26 Lasmex LBT10

[bluetooth]# pair 00:1D:43:6D:03:26
[bluetooth]# connect 00:1D:43:6D:03:26

[Lasmex LBT10]#
```

設定出来れば完了です
お疲れ様でした

## 参考

- [X keyboard extension - ArchWiki](https://wiki.archlinux.org/title/X_keyboard_extension)
- [PipeWire - ArchWiki](https://wiki.archlinux.org/title/PipeWire)
- [Bluetooth headset - ArchWiki](https://wiki.archlinux.org/title/Bluetooth_headset)
【AWS】IAMのまとめ

# はじめに
こんにちは。
この記事は[GFAMアドベントカレンダー2021](https://qiita.com/advent-calendar/2021/gfam)の4日目の記事です。
IAMについてまとめてみました。

# IAMの概要

IAMとは、Identity and Access Managementの略です。AWSサービスを使用するユーザーのための権限管理サービスです。AWSサービスを安全かつ適切に使用する上でしっかりと理解すべきサービスです。

ここでは、下記についての概要のみを記載します。

* IAMユーザー
* IAMグループ
* IAMポリシー
* IAMロール

# IAMユーザーとは

IAMユーザーとは、管理者 （ルートユーザまたは管理者権限を持つIAMユーザー） によってアクセス権限を付与して作成されるユーザーです。このIAMユーザーは人間が使用する場合だけでなく、プログラムが使用する場合もあります。なお、IAMユーザーが作成された直後は、なにも権限が付与されていません。

## アクセスの種類

IAMユーザーがAWSにアクセスする方法として下記２パターンがあります。

* AWSマネジメントコンソールへのアクセス
  * AWSマネジメントコンソールにパスワードを使ってサインインできる
* プログラムによるアクセス
  * アクセスキーIDとシークレットアクセスキーと一緒にAWS API、CLI、SDKなどの開発ツールからAWSリソースにアクセスできる
  * IAMユーザーに付与された権限の範囲でなんでもできる
  * このアクセスキーIDとシークレットアクセスキーは絶対に外部に公開してはならない (不正利用されるなど危険)

# IAMグループとは

IAMグループとは、同じ目的や役割によってIAMユーザーをまとめたものです。例えば、管理者用グループ、開発者用グループ、営業用グループ・・・などのように作成します。このあとに記載するIAMポリシーをIAMユーザー単位ではなくIAMグループ単位で設定することができるため、管理が非常に効率よくなります。

# IAMポリシーとは

IAMポリシーとは、AWSリソースの操作に対して許可・拒否を定義したものです。IAMポリシーにはAWSが用意しているAWS管理ポリシーとユーザーが用意するカスタマー管理ポリシーがあります。カスタマー管理ポリシーはJSON形式で定義します。

# IAMロールとは

IAMロールとは、AWSリソースに対してIAMポリシーを付与する仕組みのことです。例えばEC2インスタンスに対して、AmazonS3FullAccessのポリシーを付与した場合、EC2上のプログラムはアクセスキーIDとシークレットアクセスキーを使用せずにS3のフルアクセスができる様になります。

# おわりに

今回はIAMをまとめました。
IAMについてはしっかりと理解しておかなければセキュリティリスクを高めかねません。
億劫がらずにしっかりと学びたいですね。
次回はRDSについて学習します。

# 参考

* [BlackBelt](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
C#でアスペクト指向でロギングを実現したい

# C#でアスペクト指向でロギングを実現する方法
C#でアスペクト指向的な方法でロギングする方法が無いかを調査した資料
備忘録なので、抜け漏れ多めだと思います。


## 調査のきっかけ
C#でWindowsFormアプリを作るうえでロギングを行う必要が出た  
要件としては関数の実行の最初と最後に実行履歴を残すだけの単純なものだったため  
アスペクト指向の考えを利用してログを残すことができないかを調査することにした

## 調査して分かった実現方法
- 自前でコードを書いて実現する  
RealProxyというC#の用意したクラスを利用することで実現が可能となる  
詳しくは以下  
https://qiita.com/KoKeCross/items/4b16ff8cdad65e0fea23
- PostSharpを利用する  
有料のPostSharpというライブラリが存在する  
Community版もあり、機能制限はかかるが無料で使用することも可能  
https://www.postsharp.net/get/community
- Fodyを使用する  
オープンソースのライブラリ（MITライセンス）
Fody自体はビルド時にC#,VBコードから生成されるIL（中間言語）  
に対していろんなコードを追加することが簡単になるライブラリ  
https://github.com/Fody/Home  
Fodyを利用したアドインとして以下のようなものがある  
https://github.com/Fody/Home/blob/master/pages/addins.md  
アドインの中には特定のAttributeを付けた関数に対しては、関数の実行前後にログを仕込む  
などができるアドインが存在する。（AnotarやMethodDecoratorなど）

## 比較
### メリット・デメリット
#### 自前でコードを書いて実現する
##### メリット
- .net frameworkのバージョンに縛られにくい  
割と昔からあるクラスを利用するため、.net frameworkのバージョンがだいぶ古くても動作する
- 処理の流れを制御しやすい
自前で実装する分、より柔軟にコーディングができる  
別のライブラリとも組み合わせやすいと思われる
##### デメリット
- デバッグが大変  
以下のURLに書いてある通り、デバッグが大変になる。  
https://qiita.com/KoKeCross/items/4b16ff8cdad65e0fea23

#### PostSharpを利用する  
##### メリット
- 実績のある商用のライブラリである  
いろんな企業で使用されているため、実績がある
また、商用であるためちゃんとしたサポートもある模様
-  多機能である  
商用版であれば、ロギングにかかわらずいろんな機能が搭載されている  
etc. 引数に対してrequired修飾を行うことで引数の入力チェックを自動で実装する
##### デメリット
- 商用版を使う場合、費用がかかる
どれぐらいかかるかは以下のページ参照  
https://www.postsharp.net/pricing/framework  
ただし、この件は使用する機能を限定するのであればCommunity版を使うことで回避可能かもしれない
- 学習コストが少し高い  
メリットと表裏一体だが、多機能ゆえに学習コストが少し高くなる
- 実行環境によっては動かない可能性がある  
詳しくは以下
https://doc.postsharp.net/requirements

#### Fodyを使用する
##### メリット
- オープンソースである  
オープンソースなため、費用無しで利用することが可能  
(ライセンスはMITライセンス)
- 開発が継続されている  
2021年12月時点で開発が継続されて開発が行われている  
そのため、何かのバグ・欲しい機能が無いなどがあっても将来の開発で修正・実装が入る可能性がある
- アドインが豊富  
Fody自体はILに対して操作を行うライブラリなのだが、それを拡張したアドインが多量に存在する  
様々な機能がアドインで実装されているので、必要な機能だけを必要なだけ導入することが可能  
https://github.com/Fody/Home/blob/master/pages/addins.md
##### デメリット
- 学習コストが少し高い
こちらもいろんな機能を利用しようとなると学習コストが高くなると思われる  
Fody自体がILに手を加えるというライブラリであるため、何かしら起きた時のために  
ある程度のILに対しての知識があると良い  

## 結果
Fodyを利用することとする
採用基準としてはやはりオープンソースであることとアドインが豊富であること  
お金がかからないというところでこのライブラリを使用することとする
実装自体もNugetでMethodBoundaryAspect.Fodyを入れて設定ファイルを定義し、  
OnMethodBoundaryAspectを継承したAttributeを実装して「OnEntry」「OnExit」「OnException」  
をオーバーライドするだけで簡単に実装することができた

## 余談
PostSharpのCommunity版の一部機能はFodyを使用しているらしく、それならばFodyで良いのではないかという判断もあった
Alibaba Cloud DevOps Pipeline(Flow)を試してみる vol.2

vol.1は[こちら](https://qiita.com/cube8080/items/b9681a4666343b98a045)

今回は、GitHubに準備したリポジトリにindex.htmlを作成し、それがECSにデプロイされるかどうか試してみました。

# 事前準備
事前に準備したものは、こちら。

* GitHubでリポジトリ(今回はプライベートリポジトリ)作成
    * index.htmlファイルを置いています
* ECSの準備
    * Apacheをインストールして起動

# Pipelineを作成してデプロイしてみる
**1.GitHubとの連携**
GitHubとの連携を設定していきます。
![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/8188fc07-8eee-2888-9ad1-4da141862f22.png)

「Associate」をクリックするとこちらの画面に移動するので、問題が無ければ「Authorized〇〇〇」をクリックして連携させます。
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/007bac24-f6d0-e536-39e5-e270a4e0ae32.png)

連携ができると、Pipelineの画面に戻ってくるのでリポジトリ等選択できるようになります。
![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/ce316bcf-e0dc-5a29-15e2-12ebb54bf02e.png)

**2.Artifact Archiveを作成する**
ECSにデプロイするためには、Artifact Archiveを作成する必要があります。
「Select Task Group」から「Empty Task」を選択します。
Add StepをクリックしてUpload > Artifact Archiveを選択します。
![24.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/28a02dfd-674d-3d9f-500b-1de351bb97b4.png)


「Archive Paths」は、今回はGitHubのリポジトリ直下にindex.htmlを置いているのでディレクトリではなくファイル名を直接指定しています。(ここがハマりポイントでした。ドキュメントはディレクトリ指定しているため)
![25.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/b998d2cb-55fd-528b-f9e7-83523eedd899.png)

**3.ECSへのデプロイ設定**
作成したArtifact Archiveをtgz形式に圧縮したものをサーバーにダウンロードさせ、それを展開し、指定したパスにコピーする処理を設定します。
![26.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/77c32efb-12b1-100f-d3dd-46763eccc933.png)

* Download Artifact When Deployにチェックをつける
* Artifactは「2」で作成したものを選択
* DeploymentGroupは作成したものを設定
* Download Pathはtgzファイルをダウンロードする場所を指定
* Execute Userは実行するユーザーを設定
* Deployment Scriptは、実行されるスクリプトを記載
    * 今回はindex.htmlをrootである/var/www/htmlに展開するためのスクリプトを記載
* Deployment Strategyはデフォルトのまま設定

**4.Save and Run**
これでPipelineの作成が完了したので、実際に展開されるか試してみましょう。
「Save and Run」をクリックするとConfiguration画面が表示されコメントできるようになっています。
正常に実行完了すると、このようになります。
![27.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/c66f29dc-b8d4-84a7-528b-c7d19c7d83be.png)

エラーが発生した場合は、「Logs」をクリックすると実行内容が見れるのでエラーが発生しているところがわかります。


最後に、ECSのインターネットIPをブラウザに入力してWebページが表示されるか確認してみましょう。

**5.作成したPipeline**
今回作成したPipelineはこのような感じになりました。
![Flow.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/64edc79e-db62-cd6d-6148-87d2480da81c.png)


# まとめ
今回は単純にデプロイするだけだったので、他の設定は試していないのですが必要に応じてWehookなども利用できそうです。
公式ドキュメントはJava中心の記載が多く、この様なシンプルな構成がなかったのでデプロイできるまでが大変でした。(Artifact Archiveが必要など)
現在は、Javaが中心のようなので今後の機能の拡充が楽しみですね。
中小企業診断士試験の振り返り〜1次試験「経営情報システム」を中心に。

Futureアドベントカレンダー13日目です。昨日は@RuyPKG さんの[「【入門】QuickSight × S3 でデータ可視化」](https://qiita.com/RuyPKG/items/c32282fe57c33346a534)でした。

今年中小企業診断士試験を受験しました。無事1次試験は合格し、11月に2次試験の筆記を受験、来年1月の合格発表待ちといった状況です。
最近はgoやRoRのプログラミングをメインとして仕事をしていましたが、フューチャーはITコンサルティングの会社なので、経営面、業務面でも知識をつけたいなというのが受験のモチベーションでした。今回はQiitaという場所で記事を書いているので、情報系科目である「経営情報システム」を中心に振り返りを書こうと思います。

## 中小企業診断士試験の概要
中小企業診断士は経営コンサルタント業向けの唯一の国家資格です。ビジネスパーソンがが取得したい資格ランキング１位としてしばしば名が上がることが多い資格です。
中小企業診断士試験（以下、診断士試験）はマーク式で基本的な知識を問うとされる1次試験と、紙面でコンサルティングを行う記述・論述試験の2次試験に分かれます。厳密には記述試験合格後に口述試験もありますが、口述試験については合格率ほぼ100%の試験と言われています。

### 1次試験の科目と合格基準
1次試験は７科目あり、2日間にわたって行われます。1日目に、「経済学・経済政策」、「財務・会計」、「企業経営理論」、「運営管理（オペレーション・マネジメント）」2日目に「経営法務」、「経営情報システム」、「中小企業経営・政策」が実施されます。
合格基準は各科目で４0%を切らないかつ、全体で６０%以上となります。さらに科目合格制度があります。科目合格とはある科目６割以上を取った場合、先2年の受験次に、その科目を免除できる制度です。その場合免除した科目は６０点取ったとみなされ合格基準で計算されます。また、特定の資格を持っていた場合、科目が免除されます。

### 経営情報システムについて
経営情報システムの科目はいわゆる情報系の科目で中小企業診断士として必要なIT・情報処理の知識を問うものとされています。また、先述の特定の資格による免除が経営情報システムにもあり、IPAの応用情報技術者試験もしくは高度試験に合格していると、免除されます。（私は<del>サボって</del>応用情報を取ってなかったので、経営情報システムを受験することになりました。）
ハードウェア、ソフトウェア、DB、ネットワーク、セキュリティ、開発方法論など範囲は広く、イメージとしては基本情報処理試験に近いなと個人的には感じました。最近のITトレンドや最新のガイドラインなどからも出題されており、なかなかそこまで覚えてないよ！と言いたくなるような答えが導きにくい問題も出題されます。しかし、６0%とれればいい試験なので、落とすべきではない問題で落とさなければ、全体として難易度としてはそこまで高いものではないと思います。
（とはいいつつ、）今年の試験については、最近のITトレンドに関する問題が増えた印象を持ちました。Pythonを実際に触っていないとわからなかったり、診断士試験のテキストには載っていないSQLのunion句が出題されたりと、IT系で仕事をしていない方には難しい問題も多く出題されたり、例年選択肢が４つなのに、全問題選択肢が５つに増えたりと、難易度としては上昇しているようでした。
なお、今年のも含め過去の問題は[中小企業診断協会のサイトに発表](https://www.j-smeca.jp/contents/010_c_/shikenmondai.html)されています。是非一度解いてみてください。（非IT業界な人に、こんな問題出すのか！と驚く問題もあるかなーと思います。）

### 科目の学習
中小企業診断士の学習には資格予備校のTACを受講していました。学習範囲が７科目あるため、経営情報システムだけに時間を取られるわけにもいかず、TACの基本講義と答練の復習に過去問５年間分を解いただけで、そこまでしっかり学習をしたわけではありませんでした。それだけでも各答練で７割以上は取れていたので、そこまで力を入れず、企業経営理論などの他の科目に時間をかけました。
経営情報システムの学習のなかでは仕事ではあまり触れていない、ハードウェアやネットワークなどは覚えてなかったり、忘れていたりしたので、勉強をする価値は大きくありました。一方、自分の仕事に関連している以上楽しいものだったので、楽しさにかまけて勉強しすぎない（他の科目を疎かにしない）ことをずっと意識していました。

## 受験のすすめ
この場では、経営情報システムについての記載にとどめましたが、中小企業診断士試験は業務面、経営面での知識をつけるのに大いに役に立ちました。特にSI業・ITコンサル業な方は受験してみてはいかがでしょうか。
たのしいたのしいBlender

## これは何？
この記事は鈴鹿高専 Advent Calender 2021 16日目の記事です。

https://qiita.com/advent-calendar/2021/snct

にわかブレンダラーがBlenderを勧める記事です。

## はじめに
まず初めにBlenderとは何かというと、「3Dモデリングが出来て、それ以外のこと(画像or動画編集、VFX、etc...)も意外と出来るソフト」です。ただ、できることが多いので

- まず何から始めればいいかわからん
- ショートカットキー大杉

みたいな状態になりやすいです。筆者も高専1年生の時にBlenderに触ろうとしたときは完全にこの状態でした。今もBlenderめっちゃできるかと言われたら微妙なところはありますが、「blenderﾁｮｯﾄﾃﾞｷﾙ」くらいにはなったと思う（多分）ので今回は初心者がまず何からやればいいのかということについて書いていきたいと思います。

## まず初めにやること

### 1. 基本操作を覚える（できればショートカットキーも）
まずは基本操作を覚えましょう、以下のサイトはパンダを作りながら基本操作を覚えられるのでオススメです。
あとショートカットキーについてですが、覚えたら覚えるだけ作業を効率化することが出来ますが、**全部覚える必要はありません**。これを覚えなければいけないと焦ってBlenderから離れてしまうのは悲しいので最初はあまり気にしなくていいと思います。**モデリングの楽しさ**を知ることがBlenerを習得する上で一番重要なことなので。

https://styly.cc/ja/tips/blender-modeling-start1/

### 2. モディファイアについて把握する
これは簡単に言うと、**モデリングを楽にするための機能の集まり**です。これを使うといろいろ楽できます。

### 3. それぞれのモードについて把握する
これはのちに説明するチュートリアルを見たほうが分かりやすいと思うので省略します。

## 次にやること
上記に述べたことが出来たら、チュートリアル動画を沢山みましょう。英語が得意な方は英語圏のチュートリアルから入ってもいいですが、そうでない方は最初のうちは日本人のチュートリアルから始めることを強くお勧めします。その理由としては

- ショートカットキーが分からないと何やってるかよくわからん動作が多い
- そもそも何言ってるかわからない

という状況に初心者のうちは陥りやすいからです。ただ情報量は英語圏の動画の方が多いです。

### おすすめのチュートリアル動画（日本語限定）

- Yonaoshi氏

https://youtu.be/cvo4qZycyPM

この動画では、複雑な操作はそこまで多くなく、基本操作やモード、モディファイアについて理解しながらスライムを作ることができます。筆者が一番最初に見た（多分）Blender関連の動画です。この人の動画では、Blenderの開発者ブログを読んだり、Blenderの最近の動向について知ることができたりするのでとてもオススメです。

ほかにもおすすめの動画はあるんですが、なぜか削除されていたりで見つけることが出来ませんでした（悲しい）。

### おすすめのチュートリアル動画（英語圏）

- Blender Guru氏

https://www.youtube.com/watch?v=TPrnSACiTJ4&list=PLexwJr_iILK7IkuhEeAYeN7aLV5AAXKa-

多分一番有名？なDonut Tutorialです。すべてのモード（Blender 2.8なのでジオメトリノードを除く）を使用してドーナツを作成します。さっき述べたスライム作成よりは少し難易度は上がるかもしれないですが、基礎の習得にはうってつけの動画です。

**その他チュートリアル動画**

https://www.youtube.com/watch?v=Hf2esGA7vCc&list=PLjEaoINr3zgEL9UjPTLWQhLFAK7wVaRMR

https://youtu.be/Ebx2qbBlvh0

https://youtu.be/52UYqe3zdxQ

- Ducky 3D氏

https://youtu.be/2bv973aqx-w

パーティクルシミュレーションの基礎について学ぶことが出来ます。

## おすすめアドオン
アドオンとは、Blender内で機能を拡張する為のプラグインの様なものです。無料なものと、有料なものがあります。

### Node Wrangler
シェーダーエディタで用いるアドオンです。よく使う機能等をショートカットでかんたんに出すことができます

### Animation Node
トランスフォームアニメーションなどを簡単に作成することができます。Blenderでは通常アニメーションを作る場合ドープシートを用いますが、このアドオンを導入するとアニメーションをノードで作成することができます。

### Modular Tree add-on
様々な形状の木を簡単に生成することができます。

ここで有料アドオンの紹介とかも出来たら良かったのだが残念ながら筆者は有料アドオンを使ったことがないので紹介できない…


## その他もろもろの動画
先ほど載せたチュートリアル動画は、一番最初に触れるならこれかな？というのを選んで載せたので、ここではそれ以外でオススメの動画を載せていきたいと思います。

- Alex Pi氏

https://youtu.be/a8IZ6S7JfIM

すごい、語彙力が無さ過ぎてすごいしか言えないですがすごいです。ループカット（オブジェクトを分割する[Ctrl+R]）とモディファイア等を駆使してすげーアートを作ってます。

https://youtu.be/jLcwPoWRHqs

3D coat,Blender.PhotoShopを使って古代アートを作っています。筆者はBlenderしかやったことない人間なのでBlender以外の操作は全くわかりませんでした。3D coatでステンシルしているところがありました。Blenderでもステンシルはできるっぽい。

- Polyfjord氏

https://youtu.be/uRAfhJQFjRo

https://youtu.be/imbIsNAvUpM

- Iridesium氏

https://youtu.be/5naMFeWTBeY

https://youtu.be/29yfS-icS3M

載せ始めるときりがないのでこの辺で

### おわりに
いろいろ書きましたが、最終的には試行錯誤してBlenderに触れることがBlender上達への近道だと私は思います。チュートリアル動画を通して、モデリングの楽しさを一人でも多くの人に共有できたらいいなと思っています。では皆さん楽しいBlenderライフを！！
AWS LambdaでEC2インスタンスを起動してコマンドを実行。waiter_until_running()ではなく、waiterコマンドを使用する。


AWS Lambdaで、停止しているEC2インスタンスを起動させて、
立ち上がるのを待ってからコマンドを実行する、とした時に
詰まった点があったので備忘録として。

## 結論から
```python:function_lambda.py
import boto3

def lambda_handler(event, context):
    instance_id = '起動したいEC2インスタンスID'
    ec2 = boto3.client('ec2')
    ec2r = boto3.resource('ec2')
    instance = ec2r.Instance(instance_id)
    status_instance = ec2.describe_instances(InstanceIds=[instance_id])

    if status_instance['Reservations'][0]['Instances'][0]['State']['Name'] == "running":
        print('インスタンス起動済 ' + str(instance_id))
    else:
        print('インスタンス停止中 ' + str(instance_id))

        # ここでインスタンス起動
        instance.start()
        print('インスタンス起動中... ' + str(instance_id))

        # インスタンスの起動を待つ！
        waiter = ec2.get_waiter('instance_status_ok')
        waiter.wait(InstanceIds=[instance_id])

    # コマンド実行
    ssm = boto3.client('ssm')
    r = ssm.send_command(
        InstanceIds = [instance_id],
        DocumentName = "AWS-RunShellScript",
        Parameters = {
            "commands": ["cd /xxx/www/yyy/", "bash a.sh >b.log 2>&1"]
            }
        )
    .....
```

## 詰まったところ・詰まった時に使ったwait_until_running()

結果的には、waiterコマンドを使用してインスタンス起動を待ったのですが、
その前は、wait_until_running()を使用していました。

```python:function_lambda.py
ec2 = boto3.resource('ec2')
instance = ec2.Instance('<インスタンスID>')
instance.start()
instance.wait_until_running()

ssm = boto3.client('ssm')
r = ssm.send_command(
......
```

このコードでもインスタンスがrunningになるまで待ってはいるようなのですが、
runningになった瞬間にコマンドが実行されます。

それで良さげなんですけど…
エラーになります。

エラーの内容は**「ssmコマンドが送信できませんでした。EC2インスタンスがコマンドを受け取ることができる状態ではありません。」**みたいな内容です。


##色々試した結果
ssm.send_commandの実行前に、
**time.sleep()**で10秒ほど待つと正常にコマンドが実行されます。
ただ、それだと根本の解決にならないので原因を調べてみました。

##多分これが理由
wait_until_running()では、あくまでrunningになるまで待っていて、
runningになった瞬間すぐはコマンドを実行できる状態ではないのではないか
というところに落ち着きました。

##waiterコマンド
前述の理由から、コマンドを実行できる状態まで待機をする方法を探したところ、waiterコマンドの **instance_status_ok** を見つけました。

**wait_until_running()コマンド + time.sleep(10)** の時は
コマンド実行完了まで40秒ほどで完了していましたが、
waiterコマンドの **instance_status_ok** では
statusが全てokになるまで待機するので実行時間は150秒前後になりました。

実行時間はかなり伸びてしまいますが、インスタンス起動後にコマンドを実行させる場合は後者の方が確実なのでそっちがいいかなと思います。


## まとめ
インスタンスの起動を待つコマンドを検索すると、
wait_until_running() での解決方法がたくさん出てきます。

インスタンスを本当に起動させるだけであればそのコマンドで十分ですが、
その後に何かしら動作をさせたい場合は適切とは言えないかもしれません。

もし同じことで悩んだ人がいて、ここに辿り着いたとしたら、この記事が役に立つと嬉しいです。

:::note info
waiterコマンドでも、引数が 'instance_status_ok'　ではなく
'instance_running' だと wait_until_running() と同じになってしまうので、waiterコマンドで作りたい状況によって使い分けてあげることが大事です。
:::
AOJトライに関する知識知見の記録共有：Volume0-0054

# タスク概要

Sum of Nth decimal places

https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0054

 
# コード実装例
TIPS

1. 例外処理含む評価パターンを追加
1. 小数値入力を考慮

```Python
import pprint, sys, time

def core(arg, acc=True):
    a, b, n = arg[:3]
    if acc:
        ret = []
    else:
        digits = str(a / b).split(".")[1][:n]
        ret = [sum([int(i) for i in digits]), digits]
    return ret

def app(*args):
    ret = []
    for arg in args:
        s = []
        for acc in [True, False]:
            st = time.time()
            try:
                r = core(arg, acc=acc)
            except Exception as e:
                r = e
            s.append([acc, round(time.time() - st, 6), r])
        ret.append([arg, s])
    return ret

print(sys.version)
pprint.pprint(app(
    # basic examples
    [1, 2, 3],
    [2, 3, 4],
    [5, 4, 3],
    [4, 3, 2],
    # additional examples
    [-1.1, 2.5, 2],
    # exceptional examples
    "例外入力"
))
```

# 実行結果
各種補足情報出力（入力値FB、デバッグログ等）含む

```Python
3.8.10
[GCC 9.4.0]
[[[1, 2, 3], [[True, 1e-06, []], [False, 1.7e-05, [5, '5']]]],
 [[2, 3, 4], [[True, 1e-06, []], [False, 5e-06, [24, '6666']]]],
 [[5, 4, 3], [[True, 0.0, []], [False, 2e-06, [7, '25']]]],
 [[4, 3, 2], [[True, 0.0, []], [False, 3e-06, [6, '33']]]],
 [[-1.1, 2.5, 2], [[True, 0.0, []], [False, 3e-06, [8, '44']]]],
 ['例外入力',
  [[True, 2e-06, []],
   [False,
    3e-06,
    TypeError("unsupported operand type(s) for /: 'str' and 'str'")]]]]
```

# 補遺
残課題

1. 実行速度の改善（枝刈り、データ構造の見直し等）
Swift Package ManagerをiOSで使う時はxcodeprojではなくPackage.swiftで読み込もう

Swift Package Manager(以降SwiftPM)がXcodeで正式サポートされてからCocoaPodsやCarthageからの移行を検討しているプロジェクトが増えてきています。
その際、大方の記事では以下のようにXcodeでパッケージを取り込む方法が紹介されます。

https://dev.classmethod.jp/articles/ios-add-library-with-spm/

https://qiita.com/hironytic/items/09a4c16857b409c17d2c

https://www.yururiwork.net/archives/517

しかし、この方法で移行しようとして2つの課題に当たりました。

1. リポジトリ毎にこの作業をする必要がある
1. 複数のTARGETで同じパッケージを使用する時の動線が分かりづらい  
   (TARGET -> Build Phases -> Link Binary With Librariesから追加できる)

特に長く続いたプロジェクトでは当然それだけ多くのライブラリをCocoaPodsやCarthageで使用しており、SwiftPMへの手作業での移行は辛いものがあります。
(XcodeGenを使っていれば話は別ですがw)

そこで、iOSにおけるマルチモジュール開発の代表例として話題になった[pointfreeco/isowords](https://github.com/pointfreeco/isowords)をヒントに依存パッケージのみをまとめたパッケージを作成するアプローチを考えました。

# 手順

前提として、`xcworkspace`上で開発しているものとします。
CocoaPodsを使っていれば必ず使っていますが、そうでない場合xcworkspaceが無い場合もあるので予め追加しておく必要があります。

まず、Project Navigatorの左下の `+` ボタンからNew Packageを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135304/6f8959ff-00c7-9408-8754-168e279c3bde.png)
パッケージ名を入れて `Create` を押すと次の画像の通りworkspaceにパッケージが追加されます(ここでは`Dependencies`というパッケージ名にしています)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135304/d71d3fe9-8b03-6713-ec0e-a82257b26272.png)

追加された `Dependencies` パッケージはアプリTARGETの `Link Binary With Libraries` から追加することで、 `Dependencies` ターゲットで指定したパッケージを使用することができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135304/642af208-f192-9aa8-be2e-a72aca308629.png)
(下記画像のようにimportで補完もされることが確認できます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135304/f389366e-06a0-0cf2-467b-3b5551185ac1.png)

ちなみに、`Sources/Dependencies`には最低限1つ以上のSwiftファイルが必要になりますが、これは空のSwiftファイルでも問題ありません。

また、テスト用のライブラリもそれ用のターゲットを用意してあげれば別個に組み込むことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135304/41ddd0e5-8492-6972-9dc7-b231aeb1cb77.png)

# まとめ
xcodeproj上でパッケージを管理するのではなく、Package.swiftに移譲する方法を紹介しました。
これによって、SwiftPMでのパッケージ管理をprogrammaticallyに行うことができます。

また今回は依存パッケージの移行が目的でしたが理論上はこのパッケージにプロダクトコードやテストコードも移行できるはずなので、将来的にisowordsのようなマルチモジュール開発への足がかりにもなると考えています。

# 参考
- https://www.notion.so/isowords-8f8982eb3a9a4665b2fa688b06791b70
- https://zenn.dev/yimajo/scraps/591dbf1ea6a434
インフラエンジニアによるカレーの構築

#カレーの構築
インフラエンジニアがカレーを作るにあたり、要件定義、設計、構築に分けて構築をしてみました。

##要件定義
今回作るカレーに求める要件は以下の通り。
　・種類　　　：インドカレーであること
　・作り方　　：市販のルゥを使用しないこと
　・メインの具：肉は鶏肉を使うこと
　・食感　　　：食感はサラサラしていること
　・ボリューム：4人前程度の量であること
　・色　　　　：辛くなさそうにしたいため赤くないこと
　・辛さ　　　：複数人で食べることが考慮されていること

##設計
要件から、以下注意点を考慮し、以下パラメータの通りチキンカレーを構築する。
・市販のルゥは利用しないためスパイスを複数利用する
・食感はサラサラである必要があるため、パウダースパイスは極力少なくし、ホールスパイスを利用する。また、コリアンダーは少な目とする。
・色は赤くしないため、ターメリックを使用して黄色くし、色に合わせ爽やかでフルーティーな味わいを目標とする。
・複数人で食べられるようにするよう、辛さを抑えることとする。

###パラメータ
　[具材]
　・鶏モモ肉　　　　  ：400g程度 ※手羽元の場合食べ辛いが旨味が増す傾向有
　・パプリカ(黄)　　　：1個
　・トマト　　　　　　：1個
　・玉ねぎ(スライス)　：1個
　・生姜(みじん)　　　：15g　※桃屋の既にみじん切りになっているものでも可
　・ニンニク(みじん)　：15g　※桃屋の既にみじん切りになっているものでも可
　・ココナツミルク缶詰：50g  ※缶詰でなくペースト状のものがあれば保存も効いて尚良
　・塩　　　　　　　　：小さじ1
　・サラダ油　　　　　：大さじ3

　[マリネ用]
　・無糖ヨーグルト　　：大さじ2
　・塩　　　　　　　　：1つまみ
　・ガラムマサラ　　　：小さじ1

　[ホールスパイス]
　・クミン　　　　　　：小さじ1
　・クローブ　　　　　：5粒
　・シナモンスティック：1本
　・カルダモン　　　　：5粒
　・ローリエ　　　　　：1枚

　[パウダースパイス]
　・ターメリック　　　：小さじ1/2
　・カイエンペッパー　：小さじ1/2
　・コリアンダー　　　：小さじ1

##構築
構築にかかる時間はマリネを事前に行う前提で、1時間半程度

###①マリネ
・鶏モモ肉の皮を取り除き、一口大に切ってボウルに入れる
・ボウルに[マリネ用]を入れ混ぜ合わせる
・ボウルにラップをして1h～24h冷蔵庫に入れる
　**※マリネする代わりに上記の具材をフライパンで、鶏肉を抑えつけながら炒めるのも良い**

###②野菜
・パプリカはヘタと種を除き一口大に切る
・トマトはヘタを除き1cm角に着る

###③テンパリング
・鍋にサラダ油を入れ熱し、中火で[ホールスパイス]を入れて中火で泡が出るまで炒める。
・鍋にみじん切りの生姜、ニンニクを投入しきつね色になるまで炒める
・鍋に玉ねぎを入れ、その後塩を一つまみを入れ飴色になるまで炒める。(塩は脱水効果による時短効果有)
　**※上記作業は焦がさないように常に混ぜながら行う。**
　**※玉ねぎは羆色(こげ茶)まで炒めると色味が悪くなるため注意する。**

###④トマトを加える
・鍋にトマトを入れ、煮崩れてひとつにまとまるまで炒める

###⑤パウダースパイスを加える
・鍋の火を止める
・鍋に[パウダースパイス]を加える
　※隠し味を入れるならこの辺りがおすすめ
・鍋を中火にかけて混ぜながらなじませる

###⑥鶏肉を加える
・①のマリネをマリネ液ごと加え、鶏肉の色が変わるまで炒める。

###⑦煮込む
・鍋に水カップ1+1/2を加え、パプリカを加える。
・鍋が煮立ったらふたをして弱火で15分煮込む

###⑧ココナツミルクを加える
・鶏肉に火が通っていることを確認してココナツミルクを加える。
・塩小さじ1強を加える。
・5分間煮込む

###⑨盛り付け
・以上で完成だが、ご飯に生姜の細切りを加えるとなお良い。
　→ターメリックライスを作っても良し

#最後に
・おすすめの隠し味：
　ナッツ、バター10gくらい

・おすすめのスパイス屋さん
　上野　大津屋様
　**※空いている時間が短いので注意**

・おすすめの本
　水野仁助著　カレーの教科書
Bitcoin CashのアドレスをJSで変換する

# はじめに

Bitcoin CashのLegacy Address`1B9UNtBfkkpgt8kVbwLN9ktE62QKnMbDzR`
を
Cash Address`bitcoincash:qph5kuz78czq00e3t85ugpgd7xmer5kr7c5f6jdpwk`
に変換したいというようなことがあったりします。

変換用ライブラリはたくさんあるようですが、bchaddrjsを使ってみたら
使いやすかったので、ご紹介します。

https://github.com/ealmansi/bchaddrjs

# 実装

```bchAddressConverter.js
import bchaddr from 'bchaddrjs';

var address = process.argv[2];

var isCashAddress = bchaddr.isCashAddress;
var isLegacyAddress = bchaddr.isLegacyAddress;
var toLegacyAddress = bchaddr.toLegacyAddress;
var toCashAddress  = bchaddr.toCashAddress;

if (isCashAddress(address)) {
  var legacy_address = toLegacyAddress(address);
  console.log(legacy_address);
} else if (isLegacyAddress(address)) {
  var cash_address = toCashAddress(address);
  console.log(cash_address);
}
```

↓にソースコードを置いています。

https://github.com/shu-kob/bch-address-converter

```bash
node bchAddressConverter.js bitcoincash:qph5kuz78czq00e3t85ugpgd7xmer5kr7c5f6jdpwk
```

```
1B9UNtBfkkpgt8kVbwLN9ktE62QKnMbDzR
```

Cash AddressをLegacy Addressに変換できました。

```bash
node bchAddressConverter.js qph5kuz78czq00e3t85ugpgd7xmer5kr7c5f6jdpwk    
```

```
1B9UNtBfkkpgt8kVbwLN9ktE62QKnMbDzR
```

Cash Addressの「bitcoincash:」がなくてもLegacy Addressに変換できます。


```bash
node bchAddressConverter.js 1B9UNtBfkkpgt8kVbwLN9ktE62QKnMbDzR 
```

```
bitcoincash:qph5kuz78czq00e3t85ugpgd7xmer5kr7c5f6jdpwk
```

逆にLegacy AddressをCash Addressにできました。

簡単なのでお試しあれ。

↓もっと色々やってみたい方は「bchaddrjs」のREADMEを読んでみましょう！

https://github.com/ealmansi/bchaddrjs
ExcelにSPLIT関数がないので１セルの数式だけで再現してみた

GoogleのスプレッドシートにはSPLIT関数があるのに、Excelにはなぜないの？って思ったことはありませんか？
区切り文字機能やVBAを使えばできるけど、違う、そうじゃない。GoogleのSPLIT関数のように１セルに入力する関数だけで実現したいんだ！
ググっても出てこないなら自分で考えるしかない！ってことで試行錯誤してみたら実現できたので紹介します。

#紹介すること
「,」（カンマ）などの区切り文字つきで入力されたテキストを、ひとつのセルに入力した数式だけで個別のセルに分割して格納できる方法を紹介します（下図参照）。VBAは使いません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26796/72cdfad3-a6c6-ca8c-5739-6dab9a6e1df2.gif" width="70%">
これでGoogleスプレッドシートのSPLIT関数と同じ使い勝手でいける！

##Excel 2016以前は使えません
今回紹介する方法はスピル機能を使うため Excel 2016 以前のバージョンでは使えません。
Excel 2016 以前で数式のみで実現するには、下図のように中間加工用のセル（B5:B8）と、抽出文字列の番号を指定する補助セル（D4:G4）を使った方法この方法しかなさそうです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26796/84ab2ff2-4752-89eb-01da-dbfd0b1fa1fe.gif", width = 70%">
#できたもの
完成版の数式はこちらです。

    =LET(sp,[区切り文字],txt,TEXTJOIN(sp,TRUE,[セル範囲]),pre_sp,sp&txt,post_sp,txt&sp,x,FILTER((MID(pre_sp,SEQUENCE(LEN(pre_sp)),1)=sp)*(SEQUENCE(LEN(pre_sp))),(MID(pre_sp,SEQUENCE(LEN(pre_sp)),1)=sp)*(SEQUENCE(LEN(pre_sp)))>0,),y,FILTER((MID(post_sp,SEQUENCE(LEN(post_sp)),1)=sp)*(SEQUENCE(LEN(post_sp))),(MID(post_sp,SEQUENCE(LEN(post_sp)),1)=sp)*(SEQUENCE(LEN(post_sp)))>0,),TRANSPOSE(MID(txt,x,y-x)))


長いですが、式の最初のほうにある [ ] 括りの２箇所を以下のように変更するだけですぐ利用できます！

    [区切り文字] -> 区切り文字を指定 （例: ","）
    [セル範囲]   -> 読み込む対象のセル範囲（例： A1, A1:A5 など）

他の箇所は変更せずそのままで！

##Googleスプレッドシートより便利な点もあります
セル範囲は指定例に示した通り範囲指定ができるようにしたので、次のように複数セルのカンマ区切り文字から値をリストアップすることができます。
![Animation4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26796/34808a79-4d02-7a4f-1746-38efc4e31d8a.gif)
数式の最後にあるTRANSPOSE関数をUNIQUE関数に変更すれば、重複なしの値リストを縦にリストアップすることもできます。
![Animation6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26796/3d64a807-b967-d22d-b45e-9b6062181ed9.gif)
#解説
数式の仕組みについては、後日解説記載します。
pokemonと一緒におみくじを引こう

## 
※本記事は[LINE DC Advent Calendar 2021 ](https://qiita.com/advent-calendar/2021/linedc) 11日目の記事になります。

## 初めに
関西大学に通う学部1回のキンジョウです！
久しぶりにMessagingAPIを使った開発をしたので、少しでも昔よりも成長したらいいかなと思います！

## 作成のきっかけ
何を開発しようと考えていたとき、お正月も近いし、おみくじなんてどうだろ？と思い、それだけなら自分でも作れそう？？と思いまいした。

さらにただおみくじだと面白くないので、せっかくなら小学校のころにはまったポケモンでも取り入れたら面白そうと思ったのが、きっかけです。

機能としては、簡単なので実稼働時間は20時間ぐらいで開発しました！

## 成果物

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">趣味開発done<br>やはりおみくじはいい<br>Pokémonとか好奇心刺激しまくり <a href="https://t.co/th7yqv9Se7">pic.twitter.com/th7yqv9Se7</a></p>&mdash; キンジョウ/金城翔太郎 (@kinjyo1130) <a href="https://twitter.com/kinjyo1130/status/1469999400164663299?ref_src=twsrc%5Etfw">December 12, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 使った技術
[GAS](https://workspace.google.co.jp/intl/ja/products/apps-script/)と[pokemonAPI](https://pokeapi.co)です

なぜこの技術を使ったのか？
・自分が使い慣れている
・スプレッドシートがデータベースとして、容易に使用できる
・環境構築がいらないから、すぐに開発に入れる
などの理由です！

次は、AWSとかを使って開発をしてみたいです！


## はまったポイント
おみくじの機能は、2時間ぐらいでできたのですが、1日1回だけおみくじを引かせると言う点で少しハマりました。

具体的には、まずどのように、『時間経過を判定するのか』と『フローをしては、どのようにしたらいいだろう？』と言う点でした。(ほぼ全部ですが笑)

まず、『時間経過を判定するのか』
・ローカル変数で、値を保持しよう　-> 六時間が限界 NG
・MessageAPIで特定のトーク履歴の情報のAPIあるかな？　-> そんなのはなかった　NG
・一人一人のUserIDに紐付けて管理する　-> スプレッドシートで管理する　OK

『フローをしては、どのようにしたらいいだろう？』
・地道にまずは、手を動かすところだなと思い、手書きで自分が思うフローを書き上げました。
![S__4325381_0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763535/91e5f74c-3f67-dd19-e401-e5b35e679332.jpeg)

こんな感じでやってました！見にくくてすいません！
自分の頭で考えてることは、一度すべて書き起こすと思考が整理されて、とても思ってることに近づいてる感じがしました。

もっと具体的な流れとしては、
[day.js](https://day.js.org)を読み込んで、

```index.js
//現在の時間.diff(前回の時間,'day') >= 1
current_time.diff(last_time, 'day') >= 1
```
上記のコードで、1日経過していたら、bool値を返します。

あとは、UserIdがスプレッドシートにあるかどうかを判定して、あれば時間経過を判定して、なければUserIdを登録して、時間も記入をしていく感じです！


## まとめ
[友達追加をする](https://line.me/R/ti/p/@615daews)
こちらから登録して、使ってみてください！
もし、バグなどがあれば、コメント等で受け付けます！
ここが知りたいやわかりにくいなどもあれば、どんどん追記していきますので、お知らせください！

ぜひ、良いお正月を！！！
steamlitをrunするためにどうやってwhlとC++(14以上)をインストールしたか

・whlファイルの読み込みエラー発生
　→cpを探すためのコードでエラー発生
　　→pipのバージョンによって該当関数get_supported()の場所が違うことを別記事で発見
　　←いくつかの記事で見たPathを自分のPCでもないか探し、無事関数が見つかる。
　←cpが分かりインストールすべきwhlファイルが分かる。
←whlファイルを無事実行できた。

・「Microsoft Visual C++ 14.0 is required」のエラー発生
　→エラーリンクからDevToolのみダウンロードするも同じエラー再度発生
　　→VSをC++のセット(約10GB）でインストールし直す
←エラーが解消。

感想：エラー文ちゃんと読もう。
LernaでReactとNestJSのプロジェクトをモノレポ化する

## はじめに
複数のプロジェクトを、まとめて一つのgitリポジトリで管理したかったので、
[Lerna](https://lerna.js.org/) という、複数パッケージを管理するためのツールを試してみました。

## 複数のプロジェクトを作成する
フロント側は[React](https://ja.reactjs.org/)で作成し、サーバ側は[NestJS](https://nestjs.com/)で作成します。

まず最初にsampleディレクトリを作成し、そのディレクトリの中に移動します。

```bash
mkdir sample
cd sample
```

Lernaがインストールされていない場合は、インストールしておきます。
グローバルインストールしても構いません。

```bash
npm install lerna --save-dev
```

次に以下のコマンドを入力し、Reactのプロジェクトを作成します。
**{プロジェクト名}**には任意のプロジェクト名を設定できます。
今回は「front」にしました。

```bash
npx create-react-app {プロジェクト名} --template typescript
```

プロジェクトが作成されたら、
frontディレクトリ内の.gitを削除しておきます。

```bash
rm -rf front/.git
```

次に以下のコマンドを入力し、NestJSのプロジェクトを作成します。
**{プロジェクト名}**には任意のプロジェクト名を設定できます。
今回は「server」にしました。

```bash
nest new {プロジェクト名}
```

プロジェクトが作成されたら、
serverディレクトリ内の.gitを削除しておきます。

```bash
rm -rf server/.git
```

次に、フロント側とサーバ側のポート番号が衝突しないよう、
サーバ側のポート番号を 3000 → 3001 に変更します。

```typescript:server/src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3001); // 3000 → 3001 に変更
}
bootstrap();
```

## モノレポ化を行う
それではいよいよLernaでモノレポ化していきます。
以下のコマンドを実行すると、lerna.json、package.json、packagesが作成されます。

```bash
lerna init
```

続いて、front、serverをパッケージ化するために以下のコマンドを実行します。


```bash
mv front packages
lerna create @sample/front packages/front
```

```bash
mv server packages
lerna create @sample/server packages/server
```

これでモノレポ化は完了です。
以下のコマンドで、それぞれのプロジェクトでビルドを実行でき流ようになっていると思います。

```bash
lerna run build
```

## おわりに
まだ他にも設定しなきゃいけないことはありますが、
ひとまずモノレポ化の手順については以上になります。
[React]関数に対してのuseCallbackとuseMemo

#関数に対してのuseCallbackとuseMemoの違い

`useCallback`は**関数自体**をメモ化します。
ですが、
`useMemo`では関数の**結果**をメモ化するので
全く違うものです。
細かい部分ですが、覚えておくと質問された時などに役立つかもしれないです。


ありがとうございました。
【Vue.js】Nuxt3でVuetify3を使えるようにする

## 概要
2021年12月時点でNuxt3はベータ版、Vuetify3はアルファ版です。ただ、この時点でもちょっと使いたいと思ってしまったので、Nuxt3でVuetify3を使えるか試してみました。なお、正式版が出た際にこの方法で大丈夫かは分かりませんので、あくまで参考までにというところです。

## 対応
Nuxt3はインストール済みの前提とします。Nuxt3のインストールについては[Nuxt3を試してみる](https://litely.net/post/tech/nuxt/guide/nuxt3/)をご参考ください。そして、Nuxt3にてVuetify3を使用できるようにするには[how to use vuetify 3 alpha in new nuxt 3](https://github.com/nuxt/framework/discussions/1183)の記事が参考になりました。
記事を参考に、以下の方法でとりあえずは動きました。

### 【1. Vuetify3のインストール】
まずは、以下のようなコマンドでインストールします。（バージョンについては適宜編集ください）
`yarn add vuetify@3.0.0-alpha.11`

### 【2. pluginへの設定追加】
pluginの設定にVuetifyを追加します。なお、Nuxt3のpluginについての詳細は[【Vue.js】Nuxt3でpluginの設定を行う](https://zenn.dev/someone7140/articles/7d90f7b3aa0f55)の記事をご参考ください。

```js
import { defineNuxtPlugin } from '#app'
import { createVuetify } from 'vuetify'
import {
    VApp,
    VAppBar,
    VBtn
} from 'vuetify/components'

export default defineNuxtPlugin((nuxtApp) => {
   const vuetify = createVuetify({
       components: {
           VApp,
           VAppBar,
           VBtn
       }
   })
   nuxtApp.vueApp.use(vuetify)
})
```

### 【3. nuxt.config.tsへのトランスパイル設定追加】
`nuxt.config.ts`へ以下のように設定を追加します。

```ts
import { defineNuxtConfig } from 'nuxt3'

export default defineNuxtConfig({
  css: ['vuetify/lib/styles/main.sass'],
  build: {
      transpile: ['vuetify']
  },
})
```

### 【4. vutifyのglobals.mjsの編集】
この手順はいずれは不要になると思いますが、2021年12月時点だとvutifyにて　`process.env.DEBUG`の値が上手く入らず、node_modulesの編集が必要な状態です。
`Uncaught TypeError: Cannot read properties of undefined (reading 'DEBUG')`　のようなエラーが発生した場合は、[こちら](https://github.com/nuxt/framework/discussions/1183#discussioncomment-1646664)のコメントを参考に、下記の通り`node_modules/vuetify/lib/util/globals.mjs`を編集します。

```globals.mjs
export const IS_NODE = typeof process !== 'undefined';
export const IN_BROWSER = typeof window !== 'undefined';
export const IS_DEBUG = false; // IS_NODE && process.?env.DEBUG === 'true';
export const IS_PROD = false; // IS_NODE && process.?env.NODE_ENV === 'production';
export const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
export const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
```
【Dart】Factoryコンストラクタって何？

###定義
Factory修飾子のついたコンストラクタのこと。
呼び出し側でインスタンス生成を試みた場合（newした場合）、
通常であれば引数に応じて呼び出されるコンストラクタが決定し、自動的にインスタンスが生成される。
その一方で、呼び出されたコンストラクタにFactory修飾子がついていた場合は
自動的にインスタンスの生成はされないため、そのコンストラクタ内でnewする必要がある。
∵Factory修飾子自体が、キャッシュされたインスタンスを呼び出すために実装されているため

###躓いた箇所
（③）Factory修飾子のついたコンストラクタ内でnewされることによって、
（④）さらにもう一度、そのクラス内の別のFactory修飾子のついていない方のコンストラクタが呼び出される。
→通常、呼び出されるコンストラクタは１つのみという思い込みがあり、気づくの時間を要した。


```
class Name {
  final String first;
  final String last;

  factory Name(String name) {
    var parts = name.split(' '); // ②引数に渡された文字列をスペースで分割して配列に格納
    return new Name._(parts[0], parts[1]);　　// ③ここで初めてインスタンスを作成
  }

  Name._(this.first, this.last);　　//　　④２回目に呼び出されるコンストラクタ
}

main() {
  Name name = new Name("Fred Flinstone");  //①factory Name(String name)コンストラクタを呼び出し
  print("${name.first} ${name.last}");　　//  ⑤2回目に呼び出されたコンストラクタが反映される
}
```

###上記コードの出自
公式様
https://sites.google.com/site/dartlangexamples/learn/class/constructors
Constructors
  a.Generative
  b.Named
  c.Factory
  d.Inheritance

###用途
Singletonパターンを実装するときに利用されるそうです。
https://flutter.keicode.com/dart/constructor.php



###Advanced Info
こちらの記事だと説明が丁寧でわかりやすかった。
https://medium.com/nerd-for-tech/factory-constructor-in-dart-part-1-1bbdf0d0f7f0

もっと詳しい内容
http://tech.curlap.com/curlguide/curl/docs/rte/8.0/ja/docs/ja/dguide/constructors.html
[Ruby on Rails]Twitter API利用方法

#Twitter APIでできること
 APIを使うことで実際に使っているツイッターの情報を利用することができます。
ツイッターの情報とは主に、
・自分のツイッターアカウントを用いてツイートを行う、ツイートにコンテンツの追加
・Twitterの検索機能、トレンドの検索
・アカウントのフォロー、フォローの解除
・アカウントのブロック、ミュート機能
・DM
・ショートメール
・ウェブサイトとアプリの統合
などのTwitterに関する機能をwebアプリで使うことができます。

#TwitterのAPI利用申請
　APIを使用するには、Twitterアカウントが必要ですので事前に作成してください。
 [ツイッターアカウント作成](https://twitter.com)
アカウントをログインした状態で[Deeloper用のサイト](https://developer.twitter.com/en/portal/projects-and-apps)にアクセスします。

ログインしていれば右上に「Create an app」ボタンが出ると思うのでクリックします。
![2d2d33f8daaf047349936637a61babf2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326534/b9130db5-9c66-a936-2813-13cd5f1bc6e1.png)

そこから、必要項目の入力、英文でAPIの利用目的の記入をして申請をします。
*利用目的について英文で書かれていたけど日本語でも大丈夫みたいです。

大丈夫でしたら、ツイッターからメールが届くと思うのでメールに記載しているurlをアクセスすれば登録が完了します。

#APIキー、トークンの取得
TwitterAPIの機能を使うにはAPIキー、トークンが必要になるので用意します。

登録が完了したら、「Create an app」ボタンを押すと、「アプリ名」「アプリの説明」を入力することでアプリの登録ができます。

「Keys and tokens」タブをクリックするとトークンが生成する画面が出ますのでそちらで生成します。

#APIを利用して現在のトレンド取得
実際にトレンドを取得してみます。
まずは、gemが必要なので導入します。

```Gemfile
gem 'twitter'
```
忘れないよう「bundle install」は必ず行ってください。

.envファイルなどでキーの設定します。
中身は先程生成したトークンやキーです。

```.env.rb
TWITTER_API_KEY=""
TWITTER_API_SECRET_KEY=""
TWITTER_ACCESS_TOKEN=""
TWITTER_ACCESS_SECRET_TOKEN=""
```

実際に取得して表示すると

```controller.rb
client = Twitter::REST::Client.new do |config|
      config.consumer_key        = ENV['TWITTER_API_KEY']
      config.consumer_secret     = ENV['TWITTER_API_SECRET_KEY']
      config.access_token        = ENV['TWITTER_ACCESS_TOKEN']
      config.access_token_secret = ENV['TWITTER_ACCESS_SECRET_TOKEN']
    end
    # 日本のトレンド取得
    id = 23_424_856
    @trends = client.trends(id).attrs[:trends]
```
のような感じで日本のトレンドが取れるかなと思います。
あとは、viewで表示するだけです。
実際に取得して表示してみました。
<a href="https://gyazo.com/e636206e163840f38158feaff365729b"><img src="https://i.gyazo.com/e636206e163840f38158feaff365729b.jpg" alt="Image from Gyazo" width="1437"/></a>

#感想
外部APIを触ってみて、基本英語で読めなかったので翻訳しながらの繰り返しだったけどリファレンスなどをみてたらなにをしたらいいのかだんだんわかってくるようになる。
やれることが多くて意外と楽しい！モチベ上がる！！
今回はトレンド取得のみだったけど自動ツイートとか結構おもしろそうかも。。。

#参考
[2021年度版 Twitter API利用申請の例文からAPIキーの取得まで詳しく解説](https://www.itti.jp/web-direction/how-to-apply-for-twitter-api/)

[【Rails】Twitter APIを使ってトレンドを取得したい](https://qiita.com/nyappy15th/items/80682c2e9db82c084336)

[gem twitter](https://github.com/sferik/twitter)

[reference](https://www.rubydoc.info/gems/twitter/Twitter/REST/Client)
RadeonとかのGPU使用率を取得(Python)

誰かに使えるわけでもない、そんな記事です。
自分へのメモ用に…

# はじめに
ふと、RadeonとかのGPU使用率ってどうやって取るんだ?という疑問をもった
Radeonソフトとか、パフォーマンスモニター、タスクマネージャーを使うとできるんだけど、それを数値で取得したいなぁと思った
というのは、ちょうど、モニタリングアプリケーションを作っていた

https://qiita.com/ppza53893/items/6bd3c5923376f348889b

ので、なんか最後にpythonでできないかなーと思い、いろいろ調べてみた。

すると、stackoverflowとかでそれっぽいのを発見
- https://stackoverflow.com/questions/56830434/c-sharp-get-total-usage-of-gpu-in-percentage
- https://superuser.com/questions/1632758/how-to-get-gpu-usage-and-gpu-memory-info-of-a-process-by-powershell7

お、できそうだ。やってみよう。

# コード
pythonnetで`PerformanceCounterCategory`、`PerformanceCounter`と`List`を引っ張ってきます。
`List`を引っ張ってくるのは、pythonの`list`より若干処理が速いためです。
~~「C#でよくね?」と思った方、その通りです~~

こんな感じで取得できます。

```python
import re
import clr
import time

clr.AddReference('System.Diagnostics.Process')
clr.AddReference('System.Collections')

import System.Diagnostics as Diagnostics # type: ignore
from System.Collections.Generic import List # type: ignore

GPU_Engines = None

def get_process_counter() -> List:
    category = Diagnostics.PerformanceCounterCategory('GPU Engine')
    ret = List[Diagnostics.PerformanceCounter]()
    
    for cat_name in category.GetInstanceNames():
        if re.findall(r'engtype_3D', cat_name):
            ret.Add(category.GetCounters(cat_name)[-1])
    
    return ret

def gpu_usage() -> float:
    global GPU_Engines
    if GPU_Engines is None:
        GPU_Engines = get_process_counter()
        _ = [x.NextValue() for x in GPU_Engines]
        time.sleep(1)
    
    return sum(gpu.NextValue() for gpu in GPU_Engines)


if __name__ == '__main__':
    print(gpu_usage())
    time.sleep(1)
    print(gpu_usage())
```

`gpu_usage()`を呼び出すと使用率を表示してくれます。初回だけ、PerformanceCounterの関係上、初期化でsleepしているので遅いです。それ以降はすぐに出してくれます。
Vim　コマンド　思考の領域に近い

## はじめに
Vimerなるものになると思考の領域に近づけるらしい。 ソースはyoutuber笑
vimはcuiなのでターミナル上で使うエディタです。
vscode信者だった僕はvimを使ってる解説動画を見ると熱々おでんで火傷する呪いをかけたくなるのですが、使ってみて気づいた。
これは思考の領域に近い。　今まで火傷した人すみません。

## Vimコマンド

**vimを開く**
`vim ファイル名`

**テキストモード**
`i`

**行末にテキストを追加**
`A`

**保存と保存なし**
`:wq`
`:q!`

**単語を消去**
`dw`

**文末まで消去**
`d$`

**行を消去**
`dd`

**複数回同じ処理を繰り返し**
`d2$`*文末まで消去を2回*

**モーション**
`w`次の単語の一文字目に移動
`e`次の単語の最後に移動
`0`行頭に移動

**モーションとカウント**
`2w`2個目の単語の最初に移動


**処理を取り消す**
`u` `U`

**取り消しを取り消す**
`contr + R `



**消去したテキストを貼り付け**
`p`

**文字を置き換える**
`r`*異文字だけ変更する場合*

**単語を書き換える**
`cw` `c$`

**前方検索**
`/`の後に検索したい文字列

**直近の検索をもう一度**
`n`

**対応する(, { 等を調べる**
`%`

**ファイル内での一とファイルの状態を表示**
`cont + G`

**ファイルの先頭に行く**
`gg`

**ファイルの最後に行く**
`G`

**間違いを修正する**
`:s/thee/the`その行で最初に見つかった１回
`:s/thee/the/g`その行全体

**外部コマンド実行**
`:! ls`等

**改行して挿入モード**
`o`

**上に挿入**
`O`

**カーソルの次から文字を挿入**
`a`

**コピー**
`ビジュアルモードで選択してy`

**貼り付け**
`p`
モジュラーモノリスに対する考察

この記事は　[ZOZO #3 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/zozo) １7日目の記事になります。

現在携わっているプロジェクトでは、少しだけモジュラーモノリスに挑戦してみました。マイクロサービスとどこが違うのか少しだけ整理してみようかと思います。

![qiita3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150455/176a961d-3b2d-b476-c684-8cd60f7919f8.jpeg)

簡単なアーキテクチャは↑のような感じ。

コンテキスト間の連携についてはマイクロサービスであればgRPCやREST API、メッセージングなどを使用しますが、モジュラーモノリスであれば、コンテキスト間にモノリスアダプタをおいて、このアダプターを経由してやりとりします。


ポイントとしては
・　トランザクションの境界は各コンテキスト。モノリスであっても２相コミットはしないこと
・　モノリスであってもコンテキスト間ではモデルを共有しないこと。（今回はprotocol bufferを使用）
・　モノリスアダプタの実装はできるだけgRPCに近い実装になるようにした


これを実装してみての感想を２つ。

１つ目はモノリスアダプタの実装は頑張る必要なかったかも。色々こねくりまわしてgRPCぽい実装にするよりもモノリスの利点を生かして単純なメソッド呼び出しで十分だったかと。

もう一つが重要で、、、結局***マイクロサービスで実装するのと変わらない大変さがあること。***

特にトランザクションの境界。結局コンテキストごとにわかれるので、上記図、コンテキスト１からコンテキスト２への連携で考えるとコンテキスト２のトランザクションが成功し、その後、コンテキスト１が失敗すれば、コンテキスト２を元に戻す処理を実行する必要があります。
マイクロサービスでいう、***補償トランザクション***ですが、モジュラーモノリスにしたところで必要になるのです。

であれば、マイクロサービスでいうオーケストレーションツールに近いことを自力で用意するか（***Sagaパターン***を実装）、アプリケーション層をごちゃごちゃ書くかが必要になりまあ大変です。

では、結論としてモジュラーモノリスをやめた方がいいかと言うと、これまた微妙で、
・　マイクロサービスにしてK8sを管理できる人がいない
・　それでもモノリスにはうんざりしている
・　アプリケーションを管理するのが１チーム（マイクロサービスごとに管理チームがわかれるようなことがない）
場合には挑戦しがいがあると思います。
ただし、ほぼ実装面はマイクロサービスと同じようになるということを覚悟する必要があるでしょう。

それと、マイクロサービスにできるならしてしまったほうが事例も多いしやりやすいかもしれない・・・ということを付け加えておこうと思います。

明日は、@sashihara　さんによるエンジニア組織の組織開発っぽい何かの記事になります！
ReactのpropsとuseState()の分割代入でカッコ{}[]が違うのはなぜ！！！？？

#propsで受け取る場合と、useState()で受け取る場合が違う・・・
propsは親から子へパラメータを受け渡すときに使うヤツ。
useState()は変数を動的に変化させるときに使うヤツ。

チュートリアルで「どっちも分割代入で受け取るよ！」とは言うものの、
なんか受け取るときのカッコが違くね？と疑問に思った初心者向けです。

##どっちも分割代入で配列を受けとる

```react:props
const {name, age} = props;
```
```react:useState()
const [num, setNum] = useState([]);
```

propsは{}中括弧で受け取るのに対し、useState()は[]大括弧で受け取る。
この違いがすごい気になりました。

##オブジェクトか配列かの違い
そもそもの勘違いでpropsは配列リテラルではなく、オブジェクトリテラルが帰ってきている。というだけの話。
jsに慣れてないので、この値の違いがいまいちわからずハマってました。。。
まあ詳しくはjsの分割代入のリファレンス読んでください。
⇒https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

##要はこういうこと（※簡単に理解するためのイメージです。）

```react:props
props{
 name : "山田太郎",
 age : 20
};
```
```react:useState()
let num = 1;
const setNum = (param) =>{
 num = param;
}

// これをuseState()の戻り値として返してるイメージ
const state[num, setNum]
```
実際にそういう実装になってるとかっていう話ではないです。
ReactというかJavaScriptのお話でした。
SwitchBot温湿度計の測定値をenebularで取得・加工してFirebaseに書き込む

SwitchBot温湿度計の測定値をenebularで定期的に取得・加工して、FirebaseのRealtime Databaseに書き込みます。

参考までに以下の画像は、SwitchBotアプリからエクスポートした測定値です。*太字の列

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303867/ca64f4b9-79ae-63c3-93f9-acbc5e33a06c.png)

今回はSwitchBotアプリのエクスポート機能を利用せずに、任意の時間間隔（10分ごとなど）で温湿度計の測定値を取得し、Realtime Databaseに書き込みます。

# 作成例

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303867/62d02777-b765-09c4-b999-07964a35fb3a.png)


# 用意するもの

- enebular
    - プロジェクトが作成済みであること
    - [node-red-contrib-firebase-admin](https://flows.nodered.org/node/node-red-contrib-firebase-admin)ノード
- Firebase
    - プロジェクトが作成済みであること
    - Realtime Databaseが作成済みであること（開始モードはテスト、ロックどちらもで可）
- [SwitchBot](https://www.switchbot.jp)
    - SwitchBotアカウントが作成済みであること
    - SwitchBotアプリをスマートフォン等にインストール済みであること
    - 任意のSwitchBot製品を少なくとも1つ利用できること
    - SwitchBotクラウドサービスがオンになっていること

`node-red-contrib-firebase-admin`ノードの設定方法は、[node-red-contrib-firebase-adminを設定してRealtime Databaseを使う](https://qiita.com/parkborn241/items/ddc6db247d002e33f286)の記事を参考にしてください。

SwitchBot APIを呼び出すフローの作り方は、[SwitchBot APIを呼び出すフローを作る](https://qiita.com/parkborn241/private/f2e43b4c486f620c3e29)の記事を参考にしてください。

# 手順

## SwitchBotの温湿度計を定期的に読み取る

温湿度計のステータスを取得するために、以下のAPIを呼び出します。

> GET /v1.0/devices/{deviceId}/status

次のような成功レスポンスを確認できます。

```
{
  "statusCode": 100,
  "body": {
    "deviceId": "FFD76108E882",
    "deviceType": "Meter",
    "hubDeviceId": "D0BD24DB6CAF",
    "humidity": 42,
    "temperature": 21.8
  },
  "message": "success"
}
```

単独ではタイムスタンプがないので、`function`ノードで`body`に書き込みます。

```
msg.payload.body.ts = Date.now();

return msg;
```

APIのレスポンスにタイムスタンプを書き込めるように、`http request`ノードの [出力形式] をJSONオブジェクトに変更しておきましょう。


## 測定値をRealtime Databaseに書き込む

[SwitchBotの温湿度計を定期的に読み取る](#switchbotの温湿度計を定期的に読み取る)で取得した測定値を、Realtime Databaseに書き込みます。

古い測定値を編集する必要はないので、`PUSH`メソッドを使います。

`rtdb-push`ノードのヘルプどおりに、payloadに"path"と"obj"を加えましょう。

```
// functionノード

msg.payload.body.ts = Date.now();
msg.payload.path = "/";

// body だけあれば良い
msg.payload.obj = {
    ...msg.payload.body
}

return msg;
```

温湿度計の測定値を、定期的にRealtime Databaseへ書き込めました :tada:

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303867/87d6851e-2fbd-7b03-f01d-8852ee0c149d.png)
[SSH] 踏み台を経由して一発でSSHする

## やりたいこと
リモートサーバへSSHアクセスする際に、
踏み台のサーバに入らずに、一発で目的のサーバに入る

```- 例(通常)```  MyPC > 踏み台サーバ > 目的サーバ 
```- 例(やりたい事)```  MyPC >  > 目的サーバ 

```jsx
(myPC) $ ssh hostname
```


## 通常SSHで目的サーバにアクセスする時
目的のサーバに辿り着く時は、踏み台からのアクセスしか許可していない為、
踏み台のサーバを経由する必要がある。

```jsx
(myPC) $ ssh -i 踏み台サーバ.pem -p2222 xxx.xxx.xx.xx //踏み台IP
(踏み台) $ ssh ec2-user@xxx.xxx.xx.xx //目的サーバIP
(目的サーバ) $ hostname //目的サーバか確認
```

## 環境
- macOS
- zsh

## 構成
```
$ pwd
/Users/myname/.ssh

$ tree
.
├── conf.d
│   └── hosts
│       ├── ashiba
│       ├── hostnameA
│       └── hostnameB
├── config
├── keys 
│   ├── ashiba.pem
│   ├── hostnameA.pem
│   └── hostnameB.pem


```


---

###  ＜configファイルを作成して、ローカルから一発でアクセスする＞
ローカルにconfigファイルを作成して、これを利用しsshコマンドを簡潔にし、一発で多段階アクセスを可能にする。
設定ファイルは、「.ssh」配下に配置。
./ssh/config ファイルがない場合は、新規で作成。

# 1.ディレクトリ作成
- conf.d/hosts | 設定ファイルを記述するディレクトリ
- keys        | 秘密鍵を置くディレクトリを作成

```jsx
$ cd ~/.ssh 
$ mkdir conf.d/hosts/ && mkdir keys
```

```&&``` は左の処理が成功したら、右の処理を実行という意味。


# 2.configファイルを作成
```
$ vi config
```
### config
「conf.d/hosts/(全て)」の設定ファイルを、読み込むようにする。
 ※ひとつのファイルに記述すると、長くなるのでドメインごとに分ける。

```jsx
Include conf.d/hosts/*
```

# 3.conf.d/hosts/ 配下に各サーバの設定ファイルを作成
- (1)踏み台サーバの情報を作成

```jsx
$ cd conf.d/hosts/
$ vi ashiba
```
### ashiba
```shell
# -----------------------------
# ashiba
# -----------------------------
Host ashiba
  Hostname      xxx.xxx.xx.xx
  Port  2222
  User  username
  IdentityFile ~/.ssh/keys/ashiba.pem
```


- (2)同じように、目的サーバAの情報を作成

```jsx
$ vi hostnameA
```
### hostnameA
```shell
# -----------------------------
# hostnameA
# -----------------------------
Host hostnameA
  Hostname      xxx.xxx.xx.xx
  Port  22
  User  ec2-user
  ProxyCommand ssh ashiba -W %h:%p
  IdentityFile ~/.ssh/keys/hostnameA.pem
```



- (3)目的サーバBの情報を作成

```jsx
$ vi hostnameB
```
### hostnameB
hostnameBは、hostnameAを経由するものとする。
```例```  myPC > ashiba > hostnameA > hostnameB

```shell
# -----------------------------
# hostnameB
# -----------------------------
Host hostnameB
  Hostname      xxx.xxx.xx.xx
  Port  22
  User  ec2-user
  ProxyCommand ssh hostnameA -W %h:%p
  IdentityFile ~/.ssh/keys/hostnameB.pem
```

---

|プロパティ | 説明 |
| --- | --- |
| Host | 任意の名前|
| Hostname |  ホスト名 or IPアドレス |
|Port | ポート番号 |
| IdentityFile | 秘密鍵のパスを指定|
| ProxyCommand |指定されたHostを経由しredirectするコマンドを指定|





---

# 4.指定したパスに秘密鍵を設置
「```IdentityFile ~/.ssh/keys/***.pem```」で指定した位置に、秘密鍵を設置。
作成後、パーミッションも変更。

```jsx
$ cd ~/.ssh/keys

$ vi ashiba.pem
$ vi hostnameA.pem
$ vi hostnameB.pem

$ chmod 400 * //全てのファイルを読み取り専用にパーミッション変更
```

# 5.SSHしてみる
```Host **```で指定した名前でアクセス。
### hostnameAへ

```jsx
$ ssh hostnameA
```
念の為、踏み台サーバを経由しているか確認

```jsx
(hostname1) $ last | head
ec2-user pts/1        ec2-18-182-xxx-x Sun Dec 12 22:12   still logged in
```

```last``` コマンドでログイン履歴を確認すると、踏み台サーバのIPが返ってきたので、
踏み台サーバをしっかり経由している。

### hostnameBへ
```2段階SSH``` ashiba > hostnameA > hostnameB

```jsx
$ ssh hostnameB
```
ログイン履歴を確認

```jsx
(hostname1) $ last | head
ec2-user pts/1        ec2-18-xx-xxx-x Sun Dec 12 22:15   still logged in
```
hostnameAのサーバが返ってきた。これで多段階SSHが可能に。
Haskellでデバッグログを出す


Haskell実行時にprintデバッグしたかったのだけど、使い方がわからなかったのでメモ

- [Debug.Trace](https://tnomura9.exblog.jp/16093353/)
  - 公式ドキュメント: [Debug.Trace](https://hackage.haskell.org/package/base-4.15.0.0/docs/Debug-Trace.html)

- listをデバッグしたいときは内包表現でやれば良い
  - [trace haskell list comprehension?](https://stackoverflow.com/questions/6473959/trace-haskell-list-comprehension)


サンプルコード

```haskell
import Debug.Trace

...

-- trace :: String -> a -> a 
-- traceはStringと何か(a)を受け取って(a)を返す

-- この後 name が評価されないとデバッグログが出ない。
name = trace ("name: -> " ++ show foo) ( foo )

-- List形式の場合は以下のように書けばデバッグログが出せるしわかりやすい（Python的？）。
[trace ("comprehending " ++ show x) (x + 1) | x <- [1..10]]

-- 使い方としてはwhereで
...
where
  xs = [trace ("comprehending " ++ show x) (x + 1) | x <- [1..10]]

-- とかやるといい感じにデバッグできる
```

あんまり内容がない。お粗末様でした。