OmniAICreator/Qiita-1.07M huggingface dataset:
【勉強】大学院生がRuby on Rails勉強してみた

## はじめまして
こんにちは．理系大学院生（数学専攻）です．
備忘録的に文章を残しておこうと思います．誰かの役に立てば万々歳ぐらいのやつです．就職した後に自分で見て赤面してくれー（笑）．

## どんなひと？
AtCoderで競技プログラミングをやったりちょっっとだけ研究でプログラムを書いたりしているだけで，あまりにも開発経験が浅いということだけ先に．
競プロでPython，研究でC言語を使っています．

最近就活しなきゃなーってなってインターンに参加してみたはいいものの，本当に参加しただけになってしまった気がしてる（一応選考ルート乗ってみるけど不安）

## エンジニアインターンに参加してみて分かったこと
### ①エンジニアのしゃべってる言葉が分からない
くらす？えらーはんどりんぐ？？？いんすたんす？？？？？みたいな．話に全然ついていけなくてめちゃくちゃ迷惑かけました
### ②バックエンドでRuby on Railsが使われがち
私が見てる会社だけかも．MVCモデルおもろそう．
### ③プログラミングやっぱりたのしい！
これは本当に気付けて良かったこと．エンジニアたのしそう．早く就職しちゃいたい＾＾

