OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Bedrockの活用例：Llama 2 Chat 13Bを使ったサンプルアプリケーション

本記事は [Amazon Bedrock Advent Calendar 2023 by ナレコム](https://qiita.com/advent-calendar/2023/bedrock-knowledgecommunication) の16日目の記事です。

Amazon Bedrock Advent Calendar 2023 by ナレコム ではAmazon Bedrockの基本的な概要から具体的な各モデルの作り方や事例紹介などを行っていきます。

### はじめに

Amazon Bedrockは多くのサンプルアプリケーションを提供し、ユーザーがPlayground上で実際に試すことができるように設計されています。

今回は2023年12月現在33個公開されているExamplesの内、 **Llama 2 Chat 13B** を使った3つを紹介します。記事では、これらの例のプロンプトとレスポンスをわかりやすく日本語で紹介します。

Llama 2 Chat 70Bと13Bの違いは以下のようになっており、基本的には13Bがベースとなっている様です。

| モデル名                          | 概要・特徴 |
|-----------------------------------|------------|
| Llama 2 Chat 13B (Meta)           | 対話型のテキスト生成に特化したモデル。自然な会話スタイルのテキスト生成が可能。 |
| Llama 2 Chat 70B (Meta)           | Llama 2 Chat 13Bの大規模版。より複雑な対話と内容生成に対応。 |

**記事はわかりやすさを優先してプロンプトやレスポンスを日本語にしておりますが、2023年12月時点ではLlama 2は基本的に英語でのみ動作します。**

※日本語でも稀に動作することもあります。

### 例１）思考の連鎖
思考の連鎖を使ったプロンプトの例

:::note info
**プロンプト**

あなたは並外れた批判的思考（クリティカル・シンキング）を持つ非常に知的なボットです

私は市場に行ってリンゴを10個買いました。あなたの友人に2個、ヘルパーに2個あげました。その後、さらに5個のリンゴを買い、1個を食べました。何個のリンゴが残ったでしょう？

ステップ・バイ・ステップで考えよう。
:::

:::note warn
**レスポンス**
まず、リンゴを10個買った。

次に、2個のリンゴをお友達にあげたので、10 - 2 = 8個のリンゴが残っています。

次に、ヘルパーさんにリンゴを2個あげたので、残り8個-2個＝6個。

その後、リンゴを5個買い足したので、残り6個＋5個＝11個。

最後にリンゴを1個食べたので、11 - 1 = 10個のリンゴが残った。

よって、私の手元には10個のリンゴが残る。
:::

### 例２）デバッグコード

コードをデバッグするプロンプトの例

:::note info
**プロンプト**

以下のコードの問題点を見つけなさい。理由を説明してください。
```
import torch
torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
def run_som_func(a, b)：
c = c*2
c=a+b
print(c)
return c ^ 2
```
前に参照された変数というエラーが出る。

:::

:::note warn
**レスポンス**
このコードの問題は、変数 `c` が定義される前に値が代入されていることです。

c = c*2 の行では、`c` は定義される前に値が代入されている。これは Python では許されないことで、 `VariableReferenceBeforeAssignment` というエラーが発生します。

この問題を解決するには、次のように `c` に値を代入する前に `c` を定義する必要があります：
```
def run_som_func(a, b)：
    c = 0
    c = c*2
    c = a + b
    print(c)
    return c ^ 2
```
この方法では、値が代入される前に `c` が定義され、エラーは回避される。
:::

### 例３）数ショット学習

数ショットの学習を示すプロンプトの例

:::note info
**プロンプト**

あなたは卓越した言語能力を持つ非常に知的なボットです
。
"lemurwhat"はタンザニア原産の毛むくじゃらの小動物です。"lemurwhat"を使った例文
使った例文：
私たちはアフリカを旅行していて、とてもかわいい"lemurwhat"を見た。

"cuteduddle"は素早く飛び跳ねることを意味します。"cuteduddle" を使った例文

例文は次のとおり：
:::

:::note warn
**レスポンス**
小さな女の子はキツネザルを見て大喜びで、"cuteduddle"を始めた。

お役に立てれば幸いです！他に質問があれば教えてください。
:::

Llama 2の特徴として「

」タグ内に役割を明確に与えて、その後に実行してもらう内容を記述することで的確な対応をしてくれます。

### まとめ

この記事では、Amazon Bedrockを通じて提供されるサンプルアプリケーション「Llama 2 Chat 13B」の使用例を3つ紹介しています。

各例は、「

」タグを使用して、Llama 2に明確な役割やコンテキストを与えることにより、具体的で有用な出力を得ることができることを示しています。
また、例では70Bモデルとの違いがわかりづらいですが13Bでは回答できないケースでも70Bモデルを利用することで回答を得ることが出来る事が多くありました。ただし、基本的には70Bモデルは13Bモデルがベースとなっており、基本的な動作は似ております。

https://qiita.com/akiraokusawa/items/222cc0727b8ac7e2c5fe

---

また、ナレッジコミュニケーションでは  **「[Musubite](https://recruiting.musubite-job.com/features/company/knowledge-communication)」** というエンジニア同士のカジュアルトークサービスを利用しています！この記事にあるような生成AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！

https://recruiting.musubite-job.com/features/company/knowledge-communication
Snykを使ってCDKで構築したインフラの脆弱性診断をやってみた

## 1.はじめに

スカラパートナーズAdventcalendar15日目担当です。気づけば折り返しも過ぎてしまいました。。。

今回はここ最近話題の脆弱性診断ツール**Snyk**でどうやらCDKで構築したインフラの脆弱性診断ができるということでやっていきます。

## 2.Snykとは

Snykは、私たちが書くCode,オープンソースの依存関係,コンテナイメージ,IaCの設定に潜むセキュリティにおける脆弱性を検知し、優先度づけし、修正できるプラットフォームです。大きく以下の4つのラインナップを機能として提供しています。

- Snyk Code
- Snyk Open Source
- Snyk Container
- Snyk IaC

また、さまざまな使い方をすることができるのも魅力の一つです。

- Web
    - 設定やissue,reportのフィルタリング、修正機能を提供
- CLI
    - 脆弱性スキャンをローカルマシンで実行したり、パイプラインに組み込んだりできる
- IDEs
    - 開発環境に埋め込める
- API
    - プログラム上でSnykと連携できる


## 3.各機能の簡単な概要と参考になる記事
下記今回のSnykアドカレを中心に各機能の概要掴むために、自分がみた記事を参考とさせていただきました。
|Snykの機能/観点  |概要  |参考記事  |
|---|---|---|
|Code  |開発者が書くコードの脆弱性を見るだけでなく、コードの修正方法のサンプルも合わせて提供  |[生成AIのセキュリティ脅威をSnykで防ぐ！](https://qiita.com/tajima_taso/items/541d8c65d9f23b594e97)|
|Open Source  |・オープンソースパッケージの依存関係に潜む脆弱性をみて、脆弱性への実用的な修正アドバイスを提供し、プルリクエストを自動作成する修正ワークフローをサポート。定期的な自動スキャン (デフォルトでは日次) を行い、新たな脆弱性が検知された場合に速やかに通知  |[SnykでOSSプロジェクトの脆弱性を調べてみる](https://qiita.com/kannkyo/items/44a60a140952d9daa746)  |
|Container |・コンテナイメージの脆弱性をみる。コンテナイメージのファイルシステムのスキャンにより、ベースイメージや、パッケージマネージャのマニフェストファイル、それ以外でインストールされたソフトウェアの脆弱性も検知・また、他のベースイメージとの比較もレポートすることで、より安全なコンテナイメージの作成をサポート。定期的な自動スキャン (デフォルトでは日次) を行い、新たな脆弱性が検知された場合に速やかに通知|[アプリの脆弱性もインフラの脆弱性もSnykで全部漏らさず対処しよう！](https://qiita.com/tajima_taso/items/964b661a3411c495eb92)
|**IaC(今回)** |・IaC に含まれる設定ミスを、クラウドプロバイダのベストプラクティスや CIS ベンチマーク、また Snyk による脅威モデルの調査結果などをもとにしてスキャン。Open Policy Agent を利用して、独自のカスタムルールを作ることも可能。実際にクラウドへのプロビジョニングをする前に IaC の設定ミスやセキュリティ上の問題の修正方法を確認。|[Snykを使用したIaC脆弱性診断をやってみた](https://qiita.com/duelist2020jp/items/11afd310460e3a0a0889)

## 4.実際にインフラコードの脆弱性検出してみる

今回は上記のSnyk IaCを利用してインフラコードの脆弱性検出をしてみます。

1.まずはじめに[公式サイト](https://docs.snyk.io/snyk-cli/install-or-update-the-snyk-cli)を参考にsnykをインストールしてください。

2.次にSnykのアカウント内で「設定ファイルの検知が有効化」されていることと、「該当のクラウドプロバイダーが提供するIaCサービスにチェックがついていること」を確認します。
![スクリーンショット 2023-12-15 1.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714305/cdb8cdac-c774-8a58-b2ea-8f8cb5668986.png)
今回、CDKのインフラコードの脆弱性検出をしたいので、AWSのCloudFormationにチェックがついていることを確認します。


3.自分が脆弱性チェックしたいCloudFormationスタックテンプレートをcdk CLIから生成します
```
cdk synth [該当のスタック] #cdk.out直下にjson形式のCFnテンプレートが吐き出される
```
4.いざ脆弱性診断
```
snyk iac test cdk.out/[該当のスタック].json
```
![スクリーンショット 2023-12-15 1.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714305/cd0f9edc-b81b-fe27-40cd-bae8d669619c.png)
こんな感じに大量の検出結果と、最後にSummaryが吐かれました。

一応、critical,highはないので、大丈夫そう？

念の為Medium,Lowの中をざっとみているとLowには「Load balancer is internet facing.」といった割と厳しめのものがある一方でMediumには「RDS automatic backup is disabled」といったような重要なものまでさまざまありました。

実はそれぞれのサービスポリシーに対するrate設定(Low~High)はSnykのアカウント側で自分で設定できます。なので組織のポリシーに従って「これはしっかり設定していた方がいいよね」というものはhighにあげる等、気づきやすくするのも良い取り組みだと思います。

![スクリーンショット 2023-12-15 1.48.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714305/51137468-08a3-00f5-f2ea-55b15f859a61.png)

## まとめ

今回、Snyk IaCを使用して自分がCDKで構成したインフラコードの脆弱性診断をしていきました。脆弱性もそうですが、シンプルな設定ミスなどかなり広範かつ、重要な点を検知してくれて非常に助かりました。

皆さんも自分の書いたインフラコードの設定ミス、脆弱性等をSnykで確認することをお勧めします。
数学する身体と読書感想

### メインの主張

- 人類にとって計算したり数えたりする行為はもともとは、具体的な身体行為だった。
- その営みが発展するに連れて、数学という学問になり現実離れした空空漠漠な世界が構築されていった。それに伴い、身体から数学や計算が離れて行っている。
- 現代の計算や数学が身体感覚から離れていることを踏まえて、数学に身体性を再び取り入れることの重要性を強調している。

### 数字の本質について

**数とは人間の認知能力を補完し、延長するために生み出された道具である。**

人間は少数のモノについては、瞬時にその数を把握する能力がある。
その心理学的能力のことを、「スービタイゼーション（subitazaiton）」と呼ぶ。

その数が多くなってくると徐々に正確に瞬時に把握することができなくなってくる。

その認知的限界であるスービタイゼーションの能力を補うために、いろんな工夫をしてきた。

歴史的工夫には次のようなものがある：

1. 身体を使って数える。
2. 木や骨に刻みを入れて、数えたり、記録したりする
3. 紀元前33000年頃　文字を発明する
    1. シュメール人によって年度版にシュメール文字を使って記述するようになった。
    2. 最古の粘土板には文字とともに数字を表すための記号が書かれた板。

このように、数字は古今東西、人間の認知能力の限界に合わせて工夫を凝らして設計されていった。

こうして身体の各部位や小石や木に刻みを入れて記録したり、外部メディアに記号などを用いて、離散的な数量を把握する人間の能力は拡張されていった。

人間はその認知能力の限界から連続的に数量を把握することができない。3までしかそもそも一瞬で正確に把握することができない。

その能力を拡張するために数学は工夫が凝らされていった。

#### コラム1

- Why Japanese People ！漢字の一、二、三の後が棒4つじゃないのはなぜかという理由をお笑い芸人であるジェイソンがネタにしているが、それはスービタイゼーションに理由があったということだ。古代のシュメール人が数学的な記号も3以降は異なる表現をしていた。そもそも漢数字だけでなく、古代インド文字もローマ数字もすべて4以降は別の表され方をしている。

#### コラム2

- コンピューターやそろばんなどを使うことで、人間は馬鹿になっているのではないかと主張している人達がいるが、その直感は理解できるものの、それは今に始まった
たことではないことが数字を巡る歴史的な営みからわかると思う。記憶できないほどの連続的な量を記述するためには、外部メディアに文字や数字を記録する必要があったのである。その記憶の外部化が顕著に目に見えてわかるようにしたのが、スマホやパソコン、AIであり、今に始まったことではない。むしろ、脳の認知能力の限界を補う形で発展している数字、道具、テクノロジーを有効に活用すれば、より人間らしく行きていけるはずだ。

#### コラム3

数学を補う数学について

- 包丁を使うために、砥石やまな板がある。
- あるソフトウェアが生まれると、そのソフトウェアを使いやすくするために別のプラグインが開発される。

上記のように、ある道具が生まれるとその道具を使いやすくするためにまた新たな道具が生み出される。そしてその道具同士が相互に依存しあって、道具の生態系が生まれていく。

そして筆者はこれは数学においても同じであると説明している。

その例として、小学生のころに習う筆算を例に上げている。

筆算は今では簡単に誰しもができるが、それは我々があたまがいいからではなく、筆算の一連の手続きが巧みに設計され、その洗練された手続きを開発していった先人たちの努力の営みがあったからである。

筆算の手続きのような、一連の手続きのことを我々はアルゴリズムと呼んでいる。

### この本を途中まで読んで思ったこと

数字という道具の周りに、新たな道具や技術が生まれ、それが洗練されていき、一連の手続きとなってまた別の数学的道具が生まれる。道具の生態系と同じように数学的生態系が生まれる。
数学的道具をさらに使いやすくするための数学的道具こそアルゴリズムなのかもしれない。

現代でもその傾向は続いている。

数学を発展させるために数学をする営みのなかで、アルゴリズムを発展させるためのアルゴリズムが生み出されつつある。

このことについては別記事で取り上げたい。

主な内容としては、ニューラルネットワークのスパース化についてである。

- 数学を巡る営みは大きく分けると2つある。
    1. 数学を数学する
    2. 数学を身体性を結びつける

どうした数学をするのかと問われたり、自分で解いたりするとうーんなんとなく楽しいからであったり、卒業するために必要だからとか、テクノロジーは数学でできている側面があるからとか、経営においても因数分解によってあらゆる原因を分解して対処するためだとか色々考えつくが、卒業するために必要以外を取り除くと、筆者の主張にあるように上記の2つに集約されると思う。

自分で問題を解いたり、数学自体を研究することは、数学を数学することに該当すると思う。

そしてある現象に対する原因を因数分解して考えたり、テクノロジーを発展させるために数学を勉強するのは、数学を身体性と結びつけることに該当すると思う。この場合は、数学と社会が結びついているように思う。

道具を発展させるために道具が生態系の如くうまれ、数学を発展させるために数学をする。これは道具を更に拡張したテクノロジーにも同じことが言えそうだ。

テクノロジーを発展させるためにテクノロジーを生み出していき、テクノロジーの生態系が生まれていく。

一見無意味に思えるテクノロジーが時に生まれることがあるが、それは計算を効率化するための筆算の発明のようなものなんだと思う。そのおもしろテクノロジーが身体性と結びついていないから、無意味で無価値だと判断されることもあるが、それ単体が否定されるものでは無いと思う。

そういう意味では、自分の周りで開催されているアイデアソンはテクノロジーに身体性を吹き込むという意味で非常に有用なものなんだと思う。

今後、テクノロジーの生態系を生むための方法論を考えてみたいと思う。

また、その他の本書の内容も別の記事にしていく。
【ネットワーク】初心者のためのイーサネット説明

# はじめに
この記事は、株式会社スピードリンクジャパン Advent Calendar 2023 の1５日目の記事です。

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

## 概要
前回の記事はTCP/IPモデルの各階層の役割とプロトコルについて説明をしました。
今回はイーサネットについて説明をしていきます。
前回の記事は下記のものになります。
こちらの記事を読んでからの方が理解しやすいと思います。
是非、こちらも読んでみてください。

https://qiita.com/nakamura_slj/items/4693c34d30621b87e5be

## 対象とする読者
* ネットワークの基礎から学びたい人
* 前回の記事を読んだ人
* これからIT業界で仕事をしようと考えている人
* CCNAの資格を取ろうとしている人

# イーサネットの概要
イーサネットは、LANや一部のWANにおいてリンク層で利用されるプロトコルです。
データの形式や物理ケーブルの仕様などを規定しています。
リンク層では、IPパケットにイーサネットヘッダとトレーラを付加してフレームに変換します。
ヘッダには宛先と送信元のMACアドレスなどが含まれていて、トレーラにはフレームの間違えをチェックするための情報が含まれています。
このフレームを電気信号に変換し、ケーブルを介して宛先へ送ります。
送信先では受け取った電気信号をフレームに変換して、フレームからヘッダとトレーラを取り除いたIPパケットをインターネット層に渡します。

# イーサネットLANのケーブルと規格
LAN内で機器間を接続するために使用されるケーブルについて説明します。

## LANケーブルの種類
ネットワークを構築する場合、環境や利用する機器よって利用するケーブルが異なります。
企業や家庭でLANを構築する場合は、ほとんど**ツイストペアケーブル**を利用します。
ツイストペアケーブルにはノイズに強いシールド付きの**STP**とシールドのない**UTP**がありますが、
日本ではUTPが主流となっています。
ツイストペアケーブルは一般的に**LANケーブル**と呼ばれています。
下記がケーブルの種類となります。

| 種類 | 説明 |
|:---------|:-----------|
| 同軸ケーブル     |伝送用の１本の銅線を絶縁体で囲んだケーブル。LAN以外にもテレビのアンテナ用に使用される|
| ツイストペアケーブル     |銅線を２本ずつペアにして合わせたケーブル。２体４線式、4体８線式などがある。STPとUTPがありLAMに使用される|
| 光ファイバーケーブル     |石英などで作られたコアという芯をクラットが同心円状に覆う構造で、光信号を反射させて利用するケーブル。FTTx、ギガビットイーサネットなどの光通信に使用される|

## LANケーブルのピンの割り当て
LANケーブルのコネクタにある電極１つ１つを**ピン**と呼び、4体８線式のLANケーブルの場合、１ピンから８ピンまでで構成されます。
LANケーブルには２種類あり、**ストレートケーブル**と**クロスケーブル**があります。
この２つにはピンの並びに違いがあります。

### ストレートケーブル
ケーブル内で８本の銅線がストレートに配線されているため、ケーブルの両端でピンが同じ並びになっている。

### クロスケーブル
ケーブル内で８本の銅線の一部がクロスして配線されているため、ケーブルの両端でピンが異なる並びになっている。

# 最後に
以上となります。
今回はイーサネットについて簡単に説明しました。
今回は記事が長くなってしまうので、次回今回の内容の続きを説明しようと思います。
初心者がAWSにLAMP構築のための環境を構築する

#### はじめに
こんばんは。
[MYJLab Advent Calender 2023](https://qiita.com/advent-calendar/2023/myjlab)の14日目です！　今日の担当は3年 まほすけです！
なんと、投稿日は15日になりそうですが、ベットに入るまでは14日、ということで頑張っていきます〜(ごめんなさい)

### はじめに
実際に1人でAWSでLAMP環境を準備してみよう、という試みのメモです。
そもそもインスタンスを１つ立ち上げるだけでも、初学者にとってはアルファベットとカタカナの羅列で意味不明なので、私なりにインスタンスを作成した方法を残しておきます！
今回は、インスタンスの作成を目指します！

#### 前提
アカウント作成は済んでいる前提から始めます！
オレンジ文字の インスタンスを作成　からインスタンスを作成します！
![スクリーンショット 2023-12-15 0.16.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617891/607c683b-ef5a-2860-15e3-ab6453cb914d.png)


##### イメージの選定
名前には、わかりやすい名前を入力します！用途やドメイン名に近いものなどにするとインスタンスが複数作成したときにわかりやすいですね！
![スクリーンショット 2023-12-15 0.18.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617891/d4c1e2e9-f0bf-6ee7-15f2-0da6610d7975.png)
1年無料枠では、選べるイメージ(os)に制限がありますが、好みのものを使用しましょう！
今回はamazon-linux-2023を選択しました！

##### キーペアの作成
既存のキーペアを利用するか、新規に作成する場合は、新しいキーペアの作成を行います。
![スクリーンショット 2023-12-15 0.18.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617891/c6e153e3-ed60-b539-cb03-8dada0fef6ca.png)

![スクリーンショット 2023-12-15 0.19.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617891/ac6f289f-7ab8-69fb-cf94-206d0b23adae.png)
新しいキーペアの作成を行った場合、後々ssh接続をするときなどに必要になってくるので、pemファイルは大事に保管しておきましょう！

##### セキュリティ
セキュリティグループを設定します
![スクリーンショット 2023-12-15 0.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617891/85a38624-481c-f86c-ecd9-3f7c426d8e96.png)

:::note warn
警告
今回はまずインスタンスを作成することを目標にしています。<br>実際に公開などするときにはセキュリティの設定に注意してください。
:::

これらが設定できたら、インスタンスを作成、を押しましょう

#### インスタンス作成完了
この状況になったら、インスタンスは作成完了です！



インスタンスの一覧表示


インストールが確認できたら、インスタンスIDの青字部分をクリックして以下の画面に遷移します

![スクリーンショット 2023-12-15 1.45.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617891/30e214c5-d1a9-3968-80de-a7aa023ec58f.png)



接続ボタンを押し、一番左のブラウザから接続できる機能を利用します
![スクリーンショット 2023-12-15 0.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617891/49f57059-c6dd-4f62-a86d-844e384bcfa6.png)

「接続」を押したら
![スクリーンショット 2023-12-15 0.37.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617891/27a617ad-b574-c533-fde5-19b6ed20b2bf.png)


無事ec2-userとしてamazon-linuxに接続することができました！

#### さいごに
以上で初心者がAWS上にlinux環境を用意する方法でした！
細かいことはとにかく略してあるので、これが最低限の作成方法です。
今後の目標として、細かい設定方法に関しても、調べながら作ってみることを、頑張ります！
「ビジネスはゲームで加速！」 成功企業のゲーミフィケーション戦略

# 「遊び心のある職場」：Virgin Atlanticのユニークなアプローチ
航空業界は絶えず変わり続ける競争の渦の中で、Virgin Atlanticは自分たちだけの特別なアイデンティティを作り上げてきました。彼らの成功の秘訣は、従業員のエンゲージメントを高める独自の方法にあります。

その背後には、創業者リチャード・ブランソンの心温まる革新的リーダーシップがあります。ブランソンの「従業員が幸せなら顧客も幸せ」という哲学は、Virginの企業文化の核心を成しています。

![gamification-20231214-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/05ca659c-b14e-0960-1420-5efc9f276454.png)

Virginでは、職場はただの労働の場所ではありません。それは、「楽しむべき場所」、従業員が自分らしく能力を発揮できる場所として大切にされています。

このアプローチは、従業員が仕事に情熱を傾けることを促し、彼らをより創造的で生産的にします。楽しみながら働く文化が、結果的に顧客体験の向上にもつながっています。

- 内部コミュニケーションの革新
- ブランドエンゲージメントへの取り組み
- 従業員が企業の発展に積極的に参加する環境

これらは、Virgin Atlanticが従業員エンゲージメントを高めるための重要な鍵となっています。

この記事では、Virgin Atlanticのエンゲージメント戦略が従業員の幸福感と企業の成功にどのように貢献しているかを深堀りしていきます。

# 革新的コミュニケーションとブランドエンゲージメント

Virgin Atlanticが従業員と心を通わせる秘訣は、革新的なコミュニケーションとブランドエンゲージメントにあります。

同社は、従業員とのやり取りで新しいアイデアを取り入れ、オープンなフィードバックを通じて一緒に成長しています。例えば、最新技術の試験導入が、従業員が顧客サービスを改善する新たな道を切り開くきっかけになっています。

## 内部コミュニケーション

Virgin Atlanticでは、デジタルと対面の両方でイノベーションを話題にすることで、社内文化を育て、イノベーションを推進しています。新しいアイデアについてオープンに話し合うことが、従業員が顧客目線で考え、イノベーションに貢献する文化を育てています。

## ブランドエンゲージメント

従業員がVirgin Atlanticのブランドを誇りに思い、積極的に情報を共有しています。マーケティングやソーシャルメディア部門と協力し、従業員が企業の素敵な側面を広めるためのプログラムを展開しています。

これらの戦略は、従業員が積極的に参加し、ブランドを推進することで、Virgin Atlanticのエネルギーと創造性を高めています。次のセクションでは、これらの戦略がゲーミフィケーションの要素とどのように結びついているかを探ります。

# ゲーミフィケーション要素の統合
Virgin Atlanticの戦略で注目すべきは、従業員のエンゲージメントを高めるために取り入れられたゲーミフィケーションの要素です。ここでは、単なる報酬システムを超えて、従業員のモチベーションと参加を深く促す方法が採用されています。

## イノベーションとエンゲージメント
Virginが取り組むイノベーションは、従業員を刺激し、新しいことに挑戦する機会を提供します。これにより、従業員は自分たちの仕事に対してより積極的に関与するようになります。

## フィードバックと参加
従業員の意見が重視され、彼らが企業の方向性に影響を与えることができます。これは、ゲーム内でのプレイヤーのフィードバックループに似ており、より参加的な環境を生み出します。

## ブランド提唱プログラム
従業員が自らのネットワークを通じてブランドを広めることで、彼らは自分の貢献に誇りを持ち、企業の成功に直接貢献していると感じるようになります。

## コミュニケーションプラットフォーム
Workplaceの導入により、従業員間のコミュニケーションが強化され、より一層のエンゲージメントが促進されています。このプラットフォームは、従業員が互いにつながり、情報を共有する対話的な環境を提供しています。


# ゲームとビジネスの融合・未来への展望
Virgin Atlanticの事例は、仕事の楽しさと従業員のエンゲージメントがどのように幸福感と生産性を向上させるかを鮮やかに示しています。

リチャード・ブランソンの温かみのあるリーダーシップや、創造的なコミュニケーション、そして従業員が自らブランドを広めるプログラムは、ゲーミフィケーションの要素を巧みに取り入れ、従業員が企業の成長に積極的に貢献する文化を育んでいます。

このような取り組みは、現代ビジネスにおいて従業員のエンゲージメントを高め、持続可能な成長を達成するために非常に重要です。Virginの成功は、従業員の幸福を大切にすることが顧客満足とビジネス成果につながることを示しており、今後もゲームの要素を取り入れた斬新な戦略が企業成長のカギとなるでしょう。
スクラム2年生が認定スクラムマスターを取得して考えたこと

:::note info
この記事は「[Infocom Advent Calendar 2023](https://qiita.com/advent-calendar/2023/infocom)」カレンダーの15日目の記事です
:::
Developerとしてスクラムを1年間経験してスクラムにも慣れ、ある程度はスクラムについて説明できるようにはなりましたが、下記の理由から認定スクラムマスター講座に参加しました。
* プロダクトオーナー・スクラムマスター・開発者の役割や各種スクラムイベントを再整理する
* スクラムマスターとしてチームだけでなく組織にスクラムを波及させたい
* スクラムマスターの知見を持つメンバーが複数いるスクラムチームは絶対強いはず

認定スクラムマスターを取得してみて、スクラムのマインドやスクラムマスターの立ち位置について考えをまとめてみました。

## 参加した講座について

[AGILE BUSINESS INSTITUTEの認定スクラムマスター](https://abi-agile.com/%E8%AA%8D%E5%AE%9A%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC/)を受講しました。
参加者には、これからスクラムを始めるという方が多かった印象です。内容は、座学：グループワーク＝3：7で、チームで議論する時間が多かったため、とても学びが多かったです。講師の[Joe Justice](https://twitter.com/JoeJustice)さんは、スクラムへの熱いパッションがあり、アジャイルの歌を披露してくれるなどユーモアもある方でしたｗ

## Scrum is a game!

1年間スクラムを経験してきて、デイリースクラムの実施やカンバンの活用により透明性が向上することや、イテレーションの経験から改善ループを回すことの有用性を感じていて、スクラムが無い開発には戻りたくない、、、というくらいに自分にはスクラムが合っていると感じています。

「Scrum is a game!」という認識は全く無かったですが腹落ちしました。

ゲームって楽しいですよね。チュートリアルで操作方法を学んで、レベルが上がるにつれて新しいイベントに挑戦して、ボスを倒すと報酬がもらえたりします（もちろん時には、ボスに負けて悔しい思いもします）。

スクラムに当てはめて言うと、

オンボード時は比較的簡単なタスクからチームでの開発手法を学んで、ペアプロやモブプロを通じて個人・チームがレベルアップし、イテレーションを通じてインクリメントを作成し、サービスが成長していきます（もちろん時には、予定してたインクリメントを完成できず自分の力不足に悩むこともあります）。
講座では報酬の例として、アイスクリームとかディズニーのチケットとかが挙げられていました（うらやましい）。

「Scrum is a game!」は良い呪文になる気がしています。チーム内で唱え続けると、個人のスキルアップ・心理的安全性の向上・チャレンジの歓迎・失敗の賞賛などが促進され、シンプルに仕事が楽しくなると思います。


## スクラムマスターの立ち位置

認定スクラムマスター講座とは別ですが、Women Developer Summit 2022で[「スクラムマスターが「チームのお母さん」にならないための方法」](https://engineering.nifty.co.jp/blog/12972)という発表が、私のスクラムマスターの考え方の土台になっています。当時はぴかぴかのスクラム1年生でしたが、自分が目指したいスクラムマスター・スクラムチームはまさにこれだ！と雷が落ちた記憶があります。スクラムマスターを取得してから再度読み直してみるとより分かりみが深いです。

[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)のスクラムマスターの役割を見ると、

> スクラムチームの進捗を妨げる障害物を排除するように働きかける。

とありますが、この「障害物」が多すぎるんですよね。スクラムイベントの設定・ファシリ・事務作業などなど。この障害物をスクラムマスターに押し付けるようでは自律的なチームにはなれないと感じます。スクラムマスターは障害物を排除するようサポートしますが、理想はスクラムマスターがいなくてもスクラムが回ること、逆に言えば、全員がスクラムマスターのマインドを持つことが最強のスクラムチームなのではないでしょうか。

## まとめ

認定スクラムマスターを取得して、スクラムをより楽しく進めるための呪文と、スクラムマスターの立ち位置について考えをまとめました。

認定スクラムマスター講座自体はとても学びが多かったですが、基本的なスクラムについての知識にとどまるので、すぐ現場でスクラムマスターとしてジョインすることはハードルが高いように感じます。まずは開発者としてスクラムマスターの背中を見ながらスクラムマスターの仕事を理解していくべきでしょう。また、そのときはスクラムマスターに障害を押し付けるのではなく、自身で解決できるようにサポートしてもらうように努めると、自身としてもチームとしても成長に繋がると思います。
Amazon Bedrockの活用例：Cohere - Commandを使ったサンプルアプリケーション

本記事は [Amazon Bedrock Advent Calendar 2023 by ナレコム](https://qiita.com/advent-calendar/2023/bedrock-knowledgecommunication) の14日目の記事です。

Amazon Bedrock Advent Calendar 2023 by ナレコム ではAmazon Bedrockの基本的な概要から具体的な各モデルの作り方や事例紹介などを行っていきます。

### はじめに

Amazon Bedrockは多くのサンプルアプリケーションを提供し、ユーザーがPlayground上で実際に試すことができるように設計されています。

今回は2023年12月現在33個公開されているExamplesの内、 **Cohere - Command** を使った3つを紹介します。記事では、これらの例のプロンプトとレスポンスをわかりやすく日本語で紹介します。

**記事はわかりやすさを優先してプロンプトやレスポンスを日本語にしておりますが、2023年12月時点ではCommandは基本的に英語でのみ動作します。**

※日本語でも稀に動作することもあります。パターンとして以下の3種類が確認されましたが、規則性はありませんでした。
1. 日本語で応答
1. 日本語の内容に対して英語で応答
1. エラーとして英語で応答

### 例１）コントラクト・エンティティ抽出
生成モデルを使ってテキストからエンティティを簡単に解析する

:::note info
**プロンプト**
契約書からバンド名を抜粋

本音楽録音契約（以下「本契約」という）は、トロントを拠点とする音楽グループGood Kid（以下「アーティスト」という）とライセンス番号545345のレコードレーベルUniversal Music Group（以下「レコードレーベル」という）との間で、2021年12月13日付で締結される。本契約において、アーティスト及びレコードレーベルは、それぞれ個別に "当事者 "といい、総称して "両当事者 "という。本契約に基づく業務は、2022年3月15日に開始する。
:::

:::note warn
**レスポンス**
Good Kid
:::

### 例２）商品説明から特典まで

商品説明を機能的、感情的、社会的ベネフィットのリストに変える

:::note info
**プロンプト**
次の製品の特徴をベネフィットのリストにしてください。次に、このベネフィットのリストを3つのタイプのベネフィットにグループ分けする： 機能的ベネフィット、情緒的ベネフィット、社会的ベネフィットである。
「製品の特徴：当社のアプリは、あなたの会議を自動的に書き起こします。騒がしい環境でも機能する最先端の音声テキスト化技術を使用しています。書き起こしが終わると、私たちのアプリは要約を作成し、自動的に会議の出席者にメールで送信します。」
:::

:::note warn
**レスポンス**
メリット
- 時間を節約： アプリが自動的に会議の内容を書き起こし、要約するので、これらの作業に時間を費やす必要がありません。
- 生産性の向上： 書き起こしや要約のプロセスを自動化することで、生産性と効率が向上します。
- コミュニケーションの向上： このアプリは、会議の出席者全員に要約を確実に共有するため、全員が同じページにいて、同じ情報にアクセスできます。

機能的ベネフィット
- 正確性の向上： このアプリは、騒がしい環境でも機能する最先端の音声テキスト化技術を使用しているため、書き起こしは正確です。
- 効率性の向上： アプリがテープ起こしの要約を作成するため、重要なポイントを見つけるためにテープ起こし全体に目を通す必要がありません。

情緒的ベネフィット
- ストレスの軽減： テープ起こしと要約のプロセスを自動化することで、ストレスが軽減され、より重要な仕事に集中できます。
- 自信の向上： このアプリは
:::

### 例３）トランスクリプトの要約

会話の要点を抽出する

:::note info
**プロンプト**
この対話を要約せよ：
「お客様： サポート・エージェントにつないでください。
AI：こんにちは、本日はどのようなご用件でしょうか？
お客様：パスワードを忘れてしまいました： パスワードを忘れてしまい、自分のアカウントのEメールにアクセスできなくなってしまいました。助けていただけますか？
AI：もちろんです。まずご本人であることを確認させていただき、サポート・エージェントにおつなぎします。」
:::

:::note warn
**レスポンス**
顧客は、パスワードをリセットしてアカウントへのアクセスを回復するための支援を求めている。
:::

### まとめ

この記事では、Amazon Bedrockが提供するサンプルアプリケーションについて紹介しており、特に「Cohere - Command」を使った3つの例が取り上げられています。各例では、実際のプロンプトとそれに対するレスポンスが日本語で解説されており、記事全体としては使い方のわかりやすさを重視しています。ただし、2023年12月時点で「Command」は主に英語で動作すること、日本語での動作には不規則性があることが記されています。

1. **コントラクト・エンティティ抽出** - 契約書からバンド名を抜粋する例。
2. **商品説明から特典まで** - 商品説明を機能的、感情的、社会的ベネフィットに変換する例。
3. **トランスクリプトの要約** - 対話の要点を抽出する例。

この記事は、Cohereの機能を実際に活用する方法を示し、特にテキスト解析や要約作成におけるその有効性を強調しています。

---

また、ナレッジコミュニケーションでは  **「[Musubite](https://recruiting.musubite-job.com/features/company/knowledge-communication)」** というエンジニア同士のカジュアルトークサービスを利用しています！この記事にあるような生成AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！

https://recruiting.musubite-job.com/features/company/knowledge-communication
WebsocketとAction CableとTurbo Streams、その関係性

# はじめに
本記事は錆びかけたRailsの知識を頑張ってアップデートするアドベントカレンダー13日目です。

Turbo Stream(ActionCable)を使ったリアルタイム通信について学習したので、まとめます。

# リアルタイム通信を実現する仕組みについて
Webアプリケーションにおいてリアルタイム通信を実現するには、Websocketというプロトコルを利用します。

### Websocketとは
クライアントとサーバの通信において、双方向の通信を可能にする技術(通信方式？)です。
たとえばhttp通信であれば、クライアントがサーバに問い合わせることはできますがその逆はありません。
一方、Websocketを使うと、サーバが任意のタイミングで特定のクライアントへ情報を送ることが可能です。

### なぜWebsocketを使うのか
LINEのようなチャットアプリや通知機能など、あるユーザーのアプリの操作が別のユーザーのアプリの画面に影響を及ぼすようなUIを作るときに必要だからです。

### Websocketの仕組み
Websocketの接続は、最初にHTTPリクエストを介して開始され（これを「ハンドシェイク」と呼びます）、その後プロトコルがアップグレードされてWebsocket通信に切り替わります。

**プロトコル:** Websocketはws://（またはセキュアなwss://）という独自のプロトコルを使用します。これは、HTTPのhttp://やhttps://とは異なります。

**通信方式:** HTTPの場合はクライアントからサーバーへのリクエスト後、サーバーからレスポンスが返され、その後通信は終了します。一方で、Websocketは接続が開始されるとその接続が切断されるまで継続的にデータの交換が可能です。

# WebsocketをRailsで扱うには
WebsocketをRailsで利用するために、Action Cableという技術を利用します。

### Action Cableとは
Websocketを使うためにはさまざまなことを考慮する必要があります。それを扱いやすいよう整理、抽象化して提供されるAPIです。Railsに組み込まれています。

## Action Cable周りの概念の用語集

**コネクション（Connection）：** クライアントとサーバー間の関係を成立させる基礎となります。サーバーでWebSocketを受け付けるたびに、コネクションのオブジェクトがインスタンス化します。

**コンシューマー（Consumer）：** WebSocketコネクションのクライアントは、コンシューマーと呼ばれます。Action Cableのコンシューマーは、クライアント側のJavaScriptフレームワークによって作成されます。

**チャネル（Channel）：** コンシューマごとに、複数のチャネルをサブスクライブできます。各チャネルは論理的な機能単位をカプセル化しており、チャネル内ではコントローラが典型的なMVCセットアップで行っていることと同様のことを行います。

**サブスクライバ（Subscriber）：** コンシューマーがチャネルでサブスクライブされると、サブスクライバとして振る舞います。サブスクライバとチャネルの間のコネクションは、サブスクリプションと呼ばれます。

**ブロードキャスト（Broadcast）：** あるブロードキャスターによって転送されるあらゆる情報をチャネルのサブスクライバに直接送信するpub/subリンクを指します。各チャネルは、0個以上のブロードキャストをストリーミングできます。

## Action Cableで説明するリアルタイム通信の仕組み

### クライアントとサーバの間に繋がりを作る
双方向通信ということは、サーバ自らクライアントへ情報を送る必要が出てきます。
なので、Websocketをやるつもりできたクライアントに対してはサーバ側との繋がりを作っておきます。これがコネクションです。コネクションができたら、情報をやりとりするためにチャネルという単位でサーバから情報を送るルートを確保します。

### サーバからクライアントへ情報を送る
ブロードキャストを使い、サーバからクライアントへ情報を送ります。
【VB.NET】.NET 8でLINQに追加されたメソッドを使ってみる

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

11月14日に「.NET 8.0」 がリリースされました。
VB.NETは新機能の対応はしない方針ではあるが、記法に関係ない部分は対応します。

# .NET 8.0でLINQに追加されたメソッド
.NET 8でLINQに追加されたメソッドである`ToDictionary`メソッドに追加された`オーバーロード`が使用できるか確認してみました。

https://qiita.com/RyotaMurohoshi/items/aa57e96a01c6627ec08d

```vb
Public Structure Skill
    Public Id As Integer
    Public Name As String

    Public Sub New(Id As Integer, Name As String)
        Me.Id = Id
        Me.Name = Name
    End Sub
End Structure

Sub Main(args As String())
    Dim skills As New List(Of Skill) From {
        New Skill(Id:=0, Name:="ファイアー"),
        New Skill(Id:=1, Name:="エルファイアー"),
        New Skill(Id:=2, Name:="サンダー"),
        New Skill(Id:=3, Name:="サンダーストーム"),
        New Skill(Id:=4, Name:="エイルカリバー")
    }

    Dim skillNameDictionary = skills.ToDictionary(Function(it) it.Id, Function(it) it.Name)

    Console.WriteLine(skillNameDictionary(0)) ' ファイアー
    Console.WriteLine(skillNameDictionary(1)) ' エルファイアー  

    ' "ファイアー"を含む内容のみ
    Dim onlyFireSkillNameDictonary =
        skillNameDictionary.Where(Function(it) it.Value.Contains("ファイアー")).ToDictionary()

    For Each dic In onlyFireSkillNameDictonary
        Console.WriteLine(dic)
    Next
End Sub
```

## 結果
```
ファイアー
エルファイアー
[0, ファイアー]
[1, エルファイアー]
```

## 補足
C#の記事では、`Record`型を使用していましたが、VB.NETでは標準では対応していないので変更しています。そこは今回は関係ない部分なので・・・。
ちなみにソースジェネレータ機能を使用して`Record`型を実現させています。

https://qiita.com/yaju/items/ebe2fc1e7d9d53695dba


# .NET 7.0版のLINQに追加されたメソッド
[Visual Basic 2022年の振り返り](https://qiita.com/yaju/items/882e1de76a763e098fce)で確認済み、再掲します。
.NET 7でLINQに追加されたメソッドである`Order`と`OrderDescending`は使えました。

https://qiita.com/RyotaMurohoshi/items/71a84fe7a5cf8df57054

```vb
Dim arrayNumber = {4, 5, 1, 3, 2}

' ↓は1, 2, 3, 4, 5というIOrderedEnumerable<int>
Dim sortedNumber = arrayNumber.Order()

' ↓は5, 4, 3, 2, 1というIOrderedEnumerable<int>
Dim sortedDescNumber = arrayNumber.OrderDescending()

Dim arrayMessage = {"b", "a", "aa", "ab", "ba", "bb", "aaa"}

' ↓はa, aa, aaa, ab, b, ba, bbというIOrderedEnumerable<string>
Dim sortedMessage = arrayMessage.Order()

' ↓はbb, ba, b, ab, aaa, aa, aというIOrderedEnumerable<string>
Dim sortedDescMessage = arrayMessage.OrderDescending()
```

# 最後に
.NET 8では、LINQ以外にもVB.NETで使用できる新機能がありそうなので、全部ではないですが確認して行こうと思います。
【JointJS】Anchor設定でLinkの端点位置を指定する

## Anchorとは

ElementをLinkでつなぐとき、デフォルトではLinkの始点と終点はElementの位置によって自動で決定されます。
ですが、図形によっては始点・終点の位置が自動で決まってしまうと不都合な場合があります。
AnchorはElementの始点・終点の方向を指定できる設定です。始点・終点を意図した位置に設置できます。

## Anchorの指定方法

### Paper全体のデフォルトを指定

Paperの`defaultAnchor`を指定することで、Anchorのデフォルト値を設定できます。

```js
var paper = new joint.dia.Paper({

    // （中略）
    
    defaultAnchor: {
    name: 'midSide',
  }
});

```

### Linkごとに指定

LinkごとにAnchorを指定することで、個別に設定ができます。

```js
link.source(rectangle1, {
  anchor: {
    name: 'topRight',
  }
});
link.target(rectangle2, {
  anchor: {
    name: 'bottomLeft',
  }
});
```

## Anchorの`name`に指定できる値

### `center` / `modelCenter`

Elementの中央が基準になります。`center`はViewの中央、`modelCenter`はmodelの中央、という差があります。

![Untitled.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129526/9aecae71-fe69-9036-7b77-8af004dc3e9b.gif)

### `perpendicular`

垂直に線を引ける場合は垂直のルートになります。

![Untitled.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129526/99831eac-d28f-bf98-b421-3aeed800137f.gif)

### `midSide`

領域の外周の中央の点からLinkが引かれます。

![Untitled.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129526/daa35610-da33-4e96-261b-707018dd2228.gif)

### `top` / `bottom` / `left` / `right`

それぞれ領域の上・下・左・右の辺の**中央**が基準となります。
以下は`top`を設定したときの挙動です。

![Untitled.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129526/faa1678f-9d6a-774e-68b9-ee922a1aa209.gif)

### `topLeft` / `topRight` / `bottomLeft` / `bottomRight`

それぞれ領域の左上・右上・左下・右下の点が基準となります。
以下は`bottomLeft`を設定したときの挙動です。

![Untitled.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129526/5dbe7694-6050-38a8-7e1f-b5cc914e0855.gif)

## まとめ

Anchorを設定することでLinkの端点位置を調整することができました。もう少し細かい設定もできるのですが、今回はここまでの紹介とさせてください。

※この記事は [JointJS Advent Calendar 2023](https://qiita.com/advent-calendar/2023/jointjs) の記事です。他の記事を読む場合はカレンダーのページを参照してください。

https://qiita.com/advent-calendar/2023/jointjs
FormDataオブジェクトについて 配列の取り扱い

業務の中で、FormDataで配列を送信したい時の構文を学んだのでメモです。
もし間違いなどあればご指摘お願いします！

:::note
`FormData`オブジェクトは、HTMLフォームのデータを簡単に扱うためのJavaScript API。フォームのデータをサーバーに送信する際に使う。特に、ファイルアップロードや複数の値を含むフォームデータを扱う際に便利。
:::

### 配列の要素をFormDataに追加する
通常、フォームの入力項目は単一の値を持つ。しかし、場合によってはフォームに配列形式のデータ（例えば複数の選択肢や複数の関連する値）を送信したい場合があり、これを実現するために、FormDataオブジェクトに配列の要素を追加する必要がある。

##### 基本的な構文
配列の要素を追加する際の基本的な構文は以下。

```javascript
formData.append('配列の名前[]', 値);
```

この構文を使って、配列の各要素を追加します。配列の名前の後に [] を付けることが重要。これにより、サーバー側でこれらの値が配列として扱われるようになる。


##### 具体的な例
```javascript
let formData = new FormData();
formData.append('user[skills][]', 'JavaScript');
formData.append('user[skills][]', 'Python');
formData.append('user[skills][]', 'HTML');
```

この例では、user[skills][] という名前で3つのスキルを追加しています。サーバーに送信されると、user[skills] は ['JavaScript', 'Python', 'HTML'] という配列として解釈される。
keyball44 を BMP で無線化した時にトラックボールが動かなかった問題のメモ

https://qiita.com/BlackChoco1ate-Xp10r/items/c23af9625b3a98b557ed#5-%E3%81%9D%E3%81%AE%E4%BB%96

こちらの記事を参考に keyball44 の無線化を試みたんですが、トラックボールが全く反応しない問題に襲われました。

## 原因

Pro Micro で動かしたときは問題なく反応する
=> dprint を仕込んだファームウェアをビルドしたりいろいろ試した結果、光学センサーモジュール自体が認識されていないことが分かった 
=> BLE Micro Pro をちょっと傾けて刺したら直った

たぶん問題が起きたとき最初にすべきことが導通確認だったんだと思いますが、確認する知識もスキルもなかったせいで数日無駄にしました。
ハードウェアもちゃんと勉強しようと思います……。

## ビルドで詰まった点

QMK MSYS をつかってビルドを試みたんですが submodule どうこうのエラーでビルドに失敗しました。
QMK MSYS をダウングレードしたり、qmk のバージョンを変えてみたりいろいろ試して結局駄目でしたが、WSL2 (ubuntu 20.04.6) で docker build (`./util/docker_build.sh`) してみたら成功しました。
```bash
sudo SKIP_GIT=yes ./util/docker_build.sh keyball44:default:uf2
```

しかしこれでも `hex` => `uf2` の変換がエラー終了してしまうので (なぜかは知りません)、直接スクリプトを叩いて変換しました。
```bash
python3 ./util/uf2conv.py ./.build/keyball44_default.hex -o .build/keyball44_default.uf2 -c -f 0x0
```

これが適切なやり方なのかは何もわかりませんが、一応残しておきます。
経産省のSBOM導入に関する手引きについて

# 経産省のSBOM導入に関する手引について
今年の7月に経済産業省により「[ソフトウェア管理に向けたSBOM（Software Bill of Materials）の導入に関する手引](https://www.meti.go.jp/press/2023/07/20230728004/20230728004.html)」が策定、公開されました。既にお読みになった方も多いかもしれませんが、今日はこの手引について、改めて整理してみたいと思います。
本手引の英語版は[こちら](https://www.meti.go.jp/english/press/2023/0728_001.html)。

# 背景
平成31年4月、経済産業省により、「Society5.0」におけるセキュリティ対策の全体像を整理し、産業界が自らの対策に活用できるセキュリティ対策例をまとめた、『**サイバー・フィジカル・セキュリティ対策フレームワーク（CPSF）**』が策定されました。またCPSFに基づくセキュリティ対策の具体化・実装を推進するため、検討すべき項目ごとに焦点を絞ったタスクフォースが新たに設置され、そのうちのひとつである『**サイバー・フィジカル・セキュリティ確保に向けたソフトウェア管理手法等検討タスクフォース**』により、ソフトウェア管理手法、脆弱性対応、OSSの利活用等に関する検討がおこなわれています。
本手引は、[このタスクフォースの活動](https://www.meti.go.jp/shingikai/mono_info_service/sangyo_cyber/wg_seido/wg_bunyaodan/software/index.html)の中で、有識者や様々な分野の業界団体関係者を交えながら、SBOMの利活用等について実証や議論を行い、主にソフトウェアサプライヤー向けとして策定されました。

# 手引の全体像
本手引は、7章から成る全79ページのドキュメントで、全体概要は下図のとおりです([概要資料](https://www.meti.go.jp/press/2023/07/20230728004/20230728004-3.pdf)より引用)。

![手引の全体概要](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528217/f17d5c57-d2db-a714-cd90-fb6e275ba29c.png)

### 有用な参考情報満載の前半
前半の2～3章は「SBOMとは」「SBOM導入のメリット」などの基礎的な内容から始まっており、初心者の方にもわかりやすいように工夫して書かれています。また、「SBOM 管理による脆弱性管理コストの低減結果(手引 P.14 図2-4)」(<font color="Red">手動でのコンポーネント管理に比べ、SBOMによる管理では脆弱性管理コストが約3分の1に低減できるそうです！</font>)など、実証実験のデータに基づく具体的な情報も多数掲載されており、大変参考になります。
また、**我々OpenChain Japan WGが策定した日本発のフォーマットであるSPDX-Lite**についてもしっかりと紹介いただいています！

### 実用的なプロセスについて説明されている後半
後半の4～6章には、SBOM導入プロセスにしたがって「環境構築・体制整備フェーズ」「SBOM作成・共有フェーズ」「SBOM運用・管理フェーズ」における**実施事項と認識しておくべきポイント**が具体的に纏められています。実証実験の結果を用いた具体例や、実務者の知見に基づいた注意点などが詳細に記載されており、実際にSBOMを導入・活用する際の助けになります。

### 付録にも重要な情報がたくさん書かれています
そして、最後の7章には、用語集や参考情報などのほか、SBOMツールの紹介(特長など)とSBOMフォーマットの詳細解説が書かれています。OpenChain Japanでは、SBOMツールの情報共有やSBOMフォーマットのひとつであるSPDXをテーマに活動しているサブワークグループがありますので、興味のある方は是非ご参加ください。

# English Summary
The Ministry of Economy, Trade and Industry (METI) released “[Guide of Introduction of Software Bill of Materials (SBOM) for Software Management](https://www.meti.go.jp/english/press/2023/0728_001.html)” in July, 2023. This guide mainly targets software suppliers engaging in packaged software and embedded software as its readers. It contains really useful information and helpful know-hows about SBOM management.
nx+m（n, m は整数、xは無理数固定）という数の集合は稠密であることの証明

# 問

$x$ を任意の無理数とする。

集合

```math
S = \left\{nx+m \mid n, m \in \mathbb{Z}\right\}
```

は $\mathbb{R}$ の中で稠密であることを示せ。

# 記号と用語

## 稠密

実数の集合 $S$ が実数 $\mathbb{R}$ の中で稠密であるとは、$S$ が次の条件を満たすことを言う。

```math
\forall a, b \in \mathbb{R}, a < b \implies \exists x \in S\ s.t. a < x < b
```

## 鳩の巣原理

10箱の巣箱に11羽の鳩が住んでいるならば、少なくとも1つの箱の中には2羽の鳩がいる、という原理。
直感的にわかりやすく、数学的にも有用なので全人類から好かれている（要出典）

# 証明

## 方針

証明にはみんな大好き鳩の巣原理を使う。
区間 $[0, 1]$ を $N$ 等分すると各区間の長さは $1/N$ となる。
$S$ の元で、$[0,1]$ に含まれる値を $N+1$ 個用意してやれば、鳩の巣原理により少なくとも1つの区間には2個含まれている。
この2個の差は再び $S$ の元であり、しかも $1/N$ よりも小さい。
$N$ を十分大きく取れば、この差を $b-a$ より小さくすることができる。
あとはこれを歩幅として数直線上を歩いていけば、いつかは $a$ と $b$ の間に足を踏み入れることになる。
この点が求めたい $S$ の元である。

## 証明

### 区間 [0, 1] の中に無限個の元があることの証明

鳩の巣原理を使うには、任意の自然数 $N$ に対して $N+1$ 個の**異なる**元が区間[0,1]の中に存在する必要がある。証明には背理法を用いる。

区間 $[0, 1]$ の中に$S$の元が有限個しか無いと仮定し、その個数を$N$個とする。
$N+1$個の$S$の元を、次のように用意する。

```math
\begin{align}
s_1 & = & x & - [x] \\
s_2 & = & 2x & - [2x] \\
& ... \\
s_N & = & Nx & - [Nx] \\
s_{N+1} & = & (N+1)x& -[(N+1)x]
\end{align}
```

ただし、$[t]$ で $t$ の整数部分を表す。

つまり $s_i$ は $ix$ の小数部分であり、この $N+1$ の元は区間$[0,1]$に含まれる。
しかし区間$[0,1]$には$N$個の元しか無いと仮定したのだから、どれか2つは値が同じはずである。
その2つを $s_i, s_j \(i \neq j\)$とすると、

```math
ix - [ix] = jx - [jx]
```

が成り立つ。これを x について整理すると

```math
x = \frac{[ix] - [jx]}{i-j}
```

となる。$i$, $j$, $[ix]$, $[jx]$ は整数であるから右辺は有理数となり、これは $x$ が無理数であることと矛盾する。

したがって仮定は誤りであり、区間 $[0,1]$の中に無限個の元があることが示された。

## 本題


```math
a < b
```

となる実数 $a$, $b$ を任意に取る。この $a$, $b$ に対し、

```math
\frac{1}{b-a} < N
```

を満たす自然数 $N$ を一つ取る。

```math
\begin{align}
s_1 & = & x & - [x] \\
s_2 & = & 2x & - [2x] \\
& ... \\
s_N & = & Nx & - [Nx] \\
s_{N+1} & = & (N+1)x& -[(N+1)x]
\end{align}
```

とすると、$s_1,...s_{N+1}$ は $N+1$ 個の相異なる $S$ の元であり、区間 $[0,1]$ に含まれる。
区間 $[0,1]$ を $N$ 等分すると、鳩の巣原理より少なくとも1つの区間に $s_1,...s_{N+1}$ のいずれかが2つ存在する。この2つを $s_i, s_j \(s_i < s_j \)$とすると、この2つの差は $1/N$ よりも小さい。

```math
\begin{align}
s & = & & s_j - s_i \\
& = & & (jx - [jx]) - (ix - [ix]) \\
& = & & (j - i)x - ([jx] - [ix])
\end{align}
```

と置けば、 $s \in S$ であり、 $s < 1/N < b - a$ を満たす。
$a/s$ より大きい最小の自然数を $m$ とおくと、

```math
ms = m(j - i)x - m([jx] - [ix]) \in S
```

であり、

```math
(m-1)s < a < ms
```

 である。したがって、

```math
a < ms = (m-1)s + s < a + (b - a) = b
```

となる。
$a, b$ を任意に取って、aより大きくbより小さい $S$ の元を得ることができた。したがって、S は$\mathbb{R}$ の中で稠密である。
【Next.js ✖️ microCMS】サクッと作った自己紹介サイトの話

## はじめに

私は25卒の文系大学生です。

現在はベトナムの受託開発企業でインターンとしてサーバーサイド開発をしています。

12月になり、リモートですが日本企業の就職面接やレジュメを出さなければいけないという事態になり、どうにかサクッとブログを作りたいなと思い、今回はmicroCMSとNext.jsを使ってブログを作りました。

## URL

サイトURL

https://my-blog-yuta-2001.vercel.app/

GithubURL

https://github.com/yuta-2001/my-blog


## Demo

花火が打ち上がっている東京の夜をイメージして作りました。
思いの外綺麗にできたなと思います。

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">休憩時間で暇だったから花火打ち上げてみた <a href="https://t.co/zzBcGyaVeK">pic.twitter.com/zzBcGyaVeK</a></p>&mdash; yuta@25卒サーバーサイド (@yuta1984421) <a href="https://twitter.com/yuta1984421/status/1734409980672201127?ref_src=twsrc%5Etfw">December 12, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 技術スタック・構成

どれも個人開発で少し触ったことがある程度で、あまり得意ではありません。
ただ、リッチなブログにはこれが最適だなと思い選択しました。
また、typescriptで書いていますが特に型安全にする必要があるようなものでもないので対して機能を生かしていません(笑)

### サーバーサイド

- microCMS

### フロントエンド

- TypeScript
- Next.js
- Prizma
- fireworks.js (花火打ち上げ)

### データベース

- PostgreSQL

### デプロイ

- Vercel

### その他

- Qiita API


## つまったこと

### QiitaのレスポンスにOG画像のリンクがない

https://my-blog-yuta-2001.vercel.app/blogs
こちらのページでQiitaで投稿している記事の一覧を表示しています。

作る前の想定では、他の人のサイトを見た時にOG画像も表示できていたので、アクセスがあった際にQiitaのAPIを叩けば良いかと考えていました。
ただどうやらAPIにOG画像のリンクは含まれないのが実装中にわかり、当初の想定が崩れました。


#### 解決した方法

##### Step 1️⃣ DBにQiitaの情報＋Qiita APIから渡ってきたURLを元にスクレイピングを実行＆DBに保存するAPIを作る
- QiitaのAPIからはブログのurlも渡ってくるので、それを元にpuppeteerというライブラリを用いてスクレイピングを実行しOGを取得
- ブログの情報とOGを合わせてblogsテーブルに保存

ただ、毎回これ全てを実行するとtimeoutが発生したりするので、QiitaAPIから渡ってくるupdated_atがDBのupdated_atより新しいもののみに対して実行するようにしました。

##### Step 2️⃣ 作ったAPIを定期的にcronで叩く (これは手動でいっかと思いやめました。)

vercelにcronの機能があったので実装しました。
ただ、Qiita更新の時に手動でやればいいやと思いやめました。
ちゃんと運用するならこちらがいいと思います。

## Next.js・Vercelの機能で驚いたこと

今回必要に応じて色々機能を調べていたのですが、Next.js・vercelで「え。これできんの。」と思ったことが何点かありました。

今回のブログ作成を通じて、単なるフロントエンド向けののフレームワークではなかったんだなと認識しました。笑
人によっては当たり前だろと思われるかもですが、ほぼサーバーサイドだけしかやっていなかった自分にとって驚きが多かった開発でした。

### API routerでapiを作れる

これほんとにすごいなと思ったのですが、だいぶ前からあるみたいですね。
APIを作れるってほとんどサーバーサイドもできるってことですね笑

https://nextjs.org/docs/app/api-reference/file-conventions/route

### Cron jobを設定できる

cronの設定をすれば任意の時間にAPI routerで作ったルートをたたけてしまうんですね。
確かNode.jsのライブラリでcron jobをコード上で作れるみたいなあった気がしますが、そんなことしないでも良いのはすごい便利だなと思いました。

https://vercel.com/docs/cron-jobs

### VercelでPostgreSQLを用いてDBを立てれる

QiitaのレスポンスにOG画像のURLがなかったときはかなり落胆しましたが、探してみるとDBを使えるとのことでこの機能を発見しました。
助かりました。

https://vercel.com/docs/storage/vercel-postgres

### 便利なORMがある

サーバーサイド向けの機能揃いすぎだろと思いました。

https://www.prisma.io/

## 最後に

わからない技術や使ったことない技術を使える個人での開発はやはり面白いなと感じました。
Next.js・Vercelの強さを改めて感じさせられました。
今度から簡単なサイトは全てNext.jsでやろうかなと思ってしまいました笑
kintone 開発環境構築メモ 2023

久しぶりに、PC を新しくしたので開発環境の設定をメモしておきます。
前回の開発環境構築メモを見ながら設定を進めました。

# 概要

開発で使っているツールがバージョンアップしていて、少し変更が必要なところもあった。
ただプラグインを開発する手順としては、大きな変化はない。
プラグインを kintone 環境にアップロードする REST API がまだ無いので、アップロードする処理は不安定なままです。

Surface Laptop 6 を待ちたかったんだが、なかなかでないのと、5 が少し安くなったので購入しました。
US キーボードが欲しいので、US Amazon から購入でした。約12日で届きました。
新製品発売直後は、上位機種の輸出ができないようなのですが、1年たって購入可能になっています。
前期種はメモリ8GB で、かなりひっ迫していたので、16GB はうれしい。

# PC セットアップ

- PC: Surface Laptop 5 
    - ディスプレイ: 13.5
    - CPU: 12th Gen Intel(R) Core(TM) i7-1265U
    - メモリ: 16GB
    - SSD: 512GB
    - OS: Windows 11 Pro
- MSアカウントで、移行
    - Onedrive から移行されたようです。
- 日本語化

# kintone 開発環境
ブラウザーやエディターなど

- Chrome, Sfari などをインストール
- git for windows　version 2.43.0.windows.1
- PowerShell 7.4.0
- nodist 0.10.3
- VSCode 
    - Japanese Language Pack for Visual Studio Code
    - Minify


```PowerShell\Microsoft.PowerShell_profile.ps1.js
# プロンプトの表示をカレントディレクトリだけにする
function prompt {
    $origLastExitCode = $LASTEXITCODE
    Write-Host (Split-Path (Get-Location) -Leaf)  -nonewline
    Write-Host " " -nonewline
    Write-VcsStatus -nonewline
    $LASTEXITCODE = $origLastExitCode
    "$('> ')"
}

Import-Module posh-git
```

# プラグイン開発環境

複数プラグインの開発を行うため、グローバルでインストールして、プラグインごとのモジュールはインストールされないように設定します。

```.ps
npm install -g @kintone/create-plugin
npm install -g @kintone/plugin-packer
npm install -g @kintone/plugin-uploader
npm install -g npm-run-all
```

- create-plugin の変更
プラグイン作成時に、不要なモジュールを展開しないように、コメントにする

C:\Program Files (x86)\Nodist\bin\node_modules\@kintone\create-plugin\dist\src\generator.js
```.js
    // (0, deps_1.installDependencies)(outputDirectory, lang);
```

fs-extra, shelljs は、プラグインの製品版から試用版等を作成するスクリプトで利用します。

```.ps
npm install -g fs-extra
npm install -g shelljs
```

ドメインの指定に、"HTTPS://" が必要になったようです。
```.ps
# Windows(PowerShell)の場合
# 環境変数へ永続的にkintoneの情報を設定する
$ [System.Environment]::SetEnvironmentVariable("KINTONE_DOMAIN", "https://<サブドメイン>.cybozu.com", "User")
$ [System.Environment]::SetEnvironmentVariable("KINTONE_USERNAME", "<ログイン名>", "User")
$ [System.Environment]::SetEnvironmentVariable("KINTONE_PASSWORD", "<パスワード>", "User")
```
MCP9701温度センサーで遊ぶ(雑(ichigojam)


x MCP9701-E/TO 販売コード 103199

参考

https://qiita.com/caa45040/items/ffeea54eecff4e52da08

x ichigojam wabでテストしたけどたぶん動く

目的
雑にプログラムする
精度は、悪い


```

5 REM MCP9701
10 A=250:REM A=ANA()
20 PRINT (((A/8)*134)-2010)/100

```
対象の要素がスクロールしたピクセル数を測るuseScrollを作成する

対象の要素がスクロールしたピクセル数を測るhooksを紹介します。どのように動作するかは以下の例を確認ください。

https://codesandbox.io/embed/4h5h7v?view=Editor+%2B+Preview&module=%2Fsrc%2FApp.tsx

対象の要素の左端からどれほどスクロールされたか、上端からどれほどスクロールされたかを受け取れます。

まずは、hooksの外形を作ります。ただ初期値`{ x: 0, y: 0 }`を返すだけのhooksを作ります。
```tsx
type Position = {
  x: number
  y: number
};

const useScroll = (): Position => {
  const [position, setPosition] = useState<Position>({ x: 0, y: 0 });

  return position;
};
```
`Position`という型で座標を表す型を作成して、`useState`で状態として提供する形です。

次に、スクロール位置を取得する方法を考えます。
スクロール位置はWeb APIの`Element`の`scrollTop`、`scrollLeft`プロパティから取得可能です。そして、スクロール位置を`position`に反映するのはスクロール単位で行いたいです。
つまり、対象の要素の`scroll`イベントが発火したタイミングで対象の要素の`scrollTop`、`scrollLeft`プロパティで`position`を更新することで達成できます。
それを反映したのが以下のコードです。
```tsx
type Position = {
  x: number;
  y: number;
};

const initPosition: Position = { x: 0, y: 0 };

const useScroll = (ref: RefObject<HTMLElement>): Position => {
  const [position, setPosition] = useState<Position>(initPosition);

  useEffect(() => {
    const { current } = ref;
    if (current === null) {
      setPosition(initPosition);
      return;
    }

    const handleScroll = () => {
      const { scrollTop, scrollLeft } = current;
      setPosition({ x: scrollLeft, y: scrollTop });
    };

    current.addEventListener("scroll", handleScroll);

    return () => {
      current.removeEventListener("scroll", handleScroll);
    };
  });

  return position;
};
```
`useScroll`の引数に`ref`を追加しました。これは以下のような型を持っています。
```ts
{
  readonly current: HTMLElement | null;
}
```
そして、対象の要素の`scroll`イベントに動作を付与したいので`useEffect`を用いて副作用を記述しました。
エフェクト関数は、`ref`から`current`を取り出して`null`の時は初期化を行います。これは、対象の要素が削除されたり、作り直されたりする場合に`position`が前回の値を保つことを防いでいます。
`HTMLElement`の時は対象の要素があるとして、`scroll`イベントに`handleScroll`を登録します。`handleScroll`は対象の要素の`scrollTop`、`scrollLeft`プロパティで`positoin`を更新します。これで、スクロールのたびに`positionの値が更新されるようになりました。そして、それらはクリーンアップのタイミングで解除しています。

以上が対象の要素がスクロールしたピクセル数を測るhooksとなります。そのまま使うこともできますし、拡張することでさまざまな事象に対応することができるので活用してみてはいかがでしょうか。
【Python】Enumって4種類あんねん

「Enum便利だぞ」と伝えるための記事。

# その1. 基本

```python
from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3


>>> Color.RED
<Color.RED: 1>
>>> Color.RED.value
1
>>> Color.RED.name
'RED'

# 値からインスタンス化できる
>>> Color(1)
<Color.RED: 1>
# メンバーの値に合致しなければValueError
>>> Color(4)
...
ValueError: 4 is not a valid Color

# イテレート
>>> for member in Color:
>>>     print(member.name, member.value)
RED 1
GREEN 2
BLUE 3
```

ちなみにメンバー変数は大文字で定義することが強く推奨されている。

[列挙型 HOWTO — Python 3.12.1 ドキュメント](https://docs.python.org/ja/3.12/howto/enum.html)

> **注釈**: Enumメンバーは大文字/小文字？
> 列挙型は定数を表すために使われるため、また mixin クラスのメソッドや属性との名前の衝突の問題を回避するため、メンバには UPPER_CASE の名前を使うことが強く推奨されており、例でもこのスタイルを用います。

# その2&3. IntEnum/StrEnum

基本のEnum型がそれぞれint, str型を継承したクラス。
派生列挙型と呼ばれている。

地味に思うかもしれないが、**これが結構便利**。
int, strそれぞれの型を前提とした値の比較やメソッドを利用することができる。

以下「# 値の比較」で示す例は`enum.Enum`クラスの場合、正しく動作しない。

## IntEnum

```python
from enum import IntEnum

class Weekday(IntEnum):
    MONDAY = 1
    TUESDAY = 2
    WEDNESDAY = 3
    THURSDAY = 4
    FRIDAY = 5
    SATURDAY = 6
    SUNDAY = 7


# 値の比較（数値として扱える）
>>> dow = 1
>>> dow == Weekday.MONDAY
True
>>> dow == Weekday.TUESDAY
False
>>> dow >= Weekday.WEDNESDAY
False
```

## StrEnum

```python
from enum import StrEnum

class Locale(StrEnum):
    JAPANESE = "ja"
    ENGLISH = "en"
    SPANISH = "es"
    HINDI = "hi"
    

# 値の比較 (文字列として扱える）
>>> locale = "ja"
>>> locale == Locale.JAPANESE
True
>>> locale == Locale.ENGLISH
False
>>> "j" in Locale.JAPANESE
True
>>> locale.startswith(Locale.JAPANESE)
True
```

# その4. Flag

あまり使われるケースは少ないかもしれないが、EnumのサブクラスにFlag型がある。
Flag型の特徴は、メンバー変数同士の集合和（ビット演算子 `|`）を用いた状態管理を行うことができる点である。

例として、会員サイトのユーザーステータスを状態するケースを考えてみる。
ユーザーステータスを状態遷移のように定義することで「有効or無効」ステータスをフラグ管理（True/False）しなくて済むメリットが生まれる。

```python
from enum import Flag, auto

class UserStatus(Flag):
    """
    ユーザーのステータスを管理する値を想定する
    1. PROVISIONAL: 仮登録
    2. REGISTERED: 登録済み
    3. BANNED: 停止中
    4. LEFT: 退会済み
    """
    PROVISIONAL = auto()
    REGISTERED = auto()
    BANNED = auto()
    LEFT = auto()

    # ビット演算子 `|` を用いて「有効でない」会員ステータスを定義する
    INACTIVE = PROVISIONAL | BANNED | LEFT
    # 裏を返せば:
    ACTIVE = REGISTERED

# 仮登録のユーザーは「INACTIVEであり」「ACTIVEではない」
>>> status = UserStatus.PROVISIONAL
>>> status in UserStatus.INACTIVE
True
>>> status in UserStatus.ACTIVE
False

# 登録中のユーザーは「INACTIVEではなく」「ACTIVEである」
>>> status = UserStatus.REGISTERED
>>> status in UserStatus.INACTIVE
False
>>> status in UserStatus.ACTIVE
True
```

Flag型ではメンバーの値に`auto()`を使うことが推奨されている。
`auto()`で生成される実際の値は2のべき乗の値となる。これによってビット演算が可能となる。

```python
for m in UserStatus:
    print(m.name, m.value)
PROVISIONAL 1
REGISTERED 2
BANNED 4
LEFT 8

>>> UserStatus.INACTIVE
<UserStatus.INACTIVE: 13>
>>> UserStatus.INACTIVE & UserStatus.BANNED
4
"""
Flag型の in 演算子はビット演算子による
(UserStatus.INACTIVE & UserStatus.BANNED) == UserStatus.BANNED
... 13 & 4 == 4
... 4 == 4
=> True
"""
```
||演算子の短絡評価の罠：甘く見ると痛い目見るぞ！！

## はじめに
**短絡評価**という言葉を聞いたことはありますか？
JavaScriptの`||演算子`が絡む条件文で、この特性を理解しておらず、意図しない結果になってしまったことがあります。
実際のコード例を通して、`||`の挙動や、これにまつわるドモルガンの法則などを解説します。
私と同じようなプログラミング初心者の方の参考になれば嬉しいです。

### 自己紹介
私は2023年9月1日にフロントエンドエンジニアとして自社開発のSaaS企業に入社しました。
未経験独学で、薬剤師からの転職です。
詳しくはこちらをご覧ください。

https://qiita.com/odendayoko/items/f616b2f1952897a9af5d

## 具体例で説明
### 背景
実務で条件の判定に関してリファクタすることになり、元のコードをもとにどのように書くかを検討していました。
元のコードと同じ意味になるように書き換えたつもりでしたが、実際は意味が変わってしまい意図しない挙動になってしまいました。

### 問題
こちらが元のコードです。
```react
!['野球部', 'サッカー部'].includes(user.club)
```
`user.club`が`['野球部', 'サッカー部']`に含まれていたら真です。
`!`で打ち消しているため、全体としては`user.club`が野球部またはサッカー部ではない場合に真となります。

これと同じ意味になるように、`includes`を使わずに書く方法を考えてみました。
```react
user.club !== ('野球部' || 'サッカー部')
```
一見良さそうではないですか？
[`||(論理和）`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_OR)を使って、「野球部またはサッカー部ではない場合に真となる」が表現できていそうです。

しかし、これ**大間違いです**。
プログラミングに慣れている方でしたら、違和感と間違いにすぐ気づくと思います。

このままだと、`user.club`が野球部の場合は問題なく偽と判定されるのですが、`user.club`がサッカー部の場合に真になってしまい、条件を満たさなくなってしまいます（`user.club === 'サッカー部'`のときfalseにならない）。

### 短絡評価の罠
この理由は、`||`が**短絡評価**だからです。
短絡評価の場合、`||`の左側がtrueの場合は、右側の値を見る(評価する)必要はないため、右側の値を評価せずにそこで終了します。

今回の場合、`'野球部'`は文字列なので、常にtrueと判定されます。
よってそこで判定が終了し、右側の`'サッカー部'`は評価されることがありません。

短絡評価ということを忘れ、`user.club`が`||`の左右両方の項にかかってくると思いこんで書いてしまっていました。これでは同じ意味になりません😢

### 解決
ではどのように書けば良いのでしょうか。
愚直に条件を書きましょう。
以前学んだ[**ドモルガンの法則**](https://future-architect.github.io/typescript-guide/primitive.html#id4)も使って2種類の書き方で書いてみます。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537832/a52cb16b-252a-30a9-c5c1-a494a948fa77.png)

```react
user.club !== '野球部' && user.club !== 'サッカー部'

!(user.club === '野球部' || user.club === 'サッカー部')
```
これで`!['野球部', 'サッカー部'].includes(user.club)`と同じ、野球部またはサッカー部ではない場合に真という条件になりました。


## 終わりに
結局、書き換えの案を考えましたが、元のコードの方がわかりやすかったので変更しないことになりました。同じ意味でも色々なアプローチの仕方があるのは面白いです。

`||`は短絡評価ということを知識として知っていても、実際にコードを書いてみると理解できていないなと感じることが多々あります。知識が身につくまで、繰り返し書いていくしかないですね！

今回、条件に使う値を実際の実務よりも簡単な値に置き換えて記事を書きましたが、簡単な文字列に置き換えてみると文法が理解しやすいと思いました。置き換えてテクニックは実務に活かすとコードの見通しが良くなりそうなので、使ってみようと思います。
MCP9701温度センサーで遊ぶ(雑プログラミング)


x MCP9701-E/TO 販売コード 103199

https://qiita.com/caa45040/items/de6e91a09cbe30c62840

MCP9701温度センサーで遊ぶ(雑プログラミング)


x 精度は、かなり悪い

目的
出来る限り簡素化した

温度係数　19.5mV
0点　400mV



![o_cop855.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7613b62c-aeb7-9fa6-555d-722e1626ad1f.jpeg)



```c++


//S_SER_9701_O6_031_1

//インクルド
#include <Arduino.h>
#include <HardwareSerial.h>


//初期化
void setup()
{

  delay(3000); //not delete

  //シリアルの初期化
  Serial.setTx(PA2_ALT1);
  Serial.setHalfDuplex();
  Serial.begin(9600);

} //setup


//メインループ
void loop()
{

  //アナログ値の読み込み
  int s = analogRead(PB7);   // PIN1

  //s=250;

  //温度の表示
  Serial.println( (((s/8)*134)-2010)/100 );

  //1秒の待ち
  delay(1000);

} //loop


```
Amazon Bedrockの活用例：Titan Image Generator G1を使ったサンプルアプリケーション

本記事は [Amazon Bedrock Advent Calendar 2023 by ナレコム](https://qiita.com/advent-calendar/2023/bedrock-knowledgecommunication) の12日目の記事です。

Amazon Bedrock Advent Calendar 2023 by ナレコム ではAmazon Bedrockの基本的な概要から具体的な各モデルの作り方や事例紹介などを行っていきます。

### はじめに

Amazon Bedrockは多くのサンプルアプリケーションを提供し、ユーザーがPlayground上で実際に試すことができるように設計されています。

今回は2023年12月現在33個公開されているExamplesの内、 **Titan Image Generator G1 - Express** の3つを紹介します。記事では、これらの例のプロンプトとレスポンスをわかりやすく日本語で紹介します。

**記事はわかりやすさを優先してプロンプトやレスポンスを日本語にしておりますが、2023年12月時点ではTitanは英語でのみ動作します。**


### 例１）テキストから画像を生成
このプロンプトは自然言語からリアルな画像を生成する。

実行すると、入力された文章に合わせて3つの画像が生成されます。

:::note info
**プロンプト**
テーブルの上の青いリュックサック（blue backpack on a table）
:::

:::note warn
**レスポンス例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/089644ab-f382-a385-d67c-38d6930f51a9.png)
:::

### 例２）画像からバリエーションを生成
入力画像のバリエーションを生成します。

先程と異なり、ベースとなる画像も追加して実行すると、類似する画像が3つ生成されます。
この場合、プロンプトより画像が優先されるようです。例えばプロンプトに「紙袋」とすると入力した画像のリュックサックが紙素材になります。

:::note info
**プロンプト**
テーブルの上の青いリュックサック（blue backpack on a table）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/089644ab-f382-a385-d67c-38d6930f51a9.png)
:::

:::note warn
**レスポンス例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/0616b769-45c2-f149-223f-bda887771108.png)
:::

:::note info
**プロンプト**
紙袋（paper bag）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/089644ab-f382-a385-d67c-38d6930f51a9.png)
:::

:::note warn
**レスポンス例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/41fef829-dc82-b8b8-d369-186ee2bcdf80.png)
:::

### 例３）インペインティングを使った入力画像のオブジェクト置換

入力画像の選択範囲にある色を変更します。

:::note info
**プロンプト**
リュックサックを金色にする（Change backpack to gold）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/6d11b9bd-666f-d22a-ea62-d0832d013fa9.png)
:::

:::note warn
**レスポンス例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/922813ae-be63-6afc-170f-03e4984587f1.png)
:::

### まとめ

この記事では、Amazon BedrockとそのPlayground上で利用できるTitan Image Generator - Expressを用いたサンプルアプリケーションの実例を紹介しました。画像生成だけでなく入力した画像をベースとした画像生成や色の置換という3つの具体的な事例を通じて、Titanの幅広い応用可能性を探求しました。

---

また、ナレッジコミュニケーションでは  **「[Musubite](https://recruiting.musubite-job.com/features/company/knowledge-communication)」** というエンジニア同士のカジュアルトークサービスを利用しています！この記事にあるような生成AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！

https://recruiting.musubite-job.com/features/company/knowledge-communication