OmniAICreator/Qiita-1.07M huggingface dataset:
Main.storyboardを使わずXIBファイルを使うためには②


前回のあらすじ↓

https://qiita.com/miku_swift555/items/3f9026ecf43d15344000

 　
 Main.storyboardを使わずXIBファイルを使うためにはどうしたらいいかを勉強しています。
そしてSenceDelegate.swiftも消そうとしています。

　

 ![スクリーンショット 2025-02-07 10.43.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674173/ce267116-9b5b-5ae1-1d9f-c6a58c0080d9.png)

今のファイルは画像のものしかありません。

とりあえずプロジェクトの新規作成をした後に、
「SenceDelegate.swift」
「Main.stroryborad」
を削除しました。


それからやること 


①まずはAppDelegateをいじることにしました。

```swift:App.swift
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        
        // UIWindowの初期化
        window = UIWindow(frame: UIScreen.main.bounds)

        // ViewControllerをXIBで初期化
        let mainVC = ViewController() // 引数なしでinit呼び出し
        let navController = UINavigationController(rootViewController: mainVC)
        
        window?.rootViewController = navController
        window?.makeKeyAndVisible()
        
        return true
    }
}
```

②ViewController.swiftでXIBファイルを参照するよう設定

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    // XIB ファイルを指定して初期化
    init() {
        super.init(nibName: "ViewController", bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    @IBOutlet weak var Label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .white  // 背景色を設定（確認用）
    }
}
```

③Info.plistの設定を変えてAppDelegate.swiftがMain.storyboradを参照しないようにする
（これが一番難しかった…）

https://qiita.com/takuma-jpn/items/263b32513bb4ae420da6

こちらの記事を参考にさせて頂きました。
わかりやすくてありがたかったです。

これで実行するととりあえずアプリが起動したのでほっとしました。

XIB難しい！
【ServiceNow】Xanaduリリース　Clone Admin Consoleの新機能

## はじめに
みなさんこんにちは、三井情報株式会社です。

今回は、Xanaduリリースで追加されたClone Admin Consoleの新機能概要についてご紹介いたします。
リリースノートの記載だと機能の内容がわかりにくい、と思われていた方にご覧いただければと思います。

## 新機能概要
### ターゲットインスタンスの追加
以前のClone Admin Consoleでは、Target Instanceの追加時にページ遷移が必要でしたが、Xanaduリリースによりページを遷移せずにインスタンスの追加・既存のインスタンスの選択ができるようになりました。
![1-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/80f89221-f729-93de-6f09-4df4a75c77b9.jpeg)
![1-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/d9f9a905-b4e2-ecb0-25b4-72cf32cbb6a2.jpeg)

### Backup options
Optional settingsのGeneralタブに「Backup options」が追加されました。「Backup options」は、クローンリクエストが使用するバックアップを指定するオプションです。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/5e344a1b-b216-2558-7c28-5bbd2fd88f53.jpeg)

:::note info
Most recent :
インスタンスの最新のバックアップを使用してクローンを実施します。

On-demand backup : 
クローン直前にバックアップを取得してクローンするため、直近の状態でクローンが可能になります。
クローンはバックアップが完了した後に開始されるため、クローン完了時間が大幅に長くなる可能性があります。
:::

### クローン履歴の表示
Clone Admin Consoleからクローンリクエストを行った場合と、System Cloneからクローンリクエストを行った場合でクローン履歴の表示場所が異なります。
#### Clone Admin Consoleでのクローン履歴の表示
[All] > [Clone Admin Console] > [Clone Home] の [My Clones]から表示できます。
![3-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/2a4c2a97-fc95-842d-8618-a98ec11b8b7e.jpeg)

#### System Cloneでのクローン履歴の表示
[All] > [System Clone] > [Live Clones] > [Clone History] から表示できます。
![3-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/a77ef601-44d1-7b62-d588-b79ebe698f82.jpeg)

## 参考
本記事は、以下のドキュメントを参照しています。
https://www.servicenow.com/docs/ja-JP/bundle/xanadu-release-notes/page/release-notes/now-platform-administration/clone-admin-console-rn.html

## おわりに
本記事では、Clone Admin Consoleの新機能概要についてご紹介させていただきました。
最後までお読みいただき、ありがとうございました。
【Salesforce認定Platformデベロッパー】やったこと

## この記事は
筆者が、2025年2月にSalesforce認定Platformデベロッパーを取得した際に使用した教材などのまとめです。

### 筆者のスペック
+ エンジニア2年目
+ Salesforce実務未経験
+ これまでに認定アドミニストレーター取得
    + [【Salesforce認定アドミニストレーター】やったこと](https://qiita.com/shi-mashimashima/items/9217fa657897538b571f)

## 勉強の流れ
ステップ1→1.5週間
ステップ2→2週間
くらいの時間配分で取り組みました。
全ステップ合わせて大体3週間ほどです。

### ステップ1：Trailhead
デベロッパー資格の準備用Trailmixを進めました。

https://trailhead.salesforce.com/ja/users/strailhead/trailmixes/prepare-for-your-salesforce-platform-developer-i-credential

が、難しすぎて途中からハンズオンが進められなくなりました…
全部やりきるのは無理！と諦め、6割くらいこなしたところで早々と次の問題演習に移りました。
また、最低限の知識だけは入れておこうとこちらのトレイルは全部学習しました。

https://trailhead.salesforce.com/ja/content/learn/trails/force_com_dev_beginner

### ステップ2：問題演習
ひたすら問題集を周回していきます。
問題集の進め方はアドミニストレータの時と同じく

+ 1周目：ざっくり解く（わからなくてOK）、初見の用語をまとめる
+ 2周目：解説をしっかり読んで頭に入れる
+ 3周目：再度1周して不明点を明らかにする

という流れで進めていました。
1周目でやっていた、初見の用語はGoogleのスプレッドシートにまとめていました。
見返すというよりまとめることを通じて頭に入るのを狙っていました。
こんな感じ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978744/614074c8-0f15-6ef3-49f2-f31336e3acd8.png)


以下、使った問題集です。
#### Tysonblog

https://tysonblog-whitelabel.com/category/salesforce/salesforce-developper1

全215問。無料。不正解の解説もついているため、正解の選択肢を覚えるのではなく「なぜ不正解なのか」まで理解できました。

#### note

https://note.com/salesforce777/m/me118be0ec95f

全180問。有料。
Tysonblogだけでカバーできない問題を補足するために使いました。
こちらは解説がついているのが正解の選択肢のみなので、不正解の理由は自分で調べる必要がありました。

## 受験
### 試験会場
+ 認定アドミニストレーターに引き続きオンサイト受験しました。通信が途中で途切れ、3分ほど待機する時間がありましたが、それ以外はトラブルなく受験できました。
### 試験内容
+ 回答20分+見直し40分、で1時間くらいかかりました。
+ 初見の問題が半分くらい出て焦りました。
+ なんとか合格できましたが、合格点すれすれでした…！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978744/590a5b13-a353-cf16-8afa-fedc04981198.png)

## 終わりに
+ ハンズオンが少なかった分、もっとたくさん問題にあたればよかったと思います。
後からJPN試験を覗いてみたところ、出題されたものとほぼ同じような問題がたくさん載っていました。
次回からはこちらにも取り組んでいきたいです。

https://www.jpnshiken.com/exam/PDI-JPN-platform-developer-i-pdi%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88-11394.html
+ 次は認定Platformアプリケーションビルダーを受験する予定です。
引き続き精進します。
【Go】AES暗号を使用した暗号化、復号化のサンプルコード


## 概要


[**暗号技術入門 第3版**](https://amzn.asia/d/4EzqngT)に出てきたAESで暗号化、復号化をGoで実装してみた


`crypto`パッケージを使用


## サンプルコード


```go
package main

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"encoding/base64"
	"errors"
	"fmt"
	"io"
)

// encryptAES 関数は、指定された平文データを AES-GCM を使用して暗号化し、結果を Base64 エンコードした文字列として返します。
//
// Parameters:
// - plainText: 暗号化するデータ (平文)。
// - key: 暗号化に使用する秘密鍵。長さは 16, 24, 32 バイト（AES-128, AES-192, AES-256 に対応）である必要があります。
//
// Returns:
// - 暗号化されたデータを Base64 エンコードした文字列。
// - エラーが発生した場合にはエラーメッセージ。
func encryptAES(plainText, key string) (string, error) {
	// AES 暗号化モジュールを作成（指定された鍵を使用）。
	block, err := aes.NewCipher([]byte(key))
	if err != nil {
		return "", err
	}

	// GCM (Galois/Counter Mode) インスタンスを作成。
	gcm, err := cipher.NewGCM(block)
	if err != nil {
		return "", err
	}

	// 暗号化のために Nonce（初期化ベクトル、IV）を生成。Nonce のサイズは GCM 仕様に依存。
	nonce := make([]byte, gcm.NonceSize())
	// 暗号学的に安全な乱数生成器を使用して Nonce を埋める。
	if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
		return "", err
	}

	// 平文（plainText）を暗号化し、Nonce をプレフィックスとして付与。
	cipherText := gcm.Seal(nonce, nonce, []byte(plainText), nil)

	// 暗号文を Base64 形式の文字列に変換して返す。
	return base64.StdEncoding.EncodeToString(cipherText), nil
}