## それならRuby on Rails勉強してみようよ
ってなったので，一旦，[Ruby on Rails 6 超入門](https://www.amazon.co.jp/Ruby-Rails-%E8%B6%85%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798059064)を図書館で借りてきました．こういうのは新しい本がいいっていうのは知ってるんだけど，2020年2月．4年半前やばい．ひとまずこれを読み切ってみたいと思います．自分的に詰まったところとか，これは後で見返した方がいいかも．みたいなものをまとめます．

### やったこと
- 環境構築
- 実際につくってみる

#### 環境構築
```:入力
rails server
```
をやったけどサーバーが立ち上げられなくて，
```:これ
bundle install --gemfile C:/Users/yazak/Documents/RailsApp/Gemfile
```
を実行しなさい！みたいなエラーがでたんだけど，やってみたら
```:エラー
An error occurred while installing psych (5.1.2), and Bundler cannot continue.
```
psychというもののインストールに失敗しているらしい．[この記事](https://www.ryozen-sc.com/brands/official/news/128)を参考にしたところbundle installが通った！ので環境構築おわり．ローカルホスト開けた．ページの見た目が4年半も経って変更されたっぽい．

#### 実際に作ってみる
本の内容をここに書いたりしたらふつーにまずい気がしてきたのでいつの段階で何ページぐらいにいるよーみたいな感じで進捗を書いていこうと思います．

2024/9/17
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090008/a59b06bd-3b5a-c41e-4be1-cc0ce7a920b8.png)
チェックボックスとかラジオボタンなど作成．

viewでユーザーから受け取った情報をcontrollerに渡す．controllerで情報を加工？して，viewで表示してる．

なにこれ？って思った単語とかについては別記事にまとめます．
[エンジニアが使ってる難しい単語あるじゃん](https://qiita.com/sethq/items/e0cab4608c1a5b38ff20)（随時更新．最終更新：2024/09/17）

おわり．
OutlookからAccessの社員テーブルに存在する社員のメールアドレスを取得する

```vb
Sub GetEmailAddressesFromOrganization()
    Dim olApp As Outlook.Application
    Dim olNamespace As Outlook.Namespace
    Dim olAddressList As Outlook.AddressList
    Dim olAddressEntries As Outlook.AddressEntries
    Dim olAddressEntry As Outlook.AddressEntry
    Dim olExchangeUser As Outlook.ExchangeUser
    Dim db As DAO.Database
    Dim rsEmployee As DAO.Recordset
    Dim rsAddress As DAO.Recordset
    Dim EmployeeName As String
    Dim EmailAddress As String
    Dim FoundContact As Boolean
    Dim TargetDepartment As String

    On Error GoTo ErrorHandler

    ' 絞り込みたい組織名を設定
    TargetDepartment = "営業部"  ' ここを目的の組織名に変更

    ' Outlookアプリケーションへの参照を取得
    Set olApp = New Outlook.Application
    Set olNamespace = olApp.GetNamespace("MAPI")
    Set olAddressList = olNamespace.AddressLists("グローバル アドレス一覧") ' または適切なアドレスリスト名

    ' アドレスリストのエントリを取得
    Set olAddressEntries = olAddressList.AddressEntries

    ' データベースとレコードセットを開く
    Set db = CurrentDb()
    Set rsEmployee = db.OpenRecordset("SELECT * FROM 社員テーブル")
    Set rsAddress = db.OpenRecordset("アドレス取得テーブル", dbOpenDynaset)

    ' 社員テーブルをループ
    Do While Not rsEmployee.EOF
        EmployeeName = rsEmployee!社員名  ' フィールド名を適宜修正
        EmailAddress = ""
        FoundContact = False

        ' アドレスエントリをループ
        For Each olAddressEntry In olAddressEntries
            ' Exchangeユーザーか確認
            If olAddressEntry.AddressEntryUserType = olExchangeUserAddressEntry Then
                Set olExchangeUser = olAddressEntry.GetExchangeUser
                If Not olExchangeUser Is Nothing Then
                    ' 部署名でフィルタリング
                    If olExchangeUser.Department = TargetDepartment Then
                        ' 社員名と一致するか確認
                        If olExchangeUser.Name = EmployeeName Then
                            EmailAddress = olExchangeUser.PrimarySmtpAddress
                            FoundContact = True
                            Exit For
                        End If
                    End If
                End If
            End If
        Next olAddressEntry

        ' 一致する連絡先があれば、アドレス取得テーブルに追加
        If FoundContact Then
            rsAddress.AddNew
            rsAddress!社員名 = EmployeeName
            rsAddress!メールアドレス = EmailAddress
            rsAddress.Update
        End If

        rsEmployee.MoveNext
    Loop

    MsgBox "メールアドレスの取得が完了しました。"

    ' オブジェクトの解放
    rsEmployee.Close
    rsAddress.Close
    Set rsEmployee = Nothing
    Set rsAddress = Nothing
    Set db = Nothing
    Set olExchangeUser = Nothing
    Set olAddressEntries = Nothing
    Set olAddressList = Nothing
    Set olNamespace = Nothing
    Set olApp = Nothing
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description
End Sub
```
未経験OK！声優オーディション一覧

声優になるために一番お金と時間がかからない方法は一般公募のオーディションで選ばれることです。

しかし、怪しかったり詐欺まがいのものも多いため注意が必要ですよ。

以下では、オーディションの開催母体がしっかりしているものだけを一覧でまとめたので良かったら見てみてくださいね。

オーディション突破のコツなどもありますよ！
https://seiyuu-naritai-ooendan.com/ippan-audition/
Confluence検索を爆速に！RaycastのQuickLinkで素早くアクセスする方法

Confluenceの検索を効率的に行いたいと思ったことはありませんか？
特に、大量のドキュメントが蓄積されている環境では、必要な情報にすぐアクセスできることが重要です。そこで今回は、RaycastのQuickLink機能を活用して、Confluenceの検索を爆速で行えるようにする方法をご紹介します。

## なぜRaycastでConfluence検索？

[Raycast](https://www.raycast.com/)は、Macユーザーにとって非常に便利なランチャーアプリで、様々なアクションを迅速に実行できます。今回紹介する方法では、Confluenceの詳細検索用URLをRaycastのQuickLinkに登録し、検索ワードを直接Raycastの入力画面から渡してConfluenceを検索できるようにします。

## 設定手順

### 1. Confluenceの詳細検索ページからURLを取得

まず、Confluenceの詳細検索ページを開きます。検索ボックスに任意のキーワードを入力した後、ページのURLをコピーします。コピーしたURLは、検索ワードを直接受け取る形式に編集します。

例: `https://hogehoge.rickcloud.jp/wiki/dosearchsite.action?queryString=` のように、`queryString=` の後に検索ワードが付加されるようにします。

### 2. RaycastのQuickLinkに登録

次に、Raycastの設定を開き、QuickLinkタブに移動します。新しいQuickLinkを追加し、以下の情報を入力します。

- **Name**: Confluence Search
- **Link**: 先ほどコピーしたURL（例: `https://hogehoge.rickcloud.jp/wiki/dosearchsite.action?queryString=`）
- **Dynamic Placeholders**: `{query}` など（ここに検索ワードを入力することになります）

最後に、ホットキーを設定しておくと、より素早くアクセスできるようになります。

### 3. 検索ワードを入力して検索

設定が完了したら、Raycastを開き、先ほど設定したQuickLinkを呼び出します。`Query`の部分に検索したいワードを入力するだけで、Confluenceの検索結果ページに即座にアクセスできます。

## まとめ

RaycastのQuickLink機能を活用することで、Confluenceの検索が驚くほど速く、簡単になります。大量のドキュメントから必要な情報を素早く引き出すことで、業務効率が格段に向上します。まだ試していない方は、ぜひこの方法を試してみてください。Raycastを使いこなして、毎日の作業をもっとスムーズに進めましょう！
turtlebot3_gazeboシミュレーション初回起動でクラッシュする問題(ROS2)

# 発生した問題
[Turtlebot3 E-Manual](https://emanual.robotis.com/docs/en/platform/turtlebot3/simulation/)の手順にしたがって、Ubuntu22.04、ROS2 Humble環境にてGazeboのワールドを初めてlaunchする際に、やたらと待たされた挙句、なにやらエラーが出てうまく起動できない現象が見られました。

実際に入力したlaunchコマンド
```
$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
```

出てきたエラーの末尾の文言（エラー全文は控えそこねてしまいました、、、）
```
Assertion `px != 0' failed.
```

# 解決方法
以下のフォーラムに同様の事象が挙げられていたので、Answerを読んでみました。

https://answers.gazebosim.org//question/7173/gazebo-crashes-assertion-px-0-failed/

以下のコマンドを実行したら治ったとのこと。
```
$ . /usr/share/gazebo/setup.sh
```
ガゼボの初期セットアップのシェルを予め呼び出しておく必要があったみたいですが、それが通常手順ではうまく実装されていないのでしょうか。

念の為、`.bashrc`に先程のシェルを呼ぶコマンドを書き込んでおくと同じ問題にならないかもしれません。
```
$ echo 'source /usr/share/gazebo/setup.sh' >> ~/.bashrc
 ```
ネットワークケーブル完全ガイド：ツイストペア、光ファイバー、同軸ケーブルの違いを徹底解説！

#### 概要
ネットワークを構築する際、ケーブルの選択は非常に重要です。この記事では、ツイストペアケーブル、光ファイバーケーブル、同軸ケーブルの種類と用途、特徴について初心者向けに解説します。

---

#### 1. ツイストペアケーブル（UTP, STP）

- **UTPケーブル（Unshielded Twisted Pair）**
  - **説明**: シールドがなく、コストパフォーマンスが高い。一般的に家庭や小規模オフィスのLANで利用されます。
また、ストレートケーブルとクロスケーブルの2種類に分けられます。
ストレートケーブルは、パソコンとルーターなどの他の機器同士を接続する場合に使用され
クロスケーブルは、パソコン同士を接続する場合に使用されます。
  - **特徴**: 簡単に扱え、設置が容易だが、ノイズ耐性は低め。
  - **用途**: オフィス、家庭用LAN、Ethernet接続。

- **STPケーブル（Shielded Twisted Pair）**
  - **説明**: シールドが施され、ノイズ対策がされています。高ノイズ環境や高パフォーマンスを求められる場所で使用。
また、近年発売されているネットワーク機器はノイズ対策ができているため、通信に影響を与えることは少なくなっています。
  - **特徴**: 外部干渉に強く、パフォーマンスが高いが、UTPよりも高価。
  - **用途**: 企業ネットワーク、高ノイズ環境。

#### 2. 光ファイバーケーブル

- **説明**: 光信号を使用してデータを伝送するため、非常に高速で長距離伝送が可能。ツイストペアケーブルよりも高価だが、次世代ネットワークでは必須の存在。
構造としては、人間の髪の毛ほどの細さの人工繊維（ガラスやプラスチック）で構成されており、中心部のコアと周囲のクラッドという2層構造になっています。コアは光を通し、クラッドが光を反射させることで光信号を伝送します。
- **特徴**: 高速、長距離伝送が可能。電磁干渉に強い。
- **用途**: インターネットバックボーン、データセンター、高速通信環境。

#### 3. 同軸ケーブル

- **説明**: 同軸ケーブルは、中心導体と外部シールドにより、信号損失が少なく、長距離伝送が可能です。ケーブルテレビや古いネットワークで一般的に使用されています。
- **特徴**: 耐干渉性が高く、長距離伝送が可能。物理的に太く扱いが難しい。
- **用途**: ケーブルテレビ、アナログ信号伝送、古いLAN環境。

---

#### 総括
ケーブルはネットワーク構成の要であり、選択次第でパフォーマンスが大きく変わります。UTPはコスト効率が高く、STPはノイズ耐性が高い、光ファイバーは次世代の高速通信に最適です。環境や用途に応じて最適なケーブルを選びましょう。

---
Raycastで作業効率を最大化！私が愛用するお気に入り機能7選


[Raycast](https://www.raycast.com/)は、Macユーザーにとって必須とも言えるランチャーアプリです。様々な機能を素早く呼び出せるだけでなく、カスタマイズ性も高く、日々の作業効率を大幅に向上させてくれます。今回は、私が特に愛用しているRaycastの機能を7つご紹介します。


## 1. [Google検索（Search Google）](https://www.raycast.com/mblode/google-search)

まず紹介するのは、最も使用頻度の高い「Google検索」機能です。Raycast上で直接検索クエリを入力し、そのままブラウザでGoogle検索を実行できます。ショートカットキー「g」を押すだけでアクセス可能なので、ブラウザを開いてから検索する手間を省くことができます。

## 2. [ChatGPTに質問（Ask Question）](https://www.raycast.com/abielzulio/chatgpt)

Raycastを使ってすぐにChatGPTに質問できる機能です。ちょっとした疑問や複雑な問題も、この機能を使って素早く解決できます。設定次第で、好みのAIサービスを利用することも可能です。

## 3. [Todoリストの管理（Manage Todo List）](https://www.raycast.com/maggie/todo-list)

「Todoリストを管理」する機能は、日々のタスク管理に欠かせません。Raycast上でタスクを追加、編集、削除できるので、タスク管理アプリを開く必要がなく、作業の流れを中断せずにタスク管理ができます。ショートカットキー「todo」でアクセス可能です。

## 4. [Google翻訳（Translate）](https://www.raycast.com/gebeto/translate)

「Translate」機能を使えば、Raycast上でテキストを直接翻訳できます。Google翻訳のパワーをフルに活用し、素早く言語間の変換が行えるので、文章の理解やコミュニケーションの際に非常に便利です。

## 5. ロック画面（Lock Screen）

「Lock Screen」はMACの標準機能で、ちょっとした休憩や席を離れる際に便利で、セキュリティを確保できます。

## 6. [進捗バー（Progress）](https://www.raycast.com/thomas/year-in-progress)

「Progress」機能は、年の進捗を可視化するためのものです。毎日のモチベーションを保つために、自分の進捗状況をチェックできる便利な機能です。

---

## まとめ

Raycastを使ってみて、ほんとに作業が捗るようになりました。
今回紹介したお気に入り機能は、どれも普段からよく使っているものばかりで、なくてはならない存在です！
シンプルなのに自由度が高いって、やっぱり面白いですよね！

これからもRaycastを使って、もっと効率よく仕事ができるようにしていくつもりです。
ただ、まだGitHubやDeepLの拡張機能を追加できてないんですよね……
これから試してみるのが楽しみです。

Raycastにはまだまだ未知の可能性がたくさんあるので、これからもいろいろ試しながら、自分なりの使い方を見つけていきたいと思います。
Uncached Disk Burst IOPSメモ

**Uncached Disk Burst IOPS** とは、ディスクがキャッシュを使用せずに動作している場合に、短時間で一時的に高いパフォーマンスを発揮できる最大のI/O操作回数（Input/Output Operations Per Second）を表します。この「バースト」は、通常の性能を超えて短期間の間に処理できる最大の入出力操作数を示しています。

### 主な特徴：
1. **キャッシュを使用しない状態でのパフォーマンス**：
   - **Uncached**という意味は、ディスクのキャッシュメモリを使わず、ディスク自体に直接データを読み書きしていることを指します。キャッシュを使う場合と比べて遅くなることが多いですが、**Burst IOPS**はその状態で一時的に通常のパフォーマンスを超える処理能力を示します。

2. **バースト性能**：
   - **Burst IOPS**は、通常のIOPSを超えて、特定の期間だけディスクが高いパフォーマンスで動作することを指します。例えば、一定量のデータを短期間に処理する必要がある場合、バーストモードでより多くのI/O操作を一時的に処理できます。
   - ただし、バーストには制限があり、一定のI/Oクレジットが消費されるため、バースト可能な時間には限りがあります。

3. **用途**：
   - **Uncached Disk Burst IOPS**は、大量のデータを短時間で処理する必要があるが、通常のI/O要求がそれほど高くないワークロードに適しています。たとえば、データベースのスパイク、ログ処理、あるいはバックアップ操作などで効果的です。
   - クラウド環境では、バースト性能を利用することで、短期間に高負荷がかかる作業でも、コストを抑えながら効率的に処理することが可能です。

4. **持続時間**：
   - バーストは一時的なため、長時間にわたって高いI/Oパフォーマンスを必要とする場合には、通常のスループットやIOPS性能に戻るため、事前に計画が必要です。

### まとめ：
Uncached Disk Burst IOPSは、キャッシュを使わないストレージ環境で、通常時のI/Oパフォーマンスを一時的に超える性能を提供する重要な指標です。これは特に、急にI/O負荷が増大する場合に活用され、コスト効率を考慮したストレージソリューションの設計に役立ちます。
Uncached Disk Speed (MBps)メモ

**Uncached Disk Speed (MBps)** とは、ディスクアクセス時にキャッシュを使用せずに直接ディスクから読み書きする際の速度を示す指標です。これは、キャッシュを利用せずにデータの読み取りや書き込みが行われる場合のストレージのパフォーマンスを測定したものです。単位の**MBps**は「メガバイト毎秒」を意味し、1秒間に処理できるデータ量を示します。

### 具体的な特徴：
1. **キャッシュなしのディスク速度**: 
   - キャッシュを使用しないことで、ディスクの生のパフォーマンスが反映されます。キャッシュがある場合、頻繁にアクセスされるデータがメモリに保持され、アクセス速度が向上しますが、キャッシュを使わない場合は、すべてのデータが直接ディスクに書き込まれるか、読み込まれます。

2. **用途**: 
   - 大きなファイルの読み書き、データベース操作、大規模データ処理などで、キャッシュに収まりきらないデータが頻繁に扱われる場合のパフォーマンスを表します。特に、仮想マシンやクラウド環境でのストレージパフォーマンスの指標として重要です。

3. **HDD vs. SSD**:
   - ハードディスクドライブ（HDD）の場合、キャッシュがないとディスクの物理的な回転に依存するため、速度は遅くなります。一方、ソリッドステートドライブ（SSD）はキャッシュを使用しない場合でも比較的高速です。

### 重要性：
Uncached Disk Speedは、システムやアプリケーションが頻繁に新しいデータにアクセスするシナリオで非常に重要です。特に、仮想環境やクラウドサービスでは、この指標を把握しておくことで、データアクセスのパフォーマンスやストレージに対する負荷を最適化できます。
Disk IOPSメモ

Disk IOPS（Input/Output Operations Per Second）は、ディスク（ハードディスクドライブやSSDなど）のストレージパフォーマンスを示す指標で、1秒間に処理できる入出力操作の回数を表します。IOPSは、ストレージデバイスの速度や効率を評価するために使用され、主に以下のような操作に関連します：

1. **読み取り操作（Read Operations）**: ディスクからデータを読み取る回数。
2. **書き込み操作（Write Operations）**: ディスクにデータを書き込む回数。

### IOPSに影響を与える要因
- **ディスクの種類**: SSDはHDDよりもはるかに高いIOPSを提供します。
- **ディスクの回転速度（HDDの場合）**: RPM（回転数）が高いほど、IOPSも高くなる傾向があります。
- **アクセスパターン**: ランダムアクセスとシーケンシャルアクセスでIOPSは異なり、ランダムアクセスの方が通常、IOPSが低くなります。
- **ブロックサイズ**: 入出力操作で使用されるデータのサイズが小さいほど、IOPSが高くなることがありますが、逆にブロックサイズが大きいと、1回の操作で多くのデータを処理できるため、操作回数が減少します。

### IOPSの重要性
IOPSは、アプリケーションやシステムのパフォーマンスに大きな影響を与えるため、特にデータベース、仮想マシン、クラウドストレージなど、ストレージが重要な役割を果たすシステムで重要な指標となります。高いIOPSを持つディスクは、より多くのリクエストを同時に処理できるため、パフォーマンスの向上が期待できます。
いまさらだけど UIScene についてちゃんと理解する

「UIScene（シーン）」は、iOS 13 以降で導入された マルチシーン機能に関連する概念です。これにより、アプリは複数の「シーン」を持つことができ、1つのアプリに対して複数のウィンドウや画面を同時に表示することが可能になりました。この機能は、特に iPad の マルチタスキングや 複数ウィンドウのサポートを意識して設計されています。

# シーンとは何か？
シーンは、アプリケーションのUIの単位を表します。従来、1つのアプリは1つの画面を持ち、アプリ全体を管理するライフサイクルイベント（フォアグラウンド・バックグラウンドなど）がありましたが、シーンごとに独立したライフサイクルを持つことで、アプリのマルチタスクやマルチウィンドウを可能にします。

# 主な特徴
1. マルチウィンドウ:
    - iPad の場合、ユーザーは同じアプリを複数のウィンドウ（シーン）として開くことができます。例えば、Safari アプリで複数のタブを分割して、それぞれのウィンドウで表示したり、ドキュメントアプリで2つの異なるファイルを並べて表示したりします。
2. シーンごとのライフサイクル:
    - それぞれのシーンには、独立したライフサイクルが存在し、シーンごとにアクティブ、非アクティブ、フォアグラウンド、バックグラウンドといった状態が管理されます。アプリ全体とは別に、特定のシーンがアクティブかどうかを管理できます。
3. iOS 13 以降:
    - この機能は、iOS 13 以降で導入されました。iPad のマルチタスキング機能と密接に関連しており、ユーザーは1つのアプリを複数のウィンドウとして表示できます。
iPhone では通常、1つのアプリに対して1つのシーンのみを持つことが多いですが、iPad では複数のシーンが積極的に活用されます。

# シーンのライフサイクル
シーンには独自のライフサイクルがあります。各シーンが作成されたり、アクティブになったり、破棄されたりするタイミングで特定のメソッドや通知が呼び出されます。

### 代表的なシーンのライフサイクルメソッド（`SceneDelegate`）
- `scene(_:willConnectTo:options:):`
    - シーンが作成され、アプリのUIを表示する準備ができたときに呼ばれるメソッドです。通常、ここでウィンドウの設定を行います。
- `sceneDidBecomeActive(_:):`
    - シーンがアクティブになり、ユーザーがシーンと対話できるようになったときに呼ばれます。
- `sceneWillResignActive(_:):`
    - シーンがアクティブでなくなるときに呼ばれるメソッドです。ユーザーが別のシーンに移動する、またはシーンがバックグラウンドに移行する前に呼ばれます。
- `sceneDidEnterBackground(_:):`
    - シーンがバックグラウンドに入ったときに呼ばれます。ここでは、状態の保存などを行います。

# シーンの例
例えば、iPad の場合、ユーザーが同じアプリを 2つのウィンドウ で開いているとします。例えば、メモアプリで2つの異なるノートを別々のウィンドウに表示している状況です。

- シーンA: ノート1が開いている。
- シーンB: ノート2が開いている。

ユーザーはこれらのシーンをスワイプで切り替えたり、同時に表示したりできます。それぞれのシーンは独立しており、シーンAがアクティブになっているときにシーンBは非アクティブになるなど、それぞれの状態が個別に管理されます。

# シーンの導入の目的
- マルチウィンドウサポート: iPadでは、同じアプリの異なるインスタンスを並べて操作したいというニーズがあるため、シーンの概念が導入されました。
- より細かいライフサイクル管理: シーンごとに独立したライフサイクルを持つことで、アプリが複数のウィンドウを持つ場合にも効率的に管理できるようになっています。

# シーンを使わないアプリ
**iPhone向けのシングルウィンドウアプリ**では、ほとんどの場合、1つのシーンしかありません。そのため、シーンのライフサイクルを意識することは少ないです。しかし、iPadや将来の拡張性を考えると、シーンベースの設計を理解しておくことが重要です。

# まとめ
- シーンは、1つのアプリ内で複数のウィンドウを持つことを可能にし、各ウィンドウが独立したライフサイクルを持つ機能です。
- iPad でのマルチウィンドウサポートのために重要な機能で、アプリの状態をより細かく管理できます。
- シーンごとに ライフサイクルのイベント（アクティブ、非アクティブ、バックグラウンドなど）が発生し、それに応じてアプリの状態を管理します。

iPhoneアプリではあまり意識されないかもしれませんが、iPadなどでマルチウィンドウ対応が必要なアプリを開発する際には、この機能を利用する必要があります。
【Unity】自作パッケージでフォルダ内のアセットを参照する


## 概要

自作パッケージを UPM で管理しており、パッケージ内で Texture などのアセットをパス指定で取得していた．しかし、パッケージが<b>開発時は Assets フォルダ内</b>、<b>配布時は Packages フォルダ内</b>に配置されるため、アセットの読み込みに失敗していた．

そのため「パッケージディレクトリ」へのパスを管理するクラスを作成し、アセットの参照を相対パスに基づいて行うようにした．

## 実装コード

#### パス管理用のクラス

```PackageDirectoryPath.cs
using System.IO;
using UnityEngine;

namespace nitou {

    [System.Serializable]
    public sealed class PackageDirectoryPath {

        public enum Mode {
            // 配布後
            Upm,
            // 開発プロジェクト内
            Normal,
            //
            NotExist,
        }

        // 相対パス
        private readonly string _upmRelativePath;
        private readonly string _normalRelativePath;

        private Mode _mode;

        /// <summary>
        /// Package配布後のパッケージパス
        /// </summary>
        public string UpmPath => $"Packages/{_upmRelativePath}";

        /// <summary>
        /// 開発プロジェクトでのアセットパス
        /// </summary>
        public string NormalPath => $"Assets/{_normalRelativePath}";


        /// ----------------------------------------------------------------------------
        // Pubic Method

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public PackageDirectoryPath(string relativePath = "com.nitou.mylib") {
            _upmRelativePath = relativePath;
            _normalRelativePath = relativePath;

            // 判定する
            _mode = CheckDirectoryLocation();
        }

        /// <summary>
        /// コンストラクタ (※開発時にAssets直下にない場合)
        /// </summary>
        public PackageDirectoryPath(
            string upmRelativePath = "com.nitou.mylib",
            string normalRelativePath = "Plugins/com.nitou.mylib") {
            _upmRelativePath = upmRelativePath;
            _normalRelativePath = normalRelativePath;

            // 判定する
            _mode = CheckDirectoryLocation();
        }

        /// <summary>
        /// Projectディレクトリを起点としたパス
        /// </summary>
        public string ToProjectPath() {
            return _mode switch {
                Mode.Upm => UpmPath,
                Mode.Normal => NormalPath,
                _ => ""
            };
        }

        /// <summary>
        /// 絶対パス
        /// </summary>
        public string ToAbsolutePath() => Path.GetFullPath(ToProjectPath());


        /// ----------------------------------------------------------------------------
        // Private Method

        /// <summary>
        /// ディレクトリの位置を判定する
        /// </summary>
        private Mode CheckDirectoryLocation() {

            if (Directory.Exists(UpmPath)) return Mode.Upm;
            if (Directory.Exists(NormalPath)) return Mode.Normal;

            Debug.LogError($"Directory not found in both UPM and normal paths: \n" +
                    $"  [{UpmPath}] and \n" +
                    $"  [{NormalPath}]");
            return Mode.NotExist;
        }
    }
}
```
Excel VBAを使用して指定された名前とサフィックスを持つシートを一括作成する方法

Excelでは、特定の命名規則に従って複数のシートを一括作成する必要がある場合があります（例えば、筆者が現在テスト用のエビデンススクリーンショットを作成している際に、事前に指定された名称と数のシートを準備する必要がある状況）。VBA（Visual Basic for Applications）を使用することで、このような作業を簡単に実現できます。本記事では、そのためのVBAコードの作成方法について詳しく説明します。

## 目的

指定した名前とシート数を入力することで、指定された数のシートを作成し、各シートの名前は `名前_番号_OK` の形式で命名されます。例えば：`CD0101_001_OK`、`CD0101_002_OK` などです。

## 実装手順

### 1. Excelを開き、VBAエディターに移動する

まず、操作したいExcelファイルを開いてください。その後、ショートカットキー `Alt + F11` を押して、VBAエディターを開きます。

### 2. 標準モジュールを挿入する

VBAエディター内で、以下の手順で標準モジュールを挿入します：

- 左側の **Project Explorer** ウィンドウで、 `VBAProject (あなたのExcelファイル名)` を見つけます。
- `VBAProject` を右クリックし、 `Insert (挿入)` を選択して、次に `Module (モジュール)` をクリックします。
- すると、右側に空白の編集エリアが表示され、これで新しい標準モジュールが挿入されたことを示しています。

##### ※VBAエディターでモジュールを挿入する際に、```Class Module``` と ```Module``` という選択肢が表示された場合は、 **```Module```** を選択してください。

###### 違い：

- **Module（標準モジュール）**：通常のマクロコード（シート作成機能など）を格納するためのもので、最も一般的なタイプです。
- **Class Module（クラスモジュール）**：カスタムオブジェクトやクラスを作成するためのもので、より高度なプログラミングに使用されます。

今回のニーズ（複数のシートを作成する）では、 **標準モジュール** を使用すれば十分ですので、 **Module** を選択してください。

### 3. VBAコードを貼り付ける

挿入したモジュール内に、以下のVBAコードを貼り付けます：

```vba
Sub CreateSheets()
    Dim sheetName As String
    Dim sheetCount As Integer
    Dim i As Integer
    Dim newSheet As Worksheet

    ' 名前とシート数を入力
    sheetName = InputBox("名前を入力してください：")
    sheetCount = InputBox("作成するシート数を入力してください：")

    ' 指定された数のシートを作成するループ
    For i = 1 To sheetCount
        ' 新しいシートを作成
        Set newSheet = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        
        ' シート名を設定、形式は "名前_番号_OK"
        newSheet.Name = sheetName & "_" & Format(i, "000") & "_OK"
    Next i
End Sub
```

### 4. コードを実行する

コードを貼り付けた後、以下の手順でマクロを実行します：

- VBAエディターで、 `F5` キーを押すか、メニューの `Run (実行)` ボタンをクリックします。
- システムが入力ボックスを表示し、名前の入力を求めてきます。例えば、 `CD0101` と入力します。
- 次に、作成するシートの数を入力するための入力ボックスが表示されます。例として、 `5` と入力します。

完了後、Excelは自動的に5つの新しいシートを作成し、それぞれの名前は次のようになります：

- `CD0101_001_OK`
- `CD0101_002_OK`
- `CD0101_003_OK`
- `CD0101_004_OK`
- `CD0101_005_OK`

### 5. 注意点

- **シート名の重複**：Excelに同じ名前のシートが既に存在する場合、エラーメッセージが表示されます。シート名が一意であることを確認してください。
- **マクロの実行をキャンセル**：入力中に操作をキャンセルしたい場合は、入力ボックスの「キャンセル」ボタンをクリックしてください。

## まとめ

簡単なVBAコードを使用することで、特定の名前付きシートを一括作成する操作が簡単に行えます。この手法は作業効率の向上に役立つでしょう。この記事があなたのお役に立てば幸いです！
初めてのＭＲ開発（構想編）

# 音をオノマトペで可視化するアプリの構想

最近、MR（Mixed Reality）技術に触れることがあり、ディスプレイを空中に表示したり、何かを現実に持ち込むことが便利だな〜と感じました。これを利用して、「日常の音をオノマトペで視覚化することで、音の世界を聴覚障害者が体感できるのでは？」と思い立ち、日常の音をオノマトペで可視化し、音を感じさせるアプリを作ることにしました。

## 実装したいこと

- **日常の音を可視化**（オノマトペ）
  - 音の発生源に合わせて表示（漫画のようなイメージ）
  - 雨、風、車、風鈴、会話

## 必要なこと

1. **音の発生源を特定**
2. **音の種類を分別**
3. **音に対応したオノマトペを表示**

## 実装案（軽く）

- 複数のマイクから得た音量データを利用し、音の発生源を特定。
  - 二点のマイクの音量差を使って、グラフの座標のように音の位置を計算。
![IMG_1922.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749029/a124fd64-c77e-63a9-ec07-43927fd61198.jpeg)
  - これを三次元で行えば、音の発生源を特定できるのではないか？
![IMG_1924.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749029/f69b640c-b792-2697-7589-809e114f1c3d.jpeg)

- 特定した音の発生源に対応するオノマトペを表示させる。

## 問題点

1. **マイクの数が多い**
   - 人の頭を球体として全方位の音に対応するためには、6つのマイクが必要。
   - しかし、これはスマートな装着方法ではない。

2. **複数の音源を同時に特定できない**
   - この方法では、一つの音しか特定できない可能性がある。

3. **オノマトペの種類が膨大**
   - 全ての音に対応するオノマトペを準備するには、莫大な時間がかかる。

4. **視覚への負担**
   - 聴覚障害者の視界をオノマトペで埋めてしまうことで、かえって視覚を狭めてしまわないかという懸念がある。

## 今後の展望

- マイクのみで音の発生源を特定するのではなく、映像と組み合わせて特定する方法が良いかもしれない。

### 例

1. 周囲から車の音がする。
2. 視線カメラの映像から車を探す。
3. 画面に車が映っていれば、そこにオノマトペを表示。

とにかく手を動かそう　終わり
IBM i のIFS とは何ですか？（IBM i のファイルシステム）

これも初心者からよく聞かれるお題なので。

## AS/400とIBM i のファイルシステム構造のちがい

全体図は下記になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3ae0eb25-ee91-f90f-5094-6ca3bd3beee7.png)

## AS/400時代（IFS実装以前）のファイルシステム

AS/400時代は下記の3つのファイルシステムがあり、それぞれ独立したファイルシステムでアクセスできる手法・クライアントも特定されていました。

### AS/400時代のライブラリー・ファイルシステム

当時はファイルシステム、とは呼ばず単にライブラリーと呼んでいましたが便宜上このように表記しました。
格納される（作成可能な）オブジェクトは現代のIBM i と共通です。（オブジェクトの種類や稼働するS/W等は増えましたが）RPG,COBOL,etc. Db2 for i, IBM i OSの必須オブジェクト類（ユーザープロフィール、各種の実行・運用管理系オブジェクト、セキュリティオブジェクト、ほか）です。

これらは5250端末やリモートシステムからのプログラムコールなどでアクセスが可能です。（これも現代のIBM i と同じ、ただし現代IBM i はアクセスメソッドが現在の標準に合わせて相当増えています（REST,etcなどです）

### AS/400時代の文書ファイルシステム DLS
DLSはAS/400時代にライブラリー（DB2/400）のような固定長メインのRDB形式でなく可変長のストリームファイル形式のファイルを扱うためのファイルシステムでした。現在のIBM i ではIFSの/QDLSライブラリー配下に統合されアクセス可能になっていますが、AS/400時代にはWRKFLRコマンドなどDLOファイルシステムを操作する専用コマンドから操作するものでした。

**DLSの操作　WRKFLRコマンドの例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/2bee121b-a1d6-f916-7c10-1d35161a059c.png)

### AS/400時代のPCサポート 共用フォルダー

PCサポートは現在のIBM i Access、ACS等のご先祖様に位置づけられるS/W名称です。PCサポートはPCクライアントとのファイル転送、オーガナイザー機能によりCLPからPCコマンド実行など当時必要とされるクライアントとの連携機能を提供していました。PCサポートはDOS, WINDOWS, OS/2等の当時のクライアントOS毎に提供されていました。

## IBM i 時代のファイルシステム（統合ファイルシステム IFS）

IBM i時代になりAS/400では3つに分離していたファイルシステムを単一のファイルシステムとして操作したい、というニーズが生まれ、ルートディレクトリー '/'（ルート）を作成し、その配下にそれぞれのファイルシステムをサブフォルダーとして統合しています。また、上図にあるように新しい属性を持つファイルシステムも追加されています。

### IFS : Integrated File System には二種類の意味があります。

**狭義のIFS : ライブラリーファイルシステム以外のファイルシステム**

ライブラリー以外のファイルシステムを狭義の意味でIFSと呼ぶことがあります。

**広義のIFS ： ライブラリーシステムも含むすべてのファイルシステム**

ライブラリーファイルシステムを含むIBM i が管理するすべてのファイルシステムを広義のIFSと呼びます。

上記２つ（狭義・広義）は文脈で使い分けされることが多いので、慣れないとちょっとわかり難いかもしれません。

## 狭義のIFSはCIFS(SMB), SAMBA, NFS などでファイル共有が可能

たとえば、IBM i 上の /home/GOMA というフォルダーを　CIFSでWINDOWSクライアントのネットワークドライブにマウントしたりできます。
Go言語(Golang)のRestAPIの基本(CRUD操作、認証)

### 基本構造

1. **プロジェクトのセットアップ**
   - Goモジュールの初期化
     ```bash
     go mod init example.com/myapi
     ```

### メインファイルの作成

以下は、標準ライブラリのみを使った簡単なCRUD操作を含むRestAPIの例です。

```go
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "strconv"
    "strings"
)

type Item struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

var items []Item

func main() {
    http.HandleFunc("/items", itemsHandler)
    http.HandleFunc("/items/", itemHandler)

    fmt.Println("Server listening on port 8000")
    http.ListenAndServe(":8000", nil)
}

func itemsHandler(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    case "GET":
        json.NewEncoder(w).Encode(items)
    case "POST":
        var item Item
        _ = json.NewDecoder(r.Body).Decode(&item)
        item.ID = len(items) + 1
        items = append(items, item)
        json.NewEncoder(w).Encode(item)
    default:
        http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
    }
}

func itemHandler(w http.ResponseWriter, r *http.Request) {
    idStr := strings.TrimPrefix(r.URL.Path, "/items/")
    id, err := strconv.Atoi(idStr)
    if err != nil {
        http.NotFound(w, r)
        return
    }

    switch r.Method {
    case "GET":
        for _, item := range items {
            if item.ID == id {
                json.NewEncoder(w).Encode(item)
                return
            }
        }
        http.NotFound(w, r)
    case "PUT":
        for i, item := range items {
            if item.ID == id {
                var newItem Item
                _ = json.NewDecoder(r.Body).Decode(&newItem)
                newItem.ID = id
                items[i] = newItem
                json.NewEncoder(w).Encode(newItem)
                return
            }
        }
        http.NotFound(w, r)
    case "DELETE":
        for i, item := range items {
            if item.ID == id {
                items = append(items[:i], items[i+1:]...)
                break
            }
        }
        json.NewEncoder(w).Encode(items)
    default:
        http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
    }
}
```

### 認証の追加

認証を追加するには、JWTを利用するのが一般的です。以下に簡単な例を示します。

1. **JWTライブラリのインストール**
   ```bash
   go get -u github.com/golang-jwt/jwt/v4
   ```

2. **JWT認証の実装**

```go
import (
    "github.com/golang-jwt/jwt/v4"
    // その他のインポート
)

var jwtKey = []byte("my_secret_key")

type Claims struct {
    Username string `json:"username"`
    jwt.RegisteredClaims
}

func JwtVerify(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        tokenString := r.Header.Get("Authorization")
        claims := &Claims{}

        token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
            return jwtKey, nil
        })

        if err != nil || !token.Valid {
            w.WriteHeader(http.StatusUnauthorized)
            return
        }

        next.ServeHTTP(w, r)
    }
}

