OmniAICreator/Qiita-1.07M huggingface dataset:
Java SE Gold で勉強したことメモ(Enum編)

JavaのEnum型のメソッドで以下のようなものがあるみたいです。
```php:EnumSample.java
public enum EnumSample{
    Gold,Silver,Bronze
}
```
```php:Main.java
public class Main{
    public static void main(String[] args){
        //EnumSampleの列挙子を配列型で返すvaluesメソッド
        for(EnumSample e: EnumSample.values()){
            System.out.println(e);
        }
    }
}
```
[Java SEのAPI](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Enum.html)にもvaluesメソッドは載っていないようです。


使いどころあるかもしれなさそうだったのでメモしておきます。
間違っている箇所があれば教えてください。
NASDAQ指数とビットコインのPythonコードによる価格相関分析



## はじめに
近年、ビットコインと従来の金融市場との関連性が注目を集めています。特に、テクノロジー株の代表的な指標であるNASDAQ指数との関係性は、多くの投資家や研究者の関心事となっています。本記事では、2022年12月から2024年10月までのデータを用いて、両者の関係性を詳細に分析していきます。

## 環境設定
本分析で使用する主なライブラリとバージョンは以下の通りです：

```python
import numpy as np              # version 1.21.0
import pandas as pd            # version 1.3.0
import matplotlib.pyplot as plt # version 3.4.2
import statsmodels.api as sm   # version 0.12.2
```

## データの準備と前処理
データは MongoDB から取得していますが、以下のコードでは一般的なデータフレーム操作に焦点を当てています：

```python
# 日付をdatetime型に変換
df_btc['date'] = pd.to_datetime(df_btc['date'])
df_nasdaq['date'] = pd.to_datetime(df_nasdaq['date'])

# dateカラムをインデックスに設定
df_btc = df_btc.set_index('date')
df_nasdaq = df_nasdaq.set_index('date')

# 欠損値の前方補完
df_nasdaq = df_nasdaq.fillna(method='ffill')
```

## 分析結果と考察

### 1. 価格推移の比較![Screenshot from 2024-10-26 02-16-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3910017/f18a07fe-f5e2-e3fc-8178-a1c8f34a5170.png)

提供された最初のグラフは、ビットコン価格（青線）とNASDAQ指数（赤線）の推移を示しています。以下の特徴が観察できます：

- **初期段階（2023年初頭）**: 両者とも比較的低い水準から開始
- **上昇トレンド（2023年後半）**: 特に2023年10月以降、両者ともに顕著な上昇傾向
- **変動性の違い**: ビットコインの方がNASDAQ指数と比較して、より大きな価格変動を示している

### 2. 相関分析　![Screenshot from 2024-10-26 02-15-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3910017/fd10fc7c-c508-aaea-8107-6164db71d89c.png)

30日間の移動相関を示す2つ目のグラフから、以下の興味深い特徴が読み取れます：

- **相関係数の変動**: 0.9（強い正の相関）から-0.75（強い負の相関）まで大きく変動
- **期間による特徴**:
  - 2023年初頭: 強い正の相関（0.75-0.95）
  - 2023年中期: 相関の著しい低下と負の相関期間
  - 2024年: 再び強い正の相関期間と変動の増加

### 3. 重要な観察点
1. **市場センチメントの共有**: 特に2023年後半以降、両者は似たような価格動向を示しており、市場センチメントの共有が示唆されます
2. **相関の非安定性**: 移動相関分析から、両者の関係性は時期によって大きく変動することが分かります
3. **リスク管理への示唆**: 相関の変動性が大きいことから、分散投資効果は時期によって大きく異なる可能性があります

## まとめと実務への応用
この分析から、以下の実践的な示唆が得られます：

1. **ポートフォリオ管理**: 相関係数の大きな変動は、動的なポートフォリオ調整の必要性を示唆します
2. **リスク評価**: 両資産の関係性は固定的でないため、リスク評価は定期的に見直す必要があります
3. **市場監視**: 相関係数の変化は、市場環境の変化を示す重要な指標として活用できます


*注：本分析は教育目的で作成されており、投資助言を目的としていません。*
TeraTermマクロ Tips

# ```recvln```について

```recvln```1つではエコーバックの分を受け取ってしまうようです。
他の出力を受信してしまう場合もあります。
確実にやるなら、目印を付けて```waitln```でそこまで待つ、というのがいい思います

```batch
; 待機用文字列「wait:」を入れて改行してやる
sendln "ll | grep admin | sed -n 's/.*sudo\(.*admin\).*/wait:\n\1/p'"
; エコーを読み捨てる
recvln
; 待機用文字列を待つ
waitln 'wait:'
; 本命の文字列を読み取る
recvln

VER = inputstr
sendln 'echo ' VER
messagebox inputstr 'title'
```

```shell
# コマンド
ll | grep admin | sed -n 's/.*sudo\(.*admin\).*/wait:\n\1/p'
# 実行結果
wait:
_as_admin
```

# ウィンドウを閉じて新しいウィンドウを開くマクロ

```batch

USER = 'user'
PASSWORD = 'password'
HOST = 'host'

sprintf2 ver '%s:22 /ssh /auth=password /user=%s /passwd=%s' HOST USER PASSWORD
connect ver

wait "$ "

; 処理

; ウィドウを閉じる、マクロは非リンク状態になる
closett


; 新しいウィンドウが開く
USER = 'user'
PASSWORD = 'password'
HOST = 'host'

sprintf2 ver '%s:22 /ssh /auth=password /user=%s /passwd=%s' HOST USER PASSWORD
connect ver
```

# 参考
https://teratermproject.github.io/manual/5/ja/macro/command/

https://teratermproject.github.io/manual/5/ja/macro/command/waitln.html

https://teratermproject.github.io/manual/5/ja/macro/command/recvln.html

https://teratermproject.github.io/manual/5/ja/macro/command/closett.html
Next.js ベストプラクティス（ルーティング編）

# Next.js ベストプラクティス（ルーティング編）
Next.jsがバージョン15になるっとことでNext.jsについて勉強しようと思い書きました。ご参考にというのと私はこういうディレクトリー構成ですって人は是非教えてください🙇‍♂️

# そもそもルーティングってなに？
ルーティングはプロジェクトの骨格部分であり、遷移先のURLを決定します。
例えば、`https://localhost:3000/user` というURLから、userに関するページであることが分かります。このURLの `user` 部分がルーティングの設計やプロジェクトの構成を決める要素となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664061/6b28c1c8-848d-2d92-12cb-e23de886e84b.png)

## 階層構造の基本
木のイメージを持つと理解しやすいです！
tree ---- sub tree --- sub tree --- leaf
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664061/7859107c-e4a2-3530-7da6-b426ac737bcc.png)

### 混乱しやすい単語
- **Root**：ツリーやその根本となるフォルダ
- **Root Segment**：各サブツリーのフォルダ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664061/f819e0a6-568b-c514-56d8-0f86da381a6e.png)

## App Router のルーティング

`app/` 配下にフォルダやファイルを配置していきます。例えば：
- `/app/page.tsx` → `https://xxx.com`
- `/app/dashboard/page.tsx` → `https://xxx.com/dashboard`
- `/app/dashboard/settings/page.tsx` → `https://xxx.com/dashboard/settings`

### 動的ルーティング
- `/app/dashboard/[id]/page.tsx`
  - `id=1` → `https://xxx.com/dashboard/1`
  - `id=2` → `https://xxx.com/dashboard/2`

このように動的にルーティングを設定できます。ディレクトリ内の `page.tsx` が該当するHTMLファイルとして読み込まれます。

## 特殊な役割を持つファイル名
- `page` → ルーティングとして認識
- `layout` → ページ共通のレイアウト作成
- `loading` → ストリーミングやローディングUI
- `not-found` → 404ページの作成
- `error/global-error` → エラーページの表示
- `route` → APIルーティングとして認識
- `template` → 共通レイアウト作成（`layout`とは異なり遷移時に再レンダリング、アニメーション遷移に便利）
- `default` → パラレルルートで使用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664061/331449f5-77d3-d2dc-0147-0a065888a47a.png)

これらのファイルは自動的に同じ階層の `page.tsx` にレンダリングされます。

## コロケーション機能
コロケーション機能は、関連するファイルを近くに配置することを指します。`page.tsx` を宣言しないと、ルーティングとして認識されません。
例：
- `/app/dashboard/footer.tsx`
- `/app/dashboard/header.tsx`
- `/app/dashboard/util.ts`

### コロケーションのメリット
ファイルを近い位置に管理でき、保守がしやすくなります。（チームごとに使い方が異なることがあります）

## プロジェクト整理機能
### プライベートフォルダ
プライベートフォルダは、ルーティングから除外されるフォルダで、名前の先頭に `_` を付けます。
- `/app/dashboard/_components/button.tsx` → ルーティングされません

#### プライベートフォルダのメリット
- ルーティングロジックから除外可能
- 見た目で判別しやすい
- エディター上でグループ化や並び替えが容易

### ルートグループ
ルートグループは、プロジェクトをグループ化する機能です。フォルダ名を括弧 `()` で囲みます。
- `/app/(dashboard)/settings/page.tsx` → `https://xxx.com/setting`

#### ルートグループのメリット
- ルーティングの役割を認識しやすく、共有も簡単
- 特定のセグメントを `layout.tsx` に組み込める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664061/2c16ddbb-9b15-23c5-e5c4-2907db2fed42.png)



## 最後にベストプラクティス
### ルーティング設計のベストプラクティス
3つの戦略があります：
1. **`/app` の外部にプロジェクトファイルを設置**
   - `/app` はルーティング専用にし、他のファイルは外に配置
   - 個人的にはこれが最も良いと思います。
2. **`/app` 内のトップフォルダにプロジェクトファイルを配置**
   - 内部に全てのファイルを配置（あまり使わないかも）
3. **機能やルートごとにプロジェクトファイルを配置**
   - `/app` 内でコロケーション機能を活用して配置

プロジェクトやチームの方針によって異なります。

### プロジェクト配置設計のベストプラクティス
**Atomic Design**
  - 化学をアナロジーとした設計手法

https://atomicdesign.bradfrost.com

#### メリット
- 再利用性、一貫性、拡張性が向上

