OmniAICreator/Qiita-1.07M huggingface dataset:
Rで解像度の高い図を出力するためのplot()の設定

Rで`jpeg`や`tiff`といった関数をデフォルトのままの設定で使うと、解像度のあまり高くない図が出力されます。自分で確認する用にはいいとしても、論文など正式な場に向けた図としてはもう少し解像度を上げたいところです。

```R
x <- 1:10
y <- x + rnorm(10)
lmm <- lm(y ~ x)

jpeg('Fig1.tiff')
plot(x, y, main = 'Title')
abline(coef(lmm))
dev.off()
```

![Fig1.tiff](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607418/17b68b95-0dc7-5237-4741-6d5ad6318436.tiff)

しかし、図の出力サイズだけを大きいものにすると、相対的に点や文字が小さくなってしまいます。

```R
jpeg('Fig2.tiff', width = 2000, height = 2000)
plot(x, y, main = 'Title')
abline(coef(lmm))
dev.off()
```

<img width="400" alt="Fig2.tiff" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607418/1552f25c-0fae-af3e-e72b-407712d9a4e4.tiff">

体裁を整えるため、パラメータを色々と設定しました。誰かの役に立つかもしれませんので、結果を載せておきます。

```R
# mgp (margin gap?) はプロットエリア（プロットを囲う四角）と
# 軸タイトル・軸ラベル・軸との距離を表す。
# 複数回登場するので、事前に指定しておく。
mgp_x <- c(15, 2.5, 0) # x軸の設定
mgp_y <- c(12, 2.5, 0) # y軸の設定

jpeg('Fig3.tiff', width = 2000, height = 2000)

par(mar = c(20, 20, 20, 5)) # プロットエリア周囲の余白の大きさ（下, 左, 上, 右）

plot(x, y, 
     cex  = 10,      # 点の大きさ（character extention/expansion）
     lwd  = 3,       # 点を描く線の太さ（line width）
     xaxt = 'n',     # x軸を描かない（x axis type）
     yaxt = 'n',     # y軸を描かない（y axis type）
     ann  = FALSE)   # 軸タイトルを描かない（annotation）
abline(coef(lmm), 
       lwd = 5)      # 線の太さ

axis(side      = 1,  # プロットエリアの下に軸を描く
     cex.axis  = 7,  # 軸ラベルの大きさ
     padj      = 1,  # 軸ラベルを描く位置の基準点を、文字の上端に指定
     tcl       = -2, # 軸目盛の長さ（正の値だと目盛がプロットエリア内に伸びる）
     lwd.ticks = 4,  # 軸目盛の太さ
     mgp       = mgp_x)
axis(side      = 2,    
     cex.axis  = 7, 
     tcl       = -2, 
     lwd.ticks = 4, 
     mgp       = mgp_y)

title(xlab     = 'x', 
      cex.lab  = 9,   # 軸ラベルの文字サイズ
      mgp      = mgp_x)
title(ylab     = 'y', 
      cex.lab  = 9, 
      mgp      = mgp_y)
title(main     = 'Title', 
      cex.main = 9)   # タイトルの文字サイズ

box(lwd = 4) # プロットエリアを囲む四角の線の太さ

dev.off()
```

<img width="400" alt="Fig3.tiff" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607418/df06e208-7be3-f579-fc42-2fee38b01b52.tiff">
C言語ーSSHライブラリ三選

## 目次
- SSHとは
- C言語でSSHライブラリ三選
    - libssh
    - openssh
    - libssh2

## SSHとは
SSH（Secure Shell）は、ネットワーク上のコンピューター間で安全にログインし、コマンドを実行するためのプロトコルです。SSHは主にリモートシステムへのアクセスや、ネットワークサービスの管理に使用されますが、ファイルの転送やポートフォワーディングなど、他の多くの用途にも使われています。

SSHの主要な特徴は以下の通りです：

1. **暗号化**: SSHは通信を暗号化することで、インターネット経由で安全にデータを送受信します。これにより、第三者からの傍受や改ざんから保護されます。

2. **認証**: SSHはパスワードや公開鍵を使用してユーザーを認証します。公開鍵認証はパスワード認証よりも安全で、自動化されたアクセスに適しています。

3. **コマンド実行**: SSHを介してリモートコンピューターでコマンドを実行でき、その出力をローカルコンピューターで受け取ることができます。

4. **ファイル転送**: SSH上で動作するSFTP（SSH File Transfer Protocol）やSCP（Secure Copy Protocol）を使用して、安全にファイルを転送できます。

5. **ポートフォワーディング**: SSHはポートフォワーディングを提供し、特定のポートでのリモートアクセスを可能にします。これにより、ファイアウォールの背後にあるサービスに安全にアクセスできます。

6. **接続の持続性**: SSHクライアントとサーバーは、接続を維持するメカニズムを備えており、必要に応じて再接続を試みることができます。

SSHはインターネット上のリモートアクセスと通信の**安全**を確保するための標準的な方法として広く採用されています。SSHクライアントとサーバーのソフトウェアは、多くのオペレーティングシステムに組み込まれているか、個別にインストール可能です。


## C言語でSSHライブラリ三選
### libssh
libssh は、libssh ライブラリを開発し使用するためのオンラインリファレンスで、 libssh の C API と C++ ラッパーについて書かれています。 リンクマニュアルを読んで libssh をアプリケーションにリンクする方法を学び、 関連する関数のチュートリアルやドキュメントを読むことができます。 libssh ライブラリは、鍵交換方式、公開鍵アルゴリズム、暗号、 圧縮方式、MAC ハッシュ、認証方式、チャネルタイプ、グローバルリクエスト、 チャネルリクエストなど、いくつかの機能を提供します。 さまざまな暗号化・復号化アルゴリズムが、認証や通信チャネルのさまざまなオプションとともに含まれています。libssh はスレッドセーフでノンブロッキングな操作にも対応しています。 適切なメソッドや機能を選択することで、ニーズに合わせて libssh ライブラリを開発・使用することができます。

https://api.libssh.org/stable/index.html

### openssh

OpenSSH は広く使われているオープンソースの SSH (Secure Shell) ツールスイートで、安全で暗号化されたネットワーク通信機能を提供します。OpenSSH はパスワード認証や公開鍵認証を含む複数の認証方式をサポートし、リモート操作のための ssh、scp、sftp などのさまざまなツールや、鍵管理、サーバサイドのコンポーネントを提供します。

OpenSSH はさまざまな暗号化アルゴリズムやセキュリティプロトコルを使って データ転送のセキュリティを確保し、リモートログインやコマンド実行、 ファイル転送、ポート転送のための SSH プロトコルをサポートしています。 もともとは OpenBSD プロジェクトによって開発され、 Windows、Linux、macOS を含むいくつかのオペレーティングシステムで 広く使われてきました。

https://www.openssh.com/

### libssh2
libssh2 は SSHv2 プロトコル専用のクライアントサイド C ライブラリで、 SSH2 のネットワークトランスポート、ユーザ認証、セッション管理機能を実装し、 SFTP プロトコルのファイル転送機能を提供します。 また、複数のプロセス/スレッド、ノンブロッキングモード、 ユーザ定義のメモリ管理関数をサポートしています。

libssh は SSHv1 と SSHv2 の両方をサポートしていますが、 libssh2 は SSHv2 プロトコルに焦点を当てており、SSHv1 をサポートしていません。 さらに、libssh2 はサーバサイドのサポートを提供していませんが、 libssh はサーバサイドの .NET Framework をサポートしています。

libssh2 の API 設計はシンプルで、既存の C/C++ コードに統合するのが簡単です。一方、 libssh はより多くの機能と、サーバサイドのサポートや GSSAPI 認証を含む、 より包括的な SSH プロトコルのサポートを提供しています。

全体として、libssh2 は SSHv2 プロトコルを使った安全なネットワーク通信を必要とする クライアントサイドのアプリケーション向けの軽量なソリューションであり、 libssh はクライアントサイドとサーバーサイドの両方の開発を含む、 SSH プロトコルの完全なサポートを必要とするアプリケーションに適しています。 開発者は、プロジェクトの要件や特定の使用シナリオに基づいて適切なライブラリを選択することができます。

https://libssh2.org/

以上です。
ローカルストレージとセッションストレージの違いって？

### ローカルストレージ（Local Storage）
保存期間:
ローカルストレージに保存されたデータは、特定のウェブサイト（ドメイン）に関連付けられており、ブラウザを閉じてもデータは保持される。明示的に削除されるか、プログラムでクリアされるまでデータは残り続ける。

容量:
各ドメインごとに約5MBの容量制限が一般的な模様（もちろんブラウザによって異なる）。

データの共有:
同じドメイン内のすべてのページでデータを共有。

用途:
ユーザーの設定、テーマ選択、言語設定など、**長期間**にわたって保持されるデータを保存するのに適している。

### セッションストレージ（Session Storage）
保存期間:
セッションストレージに保存されたデータは、**ユーザーがページを閉じるまで**有効。ブラウザやタブを閉じるとデータは消去されます。

容量:
ローカルストレージと同様に、各ドメインごとに約5MBの容量制限が一般的な模様。

データの共有:
同じセッション（タブやウィンドウ）内でデータが共有されるが、異なるセッション（つまり、別のタブやウィンドウ）間ではデータは共有されない。

用途:
ユーザーがページを移動する際に一時的に必要なデータ、例えばフォームの入力内容や一時的なセッション情報を保存するのに適している。

### まとめ
どちらもウェブブラウザにデータを保存するための方法ではあるが、
ローカルストレージ: 長期的なデータ保存が必要な場合に使用。
セッションストレージ: 一時的なデータ保存が必要な場合に使用。

それなら大は小を兼ねると言いますし、迷ったらとりあえずローカルストレージを使えばいいんじゃない？
セッションストレージを使った方がいい時って？
→以下の観点で使い分けを考慮するべき

