OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelにおけるテストコードにて、テストデータを作成する方法

# Laravelでのテストコード作成

Laravelでテストコードを作成する記事を探しましたが、バージョン5や6の記事が多く、バージョン10での書き方が見つかりませんでした。自分への備忘録を兼ねて記事にします。

ここでは、事前に定義したデータベースに対して、テストコードで使用するテストデータを生成する方法について説明します。

## 対象者

この記事は下記のような人を対象にしています。

- Laravelでテストコードを作成したい人
- Laravelの初学者

## 使用バージョン

- Laravel 10.10

## 手順

まずは、**Productモデル**を作成します。

```bash
php artisan make:model Product
```

次に、**マイグレーションファイル**を作成して、`products`テーブルを生成します。

```bash
php artisan make:migration create_products_table
```

```php
// database/migrations/create_products_table.php
public function up(): void
{
    Schema::create('products', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name')->nullable(false);
        $table->unsignedInteger('cost')->nullable(false);
        $table->timestamps();
    });
}
```

マイグレーションファイルを生成した後は、以下のコマンドでデータベースをマイグレーションします。

```bash
php artisan migrate
```

次は、**ファクトリーファイル**を作成します。これにより、テストデータを簡単に生成できます。costは、数値4桁に指定しています。

```bash
php artisan make:factory ProductFactory
```

```php
// database/factories/ProductFactory.php
public function definition(): array
{
    return [
        'name' => $this->faker->name(),
        'cost' => $this->faker->numberBetween(1000, 9999), // 1000から9999の範囲で数値を生成
    ];
}
```

最後に、**テストコード**を作成します。以下のコードは商品を追加するテストを示しています。
factroyメソッドを使用することで、簡単にデータベースにテストデータを挿入できます。

```php
// tests/Feature/ShopTest.php
public function test_product(): void
{
    // 商品を追加
    $product = Product::factory()->create();
    $this->assertDatabaseHas('products', [
        'id' => $product->id,
        'name' => $product->name,
        'cost' => $product->cost,
    ]);
}
```

以下のコマンドを実行してテストを行います。

```bash
php artisan test
```

### まとめ

このようにして、Laravelでは簡単にテストデータを生成し、データベースに保存することができます。テストを通じて、アプリケーションの挙動を確認しやすくなります。

## おわりに

以上が、Laravelでのテストコード作成に関する基本的な説明です。これを参考に、さらに詳細なテストを作成してみてください。

---
MiniMagick gemのバージョンを変更したら動かなくなった。そのため5.0.1から4.5.1へ修正する。

## はじめに
Railsのバージョンアップ中にて
プロジェクトで画像処理のためにMiniMagickを使用していて、特定のバージョンでエラーが発生しました。ここではエラー内容と、その解決のためにMiniMagickのバージョンを変更した方法について共有します。

## 発生したエラー
まず、コード内で以下のようなエラーが発生しました：

    mogrify: unrecognized option `-run-command' @ error/mogrify.c/MogrifyImageCommand/5941.

このエラーは、MiniMagickが`mogrify`コマンドで`-run-command`オプションを使用しようとしたときに発生しました。`-run-command`はサポートされていないオプションであるため、エラーが発生したと考えられます。

## 環境
- Ruby: 3.2.3
- MiniMagick: 5.0.1

## エラーの原因と対応
エラーメッセージから、バージョン互換性に問題がある可能性を疑いました。調査の結果、MiniMagickのバージョンを`5.0.1`から`4.5.1`に下げることでエラーが解消しました。

## 対応手順
以下の手順でMiniMagickのバージョンを`4.5.1`に固定し、問題を解決しました。

1. **GemfileでMiniMagickのバージョンを指定**

    ```ruby
    gem 'mini_magick', '4.5.1'
    ```

2. **バージョンのダウングレード**

    ```bash
    bundle install
    ```

## まとめ
MiniMagickのバージョンを`5.0.1`から`4.5.1`に変更することで、エラーが解消されました。画像処理で似たようなエラーが発生した場合、バージョン互換性の確認が有効です。

今後、さらにバージョンが更新される際には、再度互換性の確認が必要になるかもしれません。
いらん事してレジストリエディタを手動で治す羽目になった話

# 経緯
ある日、私はBIZ UDPゴシックにハマっていました。
会社のパソコン(windows10)のフォントも「BIZ UDPゴシックにならないかな～」と考えて、検索し、とあるフリーソフトを導入しました。
（ソフト名は割愛しておきます。調べれば有名なソフトだと思いますので興味のある方はお調べください。）
そこで、フォルダ名のフォントやメッセージボックス、タイトルバー等をBIZ UDPゴシックに変えました。
「これで好きなフォントになって作業効率3倍や！」と意気揚々としていました。

そして、自社のシステムを立ち上げると...

「レイアウト崩れとる！！！なんか謎の空白の領域がある！！なんか全体的に違和感がある！！！」

悲劇が起きました。これでは、正常な業務ができません。フォントを諦め、
すぐにデフォルトのフォント(Yu Gothic UI 9pt)に戻しました。
改めて治ったか自社システムを立ち上げると...

「治ってない！！！再起動しても治ってない！！どうして！！！」

絶望しました。そもそも、自社システムのフォントはwindowsのデフォルトフォントに依存するものではなく、フォントは変更前と変わっていなかったのに、レイアウトが崩れていました。
そんなこんなで、タイトルにある通りのお話が生まれました。

# 環境
|種別|値|
|--|--|
|OS|Windows10Pro|
|Version|22H2|
|社内システム|WindowsForm|

:::note info
社内規定に則った上で、フリーソフトを導入しています。
:::
# 対処記録
フォント変えただけなのになんでこんな事になっているんや...
最悪PC初期化するか...?でもセットアップの時間を考えたら直した方が早いよな...
と思いながら調べていくと、同様の事例で困っている方がチラホラといました。
「幅が広がっている」この現象にたどり着きました。
そのツールはフォントの影響と思われますが、メニューバー等の幅を変えるようでした。
そして、元のフォントに戻してもその値は戻らない。というのが原因と推測しました。
レジストリエディタで、変更可能な為、
「コンピューター\HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics」内のどこかしらを変えれば行けるはず!!!と計画しました。
しかし、デフォルト値がわかりませんでした。
幸いな事に、社内には同じPCを使っている社員が居たため、レジストリエディタを見せて頂き、値を合わせることで元に戻すことができました！ほんと良かった！

# 結論
・ツールが、メニューバーのサイズを変更していた。
・ツールでフォントを元に戻しても、サイズは戻せない。
・「コンピューター\HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics」の設定を手動で初期値に戻した。

# 参考
参考までに私のPCの初期値を添付します。フォントのバイナリは
![Registry.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898103/ed0541b2-02f1-2cea-f522-c0c9634a73c0.png)
(多分MenuWidthかCaptionWidthかな...)

# まとめ
いらん事したせいで、初期化寸前まで考えました。治って良かったものの、今後は戒めて生きたいと思いました。
しかし、レジストリ内のフォントの場所であったり、メニューの仕組み・依存関係等が学べました。
結果よし！（？）
もし、同じ現象の方がいましたら、お役立てると幸いです。

ここまでお読み頂き有難うございます。
この記事が面白い、参考になったと思ったら是非、いいねを頂けますと今後の記事のモチベとなりますので、お気軽にお願いします。
tsvファイルの各行のカラム数をカウントする（awk）

（自身の備忘録用です）

任意のtsvファイルの各行のカラム数を表示
NF→フィールドの数（カラム数）
```
cat [ファイル名] | awk -F '[区切り文字、tsvなので¥tを指定]' '{print NF}'