// ルートの使用例
// http.HandleFunc("/items", JwtVerify(itemsHandler))
```
rex0220 計算式プラグイン ボタンクリックでテーブル内項目をクリア

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)のボタンクリックでテーブル内項目をクリアします。

# 概要

計算式プラグインでスペース項目に計算式を指定してボタン表示。
ボタンクリックでテーブル内項目の数値T1をクリアします。
※区分T1 が "A" の場合、数値T1をクリア

![2024-09-17_11h28_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/bf2ea854-b94c-d4a8-9a33-26b4564137df.png)

# 操作例

![2024-09-17_11h31_48.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e0d42cdf-f6b7-9c62-4775-c6fae5692e39.gif)

# アプリ設定

スペース項目と数値項目を追加します。

- スペース項目を配置し、要素ID「SP1」を設定
- 制御用に数値項目「制御1」を配置

![2024-09-17_11h33_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/92666bef-b1c7-9821-816f-0900eddcc42a.png)

# 計算式プラグイン設定

「制御1」を使って、ボタンクリックで「数値T1」がクリアされるように連携します。
計算処理がテーブル外項目・テーブル内項目・テーブル外項目という順番で行われるため、
それを利用してクリア処理を実行します。

「循環参照を許可」をチェックします。

- ボタンクリックで「制御1」に 1 をセット
- 制御1: 「制御1」が 1 なら 2, 2 ならクリア
    - 「制御1」が 2 の時に、テーブル内項目の計算処理が行われる
- テーブル内「数値T1」: 「区分T1」が"A"かつ「制御1」ありの場合、クリア


![2024-09-17_11h36_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/4843217f-88f3-664f-957c-0c2eef35f53b.png)

```.js
OPTION: 循環参照を許可

