OmniAICreator/Qiita-1.07M huggingface dataset:
【chatGPT 対話備忘録】ソートアルゴリズムの基本

# 私：
ITのソートを簡潔にまとめてください
# ChatGPT:

ITにおけるソート（Sort）は、データを特定の順序に並べ替える処理です。代表的なソート手法は以下の通りです：

### 基本的なソートアルゴリズム
##### バブルソート
隣接する要素を比較し、交換しながら並べ替えます。

時間計算量: O(n²)
##### 選択ソート
未整列部分から最小（または最大）要素を選んで順に並べ替えます。

時間計算量: O(n²)
##### 挿入ソート
要素を順に取り出し、適切な位置に挿入します。

時間計算量: O(n²)
### 効率的なソートアルゴリズム
##### マージソート
分割してから統合する分割統治法を使用します。

時間計算量: O(n log n)
##### クイックソート
基準値を決め、左右に分割し再帰的にソートします。

時間計算量: 平均 O(n log n)
##### ヒープソート
ヒープ構造を用いて最大（最小）値を順に取り出します。

時間計算量: O(n log n)
#### その他のソート
##### シェルソート：挿入ソートを改良した手法
##### 計数ソート：整数を対象とし、分布に基づいてソート
<br><br>用途やデータ量に応じて適切なアルゴリズムを選択することが重要です。






# 私:
これらの詳細な説明をお願い
# ChatGPT:

ITにおける代表的なソートアルゴリズムについて、詳細な説明と特徴を解説します。

### 1. バブルソート（Bubble Sort）
##### 概要
隣接する要素を比較し、順序が逆なら交換することを繰り返します。
これにより、最も大きい（または小さい）要素が毎回最後に「浮かび上がる」ように並びます。

##### 手順
配列の先頭から隣接する要素を比較し、必要に応じて交換する。
配列の最後まで繰り返し、最後に最も大きい（小さい）要素を確定する。
ステップ1と2を、未整列部分がなくなるまで繰り返す。
##### 時間計算量
最悪の場合: O(n²)
平均の場合: O(n²)
最良の場合: O(n)（既に整列されている場合）
##### 特徴
実装が容易だが、大規模データには非効率。
安定ソート（同じ値の順序が維持される）。
### 2. 選択ソート（Selection Sort）
##### 概要
未整列部分から最小（または最大）要素を選び、順番に並べていく方法です。

##### 手順
未整列部分から最小（最大）要素を探す。
最小（最大）要素を未整列部分の先頭と交換する。
未整列部分を縮小し、全ての要素が整列するまで繰り返す。
##### 時間計算量
最悪の場合: O(n²)
平均の場合: O(n²)
最良の場合: O(n²)
##### 特徴
比較回数が固定であり、データの順序に依存しない。
安定ではない（同じ値の順序が崩れることがある）。
小規模データには適するが、大規模には不向き。
### 3. 挿入ソート（Insertion Sort）
##### 概要
要素を順番に取り出し、正しい位置に挿入しながら整列させる手法です。

##### 手順
2番目の要素から順に取り出し、左側の整列済み部分に適切な位置を見つけて挿入する。
これを最後の要素まで繰り返す。
##### 時間計算量
最悪の場合: O(n²)
平均の場合: O(n²)
最良の場合: O(n)（既に整列されている場合）
##### 特徴
小規模データに適している。
安定ソートであり、データがほぼ整列済みなら高速。
### 4. マージソート（Merge Sort）
##### 概要
分割統治法を用いたソートアルゴリズム。データを分割し、それぞれを整列した後、統合（マージ）する。

##### 手順
配列を半分に分割し、再帰的に分割を繰り返す。
分割が1要素になるまで繰り返す。
分割された要素を順にマージし、整列しながら統合する。
##### 時間計算量
最悪・平均・最良の場合: O(n log n)
##### 特徴
安定ソート。
再帰を用いるため、メモリ消費が多い。
大規模データや外部ソートに向いている。
### 5. クイックソート（Quick Sort）
##### 概要
基準値（ピボット）を選び、ピボットより小さい要素と大きい要素に分割し、再帰的にソートする分割統治法。

##### 手順
ピボットを選ぶ。
ピボットより小さい要素を左、大きい要素を右に分ける。
左右の部分を再帰的にクイックソートでソートする。
##### 時間計算量
最悪の場合: O(n²)（分割が偏った場合）
平均の場合: O(n log n)
##### 特徴
高速で実用的。
不安定ソート（同じ値の順序が崩れることがある）。
ピボットの選び方が効率に影響する。
### 6. ヒープソート（Heap Sort）
##### 概要
ヒープ構造（最大ヒープまたは最小ヒープ）を使って整列するアルゴリズム。

##### 手順
配列をヒープ構造に変換する。
最大（最小）値を取り出し、末尾と交換する。
残りの部分を再びヒープにし、手順2を繰り返す。
##### 時間計算量
最悪・平均・最良の場合: O(n log n)
##### 特徴
不安定ソート。
補助メモリが不要で、メモリ効率が良い。
大規模データに適している。
### その他のソート
##### シェルソート（Shell Sort）

挿入ソートの改良版。要素間隔を徐々に狭めて並べ替える。
時間計算量: 平均 O(n log n)（間隔の選び方による）
##### 計数ソート（Counting Sort）

整数データを対象とし、出現回数に基づいて整列する。
時間計算量: O(n + k)（kは整数の範囲）
### まとめ

| **アルゴリズム** | **時間計算量**   | **安定性** | **用途**                          |
|------------------|------------------|------------|-----------------------------------|
| バブルソート     | O(n²)            | 安定       | 小規模データ                      |
| 選択ソート       | O(n²)            | 不安定     | 小規模データ                      |
| 挿入ソート       | O(n²)            | 安定       | 小規模、ほぼ整列済みデータ        |
| マージソート     | O(n log n)       | 安定       | 大規模データ、外部ソート          |
| クイックソート   |  O(n log n)  | 不安定     | 高速、大規模データ                |
| ヒープソート     | O(n log n)       | 不安定     | 大規模データ、メモリ効率が良い    |
AI-OCRサービスの今後​　～AI-OCRサービスの誕生から、次のステップへ～

　コラムをご覧いただきありがとうございます。​​
　ニッセイ情報テクノロジー株式会社　プロダクト・サービス事業推進室の川崎と申します。普段は、当社におけるプロダクト・サービス事業の開発およびプロジェクトマネジメントを中心に担当し、自社製品の販売活動（製品説明やデモンストレーションなど）も担当しております。​


　今回のコラムとして、 AI-OCR技術を用いた自社開発プロダクトに関して、現在のプロダクトライフサイクルも交えた展望と、次へのステップについて、個人的に思っている事を記事にさせて頂きます。​​


## 1. AI-OCRの歴史 ​

### どういった仕組みか？（概要） ​

　AI-OCR（Optical Character Recognition）は、紙に書かれた文字や印刷された文書をスキャンし、デジタルデータとして認識・変換する技術です。AI技術を取り入れることで、従来のOCRが苦手とした非定型帳票や手書き文字や複雑なレイアウトの認識精度を大幅に向上させました。特にディープラーニング技術を活用し、専門用語対応や多言語対応や文脈を理解した文字認識が可能になっています。 ​


### なぜ、AI-OCR技術が生まれたのか？ ​

　デジタル化の進展により、紙媒体に依存した業務プロセスの効率化が強く求められるようになりました。金融機関や医療機関などでは、大量の書類を迅速かつ正確に処理するニーズが高まり、AI-OCR技術がこの課題を解決する手段として注目されました。AI-OCRは従来型OCRの弱点を補う形で進化し、業務効率の向上やコスト削減に大きく貢献してきました。​


## 2. AI-OCRサービスとは ​

### どのようなことができるのか？ ​

AI-OCRサービスは、書類のスキャンからデータ抽出・整形までのプロセスを自動化します。これにより、契約書や請求書、アンケート用紙などさまざまな形式の文書データを迅速にデジタル化し、他のシステムと連携することが可能です。 また我々が提供するAI-OCRサービスには領収書や診療明細書、人間ドック検診票など非定型帳票を保険事務に利用できるようデジタルデータ化し、これまでの人手の入力負荷軽減にしっかりとリーチするようサービス提供を行っています。​


### 利用者はどのような恩恵を受けたか？ ​

　利用者は、手作業でのデータ入力にかかる時間とコストを大幅に削減することができました。また、ヒューマンエラーのリスクが低減されることで、業務の正確性が向上しました。特に、膨大なデータを迅速に処理する必要がある業界や専門性に特化した（例えば医療用語など）帳票では業界用語内での表記ゆれが起こりうるため、AI-OCRは「業務効率化の鍵」として高く評価されています。​


## 3. プロダクトライフサイクル ​

### AI-OCRは業界的に見てどのあたりか？ ​

　AI-OCRは現在、プロダクトライフサイクルの「成熟期」に位置していると個人的には考えます。多くの企業で採用され、一定の市場規模を形成しましたが、新規参入者の増加や技術のコモディティ化により、成長率が鈍化してきています。 また日本ではマイナンバーカードの利活用が促進され、今まで紙出力していたデータがデジタル化されることで、紙媒体からの読取という作業も少なくなる事も予見できます。​


### 成熟期の抱える悩み ​

　成熟期の製品が抱える課題は、差別化とコストのバランスです。AI-OCR市場では競争が激化しており、価格競争の中で付加価値を提供し続けることが求められています。また、新技術である生成AIの登場によって、AI-OCRの将来性に疑問が投げかけられることもあります。​


## 4. 次の代替プロダクトへの視点移動 ​

### 最新技術の速さ ​

　生成AIは、自然言語処理やデータ生成の分野で飛躍的な進化を遂げています。これにより、従来のAI-OCRが担っていた領域を代替する可能性が出てきました。特に、文脈を理解してデータを処理できる生成AIは、単純な文字認識を超えた価値を提供します。​


### 生成AIとAI-OCRとの融合 ​

