OmniAICreator/Qiita-1.07M huggingface dataset:
【ECS入門】ECSの専門用語をAWS初心者にもわかりやすく表現してみた

# 記事を書いたきっかけ
最近人に教える機会が増えてきたのでその時にぱっと渡せるように記事にすることとしました。

# 対象読者
- AWSを触ったことがある(VPC、EC2と聞いてピンとくる)
- コンテナ技術に触れたことがある
- WebアプリをデプロイするならECSを使うと良いよと聞いたが、何からすれば良いかわからない

こんな感じの方を対象としています。
一方で私自信も経験2年のジュニアエンジニアですので、ちょっと先輩の人がふわっと教えてくれるんだな〜てスタンスで読んでいただけると助かります。

# この記事より前に読んで欲しい記事
タイトル詐欺で申し訳ありませんが、以下の記事をこの記事より前に読むことをおすすめします。
大変感銘を受けました。ECSの専門用語を全く使わずに概念を解説してくれる素晴らしい記事です。

https://note.com/koguma_gunso/n/n31c3eca3ff23

**今回の記事は上記の記事の続き**だと思って読んでいただけると理解が進みやすいと思います。


# ECSを実世界に表現してみた

Amazon Elastic Container Serviceは、AWSが提供するフルマネージドのコンテナオーケストレーションサービスです。

と言われても全然ピンとこないと思うので簡単に図にまとめてみました。わかりやすさを重視しているので完全性に欠ける部分があることはご了承ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/ee43a98a-720d-49ec-a14a-3168b38eab3e.png)




こんな感じだとイメージしやすいのかなと思っています。
オレンジの部分が実際にECSにて使用されている専門用語で、それぞれの用語に近い概念を下に書いています。

<br>

あくまでもイメージですので、**正確な内容についてはブラックベルトやら公式読んでください**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/53c0a9f1-63c1-42e8-8517-e646f47f5fbc.png)

上記の図が出てくるECSのブラックベルト

https://www.youtube.com/watch?v=stpz_SNiWmA&t=646s

# それぞれの専門用語のイメージを捉える

##  タスク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/d301a1d8-2d45-48e6-9170-473542fe1898.png)

コンテナです。
正確には、**タスク定義に基づいて起動されるコンテナ群** です

ここにWebアプリケーションを置いて動かしていきましょう

この説明を読んでピンときてない方はまず、**コンテナ周りの概要を掴んでおかないとECSを扱うことは難しい**と思いますので、以下の記事を読んでみることをお勧めします

https://qiita.com/yuya_sega/items/0fb78b064a6d64fe0979

## タスク定義

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/5d942666-3dbd-4dd8-bfef-74bb5acc15bd.png)

docker composeと仕事の内容が似ています。
コンテナをどう動かすか？(= タスクをどう起動するか)の定義です。
ECS触っている時に一番触ることになる部分です。


## ECR

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/521eb89a-1b85-4123-8114-0a08d8eed590.png)

Docker Hubのリポジトリみたいなものです。コンテナイメージの保管庫。
AWS内でDocker imageを管理できます。タスク定義で「どのリポジトリのどのイメージを使うよ〜」って時に指定される感じです。



## Container Instance

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/b08be9cb-089c-4391-9969-b37fc9f267da.png)

コンテナを起動するパソコンです。
ECSを学習していると**Fargate**という単語も出てくると思いますが、Fargateもこの部分の概念です。(正確にいうとContainer InstanceはEC2モードでの表現ではありますが、、、)

- EC2を指定すると、OSなどの細かい部分も自分で決めることができるけど自分で管理しないといけない
- Fargateを指定すると、メモリとCPU決めるだけで他は全部AWSがいい感じにしてくれる、物理サーバを意識せずに使える実行環境を提供してくれる

という認識を持っておくと、今後様々なドキュメントが読みやすくなると思います


## サービス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/8202870c-40a3-45b5-8d9b-e2053fe10d43.png)

コンテナの実行を管理する社員です。
正確にはタスク定義に基づいて「いつ」「いくつ」動かすか、負荷分散（ALB）やスケーリング設定を管理する概念です。

## クラスター

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/76cbc0c4-ef74-4dc2-ac6f-64185e6e138d.png)

会社と表現していますが、ローカルネットワークと表現しても良いのかな...?って感じです。
社員が他の会社のPCを扱う権限がなかったり、そもそも触ることを考えないように、ECSのクラスターはVPCのようなネットワークそのものではなく、ECSサービスとタスクをまとめる単位です。
最初のうちはあまり触ることはないのかな〜と思ってます。

# まとめ
以上のイメージを持っておくと、他の入門向けの記事や公式などが読みやすくなるのではないのかなと思います。
誤解を招く表現などがございましたら、ご教授いただけますと幸いです。

また、ここまで読んでいいただくと以下の記事が結構参考になるのかなと思うのでぜひ読んでみてください

https://envader.plus/article/180
React Routerでパラメータ名が一致しない時のハマりポイントと解決法

````markdown
# React Routerでパラメータ名が一致しない時のハマりポイントと解決法

## はじめに

React + React Router v6で動的ルーティング（例: 商品詳細ページ）を実装する際、  
URLパラメータ名（`productId` か `product_id` か）がルーティング設定や`useParams`で一致していないと、  
値が取得できない・バグが発生することがあります。

---

## よくある例

### 1. ルート定義とパラメータ名の不一致

```tsx
// App.tsx または routes.ts
<Route path="/products/:productId" element={<ProductDetailsPage />} />
````

この場合、パラメータ名は`productId`。

### 2. useParams側

```tsx
const { product_id } = useParams<{ product_id: string }>()
// これだと undefined になる！
```

**エラー例:**
ルートは`productId`なのに、useParamsは`product_id`で取り出そうとしているため、値がundefinedになる。

---

## 解決方法

* ルートのパラメータ名とuseParamsで取得する変数名を一致させること！

### 正しい例

```tsx
// ルート定義
<Route path="/products/:productId" element={<ProductDetailsPage />} />

