OmniAICreator/Qiita-1.07M huggingface dataset:
ドキュメント設計について

## ドキュメント設計を学ぶ意味
ビジネス（機能性）とエンジニア（保守性）両方の視点から価値の高いプロダクトを設計・開発するために、何を・どう考えるのか、「言語化されていない勘と経験」を体系化することで、再現性のある思考プロセスを習得する。

```mermaid
flowchart LR;
    1.ビジネス要件-->2.要件定義;
    2.要件定義-->3.基本設計;
    3.基本設計-->4.詳細設計;
    4.詳細設計-->5.実装;
```

**Point**
- 1 から 3 では、「モデリング」を使って、機能性を高める
- 3 から 5 では、「実装パターン」を使って、保守性を高める

## モデリング と　実装パターン
どのような設計スキルが身につくのか？
- 機能性　→　「モデリング」でビジネス要件を分析・調整
    - そもそもの開発目的を明確にできる
    - 要件定義の考慮モレに気づいてフォローできる
    - 重要なビジネス知識/ルールを基本設計に反映できる
- 保守性　→　実装パターン、設計原則を使いこなす
    - ビジネスとソースコードの構造が一致する
    - 依存関係が少なくて、あとから追加/変更しやすい
    - コードが読みやすくて、変更の影響範囲が見える

**継続的なプロダクト成長を支えるビジネス並走型の設計スキルが身につく**

## WF開発 と アジャイル開発

### 確実性のあるウォーターフォール開発での設計
- 数か月から十数か月かけて、全体計画を決めてから各工程でテストを行い上から下に向かって一方向へ開発を進めていく方法。
- 実装段階の前に各設計初を作りきる。
- 追加・修正が発生した場合は、プロジェクト計画そのものの見直しが必要

```mermaid
flowchart LR
   a(企画) --> b(要件定義) --> c(基本設計) --> d(詳細設計)
```

**メリット**
- 完成像を見通してからスタートできる
- 工数管理がやりやすい
- 開発メンバーに高い自走スキルを求めない

**デメリット**
- 途中の追加変更が難しい
- 方針決定の負担が大きい（企画・設計書だけで全体GOの判断が必要）
- 完成まで動かない


### 柔軟性のあるアジャイル開発での設計
- 2～3週間の小さいリリースで仮設検証を繰り返す
- ニーズを探りながらプロダクトを成長させる方法


```mermaid
graph LR;
    計画-->設計;
    設計-->開発テスト;
    開発テスト-->リリース;
    リリース-->計画;
```

**メリット**
- 成果物ベースで判断できるので方針決定の負担が少ない
- 利用者ニーズを見つつ、後出しで追加修正できる

**デメリット**
- 開発メンバーの自走スキルが強く求められる
- チーム内の認識ずれ、俗人化、情報の発散が起きやすい

## タスク
4ステップで求められるタスク

1. 企画

    価値が高いプロダクトを作るために、経営者・決済者から承認を得る
    - 現状把握
    - ビジョンや目指す経営上のゴール
    - システムの大まかな完成像
    <br>

2. 要件定義

    協力部署とのコミュニケーションやユーザのニーズを把握するために**モデリング**の手法で、開発目的や重要なビジネス知識/運用ルールを明確化する

    - ユースケース分析（コンテキスト図、ユースケース図）：各関係者の間で使われるシステムやツールと使われる目的を定義にする
    - 業務フローの明確化（アクティビティ図、状態遷移図）：ユースケースの運用プロセスを設定してビジネスルールとして明確にする
    - 関係性の体系化（ドメインモデル/オブジェクト図）：各フローの関係性を分析して、体系的に整理する
    <br>

3. 基本設計

    モデリング内容を**実装パターン**（画面設計・機能設計・データ設計）に落とし込んで、ビジネス側との共通認識を作る
    - 画面設計：ユースケース図、ドメインモデルを基にどのような画面が必要で表示すべき情報を明示する
    - 機能設計：ユースケース図と画面設計を紐づけて、裏側で必要な処理を一覧化する
    - データ設計（ER図、データフロー図）：DBのデータ構造といつどこでデータが発生するのか明確にする
    <br>

4. 詳細設計

    プロダクトの保守性を高めるために、実装パターンを使って読みやすく、プログラマーに実装方法を伝える
    - ロバストネス分析：責務を細分化して適切なクラスを割り当てる
    - シーケンス図：クラスのメソッドを決める
    - クラス図：クラスの依存関係を整理する
<br>
condaを使った環境構築クイックスタート

condaでサクッと環境を作成したいとき用の備忘録

# 仮想環境の構築

```sh
conda create -n 環境名 python==バージョン
```

例えば、環境名が`test`でpythonのバージョンを3.10.13としたい場合、
`conda create -n test python==3.10.13`
を実行する。

# 仮想環境の有効化

- windowsの場合

```sh
conda activate 環境名
```

- Linux, Maxで上記のコマンドでうまく行かない場合

```sh
source activate 環境名
```

# 仮想環境の無効化

仮想環境に入っている状態で以下のコマンドを実行する。

```sh
conda deactivate
```

# 仮想環境の一覧を表示

```sh
conda env list
```

上記を実行すると、以下のように環境の一覧が表示される。

```sh
base                     C:\Users\〇〇\anaconda3
test                     C:\Users\〇〇\anaconda3\envs\xai
```

# インストール済みパッケージの表示
以下のコマンドで仮想環境に入っているパッケージを表示する。

```sh
conda list
```

以下のようにパッケージ一覧が出力される。

```sh
# packages in environment at C:\Users\〇〇\anaconda3\envs\test:
#
# Name                    Version                   Build  Channel
bzip2                     1.0.8                he774522_0
ca-certificates           2023.08.22           haa95532_0
libffi                    3.4.4                hd77b12b_0
openssl                   3.0.12               h2bbff1b_0
pip                       23.3            py310haa95532_0
python                    3.10.13              he1021f5_0
setuptools                68.0.0          py310haa95532_0
sqlite                    3.41.2               h2bbff1b_0
tk                        8.6.12               h2bbff1b_0
tzdata                    2023c                h04d1e81_0
vc                        14.2                 h21ff451_1
vs2015_runtime            14.27.29016          h5e58377_2
wheel                     0.41.2          py310haa95532_0
xz                        5.4.2                h8cc25b3_0
zlib                      1.2.13               h8cc25b3_0
```

# 仮想環境をファイルに出力して保存

仮想環境の情報をyamlファイルとして保存する（仮想環境を配布したい場合など）。

```sh
conda env export > ファイル名.yaml
```

# YAMLファイルから仮想環境を復元

```sh
conda env create -f ファイル名.yaml
```

# requirements.txtの作成

```sh
pip list --format=freeze > requirements.txt
```

# 仮想環境の削除

```sh
conda remove -n 環境名 --all
```
久しぶりにペアプロして気づいたこと

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

1人でシステム開発を続けて一ヶ月経った頃...

くじらさん：「他チームから1人ヘルプに来てくれそうです！Reactを勉強したいそうなのでよろしくお願いします」

私：「ついにですね…！わかりました！」


# 久しぶりにペアプロして気づいたこと
- 精神が安定する！
1人で新技術を使って開発していた頃は疑問点が解決できない状況が続くことが多く、辛かったです。
誰かに相談して一緒に調査したり検証できるだけでだいぶ違いました。

- 他の人から学べるのは有難いこと！
今回はヘルプに来てくれた方はvue.js、rails、pythonを経験されている方でした。
前の案件ではこういうことやっていました、デバッグはこのようにしています、など色々勉強させていただきました。1人で開発していると学べないことばかりでしたのでペアプロも大事だなと改めて感じました。

- 他の人に教えられるのは有難いこと！
一方でテスト駆動開発、Docker、Reactなどは私が適宜教えながら開発を進めていました。
人に教えることで自分の理解も深まるので良い経験になりました。

# おわりに
久しぶりに1人で開発すると自分の力試しのような感覚になり、久しぶりにペアプロすると経験値稼ぎしているような感覚になります。それぞれのメリットとデメリットがあるので上手く使い分けていければと思います。
Cloudera Data Platform - ID Broker Mappings の設定

# この記事について

Cloudera Data Platform の Public Cloud 版のアクセス設定のひとつである、ID Broker Mappings の設定について説明します。

# ID Broker Mappingsとは

ID Broker Mappings は、クラウドプロバイダ（AWS, Azure, GCP）のアクセスロールと Cloudera Data Platform のユーザーに互換性を持たせるための設定です。

この設定が漏れていると、クラウドプロバイダ側の資源へのアクセス（AWSのS3など）が参照できなかったり、アクセスエラーが発生する場合があります。

# 設定方法

## ID Broker Mappings の設定画面を開く