例）
$ cat test.tsv | awk -F '\t' '{print NF}'
```
PMO業務の一例

<h1>1.PMOについて</h1>
　プロジェクトを円滑に進めるため補佐する立場で、各プロジェクトによってPMOの担当する業務内容が異なるので、
今回は私が業務を一例として紹介したいと思います。<br>


<h2>2.会議の運営</h2>
　まず初めに、会議開催案のメールの送信。<br>
週一で内部の進捗会議を実施しており、週初めに開催案内をメールで送信を行っております。<br><br>
内容として<br>
1：送信先<br>
2：会議内容<br>
3：会議名<br>
4：開催日時<br>
5：会議卓<br>
6：会議URL<br>
7：会議資料<br>

進捗会議では、限られた時間で行わなければならないのでタイムキーパーをしながら進行や議事録作成、録音などを行います。





<h2>３.集計対応</h2>
  月一、週一で各集計対応を実施しております。<br><br>
①月一にプロジェクト内で実施しているセキュリティ教育の実施状況の集計。<br>
　プロジェクトに参画しているメンバーが、期限内にセキュリティ教育実施しているかを集計し、未実施だったら、該当するメンバーのリーダーに実施の依頼を行う。<br>
最終日にまだ未実施のメンバーがいたら直接連絡をとり実施してもらいます。<br>



 <br>
 ②WBS、EVMの集計を実施<br>
　各チームの担当者が、毎週の実績を専用のツールに登録してもらいWBS、EVM集計を実施する。<br>
　WBS集計では完了日や進捗率が作業予定日と差異があったさいは、担当者に問い合わせを行い、実績が入力誤りか何か理由がってそうしているのかを確認します。<br>

　EVM集計では、ツールを使用して一週間の実績をスケジュールや工数の差異があると、特定の値が大きくなったりマイナスになることがあります。
このような時は、WBS集計に書いたように担当者に問い合わせを行います。
トポロジとは

>ネットワークの接続形態を`点と線でモデル化`したもの

https://wa3.i-3-i.info/word12191.html#:~:text=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E6%8E%A5%E7%B6%9A%E5%BD%A2%E6%85%8B%E3%82%92%E7%82%B9%E3%81%A8%E7%B7%9A%E3%81%A7%E3%83%A2%E3%83%87%E3%83%AB%E5%8C%96%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE

>ネットワークトポロジーの形状として、`バス型、スター型、リング型、ツリー型、メッシュ型、複合型、階層型`が存在している。例えば、スター型は1台のハブにすべての端末が接続される形状で、バス型は両端にターミナル（終端）を接続した1本の基幹回線にすべての端末が接続される形状、リング型は各端末が環状に接続される形状である。

https://www.weblio.jp/content/%E3%82%B9%E3%82%BF%E3%83%BC%E5%9E%8B

# 図
https://www.mgco.jp/magazine/plan/mame/b_network/0208/

https://www.n-s-c.co.jp/Ethernet-TSN/network/industrial-ethernet/944/
【備忘用】S3バケットの指定した箇所のオブジェクト数と総容量を表示させるCLIコマンド

# 目次
[1.はじめに](#1-はじめに)
[2.前提条件](#2-前提条件)
[3.CLIコマンド](#3-CLIコマンド)
[4.まとめ](#4-まとめ)

# 1. はじめに
ELBのログを確認したときに、S3にしこたま圧縮格納されているオブジェクトを見て、これどのくらいのオブジェクトあってどのくらいの容量なのかなぁとAthena試算用で出したかったのです。

今後も使うだろうけど、メモがてら記事にしようかなと思った次第でございます！
もっといいやり方ある場合はご教授いただけるとしっぽブンブンです。
よろしくお願いいたします！！！！

# 2. 前提条件
特になし
→今回は表示させてテキスト出力くらいなので、Cloud shellでいいかなぁと
権限の関係でCloudshell使えないとかの場合はAWS CLIインストールしたサーバにCLI打てるように権限追加等して環境を整えてください。
今回の説明からは省きます。

# 3. CLIコマンド

母体はこれです。
```CLI:AWS CLI
aws s3api list-objects-v2 \
    --bucket バケット名 \
    --prefix オブジェクト格納先のパス \
    --query '[sum(Contents[].Size), length(Contents[])]' \
    --output json > hogehoge.txt
```

ここにALBのコマンドパスとか入れてみる9月分のものを見たいときは以下みたいな感じ
<>の中は補完くださいませ。

```CLI:AWS CLI
aws s3api list-objects-v2 \
    --bucket <your-s3-bucket-name> \
    --prefix <ELB-name>/AWSLogs/<account-id>/elasticloadbalancing/<region>/2024/09/ \
    --query '[sum(Contents[].Size), length(Contents[])]' \
    --output json > september_summary.txt
```

途中の日付から指定した日付まで見たいときとかは以下みたいな感じ
※8月20~月末までの例

```CLI:AWS CLI
aws s3api list-objects-v2 \
    --bucket <your-s3-bucket-name> \
    --prefix <ELB-name>/AWSLogs/<account-id>/elasticloadbalancing/ap-northeast-1/2024/08/ \
    --query '[sum(Contents[?contains(Key, `08/2`) || contains(Key, `08/3`) ].Size), length(Contents[?contains(Key, `08/2`) || contains(Key, `08/3`) ])]' \
    --output json > august_summary.txt
```

# 4. まとめ
テキストにしてますが、テキストいらないって方はoutputの行消してもらえばコマンドライン上に表示されますyo!

こんなの知ってるしと思っていても人間忘れるもの、そんな自分のための記事でございました。
同じような人いれば使ってくださいませ。
ゆびダイスをJuliaで確認してみる

二人いればサイコロと同じく1から6までの乱数を発生させることができる、という「[ゆびダイス](https://gamemarket.jp/game/184200)」が面白そうだったので、Juliaで実装して試してみました。どんなものかは、リンク先を読んでください。あるいは、下の実装を見てください。


# コード
まずコードは以下の通りです。

```julia
using Random
using Plots
Random.seed!(123)

struct Human
    finger::Function
end

function junken(akun, bkun, filename)
    num = 100000
    deme = zeros(Int8, num)
    kazu = zeros(Int64, 6)
    prob = zeros(6, num)

    for i = 1:num
        a = akun.finger()
        b = bkun.finger()
        wa = a + b
        d = wa % 6
        d = ifelse(d == 0, 6, d)
        deme[i] = d
        kazu[d] += 1
        for k = 1:6
            prob[k, i] = kazu[k] / i
        end
    end
    f(x) = 1 / 6
    plot(1:num, f.(1:num), label=nothing, xaxis=:log)
    for k = 1:6
        plot!(1:num, prob[k, :], label="$k", xaxis=:log)
    end
    savefig(filename)
end
```

Humanという型を用意して、手の出し方を指定できるようにしています。例えば、

```julia

onaji() = rand(0:5)
zeronashi() = rand(1:5)
onetwo() = rand(1:2)

function katayori(b)
    r = rand()
    if r <= b[1]
        return 0
    elseif b[1] < r <= b[2]
        return 1
    elseif b[2] < r <= b[3]
        return 2
    elseif b[3] < r <= b[4]
        return 3
    elseif b[4] < r <= b[5]
        return 4
    elseif b[5] < r <= 1
        return 5
    end
end
```
のような四種類作りました。

これを使って、

```julia
function main()
    akun = Human(onaji)
    bkun = Human(onaji)
    junken(akun, bkun, "prob.png")

    akun = Human(onaji)
    bkun = Human(zeronashi)
    junken(akun, bkun, "prob_no0.png")

    akun = Human(onaji)
    bkun = Human(onetwo)
    junken(akun, bkun, "prob_onlytwo.png")

    b1 = [0.3, 0.4, 0.43, 0.55, 0.8]
    b2 = [0.1, 0.2, 0.33, 0.75, 0.9]

    akun = Human(() -> katayori(b1))
    bkun = Human(() -> katayori(b2))
    junken(akun, bkun, "prob_ryokatayori.png")

    b1 = [0.3, 0.4, 0.43, 0.55, 0.8]

    akun = Human(() -> katayori(b1))
    bkun = Human(onaji)
    junken(akun, bkun, "prob_katakatayori.png")
end
main()

```
とすることで、ダイスの目がどのように偏るのかがわかります。

# 結果
結果は以下の通りです。

- 両方等確率
![prob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246113/0beb307b-8e73-4d38-e553-2f0808ac00db.png)


- 片方が絶対に0を出さない

![prob_no0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246113/c4f82cf1-f98e-a785-da2b-0e9aaa2bdd27.png)

- 片方が1と2しか出さない

![prob_onlytwo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246113/f79f31a2-bb62-66b2-d437-72804d06cdc4.png)

ここまでのパターンは、どの目の等価に出ています。

次に、0から5の指に偏りがある人がいるとどうなるか、です。

- 片方に偏り

![prob_katakatayori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246113/a89ff06a-87cb-f116-0183-703085c07b0d.png)

片方だけ偏っている場合は、これまでと同じでちゃんと1/6です。

- 両方偏っている

![prob_katayori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246113/e957fe57-cadd-4805-c64f-d5334465f5a2.png)

両方偏ってしまうと、もちろん、1/6にはなりません。

# まとめ
一人が操作してダイスの特定の目を出すのは難しそうです。両方操作したような場合は、1/6からはずれますが、どう偏るかは二人の偏りに依存するので、二人ともどの目が出やすいか把握するのは難しいです。
Swift: Dictionary の更新

## プログラム

```swift:text_update.swift
// --------------------------------------------------------------------
//	  text_update.swift
//
//						  Oct/29/2024
//
// --------------------------------------------------------------------
import Foundation

// --------------------------------------------------------------------
func textWriteProc(fileOut: String, dictAA: [String: [String: Any]]) {
	do {
		let fileURL = URL(fileURLWithPath: fileOut)
		var strOut = ""
		
		for (key, unit) in dictAA {
			if let name = unit["name"] as? String,
			   let population = unit["population"] as? Int,
			   let dateMod = unit["date_mod"] as? String {
				strOut += "\(key)\t\(name)\t\(population)\t\(dateMod)\n"
			}
		}
		
		try strOut.write(to: fileURL, atomically: true, encoding: .utf8)
	} catch {
		fputs("*** error *** in textWriteProc ***\n", stderr)
		fputs("\(error)\n", stderr)
	}
}

// --------------------------------------------------------------------
func textReadProc(fileIn: String) -> [String:[String:Any]] {
	var dict = [String: [String: Any]]()
	
	let fpIn = try! String(contentsOfFile: fileIn, encoding: .utf8)
	let lines = fpIn.components(separatedBy: .newlines)
	
	for line in lines {
		let cols = line.trimmingCharacters(in: .whitespacesAndNewlines).components(separatedBy: "\t")
		if cols.count >= 4, cols[0].hasPrefix("t") {
			if let population = Int(cols[2]) {
				dict[cols[0]] = ["name": cols[1], "population": population, "date_mod": cols[3]]
			} else {
				print("*** error *** \(fileIn) ***")
				print("*** \(line) ***")
			}
		}
	}
	
	return dict
}

// --------------------------------------------------------------------
func dictDisplayProc(dict: [String:[String:Any]]) {
	for (key, value) in dict.sorted(by: { $0.key < $1.key }) {
		let name = value["name"]!
		let population = value["population"]!
		let dateMod = value["date_mod"]!
		print("\(key)\t\(name)\t\(population)\t\(dateMod)")
	}
}

// --------------------------------------------------------------------
print("*** 開始 ***")

