OmniAICreator/Qiita-1.07M huggingface dataset:
OCIのテナンシー所有者を変更する

# はじめに
OCIのテナンシー所有者（最初のユーザ）を変更する際の手順です。

# 手順

1. 新規ユーザーを作成する
    - その際、グループは割り当てない
    - ユーザーのアクティベート、MFAの設定などする。
1. 連絡先メールアドレスを変更する
    - テナンシー管理者（以降、旧管理者）でログインし、`アイデンティティ > ドメイン > Defaultドメイン > 設定 > 連絡先 メールアドレス`で、作成したユーザ（以降、新管理者）のメールアドレスを追加し、旧管理者のメールアドレスを削除する
1. アイデンティティドメイン管理者の変更
    - `アイデンティティ > ドメイン > Defaultドメイン > セキュリティ > 管理者 > アイデンティティ・ドメイン管理者`に新管理者を追加する
1. Administratorsグループの変更
    - 新管理者を追加
    - 旧管理者を削除
1. アイデンティティドメイン管理者の変更
    - `アイデンティティ > ドメイン > Defaultドメイン > セキュリティ > 管理者 > アイデンティティ・ドメイン管理者`から旧管理者を削除する
1. 旧管理者がサインアウトする
1. 新管理者でサインインし、旧管理者のユーザーを削除する
Tableauの画像サムネイル一覧をページングで表示する

# 背景
Tabeleauではインターネット経由で画像サムネイルを出せるようになったが、
表示できる数に制限がある（TableauDesktopで数百枚、TableauOnlineで数十枚）。
そのため、見れる枚数で絞る必要がある


https://prod-apnortheast-a.online.tableau.com/#/site/pixta/views/_17077928988360/CV_2 を参考に


# サムネイルを表示する
`素材サムネイル`計算フィールド（ディメンション）を作る
```
"https://example.com/"
+ STR([アイテムID])
+ ".jpg"
```

フィールド左のアイコンをクリックして、フィールドの型を変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356023/0abfb895-60bb-50be-5b6e-d7ff821380b6.png)


ディメンションとして行にフィールドを配置するとサムネイルが表示される




# ページング機能作成
Tableauでは一度に見れるサムネイルの数に制限があるため、ページに分けて表示する必要がある

### ページング用のパラメータ作成
`表示ページ数`パラメータを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356023/1cc70596-8bae-eb81-1ad8-291a20dc758a.png)


`閲覧環境`パラメータを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356023/34a78b57-d52d-82a7-a6e1-9c01597d5a93.png)



## ページング用の計算フィールド作成
`表示サムネイル数`(ディメンション)
```
IF [閲覧環境] = 1 THEN 30
ELSEIF [閲覧環境] = 2 THEN 200
END
```

`行番号`(メジャー)
```
RUNNING_SUM(1)
```

`指定行番号範囲に入っている`(メジャー)
```
([表示ページ数] - 1) * [表示サムネイル数] < [行番号]
AND 
[行番号] <= [表示ページ数] * [表示サムネイル数]
```

`サムネイル表示シートの総ページ数`(メジャー)
```
CEILING(SUM(1) / [表示サムネイル数])
```

## ページング用のフィルター設定
`指定行番号範囲に入っている`をフィルターに入れる
（RUNNING_SUMを使ってる都合で、「次を使用して計算」を設定する必要がある。大抵は「表(下)」）

ダッシュボード上でうまく配置すればページング機能に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356023/0005770d-98c7-1962-c26d-684c32c78215.png)


（分母の部分は`サムネイル表示シートの総ページ数`を使った専用ビュー）
![スクリーンショット 2024-03-08 12.47.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356023/fefe1982-bcdd-65e6-2017-1380ceb1423c.png)
【ChatGPT有＋DALL-E3】で生成した画像に指定していない要素が加わることについて。その２


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

　今回は、昨日の、生成した画像に指定していない要素が加わることについて。その２です。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::

　朝から
　　ChatGPTのWeb版が
　　　使えません(泣)

　入力して送信しても
　　反応なし。

　まぁ、アプリ版は使えるので
　　そちらを使いますけどねw

　OpenAIが
　　また何かを
　　　やっているのかな？
***
　さて、
　　本題です。

　昨日（2024/03/07）の
　　最後に、詳細な情報を与えれば、
　　　余計なものは出てこない、と
　　　　書きましたけど、
　　　　　あとからリトライしたら
　　　　　　出てきましたw
　　　　　　　糠喜びでした(泣)

　プロンプトは
　　同じなので、
　　　明らかに、DALL-E3さんの
　　　　解釈次第なのでしょうね(悲)
***
　ってことで
　　諦められませんよぉ！

　とにかく
　　人工物はなくせ的な
　　　指示を与えていきます。

　それでも
　　頑固に出してきます。

　……

　ふと逆の発想に
　　思い当たります。

　なぜ人工物が
　　出てくるのか？

　ここは
　　どういう場所なのかを。

　“誰も住んだことがない場所”と
　　与えてみました。

　見事に
　　人工物がなくなりました。

　以下が
　　最終的に
　　　出来上がったプロンプトです。
***
***user***
英語プロンプト出力。和訳。

***ChatGPT***
Here's the English prompt for the latest image generation:

"Envision a scene embodying the essence of untouched nature, where a young woman adorned in a traditional kimono and a loyal dog by her side stand at the brink of a crystal-clear lake. This picturesque setting is marked by a solitary, majestic mountain in the backdrop, serving as a testament to the serene and undisturbed beauty of the landscape. The area is completely devoid of human artifacts, including buildings, pathways, or any signs of human activity, preserving the pristine and unspoiled character of the environment. The emphasis is on the immaculate and harmonious existence of the natural elements, with the woman and her canine companion seamlessly integrating into the tranquil surroundings, free from any man-made interference."

和訳:
"手つかずの自然の本質を体現する光景を想像してください。伝統的な着物を身にまとった若い女性と、彼女のそばに忠実な犬が、クリスタルクリアな湖のほとりに立っています。この絵画のような設定は、背景に孤立した壮大な山を持ち、風景の静寂で未乱された美しさの証としています。この地域は、建物、小道、あるいは人間の活動の兆しを含む一切の人工物が完全に存在しないことで、環境の純粋で汚されていない性格を保持しています。焦点は、女性と彼女の犬の仲間が、人工的な干渉から自由で、平和な環境にシームレスに統合される自然要素の無垢で調和のある存在に置かれています。"

***user***
「以下のリストをすべて含む画像を生成してください。リスト以外は含めないように、DALL-E3に注意してください。
- 若い女性
- 和服
- 犬
- 遠景にひとつの山
- 湖
- 湖には何もない
- 湖のほとりには人工物は何もありません」
プロンプトをこの形式に直してください。

***ChatGPT***
"Please generate an image that includes all the following elements, paying careful attention to include nothing beyond this list:
- A young woman
- Wearing a kimono
- A dog
- A single mountain in the background
- A lake
- The lake contains nothing
- There are no man-made objects on the shore of the lake"

***user***
日本語で

***ChatGPT***
「以下のリストに含まれる要素のみを含む画像を生成してください。リストにないものは含めないよう、特に注意してください：
- 若い女性
- 着物を着ている
- 犬
- 背景に一つの山
- 湖
- 湖には何もない
- 湖のほとりに人工物は一切なし」
***

　よし、
　　新しくセッションを
　　　開いて、と。

　プロンプトを
　　入れて、ポチッとな。

　（ほとりに家が）

　知ってた。
　　プロンプトを
　　　見たときから。

　これも失敗。
　　ぐぬぬ、許すまじ。

　さらに
　　あれこれ。

　結果として
　　ネットワークエラーが
　　　発生して、作業中止。

　毎度、
　　中途半端で
　　　申し訳ないです🙇

　失敗談ということで
　　流してください。

　今回は、ここまで。
ワーケーション時に気をつけたいこと


ノマドワークを実践するに当たって、セキュリティ対策を講じたいのですが、全部盛りの記事がなかなか見つけられず。。

自分のためと思って、リモートワーク時に実践したいことをまとめてみました。

ご助言や良いサービスについてなど、ぜひお待ちしてますm(_ _)m

## ネットワーク系

現地で速度が担保できない場合、潔く帰国を検討します。笑

### Wi-Fi

基本的にポケットWi-Fiを使用します。
プライベートなネットワーク空間が確立できます。
お金かけて無制限プランを選びましょう。

万が一の際は以下を必ず厳守します。
- VPN接続はマスト（ポケットWifi利用時もだけど）
- 鍵付きWi-Fiを利用する
- WPA３規格のWi-Fiを利用する（WEPは使用しない）

### VPN

データの暗号化、プライバシーの向上に役立ちます。
海外行く場合は地理的な制限も回避できます。
- 速度低下が少ないVPNを使用すること
- お金をかけて信頼性の高いものを選ぶこと