Management Console > Environment から、該当の環境名をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/6caf2225-089c-e2d6-b0a7-fddfb3f73478.png)

Actions -> Manage Access をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/881b62dd-e599-135d-0b9a-c68a30623d7e.png)

ID Broker Mappings タブを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/0580a2d9-8848-c88f-38e5-a36cc648025b.png)

## マッピングを追加する

ID Broker Mappings タブ内で、Edit ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/6a921ba5-04ea-7bb9-c4b1-21f311b2565a.png)

画面が以下のように、編集モードに切り替わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/4fbef855-3dc8-15f7-bd41-9da45cb65708.png)

ユーザー名・グループ名の検索欄に、追加したいユーザー名またはグループ名の一部を入力すると、以下のように候補が表示されます。
候補の中から、対象のユーザーを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/bc779c5f-94e0-542f-087c-3f12b87013ec.png)

すると、そのユーザーのCRN（Cloudera Data Platform 上のロールのID）がユーザー名の欄に設定されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/43826484-ae34-dbc3-4120-13cecd94e49d.png)

画面に表示されている「Data Access Role」のARNを、Role 欄にコピー＆ペーストします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/a67c3e31-bcd1-e114-9df3-355ecd022bfc.png)

「Save and Sync」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/fc91d884-28f6-646c-1541-7b17ffa7d7a7.png)

## 結果の確認

以下のように、追加したユーザーが一覧に表示され、sync の status が complete になっていれば完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/4818a006-15bd-b04f-9905-524709b6b07d.png)
【ネットワーク】初心者のためのカプセル化、非カプセル化説明

## 概要
前回の記事はOSI参照モデルの７階層とその役割について説明をしました。
今回はその続きで**カプセル化、非カプセル化**について説明をしていきます。
前回の記事は下記のものになります。
こちらの記事を読んでからの方が理解しやすいと思います。
是非、こちらも読んでみてください。

https://qiita.com/nakamura_slj/items/0c827de1dab6ebc722d2


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


# カプセル化と非カプセル化
それでは早速カプセル化と非カプセル化について説明していきたいと思います。
カプセル化と非カプセル化はOSI参照モデルに限らず、複数のプロトコルを使う場合に行われる処理です。
![スクリーンショット 2023-11-14 12.49.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524075/e8dd2359-976f-7f2b-3ecb-aed21a7df867.png)

### カプセル化
コンピュータ同士の通信では、上の階層から順番に
アプリケーション層、プレゼンテーション層、セッション層、トランスポート層、ネットワーク層、データリング層、物理層とデータが渡されていき、その過程で各階層の情報が付加されます。
最終的には、物理層で電気信号に変換されてケーブル上に送信されます。
各階層でデータの送信に必要な情報は、**ヘッダ**という形でデータの先頭に付加されます。
通信データは**ヘッダ+データ**の形式で送られます。
ただ、データリング層では後ろに**トレーラ**もつき、階層ごとにヘッダの形式や設定する情報は違ってきます。
各層から見たデータ部分は図の青い箇所となります。
例）L6で見たデータは『L7ヘッダ＋データ』という事になります。


### 非カプセル化
送信側とは逆で、受信側では下の階層から上の階層に向かって通信データが渡されます。
各階層では、ヘッダ＋データのヘッダ部分を見て処理を行い、データ部分を渡します。
このデータ部分は上の階層にとっては『ヘッダ＋データ』となっており、最終的にアプリケーション層にたどり着いて処理が行われます。
このようにヘッダ部分を取り外して次の上の階層にデータを渡していくことを**非カプセル化**と言います。

## 補足
各階層で扱うデータを**PDU**（Protocol Data Unit）と言います
L4で扱う通信データは**セグメント**、L3で扱うデータは**パケット**、L2で扱うデータは**フレーム**と言います。
つまり、セグメントにL3ヘッダを付与するとパケットになり、パケットにL2ヘッドを付与するとフレームになります。
そして、各階層で取り扱うPDUからその層のヘッドを除いた部分（データ部分、図で言うと青の部分）を**ペイロード**と言います。


# 最後に
以上となります。
今回はカプセル化と非カプセル化について説明しました。
次回は、TCP/IPモデルについて説明しようと思います。
記事は下記のものとなります！是非、見てください！

https://qiita.com/nakamura_slj/items/f4b3626833181110408c
Ruby on Railsアップデート(13年前のバグがFixされた件 他 2023-10-20)