guard CommandLine.arguments.count > 1 else {
	print("入力ファイル名を指定してください")
	exit(1)
}

let fileIn = CommandLine.arguments[1]
let keyIn = CommandLine.arguments[2]
let populationIn = Int(CommandLine.arguments[3])!

print(fileIn) 
print(keyIn,populationIn) 

var dict = textReadProc(fileIn: fileIn)

var value = dict[keyIn]!
print(value["population"]!)
let name_target = value["name"]!
print(name_target)
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let today = Date()
let formattedDate = dateFormatter.string(from: today)
print(formattedDate)

let value_new: [String: Any] = ["name": name_target, "population": populationIn, "date_mod": formattedDate]
dict.updateValue(value_new,forKey: keyIn)
dictDisplayProc(dict: dict)
textWriteProc(fileOut: fileIn, dictAA: dict)

print("*** 終了 ***")
// --------------------------------------------------------------------
```

## 実行コマンド

```bash
swift text_update.swift cities.txt t2381 2398000
```

## 確認したバージョン

```text
$ swift --version
Swift version 6.0.1 (swift-6.0.1-RELEASE)
Target: x86_64-unknown-linux-gnu
```
picoCTF 2024 writeup Time Machine

## Time Machine (General Skills)

What was I last working on? I remember writing a note to help me remember... You can download the challenge files here:
* challenge.zip

添付ファイルを`unzip`する。
drop-inディレクトリ配下にファイルが展開されるので、`cd`でディレクトリを移動すると、message.txtが見つかる。`strings`で可読文字列を出力すると、以下のメッセージが出力された。
```
This is what I was working on, but I'd need to look at my commit history to know why...
```
commit historyを見ろということらしい。drop-in配下には`.git/COMMIT_EDITMSG`があることを`find`で表示するか`unzip`したときに見ることができる。このファイルは名前からしてcommit messageが書き込まれていると推測できる。`strings`で`COMMIT_EDITMSG`の可読文字列を出力する。
```
$ strings .git/COMMIT_EDITMSG 
picoCTF{t1m3m@ch1n3_8defe16a}
```
フラグが得られた。

`picoCTF{t1m3m@ch1n3_8defe16a}`
別アカウントのLamdbaをinvokeする際の注意点

## やりたいこと
今回はECSから別アカウントのLambdaをinvokeする際に少し沼ったので注意点を挙げたと思います！

## やり方
### 権限の設定

#### 1. 呼び出し先のLambdaでの設定

 **Lambdaのアクセス許可ポリシーの追加**
   - Lambda関数に対して呼び出し元のアカウントから呼び出しを許可するためのリソースベースのポリシーを設定します。(Lambdaの実行ロールなどはいじる必要はありません！)
   - AWS CLIでする場合は以下のコマンドを参考にしてください！

   ```bash
   aws lambda add-permission \
       --function-name my-function \
       --statement-id AllowInvokeFromAccount \
       --action lambda:InvokeFunction \
       --principal arn:aws:iam::<Account_ID>:root
   ```

   - `my-function` は呼び出したいLambda関数名、`<Account_ID>` は呼び出し元のアカウントIDに置き換えます。

#### 2. 呼び出し元のECSでの設定

 **ECSタスク実行ロールの更新**
   - ECSタスクがLambdaを呼び出すために使用するIAMロールを更新します。

   ```json
   {
       "Version": "2012-10-17",
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "lambda:InvokeFunction",
               "Resource": "arn:aws:lambda:<region>:<Account_ID>:function:my-function"
           }
       ]
   }
   ```

   - `my-function`は呼び出したいLambda関数名、`<region>`はLambda関数が存在するリージョン、`<Account_ID>`は呼び出し先のアカウントIDに置き換えます。


### ネットワークの設定
#### 1. 呼び出し元
呼び出しを実行するECS(Lambda)がネットに繋がっていれば問題ないです！
(igwまたはnat経由、endpoint経由、どれでもOKです)
#### 2. 呼び出し先
ここが少し分かりづらいところです。結論としては、LambdaがVPC内かVPC外によって、状況が変わってきます。
 ##### VPC外のLambda
 まず、VPC外のLambdaはネットにつながっているので、特段の設定の必要は無いです。
 ##### VPC内のLambda
 そして、VPC内のLambdaは(natなどを設置せず)ネットへにつながっていなくても、呼び出される側であれば、問題ないです。これは、公式ドキュメントに明記されているわけでは無いですが、以下を参考をしました。実際に挙動がそうなっていますし、概念として、理解はできるのですが、実際、裏側の仕組みがどのようになっているが、AWSが公開してほしいです。。(私が見逃しているだけだったらすいません！)
 
https://qiita.com/hirai-11/items/f16b326061956fb85c9c

https://stackoverflow.com/questions/41559577/why-can-i-call-an-on-vpc-aws-lambda-from-an-off-vpc-aws-lambda-but-not-vice-vers#comment86269656_41559669
 
https://dev.classmethod.jp/articles/sqs-to-vpclambda/#toc-3
 
呼び出す側である時は、ネットへの接続(natなどの設定)が必要であるので忘れずに！
## 注意点
　AWS SDKでinvokeを実行する際、呼び出し先のLambda名を引数としますが、別アカウントのLambdaを呼び出す際は、名前とせずに、必ずarnとしてください。でないと、どのアカウントかわからず、接続先が見つからないとエラーが出ます。。　
 
   ```bash
       arn:aws:lambda:us-west-2:123456789012:function:my-function
   ```
   arnに含まれている、アカウントIDでルーティングしているみたいですね。(考えてみればそりゃそう。。)
 これをネットワークの問題だとずっと思っていて、沼りました笑


 --------------

すでに、ここら辺の話で有効な記事があると思いますが、自分の備忘録のためにも、書かせていただきました！(当たり前じゃん！って内容だと感じた方、すいません。。)
以上です！最後まで読んでいただきありがとうございました！
自律システムとは

>「Autonomous System」の略で、「自律システム」とも呼ばれます。 ASは、 `統一された運用ポリシーによって管理されたネットワークの集まり`を意味し、 `BGPというプロトコルにより接続される単位`となります。 `AS間で経路情報の交換を行うことにより、 インターネット上での効率的な経路制御を実現`します。 通常、`規模の大きいISPのネットワークは固有のASを形成`しております。
>
>ASは`16ビット※の数字を用いたAS番号によってインターネット上で一意に識別`され、 日本ではJPNICがその割り当てと管理を行っています。

https://www.nic.ad.jp/ja/basics/terms/as.html#:~:text=%E3%80%8CAutonomous%20System%E3%80%8D%E3%81%AE,%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

* `統一された運用ポリシーによって管理されたネットワークの集まり`の運用ポリシーとは？
* `BGPというプロトコルにより接続される単位`のBGPとは？
* `規模の大きいISPのネットワークは固有のASを形成`のISPとは?


>AS（Autonomous System）とは、`インターネット上のネットワークの単位を表す考え方`です。日本語では自律システムと呼ばれます。
>
>ASは、`個別の運営組織ごとに独立したネットワーク`を指し、インターネットは`これらのASがBGP（Border Gateway Protocol）などの経路制御プロトコルを使用して接続されることで構築`されています。つまり、`インターネットに接続するすべてのコンピューターやデバイスがASに接続`されることになります。
>
>ネットワーク上は複雑に絡み合っているので、どの経路が最短の道のりで通信ができるのか道案内（最適な経路の選択）をする必要があります。この処理をルーティングといい、ASはあるひとつのルーティングポリシーによって管理されたネットワークの塊になっています。
>
>AS自体はどのように管理するのかというと、`ASを識別するAS番号（ASN）`というものがあります。AS番号は、重複を避けるために、IANA （インターネット番号割当機関）が管理しています。
>
>また、AS同士を相互に接続する方法として、`IX（インターネットエクスチェンジ）という物理的な場所への接続`があります。IX接続により、`データ経路が最適化され、高速で効率的な通信が可能`です。
異なるデータセンターやISP同士で相互に通信する場合、接続するネットワーク回線をそれぞれに用意する必要があります。しかし`IXを利用すると、データセンターやISPは他のすべての事業者に相互接続することが可能`です。

https://www.idcf.jp/words/as.html#:~:text=AS%EF%BC%88Autonomous%20System%EF%BC%89%E3%81%A8,%E3%81%93%E3%81%A8%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82

* `インターネット上のネットワークの単位を表す考え方`
* ASは、`個別の運営組織ごとに独立したネットワーク`
* `これらのASがBGP（Border Gateway Protocol）などの経路制御プロトコルを使用して接続されることで構築`

>大きなプロバイダーのネットワークは、いくつかのネットワークをまとめた「自律システム（AS)」を構成しています。細かなネットワークを経由する代わりに、`AS間の接続を利用できれば、遠くのコンピューターまでより早く届ける`ことができます。

https://www.sbcr.jp/product/4797396072/

# 感想
インターネットは自律システムのグループでグループが分かれば素早く送れる
Lambda（Node.js）のDockerイメージをデプロイしてみた。（その２，Node.jsのイメージ作成）

# はじめに
LambdaをDockerイメージでデプロイする方法を、調査する機会があったので自分の備忘用にメモ書きを残します。

今回は、デプロイ用のNodeイメージを用意する所をメモ書きします。

Dockerファイルの記載方法がハマりどころでした。

# EC2に、Node.jsの環境を用意する

+ コンパイル環境の用意
+ gitの用意
+ nvmのインストール
+ nvmを使ってNode.jsをインストール

```shell
sudo yum update
sudo yum -y install gcc-c++
sudo yum -y install git
git clone https://github.com/creationix/nvm.git ~/.nvm
```

「.bash_profile」を書き換えて、ログイン時にNVMの情報を読み込むようにする。

```shell
# nvm
if [[ -s ~/.nvm/nvm.sh ]] ; then
        source ~/.nvm/nvm.sh ;