// SP1:(SP1) SPACER
DIALOG(ARRAY("数値T1クリア","区分Aの数値T1をクリアします"), 
　FSET(制御1,1),
)

// 制御1 NUMBER (hide)
SWITCH(制御1,
  1,2,
  2,"",
  ""
)

// テーブル.数値T1 NUMBER (editable)
IF(AND(区分T1="A",制御1),"",数値T1)
```
PHPでSQL文を書いて実行するとなんかエラーが出ていた話

## はじめに
前にPHPでSQL文を変数に代入して実行しようとしていると、SQL文はあっているはずなのになぜか```HTTP ERROR 500```が返ってきていました。

##### 原因のコード
```php:PHP
 $sql = "INSERT INTO sample_table (id,name,age,birthday) VALUES ({$_POST['id']},"{$_POST['name']}",{$_POST['age']},"{$_POST['birthday']}")";
 ```

## 原因
 原因はおそらく、```"{$_POST['name']}"```のダブルクォーテーションがあることで、この時点で変数の値が終了しているという判定になったからだと考えられます。

 ## 解決方法
 ```"{$_POST['name']}"```や、```"{$_POST['birthday']}"```のダブルクォーテーションをシングルクォーテーションに置き換えることで解決しました。

 ```PHP:PHP
 $sql = "INSERT INTO sample_table (id,name,age,birthday) VALUES ({$_POST['id']},'{$_POST['name']}',{$_POST['age']},'{$_POST['birthday']}')";
 ```

 ## まとめ
 この作業をしているとき、私はVIエディタで編集をしていたので初歩的なミスかもしれませんが、気づくのが遅れました。VSCodeなどの高度なエディタだと赤文字で知らせてくれるかもしれないので、VSCodeなどを使うようにすることでもエラーを減らせるかもしれないです。

 ## おまけ
 このエラーについて調べていると、シングルクォーテーションとダブルクォーテーションで意味合いが少し異なるらしいのでまとめます。
 ```' '```だとくくってある文字はすべて文字列として認識されるので変数があってもそれは文字列として認識されます。
 対して```" "```だと文字列の中に変数があるとそれは変数内の値が認識されます。
 つまり、変数を扱いたい場合は```" "```でくくらないといけないらしいですね。
 いままであまり考えずにしていたので勉強になりました。

 ## 追記
 このコードを書いているときはSQLインジェクションなどのセキュリティについては一切考えていないので[ブレースホルダー](https://qiita.com/conkon326/items/83a0a8fe0a4d840ec562)を使用するなどの対策をするようにしましょう。
 

[参考資料](https://qiita.com/pyon141/items/4ac74182f5aca0855246)
paizaラーニング問題集「【階段の上り方】階段の上り方3」を解いてみた

https://paiza.jp/works/mondai/dp_primer/dp_primer_stairs_boss

▼感想：

n=5, a=2, b=3, c=何でもよい　とします。
cの値によらず、
5段の階段を上る方法は少なくとも1通り以上存在すると思います。
1歩目で2段(a)、2歩目で3段(b)行けば、5段になるからです。

しかし、どうも違うようです。dp[5]は0です。
dpの値を書き出したところ、そうなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881331/45ea6c1d-7336-20d5-5e86-31152d147b66.png)

題意を誤解しているかもしれません。
そもそも、まだDPのことを理解できていないのかもしれません。
もう少し考えてみたいと思います。

▼コード：
```py
########## 処理0(準備) インプット,リスト定義など ###########