## これはなに
Railsコミッタたちが連載している[This week in Rails](https://world.hey.com/this.week.in.rails)の内容を、簡単な補足と併せて紹介する連載です。社内slackで毎週書いていたものですが、連載力の持ち腐れな気がしてきたので公開することにしました。

## 引用元
https://world.hey.com/this.week.in.rails/rails-world-talks-online-fix-of-a-13-years-old-bug-and-more-7cdd9e53

## 今週のトピック

### Rails World 2023 の公演@アムステルダムが公開された件
行きたかったなぁ...。Railsのyoutubeアカウント4000人ちょいなんだ(もっと多いと思っていた

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

### [自動読み込みと再読み込みに関する13年前のバグがRails 7.1でfixされた件](https://github.com/rails/rails/pull/49947)
https://github.com/rails/rails/pull/49636
https://railsguides.jp/autoloading_and_reloading_constants.html
```
config.paths["app/helpers"] << "#{Rails.root}/custom/helpers"
config.eager_load_paths << "#{Rails.root}/extras"
```
この順番ならconfig.{autoload,autoload_once,eager_load}_paths)にcustom/helpersは入る。でも逆にすると入らない。

### [関連付けでforeign_keyに配列を渡すとexceptionが飛ぶようになった件](https://github.com/rails/rails/pull/49625)
foreign_keyオプションがArrayとして渡されることは許可もサポートもされていない。これはRails7.1も同じ。でも、Rails7.1では[複合主キーのサポート](https://railsguides.jp/v7.1/active_record_composite_primary_keys.html)により、間違ってforeign_keyにArrayを渡してしまうミスが一般的になるのではという危惧から、それをやるとexceptionが飛ぶようになったそうな。
https://railsguides.jp/association_basics.html

### [HAML・Slim 用のキャプチャビューヘルパーが修正された件](https://github.com/rails/rails/pull/49612)
HAML や Slimで空白文字列がキャプチャされると、バッファ全体が返されるが、これが修正された。
https://railsdoc.com/page/capturehttps://railsdoc.com/page/capture

```
h1 商品一覧
= capture do
  = nil
```
こう書くと、h1で「商品一覧」が二つ表示されてしまうというもの。手元で試したら再現した
Ruby on Railsアップデート(ActiveSupport::Callbacksで使われるメモリの削減 他 2023-10-28)

## これはなに
Railsコミッタたちが連載している[This week in Rails](https://world.hey.com/this.week.in.rails)の内容を、簡単な補足と併せて紹介する連載です。社内slackで毎週書いていたものですが、連載力の持ち腐れな気がしてきたので公開することにしました。

## 引用元
https://world.hey.com/this.week.in.rails/reduce-memory-used-by-activesupport-callbacks-non-column-backed-attributes-for-enum-and-more-4b78337b

## 今週のトピック

### [ActiveSupport::Callbacksが使用するメモリを削減する](https://github.com/rails/rails/pull/49728/files)
- サブクラスと共有されるコールバックは、before/after...で生成されるProcをサブクラス間で共有しなかった
- これは遅延的に生成されるため、アプリケーションの起動後にメモリが増大する原因にもなっていた
- 今回の変更で、ブート時からリクエスト送信後までのメモリ増加が半減した

### [データベースのカラムでないattributesに対してもenumを使えるようにする](https://github.com/rails/rails/pull/49769)
実際にやるときは、明示的な型で宣言されていないといけない。こんな感じ
```
class Post < ActiveRecord::Base
  attribute :topic, :string
  enum topic: %i[science tech engineering math]
end
```

### [NumberToHumanSizeConverterで負の数も扱えるようにする](https://github.com/rails/rails/pull/49791)
```
# Before
helper.number_to_human_size(-1234567)
# => "-1234567 Bytes"

# After
helper.number_to_human_size(-1234567)
# => "-1.18 MB"
```

### [StrongParameters#extract_valueに空白値が含まれるようする](https://github.com/rails/rails/pull/49749)
```users/______________________________________```のような変わったURLを誰かが作った場合は...とかディスカッションしててへえぇとなった

### [ActiveRecord::Persistence.deleteメソッドで無効な PRIMARY KEY 値を無視する](https://github.com/rails/rails/pull/49738)
ActiveRecord::Persistence.deleteメソッドに無効な主キー値が渡されると、Active Recordは不要なDELETEクエリを実行する。例えば
```
irb(main):001> User.delete([])
  User Delete All (0.6ms) DELETE FROM "users" WHERE 1=0 => 0
```
これがなくなった
Ruby on Railsアップデート(DockerfileテンプレートのKubernetesルートレスポッド対応 他 2023-11-03)

## これはなに
Railsコミッタたちが連載している[This week in Rails](https://world.hey.com/this.week.in.rails)の内容を、簡単な補足と併せて紹介する連載です。社内slackで毎週書いていたものですが、連載力の持ち腐れな気がしてきたので公開することにしました。

## 引用元
https://world.hey.com/this.week.in.rails/insert-returning-for-mariadb-set-constraints-for-postgresql-deferrable-foreign-keys-for-sqlite-and-919ea0a9

## 今週のトピック
(弊社(https://foodison.jp/) では主にMySQLを使っているのもあり一部記事を省略しています)

### [DockerfileテンプレートをKubernetesのルートレスポッドに対応させる](https://github.com/rails/rails/pull/49742)
railsの新規実行時に生成されるDockerfileがKubernetesのrootless podsで動作するようになった。


### ["has_one_attached "と "has_many_attached "でサービスをProcとして受け入れる](https://github.com/rails/rails/pull/49863)
サービスを呼び出し可能なProcとして指定できるようになり、Active Storageで特殊なattachmentの関連付けをより柔軟に行えるようになった。
```
class User < ActiveRecord::Base
  has_one_attached :avatar, service: ->(user) do user.in_europe_region?s3_europe : :s3_usa end
end
```

### [attr_internal_defineの簡素化](https://github.com/rails/rails/pull/49864)
[Module.attr_internal_naming_format=](https://edgeapi.rubyonrails.org/classes/Module.html#method-c-attr_internal_naming_format-3D)の内部を最適化し、与えられたフォーマットから"@"プレフィックスを除去する。このメソッドに"@"プレフィックスを指定すると、非推奨の警告が表示される。

### [マイグレーションファイルの作成エラー時の終了ステータスが0でなくなった](https://github.com/rails/rails/pull/49644)
マイグレーションファイルの作成にエラーがある場合、終了ステータスは0になっていたがこれを修正

これが
```
% bin/rails generate migration ChangeFieldToUsers
      invoke  active_record
    conflict    db/migrate/20231015071420_change_field_to_users.rb
Another migration is already named change_field_to_users: /path/to/rails/db/migrate/20231015020422_change_field_to_users.rb. Use --force to replace this migration or --skip to ignore conflicted file.
% echo $?
0
```
こうなった
```
def self.exit_on_failure? # :nodoc:
  true
end
```

### [SprocketsでTrixを使用する際の修正](https://github.com/rails/rails/pull/49778)
[Action Text](https://railsguides.jp/action_text_overview.html)が更新され、最新リリースのTrix v2.0.7が含まれるようになり、ライブラリをSprocketsで使用しようとした際の問題が修正された

### [変更をアサートする際のエラーメッセージの改善](https://github.com/rails/rails/pull/48482)
minitestで提供されている[assert_changes および assert_no_changes](https://railsguides.jp/testing.html) のエラーメッセージに .inspect を使用したオブジェクトが表示されるようになり、nil と空の文字列、文字列とシンボルなどの区別が容易になった
複数テーブルの結合

ActiveRecordではどのようにテーブルの結合を記述したらいいのか。


## joinsで複数テーブルの結合 ##

### SQLクエリ ###

「JOIN〜ON〜」を繰り返すことで、３つ以上のテーブルを結合することもできる。
一度に３つのテーブルが結合されるわけではなく、前から順に１つずつ結合処理が行われる。
例)家計簿テーブル、費目テーブル、経費区分テーブルの結合(家計簿テーブルの日付カラム・費目テーブルの名前カラム・経費区分テーブルの名称カラムを結合する)
```sql:スッキリわかるSQL参考書例
SELECT 日付, 費目.名前 AS 費目名, 経費区分.名称 AS 経費区分名　(取得したい列の名前)
FROM 家計簿 　　　　　　　　　　　　　　　(家計簿テーブルに対して)
JOIN 費目  　　　　　　　　　　　　　　　 (まず費目テーブルを結合)
ON 家計簿.費目.id = 費目.id 　　　　　　(結合条件)
JOIN 経費区分      　　　　　　　　　　　(その結果にさらに経費区分を結合)
ON 費目.経費区分id = 経費区分.id 　　　　(結合条件)
```

### ActiveRecordクエリ ###
関連付けを行なった上で以下のように記述すると上記と同じように指定したカラムを取得できる
```ruby: 
class 家計簿 < ApplicationRecord
  scope :joined_data, -> {
    joins(:費目, :経費区分)
      .select('家計簿.日付, 費目.名前 AS 費目名, 経費区分.名称 AS 経費区分名')
  }
end
```



***
### 例１(複数の関連付け)

「カテゴリーが1つあり、かつコメントが1つ以上ある、すべての投稿を返す」場合

**SQLクエリ**
```sql
SELECT posts.* FROM posts
  INNER JOIN categories ON articles.category_id = categories.id
  INNER JOIN comments ON comments.article_id = articles.id
```
**ActiveRecordクエリ**
```ruby
Posts.joins(:category, :comments)
```
***
### 例２(ネストした関連付け)
「ゲストによるコメントが1つある投稿をすべて返す」場合
```sql:
SELECT posts.* FROM posts
 INNER JOIN comments ON comments.post_id = posts.id
 INNER JOIN guests ON guests.comment_id = comments.id
```
 ```ruby:
 Post.joins(comments: :guest)
```


### 参考
すっきりわかるSQL入門 第２版
[Railsガイド](https://railsguides.jp/v6.0/active_record_querying.html)
Ruby on Railsアップデート(YJITのデフォルト有効化 他 2023-11-10)

## これはなに
Railsコミッタたちが連載している[This week in Rails](https://world.hey.com/this.week.in.rails)の内容を、簡単な補足と併せて紹介する連載です。社内slackで毎週書いていたものですが、連載力の持ち腐れな気がしてきたので公開することにしました。

## 引用元
https://world.hey.com/this.week.in.rails/yjit-enabled-by-default-active-model-improvements-and-much-more-24133e81

## 今週のトピック

### Ruby on Railsのドキュメンタリー映画が初公開
主演: DHH 草。かっこいい。
<iframe width="560" height="315" src="https://www.youtube.com/embed/HDKUEXBF3B4?si=kYCJvDdxVmzPFhOR" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

### [Ruby 3.3+の場合、デフォルトでYJITが有効にする](https://github.com/rails/rails/pull/49947)
Ruby 3.2のYJITを有効にしたRailsアプリでは、レイテンシが15～25%改善したという公開報告が多数あったが、3.3ではさらに改善されている。もともとDHHは、RailsのパフォーマンスのためにYJITをデフォルトで有効にしたいと投稿していた
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Would love to see <a href="https://twitter.com/yukihiro_matz?ref_src=twsrc%5Etfw">@yukihiro_matz</a> make YJIT the new default as soon as possible. Such a monumental step forward for Ruby performance with Rails in the real world 🙏</p>&mdash; DHH (@dhh) <a href="https://twitter.com/dhh/status/1711423893746180397?ref_src=twsrc%5Etfw">October 9, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### [Active Records inspectの出力を設定可能にする](https://github.com/rails/rails/pull/49765)
attributes_for_inspectメソッドが使えるようになった

```
Post.attributes_for_inspect = [:id, :title] 
Post.first.inspect
#=> "#<Post id: 1, title："Hello、World!">"
```

デフォルトでは、inspectはオブジェクトのid(例えば```#<Post id: 1>```)を返すだけ。すべての属性を出力したい場合は、```Post.full_inspect```を呼び出していた。


### [type_for_attributeをActive Modelに移植する](https://github.com/rails/rails/pull/49910)
```type_for_attribute```が```ActiveRecord::ModelSchema::ClassMethods```から```ActiveModel::AttributeRegistration::ClassMethods``` に移動し、```attribute_types```も定義された。
https://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-type_for_attribute

### [Action Mailerのプレビューで、インラインの添付ファイルを通常の添付ファイルとは別にリストアップする](https://github.com/rails/rails/pull/49828)
他にもAction Mailer系の修正が何件か
- Action MailerのプレビューでDateヘッダーがある場合、Dateヘッダーから日付を表示([リンク](https://github.com/rails/rails/pull/49790))
- Action Mailerのプレビューで関連する場合のみSMTPエンベロープの受信者を表示([リンク](https://github.com/rails/rails/pull/48782))

### [システムテストを並列化する前に Selenium driver_path を事前にロードする](https://github.com/rails/rails/pull/49908)
webdrivers gemが存在しない場合（Rails 7.1+のデフォルト）、Selenium driver_pathは ```nil```で始まる。これでは、ドライバが遅延して配置され、システムテストが実行されるまで延期される。並列テストが使用されている場合、これは競合状態を引き起こし、各ワーカープロセスが同時にドライバを解決しようとする。その結果、[#49906](https://github.com/rails/rails/issues/49906)で説明したようなエラーが発生する。

### [Active Modelにおける無限大の変更検出の修正](https://github.com/rails/rails/pull/49904)
Float::INFINITY値を持つ属性は、同じ値に再割り当てしても変更されたとマークされないようにする
ChatGPTをM1Macにいれてみた

チャットAI作成したいよというところでまずChatGPT AIを使いたいのでインストールします。
手順は単純ですが、記事としてはあまりなかったので（いや簡単すぎるからということだろう）
記載してみました。

# ChatGPTのアプリ選定
ChatGPTのMac版アプリケーションは2種類あります。

・MacGPT
Mac向けのChatGPTクライアントアプリ。バージョンアップによって日本語での精度も向上した最新の言語モデル「GPT-4」にもいち早く対応している。

https://www.macgpt.com/

・ChatGPT for mac
ChatGPTをMacのメニューバーから呼び出すことができるオープンソースソフト。Cmd+Shift+Gを押すことで、会話ウィンドウを表示しすばやくAIに質問することが可能。Electronを使って作られたWebページのラッパーアプリ。

https://github.com/vincelwt/chatgpt-mac

さてどっちが使いやすいだろう？？
まぁすぐ呼び出すことができる方が良いだろうなということで、
後者の「**ChatGPT for mac**」を選択しました。

# ChatGPT for macをインストール
インストールするために[GitHub](https://github.com/vincelwt/chatgPT-mac)にアクセスする。

![スクリーンショット 2023-11-06 18.49.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153543/8a4d80fb-daa3-8dcb-4c4f-65ff69244df6.png)

赤枠を選択してダウンロードを開始する。

:::note warn
Intel版 Macの方は下の「**MacIntel.dmg**」を選択してダウンロードしてください。
:::

ダウンロード後に、ファイルを選択すると以下画面が表示されるので、
「ChatGPT.app」を「Applications」にドラッグ&ドロップします。
![スクリーンショット 2023-11-06 18.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153543/f453d479-3b0b-f71e-9937-94bec4a65f7d.png)

アプリ一覧にて「ChatGPT」が表示されるので選択。
![スクリーンショット 2023-11-06 19.02.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153543/796b7bd7-9890-52a0-f74b-e5e1b2d5e69d.png)

すでに「ChatGPT」のアカウントを持っている人は「**Log in**」
持っていない人はアカウントを作成する必要があるため、「**Sign up**」を選択します。
今回はアカウントがないため「**Sign up**」を選択します。

# ChatGPT アカウント登録
![スクリーンショット 2023-11-06 19.07.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153543/70bcf74e-e62c-e85c-1bda-fd4f96134b53.png)

登録用のアドレスを入力します。
![スクリーンショット 2023-11-06 19.09.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153543/a04d9631-1e3c-0921-2cf0-24e7fbfae613.png)

メールに届いたHPにアクセスして以下の内容を記入します。

:::note alert
気になる人は偽名でも大丈夫ですが、認証があるので電話番号は正しいものを登録してください。
:::

![スクリーンショット 2023-11-06 19.16.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153543/aef030e7-929e-da1f-650b-84ed43379692.png)


![スクリーンショット 2023-11-06 19.18.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153543/21035f62-eb90-4305-7582-d661adea4b2c.png)

電話番号を入力後に認証コードが送られてきますので、画面に入力します。
その後に以下が表示されればアカウント登録完了です。
![スクリーンショット 2023-11-06 19.19.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153543/f6dacc85-4133-03bd-179e-fb368b1e1422.png)

# ChatGPT起動
改めてアプリを起動させて「**Log in**」を選択してアカウント情報を入力。
以下のように質問することで実行することができます！

![スクリーンショット 2023-11-06 19.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153543/ca5917db-948a-c393-8455-8a13b531acb2.png)


# というわけで終わり

簡単かと思いきやアカウント登録がちょっとアプリだったりHPだったりと移動がめんどくさかったです。
けれどこれでインストールは完了しました！
さてこれからチャットAI作成していこうと思います。
続きの記事を作成したら、リンクを貼ろうと思います。

# 参考
以下を参考にさせていただきました。

https://www.minotake-gadget.net/chatgpt-mac/

https://www.minotake-gadget.net/chatgpt-howto/

https://pc.watch.impress.co.jp/docs/column/macinfo/1499074.html
【Bingで解説】「アクションバー」「ツールバー」「アプリバー」の違いって何？

「アクションバー」「ツールバー」「アプリバー」

それぞれの定義の違いについて小学生でも理解できるくらい丁寧に解説して頂けますか？

ーーーーーーーーーーーーーーーーーーーーーー

「アクションバー」「ツールバー」「アプリバー」とは、Androidというスマートフォンのシステムで使われるものです。

Androidでは、画面に表示されるものを「アクティビティ」という大きな部品に分けて管理しています。

例えば、電卓のアプリであれば、数字や記号を入力する部分と、計算結果を表示する部分とがそれぞれ「アクティビティ」になります。

これらの「アクティビティ」の上には、アプリの名前やメニューなどを表示するための帯状の部分があります。

これを「アプリバー」と呼びます。

「アプリバー」は、以前はAndroidで「アクションバー」と呼ばれていましたが、デザインが変わって「ツールバー」と呼ばれるようになりました。

「アクションバー」と「ツールバー」は、似ているようで違うものです。その違いは以下の通りです。

「アクションバー」は、Androidのシステムが用意してくれるもので、アプリの中で使える機能や情報を表示するためのものです。

例えば、戻るボタンや検索ボタンなどがあります。「アクションバー」は、Androidのバージョンによって見た目や動きが変わることがあります。

「アクションバー」は、getActionBar()という呪文を唱えると、手に入れることができます。

「ツールバー」は、アプリの開発者が自分で作るもので、アプリの特徴や目的に合わせてカスタマイズできるものです。

例えば、アプリのロゴや色などを変えたり、ボタンやテキストなどを自由に配置したりできます。

「ツールバー」は、Androidのバージョンに関係なく、同じ見た目や動きにすることができます。

「ツールバー」は、Toolbarという名前の部品を作って、setSupportActionBar()という呪文を唱えると、手に入れることができます。

このように、「アクションバー」と「ツールバー」は、似ているようで違うものです。

しかし、どちらも「アプリバー」と呼ばれることがあります。

これは、どちらもアプリの画面の上に表示される帯状の部分であるという共通点があるからです。

また、「アクションバー」と「ツールバー」は、互換性のために併用することもできます。

これは、古いバージョンのAndroidでも「ツールバー」を使えるようにするためのものです。

https://developer.android.google.cn/training/appbar/setting-up?hl=ja

この記事は、Androidの公式サイトで、「アプリバー」の設定や使い方を説明しています。

# 【まとめ】
先輩エンジニアから『拡張性』の観点から「ActionBar」よりも「ToolBar」の方が望ましいと教えられましたが、似たような意見を述べている記事を見つけたので以下に添付しておきます。

### AndroidのToolBar（新しいActionBar）メモ
https://qiita.com/kobakei/items/f17019f8b0a88c8e57f4

### カスタムビュー：ToolBar(ActionBar)を自作しよう！
https://qiita.com/mi_iroha/items/c8b6a1a6262c77e28301

また、以下の記事は有益だなと思いました。

### 【Android Studio】Toolbarを使って柔軟なアプリバーを作る
https://ukit-labo.hateblo.jp/entry/2019/12/03/183531
PoetryでPyTorchのCPU版をインストールする

`poetry` を使ってCPUのみのpytorchの環境を作りたかったがはまったのでメモ

## 環境
- python:3.11 のコンテナ
    - Debian GNU/Linux 12 (bookworm)
- Python 3.11.6
- poetry 1.7.0

## 実行方法

```
# インストール時にパッケージを探しに行くリポジトリを追加し、pytorch-cpuという名前をつける
$ poetry source add --priority=explicit pytorch-cpu https://download.pytorch.org/whl/cpu
# インストール時にpytorch-cpuを使用することを指定
$ poetry add --source pytorch-cpu torch torchvision
```

## 解説
- pipの`index-url` のようなインストール時にパッケージを探しに行くリポジトリを指定できるようにする

- 追加するリポジトリはPyTorchのwebサイトのインストールを見に行き、pipの引数を確認するとわかる
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32245/f4da0217-ed18-651f-aaff-acf9e4db3657.png)
- `poetry source add` によってリポジトリの追加をする
    - priorityは `default`, `primary`, `supplemental`, `explicit` を選べる
    - poetryがパッケージを探す優先順位は `1. default, 2. primary, 3. PyPI, 4. supplemental`
    - `explicit` の場合は `poetry add` の時に明示的に指定したときだけ使われる
        - poetry 1.5系で `explicit` が追加されました
- `poetry add` する際に `--source` で明示的にリポジトリを指定することで、狙ったPyTorchのパッケージがインストールされる


## 参考
- https://pytorch.org/get-started/locally/#start-locally
- https://github.com/python-poetry/poetry/issues/7685#issuecomment-1632693935
- https://python-poetry.org/docs/repositories/#project-configuration
- https://github.com/python-poetry/poetry/releases/tag/1.5.0
WinSock2を使用したTCP通信クライアント①

# WinSock2を使用したC++コード

備忘録代わりに。
WinSockにはバージョンが2.2まであり、そちらを使用した　TCP通信をコンソール画面でとりあえず実装する手順。

# WinSock2を使うには
最低限下記の2つは必要となります。
①WinSock2.hをインクルード
②WinSock2ライブラリへのリンク

①はそのままソース内に記述してください。

    #include<WinSock2.h>

②はVisual Studioのプロジェクトのプロパティからリンカー設定しても大丈夫です。プログラムコードに記述して貰っても大丈夫です。

    #pragma comment(lib, "ws2_32.lib")


# WSAを初期化
Windows Socket APIを使用してソケット通信を行うため、こちらをまず初期化します。

    WSAData wsaData;
    int error = WSAStartup(MAKEWORD(2,2),&wsaData);
    if(error != 0)
    {
        // エラー処理
    
    }
MAKEWORDで使用するWinsockのバージョンを指定しているので最新である2.2以外を使用する場合は対象のバージョンに書き換える必要がある。

# 接続先情報の設定
クライアントがサーバと接続するために必要なのがサーバのIPアドレスやポート番号です。
こちらを今回はループバックアドレス決め打ちで指定してみます。
実際のサーバにアクセスする際はgetaddrinfo関数などでDNSからIPを取得する必要がありますので注意。
getaddrinfo関数は別途記事にする予定です。

    // 接続先のIPアドレスやポート番号の情報を保持するための構造体sockaddr_in構造体を用意
	struct sockaddr_in addr;
    // アドレスファミリ指定(AF_INETはIPv4での通信)
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	// 接続先IP設定
	addr.sin_addr.S_un.S_un_b.s_b1 = 127;
	addr.sin_addr.S_un.S_un_b.s_b2 = 0;
	addr.sin_addr.S_un.S_un_b.s_b3 = 0;
	addr.sin_addr.S_un.S_un_b.s_b4 = 1;
# SOCKET作成
TCP通信ソケットを作成するにはsocket関数を使用します。
第1引数にアドレスファミリ指定、第2引数にソケットの種類(TCPはSOCK_STREAM)、第3引数には通信プロトコルを指定します。
今回はそれぞれAF_INET、SOCK_STREAM、IPPROTO_TCPを指定します。

	SOCKET sock = socket(addr.sin_family, SOCK_STREAM, IPPROTO_TCP);
	if (sock == INVALID_SOCKET) {
		// エラー処理
	}
※ ループバックアドレスとはコンピュータが自分自身と通信するための特殊なアドレスです。
# 接続
サーバへの接続を行います。
TCP通信はコネクションを確立します。そのための関数がconnect関数です。


	error = connect(sock, reinterpret_cast<struct sockaddr*>(&addr), sizeof(addr));
	if (error != 0) {
		// エラー処理
	}
  ここで注意するのはconnect関数の第二引数がsockaddr*にキャストして渡すことです。
  connect関数の第二引数sockaddr*は汎用的な設計になっており、アドレス情報を受け入れることが出来ます。
  ここではsockadddr_inですが、IPベースでのアドレス情報となっています。
  他にもsockaddr_unなどもあり、sockaddr*にキャストすることで色々な型を受け入れられるようになっています。
  
  # 通信
  TCP通信はソケットに宛先が紐づいているのでこちらを利用してデータの送受信を行っていきます。
  送信サンプル

    char buffer[6]="hello";
    int size = send(sock, buffer, sizeof(buffer), 0);
宛先が紐づいているソケット、送信したいデータのポインタ、送信データのサイズを指定することで送信が行えます。
戻り値は送信したサイズが返ってきており、送信エラーの場合は-1が返ってきます。

# 受信
TCP通信は1対1の通信なので不特定からまとめて1つのソケットで受信することは出来ません。
複数の相手からデータを受信したい場合は人数分ソケットを用意し、それぞれで受信を行う必要があります。
受信サンプル

    char buffer[256];
    int size = recv(sock, buffer, sizeof(buffer), 0);
基本的にsend関数と同じような使い方をします。異なるのは送信データのポインタが受信したデータの保存先のポインタに変わっているところです。
指定したポインタに指定したデータのサイズ分保存されます。


# 終わり
次はホスト側を時間を見つけて書きます。
【ChatGPT無】カスタム指示で確実な情報を！


　どうも、カーブミラーです。

　今回は、確実な情報だけを出力してもらうためのカスタム指示を用意しました。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::
　ChatGPT内に
　　読み込まれた知識は
　　　間違った内容も含まれます。

　私が嫌っている「スマホ熱中症」も
　　最新のナレッジカットオフで
　　　間違った情報を取り込んで
　　　　しまったようです。

　以前は、
　　推測で、回答していましたが、
　　　今では、“推測ではありません”
　　　　と答えてきます。

　これは、
　　GPT-4でも
　　　同じでした。

　つまり、
　　ハルシネーションではなく、
　　　事実として、学習して
　　　　しまっているのです。
***
　しかし、
　　100%確実な情報では
　　　ないようです。

　いろいろと
　　やり取りした結果、
　　　以下のことがわかりました。

　・言葉は、知識ベースにある。
　・一般的な言葉である。
　・医学的には、確証がない。
***
　その後も、
　　やり取りを
　　　繰り返しました。

　その結果が
　　以下のPromptです。

　このPromptを
　　カスタム指示の下部に
　　　書き込むことで、
　　　　あやふやな情報を
　　　　　提供しないように
　　　　　　なります。

```Text:カスタム指示（下部）へのPrompt
下記のことを必ず守ってください。

100%確実な情報以外は、“わからない”とだけ答えてください。
100%未満の情報や仮説や推測はいりません。
余計な説明はいりません。
```

　ただし、
　　100%確実な情報だけを
　　　出そうとするので、
　　　　少しでも確実でないと
　　　　　何も出せなくなる、
　　　　　　という状態になります。

　これを
　　良しとするかしないか、は
　　　みなさんにお任せします。

　今回は、ここまで。
BlenderとPythonでジオメトリノードのグループ出力を取得する方法

bpyを用いてグループ出力を取得する方法について解説します。まだまだ勉強中なので、誤り等ありましたらコメントでご指摘ください。
## 目的
Blenderのジオメトリノード機能で作成したオブジェクトのグループ出力をpythonスクリプトで取得したい。
## 環境
Blender 4.0 Beta
Python 3.10.13

## 取得方法
### エディタ上での準備
取得したい情報をジオメトリノードのグループ出力につなぐ。

![グループ出力.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212682/e766482f-0e83-be94-995c-e71036a4f078.jpeg)

スクリプトからアクセスするために、出力にAttribute（属性）を割り振る。
プロパティエディタ＞ジオメトリノードモディファイアー＞出力属性から取得したいデータにAttribute名をつける（画像だと'rotation'）。

![モディファイア.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212682/d461becd-846a-cd50-0ecc-a7c57df4d4c6.jpeg)



### スクリプト
以下のスクリプトでグループ出力が取得できる。この例では、'rotation'の出力を取得している。

なお、Blenderのpythonで`print()`を使用するためには、Blenderをコマンドプロンプトから起動する必要がある（コマンドプロンプトを経由せずに起動して`print()`を使用した場合、Blenderが落ちることがあるため注意）。
```python
import bpy
obj = bpy.context.object.evaluated_get(bpy.context.evaluated_depsgraph_get())
mesh = obj.to_mesh()
rotation_vector=mesh.attributes['rotation'].data[0].vector
print(rotation_vector)
```
出力

```
<Vector (0.0000, 0.0000, 1.4897)>
```
## 解説
```python
obj = bpy.context.object.evaluated_get(bpy.context.evaluated_depsgraph_get())
mesh = obj.to_mesh()
```
`bpy.context.object.evaluated_get(bpy.context.evaluated_depsgraph_get())`でモディファイア（この場合はジオメトリノードモディファイア）が適用されたオブジェクトを取得し、`to_mesh()`を用いてオブジェクトに紐づけされたメッシュを取得する。
```python
rotation_vector=mesh.attributes['rotation'].data[0].vector
```
`mesh.attributes['rotation'].data`で各頂点のrotationのリストを取得する。`data`のインデックスは各頂点のインデックス番号と対応している。

今回取得したいデータはベクトルなので、メンバ変数のうち`vector`を見ることで、rotationのベクトルが取得できる。

## 自分用の覚書
今回ジオメトリノードのグループ出力を取得する方法を調べる際に使用した手法を自分用に残しておく。
`rotation_vector=mesh.attributes['rotation'].data[0]`からどのようにベクトルを取得したらいいかわからなかったため、以下のスクリプトを用いて、`rotation_vector=mesh.attributes['rotation'].data[0]`に入っているオブジェクトのメンバを確認した。
```python
import bpy
obj = bpy.context.object.evaluated_get(bpy.context.evaluated_depsgraph_get())
mesh = obj.to_mesh()
data = mesh.attributes['rotation'].data[0]
for p in dir(data):
    print('%s: %s,\n' % (p, getattr(data,p)))
```
出力
```
__doc__: None,

__module__: bpy.types,

__slots__: (),

bl_rna: <bpy_struct, Struct("FloatVectorAttributeValue") at 0x00007FF7D21488C0>,

rna_type: <bpy_struct, Struct("FloatVectorAttributeValue") at 0x00007FF7D21488C0>,

vector: <Vector (0.0000, 0.0000, 1.4897)>,
```

## 参考
[https://blenderartists.org/t/accessing-spreadsheet-data-with-python/1367634/6](https://blenderartists.org/t/accessing-spreadsheet-data-with-python/1367634/6)
[https://twitter.com/yukimituki11/status/1436955560612544517](https://twitter.com/yukimituki11/status/1436955560612544517)
Cloudera Data Platform - 環境に対するアクセス権限の付与

# この記事について

Cloudera Data Platform で、特定の環境にアクセスするためのユーザー／グループ権限を付与する手順を説明します。

# 前提

この操作を行うユーザーは、管理者ユーザーである必要があります。
具体的には、下記いずれかの権限を持っているユーザーが、以下の操作を行うことができます。

- ユーザー個人の権限として Power Role を持っている
- 環境に対するアクセス権が Owner または Environment Admin である

# 設定方法

## アクセス管理画面の表示

Management Console > Environment から、該当の環境名をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/4f115133-3e39-73da-631d-c2b21deb8d87.png)

Actions > Manage Access をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/4a296c66-a29a-b9b7-971c-be1359e92ec8.png)

以下のような、アクセス一覧画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/6dd32b52-e1bb-fb7f-6a92-fb49470ac700.png)

## アクセス可能なユーザー／グループの追加

検索ウィンドウから、権限を設定したいユーザー／グループを検索し、該当のユーザー／グループを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/daf43bfa-44bb-e6ff-8f1b-fe389fb96e90.png)

上記は「user」という文言でユーザー検索し、user.satoko.sato さんに権限を追加している例です。

:::note
ユーザーの左側のアイコンにより、ユーザーの種別が異なります。
- マークなし : 個人のユーザー
- 人が２人並んでいるマーク : グループユーザー
- パソコンのマーク : マシンユーザー 
:::

## 既存ユーザーに対するアクセス権限の追加

既存ユーザーに権限を追加する場合は、ユーザー名（またはグループ名）の右側の「Update Roles」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/f83165a2-7877-9b84-bf7c-514592defb18.png)

## 権限の追加

以下の画面で、必要な権限をチェックして「Update Roles」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/62d9ac31-0fd0-ca40-f37b-4d4a611254d8.png)

以下は、よくある役割ごとに、一般的に必要となるロールを示したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/d7e2e638-26d0-d2ef-81f1-d3ee1676e9c6.png)

## 権限の反映

上記の権限設定後、権限を反映させるためには、ユーザーの synchronize を行う必要があります。

以下の手順を参考に、権限を反映してください。

ユーザー一覧の画面から「Synchronize Users」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/46b7bf64-0f47-39a2-0cac-abc0d515d0fc.png)

「Synchronize Users」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/14a2959a-3da7-9499-3905-4596fe66683a.png)

以下のように表示されれば完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/1ab2f2b7-f070-7470-155d-261ec2946147.png)
[Nuxt] エラーページの作り方


## layouts/error.vue ##
**layouts/error.vue** を作成するだけで、存在しないURLにアクセスされた場合は自動的にこのページが表示される。

それ以外にロジックを書く必要はない。

## Netifyにデプロイする場合は注意 ##
上記layouts/error.vueは、
**200.html**
で出力される。しかし **Netify** では存在しないページへのアクセスは
**404.html**
となるため、意図した動作にならない。

## nuxt.config.jsを調整する 

```nuxt.config.js
export default {
...
  generate: {
    fallback: 'true',
  }
}
```
と書いておくとエラーページは404.htmlで出力されるので、Netlifyであっても意図通りデプロイされる。
wslでelixir その104

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
qiita api叩いて、smart data transformで表示せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a69cc79d-9302-953b-0f60-e5727efed351.png)


# サンプルコード

```
my_data = Req.get!("https://qiita.com/api/v2/users/ohisama@github/items")
  |> Map.get(:body)
  |> Enum.map(& Map.take(&1, ["title", "url"]))

```

以上。
[Ruby on Rails]パーシャルを利用してDRYの原則に沿う

## 経緯
一般的なタスク管理アプリを開発していました。

新規登録画面で、バリデーションエラーの際にフォームの下にエラー分を表示するように実装しましたが、同じような内容を２回書いていたのでDRYの原則に違反していました

パーシャルを利用して共通化をした際の作業履歴を自分用に残しておく記事です。

```tasks/new.html.erb
<% provide(:title, 'タスク新規作成') %>
￼<h1>タスク新規作成</h1>
￼
￼<%= form_with(model: @task, local: true) do |form| %>
￼  <div class='field'>
￼    <%= form.label :title %>
￼    <%= form.text_field :title, maxlength: 50 %>
￼    <% if @task.errors[:title].any? %>
￼      <div class="error_messages">
￼        <% @task.errors[:title].each do |message| %>
￼          <p><%= message %></p>
￼        <% end %>
￼      </div>
￼    <% end %>
￼  </div>
￼
￼  <div class='field'>
￼    <%= form.label :description %>
￼    <%= form.text_area :description, maxlength: 255 %>
￼    <% if @task.errors[:description].any? %>
￼      <div class="error_messages">
￼        <% @task.errors[:description].each do |message| %>
￼          <p><%= message %></p>
￼        <% end %>
￼      </div>
￼    <% end %>
￼  </div>
￼
￼  <div class ='btn'>
￼    <%= form.submit "登録" %>
￼  </div>
￼<% end %>
￼
￼<%= link_to 'タスク一覧へ', root_path, class: 'button' %>
```


<br>
ここの部分がtitleかdescriptionかが違うだけで重複していました


```
<% if @task.errors[:title].any? %>
￼      <div class="error_messages">
￼        <% @task.errors[:title].each do |message| %>
￼          <p><%= message %></p>
￼        <% end %>
```
<br>

## パーシャル用に新しいディレクトリ、ファイルを作成
app/views/sharedというディレクトリを作成して、そこに_field_error.html.erbという名前のパーシャルファイルを作成しました
<br>

```_field_error.html.erb
<% if object.errors[field].any? %>
  <div class="error_messages">
    <% object.errors[field].each do |message| %>
      <p><%= message %></p>
    <% end %>
  </div>
<% end %>
```
objectは入力フォームのモデルオブジェクトなどです。今回は＠taskが入ります

fieldは、チェックする特定のフォームでtitleやdescriptionが入ります


<br>

## 元のファイルでパーシャルをレンダーする


```tasks/new.html.erb
<% provide(:title, 'タスク新規作成') %>
<h1>タスク新規作成</h1>

<%= form_with(model: @task, local: true) do |form| %>
  <div class='field'>
    <%= form.label :title %>
    <%= form.text_field :title, maxlength: 50 %>
    <%= render 'shared/field_error', object: @task, field: :title %>
  </div>

  <div class='field'>
    <%= form.label :description %>
    <%= form.text_area :description, maxlength: 255 %>
    <%= render 'shared/field_error', object: @task, field: :description %>
  </div>

  <div class ='btn'>
    <%= form.submit "登録" %>
  </div>
<% end %>

<%= link_to 'タスク一覧へ', root_path, class: 'button' %>

```


共通部分が短くなってスッキリしました

<br>
<br>

ここの部分でレンダーしています。
```
 <%= render 'shared/field_error', object: @task, field: :title %>
```
<br>


# メモ
- パーシャルは_で始まるファイル名だが、レンダーする時は_は不要
- パーシャルにローカル変数を渡すことができる。より再利用が効く


<br>

## まとめ
よりDRYの原則に沿ったコーディングができました！
ジュニアエンジニアなのでもっとより良い書き方があったらぜひ教えていただきたいです
【エンジニア０年生】Azureのサブネット内でプライベート通信を確認する

こんにちは。インフラエンジニア歴マイナス1カ月のdessinです。
[前回の記事](https://qiita.com/dessin/items/7aa20b9e9a2b1301ba01)ではWEBサーバを立て、インターネットからアクセスしました。今回は、もう一つ作成した仮想マシンにローカルPCからリモートデスクトップ接続し、同じことを試してみましょう。同一サブネット内の通信が確認できることになります。
# 概要
仮想マシン（Windows）を作成し、その仮想マシンのパブリックIPアドレスに対し、ローカルPCからリモートデスクトップ接続する。
リモートデスクトップ接続先のブラウザから、WEBサーバにプライベートIPアドレスを使ってアクセスする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/70e61cef-ef9f-e4a4-7298-0516cef09342.png)


## 仮想マシン（Windows)作成
仮想マシンは前回の記事と同様に作成します。名前は「testmachine」としました。
注意点
* webサーバと同じリソースグループ、同じ仮想ネットワークに作成してください。
* Windows Server 2019としてください。
* サイズはB1sだと動作が遅すぎて作業にならないので、B2s以上にしてください。仮想マシン作成時、「サイズ」＞「すべてのサイズ」＞B2sを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/bd2afe8d-ab94-c123-3d16-7f69ba7fc042.png)
* ネットワーク設定タブ、受信ポートにはRDP(3389)を選択してください。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/bba6cb4f-a466-f410-c5d9-21741326c39b.png)
アラート通り、脆弱な状態ですので後から設定を加えます。
* 管理者アカウントは前回と全く同じです。
## 情報の確認
 testmachineを作成したら、「リソースへ移動」します。左ペイン「概要」から情報が確認できます。パブリックIPアドレス、プライベートIPアドレスをメモ。
 また、前回作成した仮想マシンも同様にしてプライベートIPアドレスをメモしておきます。

## リモートデスクトップ接続
自分のPCで、Windowsキー＋Rを押して、「mstsc」と入力してからエンターを押してください。リモートデスクトップ接続のウィザードが起動します。
「オプションの表示」から、仮想マシンに設定した、ユーザー名とパスワードを入力します。そして、「コンピュータ」の欄にはパブリックIPアドレスを入力します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/b805577d-7e65-a1ac-6728-e2cc1e982735.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/a6dc346c-991d-20b9-4056-b1078c377504.png)

接続をクリックすると、パスワードを要求されます。入力するとエラーメッセージが出ますが、無視して接続します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/d9c7db9e-d90b-30b3-2df0-c2fe6272a344.png)

## 仮想マシン内での作業
勝手にサーバーマネージャーが立ち上がります。まず、左ペインのLocal Serverから、IEのセキュリティ設定を変更します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/70001386-cdf3-78d3-8cb7-47b20bac44b2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/03fab6f2-d289-bbfb-5934-d99fa515f76e.png)

さて、ここまで出来たらIEを開いて、検索窓にwebserverのプライベートIPアドレス8080webserver側でサーブするぞ～状態になっているかの確認をお忘れなく。
次のような警告が出ました。セキュリティの警告のようですが、信頼できるサイトならaddすれば通信できるといった内容です。addしてcloseしました。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/78ab4a43-260e-c5cd-69a5-936576f62cc0.png)
ところがこういった画面になりました。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/e17610cf-e07a-7c10-c5b7-ab3ab78c5c44.png)
>後記
このエラーメッセージは、リモートデスクトップ接続してすぐ行ったIEのセキュリティ設定ができていれば発生しないようです。（実際、スクショでも設定がOnのままになっています・・・）