fi
```
を末尾に追記する。

端末（Teraterm）を切断　→　再接続し、プロファイルを有効にする。

```shell
nvm ls-remote
```

でインストール可能なバージョンを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/042af86e-43dc-832c-1b2b-6d2f92db2a01.png)

```shell
nvm install v20.18.0
node --version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/43c863af-90c9-505a-413e-8f48e61a2143.png)

# Docker上に転送するモジュールとコード一式を用意

+ デプロイプロジェクト用のディレクトリを用意する

```shell
cd
mkdir DeployProject
cd ./DeployProject
```

+ npm init で package.json を作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/60f248f3-c3e2-2519-d224-26cbbda82f23.png)

+ 必要なライブラリ群をインストールする

```shell
npm install aws-sdk
npm install http
npm install aa            
npm install executors
npm install request
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/73f110f2-689b-e39a-c34a-67e7968009dd.png)

ここまでで、
+ node_modules
+ package-lock.json
+ package.json
が作成される。

```dockerfile
FROM public.ecr.aws/lambda/nodejs:20

RUN mkdir -p /opt

COPY index.js ${LAMBDA_TASK_ROOT}
COPY node_modules/ ${LAMBDA_TASK_ROOT}/node_modules/
COPY package-lock.json ${LAMBDA_TASK_ROOT}
COPY package.json ${LAMBDA_TASK_ROOT}

CMD [ "index.handler" ]
```
を、$HOME/DeployProject/Dockerfileに用意する。

公式のLambda実行環境イメージに、自分のソース＆ライブラリ群を転送するイメージです。

node_modules ディレクトリの転送記述は、上記の記載で大丈夫でした。

# まとめ
今回のビルド用の環境用意までを記載しました。

node_modulesの転送用の書き方や、package.json、package-lock.jsonを用意しておかないとLambdaとして動かしたときに上手く動かなかったというのが、今回のメモ書きの大事なところです。

# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。
AWSのLambda開発関連で、ライトな開発や、ちょっと、こんな事を自動化したい！等も、お気軽に問い合わせください。

https://www.cs-cloud-aid.com/
【学習】deviseと開発環境パスワードリセット機能実装+フラッシュメッセージ

## はじめに
今回は「パスワード忘れた方はこちら」から始まる各種設定を行っていきたいと思います。

https://zenn.dev/ebina_shohei/articles/6c3b325a361f19

`devise`部分以外の`gem`導入などは上記記事を参考に進めていきます

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3


## 本題：`devise`側での設定
参考記事の内容を一通り？完了させた後。
`Devise`を使うとパスワードリセット機能は自動的に実装され、ルーティングも`Devise`側で自動的に追加されるため、手動でのルーティング設定は不要です
👇ログイン画面等に実装されている「パスワードお忘れの方はこちら」ボタンを押すと初期状態では次のような画面が表示されます。
[![Image from Gyazo](https://i.gyazo.com/f2e3cd6b5412180066c3e510c066c6a1.png)](https://gyazo.com/f2e3cd6b5412180066c3e510c066c6a1)


こちらのビューファイルは`app/views/devise/passwords/new.html.erb`になります。自身の好きなスタイルに変更すればビューファイルは完了です。

#### ※`<%= render "devise/shared/links" %>`部分について
- このコードはDeviseが提供する 共通リンク部分のテンプレート を表示し、「パスワードを忘れた場合」や「アカウント登録はこちら」などのリンクが含まれています。
- `app/views/devise/shared/_links.html.erb`ファイルを編集することでカスタマイズすることができます。


#### ※フラッシュメッセージを実装したい（間違えた時）
パスワード再設定画面でメールアドレスを無事に送信できた時、自動でフラッシュメッセージを表示するようになっていますが、メールアドレスを間違えたり、メールアドレス無記入の時はフラッシュメッセージが表示されないと思います。

以下私が行った設定です
```app/controllers/users/passwords_controller.rb
  def create
    self.resource = resource_class.send_reset_password_instructions(resource_params)
  
    if successfully_sent?(resource)
      redirect_to after_sending_reset_password_instructions_path_for(resource_name)
    else
      flash[:alert] = "メールアドレスを確認してください" if is_navigational_format?
      render :new # もしくは、適切なテンプレートを表示
    end
  end
```

おそらく上記コードで設定できるかと。


#### ※メール内容を英語表記から日本語表記へ
`devise`の日本語設定実行済みの場合`config/locales/devise.vieews.ja.yml`の内容を使用することができます
👇編集したファイルになります。
```app/views/devise/mailer/reset_password_instructions.html.erb
<p><%= t('.greeting', recipient: @resource.email) %></p>

<p><%= t('.instruction') %></p>

<p><%= link_to t('.action'), edit_password_url(@resource, reset_password_token: @token) %></p>

<p><%= t('.instruction_2') %></p>
<p><%= t('.instruction_3') %></p>
```
[![Image from Gyazo](https://i.gyazo.com/a09430d9d647b5dc893cd16ed3fd5393.png)](https://gyazo.com/a09430d9d647b5dc893cd16ed3fd5393)


#### ※パスワード変更のリンクを押した後のビューファイル編集
初期状態では下記のようになります（私は既に`<%= render "devise/shared/links" %>`を編集してあるので少し異なっています)
`app/views/devise/passwords/edit.html.erb`でほかのフォームと統一感をもつよう編集していきます。
[![Image from Gyazo](https://i.gyazo.com/66e4a18cbc98293a72aacb970bb33f59.png)](https://gyazo.com/66e4a18cbc98293a72aacb970bb33f59)


#### ※パスワード更新失敗した時、フラッシュメッセージ表示させたい
上記「パスワード再設定画面」にて不備があった時のフラッシュメッセージを表示させるためのメソッドを追記しましたが、今回も同様に追記が必要になります
今回は更新に該当します
```app/controllers/users/passwords_controller.rb
  def update
    self.resource = resource_class.reset_password_by_token(resource_params)
  
    # パスワード更新が成功した場合、ログインする
    if resource.errors.empty?
      flash[:success] = "パスワードが変更されました" if is_navigational_format?
      sign_in(resource_name, resource) # 自動的にログインする場合
      respond_with resource, location: after_sign_in_path_for(resource)
    else
      # 入力エラーの場合、エラーメッセージを設定
      flash[:alert] = "パスワードを確認してください" if is_navigational_format?
      respond_with resource
    end
  end
```

## 最後にまとめ
`sorcery`の時とは異なり、ある程度のフォーマットが既に作成されているので、後は自分好みのスタイルに変更するだけ。非常に便利だと感じています。
フラッシュメッセージの表示には少し苦戦しましたが、普通のエラーメッセージと併せて表示させたいという方、今回の記事が何か参考になれば幸いです。
【Bash】CTRL+?で出来る事

## はじめに
今回はbashでCTRL+?のキーで出来る事を書いてみました。
（多分）bashでCTR+?で出来る事を全部網羅はしていません。
良く使うような事や覚えておくといいと思われる事について書きました。

### 動作環境
執筆時点での情報ですが、以下の環境で動作確認を行なっています。
Ubuntu 24.04.1 LTS
bash 5.2.21

## 1. カーソル移動

| ショートカット  | 機能          | 使用例                   |
|----------|-------------|-----------------------|
| Ctrl + a | 行頭へ移動       | 長いコマンドの先頭に`sudo`を追加する |
| Ctrl + e | 行末へ移動       | コマンドの最後に`--help`を追加する |
| Ctrl + b | 1文字前へ(←と同じ) | タイプミスの修正時に戻る          |
| Ctrl + f | 1文字後へ(→と同じ) | タイプミスの修正時に進める         |

実践例：
```bash
# 例1: コマンドの先頭にsudoを追加
apt-get update
Ctrl + a → カーソルを先頭に移動
sudo apt-get update

# 例2: コマンドの行末にgrepを追加
find . -name "*.txt"
Ctrl + e → カーソルを行末に移動
find . -name "*.txt" | grep "keyword"
```

## 2. 編集

| ショートカット  | 機能               | 使用例              |
|----------|------------------|------------------|
| Ctrl + u | カーソルから行頭まで削除     | 間違ったコマンドを素早く書き直し |
| Ctrl + k | カーソルから行末まで削除     | コマンドの後半を変更       |
| Ctrl + w | カーソル前の単語を削除      | オプションの打ち間違いを修正   |
| Ctrl + y | 最後に削除したテキストを貼り付け | 削除した内容を別の場所に移動   |

実践例：
```bash
# 例1: コマンドの再利用
git push origin master
Ctrl + u → 全体を削除して保持
git checkout -b feature
Ctrl + y → 保持していた'git push origin master'を貼り付け

# 例2: オプションの修正
docker run --nome mycontainer nginx
Ctrl + w, Ctrl + w → '--nome mycontainer'を削除
--name mycontainer → 正しいオプションを入力
```

## 3. プロセス制御

| ショートカット  | 機能             | 使用例             |
|----------|----------------|-----------------|
| Ctrl + c | プロセスを終了        | 無限ループや長い処理の停止   |
| Ctrl + z | プロセスをバックグラウンドへ | エディタを一時的に停止(保留) |
| Ctrl + d | EOFを送信         | シェルや入力の終了       |

実践例：
```bash

# 例1: デーモンプロセスの監視
while true; do ps -efa | grep mysqld | grep -v grep; done
Ctrl + c → 実行を停止

