OmniAICreator/Qiita-1.07M huggingface dataset:
【MSX0】ACCEL.PAS【Turbo Pascal】

# はじめに
『MSX0 Stack』付属の IoT BASIC サンプルを『Turbo Pascal』へ移植してみます。

 - [【MSX0】IoT BASIC サンプルの移植【Turbo Pascal】(Qiita)](https://qiita.com/ht_deko/items/2362488c5c99aec4afbf)

# ACCEL.BAS
◆加速度センサ

| 項目 | 説明 |
|:---|:---|
| 概要 | Battery Bottom2 の加速度センサの値を取得して表示します |
| ファイル名 | ACCEL.BAS |
| 対応デバイス | M5GO Battery Bottom2 |
| コメント | 加速度センサを搭載した M5GO Battery Bottom2 を装着した状態で本体を起動し、プログラムを実行してください。 |

> Battery Bottom 2 の加速度センサの値を取得して表示します

製品名が少し正確ではない記述となっています。

Plan B 以外の『MSX0 Stack』には『M5GO Bottom2』が付属し、Plan B には加えて『Core2 Battery Bottom』が付属します。

『Faces II Bottom』を装着している場合にはセンサーが搭載されている『M5GO Bottom2』または『Core2 Battery Bottom』に換装する必要があります。

:::note warn
『Core2 Battery Bottom』を使う場合、小さなフタのようなものにセンサーが付いていますので、これを必ず取り付けてください。
:::

**See also:**

 - [『MSX0 Stack』の操作方法 - ハードウェア (Qiita)](https://qiita.com/ht_deko/items/cdb1594e9879a5e9e660)

## MSX0 Stack での挙動

`ACCEL.BAS` をロードして、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/d168c113-dd2b-d5f7-691f-c4800e5fea23.png)

実行してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/e60b8f97-3c82-67ea-61ca-92538edfd03b.png)

『MSX0 Stack』を傾けると値が変動します。

:::note info
プログラムは〔Ctrl〕+〔Stop〕(リモートコントロールパネルからは〔Ctrl〕+〔F12〕)で中断できます。
:::

## Turbo Pascal へ移植

別途、`SYSUTILS.LIB` と `IOT.LIB` が必要です。

 - [【MSX0】IOT.LIB (Qiita)](https://qiita.com/ht_deko/items/a5c0bf6e7969093beb3c)

```pascal:ACCEL.PAS
program ACCEL;
type
  LibStr = string[80];
{$I SYSUTILS.LIB}
{$I IOT.LIB}
var
  X, Y, Z: Integer;
begin
  ClrScr;
  while not KeyPressed do
  begin
    X := IoTGetInt('device/accel/x');
    Y := IoTGetInt('device/accel/y');
    Z := IoTGetInt('device/accel/z');
    Writeln(X:6, Y:6, Z:6);
  end;
end.
```

実行してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/cad01b6f-1966-a065-bd89-61a41da6efda.png)

『MSX0 Stack』を傾けると値が変動します。

:::note info
任意のキーで中断できます。
:::

### 解説

#### ループ
GOTO ループを **while** での無限ループに替え、`KeyPressed()` でキー押下を検出して抜けるようにしました。

#### 書き出しパラメータ
`Writeln()` の `X:6` というのは、**書き出しパラメータ** というもので、少し特殊な書式設定です。整数型変数 X の表示最小幅を 6 に設定しています (Y と Z も同様)。