今度は「`http://10.X.X.X（webseverのプライベートIPアドレス）:8080`」と打ち込んでみました。成功したようです。フム。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/ebab109b-e400-d656-86ed-5a5cdb685199.png)

chatGPTに質問したところ、GoogleChromeではIPアドレスだけでもブラウザがよしなにしてくれるが、IEではIPアドレスの先頭には`http://`をつけてあげないといけないようです。
ひとまず検証終了です。お疲れさまでした。
# まとめ
仮想マシンを同じサブネット内にもう一つ立て、ローカルPCからパブリックIPアドレスに対してリモートデスクトップ接続した。リモートデスクトップ接続先のブラウザから、同一サブネットに置かれたwebserverのプライベートIPアドレスへの通信を確認した。また、ブラウザによる仕様の違いを経験した。
「プロを目指す人のためのRuby入門」を読んでみた。

# はじめに
Rubyの定番の技術書である「プロを目指す人のためのRuby入門」を読んでみたので、今回はその感想を書いていこうと思います。

https://gihyo.jp/book/2021/978-4-297-12437-3

## 良かったところ
1. **サンプルコードがたくさん書かれている**
    文章だけで説明するだけでなく、実際にサンプルコードを用いて説明されていて、初学者の私にもわかりやすかったです。

2. **例題がある**
各章に例題が用意されており、実際に手を動かして学ぶことができるのでよかったです。

