OmniAICreator/Qiita-1.07M huggingface dataset:
AWSのKDGーKinesis Data Generatorを使ってみた

## はじめに
株式会社ジール所属の王です。
普段はクラウド（AWS、GCP）を使って開発と運用を行っています。
開発検証などで学んだことを都度アウトプットしたいと思います。
日本語はそこまで上達ではないので、なるべく簡潔なことばで纏めたいと思います。

今回の記事はAWSのkinesis data streamを使う時に、データテストするためのKDGの実装手順を纏めたいと思います。
コマンドでテストデータを送るより、KDGはとても便利なツールだなと感じております。ぜひ使ってもらいたいです。

## 参考リンク
今回の検証はどちらも公式の手順を参考してやったことなので、直接公式リンクを参考しても問題ないと思います。詳細な作成エビデンスを参考したい場合は本記事を参考できればと思います。

[KDG作成の参考手順](https://aws.amazon.com/jp/blogs/news/test-your-streaming-data-solution-with-the-new-amazon-kinesis-data-generator/)
[Amazon Cognitoユーザーの作成の参考手順](https://awslabs.github.io/amazon-kinesis-data-generator/web/help.html#configAccount)

## 検証内容
１，KDGの送信先として設定で使うために、前提条件としてはkinesis data streamを作成されたことを確認してください。
２，Congnitユーザー作成すること。前述のAmazon Cognitoユーザーの作成の参考手順にアクセスして、「Create a Cognito User with CloudFormation」というボタンをクリックして、自分のAWSにログインしてCloudFormation画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174120/b243f2a4-7306-10af-ddb5-d71ac3ee75c7.png)
３，画像通りにすでに設定してもらった内容をそのままで「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174120/af157e5c-b669-33ed-7fbb-739e865794a7.png)
４，スタックの詳細を指定のところに、ユーザー名とパスワードを設定します。※パスワードをメモしたほうがいいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174120/b3002528-9fb6-6193-5b9d-1e82b73b7ca3.png)
５，スタックオプションの設定画面で、必要であればタグ設定をします。IAMロールを新規作成してもらうため、なにもいじらなくてよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174120/fb3646ef-b469-d4ed-2bba-6dc8b0a77500.png)
６，最後のIAMリソースを自動作成の承認をチェックしてから「送信」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174120/ff98f9ff-2fca-52d0-4b08-1336ce7057ff.png)
７，待つだけでCloudFormationのスタックが作成されたことが確認できます。対象のスタックのところに遷移して、「出力」タブにアクセスします。「値」のところのリンクはKDGのリンクです。クリックしてログイン画面に行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174120/fb017f1d-ec0e-53b9-3867-06a20922e3f8.png)
８、設定するとき控えたユーザーとパスワードを使って、KDGにログインすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174120/09ccd82a-8e2a-dea1-14ce-2ac736f36492.png)
９，ログイン後、画面に従って設定を行えば送信ボタンですぐリアルタイムのデータ送信ができます。
設定内容はリージョン、事前に作成されたstreamあるいはfirehose、秒ごとのレコード数、テンプレートです。
テンプレートはKDG作成の参考手順にも例（天気情報のデータ）があります。そのまま使う場合は、コピペするだけでよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174120/4ca963c0-5585-4cfe-df9e-74b09425d7bc.png)
１０，設定が終わったら「send」を押せばすぐ送信開始です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174120/7e765284-6c1b-6c82-3e2d-1e9396674c3d.png)
１１、送信中には「Stop sending data to kinesis」ボタンでいつでも送信停止できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174120/c75ee37a-5a96-64f3-601b-f5277cdedb43.png)
１２，こちらのテストではS3に出力したデータを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174120/a4ecfbd2-780e-1e95-264c-c59acc3f9f99.png)

## まとめ
以上はKDGの設定手順となります。
結構シンプルで軽くkinesisのリアルタイムデータテストを実施することができます。
いざという時のテストなら20分ぐらいですぐ構築検証できるのは魅力です。
参考できればと思います。
chatGPTによる性格診断

# chatGPTによる性格診断

最近、AIによる性格診断が注目されています。そこで今回は、chatGPTによる性格診断についてご紹介します。

## chatGPTとは

chatGPTとは、OpenAI社によって開発されたAIチャットボットです。人工知能が発達した現代において、chatGPTはニューラルネットワークを用いて人間の言葉や文章から学習することで自然な対話が可能となっています。

## chatGPTによる性格診断の方法

chatGPTを用いた性格診断は、発言集を入力することで、その人物像や信念、長所、短所や大切にしていることなどを解析するものです。以下がプロンプトです。

```
以下は発言集である。この人物について例の通り解析して。

例
## 人物像
-  aaa
-  aaa
-  aaa

## 信念
-  aaa
-  aaa
-  aaa

## 大切にしていること
-  aaa
-  aaa
-  aaa

## 長所
-  aaa
-  aaa
-  aaa

## 短所
-  aaa
-  aaa
-  aaa

発言集
「」
「」
「」
・
・
・
```


chatGPTを用いた性格診断は、簡単かつ迅速に行うことができ、自己分析やコミュニケーションの改善に役立つことが期待できます。

## まとめ

chatGPTを用いた性格診断は、AIの発展により可能となった新しい診断方法です。人工知能が自然言語処理を通じて、自分自身の性格を分析、診断することは、自己理解にもつながります。この機会に、chatGPTを用いた性格診断に挑戦してみてはいかがでしょうか。
クラウドとは? セキュリティとは? 改めて整理してみよう

多くのお客様がクラウドを利用する中、クラウド環境上の重要資産をあらゆるサイバー攻撃からどのように守るかが大きな課題になってきました。ダイナミックに変化するクラウド環境は従来のオンプレミスと異なるため、セキュリティ対策の考え方やアプローチも根本的に異なるはずですね。

# クラウドとは?
"クラウドファースト"という言葉が浸透されてきた昨今、多くの企業がクラウドを利用してビジネスを遂行しているかと思います。サービスを提供する側もIaaS/PaaS/SaaSのようなサービスモデルや、Public/Private/Governmentのような配備モデルも潤沢になってきており、利用する企業の業種や成熟度に応じて柔軟に選択できるようになってきたことが大きいと感じています。

同時に、サイバー攻撃の手法は日進月歩で進化しており、攻撃者側も体系化された組織と分業モデルでありとあらゆるクラウドのリスクを常に狙っています。特にクラウドは従来のオンプレミスと特性が根本的に異なるため、セキュリティ対策の考え方もまったく異なります。クラウド環境の設定不備が原因で攻撃者に不正に侵入されてしまい、重要な資産を搾取されてしまったといった事故は枚挙に暇がありません。

今一度"クラウド"や"セキュリティ"の定義を整理したいと思います。National Institute of Standard and Technology(以下NIST)が公開しているSP800-145 - The NIST Definition of Cloud Computingで定義しているクラウドの特性の1つに下記のセンテンスがあります。

On-demand self-service. A consumer can unilaterally provision computing capabilities, such as server time and network storage, as needed automatically without requiring human interaction with each service provider.

日本語では、"ユーザが第三者を介することなくダイナミックに資産を配備できること"と表現できます。クラウド≒ダイナミックに変化するIT環境と定義できると思います。

# セキュリティとは?
"セキュリティ"とは何かを守ることでこれは疑いようがありません。さらに深堀りするとConfidentiality - Ingegrity - Availability(以下C.I.A原則)を担保しながら何かを守ることかもしれませんが、この記事では便宜的にセキュリティ≒重要な情報資産を守ることとします。

# クラウドセキュリティとは?
クラウドセキュリティとは、"ダイナミックに変化する環境で管理されている重要な資産を攻撃から守ること"と言えます。重要な資産は企業によって様々で一概に定義することは困難かと思いますが、一般的には製品設計情報、顧客の個人情報、パスワードやシークレット等のクレデンシャルが企業の重要資産かと思います。

これらの重要資産もクラウド環境では仮想マシン、コンテナ、ファンクション等の様々なワークロード上で管理・運用されているケースがほとんどです。先に定義したとおり、クラウドはダイナミックに変化するため、ワークロードも起動/停止したり常に状態が変化します。

ワークロードの通信を支えるネットワークやセキュリティの設定も常に変化します。オンプレミスの時代では、ネットワークやセキュリティの設定はITの専門スキルを持った部門が担当していましたが、クラウドはAPIを介して多くのユーザが設定を行います。ITの専門スキルを持っていないユーザがなんとなく設定を行うシーンも少なくありません。

ここでもう一歩踏み込んでクラウドセキュリティの考慮点を整理したいと思います。サイバーセキュリティの世界では長きに渡りC.I.A原則が謳われてきました。各々を再度整理します。