　AI-OCRのノウハウを活用し、生成AIとの融合を図ることで、より高度なサービスを生み出せる可能性があります。例えば、文書データを認識するだけでなく、そこから重要な情報を抽出し、洞察を生成するような新たなサービスが考えられます。AI-OCRは、その基盤技術として次のステップに繋がるポテンシャルを秘めています。​


## 5. おわりに​

### プロダクト収束への踏み切り ​

　AI-OCRサービスは成熟期に達し、一定の役割を果たしてきましたが、生成AIの登場により、次なる時代に向けた変化が求められています。AI-OCRの市場は縮小傾向にあるものの、その開発過程で培われた技術とノウハウは、次のプロダクト開発の大きな資産となります。ただ手塩に掛けたプロダクトが巣立って（収束）いくのは悲しい気持ちになり、なかなか収束への踏み切りに至らないのが世の常なのではないでしょうか。しかしそこは心を鬼にして、次のプロダクトへの力に変えていき、AI-OCRと生成AIやAIエージェントとを掛け合わせる事で、新しいプロダクトへ視点を移していく事が必要となります。 ​


### 今後の新たなプロダクト開発へ意気込み ​

　私たちはAI-OCRで築いた基盤とAIモデルを内製化開発した組織のケイパビリティを活かしながら生成AIとの融合を視野に入れ、業務効率化を更に加速させる、プロダクトの開発に取り組んでいきます。​
生成AIでおまじないを作ってみた

こんにちは。
アドベントカレンダー16日目です。

技術系の記事が続いてますね。
いわゆる技術系ではないので、何を書こうか悩んでいたのですが
「ゆるふわな記事でも大丈夫です！」という発案者の言葉を信じて
ここいらでよもやま話でも。

＊＊＊

生成AI流行ってますね。
どう使うか、業務にいかに適用させるか調査研究も盛んですね。

自分も資料作成や文章の要約、マクロの作成など試行錯誤で一通りの
ことは試してきました。

＊＊＊

ある日ですね、所属内で打合せがあるので資料の取りまとめをしていました。事前に締切案内をしていたのですが、予想通り誰も更新をしていませんでした。
（それを見越して早めの期日設定をしています）

普通に声がけしてもつまらないし、かといってキレてみるのもなんだかなぁと思いつつ、やる気にさせる方法を思案していたところ
突然ひらめいたのです。

「そうだ。おまじないだ」と。
子供の頃、無くしたものが出てくるおまじないとかありましたよね。
生成AIだったら、やる気にさせるおまじないも作れるんじゃないかと。
弊社にもChatGPTのような生成AIを利用できるアプリケーションがありまして、早速おまじないを生成してみることにしました。

'--------------------------------------------------'
***プロンプト：***
 　　期限をすぎて対応しない人に向けて、すぐに処理をするおまじな
　　いを出してください。


***回答：***
 　　以下は、対応が遅い人に向けたすぐに処理をするおまじないです。

　　 「急げ時間よ、飛び越えて至れ！
 　　この呪文の力で、速やかな対応を！
 　　遅れを取り返し、期限を守れ！」

　　 このおまじないを唱えると、対応が遅かった人が
   　　 目を覚ますようになり、
　　 迅速な処理をするようになるかもしれません。
　　 ただし、おまじないはあくまで遊び心の一環であり、
　　 実際の効果を保証するものではありません。

'--------------------------------------------------'

おお！できました。おまじない。
しかもなんかいい感じ。ガード文言までついてます。

できたてほやほやのおまじないをダメ元で使ってみることにしました。

'--------------------------------------------------'
***メール送信（自分）：***

　　　Aさん　Bさん　Cさん

　　　すみません、明日なんですけれども


　　　以下は、対応が遅い人に向けたすぐに処理をするおまじないです。
　　　「急げ時間よ、飛び越えて至れ！
　　　この呪文の力で、速やかな対応を！
　　　遅れを取り返し、期限を守れ！」
　　　このおまじないを唱えると、対応が遅かった人が目を覚ますよう
　　　になり、迅速な処理をするようになるかもしれません。ただし、
　　　おまじないはあくまで遊び心の一環であり、実際の効果を保証
　　　するものではありません。

'--------------------------------------------------'
するとどうでしょう。

'--------------------------------------------------'
***メール受信（Aさん）：***

　　　おまじないききました！
　　　更新しました！


***メール送信（自分）：***

　　　生成AIすごいな…


***メール受信（Bさん）：***

　　　更新しました！すでにエージェント型なのかもしれません！

'--------------------------------------------------'

・・・。

即効で効果がありすぎて、こっちがびびりました。

すごいですね。生成AI。
こんなコミュニケーションの手段としても使えるのです。

ちなみに。Cさんには効きが悪く、会議の1時間前にようやく効きました。
今度呪っ、、いやいやいけませんね。。

言わずもがなですが、補足しておきますとAさん、Bさん、Cさん、お客様向けにはしっかり対応しています！
社内だと気が緩んじゃうのかな？
まぁ、楽しい職場です！

ではお後がよろしいようで。
rspecでスタブの中身を自由に実装したい場合

スタブとして定数を返すのではなく、そのとき渡された引数に応じて独自に別メソッドを実装して戻り値を返したい場合にどうするか。

例えば、金額を受け取って返金額を返す`refund!` というメソッドがあったとする。

```ruby
# 呼び出し例
payment.refund!(10000)
```

この`refund!`をテスト内でスタブ化したい場合、通常であれば下記のような実装が考えられる。

```ruby
let(:refund_price) { 2000 }
before do 
  allow_any_instance_of(Payment).to receive(refund!).and_return(refund_price)
end
```

しかし、テストごとにrefund!が違う引数で呼ばれる場合、その都度`let`で`refund_price`を定義する必要があり大変面倒になる。

そこで`refund!`の中身を独自のシンプル実装で代替したい場合には、`receive`メソッドにブロックを渡してやることで実現できるようだ。

```ruby
allow_any_instance_of(Payment).to receive(refund!) {|_, param| param*0.2 }
```

ブロック引数の第一引数がレシーバ自体のインスタンス（この場合は`Payment`のインスタンス）、第二引数以降が`refund!`に渡される引数らしい。

上のように書くと、例えば

```ruby
ret1 = payment.refund!(10000)
ret2 = payment.refund!(20000)
```

という処理について、`ret1`には`2000`、`ret2`には`4000`が格納されるようにシミュレートできる。
暇つぶしゲーを作ってみた話

## はじめに
皆さんは外で暇つぶしに何をしてますか？
まあ大多数のやつがゲームをしたり、SNS見たりだったりスマホいじってると思います。
ということで、早いもので一年前に大流行した**某果物系パズルゲームを約1000時間やり込んだ**変な人が、暇つぶしに使えなくもなさそうなエンドレスゲームを作ってみたので拙筆ながら記事にしていこうと思います。
~~まあ今んとこスマホでできないからゴミなんだけどね☆~~

:::note warn
**あとこの記事大急ぎで作ったのでクオリティが最低です。ご容赦ください。**
それと未完成なため更新する可能性があります。
:::

## 概要
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941126/64231b7b-1bd0-8053-946a-c14766f84cb6.png)
ひたすら背景が流れてくるタイプのアクションゲームってかジャンピングゲーム
### ゲームルール
1. もちろん落ちたら終了
2. 時間経過で上のゲージが減っていって無くなると死
3. 画面の黄色いのに触れればスコア増加、青に触れるとゲージが増える
4. ゲームが続けばスクロール速度上昇＆ステージがむずくなる
### ステージ生成について
完全ランダムで生成すると、まあ一定の確率で地獄が出現するのは想像に難くないですよね...
ということで、ちょっと~~誰でもできる~~工夫してみました。![stage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941126/b19daa05-4585-ae61-9ff8-0c3428648dff.png)
こんな感じでステージを分割して連続生成することで、詰みパターンの出現を防いでいます。
あとステージの難易度上げるのも簡単。死にやすいステージの出現率上げればいいだけだからね。
### スコア集計
![スクリーンショット 2024-12-12 13.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941126/668058e9-d113-9eba-191f-393d584245cb.png)
最初にちょこっとだけ触れた果物のゲームっぽい感じでデイリー、月刊ランキングも作った。
スコアだけでなく移動距離のランキングも実装。
## ブラウザゲー化計画（仮）
冒頭でも触れたようにスマホでもプレイできたらいいなと思って~~かは知らず~~、ブラウザゲーとしてネットに上げたい。

ということで、JSONファイルで保存していたスコアとか音量設定とかをCookieで保存する機能とかその他諸々を作成、localhost上では正常に動作するようになりました。

せっかくWEBに上げるならオンラインランキングも作りたいし、タッチ操作に対応とかそういうのもあるので、全部完成したらもしかしたら公開するかもです。

まあその辺（データベースとか）の知識には疎いんでしばらく時間がかかりそうです。。。

## 終わりに
なんかよくありそうなジャンピングゲームを作ってみたって話でした。

飽きないようになるべく多くのギミックを搭載したつもりですが。まだまだボリューム不足感が否めない。
というわけで、何か思いついたら新ギミック追加していくつもりです。

オンライン版制作中。多分いつかは公開しますのでもし機会があれば遊んでやってくれると嬉しいです。

~~あとみんなの記事クオリティ高すぎて泣いた。~~
mruby/cで温度のデータをLoRaで送信する

# はじめに
普段あまりRubyのコードを書くことが無いのでたまにはRubyのコードを書いてみます。

# 使用品
RBoard

https://www.chip1stop.com/products/Shimane-Johoshori-Center-Inc./RBoard_PIC32_SMD_v2.1.0_1.0/SMNE*0000001?keyword=RBoard_PIC32_SMD_v2.1.0_1.0

E220-900T22S

https://www.switch-science.com/products/9278

センサーにはLM61CIZを使用します。
LM61CIZを接続するためにブレッドボードとジャンパ線もあるといいです。

受信機には何かパソコンのようなものとE220のUSBモジュールを使用します。

# RBoard
ファームを3.3.1へアップデートしてください。