**See also:**

 - [(12.3.1.) 書き出しパラメータ (書き込みパラメータ / Write-parameters) (Qiita)](https://qiita.com/ht_deko/items/391d6c1a53c7aaa3416f#1231-%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF-%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF--write-parameters)


# おわりに
今回の移植に関して難しい所は特にありませんでした。
Salesforce 認定 Platform アプリケーションビルダー資格の更新 (Winter '24)をやってみた感想

## 最新のSalesforce 認定 Platform アプリケーションビルダー資格の更新 (Winter '25)はこちらで公開しています

https://qiita.com/Takaa/items/eb482eff699f3347fafc


こんにちは
今回はSalesforce 認定 Platform アプリケーションビルダー資格の更新 (Winter '24)をやってみたので感想を共有します

https://trailhead.salesforce.com/ja/content/learn/modules/platform-app-builder-certification-maintenance-winter-24


今回の内容は動画でも解説しています

https://youtu.be/ActVArLE9yM?si=tF44TFvLBplMuAVV

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


# なお、今回のハンズオンチャレンジに挑戦する場合、新規Playgroundを作成し1からチャレンジすることをおすすめします


それではハンズオンのチャレンジを見ていきます


## 問題文（英語原文）

英語本文はこちら

Create a quick action on Case
Action name: Update_Status
Standard Label Type: Change Status
Action Type: Update a Record
Success message: Status Updated Successfully
Add status field on action layout
Add Update_Status quick action to case related list in ‘Contact Layout’
View all cases related to contact ‘Stella Pavlova’ in case related list, mass select all cases and set Status to ‘Closed’


## 問題文（非公式日本語和訳文）
非公式に日本語に訳した内容はこちらです

・クイックアクションをケースオブジェクトに作成
・アクション名は「Update_Status」と設定します
・標準の表示ラベルの種類は「状況の変更」
・アクション種別は「レコードを更新」と設定します
・成功メッセージは「Status Updated Successfully」
・アクションレイアウトに「状況」項目を追加します（通常は状況項目が入っているはずです）
・ページレイアウト「Contact Layout」を編集する。ページレイアウト「Contact　Layout」の関連リスト「ケース」を編集して、先ほど作成したアクション「状況の変更」を追加する
・取引先責任者「Stella Pavlova」を表示させます。「Stella Pavlova」の関連リストにケースレコードが複数ございますので、そのケースをすべて「Closed」にしましょう




## 個人的難しかったポイント

### 1.ケースのアクション作成方法は？
アクション作成方法はこちらのヘルプでご確認しましょう

https://help.salesforce.com/s/articleView?id=sf.bi_explorer_add_action_to_object.htm&type=5


### 2.ページレイアウトの関連リストの編集方法は？
ページレイアウトの関連リストの編集はこちらのヘルプで確認しましょう

https://help.salesforce.com/s/articleView?id=sf.customizing_related_lists.htm&type=5

## 個人的にハマったポイント

### 1.言語は英語にしてTrailheadに挑戦しよう
（他のTrailheadにも言えることですが）Playground環境が日本語の場合、
We can’t find ‘Update_Status’ case action on Contact Layout.
のようなエラーが出てクリア判定されないです

もしも確実に設定が正しいのに上記エラーが発生する場合、
ユーザの設定から言語を英語にしましょう


詳細はこちらの記事をご参照ください


>ユーザの設定です。
>こちらは右上部分の「設定」をクリックしましょう
>そして
「言語とタイムゾーン」から、地域を英語にして、言語も英語にしましょう

https://qiita.com/Takaa/items/9a4543b39c886fe2729a

### 2.ケースの設定をして状況「Closed」を表示させよう

(今回はアクションからケース「Closed」を選択する想定ですが)

私ははじめ、ケースレコードから手動で状況を「Closed」にしようと思いましたが
「あれ？なぜか選択リスト値にClosedが出ないぞ？」
という問題にぶつかりました

その場合、こちらの設定により状況を「Closed」が表示されます

https://qiita.com/Takaa/items/7b091cba0d222e7152bc
早速Google Geminiを使ってみた！

### はじめに

Google が ChatGPTに対抗してリリースする Google Geminiを使ってみました。
無料枠に非常にお世話になっているので、Google大先生には感謝してます。

https://www.watch.impress.co.jp/img/ipw/docs/1554/512/html/ge2_o.jpg.html

いろんなナレッジを生かして、投資サイトを作ろうと画策してます

https://stonehills.tokyo/financer/


### 1. Pythonライブラリのインストール

```
pip install google-cloud-aiplatform
```

```
Successfully installed google-auth-2.25.2 google-cloud-aiplatform-1.38.1
google-cloud-resource-manager-1.11.0 google-cloud-storage-2.14.0
google-resumable-media-2.7.0 grpc-google-iam-v1-0.13.0 shapely-2.0.2
```

### 2. サンプルのテスト

テストプログラム作成

```
vi gemini_test.py
https://cloud.google.com/vertex-ai/docs/generative-ai/chat/test-chat-prompts?hl=ja
を貼り付け
```

質問部分だけリストアップ

```
 chat = chat_model.start_chat(
        context="My name is Miles. You are an astronomer, knowledgeable about the solar system.",
        examples=[
            InputOutputTextPair(
                input_text="How many moons does Mars have?",
                output_text="The planet Mars has two moons, Phobos and Deimos.",
            ),
        ],
    )
```

実行
Google Cloud上のサーバで実行しました。
```
python3 gemini_test.py
```

ちゃんと結果が来た。簡単じゃん。

```
Response from Model: There are eight planets in the solar system:
Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune.
```

あとは翻訳APIにかませてください
Microsoft Listsの進化により、PowerAppsがオワコン化

何故かPowerAppsの開発担当になった。

しかし、休日に自分のスキルアップにも役立てたい。

法人アカウントでしか開発できない点が、最大のネックである。

# Microsoft Lists

いろいろ調べていて、下記の結論に行きついた。

UIの進化は、しれっとやってくる。
PowerAppsには、もう付き合っていられない気がする。
SharePoint Listも、知らない間にMicroSoft Listsに進化している。

> Microsoft Lists の機能強化に伴い、SharePoint サイトからリストを開くと自動的に Microsoft Lists に切り替わるようになりました (現時点で自動遷移されていない場合もアップデートにより徐々に自動遷移されるようになります)。

https://www.illuminate-j.jp/blog/sharepoint08_lists_to_sites



# オワコンの理由
* PowerAppsでロジックが書けたとしても、所詮ローコードの関数記述である｡
* PowerAppsでDataberseを使ったモデル駆動は基本有料（企業契約アカウント必要）
* Microsoft Listsを使うと、基本OFFICEアカウントで作れるので誰でも無料

# 結論
またしても中途半端なローコードアプリに手を出した企業ＤＸ担当者は、
またたくまに、陳腐化したマイクロソフトの負の遺産に苦しめられることになるだろう・・・

Copilotが出てきた瞬間に、コードで何とかできる領域は広がった。
クラウドサービス側でしか、開発プロセスを制御できないアプリ開発は、今後は衰退していくと思われる。

とりあえず、企業ＤＸは　EXCEL　→　MicroSoft Listsで、かなりの事が出来ると思われる。

https://youtu.be/gTkrZEIHEWg?si=7QTWmzrGHOlgTnoY


# Bing回答

結論から言うと、Microsoft Listsの進化により、Power Appsがオワコン化する可能性は十分にあります。

Microsoft Listsは、Microsoft 365の一部として提供される、データベース機能を備えたリスト作成ツールです。従来のExcelベースのリストとは異なり、Power AppsやPower Automateなどの他のMicrosoft 365ツールと統合することで、高度なデータ分析や自動化を実現することができます。

Microsoft Listsの進化により、Power Appsの必要性が低下する可能性がある理由は、以下のとおりです。

## データベース機能の充実
Microsoft Listsは、従来のExcelベースのリストとは異なり、データベース機能を備えています。これにより、Power Appsで必要だったデータベースの作成や管理が、Microsoft Listsですべて行うことができるようになります。

## Power Appsとの統合強化
Microsoft Listsは、Power Appsと統合が強化されています。これにより、Microsoft Listsのデータや機能をPower Appsで簡単に利用できるようになります。

## Power Automateとの統合強化
Microsoft Listsは、Power Automateと統合が強化されています。これにより、Microsoft Listsのデータや機能をPower Automateで簡単に自動化できるようになります。

これらの進化により、Microsoft Listsだけで、Power Appsで実現していたようなデータ分析や自動化を実現できるようになります。そのため、Power Appsの必要性が低下する可能性があるのです。

ただし、Power Appsには、Microsoft Listsでは実現できない機能もいくつかあります。たとえば、

* 複雑な画面設計
* 高度なデータ処理
* 独自のロジックやアルゴリズムの実装
などの機能です。これらの機能を必要とする場合は、Power Appsは引き続き必要となるでしょう。

また、Power Appsは、Microsoft Listsよりも柔軟性と拡張性が高いというメリットもあります。そのため、今後も、Power Appsを活用した高度なデータ分析や自動化の需要は、一定程度存在すると考えられます。

このように、Microsoft Listsの進化により、Power Appsの必要性が低下する可能性はありますが、Power Appsには、Microsoft Listsでは実現できない機能やメリットもあるため、オワコン化する可能性は低いと考えられます。

# GPT4回答
Microsoft Listsの進化がPowerAppsの役割や重要性に影響を与えるかどうかについてのご質問ですね。

まず、Microsoft Listsが進化し、より直感的で強力な機能を提供するようになったことは事実です。これにより、データの管理や共有、協働がより簡単になりました。しかし、これがPowerAppsを「オワコン」（時代遅れ）にするとは限りません。

## PowerAppsの重要性
* カスタムアプリケーションの開発:
PowerAppsの主な強みは、コーディングスキルが限られているユーザーでもカスタムビジネスアプリケーションを簡単に作成できることです。これはMicrosoft Listsの提供する範囲を超える機能です。

* 複雑なビジネスプロセスのサポート:
PowerAppsは、複雑なビジネスロジックやプロセスをサポートし、より高度なユーザーインターフェースを提供することができます。


* 広範な統合:
PowerAppsは、Microsoft 365エコシステム内の他のアプリケーションやサービス（例えばMicrosoft Flow、AI Builder）との統合が可能です。

## Microsoft ListsとPowerAppsの共存
* 補完的な関係:
Microsoft ListsとPowerAppsは、お互いを補完する関係にあります。Listsはデータの管理と基本的なカスタマイズに優れている一方で、PowerAppsはより複雑なアプリケーションの開発に適しています。

* 統合の可能性:
PowerAppsはMicrosoft Listsと統合し、Listsに格納されたデータを活用して、より動的でインタラクティブなアプリケーションを作成することができます。

* 結論
Microsoft Listsの進化は、データ管理と協働の面で大きな進歩をもたらしていますが、PowerAppsが提供する高度なアプリケーション開発の機能は、依然として重要です。両者は異なるニーズを満たし、Microsoftのエコシステム内で共存し、相互に価値を高めることができます。したがって、PowerAppsが「オワコン」となるとは考えにくいです。むしろ、両者を組み合わせることで、より強力なビジネスソリューションを構築することが可能です。
G検定 2023#5 合格体験記

-------------------- 目次 ここから -------------------
G検定とは？
 試験範囲シラバスまず見てみよう

勉強時間は？
 40h程度 平均敵な時間かな

試験はオンライン？
 yes

合格するための勉強方法は？
 合格体験記を参考にしよう

合格するには？
 問題集中心の勉強(+当日 解けない問題対策した場合)で合格ライン70%にはいくと思う。試験回によるがおおよそ60-65%の正当率が合格最低ライン。
 畳み込みや自然言語処理などモデルのチューニングをやったことがないと、分からないだろ
 という問題もでる。そこらへんの知識がある方が普通に勉強すると80%以上はとれるような感じ。

試験当日の対策は？
 まとめノート、ディスプレイ2、chatGPT https://chat.openai.com/
 注意は、設問に「誤りがあるものを選べ」が出題される。これはカンニング対策か？
　おおよそ10-20%程度。
 
--------------------------------------------

■ポイント（解けない問題対策 : 公式上カンニングは禁止となっています(^_^;) ）
・一応試験中にまとめノートも参照できるので、完全記憶する必要はないが全く聞いたことないワードや情報だと、あたりもつけれないので検索一発だよりになる(キーワードを数回変えて検索している時間はないと思ったほうがいい)。
1問30～45秒の割当になるため、キーワード1-2回検索でまとめノート等にヒットしない場合は、もう設問ごとchatGPTに投げたほうがいいと思う。
(検索する場合は、試験の設問・回答はコピペできませんので、手打ちが必要です。)

■勉強時間
・2週間前から対策、土日 6h x 4 = 24h 平日 2hx7 = 14h  合計38h程度 + スキマ時間でG検定アプリ

■合格体験記
G検定合格体験記
https://qiita.com/mm_note/items/366c07091d24493347ea

ディープラーニングG検定に合格した学習方法と受験体験
https://parallelcareerlab.com/?p=2500

G検定（ディープラーニングと機械学習の検定）模擬テストと公式例題解説を無料公開中
https://study-ai.com/generalist/

【G検定2024まとめ最新版】要点整理＆当日用カンペ ★試験当日用おすすめ
https://qiita.com/juri_engineer/items/a42f28e57a1d6809e43e

■書籍・アプリ
・人工知能は人間を超えるか
・深層学習教科書 ディープラーニング G検定(ジェネラリスト)公式テキスト 第2版
・最短突破 ディープラーニングG検定(ジェネラリスト) 問題集 第2版
・問題集(インプレス) 
・G検定対策アプリ 1200円
・G検定（ディープラーニングと機械学習の検定）模擬テストと公式例題解説を無料公開中
https://study-ai.com/generalist/
・【受講料無料】DS検定リテラシーレベル対応　データサイエンティスト基礎講座
https://www.skillupai.com/ds/
・DIVE INTO EXAM(G検定)
https://diver.diveintocode.jp/dive_into_exam/3

■学習手順
数理の問題は、5個のデータ(例 30,40,50,30,40のxxを求めよ)
の標準偏差、分散あたりはすぐ計算できるようにしておくとよい。

案1.
「人工知能は人間を超えるか」を一読
「深層学習教科書 ディープラーニング G検定(ジェネラリスト)公式テキスト 第2版」を勉強
「G検定対策アプリ」を勉強（1回目）
「最短突破 ディープラーニングG検定(ジェネラリスト) 問題集 第2版」を勉強（1回目）
「最短突破 ディープラーニングG検定(ジェネラリスト) 問題集 第2版」のWEB問題集を勉強（1回目）
「G検定対策アプリ」を勉強（2回目）
「最短突破 ディープラーニングG検定(ジェネラリスト) 問題集 第2版」を勉強（2回目）
「最短突破 ディープラーニングG検定(ジェネラリスト) 問題集 第2版」のWEB問題集を勉強（2回目）

案2.
公式テキスト（1回転）→ 
インプレス問題集と技術評論社問題集の同じ分野を同時に学習（1回転）
→試験直前に公式テキスト（1回転）

■ツール
1,excelまとめノート
私は、カンペ資料として、エクセルに勉強した内容をその都度記載するようにしました。
インターネット検索では、カンニングするにしても時間がかかるため、ブック検索のできるエクセルにまとめようと思った次第です。実際、試験中も単語検索で内容を確認しましたし、エクセルにまとめることで勉強した内容を覚えることもできたので、自分にはあってた方法かなという気がします。

2.chatGPT
https://chat.openai.com/

■試験当日
モニターの確認(2画面はあったほうがよい)
【GitHub】Pull Requestの作成方法

# Pull Requestとは
開発者のローカルリポジトリでの変更を他の開発者に通知する機能。
### メリット
ソースコードの変更箇所の差分をわかりやすく表示。
ソースコードに関するコミュニケーションの場を提供。(レビュー結果をフィードバックする)
ブランチ機能と組み合わせて上手く活用すると、新規機能開発とバグ修正といった複数の作業を、複数人で並行して進められる。

# Pull Request作成方法
### ①リポジトリのファイルをローカルに落とす!
URLをセットし、クローンする！

```
$ git clone https://github.com/〜/〜.git
```

### ②branchを切る!

```
$ git checkout -b branch名
$ git checkout -b develop
```

機能追加、修正を行なった後、③に進む！

### ③変更内容をローカルリポジトリにコミットする！

```
$ git add .

$ git commit -m"(変更内容を記載)"
```

git add .で全ての変更をステージングし、git commitすることにより、ローカルリポジトリに変更内容コミットすることが出来ます。

### ④作成したブランチをPushする!

```
$ git push origin branch名 
$ git push origin develop
```
developブランチの変更内容をPushする！

### ⑤GitHub上でPull Requestを作成
ここからはGithub上で行う！
① Pull requestsタブのNew pull requestボタンを押す！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/1ae280d2-9951-35c3-d971-1ee827c83725.png" width=700>

② マージしたいブランチ名(右側)を選択！
今回はdevelopブランチをmasterにマージします！
選択できたら、Create pull requestボタンを押します！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/50c5e495-5f16-4bbb-b400-9158c60343ad.png" width=700>

③ 変更内容を記入し、Create pull requestボタンを押します！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/26864f7c-bdb4-c9e4-8c3c-41ada17dc708.png" width=700>

④ 個人開発の場合は、自分でプルリクエストをマージする！
※チーム開発の場合は、プルリクの作成者と別の人が確認し、レビューを行い、問題がない場合はマージすることが一般的である。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/7a8fc08b-020b-4982-aa77-958e7404f90b.png" width=700>

 ### Pull Request作成できました:relaxed::v:
 
# おまけ :過去のPullRequestの確認方法
### ①Closedをクリックする！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/4b43e9c6-5b05-9074-1681-dca284cd4e66.png" width=700>

### ②過去のPullRequestが表示されるので、詳しく確認したいところをクリックする！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/9a0fa7c1-b301-9918-fba3-b2dbbbbc354d.png" width=700>

### ③詳細が表示され、過去のPullRequestの変更箇所の差分を確認することができる！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/18e0806a-5a65-a33f-2fbf-5f382f62dc00.png" width=700>


# 参考文献
https://backlog.com/ja/git-tutorial/pull-request/03/

https://qiita.com/matsukazu1112/items/1633e7392c827c03d533

https://qiita.com/aipacommander/items/d61d21988a36a4d0e58b
ADRとDesign Docで開発組織の生産性を向上するためのドキュメンテーション文化を醸成する

この記事はMOSH Advent Calendar 2023の10日目の記事です。

プロダクティビティーチームの[@soartec-lab](https://github.com/soartec-lab)です。

[前回の記事](https://qiita.com/SoarTec-lab/items/c5a8bed40b8b39c404b8)では、プロダクト開発における「学習のためのアウトプット」と「収益のためのアウトプット」を 分けて捉えることで効率的な開発を目指すアプローチについて紹介しました。

この記事では、開発組織の生産性を向上するためのドキュメンテーション文化についてアプローチしている内容を紹介します。

# 背景

開発チーム全体での課題として以下の課題が発信されることが多く、私も1人の開発者として同様の課題を持っていました。

- 開発中の過去の経緯や仕様の理解が難しく時間がかかってしまう
- 仕様確認やシステム理解が手探りになり開発体験が悪い
- 複数人がそれぞれ別の目的で1つのリポジトリを更新するので情報を効率的に把握したい

# 目的

これらの問題を解決する事でナレッジを蓄積し自律したチーム開発を実現することを目指しました。

- 組織拡大や新入社員のオンボーディングに備えて情報を整理したい
- 過去の意思決定を振り返り可能にして継続的な改善を促進する
- 技術的な意志決定の透明性を高め開発チーム全体のシステム理解度を向上させる
- 組織内で開発に関する情報を共有し個々で判断できる質とスピードを向上させ自走できるようにする

# やったこと

開発のアウトプットとしてADR、Design Docの2種類のドキュメンテーションを書くことを開発プロセスに導入しました。

## ADR（Architecture Decision Records）

ADRは実装方針の変更や新しいツール、技術の導入などアーキテクチャに関わる意思決定を残します。ADRとDesign Docを分けることで、機能開発に閉じた内容と全体に関わるシステムにおける重要な意思決定が混ざることを避けています。軽微なものはPRのDescriptionに書くことにしています。

書籍[Design It!](https://www.oreilly.co.jp/books/9784873118956/)では設計をタンジブルにするアクティビティの1つとして紹介されています。

## Design Doc（Design Document）

Design Docは機能や設計に焦点を当て検討した内容を明文化します。

実装方針の変更や新しいツール、技術の導入などアーキテクチャに関わる意思決定があった場合には別途ADRを書きます。そのためDesign Docの中でアーキテクチャの変更があった場合はADRを書いて参照することもあります。

書籍[Googleのソフトウェアエンジニアリング](https://www.oreilly.co.jp/books/9784873119656/)ではドキュメンテーションとして詳細に説明されています。

以下のサイトでも詳細に説明されております。

https://www.industrialempathy.com/posts/design-docs-at-google/

# ドキュメントのテンプレート

実際の開発では以下のようなテンプレートを用意し、こちらをベースにドキュメンテーションを行っています。

## ADR テンプレート

```markdown
# 目的
解決したい課題はXXX。

# 背景
解決する問題の背景やチームの状況などの戦略。

# 制約事項
ライブラリや設計の変更におけるトレードオフやできない事とその理由。

# 内容
- 採用した内容
- 検討して採用しなかった内容

# 影響範囲
ADRの決定が及ぼす可能性のある影響範囲。

# 参考リンク
ADRに関連する情報や参考にした資料へのリンク。

# Author
ADRを提案・作成した個人またはチームの名前。
```

## Design Doc テンプレート

```markdown
# 目的
# ゴール

解決したい課題はXXX。

# ノンゴール
XXXについてはこのドキュメントのスコープ外です。

# 背景
解決する問題の背景やチームの状況などの戦略。

# 制約事項
ライブラリや設計の変更におけるトレードオフやできない事とその理由。

# 解決する課題
具体的な解決すべき課題。

# 課題に対するソリューション
- 採用した内容
  - API設計、DB設計なども含めて詳細に
- 検討して採用しなかった内容

# 参考リンク
Design Docに関連する情報や参考にした資料へのリンク。

# Author
Design Docを提案・作成した個人またはチームの名前。
```

# まとめ

9月ごろから導入を進めており社内ではポジティブなフィードバックをが多いです。また週次で書いたドキュメントを共有しており ナレッジ共有の文化も少しずつ醸成されてきたと感じております。
今はドキュメンテーションに慣れていく段階だと捉えておりアウトプットの中から学んでいければと考えておりますが、ゆくゆくは技術的な意思決定を振り返ったり過去の経緯をベースとした改善に役立てることができる経験を組織的に積んでいきたいと考えています。
私的買ってよかったもの紹介

本記事は、[めんどい太郎の Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mendoitarou_first_calendar) 18日目の記事です。

# はじめに

この記事は初心者が書いています。

今回は買ってよかったというものを紹介します。

(記載しているAmazonなどのリンクはアフィリエイトリンクでは**ありません**)

# 買ってよかったもの
## 体温計
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/576f2c24-b5b1-0ac3-32fe-04108b9dbd4d.png)

オムロンのスマホにデータ転送できる体温計です。

[Amazonリンク](https://amzn.asia/d/e6jBvXp)

データ転送が爆速です。

計測も爆速、転送も爆速。体温計測が楽になりました。

欲を言えばオムロンさんはAPIを一般向けに公開していただけると嬉しいなと思っています()

学校に体温を毎日提出する作業がそこそこ面倒だし忘れがちだったので...

## スマートスピーカー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/7213285d-0124-9261-1074-e4d2d935000c.png)

Amazonの画面付きスマートスピーカーです。

[Amazonリンク](https://amzn.asia/d/6Xgr2rC)

私が持っているのは初代Echo Show 5です。

5インチなのでそんなに場所を取らないですし、画面付きだと操作しなくても情報を表示してくれていたりするのでとても便利です。

タッチパネルになっているのでタッチ操作も可能です。

着替えているときに天気予報を聞くなど便利な使い方ができます。

サブスクに加入していれば音楽を聞くこともできます。スピーカーの音質もいいほうです。

画面が小さいですが、Amazonプライムビデオも視聴可能です。

Webブラウザが使えるのでYouTubeも見ることができます。

しかし、初代はスペックがそんなに良くないのでカクつきます。

スマートスピーカーは一代持っておくとかなり便利になると思います。

**特に画面付きがおすすめ！**

## TWS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/8df331fe-fa22-77e8-46c2-ee43d8752f4d.png)

Moondropの新作TWSです。

[e☆イヤホンリンク](https://www.e-earphone.jp/products/detail/1542810/)

Moondropはコスパが高いです。特にSpace Travelはデザインよし音質よしでかなりいいです。

外音取り込みやANCもついているのでかなりおすすめです。

私は日本で発売される前に購入したので海外通販で個人輸入しました。

## USBメモリー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/b33a539f-e286-d338-b953-e1111130727f.png)

KIOXIAのUSBメモリーです。

[Amazonリンク](https://amzn.asia/d/e1KdYKi)

信頼性高いですし性能もそこそこです。

USBメモリーなんかは持って損はないかなと思います。

## スマートウォッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/26379c4e-0a8f-0620-0a50-84dfaa4a7ce5.png)

Xiaomiのスマートウォッチです。結構前に買ったやつ。

[Amazonリンク](https://amzn.asia/d/b3Vb9oq)

今買うなら別のものを買ったほうがいいとは思います。

スマートウォッチは通知が見れるのがすごく便利です。

WearOS搭載のものなら自分でアプリを作成することもできるのでそちらをおすすめします。

まぁ、バッテリーの持ちが悪くなるとは思いますが...

私はそのうちWearOS搭載のスマートウォッチに買い替えたいなと思っています。

## ペンタブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/3edfbc22-e145-4069-5eed-7b593ce93d84.png)

Wacomの安めのペンタブです。

[Amazonリンク](https://amzn.asia/d/8xyljiT)

ペンタブはかなり便利です。絵を描く以外の用途にも使えます。

ペンタブ持ってて損は無いと思います。

# 終わりに

今回は私的買ってよかったものを紹介しました。

今後また追加するかもしれません。

それでは！
会社あるある。打刻ミスの証跡を集めてくれるpython

私の会社では、勤怠管理としてカードをかざすことがある。そして、会社としてはPCのロガーも管理対象としているため、勤怠打刻とPCの電源管理をすることで、労働時間の乖離がないようにしている。

そこで、ミスった時やPCのロガーが取れない時に、ちゃちゃっと取れるようにpythonを書いてみた

## 簡単に要件

- 言語：python
- 機体：macbook 
- データをCSVに出力する
- temirnalの **"last"** コマンドで取得する

## 前提
- kintai.csvとpythonを同じ配下
    - これは勝手にパスを変えればOK
- lastコマンド打てば正直いいので、意味あるかどうかは知らん笑
- csvじゃなくて、jsonでもできるよ

## 書いてみたコード

### CSVで出力するようにする
```python: csvで出力
import subprocess
import csv

# terminalでlastコマンドを実行
process = subprocess.Popen(['last'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

output, error = process.communicate()
if error:
    print("Error:", error)

# 出力を行単位で分割
lines = output.strip().split('\n')

# CSVファイルに保存
csv_filename = './kintai.csv'
with open(csv_filename, 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    # ヘッダー
    writer.writerow(['User', 'TTY', 'Login@', 'Logout', 'Duration'])
    
    # 各行を解析してCSVに書き込み
    for line in lines:
        writer.writerow(line.split())

csv_filename

```

#### 結果

![Screenshot 2023-12-16 at 9.54.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556108/7d29f195-abbf-4cae-ca7b-d912309f1869.png)


ちなみに、vscodeで[rainbow csv](https://qiita.com/0w0/items/07a481921a2ac09a049f)を使ったので、こんなになってます。


### JSONで出力するようにする

```python:jsonで出力
import subprocess
import json

# 'last' コマンドを実行
process = subprocess.Popen(['last'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

output, error = process.communicate()
if error:
    print("Error:", error)

# 出力を行単位に分割
lines = output.strip().split('\n')

# JSON形式で保存するためのリストを作成
json_data = []
headers = ['User', 'TTY', 'Login@', 'Logout', 'Duration']

for line in lines:
    # 各行をスペースで分割して辞書に変換
    parts = line.split()
    if len(parts) < len(headers):  # 不完全な行は無視
        continue
    record = dict(zip(headers, parts))
    json_data.append(record)

# JSONファイルに保存
json_filename = './kintai.json'
with open(json_filename, 'w') as jsonfile:
    json.dump(json_data, jsonfile, indent=4)

json_filename
```


#### 結果
![Screenshot 2023-12-16 at 10.02.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556108/319f7922-22d4-a186-a173-8e2e4782fc78.png)
つづく

## 最後に
ここまではそんなに意味はないんですが、これ以降にいろいろ構築してAPI化までしたら勤怠でちょっと楽々なものを作れました😃（人事には秘密🎶）
mrubyでLCDを完成させてみた

アドベントカレンダーが空いてたので、一発芸です。

mruby-cairoで画像を作ってmruby-bsdtftでSPI転送してLCDに表示しています。

![IMG_20231216_092805.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/1b2ef2dc-508b-fe6a-4e9d-4e1e8f2cd890.jpeg)

[今まで書いた](https://qiita.com/yamori813/items/c289b41cc991e6b3cabf)ものと、これのどこが新しいかというと、アクリル板でLCDを保護するようにしました。

LCDは表面に強い力が加わると、中で割れてしまう事があります。

アクリル板は以前工作した残りでちょうど良い大きさのものがありました。穴はLCDの基板を乗せてキリで穴の中心を記しつけて、1mmくらいのドリルで一度穴を開けた後2mmの穴にしました。穴が微妙にずれてしまって、無理やり入れてます。

アクリル板と基板のスペーサーは圧着のスリーブを使っています。昇圧回路のコイルがLCD面より高いので、そのままアクリル板を乗せると傾きます。

やっとLCDの保護シールをはがしました。

本体はHardOffで330円で売ってるあれです。Flashは8Mに張り替えています。FreeBSDをZRouter.orgでビルドしてFlashに焼いてます。
エラー: Array callback must have exactly two elements

このエラーが出たら、こんなミスをしているかもしれません。
![ero.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309843/c9454c7e-5c97-d7ca-1ee4-7a1aa320bbc0.jpeg)


PHPは、echoの行でエラーが出て止まっていますが、
array_key_existsを使っていますから、$customerRanksは、キーをもつ配列なのです。

配列から値を取り出すには、[]を使わないといけません。ただそれだけの、書きミスという事です。

``` membership.php
if(is_numeric($parameters['rank']) && array_key_exists($parameters['rank'], $customerRanks))
    echo "会員ステータス:".$customerRanks($parameters['rank']);
endif
```

これは
```
$customerRanks($parameters['rank']);
```
↓こうです。
```
$customerRanks[$parameters['rank']];
```

こんな書きミスするなんて、きっと疲れているのでしょう。
やんなっちゃうね。
プログラマーとしてGemini Proを使ってみて(APIを試す前) 結論:３番手かな

APIなしで、Chatで質問してみた感じですと

結論から言うと、Codeium + GPT4(そのうち有料になる?)が1番・無料で使える間はGPT4-Turboが2番、Geminiは性能通りその次。でも解答例を作ってみたら、違った角度の意見で面白いね。


# 評価
## Codeium
無料のCopilot系
ベースモデルの時は、いまいちですが、Wishlist登録したらGPT4が使えるようになったので試してみたら、とっても適切な答えが出てきた。

## GPT4-Turbo
最新のコードに詳しかったり、GPT4より的確に答えてくれることもある。今は、とあるサービス経由で無料で使っている。普通にchatgpt api経由で呼びだしても、そこそこ低価格なので使うことはありそう。(この企業の評価が決まってないので名前はださない)

## Gemini Pro
GPT3.5よりは高性能らしいけど、もうGPT3.5使ってないからな。
AlphaCode2の元になるぐらいのので、学習させれば適切な答えをだせるようになるみたいだ。

Visionもあるし、将来的な価格的も安いのでGemini APIで試してみたい。

# 解答例（ややコードとは関係ない質問ですが)
STT: Speech To Text という言葉があるのに、ASR: Automatic Speech Recognitionという呼び方が出来たのはなぜですか？
```
私の解答:技術の進化で、音声をテキストに変換するだけでなく、音声の中身まで理解するようになったから
```
## Codeium/GPT4
### STTとASRの違い

#### STT (Speech to Text)
- **テキスト変換プロセス：** 話された言葉を書かれたテキストに変換するプロセスを指します。
- **書き起こしに焦点：** 音声記録の書き起こしやディクテーションツールなどでよく使用されます。

#### ASR (Automatic Speech Recognition)
- **音声理解プロセス：** 音声をテキストに変換するだけでなく、その意味を理解して適切な反応を生成するより包括的なプロセスを指します。
- **応用範囲の拡大：** 音声アシスタントや音声制御システムなど、音声データの意味を解釈するための技術進歩を反映しています。
- **高度な技術要素：** 音声認識の精度の向上、文脈の理解、話し手の意図認識など、より高度な認識機能を含んでいます。

ASRという用語の登場は、単純なテキスト変換を超えて、さまざまな応用のために話し言葉を深く処理し理解することを目指す技術の進化に関連しています。これが、より洗練された方法で音声を認識し反応するシステムを指すために、ASRという呼称が使われるようになった理由です。
## GPT-4turbo
### STTとASRの比較

#### **STT (Speech To Text)**
- **定義**: 音声言語を書かれたテキストに変換すること。
- **焦点**: 口述された言葉をテキストに転写することに主眼を置いています。
- **使用例**:
  - 字幕の生成
  - 音声コマンドのテキスト化
  - 音声対話のテキスト起こし

#### **ASR (Automatic Speech Recognition)**
- **定義**: 機械が音声を自動的に認識し理解する技術を総称する、より幅広い用語。
- **焦点**: テキスト転写を超えて、意味、文脈、話者の特徴など音声の複雑な側面を解析を含みます。
- **使用例**:
  - 音声の意味分析のための解釈
  - より強力な相互作用のための文脈認識
  - 話者識別と属性分析

### **用語の発展**
- **技術進歩**: 音声認識技術が単なる転写を超えて音声の複雑な側面を理解するように進化したにつれて、ASRという用語がより重要になりました。
- **幅広い応用**: 音声による操作を中心としたデバイスやシステムが増えるにつれて、ASRはより強調される用語となっています。

### **結論**
- ASRはSTTの進化した形であり、音声認識技術のより複雑な能力を反映しています。
- STTはASRの機能の一部と考えることができます。

## Gemini Pro
### STT と ASR の違いとは？

#### STTとは？

STT (Speech to Text) は、音声からテキストへの変換を意味する用語で、1950年代の音声認識技術の初期段階で使用されました。

STTは、音声認識技術のユーザーに好まれ、音声認識技術の機能をよりわかりやすく説明するために使用されます。

また、STTは、音声認識技術の製品名やサービス名に使用されることが多いです。

#### ASRとは？

ASR (Automatic Speech Recognition) は、音声自動認識を意味する用語で、音声認識技術が自動化されたことを強調しており、音声認識技術の開発者や研究者によって好まれる傾向があります。

ASRは、音声認識技術の開発者や研究者によって好まれ、音声認識技術の自動化された性質を強調するために使用されます。

### まとめ

STTとASRはどちらも音声認識技術を指す用語ですが、STTはユーザーによって好まれる傾向がある一方で、ASRは開発者や研究者によって好まれる傾向があります。

## Claude AIによる評価
Claude AIはコード書くには不向きですが、普通の文章を分析するのは得意で、なんでも答えてくれる親切なAIです。
```
Codeium/GPT4の解答はとても明確で理にかなっています。STTとASRの定義と違い、そしてASRという用語が登場した背景を詳しく説明しています。技術の進化と応用範囲の拡大がASRという呼称の登場につながったことが上手く示されています。

GPT-4turboの解答も同様にSTTとASRの違いを明確に定義づけています。用語の発展の経緯とASRがより複雑な音声認識能力を反映していることを適切に説明していると思います。

Gemini Proの解答は2つの用語の定義とユーザー層の違いに焦点を当てています。音声認識技術そのものよりも、用語が使用される文脈の違いを強調しているのがユニークです。

全体的に、3つの解答はそれぞれの角度からSTTとASRの違いを明確かつ適切に説明しており、高い評価に値する内容だと思います。特にCodeium/GPT4とGPT-4turboの技術面からの記述が秀逸だと感じました。
```
普段のおしごと

最近設計したクラウドサービスの AWS リソースの配置図です。

![aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2210265/5041cce8-1f1f-635d-d4b7-6d1d4a7eb5d2.png)

後日、この設計を採用した詳細を書きます。
シェルスクリプトの書き方（ファイルへの出力）

# はじめに

超基本です。
業務でシェルスクリプトに触れる機会があったので、まとめました。

# 書き方

シェルスクリプトのファイル拡張子は「.sh」 になります。
以下ファイルの中身を書いていきます。

```test.sh
#!/bin/sh

echo "ohayo" 
```

シェルスクリプトの結果をファイルに出力したい場合、「>」の後に出力したいファイル名を記載すればできます。

test.shスクリプトファイルの内容をsh.txtファイルに出力したい場合は以下のように書きます。

```tesh.sh
#!/bin/sh

echo "ohayo" > sh.txt
```

違うフォルダにあるファイルに出力したい場合はフォルダのパスを記載すればOKです。


# 日付をファイル名に入れる
ファイル名に日付を加える場合は以下のように記載します。

```
echo "ohayo" > $(date +"%Y%m%d%H").txt
```
MIMEを扱うよ、"Mime"

[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の19日目の記事です。


## MIMEを扱うよ、"Mime"

[Mime](https://symfony.com/doc/current/components/mime.html)は、MIMEを扱うためのコンポーネントです。

### インストール

```shell
composer require symfony/mime
```

### 使い方 その１

```php
use Symfony\Component\Mime\Email;

$email = new Email();
$email
    ->from('info@qiita.com')
    ->to('test@qiita.com')
    ->subject('テストメール')
    ->priority(Email::PRIORITY_HIGH)
    ->attachFromPath('/var/www/', 'hoge.png', 'image/png')
    ->text("お元気ですか？")
    ->html('<h1>お元気ですか？</h1>');
```

Mimeの使い方その１は、メールデータを作ることです。`Email`オブジェクトを作って、それぞれの項目に合わせたメソッドを呼ぶことでメールデータが作成できます。

> [MIME（Multipurpose Internet Mail Extensions）](https://e-words.jp/w/MIME.html)とは、TCP/IPネットワーク上でやり取りする電子メールで、当初の規格で唯一記載することができたASCII英数字以外のデータ（各国語の文字、添付ファイルなど）を取り扱うことができるようにする拡張仕様。

なので、この仕様に則ったメールデータが作れます。

:::note
メールを送るには[Mailer](https://qiita.com/ippey_s/items/f082a0d676220e261204)コンポーネントが必要です。
:::

:::note warn
メールアドレスのバリデーションとして、`equlias/email-validator`が必要になる場合があります。

```shell
composer require egulias/email-validator
```
:::

### 使い方 その２

使い方その２は、『MIMEタイプ』も扱うことです。MIMEタイプから拡張子、ファイル内容からMIMEタイプを取得（推測）することができます。

```php
use Symfony\Component\Mime\MimeTypes;

$mimeTypes = new MimeTypes();

// MIMEタイプから拡張子を取得
$extensions = $mimeTypes->getExtension('image/png'); // ['png']

// ファイルからMIMEタイプを推測
$mimeType = $mimeTypes->guessMimeType('/var/www/hoge.gif'); // 'image/gif
```

## まとめ

今回は`MIME`でした。ファイルアップロードなどの処理でMIMEタイプ判断したりなどファイルを扱う時にも使いますが、実はメールの作成でも役立ってるコンポーネントというのは知りませんでした。
Vitest 1系がリリースされたので0系からマイグレーションしてみた

# はじめに
2023年12月5日にVitest v1.0.0 がリリースされました。

https://github.com/vitest-dev/vitest/releases/tag/v1.0.0

それまで自分は0系を利用していたので、こちらのガイドを参考にマイグレーションしてみます。

https://vitest.dev/guide/migration.html#migrating-from-vitest-0-34-6


# 開発環境
マイグレーション前の開発環境は以下の通りです。

- Windows11
- VSCode
- TypeScript 4.9.5
- React 18.2.0
- yarn 1.22.19
- Node.js 20.5.0
- Vite 4.1.5
- Vitest 0.34.6
- @testing-library/react 14.0.0
- jsdom 22.1.0

また、Vitest 及び React Testing Library を利用した自動テストが正常に動作していることをマイグレーション前に確認しています。

# マイグレーション
Vitest の1系を利用する前提条件は以下の通りです（2023年12月時点）。

- Node.js 18以上
- Vite 5.0
- ```@vitest/*``` サブパッケージが Vitest 1.0

そのため、条件を満たすために Vite と Vitest のバージョンを上げます。
今回は yarn を使っているので、```yarn upgrade``` でバージョンを上げます。

https://chore-update--yarnpkg.netlify.app/ja/docs/cli/upgrade

また、それぞれバージョンを上げた後、自動テストが正常に動作するか確認します。

```powershell
yarn upgrade vite@5.0.10
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/bffe9e26-f5be-75f6-c579-54d11b6a5d80.png)

```powershell
yarn upgrade vitest@1.0.4
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/631193bb-075a-f4e6-0461-9338ae1b1743.png)

自分が書いていたテストの範囲内ではこれだけで Vitest 1系が利用できるようになりました。

ただ、以下の内容がテストに含まれている場合、それぞれ対応が必要になりそうです。

- スナップショットテスト（```toMatchSnapshot```）のときの引用の記載方法
- テストのオプション設定
- カバレッジの設定
- モックの型
- タイマーのモック

# まとめ
そこまで自分が複雑なテストを書いていなかったということもありますが、思ったよりずっと簡単にマイグレーションできました。
1系になったので、今までより安心して利用できますね。

# 参考
- [Migration Guide](https://vitest.dev/guide/migration.html#migrating-from-vitest-0-34-6)
Azure Functions の http routePrefix を host.json はそのまま環境変数で変更してみた

Azure Functions の Http Trigger は、デフォルトで api という routePrefix が付きます。これを、host.json を変更せずに、Azure Functions の環境変数に設定して、routePrefix を変更してみました。

## 検証用 Azure Functions を用意

```bash:bash
prefix=mnrfunc
region=japaneast

az group create \
  --name ${prefix}-rg \
  --location $region

az storage account create \
  --name ${prefix}stor \
  --resource-group ${prefix}-rg \
  --sku Standard_LRS

az functionapp create \
  --name ${prefix} \
  --resource-group ${prefix}-rg \
  --consumption-plan-location $region \
  --runtime dotnet \
  --functions-version 4 \
  --storage-account ${prefix}stor \
  --disable-app-insights \
  --https-only \
  --os-type Linux

func init $prefix --dotnet

cd $prefix

func new --name httpsample --template "HTTP trigger" --authlevel "anonymous"

func azure functionapp publish $prefix
```

## routePrefix 変更前の動作確認

```bash:bash
$ curl https://$prefix.azurewebsites.net/api/httpsample

This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.
```

## 環境変数に routePrefix を prod に設定

```bash:bash
az webapp config appsettings set \
  --name ${prefix} \
  --resource-group ${prefix}-rg \
  --settings AzureFunctionsJobHost__extensions__http__routePrefix=prod
```

## routePrefix 変更後の動作確認

```bash:bash
$ curl -I https://$prefix.azurewebsites.net/api/httpsample

HTTP/2 404 
date: Fri, 15 Dec 2023 23:39:44 GMT
server: Kestrel

$ curl https://$prefix.azurewebsites.net/prod/httpsample

This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.
```

## （参考） host.json で routePrefix を設定する場合

```json:host.json
{
    "version": "2.0",
    "logging": {
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "excludedTypes": "Request"
            }
        }
    },
    "extensions": {
        "http": {
            "routePrefix": "prod"
        }
    }
}
```

## 参考情報

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-http-webhook?tabs=isolated-process%2Cfunctionsv2&pivots=programming-language-csharp#hostjson-settings

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-host-json#override-hostjson-values
【初心者向け】コンパイル？リンク？ビルド？それってなんなんだ！を解決したい

この記事は [Happiness Chain Advent Calendar 2023](https://adventar.org/calendars/9414) 16 日目の記事です。

## はじめに
この記事は、ソースコードを書いたあと、プログラムが動く状態になるまでを簡単にまとめた記事です。以下の方向けに書いています。

- コンパイル、リンク、ビルド、デプロイがよくわからない
- ソースコードを書いたあと、どうやってプログラムが動いているか理解できていない

コンパイル＝ビルドじゃない？と思っていた時期もありました。同じような方がいるんじゃないかと思ったのでそんな方に参考になれば幸いです。

## 前提として
この記事の内容はコンパイル方式の言語を想定して書いています！
インタプリタ方式で実行される言語についてはコンパイルが不要であり、流れが異なります。

## 書いたソースコードを動かすために必要なこと

まず第一に、当たり前ですが自分が書いたソースコードはそのまま放置していても勝手に動き始めるわけではありません。
なので動く状態にするところからはじめていきます。

簡単に、動かすまでの流れは以下の作業が必要になります。

1. コンパイル
2. リンク
3. デプロイ

ビルドがない、、、？と思った方もいるかもしれません。理由は後ほどわかります。
順を追って説明していきます。

## コンパイルとは

プログラミング言語にもよりますが、高級言語などの場合は、コンピュータが理解できる言語と人間が理解できる言語のどちらに近いかというと後者にあたります。

そのため、書いたソースコードのままだと、コンピュータは理解できず、動かせません。コンピュータが理解できる言語（機械語）に変換する必要があります。
そして機械語に変換されたものは、オブジェクトコードと呼ばれます。

一言でまとめると、

**コンパイルは、ソースコードをオブジェクトコードに変換する作業です。**

## リンクとは

コンパイルが終わった時点では、オブジェクトコードに変換された状態で、まだプログラムとしては実行できません。

なぜならオブジェクトコードそれぞれがバラバラな状態になっているからです。プログラムとして実行させるためには、実行ファイルとして一つのまとまりにしなければなりません。

リンクは、実行ファイルを生成する役割を持っています。

一言でまとめると、

**リンクは、オブジェクトコードから実行ファイルを生成する作業です。**

## ビルドとは
ビルドは、コンパイルとリンクをまとめた一連の流れのことです。
なのでビルド＝コンパイル、ではなく、

**ビルド＝コンパイル＋リンク　と考えればOKです。**

## デプロイとは

ビルドまで完了していると、実行ファイルが出来上がっている状態になります。そのため、プログラムとしては動く状態にはなっています。

ただWebアプリケーションなどは、これでは足りません。
Webサーバにプログラムの実行ファイルを配置し、利用できる状態にします。

この作業がデプロイです。

## 最後に
簡単にまとめましたので、より詳しい動きを知りたい方は、書籍などで理解を深めることをお勧めします。
WindowsTerminalのalt+enterのfull screen機能を外す

# 背景

Scoopで[broot](https://github.com/Canop/broot)を入れたら、alt+enterの機能が被った。

# 対策

WindowsTerminal特有ののalt+enterのショートカットを外した。

# やり方

1\. WindowsTerminalのJSONファイルを開く（左下）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285482/7a18a812-0138-ec1c-d495-32435ed01698.png)

2\.  "actions":のところに `{"command": "unbound", "keys": "alt+enter" },`を追記。

```json
{
    "actions": 
    [
        {
            "command": 
            {
                "action": "copy",
                "singleLine": false
            },
            "keys": "ctrl+c"
        },
        {
            "command": "paste",
            "keys": "ctrl+v"
        },
        {
            "command": "find",
            "keys": "ctrl+shift+f"
        },
        {
            "command": "unbound",
            "keys": "alt+enter"
        },
        {
            "command": 
            {
                "action": "splitPane",
                "split": "auto",
                "splitMode": "duplicate"
            },
            "keys": "alt+shift+d"
        }
    ]
```

# 参考

- https://learn.microsoft.com/ja-jp/windows/terminal/customize-settings/actions
- https://github.com/microsoft/terminal/issues/7035
AstroでPWAを作るときに便利な２つのパッケージ

Astroは自由度が高いので、パッケージを使わずにPWAを作ることができるんだけど、せっかくコミュニティーでパッケージが作られているので、利用しちゃいましょう！

以下のパッケージをインストールして、設定を済めせたらすぐにPWA対応することができます。
[Astro Service Worker](https://github.com/tatethurston/astrojs-service-worker#readme)
[astro-webmanifest](https://github.com/alextim/astro-lib/tree/main/packages/astro-webmanifest#readme)

## Astro Service Worker
こちらはService Workerの作成と登録を自動化してくれるパッケージ。
`npm install astrojs-service-worker`でインストールして、下記のようにastro.config.mjsファイルを設定する。
```js
import { defineConfig } from "astro/config";
import serviceWorker from "astrojs-service-worker";

export default defineConfig({
 integrations: [serviceWorker()],
});
```

## astro-webmanifest
こちらはwebmanifestrの作成と登録を自動化してくれるパッケージ。
`npx astro add astro-webmanifest`でパッケージをインストールしたら、astro.config.mjsファイルを下記のように設定してください。
```js
import { defineConfig } from 'astro/config';
import webmanifest from 'astro-webmanifest';

export default defineConfig({
  // ...
  integrations: [
    webmanifest({
      /**
       * 必須
       **/
      name: 'アプリ名',

      /**
       * 任意
       **/
      icon: 'src/images/your-icon.svg', // ファビコン＆アイコンのソース

      short_name: 'App', // ホーム画面で表示される名前
      description: 'アプリの説明',
      start_url: '/',
      theme_color: '#3367D6', // 通知バーの色
      background_color: '#3367D6', // 起動時の背景色
      display: 'standalone', // 
    }),
  ],
});
```

最終的にこんな感じの設定になります。
```js
import { defineConfig } from 'astro/config';
import serviceWorker from "astrojs-service-worker";
import webmanifest from "astro-webmanifest";

export default defineConfig({
  integrations: [
    serviceWorker(),
    webmanifest({
      name: 'おみくじ',
      icon: 'src/images/icon.png',
      short_name: 'おみくじ',
      description: 'おみくじ',
      start_url: 'https://test.com/',
      theme_color: '#f4f4ff',
      background_color: '#f4f4ff',
      display: "standalone",
    })
  ],
});
```

たったこれだけでPWA化できるので是非試してみて！
感謝謙虚前向きに！

:::note info
この記事はJAWS-UG（AWS Users Group – Japan） Advent Calendar 2023の12月16日の投稿です。
:::
https://qiita.com/advent-calendar/2023/jaws-ug

2023年もあとわずかとなりました。今年はどんな年だったでしょうか。今年を振り返ると、まさに「感謝謙虚前向き」の姿勢と気持ちがいろいろな形で出てきた年でした。それらをご紹介したいと思います。

# AWSJ社内のコミュニティ支援
ユーザーコミュニティの支援については自分のような立場であれば仕事として対応していますが、AWSJの社員全員が仕事として対応できるわけではありません。出張(宿泊)が伴う勉強会への登壇を仕事として承認してもらうために、お客様訪問を合わせて行なうなどの対応をしてもらうケースもあります。
現在、登壇依頼がJAWS-UGの支部から私にきた場合は、社内Slackにあるユーザーコミュニティ支援チャンネルに紹介し対応できる社員を募集します。現在このチャンネルには180名弱の社員が参加しており、そのモチベーションはボランティアです。アマゾンにはOLPと呼ばれる信条があり、一番最初にくる「Customer Obsession」があります。多くの社員はこのCustomer Obsessionによりユーザーグループ、コミュニティへの支援をボランティアで行なってくれています。
昨年から今年にかけてコロナ禍空けで対面の地域勉強会も活発にリブートが始り、出張を伴う登壇依頼が増え、かつ、私自身のスケジュールでも複数の支部勉強会開催が重なることが多くなりました。この状況において、JAWS-UGをはじめとするユーザーコミュニティの社員によるサポートが継続できていることは本当に感謝しかありません。

https://jobs-us-east.amazon.com/content/jp/our-workplace/leadership-principles

# オンライン配信を手伝ってくれる「配信部」爆誕
ユーザー勉強会のオンライン配信支援は、2020年のコロナ禍において配信の経験・知識がない支部の運営の負担を減らし、勉強会を継続してもらうために私が個人ではじめたものでした。オンライン勉強会開催の機運も高まり、オンラインでは参加上限もないおかげで2021年は過去最大の延べ26,124名の方々にお申込みいただけました。その後オンライン疲れ、ハイブリッド・オフライン勉強会への回帰がありますが、継続してオンライン勉強会とハイブリッド勉強会が開催されています。特にJAWS-UGの専門支部はオンラインまたはハイブリッド勉強会で全国各地のユーザーの参加機会を提供し、地域支部は対面による身近なネットワーキングを提供する特色が色濃くなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636169/502ce4f4-bf3d-6c15-b335-39f965221f34.png)

そうなると私だけがオンライン配信サポートしている「SPOF」化が問題となってきました。もちろん病気や怪我による心配もありますが、それよりも活発な勉強会開催による「沼口のスケジュール調整」が難しくなってきていました。事実、そのタイミングで東京支部ランチ会のオンライン配信サポートをみのるんさんから提案されたのですが、さすがに頻繁・定期的に行なうことが見えていたので、みのるんさんに「スキトラはするので、ご自身で配信してほしい」をお願いしました。

同じころにSecurity-JAWSから2日間のハイブリッド勉強会の開催提案があり、配信支援の依頼がありましたが、2日間を一人で（！！）やるのは無理と正直に言いました。そこで配信に興味があるといっていた前原さんに配信サポートに入ってもらい、Security-JAWSメンバーと体制を組んで行ないました。その後、榊原さん、加藤さんといった方々が参加表明され、配信部として支部のオンライン配信を支援する体制を現在構築しています。

配信部ではこの記事のタイトルの「感謝謙虚前向き」にをタグラインにように使っています。

https://suzuri.jp/yktAWS/products?utm_source=twitter&utm_medium=social&utm_campaign=share_shop_dialog

みなさんにはいろいろな想いがあるでしょうが、結果的に沼口のSPOF化を回避し、より柔軟にJAWS-UGの勉強会の開催を実現する、スケールする体制をJAWS-UGの中で有志が集ってつくってもらえることは、まさにコミュニティの強さであり、感謝しかありません。謙虚にして、前向きに考えていると、こうやって人が集ってくるのですね。

# 今年もすばらしい実績を残していただけそうです

実際のところXでハッシュタグ「#感謝謙虚前向き」に！と投稿しているときは、なんらかの事案などがあって「ぐぬぬぬ」となっている時です（笑)。そこで愚痴のひとつも言いたくなるところですが、ソーシャルで愚痴をいったところでなにも解決しない、その愚痴を見た人まで気分が悪くなるわけですから、それらを飲み込んで、感謝・謙虚・前向きに行こう！と自らに言っているんです。

https://twitter.com/numaguchi/status/1721433476472406299

多くのAWSの社員のみなさま、配信部のJAWS-UGのみなさま、各支部の運営のみなさま、そしてJAWS-UG事務局のメンバーのみなさまのおかげで、今年のJAWS-UG(+AWS Startup Community, Amplify Japan User Group含む）の活動は順調に伸びており、多くのユーザーの参加機会を提供していただけました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636169/49f0a4b1-6d2d-723a-72ed-3bf79dafb324.png)

地域支部のリブートが相次ぎ、かつ継続した開催を行なっていただいているので、勉強会・イベント開催回数は457回となりそうです。申込み人数においても今年JAWS DAYSがなかったにもかかわらず、昨年を超える22,548人になります。もちろん勉強会を企画してくれる支部運営メンバーの高いモチベーションがコアにありますが、各勉強会の登壇依頼へAWSJ社員が対応いただくことで地域の勉強会を支えてもらい、専門支部のオンライン配信のサポート依頼に対しては配信部のメンバーが対応することで開催回数を減らすことなく、多くの方に申込み・参加いただける環境をつくっています。

# おわりに
感謝・謙虚・前向きに、という姿勢から、さまざま人の共感をえて、仲間があつまってくれているのは本当に、ここでも感謝しかありません。みなさまに支えられた2023年でした。ありがとうございました。来年もよろしくお願いします。
SharePoint のドキュメントライブラリでPower Apps Formを活用して、フォルダ内のファイルにアクセスする

# はじめに

SharePointのリスト フォームのカスタマイズでPower Appsの機能が利用できます。

[前回の記事はこちら。](https://qiita.com/DEmodoriGatsuO/items/0dc2159648399290621a)

https://qiita.com/DEmodoriGatsuO/items/0dc2159648399290621a

ドキュメント ライブラリも同様にPower Appsでカスタマイズできます。
基本的にEdit（編集・閲覧）を目的にした機能に思えますが、
個人的には`Power Appsから開くことによってSharePointのドキュメントライブラリから`
気軽にPower Automateが使えるのでは？？という仮説のもと、小技を日々試しています。

## SharePointのドキュメントライブラリのプロパティで活用する

前述のとおり、ドキュメントライブラリのプロパティをPower Appsで見ることができます。
```
見ることができる = 値を取得することができる
```
ですね。

どのような値が取得できるか、リストアップしてみましょう。

### SharePointIntegrationによって取得できる値

選択したファイル or フォルダーの下記の事項が取得できます。

|値|モード|コメント
|---|---|---
|ID|表示専用|SharePoint ドキュメントライブラリのID
|名前|編集可能|ファイル・フォルダの名前
|コメント|表示専用|-    
|アイテムへのリンク|表示専用|便利！
|ウィンドウ開始のトークンのトリガー|表示専用|-
|ウィンドウ終了のトークンのトリガー|表示専用|-
|コンテンツの承認状態|表示専用|-
|コンプライアンス資産ID|表示専用|-
|サムネイル|表示専用|イメージコントロールで表示可能
|タイトル|表示専用|-
|チェックアウト先|表示専用|-
|チェックアウト済|表示専用|-
|バージョン番号|表示専用|-
|フォルダーのパス|表示専用|-
|完全パス|表示専用|-
|拡張子付きのファイル名|表示専用|-
|更新日時|表示専用|-
|更新者|表示専用|-
|登録日時|表示専用|-
|登録者|表示専用|-
|秘密度|表示専用|-
|色タグ|表示専用|-
|説明|表示専用|-
|識別子|表示専用|-

上記に加えて`メタデータ`が編集可能。
Power Automateにおける`プロパティの取得`をここで完結できているという解釈もできます。

`ID`や`完全パス`、`識別子`がわかっている時点で**シンプルなPower Automate**でも小技が仕込めそうです。
使っている小技を紹介させてください。

## フォルダのプロパティを見ながらフォルダ内のファイルを開きたい
Power Appsでフォームを作る際の弱点として、**起動が遅い**という点が挙げられます。

短気な人は100%我慢できません。
同時に一度プロパティを閉じて、フォルダ内のファイルを開きに行く、ということにも抵抗が生まれるかもしれません。

そんなときに下記のようなフローを活かしてみましょう！

### フロー

![qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/67b54666-46da-5a48-3d5b-0d360c04aab3.gif)

1. Power Apps V2
1. 変数を初期化する - 配列
1. フォルダー内のファイルを取得する
1. ファイル名とリンクをオブジェクトに格納する
1. 配列変数に追加する
1. Power Appsに戻す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/1e2bed11-1353-e8a8-efa7-6aec43447c8f.png)

### Power Apps側
Power Automateの起動に、選択したフォルダの`完全パス`を渡します。
Formの中で`ThisItem.完全パス`で、値を操作できるのはやはり手軽。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/99f22549-a481-86c6-60dc-40eaf488c47c.png)

```
UpdateContext({_json:ドキュメントライブラリの情報をJSONで取得する.Run(ThisItem.'完全パス ').value});
```

Power AppsでPower Automateの戻り値を受け取る際、`ParseJSON`という関数を使います。
一癖ある関数ですが、[コルネさんのブログ](https://koruneko.hatenablog.com/entry/2022/09/07/195521)で学びましたので参考までにどうぞ。

https://koruneko.hatenablog.com/entry/2022/09/07/195521

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-parsejson


Power Automateの戻り値を受け取り、
```
Table(ParseJson(_json))
```

としてPower Appsのテーブル型のデータにします。

垂直ギャラリーにモダンコントロールのハイパーリンクを仕込んでみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/66873c0d-8e5d-04db-b675-5675a06f730d.png)

これによる利点があるのか・・？という点を感じそうですが、列挙してみましょう
- フォルダのプロパティで承認・否認を管理する
    - ドキュメントセットでも良さそうですが、フォルダ単位で複数のファイルの確からしさをチェックするときに、承認フローの引数として、フォルダを使うことができそうです
    - 編集画面にそのまま飛べる
        - SharePointから開くことでOfficeファイルは気軽に開き、編集や操作が可能
        - メタデータを参照しながらコメントや、何の申請に対して操作をしているのか、目視できる

## やり過ぎにはご注意
ドキュメントライブラリにおけるフォルダのメタデータの操作画面としても重宝しますが、一方でFormで内部のCardを活用すれば、いくらでも下にスクロールできる魔改造が出来てしまいます。

本来的にはSharePointのアイテムのプロパティを見る機能が、魔改造されきった化け物になることは誰も望まないでしょう。

**活用シーンに合わせて利用してみてください！**
Ruby芸160チャレンジ(#24)終了時の処理

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/24.md

```bash
$ trap 'rm ~/tmp/*' EXIT

# 別解
$ echo 'rm ~/tmp/*' >> ~/.bash_logout
```

これは元の`trap`を使うのが鮮やかですね…。

## 解
シェル終了時の処理を定めるなら`~/.bash_logout'に処理を書き込むしかないですかね…？

```ruby
File.open(File.expand_path('~/.bash_logout'), 'a') do |f|
  f.puts('rm ~/tmp/*')
end
```

または、スクリプトの終了時の処理を定めるならこんな感じ…？

```ruby
at_exit do
  system('rm ~/tmp/*')
end
```

## 所感
- ホームディレクトリ(`~`)の展開を勝手にしてくれないのは意外
- システムコマンドの実行は`system`でできるんですね
GASとGoogleスライドとスプレッドシートで作る席替えシステム

# ドキドキ！あの子の隣に座るのだぁれ？
はい、今日もGAS書いていきますね。
今日のお題はスライドとスプレッドシートの基本的な連携ですね。

# スライドのテキストボックスにいちいちテキスト書くの面倒くさい・・・。

そうですよね、（そうでもない？）てなわけで、スプレッドシートに書いたテキストがスライドに反映されるGAS書いていきましょう。

# まずはスプレッドシートに1列に名前を書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/657d8adb-2f0b-a513-a041-fea671c4d253.png)


# 次に、スライドに人数分のテキストボックスを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/f6b1a57a-a72a-beaa-56a2-547fef70901c.png)


# スライドにコンテナバインドスクリプトを書きます。

```javascript
// コンテナバインドスクリプト

const SPREADSHEET_URL = 'ここにスプレッドシートのURL入れてね'; // あなたのスプレッドシートのURLに変更してください

function onOpen() {
  const ui = SlidesApp.getUi();
  ui.createMenu('カスタムメニュー')
    .addItem('スライドを更新', 'updateSlideTextBoxes')
    .addToUi();
}

function updateSlideTextBoxes() {
  // スプレッドシートのデータを読み取る
  const spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  const sheet = spreadsheet.getSheetByName('氏名を書いているシート名を入れてね'); // あなたのシート名に変更してください
  const dataRange = sheet.getDataRange();
  const names = dataRange.getValues();

// 氏名をランダムに並び替える
  names.sort(() => Math.random() - 0.5);

// アクティブなスライドを取得する
  const presentation = SlidesApp.getActivePresentation();
  const slides = presentation.getSlides();

// スライド内のテキストボックスに名前を反映させる
  for (let i = 0; i < slides.length; i++) {
    const slide = slides[i];
    const pageElements = slide.getPageElements();

for (let j = 0; j < names.length; j++) {
      const textbox = pageElements[j]; // 各テキストボックス

if (textbox) {
        textbox.asShape().getText().setText(names[j][0]);
      }
    }
  }
}
```

これでメニューからスライドを更新できます。


並びが変わった！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/061a82f2-b67a-39fa-03a3-0659c3a791ea.png)


時間でトリガーつけて、フリーデスクの席割りやらレクリエーションやらにお使いくださいね。
PostgreSQLの使用例

<font color="Grey">*[Use cases for PostgreSQL®](https://aiven.io/blog/use-cases-for-postgresql)の翻訳です。*</font>

2022年4月1日

# PostgreSQL® の使用例

PostgreSQL®はデータに関わる様々なユースケースに最適です。Aivenのお客様がデータアーキテクチャの一部としてPostgreSQLをどのように活用しているかをご覧ください。

[db-engines](https://db-engines.com/en/ranking)のランキングによると、PostgreSQLは4番目に人気のあるデータベース管理システム（そして最も人気のあるオープンソースDBMS）です。


今日、企業ユーザに加え、多くのサードパーティベンダ、コンサルタント会社、独立系グループがPostgreSQLから製品を派生させ、相談し、サポートし、補助的な機能拡張を提供しています。人工知能（AI）や機械学習（ML）との統合、多くのクラウド版、ハードウェア最適化版などもあります。


PostgreSQLを使用している業界は、コンピュータソフトウェア業界が圧倒的に多く、情報技術やサービスがそれに続きます。その他の業界としては、病院や医療、高等教育、金融サービス、電気通信、教育、マーケティング、広告などがあります。FBIを含む政府機関もユーザです。


Aiven for PostgreSQLをビジネスクリティカルなシステムで効果的に使用している企業をご紹介します。


カスタマーサクセス企業である[Catalyst](https://aiven.io/case-studies/a-customer-success-story)は、顧客データの保存にAiven for PostgreSQLを使用しています。


[NetSpyGlass](https://aiven.io/case-studies/aiven-cloud-helps-netspyglass)はTerraformを使ってPostgreSQLとApache Kafkaをプロビジョニングし、顧客にネットワーク監視自動化ソリューションを提供している。


[Norauto](https://aiven.io/case-studies/norauto-developers-spin-up-databases-faster-than-ever-with-aiven)は自動車小売企業で、多くのオープンソースツール、中でもAiven for PostgreSQLを使って顧客のために様々なデジタルサービスを運営している。


[Ometria](https://aiven.io/case-studies/aiven-for-postgresql-helps-ometria)は、パーソナライズされたクロスチャネルマーケティング体験を推進するための顧客インサイトを提供するためにPostgreSQLを使用しています。


[OVO Energy](https://aiven.io/case-studies/aiven-for-apache-kafka-helps-ovo) は、二酸化炭素排出量を削減するために高度なデータソリューションを使用しています。


[Spare](https://aiven.io/case-studies/aiven-for-postgresql-helps-spare)のオンデマンド輸送サービスは、Aiven for PostgreSQLで稼働しています。


PostgreSQLの詳細については、Aivenブログの[PostgreSQLとは](https://aiven.io/blog/an-introduction-to-postgresql)をご覧ください。または、Aivenの<https://console.aiven.io/signup>からPostgreSQLのトライアルにお申し込みください！


## さらに読む


* (Postgre)[SQLの概念と用語](https://aiven.io/blog/postgresql-concepts-and-terms)
* リモート読み取りレプリカ - 何を、なぜ、[どのように](https://aiven.io/blog/postgresql-remote-read-replica)
* [PostgreSQL®のJSON関数を使用してインドのレストランのレビューをナビゲートする](https://aiven.io/blog/pg-json-indian-restaurants)
* [PostgreSQL®の読み取り専用レプリケーションのためのAiven](https://aiven.io/blog/aiven-postgresql-read-only-replicas)
* [PostgreSQL®のコネクションプーリング](https://aiven.io/blog/aiven-postgresql-connection-pooling)
BottomNavigationBarの背景色が突然白くなる

この記事は海洋大技術系サークル Advent Calendar 2023の4日目です。
## はじめに
こんにちは！
そろそろクリスマスが近づいてきましたね。皆さんのクリスマスのご予定は？
お前はどうなんだって？そりゃ予定ありますよ！！！　　

バイトのね。。。。


今月のおすすめ曲は、これだ！！！！！
クリスマス・イブ / 山下達郎

そんなことはどうでもよくて、

この記事は、私と同じ状況下に立たされた人の少しでも助けとなればと思いこの記事を書いました。

## 今回起きた問題
![スクリーンショット 2023-12-16 6.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502812/b2e670db-9a62-63ae-273a-533410fc7bc2.png)
背景色が元々黒だったBottomNavigationBarが
↓
![スクリーンショット 2023-12-16 6.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502812/9b5506af-6a62-f85e-23d6-35d016314f2d.png)
このように突然背景色がいきなり白くなった！

最近Androidのリリース周りをいじっていて、iOSに変な影響が出てしまったのか？！と思っていたが、全く関係ありませんでした。


## 原因
原因は、BottomNavigationBarのBottomNavigationBarItemを３つから４つに増やしたことが原因です。

BottomNavigationBarTypeプロパティには主に、fixed,shiftingの２つの値があります。

fixedとは→
これはデフォルトのタイプで、ボトムナビゲーションバーのアイテム数が3つ以下の時に適しています。
すべてのアイテムは同じサイズで表示されます。
アイテムがアクティブでない場合でも、アイコンとテキストが表示されます。

shiftingとは→
このタイプは、アイテム数が4つ以上の場合に適しています。
アクティブなアイテムはより大きく表示され、他のアイテムより目立ちます。
非アクティブなアイテムはアイコンのみを表示し、テキストは非表示になります。

**BottomNavigationBarItemを３つから４つにした時に強制的に、typeがfixedからshiftingに変化してしまいます。**

元々３つだったBottomNavigationBarItemをその他画面を作るために４つにした時に、変化してしまったのですね。
## 解決策
 ```
 type: BottomNavigationBarType.fixed,
 ```
 を入れればtypeがfixedになるので、解決します。
 
 ```
 final bar =BottomNavigationBar(
      type: BottomNavigationBarType.fixed,←これ
      items:items,
      backgroundColor: Color.fromARGB(255, 7, 7, 8),
      selectedItemColor: Color.fromARGB(255, 10, 6, 248),
      unselectedItemColor: Color.fromARGB(255, 247, 246, 246),
      currentIndex: index,
      onTap: (index){
        ref.read(indexProvider.notifier).state=index;
      },
    );
```
↑私の場合
## まとめ
ちゃんとBottomNavigationBarを理解していなかった自分にとっては、とてもいい勉強になりました。

ここまでお疲れ様でした。