OmniAICreator/Qiita-1.07M huggingface dataset:
【SwiftUI】空を表すViewが標準コンポーネントとして提供された！

# はじめに
WWDC23をリアルタイムで見た影響でめっちゃ寝不足です笑
SwiftUIでiOS17から使用できるAPIが公開されました。

その中に`ContentUnavailableView`というものがありました。

# どのようなもの？
> アプリのコンテンツがユーザーから利用できないときに表示する、ラベルと追加コンテンツで構成されるインターフェース

# どんなUI？
|||
|-|-|
|![Simulator Screenshot - iPhone 14 Pro - 2023-06-06 at 17.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/c79a31e7-ce32-d956-d896-deae3fd6c8a8.png)|![Simulator Screenshot - iPhone 14 Pro - 2023-06-06 at 17.02.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/df8d7b9d-29c6-e2dc-962e-fc2e636bf980.png)|

# 実装(テンプレ)
### 最小
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        ContentUnavailableView.search
    }
}
```
![スクリーンショット 2023-06-06 17.05.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3edb38df-ae8f-95c7-d9c4-bc045a547ea3.png)

### 検索ワードを指定する
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        ContentUnavailableView.search(text: "SNQ-2001")
    }
}
```
![スクリーンショット 2023-06-06 17.06.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/76324e52-7aa4-29d6-7fa0-1901c27053f6.png)

# 実装(カスタム)
### 最小
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        ContentUnavailableView {
            Label("No Mail", systemImage: "tray.fill")
        }
    }
}
```
![スクリーンショット 2023-06-06 17.10.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4a82a54a-4dd3-28f7-475e-f8087bb3a284.png)

### 詳細情報をつける
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        ContentUnavailableView {
            Label("No Mail", systemImage: "tray.fill")
        } description: {
            Text("New mails you receive will appear here.")
        }
    }
}
```
![スクリーンショット 2023-06-06 17.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/c84c6fc5-eb91-11a2-3275-6ae663929426.png)

### ボタンをつける
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        ContentUnavailableView.init {
            Label("No Mail", systemImage: "tray.fill")
        } description: {
            Text("New mails you receive will appear here.")
        } actions: {
            Button {
                print("更新しました")
            } label: {
                Label("Reload", systemImage: "arrow.clockwise")
            }
        }
    }
}
```

![スクリーンショット 2023-06-06 17.14.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/605b12bd-599a-0443-1467-6791f11d8d68.png)

# 公式ドキュメント
https://developer.apple.com/documentation/SwiftUI/ContentUnavailableView

# おわり
![スクリーンショット 2023-06-06 17.23.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/db95fd18-31ae-6410-6ae7-029a5673996c.png)
Beta版に関する記事なのでちょっと心配です。
「Appleが一般に開示した情報」に該当してると思うので大丈夫だとは思いますが、
もしアウトだったらコメントで教えて欲しいです。
Google Cloudについて勉強メモ1

## Google Cloudとは
Google CloudはGoogleが最適化/効率化してきたインフラストラクチャを他の企業やエンジニアが利用できるようにしたクラウドサービス。
インターネット経由から利用でき、特別な環境設定は不要ですぐ使い始めることが可能です。
そしてGoogle Cloudには``コンピューティング``、``ストレージ``、``データベース``、``データ分析``、``機械学習``など多種のサービスが用意されています。

__コンピューティング__
- Google Compute Engine（GCE）：仮想マシン（VM）を作成・管理できるインフラストラクチャサービス。自由にOSやディスクサイズ、CPUなどのリソースを設定できる。
- Google Kubernetes Engin（GKE）：アプリケーションの展開、スケーリング、管理を自動化するコンテナオーケストレーションプラットフォームです。
- Google App Engine（GAE）：サーバーレスアプリケーション開発プラットフォーム。アプリケーションをデプロイするだけでGoogle Cloudがバックエンドのインフラ管理やスケーリングを自動的に行ってくれます。
- Google Cloud Functions：サーバーレスコンピューティングサービス。コードを書いてデプロイするだけでクラウド上で実行されます。イベントやトリガーに応じて実行され、コード実行時のみ課金されるのでコスト効率が高い。

__ストレージ__
- Google Cloud Storage：無制限のストレージ容量を提供。使用した分の料金となります。
- Persistent Disk：仮想マシン（インスタンス）で使用するためのブロックストレージ。最大64TBまで選択可能です。
- Cloud Filestore：NFS（Network File System）に基づいた共有ファイルストレージ。最大100TB。読み書きのパフォーマンスが必要なものや複数のインスタンスから同時アクセスするものに適しています。

__データベース__
- Cloud SQL：MySQL、PostgreSQL、SQL Serverなどを使用可能です。
- Cloud Spanner：大容量データ管理サービス。データの一貫性を保つことができ、データ量の追加が可能
- Cloud Firestore：データをドキュメント形式で保存するサービス。モバイルアプリやWEBサイト、サーバー用のデータ管理に適しています。

__データ分析__
- BigQuery：大容量データの分析ツール。SQLを使用しデータ探査が可能
- Cloud Dataflow：データ処理サービス。リアルタイム処理も過去データ処理、大量データ処理も可能。
- Cloud Pub/Sub：データリアルタイム送受信サービス。異なるシステム間でのデータ共有を簡単にします。

__機械学習__
- AI Platform：機械学習モデル作成や既存のモデルを使用するためのツールやサービスの提供
- AutoML：AIを使用し、自動的に機械学習のモデルを作成できるサービス
- TensorFlow：機械学習用のフレームワーク、高度な数学的計算を行うためのツールを提供。独自AIモデルを作成可能

### セキュリティ基準
Google Cloudサービスは、独立した機関による監査を定期的に受け、世界各地の基準でセキュリティを満たしています。

### インフラストラクチャ
各サービスを提供するためにデータセンターを世界各地に配置。エリアごとに分類され、それをリージョンと呼ぶ。リージョンの中にゾーンと呼ばれるエリアが複数存在しゾーンで障害が発生した場合もリージョン内で補う。

### オープンソース（OSS）
Google Cloudでは活用されているソフトウェア技術をオープンソース（OSS）にしているものも多く、ブラックボックス化させません。
サイト開発の環境は３ステージに分ける

サイトを開発する際に、いきなり「公開」するサイトを作るのではない。
３ステージに分けて環境を作り、順に「公開」するためのサイトを作っていく。

１、Develop（開発）環境
２、Staging環境
３、Product（商用）環境

この３つに分けて作業していく。
１ができたら２に、２が完了したら３に移行して最終的にリリースする。

１、Develop（開発）環境
エンジニアやプログラマーなどが作業するための環境。
駆け出しエンジニアの私がローカルで編集する際も、この環境にあるフォルダをダウンロードしてくる。
つまり下書き。

２、Staging環境
開発側のディレクターや先方など、直接コードをいじるわけでないがサイトの確認等をしたい人のための環境。
つまり清書。

３、Product（商用）環境
実際に公開する状態の環境。
つまり提出物。

このように分けることで、問題を起こりにくくして、問題が起こった時に原因を見つけやすくなるし、修正がしやすい。
ReactのPropsのバケツリレーをなくす方法



## はじめに

Reactでは、コンポーネント間でデータを受け渡すために`props`（プロパティ）を使用します。しかし、複数のコンポーネントを経由してデータを渡す必要がある場合、いわゆる`props`の"バケツリレー"が発生します。この問題を解消するための方法を説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/016d9604-c8b0-08b5-9f4b-269e0d858a3e.png)


## バケツリレーとは？

`props`の"バケツリレー"とは、親コンポーネントから子コンポーネント、その子コンポーネントからさらにその子コンポーネントへと、データを手渡ししていくような状況を指します。これはコードの可読性や保守性を下げ、バグの原因となりやすいです。

## Context APIを用いた方法

Reactには、このバケツリレー問題を解消するための機能として`Context API`があります。`Context API`を使うと、コンポーネントツリー全体でデータを共有でき、各コンポーネントがデータを直接取得することが可能になります。

まず、新しいContextを作成します。

```javascript
const MyContext = React.createContext();
```

次に、データを提供する`Provider`コンポーネントを作成します。

```javascript
<MyContext.Provider value={/* ここに共有したいデータを入れる */}>
  {/* ここに子コンポーネントを配置 */}
</MyContext.Provider>
```

そして、データを消費する`Consumer`コンポーネントを作成します。

```javascript
<MyContext.Consumer>
  {value => /* ここでvalueを利用 */}
</MyContext.Consumer>
```

これで、どの深さのコンポーネントでも`Context`からデータを直接取得することができます。

## ReduxやMobXを用いた方法

`Context API`以外にも、大規模なアプリケーションでよく使われるデータ管理ライブラリに`Redux`や`MobX`があります。これらも全体の状態を一元管理し、必要なコンポーネントで直接参照することが可能です。

## まとめ

Reactの`props`のバケツリレーは、コードの可読性や保守性を下げる問題です。これを解消するためには、`Context API`や`Redux`、`MobX`などのツールを使用することが有効です。これらのツールを使いこなすことで、より効率的なReactアプリケーション開発が可能となります。

どのツールを選択するかは、アプリケーションの規模や要件によります。小規模なアプリケーションであれば`Context API`で十分なケースが多いですが、大規模なアプリケーションや状態管理が複雑な場合は、`Redux`や`MobX`のようなライブラリを検討すると良いでしょう。

これらのツールを使うことで、バケツリレー問題を解消し、コードの可読性と保守性を高め、エラーを減らすことができます。
[JavaScript]getElementsByClassNameで取得した要素にイベントハンドラを設定する方法

# はじめに

本記事はJavaScript初学者が学習記録を残す目的で書いてます｡記載の内容に誤りなどあればご指摘いただけると幸いです｡

## 本記事を読むことでわかること
getElementsByClassNameで取得した各要素にイベントハンドラを設定できるようになります｡

## 本題
以下のようなHTMLのコードがあるとします｡

```HTML
  <a href="javascript:void(0);" class="slide-menu">
    <span class="text">メニュー1</span>
  </a>
  <a href="javascript:void(0);" class="slide-menu">
    <span class="text">メニュー2</span>
  </a>