CはConfidentialityです。認可されていないユーザが不正に機密情報にアクセスすることを防ぐ原則です。現在は必須とされている多要素認証やデータの暗号化がこれにあたります。次のIはIntegrityです。データは常に信頼できるものとして扱かわれるべきとした原則で不正に改ざんされることを回避することです。データのHash比較やSigniture等の対策が有効です。最後のAはAvailabilityです。ユーザが必要な時に常にデータにアクセスできる原則です。古くは共有ストレージを用いたクラスタリングシステム等がこれに該当します。

# C.I.A原則はクラウドセキュリティでも必要なのか?
先にクラウド≒ダイナミックに変化するIT環境と定義しました。この定義から改めてC.I.A原則の有効性を考察したいと思います。昨今では従来のC.I.A原則に加えてクラウドならではのD.I.E原則が謳われはじめています。

DはDistributedでサービスは常に分散されていると捉えることです。クラウド環境上のサービスは常に分散されているため、C.I.A原則のAは担保されています。お客様が自前でクラスタリングのような面倒な対策を施す必要はありません。IはImmutableでいつでも望んだ環境を構築できてそれらの環境は変更できないと捉えることです。仮に新しい攻撃で資産が不正に変更されてもいつでも作り直しできるため、C.I.A原則のIは担保されていると考えられます。EはEphemeralで日本語に訳すと刹那的とか儚いといった意味です。Workloadは停止したり消したりするので、認可されていないユーザが機密情報にアクセスしてしまうことは少なくなります。C.I.A原則のCは担保されていますね。

クラウド環境では多くのスタックがD.I.E原則に倣って構成されるため、従来までのC.I.A原則が必ず当てはまるとは限りません。前例踏襲ではなく、ゼロから適切なアプローチを検討を模索し続ける姿勢が不可欠ですね。
Wi-Fi環境を把握して最適なプレイを。PS5のリモートプレイに役立つシェルスクリプト

出張が多い人や移動中にゲームを楽しみたい人にとって、Wi-Fi環境は非常に重要です。しかし、どのような環境でも安定しているわけではありません。そこで、Wi-Fiの接続環境を定期的にモニタリングして表示するシェルスクリプトがあると便利です。

このシェルスクリプトを使用すると、ホテルやカフェなどのWi-Fi環境のSSID、上り・下り速度、レスポンスタイムなどを表示することができます。これにより、どのWi-Fi環境が安定しているか、どの環境でゲームをプレイするのが最適かなどを判断することができます。

本記事では、PS5のリモートプレイを楽しむために役立つWi-Fi環境のモニタリングについて、どのようにシェルスクリプトを使用するか、どんなシェルスクリプトなのかを解説します。

## 環境

- macOS Ventura 13.1
- MacBook Pro (14-inch, 2021)


## シェルスクリプトの実行結果

時刻とSSIDと、Uplink/Downlinkのスピード、レスポンス、レイテンシを表示します。

```shell
# user @ machine in ~/xxx/yyy [22:59:39] C:130
$ speedtest-loop.sh
（2023-03-16 23:56）	SSID: 1621_AAAA	↑ 7.742 Mbps	↓ 17.308 Mbps	Low (15 RPM)	40.500 milliseconds
（2023-03-17 01:38）	SSID: 1621_AAAA	↑ 7.432 Mbps	↓ 10.533 Mbps	Low (5 RPM)	42.042 milliseconds
（2023-03-17 04:53）	SSID: 1621_AAAA	↑ 4.603 Mbps	↓ 33.296 Mbps	Low (42 RPM)	44.500 milliseconds
（2023-03-17 10:43）	SSID: BBBB cafe	↑ 54.427 Mbps	↓ 208.024 Mbps	Low (33 RPM)	26.708 milliseconds
（2023-03-17 10:48）	SSID: BBBB cafe	↑ 76.402 Mbps	↓ 176.530 Mbps	Low (32 RPM)	25.667 milliseconds

```

たったこれだけですけど、たいへんありがたいのです。


## シェルスクリプトの本体

たとえば `speedtest-loop.sh` というファイルに下記スクリプトを記述します。

```shell
#!/bin/zsh

while true
  do
    ssid=$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk -F': ' '/ SSID/ {print "SSID: " $2}')
    output=$(networkQuality)
    uplink=$(echo "$output" | awk -F': ' '/Uplink capacity/{print $2}')
    downlink=$(echo "$output" | awk -F': ' '/Downlink capacity/ {print $2}')
    res=$(echo "$output" | awk -F': ' '/Responsiveness/ {print $2}')
    idle=$(echo "$output" | awk -F': ' '/Idle Latency/ {print $2}')
    printf "（$(date '+%Y-%m-%d %H:%M')）\t%s\t%s\t%s\t%s\t%s\n" "$ssid" "↑ $uplink" "↓ $downlink" "$res" "$idle"
    sleep 300
done


```

## その他のセットアップ

- `speedtest-loop.sh`は任意のフォルダに置きます。
- `~/bin` に、`ln -s /path/speedtest-loop.sh speedtest-loop.sh`でシンボリックリンクを置きます。
- `~/bin` にパスを通しておきます。
- terminalを起動し、`speedtest-loop.sh`を起動します

## おわりに

このシェルスクリプトを使用することで、Wi-Fi環境をモニタリングして、最適な環境でゲームを楽しむことができます。このシェルスクリプトは、macOSで動作し、簡単にセットアップすることができます。定期的に実行されるため、Wi-Fi環境の変化を常に把握することができます。是非、このシェルスクリプトを活用して、快適なゲームライフを送ってください。
【Reray】GUI版を公開しました

# Reray GUI Edition
今まではコンソール版しかありませんでしたが、このたびRerayのGUI版を開発しましたので紹介します。
操作は非常に簡単ですので、コンソール版で躊躇していた方は是非使ってみてください。

# Rarayとは
ドメイン取得不要、クラウドサービスやレンタルサーバーの契約不要でローカルのサーバーを簡単にインターネット上に公開できるサービスです。

# 公式サイト
[https://reray.net](https://reray.net)

# 見た目
起動するとこんな感じです。非常にシンプルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711406/d5e1bb59-c54d-6409-408b-32f64a0950c5.png)

# 使い方
### 認証情報設定
最初だけ認証情報の設定が必要です。
認証設定タブを開いて**メールアドレス**と**認証トークン**を入力し、設定ボタンをクリックして認証情報を登録します。
認証情報は [Reray公式サイト](http://qiita.com) のログイン後のマイページで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711406/6d2564dd-334b-3bcc-6df1-cbcd77c86f0d.png)
認証情報の設定は変更が無い限り初回のみでOKです。

### 接続
接続タブにて**インターネット上へ公開したいローカルサーバーのポート番号**を入力し、接続ボタンをクリックします。
「〇接続されました。Let's access! -> [https://xxxxxx.reray.net/](https://xxxxxx.reray.net/)」と表示されればOKです。これだけで完了です。
※xxxxxxは会員登録時に入力したサブドメイン名です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711406/3fc6d873-777c-1846-b049-0e56de5d8563.png)
Apacheやnginxは **80**、Tomcatは **8080** などと入力します。

ブラウザなどで [https://xxxxxx.reray.net/](https://xxxxxx.reray.net/) にアクセスしてください。

| ローカルサーバーの<br>ポート番号 | ローカルのURL | 公開時のURL |
|:-|:-|:-|
| 80 | http://localhost/ | https://xxxxxx.reray.net/ |
| 8080 | http://localhost:8080/test/ | https://xxxxxx.reray.net/test/ |

## オプション
特定の人にだけアクセスを許可したい場合はBasic認証を設定することができます。
Basic認証欄の**ID**と**パスワード**を入力してから接続してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711406/2969d5a0-9a9e-99e4-4bf6-9d3ce932fb3b.png)

以上となります。非常にシンプルなので是非使用してみてください。
primary keyをid以外にしたときのforeign keyとassociationの設定に詰まった

普段あまりやらないですが、primary keyをid以外にした時に詰まったのでメモです。

## サンプルコード

以下のようにprimary_keyがidではないusersテーブルがあります。

```db/schema.rb
# primary_keyがidのusersテーブル
#    create_table "users", force: :cascade do |t|
#      t.string "name", null: false
#    end

# primary_keyをuuidにしたいとき
   create_table "users", primary_key: "uuid", id: :string, force: :cascade do |t|
     t.string "name", null: false
   end
```

そして、以下のようにarticlesテーブルを作成します。

```mermaid
erDiagram
    users ||--o{ articles: has_many
    users {
        string uuid
        string name
    }
    articles {
        integer id
        string user_uuid
        string title
        text body
    }
```

この際、`references`を使うと、primary_keyの指定ができませんでした。
そのため、`user_uuid`テーブルと`foreign_key`を個別に指定します。

また、うっかりミスなのですが、`t.references :user`から`t.foreign_key :users`に変える時に、user**s** と、テーブル名に書き換え忘れていました。

https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html#method-i-foreign_key

