OmniAICreator/Qiita-1.07M huggingface dataset:
チーム発足から在籍のメンバー2人が部署異動 引き継ぎでなにをしたか

この記事は [SUPER STUDIO Advent Calendar 2023](https://qiita.com/advent-calendar/2023/superstudio) の1日目の記事になります。

# 前提

弊社ではecforceというシステムをSaaSという形でサービスを提供しています。
その中で、別のカートシステムを現在使っており、ecforceに乗り換えたいというクライアント様がいます。
そのようなクライアント様に対して、既存データを引き継ぐために、データの抽出/加工/インポートを行なう「移行業務」を弊社では行なっています。

これは半年前の話です。
私は2023年1月に、別の事業部から今のチームに異動し、現在に至るまで在籍しています。
私のチームでは、上記「移行業務」を行うための、社内システムの開発と運用を行なっています。
私が異動する前は、

- チーム発足当初から在籍している2人
- 半年〜1年以内に参画したメンバー3人
- EM1人

といったチームメンバー構成でした。

# 本題

当時の業務やチーム、メンバーは以下のような状況でした。

- ベースの機能が開発し終え、システムとしては一段落。ここからは運用改善フェーズ
- 事業部内で新しいサービスの開発/運用をするメンバーが必要、新たなチームを発足
- 私が異動したことで、チームメンバー数が計画よりも多くなった

このような背景があったので、チーム発足当初から在籍している2人が別のチームに異動が決まりました。
引き継ぎの期間は3ヶ月とわずかです。
そこで異動する2人には、以下のようなお願いをしました。

## 不要なコードを全て排除してほしい、引き継ぎ資料は作らなくて良い

システムを開発/運用している中で、今までリポジトリ内を見直す機会がありませんでした。
そこで2人には、具体的に以下のような作業を依頼しました。

- 過去のスクリプトをアーカイブとして、別のリポジトリに移植
- 5回くらいに渡り、コード削除のPRを作成、本番にマージ

なぜ資料作成や勉強会等をお願いせず、不要なコードの削除をお願いしたかは、以下2点が理由です。

### 中期的に不具合や障害が減ると思ったから

開発や運用は、リレーのようなものです。
そのため、メンバーが入れ替わることをある程度想定して、コードやコミットを残していく必要があります。
特に今回異動したメンバーが、チーム発足当初から在籍している2人でした。
ここを逃すと、必要なのか不要なのかよくわからないコードが一生残り続けると思いました。

「本番で動いているコードを消す」という作業は、中身や経緯を分かっているメンバーでないと、遂行できない難しい作業です。
不要なコードを全て排除となると、リポジトリ全体を見渡し、嫌でもコア機能に手を入れる必要があります。
そのため、不具合をある程度覚悟し、関係者にも周知していました。

また半年〜1年を過ぎると、高確率でシステムの中身や経緯を忘れてしまいます。
例えば異動後にチャットで質問をしても、100%の回答が得られないことがあります。
そのため、チームに在籍している今がチャンスだったのです。

### 引き継ぐ範囲を最小限にする方が、残るメンバーが楽になると思ったから

もし引き継ぎ資料の作成にリソースを割いた場合、

- 未更新のドキュメント
- 引き継ぎ資料
- 本番で動いている必要なコード
- 本番で動いている不要なコード

の4つを引き継ぐこととなり、それだけでボリューミーになってしまいます。
それであれば、

- 未更新のドキュメント
- 本番で動いている必要なコード

の2つに絞った方が、残るメンバーとしては引き継ぎが楽になるのではないか、という発想の元で不要なコードの削除を依頼しました。
未更新のドキュメントについても、残るメンバーで追従できそうだったのも、一つの理由です。

# まとめ

引き継ぎには正解がない中で、

- 中期的な障害発生の削減
- 引き継ぎ対象の最小化

を目的に不要なコードの削除にフォーカスしました。
最終的には、Rubyコードや使っていないshellスクリプトを合わせて `58000行` `320ファイル` を削減しました。
小さな不具合は検知されたものの、大きな障害は発生しませんでした。
また小さな不具合をいくつか検知したことで、ソースコードの繋がりやミスが起きやすい箇所を改めて認識することができました。

結果として引き継ぎは成功し、半年間で移行業務のシステムのさらなる拡大/改良に繋がりました。
不要なコードを片っ端から削除してくれたメンバー2人には、とても感謝しています。
ただし社内システムだからこそ、ここまで思い切れたということもありますので、引き継ぎの1つの選択肢として伝われば幸いです。
【UE5】学習中のエラー対応　随時追加

## 2023.11.24　EnhancedInput　勉強中のエラー
UEバージョン：5.3.2

## LogEnhancedInput: Warning: Called AddMappingContext with a null Mapping Context! No changes have been applied.
訳：nullのMappringContextを使用してAddMappingContextを呼び出しました。変更は適用されていません。
![bandicam 2023-11-24 14-18-41-683.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940156/ab4d5a01-0b59-1ef7-2ce8-b5a9d00c07a7.jpeg)


### 修正→MappingContextにInputに使用しているInputMappingContextを追加 コンパイルを通す
![bandicam 2023-11-24 14-18-11-674.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940156/92d425d4-1110-9065-6d6e-951b88ef99b8.jpeg)

エラーメッセージに書かれているわかりそうな部分に関係するNodeを探してみる
ROS 2 のインストール（Ubuntu 22.04）

## はじめに
今回の記事では、Ubuntuネイティブ環境への ROS 2 のインストール方法について記載します。
ROSの時のインストール手順と大枠は同じですが、一部desktop-fullでインストールされなくなったツール等もあるので、併せてインストールを行っていきます。

:::note info
この記事は[ROSに関する投稿](https://qiita.com/kccs_yoshiteru-imamura/items/ef418e9beb508ac52c5d)の一部です。
目次は[こちら](https://qiita.com/kccs_yoshiteru-imamura/items/ef418e9beb508ac52c5d#目次)
:::

### 前提条件

|   |条件|
|:--|:---|
|OS |Ubuntu 22.04|
|ROS|ROS 2 humble|

## ROS 2 humble のインストール

### リポジトリ登録

```bash
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
```

### ROS 2 humble インストール

```bash
sudo apt update
sudo apt install -y ros-humble-desktop
```

### その他必要なものをインストール

```bash
sudo apt install -y ros-dev-tools
sudo apt install -y gazebo
sudo apt install -y ros-humble-gazebo-*
sudo apt install -y ros-humble-joint-state-publisher
sudo apt install -y ros-humble-rqt-*
```

### 開発用ソースディレクトリ作成

開発に使用するワークスペースを準備します。

```bash
cd
mkdir -p ros2_ws/src
cd ros2_ws
sudo rosdep init
rosdep update
source /opt/ros/humble/setup.bash
colcon build
```

### .bashrcに以下を追記

~/.bashrcに追記することで、ターミナルを起動するたびに、setup.bashを呼び出す必要がなくなります。

```bash
source /opt/ros/humble/setup.bash
source ~/ros2_ws/install/local_setup.bash
```

## 参考文献

ROS 2 Humble Install

https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html

## おわりに

基本的に、Humbleのドキュメントに沿ったインストールになります。
今後の記事では、今回作成したワークスペースros2_wsをベースに作業する前提で記述していきます。
次回は、WSL2を利用した開発環境構築について投稿する予定です。お楽しみに！
ROS 2 に関する投稿目次

京セラコミュニケーションシステム株式会社 技術開発センター ICT技術開発部 先端技術開発課の内田と今村と申します。私達はROSを用いた屋内用の車両型ロボットの試作等に取り組んでいます。

## はじめに
屋内用の車両型ロボットについて、当初はROSで制作していましたが、より商品レベルの実装にするために、ROS 2 に移行することにしました。
移行にあたり、チーム内向けの ROS 2 の学習用資料を作成しました。
今回から何回かに分けて投稿する記事では、このチーム内向けの学習資料をQiita投稿向けに加筆・修正したものを投稿して行きます。
私達と同じように、ROSから ROS 2 への移行を考えている人の参考になれば幸いです。

### 対象読者
* 既にROSを触ったことがある人で、ROSから ROS 2 への移行を考えているエンジニア
* ROS 2 の開発を始めようとしているエンジニア

## 目次
ROS 2 学習用記事として投稿予定の目次を記載します。

:::note info
順次目次を追加していき、投稿する毎にリンクを更新していきます。
:::

### ROS 2 開発の基本
* [ROS 2 のインストール（Ubuntu 22.04）](https://qiita.com/kccs_yoshiteru-imamura/items/2ff8d1f56e26d781afe4)
* [WSL2による ROS 2 開発環境](https://qiita.com/kccs_yoshiteru-imamura/items/66155f9e54e2a86ec212)
* [ROS 2 におけるワークスペース・パッケージの作成とビルド](https://qiita.com/kccs_kazushi-uchida/items/9deb104957c0587ea128)
* [ROS 2 においてC++を用いたPub&Sub通信を行う方法](https://qiita.com/kccs_kazushi-uchida/items/70bb07e688953cf01e82)
* [ROS 2 においてC++で作成したノードをlaunchファイルで起動する方法](https://qiita.com/kccs_kazushi-uchida/items/d1f77fb6358f62c420dd)
* [ament_cmake_autoを用いたビルド方法](https://qiita.com/kccs_kazushi-uchida/items/f72542d232edcd9dfa64)
* [ROS 2におけるシミュレーション環境の構築](https://qiita.com/kccs_izumi-egashira/items/5195581f3a45ac6800ea)
* [ROS 2においてslam_toolboxを用いた地図作成を行う方法](https://qiita.com/kccs_mitsuhiro-teraoka/items/253623296504a95fab88)
* [ROS 2においてNavigation2を用いた自動走行を行う方法](https://qiita.com/kccs_mitsuhiro-teraoka/items/7861b938df96b2b599a3)

### ROS 2 移行時の対応
* [ROS 2 移行（rclcpp::Time）](https://qiita.com/kccs_yoshiteru-imamura/items/5d5b9a9e5489f8feea37)

## 所属部署について
### ITエンジニアが活躍する地方拠点「長崎 Innovation Lab」

https://www.kccs.co.jp/contents/nagasaki-innovation-lab/

長崎 Innovation Labでは、IT技術を活用して、工場などものづくりの現場で活用できるシステムの開発に取り組んでいます。自由な発想でこれまでにない社会に役立つ製品・サービスを生み出し、長崎から発信していくことを目指しています。

### 隼人事業所

https://www.kccs.co.jp/company/maps/hayato/

隼人事業所は、工場の中に事務所があるという利点を活かし、ものづくりの現場に貢献できるシステム開発に取り組んでいます。
IT技術を活用して、新しい価値を創出をしていくことを目指しています。
【Houdini x Unity】rigid body dynamics : Rayfire for Unity へのエクスポートについて

この記事はHoudiniアドベントカレンダー2023　1日目の記事です。
よろしくお願いします。
本記事は、表題の通り `【Houdini x Unity】Rayfire for Unity へのエクスポートについて`の簡単な説明になります。
【Houdini x Unity】の資料自体が少なく、更にサードパーティのアセットとの連携となると資料もほぼ皆無なので、備忘録も兼ねての投稿となります。
# Rigid body dynamicsとは

![231124_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/0fbaeecc-ad60-2d7f-d3a9-ec757716051e.png)
* 略称は RBD。3DCGにおいては一般的には「硬い固体の物理シミュレーション（ビルやドアの破壊・落石・金属の鎖の揺れ等）」のことを指します。
* また、破壊表現だけではなく、固体の物理シミュレーションする要素全般の事をRBDと呼びます。

# RBD in Real Time VFX
* リアルタイムの方がプリレンダーよりも制約が多いので、プリレンダーで行うような破壊表現をリアルタイムで行うには様々なツール開発や検証が必要になりがちです。
* また、プリレンダーでの破壊表現の仕事をしたことのないリアルタイムのアーティストに破壊表現周りを教えるのも極めて大変です。
* そのため、あらゆる面においてコストを削減できる手法・ツールがあるのならそれに越したことはありません。

今回ご紹介する「RayFire」はVFX業界で長年第一線で活躍しているツールです。私自身もかつて3dsMaxを使用していた際に、この信頼性の高いツールをよく活用していました。RayFireは上記コスト削減などの要件を満たし、実務での利用にも十分対応できる優れたツールです。今回は「RayFire for Unity」をHoudiniと連携する際の手法について簡潔にご説明します。
# Rayfire for Unity
* Unity版の雑感としてはツールの実績通り破壊周りで欲しい機能は一通り揃っている印象です。
流石に元は老舗のプリレンダーの破壊ツールだけあって、`【事前にカットしたモデルをアクティベーターとの接触に応じてsimのオンオフを制御し、更に断面から小石用のパーティクルを発生させる】`等の、破壊周りでデザイナーがコントロールしたい項目は一通り扱えるようになっています。

詳細は下記公式サイトのリンクをご確認ください。
[公式サイトのLink](https://assetstore.unity.com/packages/tools/game-toolkits/rayfire-for-unity-148690?locale=ja-JP)
# Rayfire for UnityへのHoudiniのエクスポート設定
本題となります。


![231124_03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/326aeab8-79d3-30c1-4cbc-de5699081fc7.png)

* 基本的にはROPの`RBD to FBX`ノードでの書き出しで問題ありません。
* Pack等の設定も`RBD to FBX`で普段設定するようなアトリビュート構成で問題ありません。
* `RBD to FBX`を使う際の各種設定に関しましては私が以前Unity道場で登壇した資料が公式のLearning Materialsに掲載されておりますので、一例として必要に応じて参考にして頂ければと存じます。[Link](https://learning.unity3d.jp/7109/)

# 注意事項・その他
* HoudiniからUnity向けにメッシュをエクスポートする際、基本的に「Convert Units」のチェックは入れた方が良いのですが、そうすると該当メッシュのPositionやNormal Vectorを参照した際に思ったような結果にならない事があります。
* そういった場合は「Convert Units」のチェックを外し、エクスポート前に必要な倍数だけメッシュを伸縮させるかUnity内でスケールを変換することをお奨め致します。
![231124_04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/2726ddea-2bc5-b1e6-f8ab-aae28e98f542.png)

また、本旨から外れるので記述しませんでしたが、[Rayfire for Unity自体の検証内容に関しては私のArtStationの方に投稿してあります。](https://www.artstation.com/artwork/Al5LNq)必要に応じてご確認頂ければ幸いです。

# おわりに
如何だったでしょうか？

冒頭でも述べた通り【Houdini x Unity】の資料自体が少なく、更にサードパーティのアセットとの連携となると資料もほぼ皆無なので、備忘録も兼ねて記事を執筆いたしました。

少しでも皆様のお役に立てたのなら幸いです。
最後までお目通し頂きありがとうございました。
アーム型３次元計測器に関する調査メモ



# 参考

[1] [アーム型三次元測定機 (KEYENCE)](https://www.keyence.co.jp/ss/products/measure-sys/measurement-selection/type/arm-cmm.jsp)
[2] [多関節アーム座標測定器 (長瀧 祐一)](https://www.jstage.jst.go.jp/article/jjspe/85/5/85_392/_pdf)
[3] [アーム型三次元座標測定機の精度向上の研究 (中島)](https://www.irii.jp/randd/theme/h24/pdf/study014.pdf)
[4] [ミツトヨの主な三次元測定機 (ミツトヨ)](https://www.cmm-guide.com/maker/mitsutoyo.html)
AIグラビア写真集を作ってみた。

## はじめに
　久々に投稿させていただきます。某法人でCEO兼CHief IMPact Officer、通称CHIMPOを務めている者です。前回は、ChatGPTブームに乗せられて[このような小説](https://qiita.com/Tama_no_ura/items/c8023ac5dddba924da55)を書かせていただきました。

　皆さんのご存じのとおりAIは恐ろしい勢いで進化しておりまして、ついこの前まで口達者なレベルだったのが画家レベルにまで達しているという恐ろしい世界です。プログラム書いている自分も、いつ代替されるかビクビクしております。

　が、ビクビクしていても流れを止められる訳ではないので、このビッグウェーブに乗りました。やはり狙い目は、男性が期待してしまうムフフなものとしました。

## やっぱり出てきたいろんな規制
　通常なら、「こんな本作ったで。みんな読んでくれや」で終わってしまうかと思おうのですが、今後ムフフな本を作ってその興奮を世間に広げようと考えている方々に、今回気をつけた点だけでも共有したいと思います。それは
「KindleでAIグラビア本を売るのは、だんだん難しくなってる」
「[コンテンツガイドライン](https://kdp.amazon.co.jp/ja_JP/help/topic/G200672390)をちゃんと読まないと、最悪アカウント止められます」
ということです。AIが使いやすくなるということは、粗製濫造しやすい環境が整ってきているとも同義なので当然の措置ではあるのですが、溢れるリビドーを止められない方々は、一度賢者タイムを挟んでから出版した方が良いかと思います。

## 最後に
　Stable Diffusionで作った写真集です。これはプロンプトから頑張ったものです。
 
https://www.amazon.co.jp/dp/B0CLL21KPX 

`AIカノジョ: 美女のほほえみ - 夏 - 1 (全82枚)`
`著者: 股ノ毛　茂`

股間の疼きに耐えながら作ったので、読んでくれると嬉しいです。

次はControlNetを使ったものになるかと思います。
2023年11月版のSteamDeckのDualOSの方法

## ことの発端
冬コミの展示物用にstemdeckのSSD交換を行おうとしてOSをデュアルブートにしようとしたら
古い情報だといろいろつんだので、備忘録とする
まるっとはぶけるところは省く、必要なところは記載します。
ついでにSteamOSのデスクトップモードも日本語化してしまいましょう

#### 多分2023年11月末日にやったので、2023年はこれでいいんじゃないかしら。

## 対象
クローンをせずSSD入れ替えた、または入れ直したいSteamdeck


## 用意するもの
steamdeckと充電器
USB-Cハブ（できれば充電もできるやつ）
USBキーボードとマウス
USBメモリ(16GB*2）


:::note warn
それぞれのメディアににSteamOSとWIndows10、11のインストーラを置いておくこと、
windows10のインストーラーにはsteamのドライバ類も入れておく。
入れ方は探せばいくらでもあるので説明は省略
:::

## 1.SteamDeckのOSインストール
steamにSteamdeckのリカバリメディアをセットして、音量のマイナスを押しながら電源ボタンを押す、マイナスはおしたまま選択メニューが出るのを待つ。
でたらUSBメモリを選択する

しばらく待つとsteamOSが起動するので、デスクトップにある
「Reimage Steam Deck」を開く。
警告がでるので「Proceed」を選択。
USBメモリの内容でSSD内が初期化されて展開される。
（増えた容量のあまりはすべて/homeで増える）

終わった旨がでるので、再起動を行い、SteamOSの設定を行う。

## 2.SSDの容量変更
:::note warn
BTRFSへの変更はとくに必要ないので、そのままパーティションサイズを変更します。
/homeをマウントした状態ではパーティションサイズは変えられないので、もう一度リカバリメディアのSteamOSを実行します。
:::

ここで再度SteamOSを終了して、１と同じ手順でリカバリ用SteamOSを起動する。
左下のメニューからKDE partition managerを起動する。
起動したら一番下の「/home」を右クリックして「Resize/Move」をクリック。

#### 数値をいじってWindows用のサイズを切り出す（250GB以上が望ましい）
次に空き容量が一番下にできるので、選択して右クリックして、「New」を選択、ファイルシステムをNTFSにして
最大容量を割りふる（特に指定しない限り最大容量が割り当てられる）

左上のapplyをクリックして、容量変更のメッセージがでるので「Apply Pending Operations」で実行する。

## 3.Windowsのインストール
よそのページを参考にインストールしてください。
Windowsのインストールに特に違いはありません。

:::note warn
以後ブートマネージャを入れるまで優先されるのはwindowsなので、steamOSを指定する場合は
マイナスを押しながら電源をいれて、SteamOSを選択すること！
:::

## SteamOSの設定等
過去記事にかいたけど・・

# sshの有効化
#### steamdeck側
１．SteamDeckが起動したら、STEAMボタン＞電源＞デスクトップでモードをデスクトップに切り替えます。
２．左下のマークからSystemを開きKonsoleを開きます。
３．terminalが起動するので以下のコマンドを実施してパスワードの設定をしてください。（すでに設定している場合はこの項目を飛ばす）
```
passwd
```
４．続いて以下を実施、sshを有効にします。
```
sudo systemctl start sshd
sudo systemctl enable sshd
```

# 日本語ロケールの設定
:::note info
日本語化やマニュアルいらないならここはすっ飛ばして可
:::

１．ターミナルで以下のコマンドを実施
途中のパッケージ追加管理はよしなに対応すること
```
sudo steamos-readonly disable
sudo pacman-key --init
sudo pacman-key --populate
sudo pacman-key --refresh-keys
（ここで数分まつ）
sudo pacman -S glibc
sudo sed -i "s%#ja_JP.UTF-8 UTF-8%ja_JP.UTF-8 UTF-8%" /etc/locale.gen
sudo locale-gen
sudo pacman -S ki18n
#プラズマインストール、その他パッケージの再インストール
sudo pacman -S plasma
sudo pacman -Qqn | sudo pacman -S -
#日本語マニュアルインストール（ひょっとしたらだめかも）
（OSDNが変なので取り消した）
sudo steamos-readonly enable
```
２．再起動してデスクトプモードに移動したら、Regional SettingsからLanguageを日本を選択して、一番上に移動して再起動する（これでデスクトップモードは日本語になる）

一部参考
https://ijikuru.com/steamdeck-desktop-mode-in-japanese/

# SteamDeck-fEFIndのインストール
:::note info
最新のSteamOS付属の
efibootmgrがバグもちなので、windowsエントリが無効化できない、後述の手順をwindowsにしこむことで回避
:::

１．steamOSを起動して、konsoleを起動、以下を実施
```
cd $HOME && rm -rf $HOME/SteamDeck_rEFInd/ && git clone https://github.com/jlobue10/SteamDeck_rEFInd && cd SteamDeck_rEFInd && chmod +x install-GUI.sh && ./install-GUI.sh
```
GUIモードでインストールされる。（設定は特にいじらなくてもOK

２．Windowsを起動してSteamDeck_rEFIndをダウンロードして展開する
https://github.com/jlobue10/SteamDeck_rEFInd/releases
展開した中にある、Windows/Install rEFInd/Setup_rEFInd_Windows_RunAsAdmin.batを管理者権限で実行する

:::note info
これにより毎回windowsを最優先にしようとするのをタスクで制御する。
また時間のずれをSteamOSの方式に合わす。
:::

あとはHandheld Companion等をいれればOK。
patchworkを用いて，ggplot2で描画したグラフを並べる

Rのパッケージであるggplot2で複数のグラフを描画し，並べて表示したいことがあるかもしれません。power point上などで図を貼り付けて並べる方法もありますが，ここではggplot2で描画したグラフをpatchworkパッケージを用いて並べる方法を備忘録としてまとめたいと思います。

## 用いるデータ，パッケージ
ここでは，RNA-seq解析で得られたデータを用いて，volcano plotとMA plotを並べて表示します。
RNA-seq dataはTCCパッケージを用いて作成したシミュレーションデータを使用します(以下を参照)。
グラフの描画にはシミュレーションデータ(TCC_simulation_data.csv)の内，m.value (log2 (Fold change))，a.value (平均発現量)，p.value (p値)を使用します。

https://qiita.com/shibanosuke/items/8d36bcd984f341059fbe

また，Rの以下のパッケージを使用します。

ggplot2 (ver. 3.4.4)
dplyr (ver. 1.1.3)
patchwork (ver. 1.1.3)

## グラフの描画
まず，Volcano plotを以下のように描画します。

```
countdata <- read.csv("TCC_simulation_data.csv")
countdata <- mutate(countdata, thcolor = ifelse(p.value >= 0.05 , 0,
                                                ifelse(m.value >= 1, 1,
                                                       ifelse(m.value <= -1, 2,0))))

plot1 <- ggplot() +
  geom_point(aes(x = countdata$m.value, y = -log10(countdata$p.value), color = as.factor(countdata$thcolor)), size = 0.1) +
  labs(x = "log2 (Fold Change)", y = "-log10 (p-value)") +
  scale_color_manual(values = c("black", "red", "blue")) +
  geom_hline(yintercept = -log10(0.05), size = 0.2, color = "dark green") + 
  geom_vline(xintercept = -1, size = 0.2, color = "dark green") +
  geom_vline(xintercept = 1, size = 0.2, color = "dark green") +
  theme(legend.position = "none", panel.grid = element_blank())
```

次に，MA plotを以下のように描画します。
```
plot2 <- ggplot() +
  geom_point(aes(x = countdata$a.value, y = countdata$m.value, color = as.factor(countdata$thcolor)), size = 0.1) +
  labs(x = "a-value", y = "log2 (Fold Change)") +
  scale_color_manual(values = c("black", "red", "blue")) +
  geom_hline(yintercept = 1, size = 0.2, color = "dark green") + 
  geom_hline(yintercept = -1, size = 0.2, color = "dark green") + 
  theme(legend.position = "none", panel.grid = element_blank())
```

最後に，二つのグラフを並べて表示します。
```
plot1 + plot2
```

以上のスクリプトを実行し，グラフを描画すると以下のようになります。
fold changeが1以上の遺伝子を赤、-1以下のものを青、それ以外を黒色でプロットしました。
![Rplot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1060100/ff4a6018-ccdd-ea8c-2199-353f56a533f5.png)
文字列の出現率 (paizaランク C 相当)

https://paiza.jp/works/mondai/data_structure/data_structure__dict_step3

先日は元々数が決まってる英小文字や数字だったけど、今回は出力されたものの出現率を調べるという問題。

ひとまず前回学んだ辞書リスト？（言い方）に入れることはできたけど
同じ単語だったら１増やすってのをどうすればいいんだろうか
おそらく今までのパターンからしてこの内包表記の中でなんかすればいいはずだ


```py
N = int(input())
A = {input(): A[] for x in range(N)}
B =　
```
結果は
```
{'bcd': 0, 'abc': 0}
```
まあ予想通りではある。
ここからいろいろやってみたが、
全く進まず30分経過したのでギブ。
ここまでやった。
辞書をupdateすればいいかなと思ったけど
結局できず。

```py
N = int(input())
count = 0
A ={}
for x in range(N):
    target = input()
    if input() in A:
        A.update(target=0)
    else:
        print(A)
        A[target]+=1
print(A)
```

答えを見てみた。
どうやら辞書への追加方法がまちがってたようだ。
途中までは考え方はあってたようだ。。。
updateは使わなくてよかったらしい。

で、新しく覚えた方法としては辞書の並べ替え方、
辞書からforで各要素を出力する方法がわかった。

```py
N = int(input())
count = {}

for _ in range(N):
    s = input()
    if s not in count:
        count[s] = 1
    else:
        count[s] += 1

for word, times in sorted(count.items()):
    print(word, times)
```

そして自分の書いたのを修正したのが下記。

```py
N = int(input())
A ={}
for x in range(N):
    target = input()
    if target not in A:
        A[target] = 1
    else:
        A[target] += 1

for word,result in sorted(A.items()):
    print(word, result)
```
【備忘】VM構築時に困ったこと

とある環境に、AzureのDevTest Labsを使ってVMをいくつか作成することになりました。

準備不足・知識不足で「思ってたのと違う！」が多くて作り直し、設定し直し、の繰り返し。

また同じことを繰り返してお金と時間を無駄にしないよう、ここに書き留めておきます。

# やりたかったこと
* DevTestLabsで"指定したソフトウェアをインストール済みのVM"を複数作成
* ローカルPCから作成したVMへリモート接続して中身を確認


# 起きた問題
問題になったのは**NetworkSecurityGroup, DevTestLabs, VirtualMachine**の三つ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524071/846dd047-4087-62f6-897f-e8df375dd65d.png)


### 検証環境とVM名が重複
:::note info
こちらの問題は気付いたらAzureから修正されていました
:::
仮想マシンを作成する前に、検証用のサブスクリプションで一度同じ環境を作成したことがありました。
その際、本番用のVM名を使用して作成したのですが、本番で同じ名前を使おうとした際にAzureに怒られました。

![MicrosoftTeams-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524071/e18192a3-61c3-4ffb-9db1-5ff131ccaa4a.png)

検証用の環境で作成したVMと本番用の環境で作成したVMでFQDNが被ってしまったために怒られたようです。
検証環境のVMを削除しても名前は使えず......泣く泣くVM名を変更して構築しました。

### VMにリモート接続できない...
VM作成後、作成済みのVNETにVMを割り当て、NSGとVNETを結び付けました。

一度VM内の成果物を確かめたかったので、NSGに特定のPCからインターネット経由でリモート接続できるようにNSGで受信規則を追加して穴をあけました。
リモート接続用のPCのパブリックIPと接続先のVMのパブリックIP間のRDP接続を許可すればいけるはず。

接続できません。

どうして......？

色々試した結果、リモート接続用PCのパブリックIPと**接続先VMのプライベートIP**で許可したら接続できました。
インターネット経由なのにプライベートIPで設定するのはちょっとイメージしづらい......

後々調べたら普通にAzure公式のNSGの概要のドキュメントに書いてありました。
>Azure リソースのアドレスを指定する場合は、そのリソースに割り当てられているプライベート IP アドレスを指定します。 受信トラフィックの場合、ネットワーク セキュリティ グループが処理されるタイミングは、Azure でパブリック IP アドレスがプライベート IP アドレスに変換された後です。送信トラフィックの場合は、Azure でプライベート IP アドレスがパブリック IP アドレスに変換される前になります。

AzureのNSGの処理の順番によるもののようです。
そういうものだと受け入れるしかありませんね。

### 成果物は英語版
DevTest Labを使って構築するVMには、必要なアプリケーションをインストールしておくことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524071/7925a0f2-92a9-0df4-c482-2ee442980b69.png)

これを使ってSSMSをインストールしておいたのですが、いざ作成してVMにログインしてみると、入っていたのは英語版でした。
DevTest Labを使って日本語版をインストールしておく方法は無さそうで、一つ一つVMに日本語版インストーラをダウンロードするしかなさそうです。

結局全てのVMで英語版をアンインストールして日本語版を入れ直し。
アンインストール時にゴミのファイルも残ってしまうので、だったらSSMSは最初に入れない方が良かったのでは......と思いました。

# 時間の浪費
最終的にこれらの問題は何とかして解消しましたが、恐ろしいほど時間を使ってしまいました。
前向きに考えれば学びを得たのですが、二度と繰り返したくはないので書き留めておきます。
m5stack uiflowを使うためにm5burnerを用いて環境設定をしていたところ、Wifiが全く繋がらなくなって困った際の備忘録

先日`m5stack uiflow`を使うためにm5burnerを用いて環境設定をしていたところ、Wifiが全く繋がらなくなって困った際の備忘録

## uiflowについて

以下をご参照

https://docs.m5stack.com/en/quick_start/m5core/uiflow

## m5burnerについて

以下をご参照

https://docs.m5stack.com/en/download

## 再現手順

以下を参考にして`m5 burner`で`UIFlow`を`m5stack BASIC`に書込んだ際に表題の症状が発生
（Macの場合は、`M5Burner-v3-beta-mac-x64.zip`をダウンロードして、WiFi情報、serial番号を指定したのちに`UIFlow`を指定してm5stackに書き込む）

https://docs.m5stack.com/en/download

https://zenn.dev/saitotetsuya/articles/m5stack_m5burner_v3

## 調べたこと

以下を参照すると、SSIDに`space`があると接続できないらしい（ESP32の仕様？）

> My M5stack can't connect to WiFi.(SOLVED)
https://community.m5stack.com/topic/1252/my-m5stack-can-t-connect-to-wifi-solved/7

しかし今回接続を試みたSSIDに`space`を含んでいない。加えて、Macなど別の機器には接続できる。
## 解決策

（ここに解決策を載せようと思って色々と調べていたのだが、m5stack-PC間の線を外して起動してみたりしてたらあっさりWifi接続できた。おそらく内部初期化処理が期待しない事をしていた気もするが、同現象＆同対策を試みている方がいらっしゃったらコメント頂きたい気持ち。）

# 参考

https://docs.m5stack.com/en/quick_start/m5core/uiflow

https://docs.m5stack.com/en/download

https://qiita.com/SatoshiGachiFujimoto/items/33b7e23b232b3bfecda6
ReactアプリをGithub Pagesにデプロイする方法

## GitHub Pagesの公開手順
npx create-react-appコマンドで作成したReactアプリをGithub Pagesにデプロイする方法を記載します。

:::note warn
GitHubのアカウントを既にお持ちの場合を想定しています。
まだアカウントを作成していない場合は作成してから拝読ください。
:::

1.ローカル環境にgh-pagesライブラリをインストール
GitHub Pages用にbranchを作成してデプロイしてくれるライブラリを開発環境にインストールします。

```bash
npm install gh-pages --save-dev
```
2.package.jsonにデプロイコマンドとGitHubを登録します。
```package.json
{
...
  "scripts": {
 ...
  "predeploy": "npm run build",
  "deploy": "gh-pages -d build"
 },
 "homepage": "https://[github_id].github.io/[repository_name]"
...
}
```
3.デプロイする。
デプロイコマンドを実行します。

```
npm run deploy
```

`Published` が表示されたらデプロイ成功です.

4.公開ブランチを設定する。
GitHub上でSetting -＞ Pages -＞ Branchでbranchをgh-pagesに設定します。
デプロイコマンド実行時に自動で変更されている可能性もあります。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491284/ceb3b299-7eac-3086-b50b-228d193b7242.png)

最後に、画面上部にURLが表示されるのでクリックして確認します。
S3クロスリージョンレプリケーションをやってみた

## 手順
* 送信元、送信先にバージョニングが有効になっているバケットを作成
* 送信元バケットにレプリケーションルールを作成
* 送信先バケットのポリシーを修正

### 送信元、送信先にバージョニングが有効になっているバケットを作成
まずは送信元、送信先にバージョニングが有効になっているバケットを作成する

送信元バケット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733779/373a47be-a6a5-5e69-2c02-024f702a89d1.png)

送信先バケット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733779/50366074-c83f-6a73-5dda-b3ea9428d40e.png)

::: note info
バージョニングが有効になっていること
:::

### 送信元バケットにレプリケーションルールを作成

1. レプリケーションルール名を入力(任意)
1. ルールスコープを選択
    1. バケット内すべてのオブジェクトか指定のプレフィックスを選択可能
1. 送信先のアカウントIDとバケット名を入力
1. IAMロールは新しいロールの作成を選択すると自動で作成してくれる
1. 暗号化設定、その他設定は任意

 ## 送信先バケットのポリシーを修正

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::＜送信元アカウントID＞:role/service-role/＜送信元IAMロール＞"
            },
            "Action": [
                "s3:ReplicateDelete",
                "s3:ReplicateObject",
                "s3:ReplicateTags",
                "s3:ObjectOwnerOverrideToBucketOwner"
            ],
            "Resource": "arn:aws:s3:::＜送信先バケット＞/*"
        }
    ]
}
```
上記ポリシーを送信先バケットポリシーに記載

**以上で設定は完了。**

## 確認
送信元バケットケットにオブジェクトを配置して、送信先バケットにレプリケーションされていることを確認する。

## 感想

クロスアカウントと聞くと難しく考えてしまうが、実際にやってみるととても簡単に出来ることが分かった。AWS側で自動でIAMロールを作成してくれることもありがたい。CFnで作成する場合もこれなら簡単にできそう。プレフィックスも指定できたり色々オプションもあるのでより詳しい内容も調べていきたい。
[CDGC] 2023.11 アップグレード方法

# はじめに

<!-- ★『インフォマティカが提供する、 CDGC(データガバナンスとデータカタログ)を使って』までは定型文 -->
[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDGC](https://www.informatica.com/jp/products/data-governance/cloud-data-governance-and-catalog.html)(データガバナンス＆カタログ)を、2023年11月にリリースされたバージョンにアップグレードする方法を記載します。
※2023/11時点の情報を元にしています。


# 2023年11月リリースとは
年に3回実施される、新機能を含むリリースとなります。
リリースの詳細は、[こちらのマニュアル](https://docs.informatica.com/data-governance-and-quality-cloud/data-governance-and-catalog/current-version/what-s-new/november-2023.html)を御覧ください。

CDGCでは、管理者が任意のタイミングで、該当環境をアップグレードすることができます。具体的な対象としては、「メタデータコマンドセンター」、「データガバナンスとデータカタログ」、「データマーケットプレイス」となります。

なお、アップグレード猶予期間の2週間を過ぎると、強制アップグレードが実施されます。詳細については、[こちらのKB](https://knowledge.informatica.com/s/article/CDGC-changes-to-upgrade-process?language=ja)をご覧ください。

# アップグレード手順のスクリーンショット
以下、アップグレード手順のスクリーンショットとなるので、参考にして下さい。
実行時間の長さは、環境等に依存するかと考えます。

### アップグレードの通知

各画面に権限を持ったユーザ(管理者ユーザまたは Super Admin)でログインすると、上部に通知が表示されます。
「今すぐアップグレード」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/6ec8bfe8-13a3-ed5d-90aa-8f78d2d02bb0.png)

###  アップグレードの開始
詳細の内容の表示と、アップグレードの意思確認が実施されるので、すぐにアップグレードする場合は、「今すぐアップグレード」をクリックします。

:::note warn
アップグレード中は作成、更新、削除の動作が実施できません。また最大2時間掛かる可能性があるため、業務や実施時間の調整をお願いします。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/88a0572d-2a52-7619-9e71-90ae0df86a57.png)

###  アップグレードの実行中
アップグレード中は、画面やデータの参照は、可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/fce7795d-e482-7fc9-1b77-76528202b41a.png)

###  アップグレードの完了
アップグレードが完了すると、通知が更新され、アップグレードが正常に終了したことが通知されます。
通常の運用に戻って下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/241fa272-7f2d-e725-85ad-5dce75b4cc0a.png)


# 参考文献
<!-- ★URLをそれぞれのカタログソースに応じて変更する -->
- [**マニュアル** *ログインが必要](https://docs.informatica.com/data-governance-and-quality-cloud/data-governance-and-catalog/current-version/what-s-new/november-2023.html)
Measurement Protocolについて



Measurement Protocolとは、Google Analytics（グーグル アナリティクス）の機能の一つで、ウェブサイト以外からもデータを送信できるAPIです。


これにより、オフラインのデータやサードパーティのアプリケーションからも、グーグル アナリティクスに情報を送ることが可能になります。

## 基本的な概念
Measurement Protocolは、HTTPリクエストを使用してデータをGoogle Analyticsに送信します。



このAPIを利用することで、ウェブサイトやモバイルアプリだけでなく、POSシステムやIoTデバイスからもデータを送ることができるようになります。これにより、より広範なデータを収集し、分析することが可能です。

## 主な利用シーン
1. **オフラインデータの統合**: 店舗での販売データやイベント参加データなど、オフラインで収集したデータをオンラインデータと組み合わせて分析する。
2. **カスタムデータの収集**: 標準のトラッキングでは収集できない特別なデータやイベントを、カスタマイズして送信する。
3. **クロスプラットフォーム分析**: ウェブサイト、アプリ、その他のデバイスからのデータを一元管理し、統合的な分析を行う。

## 利用方法
Measurement Protocolを利用するには、以下のステップが必要です：
1. **Google Analyticsの設定**: トラッキングIDを取得し、Measurement Protocolを使うための準備をします。
2. **HTTPリクエストの作成**: データを送信するためのHTTPリクエストを作成します。これには、必要なパラメータを含める必要があります。
3. **データの送信**: 作成したHTTPリクエストをGoogle Analyticsに送信します。


---

👉 ポイント:
- Measurement Protocolは、Google AnalyticsのAPIで、ウェブサイト以外のデータも送信できる。
- オフラインデータやカスタムデータを統合し、クロスプラットフォーム分析が可能。
- HTTPリクエストを使ってデータを送信するが、プライバシーやデータの正確さに注意が必要。
おじいさんエンジニアの本棚

この記事は[Wano Group Advent Calendar 2023](https://qiita.com/advent-calendar/2023/wano-group)の９日目の記事となります。

おじいさんエンジニアが日々糧にしている書籍、去年あたりから最近までで読んで良かったと感じる本を紹介します。個人的な好みではありますが、技術力の底上げのためのコンピュータサイエンス、言語仕様に偏らない問題解決本を紹介できればと思っています。

------------------------------------------------------------------

[あなたの知らないところでソフトウェアは何をしているのか? 映画やゲームのグラフィックス、データ検索、暗号化、セキュリティー、データ圧縮、ルート探索……華やかな技術の裏でソフトウェアがしていること](https://www.amazon.co.jp/dp/4873117674)

オライリー本ですが、紹介されているのは見たことがないです。よく聞く技術テーマですが、背景にある技術を丁寧に説明してくれています。各言語にライブラリ等、なんでも揃っている状況下でブラックボックスを読み解こうという人は少数派かもしれませんが、地力をあげるにはオススメです。

[音楽で身につけるディープラーニング](https://www.amazon.co.jp/dp/4274231062)

音楽を扱う上で周波数解析だの特徴量抽出だのとなりがちですが、MIDIを扱うことでディープラーニングに集中できるように工夫されています。Pythonですが何を行ってるかコメントされていて、図を用いつつ丁寧な解説がされています。

[ビジュアルでわかる 信号処理入門](https://www.amazon.co.jp/dp/4297137690)

技術評論社ってこんな硬派な本も出版できるんですね。信号処理本っていうと数式しかなくて理解不能に陥りがちですが、文字通り色彩あるビジュアルが豊富でモチベーションあがるのではないでしょうか。

[Pythonではじめる 音のプログラミング: コンピュータミュージックの信号処理](https://www.amazon.co.jp/dp/4274228991)

コンピュータミュージックに的を絞って、MIDI、楽器の音、シンセやエフェクタ処理等の音響処理を丁寧に解説しています。DAWのプラグイン開発に挑戦したい等、参考になりますね。

[問題解決力を鍛える!アルゴリズムとデータ構造](https://www.amazon.co.jp/dp/4065128447)

「アルゴリズムを自分の道具としたい」という読者に向けて執筆、うたい文句通りの期待を裏切らない内容です。アルゴリズムの動きを図で表すなど工夫され、解説されています。

[問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本](https://www.amazon.co.jp/dp/4297125218)

数学的知識と数学的考察力の視点から書かれたアルゴリズム本です。アルゴリズムと数学が関係してることを理解する為に、豊富な図で丁寧な解説がされています。

[ゲームで学ぶ探索アルゴリズム実践入門～木探索とメタヒューリスティクス](https://www.amazon.co.jp/dp/4297133601)

ゲームのルール、課題を与え探索アルゴリズムを解き明かしていくアルゴリズム本です。探索を図を示しつつ順に丁寧に解き明かしていきます。

[作って学ぶコンピュータアーキテクチャ —— LLVMとRISC-Vによる低レイヤプログラミングの基礎](https://www.amazon.co.jp/dp/4297129140)

元組み込み屋なので、この手の本も大好物です。RISC-Vがオープンソースであるからこその本です。内容はLLVM主体です。

[[ネットワーク超入門]手を動かしながら学ぶIPネットワーク](https://www.amazon.co.jp/dp/4297126877)

図が多く丁寧な解説がされています。文字通りネットワーク超入門にはオススメできます。が、「手を動かしながら学ぶ」が少々問題。取り扱っている機器がCiscoで例はCisco CLIです。ネットワーク管理者の卵向けですかね。

[SQLではじめるデータ分析 ―クエリで行う前処理、時系列解析、コホート分析、テキスト分析、異常検知](https://www.amazon.co.jp/dp/4814400209)

データ分析に関わるSQLって意識したことがなかったので、勉強になりました。視点を変えれば幾らでも知識を得られるという事を再認識しました。

[ChatGPTの頭の中 (ハヤカワ新書 009)](https://www.amazon.co.jp/dp/4153400092)

ChatGPTはどのような仕組みで機能するのかを、その原理を解き明かす本書。話題のサム・アルトマン絶賛と帯にガッツリあります。ハヤカワの新書ですから電車で読むのに丁度いいです。

[データ分析失敗事例集: 失敗から学び、成功を手にする](https://www.amazon.co.jp/dp/4320125673)

データ分析プロジェクトの「失敗」を事例に、失敗を避けるために何をしてはならないのか、について学びを提供する本です。技術書ではありませんが、このケース、あのプロジェクトと同じでは、あるある、と共感できる内容です。

------------------------------------------------------------------

年末年始に読む予定

[入門 eBPF ―Linuxカーネルの可視化と機能拡張](https://www.amazon.co.jp/dp/481440056X)

eBPFの初めての日本語入門書では無いでしょうか。

[systemdの思想と機能　Linuxを支えるシステム管理のためのソフトウェアスイート](https://www.amazon.co.jp/dp/429713893X)

systemdオンリーの本は、初めてではないでしょうか。

[詳解 システム・パフォーマンス 第2版](https://www.amazon.co.jp/dp/4814400071)

定番本の第2版です。The鈍器本といえる内容の質、ページ数を誇っています。

[インタプリタの作り方 －言語設計／開発の基本と2つの方式による実装](https://www.amazon.co.jp/dp/4295017876)

インタープリタ本やコンパイラ本、最近はあまり見かけなくなったところで、結構な大作。

------------------------------------------------------------------

ネットに情報があふれる現代でも知識を得て問題解決の糧にするために、書籍は良いものです。専門書は高いので会社で購入してもらう、あるいは中古本を購入するのもオススメです。中古本も外さなければソレナリに綺麗なので、発売したばかりなど多少安く購入でき少しばかりお得です。

### 人材募集
現在、Wanoグループでは人材募集をしています。興味のある方は下記を参照してください。
[JOBS | Wano Group](https://group.wano.co.jp/jobs/)
同じリマインダーが複数出力される不具合

「リマインダーを検索」アクションで、複数の条件を設定し「次のいずれかが真(TRUE)」に設定すると、同じリマインダーが複数出力される。

### 前提条件

タイトルの一部分が異なるリマインダーを2つ用意した。

![IMG_5884.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/6956ce21-fe5a-08c5-e31a-5254a487af47.jpeg)

![IMG_5883.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/d4162e16-fe18-f0b9-eafe-79274534a259.jpeg)


### 仕様

条件が１つしかない場合、その条件に当てはまるリマインダーが１つずつ出力される。

![IMG_5885.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/33e69721-104c-f11d-fe27-578c9cea948c.jpeg)


### 不具合

ここに条件を追加し「次のいずれかが真(TRUE)」に変更すると、複数の条件に一致するリマインダーが、一致した数だけ出力される。

![IMG_5882.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/7eb10a3c-fcfa-36f7-f049-2d1798802038.jpeg)

仕様の可能性もあるが、不便なので修正してほしい。
MacBookでSSHを使用してGitHubリポジトリに接続・プッシュする完全ガイド

### GitHubへのSSH接続設定

1. **SSHキーの生成**:
   - `ssh-keygen -t rsa -b 4096 -C "your_email@example.com"` を実行して新しいSSHキーを生成しました。既存のキーを上書きするために `y` を選択し、パスフレーズの入力を求められた際には空白で進めました。

2. **SSHキーのGitHubへの追加**:
   - 生成した公開キーを `pbcopy < ~/.ssh/id_rsa.pub` でクリップボードにコピーし、GitHubのアカウント設定にある「SSH and GPG keys」セクションにペーストして追加しました。

3. **SSH接続のテスト**:
   - `ssh -T git@github.com` を実行してSSH接続が成功していることを確認しました。

### GitHubへのプッシュの試みとエラーの解決

1. **リモートリポジトリの設定**:
   - `git remote add origin https://github.com/ogatapro/claw_crane.git` を実行しようとした際に、`origin` が既に存在しているというエラーに遭遇しました。

2. **リモートURLの変更**:
   - `git remote set-url origin https://github.com/ogatapro/claw_crane.git` を実行してリモートURLを更新しました。

3. **ファイルのステージングとコミット**:
   - `git add .` でファイルをステージングし、`git commit -m "コミットメッセージ"` でコミットしました。

4. **HTTPS経由でのプッシュエラー**:
   - `git push origin master` を実行した際に、パスワード認証が削除されたことによるエラーが発生しました。

5. **パーソナルアクセストークンの生成とエラー**:
   - GitHubで新しいパーソナルアクセストークンを生成しましたが、プッシュ時に認証が失敗し続けました。

6. **リモートURLをSSHに変更**:
   - `git remote set-url origin git@github.com:ogatapro/claw_crane.git` を実行してリモートURLをSSH形式に変更しました。

7. **SSH経由での成功したプッシュ**:
   - 最終的に `git push origin main` を実行して、変更をGitHubリポジトリにプッシュし、これが成功しました。
8. **まとめ**:
SSHキーの生成、
GitHubへのキーの追加、
リモートURLの変更、
ファイルのステージングとコミット、
およびSSH経由でのプッシュ方法
ポート番号を指定して、ssh及びsftp接続を実施する方法

## 要　旨
ポート番号を指定して、ssh及びsftp接続を実施する方法について記述します。
## 実行環境等
コンピューター:　iMac 21.5インチ　2017年モデル
mac OS: Ventura 13.6.1
## 実施要領
ポート番号12345でサーバーにssh接続をする。
```python:ssh接続
ssh -p 12345 (ユーザー名)@[サーバーIPアドレス等]
```
ポート番号12345でサーバーとsftp接続をする。
```python:sftp接続
sftp -oport="12345" (ユーザー名)@[サーバーIPアドレス等]
```
## 結　言
今回はポート番号を指定してssh,sftp接続を実施する方法について記述しました。
DockerとVagrantの違い

#  はじめに

Dockerについて学ぶ機会があったので、よく耳にするVagrantについても調べてDockerとの違いを簡単にまとめてみました。

## Docker 
- コンテナ型の仮想化
- ホストOSのプロセスを使用する
    -  個人の環境（OS等）に依存する
    -  仮想化ソフトウェア（VirtualBoxなど）上でDockerを利用することもできる
    -  ホスト環境が汚染されるかも
        -  作成したしたコンテナが残りっぱなしになるとか
    - imageとcontainerとプロセスは1:1:1
    - やり取りはコンテナ同士で行う
- 運用コストが低い
    - ローカルやテスト環境で動いたものを本番にもっていける
    


## Vagrant
- ホスト型の仮想化
- 仮想化ソフトウェアで起動したゲストOSのプロセスを使用する
    - OSから丸ごと作成するので同じ環境になる
        - 個人のローカル環境に依存しない
            - 安定する
        - ホスト環境が汚染されない
            - 環境を削除すれば消える
        - 起動が遅い
            - OSの立ち上げがあるため

# 参考
https://www.rworks.jp/system/system-column/sys-entry/21776/

https://kinsta.com/jp/blog/vagrant-vs-docker/

https://qiita.com/Hibikine_Kage/items/77a32b8c715fb698d5a7

https://qiita.com/nnishimura/items/b6fd4b665b25a411fbeb
Docker内GuzzleでCould not resolve hostになる場合の対処

Docker内のサーバーPHP処理で、Guzzleで共有サーバーに接続しようとすると、エラーになった。

```error:error
GuzzleHttp\Exception\ConnectException: cURL error 6: Could not resolve host: remote.address (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for ...
```

どうやらDocker内から通信しようとしているので、Windowsの`/etc/hosts`は見てないらしい。

Dockerコンテナ内の/etc/hostsに自動的に書き込むには、composeを使っているなら、`docker-compose.yml`のphpコンテナの記載に追記する。

```yml:docker-compose.yml
php:
    #.....
    
    extra_hosts:
      - "${remote_address}:${actual_ip}"
```

composeを使っていない場合は以下の記事が参考になる。

### 参考

https://scrapbox.io/natsuking-public/docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E5%86%85%E3%81%AE%2Fetc%2Fhosts%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
Prisma + GCP SQL (Mysql) に接続するときの備忘録

## 概要
そのままです。
connection string に気をつけましょう。


## 接続方法

```.env
DATABASE_URL='mysql://root:<your password>@<IP>:3306/<DB name>'
```

```bash
 npx prisma migrate dev --name init
 npx prisma db push
```

などです。


以上。
Xcodeでシミュレーターを落とすと、容量が足りないエラーになるケース

## Xcodeでシミュレータをダウンロードすると、「空き容量の問題でダウンロードできない」状態になった。（空き容量はある）

環境
* Sonoma （14.1.1)
* Xcode （15.0.1）
* 落としたシミュレータ　IOS17

**原因**：最近のMAC OS のセキュリティ管理の変更と過去から引き継いだ環境の（各々のディレクトリの）ユーザ権限等の整合性がホニャララ化して書き込めないディレクトリが発生して、起きていた模様

**対応**：Xcode周りの消せるものを消した上で、AppStoreからXcodeを再導入した。
（でも1回目のクリックではやはり容量エラーが出て2度目のクリックでインストールが始まった）

消したもの
Xcode
~/Library/Developer/　ディレクトリ
（~/Library/Caches/と~/Library/Preferences/にもファイルがあるそうだが、区別できなかったので放置してインストールした）





```出ていたエラー詳細（OSのアップデートを入れる前のログなのでMacOSが14.0）

Registering simulator runtime with CoreSimulator failed.
Domain: DVTDownloadableErrorDomain
Code: 29
User Info: {
    DVTErrorCreationDateKey = "2023-11-17 09:54:23 +0000";
}
--
Cannot copy the image because the disk is almost full
Domain: com.apple.CoreSimulator.simdiskimaged.SimDiskImageError
Code: 14
--


System Information

macOS Version 14.0 (Build 23A344)
Xcode 15.0.1 (22266) (Build 15A507)
Timestamp: 2023-11-17T18:54:23+09:00
```


思うこと
思えば、当該環境ではXcodeがAppstoreからインストールできず（これも容量エラーの表示だったと思う）ダウンロードしてインストールしたこともあったが、これ自体が同じ仕様に端を発する問題だし、そこから問題が増えたとも言えた・・・
[TypeScript] Branded Types と Companion Object の組み合わせが便利

TypeScriptアドベンドカレンダー 3日目の記事になります。

https://qiita.com/advent-calendar/2023/typescript

TypeScriptの実装パターンとして、Branded Types と Companion Object というものがあります。
まずはこの2つについて簡単に説明します。

## Branded Types（ブランド化型）

「ユーザーID」と「記事ID」などのように、どちらも文字列（string）であるものを型レベルで区別して扱えるようにすることにより、型安全に扱えるようにするパターンです。

オブジェクト指向の言語でいうところの「プリミティブ型禁止」の規約をTypeScriptの型システムによって簡単に実現できるようにしたものだと思っています。

```ts
// 汎用的に使えるBrand型を作っておく
type Brand<K, T> = K & { _brand: T };

// それぞれの型を作成
type UserId = Brand<string, "UserId">;
type EntryId = Brand<string, "EntryId">;

// 変数作成時に型付け
let userId1 = "U001" as UserId;
let userId2 = "U002" as UserId;
let entryId1 = "E001" as EntryId;

// OK
userId1 = userId2;

// コンパイルエラー
userId1 = "aaa";
userId1 = entryId1;

// stringのまま扱える
console.log(userId1.length);
```

参考

https://scrapbox.io/mrsekut-p/branded_types
https://typescript-jp.gitbook.io/deep-dive/main-1/nominaltyping

## Companion Object（コンパニオン・オブジェクト）

型と値（オブジェクト）を同名で定義できるというTypeScriptの仕組みを使い、型に関係の深い実装を型と同名のオブジェクトに入れ込む実装パターンです。

Javaなどにおけるinterfaceのデフォルト実装に近いものだと思います。

```ts
export type Rectangle = {
  height: number;
  width: number;
};
 
export const Rectangle = {
  from(height: number, width: number): Rectangle {
    return {
      height,
      width,
    };
  },
};
```

```ts
import { Rectangle } from "./rectangle";

const rec: Rectangle = Rectangle.from(1, 3);

console.log(rec.height);
console.log(rec.width);
```

参考（上記コード例もリンク先のものです）

https://typescriptbook.jp/tips/companion-object

## 組み合わせると使い勝手が良い

Branded Types のコード例を見てもわかるとおり、IDなどに特有の型を作ったとしても、それを生成する際に as などを使って型付けしてやる必要があり、この部分が実装のあちこちに散らばると、そこが結局型安全ではなくなってしまいます。

Brandedな型と同名のオブジェクトを Companion Object として作成し、その中でBrandedな値を生成するメソッドを定義し、Brandedな値を作るときは必ずそこを経由するようにしておくと、あっちこっちで as をつける必要もなく、可読性も良くなります。

```ts
export type Brand<K, T> = K & { _brand: T };
export type UserId = Brand<string, "UserId">;

export const UserId = {
    of(id: string): UserId {
        return id as UserId;
    }
}
```

```ts
const userId1 = UserId.of("U001");
```

以上、小ネタではありますが、個人的には使う頻度の高い実装パターンでした。
EIPを付与していないEC2インスタンスの起動時に割り振られたIPアドレスをslack通知する

起動時にワンショットだけ起動するサービスを仕込んでおきます。以下ubuntuにて。

/etc/systemd/system/notify-slack.service
```
[Unit]
Description=Send IP to Slack at Startup
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/notify_ip_address_to_slack.sh

[Install]
WantedBy=multi-user.target
```

notify_ip_address_to_slack.sh:
```sh
#!/bin/bash

# パブリックIPを取得
IP_ADDRESS=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4)

# Slackに送信するメッセージを作成
MESSAGE="ステージング環境が起動しました。IPアドレス: $IP_ADDRESS"

# SlackのWebhook URL
WEBHOOK_URL="https://hooks.slack.com/services/XXX/XXX/XXX"

# SlackにPOSTリクエストを送信
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$MESSAGE\"}" $WEBHOOK_URL
```

有効にする
```bash
$ sudo systemctl daemon-reload
$ sudo systemctl enable notify-slack.service
```
UMLの読み方（初心者用）

# はじめに
Javaを学習し始め、色々な本を手にするとUMLが良くつかわれていることに気づく。本によってはUMLの解説があるが、解説なしでUMLを使う本もあり、UML図を見て「これ、どういう意味だっけ？」を解決するために、私が学習していく中でよく使うUMLの基本をまとめてみた。学習中に出てこなかった内容は記載していないので、UMLのすべては載っていません。
私自身が初心者のため誤っている箇所があると思います。誤りに気付いた箇所があれば教えていただけると幸いです。


## クラス図
![クラス図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569317/1bfeae42-9305-1102-eedb-327b6a1946aa.png)


## クラス間の関連
![クラス図全体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569317/daa4c7bc-31ec-5219-3bc0-abdfdf56a0a9.png)

1. 継承
is-aの関係。ElectricCarはCarの１種である。
ElectricCarはextends Carで作成する。
ElectricCarはCarを派生したものである。

2. 依存
usesの関係。ElectricCarはCharginStationを使用する。

3. 集約
has-aの関係。ParkingLotはElectricCarを保持してかつ、ParkingLotはElectricCarが無くても良い。
ParkingLotはElectricCarを集約していると言える。

4. コンポジション
has-aの関係。ElectricCarはTireを保持していてかつ、ElectricCarはTireが必要。
ElectricCarはTireで構成されていると言える。

5. 実装
ParkingLotはインタフェースPaymentSystemを実装したものである。

- 集約とコンポジションの違い
集約は保持する側（ParkingLot）が無くても保持される側（ElectricCar）の存在が可能。
コンポジションは保持する側（ElectricCar）が無いと保持される側（Tire）の存在が出来ない。このため保持する側が消えると保持される側も消えてしまう。

- カーディナリティ（矢印の数字）
集約の例では、ParkingLotが存在する場合、ParkingLotはElectricCarを0~*だけ保有できる事を表している。
（*は任意の個数で、nと記載しても良い。）
逆にElectricCarが存在するとき、ParkingLotは0~1だけ存在する事を表している。
ElectricCarは必ずParkingLotにあるとは限らないため、ParkingLotは0を含めている。
コンポジションの例では、ElectricCarが存在する場合、ElectricCarはTireを4~5だけ保有している事を表している。スペアタイヤを積んでいる事もあるので最大を5つとしている。もしも対象の車が3輪だった場合の最小値は3と出来る。
逆にTireが存在するとき、Tireは必ず1つのElectricCarに保有される。つまりTireは複数のElectricCarに装備できず、またElectricCarが無ければ存在できない。



## 参考文献等
UML図の作成はフリーソフトdraw.ioを使用した。

https://app.diagrams.net/

UML図の作成にあたり、参考にした本
-デザインパターンとともに学ぶ- オブジェクト指向のこころ 

UML図の作成にあたり、参考にしたページ

https://www.ogis-ri.co.jp/otc/hiroba/technical/JavaWorld_UML/chap2/index.html

https://atmarkit.itmedia.co.jp/fjava/devs_bk060201/jobjmdl04/jobjmdl04_4.html

https://usd.sie.dendai.ac.jp/programming/2016/object/C5_5.htm
clockworkのuConsoleでLチカ

# はじめに

clockworkのuConsoleが届いたので早速組み立ててみた。

中身はRasberry Piなので、LED点灯させたり（いわゆるLチカ）通常の電子工作も楽しみたいので、GPIOインターフェースを使うやり方を模索してみた。

# uConsoleとは

clockworkが2022年に発表した、Raspberry PiのCompute Moduleなどを取り付ける基板や外装、ディスプレイ、キーボードなどがセットになった小型コンピュータを組み立てるキット。

https://www.clockworkpi.com/uconsole

図１　購入したキットの内容物

![IMG_6392 2（中）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/4ec8cd95-2026-ab71-9786-f21cd088b30d.jpeg)


# 今回お話しするuConsoleの構成

* uConsole Kit RPI-CM4 Lite
* Raspberry Pi Compute Module 4(CM4)
* WiFi + 4G cellular 拡張ボード
* 32GB microSDカード

# 情報収集

私がやりたいことを既に誰かがやっていないかWeb検索してみたが見つからなかった・・・。

なお、uPicoというサードパーティ製拡張ボードが見つかった。RP2040を使う。
私がやりたいことと違っていたが、電子工作を楽しむ方法の一つだと思うし、外観がスッキリして良いと思う。

https://www.tindie.com/products/quadbit/upico/

# 基本スペックの確認

最初に確認したのは、"40PIN GPIOs"というコネクターと、”40 Pins GPIOs expansion interface (using standard 0.5mm FPC connector)”という記述。（図２)

コネクターの規格が判明した。　＝＞　0.5mmピッチのFPCコネクター

特に特殊なものではなく、汎用のもののようだ。Web検索すれば、対応するケーブルは見つかるだろう。

図2　基本スペック
![スクリーンショット 2023-11-24 10.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/e34f4b7d-0fd4-206f-fe50-2781ac6446b3.png)

（引用元） clockworkの製品紹介ページ　https://www.clockworkpi.com/uconsole


# ケーブルの引き出し方法についての検討

まず、uConsoleの外装はGPIOにアクセスするための開口部は設けられていない。
金属製のケースを加工してケーブルを通す穴を開けるのはできるだけ避けたいところ。

外装の表と裏のパーツの隙間にフレキシブルケーブルを通すことを考えた。
電源ボタンやSDカードスロットと並んでGPIOのコネクターは本体上部にあるので、他の部分に干渉することはないと思われる。（図３)

とりあえず、15cmくらいのケーブルと2.54mmピッチのソケットに変換するアダプターを入手することにした。


図3 GPIOコネクターの位置関係

![IMG_6393.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/8f86e245-83ea-e533-f80e-8577fc86c3d8.jpeg)




# 注文した部品


40ピン 0.5mmピッチ 150mm FPC FFC フレキシブルリボンケーブル （5個入り）

https://www.amazon.co.jp/gp/product/B07SS7ZHMX/


40-pin FPC to Straight 2x20 IDC Female Socket Header

https://www.adafruit.com/product/4905


# ケーブルの接続

注文した部品を取り付けるだけ。

コネクタは黒い樹脂パーツを真上に少し引き上げることで、ケーブルが差し込めるようになる。（図４)
電極の向きを確認して、ケーブルを差し込んだら、再び黒い樹脂バーツを押し込む。

図４　本体へのフレキシブルケーブルの取り付け

![IMG_6418.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/34d8d1a6-85df-219a-2b66-75023926b44a.jpeg)

裏蓋を取り付ける際は、ケーブルに圧力がかかりすぎないようにネジを締め込む際は力加減を注意する。

図５　外から見たケーブルの状態

![IMG_6419.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/706d2c17-1643-ba95-1f8b-a924570edc5b.jpeg)


# ピン配置の確認

テスターを使って、通常のGPIOのピン配置を参考にして5VとGNDの位置を特定して、どういう向きになっているか確認した。

結果的には、アダブターの表面にプリントされている番号を一致していた。


# LED点灯の儀

ここからは一般的なRaspberry Piの電子工作。

手持ちのLEDを点灯させるだけ。

1番ピン（3V3 Power)にプラス側、6番ピン（Ground)にマイナス側を繋いで、点灯させることができた。

図6 LEDの点灯実験

![IMG_6441.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/a2363a57-b2eb-bad0-7645-5ccb1228f462.jpeg)


# まとめ

公式サイトでuConsoleの基本スペックを確認して、比較的簡単な方法でGPIOインターフェースを利用する方法を紹介した。
【ChatGPT無】への指示に、TODOリストを使う。


どうも、カーブミラーです。

　今回は、ChatGPTのプロンプトで、手順を書く際に、TODOリストを使います。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::
　まずは、OpenAIの騒動について。

　今回のOpenAI取締役会がサム・アルトマンを追放したのは、同社のAGI研究において、画期的な進歩を遂げたからだ、との報道があった。
https://www.reuters.com/technology/sam-altmans-ouster-openai-was-precipitated-by-letter-board-about-ai-breakthrough-2023-11-22/

　このコードネームは、Q*（キュースター）と呼ばれている。
　これはAGI研究のひとつの技術で、今は小学生レベルの算数が解ける程度ではあるが、このまま発展したら……。

（ここからは私の勝手な妄想です）
　その進歩を考えると、簡単にビジネスに乗せるべきではない、と考えたイリヤ氏がサムを止めるために、取締役会に報告した、というのが話の流れなのかも。
　しかし、イリヤ氏の予想に反して、取締役会はサムを追い出すことにした。なぜならば、取締役会とサムは、うまくいっていなかったから。
（ここまでは私の勝手な妄想です）
***
　騒動については、
　　まだ、それらしい
　　　公式の発表はありません。
　　　　もしかしたら
　　　　　私が知らないだけかも。

　まぁ、
　　何かあったら、
　　　また書きます。
***
　さて、
　　今回は、
　　　ChatGPTさんへの
　　　　プロンプトに
　　　　　TODOリストを
　　　　　　渡して処理を
　　　　　　　してもらいます。

　イメージは
　　そんな感じかな。

　ふつうは、
　　箇条書きとか
　　　番号を振っての
　　　　処理手順になるかと
　　　　　思います。

　そこをTODOリストに
　　変えるわけです。
***
　これは私が見つけたわけではなく、
　　You Tube配信の
　　　GIGAch というチャンネルが
　　　　ありまして、
　　　　　それをやってる
　　　　　　安藤昇さんが
　　　　　　　“コミニティの先生が
　　　　　　　　実行している”
　　　　　　　　　と言って、
　　　　　　　　　　実行している
　　　　　　　　　　　方法です。

　確か、
　　パラパラ漫画を
　　　作る回でしたかね。
[ChatGPT・DALL-E3でパラパラ漫画を作ろう!](https://www.youtube.com/live/3yMsRnnZwaw?si=eQGZorZscn9Tomwg)

　ChatGPT4＋DALL-E3で
　　パラパラ漫画ですよ、ウケるぅ。
　　　もちろん、Code Interpreterで
　　　　画像分割、パラパラ漫画化。
　　　　　ちゃんとパラパラしてたw

　いやぁ、
　　嫌いじゃないよ、
　　　そういうの。

　その動画の中で、
　　言っていたわけです。
***
　ちょっと脱線。いつもかw

　Code Interpreterは
　　Advanced Data Analysisに
　　　変わったわけですが、
　　　　実は、戻った、という話が
　　　　　X-Twitterで出ていました。

　そこで
　　ChatGPTさんに“主要な機能は？”
　　　と尋ねたら、ですね～
　　　　「Pythonです」と言うんです。

　これは
　　リリースノートにも
　　　ありません。

　まぁ、
　　Code Interpreter自体、
　　　裏側でPythonが
　　　　動いているわけ
　　　　　なんですけどね。

　この話題は、
　　ちょい確認します。
***
　戻りますw

　TODOリストの書き方は、
　　マークダウン記法の
　　　チェックボックスです。

　書き方は
　　[]（半角角括弧）の
　　　開く閉じる、ですね。

　言っておきますが、
　　これを入力しても
　　　画面上は変わりません。

　ただ、
　　ChatGPTさん側に
　　　TODOリストだよ、
　　　　やってね、と
　　　　　伝えるだけです。

　こうして
　　チェックボックスで、
　　　TODOリストを
　　　　書くと、
　　　　　実行確率が上がる、
　　　　　　とのこと。
***
***User***
メールの骨子を作ってください。
[]相手、同僚のあーさん
[]題名、あんさん何しましたん？
[]内容、あーさんが取引相手に何かをして、怒らせたらしい。原因わからず
[]口調、関西弁

***ChatGPT***
もちろんです！

---

あーさんへ、

お疲れさまです。最近の取引相手とのことで、何かトラブルがあったみたいやねん。なんかあーさんが何かやったんかな？原因がよー分からんから、ちょっと聞かせてもらえへん？

お手数かけるけど、早めに教えてもらえると助かるわ。

よろしくお願いします。

[あなたの名前]

---
***
　なんか、
　　東京人が、
　　　関西弁を無理して
　　　　しゃべってる感、
　　　　　ありありw

　それはさておき、
　　今回は、
　　　処理手順ではなく、
　　　　メール内容について
　　　　　なのですけど、
　　　　　　ちゃんと
　　　　　　　対応して
　　　　　　　　くれてますね。

　うまく
　　活用してください。

　今回は、ここまで。
Firebase Auth の サービスアカウントを環境によって切り替える方法

## 概要

ステージング環境で　my-project-dev というプロジェクトをFirebase で作っており、
本番環境では　my-project-production というプロジェクトを作っているときに、
どうやって環境に従ってFirebaseAuthのサービスアカウントのロード（json)を切り替えようかという話。


## 解決策


```bash
export FIREBASE_CREDENTIAL_JSON=$(cat firebase_dev.json | base64 -w 0)
```

みたいにして、json を base64で環境変数にぶち込みます。

### 読み込み方

#### Node.js

node.js だったら、

```java
import * as admin from "firebase-admin";
import { initializeApp, getApps, cert, applicationDefault } from 'firebase-admin/app';
import { getAuth } from "firebase-admin/auth";

const tmpJson = process.env.FIREBASE_CREDENTIAL_JSON as string;
const decodedFile = Buffer.from(tmpJson, 'base64')
const decodedJson = JSON.parse(decodedFile.toString());

const serviceAccount = decodedJson as admin.ServiceAccount;
```

みたいにして読み込みます。

#### Python

Python だったら、

```python
import os
import base64
import re
import uuid
import datetime
import json

from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse


import firebase_admin
from firebase_admin import credentials

tmp = os.getenv("FIREBASE_CREDENTIAL_JSON")
tmp2 = base64.b64decode(tmp.encode())
firebase_dict = json.loads(tmp2)
cred = credentials.Certificate(firebase_dict)
storage_bucket = os.getenv("STORAGE_BUCKET")
firebase_admin.initialize_app(cred, {"storageBucket": storage_bucket})
```

みたいな感じで読み込みます。


以上。
mindの研究 その32 - mindでsocketlibを使ってみた

# 概要
mindが謎なので調べてみた。
練習問題、やってみた。

# 練習問題
mindで、socketlibを使え。

# サンプルコード

```

メインとは　（ホスト名　→　・）
　ＩＰアドレスは　変数
　合否は　変数
　起動パラメータから　単語切り出し　「ホスト名＝」を　表示し　複写し　表示し　「を変換する。」を　一行表示し
　ホスト名を　ＩＰアドレスに変換し　ＩＰアドレスと　合否に　入れる
　合否が　偽？
　ならば
　　「合否が偽の時」で
　　このメッセージでスタック検査する
　　「ホストが見つかりません。」で　重大エラー
　つぎに
　「ＩＰアドレス＝」を　表示し　ＩＰアドレスを　ＩＰアドレスを表示し　改行し
　「最後」で
　このメッセージでスタック検査する。


```

# 実行結果

```
>resolv yahoo.com
ホスト名＝yahoo.comを変換する。
ＩＰアドレス＝74.6.231.20

```


以上。
Pip install のログ

どこからモジュール取得しているかがわかる。

```
pip install -r requirements.txt -v --log pip.log
```

```log:pip.log
2023-11-24T10:40:50,423 Using pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
2023-11-24T10:40:50,424 Defaulting to user installation because normal site-packages is not writeable
2023-11-24T10:40:50,523 Created temporary directory: /tmp/pip-ephem-wheel-cache-vbxlp_ex
2023-11-24T10:40:50,524 Created temporary directory: /tmp/pip-req-tracker-7pl32zza
2023-11-24T10:40:50,524 Initialized build tracking at /tmp/pip-req-tracker-7pl32zza
2023-11-24T10:40:50,524 Created build tracker: /tmp/pip-req-tracker-7pl32zza
2023-11-24T10:40:50,524 Entered build tracker: /tmp/pip-req-tracker-7pl32zza
2023-11-24T10:40:50,525 Created temporary directory: /tmp/pip-install-pvhxlbj9
2023-11-24T10:40:50,531 1 location(s) to search for versions of azure-functions:
2023-11-24T10:40:50,531 * https://pypi.org/simple/azure-functions/
2023-11-24T10:40:50,531 Fetching project page and analyzing links: https://pypi.org/simple/azure-functions/
2023-11-24T10:40:50,531 Getting page https://pypi.org/simple/azure-functions/
2023-11-24T10:40:50,532 Found index url https://pypi.org/simple
2023-11-24T10:40:50,533 Looking up "https://pypi.org/simple/azure-functions/" in the cache
2023-11-24T10:40:50,533 Request header has "max_age" as 0, cache bypassed
2023-11-24T10:40:50,533 Starting new HTTPS connection (1): pypi.org:443
2023-11-24T10:40:50,622 https://pypi.org:443 "GET /simple/azure-functions/ HTTP/1.1" 304 0
2023-11-24T10:40:50,641   Found link https://files.pythonhosted.org/packages/6b/c6/801077c33e7c1d22991e166c7d67d59e3d718531d4a1396a69676ba9d338/azure-functions-1.0.0a1.ta>
2023-11-24T10:40:50,653   Found link https://files.pythonhosted.org/packages/26/a0/2a0278c66065d65038fe8faa2a989e3aaf7917ef1ec869538f9b45fd87af/azure_functions-1.0.0a1-py>
2023-11-24T10:40:50,653   Found link https://files.pythonhosted.org/packages/69/e4/e8622832534d8398d5fae02dc242eb601b6e585b43d2965ca13871a0028d/azure-functions-1.0.0a3.
```

https://stackoverflow.com/questions/53844927/where-are-pip-installation-logs
AWS CLI で RequestTimeTooSkewed が出たら

# 結論
AWS CLI で RequestTimeTooSkewed が出たら `ntpdate` で時刻を修正する

# 手順
下記を実行する
```
sudo apt install ntpdate
sudo ntpdate ntp.nict.jp
```

# 著者の環境
* Windows11 + WSL2(Ubuntu 22.04)
* AWS-CLI2

# 起こったこと
ある日 `aws s3 sync` をしようとしたら下記のメッセージとともにエラー終了した。
```
An error occurred (RequestTimeTooSkewed) when calling the ListObjectsV2 operation: The difference between the request time and the current time is too large.
```

`date` コマンドでUbuntuが認識している現在時刻を確認すると、実時刻から20分ほど遅れていた。

~~調べると `hwclock` というコマンドでハードウェアクロックとシステム時計を同期できるらしいが、自分の環境では `hwclock` が使用できなかった。~~
(書いている途中に、もう一度エラーメッセージを見るために実行すると `Permission denied` だったので `sudo` をつけたら実行できた。)

システム時計が実時刻とずれているのが原因らしいとわかったので、同期する方法を調べて `ntpdate` を試したら直った。