```
class="slide-menu"が設定されたa要素のクリックに対しイベントハンドラを設定したいとします｡要素が複数あるため､getElementsByClassNameで指定したクラス名を持つ要素を取得します｡

```JavaScript
const menuButtons = document.getElementsByClassName('slide-menu');
```
このgetElementsByClassNameは､取得した要素を HTMLCollectionという配列と似たデータで返します｡ そのため以下記載するコードのように HTMLCollectionをforEachで回せば､ひとつひとつの要素に対しイベントハンドラが設定できるのでは考えました｡

```JavaScript
const menuButtons = document.getElementsByClassName('slide-menu');
menuButtons.forEach((menuButton) => {
  menuButton.addEventListener('click', () => {
    // イベント発生時の処理
  })
});
```
ですが上記コードはうまくいきません｡理由はHTMLCollectionにforEachは使用できないためです｡HTMLCollectionは配列に似ているだけで配列とは別のデータ型なんですね｡  

HTMLCollectionをforEachしたい場合､どうすればいいでしょうか｡結論､Array.from()メソッドでHTMLCollectionを配列に変換すればOKです｡


```JavaScript
const menuButtons = document.getElementsByClassName('slide-menu');
Array.from(menuButtons).forEach((menuButton) => {
  menuButton.addEventListener('click', () => {
    // イベント発生時の処理
  })
});
```
このように書くことで､getElementsByClassNameで取得した各要素に対しイベントハンドラを設定可能です｡

以上､ここまでご覧いただきありがとうございました｡
poetry update が一生終わらない時の対応方法

- poetryで使用するパッケージを変更する際に `pyproject.toml` を更新してから `poetry update` を実行すると、パッケージ間の依存関係解決が全然終わらないことがある
- `poetry add` しなおすことで解決した

## やったこと
1. `pyproject.toml` を別名でバックアップする
1. `poetry.lock` を削除
1. `pyproject.toml` の `dependencies` の記載を削除
    1. `[tool.poetry.dependencies]` とか `[tool.poetry.dev-dependencies]` とか
    1. pythonバージョンの記載は残す
1. バックアップした　`pyprojejct.toml` を参考に `poetry add` していく
    ``` shell
    #例: click = "^7.1.2"
    % poetry add click@^7.1.2
    ```

## まとめ
- 3時間待っても終わらなかった `poetry update` が手間はかかりましたが30分程度で代替することができました
- poetry updateが遅いというissueは本家のgithubでも上がってますが、OSSなので文句は言わずに、寄付するかコミットするか裏技を見つけるかしましょう
AWS認定ソリューションアーキテクト－プロフェッショナル（SAP-C02）に合格したので共有

## ◆はじめに
AWS認定 SAP-C02に合格しました。合格にいたるまでの学習方法などを共有したいと思います。

:::note warn
運も絡んでいたかもしれませんでの、その辺はご了承ください。
:::

## ◆ソリューションアーキテクト－プロフェッショナルの概要
12種類あるAWS認定資格の中で、出題範囲が広く最も難しいと言われている試験です。

|項目|内容|備考|
|:-:|:-:|:-:|
|問題数|75問|択一 又は 多肢選択式|
|試験時間|180分|1問 2.4分（180分÷75問）の回答ペースが必要。|
|受験費用|~~30,000 円~~<br>15,000円|[AWS 認定取得: Professional チャレンジ](https://pages.awscloud.com/APAC-ln-GC-TrainCert-Professional-Certification-Challenge-Japan-Registration-2023.html?trk=1380ac18-2536-4dd2-bb51-d4f83a9d2efe&sc_channel=em)の<br>50%割引バウチャーコードで受験。<br>|
|合格ライン|750点／1,000点|

【公式サイト】
[AWS Certified Solutions Architect - Professional](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)

## ◆受験前のAWS認定 取得状況
AWS実務経験はありませんが、下記のAWS認定は取得していました。

・[AWS Certified Cloud Practitioner](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)（CLF-C01）
　2022年12月受験【合格】

・[AWS Certified Solutions Architect - Associate](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)（SAA-C03）
　2023年3月受験【合格】

## ◆勉強期間
約1か月。

SAA合格後、AWSからは1ヵ月ぐらい離れていました。
4月後半から勉強スタート（GW中は勉強なし） 。毎日1～3時間は勉強したと思います。
試験は月曜日だったので、試験前日の土日は、ほぼ終日勉強しました。（家族に感謝）

## ◆学習方法
### －教材について
以下の問題集を [Udemy](https://www.udemy.com/) で購入。

+ SAP-C01の問題集（2,400円 ⇒ 1,800円 25%引きの時に購入）
模擬試験(75問)　x　5回分

+ SAP-C02の問題集（2,400円 ⇒ 1,200円 50%引きの時に購入）
模擬試験(75問)　x　5回分

勉強し始めたときは、SAP-C02の問題集がなかったため、SAP-C01の問題集で勉強開始。
SAP-C02の問題集は、試験日の一週間ぐらい前に販売されていることに気づき購入。
しかし、SAP-C02の問題集を利用しての勉強はほとんどできませんでした。
そのため、教材としては、主にSAP-C01の問題集で勉強しています。

### －学習の仕方について
①最初の1周目は、取り合えず解き、今の実力を把握。正解率10%～30%でも気にしない。
②1問～25問の解説を読み ⇒ 再度1問～25問を解く。この25問は正解率100%を目指す。
③26問～50問の 〃
④51問～75問の 〃
⑤ ②～④を繰り返す。2週目以降は、間違った問題だけを復習し、合格点になるまで繰り返す。
　合格点を取れるようになったら、日をあけて再度問題を解く。

同じ問題集を繰り返すので、そのうち問題を暗記しますが、ただ解答するのではなく、
なぜこの選択肢が正解か？なぜこの選択肢が不正解か？を意識しながら問題を解くようにしました。

②～④で問題数を分けているのは、75問全問を解くには時間かかるためです。
キリの良いところで学習を終われるようにしました。

## ◆試験前日の学習状況
+ SAP-C01の問題集
模擬試験4回分は90%以上の正解率。残り1回分は40%程度。

+ SAP-C02の問題集
模擬試験1回分の解答・解説をナナメに読んだだけ。

## ◆試験本番
問題数：75問　試験時間：3時間

2時間50分で全問題解き終わる。
見直しマークを付けた問題が大量にあったが、残り10分。
疲弊しきっていたので、解き忘れがないかだけを確認して、そのまま終了⇒退出。

## ◆試験結果
755点【合格】

試験終了から、24時間後ぐらいに、合格メール受信。
合格ラインは 750 点なので、ぎりぎりの合格でした。

## ◆試験の感想と分析
①購入した問題集と似たような問題が、2割ぐらい出題されたのではないかと思います。
　この問題は、1分もかからず解答。

②1問 2分ペースで解答しようとしたが、全然できなかった。
　特に長文を読ませる問題は何度も問題文を読み返していたので、1問3～5分はかかったと思います。
　①の問題のおかげで時間を稼げた。

③ややこしそうな問題もよく読むと、実は簡単なことを聞いている問題もあった。
　焦らずに文章を読むことが重要と感じました。

④多肢選択問題について、片方しか解答がわからないケースが多かった。
　その場合は、自分なりに理論づけて解答。
　恐らく、ここで運よく正解を選択したのだと思う．．．．

以上から、SAPは時間との闘いの印象です。
問題集と似た問題で時間を稼ぎつつ、初見の問題も焦らずに読むことが
合格するためのポイントではないでしょうか。
GitHub ActionsでHerokuへ自動デプロイ

GitHub ActionsのWorkflowを使って```github上でマージを行なった際に自動でHerokuへのデプロイを行う``` 設定を追加してみたので、手順を共有します。

# 具体的な手順


## 1. GitHubリポジトリにデプロイ用の設定ファイルを作成する

リポジトリのルートディレクトリに`.github/workflows/deploy.yml`という名前のファイルを作成します。

## 2. デプロイ用の設定ファイルに必要なコードを追加する


   ```.github/workflows/deploy.yml
   name: DeployToStaging

   on:
     push:
       branches:
         - staging

   jobs:
     deploy:
       runs-on: ubuntu-latest
       steps:
         - uses: actions/checkout@v3
         - uses: akhileshns/heroku-deploy@v3.12.13
           with:
             heroku_api_key: ${{secrets.HEROKU_API_KEY}}
             heroku_app_name: "app-name"
             heroku_email: ${{secrets.HEROKU_EMAIL}}
   ```

   上記のコードでは、`push`イベントが発生し、`staging`ブランチにプッシュされた場合にのみデプロイがトリガーされます。

デプロイは`ubuntu-latest`ランナーで実行されます。`actions/checkout`アクションを使用してコードをチェックアウトし、`akhileshns/heroku-deploy`アクションを使用してHerokuへデプロイします。

Herokuへのデプロイには、GitHub Secretsで設定した変数`HEROKU_API_KEY`と`HEROKU_EMAIL`が必要です。

### 注意事項
この自動デプロイが実行されると、heroke上の使用ブランチが```自動的にmasterブランチからmainブランチに変わる```らしいです。masterで運用している方はご注意ください。

参考: https://github.com/marketplace/actions/deploy-to-heroku#important-note

## 3. Heroku APIキーの取得 / GitHub Secretsの設定
Heroku APIキーを取得するためには、Herokuのダッシュボードにログインし、

```[Account settings] -> [API Key]```

のセクションに移動します。APIキーをコピーして、GitHubリポジトリの

```[Settings] -> [Secrets]```

に移動し、`HEROKU_API_KEY`という名前で新しいシークレットを作成し、コピーしたAPIキーを値として追加します。

また、サンプルコードではメールアドレスが必要で`HEROKU_EMAIL`という名前で新しいシークレットを作成し、対応する値を追加します。

# まとめ

上記の手順を完了すると、GitHub Actionsが自動的に設定され、`staging`ブランチへのプッシュがトリガーとなり、Herokuへの自動デプロイが行われます。

各プッシュイベントで自動的にデプロイが行われ、アプリケーションが最新のコードで更新されるようになります。

注意: デプロイの設定や詳細な手順は、環境や要件によって異なる場合がありますので、公式の[ドキュメント](https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)等を参照してください。
IBM Cloud Object Storage (ICOS) non-root user access limitation with ROKS

IBM Cloud Object Storage (ICOS) は、グローバルな展開と柔軟なレジリエンス・オプションにより、先進のコスト最適化、堅固なデータ・セキュリティー、使いやすいデータ・ガバナンスで、お客様のクラウドネイティブ・ワークロードの飛躍的なデータの増加をサポートする、IBM Cloud 上で利用可能なストレージ・サービスです。

ICOS を Red Hat OpenShift on IBM Cloud (ROKS) で稼働する Pod にファイルシステムとしてマウントすることができますが、non-root user によるアクセスには制限があります。

#### ICOS Limitation 
https://cloud.ibm.com/docs/openshift?topic=openshift-storage-cos-understand#cos_limitations
__Limitations__
- IBM Cloud Object Storage is based on the s3fs-fuse file system. You can review a list of limitations in the s3fs-fuse repository.
- `To access a file in IBM Cloud Object Storage with a non-root user, you must set the runAsUser and fsGroup values in your deployment to the same value.`

ICOS Plug-in の Helm Chart にも同様の記述があります。
https://github.com/IBM/charts/blob/master/repo/ibm-helm/ibm-object-storage-plugin.md#limitations

どうやら、以下の Issue がこの制限に関係しているようです。
https://github.com/IBM/ibmcloud-object-storage-plugin/issues/57


#### Sample Manifest 
##### 制限に抵触する例
Kubernetes Online Document を参考に、Pod Manifest を作成してみます。
__Configure a Security Context for a Pod or Container__
https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

```shell
apiVersion: v1
kind: Pod
metadata:
  name: icos-limitation-demo