3. **基礎から応用まで網羅できる**
Rubyをあまり知らない人でも無理なく読み進めるように順を追って説明してくれてます。

## わかったこと
- メソッド呼び出し
```
オブジェクト.メソッド(引数1, 引数2, 引数3)
```

- 変数の宣言と代入
`変数名　= 式や値`
```
s = 'Hello'
n = 123 * 2
```
 
- メソッドの定義 
```
 def メソッド名(引数1, 引数2)
   # 必要な処理
 end
```
- 繰り返し処理
Rubyはfor文をほとんど使わない
```
number = [1, 2, 3, 4]
sum = 0
numbers.each do |n|
  sum += n
end
sum #=> 10
```
- ハッシュ
```
# キーと値の組み合わせ(要素)を3つ格納するハッシュ
{ キー　1 => 値1, キー2 => 値2, キー3 => 値3 }
```

- モジュール
```
module モジュール名
  # モジュールの定義
end
```




## 　難しかったところ
1. **プログラミング未経験の方には難しい**
タイトルに入門と書いてありますが、「プログラミング完全に未経験です」という方には難しいと思います。ある程度のプログラミングの基礎知識が必要だと思いました。

2. **内容が豊富なので、読むのが大変**
全部で５００ページくらいあるので、じっくり読むとかなり時間がかかります。私は１週目はさらっと読み、２週目は理解が甘いところをじっくり読みました。