```diff_ruby
 class CreateArticles < ActiveRecord::Migration[7.0]
   def change
     create_table :articles do |t|
-      t.references :user, null: false, foreign_key: true
+      t.string :user_uuid, null: false
+      t.foreign_key :users, column: :user_uuid, primary_key: :uuid
       t.string :title, null: false
       t.text :body, null: false
       t.timestamps

+      t.index :user_uuid
     end
   end
 end
```

また、このままだと`user.articles`を取得しようとした時に、`article.user_id`を参照したりしてしまうので、associationの設定も必要です。
以下のようにbelongs_to, has_manyを設定すると`user.articles`, `article.user`の設定ができました。

```diff_ruby
class Article < ApplicationRecord
-  belongs_to :user
+  belongs_to :user, primary_key: :uuid, foreign_key: :user_uuid
end

class User < ApplicationRecord
-  has_many :articles
+  has_many :articles, foreign_key: :user_uuid
end
```

## 参考

- [ActiveRecord::ConnectionAdapters::Table](https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html#method-i-foreign_key)
- [ActiveRecord::Associations::ClassMethods belongs_to options](https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to-label-Options)
  - [Active Record Associations — belongs_to :foreign_key](https://guides.rubyonrails.org/association_basics.html#options-for-belongs-to-foreign-key)
  - [Active Record Associations — belongs_to :primary_key](https://guides.rubyonrails.org/association_basics.html#options-for-belongs-to-primary-key)
- [ActiveRecord::Associations::ClassMethods has_many options](https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many-label-Options)
  - [Active Record Associations — has_many :foreign_key](https://guides.rubyonrails.org/association_basics.html#options-for-has-many-foreign-key)
rspec: 予約語を含むカラムの値をfactory_botで設定するには

`add_attribute` をつかえ！
以上。

~~`self` なんてカラム定義するなよぉ・・・~~

### NG
```
factory :books do
  title { "title" }
  self { "my self" }
end
```
### OK
```
factory :books do
  title { "title" }
  add_attribute(:self) { "my self" }
end
```

### Reference
https://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md#method-name-reserved-word-attributes
トップ画像をスライダー形式に変更

## 参考
https://osamudaira.com/408/

https://osamudaira.com/411/

## 参考（Active Strage）
https://qiita.com/hmmrjn/items/7cc5e5348755c517458a#active-storage-%E3%81%A8%E3%81%AF

https://pikawaka.com/rails/active_storage
「リーダブルコード」をPHPで実践しよう（第二章）

# 概要
自分の所属する会社の人が「[リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)」を読んだあとのインプットの質を上げられればと思い作成しました。 
問題の後に回答を折りたたみで記載しているので、確認する際は開いていただければと思います。

# 問題1：変数名

* コード内の変数名の問題点とその理由を示してください。

```php

$users = [
    [
        'name' => '佐藤太郎',
        'birthday' => '1971年2月2日',
    ],
    [
        'name' => '鈴木一郎',
        'birthday' => '1981年5月7日',
    ],
    [
        'name' => '小林三郎',
        'birthday' => '1995年12月20日',
    ],
];

$allUserCount = count($users);
for ($i = 0; $i <= $allUserCount; $i++) {
    $users[$i] += [
        'age' => calcAge($users[$i]['birthday'])
    ];
}

function calcAge($birthday) 
{
    ~~~~~~~
    return $age;
}
```

### 回答
<details><summary>コード・解説</summary>

* 変数名は汎用的な名前を付けないようにしましょう。省略やただ汎用的な命名の変数名は、初めて読む人が誤って意味を取り違えて認識するなどのケースを発生させる恐れがあります。変な抽象的な命名はあらぬ誤解を生みかねません。
    * 少し冗長かもしれませんが、以下のような変数名にしたほうが誤用を防げると思います。


```php
$users = [
    [
        'name' => '佐藤太郎',
        'birthday' => '1971年2月2日',
    ],
    [
        'name' => '鈴木一郎',
        'birthday' => '1981年5月7日',
    ],
    [
        'name' => '小林三郎',
        'birthday' => '1995年12月20日',
    ],
];

for ($userCount = 0; $userCount <= count($users); $userCount++) {
    $users[$i] += [
        'age' => calcAge($users[$i])
    ];
}

function calcAge() 
{
    ~~~~~~~
    return $age;
}
```

また、もしループが多次元化してしまっているケースにおいて$iを使用していると変数名被りが発生し、無限ループを生み出してしまう恐れがあります。

```php

for ($i = 0; $i <= 5; $i++) {
    if ($i === 0) {
        continue;
    }
    for ($i = 0; $i <= 2; $i++) {
        echo "{$i}回目のループです";
    }
}
```

</details>

# 問題2：メソッド名

* コード内の変数名、メソッド名の問題点とその理由を示してください。

```php

// 会社の一覧を取得
$c = getCompany();

function getCompany()
{
    return [
        'Qiita1株式会社',
        'Qiita2株式会社',
        'Qiita3株式会社',
    ];
}
```


### 回答
<details><summary>コード・解説</summary>

* メソッドの命名は、メソッド内の処理の結果を可能な限り正確に反映するようにしましょう。今回のケースでは複数の会社名の取得が行われているので、メソッド名もそれを反映する名前にする必要があります。もし単数形かつ抽象的な命名のままでは、今後ほかの場合に使用した際に誤ってメソッドの拡張（コードの付け足し）をしてしまうことが起こりかねません。
    * また、getなどの動詞部分についても検討してもよいかもしれません。機能要件に店舗名の検索が含まれていたり、当のメソッド内で何らかの条件が含まれているといった場合には`searchCompanyNames`という名前にしても良いと思います。

```php
$companyNames = getCompanyNameList();

function getCompanyList()
{
    return [
        'Qiita1株式会社',
        'Qiita2株式会社',
        'Qiita3株式会社',
    ];
}
```
</details>

# 終わりに
解決策や回答案につきまして他にもあると思います。
こういう指摘がある、こういうケースは？などについても仰っていただければと思います。

# 謝辞
@kyok01_japan さんの[こちらの記事](https://qiita.com/kyok01_japan/items/cc6df24164bc291677bd)を参考にこの記事を書きました。
事後報告で申し訳ございません、ありがとうございます。
【DB設計】現場で使う正規化崩しのパターン

# 本記事の目的

「テーブル設計、ほんとにこれがベストなのかな...?」

と思うことありますよね。シンプルなテーブル構造だと普通に正規化すれば問題なく運用できるんですが、ビジネスルールが複雑だったりするとあえて正規化を崩した設計を行うこともあります。ですが、「正規化を崩して何が嬉しいのか?」を論理的に考え、メリット・デメリットを考慮することによって、うまくトレードオフスライダーを調整することができるようになります。本記事では正規化も含めて、それぞれの正規化崩しがどのような目的のもと行われるのかを整理してみました。(なので、RAIDなどの物理設計は割愛します。)

# 正規化の功罪
そもそも、なぜ正規化崩しをやらないといけないのか?というと、、、

「**正規化は、データ整合性を担保するためにパフォーマンスを犠牲にするから**」です。

特に、多数の結合を必要とする検索のパフォーマンスがネックになることが多いですね。例えば、「あるブランドの商品を合計10,000円以上買った顧客を検索したい」というケースの場合、ウチのテーブル設計だと7つのテーブルを結合する必要があります。

購入に関わるデータは不整合が許されないため、かなり厳密に正規化を行っている反面、「結合」というメモリ消費の大きな処理を行うために著しくパフォーマンスが落ち、頑張ってチューニングしても大量データだと検索に10秒、20秒とかかってしまうことがあります。

正規化崩しの目的はここにあります。集計や結合などによって著しくパフォーマンスが落ちる検索を、あえて正規化を崩した冗長なデータを追加することで解決するためです。逆に、**「クエリが書きやすいから」といった安易な発想で正規化崩しをやってはいけない**ということですね。正規化崩しはどうしてもパフォーマンスを改善したいときに、インデックス追加やクエリのパフォーマンス・チューニング等最大限のことを検討した後に最後の手段として行うというのが基本方針となります。

# 正規化崩しパターン

### サマリーデータ
最も多用するのがこのパターン。普通に集計しても値がわかるけれど、結合が多く処理に数秒かかってしまうような場合、画面を叩くたびに数秒待たされるようではアプリケーションの品質基準をクリアできません。

稚拙ですが、例えばユーザーの平均年齢を管理者ページで出したいとしましょう。ユーザーには生年月日を登録してもらうとして、

1)まず生年月日から全ユーザーの現在の年齢を算出
2)その年齢の平均を取る

と、2段階の処理が必要になりますが、冗長な「年齢」というカラムを追加することで1つめの処理を省略することができます。

注意ポイントは、冗長なカラムは整合性を保ちづらいことです。年齢は時が経てば増えていきますが、レコードを更新しなければ不整合になってしまうので、年齢を更新するバッチ処理などを行って整合性を保たなければいけません。

例に上げたレベルであればパフォーマンスは問題ないと思いますが、大量データ×大量結合が必要なサマリーデータの場合は冗長なカラムを追加することでパフォーマンス問題を解消するケースがあります。しかしながら、サマリーデータは整合性だけでなく即時性も失われるので、常に最新の値を集計したいというケースにも不向きです。

### サマリーテーブル
サマリーデータの応用編ですね。大量レコードの集計にスピードが求められる際に使用します。結合して数十万〜数百万のレコードくらいが目安でしょうか。

ただ、メンテされず数字が合っているかどうかわからない集計テーブルは地獄なので、使う際は十分ご注意を。

### 配列
バルクインサートするまでもなく、ただ配列として顧客IDなどを数万件保存しておきたい場合などに使用します。アプリケーションでこのテーブルを使うというより、バグが起きたときに調査しやすいように魚拓をとっておきたい場合などが当てはまります。

### 番外編：JSONで複雑な定義を乗り切る
これは、パフォーマンスの改善というよりもカラム定義が難しいものを処理するときに使用します。

ツリー構造だったり、カラムが一意に定義できない状態が発生する「設定項目」などを永続化するときに使います。先程の顧客検索を例に取るなら、

・ 「あるブランド」の商品を「n」個以上購入したことがある
→ブランドIDと商品の個数をカラムで定義する必要がある

・「列挙した顧客ID」に含まれる
→そもそも顧客IDの個数が可変。

このどちらもある「条件」として扱いたいのですが、そもそも値の定義がすべて違いますし、1つの「条件テーブル」でこれらを同時に扱うのは無理があります。そこで、

・ 「あるブランドID」の商品を「n」個以上購入したことがある
→`{brand_id: 100, count: 3}`

・「列挙した顧客ID」に含まれる
→`{customer_ids: [1, 2, 3, 4, 5]}`

このように、JSONで一意に管理した方がむやみにカラムやテーブルを増やすよりもメンテナンス性が上がると考えられます。もちろん、検索性はかなり損なわれますが、「特定の条件で検索したい」という要件がなければ問題なく運用可能です。

ただ、JSON型を許可して複雑なことをやってしまうと運用がカオスになる懸念から、現場ではあえて使いづらいtext型にしていたりします。黒魔術は用法用量を守りましょう。
WEBGL用ゲームエンジン作ってみる ~20日目~

# 初めに

こんにちわ。
やろうって決めたゲームエンジンづくりですが、
今のところ挫折せずになんとか続いております。
あっという間で具体的に初めてから20日間がたちました。

前回の記事の続きです。
1日目：https://qiita.com/osakasho/items/f02d7acf8a822e25d3e0
10日目：https://qiita.com/osakasho/items/543eb0888b0a4e9162d2
20日目：イマココ<<

以下、現在のエディタ進捗キャプチャ
※当初設計より、めちゃUI変更しました。
![editorCap1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/934e53d7-dec6-f425-8dac-207f71bed901.jpeg)

美しいUIにするだけでそれっぽいですね。
とりあえず暫定的にPlayとStopで動作しますが、
まだ、作成途中です。

GITHUBレポジトリも作成しました。
**※まだ全然使えるレベルじゃないです。**
MITライセンスですべてオープンソース化します。

https://github.com/foasho/NinjaGL


# 追加した内容
## エディタUIの更新
スケール・回転・位置の変更をできるようにしました。
![スクリーンショット 2023-03-17 023326.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/5ba5b2f6-a8a0-2877-77f3-d98bd44f02b3.jpeg)


## プレイヤーエディタ
直感的にアニメーションを追加できるようにしました
![motioneditorcap.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/18d961d6-ef67-deab-2ea1-54b28420c530.gif)

## 地形メーカー
これは以前記事で書いたリソースもの(https://qiita.com/osakasho/items/3155111258125ba6a22d)
を、少し使いやすくしただけなのであまり進化してないです。
![terraineditorcap.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/8a1fdc9d-fd1d-cc0a-975c-10c6bc8bfb92.gif)


## デバッグプレイ機能
これが一番大事かもしれませんね。
エディタで追加したオブジェクトをすぐに確認できる機能です。
![debugplayeditorcap.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/928cf961-0e67-de6e-8502-fbdcde9d5136.gif)

## スクリプトエディタ
より複雑な機能にはコードベースが必須なので、用意しました。
今のところ書けて保存できるだけです。
![scriptplayeditorcap.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/66aa9648-a4aa-5aeb-d54c-865d8bcc00cb.gif)

## シェーダエディタ
これもかけるだけなので、
実際に表示しながらかけないといけませんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/70de82e5-e306-2460-d4a2-83c0bde3c13d.png)

# 今後の課題
- バグつぶし：ありすぎて何をかけばいいかわかりません。
- スクリプト対応：JSで任意のオブジェクトに対して対話的に操作できるようにする
- コンテンツブラウザの表示軽量化：Canvasで一時的にモデルをロードして表示するのが、ファイルが多すぎるとメインビューが止まってしまう
- サンプルゲームの作成：FPSっぽい何か作りたい
- WebRTCプラグインの実装：Skywayを使ってマルチプレイヤー対応する
- UI編集および追加：3Dオブジェクトのように直感的にUIを配置できるようにしたい。
- 物理エンジンの強化：今は三角形とAABBの衝突判定しかないので、AABBとAABBで軽量化するなど最適化が必要。
- 自動LODの実装：Next.jsでモデルアップロード時に自動で低ポリを作成し、エディタから自動LODを選択できるようにしたい。
- カメラレイヤー自動切換え：カメラからの距離で自動で表示非表示を切り変える処理

空いてる時間あれば
狂ったようにこれを作っているので、
来月には１つのゲームサンプル作って公開したいです。

おわり。
UnrealEngineでlibzipを使ったPluginを作ってみてAutomation Specでテストを書いてみた

UE5.1.1でlibzipを使ったプラグインを作ってみました(Win64環境のみサポート)。
作成環境や使い方は以下のReadme.mdに記述しています。
https://github.com/mechamogera/UnrealEngineLibzipPlugin

# Plugin作成メモ

EditorのNew PluginでThird Party LibraryのTemplateをベースに作成しました。

## libzipについて

以下を使ってlibzipをstaticビルドしました。

* https://github.com/kiyolee/libzip-win-build.git
* https://github.com/kiyolee/zlib-win-build.git

手順としては、上2つをCloneしてzlib、libzipの順で
　build-VS2022/libzip-static/\*.vxcproj
をVisualStudio2022で開いてRelease x64ビルドして以下のファイルをプラグインに配置

* zlib-win-build/build-VS2022/x64/Release/libz-static.lib
* libzip-win-build/build-VS2022/x64/Release/libzip-static/libzip-static.lib
* libzip-win-build/lib/\*.h
* libzip-win-build/win32/\*.h


# Automation Specテスト

プラグインでは以下のページを参照してAutomation Specのテストを書いてみました。
[Automation Spec | Unreal Engine ドキュメント](https://docs.unrealengine.com/4.27/ja/TestingAndOptimization/Automation/AutomationSpec/)

テストは以下の個所に配置しています。
https://github.com/mechamogera/UnrealEngineLibzipPlugin/tree/master/Plugins/LibzipArchiver/Source/LibzipArchiver/Spec

## テストを書いてみた所感

今回初めてがっつりAutomation Specでテストを書いてみたので所感を記録しておきます。

* エラーケースの挙動を確認してコードを修正できたのが良かった。
* スタブやモックがないので特定の状況でしか発生しないケースは書けないのが残念。
  以下のページで改善についてはふれられてはいる。
  [Mocking for functional and unit tests - Development / Programming & Scripting - Epic Developer Community Forums](https://forums.unrealengine.com/t/mocking-for-functional-and-unit-tests/301770/6) 
* 実行がEditorを起動してSession Frontendから実行なのでテストのサイクルを回すのに時間がかかるのがつらい。
  Editor起動中にテストを変更しても反映する方法がわからない。一度Editorを閉じてVisualStudioでビルドしてまたEditorを起動するのが大変。[Rider for UnrealEngine](https://www.jetbrains.com/ja-jp/lp/rider-unreal/)だとエディタからUnit Testが実行できるらしいのでここら辺のサイクルを早く回せる？
？
フローの質問の覚え

[Flowに関するまとめページに戻る](https://qiita.com/Keiji_otsubo/items/55ebc9c634a3216f3990)


--------------
普段フローを使っていないので、私自身が理解できていないことが多いです。　よく分からなかった質問についてとりあえず書き留めておきます。

+ [ある日付まで一括作成するフローを教えて下さい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000OqJRJ)
+ [フロー・スケジュールトリガーでカスタム通知送信](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JgTZiSAN)
+ [(スケジュールトリガフローのアクション実行回数を1に固定したい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Dx4xSSAR)
+ [フローのレコードコレクション変数の中身をユニークにしたい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JgUsr)
+ [ある日付まで一括作成するフローを教えて下さい : ループを使わずに繰り返し処理を行う](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000OqJRJ)
+ [フローを使って開始日と終了日の期間に対して月に１つのレコードを作成する](https://qiita.com/Keiji_otsubo/items/08ec90f4cbf61fc4b40f)
+ [フローで取得したレコード数を数える](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBnGS)
+ [フローにおいてループする回数を最大12回で止める方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBuMQ)
+ [フローのループを何回も行う方法について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epALQ)
+ [ループを使って複数のテキスト変数に連結する方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBuE5)



# 英語の資料

+ [コレクション変数の数をカウントする](https://qiita.com/Keiji_otsubo/items/ba5342703e7e4497d9b7)
+ [レコード コレクション変数のレコード数をカウントする](https://automationchampion.com/2018/07/17/count-number-of-records-in-a-record-collection-variableariable/)

# 未解決

+ [行動登録画面内にある項目のルックアップ検索条件を動的にしたい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YwWpO)

# 選択できない

+ [フローで取引先責任者レコード作成する際、「取引先名」を選択・入力できない](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KC4LE)

:::note
この画面ではラベルが表示されています。 
下記は弊社の環境で取引先名を得意先・仕入先名と変えています。 

実際にはAccountId　というAPI名の項目を使えばいいと思います。 
ラベル名が違うものになっていませんか？ 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f4ba5f7b-7b5f-8c2f-7653-a1a966ba3254.png)
:::
enebularでalexaスキル その14

# 概要
enebularで、alexaスキルのwebhookを返してみた。
alexaに、繋がる、スマートLEDを作る。
構想編。

# スマートLEDに電源を入れる。

- WiFi　APが立ち上がる。
- SSIDは、smart-led、PASSは、なし。

# スマフォで、APに繋ぐ。

- ブラウザで、設定画面を表示する。
- SSIDとPASSを入れる。

# スマートLEDが、ネットワークに、参加する。
- スマートLEDは、もらったSSIDとPASSで、ルーターに接続し、ゲートウェイとIPアドレスを取得する。

# アレクサで、デバイスを探す。
- アレクサアプリを起動。
- UDPで、M-SERCHをブロードキャストして、スマートLEDから、setup.xmlを取得して、デバイスを登録する。

# 「アレクサ、スマートLEDをオンにして」、でON
- アレクサから、httpがスマートLEDに、飛ぶ。
- スマートLEDは、LEDをONにする。


以上。
App Builder 

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [Lightning App Builder トレイルヘッド](https://qiita.com/Keiji_otsubo/items/2290cbbf9055d0774444)

# AuraClientService.postProcess: error in processing [Maximum call stack size exceeded]

+ [Component Error in App Builder](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgSxA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c46884dc-60a4-8639-3588-ab21ee50f603.png)

:::note
but this was a Blocker
:::

# 2024/06/21

+ [Challenge not yet complete in Customize a Contact Record Page We couldn't find the record page named 'New Account Page' (API Name: 'New_Account_Page') associated with the Account object.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmANY)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/723aee56-08f8-4df1-dfd7-113667af516b.png)

# キャッシュの問題？

+ [カスタム lwc をホームページにドラッグすると、斜めの線が入った円のシンボルが表示されます。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000My1f0AC)

:::note
奇妙なことに、コンピューターを再起動すると問題は解決しました。ブラウザの問題だったに違いありません。
:::

# 入力したすべてのテキストが表示されます。テキストを入力して一定数の行を表示し、テキストがさらにある場合はスクロール可能にできるかどうか知りたいです。

+ [Lightning アプリケーション ビルダーのホームページ上のリッチ テキスト コンポーネント](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J7eJF)

:::note
標準機能では不可能だと思います

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T47rnSAB
:::
Node19.7.0 + OpenSSL3.1.0のDockerfile

Node.jsの公式のDocker ImageでOpenSSL3を使うためのDockerfileを書きました。

ちなみに元々はPrismaで以下のエラーが出たための対処です。

```
Query engine library for current platform "debian-openssl-1.1.x" could not be found.
```

こちらは、Node.jsにはバージョン17以降はOpenSSL3がバンドルされているのに、システム側のOpenSSLが1.1で、バージョン不整合のため発生したエラーでした。

大変参考になった記事はこちら。

https://zenn.dev/monicle/articles/2283179d63d407

なので、こんな感じでNode.jsの公式のDocker ImageでOpenSSL 3をビルドしてインストールしました。

```Dockerfile
FROM node:19.7-bullseye-slim

RUN apt-get -qy update && apt-get -qy install build-essential checkinstall zlib1g-dev wget

WORKDIR /usr/local/src
RUN wget https://www.openssl.org/source/openssl-3.1.0.tar.gz && tar -xvzf openssl-3.1.0.tar.gz

WORKDIR /usr/local/src/openssl-3.1.0
RUN ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib && make && make install
RUN echo /usr/local/ssl/lib64 > /etc/ld.so.conf.d/openssl-3.1.0.conf
RUN ldconfig -v
RUN apt-get -qy remove openssl
ENV PATH "$PATH:/usr/local/ssl/bin"

WORKDIR /usr/local/src
RUN rm -rf openssl-3.1.0 openssl-3.1.0.tar.gz
```

そのうち公式でもOpenSSL 3がインストールされるはずですが、それまではこちらのDockerfileを使うことになりそうです。

参考になればどうぞ。
Kubernetesのnode affinityのrequiredDuringSchedulingIgnoredDuringExecutionはどういう意味か

まず、KubernetesのNode Affinity（ノード・アフィニティ）は、Podが特定のノードへのスケジューリングを制御するための設定です。

この`requiredDuringSchedulingIgnoredDuringExecution`は、「スケジューリング時に必須、実行時に無視」という意味で、Podが作成されるときにはノードのラベルを厳密にチェックしますが、Podが実行されている間にはノードのラベルを無視します。

`requiredDuringSchedulingIgnoredDuringExecution`は、その中でも1つのルールタイプで、以下の意味を持っています。

* **requiredDuringScheduling**: このルールが指定されている場合、Podは条件に一致するノード上でのみスケジュールされる。もし一致するノードが存在しない場合、Podはスケジュールされない。
* **IgnoredDuringExecution**: 一度スケジュールされたPodは、条件に違反しても強制的に移動させられることはない。ただし、ノードの状態が変わり、条件に一致しなくなった場合や、ノードが故障した場合はそのPodは再スケジュールされる。

この`requiredDuringSchedulingIgnoredDuringExecution`ルールタイプは、Podが特定の条件を満たすノードでのみ実行されることを保証するために使用されますが、一度スケジュールされると、その条件が変わっても強制的に移動させられることはありません。
例えば、特定のハードウェア要件やリージョン内のノードにPodをスケジュールすることを保証したい場合にこのオプションを利用します。
Custom Metadata

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

# Custom Metadata report

+ [Custom Metadata report](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000J6ol3)

[Is it possible to create a report (type) for custom metadata?](https://salesforce.stackexchange.com/questions/232338/is-it-possible-to-create-a-report-type-for-custom-metadata)

:::note alert
IO Exception: Exceeded max size limit of 6000000

Error is in expression '{!checkMdApi}' in component <apex:page> in page custommetadataloader: Class.MetadataService.MetadataPort.listMetadata: line 9218, column 1 Class.MetadataUtil.checkMetadataAPIConnection: line 30, column 1 Class.CustomMetadataLoaderController.checkMdApi: line 16, column 1
:::
肖像権フリーの人物画像が生成し放題のAI

**広告やWebサイトに使える高画質でフリーの人物画像が無料で（ほぼ）無限に手に入ったらいいと思いませんか？**
フリー素材の画像を提供してくれているWebサイトはいくつかありますが、人物画像には限りがあります。
**AIを使えば、いくらでもいろんなバリエーションの人物画像が生成できる上に、架空の人物なので肖像権もありません。**
具体的には以下のような画像が生成できます。

![seed1004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/51406a81-1c8e-4146-544b-fdd6ce2cdc44.png)
![seed1003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/67dfc620-9ad5-d790-b899-362aea6ec19a.png)
![seed1002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/4bf61d5b-68ab-70a0-4a3f-a16472e6bc3a.png)
![seed1001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e5956463-1cab-ac1c-1c65-36790861a970.png)
![seed1000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e75ae6b2-43e8-05a5-ba45-8ee113a8798f.png)
![seed1005](https://user-images.githubusercontent.com/23278992/225608573-710f236d-b825-452e-bb2e-1fe75cfd3f27.png)

# かんたんに試せるデモ

https://huggingface.co/spaces/SIGGRAPH2022/StyleGAN-XL

Runボタンを押すだけで顔画像を生成できます。

![スクリーンショット 2023-03-16 21.08.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/426bc7d2-86ec-9a44-5a1f-5a13a1f247ab.png)

# プログラムで生成する方法

StyleGANというモデルを使っています。

https://github.com/autonomousvision/stylegan-xl

StyleGANをインストールして、下記のスクリプトを実行すると好きな数の顔画像を生成できます。

```shell
python gen_images.py --outdir=/content/drive/MyDrive/checkpoints/logo/ --trunc=0.7 --seeds=1000-1012 --batch-sz 1 \
  --network=https://s3.eu-central-1.amazonaws.com/avg-projects/stylegan_xl/models/ffhq1024.pkl
```

<img src=https://user-images.githubusercontent.com/23278992/225606366-fa1facd8-ec88-4759-9e05-30eef2f0704a.gif>

🐣
****
フリーランスエンジニアです。
もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
SceneDelegateではないところから起動時の画面を表示する

# はじめに
自分のメモ、備忘録です。
SceneDelegateではないところから起動時の画面を表示するときAppDelegateのfunc application()とやり方が違ったのでメモ。

# Storyboardを使わないプロジェクトの設定をします
やり方知らないかたは[こちらの記事どうぞ](https://qiita.com/Imael/items/e908aef1e6fc077f29fc).

# 起動時の画面を表示する時のクラスを作成
```swift
import UIKit
class ShowStartup {
    private var window: UIWindow?
    // 起動時の画面を表示する
    func showRoot(window: UIWindow?) {
        let vc = ViewController()
        window?.rootViewController = vc
        window?.makeKeyAndVisible()
        self.window = window
    }
}  
```
今回ルートにするViewControllerを設定
viewを赤くするだけ
```swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .red
    }


}
```

# SceneDelegate書き換え

```swift
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    // func sceneのスコープを抜けたときインスタンスが解放されないよう持たせておく
    var showStartup: ShowStartup?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        
        guard let scene = (scene as? UIWindowScene) else { return }
        // window生成
        let window = UIWindow(windowScene: scene)
        self.showStartup = ShowStartup()
        self.showStartup?.showRoot(window: window)
    }
```
# おわりに
AppDelegate使う時のfunc application()場合は
```swift
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var showStartup: ShowStartup?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        self.showStartup = ShowStartup()
        self.showStartup?.showRoot(window: UIWindow(frame: UIScreen.main.bounds))
        return true
    }
```
と書きます。
映画好きに説明するChatGPT

映画が好きな皆さんに、AI技術である**ChatGPT**についてご紹介します。まず、AIが登場する有名な映画とChatGPTとの違いを理解しましょう。

## AIが登場する有名な映画

1. **2001年宇宙の旅 (1968)** - 映画ではHAL 9000という人工知能が登場します。これは、人間とコミュニケーションができるだけでなく、船内のシステムを制御しています。
2. **ターミネーター (1984)** - ターミネーターは、未来から送り込まれたAI搭載のキラーロボットです。彼は破壊と暗殺のために、過去の世界へとタイムトラベルします。
3. **サマーウォーズ (2009)** - 映画では、オズという仮想世界を支配しようとする人工知能「ラブ・マシーン」が登場します。主人公たちはこのAIと戦い、現実世界を守るために奮闘します。
4. **HER/世界でひとつの彼女 (2013)** - 映画では、高度なAIを持つ仮想アシスタントのサマンサが登場します。サマンサは人間との対話が可能で、主人公と深い関係を築くことになります。

## ChatGPTとの違い

映画に登場するAIとChatGPTの違いを簡単に見ていきましょう。

- **自己意識**: 映画のAIは独立した自己意識や感情を持っていますが、ChatGPTは自己意識や感情を持たないテキスト生成アルゴリズムです。
- **タスク**: 映画のAIは特定のシナリオに応じた多様なタスクをこなすことができますが、ChatGPTは主にテキストの生成や理解に特化しています。
- **物理的存在**: 映画のAIは多くの場合、ロボットやコンピュータシステムとして物理的に存在します。一方、ChatGPTはインターネット上で動作するソフトウェアです。

## ChatGPTの優れた点

1. **アクセシビリティ**: ChatGPTはオンライン上で利用できるため、どこからでも簡単にアクセスして利用することができます。
2. **柔軟性**: ChatGPTは、さまざまな質問やトピックに対応できるよう設計されており、多様な会話や情報提供が可能です。
3. **学習能力**: ChatGPTは大量のテキストデータから学習しており、幅広い知識を持っています。これにより、多くの分野に関する質問に答えられます。
4. **進化**: ChatGPTは継続的にアップデートされ、性能が向上していくことが期待されます。これにより、より自然な会話や正確な情報提供が可能になります。
5. **コスト効率**: ChatGPTは物理的な存在がないため、設置場所やメンテナンスのコストがかかりません。また、オンライン上で動作するため、利用者が増えても追加のコストがかからない場合があります。

## まとめ
| 項目              | 映画のAI                                   | ChatGPT                                       |
|-------------------|--------------------------------------------|----------------------------------------------|
| 自己意識          | 独立した自己意識や感情を持つことがある     | 自己意識や感情を持たないテキスト生成アルゴリズム |
| タスク            | 特定のシナリオに応じた多様なタスクをこなす | テキストの生成や理解に特化                   |
| 物理的存在        | ロボットやコンピュータシステムとして存在   | インターネット上で動作するソフトウェア       |
| アクセシビリティ  | 制限された状況でのみ利用可能               | どこからでも簡単にアクセスして利用可能       |
| 進化・アップデート| 固定された能力を持つことが多い             | 継続的にアップデートされ性能が向上する可能性  |



ChatGPTは映画のような自己意識を持たないものの、自然言語処理の技術を利用して人間との対話や情報提供ができます。映画に登場するAIとの違いを理解しながら、ChatGPTの可能性をぜひご体験ください。

ここまで全てChatGPT(GPT4)で作成しました。
オブジェクト指向について

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はオブジェクト指向の色々について更に詳しく調べてみましょう！
![インスタスライド_202303041.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/13e3fa4c-361c-3bba-99e1-a26bc5e25492.gif)

# オブジェクト指向とは
データと手続きをひとかたまりにした｢オブジェクト｣を単位としてソフトウェアを構成する。

複数のオブジェクトを組み合わせて最終的なソフトウェアを構築させる。

旅行代理店のシステムでは、顧客・旅行代理店・ホテル・航空会社をオブジェクトとして定義し、各々のメッセージを定義する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/4f1333b6-fe8a-7444-d724-2a3225c689d9.png)

# まとめ
ーオブジェクト指向とはデータと手続きをひとかたまりにした｢オブジェクト｣を使って設計する

ー旅行代理店のシステムでは、顧客・旅行代理店・ホテル・航空会社をオブジェクトとする

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
TerraformでRDSのロググループの保存期間を設定

# 何の記事？
TerraformでRDSのロググループ(エラーログとかのやつ)の保存期間を変えたいけど、CLIでしかできないらしいどうしよう、を解決する記事。

# 解決法
Provisionerを使ってTerraformでCLIを実行する

# コード
保存期間を一年に設定したい場合

```terraform
resource "aws_rds_cluster_instance" "cluster_instances" {
  #この辺は省略
    
  provisioner "local-exec" {
    command = "aws logs put-retention-policy --log-group-name /aws/rds/cluster/rds-name/error --retention-in-days 365"
  }
}
```

# まとめ
リソースで指定できないものは、Provisionerを使えばTerraformだけで大抵のことはできそう。
通信キャリアの闇を暴く。Dockerで完結する通信速度を継続的に計測するプログラムを作ったよ。

# 背景

自宅で使っているキャリアはそこそこ早いのですが、夜とかになると遅くなったりするので時間とネットの速度の関係を調査してみることにしました。

そのため、定期的にネットの速度を測るためのプログラムを作ったので、それを皆さんに共有できればと思います。

# やったこと

Speedtest-cliを継続的にPythonごしに実行し、DownloadとUploadのMbit/sを取得し、ファイルに追記するプログラムを作りました。

プログラムはDockerファイルにまとめたのでシステムを汚すことなく利用できます。

ソースコードと使い方は[こちら](https://github.com/PHXA/speedLogger "github/phxa")から。

# 注意（speedtest-cliの通信量）

Speetest-cliの通信量がどのくらいかかるのか、公式見解が調べてもわからなかったので、通信量が無制限、あるいは十分に利用できる方に利用を推奨します。

一応、Dockerのコンテナ内で一度、Speedtestを実行し、ifconfigにて通信量の差分を見て見ました。その結果、送受信で約128Mbitでした。

これを少ないと見るか多いと見るかは人それぞれですが、10分おきに24時間実行するとして、１日あたり128×6×24=18432Mbit=2304MB=**2.3GBの通信料**がかかる計算なので、まあどちらかというと多い方だと思います。

**なので、光通信などの無制限に利用できるプランに加入されている方、一時的に計測した方に利用していただければと思います。**

# まとめ

まだ作りたてで、自身のネット環境に対する結果が得られていませんが、数日間、これにて計測してみて、結果を共有できればと思います。

ぜひ皆さんもこれを使って#speedlogなどで、地域、時間帯などの影響を共有していただき、それらを踏まえてキャリアの良し悪しを定量的に判断してもらえればとおもいます。

# 追伸（一日計測してみたよ）

![newplot (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1403305/ba351019-0c6d-c50b-442c-4b755ae5205f.png)

前後2点を含めて平滑化を行なっています。

Downloadのピークが約160Mbit/s、Uploadのピークが約250Mbit/sというところでしょうか。全体的にUploadが早く平均して100Mbit/sはでていそうです。

昼と深夜に速度が向上しているようですが、１日だけの計測なのでなんとも言い難いですね。曜日、場所、周辺のイベント、通信環境、等の影響も考慮して考察してみる必要がありそうです。

ところで、これは単に周辺の環境依存なのか、キャリアが意図して通信制限をかけているのか、興味深いところです。
競技プログラミング日記#2

全検索/ペアの全探索5
・特になし

計算量/計算量とは1~

・1.for文ではループ回数Nに比例する

・2.for文の二重ループはNの2乗に比例する

・4.for文を二重ループ⇒ブロックの外でさらにfor文（一重）の場合はN二乗+Nとなるので+NはN2乗に比べてはるかに小さいので無視できる

・7,8.要復習

計算量/工夫 (1) - for 文のループを減らす

・1.愚直にforループを回すのではなくまずは（配列の最大値）- （配列の最小値）を求める
JavascriptではMath.max()ではレンジを超えるのでソートで並べ替えをしてから[length - 1] - [0]を求める

・3.要復習
x,yを二重ループでzの範囲を絞るところはわかっていたが、その後のzの値域を絞れていなかった。
Charts 2系から4系へ移行する際の options 表記の変更ポイント

# これはなに？

### Chartjsのバージョン違い

Webブラウザ上で簡単にグラフを描ける[Chartjs](https://www.chartjs.org)．
Javascriptのオブジェクトとしてさまざまなオプション指定が可能だか，その表記法がバージョン2系からバージョン4系（実際には2→3の移行時で変わったらしい）では変更になっている． 
変更必要箇所の全部を網羅するわけではなく，自分がやった範囲でのメモ，
完全なガイドは[こちら](https://www.chartjs.org/docs/latest/migration/v3-migration.html)


### そもそも..

Chartjsの使い方を調べながら作ってみたとき（温度の変化を時系列で表示する簡単なグラフ：下図参照）に参照してたのが2.7.2を使ったサンプルだった． 
これがわかりやすかったので，そのまま使っていたのだけど，最新版（現時点で4.2）に移行した．  
![chartjs-2-to-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/3d801fde-9806-19e1-7d27-2e718d78ae50.png)

# 変更ポイント
### グラフのタイトル - `options`直下
- 2系：`options`直下に`title`
- 4系：`options` -> `plugins`の下に`title`を置くようになった．

### x軸，y軸の設定 - `options` -> `scales`の下で
- 2系：`xAxes`や`yAxes`のオブジェクト名
- 4系：`x`や`y`のオブジェクト名．

### `suggestedMax`，`suggestedMin`の置き場所
- 2系：`scales`->`yAxis`->`ticks`内に置いて動いていた
- 4系：`scales`->`y`->`ticks`同場所では動かず，`scales`->`y`下に移動  

### 各軸のラベル  
- 2系：`xAxis`，`yAxis`の下にオブジェクトの配列を作って，その中に`scaleLabel`オブジェクト．さらにその下に`labelString`で表示文字列を指定
- 4系：`x`，`y`の下にそのまま`title`オブジェクト．表示文字列は`text`で指定

# さらに
optionsの他にプロットの点間の補完も3系以降ではデフォルトで直線になっているので，各データに`lineTension`を追加．　

# コード
Chartjs4.2で動作しているコード例． 
2系から4系への変更で更新した部分は行末に古いものをコメントとして残してある 
新規に追加した行は行末に`//`． 
削除した行はその行をコメントアウト．

```javascript
let chart = new Chart( ctx, 
	{
		type: 'line',
		data: {
			labels: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ],
			datasets: [
				{
					label: 'x',
					data: [ 3, 2, 1, 5, 3, 7, 8, 9, 3, 9 ],
					borderColor: "rgba( 255, 0, 0, 1 )",
					backgroundColor: "rgba( 0, 0, 0, 0 )",
					lineTension: 0.4,	//
				},
				{
					label: 'y',
					data: [ 2, 9, 5, 4, 7, 4, 1, 0, 7, 3 ],
					borderColor: "rgba( 0, 255, 0, 1 )",
					backgroundColor: "rgba( 0, 0, 0, 0 )",
					lineTension: 0.4,	//
				},
				{
					label: 'z',
					data: [ 6, 0, 5, 1, 5, 8, 3, 2, 9, 8 ],
					borderColor: "rgba( 0, 0, 255, 1 )",
					backgroundColor: "rgba( 0, 0, 0, 0 )",
					lineTension: 0.4,	//
				},
			],
		},
		options: {
			animation: false,
			plugins: {	//
				title: {
					display: true,
					text: '"g" now'
				}	//
			},
			scales: {
				y: {	//yAxes: [{
					suggestedMax: 11,	//
					suggestedMin: -1,	//
					ticks: {
						//suggestedMax: 11,
						//suggestedMin: -1,
						stepSize: 1,
						callback: function(value, index, values){
							return  value +  ' g'
						}
					},
					title: {	//scaleLabel: {
						display: true,
						text: ' gravitational acceleration [g]'	//labelString: ' gravitational acceleration [g]'
					}
				},
				x: {	//xAxes: [{
					title: {	//scaleLabel: {
						display: true,
						text: 'time'	//labelString: 'time'
					}
				}
			},
		}
	}
);
```



# 関連情報 
https://qiita.com/teddokano/items/207f6ccac4199f604eef
https://www.chartjs.org/docs/latest/migration/v3-migration.html
運用設計サンプル

```
■OS監視
　┣取得対象
　┣実行間隔
　┣ログ名
　┗格納場所

・CPU
例：nohup bash -c "vmstat 10 | awk '{print strftime(\"%y/%m/%d %H:%M:%S\"), \$0} { system(\":\") }'" > vmstat_$(date "+%Y%m%d_%H%M%S").log 2>&1 &
・メモリ
例：nohup bash -c "vmstat 10 | awk '{print strftime(\"%y/%m/%d %H:%M:%S\"), \$0} { system(\":\") }'" > vmstat_$(date "+%Y%m%d_%H%M%S").log 2>&1 &
・IO
例：nohup bash -c "iostat 10 | awk '{print strftime(\"%y/%m/%d %H:%M:%S\"), \$0} { system(\":\") }'" > vmstat_$(date "+%Y%m%d_%H%M%S").log 2>&1 &
・プロセス
例：ps aux |awk '{print strftime("%y-%m-%d %H:%M:%S"), $0}' | grep -iE " ora_|MEM" | grep -v grep
・ディスク使用率
例：df -ah

■DB監視
　┣取得対象
　┣実行間隔
　┣ログ名
　┗格納場所

・待機イベント(V$SESSION)
例：★書式を参照すること。
・PGAサイズ(V$PROCESS)
例：★書式を参照すること。
・SQL文(V$SQL)
例：★書式を参照すること。
・ロック(V$LOCK)
例：★書式を参照すること。
・表領域の使用率
例：https://oha-yo.com/oracle/tablespace-size/

■STATSPACK
例：https://www.ashisuto.co.jp/db_blog/article/jpoug-oracledb-logfiles-command.html
・スナップショット
　┣間隔
　┣格納場所
　┣取得レベル
　┣取得ユーザ
　┣取得表領域
　┗その他

・レポート出力（もしくは手動とか）
　┣間隔
　┣保存期間
　┗場所

■ログ監視（Zabbix詳細設計書を参照すること）
https://docs.oracle.com/cd/E16338_01/server.112/b56301/monitoring.htm

■ログローテーション（圧縮込み）
・OS監視ログファイル一式
・DB監視ログファイル一式
・STATSPACKレポート一式
・アラート・ログ／トレース・ファイル
<diagnostic_dest>/diag/rdbms/<db_unique_name>/<sid>/trace/alert_<sid>.log
<diagnostic_dest>/diag/rdbms/<db_unique_name>/<sid>/trace/<sid>_<process_name>_<pid>.trc
・インシデント・ファイル
<diagnostic_dest>/diag/rdbms/<db_unique_name>/<sid>/incident/incdir_<incident_number>/*
・リスナー・ログ
<diagnostic_dest>/diag/tnslsnr/<hostname>/<listener_name>/trace/listener.log
・sqlnetログ
<diagnostic_dest>/diag/clients/user_<OS_USERNAME>/host_<MASHINE_HASH_VALUE>_<ADR_VERSION>/trace/

■GUIツール
Cloud Controlのurl

★SQL書式
set feedback off  -- N行が選択されましたを非表示
set NULL '<NULL>' -- NULLを<NULL>として表示
set pages 0       -- SELECTの結果のみを表示
set lines 4000    -- 1行の長さを指定

select
  saddr
  || ',' || SID
  ～
  || ',' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')
FROM V$SESSION
ORDER BY SID;

sqlplus @XXX.sql > /dev/null
```
CodeCommitのCloneでプロファイルを指定するには

# 何の記事？
CodeCommitのリポジトリをCloneしようとしたら、別アカウントにある同じ名前のリポジトリのものが取れてしまったので、その解決法の共有兼備忘録

# 前提
・Windows
・CLIで複数のプロファイルを使用
・複数のプロファイルでCodeCommitを利用
・同じ名前のリポジトリがある ~~(そもそもこれしなければいいだけ)~~

# 解決法
**git-remote-codecommit** を使ってプロファイルを指定する

# コマンド
### インストール
```
pip install git-remote-codecommit
```

### Clone
```
git clone codecommit://ProfileName@RepoName
```
プロファイル名とリポジトリ名は自環境に合わせてください

# まとめ
・プロファイルを指定する時はgit-remote-codecommitを使う
・そもそもリポジトリ名は一意にする


## 参考
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-git-remote-codecommit.html
Webアプリケーションの仕組み

# Webアプリケーションの基本構成
Webアプリケーションを含むWebシステムは基本的に以下のような２つの要素で構成される．
![client_Server.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133563/204b3ed0-8030-d052-0ca0-4c387bd3b4ad.png)

**クライアント**・・・サービスを要求する側＆受ける側
**サーバ**・・・サービスを提供する側

### サーバの種類
クライアントに対してサービスを提供するコンピュータを意味するサーバには，様々な種類がある．提供するサービスの種類が異なるだけで，どれも「サービスを提供する側」であることには変わらない．ここでは代表的なサーバを紹介する．

**○Webサーバ**
利用者(クライアント)からのリクエストに応じて，Web上のデータを送り返すサーバで，Webサイトやブログなどを表示するために必要不可欠なもの．HTMLやCSS，画像ファイルなどのコンテンツを格納している．

**○メールサーバ**
メールの送受信サービスを提供するサーバ．送信と受信はそれぞれ別のサーバで，送信側をSMTPサーバ，受信側をIMAPやPOP3サーバと呼ぶ．

**○ファイルサーバ**
ネットワーク上でデータを共有/使用するためのサーバ．複数のサーバおよびWindowsやMacなどの異なるOSのクライアントPC間でデータ共有を行うことができる．

**○データベースサーバ**
クライアントのリクエストに応じて，データベース上にあるデータを送り返すためのサーバ．データベース管理システムが稼働しており，リクエストに応じて，データの作成，読取，更新，削除などのデータ整理を行う．

**○アプリケーションサーバ**
クライアントからの要求でアプリケーションを実行するサーバ．格納しているプログラムによって，データ処理や計算処理などを行う．


# 処理の流れ
クライアントとサーバ間の基本的な処理の流れは以下のようになる．
![webApp _flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133563/31ed9f2d-c2d4-76ed-bc62-e5b47fa04a6d.png)
1. **クライアント側がサーバにリクエストを送信する**
2. **サーバ側はリクエストの内容に応じたWebページを用意する**
    このときに，必要に応じて以下のような処理を行う
    ・他のサーバ(データベースサーバなど)と通信して，データを取得する
    ・取得したデータを処理結果として変換する
3. **サーバ側から処理結果を受け取って表示する**
YOLOv8でセグメンテーションモデルを試してみた

# はじめに
YOLOv8で物体検出に続き、セグメンテーションも試してみました。
物体検出の記事は[こちら](https://qiita.com/super_toughguy/items/b306d4db8724bb46863d)になります。

# 環境
Python-3.8.12
torch-1.7.1+cu110
NVIDIA GeForce RTX 3090

# 試してみた
## YOLOv8のインストール
``` sh
pip install ultralytics
```

## データセットの準備
こちらからデータを拝借
https://cocodataset.org/#download

## セグメンテーションしてみる
``` python
# モデルの生成。モデルは自動でダウンロードされます。
model = YOLO("yolov8n-seg.pt")
# 推論実行
results = model("./datasets/test2014/COCO_test2014_000000515537.jpg", save=True)
```
モデルは以下から選ぶことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802936/992dc607-fe88-62f8-1a19-a1f9bb6dad82.png)
また推論実行時にsave=Trueを渡すことで、結果が出力されます。
他にも、confやclassesを渡すことで、検出する物体の種類などを絞ることができます。
結果は以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802936/485a12fe-8c6e-76df-5d1a-59dc2cac7b21.png)
検出された人物やボールの領域が赤く塗られています。

次に、resultsの中身も確認します。
``` python
results[0].cpu().boxes.numpy().boxes
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802936/f5c82920-3217-5b70-6abe-befca706efaf.png)
こちらは、検出されたバウンディングBoxの4つの頂点座標とconfidence score、クラスを確認することができます。
``` python
results[0].masks.cpu().numpy().masks
```
masks変数の中には、検出された物体ごとのマスク画像データが格納されています。
試しに、画像として出力してみます。
``` python
plt.imshow(results[0].masks.cpu().numpy().masks[0])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802936/da7965ca-615f-82e8-9c0f-772059cbd073.png)
検出された部分が1、その他は0として表示されました。

# おわりに
セグメンテーションモデルを初めて触りましたが、こんなに簡単に利用できたことに驚きました。
今後はもっと色んなことに試してみたいと思います。

以上、最後まで読んで頂きありがとうございました。
amazonlinux2023を使った開発環境

## これは
amazonlinux2023がリリースされたということで、Dockerを使ったJava開発環境構築の備忘録。

## Dockerfile

`amazon corretto 17 (LTS)`と`Gradle`を標準としてSDKMAN!を使ってインストール。  
SDKMAN!でのインストールに必要なコマンドを引数`SDKMAN_PKG`で指定。  
（その他必要そうなものは引数`DEV_PKG`で追加できるように）

```text
ARG AM2_VER=2023.0.20230315.0

FROM amazonlinux:$AM2_VER

ARG SDKMAN_PKG="tar zip unzip findutils"
ARG DEV_PKG="which man make less"

RUN yum update -y && \
  yum install -y $SDKMAN_PKG $DEV_PKG && \
  yum clean all && \
  rm -rf /var/cache/yum/*

ARG JDK_VER=17.0.6-amzn
ARG GRADLE_VER=8.0.2

RUN curl -s "https://get.sdkman.io" | bash && \
  source "$HOME/.sdkman/bin/sdkman-init.sh" && \
  sdk install java $JDK_VER && \
  sdk install gradle $GRADLE_VER
```

## Usage

適当なイメージ名をつけてビルド。

```sh
$ docker build -t amazonlinux:2023-java .
```

必要に応じてホストのディレクトリをボリュームマウントして起動。

```sh
$ docker run --rm -it -v $PWD:/app amazonlinux:2023-java bash
bash-5.2#
```

## おわり

実際に使うかというとWSL2がある今、意味はないと思う。ただ、EC2での構築時の参考になるかもしれない。

以上。
対象のレコードが存在すれば更新・しなければ登録

## 対象のレコードが存在すれば更新・しなければ登録

Ruby on Rails で表題の処理がしたい時の書き方です。

例：
`product_id=1`のレコードに`price=1000`

レコードが存在すれば、`price=1000`に更新
存在しなければ、`product_id=1`の`price=1000`のレコードを登録

### 書き方

まず`find_or_initialize_by`を使用します。
このメソッドは
- 対象のレコードが存在しない場合はレコードを生成
- 対象のレコードが存在すれば既存のレコードを取得

```ruby
product = Product.find_or_initialize_by(product_id: 1)
```

次に、テーブルへ登録/更新をします。
書き方は `assign_attributes + save` と `update` メソッドで書く2通りがあります
`update` メソッド内で アサインと保存(`assign_attributes + save`)をしているので同じ処理をしています(※1)

```ruby
# update_attributes + save の書き方の場合
product.assign_attributes(price: 1000)
product.save

# updateのみ の書き方の場合
product.update(price: 1000)

```

(※1)どちらがいいのか？
個人的にはupdateは更新しかしないように見えるので、行が多くなりますが　update_attributes + save　の方が可読性は高いと感じます。
ただrailsに詳しい人がチームに多ければupdateでスッキリ書くのも良いかと思います。


■参考にさせていただいた記事
https://railsdoc.com/page/find_or_initialize_by
https://qiita.com/taimuzu/items/0a21738d018f475d63ae
https://www.audia.jp/blog/rubyonrails-activerecord-update-method-comparison/