#### 1. セキュリティなどの点で短期間でデータを破棄したい場合
セッションストレージはブラウザやタブを閉じると自動的にデータが削除されます。これにより、ユーザーがページを閉じた後にデータが残らないため、機密性の高い情報や一時的なユーザーデータを保存する場合に有効。たとえば、ログイン状態や一時的なセッション情報など、ユーザーがログアウトしたり、タブを閉じたら消去されるべきデータにはセッションストレージが適している。

#### 2. タブやウィンドウ間でデータを共有したくない場合

セッションストレージは同じタブ内だけでデータを共有する。別のタブやウィンドウを開いた場合、そのセッションには別のセッションストレージが作成され、データが共有されません。これにより、複数のタブで同じアプリケーションを使っていても、各タブが独立したセッションを持つことができます。そのため、同アプリケーションで異なるタブを使用し異なるアカウントでログインするなどのケースが考えられる時は、セッションストレージを使うのが吉。

#### 3. パフォーマンスを向上させたい場合
当然ですが、ローカルストレージに大量のデータが蓄積すると、データアクセスのパフォーマンスが低下する可能性を引き起こします。セッションストレージは一時的なデータ保存に適しているため、必要以上にローカルストレージへデータを蓄積しないことで、全体的なパフォーマンスの向上が期待できます。
Next.js プロジェクト作成

### 1. 任意の名前でプロジェクトディレクトリを作成
```
mkdir [ プロジェクトディレクトリ名 ]
```

### 2. 作成したディレクトリ内に package.json を作成
↓ package.json の内容
```
{
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start"
  }
}
```

### 3. プロジェクトディレクトリ配下に pages ディレクトリを作成
```
mkdir pages
```

### 4. pages ディレクトリ内にトップページファイルを作成
↓ サンプルソース
```
export default () => <div>
	<h1>Next.js</h1>
	<div>Welcome to Next.js!</div>
</div>
```

### 5. プロジェクトを実行して確認
```
npm run dev
```

### 6. ブラウザで確認
```
http://localhost:3000/
```

### 7. プロジェクトディレクトリ配下に next.config.js を作成
↓ next.config.js の内容
```
module.exports = {
  output: 'export',
  exportPathMap: async function() {
    return {
      '/': { page: '/' },
    };
  },
};
```

### 8. プロジェクトをビルド
```
npm run build
```

### 9. ビルド後のファイルをブラウザで確認
ビルド完了後、プロジェクトディレクトリ内に
「 out 」というディレクトリが生成されているので
この out ディレクトリを Webサーバ上に配置して確認
nanoエディタとvimエディタの使い方（まとめ）

### 1. nanoエディタの基本操作（Macの場合）

nanoは初心者にも使いやすいテキストエディタで、画面の下部に操作方法が表示されるため直感的に操作が可能です。

#### ファイルを開く
```bash
nano ファイル名
```
例:
```bash
nano /private/etc/hosts
```

#### 基本操作
- **保存する**: `Ctrl + O`（「Write Out」）、Enterキーで確定
  - 画面下部に「File Name to Write:」と表示されるのでEnterキーを押して保存を確定します。
  
- **終了する**: `Ctrl + X`（「Exit」）
  - 変更がある場合、「Save modified buffer?」と表示されるので、`Y`（Yes）を押して保存するか、`N`（No）を押して保存せずに終了します。

- **検索する**: `Ctrl + W`（「Where Is」）
  - 画面下部に「Search:」と表示されるので、検索したい文字列を入力してEnterキーを押します。

- **カット（切り取り）**: `Ctrl + K`
  - カーソルがある行全体をカットします。

- **ペースト**: `Ctrl + U`
  - カットした内容をカーソル位置にペーストします。

- **ヘルプを表示**: `Ctrl + G`
  - nanoの操作方法に関するヘルプが表示されます。

### 1. vimエディタの基本操作（Macの場合）

vimはより強力でカスタマイズ性が高いエディタですが、操作に慣れるまで時間がかかることがあります。vimには「通常モード」と「挿入モード」があり、モードに応じてキーの動作が異なります。

#### ファイルを開く
```bash
vim ファイル名
```
例:
```bash
vim /private/etc/hosts
```

#### 基本操作

- **挿入モードに入る**: `i`
  - これでテキストの入力が可能になります。

- **挿入モードを終了し通常モードに戻る**: `Esc`
  - 挿入モードから通常モードに戻ります。

- **保存して終了する**: `:wq`
  - 通常モードで `:` を押してコマンドラインモードに入り、`wq` と入力してEnterキーを押します。`w`は「write（保存）」、`q`は「quit（終了）」の意味です。

- **保存せずに終了する**: `:q!`
  - 通常モードで `:` を押してコマンドラインモードに入り、`q!` と入力してEnterキーを押します。`!`は強制終了の意味です。

- **検索する**: `/検索文字列`
  - 通常モードで `/` を押してから検索したい文字列を入力し、Enterキーを押します。次の一致箇所に移動するには `n` キーを押します。

- **コピーする**: `yy`
  - 通常モードで `yy` を押すと、カーソルがある行全体をコピーします。

- **ペーストする**: `p`
  - 通常モードで `p` を押すと、コピーした内容をカーソルの次の行にペーストします。

- **カット（切り取り）**: `dd`
  - 通常モードで `dd` を押すと、カーソルがある行全体をカットします。

申し訳ありません、説明が少し混乱させてしまったかもしれません。モードについての説明は主に`vim`エディタに関するものです。`nano`エディタにはモードという概念はなく、すべての操作が同じ画面から行われます。

### 3. vimエディタのモードについて

#### 通常モード
- **説明**: vimを起動したときに最初に入るモードです。テキストの編集や移動などのコマンドを入力します。
- **主なコマンド**:
  - `dd`: 行を削除
  - `yy`: 行をコピー
  - `p`: ペースト
  - `:`: コマンドラインモードに移行
  - `/`: 検索モードに移行

#### 挿入モード
- **説明**: テキストを直接入力するモードです。通常モードから`i`キーを押すとこのモードに入ります。
- **主なコマンド**:
  - `i`: カーソルの位置にテキストを挿入
  - `a`: カーソルの次の位置にテキストを挿入
  - `Esc`: 挿入モードを終了し、通常モードに戻る

#### コマンドラインモード
- **説明**: 通常モードで`:`を押すとこのモードに入ります。ファイルの保存や終了などのコマンドを入力します。
- **主なコマンド**:
  - `:w`: ファイルを保存
  - `:q`: vimを終了
  - `:wq`: 保存して終了
  - `:q!`: 保存せずに強制終了

#### ビジュアルモード
- **説明**: テキストを選択するモードです。通常モードから`v`キーを押すとこのモードに入ります。
- **主なコマンド**:
  - `v`: ビジュアルモードに入る
  - `V`: 行全体を選択するビジュアルモードに入る
  - `Esc`: ビジュアルモードを終了し、通常モードに戻る
【ChatGPT＋Code Interpreter】でチェスボードパターンを描きます。


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

　今回は、チェスボードパターンを描きます。

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

　まずは、ニュース。

　というほどのことではないのですが。

　MicrosoftのCopilot、
　　いつのまにか日本語での
　　　描画ができるように
　　　　なっていました。

　これまで
　　日本語での指示は
　　　“対応していません”的な
　　　　メッセージが出てきました。

　英語での指示でしか
　　描画してくれませんでした。

　それが日本語で
　　指示して描画してくれるのです。
***
　次のニュース。

　AnthropicのClaudeですが、
　　アプリ版（無料版）は、
　　　これまで3.5 Sonnetでした。

　それが現在では
　　3 Haikuになっていました。
![Screenshot_20240822-082349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/89566829-3c49-3a44-4434-e456c62b3394.png)

　Web版は
　　変わらず、3.5 Sonnetでした。　　

　Anthropicからは
　　何もアナウンスは
　　　ありませんでした。

　Claudeを
　　お使いの方は
　　　お気を付けてくださいね。

　それから
　　有料版のClaudeも
　　　“返答がおかしい”という報告が
　　　　いくつも上がっています。
　　　　　こちらもご注意を。
***
　もひとつニュース。