// decryptAES 関数は、AES-GCM を使用して暗号文を復号化し、平文データを返します。
//
// Parameters:
// - cipherText: Base64 エンコードされた暗号文。
// - key: 復号化に使用する秘密鍵。暗号化時に使用したものと同じ鍵を指定する必要があります。
//
// Returns:
// - 復号化された平文データ。
// - エラーが発生した場合にはエラーを返す。
func decryptAES(cipherText, key string) (string, error) {
	// AES 復号化モジュールを作成（指定された鍵を使用）。
	block, err := aes.NewCipher([]byte(key))
	if err != nil {
		return "", err
	}

	// GCM (Galois/Counter Mode) インスタンスを作成。
	gcm, err := cipher.NewGCM(block)
	if err != nil {
		return "", err
	}

	// Base64 形式の暗号文をデコードしてバイトデータに変換する。
	data, err := base64.StdEncoding.DecodeString(cipherText)
	if err != nil {
		return "", err
	}

	// 暗号文の先頭に付加された Nonce を分離。Nonce サイズを確認。
	nonceSize := gcm.NonceSize()
	if len(data) < nonceSize {
		// データが Nonce サイズより小さい場合は不正な暗号文としてエラーを返す。
		return "", errors.New("不正な暗号文です")
	}

	// Nonce（初期化ベクトル）と暗号化されたデータそれぞれに分割。
	nonce, cipherTextBytes := data[:nonceSize], data[nonceSize:]

	// 暗号化データを復号化して平文を取得。
	plainText, err := gcm.Open(nil, nonce, cipherTextBytes, nil)
	if err != nil {
		return "", err
	}

	// 復号化された平文を文字列として返す。
	return string(plainText), nil
}
```


## 使用


```go
func main() {
	// keyを32バイトに設定
	aesKey := "aaaaaaaaaabbbbbbbbbbccccccccccdd" 
	plainText := "Hello, World!"

	cipherText, err := encryptAES(plainText, aesKey)
	if err != nil {
		panic(err)
	}

	decryptText, err := decryptAES(cipherText, aesKey)
	if err != nil {
		panic(err)
	}

	fmt.Println("plainText: " + plainText)
	fmt.Println("cipherText: " + cipherText)
	fmt.Println("decryptText: " + decryptText)
}


// 出力
// plainText: hello,world!
// cipherText: rJWxz1xCgZuG9LPBLhz3kgjChsEeYQVXSI4+dEr2ftzlkH1gLRZ3hg==
// decryptText: hello,world!
```
ロードスイッチを使ってみた

今回ESP32からセンサーの電源ON/OFFをする必要性があったので、
TOSHIBA製のロードスイッチ
・TCK107AFLF
https://akizukidenshi.com/catalog/g/g116072
を使用してみた。

## 仕様
入力電圧：1.1-5.5V
出力電流：1A
コントロール電圧：0.9V
オートディスチャージ機能内蔵
（コントロール出力をOFFにした際、出力電圧がすぐに下がる機能。出力コンデンサーをすぐに逃がす）
コントロール電圧HIGH：出力電圧ON
コントロール電圧LOW：出力電圧OFF
コントロール電圧OPEN：出力電圧OFF

## ピン
1 Vout
2 GND
3 CONTROL
4 NC
5 Vin

## 使い方
本ICは、対象センサーの一次側（Vin）に設置する必要があります。
「システムにつながりません」を考える。

エンジニアの皆さんは運用においてもプロジェクトにおいても「システムにつながりません」という言葉を聞くことがよくあると思います。

この記事ではこの言葉に対していろいろ言えることがあると思ったので記事にしてみようと思います。
半分愚痴みたいな記事になってしまいそうですが興味があればご一読ください。

# エンジニアはこの言葉を使ってはいけない。
いきなりタイトル詐欺みたいなことを言いますがこれを読んでいるエンジニアの方がいてこんな一言で済ませてしまっているようであれば今すぐ改善すべきです。

はっきり言ってこれだけ言われても99%の人は何も答えられませんし何もできません。
* いったいどこからどこにつなごうとしているのか？
* どうやってつなごうとしているのか？
* 何をしたらダメだったのか？切り分けはしているのか？
最低でもこの辺の疑問はすぐに出てきます。

# 何をして何をしなかったのかを整理しましょう。
人に頼るのが悪いわけではないですが、何も考えず何もわかっていない状態でいきなり聞いてしまうのはよくないです。
「接続ができない」にあたったときはこの辺を整理して対応を確認していきましょう。

| コンポーネント | 確認事項 |
|:-:|:-:|
|接続元端末 |どの端末で接続を行ったのか？<br>端末を変えた場合は接続できるか？<br>端末のネットワーク設定についてDNS・proxy・ネットワーク帯(内部/外部など)を確認|
|接続方法について|どのようなプロトコルで接続しているのか？<br>RDP・SSH・HTTP・HTTPS・DBなど|
|接続先について|対象プロトコルの受付はできる状態か？<br>OSなら対象のアプリケーションが起動してポートリスンしているかなど|
|接続経路の切り分け|経路を変えられる場合それぞれの機器を経由しない場合に接続可能か？<br>例えばAWS環境でHTTPS接続している場合、ALBを経由しない接続は可能か？など|

# つまりどうなる？
これらの対応をしたうえで確認するとしたら「システムにつながりません」なんて言わないはずです。
例えば
「A端末から○○システムのXXサーバへRDPでの接続ができません。ほかの端末からもためしましたが同様にNGでした。対象端末からXXサーバへpingが通らないようですのでネットワーク経路上に問題がある可能性も考えられます。これらの情報から考えられる原因と次に対応すべきことを教えてください。」
っていう感じになると思います。

コミュニケーションとはその人の時間を奪うこと、すなわちコストを支払うことになるので、ほかの人に任せきりにするのではなく自分でも調べるようにしましょう。
Kokoro-UIAPI(Kokoro-82Mモデル) のインストールと使用方法

## はじめに

Kokoro-UIAPI は、[Kokoro-82Mのモデル](https://huggingface.co/hexgrad/Kokoro-82M)を使って、テキストやSRT字幕に音声を付けることができるツールです。OpenAI API と互換性があり、複数の言語やキャラクターに対応しています。この記事では、Kokoro-UIAPI のインストール方法と基本的な使用方法について説明します。

## 目次

1. [機能概要](#機能概要)
2. [インストール方法](#インストール方法)
   - [Linux 環境での準備](#linux-環境での準備)
   - [リポジトリのクローンと環境設定](#リポジトリのクローンと環境設定)
   - [必要なパッケージのインストール](#必要なパッケージのインストール)
   - [アプリケーションの起動](#アプリケーションの起動)
3. [API の使用方法](#api-の使用方法)
   - [API リクエストの例](#api-リクエストの例)
   - [OpenAI SDK の使用例](#openai-sdk-の使用例)
4. [対応キャラクター一覧](#対応キャラクター一覧)
5. [まとめ](#まとめ)

## 機能概要

- **テキストとSRT字幕の音声付け**: テキストやSRT字幕に音声を付けることができます。
- **オンライン試聴とダウンロード**: 生成された音声をオンラインで試聴したり、ダウンロードしたりできます。
- **字幕の同期**: 字幕のタイミングを調整することができます。
- **OpenAI API 互換**: OpenAI API と互換性があります。

## インストール方法

### Linux 環境での準備

まず、Linux 環境で `ffmpeg` をインストールします。

```bash
sudo apt install ffmpeg
# または
sudo yum install ffmpeg
```

### リポジトリのクローンと環境設定

次に、Kokoro-UIAPI のリポジトリをクローンし、Python 仮想環境を設定します。

```bash
git clone https://github.com/jianchang512/kokoro-uiapi.git
cd kokoro-uiapi

python -m venv venv
source venv/bin/activate
```

### 必要なパッケージのインストール

以下のコマンドで必要なパッケージをインストールします。

```bash
pip install -r requirements.txt
```

日本語の音声を生成するには、`fugashi` をインストールする必要があります。`fugashi` は、MeCab の Cython ラッパーで、日本語のトークン化と形態素解析を行うためのツールです。`fugashi` を使用するには辞書が必要です。UniDic が推奨されており、以下のコマンドでインストールできます。

```bash
pip install 'fugashi[unidic]' jaconv mojimoji
python -m unidic download
```

### アプリケーションの起動

すべての準備が整ったら、アプリケーションを起動します。

```bash
python app.py
```

起動後、デフォルトのUIアドレスは `http://127.0.0.1:5066` です。

## API の使用方法

デフォルトのAPIアドレスは `http://127.0.0.1:5066/v1/audio/speech` です。以下のように `POST` リクエストを送信します。

### API リクエストの例

```json
{
    "input": "音声化したいテキスト",
    "voice": "音声キャラクター",
    "speed": 1.0
}
```

成功すると、MP3形式の音声データが返されます。

### OpenAI SDK の使用例

以下は、OpenAI SDK を使用して音声を生成する例です。

```python
from openai import OpenAI

client = OpenAI(
    api_key='123456',
    base_url='http://127.0.0.1:5066/v1'
)

try:
    response = client.audio.speech.create(
        model='tts-1',
        input='天気がいいから、散歩しましょう。',
        voice='jf_nezumi',
        response_format='mp3',
        speed=1.0
    )
    with open('./test_openai.mp3', 'wb') as f:
        f.write(response.content)
    print("MP3ファイルが test_openai.mp3 として保存されました。")
except Exception as e:
    print(f"エラーが発生しました: {e}")
```

## 対応キャラクター一覧

Kokoro-UIAPI は、以下のような日本語キャラクターに対応しています。

### 日本語キャラクター
- jf_alpha
- jf_gongitsune
- jf_nezumi
- jf_tebukuro
- jm_kumo

## まとめ

Kokoro-UIAPI は、多言語対応の音声生成ツールとして非常に便利です。OpenAI API との互換性もあり、さまざまな用途に活用できるでしょう。この記事が、Kokoro-UIAPI のインストールと使用の参考になれば幸いです。