# 終わりに
初学者の私のレベルでは、理解できないところが多々ありました。著者の方も「現時点では、完全に理解してなくても大丈夫」と書いてあるので、学習を進めているうちにわからないところがあれば、その都度本書を読み返していこうと思います。
AWS Certified Advanced Networking - Specialty (ANS-C01)を更新しました

# はじめに
AWS Certified Advanced Networking - Specialtyが失効間近のため更新しました。

# 教材
1. [Cloud License | (旧)AWS WEB問題集で学習しよう](https://cloud-license.com/exam/ans/)
    - 有償のおなじみのやつです。
    - 350問(50セクションx7問)です。
1. [試験問題サンプル](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-advnetworking-spec/AWS-Certified-Advanced-Networking-Specialty_Sample-Questions.pdf)
    - 無料の公式の試験問題サンプルです。
1. [AWS Certified Advanced Networking - Specialty Official Practice Question Set (ANS-C01 - Japanese)](https://explore.skillbuilder.aws/learn/course/14837)
    - 無料の公式問題集です。
    - 15問です。

# 感想
- ネットではAWS試験の中で最も難しいとの情報がありましたが、数問は難しいのもありましたが、「Cloud License」で対策しておけば、難なく解けるかと思います。
XcodeからAppStoreConnectにUpload時にThe provided entity includes a relationship with an invalid value

XcodeからAppStoreConnectにUpload時に
`The provided entity includes a relationship with an invalid value`

というエラーが発生しました。

## 原因
Apple Developer Programの新しい利用許諾契約に同意していなかった。

## 解決方法
https://developer.apple.com/account

に移動し、同意する。
Windows Powershellのwgetが遅いとき

## WindowsのPowershellでwgetしようとするととても遅い
本当に遅いのでなにか解決策はないかと調べた
→https://www.nuits.jp/entry/2020/03/15/091622
```bash
wget -UseBasicParsing 'Download link' -OutFile filename
```

-UseBasicParsingを付けたらちょっと速くなった。
このオプションをつけないとDLの進捗をコンソールに表示し続けてしまうのでかなり遅くなる…らしい。本末転倒じゃないか。

```bash
Start-BitsTransfer -Source http://hostname/download.file -destination output/path
```
これでめっちゃ速くなった。なんでかは…気が向いたら調べて書く。
Github enterpriseでOcta認証等SSO設定されているリポジトリにsourcetreeからアクセス

会社のgitがOctaなどでSSO設定されている人向け

1. PAT(personal access token)作成

2. 右上の歯車アイコン>リモート>

3. https://<token>@github.com/hoge.git を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216609/af8c2a25-1514-1360-9fae-15e189e91355.png)

4. ツール>オプション>認証　でアカウント追加されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216609/ae781e2a-0012-89c7-7880-93cd82f0b26f.png)

5. pull

6.エラーメッセージがでる

```
remote: To access this repository, visit https://github.com/enterprises/xxx-emu/sso?authorization_request=xyz and try your request again.
fatal: unable to access 'https://github.com/xxx/hoge.git/': The requested URL returned error: 403
```

7. 指定されたURLにパラメータ付でアクセスすると使えるようになる

クローンするには
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216609/dd0ad32b-b063-a651-2f0f-45a1f4a2a1f7.png)