spec:
  securityContext:
    fsGroup: 2000
  containers:
  - name: icos-limitation-demo
    image: busybox:1.28
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - mountPath: /data/icos
      name: icos-vol
  volumes:
  - name: icos-vol
    persistentVolumeClaim
    claimName: icos-plugin-pvc

```
ここでは、`Pod.spec.securityContext.fsGroup` のみを設定します。

ROKS では OpenShift の Security Context Constraints (SCC) が適用され、何も指定しない場合の Default は、`restricted-v2`（古いバージョンでは `restricted`）になります。
__Managing security context constraints__
Default security context constraints
https://docs.openshift.com/container-platform/4.13/authentication/managing-security-context-constraints.html#default-sccs_configuring-internal-oauth

この設定で Pod を稼働させると、マウントした ICOS の権限には `fsGroup` の設定が反映されません。

```shell
$ oc rsh icos-limitation-demo -- ls -l /data/icos
-rw-r--r-- 1 0 0 6 Jun  6 12:13 testfile
```
##### 制限を回避する例
次に、`Pod.spec.securityContext.runAsUser` も同値で設定してみます。

```shell
apiVersion: v1
kind: Pod
metadata:
  name: icos-limitation-demo
spec:
  securityContext:
    runAsUser: 2000
    fsGroup: 2000
  containers:
  - name: icos-limitation-demo
    image: busybox:1.28
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - mountPath: /data/icos
      name: icos-vol
  volumes:
  - name: icos-vol
    persistentVolumeClaim
    claimName: icos-plugin-pvc

```
この設定で Pod を稼働させると、マウントした ICOS の権限が想定通りに設定されました。

```shell
$ oc rsh icos-limitation-demo -- ls -l /data/icos
-rw-r--r-- 1 2000 2000 6 Jun  6 12:03 testfile
```
特異値分解と低ランク近似

テンソルネットワークを学ぶ上で基本となるのが特異値分解です。
この記事では特異値分解(SVD)とその応用である低ランク近似(LRA)について、自分用に簡単にまとめておきます。

# 特異値分解 (Singular Value Decomposition)
特異値分解(SVD)とは、任意のm行n列の行列M（rank R)を次のように3つの行列に分解することです。

```math 
    M = UΣV^{\dagger}
```

Vはm行m列、Uはn行n列のユニタリ行列です。またΣはm行n列の対角行列です。Σの対角成分は**行列Mの特異値**と呼び、R個の非負の実数が並んだ対角行列です。
上式を成分表示でも書いておきます。(特異値は小文字のσを使います)

```math
    M_{ij} = \sum_{k=1}^{R}U_{ik}\sigma_{k}V_{jk}^{*}