https://github.com/YoshihiroOgura/pic32mx170_mrubyc/releases/tag/v3.3.1

MPLAB SNAPまたはpickitなどが必要です。
ファームを最新にした場合開発環境も最新のものを使用する必要があります。
と思ったけれど逆に最新のものしか提供されていなかった、、

# E220-900T22S
出荷時のデフォルト値が`00 00 62 00 0F 03 00 00`となっています。
はじめの2バイトがアドレスなので初期状態では0です。
今回は1:1の送受信を予定しているので片方は必ずアドレスを変更する必要があります。
トランスペアレント送信モードと固定送信モードがあり1:1の通信をするためには固定送信モードにする必要もあります。
送信側をアドレス1で受信側をアドレス2へ設定しておきます。

`C0 00 06 00 01 62 00 0F 43`
C0:書き込み命令
00:スタートアドレス
06:書き込みバイト数
0001:アドレス1番
62000F:その他設定
43:0x40が固定送信モード

![e220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195542/4a6d7e1a-36b2-3128-0415-f476a5bfd37d.png)


RBoardにプログラムを書き込んで設定します。

```setup.rb
dev = UART.new( 2, rxd_pin:13, txd_pin:14, baud:9600 )
sleep(1) # E220の起動待ち
dev.write("\xC0\x00\x06\x00\x01\x62\x00\x0F\x43")
```

# LM61CIZ
温度の値を電圧値で返してくれる扱いやすい温度センサーです。
0℃の時0.6Vの出力でマイナスの温度だったとしてもプラスの電圧値で出力してくれます。

(出力電圧[V] - 基準電圧[V]) * 100倍 = 温度[℃]
(0.85[V] - 0.6[V]) * 100 = 25℃
(0.35[V] - 0.6[V]) * 100 = -25℃

![LM61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195542/02b22622-7c8d-81f9-9b98-ff02032165e1.png)


```temp.rb
# 0番はLEDにつながってるので本当はお勧めしない
adc = ADC.new( 0 )
while true
  v = adc.read()
  temp = (v - 0.6) * 100
  puts(temp)
  sleep(1)
end
```

# 温度の送信プログラム

```temp.rb
adc = ADC.new( 0 )
dev = UART.new( 2, rxd_pin:13, txd_pin:14, baud:9600 )
sleep(1) # E220の起動待ち

while true
  v = adc.read()
  temp = (v - 0.6) * 100.0
  puts(temp)
  
  send_txt = "\x00\x02\x0F"
  bcd = sprintf("%04d", (temp * 100).to_i)
  send_txt << bcd[0,2].to_i(16) << bcd[2,2].to_i(16)
  dev.write(send_txt)
  
  sleep(60)
end
```

# 受信側プログラム

今回ラズベリーパイを使用したのでたまたまライブラリがそろっていたpythonで書きます。
[Rubyで書くとは、、](#はじめに)
たぶんラップトップやデスクトップのPCでも同じコードで動くと思います。

```main.py
import serial
import binascii
from serial.tools import list_ports

ports = list_ports.comports()
devices = [ info.device for info in ports ]
print( devices )
ser = serial.Serial(devices[0], 9600)

while( True ):
  byte_txt = ser.read( 2 )
  txt = binacii.hexlify( byte_txt )
  data_txt = txt.decode("ASCII")
  print("temp : " + data_txt[0:2] + "." + data_txt[2:4])
```
Power Apps Switch 関数でフィルターを切り替える

## はじめに
BizOptimars の いのうえ です。
今回は、Power Apps で Switch 関数を使用して、ラジオボタンでフィルターを切り替えてみました！

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

## 用意したもの
SharePoint Lists を 1 つ用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/3324c25a-e195-43bc-49d1-fe003234fe45.png)

| 列名 | データ型 |
|:-:|:-:|
| タイトル  |  テキスト |
| DueDate  | 日付  |
| Status  | 選択肢  |

## フィルターの設定
では、Power Apps へ移ります。
タスクリストを接続して、ギャラリーに表示しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/fdd53622-e992-bd88-1ec5-160fad31208a.png)

ラジオボタンを挿入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/41c370ed-d5cc-f5e3-0ec9-39d98d555e1d.png)

ラジオボタンの Items プロパティを以下に変更します。
```
["未着手","着手中","完了"]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/6e0ca5f0-e038-d8b2-2a75-3842823852fb.png)

ラジオボタンを横並びにしたい場合は、Layout プロパティを以下に変更し、サイズを横に広げると画像のようになります。
```
Layout.Horizontal
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/c12d464d-16b4-2aef-3027-77ec424a6650.png)


既定値は 未着手 にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/e544c357-56f8-939e-6d0f-551493edd7d7.png)

ラジオボタンで選んだ値によって、フィルターを切り替えるように設定していきます。
ギャラリーの Items プロパティを以下に変更します。
```
Switch(
    Radio1.Selected.Value,
    "未着手",
    Filter(
        タスクリスト,
        Status.Value = "未着手"
    ),
    "着手中",
    Filter(
        タスクリスト,
        Status.Value = "着手中"
    ),
    "完了",
    Filter(
        タスクリスト,
        Status.Value = "完了"
    )
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/72e54b5f-d998-5868-59cb-d2899e76d111.png)

これでアプリを再生してみますと、フィルターの切り替えができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/b05536eb-4f6c-eed0-1d52-1e126321bd1c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/4a355293-dbda-d979-dde9-aab7b51ccb44.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/2eafe984-6b6b-8589-de83-d57c9acd3b97.png)

## おわりに
Switch 関数は、複数の条件に基づいて異なる結果を返すのに便利です。最初はシンプルな例から始めて、徐々に複雑な条件を追加していきましょう！
初心者がExpo + React Nativeでとりあえず1画面動かしてみた話

### はじめに
React NativeとExpoを使って、モバイルアプリを作り始めてみました。
とりあえず「1機能」程度のものでも自分のスマホ上で動けばモチベーションが上がるはず！
ということで、環境構築から簡単な画面表示までをサクッとまとめます。

### 環境
- Expo (Managed Workflow)
- React Native
- VSCode (Windows環境でWSL2を使用)
特にカスタム構成はしていません。`npx create-expo-app`でプロジェクトを作り、そのまま開発を始めました。

### やったこと
- プロジェクトを作成
```
npx create-expo-app my-app
cd my-app
npm install
```

- 開発サーバー起動
```
npx expo start
```
ブラウザに「QRコード」が表示されます。
スマホにExpo Goアプリを入れてQRコードを読み込むと、スマホ上でアプリが立ち上がりました！

- 1機能分の画面追加
`app`ディレクトリ内に新しい画面コンポーネントを`index.tsx`として配置し、簡単なテキストとボタンを並べてみます。
```
// app/index.tsx
import { View, Text, Button, StyleSheet } from 'react-native';
import { useRouter } from 'expo-router';

export default function IndexScreen() {
  const router = useRouter();

  return (
    <View style={styles.container}>
      <Text style={styles.text}>Hello World!</Text>
      <Button title="次の画面へ" onPress={() => router.push('/next')} />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#fff',
  },
  text: {
    fontSize: 20,
    marginBottom: 20
  }
});

```
このように書くと、アプリ起動時に「Hello World!」と「次の画面へ」ボタンが表示されるようになりました。
- 別の画面を用意して遷移
`app/next.tsx`を追加して、ボタンタップ時に遷移できるようにします。
```
// app/next.tsx
import { View, Text, StyleSheet } from 'react-native';

export default function NextScreen() {
  return (
    <View style={styles.container}>
      <Text style={styles.text}>これは次の画面です。</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#fff'
  },
  text: {
    fontSize: 20
  }
});

```
これで「次の画面へ」ボタンを押すと`/next`画面へ移動することができます。
Expo Routerを使うことで、ディレクトリ構成に従った自動的なルーティングができて便利でした。

### ハマったポイント
ホットリロードが効かない時がありましたが、`npx expo start --clear`でキャッシュをクリアするとすぐ直りました。
`react-native`から`Picker`が使えない等、APIが分離されているケースに遭遇。公式ドキュメントで確認し、`@react-native-picker/picker`を別途インストールすることで解決。

### まとめ
今回はほんの最初の一歩として、Expoプロジェクトを立ち上げて、1つの機能（ここでは簡単なテキストとボタン表示＆画面遷移）を実現してみました。
まだまだ足りないところは山ほどありますが、「実機で画面が動く」状態にできると、次のステップへのモチベーションが上がります。

今後はUIを整えたり、データ保存、API連携などにも挑戦していく予定です。
SaaSをトライアル検証する際に確認しておきたいこと

## はじめに
この記事ではSaaS(勤怠管理、パスワードマネージャ...etc)を検証時に確認しておきたいことをまとめたいと思います。
SaaSサービスの導入を担当している方に少しでも参考になればと思います。

### 1. 解決したい問題・導入後の状態を明確にしておく
SaaS自体の導入が目的にならないように、解決したい問題をまずは明確にするとよいです。
例えば、勤怠管理システムの場合だと
- 問題: 勤怠情報と給与情報をそれぞれ手動で計算しており、担当者の負荷が大きい。また計算ミス時の影響が大きい

- 導入後の状態: ユーザがシステム上で打刻した勤怠情報により、給与情報が自動で計算される

### 2. いくつかの製品を比較する
導入候補がいくつかある場合は比較検討しましょう。
他の人にもわかりやすいように表形式でまとめるのがおすすめです！

| | 製品A |製品B  | 製品C |
|---|---|---|---|
|機能X  |  |  | |
|機能Y  |  |  | |
|価格  |  |  | |

UXや機能の詳細については使ってみないとわからないこともあるため、調査時間を決めて明らかにできなかった部分はトライアル等で確認するのがおすすめです！

### 3. トライアルで検証する期間・課金体系・トライアル終了後の状態を確認しておく
- **期間**
SaaSによりますが２週間～1か月のものが多く、休日を除くと10日ほどしか検証期間がないものもあります。
また再トライアルは不可な場合が多いので、複数の製品をトライアルする計画であれば並行して検証するのがおすすめです。
- **課金体系**
トライアル終了後に"自動で有償プランへ移行される", "有償機能が無効になる"等、SaaSにより異なるので想定外の課金が発生しないように事前に確認しておきましょう。
- **トライアル終了後の状態**
1の"解決したい問題"、"導入後の状態"を満たすことができるかのチェックリストを作成おくとよいです。
また"検証のレビュー"等が必要な場合は、事前に予定を入れておきましょう。期限ギリギリにレビュー会を実施してしまうとレビュー会で出た確認項目を検証する時間がない、といったことも考えられます。"中間レビュー"、"最終レビュー"と段階的に設けるのがおすすめです！

### 4. トライアル後の記録を残す
事後でも、簡単でもよいので記録を残しておきましょう。
特に **"トライアルしたが不採用とした理由"** は将来再検討する際に有用な情報になるので記載しておくとよいです。
API Best Practices ~フィールドはスカラやenumではなく、繰り返しメッセージにする

## フィールドはスカラやenumではなく、繰り返しメッセージにする

https://protobuf.dev/programming-guides/api/#repeated-fields-messages-scalar-types

一般的に拡張していくと、単一の繰り返しフィールドが複数の関連する繰り返しフィールドへ足し算されていくかと思いますが、これはよくありません。

繰り返しメッセージから始めると、拡張性がよくなります。

```protobuf
// Describes a type of enhancement applied to a photo
enum EnhancementType {
  ENHANCEMENT_TYPE_UNSPECIFIED;
  RED_EYE_REDUCTION;
  SKIN_SOFTENING;
}