【自分がやっていること】
- [Norton360](https://security-king.jp/norton-mac/)をMac2台、iPhone1台にインストール

### Wifi早い作業場所の事前調査
例えば「バンコク Wifi早い場所」等、事前に調べると、ワーキングスペースや宿泊施設など多くヒットします。
ノマドに人気な作業場は制約（1hにドリンク1杯マスト等）が新しく設けられたりするので、最新情報をチェックします。

ホテル予約時も事前に速度測定してもらうか、口コミをよく読みましょう。

## 技術周り

### パスワード

基本。推測のされにくい強力なパスワードを使用します。
- iCloudキーチェーンを積極活用等

### webトラッキングの防止
日本もですが、特に海外利用時は気をつけます。
お使いのブラウザに合わせt設定します。

### 即座にアップデートを行う

ソフトやOSのアップデートを後回しにしないこと。

### マルチファクタ認証 (MFA) を使用する

例えばGithubやAWS等ですね

### ローカルにデータを保存しない

万一のPC紛失に備え、ローカルにはデータを保存しないようにしておきます。
重要書類に関しては、しっかりと調べて課金した上で、セキュアなクラウドストレージを利用します。

ソースコードも毎日消して、翌日pullしましょう。

## Macbookの設定

### ゲストユーザーをオフにする
「ユーザーとグループ」でゲストユーザーをオフにする

### FileVaultでデータを暗号化
オンになっていることを確認する

## 物理的
### 覗き見防止フィルター
取り外し可能なやつは個人的におすすめ（PC見せたい時もありますよね）

### 画面が見えにくい場所を選ぶ
コアワーキングスペース等でも基本中の基本
角や壁側の席に座り、PCの画面が覗かれにくい場所で作業します。

### PCをひとりぼっちにしない
PCはどこでも持ち歩きます。
命の次に大事です。
バッグもPCも常に肌身離さないの大事。

## ガジェット編

超大事なものだけ書きます。

### マイク付きイヤフォン

通話相手側にもストレスがないweb会議にするために、以下の要件は満たしたいです
- ノイズキャンセリング機能
    - 相手の声が聞こえないことがなくなる
- マイクに周りの音が入りにくいこと、マイクの音質

僕は`AirPods`と`Anker PowerConf H700`を持ち歩いています。


# 最後に
こちらの記事は随時更新を予定しています。
皆様からのありがたいアドバイスをお待ちしております🙌
Next.js14 と SSG と Firebase

Next.js 14 で静的サイトを作成し、Firebase にデプロイするまで

### 下準備
- Firebase でプロジェクトを追加（プロジェクト名決める）
- `firebase login` コマンドでログイン
- `npx create-next-app@latest` コマンドで Next.js のプロジェクトを作成
- （GitHub 連携）
    `…or push an existing repository from the command line` 以下のコマンドを入力

### Next.js の設定
next.config.js の場合↓
```next.config.js
 module.exports = {
   /* 下記を追加 */
   "output": 'export',
 };
```

next.config.mjs の場合↓
```js:next.config.mjs
 const nextConfig = {
   /* 下記を追加 */
   "output": 'export',
 }
```
- `npm run build` コマンドを実行→ outディレクトリが追加される
- package-lock.json がない場合→ `npm install` コマンドを実行

### Firebase を連携する
`firebase init` コマンドで設定
※ここではspaceキーで選択（複数選択可）してからenterキーを押す

- `Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys` を選択
- `Use an existing project` を選択
- `What do you want to use as your public directory` では、"out" と入力
（追加されたoutディレクトリのこと）

...他いくつか好きなように選択

- Firebase のサイトで「アプリを追加」をクリック
　↓
「ウェブ」を選択
　↓
「このアプリのFirebase Hostingも設定します」にチェック
　↓
「アプリを登録」をクリック
　↓
 Firebese の指示に沿って SDK等追加

### 完成！
ここまで来たらappディレクトリを編集して自分の好きなようにする。

今回初めてFirebaseを触ってみたけど、デプロイ以外にもいろいろ機能があって便利そう。チラチラ見てみます。
Homestead Vagrant 指令筆記

> PHP8.1 バージョンで `composer` コマンドを実行する必要がある場合は、次のようにします。
```
php8.1 /usr/local/bin/composer update
```

> プロジェクト内で PHP の実行バージョンを指定するには、`homestead.yaml` ファイル内のサイトでPHPバージョンを指定する必要があります。以下のようにします。
```
 - map: homestead.test
   to: /home/vagrant/code/Laravel/public
   php: "8.1"
```

> `homestead.yaml` ファイルを変更した後、そのファイルの設定を再読み込みするには、以下のコマンドを使用します。
```
vagrant provision && vagrant reload
```

> CLI モード下の PHP バージョンを切り替える場合、次のコマンドを使用します。
```
sudo update-alternatives --config php
sudo update-alternatives --config phpize
sudo update-alternatives --config php-config
```
該当する数字を入力してください。

（つづく...）
Pythonで頻出語句ランキング

# Pythonで頻出語句ランキング
## ツイートを全取得する。

ツイートのアーカイブから取得

## ツイートの内容のみ抽出
今回はテキトーにRTやメンションなどを除外する

tweets.jsにツイートの内容は全部入ってるので、そのファイル名をtweet.jsonに変更

```python
import json
import re
import datetime

DATE_RANGE = {"start": 2017, "end": 3000}
NG_WORDS = ["YouTube", "youtube", "YOUTUBE", "https://t.co/"]


def remove_retweets(data):
    return [d for d in data if not d["tweet"]["retweeted"]]


# テキストの抽出関数
def extract_text(text: str) -> str:
    # RTの文字列の番号を取得
    rt_index = text.find("RT")
    if rt_index != -1:
        text = text[:rt_index]
    # 正規表現で @ から始まるユーザ名を削除
    text = re.sub(r"@[a-zA-Z0-9_]+\s", "", text)
    # URLを削除
    text = re.sub(r"https?://[\w/:%#\$&\?\(\)~\.=\+\-]+", "", text)
    # 絵文字削除
    text = re.sub(r"[\U00010000-\U0010ffff]", "", text)
    return text


def remove_empty_lines(text):
    # 文字列を行に分割
    lines = text.split("\n")
    # 空行を削除
    non_empty_lines = [line for line in lines if line.strip() != ""]
    # 非空行を再結合して1つの文字列にする
    result = "\n".join(non_empty_lines)
    return result


# 特定のテキストが入ってるかを判定
def is_contain_text(text: str, target: str) -> bool:
    return target in text


# read json
with open("data/tweets.json") as f:
    data = json.load(f)

data = remove_retweets(data)
out_text: str = ""
count: int = 0
for d in data:
    tweet = d["tweet"]
    tweet_year = tweet["created_at"][-4:]
    if int(tweet_year) < DATE_RANGE["start"] or int(tweet_year) > DATE_RANGE["end"]:
        continue
    tweet_text = extract_text(tweet["full_text"])
    if tweet_text == "":
        continue
    for ng_word in NG_WORDS:
        if is_contain_text(tweet_text, ng_word):
            continue
    print(tweet_text)
    print(tweet_year)
    count += 1
    out_text += tweet_text + "\n"

# out textの空行を削除
out_text = remove_empty_lines(out_text)

# write text
with open("data/out/tweets.txt", "w") as f:
    f.write(out_text)

print(count)
```


## ランキング

```python
import MeCab
from collections import Counter


def load_text_file(file_path):
    with open(file_path, "r", encoding="utf-8") as file:
        return file.read()


def extract_words(text):
    tagger = MeCab.Tagger()
    node = tagger.parseToNode(text)
    words = []
    while node:
        word = node.surface
        pos = node.feature.split(",")[0]
        if pos == "名詞":
            words.append(word)
        node = node.next
    return words


def create_word_ranking(words, top_n=100):
    word_counts = Counter(words)
    return word_counts.most_common(top_n)


def main():
    file_path = "data/out/tweets.txt"
    text = load_text_file(file_path)
    words = extract_words(text)
    ranking = create_word_ranking(words)

    print("名詞の頻出語句ランキング:")
    for i, (word, count) in enumerate(ranking, 1):
        print(f"{i}. {word}: {count}回")


if __name__ == "__main__":
    main()


```

1文字は処理で一旦抜いたほうがいいかもね。
[Swift] WKWebViewからJavaScriptに値を送りたい

## やりたいこと
* iOSアプリ内の値をiOSアプリで表示しているWebViewに反映したい
* 渡す値が複数ある

## JavaScriptを実行する方法
既存の記事もたくさんありますが、以下のメソッドで実行できます
```swift
webView.evaluateJavaScript("実行したいscript")
```
## WKWebViewから値を渡すには
postMessageを使います
```swift
webView?.evaluateJavaScript(
    "window.postMessage({'name':'message'},'*');"
)
```
これに値を増やせば複数送れるのでは？と思っていましたが、ダメでした
```swift
webView?.evaluateJavaScript(
    "window.postMessage({'name':'name1'}, {'key':'value'}, '*');"
)
```
それもそのはず、第２引数はmessageじゃなくてtargetだったため。

:::note info
postMessageの引数の解説は以下の通り
* message
他のウィンドウに送られるデータ。データは構造化複製アルゴリズムに従ってシリアル化されます。つまり、手動でシリアル化することなく様々なデータオブジェクトを宛先に安全に渡すことができます。

* targetOrigin
イベントを配信するこのウィンドウのオリジンを指定します。リテラル文字列 "*" (優先順位なし) か URI のどちらかで指定します。イベントが配信される予定時刻に、このウィンドウの文書のスキーム、ホスト名、ポートが targetOrigin で指定されたものと一致しない場合、イベントは配信されません。この仕組みにより、メッセージが送信される場所を制御できます。例えば、 postMessage() をパスワードを送信するために使用する場合、悪意のある第三者によるパスワードの傍受を防ぐために、この引数がパスワードを含むメッセージの受信予定者と同じオリジンの URI であることが絶対に重要でしょう。 他のウィンドウの文書がどこにあるものか知っている場合は、 * ではなく、常に特定の targetOrigin を指定してください。特定のターゲットを指定しないと、悪意のあるサイトに送信したデータが開示されてしまいます。

* transfer 省略可
メッセージと一緒に移譲される移譲可能オブジェクトのシーケンスです。これらのオブジェクトの所有権は送信先に移譲され、送信元では使えなくなります。
:::
> 引用元：　https://developer.mozilla.org/ja/docs/Web/API/Window/postMessage

## やったこと
上記を受けて修正したのがこちら
```swift
webView?.evaluateJavaScript(
    "window.postMessage({'name':'name1', 'key':'value'}, '*');
")
```
大したことではないですが、これで複数の値が送れるようになりました。
アプリで選択した値を送るとか、使える場面があるかと思います。
LibXL PHP Extensionでセルの文字列を読み取る

## // はじめに
LibXL PHP Extensionを使って、Excelに入力されたデータを読み取るシステムを開発していた時、数式が入力されているセルで、read(row, column)を使うと数式だけが読み取られてしまって苦戦したので備忘録です。
## // 参考資料
解決方法の調査に半日ほどかけた結果、[公式(?)ドキュメントみたいなもの](https://github.com/iliaal/php_excel/blob/master/docs/ExcelSheet.php)に辿り着けました。（リンク先で、ctrl+fで検索バーを出して「public function read」で検索してみてください。）

https://github.com/iliaal/php_excel/blob/master/docs/ExcelSheet.php

## // 概念の説明

以下、ドキュメントを私なりに解釈したものになります。
```php:controller.php

read($row,                // 0から始まる行数
     $column,             // 0から始まる列数
     &$format = null,     // フォーマット（参照渡しに設定されている）
     $read_formula = true // ←これが重要。デフォルトでtrue = 数式を拾う設定になっているので、
                          // これをfalseにすれば値を取ってくるようになる
)
```

## // 使用方法

```php:controller.php

// ↓ この部分は一例です。各記法に従ってください
$excelBook = new \ExcelBook();
$excelSheet = $excelBook->getSheet(0); //この0はsheet1
 
// ～略～

// シートから文字列を読み取る
$excelSheet->read(1, 2, $format, false); //falseに設定する

```

このように、read()の最後をfalseに設定することで、数式ではなく文字列を読み取ることができました。

## // おわりに
お読みいただきありがとうございました。参考になったらうれしいです！
【React】<></> に key プロップスを渡す

## フラグメントとは

下記のように、`<>...</>`という構文を使うことで、ラッパー用の`div`タグなどを使わずに要素をグループ化することができます。

```tsx
<>
  <Child />
  <Child />
</>
```

このように要素をグループ化して、出力される DOM には影響を与えないタグのことを**フラグメント**といいます。

## `map` でレンダリングするコンポーネントには `key` プロップスを渡す

React では配列の値に応じた内容のコンポーネントを繰り返し表示する際に、配列メソッドの`map`を使うことがよくあります。

```tsx
<List>
  {["アイテム１", "アイテム２", "アイテム３"].map((value) => {
    return <ListItem key={value}>{value}</ListItem>;
  })}
</List>
```

繰り返し処理によって生成するコンポーネントは、`key`プロップスに一意の値を渡すことが推奨されています。

これを行わないとブラウザのコンソールに警告が表示されます。

## `<></>`（フラグメント）に`key`を渡すには

状況によっては、フラグメントでラップしたコンポーネントを繰り返し処理で生成することがあります。

しかし、`<></>`にはプロップスを渡すことはできません。

実は`<></>`という構文は、`<React.Fragment>`というコンポーネントの省略記法であり、`key`を渡すときはこの省略なしの記法で書いたフラグメントに渡す必要があります。

```tsx
<dl>
  {[
    { id: 0, title: "見出し１", content: "内容１" },
    { id: 1, title: "見出し２", content: "内容２" },
  ].map((item, index) => {
    return (
      <React.Fragment key={id.toString()}>
        <dt>{item.title}</dt>
        <dd>{item.content}</dd>
      </React.Fragment>
    );
  })}
</dl>
```

このようにすることで、フラグメントでラップしたコンポーネントに`key`を渡すことができます。

最後になぜ繰り返し処理で生成するコンポーネントには`key`を渡すことが推奨されるのかを説明します。

## key の役割

### 仮想 DOM の仕組み

key の役割を理解するためには、まずは React の仮想 DOM の仕組みを知っておくと良いです。

まず、React では仮想 DOM を JavaScript オブジェクトとしてメモリ上に構築します。JavaScript オブジェクトの操作はブラウザの DOM 操作に比べて格段に低コストです。

そして、UI の状態が変化すると、React は全体の仮想 DOM ツリーを再構築します。

その後、新しい仮想 DOM ツリーと以前の仮想 DOM ツリーを比較して、特定された差分のみを実際の DOM に反映します。

React ではこのようなプロセスを行って、実際の DOM の更新を最小限にすることでパフォーマンスを最適化しているのです。

### 一意な key を渡す意味

前述した通り、React は UI の状態変化の前後で仮想 DOM の差分を特定することによって高パフォーマンスな描画を行います。

これを助けるために必要なのが、リストの各要素に一意な値を設定することなのです。

適切な key が提供されていると、React はリストの中の要素を一意に特定し、変更された要素だけを効率的に更新できます。

逆に、同じ key を持つコンポーネントは再利用されることがあるので、適切な key が渡されていないと、状態が意図しない形で引き継がれて再利用されてしまう可能性があるのです。

## `key` に `index` を渡すのは推奨されていない

下記のように、`key` に `map` メソッドのコールバック関数の `index` を渡すのは推奨されていません。

```tsx
<dl>
  {[
    { title: "見出し１", content: "内容１" },
    { title: "見出し２", content: "内容２" },
  ].map((item, index) => {
    return (
      <React.Fragment key={index}>
        <dt>{item.title}</dt>
        <dd>{item.content}</dd>
      </React.Fragment>
    );
  })}
</dl>
```

なぜならば、`index` は配列の要素の順番の数値であり、要素の順番が変われば `key` の値も変わってしまうため、前述した `key` の役割と反することになるからです。

多くの場合ではデータの `id` を `key` として渡すことになると思います。

`index` を渡すのは、配列の順番に変更の可能性がない場合の最終手段と考えるのが良さそうです。

ちなみに、`key` は兄弟要素の中で一意な値になっていれば十分なので、他のリストの要素と `key` が重ならないようにする必要はありません。
依存性注入(DI)とは？: コードの再利用性、テスト容易性、修正柔軟性

## はじめに
Udemyの下記コースを受講していたらDIを実装する箇所があり、気になったので深堀してみた

https://www.udemy.com/course/learning-application-architecture-with-reversi/

## DI (Dependency Injection)

- 依存性の注入
    - クラスが他のクラスに依存している場合、その依存関係を外部から注入する方法
    - AクラスがBクラスに依存している場合、DIを使うとAクラスの外部からBクラスのインスタンスを提供できる


- メリット
    - クラスの再利用性
        - DIを使うと、オブジェクトを同じクラスで再利用できる
    - テストのしやすさ
        - DIによりテストダブル（フェイク、モック、ダミーなど）を差し込んだテストが容易になる。特定のプロパティを持つクラスのふるまいを確認しやすくなる
    - コードの修正容易性
        - クラスの責任が明確になり、コードの修正時のコンフリクトが少なくなる

### 実装例（PHP）

- まずはDIを使わない例

```php
// Serviceクラス
class Service {
	private $repository;

	public function __construct() {
		$this->repository = new Repository();
	}

	public function updateUserData($data) {
		// 何かしらの処理
		$this->repository->update($data);
	}
}

// Repositoryクラス
class Repository {
	public function update($data) {
		// DB操作
	}
}

```

上記実装ではいくつかの問題点がある

1. Serviceクラス単体でのテストができない
2. Repositoryクラスに不具合があった場合、Serviceクラスが機能していても失敗する
3. データベースの種類を変更する際に手間がかかる

- DIを使った例
    - 主に「抽象に依存させる」ことが重要
    - 以下のコードは抽象クラスIRepositoryを介してFirebaseRepositoryクラスを注入する方法を示している

```php
// IRepositoryインターフェース
interface IRepository {
	public function update($data);
}

// FirebaseRepositoryクラス
class FirebaseRepository implements IRepository {
	public function update($data) {
		// FirebaseでのDB操作
	}
}

// Serviceクラス
class Service {
	private $repository;

	// インターフェースを満たすクラスをコンストラクタで受け取る
	public function __construct(IRepository $repository) {
		$this->repository = $repository;
	}
	public function updateUserData($data) {
        // 何かしらの処理
        // 例: ユーザーデータのバリデーション
        // ...

        // データベース更新処理を呼び出す
        $this->repository->update($data);

        // 何かしらの後処理
        // 例: ログ出力
        // ...
    }
}

// DIを使った例
$firebaseRepository = new FirebaseRepository();
$handleUserData = new Service($firebaseRepository);
// ユーザーデータを更新
$userData = ['id' => 123, 'name' => 'Alice', 'email' => 'alice@example.com'];
$handleUserData->updateUserData($userData);
```

このDIを使った実装では、以下のメリットがある

- Serviceクラス単体でのテストが可能
- Repositoryクラスの変更が最小限に抑えられる

DIを活用することで、依存先クラスを変更するだけで済むため、柔軟性が向上する

## まとめ
DIをかつようすることでクラスの再利用性とコードの修正容易性、テストのしやすさなど保守性に優れた手法かと思うが、設計次第ではあえて実装しないのも手段かと思ってしまった
例えば単体テストを想定しない、インターフェースも実装しないのであればあえてDIを活用するメリットも薄れてしまってかえって手間が増えてしまいそう
アプリケーションの設計に応じて適切に使用したいところ
SAA合格への道 - Storage Gateway と FSx

# この記事について

AWS-SAAに今年合格しようというメンバーで勉強会を立ち上げました。
Storage Gateway や FSx がつかみづらかったのでここで立ち上げ

# 学んだこと

## Storage Gateway

Storage Gateway の大きな分類として、

- ファイルゲートウェイ
- ボリュームゲートウェイ
- テープゲートウェイ

がある。

いずれも、オンプレとAWSストレージの橋渡しをする役割。

### ファイルゲートウェイ

いずれも、ストレージの単位はファイル単位。

利用可能なプロトコルと、AWS側のストレージとして何を利用するかでS3ファイルゲートウェイと、FSxファイルゲートウェイ に分かれる。

| 観点 | S3 | FSx |
|:-|:-|:-|
|プロトコル<br>オンプレ・GW間|NFS, SMB|SMB|
|プロトコル<br>GW・AWSストレージ間|HTTPS|SMB|
|ストレージ|S3|FSx for Windows File Server|

:::note warn
NFSに対応しているのは、S3**ファイルゲートウェイ**のみ！
FSx ファイルゲートウェイだけでなく、ボリュームゲートウェイもNFSには対応していない！（iSCSI接続だから？）
:::

#### S3ファイルゲートウェイ

- IAM を利用し、クライアントごとにアクセスするバケットを制御できる

### ボリュームゲートウェイ

iSCSI接続のブロックストレージとしてS3を利用できるサービス。

- データの全体はどこに保存するのか
- どういう用途で使うのか

によって、キャッシュ型と保管型に分かれる。

利用するのはあくまでS3で、SMBや Windows File Server には対応していない

#### キャッシュ型

- すべてのデータをS3に保存
- 高頻度アクセスのデータのみをローカルにキャッシュ

:::note
オンプレに持つデータの容量を小さくしたいときに有効
:::

#### 保管型

- すべてのデータをローカルに保存
- S3上にデータのスナップショットを保存

:::note
低レイテンシを保ちながら、S3にバックアップをとりたい場合に利用
:::

### テープゲートウェイ

- 物理テープストレージを代替できるのはこれ
- 保存先はS3

## FSx

複数のEC2からアクセスできるファイルシステム。

:::note
Storage Gateway はオンプレとAWSの橋渡し、
FSx は AWS上の複数AZからアクセスできるファイルシステム。
:::

### FSx for Windows File Server

Windows ファイルサーバーが提供する以下の機能を使える。

| 機能名 | 内容 |
|:-|:-|
|NTFS|Windowsにおける標準のファイルシステム<br>NT File System|
|SMB|Windowsのファイル共有用プロトコル|
|AD|Active Directory|
|Windows ACL|ADで実現するアクセス制御|
|DFS|Distributed File System。複数コンピュータ間の共有フォルダなどを一括管理する機能。|
|DFS名前空間|DFS上の名前空間。<br>`¥¥ADドメイン名¥¥共有名¥¥フォルダ名`　みたいな表記。|
|DFSR|DFS Replication|

### FSx for Lustre

- Lustre は、パフォーマンスがすごいファイルシステム
- Lustre クライアントをインストールした EC2 Linux インスタンスや、**オンプレミスからもアクセス可能**
- 低頻度アクセスのデータをS3に配置するオプションがある


:::note warn
どうでもいいけど Lustre の読み方は「らすたー」らしいです。
（るーすとれ だと思っていた）
:::

# 以上

また何か学んだことがあれば追記します。
VmmemのせいでCPU使用率が100%になる

# WSLを開いているとCPU使用率が100になった
タスクマネージャーを開くとVmmemのせいでCPU使用率が100%になった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/a9d3498a-9928-239f-39d0-047825b95640.png)

# 原因
WSLがリソースを大食いしていることが原因です。

# 対処方法: WSLを再起動する
PowerShellなどで以下コマンドによりWSLを再起動すると直ります。
```
wsl.exe --shutdown
```

# そもそもVmmemって何？
Bing AIから引用です。(雑でごめん、MS公式情報が見つけられなかった.....)
> Vmmemは、Windows Subsystem for Linux (WSL) が動作している際に現れるプロセスで、仮想マシンのリソース使用状況を示します。具体的には、WSL2が使用されている場合にこのプロセスが立ち上がります。WSLは、Windows上でLinux環境をエミュレートする役割を果たしています。
SPSS Statisticsの入門コンテンツ

SPSS Statisticsのおすすめ入門コンテンツをまとめました。


#### SPSSの使い方～IBM SPSS Statistics超入門～

https://smart-analytics.jp/topics/software/how-to-use-spss-statistics/

IBMビジネスパートナーのスマート・アナリティクス社様が公開されているコンテンツです。起動から、基本的な記述統計や相関分析、カイ二乗検定、t検定などを解説いただいています。


#### SPSSの使い方の動画

https://yotashinahikaro.wixsite.com/mysite-1/spss

データの読み込みから、基礎統計、分散分析、回帰などを動画でわかりやすく紹介いただいています。YoutubeでSPSS Statisticsや統計などのわかりやすい動画を公開されている[田中嘉博](https://www.youtube.com/channel/UCwkBeRbx5OBIHdZA52-zvBw)さんの動画です。

#### SPSS Statistics Small Tips

https://qiita.com/Makimaki2020/items/5ccabc0f68991f669dc4

IBMのソリューションブログで公開しているユースケースに合わせたStatisticsの機能の紹介です。「アンケート分析で本領発揮！簡単操作できめ細やかなクロス表を作成～SPSS Statistics Custom Tables」、「アンケート結果からブランドポジショニングマップを作成する～SPSS Statistics Categories～」、「リスク予測に活用できるロジスティック回帰分析 ～ SPSS Regression ～」などの記事があります。

#### ＳＰＳＳ超入門　第３版―インストールからはじめるデータ分析

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1e5bc435-6fb5-7cee-7aa0-2f7f42dd3d13.png)

https://www.amazon.co.jp/%EF%BC%B3%EF%BC%B0%EF%BC%B3%EF%BC%B3%E8%B6%85%E5%85%A5%E9%96%80-%E7%AC%AC%EF%BC%93%E7%89%88%E2%80%95%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90-%E7%95%A0-%E6%85%8E%E4%B8%80%E9%83%8E/dp/4489023960/

こちらは書籍になります。統計解析の基礎のキソと、データ分析の手順、SPSSの基本操作をカバーしています。

ちなみにSPSS Statisticsの書籍はたくさん出版されています。業界や手法に特化した書籍も多数あります。AmazonでもSPSSで検索すると多くの書籍がヒットします。

https://www.amazon.co.jp/SPSS/s?k=SPSS



#### IBM SPSS Statistics 概要

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

IBMJapanChannelのYoutubeです。基本的な機能とユーザーフレンドリーな画面の操作性について紹介しています。
管理パッケージ



+ [未管理パッケージの開発と配布](https://qiita.com/Keiji_otsubo/items/35323021d8f3d112c419)

+ [「機密データの安全でない保管」を渡すためにAPI キー ( YOUTUBE_DATA_API_KEY ) を保存するにはどうすればよいですか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X8AeB)


:::note
API キーなどの機密情報を保存する際のセキュリティを強化するために、カスタム設定またはカスタム メタデータ タイプを利用できます。 

これらの Salesforce プラットフォーム機能の実装に関する詳細なガイダンスについては、提供されている参照リンクを確認してください。

1. [カスタム メタデータ タイプ - API キー セキュリティのレシピ](https://www.forcetalks.com/blog/custom-metadata-types-your-recipe-for-api-key-security/)
2. [Trailhead モジュール: プラットフォーム機能を使用して秘密を保護する](https://trailhead.salesforce.com/content/learn/modules/secure-secrets-storage/protect-secrets-using-platform-features)


これらのリソースは、Salesforce で API キーを管理および保護するための安全なアプローチを確保するための貴重な洞察と手順を提供します。
:::

+ [管理パッケージでアプリケーションのロゴが表示されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLQp4)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c0b7ab1a-e5b2-c4c2-335f-9b5226e99994.png)


:::note
キャッシュの問題ではないかと回答されています。
シークレットモードあるいは他のブラウザで試してみてください。

https://stackoverflow.com/questions/16455991/cannot-package-new-logo-for-salesforce-manage-package

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PfCiWSAV
:::


# That object name is already in use

+ [Trying to create package version and getting "That object name is already in use" for all my custom objects](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erHcX)

:::note
I had another package with the same namespace and I think, for some reason the version create program on SFDC side changed to suddenly start enforcing uniqueness?? I ended up using a different namespace and it worked.  Not sure why the package version create chose now to start giving error when I had been doing this for 39 versions. Not a great solution but for me it will work.

同じ名前空間を持つ別のパッケージがありましたが、何らかの理由で SFDC 側のバージョン作成プログラムが変更され、突然一意性の強制が開始されたと思います。最終的には別の名前空間を使用することになり、うまくいきました。39 バージョンにわたってこれを実行していたのに、パッケージ バージョン作成でエラーが発生し始めたのはなぜかわかりません。優れた解決策ではありませんが、私にとってはうまくいきます。
:::
並列処理と非同期処理の徹底マニュアル

# 目次
[1.なぜ並列処理を扱うのか](#なぜ並列処理を扱うのか])
[2.並列処理？非同期処理？](#並列処理？非同期処理？)
[3.なぜ並列処理と非同期処理をセットで解説しているの？](#なぜ並列処理と非同期処理をセットで解説しているの？)
[4.おわりに](#3-おわりに)

# 1. なぜ並列処理を扱うのか]
プログラミングの学習が進み、実務や個人の請負開発、個人アプリ開発を行う段階になると、外部APIとの通信を扱うことがあると思います。API処理はうまく扱うと、一度にさまざまな処理を行うことができます。ここで登場するのが、***並列処理と非同期処理***です。
ここを理解できれば、一気に実務レベルまでプログラムスキルを向上させることができます。

# 2. 並列処理？非同期処理？
まずは定義を解説します。
## 並列処理
この処理は、並列して処理を行うことができます。例えば、X(旧Twitter)を見てください。
新しいツイートを読み込みたい時に、下にスワイプします。その間にプログレスサークル(クルクル歯車)が上部に表示されたあと新しいツイートが一気にバッと表示されます。
まさしくこれが、***並列処理***です。
①下にスワイプ
②ツイートの読み込み　＆　プログレスサークルの表示
③プログレスサークルの非表示
④新しいツイートの表示

![名称未設定3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534617/9ab6cfdc-6fdb-9981-c015-78318e44a23c.png)

今回の例では、②が並列処理で外部APIとの通信とプログレスサークルの表示処理が実行されています。

## 非同期処理
アプリが実行されている環境に依存する処理を***同期処理***、反対にアプリとは違った外部に依存処理を***非同期処理***といいます。
詳しく見ると、アプリを開発する際に、プログレスサークル(読み込みの際にクルクルするやつ)を表示しようぜ！という処理は、そのアプリ内で記述します。何をきっかけで表示して、どんな条件で非表示にするのか。***さらに表示時間もアプリ開発者が指定できます***。
反対に、APIとの通信の場合、リクエストを投げた後に、APIからいつその応答が返ってくるのかさっぱり時間が読めません。
APIがあるサーバ(デプロイされているサーバ)の混み具合によっては、相当な時間がかかるかもしれないし、逆にサーバーが増強されると応答が早くなるかもしれません。つまり***アプリの開発者はこの応答時間を制御することができません***。このように、外部に依存する処理は***非同期処理***です。

Twitterの例では、「ツイートを読み込む処理」はTwitter社のAPIと通信しているので、非同期処理。
プログレスサークル表示処理は同期処理です。

# 3. なぜ並列処理と非同期処理をセットで解説しているの？
こちらが本題です。
なぜこの二つがセットなのかというと、***並列処理を使って非同期処理をしている間に同期処理を行う実装をすることが多いから***です。
どういうことか？
API通信(非同期処理)はいつその処理が終わるかわかりません。その間ただ待っているだけでは、あまりにも効率が悪いです。
待ち合わせの際に30分ほど待たされると、その間にポイ活でもしておいた方が時間を無駄にしないですよね？　それと同じです。
待ち合わせをしている時にこそ、並列で処理を行なってしましましょう！
ちなみに、複数の人と待ち合わせをする(複数のAPIと非同期処理をする)ことも可能です。
API通信の応答を待っている間に、プログレスサークル表示させたり、他のファイルからデータを取り込む処理をしたり、はたまた他のAPI通信を投げてみたり、と時間を有効に使います。

# 4. おわりに
いかがでしたでしょうか？おそらく実務レベルに到達する際、はじめに躓く点かと思います。
数年前の私も同じでしたので、安心してください。
具体的な実装は他の記事に記載しますので、そちら参考にしてみてください！
ありがとうございました！
さや香「からあげ4」

# はじめに

先日さや香の「見せ算」を実装したので、「からあげ4」もやってみた。

https://qiita.com/bashildon3843/items/5fe796a40eb7be4cebcb

# 本家
https://sp.nicovideo.jp/watch/sm39827129

# 実装
```python
import random

karaage_list = [1,2,3,4,5,6,7,8,9,10,11,12,13]

ishii = input()

if ishii == "からあげ":
    while True:  # 無限ループ
        result = random.choice(karaage_list)
        print(result)
        if result == 4:
            print("おめでとう！！")
            break  # 4が出たらループを抜ける
        elif result <= 3:
            print("もっと！！")
        elif result >= 5:
            print("がんばれ！！お前ならできる！！")
            
```

出力
```python
12
がんばれ！！お前ならできる！！
13
がんばれ！！お前ならできる！！
11
がんばれ！！お前ならできる！！
5
がんばれ！！お前ならできる！！
7
がんばれ！！お前ならできる！！
12
がんばれ！！お前ならできる！！
4
おめでとう！！
```
これでいいのか？？？？？？？？？？？

# 感想
こんな簡単なコードだけで、M-1という場で数分間やり続けたさや香は凄い。
「見せ算」も「からあげ4」も公式ドキュメントを出してほしい。
Secrets Management と Secrets Detection の違い

機密情報漏洩は、現代の企業にとって深刻な脅威です。近年、開発環境や本番環境における機密情報漏洩事件が相次いでおり、企業は情報漏洩対策を強化する必要性に迫られています。

Secrets Management と Secrets Detection は、機密情報保護のための重要な技術です。しかし、それぞれの目的と方法は大きく異なるため、混同しないことが重要です。

### Secrets Management とは？

Secrets Management は、機密情報の安全な保管と管理を行うための技術です。具体的には、以下の機能を提供します。

- アクセス制御: 誰が機密情報にアクセスできるかを制御
- 暗号化: 機密情報を暗号化して保存
- 監査ログ: 機密情報へのアクセスを記録

Secrets Management ツール を導入することで、以下のメリットを得られます。

- 機密情報の安全性を高める: 不正アクセスやデータ漏洩のリスクを低減
- アクセス制御による不正アクセス防止: アクセス権限を最小限に抑えることで、機密情報の不正利用を防ぐ
- 暗号化によるデータ漏洩防止: 万が一データが漏洩しても、情報の悪用を防ぐ
- 監査ログによる追跡調査: 機密情報へのアクセス履歴を記録することで、問題発生時の原因究明と再発防止に役立てる
 
代表的な Secrets Management ツール には、以下のようなものがあります。

- HashiCorp Vault
- AWS Secrets Manager
- Azure Key Vault

### Secrets Detection とは？

Secrets Detection は、ソースコードや設定ファイルなどから誤ってコミットされた機密情報の検出を行うための技術です。具体的には、以下の方法で機密情報を見つけ出します。

- 静的コード解析: ソースコードを解析して機密情報のパターンを検出
- 動的解析: アプリケーション実行時に機密情報へのアクセスを検出
- 機密情報スキャン: ファイルやデータベースから機密情報を見つけ出す


Secrets Detection ツール を導入することで、以下のメリットを得られます。

- 誤コミットによる情報漏洩を防ぐ: 開発者が誤って機密情報をコミットしてしまうリスクを低減
- 開発者にセキュリティ意識を向上させる: 機密情報の取り扱いについて注意喚起し、セキュリティ意識を高める
- 導入が比較的簡単: 既存の開発環境に組み込みやすい

代表的な Secrets Detection ツール には、以下のようなものがあります。

- GitGuardian
- Snyk
- Checkmarx

### Secrets Management と Secrets Detection の比較

| 項目  | Secrets Management  | Secrets Detection   |
|---|---|---|
|目的	|機密情報の安全な保管と管理	|ソースコード等からの機密情報の検出|
|方法	|アクセス制御、暗号化、監査ログ|	静的コード解析、動的解析、機密情報スキャン|
|メリット	|機密情報の安全性を高める	|誤コミットによる情報漏洩を防ぐ|
|デメリット	|設定や運用が複雑	|誤検知が多い場合がある|
|導入場所	|本番環境	|開発環境|	


### まとめ

Secrets Management と Secrets Detection は、機密情報保護という共通の目標を持ちながら、異なる役割を担っています。

- Secrets Management: 本番環境で使用される機密情報の管理
- Secrets Detection: 開発環境で使用される機密情報の検出

それぞれのメリットとデメリットを理解し、適切に使い分けることが重要です。

### 参考文献

- HashiCorp Vault: https://www.hashicorp.com/vault/
- AWS Secrets Manager: https://aws.amazon.com/secrets-manager/
- Azure Key Vault: https://azure.microsoft.com/ja-jp/services/key-vault/
- GitGuardian: https://gitguardian.com/
- Snyk: https://snyk.io/
- Checkmarx: https://www.checkmarx.com/
Vue： Best Practice

## コンポーネント名は常に複数単語にする

HTML要素は1単語になっている

コンポーネント名を１単語で定義すると、知らなかったHTML要素の名前とかぶったり、将来追加される要素と衝突が起こる可能性がある

そのため、コンポーネント名を定義する際は以下のように複数単語のパスカルケースで設定する

```js
Todo // ×
TodoList // 〇
```

## `props`に`type`を定義する

`props`の名前から一目で型が分かるようにすることは前提であるとして、意図していない方の変数を渡された場合に警告を投げるようにすることができる

```ts
defineProps({
  name: {
    type: String, // TypeScriptのstringではないことに注意
  },
});
```

`String`のほかにも`Array`、`Number`、`Object`、`Boolean`などがある

## `props`にでデフォルト値を設定する

たとえコンポーネントに値が渡されていない場合でもとりあえず使えるようにしておくためにデフォルト値を設定したいとき

デフォルト値の設定には以下の方法がある

チーム間でどちらを使うのか決めておくとよいだろう

- `withDefault`を使う

```ts
withDeaults(defineProps(), {
    name: "名無し" // デフォルト値
})
```

- `defineProps`の`default`を使う

```ts
defineProps({
    name: {
        type: String,
        default: "名無し" // デフォルト値
    }
})
// 同じ構文でdefineModelでもデフォルト値が設定できる
```

## `watch`でイベントリスナーを管理する

イベントリスナーの設定・破棄によく使われる`onMounted`と`onUnmounted`を`watch`で代用することができる

処理が1つのスコープに収まるので管理しやすくなる

```ts
/** 
element: ref（監視対象）
el: 新しい値
_: 古い値（ここでは使用しないためアンダースコア）
onCleanup: watchから渡される、監視対象が更新・破棄された場合の処理を記述できる関数
listener: イベント発火時の処理
*/
watch(element, (el, _, onCleanup) => {
    // 要素が存在する場合にイベント設定
    el && el.addEventListener("click", listener)
    // onUnmountedをonCleanupで代用
    onCleanup(() => el && el.removeEventListener(name, listener))
  })
```

## `computed`でHTML属性を動的に変更する

HTML要素の属性を動的に変更する際よく使われるのが、`ref`で真偽値を持ち、タグ内で三項演算子を用いて状態毎に属性を付けたり外したりするもの

処理が使われている場所と処理自身の所在が同じになるという利点があるが、複雑になったり、長い変数名を使ったりするとコードの見通しが悪くなる

そんな時に`computed`を用いることで処理の見通しを良くし、かつタグ内のコード量を減らすことができる

```vue
<div :class="{
    invalid: !isValid,
    valid: isValid,
    error: isError
  }">
```

```ts
const myComputedClasses = computed(() => {
    return {
        invalid: !isValid.value, 
        valid: isValid.value, 
        error: isError.value 
    }
})
```

## `defineAsyncComponent`でJSバンドルを減らして高速化する

使うときは使うがいつも必要ではないコンポーネントがよく出てくる

にもかかわらず、なにもしないとVueは使わないコンポーネントまでも一緒にバンドルされてしまう

`defineAsyncComponent`を使うと、初期状態では呼び出さないが、必要になったらロードするコンポーネントを指定できる

```ts
// コード上部にimport文は書かなくていい
const asyncModal = defineAsyncComponent(() => import('./Modal.vue'))
```

## 参考

- [Vue : \<script setup>](https://ja.vuejs.org/api/sfc-script-setup)

- [Qiita : Vue3 composition API ベストプラクティス【英語プレゼン抄訳】](https://qiita.com/herishiro/items/bacfc84af95a1819a794)

- [Vue 3 のヒントとベスト プラクティス](http://blog.livedoor.jp/nnmy/archives/55089344.html)

- [Vue スタイルガイド](https://v2.ja.vuejs.org/v2/style-guide/)
【読書メモ】ISUCON本 2章 モニタリング

## はじめに
**自己紹介**
未経験からWEB系エンジニアへの転職を目指している者です。現在はRuby on Railsを学習中です。

**この記事を書いたきっかけ**
現在、プログラミング学習コミュニティでISUCONの勉強会に参加しており、[『達人が教えるWebパフォーマンスチューニング〜ISUCONから学ぶ高速化の実践』](https://gihyo.jp/book/2022/978-4-297-12846-3)を読みながら学習を進めています。
情報整理とアウトプットの練習を兼ねてQiitaで読書メモを作成することにしました。
## 要点
2章の要点を個人的にまとめました。

[1.モニタリングとは](#モニタリングとは)
[2.モニタリングの手法](#モニタリングの手法)
[3.モニタリングツールのアーキテクチャ](#モニタリングツールのアーキテクチャ)

## モニタリングとは
**継続的なテストである**
Webサービスを提供する側にとってのモニタリングとはWebアプリケーションの状態を計測し、Webサービスが「高速であること」を保証し続けること。
具体的には、CPUやメモリのリソースが想定した使用率となっているかなどの状態の計測を継続して行い、異常時にはアラートで通知を受け取れるようにする。

## モニタリングの手法
**外形監視**
動作しているアプリの外側からモニタリングする手法。
Webサービスを利用しているユーザーとほぼ同じ経路を用いてアクセスを行い、正しく動作しているかを確かめる。
HTTPエンドポイントに対してHTTPリクエストを行い、レスポンスコードやレスポンスボディ、応答時間などを確認する。

外形監視のイメージ図(ISUCON本のp27図2を参考に作成)
![外形監視.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625095/22cede0c-30ce-d3a8-3efc-5ae31143819f.jpeg)


**内部監視**
動作しているアプリの内側からモニタリングする手法。
ユーザーの見えない部分の状態をモニタリングし、それらが意図しない状態になっていないかを確かめる。
内部監視するデーモンはエージェントと呼ばれ、サーバー毎に起動させる。

内部監視のイメージ図(ISUCON本のp28図3を参考に作成)
![内部監視.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625095/3569c92c-45bf-6480-dbc4-50ff682a6844.jpeg)



## モニタリングツールのアーキテクチャ
**モニタリングツールとは**
モニタリングツールは次のような機能を持つソフトウェア
- メトリクスを自動で収集、保存する
- 保存したメトリクスを時系列順に表示する
- メトリクスが特定の閾値に達すると通知する

**プル型**
モニタリングアプリケーションがクライアントとして、エージェントにメトリクスの取得をリクエストする。
エージェントはリクエストを受けとったときにメトリクスを収集しモニタリングアプリケーションに送信する。

プル型モニタリングのイメージ図(ISUCON本のp32図4を参考に作成)
![スクリーンショット 2024-03-08 9.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625095/37f5ec54-d229-fa72-da22-4054b80b9e22.png)

**プッシュ型**
所定のタイミングでエージェントがメトリクスを取得する。
エージェントがモニタリングアプリケーションへメトリクスを送信する。

プッシュ型モニタリングのイメージ図(ISUCON本のp33図5を参考に作成)
![スクリーンショット 2024-03-08 9.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625095/ba58bea1-5d1f-b6cc-0e76-cd253a35f7f1.png)

## 用語
<details><summary>メトリクス</summary>

- システムのヘルス情報やパフォーマンス情報を取得し、測定値をグループ化したもの
- 具体的にはCPU使用率、メモリ使用率、ディスク使用率、Data I/O、アクセス数など
</details>

<details><summary>シナリオテスト</summary>

- ユーザーが一連の流れに沿ってシステムを問題なく利用できることを確認するためのテストのこと
</details>

<details><summary>エージェント</summary>

- 監視対象のWebアプリにエージェントと呼ばれるソフトウェアをインストールして、CPUやメモリなどの稼働状況に関する情報を収集するもの
</details>

<details><summary>デーモン</summary>

- バックグラウンドで常駐稼働するアプリケーションのこと
</details>

<details><summary>ロードバランサー</summary>

- 外部からの通信（トラフィック）を複数のサーバーに分散する装置
</details>
CSSの単位について

## CSSの単位とは

CSSでは文字サイズや要素のサイズを指定する時に単位をつけて数値指定します。
単位には色々な種類はあり、大きく分けて「相対単位」と「絶対単位」の２種類があります。


## ⚪︎相対単位
相対単位はブラウザの表示領域や他の要素に指定したサイズを基準として相対的に算出される単位です。
基準サイズによって大きさが変化します。
相対単位は種類があるので、今回はよく使うものをまとめます。

## ・％
親要素を基準とした時の割合の単位です。
親要素の幅が６００pxの時、子要素に５０％を指定すると、子要素の幅は３００pxになります。
フォントサイズだと親要素が１６pxの時、１６px＝１００％になります。

## ・em
親要素のサイズを基準とした単位です。
フォントサイズに指定されることが多く、親要素のフォントサイズが１６pxの時、１６px＝１em
となります。

## ・rem
ルート要素<html>タグのサイズを基準に計算される単位です。
html要素のフォントサイズが１６pxの時、１６px＝１rem
となります。

## ・vw
「viewport width」の略で、ビューポートの幅を基準とした割合の単位です。
ビューポートとはブラウザでWebサイトを閲覧している時の表示領域です。
ビューポートの幅が１２００pxの場合、５０vwは１２００pxの半分の６００pxになります。
表示領域の幅によって変動します。

## ・vh
「viewport height」の略で、ビューポートの高さを基準とした割合の単位です。
ビューポートの高さが８００pxの場合、５０vwは８００pxの半分の４００pxになります。
表示領域の高さによって変動します。

## ⚪︎絶対単位
## ・px
Web上で使われる最も一般的な絶対単位です。
他の要素から影響を受けないので、１００pxと指定したら必ずそのサイズで表示されます。
タブレットやスマホなどデバイスにも対応させたい時は使う場面を考えましょう。
デバイスが変わっても要素のサイズを変えたくない時に使うと良いです◎



## 最後に
私もまだまだ単位についてどのタイミングで使用したらいいのか分からない時もありますが、相対単位でのサイズ指定はさまざまなデバイスに対応させたい時に使うと便利なので、数値を変えてみながら試して見ると良いと思います。
Rufusが起動しなくなった場合の対処法

# 目次

[1. はじめに](#1-はじめに)
[2. エラーの内容](#2-エラーの内容)
[3. エラーの原因](#3-エラーの原因)
[4. 直し方](#4-直し方)
[5. おわりに](#5-おわりに)

# 1. はじめに
Rufusを実行してもRufusのGUIが表示されない不具合が発生したので忘備録として記載します。

# 2. エラーの内容
Rufusを実行してもバックグラウンド処理が行われるだけで起動しません。この状態でシャットダウンや再起動をするとプロセスが起動中にはなっているため強制終了の確認画面になります。
稀にGUIが立ち上がってもすぐにプログラムが停止します。
Rufusの再ダウンロードを行っても改善しませんでした。

# 3. エラーの原因

**ゲームのコントローラーを有線接続していた**

Rufusは起動時にUSBデバイスをチェックしているようですが、ゲームのコントローラーには対応できず無限ループしているようです。

# 4. 直し方

**ゲームコントローラーの有線接続を解除する**

単純ですがこれに気付かず、だいぶ時間を浪費しました。

# 5. おわりに
あまりこの現象に困っている方はいらっしゃらないと思いますが、もし誰かの役に立つことができれば幸いです。
CursorからVSCodeに戻した話

# はじめに
昨年に登場した[Cursor](https://cursor.sh/)ですが、発表された際は「ついにこの時代が来たか...！」とワクワクしましたよね！
しかし、私自身実際に使ってみたものの、現在はVSCodeを利用しています...。
本記事では、私がCursorからVSCodeへ戻すに至ったポイントを記載していきたいと思います。

# 拡張機能でエラーが出る
1点目は一番大きな理由なのですが、拡張機能でエラーが出ることです。
エラーに遭遇した拡張機能は、[Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)というもので、Dockerコンテナやリモートサーバーへ接続してファイルを直接編集できる便利な拡張機能です。

![](https://storage.googleapis.com/zenn-user-upload/1bcd35802740-20240225.png)

個人開発であっても、自身のローカル環境を極力汚したくない私は、この拡張機能が使えなくなるのは辛く、他の拡張機能でも同様の問題が起こる可能性を考慮して、VSCodeへ戻す決断の一つとなりました。
（エラーを調査して解消する事自体はできるかもしれませんが、遭遇する度に調査するのめんどくさい。。。）

# GPT-4を利用するのに課金が必要
2点目は、GPT-4を利用するのに課金が必要なことです。
Cursorにアンテナを張れるエンジニアなら、ChatGPTやGithub Copilotに既に課金している人が多いのでは無いでしょうか？
Codebaseでプロジェクト全体の情報について参照できる点はすごく良かったですが、既にChatGPTやCopilotで事足りていた私は、課金をしてまでCursorにしたいと思える恩恵はそこまで感じる事ができませんでした...。

# Phindがすごく優秀
3点目は、VSCodeの拡張機能[Phind](https://marketplace.visualstudio.com/items?itemName=phind.phind)がすごく優秀なためです。
以下記事がとても参考になりました。

https://qiita.com/tsukky67/items/f0689e9b4c73324bb47b

記事でも記載の通りGPT-4が無料で利用でき、何より**精度がめちゃくちゃ良い**です！！！
最近「ChatGPTサボり気味じゃね？」と思っている人は是非使ってみて頂きたいです！

二つ問題点というか使いにくいところを挙げるとすれば、エンターキー押下で直ちにChatが送信されてしまうことと、返答が英語で返ってくることが多々あるくらいでしょうか。
エンターキー問題は、文面を別で作ってから送信することで対処できますし、英語で返ってくる事は大した問題じゃ無いですよね？...ね？

使いにくいところが大した問題と思わないくらいには、体感の精度が良いので重宝しています！

# まとめ
Cursorを実際に使ってみて、VSCodeに戻した件をまとめてみました。
現在私自身の開発は、VSCodeにてGithub CopilotとPhindを軸に手を動かし、文書量が多くなる様な複雑な相談はChatGPTを使っています。
Cursorへの移行を考えている人は、移行自体は手軽にできるためまずは使ってみてほしいですが、少しでも参考になりましたら幸いです！
軸別にSelf-Attentionするモデル【Axial-ResNet】



**原論文**
Axial-deeplab: Standalone axial-attention for panoptic segmentation.
https://arxiv.org/pdf/2003.07853.pdf






# 結論
軸別にSelf-Attentionすることで計算量を削減できた．





# 概要
画像認識モデルのCNNは，カーネルの範囲の情報を用いて計算するため，受容野が小さく，遠くにある画素の情報を考慮できない．ViTは，CNNの受容野を解決するように，画像全体の情報を考慮して計算が可能になった．しかし，ViTの構造上，CNNと比較して膨大な計算コストが必要になる．ViTの派生モデルで，Swinは，画像全体の受容野を制限して計算量を抑えた．けど，これは根本的な解決になっていない．
グローバルな認識ができて，さらに計算量を抑えたい．そこで，2次元で動作するViTを2つの1次元SAに因数分解することで，計算効率が良いViTを提案する．また，これに付随して，位置に敏感な構造も提案する．





# モデル構造

## axial-attention block

axial-attention blockを下図に示す．入力された($H \times W \times 256$)の3次元の特徴量を1x1Convでチャンネル数を圧縮し（$H \times W \times 128$）の特徴量を得る．これは，その後に処理されるAttentionの計算量を削減するためにやる．その後，縦方向のAttentionと横方向のAttentionをして，1x1Convでチャンネル数を$256$に戻して，入力された特徴量に要素和する．
例えば，ResNetの畳み込みblockとこのaxial-attention blockを入れ替えることで，いい精度が達成する．


![スクリーンショット 2024-03-08 8.40.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/785f242b-7328-fd85-50eb-dc6a982c7d7c.png)


## Multi-Head Attention （Height-Axis，Width-Axis）

下図に1headのAttention構造を示す．
$H$が特徴量の縦の長さ，$W$が横の長さ，$8$や$16$はチャンネル数を示す．
出力が（$H \times W \times 16$）なので，この出力が8種類（8head）あって，上図の（$H \times W \times 16$)$ \times 8$でConcatして（$H \times W \times 128$）に戻ってくる．

つまり，1headに（$H \times W \times 16$）が入力され，QとKは1x1Convで（$H \times W \times 8$），Vは（$H \times W \times 16$）の特徴量を得る．


## 軸のAttention
下図の左に示す．QKの特徴量をから，Hを引き離して（$W \times 8$）の部分で内積計算する．$8$の部分が相殺されて，（$W \times W$）になる．これとVの（$W \times 16$）で$W$が相殺して，（$W \times 16$）になる．
※Hの部分を外して考えてみるとわかりやすい．


Height-Axisの場合は，Hを外して考える．
Width-Axisの場合は，Wを外して考える．



![スクリーンショット 2024-03-08 8.34.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/522d3cb9-31c6-8520-df55-344878cf6c90.png)





## 軸＋位置情報を考慮したAttention
下図の右に示す．
主に，$r$で示される位置情報をかけることで位置を考慮した計算ができるようになる．Swinでも位置情報を考慮した構造を提案しているが，SwinはQのみに位置情報を付与しており，それは十分でない．なので，たくさんつけました．

QKの内積と，Qの位置情報，Kの位置情報の要素和して，Vと内積して，Vの位置情報を足して出力って感じ．





![スクリーンショット 2024-03-08 8.34.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/522d3cb9-31c6-8520-df55-344878cf6c90.png)


# 実験
1x1convで計算量が減って，軸別でAttentionをしたので，計算量が小さくなったのに，精度は向上した．

![スクリーンショット 2024-03-08 9.36.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/bc72dbe0-3bb2-b20a-645a-edb787ede5fb.png)




# まとめ
今回は，軸別にSelf-Attentionするモデル【Axial-ResNet】について解説した．ViTのSAの計算量が大きいので，削減したいけど，Swinのようにローカルになるのは違うよね．グローバルで削減できたのは良い．
ScoopでインストールしたAndroidStudioのアップデート時エラーの対処法

# ScoopでインストールしたAndroidStudioのアップデート時エラーの対処法

一度アンインストールして再インストールするのが確実

* AndroidSDKはDeprecated, android-cltを利用する
1. Android関連アプリをアンインストール
```
scoop uninstall android-studio android-clt gradle
```
2. キャッシュを削除
```
scoop/persist/android-studio
scoop/persist/android-clt
scoop/persist/gradle
~/.android
~/.m2
~/AppData/Local/Google/AndroidStudio*
~/AppData/Roaming/Google/AndroidStudio*
C:\android
./AppData/Local/AndroidStudio
./AppData/Local/kotlin
./AppData/Roaming/AndroidStudio
```
3. 再インストール
```
scoop install android-studio android-clt gradle
```
Androidアプリ開発｜アプリのページ内に含めることができるバナー広告は 1 つだけとのこと

# Googleからクローズドテスト審査で違反があると連絡
クローズドテスト審査で、Google側から『開発者プログラムポリシーに違反がある』とメールが届いた。開発したアプリの１画面内にバナー広告が複数あるのは違反であるとの事だった。各画面のバナー広告を一つだけに改修し、対応完了。

![スクリーンショット 2024-03-08 091119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724310/b70fe31f-4350-bb75-67f5-fa473442589b.png)

# 広告フォーマットの要件（Google Play ファミリー ポリシー）
子供と大人の両方をターゲット ユーザーとするアプリにおいて、子供または年齢不明のユーザーに広告を配信する場合は以下が禁止されています。

* 画面全体を占拠したり通常の使用を妨げたりして、閉じる手段をわかりやすく提示しない広告など、ユーザーを混乱させる恐れのある収益化要素や広告（たとえばウォール型広告） 
* 通常のアプリの使用やゲームのプレイを妨げ、5 秒経過しても閉じることができない収益化要素や広告（リワード広告やオプトイン広告を含む）
* 通常のアプリの使用やゲームのプレイを妨げない収益化要素や広告（たとえば、動画コンテンツに組み込まれた広告）は 5 秒以上表示できます
* アプリの起動の直後にインタースティシャル広告などを表示して収益化すること
* 1 ページに複数の広告を配置すること（たとえば、1 つのプレースメントに複数のクーポンを表示するバナー広告のほか、複数のバナー広告や動画広告の表示は許可されません）
* アプリのコンテンツと明確に区別できないような形で収益化要素や広告を配置すること（オファーウォールやその他の没入型の広告エクスペリエンスなど）
* 広告の表示やアプリ内購入を促す目的で、衝撃的な手法や巧妙に感情を操る策略を使うこと
* 閉じるボタンを使用したにもかかわらず別の広告をトリガーしたり、別の機能のためにユーザーが通常タップするアプリの領域に突然広告を表示したりして、ユーザーにクリックさせようとする虚偽の広告
* アプリ内購入に関して、仮想のゲームコインの使用と実際のお金の使用を明確に区別しないこと
【読書メモ】優れたリーダーは、なぜ傾聴力を磨くのか？

# はじめに
こんにちは。
前回記事に引き続き、読んだ本の読書メモになります。
業務に利用できそうな部分、共感を得られた部分を整理するということで記事にします。
※個人的な備忘録といった意味合いが強いと思いますのでご了承ください。

https://www.mikasashobo.co.jp/c/books/?id=100290400

# この記事のターゲット
* **自分は「部下の話をよく聞いているし、理解している！」と思っている人**(自分はできていると思っている人ほど読んでほしい本です。)
* 部下を持っている人
* チームを組んで仕事をしている人
* プロジェクトマネジメントやリーダーとして業務をしている人

# 傾聴力が上司の力量に任せっきりになっている

>　日本の多くの企業が、上司の力量に任せてしまっているこの「部下の話を聞く」ということ。
　もし、「傾聴力」を身につけて、しっかりと正しく実行することができれば、たくさんのメリットが返ってきます。

　傾聴力が上司の力量に任せてしまっているという点は確かにその通りだなと思います。
　コミュニケーション系の研修はいくらでもありますが、「部下の話を聞く方法」のように聞くことに焦点を当てている研修などは受けた記憶はありませんでした。組織のリーダーとなる人は、技術的なことだけでなく、こういったコミュニケーションスキルも習得していく必要があります。
　私の場合、コミュニケーション系のスキルを習得するために、本を読んだり、上司にコメントをもらうなどして情報をインプットして、記事投稿と実業務でインプットした情報をアプトプットするようにしてます。
　また、引用した箇所とは別部分で「上司から話を聞いてもらえなかった部下が昇進してリーダーになったら、部下の話を聞かないリーダーになると思うと、(中略)」といった記載もあり、スキル不足は個人的にとどまらず、組織全体にも関係すると思うと恐ろしいです。

# 会話の主導権

>　「部下の話を聞いているとおかしな方向にいってしまう」というので会話を再現してもらいました。
　(上司)「最近、何か課題はあるか。」
　(部下)「課題ですが、そうですね。1件、他部門が絡んでいる案件があって、その部の返信待ちですが、返事がなくて。ちょっと納期が厳しくなりつつあります。」
　(上司)「どこの部署だ？」
　(部下)「～部です。」
　(上司)「よし、私から一言いってきてやろう。」
 　この会話、一見よさそうに見えますが、終始、話の主導権を上司が握ってしまっています。上司は、部下の話を聞いているようで、部下が本当に話したいことは何も聞いていません。これでは、ただの業務報告です。こういった聞き方を続ける限り、いつまで経っても部下に主体性は生まれません。
　部下から話を聞く目的は、問題解決ではなく、信頼関係を気づき、部下が自分で考えられるようになることだとまず認識してみてください。

　まさしく、私自身、上記の例のような会話をよくやってしまっている記憶があります・・・笑
　問題解決ということでは、作業は進みそうですが、部下育成や傾聴力の向上といった観点だと最適ではなさそうです。上司が問題解決に動くことは重要ですが、いきなり問題解決方法を促すのではなく、「この件、どうやって進めるのがいいかAさんの意見を聞きたい。」「この件は～しようと思うけどAさん的にはどう思う？」というように主導権をお互いにもって進めれば、部下の主体性も育ちつつ、プロジェクトの品質を上げられると思います。


# 早合点が悲劇の元

>　前の項の「上司がせっかちで、部下の話が終わるのを待てない」ということに連動していますが、部下の話を聞いている上司が、早合点してしまうというのも悲劇のもとです。
　医者にたとえるなら、往診にきた患者さんの話を聞き始めてすぐに「風邪ですね」と診断してしまうようなものです。

 　傾聴力がないと起きてしまう事故で一番多そうな例だと思います。もちろん、あまりにも的外れなことを話していたら、相手が話している途中でコメントしますが、基本的に相手が言い終わるのを待つのが大事です。
 　個人的に「相手が最後まで言い終わるのを待つ」というのを日ごろから意識するようにしてます。自分以外の人が何か話していたら話の主導権はその人に任せて、早合点しないことは大事です。

# 部下の話を聞くときの手順
　ここまでは傾聴力や部下の会話を聞くことの重要性について記載したので、ここからは部下の話を聞く方法について記載します。手順として下記の10個紹介されておりました。
 　※具体的な方法や詳細を書いているとキリがないのでここでは割愛します。詳細を知りたい方はぜひ本を読んでみてください。決して著者の回し者ではありません。笑

>①：部下に「静かな時間」を提供しよう
②：復唱から始めてみよう
③：承認の言葉を使ってみよう
④：合いの手を入れてみよう
⑤：未来を問うてみよう
⑥：感情を問うてみよう
⑦：洞察を促してみよう
⑧：方向性を例示しよう
⑨：相手(部下)の意思を聞こう
⑩：笑って接してみよう

　①～④を試すだけでも、十分メリットはあるそうなので、ぜひ活用していこうと思います。本を読む限り、技術的に難しいことではない内容でしたので、明日から試せそうです。
 ここで大事なこととして、「⑤以降は相手の許可を得てからやる。」ということだそうです。具体的には「私の意見を言ってもいいか？」「質問してもいいか」と許可を取ることです。
 　許可を取る前にこちらの意見を言ってしまうと、前項で記載したような会話(主導権を常に上司が握っている。)になってしまい、部下から話を聞けなくなってしまうため注意しましょう。

# 最後に
　いかがでしたでしょうか。
　皆さんは、部下の話を聞けてましたか？理解できてたと思えました？冒頭に記載したとおり、個人的な備忘録といった意味合いが強めですが、どなたかの参考になれば幸いです。
　先日、下記の本を購入しました。機会があれば、今回のように記事にできればと思います。

https://www.shueisha.co.jp/books/items/contents.html?isbn=978-4-7976-8134-5
AZ-900をこれから取得する方へのアドバイス

## はじめに
IT業界未経験で私が最初に取得した資格がAZ-900です！
今回は、IT業界未経験で私がどのようにAZ-900を取得したか記載したいと思います。
これからAZ-900を取得される方の参考になればと思います。

## 用意した教材
1. [Microsoft認定資格試験テキスト AZ-900:Microsoft Azure Fundamentals](https://www.amazon.co.jp/Microsoft%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AZ-900-Microsoft-Azure-Fundamentals/dp/481561086X/ref=sr_1_1?adgrpid=111563095593&dib=eyJ2IjoiMSJ9.oqD2PpSSKstJNed7llRPZvk9958hPR-SODKO1xN_R1Zvi03JReb03qQSwXzWRWdVvkqx9_slcL83YP6SiBO4hF0Ahe_fmUY76PzEGhcrmax3TGRmHfC9_mg7TLvi5iX5Ukk-9iRo9Mzc_nlN5ZZke0fOQZX8RgB85tkFsziBPcWHIC_CSW2rz0zqnUrb4Ru3rGSL-pM-xKc737BYqtz_6VHlEYWO_HE1CbPKiI6NSQ92iFOhK4fYPwVqqDTmkFuYnyZdx84WnBcZFI2gVMypA-25cGLkHH0BTdBeIkJTDZ8.lPO0ji_QjVqa5iBbuWSZbekyYP42tNDYzqyJTP7Mxcw&dib_tag=se&gclid=CjwKCAiAxaCvBhBaEiwAvsLmWOzDW2Xy_5KkmIqfhrKcSFloOpKdoEXzIG9ijSmDH3IEnAWkBTLK8BoCrhIQAvD_BwE&hvadid=651101242932&hvdev=c&hvlocphy=1009280&hvnetw=g&hvqmt=e&hvrand=12658098770864930351&hvtargid=kwd-945710947373&hydadcr=7996_13626062&jp-ad-ap=0&keywords=az900+%E5%8F%82%E8%80%83%E6%9B%B8&qid=1709770648&sr=8-1)
このテキストでは、用語の説明が分かりやすく模擬問題もあり素晴らしいテキストでした。
1. [【6万人が受講】AZ-900 Microsoft Azure Fundamentals模擬試験問題集（7回分490問)](https://www.udemy.com/course/az-900-microsoft-azure-fundamentals4176/?couponCode=ST12MT030524)
Udemyで購入して利用する模擬試験問題集です。
セールの時に購入がベストだと思います！

## 勉強方法
#### 実際に私が実践していた勉強方法を記載します。
1. 先程紹介したテキストを理解するまで読み進めつつ分からない用語等は、ネットで調べて進めました。調べた用語は、確認用でノートにまとめました。
1. ひたすら模擬試験の往復をして間違えた問題の解説をしっかり読み込む
1. 毎日1~2時間は、絶対に勉強する。
1. 模擬試験の正答率が70~80%を超えた辺りで本試験の申し込みをする。
(あくまでも自分の場合ですのでこれから受ける方は、正答率90%台で受けた方が確実に受かります！）

## 参考サイト
#### Azureの理解を深める為に私が利用していたサイトも紹介します！
1. [Microsoft Azure とは？基本概要、5大メリット、主要サービスを解説](https://cloud.nissho-ele.co.jp/blog/azure_recommendation/)
1. [Microsoft Azure（アジュール）とは？基礎をわかりやすく解説](https://business.ntt-east.co.jp/content/cloudsolution/column-77.html)
1. [Azure 製品](https://azure.microsoft.com/ja-jp/products)

## 最後に
AZ-900は、Azureの資格の中でも初級に位置する資格で有効期限もない資格です。
資格手当として取得するのも良いでしょうが、自分で興味を持って勉強した方が
勉強の意欲に繋がりますのでこれから取得される方は、頑張って下さい。
話は変わりますが、現在自分は、AZ-104を学習しており苦戦しております…
取得出来た際には、また勉強方法を記載する予定です。
最後となりますが、この記事を読んで資格勉強のお役に立てればと思います。
VS vb.net,C# もう一つのデザイナーの喪失要因

# Visual Studio デザイナートラブル要因と対策２つ目
**１つ目の要因**
https://qiita.com/tattyan3/items/45276bd664ae703e4f2d
書いたが、部品の大きさ0がセットされるです。参照

**二つ目の要因**
少ないとは思いますが
**using** System;//などのusing指定の要素が抜けたり消した時。
間違いやすいのは**灰色(gray)**　になっていて消しても必要なのは出来て動くと言うところ。
また、**別ファイルでリストされている**のて良いのかと思って消す。
これも、動きますがデザイナで不都合が出ます。
**[対策]**
**Form . Classを新しく作りusingをすべてコピーして持って来て重なりだけ消す**
ガイドで変えたところは戻す。これで直ります。

**参考**

![スクリーンショット 2024-03-08 074819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/6a329cb8-ce8f-a573-2d2e-0847e2620b4a.png)
ガイドが出て消してもいいと言っても消したらダメです。

## もう一つ言いたい事　ファイルが古過ぎを見る
http://schemas.microsoft.com/developer/msbuild/2003   <- 2023じゃなくて20年前のだ。File system違っとるぞ httpやしhttpsじやなくて
Microsoft.NET.Sdk.DefaultItems.Shared.targets:  Properties and targets pulled from Microsoft.NET.Sdk.DefaultItems.targets
to be shared by the WAP project system
なにが、The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.や、こっちが、アンビリバボーやわ。

他にも
![スクリーンショット 2024-03-08 075459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/a15e714c-23da-6491-4bf0-ed6013225d58.png)
こんなの、結構ある。

![スクリーンショット 2024-03-07 215232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/db40bd6e-8d8e-b3c9-b09b-3a0a489ab8c8.png)
vs 2017でdownload紹介で２０２４の様に出ている。

リンクできないファイルは更新して欲しい。

命令語でも不都合は発生していますが別の機会にしたい。では。
LPIC201対策 - 論理ボリュームマネージャ

# この記事について

Linux Level 2 取得を目標としている筆者です。
先日 Level 1 を取得しましたが、短期詰め込みの暗記がしんどかったので、Level2はじっくり時間をかけていいから、ちゃんと理解してやっていきたい。

一方で、暗記も暗記で重要。

ということで、理解を深めるためにと、暗記しやすいように、両方の目的で、覚えたことを Qiita に整理してまとめながら受験対策することにしました。

# この分野で覚えること

## LVM とは

論理ボリュームマネージャ。
PV=物理ボリューム（物理的な記憶デバイスの領域）を複数まとめてひとつの大きなVG=ボリュームグループ（仮想的な領域）を作り、そこからLV=論理ボリュームを切り出す。

LVMを使うことで、**各領域を動的にリサイズできる**メリットがあり、物理的なパーティションの仕様に由来する制限を回避できる。

以下の手順で構成する。

1. fdisk コマンドで LVM用パーティションを作る
1. pvcreate コマンドで PV を作る
1. vgcreate コマンドで VG を作る
1. lvcreate コマンドで LV を作る
1. mdfsコマンドでファイルシステムを作る
1. ファイルシステムをマウントする

## PE - 物理エクステント

PVを構成する最小単位。
LVの最小構成単位もPE。

サイズは8KB〜512MBの間で自由に設定できるが、16MB、32MB、64MBあたりが一般的。

## LVのデバイスファイルのパス

`/dev/VG名/LV名` となる。

デバイスマッパーを利用している場合は、
`/dev/mapper/VG名-LV名` というパターンもある。

上記の場合、カーネル内では
`/dev/dm-x` (xはカーネルが自動付番し変動する) として扱われる（が、ユーザーが直接これを触ることはない）

## lvcreate コマンド

```:書式
lvcreate [オプション] ボリュームグループ名
```

|オプション | 意味 |
|:-|:-|
|-L ボリュームサイズ|ボリュームサイズを指定|
|-n 論理ボリューム名|論理ボリューム名を指定|
|-s|スナップショットを作成|

## ボリュームグループに属する論理ボリュームのマウント

```:書式
mount /dev/ボリュームグループ/論理ボリューム マウント先
```
## ファイルシステムのリサイズ・拡張のためのコマンド

| コマンド | 意味 |
|resize2fs|ext2/ext3/ext4のファイルシステムのリサイズ|
|resize_riserfs|ReiserFSのリサイズ|
|xfs_growfs|XFSのファイルシステムの拡張|

## コマンド

| コマンド | 意味 |
|:-|:-|
|vgremove|VGを削除|
|vgreduce|VGを構成しているPVを取り除く|
|pvremove|PVとしてフォーマットされているHDのパーティションから、PVとしてのデータ構造を削除|
|pvmove|PVの内容を、PE単位で別のPVに移動する。vgreduceを実行する前に、該当のpvの内容が失われないようにするために実施する。|
|lvextend|LVを拡張する（再起動不要）|
|lvreduce|LVの容量を減らす|
|lvremove|LVを削除し、VGの空き領域に戻す|
|vgdisplay|VGの情報（名称、サイズ、フォーマット、PEの情報）を表示する|

# 以上！

勉強が進んだら適宜追記・修正などしていきます。