n,a,b,c = map(int,input().split())

########## 処理1 漸化式の定義、計算、出力 ##########

dp = [0]*(30+1)

dp[0] = 1

for i in range(1,n+1):
    
    if i >= a:
        dp[i] += dp[i-a]

    if i >= b:
        dp[i] += dp[i-b]

    if i >= c:
        dp[i] += dp[i-c]

print(dp[n])
```
AWS Backupを使用してEC2インスタンスをリストアする際の権限不足エラーとその解決方法

### AWS Backupを使用してEC2インスタンスをリストアする際のエラー

AWS Backupを使用してEC2インスタンスをリストアする際に、次のようなエラーが発生することがあります。

```
You are not authorized to perform this operation. Please consult the
permissions associated with your AWS Backup role(s), and refer to the 
AWS Backup documentation for more details. xxxxxxxxxxxxxxxxxx~
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877509/5d9618a4-2405-ce80-9b4a-34098f65872d.png)
この記事では、このエラーの原因と解決方法について説明します。

### 原因

バックアップの復元時にAWS Backupが使用するIAMロールに必要な権限が不足しているため、このエラーが発生します。

#### AWS Backupの復元時に選択できるIAMロール

バックアップを復元する際、以下のオプションから選択できます。
- **IAM ロールなしで続行**：復元されたインスタンスにIAMロールが自動でアタッチされません。そのため、復元後に手動でIAMロールをアタッチする必要があります。
- **元の IAM ロールで復元**：バックアップ元のインスタンスに紐付けられていたIAMロールが、自動的に復元されたインスタンスにアタッチされます。