```

任意の行列Mが一意なΣを用いて分解できるのが味噌です。(UとVは一意でない)

# 低ランク近似 (Low-Rank Approximation)
低ランク近似(LRA)は、先ほどの行列MをSVDした後に行います。例えば行列MにSVDを施し、特異値σ(R個)を大きな値から順に得たとします。小さな特異値の値がほとんど0である時、それを捨ててしまうことを**低ランク近似**と言います。あるS番目からR番目まで(S<R)特異値を捨てるとして、成分表示で上記の操作を書くと、

```math 
M=\sum_{k=1}^{R}U_{ik}\sigma_{k}V_{jk}^{*}\simeq\sum_{k=1}^{S}U_{ik}\sigma_{k}V_{jk}^{*}=\widetilde{M}
``` 

となります。近似の際に元のrank Rからrank Sへ落ちるのでLRAと呼ぶわけです。
近似された行列$\widetilde{M}$と元の行列$M$の間にどの程度エラーがあるのか、全成分の絶対二乗誤差を計算することで評価してみます。

```math 
\begin{align*}
\sum_{i,j}|M_{ij} - \widetilde{M_{ij}}|^2 &= \sum_{i,j}(M_{ij} - \widetilde{M_{ij}})(M_{ij} - \widetilde{M_{ij}})^{*} \\
&= \sum_{i,j}(\sum_{k=S+1}^{R}U_{ik}\sigma_{k}V_{jk}^{*})(\sum_{k'=S+1}^{R}U_{ik'}\sigma_{k'}V_{jk'}^{*})^{*} \\
&= \sum_{k=S+1}^{R}\sum_{k'=S+1}^{R}\sigma_{k}\sigma_{k'}\sum_{i}U_{ik}U_{ik'}^
{*}\sum_{j}V_{jk}^{*}V_{jk'} \\
&= \sum_{k=S+1}^{R}\sum_{k'=S+1}^{R}\sigma_{k}\sigma_{k'}\delta_{kk'}\delta_{kk'} \\
&= \sum_{k=S+1}^{R}\sigma_{k}^2
\end{align*}
```

よって「全成分の絶対二乗誤差は、捨てた特異値の2乗和と等しい」ことが分かります。(**Eckart-Youngの定理**を参照)

[参考文献]
テンソルネットワークの基礎と応用　(西野友年 著)
What's New from CircleCI - 2023/06/06

CircleCIに関する最近1週間(2023/05/30~06/06)くらいの情報をまとめてみました。

気のつく限りの情報は拾ってみたつもりですが、見落としなどありましたら、Twitterで [@CircleCIJapan](https://twitter.com/CircleCIJapan) をメンションしてタレ込んでいただけると幸いです。
少しでもお役に立てていましたら、いいね(❤️)クリックいただけると嬉しいです！

[＜ What's New from CircleCI - 2023/05/30](https://qiita.com/CircleCIJapan/items/f05e02bea1a34acdd747) | 今週 | [What's New from CircleCI - 2023/06/13＞](https://qiita.com/CircleCIJapan/items/ad7194db0efe5b33168d)

# ユーザーブログ・スライド

- [CircleCIのダイナミックコンフィグでできないこと](https://tech.itandi.co.jp/entry/2023/05/31/183000) by イタンジ 藤崎さん
  - ダイナミックコンフィグでこんなことできないかな？と思って書いてはみたものの、考えていたのと動きが違う(エラーが出る)、という際に参考になる記事かと思います。

- [CircleCIが取り上げられた書籍【技術書典/BOOTH/PEAKS編】2023/05/30版](https://qiita.com/CircleCIJapan/items/0c7ba3c7d69bcfcc9a9c)

# Changelog (更新履歴)
- クラウド版の更新履歴: https://circleci.com/ja/changelog/
- サーバー版の更新履歴: https://circleci.com/ja/server/changelog/
- セルフホストランナーの更新履歴: https://circleci.com/ja/changelog/self-hosted-runner/
- プロダクト ロードマップ(今後の提供予定機能): https://circleci.com/ja/product-roadmap/

# CircleCI Discuss (CircleCIからのお知らせ＆コミュニティ掲示板)
- 日本語アナウンス: https://discuss.circleci.com/tag/ja-%E6%97%A5%E6%9C%AC%E8%AA%9E

# CircleCI 公式ブログ
- [日本語ブログ](https://circleci.com/ja/blog/)
    - [Helm とは？: 概要、Kubernetes プロジェクト管理、ユースケース](https://circleci.com/ja/blog/what-is-helm/)
    - [Git Tag と ブランチ：相違点と使いどころの解説](https://circleci.com/ja/blog/git-tags-vs-branches/)
- [英語ブログ](https://circleci.com/blog/)
    - [Zero trust security for CI/CD pipelines](https://circleci.com/blog/zero-trust-security-for-ci-cd/)
    
# YouTube (動画コンテンツ)
- [CircleCI チャンネル (日本語)](https://youtube.com/playlist?list=PL9GgS3TcDh8x71MTG2uvZ-ljhIkuveSHZ)
- [CircleCI Channel (English)](https://www.youtube.com/c/CircleCI-Videos)
    - [Platform Engineering: The Key to Successful Digital Transformation for the Enterprise](https://youtu.be/k0h_YeRE-H8)

# CircleCI Knowledge Base
- [Troubleshooting OIDC in CircleCI](https://support.circleci.com/hc/en-us/articles/13832176226203-Troubleshooting-OIDC-in-CircleCI)(CircleCIでOIDCを使う - トラブルシューティング)
---
それでは今週も Happy Building⌨!
言葉に疎い人間が書く「Dockerってなんや」part_1

# はじめに
+ 初めての投稿です。ちょっとドキドキしています。
+ 日本語も英語も何もかも弱い人間が、勉強したことをアウトプットした内容です。
+ 読みやすさ重視で箇条書きです。
+ 見返した時に「なんやこれ」って内容があれば好き勝手編集します。
+ 投稿(勉強)つづきますように...

# Dockerとは
+ コンテナ型の仮想環境を作成・配布・実行するためのプラットフォーム
+ Docker社が開発

# コンテナとは
ホストマシンのカーネルを使ってプロセスを隔離することで、別のマシンが動いているように動かすことができる箱

:::note warn
コンテナは、プロセスを仮想化する
仮想マシンは、OSを仮想化する
:::


# コンテナを使うメリット
+ 処理が軽い、動作が高速
:::note info
コンテナはゲストOSを介さないから処理が軽い。
:::
+ 環境構築の工数を削減できる
:::note info
Docker Hubである程度構築済のDockerイメージが配布されている為、
一からサーバ構築する必要ない。
自分が作成したDockerイメージを公開することも出来る。
:::
+ 開発と運用の相性が良い
:::note info
DevOps手法を取り入れている為、開発者と運用者が協力して開発しやすい。
:::
> 参考: 「DevOpsとは？概要やアジャイル開発との違い、メリットなどを解説します」
https://pfs.nifcloud.com/navi/tech/devops.htm


# Docker Desktopとは
WindowsやMacでDockerを使うための部品が全部詰まったGUIアプリケーション。

:::note warn
DockerはLinux上でのみ動作するため、
ホストOSがLinux以外の場合は、Docker Desktopの導入が必須
:::

[コンポーネント] (後述)
1. Docker Engine
2. Docker CLI クライアント
3. Docker Compose
4. Docker Content Trust
5. Kubernetes
6. Credential Helper

>参考: 「Docker Desktop 概要」
https://docs.docker.jp/desktop/index.html


## 1. Docker Engine
Linux OS上でコンテナを動かすためのクライアント・サーバ型アプリケーション。

[コンポーネント]
+ Docker CLI
+ REST API
+ Dockerデーモン
>3つのコンポーネントについてはこちらの記事が参考になります。
参考: 「さわって理解する Docker 入門」
https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part6.html


## 2. Docker CLI クライアント
+ Dockerに命令を送るコマンドのこと
+ コマンドを送るとTCPソケットを使ってREST APIを呼び出し、Dockerデーモンがコマンドを処理する。


## 3. Docker Compose
+ 複数のコンテナを定義・実行するツール
+ YMLファイルにサービスの設定を書き、コマンドを1つ実行するだけでサービスを生成・起動する。
>参考: 「Docker Compose 概要」
https://docs.docker.jp/compose/index.html


## 4. Docker Content Trust
+ 略して「DCT」
+ Dockerイメージに対する署名を用いた検証機能のこと
+ 5つの異なるタイプの鍵を用いて検証を行う
:::note info
DCTによって、Dockerイメージを使う際に中間者攻撃を受けるリスクがなくなった
:::

>鍵の種類と説明はこちらの記事が参考になります。
参考: 「コンテンツを信頼するための鍵の管理」
https://runebook.dev/ja/docs/docker/engine/security/trust/trust_key_mng/index


## 5. Kubernetes
+ コンテナを管理したり、コンテナ同士を連携させたりする機能を提供するシステム(=コンテナオーケストレーション)
+ 複数のコンテナを"Pod"という単位で管理
+ 複数のPodを"Node"という単位で管理
+ 複数の"Node"を"クラスター"という単位で管理
+ Kubernetesがコンテナを管理する時、最上位の"クラスター"に指示を出す。
+ 「クバネティス」「クーベネティス」「ケーエイツ(K8s)」等と呼ばれる

>参考: 「Kubernetesとは何かを図でわかりやすく解説！Pod、Namespaceも」
https://udemy.benesse.co.jp/development/system/kubernetes.html


## 6. Credential Helper
+ Dockerレジストリへの認証情報を外部の認証情報ストアに保管するために、外部ストアと接続するためのツール
>参考: 「認証情報の保存場所」
https://docs.docker.jp/engine/reference/commandline/login.html?highlight=credential%20helper#docker-login-creadentials-store
【Paiza問題集】ループメニュー1/a~zまでを表示

# Paiza問題集
Pythonで回答

## ループメニュー1/a~zまでを表示

### Step01 ある数字までの出力1
```Python
"""
ある数字までの出力1 
https://paiza.jp/works/mondai/loop_problems/loop_problems__print_num_step1

問題
整数1~10を、1から順に改行区切りで出力してください
"""

[print(i) for i in range(1, 11, +1)]
```

### Step02 ある数字までの出力2
```Python
"""
ある数字までの出力2
https://paiza.jp/works/mondai/loop_problems/loop_problems__print_num_step2

問題
正の整数Nが与えられます
1~Nの整数を1から順に改行区切りで出力してください
"""

N = int(input())
[print(i) for i in range(1, N+1, +1)]
```

### Step03 数字の受け取り1
```Python
"""
数字の受け取り1
https://paiza.jp/works/mondai/loop_problems/loop_problems__input_num_step1

問題
10個の整数K_1,K_2,...,K_10が与えられます
これらを受け取り、改行区切りで出力してください
"""

K = list(map(int, input().split()))
[print(i) for i in K]
```

### step04 数字の受け取り2 
```Python
"""
数字の受け取り 2 
https://paiza.jp/works/mondai/loop_problems/loop_problems__input_num_step2

問題
N個の整数K_1,K_2,...,K_N が与えられます
これらを受け取り、改行区切りで出力してください。
"""

N = int(input())
K = map(int, input().split())
[print(i) for i in K]
```

### Step05 ある数をある回数表示1
```Python
"""
ある数をある回数表示1
https://paiza.jp/works/mondai/loop_problems/loop_problems__rep_num_step1

3を8回改行区切りで表示してください
"""

[(print(3)) for i in range(8)]
```

### Step06 ある数をある回数表示2
```Python
"""
ある数をある回数表示2
https://paiza.jp/works/mondai/loop_problems/loop_problems__rep_num_step2

問題
整数N,Kが与えられます
NをK回、改行区切りで出力してください
"""

N, K = map(int, (input().split()))
[(print(N)) for i in range(K)]
```

### Final問題 a~zまでを表示
```Python
"""
a~zまでを表示
https://paiza.jp/works/mondai/loop_problems/loop_problems__print_alpha

問題
a~zのアルファベットを改行区切りで表示
"""

[print(chr(i)) for i in range(97, 123)]
```
cscの作法 その347

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
closedxmlで書式を設定した、xlsxを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f73dd099-c0eb-6f9a-4561-f696163cc9f6.png)

# サンプルコード

```

using System;
using System.IO;
using ClosedXML.Excel;

namespace App
{
	class Program {
		static void Main(string[] args) {
			var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Book11.xlsx");
			var wb = new XLWorkbook();
			var ws = wb.Worksheets.Add("Sheet1");
			ws.Cell("A1").Style.NumberFormat.Format = "@";
			ws.Cell("B1").Value = "Hello, Excel!";
			ws.Cell("B1").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
			ws.Cell("C1").Value = "0123456789";
			ws.Cell("D1").Value = "0123456789";
			ws.Cell("D1").Style.NumberFormat.Format = "@";
			ws.Cell("E1").Value = 0123456789;
			ws.Cell("E1").Style.NumberFormat.Format = "@";
			ws.Cell("F1").SetValue("0123456789").Style.NumberFormat.SetFormat("@");
			ws.Cell("G1").SetValue(0123456789).Style.NumberFormat.SetFormat("@");
			ws.Cell("A2").Value = 0123456789;
			ws.Cell("A2").Style.NumberFormat.Format = "#,##0.0";
			ws.Cell("B2").Value = 123456789;
			ws.Cell("B2").Style.NumberFormat.Format = "#,##0";
			ws.Cell("C2").Value = "2345";
			ws.Cell("C2").Style.NumberFormat.Format = "#,##0.0";
			ws.Cell("A3").Style.NumberFormat.Format = "yyyy/mm/dd";
			ws.Cell("B3").Value = "2017/08/01";
			ws.Cell("B3").Style.NumberFormat.Format = "yyyy/mm/dd";
			ws.Cell("C3").Value = "2017/08/02";
			ws.Cell("D3").Value = "DATE";
			ws.Cell("D3").Style.NumberFormat.Format = "yyyy/mm/dd";
			ws.Cell("A4").Style.NumberFormat.Format = "HH:mm:ss";
			ws.Cell("B4").Value = "13:14:01";
			ws.Cell("B4").Style.NumberFormat.Format = "HH:mm:ss";
			ws.Cell("C4").Value = "13:15:01";
			ws.Cell("D4").Value = "TIME";
			ws.Cell("D4").Style.NumberFormat.Format = "HH:mm:ss";
			wb.SaveAs(filePath);
			Console.WriteLine("ok");
		}
	}
}





```

以上。
虹彩検出のデータセットについて

はじめまして。
大学院の研究で、高精度な虹彩検出を行う深層学習モデル(以下、モデル)を作ろうとしています。その際、モデルの学習を行うデータセットについての情報が日本語ではまとまっておらず、調べるのにだいぶ時間がかかりました。せっかくなのでこちらにまとめてみます。

# NIR画像とVIS画像
まず、虹彩検出を行う際の入力画像は大きく分けて、Near InfraRed(NIR) と Visible (VIS) の2種類の画像タイプがあります。

NIR画像は、下のようなヘッドマウントタイプのアイトラッカーが使用する画像で、目の近くに赤外線光を照射し、赤外線カメラで撮影して得られる画像です。
VRに搭載されているアイトラッカーもNIR画像から視線推定を行なって計算されています。

NIR画像からの視線推定は分野の研究が進んでいて、"Iris detection"などのキーワードで検索したときに優先してその研究についての論文が出てきます。

NIR画像の方が得られる情報としては細かく、単に下で紹介するVIS画像をグレースケール画像にしたものではないことに注意が必要です。

http://sr-research.jp/products/eyelink2/

![スクリーンショット 2023-06-06 13.47.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97923/860df29c-eb0c-064a-5512-7cf424f00229.png)

NIR画像とVIS画像の割合はNIR画像の方が多く、画像数にすると約1:9の割合でNIR画像の方が多いです。
![スクリーンショット 2023-06-06 15.45.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97923/4d5d297d-494e-08fd-8584-da8234e93d19.png)

# NIR画像のデータセットについて
データセットの実際の画像、枚数などの基本情報を下に示します。

![スクリーンショット 2023-06-06 15.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97923/c2a22c9d-7757-8d43-d542-47ad9b0148c1.png)

この中で有名なのがCASIA-IrisV4で独自の撮影機器を使って目周辺のNIR画像を取得しています。

https://hycasia.github.io/dataset/casia-irisv4/

githubで公開されています。

# VIS画像のデータセットについて
一眼カメラやスマートフォン搭載のカメラで撮影した外見から作られるのがVIS画像です。

一眼カメラで撮影したデータセットとして、UBIRIS-v2,
スマートフォン搭載のカメラで撮影したデータセットとして、MICHE-I
などがあります。

データセットの実際の画像、枚数などの基本情報を下に示します。

基本的に眼領域をくり抜いた画像だけが提供されていることが多い印象です。
虹彩中心のラベルもついているデータセットとして、UBIPrがあります。

http://iris.di.ubi.pt/ubipr.html

ただし、自分が使いたいモデルは顔領域を検出してから虹彩検出をする、という手順を踏んでいたので眼領域だけでなく、顔も含んでいてかつラベルがついているデータセットが必要でした。

そのようなデータセットがGI4Eです。
GI4Eは一般的なPCについているwebcamで撮影した写真に虹彩中心を含む眼領域のアノテーションがされているデータセットです。実際の画像が下です。
![スクリーンショット 2023-06-06 15.58.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97923/818037b3-84e7-a141-7376-73954415c6e9.png)


僕が使いたいモデルはスマートフォンで撮影した顔写真を基に視線推定を行うモデルだったので、GI4Eを使用することにしました。今のところ顔画像と虹彩中心のラベルづけがされているデータセットはGI4EとBioIDの2つだけ僕の方では確認しています。

# 虹彩中心のアノテーションの付け方
アノテーションを行った方法が論文に記載されていないことも多いのですが、アノテーションをサポートするツールを独自で作って手動でアノテーションする、複数人が手動でアノテーションを行い、その平均をGround Truthとする、などの手法が取られています。

# 結び
以上、虹彩検出のデータセットについてまとめてみました。
想像以上に様々な種類があり、自分の希望するデータセットにたどり着けないケースもあるかと思います。
NIR画像とVIS画像を区別し、自分が使用すべきデータセットを見つける手助けになれば幸いです。

# 参考文献
Omelina, Lubos, et al. "A survey of iris datasets." Image and Vision Computing 108 (2021): 104109.
Villanueva, Arantxa, et al. "Hybrid method based on topography for robust detection of iris center and eye corners." ACM Transactions on Multimedia Computing, Communications, and Applications (TOMM) 9.4 (2013): 1-20.
経験上OSクリーンインストールをした方が良い場合

# OSクリーンインストールとは
初期不良を除くソフトウェアの問題を殆ど解決してくれるスグレモノ。

最も簡易的な方法はWindowsの回復設定から「初期状態に戻す」を実行することです。厳密にはクリーンインストールではありませんが、経験上クリーンインストール同様に多くの問題が解決されました。
デメリットはWindows.oldやCドライブ直下のフォルダが残るので容量の削減力としては完全なクリーンインストールに劣ってしまいます。

一方、一般的なクリーンインストールはMicrosoft公式から出てるインストールUSB作成ツールを用いてするものです。手順はここでは省略しますが、ブートセクターに関わる問題まで根本的に解決できる強力な手段です。

ここでは備忘録も兼ねてOSクリーンインストールが必要だった状況をまとめていきます。

### 注意
当記事では、「頑張ればクリーンインストールしなくても解決するのでは？」といった現象もクリーンインストールをオススメする立場を取っていますのでご了承ください。

## １．CPU、マザーボードを変更した時
最も定番のシチュだと思います。

マザーボードに紐づくライセンスに関しては、最近では移行が容易になったのであまり重要ではありません。
それよりもWindowsはBIOSやチップセット、CPUの種類に合わせてセットアップされるので様々な弊害が起こりうると考えられてきました。

### しなかった場合に起こりうること
- 原因不明の数秒フリーズ
- エクスプローラーが異常に重い
- ベンチマークスコアの低下

はるか昔、GTS450を使っていた時代に、マザーボードを変更後GPUベンチマークスコアが２割ぐらい低下したことがあったので見えない部分まで影響は考える必要がありそうです。

## ２．グラボを換装した時

こちら、人によってはDDU（グラボドライバ削除ソフト）を使えば大丈夫といった意見もありますが、自分の経験上は断然クリーンインストールがオススメです。
### しなかった場合に起こりうること
- ベンチマークスコアの低下
- ビデオメモリ関連のエラー

私が中2の頃のお話ですが、GTX960（2GB）からGTX1050ti（4GB）に換装してOSをそのままで使っていると、Windows側はビデオメモリを2GBのままだと認識しており、「ゲームプレイ時にアドレス指定がオーバーフローして落ちる」といった現象に見舞われました。もちろん当時はDDUを使用＆ゲームを再インストール＆仮想GPUメモリの確認をしておりますので、厄介事を避けるためにもやはり再インストールが有効だと考えます。

## ３．何度もコンセントを抜いてしまった時
当たり前ですが、電源供給を断つ形でのシャットダウンはコンピュータにとって有害です。見かけ上は影響が無い場合でも、レジストリやキャッシュに小さな被害の爪痕は必ず残ります。

一度や二度なら使用には影響が少ないかもしれませんが、幾度となく繰り返してしまった場合はクリーンインストールの必要があると言えるでしょう。

## ４．ブートローダーに問題が起こった時
普通に使っていてブート領域が破損することはまず無いですが、デュアルブートの構築やブート設定に失敗してブートローダー関連に問題が生じてしまうことはあります。
また、ブートローダーがCドライブのあるディスク以外に設置されてしまっている（やらかしがち）せいでブートローダーがうまく動作しない場合もあります。

このような場合はdiskpartでの修復が一般的ですが、不手際で壊してしまったブート領域はネットに転がってる程度のdiskpartコマンドで治らない場合が多いので、これもクリーンインストールで直しちゃうのが良さそうです。

# ５．時間の経過
やはりどれだけファイルシステムに気を配りながら使っていても、数年経てば必ず最初よりはレスポンスが低速になります。WindowsUpdateを積み重ねたりアプリのキャッシュが断片化したりと様々な原因が考えられますが、やはり今後しばらくは「数年に一度はクリーンインストール」の時代は続きそうです。
Enterprise Cloud Security: Significance and Best Practices Explored

Today, many businesses place a high priority on cyber security. As more and more organizations move their operations to the cloud, they must ensure that their data and systems are protected from cyber risks. Let’s explore enterprise cloud security in this blog post, along with its importance and practical application for businesses.

What Exactly is Enterprise Cloud Security?

Enterprise cloud security refers to the collection of tools, guidelines, and procedures that a company employs to safeguard its data and online assets. It includes a range of security measures, including network security, vulnerability management, identity and access management, and encryption. The purpose of enterprise cloud security is to safeguard sensitive data from being stolen by hackers.
Cloud security can be categorized into three primary domains:

Infrastructure Security: Entails securing the servers, storage, and networking components that make up the underlying cloud infrastructure. Network security, access control, encryption, and disaster recovery are all infrastructure security measures.

Application Security: Protects the web applications, mobile applications, and APIs that are running on the cloud infrastructure. Secure coding procedures, vulnerability scanning, and authentication and authorization systems are all examples of application security measures.

Data security: Pertains to the protection of data stored and processed in the cloud, encompassing sensitive customer information, financial data, and intellectual property. Data security measures encompass data encryption, access control, and data loss prevention.

What is the Significance of Enterprise Cloud Security?

It is crucial to make sure your cloud environment is secure as businesses move their operations to the cloud. Cloud environments are vulnerable to these threats as cyberattacks become more sophisticated. In fact, organisations now face new security risks brought on by the move to the cloud, including data loss as a result of improperly configured cloud resources and unauthorized access to sensitive information.

source: https://www.esds.co.in/blog/enterprise-cloud-security-significance-and-best-practices-explored/
Power BIによるレポート作成(1-2)

# 目次
- 初めに
- 今回作成するアプリについて
- 作成した内容
- 最後に

# 初めに
こちらの記事は前回から作成しているレポートの続きです。
前回の記事は[こちら](https://qiita.com/gun_lee/items/3ad20f672d2534dbee39)から見れます。

# 今回作成するレポートについて
前回は一日における店舗別の来店記録の可視化を行いました。
今回は任意の期間におけるデータの可視化を実装してみたいと思います。
例えば一週間、一か月、一年といった好きな期間内でのデータの可視化を行ってみたいと思います。

# 作成した内容
それでは早速作成していきたいと思います。
今回は前回作成したレポートを利用して簡単に作成していきたいと思うので複製します。
グラフやマトリックスは変更せずに、スライサーを変えていこうと思います。
まず、日付のところはスライサーの設定からスタイルを「ドロップダウン」から「指定の値の間」にします。
これによって好きな日付の範囲を指定することができます。
店舗名はそのまま利用します。
次に、任意の期間における各時間の合計、平均、割合を出せるようにしたいと思います。
前回までは一日だけしか取れず、二日以上の範囲が取れるようになったので、とある時間の合計、平均、割合が取れるのでこれも実装します。
グラフには時間のスライサーの機能を反映させたくないので相互作用の編集で無効化します。
更に実際に動かすときにページを切り替えるボタンが必要になるのでそれも設置しました。
その結果、以下のようになりました。
## 来店記録(一日)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/067055d7-8aad-6b5c-04c3-c49e8ac43202.png)

## 来店記録(期間)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/dfcd62d4-9952-5411-9d7a-b42bc2a8ea94.png)
6月7日~12日のデータは登録していないので数値の変化はありませんが、きちんと反映されています。

# 最後に
今回は前回作成したレポートを利用して任意の期間におけるデータの可視化するレポートを作成しました。
これでよりBIらしいレポートになれたかと思います。
WKWebViewでキーボードを展開するとパフォーマンスが低下する

## 事象
WKWebViewで描画しているページにおいて、テキストフィールドなどにフォーカスを当てた場合にキーボードが表示されるが、このときアプリ内のパフォーマンスが低下しているのか画面のカクツキが酷くなる。
（キーボード入力しても数秒後に文字が表示される、画面内の他のコンテンツをタップしても数秒間動作しないなど）

## 対処
原因ははっきりと分かっていないが、仮対応としてWKWebViewに対してSafeAreaの設定を行うことでパフォーマンス低下が発生しなくなった。
今のままだとSafeArea侵略してしまうので、原因わかったり回避策分かれば追記予定です。

```WebView.swift
.ignoresSafeArea() // パフォーマンス低下しない
.edgesIgnoringSafeArea(.all) // パフォーマンス低下しない
.edgesIgnoringSafeArea(.top) // パフォーマンス低下する
.edgesIgnoringSafeArea(.bottom) // パフォーマンス低下しない
```

```WKWebView.swift
let config = WKWebViewConfiguration()

// JavaScriptの実行を許可
let preference = WKWebpagePreferences()
preference.allowsContentJavaScript = true
config.defaultWebpagePreferences = preference

// インライン再生を許可
config.allowsInlineMediaPlayback = true

// webview生成
webView = WKWebView(frame: .zero, configuration: config)

super.init()
webView.navigationDelegate = self
webView.uiDelegate = self
```

### セーフエリアについて参考にさせていただいたサイト
https://www.yururiwork.net/archives/1226

## 解決（2023/06/08）
`ignoresSafeArea`にて第１引数に`keyboard`を指定することで解決することを確認。
```WebView.swift
.ignoresSafeArea(.keyboard) 
```
`.edgesIgnoringSafeArea(.bottom)`の指定だと描画に影響があったのでこちらを使用します。
パフォーマンスが低下していたのはSwiftUIのキーボード避けの影響を受けていた感じなのかな。

### 解決のヒントになったサイト
ありがとうございます🙏
[SwiftUI in iOS14 Keyboard Avoidance Issues and IgnoresSafeArea Modifier Issues](https://stackoverflow.com/a/66410383/22039138)
[ignoresSafeArea の第一引数と SwiftUI のキーボード避け](https://qiita.com/maiyama18/items/840258cbd3bc3f10b93c)
上司の「研修はどうだった？」には「楽しかったです！」と答えてもいい

「もうかりまっか？」と聞かれたとき、ほとんどの人は「ぼちぼちでんな！」と言いたくなるでしょうか。これは、質問に対する定番の返答があるからです。

私は、それと同じように、上司からの「どうだった？」には「楽しかったです！」という回答でいいと考えています。この記事では、その理由についてお話したいと思います。

<br>
<br>

# 「どうだった？」という暴力
もちろん、上司の「どうだった？」には「きちんと状況を説明してください」という意図が含まれているんですが、ぶっちゃけて言うとそんなものはクソくらえでございます。

だってそうでしょう。コミュニケーションは双方の努力によって進むものです。上司がその努力を丸投げするというのなら、こちらもそうさせてもらっても構わないはずです。

ここでいう『努力』とは、お互いにコミュニケーションコストを払っているか？ということです。「どうだった？」という簡単で曖昧な質問というのは、回答者に「多くの話題の中から、相手が何を求めているかを確認しながら進めていく」というコストを強制していることになります。

<br>
<br>

無能な上司の多くは、この「コミュニケーションコスト」というものを理解していないか、もしくは知らないため、コミュニケーション能力に問題があります。

<br>
<br>

# 報告のレベルは聞き方に依存する
多くの会社で新入社員の研修が終わるこの時期、Twitter（現X）でも風物詩のように「新入社員の報告レベルが低い！」と話題になっています。

「新入社員に「研修はどうだった？」と聞いたところ、「楽しかったです！」としか回答されなかった。」

<br>
<br>

こんな話が出たときに、大半の人は「あー…頭の悪い子が入ってきたんだなー」と思ってしまうようです。これに私はイライラします。いやいや！ちょっと待てよと。悪いのは質問者でしょう？と思うわけです。質問が幼稚すぎるでしょう？と。

<br>
<br>

**

<br>
<br>

「研修でやったこと、研修のなかで起こったこと」なんていうのは、様々な記憶が混じった、非常にぐちゃぐちゃな状態で保存されているわけです。それに対して漠然とした質問をされても、曖昧な回答になってしまうというものです。

さらに、人は、出された質問が理解できない場合、それを簡単な質問に置き換えてしまいます。例えば、「半年後の総理大臣の支持率はどれくらいだと思いますか？」と聞かれた時に、「今の政策の人気はどれくらいか」を答えてしまうようにです。

<br>
<br>

つまり、新入社員の中では「研修はどうだった？」は「楽しかったか、楽しくなかったか」もしくは「しんどかったか、楽だったか」などのような簡単な質問に置き換えられてしまうわけです。

上司との会話で緊張し、「早く答えなきゃ！」と焦ってしまう新入社員…たった一言の短い質問ですし、「どうだった？」「楽しかったです！」となるのは会話のテンポ的にも自然な気すらしてきます。

<br>
<br>

なので、そんな幼稚な質問をしておいて、回答に期待をし過ぎるのはどうかと思うわけですよ。挙句の果てに「今年の新入社員は頭が悪い」というのです。

それは上司という立場だから「なんかあの人苦手だなぁー」で済まされているのであって、家族や友人にも同じ態度であるのなら、下される評価は「あの人は面倒くさい」「コミュニケーション能力が低い」というものになるでしょう。

「今日のご飯は？」「なにか面白いことない？」「最近どう？」など、日々の会話の中でも他人に負担をかけていることは想像に難くありません。

<br>
<br>

# 上司のソレは直らない
残念ながら、40～50歳を超えても、そのような無能な質問をする上司は、一生直らない可能性が高いです。理由について、この記事では2つほど取り上げます。

<br>
<br>

**①自分が悪いということを自覚しなければならない**
これができる人が非常に少ないです。特に、大人になればなるほど、まず「相手が悪い」から議論がスタートするので、そもそもお話になりません。万が一、気が付けたとしても、半世紀近くそのやり方で生きてきた人が、急にアップデートなんてできるものでしょうか。

かなりの訓練と、それに付き合ってくれる人が必要です。

<br>
<br>

**②無能な質問をしていることを誰にも指摘されない**
そもそも、誰も何も言ってくれなくなります（あるいは諦められます）。やはり、歳を重ねるごとに学ぶ機会は少なくなります。実際に、我々も上司が無能な質問をしていても「幼稚な質問っすね、何を答えればいいっすか？」なんて言うことはないでしょう。

もはや「その人を改善させたい！」と思う人は現れません。面倒くさいから関わらないと、むしろ距離を置かれてしまいます。

<br>
<br>

# とはいえ上司だしね…こっちが頑張るか。
と、ここまで上司をボロカスに言ってきましたが、最後に「それでも上司だから、こっちが積極的にコストを払ったほうがいいよね」ということを書いて締めようと思います。

<br>
<br>

「でも、実際は上司にはきちんと説明しないといけないですよね？」

と、多くも思ったのではないでしょうか。つまり、この記事はあくまでそういうメンタル面での重要性を強調するもので、内容的にはエンタメの要素であると。

<br>
<br>

はい。正解です。

残念ながら、上司が上司である限り、我々は奴隷のように配慮をする（積極的にコミュニケーションコストを払っていく）必要があります。なぜなら、あなたのほかにも配慮がうまい奴隷がいるからです。もし、そんな中で、あなたが配慮を怠ると相対的に「無能な奴」「できない新人」というレッテルを貼られてしまうでしょう。

ここまでボロクソに言ってきた私でも、普段は腰を低くして「えへへへ、こんな回答でよかったでしょうか」みたいな感じの笑顔でへらへらしてるわけですよ。これは避けることができません。

<br>
<br>

**

<br>
<br>


ただ、メンタル的には「どうだった？」には「楽しかったです！」という回答でいいと思っています。これは、自分が「やらされている」と感じるのか「やってあげている」と感じるのかの違いで、精神的な健康に大きな影響を与えます。

もちろん、「やってあげている」と思う方が、自己肯定感が高まり、精神的に健康になります。「やれやれ、やさしい俺様が残念な上司のために1から10まで教えてやるか」と思えるようになるといいですね。

また、上司の質問にきちんと回答できなかったとしても「質問も悪かったしな」と少しでも思ってもらえればいいと思います。最近、そういうことで鬱になったりすることもあるので、抱え込んでも仕方ありません。

ただし「自分は悪くない」と開き直ってしまうのは良くありません。その上司と同じ道をたどることになるので、絶対にやめましょう。

<br>
<br>

以上です。
pom.xmlの一行目にエラー発生。その解決法について

## 状態
```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.1.0</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>helloworld-1</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>helloworld-1</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
	<packaging>ejb</packaging>
</project>
```
上記のpom内の次の箇所でエラーが発生していた。
```
<?xml version="1.0" encoding="UTF-8"?>
```

### 解決方法
<h3>javaのversionを確認・修正</h3>
<p>コマンドプロンプトからjava のバージョンを確認したところ、17.0.4.1だった。
そこで、上記のpomに記載されているjavaのバージョンを17.0.4.1に変更した。</br>
その結果、エラーがなくなった。</p>
文字列加工のススメ

__業務でよく使う文字列加工を備忘録的に残しておきます。__
気がついたら随時更新します。

# サクラエディタ
・矩形選択
12345を選択したい場合
alt+矢印キー　or　alt+マウスでドラック
で縦軸で選択ができる。
~~~
AAA 12345 
BBB 12345
CCC 12345
~~~

・特定の文字を含むもの以外を削除する。
sakuraエディタで置換を選択→置換前に「^(?!\[root\@hogehoge\ tmp\]\#).*\r\n」を入れ正規表現にチェックを入れる。
置換後に何も入れない状態で全てを置換すると下記のように変わる。
~~~ :置換前
[root@hogehoge tmp]# ll
-rw-r--r-- 1 root root   11 2月	28 16:11 aaa.txt
-rw-r--r-- 1 root root   36 2月	28 16:12 bbb.txt
-rw-r--r-- 1 root root    0 2月	28 16:07 ccc.txt
drwxr-xr-x 2 root root 4096 2月	28 16:14 test
drwxr-xr-x 2 root root 4096 2月	28 16:15 test2
[root@hogehoge tmp]# mkdir tmp/aaa
[root@hogehoge tmp]# mkdir tmp/bbb
~~~
~~~　:置換後
[root@hogehoge tmp]# ll
[root@hogehoge tmp]# mkdir tmp/aaa
[root@hogehoge tmp]# mkdir tmp/bbb
~~~

(?!\[root\@hogehoge\ tmp\]\#)の(?!式)が否定先読みを示しており、"[root@hogehoge tmp]#"の箇所を検索から否定させている。特殊文字に関しては\でエスケープさせる必要がある。
そのあと^で頭から検索、.*でそのあとの行末まですべてを選択し、\r\nで改行まで含むようにすればプロンプト以外の行を削除する。こうすることによって例えばログからコマンド集を作成したりすることができる。

# EXCEL
・文字列の組み合わせ
セルとセル同士を1つのセルで表す場合は&で挟みます。
文字列の場合は""で囲みます。また関数も使えるので下記のようなことも可能です。

hogehoge.log	  2023/6/7 15:43	　 hogehoge.log_20230607
hogehoge.log	  =NOW()	　　　　 =B3&"_"&TEXT(C3,"yyyymmdd")

これを活用しよくコマンドテキストを作成しています。
MSバウチャーチケット無料ゲットのチャンス（6/20まで）

### Microsoft Learn Cloud Skills Challenge

Microsoftさんの企画で、
期間内にAZ-○○系のトレーニングコースを1通り学習し終えると、その試験のバウチャーチケットが無料でもらえます。

https://www.microsoft.com/ja-jp/cloudskillschallenge/build/officialrules/2023

#### チャレンジ期間
日本時間ですと 2023年5月24日～6月21日のAM1時までです。（もう始まっています）

#### バウチャーチケットの有効期限
チャレンジを終えるとバウチャーチケットが6月30日までに送られてきます。
またバウチャーチケットの有効期限は2023年9月27日です。

#### チャレンジを受けた感想
参考程度にですが…
私は「PL-400: Microsoft Power Platform Developer」のチャレンジを受けました。
トレーニングは全22個で、記事を読むだけであれば5時間程度で終わりました。
個人的難易度は中くらいでした。（Power Platformに触れたことがある人なら難しくないかなと思います）

またチャレンジ完了報告のメールはトレーニングを終えた翌日に来ました。

https://learn.microsoft.com/training/challenges?id=69681a7d-f052-4034-bf05-19a6dcf1bbec&WT.mc_id=cloudskillschallenge_69681a7d-f052-4034-bf05-19a6dcf1bbec
Power BIによるレポート作成(1-1)

# 目次
- 初めに
- 今回作成するレポートについて
- 作成した内容
- 最後に

# 初めに
前回初めてPower BIを学習し、ある程度知識を得たので実際にレポートを作成したいと思います。
前回の記事は[こちら](https://qiita.com/gun_lee/items/5261c65a4e11d52d70fb)から見れます。
# 今回作成するレポートについて
今回作成するレポートは、前回までPower Appsで作成してきた来店記録アプリを利用して集めたデータを、自分が求めている形に可視化し、分析できるようなレポートを作成していきたいと思います。
前回まで作成した来店記録アプリについては以下のリンクから見れます。
- [Power Appsによるアプリ開発(Part1-1)](https://qiita.com/gun_lee/items/f930f0c086b88eff4dfe)
- [Power Appsによるアプリ開発(Part1-2)](https://qiita.com/gun_lee/items/b6b323be7f8076b24cdb)
- [Power Appsによるアプリ開発(Part1-3)](https://qiita.com/gun_lee/items/79b8534134af543dcfd6)

データの可視化について具体的には、集めたデータのグラフ化、各データの合計、平均、割合の表示をしていきたいと思います。
今回はその日と店舗における一日のデータを表示するレポートを作成したいと思います。
# 作成した内容
- データ取得
まずは保存されたデータの取得をしなければならないのでやっていきます。
来店記録アプリで利用したデータベースはSharePointなのでそこからデータを取得したいと思います。
同日の一時間ごとの記録を可視化したいので事前に仮データを同日の一時間ごとに記録しておきました。
取得した際に自分が求めていたデータ以外に色んなデータも取得していたのですが、レポートには関係ないので以前設計したデータベースのデータだけにするようにクエリの編集をしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/204e4ba5-422b-450f-1d27-894136a72d52.png)
また、スタッフ数、来店数などといった数値データが何故か文字列として認識されていたのでデータ型を数値に変更しました。
これでデータの準備は出来ました。

- レポート画面作成
これからレポート画面を作成していきたいと思います。
まずはグラフを作成していきたいと思います。
グラフは以下の三種類を作成していきます。
    - 各時間におけるスタッフ数、来店数、および接客数
    - 各時間における購入者数及び売上金額
    - 各時間における点数及び売上金額
それに加えて、いつどこの店舗のデータを見るのか決めるために、スライサーを使って日付、店舗名で絞り込み出来るようにしました。
その結果、このようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/0d82d559-4b8b-83c8-ca10-d14394fa7505.png)
売り上げの推移が見れていい感じになりました。
次に、各数値の合計、平均、割合を出していきたいと思います。
それぞれ出したい情報は以下の通りです。
    
    |合計|平均|割合|
    |:-:|:-:|:-:|
    |スタッフ数合計|スタッフ数平均|   |
    |来店数合計|来店数平均|   |
    |接客数合計|接客数平均|接客率|
    |購入者数合計|購入者数平均|購入率|
    |顧客数合計|   |顧客率|
    |一般客合計|   |一般率|
    |売上金額合計|売上金額一人平均|   |
    |点数合計|売上金額点数平均|   |

合計と平均はマトリックスを使って、割合はカードを使って可視化したいと思います。
その結果、このようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/d686d11b-014f-8570-e0e6-b3fb930f15da.png)
いい感じなレポートになりました。
これで各店舗ごとの来店記録を見ることができるようになり、データ分析することができるようになりました。

# 最後に
今回は来店記録のデータを可視化するレポートを作成してきました。
今回は一日だけの記録ですが、次回は任意の期間におけるデータの可視化をしていきたいと思います。
スプレッドシートでの分析、時間かかりすぎていませんか？ 統計ソフトで解決！

**「スプレッドシートでデータ分析をしたら何時間もかかって疲れ果てた…」**
これは仕事でデータ分析に取り組んだことのある方にとっては、ありがちな経験かもしれませんね。

分析そのものよりも、その前準備となるデータ加工に恐ろしく時間を取られてしまい、いざ分析！となると疲れて分析結果の検討やデータ探索がなおざりになってしまう…　これでは本末転倒です。

どうせなら、じっくりと腰を据えて分析結果について深く考えを巡らし、同僚との議論に時間を取る方がずっと生産的で有意義ですよね。

今月、弊社では無料セミナーを開催し、統計ソフト [**「JMP（ジャンプ）」**](https://www.jmp.com/ja_jp/home.html)によって効率的にデータ分析を行うTipsをご紹介します。

本セミナーは、1時間 x 2回の短くポイントをまとめた無料セミナーで、ユーザーではない方も参加できるので、もし上記のような問題意識をお持ちであれば、ぜひお気軽にご参加ください。

**セミナーでのご紹介内容の一例：**
JMPでは、データテーブルでヒストグラムを表示でき、データテーブルとグラフ、さらにはグラフ同士も連動するので、たとえば「一定値以上の体脂肪率の人々が、年齢、身長、体重等の項目で、全体のどのあたりに分布しているか」等を一目で確認でき、分析作業を効率化できます。
![blog0602.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/fefca888-2edc-1c50-9586-10c5c27a868a.jpeg)
※ JMPを使ったことがない方は、トライアル版をお試しいただけます。セミナー前にどうぞ。

[**JMP トライアル版（30日間全機能無料）**](https://www.jmp.com/ja_jp/download-jmp-free-trial.html?utm_campaign=bl&utm_source=jmpblog&utm_medium=article)

**▶ JMPをマスターしよう**
**データ分析を効率化するTips編（全2回）**

お申込みは[ <font color="red">**こちら**</font>](https://www.jmp.com/ja_jp/events/live-webinars/mastering-jmp/mastering-datatips-202306.html?utm_campaign=bl&utm_source=jmpblog&utm_medium=article)

第1回：分析用データ作成までのTips
6/20（火）15:00～16:00
【主な内容】
・データ読み込みの工夫
・実は一番時間がかかる”データ加工”のプロセスを効率化
・JMPのデータテーブル操作で知っておきたいこと
・複数のテーブルをくっつけるときに知っておきたい「テーブル」メニューの操作

第2回：データ分析、レポートの保存／共有に関するTips
6/27（火）15:00～16:00
【主な内容】
・定型的な分析を高速に
・多くの変数を扱うときに知っておきたいこと
・グラフをカスタマイズするときのコツ
・レポートの保存／共有でこれだけは知っておきたいこと

参加費：
無料

定員：
500名

※	以下のTwitter投稿内動画では、セミナーでのJMPの操作例を簡単に動画でまとめています。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">📢 無料セミナー: データ分析の効率化<br>スプレッドシートで何時間もかかる分析でもJMPなら一瞬！Tipsをご紹介します。<br><br>⏰ 6月20日（火）、 27日（火）<br>15:00～16:00 <br><br>▶️ 詳細→<a href="https://t.co/KUzzHbzvKm">https://t.co/KUzzHbzvKm</a><a href="https://twitter.com/hashtag/JMP?src=hash&amp;ref_src=twsrc%5Etfw">#JMP</a> <a href="https://twitter.com/hashtag/%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90?src=hash&amp;ref_src=twsrc%5Etfw">#データ分析</a> <a href="https://twitter.com/hashtag/%E7%B5%B1%E8%A8%88?src=hash&amp;ref_src=twsrc%5Etfw">#統計</a> <a href="https://twitter.com/hashtag/%E7%B5%B1%E8%A8%88%E3%82%BD%E3%83%95%E3%83%88?src=hash&amp;ref_src=twsrc%5Etfw">#統計ソフト</a> <a href="https://t.co/qLZm0gzYud">pic.twitter.com/qLZm0gzYud</a></p>&mdash; JMP(ジャンプ) Japan (@JMP_Japan) <a href="https://twitter.com/JMP_Japan/status/1663440158736228353?ref_src=twsrc%5Etfw">May 30, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
HTMLをレンダリングしたNFTの作成方法

### はじめに

いつものようにNFTを発行していたときのこと。

「時刻や日付に応じて見た目が変化したり、開くたびにランダムにテキストや見た目が変化するNFTを作ってみたい！」と思いました。

と言っても、`Solidity` を扱えるわけではないので…。非コントラクトで、そうした変化を実現するしか手立てはありません。a

ここでは、`Solidity` は扱えないけれども、`HTML` `CSS` `Javascript` なら何とかなりそう。そんな方に向けた作り方の解説です。

実際に私が制作した、「レシートのNFT」をベースに説明を進めます。

***

### 「レシートのNFT」とは…？

私が制作したキャラクター「ドーナツ部長」の購入者に配布される、レシートのようなもの。取引証明書ですが、ロールの付与や投票権として機能するなど、使い道は色々です。

**Proof of DONUTSは[コチラ](https://opensea.io/assets/matic/0x84f602ed46d9d8c447b08fe13046862895f33103/0)**


クリックすると、部長に関する豆知識が次々と表示される仕組みです。

では、早速作り方へと進んでいきましょう！

##### ➀必要な3点セットを下記リポジトリからダウンロードしてください。

https://github.com/Rekt-Order/Proof-of-DONUTS
※manifoldでの発行を推奨します
※manifoldで発行する場合には、下記の3セットのみでOK

・index.html
・scripts.js
・styles.css


##### ➁この3つのファイルを同じディレクトリに並べます。

![スクリーンショット 2023-02-16 9.46.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/fd22e799-5d82-70dc-c920-a4485031bac3.png)

##### ➂3つのファイルが用意できたら…

下記ページに従って、manifold上での作業を進めます。
　
【manifoldでHTMLをMINTする方法】
https://docs.manifold.xyz/v/manifold-studio/tutorials/minting-html-pages

・index.html
・scripts.js
・styles.css

この3点セットを格納したフォルダを、pinataなどのIPFSへアップロードしておく（フォルダごとアップロードします）。


![スクリーンショット 2023-02-16 9.57.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/6088d6ec-5108-b0f0-d617-08370cd60825.png)

pinataにアップロードが完了すると、「CID」が発行されます。このCIDをコピーして、下記のようにURLを作成します。

`[https://gateway.pinata.cloud/ipfs/***[CID]***/]`

★コチラの画像の場合では…
![スクリーンショット 2023-02-16 10.02.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/47b719f9-12c8-a55b-3ac2-d834f82484e2.png)


`QmfEMBeAiKYNjVdQb6r9CT8eHwmszTNpzWL4pkF1SdFsk1`をコピー

`[https://gateway.pinata.cloud/ipfs/***[CID]***/]` 形式にしたいので、`[CID]` の部分に、先ほどのコピーしたCIDを貼り付ける

→今回の場合では、

`https://gateway.pinata.cloud/ipfs/QmfEMBeAiKYNjVdQb6r9CT8eHwmszTNpzWL4pkF1SdFsk1/ `

このURLを次の工程で使用します。


##### ➃Hiddenプロパティの設定

manifoldで設定できる「プロパティ」で、`Hiddenプロパティ` を設定します。

作成するプロパティは２つです。

・`animation_url` という属性名
設定する値は、ポイント①で作成した`[https://gateway.pinata.cloud/ipfs/***[CID]***/]` 形式のURL

・`animation_details` という属性名
設定する値は、`{ "format": "HTML" }　`

これで、HTMLページをNFTとして表示可能となります。

![スクリーンショット 2023-02-16 10.06.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/d52d87a8-6430-a9ff-bac3-c994032e44c8.png)


この記事は、著者が運営するメディア「ぬるぺでぃあ」でも読むことができます（記事は[コチラ](https://miuradonuts.com/2023/06/18/tech-001/)）
![](https://miuradonuts.com/wp-content/uploads/2023/06/ヘッダーエリア画像作成.png)