# 例2: 複数のプロセスの切り替え
vi document.txt
Ctrl + z → viを一時停止
vi config.ini
Ctrl + z → nanoを一時停止
jobs → バックグラウンドジョブを確認
fg %1 → viに戻る

# 例3: 一時ファイルの作成
$ cat > file.txt
これは1行目です
これは2行目です
CTRL+ d → 入力終了
```

## 4. 履歴操作

| ショートカット  | 機能         | 使用例               |
|----------|------------|-------------------|
| Ctrl + r | 履歴の検索      | 過去のコマンドを呼び出し      |
| Ctrl + g | 履歴検索モードを終了 | 検索を中止して新しいコマンドを入力 |
| Ctrl + p | 前のコマンド     | 直前のコマンドを少し修正して再実行 |
| Ctrl + n | 次のコマンド     | 履歴を戻りすぎた時に進める     |

実践例：
```bash
# 例1: 複雑なコマンドの再利用
Ctrl + r → 検索モード開始
入力: 'docker' → 
docker run -p 8080:80 -v $(pwd):/app -e ENV=prod --name myapp nginx
Enter → コマンドを実行

# 例2: 似たコマンドの連続実行
git add src/components/Header.js
git add src/components/Footer.js
Ctrl + p → 前のコマンドを呼び出してFooterに変えて実行
```

## 5. 画面制御

| ショートカット  | 機能      | 使用例              |
|----------|---------|------------------|
| Ctrl + s | 画面出力を停止 | ログ出力の一時停止        |
| Ctrl + q | 画面出力を再開 | 停止したログ出力の再開      |
| Ctrl + l | 画面クリア   | 画面を整理してコマンドを見やすく |

実践例：
```bash
# 例1: ログ解析
tail -f /var/log/syslog
Ctrl + s → 大量のログ出力を一時停止して特定のエントリを確認
Ctrl + q → ログ出力を再開

# 例2: 長時間の処理経過確認
find / -name "*.log" 2>/dev/null
Ctrl + s → 出力を一時停止して特定のファイルパスを確認
Ctrl + q → 検索を続行
```

## おわりに
これらの機能は、慣れないうちは覚えるのに時間がかかると思いますが、身につければ作業効率が向上するのではないかと思います。
是非、作業時はこれらの機能を使ってみてください。
現場で使用したコマンド

# はじめに
10月からインフラの業務に配属され、研修以来久しぶりにCUIを触れることとなりました。その中で実際の現場で使用したコマンドをいくつか抜粋して紹介します。LinuxだけでなくWindowsも使用しているため、各コマンドについて、上にLinux、下にWindowsでコマンドを記載し、現場で使用した場面も紹介いたします。

# ディレクトリ一覧表示
`ls` (上部Linuxコマンド以下同様)
`dir` (下部Windowsコマンド以下同様)
格納されているファイルやディレクトリを確認する際に使用しました。日常的に利用頻度が高い基本コマンドです。

# ディレクトリから移動
`cd`
`cd`
作業するディレクトリを変更する際に使用しました。新しいディレクトリを作成してその中で作業を進めるときなどに頻繁に使います。

# ディレクトリ作成
`mkdir`
`md`（mkdirでも可）
手順で指定されたディレクトリが存在しない場合に使用しました。

# ディレクトリの削除
`rm`
`del`
不要になったファイルやディレクトリを削除する際に使用します。削除操作は取り消しができない場合もあるため注意が必要です。現場では他コマンドに比べるとあまり使用しませんでした。

# ファイルのコピー
`cp`
`copy`
ファイルやディレクトリのバックアップを取る際に使用しました。他のディレクトリにデータを移動することも可能です。

# パーミッションの変更
`chmod`
`icacls`
ディレクトリやファイルのアクセス権限を設定・変更する際に使用します。特に新規ディレクトリ作成後、適切な権限を付与する場面でよく使用しました。

# ファイルの所有者を変更
`chown`
`icacls`
Linuxでは所有者を変更する際に使用しますが、Windowsではicaclsが同様の操作を実行できます。現場ではLinuxでは使用しましたが、Windowsでは所有者変更はあまり使用しませんでした。

# ファイルの内容表示
`cat`
`type`
ファイルの中身を簡単に確認する際に使用します。ログや設定ファイルの確認に便利です。

# ファイルの比較
`diff`
`fc`
バックアップ後にファイルが正しくコピーされたかどうかを確認する際に使用しました。差分のチェックに役立つコマンドです。

# 指定された文字列や内容を出力
`echo`
`echo`
指定した文字列や値をそのまま出力します。他のスクリプトやコマンドと組み合わせることで、システム監視やデバッグ用途に活用しました。

# 日付と時刻の表示
`date`
`date` `time`
現在の日時を確認したり、操作の証跡を残すために使用しました。

# 現在ログインしているホスト名表示
`hostname`
`hostname`
現在ログインしているホスト名を確認するコマンドです。サーバ構築時や複数のホストに接続して作業する際や、ログイン先を確認する以外にも証跡を残すにも使用しました。

# 現在ログインしているユーザーの表示
`whoami`
`whoami`
ログイン中のユーザー名を表示します。操作しているアカウントを確認するだけでなく、ログインの確認するコマンドは他にもログインしているかどうかを確認する用途でも使用しました。

# 最後に
同じCUI操作でも、WindowsとLinuxでは同じコマンド名を使用できる場合もあれば、動作は同じでも異なるコマンド名となる場合もあります。最初はどちらがどのコマンドだったか混乱することが多々ありました。
まだ完全に覚えきれていない部分や、勘違いして覚えている箇所もありますが、最近では初期の頃に比べてスムーズに操作できるようになってきたと実感しています。
CUI操作だけでなく、使用するソフトやサービスもまだありますので、引き続き知識を深め、経験を積みながら成長できるよう努めていきたいと思います。
Linuxでのファイルの権限変更

# 起きた問題

cloud9にて新規ファイルを作成しようとしたら、permission deniedが発生した。
権限が無いとのことなので`sudo touch`で作成はできたが、書き換えた後の保存もできなかったため権限を書き換える必要が出た。

# 権限の変更 `chmod`

読み書きを制限する必要がないのですべて許可する。

```bash
$ sudo chmod 777 <path>
```

ここの777は、それぞれの数字が所有者・所有グループ・その他のユーザーに対する権限に対応するらしい。
読み取りを許可するなら4・書き取りでは2・実行では1を、許可する項目だけ足し合わせて設定する。
今回はすべて許可するので4+2+1=7、全ユーザーに許可するので**777**となる。
例えば所有者のみ書き換えできるようにしたいなら、755とするようだ。

# ディレクトリ全体に反映させたい `-R`

各ファイル・各フォルダにひとつずつ設定し直すのは大変なので、特定ディレクトリ内のすべてに反映させるようにしたい。
調べたら以下のオプションがあった。

```bash
$ chmod -R 777 <ディレクトリ>
```

`-R`を追加することで、再帰的にフォルダを下って行き、全てのファイル・フォルダに権限を設定できる。
Vue.jsでAPIを実行する手順（備忘録）

# はじめに
この記事は、Vue.jsを用いてLaravelのAPIを実行し、取得したレスポンス（データ）をブラウザに表示するアプリを実装した際の備忘録です。

内容に誤りや加筆が必要な場合、随時更新していきます。

## プロジェクトを新規作成する
- 参考リンク

https://qiita.com/EasyCoder/items/49fe768ca5fce17685ec

## Axiosのインストール
Vue.jsでAPI通信を行う場合は、`Axios`が一般的によく使われています。

- 参考リンク

https://qiita.com/EasyCoder/items/d1fdf84de84ac168d902

Axiosのインストールは次のコマンドで実行できます
```
cd my-project
npm install axios
```

## Vue.jsの準備
Laravelのサーバーからデータベースのデータを取得し、1レコードずつ表示させる
- src/components
```CustomerList.vue
<template>
  <div>
    <h1>顧客一覧</h1>
    <ul>
      <li v-for="customer in customers" :key="customer.id">
        {{ customer.name }} - {{ customer.email }}
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      customers: []
    };
  },
  mounted() {
    this.fetchCustomers();
  },
  methods: {
    async fetchCustomers() {
      try {
        const response = await axios.get(`${process.env.VUE_APP_API_URL}/index`);

        this.customers = response.data;
      } catch (error) {
        console.error('APIエラー: ', error);
      }
    }
  }
};
</script>

<style scoped>

</style>
```
### Vue.jsのコードに関する参考リンク

https://qiita.com/EasyCoder/items/6b3d0fd15051de519705

## ルートの設定
- src/router/index.js
```index.js
import { createRouter, createWebHistory } from 'vue-router'

import CustomerList from '@/components/CustomerList.vue';

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [

    {
      path: '/customers',
      name: 'CustomerList',
      component: CustomerList
    }
  ]
})

export default router

```


## バックエンド側（Laravel）のコード

/indexにリクエストがあった場合、連携しているデータベースのデータを取得して、json形式でデータを返す（レスポンスする）

```api.php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\CustomerController;



Route::get('/index', [CustomerController::class, 'index']);

```
```php
<?php

namespace App\Http\Controllers;

use App\Models\Customer; // Customerモデルをインポート
use Illuminate\Http\Request;