#### デメリット
- コンポーネント基準が曖昧になる
- UIの変更箇所を見つけづらい
- 細かく分割しすぎると混乱を招く可能性がある

**Bulletproof-React**

https://github.com/alan2207/bulletproof-react


最後に結局のところドキュメントを見るのが一番いいのでみんなも一緒に勉強しましょ！！

https://ja.next-community-docs.dev/docs/app/building-your-application/routing/
PaizaのSランクスキルチェックで使ったアルゴリズム

## はじめに

PaizaのSランクスキルチェック問題を20問ほど解きました。

Paizaのスキルチェックでエンジニアの能力が測れるのかは賛否両論ありますが、SランクになれないエンジニアよりもSランクになれるエンジニアの方が優秀なのは確かです。
Paiza就活をするなら出来るだけSランクになっておいた方がいいのは間違いないでしょう。

Sランク問題は複雑で長い処理を正確に記述することが求められることが多いAランク問題に比べ、知識とひらめきがあれば実装自体はシンプルに済む問題も少なくないです

この記事では、Sランクスキルチェック問題を解く中で必要だったアルゴリズムを紹介します

## Sランクで利用したアルゴリズム

一問でも100点回答出来ればSランクになれるので、
どれか一つ完璧にしてからスキルチェックにブルートフォースすればSランクになれるということになります

- 幅優先探索, 深さ優先探索
    頻出
- 再帰関数
    必須ではないが、覚えると実装がすごく楽になる問題がちらほら
    実務では敬遠されがち
- メモ化再帰
    深さor幅優先 + 枝狩で解ける問題もある
- トポロジカルソート
- UnionFind木
    UnionFindを使う問題はUnionFindを使う発想が出来れば実装は簡単なパターンが多いのでおすすめ
- 数学
    少数型の誤差最小化とか、領域判定とかのテクニックがたまーに

## おわりに

難易度~2100くらいまでの問題はひとつのアルゴリズムがあれば解けるような問題ばかりでしたが、難易度の高い問題になると複数のアルゴリズムの組み合わせや改造が必要な問題もちらほら出てきました。

本当はS問題を全て解いてから記事を書きたかったのですが、解説がなく、わからなかった問題を解けるようになるまでに無限の時間がかかりそうなので早々に挫折してしまいました。
競プロ精進目的なら競プロのサイトの方が良いです（自明）

下限年収の高いスカウトが気持ち増えた気がします
Aruba AP の BSSID を取得

# Aruba の BSSID を取得するスクリプト

台数が多いと確認が大変なのでスクリプトにしてみた。
python は使ったことがないので動けば正義です。

netmiko って何も考えなくて使えるの素晴らしいですね。

```python:aruba-bssid
#!/usr/bin/python3

from netmiko import ConnectHandler
import re

def get_bssid(host, user, passwd):
  aruba_ap = {
    "device_type": "aruba_os",
    "host": host,
    "username": user,
    "password": passwd,
  }

  with ConnectHandler(**aruba_ap) as net_connect:
    # print(f'////  {host} に接続しました ////')
    # print(net_connect.find_prompt())

    output = net_connect.send_command("show ap bss-table")
    for line in output.splitlines():
      # 関係ない行はスキップ
      if not re.search(r'^(..:){5}.. ',line):
        continue

      re_str = re.search(r'^(..:..:..:..:..:..)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)',line)

      bssid   = re_str.group(1)
      ssid    = re_str.group(2)
      ip_addr = re_str.group(4)
      band    = re_str.group(5).split('/')[0]
      channel = re_str.group(6).split('/')[0]
      name    = re_str.group(9)
      print(f'{name}, {ssid}, {bssid}, {band}, {channel}')

    net_connect.disconnect()


# main
if __name__=="__main__":
  # ここに接続先、ユーザ名、パスワードを設定
  hosts = {
    '192.168.33.1' : {'user' : 'admin', 'passwd' : 'pass'},
    '192.168.33.2' : {'user' : 'admin', 'passwd' : 'pass'},
  }

  print('name, ssid, bssid, band, channel')
  for host, var in hosts.items():
    get_bssid(host, var['user'], var['passwd'])
```

出力は stdout にカンマ区切りで出力されます。ファイルにリダイレクトして csv ファイルにすると扱いやすいでしょう。

```shell:実行例
$ python ./aruba-bssid
name, ssid, bssid, band, channel
AP-01, Guest, aa:aa:aa:bb:bb:32, 5GHz, 140+
AP-01, test, aa:aa:aa:bb:bb:33, 5GHz, 140+
AP-01, alpha, aa:aa:aa:bb:bb:34, 5GHz, 140+
AP-01, Guest, aa:aa:aa:bb:bb:22, 2.4GHz, 6
AP-01, test, aa:aa:aa:bb:bb:23, 2.4GHz, 6
AP-01, alpha, aa:aa:aa:bb:bb:24, 2.4GHz, 6
AP-02, test, aa:bb:cc:dd:ee:53, 5GHz, 60+
AP-02, alpha, aa:bb:cc:dd:ee:54, 5GHz, 60+
AP-02, Guest, aa:bb:cc:dd:ee:42, 2.4GHz, 1
AP-02, test, aa:bb:cc:dd:ee:43, 2.4GHz, 1
AP-02, alpha, aa:bb:cc:dd:ee:44, 2.4GHz, 1
AP-02, Guest, aa:bb:cc:dd:ee:52, 5GHz, 60+
```
TiUGに参加してきました(2024年 in Osaka)【参加レポート】


## TiUGとは？

> TiDB ユーザーグループ「TiUG」
> 
> 
> このグループは、PingCAP 株式会社の TiDB について、すでに活用中のユーザーからこれから活用したい、学びたいという仲間が集まって、みんなで知識や体験、考えなどをシェアし合いながら学びを深めていくコミュニティグループです。
> 
> 聞くスタイルのミートアップや手を動かしながら学ぶワークショップ、仲間同士が情報交換や交流を深める会などさまざまなアクティビティを定期的に開催します。
> 