詳細なドキュメントや最新情報については、[GitHub リポジトリ](https://github.com/jianchang512/kokoro-uiapi)を参照してください。
【OCVS Migration】オンプレミス環境からOCVSへのVM移行方法

みなさん、こんにちは！

OCVSの概要と特徴について紹介しました。

https://qiita.com/ReQ_HY/items/fb2d921055ce09de2374

【OCVS Migration】オンプレミスVMware環境からOCVSへのクラウドリフトについて
今回は、「オンプレミス環境の仮想マシンをOCVSへ移行する方法」を紹介いたします。

## OCVSへの仮想マシン移行方法
OCVSへの仮想マシン移行方法は、以下の3つがあります。

### **①HCX(VMware Hybrid Cloud Extension)の利用**
HCXとは、VMwareが提供している製品で、オンプレミス環境からクラウド環境といった異なるサイト間で仮想マシンの移行を実現できるソフトウェアです。

HCXの特長として、「既存のネットワーク構成(IP/MACアドレス)を維持した状態でOCVSへの移行が可能である」という点が挙げられます。
また、VMware vSphereバージョンがHCXに対応している限り、移行元と移行先のVMware vSphereバージョンに差異があっても移行ができるため、クラウドリフトのハードルが低くなります。
HCXは、以下4つの移行機能を備えていることで、小規模環境から大規模環境、ダウンタイムの有無など要件や用途に適した移行方法を選択することができます。

・HCX Bulk Migration
・HCX Clold Migration
・HCX vMotion
・HCX Replication Assisted vMotion(RAV)

### **②OVFテンプレートのエクスポート/インポート**
既存環境の仮想マシンをOVFテンプレートでエクスポートし、OCVS環境へインポートすることで移行を実現します。
3つの移行方法の中でも操作手順が少ないため、シンプルかつ簡単に移行を行える方法です。
但し、仮想マシンのサイズやディスク容量が大きい場合、エクスポート/インポートにそれぞれ長時間を要します。
そのため、移行規模が小さい場合や、サーバのダウンタイムが十分に確保できる場合に適しています。

### **③サードパーティ製バックアップ製品の利用**
以下のバックアップ製品を利用して、OCVS環境へ移行することができます。

・Veeam Backup & Replication
・Zerto Virtual Replication
・Commvault Backup & Recovery

例えばVeeamでは、バックアップからリストアまでの操作をGUIのコンソール画面で行えるため、複雑な操作を要しません。
また、レプリケーション機能やリストア検証機能などの移行ツールを十分に備えており、移行のサポートとなります。
移行の際は仮想マシンの停止を伴うため、サーバのダウンタイムが確保できる場合に適しています。
しかし、移行時に最終差分を複製し、フェイルオーバを利用した移行を行うことで、OVFテンプレートのエクスポート/インポートと比較をすると、短いダウンタイムに抑えることが可能です。

## HCXを利用した移行方法
3つの移行方法の中でも今回は、「HCXを利用した移行」をピックアップして紹介します。
初めに、HCXを利用するには以下どちらかのライセンスが必要となります。

・HCX Advanced
・HCX Enterprise

ライセンスのグレードにより、HCX機能の利用範囲が異なります。

### **■ HCX Advanced**
HCX Advancedは、OCVSに含まれているため追加コストなしでHCXを利用することができます。
以下の3つの移行方法を使用することが可能です。

<font color="red">**1．HCX Bulk Migration**</font>
数分間の仮想マシンの停止を伴う移行方式で、vSphere Replicationを活用して移行処理が行われます。
ゲストOSのIPアドレスを変更せずに移行を行うことも、移行と同時にIPアドレスを変更することも可能です。
一度に最大100台までの仮想マシンを同時並行で移行が可能であるため、大規模な移行に適しています。
しかし、移行前後で仮想マシンの再起動を行うため、再起動を行って支障のない場合に適しています。

<font color="red">**2．HCX Clold Migration**</font>
仮想マシンを停止した状態で移行を行う方式です。
ゲストOSに割り当てられているIPアドレスとMACアドレスを維持した状態での移行が可能です。
安全な移行を実施したい場合に適しています。

<font color="red">**3．HCX vMotion Migration**</font>
vMotion機能を使用して、仮想マシンを起動した状態で移行する方式です。
ゲストOSに割り当てられているIPアドレスとMACアドレスを維持した状態での移行が可能です。
同時に複数の仮想マシンのデータコピーや同時のスイッチオーバーは実行できないため、一台ずつの処理となります。
仮想マシンの停止を許容できない場合に適しています。

### **■ HCX Enterprise**
HCX Enterpriseでは、上記3つの移行方法に加え、「HCX Replication Assisted vMotion(RAV)」という移行方法を
利用することができます。
※HCX Enterpriseを使用するには追加コストが必要となります。

<font color="red">**4．HCX Replication Assisted vMotion(RAV)**</font>
仮想マシンを起動した状態で、複数同時に移行を行える方式です。
ゲストOSに割り当てられているIPアドレスとMACアドレスを維持した状態での移行が可能です。
そのため、大規模環境かつ、ダウンタイムが許容できない場合に適しています。

※上記4つの移行方法に共通して、IPアドレスとMACアドレスを維持した状態で移行を実施する場合、
事前にオンプレミス側のネットワークをOCVS(移行先)に延伸しておく必要があります。

以上がHCXの移行機能の紹介となります。

## 最後に
今回は、OCVSへの仮想マシン移行方法について紹介しました。

OCVSへの移行方法には「HCXの利用」、「OVFエクスポート/インポート」、「サードパーティ製バックアップ製品の利用」の3つの選択肢が用意されており、それぞれ「柔軟さ」、「シンプルさ」、「高い操作性」といった特性を持ち合わせています。
そのため、要件や環境に合わせて移行方法を選択することが可能です。

また、HCXには4つの移行機能を備えており、要件や用途に合わせて複数の移行方法を使い分けできることが、最大のメリットだと思います。
HCXを利用する場合は、移行機能の要件と制限事項を確認し、移行対象仮想マシンがHCXを利用した移行に適しているか確認する必要があります。
次回は「オンプレミス環境からOCVSへのL2延伸について」を紹介しますので、是非ご覧ください。
🚀【AI×ターミナル】ChatGPTで作る最強の開発環境！5分で実現するプロ級カスタマイズガイド


みなさん、こんにちは！最近、ChatGPTを使ってターミナルの設定を効率化する方法を試してみたところ、驚くほど快適な開発環境が構築できたので、その知見を共有したいと思います。

## この記事のターゲット
- ターミナルの基本設定に不満がある方
- AIを活用して開発環境を改善したい方
- 複数のターミナルを使い分けている開発者
- カスタマイズ方法を探している初心者〜中級者

## 前提条件
- 各種ターミナル（Windows Terminal、iTerm2、Terminal.app など）
- ChatGPTアカウント（無料版でOK）
- シェル環境（bash、zsh、fish など）

## AIを活用したターミナルカスタマイズの基本戦略

### 1. ChatGPTへの効果的な指示出し

ChatGPTに設定を提案してもらう際の効果的なプロンプトテンプレートを用意しました：

```plaintext
以下の条件でターミナルの設定を提案してください：

環境：
- OS: [使用しているOS]
- ターミナル: [使用しているターミナル]
- シェル: [使用しているシェル]

要望：
1. [視認性に関する要望]
2. [機能に関する要望]
3. [その他の要望]

制約：
- [既存の設定との競合]
- [パフォーマンスの要件]
```

### 2. ベースとなる設定ファイルの生成

例えば、zshの設定ファイルをChatGPTに生成してもらう場合：

```zsh
# .zshrcの基本設定
# ChatGPTが提案した設定例

# 基本設定
export LANG=ja_JP.UTF-8
export EDITOR=vim

# カラー設定
autoload -Uz colors
colors

# プロンプトのカスタマイズ
PROMPT='%F{green}%n@%m%f %F{blue}%~%f %# '

# 補完機能の有効化
autoload -Uz compinit
compinit

# エイリアス設定
alias ll='ls -la'
alias gs='git status'
```

### 3. カラースキームの最適化

ChatGPTを使って、目に優しいカラースキームを生成できます：

```json
{
  "schemes": [
    {
      "name": "AIOptimized",
      "background": "#282c34",
      "foreground": "#abb2bf",
      "black": "#282c34",
      "blue": "#61afef",
      "cyan": "#56b6c2",
      "green": "#98c379",
      "purple": "#c678dd",
      "red": "#e06c75",
      "white": "#abb2bf",
      "yellow": "#e5c07b"
    }
  ]
}
```

## ハマりやすいポイントと解決策

### 1. 文字化けの対処
文字化けが発生した場合は、以下の設定を追加します：

```bash
# .bashrcまたは.zshrcに追加
export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8
```

### 2. プラグインの競合
複数のプラグインを導入する際によく発生する問題です：

```bash
# プラグインの読み込み順序を整理
plugins=(
  git
  zsh-syntax-highlighting  # 最後に読み込む
  zsh-autosuggestions     # その前に読み込む
)
```

### 3. パフォーマンスの最適化
起動が遅くなった場合の対処法：

```bash
# プロファイリングの有効化
zmodload zsh/zprof

# 遅延読み込みの設定
zinit ice wait'0' lucid
zinit light zsh-users/zsh-completions
```

## AIを活用した応用テクニック

### 1. 動的プロンプトの生成
GitやKubernetesの状態を表示する高度なプロンプト：

```zsh
# ChatGPTが生成した動的プロンプト設定
function git_prompt_info() {
  local ref
  ref=$(command git symbolic-ref HEAD 2> /dev/null) || \
  ref=$(command git rev-parse --short HEAD 2> /dev/null) || return 0
  echo "${ref#refs/heads/}"
}

PROMPT='%F{green}%n@%m%f %F{blue}%~%f $(git_prompt_info) %# '
```

### 2. カスタムコマンドの作成
AIを使って作業効率を上げるコマンドを生成：

```bash
# プロジェクト作成用のカスタムコマンド
function create_project() {
  mkdir -p "$1"/{src,docs,tests}
  cd "$1"
  git init
  echo "# $1" > README.md
  echo "Project $1 created successfully!"
}
```

## まとめ

AIを活用することで、以下のような効果が得られました：

- 設定ファイルの自動生成による時間節約
- 最適化されたカラースキームの提案
- カスタムコマンドやプロンプトの効率的な作成

次のステップとして、以下のようなカスタマイズにもチャレンジしてみてください：

1. Git操作の効率化
2. 開発言語別の環境設定
3. クラウド環境との連携

## 環境情報
- OS: macOS Monterey 12.6 / Windows 11 / Ubuntu 22.04
- ターミナル: iTerm2 3.4.19 / Windows Terminal 1.16 / GNOME Terminal 3.44.0
- シェル: zsh 5.8.1 / bash 5.1.16
- 検証日: 2024年2月

## 参考文献
1. [iTerm2公式ドキュメント](https://iterm2.com/documentation.html)
2. [Windows Terminal Documentation](https://docs.microsoft.com/en-us/windows/terminal/)
3. [Zsh Documentation](http://zsh.sourceforge.net/Doc/)
4. [Oh My Zsh GitHub Repository](https://github.com/ohmyzsh/ohmyzsh)
個人的備忘録：AWS EC2 への SSH 接続方法 – 鍵認証・踏み台・SSM の使い分けを体系的にまとめてみた

## はじめに

AWS の EC2 インスタンスに SSH 接続する方法は複数あり、**状況に応じた手段を選ぶことが重要** です。  

:::note info
基本的な **秘密鍵を使った方法** から **踏み台サーバー、SSM** などの方法まで幅広く存在します。
:::

本記事では、それらの方法を整理し、簡潔にまとめました。**EC2 に適切にアクセスし、効率的に運用できるようになることを目的** としています。

## 書こうと思ったきっかけ

EC2 への SSH 接続は基本的な作業ですが、**環境によって適切な方法が異なります**。  
特に、**VPC 内のプライベートインスタンスや、鍵管理が不要な方法** を知りたいと考えました。  

:::note warn
また、**踏み台サーバーや SSM など、便利な接続方法を整理することで業務の効率化** が図れます。
:::

自身の学習の備忘録として、また **他の人の参考になればと思いまとめました**。

## いろいろなSSH接続方法まとめ

AWS の EC2 インスタンスに接続する方法にはさまざまな選択肢があります。本記事では、代表的な手法を整理して紹介します。**状況に応じて最適な方法を選びましょう...！**

### 1. 一般的なSSH接続（秘密鍵を使用）
基本的なSSH接続方法です。秘密鍵を指定してログインします。

```sh
ssh -i /path/to/key.pem ec2-user@<EC2のパブリックIPまたはホスト名>
```

- **`-i /path/to/key.pem` は秘密鍵の指定**  
- **`ec2-user` は Amazon Linux / Amazon Linux 2 のデフォルトユーザー**  
  - **Ubuntu の場合は `ubuntu`**  
  - **Debian の場合は `admin`**  
  - **RHEL の場合は `ec2-user` または `root`**  

https://qiita.com/free-honda/items/a215ebb22140fe11d789

https://qiita.com/free-honda/items/dfa6a4376b155f5c5162

https://qiita.com/free-honda/items/de95a3df84b9764b56e9

### 2. SSH設定ファイル (`~/.ssh/config`) を使用

設定ファイルに情報を登録すると、簡単にSSH接続できるようになります。

**設定ファイル (`~/.ssh/config`) に以下を追加：**

```sh
Host my-ec2
    HostName <EC2のパブリックIPまたはホスト名>
    User ec2-user
    IdentityFile ~/.ssh/my-key.pem
```

**これで、以下のように簡単に接続可能：**

```sh
ssh my-ec2
```

### 3. EC2 Instance Connect（Webコンソールからの接続）
Amazon Linux を使用している場合、AWS マネジメントコンソールからWebブラウザ経由で接続できます。

AWS マネジメントコンソールの「EC2」 → 「インスタンス」 → 「接続」 → 「EC2 Instance Connect」を選択すると、**Web ブラウザから SSH 接続が可能** です。（**Amazon Linux のみ対応**）

https://qiita.com/free-honda/items/90fddc7b90246f4d3719

## 4. AWS Systems Manager (SSM) を使用（鍵不要の接続）
Session Manager を使うと、SSH鍵なしでEC2に接続できます。

**事前準備**
- **EC2 に SSM Agent をインストール**（Amazon Linux 2 / Ubuntu はデフォルトでインストール済み）  
- **IAM ロールに `AmazonSSMManagedInstanceCore` ポリシーを付与**

https://qiita.com/free-honda/items/9740ef602f072ab2b88c

### 5. Bastion（踏み台サーバー）経由の接続
VPC 内のプライベートEC2には直接SSHできないため、Bastion（踏み台サーバー）を経由して接続します。

**方法1：SSHジャンプホストを使う**

```sh
ssh -J ec2-user@<BastionのパブリックIP> ec2-user@<プライベートEC2のIP>
```

**方法2：SSHトンネルを利用**

```sh
ssh -i my-key.pem -L 2222:<プライベートEC2のIP>:22 ec2-user@<BastionのIP>
ssh -p 2222 ec2-user@localhost
```

https://qiita.com/free-honda/items/9740ef602f072ab2b88c#%E3%81%8A%E3%81%BE%E3%81%91%E8%B8%8F%E3%81%BF%E5%8F%B0%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E6%8E%A5%E7%B6%9A%E6%96%B9%E6%B3%95

https://qiita.com/free-honda/items/06d092c82d1dcb1e77fe

### 6. Elastic IP を利用（固定IPでの接続）
EC2 のパブリックIPは、再起動すると変わることがあります。Elastic IP を割り当てることで、常に同じIPでアクセス可能になります。

```sh
ssh -i my-key.pem ec2-user@<Elastic IP>
```

https://qiita.com/free-honda/items/78edd4e2eb561fb31071

## まとめ

EC2 に SSH 接続する方法は、**状況に応じてさまざまな選択肢** があります。  

- **一般的な鍵認証**  
- **SSH 設定ファイル**  
- **Instance Connect**  
- **SSM**  などを活用できます。  

:::note warn
***ネットワーク構成やセキュリティポリシーに応じて、**最適な方法を選ぶことが重要** です。***
:::

今後も **AWS の進化に伴い、新しい接続手段が出てくる可能性があるため、随時更新していきます！**
OOTBとは［ServiceNow］

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# ServiceNowにおけるOOTBとは？

- OOTB（Out of the Box）とは、「標準機能」「デフォルト設定」を意味する用語で、ServiceNowでは追加のカスタマイズをしなくても最初から利用できる機能や設定を指す
- 箱から出してそのまま使えるという意

# OOTBの特徴

- インストール直後から使える（カスタマイズ不要）
- ServiceNowのアップグレードに影響を受けにくい(不具合を回避する)
- ベストプラクティスに基づいた設計

ServiceNowでは、標準のワークフローやテーブル、フォーム、UIアクションなどが最初から提供されており、これらをOOTBの機能として活用できる

# OOTBの具体例

| 機能カテゴリ | OOTBの例 |
|------------|--------------------------------|
| テーブル | task, incident, change_request, problem など |
| ワークフロー | インシデント管理、変更管理、リクエスト管理の標準ワークフロー |
| フォーム | インシデントや変更要求のデフォルトフォームレイアウト |
| スクリプト | 標準のビジネスルール、スクリプトインクルード、UIアクション |
| レポート・ダッシュボード | インシデント管理、SLA、変更管理のデフォルトダッシュボード |
| ロール・権限 | itil, admin, asset などの標準ロール |

# OOTBとカスタマイズの違い

| 項目 | OOTB（標準機能） | カスタマイズ |
|------|-----------------|------------|
| 変更の必要性 | 変更なしで利用可能 | 追加開発や変更が必要 |
| アップグレードの影響 | 影響を受けにくい | 影響を受ける可能性あり |
| 保守性 | 高い（ServiceNowのベストプラクティスに準拠） | 低くなる可能性がある（アップグレード時の互換性問題） |
| 導入コスト | 低い | 高い（開発・テストが必要） |

# OOTBを活用するメリット

1. 迅速な導入が可能 → 最小限の設定で利用開始できる  
2. 保守性が高い → ServiceNowのアップグレード時に影響を受けにくい  
3. ベストプラクティスに基づいている → 業界標準のワークフローや構成をそのまま活用できる  
4. カスタマイズ工数を削減 → 不要なカスタマイズを避け、開発コストを抑えられる  

# OOTBの設定を変更するとどうなる？

- 小規模な変更（フォームのフィールド追加など）  
  → 影響は少ないが、ServiceNowのアップグレード時に注意が必要  

- 大幅な変更（標準ワークフローの変更、スクリプトの上書きなど）  
  → OOTBのアップデートが適用されなくなる可能性がある（競合が発生する）  

- 推奨  
    - 可能な限り OOTBをそのまま使用し、必要な場合のみ拡張（エクステンション）を検討する  

# プラグインはOOTBに含まれる？  
デフォルトで有効なプラグインは含まれ、手動で有効化が必要なプラグインは含まれない？

### OOTBに含まれるプラグイン  
ServiceNowには、最初から有効になっている（アクティブな）プラグイン がある  
これらは OOTBの一部 とみなされ、追加の操作なしで使用できる

- 例  
    - インシデント管理（Incident Management）  
    - 変更管理（Change Management）  
    - 問題管理（Problem Management）  
    - ユーザ管理（User Administration）  
    - SLA管理（Service Level Management）  

これらは、ServiceNowの 標準機能として提供されるプラグイン であり、カスタマイズせずにそのまま利用できる

### OOTBに含まれないプラグイン（アクティブ化が必要なもの）  
一方で、デフォルトでは無効になっているプラグインも多数存在する
これらのプラグインは システム管理者（admin）が手動で有効化する必要があり、OOTBとはみなされない

- 例  
    - Performance Analytics（パフォーマンス分析）  
    - CSM（Customer Service Management）  
    - ITOM Discovery（インフラ検出）  
    - Virtual Agent（仮想エージェント）  
    - HR Service Delivery（HR管理）  

これらのプラグインは、ServiceNowの標準機能として提供されていますが、デフォルトでは無効なため、OOTBの範囲外と考えられる

### OOTBとして扱われるかどうかの基準  

| プラグインの種類 | OOTBに含まれるか？ | 説明 |
|---------------|----------------|-----------------------------|
| デフォルトで有効なプラグイン | 含まれる | インシデント管理やユーザ管理など、最初から利用可能 |
| 手動で有効化が必要なプラグイン | 含まれない | システム管理者が有効化する必要がある |
| 追加ライセンスが必要なプラグイン | 含まれない | ITOM, CSM, HRSD などの有料プラグイン |




# まとめ

- OOTB（Out of the Box）とは、ServiceNowの標準機能やデフォルト設定のこと  
- カスタマイズせずにすぐに利用できるため、迅速な導入や保守性の向上につながる  
- 過度なカスタマイズは推奨されず、可能な限りOOTBを活用するのがベストプラクティス  
- デフォルトで有効なプラグインはOOTBに含まれる  
- 手動で有効化が必要なプラグインはOOTBに含まれない  
- 有料ライセンスが必要なプラグインもOOTBに含まれない


# 参考
Kobo TouchでKOReaderを使うとタッチ座標がバグる

## 対処法
`.adds/nm/koreader`を以下のように書き換える

```text:変更前(インストール直後)
menu_item:main:KOReader:cmd_spawn:quiet:exec /mnt/onboard/.adds/koreader/koreader.sh
```

```text:変更後
# Launch KOReader directly via NM after fixing the FW 4.35 Touch B mess
menu_item : main : KOReader NM : cmd_spawn : sed -i '$s/..$/10/' /mnt/onboard/.kobo/version
                  chain_always : cmd_spawn : quiet : exec /mnt/onboard/.adds/koreader/koreader.sh
```

## 参考
https://github.com/koreader/koreader/issues/10107#issuecomment-1426554028
cscの作法 その551

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

# 練習問題
csvを一行ずつ処理せよ。

# 方針
- datatable使う。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/53f52484-3267-8fa0-461b-24d3a28c7eed.png)


# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.Text;
using System.IO;

class form1: Form {
	TextBox bo0;
	TextBox bo1;
	TextBox bo2;
	TextBox bo3;
	DataTable dt;
	int n = 0;
	form1() {
		Text = "くだもの";
		ClientSize = new Size(700, 250);
		Label la0 = new Label();
		la0.Location = new Point(50, 10);
		la0.Text = "index";
		bo0 = new TextBox();
		bo0.Location = new Point(150, 10);
		bo0.Text = "id";
		Label la1 = new Label();
		la1.Location = new Point(50, 40);
		la1.Text = "";
		bo1 = new TextBox();
		bo1.Location = new Point(150, 40);
		bo1.Text = "";
		Label la2 = new Label();
		la2.Location = new Point(50, 70);
		la2.Text = "色";
		bo2 = new TextBox();
		bo2.Location = new Point(150, 70);
		bo2.Text = "";
		Label la3 = new Label();
		la3.Location = new Point(50, 100);
		la3.Text = "くだもの";
		bo3 = new TextBox();
		bo3.Location = new Point(150, 100);
		bo3.Text = "";
		Button btn1 = new Button();
		btn1.Location = new Point(150, 130);
		btn1.Text = "up";
		btn1.Click += btn1_Click;
		Button btn2 = new Button();
		btn2.Location = new Point(350, 130);
		btn2.Text = "down";
		btn2.Click += btn2_Click;
		Button btn3 = new Button();
		btn3.Location = new Point(500, 130);
		btn3.Text = "更新";
		btn3.Click += btn3_Click;
		Controls.AddRange(new Control[] {
			la0,
			bo0,
			la1,
			bo1,
			la2,
			bo2,
			la3,
			bo3,
			btn1,
			btn2,
			btn3
		});
		this.Load += new System.EventHandler(this.form1_Load);
	}
	private void form1_Load(object sender, System.EventArgs e) {
		dt = new DataTable();
		dt.Columns.Add("No", typeof(int));
		dt.Columns.Add("Iro", typeof(string));
		dt.Columns.Add("Name", typeof(string));
		Encoding enc = Encoding.GetEncoding("Shift_JIS");
		using (StreamReader sr = new StreamReader("dt8.csv", enc))
		{
			while (sr.EndOfStream == false)
			{
				string line = sr.ReadLine();
				string[] fields = line.Split(',');
				dt.Rows.Add(fields[0], fields[1], fields[2]);
			}
		}
		for (int i = 0; i < dt.Rows.Count; i++)
		{
			DataRow row = dt.Rows[i];
			Console.WriteLine("No: {0}, Iro: {1}, Name: {2}", row["No"], row["Iro"], row["Name"]);
		}
	}
	void btn1_Click(object sender, System.EventArgs e) {
		n++;
		if (n > dt.Rows.Count - 1) 
			n--;
		DataRow row = dt.Rows[n];
		bo0.Text = n.ToString();
		bo1.Text = row["No"].ToString();
		bo2.Text = row["Iro"].ToString();
		bo3.Text = row["Name"].ToString();
	}
	void btn2_Click(object sender, System.EventArgs e) {
		n--;
		if (n < 0) 
			n++;
		DataRow row = dt.Rows[n];
		bo0.Text = n.ToString();
		bo1.Text = row["No"].ToString();
		bo2.Text = row["Iro"].ToString();
		bo3.Text = row["Name"].ToString();
	}
	void btn3_Click(object sender, System.EventArgs e) {
	}
	[STAThread]
	public static void Main() {
		Application.EnableVisualStyles();
		Application.SetCompatibleTextRenderingDefault(false);
		Application.Run(new form1());
	}
}





```

以上。
トランスフォーマーと順伝搬型ニューラルネットの違い

# トランスフォーマー
ChatGPTのTに現れるトランスフォーマーという学習モデルの説明をしたいと思います。

ニューラルネットといえば、入力層から中間層を経て出力層へ出力されていきます。このような一般的なニューラルネットを順伝搬型ニューラルネットといいます。ニューラルネットを思い浮かべたとき最初に出てくるモデルですね。このモデルでは中間層が人によって設計され、データの流れは固定的です。どのように固定的かというと、ユニット間の接続関係は最初に決められたまま変わることなく、入力にかけられる重みも変わらないままです。

トランスフォーマーというモデルが従来の順伝搬型ニューラルネットと異なるのは、先ほど触れたユニット間の接続関係や重みが入力次第で様々に変化していく点にあります。

この特徴によってトランスフォーマーは豊かなネットワークの表現力を発揮し、より優れた能力を実現しています。

トランスフォーマーについて中身を学ぼうとすると最初は理解が大変ですが、「それによってネットワークの表現力が豊かになる」ということを意識すると理解の手がかりになると思います。
paizaラーニングレベルアップ問題集の「ある数字までの出力2」をやってみた。

paizaラーニングレベルアップ問題集の[ある数字までの出力2](https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__loop_1)をやってみました。
- - -
###### 問題
https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__loop_1
###### C
```c
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		printf("%d\n", i);
	}
	return 0;
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cout << i << endl;
	}
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		int n = int.Parse(Console.ReadLine());
		for (int i = 1; i <= n; i++) Console.WriteLine(i);
	}
}
```
- - -
###### Go
```go
package main
import "fmt"