class CustomerController extends Controller
{
    // 顧客情報を取得するメソッド
    public function index()
    {
        // 顧客情報を関連するモデルと一緒に取得
        $customers = Customer::with([
            'customer_contacts',
            'customer_favorite_products',
            'customer_notes',
            'customer_occupations',
            'customer_preferences',
            'customer_purchase_histories',
            'customer_reminders',
            'customer_social_media'
        ])->get(); // get()メソッドでデータを取得

        // JSON形式でレスポンスを返す
        return response()->json($customers);
    }
}
```
### Laravelのメソッドに関する参考リンク

https://qiita.com/EasyCoder/items/f4dcc2b824288f3996d8

## サーバーを起動するコマンド

Vue.jsの場合：`npm run dev`
Laravelの場合：`php artisan serve`

## まとめ

各々のサーバーを起動しブラウザからVue.jsを開くことで、開かれたVue.jsからLaravelにリクエストが送信され、Laravelはデータを取得しVue.jsにデータをレスポンスします。データを受け取ったVue.jsはブラウザにデータを表示することができます
スナップショットとボリュウーム削除

 - スナップショット
```
#!/bin/bash

# スナップショットリストファイルのパス
SNAPSHOT_LIST="snapshot_list.txt"

# ファイルが存在するか確認
if [[ ! -f "$SNAPSHOT_LIST" ]]; then
  echo "スナップショットリストファイル $SNAPSHOT_LIST が見つかりません。"
  exit 1
fi

# スナップショットIDのリストを1行ずつ読み込んで削除
while IFS= read -r snapshot_id
do
  if [[ -n "$snapshot_id" ]]; then
    # スナップショットを削除
    echo "削除中: スナップショット $snapshot_id"
    aws ec2 delete-snapshot --snapshot-id "$snapshot_id"
    
    # エラーチェック
    if [[ $? -eq 0 ]]; then
      echo "スナップショット $snapshot_id が削除されました。"
    else
      echo "スナップショット $snapshot_id の削除に失敗しました。"
    fi
  fi
done < "$SNAPSHOT_LIST"

```
 - ボリュウーム
```

```
Alphaus Blue API をはじめてみよう

## はじめに
Alphaus では、お客様がインタラクティブにサービスを利用できるよう API を提供しており、それを Blue API と呼んでいます。

この記事では弊社サービスの 1 つである [Ripple](https://www.alphaus.cloud/jp/ripple) を例にとり、Blue API のはじめ方をご紹介します。

## API キーの作成
Ripple へログインして頂き、左側のメニューから「アクセストークン」を選択します。

![スクリーンショット 2024-10-29 12.08.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135946/dc7bee3d-a68e-a365-d7fd-7178fdc4b4f7.png)

「新しいトークンの作成」にて任意の名前をいれて「発行」します。すると「Client ID」と「Client Secret」が発行されますのでそれを控えます。

![スクリーンショット 2024-10-29 12.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135946/e680b1e1-e5ab-bf00-b37e-f6af1e486b3c.png)


## アクセストークンの取得
次に、アクセストークンを取得します。
「Client ID」、「Client Secret」、Ripple のアクセストークンエンドポイントを指定し以下のように POST リクエストすると、アクセストークンを取得できます。

```
$ curl -X POST \
  -F client_id={client-id} \
  -F client_secret={client-secret} \
  -F grant_type=client_credentials \
  -F scope=openid \
  https://login.alphaus.cloud/ripple/access_token
  
{"id_token":"","token_type":"Bearer","expires_in":86400,"access_token":"XXXXXX","refresh_token":""}
```

## Blue API を使ってみる
Blue API にはさまざまなエンドポイントがありますが、ここでは自分の情報を取得できる「whoami」をたたいてみましょう。先ほど取得したアクセストークンを忘れずに指定してあげます。

https://labs.alphaus.cloud/blueapidocs/#/Iam/Iam_WhoAmI

id や name などの結果が返ってきました。

```
$ curl -H "Content-Type: application/json" -H "Authorization: Bearer XXXXXX" https://api.alphaus.cloud/m/blue/iam/v1/whoami

{"id":"MSP-5aa311904d5d6", "parent":"", "metadata":{"domain":"ripple", "email":"ccoe@alphaus.cloud", "name":"Alphaus Demo, Inc."}}
```

無事に Blue API が使えていることを確認できました。
その他のエンドポイントは[ドキュメント](https://labs.alphaus.cloud/blueapidocs/)をご確認下さい。
仕事で使えそうなバッチ(powershell)ファイル

# 初めに
日々の業務でテキストファイルにメモを取っていると思います。
そこで毎日追記して使っている人もいると思いますが、毎日作成している人もいると思います。

私は毎日わざわざ作成をしたい派です。
追記だと行が長くなり見にくいと思いますし、当日やったメモをそのまま残しやすいからです。

しかし、わざわざ
メモ帳開く > 決まった文言を書く(本日(近日)の予定) > 日付を入れて保存する
とやるのも面倒です。

また、たまったメモファイルを整頓したいというのもあります。
(そのまま残すと容量がどんどん圧迫されて…)

そこで以下のようなバッチ・パワーシェルファイルを作ってみました。

# 作成したもの
メモ作成用(毎日実行)
```memo_maker.bat
@echo off
powershell -ExecutionPolicy Bypass -File "ps1\memo_maker.ps1"
pause
```
```ps1\memo_maker.ps1
# 現在の日付を取得
$currentDate = Get-Date -Format "yyyyMMdd"

# ファイル名を設定 (YYYYMMDD形式)
$fileName = "${currentDate}_memo.txt"

# ファイルを作成
@"
$currentDate memo.
----------
本日の予定を記載
"@ | Out-File -FilePath $fileName -Encoding UTF8

# 完了メッセージ
Write-Host "ファイル '$fileName' が作成されました。"
```

ファイルのzip化(月一程度実行)
```txt_zip.bat
@echo off
powershell -ExecutionPolicy Bypass -File "ps1\txt_zip.ps1"
pause
```
```ps1\txt_zip.ps1
# 現在の日付を取得
$currentDate = Get-Date -Format "yyyyMMdd"

# ZIP ファイル名を設定
$zipFileName = "TextFiles_$currentDate.zip"


# PowerShellでZIPファイルを作成
Compress-Archive -Path "*.txt" -DestinationPath "$zipFileName"

# カレントディレクトリ内の全ての.txtファイルを取得
$txtFiles = Get-ChildItem -Path . -Filter *.txt

# 各.txtファイルを削除
foreach ($file in $txtFiles) {
    Remove-Item -Path $file.FullName -Force
}

# 完了メッセージ
Write-Host "ZIPファイル '$zipFileName' が作成されました。"
```
ファイル構成は以下の通りです。

```cmd
> tree /F
C:.
│  memo_maker.bat
│  txt_zip.bat
│
└─ps1
        memo_maker.ps1
        txt_zip.ps1
```

# 実行してみた
ダブルクリックで実行してみると以下のようになります。
※実行はbatファイルのダブルクリックでできます

メモ作成用実施
```cmd
> tree /F
C:.
|  20241029_memo.txt
│  memo_maker.bat
│  txt_zip.bat
│
└─ps1
        memo_maker.ps1
        txt_zip.ps1
```
```20241029_memo.txt(実施した後にできたファイル)
20241029 memo.
----------
本日の予定を記載

```
zip化実施(上記の状態で実行)
```cmd
> tree /F
C:.
│  memo_maker.bat
|  TextFiles_20241029.zip
│  txt_zip.bat
│
└─ps1
        memo_maker.ps1
        txt_zip.ps1