TiDB自体を知りたい方は[こちら](https://pingcap.co.jp/tidb/)

今回は10/25に大阪のグラングリーン大阪（さくらインターネットBlooming Camp）で開催されたので行ってきました。

この記事は感想記事です。（参加レポート）

### 第一部：TiDB 基本＆最新情報

TiDBの基本情報から、最新のアップデートを聞けました。

個人開発のDBに最近TiDBを導入してみたのですが、まだまだ知らないことも多くてもっとTiDBを勉強したり試してみたくなりました！

特にTiDBでAPIをそのまま作成できるという機能を初めて知ったので「これは試してみたい！」となりました。

どうやらSELECTのSQLからは「GET」のAPIが生成されて…という感じでTiDBだけでCRUDのアプリを作成できるようです。

また試してみたら記事にしてみたいです。

あと、既存のレコードからテスト用レコードをコピーしてきて、GitHubActionで管理してテスト実行やその後のロールバックを行えるというのを聞いてこれも個人開発で導入してみたいと感じました。

大阪のこのTiUGイベントで初公開のUpdatesなどもあったのでのっけからアツい内容となっていました！

### 第2部：LT枠

LTではオンプレ環境でTiDBを構築してみたという内容や、その導入事例や使い心地などを聞けました。

### LT１：自社でのTiDB運用状況について / マルチゾーンのTiDBの実験について

さくらインターネットのデータセンターでTiDBを構築してそれを実運用したという内容でして、TiUPの便利さを実感したので「わいもオンプレでTiDB構築してみたい！」となりました。

さらにマルチAZ化する際の注意点ややり方などを教えていただいたのでこれもどこかのタイミングでやってみたい感じました。

### LT２：お宅鯖のTiDB Clusterを構築

こちらは自宅サーバーでTiDBを構築してみたという発表内容でした。

やはりこちらでもTiUPの使い勝手の良さを実感したので試してみたくなりました。

私の場合はまずはミニPCなどを買うところからでしょうか

いえ、家を掃除するところからですね。。

### LT3:

IoT向けストレージにTiKVを採用したときの話

タイトル通り、IoT向けストレージにTiKVを採用したときの話でした。この開発の経緯なども説明されていてストーリーとしても面白かったです。

そして同時にTiKVの性質や仕組みにも触れていただいたので分散DBへの理解度も深まりました。とても勉強にもなりました。

### 感想まとめ

本当に来てよかったです！

まず会場に入るとステッカーをもらえたのですが、どれもカッコよくてまずそれだけでテンションが高くなりました。

![IMG_2013.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008681/629a9f67-1640-8545-6831-566e60b655f0.jpeg)


からの発表やTiDBのアップデートでもっとTiDBを好きになっていき、色々試したい欲が上がりました。

同時に、パフォーマンスについて自分が知識的に足りていなくて理解できていないことが多いので従来のDBのパフォーマンス知識なども勉強してその比較なども行っていきたいなと感じました。

いや〜ホントーにワクワクした1日となりました！
有料Blu-ray再生ソフトの代替案

# TL;DR
変なブルーレイ再生ソフトをインストールする必要はない。MakeMKVを起動しておけばAPIでVLC等の好きなプレイヤーから再生できる。

# はじめに
ブルーレイを再生するために意味不明なソフトをインストールしたくなかったので色々試したところ、MakeMKVにAPI(libmmbd)があるとわかった。

:::note warn
本記事で紹介されている方法によってもたらされた事象についていかなる責任も負いません。すべて自己責任で行ってください。
:::

# 方法
1.[ここ](https://www.makemkv.com/download/)からMakeMKVをインストールする
 
2.有償版を購入するか、期間限定のアクティベーションキーを入力する。詳しくは「MakeMKV key」で調べる。

3.設定を開き、IntegrationからAPIを有効にする。

![スクリーンショット 2024-10-26 011923.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538774/0a4e7016-04d8-3fb9-b63f-a17f4227b03c.png)
![スクリーンショット 2024-10-26 011934.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538774/4046f54f-3928-640f-ae2f-8b53438060cd.png)
![スクリーンショット 2024-10-26 011942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538774/88518fe3-0131-3f72-dc84-c790f6df6cd0.png)

4.あとは有効化したプレイヤーで再生する。

# PS
ちなみにVLCでメニュー画面をエミュレートするにはJavaの実行環境が必要らしいです
grepとsedで文字列抽出

下記のコマンドのように、grepとsedで文字列抽出する方法を解説します

```sh
# コマンド
ll .. | grep admin | sed -n 's/.*sudo\(.*admin\).*/\1/p'
# 以下が出力例
_as_admin
```

## コマンドの解説

**ll .. | grep admin | sed -n 's/.*sudo\(.*admin\).*/\1/p'**

このコマンドは、Linux/Unix系OS上で、カレントディレクトリの親ディレクトリ（..）にあるファイルやディレクトリの一覧から、"admin"という文字列を含む行を抽出し、さらにその行から特定の文字列を抜き出すという処理を行います。

### 各部分の役割

* **ll ..:**
  * `ll` は `ls -l` のエイリアスで、ディレクトリの内容を詳細に表示するコマンドです。
  * `..` は親ディレクトリを指します。
  * つまり、この部分で親ディレクトリの内容を長形式で表示します。

* **| grep admin:**
  * `|` はパイプで、前のコマンドの出力（`ll ..` の結果）を次のコマンドの入力として渡します。
  * `grep admin` は、前のコマンドの出力から"admin"という文字列を含む行だけを抽出します。

* **| sed -n 's/.*sudo\(.*admin\).*/\1/p'**
  * `sed` はストリームエディタで、テキストストリームを編集するためのコマンドです。
  * `-n` オプションは、パターンが一致した場合のみ行を出力するように指定します。
  * `'s/.*sudo\(.*admin\).*/\1/p'` は置換コマンドで、以下のことを行います。
    * `s`：置換コマンドの開始
    * `.*sudo\(.*admin\).*`：正規表現で、"sudo"という文字列の後に任意の文字列（\(.*\)でキャプチャ）、そして"admin"という文字列が続くパターンにマッチします。
    * `\1`：正規表現でキャプチャした部分（つまり、"sudo"と"admin"の間の部分）を置換後の文字列として使用します。
    * `p`：置換後の行を出力します。

### 全体的な処理の流れ

1. 親ディレクトリの内容を詳細に表示する。
2. 表示された内容から"admin"という文字列を含む行を抽出する。
3. 抽出された行から、"sudo"と"admin"の間の部分だけを抜き出して表示する。

### このコマンドで得られる情報

このコマンドを実行すると、通常はファイルのパーミッション、所有者、グループ、サイズなどが表示されますが、このコマンドではさらに絞り込みが行われ、"admin"という文字列が含まれ、かつ"sudo"という文字列の後に"admin"という文字列が続くような行から、その間の部分（おそらくユーザー名やグループ名）だけが表示されます。

### 使用例

* **目的:** 親ディレクトリにあるファイルやディレクトリの中で、"admin"という文字列が含まれ、かつそのファイルの所有者またはグループ名が"admin"であるものを探したい。
* **結果:** "admin"という文字列を含む行が複数ある場合、それぞれの行から"sudo"と"admin"の間の部分（ユーザー名またはグループ名）が1行ずつ表示されます。

### 注意点

* 正規表現の書き方によって、抽出される情報が変わる場合があります。
* `sed` コマンドは強力なツールですが、複雑な処理を行う場合は、正規表現の知識が必要になります。

### まとめ

このコマンドは、特定の文字列を含む行から、さらに特定の部分を抜き出すという、テキスト処理の典型的な例です。Linux/Unix系OSのシェルスクリプトなどで、このような処理を組み合わせて複雑な処理を行うことができます。

**より詳しい説明が必要な場合は、お気軽にご質問ください。**

**例:**
* 「正規表現の`.`の意味が分かりません」
* 「`\1`とは何ですか？」
* 「もっと具体的な使用例を教えてください」

**補足:**
* このコマンドは、ファイルのパーミッションや所有者などを調べるために、`ls -l` の出力をパースしているようなものです。
* より正確な情報を取得するためには、`find` コマンドや `awk` コマンドを使うこともできます。
空白期間あり40代が自社開発企業に転職した話

2023年9月末をもって、前職のSESメインSier企業を退職しました。　
以降半年以上無職をしていましたが2024年5月に2回目の転職を行い社会復帰しました。
本記事では無職期間にやったこと、転職にあたり優先したことなどを書いていきます。
# 記事を書こうとした動機
オライリーの本目当て、11月に出るEffective Rustほしいです。

# 筆者のスペック
岐阜寄りの愛知住み40代、妻帯者、大学院修士卒（情報系）

# 簡単な経歴
1社目：半導体メーカー子会社  (仙台)
2社目：半導体メーカー(引き続き仙台、転職ではなく転籍)  
3社目：東証一部上場SESメインSier企業（愛知）
4社目：自社開発企業(愛知、現職)  

新卒で入社して以降、製品用のマイクロコンピュータのドライバやアプリケーションの設計、開発、試験、展示会で公開するためのデモアプリの設計、開発をやっていました。 
1,2社目では製品向けでアサインされた仕事のほとんどが試験ばかりで開発経験が薄くかつ周りのレベルが高く正直技術者としての自信はなかったです。
3社目では量産用の車載マイクロコンピュータのドライバの差分開発、不具合解析などを行っていました。マイコンマニュアルを読みまくったので実力がかなりついたと思います。技術者として自信がついたのはこの辺から。  
退職理由は自粛します。

# 転職前にやったこと
以下３つを実績として応募先に提示できるように取り組みました。
## ポートフォリオの作成
AIエンジニアへの転向を試みて10月に1ヶ月ほどpytorchでAIのプログラムを書いていました。
モダンな開発手法とかCI/CDとか勉強してみたいと思い、Docker構築、CircleCi導入などやってました。

## コンペ参加
12月〜1月まで自動運転AIチャレンジというコンペに参加しました。
コミュニティ貢献賞・広報賞で入賞することができました。
競技としての成績は良くなかったのですが、Qiitaでの記事投稿、ボランティア活動等を評価してくださったようです。

## 競技プログラミング
### Paiza
Sランクまで上げて以降飽きてしまいAtcoderに毎週参加するように。
### Atcoder
主に螺旋本の問題を解いていました。
茶色までいきました、半年かかりました。

## 転職活動について
2024年4月から転職活動をおこないました。
転職エージェントを使いました。レバテックを使いました。サポートは手厚かったです。給与交渉もしてくれます。
応募は自分で検索するという形ではなく、エージェントが出してくる求人から筆者が希望する企業にアプローチしてもらうという形でした。
基本的には出してくる求人には応募条件満たしてなくてもいいので、と言われたのでそういったものにも応募しました。

### 転職に当たり優先したこと
前職まで激務が多く家庭をおろそかにしがちだったのと疲れてしまったので妻と話し合い以下の順位に。
・ライフワークバランスが取れること
・（できれば）自社開発
・市場価値を高められるところ
・レガシー開発でないこと
・給与は前職とほぼ横ばいくらいならOK

### 転職活動した結果
活動期間はほぼ１ヶ月です。
転職活動、結果はうろ覚えですが
応募：10社
書類通過：8社
内定：3社
という結果だったはずです。ありがたいことです。

## 内定をもらった企業
１．東証一部上場SESメインSier企業(提示年収不明)
やってほしい職種は不明
２．東証一部上場SESメインSier企業（提示年収１００万アップ）
コンペの取り組みを重視。
車載のAD/ADASをメインでやってるプロジェクト
３．自社開発企業（現職、提示年収現状維持）
技術力の高さ（ポートフォリオ含む）を重視。
Rustの開発してほしい
でした。
自社開発企業に入りたかったのと、Rustを書きたかったので現職にしました。
レバテックは年収交渉もしてくれます。現職の提示収入と他企業に開きがあるので年収交渉しますか、と聞かれましたが中に入ってあげればいいや感もあり交渉はしませんでした。

## 最後に
レバテックの担当の方にはお世話になりました。
これからは自身の年収UPと市場価値を上げること、会社の売上利益UPのためにがんばっていきたいです。
また、Rustでの開発に興味がある方、ぜひ弊社への入社をご検討ください。
では。
PowerShell Script(ps1)でWinScpを自動実行する

下記がPowerShellのスクリプトからWinScpを操作するスクリプトの例

```powershell:transfer.sh
# バッチモードに設定し、確認/問い合わせを無効にする
option batch on
# ファイル上書きの確認などを無効にする
option confirm off

# 除外設定
option exclude "*.log;*.tmp"

# サーバーに接続
open username:password@host
# なおパスワードを指定して接続するには次のようにする
# open user:password@example.com

# リモートディレクトリを変更
cd /home/user/workspace
# バイナリモードに変更
option transfer binary
# ファイルをd:\にダウンロード(最後の\が省けません)
# -preservetime : タイムスタンプ変更なし
put -preservetime C:\Users\user\workspace\powershell\share\* ./
# 切断
close

## 異なるユーザーでサーバーに接続
#open user2@example.com
## リモートディレクトリを変更
#cd /home/user2
## ファイルをアップロード
#put d:\examplefile.txt 
## 切断
#close
## 終了
exit
```

```powershell:TransferFile.ps1
# WinScpのパス
$winScpPath = "C:\Users\user\tools\WinSCP-6.3.5-Portable\WinSCP.com"
# WinScp.exeの方を実行するなら\consoleオプションが必要
# $winScpPath = "C:\Users\user\tools\WinSCP-6.3.5-Portable\WinSCP.exe /console"

# スクリプトファイル
$winScpScriptPath = ".\transfer.sh"

# WinScp実行
& $winScpPath /script=$winScpScriptPath
```

```powershell:receive.sh
# バッチモードに設定し、確認/問い合わせを無効にする
option batch on
# ファイル上書きの確認などを無効にする
option confirm off

# 除外設定
option exclude "*.log;*.tmp"

# サーバーに接続
open username:password@host
# なおパスワードを指定して接続するには次のようにする
# open user:password@example.com

# リモートディレクトリを変更
cd /home/user/workspace
# バイナリモードに変更
option transfer binary
# ファイルをd:\にダウンロード(最後の\が省けません)
# -preservetime : タイムスタンプ変更なし
get -preservetime ./* C:\Users\user\workspace\powershell\share\
# 切断
close

## 異なるユーザーでサーバーに接続
#open user2@example.com
## リモートディレクトリを変更
#cd /home/user2
## ファイルをアップロード
#put d:\examplefile.txt 
## 切断
#close
## 終了
exit
```

```powershell:ReceiveFile.ps1
# WinScpのパス
$winScpPath = "C:\Users\user\tools\WinSCP-6.3.5-Portable\WinSCP.com"
# WinScp.exeの方を実行するなら\consoleオプションが必要
# $winScpPath = "C:\Users\user\tools\WinSCP-6.3.5-Portable\WinSCP.exe /console"

# スクリプトファイル
$winScpScriptPath = ".\receive.sh"

# WinScp実行
& $winScpPath /script=$winScpScriptPath
```


# 参考
https://qiita.com/KANTU/items/e843480b5b8bc4a4590a

https://qiita.com/mima_ita/items/35261ec39c3c587210d8

https://qiita.com/aimoriu/items/a36b231d3fd26b222452

https://osdn.net/projects/winscp/wiki/script_commands#get

https://chaingng.github.io/post/sftp_command/#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E9%96%A2%E9%80%A3
クラウドを使いこなすと原発が建つ

クラウドの進化が社会のあらゆる分野で影響を及ぼしている。特にAWSやMicrosoft（以下MS）といったメガクラウドベンダーは、急増するデータセンターの消費電力を確保するために、一般向け電源や再生エネルギーの活用に加え、原子力への投資を強化しているのだ。

参考：

https://www.denkishimbun.com/sp/370605

https://project.nikkeibp.co.jp/ms/atcl/19/feature/00003/101000184/?ST=msb&P=1

https://www.ft.com/content/33eeadbe-edf4-40b5-b973-e76c570d0681

# メガクラウドベンダーが原子力に投資する背景
クラウドサービスの需要は生成AI人気も相まって年々増加しており、それに比例してデータセンターの消費電力も増加している。AWSやMSのデータセンターの一般向け電源や再生エネルギーに賄われているが、いかなる気候条件でも安価に安定供給できる原子力が必要になっている。特に、小型モジュール炉（SMR）といった次世代の原子力技術は、安定性や安全性に優れており、クラウド業界でも注目されている。今後、クラウドを支える電力として原子力がさらに重要になるだろう。

# 過去～現在：小売りからIT分野の社会インフラ基盤へ
AWSは元々、Amazonの小売りビジネスにおける自社ITインフラの効率化を目的として構築された。しかし2006年のサービス開始以降、AWSは全世界の企業にITインフラを提供するクラウドサービスとして大きな成長を遂げ、日本政府のIT基盤にも利用されるまでに至っている。AWSは、単なるITインフラを超えて、社会インフラの一部として重要な役割を果たしているのだ。

# 現在～未来：ITインフラから電力インフラへ
このような原子力の導入は、データセンターの電力供給にとどまらず、外部企業の事業用電力や家庭用電力にも安価で安定したエネルギーを提供する新たな道を開くかもしれない。AWSやMSが自社のエネルギー供給インフラとして備えた原子力発電が、将来的に一般消費者へも拡大される可能性があるのではないだろうか。

# サービス名を予想してみた
原子力を活用したクラウドベンダーの電力供給サービスはどのような名前になるだろうか？以下にいくつかの予想を挙げる。
* AWS Fission Flow：核分裂（fission）に基づく持続的で強力なエネルギー供給を表現。
* Google AtomNet：原子力（Atom）とネットワーク（Network）を掛け合わせた広域ネットワークを示唆。
* Azure Quantum Power：量子の持つ無限の可能性と、次世代エネルギーの未来を見据えた名前。

# クラウドの利用が安価で安定した電力供給に貢献
「風が吹けば桶屋が儲かる」のごとく、「クラウドを使いこなすと原発が建つ」時代の到来。今は単なる妄想だが、安価で安定した電力供給にクラウドで貢献できる可能性は、IT技術者である私にとっても光である。クラウド活用を普及啓蒙し、この流れを大きくしよう。
ラズパイでDockerでWordpress環境を作る

# 概要

Raspberry Pi OS（64bit）の環境で以下の記事のこと（感謝）をやりたい。

https://qiita.com/ryo2132/items/d75e1846aa181676406e

そのままやってみるとArm64環境のため上手く行かなかったので修正したメモです。

# 内容
記事のdocker-compose.ymlのimageにplatform: linux/arm64を指定するだけでは上手く行きませんでした。

以下に修正をしました。

主な修正は、
databaseのイメージを以下に変更。
```
image: hypriot/rpi-mysql
```

Wordpressのイメージに以下を指定。
```
platform: linux/arm64
image: wordpress:latest
```

wordmoveのイメージに以下を指定と変更。
```
platform: linux/arm64
image: bitstudios001/wordmove
```
以下、全文。
```docker-compose.yml（修正後）
services:
    database:
        image: hypriot/rpi-mysql
        command:
            - "--character-set-server=utf8"
            - "--collation-server=utf8_unicode_ci"
        ports:
            - "${LOCAL_DB_PORT}:3306"
        restart: on-failure:5
        container_name: "${PRODUCTION_NAME}_db"
        environment:
            MYSQL_USER: wordpress
            MYSQL_DATABASE: wordpress
            MYSQL_PASSWORD: wordpress
            MYSQL_ROOT_PASSWORD: wordpress
    wordpress:
        depends_on:
            - database
        platform: linux/arm64
        image: wordpress:latest
        container_name: "${PRODUCTION_NAME}_wordpress"
        ports:
            - "${LOCAL_SERVER_PORT}:80"
        restart: on-failure:5
        volumes:
            - ./public:/var/www/html
        environment:
            WORDPRESS_DB_HOST: database:3306
            WORDPRESS_DB_NAME: wordpress
            WORDPRESS_DB_USER: wordpress
            WORDPRESS_DB_PASSWORD: wordpress
    wordmove:
        tty: true
        depends_on:
            - wordpress
        platform: linux/arm64
        image: bitstudios001/wordmove
        restart: on-failure:5
        container_name: "${PRODUCTION_NAME}_wordmove"
        volumes:
            - ./config:/home/
            - ./public:/var/www/html
            - ~/.ssh:/home/.ssh 
        environment:
            LOCAL_SERVER_PORT: "${LOCAL_SERVER_PORT}"
            PRODUCTION_URL: "${PRODUCTION_URL}"
            PRODUCTION_DIR_PATH: "${PRODUCTION_DIR_PATH}"
            PRODUCTION_DB_NAME: "${PRODUCTION_DB_NAME}"
            PRODUCTION_DB_USER: "${PRODUCTION_DB_USER}"
            PRODUCTION_DB_PASSWORD: "${PRODUCTION_DB_PASSWORD}"
            PRODUCTION_DB_HOST: "${PRODUCTION_DB_HOST}"
            PRODUCTION_DB_PORT: "${PRODUCTION_DB_PORT}"
            PRODUCTION_SSH_HOST: "${PRODUCTION_SSH_HOST}"
            PRODUCTION_SSH_USER: "${PRODUCTION_SSH_USER}"
            PRODUCTION_SSH_PORT: "${PRODUCTION_SSH_PORT}"

```

ちなみに修正前はWordmoveの立ち上げで以下のエラーがありました（こうした原因のエラーによくあるらしいので記載）。
```
exec "/bin/mount-ssh.sh": exec format error
```

ちなみにこちらの問題かもしれないけれどed25519の秘密鍵をssh-addしてもログインできなかったので秘密鍵をrsaで作り直しました。
東大の「コードで学ぶAWS入門」を読んで理解したことのまとめ＃３

## 2章の「クラウド概論」を理解する＃３

#### 「クラウド」が提供する３つのサービス形態その２

##### Platform as a Service (PaaS)とInfrastructure as a Service (IaaS)を理解する。
前回のSaaSに引き続き、クラウドのサービス形態の残り２つを理解していく。どうやらこの２つを別々で理解するのは難しそうなので、２つを比較しながら進めていく

##### 「分かりそう」で「分からない」でも「分かった」気になれるIT用語時点によると、、、
IaaS はサーバや回線などのいわゆる「インフラ」に分類される部分を、インターネット越しに使えるようにしてくれるサービス
PaaS はサーバやOS、データベースなどのいわゆる「プラットフォーム」と呼ばれる部分を、インターネット越しに使えるようにしてくれるサービス

ん？サーバーって結局どっちなの？

#### ChatGPTに聞いてみた

##### サーバはIaaSとPaaSどちらですか？

🗒️ Answer
<font color ="Red">サーバは主にIaaS（Infrastructure as a Service）に分類されます。</font>IaaSは、ユーザーがサーバーやストレージといったハードウェアリソースを利用できるサービスです。これに対して、<font color ="Red">PaaS（Platform as a Service）は、アプリケーションの開発環境を提供</font>し、開発者がアプリを作成する際の基盤を提供します[1][2]。具体的には、サーバの構成を見直す場合はIaaSが適しており、アプリケーションの開発を効率化したい場合にはPaaSが選ばれます[5]。

##### IaaSの代表的なサービスはなんですか？

🗒️ Answer
IaaS（Infrastructure as a Service）の代表的なサービスには以下のものがあります：

Amazon Web Services（AWS） - 幅広い機能とリソースを提供する人気のクラウドプラットフォームです[2]。
Microsoft Azure - Microsoftのクラウドサービスで、さまざまなITリソースを柔軟に提供します[1]。
Google Cloud Platform（GCP） - Googleが提供するIaaSで、スケーラビリティと分析機能に優れています[5]。
IBM Cloud - IBMのクラウドサービスで、特に企業向けの機能が充実しています[3]。
これらのサービスは、<font color ="Red">ユーザーが必要なコンピューティング、ストレージ、ネットワークリソース</font>をインターネット経由で利用できるようにします[4]。


#### PaaSの代表的なサービスはなんですか?

🗒️ Answer
PaaS（Platform as a Service）の代表的なサービスには以下のものがあります：

Google App Engine - Googleが提供するアプリケーション開発プラットフォームで、スケーラブルなアプリを構築できます[4]。
Microsoft Azure - Microsoftのクラウドプラットフォームで、アプリケーションの開発、デプロイ、管理が可能です[1]。
Amazon Web Services（AWS） - AWSには、Elastic BeanstalkなどのPaaS機能が含まれ、開発者がアプリケーションを簡単にデプロイできます[6]。
これらのサービスは、<font color ="Red">開発者がインフラの管理を気にせずにアプリケーションの開発に集中できる環境を提供します</font>[5]。


##### 僕なりの２つのサービス形態の理解
まずIaaSとはサーバ、ネットワーク、ストレージなどの設備？をインターネット経由で提供するサービス。これらの設備はニーズに応じてカスタマイズできる。たとえばAWSのEC2のメモリの容量とか？

そしてPaaSとは上記の設備を配置する環境をインターネットごしに提供する。ここでいう環境とは「開発環境」「デプロイ(テスト)環境」「本番環境」など。(PaaSって本番環境でも使うのかな？わかんね）

つまりはこういうことだ
###### 開発環境
PaaSは工場となる建物のこと、その中配置する機械（IaaS）のスペックやサイズはその工場で生み出す成果物に適切なものを選べる。

###### デプロイ環境
つまりはモデルルーム。建物をPaaSとすると、家具、家電がIaaS。おしゃれな家具や高い家電をおいて購買意欲を向上させる。「
###### 本番環境
モデルルームを購入して住むことになった家。家具家電は家族構成や、インテリアの好みなどで選択する。

ここまでがAWSを学習する上での前提知識。移行はAWSの提供するサービスについて学習していく（多分）
Singly linked list (単純連結リスト)

LeetCode で初見の下記の表記にビビって扱いの理解に数時間かかったがどうもしっくりこない。

```
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
```

https://leetcode.com/explore/learn/card/the-leetcode-beginners-guide/692/challenge-problems/4426/

このチュートリアルの動画がとても詳しく説明してくれていて初心者にためになる。
10分で理解できるのでこれを見るべし。
【GitHub】特定のリポジトリのコピーを作成する方法


ターミナルで以下のコマンドを実行し、複製元のリポジトリをクローンします。

```terminal
git clone --bare https://github.com/UserName/old-repo.git
```

複製先のリポジトリを作成し、以下のコマンドを実行します。

```terminal
$ cd old-repo.git
$ git push --mirror https://github.com/UserName/new-repo.git
```

不要なファイルを削除します。

```terminal
cd ..
rm -rf old-repo.git
```
コミットメッセージのプレフィックスガイド

# コミットメッセージのプレフィックスまとめ

開発を進める上で、コミットメッセージは大切！
自分や他の開発者が「何をしたのか」一目でわかるように、共通のフォーマットで整理してみました。
迷ったときにすぐ見返せるように、ここに自分向けメモを残しておきます！

## プレフィックス一覧

| プレフィックス | 意味                           | 使うタイミング                                                                 |
| -------------- | ------------------------------ | ------------------------------------------------------------------------------ |
| **fix**        | バグ修正                       | エラーや動作不良の修正をしたとき                                              |
| **add**        | 新しい機能・ファイルの追加     | 新しく作った機能やファイルを追加したとき                                       |
| **update**     | 既存機能の修正（バグではない） | バグじゃないけど、ちょっと改良したり仕様変更したとき                          |
| **remove**     | 不要なものを削除               | 使わなくなったファイルやコードを削除したとき                                   |

### プレフィックスの具体例

- **fix**: 不具合を見つけて修正したときに使う！
  - 例: `fix: ユーザー認証が失敗する問題を修正`
  
- **add**: 新しいページや機能、コンポーネントを作ったときに使う！
  - 例: `add: ユーザー登録ページを追加`
  
- **update**: 既存の機能を改善したり、少しだけ変えたときに使う！
  - 例: `update: プロフィール編集ページのレイアウトを調整`
  
- **remove**: いらなくなったコードやファイルを消したときに使う！
  - 例: `remove: 不要になったテストファイルを削除`

## まとめ

プレフィックスを使い分けておくと、後で見返したときに「何をやったか」がすぐにわかるし、レビューも楽になる！
特に複数人でやってると、こういうルールがあるとみんなハッピー
自分も未来の自分にやさしくなるためにこれを守っていこ

---
Remix ✕ Prisma（SQLite） ローカル開発環境のDBにTablePlusで接続してみる

## 概要

RemixでPrisma（SQLite）を使って環境構築をした際のDBにTablePlusでアクセスする方法を簡単にまとめる。

## 方法

1. TablePlusにて新規の接続を設定、SQLiteを選択

    ![CleanShot 2024-10-25 at 23.31.28@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9b98c0ef-8cd5-05ff-807a-b643e6d0f471.png)

1. 下記のように設定
    - Name: 任意の接続名
    - Status color: 任意の色（余談だが筆者はPRD環境→赤、STG環境→黄色、DEV環境→青、local環境→緑と決めている）
    - Env: local
    - Database path: `Remixのプロジェクトルートディレクトリ/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/識別文字列.sqlite`

        ![CleanShot 2024-10-25 at 23.39.10@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/59d12b8d-4f01-909f-67fa-0511ddec43c9.png)

1. 「Save」ボタンを押下して設定を保存
1. 作成した接続設定をダブルクリックしてDBに接続できるかを確認
15年目のエンジニアが初めての転職で年収130万アップした話（選考・面接編） 

前回からの続きです。だいぶ期間が空いてしまい申し訳ございません。

15年目のエンジニアが初めての転職で年収130万アップした話（転職エージェント編）
https://qiita.com/fuyume/items/87895126df86e66bf17f

この記事を書こうと思ったキッカケは、IT業界においてブラックな話を聞いたり実際に見たこともあったりしたので、そこから一人でも多く抜け出して欲しいと思ったからです。

## 応募数と通過率

某転職エージェント内で応募数と通過率の平均は以下のようです。

・書類選考 応募数35～65件、通過率8～19%
・一次面接 応募数9～14件、通過率21～29%
・最終面接 応募数3～5件、通過率31～50%

上記のエージェントの場合、数撃ちゃ当たるみたいな方針なのであくまで目安です。

最終的には2～3社の内定を勝ち取り、比較した上で最終的に1社を承諾する形に持っていくのが理想です。

私の場合は、以下の結果となりました。
<table>
<caption></caption>
<tr><th>選考</th><th>応募数</th><th>NG</th><th>OK</th><th>通過率</th></tr>
<tr><td>書類</td><td>90</td><td>45</td><td>45</td><td>50%</td></tr>
<tr><td>一次</td><td>15</td><td>9</td><td>6</td><td>40%</td></tr>
<tr><td>最終</td><td>3</td><td>1</td><td>2</td><td>66%</td></tr>
</table>

1ヶ月目は、履歴書＆職務経歴書の作成、面接対策、企業の絞り込みと応募。
2ヶ月目は、面接。（平日に1日1回以上と高頻度）。上記の表にカジュアル面接はカウントしてないので実際の面接数は倍近くやりました。

上記を働きながらやっていたのでかなり高負荷な転職活動でした。
私の場合、ギークリーとレバテックキャリア、更に転職ドラフトを同時並行でやっていたので面接スケジュール管理も非常に苦労しました。
※今すぐに転職したいという思いが強かった為に多忙な転職活動でしたが、オススメはしません。

一般的には半年くらいかけて、１週間に１回くらいの頻度で平日の業後に面接をして休日に企業調査＆面接対策＆反省をやっていき、転職エージェントも１つに絞るか余裕があれば転職ドラフトで指名された企業も並行でやっていくのがオススメです。

## 書類選考と適正試験

書類選考に応募すると企業によっては面接前にWeb試験やアンケートがあります。
内容は算数、論理力、規則性など様々でプログラミングテストや性格診断のようなアンケート形式も。
書類選考の通過率が低い場合は履歴書＆職務経歴書を改善しましょう。

## カジュアル面接

定義は以下ですが、実際の内容は企業によってバラバラです。

カジュアル面接とは、通常のフォーマルな雰囲気ではなく、よりリラックスした雰囲気で行われる面接のことです。参加者同士がより自然な会話を楽しむことができ、候補者の性格や人柄をより良く把握することができます。この形式の面接では、通常のフォーマルな面接での質問に加えて、非公式なトピックや候補者の趣味や興味に関する質問も行われることがあります。

企業としても一次選考前に認識のズレがないか確かめておきたいのです。注意点として本来、カジュアル面接は選考を行わず後日に一次選考を行うという流れですが、稀にカジュアル面接後に合否を伝えて内容が悪ければ一次選考をやらない企業もあったりします。質問できる時間は結構多く設けていることが多いので事前に考えておきましょう。

## 一次選考
最初の難関というかここさえ通過できれば、あとは内定まですんなり通過できることが多いです。
人事だけの1on1だったり、役職持ちの社員が複数いたりと何も知らされないままぶっつけ本番なことが多いです。私の経験上は最大６人いたりしました。序盤は失敗することが多いと思いますがトライ＆エラーで改善していけばいいかと思います。

## 最終選考
基本は役員や取締役、社長と面談します。一次選考を切り抜けてきたのなら大丈夫なはずです。
最後に給与はいくらを希望しているか聞かれたりします。別のケースもあり、内定後のオファー面談で聞かれたり、転職エージェント経由で聞かれたりと企業によって様々です。
私の場合は転職ドラフトで指名された金額なども考慮して現職年収のプラス100万とかなり強気に出ました。
一般的には現職年収のプラス50万程度が目安のようです。
また、他に最終選考まで進んでいる企業はあるか、その企業には給与はいくらを希望しているか聞かれたりします。正直に答えましょう。
察しの通り、この段階から企業が選考者を選ぶ立場から選考者が企業を選ぶ立場への分岐点です。

## 内定と承諾
大きな流れは、最終選考、内定通知、希望年収を伝えるなどするオファー面談、年収や待遇が記載された内定通知書の内容を説明された上で受取、内定承諾です。オファー面談は無い場合もあり、転職エージェント経由でヒアリングがあったりもします。

注意点は内定を貰った後(厳密には内定通知書を受け取った後)から、内定を承諾するか辞退するかの回答するまでの期間は平均1週間以内とかなり短いです。
よって、もし内定が複数もらえそうなら複数企業の最終選考日は近い日でスケジュール調整した方がいいです。そうしないと内定書の給与や待遇面を比較してどちらを内定承諾するか選ぶことができないからです。

また、企業は内定すると決めたはいいが内定通知書を渡すまでに給与はいくらに設定するか、他に最終選考まで進んでいる企業がある場合はそれよりも高い給与にしなければ内定承諾してもらえないなと悩み始めます。そういった場合の調整は転職エージェントがいると仲介してくれてたりするので、それが個人で企業に応募する場合の大きな違いとなります。

私の場合、内定した2社に現職年収プラス100万が希望年収であることを転職エージェント経由で伝え、結果的には内定承諾に至った現職からプラス130万で内定通知書を受け取りました。

## 雑感
如何でしたでしょうか。私は７月に入社して試用期間も終わり本格的に業務を任され多忙な日々を送り、今回の記事を書くのがだいぶ遅くなってしまいましたが、転職を決意して良かったなと改めて感じます。
もし、こういったことも教えて欲しいとか相談したいことなどあればコメントをお願いします。
願わくば、皆さんが良い転職に巡り合うことができれば幸いです。
自宅ネットワークの現状(2024/10/25)

そう言えば現状を報告せぬまま10Gbps化しても、
何が嬉しいのってなったので状況報告。

## 現状
インターネット向けはenひかりの1Gbps
LANは2.5Gbpsスイッチを使って少しあがいてる。
別にインターネットの速度を早くしたいのではなく、
LANでのファイル授受の速度を早くしてあげたいのが趣旨。

## LAN速度(2024/10/25)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918883/065be710-9b3a-dc92-eb79-21689882e5d5.png)

## 自宅ネットワーク構成図
![ysapt.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918883/c3a43dc7-24ce-8376-829c-19d0bf88c258.png)
npmで「Run npm install -g npm@10.9.0 to update!」が出た時のメモ

npmで警告？みたいなのがでたのでAIに頼ってみた

--
最近、npm（Node Package Manager）を使用して多数のパッケージをインストールした際に、以下のようなメッセージが表示されたようですね。この解説記事では、出力内容の各部分が何を意味しているのかを詳しく説明し、推奨されるアクションについてご案内します。

出力内容の概要

1added 1674 packages, and audited 1675 packages in 4m
2
3268 packages are looking for funding
4  run `npm fund` for details
5
63 vulnerabilities (2 low, 1 high)
7
8To address all issues, run:
9  npm audit fix
10
11Run `npm audit` for details.
12npm notice
13npm notice New major version of npm available! 9.2.0 -> 10.9.0
14npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.9.0
15npm notice Run npm install -g npm@10.9.0 to update!
16npm notice

この出力は、主に以下の4つのセクションに分かれています。

1. インストールされたパッケージ

1added 1674 packages, and audited 1675 packages in 4m

意味: プロジェクトに1,674個のパッケージが正常に追加されました。また、その依存関係を含む1,675個のパッケージが監査（セキュリティチェック）され、4分間かかったことを示しています。

2. 資金調達情報

1268 packages are looking for funding
2  run `npm fund` for details

意味: インストールしたパッケージのうち、268個が資金提供を求めています。これは、これらのパッケージのメンテナーや開発者が、プロジェクトの維持や開発のために支援を求めていることを意味します。

アクション: 資金提供の詳細を確認するには、以下のコマンドを実行します：

bash

3. 検出された脆弱性

13 vulnerabilities (2 low, 1 high)
2
3To address all issues, run:
4  npm audit fix
5
6Run `npm audit` for details.

意味: プロジェクトの依存関係に3つのセキュリティ脆弱性が見つかりました。内訳は、低リスクのものが2つ、高リスクのものが1つです。

アクション:

自動修正: セキュリティ脆弱性を自動的に修正するには、以下のコマンドを実行します：

bash

詳細なレポートの確認: 脆弱性の詳細情報や、手動で対応する必要がある場合の対策を確認するには、以下のコマンドを実行します：

bash

注意点: 自動修正が不可能な場合、手動でパッケージのバージョンを更新する必要があります。この際、メジャーバージョンの更新は破壊的変更（互換性のない変更）を含む可能性があるため、アプリケーションの動作確認を十分に行ってください。

4. npm の新しいバージョンの利用可能通知

1npm notice
2npm notice New major version of npm available! 9.2.0 -> 10.9.0
3npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.9.0
4npm notice Run npm install -g npm@10.9.0 to update!
5npm notice

意味: npm の新しいメジャーバージョン（9.2.0 から 10.9.0）が利用可能であることを通知しています。

アクション:

変更内容の確認: アップデートする前に、変更点や新機能、破壊的変更がないかを確認するために、以下のリンクからチェンジログを参照します：

npm v10.9.0 チェンジログ

npm のアップデート: 問題がなければ、以下のコマンドで npm を最新バージョンに更新します：

bash

アップデートの確認: アップデートが正しく行われたかどうかを確認するには、以下のコマンドを実行します：

bash

注意点: メジャーバージョンのアップデートは、破壊的変更を含む場合があります。特にチームでプロジェクトを管理している場合や、プロダクション環境で使用している場合は、互換性に問題がないかを十分にテストしてください。

推奨される次のステップ

脆弱性の対処:

自動修正を試みるために以下のコマンドを実行します：

bash

それでも解決しない脆弱性がある場合、以下のコマンドで詳細なレポートを確認し、必要に応じて手動で対処します：

bash

npm の更新を検討:

チェンジログを確認し、変更点や新機能を理解します。

問題がなければ、以下のコマンドで npm を最新バージョンに更新します：

bash

プロジェクトが新しいバージョンと互換性があることを確認するために、アプリケーションをテストします。

資金調達の機会を探索:

使用しているパッケージのメンテナーや開発者を支援するため、以下のコマンドを実行して詳細を確認します：

bash

頻繁に使用するパッケージやプロジェクトに対して、時間や資金の提供を検討します。

追加のヒント

定期的なメンテナンス: セキュリティを保つために、定期的に npm audit を実行し、依存関係の脆弱性をチェックしましょう。

バージョン管理の活用: 重大な変更（例：npm のアップデートや主要なパッケージの更新）を行う前に、Gitなどのバージョン管理システムを使用してソースコードを管理し、問題が発生した際に容易に戻せるようにしましょう。

自動化ツールの導入: 継続的インテグレーション（CI）パイプラインに脆弱性チェックや依存関係の更新を自動化するツールを組み込むことで、セキュリティと品質を維持しやすくなります。

もし、これらの手順を実行する際に具体的な質問や問題が発生した場合は、遠慮なくお問い合わせください。適切なサポートを提供いたします。
--
Dockerを使ってローカルでwordpressを起動させる

## はじめに
今回はDockerを使用してローカルでwordpressを起動させます。
ローカルなので外部に公開されないので一人日記に丁度いいかも。。
## docker-compose.yml
詳しい内容は割愛しますが、`services`で2つコンテナを設定します。

```
version: '3.8'

services:
  wordpress:
    image: wordpress:latest
    container_name: wordpress
    ports:
      - "8000:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    depends_on:
      - db
  
  db:
    image: mysql:5.7
    container_name: wordpress_db
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_ROOT_PASSWORD: rootpass
    volumes:
      - db_data:/var/lib/mysql
    
volumes:
  db_data:

USE exampledb;
SELECT * FROM
```
## コンテナを立ち上げる
以下のコマンドで,
docker-compose.ymlで記載した内容に沿ってコンテナを起動させます。
`docker-compose up -d`

`http://localhost:8000`にアクセスすると、dockerで起動させたwordpressにアクセスでき、wordpressの初期設定画面にいけます。
そこで試しに記事を書いてみてください。

## DBの中身を見てみる
以下のコマンドで、dockerで立ち上げたDBにアクセスします。
`docker exec -it wordpress_db mysql -u exampleuser -p`
`docker exec -it`で指定したコンテナにアクセスしてコマンドを使用することができるようになります。

以下のコマンドで、DBの中に保存した記事のデータを確認します。
```
USE exampledb;
SELECT * FROM wp_posts WHERE post_type = 'post';
```

これで自分が投稿した記事が保管されていればOKです。
ローカルで動かしているのでネット接続がなくても記事がかけます。
誰にも見られることはないですが。。

## 終わりに
今回はローカルでしたが、次はEC2上でwordpressを起動して、ネットに公開できるようにやっていきたいと思います！
自分用競プロの記録

# 競プロ今まで解いた問題の記録
S：本番解けた
A：自力でとける
B：あと一回ぐらい復習すればAになる
C：一回は解けたぐらい
D：とけてすらない
E：いまはあきらめてる
### コンテスト
||A|B|C|D|E|F|G|
|---|---|---|---|---|---|---|---|
|ABC369|A|A|A|A|B|B|D|
|ABC373|S|S|S|S|A|B|D|
|ABC376|S|S|S|B|C|D|D|
|ABC377|S|S|S|S|B|B|D|
|ABC378|S|S|S|S|B|D|D|
|ABC379|S|S|A|B|D|D||

* ABC373
E問題の高速に解く別解をまだ理解できてない

* ABC376
E問題までは自力で解けそうなことがわかったので次回からは5完を目指したい

* ABC377
D問題あと一分あればACできたのが悔しい

* 自分は木が苦手かも

### 競プロ典型90
|No.|評価|||||
|---|---|---|---|---|---
|1||31||61||
|2||32||62||
|3||33||63||
|4||34||64||
|5||35||65||
|6||36||66||
|7||37||67||
|8||38||68||
|9||39|A|69||
|10|A|40||70||
|11|B|41||71||
|12|B|42||72||
|13|B|43|B|73||
|14|A|44|A|74||
|15|B|45||75||
|16|A|46|A|76||
|17|B|47|D|77||
|18|A|48|A|78||
|19|B|49||79||
|20|A|50|A|80||
|21|B|51||81||
|22|A|52||82||
|23|D|53||83||
|24|A|54||84||
|25||55||85||
|26||56||86||
|27||57||87||
|28||58||88||
|29||59||89||
|30||60||90||


### アルゴリズム
* Trie木
    * ABC377G
* ランレングス圧縮
    * ABC369D
* segment木
    * 典型-29、ABC185-F、AOJ-RMQandRAQ、 ABC322-F(未）
* BIT木
    * ABC378-E
* いもす法
* doubling
* LIS（最長増加部分列）
    * ABC369F
* 木dp
    * ABC378-F
* dfs
    * ABC378D?
*
VSCodeで拡張機能Bookmarksのショートカットキーを使いたいのに何故かkindleアプリが起動する

windowsのvscodeでは拡張機能のbookmarksのToggleを
ctrl + alt + kで行えるはずだった。

しかし何度やっても反応しない、どころか何故かkindleアプリが起動する。

## 結論
ショートカットキーがkindleアプリ起動に割り当てられていた。

kindleアプリのexeファイルの場所を開く。
exeファイルのプロパティをチェックし、
ここを削除した。
以下は削除後。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3851119/9bb8222d-5ce4-1aea-fd3d-3e776f96cac9.png)
pnpm で使用するnodeバージョンを固定する&自動インストールする



```package.json
{
  "name": "web",
  "version": "1.0.0",
  "private": true,
  "engines": {
    "node": "20.10.x",
    "npm": "10.8.x",
    "pnpm": "8.7.x"
  },
  ...
}
```

このように書くことで、開発に使うnodeのバージョンを指定することができます。
開発者毎でフロントのコードがビルドできる・できないを解消するためによくやるやつですね。

仮にバージョンが異なるnodeでビルドしようとすると、次のようなエラーが出てビルドが早期エラー終了します。


```
$ v18.17.0
v18.17.0

$ pnpm dev

Your Node version is incompatible with "/Users/lapis/Projects/web".

Expected version: 20.10.x
Got: v18.17.0

This is happening because the package's manifest has an engines.node field specified.
To fix this issue, install the required Node version.
lapis@-MacBook-Air web %
```

ここからさらに、`.npmrc`に設定を追加することで環境を改善できます。

```.npmrc
engine-strict=true
use-node-version=20.10.0
```

>  pnpm will automatically install the specified version of Node.js and use it for running `pnpm run` commands or the pnpm node command.
...
This setting works only in a .npmrc file that is in the root of your workspace.
[公式npmrc](https://pnpm.io/npmrc#use-node-version)

これにより、`pnpm dev`コマンドを実行した場合に、自動でpnpmがnodeを入れて使ってくれるようになります。

*pnpmコマンド実行時に指定のnodeを使い、それ以外のケースでは規定のnodeバージョンを使うようにしてくれます。

```
// プロジェクトのディレクトリ内でnode,pnpmコマンドでバージョン確認すると、バージョンが異なる。(use-node-version設定を外すとバージョンが同じになるのを確認できる)

$ node --version
v18.17.0

$ pnpm node
Welcome to Node.js v20.18.0
Type ".help" for more information.
>
```

pnpmを使う利点の1つなので、手隙のときに対応すると仲間に喜ばれるかもしれませんね。
機能要件の作り方とポイント：わかりやすいステップで解説

**機能要件とは？
機能要件は、開発するシステムやアプリケーションが提供する具体的な機能を定義するものです。**


**例：**

ユーザーがログインできること
商品の検索機能があること
開発チームへの指示書として機能を具体化する
クライアントや関係者と認識のすり合わせを行う
開発の進捗

始めに個人開発のときに作ったアプリの機能要件の画像をだします。
[機能要件.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823687/2ba46fac-3a94-3978-ef39-0283f286bbb7.png)

**ゴールは何か？**
例：ECサイトであれば「ユーザーが商品を購入できること」

対象ユーザーは誰か？
例：一般ユーザー、管理者、運営スタッフなど

目的と対象ユーザーを明確にすることで、どのような機能が必要かが見えてきます。

# 2. 全体の機能を洗い出す
**まずは、考えうるすべての機能をリストアップしましょう。漏れがないように広く洗い出します。**
**ECサイトの例：**

ユーザー登録・ログイン機能
商品検索・フィルター機能
カート機能
注文履歴の表示
管理者の在庫管理機能
この段階では、細かい仕様は考えず、大まかな機能単位でリストアップします。

# 3. 機能の詳細を具体化する
**洗い出した機能を、より具体的な要件に分解します。**

例：ユーザー登録機能
ユーザーはメールアドレスとパスワードで登録できる。
登録後、確認メールが自動送信される。
パスワードは8文字以上で、大文字と数字を含む。
このように、入力項目や処理の条件を具体的に記述します。

# 4. ユーザーストーリーを作成する
**ユーザーストーリーとは、ユーザー視点での機能の使い方を記述したものです。開発者が、どのように機能が利用されるかを理解しやすくなります。**

ユーザーストーリー例：
「ユーザーとして、商品をカートに追加し、支払いを完了したい。そうすることで、必要な商品を自宅に届けてもらえる。」

これにより、具体的な機能設計がしやすくなります。

# 5. 機能の優先度を決める
すべての機能が重要とは限りません。**MVP（Minimum Viable Product）**として、最低限必要な機能と将来的な機能を分けましょう。

**優先度の例：**
高：ログイン機能、商品検索機能、カート機能
中：レビュー投稿機能、割引クーポン機能
低：レコメンド機能、ソーシャル連携ログイン
優先度を明確にすることで、開発の進捗管理がスムーズになります。

# 6. 画面や操作フローの設計
機能要件に沿って、画面ごとの機能や操作フローも設計します。

ログイン画面：IDとパスワード入力欄、ログインボタン、パスワード再設定リンク
商品詳細画面：商品画像、価格、カートに追加ボタン、レビュー表示
FigmaやLucidchartなどの設計ツールを使い、画面のレイアウトやユーザーフローを可視化すると、さらに効果的です。

# 7. 技術的な制約を記載する
機能を実装する際に、考慮すべき技術的な制約も含めておくと良いです。

技術的制約の例：
パスワードの暗号化にはbcryptを使用する。
データベースはMySQLを採用する。
ユーザー登録後のメール送信にはAWS SESを利用。
これにより、開発チーム内での認識違いを防ぐことができます。

# 8. 機能要件書のテンプレート例
**機能名**	ユーザー登録
**概要**	ユーザーがシステムに登録できる機能
**入力項目**	メールアドレス、パスワード
**処理フロー	**1. メールアドレスとパスワードを入力 → 2. 確認メールを送信
技術的制約	bcryptでパスワードを暗号化
優先度	高

# 9. クライアントや関係者と確認を取る
機能要件を一通り作成したら、クライアントや関係者と要件の確認を行います。認識違いがある場合は、この段階で修正することが重要です。

# 10. レビュー・改善を繰り返す
要件が一度で完璧に決まることは少ないため、開発中に新たな要件が出てくる場合もあります。変更があったときは、機能要件を随時更新していきましょう。

# まとめ
機能要件の作成は、システム開発を成功させるための重要なプロセスです。次のポイントを押さえておくと、効果的に進められます。

**目的とユーザーを明確にする**
**機能を洗い出し、優先度を決定する**
**具体的な仕様を記述する**
**関係者との確認を行い、認識をすり合わせる**
適切な機能要件を作成することで、開発プロジェクトがスムーズに進み、完成後の品質も向上します。これを繰り返し実践し、より良い要件定義を目指しましょう！
**毎日更新していますので、@y-t0910をフォロー,いいねしていただけると嬉しいです。**
Dockerコンテナ内でCSSが反映されない

 # 前提
 - PHP 8.2.10
 - Laravel8
 - Docker環境下で動作
     - 環境構築については[こちらの記事](https://qiita.com/s-y0001/items/e95991d1cd658defa30e)を参考


# 事象
Dockerコンテナ外では CSS がブラウザに反映されている
```bash
$ php artisan serve

$ npm run dev
```
![スクリーンショット 2024-09-22 22.47.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123079/e10c7691-70eb-643c-9af8-3c5dbe1eb49b.png)


ただ Docker コンテナ内になると CSS がブラウザに反映されなくなる
```bash
$ docker-compose up -d
[+] Running 4/4
 ✔ Container laravelapp-mysql-1  Started
 ✔ Container laravelapp-node-1   Started
 ✔ Container laravelapp-php-1    Started
 ✔ Container laravelapp-nginx-1  Started


 $ docker-compose exec node npm run dev
```
![スクリーンショット 2024-09-22 22.51.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123079/e610fba4-2129-ba41-d1a6-3766c7fd69e7.png)

# 原因
Nginx に MIMEタイプを設定していなかったため
コンパイルによって CSS ファイルは作成されていたが、正しく CSS を読み込めていなかった

# 解消法
`nginx.conf` の http に `include /etc/nginx/mime.types;` を追記

```
...
http {
    include /etc/nginx/mime.types;

    server {
        listen 8000;
...
```

`nginx.conf` を編集したのでnginxを再起動
```bash
$ docker-compose restart nginx
```

# 参考
- https://keko5342.hatenadiary.jp/entry/2021/12/03/001536
ユーザー名の表示"#{@item.user.nickname}" 【備忘録】

下記の#や｛｝を使う意味が全く分からなかったので調べてみました。

```app/views/items/show.html.erb 
"#{@item.user.nickname}" 
```
### この記述でitemsテーブルのnicknameカラムの値を表示させている。
"#{@item.user.nickname}"の記述は、商品を出品したユーザーのニックネーム（nickname）を表示するためのもの。

文字列の中でインスタンス変数の値を埋め込む方法を使っている。
#{}の中にコードを入れると、その中のコードが評価され、文字列として展開される。

１．@item は、items_controller.rb の show アクションで取得した特定の Item レコード。
２．@item.user は、Item と関連付けられた User レコードを参照している。
　（belongs_to :user のアソシエーションがある場合）。
３．@item.user.nickname は、User モデルの nickname カラムの値、つまりユーザーのニックネーム。
４，"#{}" は、文字列内で値を埋め込む構文。#{@item.user.nickname} のように書くことで、ニックネームの文字列が展開されて表示される。
30日でできる！OS自作入門を始めました#2

# 概要
本記事では「30日でできる！OS自作入門」を進めていくうちに気になった箇所、試していて躓いた箇所等をまとめる記事になります。
ちなみにわからないところはがんがんChat-GPT様に質問する気なので、間違っている点があればマサカリを投げていただけますととても喜びます。
書籍の詳細は省略いたしますので、気になられた方はぜひ書籍を購入してご自身でトライしてみてください！

https://book.mynavi.jp/ec/products/detail/id=22078

今回は、Chapter1の前座としてバイナリについてです。
少しだけ今後利用するバイナリエディタについても触れています。

# 学び
## バイナリについて
バイナリについての知識をひとまずつけようかなと思います。
なんとなくここまで書籍を読む限り(+遠い過去の薄い記憶的にも)`バイナリって何者だ`ってところはある程度知っておいたほうが良いんじゃないかなと感じています。
ちなみにですが、数ページ読み進めた限りでは「バイナリって某(なにがし)がいるんだなあ」という感覚で進めてもよさそうではありました。

### そもそもバイナリってなんだ
個人的には「データを0,1(2進数)で表している状態のことをバイナリと呼ぶ」という程度の認識でした。
では、IT用語辞典で引いた概要を理解してみましょう。
>バイナリ（binary）とは、2値（の）、2進数（の）、2元（の）、などの意味を持つ英単語。IT関連ではテキスト（文字）以外のデータ形式全般を総称してバイナリと呼ぶことが多い。
>バイナリ（バイナリデータ / バイナリ形式）とは - IT用語辞典 e-Words https://e-words.jp/w/%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA.html

この概要だけを読んでみると、どうやら2値というところよりも「文字以外のデータ形式全般」という箇所が強調されているようです。ちなみに文字以外のデータ形式とは画像ファイルだったり実行ファイルだったりがこれにあたるそうです。
再度同ページを引用します。以下の理解でバイナリというものが何者なのかがすっきりと説明できるなと感じました。

>コンピュータはすべての情報を2進数の「0」と「1」が並んだビット列として表現する。このうち、何らかの文字コード規格に基づいて文字を表すデータを「テキストデータ」（テキスト形式）、そうでないものを「バイナリデータ」（バイナリ形式）と分類する。

また、引用以降の解説に目を通すだけでも理解は現時点であれば十分なのではないかといったレベルまで進みます。
気になる方は是非ご一読ください。

:::note warn
※この説明だと文字はバイナリとは違うやつという認識になってしまいそうですが、根本的にはすべてのデータが2進数で表されているためすごく大きなくくりで言えば文字データだってバイナリです。「バイナリの中でざっくり文字データとバイナリデータは区別されることが多いんだな」という認識がよさそうです。
:::
#### じゃあテキストデータとバイナリって何が違うんだ
色々と調べてみたところ「テキストエディタで開けるのかが違いだ」や「文章として認識できるのかが違いだ」といったいろいろな説明がありますが、個人的には「**テキストとしてファイルに保管されているのかが違いだ**」という説明が一番しっくりときました。(特に文章として認識できるのかという説明だと「pdfとかはどうやねん」といった難しい話になりそうだったのでこちらの認識に。)

### 機械言語と何が違うんだ
バイナリがなにがしかというこれまでの調査をすると、機械語との違いについては別に難しくはないですね。
ただただバイナリの一種として機械語があるんだ。という認識でいいんじゃないかという気持ちになってきました。
(**「推論だけで話してはならない」** と社会人になって何度も学んできたので、Web記事をいろいろと読んでみるという方法にはなってしまいますが、裏は取ろうと思います。)
まず、機械語が何なんだというところからです。いろいろなサイトをめぐったうえでの理解として「コンピュータ(プロセッサ)が直接理解できるような命令群を備えたものが機械語である」という認識がよさそうだな。という結論に至りました。

#### 機械語とアセンブリ言語について
ここまでの理解が完了して、「コンピュータに命令できるのが機械語っていうけど、アセンブリ言語も直接命令できるんじゃないっけ」という疑問が生じました。
ここでこの記事のこれまでの学びが生きてきます。
1. まずバイナリな機械語とテキストなアセンブリは別物だと理解できる
2. それにコンピュータが理解するならバイナリファイルであるほうが自然であるように感じる
3. 「アセンブリ言語は低級言語といって命令は書けるけどバイナリに変換しているんだ」という文章がすっと入ってくる

今までの知識が生きてくるのはやっぱり楽しいですね。

## バイナリエディタについて
今回は以前職場の方に教えていただいた、VSCodeでファイルをバイナリ状態で編集できる拡張機能「Hex Editor」を使って作業することにしました。

### 選んだ理由
選んだ理由は以下です。
- 別のツールを入れる手間を惜しんだ
- 普段使いなれているテキストエディタのほうが操作面で優位性があるだろうと考えた

まず、別のツールを入れる手間についてです。そこまで#1でも触れましたが、以前この書籍を軽く触った経験がありますが、その際に「使いやすい！！」や「便利だな」と思ったような記憶がなかったです。（シンプルにわたくしの当時の技術力が足りてなかっただけなような気もしますが）
ですので、普段から使い慣れているVSCode側で済ませることで、画面への慣れにかかる負荷やツール間を移動する手間を少しでもなくそうと思い、この結論に至りました。
もちろんこれまで学んだ内容から、Hex Editorだけでは何か不十分な箇所が出てくる可能性も考えられます(昨日の一環として作業できるだけなので)。その際はこの記事を編集して、読んでくださった方々が同じ轍を踏まないようにできればと考えています。

# 苦戦したところ
実際に書籍の作業を行えていないので、今回もこの項目は特になしです。

# まとめ
今回はChaptor1以降でのつっかえをなくせるように「バイナリについて」に焦点を当てて調査した結果をまとめました。
結果的には「結局のところバイナリというのは広義なもので、テキストとしてデータが保存されないもの全般がバイナリファイルなんだ」という理解を得られました。
調べたことでバイナリについてだけではなく、機械語との関係等の周辺知識を手に入れることができて非常にすっきりしています。
明日以降は実作業に手を出せるのではないかと思います。すでに少しワクワクしています。
この記事が少しでもいいなと感じていただけたら、ぜひいいね等よろしくお願いいたします。

# ピックアップ単語
※書籍の中で「聞かれてもしっかり説明できないな」という単語を個人的にまとめたものです。性格的に「とりあえずわからないでいいから進めるか」というタイプなので、気が向いたタイミングでいずれ個別で記事にするかもしれません。この記事ではメモ+何がわからないといった備忘録程度のことのみ書きます。
- 今回は省略します
Windows11でWSL2を用いて開発する際に、VSCodeでGit差分を確認したい場合の手順

# はじめに

お疲れ様です、りつです。

VSCodeでGitの差分が確認できない事象を解消したので、備忘録も兼ねて記事に残しておこうと思います。

# 問題

WSL2を用いてWindowsにUbuntu環境を用意し、ViteでReactとJavaScriptのプロジェクトを作成しました。

WSLターミナルのプロジェクト配下で`code .`を実行すると、Windows上のVSCodeでプロジェクトを開けるのですが、ソースコードのGitの差分を確認することができませんでした。

やりたいこととしては、以下の画像のようにVSCode上でGit差分を確認できるようになることです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911933/42806fe0-3340-f58b-991e-69ca9e8662ed.png)

なお、差分を確認するだけであればWSLターミナル上で`git diff`コマンドを使う方法もあるのですが、少し視認性が悪い（と個人的に感じてしまう）ため、できればVSCode上で差分確認ができればと思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911933/2ba9f11c-ea6a-87ac-8b0a-152fa43aec39.png)

## 環境

- ホストOS：Windows 11
- WSL バージョン: 2.3.24.0

# 解決方法

1. プラグイン「**Remote Development**」をVSCodeにインストールします
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack
2. VSCodeを閉じます
3. 再度WSLターミナルのプロジェクト配下で`code .`を実行し、VSCodeでプロジェクトを開きます
4. 以下の画像のように、VSCodeの左メニューの「ソース管理」からGitの差分確認ができるようになればOKです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911933/42806fe0-3340-f58b-991e-69ca9e8662ed.png)

## 補足

「**Remote Development**」をVSCodeにインストールすることで、VSCodeでWSLのターミナルを起動することも可能です。

これにより、GitコマンドをVSCode上で実行することもできるようになるため便利ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911933/ab7ebe1c-26c6-a630-7516-a94204ce1d44.png)

なお、ターミナルはVSCodeのメニューの「ターミナル」 > 「新しいターミナル」から開くことが可能です。

# おわりに

原因としては単純なことでしたが、解決できてよかったです。
VSCode上でUbuntu環境のソースコードやWSLのターミナルを操作できるのはやはり便利です。

なお、「**Remote Development**」のプラグインが必要な件は、公式サイトにもちゃんと記載がありました。

> Remote Development 拡張機能パックをインストールします。 この拡張機能パックには、Remote - SSH 拡張機能と Dev - Containers 拡張機能に加え、WSL 拡張機能が含まれています。これにより、コンテナー内、リモート マシン上、または WSL 内の任意のフォルダーを開くことができます。

お困りの方は「参考」に記載したページもご確認ください。

# 参考

https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode
【AWS】APIコールで疎通できていてもECSタスクが自動起動されない理由

# 概要
EC2 on ECSで構築したアプリについて、APIコール（エンドポイントへのコール）はできていたのに、デプロイ時や再起動時のECSタスク起動では失敗する、というケースがありました。

こちらの原因と解決方法を紹介します。

# 前提
・EC2 on ECSを利用。EC2はプライベートサブネットに配置
・サブネットは`ap-northeast-1a`、`ap-northeast-1c`の二つのAZに配置
・AutoscalingGroupでは、上記どちらのサブネットも選択している状態
・`ap-northeast-1a`ではNAT Gatewayを介してインターネット接続ができる状態

# 原因
前提を見ると原因は察しがつきやすいと思いますが、今回の原因は、

・EC2インスタンスが`ap-northeast-1c`で起動してしまうことがあったため

でした。

最初これに気づかず、`ap-northeast-1a`で起動したECSタスクでは疎通確認ができていたので、問題なしと勘違いしてしまいました。

ただし、デプロイ作業などでECSタスクを一度落とした際に、`ap-northeast-1c`にEC2が起動してしまうと、`ap-northeast-1c`ではインターネット接続がされていないので、ECSエージェントが通信できない状態となっていたのです。これにより、ECSタスクが自動起動されなくなっていました。

「ECSタスクの自動起動にはECSエージェントがAWS ECSサービスと通信するためのインターネットアクセスが必要」という点が大事です。当然といえば当然なのですが、アプリがLB側から疎通していたので勘違いが起きていました。

# 解決方法
プライベートサブネットの`ap-northeast-1c`のEC2インスタンスにもNATゲートウェイを介してインターネットに接続できる状態にしてあげればOKです。
（もしくは、AutoscalingGroupの対象をインターネット接続ができる`ap-northeast-1a`のみにすること）

これにより、ECSタスクの自動起動が可能になりました。