#### 権限不足エラーの詳細

AWS BackupからEC2をリストアする際、「元の IAM ロールで復元」を選択した場合、AWS Backupが使用するIAMロールに`iam:PassRole`権限が必要です。この権限がない場合、上記のエラーが発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877509/ea2b69a6-c418-7616-cde0-d2c58edd2c67.png)

#### iam:PassRole とは

**iam:PassRole**は、AWSリソースにIAMロールをアタッチするための権限です。これにより、ユーザーやサービスなどのアイデンティティが、別のアイデンティティにロールを渡し、そのロールの権限で操作を実行できます。AWSサービスはデフォルトでこの権限を持っていないため、`iam:PassRole`エラーが発生しやすいです。
例えば、以下のユースケースでは`iam:PassRole`権限の付与が必要となります。

1. (EFSを利用できるIAMロールが関連付いている)EC2をAWS Backupから復元する。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877509/14c2eb75-6036-1c53-d769-4bf0d3bb0246.png)

2. (SNSを利用できるIAMロールが関連付いている)EC2をCloudFormationテンプレートで作成する。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877509/f05d6f04-1426-0883-627d-290206237baa.png)


3. 特定のイベントが発生した時に(Dynamo DBを利用できるIAMロールが関連付いている)EC2をLambda関数で作成する。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877509/84a556b3-69bc-65b7-bf2a-408caf01345e.png)


一方、ユーザーは通常多くのデフォルト権限を持っているため、`iam:PassRole`エラーはまれです。しかし、最小権限の原則を厳守する際には、ユーザーにも明示的に`iam:PassRole`権限を付与しないと、リソースにロールをアタッチする操作ができなくなります。
例えば、IAMユーザーがEC2インスタンスを作成する際、CloudWatchを利用できるIAMロールをEC2に関連付ける。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877509/ae5fd3c5-fe4a-ed6e-7204-ae7d8e61b8de.png)

##### **`iam:PassRole` を利用する際の注意点**

- `iam:PassRole` は強力な権限であるため、誤った設定によりセキュリティリスクが生じる可能性があります。
- 最小限の権限付与を心掛け、必要な操作だけを許可することが重要です。

### 解決方法
AWS Backupが使用するIAMロールに`iam:PassRole`権限を追加することで、このエラーは解消されます。バックアップ元のEC2インスタンスに関連付けられたIAMロールに対してのみ`iam:PassRole`を許可することで、最小権限の原則を守りつつ安全なリストアを行うことができます。

#### ポリシー例
```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::account-id:role/specific-role",  # バックアップ元EC2インスタンスのIAMロールのARN
      "Effect": "Allow"
    }
  ]
}
```

### 結論
AWS Backupを利用してEC2インスタンスのリストア時に発生する`iam:PassRole`権限不足エラーの原因と解決方法について説明しました。最小権限の原則を守りながら、安全なリストアプロセスを確保しましょう。
Github - mainなどのブランチへの強制 pushを禁止する設定 ( 組織のレポジトリ > 保護ルール ) 

# Githubでの設定


レポジトリのSettings -> Branches からルールを追加する

<img width="1262" alt="image" src="https://github.com/user-attachments/assets/c8249323-c546-4fed-84a5-2332e62c5f1c">

これだけで git での強制pushを禁止できるようだ

## git のエラー例

```sh
$ git push --force-with-lease
```

```
 ! [remote rejected]     some-branch -> some-branch (protected branch hook declined)
error: failed to push some refs to 'https://github.com/xxx/yyy.git'
```

# コミットを積んでのpushは禁止できるのか？

保護ブランチに対して、強制pushではなく、コミットを積んでのpushは禁止できるのか？

試したところ、

- `Require status checks to pass before merging`
- `Lock Branch` 

を有効にしても、git push の時に WARNING 的なメッセージが表示されるだけで、Github にはしっかりとコミットが反映されてしまうようだった

## git操作の例

```sh
git push
```

```
...
remote: Bypassed rule violations for refs/heads/some-branch:
remote:
remote: - Cannot change this locked branch
remote:
...
```


( 2024/09/17 現在 )



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
ChromeDriver がなにもしてないのにぶっ壊れたとき

昨日までできていたChromeDriver ダウンロードはwebmanager で自動的に適切なものを持ってくるようなコード

``` python
        driver = webdriver.Chrome(ChromeDriverManager().install())
```

# 発生したエラー

``` bash
OSError: [Errno 8] Exec format error: 
'/Users/xxx/.wdm/drivers/chromedriver/mac64/128.0.6613.137/chromedriver-mac-arm64/THIRD_PARTY_NOTICES.chromedriver'
```

# 原因と対応

webdriver-manager のキャッシュに問題がある可能性があるため、
キャッシュをクリアして再度 chromedriver をダウンロードさせる

```bash
rm -rf ~/.wdm/drivers
```

で動いた
プロキシにブロックされて、OADからOracle DBに接続できない

# はじめに
Oracle DatabaseにOAD（**Oracle Analytics Desktop**）から接続する際に、プロシキを経由する必要があり、色々調べたので紹介します。

:::note
以下は、「やってみたらできた」というものであり、あくまで個人の見解です。
:::

使用したOADのバージョンは、July 2024 Updateでした。
「情報」メニューをクリックして、「Oralce Analytics」のあたりにマウスポインタをもっていくとバージョンが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/71c43b96-ea2e-5b32-41bd-f2ead396312a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/6d48f20c-3f51-1114-3492-b72cf0dc54f5.png)

# プロキシ経由でのOracle DBへの接続
ネットワーク的に、www-proxy.example.comというプロキシサーバーを経由しないと、利用したいOracle Databaseに接続できないようになっています。という想定です。

OADから接続したいのですが、プロキシサーバーを指定するような設定箇所はありません。

## OADで接続を作成
まずは「作成」から「接続」をクリックして作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/dfb977ba-daae-b341-6e91-87de21dbb217.png)

接続タイプは「Oracle Database」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/29334ffb-88c4-f87a-6b98-31abc4f4c10a.png)

接続タイプを「拡張」にして、接続文字列を記入します。
これは、tnsnames.oraの記載を参考にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/718f769c-96be-6c5d-96c3-9b201401c576.png)

```js:設定例
(description= (retry_count=20)(retry_delay=3)(address=(https_proxy=www-proxy.example.com)(https_proxy_port=80)(protocol=tcp)(port=1521)(host=xxx.xxx.xxx.xxx))(connect_data=(service_name=pdb1)))
```

https_proxyでプロキシサーバーを指定し、https_proxy_portでポートを指定します。

## データセットを作成
接続が作成できたので、その接続を使用してデータセットを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/c784639a-0307-5802-03fd-c4e251791b3d.png)

特に問題なさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/211520ad-aaf0-2c71-33fe-b8ea3a5c98b6.png)

## 検索実行
検索も問題なく実行できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/5233c2d0-29de-1dd9-0675-6c9299ad7cb4.png)