　画像生成AIの
　　Midjourneyですが、
　　　DiscordかGoogleの
　　　　アカウントで
　　　　　サインアップすると、
　　　　　　25枚まで画像を
　　　　　　　生成できるように
　　　　　　　　なりました。
[ITmedia NEWS](https://www.itmedia.co.jp/news/spv/2408/22/news090.html)

　ちなみに
　　これは無料トライアルみたい。
　　　やるなら今！
[Midjourney公式ポスト](https://x.com/midjourney/status/1826305298560418171?t=MWU9Wu_WmXVc8B-_bAl3jA&s=19)
***
　それからAIとは関係ありませんが、
　　オリエント工業が
　　　廃業することに
　　　　なりました。

　ラブドールを
　　開発・販売してきた
　　　企業です。

　エロ雑誌に
　　掲載があったから
　　　見た人もいるかと。

　単なる性処理用の
　　ドールというよりも
　　　使用者に寄り添うドールを
　　　　目指していたそうです。

　廃業理由は
　　社長さんが健康を優先するため
　　　だそうです。
　　　　半世紀近くやっていたので
　　　　　身体に無理が効かなくなった
　　　　　　のかもしれませんね。
***
　さて、本題です。

　今回は、
　　チェスボードパターンを
　　　作成します。

　なんだそりゃ、と
　　言われそうですが、
　　　Code Interpreterで
　　　　描くことが目的です。

　しかも今回は、
　　OpenCVを使ってのものです。

　出来上がりがこちら。
![chessboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/be666209-c96f-e3f2-cc03-bc7983daeff3.png)

　Promptはこちらです。
```Text:
OpenCVを使って、チェスボードパターンを作成してください。
```

　まだまだOpenCVを
　　どう使っていいのか
　　　わかりません。
　　　　何かわかれば
　　　　　また書きますね。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
記事掲載でやらかした話（炎上はまだしてないはず。。。

# ページが開けなくなった
[前の記事](https://qiita.com/AsilHatake/items/bec3386dade9522a3685)で、調子に乗って指定された最大条件で動かした際の結果を貼り付けて投稿したところ、
投稿自体は何ら問題なく出来たけど、
対象ページを開くとブラウザがフリーズしてしまう事象が出てしまった。

## サイズ的には問題ないけど。。。
試しにその問題になった結果をファイルに保存して見たけど1MBぐらいしかなくて、
Qiitaの記事の最大サイズの100MB制限には微塵も引っかからなかったため投稿自体は出来てしまった。

# 編集が出来なくてツムツム
Qiitaでの記事編集は、マイページの記事一覧からは直接できなくて、1回対象のページに行かないとメニューが出てこないという残念仕様なので、そもそも重くて記事に行けないという時には編集が出来ない。。。

## とにかく編集したいんだ！（炎上回避のため
こんな拙い記事を誰が見るんだって話ではありますが、
もしたまたま迷い込んで開いてしまったときにフリーズしたとかだと、
下手したら炎上してしまうのではないかということで、
とりあえず記事が開くまで気長に待ってみることに。

## ガンバレよ、もっと熱くなれよ（CPU
ただ3分、5分、10分...と待てど暮らせど、一向にブラウザは表示してくれないし、クリックでもしようもんなら「待機 or ページ離脱」を迫ってくるアラートを出して来る始末。

## 痺れを切らして別の方法を模索
他のページではどうやって編集にいくんだろうということで、問題ないページを開いて、編集にいくメニューをホバーしたところURLが表示された。
`https://qiita.com/drafts/[ページのID的な文字列]/edit`

## あれ？コレ行けんじゃね？
てっきりOnClickでJavaScriptでURL生成していってるんじゃないかと思ってたけど、URL直アクセスで行けそうだったため、マイページに戻り記事の一覧から問題のページのURLをコピり、そのURLから画面ID的な文字列を上のURLに貼っつけてブラウザに入力したところ。。。

# やっと編集できましたわ。。。
無事に編集画面にたどり着き、急いで色々となかったことにして再掲載した次第です。

## 教訓
興味本位で色々やらない（違う、そうじゃない
まぁでも、【流石にこの量を投稿しちゃまずいだろうな】ということを念頭に置いて記事を書くべきだなということは身を持って理解できたので、結果オーライかなと。

# なぁぜなぁぜ？
全体で1MBじゃなくて1行が1MBとかとんでもない場合、ブラウザが対処しきれなくてダメなんじゃね？という予測。
つまりコレって【1行に〇〇文字入力した記事を投稿するとフリーズする】っていうトリビアになりませんか（へぇ～

Qiitaさん、ぜひ検証してみて入力制限をかけるようにしてください！（他人任せ
そもそも100MB制限かけてるのに、ソレを下回ってても表示が出来ないなんて不具合じゃないんですか？という疑問を残しつつ締めます。
mapメソッドとforEachメソッドの基本的な違い

## アジェンダ
mapメソッドとforEachメソッドの基本的な違いについて簡単にまとめます。

## 違い/共通点
### 違い
:::note info
- **戻り値**があるかないか。
`map`は**新しい配列**を返すが、`forEach`は**何も返さない**。
:::

### 共通点
:::note info
- 各要素に対しての処理を行う。
- 元の配列を**編集しない**。(非破壊的メソッド)
:::

## 詳細
### map:
  - 各要素に対して指定した関数を実行し、その**結果を新しい配列として返します**。
  元の配列を変えずに、新しい配列を作成する場合に使用します。

  ```javascript
  const array = [1, 2, 3];
  const newArray = array.map((element) => element * 2);
  console.log(newArray);  // [2, 4, 6] - 元の配列の各要素を2倍にした新しい配列
  ```

### forEach:
  - 各要素に対して指定した関数を実行しますが、**戻り値はありません**。
  配列を変更せず、単に副作用を伴う処理（例えば、ログを出力したり、他の値を変更したりすること）を行う場合に使用します。

  ```javascript
  const array = [1, 2, 3];
  array.forEach((element) => {
    console.log(element * 2);  // 各要素を2倍にしてコンソールに出力
  });
  // 出力: 2, 4, 6
  ```

## まとめ
- **新しい配列が必要**な場合は `map` を使用して、変換された値を新しい配列として返します。
- **戻り値が不要**で、副作用を伴う処理を行う場合は `forEach` を使用します。

## 参考
- [Map - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map)
- [Array.prototype.forEach() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
EC2へのアクセス元IPを特定する方法

最近、EC2のAuto Scalingグループがスケールアップした際に、ALB（Application Load Balancer）のリクエスト数が急に増えましたが、IPアドレスからリクエストが来ているのかが分からなかったのでメモ程度に残します。

**方法:**
1. **ELBのアクセスログを確認する:**  
最初に試すべきは、ALB（Application Load Balancer） のアクセスログを確認することです。このログには、どのIPアドレスからリクエストが送られてきたかが記録されています。ログは、AWSコンソールやCLIから取得できます。この方法で、リクエスト元のIPアドレスを簡単に特定できます。
ALBのアクセスログはS3に保存されています。



※以下からは確認できないので注意
    
    Auto Scalingログ
   Auto Scalingログは、イベントやアクティビティを記録するためのものであり、リクエスト元のIPアドレスを含みません。したがって、リクエスト元IPを特定するためには、Auto Scalingログを使用することはできません。

    EC2インスタンスのログ
    
   EC2インスタンスのログは、そのインスタンスで実行されたアクティビティを記録しますが、リクエスト元のIPアドレスを含みません。そのため、EC2インスタンスのログを使用してリクエスト元IPを特定することはできません。サーバ内にアクセスログなどあれば見れるとは思いますがALBから見たほうが安易
tmux の使い方 ( 自分用でもある )

``tmux new -s <name>``
**新しいセッションを作成する**

**実行したいコマンドを実行する** (sh run.shなど..)

実行したら ``Ctrl+B`` の後に ``D`` を押す

**再度アタッチする場合**
``tmux a -t <name>``

**現在アクティブなセッションリストを見る**
``tmux ls``
Excelでカーソルキーでセル移動ができなくなったときの対処法

## Excelでカーソルキーでセル移動ができなくなったときの対処

Excel使用していたらカーソルキーでセル移動ができずスクリーンが移動してしまう場合は
ScrollLock状態になってます。

スクロールロック状態を解除するには、「Scroll Lock」キーを押せばOKです。

キーボード上には、「Scroll Lock」や「Scr Lk」という表記になっています。
DockerでMySQLが立ち上がらなかった

DockerでMySQLが立ち上がらなかった、ハマってしまったのでメモで残しておきます。

WordPress用にmysqlを作成したく以下のコマンドを入力


    docker run --name mysql -dit --net=wordpress -e MYSQL_ROOT_PASSWORD=Password -e MYSQL_DATABASE=wordpressdb -e MYSQL_USER=mysql -e MYSQL_PASSWORD=Password mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password


オプションを外して以下コマンドを入力

     docker run --name mysql000 -dit --net=wordpress -e MYSQL_ROOT_PASSWORD=Password -e MYSQL_DATABASE=wordpressdb -e MYSQL_USER=mysql -e MYSQL_PASSWORD=Password mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

### 成功時の出力

    Unable to find image 'mysql:latest' locally
    latest: Pulling from library/mysql
    c72f53f7235b: Pull complete 
    c7e4ed755af2: Pull complete 
    6c8c802f90bc: Pull complete 
    eecc55f854cd: Pull complete 
    cc8dabc09813: Pull complete 
    e376e56dbcf9: Pull complete 
    bd552de0e856: Pull complete 
    78c8170ad3df: Pull complete 

その後プロセス状況を確認し、mysqlが立ち上がっていることを確認


    docker ps 
    CONTAINER ID   IMAGE       COMMAND                   CREATED          STATUS          PORTS                  NAMES
    ac77908fb050   mysql       "docker-entrypoint.s…"   10 seconds ago   Up 9 seconds    3306/tcp, 33060/tcp    mysql
    13232cbf8399   wordpress   "docker-entrypoint.s…"   22 minutes ago   Up 22 minutes   0.0.0.0:8085->80/tcp   wordpress


### 初めに実行したコマンドで問題が発生した原因

    --default-authentication-plugin=mysql_native_password 
MySQLオプションオプションを指定した際に、MySQLバージョンやイメージの互換性に問題がある場合、コンテナが正常に起動しないことがあります。このオプションは、MySQL 8.0以降で必要な場合に使用しますが、場合によっては不要です、勉強用で環境構築くらいであれば、不要になると思います。

###  まとめ

今回の問題は、MySQLコンテナを立ち上げる際のコマンドオプションに問題があったことが原因でした。オプションの見直しと修正を行うことで、正常にコンテナを立ち上げることができました。
【備忘録】GitHubのレポを新規プロジェクトとしてClone(fork)するやり方の備忘録

## 既存のプロジェクトを再利用して新規プロジェクトの叩き台にする
色々とプロジェクトやアプリの破片を作ってはGitHubに保存してきたのですが、たまにそれに手を加えて新しいプロジェクトとして作り直したいなあという事がよくあり、クローンの手順を踏むのですが、よく手順を忘れるのでここに備忘ログ。Firebaseをよく使うので、Firebaseプロジェクトのクローン手順。
### １、下準備
- ローカルに新しいプロジェクト用のディレクトリを作る
- Firebase上に新しいプロジェクトを作る
- GitHub上に新しいプロジェクト用のリポを作る

### ２、GitHubから既存のリポをローカルにクローンする
作っておいたローカルのディレクトリに移動し
```terminal
cd path/to/your/directory
```
リポをクローンする
```terminal
git clone https://github.com/username/repository-name.git
```
package.jsonのname/version/description などを新しいプロジェクト用に書き直す

### ３、Gitを設定し直す
元々のオリジン（つまりGitHubのオリジナルのリポ）とのリンクを外す
```terminal
git remote remove origin
```
で、新しく作ったGitHubのリポにオリジンを再設定
```terminal
git remote add origin https://github.com/yourusername/new-repository-name.git
```
mainブランチの設定
```terminal
git branch -M main
```
で、新しいリポの新しいmainブランチにデータをプッシュ
```terminal
git push -u origin main
```
これで新しいローカルのディレクトリにプロジェクトがクローンされ、GitHubの新しいリポと接続完了

*リポをクローンした場合、.gitファイルも引き継がれるので、gitヒストリーもそのまま使える。

### ４、ローカル側の初期設定
- モジュールをインストール
```terminal
npm install
```
- Firebaseのconfigファイルを新しいプロジェクトの設定に書き直す
![my-flashcard-app-Project-settings-General-Firebase-console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/876441bd-8a24-7115-084f-d6ecbccf9430.png)


あと、既存プロジェクトをクローンして再度新しいリポにプッシュする場合、サイズが大きくてエラーが出るケースが多いので、その際はバッファーのサイズを上げると解決する。例えば、１５０MBにすると
```terminal
git config --global http.postBuffer 157286400
```
### ５、Firebaseプロジェクトの場合、書き換えるべきファイル
####  .firebaserc File
```terminal
firebase use
```
で紐づいているプロジェクトを確認して、新しいIDに直す
```terminal
{
  "projects": {
    "default": "my-project-id"
  }
}
```

####  .firestore.rules/storage.rules でパーミッション設定。
あと、.gitignoreでクローンされていない環境変数など。

### ６、でけた
先月作った、ランダムに質問を表示する語学学習用のクイズアプリのロジックを少し書き換えて、フラッシュカード（単語帳）のアプリを作ったよ。
早速、2人しかいない生徒どもに使わせようと思います。

複製元のクイズアプリ
![MyQApp-SS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/a795b502-6acd-fd10-9e4e-f963671d5b7b.png)

ロジックを書き換えた単語帳アプリ
![MyCardApp-SS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/0d07ffea-582b-354c-2dfb-ad0f7a786fbd.png)
カードをクリックすると、裏の訳と発音に切り替わる
![MyCardApp Ura.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/9b9df674-9053-6a83-1458-6d37e41b323c.png)

![MyCardApp-dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/b83bfcd1-205e-0cd4-0efb-9f8c44ae6b76.png)
CloudWatch Logsでフィルタを用いて特定ログを検出してみた

## CloudWatch Logs とは
CloudWatch Logs は、EC2 インスタンスや Lambda function などのログを管理し、検索できる便利なサービスです。今回は、特定のログ情報をフィルタする方法について紹介します。
CloudWatch Logsでフィルターパターンで正規表現を用いることができるのですが、苦戦したので参考にしていただけば幸いです。

### 前提条件
- 対象とするLog groupが存在する

### 1.フィルタの作成
CloudWatch Logs のコンソールにログインします。
左側のナビゲーションペインで、[Log groups] を選択します。
対象とする log group を選択し、「フィルタイベント」をクリックします。

### 2. フィルタパターンの作り方
フィルタパターンを作成する際には、「応答時間が1秒以上かかったリクエスト」や「エラーメッセージ」などの特定の条件を抽出することができます。
パターンは、 { $.duration > 1.00 } や { $.errorMessage != null} のように JSONのようのな フィルタパターンを指定します。
Oracleのログの中にOracleのエラーコードを検知したい場合について例です。

正規表現の使用例:

	1.a!="*ORA-1234" 
 「ORA-1234」で終わる文字列を除外(*はワイルドカード、)	
 
この正規表現でora-1234以外のoracleエラーログを検知することができます。


### もう少し複雑なことをしたい方向けに正規表現を用いたフィルターを作成します。
もう少し複雑な条件を設定したい場合は、正規表現を用いることが可能です。例えば、「Oracleエラーログを検知したいが、特定の文字列が含まれている場合は検知したくない」という場合です。

正規表現の使用例:

	1.a!="*ORA-1234"&&a!="*OK*"


このフィルタは、「ORA-1234」と「OK」を含まないログを抽出します。

正規表現の使用例:

	1.	a=%ORA-1234% - 「ORA-0」を含む文字列を検索
	2.	a=%ORA-1234$% - 「ORA-0」で終わる文字列を検索
	3.	a!=%ORA\-1234\D% - 「ORA-0の後に数字以外の文字」が含まれる文字列を除外


%の役割について
フィルターパターンで使用される%は、部分一致検索を行うためのワイルドカードのような役割を持ちます。これにより、指定した文字列を含むログを抽出することが可能です。

	1.	%文字列% - 「文字列」を含むすべてのログにヒットします。
	2.	%文字列$ - 「文字列」で終わるログにヒットします。
	3.	^文字列% - 「文字列」で始まるログにヒットします。

ただし、*（ワイルドカード）と%を組み合わせる場合には注意が必要です。例えば、*%ORA-1234%は構文エラーとなるため、次のようにダブルクォーテーションで囲む必要があります。

    1.  "*%ORA-1234%"



### 3. フィルタのテスト
テストメッセージを入力し、「テストパターン」ボタンをクリックしてみましょう。結果が期待通りにフィルタされれば、設定は完了です。

### 4. まとめ 
今回は CloudWatch Logs で特定のログを検出する方法について解説しました。この方法を使えば、大量のログから特定の情報を素早く見つけることが可能となります。ログ分析がさらに効率的になり、問題解決に役立つこと思います。













### 備忘(自分用メモ) 正規表現パターン試した結果とか残しておきます。
参考までにどうぞ。

検索方法は、部分一致での検索となる(定義する語句を含むログイベントのみを返します。)	
　例)「%ORA-1234%」で"ORA-1234を含む"文字列にヒットする	
　「%^ORA-1234%」で"ORA-1234から始まる"文字列にヒットする	
　「%ORA-1234$%」で"ORA-1234で終わる"文字列にヒットするa=に続く文字が
%以外で始まる「a=*ORA-1234*」
文字列は意味を持たない文字として扱われる

・但し、＊はワイルドカードとして扱われる			
　→*の後ろに%を記載すると構文エラーとなる。(メトリクスフィルターの仕様)			
　　(*の後ろに%を記述したい場合はダブルクォーテーションで全体を囲む)			
　　例）「*%ORA-1234％」は構文エラー			
　　　　「"*%ORA-1234％"」は「%ORA-1234％」で終わる文字列にヒットする			
			
・検索方法は完全一致での検索となる			
　　例)「"ORA-1234*"」は「ORA-1234で始まる」文字列にヒットする			
　　　 「"*ORA-1234"」は「ORA-1234で終わる」文字列にヒットする			
　　　 「"*ORA-1234*"」は「ORA-1234を含む」文字列にヒットする			
　　　 「"ORA-1234"」は「ORA-1234に完全一致する」文字列にヒットする			

    a="*ORA-*"                  　　 「ORA-」を含む文字列をキャッチ(*はワイルドカード)	
    a!="*Patch Description*"     「Patch Description」を含む文字列を除外(*はワイルドカード)	
    a!=%ORA\-1234\D%                 「"ORA-1234"の後に数字以外の1文字」を含む文字列を除外(\Dは数字以外の1文字を表す正規表現のメタ文字)	
    a!="*ORA-1234" 　　                 「ORA-0」で終わる文字列を除外(*はワイルドカード)	
    a!=%ORA\-1234\D%          「"ORA-00000"の後に数字以外の1文字」を含む文字列を除外(\Dは数字以外の1文字を表す正規表現のメタ文字)	
    a!="*ORA-1234"              　「ORA-00000」で終わる文字列を除外(*はワイルドカード)
neovimの背景色にターミナルの背景色を使えるようにする

## これは何?

- nvimをアプデしたところ，nvim起動時に背景画像が黒色になってしまった。
- terminalではSolarized darkを使っているので同じ背景色のままnvimを使う方法を探した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/f8b41dae-cf89-bb86-8101-f393c972a62f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/8a3f55f9-d1ef-6954-18b7-f04189b05115.png)
↑nvimを起動すると背景色が変わってしまう。

---

## 環境
- Ubuntu 22.04
- nvim 0.10.1
- Gnome Terminal

備考: カラースキームの設定は`gnome-terminal-colors-solarized.git`を使用している。

```shell
git clone https://github.com/sigurdga/gnome-terminal-colors-solarized.git
cd gnome-terminal-colors-solarized/
./install.sh
```

---

## 修正方法

init.vimに以下を追加したところ，うまくいきました。
この設定をつかうとvimの背景色が透明になる模様。

```vim
highlight Normal ctermbg=NONE guibg=NONE  "setting the backgroud color to transparent.
```

## 備考: 不要な場合もある

私は会社ではWSLを使っており，その際には[Windows Terminal](https://apps.microsoft.com/detail/9n0dx20hk701?hl=ja-jp&gl=JP)を使用しています。
Windows Terminalの設定でSolarized Darkの使っているのですが，この場合には設定不要でした。
Kubernetes 1.31: 変更点まとめリンク集

このエントリは、Kubernetes 1.31 の変更点のまとめページです。

今回からピックアップされた変更点は、日本語でまとめられたものが公式で用意されているため、[そちら](https://kubernetes.io/ja/blog/2024/08/13/kubernetes-v1-31-release/)をご参照ください。

細かな変更点について、SIG毎に[CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.30.md)をまとめた以下のリンクを参照してください。

# 変更点の詳細へのリンク

- [Metrics Changes と SIG Instrumentation](https://qiita.com/watawuwu/items/ae739b0a2085bd16c0f9) @watawuwu 
- [SIG Apps](https://qiita.com/yosshi_/items/9f420f351ba99c2d5203) @yosshi_
- [SIG API Machinery](https://qiita.com/Ladicle/items/6f14cbe735de5ed30ff7) @Ladicle 
- [SIG Auth](https://qiita.com/hiyosi/items/2d510591c3a8732c5554) @hiyosi 
- [SIG CLI](https://qiita.com/superbrothers/items/edf6abef5aa0ceeb79d0) @superbrothers
- [SIG Cluster Lifecycle](https://qiita.com/yuanying/items/a41832eaa3ff4a676458) @yuanying 
- [SIG Storage](https://qiita.com/ysakashita/items/e5121b77bea1fbd170f5) @ysakashita 
- [SIG Network](https://qiita.com/uesyn/items/201d2c1b925e08fc6105) @uesyn
- [SIG Scheduling](https://qiita.com/ordovicia/items/1a392826d7829f8a56bb) @ordovicia
- [SIG Node](https://qiita.com/y1r96/items/3d18ddea7b7c3f5c0206) @y1r96
いまさら、/etc/fstab

年に何度か/etc/fstabの定義を間違えてOSが起動しない事態に遭遇します。
/etc/fstabを修正すれば良いのですが、クラウド環境だとコンソールアクセスができないので
ディスクを他VMにつけかえて編集する手間があります。

回避方法としてオプションに"nofail"をつけるのが良いかと思いました。
nofailだとfstabをミスってマウントできなくても起動してきます。

nofailオプションで再起動し、正常にマウントできることを確認してから
nofailオプションを外してあげればこう言った事態は防げるのではないかと思いました。
.bashrcに設定を追加する

## パスを通す

ROSを扱う上で度々入力しなければならないコードというものが存在します。その中の一つに

```terminal:terminal
source ~/catkin_ws/devel/setup.bash
```
があります。
これは、ROSコマンドへパスを通すために必要です。

これを毎度入力するのが面倒な時に役に立つのがbashrcです。

## bashrcとは

bashrcとは、簡単に言うと、ターミナル起動時に毎回初期化ファイルとして実行されるスクリプトであり、このスクリプトに起動させたいものを入力すれば、勝手に実行してくれます。

具体的に説明すると、bashrcはシェル（Bash）がインタラクティブなログインシェルでないとき、つまり新しいターミナルウィンドウを開いたり、新しいシェルセッションを開始するときに自動的に読み込まれる設定ファイルです。このファイルに書かれたコマンドは、ターミナルが起動するたびに実行されるため、手動でコマンドを入力する手間を省くことができます。

そのため、source ~/catkin_ws/devel/setup.bashというコマンドを~/.bashrcに書き込んでおけば、ターミナルが起動するたびに自動的にそのコマンドが実行され、catkin_ws内のパッケージにパスが通るようになるのです。

これにより、毎回手動で同じコマンドを入力する必要がなくなり、設定の自動化が可能になります。
メンバー.?toString() Null 条件演算子 ?


null条件演算子（?.）は、C# 6.0で導入された機能で、オブジェクトがnullでない場合にのみメンバーにアクセスするための簡潔な方法を提供します。

注意点:
型の変化:

値型に対してnull条件演算子を使用すると、結果はnull許容型になります。

```c#

// Null条件演算子 (?.) の解説

// 1. 基本的な使い方
string name = person?.Name;
// 上記は以下と同等:
// string name = (person != null) ? person.Name : null;

// 2. メソッド呼び出し
int? length = name?.Length;
// 上記は以下と同等:
// int? length = (name != null) ? (int?)name.Length : null;

// 3. インデクサーとの組み合わせ
char? firstChar = name?[0];
// 上記は以下と同等:
// char? firstChar = (name != null && name.Length > 0) ? (char?)name[0] : null;

// 4. メソッドチェーン
string upperName = person?.Name?.ToUpper();
// 上記は以下と同等:
// string upperName = (person != null) ? (person.Name != null ? person.Name.ToUpper() : null) : null;

// 5. Null合体演算子との組み合わせ
string displayName = person?.Name ?? "Unknown";
// 上記は以下と同等:
// string displayName = (person != null && person.Name != null) ? person.Name : "Unknown";

// 6. コレクションとの使用
int? firstItem = myList?.FirstOrDefault();
// 上記は以下と同等:
// int? firstItem = (myList != null) ? myList.FirstOrDefault() : null;

// 7. デリゲートの呼び出し
myDelegate?.Invoke();
// 上記は以下と同等:
// if (myDelegate != null) myDelegate.Invoke();

// 8. 条件付きアクセス
bool isAdmin = user?.Roles?.Contains("Admin") ?? false;
// 上記は以下と同等:
// bool isAdmin = (user != null && user.Roles != null) ? user.Roles.Contains("Admin") : false;

```
method: deleteが効かない時の対処法

# はじめに

本質的な理解ではなく、あくまで対処法にとどまります。

:::note
対処法
`@rails/ujs`をyarn add -> install
:::

# 問題

deviseを使って「ログアウト」を実装しようとしたところ、`method: delete`を設定しているにも関わらず、`get`リクエストでページ遷移してしまい、該当のrouteは存在しないと言われる

# 対処法

method: deleteはJSライブラリによって管理されているようです。

今回は、JSライブラリ`@rails/ujs`を yarn add -> install で解決しました。

# 問題が解決しなかった理由

「rails立ち上げの際に **esbuild** を指定しているにも関わらず、**importmap** に関連した解決を試みたから」

本質的な理解ではありませんが、「esbuild」「webpacker」「importmap」が同じレベルのものらしいです。
よって、「importmap」と「esbuild」がコンフリクトを起こしてしまったのが問題を複雑にしていました。

rails 7 ではimportmapが標準、といった話を見た（勘違い？）のもこれに拍車をかけました。

# おわりに

method: deleteはrailsの仕様なのだから、rails側で完結してくれよ・・・
【Python】statisticsモジュールの基礎知識

はじめに
---
Pythonのstatisticsモジュールは、基本的な統計計算を簡単に行うための便利なツールです。
このモジュールはPythonの標準ライブラリに含まれており、特にデータサイエンスや統計学に入門する際に非常に役立ちます。

statisticsモジュールのインポート
---
まずはstatisticsモジュールをインポートする方法から始めましょう。

```
import statistics
```

**1. mean(): 平均値**
---
mean()関数は、リストやタプルなどのシーケンスから平均値を計算します。

```
data = [1, 2, 3, 4, 5]
mean_value = statistics.mean(data)
print(mean_value)  # 出力: 3
```

**2. median(): 中央値**
---
median()関数は、データセットの中央値を計算します。中央値とは、データを小さい順に並べたときの真ん中の値です。

```
data = [1, 3, 5, 7, 9]
median_value = statistics.median(data)
print(median_value)  # 出力: 5
```
データの個数が偶数の場合、中央値は中央の2つの値の平均になります。

```
data = [1, 3, 5, 7]
median_value = statistics.median(data)
print(median_value)  # 出力: 4
```
**3. mode(): 最頻値**
---
mode()関数は、データセット内で最も頻繁に出現する値（最頻値）を返します。

```
data = [1, 2, 2, 3, 4]
mode_value = statistics.mode(data)
print(mode_value)  # 出力: 2
```
**4. stdev(): 標準偏差**
---
stdev()関数は、データセットの標準偏差を計算します。標準偏差はデータの散らばり具合を示す指標です。

```
data = [1, 2, 3, 4, 5]
stdev_value = statistics.stdev(data)
print(stdev_value)  # 出力: 約1.58
```
**5. variance(): 分散**
---
variance()関数は、データセットの分散を計算します。分散は、各データが平均からどれだけ離れているかを示す指標です。

```
data = [1, 2, 3, 4, 5]
variance_value = statistics.variance(data)
print(variance_value)  # 出力: 約2.5
```
**6. harmonic_mean(): 調和平均**
---
harmonic_mean()関数は、データセットの調和平均を計算します。調和平均は、特に速度や密度の平均を計算する際に有用です。

```
data = [1, 2, 3, 4, 5]
harmonic_mean_value = statistics.harmonic_mean(data)
print(harmonic_mean_value)  # 出力: 約2.189
```
**7. geometric_mean(): 幾何平均**
---
geometric_mean()関数は、データセットの幾何平均を計算します。
幾何平均は、成長率やリターンの平均を計算する場合に適しています。

```
data = [1, 2, 3, 4, 5]
geometric_mean_value = statistics.geometric_mean(data)
print(geometric_mean_value)  # 出力: 約2.605
```
**8. pstdev(): 母集団標準偏差**
---
pstdev()関数は、データセット全体が母集団であると仮定して標準偏差を計算します。
stdev()関数とは異なり、分母にはデータ数全体（n）を使用します。

```
data = [1, 2, 3, 4, 5]
pstdev_value = statistics.pstdev(data)
print(pstdev_value)  # 出力: 約1.414
```
**9. pvariance(): 母集団分散**
---
pvariance()関数は、データセット全体が母集団であると仮定して分散を計算します。
variance()関数とは異なり、分母にはデータ数全体（n）を使用します。

```
data = [1, 2, 3, 4, 5]
pvariance_value = statistics.pvariance(data)
print(pvariance_value)  # 出力: 2.0
```
**10. quantiles(): 分位点**
---
quantiles()関数は、データセットを等しい部分に分割するための分位点を計算します。
デフォルトでは四分位点（4つの部分に分割する点）を計算しますが、任意の分割数を指定することもできます。

```
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
quantiles_value = statistics.quantiles(data, n=4)
print(quantiles_value)  # 出力: [2.75, 5.5, 8.25]
```
**11. multimode(): 複数の最頻値**
---
multimode()関数は、データセット内で最も頻繁に出現する値が複数ある場合、それらすべてをリストとして返します。

```
data = [1, 1, 2, 2, 3]
multimode_value = statistics.multimode(data)
print(multimode_value)  # 出力: [1, 2]
```
まとめ
---
statisticsモジュールを利用することで、Pythonを使って基本的な統計解析を手軽に行うことができます。
データサイエンスや分析業務を始めるにあたって、まずはこれらの関数をマスターすることで、より高度な分析へとステップアップすることができるでしょう。

Pythonでの統計計算に興味がある方は、ぜひstatisticsモジュールを試してみてください。
Getting started with Amazon Q Developer - Part 1、2の要約

このツールは、開発者がコードを作成したり、既存のコードを修正したり、トラブルシューティングを行う際に役立ちます。

## Q Developerでできること

Q Developerは、コードの作成、修正、トラブルシューティングの3つの主要な機能を提供します。

### 1. コードの作成と修正

* 新しい機能を追加したり、既存のコードを改善したりすることができます。
* 例えば、ウォレットアプリケーションに新しい機能を追加したい場合、Q Developerにコメントで指示すると、それに対応するコードを提案してくれます。
* 提案されたコードはそのまま受け入れることも、修正することもできます。

### 2. トラブルシューティング

* コードのエラー原因を特定し、解決策を提案してくれます。
* 例えば、Lambda関数でエラーが発生した場合、Q Developerにエラーメッセージを提示すると、原因を特定し、解決策を提案してくれます。

### 3. アーキテクチャのアイデア出し

* アプリケーションのアーキテクチャを設計する際に、Q Developerは様々なアイデアを提案してくれます。
* 例えば、電子財布アプリケーションのアーキテクチャを考え出すようにQ Developerに指示すると、イベント駆動型アーキテクチャやサーバーレスコンピューティングなど、様々な提案をしてくれます。

## Q Developerの利用方法

Q Developerは、Visual Studio CodeなどのIDEにプラグインとしてインストールするか、AWSコンソールから利用できます。

## まとめ

Q Developerは、開発者がコードをより効率的に作成、修正、トラブルシューティングを行うための強力なツールです。AWSのサービスを活用している開発者にとって、Q Developerは非常に役立つツールとなります。

## 関係資料
[How to easily get started with Amazon Q Developer? | AWS Events](https://youtu.be/booI_HvuCiQ?si=NPSw-RxhwvMVDy3B)
[Getting started with Amazon Q Developer - Part 2 | Amazon Web Services](https://youtu.be/nqfLFxOnVuM?si=mKZAdQi3F9x-dDG3)
[Amazon Q Developerユーザーガイド](https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/what-is.html)
RSA暗号をMsieveで解読する

<!-- RSA暗号をMsieveで解読する -->

## はじめに

CTFという競技があります。平たく言うと、セキュリティに関する問題が与えられ、様々な手法を駆使して隠されたフラッグを見つけるというものです。

その問題カテゴリに「Crypt」というものがあります。これは主に暗号を解読するという問題です。その中でもRSA暗号は一番簡単な問題としてよく出題されます。

RSA暗号は公開鍵暗号の一つで、公開鍵と秘密鍵のペアを生成し、公開鍵で暗号化、秘密鍵で復号するという仕組みです。秘密鍵の推定は非常に困難なので、これによって、セキュアな情報のやり取りを行うことができます。

以下の記事などに詳しい解説があります。

[RSA暗号ってどういうしくみなの...? #公開鍵暗号方式 - Qiita](https://qiita.com/YutaKase6/items/cd9e26d723809dc85928)

[RSA暗号方式の秘密鍵を手動で求めてみる #RSA - Qiita](https://qiita.com/izuki_y/items/ae36f7e0cdb08a19acb2)

RSA暗号は$N$の桁数が多く、素因数分解が現実的な時間ではできないということを安全性の根拠としています。しかし、CTFの問題になっている以上、秘密鍵の推定が可能になっています。具体的には、以下のような手順を取ります。

1. 与えられた$N$を素因数分解し、秘密素数を求める
2. 秘密素数から1引いた値の積を取って、$\phi$を求める
3. 与えられた$e$と$\phi$から$d$を求める
4. 暗号文と$d$と$n$を使って平文を求める

今回は1の手順にフォーカスして解説していきます。

## RSA暗号の解読

例えば、$N$が$39$だとしましょう。この時、$N$は$3$と$13$の積であることがわかります。このように、$N$が小さい場合は素因数分解が簡単にできます。このとき$\phi$は

$\phi = (3-1)(13-1) = 24$

となります。

では、$N$がより多くの素数の積で、かつ桁数が多いとどうなるでしょうか。$N=120363689$を考えます。おそらくすぐには素因数分解できないと思います。

その場合、$1 \leqq i \leqq \sqrt N$を満たす$i$で$N$を順次割っていく、という考え方で素因数分解を行うという手があります。桁数が大したことなければいいんですが、桁数が大きいとなかなか時間がかかります。計算量は$O(\sqrt N)$です。

しかし、Msieveというツールを使うことで、$N$の桁数が大きい場合でも素因数分解を行うことができます。

## Msieveの使い方

今回はWindows環境を想定して解説します。

このソフトでは「楕円曲線法」で素因数分解を行うとされています。楕円曲線は公開鍵暗号アルゴリズムによく使われている手法ですが、今回は詳しい説明は省略します。

まず、Msieveを[こちら](https://sourceforge.net/projects/msieve/)からダウンロードします。

ダウンロード後、zipファイルを解凍し、解凍したディレクトリのパスを環境変数に通しておきます。

次に、コマンドプロンプトを開き、以下のコマンドを実行します。

```bash
msieve153 -qve (正の整数)
```

msieveの後に来る数字はバージョンを表しています。解凍したディレクトリを漁っていくとexeファイルがあるので、そのファイルの名前をコマンド名として用いることとなります。

オプションはそれぞれ以下のような意味を持ちます。

- q: ログファイルを出力しない
- v: 詳細なログを画面に出力
- e: 15桁を超える素因数を探す

例えば、$N=120363689$を素因数分解する場合、以下のようになります。

```bash
msieve153 -qve 120363689
```

結果は以下の通りです。

```bash
120363689
p2: 17
p2: 19
p2: 53
p2: 79
p2: 89
```

これによって$120363689$が、$17 \times 19 \times 53 \times 79 \times 89$という形で素因数分解されました。

では、もっと桁数の多い$N$を素因数分解してみましょう。実際にあるCTF問題で出題された$N$を素因数分解してみます。

```bash
msieve153 -qev 317903423385943473062528814030345176720578295695512495346444822768171649361480819163749494400347
```

結果は以下の通りです。

```bash
p2: 9953162929836910171
p2: 11771834931016130837
p2: 12109985960354612149
p2: 13079524394617385153
p2: 17129880600534041513
```

流石にこの桁数になってくると結構時間がかかりますが、愚直に素因数分解を行うよりは早いです。

## まとめ

Msieveを使うことで、桁数の大きい$N$を素因数分解することができました。通常使われているRSA暗号の桁数は$2048$ビットくらいで、これを素因数分解することはたとえMsieveでも現実的ではありません。

しかし、CTFの問題においては、素因数分解が可能な桁数であることが多いので、このようなツールを使って現実的な時間で解読することができます。CTFの問題でRSA暗号が出てきたら、使用してみると良いと思います。

## 参考

[超高速な素因数分解ソフト Msieve の使い方 | 情報の海を泳ぐ](https://pajoca.com/use-msieve/)

[Msieveを使った高速素因数分解 #Linux - Qiita](https://qiita.com/motimotipurinn/items/087dedae95a770345132)
Google Colabの「serve_kernel_port_as_window」が壊れた

## はじめに
ローカル環境を構築するのが手間でGoogleColabで学習を進めている人は多いのではないだろうか。  
私がそうである。最近はflaskの学習までcolabで行っている。
最近まで[この辺の記事](https://c-a-p-engineer.github.io/tech/2024/04/09/google-colab-flask/)を参考にcolabでwebサーバを立てて閲覧することができていた。  
しかし、最近になって実行しようとすると以下のような画像が表示されてしまうようになったので原因を調べてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741438/19f7026b-4c71-4a06-ca42-90daf66fcad6.png)


## 結論
「serve_kernel_port_as_window」は壊れた。  

## 代替手段
「serve_kernel_port_as_iframe」を使おう。

## どうやって調べたか。
```
help()
```
で該当の関数を検索してみた。
「google.colab.output._util」を入力すると出で来る。
そうすると表示されたのは以下の通り
```
        serve_kernel_port_as_window(port, path='/', anchor_text=None)
        Displays a link in the output to open a browser tab to a port on the kernel.
        
        DEPRECATED; Browser security updates have broken this feature. Use
        `serve_kernel_port_as_iframe` instead. See
        https://developer.chrome.com/en/docs/privacy-sandbox/storage-partitioning/.
        
        
        This allows viewing URLs hosted on the kernel in new browser tabs.
        
        The URL will only be valid for the current user while the notebook is open in
        Colab.
        
        Args:
          port: The kernel port to be exposed to the client.
          path: The path to be navigated to.
          anchor_text: Text content of the anchor link.
```
雑に日本語訳をすると
```
        カーネル上のポートへのブラウザ タブを開くためのリンクを出力に表示します。
        
        非推奨。ブラウザのセキュリティ更新により、この機能が壊れました。使用
        代わりに「serve_kernel_port_as_iframe」を使用してください。見る
        https://developer.chrome.com/en/docs/privacy-sandbox/storage-partitioning/。
        
        
        これにより、カーネルでホストされている URL を新しいブラウザ タブで表示できるようになります。
        
        URL は、ノートブックが開いている間、現在のユーザーに対してのみ有効です。
```
<b>「非推奨。ブラウザのセキュリティ更新により、この機能が壊れました。」</b>
壊れちゃいました。。。
iframeの方は動くので（確認済み）そちらを使えば動く。

## 課題
iframeだとURLが発行されないのでAPIサーバとしては利用できない。
ブラウザのセキュリティの問題で403エラーが出ているならブラウザ経由でないアクセスなら引き続き利用できる？※要検証
UbuntuでSambaサーバ設定手順

CentOS上のファイルサーバの移行先として作成する。ここではVM上で確認した手順を記載する。

### 環境
仮想化：VMware Workstation-playre17
ホスト：Windows11
ゲスト：ubuntu22.04.3TLS

#### 1. Sambaのインストール

まず、UbuntuにSambaをインストールする。

```
sudo apt update
sudo apt install samba
```

#### 2. 共有フォルダの作成

既存のフォルダを共有する場合、そのフォルダを使用。新たに作成する場合は以下のようにする。

```
sudo mkdir -p /smb/share
sudo chmod 777 /smb/share  # すべてのユーザーにアクセスを許可する場合
```

#### 3. Samba設定ファイルの編集

Sambaの設定ファイルを編集して、共有フォルダを設定する。

```
sudo nano /etc/samba/smb.conf
```

ファイルの最後に以下の設定を追加する。

```
[Share]
   path = /smb/share
   browseable = yes
   read only = no
   guest ok = yes
```


さらに、SMBプロトコルの設定をグローバルセクションに追加する。これにより、SMB1からSMB3までのすべてのプロトコルがサポートされる。

```
[global]
   client min protocol = NT1
   server min protocol = NT1
```

#### 4. Sambaサービスの再起動

設定を反映させるために、Sambaサービスを再起動。

```
sudo systemctl restart smbd
```

#### 5. アクセスの確認

Windowsのエクスプローラーで以下のように入力して、共有フォルダにアクセスできるか確認する。

```
\\192.168.0.195\Share
```

(end)

---

↑でうまくいかなかったら。。。以下トラブルシューティングする。

#### ■■トラブルシューティング

**ログの確認**。接続に問題がある場合は、Sambaのログを確認して原因を特定する。

```
sudo tail -f /var/log/samba/log.smbd
```

#### 1.smbclientでのローカル接続テスト(リモートからうまく接続できない場合にやってみる)

Sambaサーバーが正しく設定されているか、ローカルでテストする。

まず、`smbclient`をインストールする。

```
sudo apt install smbclient
```

次に、Sambaサーバーの共有リストを確認する。

```
smbclient -L localhost -U%
```

`Share`がリストに表示されていることを確認する。

さらに、具体的にフォルダにアクセスし、ファイルの一覧を確認する。

```
smbclient //localhost/Share -U katano
Password:  # パスワードを入力
smb: \> ls  # フォルダ内のファイル一覧を表示
smb: \> exit  # smbclientを終了
```

この手順で、共有フォルダに正常にアクセスできることを確認できる。

#### 2.Windowsでの設定

Windowsでネットワーク設定を確認し、接続を試みる。

1. **SMB1.0/CIFSサポートの有効化（必要に応じて）**
   - 「プログラムと機能」 > 「Windowsの機能の有効化または無効化」から「SMB 1.0/CIFS ファイル共有のサポート」にチェックを入れる（セキュリティリスクを理解した上で有効にする）。
2. **ネットワークドライブの割り当て**
   - エクスプローラーの「コンピュータ」タブで「ネットワークドライブの割り当て」を選び、`\\192.168.0.195\Share`を指定してドライブを割り当てる。

#### 3.システムの再起動

すべての設定を反映させるために、必要に応じてUbuntuサーバーとWindowsクライアントを再起動する。
Amazon Route53のトラフィックルーティングとELBのトラフィック分散について

## 勉強前イメージ
Amazon Route53のトラフィックルーティング機能とElastic Load Balancingのトラフィック分散機能の存在については知っていたが、これらのユースケースや違いについてよくわからない…

## Amazon Route53とは
#### 概要
ドメイン名の登録やDNSレコードの管理、ドメインのルーティングなどのDNSに関連する機能の提供
#### 主な機能
1. ネームサーバーとしての利用
2. <font color="red">**トラフィックのルーティング**</font>
3. リソースの正常性  
## Elastic Load Balancing(ELB)とは
#### 概要
ほかのサービスへのトラフィックを複数のターゲットに自動的に分散し、安定稼働をサポートするサービス
#### 主な機能
1. <font color="red">**トラフィック分散**</font>
2. メンテナンスや障害対応
3. サーバーのエルスチェック
4. セキュリティ強化

## 調べてみた結果
##### そもそも<ins>用途が違う!</ins>
- Route53はパブリックIPアドレスをURL形式に変換する（=<font  color="blue">名前解決</font>）
- ELBは複数のサーバーを使う必要があるときにそれぞれのサーバーにトラフィックを割り振る(=<font color="blue">トラフィック分散</font>)
##### そして<ins>併用可能</ins>である
使い分けるとしたら...
- ELBは自動分散に関して柔軟性が高いので、カスタマイズしたい場合に適している
- Route53は大きく分けて7つのルーティング方法があり、基本的な方が決まっているため、そこまでカスタマイズしなくてもよい場合に適している

## 参考資料
- <url>https://www.sunnycloud.jp/column/20210602-01/</url>
- <url>https://business.ntt-east.co.jp/content/cloudsolution/column-32.html</url>
サービスポータルとEmployee CenterとEmployee Center Proの共通点と違いについて

## 記事の目的
サービスポータル（SP）、Employee Center（ESC）、Employee Center Pro（ESC Pro）が混同されやすいため、それらの違いをまとめることにしました。

## [定義]ポータルとは？
**ポータルは、ServiceNowユーザーインターフェース(UI)としてService Portalフレームワークを使用して構築されており、標準UIに代わるユーザーエクスペリエンスを提供します。** これにより、デスクトップ、タブレット、スマートフォンなど、あらゆるデバイスからNow Platformと直感的に対話できる最小限のクリック数でアクセスできます。ポータルの利用により、ユーザーは以下のプラットフォームコンポーネントにアクセスできます。

- ユーザーに割り当てられたタスクや選択されたレコードなどテーブルの情報
- 指標、レポート、分析
- サービスカタログ
- ナレッジベース
- アンケート
- ユーザープロフィール
- 承認

さらに、ポータルは組織のブランドに合わせて簡単にブランド化およびテーマ設定することができます。
引用元 [Service Portal Introduction](https://developer.servicenow.com/dev.do#!/learn/courses/washingtondc/app_store_learnv2_serviceportal_washingtondc_service_portal/app_store_learnv2_serviceportal_washingtondc_service_portal_introduction/app_store_learnv2_serviceportal_washingtondc_what_is_a_portal)

## ポータルの種類
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/a49bf9b1-47d8-2fba-2ade-bf013e660829.png)
ポータルには以下の3種類が存在します。

1. サービスポータル (SP) - ライセンス: 無料
2. 従業員センター (ESC) - ライセンス: 無料
3. 従業員センター Pro (ESC Pro) - HRSD + 追加料金

それぞれの外観と機能には異なる特徴があります。

### 1.サービスポータル(sp)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/ff28e27f-e224-1952-abdd-e72735dad174.png)

### 2.従業員センター(esc)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/6538be3a-0e16-3850-848f-272668d6cceb.png)

### 3.従業員センターPro(esc pro)
画面はescと同様ですが、追加機能が使用可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/bb52689b-6440-257b-ace5-b202322079e7.png)

## サービスポータルとEmployee Centerの共通点と違い
Service Portal と Employee Center の両方のアプリケーションは Now Platform の上に構築され、近代的な技術を使用して、ブランディングおよびカスタマイズができ、また 200 を超えるウィジェットを利用できます。ただし、Employee Center は、すべてのサービスニーズに対応できるように、複数の部門に拡張できるように構築されています。

次の表では、Service Portal と Employee Center のポータルの主な違いを掲載しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/08af5350-45bd-d43e-2409-ab13ca0b4b45.png)

引用元 [Service Portal と Employee Center のアプリケーション
](https://docs.servicenow.com/ja-JP/bundle/vancouver-employee-service-management/page/product/employee-center/concept/sp-versus-ec.html)

両者は同様の機能を提供しますが、従業員センターがより高機能であると言えます。従いまして、両者を比較検討する際には、従業員センターがより良い選択肢となります。ただし、サービスポータルは実装者にとって使いやすいという利点もあります。

## ライセンス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/df0bcded-389e-7426-70c9-953538b2afb5.png)
HRSDのProfessional/EnterpriseからEmployee Center Proは利用可能です。一方、Service PortalとEmployee Centerはライセンスに関係なく共通機能として利用できます。

## 結論
どのポータルを使用したいかや、どのライセンスを選択すべきか迷った場合には、以下のような二軸を考慮して選択することをお勧めします。

1. Service Portal または Employee Center
2. Employee Center または Employee Center Pro
RDPでWaylandセッションにリモート接続する

## はじめに
Ubuntuで動作するWaylandセッションにリモートデスクトッププロトコル（RDP）を使ってリモート接続してChromeを動作させる。

Ubuntuの場合には`gnome-remote-desktop`を利用すればWaylandセッションにもRDPで接続できるということだが、残念ながら私の環境では黒画面になってしまいうまく動作しなかった。代替案となるもとして`weston`の`rdp-backend`を利用する方法を試みた。

## まとめ

リモートデスクトッププロトコル（RDP）を使って、MacOSからホストPCのWaylandセッションにリモート接続できた。

:::note alert
`weston-rdp`を利用した場合、ユーザ名とパスワードなどの認証手段が存在しない。
DockerとホストPC間での利用や、開発中に信頼できるネットワーク上での限られた時間の利用にとどめたほうが良いだろう。
:::

### 環境

- Ubuntu 24.04
- MacOS 14.2.1

MacOSで動作する`Microsoft Remote Desktop`からUbuntuで動作する`wayland-rdp`に接続する

### Wayland対応のRDPサーバー

Waylandを直接サポートするRDPサーバーはまだ少ない。`weston`というWaylandのリファレンスコンポジタに含まれるRDPバックエンドを利用することで、Wayland環境下でもRDPを使用できる。

#### westonのインストール
```bash
sudo apt-get update
sudo apt-get install weston
```

#### 鍵ファイルを作成する

```bash
openssl genrsa -out rdp.key 2048
```

#### westonでrdpサーバーを実行する


```bash
weston --backend=rdp-backend.so --rdp4-key=rdp.key
```

### RDPでリモート接続する

MacのMicrosoft Remote Desktopアプリで接続する

:::note info
認証が働かないので適当なユーザ名とパスワードでログイン可能
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/1c6aeb69-46b3-fefd-eeca-f9e397e25581.png)

#### ターミナルを起動
左上のボタンをクリックしてターミナルを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/e48b4a25-b2e2-7a4c-79cb-1228da076ec0.png)

#### Chromeブラウザを起動

ChromeブラウザをWaylandを指定して起動する

```bash
google-chrome --ozone-platform-hint=wayland
```

#### Youtubeの再生を確認

:::note warn
音声は未サポート
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/8f0b59ea-43a0-e72a-7f07-3c02daf295bf.png)

#### ChromeのGPUのサポート
GPUは制限付きでサポートしている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/00257b99-53c6-dc24-5544-1fcbfe0fd471.png)

#### GPUが認識されていることを確認

```bash:リモートデスクトップで開いたターミナルで実行
$ lspci -v | grep -i --color 'vga\|3d\|2d'
```

```bash
00:02.0 VGA compatible controller: Intel Corporation Raptor Lake-S GT1 [UHD Grap
hics 770] (rev 04) (prog-if 00 [VGA controller])
```


## 参考情報

https://manpages.ubuntu.com/manpages/focal/en/man7/weston-rdp.7.html
運用上の優秀性解説 要約

## 概要
AWS運用には、安定運用と問題対応力が求められる。
成功の鍵は「運用上の優秀性」にある。

**運用上の優秀性**とは、サービスを安定的に稼働させ、問題発生時に迅速に対応できる状態を指します。AWS運用を成功させるには、以下の**5つの設計原則**を意識することが重要です。

**1. 運用をコードとして実行する:**
- 環境全体をコードで管理することで、環境構築や更新を自動化し、一貫性を保てます。
- アプリケーションコードと同じように、環境構築、更新、運用手順もコードとして定義します。

**2. 元に戻せる小さな変更を頻繁に行う:**
- 少しずつ変更を加えることで、失敗した場合でも簡単に元に戻せます。
- AWSサービスを活用し、コンポーネントを定期的に更新できるようにワークロードを設計します。

**3. 運用手順を定期的に改善する:**
- 定期的に手順を見直し、改善することで、ワークロードに合わせて柔軟に対応できます。
- 定期的なゲームデーを実施して手順を評価します。

**4. 障害を予測する:**
- 潜在的な問題点を事前に把握し、適切な対策を講じることで、障害発生を予防できます。
- 障害の原因となる可能性がある箇所を特定し、修復方法を判断します。

**5. 運用上のあらゆる障害から学ぶ:**
- 発生した障害から教訓を得て、組織全体で共有することで、同じ失敗を繰り返さないようにします。
- 運用上のイベントや障害を分析し、チーム間で教訓を共有します。

**運用上の優秀性を達成するためのベストプラクティス**は以下の3つの段階に分けられます。

**準備:**

- **目標を明確にする:** ビジネス成果に貢献する運用を目指します。
- **ワークロードの設計:** デプロイ、更新、運用方法を明確に設計し、コードで管理します。
    - アプリケーション、インフラストラクチャ、ポリシー、ガバナンス、運用をコードで定義します。
    - 技術的指標とビジネス的指標を監視し、問題を早期に検知できるようにします。
    - タグ付け戦略を設計に組み込み、リソース整理、コスト管理、アクセスコントロールを容易にします。
- **運用準備状況を確認:** 必要なツール、スキル、手順書などを揃えます。
    - ランブックとプレイブックを作成し、一貫したプロセスを実行します。
    - ワークロードとオペレーションツールを運用するスタッフや適切なスキルセットなどが揃っていることを確認します。

**運用:**

- **オペレーションヘルスを監視:** ワークロードの状態を常に把握し、問題発生時に迅速に対応できるようにします。
    - ログデータを収集し、ベースラインメトリクスを定義します。
    - Amazon CloudWatch ダッシュボードを使用して、メトリクスのシステムレベルビューとビジネスレベルビューを表示します。
- **イベントに対応する:** 計画されたイベントと計画外のイベントに適切に対応するための手順書を作成します。
    - ランブックとプレイブックを使用して、イベントに対応します。
    - メトリクスをモニタリングし、運用上のイベントに対して作成済みスクリプトによる応答をトリガーします。
    - 根本原因の分析を行い、計画外のイベントの再発を防止します。

**進化:**

- **経験から学ぶ:** 運用アクティビティ、障害、実験などを分析し、手順を改善します。
    - ログ戦略を実装し、運用アクティビティ、ワークロード、インフラストラクチャのログを Amazon CloudWatch に集約します。
    - ログデータの分析と可視化する方法を確立します。
- **教訓を共有する:** 他のチームと教訓を共有することで、組織全体の運用レベルを向上させます。
    - アプリケーション、コンピューティング、インフラストラクチャ、オペレーションにコードの手法を使用することで、リソースを簡単に共有できます。
    - Amazon マシンイメージ (AMI)、AWS Lambda 関数、AWS CloudFormation テンプレートなどのリソースを共有します。

これらのベストプラクティスを意識し、AWSのサービスを効果的に活用することで、運用上の優秀性を実現し、ビジネス成果に貢献する安定した運用を実現できます。
【AWS】IAM ユーザーを作成する

# はじめに
この記事では、AWS IAM ユーザーの作成手順を記載します。

https://docs.aws.amazon.com/iam/

:::note
以後の画面キャプチャは 2024年8月時点のものです。
:::

# ユーザー作成画面へのアクセス
IAM のダッシュボード左側メニューから「Users」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/c1ec6c8f-c72f-3da1-c8c2-8eac7db21404.png)

ユーザー一覧が表示されます。右上の「Create user」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/adf5a845-2059-844b-c7b4-0925e10a0af5.png)

# Step 1 Specify user details
ユーザー名やマネージメントコンソールへのアクセス・ログインに関する設定を行います。

- User name : 任意のユーザー名を入力
- Provide user access to the AWS Management Console : 今回はマネージメントコンソールへのアクセスを許可したいので、チェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/c793a79c-f4cf-e3c0-8ed2-8cb3e6aa5ae8.png)

チェックすると、User type が表示されます。今回は、「I want to create an IAM user」を選択します。それ以降の入力値はデフォルトのまま「Next」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/8bca93b6-73f8-cb1d-8379-d3772f4d2717.png)

# Step 2 Set permissions
作成する IAM ユーザーに対する AWS サービスへの操作の権限設定を行います。
今回は練習用にすべてのサービスに対して、すべての操作を許可する権限を付与します。

- Permissions options : Attach policies directly を選択
- Permissions policies : Administrator Access を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/9a5a69f0-27ed-d842-2e19-ccdf5c1edb0b.png)

上記2点を選択したら、「Next」をクリックします。

# Step 3 Review and create
今までの入力内容が表示されるので、確認して問題がなければ、「Create User」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/f5e194ee-8d58-5aef-5bf7-0a20194701dc.png)

# Step 4 Retrive password
IAM ユーザーが AWS マネージメントコンソールへサインインするために必要な情報が表示されます。
「Download.csv file」をクリックすると、こちらの画面に表示されている情報を CSV ファイルとして保存できます。
「Return to users list」をクリックすると、ユーザー一覧画面に戻ります。ユーザー一覧画面に戻ると、今回作成した IAM ユーザーが一覧に表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/3b27bf47-60a3-3d90-7a55-b234d4540a42.png)

# パスワードの変更
一度サインアウトした後、先ほど取得した Console sign-in URL にアクセスし、ユーザー名とパスワードを入力し、「Sign in」をクリックします。
パスワードの変更を求められるので、古いパスワードと新しいパスワードを入力して、パスワードの変更を行います。

# 参考
- [Creating an IAM user in your AWS account](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)
WinUI 3 ビジュアル資産を作成

## ビジュアル資産
WinUI 3のテンプレートを利用したプロジェクトでは、`Package.appxmanifest`で、Microsoft Storeで利用するイメージを生成できます。

![20240822 083129 Anonymous.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/345c1bcd-490c-605b-7f62-589d0ef81983.png)

ベクターの画像が利用できます。
.aiのファイルや、ベクターの画像をpdfにしたものを、ソースにすると良いです。綺麗にできるので。

私は、Affinity Designerで作成した画像を、エクスポートでPDFにしました。


## バッジロゴ

バッジ ロゴのファイル名とロック画面通知は連動しています。
バッジ ロゴのファイルが設定されている時は、ロック画面通知で「（設定なし）」を選択することはできません。

![20240822 083333 Anonymous.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/1ef3de15-3cbc-d03a-7992-ec54084cf6a9.png)


![20240822 083412 Anonymous.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/55d62c29-7013-22c6-305c-09263b10a08f.png)

### 環境
- Microsoft Visual Studio Community 2022 (64 ビット) Version 17.11.1

### 参照
- [Visual Studio のアセット生成ツールを使用してアイコンを作成する](https://learn.microsoft.com/ja-jp/windows/apps/design/style/iconography/visual-studio-asset-generation)
- [スケール、テーマ、ハイ コントラストなどのために調整された画像とアセットを読み込む](https://learn.microsoft.com/ja-jp/windows/uwp/app-resources/images-tailored-for-scale-theme-contrast)
- [画面のサイズとブレークポイント](https://learn.microsoft.com/ja-jp/windows/apps/design/layout/screen-sizes-and-breakpoints-for-responsive-design)