message PhotoEnhancement {
  optional EnhancementType type;
}

message PhotoEnhancementReply {
  // Good: repeated message で定義しておくと、後からフィールド追加できたり
  // enum より拡張性が高い
  repeated PhotoEnhancement enhancements;

  // Bad: もしパラメーター追加したい場合は、同じように repeated hogeType を追加するか（ひどい）
  // このフィールドを非推奨にして繰り返しメッセージを導入する必要がある。
  repeated EnhancementType enhancement_types;
}
```

これは map にも同様に適用されます。 `map<string, string>` よりは `map<string, MyProto>` にしておくとよいでしょう。

例外として、レイテンシクリティカルなアプリケーションでは、プリミティブ型の並列配列は、単一のメッセージ配列よりも高速です。
Confluenceのマクロでおすすめの機能

:::note info
Confluenceのバージョンは7.19.16を想定しています。
:::

# 初めに
Confluenceを使っている方で、マクロはよく使われているでしょうか。
もし使われてない方いたら、本記事を参考にぜひ使ってみてください！

# マクロのおすすめ

## マクロを使うショートカット

文中の行の先頭で「{」と打つとマクロを選択するモードに入ります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291115/872feb83-1652-291c-db1a-cf08539102ff.png" alt="Sample Image" width="450" height="300">

「{」の後に文字を打つと指定したいマクロを追加することができます。
例えば「{ table of con」くらいまで打つと「Table of Contents」（目次）がサジェストに表示されて、矢印キーで選んで追加します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291115/aef363ad-23b0-b4c9-a539-a4ce733edaaa.png" alt="Sample Image" width="450" height="300">


## コードを書くマクロ
「{」の後に「コード」(code)と打つと出てくる「コードブロック」（Code Block）を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291115/1cf09c1a-8e6e-9f91-0e13-b269194379b1.png" alt="Sample Image" width="450" height="300">

他にもコードブロックを出す方法が存在して、「`」を3回打つとすぐ出てくるみたいです。
こちらの方が覚えると便利そうですね。

## 展開するブロックを使うマクロ

「{」の後に「展開」（expand)と打つと出てくる「展開」（Expand）を選択します。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291115/33749c4a-84e3-9110-9374-af1d2ebc7b38.png" alt="Sample Image" width="450" height="300">

ボタン1つで出したりしまったりできるのでとても便利です。

# 最後に

もし他におすすめのマクロなどあればコメントなどいただけると嬉しいです！
【chatGPT 対話備忘録】AT-x310-26FT(ネットワークスイッチ)とPCの接続

# 私:
AT-x310-26FTについて
# ChatGPT:

AT-x310-26FTは、アライドテレシス（Allied Telesis）が提供するネットワークスイッチです。主な仕様と特徴は以下の通りです。

### AT-x310-26FTの概要
製品名: AT-x310-26FT
カテゴリー: レイヤー2マネージドスイッチ
ポート数:
24 × 10/100/1000BASE-T (RJ-45) ギガビットイーサネットポート
2 × SFP (Small Form-Factor Pluggable) スロット
主な特徴
### レイヤー2スイッチング機能:

VLAN（IEEE 802.1Q）
ポートベースVLAN
VLANタギング
IGMPスヌーピング
QoS（Quality of Service）:

優先制御やトラフィック分類が可能
### セキュリティ:

ポートセキュリティ
802.1X認証
MACアドレスフィルタリング
ACL（アクセスコントロールリスト）
### 管理機能:

CLI（コマンドラインインターフェース）
SNMP（Simple Network Management Protocol）
Web GUIでの管理
Telnet/SSHサポート
### 冗長性と高可用性:

スパニングツリー（STP、RSTP、MSTP）
リンクアグリゲーション（IEEE 802.3ad）
### 省エネ設計:

省電力イーサネット（IEEE 802.3az）
### サイズと重量:

サイズ: 440 × 44 × 257 mm（幅 × 高さ × 奥行き）
重量: 約3.1 kg
用途
中小規模オフィスのLAN構築
エッジスイッチとしての利用
企業のバックオフィスやワークグループ向けネットワーク
このスイッチは、コストパフォーマンスが高く、基本的なL2管理機能が揃っているため、一般的なネットワーク構築に適しています。






# 私:
PCとつなげて設定を確認する方法
# ChatGPT:

AT-x310-26FTをPCと接続して設定を確認する手順は以下の通りです。設定確認には主にコンソール接続とWebインターフェース接続の2つの方法があります。

### 1. コンソール接続での設定確認
##### 必要なもの
シリアルコンソールケーブル（RJ-45 to DB9ケーブル）
USB-シリアル変換アダプタ（PCにシリアルポートがない場合）
ターミナルエミュレータソフト（例：Tera Term、PuTTY、HyperTerminal）
##### 接続手順
コンソールケーブルのRJ-45端をスイッチのコンソールポートに接続。
DB9端またはUSB-シリアル変換アダプタを介して、PCのUSBポートに接続。
ターミナルエミュレータソフトを起動し、以下の設定で接続：<br>
通信ポート: 接続したシリアルポート（例：COM3）
通信速度: 9600bps
データビット: 8
パリティ: なし
ストップビット: 1
フロー制御: なし
設定後、ターミナルでEnterキーを押し、スイッチのCLI（コマンドラインインターフェース）が表示されることを確認。
設定確認コマンド例
現在の設定確認:
~~~ :shell
show running-config 
~~~
IPアドレス設定確認:
~~~ :shell
show ip interface brief
~~~
ポート状態確認:
~~~ :shell
show interface status
~~~
### 2. Webインターフェースでの設定確認
##### 必要なもの
LANケーブル（カテゴリ5e以上）
PCとスイッチのIPアドレス設定
##### 接続手順
スイッチとPCをLANケーブルで接続。
PCのIPアドレスをスイッチの管理IPと同一ネットワークに設定。
例：スイッチのIPが 192.168.1.1 の場合、PCのIPを 192.168.1.10、サブネットマスクを 255.255.255.0 に設定。
Webブラウザを開き、スイッチのIPアドレス（例：http://192.168.1.1）を入力。
ログイン画面が表示されたら、ユーザー名とパスワードを入力。
初期設定:
ユーザー名: manager
パスワード: （デフォルトは空欄）
設定確認手順
Webインターフェースでダッシュボードやメニューから以下の設定を確認できます：
システム設定
ポート設定
VLAN設定
QoS設定
セキュリティ設定
<br><br>
##### 補足事項
初期化が必要な場合は、スイッチ背面のリセットボタンを10秒以上押し続けて工場出荷状態に戻せます。
ファームウェアのバージョンによって設定画面が異なる場合があるので、最新のマニュアルを確認しましょう。
これでPCとAT-x310-26FTを接続して設定を確認できます。必要に応じて設定変更も行ってください。
私もデジタル関連サービス貿易でお金を稼ぎたい

## はじめに
本日はクリスマスイブですね！ご覧いただきまして、ありがとうございます。​
ニッセイ情報テクノロジー株式会社 プロダクト・サービス事業推進室の青木と申します。​

　私は、弊社で持っているプロダクト・サービスを海外展開したいと考えています。自社サービスの海外展開は、多くの企業にとって魅力的な成長戦略である一方で、様々な難しさも伴います。まだ取り組みを始めたばかりですが、検討中の内容についてご紹介いたします。

## デジタル関連サービスを海外展開する際の検討事項
以下に、海外展開における主な検討事項をまとめます。　

1\. 市場調査と理解
　各国の消費者の嗜好、競争環境などを理解し、売れると思える根拠を考える

2\. 言語の壁
　サービス説明、カスタマーサポートなど、全ての面で適切な翻訳とローカライズを考える​

3\. 法規制の遵守
　各国にある独自の法律や規制を遵守するための専門知識を付ける

4\. 現地パートナーの選定
　現地でビジネスを展開するための信頼できるパートナーを見つける

　やみくもに営業を行うことは、時間とお金の無駄遣いとなりますので、まず市場調査を行い、売れる可能性のある国を特定することが最優先事項と考えました。

## 市場調査のためにAWS Marketplaceを活用する
　現地に出向き、足を使って営業することも重要ですが、今回はAWS Marketplaceを活用して効率化を図ることにします。具体的には、AWS Marketplaceを通じて調査対象国にサービスを販売し、市場の反応や需要を検証する調査を検討しました。AWS Marketplaceを、卸売業者と調査会社の役割を兼ねた形で活用する計画です。​