// 取得側
const { productId } = useParams<{ productId: string }>()
```

---

## データの命名規則に注意

バックエンドやDBは`product_id`（スネークケース）で設計されていることが多いですが、
ReactやTypeScriptではキャメルケース（`productId`）を使うことが一般的です。
**フロント側のルーティングやstate管理はキャメルケースに統一するのがおすすめ。**

---

## まとめ

* React RouterのURLパラメータ名とuseParamsの変数名は**完全一致**で取得する
* APIレスポンスやDB項目の命名規則と、ルート・useParamsの命名は分けて考える
* どちらか分からなくなったら、`console.log(useParams())`で中身を確認！

---

少しでも同じハマりを減らすための参考になれば幸いです！

```
```
Node-REDの構築

# はじめに
この記事ではNode-REDの構築パートについて説明します。
うまくまとまった記事が見つからなかったためまとめます。
OSはVirtualBox上のUbuntu 20.04.05に構築しています。事前にUbuntuはインストール済みであることを前提にしています。
今回はnode-RED上で、node-red-contrib-modbusを使用したかったので、ノードの追加も行っています。

なお、VirtualBoxのネットワーク設定はインストール中、NATに設定し外部接続できる必要があります。セットアップ完了後はHost-only Adapterへ戻すことができます。

## aptのアップデート
```
sudo apt update
sudo apt upgrade -y
```
## Node.jsのインストール
```
sudo apt-get install -y ca-certificates curl gnupg
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
```
今回はnode.jsのバージョン20をインストールします。
```
sudo curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
```
nodejsをインストールします。
```
sudo apt install nodejs -y
```
インストールができたかの確認は以下のコマンドで実施できます。
```
nodejs -v
npm -v
```
もし、npmがバージョン11.4.1未満だとnode-redのインストールに失敗するので、その場合はnpmを11.4.1にアップグレードしてください。
```
sudo npm install -g npm@11.4.1
```
## Node-REDのインストール
以下のコマンドでインストールします。
```
sudo npm install -g -unsafe-perm node-red node-red-admin
```
接続ポートのアクセスを許可します。
```
sudo ufw allow 1880
```
## 実行・アクセス
Node-REDを起動します。
```
node-red &
```
Webブラウザを立ち上げ、http://(自身のIPアドレス):1880にアクセスします。
なお、同一端末上からはhttp://localhost:1880 でも接続可能。IPがわからない場合は、以下のコマンドで確認すしてください。
```
ip a
```
## ノードの追加（任意）
起動したらノードを追加します。右上のデプロイの横のメニューボタンから、［パレットの管理］を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493988/33a4f10c-bc70-4eb9-8b86-7c053d0a5ada.png)
［ノードの追加］タブを選択し、必要なノードを検索欄で検索しノードを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493988/2e339304-274f-4d2b-af40-4d135546d067.png)
以上でインストールは完了です。
[Linux] アクセシビリティ_キーアクセシビリティ

# キーアクセシビリティ
| 機能名       | 説明                                                 | 対象者（主に）                   |
| --------- | -------------------------------------------------- | ------------------------- |
| スティッキーキー  | 修飾キー（Shift、Ctrl、Altなど）の後に入力したキーを同時押しとみなす           | 片手操作が難しい人<br>筋力が弱い人       |
| トグルキー     | Caps Lock、Num Lock、Scroll Lock の状態変更時にビープ音で通知する | 視覚障害のある人<br>注意力に課題のある人    |
| バウンスキー    | 所定の時間、同じキー入力を無視する        | 不随意運動や誤打の多い人              |
| スローキー     | 所定の時間、キーを押し続けないと入力を無視する       | 細かな指の動きが困難な人<br>誤操作をしやすい人 |
| リピートキー無効化 | 所定の時間、キーがを押し続けてもリピートしない                  | 不随意運動や意図しない連打をしてしまう人      |
| マウスキー     | テンキーを使って**マウスカーソルを操作**できる                 | マウス操作が困難な人                |

# Ping-t
- [4880_スローキー](https://mondai.ping-t.com/question_subjects/32/question_sessions/33693535/progressing_questions/515931294?result=true)
- [4881_バウンスキー](https://mondai.ping-t.com/question_subjects/32/question_sessions/33693535/progressing_questions/515931293?result=true)
- [4883_リピートキー](https://mondai.ping-t.com/question_subjects/32/question_sessions/33557476/progressing_questions/513921546?result=true)
Typescript＋React＋Viteで作るToDoアプリ


## 1.はじめに
この記事では自作で開発したToDoアプリについてまとめています。開発にあたっての要件をご紹介します。

学習目的：ReactとTypeScriptの基本的な使い方を実装ベースで学ぶ
技術構成：フロントエンドのみで完結

githubのリポジトリはこちらになります。

https://github.com/SirA0912/todo-list-app

## 2.開発環境
- OS：Windows11
- 使用言語：Typescript
- フレームワーク：React
- エディタ：VScode
- UIライブラリ：Chakra UI
- ブラウザ：Google Chrome（動作確認）


## 3.システムアーキテクチャー
このアプリはシンプルで使いやすいタスク管理ツールを目指して作成しました。以下のような基本的な機能を備えています。

- タスクの追加
入力欄にテキストを入力し、ボタンを押すことでタスクを追加することができます。
- タスクの削除
タスクの右側にある削除ボタンを押すと、そのタスクをリストから削除することができます。
- タスクの完了/未完了状態切替
タスクのテキストをクリックすると、完了状態を切り替えることができます。

![スクリーンショット 2025-05-30 010013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107925/4fcaac82-5a36-4799-a66a-377947dd6aa3.png)
完成イメージ
     

## 4.実装にあたり難しかった点
- 空のタスクが追加されてしまう
trimで空文字を削除できるようにしました。
- 複数タスクの状態切替
map() でIDを比較して状態を更新できるようにしました。

## 動作テスト
初期状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107925/7fd0b363-23e6-4567-8300-15f63bd073a2.png)
テキストを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107925/94cffa14-e91e-491a-98f2-4fc7cee2bebf.png)
入力されたテキストをToDoとして追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107925/03c98d14-d921-40b0-9d94-df58bfc8217b.png)

ToDO完了後にクリックすると、斜線が引かれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107925/8575696b-cd6b-4edd-ae26-6b7ce1452ac6.png)


## 5.まとめ
ReactとTypeScriptを用いた開発の基礎を学びながら、シンプルなToDoアプリを実装することができました。

## 6.今後の目標と課題
以下のような機能を追加したいと考えています。
- カテゴリーやタグ分け
タスクを「仕事」「買い物」などで分類

- 期限・優先度の設定
締め切り順に並べ替えができるように
ABC409をPythonで（A～E）

AtCoder Beginner Contest 409の解答等の速報的まとめ

https://atcoder.jp/contests/abc409



# A問題
https://atcoder.jp/contests/abc409/tasks/abc409_a

問題文のままシミュレーションする
```python:A
n = int(input())
t = input()
a = input()

print("Yes" if any(t_i == a_i == "o" for t_i, a_i in zip(t, a)) else "No")
```


# B問題
https://atcoder.jp/contests/abc409/tasks/abc409_b

配列の個数が最大 100 なので答えの最大値も 100
よって問題文の条件を満たす数を 0~100 まで全探索する
```python:B
n = int(input())
a = list(map(int, input().split()))
ans = 0
for i in range(101):
    count = sum(a_i >= i for a_i in a)
    if count >= i:
        ans = max(ans, i)

print(ans)
```


# C問題
https://atcoder.jp/contests/abc409/tasks/abc409_c

そもそもLが3の倍数でなければ正三角形はできない。
点がどこに何個あるか求めた後、正三角形になる組み合わせを個数の積で求める
```python:C
from collections import defaultdict

n, l = map(int, input().split())
D = list(map(int, input().split()))

d = defaultdict(int)
d[0] = 1
now = 0
for d_i in D:
    now += d_i
    now %= l
    if now not in d:
        d[now]= 0
    d[now] += 1

if l % 3 != 0:
    exit(print(0))