func main() {
	var n int
	fmt.Scan(&n)
	for i := 1; i <= n; i++ {
		fmt.Println(i)
	}
}
```
- - -
###### Java
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		for (int i = 1; i <= n; i++)
			System.out.println(i);
		sc.close();
	}
}
```
- - -
###### JavaScript
```js
const n = Number(require("fs").readFileSync("/dev/stdin", "utf8"));
for (var i = 1; i <= n; i++) console.log(i);
```
- - -
###### Kotlin
```kotlin
fun main() {
	for(i in 1..readLine()!!.toInt()) {
		println(i)
	}
}
```
- - -
###### PHP
```php
<?php
	$n = intval(fgets(STDIN));
	for ($i = 1; $i <= $n; $i++)
		echo "$i\n";
?>
```
- - -
###### Perl
```pl
for my $i (1..int(<STDIN>)) {
	print "$i$/";
}
```
- - -
###### Python3
```py
for i in range(1, int(input()) + 1):
	print(i)
```
- - -
###### Ruby
```rb
(1..gets.to_i).each do |i|
	p i
end
```
- - -
###### Scala
```scala
import scala.io.StdIn._

object Main extends App{
	for (i <- 1 to readLine().toInt) println(i)
}
```
- - -
###### Swift
```swift
for i in 1...Int(readLine()!)! {
	print(i)
}
```
【ChatGPT・初心者】体験レポ Vol.４