　ただし、AWS Marketplaceは販売経路の１つであり、置いておくだけでは売れません。英語で記述されたランディングページを作成し、SNS広告などを活用することも検討する必要があります。

## 今後の予定
　実は、まだAWS Marketplaceに搭載できていません。​弊社はユーザー系のSI企業であり、海外展開の実績が乏しいため、手探りで様々な調査を行いながら取り組んでいますが、株主である日本アイ・ビー・エム様に教えてもらった方が早いかもしれませんね。。​色々勉強しながら売上拡大に向けてチャレンジしていきたいと思います。​
【Docker】サービスにホストマシンからのみアクセスさせる


Dockerのcomposeファイルを書く際のport指定を、ポート番号のみで指定することが多いと思いますが、これだとLAN内の他のPC等からアクセスできてしまいます。

テレワークでLAN内の家族のPCからアクセスされたり、会社内でも関係者外からアクセスされることが望ましくない場合も多いと思います。

以下に簡単な内容となりますが、周知になることも期待し、それを防ぐ書き方をまとめておこうと思います。

## 記載の方法

`compose.yaml`には以下のように、ポート名に加え`127.0.0.1`を指定して記載するだけで良いです。

```compose.yaml
services:
  web:
    image: nginx
    volumes:
      - ./html:/usr/share/nginx/html
    ports:
      - "127.0.0.1:8080:80"
```

HTMLの内容です。お試しなので何でも良いです。

```./html/index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>HTML</title>
  </head>
  <body>
    <h1>Hello!</h1>
    <p>This is sample.</p>
  </body>
</html>
```

## 結果

- 自身のPCから、`http://localhost:8080`や`http://127.0.0.1:8080`でアクセスできます
- 自身のPCや、LAN内の他のPCから、ローカルIPなどではアクセスできません（例: `http://192.168.1.10:8080`など）

上記のようにlocalhost(ループバックアドレス)に制限することで、他のPCからのアクセスを防ぐことができます。

文献等では、このような定義をしているものがほとんど無さそうですが、自分自身が使うものであれば必ず書く癖をつけておいてもいいかもしれません。
LiDARを使って住宅内の危険個所を可視化しようと試みた話​

## はじめに
ご覧いただきまして、ありがとうございます。​
ニッセイ情報テクノロジー株式会社 プロダクト・サービス事業推進室の青木と申します。​

　本稿では、LiDAR（ライダー）を活用したサービスを検討した際の話を記述させていただきます。LiDARとは、レーザー光を照射してその反射光から対象物の距離や形状を計測する技術です。この技術とAIを掛け合わせ、住宅内の危険個所を自動診断するアプリケーションを居宅介護支援事業所や自治体向けに開発しようと試みましたが、失敗に終わった話をご紹介させていただきます。

 ## LiDARを活用したサービスを検討した背景
 「高齢者の住宅内事故を未然に防ぎたい」​

　高齢者の住宅内事故は事故全体の約７割を占めています。発生場所は、居室、台所、階段の順に多く、事故の主な原因は、つまずいたり、踏み外したりするなど、足元の不注意がほとんどです。

 [参考文献](https://www.tyojyu.or.jp/net/kenkou-tyoju/koureisha-sumai/koreisha-jutakunaijiko.html)​

　事故によって身体障害や健康を損なうリスクが高いとされているため、事故を未然に防ぐことが重要であると言えます。この対策の１つとして、住宅内の危険個所を知らせるサービス（アプリケーション）を開発し、バリアフリーの促進を目指しました。​

## サービスイメージ
　LiDARとWiFiセンサーを利用して対象領域の3D画像や図面、生活導線を把握し、その情報を入力としてAIに危険箇所を診断させ、その結果を3D画像上に表示させることを構想しました。これにより、誰もが同じ目線で改善箇所を検討できるようになると考えました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928433/9f3de927-403d-78cb-e416-73cf016af83f.png)

　知識がない方が、言われるがままに不適正な工事を実施してしまうケースもあるようです。このサービスによって、真に改善すべき箇所を誰もが把握することができれば、そのようなケースを防ぐことができると考えています。

## 当サービスの難しさ
　下記２点の難しさから、このサービスは断念することになりました。

### ①IT機器の調達コストが高い
　スマートフォンを用いて住居内を撮影することでサービスを実現しようと検討しましたが、LiDARが使用できるスマートフォンはiPhoneの場合、「iPhone 12 Pro」以上が必要となります。そのため、事前に複数台準備しようとすると、多額の費用が必要となってしまいます。センサーに関しても同様です。​

　情報収集に必要なコストと、得られる効果を比較検討した結果、現状では、そこまで費用を投じるだけの効果が見込めないとの結論に至りました。​

### ②マネタイズが難しい
 利用シーンとしては、バリアフリーを検討するタイミングくらいであると考えられます。​また、居宅介護支援事業所や自治体、高齢者の方にお金を払ってでもこのサービスを利用したいと思えるかをヒアリングしましたが、良い回答は得られませんでした。（理由はここでは記述し辛いので伏せます）​

## 得た教訓
　LiDAR に限らず、専用のデバイスが必要なサービスはIT機器の調達コストが高くなりやすい傾向にあるため、それに見合う価値のあるサービスのアイデアでなければ成り立たないと痛感いたしました。綺麗ごとだけではお金は稼げないようです。​

　今回はLiDARという技術を知り、この技術が使えるアイデアはないかと考え、サービスアイデアを検討しましたが、技術ドリブンでサービスを検討すると、マネタイズで行き詰まってしまうケースが多いです。​

　「面白そう！」という感情だけで突っ走るのではなく、一呼吸置くこと。技術知識とサービスアイデアのストックを増やすことで、さまざまな組み合わせを検討できるようにしていくことが大切だと思いました。​
【React】create-react-appを使用したプロジェクトの作成、起動方法

#### はじめに
「npx create-react-app」を使用したReactアプリのプロジェクトの作成、起動方法についてまとめました。