# 参考情報
- [tnsnames.oraファイル内のローカル・ネーミング・パラメータ](https://docs.oracle.com/cd/F19136_01/netrf/local-naming-parameters-in-tns-ora-file.html#GUID-C672E92D-CE32-4759-9931-92D7960850F7)

- My Oracle Supportにアクセスできる方は、こちらにも情報があります。
https://support.oracle.com/knowledge/Oracle%20Database%20Products/2559592_1.html
Software Freedom Day 2024

## はじめに
Software Freedom Dayまで一週間を切ったのに、日本からの[イベント登録](https://digitalfreedoms.org/en/sfd/events?view=map)が1件しかないので投稿させていただきます。

![スクリーンショット_17-9-2024_9189_digitalfreedoms.org.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101528/d6bceab3-c4c0-9f99-6f71-5791565661fc.jpeg)

情報系でフリー/オープン関連のイベントとしては、3月上旬頃にある[Open Data Day (ODD)](https://opendataday.org/ja/)が有名ですが、2024年9月21日(土)にも、<b>Software Freedom Day 2024</b>というイベントがあります。Software Freedom Dayとは、ソフトウェアの自由の日として、フリーソフトウェアおよびオープンソースに関する年1回の記念日で、世界各地でソフトウェアの自由について考えるイベントが各地で開催されます。これを機会に、Software Freedom Dayとは何かを紹介します。

## Software Freedom Dayとは
主催している<b>Digital Freedom Foundation (DFF)</b>によると、Software Freedom Day (SFD)は、フリーおよびオープンソースソフトウェア (FOSS)を世界規模で祝う日です。この祝いの目標は、教育、政府、家庭、ビジネスなど、あらゆる場所で高品質の FOSS を使用することの利点を、世界中の人々に知ってもらうことです。Digital Freedom Foundationでは、SFD を世界規模で調整し、サポートとコラボレーションの拠点を提供していますが、世界中のボランティアチームが、それぞれのコミュニティに影響を与えるために、ローカルのSFDイベントを企画しています。

Software Freedom Dayでは次のことが添えられています。
- [Digital Freedom Foundation](https://digitalfreedoms.org/en/digital-freedom-foundation)と SFDについて詳しくご覧ください
- Patrick Sinz による「[デジタルの自由のための次のステップ](https://digitalfreedoms.org/en/documentation/next-steps)」についてお読みください
- 元会長のPia Waugh による「ソフトウェアの自由があなたの人権をどのように支えているか」についてお読みください
- [フリーソフトウェア](https://www-fsf-org.translate.goog/?_x_tr_sl=auto&_x_tr_tl=ja&_x_tr_hl=ja)についてさらに詳しく調べてください

::: note info
Patrick Sinzによる「デジタルの自由のための次のステップ」と、元会長のPia Waugh による「ソフトウェアの自由があなたの人権をどのように支えているか」はリンクが切れていましたが、前者は見つかりましたので、貼り直しておきました。
:::

## フリーソフトウェアとは
フリー ソフトウェアとは、ユーザーに共有、学習、変更の自由を与えるソフトウェアです。ユーザーが自由であるため、これをフリー ソフトウェアと呼びます。フリー ソフトウェアを使用するということは、学ぶ権利を主張し、学んだことを他の人と共有するという政治的かつ倫理的な選択を行うことです。

DFFでは、フリーソフトウェアを理解するための[短い動画](https://framatube.org/w/ajDdjzVu37EeSxx3K7KBAJ?start=5s)も用意されています。字幕も各国語が用意されていますが、残念ながら日本語はありません。

https://framatube.org/w/ajDdjzVu37EeSxx3K7KBAJ?start=5s

フリーソフトウェアの詳細については、フリーソフトウェアファウンデーションが「[自由ソフトウェア](https://www.gnu.org/philosophy/free-sw.ja.html)」として定義しているので、こちらを参照してください。

## Software Freedom Dayに参加するには
Digital Freedom Foundationに[アカウントを作成](https://digitalfreedoms.org/en/log-in?view=registration)するか[ログイン](https://digitalfreedoms.org/en/log-in)して、自分のイベントを登録してください。

登録項目は以下のとおりですが、サイトが移動になったことから不具合もあって、途中で挫折したくなるかもしれまでが、最後に <b>Save(登録)</b> をクリックすれば、Software Freedom Day事務局が拾ってくれます（これがわかるまで何度か挫折しました）。すべて英語ですが、翻訳サービスを利用すれば大丈夫です。

Actual timezone: 自動的に日本時間
Title: 開催するイベントの名称
Calendar: Software Freedom Dayのまま
Start Date: 日本時間の開始時間
End Date: 日本時間の終了時間
Location lookup: 開催場所の住所
Locations: 実際にはMapの緯度経度に連携されるはずですができないので手入力しておきました
Map: 開催場所にピンを打てるはずなのですができないのでそのまま
Show End Time: 終了時間の表示なのでYes
All Day: 終日するならYesですが通常はNo
Description: 開催内容の詳細
Url: イベントの募集URL
Full Image: Choose a fileでアップロードした画像の選択（省略可能）
Alt Image Text: イメージの説明（省略可能）
Schedule: イベントの詳細なスケジュール（省略可能）
Choose a file: 画像ファイルのアップロード（省略可能）

## 早期登録のおまけ
いつもギリギリの登録だったのですが、今回は早めの登録をしたら以下のステッカーが送られてきました。来年は早く登録してみてください。

![スクリーンショット_17-9-2024_95613_.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101528/6531571f-155c-8d29-e894-fd90d5135e71.jpeg)
【フォント】明朝体、ゴシック体、セリフ、サンセリフ、サン？！どれが何問題！これで解消

# どれが何問題！

:::note warn
フォントを使っていて
**明朝体、ゴシック体、セリフ、サンセリフ、サン**
どれが何だったか混乱したことはありませんか？
:::

私は、その場では覚えたつもりでも、しばらく経つと忘れてしまっていて
「これはどっちだったかな？」と自信がなくて調べ直すことがよくありました。

しかし、ある人から覚え方のヒントを教わったらスーッと頭に入ったので、それを共有したいと思います。

※この記事は、HTML/CSS font-familyの総称フォント名に関連する話しです。

# 要約すると

明朝体、セリフが仲間
ゴシック体、サンセリフ、サンが仲間

- 筆っぽいのが「明朝」
- マジックペンっぽいのが「ゴシック」
- 「止め」などの端部の装飾のある部分を「セリフ」と言う
- セリフは「止め」など端部の装飾のあるフォント
- サンは、フランス語で「〜のない」「〜なしに」という意味
- サンセリフは「止め」など端部の装飾のないフォント
- ~~「止め」や「払い」の部分を「セリフ」と言う~~
- ~~セリフは「止め」や「払い」のあるフォント~~

これが理解できれば、もう大丈夫！！


【注意】「セリフ」について、日本語書体の場合、正しくは「ウロコ」ですが、グローバルではセリフと扱われています。


# 明朝体、セリフ、serif

サンプル

![スクリーンショット 2024-09-09 19.06.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261675/41494f31-0f38-6bf3-9d97-706030e62165.png)

:::note info
特長は、筆で書いたような「止め」など端部の装飾があるところ
:::

### 覚え方

筆と相性が良いのは、カタカナより漢字。

フォント名がカタカナの「ゴシック」より、
フォント名が漢字の「明朝」の方が筆と相性が良い、

と関連づけて **「筆は明朝」** と覚えましょう。

:::note info
筆は「明朝」
:::


# セリフとは？

![スクリーンショット 2024-09-11 9.48.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261675/5d87f44c-624e-80e3-1e7a-d8be82a621d7.png)

:::note info
筆で書いたような「止め」など端部の装飾のあるの部分、これを **「セリフ」** と言う
:::

これがあるフォントを セリフ、serif と呼びます。

＜注意＞「セリフ」について、日本語書体の場合、正しくは「ウロコ」ですが、グローバルではセリフと扱われています。


# ゴシック体、サンセリフ、sans-serif

サンプル

![スクリーンショット 2024-09-09 19.07.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261675/9535824e-bda2-f05e-fa59-6f69e32da275.png)

:::note info
特長は、「止め」など端部の装飾がなくて、のっぺりした感じ
筆じゃなく、まるでマジックペンで書いたかのよう
:::


### 覚え方

漢字よりカタカナの方がマジックペンに合ってる
と関連づけて **「マジックペン、カタカナのゴシック」** と覚えましょう。

:::note info
マジックペン、カタカナのゴシック
:::

そして、さっきのセリフの話しに戻ります。
先ほど、筆で書いたような「止め」など端部の装飾のある部分を **「セリフ」** と説明しましたが
こちらのフォントには、この **セリフがありません。**

サンは、フランス語で「〜のない」「〜なしに」という意味です。

:::note info
サンは、フランス語で「〜のない」という意味
:::

サンセリフ、sans-serif は、「セリフのない」「セリフなしに」という意味になります。
「止め」などの端部の装飾のない書体は、サンセリフと覚えましょう。

:::note info
サンセリフは「セリフのない」フォントのこと
:::


# サン

サンセリフを単にサンと呼ぶ場合があります。

### 例

Googleフォントに「Noto Sans Japanese」というのがあります。

Notoはシリーズの名称なので飛ばして、sansの方に注目します。
sans-serifのserifが省略されていますが、sansが「〜のない」と覚えていれば
「ない方のフォント」→「セリフのないフォント」と理解できるはずです。

## 最後に

理解できましたか？

最後の確認です。？の部分には何が入るでしょうか？

- 筆っぽいのが「？」
- マジックペンっぽいのが「？」
- 「止め」など端部の装飾のある部分を「？」と言う
- ？は「止め」など端部の装飾のあるフォント
- ？は、フランス語で「〜のない」「〜なしに」という意味
- ？は「止め」など端部の装飾のないフォント

※答えは冒頭の **「要約すると」** をご覧ください。

個人的な感覚の話しなので、みなさんが覚えるのに活かせるかどうかわかりませんが、ヒントになれば幸いです。

# 訂正
- 「払い」はセリフではないとのご指摘を受けて訂正
- 「セリフ」について、日本語書体の場合、正しくは「ウロコ」だが、グローバルではセリフと扱われている旨を追加
- HTML/CSS font-familyの総称フォント名に関連する記事である旨を追加
【Flutter入門】ユニットテストの基礎とパスワードバリデーションチェックの実践



## はじめに

この記事では、ユニットテストの基本と、具体例として新規登録時の**パスワードバリデーション**を題材にテストの実装を紹介します。

---

## 1. ユニットテストとは？

**ユニットテスト**は、関数やメソッドなどの小さな単位で機能が正しく動作しているかを確認するテストです。これにより、バグの早期発見や、リファクタリング後の動作確認が容易になります。

---

## 2. ユニットテストの準備

Flutterには、ユニットテストのためのパッケージが既に含まれています。`pubspec.yaml` で次の設定を確認してください。

```yaml
dev_dependencies:
  flutter_test:
    sdk: flutter
```

テストコードは `test/` ディレクトリに配置します。例えば、`test/validators_test.dart` などにファイルを作成します。

---

## 3. パスワードバリデーションのテストを実装

### 3.1 パスワードバリデーション関数

以下の条件を満たすパスワードを有効とする関数を作成します：

- 8文字以上
- 数字を含む
- 特殊文字を含む

```dart
// lib/validators.dart
bool validatePassword(String password) {
  if (password.length < 8) return false;
  if (!password.contains(RegExp(r'\d'))) return false;
  if (!password.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]'))) return false;
  return true;
}
```

### 3.2 パスワードバリデーションのユニットテスト

次に、この関数に対するテストを作成します。

```dart
// test/validators_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:my_app/validators.dart';

void main() {
  group('validatePassword', () {
    test('短すぎるパスワードは無効', () {
      expect(validatePassword('short1!'), false);
    });

    test('数字を含まないパスワードは無効', () {
      expect(validatePassword('Password!'), false);
    });

    test('特殊文字を含まないパスワードは無効', () {
      expect(validatePassword('Password123'), false);
    });

    test('すべての条件を満たすパスワードは有効', () {
      expect(validatePassword('Password123!'), true);
    });
  });
}
```

### 3.3 `expect` 関数の説明

**`expect`** 関数は、テストで**期待される結果**と**実際の結果**を比較するための関数です。

- **第1引数**: 実際の結果（関数の出力など）
- **第2引数**: 期待される結果（期待する値）

例えば、`expect(validatePassword('Password123!'), true)` は、`validatePassword('Password123!')` の結果が `true` であることを確認します。

---

## 4. テストの実行方法

### 4.1 テストの実行コマンド

ターミナルで以下のコマンドを実行し、テストを実行します。


```bash
flutter test test/validators_test.dart　（特定のファイルをテストしたい場合）

flutter test
```

### 4.2 実行結果

テストが成功した場合、以下のように表示されます。

```bash
00:01 +4: All tests passed!
```

---

## まとめ

ユニットテストは、アプリの信頼性を高め、バグを防ぐために非常に有効です。今回のパスワードバリデーションのように、関数の動作を検証するテストを書くことで、コードが正しく動作しているかを簡単に確認できます。テストを継続的に実行して、品質の高いアプリ開発を進めていきましょう。
Amazon Bedrockモデル推論の解説

##はじめに 

この記事では、Amazon Bedrockを使って生成AIモデルを簡単に活用する方法を解説します。

**前提知識**

生成AIは、大量のデータで学習された機械学習モデル（基盤モデル）によって実現されています。

- **基盤モデル**：  データの種類によって様々な能力を持つモデルに分類されます。
    - **大規模言語モデル（LLM）**： テキストデータを学習し、文章生成、要約、翻訳など様々なタスクをこなします。
    - **画像生成モデル**： 画像データを学習し、テキストから画像を生成します。
- **プロンプト**： 基盤モデルへの入力テキストのことです。
- **推論**： 入力から出力を算出する処理のことです。
- **推論パラメーター**： 推論結果を調整するパラメーターです。例えば、テンプラーやトップP/Kは、出力のランダム性や多様性を調整します。

**Amazon Bedrockによるモデル推論**

Amazon Bedrockは、サーバーレスで様々な基盤モデルを提供するサービスです。アプリケーションからAPIを通じてAmazon Bedrockにアクセスして利用します。

**モデル推論の実行方法**

- **AWSマネジメントコンソール**： GUIで簡単にモデル推論を試せる「プレイグラウンド」機能があります。チャット、テキスト、イメージなど様々なタイプのプレイグラウンドが用意されています。
- **API**： プログラムからモデル推論を実行できます。

**料金プラン**

- **オンデマンド**： 使用した分だけ課金される最も一般的なプランです。
- **バッチ推論**： 大規模なジョブを処理する際に、オンデマンドの半額で利用できます。
- **プロビジョンドスループット**： 安定したパフォーマンスが必要な場合に、専用のリソースを確保できます。

**基盤モデルの種類**

- **ベースモデル**： AI21 Labs、Amazon、Anthropicなどから提供される、一般的な基盤モデルです。
- **カスタムモデル**： Amazon Bedrockで独自のデータセットを用いてカスタマイズしたモデルです。
- **インポートされたモデル**： Amazon Bedrock以外の環境でカスタマイズされたモデルをインポートします。

**モデルアクセスの許可**

Amazon Bedrockを使用するには、モデルへのアクセス許可が必要です。AWS Marketplaceから必要なモデルを選択し、エンドユーザーライセンス同意書を確認して、アクセスリクエストを行います。

**モデル推論の手順**

1. **AWSアカウントの準備**： Amazon Bedrockを使用するにはAWSアカウントが必要です。
2. **モデルアクセスの許可**： AWS Marketplaceからモデルへのアクセス許可を取得します。
3. **マネジメントコンソールでの推論**： プレイグラウンドを使って簡単にモデル推論を試すことができます。
4. **API経由での推論**： アプリケーションからAPIを使ってモデル推論を実行します。

**まとめ**
Amazon Bedrockは、サーバーレスで様々な基盤モデルを提供するサービスです。プレイグラウンドやAPIを利用することで、簡単にモデル推論を実行できます。料金プランや基盤モデルの種類、アクセス許可、モデル推論の手順など、様々な要素を理解することで、Amazon Bedrockを効果的に活用できます。

**関係資料**
[Amazon Bedrock モデル推論 a.準備編](https://youtu.be/fDuvLF32i-M?si=Vo6rLssyT355v411)
[Amazon Bedrock モデル推論 a.準備編/PDF](https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa1lYVzNRVzRBZ1ZLVWlrVGlzNjR3dGlXZTFvQXxBQ3Jtc0trWDJ1VDIwMURpVUNrQ3Z3RWFQX3FWTi1TZzRmTERYU2hxcUNzVVFucHY2MUZyOGZvbzhiSjN2U040em5lOU9hZlYtTmZfWGRpRkhhNF9hZEZyQVA4VHZFQUxvQzBTQmszV1BwaGotcHlBLXJCaWRZZw&q=https%3A%2F%2Fpages.awscloud.com%2Frs%2F112-TZM-766%2Fimages%2FAWS-Black-Belt_2024_Amazon-Bedrock-Model-Inference-a_0909_v1.pdf&v=fDuvLF32i-M)
vSphere 8.0 u3のNVMe Tieringについて

# はじめに
また、記事を書くモチベーションが上がってきたので、再出発しようと思い書いてみました。

# vSphere Memory Tieringについて
NVMe TieringはNVMeのデバイスをメモリとして利用できるという機能で、ホームラボを利用している方には非常にメリットがあります。
vSphere 8.0 U3でTech Previewとして利用できるようになっています。

この機能を利用して検証してみようと思ったのですが、どうやら、現状、コンシューマのCPUでは利用できないそうです。
私のホームラボのCPUは「11th_Gen_Intel(R)_Core(TM)_i5-11400」、「AMD Ryzen 5 8600G」となりますが、NVMe Tieringを有効にしても、動かなそうでした。
(仮想マシンのNVMeデバイスでテストしたので、この構成がダメって可能性がありますが)

今後、コンシューマのCPUでも利用できるようになるそうなので、もう少し待つ必要がありそうです。
DockerクラスターにおけるDatabricks SDK for Pythonの認証エラー

こちらをDatabricks Container Serviceで構築したクラスターで実行したところ、`w = WorkspaceClient()`でエラーに遭遇しました。

https://qiita.com/taka_yayoi/items/91845e9c199d6bc8a1ff

```
ValueError: default auth: cannot configure default credentials, please check https://docs.databricks.com/en/dev-tools/auth.html#databricks-client-unified-authentication to configure credentials for your preferred authentication method.
```
![Screenshot 2024-09-17 at 9.06.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7fb334a2-ec5a-ac9d-d5c5-c7c683e7ae25.png)

こちらにヒントがありました。

https://community.databricks.com/t5/data-engineering/workspaceclient-authentication-fails-when-running-on-a-docker/td-p/66051

> Default auth from a notebook using sdk on DCS is yet to be tested by Engineering. Please use PAT auth for now.

> DCS(Databricks Container Service)におけるSDKを用いたノートブックのデフォルト認証はエンジニアリングによるテストはされていません。現時点ではPAT(Personal Access Token)を使ってください。

`WorkspaceClient`の引数を指定しない場合、デフォルトの認証を用いてアクセスを試みますが、これが未テストということでしたので、明示的にパーソナルアクセストークンを指定します。[こちら](https://docs.databricks.com/ja/dev-tools/auth/pat.html#databricks-personal-access-tokens-for-workspace-users)に従って、パーソナルアクセストークンを取得します。

以下のように指定します。平文で指定していますが、実運用では[シークレット](https://docs.databricks.com/ja/security/secrets/index.html)を使ってください。

```py
from databricks.sdk import WorkspaceClient
from pprint import pprint

# WorkspaceClient のインスタンスを作成
w = WorkspaceClient(host="https://<Databricksワークスペースのホスト名>", token="<パーソナルアクセストークン>")

# 現在のクラスターの情報を取得
current_cluster = w.clusters.get(current_cluster_id)
# クラスターの情報を表示
pprint(vars(current_cluster))
```
![Screenshot 2024-09-17 at 9.09.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/56db1d3f-5b63-6777-44f3-13c03c88aad7.png)

これで動きました。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)