こんにちは。東です。
ChatGPTの体験レポ、今回は4回目
気になっていた「画像」の生成について触れていきたいと思います。

良ければ最後までご覧ください。

過去の記事は
[Vol.1](https://qiita.com/pesysyon/items/47a67baf0001b63aade3)
[Vol.2](https://qiita.com/pesysyon/items/7c8134677da22474856d)
[Vol.3](https://qiita.com/pesysyon/items/2bc23a2b1497326407e7)

はこちら！
良ければご覧ください。

# 画像の生成
ChatGPTには画像の生成をしてくれる機能があるみたいです。
一応使い方をChatGPTに聞いてきました。

「ChatGPTの画像生成機能を体験してみたいです。使い方をおしえてください。 」

> 🔹 基本的な使い方
1,画像のリクエスト
・__描きたいものを文章でリクエストしてください。__（例：「和風の庭で猫が昼寝しているイラストを描いて」）
2,詳細な指定（任意）
・__追加でスタイルや細かい設定を指定できます。__（例：「水彩画風で、柔らかい色合いにして」）
3,画像の修正（任意）
・生成された画像を見て、「もっと○○っぽくして」「背景を青空に変えて」などの __調整をリクエストできます。__

という方法で使うことが出来るみたいです。
生成までの流れは他の生成物と同じ感じですね。

また得手不得手も教えてくれました。

>🔹 できること・できないこと
✅ 可能
・風景、キャラクター、動物、SF、ファンタジーなど __自由なイメージ__
・__スタイルの指定__（リアル風、アニメ風、油絵、水彩画など）
・__小説や漫画のワンシーンのような画像生成__
❌ 制限あり
・__実在の人物や有名キャラクターのそっくりな画像__
・著作権のある __デザインのそのままの再現__
・__超高精細なリアル写真（AIアート的な仕上がりになります）__

みたいです。
味のある絵がお好きな方には少々物足りないものがあるかもしれませんね。
### 生成してみた
何はともあれ先ずは生成を頼んでみました。
「ライトセーバーで戦う猫 で画像を生成してください。」

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/a8c93788-32a5-0dfb-007c-ba62c213bc39.png"> __カッコイイ__

テーマがよくわからないのは無視してください。
ちゃんと猫の手でライトセーバー持ってる感じがイイですね。

スタイルも指定できるとのことだったので、今度は水彩画風のテイストにしてもらいました。

「水彩画のようなさっぱりとした色合いのテーマでお願いします。」

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/8079f257-62f1-3334-c83f-3edbc74b95e2.png"> __可愛い__

最後、修正をしてみてもらいます。
もうすこし立体的に、視点も少しいじってもらいました。

「場面をより立体的に俯瞰視点での画像に修正してください。」

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/71451f88-b558-3d45-e265-2a2fca998631.png"> __かっこかわいい__

こんなかんじで、テーマについていじろうと思えばいくらでもいじることができそうです。
最後の画像に関しては、背景にライトセーバーが飛んでいたりと若干怪しい部分はあるので修正依頼で少しづつ自分の理想に近づけていけそうですね。

# まとめ
昨今様々な場所で見かけるきれいな画像はこのようにして作られているのですね。
頭に浮かんだものが他人に共有しやすくなるのはとても良いことだと感じました。
さて、次回は最終回。
「動画」の生成、やってみたいと思います。
ありがとうございました！
SketchUPで法線がおかしくなる



![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) STLを出力すると表示がおかしい。

## SketchUPについてのメモ

SketchUP2017を使い続けています。
STL出力をした時に法線が狂う（面が裏返る）箇所があるので謎でした。

## 結論
SketchUP上でグループ化したオブジェクトを上下や左右に反転させた時、法線もいっしょにひっくり返るようです。

グループを解除して面を揃え、改めてグループ化してからSTL出力すると、面の反転が治ります。

## 法線の簡単な見方
Blenderに入れて法線の方向を見ることができますが、
Mac標準のビューワー（デフォルトではSTLファイルをダブルクリックした時に起動）でも面の反転を確認することができます。
Mac標準のビューワーでは裏面は表示されないため、面がおかしい場合は、ちょっと不思議な見え方で表示されます。
bufで他のレポにあるprotoからコード生成

## はじめに

Protoファイルを別のレポジトリで管理している時にアプリケーションレポジトリでProtoファイルから生成したコードを使用したい場合があると思います。
その場合に、[buf](https://buf.build/product/cli)を使ってどのように生成するのかを調べました。

## [bufのインストール](https://buf.build/docs/installation/)

Macであればbrewでインストールします。他のインストールはリンクを。

```
$ brew install bufbuild/buf/buf
```

## 設定

```yaml:buf.gen.yaml
version: v2
managed:
  enabled: true
  override:
    - file_option: go_package_prefix
      value: <module>/gen/sample # this makes the package name consistent with your app code
plugins:
  - remote: buf.build/protocolbuffers/go:v1.36.5
    out: gen/sample/ # directory to locate the generated go code
    opt:
      - paths=source_relative
    include_imports: true

inputs:
  - git_repo: ssh://git@github.com/<proto/repo> # git repo for proto
    depth: 1
    tag: v1.0.0 # tag
```

これで`buf generate`を実行すると以下のPathにコードが生成されます。

```
gen/sample/<original path in the proto repo>/
```

アプリケーションコードからも `<module>/gen/sample/xxx` で使いたいpackageを指定して使えます。

特定のPath (`a/b/c` (proto repoのpath))だけに対してコード生成したい場合は以下のように指定することが出来ます。

```
buf generate --path a/b/c
```
Error 'ORA-20000: ORA-06512:' 



内部で使っているオラクルのDBからのエラーメッセージみたい。

+ [Error 'ORA-20000: ORA-06512:' on upsert operation](https://help.salesforce.com/s/articleView?id=000385833&type=1)

レコードに対してアップサート操作を実行すると、以下のエラーが表示される場合があります:

ORA-20000: ORA-06512: at "SNEEZY.SIMPORTLOOKUP", line 850 ORA-06512: at "SNEEZY.SIMPORTLOOKUP", line 823 ORA-06512: at line 1 : SQLException while executing plsql statement

オプションの External_ID_Field パラメータは、組織のデータにすでに存在するレコードと一致させるために使用するカスタム フィールドを指定するオプションの変数です。このカスタム フィールドは、外部 ID 属性を選択して作成する必要があります。 

また、フィールドで Unique 属性が選択されていない場合は、コンテキスト ユーザは、対象オブジェクトに対する「すべて表示」オブジェクト レベルの権限、または「すべてのデータを表示」権限を持っている必要があります。そうしないと、upsert によって重複レコードが誤って挿入されることになります。upsert 

ステートメント

これを回避するには、次のいずれかを実行します。 
1. フィールド「External_Id__c」に一致する「フィールド」を一意になるように更新します。2 
. オブジェクトのすべてのデータを表示するようにユーザープロファイルを変更します。 

# 類似のエラー

+ [Web-to-Lead and Lead Conversion](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4UXSSA3)

:::note alert
Cause: Your lead could not be processed. 
common.exception.SfdcSqlException: ORA-20025:I' 
ORA-06512: at "DOC.CACCESS", line 2435 
ORA-06512: at "DOC.CACCESS", line 585 
ORA-06512: at "DOC.CACCESS", line 666 
ORA-06512: at "DOC.CTASK", line 552 
ORA-06512: at line 1 
:::

+ [Encountering ORA validations ORA-06512 and ORA-01403](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4GtISAV)

:::note alert
caused by: System.DmlException: Update failed. First exception on row 67 with id 08p2S00000ajAIDQA2; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION, Validation Formula "SALC_Canceled_validation_regular" Invalid (ORA-20001:
ORA-06512: at "GRUMPY.TACCESS", line 110
ORA-01403: no data found
ORA-06512: at "GRUMPY.CACCESS", line 3228
ORA-06512: at "GRUMPY.CACCESS", line 2915
ORA-06512: at line 1
SQLException while executing plsql statement: {call cAccess.check_entity_access_proc_ncu(?,?,?,?,?,?)}(EXCLUDED, EXCLUDED, 5002S00001CnV3u, EXCLUDED, true, false)): []
:::

+ [Deployment Validation Error : ORA-01403: no data found ORA-06512: at "GRUMPY.CAPEXPAGE", line 183 ORA-06512: at "GRUMPY.CAPEXPAGE", line 161 ORA-06512: at line 1](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4Fz1SAF)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9d5d8b46-08fa-0b8e-ea12-796d06594f29.png)

+ [Unexpected SQL Exception when Updating Deleted PricebookEntry using Bulk API](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KD3bI0AT)

:::note alert
UNKNOWN_EXCEPTION:common.exception.SqlNoDataFoundException: ORA-01403: no data found    ORA-06512: at "DOC.CACCESS", line 3481    ORA-06512: at "DOC.CPRODUCTACCESS", line 1033    ORA-06512: at "DOC.CACCESS", line 3300    ORA-06512: at "DOC.CACCESS", line 3039    ORA-06512: at line 1      SQLException while executing plsql statement: {call cAccess.check_entity_access_proc_ncu(?,?,?,?,?,?,gUtil.gtypes_bool_to_boolean(?),gUtil.gtypes_bool_to_boolean(?),gUtil.gtypes_bool_to_boolean(?),gUtil.gtypes_bool_to_boolean(?))}(EXCLUDED, EXCLUDED, 01uIS000001DqTP, EXCLUDED, true, false, true, false, true, false); [conn=STANDARD:7:7:2589:34435]:--
:::
個人的備忘録：ホームディレクトリの大事な隠しファイルを体系的に自分なりに整理してみた

## はじめに

Linux や macOS を使っていると、ホームディレクトリにある隠しファイル（`.` から始まるファイル）を目にすることがあります。

:::note warn
これらは **シェルの設定やアプリケーションの構成、認証情報** などを保存する重要なファイルが多いです。
:::

適切に管理しないと、**動作に支障が出たり、セキュリティリスクにつながる** こともあるため、主なファイルを整理してまとめました。

## 書こうと思ったきっかけ

普段ターミナルを使っていると、  

- **「設定が反映されない」**  
- **「SSH 接続がうまくいかない」**  

といったトラブルに遭遇することがあります。  

その原因を調べていくうちに、`~/.bashrc` や `~/.ssh/config` など、**ホームディレクトリ内の隠しファイルが鍵を握っている** ことが多いとわかりました。  

また、環境を移行するときに **「どのファイルをバックアップすべきか？」** と迷うことがあったため、***重要なファイルを整理しておけば、将来的にも役立つと考えました。***

## 大事な隠しファイルをまとめてみた

ホームディレクトリにある大事な隠しファイル（`.` から始まるファイル）について、よく使われるものをいくつか紹介します。

### 設定ファイル

| ファイル名 | 説明 |
|-----------|-------------------------------------------------------------|
| `~/.bashrc` | Bash の設定ファイル。エイリアスや環境変数の設定を記述する。 |
| `~/.zshrc` | Zsh の設定ファイル。`.bashrc` と同様にエイリアスや環境変数を設定できる。 |
| `~/.profile` | ログインシェルの設定ファイル。環境変数の設定などを記述する。 |
| `~/.bash_profile` | `.profile` と似ているが、Bash 専用。 |
| `~/.vimrc` | Vim の設定ファイル。キーバインドやプラグイン設定を記述する。 |
| `~/.gitconfig` | Git のユーザー設定（ユーザー名、メールアドレス、エイリアスなど）。 |
| `~/.ssh/config` | SSH の設定ファイル。サーバー接続のエイリアスやポート設定を記述できる。 |

### 認証・鍵関連

| ファイル名 | 説明 |
|-----------|-------------------------------------------------------------|
| `~/.ssh/id_rsa` | SSH の秘密鍵（絶対に外部に漏らしてはいけない！） |
| `~/.ssh/id_rsa.pub` | SSH の公開鍵。リモートサーバーの `~/.ssh/authorized_keys` に登録して使う。 |
| `~/.ssh/known_hosts` | 過去に接続した SSH サーバーのリスト。 |
| `~/.netrc` | FTP や HTTP クライアント用の認証情報を保存するファイル（平文でパスワードが書かれるため注意！）。 |

### アプリケーション設定

| ファイル名 | 説明 |
|-----------|-------------------------------------------------------------|
| `~/.config/` | アプリごとの設定ファイルを格納するディレクトリ（XDG ベースディレクトリ仕様）。 |
| `~/.docker/` | Docker の設定や認証情報が保存される。 |
| `~/.aws/` | AWS CLI の認証情報や設定ファイル。 |
| `~/.kube/` | Kubernetes の設定ファイル（kubectl 用）。 |
| `~/.npmrc` | npm の設定ファイル（プロキシ設定、レジストリ URL など）。 |
| `~/.pypirc` | Python のパッケージインデックス設定（PyPI 認証情報など）。 |

### その他

| ファイル名 | 説明 |
|-----------|-------------------------------------------------------------|
| `~/.bash_history` | Bash のコマンド履歴。 |
| `~/.zsh_history` | Zsh のコマンド履歴。 |
| `~/.cache/` | 一時キャッシュファイルが保存されるディレクトリ。 |
| `~/.local/` | ユーザーレベルでのローカルアプリやスクリプトのインストール場所。 |
| `~/.Trash/` | 削除したファイルが一時的に保存されるディレクトリ（macOS）。 |

## まとめ

ホームディレクトリには多くの隠しファイルが存在し、それぞれが **システムやアプリケーションの動作に深く関わっています**。  

:::note info
**特に、以下のファイル・ディレクトリは重要で、トラブルシューティングや環境構築時に理解しておくと便利です。**
:::

- **シェルの設定** → `~/.bashrc`、`~/.zshrc`  
- **SSH 関連** → `~/.ssh/`  
- **アプリの設定** → `~/.config/` など  

**大切なファイルは誤って削除しないようにしつつ、適宜バックアップを取り、安全に管理しましょう！**
【ポエム】「単一機能のために多層化しないで！」という話（注：AI生成です）

みなさん、こんにちは。今日は情シスあるあるな「システムの多層化」について、ちょっと本音トークをしてみようと思います。

## ある日の情シス

「このタスク管理ツール導入してください！」
「あのSaaS使わせてください！」
「このアプリ入れたいんですけど！」

はい、よくある光景ですよね。でも、新しいツールを入れるたびに...
- ID管理しなきゃ
- セキュリティ対策しなきゃ
- 監査ログ取らなきゃ
- 各ユーザーのPC見てまわらなきゃ
- ネットワークの設定も...

うっ、頭が痛くなってきました😅

## SAPあるある

これって、SAPの導入プロジェクトでよく見る光景にそっくりなんですよね。

「うちの部署はこの機能が必要！」
「いや、こっちはこの仕様じゃないとダメ！」

気づいたら、カスタマイズだらけでサグラダ・ファミリアみたいになっちゃう...（完成いつですか？）

## 実際にあった怖い話（暴走する社内システム、情シスの叫び）

### 🔑 ID管理の混沌

**事例1：認証基盤カオス**
- 各SaaSがバラバラの認証 → 「あれ？このサービスのパスワード何だっけ...」の無限ループ😫
- パスワードリセット地獄 → 月曜の朝一、パスワード忘れの問い合わせが山盛り！
- アカウント停止漏れ続出 → 退職者のアカウントが生きてる！？ヤバすぎる...
- 退職者の権限残存問題 → 「あ、この人もう辞めてましたよ」って後から気づく恐怖

**事例2：アクセス権限迷宮**
- 部署異動の度に権限見直し → 「引継ぎミスって怖くない？」毎日ヒヤヒヤ😱
- 棚卸し作業が永遠に終わらない → エクセルの権限管理表が無限増殖中...
- 重複アカウントの存在 → 「私のアカウント、なんで5個あるんですか？」という謎
- 特権ID管理の形骸化 → 管理者権限持ってる人、多すぎない？🤔

### 💻 ローカルPC依存の罠

**事例3：Excelアドイン戦争**
- 部署別の専用アドイン乱立 → 「このアドインすごく便利なんです！」×100
- 起動遅延問題 → Excelの起動に昼休み使い切るレベル
- バージョン互換性地獄 → 「このファイル開けないんですけど〜」の日常化
- マクロ競合でクラッシュ → 保存してない作業が...（涙）

### 🔄 自動化ツールの暴走

**事例4：RPA暴走劇**
- 部署ごとの独自RPA → 「私が作ったロボさん、壊れちゃいました」
- メンテナンス不能な自動化 → 作った人が退職して誰も触れない魔境
- エラー処理の欠如 → 深夜にエラーメール100件とか普通にある
- ライセンス費用の肥大化 → 「えっ、こんなに高かったの！？」

### 📊 データ分析基盤の混乱

**事例5：データツール戦国時代**
- 部門別の独自分析基盤 → 「うちはSQL派！」「いやExcel一択でしょ！」
- データの整合性喪失 → 同じはずの数字が全然違う謎現象
- 重複投資の発生 → 似たようなツールに2度投資とか日常茶飯事
- トレーニングコストの増大 → 新入社員研修が永遠に終わらない...

### 🌐 コミュニケーションツールの迷走

**事例6：チャットツール乱立**
- 部署ごとの好み → 「大事な連絡、どのツールに来てたっけ...」
- 情報の分断 → 重要な情報が迷子になるあるある
- 通知疲れ → 通知音が交響曲レベル🎵
- ストレージ費用の増大 → 「え、こんなに使ってたの！？」な請求書

### 📝 文書管理の混乱

**事例7：ストレージ分散**
- クラウドストレージの重複 → Dropbox、Box、OneDrive...もはやコレクション
- アクセス権限の複雑化 → 「このファイル、誰に共有したっけ...」
- データのバックアップ問題 → 大事なファイルがどこにあるか分からない恐怖
- 共有設定の混乱 → 「全社公開になってた！？」という悲鳴

### 💰 経費精算の迷宮

**事例8：経費システム分裂**
- 部門別ルールへの対応 → 「うちの部署だけ特別ルールなんです」の無限地獄
- 承認フローの複雑化 → 「誰に承認もらえばいいの？」迷路
- データ集計の困難 → 経理さんが毎月徹夜...ごめんなさい🙏
- 経理業務の非効率化 → 「このレシート、どの部門の経費？」という永遠の謎

## 断捨離のススメ

要は「必要最小限」でいこうぜ！ってことです。

新しいものを入れるのは簡単ですが、運用は大変。みんなでシンプルに保つように心がけましょう。情シスの人生、もっと楽しくなるはず...！

結局のところ、シンプルにいきましょう！

- 新しいツール導入する前に、既存のもので代用できないか考える
- 業務プロセスを標準化する（例外を作りすぎない！）
- 定期的に使ってないツールを見直す
- 部門の我儘は程々に...（言うは易し）
- 段階的に統合していく

## 教訓
「簡単に導入できる」は、「簡単に複雑化する」の始まりかも...🤔
結局のところ、シンプルが一番！

最後に、私の座右の銘を共有させてください：
「システムは増やすな、減らせ」

では、今日はこの辺で！みなさんも無駄なシステムとの戦い、頑張ってください💪

#情シス #システム設計 #ポエム #運用 #設計の断捨離

::: note
# ポエム（ここだけ手入力です）
- これ全部ChatGPTで生成です。ポエムすらAIにまかせる時代。。。人間とは（哲学）
- 議事録、メールあたりは、あと2～3年で完全に置き換わるでしょう。
- コンテクスチュアルな対応が求められるカスタマーサービスや、営業の現場にもインパクトが大きいと思います。
- ただしゼロベースでの開発や、クリエイティブなことがもとめられる現場ではまだまだ人間の創造性が必要とされるでしょう。
- ってなんか自分の文章すらAIっぽくなってきたような(;^_^A
cscの作法 その550

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

# 練習問題
edgeのUIAutomationのツリーが見たい。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f0c25b11-0003-99c5-1619-7bca97f6c706.png)

# サンプルコード

```
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Windows.Automation;
using System.Windows.Forms;
using System.Drawing;


class FormMain: Form {
	private TreeView tv;
	FormMain() {
		Text = "Edge UI";
		Size = new Size(700, 700);
		tv = new TreeView();
		tv.Location = new Point(20, 20);
		tv.Size = new Size(600, 600);
		this.Controls.Add(tv);
		this.Load += new System.EventHandler(this.Form_Load);
	}
	private void Form_Load(object sender, System.EventArgs e) {
		Process process = Process.Start(@"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe", "https://auctions.yahoo.co.jp");
		Thread.Sleep(2000);
		process = UpdateTargetProcess("Yahoo!オークション - 日本最大級のネットオークション・フリマアプリ");
		AutomationElement mainForm = AutomationElement.FromHandle(process.MainWindowHandle);
		TreeNode tn = new TreeNode(mainForm.Current.Name);
		WalkEnabledElements(mainForm, tn);
		tv.Nodes.Add(tn);
	}
	private static Process UpdateTargetProcess(string title) {
		Process process = null;
		foreach (Process p in Process.GetProcesses())
		{
			if (p.MainWindowTitle.Contains(title))
			{
				process = p;
				break;
			}
		}
		if (process == null)
		{
			Console.WriteLine(title + "のプロセスが見つかりません。");
		}
		return process;
	}
	private void WalkEnabledElements(AutomationElement rootElement, TreeNode treeNode) {
		Condition condition1 = new PropertyCondition(AutomationElement.IsControlElementProperty, true);
		Condition condition2 = new PropertyCondition(AutomationElement.IsEnabledProperty, true);
		TreeWalker walker = new TreeWalker(new AndCondition(condition1, condition2));
		AutomationElement elementNode = walker.GetFirstChild(rootElement);
		while (elementNode != null)
		{
			TreeNode childTreeNode = treeNode.Nodes.Add(elementNode.Current.Name);
			WalkEnabledElements(elementNode, childTreeNode);
			elementNode = walker.GetNextSibling(elementNode);
		}
	}
	[STAThread]
	public static void Main() {
		Application.EnableVisualStyles();
		Application.SetCompatibleTextRenderingDefault(false);
		Application.Run(new FormMain());
	}
}



```

以上。
個人的備忘録：EC2秘密鍵の正しいパーミッション設定と管理方法を理解し、「Permission denied」を防いでみた

## **はじめに**

EC2 の秘密鍵は、SSH 接続を行うために必要な **キーペアの一部** です。  
適切な権限を設定しないと、**セキュリティリスクが発生し、SSH 接続が拒否される可能性** があります。  

:::note warn
**特に Linux では、**アクセス権限が厳しく管理** されており、適切なパーミッション設定が求められます。**
:::

そのため、**正しい設定方法を理解することが重要** です。

## **書こうと思ったきっかけ**

SSH 接続時に **"Permission denied"** などのエラーが発生し、原因を調べたところ、多くの場合、**秘密鍵の権限設定ミス** が関係していました。  

:::note info
***しかし、**適切なパーミッション設定を知らない人も多く**、この問題でつまずくケースが少なくありません。***
:::

そこで、**基本的な設定方法を整理し、誰でも簡単に理解できるように解説しよう** と思いました。

## EC2 の秘密鍵とは？

EC2 に SSH で接続するためには、**キーペア（Key Pair）** が必要です。  

https://qiita.com/free-honda/items/a215ebb22140fe11d789

AWS では、EC2 インスタンス作成時に **秘密鍵（`*.pem` ファイル）** をダウンロードし、それを使って SSH 接続します。


## 秘密鍵の適切な権限設定

Linux では、秘密鍵のアクセス権限が適切でないと SSH 接続が拒否されることがあります。

**適切なパーミッション設定**  
- **推奨される権限：`chmod 400`**  

```sh
chmod 400 my-key.pem
```  

- **理由:**  
  - ファイルの所有者（自分）のみが読み取り可能で、他のユーザーにはアクセス権がない状態。  

**ダメな設定の例**  
```sh
chmod 777 my-key.pem  （誰でも読み書き実行できる → 危険）  
chmod 600 my-key.pem  （書き込み権限があるが、基本的に不要）  
chmod 644 my-key.pem  （他のユーザーも読める → SSH 接続が拒否される）  
```

**設定確認**

```sh
ls -l my-key.pem
```

**適切な表示例**

```sh
-r-------- 1 user user 1679 Feb  7 12:00 my-key.pem
```

（`-r--------` は、所有者のみが読み取り可能な状態）

## SSH接続時のエラーと対処法
権限が正しくないと、SSH接続時に以下のエラーが出ることがあります。

**エラーメッセージ**

```sh
WARNING: UNPROTECTED PRIVATE KEY FILE!
Permissions 0644 for 'my-key.pem' are too open.
```

または

```sh
Permission denied (publickey).
```
**正しいユーザーで接続**

AWS のデフォルトユーザーは、OS によって異なります。

- **Amazon Linux / RHEL**: `ec2-user`  
- **Ubuntu**: `ubuntu`  
- **Debian**: `admin` または `debian`  
- **CentOS**: `centos`  

例えば、Amazon Linux に接続する場合：

```sh
ssh -i my-key.pem ec2-user@<EC2のIPアドレス>
```

## **秘密鍵の保存場所を確認**

- **鍵は安全なディレクトリ（例: `~/.ssh/`）に置くのが推奨される。**  
- **他のユーザーがアクセスできない場所に保存する。**  

## **3. まとめ**

- **EC2 の秘密鍵は、適切な権限設定を行うことが重要** であり、**推奨されるパーミッションは `chmod 400`** です。  
- **誤った権限では SSH 接続が拒否される** ため、事前に確認し、設定を見直す必要があります。  
- **秘密鍵は `~/.ssh/` などの安全な場所に保存し、第三者にアクセスされないように管理することが推奨** されます。  

**正しい設定を行い、安全かつスムーズに EC2 を利用しましょう！**
危険な団体について（元運営が語る真実）


## はじめに

これは警告です。私はかつて（脅されたので団体名は伏せますが、某空ラボネットワーク）危険な団体で運営として関わっていた者です。
その実態を目の当たりにした結果、良心の呵責に耐えられずに離脱しました。
結論から言うと、その団体は反社会的とも言える危険なグループです。
もしあなたがこの組織に関わることを検討しているのであれば、今すぐに脱退することを強く推奨します。

以下に、その団体が行っている悪質な行為について具体的に解説していきます。

## 特徴と悪質な行為

### 1. 初心者への暴言と煽り

メンバーや運営は、技術的な知識が乏しい初心者に対して露骨に攻撃的な態度を取ります。例えば、以下のような暴言が日常的に飛び交っています。

-   「お前はサーバー運営をする資格がない」
    
-   「そんな知識もない雑魚はインターネットやめろ」
    
-   「こいつは救えないガキ」
    

初心者を指導するどころか、排除しようとするこの姿勢は、成長を妨げるものであり、コミュニティの健全性を著しく損なっています。

### 2. 企業への誹謗中傷と迷惑行為の助長

特定の企業に対して悪質な誹謗中傷を行っています。例えば、A社を「アホゲームズ」と呼んだり、偽サイトを作成したりといった行為が横行しています。

さらに、団体の代表者自身が、ボイスチャットで参加者に対し、他のサーバーを荒らすように呼びかける場面も確認されています。
これは、単なる個人の問題ではなく、運営が主導して迷惑行為を行っているということで、非常に危険で反社会的な行為です。

### 3. 意見の封殺と独裁的な運営

その団体の運営は、批判や異論を一切許さない独裁コミュニティです。

例えば...

-   「他のサーバーを荒らすのは良くないのでは？」と意見を述べると即座に「うるさい」「くそガキ」と罵倒される。
    
-   その後、発言が削除され、サーバーからBANされる、メッセージも全部削除。   

不都合な意見は統制するにも関わらず、逆に他鯖にDDoS攻撃や荒らしをするなどの迷惑行為を行っているSKYLAB NETWORKの運営メンバーが、障害を患っている人を侮辱するような発言をしても、運営は見て見ぬふりをします。要するに、健全なコミュニティを望む人々は排除され、反社会的な行為をする者が優遇されるという異常な状況です。

### 4. 詐欺会社との関係

その団体は、詐欺まがいの企業を異常なほど擁護しています。

名前は伏せますが、とあるレンタルサーバーを提供している会社です。最近ではX (旧Twitter)で次のような声が頻繁に上がっています。

-   料金を支払っても商品が提供されない。
    
-   数ヶ月経っても音信不通。
    
-   解約もできない。
    
このような明らかに詐欺的な行為が行われているにもかかわらず、団体の運営はこの詐欺会社に対する批判を全て削除し、批判者をBANするという徹底ぶりです。
異常なレベルで庇うため、もはや単なる擁護ではなく、この危険団体自体が詐欺会社と何らかの関係を持っている可能性も考えられます。

## 被害者の声

被害を受けた人々は多数存在します。その一部を紹介します。

-   「ここの運営に異議を唱えたら即BANされた。民主的な議論は一切ない、独裁国家そのものだ。」
    
-   「初心者に対する扱いがひどすぎる。助けを求めても嘲笑されるだけ。」
    
-   「被害を受けたので相談しようとしたら、逆に自分が悪者扱いされた。」

-   「無料でサーバーを貸すと言われたが、実際には詐欺団体で、プリペイドカードの番号を盗まれて逃げられた」
    

## まとめ

その団体は...

-   初心者を罵倒し、排除する。
    
-   企業や他のサーバーに対する誹謗中傷や荒らし行為を助長する。
    
-   異論を許さず、独裁的な運営を行う。
    
-   詐欺を働いており、さらには言論統制を行なっている。
    

これらの点から、極めて危険な組織であると言わざるを得ません。絶対に関わらないようにしてください。

最後に、他の被害者の方が多数おり、他にも被害報告の記事が投稿されています。それらの一部をご紹介します。

https://note.com/midorifugu2007/n/ndeafd5f88474

https://note.com/abced/n/n366e3562b9a4

https://fdgdgd34.wixsite.com/skylab-network