https://token@github.com/hoge/hoge.git
Docker Compose どこで起動しているのか問題

# docker compose イメージの起動フォルダの確認

## 解決コマンド
```bash
docker compose ls
# docker compose ls -a # 全て表示
```


## docker compose 記憶との戦い 以前の私は何をしていたのか

```bash
docker compose hogehoge
```

以前に使っていたコンテナが起動しっぱなしで、現在の環境とすでに起動しているコンテナとportが競合して起動できない

色々なフォルダで環境構築を作っていたので、どこから起動しているのかわからない

```
docker ps
```
起動しているコンテナは確認できたが、どこで実行されているのかがわからない


## 解決コマンド
```bash
docker compose ls
# docker compose ls -a # 全て表示
```

このコマンドで現在起動中の composerコンテナ と docker-compose.yml がどのフォルダに有るかがわかる
killするだけでも良かったが、記憶にないぐらい古いデータであれば削除したかった
wslでelixir その103

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
qiita api叩いて、dataframeで表示せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/63bb4dc0-6a8a-b9fb-9895-5aa43bf5c093.png)


# サンプルコード

```
Req.get!("https://qiita.com/api/v2/users/ohisama@github/items")
|> Map.get(:body)
|> Enum.map(& Map.take(&1, ["title", "url"]))
|> Explorer.DataFrame.new()

```