```

# 最後に
普段実施していることでちょっと煩わしいな、と思った単純作業もコーディングすることで短縮できるかもしれません。
実は上記のコードもChatGPTを併用して作成をしました。
案があればAIを使って作成でき、業務がはかどるかも？
スクラムチームの悩みを共有！ Scrum Developer's Night! Online #17 参加レポート

## はじめに
スクラム開発者向けのイベント『Scrum Developer's Night! Online #17』に参加してきました。
この記事では、イベント内で議論したスクラムの実践者が現場で抱える悩みとその解決策について共有します。

## Scrum Developer's Night! とは
https://smn.connpass.com/event/325863/

Scrum Developer's Night!は、スクラム開発をデベロッパーとして実践する中で生じた疑問や悩みをタネに参加者同士で交流しながら語り合うオープン・スペース・テクノロジー（OST）形式のイベントです。
オンラインと現地で交互に開催されていますが、私が参加した回はオンラインでした。参加者は10数名ほどで、私を含めてほとんどが初参加の方々でした。

以下に私が参加した3つのトピックと所感をざっくりまとめようと思います。

## #1 運用作業に追われて開発に割く時間が減っている

### 背景
  * 開発者が減ったり運用作業にかかるコストが増えたりと、以前より開発に割く時間が大幅に減っている
  * 他のチームではどのように開発と運用のバランスをとっている？

### 議論
* **なにが問題なのか**
  * 開発者が減る → やれることが減る → やりたいことがやりきれない
* **どうすればいいのか**
  * 優先順位の高いものから実施していく
      * 運用作業が開発と比べて優先順位が高いのであれば問題ない
  * ただし、透明性を確保した状態で優先順位をつけること
      * 正確な情報を元に判断することで精度を上げるため
      * 実際どのくらい時間がかかっているのか可視化すると良かったという声
          * 会議の時間が長いことに気づき、その後自然に短縮された
          * 潜在的な問題を発見する効果や、問題意識を揃える効果があった

### 所感
こちらは私が出したトピックです。
自分が変えられる範囲・変えられない範囲に切り分けて問題をブレークダウンしていくのは大事だなと感じました。漠然と抱えていた不安が「やりたいことはいつだってやれることより多い」というよくある問題由来であることに気づくことができました。

## #2 効果的だった振り返りについて聞かせて

### 背景
  * TRYを出しても実行できずに終わる。いいTRYの出し方・振り返りのやり方を知りたい
  * 実行できるTRYを出すには？

### 議論
* **案1：TRYの出し方についてもふりかえる**
  * TRYを出しても実行できずに終わってしまうこと自体をPROBLEMに挙げる
* **案2：TRYをPBIにする**
  * 多くのチームで導入していたやり方
  * POへの説明が必要になるため、以下のようなメリットがある
    * 開発チームが抱える問題をPOが把握できる
    * なぜそれをする必要があるのかTRYの実施者が説明可能になる
* **案3：実施可能なくらいまでTRYのハードルを下げ、成功体験を積み重ねていく**
  * メンバーにできなかった理由を聞くと、時間がなかった etc.
  * 確実に実行できるくらいTRYを小さくする
* **フレームワークについて**
  * **KPT**
    * 利用しているチームが多かった
        * KEEPがさらっと流れ、PROBLEM出しで殺伐とした雰囲気になりがち
        * 雰囲気づくりに気を遣っているチームが多かった
    * PROBLEMと同じだけKEEPを出す
    * KEEPをメンバーへの感謝の場として活用する
    * 派生：KEEPだけ出す
      * プロジェクトの問題が山積みでメンバーが苦しいとき、KEEPだけにしてモチベを保った
  * **Sailboat**
    * ゴールの島を目指すヨットの搭乗員と見なして振り返りを行う
* **情報収集場所について**
  * vivaさんの情報発信を見る
      * Qiita：https://qiita.com/viva_tweet_x
  * ふりかえりチートシート（いろんな振り返り手法を一覧化したもの）
      * 参考：https://qiita.com/viva_tweet_x/items/b06f56ce83038fc2bb8f

### 所感
不安定な時期はモチベを高めるため、安定した時期はよりよい状態を目指すため、といったようにチームが置かれた状況によって、レトロスペクティブに求めることが変わる部分に気づきました。自チームの場合はどういったレトロスペクティブが求められているのか見つめ直してみようと思いました。

## #3 全体的な設計どうやってる？

### 背景
  * スクラムの理想としては、End to Endなインクリメントを継続すること
  * しかし、DB設計のように、手戻りが発生したときに膨大なコストがかかるものについては、先を見越して全体的な設計を行いたくなる

### 議論
* **どうやってる？**
  * **方法1：スクラムのプロセス外でやる**
    * 先を見越して進める
    * ヒアリング、要件の洗い出し、全体設計、受入基準作成などのプロセスについては明言されていないから
  * **方法2：スクラムのプロセス内でやる**
    * そもそも、End to Endなインクリメントを目指す理由とは？
      * スプリントレビューでフィードバックをもらい、早めに軌道修正するため
      * →レビューできる形の成果物にすればよい！
    * ヒアリング結果をドキュメントとしてまとめる etc.
* **どこまで先を見越す？**
  * 一つの基準として、明日の天気予報くらい がある。「まあ当たるよね」はやる

### 所感
相談者は設計段階での悩みでしたが、私が実装の際に感じていた手戻りのコストを考えて先に実装しておきたい気持ちと共通する部分があるなと感じ、参加してみました。「明日の天気予報」くらいを目安とするなら、次に着手予定のPBIであれば織り込み済みで実装してもいいのかも、と思いました。

## おわりに
多様なバックグラウンドを持つ参加者が集まるワークショップでしたが、共通の悩みや課題を抱えていることが分かり、共感できる部分が多くありました。また、他のチームの状況を具体的に知ることで、自チームの状況を客観的に捉え直すことができ、「検査」のよい機会になりました。

## We Are Hiring!
https://www.biprogy.com/recruit/recruiting/
buildrootとyocto

[buildroot](https://buildroot.org/)と[yocto](https://www.yoctoproject.org/)について比較や、使用してみた感想など



| 項目 | buildroot | yocto |
| -|-|-|
| 想定プロセス数 | 100未満 | 100以上 |
| ビルド時間<br>(手元環境で) | 1時間程度 | 8時間以上 |
| (ホストの)使用ディスク容量 | 20G未満 | 100G程度 |
| 依存解決 | ある程度やってくれる | 基本的に自動 |

想定プロセス数が異なるのでそもそも棲み分けが出来ている。

昔はbuildrootは依存解決が手動だったみたいだが
使ってみた感じほとんど自動でやってくれてるような気がする

buildrootは非力なマシンでもそれなりに働いてくれるし
GUIも普通に作れる。

AOSP自前でビルド出来ます。みたいなマシン持ってる人じゃなければ
buildrootは選択肢としてかなり有効なんじゃないかと。

マシン対応はLinux前提ならドライバ依存なので
基本関係ないと思う。
（デバイスツリーはパッチ作る必要あるかもしれない）
TCP/IP の通信待ちのサーバーで、毎日、決まった時刻になったら他のタスクを実行するサンプル

### 開発を行った動機

AI で Web 上に検索結果を表示するシステム、index.html から client.php に検索要求を送信し、client.php が TCP/IP 通信で python のサーバー server.py に検索要求を伝えるというシステムを作っていました。検索サーバーは、検索の元ネタファイルを読み込んで、検索要求を待っています。元ネタファイルを読み込むのに5分以上かかるので、この index.html, client.php, server.py という配置にしました。どういうことかというと、server.py は一度元ネタファイルを5分かけて読み込んで、あとは通信で検索要求を待っていれば、タイムラグなく検索要求に答えられるからです。検索の元ネタのファイルは、別のプログラムで毎晩24時に更新されます。すると、通常は、検索要求を待っている server.py は、24時になったことを検出できなければなりません。通常の TCP/IP のネットワークサーバーでは、

<pre>
socket→bind→listen → 
     while True → accept→ recv → send → close →
     ↑                                         ↓
     ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
</pre> 

のようなループの accept で通信待ちでブロックされ、ほかのタスクを実行することはありません。これは困りました。毎晩24時になったことを検出し、検索元ネタファイルを読み込みなおさなければなりません。上のダイヤグラムだと、読み込みなおしの入る余地がありません。

### 解決策

ちゃんと、解決策が用意されていました。それは、accept について、timeout を設定して一定時間で例外を発生させ、例外が発生したら他のタスクを実行する。というものです。

### サンプルプログラム

```python
import socket
import datetime

def main():

    # ss = SemanticSearch() 検索用クラスのインスタンスの初期化
    # ss.load_corpus( filename ) 検索元ネタファイルを読み込む
                
    # ソケットのパラメーター定義
    server_ip = "127.0.0.1"
    server_port = 10000
    listen_num = 10
    buffer_size = 8192

    # 1.ソケットオブジェクトの作成
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2.作成したソケットオブジェクトにIPアドレスとポートを紐づける
    tcp_server.bind((server_ip, server_port))
    tcp_server.settimeout( 1.0 )

    # 3.作成したオブジェクトを接続可能状態にする
    tcp_server.listen(listen_num)

    # 4.ループして接続を待ち続ける
    while True:
        try:
            # 5.クライアントと接続する
            client,address = tcp_server.accept()
            # 6.データを受信する
            data = client.recv(buffer_size)
            data = data.decode('UTF-8')
            print("[*] Received Data : {}\n".format(data)) # data は検索文。

            #検索実行
            #send_result = ss.search( data )
            # 7. 返事を返す。
            client.send( send_result.encode( "UTF-8" ) )

            # 8.接続を終了させる
            client.close()

        except socket.timeout as e:
            t_now = datetime.datetime.now().time()
            if '00:00' ==  str( t_now )[:5]:
                tcp_server.close()
                
                #ここで検索の元ネタファイルを読み直す。10分とかかかる。その間、通信はお断り。
                # ss = SemanticSearch() 検索用クラスのインスタンスの初期化
                # ss.load_corpus( filename )　検索元ネタファイルを読み込む

                # 1.ソケットオブジェクトの作成
                tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

                # 2.作成したソケットオブジェクトにIPアドレスとポートを紐づける
                tcp_server.bind((server_ip, server_port))
                tcp_server.settimeout( 1.0 )

                # 3.作成したオブジェクトを接続可能状態にする
                tcp_server.listen(listen_num)

```


### 目標達成

目標は検索元ネタファイルの更新です。

```python
#ここで検索の元ネタファイルを読み直す。10分とかかかる。その間、通信はお断り。
# ss = SemanticSearch() 検索用クラスのインスタンスの初期化
# ss.load_corpus( filename )　検索元ネタファイルを読み込む
```
ここで更新しています。
`export` と `export default` の違い

# `export` と `export default` の違い

`export` キーワードは、**1 つ以上**の変数、関数、またはクラスをエクスポートするために使用されますが、`export default` キーワードは、**1 つ**の**デフォルト**の変数、関数、またはクラスをエクスポートするために使用されます。他のモジュールでは、`import` キーワードを使用して、これらのエクスポートされた変数、関数、またはクラスをインポートできます。

## 1. `export`

### 1. エクスポート方法

- `export` で公開されたメンバーは、必ず `{}` で囲む必要があります。この形式を **必要に応じたエクスポート** と呼びます。
- `export` では、複数のメンバーを公開できます。

```javascript
// 直接エクスポート
export let str = `hello world!!!`;
export function fuc() {}

// 定義してからエクスポート
let str1 = 'hello';
let str2 = 'world';
let str3 = '!!!';
function func() {}
export { str1, str2, str3, func };
```

### 2. インポート方法

- `export` で複数のメンバーを公開した場合、特定のメンバーをインポートする際に `{}` に含めないことができます。
- `export` でエクスポートされたメンバーは、インポート時にエクスポート時の名前に厳密に従って `{}` **で受け取る** 必要があります。
- `export` でエクスポートされたメンバーをインポートする際に、別の変数名を付けたい場合は、`as` を使って別名を付けることができます。

```javascript
import { str1, str2 as str2s } from 'xxx.js';
console.log(str1 + '====== ' + str2s); // hello======world
```

## 2. `export default`

### 1. エクスポート方法

- 1 つのモジュール内で、`export default` は 1 回のみエクスポートできます。
- 1 つのモジュール内で、`export default` と `export` を同時に使用してメンバーを公開できます。

```javascript
// xxx.js
export const name = 'Red';
export const age = 20;

