OmniAICreator/Qiita-1.07M huggingface dataset:
【実体験】技術導入のお話 - リアルな現場で経験したこと

# 始めに
お久しぶりです、るんるんです。

今回は、私のリアルな現場での体験記になります。
その経験からの自己分析を行っているので、もしかしたら現場の肌感を知れるかもしれません(?)

いいね貰えると嬉しいです！🥰

こちらにも様々な記事を公開しています。ぜひご覧ください！！

https://runtech-blog.netlify.app/


# プロジェクトの概要・背景

今回アサインされたプロジェクトは以下のようなもの

- 新規開発
- 新製品は並び替え等が頻発する
- 既存製品では NoSQL の [Datastore(Firestore)](https://cloud.google.com/datastore/docs/concepts/overview?hl=ja) を使用していましたが、流石に今回の要件とは合わない
- ということで、RDB でフルマネージドな [AlloyDB for PostgreSQL](https://cloud.google.com/products/alloydb?hl=ja) を使用することになった。

このような感じだったが、以下の課題があった。

1. 導入実績ないけど、うちは本当に RDB 使用できるの？
2. AlloyDB の記事少ないけど、本当に使えるの？
3. アーキテクチャとかどうするの？

などなど、分からないことだらけでした。

そこで「るんるん君、調査よろしく！」と言われ、「辞めさせて貰います...」

とはならず、「Big Chance!!!」 といった感じで、晴れて会社に新技術を導入するタスクを貰ったのです。


# 振り返り

ではここからが本題です。
新技術導入の中で、経験・感じたことを自己分析してみます。

## 成果と影響
成果としては以下

- 以下のプロダクトを導入した
  - RDB: AlloyDB
  - ネットワーク: 共通VPC
  - セキュリティ: Secret Manager
  - CI: プライベートプール(Cloud Build)

影響は以下

- 会社として初めて RDB の導入となるため、開発の可能性を広げた
- 共通VPCを用いることで、コストを抑えることができた
- Secret Manager を使用することで、パスワードをクラウド上で保存しハードコードなどで管理せずに済む
- プライベートプールを導入することでデプロイ環境で、マイグレーションができるようになった


## 役割と貢献

役割としては

実験、導入実験、導入

これら全て自分で行った。

上司の方1名が管理者兼レビュワーで、実験に必要なものがあれば許可を得たり、ある程度アウトプットできたら見せたりしていた。

先輩1名が相談役として、困ったら助けてくれた。ありがとうございます。


## 技術的なチャレンジ

#### アーキテクチャを考えたこと

当初は開発環境(デプロイされた開発者が検証で使用する環境)ごとに AlloyDB クラスターを立てる予定だったが、コストが多大にかかる。

AlloyDB 専用のプロジェクトを作成し、[共有VPC](https://cloud.google.com/vpc/docs/shared-vpc?hl=ja) を用いて開発環境をサービスプロジェクトとして接続するような構成を考え、それを実行。

#### 新しい Google Cloud プロダクトを導入したこと

AlloyDB が使用できるのかどうかの実験から行い、今回の要件に合うかの調査、導入することで既存製品に問題が起こらないかの確認など、全て行う。

共有VPC に関しても導入実績はなく、使用方法などをドキュメントを読みながら導入した。

また既存製品では [Secret Manager](https://cloud.google.com/secret-manager?hl=ja) を使用していなかったが、この際に導入し、DB 情報のハードコードを避けることに成功した。

Cloud Build から AlloyDB インスタンスに触れられるようにするため、[プライベートプール](https://cloud.google.com/build/docs/private-pools/private-pools-overview?hl=ja)を導入。こうすることで、Cloud Build 経由でデプロイ環境での DB マイグレーションが可能になる。

## 学びと成長

1人で Google Cloud のプロダクトを現場に導入できたこと。

またアーキテクチャを検討して、形にできたこと。

## 反省点

全体のスケジュールを決めることができず、ズルズルと後ろにズレ込んでしまった。

技術的に分からないことが多く、次から次へと課題が出てきていた。これ自体はしょうがないが、その時その時でリスケジュールせず愚直に取り組んでしまったことが問題。

上司に逐一どれくらいで終わりそうなのかを伝えることができておらず、外から見ていると「いつ終わるのだろう？」と疑問に感じさせてしまったのが今回の最大反省点。


## 困難だったこと

**IAM**

Google Cloud の権限周りに大苦戦しました。やっぱり AWS とかでもクラウドの一番難しい所だなぁとつくづくおもいます(人によると思いますけどw)。

ドキュメントの通りにやっても他に付与している権限が悪さをして上手くできないことや、プロジェクト構成が少し特殊だとどのサービスアカウントにどの権限を付与するのかなど。

度重なる実験を続け、最適解の権限を探索しました。 ← ここが一番時間がかかった。


## 楽しかったこと

**やっぱり思い通りに動いた時**

エンジニアをしていて堪らない瞬間だと思う。この感覚はいつまでも忘れたくない。

**要件に合わせて構成を考えること**

どのように実現できるかを、Google Cloud プロダクトのドキュメントを読みながら考える時間が楽しかった。
サッカーのポジションを考えているみたいで、楽しみながらできてよかった。

# 総括
如何だったでしょうか。

私が体験した現場を自己分析しながら振り返ってみました。
書いていて、時間を取って経験を振り返るのは非常に有意義だと感じました。
自分の趣向や強み弱みを改めて整理できて、次に活かせるような気がします。

今回は自己分析会でしたが、今度は「技術導入のいろは」的な記事も書こうと思っています。
乞うご期待！
VS-Code Code for IBM i でソースメンバーの日付を表示する

**VSCode** 上で **IBM i** のソースコードを編集できる `Code for IBM i` ですが、インストール時のデフォルト設定ですと、**SEU** でおなじみの右側の **YYMMDD** 日付が更新されません。
初期設定のままソースコードを保存すると全て日付は **000000** で更新されます。
本投稿では、`Code for IBM i` のソースコード設定をすることで、従来の日付が設定される様にしていきます。

## ソースコード設定を変更する
1. `Code for IBM i` でターゲットの **IBM i** に接続した後、以下画面の `[Settings]` を開きます。
2. `Source Code` タブを開き
    1.  `Enable Source Dates` にチェック
    1.  `Source date tracking mode` を選択
    1.  `Source Dates in Gutter` にチェック※左隅に YYMMDD 表示されます
3. `Save settings` を押して設定を保存

![2024-11-30_100403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/23bcdd82-d834-6890-2bed-f24ee077bc60.png)

## 2つの日付更新モード
日付を更新するモードは以下のとおり2つあります。

![2024-11-30_110612.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/8092b283-f9fe-2429-c6e0-d32a69d54263.png)

1つは `Edit mode`です。これは従来の **SEU** に近い挙動で日付が更新されます。
エディタ上で一度ソースコードの変更をすると、undo（元に戻る）を実行しても日付は更新されたままとなります。次のような動作になります。

![q241001r.rpgle - Visual Studio Code 2024-11-30 10-38-17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/8164667f-9c0d-fdb5-0f64-a07c8c0ff2d4.gif)

2つ目は `Diff mode`です。これは「最後に開いた、又は最後に保存した」時点のスナップショットと現在のソースコードとで `diff` が実行され、その差分より更新日付が判定されます。
エディタ上で一度ソースコードを変更しても、undo（元に戻る）を実行後に保存をすると、`diff` 内容が変更されていないと判定されソースに日付は元に戻ります。次のような動作になります。

![q241001r.rpgle - Visual Studio Code 2024-11-30 10-49-41.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/4e762dec-bcf6-efc7-fa61-26379236dc31.gif)


まだ、現時点では実験的な拡張の様で、何回か Undo ⇔ Redo を繰り返していると、**SEU** 側で参照したときに日付の同期がとれていない事がありました。あと注意としては、`Code for IBM i` は diff で中身が変更されていないと判断して、元の日付に物理的に更新しているので、レコードの更新日付は元に戻っても、メンバー自体の更新日時は変わってしまうことに留意が必要です。特に **SEU** を使用しているとソースレコードの更新日付とメンバーの更新日付が一致しているケースが多いので、ケースによっては誤解してしまうかもしれません。
![2024-11-30_111154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/cb666609-fafc-74c8-160f-1ccd40c1de4a.png)

## ソースコードの日付を検索

また、ソースコードの日付箇所にマウスのカーソルを合わせると **日付の検索** ができます。検索といっても実際は**強調表示**なので **SEU** の検索とは異なります。
また **SEU** の場合は `より小さい／等しい／より大きい` と選択出来ますが、何回か試したところこちらは `以上` の様でした。

![2024-11-30_105851.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/71bcbfbb-753b-00cd-7ff1-75fb48dbcdf6.png)

![2024-11-30_111154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/61bb2775-40d3-9aa7-803b-1696fb4f68fc.png)

**SEU** に慣れたユーザーは、ソースに日付がある方がしっくり来るかも知れませんので、設定してみて下さい。
電子工作 Arduino RaspberryPi リンク

<a href="https://www.vector.co.jp/soft/screen/win95/game/se394828.html">ふぁんふぁんまっちんぐ<br><img src="https://deliver.vector.co.jp/screenshot/394/394828_01.jpg" width="50%"></a>

# ショップ
|サイト|url|
|---|---|
|秋月電子通商(アキヅキ)|https://akizukidenshi.com/catalog/default.aspx|
|スイッチサイエンス|https://www.switch-science.com/|
|電子工作ステーション|https://electronicwork.shop/|

# 電子工作でよく使用されるパーツ
|部品名|説明|
|---|---|
|[抵抗内蔵LED](https://akizukidenshi.com/catalog/goods/search.aspx?search=x&keyword=%E6%8A%B5%E6%8A%97%E5%86%85%E8%94%B5LED&search=search)||
|[ブレッドボード](https://akizukidenshi.com/catalog/g/g100315/)||
|[ジャンパーワイヤ(オス-オス)](https://akizukidenshi.com/catalog/g/g105371/)||
|[抵抗(セット)](https://www.switch-science.com/products/1084?_pos=1&_sid=c730d86d0&_ss=r)||
|[タクトスイッチ](https://akizukidenshi.com/catalog/c/cpushsw/)||
|[CdSセル](https://akizukidenshi.com/catalog/g/g100110/)|光の強さで抵抗値が変化するセンサー。明るいと抵抗値(R1)は低く、暗いと抵抗値(R2)が高くなる。R2はR1の約10倍。硫化カドミウムで作られているパーツ。Cd(カドミウム)とS(硫黄)のためCdSと呼ばれる。|
|[SK6812使用マイコン内蔵フルカラーテープLED](https://akizukidenshi.com/catalog/g/g113254/)|マイコン内蔵の帯状のフルカラーLED|
|[人感センサー (焦電型、PIR)](https://akizukidenshi.com/catalog/g/g114064/)||
|[圧電スピーカー](https://akizukidenshi.com/catalog/g/g101251/)||
|[電池ボックス 単3×2本 リード線あり](https://akizukidenshi.com/catalog/g/g110196/)||
|[MOSFET](https://akizukidenshi.com/catalog/g/g102414/)|モーターを動かすなどでArduinoだけでは電力が足りない場合に、外部電力として単三乾電池を使用します。MOSFETは、乾電池からの電気供給のスイッチの役割をします。MOSFETには3つの端子があります。ゲート、ドレイン、ソース。ゲートに電気が流れると、ドレインからソースに電気が流れるようになります。これで乾電池の電気を使ってモーターなどを動かせます。Arduinoからゲートに電気を流すように配線します。|
|[ショットキーダイオード](https://akizukidenshi.com/catalog/g/g100127/)|MOSFETとセットで使用する部品。モーターを止めるときに電気が逆流するのを防ぐために使用します|
|[赤外線リモコン受信モジュール](https://akizukidenshi.com/catalog/g/g100614/)|テレビなどのリモコンの赤外線を受信する部品|
|[温度センサー](https://akizukidenshi.com/catalog/g/g111160/)||
|[Arduino Wi-Fiモジュール (ESPr Developer)](https://www.switch-science.com/products/2652?_pos=3&_sid=f2d06f409&_ss=r)|Wi-Fiでインターネットへ接続する部品|
|[○○シールド](https://akizukidenshi.com/catalog/goods/search.aspx?search=x&keyword=Arduino+%E3%82%B7%E3%83%BC%E3%83%AB%E3%83%89&search=search)|Arduinoのパーツに○○シールドというパーツが販売されているが、シールドとは特定の機能の電子部品をセットにしたパーツのこと(別名モジュール)|
|[]()||

# 電子パーツメーカー(海外)
|メーカー名|url|
|-|-|
|Adafruit Industries<br>エイダフルーツ・インダストリーズ|https://www.adafruit.com/|
|Seed Studio|https://www.seeedstudio.com/|
|SparkFun Electronics|https://www.sparkfun.com/|

# 解説
|サイト|url|
|-|-|
|秋月電子通商キット取扱説明書回路図集|https://akizukidenshi.com/catalog/pages/kairo.aspx|
|ツール・ラボ|https://tool-lab.com/|
|いまスグはじめる電子工作ガイド|https://www.kodomonokagaku.com/denshi/|
|sozorablog|https://sozorablog.com/|
|DEVICE PLUS|https://deviceplus.jp/|
|ザックリ解説web|https://zakkuri-kaisetsu.com/|
|基礎からのIoT入門|https://iot.keicode.com/|

# シミュレータ
|サイト|url|
|-|-|
|wokwi|https://wokwi.com/|
|Tinkercad|https://www.tinkercad.com/|
拡大鏡のショートカットを無効化する

Windowsには拡大鏡という機能があります。利用される方には便利な機能なのですが、ショートカットが`Windows`+`+`になっているため、`Windows`+`L`(画面のロック)をよく利用する人にとっては、押し間違えた時に面倒な機能になっています。

## 拡大鏡を実行できなくする
ここでは、レジストリを変更して拡大鏡を実行させないようにするコマンドを記載します。レジストリの変更になるため、自己責任でお願いします。
管理者権限でコマンドプロンプトを起動し、以下のコマンドを実行するだけです。

``` cmd
echo. > C:\Windows\dummy.exe
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\Magnify.exe" /v Debugger /t REG_SZ /d "C:\Windows\dummy.exe" /f
```

これは、何もしない実行ファイルを作成し、拡大鏡を実行しようとしたときに、代わりに何もしない実行ファイルを実行するようにしています。
＃dummy.exeのパスは任意です。
＃コマンドプロンプトが一瞬見えても気にならない方であれば、`C:\Windows\System32\cmd.exe`を指定するのが一般的なようです。


## 参考
reg addコマンド　公式リファレンス

https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/reg-add
Jetpack Compose のチュートリアルをはじめからやり直してみた

## きっかけ
以前から jetpack compose に関するコードや記事を書いてきた

https://qiita.com/jtakumi/items/68e2296ceabd0ab4bba8

ところが最近、アプリを制作しても具体的にどうやって実装すれば良いかが見えてこなくて悩んでいる。


## やり直す前
なぜ実装方法が見えていないのかを自分なりに考えてみた。

すると、自分の現状が基礎を理解していない状態であることがわかった。

- そもそも`@Composable` ってどういう役割だっけ？
- Android View から移行すると何が良かったんだっけ？
- 基本的な文法があやふや
- そう言った状況だからアプリ制作が進まない

そこで、 Android Developer サイトにある Jetpack Compose のチュートリアルをはじめからやり直すことにした。

今回はその中で一番最初のコースを行う。

https://developer.android.com/courses/pathways/jetpack-compose-for-android-developers-1#codelab-https://developer.android.com/codelabs/jetpack-compose-state

## チュートリアルで分かった機能など
チュートリアルをやっていく中で、こんな機能が jetpack compose にあるとわかったので、拾えた範囲でシェアしたい。

あくまでもこれは**参考程度**に。詳しくは各自でチュートリアルを確認を。

- `@Composable` はコンパイラに「これはJetpack Compose で使う部品だ」と伝えるもの
- Composable 関数の中にパラメータを変える物を入れることは非推奨
- 変化があった関数だけ作動するようになっており、そうでないものはスキップされる
- `Button` の `onClick` でフラグを変化させると `padding` を操作してセルの展開、収縮を行うことができる
- for 文を使用してデータ文だけ Column にデータを追加できる(lazyColumn の方がシンプルに記述できる)
- `lazyColumn` の `items` で簡単にスクロールリストを作成できる
- preview は **Preview したい関数の上に２行書いて darkMode ありと比較できる**
- セルの展開、折りたたみにアニメーションをつけられる
    - 今回行ったのはバネのようなアニメーションが展開時につけられるもの
- `rememberSaveable` は `remember` をより強力にしたもの
    - 画面回転しても値を保持する
- onContinueClicked を使って他の関数でクリックされたのを感知してフラグを変更できる

- 検索バーの虫眼鏡はマテリアルデザイン(プリセット)ですでにある
- 丸アイコン→ `ContentScale.crop` + `clip(CircleShape)`
- `surfaceVariant` color でコンポーネントをシックに仕上げる
- Surface の `shape.medium` で角を取る
- Button コンポーネントの `enable`に条件式を書けばボタンが活性化する条件を指定できる
    - 例 `enable = { count > 0 }`
- `mutableStateOf(initialState:Boolean)` と `androidx.compose.runtime.getValue`, `setValue` のライブラリ導入で状態の変更を保存するコードを短く記述できる
    - viewModel を利用する時に便利

## やってみてどうだったか
今回 essentials という一番最初のコースを１巡した。

最初に思ったことが、

「**基礎を知っているか否かでその後が大きく変わる**」

ということを実感した。

基本的な機能でも jetpack compose は多数の機能を搭載しており、なかなか一発で理解して利用することが難しい。

しかし、その基本的な機能の重なりによってアプリができているため、複雑な機能を実装する上でもこの知識は大いに役に立つと今回の学習を通じて確信した。

また、essentials の最後には viewModel や状態変化検知フローなどアーキテクチャの部分が含まれている。
こちらが理解し実装することに一番苦労した箇所だった。

ただ、やっていく中でそれぞれのメソッドの関係や役割などが見えはじめ、**学習する前よりも確実に力が身についたと実感**している。

## 行き詰まったら初歩に立ち返ることも選択肢の一つ

わたしは、これまでアプリ制作に行き詰まりすっかりやる気を無くしてしばらくIDEなどを立ち上げていなかった。

しかし、今回の学習を通して**成果物とはならなくても、自分の中で分かったことが増やしていくことはやる気を復活させる特効薬**であると考えるようになった。

もし、あなたが最近開発でわからないことが増えて困っていると感じている場合は、それぞれのツールのチュートリアルなどをやり直して、足りない知識などを確認してみるのも一つの手になる。

**急がば回れ**
K8sが動かなかったのでトラブルシューティングした話


こんにちは！
UniProjectのあかつきゆいとです。
今回は、**我らがUniProjectのK8sを7回も吹っ飛ばした**話を書きたいと思います。

~~死んでいったK8sのことを思うと、胸が苦しくなりますが、~~ ミスは成長の近道ということで、そこから今の安定したシステムになったまでを書いていきたいと思います。

最初の頃は「microk8s何それ美味しいの」状態でした。
ただ、Dockerをいい感じに負荷分散できると聞いて、即決でProxmoxに導入しました。

## NodeがReadyにならない

なんでやねんってなりましたね。
もうこれだけで一度吹っ飛ばしました。

あとあと、検証すると、

```sh
microk8s inspect

WARNING:  The memory cgroup is not enabled. 
The cluster may not be functioning properly. Please ensure cgroups are enabled 
```

と書いてあり、cgroupを設定していなかったのがダメだったようですね。

### 別解

Ubuntuのインストーラのサードパティ製ソフトのインストールの画面で先にmicrok8s選んでおけば簡単にできた話ですね。
4号機建てる時に気づきました...
今までの努力は...

## Calicoが動かない

これは、Nodeを再起動した際に、再接続されなかった話ですね。
なぜかCalicoが動かない...

これは、ファイアウォールを着ることで動きました。
K8sを使用しているときにファイアウォールは設定できるにはできます。
ただし、非常に複雑で、ミスるとこうなって、Calicoが動かず、止まることになります。

## NodeがReadyにならないPart2

Nodeを再起動した後、NodeがReadyにならないという問題もありました。
これは、普通に落ちた時に別のNodeにPodが移っていて、それで単純に処理が遅いだけでした。

20分くらいかかりましたが、これでは使い物にならないので、スペックを増強しました()

## まとめ

K8sはなかなかに繊細で、時間が問題を解決してくれる場合もあります。
文献が少なかったり、すぐ更新されたりで使い物にならないことも多いと思いますが、この記事が誰かの助けになればなと思います。

最後に、**デジタルサークルUniProject**では、**検証用のKubernetes環境を用意しています**。
無料で吹っ飛ばしても構わない環境なので、初心者さんにはおすすめです！

よかったら覗いてみてください！！

https://www.uniproject.jp
【Power Query】数百のExcelのデータを1つのExcelをにまとめる方法

店舗が使用するスタッフ教育の進捗管理表（Excel）を本部で一括集計する必要があります。
Excelを一つずつ開いてデータをまとめるのはめんどくさすぎるので、Power Queryを使って、300弱のExcelデータから一気にデータを取り込む方法をまとめました。

## 1. 元となるExcelをテーブル設定にする

まずパワークエリを使用して一気に集計する場合、それぞれのExcelが同じフォーマットであることが必要です。
今回作成する資料は、集計したい項目以外にもテキスト自由入力欄などを設置しているため、
集計したい項目のみをピンポイントで集めるために、集計したい範囲だけをテーブル設定にしておきます。
1つ作成できたらそれを複製して全店舗に配布します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/b19b48e0-23ac-aa78-3d83-30197adbbbf9.png">

ポイント
・表の列名や列数などは完全に統一します
・最後に集計しやすいように、〇×や数字入力など回答欄は極力プルダウン式にしておきます
（自由入力にすると半角全角が混ざったりするため）

## 2. 1つのフォルダに保存する
集計したいExcelをすべて1つのフォルダに保存します。
フォルダの中にさらにフォルダを作ったりするとうまくいかないかもです。

## 3.集計
### 3-1.集計用Excelを用意
まず集計結果をまとめる用のExcelを開きます。
この時、1で作成したフォルダの外に集計用Excelを保存してください。



### 3-2.フォルダを選択
データタブ→データの取得→ファイルから→フォルダーをクリックし、2で作成したフォルダを選択します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/887bb47b-4ca0-b5ad-b948-c0388f786100.png">

### 3-3.「データの変換」をクリック
フォルダ内に保存されているExcelが表示されます。
このExcelをそれぞれ開いて必要なデータだけを取得したいので、「データの変換」をクリックします
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/38bd344f-ac88-9aac-5a75-2261cdce28d7.png">



### 3-4.「content」の右側にある下向き矢印マークをクリック

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/b802cedd-1465-9327-d13c-031ed6859951.png">


### 3-5.パラメーターをクリックしてOK

![画像1128-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/d57b24f6-7056-f48c-33bf-c06c80fd134c.png)




### 3-6.テーブルの情報だけを取得する
資料内のテーブル設定した場所のデータのみを取得するため、Kind行を「table」で絞り込みます

「Kind」の右側の下向き矢印をクリック
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/7d0ad45e-e2b7-459f-1a78-88a50a80d912.png">

Tableにのみチェックを付けてOKをクリック

<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/d125dece-3179-c665-f8a6-ce8f305ac358.png">


### 3-7.テーブル内の項目を表示させる
「data」の右横の矢印マークをクリックすると、テーブル内の項目の一覧が表示されます。
すべてにチェックが付いた状態になっているので、「OK」をクリック（集計に不要な項目があればチェックを外す）

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/afaaa399-ae3f-6bc5-e3b7-7a6e1604b95e.png">


テーブル内の項目がすべて展開されました。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/4f451d90-2247-45b7-9c9b-f380d3e28969.png">


この状態で、ある程度必要なデータに絞っておきます。

今回の場合、2024年11月分のデータのみ欲しいので年月でフィルターをかけて、あとはスタッフNoが空欄になっているカラムを省きました。

必要なデータを絞り込めたら、左上の「閉じて読み込む」をクリック

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/5db69df9-c94b-6915-d382-3076ef189ebf.png">


これで、複数のExcelから選択したデータが一覧でExcelに読み込まれました！

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939758/9a464c22-b1bf-cb41-7dbb-5f3be7a53125.png">


## ほかの方法
今回は、スタッフ教育の進捗管理表という形で、資料としても店舗で保管して使用するという用途があったためなくなくExcelを使用しましたが、シンプルにデータを集計するだけであればほかのツールを使用したほうがやりやすいと思います。
（Appsheetやアンケートフォームなど）
マネージドサービスとは？AWSのマネージドサービスの概要

**マネージドサービス**とは、インフラの運用や管理をクラウドプロバイダー（AWSなど）が代行してくれるサービスのことです。ユーザーは基本的に設定や利用に集中でき、インフラ運用の手間を大幅に軽減できます。

AWSにおけるマネージドサービスは、AWSがバックエンドの運用・保守を担当し、ユーザーはその上でアプリケーションを構築または運用する仕組みです。

---

## **マネージドサービスの特徴**
1. **インフラの管理不要**
   - ハードウェアのプロビジョニング、ソフトウェアのインストール、パッチ適用、障害対応などをAWSが代行。
   
2. **スケーラビリティ**
   - 必要に応じて自動でリソースが拡張・縮小される。
   
3. **高可用性**
   - 冗長化やバックアップがAWS側で対応されるため、システム障害のリスクが軽減。

4. **セキュリティ**
   - AWSが基準に沿ったセキュリティ設定や更新を管理（例: 暗号化、アクセス制御）。
   
5. **費用対効果**
   - 必要な分だけリソースを利用し、ユーザーはリソースの利用料金を支払う仕組み。

---

## **AWSの主なマネージドサービス**
### **1. コンピューティング**
   - **Amazon EC2 Auto Scaling**  
     EC2インスタンスのスケール管理。
   - **AWS Lambda**  
     サーバーレスでコードを実行可能。

### **2. データベース**
   - **Amazon RDS**  
     マネージド型リレーショナルデータベース（MySQL、PostgreSQLなど）。
   - **Amazon DynamoDB**  
     フルマネージドNoSQLデータベース。

### **3. ストレージ**
   - **Amazon S3**  
     オブジェクトストレージのフルマネージドサービス。
   - **Amazon EFS**  
     スケーラブルな共有ファイルストレージ。

### **4. ネットワーク**
   - **Amazon CloudFront**  
     コンテンツ配信のフルマネージドサービス。
   - **Elastic Load Balancing (ELB)**  
     トラフィックの分散を自動化。

### **5. セキュリティと監視**
   - **AWS IAM**  
     アクセス管理とセキュリティ制御。
   - **Amazon CloudWatch**  
     ログやメトリクスの監視。

### **6. アナリティクスと機械学習**
   - **Amazon Redshift**  
     フルマネージドデータウェアハウス。
   - **Amazon SageMaker**  
     機械学習モデルの構築とデプロイ。

---

## **マネージドサービスを利用するメリット**
- **時間短縮**: 運用管理の負担が軽減され、開発やビジネスロジックに集中できる。
- **スキル不要**: サーバー構築や運用に詳しくなくても利用可能。
- **コスト最適化**: 過剰なリソースを削減し、効率的に利用可能。

---

### **注意点**
1. **制御の制限**  
   - 一部の設定やカスタマイズはAWSのルールに従う必要がある。
   
2. **コストの監視が必要**  
   - 必要以上のリソースを使うと予算を超える場合がある。

マネージドサービスを活用することで、AWS上でのシステム構築が効率化されるだけでなく、運用の信頼性が大幅に向上します。
AWSコスト異常検出における根本原因分析機能の強化について

# ■はじめに

**AWSコスト異常検出（AWS Cost Anomaly Detection）** の根本原因分析機能が導入されたようです。
予定外のコスト増加の原因となっている根本的な要因をより正確に特定して修正できるようになったとの事。

[AWS はコスト異常を説明するために強化された根本原因の洞察を提供します]

https://aws.amazon.com/about-aws/whats-new/2024/11/aws-enhanced-root-cause-insights-cost-anomalies/

---

# ■AWSコスト異常検出とは

AWSコスト異常検出は、AWS利用環境のコストをリアルタイムで監視し、異常を検出するためのサービスです。

- **予期せぬコストの増加**  
- **特定リソースにおける利用量の急増**  
- **チーム間でのコスト配分の問題特定**  

コスト異常検出は、Amazon CloudWatchと連携し、異常が発生した際に通知をトリガーします。
この機能は以前からありましたが、今回は原因分析機能の追加？という事になりそうです。

---

# ■新機能の概要

今回のアップデートされた点↓

:::note info
**詳細な根本原因分析**  
   サービス、メンバーアカウント、コスト配分タグ、コストカテゴリなどの属性に基づいて異常を監視。  
   異常検出時、上位10件の根本原因とそれぞれのコスト寄与度を提示します。
:::

:::note info
 **複合的なコスト要因の特定**  
   サービス、リージョン、アカウント、使用タイプの組み合わせに基づき、異常の影響度をランク付け。  
   例：あるEC2インスタンスの特定のリージョンでの異常使用量がコストに大きな影響を与えている場合、その詳細をレポートで確認可能。
:::

---

# ■コンソールで見てみる

サービス名としては、「Billing and Cost Management」になります。

![20241130105550.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/5ac837d6-42e0-d781-696b-719618024912.png)

### 1. 異常検出のセットアップ

サービスの中の異常検出は画像の部分から設定できます。（コスト異常検出）

![20241130105133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/de4420dd-7d1e-6fd6-0768-61ccc702d4d4.png)


以下のように設定すれば基本的な異常検出の設定ができます。
（私は以前設定したので画面は割愛します）

1. **モニタリング対象の選択**  
   サービスやアカウント、コスト配分タグなどを選択。

2. **アノマリーモニターの作成**  
   異常を検出するルールを設定します（例：特定のタグに関連付けられたEC2コストの監視）。

3. **通知設定**  
   Amazon SNSを利用して異常検出時に通知を受け取るよう設定。

### 2. 異常発生時の確認

ここから今回のアップデート部分を見ていきます。
コンソールで言うと、恐らくこの右端の「View 1 potential root cause(s)」の部分が今回の話かなと思います。

![20241130110609.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/afb99f91-77f0-1414-d82c-61504c05b7c6.png)

進むとこのような項目があります。
「根本原因の表示」を押下で確認できそうです。

![20241130110855.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/cd1cf903-7f45-2817-3f78-97da93f873fc.png)


さらに進むとCost Explorerに飛ばされ、今回原因となっている部分がソートされた形で表示されているようでした。

![20241130111108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/d77f3044-e740-0fee-a472-3f81b4e1632f.png)

なるほど…。
今回はテスト環境のようなものだったのであまり参考になりませんでしたが、コスト最適化の場面では一助になるのかもしれません。

後は原因のトップ10とかも見れるみたいでしたが、私の環境では確認できませんでした。

## 今回のアップデートの制限事項

いつもの事ながら現時点で、以下のリージョンでは利用できません！

- **AWS GovCloud（米国）リージョン**  
- **中国リージョン**  

本日異常です！

### 関連リンク
- [AWS Cost Anomaly Detection 製品ページ](https://aws.amazon.com/cost-management/ans-detection/)
- [AWS ドキュメント：コスト異常検出](https://docs.aws.amazon.com/aws-cost-management/latest/userguide/cost-anomaly-detection.html)
私的サーバー構築日誌：NTPクライアント・Ubuntu 24.04 LTS in MicroServer N54L

## 能書き

[私的サーバー構築日誌：仕切り直し](https://qiita.com/katz_engineer/items/1f21de2bd9072c260ae6)からの自宅サーバー構築の続きです。

時刻同期はサーバーのみならずクライアントでも必須です。テスト用には時刻をわざとずらせるようにした方が都合が良い事も多いんですが、それはまた別の話。

systemd-timesyncdが勝手に動いてるので放置しておけば良いのですけども。日本人が日本にサーバーを立てるなら、NTPサーバーはやはり`ntp.nict.jp`ではないかと考える次第です。

…というお話は[既にした](https://qiita.com/katz_engineer/items/213c65adabe0eba9a919)んですが、[我が家のファイルサーバー](https://qiita.com/katz_engineer/items/bd96a26e0a65ceb28ff7)で同じ設定をします。

## 目標

NTP サーバをデフォルトから変更し、`ntp.nict.jp`にします。

## 参考文献

- [私的サーバー構築日誌：NTPクライアント](https://qiita.com/katz_engineer/items/213c65adabe0eba9a919)
- [NTP サーバー : NTP クライアントの設定 - ServerWorld](https://www.server-world.info/query?os=Ubuntu_20.04&p=ntp&f=3)
- [【NTP】日本から使える公開NTPサーバ - Qiita](https://qiita.com/keigo_kabutomori/items/945b543cbe2792dd8d80)
- [日本標準時 に直結した時刻サーバ - 公開ＮＴＰ - 日本標準時グループ](https://jjy.nict.go.jp/tsp/PubNtp/index.html)
- [[Q.1-7]	個人ユーザですが、stratum 1 にアクセスしても構いませんか？ - NICT公開NTP FAQ - 日本標準時グループ](https://jjy.nict.go.jp/tsp/PubNtp/qa.html#q1-7)

## 準備

NTP クライアントが動いている事を確認します。

```console
systemctl status systemd-timesyncd
```

または

```console
timedatectl timesync-status
```

## 設定

```console
sudo sed -i -e"/^#NTP=/c NTP=ntp.nict.jp" /etc/systemd/timesyncd.conf
```

```console
sudo systemctl restart systemd-timesyncd
```

## 確認

準備と同じコマンドを実行して確認します。

特に難しい事も無いので、一発で行けるでしょう。

## 仕舞い

`/etc`の修正をバージョン管理しておきます。

```console
cd /etc
sudo svn ci -m"setting NTP client"
```
【PostgreSQL】動的SQLで特定スキーマ配下の全テーブルレコード数をカウントしてみた

# ひとりごと
DB初心者がpostgresqlを学んでいこうと思い、メモ代わりに投稿してみます。

# はじめに
awsのデータ移行機能（DMS）を使って、「OracleからawsのAuroraPostgresqlにデータを移行する」というお仕事をしているのですが、ちゃんと移行されているの？というお客さんからの不安をいただいています汗

ということで、

**移行したスキーマ配下の全テーブルレコード数の一致を確認しよう**と思いましたが、
100件近いテーブルのselect文を書くのも大変だな。と思い、動的SQLを使って簡単に実現してみましたので、参考としてこの記事に残します。


# 環境情報
今回は検証用として、以下のスキーマとテーブルを用意しました。
- schema: production
    - table: departments
    - table: employees
    - table: eiga
    - table: goals
    - table: syohin

# 静的SQLを使用してレコード総数を取得してみる
まずは、静的SQLで取得してみようと思います。

- クエリ

````
select
	'employees' as table_name,
	count(*)
from
	production.employees

union all

select
	'departments' as table_name,
	count(*)
from
	production.departments

union all

select
	'eiga' as table_name,
	count(*)
from
	production.eiga

union all

select
	'goals' as table_name,
	count(*)
from
	production.goals	

union all

select
	'syouhin' as table_name,
	count(*)
from
	production.syouhin

````

- 出力

| table_name | count |
|:---:|:---:|
| employees | 56 |
| departments | 8 |
| eiga | 57 |
| goals | 0 |
| syouhin | 501 |

お分かりの通り、商用システムではテーブル数が100を超えてきますので、
そのクエリを作るのが非常に大変になります:sweat:
また、テーブルの追加があった場合は都度クエリを見直さなければいけません。

# 動的SQLを使用してレコード総数を取得してみる
次に動的SQLを使うとどうなるか？を試してみます。

- クエリ

```
DO $$
DECLARE
	tbl RECORD;
	result TEXT;
BEGIN
	FOR tbl IN
		select 
			tablename 
		from 
			pg_tables 
		where 
			schemaname = 'production'
	LOOP
		EXECUTE 
			format('select count(*) from production.%I',tbl.tablename)
			INTO result;
			RAISE NOTICE 'Table: % Count: %',tbl.tablename,result;
	END LOOP;	
END 
$$;

```

- 出力

> NOTICE:  Table: departments Count: 8
NOTICE:  Table: employees Count: 56
NOTICE:  Table: eiga Count: 57
NOTICE:  Table: goals Count: 0
NOTICE:  Table: syouhin Count: 501
DO

出力はMessageですが、同じ結果が得られましたね。

簡単に動的SQLの方を解説すると、まずpg_tablesのシステムカタログから
productionのスキーマ配下の全テーブル名を取得します

````
	FOR tbl IN
		select 
			tablename 
		from 
			pg_tables 
		where 
			schemaname = 'production'

````

その後、取得したテーブル名を一つずつ取り出して、レコード数をselectしています。

````

LOOP
		EXECUTE 
			format('select count(*) from production.%I',tbl.tablename)
			INTO result;
			RAISE NOTICE 'Table: % Count: %',tbl.tablename,result;
	END LOOP;	

````

なので、仮にproductionスキーマにテーブルが追加された場合でも、動的にテーブル名を取得することができるので、静的SQLのようにクエリを見直さなくて済むんですね。

# ひとりごと
より深く踏み込むと、動的SQLと静的SQLの性能を比較した方がいい気がしますが、
それはまたの機会に試したいなと思います！
K8s/DockerでNextJSを動かしたら環境変数でハマった話


みなさんこんにちは！
デジタル創作サークルUniProjectのあかつきゆいとです。

今回はNextJSで作られたぼくのサイトをArgoCD経由でK8sで動かしたら環境変数でつまづいた話を書いていこうと思います。

ちなみに、今回はK8sで動かしていますが、普通のDockerでも同じことが起こると思うので、Dockerで困っている人も見てくれればなと思います。

## 何にハマったか

ぼくのサイトはSpotifyAPIが使われています。

https://www.yuito.work

そして、GitHubActions側でDocker Build & Pushを行なっています。
ですが、いつものようにビルドしていたところ、**環境変数が、NULL！！**となったので、トラブルシューティングの一部始終をつらつらと書きたいと思います。

## DockerImageをつくる

K8sで動作させるにはDockerImageが必要ですね。
なので、DockerImageをまず作ります。

```dockerfile
FROM node:20-alpine

WORKDIR /nextjs

COPY . .

RUN rm -rf node_modules
RUN rm -rf .next
RUN npm install
RUN npm run build

CMD ["npm", "start"]
```

DockerImage側でNextJSのビルドを行っています。

## ArgoCD

K8sのマニフェストファイル側も設定していきます。

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: yuito-work
  labels:
    app: yuito-work
spec:
  replicas: 2
  selector:
    matchLabels:
      app: yuito-work
  template:
    metadata:
      labels:
        app: yuito-work
    spec:
      containers:
        - name: yuito-work
          image: registry.uniproject-tech.net/yuito-it/yuito-work:3.1.4
          envFrom:
            - secretRef:
                name: spotify
                optional: true
          volumeMounts:
            - name: spotify
              mountPath: /app/tmp
          ports:
            - containerPort: 3000
      imagePullSecrets:
        - name: harbor-registry-secret
      volumes:
        - name: spotify
          persistentVolumeClaim:
            claimName: spotify
```

ここで、envFromで指定されているのはSpotifyの認証情報が入ったシークレットです。
なので、これでSpotifyAPIにアクセスできるはずでした。

## いざ、デプロイ！！

いざデプロイしてサイトにアクセス...
**Spotifyが表示されない！！**

なぜだ...とログを見に行くと、認証できていない模様...
何かがおかしい...
ローカルでは動くのに...

まず、Podに入って、環境変数を確認しました。

```sh
echo $SPOTIFY_CLIENT_ID
echo $SPOTIFY_CLIENT_SECRET
echo $SPOTIFY_REDIRECT_URI
```

全てnull...
どういうことだ...

## NextJSの落とし穴

実はNext.jsでは、Buildの時点で環境変数がセットされているらしいいです。
私はGitHubActionsでBuildしていたので、GitHubActionsに環境変数をセットしなければならなかったのですね...

しかし、そんなことはしたくない。
というか、この理論だと、DockerImageをPullした人は環境変数が丸見えなのです。

ということで、ゴリ押しました。

## どうしたか

CMDでbuildもするようにしました。

```Dockerfile
# Use the official Node.js 14 image as the base image
FROM node:20-alpine

# Set the working directory inside the container
WORKDIR /app

# Copy package.json and package-lock.json to the working directory
COPY package*.json ./

# Install project dependencies
RUN npm install

# Copy the rest of the project files to the working directory
COPY . .

# Expose the port that the Next.js app will run on
EXPOSE 3000

# Start the Next.js app
CMD ["sh","init.sh"]
```

```init.sh
npm run build
npm run start
```

これで、正常に動作しました。
難しいですね。

Buildしたときにenvがセットされるのは、結構よく使うことかと思うので、覚えておきたいですね。
BuildrootのTARGETコンパイルに必要なHOSTパッケージについて

# はじめに

Nervesのポーティングを行っていて、BuildrootのHOSTパッケージの事で、気づいた事があったので、メモしておきます。

# ビルド時にエラー発生

U-Bootのビルド時に、以下のエラーが発生しました。

```
  HOSTCC  tools/mkeficapsule
tools/mkeficapsule.c:21:10: fatal error: gnutls/gnutls.h: No such file or directory
   21 | #include <gnutls/gnutls.h>
      |          ^~~~~~~~~~~~~~~~~
compilation terminated.
```

HOSTCCとなっているので、U-Boot本体ではなく、ビルドを行う環境を作るためのコンパイルが失敗しています。

ChatGPTで調べてみると、

```
BR2_PACKAGE_HOST_GNUTLS=y
```

を追加する事で解決する。と言っています。
確かに、これを追加すると、この部分は解決したのですが、今度は、他の類似したエラーが発生します。
根本解決になってません。

それに、そもしも、```BR2_PACKAGE_HOST_*```のパッケージを記述しなくても、ビルドは通るはずです。

# なぜか？

このエラーは、```BR2_TARGET_UBOOT_CUSTOM_REPO_URL=```で指定していたレポジトリーを他のレポジトリーに変更して、
`make`を実行した時に発生しました。

buildrootには、```BR2_TARGET_UBOOT```をビルドするときに、HOSTに必要なパッケージが何かを調べて、必要なHOSTパッケージをインストールしてから、ビルドを行います。

BR2_TARGET_UBOOT_CUSTOM_REPO_URLを変更すると、当然、ビルドに必要なパッケージも変わります。
単に`make`を実行するだけでは、HOSTパッケージがインストールされていないので、エラーが発生します。

# 解決策

ChatGPTで調べてみたんですが、言われたとおりにやっても解決できませんでした。

結局は、artifactを削除して、再度ビルドする事で解決しました。

# おまけ

試行錯誤している時に、buildrootのtipsを見つけたので、メモしておきます。
特定のパッケージをリビルドしたい時には、以下のコマンドを実行します。
以下は、u-bootをリビルドする例です。

```
make uboot-dirclean
make uboot-rebuild
```

savedefconfigを実行すると、.configファイルが最小限の形式に圧縮されて保存されます。
これを実行すると、nerves_defconfigが整理された順で、不要な記述を削除した記述になりました。

```
make savedefconfig
```

# おまけ2

```
tools/mkeficapsule.c:21:10: fatal error: gnutls/gnutls.h: No such file or directory
   21 | #include <gnutls/gnutls.h>
      |          ^~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [scripts/Makefile.host:95: tools/mkeficapsule] Error 1
make[2]: *** [Makefile:1858: tools] Error 2
make[1]: *** [package/pkg-generic.mk:283: /home/masa/nerves/nerves_system_ebaz4205/.nerves/artifacts/nerves_system_ebaz4205-portable-0.0.1/build/uboot-xilinx-v2024.1/.stamp_built] エラー 2
make: *** [Makefile:23: _all] エラー 2
```

このエラーは、
```
BR2_PACKAGE_HOST_GNUTLS=y
```
の追加では、解決せず、Build環境に次のパッケージをインストールすることで解決しました。

```
sudo apt install libgnutls28-dev
```

# おまけ3

このビルドエラーの本当の原因は、パッケージのバグでした。
詳しくは、[こちら](https://qiita.com/GeekMasahiro/items/1d4f44fac335b0607f26)を参照してください。
この記事の方法で解決するのが正当だと思います。


# まとめ

- 必要なHOSTのパッケージを自動的にbuildする機能がある。
- 今回は、libgnutls28-devをBuild環境にインストールすることで解決した。
- dircleanと、savedefconfigを見つけました。
Rubyで三項演算子を使う

Rubyで三項演算子を使いました


標準出力から、str1、str2にそれぞれ文字を入力し、同じ文字なら「Yes」、違う文字なら「No」と表示する例です。


ソースコード
```Ruby
str1 = gets.chomp
str2 = gets.chomp
puts str1 == str2 ? "Yes" : "No"

```
buildspec.ymlで動的にアカウントIDを変更する方法

# はじめに
CodeBuildではbuildspec.ymlを利用してビルドを行う。
本記事では、buildspec.ymlにアカウントIDを変数として利用する方法を説明する。

# 対象者
- buildspec.yml内にアカウントIDをハードコードしてしまっている方
- マルチプロジェクトで同じbuildspec.ymlを利用したい人

# 問題点
CodeBuildにはビルド環境の環境変数として予約されているものがある。
[ビルド環境の環境変数 - AWS CodeBuild (amazon.com)](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-env-vars.html)

しかし、アカウントID（AWSマネジメントコンソール右上から確認）は環境変数として定義されていない。

私の所属チームでは、プロジェクト毎にアカウントIDを確認し、buildspec.yml内にハードコードしていた。

ハードコードしてしまうと同じbuildspec.ymlを使い回す事ができずに、アカウントが異なる環境上で作業を行う際に都度修正を行う必要が生じてしまう。

# 解決策
アカウントIDを環境変数としてbuildspec.yml内に定義する。定義の際は手動で入力するのではなく、AWS側で予約されている環境変数を利用する。

### コマンド
buildspec.yml内の「pre_build」フェーズで以下のコマンドを記述する。

```shell:ACCOUNT_IDを環境変数として定義
- export ACCOUNT_ID=$CODEBUILD_BUILD_ARN && IFS=':' && set -- ${ACCOUNT_ID} && ACCOUNT_ID=$5
```

:::note info
フェーズ詳細については下記で確認していただきたい。
[ビルド使用（buildspec)に関するリファレンス](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html)
:::


### 説明
CodeBuildで定義済みの「CODEBUILD_BUILD_ARN」という環境変数を「：」で分割して配列にいれ、配列の5番目の値をACCOUNT_IDに代入している。

「CODEBUILD_BUILD_ARN」はビルドのARNを表しており、以下のような構成となっている。
```plaintext:CODEBUILD_BUILD_ARN
arn:aws:codebuild:region-ID:account-ID:build/build-ID
```

この設定により、以降のbuildspec.yml内ではACOUNT_IDを環境変数として利用することができる。

```shell:ACCOUNT_ID変数利用例（ECR）
- aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ${ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com
```

# おわりに
本記事ではbuildspec.yml内でアカウントIDを環境変数として設定する方法を説明した。
この方法ではアカウントが異なる環境で同じbuildspec.ymlファイルを利用した場合でも修正を加えることなく利用することができる。

別の方法としては、Cloudformationのymlテンプレートで環境変数として渡すこともできるので、別の記事で紹介したいと思う。
データベースの基本　#2

本記事では、データベースの検索の基本についてまとめます。

## 列を出力する
テーブルからデータを取り出すときは、`SELEST`文を使います。`SELSCT`文で必要なデータを検索し、取り出すことを「問い合わせ」あるいは「クエリ(query)」と呼ぶこともあります。
`SELECT`句には、テーブルから出力したい列の名前を書き並べます。一方、`FROM`句には、データを取り出すテーブルの名前を指定します。
```powershell
SELECT <列名>, ...
	FROM <テーブル名>;
```

## 全ての列を出力する
全ての列を出力したいときは、全ての列を意味するアスタリスク(`*`)を使います。
ただし、アスタリスクを使うと、結果の列の並び順を指定することはできません。
```powershell
SELECT *
	FROM <テーブル名>;
```

## 結果から重複行を省く
テーブルにどんな値が登録されているのか知りたいとき、重複を省いてデータを見られると嬉しいですよね。
重複行を省いて結果を得たいとき、`SELECT`句で`DISTENCT`というキーワードを使います。
```powershell
SELECT DISTINCT <列名>
	FROM <テーブル名>;
```
`DISTINCT`を使ったら、`NULL`も1種類のデータとして扱います。
`DISTINCT`は、複数の列の前に置くこともできます。この場合、複数の列の組み合わせてもなお重複する行が１つにまとめられます。

## WHERE句による行の選択
`SELECT`文では、選択したい行の条件を`WHERE`句で指定します。`WHERE`句には、「ある列の値がこの文字列と等しい」「ある列の値がこの数値以上」などの条件を指定することができます。
```powershell
SELECT <列名>, ...
	FROM <テーブル名>
	WHERE <条件式>;
```

## コメントの書き方
コメントは、SQL文に説明や注意事項などを付記するもの。
コメントは、SQLの実行には一切影響を及ぼしません。そのため、アルファベットでも漢字でも好きに使うことができます。
* 1行コメント
「`--`」の後に記述します。
```powershell
-- コメント
```
* 複数行コメント
「`/*`」と「`*/`」で囲った中に記述します。
```powershell
/* コメント */
```

## NULLには要注意
SQLでの`NULL`を含んだ計算は、問答無用で`NULL`となります。
また、比較演算子を使っても、`NULL`の行は選択できません。
そのため、SQLにはNULLかどうかを判別するための｀IS NULL`が用意されています。
反対に、NULLではない行を選択したときは、`IS NOT NULL`を用います。

## AND演算子とOR演算子
複数の検索条件で選択する行を絞り込みたい場面がよくあります。`WHERE`句では、`AND`演算子や`OR`演算子を使って、複数の検索条件を組み合わせることができます。
* `AND`演算子・・・両辺の検索条件が両方とも成り立つときに、全体の検索条件として成り立つ
* `OR`演算子・・・両辺の検索条件のうち、どちらか一方あるいは両方が成り立つときに全体の検索条件として成り立つ

```powershell
-- AND演算子
SELECT <列名>
    FROM <テーブル名>
    WHERE A AND B;

-- OR演算子
SELECT <列名>
    FROM <テーブル名>
    WHERE A OR B;
```
Excel マクロ1(図形の文字のフォントサイズ変更)

###  Excelの図形（オブジェクト）のフォントサイズを変更

---

### 前提
下記記載のマクロは、**Office365(2024/11/30)時点**のものを利用しています。
マクロは、生成AIChat Gptを利用して生成。
実行結果は確認済みです。

---

### 経緯
顧客先より、いただいた資料が大変読みづらいため。
オブジェクトのフォントサイズを**16pt**変更することにしました。

---

### 注意事項
・バックアップを取る
　マクロ実行前に元データのバックアップを作成してください。
 ・マクロの有効化
 　マクロを実行するには、Excelで「マクロ有効化」の設定が必要です。

---

### 手順概要
A. [準備）開発メニューを表示](#a-準備開発メニューを表示)  
B. [VBAマクロの操作画面を表示](#b-vbaマクロの操作画面を表示)  
C. [マクロを貼り付けて、実行](#c-マクロを貼り付けて実行)  
D. [ファイルの保存を行う](#d-ファイルの保存を行う)
E. [まとめ](#e-まとめ)

---
### A. 準備）開発メニューを表示
（既に**開発**メニューがある場合は、不要です）。
1.Excelを開く

2.**ファイル**メニューをクリック

3.**オプション**をクリック（筆者ノートPCでは、その他の中にありました）

4.Excelの**オプション**の**リボンのユーザー設定**をクリック

5.リボンのカスタマイズをします。右側リボンのユーザー設定（B）のメインタブに**開発**にチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/c4688856-6882-9bb2-b792-019488a037b9.png)

6.**OK**をクリック

7.開発メニューが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/ae50ed05-8c37-0a98-07ee-818b260d9df5.png)

---

### B. VBAマクロの操作画面を表示
1.**開発**タブをクリック

2.表示される**Visual Basic**をクリック

3.新たに画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/0663a0af-1d86-e4a7-6f8c-6f966f678a44.png)
（難しい印象を持たれる方もいるかと思いますが、行う操作は、ごく一部です。）

4.上側**挿入**メニューをクリック
![スクリーンショット 2024-11-30 093123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/b28f471d-e857-52a3-2f06-635937d7efdc.png)

5.**標準モジュール**をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/8bfc9317-16e7-f03e-0428-8e1fad7d7015.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/20474f5f-cbab-4667-0445-fb540294b7ed.png)

表示された画面に、マクロを貼り付けて実行する形となります。

---

### C. マクロを貼り付けて、実行
1.下記のプログラムをコピーして、貼り付けをしてください。
```
Sub ChangeFontSizeInAllShapes()
    Dim ws As Worksheet
    Dim shp As Shape
    
    ' すべてのワークシートをループ
    For Each ws In ThisWorkbook.Worksheets
        ' ワークシート内のすべてのオブジェクト（Shape）をループ
        For Each shp In ws.Shapes
            ' テキストを持つオブジェクトの場合のみ処理
            If shp.Type = msoTextBox Or shp.Type = msoAutoShape Then
                If shp.TextFrame2.HasText Then
                    shp.TextFrame2.TextRange.Font.Size = 16
                End If
            End If
        Next shp
    Next ws
    
    MsgBox "すべてのオブジェクトのフォントサイズを16ptに変更しました！", vbInformation
End Sub

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/6a133b3b-2e55-36ee-5d53-d7fcee57015a.png)


2.**実行**メニューをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/d8ecece6-2ecc-0c1e-8189-4fbf91a32f7f.png)

3.**Sub/ユーザーフォームの実行 F5**をクリック
→マクロが実行されます。

実行後、下記のポップアップが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/32fa255d-1260-61d3-daee-ac964d2c5acf.png)

以上が、修正作業です。

---

### D. ファイルの保存を行う

マクロ実行後、Excelを保存する際に、下記の表示がされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537494/0697751c-86d7-184d-3081-7d2071e5a9b7.png)
・マクロも含めて保存を行う（拡張子.xlsm）
・実行したマクロは保存しない(拡張子.xlsx)
どちらかでの保存という形となります。
→実行したマクロは保存しないため、**機能の保存と消去**をクリックしてください。

以上となります。

---

### E. まとめ

マクロを利用することで、手動で図形のフォントサイズを変更する手間が省けます。
マウスを使わずに両手で PLATEAU な 3D View を操作してみよう

## こんなのつくったよ

<iframe width="560" height="315" src="https://www.youtube.com/embed/hkgqMieXw4A?si=Hs_UoXwm4jDvQ47D" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

動画内に2種類の Prototype が含まれています。

前半のはここで試していただけます。
https://hands-control.pages.dev/
＊ Webカメラ搭載の PC/Mac ある程度最近のスマートフォンでお試しいただけます

後半のは機種ごとのキャリブレーションが必要なのですが、そこが適当実装すぎるので未公開状態です。

## 思いついたきっかけ

おかげさまで [Project PLATEAU ADVOCATE 2024](https://www.mlit.go.jp/plateau/journal/j062/) なども拝命致しておりまして、さまざまな方を相手に、Project PLATEAU に関連するお話やデモをさせていただく機会が増えてきました。

そんなおり、やはり、
「PLATEAU View などの 3D地図は（マウス操作での）視点移動がむずかしい」
という参加者さんが一定いらっしゃいます。

たしかにそうだよなぁ。。。なにか代替手法ないかなぁ。。。

入口の時点で拒否したくなる気持ち、食わず嫌いになるところをなんとかできないか。
もっとワクワクした操作感を用意できないか考えてみました。

両手を空間で動かすことで、3D操作するものは、
+ Kinnect系センサー
+ LeapMotionシリーズ
+ MetaQuest などのHMD
などなどいろいろありましたが、それらは専用のセンサーや機器が必要です。

それらをイメージしていた時に、ふと Macbook の WebCam が目に入りました。

「今の時代、この WebCam だけでそこそこ両手を認識できるなじゃいかな？」

と

そして、つくってみました。

## 「PLATEAU WebCam 3D Hands Controller（仮称）」ばくたん

タイトルは「AirPinch」なんてのもいいかなぁなど考え中です。

さて本題。仕組みですが３行にまとめると、

1. WebCam にうつった両手を MediaPipe で認識
1. 両手の座標認識の精度が良いのはどの手の状態・角度のどの動きかを調査
1. 許される精度範囲の座標をもって直感的な操作に近しい方法はなんだろうか考えながら実装してみた

です。

2-3 についてはそこそこ悩み、繰り返しました。

いまは親指と人差し指をくっつけた OKサイン の指先座標をベースに、いろいろ組み合わせていますが、もっとよい操作方法があるかもしれません。

また動画の前半の空を飛ぶのは、認識した2次元座標をベースにつくっていて、
後半のボックスを配置するのは、擬似的な3次元座標をベースにしています。

前半はまずまず満足した精度（および認識速度）になっていますが、後半はもっと精度を上げられる気がしています。

## こだわったところ

1. 前述した「認識精度とその範囲での直感的な操作」のバランス

これはもっといい答えがまだあるかもしれませんが、それなりにこだわりました。

2. 機種依存が少ないブラウザで動く仕組みで実装するぞ

Unity やあれこれ実装の方が、精度的なところでは良い結果を出しやすかったのかもしれませんが、今後の発展も含めて、JavaScript でできるところまでがんばってみました。

### 今後の野望 〜 SF ちっくな操作を日常に Like a 'マイノリティ・リポート'

もう昭和世代しか知らないかもしれませんが、やっぱりトムクルーズ主演のあの映画「マイノリティ・リポート」が忘れられません。

https://www.cinematoday.jp/news/N0044506

当たり前にその日が来て欲しいなぁ。。。

野望1: 3D地図においての両手空中操作方法のデファクトスタンダードをつくるぞ！？

+ UI って新規に考案するのはいろいろ大変ですね。技術的な精度の課題もあり。難しく面白いです。

野望2: 空飛ぶシリーズはなんらかのフライトアクションゲームに発展させたいなぁ（仲間求む）

+ 飛行機が輪を潜っていって点数が貯まるようなシンプルなそれくらいからつくって
+ もっとわくわくするアイデアなにかないかなぁ
+ この IP(キャラクターなど) と組み合わせて〜というチャンスもこないかなぁ

野望3: ニーズがあったら OpenSource にするぞ

+ だって Project PLATEAU のよいところのひとつはオープンな考え方ですしね

以上です。
#5.GitBashでusr/binがどこにあるか迷った話について

# はじめに
こんにちはnayaaaaです。

今回はGitBashでusr/binディレクトリがどこにあるか迷ったので、忘備録として書きました。

# Git Bashとは

Git BashはWindows向けのBashエミュレータです。オープンソースプロジェクトで無償で使うことができます。

Gitの実行環境のほか、Bashエミュレータとある通りLinuxコマンドを実行することができます。

# WSLとは

「WSL（Windows Subsystem for Linux）」とは、Windows上で動作するLinuxの実行環境です。

WSLを利用することで手元のWindows OSをこれまで同様に使いながら、同じWindows上でLinuxを動作させることもできます。WSLでLinuxを使うにあたり、いちいちOSを再起動する必要はありません。あたかもWindowsにインストールされているソフトウェアの1つのように、Linux環境を利用できるのです。


#
ざっくりまとめると、GitBashは Gitの機能が搭載されていてWindows環境でBashコマンドを**扱うこと**ができるもの。
WSLはWindows環境で**LinuxOSの動作**を提供することができるというものらしいです。

なのでこれらの二つはWindowsでbashコマンドを使用することができるようになるという点では一緒なのですが、提供する機能は全く別物のようです。

# 迷ったところ

GitBashのusr/binディレクトリに実行ファイルを格納したかったのですが、VSCodeでusr/binディレクトリに移動後、実行ファイルを格納してコマンドを打ってみたところ、not found が発生しました。

# 原因

筆者の動作環境は、Gitをインストールした際に一緒に付属されていたGitBashで動作しており、GitBashの\usr\binディレクトリは、通常```C:\Program Files\Git```に配置されているのですが、以前にWSLのインストールをしたこともあり、WSLのusr/binディレクトリとGitBash環境のusr/binディレクトリで、誤ってWSLのusr/binディレクトリに配置してしまっていました。

ちなみにWSLとGitBashでは以下のようにディレクトリが違いました。
- **GitBash**

```C:\Program Files\Git\usr\bin```

- **WSL**

```\\wsl.localhost\Ubuntu\usr\bin```　⇒Ubuntuを使用している場合


なんで間違えて格納しちゃってたんだ….

# まとめ

- GitBashやWSLはホストマシンのディレクトリ構造とは別にディレクトリ構造を持っている。
- GitBashとWSLは機能がそもそも違う

  **GitBash**→Bashを使用可能にする

  **WSL**→Linux環境の提供



こういった細かいところは普段あまり気にしづらい箇所なのでよい勉強になりました。

■参考リンク

http://www.fenet.jp/infla/column/technology/git-bash%E3%81%A8%E3%81%AF%EF%BC%9Fgit-bash%E3%81%AE%E5%88%A9%E7%82%B9%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9%E3%83%BBgit-bash-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9/

https://www.kagoya.jp/howto/it-glossary/develop/wsl2_linux/
【ポエム】ListList


## 本文

どうでもいい昔話。

`hoge`という概念が存在していて
`hoge`のリストに`hogeList`と命名した。

さらに`hogeList`のリストが必要になったので、`hogeListList`と命名した。

これが第三者的に「はあ？アホか？」と思われた（ように自分が感じた）が、そんなにクソだろうか？

むしろ最高に分かりやすいと思う。

## おまけ

なんでも肯定してくれるChatGPT先輩に聞いてみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/dfd9de5a-83bd-0b59-145f-1f33ca9b5034.png)
Installation

[Previous << Wallet Discovery](https://qiita.com/flowcadence/items/01a1580cb15a359a59ce)
[Next >> Interaction Templates](https://qiita.com/flowcadence/items/e49102ecf2109f9e55bb)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#reference-2020832ebee1810a325a

このページでは、FCL JS ライブラリのインストールについて説明いたします。 しかし、インストールに進む前に、まず前提条件を確認しておきましょう。

<h1>Prerequisite</h1>

* Node.js version v12.0.0 or higher.

FCL JS は Node.js の v12.0.0 以降のバージョンに依存します。現在インストールされているNode.jsのバージョンは、以下のコマンドで確認できます。
```ruby
node --version
```
Node.js がシステムにインストールされていない場合は、[Node.js Download](https://nodejs.org/en/download/package-manager) にアクセスすることでダウンロードおよびインストールができます。

FCL JS を**npm** もしくは **yarn** を使用してインストールします。
```ruby
npm i -S @onflow/fcl
```
```ruby
yarn add @onflow/fcl
```
**Importing**
**ES6**
```ruby
import * as fcl from "@onflow/fcl";
```
**Node.js**
```ruby
const fcl = require("@onflow/fcl");
```


*Last updated on **Nov 20, 2024** by **Chase Fleming***

翻訳元

https://developers.flow.com/tools/clients/fcl-js/installation

***
<b>[Previous << Wallet Discovery](https://qiita.com/flowcadence/items/01a1580cb15a359a59ce)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Installation)

<b>[Next >> Interaction Templates](https://qiita.com/flowcadence/items/e49102ecf2109f9e55bb)</b>
GNU as x86サンプル

# はじめに
先ずCのアセンブリ出力を参考にし、x64版とx86版を作る。

# 環境
- Windows 11 Pro (64bit)
- WSL (Ubuntu 22.04)

# gcc
x86用のコンパイルには追加のインストールが必要。
Ubuntuの場合

```
$ sudo apt install libc6-dev-i386
```

```fig1.c
// cc -m32 -o fig1 fig1.c
// cc -m32 -masm=intel -S -fno-asynchronous-unwind-tables fig1.c
#include <unistd.h>

int main(void)
{
	write(1, "hello\n", 6);
}
```

# GNU as x64

```fig2.asm
# Assembly (as, x64, Linux)
# as -o fig2.o fig2.asm
# ld -o fig2 fig2.o

	.intel_syntax noprefix

	.section .rodata
_msg:	.ascii	"hello, world\n"
	.equ	_len, ($ - _msg)

	.text
	.global _start
_start:
	mov	edx, _len
	lea	rsi, _msg
	mov	edi, 1		# stdout
	mov	eax, 1		# write
	syscall

	xor	edi, edi
	mov	eax, 60		# exit
	syscall
```

https://tio.run/##TY1BT8MwDIXPya@wVg6blFaA0A67cecnIFVe65VIbgKxy9JfX1LWCS5@8nvfs1GExjPPNcqyVPC6rbBHcZCPLw7efJjywVaAAnWEix@em01QxuJzf/e30FrT@KDErcxBMUOIn4kuPq@BUKc@BmhS7FHRtqMMJ1NOdd6b3QcxRwfXmLh/D7vC09dkWqbgYP8ANaz4Yb2jlLXIwPGMDK0oJrU3OVkzxm9DfXawVq1hQpPEu9/6PS3rkzEViPZx0s3FvLnX5JWskVk6ZC4fc0y3Uhn/4OPjSlP2@gcvyw8

# GNU as x86

```fig3.asm
# as --32 -o fig3.o fig3.asm
# ld -m elf_i386 -o fig3 fig3.o

	.intel_syntax noprefix

	.section .rodata
_msg:	.ascii	"hello, world\n"
	.equ	_len, ($ - _msg)

	.text
	.global _start
_start:
	mov	edx, _len
	lea	ecx, _msg
	mov	ebx, 1		# stdout
	mov	eax, 4		# write
	int	0x80

	xor	ebx, ebx
	mov	eax, 1		# exit
	int	0x80
```

```
$ file fig3
fig3: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped
```
コンテナのルートファイルシステムを読み取り専用に設定する方法

AWS Security Hubを有効化したら、ECSのタスク定義まわりでセキュリティリスクが何点か検知されました。

今回はその中から、「コンテナのルートファイルシステムに対する読み取り専用アクセスが設定されていない」という問題を対応しました。

## 問題の内容
Security Hubで検出されたセキュリティリスクの内容は以下の通りです。
```
ECS containers should be limited to read-only access to root filesystems

This control checks if ECS containers are limited to read-only access to mounted root filesystems. This control fails if the ReadonlyRootFilesystem parameter in the container definition of ECS task definitions is set to ‘false’.
```

### 解説
この警告では、ECSタスク定義の`ReadonlyRootFilesystem`パラメータが`false`に設定されていることが指摘されています。この設定が原因で、コンテナのルートファイルシステムが書き込み可能になっている状態です。

ルートファイルシステムが書き込み可能だと、以下のようなリスクがあります。

1. システム設定ファイルの改ざん
   - 例: `/etc/hosts`や`/etc/passwd`が攻撃者によって書き換えられ、DNS解決やユーザー情報が不正に変更される
2. 実行可能ファイルの改ざん
   - 例: `/usr/bin/node`や`/bin/sh`が改ざんされると、意図しないコードが実行される
3. 不適切な書き込みによるリソース圧迫
   - 例: `/var/log`や`/dev/shm`に過剰なログや一時ファイルが書き込まれることで、メモリやストレージを使い果たしてしまう

## 解決策
### 1. `ReadonlyRootFilesystem`を有効にする
ECSタスク定義の`containerDefinitions`セクションに以下を追加します。

```json
"readonlyRootFilesystem": true
```
これにより、コンテナ全体のルートファイルシステムが読み取り専用になり、不正な書き込みや改ざんを防ぐことができます。

### 2. 一時ファイルへの対応
一部のアプリケーションでは、ログの出力や一時データの処理のために書き込みが必要な場合があります。このような場合、特定のディレクトリだけ書き込み可能にする設定を追加します。

ECSタスク定義で以下のように`volumes`と`mountPoints`を設定します。

まずはボリュームを定義します。Fargate環境ではhostオプションは空にします(自動的に一時ストレージが使用される)。

```json
  "volumes": [
    {
      "name": "temp-storage",
      "host": {}
    }
  ]
```

先ほど定義したボリュームを、コンテナ内の`/tmp`ディレクトリにマウントします。

```json
  "mountPoints": [
    {
      "sourceVolume": "temp-storage",
      "containerPath": "/tmp",
      "readOnly": false
    }
  ]
```

これにより、`/tmp`ディレクトリだけが書き込み可能となり、他のルートファイルシステム部分は引き続き読み取り専用のままとなります。

**注意点**
アプリケーションが特定の場所(例: `/var/log`や`/data`)に書き込みを行っている場合は、その書き込み先を`/tmp`に変更する必要があります。
Community-maintained pre-compiled Erlang/OTP for macOS を使ってErlangをインストールする

Community-maintained pre-compiled Erlang/OTP for macOS というのが出ました．これは，macOSにErlang/OTPをインストールする，コンパイル時間がかからず，かつ指定したバージョンをインストールできる，新しい方法です．

https://elixirforum.com/t/new-community-maintained-otp-builds-for-macos/67338

https://github.com/erlef/otp_builds?tab=readme-ov-file

インストールスクリプトもあるみたいですが，READMEで紹介されていないのと，整合性チェックをしていないみたいだったので，自分でスクリプトを作りました．

https://gist.github.com/zacky1972/f5ff14bb3b4630f2f2e4e59329dd85a0

Rawを押して適切なディレクトリ(たとえば`$HOME/bin`)に保存し，`chmod +x $HOME/bin/erl_install.sh`としてから`.zshrc`等を編集して`PATH`に`$HOME/bin`を追加します．

最新版のErlang/OTPをインストールするには次のようにします．

```zsh
erl_install.sh latest
```

指定したバージョン(たとえば27.1.2)のErlang/OTPをインストールするには次のようにします．

```zsh
erl_install.sh 27.1.2
```

インストールしたErlang/OTPを使うには`PATH`に`$HOME/.erl/(バージョン番号)/bin`を追加します．

## クリーンインストールからのElixir/Erlangインストール手順

1. macOSをアップデートします．
2. (オプション)Xcodeをインストールして起動し，指示通りにインストールしていきます．起動してインストールが終わったら終了して良いです．
3. Homebrewをインストールします(後述)．
4. `brew doctor` を実行してエラー等が出ないことを確認します．
5. `brew update` を実行します．
6. `mkdir ~/bin` を実行します．
7. Webブラウザでこちらの[リンク](https://gist.github.com/zacky1972/f5ff14bb3b4630f2f2e4e59329dd85a0)を開き，Rawボタンを押します．
8. エディタを起動し，`~/bin/erl_install.sh` を作成して，7の内容をコピペして保存します．
9. `chmod +x ~/bin/erl_install.sh`を実行します．
10. エディタを起動し，`$HOME/bin`にPATHを通します．
11. `erl_install.sh latest` もしくは `erl_install.sh (任意のバージョン番号)`を実行して，Erlangを実行します．
12. `brew install asdf` を実行します．
13. 最後に表示された指示の通りに，設定をします．
14. ターミナルを再起動します．
15. `$HOME/.erl/バージョン番号/bin`にPATHを通します．
16. `asdf plugin add elixir` を実行します．
17. `asdf install elixir latest` もしくは `asdf install elixir (任意のバージョン番号)`を実行します．
18. `asdf global elixir (17で指定したlatest もしくはバージョン番号)`を実行します．
19. `elixir -v`でバージョン番号が出ることを確認します．

### Homebrew インストール

https://brew.sh/ja/

1. ターミナルを起動して，リンク先のインストールスクリプトをコピペして実行し，指示に従います．
2. 途中でログインパスワードを入れます．
3. 最後に表示されるコマンド列をコピペして実行します．
LiDARで距離測定

　こんにちは、ロボットテクノ部です。

　今回は、ロボットが距離を測定するために、LiDARを取り付けました。使用した、LiDARは、youyeetooのLD-19です。LiDARは、内部で高速に回転するセンサーによって、物体とライダーの距離を計測します。
 ![1000000039.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914799/0e4ee256-903c-c6bf-985b-86a4debe6b66.jpeg)
ロボット:4WD Mobile Robot Platform Kits for Education
Arduinoの種類:Arduino Due
開発環境:Arduino IDE
LiDAR:LD-19 youyeetoo
OSPF

# イントラネットワークとは各組織の独自に管理されるネットワーク
>インターネットは多くの独立したネットワーク、あるいは、AS（Autonomous System:自律システム）によって構成されされていることはすでに述べたとおりである。ここでいう`ASとは企業や大学、ISPなどの異なる組織によって管理されているAS`を指す。`それぞれの組織は、自身のネットワーク内のルーティングに独自にアルゴリズム`（イントラドメイン・ルーティング(inrtadomain routing))を用いることができる。
### 独自管理のプロトコルはIGPとも呼ばれている。
>イントラドメイン・ルーティング・プロトコルは`IGP(Interior Gateway Protocol)`)とも呼ばれている。
# OSPFはイントラドメイン・ルーティング・プロトコルであり、標準化されたもの
>1988年には、IETF(Internet Engineering Task Force)がその後継となる方式を開発し始めた。それはOSPF(Open Shortest Path First:解放型最短経路ファースト）と呼ばれ1990年に標準化された。

### 参考にしているプロトコル
>OSPFはISO標準となったISーIS(Intermediate System-Intermediate System:中間システム-中間システム）と呼ばれるプロトコルを参考にしている。

# OSPFの仕様
### このプロトコルは独占的ではない
>そのアルゴリズムは広く文献で公表されなければならない、ということである。このため、OSPFは”０”（open）とうたわれている。ある企業が所有する独占的な解法ならそうはいかない

### どのような位置からでもサポートされる
>新しいプロトコルは物理的な距離や遅延も含め、さまざまな距離を基準をサポートしなければならないことである。

### ネットワーク構成の変化に素早く対応する
>動的なアルゴリズムであること、すなわち形態の変化に自動かつ迅速に適応できるものでなければならない。

### サービス・タイプに基づいたルーティングをサポート
>`サービス・タイプに基づいたルーティングをサポート`する、というものであった。新しいプロトコルは、リアルタイム・トラフィック用のルートと他のトラフィック用のルートを持っているが、それを使ったルーティング・プロトコルはそれまで存在しなかった。このフィールドはOSPFに含まれていたが、ほとんど使われたことがなく、最終的には取り除かれた。

### ネットワークに対して負荷を分散させる
>新しいプロトコルは負荷のバランスを保つ、つまり負荷を複数の回線へ分散できるようにすることである。

### ネットワーク全体を把握しなくても良い
>階層的なシステムのサポートが必要とされた。
...
ルーターがネットワーク全体を把握しなくても良いように設計される必要があった。

### セキュリティ機能もある
>ある程度のセキュリティが要求された。いたずら好きの生徒が偽のルーティング情報を送ってもルーターが混乱しないように要求している。

# 他の機能
>OSPFは`SONETなどのポイント・ツー・ポイント・リンク`と`大半のLANで利用されているブロードキャスト・ネットワーク`の`両方をサポート`している。また、ブロードキャスト機能を持たないネットワークにおいても、`複数ルーターがお互いに直接通信を行うマルチアクセス・ネットワークに対応`できる。

* ポイント・ツー・ポイント・リンクとは
* SONETとは
# ECMPで自分以外のノードの最短距離を計算する
>OSPFの基本的な役割は、実際のネットワークをグラフで表し、リンク状態アルゴリズムを用いて、各ルーターにこのグラフ上で`自身から他のすべてのノードへの最短経路を計算`させることである。 同等の最短経路が複数存在することもある。こうした場合、`OSPFはこれらの最短経路を覚えておき、パケット転送中にトラフィックを分散させる`ことで、負荷のバランスをとる。この仕組みをECMP(Equal Cost MultiPath:等コスト多重経路）と呼ばれる

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/