以上。
Cloudera Data Platform - Workload Password の設定

# この記事について

Cloudera Data Platform において、APIを通じて環境にアクセスするための認証方法のひとつとして、コントロールプレーンから環境のWorkload Password を設定する方法があります。

この記事では、その設定方法を紹介します。

# 設定方法

## Workload Password 設定画面の出し方

### 自分自身の Workload Password を設定する場合

画面左下の自分の名前のアイコンをクリックし、「Profile」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/5ba041a9-fbb2-7430-d5ab-3fabd288b9f4.png)

すると、自分自身のプロフィール画面が表示されますので、「Set Workload Password」のリンクからパスワードを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/64c07ebe-1ef2-6fdf-9dab-9094f030aa81.png)

### 管理者として、他のユーザーの Workload Password を設定する場合

Management Console > User Management の画面から、Workload Password を設定したいユーザーの名前をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/97de6acd-b765-76da-dca3-2e36f29a7e8c.png)

すると、当該ユーザーのプロフィール画面が表示されますので、「Set Workload Password」のリンクからパスワードを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/64c07ebe-1ef2-6fdf-9dab-9094f030aa81.png)

## Workload Password の設定

Workload Password の設定画面でパスワードを設定し、「Set Workload Password」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/7665ae08-94bc-7533-73e1-7dcbd818e3c0.png)

:::note warn

パスワードは、以下の条件を満たす必要があります。

- 8文字以上
- 大文字と数字を必ず含む
- 記号(# & * $ % @ ^ . _ ! のどれか)を必ず含む

:::
OneNoteで同期エラー（このノートブックを同期するには、OneNoteにサインインしてください）

# はじめに
2023年、自分の環境で発生した上記のエラーを（妥協して）
解決できたので、共有したいと思います。

# 環境

OS：Windows 11 / Windows 10
OneNoteアプリのバージョン： 2302 ビルド 16.0.16130.20806
ノートブックはOneDrive上に保存
OneNoteを始めMicrosoft365製品やOneDriveにログイン済み
# 発生した症状

* OneNoteを開くと「このノートブックを同期するには、OneNoteにサインインしてください。」と黄色の帯が画面上に出る
    * アクセスしようとしているサーバーは、このバージョンのOfficeでエラーメッセージをクリックすると、サポートされていない認証プロトコルを使用しています。」とポップアップが出てくる
    * またはエラーメッセージをクリックしても消えない
* 「このノートブックを今すぐ同期」を押しても同期できない
* 「ファイル」→「情報」から保存先をブラウザで開くと「404 FILE NOT FOUND」
    * ブラウザ版OneDriveから開くことはできる
* 新しく作成したノートブックは同期できる（重要）

# 解決方法

新しいノートブックは作成・同期ができたので、"ノートブックを作り直し、今までの内容をコピーする"方法をとりました。

同期エラー自体は解決できていませんが、再びノートブックを使える状況になるので解決？です
SentryでSlackにエラーを通知する際、メンションをつける（裏技）


Sentry でエラー監視を行ない通知結果をSlackに連携している方は多いと思います。
しかし「Slackへの通知に気づかない」という経験はないでしょうか？

できればエラーは「即座に気づき・確認・修正・リリース」まで対応したいと考えている場合、エラー通知にメンションをつけたいですよね。以下がその解決方法です。

# Sentry の既存のAlert名にメンションを含める

1. サイドメニューの`Alerts`から設定したいプロジェクトのAlertを`Edit`
2. 最下部の設定項目`Add a name and owner`を編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/22e910cf-01a1-f0f1-de0a-5fdfe8b2f9f0.png)

これだけです。

```
Send a notification to Slack. <!channel>
```

# Before

![スクリーンショット 2023-11-14 10.27.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/7b905c89-89d4-2e67-2988-da6e09b88860.png)

# After

![スクリーンショット 2023-11-14 10.33.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/51daee38-661f-2ab7-3717-b7ad7cc7df14.png)

お試しあれ。
【Flutter】Xcode 15でiOS 17のシュミレーターが起動しないUnable to get list of installed Simulator runtimes

# はじめに
なぜかiPhoneシュミレーターが起動しない事件が発生した。。。。
「またか・・」
とため息をつきながら👇の対応を行った。

https://qiita.com/kokogento/items/465984cad8624f483782

**しかし、今回はいくらキャッシュを消してもシュミレーターが起動しない！！！！**

「何かがおかしい:expressionless:」

そう思いとりあえず`flutter doctor`で確認

```console
 % flutter doctor                                                                                                                      (git)-[master]
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.13.3, on macOS 14.1 23B74 darwin-x64, locale en-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[!] Xcode - develop for iOS and macOS (Xcode 15.0.1)
    ✗ Unable to get list of installed Simulator runtimes.
[✓] Chrome - develop for the web
[✓] Android Studio (version 2022.3)
[✓] VS Code (version 1.84.2)
[✓] Connected device (2 available)
[✓] Network resources

! Doctor found issues in 1 category.
```

やはりSimulatorを取得できていない。。

# Xcodeを15にアップデートしたことが原因だったっぽい

https://coderenkin.com/unable-to-get-list-of-installed-simulator-runtimes/

👆を参考に以下のコマンドを実行

```console
  % xcodebuild -downloadPlatform iOS 
 ```

 完了までにかなり長い時間かかったが、、、結果としてこのコマンドを実行しても解決しませんでした！！:sob:

`flutter doctor`の結果も全く同じ・・

なぜだ！！！と思ったらstackoverflowのページにヒントが、、

 # 既存のiOS 17をXcodeから削除

 `Xcode -> Window -> Devices and Simulators -> Simulators -> + -> OS Version -> Download more simulator runtimes`

 を開いて「iOS17.0」を削除！（おそらくXcodeを15にアップデートした際にダウンロードしたもの）

 ![Screenshot 2023-11-14 at 1.05.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/178a8f57-5b72-687d-8812-af2c14538370.png)

これで再度👇のコマンドを実行

```console
  % xcodebuild -downloadPlatform iOS 
 ```

 `% flutter doctor`が成功しシュミレーター起動できました！

 ```console
 % flutter doctor                                                                                                                      (git)-[master]
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.13.3, on macOS 14.1 23B74 darwin-x64, locale en-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 15.0.1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2022.3)
[✓] VS Code (version 1.84.2)
[✓] Connected device (2 available)
[✓] Network resources

• No issues found!
```



# 参考

https://stackoverflow.com/questions/77160074/unable-to-get-list-of-installed-simulator-runtimes