ans = 0
for i in range(l // 3):
    j = i + l // 3
    k = j + l // 3
    ans+= d[i] * d[j] * d[k]

print(ans)
```


# D問題
https://atcoder.jp/contests/abc409/tasks/abc409_d

$l$になる個所は最初に順番が逆になる個所（xa のような所）
$r$になる個所は$l$の対象の文字の後の文字が来る場所（$s_l=x$ かつ $s_r = z$）
```python:D
for _ in range(int(input())):
    n = int(input())
    s = input()

    if n == 1:
        print(s)
    else:
        l = n - 1
        for i in range(n - 1):
            if ord(s[i]) > ord(s[i + 1]):
                l = i
                break
        r = n
        for i in range(l + 1, n):
            if ord(s[l]) < ord(s[i]):
                r = i
                break

        print(s[:l] + s[l + 1:r] + s[l] + s[r:])
```


# E問題
https://atcoder.jp/contests/abc409/tasks/abc409_e

各辺において一方から他方へ移動する電子（陽電子）の個数は、辺の一方にある電子と陽電子の個数差と一致する
すなわち葉から順番に電子・陽電子を移動させながら必要なエネルギーを求めていけばよい
```python:E
from collections import deque

n = int(input())
x = list(map(int, input().split()))
edge = [list() for _ in range(n)]
for _ in range(n - 1):
    u, v, w = map(int, input().split())
    u -= 1
    v -= 1
    edge[u].append([v, w])
    edge[v].append([u, w])

q = deque()
q.append([0, -1])
count = [-1] * n
parent = [[0, 0] for _ in range(n)]
while q:
    now, old = q.popleft()
    for to, w_i in edge[now]:
        count[now] += 1
        if old == to:continue
        else:
            parent[to] = [now, w_i]
            q.append([to, now])

ans = 0
node = deque()
for i in range(n):
    if count[i] == 0:
        node.append(i)
while node:
    now = node.popleft()
    p, w_i = parent[now]
    # print(now, p, w_i, x[now], x[p])
    ans += abs(x[now]) * w_i
    x[p] += x[now]
    x[now] = 0
    count[p] -= 1
    if count[p] == 0:
        node.append(p)

print(ans)
```
flaskのquickstartのminimal applicationをdockerで動作させてみる

# はじめに

Dockerfileの書き方の勉強を兼ねて、flaskのquickstartのminimal applicationをdockerd動作させてみます。
https://flask.palletsprojects.com/en/stable/quickstart/

# 環境情報

|Component|Version|
|---|---|
| PC | M1 MacBook Pro |
| OS | macOS 15.5 |
| Docker Desktop | 4.42.0 |

# quickstartのminimal application

flaskのquickstartのminimal applicationです。
/にアクセスするとHello, World!と表示するだけです。

```python:app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"
```

# Dockerfileを作成

続いて、Dockerfileを作成します。
baseimageはubuntu:24.04にしました。
pipでflaskをインストールするのではなく、ubuntu:24.04で提供されているflaskのパッケージをインストールします。
flask runコマンドでアプリケーションを起動するときに、簡単に確認するため全てのIPからのアクセスを許可するように設定しました。

```Dockerfile:Dockerfile
FROM ubuntu:24.04

RUN apt update
RUN apt install -y python3-flask

WORKDIR /app
COPY ./app.py /app/

CMD ["flask", "run", "--host=0.0.0.0"]
```

# 実行と確認

app.pyとDockerfileがあるディレクトリで以下のコマンドを実行します。
```zsh
docker buildx build -t flask-app .
docker run --name flask-app -it -p 5000:5000 flask-app
```

以下のURLにアクセスして、Hello, World!と表示されたら成功です。
http://localhost:5000/

# 最後に

flaskのquickstartに記載されているminimal applicationをDockerで動作させてみました。

# 参考情報

* https://flask.palletsprojects.com/en/stable/quickstart/
学習１日目

<!DDOCTYPE html>
<html>
    <body>
        <meta cheset="UTF-8">
        <h1>学習１日目</h1>
    </head>
    <body>
        <h3>今日の成果</h3>
            <p>今日はHTML&CSSの教材を買ってきて少しだけ学習した。<br>
            例題の文章にｈ1やｈ2などを使って見出しを作ったり、<br>
            ｐを使って本文の段落を変えたり、ｂｒを使って行替えをした。<br>
            ｔａｂｌｅの表現の仕方はこれから見たいで、ただの羅列だけになっているけど、<br>
            これからの学習が楽しみだ。</p>
        <h4>ではまた明日！</h4>
    </body>
</html>
ExcelVBAで使用できるダイアログ

# はじめに
最近、Excelのアドイン作りに勤しんでいます。
Application.InputBoxでキャンセルした際に少し困ったので纏めようと思います。

Application.InputBoxだけだと詰まらないので、VB標準のダイアログについても記載します。

# VBAのダイアログ4種

## メッセージボックス（MsgBox）
シンプルにダイアログを表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/1bef7c05-2bf1-4420-86f8-917c8ab8d994.png)

```vb
Dim Result As Long
Result = MsgBox("元気ですか？", vbYesNo + vbInformation, "タイトル！")
```
右上の「×」で閉じた場合は「キャンセル」が返却されます。
※キャンセルボタンを表示させていない場合は、「×」を押せません。

ボタンや戻り値の種類は以下を参照してください。

https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/msgbox-function


## インプットボックス（Application.InputBox）
入力ダイアログを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/074171ad-c5e2-489f-8cbf-610333dd9562.png)

```vb
Dim SelectRange As Range
Set SelectRange = Application.InputBox("範囲を選択してください。", "たいとる", "", , , , , 8)
```

戻り値は以下になりますが、キャンセルを押すと「FALSE」が返されます。
<table>
  <thead>
    <tr><th>TYPE</th><th>型</th></tr>
  </thead>
  <tr><td>0</td><td>数式</td></tr>
  <tr><td>1</td><td>数値</td></tr>
  <tr><td>2</td><td>文字列</td></tr>
  <tr><td>4</td><td>論理値</td></tr>
  <tr><td>8</td><td>セル参照</td></tr>
  <tr><td>16</td><td>エラー値</td></tr>
  <tr><td>64</td><td>配列</td></tr>
</table>

つまり上記のダイアログで「キャンセル」ボタンを押すとエラーになります。
そこで、以下のようにします。
```vb
Dim SelectRange As Range
On Error Resume Next
Set SelectRange = Application.InputBox("範囲を選択してください。", "たいとる", "", , , , , 8)
On Error GoTo 0

If SelectRange Is Nothing Then
    'キャンセル または 範囲未選択の場合の処理
Else
    '範囲選択の場合の処理
End If
```
これで「Set SelectRange」でRange型以外の値を設定しようとしたとき、エラーが発生しますが次の処理に移ります。

https://learn.microsoft.com/ja-jp/office/vba/api/excel.application.inputbox


## インプットボックス（InputBox）
文字列入力ダイアログを表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/b97a500d-9be8-4fb5-b140-1de3427cad1c.png)

```vb
Dim SelectRange As String
SelectRange = InputBox("名前を入力してください。", "たいとる")

If SelectRange = "" Then
    'キャンセル または 未入力の場合の処理
Else
    '入力された場合の処理
End If
```

https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/inputbox-function

## ファイル選択ダイアログ（GetOpenFilename）
ファイルを選択するダイアログを表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/fbe9ef48-7346-4cd2-88b1-41c4516ed0f3.png)

```vb
Dim FilePath As String
FilePath = Application.GetOpenFilename("Excelブック,*.xlsx,CSVファイル,*.csv", 2, "タイトル")
```

https://learn.microsoft.com/ja-jp/office/vba/api/excel.application.getopenfilename
[Linux] X_/etc/X11/xorg.conf

# `/etc/X11/xorg.conf`の主なセクション
| セクション名         | 説明                                                                   |
| :------------- | :------------------------------------------------------------------- |
| `ServerLayout` | 入出力デバイスに関する定義<br>- 使用するスクリーン、キーボード、マウスの関連付け              |
| `Files`        | RGBカラーデータベースの場所やフォントの格納場所に関する定義                                |
| `Module`       | Xサーバが組み込むXモジュール（例: `glx`, `dri` など）を定義                                  |
| `InputDevice`  | 入力デバイスに関する設定 |
| `Monitor`      | モニタータイプを定義                                   |
| `Device`       | ビデオカードに関する設定<br>- ドライバ名やオプションを記述                             |
| `Screen`       | 画面構成（`Monitor` と `Device` の組み合わせ）を定義<br>- 解像度や色深度の設定も含む              |


# Ping-t
- [4827_ServerLayout](https://mondai.ping-t.com/question_subjects/32/question_sessions/33693535/progressing_questions/515931290?result=true)
- [4828_Files](https://mondai.ping-t.com/question_subjects/32/question_sessions/33603258/progressing_questions/514610075)
- [4829_Module](https://mondai.ping-t.com/question_subjects/32/question_sessions/33557476/progressing_questions/513921539?result=true)
- [4830_InputDevice](https://mondai.ping-t.com/question_subjects/32/question_sessions/33693535/progressing_questions/515931289?result=true)
- [4831_Monitor](https://mondai.ping-t.com/question_subjects/32/question_sessions/33693535/progressing_questions/515931288?result=true)
- [4832_Device](https://mondai.ping-t.com/question_subjects/32/question_sessions/33693535/progressing_questions/515931287?result=true)
- [4833_Screen](https://mondai.ping-t.com/question_subjects/32/question_sessions/33693535/progressing_questions/515931286?result=true)
- [5042_/etc/X11/xorg.conf](https://mondai.ping-t.com/question_subjects/32/question_sessions/33557476/progressing_questions/513921549?result=true)
【学習】git add .した後に親ブランチにいることに気づいて背筋凍った

## はじめに
よくあるブランチ切り忘れの記事は、単純に「Git ブランチ切り忘れ」というタイトルだけですが、わかりやすいように **「git add .した後にきりわすれた」** を加えてみました。


## 簡単に経緯
```bash
# 運用状、「test」を親ブランチにしています
% git branch
  main
* test

# 他の人もリモートにプッシュを行っているので、 リモートの情報を取得し、リモートのtestをローカルにマージ
% git fetch origin
% git merge origin/test
```
⚠️ここまでで、何を勘違いしたのか？このままファイルの変更修正を行ってしまいました。
```bash
# よーし、実装したいものは一通りできたから、add, commit, pushするか！
% git add .

# あっ、今更だけどブランチも確認しよう
% git branch
  main
* test

# オワタ
```

## 実際に行った解決までの手順
```bash
# 今のtestブランチの状態（ステージした変更も含む）を持ったまま、新ブランチを作成しそこに移動
# ステージした変更（git add .したもの）はそのまま引き継がれます！
% git checkout -b feature/test1
% git commit -m "新しい機能の追加"
% git push origin feature/test1
```

## `git add`の仕組みがいまいちわからない
❓なぜ`add`したものもブランチを切り替えるときに「ついてくる」のか？

調べてみると以下のようなことがわかってきました！
- `git add .`は「どのブランチにいるか」に関係あるが、`add`された変更は**ブランチをまたいで持っていける**
- `git add`自体は**今いるブランチに対して行う操作**だが、`git add`した内容（＝ステージ）は、**まだどのブランチにも保存されていない**
- `git add`された「ステージの中身」は、**Git全体の一時的な「共通スペース」に入っている**
- 最終的に`git commit`したブランチにその変更が「属する」ことになる


## 参考
- addとcommitの仕組みが猫のイラストでわかりやすい

https://kray.jp/blog/expound-git-add/

- もっと丁寧に処理を行っている

https://dev.classmethod.jp/articles/git-move-change-to-another-branch/

- こちらも`stash`している

https://qiita.com/nakaji0210/items/dc21de47c617b0d0eebf


## おわりに
`stash`したほうがいいのでしょうか？
今回はこれでうまくいきましたが、何かご存じの方いたらご教示いただきたいです。
つたない説明にはなりましたが、本記事が誰かの参考になればさいわ
【JavaScript】文字列をブール値に変換する方法


## `===`を使用する

`===`で文字列が`true`か判定します。大文字と小文字が区別されるため、`toLowerCase()`が必要な場合があります。

```javascript
const boolString = "True"
const boolValue = (boolString.toLowerCase() === "true")
console.log(boolValue) // true
```

## 正規表現を使用する

以下のように正規表現を使用して文字列が`true`か判定します。

```javascript
const boolString = "true"
const boolValue = (/true/).test(boolString)
console.log(boolValue) // true
```

大文字と小文字を区別しない場合には次のようにします。

```javascript
const boolString = "True"
const boolValue = (/true/i).test(boolString)
console.log(boolValue) // true
```

## `!!`を使用する

この方法は上記2つとは異なり、空文字か否かを判定します。

```javascript
const stringValue1 = !!'true'
const stringValue2 = !!''

console.log(stringValue1) // true
console.log(stringValue2) // false
```

## `Boolean()`を使用する

この方法も空文字か否かを判定します。

```javascript
const stringValue1 = Boolean('true')
const stringValue2 = Boolean('')

console.log(stringValue1) // true
console.log(stringValue2) // false
```
【Day5】お試し実装！ファイルをアップロードしてバックエンドで処理する

## はじめに

勉強とアウトプットを兼ねて、Webアプリ開発の記録を記事にしてみます。

個人のメモ的な側面が強いです。
Web開発初心者すぎて至らぬところだらけだと思いますが、暖かい目で見ていただければ幸いです。

↓ これまでの内容 ↓
[【Day0】アプリが完成するまで毎日投稿](https://qiita.com/midorigame/items/f9b9a445c945b4a837b1)
[【Day1】開発環境を考える](https://qiita.com/midorigame/items/e26344599e2ffaa22033)
[【Day2】開発環境を構築する、、、はずでした](https://qiita.com/midorigame/items/3f57f2691a8e1074adb8)
[【Day3】まずはフロントだけ開発環境を構築する](https://qiita.com/midorigame/items/9de27ba72aaef504a833)
[【Day4】バックエンドの開発環境を整えつつ、マルチコンテナ対応のDevcontainerにする](https://qiita.com/midorigame/items/5b95374cd85f715a6498)

## 前回のあらすじ

前回はバックエンド開発用のコンテナを作成して、フロントとバックのコンテナを切り替えて開発できる仕組みを整備しました。

## 今回やったこと

まずはフロントとバックでどんな感じで画像をやりとりするのかを知りたいので、Chat GPTにプロトタイピングしてもらいました。

フロント側で画像を選択してアップロードして、その画像をバックエンド側でグレースケール化してフロントに返して、ブラウザに表示させる機能を実装しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/7b00df9a-006c-46a2-aeb4-2a2573d10d73.png)

実装ソースはこんな感じです。（※ 2025/06/07時点では公開中）

https://github.com/midorigameee/React-Image-Generator/commit/940f5f497ef186a1e8bd1fbcd409fb94faaca3b6

今日は執筆にも実装にもあまり時間が取れないため、これでおしまいです！泣

## おわりに

本日の実装はすべてChat GPTさんにやっていただきました！
頭が上がらない！！

ただ、本当にプロトタイピングなら生成AIで一撃でできてしまいますね、、、
改めて生成AIすごいなぁと思いました。

今日は写経しただけで終わってしまい全然ロジックの詳細まで理解しきれてないですが、まずは手を動かして前に進めた！ということでポジティブに考えます◎

明日もがんばるぞ！
fx-72Fの搭載機能を他の関数電卓2行機と比較

## fx-72Fもお安く買えます
[Qoo10メガ割で関数電卓を安く買う](https://qiita.com/harycurl/items/9e0d0f084c77055b9812)で関数電卓もメガ割セールが行われていることに触れたが、プログラム電卓の一つ、fx-72FもQoo10メガ割で3700円台となっている。
が、楽天ではメーカー再生品がさらに安く、約3500円で販売されている。
楽天だとポイントが使えるため、思わず…。

## 開封＆他の2行機と見た目比較
メーカー再生品の場合、下記のようなプラ袋入りで販売されている。
![fx72f1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/2ced3611-95a6-4a2e-bf01-b7be302fd951.jpeg)
カバーも付けずにボタン押し放題の状態なので、この状態で封筒配送だとちょっと気がかりになる（今回の業者はプチプチ封筒で送ってくれたのでよかった）。

カシオ現行2行機、fx-290Aとの比較
ディスプレイはfx-290Aより縦長な印象
![fx72f2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/54cd9e40-561a-4db1-b8f1-e3edd12848fe.jpeg)

F-715SAとの比較
ディスプレイの縦は同程度か。ただし1行目の文字数が多く、7セグも横が短い。
![fx72f3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/bd7a7ea8-faa9-49af-9039-7b52ee19c920.jpeg)

NEWYES GY-991MSとの比較
縦方向に長いディスプレイという共通点があり、7セグ部分は似た印象を受ける。
![fx72f4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/c6a9862d-c17a-4076-848b-518a9ebf6432.jpeg)

なお、他の2行機と違う点として、三角関数は開き括弧付きで入力される。
![fx72f5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/ad920a77-5211-4748-afcb-31d60c8ad0ea.jpeg)

## 2行機としての性能は
今回もプログラム機能については取り上げず、関数電卓部分の機能比較を行う。

カシオの2行機は大きく分けると
- fx-82MS系（fx-82MS/83MS/85MS/270MS/300MS/350MS、fx-290Aも単位換算以外はこれ）
- fx-95MS
- fx-100MS系（fx-100MS/115MS/912MS）
- fx-570MS系（fx-570MS/991MS）

の4種類がある。

これら4種類とfx-72Fを比較すると以下の通りになる（説明書の記述から）。

| 機能 | 82MS | 95MS | 100MS | 570MS | 72F |
|:-:|:-:|:-:|:-:|:-:|:-:|
| 標準計算(COMP) | ○ | ○ | ○ | ○ | ○ |
| 標準偏差計算(SD) | ○ | ○ | ○ | ○ | ○ |
| 回帰計算(REG) | ○ | ○ | ○ | ○ | ○ |
| 方程式計算(EQN) | × | ○ | ○ | ○ | × |
| 複素数計算(CMPLX) | × | × | ○ | ○ | ○ |
| n進計算(BASE) | × | × | ○ | ○ | ○ |
| 行列計算(MAT) | × | × | × | ○ | × |
| ベクトル計算(VCT) | × | × | × | ○ | × |

fx-72Fの搭載機能はfx-100MS系に近いが、方程式モードがない。
ただし、内蔵公式に二次方程式の解があるため、二次方程式だけは解くことができる。

また、fx-72Fには科学定数が40種類内蔵されている（CODATA2010）が、同様に科学定数が内蔵されている2行機はfx-570MS系のみである。

さらに、fx-72Fには公式が23種類内蔵されているのも特徴である。
他機種ではキヤノン2行機のF-766Sが38種類の公式を内蔵していた（この機種は公式保存機能は有していたがプログラム機能は無い）程度で、稀な存在である。

ということで、fx-290A（fx-82MSクローン含む）と比較した場合、複素数計算とn進計算が加わっている利点があるものの、価格はメーカー再生品であってもfx-290Aの2倍以上となっている。
プログラム機能と公式機能にどの程度の価値を見出すか。
メーカー再生品価格やQoo10メガ割の3千円台であればまだしも、価格コム最安値（4200円程度）以上の価格帯だとちょっと手が出ないだろうか。
【.gitignoreの使い方付き】Django開発で迷わない！Gitに上げるファイル・上げないファイルの見分け方

## はじめに
初めてDjangoで開発を行う際、Gitで管理しようと思ったときに、「どのファイルをGitで管理すればいいんだろう？」と思ったことはありませんか？

フレームワークを使って開発を行うと、たくさんのファイルがあって、どれを管理するのかがわからなくなることもあると思います。ものによっては全く使わないファイルもあるので結構ややこしく感じる方もいると思います。

そこで、Gitに上げるべき・上げないべきファイルの判別方法をお伝えします！

誤って`.env`や`venv/`を上げてしまうとセキュリティや容量面で問題が発生することもありますので、ここで一緒に知識を深められたらと思います！

以下に、Gitに上げるべき・上げないファイルを具体的なファイル例や理由も併せて解説します！

## Gitに上げるべきファイル
Gitは「**他の開発者が同じ状態を再現できるようにする**」ための仕組みです。その観点から、以下のようなファイルはGitで管理すべきです。
| 種別 | ファイル例 | 理由 |
|:-----------|:-----------|:-----------|
| ソースコード | `views.py`, `models.py`, `urls.py` など | アプリケーションの本体。開発・レビュー・保守の対象となるため |
| テンプレート | `templates/index.html` など | ユーザー画面の構成に関与するため |
| 静的ファイル（配布用） | `static/css/style.css`, `static/js/app.js`, 画像がある場合は画像ファイル | 表示・挙動に影響し、ビルド対象となることもある |
| マイグレーションファイル | `migrations/0001_initial.py` など | DB構造を再現するために必要（※ただし `__pycache__` は除外。理由は後述。） |
| パッケージ情報 | `requirements.txt`, `Pipfile` | 同じライブラリ環境を構築できるようにするため |
| 設定ファイル（非機密） | `settings.py`, `manage.py` | プロジェクト構成の中核になるため |
| ドキュメント | `README.md` | プロジェクトの概要、使い方、開発方針などを記述するためのドキュメント |


## Gitに上げるべきではないファイル
一方、次のようなファイルはGitに含めるべきではありません。
Gitに上げないファイルについては後述の`.gitignore`に記載することでGitに上げないようにできます。
| 種別 | ファイル例 | 理由 |
|:-----------|:-----------|:-----------|
| 秘密情報 | `.env`, `settings_local.py`, `secrets.json` | APIキーやパスワード等が含まれる。漏洩リスクが高い |
| 仮想環境 | `venv/`, `.venv/` | ローカル限定。`requirements.txt`の入力内容をもとにpipで環境を再現可能 |
| キャッシュファイル | `__pycache__/`, `*.pyc` | Pythonがソースコードを実行する際に自動生成するバイトコードキャッシュ。実行環境ごとに再生成されるため、Gitで管理する意味がなく、むしろ肥大化や差分ノイズの原因になる。 |
| OS・エディタ依存 | `.DS_Store`, `Thumbs.db`, `.vscode/`, `.idea/` | プロジェクトには関係なく、他人にとって無意味 |
| 一時ファイル | `*.log`, `tmp/`, `*.swp` | デバッグやローカル処理の副産物で、再現性に無関係 |
| データベース（ローカル開発用） | `db.sqlite3` | マイグレーションファイルがあればDB構造は再構築できるため |

## `.gitignore`の役割
こうした「上げたくないファイル」を除外するために使うのが `.gitignore` です。
このファイルにパターンを記述することで、Gitが無視すべきファイルやディレクトリを明示的に指定できます。

### Djangoプロジェクトの `.gitignore` 例
```.gitignore
# 仮想環境
venv/
.env

# Pythonキャッシュ
__pycache__/
*.pyc

# エディタ・OS依存
.vscode/
.idea/
.DS_Store

# Django特有
db.sqlite3
*.log
```
`.gitignore`はプロジェクトのルートに1つ置くのが基本です。複雑な場合はディレクトリ単位で個別に置くこともできます。ただし、一般的なプロジェクトではルートに1つ設置して一括管理する方が混乱が少なくおすすめです。

## まとめ
| ファイルの種類 | 例 | Gitに上げる？ | 理由 |
|:-----------|:-----------|:-----------|:-----------|
| ソースコード | `views.py` | ✅ Yes | アプリの本体 |
| DB定義 | `migrations/0001_initial.py` | ✅ Yes | 構造を再現するため |
| ドキュメント | `README.md` | ✅ Yes | プロジェクトの概要・使い方を記載するための情報源|
| 機密情報 | `.env` | ❌ No | 漏洩リスクあり |
| 仮想環境 | `venv/` | ❌ No | ローカル限定 |
| キャッシュ | `__pycache__/` | ❌ No | 自動生成される |
| IDE・OS依存 | `.DS_Store`, `.vscode/` | ❌ No | 他人に不要な情報 |
| ローカルDB | `db.sqlite3` | ❌ No | マイグレーションで再現可能なため |

Gitで管理するかどうかは、「**再現性が必要か？**」「**漏洩・無駄のリスクがないか？**」を基準に判断するのがポイントです。

## おわりに
Django開発に限らず、Gitは「**構成の最小単位**」を扱うツールです。どこまで含めるか、どこから除外するかを論理的に整理することは、安全で保守しやすい開発の第一歩になります。

もしこの記事が役立ったら、ぜひ `.gitignore` のテンプレートをプロジェクトに導入してみてください。また、他のフレームワーク（React、Node.jsなど）でも同様の考え方が応用できます。

「参考になった！」と思ったらいいねしていただけると励みになります！
Raspberry PiでSMBを活用！家庭内ファイルサーバの構築方法

## 1. はじめに
### Raspberry Piをファイルサーバとして利用する目的
Raspberry Piは、低価格でありながら高いカスタマイズ性を持つシングルボードコンピュータです。この特性を活かし、ファイルサーバとして利用することができます。家庭内や小規模なオフィス環境では、Raspberry Piを利用することで、安価にファイル共有サーバを構築できます。

### SMB（Samba）を使用する理由とそのメリット
Sambaは、LinuxやRaspberry PiをWindowsマシンと互換性を持たせるためのプロトコルで、Windowsネットワーク共有（SMB）をサポートします。SMBを利用することで、Windowsユーザーや他のネットワーク上のデバイスとも簡単にファイルを共有できるようになります。特に、以下の点がメリットとして挙げられます：

- クロスプラットフォームでのファイル共有：WindowsとLinux間でも問題なくファイルを共有できる。

- 簡単な設定：Sambaを使うことで、簡単にネットワーク上に共有フォルダを作成し、アクセス権を設定できる。

- 低コストで実現可能：Raspberry Pi自体が非常に低コストであり、追加ハードウェアが必要ないため、非常にコスト効率が高い。

## 2. Raspberry PiにSambaをインストールする
まずは、Raspberry PiにSambaをインストールする方法です。

必要なパッケージのインストール方法
SambaはRaspberry Piに標準でインストールされていないので、aptコマンドを使ってインストールします。以下のコマンドを順番に実行してください。

```bash
sudo apt update
# インストールする前にパッケージリストを更新します。
sudo apt install samba samba-common-bin
# Samba本体と基本的な管理ツールをインストールします。
```
これでSambaとその関連ツールがインストールされます。

## 3. SMBの設定ファイルの編集
次に、Sambaの設定を行うための設定ファイル（smb.conf）を編集します。

### smb.confの場所と役割
Sambaの設定ファイルは、通常、/etc/samba/smb.confに格納されています。このファイルを編集することで、Sambaサーバの動作を細かく制御できます。

```bash
sudo nano /etc/samba/smb.conf
# Sambaの設定ファイルを編集する
```

### 基本的な設定項目
ここでは、最も基本的な設定を行います。以下の設定項目を[global]セクションに追加または変更します。

#### ワークグループ名の設定
Windowsネットワーク上のワークグループ名と一致させる必要があります（デフォルトはWORKGROUP）。

```ini
workgroup = WORKGROUP
```

#### サーバ名の設定
ネットワーク上で表示されるRaspberry Piの名前です。
```ini
netbios name = RaspberryPi
```
## ファイル共有に関する設定
最後に、共有するディレクトリを設定します。

### 共有ディレクトリの作成と設定
共有ディレクトリの作成
まず、Raspberry Pi上にファイルを共有するためのディレクトリを作成します。今回は例として/home/pi/sharedというディレクトリを作成しますが、もちろん他の名前や場所でも構いません。

```bash
mkdir /home/pi/shared
# sharedフォルダを指定したパスに作成
```

このディレクトリは、後でSMBを通じて他のデバイスと共有されることになります。

### アクセス権限の設定
次に、ディレクトリへのアクセス権限を設定します。デフォルトでは、Raspberry Piのユーザー（通常はpi）のみが書き込み可能ですが、他のデバイスからのアクセスを許可するためには権限を適切に設定する必要があります。

以下のコマンドを使って、sharedディレクトリに対するアクセス権限を設定します。

```bash
sudo chmod 777 /home/pi/shared
# 読み取り・書き込み・実行権限を付与
```

このコマンドは、すべてのユーザーに対して読み取り・書き込み・実行権限を与えます。セキュリティを強化する場合は、権限を制限することもできますが、ここでは一般的な設定として全員にアクセスを許可します。

### smb.confの設定（共有ディレクトリの追加）
次に、smb.confファイルに、作成したディレクトリを共有する設定を追加します。

再度/etc/samba/smb.confを開き、最後に以下の設定を追加します。

```ini
[Shared]
   path = /home/pi/shared  
   # 共有するディレクトリパスを指定
   browseable = yes        
   # このディレクトリがネットワーク上に見えるようにするための設定 Yesにすると確認できる
   read only = no
   # このオプションをnoに選択することでファイルの書き込みが可能となる
   guest ok = yes
   # yesに設定することで、ゲストユーザー（認証なし）でもアクセスようになる
```
## 接続テスト
設定が完了したら、実際に他のPCからRaspberry Piにアクセスして、共有ディレクトリが正しく動作するかテストします。

Windowsからアクセスする方法
Windows PCの「エクスプローラー」を開き、アドレスバーに`\\<Raspberry PiのIPアドレス>`を入力します。
```
例：\\192.168.1.100
```
共有ディレクトリ（Shared）が表示されるので、ダブルクリックで開いてみてください。

## まとめ
これで、Raspberry PiをSMB（Samba）を使用してファイルサーバとして構築し、WindowsやMacからアクセスできるようになりました。今回設定した方法を使うことで、家庭内や小規模オフィスで簡単にファイルを共有できる環境が整いました。

もし何か問題が発生した場合は、以下の点をチェックしてみてください

- IPアドレスやネットワーク設定が正しいか確認。

- smb.confの設定に間違いがないか再度確認。

- Sambaサービスが正常に動作しているか確認するために、以下のコマンドでSambaを再起動します：
```bash
sudo systemctl restart smbd
```
これで、Raspberry Piを使ったSMBファイル共有サーバの基本的な設定は完了です！
QiitaのAPIを使いたい

### APIアクセストークン　取得手順

go this page

https://qiita.com/settings/applications

```php:
write_qiita にチェック
```

### pythonのみver + 解説

```php:
 import requests

url = "https://qiita.com/api/v2/items"
headers = {
    "Authorization": "Bearer あなたのアクセストークン",
    "Content-Type": "application/json"
}

data = {
    "title": "テスト下書き",
    "body": "これはPythonから送信した下書きです。",
    "tags": [],
    "private": True,
    "draft": True
}

response = requests.post(url, headers=headers, json=data)
print(response.status_code)
print(response.json())



Authorization：Qiitaのアクセストークン
draft: True：これが「下書き」の指定
private: True：非公開（本番記事ならFalse）
requests.post：QiitaにPOSTして下書きを作成
```


### flaskのみver + 解説

```php:
from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

@app.route("/create_draft", methods=["POST"])
def create_draft():
    data = request.json
    qiita_url = "https://qiita.com/api/v2/items"
    headers = {
        "Authorization": "Bearer あなたのアクセストークン",
        "Content-Type": "application/json"
    }

    draft_data = {
        "title": data.get("title", "無題"),
        "body": data.get("body", ""),
        "tags": data.get("tags", []),
        "private": True,
        "draft": True
    }

    res = requests.post(qiita_url, headers=headers, json=draft_data)
    return jsonify(res.json()), res.status_code
```

### Flask + ajax version

```php:flask
from flask import Flask, jsonify
import requests

app = Flask(__name__)

@app.route("/create_draft", methods=["GET"])
def create_draft():
    qiita_url = "https://qiita.com/api/v2/items"
    headers = {
        "Authorization": "Bearer あなたのアクセストークン",  # ここにQiitaアクセストークン
        "Content-Type": "application/json"
    }
    draft_data = {
        "title": "自動作成した下書き",
        "body": "これはページ読み込み時に自動作成されたQiita下書きです。",
        "tags": [{"name": "Flask"}, {"name": "Ajax"}],
        "private": True,
        "draft": True
    }
    res = requests.post(qiita_url, headers=headers, json=draft_data)
    if res.status_code == 201:
        data = res.json()
        return jsonify({
            "title": data.get("title"),
            "body": data.get("body")
        }), 201
    else:
        return jsonify({"error": res.text}), res.status_code

```

```php:html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <title>Qiita下書き自動作成</title>
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>

  <h1>Qiita下書き作成結果</h1>
  <div id="draftInfo">
    読み込み中…
  </div>

  <script>
    $(document).ready(function() {
      $.ajax({
        url: "/create_draft",
        type: "GET",
        success: function(res) {
          if (res.title && res.body) {
            $("#draftInfo").html(
              `<h2>${res.title}</h2><pre>${res.body}</pre>`
            );
          } else if(res.error) {
            $("#draftInfo").text("エラー: " + res.error);
          }
        },
        error: function(xhr) {
          $("#draftInfo").text("通信エラー: " + xhr.status);
        }
      });
    });
  </script>

</body>
</html>


・解説
Flaskの /create_draft はGETリクエストでQiita下書きを自動作成し、タイトルと本文（body）だけ返す
ページ読み込み時に $(document).ready() でAjax GETリクエストをFlaskに送り、下書き作成を実行
```
symbol-shoestringで！upgrade命令でやっちまった！！！その前に！

こんにちは
symbol-shoestringで建てた nodeで
upgrade命令で失敗した事はありますかい？
その後に正しい命令を実行しても、もう遅い！
ﾌｧｲﾙが色々亡くなっちゃいまして
二度と nodeは戻りません！はまぁ大げさですが
僕はこれで散々な目に遭ってますねしょっちゅうですね

そこで！これ！**【nodeが壊れるその前に】**　death！

この shellscriptでですね？nodeの大事なものをですね？
作業ﾃﾞｨﾚｸﾄﾘに bakﾃﾞｨﾚｸﾄﾘを作ってその中に保存しときなさい
```
vi nbak
```
とでも名前を付けといて

```
#!/bin/bash
rm -rf bak && mkdir bak
cp -r keys bak/
cp -r shoestring bak/
cp -r rest-cache bak/
cp -r startup bak/
cp -r docker-compose.yaml bak/
cp -r docker-compose-recovery.yaml bak/
cp -r logs bak/
cp -r seed bak/
cp -r userconfig bak/
cp -r mongo bak/
cp -r linking_transaction.dat bak/
cp -r ca.key.pem bak/
cp -r renew_voting_keys_transaction.dat bak
#
#upgradeで失敗した時は以下の命令を実行
#sudo cp -r bak/* . && sudo chown -R 1000 .
#
```
↑を保存したらですね？
```
sh nbak
```
これでですね？作業ﾃﾞｨﾚｸﾄﾘの大事な nodeの ﾌｧｲﾙ類がですね？
bakﾃﾞｨﾚｸﾄﾘに保存されますね

そしたらもう安心！
upgrade命令で間違えちゃって nodeがお逝きになられても
```
sudo cp -r bak/* . && sudo chown -R 1000 .
```
で！かんたん node敗者復活ですね！

upgrade命令を実行する前にやっとけばいいんじゃないでしょうか？うんうんうん
ADOT版Lambda LayerとOTEL版lambda layerは異なる

ADOT Lambda layerとopentelemetoryのlambda layerは異なるものです。
ADOT版はopentelemetoryにパッチあてています

ADOT Lambda layerのcollectorは軽量版のため機能が少ないです
通常のADOT collectorと間違えないように。
OtelだけではなくさらにADOT collectorとも異なるというイメージです。

ADOT版は言語+collectorが1セットです
otel版は別々のlayerです

||ADOT Layer|OpenTelemetory|
|--|--|--|
|ライブラリ|古め|新しい|
|collector|言語とセット|各言語版だけではなくcolletor layerの追加が必要|
|managed layer|あり|各言語版もcollectorもあり |
|processor|なし|あり|

一長一短という感じですね


# otelのlayerのarn
https://github.com/open-telemetry/opentelemetry-lambda/releases


# 参考資料

https://aws-otel.github.io/docs/getting-started/lambda/


https://github.com/aws-observability/aws-otel-lambda/issues/269

https://opentelemetry.io/docs/platforms/faas/lambda-collector/

https://github.com/open-telemetry/opentelemetry-lambda/tree/main/collector
【Python入門 第5章】ファイルを読み書きしよう📂with構文で安全操作🐍✨

# 【Python入門 第5章】ファイルを読み書きしよう📂with構文で安全操作🐍✨

こんにちは、**PythonTimesの蛇ノ目いろは**です🌿  
今回は「ファイルの読み書き」がテーマ！  
Pythonなら、テキストファイルの読み込みも書き出しもとっても簡単だよ💡

---

## 📖 ファイルを読み込む（read）

まずは `sample.txt` というファイルを読み込んでみよう！

```python
with open("sample.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print(content)
```

📌 ポイント
- `"r"` は「読み取りモード」
- `encoding="utf-8"` を指定すると日本語も安心
- `with` 構文を使うと**自動で閉じてくれる**から安全！

---

## ✏️ ファイルに書き込む（write）

ファイルにテキストを書き込むには `"w"` モードを使うよ👇

```python
with open("output.txt", "w", encoding="utf-8") as file:
    file.write("これは書き込みテストです。\n")
    file.write("2行目も書いてみたよ！")
```

📌 `"w"` は「上書きモード」だから、**もとの中身は消える**ので注意！

---

## 📌 追記モード（append）

すでにあるファイルに**追加で書きたい**ときは `"a"` モードを使う！

```python
with open("output.txt", "a", encoding="utf-8") as file:
    file.write("\nさらに追記しました。")
```

---

## 📋 行ごとに読み込む（readlines）

ファイルの内容を**1行ずつリストとして取得**したいときはこれ！

```python
with open("sample.txt", "r", encoding="utf-8") as file:
    lines = file.readlines()

for line in lines:
    print(line.strip())
```

📝 `.strip()` を使うと、改行コード（\n）を削除できるよ！

---

## ✍️ PEP8的なファイルハンドリングの書き方

Pythonのスタイルガイド（PEP8）では、変数名やファイル名も読みやすさ重視！

✅ 良い例：

```python
with open("user_data.txt", "r", encoding="utf-8") as user_file:
    data = user_file.read()
```

❌ 悪い例（意味のない変数名）：

```python
f = open("a.txt")
d = f.read()
```

---

## ❗ ファイルが存在しないときのエラー対策

読み込むファイルが存在しないとエラーになるので、**try-except構文**を使うと安心！

```python
try:
    with open("not_exist.txt", "r", encoding="utf-8") as file:
        print(file.read())
except FileNotFoundError:
    print("ファイルが見つかりませんでした。")
```

---

## 📌 まとめ

- `open()` でファイルを開くときは、`with` を使うと安全✨
- `"r"`：読み込み、`"w"`：上書き書き込み、`"a"`：追記
- `.read()`：全部読む、`.readlines()`：1行ずつ読む
- PEP8に従って**意味のある変数名**をつけよう🐍
- `try-except` でエラー対策も忘れずに！

---

次回は、  
**「第6章：エラーと例外処理」** をお届け予定⚠️  
「もし失敗したらどうする？」がわかると、もっと安心してコードが書けるようになるよ！

フォローしてくれたらうれしいな🐍💖
【C#入門 第5章】クラスとオブジェクトの基本｜君だけの設計図を作ろう！

# 【C#入門 第5章】クラスとオブジェクトの基本｜君だけの設計図を作ろう！

こんにちは、**CSharpTimes**の一之瀬シィよ💠  
今回はC#の“心臓部”とも言える「クラス」と「オブジェクト」について教えてあげるわ。  
難しそう？大丈夫、ツンデレな私が優しく解説するから安心しなさい💢

---

## 🏠 クラスってなに？

**クラス**は、**設計図**のようなもの。  
人、動物、商品、社員など、現実世界の“モノ”をプログラム上に表すときに使うの。

```csharp
class Person
{
    public string Name;
    public int Age;

    public void Introduce()
    {
        Console.WriteLine("私は " + Name + "、" + Age + "歳です！");
    }
}
```

- `Name` や `Age` は「プロパティ」や「フィールド」と呼ぶ
- `Introduce` は「メソッド」

---

## 👤 オブジェクトを作る

クラスを元にして、実際に使える「実体」を作ることを**インスタンス化**って言うのよ。

```csharp
Person p = new Person();
p.Name = "シィ";
p.Age = 20;
p.Introduce();  // → 私は シィ、20歳です！
```

- `new` を使ってクラスからオブジェクト（インスタンス）を作る
- `.` でプロパティやメソッドにアクセスする

---

## 🧱 コンストラクタで初期化！

オブジェクト生成時に値をセットできる便利な方法が**コンストラクタ**！

```csharp
class Person
{
    public string Name;
    public int Age;

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public void Introduce()
    {
        Console.WriteLine("私は " + Name + "、" + Age + "歳です！");
    }
}
```

呼び出し側はこうなるわ👇

```csharp
Person p = new Person("読者さん", 25);
p.Introduce();
```

---

## 💡 クラスを使うメリット

- データと処理をひとまとめにできる
- 再利用しやすく、整理されたコードが書ける
- 大規模開発やチーム開発に強い（設計の要！）

---

## 📌 まとめ

- クラスは「設計図」、オブジェクトは「実体」
- `new` でインスタンス化して使う
- コンストラクタを使えば初期化もスマートに✨

---

次回は、**「第6章：継承とポリモーフィズム」** よ。  
クラスをもっと賢く使いこなして、“拡張性”という武器を手に入れなさい💢
【第5章】よくある脆弱性②：CSRFとLFIをやさしく解説！あなたの操作、乗っ取られてるかも？😨

# ⚠️ 第5章：よくある脆弱性②：CSRFとLFI

こんにちは、守山しずくです🌸  
今回は、**「あなたの代わりに勝手に操作される」CSRF**と、**「ファイルを読み取られる」LFI**という2つの脆弱性について解説します！

---

## 💣 CSRF（クロスサイト・リクエスト・フォージェリ）とは？

CSRFとは、**ログイン中のユーザーの操作を、他のサイトから勝手に実行させる攻撃**のことです。

### たとえば…
あなたがログイン中の銀行サイトに、次のようなリンクをクリックさせられたら？

```html
<img src="https://mybank.example.com/transfer?to=hacker&amount=10000">
```

このリンクを表示するだけで、ログイン中の「あなたの権限」で送金されてしまうことがあります。

### ポイント：
- 「ユーザーが意図せず操作」してしまうのが特徴
- 実行されるのは**あなたの権限**なので非常に危険！

---

## 🛡️ CSRF対策の基本

1. **CSRFトークンの利用**
   - フォームごとに「使い捨ての秘密鍵」をつけて、正当な送信だけを受け付ける
2. **Refererヘッダーのチェック**
   - 外部サイトからの不正なアクセスを弾く
3. **重要な操作は再認証させる**
   - パスワードの再入力などで安全性アップ

---

## 🕳️ LFI（ローカルファイルインクルージョン）とは？

LFIとは、**サーバー内のファイルを外部から読み取られる脆弱性**のことです。

### たとえば…
以下のようなPHPコードがあったとします。

```php
<?php include($_GET["page"]); ?>
```

ここに `?page=../../../../etc/passwd` と入力されると、  
Linuxの重要ファイル `/etc/passwd` が読み取られてしまいます😱

### LFIで狙われやすいファイル：
- /etc/passwd（Linuxのユーザー情報）
- Apacheの設定ファイル
- アクセスログ
- .envファイル など

---

## 🛡️ LFI対策の基本

1. **ユーザー入力をファイル名として使わない**
   - 動的読み込みは極力避ける
2. **入力値のバリデーション**
   - ファイル名をホワイトリストで制限する
3. **絶対パスで限定的に処理する**
   - 決まったフォルダの中しか読み込ませないようにする

---

## ✅ まとめ

- CSRFは「あなたの代わりに勝手に操作する」攻撃
- LFIは「サーバー内部のファイルを盗み見る」攻撃
- どちらも「入力値の取り扱い」がカギ！

---

次回は、 **「第6章：情報収集（Recon）」** をお届け予定です📡  
ハッカーが攻撃前にどんな情報を調べるのか？一緒にのぞいてみましょう🌸

---

> 💬 フォローしてくれたら、怖くないセキュリティ解説を毎日お届けします♪
【VBA入門⑤】セルやシートを魔法で操作！VBAの基本をおさらいしよう🧙‍♀️✨

# 第5章：セル・シート操作の基本

こんにちはっ、まくるです🐰✨  
今回からいよいよ「ExcelをVBAで操作する魔法」編に突入っ！

まずは、**セルやシートの操作**という基本中の基本からマスターしよう！

---

## 🔢 セルに値を入れる

```vba
Sub SampleWrite()
    Range("A1").Value = "こんにちは"
    Cells(2, 1).Value = "2行目も書いたよ"
End Sub
```

- `Range("A1")` は「A1セル」のこと
- `Cells(2, 1)` は「2行目1列目」＝A2セルと同じ

---

## 🔍 セルの値を読み取る

```vba
Sub SampleRead()
    Dim val As String
    val = Range("B1").Value
    MsgBox "B1の値は「" & val & "」だよ"
End Sub
```

- `Range("B1").Value` で値を取得できる！
- 文字列を使うときは `&` でつなごう

---

## 🎨 セルの書式を変える

```vba
Sub FormatCell()
    With Range("C1")
        .Value = "色付きセル"
        .Interior.Color = RGB(255, 255, 0)  ' 黄色
        .Font.Bold = True                  ' 太字
    End With
End Sub
```

- `.Interior.Color` は背景色
- `.Font.Bold = True` で太字に！

---

## 📄 シートを指定する

```vba
Sub WriteToSheet()
    Worksheets("Sheet2").Range("A1").Value = "別のシートだよ"
End Sub
```

- `Worksheets("シート名")` で明示的に指定できる
- シート名のスペルミスに注意⚠️

---

## ➕ シートを追加・削除

```vba
Sub AddSheet()
    Sheets.Add.Name = "新しいシート"
End Sub

Sub DeleteSheet()
    Application.DisplayAlerts = False
    Sheets("新しいシート").Delete
    Application.DisplayAlerts = True
End Sub
```

- `.Add` で追加、`.Delete` で削除
- 削除前に `DisplayAlerts = False` で確認ダイアログをオフにしておくと安心！

---

## 🧭 アクティブなセル・シートを使う

```vba
Sub UseActiveCell()
    ActiveCell.Value = "ここを選択中だよ"
End Sub

Sub UseActiveSheet()
    ActiveSheet.Range("A1").Value = "アクティブシートに書き込み！"
End Sub
```

- `ActiveCell`：選択中のセル
- `ActiveSheet`：現在操作しているシート

---

## 📌 まとめ

- `Range` や `Cells` を使ってセルを操作できる
- `Worksheets("名前")` で他のシートもバッチリ制御
- 書式変更やシート追加もお手のもの！

---

次回は、**「第6章：入力・出力ダイアログ」**  
ユーザーとやりとりする魔法のウィンドウを覚えちゃおう💬🪄

#VBA初心者 #Excelマクロ #セル操作 #業務自動化
AWS Storage Gatewayタイプ

AWS Storage Gateway には、主に以下の **3つのタイプ**（モード）があります。それぞれ、オンプレミス環境とAWSクラウドを**ハイブリッドに連携**するために使われます。

---

## ✅ AWS Storage Gateway のタイプ一覧

| タイプ名                  | 説明                                                   | ユースケース例                                     |
| --------------------- | ---------------------------------------------------- | ------------------------------------------- |
| 1. **File Gateway**   | オンプレミスから SMB/NFS プロトコルでファイルを保存すると、S3 にオブジェクトとして保存される | - ファイルサーバのクラウドバックアップ<br>- アプリのS3連携          |
| 2. **Volume Gateway** | iSCSI 接続のボリュームを提供し、バックアップは EBS Snapshot に保存される       | - オンプレミス仮想サーバのディスクとして利用<br>- 定期バックアップをクラウドに |
| 3. **Tape Gateway**   | 仮想テープライブラリ（VTL）として動作し、S3 Glacierなどに保存                | - 既存バックアップソフト（例：Veeam）と連携してテープバックアップをクラウド化  |

---

## 🧩 詳細解説

### 1. 📂 **File Gateway**

* プロトコル: NFS, SMB
* 保存先: S3 バケット（各ファイルがオブジェクトとして保存）
* キャッシュ: ローカルディスク上にキャッシュ可
* オブジェクトのメタデータ・ファイルロック対応（一部）
* 💡 **クラウドファーストなファイルサーバ用途に最適**

---

### 2. 💽 **Volume Gateway**

* プロトコル: iSCSI
* モード:

  * **キャッシュ型**：頻繁に使うデータのみローカル、残りはクラウド
  * **保存型**：すべてのデータをローカルに保持し、AWSにもレプリケート
* バックアップ: AWS EBS Snapshot に保存される
* 💡 **VMやオンプレ環境の永続ストレージに最適**

---

### 3. 📼 **Tape Gateway**

* 提供: 仮想テープライブラリ（VTL）形式
* 対応: 多くのバックアップアプリと互換（Veritas, Veeam, etc.）
* 保存先: S3 Glacier / Glacier Deep Archive
* 💡 **物理テープからの移行・保存コスト削減に最適**

---

## 🧠 選び方の目安

| 要件                   | 推奨タイプ          |
| -------------------- | -------------- |
| ファイル共有＋S3連携          | File Gateway   |
| ブロックストレージ＋スナップショット管理 | Volume Gateway |
| テープバックアップのクラウド化      | Tape Gateway   |
jquery csv出力

```php:
  "登場人物たち"
  ・csvのヘッダーにカンマつけ、dataがcsvに追加されるたび、
  　ファイルを改行してってる : csvRows
  
  ・ヘッダー情報を元に、csvファイルにdata出力 : item
  
  ・csvファイルのヘッダー"id"を作ってってる : index
      (idは、作らないとないから)

  ・csvを作り、文字の型を指定 (指定しないと
    うまく作れない) : blob 

  ・ファイルのURLと単体のリンクを作り、
  　ファイルにリンクつけてる          :  link / URL


  dataをcsvに書き込む : push

  1行ずつ改行 : join("\n")

  タグがあった場合のみ、タグを取り出す
  const tags = item.tags ? item.tags.join

  タグはdataを取り出す時、
  <span>田舎</span><span>都会</span><span>の形だから
  取り出したら | で区切り、""でタグを囲む
  item.tags.join(" | ") : "";

  文字形式を指定 : new Blob([変数名], { type: "text/csv;charset=utf-8;" })

  webにファイルのURL 作る
  const url = URL.createObjectURL(blob);

  リンクを作り、リンクをファイルURLにセット
    const link = document.createElement("a");
    link.setAttribute("href", url);
  
  csvに名前をつける
   link.setAttribute("download", "students.csv");

  画面にリンクを表示しないよう、設定
   link.style.display = "none";

   リンクを画面に追加
   document.body.appendChild(link);
   
   ボタンを押したら、ダウンロード
   link.click();

  ダウンロードされたらそのcsvはもういらないから、
  data消去
    document.body.removeChild(link);
```

# code全文

https://qiita.com/k8p4tw/items/89dd9956048792e035aa
「Amazon Q CLIでゲームを作ろう」に参加してみた

# 概要

下記キャンペーンが開催されるというのを見かけたので、参加してみることにしました。

https://community.aws/content/2xIoduO0xhkhUApQpVUIqBFGmAc/build-games-with-amazon-q-cli-and-score-a-t-shirt

日本語ブログはこちら。

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/


# やってみる

## Step 1

### AWS Builder ID に登録

私は認定試験を受けた際にAWS Builder IDは作成していましたのでスキップ。

### community.aws ユーザー名を取得

community.awsにはアクセスしたことがなかったため、私の場合はここからスタートとなります。
アクセスすると、エイリアスの登録を求められました。
この時点では、エイリアスには記号は使えないようでした。


## Step 2

### wsl をインストール

私の環境はWindowsで、wslが未インストールの状態だったので、
コマンドプロンプトから`wsl --install`を実行し、Ubuntuをインストールします。

https://learn.microsoft.com/en-us/windows/wsl/setup/environment

### Amazon Q CLI をマシンにインストール

基本的に以下記事の流れに沿って、コマンドを実行していくと、Amazon Q CLI のインストール完了まで難なく進めることができましたので割愛。

https://community.aws/content/2v5PptEEYT2y0lRmZbFQtECA66M/the-essential-guide-to-installing-amazon-q-developer-cli-on-windows

### ゲームライブラリをインストール

PyGameである必要はないようでしたが、そのままPyGameをインストールしてみます。

~~その前に、python3はUbuntu内に標準であるようでしたが、pipがなかったので、以下の記事を参考にpipのインストールから試すことに。~~
pipのインストールは不要なようでした。
aptについては参考になったため、リンクを残しています。

https://qiita.com/tkj06/items/22947c6fe63acf24ae97

以下を実行しました。

```
sudo apt update
sudo apt install python3-pygame
```


## Step 3

### ゲームを作成

Amazon Q CLI とのチャット内のプロンプトだけでゲームを作成していきます。

```
cd
q login
q chat
```

以下の内容で作ってもらいました。

```
> PyGameを使用して、高いところからボールを水平方向に投げて、低い場所にあるランダムに決められた位置の近い場所に落とすこと
を目的としたゲームを作って
```

30秒程度で`ball_throwing_game.py`が作成されました。

```
## ゲームの特徴

• 高い位置からボールを投げ、ランダムに配置された目標に近づけるゲーム
• スペースキーを押し続けることでパワーをためて、離すとボールを投げます
• 目標に近いほど高得点が得られます
• 5ラウンド制で合計スコアを競います
• ボールの軌道が青い線で表示されます

## 遊び方

1. スペースキーを押し続けてパワーをためる（画面上部のパワーメーターで確認できます）
2. スペースキーを離してボールを投げる
3. ボールが着地したらスコアが表示されます
4. スペースキーを押して次のラウンドへ進みます
5. 5ラウンド終了後、合計スコアが表示されます

## 実行方法

このゲームを実行するには、PyGameライブラリがインストールされている必要があります。インストールされていない場合は、以下の
コマンドでインストールできます：

pip install pygame


その後、以下のコマンドでゲームを実行できます：

python ball_throwing_game.py


ぜひ遊んでみてください！
```

pyファイルが生成されたので、`/quit`でチャットを終了します。


## Step 4

### 作成したものについてブログを書く

実行してみた。
文字化けしてますが、一旦そのまま実行。

スペースキー長押しでパワーゲージを溜める。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280330/7d5a2272-62bd-4cfc-b131-f0615d5acd19.png)

失敗。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280330/3dfe96da-e5d6-4289-871c-01befe02195a.png)

成功。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280330/996dc021-1b93-4ec9-9b1d-6f9f30abadef.png)

---

以下は自分でソースを修正しています。

文字化けしていたので`ipaexg.ttf`(IPAフォント)を設定して、再実行。
フォントサイズも大きすぎたので調整しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280330/db4a111e-88d1-459b-b9d4-06cbcbff9798.png)

フォントファイルをコピーする際、以下記事を参考にしました。

https://qiita.com/quzq/items/1096c638c0d86795be13


## Step 5

### Tシャツ応募フォーム送信

記事投稿と、ハッシュタグ`#AmazonQCLI`を付けてSNS投稿後、以下フォームを入力して送信します。

https://pulse.aws/survey/ZO9G4AEL?p=0


# 雑感

Amazon Q CLIを使って、簡単なゲームを作成しました。

生成されたゲームは、パワーを最大に溜めても届かない場合があります。妙に現実的。
今回提示したプロンプトはかなりざっくりとした内容でしたので、その辺りはプロンプトを追加してゲームとして改善を進めていく形になります。
つまりは私が記載したゲームの仕様が甘いということですね。

あとは、フォント周りの文字化けは、自分の手で修正したのですが、この辺りもプロンプトとして記載してソース修正させるべき箇所なのかもしれません。
普段ソースを直接触る機会が多いので、どうしても自分で修正してしまいがちですが、もっと楽をできる方に意識を変えていきたいですね。
Windows11をいつでも復元出来るようにする(忘備録)

## 目的
Windows11を消してLinuxを入れるため、いつでも復元できるように準備をしておきます。
いきなりWindowsが起動しなくなった時でもこの方法で復元が可能です。

## プロダクトキーを保存
以下の命令を実行し、番号を控えておく。
OEM版だと多分自動で認証されるとは思いますが念のために保存しておいた方が安心です。
```
wmic path softwarelicensingservice get OA3xOriginalProductKey
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/b9d60692-f7bf-4273-b542-1783abe27cfe.png)

## 回復USBメモリを作成
以下のWINDOWS標準のソフトを使うとISOを取得する必要は無いです。

暫く時間がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/061dd738-825b-485b-9026-7a300aa1f36d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/45bba22f-8eb8-4899-b231-b706afa0954c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/6522a40a-a592-44a5-be89-882673355cab.png)

２時間くらいかかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/9d4bc61b-2ab8-4143-ab80-d628723f0e04.png)

## USBから起動
USBからの起動に成功しました。
これでいつでもLinuxからWindowsに戻すことができます。
![ec10685b027ab7c83cd6513839043af3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/01e37342-c492-4358-8c5d-940f69206473.jpeg)