const obj = {
  name: 'Red',
  age: 20,
};
export default obj;
```

### 2. インポート方法

- `export default` で公開されたメンバーは、任意の変数を使用して受け取ることができます。

```javascript
import user from 'xxx.js';
import { name, age } from 'xxx.js';
console.log(user);
console.log(name, age);
```
ルーティングテーブルとは

# どのようにパケットを転送、中継するのか？
>ルーターによる`パケットの転送のことを「ルーティング」`と言います。ルーティングは、`何をどこへ転送すればいいのかを定めた転送ルールに従って`行われており、その`転送ルールを定める重要な要素が「ルーティングテーブル」`です。ルーティングテーブルには、`「宛先のネットワーク」と「そのネットワークに対する配送の方法」`が登録されちえます。
　ルーターはパケットを受け取ったら、その宛先として示されるIPアドレスにサブネットマスクを適用してネットワークアドレスを取り出します。そして、ルーティングテーブルから、`そのネットワークアドレスに関するルールを探します`。ルールが見つかったら、そのルールに従って転送します。この`転送処理を複数のルーターが繰り返すことで、パケットは目的のコンピューターまで届けられる`のです。

* パケット転送をルーティング
* パケット転送のルールを定めているのがルーティングテーブル
* ルーティングテーブルに従ってルーティングが行われている

https://qiita.com/masatom86650860/items/a94c114d87ec3d5add88

* ネットワークアドレスに関するルールを探すとはどうのような探し方か？
* 複数のルーターの転送を繰り返して目的地まで運ばれる

https://www.sbcr.jp/product/4797386677/
ApacheにBasic認証かけるの、意外と簡単なのよ

## まえがき
Basic認証かけるのは意外と簡単！!

![kagi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908981/28c4558e-af83-e9f3-f13d-b07c738e8a0f.png)



## 前提
Linux上でmod_wsgiつかって動かしてるPython Webアプリケーションであること
今回のケースではEC2上でApache HTTPを動かしている。

## 1. htpasswdツールをインストール

#### 1-a.そもそもhttpd-toolsが入ってるか確認
```
rpm -q httpd-tools
```
・入っていない場合: 以下のような文言を吐く
package httpd-tools is not installed

・入っている場合: 以下のような文言を吐く
httpd-tools-2.4.59-2.amzn2023.x86_64


#### 1-b.入ってなかったらインストール
```
sudo yum install httpd-tools -y
```


## 2. idとパスワードを設定
```
sudo htpasswd -c /etc/httpd/.htpasswd 任意のid
```
パスワード入力を求められるので入力

## 3. WSGI DaemonProcessファイルを編集

/etc/httpd/conf.d/とかに入ってるはず。
たぶんapp.confとかssl.confとか。
どこにあるか忘れちゃったら以下のコマンドで探そう

```
sudo httpd -S
```
以下文言を記述する。
Requrireに valid-user以外が入ってないか要確認！
ぼくはRequire all granted の記述を入れっぱなしにしていて
Basic認証がかからない！と慌てた記憶がある。
```
<Directory "プロジェクトルートディレクトリのパス">
    AuthType Basic
    AuthName "Restricted Access"
    AuthUserFile /etc/httpd/.htpasswd
    Require valid-user
</Directory>
```

confファイルに問題ないかテスト
```
sudo apachectl configtest
```

問題がなければサーバーを再起動
```
sudo systemctl restart httpd
```

## 完成！
自分のサイトを確認してみよう。
Basic認証がかかってるはず！
USB-Cの規格多すぎるのでまとめた

## USBの規格って多すぎない？

![usb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908981/a38ac460-0022-d67b-0a4c-7b6aa5068650.png)

USB-Cっていろいろあって調べるのめんどかったのでメモ

## 結論
名称がコロコロ変わりすぎなんで名前は覚えなくていい。
転送速度 (5Gbps, 10Gbps, 20Gbps, 40Gbps, 80Gbps) を確認するのが確実。
名称がコロコロ変わりすぎ。

## 詳細
単位: Gbpsは
ギガビット毎秒 (gigabits per second) の略で、データ転送速度を表す単位
1Gbps = 1秒で1Gのデータを転送できる。
(厳密にはファイル形式、PCの処理能力などでやや変動)


[最大5Gbpsの転送速度]
USB 3.0 = USB 3.1 Gen 1 = USB 3.2 Gen 1

[最大10Gbpsの転送速度]
USB 3.1 Gen 2 = USB 3.2 Gen 2 = SuperSpeed USB 10Gbps = SuperSpeed+ USB 10Gbps

[最大20Gbpsの転送速度]
USB 3.2 Gen 2x2 = SuperSpeed USB 20Gbps = SuperSpeed+ USB 20Gbps

[最大40Gbpsの転送速度]
USB 4 = Thunderbolt 3

[最大80Gbpsの転送速度]
USB4 Version 2.0
転職活動をマジメに振り返ってみた

## 「エンジニアとして成長したい」——転職を決意したきっかけ
前職はSES企業で働いていたけれど、次第に「１つのサービスにじっくり関わって、深く価値を感じたい」という思いが強くなりました。SESではさまざまな現場で経験を積める一方、自分のスキルを磨くチャンスに物足りなさを感じていました。エンジニアとしての成長を目指すなら、自社開発の企業で経験を積むのが自分のキャリアにとって良いと考えたのです。「もっと高度な技術を学んで、深く理解できる環境がほしい」——この思いが強まり、自社開発の企業へと一歩踏み出すことにしました。

## 転職活動で難しいのはこれ：仕事と面談のスケジュール調整
転職活動は期待と不安の入り混じった挑戦ですが、特に大変だったのがスケジュール管理でした。働きながらカジュアル面談や面接をこなすのは思っていた以上に大変で、毎回日程を調整するたびに悩みの連続でした。特に転職活動の初期は、時間のやりくりに苦労しました。活動に集中したい一方で、日々の業務にも責任があるため、面接日程をどうやって効率よく管理するかが課題でした。

## 転職サイトやエージェントの活用：スカウトと自己応募を使い分け
転職活動を進める上で、いくつかの転職サービスを併用しました。特にスカウトは、思わぬ企業からのオファーが来ることもあり、自分のスキルを客観的に評価してもらえる良い機会だと感じました。また、自ら積極的に応募することで、どんなスキルや経験が求められているのかを具体的に把握することもできました。さらに、技術ブログやカンファレンスの登壇情報も参考にして、業界の動向をチェックしながら求人情報を探しました。自分から行動しつつ、待つスタイルも取り入れることで、転職活動に幅を持たせることができました。

## 転職してよかったこと：成長を実感する日々
転職して間もない頃は少し不安もありましたが、今では「転職してよかった」と心から感じています。なぜなら、新しい職場は技術に対する意識が高く、日々成長を感じられるからです。自分の努力だけでなく、共に働く仲間の影響も大きく、「環境が人を育てる」という実感を持っています。周りのエンジニアが次々と新しい技術に挑戦する姿を見ていると、自然と自分も学び続けようというモチベーションが湧いてきます。この環境に身を置くことで、エンジニアとしての成長スピードが大幅に加速しました。

## 次に向けて活かせること：計画的なスケジュール管理とアウトプットの充実
今回の経験から、次に転職活動をするなら、エージェントに積極的に相談してスケジュール管理をスムーズにすることが大切だと感じています。また、技術ブログや登壇など、自分の取り組みを客観的に示せるアウトプットを増やすことも意識したいと思います。活動を通じて得た知見を外部に発信し続けることで、次回の転職活動時にもスムーズに自分の価値を示せるようにしたいです。
インテル® Xeon® プロセッサーによる大規模言語モデル (LLM) パフォーマンスの加速化

【開発と活用を推進するインテルの AI】
インテルはクラウドからデータセンター、エッジにおいて、あらゆる場所での AI 活用を目指す、ソフトウェアやハードウェアでの AI 開発、さらには AI ソリューションへの活用を動画で解説するWebサイトを公開しています。
https://www.intel.co.jp/content/www/jp/ja/artificial-intelligence/ai-development-and-utilization.html

＜AI 活用を動画で学ぶ＞
インテルのエキスパートたちが、ソフトウェアやハードウェア、AI ソリューションに関してのノウハウを動画で解説。今回ご紹介するのは、「推論 / エッジ推論」
学習によって作成された推論モデルのエッジへの実装や、効率的な推論の実行など、推論に関して紹介します。

タイトル：
インテル® Xeon® プロセッサーによる大規模言語モデル (LLM) パフォーマンスの加速化

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/47996243-cdc8-1648-0b7d-71622fc0eb2d.png)

大規模言語モデル (LLM) の用途全てにおいて高価な GPU が唯一の選択肢なのでしょうか？用途やコストによっては汎用的なインテル® Xeon® プロセッサーがバランスの良さで最適な選択肢になります。このセッションでは、インテル® Xeon® プロセッサーでの LLM 運用を実現するために有効な、PyTorch 向けインテル® エクステンションがサポートしている LLM 向けの最適化について紹介します。

https://www.intel.co.jp/content/www/jp/ja/artificial-intelligence/ai-development-and-utilization.html

是非この機会にAI Everywhere を実現するインテルのソリューションをご覧ください！