※「Vite」を使用した方法は下記に記載してます。
[Reactの環境構築、Viteを使用したプロジェクトの作成、起動方法](https://qiita.com/k_sapphire/items/d4089ca3dd23c166e9d2)

## 事前準備

#### Node.jsとVSCode(Visual Studio Code)を事前にインストールしておく。
手順は下記の記事に記載。
[Reactの環境構築、Viteを使用したプロジェクトの作成、起動方法](https://qiita.com/k_sapphire/items/d4089ca3dd23c166e9d2)

## Reactのプロジェクトを作成

参考資料
[Reactの基礎【環境構築編】](https://zenn.dev/web_tips/articles/abad1a544f3643)
[新しい React アプリを作る – React](https://ja.legacy.reactjs.org/docs/create-a-new-react-app.html)
[npxコマンドとは？ 何ができるのか？](https://zenn.dev/ryuu/articles/what-npxcommand)

①VSCodeからターミナルを開く。ターミナルから、cdコマンドでプロジェクトを作成したい場所（任意のパス）に移動する。
```js
cd {任意の場所}
```
➁　①で指定した場所の配下にReactアプリのプロジェクトを作成する。
+ 以下のコマンドを入力する。
```js
npx create-react-app {プロジェクトフォルダ名}
```
+ 以下の通り、開発に必要なファイルが作成される。
　＜フォルダ構成＞
　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579718/2077eceb-4970-28fe-1ef7-bc1eb85cfa05.png" width="200">

※「npx create-react-app」を実行すると、
「create-react-app」のインストール、実行、アンインストールが実行される。

+ npxコマンド
:インストールしていないモジュールのインストール、実行、アンインストールをしてくれるコマンド。

## 開発サーバーを起動する

作成したプロジェクトフォルダに移動して、開発サーバーを起動する。

+ 以下のコマンドを入力する。
```js
cd {プロジェクトフォルダ名} 
npm start
```

+ ブラウザから初期画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579718/43daf8cb-cd22-bb70-4016-50cdcd5efc27.png)


#### インストールの際、「このシステムではスクリプトの実行が無効になっている」というエラーが出た場合の対応方法

参考資料
[Reactのプロジェクト作成の所で実行が無効と出た...解決法 #初心者 - Qiita](https://qiita.com/kchihirop/items/efb2ee54f531ddfbcf80)
[PowerShellでこのシステムではスクリプトの実行が無効になっているため、ファイル hoge.ps1 を読み込むことができません。となったときの対応方法 - Qiita](https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f)

Powershellを「管理者で実行」で起動して、以下のコマンドを実行する
```js
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
```
お願いですから、読点を打ってください

# はじめに
皆さんの会社でも、チャットによるテキストコミュニケーションが非常に多いと思います。
組織の中で、如何に読みやすい文章・意図が伝わりやすい文章でやりとりされているかで、
その会社の、ビジネスのスピード感が知れる、といっても過言ではありません。

弊社は若いメンバーに多いのですが、読点をあまり打たない人がいるので、
若いメンバー向けに読点がいかに大切かを書こうと思います。

おじさんは長い文章が読めません。

お願いですから、読点を打ってください。


## 1. 意味を正確に伝える
読点があることで、文章の意味を誤解されずに伝えることができます。  
読点がないと、誰が何をしているのか分かりづらくなることがあります。

### 例
- **読点がない場合**  
  - 「私が好きな犬を連れた友人が来た」  
    - → 誰が好きなのか分かりづらい。
- **読点がある場合**  
  - 「私が好きな、犬を連れた友人が来た」  
    - → 私が好きなのは「友人」であり、その友人が「犬を連れている」と分かる。

LIKEなのか、LOVEなのか気になるところ。

---

## 2. 読みやすさを向上させる
読点は、長い文章を区切る役割も果たします。
いい感じに使うことで、読み手が途中で迷わずスムーズに読めます。

### 例
- **読点がない場合**  
  - 「昨日見た映画はストーリーも良く俳優の演技も素晴らしかったですが少し長すぎて疲れました」  
    - → 長すぎてどこで区切ればいいのか分かりません。
- **読点がある場合**  
  - 「昨日見た映画は、ストーリーも良く、俳優の演技も素晴らしかったですが、少し長すぎて疲れました」  
    - → 読点で区切られているため、読みやすくなります。

---

## 3. 誤解を防ぐ
読点を使うことで、誤読や誤解を防ぐことができます。

### 例
- **読点がない場合**  
  - 「大きなテレビが置ける台を探しています」  
    - → 「大きなテレビを置ける台」を探しているのか、「テレビが置ける大きな台」を探しているのか不明。

- **読点がある場合**  
  - 「大きな、テレビが置ける台を探しています」
    - → 「テレビが置ける大きな台」を探していることが分かる。

---

## 4. 強調したい部分を際立たせる
読点を使うことで、文章の中で重要な部分を強調できます。

### 例
- **読点がある場合**  
  - 「これは誰にでもできることではありません」  
    - → 特定の部分に重みがない。
- **読点がない場合**  
  - 「これは、誰にでもできることではありません」  
    - → 「誰にでも」が際立ち、この部分が重要であると強調される。
---

## 5. 文章のリズムを整える
読点は、文章の「リズム」を作る役割も持っています。適切に配置することで、読みやすいテンポを保てます。

### 例
- **読点がない場合**  
  - 「私は朝ご飯を食べてそれから散歩に行き友人と話しました」  
    - → 全てが詰まっていて読みにくい。
- **読点がある場合**  
  - 「私は朝ご飯を食べて、それから散歩に行き、友人と話しました」  
    - → 自然なリズムが生まれ、理解しやすくなります。

---

## まとめ
チャットの文章が分かりづらいと、内容について会話するハメになり、集中していたはずの貴重な時間が失われます。
非同期コミュニケーションを有効に活用するためにも、わかりやすい文章でコミュニケーションをはかりましょう。

あと、はじめにに書いた「ビジネスのスピード感が知れる」はちょっと過言でした。
WireMockのPOSTリクエストのbodyPatternsの書き方まとめ

# 概要

WireMockのPOSTリクエストのbodyPatternsのJSONの書き方についてまとめます。
```
root
 ┣ __files
 ┃  ┗ response.json
 ┃
 ┗ mappings
    ┗ request.json <-- 該当ファイル
```

request.jsonの全体の書き方については、[WireMockのレスポンスマッピングファイルの書き方まとめ](https://qiita.com/TKazutaro/items/2477c82f369c6dcbfe36)を参照してください。


# POSTリクエストファイルの内容について
POSTリクエストファイルは以下のような内容で記述されます。
```request.json
{
  "request": {
    "urlPath": "/sample",
    "method": "POST",
    "bodyPatterns": [
      {
        "equalToJson": "{\"element_int\": 8, \"element_str\": \"string\", \"element_bool\": true }"
      }
    ]
  },
  "response": {
    "status": 201,
    "bodyFileName": "response.json",
    "headers": {
      "Content-Type": "application/json"
    }
  }
}
```

この `bodyPatterns` についてまとめます。

| Key | Value |
| -- | -- |
| equalToJson | 完全一致するJSON |
| matchesJsonPath | "$.name" などのようにJSON内に存在するキー |

equalToJsonについては、完全一致するJSONに対応します。

## matchesJsonPath
matchesJsonPathに指定できる要素はパターンが複数あり、以下の通りです。

### 要素が一致する場合
```
    "bodyPatterns": [
      {
        "matchesJsonPath": "$.element_str"
      }
    ]
```

### 要素に設定されている値が一致する場合
以下の２パターンで記述できます。
#### パターン１
```
    "bodyPatterns": [
      {
        "matchesJsonPath": "$[?(@.element_int == 8)]"
      }
    ]
```

数値の場合 `@.element_int >= 10` といった指定もできます。

#### パターン２
```
    "bodyPatterns": [
      {
        "matchesJsonPath": {
          "expression": "$.element_int",
          "equalTo": "8"
        }
      }
    ]
```

パターン２は`equalTo`を`matches`や`doesNotMatch`に変更して正規表現で一致、不一致を定義することができます。(`contains`や`doesNotContain`も使用可能)

### 要素数が一致する場合
```
    "bodyPatterns": [
      {
        "matchesJsonPath": "$[?(@.element_obj.size() == 2)]"
      }
    ]
```

element_obj内の要素が2つの場合に一致します。

### 要素が存在する場合
```
    "bodyPatterns": [
      {
        "matchesJsonPath": {
          "expression": "$.element_int",
          "absent": true
        }
      }
    ]
```

任意パラメータが指定されている場合に一致することができます。
`"absent": false` にした場合、nullにも一致します。
absentについては、`queryParameters`でも指定可能です。

### 時間の範囲指定をする場合
```
    "bodyPatterns": [
      {
        "matchesJsonPath": {
          "expression": "$.element_date",
          "and": [
            {
              "before": "2025-01-01T00:00:00"
            },
            {
              "after": "2024-01-01T00:00:00"
            }
          ]
        }
      }
    ]
```

上記の書き方をうまく組み合わせて条件を指定をすることで、ある程度のリクエストは網羅できそうです。
アイゼンハワー行動優先マトリックス

年末はイベントの時期ですが、非常に忙しい時期でもあります。限られた時間とリソースですべてのタスクを終わらせながら、恋人とクリスマスを楽しみに過ごすのためにタスクに優先順位を付けるフレームワークを紹介します。

### 年末のチャレンジ
年末は忙しい時期です。誰もがプロジェクトや進行中のタスクを終わらせて、新年を新鮮な気持ちで迎えようとします。

しかし、いつものように課題があります:
- 休暇前に仕事を終える
    - プロジェクトの締め切りは年末までに設定されます
- 本番環境のバグ
    - 休暇シーズン前にシステムを安定させるよう努力
- 予定外のタスク追加
    - 新機能に関する直前のリクエスト
    - 来年の作業計画
- チームの可用性の低下
    - 冬はインフルエンザシーション
    - 開発作業と関係ないアクテビティとイベントが多い

### アイゼンハワー行動優先マトリックス
アイゼンハワーマトリックスは、タスクを「重要性」と「緊急性」で4つに分類し、優先順位を明確にするためのツールです。これにより、やるべきことを効率的に整理し、本当に重要な作業に集中できます。第34代アメリカ大統領にちなんで名付けられました。

![Screenshot 2024-12-13 at 14.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989047/487b49fb-e983-3f00-afa2-4c30c1a4c5f2.png)



### 説明
- **緊急かつ重要（今すぐやる）**
    - これらは非常に重要で、すぐに対応しなければならないタスクです。大きな問題を防ぐために、全力で取り組みましょう。
<br />

- **重要だが緊急ではない（計画して進める）**
    - 長期的な成功に必要なタスクですが、今すぐやる必要はありません。スケジュールを立てて、計画的に進めましょう。
<br />

- **緊急だが重要ではない（最小限にするか任せる）**
    - 緊急に見えますが、大きな影響はありません。できれば他の人に任せるか、短時間で終わらせましょう。他の良い解決策はプロセスを自動化することです。
<br />

- **緊急でも重要でもない（無視する）**
    - 目標達成には役立たないタスクです。できるだけ避けたり、削除したりしましょう。

### どうやってわかるか？
- すぐに対応しないと問題はさらに大きくなりますか? 重要な機能に影響がありますか? 締切は近いですか、それとも過ぎていますか?　この場合は緊急かつ重要であるべきです。
- 将来価値があるか？将来仕事が簡単になるか？製品を改善するか？今日ではなく将来それを実行できるか？　重要ですが緊急ではないことになります。
- 本当に重要ですか? 重要だと感じるかもしれませんが、実際にはそうではありません。影響がありますか、それともサービスかプロセスに支障をきたしますか?　多くの場合、重要に思えるが、実際には重要ではなく、後で対処できます。
- 本当にする必要がありますか​​？それをしなくても何かが変わりますか？邪魔になりますか？


以下は、それぞれのカテゴリーに分類されるタスクの例です。
![Screenshot 2024-12-13 at 14.04.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989047/b6bfda36-a5a7-0265-ed28-c23873d3f362.png)



### まとめ
このシンプルなフレームワークを使用して、誰もがワークフローを処理できるようになることを願っています。もちろん現実の世界はもっと複雑ですが、これは忙しい時間を乗り切るための簡単なガイドラインとなります。
同意できない点か別のやり方があると思う点はありますか? コメントを残してください。
フロント地図について：一番近い道の計算方法

# trufライブラリ
まず truf という地図空間処理ライブラリを紹介します。このライブラリを利用することで、一番近い道を探すことが可能です。

## 導入方法
npm install @turf/turf
import * as turf from '@turf/turf';

## 部分機能紹介
2点間の距離を計算
turf.distance(point1, point2)

点を作成
turf.point([longitude, latitude])

面積「めんせき」を計算
turf.area(polygon)

点が多辺形「たへんけい」内に存在するか判断
turf.booleanPointInPolygon(point, polygon)

## 一番近い点を探すコード例
以下のデータを例に挙げてみます：

```JavaScript
const matchingFeatures =  
[[286.46939463294326, 49.9859483543],[256.46939463294326, 49.9859483543],[287.46939463294326, 49.9859483543]];  
let nowCoords = [321.1234, 12.1234]; // 現在の位置  
let minDistance = Infinity; // 無限大で初期化  
let entry = null;  // 最も近い位置を保存する変数  

matchingFeatures.forEach(feature => {  
    const dist = turf.distance(turf.point(nowCoords), turf.point(feature));  
    if (dist < minDistance) {  
        entry = feature;  
        minDistance = dist;  
    }  
});  

return entry;  
```

## コードの説明
初期化
Infinity（正の無限大）を使って、どの数値よりも大きい初期値を設定します。

let minDistance = Infinity;  
ループ処理
matchingFeaturesの各点について、現在地との距離をturk.distanceで計算し、最短距離を更新します。

比較
計算した距離が現在の最短距離より小さい場合、保存された値を更新します。

結果の取得
最後に、entryに最も近い点が格納されます。
【Android】LinearStickyListライブラリを公開しました

https://github.com/s-y-droid/LinearStickyList

[こちら](https://qiita.com/abks45ft/items/8630503ee13869d8da4b)の記事の続きになります。

元々、スクロールのたびにリバインドが発生しないシンプルなStickyHeaderを作ってちょっとした情報共有をしたかっただけだったのですが、ソースを弄っているうちに楽しくなってきたので、

・画面回転などのFragment再生成に対応
・スクロールバーが隠れる問題に対応
・その他もろもろ

して、ライブラリを公開してみました。使い方がめちゃ簡単で、用途にマッチすればぬるぬる動くのが取り柄です。

![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949988/61db091b-d45c-a56e-2c99-9dca1b9b886f.gif)

私は英語ができないのでGoogle翻訳頼みだったのですが、この文章で伝わるのか。てか、そもそも需要あるのか。など悩みは尽きませんが、もし機会があって使っていただけたら、使用感など教えていただけると嬉しいかも。
RTPとは

# マルチメディアで使われる
>リアルタイム・マルチメディア・アプリケーションである。特に、インターネット・ラジオ、インターネット電話、ミュージック・オン・デマンド、ビデオ会議、ビデオ・オン・デマンドなどがより一般的になるにつれて
....
マルチメディア・アプリケーション向けの汎用のリアルタイム・トランスポート・プロトコルがあった方が良いのではないかということが明らかになった。
# リアルタイム転送の２つの面
>今やマルチメディア・アプリケーションの広範囲で利用されている。リアルタイム転送の２つの面について説明している。一つ目は、パケットの中のオーディオやビデオのデータの送信のためのRTPプロトコルである。２つ目はオーディオやビデオを正しい時間で再生するための、主に受信側の処理である。

# RTPライブラリの仕事
>RTPは一般的にUDP(OS内)より上のユーザー空間で動き、以下のように動作する。

>`アプリケーションと一緒のユーザー空間にあるRTPライブラリから与えられる`。このライブラリは、ストリームを多重化し、`ソケットに詰めるRTPパケットにエンコード`する。ソケット側のOSでは、RTPパケットを含んだUDPパケットが作られ、IPに渡され、さらにイーサネットのようなリンクで送信される。受信側では逆の動作が行われる。
`マルチアプリケーションは最終的に、マルチメディア・データをRTPライブラリから受信`する。

### アプリケーション層に実装されたトランスポート層
>RTPがユーザー空間で実行され、アプリケーション・プログラムにリンクされているため、確かに`アプリケーション・プロトコルのように見える`。一方で、`RTPは、トランスポートの便宜で提供`する。汎用的でアプリケーションとは独立したプロトコルであり、`トランスポート・プロトコルのようにも見える`。おそらく、`アプリケーション層に実装されたトランスポート・プロトコルというのが最善の説明`であり、...

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
Latexで画像が表示されない場合

## 課題

overleaf(Latex)で論文を作成していたところ，画像(png)が表示されないという問題が発生しました．
具体的にはコンパイルエラーが起きているわけではないものの，本来画像が表示される部分が真っ白になっていて何も表示されていない状態でした．
使用したパッケージを含む実際のコードは下記の通りです．

### コード
```latex
\documentclass[12pt]{jsarticle}
\usepackage{lipsum}
\usepackage[dvipdfmx]{graphicx}
\usepackage[dvipdfmx]{color}
\usepackage{cite}
\usepackage{url}
\usepackage{plext}

\usepackage{textgreek}
\usepackage[utf8]{inputenc}

\usepackage{hyperref}
\definecolor{linkcolor}{rgb}{0.0,0.3,0.5}
\usepackage{tensind}

\usepackage{verbatim}
\usepackage[normalem]{ulem}
\usepackage{soul}
\usepackage{orcidlink}


\begin{document}
\includegraphics[width=50mm]{figs/hoge.png}
\end{document}
```

## 解決方法
\usepackage{orcidlink}を削除したところ，画像が表示されました．
graphicxやcolorに[dvipdfmx]を追加しても表示されない方は，導入しているパッケージのいずれかが干渉してしまっている可能性があるので，一つ一つ削除して干渉しているパッケージを探してみましょう(自戒の意も込めて)．
wordpress WP_QueryでDBの「wp_postmeta」内の値でクエリする

 WordPressの多言語化プラグインを利用した際に、
 ロケールが日本語のもの、英語のものと一覧に出す際に
 wp_postmetaテーブルにあるmeta_keyが「_locale」のもので
 クエリを出し分けたかったので調査し備忘録として残します。

 
 			$args = array(
				'post_type'  => 'products',//ポストタイプ
				'posts_per_page'=> 72,//取得数
				'paged'         => $paged,//ページャー
				'post_status' => 'publish',//公開状態
				'meta_key' => '_locale',//meta_keyが「_locale」
				 'meta_query' => array(
				    'relation' => 'AND',
				    array(
				      'key' => '_locale', //meta_keyが「_locale」
				      'value' => 'en_US',//meta_valueが「en_US」
				      'compare' => '=', 
				    ))
			);
Kotlinでの`roundTo〇〇`を用いた四捨五入は負の数に気をつけて！

# はじめに

Kotlinでは数値を四捨五入する場合、`roundToInt`や`roundToLong`を使用します。ただし、**負の値を四捨五入**する際には1点注意が必要です。この記事では、Kotlinの`roundToInt`を用いてどのような挙動になるのかを詳しく解説します。


## まず結論
いきなり結論からの共有です。`roundTo〇〇`は負の数(-X.5)に対して以下の結果になってしまう可能性があります。

a. **`(-7.5).roundToInt()`とコーディングの場合**  
   値がマイナスの記号を含めてそのまま評価され、`-7.5`を一番近い切り上げられた整数（`-7`）を返します

b. **`-7.5.roundToInt()`とコーディングの場合**  
   マイナスの記号は一旦考慮されず`7.5`を評価し、四捨五入して`8`とした後、マイナス記号が後から適用され、結果として`-8`を返します

c. **val num = -7.5 と変数に格納して、変数に対して`roundToInt()`を呼び出した場合**    
    こちらもaのケースと同様に、値がマイナスの記号を含めてそのまま評価されるため整数（`-7`）を返します


# Kotlinでの`roundTo〇〇`
まずここではKotlinの`roundToInt`のソースコードがなっているかを覗いてみましょう！

```kotlin
public actual fun Double.roundToInt(): Int = when {
    isNaN() -> throw IllegalArgumentException("Cannot round NaN value.")
    this > Int.MAX_VALUE -> Int.MAX_VALUE
    this < Int.MIN_VALUE -> Int.MIN_VALUE
    else -> nativeMath.round(this).toInt()// Int範囲内の数値であればここに入る
}
```

KotlinのInt範囲内に収まっているDoubleで数字であれば、thisで自身の値を更に次のround関数に引数として渡し、Int型に変換して返しているのが分かります。また、round関数内ではビットワイズのシフト演算を使用して四捨五入の計算が行われていました。

## 検証してみよう
それは実際にこの関数を使用して、期待する四捨五入の結果を得られるのかを検証してみましょう。

### ➕正数に対しての四捨五入
``` Kotlin
    val case1 = 3.14.roundToInt()// 3
    val case2 = 5.7.roundToInt()// 6
    val case3 = 8.5.roundToInt()// 9
```
上記コードのように、小数点部分が0.5以上であれば値の切り上げ、0.5より小さい場合は切り下げがされているのを確認できると思います。

では続けてそれぞれをマイナス値にした場合はどうなるのか確認してみましょう。
### ➖負数に対しての四捨五入
``` Kotlin
    val case1 = -3.14.roundToInt()// -3
    val case2 = -5.7.roundToInt()// -6
    val case3 = -8.5.roundToInt()// -9
``` 
正数の結果にそのままマイナスが付くような結果になりましたね。ではそれぞれに括弧をつけるとどうなるでしょう？

``` Kotlin
    val case1 = (-3.14).roundToInt()// -3
    val case2 = (-5.7).roundToInt()// -6
    val case3 = (-8.5).roundToInt()// -8
``` 

case1とcase2は同じ結果ですが、case3は`-9`ではなく`-8`になっているのが確認できます。
上記は変数に値を格納した場合でも同じ結果になります。

```Kotlin
    val num = -8.5
    val case1 = num.roundToInt()// -8
```


## なぜこのような挙動になるのか？
ここでは括弧ありと無しで、値の評価にどんな違いがあるのかを説明します。
下記例になります。

### a. `(-8.5).roundToInt()`
- 丸括弧を用いることで、`-8.5`全体が計算の対象になります
- 小数点が0.5であるため`-8.5`より大きい整数である`-8`に切り上げとなります
- 結果、`-8.5`は`-8`に丸められます

### b. `-8.5.roundToInt()`
- この場合、まず`8.5`の絶対値部分に対して`roundToInt`が実行されます
  - `8.5`は`9`に丸められる
- roundの処理によって返却された値の先頭に`-`が適用され、結果は`-9`になります


## 実際のコード例

以下のコードで実際の挙動を確認できます：

```kotlin
fun main() {
    val case1 = (-7.5).roundToInt()
    val case2 = -7.5.roundToInt()

    println("(-7.5).roundToInt() の結果: $case1") // 結果: -7
    println("-7.5.roundToInt() の結果: $case2")  // 結果: -8
}
```

[Kotlin Playgroundのコード](https://pl.kotl.in/W7ocP2jYY)



# 参考資料
- https://kikakurui.com/z8/Z8401-2019-01.html
- https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.math/round.html
DBを使ったpytestをgithub actionsで自動チェックする

# 概要
SQLAlchemyでDBを使ったpytestをgithub actionsで自動チェック出来るようにしたいと思いました。
最初は、ローカルのDBに接続しようとし、エラーになってしまいましたが、github actionsのservicesを使うことで解決したので、記載していきます。

# 環境
Python==3.11.7
Flask==3.0.3
SQLAlchemy==2.0.35
pytest==8.3.3

# コード例
```yml:.github/workflows/code-check.yml
# 1
name: Code Check

# 2
on:
  push:
    branches:
      - "**"
  pull_request:
    types:
      - closed

jobs:
  pytest:
    # 3
    runs-on: ubuntu-24.04

    services:
      # 4
      postgres:
        image: postgres:16
        env:
          POSTGRES_HOST: localhost
          POSTGRES_USER: postgres
          POSTGRES_PORT: 5432
          POSTGRES_DB: puppet_ci_test
          POSTGRES_PASSWORD: postgres
        ports:
          - 5432:5432

    steps:
      # 5
      - name: Checkout code
        uses: actions/checkout@v4
      # 6
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.11"
      # 7
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install --no-cache-dir -r requirements.txt
      # 8
      - name: Run Pytest
        env:
          POSTGRES_HOST: localhost
          POSTGRES_USER: postgres
          POSTGRES_PORT: 5432
          POSTGRES_DB: puppet_ci_test
          POSTGRES_PASSWORD: postgres
        run: pytest tests
```

# 解説

1, ワークフロー名（任意の名前）
```yml
name: Code Check
```

2, 全てのブランチのpush時、プルリクエストがマージされた時に実行。
```yml
on:
  push:
    branches:
      - "**"
  pull_request:
    types:
      - closed
```

3, jobの実行環境を指定
```yml
runs-on: ubuntu-24.04
```

4, postgreSQL16を使用、envに接続情報を設定
```yml
postgres:
    image: postgres:16
    env:
      POSTGRES_HOST: localhost
      POSTGRES_USER: postgres
      POSTGRES_PORT: 5432
      POSTGRES_DB: puppet_ci_test
      POSTGRES_PASSWORD: postgres
    ports:
      - 5432:5432
```

5, コードをワークフロー内にクローン
```yml
- name: Checkout code
  uses: actions/checkout@v4
```

6, pythonバージョン3.11系の最新版をセットアップ
```yml
- name: Set up Python
  uses: actions/setup-python@v4
  with:
    python-version: "3.11"
```

7, pipを最新化し、requirements.txt記載のライブラリインストール
```yml
- name: Install dependencies
  run: |
    python -m pip install --upgrade pip
    pip install --no-cache-dir -r requirements.txt
```

8, コード内で使う環境変数を設定し、testsディレクトリ内のpytest実行
```yml
- name: Run Pytest
  env:
    POSTGRES_HOST: localhost
    POSTGRES_USER: postgres
    POSTGRES_PORT: 5432
    POSTGRES_DB: puppet_ci_test
    POSTGRES_PASSWORD: postgres
  run: pytest tests
```

# 補足
実装のDB接続箇所では、下記でgithub actionsの場合に分岐できるので、8で設定した環境変数を使うよう切り替えます。
```python
import os

# github actions workflow内の場合の処理
if "GITHUB_ACTIONS" in os.environ:
    # 環境変数POSTGRES_USER読み込み
    os.getenv("POSTGRES_USER")
```


# 参考サイト
https://docs.github.com/ja/actions/writing-workflows/workflow-syntax-for-github-actions

https://hub.docker.com/_/postgres
【勉強記録】たのしいRubyを読み終えました

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
本日は10/20からずっと勉強していた「たのしいRuby」を一通り完了したので、内容についてと今後やっていくことについて書いていきたいと思います。

# 全体を通して
「たのしいRuby」の前にRubyの概要を学ぶために「ゼロからわかるRuby超入門」をやっていたのですが、もっと基礎的な内容だと思っていたら、よりRubyについて深く学ぶことができました。
現在語学学校に通っているので、勉強時間を取れても一日3時間が限界でしたが、それでも、11月中に終わると思っていたのが、約二週間オーバーしてしまいました。

この書籍は辞書的な役割としてもこれからも参考書として使用できると思いますし、多くの「わからない」、つまり成長をくれたこの本には感謝ですね。
所々で説明が薄いところがあるので、もしこの書籍をやられる方はChatGPTとリファレンスマニュアルを合わせて使用すると理解度が上がると思います。

# 今後の計画

私自身、書籍にあるコードを実際に書いてみて理解してから進んでいましたが、それは0からコードが書けるとはまったく別の能力だと思います。
これからのやることは、ChatGPTに「たのしいRuby」のチャプターを読み込んで問題を作成してもらうことです。
レベルは1から10まであり、10レベルは現役エンジニアがコードを書くのにかなり苦労するレベルにしてもらうようにしています。

自分の理解度を確かめるために、レベル6～7くらいの問題を出してもらって解くようにしようと思います。
これからの記事はその問題を中心とした記事となると思いますのでよろしくお願いします。
消えゆくプログラミング言語 - レガシー言語たちの第二の人生


# 消えゆくプログラミング言語

プログラミング言語の世界も、アイドルの世界と同じでデビュー、全盛期、そして引退（?）があります。今回は、かつてスーパースターだった言語たちの現在をお届けします。



## COBOL：銀行の裏方として今日も働く長寿番組

1959年デビューのCOBL（Common Business Oriented Language）は、まさに「**平成を超えて令和も頑張るベテラン言語**」です。

```cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
PROCEDURE DIVISION.
    DISPLAY "お客様の残高は".
    ADD SALARY TO BALANCE GIVING NEW-BALANCE.
    DISPLAY NEW-BALANCE "円です".
STOP RUN.
```

英語に近い文法で「ADD A TO B GIVING C」のように書けるため、当時の経理部員たちを魅了しました。今でも金融機関の基幹システムで現役バリバリ。ただし、保守できるプログラマーの平均年齢は上がる一方で、「COBOL技術者、まもなく還暦」なんて冗談が冗談でなくなってきています。

## FORTRAN：研究室に生息する理系の生き字引

1957年生まれのFORTRAN、通称「**科学計算界の大御所**」。

```fortran
      PROGRAM MATRIX_MULTIPLY
      DIMENSION A(10,10), B(10,10), C(10,10)
      DO 10 I = 1,10
         DO 10 J = 1,10
            C(I,J) = 0
            DO 10 K = 1,10
10             C(I,J) = C(I,J) + A(I,K) * B(K,J)
      END
```

現代ではPythonやRに押され気味ですが、「計算速度なら私に任せなさい」と、今でも研究室の片隅で複雑な方程式を解いています。

## Pascal：元教育者の優等生

1970年代、「**構造化プログラミングの申し子**」として教育現場で大活躍したPascal。

```pascal
program StudentGrades;
var
  grade: integer;
begin
  writeln('成績を入力してください:');
  readln(grade);
  if (grade >= 80) then
    writeln('優秀です！')
  else if (grade >= 60) then
    writeln('合格です')
  else
    writeln('もう少し頑張りましょう');
end.
```

厳格な文法で多くの学生を育て上げましたが、今ではより自由奔放なPythonに教壇を明け渡しています。

## BASIC：パソコン少年の思い出

1964年生まれのBASIC、80年代には「**パソコン少年の相棒**」として大ブレイク。

```basic
10 PRINT "こんにちは！"
20 INPUT "お名前は？"; N$
30 PRINT N$; "さん、プログラミングを始めましょう！"
40 FOR I = 1 TO 3
50 PRINT "BASIC is Fun!"
60 NEXT I
```

「10 PRINT "HELLO"」で始まる簡単なプログラムで、多くの少年少女をプログラミングの世界に導きました。

## Perl：テキスト処理の忍者、引退を考える

1987年デビューのPerl、90年代のWeb開発では「**テキスト処理の忍者**」として大活躍。

```perl
#!/usr/bin/perl
$text = "Perl は テキスト処理の 達人です";
if ($text =~ /テキスト処理/) {
    print "マッチしました！\n";
}

@words = split / /, $text;
foreach $word (@words) {
    print "$word\n";
}
```

正規表現を自在に操り、CGIスクリプトの第一人者として君臨しました。

## Ada：軍事機密として生き続ける厳格主義者

1980年代、米国防総省が育てた「**信頼性の守護神**」Ada。

```ada
with Ada.Text_IO; use Ada.Text_IO;
procedure Security_Check is
   Level : Integer;
begin
   Put_Line("セキュリティレベルを入力してください:");
   Get(Level);
   if Level >= 5 then
      Put_Line("アクセス許可");
   else
      Put_Line("アクセス拒否");
   end if;
end Security_Check;
```

厳格すぎる性格が災いして民間での普及は今一つでしたが、軍事システムや航空宇宙分野では「堅実な仕事ぶり」を買われ、今でも密かに活躍中です。

## なぜ消えていったのか

あらゆるものに「オワコン」（この言葉もすでにオワコンですが..）の烙印が押されるように、プログラミング言語にも以下のような「**引退の危機**」が訪れます。

1. 新人の台頭（より使いやすい言語の登場）
2. ファンの減少（開発者コミュニティの縮小）
3. 新しいトレンドへの対応の遅れ
4. 若手育成の失敗（学習リソースの不足）
5. 事務所の解散（企業サポートの終了）

## それでも偉大な足跡

しかし、これらの「引退」した言語たちは、プログラミングの歴史に大きな足跡を残しました。

- COBOLは「**ビジネスロジックの書き方**」を確立
- FORTRANは「**科学技術計算の高速化**」に貢献
- Pascalは「**きちんと構造化**」の大切さを教育
- BASICは「**プログラミングの楽しさ**」を広める
- Perlは「**テキスト処理の自由さ**」を示した
- Adaは「**信頼性の重要性**」を説いた

今でこそ第一線を退いていても、彼らの功績は現代の言語たちに確実に受け継がれています。まさに「巨人の肩の上に立つ」現代のプログラミング言語たちなのです。

これらの言語の歴史は、技術の進化と共に変化する要求に対応し続けることの重要性を私たちに教えてくれています。

:::note info
※個人的な補足：
実は、これらの言語が「消えゆく」というのは少し語弊があるかもしれません。確かに主流ではなくなっていますが、例えばCOBOLは金融システムの重要な部分で現役で動いていますし、FORTRANは科学計算の分野で今でも新しいコードが書かれています。「役割が変化している」というのが、より正確な表現かもしれません。
:::